Add missing source and docs JAR tasks for support libraries am: 523ece85ea am: 654fa607e0
am: 28ec8076bb

Change-Id: I0178051a262f0b4e17c033bc888664694dac1ef8
diff --git a/Android.mk b/Android.mk
index 2ef2319..9a16b26 100644
--- a/Android.mk
+++ b/Android.mk
@@ -17,9 +17,6 @@
 ifeq ($(TARGET_BUILD_APPS),)
 
 SUPPORT_CURRENT_SDK_VERSION := current
-SUPPORT_API_CHECK := $(LOCAL_PATH)/apicheck.mk
-api_check_current_msg_file := $(LOCAL_PATH)/apicheck_msg_current.txt
-api_check_last_msg_file := $(LOCAL_PATH)/apicheck_msg_last.txt
 
 ###########################################################
 # Find all of the files in the given subdirs that match the
@@ -60,6 +57,17 @@
 $(call all-named-files-under-exclude,$(1),$(2),.)
 endef
 
+# Proxy to gradle task for updating API
+.PHONY: update-support-api
+update-support-api: PRIVATE_LOCAL_PATH := $(LOCAL_PATH)
+update-support-api:
+	$(PRIVATE_LOCAL_PATH)/gradlew -p $(PRIVATE_LOCAL_PATH) updateApi
+
+# Proxy to gradle task for checking API
+.PHONY: check-support-api
+check-support-api: PRIVATE_LOCAL_PATH := $(LOCAL_PATH)
+check-support-api:
+	$(PRIVATE_LOCAL_PATH)/gradlew -p $(PRIVATE_LOCAL_PATH) checkApi
 
 # Pre-process support library AIDLs
 aidl_files := $(addprefix $(LOCAL_PATH)/, $(call all-subdir-named-files-exclude,*.aidl,I*.aidl))
@@ -67,10 +75,7 @@
 $(support-aidl): $(aidl_files) | $(AIDL)
 	$(AIDL) --preprocess $@ $(aidl_files)
 
-.PHONY: update-support-api
-.PHONY: check-support-api
-
-# Run the check-support-api task on a SDK build
+# Check APIs and generate support AIDL file for SDK build
 sdk: check-support-api $(support-aidl)
 
 # Build all support libraries
@@ -78,8 +83,5 @@
 
 # Clear out variables
 SUPPORT_CURRENT_SDK_VERSION :=
-SUPPORT_API_CHECK :=
-api_check_current_msg_file :=
-api_check_last_msg_file :=
 
 endif
diff --git a/api/current.txt b/api/current.txt
new file mode 100644
index 0000000..e416c2b
--- /dev/null
+++ b/api/current.txt
@@ -0,0 +1,10105 @@
+package android.support.app.recommendation {
+
+  public final class ContentRecommendation {
+    method public java.lang.String getBackgroundImageUri();
+    method public int getBadgeImageResourceId();
+    method public int getColor();
+    method public android.graphics.Bitmap getContentImage();
+    method public android.support.app.recommendation.ContentRecommendation.IntentData getContentIntent();
+    method public java.lang.String[] getContentTypes();
+    method public android.support.app.recommendation.ContentRecommendation.IntentData getDismissIntent();
+    method public java.lang.String[] getGenres();
+    method public java.lang.String getGroup();
+    method public java.lang.String getIdTag();
+    method public java.lang.String getMaturityRating();
+    method public android.app.Notification getNotificationObject(android.content.Context);
+    method public java.lang.String getPricingType();
+    method public java.lang.String getPricingValue();
+    method public java.lang.String getPrimaryContentType();
+    method public int getProgressMax();
+    method public int getProgressValue();
+    method public long getRunningTime();
+    method public java.lang.String getSortKey();
+    method public java.lang.String getSourceName();
+    method public int getStatus();
+    method public java.lang.String getText();
+    method public java.lang.String getTitle();
+    method public boolean hasProgressInfo();
+    method public boolean isAutoDismiss();
+    method public void setAutoDismiss(boolean);
+    method public void setGroup(java.lang.String);
+    method public void setProgress(int, int);
+    method public void setSortKey(java.lang.String);
+    method public void setStatus(int);
+    field public static final java.lang.String CONTENT_MATURITY_ALL = "android.contentMaturity.all";
+    field public static final java.lang.String CONTENT_MATURITY_HIGH = "android.contentMaturity.high";
+    field public static final java.lang.String CONTENT_MATURITY_LOW = "android.contentMaturity.low";
+    field public static final java.lang.String CONTENT_MATURITY_MEDIUM = "android.contentMaturity.medium";
+    field public static final java.lang.String CONTENT_PRICING_FREE = "android.contentPrice.free";
+    field public static final java.lang.String CONTENT_PRICING_PREORDER = "android.contentPrice.preorder";
+    field public static final java.lang.String CONTENT_PRICING_PURCHASE = "android.contentPrice.purchase";
+    field public static final java.lang.String CONTENT_PRICING_RENTAL = "android.contentPrice.rental";
+    field public static final java.lang.String CONTENT_PRICING_SUBSCRIPTION = "android.contentPrice.subscription";
+    field public static final int CONTENT_STATUS_AVAILABLE = 2; // 0x2
+    field public static final int CONTENT_STATUS_PENDING = 1; // 0x1
+    field public static final int CONTENT_STATUS_READY = 0; // 0x0
+    field public static final int CONTENT_STATUS_UNAVAILABLE = 3; // 0x3
+    field public static final java.lang.String CONTENT_TYPE_APP = "android.contentType.app";
+    field public static final java.lang.String CONTENT_TYPE_BOOK = "android.contentType.book";
+    field public static final java.lang.String CONTENT_TYPE_COMIC = "android.contentType.comic";
+    field public static final java.lang.String CONTENT_TYPE_GAME = "android.contentType.game";
+    field public static final java.lang.String CONTENT_TYPE_MAGAZINE = "android.contentType.magazine";
+    field public static final java.lang.String CONTENT_TYPE_MOVIE = "android.contentType.movie";
+    field public static final java.lang.String CONTENT_TYPE_MUSIC = "android.contentType.music";
+    field public static final java.lang.String CONTENT_TYPE_NEWS = "android.contentType.news";
+    field public static final java.lang.String CONTENT_TYPE_PODCAST = "android.contentType.podcast";
+    field public static final java.lang.String CONTENT_TYPE_RADIO = "android.contentType.radio";
+    field public static final java.lang.String CONTENT_TYPE_SERIAL = "android.contentType.serial";
+    field public static final java.lang.String CONTENT_TYPE_SPORTS = "android.contentType.sports";
+    field public static final java.lang.String CONTENT_TYPE_TRAILER = "android.contentType.trailer";
+    field public static final java.lang.String CONTENT_TYPE_VIDEO = "android.contentType.video";
+    field public static final java.lang.String CONTENT_TYPE_WEBSITE = "android.contentType.website";
+    field public static final int INTENT_TYPE_ACTIVITY = 1; // 0x1
+    field public static final int INTENT_TYPE_BROADCAST = 2; // 0x2
+    field public static final int INTENT_TYPE_SERVICE = 3; // 0x3
+  }
+
+  public static final class ContentRecommendation.Builder {
+    ctor public ContentRecommendation.Builder();
+    method public android.support.app.recommendation.ContentRecommendation build();
+    method public android.support.app.recommendation.ContentRecommendation.Builder setAutoDismiss(boolean);
+    method public android.support.app.recommendation.ContentRecommendation.Builder setBackgroundImageUri(java.lang.String);
+    method public android.support.app.recommendation.ContentRecommendation.Builder setBadgeIcon(int);
+    method public android.support.app.recommendation.ContentRecommendation.Builder setColor(int);
+    method public android.support.app.recommendation.ContentRecommendation.Builder setContentImage(android.graphics.Bitmap);
+    method public android.support.app.recommendation.ContentRecommendation.Builder setContentIntentData(int, android.content.Intent, int, android.os.Bundle);
+    method public android.support.app.recommendation.ContentRecommendation.Builder setContentTypes(java.lang.String[]);
+    method public android.support.app.recommendation.ContentRecommendation.Builder setDismissIntentData(int, android.content.Intent, int, android.os.Bundle);
+    method public android.support.app.recommendation.ContentRecommendation.Builder setGenres(java.lang.String[]);
+    method public android.support.app.recommendation.ContentRecommendation.Builder setGroup(java.lang.String);
+    method public android.support.app.recommendation.ContentRecommendation.Builder setIdTag(java.lang.String);
+    method public android.support.app.recommendation.ContentRecommendation.Builder setMaturityRating(java.lang.String);
+    method public android.support.app.recommendation.ContentRecommendation.Builder setPricingInformation(java.lang.String, java.lang.String);
+    method public android.support.app.recommendation.ContentRecommendation.Builder setProgress(int, int);
+    method public android.support.app.recommendation.ContentRecommendation.Builder setRunningTime(long);
+    method public android.support.app.recommendation.ContentRecommendation.Builder setSortKey(java.lang.String);
+    method public android.support.app.recommendation.ContentRecommendation.Builder setSourceName(java.lang.String);
+    method public android.support.app.recommendation.ContentRecommendation.Builder setStatus(int);
+    method public android.support.app.recommendation.ContentRecommendation.Builder setText(java.lang.String);
+    method public android.support.app.recommendation.ContentRecommendation.Builder setTitle(java.lang.String);
+  }
+
+  public static abstract class ContentRecommendation.ContentMaturity implements java.lang.annotation.Annotation {
+  }
+
+  public static abstract class ContentRecommendation.ContentPricing implements java.lang.annotation.Annotation {
+  }
+
+  public static abstract class ContentRecommendation.ContentStatus implements java.lang.annotation.Annotation {
+  }
+
+  public static abstract class ContentRecommendation.ContentType implements java.lang.annotation.Annotation {
+  }
+
+  public static class ContentRecommendation.IntentData {
+    ctor public ContentRecommendation.IntentData();
+  }
+
+  public static abstract class ContentRecommendation.IntentType implements java.lang.annotation.Annotation {
+  }
+
+  public final class RecommendationExtender implements android.app.Notification.Extender {
+    ctor public RecommendationExtender();
+    ctor public RecommendationExtender(android.app.Notification);
+    method public android.app.Notification.Builder extend(android.app.Notification.Builder);
+    method public java.lang.String[] getContentTypes();
+    method public java.lang.String[] getGenres();
+    method public java.lang.String getMaturityRating();
+    method public java.lang.String getPricingType();
+    method public java.lang.String getPricingValue();
+    method public java.lang.String getPrimaryContentType();
+    method public long getRunningTime();
+    method public int getStatus();
+    method public android.support.app.recommendation.RecommendationExtender setContentTypes(java.lang.String[]);
+    method public android.support.app.recommendation.RecommendationExtender setGenres(java.lang.String[]);
+    method public android.support.app.recommendation.RecommendationExtender setMaturityRating(java.lang.String);
+    method public android.support.app.recommendation.RecommendationExtender setPricingInformation(java.lang.String, java.lang.String);
+    method public android.support.app.recommendation.RecommendationExtender setRunningTime(long);
+    method public android.support.app.recommendation.RecommendationExtender setStatus(int);
+  }
+
+}
+
+package android.support.customtabs {
+
+  public class CustomTabsCallback {
+    ctor public CustomTabsCallback();
+    method public void extraCallback(java.lang.String, android.os.Bundle);
+    method public void onNavigationEvent(int, android.os.Bundle);
+    field public static final int NAVIGATION_ABORTED = 4; // 0x4
+    field public static final int NAVIGATION_FAILED = 3; // 0x3
+    field public static final int NAVIGATION_FINISHED = 2; // 0x2
+    field public static final int NAVIGATION_STARTED = 1; // 0x1
+    field public static final int TAB_HIDDEN = 6; // 0x6
+    field public static final int TAB_SHOWN = 5; // 0x5
+  }
+
+  public class CustomTabsClient {
+    method public static boolean bindCustomTabsService(android.content.Context, java.lang.String, android.support.customtabs.CustomTabsServiceConnection);
+    method public static boolean connectAndInitialize(android.content.Context, java.lang.String);
+    method public android.os.Bundle extraCommand(java.lang.String, android.os.Bundle);
+    method public static java.lang.String getPackageName(android.content.Context, java.util.List<java.lang.String>);
+    method public static java.lang.String getPackageName(android.content.Context, java.util.List<java.lang.String>, boolean);
+    method public android.support.customtabs.CustomTabsSession newSession(android.support.customtabs.CustomTabsCallback);
+    method public boolean warmup(long);
+  }
+
+  public final class CustomTabsIntent {
+    method public static int getMaxToolbarItems();
+    method public void launchUrl(android.app.Activity, android.net.Uri);
+    field public static final java.lang.String EXTRA_ACTION_BUTTON_BUNDLE = "android.support.customtabs.extra.ACTION_BUTTON_BUNDLE";
+    field public static final java.lang.String EXTRA_CLOSE_BUTTON_ICON = "android.support.customtabs.extra.CLOSE_BUTTON_ICON";
+    field public static final java.lang.String EXTRA_DEFAULT_SHARE_MENU_ITEM = "android.support.customtabs.extra.SHARE_MENU_ITEM";
+    field public static final java.lang.String EXTRA_ENABLE_URLBAR_HIDING = "android.support.customtabs.extra.ENABLE_URLBAR_HIDING";
+    field public static final java.lang.String EXTRA_EXIT_ANIMATION_BUNDLE = "android.support.customtabs.extra.EXIT_ANIMATION_BUNDLE";
+    field public static final java.lang.String EXTRA_MENU_ITEMS = "android.support.customtabs.extra.MENU_ITEMS";
+    field public static final java.lang.String EXTRA_REMOTEVIEWS = "android.support.customtabs.extra.EXTRA_REMOTEVIEWS";
+    field public static final java.lang.String EXTRA_REMOTEVIEWS_CLICKED_ID = "android.support.customtabs.extra.EXTRA_REMOTEVIEWS_CLICKED_ID";
+    field public static final java.lang.String EXTRA_REMOTEVIEWS_PENDINGINTENT = "android.support.customtabs.extra.EXTRA_REMOTEVIEWS_PENDINGINTENT";
+    field public static final java.lang.String EXTRA_REMOTEVIEWS_VIEW_IDS = "android.support.customtabs.extra.EXTRA_REMOTEVIEWS_VIEW_IDS";
+    field public static final java.lang.String EXTRA_SECONDARY_TOOLBAR_COLOR = "android.support.customtabs.extra.SECONDARY_TOOLBAR_COLOR";
+    field public static final java.lang.String EXTRA_SESSION = "android.support.customtabs.extra.SESSION";
+    field public static final java.lang.String EXTRA_TINT_ACTION_BUTTON = "android.support.customtabs.extra.TINT_ACTION_BUTTON";
+    field public static final java.lang.String EXTRA_TITLE_VISIBILITY_STATE = "android.support.customtabs.extra.TITLE_VISIBILITY";
+    field public static final java.lang.String EXTRA_TOOLBAR_COLOR = "android.support.customtabs.extra.TOOLBAR_COLOR";
+    field public static final java.lang.String EXTRA_TOOLBAR_ITEMS = "android.support.customtabs.extra.TOOLBAR_ITEMS";
+    field public static final java.lang.String KEY_DESCRIPTION = "android.support.customtabs.customaction.DESCRIPTION";
+    field public static final java.lang.String KEY_ICON = "android.support.customtabs.customaction.ICON";
+    field public static final java.lang.String KEY_ID = "android.support.customtabs.customaction.ID";
+    field public static final java.lang.String KEY_MENU_ITEM_TITLE = "android.support.customtabs.customaction.MENU_ITEM_TITLE";
+    field public static final java.lang.String KEY_PENDING_INTENT = "android.support.customtabs.customaction.PENDING_INTENT";
+    field public static final int NO_TITLE = 0; // 0x0
+    field public static final int SHOW_PAGE_TITLE = 1; // 0x1
+    field public static final int TOOLBAR_ACTION_BUTTON_ID = 0; // 0x0
+    field public final android.content.Intent intent;
+    field public final android.os.Bundle startAnimationBundle;
+  }
+
+  public static final class CustomTabsIntent.Builder {
+    ctor public CustomTabsIntent.Builder();
+    ctor public CustomTabsIntent.Builder(android.support.customtabs.CustomTabsSession);
+    method public android.support.customtabs.CustomTabsIntent.Builder addDefaultShareMenuItem();
+    method public android.support.customtabs.CustomTabsIntent.Builder addMenuItem(java.lang.String, android.app.PendingIntent);
+    method public deprecated android.support.customtabs.CustomTabsIntent.Builder addToolbarItem(int, android.graphics.Bitmap, java.lang.String, android.app.PendingIntent) throws java.lang.IllegalStateException;
+    method public android.support.customtabs.CustomTabsIntent build();
+    method public android.support.customtabs.CustomTabsIntent.Builder enableUrlBarHiding();
+    method public android.support.customtabs.CustomTabsIntent.Builder setActionButton(android.graphics.Bitmap, java.lang.String, android.app.PendingIntent, boolean);
+    method public android.support.customtabs.CustomTabsIntent.Builder setActionButton(android.graphics.Bitmap, java.lang.String, android.app.PendingIntent);
+    method public android.support.customtabs.CustomTabsIntent.Builder setCloseButtonIcon(android.graphics.Bitmap);
+    method public android.support.customtabs.CustomTabsIntent.Builder setExitAnimations(android.content.Context, int, int);
+    method public android.support.customtabs.CustomTabsIntent.Builder setSecondaryToolbarColor(int);
+    method public android.support.customtabs.CustomTabsIntent.Builder setSecondaryToolbarViews(android.widget.RemoteViews, int[], android.app.PendingIntent);
+    method public android.support.customtabs.CustomTabsIntent.Builder setShowTitle(boolean);
+    method public android.support.customtabs.CustomTabsIntent.Builder setStartAnimations(android.content.Context, int, int);
+    method public android.support.customtabs.CustomTabsIntent.Builder setToolbarColor(int);
+  }
+
+  public abstract class CustomTabsService extends android.app.Service {
+    ctor public CustomTabsService();
+    method protected boolean cleanUpSession(android.support.customtabs.CustomTabsSessionToken);
+    method protected abstract android.os.Bundle extraCommand(java.lang.String, android.os.Bundle);
+    method protected abstract boolean mayLaunchUrl(android.support.customtabs.CustomTabsSessionToken, android.net.Uri, android.os.Bundle, java.util.List<android.os.Bundle>);
+    method protected abstract boolean newSession(android.support.customtabs.CustomTabsSessionToken);
+    method public android.os.IBinder onBind(android.content.Intent);
+    method protected abstract boolean updateVisuals(android.support.customtabs.CustomTabsSessionToken, android.os.Bundle);
+    method protected abstract boolean warmup(long);
+    field public static final java.lang.String ACTION_CUSTOM_TABS_CONNECTION = "android.support.customtabs.action.CustomTabsService";
+    field public static final java.lang.String KEY_URL = "android.support.customtabs.otherurls.URL";
+  }
+
+  public abstract class CustomTabsServiceConnection implements android.content.ServiceConnection {
+    ctor public CustomTabsServiceConnection();
+    method public abstract void onCustomTabsServiceConnected(android.content.ComponentName, android.support.customtabs.CustomTabsClient);
+    method public final void onServiceConnected(android.content.ComponentName, android.os.IBinder);
+  }
+
+  public final class CustomTabsSession {
+    method public boolean mayLaunchUrl(android.net.Uri, android.os.Bundle, java.util.List<android.os.Bundle>);
+    method public boolean setActionButton(android.graphics.Bitmap, java.lang.String);
+    method public boolean setSecondaryToolbarViews(android.widget.RemoteViews, int[], android.app.PendingIntent);
+    method public deprecated boolean setToolbarItem(int, android.graphics.Bitmap, java.lang.String);
+  }
+
+  public class CustomTabsSessionToken {
+    method public android.support.customtabs.CustomTabsCallback getCallback();
+    method public static android.support.customtabs.CustomTabsSessionToken getSessionTokenFromIntent(android.content.Intent);
+  }
+
+}
+
+package android.support.design.widget {
+
+  public class AppBarLayout extends android.widget.LinearLayout {
+    ctor public AppBarLayout(android.content.Context);
+    ctor public AppBarLayout(android.content.Context, android.util.AttributeSet);
+    method public void addOnOffsetChangedListener(android.support.design.widget.AppBarLayout.OnOffsetChangedListener);
+    method public deprecated float getTargetElevation();
+    method public final int getTotalScrollRange();
+    method public void removeOnOffsetChangedListener(android.support.design.widget.AppBarLayout.OnOffsetChangedListener);
+    method public void setExpanded(boolean);
+    method public void setExpanded(boolean, boolean);
+    method public deprecated void setTargetElevation(float);
+  }
+
+  public static class AppBarLayout.Behavior extends android.support.design.widget.HeaderBehavior {
+    ctor public AppBarLayout.Behavior();
+    ctor public AppBarLayout.Behavior(android.content.Context, android.util.AttributeSet);
+    method public boolean onLayoutChild(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, int);
+    method public boolean onMeasureChild(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, int, int, int, int);
+    method public boolean onNestedFling(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.view.View, float, float, boolean);
+    method public void onNestedPreScroll(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.view.View, int, int, int[]);
+    method public void onNestedScroll(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.view.View, int, int, int, int);
+    method public void onRestoreInstanceState(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.os.Parcelable);
+    method public android.os.Parcelable onSaveInstanceState(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout);
+    method public boolean onStartNestedScroll(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.view.View, android.view.View, int);
+    method public void onStopNestedScroll(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.view.View);
+    method public void setDragCallback(android.support.design.widget.AppBarLayout.Behavior.DragCallback);
+  }
+
+  public static abstract class AppBarLayout.Behavior.DragCallback {
+    ctor public AppBarLayout.Behavior.DragCallback();
+    method public abstract boolean canDrag(android.support.design.widget.AppBarLayout);
+  }
+
+  protected static class AppBarLayout.Behavior.SavedState extends android.support.v4.view.AbsSavedState {
+    ctor public AppBarLayout.Behavior.SavedState(android.os.Parcel, java.lang.ClassLoader);
+    ctor public AppBarLayout.Behavior.SavedState(android.os.Parcelable);
+    field public static final android.os.Parcelable.Creator<android.support.design.widget.AppBarLayout.Behavior.SavedState> CREATOR;
+  }
+
+  public static class AppBarLayout.LayoutParams extends android.widget.LinearLayout.LayoutParams {
+    ctor public AppBarLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
+    ctor public AppBarLayout.LayoutParams(int, int);
+    ctor public AppBarLayout.LayoutParams(int, int, float);
+    ctor public AppBarLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
+    ctor public AppBarLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
+    ctor public AppBarLayout.LayoutParams(android.widget.LinearLayout.LayoutParams);
+    ctor public AppBarLayout.LayoutParams(android.support.design.widget.AppBarLayout.LayoutParams);
+    method public int getScrollFlags();
+    method public android.view.animation.Interpolator getScrollInterpolator();
+    method public void setScrollFlags(int);
+    method public void setScrollInterpolator(android.view.animation.Interpolator);
+    field public static final int SCROLL_FLAG_ENTER_ALWAYS = 4; // 0x4
+    field public static final int SCROLL_FLAG_ENTER_ALWAYS_COLLAPSED = 8; // 0x8
+    field public static final int SCROLL_FLAG_EXIT_UNTIL_COLLAPSED = 2; // 0x2
+    field public static final int SCROLL_FLAG_SCROLL = 1; // 0x1
+    field public static final int SCROLL_FLAG_SNAP = 16; // 0x10
+  }
+
+  public static abstract interface AppBarLayout.OnOffsetChangedListener {
+    method public abstract void onOffsetChanged(android.support.design.widget.AppBarLayout, int);
+  }
+
+  public static class AppBarLayout.ScrollingViewBehavior extends android.support.design.widget.HeaderScrollingViewBehavior {
+    ctor public AppBarLayout.ScrollingViewBehavior();
+    ctor public AppBarLayout.ScrollingViewBehavior(android.content.Context, android.util.AttributeSet);
+    method public boolean layoutDependsOn(android.support.design.widget.CoordinatorLayout, android.view.View, android.view.View);
+    method public boolean onDependentViewChanged(android.support.design.widget.CoordinatorLayout, android.view.View, android.view.View);
+  }
+
+  public class BottomSheetBehavior extends android.support.design.widget.CoordinatorLayout.Behavior {
+    ctor public BottomSheetBehavior();
+    ctor public BottomSheetBehavior(android.content.Context, android.util.AttributeSet);
+    method public static android.support.design.widget.BottomSheetBehavior<V> from(V);
+    method public final int getPeekHeight();
+    method public boolean getSkipCollapsed();
+    method public final int getState();
+    method public boolean isHideable();
+    method public void setBottomSheetCallback(android.support.design.widget.BottomSheetBehavior.BottomSheetCallback);
+    method public void setHideable(boolean);
+    method public final void setPeekHeight(int);
+    method public void setSkipCollapsed(boolean);
+    method public final void setState(int);
+    field public static final int STATE_COLLAPSED = 4; // 0x4
+    field public static final int STATE_DRAGGING = 1; // 0x1
+    field public static final int STATE_EXPANDED = 3; // 0x3
+    field public static final int STATE_HIDDEN = 5; // 0x5
+    field public static final int STATE_SETTLING = 2; // 0x2
+  }
+
+  public static abstract class BottomSheetBehavior.BottomSheetCallback {
+    ctor public BottomSheetBehavior.BottomSheetCallback();
+    method public abstract void onSlide(android.view.View, float);
+    method public abstract void onStateChanged(android.view.View, int);
+  }
+
+  protected static class BottomSheetBehavior.SavedState extends android.support.v4.view.AbsSavedState {
+    ctor public BottomSheetBehavior.SavedState(android.os.Parcel);
+    ctor public BottomSheetBehavior.SavedState(android.os.Parcel, java.lang.ClassLoader);
+    ctor public BottomSheetBehavior.SavedState(android.os.Parcelable, int);
+    field public static final android.os.Parcelable.Creator<android.support.design.widget.BottomSheetBehavior.SavedState> CREATOR;
+  }
+
+  public class BottomSheetDialog extends android.support.v7.app.AppCompatDialog {
+    ctor public BottomSheetDialog(android.content.Context);
+    ctor public BottomSheetDialog(android.content.Context, int);
+    ctor protected BottomSheetDialog(android.content.Context, boolean, android.content.DialogInterface.OnCancelListener);
+  }
+
+  public class BottomSheetDialogFragment extends android.support.v7.app.AppCompatDialogFragment {
+    ctor public BottomSheetDialogFragment();
+  }
+
+  public class CollapsingToolbarLayout extends android.widget.FrameLayout {
+    ctor public CollapsingToolbarLayout(android.content.Context);
+    ctor public CollapsingToolbarLayout(android.content.Context, android.util.AttributeSet);
+    ctor public CollapsingToolbarLayout(android.content.Context, android.util.AttributeSet, int);
+    method public int getCollapsedTitleGravity();
+    method public android.graphics.Typeface getCollapsedTitleTypeface();
+    method public android.graphics.drawable.Drawable getContentScrim();
+    method public int getExpandedTitleGravity();
+    method public int getExpandedTitleMarginBottom();
+    method public int getExpandedTitleMarginEnd();
+    method public int getExpandedTitleMarginStart();
+    method public int getExpandedTitleMarginTop();
+    method public android.graphics.Typeface getExpandedTitleTypeface();
+    method public long getScrimAnimationDuration();
+    method public int getScrimVisibleHeightTrigger();
+    method public android.graphics.drawable.Drawable getStatusBarScrim();
+    method public java.lang.CharSequence getTitle();
+    method public boolean isTitleEnabled();
+    method public void setCollapsedTitleGravity(int);
+    method public void setCollapsedTitleTextAppearance(int);
+    method public void setCollapsedTitleTextColor(int);
+    method public void setCollapsedTitleTypeface(android.graphics.Typeface);
+    method public void setContentScrim(android.graphics.drawable.Drawable);
+    method public void setContentScrimColor(int);
+    method public void setContentScrimResource(int);
+    method public void setExpandedTitleColor(int);
+    method public void setExpandedTitleGravity(int);
+    method public void setExpandedTitleMargin(int, int, int, int);
+    method public void setExpandedTitleMarginBottom(int);
+    method public void setExpandedTitleMarginEnd(int);
+    method public void setExpandedTitleMarginStart(int);
+    method public void setExpandedTitleMarginTop(int);
+    method public void setExpandedTitleTextAppearance(int);
+    method public void setExpandedTitleTypeface(android.graphics.Typeface);
+    method public void setScrimAnimationDuration(long);
+    method public void setScrimVisibleHeightTrigger(int);
+    method public void setScrimsShown(boolean);
+    method public void setScrimsShown(boolean, boolean);
+    method public void setStatusBarScrim(android.graphics.drawable.Drawable);
+    method public void setStatusBarScrimColor(int);
+    method public void setStatusBarScrimResource(int);
+    method public void setTitle(java.lang.CharSequence);
+    method public void setTitleEnabled(boolean);
+  }
+
+  public static class CollapsingToolbarLayout.LayoutParams extends android.widget.FrameLayout.LayoutParams {
+    ctor public CollapsingToolbarLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
+    ctor public CollapsingToolbarLayout.LayoutParams(int, int);
+    ctor public CollapsingToolbarLayout.LayoutParams(int, int, int);
+    ctor public CollapsingToolbarLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
+    ctor public CollapsingToolbarLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
+    ctor public CollapsingToolbarLayout.LayoutParams(android.widget.FrameLayout.LayoutParams);
+    method public int getCollapseMode();
+    method public float getParallaxMultiplier();
+    method public void setCollapseMode(int);
+    method public void setParallaxMultiplier(float);
+    field public static final int COLLAPSE_MODE_OFF = 0; // 0x0
+    field public static final int COLLAPSE_MODE_PARALLAX = 2; // 0x2
+    field public static final int COLLAPSE_MODE_PIN = 1; // 0x1
+  }
+
+  public class CoordinatorLayout extends android.view.ViewGroup implements android.support.v4.view.NestedScrollingParent {
+    ctor public CoordinatorLayout(android.content.Context);
+    ctor public CoordinatorLayout(android.content.Context, android.util.AttributeSet);
+    ctor public CoordinatorLayout(android.content.Context, android.util.AttributeSet, int);
+    method public void dispatchDependentViewsChanged(android.view.View);
+    method public boolean doViewsOverlap(android.view.View, android.view.View);
+    method public java.util.List<android.view.View> getDependencies(android.view.View);
+    method public android.graphics.drawable.Drawable getStatusBarBackground();
+    method public boolean isPointInChildBounds(android.view.View, int, int);
+    method public void onAttachedToWindow();
+    method public void onDetachedFromWindow();
+    method public void onDraw(android.graphics.Canvas);
+    method protected void onLayout(boolean, int, int, int, int);
+    method public void onLayoutChild(android.view.View, int);
+    method public void onMeasureChild(android.view.View, int, int, int, int);
+    method public void setStatusBarBackground(android.graphics.drawable.Drawable);
+    method public void setStatusBarBackgroundColor(int);
+    method public void setStatusBarBackgroundResource(int);
+  }
+
+  public static abstract class CoordinatorLayout.Behavior {
+    ctor public CoordinatorLayout.Behavior();
+    ctor public CoordinatorLayout.Behavior(android.content.Context, android.util.AttributeSet);
+    method public boolean blocksInteractionBelow(android.support.design.widget.CoordinatorLayout, V);
+    method public int getScrimColor(android.support.design.widget.CoordinatorLayout, V);
+    method public float getScrimOpacity(android.support.design.widget.CoordinatorLayout, V);
+    method public static java.lang.Object getTag(android.view.View);
+    method public boolean isDirty(android.support.design.widget.CoordinatorLayout, V);
+    method public boolean layoutDependsOn(android.support.design.widget.CoordinatorLayout, V, android.view.View);
+    method public android.support.v4.view.WindowInsetsCompat onApplyWindowInsets(android.support.design.widget.CoordinatorLayout, V, android.support.v4.view.WindowInsetsCompat);
+    method public boolean onDependentViewChanged(android.support.design.widget.CoordinatorLayout, V, android.view.View);
+    method public void onDependentViewRemoved(android.support.design.widget.CoordinatorLayout, V, android.view.View);
+    method public boolean onInterceptTouchEvent(android.support.design.widget.CoordinatorLayout, V, android.view.MotionEvent);
+    method public boolean onLayoutChild(android.support.design.widget.CoordinatorLayout, V, int);
+    method public boolean onMeasureChild(android.support.design.widget.CoordinatorLayout, V, int, int, int, int);
+    method public boolean onNestedFling(android.support.design.widget.CoordinatorLayout, V, android.view.View, float, float, boolean);
+    method public boolean onNestedPreFling(android.support.design.widget.CoordinatorLayout, V, android.view.View, float, float);
+    method public void onNestedPreScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, int, int, int[]);
+    method public void onNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, int, int, int, int);
+    method public void onNestedScrollAccepted(android.support.design.widget.CoordinatorLayout, V, android.view.View, android.view.View, int);
+    method public void onRestoreInstanceState(android.support.design.widget.CoordinatorLayout, V, android.os.Parcelable);
+    method public android.os.Parcelable onSaveInstanceState(android.support.design.widget.CoordinatorLayout, V);
+    method public boolean onStartNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, android.view.View, int);
+    method public void onStopNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View);
+    method public boolean onTouchEvent(android.support.design.widget.CoordinatorLayout, V, android.view.MotionEvent);
+    method public static void setTag(android.view.View, java.lang.Object);
+  }
+
+  public static abstract class CoordinatorLayout.DefaultBehavior implements java.lang.annotation.Annotation {
+  }
+
+  public static class CoordinatorLayout.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
+    ctor public CoordinatorLayout.LayoutParams(int, int);
+    ctor public CoordinatorLayout.LayoutParams(android.support.design.widget.CoordinatorLayout.LayoutParams);
+    ctor public CoordinatorLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
+    ctor public CoordinatorLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
+    method public int getAnchorId();
+    method public android.support.design.widget.CoordinatorLayout.Behavior getBehavior();
+    method public void setAnchorId(int);
+    method public void setBehavior(android.support.design.widget.CoordinatorLayout.Behavior);
+    field public int anchorGravity;
+    field public int gravity;
+    field public int keyline;
+  }
+
+  protected static class CoordinatorLayout.SavedState extends android.support.v4.view.AbsSavedState {
+    ctor public CoordinatorLayout.SavedState(android.os.Parcel, java.lang.ClassLoader);
+    ctor public CoordinatorLayout.SavedState(android.os.Parcelable);
+    field public static final android.os.Parcelable.Creator<android.support.design.widget.CoordinatorLayout.SavedState> CREATOR;
+  }
+
+  public class FloatingActionButton extends android.support.design.widget.VisibilityAwareImageButton {
+    ctor public FloatingActionButton(android.content.Context);
+    ctor public FloatingActionButton(android.content.Context, android.util.AttributeSet);
+    ctor public FloatingActionButton(android.content.Context, android.util.AttributeSet, int);
+    method public float getCompatElevation();
+    method public android.graphics.drawable.Drawable getContentBackground();
+    method public boolean getContentRect(android.graphics.Rect);
+    method public int getSize();
+    method public boolean getUseCompatPadding();
+    method public void hide();
+    method public void hide(android.support.design.widget.FloatingActionButton.OnVisibilityChangedListener);
+    method public void setCompatElevation(float);
+    method public void setRippleColor(int);
+    method public void setSize(int);
+    method public void setUseCompatPadding(boolean);
+    method public void show();
+    method public void show(android.support.design.widget.FloatingActionButton.OnVisibilityChangedListener);
+    field public static final int SIZE_AUTO = -1; // 0xffffffff
+    field public static final int SIZE_MINI = 1; // 0x1
+    field public static final int SIZE_NORMAL = 0; // 0x0
+  }
+
+  public static class FloatingActionButton.Behavior extends android.support.design.widget.CoordinatorLayout.Behavior {
+    ctor public FloatingActionButton.Behavior();
+    ctor public FloatingActionButton.Behavior(android.content.Context, android.util.AttributeSet);
+    method public boolean getAutoHide();
+    method public boolean layoutDependsOn(android.support.design.widget.CoordinatorLayout, android.support.design.widget.FloatingActionButton, android.view.View);
+    method public boolean onDependentViewChanged(android.support.design.widget.CoordinatorLayout, android.support.design.widget.FloatingActionButton, android.view.View);
+    method public void onDependentViewRemoved(android.support.design.widget.CoordinatorLayout, android.support.design.widget.FloatingActionButton, android.view.View);
+    method public boolean onLayoutChild(android.support.design.widget.CoordinatorLayout, android.support.design.widget.FloatingActionButton, int);
+    method public void setAutoHide(boolean);
+  }
+
+  public static abstract class FloatingActionButton.OnVisibilityChangedListener {
+    ctor public FloatingActionButton.OnVisibilityChangedListener();
+    method public void onHidden(android.support.design.widget.FloatingActionButton);
+    method public void onShown(android.support.design.widget.FloatingActionButton);
+  }
+
+   abstract class HeaderBehavior extends android.support.design.widget.ViewOffsetBehavior {
+    ctor public HeaderBehavior();
+    ctor public HeaderBehavior(android.content.Context, android.util.AttributeSet);
+  }
+
+   abstract class HeaderScrollingViewBehavior extends android.support.design.widget.ViewOffsetBehavior {
+    ctor public HeaderScrollingViewBehavior();
+    ctor public HeaderScrollingViewBehavior(android.content.Context, android.util.AttributeSet);
+    method public final int getOverlayTop();
+    method protected void layoutChild(android.support.design.widget.CoordinatorLayout, android.view.View, int);
+    method public boolean onMeasureChild(android.support.design.widget.CoordinatorLayout, android.view.View, int, int, int, int);
+    method public final void setOverlayTop(int);
+  }
+
+  public class NavigationView extends android.widget.FrameLayout {
+    ctor public NavigationView(android.content.Context);
+    ctor public NavigationView(android.content.Context, android.util.AttributeSet);
+    ctor public NavigationView(android.content.Context, android.util.AttributeSet, int);
+    method public void addHeaderView(android.view.View);
+    method public int getHeaderCount();
+    method public android.view.View getHeaderView(int);
+    method public android.graphics.drawable.Drawable getItemBackground();
+    method public android.content.res.ColorStateList getItemIconTintList();
+    method public android.content.res.ColorStateList getItemTextColor();
+    method public android.view.Menu getMenu();
+    method public android.view.View inflateHeaderView(int);
+    method public void inflateMenu(int);
+    method public void removeHeaderView(android.view.View);
+    method public void setCheckedItem(int);
+    method public void setItemBackground(android.graphics.drawable.Drawable);
+    method public void setItemBackgroundResource(int);
+    method public void setItemIconTintList(android.content.res.ColorStateList);
+    method public void setItemTextAppearance(int);
+    method public void setItemTextColor(android.content.res.ColorStateList);
+    method public void setNavigationItemSelectedListener(android.support.design.widget.NavigationView.OnNavigationItemSelectedListener);
+  }
+
+  public static abstract interface NavigationView.OnNavigationItemSelectedListener {
+    method public abstract boolean onNavigationItemSelected(android.view.MenuItem);
+  }
+
+  public static class NavigationView.SavedState extends android.support.v4.view.AbsSavedState {
+    ctor public NavigationView.SavedState(android.os.Parcel, java.lang.ClassLoader);
+    ctor public NavigationView.SavedState(android.os.Parcelable);
+    field public static final android.os.Parcelable.Creator<android.support.design.widget.NavigationView.SavedState> CREATOR;
+    field public android.os.Bundle menuState;
+  }
+
+  public final class Snackbar {
+    method public void dismiss();
+    method public int getDuration();
+    method public android.view.View getView();
+    method public boolean isShown();
+    method public boolean isShownOrQueued();
+    method public static android.support.design.widget.Snackbar make(android.view.View, java.lang.CharSequence, int);
+    method public static android.support.design.widget.Snackbar make(android.view.View, int, int);
+    method public android.support.design.widget.Snackbar setAction(int, android.view.View.OnClickListener);
+    method public android.support.design.widget.Snackbar setAction(java.lang.CharSequence, android.view.View.OnClickListener);
+    method public android.support.design.widget.Snackbar setActionTextColor(android.content.res.ColorStateList);
+    method public android.support.design.widget.Snackbar setActionTextColor(int);
+    method public android.support.design.widget.Snackbar setCallback(android.support.design.widget.Snackbar.Callback);
+    method public android.support.design.widget.Snackbar setDuration(int);
+    method public android.support.design.widget.Snackbar setText(java.lang.CharSequence);
+    method public android.support.design.widget.Snackbar setText(int);
+    method public void show();
+    field public static final int LENGTH_INDEFINITE = -2; // 0xfffffffe
+    field public static final int LENGTH_LONG = 0; // 0x0
+    field public static final int LENGTH_SHORT = -1; // 0xffffffff
+  }
+
+  public static abstract class Snackbar.Callback {
+    ctor public Snackbar.Callback();
+    method public void onDismissed(android.support.design.widget.Snackbar, int);
+    method public void onShown(android.support.design.widget.Snackbar);
+    field public static final int DISMISS_EVENT_ACTION = 1; // 0x1
+    field public static final int DISMISS_EVENT_CONSECUTIVE = 4; // 0x4
+    field public static final int DISMISS_EVENT_MANUAL = 3; // 0x3
+    field public static final int DISMISS_EVENT_SWIPE = 0; // 0x0
+    field public static final int DISMISS_EVENT_TIMEOUT = 2; // 0x2
+  }
+
+  public class SwipeDismissBehavior extends android.support.design.widget.CoordinatorLayout.Behavior {
+    ctor public SwipeDismissBehavior();
+    method public boolean canSwipeDismissView(android.view.View);
+    method public int getDragState();
+    method public void setDragDismissDistance(float);
+    method public void setEndAlphaSwipeDistance(float);
+    method public void setListener(android.support.design.widget.SwipeDismissBehavior.OnDismissListener);
+    method public void setSensitivity(float);
+    method public void setStartAlphaSwipeDistance(float);
+    method public void setSwipeDirection(int);
+    field public static final int STATE_DRAGGING = 1; // 0x1
+    field public static final int STATE_IDLE = 0; // 0x0
+    field public static final int STATE_SETTLING = 2; // 0x2
+    field public static final int SWIPE_DIRECTION_ANY = 2; // 0x2
+    field public static final int SWIPE_DIRECTION_END_TO_START = 1; // 0x1
+    field public static final int SWIPE_DIRECTION_START_TO_END = 0; // 0x0
+  }
+
+  public static abstract interface SwipeDismissBehavior.OnDismissListener {
+    method public abstract void onDismiss(android.view.View);
+    method public abstract void onDragStateChanged(int);
+  }
+
+  public final class TabItem extends android.view.View {
+    ctor public TabItem(android.content.Context);
+    ctor public TabItem(android.content.Context, android.util.AttributeSet);
+  }
+
+  public class TabLayout extends android.widget.HorizontalScrollView {
+    ctor public TabLayout(android.content.Context);
+    ctor public TabLayout(android.content.Context, android.util.AttributeSet);
+    ctor public TabLayout(android.content.Context, android.util.AttributeSet, int);
+    method public void addOnTabSelectedListener(android.support.design.widget.TabLayout.OnTabSelectedListener);
+    method public void addTab(android.support.design.widget.TabLayout.Tab);
+    method public void addTab(android.support.design.widget.TabLayout.Tab, int);
+    method public void addTab(android.support.design.widget.TabLayout.Tab, boolean);
+    method public void addTab(android.support.design.widget.TabLayout.Tab, int, boolean);
+    method public int getSelectedTabPosition();
+    method public android.support.design.widget.TabLayout.Tab getTabAt(int);
+    method public int getTabCount();
+    method public int getTabGravity();
+    method public int getTabMode();
+    method public android.content.res.ColorStateList getTabTextColors();
+    method public android.support.design.widget.TabLayout.Tab newTab();
+    method public void removeAllTabs();
+    method public void removeOnTabSelectedListener(android.support.design.widget.TabLayout.OnTabSelectedListener);
+    method public void removeTab(android.support.design.widget.TabLayout.Tab);
+    method public void removeTabAt(int);
+    method public deprecated void setOnTabSelectedListener(android.support.design.widget.TabLayout.OnTabSelectedListener);
+    method public void setScrollPosition(int, float, boolean);
+    method public void setSelectedTabIndicatorColor(int);
+    method public void setSelectedTabIndicatorHeight(int);
+    method public void setTabGravity(int);
+    method public void setTabMode(int);
+    method public void setTabTextColors(android.content.res.ColorStateList);
+    method public void setTabTextColors(int, int);
+    method public deprecated void setTabsFromPagerAdapter(android.support.v4.view.PagerAdapter);
+    method public void setupWithViewPager(android.support.v4.view.ViewPager);
+    method public void setupWithViewPager(android.support.v4.view.ViewPager, boolean);
+    field public static final int GRAVITY_CENTER = 1; // 0x1
+    field public static final int GRAVITY_FILL = 0; // 0x0
+    field public static final int MODE_FIXED = 1; // 0x1
+    field public static final int MODE_SCROLLABLE = 0; // 0x0
+  }
+
+  public static abstract interface TabLayout.OnTabSelectedListener {
+    method public abstract void onTabReselected(android.support.design.widget.TabLayout.Tab);
+    method public abstract void onTabSelected(android.support.design.widget.TabLayout.Tab);
+    method public abstract void onTabUnselected(android.support.design.widget.TabLayout.Tab);
+  }
+
+  public static final class TabLayout.Tab {
+    method public java.lang.CharSequence getContentDescription();
+    method public android.view.View getCustomView();
+    method public android.graphics.drawable.Drawable getIcon();
+    method public int getPosition();
+    method public java.lang.Object getTag();
+    method public java.lang.CharSequence getText();
+    method public boolean isSelected();
+    method public void select();
+    method public android.support.design.widget.TabLayout.Tab setContentDescription(int);
+    method public android.support.design.widget.TabLayout.Tab setContentDescription(java.lang.CharSequence);
+    method public android.support.design.widget.TabLayout.Tab setCustomView(android.view.View);
+    method public android.support.design.widget.TabLayout.Tab setCustomView(int);
+    method public android.support.design.widget.TabLayout.Tab setIcon(android.graphics.drawable.Drawable);
+    method public android.support.design.widget.TabLayout.Tab setIcon(int);
+    method public android.support.design.widget.TabLayout.Tab setTag(java.lang.Object);
+    method public android.support.design.widget.TabLayout.Tab setText(java.lang.CharSequence);
+    method public android.support.design.widget.TabLayout.Tab setText(int);
+    field public static final int INVALID_POSITION = -1; // 0xffffffff
+  }
+
+  public static class TabLayout.TabLayoutOnPageChangeListener implements android.support.v4.view.ViewPager.OnPageChangeListener {
+    ctor public TabLayout.TabLayoutOnPageChangeListener(android.support.design.widget.TabLayout);
+    method public void onPageScrollStateChanged(int);
+    method public void onPageScrolled(int, float, int);
+    method public void onPageSelected(int);
+  }
+
+  public static class TabLayout.ViewPagerOnTabSelectedListener implements android.support.design.widget.TabLayout.OnTabSelectedListener {
+    ctor public TabLayout.ViewPagerOnTabSelectedListener(android.support.v4.view.ViewPager);
+    method public void onTabReselected(android.support.design.widget.TabLayout.Tab);
+    method public void onTabSelected(android.support.design.widget.TabLayout.Tab);
+    method public void onTabUnselected(android.support.design.widget.TabLayout.Tab);
+  }
+
+  public class TextInputEditText extends android.support.v7.widget.AppCompatEditText {
+    ctor public TextInputEditText(android.content.Context);
+    ctor public TextInputEditText(android.content.Context, android.util.AttributeSet);
+    ctor public TextInputEditText(android.content.Context, android.util.AttributeSet, int);
+  }
+
+  public class TextInputLayout extends android.widget.LinearLayout {
+    ctor public TextInputLayout(android.content.Context);
+    ctor public TextInputLayout(android.content.Context, android.util.AttributeSet);
+    ctor public TextInputLayout(android.content.Context, android.util.AttributeSet, int);
+    method public int getCounterMaxLength();
+    method public android.widget.EditText getEditText();
+    method public java.lang.CharSequence getError();
+    method public java.lang.CharSequence getHint();
+    method public android.graphics.Typeface getTypeface();
+    method public boolean isCounterEnabled();
+    method public boolean isErrorEnabled();
+    method public boolean isHintAnimationEnabled();
+    method public boolean isHintEnabled();
+    method public android.os.Parcelable onSaveInstanceState();
+    method public void setCounterEnabled(boolean);
+    method public void setCounterMaxLength(int);
+    method public void setError(java.lang.CharSequence);
+    method public void setErrorEnabled(boolean);
+    method public void setHint(java.lang.CharSequence);
+    method public void setHintAnimationEnabled(boolean);
+    method public void setHintEnabled(boolean);
+    method public void setHintTextAppearance(int);
+    method public void setTypeface(android.graphics.Typeface);
+  }
+
+   class ViewOffsetBehavior extends android.support.design.widget.CoordinatorLayout.Behavior {
+    ctor public ViewOffsetBehavior();
+    ctor public ViewOffsetBehavior(android.content.Context, android.util.AttributeSet);
+    method public int getLeftAndRightOffset();
+    method public int getTopAndBottomOffset();
+    method protected void layoutChild(android.support.design.widget.CoordinatorLayout, V, int);
+    method public boolean setLeftAndRightOffset(int);
+    method public boolean setTopAndBottomOffset(int);
+  }
+
+   class VisibilityAwareImageButton extends android.widget.ImageButton {
+    ctor public VisibilityAwareImageButton(android.content.Context);
+    ctor public VisibilityAwareImageButton(android.content.Context, android.util.AttributeSet);
+    ctor public VisibilityAwareImageButton(android.content.Context, android.util.AttributeSet, int);
+  }
+
+}
+
+package android.support.graphics.drawable {
+
+  public class AnimatedVectorDrawableCompat extends android.support.graphics.drawable.VectorDrawableCommon {
+    method public static android.support.graphics.drawable.AnimatedVectorDrawableCompat create(android.content.Context, int);
+    method public static android.support.graphics.drawable.AnimatedVectorDrawableCompat createFromXmlInner(android.content.Context, android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources.Theme) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+    method public void draw(android.graphics.Canvas);
+    method public int getOpacity();
+    method public boolean isRunning();
+    method public void setAlpha(int);
+    method public void setColorFilter(android.graphics.ColorFilter);
+    method public void start();
+    method public void stop();
+  }
+
+   abstract class VectorDrawableCommon extends android.graphics.drawable.Drawable {
+  }
+
+  public class VectorDrawableCompat extends android.support.graphics.drawable.VectorDrawableCommon {
+    method public static android.support.graphics.drawable.VectorDrawableCompat create(android.content.res.Resources, int, android.content.res.Resources.Theme);
+    method public static android.support.graphics.drawable.VectorDrawableCompat createFromXmlInner(android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources.Theme) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+    method public void draw(android.graphics.Canvas);
+    method public int getOpacity();
+    method public void setAlpha(int);
+    method public void setColorFilter(android.graphics.ColorFilter);
+  }
+
+}
+
+package android.support.percent {
+
+  public class PercentFrameLayout extends android.widget.FrameLayout {
+    ctor public PercentFrameLayout(android.content.Context);
+    ctor public PercentFrameLayout(android.content.Context, android.util.AttributeSet);
+    ctor public PercentFrameLayout(android.content.Context, android.util.AttributeSet, int);
+  }
+
+  public static class PercentFrameLayout.LayoutParams extends android.widget.FrameLayout.LayoutParams implements android.support.percent.PercentLayoutHelper.PercentLayoutParams {
+    ctor public PercentFrameLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
+    ctor public PercentFrameLayout.LayoutParams(int, int);
+    ctor public PercentFrameLayout.LayoutParams(int, int, int);
+    ctor public PercentFrameLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
+    ctor public PercentFrameLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
+    ctor public PercentFrameLayout.LayoutParams(android.widget.FrameLayout.LayoutParams);
+    ctor public PercentFrameLayout.LayoutParams(android.support.percent.PercentFrameLayout.LayoutParams);
+    method public android.support.percent.PercentLayoutHelper.PercentLayoutInfo getPercentLayoutInfo();
+  }
+
+  public class PercentLayoutHelper {
+    ctor public PercentLayoutHelper(android.view.ViewGroup);
+    method public void adjustChildren(int, int);
+    method public static void fetchWidthAndHeight(android.view.ViewGroup.LayoutParams, android.content.res.TypedArray, int, int);
+    method public static android.support.percent.PercentLayoutHelper.PercentLayoutInfo getPercentLayoutInfo(android.content.Context, android.util.AttributeSet);
+    method public boolean handleMeasuredStateTooSmall();
+    method public void restoreOriginalParams();
+  }
+
+  public static class PercentLayoutHelper.PercentLayoutInfo {
+    ctor public PercentLayoutHelper.PercentLayoutInfo();
+    method public void fillLayoutParams(android.view.ViewGroup.LayoutParams, int, int);
+    method public deprecated void fillMarginLayoutParams(android.view.ViewGroup.MarginLayoutParams, int, int);
+    method public void fillMarginLayoutParams(android.view.View, android.view.ViewGroup.MarginLayoutParams, int, int);
+    method public void restoreLayoutParams(android.view.ViewGroup.LayoutParams);
+    method public void restoreMarginLayoutParams(android.view.ViewGroup.MarginLayoutParams);
+    field public float aspectRatio;
+    field public float bottomMarginPercent;
+    field public float endMarginPercent;
+    field public float heightPercent;
+    field public float leftMarginPercent;
+    field public float rightMarginPercent;
+    field public float startMarginPercent;
+    field public float topMarginPercent;
+    field public float widthPercent;
+  }
+
+  public static abstract interface PercentLayoutHelper.PercentLayoutParams {
+    method public abstract android.support.percent.PercentLayoutHelper.PercentLayoutInfo getPercentLayoutInfo();
+  }
+
+  public class PercentRelativeLayout extends android.widget.RelativeLayout {
+    ctor public PercentRelativeLayout(android.content.Context);
+    ctor public PercentRelativeLayout(android.content.Context, android.util.AttributeSet);
+    ctor public PercentRelativeLayout(android.content.Context, android.util.AttributeSet, int);
+  }
+
+  public static class PercentRelativeLayout.LayoutParams extends android.widget.RelativeLayout.LayoutParams implements android.support.percent.PercentLayoutHelper.PercentLayoutParams {
+    ctor public PercentRelativeLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
+    ctor public PercentRelativeLayout.LayoutParams(int, int);
+    ctor public PercentRelativeLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
+    ctor public PercentRelativeLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
+    method public android.support.percent.PercentLayoutHelper.PercentLayoutInfo getPercentLayoutInfo();
+  }
+
+}
+
+package android.support.transition {
+
+  public class AutoTransition extends android.support.transition.TransitionSet {
+    ctor public AutoTransition();
+  }
+
+  public class ChangeBounds extends android.support.transition.Transition {
+    ctor public ChangeBounds();
+    method public void captureEndValues(android.support.transition.TransitionValues);
+    method public void captureStartValues(android.support.transition.TransitionValues);
+    method public android.animation.Animator createAnimator(android.view.ViewGroup, android.support.transition.TransitionValues, android.support.transition.TransitionValues);
+  }
+
+  public class Fade extends android.support.transition.Transition {
+    ctor public Fade(int);
+    ctor public Fade();
+    method public void captureEndValues(android.support.transition.TransitionValues);
+    method public void captureStartValues(android.support.transition.TransitionValues);
+    method public android.animation.Animator createAnimator(android.view.ViewGroup, android.support.transition.TransitionValues, android.support.transition.TransitionValues);
+    field public static final int IN = 1; // 0x1
+    field public static final int OUT = 2; // 0x2
+  }
+
+  public class Scene {
+    ctor public Scene(android.view.ViewGroup);
+    ctor public Scene(android.view.ViewGroup, android.view.View);
+    method public void enter();
+    method public void exit();
+    method public static android.support.transition.Scene getSceneForLayout(android.view.ViewGroup, int, android.content.Context);
+    method public android.view.ViewGroup getSceneRoot();
+    method public void setEnterAction(java.lang.Runnable);
+    method public void setExitAction(java.lang.Runnable);
+  }
+
+  public abstract class Transition {
+    ctor public Transition();
+    ctor protected Transition(boolean);
+    method public android.support.transition.Transition addListener(android.support.transition.Transition.TransitionListener);
+    method public android.support.transition.Transition addTarget(android.view.View);
+    method public android.support.transition.Transition addTarget(int);
+    method public abstract void captureEndValues(android.support.transition.TransitionValues);
+    method public abstract void captureStartValues(android.support.transition.TransitionValues);
+    method public abstract android.animation.Animator createAnimator(android.view.ViewGroup, android.support.transition.TransitionValues, android.support.transition.TransitionValues);
+    method public android.support.transition.Transition excludeChildren(android.view.View, boolean);
+    method public android.support.transition.Transition excludeChildren(int, boolean);
+    method public android.support.transition.Transition excludeChildren(java.lang.Class, boolean);
+    method public android.support.transition.Transition excludeTarget(android.view.View, boolean);
+    method public android.support.transition.Transition excludeTarget(int, boolean);
+    method public android.support.transition.Transition excludeTarget(java.lang.Class, boolean);
+    method public long getDuration();
+    method public android.animation.TimeInterpolator getInterpolator();
+    method public java.lang.String getName();
+    method public long getStartDelay();
+    method public java.util.List<java.lang.Integer> getTargetIds();
+    method public java.util.List<android.view.View> getTargets();
+    method public java.lang.String[] getTransitionProperties();
+    method public android.support.transition.TransitionValues getTransitionValues(android.view.View, boolean);
+    method public android.support.transition.Transition removeListener(android.support.transition.Transition.TransitionListener);
+    method public android.support.transition.Transition removeTarget(android.view.View);
+    method public android.support.transition.Transition removeTarget(int);
+    method public android.support.transition.Transition setDuration(long);
+    method public android.support.transition.Transition setInterpolator(android.animation.TimeInterpolator);
+    method public android.support.transition.Transition setStartDelay(long);
+  }
+
+  public static abstract interface Transition.TransitionListener {
+    method public abstract void onTransitionCancel(android.support.transition.Transition);
+    method public abstract void onTransitionEnd(android.support.transition.Transition);
+    method public abstract void onTransitionPause(android.support.transition.Transition);
+    method public abstract void onTransitionResume(android.support.transition.Transition);
+    method public abstract void onTransitionStart(android.support.transition.Transition);
+  }
+
+  public class TransitionManager {
+    ctor public TransitionManager();
+    method public static void beginDelayedTransition(android.view.ViewGroup);
+    method public static void beginDelayedTransition(android.view.ViewGroup, android.support.transition.Transition);
+    method public static void go(android.support.transition.Scene);
+    method public static void go(android.support.transition.Scene, android.support.transition.Transition);
+    method public void setTransition(android.support.transition.Scene, android.support.transition.Transition);
+    method public void setTransition(android.support.transition.Scene, android.support.transition.Scene, android.support.transition.Transition);
+    method public void transitionTo(android.support.transition.Scene);
+  }
+
+  public class TransitionSet extends android.support.transition.Transition {
+    ctor public TransitionSet();
+    method public android.support.transition.TransitionSet addTransition(android.support.transition.Transition);
+    method public void captureEndValues(android.support.transition.TransitionValues);
+    method public void captureStartValues(android.support.transition.TransitionValues);
+    method public android.animation.Animator createAnimator(android.view.ViewGroup, android.support.transition.TransitionValues, android.support.transition.TransitionValues);
+    method public int getOrdering();
+    method public android.support.transition.TransitionSet removeTransition(android.support.transition.Transition);
+    method public android.support.transition.TransitionSet setOrdering(int);
+    field public static final int ORDERING_SEQUENTIAL = 1; // 0x1
+    field public static final int ORDERING_TOGETHER = 0; // 0x0
+  }
+
+  public class TransitionValues {
+    ctor public TransitionValues();
+    field public final java.util.Map<java.lang.String, java.lang.Object> values;
+    field public android.view.View view;
+  }
+
+}
+
+package android.support.v13.app {
+
+  public class ActivityCompat extends android.support.v4.app.ActivityCompat {
+    method public static android.support.v13.view.DragAndDropPermissionsCompat requestDragAndDropPermissions(android.app.Activity, android.view.DragEvent);
+  }
+
+  public class FragmentCompat {
+    ctor public FragmentCompat();
+    method public static void requestPermissions(android.app.Fragment, java.lang.String[], int);
+    method public static void setMenuVisibility(android.app.Fragment, boolean);
+    method public static void setUserVisibleHint(android.app.Fragment, boolean);
+    method public static boolean shouldShowRequestPermissionRationale(android.app.Fragment, java.lang.String);
+  }
+
+  public static abstract interface FragmentCompat.OnRequestPermissionsResultCallback {
+    method public abstract void onRequestPermissionsResult(int, java.lang.String[], int[]);
+  }
+
+  public abstract class FragmentPagerAdapter extends android.support.v4.view.PagerAdapter {
+    ctor public FragmentPagerAdapter(android.app.FragmentManager);
+    method public abstract android.app.Fragment getItem(int);
+    method public long getItemId(int);
+    method public boolean isViewFromObject(android.view.View, java.lang.Object);
+  }
+
+  public abstract class FragmentStatePagerAdapter extends android.support.v4.view.PagerAdapter {
+    ctor public FragmentStatePagerAdapter(android.app.FragmentManager);
+    method public abstract android.app.Fragment getItem(int);
+    method public boolean isViewFromObject(android.view.View, java.lang.Object);
+  }
+
+  public class FragmentTabHost extends android.widget.TabHost implements android.widget.TabHost.OnTabChangeListener {
+    ctor public FragmentTabHost(android.content.Context);
+    ctor public FragmentTabHost(android.content.Context, android.util.AttributeSet);
+    method public void addTab(android.widget.TabHost.TabSpec, java.lang.Class<?>, android.os.Bundle);
+    method public void onTabChanged(java.lang.String);
+    method public void setup(android.content.Context, android.app.FragmentManager);
+    method public void setup(android.content.Context, android.app.FragmentManager, int);
+  }
+
+}
+
+package android.support.v13.view {
+
+  public final class DragAndDropPermissionsCompat {
+    method public void release();
+  }
+
+  public class DragStartHelper {
+    ctor public DragStartHelper(android.view.View, android.support.v13.view.DragStartHelper.OnDragStartListener);
+    method public void attach();
+    method public void detach();
+    method public void getTouchPosition(android.graphics.Point);
+    method public boolean onLongClick(android.view.View);
+    method public boolean onTouch(android.view.View, android.view.MotionEvent);
+  }
+
+  public static abstract interface DragStartHelper.OnDragStartListener {
+    method public abstract boolean onDragStart(android.view.View, android.support.v13.view.DragStartHelper);
+  }
+
+  public class ViewCompat extends android.support.v4.view.ViewCompat {
+    method public static void cancelDragAndDrop(android.view.View);
+    method public static boolean startDragAndDrop(android.view.View, android.content.ClipData, android.view.View.DragShadowBuilder, java.lang.Object, int);
+    method public static void updateDragShadow(android.view.View, android.view.View.DragShadowBuilder);
+  }
+
+}
+
+package android.support.v14.preference {
+
+  public class EditTextPreferenceDialogFragment extends android.support.v14.preference.PreferenceDialogFragment {
+    ctor public EditTextPreferenceDialogFragment();
+    method public static android.support.v14.preference.EditTextPreferenceDialogFragment newInstance(java.lang.String);
+    method public void onDialogClosed(boolean);
+  }
+
+  public class ListPreferenceDialogFragment extends android.support.v14.preference.PreferenceDialogFragment {
+    ctor public ListPreferenceDialogFragment();
+    method public static android.support.v14.preference.ListPreferenceDialogFragment newInstance(java.lang.String);
+    method public void onDialogClosed(boolean);
+  }
+
+  public class MultiSelectListPreference extends android.support.v7.preference.DialogPreference {
+    ctor public MultiSelectListPreference(android.content.Context, android.util.AttributeSet, int, int);
+    ctor public MultiSelectListPreference(android.content.Context, android.util.AttributeSet, int);
+    ctor public MultiSelectListPreference(android.content.Context, android.util.AttributeSet);
+    ctor public MultiSelectListPreference(android.content.Context);
+    method public int findIndexOfValue(java.lang.String);
+    method public java.lang.CharSequence[] getEntries();
+    method public java.lang.CharSequence[] getEntryValues();
+    method protected boolean[] getSelectedItems();
+    method public java.util.Set<java.lang.String> getValues();
+    method public void setEntries(java.lang.CharSequence[]);
+    method public void setEntries(int);
+    method public void setEntryValues(java.lang.CharSequence[]);
+    method public void setEntryValues(int);
+    method public void setValues(java.util.Set<java.lang.String>);
+  }
+
+  public class MultiSelectListPreferenceDialogFragment extends android.support.v14.preference.PreferenceDialogFragment {
+    ctor public MultiSelectListPreferenceDialogFragment();
+    method public static android.support.v14.preference.MultiSelectListPreferenceDialogFragment newInstance(java.lang.String);
+    method public void onDialogClosed(boolean);
+  }
+
+  public abstract class PreferenceDialogFragment extends android.app.DialogFragment implements android.content.DialogInterface.OnClickListener {
+    ctor public PreferenceDialogFragment();
+    method public android.support.v7.preference.DialogPreference getPreference();
+    method protected void onBindDialogView(android.view.View);
+    method public void onClick(android.content.DialogInterface, int);
+    method protected android.view.View onCreateDialogView(android.content.Context);
+    method public abstract void onDialogClosed(boolean);
+    method protected void onPrepareDialogBuilder(android.app.AlertDialog.Builder);
+    field protected static final java.lang.String ARG_KEY = "key";
+  }
+
+  public abstract class PreferenceFragment extends android.app.Fragment implements android.support.v7.preference.DialogPreference.TargetFragment android.support.v7.preference.PreferenceManager.OnDisplayPreferenceDialogListener android.support.v7.preference.PreferenceManager.OnNavigateToScreenListener android.support.v7.preference.PreferenceManager.OnPreferenceTreeClickListener {
+    ctor public PreferenceFragment();
+    method public void addPreferencesFromResource(int);
+    method public android.support.v7.preference.Preference findPreference(java.lang.CharSequence);
+    method public final android.support.v7.widget.RecyclerView getListView();
+    method public android.support.v7.preference.PreferenceManager getPreferenceManager();
+    method public android.support.v7.preference.PreferenceScreen getPreferenceScreen();
+    method protected android.support.v7.widget.RecyclerView.Adapter onCreateAdapter(android.support.v7.preference.PreferenceScreen);
+    method public android.support.v7.widget.RecyclerView.LayoutManager onCreateLayoutManager();
+    method public abstract void onCreatePreferences(android.os.Bundle, java.lang.String);
+    method public android.support.v7.widget.RecyclerView onCreateRecyclerView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
+    method public void onDisplayPreferenceDialog(android.support.v7.preference.Preference);
+    method public void onNavigateToScreen(android.support.v7.preference.PreferenceScreen);
+    method public boolean onPreferenceTreeClick(android.support.v7.preference.Preference);
+    method public void scrollToPreference(java.lang.String);
+    method public void scrollToPreference(android.support.v7.preference.Preference);
+    method public void setDivider(android.graphics.drawable.Drawable);
+    method public void setDividerHeight(int);
+    method public void setPreferenceScreen(android.support.v7.preference.PreferenceScreen);
+    method public void setPreferencesFromResource(int, java.lang.String);
+    field public static final java.lang.String ARG_PREFERENCE_ROOT = "android.support.v7.preference.PreferenceFragmentCompat.PREFERENCE_ROOT";
+  }
+
+  public static abstract interface PreferenceFragment.OnPreferenceDisplayDialogCallback {
+    method public abstract boolean onPreferenceDisplayDialog(android.support.v14.preference.PreferenceFragment, android.support.v7.preference.Preference);
+  }
+
+  public static abstract interface PreferenceFragment.OnPreferenceStartFragmentCallback {
+    method public abstract boolean onPreferenceStartFragment(android.support.v14.preference.PreferenceFragment, android.support.v7.preference.Preference);
+  }
+
+  public static abstract interface PreferenceFragment.OnPreferenceStartScreenCallback {
+    method public abstract boolean onPreferenceStartScreen(android.support.v14.preference.PreferenceFragment, android.support.v7.preference.PreferenceScreen);
+  }
+
+  public class SwitchPreference extends android.support.v7.preference.TwoStatePreference {
+    ctor public SwitchPreference(android.content.Context, android.util.AttributeSet, int, int);
+    ctor public SwitchPreference(android.content.Context, android.util.AttributeSet, int);
+    ctor public SwitchPreference(android.content.Context, android.util.AttributeSet);
+    ctor public SwitchPreference(android.content.Context);
+    method public java.lang.CharSequence getSwitchTextOff();
+    method public java.lang.CharSequence getSwitchTextOn();
+    method public void setSwitchTextOff(java.lang.CharSequence);
+    method public void setSwitchTextOff(int);
+    method public void setSwitchTextOn(java.lang.CharSequence);
+    method public void setSwitchTextOn(int);
+  }
+
+}
+
+package android.support.v17.leanback.app {
+
+  public final class BackgroundManager {
+    method public void attach(android.view.Window);
+    method public final int getColor();
+    method public android.graphics.drawable.Drawable getDefaultDimLayer();
+    method public android.graphics.drawable.Drawable getDimLayer();
+    method public android.graphics.drawable.Drawable getDrawable();
+    method public static android.support.v17.leanback.app.BackgroundManager getInstance(android.app.Activity);
+    method public boolean isAttached();
+    method public void release();
+    method public void setBitmap(android.graphics.Bitmap);
+    method public void setColor(int);
+    method public void setDimLayer(android.graphics.drawable.Drawable);
+    method public void setDrawable(android.graphics.drawable.Drawable);
+    method public void setThemeDrawableResourceId(int);
+  }
+
+   abstract class BaseRowFragment extends android.app.Fragment {
+    method public final android.support.v17.leanback.widget.ObjectAdapter getAdapter();
+    method public final android.support.v17.leanback.widget.PresenterSelector getPresenterSelector();
+    method public int getSelectedPosition();
+    method public void onTransitionEnd();
+    method public boolean onTransitionPrepare();
+    method public void onTransitionStart();
+    method public final void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
+    method public void setAlignment(int);
+    method public final void setPresenterSelector(android.support.v17.leanback.widget.PresenterSelector);
+    method public void setSelectedPosition(int);
+    method public void setSelectedPosition(int, boolean);
+  }
+
+   abstract class BaseRowSupportFragment extends android.support.v4.app.Fragment {
+    method public final android.support.v17.leanback.widget.ObjectAdapter getAdapter();
+    method public final android.support.v17.leanback.widget.PresenterSelector getPresenterSelector();
+    method public int getSelectedPosition();
+    method public void onTransitionEnd();
+    method public boolean onTransitionPrepare();
+    method public void onTransitionStart();
+    method public final void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
+    method public void setAlignment(int);
+    method public final void setPresenterSelector(android.support.v17.leanback.widget.PresenterSelector);
+    method public void setSelectedPosition(int);
+    method public void setSelectedPosition(int, boolean);
+  }
+
+  public class BrandedFragment extends android.app.Fragment {
+    ctor public BrandedFragment();
+    method public android.graphics.drawable.Drawable getBadgeDrawable();
+    method public int getSearchAffordanceColor();
+    method public android.support.v17.leanback.widget.SearchOrbView.Colors getSearchAffordanceColors();
+    method public java.lang.CharSequence getTitle();
+    method public android.view.View getTitleView();
+    method public android.support.v17.leanback.widget.TitleViewAdapter getTitleViewAdapter();
+    method public void installTitleView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
+    method public final boolean isShowingTitle();
+    method public android.view.View onInflateTitleView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
+    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
+    method public void setOnSearchClickedListener(android.view.View.OnClickListener);
+    method public void setSearchAffordanceColor(int);
+    method public void setSearchAffordanceColors(android.support.v17.leanback.widget.SearchOrbView.Colors);
+    method public void setTitle(java.lang.CharSequence);
+    method public void setTitleView(android.view.View);
+    method public void showTitle(boolean);
+    method public void showTitle(int);
+  }
+
+  public class BrandedSupportFragment extends android.support.v4.app.Fragment {
+    ctor public BrandedSupportFragment();
+    method public android.graphics.drawable.Drawable getBadgeDrawable();
+    method public int getSearchAffordanceColor();
+    method public android.support.v17.leanback.widget.SearchOrbView.Colors getSearchAffordanceColors();
+    method public java.lang.CharSequence getTitle();
+    method public android.view.View getTitleView();
+    method public android.support.v17.leanback.widget.TitleViewAdapter getTitleViewAdapter();
+    method public void installTitleView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
+    method public final boolean isShowingTitle();
+    method public android.view.View onInflateTitleView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
+    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
+    method public void setOnSearchClickedListener(android.view.View.OnClickListener);
+    method public void setSearchAffordanceColor(int);
+    method public void setSearchAffordanceColors(android.support.v17.leanback.widget.SearchOrbView.Colors);
+    method public void setTitle(java.lang.CharSequence);
+    method public void setTitleView(android.view.View);
+    method public void showTitle(boolean);
+    method public void showTitle(int);
+  }
+
+  public class BrowseFragment extends android.support.v17.leanback.app.BrandedFragment {
+    ctor public BrowseFragment();
+    method public static android.os.Bundle createArgs(android.os.Bundle, java.lang.String, int);
+    method protected java.lang.Object createEntranceTransition();
+    method public void enableMainFragmentScaling(boolean);
+    method public deprecated void enableRowScaling(boolean);
+    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
+    method public int getBrandColor();
+    method public android.support.v17.leanback.app.HeadersFragment getHeadersFragment();
+    method public int getHeadersState();
+    method public final android.support.v17.leanback.app.BrowseFragment.MainFragmentAdapterRegistry getMainFragmentRegistry();
+    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
+    method public android.support.v17.leanback.widget.OnItemViewSelectedListener getOnItemViewSelectedListener();
+    method public android.support.v17.leanback.app.RowsFragment getRowsFragment();
+    method public int getSelectedPosition();
+    method public final boolean isHeadersTransitionOnBackEnabled();
+    method public boolean isInHeadersTransition();
+    method public boolean isShowingHeaders();
+    method protected void onEntranceTransitionEnd();
+    method protected void onEntranceTransitionPrepare();
+    method protected void onEntranceTransitionStart();
+    method protected void runEntranceTransition(java.lang.Object);
+    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
+    method public void setBrandColor(int);
+    method public void setBrowseTransitionListener(android.support.v17.leanback.app.BrowseFragment.BrowseTransitionListener);
+    method public void setHeaderPresenterSelector(android.support.v17.leanback.widget.PresenterSelector);
+    method public void setHeadersState(int);
+    method public final void setHeadersTransitionOnBackEnabled(boolean);
+    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
+    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
+    method public void setSelectedPosition(int);
+    method public void setSelectedPosition(int, boolean);
+    method public void setSelectedPosition(int, boolean, android.support.v17.leanback.widget.Presenter.ViewHolderTask);
+    method public void startHeadersTransition(boolean);
+    field public static final int HEADERS_DISABLED = 3; // 0x3
+    field public static final int HEADERS_ENABLED = 1; // 0x1
+    field public static final int HEADERS_HIDDEN = 2; // 0x2
+  }
+
+  public static class BrowseFragment.BrowseTransitionListener {
+    ctor public BrowseFragment.BrowseTransitionListener();
+    method public void onHeadersTransitionStart(boolean);
+    method public void onHeadersTransitionStop(boolean);
+  }
+
+  public static abstract class BrowseFragment.FragmentFactory {
+    ctor public BrowseFragment.FragmentFactory();
+    method public abstract T createFragment(java.lang.Object);
+  }
+
+  public static abstract interface BrowseFragment.FragmentHost {
+    method public abstract void notifyDataReady(android.support.v17.leanback.app.BrowseFragment.MainFragmentAdapter);
+    method public abstract void notifyViewCreated(android.support.v17.leanback.app.BrowseFragment.MainFragmentAdapter);
+    method public abstract void showTitleView(boolean);
+  }
+
+  public static class BrowseFragment.ListRowFragmentFactory extends android.support.v17.leanback.app.BrowseFragment.FragmentFactory {
+    ctor public BrowseFragment.ListRowFragmentFactory();
+    method public android.support.v17.leanback.app.RowsFragment createFragment(java.lang.Object);
+  }
+
+  public static class BrowseFragment.MainFragmentAdapter {
+    ctor public BrowseFragment.MainFragmentAdapter(T);
+    method public final T getFragment();
+    method public final android.support.v17.leanback.app.BrowseFragment.FragmentHost getFragmentHost();
+    method public boolean isScalingEnabled();
+    method public boolean isScrolling();
+    method public void onTransitionEnd();
+    method public boolean onTransitionPrepare();
+    method public void onTransitionStart();
+    method public void setAlignment(int);
+    method public void setEntranceTransitionState(boolean);
+    method public void setExpand(boolean);
+    method public void setScalingEnabled(boolean);
+  }
+
+  public static abstract interface BrowseFragment.MainFragmentAdapterProvider {
+    method public abstract android.support.v17.leanback.app.BrowseFragment.MainFragmentAdapter getMainFragmentAdapter();
+  }
+
+  public static final class BrowseFragment.MainFragmentAdapterRegistry {
+    ctor public BrowseFragment.MainFragmentAdapterRegistry();
+    method public android.app.Fragment createFragment(java.lang.Object);
+    method public void registerFragment(java.lang.Class, android.support.v17.leanback.app.BrowseFragment.FragmentFactory);
+  }
+
+  public static class BrowseFragment.MainFragmentRowsAdapter {
+    ctor public BrowseFragment.MainFragmentRowsAdapter(T);
+    method public final T getFragment();
+    method public int getSelectedPosition();
+    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
+    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
+    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
+    method public void setSelectedPosition(int, boolean, android.support.v17.leanback.widget.Presenter.ViewHolderTask);
+    method public void setSelectedPosition(int, boolean);
+  }
+
+  public static abstract interface BrowseFragment.MainFragmentRowsAdapterProvider {
+    method public abstract android.support.v17.leanback.app.BrowseFragment.MainFragmentRowsAdapter getMainFragmentRowsAdapter();
+  }
+
+  public class BrowseSupportFragment extends android.support.v17.leanback.app.BrandedSupportFragment {
+    ctor public BrowseSupportFragment();
+    method public static android.os.Bundle createArgs(android.os.Bundle, java.lang.String, int);
+    method protected java.lang.Object createEntranceTransition();
+    method public void enableMainFragmentScaling(boolean);
+    method public deprecated void enableRowScaling(boolean);
+    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
+    method public int getBrandColor();
+    method public int getHeadersState();
+    method public android.support.v17.leanback.app.HeadersSupportFragment getHeadersSupportFragment();
+    method public final android.support.v17.leanback.app.BrowseSupportFragment.MainFragmentAdapterRegistry getMainFragmentRegistry();
+    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
+    method public android.support.v17.leanback.widget.OnItemViewSelectedListener getOnItemViewSelectedListener();
+    method public android.support.v17.leanback.app.RowsSupportFragment getRowsSupportFragment();
+    method public int getSelectedPosition();
+    method public final boolean isHeadersTransitionOnBackEnabled();
+    method public boolean isInHeadersTransition();
+    method public boolean isShowingHeaders();
+    method protected void onEntranceTransitionEnd();
+    method protected void onEntranceTransitionPrepare();
+    method protected void onEntranceTransitionStart();
+    method protected void runEntranceTransition(java.lang.Object);
+    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
+    method public void setBrandColor(int);
+    method public void setBrowseTransitionListener(android.support.v17.leanback.app.BrowseSupportFragment.BrowseTransitionListener);
+    method public void setHeaderPresenterSelector(android.support.v17.leanback.widget.PresenterSelector);
+    method public void setHeadersState(int);
+    method public final void setHeadersTransitionOnBackEnabled(boolean);
+    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
+    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
+    method public void setSelectedPosition(int);
+    method public void setSelectedPosition(int, boolean);
+    method public void setSelectedPosition(int, boolean, android.support.v17.leanback.widget.Presenter.ViewHolderTask);
+    method public void startHeadersTransition(boolean);
+    field public static final int HEADERS_DISABLED = 3; // 0x3
+    field public static final int HEADERS_ENABLED = 1; // 0x1
+    field public static final int HEADERS_HIDDEN = 2; // 0x2
+  }
+
+  public static class BrowseSupportFragment.BrowseTransitionListener {
+    ctor public BrowseSupportFragment.BrowseTransitionListener();
+    method public void onHeadersTransitionStart(boolean);
+    method public void onHeadersTransitionStop(boolean);
+  }
+
+  public static abstract class BrowseSupportFragment.FragmentFactory {
+    ctor public BrowseSupportFragment.FragmentFactory();
+    method public abstract T createFragment(java.lang.Object);
+  }
+
+  public static abstract interface BrowseSupportFragment.FragmentHost {
+    method public abstract void notifyDataReady(android.support.v17.leanback.app.BrowseSupportFragment.MainFragmentAdapter);
+    method public abstract void notifyViewCreated(android.support.v17.leanback.app.BrowseSupportFragment.MainFragmentAdapter);
+    method public abstract void showTitleView(boolean);
+  }
+
+  public static class BrowseSupportFragment.ListRowFragmentFactory extends android.support.v17.leanback.app.BrowseSupportFragment.FragmentFactory {
+    ctor public BrowseSupportFragment.ListRowFragmentFactory();
+    method public android.support.v17.leanback.app.RowsSupportFragment createFragment(java.lang.Object);
+  }
+
+  public static class BrowseSupportFragment.MainFragmentAdapter {
+    ctor public BrowseSupportFragment.MainFragmentAdapter(T);
+    method public final T getFragment();
+    method public final android.support.v17.leanback.app.BrowseSupportFragment.FragmentHost getFragmentHost();
+    method public boolean isScalingEnabled();
+    method public boolean isScrolling();
+    method public void onTransitionEnd();
+    method public boolean onTransitionPrepare();
+    method public void onTransitionStart();
+    method public void setAlignment(int);
+    method public void setEntranceTransitionState(boolean);
+    method public void setExpand(boolean);
+    method public void setScalingEnabled(boolean);
+  }
+
+  public static abstract interface BrowseSupportFragment.MainFragmentAdapterProvider {
+    method public abstract android.support.v17.leanback.app.BrowseSupportFragment.MainFragmentAdapter getMainFragmentAdapter();
+  }
+
+  public static final class BrowseSupportFragment.MainFragmentAdapterRegistry {
+    ctor public BrowseSupportFragment.MainFragmentAdapterRegistry();
+    method public android.support.v4.app.Fragment createFragment(java.lang.Object);
+    method public void registerFragment(java.lang.Class, android.support.v17.leanback.app.BrowseSupportFragment.FragmentFactory);
+  }
+
+  public static class BrowseSupportFragment.MainFragmentRowsAdapter {
+    ctor public BrowseSupportFragment.MainFragmentRowsAdapter(T);
+    method public final T getFragment();
+    method public int getSelectedPosition();
+    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
+    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
+    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
+    method public void setSelectedPosition(int, boolean, android.support.v17.leanback.widget.Presenter.ViewHolderTask);
+    method public void setSelectedPosition(int, boolean);
+  }
+
+  public static abstract interface BrowseSupportFragment.MainFragmentRowsAdapterProvider {
+    method public abstract android.support.v17.leanback.app.BrowseSupportFragment.MainFragmentRowsAdapter getMainFragmentRowsAdapter();
+  }
+
+  public class DetailsFragment extends android.support.v17.leanback.app.BrandedFragment {
+    ctor public DetailsFragment();
+    method protected java.lang.Object createEntranceTransition();
+    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
+    method public android.support.v17.leanback.widget.BaseOnItemViewClickedListener getOnItemViewClickedListener();
+    method public android.support.v17.leanback.app.RowsFragment getRowsFragment();
+    method protected deprecated android.view.View inflateTitle(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
+    method protected void onEntranceTransitionEnd();
+    method protected void onEntranceTransitionPrepare();
+    method protected void onEntranceTransitionStart();
+    method protected void onSetDetailsOverviewRowStatus(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter, android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder, int, int, int);
+    method protected void onSetRowStatus(android.support.v17.leanback.widget.RowPresenter, android.support.v17.leanback.widget.RowPresenter.ViewHolder, int, int, int);
+    method protected void runEntranceTransition(java.lang.Object);
+    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
+    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.BaseOnItemViewClickedListener);
+    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.BaseOnItemViewSelectedListener);
+    method public void setSelectedPosition(int);
+    method public void setSelectedPosition(int, boolean);
+    method protected void setupDetailsOverviewRowPresenter(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter);
+    method protected void setupPresenter(android.support.v17.leanback.widget.Presenter);
+  }
+
+  public class DetailsSupportFragment extends android.support.v17.leanback.app.BrandedSupportFragment {
+    ctor public DetailsSupportFragment();
+    method protected java.lang.Object createEntranceTransition();
+    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
+    method public android.support.v17.leanback.widget.BaseOnItemViewClickedListener getOnItemViewClickedListener();
+    method public android.support.v17.leanback.app.RowsSupportFragment getRowsSupportFragment();
+    method protected deprecated android.view.View inflateTitle(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
+    method protected void onEntranceTransitionEnd();
+    method protected void onEntranceTransitionPrepare();
+    method protected void onEntranceTransitionStart();
+    method protected void onSetDetailsOverviewRowStatus(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter, android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder, int, int, int);
+    method protected void onSetRowStatus(android.support.v17.leanback.widget.RowPresenter, android.support.v17.leanback.widget.RowPresenter.ViewHolder, int, int, int);
+    method protected void runEntranceTransition(java.lang.Object);
+    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
+    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.BaseOnItemViewClickedListener);
+    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.BaseOnItemViewSelectedListener);
+    method public void setSelectedPosition(int);
+    method public void setSelectedPosition(int, boolean);
+    method protected void setupDetailsOverviewRowPresenter(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter);
+    method protected void setupPresenter(android.support.v17.leanback.widget.Presenter);
+  }
+
+  public class ErrorFragment extends android.support.v17.leanback.app.BrandedFragment {
+    ctor public ErrorFragment();
+    method public android.graphics.drawable.Drawable getBackgroundDrawable();
+    method public android.view.View.OnClickListener getButtonClickListener();
+    method public java.lang.String getButtonText();
+    method public android.graphics.drawable.Drawable getImageDrawable();
+    method public java.lang.CharSequence getMessage();
+    method public boolean isBackgroundTranslucent();
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
+    method public void setButtonClickListener(android.view.View.OnClickListener);
+    method public void setButtonText(java.lang.String);
+    method public void setDefaultBackground(boolean);
+    method public void setImageDrawable(android.graphics.drawable.Drawable);
+    method public void setMessage(java.lang.CharSequence);
+  }
+
+  public class ErrorSupportFragment extends android.support.v17.leanback.app.BrandedSupportFragment {
+    ctor public ErrorSupportFragment();
+    method public android.graphics.drawable.Drawable getBackgroundDrawable();
+    method public android.view.View.OnClickListener getButtonClickListener();
+    method public java.lang.String getButtonText();
+    method public android.graphics.drawable.Drawable getImageDrawable();
+    method public java.lang.CharSequence getMessage();
+    method public boolean isBackgroundTranslucent();
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
+    method public void setButtonClickListener(android.view.View.OnClickListener);
+    method public void setButtonText(java.lang.String);
+    method public void setDefaultBackground(boolean);
+    method public void setImageDrawable(android.graphics.drawable.Drawable);
+    method public void setMessage(java.lang.CharSequence);
+  }
+
+  public class GuidedStepFragment extends android.app.Fragment {
+    ctor public GuidedStepFragment();
+    method public static int add(android.app.FragmentManager, android.support.v17.leanback.app.GuidedStepFragment);
+    method public static int add(android.app.FragmentManager, android.support.v17.leanback.app.GuidedStepFragment, int);
+    method public static int addAsRoot(android.app.Activity, android.support.v17.leanback.app.GuidedStepFragment, int);
+    method public void collapseSubActions();
+    method public void expandSubActions(android.support.v17.leanback.widget.GuidedAction);
+    method public android.support.v17.leanback.widget.GuidedAction findActionById(long);
+    method public int findActionPositionById(long);
+    method public android.support.v17.leanback.widget.GuidedAction findButtonActionById(long);
+    method public int findButtonActionPositionById(long);
+    method public void finishGuidedStepFragments();
+    method public android.view.View getActionItemView(int);
+    method public java.util.List<android.support.v17.leanback.widget.GuidedAction> getActions();
+    method public android.view.View getButtonActionItemView(int);
+    method public java.util.List<android.support.v17.leanback.widget.GuidedAction> getButtonActions();
+    method public static android.support.v17.leanback.app.GuidedStepFragment getCurrentGuidedStepFragment(android.app.FragmentManager);
+    method public android.support.v17.leanback.widget.GuidanceStylist getGuidanceStylist();
+    method public android.support.v17.leanback.widget.GuidedActionsStylist getGuidedActionsStylist();
+    method public android.support.v17.leanback.widget.GuidedActionsStylist getGuidedButtonActionsStylist();
+    method public int getSelectedActionPosition();
+    method public int getSelectedButtonActionPosition();
+    method public int getUiStyle();
+    method public boolean isFocusOutEndAllowed();
+    method public boolean isFocusOutStartAllowed();
+    method public boolean isSubActionsExpanded();
+    method public void notifyActionChanged(int);
+    method public void notifyButtonActionChanged(int);
+    method protected void onAddSharedElementTransition(android.app.FragmentTransaction, android.support.v17.leanback.app.GuidedStepFragment);
+    method public void onCreateActions(java.util.List<android.support.v17.leanback.widget.GuidedAction>, android.os.Bundle);
+    method public android.support.v17.leanback.widget.GuidedActionsStylist onCreateActionsStylist();
+    method public android.view.View onCreateBackgroundView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
+    method public void onCreateButtonActions(java.util.List<android.support.v17.leanback.widget.GuidedAction>, android.os.Bundle);
+    method public android.support.v17.leanback.widget.GuidedActionsStylist onCreateButtonActionsStylist();
+    method public android.support.v17.leanback.widget.GuidanceStylist.Guidance onCreateGuidance(android.os.Bundle);
+    method public android.support.v17.leanback.widget.GuidanceStylist onCreateGuidanceStylist();
+    method public void onGuidedActionClicked(android.support.v17.leanback.widget.GuidedAction);
+    method public void onGuidedActionEditCanceled(android.support.v17.leanback.widget.GuidedAction);
+    method public deprecated void onGuidedActionEdited(android.support.v17.leanback.widget.GuidedAction);
+    method public long onGuidedActionEditedAndProceed(android.support.v17.leanback.widget.GuidedAction);
+    method public void onGuidedActionFocused(android.support.v17.leanback.widget.GuidedAction);
+    method protected void onProvideFragmentTransitions();
+    method public int onProvideTheme();
+    method public boolean onSubGuidedActionClicked(android.support.v17.leanback.widget.GuidedAction);
+    method public void popBackStackToGuidedStepFragment(java.lang.Class, int);
+    method public void setActions(java.util.List<android.support.v17.leanback.widget.GuidedAction>);
+    method public void setButtonActions(java.util.List<android.support.v17.leanback.widget.GuidedAction>);
+    method public void setSelectedActionPosition(int);
+    method public void setSelectedButtonActionPosition(int);
+    method public void setUiStyle(int);
+    field public static final java.lang.String EXTRA_UI_STYLE = "uiStyle";
+    field public static final int UI_STYLE_ACTIVITY_ROOT = 2; // 0x2
+    field public static final deprecated int UI_STYLE_DEFAULT = 0; // 0x0
+    field public static final int UI_STYLE_ENTRANCE = 1; // 0x1
+    field public static final int UI_STYLE_REPLACE = 0; // 0x0
+  }
+
+  public class GuidedStepSupportFragment extends android.support.v4.app.Fragment {
+    ctor public GuidedStepSupportFragment();
+    method public static int add(android.support.v4.app.FragmentManager, android.support.v17.leanback.app.GuidedStepSupportFragment);
+    method public static int add(android.support.v4.app.FragmentManager, android.support.v17.leanback.app.GuidedStepSupportFragment, int);
+    method public static int addAsRoot(android.support.v4.app.FragmentActivity, android.support.v17.leanback.app.GuidedStepSupportFragment, int);
+    method public void collapseSubActions();
+    method public void expandSubActions(android.support.v17.leanback.widget.GuidedAction);
+    method public android.support.v17.leanback.widget.GuidedAction findActionById(long);
+    method public int findActionPositionById(long);
+    method public android.support.v17.leanback.widget.GuidedAction findButtonActionById(long);
+    method public int findButtonActionPositionById(long);
+    method public void finishGuidedStepSupportFragments();
+    method public android.view.View getActionItemView(int);
+    method public java.util.List<android.support.v17.leanback.widget.GuidedAction> getActions();
+    method public android.view.View getButtonActionItemView(int);
+    method public java.util.List<android.support.v17.leanback.widget.GuidedAction> getButtonActions();
+    method public static android.support.v17.leanback.app.GuidedStepSupportFragment getCurrentGuidedStepSupportFragment(android.support.v4.app.FragmentManager);
+    method public android.support.v17.leanback.widget.GuidanceStylist getGuidanceStylist();
+    method public android.support.v17.leanback.widget.GuidedActionsStylist getGuidedActionsStylist();
+    method public android.support.v17.leanback.widget.GuidedActionsStylist getGuidedButtonActionsStylist();
+    method public int getSelectedActionPosition();
+    method public int getSelectedButtonActionPosition();
+    method public int getUiStyle();
+    method public boolean isFocusOutEndAllowed();
+    method public boolean isFocusOutStartAllowed();
+    method public boolean isSubActionsExpanded();
+    method public void notifyActionChanged(int);
+    method public void notifyButtonActionChanged(int);
+    method protected void onAddSharedElementTransition(android.support.v4.app.FragmentTransaction, android.support.v17.leanback.app.GuidedStepSupportFragment);
+    method public void onCreateActions(java.util.List<android.support.v17.leanback.widget.GuidedAction>, android.os.Bundle);
+    method public android.support.v17.leanback.widget.GuidedActionsStylist onCreateActionsStylist();
+    method public android.view.View onCreateBackgroundView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
+    method public void onCreateButtonActions(java.util.List<android.support.v17.leanback.widget.GuidedAction>, android.os.Bundle);
+    method public android.support.v17.leanback.widget.GuidedActionsStylist onCreateButtonActionsStylist();
+    method public android.support.v17.leanback.widget.GuidanceStylist.Guidance onCreateGuidance(android.os.Bundle);
+    method public android.support.v17.leanback.widget.GuidanceStylist onCreateGuidanceStylist();
+    method public void onGuidedActionClicked(android.support.v17.leanback.widget.GuidedAction);
+    method public void onGuidedActionEditCanceled(android.support.v17.leanback.widget.GuidedAction);
+    method public deprecated void onGuidedActionEdited(android.support.v17.leanback.widget.GuidedAction);
+    method public long onGuidedActionEditedAndProceed(android.support.v17.leanback.widget.GuidedAction);
+    method public void onGuidedActionFocused(android.support.v17.leanback.widget.GuidedAction);
+    method protected void onProvideFragmentTransitions();
+    method public int onProvideTheme();
+    method public boolean onSubGuidedActionClicked(android.support.v17.leanback.widget.GuidedAction);
+    method public void popBackStackToGuidedStepSupportFragment(java.lang.Class, int);
+    method public void setActions(java.util.List<android.support.v17.leanback.widget.GuidedAction>);
+    method public void setButtonActions(java.util.List<android.support.v17.leanback.widget.GuidedAction>);
+    method public void setSelectedActionPosition(int);
+    method public void setSelectedButtonActionPosition(int);
+    method public void setUiStyle(int);
+    field public static final java.lang.String EXTRA_UI_STYLE = "uiStyle";
+    field public static final int UI_STYLE_ACTIVITY_ROOT = 2; // 0x2
+    field public static final deprecated int UI_STYLE_DEFAULT = 0; // 0x0
+    field public static final int UI_STYLE_ENTRANCE = 1; // 0x1
+    field public static final int UI_STYLE_REPLACE = 0; // 0x0
+  }
+
+  public class HeadersFragment extends android.support.v17.leanback.app.BaseRowFragment {
+    ctor public HeadersFragment();
+    method public boolean isScrolling();
+    method public void setOnHeaderClickedListener(android.support.v17.leanback.app.HeadersFragment.OnHeaderClickedListener);
+    method public void setOnHeaderViewSelectedListener(android.support.v17.leanback.app.HeadersFragment.OnHeaderViewSelectedListener);
+  }
+
+  public static abstract interface HeadersFragment.OnHeaderClickedListener {
+    method public abstract void onHeaderClicked(android.support.v17.leanback.widget.RowHeaderPresenter.ViewHolder, android.support.v17.leanback.widget.Row);
+  }
+
+  public static abstract interface HeadersFragment.OnHeaderViewSelectedListener {
+    method public abstract void onHeaderSelected(android.support.v17.leanback.widget.RowHeaderPresenter.ViewHolder, android.support.v17.leanback.widget.Row);
+  }
+
+  public class HeadersSupportFragment extends android.support.v17.leanback.app.BaseRowSupportFragment {
+    ctor public HeadersSupportFragment();
+    method public boolean isScrolling();
+    method public void setOnHeaderClickedListener(android.support.v17.leanback.app.HeadersSupportFragment.OnHeaderClickedListener);
+    method public void setOnHeaderViewSelectedListener(android.support.v17.leanback.app.HeadersSupportFragment.OnHeaderViewSelectedListener);
+  }
+
+  public static abstract interface HeadersSupportFragment.OnHeaderClickedListener {
+    method public abstract void onHeaderClicked(android.support.v17.leanback.widget.RowHeaderPresenter.ViewHolder, android.support.v17.leanback.widget.Row);
+  }
+
+  public static abstract interface HeadersSupportFragment.OnHeaderViewSelectedListener {
+    method public abstract void onHeaderSelected(android.support.v17.leanback.widget.RowHeaderPresenter.ViewHolder, android.support.v17.leanback.widget.Row);
+  }
+
+  public abstract class MediaControllerGlue extends android.support.v17.leanback.app.PlaybackControlGlue {
+    ctor public MediaControllerGlue(android.content.Context, android.support.v17.leanback.app.PlaybackOverlayFragment, int[]);
+    ctor public MediaControllerGlue(android.content.Context, android.support.v17.leanback.app.PlaybackOverlayFragment, int[], int[]);
+    method public void attachToMediaController(android.support.v4.media.session.MediaControllerCompat);
+    method public void detach();
+    method public int getCurrentPosition();
+    method public int getCurrentSpeedId();
+    method public android.graphics.drawable.Drawable getMediaArt();
+    method public final android.support.v4.media.session.MediaControllerCompat getMediaController();
+    method public int getMediaDuration();
+    method public java.lang.CharSequence getMediaSubtitle();
+    method public java.lang.CharSequence getMediaTitle();
+    method public long getSupportedActions();
+    method public boolean hasValidMedia();
+    method public boolean isMediaPlaying();
+    method protected void pausePlayback();
+    method protected void skipToNext();
+    method protected void skipToPrevious();
+    method protected void startPlayback(int);
+  }
+
+  public abstract class OnboardingFragment extends android.app.Fragment {
+    ctor public OnboardingFragment();
+    method protected final int getCurrentPageIndex();
+    method public final int getLogoResourceId();
+    method protected abstract int getPageCount();
+    method protected abstract java.lang.CharSequence getPageDescription(int);
+    method protected abstract java.lang.CharSequence getPageTitle(int);
+    method protected abstract android.view.View onCreateBackgroundView(android.view.LayoutInflater, android.view.ViewGroup);
+    method protected abstract android.view.View onCreateContentView(android.view.LayoutInflater, android.view.ViewGroup);
+    method protected android.animation.Animator onCreateEnterAnimation();
+    method protected abstract android.view.View onCreateForegroundView(android.view.LayoutInflater, android.view.ViewGroup);
+    method protected android.animation.Animator onCreateLogoAnimation();
+    method protected void onFinishFragment();
+    method protected void onPageChanged(int, int);
+    method public int onProvideTheme();
+    method public final void setLogoResourceId(int);
+  }
+
+  public abstract class OnboardingSupportFragment extends android.support.v4.app.Fragment {
+    ctor public OnboardingSupportFragment();
+    method protected final int getCurrentPageIndex();
+    method public final int getLogoResourceId();
+    method protected abstract int getPageCount();
+    method protected abstract java.lang.CharSequence getPageDescription(int);
+    method protected abstract java.lang.CharSequence getPageTitle(int);
+    method protected abstract android.view.View onCreateBackgroundView(android.view.LayoutInflater, android.view.ViewGroup);
+    method protected abstract android.view.View onCreateContentView(android.view.LayoutInflater, android.view.ViewGroup);
+    method protected android.animation.Animator onCreateEnterAnimation();
+    method protected abstract android.view.View onCreateForegroundView(android.view.LayoutInflater, android.view.ViewGroup);
+    method protected android.animation.Animator onCreateLogoAnimation();
+    method protected void onFinishFragment();
+    method protected void onPageChanged(int, int);
+    method public int onProvideTheme();
+    method public final void setLogoResourceId(int);
+  }
+
+  public abstract class PlaybackControlGlue implements android.support.v17.leanback.widget.OnActionClickedListener android.view.View.OnKeyListener {
+    ctor public PlaybackControlGlue(android.content.Context, int[]);
+    ctor public PlaybackControlGlue(android.content.Context, int[], int[]);
+    ctor public PlaybackControlGlue(android.content.Context, android.support.v17.leanback.app.PlaybackOverlayFragment, int[]);
+    ctor public PlaybackControlGlue(android.content.Context, android.support.v17.leanback.app.PlaybackOverlayFragment, int[], int[]);
+    method public android.support.v17.leanback.widget.PlaybackControlsRowPresenter createControlsRowAndPresenter();
+    method protected android.support.v17.leanback.widget.SparseArrayObjectAdapter createPrimaryActionsAdapter(android.support.v17.leanback.widget.PresenterSelector);
+    method public void enableProgressUpdating(boolean);
+    method public android.content.Context getContext();
+    method public android.support.v17.leanback.widget.PlaybackControlsRow getControlsRow();
+    method public abstract int getCurrentPosition();
+    method public abstract int getCurrentSpeedId();
+    method public int[] getFastForwardSpeeds();
+    method public android.support.v17.leanback.app.PlaybackOverlayFragment getFragment();
+    method public abstract android.graphics.drawable.Drawable getMediaArt();
+    method public abstract int getMediaDuration();
+    method public abstract java.lang.CharSequence getMediaSubtitle();
+    method public abstract java.lang.CharSequence getMediaTitle();
+    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
+    method public int[] getRewindSpeeds();
+    method public abstract long getSupportedActions();
+    method public int getUpdatePeriod();
+    method public abstract boolean hasValidMedia();
+    method public boolean isFadingEnabled();
+    method public abstract boolean isMediaPlaying();
+    method public void onActionClicked(android.support.v17.leanback.widget.Action);
+    method public boolean onKey(android.view.View, int, android.view.KeyEvent);
+    method protected void onMetadataChanged();
+    method protected abstract void onRowChanged(android.support.v17.leanback.widget.PlaybackControlsRow);
+    method protected void onStateChanged();
+    method protected abstract void pausePlayback();
+    method public void setControlsRow(android.support.v17.leanback.widget.PlaybackControlsRow);
+    method public void setFadingEnabled(boolean);
+    method public deprecated void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
+    method protected abstract void skipToNext();
+    method protected abstract void skipToPrevious();
+    method protected abstract void startPlayback(int);
+    method public void updateProgress();
+    field public static final int ACTION_CUSTOM_LEFT_FIRST = 1; // 0x1
+    field public static final int ACTION_CUSTOM_RIGHT_FIRST = 4096; // 0x1000
+    field public static final int ACTION_FAST_FORWARD = 128; // 0x80
+    field public static final int ACTION_PLAY_PAUSE = 64; // 0x40
+    field public static final int ACTION_REWIND = 32; // 0x20
+    field public static final int ACTION_SKIP_TO_NEXT = 256; // 0x100
+    field public static final int ACTION_SKIP_TO_PREVIOUS = 16; // 0x10
+    field public static final int PLAYBACK_SPEED_FAST_L0 = 10; // 0xa
+    field public static final int PLAYBACK_SPEED_FAST_L1 = 11; // 0xb
+    field public static final int PLAYBACK_SPEED_FAST_L2 = 12; // 0xc
+    field public static final int PLAYBACK_SPEED_FAST_L3 = 13; // 0xd
+    field public static final int PLAYBACK_SPEED_FAST_L4 = 14; // 0xe
+    field public static final int PLAYBACK_SPEED_INVALID = -1; // 0xffffffff
+    field public static final int PLAYBACK_SPEED_NORMAL = 1; // 0x1
+    field public static final int PLAYBACK_SPEED_PAUSED = 0; // 0x0
+  }
+
+  public abstract class PlaybackControlSupportGlue implements android.support.v17.leanback.widget.OnActionClickedListener android.view.View.OnKeyListener {
+    ctor public PlaybackControlSupportGlue(android.content.Context, int[]);
+    ctor public PlaybackControlSupportGlue(android.content.Context, int[], int[]);
+    ctor public PlaybackControlSupportGlue(android.content.Context, android.support.v17.leanback.app.PlaybackOverlaySupportFragment, int[]);
+    ctor public PlaybackControlSupportGlue(android.content.Context, android.support.v17.leanback.app.PlaybackOverlaySupportFragment, int[], int[]);
+    method public android.support.v17.leanback.widget.PlaybackControlsRowPresenter createControlsRowAndPresenter();
+    method protected android.support.v17.leanback.widget.SparseArrayObjectAdapter createPrimaryActionsAdapter(android.support.v17.leanback.widget.PresenterSelector);
+    method public void enableProgressUpdating(boolean);
+    method public android.content.Context getContext();
+    method public android.support.v17.leanback.widget.PlaybackControlsRow getControlsRow();
+    method public abstract int getCurrentPosition();
+    method public abstract int getCurrentSpeedId();
+    method public int[] getFastForwardSpeeds();
+    method public android.support.v17.leanback.app.PlaybackOverlaySupportFragment getFragment();
+    method public abstract android.graphics.drawable.Drawable getMediaArt();
+    method public abstract int getMediaDuration();
+    method public abstract java.lang.CharSequence getMediaSubtitle();
+    method public abstract java.lang.CharSequence getMediaTitle();
+    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
+    method public int[] getRewindSpeeds();
+    method public abstract long getSupportedActions();
+    method public int getUpdatePeriod();
+    method public abstract boolean hasValidMedia();
+    method public boolean isFadingEnabled();
+    method public abstract boolean isMediaPlaying();
+    method public void onActionClicked(android.support.v17.leanback.widget.Action);
+    method public boolean onKey(android.view.View, int, android.view.KeyEvent);
+    method protected void onMetadataChanged();
+    method protected abstract void onRowChanged(android.support.v17.leanback.widget.PlaybackControlsRow);
+    method protected void onStateChanged();
+    method protected abstract void pausePlayback();
+    method public void setControlsRow(android.support.v17.leanback.widget.PlaybackControlsRow);
+    method public void setFadingEnabled(boolean);
+    method public deprecated void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
+    method protected abstract void skipToNext();
+    method protected abstract void skipToPrevious();
+    method protected abstract void startPlayback(int);
+    method public void updateProgress();
+    field public static final int ACTION_CUSTOM_LEFT_FIRST = 1; // 0x1
+    field public static final int ACTION_CUSTOM_RIGHT_FIRST = 4096; // 0x1000
+    field public static final int ACTION_FAST_FORWARD = 128; // 0x80
+    field public static final int ACTION_PLAY_PAUSE = 64; // 0x40
+    field public static final int ACTION_REWIND = 32; // 0x20
+    field public static final int ACTION_SKIP_TO_NEXT = 256; // 0x100
+    field public static final int ACTION_SKIP_TO_PREVIOUS = 16; // 0x10
+    field public static final int PLAYBACK_SPEED_FAST_L0 = 10; // 0xa
+    field public static final int PLAYBACK_SPEED_FAST_L1 = 11; // 0xb
+    field public static final int PLAYBACK_SPEED_FAST_L2 = 12; // 0xc
+    field public static final int PLAYBACK_SPEED_FAST_L3 = 13; // 0xd
+    field public static final int PLAYBACK_SPEED_FAST_L4 = 14; // 0xe
+    field public static final int PLAYBACK_SPEED_INVALID = -1; // 0xffffffff
+    field public static final int PLAYBACK_SPEED_NORMAL = 1; // 0x1
+    field public static final int PLAYBACK_SPEED_PAUSED = 0; // 0x0
+  }
+
+  public class PlaybackOverlayFragment extends android.support.v17.leanback.app.DetailsFragment {
+    ctor public PlaybackOverlayFragment();
+    method public void fadeOut();
+    method public int getBackgroundType();
+    method public android.support.v17.leanback.app.PlaybackOverlayFragment.OnFadeCompleteListener getFadeCompleteListener();
+    method public final android.support.v17.leanback.app.PlaybackOverlayFragment.InputEventHandler getInputEventHandler();
+    method public boolean isFadingEnabled();
+    method public void setBackgroundType(int);
+    method public void setFadeCompleteListener(android.support.v17.leanback.app.PlaybackOverlayFragment.OnFadeCompleteListener);
+    method public void setFadingEnabled(boolean);
+    method public final void setInputEventHandler(android.support.v17.leanback.app.PlaybackOverlayFragment.InputEventHandler);
+    method public void tickle();
+    field public static final int BG_DARK = 1; // 0x1
+    field public static final int BG_LIGHT = 2; // 0x2
+    field public static final int BG_NONE = 0; // 0x0
+  }
+
+  public static abstract interface PlaybackOverlayFragment.InputEventHandler {
+    method public abstract boolean handleInputEvent(android.view.InputEvent);
+  }
+
+  public static class PlaybackOverlayFragment.OnFadeCompleteListener {
+    ctor public PlaybackOverlayFragment.OnFadeCompleteListener();
+    method public void onFadeInComplete();
+    method public void onFadeOutComplete();
+  }
+
+  public class PlaybackOverlaySupportFragment extends android.support.v17.leanback.app.DetailsSupportFragment {
+    ctor public PlaybackOverlaySupportFragment();
+    method public void fadeOut();
+    method public int getBackgroundType();
+    method public android.support.v17.leanback.app.PlaybackOverlaySupportFragment.OnFadeCompleteListener getFadeCompleteListener();
+    method public final android.support.v17.leanback.app.PlaybackOverlaySupportFragment.InputEventHandler getInputEventHandler();
+    method public boolean isFadingEnabled();
+    method public void setBackgroundType(int);
+    method public void setFadeCompleteListener(android.support.v17.leanback.app.PlaybackOverlaySupportFragment.OnFadeCompleteListener);
+    method public void setFadingEnabled(boolean);
+    method public final void setInputEventHandler(android.support.v17.leanback.app.PlaybackOverlaySupportFragment.InputEventHandler);
+    method public void tickle();
+    field public static final int BG_DARK = 1; // 0x1
+    field public static final int BG_LIGHT = 2; // 0x2
+    field public static final int BG_NONE = 0; // 0x0
+  }
+
+  public static abstract interface PlaybackOverlaySupportFragment.InputEventHandler {
+    method public abstract boolean handleInputEvent(android.view.InputEvent);
+  }
+
+  public static class PlaybackOverlaySupportFragment.OnFadeCompleteListener {
+    ctor public PlaybackOverlaySupportFragment.OnFadeCompleteListener();
+    method public void onFadeInComplete();
+    method public void onFadeOutComplete();
+  }
+
+  public final class ProgressBarManager {
+    ctor public ProgressBarManager();
+    method public void disableProgressBar();
+    method public void enableProgressBar();
+    method public long getInitialDelay();
+    method public void hide();
+    method public void setInitialDelay(long);
+    method public void setProgressBarView(android.view.View);
+    method public void setRootView(android.view.ViewGroup);
+    method public void show();
+  }
+
+  public class RowsFragment extends android.support.v17.leanback.app.BaseRowFragment implements android.support.v17.leanback.app.BrowseFragment.MainFragmentAdapterProvider android.support.v17.leanback.app.BrowseFragment.MainFragmentRowsAdapterProvider {
+    ctor public RowsFragment();
+    method public deprecated void enableRowScaling(boolean);
+    method protected android.support.v17.leanback.widget.VerticalGridView findGridViewFromRoot(android.view.View);
+    method public android.support.v17.leanback.app.BrowseFragment.MainFragmentAdapter getMainFragmentAdapter();
+    method public android.support.v17.leanback.app.BrowseFragment.MainFragmentRowsAdapter getMainFragmentRowsAdapter();
+    method public android.support.v17.leanback.widget.BaseOnItemViewClickedListener getOnItemViewClickedListener();
+    method public android.support.v17.leanback.widget.BaseOnItemViewSelectedListener getOnItemViewSelectedListener();
+    method public android.support.v17.leanback.widget.RowPresenter.ViewHolder getRowViewHolder(int);
+    method public boolean isScrolling();
+    method public void setEntranceTransitionState(boolean);
+    method public void setExpand(boolean);
+    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.BaseOnItemViewClickedListener);
+    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.BaseOnItemViewSelectedListener);
+    method public void setSelectedPosition(int, boolean, android.support.v17.leanback.widget.Presenter.ViewHolderTask);
+  }
+
+  public static class RowsFragment.MainFragmentAdapter extends android.support.v17.leanback.app.BrowseFragment.MainFragmentAdapter {
+    ctor public RowsFragment.MainFragmentAdapter(android.support.v17.leanback.app.RowsFragment);
+  }
+
+  public static class RowsFragment.MainFragmentRowsAdapter extends android.support.v17.leanback.app.BrowseFragment.MainFragmentRowsAdapter {
+    ctor public RowsFragment.MainFragmentRowsAdapter(android.support.v17.leanback.app.RowsFragment);
+  }
+
+  public class RowsSupportFragment extends android.support.v17.leanback.app.BaseRowSupportFragment implements android.support.v17.leanback.app.BrowseSupportFragment.MainFragmentAdapterProvider android.support.v17.leanback.app.BrowseSupportFragment.MainFragmentRowsAdapterProvider {
+    ctor public RowsSupportFragment();
+    method public deprecated void enableRowScaling(boolean);
+    method protected android.support.v17.leanback.widget.VerticalGridView findGridViewFromRoot(android.view.View);
+    method public android.support.v17.leanback.app.BrowseSupportFragment.MainFragmentAdapter getMainFragmentAdapter();
+    method public android.support.v17.leanback.app.BrowseSupportFragment.MainFragmentRowsAdapter getMainFragmentRowsAdapter();
+    method public android.support.v17.leanback.widget.BaseOnItemViewClickedListener getOnItemViewClickedListener();
+    method public android.support.v17.leanback.widget.BaseOnItemViewSelectedListener getOnItemViewSelectedListener();
+    method public android.support.v17.leanback.widget.RowPresenter.ViewHolder getRowViewHolder(int);
+    method public boolean isScrolling();
+    method public void setEntranceTransitionState(boolean);
+    method public void setExpand(boolean);
+    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.BaseOnItemViewClickedListener);
+    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.BaseOnItemViewSelectedListener);
+    method public void setSelectedPosition(int, boolean, android.support.v17.leanback.widget.Presenter.ViewHolderTask);
+  }
+
+  public static class RowsSupportFragment.MainFragmentAdapter extends android.support.v17.leanback.app.BrowseSupportFragment.MainFragmentAdapter {
+    ctor public RowsSupportFragment.MainFragmentAdapter(android.support.v17.leanback.app.RowsSupportFragment);
+  }
+
+  public static class RowsSupportFragment.MainFragmentRowsAdapter extends android.support.v17.leanback.app.BrowseSupportFragment.MainFragmentRowsAdapter {
+    ctor public RowsSupportFragment.MainFragmentRowsAdapter(android.support.v17.leanback.app.RowsSupportFragment);
+  }
+
+  public class SearchFragment extends android.app.Fragment {
+    ctor public SearchFragment();
+    method public static android.os.Bundle createArgs(android.os.Bundle, java.lang.String);
+    method public static android.os.Bundle createArgs(android.os.Bundle, java.lang.String, java.lang.String);
+    method public void displayCompletions(java.util.List<java.lang.String>);
+    method public void displayCompletions(android.view.inputmethod.CompletionInfo[]);
+    method public android.graphics.drawable.Drawable getBadgeDrawable();
+    method public android.content.Intent getRecognizerIntent();
+    method public java.lang.String getTitle();
+    method public static android.support.v17.leanback.app.SearchFragment newInstance(java.lang.String);
+    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
+    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
+    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
+    method public void setSearchQuery(java.lang.String, boolean);
+    method public void setSearchQuery(android.content.Intent, boolean);
+    method public void setSearchResultProvider(android.support.v17.leanback.app.SearchFragment.SearchResultProvider);
+    method public void setSpeechRecognitionCallback(android.support.v17.leanback.widget.SpeechRecognitionCallback);
+    method public void setTitle(java.lang.String);
+    method public void startRecognition();
+  }
+
+  public static abstract interface SearchFragment.SearchResultProvider {
+    method public abstract android.support.v17.leanback.widget.ObjectAdapter getResultsAdapter();
+    method public abstract boolean onQueryTextChange(java.lang.String);
+    method public abstract boolean onQueryTextSubmit(java.lang.String);
+  }
+
+  public class SearchSupportFragment extends android.support.v4.app.Fragment {
+    ctor public SearchSupportFragment();
+    method public static android.os.Bundle createArgs(android.os.Bundle, java.lang.String);
+    method public static android.os.Bundle createArgs(android.os.Bundle, java.lang.String, java.lang.String);
+    method public void displayCompletions(java.util.List<java.lang.String>);
+    method public void displayCompletions(android.view.inputmethod.CompletionInfo[]);
+    method public android.graphics.drawable.Drawable getBadgeDrawable();
+    method public android.content.Intent getRecognizerIntent();
+    method public java.lang.String getTitle();
+    method public static android.support.v17.leanback.app.SearchSupportFragment newInstance(java.lang.String);
+    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
+    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
+    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
+    method public void setSearchQuery(java.lang.String, boolean);
+    method public void setSearchQuery(android.content.Intent, boolean);
+    method public void setSearchResultProvider(android.support.v17.leanback.app.SearchSupportFragment.SearchResultProvider);
+    method public void setSpeechRecognitionCallback(android.support.v17.leanback.widget.SpeechRecognitionCallback);
+    method public void setTitle(java.lang.String);
+    method public void startRecognition();
+  }
+
+  public static abstract interface SearchSupportFragment.SearchResultProvider {
+    method public abstract android.support.v17.leanback.widget.ObjectAdapter getResultsAdapter();
+    method public abstract boolean onQueryTextChange(java.lang.String);
+    method public abstract boolean onQueryTextSubmit(java.lang.String);
+  }
+
+  public class VerticalGridFragment extends android.support.v17.leanback.app.BrandedFragment {
+    ctor public VerticalGridFragment();
+    method protected java.lang.Object createEntranceTransition();
+    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
+    method public android.support.v17.leanback.widget.VerticalGridPresenter getGridPresenter();
+    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
+    method protected void runEntranceTransition(java.lang.Object);
+    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
+    method public void setGridPresenter(android.support.v17.leanback.widget.VerticalGridPresenter);
+    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
+    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
+    method public void setSelectedPosition(int);
+  }
+
+  public class VerticalGridSupportFragment extends android.support.v17.leanback.app.BrandedSupportFragment {
+    ctor public VerticalGridSupportFragment();
+    method protected java.lang.Object createEntranceTransition();
+    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
+    method public android.support.v17.leanback.widget.VerticalGridPresenter getGridPresenter();
+    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
+    method protected void runEntranceTransition(java.lang.Object);
+    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
+    method public void setGridPresenter(android.support.v17.leanback.widget.VerticalGridPresenter);
+    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
+    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
+    method public void setSelectedPosition(int);
+  }
+
+}
+
+package android.support.v17.leanback.database {
+
+  public abstract class CursorMapper {
+    ctor public CursorMapper();
+    method protected abstract java.lang.Object bind(android.database.Cursor);
+    method protected abstract void bindColumns(android.database.Cursor);
+    method public java.lang.Object convert(android.database.Cursor);
+  }
+
+}
+
+package android.support.v17.leanback.graphics {
+
+  public final class ColorFilterCache {
+    method public static android.support.v17.leanback.graphics.ColorFilterCache getColorFilterCache(int);
+    method public android.graphics.ColorFilter getFilterForLevel(float);
+  }
+
+  public final class ColorFilterDimmer {
+    method public void applyFilterToView(android.view.View);
+    method public static android.support.v17.leanback.graphics.ColorFilterDimmer create(android.support.v17.leanback.graphics.ColorFilterCache, float, float);
+    method public static android.support.v17.leanback.graphics.ColorFilterDimmer createDefault(android.content.Context);
+    method public android.graphics.ColorFilter getColorFilter();
+    method public android.graphics.Paint getPaint();
+    method public void setActiveLevel(float);
+  }
+
+  public final class ColorOverlayDimmer {
+    method public int applyToColor(int);
+    method public static android.support.v17.leanback.graphics.ColorOverlayDimmer createColorOverlayDimmer(int, float, float);
+    method public static android.support.v17.leanback.graphics.ColorOverlayDimmer createDefault(android.content.Context);
+    method public void drawColorOverlay(android.graphics.Canvas, android.view.View, boolean);
+    method public int getAlpha();
+    method public float getAlphaFloat();
+    method public android.graphics.Paint getPaint();
+    method public boolean needsDraw();
+    method public void setActiveLevel(float);
+  }
+
+}
+
+package android.support.v17.leanback.system {
+
+  public class Settings {
+    method public boolean getBoolean(java.lang.String);
+    method public static android.support.v17.leanback.system.Settings getInstance(android.content.Context);
+    method public void setBoolean(java.lang.String, boolean);
+    field public static final java.lang.String PREFER_STATIC_SHADOWS = "PREFER_STATIC_SHADOWS";
+  }
+
+}
+
+package android.support.v17.leanback.widget {
+
+  public abstract class AbstractDetailsDescriptionPresenter extends android.support.v17.leanback.widget.Presenter {
+    ctor public AbstractDetailsDescriptionPresenter();
+    method protected abstract void onBindDescription(android.support.v17.leanback.widget.AbstractDetailsDescriptionPresenter.ViewHolder, java.lang.Object);
+    method public final void onBindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object);
+    method public final android.support.v17.leanback.widget.AbstractDetailsDescriptionPresenter.ViewHolder onCreateViewHolder(android.view.ViewGroup);
+    method public void onUnbindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
+  }
+
+  public static class AbstractDetailsDescriptionPresenter.ViewHolder extends android.support.v17.leanback.widget.Presenter.ViewHolder {
+    ctor public AbstractDetailsDescriptionPresenter.ViewHolder(android.view.View);
+    method public android.widget.TextView getBody();
+    method public android.widget.TextView getSubtitle();
+    method public android.widget.TextView getTitle();
+  }
+
+  public abstract class AbstractMediaItemPresenter extends android.support.v17.leanback.widget.RowPresenter {
+    ctor public AbstractMediaItemPresenter();
+    ctor public AbstractMediaItemPresenter(int);
+    method protected android.support.v17.leanback.widget.RowPresenter.ViewHolder createRowViewHolder(android.view.ViewGroup);
+    method public android.support.v17.leanback.widget.Presenter getActionPresenter();
+    method public int getThemeId();
+    method public boolean hasMediaRowSeparator();
+    method protected abstract void onBindMediaDetails(android.support.v17.leanback.widget.AbstractMediaItemPresenter.ViewHolder, java.lang.Object);
+    method protected void onBindRowActions(android.support.v17.leanback.widget.AbstractMediaItemPresenter.ViewHolder);
+    method protected void onUnbindMediaDetails(android.support.v17.leanback.widget.AbstractMediaItemPresenter.ViewHolder);
+    method public void setActionPresenter(android.support.v17.leanback.widget.Presenter);
+    method public void setBackgroundColor(int);
+    method public void setHasMediaRowSeparator(boolean);
+    method public void setThemeId(int);
+  }
+
+  public static class AbstractMediaItemPresenter.ViewHolder extends android.support.v17.leanback.widget.RowPresenter.ViewHolder {
+    ctor public AbstractMediaItemPresenter.ViewHolder(android.view.View);
+    method public android.view.ViewGroup getMediaItemActionsContainer();
+    method public android.view.View getMediaItemDetailsView();
+    method public android.widget.TextView getMediaItemDurationView();
+    method public android.widget.TextView getMediaItemNameView();
+    method public android.widget.TextView getMediaItemNumberView();
+    method public android.support.v17.leanback.widget.MultiActionsProvider.MultiAction[] getMediaItemRowActions();
+    method public android.view.View getMediaItemRowSeparator();
+    method public android.view.View getSelectorView();
+    method public void notifyActionChanged(android.support.v17.leanback.widget.MultiActionsProvider.MultiAction);
+    method public void notifyDetailsChanged();
+    method public void onBindRowActions();
+  }
+
+  public abstract class AbstractMediaListHeaderPresenter extends android.support.v17.leanback.widget.RowPresenter {
+    ctor public AbstractMediaListHeaderPresenter(android.content.Context, int);
+    ctor public AbstractMediaListHeaderPresenter();
+    method protected android.support.v17.leanback.widget.RowPresenter.ViewHolder createRowViewHolder(android.view.ViewGroup);
+    method protected abstract void onBindMediaListHeaderViewHolder(android.support.v17.leanback.widget.AbstractMediaListHeaderPresenter.ViewHolder, java.lang.Object);
+    method public void setBackgroundColor(int);
+  }
+
+  public static class AbstractMediaListHeaderPresenter.ViewHolder extends android.support.v17.leanback.widget.RowPresenter.ViewHolder {
+    ctor public AbstractMediaListHeaderPresenter.ViewHolder(android.view.View);
+    method public android.widget.TextView getHeaderView();
+  }
+
+  public class Action {
+    ctor public Action(long);
+    ctor public Action(long, java.lang.CharSequence);
+    ctor public Action(long, java.lang.CharSequence, java.lang.CharSequence);
+    ctor public Action(long, java.lang.CharSequence, java.lang.CharSequence, android.graphics.drawable.Drawable);
+    method public final void addKeyCode(int);
+    method public final android.graphics.drawable.Drawable getIcon();
+    method public final long getId();
+    method public final java.lang.CharSequence getLabel1();
+    method public final java.lang.CharSequence getLabel2();
+    method public final void removeKeyCode(int);
+    method public final boolean respondsToKeyCode(int);
+    method public final void setIcon(android.graphics.drawable.Drawable);
+    method public final void setId(long);
+    method public final void setLabel1(java.lang.CharSequence);
+    method public final void setLabel2(java.lang.CharSequence);
+    field public static final long NO_ID = -1L; // 0xffffffffffffffffL
+  }
+
+  public class ArrayObjectAdapter extends android.support.v17.leanback.widget.ObjectAdapter {
+    ctor public ArrayObjectAdapter(android.support.v17.leanback.widget.PresenterSelector);
+    ctor public ArrayObjectAdapter(android.support.v17.leanback.widget.Presenter);
+    ctor public ArrayObjectAdapter();
+    method public void add(java.lang.Object);
+    method public void add(int, java.lang.Object);
+    method public void addAll(int, java.util.Collection);
+    method public void clear();
+    method public java.lang.Object get(int);
+    method public int indexOf(java.lang.Object);
+    method public void notifyArrayItemRangeChanged(int, int);
+    method public boolean remove(java.lang.Object);
+    method public int removeItems(int, int);
+    method public void replace(int, java.lang.Object);
+    method public int size();
+    method public java.util.List<E> unmodifiableList();
+  }
+
+  public class BaseCardView extends android.widget.FrameLayout {
+    ctor public BaseCardView(android.content.Context);
+    ctor public BaseCardView(android.content.Context, android.util.AttributeSet);
+    ctor public BaseCardView(android.content.Context, android.util.AttributeSet, int);
+    method public int getCardType();
+    method public int getExtraVisibility();
+    method public int getInfoVisibility();
+    method public boolean isSelectedAnimationDelayed();
+    method public void setCardType(int);
+    method public void setExtraVisibility(int);
+    method public void setInfoVisibility(int);
+    method public void setSelectedAnimationDelayed(boolean);
+    field public static final int CARD_REGION_VISIBLE_ACTIVATED = 1; // 0x1
+    field public static final int CARD_REGION_VISIBLE_ALWAYS = 0; // 0x0
+    field public static final int CARD_REGION_VISIBLE_SELECTED = 2; // 0x2
+    field public static final int CARD_TYPE_INFO_OVER = 1; // 0x1
+    field public static final int CARD_TYPE_INFO_UNDER = 2; // 0x2
+    field public static final int CARD_TYPE_INFO_UNDER_WITH_EXTRA = 3; // 0x3
+    field public static final int CARD_TYPE_MAIN_ONLY = 0; // 0x0
+  }
+
+  public static class BaseCardView.LayoutParams extends android.widget.FrameLayout.LayoutParams {
+    ctor public BaseCardView.LayoutParams(android.content.Context, android.util.AttributeSet);
+    ctor public BaseCardView.LayoutParams(int, int);
+    ctor public BaseCardView.LayoutParams(android.view.ViewGroup.LayoutParams);
+    ctor public BaseCardView.LayoutParams(android.support.v17.leanback.widget.BaseCardView.LayoutParams);
+    field public static final int VIEW_TYPE_EXTRA = 2; // 0x2
+    field public static final int VIEW_TYPE_INFO = 1; // 0x1
+    field public static final int VIEW_TYPE_MAIN = 0; // 0x0
+    field public int viewType;
+  }
+
+  public abstract interface BaseOnItemViewClickedListener {
+    method public abstract void onItemClicked(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object, android.support.v17.leanback.widget.RowPresenter.ViewHolder, T);
+  }
+
+  public abstract interface BaseOnItemViewSelectedListener {
+    method public abstract void onItemSelected(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object, android.support.v17.leanback.widget.RowPresenter.ViewHolder, T);
+  }
+
+  public class BrowseFrameLayout extends android.widget.FrameLayout {
+    ctor public BrowseFrameLayout(android.content.Context);
+    ctor public BrowseFrameLayout(android.content.Context, android.util.AttributeSet);
+    ctor public BrowseFrameLayout(android.content.Context, android.util.AttributeSet, int);
+    method public android.support.v17.leanback.widget.BrowseFrameLayout.OnChildFocusListener getOnChildFocusListener();
+    method public android.support.v17.leanback.widget.BrowseFrameLayout.OnFocusSearchListener getOnFocusSearchListener();
+    method public void setOnChildFocusListener(android.support.v17.leanback.widget.BrowseFrameLayout.OnChildFocusListener);
+    method public void setOnFocusSearchListener(android.support.v17.leanback.widget.BrowseFrameLayout.OnFocusSearchListener);
+  }
+
+  public static abstract interface BrowseFrameLayout.OnChildFocusListener {
+    method public abstract void onRequestChildFocus(android.view.View, android.view.View);
+    method public abstract boolean onRequestFocusInDescendants(int, android.graphics.Rect);
+  }
+
+  public static abstract interface BrowseFrameLayout.OnFocusSearchListener {
+    method public abstract android.view.View onFocusSearch(android.view.View, int);
+  }
+
+  public final class ClassPresenterSelector extends android.support.v17.leanback.widget.PresenterSelector {
+    ctor public ClassPresenterSelector();
+    method public android.support.v17.leanback.widget.ClassPresenterSelector addClassPresenter(java.lang.Class<?>, android.support.v17.leanback.widget.Presenter);
+    method public android.support.v17.leanback.widget.ClassPresenterSelector addClassPresenterSelector(java.lang.Class<?>, android.support.v17.leanback.widget.PresenterSelector);
+    method public android.support.v17.leanback.widget.Presenter getPresenter(java.lang.Object);
+  }
+
+  public class ControlButtonPresenterSelector extends android.support.v17.leanback.widget.PresenterSelector {
+    ctor public ControlButtonPresenterSelector();
+    method public android.support.v17.leanback.widget.Presenter getPresenter(java.lang.Object);
+    method public android.support.v17.leanback.widget.Presenter getPrimaryPresenter();
+    method public android.support.v17.leanback.widget.Presenter getSecondaryPresenter();
+  }
+
+  public class CursorObjectAdapter extends android.support.v17.leanback.widget.ObjectAdapter {
+    ctor public CursorObjectAdapter(android.support.v17.leanback.widget.PresenterSelector);
+    ctor public CursorObjectAdapter(android.support.v17.leanback.widget.Presenter);
+    ctor public CursorObjectAdapter();
+    method public void changeCursor(android.database.Cursor);
+    method public void close();
+    method public java.lang.Object get(int);
+    method public final android.database.Cursor getCursor();
+    method public final android.support.v17.leanback.database.CursorMapper getMapper();
+    method protected final void invalidateCache(int);
+    method protected final void invalidateCache(int, int);
+    method public boolean isClosed();
+    method protected void onCursorChanged();
+    method protected void onMapperChanged();
+    method public final void setMapper(android.support.v17.leanback.database.CursorMapper);
+    method public int size();
+    method public android.database.Cursor swapCursor(android.database.Cursor);
+  }
+
+  public class DetailsOverviewLogoPresenter extends android.support.v17.leanback.widget.Presenter {
+    ctor public DetailsOverviewLogoPresenter();
+    method public boolean isBoundToImage(android.support.v17.leanback.widget.DetailsOverviewLogoPresenter.ViewHolder, android.support.v17.leanback.widget.DetailsOverviewRow);
+    method public void onBindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object);
+    method public android.view.View onCreateView(android.view.ViewGroup);
+    method public android.support.v17.leanback.widget.Presenter.ViewHolder onCreateViewHolder(android.view.ViewGroup);
+    method public void onUnbindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
+    method public void setContext(android.support.v17.leanback.widget.DetailsOverviewLogoPresenter.ViewHolder, android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder, android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter);
+  }
+
+  public static class DetailsOverviewLogoPresenter.ViewHolder extends android.support.v17.leanback.widget.Presenter.ViewHolder {
+    ctor public DetailsOverviewLogoPresenter.ViewHolder(android.view.View);
+    method public android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter getParentPresenter();
+    method public android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder getParentViewHolder();
+    method public boolean isSizeFromDrawableIntrinsic();
+    method public void setSizeFromDrawableIntrinsic(boolean);
+    field protected android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter mParentPresenter;
+    field protected android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder mParentViewHolder;
+  }
+
+  public class DetailsOverviewRow extends android.support.v17.leanback.widget.Row {
+    ctor public DetailsOverviewRow(java.lang.Object);
+    method public final deprecated void addAction(android.support.v17.leanback.widget.Action);
+    method public final deprecated void addAction(int, android.support.v17.leanback.widget.Action);
+    method public android.support.v17.leanback.widget.Action getActionForKeyCode(int);
+    method public final deprecated java.util.List<android.support.v17.leanback.widget.Action> getActions();
+    method public final android.support.v17.leanback.widget.ObjectAdapter getActionsAdapter();
+    method public final android.graphics.drawable.Drawable getImageDrawable();
+    method public final java.lang.Object getItem();
+    method public boolean isImageScaleUpAllowed();
+    method public final deprecated boolean removeAction(android.support.v17.leanback.widget.Action);
+    method public final void setActionsAdapter(android.support.v17.leanback.widget.ObjectAdapter);
+    method public final void setImageBitmap(android.content.Context, android.graphics.Bitmap);
+    method public final void setImageDrawable(android.graphics.drawable.Drawable);
+    method public void setImageScaleUpAllowed(boolean);
+    method public final void setItem(java.lang.Object);
+  }
+
+  public static class DetailsOverviewRow.Listener {
+    ctor public DetailsOverviewRow.Listener();
+    method public void onActionsAdapterChanged(android.support.v17.leanback.widget.DetailsOverviewRow);
+    method public void onImageDrawableChanged(android.support.v17.leanback.widget.DetailsOverviewRow);
+    method public void onItemChanged(android.support.v17.leanback.widget.DetailsOverviewRow);
+  }
+
+  public deprecated class DetailsOverviewRowPresenter extends android.support.v17.leanback.widget.RowPresenter {
+    ctor public DetailsOverviewRowPresenter(android.support.v17.leanback.widget.Presenter);
+    method protected android.support.v17.leanback.widget.RowPresenter.ViewHolder createRowViewHolder(android.view.ViewGroup);
+    method public int getBackgroundColor();
+    method public android.support.v17.leanback.widget.OnActionClickedListener getOnActionClickedListener();
+    method public boolean isStyleLarge();
+    method public final boolean isUsingDefaultSelectEffect();
+    method public void setBackgroundColor(int);
+    method public void setOnActionClickedListener(android.support.v17.leanback.widget.OnActionClickedListener);
+    method public final void setSharedElementEnterTransition(android.app.Activity, java.lang.String, long);
+    method public final void setSharedElementEnterTransition(android.app.Activity, java.lang.String);
+    method public void setStyleLarge(boolean);
+  }
+
+  public final class DetailsOverviewRowPresenter.ViewHolder extends android.support.v17.leanback.widget.RowPresenter.ViewHolder {
+    ctor public DetailsOverviewRowPresenter.ViewHolder(android.view.View, android.support.v17.leanback.widget.Presenter);
+    field public final android.support.v17.leanback.widget.Presenter.ViewHolder mDetailsDescriptionViewHolder;
+  }
+
+  public class DividerPresenter extends android.support.v17.leanback.widget.Presenter {
+    ctor public DividerPresenter();
+    method public void onBindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object);
+    method public android.support.v17.leanback.widget.Presenter.ViewHolder onCreateViewHolder(android.view.ViewGroup);
+    method public void onUnbindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
+  }
+
+  public class DividerRow extends android.support.v17.leanback.widget.Row {
+    ctor public DividerRow();
+    method public final boolean isRenderedAsRowView();
+  }
+
+  public abstract interface FacetProvider {
+    method public abstract java.lang.Object getFacet(java.lang.Class<?>);
+  }
+
+  public abstract interface FacetProviderAdapter {
+    method public abstract android.support.v17.leanback.widget.FacetProvider getFacetProvider(int);
+  }
+
+  public abstract interface FocusHighlight {
+    field public static final int ZOOM_FACTOR_LARGE = 3; // 0x3
+    field public static final int ZOOM_FACTOR_MEDIUM = 2; // 0x2
+    field public static final int ZOOM_FACTOR_NONE = 0; // 0x0
+    field public static final int ZOOM_FACTOR_SMALL = 1; // 0x1
+    field public static final int ZOOM_FACTOR_XSMALL = 4; // 0x4
+  }
+
+  public class FocusHighlightHelper {
+    ctor public FocusHighlightHelper();
+    method public static void setupBrowseItemFocusHighlight(android.support.v17.leanback.widget.ItemBridgeAdapter, int, boolean);
+    method public static void setupHeaderItemFocusHighlight(android.support.v17.leanback.widget.VerticalGridView);
+  }
+
+  public abstract interface FragmentAnimationProvider {
+    method public abstract void onImeAppearing(java.util.List<android.animation.Animator>);
+    method public abstract void onImeDisappearing(java.util.List<android.animation.Animator>);
+  }
+
+  public class FullWidthDetailsOverviewRowPresenter extends android.support.v17.leanback.widget.RowPresenter {
+    ctor public FullWidthDetailsOverviewRowPresenter(android.support.v17.leanback.widget.Presenter);
+    ctor public FullWidthDetailsOverviewRowPresenter(android.support.v17.leanback.widget.Presenter, android.support.v17.leanback.widget.DetailsOverviewLogoPresenter);
+    method protected android.support.v17.leanback.widget.RowPresenter.ViewHolder createRowViewHolder(android.view.ViewGroup);
+    method public final int getActionsBackgroundColor();
+    method public final int getAlignmentMode();
+    method public final int getBackgroundColor();
+    method public final int getInitialState();
+    method protected int getLayoutResourceId();
+    method public android.support.v17.leanback.widget.OnActionClickedListener getOnActionClickedListener();
+    method public final boolean isParticipatingEntranceTransition();
+    method public final boolean isUsingDefaultSelectEffect();
+    method public final void notifyOnBindLogo(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder);
+    method protected void onLayoutLogo(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder, int, boolean);
+    method protected void onLayoutOverviewFrame(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder, int, boolean);
+    method protected void onStateChanged(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder, int);
+    method public final void setActionsBackgroundColor(int);
+    method public final void setAlignmentMode(int);
+    method public final void setBackgroundColor(int);
+    method public final void setInitialState(int);
+    method public final void setListener(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.Listener);
+    method public void setOnActionClickedListener(android.support.v17.leanback.widget.OnActionClickedListener);
+    method public final void setParticipatingEntranceTransition(boolean);
+    method public final void setState(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder, int);
+    field public static final int ALIGN_MODE_MIDDLE = 1; // 0x1
+    field public static final int ALIGN_MODE_START = 0; // 0x0
+    field public static final int STATE_FULL = 1; // 0x1
+    field public static final int STATE_HALF = 0; // 0x0
+    field public static final int STATE_SMALL = 2; // 0x2
+    field protected int mInitialState;
+  }
+
+  public static abstract class FullWidthDetailsOverviewRowPresenter.Listener {
+    ctor public FullWidthDetailsOverviewRowPresenter.Listener();
+    method public void onBindLogo(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder);
+  }
+
+  public class FullWidthDetailsOverviewRowPresenter.ViewHolder extends android.support.v17.leanback.widget.RowPresenter.ViewHolder {
+    ctor public FullWidthDetailsOverviewRowPresenter.ViewHolder(android.view.View, android.support.v17.leanback.widget.Presenter, android.support.v17.leanback.widget.DetailsOverviewLogoPresenter);
+    method protected android.support.v17.leanback.widget.DetailsOverviewRow.Listener createRowListener();
+    method public final android.view.ViewGroup getActionsRow();
+    method public final android.view.ViewGroup getDetailsDescriptionFrame();
+    method public final android.support.v17.leanback.widget.Presenter.ViewHolder getDetailsDescriptionViewHolder();
+    method public final android.support.v17.leanback.widget.DetailsOverviewLogoPresenter.ViewHolder getLogoViewHolder();
+    method public final android.view.ViewGroup getOverviewView();
+    method public final int getState();
+    field protected final android.support.v17.leanback.widget.DetailsOverviewRow.Listener mRowListener;
+  }
+
+  public class FullWidthDetailsOverviewRowPresenter.ViewHolder.DetailsOverviewRowListener extends android.support.v17.leanback.widget.DetailsOverviewRow.Listener {
+    ctor public FullWidthDetailsOverviewRowPresenter.ViewHolder.DetailsOverviewRowListener();
+  }
+
+  public class FullWidthDetailsOverviewSharedElementHelper extends android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.Listener {
+    ctor public FullWidthDetailsOverviewSharedElementHelper();
+    method public boolean getAutoStartSharedElementTransition();
+    method public void setAutoStartSharedElementTransition(boolean);
+    method public void setSharedElementEnterTransition(android.app.Activity, java.lang.String);
+    method public void setSharedElementEnterTransition(android.app.Activity, java.lang.String, long);
+    method public void startPostponedEnterTransition();
+  }
+
+  public class GuidanceStylist implements android.support.v17.leanback.widget.FragmentAnimationProvider {
+    ctor public GuidanceStylist();
+    method public android.widget.TextView getBreadcrumbView();
+    method public android.widget.TextView getDescriptionView();
+    method public android.widget.ImageView getIconView();
+    method public android.widget.TextView getTitleView();
+    method public android.view.View onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.support.v17.leanback.widget.GuidanceStylist.Guidance);
+    method public void onDestroyView();
+    method public void onImeAppearing(java.util.List<android.animation.Animator>);
+    method public void onImeDisappearing(java.util.List<android.animation.Animator>);
+    method public int onProvideLayoutId();
+  }
+
+  public static class GuidanceStylist.Guidance {
+    ctor public GuidanceStylist.Guidance(java.lang.String, java.lang.String, java.lang.String, android.graphics.drawable.Drawable);
+    method public java.lang.String getBreadcrumb();
+    method public java.lang.String getDescription();
+    method public android.graphics.drawable.Drawable getIconDrawable();
+    method public java.lang.String getTitle();
+  }
+
+  public class GuidedAction extends android.support.v17.leanback.widget.Action {
+    ctor protected GuidedAction();
+    method public int getCheckSetId();
+    method public java.lang.CharSequence getDescription();
+    method public int getDescriptionEditInputType();
+    method public int getDescriptionInputType();
+    method public java.lang.CharSequence getEditDescription();
+    method public int getEditInputType();
+    method public java.lang.CharSequence getEditTitle();
+    method public int getInputType();
+    method public android.content.Intent getIntent();
+    method public java.util.List<android.support.v17.leanback.widget.GuidedAction> getSubActions();
+    method public java.lang.CharSequence getTitle();
+    method public boolean hasEditableActivatorView();
+    method public boolean hasMultilineDescription();
+    method public boolean hasNext();
+    method public boolean hasSubActions();
+    method public boolean hasTextEditable();
+    method public boolean infoOnly();
+    method public final boolean isAutoSaveRestoreEnabled();
+    method public boolean isChecked();
+    method public boolean isDescriptionEditable();
+    method public boolean isEditTitleUsed();
+    method public boolean isEditable();
+    method public boolean isEnabled();
+    method public boolean isFocusable();
+    method public void onRestoreInstanceState(android.os.Bundle, java.lang.String);
+    method public void onSaveInstanceState(android.os.Bundle, java.lang.String);
+    method public void setChecked(boolean);
+    method public void setDescription(java.lang.CharSequence);
+    method public void setEditDescription(java.lang.CharSequence);
+    method public void setEditTitle(java.lang.CharSequence);
+    method public void setEnabled(boolean);
+    method public void setFocusable(boolean);
+    method public void setIntent(android.content.Intent);
+    method public void setSubActions(java.util.List<android.support.v17.leanback.widget.GuidedAction>);
+    method public void setTitle(java.lang.CharSequence);
+    field public static final long ACTION_ID_CANCEL = -5L; // 0xfffffffffffffffbL
+    field public static final long ACTION_ID_CONTINUE = -7L; // 0xfffffffffffffff9L
+    field public static final long ACTION_ID_CURRENT = -3L; // 0xfffffffffffffffdL
+    field public static final long ACTION_ID_FINISH = -6L; // 0xfffffffffffffffaL
+    field public static final long ACTION_ID_NEXT = -2L; // 0xfffffffffffffffeL
+    field public static final long ACTION_ID_NO = -9L; // 0xfffffffffffffff7L
+    field public static final long ACTION_ID_OK = -4L; // 0xfffffffffffffffcL
+    field public static final long ACTION_ID_YES = -8L; // 0xfffffffffffffff8L
+    field public static final int CHECKBOX_CHECK_SET_ID = -1; // 0xffffffff
+    field public static final int DEFAULT_CHECK_SET_ID = 1; // 0x1
+    field public static final int NO_CHECK_SET = 0; // 0x0
+  }
+
+  public static class GuidedAction.Builder extends android.support.v17.leanback.widget.GuidedAction.BuilderBase {
+    ctor public deprecated GuidedAction.Builder();
+    ctor public GuidedAction.Builder(android.content.Context);
+    method public android.support.v17.leanback.widget.GuidedAction build();
+  }
+
+  public static abstract class GuidedAction.BuilderBase {
+    ctor public GuidedAction.BuilderBase(android.content.Context);
+    method protected final void applyValues(android.support.v17.leanback.widget.GuidedAction);
+    method public B autoSaveRestoreEnabled(boolean);
+    method public B checkSetId(int);
+    method public B checked(boolean);
+    method public B clickAction(long);
+    method public B description(java.lang.CharSequence);
+    method public B description(int);
+    method public B descriptionEditInputType(int);
+    method public B descriptionEditable(boolean);
+    method public B descriptionInputType(int);
+    method public B editDescription(java.lang.CharSequence);
+    method public B editDescription(int);
+    method public B editInputType(int);
+    method public B editTitle(java.lang.CharSequence);
+    method public B editTitle(int);
+    method public B editable(boolean);
+    method public B enabled(boolean);
+    method public B focusable(boolean);
+    method public android.content.Context getContext();
+    method public B hasEditableActivatorView(boolean);
+    method public B hasNext(boolean);
+    method public B icon(android.graphics.drawable.Drawable);
+    method public B icon(int);
+    method public deprecated B iconResourceId(int, android.content.Context);
+    method public B id(long);
+    method public B infoOnly(boolean);
+    method public B inputType(int);
+    method public B intent(android.content.Intent);
+    method public B multilineDescription(boolean);
+    method public B subActions(java.util.List<android.support.v17.leanback.widget.GuidedAction>);
+    method public B title(java.lang.CharSequence);
+    method public B title(int);
+  }
+
+  public class GuidedActionEditText extends android.widget.EditText implements android.support.v17.leanback.widget.ImeKeyMonitor {
+    ctor public GuidedActionEditText(android.content.Context);
+    ctor public GuidedActionEditText(android.content.Context, android.util.AttributeSet);
+    ctor public GuidedActionEditText(android.content.Context, android.util.AttributeSet, int);
+    method public void setImeKeyListener(android.support.v17.leanback.widget.ImeKeyMonitor.ImeKeyListener);
+  }
+
+  public class GuidedActionsStylist implements android.support.v17.leanback.widget.FragmentAnimationProvider {
+    ctor public GuidedActionsStylist();
+    method public android.support.v17.leanback.widget.VerticalGridView getActionsGridView();
+    method public android.support.v17.leanback.widget.GuidedAction getExpandedAction();
+    method public int getItemViewType(android.support.v17.leanback.widget.GuidedAction);
+    method public android.support.v17.leanback.widget.VerticalGridView getSubActionsGridView();
+    method public boolean isButtonActions();
+    method public boolean isExpandTransitionSupported();
+    method public boolean isInExpandTransition();
+    method public boolean isSubActionsExpanded();
+    method public void onAnimateItemChecked(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, boolean);
+    method public void onAnimateItemFocused(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, boolean);
+    method public void onAnimateItemPressed(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, boolean);
+    method public void onAnimateItemPressedCancelled(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder);
+    method public void onBindActivatorView(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, android.support.v17.leanback.widget.GuidedAction);
+    method public void onBindCheckMarkView(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, android.support.v17.leanback.widget.GuidedAction);
+    method public void onBindChevronView(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, android.support.v17.leanback.widget.GuidedAction);
+    method public void onBindViewHolder(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, android.support.v17.leanback.widget.GuidedAction);
+    method public android.view.View onCreateView(android.view.LayoutInflater, android.view.ViewGroup);
+    method public android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder onCreateViewHolder(android.view.ViewGroup);
+    method public android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder onCreateViewHolder(android.view.ViewGroup, int);
+    method public void onDestroyView();
+    method protected void onEditingModeChange(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, android.support.v17.leanback.widget.GuidedAction, boolean);
+    method public void onImeAppearing(java.util.List<android.animation.Animator>);
+    method public void onImeDisappearing(java.util.List<android.animation.Animator>);
+    method public int onProvideItemLayoutId();
+    method public int onProvideItemLayoutId(int);
+    method public int onProvideLayoutId();
+    method public boolean onUpdateActivatorView(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, android.support.v17.leanback.widget.GuidedAction);
+    method public void onUpdateExpandedViewHolder(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder);
+    method public void setAsButtonActions();
+    method public void setEditingMode(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, android.support.v17.leanback.widget.GuidedAction, boolean);
+    method public void setExpandedViewHolder(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder);
+    method protected void setupImeOptions(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, android.support.v17.leanback.widget.GuidedAction);
+    method public void startExpandedTransition(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder);
+    field public static final int VIEW_TYPE_DATE_PICKER = 1; // 0x1
+    field public static final int VIEW_TYPE_DEFAULT = 0; // 0x0
+  }
+
+  public static class GuidedActionsStylist.ViewHolder extends android.support.v7.widget.RecyclerView.ViewHolder implements android.support.v17.leanback.widget.FacetProvider {
+    ctor public GuidedActionsStylist.ViewHolder(android.view.View);
+    ctor public GuidedActionsStylist.ViewHolder(android.view.View, boolean);
+    method public android.support.v17.leanback.widget.GuidedAction getAction();
+    method public android.widget.ImageView getCheckmarkView();
+    method public android.widget.ImageView getChevronView();
+    method public android.view.View getContentView();
+    method public android.widget.TextView getDescriptionView();
+    method public android.widget.EditText getEditableDescriptionView();
+    method public android.widget.EditText getEditableTitleView();
+    method public android.view.View getEditingView();
+    method public java.lang.Object getFacet(java.lang.Class<?>);
+    method public android.widget.ImageView getIconView();
+    method public android.widget.TextView getTitleView();
+    method public boolean isInEditing();
+    method public boolean isInEditingActivatorView();
+    method public boolean isInEditingDescription();
+    method public boolean isInEditingText();
+    method public boolean isInEditingTitle();
+    method public boolean isSubAction();
+  }
+
+  public class GuidedDatePickerAction extends android.support.v17.leanback.widget.GuidedAction {
+    ctor public GuidedDatePickerAction();
+    method public long getDate();
+    method public java.lang.String getDatePickerFormat();
+    method public long getMaxDate();
+    method public long getMinDate();
+    method public void setDate(long);
+  }
+
+  public static final class GuidedDatePickerAction.Builder extends android.support.v17.leanback.widget.GuidedDatePickerAction.BuilderBase {
+    ctor public GuidedDatePickerAction.Builder(android.content.Context);
+    method public android.support.v17.leanback.widget.GuidedDatePickerAction build();
+  }
+
+  public static abstract class GuidedDatePickerAction.BuilderBase extends android.support.v17.leanback.widget.GuidedAction.BuilderBase {
+    ctor public GuidedDatePickerAction.BuilderBase(android.content.Context);
+    method protected final void applyDatePickerValues(android.support.v17.leanback.widget.GuidedDatePickerAction);
+    method public B date(long);
+    method public B datePickerFormat(java.lang.String);
+    method public B maxDate(long);
+    method public B minDate(long);
+  }
+
+  public class HeaderItem {
+    ctor public HeaderItem(long, java.lang.String);
+    ctor public HeaderItem(java.lang.String);
+    method public java.lang.CharSequence getContentDescription();
+    method public final long getId();
+    method public final java.lang.String getName();
+    method public void setContentDescription(java.lang.CharSequence);
+  }
+
+  public class HorizontalGridView extends android.support.v7.widget.RecyclerView {
+    ctor public HorizontalGridView(android.content.Context);
+    ctor public HorizontalGridView(android.content.Context, android.util.AttributeSet);
+    ctor public HorizontalGridView(android.content.Context, android.util.AttributeSet, int);
+    method public final boolean getFadingLeftEdge();
+    method public final int getFadingLeftEdgeLength();
+    method public final int getFadingLeftEdgeOffset();
+    method public final boolean getFadingRightEdge();
+    method public final int getFadingRightEdgeLength();
+    method public final int getFadingRightEdgeOffset();
+    method protected void initAttributes(android.content.Context, android.util.AttributeSet);
+    method public final void setFadingLeftEdge(boolean);
+    method public final void setFadingLeftEdgeLength(int);
+    method public final void setFadingLeftEdgeOffset(int);
+    method public final void setFadingRightEdge(boolean);
+    method public final void setFadingRightEdgeLength(int);
+    method public final void setFadingRightEdgeOffset(int);
+    method public void setNumRows(int);
+    method public void setRowHeight(int);
+  }
+
+  public final class HorizontalHoverCardSwitcher extends android.support.v17.leanback.widget.PresenterSwitcher {
+    ctor public HorizontalHoverCardSwitcher();
+    method protected void insertView(android.view.View);
+    method public void select(android.support.v17.leanback.widget.HorizontalGridView, android.view.View, java.lang.Object);
+  }
+
+  public class ImageCardView extends android.support.v17.leanback.widget.BaseCardView {
+    ctor public deprecated ImageCardView(android.content.Context, int);
+    ctor public ImageCardView(android.content.Context, android.util.AttributeSet, int);
+    ctor public ImageCardView(android.content.Context);
+    ctor public ImageCardView(android.content.Context, android.util.AttributeSet);
+    method public android.graphics.drawable.Drawable getBadgeImage();
+    method public java.lang.CharSequence getContentText();
+    method public android.graphics.drawable.Drawable getInfoAreaBackground();
+    method public android.graphics.drawable.Drawable getMainImage();
+    method public final android.widget.ImageView getMainImageView();
+    method public java.lang.CharSequence getTitleText();
+    method public void setBadgeImage(android.graphics.drawable.Drawable);
+    method public void setContentText(java.lang.CharSequence);
+    method public void setInfoAreaBackground(android.graphics.drawable.Drawable);
+    method public void setInfoAreaBackgroundColor(int);
+    method public void setMainImage(android.graphics.drawable.Drawable);
+    method public void setMainImage(android.graphics.drawable.Drawable, boolean);
+    method public void setMainImageAdjustViewBounds(boolean);
+    method public void setMainImageDimensions(int, int);
+    method public void setMainImageScaleType(android.widget.ImageView.ScaleType);
+    method public void setTitleText(java.lang.CharSequence);
+    field public static final int CARD_TYPE_FLAG_CONTENT = 2; // 0x2
+    field public static final int CARD_TYPE_FLAG_ICON_LEFT = 8; // 0x8
+    field public static final int CARD_TYPE_FLAG_ICON_RIGHT = 4; // 0x4
+    field public static final int CARD_TYPE_FLAG_IMAGE_ONLY = 0; // 0x0
+    field public static final int CARD_TYPE_FLAG_TITLE = 1; // 0x1
+  }
+
+  public abstract interface ImeKeyMonitor {
+    method public abstract void setImeKeyListener(android.support.v17.leanback.widget.ImeKeyMonitor.ImeKeyListener);
+  }
+
+  public static abstract interface ImeKeyMonitor.ImeKeyListener {
+    method public abstract boolean onKeyPreIme(android.widget.EditText, int, android.view.KeyEvent);
+  }
+
+  public final class ItemAlignmentFacet {
+    ctor public ItemAlignmentFacet();
+    method public android.support.v17.leanback.widget.ItemAlignmentFacet.ItemAlignmentDef[] getAlignmentDefs();
+    method public boolean isMultiAlignment();
+    method public void setAlignmentDefs(android.support.v17.leanback.widget.ItemAlignmentFacet.ItemAlignmentDef[]);
+    field public static final float ITEM_ALIGN_OFFSET_PERCENT_DISABLED = -1.0f;
+  }
+
+  public static class ItemAlignmentFacet.ItemAlignmentDef {
+    ctor public ItemAlignmentFacet.ItemAlignmentDef();
+    method public final int getItemAlignmentFocusViewId();
+    method public final int getItemAlignmentOffset();
+    method public final float getItemAlignmentOffsetPercent();
+    method public final int getItemAlignmentViewId();
+    method public boolean isAlignedToTextViewBaseLine();
+    method public final boolean isItemAlignmentOffsetWithPadding();
+    method public final void setAlignedToTextViewBaseline(boolean);
+    method public final void setItemAlignmentFocusViewId(int);
+    method public final void setItemAlignmentOffset(int);
+    method public final void setItemAlignmentOffsetPercent(float);
+    method public final void setItemAlignmentOffsetWithPadding(boolean);
+    method public final void setItemAlignmentViewId(int);
+  }
+
+  public class ItemBridgeAdapter extends android.support.v7.widget.RecyclerView.Adapter implements android.support.v17.leanback.widget.FacetProviderAdapter {
+    ctor public ItemBridgeAdapter(android.support.v17.leanback.widget.ObjectAdapter, android.support.v17.leanback.widget.PresenterSelector);
+    ctor public ItemBridgeAdapter(android.support.v17.leanback.widget.ObjectAdapter);
+    ctor public ItemBridgeAdapter();
+    method public void clear();
+    method public android.support.v17.leanback.widget.FacetProvider getFacetProvider(int);
+    method public int getItemCount();
+    method public java.util.ArrayList<android.support.v17.leanback.widget.Presenter> getPresenterMapper();
+    method public android.support.v17.leanback.widget.ItemBridgeAdapter.Wrapper getWrapper();
+    method protected void onAddPresenter(android.support.v17.leanback.widget.Presenter, int);
+    method protected void onAttachedToWindow(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
+    method protected void onBind(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
+    method public final void onBindViewHolder(android.support.v7.widget.RecyclerView.ViewHolder, int);
+    method protected void onCreate(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
+    method public final android.support.v7.widget.RecyclerView.ViewHolder onCreateViewHolder(android.view.ViewGroup, int);
+    method protected void onDetachedFromWindow(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
+    method protected void onUnbind(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
+    method public final void onViewAttachedToWindow(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public final void onViewDetachedFromWindow(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public final void onViewRecycled(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
+    method public void setAdapterListener(android.support.v17.leanback.widget.ItemBridgeAdapter.AdapterListener);
+    method public void setPresenterMapper(java.util.ArrayList<android.support.v17.leanback.widget.Presenter>);
+    method public void setWrapper(android.support.v17.leanback.widget.ItemBridgeAdapter.Wrapper);
+  }
+
+  public static class ItemBridgeAdapter.AdapterListener {
+    ctor public ItemBridgeAdapter.AdapterListener();
+    method public void onAddPresenter(android.support.v17.leanback.widget.Presenter, int);
+    method public void onAttachedToWindow(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
+    method public void onBind(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
+    method public void onCreate(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
+    method public void onDetachedFromWindow(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
+    method public void onUnbind(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
+  }
+
+  public class ItemBridgeAdapter.ViewHolder extends android.support.v7.widget.RecyclerView.ViewHolder implements android.support.v17.leanback.widget.FacetProvider {
+    method public final java.lang.Object getExtraObject();
+    method public java.lang.Object getFacet(java.lang.Class<?>);
+    method public final java.lang.Object getItem();
+    method public final android.support.v17.leanback.widget.Presenter getPresenter();
+    method public final android.support.v17.leanback.widget.Presenter.ViewHolder getViewHolder();
+    method public void setExtraObject(java.lang.Object);
+  }
+
+  public static abstract class ItemBridgeAdapter.Wrapper {
+    ctor public ItemBridgeAdapter.Wrapper();
+    method public abstract android.view.View createWrapper(android.view.View);
+    method public abstract void wrap(android.view.View, android.view.View);
+  }
+
+  public class ItemBridgeAdapterShadowOverlayWrapper extends android.support.v17.leanback.widget.ItemBridgeAdapter.Wrapper {
+    ctor public ItemBridgeAdapterShadowOverlayWrapper(android.support.v17.leanback.widget.ShadowOverlayHelper);
+    method public android.view.View createWrapper(android.view.View);
+    method public void wrap(android.view.View, android.view.View);
+  }
+
+  public class ListRow extends android.support.v17.leanback.widget.Row {
+    ctor public ListRow(android.support.v17.leanback.widget.HeaderItem, android.support.v17.leanback.widget.ObjectAdapter);
+    ctor public ListRow(long, android.support.v17.leanback.widget.HeaderItem, android.support.v17.leanback.widget.ObjectAdapter);
+    ctor public ListRow(android.support.v17.leanback.widget.ObjectAdapter);
+    method public final android.support.v17.leanback.widget.ObjectAdapter getAdapter();
+    method public java.lang.CharSequence getContentDescription();
+    method public void setContentDescription(java.lang.CharSequence);
+  }
+
+  public final class ListRowHoverCardView extends android.widget.LinearLayout {
+    ctor public ListRowHoverCardView(android.content.Context);
+    ctor public ListRowHoverCardView(android.content.Context, android.util.AttributeSet);
+    ctor public ListRowHoverCardView(android.content.Context, android.util.AttributeSet, int);
+    method public final java.lang.CharSequence getDescription();
+    method public final java.lang.CharSequence getTitle();
+    method public final void setDescription(java.lang.CharSequence);
+    method public final void setTitle(java.lang.CharSequence);
+  }
+
+  public class ListRowPresenter extends android.support.v17.leanback.widget.RowPresenter {
+    ctor public ListRowPresenter();
+    ctor public ListRowPresenter(int);
+    ctor public ListRowPresenter(int, boolean);
+    method public final boolean areChildRoundedCornersEnabled();
+    method protected android.support.v17.leanback.widget.RowPresenter.ViewHolder createRowViewHolder(android.view.ViewGroup);
+    method protected android.support.v17.leanback.widget.ShadowOverlayHelper.Options createShadowOverlayOptions();
+    method public final void enableChildRoundedCorners(boolean);
+    method public int getExpandedRowHeight();
+    method public final int getFocusZoomFactor();
+    method public final android.support.v17.leanback.widget.PresenterSelector getHoverCardPresenterSelector();
+    method public int getRecycledPoolSize(android.support.v17.leanback.widget.Presenter);
+    method public int getRowHeight();
+    method public final boolean getShadowEnabled();
+    method public final deprecated int getZoomFactor();
+    method public final boolean isFocusDimmerUsed();
+    method public final boolean isKeepChildForeground();
+    method public boolean isUsingDefaultListSelectEffect();
+    method public final boolean isUsingDefaultSelectEffect();
+    method public boolean isUsingDefaultShadow();
+    method public boolean isUsingZOrder(android.content.Context);
+    method public void setExpandedRowHeight(int);
+    method public final void setHoverCardPresenterSelector(android.support.v17.leanback.widget.PresenterSelector);
+    method public final void setKeepChildForeground(boolean);
+    method public void setNumRows(int);
+    method public void setRecycledPoolSize(android.support.v17.leanback.widget.Presenter, int);
+    method public void setRowHeight(int);
+    method public final void setShadowEnabled(boolean);
+  }
+
+  public static class ListRowPresenter.SelectItemViewHolderTask extends android.support.v17.leanback.widget.Presenter.ViewHolderTask {
+    ctor public ListRowPresenter.SelectItemViewHolderTask(int);
+    method public int getItemPosition();
+    method public android.support.v17.leanback.widget.Presenter.ViewHolderTask getItemTask();
+    method public boolean isSmoothScroll();
+    method public void setItemPosition(int);
+    method public void setItemTask(android.support.v17.leanback.widget.Presenter.ViewHolderTask);
+    method public void setSmoothScroll(boolean);
+  }
+
+  public static class ListRowPresenter.ViewHolder extends android.support.v17.leanback.widget.RowPresenter.ViewHolder {
+    ctor public ListRowPresenter.ViewHolder(android.view.View, android.support.v17.leanback.widget.HorizontalGridView, android.support.v17.leanback.widget.ListRowPresenter);
+    method public final android.support.v17.leanback.widget.ItemBridgeAdapter getBridgeAdapter();
+    method public final android.support.v17.leanback.widget.HorizontalGridView getGridView();
+    method public android.support.v17.leanback.widget.Presenter.ViewHolder getItemViewHolder(int);
+    method public final android.support.v17.leanback.widget.ListRowPresenter getListRowPresenter();
+    method public int getSelectedPosition();
+  }
+
+  public final class ListRowView extends android.widget.LinearLayout {
+    ctor public ListRowView(android.content.Context);
+    ctor public ListRowView(android.content.Context, android.util.AttributeSet);
+    ctor public ListRowView(android.content.Context, android.util.AttributeSet, int);
+    method public android.support.v17.leanback.widget.HorizontalGridView getGridView();
+  }
+
+  public abstract interface MultiActionsProvider {
+    method public abstract android.support.v17.leanback.widget.MultiActionsProvider.MultiAction[] getActions();
+  }
+
+  public static class MultiActionsProvider.MultiAction {
+    ctor public MultiActionsProvider.MultiAction(long);
+    method public android.graphics.drawable.Drawable getCurrentDrawable();
+    method public android.graphics.drawable.Drawable[] getDrawables();
+    method public long getId();
+    method public int getIndex();
+    method public void incrementIndex();
+    method public void setDrawables(android.graphics.drawable.Drawable[]);
+    method public void setIndex(int);
+  }
+
+  public abstract class ObjectAdapter {
+    ctor public ObjectAdapter(android.support.v17.leanback.widget.PresenterSelector);
+    ctor public ObjectAdapter(android.support.v17.leanback.widget.Presenter);
+    ctor public ObjectAdapter();
+    method public abstract java.lang.Object get(int);
+    method public long getId(int);
+    method public final android.support.v17.leanback.widget.Presenter getPresenter(java.lang.Object);
+    method public final android.support.v17.leanback.widget.PresenterSelector getPresenterSelector();
+    method public final boolean hasStableIds();
+    method protected final void notifyChanged();
+    method protected final void notifyItemRangeChanged(int, int);
+    method protected final void notifyItemRangeInserted(int, int);
+    method protected final void notifyItemRangeRemoved(int, int);
+    method protected void onHasStableIdsChanged();
+    method protected void onPresenterSelectorChanged();
+    method public final void registerObserver(android.support.v17.leanback.widget.ObjectAdapter.DataObserver);
+    method public final void setHasStableIds(boolean);
+    method public final void setPresenterSelector(android.support.v17.leanback.widget.PresenterSelector);
+    method public abstract int size();
+    method public final void unregisterAllObservers();
+    method public final void unregisterObserver(android.support.v17.leanback.widget.ObjectAdapter.DataObserver);
+    field public static final int NO_ID = -1; // 0xffffffff
+  }
+
+  public static abstract class ObjectAdapter.DataObserver {
+    ctor public ObjectAdapter.DataObserver();
+    method public void onChanged();
+    method public void onItemRangeChanged(int, int);
+    method public void onItemRangeInserted(int, int);
+    method public void onItemRangeRemoved(int, int);
+  }
+
+  public abstract interface OnActionClickedListener {
+    method public abstract void onActionClicked(android.support.v17.leanback.widget.Action);
+  }
+
+  public abstract interface OnChildLaidOutListener {
+    method public abstract void onChildLaidOut(android.view.ViewGroup, android.view.View, int, long);
+  }
+
+  public abstract deprecated interface OnChildSelectedListener {
+    method public abstract void onChildSelected(android.view.ViewGroup, android.view.View, int, long);
+  }
+
+  public abstract class OnChildViewHolderSelectedListener {
+    ctor public OnChildViewHolderSelectedListener();
+    method public void onChildViewHolderSelected(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder, int, int);
+  }
+
+  public abstract interface OnItemViewClickedListener implements android.support.v17.leanback.widget.BaseOnItemViewClickedListener {
+  }
+
+  public abstract interface OnItemViewSelectedListener implements android.support.v17.leanback.widget.BaseOnItemViewSelectedListener {
+  }
+
+  public class PageRow extends android.support.v17.leanback.widget.Row {
+    ctor public PageRow(android.support.v17.leanback.widget.HeaderItem);
+    method public final boolean isRenderedAsRowView();
+  }
+
+  public class PlaybackControlsRow extends android.support.v17.leanback.widget.Row {
+    ctor public PlaybackControlsRow(java.lang.Object);
+    ctor public PlaybackControlsRow();
+    method public android.support.v17.leanback.widget.Action getActionForKeyCode(int);
+    method public android.support.v17.leanback.widget.Action getActionForKeyCode(android.support.v17.leanback.widget.ObjectAdapter, int);
+    method public int getBufferedProgress();
+    method public int getCurrentTime();
+    method public final android.graphics.drawable.Drawable getImageDrawable();
+    method public final java.lang.Object getItem();
+    method public final android.support.v17.leanback.widget.ObjectAdapter getPrimaryActionsAdapter();
+    method public final android.support.v17.leanback.widget.ObjectAdapter getSecondaryActionsAdapter();
+    method public int getTotalTime();
+    method public void setBufferedProgress(int);
+    method public void setCurrentTime(int);
+    method public final void setImageBitmap(android.content.Context, android.graphics.Bitmap);
+    method public final void setImageDrawable(android.graphics.drawable.Drawable);
+    method public final void setPrimaryActionsAdapter(android.support.v17.leanback.widget.ObjectAdapter);
+    method public final void setSecondaryActionsAdapter(android.support.v17.leanback.widget.ObjectAdapter);
+    method public void setTotalTime(int);
+  }
+
+  public static class PlaybackControlsRow.ClosedCaptioningAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
+    ctor public PlaybackControlsRow.ClosedCaptioningAction(android.content.Context);
+    ctor public PlaybackControlsRow.ClosedCaptioningAction(android.content.Context, int);
+    field public static int OFF;
+    field public static int ON;
+  }
+
+  public static class PlaybackControlsRow.FastForwardAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
+    ctor public PlaybackControlsRow.FastForwardAction(android.content.Context);
+    ctor public PlaybackControlsRow.FastForwardAction(android.content.Context, int);
+  }
+
+  public static class PlaybackControlsRow.HighQualityAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
+    ctor public PlaybackControlsRow.HighQualityAction(android.content.Context);
+    ctor public PlaybackControlsRow.HighQualityAction(android.content.Context, int);
+    field public static int OFF;
+    field public static int ON;
+  }
+
+  public static class PlaybackControlsRow.MoreActions extends android.support.v17.leanback.widget.Action {
+    ctor public PlaybackControlsRow.MoreActions(android.content.Context);
+  }
+
+  public static abstract class PlaybackControlsRow.MultiAction extends android.support.v17.leanback.widget.Action {
+    ctor public PlaybackControlsRow.MultiAction(int);
+    method public int getActionCount();
+    method public android.graphics.drawable.Drawable getDrawable(int);
+    method public int getIndex();
+    method public java.lang.String getLabel(int);
+    method public java.lang.String getSecondaryLabel(int);
+    method public void nextIndex();
+    method public void setDrawables(android.graphics.drawable.Drawable[]);
+    method public void setIndex(int);
+    method public void setLabels(java.lang.String[]);
+    method public void setSecondaryLabels(java.lang.String[]);
+  }
+
+  public static class PlaybackControlsRow.PictureInPictureAction extends android.support.v17.leanback.widget.Action {
+    ctor public PlaybackControlsRow.PictureInPictureAction(android.content.Context);
+  }
+
+  public static class PlaybackControlsRow.PlayPauseAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
+    ctor public PlaybackControlsRow.PlayPauseAction(android.content.Context);
+    field public static int PAUSE;
+    field public static int PLAY;
+  }
+
+  public static class PlaybackControlsRow.RepeatAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
+    ctor public PlaybackControlsRow.RepeatAction(android.content.Context);
+    ctor public PlaybackControlsRow.RepeatAction(android.content.Context, int);
+    ctor public PlaybackControlsRow.RepeatAction(android.content.Context, int, int);
+    field public static int ALL;
+    field public static int NONE;
+    field public static int ONE;
+  }
+
+  public static class PlaybackControlsRow.RewindAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
+    ctor public PlaybackControlsRow.RewindAction(android.content.Context);
+    ctor public PlaybackControlsRow.RewindAction(android.content.Context, int);
+  }
+
+  public static class PlaybackControlsRow.ShuffleAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
+    ctor public PlaybackControlsRow.ShuffleAction(android.content.Context);
+    ctor public PlaybackControlsRow.ShuffleAction(android.content.Context, int);
+    field public static int OFF;
+    field public static int ON;
+  }
+
+  public static class PlaybackControlsRow.SkipNextAction extends android.support.v17.leanback.widget.Action {
+    ctor public PlaybackControlsRow.SkipNextAction(android.content.Context);
+  }
+
+  public static class PlaybackControlsRow.SkipPreviousAction extends android.support.v17.leanback.widget.Action {
+    ctor public PlaybackControlsRow.SkipPreviousAction(android.content.Context);
+  }
+
+  public static abstract class PlaybackControlsRow.ThumbsAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
+    ctor public PlaybackControlsRow.ThumbsAction(int, android.content.Context, int, int);
+    field public static int OUTLINE;
+    field public static int SOLID;
+  }
+
+  public static class PlaybackControlsRow.ThumbsDownAction extends android.support.v17.leanback.widget.PlaybackControlsRow.ThumbsAction {
+    ctor public PlaybackControlsRow.ThumbsDownAction(android.content.Context);
+  }
+
+  public static class PlaybackControlsRow.ThumbsUpAction extends android.support.v17.leanback.widget.PlaybackControlsRow.ThumbsAction {
+    ctor public PlaybackControlsRow.ThumbsUpAction(android.content.Context);
+  }
+
+  public class PlaybackControlsRowPresenter extends android.support.v17.leanback.widget.RowPresenter {
+    ctor public PlaybackControlsRowPresenter(android.support.v17.leanback.widget.Presenter);
+    ctor public PlaybackControlsRowPresenter();
+    method public boolean areSecondaryActionsHidden();
+    method protected android.support.v17.leanback.widget.RowPresenter.ViewHolder createRowViewHolder(android.view.ViewGroup);
+    method public int getBackgroundColor();
+    method public android.support.v17.leanback.widget.OnActionClickedListener getOnActionClickedListener();
+    method public int getProgressColor();
+    method public void setBackgroundColor(int);
+    method public void setOnActionClickedListener(android.support.v17.leanback.widget.OnActionClickedListener);
+    method public void setProgressColor(int);
+    method public void setSecondaryActionsHidden(boolean);
+    method public void showBottomSpace(android.support.v17.leanback.widget.PlaybackControlsRowPresenter.ViewHolder, boolean);
+    method public void showPrimaryActions(android.support.v17.leanback.widget.PlaybackControlsRowPresenter.ViewHolder);
+  }
+
+  public class PlaybackControlsRowPresenter.ViewHolder extends android.support.v17.leanback.widget.RowPresenter.ViewHolder {
+    field public final android.support.v17.leanback.widget.Presenter.ViewHolder mDescriptionViewHolder;
+  }
+
+  public abstract class Presenter implements android.support.v17.leanback.widget.FacetProvider {
+    ctor public Presenter();
+    method protected static void cancelAnimationsRecursive(android.view.View);
+    method public final java.lang.Object getFacet(java.lang.Class<?>);
+    method public abstract void onBindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object);
+    method public abstract android.support.v17.leanback.widget.Presenter.ViewHolder onCreateViewHolder(android.view.ViewGroup);
+    method public abstract void onUnbindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
+    method public void onViewAttachedToWindow(android.support.v17.leanback.widget.Presenter.ViewHolder);
+    method public void onViewDetachedFromWindow(android.support.v17.leanback.widget.Presenter.ViewHolder);
+    method public final void setFacet(java.lang.Class<?>, java.lang.Object);
+    method public void setOnClickListener(android.support.v17.leanback.widget.Presenter.ViewHolder, android.view.View.OnClickListener);
+  }
+
+  public static class Presenter.ViewHolder implements android.support.v17.leanback.widget.FacetProvider {
+    ctor public Presenter.ViewHolder(android.view.View);
+    method public final java.lang.Object getFacet(java.lang.Class<?>);
+    method public final void setFacet(java.lang.Class<?>, java.lang.Object);
+    field public final android.view.View view;
+  }
+
+  public static abstract class Presenter.ViewHolderTask {
+    ctor public Presenter.ViewHolderTask();
+    method public void run(android.support.v17.leanback.widget.Presenter.ViewHolder);
+  }
+
+  public abstract class PresenterSelector {
+    ctor public PresenterSelector();
+    method public abstract android.support.v17.leanback.widget.Presenter getPresenter(java.lang.Object);
+    method public android.support.v17.leanback.widget.Presenter[] getPresenters();
+  }
+
+  public abstract class PresenterSwitcher {
+    ctor public PresenterSwitcher();
+    method public void clear();
+    method public final android.view.ViewGroup getParentViewGroup();
+    method public void init(android.view.ViewGroup, android.support.v17.leanback.widget.PresenterSelector);
+    method protected abstract void insertView(android.view.View);
+    method protected void onViewSelected(android.view.View);
+    method public void select(java.lang.Object);
+    method protected void showView(android.view.View, boolean);
+    method public void unselect();
+  }
+
+  public class Row {
+    ctor public Row(long, android.support.v17.leanback.widget.HeaderItem);
+    ctor public Row(android.support.v17.leanback.widget.HeaderItem);
+    ctor public Row();
+    method public final android.support.v17.leanback.widget.HeaderItem getHeaderItem();
+    method public final long getId();
+    method public boolean isRenderedAsRowView();
+    method public final void setHeaderItem(android.support.v17.leanback.widget.HeaderItem);
+    method public final void setId(long);
+  }
+
+  public class RowHeaderPresenter extends android.support.v17.leanback.widget.Presenter {
+    ctor public RowHeaderPresenter();
+    method protected static float getFontDescent(android.widget.TextView, android.graphics.Paint);
+    method public int getSpaceUnderBaseline(android.support.v17.leanback.widget.RowHeaderPresenter.ViewHolder);
+    method public boolean isNullItemVisibilityGone();
+    method public void onBindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object);
+    method public android.support.v17.leanback.widget.Presenter.ViewHolder onCreateViewHolder(android.view.ViewGroup);
+    method protected void onSelectLevelChanged(android.support.v17.leanback.widget.RowHeaderPresenter.ViewHolder);
+    method public void onUnbindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
+    method public void setNullItemVisibilityGone(boolean);
+    method public final void setSelectLevel(android.support.v17.leanback.widget.RowHeaderPresenter.ViewHolder, float);
+  }
+
+  public static class RowHeaderPresenter.ViewHolder extends android.support.v17.leanback.widget.Presenter.ViewHolder {
+    ctor public RowHeaderPresenter.ViewHolder(android.view.View);
+    method public final float getSelectLevel();
+  }
+
+  public final class RowHeaderView extends android.widget.TextView {
+    ctor public RowHeaderView(android.content.Context);
+    ctor public RowHeaderView(android.content.Context, android.util.AttributeSet);
+    ctor public RowHeaderView(android.content.Context, android.util.AttributeSet, int);
+  }
+
+  public abstract class RowPresenter extends android.support.v17.leanback.widget.Presenter {
+    ctor public RowPresenter();
+    method protected abstract android.support.v17.leanback.widget.RowPresenter.ViewHolder createRowViewHolder(android.view.ViewGroup);
+    method protected void dispatchItemSelectedListener(android.support.v17.leanback.widget.RowPresenter.ViewHolder, boolean);
+    method public void freeze(android.support.v17.leanback.widget.RowPresenter.ViewHolder, boolean);
+    method public final android.support.v17.leanback.widget.RowHeaderPresenter getHeaderPresenter();
+    method public final android.support.v17.leanback.widget.RowPresenter.ViewHolder getRowViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
+    method public final boolean getSelectEffectEnabled();
+    method public final float getSelectLevel(android.support.v17.leanback.widget.Presenter.ViewHolder);
+    method public final int getSyncActivatePolicy();
+    method protected void initializeRowViewHolder(android.support.v17.leanback.widget.RowPresenter.ViewHolder);
+    method protected boolean isClippingChildren();
+    method public boolean isUsingDefaultSelectEffect();
+    method protected void onBindRowViewHolder(android.support.v17.leanback.widget.RowPresenter.ViewHolder, java.lang.Object);
+    method public final void onBindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object);
+    method public final android.support.v17.leanback.widget.Presenter.ViewHolder onCreateViewHolder(android.view.ViewGroup);
+    method protected void onRowViewAttachedToWindow(android.support.v17.leanback.widget.RowPresenter.ViewHolder);
+    method protected void onRowViewDetachedFromWindow(android.support.v17.leanback.widget.RowPresenter.ViewHolder);
+    method protected void onRowViewExpanded(android.support.v17.leanback.widget.RowPresenter.ViewHolder, boolean);
+    method protected void onRowViewSelected(android.support.v17.leanback.widget.RowPresenter.ViewHolder, boolean);
+    method protected void onSelectLevelChanged(android.support.v17.leanback.widget.RowPresenter.ViewHolder);
+    method protected void onUnbindRowViewHolder(android.support.v17.leanback.widget.RowPresenter.ViewHolder);
+    method public final void onUnbindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
+    method public final void onViewAttachedToWindow(android.support.v17.leanback.widget.Presenter.ViewHolder);
+    method public final void onViewDetachedFromWindow(android.support.v17.leanback.widget.Presenter.ViewHolder);
+    method public void setEntranceTransitionState(android.support.v17.leanback.widget.RowPresenter.ViewHolder, boolean);
+    method public final void setHeaderPresenter(android.support.v17.leanback.widget.RowHeaderPresenter);
+    method public final void setRowViewExpanded(android.support.v17.leanback.widget.Presenter.ViewHolder, boolean);
+    method public final void setRowViewSelected(android.support.v17.leanback.widget.Presenter.ViewHolder, boolean);
+    method public final void setSelectEffectEnabled(boolean);
+    method public final void setSelectLevel(android.support.v17.leanback.widget.Presenter.ViewHolder, float);
+    method public final void setSyncActivatePolicy(int);
+    field public static final int SYNC_ACTIVATED_CUSTOM = 0; // 0x0
+    field public static final int SYNC_ACTIVATED_TO_EXPANDED = 1; // 0x1
+    field public static final int SYNC_ACTIVATED_TO_EXPANDED_AND_SELECTED = 3; // 0x3
+    field public static final int SYNC_ACTIVATED_TO_SELECTED = 2; // 0x2
+  }
+
+  public static class RowPresenter.ViewHolder extends android.support.v17.leanback.widget.Presenter.ViewHolder {
+    ctor public RowPresenter.ViewHolder(android.view.View);
+    method public final android.support.v17.leanback.widget.RowHeaderPresenter.ViewHolder getHeaderViewHolder();
+    method public final android.support.v17.leanback.widget.BaseOnItemViewClickedListener getOnItemViewClickedListener();
+    method public final android.support.v17.leanback.widget.BaseOnItemViewSelectedListener getOnItemViewSelectedListener();
+    method public android.view.View.OnKeyListener getOnKeyListener();
+    method public final android.support.v17.leanback.widget.Row getRow();
+    method public final java.lang.Object getRowObject();
+    method public final float getSelectLevel();
+    method public final boolean isExpanded();
+    method public final boolean isSelected();
+    method public final void setActivated(boolean);
+    method public final void setOnItemViewClickedListener(android.support.v17.leanback.widget.BaseOnItemViewClickedListener);
+    method public final void setOnItemViewSelectedListener(android.support.v17.leanback.widget.BaseOnItemViewSelectedListener);
+    method public void setOnKeyListener(android.view.View.OnKeyListener);
+    method public final void syncActivatedStatus(android.view.View);
+    field protected final android.support.v17.leanback.graphics.ColorOverlayDimmer mColorDimmer;
+  }
+
+  public class SearchBar extends android.widget.RelativeLayout {
+    ctor public SearchBar(android.content.Context);
+    ctor public SearchBar(android.content.Context, android.util.AttributeSet);
+    ctor public SearchBar(android.content.Context, android.util.AttributeSet, int);
+    method public void displayCompletions(java.util.List<java.lang.String>);
+    method public void displayCompletions(android.view.inputmethod.CompletionInfo[]);
+    method public android.graphics.drawable.Drawable getBadgeDrawable();
+    method public java.lang.CharSequence getHint();
+    method public java.lang.String getTitle();
+    method public boolean isRecognizing();
+    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
+    method public void setPermissionListener(android.support.v17.leanback.widget.SearchBar.SearchBarPermissionListener);
+    method public void setSearchBarListener(android.support.v17.leanback.widget.SearchBar.SearchBarListener);
+    method public void setSearchQuery(java.lang.String);
+    method public void setSpeechRecognitionCallback(android.support.v17.leanback.widget.SpeechRecognitionCallback);
+    method public void setSpeechRecognizer(android.speech.SpeechRecognizer);
+    method public void setTitle(java.lang.String);
+    method public void startRecognition();
+    method public void stopRecognition();
+  }
+
+  public static abstract interface SearchBar.SearchBarListener {
+    method public abstract void onKeyboardDismiss(java.lang.String);
+    method public abstract void onSearchQueryChange(java.lang.String);
+    method public abstract void onSearchQuerySubmit(java.lang.String);
+  }
+
+  public static abstract interface SearchBar.SearchBarPermissionListener {
+    method public abstract void requestAudioPermission();
+  }
+
+  public class SearchEditText extends android.support.v17.leanback.widget.StreamingTextView {
+    ctor public SearchEditText(android.content.Context);
+    ctor public SearchEditText(android.content.Context, android.util.AttributeSet);
+    ctor public SearchEditText(android.content.Context, android.util.AttributeSet, int);
+    method public void setOnKeyboardDismissListener(android.support.v17.leanback.widget.SearchEditText.OnKeyboardDismissListener);
+  }
+
+  public static abstract interface SearchEditText.OnKeyboardDismissListener {
+    method public abstract void onKeyboardDismiss();
+  }
+
+  public class SearchOrbView extends android.widget.FrameLayout implements android.view.View.OnClickListener {
+    ctor public SearchOrbView(android.content.Context);
+    ctor public SearchOrbView(android.content.Context, android.util.AttributeSet);
+    ctor public SearchOrbView(android.content.Context, android.util.AttributeSet, int);
+    method public void enableOrbColorAnimation(boolean);
+    method public int getOrbColor();
+    method public android.support.v17.leanback.widget.SearchOrbView.Colors getOrbColors();
+    method public android.graphics.drawable.Drawable getOrbIcon();
+    method public void onClick(android.view.View);
+    method public void setOnOrbClickedListener(android.view.View.OnClickListener);
+    method public void setOrbColor(int);
+    method public deprecated void setOrbColor(int, int);
+    method public void setOrbColors(android.support.v17.leanback.widget.SearchOrbView.Colors);
+    method public void setOrbIcon(android.graphics.drawable.Drawable);
+  }
+
+  public static class SearchOrbView.Colors {
+    ctor public SearchOrbView.Colors(int);
+    ctor public SearchOrbView.Colors(int, int);
+    ctor public SearchOrbView.Colors(int, int, int);
+    method public static int getBrightColor(int);
+    field public int brightColor;
+    field public int color;
+    field public int iconColor;
+  }
+
+  public class SectionRow extends android.support.v17.leanback.widget.Row {
+    ctor public SectionRow(android.support.v17.leanback.widget.HeaderItem);
+    ctor public SectionRow(long, java.lang.String);
+    ctor public SectionRow(java.lang.String);
+    method public final boolean isRenderedAsRowView();
+  }
+
+  public class ShadowOverlayContainer extends android.widget.FrameLayout {
+    ctor public ShadowOverlayContainer(android.content.Context);
+    ctor public ShadowOverlayContainer(android.content.Context, android.util.AttributeSet);
+    ctor public ShadowOverlayContainer(android.content.Context, android.util.AttributeSet, int);
+    method public int getShadowType();
+    method public android.view.View getWrappedView();
+    method public deprecated void initialize(boolean, boolean);
+    method public deprecated void initialize(boolean, boolean, boolean);
+    method public static void prepareParentForShadow(android.view.ViewGroup);
+    method public void setOverlayColor(int);
+    method public void setShadowFocusLevel(float);
+    method public static boolean supportsDynamicShadow();
+    method public static boolean supportsShadow();
+    method public void useDynamicShadow();
+    method public void useDynamicShadow(float, float);
+    method public void useStaticShadow();
+    method public void wrap(android.view.View);
+    field public static final int SHADOW_DYNAMIC = 3; // 0x3
+    field public static final int SHADOW_NONE = 1; // 0x1
+    field public static final int SHADOW_STATIC = 2; // 0x2
+  }
+
+  public final class ShadowOverlayHelper {
+    method public android.support.v17.leanback.widget.ShadowOverlayContainer createShadowOverlayContainer(android.content.Context);
+    method public int getShadowType();
+    method public boolean needsOverlay();
+    method public boolean needsRoundedCorner();
+    method public boolean needsWrapper();
+    method public void onViewCreated(android.view.View);
+    method public void prepareParentForShadow(android.view.ViewGroup);
+    method public static void setNoneWrapperOverlayColor(android.view.View, int);
+    method public static void setNoneWrapperShadowFocusLevel(android.view.View, float);
+    method public void setOverlayColor(android.view.View, int);
+    method public void setShadowFocusLevel(android.view.View, float);
+    method public static boolean supportsDynamicShadow();
+    method public static boolean supportsForeground();
+    method public static boolean supportsRoundedCorner();
+    method public static boolean supportsShadow();
+    field public static final int SHADOW_DYNAMIC = 3; // 0x3
+    field public static final int SHADOW_NONE = 1; // 0x1
+    field public static final int SHADOW_STATIC = 2; // 0x2
+  }
+
+  public static final class ShadowOverlayHelper.Builder {
+    ctor public ShadowOverlayHelper.Builder();
+    method public android.support.v17.leanback.widget.ShadowOverlayHelper build(android.content.Context);
+    method public android.support.v17.leanback.widget.ShadowOverlayHelper.Builder keepForegroundDrawable(boolean);
+    method public android.support.v17.leanback.widget.ShadowOverlayHelper.Builder needsOverlay(boolean);
+    method public android.support.v17.leanback.widget.ShadowOverlayHelper.Builder needsRoundedCorner(boolean);
+    method public android.support.v17.leanback.widget.ShadowOverlayHelper.Builder needsShadow(boolean);
+    method public android.support.v17.leanback.widget.ShadowOverlayHelper.Builder options(android.support.v17.leanback.widget.ShadowOverlayHelper.Options);
+    method public android.support.v17.leanback.widget.ShadowOverlayHelper.Builder preferZOrder(boolean);
+  }
+
+  public static final class ShadowOverlayHelper.Options {
+    ctor public ShadowOverlayHelper.Options();
+    method public android.support.v17.leanback.widget.ShadowOverlayHelper.Options dynamicShadowZ(float, float);
+    method public final float getDynamicShadowFocusedZ();
+    method public final float getDynamicShadowUnfocusedZ();
+    method public final int getRoundedCornerRadius();
+    method public android.support.v17.leanback.widget.ShadowOverlayHelper.Options roundedCornerRadius(int);
+    field public static final android.support.v17.leanback.widget.ShadowOverlayHelper.Options DEFAULT;
+  }
+
+  public final class SinglePresenterSelector extends android.support.v17.leanback.widget.PresenterSelector {
+    ctor public SinglePresenterSelector(android.support.v17.leanback.widget.Presenter);
+    method public android.support.v17.leanback.widget.Presenter getPresenter(java.lang.Object);
+  }
+
+  public class SparseArrayObjectAdapter extends android.support.v17.leanback.widget.ObjectAdapter {
+    ctor public SparseArrayObjectAdapter(android.support.v17.leanback.widget.PresenterSelector);
+    ctor public SparseArrayObjectAdapter(android.support.v17.leanback.widget.Presenter);
+    ctor public SparseArrayObjectAdapter();
+    method public void clear(int);
+    method public void clear();
+    method public java.lang.Object get(int);
+    method public int indexOf(java.lang.Object);
+    method public int indexOf(int);
+    method public java.lang.Object lookup(int);
+    method public void notifyArrayItemRangeChanged(int, int);
+    method public void set(int, java.lang.Object);
+    method public int size();
+  }
+
+  public class SpeechOrbView extends android.support.v17.leanback.widget.SearchOrbView {
+    ctor public SpeechOrbView(android.content.Context);
+    ctor public SpeechOrbView(android.content.Context, android.util.AttributeSet);
+    ctor public SpeechOrbView(android.content.Context, android.util.AttributeSet, int);
+    method public void setSoundLevel(int);
+    method public void showListening();
+    method public void showNotListening();
+  }
+
+  public abstract interface SpeechRecognitionCallback {
+    method public abstract void recognizeSpeech();
+  }
+
+   class StreamingTextView extends android.widget.EditText {
+    ctor public StreamingTextView(android.content.Context, android.util.AttributeSet);
+    ctor public StreamingTextView(android.content.Context, android.util.AttributeSet, int);
+    method public static boolean isLayoutRtl(android.view.View);
+    method public void reset();
+    method public void setFinalRecognizedText(java.lang.CharSequence);
+    method public void updateRecognizedText(java.lang.String, java.lang.String);
+    method public void updateRecognizedText(java.lang.String, java.util.List<java.lang.Float>);
+  }
+
+  public class TitleHelper {
+    ctor public TitleHelper(android.view.ViewGroup, android.view.View);
+    method public android.support.v17.leanback.widget.BrowseFrameLayout.OnFocusSearchListener getOnFocusSearchListener();
+    method public android.view.ViewGroup getSceneRoot();
+    method public android.view.View getTitleView();
+    method public void showTitle(boolean);
+  }
+
+  public class TitleView extends android.widget.FrameLayout implements android.support.v17.leanback.widget.TitleViewAdapter.Provider {
+    ctor public TitleView(android.content.Context);
+    ctor public TitleView(android.content.Context, android.util.AttributeSet);
+    ctor public TitleView(android.content.Context, android.util.AttributeSet, int);
+    method public void enableAnimation(boolean);
+    method public android.graphics.drawable.Drawable getBadgeDrawable();
+    method public android.support.v17.leanback.widget.SearchOrbView.Colors getSearchAffordanceColors();
+    method public android.view.View getSearchAffordanceView();
+    method public java.lang.CharSequence getTitle();
+    method public android.support.v17.leanback.widget.TitleViewAdapter getTitleViewAdapter();
+    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
+    method public void setOnSearchClickedListener(android.view.View.OnClickListener);
+    method public void setSearchAffordanceColors(android.support.v17.leanback.widget.SearchOrbView.Colors);
+    method public void setTitle(java.lang.CharSequence);
+    method public void updateComponentsVisibility(int);
+  }
+
+  public abstract class TitleViewAdapter {
+    ctor public TitleViewAdapter();
+    method public android.graphics.drawable.Drawable getBadgeDrawable();
+    method public android.support.v17.leanback.widget.SearchOrbView.Colors getSearchAffordanceColors();
+    method public abstract android.view.View getSearchAffordanceView();
+    method public java.lang.CharSequence getTitle();
+    method public void setAnimationEnabled(boolean);
+    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
+    method public void setOnSearchClickedListener(android.view.View.OnClickListener);
+    method public void setSearchAffordanceColors(android.support.v17.leanback.widget.SearchOrbView.Colors);
+    method public void setTitle(java.lang.CharSequence);
+    method public void updateComponentsVisibility(int);
+    field public static final int BRANDING_VIEW_VISIBLE = 2; // 0x2
+    field public static final int FULL_VIEW_VISIBLE = 6; // 0x6
+    field public static final int SEARCH_VIEW_VISIBLE = 4; // 0x4
+  }
+
+  public static abstract interface TitleViewAdapter.Provider {
+    method public abstract android.support.v17.leanback.widget.TitleViewAdapter getTitleViewAdapter();
+  }
+
+  public class VerticalGridPresenter extends android.support.v17.leanback.widget.Presenter {
+    ctor public VerticalGridPresenter();
+    ctor public VerticalGridPresenter(int);
+    ctor public VerticalGridPresenter(int, boolean);
+    method public final boolean areChildRoundedCornersEnabled();
+    method protected android.support.v17.leanback.widget.VerticalGridPresenter.ViewHolder createGridViewHolder(android.view.ViewGroup);
+    method protected android.support.v17.leanback.widget.ShadowOverlayHelper.Options createShadowOverlayOptions();
+    method public final void enableChildRoundedCorners(boolean);
+    method public final int getFocusZoomFactor();
+    method public final boolean getKeepChildForeground();
+    method public int getNumberOfColumns();
+    method public final android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
+    method public final android.support.v17.leanback.widget.OnItemViewSelectedListener getOnItemViewSelectedListener();
+    method public final boolean getShadowEnabled();
+    method protected void initializeGridViewHolder(android.support.v17.leanback.widget.VerticalGridPresenter.ViewHolder);
+    method public final boolean isFocusDimmerUsed();
+    method public boolean isUsingDefaultShadow();
+    method public boolean isUsingZOrder(android.content.Context);
+    method public void onBindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object);
+    method public final android.support.v17.leanback.widget.VerticalGridPresenter.ViewHolder onCreateViewHolder(android.view.ViewGroup);
+    method public void onUnbindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
+    method public void setEntranceTransitionState(android.support.v17.leanback.widget.VerticalGridPresenter.ViewHolder, boolean);
+    method public final void setKeepChildForeground(boolean);
+    method public void setNumberOfColumns(int);
+    method public final void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
+    method public final void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
+    method public final void setShadowEnabled(boolean);
+  }
+
+  public static class VerticalGridPresenter.ViewHolder extends android.support.v17.leanback.widget.Presenter.ViewHolder {
+    ctor public VerticalGridPresenter.ViewHolder(android.support.v17.leanback.widget.VerticalGridView);
+    method public android.support.v17.leanback.widget.VerticalGridView getGridView();
+  }
+
+  public class VerticalGridView extends android.support.v7.widget.RecyclerView {
+    ctor public VerticalGridView(android.content.Context);
+    ctor public VerticalGridView(android.content.Context, android.util.AttributeSet);
+    ctor public VerticalGridView(android.content.Context, android.util.AttributeSet, int);
+    method protected void initAttributes(android.content.Context, android.util.AttributeSet);
+    method public void setColumnWidth(int);
+    method public void setNumColumns(int);
+  }
+
+  public abstract interface ViewHolderTask {
+    method public abstract void run(android.support.v7.widget.RecyclerView.ViewHolder);
+  }
+
+}
+
+package android.support.v17.leanback.widget.picker {
+
+  public class Picker extends android.widget.FrameLayout {
+    ctor public Picker(android.content.Context, android.util.AttributeSet, int);
+    method public void addOnValueChangedListener(android.support.v17.leanback.widget.picker.Picker.PickerValueListener);
+    method public float getActivatedVisibleItemCount();
+    method public android.support.v17.leanback.widget.picker.PickerColumn getColumnAt(int);
+    method public int getColumnsCount();
+    method protected int getPickerItemHeightPixels();
+    method public final int getPickerItemLayoutId();
+    method public final int getPickerItemTextViewId();
+    method public int getSelectedColumn();
+    method public final java.lang.CharSequence getSeparator();
+    method public float getVisibleItemCount();
+    method public void onColumnValueChanged(int, int);
+    method public void removeOnValueChangedListener(android.support.v17.leanback.widget.picker.Picker.PickerValueListener);
+    method public void setActivatedVisibleItemCount(float);
+    method public void setColumnAt(int, android.support.v17.leanback.widget.picker.PickerColumn);
+    method public void setColumnValue(int, int, boolean);
+    method public void setColumns(java.util.List<android.support.v17.leanback.widget.picker.PickerColumn>);
+    method public final void setPickerItemTextViewId(int);
+    method public void setSelectedColumn(int);
+    method public final void setSeparator(java.lang.CharSequence);
+    method public void setVisibleItemCount(float);
+  }
+
+  public static abstract interface Picker.PickerValueListener {
+    method public abstract void onValueChanged(android.support.v17.leanback.widget.picker.Picker, int);
+  }
+
+  public class PickerColumn {
+    ctor public PickerColumn();
+    method public int getCount();
+    method public int getCurrentValue();
+    method public java.lang.CharSequence getLabelFor(int);
+    method public java.lang.String getLabelFormat();
+    method public int getMaxValue();
+    method public int getMinValue();
+    method public java.lang.CharSequence[] getStaticLabels();
+    method public void setCurrentValue(int);
+    method public void setLabelFormat(java.lang.String);
+    method public void setMaxValue(int);
+    method public void setMinValue(int);
+    method public void setStaticLabels(java.lang.CharSequence[]);
+  }
+
+}
+
+package android.support.v17.preference {
+
+  public abstract class BaseLeanbackPreferenceFragment extends android.support.v14.preference.PreferenceFragment {
+    ctor public BaseLeanbackPreferenceFragment();
+  }
+
+  public class LeanbackListPreferenceDialogFragment extends android.support.v17.preference.LeanbackPreferenceDialogFragment {
+    ctor public LeanbackListPreferenceDialogFragment();
+    method public static android.support.v17.preference.LeanbackListPreferenceDialogFragment newInstanceMulti(java.lang.String);
+    method public static android.support.v17.preference.LeanbackListPreferenceDialogFragment newInstanceSingle(java.lang.String);
+    method public android.support.v7.widget.RecyclerView.Adapter onCreateAdapter();
+  }
+
+  public class LeanbackListPreferenceDialogFragment.AdapterMulti extends android.support.v7.widget.RecyclerView.Adapter implements android.support.v17.preference.LeanbackListPreferenceDialogFragment.ViewHolder.OnItemClickListener {
+    ctor public LeanbackListPreferenceDialogFragment.AdapterMulti(java.lang.CharSequence[], java.lang.CharSequence[], java.util.Set<java.lang.String>);
+    method public int getItemCount();
+    method public void onBindViewHolder(android.support.v17.preference.LeanbackListPreferenceDialogFragment.ViewHolder, int);
+    method public android.support.v17.preference.LeanbackListPreferenceDialogFragment.ViewHolder onCreateViewHolder(android.view.ViewGroup, int);
+    method public void onItemClick(android.support.v17.preference.LeanbackListPreferenceDialogFragment.ViewHolder);
+  }
+
+  public class LeanbackListPreferenceDialogFragment.AdapterSingle extends android.support.v7.widget.RecyclerView.Adapter implements android.support.v17.preference.LeanbackListPreferenceDialogFragment.ViewHolder.OnItemClickListener {
+    ctor public LeanbackListPreferenceDialogFragment.AdapterSingle(java.lang.CharSequence[], java.lang.CharSequence[], java.lang.CharSequence);
+    method public int getItemCount();
+    method public void onBindViewHolder(android.support.v17.preference.LeanbackListPreferenceDialogFragment.ViewHolder, int);
+    method public android.support.v17.preference.LeanbackListPreferenceDialogFragment.ViewHolder onCreateViewHolder(android.view.ViewGroup, int);
+    method public void onItemClick(android.support.v17.preference.LeanbackListPreferenceDialogFragment.ViewHolder);
+  }
+
+  public static class LeanbackListPreferenceDialogFragment.ViewHolder extends android.support.v7.widget.RecyclerView.ViewHolder implements android.view.View.OnClickListener {
+    ctor public LeanbackListPreferenceDialogFragment.ViewHolder(android.view.View, android.support.v17.preference.LeanbackListPreferenceDialogFragment.ViewHolder.OnItemClickListener);
+    method public android.view.ViewGroup getContainer();
+    method public android.widget.TextView getTitleView();
+    method public android.widget.Checkable getWidgetView();
+    method public void onClick(android.view.View);
+  }
+
+  public static abstract interface LeanbackListPreferenceDialogFragment.ViewHolder.OnItemClickListener {
+    method public abstract void onItemClick(android.support.v17.preference.LeanbackListPreferenceDialogFragment.ViewHolder);
+  }
+
+  public class LeanbackPreferenceDialogFragment extends android.app.Fragment {
+    ctor public LeanbackPreferenceDialogFragment();
+    method public android.support.v7.preference.DialogPreference getPreference();
+    field public static final java.lang.String ARG_KEY = "key";
+  }
+
+  public abstract class LeanbackPreferenceFragment extends android.support.v17.preference.BaseLeanbackPreferenceFragment {
+    ctor public LeanbackPreferenceFragment();
+  }
+
+  public abstract class LeanbackSettingsFragment extends android.app.Fragment implements android.support.v14.preference.PreferenceFragment.OnPreferenceDisplayDialogCallback android.support.v14.preference.PreferenceFragment.OnPreferenceStartFragmentCallback android.support.v14.preference.PreferenceFragment.OnPreferenceStartScreenCallback {
+    ctor public LeanbackSettingsFragment();
+    method public boolean onPreferenceDisplayDialog(android.support.v14.preference.PreferenceFragment, android.support.v7.preference.Preference);
+    method public abstract void onPreferenceStartInitialScreen();
+    method public void startImmersiveFragment(android.app.Fragment);
+    method public void startPreferenceFragment(android.app.Fragment);
+  }
+
+}
+
+package android.support.v4.accessibilityservice {
+
+  public final class AccessibilityServiceInfoCompat {
+    method public static java.lang.String capabilityToString(int);
+    method public static java.lang.String feedbackTypeToString(int);
+    method public static java.lang.String flagToString(int);
+    method public static boolean getCanRetrieveWindowContent(android.accessibilityservice.AccessibilityServiceInfo);
+    method public static int getCapabilities(android.accessibilityservice.AccessibilityServiceInfo);
+    method public static java.lang.String getDescription(android.accessibilityservice.AccessibilityServiceInfo);
+    method public static java.lang.String getId(android.accessibilityservice.AccessibilityServiceInfo);
+    method public static android.content.pm.ResolveInfo getResolveInfo(android.accessibilityservice.AccessibilityServiceInfo);
+    method public static java.lang.String getSettingsActivityName(android.accessibilityservice.AccessibilityServiceInfo);
+    field public static final int CAPABILITY_CAN_FILTER_KEY_EVENTS = 8; // 0x8
+    field public static final int CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 4; // 0x4
+    field public static final int CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION = 2; // 0x2
+    field public static final int CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT = 1; // 0x1
+    field public static final int DEFAULT = 1; // 0x1
+    field public static final int FEEDBACK_ALL_MASK = -1; // 0xffffffff
+    field public static final int FEEDBACK_BRAILLE = 32; // 0x20
+    field public static final int FLAG_INCLUDE_NOT_IMPORTANT_VIEWS = 2; // 0x2
+    field public static final int FLAG_REPORT_VIEW_IDS = 16; // 0x10
+    field public static final int FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 8; // 0x8
+    field public static final int FLAG_REQUEST_FILTER_KEY_EVENTS = 32; // 0x20
+    field public static final int FLAG_REQUEST_TOUCH_EXPLORATION_MODE = 4; // 0x4
+  }
+
+}
+
+package android.support.v4.app {
+
+  public deprecated class ActionBarDrawerToggle implements android.support.v4.widget.DrawerLayout.DrawerListener {
+    ctor public ActionBarDrawerToggle(android.app.Activity, android.support.v4.widget.DrawerLayout, int, int, int);
+    ctor public ActionBarDrawerToggle(android.app.Activity, android.support.v4.widget.DrawerLayout, boolean, int, int, int);
+    method public boolean isDrawerIndicatorEnabled();
+    method public void onConfigurationChanged(android.content.res.Configuration);
+    method public void onDrawerClosed(android.view.View);
+    method public void onDrawerOpened(android.view.View);
+    method public void onDrawerSlide(android.view.View, float);
+    method public void onDrawerStateChanged(int);
+    method public boolean onOptionsItemSelected(android.view.MenuItem);
+    method public void setDrawerIndicatorEnabled(boolean);
+    method public void setHomeAsUpIndicator(android.graphics.drawable.Drawable);
+    method public void setHomeAsUpIndicator(int);
+    method public void syncState();
+  }
+
+  public static abstract interface ActionBarDrawerToggle.Delegate {
+    method public abstract android.graphics.drawable.Drawable getThemeUpIndicator();
+    method public abstract void setActionBarDescription(int);
+    method public abstract void setActionBarUpIndicator(android.graphics.drawable.Drawable, int);
+  }
+
+  public static abstract interface ActionBarDrawerToggle.DelegateProvider {
+    method public abstract android.support.v4.app.ActionBarDrawerToggle.Delegate getDrawerToggleDelegate();
+  }
+
+  public class ActivityCompat extends android.support.v4.content.ContextCompat {
+    ctor public ActivityCompat();
+    method public static void finishAffinity(android.app.Activity);
+    method public static void finishAfterTransition(android.app.Activity);
+    method public android.net.Uri getReferrer(android.app.Activity);
+    method public static boolean invalidateOptionsMenu(android.app.Activity);
+    method public static void postponeEnterTransition(android.app.Activity);
+    method public static void requestPermissions(android.app.Activity, java.lang.String[], int);
+    method public static void setEnterSharedElementCallback(android.app.Activity, android.support.v4.app.SharedElementCallback);
+    method public static void setExitSharedElementCallback(android.app.Activity, android.support.v4.app.SharedElementCallback);
+    method public static boolean shouldShowRequestPermissionRationale(android.app.Activity, java.lang.String);
+    method public static void startActivity(android.app.Activity, android.content.Intent, android.os.Bundle);
+    method public static void startActivityForResult(android.app.Activity, android.content.Intent, int, android.os.Bundle);
+    method public static void startIntentSenderForResult(android.app.Activity, android.content.IntentSender, int, android.content.Intent, int, int, int, android.os.Bundle) throws android.content.IntentSender.SendIntentException;
+    method public static void startPostponedEnterTransition(android.app.Activity);
+  }
+
+  public static abstract interface ActivityCompat.OnRequestPermissionsResultCallback {
+    method public abstract void onRequestPermissionsResult(int, java.lang.String[], int[]);
+  }
+
+  public final class ActivityManagerCompat {
+    method public static boolean isLowRamDevice(android.app.ActivityManager);
+  }
+
+  public class ActivityOptionsCompat {
+    ctor protected ActivityOptionsCompat();
+    method public android.graphics.Rect getLaunchBounds();
+    method public static android.support.v4.app.ActivityOptionsCompat makeBasic();
+    method public static android.support.v4.app.ActivityOptionsCompat makeClipRevealAnimation(android.view.View, int, int, int, int);
+    method public static android.support.v4.app.ActivityOptionsCompat makeCustomAnimation(android.content.Context, int, int);
+    method public static android.support.v4.app.ActivityOptionsCompat makeScaleUpAnimation(android.view.View, int, int, int, int);
+    method public static android.support.v4.app.ActivityOptionsCompat makeSceneTransitionAnimation(android.app.Activity, android.view.View, java.lang.String);
+    method public static android.support.v4.app.ActivityOptionsCompat makeSceneTransitionAnimation(android.app.Activity, android.support.v4.util.Pair<android.view.View, java.lang.String>...);
+    method public static android.support.v4.app.ActivityOptionsCompat makeTaskLaunchBehind();
+    method public static android.support.v4.app.ActivityOptionsCompat makeThumbnailScaleUpAnimation(android.view.View, android.graphics.Bitmap, int, int);
+    method public void requestUsageTimeReport(android.app.PendingIntent);
+    method public android.support.v4.app.ActivityOptionsCompat setLaunchBounds(android.graphics.Rect);
+    method public android.os.Bundle toBundle();
+    method public void update(android.support.v4.app.ActivityOptionsCompat);
+    field public static final java.lang.String EXTRA_USAGE_TIME_REPORT = "android.activity.usage_time";
+    field public static final java.lang.String EXTRA_USAGE_TIME_REPORT_PACKAGES = "android.usage_time_packages";
+  }
+
+  public class AppLaunchChecker {
+    ctor public AppLaunchChecker();
+    method public static boolean hasStartedFromLauncher(android.content.Context);
+    method public static void onActivityCreate(android.app.Activity);
+  }
+
+  public final class AppOpsManagerCompat {
+    method public static int noteOp(android.content.Context, java.lang.String, int, java.lang.String);
+    method public static int noteProxyOp(android.content.Context, java.lang.String, java.lang.String);
+    method public static java.lang.String permissionToOp(java.lang.String);
+    field public static final int MODE_ALLOWED = 0; // 0x0
+    field public static final int MODE_DEFAULT = 3; // 0x3
+    field public static final int MODE_IGNORED = 1; // 0x1
+  }
+
+  public final class BundleCompat {
+    method public static android.os.IBinder getBinder(android.os.Bundle, java.lang.String);
+    method public static void putBinder(android.os.Bundle, java.lang.String, android.os.IBinder);
+  }
+
+  public class DialogFragment extends android.support.v4.app.Fragment implements android.content.DialogInterface.OnCancelListener android.content.DialogInterface.OnDismissListener {
+    ctor public DialogFragment();
+    method public void dismiss();
+    method public void dismissAllowingStateLoss();
+    method public android.app.Dialog getDialog();
+    method public boolean getShowsDialog();
+    method public int getTheme();
+    method public boolean isCancelable();
+    method public void onCancel(android.content.DialogInterface);
+    method public android.app.Dialog onCreateDialog(android.os.Bundle);
+    method public void onDismiss(android.content.DialogInterface);
+    method public void setCancelable(boolean);
+    method public void setShowsDialog(boolean);
+    method public void setStyle(int, int);
+    method public void show(android.support.v4.app.FragmentManager, java.lang.String);
+    method public int show(android.support.v4.app.FragmentTransaction, java.lang.String);
+    field public static final int STYLE_NORMAL = 0; // 0x0
+    field public static final int STYLE_NO_FRAME = 2; // 0x2
+    field public static final int STYLE_NO_INPUT = 3; // 0x3
+    field public static final int STYLE_NO_TITLE = 1; // 0x1
+  }
+
+  public class Fragment implements android.content.ComponentCallbacks android.view.View.OnCreateContextMenuListener {
+    ctor public Fragment();
+    method public void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
+    method public final boolean equals(java.lang.Object);
+    method public final android.support.v4.app.FragmentActivity getActivity();
+    method public boolean getAllowEnterTransitionOverlap();
+    method public boolean getAllowReturnTransitionOverlap();
+    method public final android.os.Bundle getArguments();
+    method public final android.support.v4.app.FragmentManager getChildFragmentManager();
+    method public android.content.Context getContext();
+    method public java.lang.Object getEnterTransition();
+    method public java.lang.Object getExitTransition();
+    method public final android.support.v4.app.FragmentManager getFragmentManager();
+    method public final java.lang.Object getHost();
+    method public final int getId();
+    method public android.support.v4.app.LoaderManager getLoaderManager();
+    method public final android.support.v4.app.Fragment getParentFragment();
+    method public java.lang.Object getReenterTransition();
+    method public final android.content.res.Resources getResources();
+    method public final boolean getRetainInstance();
+    method public java.lang.Object getReturnTransition();
+    method public java.lang.Object getSharedElementEnterTransition();
+    method public java.lang.Object getSharedElementReturnTransition();
+    method public final java.lang.String getString(int);
+    method public final java.lang.String getString(int, java.lang.Object...);
+    method public final java.lang.String getTag();
+    method public final android.support.v4.app.Fragment getTargetFragment();
+    method public final int getTargetRequestCode();
+    method public final java.lang.CharSequence getText(int);
+    method public boolean getUserVisibleHint();
+    method public android.view.View getView();
+    method public final int hashCode();
+    method public static android.support.v4.app.Fragment instantiate(android.content.Context, java.lang.String);
+    method public static android.support.v4.app.Fragment instantiate(android.content.Context, java.lang.String, android.os.Bundle);
+    method public final boolean isAdded();
+    method public final boolean isDetached();
+    method public final boolean isHidden();
+    method public final boolean isInLayout();
+    method public final boolean isRemoving();
+    method public final boolean isResumed();
+    method public final boolean isVisible();
+    method public void onActivityCreated(android.os.Bundle);
+    method public void onActivityResult(int, int, android.content.Intent);
+    method public void onAttach(android.content.Context);
+    method public deprecated void onAttach(android.app.Activity);
+    method public void onAttachFragment(android.support.v4.app.Fragment);
+    method public void onConfigurationChanged(android.content.res.Configuration);
+    method public boolean onContextItemSelected(android.view.MenuItem);
+    method public void onCreate(android.os.Bundle);
+    method public android.view.animation.Animation onCreateAnimation(int, boolean, int);
+    method public void onCreateContextMenu(android.view.ContextMenu, android.view.View, android.view.ContextMenu.ContextMenuInfo);
+    method public void onCreateOptionsMenu(android.view.Menu, android.view.MenuInflater);
+    method public android.view.View onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
+    method public void onDestroy();
+    method public void onDestroyOptionsMenu();
+    method public void onDestroyView();
+    method public void onDetach();
+    method public void onHiddenChanged(boolean);
+    method public void onInflate(android.content.Context, android.util.AttributeSet, android.os.Bundle);
+    method public deprecated void onInflate(android.app.Activity, android.util.AttributeSet, android.os.Bundle);
+    method public void onLowMemory();
+    method public void onMultiWindowModeChanged(boolean);
+    method public boolean onOptionsItemSelected(android.view.MenuItem);
+    method public void onOptionsMenuClosed(android.view.Menu);
+    method public void onPause();
+    method public void onPictureInPictureModeChanged(boolean);
+    method public void onPrepareOptionsMenu(android.view.Menu);
+    method public void onRequestPermissionsResult(int, java.lang.String[], int[]);
+    method public void onResume();
+    method public void onSaveInstanceState(android.os.Bundle);
+    method public void onStart();
+    method public void onStop();
+    method public void onViewCreated(android.view.View, android.os.Bundle);
+    method public void onViewStateRestored(android.os.Bundle);
+    method public void registerForContextMenu(android.view.View);
+    method public final void requestPermissions(java.lang.String[], int);
+    method public void setAllowEnterTransitionOverlap(boolean);
+    method public void setAllowReturnTransitionOverlap(boolean);
+    method public void setArguments(android.os.Bundle);
+    method public void setEnterSharedElementCallback(android.support.v4.app.SharedElementCallback);
+    method public void setEnterTransition(java.lang.Object);
+    method public void setExitSharedElementCallback(android.support.v4.app.SharedElementCallback);
+    method public void setExitTransition(java.lang.Object);
+    method public void setHasOptionsMenu(boolean);
+    method public void setInitialSavedState(android.support.v4.app.Fragment.SavedState);
+    method public void setMenuVisibility(boolean);
+    method public void setReenterTransition(java.lang.Object);
+    method public void setRetainInstance(boolean);
+    method public void setReturnTransition(java.lang.Object);
+    method public void setSharedElementEnterTransition(java.lang.Object);
+    method public void setSharedElementReturnTransition(java.lang.Object);
+    method public void setTargetFragment(android.support.v4.app.Fragment, int);
+    method public void setUserVisibleHint(boolean);
+    method public boolean shouldShowRequestPermissionRationale(java.lang.String);
+    method public void startActivity(android.content.Intent);
+    method public void startActivity(android.content.Intent, android.os.Bundle);
+    method public void startActivityForResult(android.content.Intent, int);
+    method public void startActivityForResult(android.content.Intent, int, android.os.Bundle);
+    method public void startIntentSenderForResult(android.content.IntentSender, int, android.content.Intent, int, int, int, android.os.Bundle) throws android.content.IntentSender.SendIntentException;
+    method public void unregisterForContextMenu(android.view.View);
+  }
+
+  public static class Fragment.InstantiationException extends java.lang.RuntimeException {
+    ctor public Fragment.InstantiationException(java.lang.String, java.lang.Exception);
+  }
+
+  public static class Fragment.SavedState implements android.os.Parcelable {
+    method public int describeContents();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<android.support.v4.app.Fragment.SavedState> CREATOR;
+  }
+
+  public class FragmentActivity extends android.app.Activity implements android.support.v4.app.ActivityCompat.OnRequestPermissionsResultCallback {
+    ctor public FragmentActivity();
+    method public java.lang.Object getLastCustomNonConfigurationInstance();
+    method public android.support.v4.app.FragmentManager getSupportFragmentManager();
+    method public android.support.v4.app.LoaderManager getSupportLoaderManager();
+    method public final android.support.v4.media.session.MediaControllerCompat getSupportMediaController();
+    method public void onAttachFragment(android.support.v4.app.Fragment);
+    method protected void onResumeFragments();
+    method public java.lang.Object onRetainCustomNonConfigurationInstance();
+    method public final java.lang.Object onRetainNonConfigurationInstance();
+    method public void setEnterSharedElementCallback(android.support.v4.app.SharedElementCallback);
+    method public void setExitSharedElementCallback(android.support.v4.app.SharedElementCallback);
+    method public final void setSupportMediaController(android.support.v4.media.session.MediaControllerCompat);
+    method public void startActivityFromFragment(android.support.v4.app.Fragment, android.content.Intent, int);
+    method public void startActivityFromFragment(android.support.v4.app.Fragment, android.content.Intent, int, android.os.Bundle);
+    method public void startIntentSenderFromFragment(android.support.v4.app.Fragment, android.content.IntentSender, int, android.content.Intent, int, int, int, android.os.Bundle) throws android.content.IntentSender.SendIntentException;
+    method public void supportFinishAfterTransition();
+    method public void supportInvalidateOptionsMenu();
+    method public void supportPostponeEnterTransition();
+    method public void supportStartPostponedEnterTransition();
+    method public final void validateRequestPermissionsRequestCode(int);
+  }
+
+  public abstract class FragmentContainer {
+    ctor public FragmentContainer();
+    method public abstract android.view.View onFindViewById(int);
+    method public abstract boolean onHasView();
+  }
+
+  public class FragmentController {
+    method public void attachHost(android.support.v4.app.Fragment);
+    method public static final android.support.v4.app.FragmentController createController(android.support.v4.app.FragmentHostCallback<?>);
+    method public void dispatchActivityCreated();
+    method public void dispatchConfigurationChanged(android.content.res.Configuration);
+    method public boolean dispatchContextItemSelected(android.view.MenuItem);
+    method public void dispatchCreate();
+    method public boolean dispatchCreateOptionsMenu(android.view.Menu, android.view.MenuInflater);
+    method public void dispatchDestroy();
+    method public void dispatchDestroyView();
+    method public void dispatchLowMemory();
+    method public void dispatchMultiWindowModeChanged(boolean);
+    method public boolean dispatchOptionsItemSelected(android.view.MenuItem);
+    method public void dispatchOptionsMenuClosed(android.view.Menu);
+    method public void dispatchPause();
+    method public void dispatchPictureInPictureModeChanged(boolean);
+    method public boolean dispatchPrepareOptionsMenu(android.view.Menu);
+    method public void dispatchReallyStop();
+    method public void dispatchResume();
+    method public void dispatchStart();
+    method public void dispatchStop();
+    method public void doLoaderDestroy();
+    method public void doLoaderRetain();
+    method public void doLoaderStart();
+    method public void doLoaderStop(boolean);
+    method public void dumpLoaders(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
+    method public boolean execPendingActions();
+    method public java.util.List<android.support.v4.app.Fragment> getActiveFragments(java.util.List<android.support.v4.app.Fragment>);
+    method public int getActiveFragmentsCount();
+    method public android.support.v4.app.FragmentManager getSupportFragmentManager();
+    method public android.support.v4.app.LoaderManager getSupportLoaderManager();
+    method public void noteStateNotSaved();
+    method public android.view.View onCreateView(android.view.View, java.lang.String, android.content.Context, android.util.AttributeSet);
+    method public void reportLoaderStart();
+    method public deprecated void restoreAllState(android.os.Parcelable, java.util.List<android.support.v4.app.Fragment>);
+    method public void restoreAllState(android.os.Parcelable, android.support.v4.app.FragmentManagerNonConfig);
+    method public void restoreLoaderNonConfig(android.support.v4.util.SimpleArrayMap<java.lang.String, android.support.v4.app.LoaderManager>);
+    method public android.support.v4.util.SimpleArrayMap<java.lang.String, android.support.v4.app.LoaderManager> retainLoaderNonConfig();
+    method public android.support.v4.app.FragmentManagerNonConfig retainNestedNonConfig();
+    method public deprecated java.util.List<android.support.v4.app.Fragment> retainNonConfig();
+    method public android.os.Parcelable saveAllState();
+  }
+
+  public abstract class FragmentHostCallback extends android.support.v4.app.FragmentContainer {
+    ctor public FragmentHostCallback(android.content.Context, android.os.Handler, int);
+    method public void onDump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
+    method public android.view.View onFindViewById(int);
+    method public abstract E onGetHost();
+    method public android.view.LayoutInflater onGetLayoutInflater();
+    method public int onGetWindowAnimations();
+    method public boolean onHasView();
+    method public boolean onHasWindowAnimations();
+    method public void onRequestPermissionsFromFragment(android.support.v4.app.Fragment, java.lang.String[], int);
+    method public boolean onShouldSaveFragmentState(android.support.v4.app.Fragment);
+    method public boolean onShouldShowRequestPermissionRationale(java.lang.String);
+    method public void onStartActivityFromFragment(android.support.v4.app.Fragment, android.content.Intent, int);
+    method public void onStartActivityFromFragment(android.support.v4.app.Fragment, android.content.Intent, int, android.os.Bundle);
+    method public void onStartIntentSenderFromFragment(android.support.v4.app.Fragment, android.content.IntentSender, int, android.content.Intent, int, int, int, android.os.Bundle) throws android.content.IntentSender.SendIntentException;
+    method public void onSupportInvalidateOptionsMenu();
+  }
+
+  public abstract class FragmentManager {
+    ctor public FragmentManager();
+    method public abstract void addOnBackStackChangedListener(android.support.v4.app.FragmentManager.OnBackStackChangedListener);
+    method public abstract android.support.v4.app.FragmentTransaction beginTransaction();
+    method public abstract void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
+    method public static void enableDebugLogging(boolean);
+    method public abstract boolean executePendingTransactions();
+    method public abstract android.support.v4.app.Fragment findFragmentById(int);
+    method public abstract android.support.v4.app.Fragment findFragmentByTag(java.lang.String);
+    method public abstract android.support.v4.app.FragmentManager.BackStackEntry getBackStackEntryAt(int);
+    method public abstract int getBackStackEntryCount();
+    method public abstract android.support.v4.app.Fragment getFragment(android.os.Bundle, java.lang.String);
+    method public abstract boolean isDestroyed();
+    method public abstract void popBackStack();
+    method public abstract void popBackStack(java.lang.String, int);
+    method public abstract void popBackStack(int, int);
+    method public abstract boolean popBackStackImmediate();
+    method public abstract boolean popBackStackImmediate(java.lang.String, int);
+    method public abstract boolean popBackStackImmediate(int, int);
+    method public abstract void putFragment(android.os.Bundle, java.lang.String, android.support.v4.app.Fragment);
+    method public abstract void removeOnBackStackChangedListener(android.support.v4.app.FragmentManager.OnBackStackChangedListener);
+    method public abstract android.support.v4.app.Fragment.SavedState saveFragmentInstanceState(android.support.v4.app.Fragment);
+    field public static final int POP_BACK_STACK_INCLUSIVE = 1; // 0x1
+  }
+
+  public static abstract interface FragmentManager.BackStackEntry {
+    method public abstract java.lang.CharSequence getBreadCrumbShortTitle();
+    method public abstract int getBreadCrumbShortTitleRes();
+    method public abstract java.lang.CharSequence getBreadCrumbTitle();
+    method public abstract int getBreadCrumbTitleRes();
+    method public abstract int getId();
+    method public abstract java.lang.String getName();
+  }
+
+  public static abstract interface FragmentManager.OnBackStackChangedListener {
+    method public abstract void onBackStackChanged();
+  }
+
+  public class FragmentManagerNonConfig {
+  }
+
+  public abstract class FragmentPagerAdapter extends android.support.v4.view.PagerAdapter {
+    ctor public FragmentPagerAdapter(android.support.v4.app.FragmentManager);
+    method public abstract android.support.v4.app.Fragment getItem(int);
+    method public long getItemId(int);
+    method public boolean isViewFromObject(android.view.View, java.lang.Object);
+  }
+
+  public abstract class FragmentStatePagerAdapter extends android.support.v4.view.PagerAdapter {
+    ctor public FragmentStatePagerAdapter(android.support.v4.app.FragmentManager);
+    method public abstract android.support.v4.app.Fragment getItem(int);
+    method public boolean isViewFromObject(android.view.View, java.lang.Object);
+  }
+
+  public class FragmentTabHost extends android.widget.TabHost implements android.widget.TabHost.OnTabChangeListener {
+    ctor public FragmentTabHost(android.content.Context);
+    ctor public FragmentTabHost(android.content.Context, android.util.AttributeSet);
+    method public void addTab(android.widget.TabHost.TabSpec, java.lang.Class<?>, android.os.Bundle);
+    method public void onTabChanged(java.lang.String);
+    method public void setup(android.content.Context, android.support.v4.app.FragmentManager);
+    method public void setup(android.content.Context, android.support.v4.app.FragmentManager, int);
+  }
+
+  public abstract class FragmentTransaction {
+    ctor public FragmentTransaction();
+    method public abstract android.support.v4.app.FragmentTransaction add(android.support.v4.app.Fragment, java.lang.String);
+    method public abstract android.support.v4.app.FragmentTransaction add(int, android.support.v4.app.Fragment);
+    method public abstract android.support.v4.app.FragmentTransaction add(int, android.support.v4.app.Fragment, java.lang.String);
+    method public abstract android.support.v4.app.FragmentTransaction addSharedElement(android.view.View, java.lang.String);
+    method public abstract android.support.v4.app.FragmentTransaction addToBackStack(java.lang.String);
+    method public abstract android.support.v4.app.FragmentTransaction attach(android.support.v4.app.Fragment);
+    method public abstract int commit();
+    method public abstract int commitAllowingStateLoss();
+    method public abstract void commitNow();
+    method public abstract void commitNowAllowingStateLoss();
+    method public abstract android.support.v4.app.FragmentTransaction detach(android.support.v4.app.Fragment);
+    method public abstract android.support.v4.app.FragmentTransaction disallowAddToBackStack();
+    method public abstract android.support.v4.app.FragmentTransaction hide(android.support.v4.app.Fragment);
+    method public abstract boolean isAddToBackStackAllowed();
+    method public abstract boolean isEmpty();
+    method public abstract android.support.v4.app.FragmentTransaction remove(android.support.v4.app.Fragment);
+    method public abstract android.support.v4.app.FragmentTransaction replace(int, android.support.v4.app.Fragment);
+    method public abstract android.support.v4.app.FragmentTransaction replace(int, android.support.v4.app.Fragment, java.lang.String);
+    method public abstract android.support.v4.app.FragmentTransaction setBreadCrumbShortTitle(int);
+    method public abstract android.support.v4.app.FragmentTransaction setBreadCrumbShortTitle(java.lang.CharSequence);
+    method public abstract android.support.v4.app.FragmentTransaction setBreadCrumbTitle(int);
+    method public abstract android.support.v4.app.FragmentTransaction setBreadCrumbTitle(java.lang.CharSequence);
+    method public abstract android.support.v4.app.FragmentTransaction setCustomAnimations(int, int);
+    method public abstract android.support.v4.app.FragmentTransaction setCustomAnimations(int, int, int, int);
+    method public abstract android.support.v4.app.FragmentTransaction setTransition(int);
+    method public abstract android.support.v4.app.FragmentTransaction setTransitionStyle(int);
+    method public abstract android.support.v4.app.FragmentTransaction show(android.support.v4.app.Fragment);
+    field public static final int TRANSIT_ENTER_MASK = 4096; // 0x1000
+    field public static final int TRANSIT_EXIT_MASK = 8192; // 0x2000
+    field public static final int TRANSIT_FRAGMENT_CLOSE = 8194; // 0x2002
+    field public static final int TRANSIT_FRAGMENT_FADE = 4099; // 0x1003
+    field public static final int TRANSIT_FRAGMENT_OPEN = 4097; // 0x1001
+    field public static final int TRANSIT_NONE = 0; // 0x0
+    field public static final int TRANSIT_UNSET = -1; // 0xffffffff
+  }
+
+  public class ListFragment extends android.support.v4.app.Fragment {
+    ctor public ListFragment();
+    method public android.widget.ListAdapter getListAdapter();
+    method public android.widget.ListView getListView();
+    method public long getSelectedItemId();
+    method public int getSelectedItemPosition();
+    method public void onListItemClick(android.widget.ListView, android.view.View, int, long);
+    method public void setEmptyText(java.lang.CharSequence);
+    method public void setListAdapter(android.widget.ListAdapter);
+    method public void setListShown(boolean);
+    method public void setListShownNoAnimation(boolean);
+    method public void setSelection(int);
+  }
+
+  public abstract class LoaderManager {
+    ctor public LoaderManager();
+    method public abstract void destroyLoader(int);
+    method public abstract void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
+    method public static void enableDebugLogging(boolean);
+    method public abstract android.support.v4.content.Loader<D> getLoader(int);
+    method public boolean hasRunningLoaders();
+    method public abstract android.support.v4.content.Loader<D> initLoader(int, android.os.Bundle, android.support.v4.app.LoaderManager.LoaderCallbacks<D>);
+    method public abstract android.support.v4.content.Loader<D> restartLoader(int, android.os.Bundle, android.support.v4.app.LoaderManager.LoaderCallbacks<D>);
+  }
+
+  public static abstract interface LoaderManager.LoaderCallbacks {
+    method public abstract android.support.v4.content.Loader<D> onCreateLoader(int, android.os.Bundle);
+    method public abstract void onLoadFinished(android.support.v4.content.Loader<D>, D);
+    method public abstract void onLoaderReset(android.support.v4.content.Loader<D>);
+  }
+
+  public final class NavUtils {
+    method public static android.content.Intent getParentActivityIntent(android.app.Activity);
+    method public static android.content.Intent getParentActivityIntent(android.content.Context, java.lang.Class<?>) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static android.content.Intent getParentActivityIntent(android.content.Context, android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static java.lang.String getParentActivityName(android.app.Activity);
+    method public static java.lang.String getParentActivityName(android.content.Context, android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
+    method public static void navigateUpFromSameTask(android.app.Activity);
+    method public static void navigateUpTo(android.app.Activity, android.content.Intent);
+    method public static boolean shouldUpRecreateTask(android.app.Activity, android.content.Intent);
+    field public static final java.lang.String PARENT_ACTIVITY = "android.support.PARENT_ACTIVITY";
+  }
+
+  public class NotificationCompat {
+    ctor public NotificationCompat();
+    method public static android.support.v4.app.NotificationCompat.Action getAction(android.app.Notification, int);
+    method public static int getActionCount(android.app.Notification);
+    method public static java.lang.String getCategory(android.app.Notification);
+    method public static android.os.Bundle getExtras(android.app.Notification);
+    method public static java.lang.String getGroup(android.app.Notification);
+    method public static boolean getLocalOnly(android.app.Notification);
+    method public static java.lang.String getSortKey(android.app.Notification);
+    method public static boolean isGroupSummary(android.app.Notification);
+    field public static final java.lang.String CATEGORY_ALARM = "alarm";
+    field public static final java.lang.String CATEGORY_CALL = "call";
+    field public static final java.lang.String CATEGORY_EMAIL = "email";
+    field public static final java.lang.String CATEGORY_ERROR = "err";
+    field public static final java.lang.String CATEGORY_EVENT = "event";
+    field public static final java.lang.String CATEGORY_MESSAGE = "msg";
+    field public static final java.lang.String CATEGORY_PROGRESS = "progress";
+    field public static final java.lang.String CATEGORY_PROMO = "promo";
+    field public static final java.lang.String CATEGORY_RECOMMENDATION = "recommendation";
+    field public static final java.lang.String CATEGORY_REMINDER = "reminder";
+    field public static final java.lang.String CATEGORY_SERVICE = "service";
+    field public static final java.lang.String CATEGORY_SOCIAL = "social";
+    field public static final java.lang.String CATEGORY_STATUS = "status";
+    field public static final java.lang.String CATEGORY_SYSTEM = "sys";
+    field public static final java.lang.String CATEGORY_TRANSPORT = "transport";
+    field public static final int COLOR_DEFAULT = 0; // 0x0
+    field public static final int DEFAULT_ALL = -1; // 0xffffffff
+    field public static final int DEFAULT_LIGHTS = 4; // 0x4
+    field public static final int DEFAULT_SOUND = 1; // 0x1
+    field public static final int DEFAULT_VIBRATE = 2; // 0x2
+    field public static final java.lang.String EXTRA_BACKGROUND_IMAGE_URI = "android.backgroundImageUri";
+    field public static final java.lang.String EXTRA_BIG_TEXT = "android.bigText";
+    field public static final java.lang.String EXTRA_COMPACT_ACTIONS = "android.compactActions";
+    field public static final java.lang.String EXTRA_CONVERSATION_TITLE = "android.conversationTitle";
+    field public static final java.lang.String EXTRA_INFO_TEXT = "android.infoText";
+    field public static final java.lang.String EXTRA_LARGE_ICON = "android.largeIcon";
+    field public static final java.lang.String EXTRA_LARGE_ICON_BIG = "android.largeIcon.big";
+    field public static final java.lang.String EXTRA_MEDIA_SESSION = "android.mediaSession";
+    field public static final java.lang.String EXTRA_MESSAGES = "android.messages";
+    field public static final java.lang.String EXTRA_PEOPLE = "android.people";
+    field public static final java.lang.String EXTRA_PICTURE = "android.picture";
+    field public static final java.lang.String EXTRA_PROGRESS = "android.progress";
+    field public static final java.lang.String EXTRA_PROGRESS_INDETERMINATE = "android.progressIndeterminate";
+    field public static final java.lang.String EXTRA_PROGRESS_MAX = "android.progressMax";
+    field public static final java.lang.String EXTRA_REMOTE_INPUT_HISTORY = "android.remoteInputHistory";
+    field public static final java.lang.String EXTRA_SELF_DISPLAY_NAME = "android.selfDisplayName";
+    field public static final java.lang.String EXTRA_SHOW_CHRONOMETER = "android.showChronometer";
+    field public static final java.lang.String EXTRA_SHOW_WHEN = "android.showWhen";
+    field public static final java.lang.String EXTRA_SMALL_ICON = "android.icon";
+    field public static final java.lang.String EXTRA_SUB_TEXT = "android.subText";
+    field public static final java.lang.String EXTRA_SUMMARY_TEXT = "android.summaryText";
+    field public static final java.lang.String EXTRA_TEMPLATE = "android.template";
+    field public static final java.lang.String EXTRA_TEXT = "android.text";
+    field public static final java.lang.String EXTRA_TEXT_LINES = "android.textLines";
+    field public static final java.lang.String EXTRA_TITLE = "android.title";
+    field public static final java.lang.String EXTRA_TITLE_BIG = "android.title.big";
+    field public static final int FLAG_AUTO_CANCEL = 16; // 0x10
+    field public static final int FLAG_FOREGROUND_SERVICE = 64; // 0x40
+    field public static final int FLAG_GROUP_SUMMARY = 512; // 0x200
+    field public static final deprecated int FLAG_HIGH_PRIORITY = 128; // 0x80
+    field public static final int FLAG_INSISTENT = 4; // 0x4
+    field public static final int FLAG_LOCAL_ONLY = 256; // 0x100
+    field public static final int FLAG_NO_CLEAR = 32; // 0x20
+    field public static final int FLAG_ONGOING_EVENT = 2; // 0x2
+    field public static final int FLAG_ONLY_ALERT_ONCE = 8; // 0x8
+    field public static final int FLAG_SHOW_LIGHTS = 1; // 0x1
+    field public static final int PRIORITY_DEFAULT = 0; // 0x0
+    field public static final int PRIORITY_HIGH = 1; // 0x1
+    field public static final int PRIORITY_LOW = -1; // 0xffffffff
+    field public static final int PRIORITY_MAX = 2; // 0x2
+    field public static final int PRIORITY_MIN = -2; // 0xfffffffe
+    field public static final int STREAM_DEFAULT = -1; // 0xffffffff
+    field public static final int VISIBILITY_PRIVATE = 0; // 0x0
+    field public static final int VISIBILITY_PUBLIC = 1; // 0x1
+    field public static final int VISIBILITY_SECRET = -1; // 0xffffffff
+  }
+
+  public static class NotificationCompat.Action {
+    ctor public NotificationCompat.Action(int, java.lang.CharSequence, android.app.PendingIntent);
+    method public android.app.PendingIntent getActionIntent();
+    method public boolean getAllowGeneratedReplies();
+    method public android.os.Bundle getExtras();
+    method public int getIcon();
+    method public android.support.v4.app.RemoteInput[] getRemoteInputs();
+    method public java.lang.CharSequence getTitle();
+    field public android.app.PendingIntent actionIntent;
+    field public int icon;
+    field public java.lang.CharSequence title;
+  }
+
+  public static final class NotificationCompat.Action.Builder {
+    ctor public NotificationCompat.Action.Builder(int, java.lang.CharSequence, android.app.PendingIntent);
+    ctor public NotificationCompat.Action.Builder(android.support.v4.app.NotificationCompat.Action);
+    method public android.support.v4.app.NotificationCompat.Action.Builder addExtras(android.os.Bundle);
+    method public android.support.v4.app.NotificationCompat.Action.Builder addRemoteInput(android.support.v4.app.RemoteInput);
+    method public android.support.v4.app.NotificationCompat.Action build();
+    method public android.support.v4.app.NotificationCompat.Action.Builder extend(android.support.v4.app.NotificationCompat.Action.Extender);
+    method public android.os.Bundle getExtras();
+    method public android.support.v4.app.NotificationCompat.Action.Builder setAllowGeneratedReplies(boolean);
+  }
+
+  public static abstract interface NotificationCompat.Action.Extender {
+    method public abstract android.support.v4.app.NotificationCompat.Action.Builder extend(android.support.v4.app.NotificationCompat.Action.Builder);
+  }
+
+  public static final class NotificationCompat.Action.WearableExtender implements android.support.v4.app.NotificationCompat.Action.Extender {
+    ctor public NotificationCompat.Action.WearableExtender();
+    ctor public NotificationCompat.Action.WearableExtender(android.support.v4.app.NotificationCompat.Action);
+    method public android.support.v4.app.NotificationCompat.Action.WearableExtender clone();
+    method public android.support.v4.app.NotificationCompat.Action.Builder extend(android.support.v4.app.NotificationCompat.Action.Builder);
+    method public java.lang.CharSequence getCancelLabel();
+    method public java.lang.CharSequence getConfirmLabel();
+    method public boolean getHintLaunchesActivity();
+    method public java.lang.CharSequence getInProgressLabel();
+    method public boolean isAvailableOffline();
+    method public android.support.v4.app.NotificationCompat.Action.WearableExtender setAvailableOffline(boolean);
+    method public android.support.v4.app.NotificationCompat.Action.WearableExtender setCancelLabel(java.lang.CharSequence);
+    method public android.support.v4.app.NotificationCompat.Action.WearableExtender setConfirmLabel(java.lang.CharSequence);
+    method public android.support.v4.app.NotificationCompat.Action.WearableExtender setHintLaunchesActivity(boolean);
+    method public android.support.v4.app.NotificationCompat.Action.WearableExtender setInProgressLabel(java.lang.CharSequence);
+  }
+
+  public static class NotificationCompat.BigPictureStyle extends android.support.v4.app.NotificationCompat.Style {
+    ctor public NotificationCompat.BigPictureStyle();
+    ctor public NotificationCompat.BigPictureStyle(android.support.v4.app.NotificationCompat.Builder);
+    method public android.support.v4.app.NotificationCompat.BigPictureStyle bigLargeIcon(android.graphics.Bitmap);
+    method public android.support.v4.app.NotificationCompat.BigPictureStyle bigPicture(android.graphics.Bitmap);
+    method public android.support.v4.app.NotificationCompat.BigPictureStyle setBigContentTitle(java.lang.CharSequence);
+    method public android.support.v4.app.NotificationCompat.BigPictureStyle setSummaryText(java.lang.CharSequence);
+  }
+
+  public static class NotificationCompat.BigTextStyle extends android.support.v4.app.NotificationCompat.Style {
+    ctor public NotificationCompat.BigTextStyle();
+    ctor public NotificationCompat.BigTextStyle(android.support.v4.app.NotificationCompat.Builder);
+    method public android.support.v4.app.NotificationCompat.BigTextStyle bigText(java.lang.CharSequence);
+    method public android.support.v4.app.NotificationCompat.BigTextStyle setBigContentTitle(java.lang.CharSequence);
+    method public android.support.v4.app.NotificationCompat.BigTextStyle setSummaryText(java.lang.CharSequence);
+  }
+
+  public static class NotificationCompat.Builder {
+    ctor public NotificationCompat.Builder(android.content.Context);
+    method public android.support.v4.app.NotificationCompat.Builder addAction(int, java.lang.CharSequence, android.app.PendingIntent);
+    method public android.support.v4.app.NotificationCompat.Builder addAction(android.support.v4.app.NotificationCompat.Action);
+    method public android.support.v4.app.NotificationCompat.Builder addExtras(android.os.Bundle);
+    method public android.support.v4.app.NotificationCompat.Builder addPerson(java.lang.String);
+    method public android.app.Notification build();
+    method public android.support.v4.app.NotificationCompat.Builder extend(android.support.v4.app.NotificationCompat.Extender);
+    method public android.os.Bundle getExtras();
+    method public deprecated android.app.Notification getNotification();
+    method protected static java.lang.CharSequence limitCharSequenceLength(java.lang.CharSequence);
+    method public android.support.v4.app.NotificationCompat.Builder setAutoCancel(boolean);
+    method public android.support.v4.app.NotificationCompat.Builder setCategory(java.lang.String);
+    method public android.support.v4.app.NotificationCompat.Builder setColor(int);
+    method public android.support.v4.app.NotificationCompat.Builder setContent(android.widget.RemoteViews);
+    method public android.support.v4.app.NotificationCompat.Builder setContentInfo(java.lang.CharSequence);
+    method public android.support.v4.app.NotificationCompat.Builder setContentIntent(android.app.PendingIntent);
+    method public android.support.v4.app.NotificationCompat.Builder setContentText(java.lang.CharSequence);
+    method public android.support.v4.app.NotificationCompat.Builder setContentTitle(java.lang.CharSequence);
+    method public android.support.v4.app.NotificationCompat.Builder setCustomBigContentView(android.widget.RemoteViews);
+    method public android.support.v4.app.NotificationCompat.Builder setCustomContentView(android.widget.RemoteViews);
+    method public android.support.v4.app.NotificationCompat.Builder setCustomHeadsUpContentView(android.widget.RemoteViews);
+    method public android.support.v4.app.NotificationCompat.Builder setDefaults(int);
+    method public android.support.v4.app.NotificationCompat.Builder setDeleteIntent(android.app.PendingIntent);
+    method public android.support.v4.app.NotificationCompat.Builder setExtras(android.os.Bundle);
+    method public android.support.v4.app.NotificationCompat.Builder setFullScreenIntent(android.app.PendingIntent, boolean);
+    method public android.support.v4.app.NotificationCompat.Builder setGroup(java.lang.String);
+    method public android.support.v4.app.NotificationCompat.Builder setGroupSummary(boolean);
+    method public android.support.v4.app.NotificationCompat.Builder setLargeIcon(android.graphics.Bitmap);
+    method public android.support.v4.app.NotificationCompat.Builder setLights(int, int, int);
+    method public android.support.v4.app.NotificationCompat.Builder setLocalOnly(boolean);
+    method public android.support.v4.app.NotificationCompat.Builder setNumber(int);
+    method public android.support.v4.app.NotificationCompat.Builder setOngoing(boolean);
+    method public android.support.v4.app.NotificationCompat.Builder setOnlyAlertOnce(boolean);
+    method public android.support.v4.app.NotificationCompat.Builder setPriority(int);
+    method public android.support.v4.app.NotificationCompat.Builder setProgress(int, int, boolean);
+    method public android.support.v4.app.NotificationCompat.Builder setPublicVersion(android.app.Notification);
+    method public android.support.v4.app.NotificationCompat.Builder setRemoteInputHistory(java.lang.CharSequence[]);
+    method public android.support.v4.app.NotificationCompat.Builder setShowWhen(boolean);
+    method public android.support.v4.app.NotificationCompat.Builder setSmallIcon(int);
+    method public android.support.v4.app.NotificationCompat.Builder setSmallIcon(int, int);
+    method public android.support.v4.app.NotificationCompat.Builder setSortKey(java.lang.String);
+    method public android.support.v4.app.NotificationCompat.Builder setSound(android.net.Uri);
+    method public android.support.v4.app.NotificationCompat.Builder setSound(android.net.Uri, int);
+    method public android.support.v4.app.NotificationCompat.Builder setStyle(android.support.v4.app.NotificationCompat.Style);
+    method public android.support.v4.app.NotificationCompat.Builder setSubText(java.lang.CharSequence);
+    method public android.support.v4.app.NotificationCompat.Builder setTicker(java.lang.CharSequence);
+    method public android.support.v4.app.NotificationCompat.Builder setTicker(java.lang.CharSequence, android.widget.RemoteViews);
+    method public android.support.v4.app.NotificationCompat.Builder setUsesChronometer(boolean);
+    method public android.support.v4.app.NotificationCompat.Builder setVibrate(long[]);
+    method public android.support.v4.app.NotificationCompat.Builder setVisibility(int);
+    method public android.support.v4.app.NotificationCompat.Builder setWhen(long);
+    field public java.util.ArrayList<java.lang.String> mPeople;
+  }
+
+  public static final class NotificationCompat.CarExtender implements android.support.v4.app.NotificationCompat.Extender {
+    ctor public NotificationCompat.CarExtender();
+    ctor public NotificationCompat.CarExtender(android.app.Notification);
+    method public android.support.v4.app.NotificationCompat.Builder extend(android.support.v4.app.NotificationCompat.Builder);
+    method public int getColor();
+    method public android.graphics.Bitmap getLargeIcon();
+    method public android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation getUnreadConversation();
+    method public android.support.v4.app.NotificationCompat.CarExtender setColor(int);
+    method public android.support.v4.app.NotificationCompat.CarExtender setLargeIcon(android.graphics.Bitmap);
+    method public android.support.v4.app.NotificationCompat.CarExtender setUnreadConversation(android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation);
+  }
+
+  public static class NotificationCompat.CarExtender.UnreadConversation {
+    method public long getLatestTimestamp();
+    method public java.lang.String[] getMessages();
+    method public java.lang.String getParticipant();
+    method public java.lang.String[] getParticipants();
+    method public android.app.PendingIntent getReadPendingIntent();
+    method public android.support.v4.app.RemoteInput getRemoteInput();
+    method public android.app.PendingIntent getReplyPendingIntent();
+  }
+
+  public static class NotificationCompat.CarExtender.UnreadConversation.Builder {
+    ctor public NotificationCompat.CarExtender.UnreadConversation.Builder(java.lang.String);
+    method public android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation.Builder addMessage(java.lang.String);
+    method public android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation build();
+    method public android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation.Builder setLatestTimestamp(long);
+    method public android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation.Builder setReadPendingIntent(android.app.PendingIntent);
+    method public android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation.Builder setReplyAction(android.app.PendingIntent, android.support.v4.app.RemoteInput);
+  }
+
+  public static abstract interface NotificationCompat.Extender {
+    method public abstract android.support.v4.app.NotificationCompat.Builder extend(android.support.v4.app.NotificationCompat.Builder);
+  }
+
+  public static class NotificationCompat.InboxStyle extends android.support.v4.app.NotificationCompat.Style {
+    ctor public NotificationCompat.InboxStyle();
+    ctor public NotificationCompat.InboxStyle(android.support.v4.app.NotificationCompat.Builder);
+    method public android.support.v4.app.NotificationCompat.InboxStyle addLine(java.lang.CharSequence);
+    method public android.support.v4.app.NotificationCompat.InboxStyle setBigContentTitle(java.lang.CharSequence);
+    method public android.support.v4.app.NotificationCompat.InboxStyle setSummaryText(java.lang.CharSequence);
+  }
+
+  public static class NotificationCompat.MessagingStyle extends android.support.v4.app.NotificationCompat.Style {
+    ctor public NotificationCompat.MessagingStyle(java.lang.CharSequence);
+    method public void addCompatExtras(android.os.Bundle);
+    method public android.support.v4.app.NotificationCompat.MessagingStyle addMessage(java.lang.CharSequence, long, java.lang.CharSequence);
+    method public android.support.v4.app.NotificationCompat.MessagingStyle addMessage(android.support.v4.app.NotificationCompat.MessagingStyle.Message);
+    method public static android.support.v4.app.NotificationCompat.MessagingStyle extractMessagingStyleFromNotification(android.app.Notification);
+    method public java.lang.CharSequence getConversationTitle();
+    method public java.util.List<android.support.v4.app.NotificationCompat.MessagingStyle.Message> getMessages();
+    method public java.lang.CharSequence getUserDisplayName();
+    method public android.support.v4.app.NotificationCompat.MessagingStyle setConversationTitle(java.lang.CharSequence);
+    field public static final int MAXIMUM_RETAINED_MESSAGES = 25; // 0x19
+  }
+
+  public static final class NotificationCompat.MessagingStyle.Message {
+    ctor public NotificationCompat.MessagingStyle.Message(java.lang.CharSequence, long, java.lang.CharSequence);
+    method public java.lang.String getDataMimeType();
+    method public android.net.Uri getDataUri();
+    method public java.lang.CharSequence getSender();
+    method public java.lang.CharSequence getText();
+    method public long getTimestamp();
+    method public android.support.v4.app.NotificationCompat.MessagingStyle.Message setData(java.lang.String, android.net.Uri);
+  }
+
+  public static abstract class NotificationCompat.Style {
+    ctor public NotificationCompat.Style();
+    method public android.app.Notification build();
+    method public void setBuilder(android.support.v4.app.NotificationCompat.Builder);
+  }
+
+  public static final class NotificationCompat.WearableExtender implements android.support.v4.app.NotificationCompat.Extender {
+    ctor public NotificationCompat.WearableExtender();
+    ctor public NotificationCompat.WearableExtender(android.app.Notification);
+    method public android.support.v4.app.NotificationCompat.WearableExtender addAction(android.support.v4.app.NotificationCompat.Action);
+    method public android.support.v4.app.NotificationCompat.WearableExtender addActions(java.util.List<android.support.v4.app.NotificationCompat.Action>);
+    method public android.support.v4.app.NotificationCompat.WearableExtender addPage(android.app.Notification);
+    method public android.support.v4.app.NotificationCompat.WearableExtender addPages(java.util.List<android.app.Notification>);
+    method public android.support.v4.app.NotificationCompat.WearableExtender clearActions();
+    method public android.support.v4.app.NotificationCompat.WearableExtender clearPages();
+    method public android.support.v4.app.NotificationCompat.WearableExtender clone();
+    method public android.support.v4.app.NotificationCompat.Builder extend(android.support.v4.app.NotificationCompat.Builder);
+    method public java.util.List<android.support.v4.app.NotificationCompat.Action> getActions();
+    method public android.graphics.Bitmap getBackground();
+    method public int getContentAction();
+    method public int getContentIcon();
+    method public int getContentIconGravity();
+    method public boolean getContentIntentAvailableOffline();
+    method public int getCustomContentHeight();
+    method public int getCustomSizePreset();
+    method public java.lang.String getDismissalId();
+    method public android.app.PendingIntent getDisplayIntent();
+    method public int getGravity();
+    method public boolean getHintAmbientBigPicture();
+    method public boolean getHintAvoidBackgroundClipping();
+    method public boolean getHintContentIntentLaunchesActivity();
+    method public boolean getHintHideIcon();
+    method public int getHintScreenTimeout();
+    method public boolean getHintShowBackgroundOnly();
+    method public java.util.List<android.app.Notification> getPages();
+    method public boolean getStartScrollBottom();
+    method public android.support.v4.app.NotificationCompat.WearableExtender setBackground(android.graphics.Bitmap);
+    method public android.support.v4.app.NotificationCompat.WearableExtender setContentAction(int);
+    method public android.support.v4.app.NotificationCompat.WearableExtender setContentIcon(int);
+    method public android.support.v4.app.NotificationCompat.WearableExtender setContentIconGravity(int);
+    method public android.support.v4.app.NotificationCompat.WearableExtender setContentIntentAvailableOffline(boolean);
+    method public android.support.v4.app.NotificationCompat.WearableExtender setCustomContentHeight(int);
+    method public android.support.v4.app.NotificationCompat.WearableExtender setCustomSizePreset(int);
+    method public android.support.v4.app.NotificationCompat.WearableExtender setDismissalId(java.lang.String);
+    method public android.support.v4.app.NotificationCompat.WearableExtender setDisplayIntent(android.app.PendingIntent);
+    method public android.support.v4.app.NotificationCompat.WearableExtender setGravity(int);
+    method public android.support.v4.app.NotificationCompat.WearableExtender setHintAmbientBigPicture(boolean);
+    method public android.support.v4.app.NotificationCompat.WearableExtender setHintAvoidBackgroundClipping(boolean);
+    method public android.support.v4.app.NotificationCompat.WearableExtender setHintContentIntentLaunchesActivity(boolean);
+    method public android.support.v4.app.NotificationCompat.WearableExtender setHintHideIcon(boolean);
+    method public android.support.v4.app.NotificationCompat.WearableExtender setHintScreenTimeout(int);
+    method public android.support.v4.app.NotificationCompat.WearableExtender setHintShowBackgroundOnly(boolean);
+    method public android.support.v4.app.NotificationCompat.WearableExtender setStartScrollBottom(boolean);
+    field public static final int SCREEN_TIMEOUT_LONG = -1; // 0xffffffff
+    field public static final int SCREEN_TIMEOUT_SHORT = 0; // 0x0
+    field public static final int SIZE_DEFAULT = 0; // 0x0
+    field public static final int SIZE_FULL_SCREEN = 5; // 0x5
+    field public static final int SIZE_LARGE = 4; // 0x4
+    field public static final int SIZE_MEDIUM = 3; // 0x3
+    field public static final int SIZE_SMALL = 2; // 0x2
+    field public static final int SIZE_XSMALL = 1; // 0x1
+    field public static final int UNSET_ACTION_INDEX = -1; // 0xffffffff
+  }
+
+  public final class NotificationCompatExtras {
+    field public static final java.lang.String EXTRA_ACTION_EXTRAS = "android.support.actionExtras";
+    field public static final java.lang.String EXTRA_GROUP_KEY = "android.support.groupKey";
+    field public static final java.lang.String EXTRA_GROUP_SUMMARY = "android.support.isGroupSummary";
+    field public static final java.lang.String EXTRA_LOCAL_ONLY = "android.support.localOnly";
+    field public static final java.lang.String EXTRA_REMOTE_INPUTS = "android.support.remoteInputs";
+    field public static final java.lang.String EXTRA_SORT_KEY = "android.support.sortKey";
+  }
+
+  public abstract class NotificationCompatSideChannelService extends android.app.Service {
+    ctor public NotificationCompatSideChannelService();
+    method public abstract void cancel(java.lang.String, int, java.lang.String);
+    method public abstract void cancelAll(java.lang.String);
+    method public abstract void notify(java.lang.String, int, java.lang.String, android.app.Notification);
+    method public android.os.IBinder onBind(android.content.Intent);
+  }
+
+  public final class NotificationManagerCompat {
+    method public boolean areNotificationsEnabled();
+    method public void cancel(int);
+    method public void cancel(java.lang.String, int);
+    method public void cancelAll();
+    method public static android.support.v4.app.NotificationManagerCompat from(android.content.Context);
+    method public static java.util.Set<java.lang.String> getEnabledListenerPackages(android.content.Context);
+    method public int getImportance();
+    method public void notify(int, android.app.Notification);
+    method public void notify(java.lang.String, int, android.app.Notification);
+    field public static final java.lang.String ACTION_BIND_SIDE_CHANNEL = "android.support.BIND_NOTIFICATION_SIDE_CHANNEL";
+    field public static final java.lang.String EXTRA_USE_SIDE_CHANNEL = "android.support.useSideChannel";
+    field public static final int IMPORTANCE_DEFAULT = 3; // 0x3
+    field public static final int IMPORTANCE_HIGH = 4; // 0x4
+    field public static final int IMPORTANCE_LOW = 2; // 0x2
+    field public static final int IMPORTANCE_MAX = 5; // 0x5
+    field public static final int IMPORTANCE_MIN = 1; // 0x1
+    field public static final int IMPORTANCE_NONE = 0; // 0x0
+    field public static final int IMPORTANCE_UNSPECIFIED = -1000; // 0xfffffc18
+  }
+
+  public final class RemoteInput extends android.support.v4.app.RemoteInputCompatBase.RemoteInput {
+    method public static void addResultsToIntent(android.support.v4.app.RemoteInput[], android.content.Intent, android.os.Bundle);
+    method public boolean getAllowFreeFormInput();
+    method public java.lang.CharSequence[] getChoices();
+    method public android.os.Bundle getExtras();
+    method public java.lang.CharSequence getLabel();
+    method public java.lang.String getResultKey();
+    method public static android.os.Bundle getResultsFromIntent(android.content.Intent);
+    field public static final java.lang.String EXTRA_RESULTS_DATA = "android.remoteinput.resultsData";
+    field public static final java.lang.String RESULTS_CLIP_LABEL = "android.remoteinput.results";
+  }
+
+  public static final class RemoteInput.Builder {
+    ctor public RemoteInput.Builder(java.lang.String);
+    method public android.support.v4.app.RemoteInput.Builder addExtras(android.os.Bundle);
+    method public android.support.v4.app.RemoteInput build();
+    method public android.os.Bundle getExtras();
+    method public android.support.v4.app.RemoteInput.Builder setAllowFreeFormInput(boolean);
+    method public android.support.v4.app.RemoteInput.Builder setChoices(java.lang.CharSequence[]);
+    method public android.support.v4.app.RemoteInput.Builder setLabel(java.lang.CharSequence);
+  }
+
+   class RemoteInputCompatBase {
+  }
+
+  public static abstract class RemoteInputCompatBase.RemoteInput {
+    ctor public RemoteInputCompatBase.RemoteInput();
+    method protected abstract boolean getAllowFreeFormInput();
+    method protected abstract java.lang.CharSequence[] getChoices();
+    method protected abstract android.os.Bundle getExtras();
+    method protected abstract java.lang.CharSequence getLabel();
+    method protected abstract java.lang.String getResultKey();
+  }
+
+  public final class ServiceCompat {
+    field public static final int START_STICKY = 1; // 0x1
+  }
+
+  public final class ShareCompat {
+    method public static void configureMenuItem(android.view.MenuItem, android.support.v4.app.ShareCompat.IntentBuilder);
+    method public static void configureMenuItem(android.view.Menu, int, android.support.v4.app.ShareCompat.IntentBuilder);
+    method public static android.content.ComponentName getCallingActivity(android.app.Activity);
+    method public static java.lang.String getCallingPackage(android.app.Activity);
+    field public static final java.lang.String EXTRA_CALLING_ACTIVITY = "android.support.v4.app.EXTRA_CALLING_ACTIVITY";
+    field public static final java.lang.String EXTRA_CALLING_PACKAGE = "android.support.v4.app.EXTRA_CALLING_PACKAGE";
+  }
+
+  public static class ShareCompat.IntentBuilder {
+    method public android.support.v4.app.ShareCompat.IntentBuilder addEmailBcc(java.lang.String);
+    method public android.support.v4.app.ShareCompat.IntentBuilder addEmailBcc(java.lang.String[]);
+    method public android.support.v4.app.ShareCompat.IntentBuilder addEmailCc(java.lang.String);
+    method public android.support.v4.app.ShareCompat.IntentBuilder addEmailCc(java.lang.String[]);
+    method public android.support.v4.app.ShareCompat.IntentBuilder addEmailTo(java.lang.String);
+    method public android.support.v4.app.ShareCompat.IntentBuilder addEmailTo(java.lang.String[]);
+    method public android.support.v4.app.ShareCompat.IntentBuilder addStream(android.net.Uri);
+    method public android.content.Intent createChooserIntent();
+    method public static android.support.v4.app.ShareCompat.IntentBuilder from(android.app.Activity);
+    method public android.content.Intent getIntent();
+    method public android.support.v4.app.ShareCompat.IntentBuilder setChooserTitle(java.lang.CharSequence);
+    method public android.support.v4.app.ShareCompat.IntentBuilder setChooserTitle(int);
+    method public android.support.v4.app.ShareCompat.IntentBuilder setEmailBcc(java.lang.String[]);
+    method public android.support.v4.app.ShareCompat.IntentBuilder setEmailCc(java.lang.String[]);
+    method public android.support.v4.app.ShareCompat.IntentBuilder setEmailTo(java.lang.String[]);
+    method public android.support.v4.app.ShareCompat.IntentBuilder setHtmlText(java.lang.String);
+    method public android.support.v4.app.ShareCompat.IntentBuilder setStream(android.net.Uri);
+    method public android.support.v4.app.ShareCompat.IntentBuilder setSubject(java.lang.String);
+    method public android.support.v4.app.ShareCompat.IntentBuilder setText(java.lang.CharSequence);
+    method public android.support.v4.app.ShareCompat.IntentBuilder setType(java.lang.String);
+    method public void startChooser();
+  }
+
+  public static class ShareCompat.IntentReader {
+    method public static android.support.v4.app.ShareCompat.IntentReader from(android.app.Activity);
+    method public android.content.ComponentName getCallingActivity();
+    method public android.graphics.drawable.Drawable getCallingActivityIcon();
+    method public android.graphics.drawable.Drawable getCallingApplicationIcon();
+    method public java.lang.CharSequence getCallingApplicationLabel();
+    method public java.lang.String getCallingPackage();
+    method public java.lang.String[] getEmailBcc();
+    method public java.lang.String[] getEmailCc();
+    method public java.lang.String[] getEmailTo();
+    method public java.lang.String getHtmlText();
+    method public android.net.Uri getStream();
+    method public android.net.Uri getStream(int);
+    method public int getStreamCount();
+    method public java.lang.String getSubject();
+    method public java.lang.CharSequence getText();
+    method public java.lang.String getType();
+    method public boolean isMultipleShare();
+    method public boolean isShareIntent();
+    method public boolean isSingleShare();
+  }
+
+  public abstract class SharedElementCallback {
+    ctor public SharedElementCallback();
+    method public android.os.Parcelable onCaptureSharedElementSnapshot(android.view.View, android.graphics.Matrix, android.graphics.RectF);
+    method public android.view.View onCreateSnapshotView(android.content.Context, android.os.Parcelable);
+    method public void onMapSharedElements(java.util.List<java.lang.String>, java.util.Map<java.lang.String, android.view.View>);
+    method public void onRejectSharedElements(java.util.List<android.view.View>);
+    method public void onSharedElementEnd(java.util.List<java.lang.String>, java.util.List<android.view.View>, java.util.List<android.view.View>);
+    method public void onSharedElementStart(java.util.List<java.lang.String>, java.util.List<android.view.View>, java.util.List<android.view.View>);
+  }
+
+  public final class TaskStackBuilder implements java.lang.Iterable {
+    method public android.support.v4.app.TaskStackBuilder addNextIntent(android.content.Intent);
+    method public android.support.v4.app.TaskStackBuilder addNextIntentWithParentStack(android.content.Intent);
+    method public android.support.v4.app.TaskStackBuilder addParentStack(android.app.Activity);
+    method public android.support.v4.app.TaskStackBuilder addParentStack(java.lang.Class<?>);
+    method public android.support.v4.app.TaskStackBuilder addParentStack(android.content.ComponentName);
+    method public static android.support.v4.app.TaskStackBuilder create(android.content.Context);
+    method public android.content.Intent editIntentAt(int);
+    method public static deprecated android.support.v4.app.TaskStackBuilder from(android.content.Context);
+    method public deprecated android.content.Intent getIntent(int);
+    method public int getIntentCount();
+    method public android.content.Intent[] getIntents();
+    method public android.app.PendingIntent getPendingIntent(int, int);
+    method public android.app.PendingIntent getPendingIntent(int, int, android.os.Bundle);
+    method public deprecated java.util.Iterator<android.content.Intent> iterator();
+    method public void startActivities();
+    method public void startActivities(android.os.Bundle);
+  }
+
+  public static abstract interface TaskStackBuilder.SupportParentable {
+    method public abstract android.content.Intent getSupportParentActivityIntent();
+  }
+
+}
+
+package android.support.v4.content {
+
+  public abstract class AsyncTaskLoader extends android.support.v4.content.Loader {
+    ctor public AsyncTaskLoader(android.content.Context);
+    method public void cancelLoadInBackground();
+    method public boolean isLoadInBackgroundCanceled();
+    method public abstract D loadInBackground();
+    method public void onCanceled(D);
+    method protected D onLoadInBackground();
+    method public void setUpdateThrottle(long);
+  }
+
+  public final class ContentResolverCompat {
+    method public static android.database.Cursor query(android.content.ContentResolver, android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, android.support.v4.os.CancellationSignal);
+  }
+
+  public class ContextCompat {
+    ctor public ContextCompat();
+    method public static int checkSelfPermission(android.content.Context, java.lang.String);
+    method public static android.content.Context createDeviceProtectedStorageContext(android.content.Context);
+    method public static java.io.File getCodeCacheDir(android.content.Context);
+    method public static final int getColor(android.content.Context, int);
+    method public static final android.content.res.ColorStateList getColorStateList(android.content.Context, int);
+    method public static java.io.File getDataDir(android.content.Context);
+    method public static final android.graphics.drawable.Drawable getDrawable(android.content.Context, int);
+    method public static java.io.File[] getExternalCacheDirs(android.content.Context);
+    method public static java.io.File[] getExternalFilesDirs(android.content.Context, java.lang.String);
+    method public static final java.io.File getNoBackupFilesDir(android.content.Context);
+    method public static java.io.File[] getObbDirs(android.content.Context);
+    method public static boolean isDeviceProtectedStorage(android.content.Context);
+    method public static boolean startActivities(android.content.Context, android.content.Intent[]);
+    method public static boolean startActivities(android.content.Context, android.content.Intent[], android.os.Bundle);
+  }
+
+  public class CursorLoader extends android.support.v4.content.AsyncTaskLoader {
+    ctor public CursorLoader(android.content.Context);
+    ctor public CursorLoader(android.content.Context, android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String);
+    method public void deliverResult(android.database.Cursor);
+    method public java.lang.String[] getProjection();
+    method public java.lang.String getSelection();
+    method public java.lang.String[] getSelectionArgs();
+    method public java.lang.String getSortOrder();
+    method public android.net.Uri getUri();
+    method public android.database.Cursor loadInBackground();
+    method public void onCanceled(android.database.Cursor);
+    method public void setProjection(java.lang.String[]);
+    method public void setSelection(java.lang.String);
+    method public void setSelectionArgs(java.lang.String[]);
+    method public void setSortOrder(java.lang.String);
+    method public void setUri(android.net.Uri);
+  }
+
+  public class FileProvider extends android.content.ContentProvider {
+    ctor public FileProvider();
+    method public int delete(android.net.Uri, java.lang.String, java.lang.String[]);
+    method public java.lang.String getType(android.net.Uri);
+    method public static android.net.Uri getUriForFile(android.content.Context, java.lang.String, java.io.File);
+    method public android.net.Uri insert(android.net.Uri, android.content.ContentValues);
+    method public boolean onCreate();
+    method public android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String);
+    method public int update(android.net.Uri, android.content.ContentValues, java.lang.String, java.lang.String[]);
+  }
+
+  public final class IntentCompat {
+    method public static android.content.Intent makeMainActivity(android.content.ComponentName);
+    method public static android.content.Intent makeMainSelectorActivity(java.lang.String, java.lang.String);
+    method public static android.content.Intent makeRestartActivityTask(android.content.ComponentName);
+    field public static final java.lang.String ACTION_EXTERNAL_APPLICATIONS_AVAILABLE = "android.intent.action.EXTERNAL_APPLICATIONS_AVAILABLE";
+    field public static final java.lang.String ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE = "android.intent.action.EXTERNAL_APPLICATIONS_UNAVAILABLE";
+    field public static final java.lang.String CATEGORY_LEANBACK_LAUNCHER = "android.intent.category.LEANBACK_LAUNCHER";
+    field public static final java.lang.String EXTRA_CHANGED_PACKAGE_LIST = "android.intent.extra.changed_package_list";
+    field public static final java.lang.String EXTRA_CHANGED_UID_LIST = "android.intent.extra.changed_uid_list";
+    field public static final java.lang.String EXTRA_HTML_TEXT = "android.intent.extra.HTML_TEXT";
+    field public static final int FLAG_ACTIVITY_CLEAR_TASK = 32768; // 0x8000
+    field public static final int FLAG_ACTIVITY_TASK_ON_HOME = 16384; // 0x4000
+  }
+
+  public class Loader {
+    ctor public Loader(android.content.Context);
+    method public void abandon();
+    method public boolean cancelLoad();
+    method public void commitContentChanged();
+    method public java.lang.String dataToString(D);
+    method public void deliverCancellation();
+    method public void deliverResult(D);
+    method public void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
+    method public void forceLoad();
+    method public android.content.Context getContext();
+    method public int getId();
+    method public boolean isAbandoned();
+    method public boolean isReset();
+    method public boolean isStarted();
+    method protected void onAbandon();
+    method protected boolean onCancelLoad();
+    method public void onContentChanged();
+    method protected void onForceLoad();
+    method protected void onReset();
+    method protected void onStartLoading();
+    method protected void onStopLoading();
+    method public void registerListener(int, android.support.v4.content.Loader.OnLoadCompleteListener<D>);
+    method public void registerOnLoadCanceledListener(android.support.v4.content.Loader.OnLoadCanceledListener<D>);
+    method public void reset();
+    method public void rollbackContentChanged();
+    method public final void startLoading();
+    method public void stopLoading();
+    method public boolean takeContentChanged();
+    method public void unregisterListener(android.support.v4.content.Loader.OnLoadCompleteListener<D>);
+    method public void unregisterOnLoadCanceledListener(android.support.v4.content.Loader.OnLoadCanceledListener<D>);
+  }
+
+  public final class Loader.ForceLoadContentObserver extends android.database.ContentObserver {
+    ctor public Loader.ForceLoadContentObserver();
+  }
+
+  public static abstract interface Loader.OnLoadCanceledListener {
+    method public abstract void onLoadCanceled(android.support.v4.content.Loader<D>);
+  }
+
+  public static abstract interface Loader.OnLoadCompleteListener {
+    method public abstract void onLoadComplete(android.support.v4.content.Loader<D>, D);
+  }
+
+  public final class LocalBroadcastManager {
+    method public static android.support.v4.content.LocalBroadcastManager getInstance(android.content.Context);
+    method public void registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter);
+    method public boolean sendBroadcast(android.content.Intent);
+    method public void sendBroadcastSync(android.content.Intent);
+    method public void unregisterReceiver(android.content.BroadcastReceiver);
+  }
+
+  public final class ParallelExecutorCompat {
+    method public static java.util.concurrent.Executor getParallelExecutor();
+  }
+
+  public final class PermissionChecker {
+    method public static int checkCallingOrSelfPermission(android.content.Context, java.lang.String);
+    method public static int checkCallingPermission(android.content.Context, java.lang.String, java.lang.String);
+    method public static int checkPermission(android.content.Context, java.lang.String, int, int, java.lang.String);
+    method public static int checkSelfPermission(android.content.Context, java.lang.String);
+    field public static final int PERMISSION_DENIED = -1; // 0xffffffff
+    field public static final int PERMISSION_DENIED_APP_OP = -2; // 0xfffffffe
+    field public static final int PERMISSION_GRANTED = 0; // 0x0
+  }
+
+  public static abstract class PermissionChecker.PermissionResult implements java.lang.annotation.Annotation {
+  }
+
+  public final class SharedPreferencesCompat {
+  }
+
+  public static final class SharedPreferencesCompat.EditorCompat {
+    method public void apply(android.content.SharedPreferences.Editor);
+    method public static android.support.v4.content.SharedPreferencesCompat.EditorCompat getInstance();
+  }
+
+  public abstract class WakefulBroadcastReceiver extends android.content.BroadcastReceiver {
+    ctor public WakefulBroadcastReceiver();
+    method public static boolean completeWakefulIntent(android.content.Intent);
+    method public static android.content.ComponentName startWakefulService(android.content.Context, android.content.Intent);
+  }
+
+}
+
+package android.support.v4.content.pm {
+
+  public final class ActivityInfoCompat {
+    field public static final int CONFIG_UI_MODE = 512; // 0x200
+  }
+
+}
+
+package android.support.v4.content.res {
+
+  public final class ConfigurationHelper {
+    method public static int getDensityDpi(android.content.res.Resources);
+    method public static int getScreenHeightDp(android.content.res.Resources);
+    method public static int getScreenWidthDp(android.content.res.Resources);
+    method public static int getSmallestScreenWidthDp(android.content.res.Resources);
+  }
+
+  public final class ResourcesCompat {
+    method public static int getColor(android.content.res.Resources, int, android.content.res.Resources.Theme) throws android.content.res.Resources.NotFoundException;
+    method public static android.content.res.ColorStateList getColorStateList(android.content.res.Resources, int, android.content.res.Resources.Theme) throws android.content.res.Resources.NotFoundException;
+    method public static android.graphics.drawable.Drawable getDrawable(android.content.res.Resources, int, android.content.res.Resources.Theme) throws android.content.res.Resources.NotFoundException;
+    method public static android.graphics.drawable.Drawable getDrawableForDensity(android.content.res.Resources, int, int, android.content.res.Resources.Theme) throws android.content.res.Resources.NotFoundException;
+  }
+
+}
+
+package android.support.v4.database {
+
+  public final class DatabaseUtilsCompat {
+    method public static java.lang.String[] appendSelectionArgs(java.lang.String[], java.lang.String[]);
+    method public static java.lang.String concatenateWhere(java.lang.String, java.lang.String);
+  }
+
+}
+
+package android.support.v4.graphics {
+
+  public final class BitmapCompat {
+    method public static int getAllocationByteCount(android.graphics.Bitmap);
+    method public static boolean hasMipMap(android.graphics.Bitmap);
+    method public static void setHasMipMap(android.graphics.Bitmap, boolean);
+  }
+
+  public final class ColorUtils {
+    method public static int HSLToColor(float[]);
+    method public static int LABToColor(double, double, double);
+    method public static void LABToXYZ(double, double, double, double[]);
+    method public static void RGBToHSL(int, int, int, float[]);
+    method public static void RGBToLAB(int, int, int, double[]);
+    method public static void RGBToXYZ(int, int, int, double[]);
+    method public static int XYZToColor(double, double, double);
+    method public static void XYZToLAB(double, double, double, double[]);
+    method public static int blendARGB(int, int, float);
+    method public static void blendHSL(float[], float[], float, float[]);
+    method public static void blendLAB(double[], double[], double, double[]);
+    method public static double calculateContrast(int, int);
+    method public static double calculateLuminance(int);
+    method public static int calculateMinimumAlpha(int, int, float);
+    method public static void colorToHSL(int, float[]);
+    method public static void colorToLAB(int, double[]);
+    method public static void colorToXYZ(int, double[]);
+    method public static int compositeColors(int, int);
+    method public static double distanceEuclidean(double[], double[]);
+    method public static int setAlphaComponent(int, int);
+  }
+
+}
+
+package android.support.v4.graphics.drawable {
+
+  public final class DrawableCompat {
+    method public static void applyTheme(android.graphics.drawable.Drawable, android.content.res.Resources.Theme);
+    method public static boolean canApplyTheme(android.graphics.drawable.Drawable);
+    method public static void clearColorFilter(android.graphics.drawable.Drawable);
+    method public static int getAlpha(android.graphics.drawable.Drawable);
+    method public static android.graphics.ColorFilter getColorFilter(android.graphics.drawable.Drawable);
+    method public static int getLayoutDirection(android.graphics.drawable.Drawable);
+    method public static void inflate(android.graphics.drawable.Drawable, android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources.Theme) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+    method public static boolean isAutoMirrored(android.graphics.drawable.Drawable);
+    method public static void jumpToCurrentState(android.graphics.drawable.Drawable);
+    method public static void setAutoMirrored(android.graphics.drawable.Drawable, boolean);
+    method public static void setHotspot(android.graphics.drawable.Drawable, float, float);
+    method public static void setHotspotBounds(android.graphics.drawable.Drawable, int, int, int, int);
+    method public static boolean setLayoutDirection(android.graphics.drawable.Drawable, int);
+    method public static void setTint(android.graphics.drawable.Drawable, int);
+    method public static void setTintList(android.graphics.drawable.Drawable, android.content.res.ColorStateList);
+    method public static void setTintMode(android.graphics.drawable.Drawable, android.graphics.PorterDuff.Mode);
+    method public static T unwrap(android.graphics.drawable.Drawable);
+    method public static android.graphics.drawable.Drawable wrap(android.graphics.drawable.Drawable);
+  }
+
+  public abstract class RoundedBitmapDrawable extends android.graphics.drawable.Drawable {
+    method public void draw(android.graphics.Canvas);
+    method public final android.graphics.Bitmap getBitmap();
+    method public float getCornerRadius();
+    method public int getGravity();
+    method public int getOpacity();
+    method public final android.graphics.Paint getPaint();
+    method public boolean hasAntiAlias();
+    method public boolean hasMipMap();
+    method public boolean isCircular();
+    method public void setAlpha(int);
+    method public void setAntiAlias(boolean);
+    method public void setCircular(boolean);
+    method public void setColorFilter(android.graphics.ColorFilter);
+    method public void setCornerRadius(float);
+    method public void setGravity(int);
+    method public void setMipMap(boolean);
+    method public void setTargetDensity(android.graphics.Canvas);
+    method public void setTargetDensity(android.util.DisplayMetrics);
+    method public void setTargetDensity(int);
+  }
+
+  public final class RoundedBitmapDrawableFactory {
+    method public static android.support.v4.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, android.graphics.Bitmap);
+    method public static android.support.v4.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, java.lang.String);
+    method public static android.support.v4.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, java.io.InputStream);
+  }
+
+}
+
+package android.support.v4.hardware.display {
+
+  public abstract class DisplayManagerCompat {
+    method public abstract android.view.Display getDisplay(int);
+    method public abstract android.view.Display[] getDisplays();
+    method public abstract android.view.Display[] getDisplays(java.lang.String);
+    method public static android.support.v4.hardware.display.DisplayManagerCompat getInstance(android.content.Context);
+    field public static final java.lang.String DISPLAY_CATEGORY_PRESENTATION = "android.hardware.display.category.PRESENTATION";
+  }
+
+}
+
+package android.support.v4.hardware.fingerprint {
+
+  public final class FingerprintManagerCompat {
+    method public void authenticate(android.support.v4.hardware.fingerprint.FingerprintManagerCompat.CryptoObject, int, android.support.v4.os.CancellationSignal, android.support.v4.hardware.fingerprint.FingerprintManagerCompat.AuthenticationCallback, android.os.Handler);
+    method public static android.support.v4.hardware.fingerprint.FingerprintManagerCompat from(android.content.Context);
+    method public boolean hasEnrolledFingerprints();
+    method public boolean isHardwareDetected();
+  }
+
+  public static abstract class FingerprintManagerCompat.AuthenticationCallback {
+    ctor public FingerprintManagerCompat.AuthenticationCallback();
+    method public void onAuthenticationError(int, java.lang.CharSequence);
+    method public void onAuthenticationFailed();
+    method public void onAuthenticationHelp(int, java.lang.CharSequence);
+    method public void onAuthenticationSucceeded(android.support.v4.hardware.fingerprint.FingerprintManagerCompat.AuthenticationResult);
+  }
+
+  public static final class FingerprintManagerCompat.AuthenticationResult {
+    ctor public FingerprintManagerCompat.AuthenticationResult(android.support.v4.hardware.fingerprint.FingerprintManagerCompat.CryptoObject);
+    method public android.support.v4.hardware.fingerprint.FingerprintManagerCompat.CryptoObject getCryptoObject();
+  }
+
+  public static class FingerprintManagerCompat.CryptoObject {
+    ctor public FingerprintManagerCompat.CryptoObject(java.security.Signature);
+    ctor public FingerprintManagerCompat.CryptoObject(javax.crypto.Cipher);
+    ctor public FingerprintManagerCompat.CryptoObject(javax.crypto.Mac);
+    method public javax.crypto.Cipher getCipher();
+    method public javax.crypto.Mac getMac();
+    method public java.security.Signature getSignature();
+  }
+
+}
+
+package android.support.v4.media {
+
+  public final class MediaBrowserCompat {
+    ctor public MediaBrowserCompat(android.content.Context, android.content.ComponentName, android.support.v4.media.MediaBrowserCompat.ConnectionCallback, android.os.Bundle);
+    method public void connect();
+    method public void disconnect();
+    method public android.os.Bundle getExtras();
+    method public void getItem(java.lang.String, android.support.v4.media.MediaBrowserCompat.ItemCallback);
+    method public java.lang.String getRoot();
+    method public android.content.ComponentName getServiceComponent();
+    method public android.support.v4.media.session.MediaSessionCompat.Token getSessionToken();
+    method public boolean isConnected();
+    method public void subscribe(java.lang.String, android.support.v4.media.MediaBrowserCompat.SubscriptionCallback);
+    method public void subscribe(java.lang.String, android.os.Bundle, android.support.v4.media.MediaBrowserCompat.SubscriptionCallback);
+    method public void unsubscribe(java.lang.String);
+    method public void unsubscribe(java.lang.String, android.support.v4.media.MediaBrowserCompat.SubscriptionCallback);
+    field public static final java.lang.String EXTRA_PAGE = "android.media.browse.extra.PAGE";
+    field public static final java.lang.String EXTRA_PAGE_SIZE = "android.media.browse.extra.PAGE_SIZE";
+  }
+
+  public static class MediaBrowserCompat.ConnectionCallback {
+    ctor public MediaBrowserCompat.ConnectionCallback();
+    method public void onConnected();
+    method public void onConnectionFailed();
+    method public void onConnectionSuspended();
+  }
+
+  public static abstract class MediaBrowserCompat.ItemCallback {
+    ctor public MediaBrowserCompat.ItemCallback();
+    method public void onError(java.lang.String);
+    method public void onItemLoaded(android.support.v4.media.MediaBrowserCompat.MediaItem);
+  }
+
+  public static class MediaBrowserCompat.MediaItem implements android.os.Parcelable {
+    ctor public MediaBrowserCompat.MediaItem(android.support.v4.media.MediaDescriptionCompat, int);
+    method public int describeContents();
+    method public android.support.v4.media.MediaDescriptionCompat getDescription();
+    method public int getFlags();
+    method public java.lang.String getMediaId();
+    method public boolean isBrowsable();
+    method public boolean isPlayable();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<android.support.v4.media.MediaBrowserCompat.MediaItem> CREATOR;
+    field public static final int FLAG_BROWSABLE = 1; // 0x1
+    field public static final int FLAG_PLAYABLE = 2; // 0x2
+  }
+
+  public static abstract class MediaBrowserCompat.SubscriptionCallback {
+    ctor public MediaBrowserCompat.SubscriptionCallback();
+    method public void onChildrenLoaded(java.lang.String, java.util.List<android.support.v4.media.MediaBrowserCompat.MediaItem>);
+    method public void onChildrenLoaded(java.lang.String, java.util.List<android.support.v4.media.MediaBrowserCompat.MediaItem>, android.os.Bundle);
+    method public void onError(java.lang.String);
+    method public void onError(java.lang.String, android.os.Bundle);
+  }
+
+  public abstract class MediaBrowserServiceCompat extends android.app.Service {
+    ctor public MediaBrowserServiceCompat();
+    method public void dump(java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
+    method public final android.os.Bundle getBrowserRootHints();
+    method public android.support.v4.media.session.MediaSessionCompat.Token getSessionToken();
+    method public void notifyChildrenChanged(java.lang.String);
+    method public void notifyChildrenChanged(java.lang.String, android.os.Bundle);
+    method public android.os.IBinder onBind(android.content.Intent);
+    method public abstract android.support.v4.media.MediaBrowserServiceCompat.BrowserRoot onGetRoot(java.lang.String, int, android.os.Bundle);
+    method public abstract void onLoadChildren(java.lang.String, android.support.v4.media.MediaBrowserServiceCompat.Result<java.util.List<android.support.v4.media.MediaBrowserCompat.MediaItem>>);
+    method public void onLoadChildren(java.lang.String, android.support.v4.media.MediaBrowserServiceCompat.Result<java.util.List<android.support.v4.media.MediaBrowserCompat.MediaItem>>, android.os.Bundle);
+    method public void onLoadItem(java.lang.String, android.support.v4.media.MediaBrowserServiceCompat.Result<android.support.v4.media.MediaBrowserCompat.MediaItem>);
+    method public void setSessionToken(android.support.v4.media.session.MediaSessionCompat.Token);
+    field public static final java.lang.String SERVICE_INTERFACE = "android.media.browse.MediaBrowserService";
+  }
+
+  public static final class MediaBrowserServiceCompat.BrowserRoot {
+    ctor public MediaBrowserServiceCompat.BrowserRoot(java.lang.String, android.os.Bundle);
+    method public android.os.Bundle getExtras();
+    method public java.lang.String getRootId();
+    field public static final java.lang.String EXTRA_OFFLINE = "android.service.media.extra.OFFLINE";
+    field public static final java.lang.String EXTRA_RECENT = "android.service.media.extra.RECENT";
+    field public static final java.lang.String EXTRA_SUGGESTED = "android.service.media.extra.SUGGESTED";
+  }
+
+  public static class MediaBrowserServiceCompat.Result {
+    method public void detach();
+    method public void sendResult(T);
+  }
+
+  public final class MediaDescriptionCompat implements android.os.Parcelable {
+    method public int describeContents();
+    method public static android.support.v4.media.MediaDescriptionCompat fromMediaDescription(java.lang.Object);
+    method public java.lang.CharSequence getDescription();
+    method public android.os.Bundle getExtras();
+    method public android.graphics.Bitmap getIconBitmap();
+    method public android.net.Uri getIconUri();
+    method public java.lang.Object getMediaDescription();
+    method public java.lang.String getMediaId();
+    method public android.net.Uri getMediaUri();
+    method public java.lang.CharSequence getSubtitle();
+    method public java.lang.CharSequence getTitle();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<android.support.v4.media.MediaDescriptionCompat> CREATOR;
+  }
+
+  public static final class MediaDescriptionCompat.Builder {
+    ctor public MediaDescriptionCompat.Builder();
+    method public android.support.v4.media.MediaDescriptionCompat build();
+    method public android.support.v4.media.MediaDescriptionCompat.Builder setDescription(java.lang.CharSequence);
+    method public android.support.v4.media.MediaDescriptionCompat.Builder setExtras(android.os.Bundle);
+    method public android.support.v4.media.MediaDescriptionCompat.Builder setIconBitmap(android.graphics.Bitmap);
+    method public android.support.v4.media.MediaDescriptionCompat.Builder setIconUri(android.net.Uri);
+    method public android.support.v4.media.MediaDescriptionCompat.Builder setMediaId(java.lang.String);
+    method public android.support.v4.media.MediaDescriptionCompat.Builder setMediaUri(android.net.Uri);
+    method public android.support.v4.media.MediaDescriptionCompat.Builder setSubtitle(java.lang.CharSequence);
+    method public android.support.v4.media.MediaDescriptionCompat.Builder setTitle(java.lang.CharSequence);
+  }
+
+  public final class MediaMetadataCompat implements android.os.Parcelable {
+    method public boolean containsKey(java.lang.String);
+    method public int describeContents();
+    method public static android.support.v4.media.MediaMetadataCompat fromMediaMetadata(java.lang.Object);
+    method public android.graphics.Bitmap getBitmap(java.lang.String);
+    method public android.os.Bundle getBundle();
+    method public android.support.v4.media.MediaDescriptionCompat getDescription();
+    method public long getLong(java.lang.String);
+    method public java.lang.Object getMediaMetadata();
+    method public android.support.v4.media.RatingCompat getRating(java.lang.String);
+    method public java.lang.String getString(java.lang.String);
+    method public java.lang.CharSequence getText(java.lang.String);
+    method public java.util.Set<java.lang.String> keySet();
+    method public int size();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<android.support.v4.media.MediaMetadataCompat> CREATOR;
+    field public static final java.lang.String METADATA_KEY_ALBUM = "android.media.metadata.ALBUM";
+    field public static final java.lang.String METADATA_KEY_ALBUM_ART = "android.media.metadata.ALBUM_ART";
+    field public static final java.lang.String METADATA_KEY_ALBUM_ARTIST = "android.media.metadata.ALBUM_ARTIST";
+    field public static final java.lang.String METADATA_KEY_ALBUM_ART_URI = "android.media.metadata.ALBUM_ART_URI";
+    field public static final java.lang.String METADATA_KEY_ART = "android.media.metadata.ART";
+    field public static final java.lang.String METADATA_KEY_ARTIST = "android.media.metadata.ARTIST";
+    field public static final java.lang.String METADATA_KEY_ART_URI = "android.media.metadata.ART_URI";
+    field public static final java.lang.String METADATA_KEY_AUTHOR = "android.media.metadata.AUTHOR";
+    field public static final java.lang.String METADATA_KEY_COMPILATION = "android.media.metadata.COMPILATION";
+    field public static final java.lang.String METADATA_KEY_COMPOSER = "android.media.metadata.COMPOSER";
+    field public static final java.lang.String METADATA_KEY_DATE = "android.media.metadata.DATE";
+    field public static final java.lang.String METADATA_KEY_DISC_NUMBER = "android.media.metadata.DISC_NUMBER";
+    field public static final java.lang.String METADATA_KEY_DISPLAY_DESCRIPTION = "android.media.metadata.DISPLAY_DESCRIPTION";
+    field public static final java.lang.String METADATA_KEY_DISPLAY_ICON = "android.media.metadata.DISPLAY_ICON";
+    field public static final java.lang.String METADATA_KEY_DISPLAY_ICON_URI = "android.media.metadata.DISPLAY_ICON_URI";
+    field public static final java.lang.String METADATA_KEY_DISPLAY_SUBTITLE = "android.media.metadata.DISPLAY_SUBTITLE";
+    field public static final java.lang.String METADATA_KEY_DISPLAY_TITLE = "android.media.metadata.DISPLAY_TITLE";
+    field public static final java.lang.String METADATA_KEY_DURATION = "android.media.metadata.DURATION";
+    field public static final java.lang.String METADATA_KEY_GENRE = "android.media.metadata.GENRE";
+    field public static final java.lang.String METADATA_KEY_MEDIA_ID = "android.media.metadata.MEDIA_ID";
+    field public static final java.lang.String METADATA_KEY_NUM_TRACKS = "android.media.metadata.NUM_TRACKS";
+    field public static final java.lang.String METADATA_KEY_RATING = "android.media.metadata.RATING";
+    field public static final java.lang.String METADATA_KEY_TITLE = "android.media.metadata.TITLE";
+    field public static final java.lang.String METADATA_KEY_TRACK_NUMBER = "android.media.metadata.TRACK_NUMBER";
+    field public static final java.lang.String METADATA_KEY_USER_RATING = "android.media.metadata.USER_RATING";
+    field public static final java.lang.String METADATA_KEY_WRITER = "android.media.metadata.WRITER";
+    field public static final java.lang.String METADATA_KEY_YEAR = "android.media.metadata.YEAR";
+  }
+
+  public static final class MediaMetadataCompat.Builder {
+    ctor public MediaMetadataCompat.Builder();
+    ctor public MediaMetadataCompat.Builder(android.support.v4.media.MediaMetadataCompat);
+    method public android.support.v4.media.MediaMetadataCompat build();
+    method public android.support.v4.media.MediaMetadataCompat.Builder putBitmap(java.lang.String, android.graphics.Bitmap);
+    method public android.support.v4.media.MediaMetadataCompat.Builder putLong(java.lang.String, long);
+    method public android.support.v4.media.MediaMetadataCompat.Builder putRating(java.lang.String, android.support.v4.media.RatingCompat);
+    method public android.support.v4.media.MediaMetadataCompat.Builder putString(java.lang.String, java.lang.String);
+    method public android.support.v4.media.MediaMetadataCompat.Builder putText(java.lang.String, java.lang.CharSequence);
+  }
+
+  public final class RatingCompat implements android.os.Parcelable {
+    method public int describeContents();
+    method public static android.support.v4.media.RatingCompat fromRating(java.lang.Object);
+    method public float getPercentRating();
+    method public java.lang.Object getRating();
+    method public int getRatingStyle();
+    method public float getStarRating();
+    method public boolean hasHeart();
+    method public boolean isRated();
+    method public boolean isThumbUp();
+    method public static android.support.v4.media.RatingCompat newHeartRating(boolean);
+    method public static android.support.v4.media.RatingCompat newPercentageRating(float);
+    method public static android.support.v4.media.RatingCompat newStarRating(int, float);
+    method public static android.support.v4.media.RatingCompat newThumbRating(boolean);
+    method public static android.support.v4.media.RatingCompat newUnratedRating(int);
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<android.support.v4.media.RatingCompat> CREATOR;
+    field public static final int RATING_3_STARS = 3; // 0x3
+    field public static final int RATING_4_STARS = 4; // 0x4
+    field public static final int RATING_5_STARS = 5; // 0x5
+    field public static final int RATING_HEART = 1; // 0x1
+    field public static final int RATING_NONE = 0; // 0x0
+    field public static final int RATING_PERCENTAGE = 6; // 0x6
+    field public static final int RATING_THUMB_UP_DOWN = 2; // 0x2
+  }
+
+  public abstract class TransportController {
+    ctor public TransportController();
+    method public abstract int getBufferPercentage();
+    method public abstract long getCurrentPosition();
+    method public abstract long getDuration();
+    method public abstract int getTransportControlFlags();
+    method public abstract boolean isPlaying();
+    method public abstract void pausePlaying();
+    method public abstract void registerStateListener(android.support.v4.media.TransportStateListener);
+    method public abstract void seekTo(long);
+    method public abstract void startPlaying();
+    method public abstract void stopPlaying();
+    method public abstract void unregisterStateListener(android.support.v4.media.TransportStateListener);
+  }
+
+  public class TransportMediator extends android.support.v4.media.TransportController {
+    ctor public TransportMediator(android.app.Activity, android.support.v4.media.TransportPerformer);
+    ctor public TransportMediator(android.view.View, android.support.v4.media.TransportPerformer);
+    method public void destroy();
+    method public boolean dispatchKeyEvent(android.view.KeyEvent);
+    method public int getBufferPercentage();
+    method public long getCurrentPosition();
+    method public long getDuration();
+    method public java.lang.Object getRemoteControlClient();
+    method public int getTransportControlFlags();
+    method public boolean isPlaying();
+    method public void pausePlaying();
+    method public void refreshState();
+    method public void registerStateListener(android.support.v4.media.TransportStateListener);
+    method public void seekTo(long);
+    method public void startPlaying();
+    method public void stopPlaying();
+    method public void unregisterStateListener(android.support.v4.media.TransportStateListener);
+    field public static final int FLAG_KEY_MEDIA_FAST_FORWARD = 64; // 0x40
+    field public static final int FLAG_KEY_MEDIA_NEXT = 128; // 0x80
+    field public static final int FLAG_KEY_MEDIA_PAUSE = 16; // 0x10
+    field public static final int FLAG_KEY_MEDIA_PLAY = 4; // 0x4
+    field public static final int FLAG_KEY_MEDIA_PLAY_PAUSE = 8; // 0x8
+    field public static final int FLAG_KEY_MEDIA_PREVIOUS = 1; // 0x1
+    field public static final int FLAG_KEY_MEDIA_REWIND = 2; // 0x2
+    field public static final int FLAG_KEY_MEDIA_STOP = 32; // 0x20
+    field public static final int KEYCODE_MEDIA_PAUSE = 127; // 0x7f
+    field public static final int KEYCODE_MEDIA_PLAY = 126; // 0x7e
+    field public static final int KEYCODE_MEDIA_RECORD = 130; // 0x82
+  }
+
+  public abstract class TransportPerformer {
+    ctor public TransportPerformer();
+    method public void onAudioFocusChange(int);
+    method public int onGetBufferPercentage();
+    method public abstract long onGetCurrentPosition();
+    method public abstract long onGetDuration();
+    method public int onGetTransportControlFlags();
+    method public abstract boolean onIsPlaying();
+    method public boolean onMediaButtonDown(int, android.view.KeyEvent);
+    method public boolean onMediaButtonUp(int, android.view.KeyEvent);
+    method public abstract void onPause();
+    method public abstract void onSeekTo(long);
+    method public abstract void onStart();
+    method public abstract void onStop();
+  }
+
+  public class TransportStateListener {
+    ctor public TransportStateListener();
+    method public void onPlayingChanged(android.support.v4.media.TransportController);
+    method public void onTransportControlsChanged(android.support.v4.media.TransportController);
+  }
+
+  public abstract class VolumeProviderCompat {
+    ctor public VolumeProviderCompat(int, int, int);
+    method public final int getCurrentVolume();
+    method public final int getMaxVolume();
+    method public final int getVolumeControl();
+    method public java.lang.Object getVolumeProvider();
+    method public void onAdjustVolume(int);
+    method public void onSetVolumeTo(int);
+    method public void setCallback(android.support.v4.media.VolumeProviderCompat.Callback);
+    method public final void setCurrentVolume(int);
+    field public static final int VOLUME_CONTROL_ABSOLUTE = 2; // 0x2
+    field public static final int VOLUME_CONTROL_FIXED = 0; // 0x0
+    field public static final int VOLUME_CONTROL_RELATIVE = 1; // 0x1
+  }
+
+  public static abstract class VolumeProviderCompat.Callback {
+    ctor public VolumeProviderCompat.Callback();
+    method public abstract void onVolumeChanged(android.support.v4.media.VolumeProviderCompat);
+  }
+
+}
+
+package android.support.v4.media.session {
+
+  public class MediaButtonReceiver extends android.content.BroadcastReceiver {
+    ctor public MediaButtonReceiver();
+    method public static android.view.KeyEvent handleIntent(android.support.v4.media.session.MediaSessionCompat, android.content.Intent);
+    method public void onReceive(android.content.Context, android.content.Intent);
+  }
+
+  public final class MediaControllerCompat {
+    ctor public MediaControllerCompat(android.content.Context, android.support.v4.media.session.MediaSessionCompat);
+    ctor public MediaControllerCompat(android.content.Context, android.support.v4.media.session.MediaSessionCompat.Token) throws android.os.RemoteException;
+    method public void adjustVolume(int, int);
+    method public boolean dispatchMediaButtonEvent(android.view.KeyEvent);
+    method public android.os.Bundle getExtras();
+    method public long getFlags();
+    method public java.lang.Object getMediaController();
+    method public android.support.v4.media.MediaMetadataCompat getMetadata();
+    method public java.lang.String getPackageName();
+    method public android.support.v4.media.session.MediaControllerCompat.PlaybackInfo getPlaybackInfo();
+    method public android.support.v4.media.session.PlaybackStateCompat getPlaybackState();
+    method public java.util.List<android.support.v4.media.session.MediaSessionCompat.QueueItem> getQueue();
+    method public java.lang.CharSequence getQueueTitle();
+    method public int getRatingType();
+    method public android.app.PendingIntent getSessionActivity();
+    method public android.support.v4.media.session.MediaSessionCompat.Token getSessionToken();
+    method public android.support.v4.media.session.MediaControllerCompat.TransportControls getTransportControls();
+    method public void registerCallback(android.support.v4.media.session.MediaControllerCompat.Callback);
+    method public void registerCallback(android.support.v4.media.session.MediaControllerCompat.Callback, android.os.Handler);
+    method public void sendCommand(java.lang.String, android.os.Bundle, android.os.ResultReceiver);
+    method public void setVolumeTo(int, int);
+    method public void unregisterCallback(android.support.v4.media.session.MediaControllerCompat.Callback);
+  }
+
+  public static abstract class MediaControllerCompat.Callback implements android.os.IBinder.DeathRecipient {
+    ctor public MediaControllerCompat.Callback();
+    method public void binderDied();
+    method public void onAudioInfoChanged(android.support.v4.media.session.MediaControllerCompat.PlaybackInfo);
+    method public void onExtrasChanged(android.os.Bundle);
+    method public void onMetadataChanged(android.support.v4.media.MediaMetadataCompat);
+    method public void onPlaybackStateChanged(android.support.v4.media.session.PlaybackStateCompat);
+    method public void onQueueChanged(java.util.List<android.support.v4.media.session.MediaSessionCompat.QueueItem>);
+    method public void onQueueTitleChanged(java.lang.CharSequence);
+    method public void onSessionDestroyed();
+    method public void onSessionEvent(java.lang.String, android.os.Bundle);
+  }
+
+  public static final class MediaControllerCompat.PlaybackInfo {
+    method public int getAudioStream();
+    method public int getCurrentVolume();
+    method public int getMaxVolume();
+    method public int getPlaybackType();
+    method public int getVolumeControl();
+    field public static final int PLAYBACK_TYPE_LOCAL = 1; // 0x1
+    field public static final int PLAYBACK_TYPE_REMOTE = 2; // 0x2
+  }
+
+  public static abstract class MediaControllerCompat.TransportControls {
+    method public abstract void fastForward();
+    method public abstract void pause();
+    method public abstract void play();
+    method public abstract void playFromMediaId(java.lang.String, android.os.Bundle);
+    method public abstract void playFromSearch(java.lang.String, android.os.Bundle);
+    method public abstract void playFromUri(android.net.Uri, android.os.Bundle);
+    method public abstract void prepare();
+    method public abstract void prepareFromMediaId(java.lang.String, android.os.Bundle);
+    method public abstract void prepareFromSearch(java.lang.String, android.os.Bundle);
+    method public abstract void prepareFromUri(android.net.Uri, android.os.Bundle);
+    method public abstract void rewind();
+    method public abstract void seekTo(long);
+    method public abstract void sendCustomAction(android.support.v4.media.session.PlaybackStateCompat.CustomAction, android.os.Bundle);
+    method public abstract void sendCustomAction(java.lang.String, android.os.Bundle);
+    method public abstract void setRating(android.support.v4.media.RatingCompat);
+    method public abstract void skipToNext();
+    method public abstract void skipToPrevious();
+    method public abstract void skipToQueueItem(long);
+    method public abstract void stop();
+  }
+
+  public class MediaSessionCompat {
+    ctor public MediaSessionCompat(android.content.Context, java.lang.String);
+    ctor public MediaSessionCompat(android.content.Context, java.lang.String, android.content.ComponentName, android.app.PendingIntent);
+    method public void addOnActiveChangeListener(android.support.v4.media.session.MediaSessionCompat.OnActiveChangeListener);
+    method public android.support.v4.media.session.MediaControllerCompat getController();
+    method public java.lang.Object getMediaSession();
+    method public java.lang.Object getRemoteControlClient();
+    method public android.support.v4.media.session.MediaSessionCompat.Token getSessionToken();
+    method public boolean isActive();
+    method public static android.support.v4.media.session.MediaSessionCompat obtain(android.content.Context, java.lang.Object);
+    method public void release();
+    method public void removeOnActiveChangeListener(android.support.v4.media.session.MediaSessionCompat.OnActiveChangeListener);
+    method public void sendSessionEvent(java.lang.String, android.os.Bundle);
+    method public void setActive(boolean);
+    method public void setCallback(android.support.v4.media.session.MediaSessionCompat.Callback);
+    method public void setCallback(android.support.v4.media.session.MediaSessionCompat.Callback, android.os.Handler);
+    method public void setExtras(android.os.Bundle);
+    method public void setFlags(int);
+    method public void setMediaButtonReceiver(android.app.PendingIntent);
+    method public void setMetadata(android.support.v4.media.MediaMetadataCompat);
+    method public void setPlaybackState(android.support.v4.media.session.PlaybackStateCompat);
+    method public void setPlaybackToLocal(int);
+    method public void setPlaybackToRemote(android.support.v4.media.VolumeProviderCompat);
+    method public void setQueue(java.util.List<android.support.v4.media.session.MediaSessionCompat.QueueItem>);
+    method public void setQueueTitle(java.lang.CharSequence);
+    method public void setRatingType(int);
+    method public void setSessionActivity(android.app.PendingIntent);
+    field public static final int FLAG_HANDLES_MEDIA_BUTTONS = 1; // 0x1
+    field public static final int FLAG_HANDLES_TRANSPORT_CONTROLS = 2; // 0x2
+  }
+
+  public static abstract class MediaSessionCompat.Callback {
+    ctor public MediaSessionCompat.Callback();
+    method public void onCommand(java.lang.String, android.os.Bundle, android.os.ResultReceiver);
+    method public void onCustomAction(java.lang.String, android.os.Bundle);
+    method public void onFastForward();
+    method public boolean onMediaButtonEvent(android.content.Intent);
+    method public void onPause();
+    method public void onPlay();
+    method public void onPlayFromMediaId(java.lang.String, android.os.Bundle);
+    method public void onPlayFromSearch(java.lang.String, android.os.Bundle);
+    method public void onPlayFromUri(android.net.Uri, android.os.Bundle);
+    method public void onPrepare();
+    method public void onPrepareFromMediaId(java.lang.String, android.os.Bundle);
+    method public void onPrepareFromSearch(java.lang.String, android.os.Bundle);
+    method public void onPrepareFromUri(android.net.Uri, android.os.Bundle);
+    method public void onRewind();
+    method public void onSeekTo(long);
+    method public void onSetRating(android.support.v4.media.RatingCompat);
+    method public void onSkipToNext();
+    method public void onSkipToPrevious();
+    method public void onSkipToQueueItem(long);
+    method public void onStop();
+  }
+
+  public static abstract interface MediaSessionCompat.OnActiveChangeListener {
+    method public abstract void onActiveChanged();
+  }
+
+  public static final class MediaSessionCompat.QueueItem implements android.os.Parcelable {
+    ctor public MediaSessionCompat.QueueItem(android.support.v4.media.MediaDescriptionCompat, long);
+    method public int describeContents();
+    method public android.support.v4.media.MediaDescriptionCompat getDescription();
+    method public long getQueueId();
+    method public java.lang.Object getQueueItem();
+    method public static android.support.v4.media.session.MediaSessionCompat.QueueItem obtain(java.lang.Object);
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<android.support.v4.media.session.MediaSessionCompat.QueueItem> CREATOR;
+    field public static final int UNKNOWN_ID = -1; // 0xffffffff
+  }
+
+  public static final class MediaSessionCompat.Token implements android.os.Parcelable {
+    method public int describeContents();
+    method public static android.support.v4.media.session.MediaSessionCompat.Token fromToken(java.lang.Object);
+    method public java.lang.Object getToken();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<android.support.v4.media.session.MediaSessionCompat.Token> CREATOR;
+  }
+
+  public class ParcelableVolumeInfo implements android.os.Parcelable {
+    ctor public ParcelableVolumeInfo(int, int, int, int, int);
+    ctor public ParcelableVolumeInfo(android.os.Parcel);
+    method public int describeContents();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<android.support.v4.media.session.ParcelableVolumeInfo> CREATOR;
+    field public int audioStream;
+    field public int controlType;
+    field public int currentVolume;
+    field public int maxVolume;
+    field public int volumeType;
+  }
+
+  public final class PlaybackStateCompat implements android.os.Parcelable {
+    method public int describeContents();
+    method public static android.support.v4.media.session.PlaybackStateCompat fromPlaybackState(java.lang.Object);
+    method public long getActions();
+    method public long getActiveQueueItemId();
+    method public long getBufferedPosition();
+    method public java.util.List<android.support.v4.media.session.PlaybackStateCompat.CustomAction> getCustomActions();
+    method public java.lang.CharSequence getErrorMessage();
+    method public android.os.Bundle getExtras();
+    method public long getLastPositionUpdateTime();
+    method public float getPlaybackSpeed();
+    method public java.lang.Object getPlaybackState();
+    method public long getPosition();
+    method public int getState();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final long ACTION_FAST_FORWARD = 64L; // 0x40L
+    field public static final long ACTION_PAUSE = 2L; // 0x2L
+    field public static final long ACTION_PLAY = 4L; // 0x4L
+    field public static final long ACTION_PLAY_FROM_MEDIA_ID = 1024L; // 0x400L
+    field public static final long ACTION_PLAY_FROM_SEARCH = 2048L; // 0x800L
+    field public static final long ACTION_PLAY_FROM_URI = 8192L; // 0x2000L
+    field public static final long ACTION_PLAY_PAUSE = 512L; // 0x200L
+    field public static final long ACTION_PREPARE = 16384L; // 0x4000L
+    field public static final long ACTION_PREPARE_FROM_MEDIA_ID = 32768L; // 0x8000L
+    field public static final long ACTION_PREPARE_FROM_SEARCH = 65536L; // 0x10000L
+    field public static final long ACTION_PREPARE_FROM_URI = 131072L; // 0x20000L
+    field public static final long ACTION_REWIND = 8L; // 0x8L
+    field public static final long ACTION_SEEK_TO = 256L; // 0x100L
+    field public static final long ACTION_SET_RATING = 128L; // 0x80L
+    field public static final long ACTION_SKIP_TO_NEXT = 32L; // 0x20L
+    field public static final long ACTION_SKIP_TO_PREVIOUS = 16L; // 0x10L
+    field public static final long ACTION_SKIP_TO_QUEUE_ITEM = 4096L; // 0x1000L
+    field public static final long ACTION_STOP = 1L; // 0x1L
+    field public static final android.os.Parcelable.Creator<android.support.v4.media.session.PlaybackStateCompat> CREATOR;
+    field public static final long PLAYBACK_POSITION_UNKNOWN = -1L; // 0xffffffffffffffffL
+    field public static final int STATE_BUFFERING = 6; // 0x6
+    field public static final int STATE_CONNECTING = 8; // 0x8
+    field public static final int STATE_ERROR = 7; // 0x7
+    field public static final int STATE_FAST_FORWARDING = 4; // 0x4
+    field public static final int STATE_NONE = 0; // 0x0
+    field public static final int STATE_PAUSED = 2; // 0x2
+    field public static final int STATE_PLAYING = 3; // 0x3
+    field public static final int STATE_REWINDING = 5; // 0x5
+    field public static final int STATE_SKIPPING_TO_NEXT = 10; // 0xa
+    field public static final int STATE_SKIPPING_TO_PREVIOUS = 9; // 0x9
+    field public static final int STATE_SKIPPING_TO_QUEUE_ITEM = 11; // 0xb
+    field public static final int STATE_STOPPED = 1; // 0x1
+  }
+
+  public static final class PlaybackStateCompat.Builder {
+    ctor public PlaybackStateCompat.Builder();
+    ctor public PlaybackStateCompat.Builder(android.support.v4.media.session.PlaybackStateCompat);
+    method public android.support.v4.media.session.PlaybackStateCompat.Builder addCustomAction(java.lang.String, java.lang.String, int);
+    method public android.support.v4.media.session.PlaybackStateCompat.Builder addCustomAction(android.support.v4.media.session.PlaybackStateCompat.CustomAction);
+    method public android.support.v4.media.session.PlaybackStateCompat build();
+    method public android.support.v4.media.session.PlaybackStateCompat.Builder setActions(long);
+    method public android.support.v4.media.session.PlaybackStateCompat.Builder setActiveQueueItemId(long);
+    method public android.support.v4.media.session.PlaybackStateCompat.Builder setBufferedPosition(long);
+    method public android.support.v4.media.session.PlaybackStateCompat.Builder setErrorMessage(java.lang.CharSequence);
+    method public android.support.v4.media.session.PlaybackStateCompat.Builder setExtras(android.os.Bundle);
+    method public android.support.v4.media.session.PlaybackStateCompat.Builder setState(int, long, float);
+    method public android.support.v4.media.session.PlaybackStateCompat.Builder setState(int, long, float, long);
+  }
+
+  public static final class PlaybackStateCompat.CustomAction implements android.os.Parcelable {
+    method public int describeContents();
+    method public static android.support.v4.media.session.PlaybackStateCompat.CustomAction fromCustomAction(java.lang.Object);
+    method public java.lang.String getAction();
+    method public java.lang.Object getCustomAction();
+    method public android.os.Bundle getExtras();
+    method public int getIcon();
+    method public java.lang.CharSequence getName();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<android.support.v4.media.session.PlaybackStateCompat.CustomAction> CREATOR;
+  }
+
+  public static final class PlaybackStateCompat.CustomAction.Builder {
+    ctor public PlaybackStateCompat.CustomAction.Builder(java.lang.String, java.lang.CharSequence, int);
+    method public android.support.v4.media.session.PlaybackStateCompat.CustomAction build();
+    method public android.support.v4.media.session.PlaybackStateCompat.CustomAction.Builder setExtras(android.os.Bundle);
+  }
+
+}
+
+package android.support.v4.net {
+
+  public final class ConnectivityManagerCompat {
+    method public static android.net.NetworkInfo getNetworkInfoFromBroadcast(android.net.ConnectivityManager, android.content.Intent);
+    method public static boolean isActiveNetworkMetered(android.net.ConnectivityManager);
+  }
+
+  public final class TrafficStatsCompat {
+    method public static void clearThreadStatsTag();
+    method public static int getThreadStatsTag();
+    method public static void incrementOperationCount(int);
+    method public static void incrementOperationCount(int, int);
+    method public static void setThreadStatsTag(int);
+    method public static void tagDatagramSocket(java.net.DatagramSocket) throws java.net.SocketException;
+    method public static void tagSocket(java.net.Socket) throws java.net.SocketException;
+    method public static void untagDatagramSocket(java.net.DatagramSocket) throws java.net.SocketException;
+    method public static void untagSocket(java.net.Socket) throws java.net.SocketException;
+  }
+
+}
+
+package android.support.v4.os {
+
+  public final class AsyncTaskCompat {
+    method public static android.os.AsyncTask<Params, Progress, Result> executeParallel(android.os.AsyncTask<Params, Progress, Result>, Params...);
+  }
+
+  public class BuildCompat {
+    method public static boolean isAtLeastN();
+  }
+
+  public final class CancellationSignal {
+    ctor public CancellationSignal();
+    method public void cancel();
+    method public java.lang.Object getCancellationSignalObject();
+    method public boolean isCanceled();
+    method public void setOnCancelListener(android.support.v4.os.CancellationSignal.OnCancelListener);
+    method public void throwIfCanceled();
+  }
+
+  public static abstract interface CancellationSignal.OnCancelListener {
+    method public abstract void onCancel();
+  }
+
+  public final class EnvironmentCompat {
+    method public static java.lang.String getStorageState(java.io.File);
+    field public static final java.lang.String MEDIA_UNKNOWN = "unknown";
+  }
+
+  public class OperationCanceledException extends java.lang.RuntimeException {
+    ctor public OperationCanceledException();
+    ctor public OperationCanceledException(java.lang.String);
+  }
+
+  public final class ParcelableCompat {
+    method public static android.os.Parcelable.Creator<T> newCreator(android.support.v4.os.ParcelableCompatCreatorCallbacks<T>);
+  }
+
+  public abstract interface ParcelableCompatCreatorCallbacks {
+    method public abstract T createFromParcel(android.os.Parcel, java.lang.ClassLoader);
+    method public abstract T[] newArray(int);
+  }
+
+  public final class TraceCompat {
+    method public static void beginSection(java.lang.String);
+    method public static void endSection();
+  }
+
+  public class UserManagerCompat {
+    method public static boolean isUserUnlocked(android.content.Context);
+  }
+
+}
+
+package android.support.v4.print {
+
+  public final class PrintHelper {
+    ctor public PrintHelper(android.content.Context);
+    method public int getColorMode();
+    method public int getOrientation();
+    method public int getScaleMode();
+    method public void printBitmap(java.lang.String, android.graphics.Bitmap);
+    method public void printBitmap(java.lang.String, android.graphics.Bitmap, android.support.v4.print.PrintHelper.OnPrintFinishCallback);
+    method public void printBitmap(java.lang.String, android.net.Uri) throws java.io.FileNotFoundException;
+    method public void printBitmap(java.lang.String, android.net.Uri, android.support.v4.print.PrintHelper.OnPrintFinishCallback) throws java.io.FileNotFoundException;
+    method public void setColorMode(int);
+    method public void setOrientation(int);
+    method public void setScaleMode(int);
+    method public static boolean systemSupportsPrint();
+    field public static final int COLOR_MODE_COLOR = 2; // 0x2
+    field public static final int COLOR_MODE_MONOCHROME = 1; // 0x1
+    field public static final int ORIENTATION_LANDSCAPE = 1; // 0x1
+    field public static final int ORIENTATION_PORTRAIT = 2; // 0x2
+    field public static final int SCALE_MODE_FILL = 2; // 0x2
+    field public static final int SCALE_MODE_FIT = 1; // 0x1
+  }
+
+  public static abstract interface PrintHelper.OnPrintFinishCallback {
+    method public abstract void onFinish();
+  }
+
+}
+
+package android.support.v4.provider {
+
+  public abstract class DocumentFile {
+    method public abstract boolean canRead();
+    method public abstract boolean canWrite();
+    method public abstract android.support.v4.provider.DocumentFile createDirectory(java.lang.String);
+    method public abstract android.support.v4.provider.DocumentFile createFile(java.lang.String, java.lang.String);
+    method public abstract boolean delete();
+    method public abstract boolean exists();
+    method public android.support.v4.provider.DocumentFile findFile(java.lang.String);
+    method public static android.support.v4.provider.DocumentFile fromFile(java.io.File);
+    method public static android.support.v4.provider.DocumentFile fromSingleUri(android.content.Context, android.net.Uri);
+    method public static android.support.v4.provider.DocumentFile fromTreeUri(android.content.Context, android.net.Uri);
+    method public abstract java.lang.String getName();
+    method public android.support.v4.provider.DocumentFile getParentFile();
+    method public abstract java.lang.String getType();
+    method public abstract android.net.Uri getUri();
+    method public abstract boolean isDirectory();
+    method public static boolean isDocumentUri(android.content.Context, android.net.Uri);
+    method public abstract boolean isFile();
+    method public abstract long lastModified();
+    method public abstract long length();
+    method public abstract android.support.v4.provider.DocumentFile[] listFiles();
+    method public abstract boolean renameTo(java.lang.String);
+  }
+
+}
+
+package android.support.v4.text {
+
+  public final class BidiFormatter {
+    method public static android.support.v4.text.BidiFormatter getInstance();
+    method public static android.support.v4.text.BidiFormatter getInstance(boolean);
+    method public static android.support.v4.text.BidiFormatter getInstance(java.util.Locale);
+    method public boolean getStereoReset();
+    method public boolean isRtl(java.lang.String);
+    method public boolean isRtlContext();
+    method public java.lang.String unicodeWrap(java.lang.String, android.support.v4.text.TextDirectionHeuristicCompat, boolean);
+    method public java.lang.String unicodeWrap(java.lang.String, android.support.v4.text.TextDirectionHeuristicCompat);
+    method public java.lang.String unicodeWrap(java.lang.String, boolean);
+    method public java.lang.String unicodeWrap(java.lang.String);
+  }
+
+  public static final class BidiFormatter.Builder {
+    ctor public BidiFormatter.Builder();
+    ctor public BidiFormatter.Builder(boolean);
+    ctor public BidiFormatter.Builder(java.util.Locale);
+    method public android.support.v4.text.BidiFormatter build();
+    method public android.support.v4.text.BidiFormatter.Builder setTextDirectionHeuristic(android.support.v4.text.TextDirectionHeuristicCompat);
+    method public android.support.v4.text.BidiFormatter.Builder stereoReset(boolean);
+  }
+
+  public final class ICUCompat {
+    method public static java.lang.String maximizeAndGetScript(java.util.Locale);
+  }
+
+  public abstract interface TextDirectionHeuristicCompat {
+    method public abstract boolean isRtl(char[], int, int);
+    method public abstract boolean isRtl(java.lang.CharSequence, int, int);
+  }
+
+  public final class TextDirectionHeuristicsCompat {
+    field public static final android.support.v4.text.TextDirectionHeuristicCompat ANYRTL_LTR;
+    field public static final android.support.v4.text.TextDirectionHeuristicCompat FIRSTSTRONG_LTR;
+    field public static final android.support.v4.text.TextDirectionHeuristicCompat FIRSTSTRONG_RTL;
+    field public static final android.support.v4.text.TextDirectionHeuristicCompat LOCALE;
+    field public static final android.support.v4.text.TextDirectionHeuristicCompat LTR;
+    field public static final android.support.v4.text.TextDirectionHeuristicCompat RTL;
+  }
+
+  public final class TextUtilsCompat {
+    method public static int getLayoutDirectionFromLocale(java.util.Locale);
+    method public static java.lang.String htmlEncode(java.lang.String);
+    field public static final java.util.Locale ROOT;
+  }
+
+}
+
+package android.support.v4.text.util {
+
+  public final class LinkifyCompat {
+    method public static final boolean addLinks(android.text.Spannable, int);
+    method public static final boolean addLinks(android.widget.TextView, int);
+    method public static final void addLinks(android.widget.TextView, java.util.regex.Pattern, java.lang.String);
+    method public static final void addLinks(android.widget.TextView, java.util.regex.Pattern, java.lang.String, android.text.util.Linkify.MatchFilter, android.text.util.Linkify.TransformFilter);
+    method public static final void addLinks(android.widget.TextView, java.util.regex.Pattern, java.lang.String, java.lang.String[], android.text.util.Linkify.MatchFilter, android.text.util.Linkify.TransformFilter);
+    method public static final boolean addLinks(android.text.Spannable, java.util.regex.Pattern, java.lang.String);
+    method public static final boolean addLinks(android.text.Spannable, java.util.regex.Pattern, java.lang.String, android.text.util.Linkify.MatchFilter, android.text.util.Linkify.TransformFilter);
+    method public static final boolean addLinks(android.text.Spannable, java.util.regex.Pattern, java.lang.String, java.lang.String[], android.text.util.Linkify.MatchFilter, android.text.util.Linkify.TransformFilter);
+  }
+
+  public static abstract class LinkifyCompat.LinkifyMask implements java.lang.annotation.Annotation {
+  }
+
+}
+
+package android.support.v4.util {
+
+  public class ArrayMap extends android.support.v4.util.SimpleArrayMap implements java.util.Map {
+    ctor public ArrayMap();
+    ctor public ArrayMap(int);
+    ctor public ArrayMap(android.support.v4.util.SimpleArrayMap);
+    method public boolean containsAll(java.util.Collection<?>);
+    method public java.util.Set<java.util.Map.Entry<K, V>> entrySet();
+    method public java.util.Set<K> keySet();
+    method public void putAll(java.util.Map<? extends K, ? extends V>);
+    method public boolean removeAll(java.util.Collection<?>);
+    method public boolean retainAll(java.util.Collection<?>);
+    method public java.util.Collection<V> values();
+  }
+
+  public class AtomicFile {
+    ctor public AtomicFile(java.io.File);
+    method public void delete();
+    method public void failWrite(java.io.FileOutputStream);
+    method public void finishWrite(java.io.FileOutputStream);
+    method public java.io.File getBaseFile();
+    method public java.io.FileInputStream openRead() throws java.io.FileNotFoundException;
+    method public byte[] readFully() throws java.io.IOException;
+    method public java.io.FileOutputStream startWrite() throws java.io.IOException;
+  }
+
+  public final class CircularArray {
+    ctor public CircularArray();
+    ctor public CircularArray(int);
+    method public void addFirst(E);
+    method public void addLast(E);
+    method public void clear();
+    method public E get(int);
+    method public E getFirst();
+    method public E getLast();
+    method public boolean isEmpty();
+    method public E popFirst();
+    method public E popLast();
+    method public void removeFromEnd(int);
+    method public void removeFromStart(int);
+    method public int size();
+  }
+
+  public final class CircularIntArray {
+    ctor public CircularIntArray();
+    ctor public CircularIntArray(int);
+    method public void addFirst(int);
+    method public void addLast(int);
+    method public void clear();
+    method public int get(int);
+    method public int getFirst();
+    method public int getLast();
+    method public boolean isEmpty();
+    method public int popFirst();
+    method public int popLast();
+    method public void removeFromEnd(int);
+    method public void removeFromStart(int);
+    method public int size();
+  }
+
+  public class LongSparseArray {
+    ctor public LongSparseArray();
+    ctor public LongSparseArray(int);
+    method public void append(long, E);
+    method public void clear();
+    method public android.support.v4.util.LongSparseArray<E> clone();
+    method public void delete(long);
+    method public E get(long);
+    method public E get(long, E);
+    method public int indexOfKey(long);
+    method public int indexOfValue(E);
+    method public long keyAt(int);
+    method public void put(long, E);
+    method public void remove(long);
+    method public void removeAt(int);
+    method public void setValueAt(int, E);
+    method public int size();
+    method public E valueAt(int);
+  }
+
+  public class LruCache {
+    ctor public LruCache(int);
+    method protected V create(K);
+    method public final synchronized int createCount();
+    method protected void entryRemoved(boolean, K, V, V);
+    method public final void evictAll();
+    method public final synchronized int evictionCount();
+    method public final V get(K);
+    method public final synchronized int hitCount();
+    method public final synchronized int maxSize();
+    method public final synchronized int missCount();
+    method public final V put(K, V);
+    method public final synchronized int putCount();
+    method public final V remove(K);
+    method public void resize(int);
+    method public final synchronized int size();
+    method protected int sizeOf(K, V);
+    method public final synchronized java.util.Map<K, V> snapshot();
+    method public final synchronized java.lang.String toString();
+    method public void trimToSize(int);
+  }
+
+  public class Pair {
+    ctor public Pair(F, S);
+    method public static android.support.v4.util.Pair<A, B> create(A, B);
+    field public final F first;
+    field public final S second;
+  }
+
+  public final class PatternsCompat {
+    field public static final java.util.regex.Pattern DOMAIN_NAME;
+    field public static final java.util.regex.Pattern EMAIL_ADDRESS;
+    field public static final java.util.regex.Pattern IP_ADDRESS;
+    field public static final java.util.regex.Pattern WEB_URL;
+  }
+
+  public final class Pools {
+  }
+
+  public static abstract interface Pools.Pool {
+    method public abstract T acquire();
+    method public abstract boolean release(T);
+  }
+
+  public static class Pools.SimplePool implements android.support.v4.util.Pools.Pool {
+    ctor public Pools.SimplePool(int);
+    method public T acquire();
+    method public boolean release(T);
+  }
+
+  public static class Pools.SynchronizedPool extends android.support.v4.util.Pools.SimplePool {
+    ctor public Pools.SynchronizedPool(int);
+  }
+
+  public class SimpleArrayMap {
+    ctor public SimpleArrayMap();
+    ctor public SimpleArrayMap(int);
+    ctor public SimpleArrayMap(android.support.v4.util.SimpleArrayMap);
+    method public void clear();
+    method public boolean containsKey(java.lang.Object);
+    method public boolean containsValue(java.lang.Object);
+    method public void ensureCapacity(int);
+    method public V get(java.lang.Object);
+    method public int indexOfKey(java.lang.Object);
+    method public boolean isEmpty();
+    method public K keyAt(int);
+    method public V put(K, V);
+    method public void putAll(android.support.v4.util.SimpleArrayMap<? extends K, ? extends V>);
+    method public V remove(java.lang.Object);
+    method public V removeAt(int);
+    method public V setValueAt(int, V);
+    method public int size();
+    method public V valueAt(int);
+  }
+
+  public class SparseArrayCompat {
+    ctor public SparseArrayCompat();
+    ctor public SparseArrayCompat(int);
+    method public void append(int, E);
+    method public void clear();
+    method public android.support.v4.util.SparseArrayCompat<E> clone();
+    method public void delete(int);
+    method public E get(int);
+    method public E get(int, E);
+    method public int indexOfKey(int);
+    method public int indexOfValue(E);
+    method public int keyAt(int);
+    method public void put(int, E);
+    method public void remove(int);
+    method public void removeAt(int);
+    method public void removeAtRange(int, int);
+    method public void setValueAt(int, E);
+    method public int size();
+    method public E valueAt(int);
+  }
+
+}
+
+package android.support.v4.view {
+
+  public abstract class AbsSavedState implements android.os.Parcelable {
+    ctor protected AbsSavedState(android.os.Parcelable);
+    ctor protected AbsSavedState(android.os.Parcel);
+    ctor protected AbsSavedState(android.os.Parcel, java.lang.ClassLoader);
+    method public int describeContents();
+    method public final android.os.Parcelable getSuperState();
+    method public void writeToParcel(android.os.Parcel, int);
+    field public static final android.os.Parcelable.Creator<android.support.v4.view.AbsSavedState> CREATOR;
+    field public static final android.support.v4.view.AbsSavedState EMPTY_STATE;
+  }
+
+  public class AccessibilityDelegateCompat {
+    ctor public AccessibilityDelegateCompat();
+    method public boolean dispatchPopulateAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
+    method public android.support.v4.view.accessibility.AccessibilityNodeProviderCompat getAccessibilityNodeProvider(android.view.View);
+    method public void onInitializeAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
+    method public void onInitializeAccessibilityNodeInfo(android.view.View, android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
+    method public void onPopulateAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
+    method public boolean onRequestSendAccessibilityEvent(android.view.ViewGroup, android.view.View, android.view.accessibility.AccessibilityEvent);
+    method public boolean performAccessibilityAction(android.view.View, int, android.os.Bundle);
+    method public void sendAccessibilityEvent(android.view.View, int);
+    method public void sendAccessibilityEventUnchecked(android.view.View, android.view.accessibility.AccessibilityEvent);
+  }
+
+  public abstract class ActionProvider {
+    ctor public ActionProvider(android.content.Context);
+    method public android.content.Context getContext();
+    method public boolean hasSubMenu();
+    method public boolean isVisible();
+    method public abstract android.view.View onCreateActionView();
+    method public android.view.View onCreateActionView(android.view.MenuItem);
+    method public boolean onPerformDefaultAction();
+    method public void onPrepareSubMenu(android.view.SubMenu);
+    method public boolean overridesItemVisibility();
+    method public void refreshVisibility();
+    method public void setVisibilityListener(android.support.v4.view.ActionProvider.VisibilityListener);
+  }
+
+  public static abstract interface ActionProvider.VisibilityListener {
+    method public abstract void onActionProviderVisibilityChanged(boolean);
+  }
+
+  public final class AsyncLayoutInflater {
+    ctor public AsyncLayoutInflater(android.content.Context);
+    method public void inflate(int, android.view.ViewGroup, android.support.v4.view.AsyncLayoutInflater.OnInflateFinishedListener);
+  }
+
+  public static abstract interface AsyncLayoutInflater.OnInflateFinishedListener {
+    method public abstract void onInflateFinished(android.view.View, int, android.view.ViewGroup);
+  }
+
+  public final class GestureDetectorCompat {
+    ctor public GestureDetectorCompat(android.content.Context, android.view.GestureDetector.OnGestureListener);
+    ctor public GestureDetectorCompat(android.content.Context, android.view.GestureDetector.OnGestureListener, android.os.Handler);
+    method public boolean isLongpressEnabled();
+    method public boolean onTouchEvent(android.view.MotionEvent);
+    method public void setIsLongpressEnabled(boolean);
+    method public void setOnDoubleTapListener(android.view.GestureDetector.OnDoubleTapListener);
+  }
+
+  public final class GravityCompat {
+    method public static void apply(int, int, int, android.graphics.Rect, android.graphics.Rect, int);
+    method public static void apply(int, int, int, android.graphics.Rect, int, int, android.graphics.Rect, int);
+    method public static void applyDisplay(int, android.graphics.Rect, android.graphics.Rect, int);
+    method public static int getAbsoluteGravity(int, int);
+    field public static final int END = 8388613; // 0x800005
+    field public static final int RELATIVE_HORIZONTAL_GRAVITY_MASK = 8388615; // 0x800007
+    field public static final int RELATIVE_LAYOUT_DIRECTION = 8388608; // 0x800000
+    field public static final int START = 8388611; // 0x800003
+  }
+
+  public final class InputDeviceCompat {
+    field public static final int SOURCE_ANY = -256; // 0xffffff00
+    field public static final int SOURCE_CLASS_BUTTON = 1; // 0x1
+    field public static final int SOURCE_CLASS_JOYSTICK = 16; // 0x10
+    field public static final int SOURCE_CLASS_MASK = 255; // 0xff
+    field public static final int SOURCE_CLASS_NONE = 0; // 0x0
+    field public static final int SOURCE_CLASS_POINTER = 2; // 0x2
+    field public static final int SOURCE_CLASS_POSITION = 8; // 0x8
+    field public static final int SOURCE_CLASS_TRACKBALL = 4; // 0x4
+    field public static final int SOURCE_DPAD = 513; // 0x201
+    field public static final int SOURCE_GAMEPAD = 1025; // 0x401
+    field public static final int SOURCE_HDMI = 33554433; // 0x2000001
+    field public static final int SOURCE_JOYSTICK = 16777232; // 0x1000010
+    field public static final int SOURCE_KEYBOARD = 257; // 0x101
+    field public static final int SOURCE_MOUSE = 8194; // 0x2002
+    field public static final int SOURCE_STYLUS = 16386; // 0x4002
+    field public static final int SOURCE_TOUCHPAD = 1048584; // 0x100008
+    field public static final int SOURCE_TOUCHSCREEN = 4098; // 0x1002
+    field public static final int SOURCE_TOUCH_NAVIGATION = 2097152; // 0x200000
+    field public static final int SOURCE_TRACKBALL = 65540; // 0x10004
+    field public static final int SOURCE_UNKNOWN = 0; // 0x0
+  }
+
+  public final class KeyEventCompat {
+    method public static deprecated boolean dispatch(android.view.KeyEvent, android.view.KeyEvent.Callback, java.lang.Object, java.lang.Object);
+    method public static deprecated java.lang.Object getKeyDispatcherState(android.view.View);
+    method public static boolean hasModifiers(android.view.KeyEvent, int);
+    method public static boolean hasNoModifiers(android.view.KeyEvent);
+    method public static boolean isCtrlPressed(android.view.KeyEvent);
+    method public static deprecated boolean isTracking(android.view.KeyEvent);
+    method public static boolean metaStateHasModifiers(int, int);
+    method public static boolean metaStateHasNoModifiers(int);
+    method public static int normalizeMetaState(int);
+    method public static deprecated void startTracking(android.view.KeyEvent);
+  }
+
+  public final class LayoutInflaterCompat {
+    method public static android.support.v4.view.LayoutInflaterFactory getFactory(android.view.LayoutInflater);
+    method public static void setFactory(android.view.LayoutInflater, android.support.v4.view.LayoutInflaterFactory);
+  }
+
+  public abstract interface LayoutInflaterFactory {
+    method public abstract android.view.View onCreateView(android.view.View, java.lang.String, android.content.Context, android.util.AttributeSet);
+  }
+
+  public final class MarginLayoutParamsCompat {
+    method public static int getLayoutDirection(android.view.ViewGroup.MarginLayoutParams);
+    method public static int getMarginEnd(android.view.ViewGroup.MarginLayoutParams);
+    method public static int getMarginStart(android.view.ViewGroup.MarginLayoutParams);
+    method public static boolean isMarginRelative(android.view.ViewGroup.MarginLayoutParams);
+    method public static void resolveLayoutDirection(android.view.ViewGroup.MarginLayoutParams, int);
+    method public static void setLayoutDirection(android.view.ViewGroup.MarginLayoutParams, int);
+    method public static void setMarginEnd(android.view.ViewGroup.MarginLayoutParams, int);
+    method public static void setMarginStart(android.view.ViewGroup.MarginLayoutParams, int);
+  }
+
+  public final class MenuCompat {
+    method public static deprecated void setShowAsAction(android.view.MenuItem, int);
+  }
+
+  public final class MenuItemCompat {
+    method public static boolean collapseActionView(android.view.MenuItem);
+    method public static boolean expandActionView(android.view.MenuItem);
+    method public static android.support.v4.view.ActionProvider getActionProvider(android.view.MenuItem);
+    method public static android.view.View getActionView(android.view.MenuItem);
+    method public static boolean isActionViewExpanded(android.view.MenuItem);
+    method public static android.view.MenuItem setActionProvider(android.view.MenuItem, android.support.v4.view.ActionProvider);
+    method public static android.view.MenuItem setActionView(android.view.MenuItem, android.view.View);
+    method public static android.view.MenuItem setActionView(android.view.MenuItem, int);
+    method public static android.view.MenuItem setOnActionExpandListener(android.view.MenuItem, android.support.v4.view.MenuItemCompat.OnActionExpandListener);
+    method public static void setShowAsAction(android.view.MenuItem, int);
+    field public static final int SHOW_AS_ACTION_ALWAYS = 2; // 0x2
+    field public static final int SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW = 8; // 0x8
+    field public static final int SHOW_AS_ACTION_IF_ROOM = 1; // 0x1
+    field public static final int SHOW_AS_ACTION_NEVER = 0; // 0x0
+    field public static final int SHOW_AS_ACTION_WITH_TEXT = 4; // 0x4
+  }
+
+  public static abstract interface MenuItemCompat.OnActionExpandListener {
+    method public abstract boolean onMenuItemActionCollapse(android.view.MenuItem);
+    method public abstract boolean onMenuItemActionExpand(android.view.MenuItem);
+  }
+
+  public final class MotionEventCompat {
+    method public static deprecated int findPointerIndex(android.view.MotionEvent, int);
+    method public static int getActionIndex(android.view.MotionEvent);
+    method public static int getActionMasked(android.view.MotionEvent);
+    method public static float getAxisValue(android.view.MotionEvent, int);
+    method public static float getAxisValue(android.view.MotionEvent, int, int);
+    method public static int getButtonState(android.view.MotionEvent);
+    method public static deprecated int getPointerCount(android.view.MotionEvent);
+    method public static deprecated int getPointerId(android.view.MotionEvent, int);
+    method public static deprecated int getSource(android.view.MotionEvent);
+    method public static deprecated float getX(android.view.MotionEvent, int);
+    method public static deprecated float getY(android.view.MotionEvent, int);
+    method public static boolean isFromSource(android.view.MotionEvent, int);
+    field public static final int ACTION_HOVER_ENTER = 9; // 0x9
+    field public static final int ACTION_HOVER_EXIT = 10; // 0xa
+    field public static final int ACTION_HOVER_MOVE = 7; // 0x7
+    field public static final int ACTION_MASK = 255; // 0xff
+    field public static final int ACTION_POINTER_DOWN = 5; // 0x5
+    field public static final int ACTION_POINTER_INDEX_MASK = 65280; // 0xff00
+    field public static final int ACTION_POINTER_INDEX_SHIFT = 8; // 0x8
+    field public static final int ACTION_POINTER_UP = 6; // 0x6
+    field public static final int ACTION_SCROLL = 8; // 0x8
+    field public static final int AXIS_BRAKE = 23; // 0x17
+    field public static final int AXIS_DISTANCE = 24; // 0x18
+    field public static final int AXIS_GAS = 22; // 0x16
+    field public static final int AXIS_GENERIC_1 = 32; // 0x20
+    field public static final int AXIS_GENERIC_10 = 41; // 0x29
+    field public static final int AXIS_GENERIC_11 = 42; // 0x2a
+    field public static final int AXIS_GENERIC_12 = 43; // 0x2b
+    field public static final int AXIS_GENERIC_13 = 44; // 0x2c
+    field public static final int AXIS_GENERIC_14 = 45; // 0x2d
+    field public static final int AXIS_GENERIC_15 = 46; // 0x2e
+    field public static final int AXIS_GENERIC_16 = 47; // 0x2f
+    field public static final int AXIS_GENERIC_2 = 33; // 0x21
+    field public static final int AXIS_GENERIC_3 = 34; // 0x22
+    field public static final int AXIS_GENERIC_4 = 35; // 0x23
+    field public static final int AXIS_GENERIC_5 = 36; // 0x24
+    field public static final int AXIS_GENERIC_6 = 37; // 0x25
+    field public static final int AXIS_GENERIC_7 = 38; // 0x26
+    field public static final int AXIS_GENERIC_8 = 39; // 0x27
+    field public static final int AXIS_GENERIC_9 = 40; // 0x28
+    field public static final int AXIS_HAT_X = 15; // 0xf
+    field public static final int AXIS_HAT_Y = 16; // 0x10
+    field public static final int AXIS_HSCROLL = 10; // 0xa
+    field public static final int AXIS_LTRIGGER = 17; // 0x11
+    field public static final int AXIS_ORIENTATION = 8; // 0x8
+    field public static final int AXIS_PRESSURE = 2; // 0x2
+    field public static final int AXIS_RELATIVE_X = 27; // 0x1b
+    field public static final int AXIS_RELATIVE_Y = 28; // 0x1c
+    field public static final int AXIS_RTRIGGER = 18; // 0x12
+    field public static final int AXIS_RUDDER = 20; // 0x14
+    field public static final int AXIS_RX = 12; // 0xc
+    field public static final int AXIS_RY = 13; // 0xd
+    field public static final int AXIS_RZ = 14; // 0xe
+    field public static final int AXIS_SIZE = 3; // 0x3
+    field public static final int AXIS_THROTTLE = 19; // 0x13
+    field public static final int AXIS_TILT = 25; // 0x19
+    field public static final int AXIS_TOOL_MAJOR = 6; // 0x6
+    field public static final int AXIS_TOOL_MINOR = 7; // 0x7
+    field public static final int AXIS_TOUCH_MAJOR = 4; // 0x4
+    field public static final int AXIS_TOUCH_MINOR = 5; // 0x5
+    field public static final int AXIS_VSCROLL = 9; // 0x9
+    field public static final int AXIS_WHEEL = 21; // 0x15
+    field public static final int AXIS_X = 0; // 0x0
+    field public static final int AXIS_Y = 1; // 0x1
+    field public static final int AXIS_Z = 11; // 0xb
+    field public static final int BUTTON_PRIMARY = 1; // 0x1
+  }
+
+  public abstract interface NestedScrollingChild {
+    method public abstract boolean dispatchNestedFling(float, float, boolean);
+    method public abstract boolean dispatchNestedPreFling(float, float);
+    method public abstract boolean dispatchNestedPreScroll(int, int, int[], int[]);
+    method public abstract boolean dispatchNestedScroll(int, int, int, int, int[]);
+    method public abstract boolean hasNestedScrollingParent();
+    method public abstract boolean isNestedScrollingEnabled();
+    method public abstract void setNestedScrollingEnabled(boolean);
+    method public abstract boolean startNestedScroll(int);
+    method public abstract void stopNestedScroll();
+  }
+
+  public class NestedScrollingChildHelper {
+    ctor public NestedScrollingChildHelper(android.view.View);
+    method public boolean dispatchNestedFling(float, float, boolean);
+    method public boolean dispatchNestedPreFling(float, float);
+    method public boolean dispatchNestedPreScroll(int, int, int[], int[]);
+    method public boolean dispatchNestedScroll(int, int, int, int, int[]);
+    method public boolean hasNestedScrollingParent();
+    method public boolean isNestedScrollingEnabled();
+    method public void onDetachedFromWindow();
+    method public void onStopNestedScroll(android.view.View);
+    method public void setNestedScrollingEnabled(boolean);
+    method public boolean startNestedScroll(int);
+    method public void stopNestedScroll();
+  }
+
+  public abstract interface NestedScrollingParent {
+    method public abstract int getNestedScrollAxes();
+    method public abstract boolean onNestedFling(android.view.View, float, float, boolean);
+    method public abstract boolean onNestedPreFling(android.view.View, float, float);
+    method public abstract void onNestedPreScroll(android.view.View, int, int, int[]);
+    method public abstract void onNestedScroll(android.view.View, int, int, int, int);
+    method public abstract void onNestedScrollAccepted(android.view.View, android.view.View, int);
+    method public abstract boolean onStartNestedScroll(android.view.View, android.view.View, int);
+    method public abstract void onStopNestedScroll(android.view.View);
+  }
+
+  public class NestedScrollingParentHelper {
+    ctor public NestedScrollingParentHelper(android.view.ViewGroup);
+    method public int getNestedScrollAxes();
+    method public void onNestedScrollAccepted(android.view.View, android.view.View, int);
+    method public void onStopNestedScroll(android.view.View);
+  }
+
+  public abstract interface OnApplyWindowInsetsListener {
+    method public abstract android.support.v4.view.WindowInsetsCompat onApplyWindowInsets(android.view.View, android.support.v4.view.WindowInsetsCompat);
+  }
+
+  public abstract class PagerAdapter {
+    ctor public PagerAdapter();
+    method public void destroyItem(android.view.ViewGroup, int, java.lang.Object);
+    method public deprecated void destroyItem(android.view.View, int, java.lang.Object);
+    method public void finishUpdate(android.view.ViewGroup);
+    method public deprecated void finishUpdate(android.view.View);
+    method public abstract int getCount();
+    method public int getItemPosition(java.lang.Object);
+    method public java.lang.CharSequence getPageTitle(int);
+    method public float getPageWidth(int);
+    method public java.lang.Object instantiateItem(android.view.ViewGroup, int);
+    method public deprecated java.lang.Object instantiateItem(android.view.View, int);
+    method public abstract boolean isViewFromObject(android.view.View, java.lang.Object);
+    method public void notifyDataSetChanged();
+    method public void registerDataSetObserver(android.database.DataSetObserver);
+    method public void restoreState(android.os.Parcelable, java.lang.ClassLoader);
+    method public android.os.Parcelable saveState();
+    method public void setPrimaryItem(android.view.ViewGroup, int, java.lang.Object);
+    method public deprecated void setPrimaryItem(android.view.View, int, java.lang.Object);
+    method public void startUpdate(android.view.ViewGroup);
+    method public deprecated void startUpdate(android.view.View);
+    method public void unregisterDataSetObserver(android.database.DataSetObserver);
+    field public static final int POSITION_NONE = -2; // 0xfffffffe
+    field public static final int POSITION_UNCHANGED = -1; // 0xffffffff
+  }
+
+  public class PagerTabStrip extends android.support.v4.view.PagerTitleStrip {
+    ctor public PagerTabStrip(android.content.Context);
+    ctor public PagerTabStrip(android.content.Context, android.util.AttributeSet);
+    method public boolean getDrawFullUnderline();
+    method public int getTabIndicatorColor();
+    method public void setDrawFullUnderline(boolean);
+    method public void setTabIndicatorColor(int);
+    method public void setTabIndicatorColorResource(int);
+  }
+
+  public class PagerTitleStrip extends android.view.ViewGroup {
+    ctor public PagerTitleStrip(android.content.Context);
+    ctor public PagerTitleStrip(android.content.Context, android.util.AttributeSet);
+    method public int getTextSpacing();
+    method protected void onLayout(boolean, int, int, int, int);
+    method public void setGravity(int);
+    method public void setNonPrimaryAlpha(float);
+    method public void setTextColor(int);
+    method public void setTextSize(int, float);
+    method public void setTextSpacing(int);
+  }
+
+  public final class PointerIconCompat {
+    method public static android.support.v4.view.PointerIconCompat create(android.graphics.Bitmap, float, float);
+    method public static android.support.v4.view.PointerIconCompat getSystemIcon(android.content.Context, int);
+    method public static android.support.v4.view.PointerIconCompat load(android.content.res.Resources, int);
+    field public static final int TYPE_ALIAS = 1010; // 0x3f2
+    field public static final int TYPE_ALL_SCROLL = 1013; // 0x3f5
+    field public static final int TYPE_ARROW = 1000; // 0x3e8
+    field public static final int TYPE_CELL = 1006; // 0x3ee
+    field public static final int TYPE_CONTEXT_MENU = 1001; // 0x3e9
+    field public static final int TYPE_COPY = 1011; // 0x3f3
+    field public static final int TYPE_CROSSHAIR = 1007; // 0x3ef
+    field public static final int TYPE_DEFAULT = 1000; // 0x3e8
+    field public static final int TYPE_GRAB = 1020; // 0x3fc
+    field public static final int TYPE_GRABBING = 1021; // 0x3fd
+    field public static final int TYPE_HAND = 1002; // 0x3ea
+    field public static final int TYPE_HELP = 1003; // 0x3eb
+    field public static final int TYPE_HORIZONTAL_DOUBLE_ARROW = 1014; // 0x3f6
+    field public static final int TYPE_NO_DROP = 1012; // 0x3f4
+    field public static final int TYPE_NULL = 0; // 0x0
+    field public static final int TYPE_TEXT = 1008; // 0x3f0
+    field public static final int TYPE_TOP_LEFT_DIAGONAL_DOUBLE_ARROW = 1017; // 0x3f9
+    field public static final int TYPE_TOP_RIGHT_DIAGONAL_DOUBLE_ARROW = 1016; // 0x3f8
+    field public static final int TYPE_VERTICAL_DOUBLE_ARROW = 1015; // 0x3f7
+    field public static final int TYPE_VERTICAL_TEXT = 1009; // 0x3f1
+    field public static final int TYPE_WAIT = 1004; // 0x3ec
+    field public static final int TYPE_ZOOM_IN = 1018; // 0x3fa
+    field public static final int TYPE_ZOOM_OUT = 1019; // 0x3fb
+  }
+
+  public final class ScaleGestureDetectorCompat {
+    method public static boolean isQuickScaleEnabled(java.lang.Object);
+    method public static void setQuickScaleEnabled(java.lang.Object, boolean);
+  }
+
+  public abstract interface ScrollingView {
+    method public abstract int computeHorizontalScrollExtent();
+    method public abstract int computeHorizontalScrollOffset();
+    method public abstract int computeHorizontalScrollRange();
+    method public abstract int computeVerticalScrollExtent();
+    method public abstract int computeVerticalScrollOffset();
+    method public abstract int computeVerticalScrollRange();
+  }
+
+  public abstract interface TintableBackgroundView {
+    method public abstract android.content.res.ColorStateList getSupportBackgroundTintList();
+    method public abstract android.graphics.PorterDuff.Mode getSupportBackgroundTintMode();
+    method public abstract void setSupportBackgroundTintList(android.content.res.ColorStateList);
+    method public abstract void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode);
+  }
+
+  public final class VelocityTrackerCompat {
+    method public static float getXVelocity(android.view.VelocityTracker, int);
+    method public static float getYVelocity(android.view.VelocityTracker, int);
+  }
+
+  public class ViewCompat {
+    ctor protected ViewCompat();
+    method public static android.support.v4.view.ViewPropertyAnimatorCompat animate(android.view.View);
+    method public static boolean canScrollHorizontally(android.view.View, int);
+    method public static boolean canScrollVertically(android.view.View, int);
+    method public static int combineMeasuredStates(int, int);
+    method public static android.support.v4.view.WindowInsetsCompat dispatchApplyWindowInsets(android.view.View, android.support.v4.view.WindowInsetsCompat);
+    method public static void dispatchFinishTemporaryDetach(android.view.View);
+    method public static boolean dispatchNestedFling(android.view.View, float, float, boolean);
+    method public static boolean dispatchNestedPreFling(android.view.View, float, float);
+    method public static boolean dispatchNestedPreScroll(android.view.View, int, int, int[], int[]);
+    method public static boolean dispatchNestedScroll(android.view.View, int, int, int, int, int[]);
+    method public static void dispatchStartTemporaryDetach(android.view.View);
+    method public static int getAccessibilityLiveRegion(android.view.View);
+    method public static android.support.v4.view.accessibility.AccessibilityNodeProviderCompat getAccessibilityNodeProvider(android.view.View);
+    method public static float getAlpha(android.view.View);
+    method public static android.content.res.ColorStateList getBackgroundTintList(android.view.View);
+    method public static android.graphics.PorterDuff.Mode getBackgroundTintMode(android.view.View);
+    method public static android.graphics.Rect getClipBounds(android.view.View);
+    method public static float getElevation(android.view.View);
+    method public static boolean getFitsSystemWindows(android.view.View);
+    method public static int getImportantForAccessibility(android.view.View);
+    method public static int getLabelFor(android.view.View);
+    method public static int getLayerType(android.view.View);
+    method public static int getLayoutDirection(android.view.View);
+    method public static android.graphics.Matrix getMatrix(android.view.View);
+    method public static int getMeasuredHeightAndState(android.view.View);
+    method public static int getMeasuredState(android.view.View);
+    method public static int getMeasuredWidthAndState(android.view.View);
+    method public static int getMinimumHeight(android.view.View);
+    method public static int getMinimumWidth(android.view.View);
+    method public static deprecated int getOverScrollMode(android.view.View);
+    method public static int getPaddingEnd(android.view.View);
+    method public static int getPaddingStart(android.view.View);
+    method public static android.view.ViewParent getParentForAccessibility(android.view.View);
+    method public static float getPivotX(android.view.View);
+    method public static float getPivotY(android.view.View);
+    method public static float getRotation(android.view.View);
+    method public static float getRotationX(android.view.View);
+    method public static float getRotationY(android.view.View);
+    method public static float getScaleX(android.view.View);
+    method public static float getScaleY(android.view.View);
+    method public static int getScrollIndicators(android.view.View);
+    method public static java.lang.String getTransitionName(android.view.View);
+    method public static float getTranslationX(android.view.View);
+    method public static float getTranslationY(android.view.View);
+    method public static float getTranslationZ(android.view.View);
+    method public static int getWindowSystemUiVisibility(android.view.View);
+    method public static float getX(android.view.View);
+    method public static float getY(android.view.View);
+    method public static float getZ(android.view.View);
+    method public static boolean hasAccessibilityDelegate(android.view.View);
+    method public static boolean hasNestedScrollingParent(android.view.View);
+    method public static boolean hasOnClickListeners(android.view.View);
+    method public static boolean hasOverlappingRendering(android.view.View);
+    method public static boolean hasTransientState(android.view.View);
+    method public static boolean isAttachedToWindow(android.view.View);
+    method public static boolean isInLayout(android.view.View);
+    method public static boolean isLaidOut(android.view.View);
+    method public static boolean isLayoutDirectionResolved(android.view.View);
+    method public static boolean isNestedScrollingEnabled(android.view.View);
+    method public static deprecated boolean isOpaque(android.view.View);
+    method public static boolean isPaddingRelative(android.view.View);
+    method public static void jumpDrawablesToCurrentState(android.view.View);
+    method public static void offsetLeftAndRight(android.view.View, int);
+    method public static void offsetTopAndBottom(android.view.View, int);
+    method public static android.support.v4.view.WindowInsetsCompat onApplyWindowInsets(android.view.View, android.support.v4.view.WindowInsetsCompat);
+    method public static void onInitializeAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
+    method public static void onInitializeAccessibilityNodeInfo(android.view.View, android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
+    method public static void onPopulateAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
+    method public static boolean performAccessibilityAction(android.view.View, int, android.os.Bundle);
+    method public static void postInvalidateOnAnimation(android.view.View);
+    method public static void postInvalidateOnAnimation(android.view.View, int, int, int, int);
+    method public static void postOnAnimation(android.view.View, java.lang.Runnable);
+    method public static void postOnAnimationDelayed(android.view.View, java.lang.Runnable, long);
+    method public static void requestApplyInsets(android.view.View);
+    method public static int resolveSizeAndState(int, int, int);
+    method public static void setAccessibilityDelegate(android.view.View, android.support.v4.view.AccessibilityDelegateCompat);
+    method public static void setAccessibilityLiveRegion(android.view.View, int);
+    method public static void setActivated(android.view.View, boolean);
+    method public static void setAlpha(android.view.View, float);
+    method public static void setBackgroundTintList(android.view.View, android.content.res.ColorStateList);
+    method public static void setBackgroundTintMode(android.view.View, android.graphics.PorterDuff.Mode);
+    method public static void setChildrenDrawingOrderEnabled(android.view.ViewGroup, boolean);
+    method public static void setClipBounds(android.view.View, android.graphics.Rect);
+    method public static void setElevation(android.view.View, float);
+    method public static void setFitsSystemWindows(android.view.View, boolean);
+    method public static void setHasTransientState(android.view.View, boolean);
+    method public static void setImportantForAccessibility(android.view.View, int);
+    method public static void setLabelFor(android.view.View, int);
+    method public static void setLayerPaint(android.view.View, android.graphics.Paint);
+    method public static void setLayerType(android.view.View, int, android.graphics.Paint);
+    method public static void setLayoutDirection(android.view.View, int);
+    method public static void setNestedScrollingEnabled(android.view.View, boolean);
+    method public static void setOnApplyWindowInsetsListener(android.view.View, android.support.v4.view.OnApplyWindowInsetsListener);
+    method public static deprecated void setOverScrollMode(android.view.View, int);
+    method public static void setPaddingRelative(android.view.View, int, int, int, int);
+    method public static void setPivotX(android.view.View, float);
+    method public static void setPivotY(android.view.View, float);
+    method public static void setPointerIcon(android.view.View, android.support.v4.view.PointerIconCompat);
+    method public static void setRotation(android.view.View, float);
+    method public static void setRotationX(android.view.View, float);
+    method public static void setRotationY(android.view.View, float);
+    method public static void setSaveFromParentEnabled(android.view.View, boolean);
+    method public static void setScaleX(android.view.View, float);
+    method public static void setScaleY(android.view.View, float);
+    method public static void setScrollIndicators(android.view.View, int);
+    method public static void setScrollIndicators(android.view.View, int, int);
+    method public static void setTransitionName(android.view.View, java.lang.String);
+    method public static void setTranslationX(android.view.View, float);
+    method public static void setTranslationY(android.view.View, float);
+    method public static void setTranslationZ(android.view.View, float);
+    method public static void setX(android.view.View, float);
+    method public static void setY(android.view.View, float);
+    method public static void setZ(android.view.View, float);
+    method public static boolean startNestedScroll(android.view.View, int);
+    method public static void stopNestedScroll(android.view.View);
+    field public static final int ACCESSIBILITY_LIVE_REGION_ASSERTIVE = 2; // 0x2
+    field public static final int ACCESSIBILITY_LIVE_REGION_NONE = 0; // 0x0
+    field public static final int ACCESSIBILITY_LIVE_REGION_POLITE = 1; // 0x1
+    field public static final int IMPORTANT_FOR_ACCESSIBILITY_AUTO = 0; // 0x0
+    field public static final int IMPORTANT_FOR_ACCESSIBILITY_NO = 2; // 0x2
+    field public static final int IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS = 4; // 0x4
+    field public static final int IMPORTANT_FOR_ACCESSIBILITY_YES = 1; // 0x1
+    field public static final int LAYER_TYPE_HARDWARE = 2; // 0x2
+    field public static final int LAYER_TYPE_NONE = 0; // 0x0
+    field public static final int LAYER_TYPE_SOFTWARE = 1; // 0x1
+    field public static final int LAYOUT_DIRECTION_INHERIT = 2; // 0x2
+    field public static final int LAYOUT_DIRECTION_LOCALE = 3; // 0x3
+    field public static final int LAYOUT_DIRECTION_LTR = 0; // 0x0
+    field public static final int LAYOUT_DIRECTION_RTL = 1; // 0x1
+    field public static final int MEASURED_HEIGHT_STATE_SHIFT = 16; // 0x10
+    field public static final int MEASURED_SIZE_MASK = 16777215; // 0xffffff
+    field public static final int MEASURED_STATE_MASK = -16777216; // 0xff000000
+    field public static final int MEASURED_STATE_TOO_SMALL = 16777216; // 0x1000000
+    field public static final int OVER_SCROLL_ALWAYS = 0; // 0x0
+    field public static final int OVER_SCROLL_IF_CONTENT_SCROLLS = 1; // 0x1
+    field public static final int OVER_SCROLL_NEVER = 2; // 0x2
+    field public static final int SCROLL_AXIS_HORIZONTAL = 1; // 0x1
+    field public static final int SCROLL_AXIS_NONE = 0; // 0x0
+    field public static final int SCROLL_AXIS_VERTICAL = 2; // 0x2
+    field public static final int SCROLL_INDICATOR_BOTTOM = 2; // 0x2
+    field public static final int SCROLL_INDICATOR_END = 32; // 0x20
+    field public static final int SCROLL_INDICATOR_LEFT = 4; // 0x4
+    field public static final int SCROLL_INDICATOR_RIGHT = 8; // 0x8
+    field public static final int SCROLL_INDICATOR_START = 16; // 0x10
+    field public static final int SCROLL_INDICATOR_TOP = 1; // 0x1
+  }
+
+  public final class ViewConfigurationCompat {
+    method public static deprecated int getScaledPagingTouchSlop(android.view.ViewConfiguration);
+    method public static boolean hasPermanentMenuKey(android.view.ViewConfiguration);
+  }
+
+  public final class ViewGroupCompat {
+    method public static int getLayoutMode(android.view.ViewGroup);
+    method public static int getNestedScrollAxes(android.view.ViewGroup);
+    method public static boolean isTransitionGroup(android.view.ViewGroup);
+    method public static boolean onRequestSendAccessibilityEvent(android.view.ViewGroup, android.view.View, android.view.accessibility.AccessibilityEvent);
+    method public static void setLayoutMode(android.view.ViewGroup, int);
+    method public static void setMotionEventSplittingEnabled(android.view.ViewGroup, boolean);
+    method public static void setTransitionGroup(android.view.ViewGroup, boolean);
+    field public static final int LAYOUT_MODE_CLIP_BOUNDS = 0; // 0x0
+    field public static final int LAYOUT_MODE_OPTICAL_BOUNDS = 1; // 0x1
+  }
+
+  public class ViewPager extends android.view.ViewGroup {
+    ctor public ViewPager(android.content.Context);
+    ctor public ViewPager(android.content.Context, android.util.AttributeSet);
+    method public void addOnAdapterChangeListener(android.support.v4.view.ViewPager.OnAdapterChangeListener);
+    method public void addOnPageChangeListener(android.support.v4.view.ViewPager.OnPageChangeListener);
+    method public boolean arrowScroll(int);
+    method public boolean beginFakeDrag();
+    method protected boolean canScroll(android.view.View, boolean, int, int, int);
+    method public void clearOnPageChangeListeners();
+    method public void endFakeDrag();
+    method public boolean executeKeyEvent(android.view.KeyEvent);
+    method public void fakeDragBy(float);
+    method public android.support.v4.view.PagerAdapter getAdapter();
+    method public int getCurrentItem();
+    method public int getOffscreenPageLimit();
+    method public int getPageMargin();
+    method public boolean isFakeDragging();
+    method protected void onLayout(boolean, int, int, int, int);
+    method protected void onPageScrolled(int, float, int);
+    method public void onRestoreInstanceState(android.os.Parcelable);
+    method public android.os.Parcelable onSaveInstanceState();
+    method public void removeOnAdapterChangeListener(android.support.v4.view.ViewPager.OnAdapterChangeListener);
+    method public void removeOnPageChangeListener(android.support.v4.view.ViewPager.OnPageChangeListener);
+    method public void setAdapter(android.support.v4.view.PagerAdapter);
+    method public void setCurrentItem(int);
+    method public void setCurrentItem(int, boolean);
+    method public void setOffscreenPageLimit(int);
+    method public deprecated void setOnPageChangeListener(android.support.v4.view.ViewPager.OnPageChangeListener);
+    method public void setPageMargin(int);
+    method public void setPageMarginDrawable(android.graphics.drawable.Drawable);
+    method public void setPageMarginDrawable(int);
+    method public void setPageTransformer(boolean, android.support.v4.view.ViewPager.PageTransformer);
+    field public static final int SCROLL_STATE_DRAGGING = 1; // 0x1
+    field public static final int SCROLL_STATE_IDLE = 0; // 0x0
+    field public static final int SCROLL_STATE_SETTLING = 2; // 0x2
+  }
+
+  public static abstract class ViewPager.DecorView implements java.lang.annotation.Annotation {
+  }
+
+  public static class ViewPager.LayoutParams extends android.view.ViewGroup.LayoutParams {
+    ctor public ViewPager.LayoutParams();
+    ctor public ViewPager.LayoutParams(android.content.Context, android.util.AttributeSet);
+    field public int gravity;
+    field public boolean isDecor;
+  }
+
+  public static abstract interface ViewPager.OnAdapterChangeListener {
+    method public abstract void onAdapterChanged(android.support.v4.view.ViewPager, android.support.v4.view.PagerAdapter, android.support.v4.view.PagerAdapter);
+  }
+
+  public static abstract interface ViewPager.OnPageChangeListener {
+    method public abstract void onPageScrollStateChanged(int);
+    method public abstract void onPageScrolled(int, float, int);
+    method public abstract void onPageSelected(int);
+  }
+
+  public static abstract interface ViewPager.PageTransformer {
+    method public abstract void transformPage(android.view.View, float);
+  }
+
+  public static class ViewPager.SavedState extends android.support.v4.view.AbsSavedState {
+    ctor public ViewPager.SavedState(android.os.Parcelable);
+    field public static final android.os.Parcelable.Creator<android.support.v4.view.ViewPager.SavedState> CREATOR;
+  }
+
+  public static class ViewPager.SimpleOnPageChangeListener implements android.support.v4.view.ViewPager.OnPageChangeListener {
+    ctor public ViewPager.SimpleOnPageChangeListener();
+    method public void onPageScrollStateChanged(int);
+    method public void onPageScrolled(int, float, int);
+    method public void onPageSelected(int);
+  }
+
+  public final class ViewParentCompat {
+    method public static void notifySubtreeAccessibilityStateChanged(android.view.ViewParent, android.view.View, android.view.View, int);
+    method public static boolean onNestedFling(android.view.ViewParent, android.view.View, float, float, boolean);
+    method public static boolean onNestedPreFling(android.view.ViewParent, android.view.View, float, float);
+    method public static void onNestedPreScroll(android.view.ViewParent, android.view.View, int, int, int[]);
+    method public static void onNestedScroll(android.view.ViewParent, android.view.View, int, int, int, int);
+    method public static void onNestedScrollAccepted(android.view.ViewParent, android.view.View, android.view.View, int);
+    method public static boolean onStartNestedScroll(android.view.ViewParent, android.view.View, android.view.View, int);
+    method public static void onStopNestedScroll(android.view.ViewParent, android.view.View);
+    method public static boolean requestSendAccessibilityEvent(android.view.ViewParent, android.view.View, android.view.accessibility.AccessibilityEvent);
+  }
+
+  public final class ViewPropertyAnimatorCompat {
+    method public android.support.v4.view.ViewPropertyAnimatorCompat alpha(float);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat alphaBy(float);
+    method public void cancel();
+    method public long getDuration();
+    method public android.view.animation.Interpolator getInterpolator();
+    method public long getStartDelay();
+    method public android.support.v4.view.ViewPropertyAnimatorCompat rotation(float);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat rotationBy(float);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat rotationX(float);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat rotationXBy(float);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat rotationY(float);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat rotationYBy(float);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat scaleX(float);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat scaleXBy(float);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat scaleY(float);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat scaleYBy(float);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat setDuration(long);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat setInterpolator(android.view.animation.Interpolator);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat setListener(android.support.v4.view.ViewPropertyAnimatorListener);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat setStartDelay(long);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat setUpdateListener(android.support.v4.view.ViewPropertyAnimatorUpdateListener);
+    method public void start();
+    method public android.support.v4.view.ViewPropertyAnimatorCompat translationX(float);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat translationXBy(float);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat translationY(float);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat translationYBy(float);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat translationZ(float);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat translationZBy(float);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat withEndAction(java.lang.Runnable);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat withLayer();
+    method public android.support.v4.view.ViewPropertyAnimatorCompat withStartAction(java.lang.Runnable);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat x(float);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat xBy(float);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat y(float);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat yBy(float);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat z(float);
+    method public android.support.v4.view.ViewPropertyAnimatorCompat zBy(float);
+  }
+
+  public abstract interface ViewPropertyAnimatorListener {
+    method public abstract void onAnimationCancel(android.view.View);
+    method public abstract void onAnimationEnd(android.view.View);
+    method public abstract void onAnimationStart(android.view.View);
+  }
+
+  public class ViewPropertyAnimatorListenerAdapter implements android.support.v4.view.ViewPropertyAnimatorListener {
+    ctor public ViewPropertyAnimatorListenerAdapter();
+    method public void onAnimationCancel(android.view.View);
+    method public void onAnimationEnd(android.view.View);
+    method public void onAnimationStart(android.view.View);
+  }
+
+  public abstract interface ViewPropertyAnimatorUpdateListener {
+    method public abstract void onAnimationUpdate(android.view.View);
+  }
+
+  public final class WindowCompat {
+    field public static final int FEATURE_ACTION_BAR = 8; // 0x8
+    field public static final int FEATURE_ACTION_BAR_OVERLAY = 9; // 0x9
+    field public static final int FEATURE_ACTION_MODE_OVERLAY = 10; // 0xa
+  }
+
+  public class WindowInsetsCompat {
+    ctor public WindowInsetsCompat(android.support.v4.view.WindowInsetsCompat);
+    method public android.support.v4.view.WindowInsetsCompat consumeStableInsets();
+    method public android.support.v4.view.WindowInsetsCompat consumeSystemWindowInsets();
+    method public int getStableInsetBottom();
+    method public int getStableInsetLeft();
+    method public int getStableInsetRight();
+    method public int getStableInsetTop();
+    method public int getSystemWindowInsetBottom();
+    method public int getSystemWindowInsetLeft();
+    method public int getSystemWindowInsetRight();
+    method public int getSystemWindowInsetTop();
+    method public boolean hasInsets();
+    method public boolean hasStableInsets();
+    method public boolean hasSystemWindowInsets();
+    method public boolean isConsumed();
+    method public boolean isRound();
+    method public android.support.v4.view.WindowInsetsCompat replaceSystemWindowInsets(int, int, int, int);
+    method public android.support.v4.view.WindowInsetsCompat replaceSystemWindowInsets(android.graphics.Rect);
+  }
+
+}
+
+package android.support.v4.view.accessibility {
+
+  public final class AccessibilityEventCompat {
+    method public static void appendRecord(android.view.accessibility.AccessibilityEvent, android.support.v4.view.accessibility.AccessibilityRecordCompat);
+    method public static android.support.v4.view.accessibility.AccessibilityRecordCompat asRecord(android.view.accessibility.AccessibilityEvent);
+    method public static int getContentChangeTypes(android.view.accessibility.AccessibilityEvent);
+    method public static android.support.v4.view.accessibility.AccessibilityRecordCompat getRecord(android.view.accessibility.AccessibilityEvent, int);
+    method public static int getRecordCount(android.view.accessibility.AccessibilityEvent);
+    method public static void setContentChangeTypes(android.view.accessibility.AccessibilityEvent, int);
+    field public static final int CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION = 4; // 0x4
+    field public static final int CONTENT_CHANGE_TYPE_SUBTREE = 1; // 0x1
+    field public static final int CONTENT_CHANGE_TYPE_TEXT = 2; // 0x2
+    field public static final int CONTENT_CHANGE_TYPE_UNDEFINED = 0; // 0x0
+    field public static final int TYPES_ALL_MASK = -1; // 0xffffffff
+    field public static final int TYPE_ANNOUNCEMENT = 16384; // 0x4000
+    field public static final int TYPE_GESTURE_DETECTION_END = 524288; // 0x80000
+    field public static final int TYPE_GESTURE_DETECTION_START = 262144; // 0x40000
+    field public static final int TYPE_TOUCH_EXPLORATION_GESTURE_END = 1024; // 0x400
+    field public static final int TYPE_TOUCH_EXPLORATION_GESTURE_START = 512; // 0x200
+    field public static final int TYPE_TOUCH_INTERACTION_END = 2097152; // 0x200000
+    field public static final int TYPE_TOUCH_INTERACTION_START = 1048576; // 0x100000
+    field public static final int TYPE_VIEW_ACCESSIBILITY_FOCUSED = 32768; // 0x8000
+    field public static final int TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED = 65536; // 0x10000
+    field public static final int TYPE_VIEW_HOVER_ENTER = 128; // 0x80
+    field public static final int TYPE_VIEW_HOVER_EXIT = 256; // 0x100
+    field public static final int TYPE_VIEW_SCROLLED = 4096; // 0x1000
+    field public static final int TYPE_VIEW_TEXT_SELECTION_CHANGED = 8192; // 0x2000
+    field public static final int TYPE_VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITY = 131072; // 0x20000
+    field public static final int TYPE_WINDOW_CONTENT_CHANGED = 2048; // 0x800
+  }
+
+  public final class AccessibilityManagerCompat {
+    method public static boolean addAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager, android.support.v4.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat);
+    method public static java.util.List<android.accessibilityservice.AccessibilityServiceInfo> getEnabledAccessibilityServiceList(android.view.accessibility.AccessibilityManager, int);
+    method public static java.util.List<android.accessibilityservice.AccessibilityServiceInfo> getInstalledAccessibilityServiceList(android.view.accessibility.AccessibilityManager);
+    method public static boolean isTouchExplorationEnabled(android.view.accessibility.AccessibilityManager);
+    method public static boolean removeAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager, android.support.v4.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat);
+  }
+
+  public static abstract class AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat {
+    ctor public AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat();
+    method public abstract void onAccessibilityStateChanged(boolean);
+  }
+
+  public class AccessibilityNodeInfoCompat {
+    ctor public AccessibilityNodeInfoCompat(java.lang.Object);
+    method public void addAction(int);
+    method public void addAction(android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat);
+    method public void addChild(android.view.View);
+    method public void addChild(android.view.View, int);
+    method public boolean canOpenPopup();
+    method public java.util.List<android.support.v4.view.accessibility.AccessibilityNodeInfoCompat> findAccessibilityNodeInfosByText(java.lang.String);
+    method public java.util.List<android.support.v4.view.accessibility.AccessibilityNodeInfoCompat> findAccessibilityNodeInfosByViewId(java.lang.String);
+    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat findFocus(int);
+    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat focusSearch(int);
+    method public java.util.List<android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat> getActionList();
+    method public int getActions();
+    method public void getBoundsInParent(android.graphics.Rect);
+    method public void getBoundsInScreen(android.graphics.Rect);
+    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getChild(int);
+    method public int getChildCount();
+    method public java.lang.CharSequence getClassName();
+    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat getCollectionInfo();
+    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat getCollectionItemInfo();
+    method public java.lang.CharSequence getContentDescription();
+    method public int getDrawingOrder();
+    method public java.lang.CharSequence getError();
+    method public android.os.Bundle getExtras();
+    method public java.lang.Object getInfo();
+    method public int getInputType();
+    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getLabelFor();
+    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getLabeledBy();
+    method public int getLiveRegion();
+    method public int getMaxTextLength();
+    method public int getMovementGranularities();
+    method public java.lang.CharSequence getPackageName();
+    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getParent();
+    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat getRangeInfo();
+    method public java.lang.CharSequence getRoleDescription();
+    method public java.lang.CharSequence getText();
+    method public int getTextSelectionEnd();
+    method public int getTextSelectionStart();
+    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getTraversalAfter();
+    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getTraversalBefore();
+    method public java.lang.String getViewIdResourceName();
+    method public android.support.v4.view.accessibility.AccessibilityWindowInfoCompat getWindow();
+    method public int getWindowId();
+    method public boolean isAccessibilityFocused();
+    method public boolean isCheckable();
+    method public boolean isChecked();
+    method public boolean isClickable();
+    method public boolean isContentInvalid();
+    method public boolean isContextClickable();
+    method public boolean isDismissable();
+    method public boolean isEditable();
+    method public boolean isEnabled();
+    method public boolean isFocusable();
+    method public boolean isFocused();
+    method public boolean isImportantForAccessibility();
+    method public boolean isLongClickable();
+    method public boolean isMultiLine();
+    method public boolean isPassword();
+    method public boolean isScrollable();
+    method public boolean isSelected();
+    method public boolean isVisibleToUser();
+    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat obtain(android.view.View);
+    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat obtain(android.view.View, int);
+    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat obtain();
+    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat obtain(android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
+    method public boolean performAction(int);
+    method public boolean performAction(int, android.os.Bundle);
+    method public void recycle();
+    method public boolean refresh();
+    method public boolean removeAction(android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat);
+    method public boolean removeChild(android.view.View);
+    method public boolean removeChild(android.view.View, int);
+    method public void setAccessibilityFocused(boolean);
+    method public void setBoundsInParent(android.graphics.Rect);
+    method public void setBoundsInScreen(android.graphics.Rect);
+    method public void setCanOpenPopup(boolean);
+    method public void setCheckable(boolean);
+    method public void setChecked(boolean);
+    method public void setClassName(java.lang.CharSequence);
+    method public void setClickable(boolean);
+    method public void setCollectionInfo(java.lang.Object);
+    method public void setCollectionItemInfo(java.lang.Object);
+    method public void setContentDescription(java.lang.CharSequence);
+    method public void setContentInvalid(boolean);
+    method public void setContextClickable(boolean);
+    method public void setDismissable(boolean);
+    method public void setDrawingOrder(int);
+    method public void setEditable(boolean);
+    method public void setEnabled(boolean);
+    method public void setError(java.lang.CharSequence);
+    method public void setFocusable(boolean);
+    method public void setFocused(boolean);
+    method public void setImportantForAccessibility(boolean);
+    method public void setInputType(int);
+    method public void setLabelFor(android.view.View);
+    method public void setLabelFor(android.view.View, int);
+    method public void setLabeledBy(android.view.View);
+    method public void setLabeledBy(android.view.View, int);
+    method public void setLiveRegion(int);
+    method public void setLongClickable(boolean);
+    method public void setMaxTextLength(int);
+    method public void setMovementGranularities(int);
+    method public void setMultiLine(boolean);
+    method public void setPackageName(java.lang.CharSequence);
+    method public void setParent(android.view.View);
+    method public void setParent(android.view.View, int);
+    method public void setPassword(boolean);
+    method public void setRangeInfo(android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat);
+    method public void setRoleDescription(java.lang.CharSequence);
+    method public void setScrollable(boolean);
+    method public void setSelected(boolean);
+    method public void setSource(android.view.View);
+    method public void setSource(android.view.View, int);
+    method public void setText(java.lang.CharSequence);
+    method public void setTextSelection(int, int);
+    method public void setTraversalAfter(android.view.View);
+    method public void setTraversalAfter(android.view.View, int);
+    method public void setTraversalBefore(android.view.View);
+    method public void setTraversalBefore(android.view.View, int);
+    method public void setViewIdResourceName(java.lang.String);
+    method public void setVisibleToUser(boolean);
+    field public static final int ACTION_ACCESSIBILITY_FOCUS = 64; // 0x40
+    field public static final java.lang.String ACTION_ARGUMENT_COLUMN_INT = "android.view.accessibility.action.ARGUMENT_COLUMN_INT";
+    field public static final java.lang.String ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN = "ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN";
+    field public static final java.lang.String ACTION_ARGUMENT_HTML_ELEMENT_STRING = "ACTION_ARGUMENT_HTML_ELEMENT_STRING";
+    field public static final java.lang.String ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT = "ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT";
+    field public static final java.lang.String ACTION_ARGUMENT_PROGRESS_VALUE = "android.view.accessibility.action.ARGUMENT_PROGRESS_VALUE";
+    field public static final java.lang.String ACTION_ARGUMENT_ROW_INT = "android.view.accessibility.action.ARGUMENT_ROW_INT";
+    field public static final java.lang.String ACTION_ARGUMENT_SELECTION_END_INT = "ACTION_ARGUMENT_SELECTION_END_INT";
+    field public static final java.lang.String ACTION_ARGUMENT_SELECTION_START_INT = "ACTION_ARGUMENT_SELECTION_START_INT";
+    field public static final java.lang.String ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE = "ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE";
+    field public static final int ACTION_CLEAR_ACCESSIBILITY_FOCUS = 128; // 0x80
+    field public static final int ACTION_CLEAR_FOCUS = 2; // 0x2
+    field public static final int ACTION_CLEAR_SELECTION = 8; // 0x8
+    field public static final int ACTION_CLICK = 16; // 0x10
+    field public static final int ACTION_COLLAPSE = 524288; // 0x80000
+    field public static final int ACTION_COPY = 16384; // 0x4000
+    field public static final int ACTION_CUT = 65536; // 0x10000
+    field public static final int ACTION_DISMISS = 1048576; // 0x100000
+    field public static final int ACTION_EXPAND = 262144; // 0x40000
+    field public static final int ACTION_FOCUS = 1; // 0x1
+    field public static final int ACTION_LONG_CLICK = 32; // 0x20
+    field public static final int ACTION_NEXT_AT_MOVEMENT_GRANULARITY = 256; // 0x100
+    field public static final int ACTION_NEXT_HTML_ELEMENT = 1024; // 0x400
+    field public static final int ACTION_PASTE = 32768; // 0x8000
+    field public static final int ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY = 512; // 0x200
+    field public static final int ACTION_PREVIOUS_HTML_ELEMENT = 2048; // 0x800
+    field public static final int ACTION_SCROLL_BACKWARD = 8192; // 0x2000
+    field public static final int ACTION_SCROLL_FORWARD = 4096; // 0x1000
+    field public static final int ACTION_SELECT = 4; // 0x4
+    field public static final int ACTION_SET_SELECTION = 131072; // 0x20000
+    field public static final int ACTION_SET_TEXT = 2097152; // 0x200000
+    field public static final int FOCUS_ACCESSIBILITY = 2; // 0x2
+    field public static final int FOCUS_INPUT = 1; // 0x1
+    field public static final int MOVEMENT_GRANULARITY_CHARACTER = 1; // 0x1
+    field public static final int MOVEMENT_GRANULARITY_LINE = 4; // 0x4
+    field public static final int MOVEMENT_GRANULARITY_PAGE = 16; // 0x10
+    field public static final int MOVEMENT_GRANULARITY_PARAGRAPH = 8; // 0x8
+    field public static final int MOVEMENT_GRANULARITY_WORD = 2; // 0x2
+  }
+
+  public static class AccessibilityNodeInfoCompat.AccessibilityActionCompat {
+    ctor public AccessibilityNodeInfoCompat.AccessibilityActionCompat(int, java.lang.CharSequence);
+    method public int getId();
+    method public java.lang.CharSequence getLabel();
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_ACCESSIBILITY_FOCUS;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_CLEAR_ACCESSIBILITY_FOCUS;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_CLEAR_FOCUS;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_CLEAR_SELECTION;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_CLICK;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_COLLAPSE;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_CONTEXT_CLICK;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_COPY;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_CUT;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_DISMISS;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_EXPAND;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_FOCUS;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_LONG_CLICK;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_NEXT_AT_MOVEMENT_GRANULARITY;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_NEXT_HTML_ELEMENT;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PASTE;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PREVIOUS_HTML_ELEMENT;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_SCROLL_BACKWARD;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_SCROLL_DOWN;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_SCROLL_FORWARD;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_SCROLL_LEFT;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_SCROLL_RIGHT;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_SCROLL_TO_POSITION;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_SCROLL_UP;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_SELECT;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_SET_PROGRESS;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_SET_SELECTION;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_SET_TEXT;
+    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_SHOW_ON_SCREEN;
+  }
+
+  public static class AccessibilityNodeInfoCompat.CollectionInfoCompat {
+    method public int getColumnCount();
+    method public int getRowCount();
+    method public int getSelectionMode();
+    method public boolean isHierarchical();
+    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat obtain(int, int, boolean, int);
+    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat obtain(int, int, boolean);
+    field public static final int SELECTION_MODE_MULTIPLE = 2; // 0x2
+    field public static final int SELECTION_MODE_NONE = 0; // 0x0
+    field public static final int SELECTION_MODE_SINGLE = 1; // 0x1
+  }
+
+  public static class AccessibilityNodeInfoCompat.CollectionItemInfoCompat {
+    method public int getColumnIndex();
+    method public int getColumnSpan();
+    method public int getRowIndex();
+    method public int getRowSpan();
+    method public boolean isHeading();
+    method public boolean isSelected();
+    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat obtain(int, int, int, int, boolean, boolean);
+    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat obtain(int, int, int, int, boolean);
+  }
+
+  public static class AccessibilityNodeInfoCompat.RangeInfoCompat {
+    method public float getCurrent();
+    method public float getMax();
+    method public float getMin();
+    method public int getType();
+    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat obtain(int, float, float, float);
+    field public static final int RANGE_TYPE_FLOAT = 1; // 0x1
+    field public static final int RANGE_TYPE_INT = 0; // 0x0
+    field public static final int RANGE_TYPE_PERCENT = 2; // 0x2
+  }
+
+  public class AccessibilityNodeProviderCompat {
+    ctor public AccessibilityNodeProviderCompat();
+    ctor public AccessibilityNodeProviderCompat(java.lang.Object);
+    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat createAccessibilityNodeInfo(int);
+    method public java.util.List<android.support.v4.view.accessibility.AccessibilityNodeInfoCompat> findAccessibilityNodeInfosByText(java.lang.String, int);
+    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat findFocus(int);
+    method public java.lang.Object getProvider();
+    method public boolean performAction(int, int, android.os.Bundle);
+    field public static final int HOST_VIEW_ID = -1; // 0xffffffff
+  }
+
+  public class AccessibilityRecordCompat {
+    ctor public deprecated AccessibilityRecordCompat(java.lang.Object);
+    method public int getAddedCount();
+    method public java.lang.CharSequence getBeforeText();
+    method public java.lang.CharSequence getClassName();
+    method public java.lang.CharSequence getContentDescription();
+    method public int getCurrentItemIndex();
+    method public int getFromIndex();
+    method public deprecated java.lang.Object getImpl();
+    method public int getItemCount();
+    method public int getMaxScrollX();
+    method public int getMaxScrollY();
+    method public android.os.Parcelable getParcelableData();
+    method public int getRemovedCount();
+    method public int getScrollX();
+    method public int getScrollY();
+    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getSource();
+    method public java.util.List<java.lang.CharSequence> getText();
+    method public int getToIndex();
+    method public int getWindowId();
+    method public boolean isChecked();
+    method public boolean isEnabled();
+    method public boolean isFullScreen();
+    method public boolean isPassword();
+    method public boolean isScrollable();
+    method public static android.support.v4.view.accessibility.AccessibilityRecordCompat obtain(android.support.v4.view.accessibility.AccessibilityRecordCompat);
+    method public static android.support.v4.view.accessibility.AccessibilityRecordCompat obtain();
+    method public void recycle();
+    method public void setAddedCount(int);
+    method public void setBeforeText(java.lang.CharSequence);
+    method public void setChecked(boolean);
+    method public void setClassName(java.lang.CharSequence);
+    method public void setContentDescription(java.lang.CharSequence);
+    method public void setCurrentItemIndex(int);
+    method public void setEnabled(boolean);
+    method public void setFromIndex(int);
+    method public void setFullScreen(boolean);
+    method public void setItemCount(int);
+    method public void setMaxScrollX(int);
+    method public void setMaxScrollY(int);
+    method public void setParcelableData(android.os.Parcelable);
+    method public void setPassword(boolean);
+    method public void setRemovedCount(int);
+    method public void setScrollX(int);
+    method public void setScrollY(int);
+    method public void setScrollable(boolean);
+    method public void setSource(android.view.View);
+    method public void setSource(android.view.View, int);
+    method public void setToIndex(int);
+  }
+
+  public class AccessibilityWindowInfoCompat {
+    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getAnchor();
+    method public void getBoundsInScreen(android.graphics.Rect);
+    method public android.support.v4.view.accessibility.AccessibilityWindowInfoCompat getChild(int);
+    method public int getChildCount();
+    method public int getId();
+    method public int getLayer();
+    method public android.support.v4.view.accessibility.AccessibilityWindowInfoCompat getParent();
+    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getRoot();
+    method public java.lang.CharSequence getTitle();
+    method public int getType();
+    method public boolean isAccessibilityFocused();
+    method public boolean isActive();
+    method public boolean isFocused();
+    method public static android.support.v4.view.accessibility.AccessibilityWindowInfoCompat obtain();
+    method public static android.support.v4.view.accessibility.AccessibilityWindowInfoCompat obtain(android.support.v4.view.accessibility.AccessibilityWindowInfoCompat);
+    method public void recycle();
+    field public static final int TYPE_ACCESSIBILITY_OVERLAY = 4; // 0x4
+    field public static final int TYPE_APPLICATION = 1; // 0x1
+    field public static final int TYPE_INPUT_METHOD = 2; // 0x2
+    field public static final int TYPE_SPLIT_SCREEN_DIVIDER = 5; // 0x5
+    field public static final int TYPE_SYSTEM = 3; // 0x3
+  }
+
+}
+
+package android.support.v4.view.animation {
+
+  public class FastOutLinearInInterpolator extends android.support.v4.view.animation.LookupTableInterpolator {
+    ctor public FastOutLinearInInterpolator();
+  }
+
+  public class FastOutSlowInInterpolator extends android.support.v4.view.animation.LookupTableInterpolator {
+    ctor public FastOutSlowInInterpolator();
+  }
+
+  public class LinearOutSlowInInterpolator extends android.support.v4.view.animation.LookupTableInterpolator {
+    ctor public LinearOutSlowInInterpolator();
+  }
+
+   abstract class LookupTableInterpolator implements android.view.animation.Interpolator {
+    ctor public LookupTableInterpolator(float[]);
+    method public float getInterpolation(float);
+  }
+
+  public final class PathInterpolatorCompat {
+    method public static android.view.animation.Interpolator create(android.graphics.Path);
+    method public static android.view.animation.Interpolator create(float, float);
+    method public static android.view.animation.Interpolator create(float, float, float, float);
+  }
+
+}
+
+package android.support.v4.widget {
+
+  public abstract class AutoScrollHelper implements android.view.View.OnTouchListener {
+    ctor public AutoScrollHelper(android.view.View);
+    method public abstract boolean canTargetScrollHorizontally(int);
+    method public abstract boolean canTargetScrollVertically(int);
+    method public boolean isEnabled();
+    method public boolean isExclusive();
+    method public boolean onTouch(android.view.View, android.view.MotionEvent);
+    method public abstract void scrollTargetBy(int, int);
+    method public android.support.v4.widget.AutoScrollHelper setActivationDelay(int);
+    method public android.support.v4.widget.AutoScrollHelper setEdgeType(int);
+    method public android.support.v4.widget.AutoScrollHelper setEnabled(boolean);
+    method public android.support.v4.widget.AutoScrollHelper setExclusive(boolean);
+    method public android.support.v4.widget.AutoScrollHelper setMaximumEdges(float, float);
+    method public android.support.v4.widget.AutoScrollHelper setMaximumVelocity(float, float);
+    method public android.support.v4.widget.AutoScrollHelper setMinimumVelocity(float, float);
+    method public android.support.v4.widget.AutoScrollHelper setRampDownDuration(int);
+    method public android.support.v4.widget.AutoScrollHelper setRampUpDuration(int);
+    method public android.support.v4.widget.AutoScrollHelper setRelativeEdges(float, float);
+    method public android.support.v4.widget.AutoScrollHelper setRelativeVelocity(float, float);
+    field public static final int EDGE_TYPE_INSIDE = 0; // 0x0
+    field public static final int EDGE_TYPE_INSIDE_EXTEND = 1; // 0x1
+    field public static final int EDGE_TYPE_OUTSIDE = 2; // 0x2
+    field public static final float NO_MAX = 3.4028235E38f;
+    field public static final float NO_MIN = 0.0f;
+    field public static final float RELATIVE_UNSPECIFIED = 0.0f;
+  }
+
+  public final class CompoundButtonCompat {
+    method public static android.graphics.drawable.Drawable getButtonDrawable(android.widget.CompoundButton);
+    method public static android.content.res.ColorStateList getButtonTintList(android.widget.CompoundButton);
+    method public static android.graphics.PorterDuff.Mode getButtonTintMode(android.widget.CompoundButton);
+    method public static void setButtonTintList(android.widget.CompoundButton, android.content.res.ColorStateList);
+    method public static void setButtonTintMode(android.widget.CompoundButton, android.graphics.PorterDuff.Mode);
+  }
+
+  public class ContentLoadingProgressBar extends android.widget.ProgressBar {
+    ctor public ContentLoadingProgressBar(android.content.Context);
+    ctor public ContentLoadingProgressBar(android.content.Context, android.util.AttributeSet);
+    method public void hide();
+    method public void onAttachedToWindow();
+    method public void onDetachedFromWindow();
+    method public void show();
+  }
+
+  public abstract class CursorAdapter extends android.widget.BaseAdapter {
+    ctor public deprecated CursorAdapter(android.content.Context, android.database.Cursor);
+    ctor public CursorAdapter(android.content.Context, android.database.Cursor, boolean);
+    ctor public CursorAdapter(android.content.Context, android.database.Cursor, int);
+    method public abstract void bindView(android.view.View, android.content.Context, android.database.Cursor);
+    method public void changeCursor(android.database.Cursor);
+    method public java.lang.CharSequence convertToString(android.database.Cursor);
+    method public int getCount();
+    method public android.database.Cursor getCursor();
+    method public android.widget.Filter getFilter();
+    method public android.widget.FilterQueryProvider getFilterQueryProvider();
+    method public java.lang.Object getItem(int);
+    method public long getItemId(int);
+    method public android.view.View getView(int, android.view.View, android.view.ViewGroup);
+    method protected deprecated void init(android.content.Context, android.database.Cursor, boolean);
+    method public android.view.View newDropDownView(android.content.Context, android.database.Cursor, android.view.ViewGroup);
+    method public abstract android.view.View newView(android.content.Context, android.database.Cursor, android.view.ViewGroup);
+    method protected void onContentChanged();
+    method public android.database.Cursor runQueryOnBackgroundThread(java.lang.CharSequence);
+    method public void setFilterQueryProvider(android.widget.FilterQueryProvider);
+    method public android.database.Cursor swapCursor(android.database.Cursor);
+    field public static final deprecated int FLAG_AUTO_REQUERY = 1; // 0x1
+    field public static final int FLAG_REGISTER_CONTENT_OBSERVER = 2; // 0x2
+  }
+
+  public class DrawerLayout extends android.view.ViewGroup {
+    ctor public DrawerLayout(android.content.Context);
+    ctor public DrawerLayout(android.content.Context, android.util.AttributeSet);
+    ctor public DrawerLayout(android.content.Context, android.util.AttributeSet, int);
+    method public void addDrawerListener(android.support.v4.widget.DrawerLayout.DrawerListener);
+    method public void closeDrawer(android.view.View);
+    method public void closeDrawer(android.view.View, boolean);
+    method public void closeDrawer(int);
+    method public void closeDrawer(int, boolean);
+    method public void closeDrawers();
+    method public float getDrawerElevation();
+    method public int getDrawerLockMode(int);
+    method public int getDrawerLockMode(android.view.View);
+    method public java.lang.CharSequence getDrawerTitle(int);
+    method public android.graphics.drawable.Drawable getStatusBarBackgroundDrawable();
+    method public boolean isDrawerOpen(android.view.View);
+    method public boolean isDrawerOpen(int);
+    method public boolean isDrawerVisible(android.view.View);
+    method public boolean isDrawerVisible(int);
+    method public void onDraw(android.graphics.Canvas);
+    method protected void onLayout(boolean, int, int, int, int);
+    method public void openDrawer(android.view.View);
+    method public void openDrawer(android.view.View, boolean);
+    method public void openDrawer(int);
+    method public void openDrawer(int, boolean);
+    method public void removeDrawerListener(android.support.v4.widget.DrawerLayout.DrawerListener);
+    method public void setDrawerElevation(float);
+    method public deprecated void setDrawerListener(android.support.v4.widget.DrawerLayout.DrawerListener);
+    method public void setDrawerLockMode(int);
+    method public void setDrawerLockMode(int, int);
+    method public void setDrawerLockMode(int, android.view.View);
+    method public void setDrawerShadow(android.graphics.drawable.Drawable, int);
+    method public void setDrawerShadow(int, int);
+    method public void setDrawerTitle(int, java.lang.CharSequence);
+    method public void setScrimColor(int);
+    method public void setStatusBarBackground(android.graphics.drawable.Drawable);
+    method public void setStatusBarBackground(int);
+    method public void setStatusBarBackgroundColor(int);
+    field public static final int LOCK_MODE_LOCKED_CLOSED = 1; // 0x1
+    field public static final int LOCK_MODE_LOCKED_OPEN = 2; // 0x2
+    field public static final int LOCK_MODE_UNDEFINED = 3; // 0x3
+    field public static final int LOCK_MODE_UNLOCKED = 0; // 0x0
+    field public static final int STATE_DRAGGING = 1; // 0x1
+    field public static final int STATE_IDLE = 0; // 0x0
+    field public static final int STATE_SETTLING = 2; // 0x2
+  }
+
+  public static abstract interface DrawerLayout.DrawerListener {
+    method public abstract void onDrawerClosed(android.view.View);
+    method public abstract void onDrawerOpened(android.view.View);
+    method public abstract void onDrawerSlide(android.view.View, float);
+    method public abstract void onDrawerStateChanged(int);
+  }
+
+  public static class DrawerLayout.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
+    ctor public DrawerLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
+    ctor public DrawerLayout.LayoutParams(int, int);
+    ctor public DrawerLayout.LayoutParams(int, int, int);
+    ctor public DrawerLayout.LayoutParams(android.support.v4.widget.DrawerLayout.LayoutParams);
+    ctor public DrawerLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
+    ctor public DrawerLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
+    field public int gravity;
+  }
+
+  protected static class DrawerLayout.SavedState extends android.support.v4.view.AbsSavedState {
+    ctor public DrawerLayout.SavedState(android.os.Parcel, java.lang.ClassLoader);
+    ctor public DrawerLayout.SavedState(android.os.Parcelable);
+    field public static final android.os.Parcelable.Creator<android.support.v4.widget.DrawerLayout.SavedState> CREATOR;
+  }
+
+  public static abstract class DrawerLayout.SimpleDrawerListener implements android.support.v4.widget.DrawerLayout.DrawerListener {
+    ctor public DrawerLayout.SimpleDrawerListener();
+    method public void onDrawerClosed(android.view.View);
+    method public void onDrawerOpened(android.view.View);
+    method public void onDrawerSlide(android.view.View, float);
+    method public void onDrawerStateChanged(int);
+  }
+
+  public final class EdgeEffectCompat {
+    ctor public EdgeEffectCompat(android.content.Context);
+    method public boolean draw(android.graphics.Canvas);
+    method public void finish();
+    method public boolean isFinished();
+    method public boolean onAbsorb(int);
+    method public deprecated boolean onPull(float);
+    method public boolean onPull(float, float);
+    method public boolean onRelease();
+    method public void setSize(int, int);
+  }
+
+  public abstract class ExploreByTouchHelper extends android.support.v4.view.AccessibilityDelegateCompat {
+    ctor public ExploreByTouchHelper(android.view.View);
+    method public final boolean clearKeyboardFocusForVirtualView(int);
+    method public final boolean dispatchHoverEvent(android.view.MotionEvent);
+    method public final boolean dispatchKeyEvent(android.view.KeyEvent);
+    method public final int getAccessibilityFocusedVirtualViewId();
+    method public deprecated int getFocusedVirtualView();
+    method public final int getKeyboardFocusedVirtualViewId();
+    method protected abstract int getVirtualViewAt(float, float);
+    method protected abstract void getVisibleVirtualViews(java.util.List<java.lang.Integer>);
+    method public final void invalidateRoot();
+    method public final void invalidateVirtualView(int);
+    method public final void invalidateVirtualView(int, int);
+    method public final void onFocusChanged(boolean, int, android.graphics.Rect);
+    method protected abstract boolean onPerformActionForVirtualView(int, int, android.os.Bundle);
+    method protected void onPopulateEventForHost(android.view.accessibility.AccessibilityEvent);
+    method protected void onPopulateEventForVirtualView(int, android.view.accessibility.AccessibilityEvent);
+    method protected void onPopulateNodeForHost(android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
+    method protected abstract void onPopulateNodeForVirtualView(int, android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
+    method protected void onVirtualViewKeyboardFocusChanged(int, boolean);
+    method public final boolean requestKeyboardFocusForVirtualView(int);
+    method public final boolean sendEventForVirtualView(int, int);
+    field public static final int HOST_ID = -1; // 0xffffffff
+    field public static final int INVALID_ID = -2147483648; // 0x80000000
+  }
+
+  public final class ListPopupWindowCompat {
+    method public static android.view.View.OnTouchListener createDragToOpenListener(java.lang.Object, android.view.View);
+  }
+
+  public class ListViewAutoScrollHelper extends android.support.v4.widget.AutoScrollHelper {
+    ctor public ListViewAutoScrollHelper(android.widget.ListView);
+    method public boolean canTargetScrollHorizontally(int);
+    method public boolean canTargetScrollVertically(int);
+    method public void scrollTargetBy(int, int);
+  }
+
+  public final class ListViewCompat {
+    method public static void scrollListBy(android.widget.ListView, int);
+  }
+
+  public class NestedScrollView extends android.widget.FrameLayout implements android.support.v4.view.NestedScrollingChild android.support.v4.view.NestedScrollingParent android.support.v4.view.ScrollingView {
+    ctor public NestedScrollView(android.content.Context);
+    ctor public NestedScrollView(android.content.Context, android.util.AttributeSet);
+    ctor public NestedScrollView(android.content.Context, android.util.AttributeSet, int);
+    method public boolean arrowScroll(int);
+    method protected int computeScrollDeltaToGetChildRectOnScreen(android.graphics.Rect);
+    method public boolean executeKeyEvent(android.view.KeyEvent);
+    method public void fling(int);
+    method public boolean fullScroll(int);
+    method public int getMaxScrollAmount();
+    method public boolean isFillViewport();
+    method public boolean isSmoothScrollingEnabled();
+    method public void onAttachedToWindow();
+    method public boolean pageScroll(int);
+    method public void setFillViewport(boolean);
+    method public void setOnScrollChangeListener(android.support.v4.widget.NestedScrollView.OnScrollChangeListener);
+    method public void setSmoothScrollingEnabled(boolean);
+    method public final void smoothScrollBy(int, int);
+    method public final void smoothScrollTo(int, int);
+  }
+
+  public static abstract interface NestedScrollView.OnScrollChangeListener {
+    method public abstract void onScrollChange(android.support.v4.widget.NestedScrollView, int, int, int, int);
+  }
+
+  public final class PopupMenuCompat {
+    method public static android.view.View.OnTouchListener getDragToOpenListener(java.lang.Object);
+  }
+
+  public final class PopupWindowCompat {
+    method public static boolean getOverlapAnchor(android.widget.PopupWindow);
+    method public static int getWindowLayoutType(android.widget.PopupWindow);
+    method public static void setOverlapAnchor(android.widget.PopupWindow, boolean);
+    method public static void setWindowLayoutType(android.widget.PopupWindow, int);
+    method public static void showAsDropDown(android.widget.PopupWindow, android.view.View, int, int, int);
+  }
+
+  public abstract class ResourceCursorAdapter extends android.support.v4.widget.CursorAdapter {
+    ctor public deprecated ResourceCursorAdapter(android.content.Context, int, android.database.Cursor);
+    ctor public deprecated ResourceCursorAdapter(android.content.Context, int, android.database.Cursor, boolean);
+    ctor public ResourceCursorAdapter(android.content.Context, int, android.database.Cursor, int);
+    method public android.view.View newView(android.content.Context, android.database.Cursor, android.view.ViewGroup);
+    method public void setDropDownViewResource(int);
+    method public void setViewResource(int);
+  }
+
+  public final class ScrollerCompat {
+    method public void abortAnimation();
+    method public boolean computeScrollOffset();
+    method public static android.support.v4.widget.ScrollerCompat create(android.content.Context);
+    method public static android.support.v4.widget.ScrollerCompat create(android.content.Context, android.view.animation.Interpolator);
+    method public void fling(int, int, int, int, int, int, int, int);
+    method public void fling(int, int, int, int, int, int, int, int, int, int);
+    method public float getCurrVelocity();
+    method public int getCurrX();
+    method public int getCurrY();
+    method public int getFinalX();
+    method public int getFinalY();
+    method public boolean isFinished();
+    method public boolean isOverScrolled();
+    method public void notifyHorizontalEdgeReached(int, int, int);
+    method public void notifyVerticalEdgeReached(int, int, int);
+    method public boolean springBack(int, int, int, int, int, int);
+    method public void startScroll(int, int, int, int);
+    method public void startScroll(int, int, int, int, int);
+  }
+
+  public final class SearchViewCompat {
+    method public static java.lang.CharSequence getQuery(android.view.View);
+    method public static boolean isIconified(android.view.View);
+    method public static boolean isQueryRefinementEnabled(android.view.View);
+    method public static boolean isSubmitButtonEnabled(android.view.View);
+    method public static android.view.View newSearchView(android.content.Context);
+    method public static void setIconified(android.view.View, boolean);
+    method public static void setImeOptions(android.view.View, int);
+    method public static void setInputType(android.view.View, int);
+    method public static void setMaxWidth(android.view.View, int);
+    method public static void setOnCloseListener(android.view.View, android.support.v4.widget.SearchViewCompat.OnCloseListenerCompat);
+    method public static void setOnQueryTextListener(android.view.View, android.support.v4.widget.SearchViewCompat.OnQueryTextListenerCompat);
+    method public static void setQuery(android.view.View, java.lang.CharSequence, boolean);
+    method public static void setQueryHint(android.view.View, java.lang.CharSequence);
+    method public static void setQueryRefinementEnabled(android.view.View, boolean);
+    method public static void setSearchableInfo(android.view.View, android.content.ComponentName);
+    method public static void setSubmitButtonEnabled(android.view.View, boolean);
+  }
+
+  public static abstract class SearchViewCompat.OnCloseListenerCompat {
+    ctor public SearchViewCompat.OnCloseListenerCompat();
+    method public boolean onClose();
+  }
+
+  public static abstract class SearchViewCompat.OnQueryTextListenerCompat {
+    ctor public SearchViewCompat.OnQueryTextListenerCompat();
+    method public boolean onQueryTextChange(java.lang.String);
+    method public boolean onQueryTextSubmit(java.lang.String);
+  }
+
+  public class SimpleCursorAdapter extends android.support.v4.widget.ResourceCursorAdapter {
+    ctor public deprecated SimpleCursorAdapter(android.content.Context, int, android.database.Cursor, java.lang.String[], int[]);
+    ctor public SimpleCursorAdapter(android.content.Context, int, android.database.Cursor, java.lang.String[], int[], int);
+    method public void bindView(android.view.View, android.content.Context, android.database.Cursor);
+    method public void changeCursorAndColumns(android.database.Cursor, java.lang.String[], int[]);
+    method public android.support.v4.widget.SimpleCursorAdapter.CursorToStringConverter getCursorToStringConverter();
+    method public int getStringConversionColumn();
+    method public android.support.v4.widget.SimpleCursorAdapter.ViewBinder getViewBinder();
+    method public void setCursorToStringConverter(android.support.v4.widget.SimpleCursorAdapter.CursorToStringConverter);
+    method public void setStringConversionColumn(int);
+    method public void setViewBinder(android.support.v4.widget.SimpleCursorAdapter.ViewBinder);
+    method public void setViewImage(android.widget.ImageView, java.lang.String);
+    method public void setViewText(android.widget.TextView, java.lang.String);
+  }
+
+  public static abstract interface SimpleCursorAdapter.CursorToStringConverter {
+    method public abstract java.lang.CharSequence convertToString(android.database.Cursor);
+  }
+
+  public static abstract interface SimpleCursorAdapter.ViewBinder {
+    method public abstract boolean setViewValue(android.view.View, android.database.Cursor, int);
+  }
+
+  public class SlidingPaneLayout extends android.view.ViewGroup {
+    ctor public SlidingPaneLayout(android.content.Context);
+    ctor public SlidingPaneLayout(android.content.Context, android.util.AttributeSet);
+    ctor public SlidingPaneLayout(android.content.Context, android.util.AttributeSet, int);
+    method protected boolean canScroll(android.view.View, boolean, int, int, int);
+    method public deprecated boolean canSlide();
+    method public boolean closePane();
+    method public int getCoveredFadeColor();
+    method public int getParallaxDistance();
+    method public int getSliderFadeColor();
+    method public boolean isOpen();
+    method public boolean isSlideable();
+    method protected void onLayout(boolean, int, int, int, int);
+    method public boolean openPane();
+    method public void setCoveredFadeColor(int);
+    method public void setPanelSlideListener(android.support.v4.widget.SlidingPaneLayout.PanelSlideListener);
+    method public void setParallaxDistance(int);
+    method public deprecated void setShadowDrawable(android.graphics.drawable.Drawable);
+    method public void setShadowDrawableLeft(android.graphics.drawable.Drawable);
+    method public void setShadowDrawableRight(android.graphics.drawable.Drawable);
+    method public deprecated void setShadowResource(int);
+    method public void setShadowResourceLeft(int);
+    method public void setShadowResourceRight(int);
+    method public void setSliderFadeColor(int);
+    method public deprecated void smoothSlideClosed();
+    method public deprecated void smoothSlideOpen();
+  }
+
+  public static class SlidingPaneLayout.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
+    ctor public SlidingPaneLayout.LayoutParams();
+    ctor public SlidingPaneLayout.LayoutParams(int, int);
+    ctor public SlidingPaneLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
+    ctor public SlidingPaneLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
+    ctor public SlidingPaneLayout.LayoutParams(android.support.v4.widget.SlidingPaneLayout.LayoutParams);
+    ctor public SlidingPaneLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
+    field public float weight;
+  }
+
+  public static abstract interface SlidingPaneLayout.PanelSlideListener {
+    method public abstract void onPanelClosed(android.view.View);
+    method public abstract void onPanelOpened(android.view.View);
+    method public abstract void onPanelSlide(android.view.View, float);
+  }
+
+  public static class SlidingPaneLayout.SimplePanelSlideListener implements android.support.v4.widget.SlidingPaneLayout.PanelSlideListener {
+    ctor public SlidingPaneLayout.SimplePanelSlideListener();
+    method public void onPanelClosed(android.view.View);
+    method public void onPanelOpened(android.view.View);
+    method public void onPanelSlide(android.view.View, float);
+  }
+
+  public class Space extends android.view.View {
+    ctor public Space(android.content.Context, android.util.AttributeSet, int);
+    ctor public Space(android.content.Context, android.util.AttributeSet);
+    ctor public Space(android.content.Context);
+  }
+
+  public class SwipeRefreshLayout extends android.view.ViewGroup implements android.support.v4.view.NestedScrollingChild android.support.v4.view.NestedScrollingParent {
+    ctor public SwipeRefreshLayout(android.content.Context);
+    ctor public SwipeRefreshLayout(android.content.Context, android.util.AttributeSet);
+    method public boolean canChildScrollUp();
+    method public int getProgressCircleDiameter();
+    method public boolean isRefreshing();
+    method protected void onLayout(boolean, int, int, int, int);
+    method public void onMeasure(int, int);
+    method public deprecated void setColorScheme(int...);
+    method public void setColorSchemeColors(int...);
+    method public void setColorSchemeResources(int...);
+    method public void setDistanceToTriggerSync(int);
+    method public void setOnChildScrollUpCallback(android.support.v4.widget.SwipeRefreshLayout.OnChildScrollUpCallback);
+    method public void setOnRefreshListener(android.support.v4.widget.SwipeRefreshLayout.OnRefreshListener);
+    method public deprecated void setProgressBackgroundColor(int);
+    method public void setProgressBackgroundColorSchemeColor(int);
+    method public void setProgressBackgroundColorSchemeResource(int);
+    method public void setProgressViewEndTarget(boolean, int);
+    method public void setProgressViewOffset(boolean, int, int);
+    method public void setRefreshing(boolean);
+    method public void setSize(int);
+    field public static final int DEFAULT = 1; // 0x1
+    field public static final int LARGE = 0; // 0x0
+    field protected int mFrom;
+    field protected int mOriginalOffsetTop;
+  }
+
+  public static abstract interface SwipeRefreshLayout.OnChildScrollUpCallback {
+    method public abstract boolean canChildScrollUp(android.support.v4.widget.SwipeRefreshLayout, android.view.View);
+  }
+
+  public static abstract interface SwipeRefreshLayout.OnRefreshListener {
+    method public abstract void onRefresh();
+  }
+
+  public final class TextViewCompat {
+    method public static int getMaxLines(android.widget.TextView);
+    method public static int getMinLines(android.widget.TextView);
+    method public static void setCompoundDrawablesRelative(android.widget.TextView, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable);
+    method public static void setCompoundDrawablesRelativeWithIntrinsicBounds(android.widget.TextView, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable);
+    method public static void setCompoundDrawablesRelativeWithIntrinsicBounds(android.widget.TextView, int, int, int, int);
+    method public static void setTextAppearance(android.widget.TextView, int);
+  }
+
+  public abstract interface TintableCompoundButton {
+    method public abstract android.content.res.ColorStateList getSupportButtonTintList();
+    method public abstract android.graphics.PorterDuff.Mode getSupportButtonTintMode();
+    method public abstract void setSupportButtonTintList(android.content.res.ColorStateList);
+    method public abstract void setSupportButtonTintMode(android.graphics.PorterDuff.Mode);
+  }
+
+  public class ViewDragHelper {
+    method public void abort();
+    method protected boolean canScroll(android.view.View, boolean, int, int, int, int);
+    method public void cancel();
+    method public void captureChildView(android.view.View, int);
+    method public boolean checkTouchSlop(int);
+    method public boolean checkTouchSlop(int, int);
+    method public boolean continueSettling(boolean);
+    method public static android.support.v4.widget.ViewDragHelper create(android.view.ViewGroup, android.support.v4.widget.ViewDragHelper.Callback);
+    method public static android.support.v4.widget.ViewDragHelper create(android.view.ViewGroup, float, android.support.v4.widget.ViewDragHelper.Callback);
+    method public android.view.View findTopChildUnder(int, int);
+    method public void flingCapturedView(int, int, int, int);
+    method public int getActivePointerId();
+    method public android.view.View getCapturedView();
+    method public int getEdgeSize();
+    method public float getMinVelocity();
+    method public int getTouchSlop();
+    method public int getViewDragState();
+    method public boolean isCapturedViewUnder(int, int);
+    method public boolean isEdgeTouched(int);
+    method public boolean isEdgeTouched(int, int);
+    method public boolean isPointerDown(int);
+    method public boolean isViewUnder(android.view.View, int, int);
+    method public void processTouchEvent(android.view.MotionEvent);
+    method public void setEdgeTrackingEnabled(int);
+    method public void setMinVelocity(float);
+    method public boolean settleCapturedViewAt(int, int);
+    method public boolean shouldInterceptTouchEvent(android.view.MotionEvent);
+    method public boolean smoothSlideViewTo(android.view.View, int, int);
+    field public static final int DIRECTION_ALL = 3; // 0x3
+    field public static final int DIRECTION_HORIZONTAL = 1; // 0x1
+    field public static final int DIRECTION_VERTICAL = 2; // 0x2
+    field public static final int EDGE_ALL = 15; // 0xf
+    field public static final int EDGE_BOTTOM = 8; // 0x8
+    field public static final int EDGE_LEFT = 1; // 0x1
+    field public static final int EDGE_RIGHT = 2; // 0x2
+    field public static final int EDGE_TOP = 4; // 0x4
+    field public static final int INVALID_POINTER = -1; // 0xffffffff
+    field public static final int STATE_DRAGGING = 1; // 0x1
+    field public static final int STATE_IDLE = 0; // 0x0
+    field public static final int STATE_SETTLING = 2; // 0x2
+  }
+
+  public static abstract class ViewDragHelper.Callback {
+    ctor public ViewDragHelper.Callback();
+    method public int clampViewPositionHorizontal(android.view.View, int, int);
+    method public int clampViewPositionVertical(android.view.View, int, int);
+    method public int getOrderedChildIndex(int);
+    method public int getViewHorizontalDragRange(android.view.View);
+    method public int getViewVerticalDragRange(android.view.View);
+    method public void onEdgeDragStarted(int, int);
+    method public boolean onEdgeLock(int);
+    method public void onEdgeTouched(int, int);
+    method public void onViewCaptured(android.view.View, int);
+    method public void onViewDragStateChanged(int);
+    method public void onViewPositionChanged(android.view.View, int, int, int, int);
+    method public void onViewReleased(android.view.View, float, float);
+    method public abstract boolean tryCaptureView(android.view.View, int);
+  }
+
+}
+
+package android.support.v7.app {
+
+  public abstract class ActionBar {
+    ctor public ActionBar();
+    method public abstract void addOnMenuVisibilityListener(android.support.v7.app.ActionBar.OnMenuVisibilityListener);
+    method public abstract deprecated void addTab(android.support.v7.app.ActionBar.Tab);
+    method public abstract deprecated void addTab(android.support.v7.app.ActionBar.Tab, boolean);
+    method public abstract deprecated void addTab(android.support.v7.app.ActionBar.Tab, int);
+    method public abstract deprecated void addTab(android.support.v7.app.ActionBar.Tab, int, boolean);
+    method public abstract android.view.View getCustomView();
+    method public abstract int getDisplayOptions();
+    method public float getElevation();
+    method public abstract int getHeight();
+    method public int getHideOffset();
+    method public abstract deprecated int getNavigationItemCount();
+    method public abstract deprecated int getNavigationMode();
+    method public abstract deprecated int getSelectedNavigationIndex();
+    method public abstract deprecated android.support.v7.app.ActionBar.Tab getSelectedTab();
+    method public abstract java.lang.CharSequence getSubtitle();
+    method public abstract deprecated android.support.v7.app.ActionBar.Tab getTabAt(int);
+    method public abstract deprecated int getTabCount();
+    method public android.content.Context getThemedContext();
+    method public abstract java.lang.CharSequence getTitle();
+    method public abstract void hide();
+    method public boolean isHideOnContentScrollEnabled();
+    method public abstract boolean isShowing();
+    method public abstract deprecated android.support.v7.app.ActionBar.Tab newTab();
+    method public abstract deprecated void removeAllTabs();
+    method public abstract void removeOnMenuVisibilityListener(android.support.v7.app.ActionBar.OnMenuVisibilityListener);
+    method public abstract deprecated void removeTab(android.support.v7.app.ActionBar.Tab);
+    method public abstract deprecated void removeTabAt(int);
+    method public abstract deprecated void selectTab(android.support.v7.app.ActionBar.Tab);
+    method public abstract void setBackgroundDrawable(android.graphics.drawable.Drawable);
+    method public abstract void setCustomView(android.view.View);
+    method public abstract void setCustomView(android.view.View, android.support.v7.app.ActionBar.LayoutParams);
+    method public abstract void setCustomView(int);
+    method public abstract void setDisplayHomeAsUpEnabled(boolean);
+    method public abstract void setDisplayOptions(int);
+    method public abstract void setDisplayOptions(int, int);
+    method public abstract void setDisplayShowCustomEnabled(boolean);
+    method public abstract void setDisplayShowHomeEnabled(boolean);
+    method public abstract void setDisplayShowTitleEnabled(boolean);
+    method public abstract void setDisplayUseLogoEnabled(boolean);
+    method public void setElevation(float);
+    method public void setHideOffset(int);
+    method public void setHideOnContentScrollEnabled(boolean);
+    method public void setHomeActionContentDescription(java.lang.CharSequence);
+    method public void setHomeActionContentDescription(int);
+    method public void setHomeAsUpIndicator(android.graphics.drawable.Drawable);
+    method public void setHomeAsUpIndicator(int);
+    method public void setHomeButtonEnabled(boolean);
+    method public abstract void setIcon(int);
+    method public abstract void setIcon(android.graphics.drawable.Drawable);
+    method public abstract deprecated void setListNavigationCallbacks(android.widget.SpinnerAdapter, android.support.v7.app.ActionBar.OnNavigationListener);
+    method public abstract void setLogo(int);
+    method public abstract void setLogo(android.graphics.drawable.Drawable);
+    method public abstract deprecated void setNavigationMode(int);
+    method public abstract deprecated void setSelectedNavigationItem(int);
+    method public void setSplitBackgroundDrawable(android.graphics.drawable.Drawable);
+    method public void setStackedBackgroundDrawable(android.graphics.drawable.Drawable);
+    method public abstract void setSubtitle(java.lang.CharSequence);
+    method public abstract void setSubtitle(int);
+    method public abstract void setTitle(java.lang.CharSequence);
+    method public abstract void setTitle(int);
+    method public abstract void show();
+    field public static final int DISPLAY_HOME_AS_UP = 4; // 0x4
+    field public static final int DISPLAY_SHOW_CUSTOM = 16; // 0x10
+    field public static final int DISPLAY_SHOW_HOME = 2; // 0x2
+    field public static final int DISPLAY_SHOW_TITLE = 8; // 0x8
+    field public static final int DISPLAY_USE_LOGO = 1; // 0x1
+    field public static final deprecated int NAVIGATION_MODE_LIST = 1; // 0x1
+    field public static final deprecated int NAVIGATION_MODE_STANDARD = 0; // 0x0
+    field public static final deprecated int NAVIGATION_MODE_TABS = 2; // 0x2
+  }
+
+  public static class ActionBar.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
+    ctor public ActionBar.LayoutParams(android.content.Context, android.util.AttributeSet);
+    ctor public ActionBar.LayoutParams(int, int);
+    ctor public ActionBar.LayoutParams(int, int, int);
+    ctor public ActionBar.LayoutParams(int);
+    ctor public ActionBar.LayoutParams(android.support.v7.app.ActionBar.LayoutParams);
+    ctor public ActionBar.LayoutParams(android.view.ViewGroup.LayoutParams);
+    field public int gravity;
+  }
+
+  public static abstract interface ActionBar.OnMenuVisibilityListener {
+    method public abstract void onMenuVisibilityChanged(boolean);
+  }
+
+  public static abstract deprecated interface ActionBar.OnNavigationListener {
+    method public abstract boolean onNavigationItemSelected(int, long);
+  }
+
+  public static abstract deprecated class ActionBar.Tab {
+    ctor public ActionBar.Tab();
+    method public abstract java.lang.CharSequence getContentDescription();
+    method public abstract android.view.View getCustomView();
+    method public abstract android.graphics.drawable.Drawable getIcon();
+    method public abstract int getPosition();
+    method public abstract java.lang.Object getTag();
+    method public abstract java.lang.CharSequence getText();
+    method public abstract void select();
+    method public abstract android.support.v7.app.ActionBar.Tab setContentDescription(int);
+    method public abstract android.support.v7.app.ActionBar.Tab setContentDescription(java.lang.CharSequence);
+    method public abstract android.support.v7.app.ActionBar.Tab setCustomView(android.view.View);
+    method public abstract android.support.v7.app.ActionBar.Tab setCustomView(int);
+    method public abstract android.support.v7.app.ActionBar.Tab setIcon(android.graphics.drawable.Drawable);
+    method public abstract android.support.v7.app.ActionBar.Tab setIcon(int);
+    method public abstract android.support.v7.app.ActionBar.Tab setTabListener(android.support.v7.app.ActionBar.TabListener);
+    method public abstract android.support.v7.app.ActionBar.Tab setTag(java.lang.Object);
+    method public abstract android.support.v7.app.ActionBar.Tab setText(java.lang.CharSequence);
+    method public abstract android.support.v7.app.ActionBar.Tab setText(int);
+    field public static final int INVALID_POSITION = -1; // 0xffffffff
+  }
+
+  public static abstract deprecated interface ActionBar.TabListener {
+    method public abstract void onTabReselected(android.support.v7.app.ActionBar.Tab, android.support.v4.app.FragmentTransaction);
+    method public abstract void onTabSelected(android.support.v7.app.ActionBar.Tab, android.support.v4.app.FragmentTransaction);
+    method public abstract void onTabUnselected(android.support.v7.app.ActionBar.Tab, android.support.v4.app.FragmentTransaction);
+  }
+
+  public deprecated class ActionBarActivity extends android.support.v7.app.AppCompatActivity {
+    ctor public ActionBarActivity();
+  }
+
+  public class ActionBarDrawerToggle implements android.support.v4.widget.DrawerLayout.DrawerListener {
+    ctor public ActionBarDrawerToggle(android.app.Activity, android.support.v4.widget.DrawerLayout, int, int);
+    ctor public ActionBarDrawerToggle(android.app.Activity, android.support.v4.widget.DrawerLayout, android.support.v7.widget.Toolbar, int, int);
+    method public android.view.View.OnClickListener getToolbarNavigationClickListener();
+    method public boolean isDrawerIndicatorEnabled();
+    method public void onConfigurationChanged(android.content.res.Configuration);
+    method public void onDrawerClosed(android.view.View);
+    method public void onDrawerOpened(android.view.View);
+    method public void onDrawerSlide(android.view.View, float);
+    method public void onDrawerStateChanged(int);
+    method public boolean onOptionsItemSelected(android.view.MenuItem);
+    method public void setDrawerIndicatorEnabled(boolean);
+    method public void setHomeAsUpIndicator(android.graphics.drawable.Drawable);
+    method public void setHomeAsUpIndicator(int);
+    method public void setToolbarNavigationClickListener(android.view.View.OnClickListener);
+    method public void syncState();
+  }
+
+  public static abstract interface ActionBarDrawerToggle.Delegate {
+    method public abstract android.content.Context getActionBarThemedContext();
+    method public abstract android.graphics.drawable.Drawable getThemeUpIndicator();
+    method public abstract boolean isNavigationVisible();
+    method public abstract void setActionBarDescription(int);
+    method public abstract void setActionBarUpIndicator(android.graphics.drawable.Drawable, int);
+  }
+
+  public static abstract interface ActionBarDrawerToggle.DelegateProvider {
+    method public abstract android.support.v7.app.ActionBarDrawerToggle.Delegate getDrawerToggleDelegate();
+  }
+
+  public class AlertDialog extends android.support.v7.app.AppCompatDialog implements android.content.DialogInterface {
+    ctor protected AlertDialog(android.content.Context);
+    ctor protected AlertDialog(android.content.Context, int);
+    ctor protected AlertDialog(android.content.Context, boolean, android.content.DialogInterface.OnCancelListener);
+    method public android.widget.Button getButton(int);
+    method public android.widget.ListView getListView();
+    method public void setButton(int, java.lang.CharSequence, android.os.Message);
+    method public void setButton(int, java.lang.CharSequence, android.content.DialogInterface.OnClickListener);
+    method public void setCustomTitle(android.view.View);
+    method public void setIcon(int);
+    method public void setIcon(android.graphics.drawable.Drawable);
+    method public void setIconAttribute(int);
+    method public void setMessage(java.lang.CharSequence);
+    method public void setView(android.view.View);
+    method public void setView(android.view.View, int, int, int, int);
+  }
+
+  public static class AlertDialog.Builder {
+    ctor public AlertDialog.Builder(android.content.Context);
+    ctor public AlertDialog.Builder(android.content.Context, int);
+    method public android.support.v7.app.AlertDialog create();
+    method public android.content.Context getContext();
+    method public android.support.v7.app.AlertDialog.Builder setAdapter(android.widget.ListAdapter, android.content.DialogInterface.OnClickListener);
+    method public android.support.v7.app.AlertDialog.Builder setCancelable(boolean);
+    method public android.support.v7.app.AlertDialog.Builder setCursor(android.database.Cursor, android.content.DialogInterface.OnClickListener, java.lang.String);
+    method public android.support.v7.app.AlertDialog.Builder setCustomTitle(android.view.View);
+    method public android.support.v7.app.AlertDialog.Builder setIcon(int);
+    method public android.support.v7.app.AlertDialog.Builder setIcon(android.graphics.drawable.Drawable);
+    method public android.support.v7.app.AlertDialog.Builder setIconAttribute(int);
+    method public deprecated android.support.v7.app.AlertDialog.Builder setInverseBackgroundForced(boolean);
+    method public android.support.v7.app.AlertDialog.Builder setItems(int, android.content.DialogInterface.OnClickListener);
+    method public android.support.v7.app.AlertDialog.Builder setItems(java.lang.CharSequence[], android.content.DialogInterface.OnClickListener);
+    method public android.support.v7.app.AlertDialog.Builder setMessage(int);
+    method public android.support.v7.app.AlertDialog.Builder setMessage(java.lang.CharSequence);
+    method public android.support.v7.app.AlertDialog.Builder setMultiChoiceItems(int, boolean[], android.content.DialogInterface.OnMultiChoiceClickListener);
+    method public android.support.v7.app.AlertDialog.Builder setMultiChoiceItems(java.lang.CharSequence[], boolean[], android.content.DialogInterface.OnMultiChoiceClickListener);
+    method public android.support.v7.app.AlertDialog.Builder setMultiChoiceItems(android.database.Cursor, java.lang.String, java.lang.String, android.content.DialogInterface.OnMultiChoiceClickListener);
+    method public android.support.v7.app.AlertDialog.Builder setNegativeButton(int, android.content.DialogInterface.OnClickListener);
+    method public android.support.v7.app.AlertDialog.Builder setNegativeButton(java.lang.CharSequence, android.content.DialogInterface.OnClickListener);
+    method public android.support.v7.app.AlertDialog.Builder setNeutralButton(int, android.content.DialogInterface.OnClickListener);
+    method public android.support.v7.app.AlertDialog.Builder setNeutralButton(java.lang.CharSequence, android.content.DialogInterface.OnClickListener);
+    method public android.support.v7.app.AlertDialog.Builder setOnCancelListener(android.content.DialogInterface.OnCancelListener);
+    method public android.support.v7.app.AlertDialog.Builder setOnDismissListener(android.content.DialogInterface.OnDismissListener);
+    method public android.support.v7.app.AlertDialog.Builder setOnItemSelectedListener(android.widget.AdapterView.OnItemSelectedListener);
+    method public android.support.v7.app.AlertDialog.Builder setOnKeyListener(android.content.DialogInterface.OnKeyListener);
+    method public android.support.v7.app.AlertDialog.Builder setPositiveButton(int, android.content.DialogInterface.OnClickListener);
+    method public android.support.v7.app.AlertDialog.Builder setPositiveButton(java.lang.CharSequence, android.content.DialogInterface.OnClickListener);
+    method public android.support.v7.app.AlertDialog.Builder setSingleChoiceItems(int, int, android.content.DialogInterface.OnClickListener);
+    method public android.support.v7.app.AlertDialog.Builder setSingleChoiceItems(android.database.Cursor, int, java.lang.String, android.content.DialogInterface.OnClickListener);
+    method public android.support.v7.app.AlertDialog.Builder setSingleChoiceItems(java.lang.CharSequence[], int, android.content.DialogInterface.OnClickListener);
+    method public android.support.v7.app.AlertDialog.Builder setSingleChoiceItems(android.widget.ListAdapter, int, android.content.DialogInterface.OnClickListener);
+    method public android.support.v7.app.AlertDialog.Builder setTitle(int);
+    method public android.support.v7.app.AlertDialog.Builder setTitle(java.lang.CharSequence);
+    method public android.support.v7.app.AlertDialog.Builder setView(int);
+    method public android.support.v7.app.AlertDialog.Builder setView(android.view.View);
+    method public android.support.v7.app.AlertDialog show();
+  }
+
+  public class AppCompatActivity extends android.support.v4.app.FragmentActivity implements android.support.v7.app.ActionBarDrawerToggle.DelegateProvider android.support.v7.app.AppCompatCallback android.support.v4.app.TaskStackBuilder.SupportParentable {
+    ctor public AppCompatActivity();
+    method public android.support.v7.app.AppCompatDelegate getDelegate();
+    method public android.support.v7.app.ActionBarDrawerToggle.Delegate getDrawerToggleDelegate();
+    method public android.support.v7.app.ActionBar getSupportActionBar();
+    method public android.content.Intent getSupportParentActivityIntent();
+    method public void onCreateSupportNavigateUpTaskStack(android.support.v4.app.TaskStackBuilder);
+    method public final boolean onMenuItemSelected(int, android.view.MenuItem);
+    method public void onPrepareSupportNavigateUpTaskStack(android.support.v4.app.TaskStackBuilder);
+    method public void onSupportActionModeFinished(android.support.v7.view.ActionMode);
+    method public void onSupportActionModeStarted(android.support.v7.view.ActionMode);
+    method public deprecated void onSupportContentChanged();
+    method public boolean onSupportNavigateUp();
+    method public android.support.v7.view.ActionMode onWindowStartingSupportActionMode(android.support.v7.view.ActionMode.Callback);
+    method public void setSupportActionBar(android.support.v7.widget.Toolbar);
+    method public deprecated void setSupportProgress(int);
+    method public deprecated void setSupportProgressBarIndeterminate(boolean);
+    method public deprecated void setSupportProgressBarIndeterminateVisibility(boolean);
+    method public deprecated void setSupportProgressBarVisibility(boolean);
+    method public android.support.v7.view.ActionMode startSupportActionMode(android.support.v7.view.ActionMode.Callback);
+    method public void supportNavigateUpTo(android.content.Intent);
+    method public boolean supportRequestWindowFeature(int);
+    method public boolean supportShouldUpRecreateTask(android.content.Intent);
+  }
+
+  public abstract interface AppCompatCallback {
+    method public abstract void onSupportActionModeFinished(android.support.v7.view.ActionMode);
+    method public abstract void onSupportActionModeStarted(android.support.v7.view.ActionMode);
+    method public abstract android.support.v7.view.ActionMode onWindowStartingSupportActionMode(android.support.v7.view.ActionMode.Callback);
+  }
+
+  public abstract class AppCompatDelegate {
+    method public abstract void addContentView(android.view.View, android.view.ViewGroup.LayoutParams);
+    method public abstract boolean applyDayNight();
+    method public static android.support.v7.app.AppCompatDelegate create(android.app.Activity, android.support.v7.app.AppCompatCallback);
+    method public static android.support.v7.app.AppCompatDelegate create(android.app.Dialog, android.support.v7.app.AppCompatCallback);
+    method public abstract android.view.View createView(android.view.View, java.lang.String, android.content.Context, android.util.AttributeSet);
+    method public abstract android.view.View findViewById(int);
+    method public static int getDefaultNightMode();
+    method public abstract android.support.v7.app.ActionBarDrawerToggle.Delegate getDrawerToggleDelegate();
+    method public abstract android.view.MenuInflater getMenuInflater();
+    method public abstract android.support.v7.app.ActionBar getSupportActionBar();
+    method public abstract boolean hasWindowFeature(int);
+    method public abstract void installViewFactory();
+    method public abstract void invalidateOptionsMenu();
+    method public static boolean isCompatVectorFromResourcesEnabled();
+    method public abstract boolean isHandleNativeActionModesEnabled();
+    method public abstract void onConfigurationChanged(android.content.res.Configuration);
+    method public abstract void onCreate(android.os.Bundle);
+    method public abstract void onDestroy();
+    method public abstract void onPostCreate(android.os.Bundle);
+    method public abstract void onPostResume();
+    method public abstract void onSaveInstanceState(android.os.Bundle);
+    method public abstract void onStop();
+    method public abstract boolean requestWindowFeature(int);
+    method public static void setCompatVectorFromResourcesEnabled(boolean);
+    method public abstract void setContentView(android.view.View);
+    method public abstract void setContentView(int);
+    method public abstract void setContentView(android.view.View, android.view.ViewGroup.LayoutParams);
+    method public static void setDefaultNightMode(int);
+    method public abstract void setHandleNativeActionModesEnabled(boolean);
+    method public abstract void setLocalNightMode(int);
+    method public abstract void setSupportActionBar(android.support.v7.widget.Toolbar);
+    method public abstract void setTitle(java.lang.CharSequence);
+    method public abstract android.support.v7.view.ActionMode startSupportActionMode(android.support.v7.view.ActionMode.Callback);
+    field public static final int FEATURE_ACTION_MODE_OVERLAY = 10; // 0xa
+    field public static final int FEATURE_SUPPORT_ACTION_BAR = 108; // 0x6c
+    field public static final int FEATURE_SUPPORT_ACTION_BAR_OVERLAY = 109; // 0x6d
+    field public static final int MODE_NIGHT_AUTO = 0; // 0x0
+    field public static final int MODE_NIGHT_FOLLOW_SYSTEM = -1; // 0xffffffff
+    field public static final int MODE_NIGHT_NO = 1; // 0x1
+    field public static final int MODE_NIGHT_YES = 2; // 0x2
+  }
+
+  public class AppCompatDialog extends android.app.Dialog implements android.support.v7.app.AppCompatCallback {
+    ctor public AppCompatDialog(android.content.Context);
+    ctor public AppCompatDialog(android.content.Context, int);
+    ctor protected AppCompatDialog(android.content.Context, boolean, android.content.DialogInterface.OnCancelListener);
+    method public android.support.v7.app.AppCompatDelegate getDelegate();
+    method public android.support.v7.app.ActionBar getSupportActionBar();
+    method public void onSupportActionModeFinished(android.support.v7.view.ActionMode);
+    method public void onSupportActionModeStarted(android.support.v7.view.ActionMode);
+    method public android.support.v7.view.ActionMode onWindowStartingSupportActionMode(android.support.v7.view.ActionMode.Callback);
+    method public boolean supportRequestWindowFeature(int);
+  }
+
+  public class AppCompatDialogFragment extends android.support.v4.app.DialogFragment {
+    ctor public AppCompatDialogFragment();
+  }
+
+  public class MediaRouteActionProvider extends android.support.v4.view.ActionProvider {
+    ctor public MediaRouteActionProvider(android.content.Context);
+    method public android.support.v7.app.MediaRouteDialogFactory getDialogFactory();
+    method public android.support.v7.app.MediaRouteButton getMediaRouteButton();
+    method public android.support.v7.media.MediaRouteSelector getRouteSelector();
+    method public android.view.View onCreateActionView();
+    method public android.support.v7.app.MediaRouteButton onCreateMediaRouteButton();
+    method public void setDialogFactory(android.support.v7.app.MediaRouteDialogFactory);
+    method public void setRouteSelector(android.support.v7.media.MediaRouteSelector);
+  }
+
+  public class MediaRouteButton extends android.view.View {
+    ctor public MediaRouteButton(android.content.Context);
+    ctor public MediaRouteButton(android.content.Context, android.util.AttributeSet);
+    ctor public MediaRouteButton(android.content.Context, android.util.AttributeSet, int);
+    method public android.support.v7.app.MediaRouteDialogFactory getDialogFactory();
+    method public android.support.v7.media.MediaRouteSelector getRouteSelector();
+    method public void onAttachedToWindow();
+    method public void onDetachedFromWindow();
+    method public void setDialogFactory(android.support.v7.app.MediaRouteDialogFactory);
+    method public void setRemoteIndicatorDrawable(android.graphics.drawable.Drawable);
+    method public void setRouteSelector(android.support.v7.media.MediaRouteSelector);
+    method public boolean showDialog();
+  }
+
+  public class MediaRouteChooserDialog extends android.app.Dialog {
+    ctor public MediaRouteChooserDialog(android.content.Context);
+    ctor public MediaRouteChooserDialog(android.content.Context, int);
+    method public android.support.v7.media.MediaRouteSelector getRouteSelector();
+    method public boolean onFilterRoute(android.support.v7.media.MediaRouter.RouteInfo);
+    method public void onFilterRoutes(java.util.List<android.support.v7.media.MediaRouter.RouteInfo>);
+    method public void refreshRoutes();
+    method public void setRouteSelector(android.support.v7.media.MediaRouteSelector);
+  }
+
+  public class MediaRouteChooserDialogFragment extends android.support.v4.app.DialogFragment {
+    ctor public MediaRouteChooserDialogFragment();
+    method public android.support.v7.media.MediaRouteSelector getRouteSelector();
+    method public android.support.v7.app.MediaRouteChooserDialog onCreateChooserDialog(android.content.Context, android.os.Bundle);
+    method public void setRouteSelector(android.support.v7.media.MediaRouteSelector);
+  }
+
+  public class MediaRouteControllerDialog extends android.support.v7.app.AlertDialog {
+    ctor public MediaRouteControllerDialog(android.content.Context);
+    ctor public MediaRouteControllerDialog(android.content.Context, int);
+    method public android.view.View getMediaControlView();
+    method public android.support.v4.media.session.MediaSessionCompat.Token getMediaSession();
+    method public android.support.v7.media.MediaRouter.RouteInfo getRoute();
+    method public boolean isVolumeControlEnabled();
+    method public android.view.View onCreateMediaControlView(android.os.Bundle);
+    method public void setVolumeControlEnabled(boolean);
+  }
+
+  public class MediaRouteControllerDialogFragment extends android.support.v4.app.DialogFragment {
+    ctor public MediaRouteControllerDialogFragment();
+    method public android.support.v7.app.MediaRouteControllerDialog onCreateControllerDialog(android.content.Context, android.os.Bundle);
+  }
+
+  public class MediaRouteDialogFactory {
+    ctor public MediaRouteDialogFactory();
+    method public static android.support.v7.app.MediaRouteDialogFactory getDefault();
+    method public android.support.v7.app.MediaRouteChooserDialogFragment onCreateChooserDialogFragment();
+    method public android.support.v7.app.MediaRouteControllerDialogFragment onCreateControllerDialogFragment();
+  }
+
+  public class MediaRouteDiscoveryFragment extends android.support.v4.app.Fragment {
+    ctor public MediaRouteDiscoveryFragment();
+    method public android.support.v7.media.MediaRouter getMediaRouter();
+    method public android.support.v7.media.MediaRouteSelector getRouteSelector();
+    method public android.support.v7.media.MediaRouter.Callback onCreateCallback();
+    method public int onPrepareCallbackFlags();
+    method public void setRouteSelector(android.support.v7.media.MediaRouteSelector);
+  }
+
+  public class NotificationCompat extends android.support.v4.app.NotificationCompat {
+    ctor public NotificationCompat();
+  }
+
+  public static class NotificationCompat.Builder extends android.support.v4.app.NotificationCompat.Builder {
+    ctor public NotificationCompat.Builder(android.content.Context);
+  }
+
+  public static class NotificationCompat.MediaStyle extends android.support.v4.app.NotificationCompat.Style {
+    ctor public NotificationCompat.MediaStyle();
+    ctor public NotificationCompat.MediaStyle(android.support.v4.app.NotificationCompat.Builder);
+    method public android.support.v7.app.NotificationCompat.MediaStyle setCancelButtonIntent(android.app.PendingIntent);
+    method public android.support.v7.app.NotificationCompat.MediaStyle setMediaSession(android.support.v4.media.session.MediaSessionCompat.Token);
+    method public android.support.v7.app.NotificationCompat.MediaStyle setShowActionsInCompactView(int...);
+    method public android.support.v7.app.NotificationCompat.MediaStyle setShowCancelButton(boolean);
+  }
+
+}
+
+package android.support.v7.content.res {
+
+  public final class AppCompatResources {
+    method public static android.content.res.ColorStateList getColorStateList(android.content.Context, int);
+  }
+
+}
+
+package android.support.v7.graphics {
+
+  public final class Palette {
+    method public static android.support.v7.graphics.Palette.Builder from(android.graphics.Bitmap);
+    method public static android.support.v7.graphics.Palette from(java.util.List<android.support.v7.graphics.Palette.Swatch>);
+    method public static deprecated android.support.v7.graphics.Palette generate(android.graphics.Bitmap);
+    method public static deprecated android.support.v7.graphics.Palette generate(android.graphics.Bitmap, int);
+    method public static deprecated android.os.AsyncTask<android.graphics.Bitmap, java.lang.Void, android.support.v7.graphics.Palette> generateAsync(android.graphics.Bitmap, android.support.v7.graphics.Palette.PaletteAsyncListener);
+    method public static deprecated android.os.AsyncTask<android.graphics.Bitmap, java.lang.Void, android.support.v7.graphics.Palette> generateAsync(android.graphics.Bitmap, int, android.support.v7.graphics.Palette.PaletteAsyncListener);
+    method public int getColorForTarget(android.support.v7.graphics.Target, int);
+    method public int getDarkMutedColor(int);
+    method public android.support.v7.graphics.Palette.Swatch getDarkMutedSwatch();
+    method public int getDarkVibrantColor(int);
+    method public android.support.v7.graphics.Palette.Swatch getDarkVibrantSwatch();
+    method public int getLightMutedColor(int);
+    method public android.support.v7.graphics.Palette.Swatch getLightMutedSwatch();
+    method public int getLightVibrantColor(int);
+    method public android.support.v7.graphics.Palette.Swatch getLightVibrantSwatch();
+    method public int getMutedColor(int);
+    method public android.support.v7.graphics.Palette.Swatch getMutedSwatch();
+    method public android.support.v7.graphics.Palette.Swatch getSwatchForTarget(android.support.v7.graphics.Target);
+    method public java.util.List<android.support.v7.graphics.Palette.Swatch> getSwatches();
+    method public java.util.List<android.support.v7.graphics.Target> getTargets();
+    method public int getVibrantColor(int);
+    method public android.support.v7.graphics.Palette.Swatch getVibrantSwatch();
+  }
+
+  public static final class Palette.Builder {
+    ctor public Palette.Builder(android.graphics.Bitmap);
+    ctor public Palette.Builder(java.util.List<android.support.v7.graphics.Palette.Swatch>);
+    method public android.support.v7.graphics.Palette.Builder addFilter(android.support.v7.graphics.Palette.Filter);
+    method public android.support.v7.graphics.Palette.Builder addTarget(android.support.v7.graphics.Target);
+    method public android.support.v7.graphics.Palette.Builder clearFilters();
+    method public android.support.v7.graphics.Palette.Builder clearRegion();
+    method public android.support.v7.graphics.Palette.Builder clearTargets();
+    method public android.support.v7.graphics.Palette generate();
+    method public android.os.AsyncTask<android.graphics.Bitmap, java.lang.Void, android.support.v7.graphics.Palette> generate(android.support.v7.graphics.Palette.PaletteAsyncListener);
+    method public android.support.v7.graphics.Palette.Builder maximumColorCount(int);
+    method public android.support.v7.graphics.Palette.Builder resizeBitmapArea(int);
+    method public deprecated android.support.v7.graphics.Palette.Builder resizeBitmapSize(int);
+    method public android.support.v7.graphics.Palette.Builder setRegion(int, int, int, int);
+  }
+
+  public static abstract interface Palette.Filter {
+    method public abstract boolean isAllowed(int, float[]);
+  }
+
+  public static abstract interface Palette.PaletteAsyncListener {
+    method public abstract void onGenerated(android.support.v7.graphics.Palette);
+  }
+
+  public static final class Palette.Swatch {
+    ctor public Palette.Swatch(int, int);
+    method public int getBodyTextColor();
+    method public float[] getHsl();
+    method public int getPopulation();
+    method public int getRgb();
+    method public int getTitleTextColor();
+  }
+
+  public final class Target {
+    method public float getLightnessWeight();
+    method public float getMaximumLightness();
+    method public float getMaximumSaturation();
+    method public float getMinimumLightness();
+    method public float getMinimumSaturation();
+    method public float getPopulationWeight();
+    method public float getSaturationWeight();
+    method public float getTargetLightness();
+    method public float getTargetSaturation();
+    method public boolean isExclusive();
+    field public static final android.support.v7.graphics.Target DARK_MUTED;
+    field public static final android.support.v7.graphics.Target DARK_VIBRANT;
+    field public static final android.support.v7.graphics.Target LIGHT_MUTED;
+    field public static final android.support.v7.graphics.Target LIGHT_VIBRANT;
+    field public static final android.support.v7.graphics.Target MUTED;
+    field public static final android.support.v7.graphics.Target VIBRANT;
+  }
+
+  public static final class Target.Builder {
+    ctor public Target.Builder();
+    ctor public Target.Builder(android.support.v7.graphics.Target);
+    method public android.support.v7.graphics.Target build();
+    method public android.support.v7.graphics.Target.Builder setExclusive(boolean);
+    method public android.support.v7.graphics.Target.Builder setLightnessWeight(float);
+    method public android.support.v7.graphics.Target.Builder setMaximumLightness(float);
+    method public android.support.v7.graphics.Target.Builder setMaximumSaturation(float);
+    method public android.support.v7.graphics.Target.Builder setMinimumLightness(float);
+    method public android.support.v7.graphics.Target.Builder setMinimumSaturation(float);
+    method public android.support.v7.graphics.Target.Builder setPopulationWeight(float);
+    method public android.support.v7.graphics.Target.Builder setSaturationWeight(float);
+    method public android.support.v7.graphics.Target.Builder setTargetLightness(float);
+    method public android.support.v7.graphics.Target.Builder setTargetSaturation(float);
+  }
+
+}
+
+package android.support.v7.graphics.drawable {
+
+  public class DrawerArrowDrawable extends android.graphics.drawable.Drawable {
+    ctor public DrawerArrowDrawable(android.content.Context);
+    method public void draw(android.graphics.Canvas);
+    method public float getArrowHeadLength();
+    method public float getArrowShaftLength();
+    method public float getBarLength();
+    method public float getBarThickness();
+    method public int getColor();
+    method public int getDirection();
+    method public float getGapSize();
+    method public int getOpacity();
+    method public final android.graphics.Paint getPaint();
+    method public float getProgress();
+    method public boolean isSpinEnabled();
+    method public void setAlpha(int);
+    method public void setArrowHeadLength(float);
+    method public void setArrowShaftLength(float);
+    method public void setBarLength(float);
+    method public void setBarThickness(float);
+    method public void setColor(int);
+    method public void setColorFilter(android.graphics.ColorFilter);
+    method public void setDirection(int);
+    method public void setGapSize(float);
+    method public void setProgress(float);
+    method public void setSpinEnabled(boolean);
+    method public void setVerticalMirror(boolean);
+    field public static final int ARROW_DIRECTION_END = 3; // 0x3
+    field public static final int ARROW_DIRECTION_LEFT = 0; // 0x0
+    field public static final int ARROW_DIRECTION_RIGHT = 1; // 0x1
+    field public static final int ARROW_DIRECTION_START = 2; // 0x2
+  }
+
+}
+
+package android.support.v7.media {
+
+  public final class MediaControlIntent {
+    field public static final java.lang.String ACTION_END_SESSION = "android.media.intent.action.END_SESSION";
+    field public static final java.lang.String ACTION_ENQUEUE = "android.media.intent.action.ENQUEUE";
+    field public static final java.lang.String ACTION_GET_SESSION_STATUS = "android.media.intent.action.GET_SESSION_STATUS";
+    field public static final java.lang.String ACTION_GET_STATUS = "android.media.intent.action.GET_STATUS";
+    field public static final java.lang.String ACTION_PAUSE = "android.media.intent.action.PAUSE";
+    field public static final java.lang.String ACTION_PLAY = "android.media.intent.action.PLAY";
+    field public static final java.lang.String ACTION_REMOVE = "android.media.intent.action.REMOVE";
+    field public static final java.lang.String ACTION_RESUME = "android.media.intent.action.RESUME";
+    field public static final java.lang.String ACTION_SEEK = "android.media.intent.action.SEEK";
+    field public static final java.lang.String ACTION_SEND_MESSAGE = "android.media.intent.action.SEND_MESSAGE";
+    field public static final java.lang.String ACTION_START_SESSION = "android.media.intent.action.START_SESSION";
+    field public static final java.lang.String ACTION_STOP = "android.media.intent.action.STOP";
+    field public static final java.lang.String CATEGORY_LIVE_AUDIO = "android.media.intent.category.LIVE_AUDIO";
+    field public static final java.lang.String CATEGORY_LIVE_VIDEO = "android.media.intent.category.LIVE_VIDEO";
+    field public static final java.lang.String CATEGORY_REMOTE_PLAYBACK = "android.media.intent.category.REMOTE_PLAYBACK";
+    field public static final int ERROR_INVALID_ITEM_ID = 3; // 0x3
+    field public static final int ERROR_INVALID_SESSION_ID = 2; // 0x2
+    field public static final int ERROR_UNKNOWN = 0; // 0x0
+    field public static final int ERROR_UNSUPPORTED_OPERATION = 1; // 0x1
+    field public static final java.lang.String EXTRA_ERROR_CODE = "android.media.intent.extra.ERROR_CODE";
+    field public static final java.lang.String EXTRA_ITEM_CONTENT_POSITION = "android.media.intent.extra.ITEM_POSITION";
+    field public static final java.lang.String EXTRA_ITEM_HTTP_HEADERS = "android.media.intent.extra.HTTP_HEADERS";
+    field public static final java.lang.String EXTRA_ITEM_ID = "android.media.intent.extra.ITEM_ID";
+    field public static final java.lang.String EXTRA_ITEM_METADATA = "android.media.intent.extra.ITEM_METADATA";
+    field public static final java.lang.String EXTRA_ITEM_STATUS = "android.media.intent.extra.ITEM_STATUS";
+    field public static final java.lang.String EXTRA_ITEM_STATUS_UPDATE_RECEIVER = "android.media.intent.extra.ITEM_STATUS_UPDATE_RECEIVER";
+    field public static final java.lang.String EXTRA_MESSAGE = "android.media.intent.extra.MESSAGE";
+    field public static final java.lang.String EXTRA_MESSAGE_RECEIVER = "android.media.intent.extra.MESSAGE_RECEIVER";
+    field public static final java.lang.String EXTRA_SESSION_ID = "android.media.intent.extra.SESSION_ID";
+    field public static final java.lang.String EXTRA_SESSION_STATUS = "android.media.intent.extra.SESSION_STATUS";
+    field public static final java.lang.String EXTRA_SESSION_STATUS_UPDATE_RECEIVER = "android.media.intent.extra.SESSION_STATUS_UPDATE_RECEIVER";
+  }
+
+  public final class MediaItemMetadata {
+    field public static final java.lang.String KEY_ALBUM_ARTIST = "android.media.metadata.ALBUM_ARTIST";
+    field public static final java.lang.String KEY_ALBUM_TITLE = "android.media.metadata.ALBUM_TITLE";
+    field public static final java.lang.String KEY_ARTIST = "android.media.metadata.ARTIST";
+    field public static final java.lang.String KEY_ARTWORK_URI = "android.media.metadata.ARTWORK_URI";
+    field public static final java.lang.String KEY_AUTHOR = "android.media.metadata.AUTHOR";
+    field public static final java.lang.String KEY_COMPOSER = "android.media.metadata.COMPOSER";
+    field public static final java.lang.String KEY_DISC_NUMBER = "android.media.metadata.DISC_NUMBER";
+    field public static final java.lang.String KEY_DURATION = "android.media.metadata.DURATION";
+    field public static final java.lang.String KEY_TITLE = "android.media.metadata.TITLE";
+    field public static final java.lang.String KEY_TRACK_NUMBER = "android.media.metadata.TRACK_NUMBER";
+    field public static final java.lang.String KEY_YEAR = "android.media.metadata.YEAR";
+  }
+
+  public final class MediaItemStatus {
+    method public android.os.Bundle asBundle();
+    method public static android.support.v7.media.MediaItemStatus fromBundle(android.os.Bundle);
+    method public long getContentDuration();
+    method public long getContentPosition();
+    method public android.os.Bundle getExtras();
+    method public int getPlaybackState();
+    method public long getTimestamp();
+    field public static final java.lang.String EXTRA_HTTP_RESPONSE_HEADERS = "android.media.status.extra.HTTP_RESPONSE_HEADERS";
+    field public static final java.lang.String EXTRA_HTTP_STATUS_CODE = "android.media.status.extra.HTTP_STATUS_CODE";
+    field public static final int PLAYBACK_STATE_BUFFERING = 3; // 0x3
+    field public static final int PLAYBACK_STATE_CANCELED = 5; // 0x5
+    field public static final int PLAYBACK_STATE_ERROR = 7; // 0x7
+    field public static final int PLAYBACK_STATE_FINISHED = 4; // 0x4
+    field public static final int PLAYBACK_STATE_INVALIDATED = 6; // 0x6
+    field public static final int PLAYBACK_STATE_PAUSED = 2; // 0x2
+    field public static final int PLAYBACK_STATE_PENDING = 0; // 0x0
+    field public static final int PLAYBACK_STATE_PLAYING = 1; // 0x1
+  }
+
+  public static final class MediaItemStatus.Builder {
+    ctor public MediaItemStatus.Builder(int);
+    ctor public MediaItemStatus.Builder(android.support.v7.media.MediaItemStatus);
+    method public android.support.v7.media.MediaItemStatus build();
+    method public android.support.v7.media.MediaItemStatus.Builder setContentDuration(long);
+    method public android.support.v7.media.MediaItemStatus.Builder setContentPosition(long);
+    method public android.support.v7.media.MediaItemStatus.Builder setExtras(android.os.Bundle);
+    method public android.support.v7.media.MediaItemStatus.Builder setPlaybackState(int);
+    method public android.support.v7.media.MediaItemStatus.Builder setTimestamp(long);
+  }
+
+  public final class MediaRouteDescriptor {
+    method public android.os.Bundle asBundle();
+    method public boolean canDisconnectAndKeepPlaying();
+    method public static android.support.v7.media.MediaRouteDescriptor fromBundle(android.os.Bundle);
+    method public int getConnectionState();
+    method public java.util.List<android.content.IntentFilter> getControlFilters();
+    method public java.lang.String getDescription();
+    method public int getDeviceType();
+    method public android.os.Bundle getExtras();
+    method public android.net.Uri getIconUri();
+    method public java.lang.String getId();
+    method public java.lang.String getName();
+    method public int getPlaybackStream();
+    method public int getPlaybackType();
+    method public int getPresentationDisplayId();
+    method public android.content.IntentSender getSettingsActivity();
+    method public int getVolume();
+    method public int getVolumeHandling();
+    method public int getVolumeMax();
+    method public deprecated boolean isConnecting();
+    method public boolean isEnabled();
+    method public boolean isValid();
+  }
+
+  public static final class MediaRouteDescriptor.Builder {
+    ctor public MediaRouteDescriptor.Builder(java.lang.String, java.lang.String);
+    ctor public MediaRouteDescriptor.Builder(android.support.v7.media.MediaRouteDescriptor);
+    method public android.support.v7.media.MediaRouteDescriptor.Builder addControlFilter(android.content.IntentFilter);
+    method public android.support.v7.media.MediaRouteDescriptor.Builder addControlFilters(java.util.Collection<android.content.IntentFilter>);
+    method public android.support.v7.media.MediaRouteDescriptor build();
+    method public android.support.v7.media.MediaRouteDescriptor.Builder setCanDisconnect(boolean);
+    method public deprecated android.support.v7.media.MediaRouteDescriptor.Builder setConnecting(boolean);
+    method public android.support.v7.media.MediaRouteDescriptor.Builder setConnectionState(int);
+    method public android.support.v7.media.MediaRouteDescriptor.Builder setDescription(java.lang.String);
+    method public android.support.v7.media.MediaRouteDescriptor.Builder setDeviceType(int);
+    method public android.support.v7.media.MediaRouteDescriptor.Builder setEnabled(boolean);
+    method public android.support.v7.media.MediaRouteDescriptor.Builder setExtras(android.os.Bundle);
+    method public android.support.v7.media.MediaRouteDescriptor.Builder setIconUri(android.net.Uri);
+    method public android.support.v7.media.MediaRouteDescriptor.Builder setId(java.lang.String);
+    method public android.support.v7.media.MediaRouteDescriptor.Builder setName(java.lang.String);
+    method public android.support.v7.media.MediaRouteDescriptor.Builder setPlaybackStream(int);
+    method public android.support.v7.media.MediaRouteDescriptor.Builder setPlaybackType(int);
+    method public android.support.v7.media.MediaRouteDescriptor.Builder setPresentationDisplayId(int);
+    method public android.support.v7.media.MediaRouteDescriptor.Builder setSettingsActivity(android.content.IntentSender);
+    method public android.support.v7.media.MediaRouteDescriptor.Builder setVolume(int);
+    method public android.support.v7.media.MediaRouteDescriptor.Builder setVolumeHandling(int);
+    method public android.support.v7.media.MediaRouteDescriptor.Builder setVolumeMax(int);
+  }
+
+  public final class MediaRouteDiscoveryRequest {
+    ctor public MediaRouteDiscoveryRequest(android.support.v7.media.MediaRouteSelector, boolean);
+    method public android.os.Bundle asBundle();
+    method public static android.support.v7.media.MediaRouteDiscoveryRequest fromBundle(android.os.Bundle);
+    method public android.support.v7.media.MediaRouteSelector getSelector();
+    method public boolean isActiveScan();
+    method public boolean isValid();
+  }
+
+  public abstract class MediaRouteProvider {
+    ctor public MediaRouteProvider(android.content.Context);
+    method public final android.content.Context getContext();
+    method public final android.support.v7.media.MediaRouteProviderDescriptor getDescriptor();
+    method public final android.support.v7.media.MediaRouteDiscoveryRequest getDiscoveryRequest();
+    method public final android.os.Handler getHandler();
+    method public final android.support.v7.media.MediaRouteProvider.ProviderMetadata getMetadata();
+    method public android.support.v7.media.MediaRouteProvider.RouteController onCreateRouteController(java.lang.String);
+    method public void onDiscoveryRequestChanged(android.support.v7.media.MediaRouteDiscoveryRequest);
+    method public final void setCallback(android.support.v7.media.MediaRouteProvider.Callback);
+    method public final void setDescriptor(android.support.v7.media.MediaRouteProviderDescriptor);
+    method public final void setDiscoveryRequest(android.support.v7.media.MediaRouteDiscoveryRequest);
+  }
+
+  public static abstract class MediaRouteProvider.Callback {
+    ctor public MediaRouteProvider.Callback();
+    method public void onDescriptorChanged(android.support.v7.media.MediaRouteProvider, android.support.v7.media.MediaRouteProviderDescriptor);
+  }
+
+  public static final class MediaRouteProvider.ProviderMetadata {
+    method public android.content.ComponentName getComponentName();
+    method public java.lang.String getPackageName();
+  }
+
+  public static abstract class MediaRouteProvider.RouteController {
+    ctor public MediaRouteProvider.RouteController();
+    method public boolean onControlRequest(android.content.Intent, android.support.v7.media.MediaRouter.ControlRequestCallback);
+    method public void onRelease();
+    method public void onSelect();
+    method public void onSetVolume(int);
+    method public void onUnselect();
+    method public void onUnselect(int);
+    method public void onUpdateVolume(int);
+  }
+
+  public final class MediaRouteProviderDescriptor {
+    method public android.os.Bundle asBundle();
+    method public static android.support.v7.media.MediaRouteProviderDescriptor fromBundle(android.os.Bundle);
+    method public java.util.List<android.support.v7.media.MediaRouteDescriptor> getRoutes();
+    method public boolean isValid();
+  }
+
+  public static final class MediaRouteProviderDescriptor.Builder {
+    ctor public MediaRouteProviderDescriptor.Builder();
+    ctor public MediaRouteProviderDescriptor.Builder(android.support.v7.media.MediaRouteProviderDescriptor);
+    method public android.support.v7.media.MediaRouteProviderDescriptor.Builder addRoute(android.support.v7.media.MediaRouteDescriptor);
+    method public android.support.v7.media.MediaRouteProviderDescriptor.Builder addRoutes(java.util.Collection<android.support.v7.media.MediaRouteDescriptor>);
+    method public android.support.v7.media.MediaRouteProviderDescriptor build();
+  }
+
+  public abstract class MediaRouteProviderService extends android.app.Service {
+    ctor public MediaRouteProviderService();
+    method public android.support.v7.media.MediaRouteProvider getMediaRouteProvider();
+    method public android.os.IBinder onBind(android.content.Intent);
+    method public abstract android.support.v7.media.MediaRouteProvider onCreateMediaRouteProvider();
+    field public static final java.lang.String SERVICE_INTERFACE = "android.media.MediaRouteProviderService";
+  }
+
+  public final class MediaRouteSelector {
+    method public android.os.Bundle asBundle();
+    method public boolean contains(android.support.v7.media.MediaRouteSelector);
+    method public static android.support.v7.media.MediaRouteSelector fromBundle(android.os.Bundle);
+    method public java.util.List<java.lang.String> getControlCategories();
+    method public boolean hasControlCategory(java.lang.String);
+    method public boolean isEmpty();
+    method public boolean isValid();
+    method public boolean matchesControlFilters(java.util.List<android.content.IntentFilter>);
+    field public static final android.support.v7.media.MediaRouteSelector EMPTY;
+  }
+
+  public static final class MediaRouteSelector.Builder {
+    ctor public MediaRouteSelector.Builder();
+    ctor public MediaRouteSelector.Builder(android.support.v7.media.MediaRouteSelector);
+    method public android.support.v7.media.MediaRouteSelector.Builder addControlCategories(java.util.Collection<java.lang.String>);
+    method public android.support.v7.media.MediaRouteSelector.Builder addControlCategory(java.lang.String);
+    method public android.support.v7.media.MediaRouteSelector.Builder addSelector(android.support.v7.media.MediaRouteSelector);
+    method public android.support.v7.media.MediaRouteSelector build();
+  }
+
+  public final class MediaRouter {
+    method public void addCallback(android.support.v7.media.MediaRouteSelector, android.support.v7.media.MediaRouter.Callback);
+    method public void addCallback(android.support.v7.media.MediaRouteSelector, android.support.v7.media.MediaRouter.Callback, int);
+    method public void addProvider(android.support.v7.media.MediaRouteProvider);
+    method public void addRemoteControlClient(java.lang.Object);
+    method public android.support.v7.media.MediaRouter.RouteInfo getDefaultRoute();
+    method public static android.support.v7.media.MediaRouter getInstance(android.content.Context);
+    method public android.support.v4.media.session.MediaSessionCompat.Token getMediaSessionToken();
+    method public java.util.List<android.support.v7.media.MediaRouter.ProviderInfo> getProviders();
+    method public java.util.List<android.support.v7.media.MediaRouter.RouteInfo> getRoutes();
+    method public android.support.v7.media.MediaRouter.RouteInfo getSelectedRoute();
+    method public boolean isRouteAvailable(android.support.v7.media.MediaRouteSelector, int);
+    method public void removeCallback(android.support.v7.media.MediaRouter.Callback);
+    method public void removeProvider(android.support.v7.media.MediaRouteProvider);
+    method public void removeRemoteControlClient(java.lang.Object);
+    method public void selectRoute(android.support.v7.media.MediaRouter.RouteInfo);
+    method public void setMediaSession(java.lang.Object);
+    method public void setMediaSessionCompat(android.support.v4.media.session.MediaSessionCompat);
+    method public void unselect(int);
+    method public android.support.v7.media.MediaRouter.RouteInfo updateSelectedRoute(android.support.v7.media.MediaRouteSelector);
+    field public static final int AVAILABILITY_FLAG_IGNORE_DEFAULT_ROUTE = 1; // 0x1
+    field public static final int AVAILABILITY_FLAG_REQUIRE_MATCH = 2; // 0x2
+    field public static final int CALLBACK_FLAG_FORCE_DISCOVERY = 8; // 0x8
+    field public static final int CALLBACK_FLAG_PERFORM_ACTIVE_SCAN = 1; // 0x1
+    field public static final int CALLBACK_FLAG_REQUEST_DISCOVERY = 4; // 0x4
+    field public static final int CALLBACK_FLAG_UNFILTERED_EVENTS = 2; // 0x2
+    field public static final int UNSELECT_REASON_DISCONNECTED = 1; // 0x1
+    field public static final int UNSELECT_REASON_ROUTE_CHANGED = 3; // 0x3
+    field public static final int UNSELECT_REASON_STOPPED = 2; // 0x2
+    field public static final int UNSELECT_REASON_UNKNOWN = 0; // 0x0
+  }
+
+  public static abstract class MediaRouter.Callback {
+    ctor public MediaRouter.Callback();
+    method public void onProviderAdded(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.ProviderInfo);
+    method public void onProviderChanged(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.ProviderInfo);
+    method public void onProviderRemoved(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.ProviderInfo);
+    method public void onRouteAdded(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
+    method public void onRouteChanged(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
+    method public void onRoutePresentationDisplayChanged(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
+    method public void onRouteRemoved(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
+    method public void onRouteSelected(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
+    method public void onRouteUnselected(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
+    method public void onRouteUnselected(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo, int);
+    method public void onRouteVolumeChanged(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
+  }
+
+  public static abstract class MediaRouter.ControlRequestCallback {
+    ctor public MediaRouter.ControlRequestCallback();
+    method public void onError(java.lang.String, android.os.Bundle);
+    method public void onResult(android.os.Bundle);
+  }
+
+  public static final class MediaRouter.ProviderInfo {
+    method public android.content.ComponentName getComponentName();
+    method public java.lang.String getPackageName();
+    method public android.support.v7.media.MediaRouteProvider getProviderInstance();
+    method public java.util.List<android.support.v7.media.MediaRouter.RouteInfo> getRoutes();
+  }
+
+  public static class MediaRouter.RouteInfo {
+    method public boolean canDisconnect();
+    method public int getConnectionState();
+    method public java.util.List<android.content.IntentFilter> getControlFilters();
+    method public java.lang.String getDescription();
+    method public int getDeviceType();
+    method public android.os.Bundle getExtras();
+    method public android.net.Uri getIconUri();
+    method public java.lang.String getId();
+    method public java.lang.String getName();
+    method public int getPlaybackStream();
+    method public int getPlaybackType();
+    method public android.view.Display getPresentationDisplay();
+    method public android.support.v7.media.MediaRouter.ProviderInfo getProvider();
+    method public android.content.IntentSender getSettingsIntent();
+    method public int getVolume();
+    method public int getVolumeHandling();
+    method public int getVolumeMax();
+    method public boolean isConnecting();
+    method public boolean isDefault();
+    method public boolean isEnabled();
+    method public boolean isSelected();
+    method public boolean matchesSelector(android.support.v7.media.MediaRouteSelector);
+    method public void requestSetVolume(int);
+    method public void requestUpdateVolume(int);
+    method public void select();
+    method public void sendControlRequest(android.content.Intent, android.support.v7.media.MediaRouter.ControlRequestCallback);
+    method public boolean supportsControlAction(java.lang.String, java.lang.String);
+    method public boolean supportsControlCategory(java.lang.String);
+    method public boolean supportsControlRequest(android.content.Intent);
+    field public static final int CONNECTION_STATE_CONNECTED = 2; // 0x2
+    field public static final int CONNECTION_STATE_CONNECTING = 1; // 0x1
+    field public static final int CONNECTION_STATE_DISCONNECTED = 0; // 0x0
+    field public static final int DEVICE_TYPE_SPEAKER = 2; // 0x2
+    field public static final int DEVICE_TYPE_TV = 1; // 0x1
+    field public static final int PLAYBACK_TYPE_LOCAL = 0; // 0x0
+    field public static final int PLAYBACK_TYPE_REMOTE = 1; // 0x1
+    field public static final int PLAYBACK_VOLUME_FIXED = 0; // 0x0
+    field public static final int PLAYBACK_VOLUME_VARIABLE = 1; // 0x1
+  }
+
+  public final class MediaSessionStatus {
+    method public android.os.Bundle asBundle();
+    method public static android.support.v7.media.MediaSessionStatus fromBundle(android.os.Bundle);
+    method public android.os.Bundle getExtras();
+    method public int getSessionState();
+    method public long getTimestamp();
+    method public boolean isQueuePaused();
+    field public static final int SESSION_STATE_ACTIVE = 0; // 0x0
+    field public static final int SESSION_STATE_ENDED = 1; // 0x1
+    field public static final int SESSION_STATE_INVALIDATED = 2; // 0x2
+  }
+
+  public static final class MediaSessionStatus.Builder {
+    ctor public MediaSessionStatus.Builder(int);
+    ctor public MediaSessionStatus.Builder(android.support.v7.media.MediaSessionStatus);
+    method public android.support.v7.media.MediaSessionStatus build();
+    method public android.support.v7.media.MediaSessionStatus.Builder setExtras(android.os.Bundle);
+    method public android.support.v7.media.MediaSessionStatus.Builder setQueuePaused(boolean);
+    method public android.support.v7.media.MediaSessionStatus.Builder setSessionState(int);
+    method public android.support.v7.media.MediaSessionStatus.Builder setTimestamp(long);
+  }
+
+  public class RemotePlaybackClient {
+    ctor public RemotePlaybackClient(android.content.Context, android.support.v7.media.MediaRouter.RouteInfo);
+    method public void endSession(android.os.Bundle, android.support.v7.media.RemotePlaybackClient.SessionActionCallback);
+    method public void enqueue(android.net.Uri, java.lang.String, android.os.Bundle, long, android.os.Bundle, android.support.v7.media.RemotePlaybackClient.ItemActionCallback);
+    method public java.lang.String getSessionId();
+    method public void getSessionStatus(android.os.Bundle, android.support.v7.media.RemotePlaybackClient.SessionActionCallback);
+    method public void getStatus(java.lang.String, android.os.Bundle, android.support.v7.media.RemotePlaybackClient.ItemActionCallback);
+    method public boolean hasSession();
+    method public boolean isMessagingSupported();
+    method public boolean isQueuingSupported();
+    method public boolean isRemotePlaybackSupported();
+    method public boolean isSessionManagementSupported();
+    method public void pause(android.os.Bundle, android.support.v7.media.RemotePlaybackClient.SessionActionCallback);
+    method public void play(android.net.Uri, java.lang.String, android.os.Bundle, long, android.os.Bundle, android.support.v7.media.RemotePlaybackClient.ItemActionCallback);
+    method public void release();
+    method public void remove(java.lang.String, android.os.Bundle, android.support.v7.media.RemotePlaybackClient.ItemActionCallback);
+    method public void resume(android.os.Bundle, android.support.v7.media.RemotePlaybackClient.SessionActionCallback);
+    method public void seek(java.lang.String, long, android.os.Bundle, android.support.v7.media.RemotePlaybackClient.ItemActionCallback);
+    method public void sendMessage(android.os.Bundle, android.support.v7.media.RemotePlaybackClient.SessionActionCallback);
+    method public void setOnMessageReceivedListener(android.support.v7.media.RemotePlaybackClient.OnMessageReceivedListener);
+    method public void setSessionId(java.lang.String);
+    method public void setStatusCallback(android.support.v7.media.RemotePlaybackClient.StatusCallback);
+    method public void startSession(android.os.Bundle, android.support.v7.media.RemotePlaybackClient.SessionActionCallback);
+    method public void stop(android.os.Bundle, android.support.v7.media.RemotePlaybackClient.SessionActionCallback);
+  }
+
+  public static abstract class RemotePlaybackClient.ActionCallback {
+    ctor public RemotePlaybackClient.ActionCallback();
+    method public void onError(java.lang.String, int, android.os.Bundle);
+  }
+
+  public static abstract class RemotePlaybackClient.ItemActionCallback extends android.support.v7.media.RemotePlaybackClient.ActionCallback {
+    ctor public RemotePlaybackClient.ItemActionCallback();
+    method public void onResult(android.os.Bundle, java.lang.String, android.support.v7.media.MediaSessionStatus, java.lang.String, android.support.v7.media.MediaItemStatus);
+  }
+
+  public static abstract interface RemotePlaybackClient.OnMessageReceivedListener {
+    method public abstract void onMessageReceived(java.lang.String, android.os.Bundle);
+  }
+
+  public static abstract class RemotePlaybackClient.SessionActionCallback extends android.support.v7.media.RemotePlaybackClient.ActionCallback {
+    ctor public RemotePlaybackClient.SessionActionCallback();
+    method public void onResult(android.os.Bundle, java.lang.String, android.support.v7.media.MediaSessionStatus);
+  }
+
+  public static abstract class RemotePlaybackClient.StatusCallback {
+    ctor public RemotePlaybackClient.StatusCallback();
+    method public void onItemStatusChanged(android.os.Bundle, java.lang.String, android.support.v7.media.MediaSessionStatus, java.lang.String, android.support.v7.media.MediaItemStatus);
+    method public void onSessionChanged(java.lang.String);
+    method public void onSessionStatusChanged(android.os.Bundle, java.lang.String, android.support.v7.media.MediaSessionStatus);
+  }
+
+}
+
+package android.support.v7.preference {
+
+  public class AndroidResources {
+    ctor public AndroidResources();
+    field public static final int ANDROID_R_EDITTEXT_PREFERENCE_STYLE = 16842898; // 0x1010092
+    field public static final int ANDROID_R_ICON_FRAME = 16908350; // 0x102003e
+    field public static final int ANDROID_R_LIST_CONTAINER = 16908351; // 0x102003f
+    field public static final int ANDROID_R_PREFERENCE_FRAGMENT_STYLE = 16844038; // 0x1010506
+    field public static final int ANDROID_R_SWITCH_WIDGET = 16908352; // 0x1020040
+  }
+
+  public class CheckBoxPreference extends android.support.v7.preference.TwoStatePreference {
+    ctor public CheckBoxPreference(android.content.Context, android.util.AttributeSet, int);
+    ctor public CheckBoxPreference(android.content.Context, android.util.AttributeSet, int, int);
+    ctor public CheckBoxPreference(android.content.Context, android.util.AttributeSet);
+    ctor public CheckBoxPreference(android.content.Context);
+  }
+
+  public abstract class DialogPreference extends android.support.v7.preference.Preference {
+    ctor public DialogPreference(android.content.Context, android.util.AttributeSet, int, int);
+    ctor public DialogPreference(android.content.Context, android.util.AttributeSet, int);
+    ctor public DialogPreference(android.content.Context, android.util.AttributeSet);
+    ctor public DialogPreference(android.content.Context);
+    method public android.graphics.drawable.Drawable getDialogIcon();
+    method public int getDialogLayoutResource();
+    method public java.lang.CharSequence getDialogMessage();
+    method public java.lang.CharSequence getDialogTitle();
+    method public java.lang.CharSequence getNegativeButtonText();
+    method public java.lang.CharSequence getPositiveButtonText();
+    method public void setDialogIcon(android.graphics.drawable.Drawable);
+    method public void setDialogIcon(int);
+    method public void setDialogLayoutResource(int);
+    method public void setDialogMessage(java.lang.CharSequence);
+    method public void setDialogMessage(int);
+    method public void setDialogTitle(java.lang.CharSequence);
+    method public void setDialogTitle(int);
+    method public void setNegativeButtonText(java.lang.CharSequence);
+    method public void setNegativeButtonText(int);
+    method public void setPositiveButtonText(java.lang.CharSequence);
+    method public void setPositiveButtonText(int);
+  }
+
+  public static abstract interface DialogPreference.TargetFragment {
+    method public abstract android.support.v7.preference.Preference findPreference(java.lang.CharSequence);
+  }
+
+  public class DropDownPreference extends android.support.v7.preference.ListPreference {
+    ctor public DropDownPreference(android.content.Context);
+    ctor public DropDownPreference(android.content.Context, android.util.AttributeSet);
+    ctor public DropDownPreference(android.content.Context, android.util.AttributeSet, int);
+    ctor public DropDownPreference(android.content.Context, android.util.AttributeSet, int, int);
+    method protected android.widget.ArrayAdapter createAdapter();
+  }
+
+  public class EditTextPreference extends android.support.v7.preference.DialogPreference {
+    ctor public EditTextPreference(android.content.Context, android.util.AttributeSet, int, int);
+    ctor public EditTextPreference(android.content.Context, android.util.AttributeSet, int);
+    ctor public EditTextPreference(android.content.Context, android.util.AttributeSet);
+    ctor public EditTextPreference(android.content.Context);
+    method public java.lang.String getText();
+    method public void setText(java.lang.String);
+  }
+
+  public class EditTextPreferenceDialogFragmentCompat extends android.support.v7.preference.PreferenceDialogFragmentCompat {
+    ctor public EditTextPreferenceDialogFragmentCompat();
+    method public static android.support.v7.preference.EditTextPreferenceDialogFragmentCompat newInstance(java.lang.String);
+    method public void onDialogClosed(boolean);
+  }
+
+  public class ListPreference extends android.support.v7.preference.DialogPreference {
+    ctor public ListPreference(android.content.Context, android.util.AttributeSet, int, int);
+    ctor public ListPreference(android.content.Context, android.util.AttributeSet, int);
+    ctor public ListPreference(android.content.Context, android.util.AttributeSet);
+    ctor public ListPreference(android.content.Context);
+    method public int findIndexOfValue(java.lang.String);
+    method public java.lang.CharSequence[] getEntries();
+    method public java.lang.CharSequence getEntry();
+    method public java.lang.CharSequence[] getEntryValues();
+    method public java.lang.String getValue();
+    method public void setEntries(java.lang.CharSequence[]);
+    method public void setEntries(int);
+    method public void setEntryValues(java.lang.CharSequence[]);
+    method public void setEntryValues(int);
+    method public void setValue(java.lang.String);
+    method public void setValueIndex(int);
+  }
+
+  public class ListPreferenceDialogFragmentCompat extends android.support.v7.preference.PreferenceDialogFragmentCompat {
+    ctor public ListPreferenceDialogFragmentCompat();
+    method public static android.support.v7.preference.ListPreferenceDialogFragmentCompat newInstance(java.lang.String);
+    method public void onDialogClosed(boolean);
+  }
+
+  public class Preference implements java.lang.Comparable {
+    ctor public Preference(android.content.Context, android.util.AttributeSet, int, int);
+    ctor public Preference(android.content.Context, android.util.AttributeSet, int);
+    ctor public Preference(android.content.Context, android.util.AttributeSet);
+    ctor public Preference(android.content.Context);
+    method public boolean callChangeListener(java.lang.Object);
+    method public int compareTo(android.support.v7.preference.Preference);
+    method protected android.support.v7.preference.Preference findPreferenceInHierarchy(java.lang.String);
+    method public android.content.Context getContext();
+    method public java.lang.String getDependency();
+    method public android.os.Bundle getExtras();
+    method public java.lang.String getFragment();
+    method public android.graphics.drawable.Drawable getIcon();
+    method public android.content.Intent getIntent();
+    method public java.lang.String getKey();
+    method public final int getLayoutResource();
+    method public android.support.v7.preference.Preference.OnPreferenceChangeListener getOnPreferenceChangeListener();
+    method public android.support.v7.preference.Preference.OnPreferenceClickListener getOnPreferenceClickListener();
+    method public int getOrder();
+    method protected boolean getPersistedBoolean(boolean);
+    method protected float getPersistedFloat(float);
+    method protected int getPersistedInt(int);
+    method protected long getPersistedLong(long);
+    method protected java.lang.String getPersistedString(java.lang.String);
+    method public android.support.v7.preference.PreferenceManager getPreferenceManager();
+    method public android.content.SharedPreferences getSharedPreferences();
+    method public boolean getShouldDisableView();
+    method public java.lang.CharSequence getSummary();
+    method public java.lang.CharSequence getTitle();
+    method public final int getWidgetLayoutResource();
+    method public boolean hasKey();
+    method public boolean isEnabled();
+    method public boolean isPersistent();
+    method public boolean isSelectable();
+    method public final boolean isVisible();
+    method protected void notifyChanged();
+    method public void notifyDependencyChange(boolean);
+    method protected void notifyHierarchyChanged();
+    method public void onAttached();
+    method protected void onAttachedToHierarchy(android.support.v7.preference.PreferenceManager);
+    method public void onBindViewHolder(android.support.v7.preference.PreferenceViewHolder);
+    method protected void onClick();
+    method public void onDependencyChanged(android.support.v7.preference.Preference, boolean);
+    method public void onDetached();
+    method protected java.lang.Object onGetDefaultValue(android.content.res.TypedArray, int);
+    method public void onInitializeAccessibilityNodeInfo(android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
+    method public void onParentChanged(android.support.v7.preference.Preference, boolean);
+    method protected void onPrepareForRemoval();
+    method protected void onRestoreInstanceState(android.os.Parcelable);
+    method protected android.os.Parcelable onSaveInstanceState();
+    method protected void onSetInitialValue(boolean, java.lang.Object);
+    method public android.os.Bundle peekExtras();
+    method protected boolean persistBoolean(boolean);
+    method protected boolean persistFloat(float);
+    method protected boolean persistInt(int);
+    method protected boolean persistLong(long);
+    method protected boolean persistString(java.lang.String);
+    method public void restoreHierarchyState(android.os.Bundle);
+    method public void saveHierarchyState(android.os.Bundle);
+    method public void setDefaultValue(java.lang.Object);
+    method public void setDependency(java.lang.String);
+    method public void setEnabled(boolean);
+    method public void setFragment(java.lang.String);
+    method public void setIcon(android.graphics.drawable.Drawable);
+    method public void setIcon(int);
+    method public void setIntent(android.content.Intent);
+    method public void setKey(java.lang.String);
+    method public void setLayoutResource(int);
+    method public void setOnPreferenceChangeListener(android.support.v7.preference.Preference.OnPreferenceChangeListener);
+    method public void setOnPreferenceClickListener(android.support.v7.preference.Preference.OnPreferenceClickListener);
+    method public void setOrder(int);
+    method public void setPersistent(boolean);
+    method public void setSelectable(boolean);
+    method public void setShouldDisableView(boolean);
+    method public void setSummary(java.lang.CharSequence);
+    method public void setSummary(int);
+    method public void setTitle(java.lang.CharSequence);
+    method public void setTitle(int);
+    method public void setViewId(int);
+    method public final void setVisible(boolean);
+    method public void setWidgetLayoutResource(int);
+    method public boolean shouldDisableDependents();
+    method protected boolean shouldPersist();
+    field public static final int DEFAULT_ORDER = 2147483647; // 0x7fffffff
+  }
+
+  public static class Preference.BaseSavedState extends android.view.AbsSavedState {
+    ctor public Preference.BaseSavedState(android.os.Parcel);
+    ctor public Preference.BaseSavedState(android.os.Parcelable);
+    field public static final android.os.Parcelable.Creator<android.support.v7.preference.Preference.BaseSavedState> CREATOR;
+  }
+
+  public static abstract interface Preference.OnPreferenceChangeListener {
+    method public abstract boolean onPreferenceChange(android.support.v7.preference.Preference, java.lang.Object);
+  }
+
+  public static abstract interface Preference.OnPreferenceClickListener {
+    method public abstract boolean onPreferenceClick(android.support.v7.preference.Preference);
+  }
+
+  public class PreferenceCategory extends android.support.v7.preference.PreferenceGroup {
+    ctor public PreferenceCategory(android.content.Context, android.util.AttributeSet, int, int);
+    ctor public PreferenceCategory(android.content.Context, android.util.AttributeSet, int);
+    ctor public PreferenceCategory(android.content.Context, android.util.AttributeSet);
+    ctor public PreferenceCategory(android.content.Context);
+  }
+
+  public abstract class PreferenceDialogFragmentCompat extends android.support.v4.app.DialogFragment implements android.content.DialogInterface.OnClickListener {
+    ctor public PreferenceDialogFragmentCompat();
+    method public android.support.v7.preference.DialogPreference getPreference();
+    method protected void onBindDialogView(android.view.View);
+    method public void onClick(android.content.DialogInterface, int);
+    method protected android.view.View onCreateDialogView(android.content.Context);
+    method public abstract void onDialogClosed(boolean);
+    method protected void onPrepareDialogBuilder(android.support.v7.app.AlertDialog.Builder);
+    field protected static final java.lang.String ARG_KEY = "key";
+  }
+
+  public abstract class PreferenceFragmentCompat extends android.support.v4.app.Fragment implements android.support.v7.preference.DialogPreference.TargetFragment android.support.v7.preference.PreferenceManager.OnDisplayPreferenceDialogListener android.support.v7.preference.PreferenceManager.OnNavigateToScreenListener android.support.v7.preference.PreferenceManager.OnPreferenceTreeClickListener {
+    ctor public PreferenceFragmentCompat();
+    method public void addPreferencesFromResource(int);
+    method public android.support.v7.preference.Preference findPreference(java.lang.CharSequence);
+    method public final android.support.v7.widget.RecyclerView getListView();
+    method public android.support.v7.preference.PreferenceManager getPreferenceManager();
+    method public android.support.v7.preference.PreferenceScreen getPreferenceScreen();
+    method protected android.support.v7.widget.RecyclerView.Adapter onCreateAdapter(android.support.v7.preference.PreferenceScreen);
+    method public android.support.v7.widget.RecyclerView.LayoutManager onCreateLayoutManager();
+    method public abstract void onCreatePreferences(android.os.Bundle, java.lang.String);
+    method public android.support.v7.widget.RecyclerView onCreateRecyclerView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
+    method public void onDisplayPreferenceDialog(android.support.v7.preference.Preference);
+    method public void onNavigateToScreen(android.support.v7.preference.PreferenceScreen);
+    method public boolean onPreferenceTreeClick(android.support.v7.preference.Preference);
+    method public void scrollToPreference(java.lang.String);
+    method public void scrollToPreference(android.support.v7.preference.Preference);
+    method public void setDivider(android.graphics.drawable.Drawable);
+    method public void setDividerHeight(int);
+    method public void setPreferenceScreen(android.support.v7.preference.PreferenceScreen);
+    method public void setPreferencesFromResource(int, java.lang.String);
+    field public static final java.lang.String ARG_PREFERENCE_ROOT = "android.support.v7.preference.PreferenceFragmentCompat.PREFERENCE_ROOT";
+  }
+
+  public static abstract interface PreferenceFragmentCompat.OnPreferenceDisplayDialogCallback {
+    method public abstract boolean onPreferenceDisplayDialog(android.support.v7.preference.PreferenceFragmentCompat, android.support.v7.preference.Preference);
+  }
+
+  public static abstract interface PreferenceFragmentCompat.OnPreferenceStartFragmentCallback {
+    method public abstract boolean onPreferenceStartFragment(android.support.v7.preference.PreferenceFragmentCompat, android.support.v7.preference.Preference);
+  }
+
+  public static abstract interface PreferenceFragmentCompat.OnPreferenceStartScreenCallback {
+    method public abstract boolean onPreferenceStartScreen(android.support.v7.preference.PreferenceFragmentCompat, android.support.v7.preference.PreferenceScreen);
+  }
+
+  public abstract class PreferenceGroup extends android.support.v7.preference.Preference {
+    ctor public PreferenceGroup(android.content.Context, android.util.AttributeSet, int, int);
+    ctor public PreferenceGroup(android.content.Context, android.util.AttributeSet, int);
+    ctor public PreferenceGroup(android.content.Context, android.util.AttributeSet);
+    method public void addItemFromInflater(android.support.v7.preference.Preference);
+    method public boolean addPreference(android.support.v7.preference.Preference);
+    method protected void dispatchRestoreInstanceState(android.os.Bundle);
+    method protected void dispatchSaveInstanceState(android.os.Bundle);
+    method public android.support.v7.preference.Preference findPreference(java.lang.CharSequence);
+    method public android.support.v7.preference.Preference getPreference(int);
+    method public int getPreferenceCount();
+    method protected boolean isOnSameScreenAsChildren();
+    method public boolean isOrderingAsAdded();
+    method protected boolean onPrepareAddPreference(android.support.v7.preference.Preference);
+    method public void removeAll();
+    method public boolean removePreference(android.support.v7.preference.Preference);
+    method public void setOrderingAsAdded(boolean);
+  }
+
+  public static abstract interface PreferenceGroup.PreferencePositionCallback {
+    method public abstract int getPreferenceAdapterPosition(java.lang.String);
+    method public abstract int getPreferenceAdapterPosition(android.support.v7.preference.Preference);
+  }
+
+  public class PreferenceManager {
+    method public android.support.v7.preference.PreferenceScreen createPreferenceScreen(android.content.Context);
+    method public android.support.v7.preference.Preference findPreference(java.lang.CharSequence);
+    method public android.content.Context getContext();
+    method public static android.content.SharedPreferences getDefaultSharedPreferences(android.content.Context);
+    method public android.support.v7.preference.PreferenceManager.OnDisplayPreferenceDialogListener getOnDisplayPreferenceDialogListener();
+    method public android.support.v7.preference.PreferenceManager.OnNavigateToScreenListener getOnNavigateToScreenListener();
+    method public android.support.v7.preference.PreferenceManager.OnPreferenceTreeClickListener getOnPreferenceTreeClickListener();
+    method public android.support.v7.preference.PreferenceScreen getPreferenceScreen();
+    method public android.content.SharedPreferences getSharedPreferences();
+    method public int getSharedPreferencesMode();
+    method public java.lang.String getSharedPreferencesName();
+    method public boolean isStorageDefault();
+    method public boolean isStorageDeviceProtected();
+    method public static void setDefaultValues(android.content.Context, int, boolean);
+    method public static void setDefaultValues(android.content.Context, java.lang.String, int, int, boolean);
+    method public void setOnDisplayPreferenceDialogListener(android.support.v7.preference.PreferenceManager.OnDisplayPreferenceDialogListener);
+    method public void setOnNavigateToScreenListener(android.support.v7.preference.PreferenceManager.OnNavigateToScreenListener);
+    method public void setOnPreferenceTreeClickListener(android.support.v7.preference.PreferenceManager.OnPreferenceTreeClickListener);
+    method public boolean setPreferences(android.support.v7.preference.PreferenceScreen);
+    method public void setSharedPreferencesMode(int);
+    method public void setSharedPreferencesName(java.lang.String);
+    method public void setStorageDefault();
+    method public void setStorageDeviceProtected();
+    method public void showDialog(android.support.v7.preference.Preference);
+    field public static final java.lang.String KEY_HAS_SET_DEFAULT_VALUES = "_has_set_default_values";
+  }
+
+  public static abstract interface PreferenceManager.OnDisplayPreferenceDialogListener {
+    method public abstract void onDisplayPreferenceDialog(android.support.v7.preference.Preference);
+  }
+
+  public static abstract interface PreferenceManager.OnNavigateToScreenListener {
+    method public abstract void onNavigateToScreen(android.support.v7.preference.PreferenceScreen);
+  }
+
+  public static abstract interface PreferenceManager.OnPreferenceTreeClickListener {
+    method public abstract boolean onPreferenceTreeClick(android.support.v7.preference.Preference);
+  }
+
+  public final class PreferenceScreen extends android.support.v7.preference.PreferenceGroup {
+    method public void setShouldUseGeneratedIds(boolean);
+    method public boolean shouldUseGeneratedIds();
+  }
+
+  public class PreferenceViewHolder extends android.support.v7.widget.RecyclerView.ViewHolder {
+    method public android.view.View findViewById(int);
+    method public boolean isDividerAllowedAbove();
+    method public boolean isDividerAllowedBelow();
+    method public void setDividerAllowedAbove(boolean);
+    method public void setDividerAllowedBelow(boolean);
+  }
+
+  public class SwitchPreferenceCompat extends android.support.v7.preference.TwoStatePreference {
+    ctor public SwitchPreferenceCompat(android.content.Context, android.util.AttributeSet, int, int);
+    ctor public SwitchPreferenceCompat(android.content.Context, android.util.AttributeSet, int);
+    ctor public SwitchPreferenceCompat(android.content.Context, android.util.AttributeSet);
+    ctor public SwitchPreferenceCompat(android.content.Context);
+    method public java.lang.CharSequence getSwitchTextOff();
+    method public java.lang.CharSequence getSwitchTextOn();
+    method public void setSwitchTextOff(java.lang.CharSequence);
+    method public void setSwitchTextOff(int);
+    method public void setSwitchTextOn(java.lang.CharSequence);
+    method public void setSwitchTextOn(int);
+  }
+
+  public abstract class TwoStatePreference extends android.support.v7.preference.Preference {
+    ctor public TwoStatePreference(android.content.Context, android.util.AttributeSet, int, int);
+    ctor public TwoStatePreference(android.content.Context, android.util.AttributeSet, int);
+    ctor public TwoStatePreference(android.content.Context, android.util.AttributeSet);
+    ctor public TwoStatePreference(android.content.Context);
+    method public boolean getDisableDependentsState();
+    method public java.lang.CharSequence getSummaryOff();
+    method public java.lang.CharSequence getSummaryOn();
+    method public boolean isChecked();
+    method public void setChecked(boolean);
+    method public void setDisableDependentsState(boolean);
+    method public void setSummaryOff(java.lang.CharSequence);
+    method public void setSummaryOff(int);
+    method public void setSummaryOn(java.lang.CharSequence);
+    method public void setSummaryOn(int);
+    method protected void syncSummaryView(android.support.v7.preference.PreferenceViewHolder);
+    field protected boolean mChecked;
+  }
+
+}
+
+package android.support.v7.util {
+
+  public class AsyncListUtil {
+    ctor public AsyncListUtil(java.lang.Class<T>, int, android.support.v7.util.AsyncListUtil.DataCallback<T>, android.support.v7.util.AsyncListUtil.ViewCallback);
+    method public T getItem(int);
+    method public int getItemCount();
+    method public void onRangeChanged();
+    method public void refresh();
+  }
+
+  public static abstract class AsyncListUtil.DataCallback {
+    ctor public AsyncListUtil.DataCallback();
+    method public abstract void fillData(T[], int, int);
+    method public int getMaxCachedTiles();
+    method public void recycleData(T[], int);
+    method public abstract int refreshData();
+  }
+
+  public static abstract class AsyncListUtil.ViewCallback {
+    ctor public AsyncListUtil.ViewCallback();
+    method public void extendRangeInto(int[], int[], int);
+    method public abstract void getItemRangeInto(int[]);
+    method public abstract void onDataRefresh();
+    method public abstract void onItemLoaded(int);
+    field public static final int HINT_SCROLL_ASC = 2; // 0x2
+    field public static final int HINT_SCROLL_DESC = 1; // 0x1
+    field public static final int HINT_SCROLL_NONE = 0; // 0x0
+  }
+
+  public class SortedList {
+    ctor public SortedList(java.lang.Class<T>, android.support.v7.util.SortedList.Callback<T>);
+    ctor public SortedList(java.lang.Class<T>, android.support.v7.util.SortedList.Callback<T>, int);
+    method public int add(T);
+    method public void addAll(T[], boolean);
+    method public void addAll(T...);
+    method public void addAll(java.util.Collection<T>);
+    method public void beginBatchedUpdates();
+    method public void clear();
+    method public void endBatchedUpdates();
+    method public T get(int) throws java.lang.IndexOutOfBoundsException;
+    method public int indexOf(T);
+    method public void recalculatePositionOfItemAt(int);
+    method public boolean remove(T);
+    method public T removeItemAt(int);
+    method public int size();
+    method public void updateItemAt(int, T);
+    field public static final int INVALID_POSITION = -1; // 0xffffffff
+  }
+
+  public static class SortedList.BatchedCallback extends android.support.v7.util.SortedList.Callback {
+    ctor public SortedList.BatchedCallback(android.support.v7.util.SortedList.Callback<T2>);
+    method public boolean areContentsTheSame(T2, T2);
+    method public boolean areItemsTheSame(T2, T2);
+    method public int compare(T2, T2);
+    method public void dispatchLastEvent();
+    method public void onChanged(int, int);
+    method public void onInserted(int, int);
+    method public void onMoved(int, int);
+    method public void onRemoved(int, int);
+  }
+
+  public static abstract class SortedList.Callback implements java.util.Comparator {
+    ctor public SortedList.Callback();
+    method public abstract boolean areContentsTheSame(T2, T2);
+    method public abstract boolean areItemsTheSame(T2, T2);
+    method public abstract int compare(T2, T2);
+    method public abstract void onChanged(int, int);
+    method public abstract void onInserted(int, int);
+    method public abstract void onMoved(int, int);
+    method public abstract void onRemoved(int, int);
+  }
+
+}
+
+package android.support.v7.view {
+
+  public abstract class ActionMode {
+    ctor public ActionMode();
+    method public abstract void finish();
+    method public abstract android.view.View getCustomView();
+    method public abstract android.view.Menu getMenu();
+    method public abstract android.view.MenuInflater getMenuInflater();
+    method public abstract java.lang.CharSequence getSubtitle();
+    method public java.lang.Object getTag();
+    method public abstract java.lang.CharSequence getTitle();
+    method public boolean getTitleOptionalHint();
+    method public abstract void invalidate();
+    method public boolean isTitleOptional();
+    method public abstract void setCustomView(android.view.View);
+    method public abstract void setSubtitle(java.lang.CharSequence);
+    method public abstract void setSubtitle(int);
+    method public void setTag(java.lang.Object);
+    method public abstract void setTitle(java.lang.CharSequence);
+    method public abstract void setTitle(int);
+    method public void setTitleOptionalHint(boolean);
+  }
+
+  public static abstract interface ActionMode.Callback {
+    method public abstract boolean onActionItemClicked(android.support.v7.view.ActionMode, android.view.MenuItem);
+    method public abstract boolean onCreateActionMode(android.support.v7.view.ActionMode, android.view.Menu);
+    method public abstract void onDestroyActionMode(android.support.v7.view.ActionMode);
+    method public abstract boolean onPrepareActionMode(android.support.v7.view.ActionMode, android.view.Menu);
+  }
+
+  public abstract interface CollapsibleActionView {
+    method public abstract void onActionViewCollapsed();
+    method public abstract void onActionViewExpanded();
+  }
+
+}
+
+package android.support.v7.widget {
+
+  public class ActionMenuView extends android.support.v7.widget.LinearLayoutCompat {
+    ctor public ActionMenuView(android.content.Context);
+    ctor public ActionMenuView(android.content.Context, android.util.AttributeSet);
+    method public void dismissPopupMenus();
+    method public android.view.Menu getMenu();
+    method public android.graphics.drawable.Drawable getOverflowIcon();
+    method public int getPopupTheme();
+    method public boolean hideOverflowMenu();
+    method public boolean isOverflowMenuShowing();
+    method public void onConfigurationChanged(android.content.res.Configuration);
+    method public void onDetachedFromWindow();
+    method public void setOnMenuItemClickListener(android.support.v7.widget.ActionMenuView.OnMenuItemClickListener);
+    method public void setOverflowIcon(android.graphics.drawable.Drawable);
+    method public void setPopupTheme(int);
+    method public boolean showOverflowMenu();
+  }
+
+  public static class ActionMenuView.LayoutParams extends android.support.v7.widget.LinearLayoutCompat.LayoutParams {
+    ctor public ActionMenuView.LayoutParams(android.content.Context, android.util.AttributeSet);
+    ctor public ActionMenuView.LayoutParams(android.view.ViewGroup.LayoutParams);
+    ctor public ActionMenuView.LayoutParams(android.support.v7.widget.ActionMenuView.LayoutParams);
+    ctor public ActionMenuView.LayoutParams(int, int);
+    field public int cellsUsed;
+    field public boolean expandable;
+    field public int extraPixels;
+    field public boolean isOverflowButton;
+    field public boolean preventEdgeOffset;
+  }
+
+  public static abstract interface ActionMenuView.OnMenuItemClickListener {
+    method public abstract boolean onMenuItemClick(android.view.MenuItem);
+  }
+
+  public class AppCompatAutoCompleteTextView extends android.widget.AutoCompleteTextView implements android.support.v4.view.TintableBackgroundView {
+    ctor public AppCompatAutoCompleteTextView(android.content.Context);
+    ctor public AppCompatAutoCompleteTextView(android.content.Context, android.util.AttributeSet);
+    ctor public AppCompatAutoCompleteTextView(android.content.Context, android.util.AttributeSet, int);
+  }
+
+  public class AppCompatButton extends android.widget.Button implements android.support.v4.view.TintableBackgroundView {
+    ctor public AppCompatButton(android.content.Context);
+    ctor public AppCompatButton(android.content.Context, android.util.AttributeSet);
+    ctor public AppCompatButton(android.content.Context, android.util.AttributeSet, int);
+    method public void setSupportAllCaps(boolean);
+  }
+
+  public class AppCompatCheckBox extends android.widget.CheckBox implements android.support.v4.widget.TintableCompoundButton {
+    ctor public AppCompatCheckBox(android.content.Context);
+    ctor public AppCompatCheckBox(android.content.Context, android.util.AttributeSet);
+    ctor public AppCompatCheckBox(android.content.Context, android.util.AttributeSet, int);
+  }
+
+  public class AppCompatCheckedTextView extends android.widget.CheckedTextView {
+    ctor public AppCompatCheckedTextView(android.content.Context);
+    ctor public AppCompatCheckedTextView(android.content.Context, android.util.AttributeSet);
+    ctor public AppCompatCheckedTextView(android.content.Context, android.util.AttributeSet, int);
+  }
+
+  public class AppCompatEditText extends android.widget.EditText implements android.support.v4.view.TintableBackgroundView {
+    ctor public AppCompatEditText(android.content.Context);
+    ctor public AppCompatEditText(android.content.Context, android.util.AttributeSet);
+    ctor public AppCompatEditText(android.content.Context, android.util.AttributeSet, int);
+  }
+
+  public class AppCompatImageButton extends android.widget.ImageButton implements android.support.v4.view.TintableBackgroundView {
+    ctor public AppCompatImageButton(android.content.Context);
+    ctor public AppCompatImageButton(android.content.Context, android.util.AttributeSet);
+    ctor public AppCompatImageButton(android.content.Context, android.util.AttributeSet, int);
+  }
+
+  public class AppCompatImageView extends android.widget.ImageView implements android.support.v4.view.TintableBackgroundView {
+    ctor public AppCompatImageView(android.content.Context);
+    ctor public AppCompatImageView(android.content.Context, android.util.AttributeSet);
+    ctor public AppCompatImageView(android.content.Context, android.util.AttributeSet, int);
+  }
+
+  public class AppCompatMultiAutoCompleteTextView extends android.widget.MultiAutoCompleteTextView implements android.support.v4.view.TintableBackgroundView {
+    ctor public AppCompatMultiAutoCompleteTextView(android.content.Context);
+    ctor public AppCompatMultiAutoCompleteTextView(android.content.Context, android.util.AttributeSet);
+    ctor public AppCompatMultiAutoCompleteTextView(android.content.Context, android.util.AttributeSet, int);
+  }
+
+  public class AppCompatRadioButton extends android.widget.RadioButton implements android.support.v4.widget.TintableCompoundButton {
+    ctor public AppCompatRadioButton(android.content.Context);
+    ctor public AppCompatRadioButton(android.content.Context, android.util.AttributeSet);
+    ctor public AppCompatRadioButton(android.content.Context, android.util.AttributeSet, int);
+  }
+
+  public class AppCompatRatingBar extends android.widget.RatingBar {
+    ctor public AppCompatRatingBar(android.content.Context);
+    ctor public AppCompatRatingBar(android.content.Context, android.util.AttributeSet);
+    ctor public AppCompatRatingBar(android.content.Context, android.util.AttributeSet, int);
+  }
+
+  public class AppCompatSeekBar extends android.widget.SeekBar {
+    ctor public AppCompatSeekBar(android.content.Context);
+    ctor public AppCompatSeekBar(android.content.Context, android.util.AttributeSet);
+    ctor public AppCompatSeekBar(android.content.Context, android.util.AttributeSet, int);
+  }
+
+  public class AppCompatSpinner extends android.widget.Spinner implements android.support.v4.view.TintableBackgroundView {
+    ctor public AppCompatSpinner(android.content.Context);
+    ctor public AppCompatSpinner(android.content.Context, int);
+    ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet);
+    ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet, int);
+    ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet, int, int);
+    ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet, int, int, android.content.res.Resources.Theme);
+  }
+
+  public class AppCompatTextView extends android.widget.TextView implements android.support.v4.view.TintableBackgroundView {
+    ctor public AppCompatTextView(android.content.Context);
+    ctor public AppCompatTextView(android.content.Context, android.util.AttributeSet);
+    ctor public AppCompatTextView(android.content.Context, android.util.AttributeSet, int);
+  }
+
+  public class CardView extends android.widget.FrameLayout {
+    ctor public CardView(android.content.Context);
+    ctor public CardView(android.content.Context, android.util.AttributeSet);
+    ctor public CardView(android.content.Context, android.util.AttributeSet, int);
+    method public android.content.res.ColorStateList getCardBackgroundColor();
+    method public float getCardElevation();
+    method public int getContentPaddingBottom();
+    method public int getContentPaddingLeft();
+    method public int getContentPaddingRight();
+    method public int getContentPaddingTop();
+    method public float getMaxCardElevation();
+    method public boolean getPreventCornerOverlap();
+    method public float getRadius();
+    method public boolean getUseCompatPadding();
+    method public void setCardBackgroundColor(int);
+    method public void setCardBackgroundColor(android.content.res.ColorStateList);
+    method public void setCardElevation(float);
+    method public void setContentPadding(int, int, int, int);
+    method public void setMaxCardElevation(float);
+    method public void setPreventCornerOverlap(boolean);
+    method public void setRadius(float);
+    method public void setUseCompatPadding(boolean);
+  }
+
+  public class DefaultItemAnimator extends android.support.v7.widget.SimpleItemAnimator {
+    ctor public DefaultItemAnimator();
+    method public boolean animateAdd(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public boolean animateChange(android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ViewHolder, int, int, int, int);
+    method public boolean animateMove(android.support.v7.widget.RecyclerView.ViewHolder, int, int, int, int);
+    method public boolean animateRemove(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public void endAnimation(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public void endAnimations();
+    method public boolean isRunning();
+    method public void runPendingAnimations();
+  }
+
+  public class GridLayout extends android.view.ViewGroup {
+    ctor public GridLayout(android.content.Context, android.util.AttributeSet, int);
+    ctor public GridLayout(android.content.Context, android.util.AttributeSet);
+    ctor public GridLayout(android.content.Context);
+    method public int getAlignmentMode();
+    method public int getColumnCount();
+    method public int getOrientation();
+    method public android.util.Printer getPrinter();
+    method public int getRowCount();
+    method public boolean getUseDefaultMargins();
+    method public boolean isColumnOrderPreserved();
+    method public boolean isRowOrderPreserved();
+    method protected void onLayout(boolean, int, int, int, int);
+    method public void setAlignmentMode(int);
+    method public void setColumnCount(int);
+    method public void setColumnOrderPreserved(boolean);
+    method public void setOrientation(int);
+    method public void setPrinter(android.util.Printer);
+    method public void setRowCount(int);
+    method public void setRowOrderPreserved(boolean);
+    method public void setUseDefaultMargins(boolean);
+    method public static android.support.v7.widget.GridLayout.Spec spec(int, int, android.support.v7.widget.GridLayout.Alignment, float);
+    method public static android.support.v7.widget.GridLayout.Spec spec(int, android.support.v7.widget.GridLayout.Alignment, float);
+    method public static android.support.v7.widget.GridLayout.Spec spec(int, int, float);
+    method public static android.support.v7.widget.GridLayout.Spec spec(int, float);
+    method public static android.support.v7.widget.GridLayout.Spec spec(int, int, android.support.v7.widget.GridLayout.Alignment);
+    method public static android.support.v7.widget.GridLayout.Spec spec(int, android.support.v7.widget.GridLayout.Alignment);
+    method public static android.support.v7.widget.GridLayout.Spec spec(int, int);
+    method public static android.support.v7.widget.GridLayout.Spec spec(int);
+    field public static final int ALIGN_BOUNDS = 0; // 0x0
+    field public static final int ALIGN_MARGINS = 1; // 0x1
+    field public static final android.support.v7.widget.GridLayout.Alignment BASELINE;
+    field public static final android.support.v7.widget.GridLayout.Alignment BOTTOM;
+    field public static final android.support.v7.widget.GridLayout.Alignment CENTER;
+    field public static final android.support.v7.widget.GridLayout.Alignment END;
+    field public static final android.support.v7.widget.GridLayout.Alignment FILL;
+    field public static final int HORIZONTAL = 0; // 0x0
+    field public static final android.support.v7.widget.GridLayout.Alignment LEFT;
+    field public static final android.support.v7.widget.GridLayout.Alignment RIGHT;
+    field public static final android.support.v7.widget.GridLayout.Alignment START;
+    field public static final android.support.v7.widget.GridLayout.Alignment TOP;
+    field public static final int UNDEFINED = -2147483648; // 0x80000000
+    field public static final int VERTICAL = 1; // 0x1
+  }
+
+  public static abstract class GridLayout.Alignment {
+  }
+
+  public static class GridLayout.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
+    ctor public GridLayout.LayoutParams(android.support.v7.widget.GridLayout.Spec, android.support.v7.widget.GridLayout.Spec);
+    ctor public GridLayout.LayoutParams();
+    ctor public GridLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
+    ctor public GridLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
+    ctor public GridLayout.LayoutParams(android.support.v7.widget.GridLayout.LayoutParams);
+    ctor public GridLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
+    method public void setGravity(int);
+    field public android.support.v7.widget.GridLayout.Spec columnSpec;
+    field public android.support.v7.widget.GridLayout.Spec rowSpec;
+  }
+
+  public static class GridLayout.Spec {
+    method public android.support.v7.widget.GridLayout.Alignment getAbsoluteAlignment(boolean);
+  }
+
+  public class GridLayoutManager extends android.support.v7.widget.LinearLayoutManager {
+    ctor public GridLayoutManager(android.content.Context, android.util.AttributeSet, int, int);
+    ctor public GridLayoutManager(android.content.Context, int);
+    ctor public GridLayoutManager(android.content.Context, int, int, boolean);
+    method public int getSpanCount();
+    method public android.support.v7.widget.GridLayoutManager.SpanSizeLookup getSpanSizeLookup();
+    method public void setSpanCount(int);
+    method public void setSpanSizeLookup(android.support.v7.widget.GridLayoutManager.SpanSizeLookup);
+    field public static final int DEFAULT_SPAN_COUNT = -1; // 0xffffffff
+  }
+
+  public static final class GridLayoutManager.DefaultSpanSizeLookup extends android.support.v7.widget.GridLayoutManager.SpanSizeLookup {
+    ctor public GridLayoutManager.DefaultSpanSizeLookup();
+    method public int getSpanSize(int);
+  }
+
+  public static class GridLayoutManager.LayoutParams extends android.support.v7.widget.RecyclerView.LayoutParams {
+    ctor public GridLayoutManager.LayoutParams(android.content.Context, android.util.AttributeSet);
+    ctor public GridLayoutManager.LayoutParams(int, int);
+    ctor public GridLayoutManager.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
+    ctor public GridLayoutManager.LayoutParams(android.view.ViewGroup.LayoutParams);
+    ctor public GridLayoutManager.LayoutParams(android.support.v7.widget.RecyclerView.LayoutParams);
+    method public int getSpanIndex();
+    method public int getSpanSize();
+    field public static final int INVALID_SPAN_ID = -1; // 0xffffffff
+  }
+
+  public static abstract class GridLayoutManager.SpanSizeLookup {
+    ctor public GridLayoutManager.SpanSizeLookup();
+    method public int getSpanGroupIndex(int, int);
+    method public int getSpanIndex(int, int);
+    method public abstract int getSpanSize(int);
+    method public void invalidateSpanIndexCache();
+    method public boolean isSpanIndexCacheEnabled();
+    method public void setSpanIndexCacheEnabled(boolean);
+  }
+
+  public class LinearLayoutCompat extends android.view.ViewGroup {
+    ctor public LinearLayoutCompat(android.content.Context);
+    ctor public LinearLayoutCompat(android.content.Context, android.util.AttributeSet);
+    ctor public LinearLayoutCompat(android.content.Context, android.util.AttributeSet, int);
+    method public int getBaselineAlignedChildIndex();
+    method public android.graphics.drawable.Drawable getDividerDrawable();
+    method public int getDividerPadding();
+    method public int getOrientation();
+    method public int getShowDividers();
+    method public float getWeightSum();
+    method public boolean isBaselineAligned();
+    method public boolean isMeasureWithLargestChildEnabled();
+    method protected void onLayout(boolean, int, int, int, int);
+    method public void setBaselineAligned(boolean);
+    method public void setBaselineAlignedChildIndex(int);
+    method public void setDividerDrawable(android.graphics.drawable.Drawable);
+    method public void setDividerPadding(int);
+    method public void setGravity(int);
+    method public void setHorizontalGravity(int);
+    method public void setMeasureWithLargestChildEnabled(boolean);
+    method public void setOrientation(int);
+    method public void setShowDividers(int);
+    method public void setVerticalGravity(int);
+    method public void setWeightSum(float);
+    field public static final int HORIZONTAL = 0; // 0x0
+    field public static final int SHOW_DIVIDER_BEGINNING = 1; // 0x1
+    field public static final int SHOW_DIVIDER_END = 4; // 0x4
+    field public static final int SHOW_DIVIDER_MIDDLE = 2; // 0x2
+    field public static final int SHOW_DIVIDER_NONE = 0; // 0x0
+    field public static final int VERTICAL = 1; // 0x1
+  }
+
+  public static class LinearLayoutCompat.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
+    ctor public LinearLayoutCompat.LayoutParams(android.content.Context, android.util.AttributeSet);
+    ctor public LinearLayoutCompat.LayoutParams(int, int);
+    ctor public LinearLayoutCompat.LayoutParams(int, int, float);
+    ctor public LinearLayoutCompat.LayoutParams(android.view.ViewGroup.LayoutParams);
+    ctor public LinearLayoutCompat.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
+    ctor public LinearLayoutCompat.LayoutParams(android.support.v7.widget.LinearLayoutCompat.LayoutParams);
+    field public int gravity;
+    field public float weight;
+  }
+
+  public class LinearLayoutManager extends android.support.v7.widget.RecyclerView.LayoutManager implements android.support.v7.widget.helper.ItemTouchHelper.ViewDropHandler {
+    ctor public LinearLayoutManager(android.content.Context);
+    ctor public LinearLayoutManager(android.content.Context, int, boolean);
+    ctor public LinearLayoutManager(android.content.Context, android.util.AttributeSet, int, int);
+    method public android.graphics.PointF computeScrollVectorForPosition(int);
+    method public int findFirstCompletelyVisibleItemPosition();
+    method public int findFirstVisibleItemPosition();
+    method public int findLastCompletelyVisibleItemPosition();
+    method public int findLastVisibleItemPosition();
+    method public android.support.v7.widget.RecyclerView.LayoutParams generateDefaultLayoutParams();
+    method protected int getExtraLayoutSpace(android.support.v7.widget.RecyclerView.State);
+    method public int getOrientation();
+    method public boolean getRecycleChildrenOnDetach();
+    method public boolean getReverseLayout();
+    method public boolean getStackFromEnd();
+    method protected boolean isLayoutRTL();
+    method public boolean isSmoothScrollbarEnabled();
+    method public void scrollToPositionWithOffset(int, int);
+    method public void setOrientation(int);
+    method public void setRecycleChildrenOnDetach(boolean);
+    method public void setReverseLayout(boolean);
+    method public void setSmoothScrollbarEnabled(boolean);
+    method public void setStackFromEnd(boolean);
+    field public static final int HORIZONTAL = 0; // 0x0
+    field public static final int INVALID_OFFSET = -2147483648; // 0x80000000
+    field public static final int VERTICAL = 1; // 0x1
+  }
+
+  protected static class LinearLayoutManager.LayoutChunkResult {
+    ctor protected LinearLayoutManager.LayoutChunkResult();
+    field public int mConsumed;
+    field public boolean mFinished;
+    field public boolean mFocusable;
+    field public boolean mIgnoreConsumed;
+  }
+
+  public abstract class LinearSmoothScroller extends android.support.v7.widget.RecyclerView.SmoothScroller {
+    ctor public LinearSmoothScroller(android.content.Context);
+    method public int calculateDtToFit(int, int, int, int, int);
+    method public int calculateDxToMakeVisible(android.view.View, int);
+    method public int calculateDyToMakeVisible(android.view.View, int);
+    method protected float calculateSpeedPerPixel(android.util.DisplayMetrics);
+    method protected int calculateTimeForDeceleration(int);
+    method protected int calculateTimeForScrolling(int);
+    method public abstract android.graphics.PointF computeScrollVectorForPosition(int);
+    method protected int getHorizontalSnapPreference();
+    method protected int getVerticalSnapPreference();
+    method protected void onSeekTargetStep(int, int, android.support.v7.widget.RecyclerView.State, android.support.v7.widget.RecyclerView.SmoothScroller.Action);
+    method protected void onStart();
+    method protected void onStop();
+    method protected void onTargetFound(android.view.View, android.support.v7.widget.RecyclerView.State, android.support.v7.widget.RecyclerView.SmoothScroller.Action);
+    method protected void updateActionForInterimTarget(android.support.v7.widget.RecyclerView.SmoothScroller.Action);
+    field public static final int SNAP_TO_ANY = 0; // 0x0
+    field public static final int SNAP_TO_END = 1; // 0x1
+    field public static final int SNAP_TO_START = -1; // 0xffffffff
+    field protected final android.view.animation.DecelerateInterpolator mDecelerateInterpolator;
+    field protected int mInterimTargetDx;
+    field protected int mInterimTargetDy;
+    field protected final android.view.animation.LinearInterpolator mLinearInterpolator;
+    field protected android.graphics.PointF mTargetVector;
+  }
+
+  public class ListPopupWindow {
+    ctor public ListPopupWindow(android.content.Context);
+    ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet);
+    ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet, int);
+    ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet, int, int);
+    method public void clearListSelection();
+    method public android.view.View.OnTouchListener createDragToOpenListener(android.view.View);
+    method public void dismiss();
+    method public android.view.View getAnchorView();
+    method public int getAnimationStyle();
+    method public android.graphics.drawable.Drawable getBackground();
+    method public int getHeight();
+    method public int getHorizontalOffset();
+    method public int getInputMethodMode();
+    method public android.widget.ListView getListView();
+    method public int getPromptPosition();
+    method public java.lang.Object getSelectedItem();
+    method public long getSelectedItemId();
+    method public int getSelectedItemPosition();
+    method public android.view.View getSelectedView();
+    method public int getSoftInputMode();
+    method public int getVerticalOffset();
+    method public int getWidth();
+    method public boolean isInputMethodNotNeeded();
+    method public boolean isModal();
+    method public boolean isShowing();
+    method public boolean onKeyDown(int, android.view.KeyEvent);
+    method public boolean onKeyPreIme(int, android.view.KeyEvent);
+    method public boolean onKeyUp(int, android.view.KeyEvent);
+    method public boolean performItemClick(int);
+    method public void postShow();
+    method public void setAdapter(android.widget.ListAdapter);
+    method public void setAnchorView(android.view.View);
+    method public void setAnimationStyle(int);
+    method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
+    method public void setContentWidth(int);
+    method public void setDropDownGravity(int);
+    method public void setHeight(int);
+    method public void setHorizontalOffset(int);
+    method public void setInputMethodMode(int);
+    method public void setListSelector(android.graphics.drawable.Drawable);
+    method public void setModal(boolean);
+    method public void setOnDismissListener(android.widget.PopupWindow.OnDismissListener);
+    method public void setOnItemClickListener(android.widget.AdapterView.OnItemClickListener);
+    method public void setOnItemSelectedListener(android.widget.AdapterView.OnItemSelectedListener);
+    method public void setPromptPosition(int);
+    method public void setPromptView(android.view.View);
+    method public void setSelection(int);
+    method public void setSoftInputMode(int);
+    method public void setVerticalOffset(int);
+    method public void setWidth(int);
+    method public void setWindowLayoutType(int);
+    method public void show();
+    field public static final int INPUT_METHOD_FROM_FOCUSABLE = 0; // 0x0
+    field public static final int INPUT_METHOD_NEEDED = 1; // 0x1
+    field public static final int INPUT_METHOD_NOT_NEEDED = 2; // 0x2
+    field public static final int MATCH_PARENT = -1; // 0xffffffff
+    field public static final int POSITION_PROMPT_ABOVE = 0; // 0x0
+    field public static final int POSITION_PROMPT_BELOW = 1; // 0x1
+    field public static final int WRAP_CONTENT = -2; // 0xfffffffe
+  }
+
+  public abstract class OrientationHelper {
+    method public static android.support.v7.widget.OrientationHelper createHorizontalHelper(android.support.v7.widget.RecyclerView.LayoutManager);
+    method public static android.support.v7.widget.OrientationHelper createOrientationHelper(android.support.v7.widget.RecyclerView.LayoutManager, int);
+    method public static android.support.v7.widget.OrientationHelper createVerticalHelper(android.support.v7.widget.RecyclerView.LayoutManager);
+    method public abstract int getDecoratedEnd(android.view.View);
+    method public abstract int getDecoratedMeasurement(android.view.View);
+    method public abstract int getDecoratedMeasurementInOther(android.view.View);
+    method public abstract int getDecoratedStart(android.view.View);
+    method public abstract int getEnd();
+    method public abstract int getEndAfterPadding();
+    method public abstract int getEndPadding();
+    method public abstract int getMode();
+    method public abstract int getModeInOther();
+    method public abstract int getStartAfterPadding();
+    method public abstract int getTotalSpace();
+    method public int getTotalSpaceChange();
+    method public abstract int getTransformedEndWithDecoration(android.view.View);
+    method public abstract int getTransformedStartWithDecoration(android.view.View);
+    method public abstract void offsetChild(android.view.View, int);
+    method public abstract void offsetChildren(int);
+    method public void onLayoutComplete();
+    field public static final int HORIZONTAL = 0; // 0x0
+    field public static final int VERTICAL = 1; // 0x1
+    field protected final android.support.v7.widget.RecyclerView.LayoutManager mLayoutManager;
+  }
+
+  public class PopupMenu {
+    ctor public PopupMenu(android.content.Context, android.view.View);
+    ctor public PopupMenu(android.content.Context, android.view.View, int);
+    ctor public PopupMenu(android.content.Context, android.view.View, int, int, int);
+    method public void dismiss();
+    method public android.view.View.OnTouchListener getDragToOpenListener();
+    method public int getGravity();
+    method public android.view.Menu getMenu();
+    method public android.view.MenuInflater getMenuInflater();
+    method public void inflate(int);
+    method public void setGravity(int);
+    method public void setOnDismissListener(android.support.v7.widget.PopupMenu.OnDismissListener);
+    method public void setOnMenuItemClickListener(android.support.v7.widget.PopupMenu.OnMenuItemClickListener);
+    method public void show();
+  }
+
+  public static abstract interface PopupMenu.OnDismissListener {
+    method public abstract void onDismiss(android.support.v7.widget.PopupMenu);
+  }
+
+  public static abstract interface PopupMenu.OnMenuItemClickListener {
+    method public abstract boolean onMenuItemClick(android.view.MenuItem);
+  }
+
+  public class RecyclerView extends android.view.ViewGroup implements android.support.v4.view.NestedScrollingChild android.support.v4.view.ScrollingView {
+    ctor public RecyclerView(android.content.Context);
+    ctor public RecyclerView(android.content.Context, android.util.AttributeSet);
+    ctor public RecyclerView(android.content.Context, android.util.AttributeSet, int);
+    method public void addItemDecoration(android.support.v7.widget.RecyclerView.ItemDecoration, int);
+    method public void addItemDecoration(android.support.v7.widget.RecyclerView.ItemDecoration);
+    method public void addOnChildAttachStateChangeListener(android.support.v7.widget.RecyclerView.OnChildAttachStateChangeListener);
+    method public void addOnItemTouchListener(android.support.v7.widget.RecyclerView.OnItemTouchListener);
+    method public void addOnScrollListener(android.support.v7.widget.RecyclerView.OnScrollListener);
+    method public void clearOnChildAttachStateChangeListeners();
+    method public void clearOnScrollListeners();
+    method public int computeHorizontalScrollExtent();
+    method public int computeHorizontalScrollOffset();
+    method public int computeHorizontalScrollRange();
+    method public int computeVerticalScrollExtent();
+    method public int computeVerticalScrollOffset();
+    method public int computeVerticalScrollRange();
+    method public boolean drawChild(android.graphics.Canvas, android.view.View, long);
+    method public android.view.View findChildViewUnder(float, float);
+    method public android.view.View findContainingItemView(android.view.View);
+    method public android.support.v7.widget.RecyclerView.ViewHolder findContainingViewHolder(android.view.View);
+    method public android.support.v7.widget.RecyclerView.ViewHolder findViewHolderForAdapterPosition(int);
+    method public android.support.v7.widget.RecyclerView.ViewHolder findViewHolderForItemId(long);
+    method public android.support.v7.widget.RecyclerView.ViewHolder findViewHolderForLayoutPosition(int);
+    method public deprecated android.support.v7.widget.RecyclerView.ViewHolder findViewHolderForPosition(int);
+    method public boolean fling(int, int);
+    method public android.support.v7.widget.RecyclerView.Adapter getAdapter();
+    method public int getChildAdapterPosition(android.view.View);
+    method public long getChildItemId(android.view.View);
+    method public int getChildLayoutPosition(android.view.View);
+    method public deprecated int getChildPosition(android.view.View);
+    method public android.support.v7.widget.RecyclerView.ViewHolder getChildViewHolder(android.view.View);
+    method public android.support.v7.widget.RecyclerViewAccessibilityDelegate getCompatAccessibilityDelegate();
+    method public android.support.v7.widget.RecyclerView.ItemAnimator getItemAnimator();
+    method public android.support.v7.widget.RecyclerView.LayoutManager getLayoutManager();
+    method public int getMaxFlingVelocity();
+    method public int getMinFlingVelocity();
+    method public boolean getPreserveFocusAfterLayout();
+    method public android.support.v7.widget.RecyclerView.RecycledViewPool getRecycledViewPool();
+    method public int getScrollState();
+    method public boolean hasFixedSize();
+    method public boolean hasPendingAdapterUpdates();
+    method public void invalidateItemDecorations();
+    method public boolean isAnimating();
+    method public boolean isComputingLayout();
+    method public boolean isLayoutFrozen();
+    method public void offsetChildrenHorizontal(int);
+    method public void offsetChildrenVertical(int);
+    method public void onChildAttachedToWindow(android.view.View);
+    method public void onChildDetachedFromWindow(android.view.View);
+    method public void onDraw(android.graphics.Canvas);
+    method protected void onLayout(boolean, int, int, int, int);
+    method public void onScrollStateChanged(int);
+    method public void onScrolled(int, int);
+    method public void removeItemDecoration(android.support.v7.widget.RecyclerView.ItemDecoration);
+    method public void removeOnChildAttachStateChangeListener(android.support.v7.widget.RecyclerView.OnChildAttachStateChangeListener);
+    method public void removeOnItemTouchListener(android.support.v7.widget.RecyclerView.OnItemTouchListener);
+    method public void removeOnScrollListener(android.support.v7.widget.RecyclerView.OnScrollListener);
+    method public void scrollToPosition(int);
+    method public void setAccessibilityDelegateCompat(android.support.v7.widget.RecyclerViewAccessibilityDelegate);
+    method public void setAdapter(android.support.v7.widget.RecyclerView.Adapter);
+    method public void setChildDrawingOrderCallback(android.support.v7.widget.RecyclerView.ChildDrawingOrderCallback);
+    method public void setHasFixedSize(boolean);
+    method public void setItemAnimator(android.support.v7.widget.RecyclerView.ItemAnimator);
+    method public void setItemViewCacheSize(int);
+    method public void setLayoutFrozen(boolean);
+    method public void setLayoutManager(android.support.v7.widget.RecyclerView.LayoutManager);
+    method public deprecated void setOnScrollListener(android.support.v7.widget.RecyclerView.OnScrollListener);
+    method public void setPreserveFocusAfterLayout(boolean);
+    method public void setRecycledViewPool(android.support.v7.widget.RecyclerView.RecycledViewPool);
+    method public void setRecyclerListener(android.support.v7.widget.RecyclerView.RecyclerListener);
+    method public void setScrollingTouchSlop(int);
+    method public void setViewCacheExtension(android.support.v7.widget.RecyclerView.ViewCacheExtension);
+    method public void smoothScrollBy(int, int);
+    method public void smoothScrollToPosition(int);
+    method public void stopScroll();
+    method public void swapAdapter(android.support.v7.widget.RecyclerView.Adapter, boolean);
+    field public static final int HORIZONTAL = 0; // 0x0
+    field public static final int INVALID_TYPE = -1; // 0xffffffff
+    field public static final long NO_ID = -1L; // 0xffffffffffffffffL
+    field public static final int NO_POSITION = -1; // 0xffffffff
+    field public static final int SCROLL_STATE_DRAGGING = 1; // 0x1
+    field public static final int SCROLL_STATE_IDLE = 0; // 0x0
+    field public static final int SCROLL_STATE_SETTLING = 2; // 0x2
+    field public static final int TOUCH_SLOP_DEFAULT = 0; // 0x0
+    field public static final int TOUCH_SLOP_PAGING = 1; // 0x1
+    field public static final int VERTICAL = 1; // 0x1
+  }
+
+  public static abstract class RecyclerView.Adapter {
+    ctor public RecyclerView.Adapter();
+    method public final void bindViewHolder(VH, int);
+    method public final VH createViewHolder(android.view.ViewGroup, int);
+    method public abstract int getItemCount();
+    method public long getItemId(int);
+    method public int getItemViewType(int);
+    method public final boolean hasObservers();
+    method public final boolean hasStableIds();
+    method public final void notifyDataSetChanged();
+    method public final void notifyItemChanged(int);
+    method public final void notifyItemChanged(int, java.lang.Object);
+    method public final void notifyItemInserted(int);
+    method public final void notifyItemMoved(int, int);
+    method public final void notifyItemRangeChanged(int, int);
+    method public final void notifyItemRangeChanged(int, int, java.lang.Object);
+    method public final void notifyItemRangeInserted(int, int);
+    method public final void notifyItemRangeRemoved(int, int);
+    method public final void notifyItemRemoved(int);
+    method public void onAttachedToRecyclerView(android.support.v7.widget.RecyclerView);
+    method public abstract void onBindViewHolder(VH, int);
+    method public void onBindViewHolder(VH, int, java.util.List<java.lang.Object>);
+    method public abstract VH onCreateViewHolder(android.view.ViewGroup, int);
+    method public void onDetachedFromRecyclerView(android.support.v7.widget.RecyclerView);
+    method public boolean onFailedToRecycleView(VH);
+    method public void onViewAttachedToWindow(VH);
+    method public void onViewDetachedFromWindow(VH);
+    method public void onViewRecycled(VH);
+    method public void registerAdapterDataObserver(android.support.v7.widget.RecyclerView.AdapterDataObserver);
+    method public void setHasStableIds(boolean);
+    method public void unregisterAdapterDataObserver(android.support.v7.widget.RecyclerView.AdapterDataObserver);
+  }
+
+  public static abstract class RecyclerView.AdapterDataObserver {
+    ctor public RecyclerView.AdapterDataObserver();
+    method public void onChanged();
+    method public void onItemRangeChanged(int, int);
+    method public void onItemRangeChanged(int, int, java.lang.Object);
+    method public void onItemRangeInserted(int, int);
+    method public void onItemRangeMoved(int, int, int);
+    method public void onItemRangeRemoved(int, int);
+  }
+
+  public static abstract interface RecyclerView.ChildDrawingOrderCallback {
+    method public abstract int onGetChildDrawingOrder(int, int);
+  }
+
+  public static abstract class RecyclerView.ItemAnimator {
+    ctor public RecyclerView.ItemAnimator();
+    method public abstract boolean animateAppearance(android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
+    method public abstract boolean animateChange(android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
+    method public abstract boolean animateDisappearance(android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
+    method public abstract boolean animatePersistence(android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
+    method public boolean canReuseUpdatedViewHolder(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public boolean canReuseUpdatedViewHolder(android.support.v7.widget.RecyclerView.ViewHolder, java.util.List<java.lang.Object>);
+    method public final void dispatchAnimationFinished(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public final void dispatchAnimationStarted(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public final void dispatchAnimationsFinished();
+    method public abstract void endAnimation(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public abstract void endAnimations();
+    method public long getAddDuration();
+    method public long getChangeDuration();
+    method public long getMoveDuration();
+    method public long getRemoveDuration();
+    method public abstract boolean isRunning();
+    method public final boolean isRunning(android.support.v7.widget.RecyclerView.ItemAnimator.ItemAnimatorFinishedListener);
+    method public android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo obtainHolderInfo();
+    method public void onAnimationFinished(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public void onAnimationStarted(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo recordPostLayoutInformation(android.support.v7.widget.RecyclerView.State, android.support.v7.widget.RecyclerView.ViewHolder);
+    method public android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo recordPreLayoutInformation(android.support.v7.widget.RecyclerView.State, android.support.v7.widget.RecyclerView.ViewHolder, int, java.util.List<java.lang.Object>);
+    method public abstract void runPendingAnimations();
+    method public void setAddDuration(long);
+    method public void setChangeDuration(long);
+    method public void setMoveDuration(long);
+    method public void setRemoveDuration(long);
+    field public static final int FLAG_APPEARED_IN_PRE_LAYOUT = 4096; // 0x1000
+    field public static final int FLAG_CHANGED = 2; // 0x2
+    field public static final int FLAG_INVALIDATED = 4; // 0x4
+    field public static final int FLAG_MOVED = 2048; // 0x800
+    field public static final int FLAG_REMOVED = 8; // 0x8
+  }
+
+  public static abstract class RecyclerView.ItemAnimator.AdapterChanges implements java.lang.annotation.Annotation {
+  }
+
+  public static abstract interface RecyclerView.ItemAnimator.ItemAnimatorFinishedListener {
+    method public abstract void onAnimationsFinished();
+  }
+
+  public static class RecyclerView.ItemAnimator.ItemHolderInfo {
+    ctor public RecyclerView.ItemAnimator.ItemHolderInfo();
+    method public android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo setFrom(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo setFrom(android.support.v7.widget.RecyclerView.ViewHolder, int);
+    field public int bottom;
+    field public int changeFlags;
+    field public int left;
+    field public int right;
+    field public int top;
+  }
+
+  public static abstract class RecyclerView.ItemDecoration {
+    ctor public RecyclerView.ItemDecoration();
+    method public deprecated void getItemOffsets(android.graphics.Rect, int, android.support.v7.widget.RecyclerView);
+    method public void getItemOffsets(android.graphics.Rect, android.view.View, android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.State);
+    method public void onDraw(android.graphics.Canvas, android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.State);
+    method public deprecated void onDraw(android.graphics.Canvas, android.support.v7.widget.RecyclerView);
+    method public void onDrawOver(android.graphics.Canvas, android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.State);
+    method public deprecated void onDrawOver(android.graphics.Canvas, android.support.v7.widget.RecyclerView);
+  }
+
+  public static abstract class RecyclerView.LayoutManager {
+    ctor public RecyclerView.LayoutManager();
+    method public void addDisappearingView(android.view.View);
+    method public void addDisappearingView(android.view.View, int);
+    method public void addView(android.view.View);
+    method public void addView(android.view.View, int);
+    method public void assertInLayoutOrScroll(java.lang.String);
+    method public void assertNotInLayoutOrScroll(java.lang.String);
+    method public void attachView(android.view.View, int, android.support.v7.widget.RecyclerView.LayoutParams);
+    method public void attachView(android.view.View, int);
+    method public void attachView(android.view.View);
+    method public void calculateItemDecorationsForChild(android.view.View, android.graphics.Rect);
+    method public boolean canScrollHorizontally();
+    method public boolean canScrollVertically();
+    method public boolean checkLayoutParams(android.support.v7.widget.RecyclerView.LayoutParams);
+    method public static int chooseSize(int, int, int);
+    method public int computeHorizontalScrollExtent(android.support.v7.widget.RecyclerView.State);
+    method public int computeHorizontalScrollOffset(android.support.v7.widget.RecyclerView.State);
+    method public int computeHorizontalScrollRange(android.support.v7.widget.RecyclerView.State);
+    method public int computeVerticalScrollExtent(android.support.v7.widget.RecyclerView.State);
+    method public int computeVerticalScrollOffset(android.support.v7.widget.RecyclerView.State);
+    method public int computeVerticalScrollRange(android.support.v7.widget.RecyclerView.State);
+    method public void detachAndScrapAttachedViews(android.support.v7.widget.RecyclerView.Recycler);
+    method public void detachAndScrapView(android.view.View, android.support.v7.widget.RecyclerView.Recycler);
+    method public void detachAndScrapViewAt(int, android.support.v7.widget.RecyclerView.Recycler);
+    method public void detachView(android.view.View);
+    method public void detachViewAt(int);
+    method public void endAnimation(android.view.View);
+    method public android.view.View findContainingItemView(android.view.View);
+    method public android.view.View findViewByPosition(int);
+    method public abstract android.support.v7.widget.RecyclerView.LayoutParams generateDefaultLayoutParams();
+    method public android.support.v7.widget.RecyclerView.LayoutParams generateLayoutParams(android.view.ViewGroup.LayoutParams);
+    method public android.support.v7.widget.RecyclerView.LayoutParams generateLayoutParams(android.content.Context, android.util.AttributeSet);
+    method public int getBaseline();
+    method public int getBottomDecorationHeight(android.view.View);
+    method public android.view.View getChildAt(int);
+    method public int getChildCount();
+    method public static deprecated int getChildMeasureSpec(int, int, int, boolean);
+    method public static int getChildMeasureSpec(int, int, int, int, boolean);
+    method public boolean getClipToPadding();
+    method public int getColumnCountForAccessibility(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
+    method public int getDecoratedBottom(android.view.View);
+    method public void getDecoratedBoundsWithMargins(android.view.View, android.graphics.Rect);
+    method public int getDecoratedLeft(android.view.View);
+    method public int getDecoratedMeasuredHeight(android.view.View);
+    method public int getDecoratedMeasuredWidth(android.view.View);
+    method public int getDecoratedRight(android.view.View);
+    method public int getDecoratedTop(android.view.View);
+    method public android.view.View getFocusedChild();
+    method public int getHeight();
+    method public int getHeightMode();
+    method public int getItemCount();
+    method public int getItemViewType(android.view.View);
+    method public int getLayoutDirection();
+    method public int getLeftDecorationWidth(android.view.View);
+    method public int getMinimumHeight();
+    method public int getMinimumWidth();
+    method public int getPaddingBottom();
+    method public int getPaddingEnd();
+    method public int getPaddingLeft();
+    method public int getPaddingRight();
+    method public int getPaddingStart();
+    method public int getPaddingTop();
+    method public int getPosition(android.view.View);
+    method public static android.support.v7.widget.RecyclerView.LayoutManager.Properties getProperties(android.content.Context, android.util.AttributeSet, int, int);
+    method public int getRightDecorationWidth(android.view.View);
+    method public int getRowCountForAccessibility(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
+    method public int getSelectionModeForAccessibility(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
+    method public int getTopDecorationHeight(android.view.View);
+    method public void getTransformedBoundingBox(android.view.View, boolean, android.graphics.Rect);
+    method public int getWidth();
+    method public int getWidthMode();
+    method public boolean hasFocus();
+    method public void ignoreView(android.view.View);
+    method public boolean isAttachedToWindow();
+    method public boolean isAutoMeasureEnabled();
+    method public boolean isFocused();
+    method public boolean isLayoutHierarchical(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
+    method public boolean isMeasurementCacheEnabled();
+    method public boolean isSmoothScrolling();
+    method public void layoutDecorated(android.view.View, int, int, int, int);
+    method public void layoutDecoratedWithMargins(android.view.View, int, int, int, int);
+    method public void measureChild(android.view.View, int, int);
+    method public void measureChildWithMargins(android.view.View, int, int);
+    method public void moveView(int, int);
+    method public void offsetChildrenHorizontal(int);
+    method public void offsetChildrenVertical(int);
+    method public void onAdapterChanged(android.support.v7.widget.RecyclerView.Adapter, android.support.v7.widget.RecyclerView.Adapter);
+    method public boolean onAddFocusables(android.support.v7.widget.RecyclerView, java.util.ArrayList<android.view.View>, int, int);
+    method public void onAttachedToWindow(android.support.v7.widget.RecyclerView);
+    method public deprecated void onDetachedFromWindow(android.support.v7.widget.RecyclerView);
+    method public void onDetachedFromWindow(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.Recycler);
+    method public android.view.View onFocusSearchFailed(android.view.View, int, android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
+    method public void onInitializeAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
+    method public void onInitializeAccessibilityEvent(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State, android.view.accessibility.AccessibilityEvent);
+    method public void onInitializeAccessibilityNodeInfo(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State, android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
+    method public void onInitializeAccessibilityNodeInfoForItem(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State, android.view.View, android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
+    method public android.view.View onInterceptFocusSearch(android.view.View, int);
+    method public void onItemsAdded(android.support.v7.widget.RecyclerView, int, int);
+    method public void onItemsChanged(android.support.v7.widget.RecyclerView);
+    method public void onItemsMoved(android.support.v7.widget.RecyclerView, int, int, int);
+    method public void onItemsRemoved(android.support.v7.widget.RecyclerView, int, int);
+    method public void onItemsUpdated(android.support.v7.widget.RecyclerView, int, int);
+    method public void onItemsUpdated(android.support.v7.widget.RecyclerView, int, int, java.lang.Object);
+    method public void onLayoutChildren(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
+    method public void onLayoutCompleted(android.support.v7.widget.RecyclerView.State);
+    method public void onMeasure(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State, int, int);
+    method public deprecated boolean onRequestChildFocus(android.support.v7.widget.RecyclerView, android.view.View, android.view.View);
+    method public boolean onRequestChildFocus(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.State, android.view.View, android.view.View);
+    method public void onRestoreInstanceState(android.os.Parcelable);
+    method public android.os.Parcelable onSaveInstanceState();
+    method public void onScrollStateChanged(int);
+    method public boolean performAccessibilityAction(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State, int, android.os.Bundle);
+    method public boolean performAccessibilityActionForItem(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State, android.view.View, int, android.os.Bundle);
+    method public void postOnAnimation(java.lang.Runnable);
+    method public void removeAllViews();
+    method public void removeAndRecycleAllViews(android.support.v7.widget.RecyclerView.Recycler);
+    method public void removeAndRecycleView(android.view.View, android.support.v7.widget.RecyclerView.Recycler);
+    method public void removeAndRecycleViewAt(int, android.support.v7.widget.RecyclerView.Recycler);
+    method public boolean removeCallbacks(java.lang.Runnable);
+    method public void removeDetachedView(android.view.View);
+    method public void removeView(android.view.View);
+    method public void removeViewAt(int);
+    method public boolean requestChildRectangleOnScreen(android.support.v7.widget.RecyclerView, android.view.View, android.graphics.Rect, boolean);
+    method public void requestLayout();
+    method public void requestSimpleAnimationsInNextLayout();
+    method public int scrollHorizontallyBy(int, android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
+    method public void scrollToPosition(int);
+    method public int scrollVerticallyBy(int, android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
+    method public void setAutoMeasureEnabled(boolean);
+    method public void setMeasuredDimension(android.graphics.Rect, int, int);
+    method public void setMeasuredDimension(int, int);
+    method public void setMeasurementCacheEnabled(boolean);
+    method public void smoothScrollToPosition(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.State, int);
+    method public void startSmoothScroll(android.support.v7.widget.RecyclerView.SmoothScroller);
+    method public void stopIgnoringView(android.view.View);
+    method public boolean supportsPredictiveItemAnimations();
+  }
+
+  public static class RecyclerView.LayoutManager.Properties {
+    ctor public RecyclerView.LayoutManager.Properties();
+    field public int orientation;
+    field public boolean reverseLayout;
+    field public int spanCount;
+    field public boolean stackFromEnd;
+  }
+
+  public static class RecyclerView.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
+    ctor public RecyclerView.LayoutParams(android.content.Context, android.util.AttributeSet);
+    ctor public RecyclerView.LayoutParams(int, int);
+    ctor public RecyclerView.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
+    ctor public RecyclerView.LayoutParams(android.view.ViewGroup.LayoutParams);
+    ctor public RecyclerView.LayoutParams(android.support.v7.widget.RecyclerView.LayoutParams);
+    method public int getViewAdapterPosition();
+    method public int getViewLayoutPosition();
+    method public deprecated int getViewPosition();
+    method public boolean isItemChanged();
+    method public boolean isItemRemoved();
+    method public boolean isViewInvalid();
+    method public boolean viewNeedsUpdate();
+  }
+
+  public static abstract interface RecyclerView.OnChildAttachStateChangeListener {
+    method public abstract void onChildViewAttachedToWindow(android.view.View);
+    method public abstract void onChildViewDetachedFromWindow(android.view.View);
+  }
+
+  public static abstract interface RecyclerView.OnItemTouchListener {
+    method public abstract boolean onInterceptTouchEvent(android.support.v7.widget.RecyclerView, android.view.MotionEvent);
+    method public abstract void onRequestDisallowInterceptTouchEvent(boolean);
+    method public abstract void onTouchEvent(android.support.v7.widget.RecyclerView, android.view.MotionEvent);
+  }
+
+  public static abstract class RecyclerView.OnScrollListener {
+    ctor public RecyclerView.OnScrollListener();
+    method public void onScrollStateChanged(android.support.v7.widget.RecyclerView, int);
+    method public void onScrolled(android.support.v7.widget.RecyclerView, int, int);
+  }
+
+  public static class RecyclerView.RecycledViewPool {
+    ctor public RecyclerView.RecycledViewPool();
+    method public void clear();
+    method public android.support.v7.widget.RecyclerView.ViewHolder getRecycledView(int);
+    method public void putRecycledView(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public void setMaxRecycledViews(int, int);
+  }
+
+  public final class RecyclerView.Recycler {
+    ctor public RecyclerView.Recycler();
+    method public void bindViewToPosition(android.view.View, int);
+    method public void clear();
+    method public int convertPreLayoutPositionToPostLayout(int);
+    method public java.util.List<android.support.v7.widget.RecyclerView.ViewHolder> getScrapList();
+    method public android.view.View getViewForPosition(int);
+    method public void recycleView(android.view.View);
+    method public void setViewCacheSize(int);
+  }
+
+  public static abstract interface RecyclerView.RecyclerListener {
+    method public abstract void onViewRecycled(android.support.v7.widget.RecyclerView.ViewHolder);
+  }
+
+  public static class RecyclerView.SimpleOnItemTouchListener implements android.support.v7.widget.RecyclerView.OnItemTouchListener {
+    ctor public RecyclerView.SimpleOnItemTouchListener();
+    method public boolean onInterceptTouchEvent(android.support.v7.widget.RecyclerView, android.view.MotionEvent);
+    method public void onRequestDisallowInterceptTouchEvent(boolean);
+    method public void onTouchEvent(android.support.v7.widget.RecyclerView, android.view.MotionEvent);
+  }
+
+  public static abstract class RecyclerView.SmoothScroller {
+    ctor public RecyclerView.SmoothScroller();
+    method public android.view.View findViewByPosition(int);
+    method public int getChildCount();
+    method public int getChildPosition(android.view.View);
+    method public android.support.v7.widget.RecyclerView.LayoutManager getLayoutManager();
+    method public int getTargetPosition();
+    method public deprecated void instantScrollToPosition(int);
+    method public boolean isPendingInitialRun();
+    method public boolean isRunning();
+    method protected void normalize(android.graphics.PointF);
+    method protected void onChildAttachedToWindow(android.view.View);
+    method protected abstract void onSeekTargetStep(int, int, android.support.v7.widget.RecyclerView.State, android.support.v7.widget.RecyclerView.SmoothScroller.Action);
+    method protected abstract void onStart();
+    method protected abstract void onStop();
+    method protected abstract void onTargetFound(android.view.View, android.support.v7.widget.RecyclerView.State, android.support.v7.widget.RecyclerView.SmoothScroller.Action);
+    method public void setTargetPosition(int);
+    method protected final void stop();
+  }
+
+  public static class RecyclerView.SmoothScroller.Action {
+    ctor public RecyclerView.SmoothScroller.Action(int, int);
+    ctor public RecyclerView.SmoothScroller.Action(int, int, int);
+    ctor public RecyclerView.SmoothScroller.Action(int, int, int, android.view.animation.Interpolator);
+    method public int getDuration();
+    method public int getDx();
+    method public int getDy();
+    method public android.view.animation.Interpolator getInterpolator();
+    method public void jumpTo(int);
+    method public void setDuration(int);
+    method public void setDx(int);
+    method public void setDy(int);
+    method public void setInterpolator(android.view.animation.Interpolator);
+    method public void update(int, int, int, android.view.animation.Interpolator);
+    field public static final int UNDEFINED_DURATION = -2147483648; // 0x80000000
+  }
+
+  public static class RecyclerView.State {
+    ctor public RecyclerView.State();
+    method public boolean didStructureChange();
+    method public T get(int);
+    method public int getItemCount();
+    method public int getTargetScrollPosition();
+    method public boolean hasTargetScrollPosition();
+    method public boolean isMeasuring();
+    method public boolean isPreLayout();
+    method public void put(int, java.lang.Object);
+    method public void remove(int);
+    method public boolean willRunPredictiveAnimations();
+    method public boolean willRunSimpleAnimations();
+  }
+
+  public static abstract class RecyclerView.ViewCacheExtension {
+    ctor public RecyclerView.ViewCacheExtension();
+    method public abstract android.view.View getViewForPositionAndType(android.support.v7.widget.RecyclerView.Recycler, int, int);
+  }
+
+  public static abstract class RecyclerView.ViewHolder {
+    ctor public RecyclerView.ViewHolder(android.view.View);
+    method public final int getAdapterPosition();
+    method public final long getItemId();
+    method public final int getItemViewType();
+    method public final int getLayoutPosition();
+    method public final int getOldPosition();
+    method public final deprecated int getPosition();
+    method public final boolean isRecyclable();
+    method public final void setIsRecyclable(boolean);
+    field public final android.view.View itemView;
+  }
+
+  public class RecyclerViewAccessibilityDelegate extends android.support.v4.view.AccessibilityDelegateCompat {
+    ctor public RecyclerViewAccessibilityDelegate(android.support.v7.widget.RecyclerView);
+    method public android.support.v4.view.AccessibilityDelegateCompat getItemDelegate();
+  }
+
+  public class SearchView extends android.support.v7.widget.LinearLayoutCompat implements android.support.v7.view.CollapsibleActionView {
+    ctor public SearchView(android.content.Context);
+    ctor public SearchView(android.content.Context, android.util.AttributeSet);
+    ctor public SearchView(android.content.Context, android.util.AttributeSet, int);
+    method public int getImeOptions();
+    method public int getInputType();
+    method public int getMaxWidth();
+    method public java.lang.CharSequence getQuery();
+    method public java.lang.CharSequence getQueryHint();
+    method public android.support.v4.widget.CursorAdapter getSuggestionsAdapter();
+    method public boolean isIconfiedByDefault();
+    method public boolean isIconified();
+    method public boolean isQueryRefinementEnabled();
+    method public boolean isSubmitButtonEnabled();
+    method public void onActionViewCollapsed();
+    method public void onActionViewExpanded();
+    method public void setIconified(boolean);
+    method public void setIconifiedByDefault(boolean);
+    method public void setImeOptions(int);
+    method public void setInputType(int);
+    method public void setMaxWidth(int);
+    method public void setOnCloseListener(android.support.v7.widget.SearchView.OnCloseListener);
+    method public void setOnQueryTextFocusChangeListener(android.view.View.OnFocusChangeListener);
+    method public void setOnQueryTextListener(android.support.v7.widget.SearchView.OnQueryTextListener);
+    method public void setOnSearchClickListener(android.view.View.OnClickListener);
+    method public void setOnSuggestionListener(android.support.v7.widget.SearchView.OnSuggestionListener);
+    method public void setQuery(java.lang.CharSequence, boolean);
+    method public void setQueryHint(java.lang.CharSequence);
+    method public void setQueryRefinementEnabled(boolean);
+    method public void setSearchableInfo(android.app.SearchableInfo);
+    method public void setSubmitButtonEnabled(boolean);
+    method public void setSuggestionsAdapter(android.support.v4.widget.CursorAdapter);
+  }
+
+  public static abstract interface SearchView.OnCloseListener {
+    method public abstract boolean onClose();
+  }
+
+  public static abstract interface SearchView.OnQueryTextListener {
+    method public abstract boolean onQueryTextChange(java.lang.String);
+    method public abstract boolean onQueryTextSubmit(java.lang.String);
+  }
+
+  public static abstract interface SearchView.OnSuggestionListener {
+    method public abstract boolean onSuggestionClick(int);
+    method public abstract boolean onSuggestionSelect(int);
+  }
+
+  public class ShareActionProvider extends android.support.v4.view.ActionProvider {
+    ctor public ShareActionProvider(android.content.Context);
+    method public android.view.View onCreateActionView();
+    method public void setOnShareTargetSelectedListener(android.support.v7.widget.ShareActionProvider.OnShareTargetSelectedListener);
+    method public void setShareHistoryFileName(java.lang.String);
+    method public void setShareIntent(android.content.Intent);
+    field public static final java.lang.String DEFAULT_SHARE_HISTORY_FILE_NAME = "share_history.xml";
+  }
+
+  public static abstract interface ShareActionProvider.OnShareTargetSelectedListener {
+    method public abstract boolean onShareTargetSelected(android.support.v7.widget.ShareActionProvider, android.content.Intent);
+  }
+
+  public abstract class SimpleItemAnimator extends android.support.v7.widget.RecyclerView.ItemAnimator {
+    ctor public SimpleItemAnimator();
+    method public abstract boolean animateAdd(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public boolean animateAppearance(android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
+    method public boolean animateChange(android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
+    method public abstract boolean animateChange(android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ViewHolder, int, int, int, int);
+    method public boolean animateDisappearance(android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
+    method public abstract boolean animateMove(android.support.v7.widget.RecyclerView.ViewHolder, int, int, int, int);
+    method public boolean animatePersistence(android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
+    method public abstract boolean animateRemove(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public final void dispatchAddFinished(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public final void dispatchAddStarting(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public final void dispatchChangeFinished(android.support.v7.widget.RecyclerView.ViewHolder, boolean);
+    method public final void dispatchChangeStarting(android.support.v7.widget.RecyclerView.ViewHolder, boolean);
+    method public final void dispatchMoveFinished(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public final void dispatchMoveStarting(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public final void dispatchRemoveFinished(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public final void dispatchRemoveStarting(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public boolean getSupportsChangeAnimations();
+    method public void onAddFinished(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public void onAddStarting(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public void onChangeFinished(android.support.v7.widget.RecyclerView.ViewHolder, boolean);
+    method public void onChangeStarting(android.support.v7.widget.RecyclerView.ViewHolder, boolean);
+    method public void onMoveFinished(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public void onMoveStarting(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public void onRemoveFinished(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public void onRemoveStarting(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public void setSupportsChangeAnimations(boolean);
+  }
+
+  public final deprecated class Space extends android.support.v4.widget.Space {
+    ctor public Space(android.content.Context);
+    ctor public Space(android.content.Context, android.util.AttributeSet);
+    ctor public Space(android.content.Context, android.util.AttributeSet, int);
+  }
+
+  public class StaggeredGridLayoutManager extends android.support.v7.widget.RecyclerView.LayoutManager {
+    ctor public StaggeredGridLayoutManager(android.content.Context, android.util.AttributeSet, int, int);
+    ctor public StaggeredGridLayoutManager(int, int);
+    method public int[] findFirstCompletelyVisibleItemPositions(int[]);
+    method public int[] findFirstVisibleItemPositions(int[]);
+    method public int[] findLastCompletelyVisibleItemPositions(int[]);
+    method public int[] findLastVisibleItemPositions(int[]);
+    method public android.support.v7.widget.RecyclerView.LayoutParams generateDefaultLayoutParams();
+    method public int getGapStrategy();
+    method public int getOrientation();
+    method public boolean getReverseLayout();
+    method public int getSpanCount();
+    method public void invalidateSpanAssignments();
+    method public void scrollToPositionWithOffset(int, int);
+    method public void setGapStrategy(int);
+    method public void setOrientation(int);
+    method public void setReverseLayout(boolean);
+    method public void setSpanCount(int);
+    field public static final deprecated int GAP_HANDLING_LAZY = 1; // 0x1
+    field public static final int GAP_HANDLING_MOVE_ITEMS_BETWEEN_SPANS = 2; // 0x2
+    field public static final int GAP_HANDLING_NONE = 0; // 0x0
+    field public static final int HORIZONTAL = 0; // 0x0
+    field public static final java.lang.String TAG = "StaggeredGridLayoutManager";
+    field public static final int VERTICAL = 1; // 0x1
+  }
+
+  public static class StaggeredGridLayoutManager.LayoutParams extends android.support.v7.widget.RecyclerView.LayoutParams {
+    ctor public StaggeredGridLayoutManager.LayoutParams(android.content.Context, android.util.AttributeSet);
+    ctor public StaggeredGridLayoutManager.LayoutParams(int, int);
+    ctor public StaggeredGridLayoutManager.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
+    ctor public StaggeredGridLayoutManager.LayoutParams(android.view.ViewGroup.LayoutParams);
+    ctor public StaggeredGridLayoutManager.LayoutParams(android.support.v7.widget.RecyclerView.LayoutParams);
+    method public final int getSpanIndex();
+    method public boolean isFullSpan();
+    method public void setFullSpan(boolean);
+    field public static final int INVALID_SPAN_ID = -1; // 0xffffffff
+  }
+
+  public class SwitchCompat extends android.widget.CompoundButton {
+    ctor public SwitchCompat(android.content.Context);
+    ctor public SwitchCompat(android.content.Context, android.util.AttributeSet);
+    ctor public SwitchCompat(android.content.Context, android.util.AttributeSet, int);
+    method public boolean getShowText();
+    method public boolean getSplitTrack();
+    method public int getSwitchMinWidth();
+    method public int getSwitchPadding();
+    method public java.lang.CharSequence getTextOff();
+    method public java.lang.CharSequence getTextOn();
+    method public android.graphics.drawable.Drawable getThumbDrawable();
+    method public int getThumbTextPadding();
+    method public android.content.res.ColorStateList getThumbTintList();
+    method public android.graphics.PorterDuff.Mode getThumbTintMode();
+    method public android.graphics.drawable.Drawable getTrackDrawable();
+    method public android.content.res.ColorStateList getTrackTintList();
+    method public android.graphics.PorterDuff.Mode getTrackTintMode();
+    method public void onMeasure(int, int);
+    method public void setShowText(boolean);
+    method public void setSplitTrack(boolean);
+    method public void setSwitchMinWidth(int);
+    method public void setSwitchPadding(int);
+    method public void setSwitchTextAppearance(android.content.Context, int);
+    method public void setSwitchTypeface(android.graphics.Typeface, int);
+    method public void setSwitchTypeface(android.graphics.Typeface);
+    method public void setTextOff(java.lang.CharSequence);
+    method public void setTextOn(java.lang.CharSequence);
+    method public void setThumbDrawable(android.graphics.drawable.Drawable);
+    method public void setThumbResource(int);
+    method public void setThumbTextPadding(int);
+    method public void setThumbTintList(android.content.res.ColorStateList);
+    method public void setThumbTintMode(android.graphics.PorterDuff.Mode);
+    method public void setTrackDrawable(android.graphics.drawable.Drawable);
+    method public void setTrackResource(int);
+    method public void setTrackTintList(android.content.res.ColorStateList);
+    method public void setTrackTintMode(android.graphics.PorterDuff.Mode);
+  }
+
+  public abstract interface ThemedSpinnerAdapter implements android.widget.SpinnerAdapter {
+    method public abstract android.content.res.Resources.Theme getDropDownViewTheme();
+    method public abstract void setDropDownViewTheme(android.content.res.Resources.Theme);
+  }
+
+  public static final class ThemedSpinnerAdapter.Helper {
+    ctor public ThemedSpinnerAdapter.Helper(android.content.Context);
+    method public android.view.LayoutInflater getDropDownViewInflater();
+    method public android.content.res.Resources.Theme getDropDownViewTheme();
+    method public void setDropDownViewTheme(android.content.res.Resources.Theme);
+  }
+
+  public class Toolbar extends android.view.ViewGroup {
+    ctor public Toolbar(android.content.Context);
+    ctor public Toolbar(android.content.Context, android.util.AttributeSet);
+    ctor public Toolbar(android.content.Context, android.util.AttributeSet, int);
+    method public void collapseActionView();
+    method public void dismissPopupMenus();
+    method public int getContentInsetEnd();
+    method public int getContentInsetEndWithActions();
+    method public int getContentInsetLeft();
+    method public int getContentInsetRight();
+    method public int getContentInsetStart();
+    method public int getContentInsetStartWithNavigation();
+    method public int getCurrentContentInsetEnd();
+    method public int getCurrentContentInsetLeft();
+    method public int getCurrentContentInsetRight();
+    method public int getCurrentContentInsetStart();
+    method public android.graphics.drawable.Drawable getLogo();
+    method public java.lang.CharSequence getLogoDescription();
+    method public android.view.Menu getMenu();
+    method public java.lang.CharSequence getNavigationContentDescription();
+    method public android.graphics.drawable.Drawable getNavigationIcon();
+    method public android.graphics.drawable.Drawable getOverflowIcon();
+    method public int getPopupTheme();
+    method public java.lang.CharSequence getSubtitle();
+    method public java.lang.CharSequence getTitle();
+    method public int getTitleMarginBottom();
+    method public int getTitleMarginEnd();
+    method public int getTitleMarginStart();
+    method public int getTitleMarginTop();
+    method public boolean hasExpandedActionView();
+    method public boolean hideOverflowMenu();
+    method public void inflateMenu(int);
+    method public boolean isOverflowMenuShowing();
+    method protected void onLayout(boolean, int, int, int, int);
+    method public void setContentInsetEndWithActions(int);
+    method public void setContentInsetStartWithNavigation(int);
+    method public void setContentInsetsAbsolute(int, int);
+    method public void setContentInsetsRelative(int, int);
+    method public void setLogo(int);
+    method public void setLogo(android.graphics.drawable.Drawable);
+    method public void setLogoDescription(int);
+    method public void setLogoDescription(java.lang.CharSequence);
+    method public void setNavigationContentDescription(int);
+    method public void setNavigationContentDescription(java.lang.CharSequence);
+    method public void setNavigationIcon(int);
+    method public void setNavigationIcon(android.graphics.drawable.Drawable);
+    method public void setNavigationOnClickListener(android.view.View.OnClickListener);
+    method public void setOnMenuItemClickListener(android.support.v7.widget.Toolbar.OnMenuItemClickListener);
+    method public void setOverflowIcon(android.graphics.drawable.Drawable);
+    method public void setPopupTheme(int);
+    method public void setSubtitle(int);
+    method public void setSubtitle(java.lang.CharSequence);
+    method public void setSubtitleTextAppearance(android.content.Context, int);
+    method public void setSubtitleTextColor(int);
+    method public void setTitle(int);
+    method public void setTitle(java.lang.CharSequence);
+    method public void setTitleMargin(int, int, int, int);
+    method public void setTitleMarginBottom(int);
+    method public void setTitleMarginEnd(int);
+    method public void setTitleMarginStart(int);
+    method public void setTitleMarginTop(int);
+    method public void setTitleTextAppearance(android.content.Context, int);
+    method public void setTitleTextColor(int);
+    method public boolean showOverflowMenu();
+  }
+
+  public static class Toolbar.LayoutParams extends android.support.v7.app.ActionBar.LayoutParams {
+    ctor public Toolbar.LayoutParams(android.content.Context, android.util.AttributeSet);
+    ctor public Toolbar.LayoutParams(int, int);
+    ctor public Toolbar.LayoutParams(int, int, int);
+    ctor public Toolbar.LayoutParams(int);
+    ctor public Toolbar.LayoutParams(android.support.v7.widget.Toolbar.LayoutParams);
+    ctor public Toolbar.LayoutParams(android.support.v7.app.ActionBar.LayoutParams);
+    ctor public Toolbar.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
+    ctor public Toolbar.LayoutParams(android.view.ViewGroup.LayoutParams);
+  }
+
+  public static abstract interface Toolbar.OnMenuItemClickListener {
+    method public abstract boolean onMenuItemClick(android.view.MenuItem);
+  }
+
+  public static class Toolbar.SavedState extends android.support.v4.view.AbsSavedState {
+    ctor public Toolbar.SavedState(android.os.Parcel);
+    ctor public Toolbar.SavedState(android.os.Parcel, java.lang.ClassLoader);
+    ctor public Toolbar.SavedState(android.os.Parcelable);
+    field public static final android.os.Parcelable.Creator<android.support.v7.widget.Toolbar.SavedState> CREATOR;
+  }
+
+}
+
+package android.support.v7.widget.helper {
+
+  public class ItemTouchHelper extends android.support.v7.widget.RecyclerView.ItemDecoration implements android.support.v7.widget.RecyclerView.OnChildAttachStateChangeListener {
+    ctor public ItemTouchHelper(android.support.v7.widget.helper.ItemTouchHelper.Callback);
+    method public void attachToRecyclerView(android.support.v7.widget.RecyclerView);
+    method public void onChildViewAttachedToWindow(android.view.View);
+    method public void onChildViewDetachedFromWindow(android.view.View);
+    method public void startDrag(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public void startSwipe(android.support.v7.widget.RecyclerView.ViewHolder);
+    field public static final int ACTION_STATE_DRAG = 2; // 0x2
+    field public static final int ACTION_STATE_IDLE = 0; // 0x0
+    field public static final int ACTION_STATE_SWIPE = 1; // 0x1
+    field public static final int ANIMATION_TYPE_DRAG = 8; // 0x8
+    field public static final int ANIMATION_TYPE_SWIPE_CANCEL = 4; // 0x4
+    field public static final int ANIMATION_TYPE_SWIPE_SUCCESS = 2; // 0x2
+    field public static final int DOWN = 2; // 0x2
+    field public static final int END = 32; // 0x20
+    field public static final int LEFT = 4; // 0x4
+    field public static final int RIGHT = 8; // 0x8
+    field public static final int START = 16; // 0x10
+    field public static final int UP = 1; // 0x1
+  }
+
+  public static abstract class ItemTouchHelper.Callback {
+    ctor public ItemTouchHelper.Callback();
+    method public boolean canDropOver(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ViewHolder);
+    method public android.support.v7.widget.RecyclerView.ViewHolder chooseDropTarget(android.support.v7.widget.RecyclerView.ViewHolder, java.util.List<android.support.v7.widget.RecyclerView.ViewHolder>, int, int);
+    method public void clearView(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder);
+    method public int convertToAbsoluteDirection(int, int);
+    method public static int convertToRelativeDirection(int, int);
+    method public long getAnimationDuration(android.support.v7.widget.RecyclerView, int, float, float);
+    method public int getBoundingBoxMargin();
+    method public static android.support.v7.widget.helper.ItemTouchUIUtil getDefaultUIUtil();
+    method public float getMoveThreshold(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public abstract int getMovementFlags(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder);
+    method public float getSwipeEscapeVelocity(float);
+    method public float getSwipeThreshold(android.support.v7.widget.RecyclerView.ViewHolder);
+    method public float getSwipeVelocityThreshold(float);
+    method public int interpolateOutOfBoundsScroll(android.support.v7.widget.RecyclerView, int, int, int, long);
+    method public boolean isItemViewSwipeEnabled();
+    method public boolean isLongPressDragEnabled();
+    method public static int makeFlag(int, int);
+    method public static int makeMovementFlags(int, int);
+    method public void onChildDraw(android.graphics.Canvas, android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder, float, float, int, boolean);
+    method public void onChildDrawOver(android.graphics.Canvas, android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder, float, float, int, boolean);
+    method public abstract boolean onMove(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ViewHolder);
+    method public void onMoved(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder, int, android.support.v7.widget.RecyclerView.ViewHolder, int, int, int);
+    method public void onSelectedChanged(android.support.v7.widget.RecyclerView.ViewHolder, int);
+    method public abstract void onSwiped(android.support.v7.widget.RecyclerView.ViewHolder, int);
+    field public static final int DEFAULT_DRAG_ANIMATION_DURATION = 200; // 0xc8
+    field public static final int DEFAULT_SWIPE_ANIMATION_DURATION = 250; // 0xfa
+  }
+
+  public static abstract class ItemTouchHelper.SimpleCallback extends android.support.v7.widget.helper.ItemTouchHelper.Callback {
+    ctor public ItemTouchHelper.SimpleCallback(int, int);
+    method public int getDragDirs(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder);
+    method public int getMovementFlags(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder);
+    method public int getSwipeDirs(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder);
+    method public void setDefaultDragDirs(int);
+    method public void setDefaultSwipeDirs(int);
+  }
+
+  public static abstract interface ItemTouchHelper.ViewDropHandler {
+    method public abstract void prepareForDrop(android.view.View, android.view.View, int, int);
+  }
+
+  public abstract interface ItemTouchUIUtil {
+    method public abstract void clearView(android.view.View);
+    method public abstract void onDraw(android.graphics.Canvas, android.support.v7.widget.RecyclerView, android.view.View, float, float, int, boolean);
+    method public abstract void onDrawOver(android.graphics.Canvas, android.support.v7.widget.RecyclerView, android.view.View, float, float, int, boolean);
+    method public abstract void onSelected(android.view.View);
+  }
+
+}
+
+package android.support.v7.widget.util {
+
+  public abstract class SortedListAdapterCallback extends android.support.v7.util.SortedList.Callback {
+    ctor public SortedListAdapterCallback(android.support.v7.widget.RecyclerView.Adapter);
+    method public void onChanged(int, int);
+    method public void onInserted(int, int);
+    method public void onMoved(int, int);
+    method public void onRemoved(int, int);
+  }
+
+}
+
diff --git a/api/removed.txt b/api/removed.txt
new file mode 100644
index 0000000..7dadbb7
--- /dev/null
+++ b/api/removed.txt
@@ -0,0 +1,26 @@
+package android.support.v4.content {
+
+  public class ContextCompat {
+    method public static deprecated android.content.Context createDeviceEncryptedStorageContext(android.content.Context);
+    method public static deprecated boolean isDeviceEncryptedStorage(android.content.Context);
+  }
+
+}
+
+package android.support.v4.os {
+
+  public class UserManagerCompat {
+    method public static deprecated boolean isUserRunningAndLocked(android.content.Context);
+    method public static deprecated boolean isUserRunningAndUnlocked(android.content.Context);
+  }
+
+}
+
+package android.support.v7.preference {
+
+  public class PreferenceManager {
+    method public deprecated void setStorageDeviceEncrypted();
+  }
+
+}
+
diff --git a/apicheck.mk b/apicheck.mk
deleted file mode 100644
index 7f56866..0000000
--- a/apicheck.mk
+++ /dev/null
@@ -1,128 +0,0 @@
-# Copyright (C) 2015 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.
-
-#
-# Input variables
-#
-# $(support_module) - name of the support library module
-# $(support_module_api_dir) - dir to store API files
-# $(support_module_java_libraries) - dependent libraries
-# $(support_module_java_packages) - list of package names containing public classes
-# $(support_module_src_files) - list of source files
-# $(support_module_aidl_includes) - list of aidl files
-# $(api_check_current_msg_file) - file containing error message for current API check
-# $(api_check_last_msg_file) - file containing error message for last SDK API check
-# ---------------------------------------------
-
-#
-# Generate the stub source files
-# ---------------------------------------------
-include $(CLEAR_VARS)
-
-support_module_api_file := \
-    $(TARGET_OUT_COMMON_INTERMEDIATES)/PACKAGING/$(support_module)_api.txt
-support_module_removed_file := \
-    $(TARGET_OUT_COMMON_INTERMEDIATES)/PACKAGING/$(support_module)_removed.txt
-
-LOCAL_MODULE := $(support_module)-stubs
-LOCAL_MODULE_CLASS := JAVA_LIBRARIES
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_SRC_FILES := $(support_module_src_files)
-LOCAL_AIDL_INCLUDES := $(support_module_aidl_includes)
-LOCAL_JAVA_LIBRARIES := $(support_module_java_libraries)
-LOCAL_ADDITIONAL_JAVA_DIR := \
-    $(call intermediates-dir-for,$(LOCAL_MODULE_CLASS),$(support_module),,COMMON)/src
-LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
-
-LOCAL_DROIDDOC_STUB_OUT_DIR := $(TARGET_OUT_COMMON_INTERMEDIATES)/$(LOCAL_MODULE_CLASS)/$(LOCAL_MODULE)_intermediates/src
-
-LOCAL_DROIDDOC_OPTIONS:= \
-    -stubpackages "$(subst $(space),:,$(support_module_java_packages))" \
-    -api $(support_module_api_file) \
-    -removedApi $(support_module_removed_file) \
-    -nodocs
-
-LOCAL_DROIDDOC_CUSTOM_TEMPLATE_DIR := build/tools/droiddoc/templates-sdk
-LOCAL_UNINSTALLABLE_MODULE := true
-
-include $(BUILD_DROIDDOC)
-support_stub_stamp := $(full_target)
-$(support_module_api_file) : $(full_target)
-
-#
-# Check API
-# ---------------------------------------------
-last_released_sdk_$(support_module) := $(lastword $(call numerically_sort, \
-    $(filter-out current, \
-        $(patsubst $(support_module_api_dir)/%.txt,%, $(wildcard $(support_module_api_dir)/*.txt)) \
-    )))
-
-# Check that the API we're building hasn't broken the last-released SDK version
-# if it exists
-ifneq ($(last_released_sdk_$(support_module)),)
-$(eval $(call check-api, \
-    $(support_module)-checkapi-last, \
-    $(support_module_api_dir)/$(last_released_sdk_$(support_module)).txt, \
-    $(support_module_api_file), \
-    $(support_module_api_dir)/removed.txt, \
-    $(support_module_removed_file), \
-    -hide 2 -hide 3 -hide 4 -hide 5 -hide 6 -hide 24 -hide 25 -hide 26 -hide 27 \
-        -warning 7 -warning 8 -warning 9 -warning 10 -warning 11 -warning 12 \
-        -warning 13 -warning 14 -warning 15 -warning 16 -warning 17 -warning 18, \
-    cat $(api_check_last_msg_file), \
-    check-support-api, \
-    $(support_stub_stamp)))
-endif
-
-# Check that the API we're building hasn't changed from the not-yet-released
-# SDK version.
-$(eval $(call check-api, \
-    $(support_module)-checkapi-current, \
-    $(support_module_api_dir)/current.txt, \
-    $(support_module_api_file), \
-    $(support_module_api_dir)/removed.txt, \
-    $(support_module_removed_file), \
-    -error 2 -error 3 -error 4 -error 5 -error 6 -error 7 -error 8 -error 9 -error 10 -error 11 \
-        -error 12 -error 13 -error 14 -error 15 -error 16 -error 17 -error 18 -error 19 -error 20 \
-        -error 21 -error 23 -error 24 -error 25, \
-    cat $(api_check_current_msg_file), \
-    check-support-api, \
-    $(support_stub_stamp)))
-
-.PHONY: update-$(support_module)-api
-update-$(support_module)-api: PRIVATE_API_DIR := $(support_module_api_dir)
-update-$(support_module)-api: PRIVATE_MODULE := $(support_module)
-update-$(support_module)-api: PRIVATE_REMOVED_API_FILE := $(support_module_removed_file)
-update-$(support_module)-api: $(support_module_api_file) | $(ACP)
-	@echo Copying $(PRIVATE_MODULE) current.txt
-	$(hide) $(ACP) $< $(PRIVATE_API_DIR)/current.txt
-	@echo Copying $(PRIVATE_MODULE) removed.txt
-	$(hide) $(ACP) $(PRIVATE_REMOVED_API_FILE) $(PRIVATE_API_DIR)/removed.txt
-
-# Run this update API task on the update-support-api task
-update-support-api: update-$(support_module)-api
-
-#
-# Clear variables
-# ---------------------------------------------
-support_module :=
-support_module_api_dir :=
-support_module_src_files :=
-support_module_aidl_includes :=
-support_module_java_libraries :=
-support_module_java_packages :=
-support_module_api_file :=
-support_module_removed_file :=
-support_stub_stamp :=
diff --git a/apicheck_msg_current.txt b/apicheck_msg_current.txt
deleted file mode 100644
index ecd843d..0000000
--- a/apicheck_msg_current.txt
+++ /dev/null
@@ -1,15 +0,0 @@
-
-******************************
-You have tried to change a support library API from what has been previously approved.
-
-To make these errors go away, you have two choices:
-   1) You can add "@hide" javadoc comments to the methods, etc. listed in the
-      errors above.
-
-   2) You can update current.txt by executing the following command:
-         make update-support-api
-
-      To submit the revised current.txt to the main Android repository,
-      you will need approval.
-******************************
-
diff --git a/apicheck_msg_last.txt b/apicheck_msg_last.txt
deleted file mode 100644
index bc33bd4..0000000
--- a/apicheck_msg_last.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-
-******************************
-You have tried to change a support library API from what has
-been previously released in an SDK. Please fix the errors listed above.
-******************************
-
diff --git a/build.gradle b/build.gradle
index bc7d38b..65040a5 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,6 +1,10 @@
 import com.android.build.gradle.internal.coverage.JacocoReportTask
 import com.android.build.gradle.internal.tasks.DeviceProviderInstrumentTestTask
 
+import android.support.checkapi.CheckApiTask
+import android.support.checkapi.UpdateApiTask
+import android.support.doclava.DoclavaTask
+
 buildscript {
     repositories {
         maven { url '../../prebuilts/gradle-plugin' }
@@ -13,12 +17,28 @@
     }
 }
 
+repositories {
+    maven { url '../../prebuilts/tools/common/m2/repository' }
+}
+
+configurations {
+    doclava
+}
+
+dependencies {
+    doclava project(':doclava')
+}
+
 ext.supportVersion = '25.0.0-SNAPSHOT'
 ext.extraVersion = 34
 ext.supportRepoOut = ''
 ext.buildToolsVersion = '23.0.2'
 ext.buildNumber = Integer.toString(ext.extraVersion)
 
+// Enforce the use of prebuilt dependencies in all sub-projects. This is
+// required for the doclava dependency.
+ext.usePrebuilts = "true"
+
 /*
  * With the build server you are given two env variables.
  * The OUT_DIR is a temporary directory you can use to put things during the build.
@@ -33,10 +53,11 @@
     // the build server does not pass the build number so we infer it from the last folder of the dist path.
     ext.buildNumber = project.ext.distDir.getName()
 } else {
-    buildDir = file('../../out/host/gradle/frameworks/support/build')
-    project.ext.distDir = file('../../out/dist')
+    buildDir = file("${project.rootDir}/../../out/host/gradle/frameworks/support/build")
+    project.ext.distDir = file("${project.rootDir}/../../out/dist")
 }
 
+ext.docsDir = new File(buildDir, 'javadoc')
 ext.supportRepoOut = new File(buildDir, 'support_repo')
 ext.testApkDistOut = ext.distDir
 
@@ -44,7 +65,6 @@
 task(createArchive) << {
 }
 
-
 // upload anchor for subprojects to upload their artifacts
 // to the local repo.
 task(mainUpload) << {
@@ -61,7 +81,7 @@
 
 // prepare repository with older versions
 task unzipRepo(type: Copy) {
-    from "$rootDir/../../prebuilts/maven_repo/android"
+    from "${project.rootDir}/../../prebuilts/maven_repo/android"
     into project.ext.supportRepoOut
 }
 
@@ -130,13 +150,35 @@
 import com.google.common.hash.Hashing
 import java.nio.charset.Charset
 
-def getSha1(File inputFile) {
+/**
+ * Generates SHA1 hash for the specified file's absolute path.
+ *
+ * @param inputFile file to hash
+ * @return SHA1 hash
+ */
+String getSha1(File inputFile) {
     HashFunction hashFunction = Hashing.sha1()
     HashCode hashCode = hashFunction.hashString(inputFile.getAbsolutePath(), Charset.forName("UTF-8"))
     return hashCode.toString()
 }
 
-def createApiSourceSets(Project subProject, List<ApiModule> apiModules) {
+/**
+ * Returns the Android prebuilt JAR for the specified API level.
+ *
+ * @param apiLevel the API level or "current"
+ * @return a file collection containing the Android prebuilt JAR
+ */
+FileCollection getAndroidPrebuilt(String apiLevel) {
+    files("${project.rootDir}/../../prebuilts/sdk/$apiLevel/android.jar")
+}
+
+/**
+ * Populates the sub-project's set of source sets with the specified modules.
+ *
+ * @param subProject the sub-project to which the modules belong
+ * @param apiModules the modules from which to populate
+ */
+void createApiSourceSets(Project subProject, List<ApiModule> apiModules) {
     subProject.ext._apiModules = apiModules
     subProject.ext.allSS = []
     if (gradle.ext.studioCompat.enableApiModules) {
@@ -157,7 +199,18 @@
     }
 }
 
-def createApiSourceset(Project subProject, String name, String folder, String apiLevel,
+/**
+ * Adds the specified module to the sub-project's set of source sets and
+ * internal JAR. Also sets up dependencies, if supplied.
+ *
+ * @param subProject the sub-project to which the module belongs
+ * @param name the name of the module
+ * @param folder the module's source folder
+ * @param apiLevel the module's compile API level
+ * @param previousSource source set dependency (optional)
+ * @return a source set for the module
+ */
+SourceSet createApiSourceset(Project subProject, String name, String folder, String apiLevel,
                        SourceSet previousSource) {
     def sourceSet = subProject.sourceSets.create(name)
     sourceSet.java.srcDirs = [folder]
@@ -173,7 +226,19 @@
     return sourceSet
 }
 
-def setApiModuleDependencies(Project subProject, DependencyHandler handler, List extraDeps) {
+/**
+ * Adds the specified source set as a dependency for the sub-project.
+ *
+ * @param subProject the sub-project to modify
+ * @param configName
+ * @param previousSourceSet the source set to add as a dependency
+ */
+void setupDependencies(Project subProject, String configName, SourceSet previousSourceSet) {
+    subProject.getDependencies().add(configName, previousSourceSet.output)
+    subProject.getDependencies().add(configName, previousSourceSet.compileClasspath)
+}
+
+void setApiModuleDependencies(Project subProject, DependencyHandler handler, List extraDeps) {
     if (gradle.ext.studioCompat.enableApiModules) {
         subProject.android.enforceUniquePackageName=false
         // add dependency on the latest module
@@ -185,16 +250,77 @@
             handler."${firstModule.folderName}Compile"(project(dep))
             handler.compile(project(dep))
         }
-
     }
 }
 
-def setupDependencies(Project subProject, String configName, SourceSet previousSourceSet) {
-    subProject.getDependencies().add(configName, previousSourceSet.output)
-    subProject.getDependencies().add(configName, previousSourceSet.compileClasspath)
+void registerForDocs(Project subProject, releaseVariant) {
+    rootProject.generateApi.dependsOn releaseVariant.javaCompile
+    rootProject.generateApi.source {
+        def buildConfig = fileTree(releaseVariant.getGenerateBuildConfig().sourceOutputDir)
+        return releaseVariant.javaCompile.source.minus(buildConfig) +
+            fileTree(releaseVariant.aidlCompile.sourceOutputDir) +
+            fileTree(releaseVariant.outputs[0].processResources.sourceOutputDir)
+    }
+    rootProject.generateApi.classpath += files(releaseVariant.javaCompile.classpath) +
+            files(releaseVariant.javaCompile.destinationDir)
+
+    if (subProject.hasProperty('allSS')) {
+        subProject.allSS.each { ss ->
+            rootProject.generateApi.source ss.java
+        }
+    }
+}
+
+
+// Generates API files.
+task generateApi(type: DoclavaTask, dependsOn: configurations.doclava) {
+    docletpath = configurations.doclava.resolve()
+    destinationDir = project.docsDir
+
+    // Base classpath is Android SDK, sub-projects add their own.
+    classpath = getAndroidPrebuilt(gradle.ext.currentSdk)
+
+    apiFile = new File(project.docsDir, 'release/current.txt')
+    removedApiFile = new File(project.docsDir, 'release/removed.txt')
+    generateDocs = false
+
+    options {
+        addStringOption "templatedir",
+                "${project.rootDir}/../../build/tools/droiddoc/templates-sdk"
+        addStringOption "federate Android", "http://developer.android.com"
+        addStringOption "federationapi Android",
+                "${project.rootDir}/../../prebuilts/sdk/api/24.txt"
+        addStringOption "stubpackages", "android.support.*"
+    }
+    exclude '**/BuildConfig.java'
+    exclude '**/R.java'
+}
+
+// Copies generated API files to current version.
+task updateApi(type: UpdateApiTask, dependsOn: generateApi) {
+    newApiFile = new File(project.docsDir, 'release/current.txt')
+    oldApiFile = new File(project.rootDir, 'api/current.txt')
+    newRemovedApiFile = new File(project.docsDir, 'release/removed.txt')
+    oldRemovedApiFile = new File(project.rootDir, 'api/removed.txt')
+}
+
+// Checks generated API files against current version.
+task checkApi(type: CheckApiTask, dependsOn: generateApi) {
+    doclavaClasspath = generateApi.docletpath
+
+    checkApiTaskPath = name
+    updateApiTaskPath = updateApi.name
+
+    newApiFile = new File(project.docsDir, 'release/current.txt')
+    oldApiFile = new File(project.rootDir, 'api/current.txt')
+    newRemovedApiFile = new File(project.docsDir, 'release/removed.txt')
+    oldRemovedApiFile = new File(project.rootDir, 'api/removed.txt')
 }
 
 subprojects {
+    // Only modify android projects.
+    if (project.name.equals('doclava')) return;
+
     // Change buildDir first so that all plugins pick up the new value.
     project.buildDir = project.file("$project.parent.buildDir/../$project.name/build")
     // current SDK is set in studioCompat.gradle
@@ -243,13 +369,43 @@
         pom.dependencies.findAll {dep -> dep.groupId == 'com.android.support' && dep.artifactId != 'support-annotations' }*.type = 'aar'
     }
 
+    def versionDir = {
+        def groupDir = new File(rootProject.ext.supportRepoOut, project.group.replace('.','/'))
+        def artifactDir = new File(groupDir, archivesBaseName)
+        return new File(artifactDir, version)
+    }
+
+    task generateSourceProps(dependsOn: createRepository) << {
+        def content = "Maven.GroupId=$deployer.pom.groupId\n" +
+            "Maven.ArtifactId=$deployer.pom.artifactId\n" +
+            "Maven.Version=$deployer.pom.version\n" +
+            "Pkg.Desc=$project.name\n" +
+            "Pkg.Revision=1\n" +
+            "Dependencies=" +
+            String.join(",", project.configurations.compile.allDependencies.collect {
+                    def p = parent.findProject(it.name)
+                    return p ? "$p.group:$p.archivesBaseName:$p.version" : null
+                }.grep()) +
+            "\n"
+        Files.write(content, new File(versionDir(), 'source.properties'), Charsets.UTF_8)
+    }
+
+    task createSeparateZip(type: Zip, dependsOn: generateSourceProps)  {
+        into archivesBaseName
+        destinationDir project.parent.ext.distDir
+        baseName = project.group
+        version = project.parent.ext.buildNumber
+    }
+    project.parent.createArchive.dependsOn createSeparateZip
+
     // before the upload, make sure the repo is ready.
     release.dependsOn rootProject.tasks.prepareRepo
     // make the mainupload depend on this one.
     mainUpload.dependsOn release
 
     project.plugins.whenPluginAdded { plugin ->
-        if ("com.android.build.gradle.LibraryPlugin".equals(plugin.class.name)) {
+        if ("com.android.build.gradle.LibraryPlugin".equals(plugin.class.name)
+                || "com.android.build.gradle.AppPlugin".equals(plugin.class.name)) {
             project.android.buildToolsVersion = rootProject.buildToolsVersion
             // enable code coverage for debug builds only if we are not running inside the IDE
             // enabling coverage reports breaks the method parameter resolution in the IDE debugger
@@ -257,8 +413,13 @@
         }
     }
 
-    // Copy instrumentation test APK into the dist dir
     project.afterEvaluate {
+        // The archivesBaseName isn't available intially, so set it now
+        def createZipTask = project.tasks.getByName("createSeparateZip")
+        createZipTask.appendix = archivesBaseName
+        createZipTask.from versionDir()
+
+        // Copy instrumentation test APK into the dist dir
         def assembleTestTask = project.tasks.findByPath('assembleAndroidTest')
         if (assembleTestTask != null) {
             assembleTestTask.doLast {
@@ -293,6 +454,18 @@
             }
         }
     }
+
+    project.afterEvaluate { p ->
+        if (p.hasProperty('android')
+                && p.android.hasProperty('libraryVariants')
+                && !(p.android.hasProperty('noDocs') && p.android.noDocs)) {
+            p.android.libraryVariants.all { v ->
+                if (v.name == 'release') {
+                    registerForDocs(p, v)
+                }
+            }
+        }
+    }
 }
 
 project.gradle.buildFinished { buildResult ->
@@ -305,7 +478,3 @@
         println()
     }
 }
-
-FileCollection getAndroidPrebuilt(String apiLevel) {
-    files("$rootDir/../../prebuilts/sdk/$apiLevel/android.jar")
-}
diff --git a/buildSrc/apiModule.gradle b/buildSrc/apiModule.gradle
index a67f29c..b3186b7 100644
--- a/buildSrc/apiModule.gradle
+++ b/buildSrc/apiModule.gradle
@@ -31,13 +31,15 @@
     sourceSets {
         main.manifest.srcFile '../AndroidManifest.xml'
         main.java.srcDirs = ['.']
-
+        main.res.srcDirs = []
         apiModule.resourceFolders.each {
             main.res.srcDirs += "../$it"
         }
+        main.assets.srcDirs = []
         apiModule.assetFolders.each {
             main.assets.srcDirs += "../$it"
         }
+        main.resources.srcDirs = []
         apiModule.javaResourceFolders.each {
             main.resources.srcDirs += "../$it"
         }
diff --git a/buildSrc/studioCompat.gradle b/buildSrc/studioCompat.gradle
index 140b438..0c6aa48 100644
--- a/buildSrc/studioCompat.gradle
+++ b/buildSrc/studioCompat.gradle
@@ -28,12 +28,8 @@
 def studioCompat = [
     enableApiModules : hasProperty('android.injected.invoked.from.ide'),
     modules : [
-        v4 : [
+        compat : [
             apiTargets : [
-                new ApiModule("donut",4),
-                new ApiModule("eclair",5),
-                new ApiModule("eclair-mr1", 7),
-                new ApiModule("froyo",8),
                 new ApiModule("gingerbread",9),
                 new ApiModule("honeycomb",11),
                 new ApiModule("honeycomb_mr1",12),
@@ -51,8 +47,59 @@
                 new ApiModule("api24", ApiModule.CURRENT)
             ],
             dependencies : [":support-annotations"],
-            folder : "v4",
-            moduleName : "support-v4"
+            folder : "compat",
+            moduleName : "support-compat"
+        ],
+        mediacompat : [
+                apiTargets : [
+                        new ApiModule("ics",14),
+                        new ApiModule("jellybean-mr2",18),
+                        new ApiModule("kitkat",19),
+                        new ApiModule("api21",21),
+                        new ApiModule("api22",22),
+                        new ApiModule("api23",23),
+                        new ApiModule("api24", ApiModule.CURRENT)
+                ],
+                dependencies : [":support-compat"],
+                folder : "media-compat",
+                moduleName : "support-media-compat"
+        ],
+        coreutils : [
+                apiTargets : [
+                        new ApiModule("gingerbread",9),
+                        new ApiModule("honeycomb",11),
+                        new ApiModule("jellybean", 16),
+                        new ApiModule("kitkat",19),
+                        new ApiModule("api20",20),
+                        new ApiModule("api21",21),
+                        new ApiModule("api23",23),
+                        new ApiModule("api24", ApiModule.CURRENT)
+                ],
+                dependencies : [":support-compat"],
+                folder : "v4",
+                moduleName : "support-core-utils"
+        ],
+        coreui : [
+                apiTargets : [
+                        new ApiModule("honeycomb",11),
+                        new ApiModule("ics",14),
+                        new ApiModule("jellybean-mr2",18),
+                        new ApiModule("api21",21)
+                ],
+                dependencies : [":support-compat"],
+                folder : "core-ui",
+                moduleName : "support-core-ui"
+        ],
+        fragment : [
+                apiTargets : [
+                        new ApiModule("gingerbread",9),
+                        new ApiModule("honeycomb",11),
+                        new ApiModule("jellybean", 16),
+                        new ApiModule("api21",21)
+                ],
+                dependencies : [":support-media-compat", ":support-core-ui", ":support-core-utils"],
+                folder : "fragment",
+                moduleName : "support-fragment"
         ],
         v13 : [
             apiTargets : [
@@ -72,7 +119,6 @@
                 new ApiModule("jellybean-mr2", 18),
                 new ApiModule("api24", ApiModule.CURRENT)
             ],
-            dependencies : [':support-appcompat-v7', ':support-palette-v7'],
             folder : "v7/mediarouter",
             moduleName : "support-mediarouter-v7"
         ]
@@ -154,4 +200,4 @@
     }
 }
 gradle.ext.studioCompat = studioCompat
-gradle.ext.getApiModule = this.&getApiModule
\ No newline at end of file
+gradle.ext.getApiModule = this.&getApiModule
diff --git a/compat/Android.mk b/compat/Android.mk
new file mode 100644
index 0000000..8fea612
--- /dev/null
+++ b/compat/Android.mk
@@ -0,0 +1,194 @@
+# 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.
+
+LOCAL_PATH := $(call my-dir)
+
+# A helper sub-library that makes direct use of Gingerbread APIs.
+include $(CLEAR_VARS)
+LOCAL_MODULE := android-support-compat-gingerbread
+LOCAL_SDK_VERSION := 9
+LOCAL_SRC_FILES := $(call all-java-files-under, gingerbread)
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-annotations
+LOCAL_JAVA_LANGUAGE_VERSION := 1.7
+include $(BUILD_STATIC_JAVA_LIBRARY)
+
+# -----------------------------------------------------------------------
+
+# A helper sub-library that makes direct use of Honeycomb APIs.
+include $(CLEAR_VARS)
+LOCAL_MODULE := android-support-compat-honeycomb
+LOCAL_SDK_VERSION := 11
+LOCAL_SRC_FILES := $(call all-java-files-under, honeycomb)
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-compat-gingerbread
+LOCAL_JAVA_LANGUAGE_VERSION := 1.7
+include $(BUILD_STATIC_JAVA_LIBRARY)
+
+# -----------------------------------------------------------------------
+
+# A helper sub-library that makes direct use of Honeycomb MR1 APIs.
+include $(CLEAR_VARS)
+LOCAL_MODULE := android-support-compat-honeycomb-mr1
+LOCAL_SDK_VERSION := 12
+LOCAL_SRC_FILES := $(call all-java-files-under, honeycomb_mr1)
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-compat-honeycomb
+LOCAL_JAVA_LANGUAGE_VERSION := 1.7
+include $(BUILD_STATIC_JAVA_LIBRARY)
+
+# -----------------------------------------------------------------------
+
+# A helper sub-library that makes direct use of Honeycomb MR2 APIs.
+include $(CLEAR_VARS)
+LOCAL_MODULE := android-support-compat-honeycomb-mr2
+LOCAL_SDK_VERSION := 13
+LOCAL_SRC_FILES := $(call all-java-files-under, honeycomb_mr2)
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-compat-honeycomb-mr1
+LOCAL_JAVA_LANGUAGE_VERSION := 1.7
+include $(BUILD_STATIC_JAVA_LIBRARY)
+
+# -----------------------------------------------------------------------
+
+# A helper sub-library that makes direct use of Ice Cream Sandwich APIs.
+include $(CLEAR_VARS)
+LOCAL_MODULE := android-support-compat-ics
+LOCAL_SDK_VERSION := 14
+LOCAL_SRC_FILES := $(call all-java-files-under, ics)
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-compat-honeycomb-mr2
+LOCAL_JAVA_LANGUAGE_VERSION := 1.7
+include $(BUILD_STATIC_JAVA_LIBRARY)
+
+# -----------------------------------------------------------------------
+
+# A helper sub-library that makes direct use of Ice Cream Sandwich MR1 APIs.
+include $(CLEAR_VARS)
+LOCAL_MODULE := android-support-compat-ics-mr1
+LOCAL_SDK_VERSION := 15
+LOCAL_SRC_FILES := $(call all-java-files-under, ics-mr1)
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-compat-ics
+LOCAL_JAVA_LANGUAGE_VERSION := 1.7
+include $(BUILD_STATIC_JAVA_LIBRARY)
+
+# -----------------------------------------------------------------------
+
+# A helper sub-library that makes direct use of JellyBean APIs.
+include $(CLEAR_VARS)
+LOCAL_MODULE := android-support-compat-jellybean
+LOCAL_SDK_VERSION := 16
+LOCAL_SRC_FILES := $(call all-java-files-under, jellybean)
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-compat-ics-mr1
+LOCAL_JAVA_LANGUAGE_VERSION := 1.7
+include $(BUILD_STATIC_JAVA_LIBRARY)
+
+# -----------------------------------------------------------------------
+
+# A helper sub-library that makes direct use of JellyBean MR1 APIs.
+include $(CLEAR_VARS)
+LOCAL_MODULE := android-support-compat-jellybean-mr1
+LOCAL_SDK_VERSION := 17
+LOCAL_SRC_FILES := $(call all-java-files-under, jellybean-mr1)
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-compat-jellybean
+LOCAL_JAVA_LANGUAGE_VERSION := 1.7
+include $(BUILD_STATIC_JAVA_LIBRARY)
+
+# -----------------------------------------------------------------------
+
+# A helper sub-library that makes direct use of JellyBean MR2 APIs.
+include $(CLEAR_VARS)
+LOCAL_MODULE := android-support-compat-jellybean-mr2
+LOCAL_SDK_VERSION := 18
+LOCAL_SRC_FILES := $(call all-java-files-under, jellybean-mr2)
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-compat-jellybean-mr1
+LOCAL_JAVA_LANGUAGE_VERSION := 1.7
+include $(BUILD_STATIC_JAVA_LIBRARY)
+
+# -----------------------------------------------------------------------
+
+# A helper sub-library that makes direct use of KitKat APIs.
+include $(CLEAR_VARS)
+LOCAL_MODULE := android-support-compat-kitkat
+LOCAL_SDK_VERSION := 19
+LOCAL_SRC_FILES := $(call all-java-files-under, kitkat)
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-compat-jellybean-mr2
+LOCAL_JAVA_LANGUAGE_VERSION := 1.7
+include $(BUILD_STATIC_JAVA_LIBRARY)
+
+# -----------------------------------------------------------------------
+
+# A helper sub-library that makes direct use of V20 APIs.
+include $(CLEAR_VARS)
+LOCAL_MODULE := android-support-compat-api20
+LOCAL_SDK_VERSION := 20
+LOCAL_SRC_FILES := $(call all-java-files-under, api20)
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-compat-kitkat
+LOCAL_JAVA_LANGUAGE_VERSION := 1.7
+include $(BUILD_STATIC_JAVA_LIBRARY)
+
+# -----------------------------------------------------------------------
+
+# A helper sub-library that makes direct use of Lollipop APIs.
+include $(CLEAR_VARS)
+LOCAL_MODULE := android-support-compat-api21
+LOCAL_SDK_VERSION := 21
+LOCAL_SRC_FILES := $(call all-java-files-under, api21)
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-compat-api20
+LOCAL_JAVA_LANGUAGE_VERSION := 1.7
+include $(BUILD_STATIC_JAVA_LIBRARY)
+
+# -----------------------------------------------------------------------
+
+# A helper sub-library that makes direct use of V22 APIs.
+include $(CLEAR_VARS)
+LOCAL_MODULE := android-support-compat-api22
+LOCAL_SDK_VERSION := 22
+LOCAL_SRC_FILES := $(call all-java-files-under, api22)
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-compat-api21
+LOCAL_JAVA_LANGUAGE_VERSION := 1.7
+include $(BUILD_STATIC_JAVA_LIBRARY)
+
+# -----------------------------------------------------------------------
+
+# A helper sub-library that makes direct use of V23 APIs.
+include $(CLEAR_VARS)
+LOCAL_MODULE := android-support-compat-api23
+LOCAL_SDK_VERSION := 23
+LOCAL_SRC_FILES := $(call all-java-files-under, api23)
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-compat-api22
+LOCAL_JAVA_LANGUAGE_VERSION := 1.7
+include $(BUILD_STATIC_JAVA_LIBRARY)
+
+# -----------------------------------------------------------------------
+
+# A helper sub-library that makes direct use of V24 APIs.
+include $(CLEAR_VARS)
+LOCAL_MODULE := android-support-compat-api24
+LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
+LOCAL_SRC_FILES := $(call all-java-files-under, api24)
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-compat-api23
+LOCAL_JAVA_LANGUAGE_VERSION := 1.7
+include $(BUILD_STATIC_JAVA_LIBRARY)
+
+# -----------------------------------------------------------------------
+
+# Here is the final static library that apps can link against.
+include $(CLEAR_VARS)
+LOCAL_USE_AAPT2 := true
+LOCAL_MODULE := android-support-compat
+LOCAL_SDK_VERSION := 9
+LOCAL_AIDL_INCLUDES := frameworks/support/compat/java
+LOCAL_SRC_FILES := $(call all-java-files-under, java) \
+    $(call all-Iaidl-files-under, java)
+LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
+LOCAL_STATIC_JAVA_LIBRARIES += android-support-compat-api24
+LOCAL_JAR_EXCLUDE_FILES := none
+LOCAL_JAVA_LANGUAGE_VERSION := 1.7
+include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/compat/AndroidManifest.xml b/compat/AndroidManifest.xml
new file mode 100644
index 0000000..b2bd5bb
--- /dev/null
+++ b/compat/AndroidManifest.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+          xmlns:tools="http://schemas.android.com/tools"
+          package="android.support.compat">
+    <uses-sdk android:minSdkVersion="9" tools:overrideLibrary="android.support.compat"/>
+    <application />
+</manifest>
diff --git a/v4/api20/android/support/v4/app/NotificationCompatApi20.java b/compat/api20/android/support/v4/app/NotificationCompatApi20.java
similarity index 100%
rename from v4/api20/android/support/v4/app/NotificationCompatApi20.java
rename to compat/api20/android/support/v4/app/NotificationCompatApi20.java
diff --git a/v4/api20/android/support/v4/app/RemoteInputCompatApi20.java b/compat/api20/android/support/v4/app/RemoteInputCompatApi20.java
similarity index 100%
rename from v4/api20/android/support/v4/app/RemoteInputCompatApi20.java
rename to compat/api20/android/support/v4/app/RemoteInputCompatApi20.java
diff --git a/compat/api20/android/support/v4/view/WindowInsetsCompatApi20.java b/compat/api20/android/support/v4/view/WindowInsetsCompatApi20.java
new file mode 100644
index 0000000..e29f6b0
--- /dev/null
+++ b/compat/api20/android/support/v4/view/WindowInsetsCompatApi20.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2016 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 android.support.v4.view;
+
+import android.view.WindowInsets;
+
+class WindowInsetsCompatApi20 {
+    public static Object consumeSystemWindowInsets(Object insets) {
+        return ((WindowInsets) insets).consumeSystemWindowInsets();
+    }
+
+    public static int getSystemWindowInsetBottom(Object insets) {
+        return ((WindowInsets) insets).getSystemWindowInsetBottom();
+    }
+
+    public static int getSystemWindowInsetLeft(Object insets) {
+        return ((WindowInsets) insets).getSystemWindowInsetLeft();
+    }
+
+    public static int getSystemWindowInsetRight(Object insets) {
+        return ((WindowInsets) insets).getSystemWindowInsetRight();
+    }
+
+    public static int getSystemWindowInsetTop(Object insets) {
+        return ((WindowInsets) insets).getSystemWindowInsetTop();
+    }
+
+    public static boolean hasInsets(Object insets) {
+        return ((WindowInsets) insets).hasInsets();
+    }
+
+    public static boolean hasSystemWindowInsets(Object insets) {
+        return ((WindowInsets) insets).hasSystemWindowInsets();
+    }
+
+    public static boolean isRound(Object insets) {
+        return ((WindowInsets) insets).isRound();
+    }
+
+    public static Object replaceSystemWindowInsets(Object insets, int left, int top, int right,
+            int bottom) {
+        return ((WindowInsets) insets).replaceSystemWindowInsets(left, top, right, bottom);
+    }
+
+    public static Object getSourceWindowInsets(Object src) {
+        return new WindowInsets((WindowInsets) src);
+    }
+}
diff --git a/v4/api21/android/support/v4/app/ActivityCompat21.java b/compat/api21/android/support/v4/app/ActivityCompat21.java
similarity index 100%
rename from v4/api21/android/support/v4/app/ActivityCompat21.java
rename to compat/api21/android/support/v4/app/ActivityCompat21.java
diff --git a/compat/api21/android/support/v4/app/ActivityOptionsCompat21.java b/compat/api21/android/support/v4/app/ActivityOptionsCompat21.java
new file mode 100644
index 0000000..85673bd
--- /dev/null
+++ b/compat/api21/android/support/v4/app/ActivityOptionsCompat21.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2014 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 android.support.v4.app;
+
+import android.app.Activity;
+import android.app.ActivityOptions;
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.os.Bundle;
+import android.util.Pair;
+import android.view.View;
+
+class ActivityOptionsCompat21 {
+
+    private final ActivityOptions mActivityOptions;
+
+    public static ActivityOptionsCompat21 makeCustomAnimation(Context context,
+            int enterResId, int exitResId) {
+        return new ActivityOptionsCompat21(
+            ActivityOptions.makeCustomAnimation(context, enterResId, exitResId));
+    }
+
+    public static ActivityOptionsCompat21 makeScaleUpAnimation(View source,
+            int startX, int startY, int startWidth, int startHeight) {
+        return new ActivityOptionsCompat21(
+            ActivityOptions.makeScaleUpAnimation(source, startX, startY, startWidth, startHeight));
+    }
+
+    public static ActivityOptionsCompat21 makeThumbnailScaleUpAnimation(View source,
+            Bitmap thumbnail, int startX, int startY) {
+        return new ActivityOptionsCompat21(
+            ActivityOptions.makeThumbnailScaleUpAnimation(source, thumbnail, startX, startY));
+    }
+
+    public static ActivityOptionsCompat21 makeSceneTransitionAnimation(Activity activity,
+            View sharedElement, String sharedElementName) {
+        return new ActivityOptionsCompat21(
+                ActivityOptions.makeSceneTransitionAnimation(activity, sharedElement,
+                        sharedElementName));
+    }
+
+    public static ActivityOptionsCompat21 makeSceneTransitionAnimation(Activity activity,
+            View[] sharedElements, String[] sharedElementNames) {
+        Pair[] pairs = null;
+        if (sharedElements != null) {
+            pairs = new Pair[sharedElements.length];
+            for (int i = 0; i < pairs.length; i++) {
+                pairs[i] = Pair.create(sharedElements[i], sharedElementNames[i]);
+            }
+        }
+        return new ActivityOptionsCompat21(
+                ActivityOptions.makeSceneTransitionAnimation(activity, pairs));
+    }
+
+    public static ActivityOptionsCompat21 makeTaskLaunchBehind() {
+        return new ActivityOptionsCompat21(
+                ActivityOptions.makeTaskLaunchBehind());
+    }
+
+    private ActivityOptionsCompat21(ActivityOptions activityOptions) {
+        mActivityOptions = activityOptions;
+    }
+
+    public Bundle toBundle() {
+        return mActivityOptions.toBundle();
+    }
+
+    public void update(ActivityOptionsCompat21 otherOptions) {
+        mActivityOptions.update(otherOptions.mActivityOptions);
+    }
+}
diff --git a/v4/api21/android/support/v4/app/NotificationCompatApi21.java b/compat/api21/android/support/v4/app/NotificationCompatApi21.java
similarity index 100%
rename from v4/api21/android/support/v4/app/NotificationCompatApi21.java
rename to compat/api21/android/support/v4/app/NotificationCompatApi21.java
diff --git a/v4/api21/android/support/v4/content/ContextCompatApi21.java b/compat/api21/android/support/v4/content/ContextCompatApi21.java
similarity index 100%
rename from v4/api21/android/support/v4/content/ContextCompatApi21.java
rename to compat/api21/android/support/v4/content/ContextCompatApi21.java
diff --git a/v4/api21/android/support/v4/content/res/ResourcesCompatApi21.java b/compat/api21/android/support/v4/content/res/ResourcesCompatApi21.java
similarity index 100%
rename from v4/api21/android/support/v4/content/res/ResourcesCompatApi21.java
rename to compat/api21/android/support/v4/content/res/ResourcesCompatApi21.java
diff --git a/compat/api21/android/support/v4/graphics/drawable/DrawableCompatLollipop.java b/compat/api21/android/support/v4/graphics/drawable/DrawableCompatLollipop.java
new file mode 100644
index 0000000..e43ed95
--- /dev/null
+++ b/compat/api21/android/support/v4/graphics/drawable/DrawableCompatLollipop.java
@@ -0,0 +1,110 @@
+/*
+ * Copyright (C) 2014 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 android.support.v4.graphics.drawable;
+
+import android.content.res.ColorStateList;
+import android.content.res.Resources;
+import android.graphics.ColorFilter;
+import android.graphics.PorterDuff;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.DrawableContainer;
+import android.graphics.drawable.InsetDrawable;
+import android.util.AttributeSet;
+
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+
+import java.io.IOException;
+
+/**
+ * Implementation of drawable compatibility that can call L APIs.
+ */
+class DrawableCompatLollipop {
+
+    public static void setHotspot(Drawable drawable, float x, float y) {
+        drawable.setHotspot(x, y);
+    }
+
+    public static void setHotspotBounds(Drawable drawable, int left, int top,
+            int right, int bottom) {
+        drawable.setHotspotBounds( left, top, right, bottom);
+    }
+
+    public static void setTint(Drawable drawable, int tint) {
+        drawable.setTint(tint);
+    }
+
+    public static void setTintList(Drawable drawable, ColorStateList tint) {
+        drawable.setTintList(tint);
+    }
+
+    public static void setTintMode(Drawable drawable, PorterDuff.Mode tintMode) {
+        drawable.setTintMode(tintMode);
+    }
+
+    public static Drawable wrapForTinting(final Drawable drawable) {
+        if (!(drawable instanceof TintAwareDrawable)) {
+            return new DrawableWrapperLollipop(drawable);
+        }
+        return drawable;
+    }
+
+    public static void applyTheme(Drawable drawable, Resources.Theme t) {
+        drawable.applyTheme(t);
+    }
+
+    public static boolean canApplyTheme(Drawable drawable) {
+        return drawable.canApplyTheme();
+    }
+
+    public static ColorFilter getColorFilter(Drawable drawable) {
+        return drawable.getColorFilter();
+    }
+
+    public static void clearColorFilter(Drawable drawable) {
+        drawable.clearColorFilter();
+
+        // API 21 + 22 have an issue where clearing a color filter on a DrawableContainer
+        // will not propagate to all of its children. To workaround this we unwrap the drawable
+        // to find any DrawableContainers, and then unwrap those to clear the filter on its
+        // children manually
+        if (drawable instanceof InsetDrawable) {
+            clearColorFilter(((InsetDrawable) drawable).getDrawable());
+        } else if (drawable instanceof DrawableWrapper) {
+            clearColorFilter(((DrawableWrapper) drawable).getWrappedDrawable());
+        } else if (drawable instanceof DrawableContainer) {
+            final DrawableContainer container = (DrawableContainer) drawable;
+            final DrawableContainer.DrawableContainerState state =
+                    (DrawableContainer.DrawableContainerState) container.getConstantState();
+            if (state != null) {
+                Drawable child;
+                for (int i = 0, count = state.getChildCount(); i < count; i++) {
+                    child = state.getChild(i);
+                    if (child != null) {
+                        clearColorFilter(child);
+                    }
+                }
+            }
+        }
+    }
+
+    public static void inflate(Drawable drawable, Resources res, XmlPullParser parser,
+                               AttributeSet attrs, Resources.Theme t)
+            throws IOException, XmlPullParserException {
+        drawable.inflate(res, parser, attrs, t);
+    }
+}
diff --git a/v4/api21/android/support/v4/graphics/drawable/DrawableWrapperLollipop.java b/compat/api21/android/support/v4/graphics/drawable/DrawableWrapperLollipop.java
similarity index 100%
rename from v4/api21/android/support/v4/graphics/drawable/DrawableWrapperLollipop.java
rename to compat/api21/android/support/v4/graphics/drawable/DrawableWrapperLollipop.java
diff --git a/v4/api21/android/support/v4/view/LayoutInflaterCompatLollipop.java b/compat/api21/android/support/v4/view/LayoutInflaterCompatLollipop.java
similarity index 100%
rename from v4/api21/android/support/v4/view/LayoutInflaterCompatLollipop.java
rename to compat/api21/android/support/v4/view/LayoutInflaterCompatLollipop.java
diff --git a/compat/api21/android/support/v4/view/ViewCompatLollipop.java b/compat/api21/android/support/v4/view/ViewCompatLollipop.java
new file mode 100644
index 0000000..478e37e
--- /dev/null
+++ b/compat/api21/android/support/v4/view/ViewCompatLollipop.java
@@ -0,0 +1,254 @@
+/*
+ * Copyright (C) 2014 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 android.support.v4.view;
+
+import android.content.res.ColorStateList;
+import android.graphics.PorterDuff;
+import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
+import android.os.Build;
+import android.view.View;
+import android.view.ViewParent;
+import android.view.WindowInsets;
+
+class ViewCompatLollipop {
+
+    public interface OnApplyWindowInsetsListenerBridge {
+        Object onApplyWindowInsets(View v, Object insets);
+    }
+
+    private static ThreadLocal<Rect> sThreadLocalRect;
+
+    public static void setTransitionName(View view, String transitionName) {
+        view.setTransitionName(transitionName);
+    }
+
+    public static String getTransitionName(View view) {
+        return view.getTransitionName();
+    }
+
+    public static void requestApplyInsets(View view) {
+        view.requestApplyInsets();
+    }
+
+    public static void setElevation(View view, float elevation) {
+        view.setElevation(elevation);
+    }
+
+    public static float getElevation(View view) {
+        return view.getElevation();
+    }
+
+    public static void setTranslationZ(View view, float translationZ) {
+        view.setTranslationZ(translationZ);
+    }
+
+    public static float getTranslationZ(View view) {
+        return view.getTranslationZ();
+    }
+
+    public static void setOnApplyWindowInsetsListener(
+            View view, final OnApplyWindowInsetsListenerBridge bridge) {
+        if (bridge == null) {
+            view.setOnApplyWindowInsetsListener(null);
+        } else {
+            view.setOnApplyWindowInsetsListener(new View.OnApplyWindowInsetsListener() {
+                @Override
+                public WindowInsets onApplyWindowInsets(View view, WindowInsets insets) {
+                    return (WindowInsets) bridge.onApplyWindowInsets(view, insets);
+                }
+            });
+        }
+    }
+
+    public static boolean isImportantForAccessibility(View view) {
+        return view.isImportantForAccessibility();
+    }
+
+    static ColorStateList getBackgroundTintList(View view) {
+        return view.getBackgroundTintList();
+    }
+
+    static void setBackgroundTintList(View view, ColorStateList tintList) {
+        view.setBackgroundTintList(tintList);
+
+        if (Build.VERSION.SDK_INT == 21) {
+            // Work around a bug in L that did not update the state of the background
+            // after applying the tint
+            Drawable background = view.getBackground();
+            boolean hasTint = (view.getBackgroundTintList() != null)
+                    && (view.getBackgroundTintMode() != null);
+            if ((background != null) && hasTint) {
+                if (background.isStateful()) {
+                    background.setState(view.getDrawableState());
+                }
+                view.setBackground(background);
+            }
+        }
+    }
+
+    static PorterDuff.Mode getBackgroundTintMode(View view) {
+        return view.getBackgroundTintMode();
+    }
+
+    static void setBackgroundTintMode(View view, PorterDuff.Mode mode) {
+        view.setBackgroundTintMode(mode);
+
+        if (Build.VERSION.SDK_INT == 21) {
+            // Work around a bug in L that did not update the state of the background
+            // after applying the tint
+            Drawable background = view.getBackground();
+            boolean hasTint = (view.getBackgroundTintList() != null)
+                    && (view.getBackgroundTintMode() != null);
+            if ((background != null) && hasTint) {
+                if (background.isStateful()) {
+                    background.setState(view.getDrawableState());
+                }
+                view.setBackground(background);
+            }
+        }
+    }
+
+    public static Object onApplyWindowInsets(View v, Object insets) {
+        WindowInsets unwrapped = (WindowInsets) insets;
+        WindowInsets result = v.onApplyWindowInsets(unwrapped);
+        if (result != unwrapped) {
+            insets = new WindowInsets(result);
+        }
+        return insets;
+    }
+
+    public static Object dispatchApplyWindowInsets(View v, Object insets) {
+        WindowInsets unwrapped = (WindowInsets) insets;
+        WindowInsets result = v.dispatchApplyWindowInsets(unwrapped);
+        if (result != unwrapped) {
+            insets = new WindowInsets(result);
+        }
+        return insets;
+    }
+
+    public static void setNestedScrollingEnabled(View view, boolean enabled) {
+        view.setNestedScrollingEnabled(enabled);
+    }
+
+    public static boolean isNestedScrollingEnabled(View view) {
+        return view.isNestedScrollingEnabled();
+    }
+
+    public static boolean startNestedScroll(View view, int axes) {
+        return view.startNestedScroll(axes);
+    }
+
+    public static void stopNestedScroll(View view) {
+        view.stopNestedScroll();
+    }
+
+    public static boolean hasNestedScrollingParent(View view) {
+        return view.hasNestedScrollingParent();
+    }
+
+    public static boolean dispatchNestedScroll(View view, int dxConsumed, int dyConsumed,
+            int dxUnconsumed, int dyUnconsumed, int[] offsetInWindow) {
+        return view.dispatchNestedScroll(dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed,
+                offsetInWindow);
+    }
+
+    public static boolean dispatchNestedPreScroll(View view, int dx, int dy, int[] consumed,
+            int[] offsetInWindow) {
+        return view.dispatchNestedPreScroll(dx, dy, consumed, offsetInWindow);
+    }
+
+    public static boolean dispatchNestedFling(View view, float velocityX, float velocityY,
+            boolean consumed) {
+        return view.dispatchNestedFling(velocityX, velocityY, consumed);
+    }
+
+    public static boolean dispatchNestedPreFling(View view, float velocityX, float velocityY) {
+        return view.dispatchNestedPreFling(velocityX, velocityY);
+    }
+
+    public static float getZ(View view) {
+        return view.getZ();
+    }
+
+    public static void setZ(View view, float z) {
+        view.setZ(z);
+    }
+
+    static void offsetTopAndBottom(final View view, final int offset) {
+        final Rect parentRect = getEmptyTempRect();
+        boolean needInvalidateWorkaround = false;
+
+        final ViewParent parent = view.getParent();
+        if (parent instanceof View) {
+            final View p = (View) parent;
+            parentRect.set(p.getLeft(), p.getTop(), p.getRight(), p.getBottom());
+            // If the view currently does not currently intersect the parent (and is therefore
+            // not displayed) we may need need to invalidate
+            needInvalidateWorkaround = !parentRect.intersects(view.getLeft(), view.getTop(),
+                    view.getRight(), view.getBottom());
+        }
+
+        // Now offset, invoking the API 11+ implementation (which contains it's own workarounds)
+        ViewCompatHC.offsetTopAndBottom(view, offset);
+
+        // The view has now been offset, so let's intersect the Rect and invalidate where
+        // the View is now displayed
+        if (needInvalidateWorkaround && parentRect.intersect(view.getLeft(), view.getTop(),
+                view.getRight(), view.getBottom())) {
+            ((View) parent).invalidate(parentRect);
+        }
+    }
+
+    static void offsetLeftAndRight(final View view, final int offset) {
+        final Rect parentRect = getEmptyTempRect();
+        boolean needInvalidateWorkaround = false;
+
+        final ViewParent parent = view.getParent();
+        if (parent instanceof View) {
+            final View p = (View) parent;
+            parentRect.set(p.getLeft(), p.getTop(), p.getRight(), p.getBottom());
+            // If the view currently does not currently intersect the parent (and is therefore
+            // not displayed) we may need need to invalidate
+            needInvalidateWorkaround = !parentRect.intersects(view.getLeft(), view.getTop(),
+                    view.getRight(), view.getBottom());
+        }
+
+        // Now offset, invoking the API 11+ implementation (which contains it's own workarounds)
+        ViewCompatHC.offsetLeftAndRight(view, offset);
+
+        // The view has now been offset, so let's intersect the Rect and invalidate where
+        // the View is now displayed
+        if (needInvalidateWorkaround && parentRect.intersect(view.getLeft(), view.getTop(),
+                view.getRight(), view.getBottom())) {
+            ((View) parent).invalidate(parentRect);
+        }
+    }
+
+    private static Rect getEmptyTempRect() {
+        if (sThreadLocalRect == null) {
+            sThreadLocalRect = new ThreadLocal<>();
+        }
+        Rect rect = sThreadLocalRect.get();
+        if (rect == null) {
+            rect = new Rect();
+            sThreadLocalRect.set(rect);
+        }
+        rect.setEmpty();
+        return rect;
+    }
+}
diff --git a/v4/api21/android/support/v4/view/ViewGroupCompatLollipop.java b/compat/api21/android/support/v4/view/ViewGroupCompatLollipop.java
similarity index 100%
rename from v4/api21/android/support/v4/view/ViewGroupCompatLollipop.java
rename to compat/api21/android/support/v4/view/ViewGroupCompatLollipop.java
diff --git a/v4/api21/android/support/v4/view/ViewParentCompatLollipop.java b/compat/api21/android/support/v4/view/ViewParentCompatLollipop.java
similarity index 100%
rename from v4/api21/android/support/v4/view/ViewParentCompatLollipop.java
rename to compat/api21/android/support/v4/view/ViewParentCompatLollipop.java
diff --git a/v4/api21/android/support/v4/view/ViewPropertyAnimatorCompatLollipop.java b/compat/api21/android/support/v4/view/ViewPropertyAnimatorCompatLollipop.java
similarity index 100%
rename from v4/api21/android/support/v4/view/ViewPropertyAnimatorCompatLollipop.java
rename to compat/api21/android/support/v4/view/ViewPropertyAnimatorCompatLollipop.java
diff --git a/compat/api21/android/support/v4/view/WindowInsetsCompatApi21.java b/compat/api21/android/support/v4/view/WindowInsetsCompatApi21.java
new file mode 100644
index 0000000..3fcbfed
--- /dev/null
+++ b/compat/api21/android/support/v4/view/WindowInsetsCompatApi21.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2014 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 android.support.v4.view;
+
+import android.graphics.Rect;
+import android.view.WindowInsets;
+
+class WindowInsetsCompatApi21 {
+    public static Object consumeStableInsets(Object insets) {
+        return ((WindowInsets) insets).consumeStableInsets();
+    }
+
+    public static int getStableInsetBottom(Object insets) {
+        return ((WindowInsets) insets).getStableInsetBottom();
+    }
+
+    public static int getStableInsetLeft(Object insets) {
+        return ((WindowInsets) insets).getStableInsetLeft();
+    }
+
+    public static int getStableInsetRight(Object insets) {
+        return ((WindowInsets) insets).getStableInsetRight();
+    }
+
+    public static int getStableInsetTop(Object insets) {
+        return ((WindowInsets) insets).getStableInsetTop();
+    }
+
+    public static boolean hasStableInsets(Object insets) {
+        return ((WindowInsets) insets).hasStableInsets();
+    }
+
+    public static boolean isConsumed(Object insets) {
+        return ((WindowInsets) insets).isConsumed();
+    }
+
+    public static Object replaceSystemWindowInsets(Object insets, Rect systemWindowInsets) {
+        return ((WindowInsets) insets).replaceSystemWindowInsets(systemWindowInsets);
+    }
+}
diff --git a/compat/api21/android/support/v4/view/accessibility/AccessibilityNodeInfoCompatApi21.java b/compat/api21/android/support/v4/view/accessibility/AccessibilityNodeInfoCompatApi21.java
new file mode 100644
index 0000000..0ac8e9d
--- /dev/null
+++ b/compat/api21/android/support/v4/view/accessibility/AccessibilityNodeInfoCompatApi21.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright (C) 2014 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 android.support.v4.view.accessibility;
+
+import android.view.View;
+import android.view.accessibility.AccessibilityNodeInfo;
+import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction;
+
+import java.util.List;
+
+/**
+ * Api21-specific AccessibilityNodeInfo API implementation.
+ */
+class AccessibilityNodeInfoCompatApi21 {
+    static List<Object> getActionList(Object info) {
+        Object result = ((AccessibilityNodeInfo) info).getActionList();
+        return (List<Object>) result;
+    }
+
+    static void addAction(Object info, Object action) {
+        ((AccessibilityNodeInfo) info).addAction((AccessibilityAction) action);
+    }
+
+    public static boolean removeAction(Object info, Object action) {
+        return ((AccessibilityNodeInfo) info).removeAction((AccessibilityAction) action);
+    }
+
+    public static Object obtainCollectionInfo(int rowCount, int columnCount,
+            boolean hierarchical, int selectionMode) {
+        return AccessibilityNodeInfo.CollectionInfo.obtain(rowCount, columnCount, hierarchical,
+                selectionMode);
+    }
+
+    public static Object obtainCollectionItemInfo(int rowIndex, int rowSpan, int columnIndex,
+            int columnSpan, boolean heading, boolean selected) {
+        return AccessibilityNodeInfo.CollectionItemInfo.obtain(rowIndex, rowSpan, columnIndex,
+                columnSpan, heading, selected);
+    }
+
+    public static CharSequence getError(Object info) {
+        return ((AccessibilityNodeInfo) info).getError();
+    }
+
+    public static void setError(Object info, CharSequence error) {
+        ((AccessibilityNodeInfo) info).setError(error);
+    }
+
+    public static void setMaxTextLength(Object info, int max) {
+        ((AccessibilityNodeInfo) info).setMaxTextLength(max);
+    }
+
+    public static int getMaxTextLength(Object info) {
+        return ((AccessibilityNodeInfo) info).getMaxTextLength();
+    }
+
+    public static Object getWindow(Object info) {
+        return ((AccessibilityNodeInfo) info).getWindow();
+    }
+
+    public static boolean removeChild(Object info, View child) {
+        return ((AccessibilityNodeInfo) info).removeChild(child);
+    }
+
+    public static boolean removeChild(Object info, View root, int virtualDescendantId) {
+        return ((AccessibilityNodeInfo) info).removeChild(root, virtualDescendantId);
+    }
+
+    static class CollectionInfo {
+        public static int getSelectionMode(Object info) {
+            return ((AccessibilityNodeInfo.CollectionInfo) info).getSelectionMode();
+        }
+    }
+
+    static class CollectionItemInfo {
+        public static boolean isSelected(Object info) {
+            return ((AccessibilityNodeInfo.CollectionItemInfo) info).isSelected();
+        }
+    }
+
+    static Object newAccessibilityAction(int actionId, CharSequence label) {
+        return new AccessibilityAction(actionId, label);
+    }
+
+    static int getAccessibilityActionId(Object action) {
+        return ((AccessibilityNodeInfo.AccessibilityAction) action).getId();
+    }
+
+    static CharSequence getAccessibilityActionLabel(Object action) {
+        return ((AccessibilityNodeInfo.AccessibilityAction) action).getLabel();
+    }
+}
diff --git a/v4/api21/android/support/v4/view/accessibility/AccessibilityWindowInfoCompatApi21.java b/compat/api21/android/support/v4/view/accessibility/AccessibilityWindowInfoCompatApi21.java
similarity index 100%
rename from v4/api21/android/support/v4/view/accessibility/AccessibilityWindowInfoCompatApi21.java
rename to compat/api21/android/support/v4/view/accessibility/AccessibilityWindowInfoCompatApi21.java
diff --git a/v4/api21/android/support/v4/view/animation/PathInterpolatorCompatApi21.java b/compat/api21/android/support/v4/view/animation/PathInterpolatorCompatApi21.java
similarity index 100%
rename from v4/api21/android/support/v4/view/animation/PathInterpolatorCompatApi21.java
rename to compat/api21/android/support/v4/view/animation/PathInterpolatorCompatApi21.java
diff --git a/v4/api21/android/support/v4/widget/CompoundButtonCompatLollipop.java b/compat/api21/android/support/v4/widget/CompoundButtonCompatLollipop.java
similarity index 100%
rename from v4/api21/android/support/v4/widget/CompoundButtonCompatLollipop.java
rename to compat/api21/android/support/v4/widget/CompoundButtonCompatLollipop.java
diff --git a/v4/api21/android/support/v4/widget/EdgeEffectCompatLollipop.java b/compat/api21/android/support/v4/widget/EdgeEffectCompatLollipop.java
similarity index 100%
rename from v4/api21/android/support/v4/widget/EdgeEffectCompatLollipop.java
rename to compat/api21/android/support/v4/widget/EdgeEffectCompatLollipop.java
diff --git a/v4/api21/android/support/v4/widget/PopupWindowCompatApi21.java b/compat/api21/android/support/v4/widget/PopupWindowCompatApi21.java
similarity index 100%
rename from v4/api21/android/support/v4/widget/PopupWindowCompatApi21.java
rename to compat/api21/android/support/v4/widget/PopupWindowCompatApi21.java
diff --git a/v4/api22/android/support/v4/app/ActivityCompat22.java b/compat/api22/android/support/v4/app/ActivityCompat22.java
similarity index 100%
rename from v4/api22/android/support/v4/app/ActivityCompat22.java
rename to compat/api22/android/support/v4/app/ActivityCompat22.java
diff --git a/v4/api22/android/support/v4/view/accessibility/AccessibilityNodeInfoCompatApi22.java b/compat/api22/android/support/v4/view/accessibility/AccessibilityNodeInfoCompatApi22.java
similarity index 100%
rename from v4/api22/android/support/v4/view/accessibility/AccessibilityNodeInfoCompatApi22.java
rename to compat/api22/android/support/v4/view/accessibility/AccessibilityNodeInfoCompatApi22.java
diff --git a/compat/api23/android/support/v4/app/ActivityCompatApi23.java b/compat/api23/android/support/v4/app/ActivityCompatApi23.java
new file mode 100644
index 0000000..5ed84df
--- /dev/null
+++ b/compat/api23/android/support/v4/app/ActivityCompatApi23.java
@@ -0,0 +1,132 @@
+/*
+ * Copyright (C) 2015 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 android.support.v4.app;
+
+import android.app.Activity;
+import android.app.SharedElementCallback;
+import android.content.Context;
+import android.graphics.Matrix;
+import android.graphics.RectF;
+import android.os.Parcelable;
+import android.view.View;
+
+import java.util.List;
+import java.util.Map;
+
+class ActivityCompatApi23 {
+    public interface OnSharedElementsReadyListenerBridge {
+        void onSharedElementsReady();
+    }
+
+    public interface RequestPermissionsRequestCodeValidator {
+        void validateRequestPermissionsRequestCode(int requestCode);
+    }
+
+    public static void requestPermissions(Activity activity, String[] permissions,
+            int requestCode) {
+        if (activity instanceof RequestPermissionsRequestCodeValidator) {
+            ((RequestPermissionsRequestCodeValidator) activity)
+                    .validateRequestPermissionsRequestCode(requestCode);
+        }
+        activity.requestPermissions(permissions, requestCode);
+    }
+
+    public static boolean shouldShowRequestPermissionRationale(Activity activity,
+            String permission) {
+        return activity.shouldShowRequestPermissionRationale(permission);
+    }
+
+    public static void setEnterSharedElementCallback(Activity activity,
+            SharedElementCallback23 callback) {
+        activity.setEnterSharedElementCallback(createCallback(callback));
+    }
+
+    public static void setExitSharedElementCallback(Activity activity,
+            SharedElementCallback23 callback) {
+        activity.setExitSharedElementCallback(createCallback(callback));
+    }
+
+    private static SharedElementCallback createCallback(SharedElementCallback23 callback) {
+        SharedElementCallback newListener = null;
+        if (callback != null) {
+            newListener = new SharedElementCallbackImpl(callback);
+        }
+        return newListener;
+    }
+
+    public abstract static class SharedElementCallback23
+            extends ActivityCompat21.SharedElementCallback21 {
+        public abstract void onSharedElementsArrived(List<String> sharedElementNames,
+                List<View> sharedElements, OnSharedElementsReadyListenerBridge listener);
+    }
+
+    private static class SharedElementCallbackImpl extends SharedElementCallback {
+        private SharedElementCallback23 mCallback;
+
+        public SharedElementCallbackImpl(SharedElementCallback23 callback) {
+            mCallback = callback;
+        }
+
+        @Override
+        public void onSharedElementStart(List<String> sharedElementNames,
+                List<View> sharedElements, List<View> sharedElementSnapshots) {
+            mCallback.onSharedElementStart(sharedElementNames, sharedElements,
+                    sharedElementSnapshots);
+        }
+
+        @Override
+        public void onSharedElementEnd(List<String> sharedElementNames, List<View> sharedElements,
+                List<View> sharedElementSnapshots) {
+            mCallback.onSharedElementEnd(sharedElementNames, sharedElements,
+                    sharedElementSnapshots);
+        }
+
+        @Override
+        public void onRejectSharedElements(List<View> rejectedSharedElements) {
+            mCallback.onRejectSharedElements(rejectedSharedElements);
+        }
+
+        @Override
+        public void onMapSharedElements(List<String> names, Map<String, View> sharedElements) {
+            mCallback.onMapSharedElements(names, sharedElements);
+        }
+
+        @Override
+        public Parcelable onCaptureSharedElementSnapshot(View sharedElement,
+                Matrix viewToGlobalMatrix, RectF screenBounds) {
+            return mCallback.onCaptureSharedElementSnapshot(sharedElement, viewToGlobalMatrix,
+                            screenBounds);
+        }
+
+        @Override
+        public View onCreateSnapshotView(Context context, Parcelable snapshot) {
+            return mCallback.onCreateSnapshotView(context, snapshot);
+        }
+
+        @Override
+        public void onSharedElementsArrived(List<String> sharedElementNames,
+                List<View> sharedElements, final OnSharedElementsReadyListener listener) {
+            mCallback.onSharedElementsArrived(sharedElementNames, sharedElements,
+                    new OnSharedElementsReadyListenerBridge() {
+                        @Override
+                        public void onSharedElementsReady() {
+                            listener.onSharedElementsReady();
+                        }
+                    });
+        }
+    }
+}
diff --git a/compat/api23/android/support/v4/app/ActivityOptionsCompat23.java b/compat/api23/android/support/v4/app/ActivityOptionsCompat23.java
new file mode 100644
index 0000000..b33fb11
--- /dev/null
+++ b/compat/api23/android/support/v4/app/ActivityOptionsCompat23.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2014 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 android.support.v4.app;
+
+import android.app.Activity;
+import android.app.ActivityOptions;
+import android.app.PendingIntent;
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.os.Bundle;
+import android.util.Pair;
+import android.view.View;
+
+class ActivityOptionsCompat23 {
+
+    private final ActivityOptions mActivityOptions;
+
+    public static ActivityOptionsCompat23 makeCustomAnimation(Context context,
+            int enterResId, int exitResId) {
+        return new ActivityOptionsCompat23(
+            ActivityOptions.makeCustomAnimation(context, enterResId, exitResId));
+    }
+
+    public static ActivityOptionsCompat23 makeScaleUpAnimation(View source,
+            int startX, int startY, int startWidth, int startHeight) {
+        return new ActivityOptionsCompat23(
+            ActivityOptions.makeScaleUpAnimation(source, startX, startY, startWidth, startHeight));
+    }
+
+    public static ActivityOptionsCompat23 makeThumbnailScaleUpAnimation(View source,
+            Bitmap thumbnail, int startX, int startY) {
+        return new ActivityOptionsCompat23(
+            ActivityOptions.makeThumbnailScaleUpAnimation(source, thumbnail, startX, startY));
+    }
+
+    public static ActivityOptionsCompat23 makeSceneTransitionAnimation(Activity activity,
+            View sharedElement, String sharedElementName) {
+        return new ActivityOptionsCompat23(
+                ActivityOptions.makeSceneTransitionAnimation(activity, sharedElement,
+                        sharedElementName));
+    }
+
+    public static ActivityOptionsCompat23 makeSceneTransitionAnimation(Activity activity,
+            View[] sharedElements, String[] sharedElementNames) {
+        Pair[] pairs = null;
+        if (sharedElements != null) {
+            pairs = new Pair[sharedElements.length];
+            for (int i = 0; i < pairs.length; i++) {
+                pairs[i] = Pair.create(sharedElements[i], sharedElementNames[i]);
+            }
+        }
+        return new ActivityOptionsCompat23(
+                ActivityOptions.makeSceneTransitionAnimation(activity, pairs));
+    }
+
+    public static ActivityOptionsCompat23 makeClipRevealAnimation(View source,
+            int startX, int startY, int width, int height) {
+        return new ActivityOptionsCompat23(
+            ActivityOptions.makeClipRevealAnimation(source, startX, startY, width, height));
+    }
+
+    public static ActivityOptionsCompat23 makeTaskLaunchBehind() {
+        return new ActivityOptionsCompat23(
+                ActivityOptions.makeTaskLaunchBehind());
+    }
+
+    public static ActivityOptionsCompat23 makeBasic() {
+        return new ActivityOptionsCompat23(ActivityOptions.makeBasic());
+    }
+
+    private ActivityOptionsCompat23(ActivityOptions activityOptions) {
+        mActivityOptions = activityOptions;
+    }
+
+    public Bundle toBundle() {
+        return mActivityOptions.toBundle();
+    }
+
+    public void update(ActivityOptionsCompat23 otherOptions) {
+        mActivityOptions.update(otherOptions.mActivityOptions);
+    }
+
+    public void requestUsageTimeReport(PendingIntent receiver) {
+        mActivityOptions.requestUsageTimeReport(receiver);
+    }
+}
diff --git a/v4/api23/android/support/v4/app/AppOpsManagerCompat23.java b/compat/api23/android/support/v4/app/AppOpsManagerCompat23.java
similarity index 100%
rename from v4/api23/android/support/v4/app/AppOpsManagerCompat23.java
rename to compat/api23/android/support/v4/app/AppOpsManagerCompat23.java
diff --git a/v4/api23/android/support/v4/app/NotificationCompatApi23.java b/compat/api23/android/support/v4/app/NotificationCompatApi23.java
similarity index 100%
rename from v4/api23/android/support/v4/app/NotificationCompatApi23.java
rename to compat/api23/android/support/v4/app/NotificationCompatApi23.java
diff --git a/v4/api23/android/support/v4/content/ContextCompatApi23.java b/compat/api23/android/support/v4/content/ContextCompatApi23.java
similarity index 100%
rename from v4/api23/android/support/v4/content/ContextCompatApi23.java
rename to compat/api23/android/support/v4/content/ContextCompatApi23.java
diff --git a/v4/api23/android/support/v4/content/res/ResourcesCompatApi23.java b/compat/api23/android/support/v4/content/res/ResourcesCompatApi23.java
similarity index 100%
rename from v4/api23/android/support/v4/content/res/ResourcesCompatApi23.java
rename to compat/api23/android/support/v4/content/res/ResourcesCompatApi23.java
diff --git a/v4/api23/android/support/v4/graphics/drawable/DrawableCompatApi23.java b/compat/api23/android/support/v4/graphics/drawable/DrawableCompatApi23.java
similarity index 100%
rename from v4/api23/android/support/v4/graphics/drawable/DrawableCompatApi23.java
rename to compat/api23/android/support/v4/graphics/drawable/DrawableCompatApi23.java
diff --git a/v4/api23/android/support/v4/hardware/fingerprint/FingerprintManagerCompatApi23.java b/compat/api23/android/support/v4/hardware/fingerprint/FingerprintManagerCompatApi23.java
similarity index 100%
rename from v4/api23/android/support/v4/hardware/fingerprint/FingerprintManagerCompatApi23.java
rename to compat/api23/android/support/v4/hardware/fingerprint/FingerprintManagerCompatApi23.java
diff --git a/v4/api23/android/support/v4/text/ICUCompatApi23.java b/compat/api23/android/support/v4/text/ICUCompatApi23.java
similarity index 100%
rename from v4/api23/android/support/v4/text/ICUCompatApi23.java
rename to compat/api23/android/support/v4/text/ICUCompatApi23.java
diff --git a/v4/api23/android/support/v4/view/ViewCompatMarshmallow.java b/compat/api23/android/support/v4/view/ViewCompatMarshmallow.java
similarity index 100%
rename from v4/api23/android/support/v4/view/ViewCompatMarshmallow.java
rename to compat/api23/android/support/v4/view/ViewCompatMarshmallow.java
diff --git a/compat/api23/android/support/v4/view/accessibility/AccessibilityNodeInfoCompatApi23.java b/compat/api23/android/support/v4/view/accessibility/AccessibilityNodeInfoCompatApi23.java
new file mode 100644
index 0000000..e6175c9
--- /dev/null
+++ b/compat/api23/android/support/v4/view/accessibility/AccessibilityNodeInfoCompatApi23.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2016 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 android.support.v4.view.accessibility;
+
+import android.view.accessibility.AccessibilityNodeInfo;
+
+class AccessibilityNodeInfoCompatApi23 {
+    public static Object getActionScrollToPosition() {
+        return AccessibilityNodeInfo.AccessibilityAction.ACTION_SCROLL_TO_POSITION;
+    }
+
+    public static boolean isContextClickable(Object info) {
+        return ((AccessibilityNodeInfo) info).isContextClickable();
+    }
+
+    public static void setContextClickable(Object info, boolean contextClickable) {
+        ((AccessibilityNodeInfo) info).setContextClickable(contextClickable);
+    }
+
+    public static Object getActionShowOnScreen() {
+        return AccessibilityNodeInfo.AccessibilityAction.ACTION_SHOW_ON_SCREEN;
+    }
+
+    public static Object getActionScrollUp() {
+        return AccessibilityNodeInfo.AccessibilityAction.ACTION_SCROLL_UP;
+    }
+
+    public static Object getActionScrollDown() {
+        return AccessibilityNodeInfo.AccessibilityAction.ACTION_SCROLL_DOWN;
+    }
+
+    public static Object getActionScrollLeft() {
+        return AccessibilityNodeInfo.AccessibilityAction.ACTION_SCROLL_LEFT;
+    }
+
+    public static Object getActionScrollRight() {
+        return AccessibilityNodeInfo.AccessibilityAction.ACTION_SCROLL_RIGHT;
+    }
+
+    public static Object getActionContextClick() {
+        return AccessibilityNodeInfo.AccessibilityAction.ACTION_CONTEXT_CLICK;
+    }
+}
diff --git a/v4/api23/android/support/v4/widget/CompoundButtonCompatApi23.java b/compat/api23/android/support/v4/widget/CompoundButtonCompatApi23.java
similarity index 100%
rename from v4/api23/android/support/v4/widget/CompoundButtonCompatApi23.java
rename to compat/api23/android/support/v4/widget/CompoundButtonCompatApi23.java
diff --git a/v4/api23/android/support/v4/widget/PopupWindowCompatApi23.java b/compat/api23/android/support/v4/widget/PopupWindowCompatApi23.java
similarity index 100%
rename from v4/api23/android/support/v4/widget/PopupWindowCompatApi23.java
rename to compat/api23/android/support/v4/widget/PopupWindowCompatApi23.java
diff --git a/v4/api23/android/support/v4/widget/TextViewCompatApi23.java b/compat/api23/android/support/v4/widget/TextViewCompatApi23.java
similarity index 100%
rename from v4/api23/android/support/v4/widget/TextViewCompatApi23.java
rename to compat/api23/android/support/v4/widget/TextViewCompatApi23.java
diff --git a/compat/api24/android/support/v4/app/ActivityOptionsCompat24.java b/compat/api24/android/support/v4/app/ActivityOptionsCompat24.java
new file mode 100644
index 0000000..4d166e4
--- /dev/null
+++ b/compat/api24/android/support/v4/app/ActivityOptionsCompat24.java
@@ -0,0 +1,110 @@
+/*
+ * Copyright (C) 2014 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 android.support.v4.app;
+
+import android.app.Activity;
+import android.app.ActivityOptions;
+import android.app.PendingIntent;
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.Rect;
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.util.Pair;
+import android.view.View;
+
+class ActivityOptionsCompat24 {
+
+    public static ActivityOptionsCompat24 makeCustomAnimation(Context context,
+            int enterResId, int exitResId) {
+        return new ActivityOptionsCompat24(
+            ActivityOptions.makeCustomAnimation(context, enterResId, exitResId));
+    }
+
+    public static ActivityOptionsCompat24 makeScaleUpAnimation(View source,
+            int startX, int startY, int startWidth, int startHeight) {
+        return new ActivityOptionsCompat24(
+            ActivityOptions.makeScaleUpAnimation(source, startX, startY, startWidth, startHeight));
+    }
+
+    public static ActivityOptionsCompat24 makeThumbnailScaleUpAnimation(View source,
+            Bitmap thumbnail, int startX, int startY) {
+        return new ActivityOptionsCompat24(
+            ActivityOptions.makeThumbnailScaleUpAnimation(source, thumbnail, startX, startY));
+    }
+
+    public static ActivityOptionsCompat24 makeSceneTransitionAnimation(Activity activity,
+            View sharedElement, String sharedElementName) {
+        return new ActivityOptionsCompat24(
+                ActivityOptions.makeSceneTransitionAnimation(activity, sharedElement,
+                        sharedElementName));
+    }
+
+    public static ActivityOptionsCompat24 makeSceneTransitionAnimation(Activity activity,
+            View[] sharedElements, String[] sharedElementNames) {
+        Pair[] pairs = null;
+        if (sharedElements != null) {
+            pairs = new Pair[sharedElements.length];
+            for (int i = 0; i < pairs.length; i++) {
+                pairs[i] = Pair.create(sharedElements[i], sharedElementNames[i]);
+            }
+        }
+        return new ActivityOptionsCompat24(
+                ActivityOptions.makeSceneTransitionAnimation(activity, pairs));
+    }
+
+    public static ActivityOptionsCompat24 makeClipRevealAnimation(View source,
+            int startX, int startY, int width, int height) {
+        return new ActivityOptionsCompat24(
+            ActivityOptions.makeClipRevealAnimation(source, startX, startY, width, height));
+    }
+
+    public static ActivityOptionsCompat24 makeTaskLaunchBehind() {
+        return new ActivityOptionsCompat24(
+                ActivityOptions.makeTaskLaunchBehind());
+    }
+
+    public static ActivityOptionsCompat24 makeBasic() {
+        return new ActivityOptionsCompat24(ActivityOptions.makeBasic());
+    }
+
+    private final ActivityOptions mActivityOptions;
+
+    private ActivityOptionsCompat24(ActivityOptions activityOptions) {
+        mActivityOptions = activityOptions;
+    }
+
+    public ActivityOptionsCompat24 setLaunchBounds(@Nullable Rect screenSpacePixelRect) {
+        return new ActivityOptionsCompat24(mActivityOptions.setLaunchBounds(screenSpacePixelRect));
+    }
+
+    public Rect getLaunchBounds() {
+        return mActivityOptions.getLaunchBounds();
+    }
+
+    public Bundle toBundle() {
+        return mActivityOptions.toBundle();
+    }
+
+    public void update(ActivityOptionsCompat24 otherOptions) {
+        mActivityOptions.update(otherOptions.mActivityOptions);
+    }
+
+    public void requestUsageTimeReport(PendingIntent receiver) {
+        mActivityOptions.requestUsageTimeReport(receiver);
+    }
+}
diff --git a/v4/api24/android/support/v4/app/NotificationCompatApi24.java b/compat/api24/android/support/v4/app/NotificationCompatApi24.java
similarity index 100%
rename from v4/api24/android/support/v4/app/NotificationCompatApi24.java
rename to compat/api24/android/support/v4/app/NotificationCompatApi24.java
diff --git a/compat/api24/android/support/v4/app/NotificationManagerCompatApi24.java b/compat/api24/android/support/v4/app/NotificationManagerCompatApi24.java
new file mode 100644
index 0000000..b8f599f
--- /dev/null
+++ b/compat/api24/android/support/v4/app/NotificationManagerCompatApi24.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2016 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 android.support.v4.app;
+
+import android.app.NotificationManager;
+
+class NotificationManagerCompatApi24 {
+    public static boolean areNotificationsEnabled(NotificationManager notificationManager) {
+        return notificationManager.areNotificationsEnabled();
+    }
+
+    public static int getImportance(NotificationManager notificationManager) {
+        return notificationManager.getImportance();
+    }
+}
diff --git a/v4/api24/android/support/v4/content/ContextCompatApi24.java b/compat/api24/android/support/v4/content/ContextCompatApi24.java
similarity index 100%
rename from v4/api24/android/support/v4/content/ContextCompatApi24.java
rename to compat/api24/android/support/v4/content/ContextCompatApi24.java
diff --git a/v4/api24/android/support/v4/net/TrafficStatsCompatApi24.java b/compat/api24/android/support/v4/net/TrafficStatsCompatApi24.java
similarity index 100%
rename from v4/api24/android/support/v4/net/TrafficStatsCompatApi24.java
rename to compat/api24/android/support/v4/net/TrafficStatsCompatApi24.java
diff --git a/v4/api24/android/support/v4/os/UserManagerCompatApi24.java b/compat/api24/android/support/v4/os/UserManagerCompatApi24.java
similarity index 100%
rename from v4/api24/android/support/v4/os/UserManagerCompatApi24.java
rename to compat/api24/android/support/v4/os/UserManagerCompatApi24.java
diff --git a/v4/api24/android/support/v4/view/PointerIconCompatApi24.java b/compat/api24/android/support/v4/view/PointerIconCompatApi24.java
similarity index 100%
rename from v4/api24/android/support/v4/view/PointerIconCompatApi24.java
rename to compat/api24/android/support/v4/view/PointerIconCompatApi24.java
diff --git a/v4/api24/android/support/v4/view/ViewCompatApi24.java b/compat/api24/android/support/v4/view/ViewCompatApi24.java
similarity index 100%
rename from v4/api24/android/support/v4/view/ViewCompatApi24.java
rename to compat/api24/android/support/v4/view/ViewCompatApi24.java
diff --git a/compat/api24/android/support/v4/view/accessibility/AccessibilityNodeInfoCompatApi24.java b/compat/api24/android/support/v4/view/accessibility/AccessibilityNodeInfoCompatApi24.java
new file mode 100644
index 0000000..14fe273
--- /dev/null
+++ b/compat/api24/android/support/v4/view/accessibility/AccessibilityNodeInfoCompatApi24.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2016 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 android.support.v4.view.accessibility;
+
+import android.view.accessibility.AccessibilityNodeInfo;
+
+/**
+ * Api24-specific AccessibilityNodeInfo API implementation.
+ */
+class AccessibilityNodeInfoCompatApi24 {
+    public static Object getActionSetProgress() {
+        return AccessibilityNodeInfo.AccessibilityAction.ACTION_SET_PROGRESS;
+    }
+
+    public static int getDrawingOrder(Object info) {
+        return ((AccessibilityNodeInfo) info).getDrawingOrder();
+    }
+
+    public static void setDrawingOrder(Object info, int drawingOrderInParent) {
+        ((AccessibilityNodeInfo) info).setDrawingOrder(drawingOrderInParent);
+    }
+
+    public static boolean isImportantForAccessibility(Object info) {
+        return ((AccessibilityNodeInfo) info).isImportantForAccessibility();
+    }
+
+    public static void setImportantForAccessibility(Object info,
+            boolean importantForAccessibility) {
+        ((AccessibilityNodeInfo) info).setImportantForAccessibility(importantForAccessibility);
+    }
+}
diff --git a/v4/api24/android/support/v4/view/accessibility/AccessibilityWindowInfoCompatApi24.java b/compat/api24/android/support/v4/view/accessibility/AccessibilityWindowInfoCompatApi24.java
similarity index 100%
rename from v4/api24/android/support/v4/view/accessibility/AccessibilityWindowInfoCompatApi24.java
rename to compat/api24/android/support/v4/view/accessibility/AccessibilityWindowInfoCompatApi24.java
diff --git a/compat/build.gradle b/compat/build.gradle
new file mode 100644
index 0000000..ba84b8e
--- /dev/null
+++ b/compat/build.gradle
@@ -0,0 +1,133 @@
+apply plugin: 'com.android.library'
+archivesBaseName = 'support-compat'
+
+
+createApiSourceSets(project, gradle.ext.studioCompat.modules.compat.apiTargets)
+dependencies {
+    androidTestCompile ('com.android.support.test:runner:0.4.1') {
+        exclude module: 'support-annotations'
+    }
+    androidTestCompile ('com.android.support.test.espresso:espresso-core:2.2.1') {
+        exclude module: 'support-annotations'
+    }
+    androidTestCompile 'org.mockito:mockito-core:1.9.5'
+    androidTestCompile 'com.google.dexmaker:dexmaker:1.2'
+    androidTestCompile 'com.google.dexmaker:dexmaker-mockito:1.2'
+    testCompile 'junit:junit:4.12'
+}
+
+sourceCompatibility = JavaVersion.VERSION_1_7
+targetCompatibility = JavaVersion.VERSION_1_7
+setApiModuleDependencies(project, dependencies, gradle.ext.studioCompat.modules.compat.dependencies)
+
+android {
+    compileSdkVersion 9
+
+    defaultConfig {
+        minSdkVersion 9
+        // TODO: get target from branch
+        //targetSdkVersion 19
+
+        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
+    }
+
+    sourceSets {
+        main.manifest.srcFile 'AndroidManifest.xml'
+        main.java.srcDirs = ['java']
+        main.aidl.srcDirs = ['java']
+
+        androidTest.setRoot('tests')
+        androidTest.java.srcDir 'tests/java'
+        androidTest.res.srcDir 'tests/res'
+        androidTest.manifest.srcFile 'tests/AndroidManifest.xml'
+    }
+
+    lintOptions {
+        // TODO: fix errors and reenable.
+        abortOnError false
+    }
+
+    compileOptions {
+        sourceCompatibility JavaVersion.VERSION_1_7
+        targetCompatibility JavaVersion.VERSION_1_7
+    }
+
+    testOptions {
+        unitTests.returnDefaultValues = true
+        compileSdkVersion project.ext.currentSdk
+    }
+}
+
+android.libraryVariants.all { variant ->
+    def name = variant.buildType.name
+
+    if (name.equals(com.android.builder.core.BuilderConstants.DEBUG)) {
+        return; // Skip debug builds.
+    }
+    def suffix = name.capitalize()
+
+    def jarTask = project.tasks.create(name: "jar${suffix}", type: Jar){
+        dependsOn variant.javaCompile
+        from variant.javaCompile.destinationDir
+        from 'LICENSE.txt'
+    }
+    def javadocTask = project.tasks.create(name: "javadoc${suffix}", type: Javadoc) {
+        source android.sourceSets.main.java
+        classpath = files(variant.javaCompile.classpath.files) + files(
+                "${android.sdkDirectory}/platforms/${android.compileSdkVersion}/android.jar")
+    }
+
+    def javadocJarTask = project.tasks.create(name: "javadocJar${suffix}", type: Jar) {
+        classifier = 'javadoc'
+        from 'build/docs/javadoc'
+    }
+
+    def sourcesJarTask = project.tasks.create(name: "sourceJar${suffix}", type: Jar) {
+        classifier = 'sources'
+        from android.sourceSets.main.java.srcDirs
+        exclude('android/content/pm/**')
+        exclude('android/service/media/**')
+    }
+
+    project.ext.allSS.each { ss ->
+        javadocTask.source ss.java
+        sourcesJarTask.from ss.java.srcDirs
+    }
+
+    artifacts.add('archives', javadocJarTask);
+    artifacts.add('archives', sourcesJarTask);
+}
+
+uploadArchives {
+    repositories {
+        mavenDeployer {
+            repository(url: uri(rootProject.ext.supportRepoOut)) {
+            }
+
+            pom.project {
+                name 'Android Support Library compat'
+                description "The Support Library is a static library that you can add to your Android application in order to use APIs that are either not available for older platform versions or utility APIs that aren't a part of the framework APIs. Compatible on devices running API 4 or later."
+                url 'http://developer.android.com/tools/extras/support-library.html'
+                inceptionYear '2011'
+
+                licenses {
+                    license {
+                        name 'The Apache Software License, Version 2.0'
+                        url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+                        distribution 'repo'
+                    }
+                }
+
+                scm {
+                    url "http://source.android.com"
+                    connection "scm:git:https://android.googlesource.com/platform/frameworks/support"
+                }
+                developers {
+                    developer {
+                        name 'The Android Open Source Project'
+                    }
+                }
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/v4/donut/android/support/v4/animation/AnimatorListenerCompat.java b/compat/gingerbread/android/support/v4/animation/AnimatorListenerCompat.java
similarity index 100%
rename from v4/donut/android/support/v4/animation/AnimatorListenerCompat.java
rename to compat/gingerbread/android/support/v4/animation/AnimatorListenerCompat.java
diff --git a/v4/donut/android/support/v4/animation/AnimatorProvider.java b/compat/gingerbread/android/support/v4/animation/AnimatorProvider.java
similarity index 100%
rename from v4/donut/android/support/v4/animation/AnimatorProvider.java
rename to compat/gingerbread/android/support/v4/animation/AnimatorProvider.java
diff --git a/v4/donut/android/support/v4/animation/AnimatorUpdateListenerCompat.java b/compat/gingerbread/android/support/v4/animation/AnimatorUpdateListenerCompat.java
similarity index 100%
rename from v4/donut/android/support/v4/animation/AnimatorUpdateListenerCompat.java
rename to compat/gingerbread/android/support/v4/animation/AnimatorUpdateListenerCompat.java
diff --git a/compat/gingerbread/android/support/v4/animation/GingerbreadAnimatorCompatProvider.java b/compat/gingerbread/android/support/v4/animation/GingerbreadAnimatorCompatProvider.java
new file mode 100644
index 0000000..8c6d097
--- /dev/null
+++ b/compat/gingerbread/android/support/v4/animation/GingerbreadAnimatorCompatProvider.java
@@ -0,0 +1,155 @@
+/*
+ * Copyright (C) 2015 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 android.support.v4.animation;
+
+import android.view.View;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Provides similar functionality to Animators on platforms prior to Honeycomb.
+ * <p>
+ * This is not a fully implemented API which is why it is not public.
+ *
+ * @hide
+ */
+class GingerbreadAnimatorCompatProvider implements AnimatorProvider {
+
+    @Override
+    public ValueAnimatorCompat emptyValueAnimator() {
+        return new GingerbreadFloatValueAnimator();
+    }
+
+    private static class GingerbreadFloatValueAnimator implements ValueAnimatorCompat {
+
+        List<AnimatorListenerCompat> mListeners = new ArrayList<AnimatorListenerCompat>();
+        List<AnimatorUpdateListenerCompat> mUpdateListeners
+                = new ArrayList<AnimatorUpdateListenerCompat>();
+        View mTarget;
+        private long mStartTime;
+        private long mDuration = 200;
+        private float mFraction = 0f;
+
+        private boolean mStarted = false;
+        private boolean mEnded = false;
+
+        public GingerbreadFloatValueAnimator() {
+        }
+
+        private Runnable mLoopRunnable = new Runnable() {
+            @Override
+            public void run() {
+                long dt = getTime() - mStartTime;
+                float fraction = dt * 1f / mDuration;
+                if (fraction > 1f || mTarget.getParent() == null) {
+                    fraction = 1f;
+                }
+                mFraction = fraction;
+                notifyUpdateListeners();
+                if (mFraction >= 1f) {
+                    dispatchEnd();
+                } else {
+                    mTarget.postDelayed(mLoopRunnable, 16);
+                }
+            }
+        };
+
+        private void notifyUpdateListeners() {
+            for (int i = mUpdateListeners.size() - 1; i >= 0; i--) {
+                mUpdateListeners.get(i).onAnimationUpdate(this);
+            }
+        }
+
+        @Override
+        public void setTarget(View view) {
+            mTarget = view;
+        }
+
+        @Override
+        public void addListener(AnimatorListenerCompat listener) {
+            mListeners.add(listener);
+        }
+
+        @Override
+        public void setDuration(long duration) {
+            if (!mStarted) {
+                mDuration = duration;
+            }
+        }
+
+        @Override
+        public void start() {
+            if (mStarted) {
+                return;
+            }
+            mStarted = true;
+            dispatchStart();
+            mFraction = 0f;
+            mStartTime = getTime();
+            mTarget.postDelayed(mLoopRunnable, 16);
+        }
+
+        private long getTime() {
+            return mTarget.getDrawingTime();
+        }
+
+        private void dispatchStart() {
+            for (int i = mListeners.size() - 1; i >= 0; i--) {
+                mListeners.get(i).onAnimationStart(this);
+            }
+        }
+
+        private void dispatchEnd() {
+            for (int i = mListeners.size() - 1; i >= 0; i--) {
+                mListeners.get(i).onAnimationEnd(this);
+            }
+        }
+
+        private void dispatchCancel() {
+            for (int i = mListeners.size() - 1; i >= 0; i--) {
+                mListeners.get(i).onAnimationCancel(this);
+            }
+        }
+
+        @Override
+        public void cancel() {
+            if (mEnded) {
+                return;
+            }
+            mEnded = true;
+            if (mStarted) {
+                dispatchCancel();
+            }
+            dispatchEnd();
+        }
+
+        @Override
+        public void addUpdateListener(AnimatorUpdateListenerCompat animatorUpdateListener) {
+            mUpdateListeners.add(animatorUpdateListener);
+        }
+
+        @Override
+        public float getAnimatedFraction() {
+            return mFraction;
+        }
+    }
+
+    @Override
+    public void clearInterpolator(View view) {
+    }
+}
diff --git a/v4/donut/android/support/v4/animation/ValueAnimatorCompat.java b/compat/gingerbread/android/support/v4/animation/ValueAnimatorCompat.java
similarity index 100%
rename from v4/donut/android/support/v4/animation/ValueAnimatorCompat.java
rename to compat/gingerbread/android/support/v4/animation/ValueAnimatorCompat.java
diff --git a/compat/gingerbread/android/support/v4/app/BundleCompatGingerbread.java b/compat/gingerbread/android/support/v4/app/BundleCompatGingerbread.java
new file mode 100644
index 0000000..ce65f1b
--- /dev/null
+++ b/compat/gingerbread/android/support/v4/app/BundleCompatGingerbread.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2015 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 android.support.v4.app;
+
+import android.os.Bundle;
+import android.os.IBinder;
+import android.util.Log;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+/**
+ * @hide
+ */
+class BundleCompatGingerbread {
+    private static final String TAG = "BundleCompatGingerbread";
+
+    private static Method sGetIBinderMethod;
+    private static boolean sGetIBinderMethodFetched;
+
+    private static Method sPutIBinderMethod;
+    private static boolean sPutIBinderMethodFetched;
+
+    public static IBinder getBinder(Bundle bundle, String key) {
+        if (!sGetIBinderMethodFetched) {
+            try {
+                sGetIBinderMethod = Bundle.class.getMethod("getIBinder", String.class);
+                sGetIBinderMethod.setAccessible(true);
+            } catch (NoSuchMethodException e) {
+                Log.i(TAG, "Failed to retrieve getIBinder method", e);
+            }
+            sGetIBinderMethodFetched = true;
+        }
+
+        if (sGetIBinderMethod != null) {
+            try {
+                return (IBinder) sGetIBinderMethod.invoke(bundle, key);
+            } catch (InvocationTargetException | IllegalAccessException
+                    | IllegalArgumentException e) {
+                Log.i(TAG, "Failed to invoke getIBinder via reflection", e);
+                sGetIBinderMethod = null;
+            }
+        }
+        return null;
+    }
+
+    public static void putBinder(Bundle bundle, String key, IBinder binder) {
+        if (!sPutIBinderMethodFetched) {
+            try {
+                sPutIBinderMethod =
+                        Bundle.class.getMethod("putIBinder", String.class, IBinder.class);
+                sPutIBinderMethod.setAccessible(true);
+            } catch (NoSuchMethodException e) {
+                Log.i(TAG, "Failed to retrieve putIBinder method", e);
+            }
+            sPutIBinderMethodFetched = true;
+        }
+
+        if (sPutIBinderMethod != null) {
+            try {
+                sPutIBinderMethod.invoke(bundle, key, binder);
+            } catch (InvocationTargetException | IllegalAccessException
+                    | IllegalArgumentException e) {
+                Log.i(TAG, "Failed to invoke putIBinder via reflection", e);
+                sPutIBinderMethod = null;
+            }
+        }
+    }
+}
diff --git a/compat/gingerbread/android/support/v4/app/NotificationCompatBase.java b/compat/gingerbread/android/support/v4/app/NotificationCompatBase.java
new file mode 100644
index 0000000..bcaaed6
--- /dev/null
+++ b/compat/gingerbread/android/support/v4/app/NotificationCompatBase.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2014 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 android.support.v4.app;
+
+import android.app.Notification;
+import android.app.PendingIntent;
+import android.content.Context;
+import android.os.Bundle;
+
+/**
+ * @hide
+ */
+public class NotificationCompatBase {
+
+    public static abstract class Action {
+        public abstract int getIcon();
+        public abstract CharSequence getTitle();
+        public abstract PendingIntent getActionIntent();
+        public abstract Bundle getExtras();
+        public abstract RemoteInputCompatBase.RemoteInput[] getRemoteInputs();
+        public abstract boolean getAllowGeneratedReplies();
+
+        public interface Factory {
+            Action build(int icon, CharSequence title, PendingIntent actionIntent,
+                    Bundle extras, RemoteInputCompatBase.RemoteInput[] remoteInputs,
+                    boolean allowGeneratedReplies);
+            public Action[] newArray(int length);
+        }
+    }
+
+    public static abstract class UnreadConversation {
+        abstract String[] getParticipants();
+        abstract String getParticipant();
+        abstract String[] getMessages();
+        abstract RemoteInputCompatBase.RemoteInput getRemoteInput();
+        abstract PendingIntent getReplyPendingIntent();
+        abstract PendingIntent getReadPendingIntent();
+        abstract long getLatestTimestamp();
+
+        public interface Factory {
+            UnreadConversation build(String[] messages,
+                    RemoteInputCompatBase.RemoteInput remoteInput,
+                    PendingIntent replyPendingIntent, PendingIntent readPendingIntent,
+                    String[] participants, long latestTimestamp);
+        }
+    }
+
+    public static Notification add(Notification notification, Context context,
+            CharSequence contentTitle, CharSequence contentText, PendingIntent contentIntent,
+            PendingIntent fullScreenIntent) {
+        notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);
+        notification.fullScreenIntent = fullScreenIntent;
+        return notification;
+    }
+}
diff --git a/v4/donut/android/support/v4/app/RemoteInputCompatBase.java b/compat/gingerbread/android/support/v4/app/RemoteInputCompatBase.java
similarity index 100%
rename from v4/donut/android/support/v4/app/RemoteInputCompatBase.java
rename to compat/gingerbread/android/support/v4/app/RemoteInputCompatBase.java
diff --git a/compat/gingerbread/android/support/v4/content/res/ConfigurationHelperGingerbread.java b/compat/gingerbread/android/support/v4/content/res/ConfigurationHelperGingerbread.java
new file mode 100644
index 0000000..1a18404
--- /dev/null
+++ b/compat/gingerbread/android/support/v4/content/res/ConfigurationHelperGingerbread.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2016 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 android.support.v4.content.res;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.support.annotation.NonNull;
+import android.util.DisplayMetrics;
+
+class ConfigurationHelperGingerbread {
+
+    static int getScreenHeightDp(@NonNull Resources resources) {
+        final DisplayMetrics metrics = resources.getDisplayMetrics();
+        return (int) (metrics.heightPixels / metrics.density);
+    }
+
+    static int getScreenWidthDp(@NonNull Resources resources) {
+        final DisplayMetrics metrics = resources.getDisplayMetrics();
+        return (int) (metrics.widthPixels / metrics.density);
+    }
+
+    static int getSmallestScreenWidthDp(@NonNull Resources resources) {
+        // Not perfect, but close enough
+        return Math.min(getScreenWidthDp(resources), getScreenHeightDp(resources));
+    }
+
+    static int getDensityDpi(@NonNull Resources resources) {
+        return resources.getDisplayMetrics().densityDpi;
+    }
+}
diff --git a/compat/gingerbread/android/support/v4/graphics/drawable/DrawableCompatBase.java b/compat/gingerbread/android/support/v4/graphics/drawable/DrawableCompatBase.java
new file mode 100644
index 0000000..9645df2
--- /dev/null
+++ b/compat/gingerbread/android/support/v4/graphics/drawable/DrawableCompatBase.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2015 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 android.support.v4.graphics.drawable;
+
+import android.content.res.ColorStateList;
+import android.content.res.Resources;
+import android.graphics.PorterDuff;
+import android.graphics.drawable.Drawable;
+import android.util.AttributeSet;
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+
+import java.io.IOException;
+
+/**
+ * Base implementation of drawable compatibility.
+ */
+class DrawableCompatBase {
+
+    public static void setTint(Drawable drawable, int tint) {
+        if (drawable instanceof TintAwareDrawable) {
+            ((TintAwareDrawable) drawable).setTint(tint);
+        }
+    }
+
+    public static void setTintList(Drawable drawable, ColorStateList tint) {
+        if (drawable instanceof TintAwareDrawable) {
+            ((TintAwareDrawable) drawable).setTintList(tint);
+        }
+    }
+
+    public static void setTintMode(Drawable drawable, PorterDuff.Mode tintMode) {
+        if (drawable instanceof TintAwareDrawable) {
+            ((TintAwareDrawable) drawable).setTintMode(tintMode);
+        }
+    }
+
+    public static Drawable wrapForTinting(Drawable drawable) {
+        if (!(drawable instanceof TintAwareDrawable)) {
+            return new DrawableWrapperGingerbread(drawable);
+        }
+        return drawable;
+    }
+
+    public static void inflate(Drawable drawable, Resources res, XmlPullParser parser,
+                               AttributeSet attrs, Resources.Theme t)
+            throws IOException, XmlPullParserException {
+        drawable.inflate(res, parser, attrs);
+    }
+}
diff --git a/v4/donut/android/support/v4/graphics/drawable/DrawableWrapper.java b/compat/gingerbread/android/support/v4/graphics/drawable/DrawableWrapper.java
similarity index 100%
rename from v4/donut/android/support/v4/graphics/drawable/DrawableWrapper.java
rename to compat/gingerbread/android/support/v4/graphics/drawable/DrawableWrapper.java
diff --git a/compat/gingerbread/android/support/v4/graphics/drawable/DrawableWrapperGingerbread.java b/compat/gingerbread/android/support/v4/graphics/drawable/DrawableWrapperGingerbread.java
new file mode 100644
index 0000000..f420ca2
--- /dev/null
+++ b/compat/gingerbread/android/support/v4/graphics/drawable/DrawableWrapperGingerbread.java
@@ -0,0 +1,383 @@
+/*
+ * Copyright (C) 2015 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 android.support.v4.graphics.drawable;
+
+import android.content.res.ColorStateList;
+import android.content.res.Resources;
+import android.graphics.Canvas;
+import android.graphics.ColorFilter;
+import android.graphics.PorterDuff;
+import android.graphics.Rect;
+import android.graphics.Region;
+import android.graphics.drawable.Drawable;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+
+/**
+ * Drawable which delegates all calls to it's wrapped {@link android.graphics.drawable.Drawable}.
+ * <p>
+ * Also allows backward compatible tinting via a color or {@link ColorStateList}.
+ * This functionality is accessed via static methods in {@code DrawableCompat}.
+ */
+class DrawableWrapperGingerbread extends Drawable
+        implements Drawable.Callback, DrawableWrapper, TintAwareDrawable {
+
+    static final PorterDuff.Mode DEFAULT_TINT_MODE = PorterDuff.Mode.SRC_IN;
+
+    private int mCurrentColor;
+    private PorterDuff.Mode mCurrentMode;
+    private boolean mColorFilterSet;
+
+    DrawableWrapperState mState;
+    private boolean mMutated;
+
+    Drawable mDrawable;
+
+    DrawableWrapperGingerbread(@NonNull DrawableWrapperState state, @Nullable Resources res) {
+        mState = state;
+        updateLocalState(res);
+    }
+
+    /**
+     * Creates a new wrapper around the specified drawable.
+     *
+     * @param dr the drawable to wrap
+     */
+    DrawableWrapperGingerbread(@Nullable Drawable dr) {
+        mState = mutateConstantState();
+        // Now set the drawable...
+        setWrappedDrawable(dr);
+    }
+
+    /**
+     * Initializes local dynamic properties from state. This should be called
+     * after significant state changes, e.g. from the One True Constructor and
+     * after inflating or applying a theme.
+     */
+    private void updateLocalState(@Nullable Resources res) {
+        if (mState != null && mState.mDrawableState != null) {
+            final Drawable dr = newDrawableFromState(mState.mDrawableState, res);
+            setWrappedDrawable(dr);
+        }
+    }
+
+    /**
+     * Allows us to call ConstantState.newDrawable(*) is a API safe way
+     */
+    protected Drawable newDrawableFromState(@NonNull Drawable.ConstantState state,
+            @Nullable Resources res) {
+        return state.newDrawable(res);
+    }
+
+    @Override
+    public void draw(Canvas canvas) {
+        mDrawable.draw(canvas);
+    }
+
+    @Override
+    protected void onBoundsChange(Rect bounds) {
+        if (mDrawable != null) {
+            mDrawable.setBounds(bounds);
+        }
+    }
+
+    @Override
+    public void setChangingConfigurations(int configs) {
+        mDrawable.setChangingConfigurations(configs);
+    }
+
+    @Override
+    public int getChangingConfigurations() {
+        return super.getChangingConfigurations()
+                | (mState != null ? mState.getChangingConfigurations() : 0)
+                | mDrawable.getChangingConfigurations();
+    }
+
+    @Override
+    public void setDither(boolean dither) {
+        mDrawable.setDither(dither);
+    }
+
+    @Override
+    public void setFilterBitmap(boolean filter) {
+        mDrawable.setFilterBitmap(filter);
+    }
+
+    @Override
+    public void setAlpha(int alpha) {
+        mDrawable.setAlpha(alpha);
+    }
+
+    @Override
+    public void setColorFilter(ColorFilter cf) {
+        mDrawable.setColorFilter(cf);
+    }
+
+    @Override
+    public boolean isStateful() {
+        final ColorStateList tintList = (isCompatTintEnabled() && mState != null)
+                ? mState.mTint
+                : null;
+        return (tintList != null && tintList.isStateful()) || mDrawable.isStateful();
+    }
+
+    @Override
+    public boolean setState(final int[] stateSet) {
+        boolean handled = mDrawable.setState(stateSet);
+        handled = updateTint(stateSet) || handled;
+        return handled;
+    }
+
+    @Override
+    public int[] getState() {
+        return mDrawable.getState();
+    }
+
+    @Override
+    public Drawable getCurrent() {
+        return mDrawable.getCurrent();
+    }
+
+    @Override
+    public boolean setVisible(boolean visible, boolean restart) {
+        return super.setVisible(visible, restart) || mDrawable.setVisible(visible, restart);
+    }
+
+    @Override
+    public int getOpacity() {
+        return mDrawable.getOpacity();
+    }
+
+    @Override
+    public Region getTransparentRegion() {
+        return mDrawable.getTransparentRegion();
+    }
+
+    @Override
+    public int getIntrinsicWidth() {
+        return mDrawable.getIntrinsicWidth();
+    }
+
+    @Override
+    public int getIntrinsicHeight() {
+        return mDrawable.getIntrinsicHeight();
+    }
+
+    @Override
+    public int getMinimumWidth() {
+        return mDrawable.getMinimumWidth();
+    }
+
+    @Override
+    public int getMinimumHeight() {
+        return mDrawable.getMinimumHeight();
+    }
+
+    @Override
+    public boolean getPadding(Rect padding) {
+        return mDrawable.getPadding(padding);
+    }
+
+    @Override
+    @Nullable
+    public ConstantState getConstantState() {
+        if (mState != null && mState.canConstantState()) {
+            mState.mChangingConfigurations = getChangingConfigurations();
+            return mState;
+        }
+        return null;
+    }
+
+    @Override
+    public Drawable mutate() {
+        if (!mMutated && super.mutate() == this) {
+            mState = mutateConstantState();
+            if (mDrawable != null) {
+                mDrawable.mutate();
+            }
+            if (mState != null) {
+                mState.mDrawableState = mDrawable != null ? mDrawable.getConstantState() : null;
+            }
+            mMutated = true;
+        }
+        return this;
+    }
+
+    /**
+     * Mutates the constant state and returns the new state.
+     * <p>
+     * This method should never call the super implementation; it should always
+     * mutate and return its own constant state.
+     *
+     * @return the new state
+     */
+    @NonNull
+    DrawableWrapperState mutateConstantState() {
+        return new DrawableWrapperStateBase(mState, null);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void invalidateDrawable(Drawable who) {
+        invalidateSelf();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void scheduleDrawable(Drawable who, Runnable what, long when) {
+        scheduleSelf(what, when);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void unscheduleDrawable(Drawable who, Runnable what) {
+        unscheduleSelf(what);
+    }
+
+    @Override
+    protected boolean onLevelChange(int level) {
+        return mDrawable.setLevel(level);
+    }
+
+    @Override
+    public void setTint(int tint) {
+        setTintList(ColorStateList.valueOf(tint));
+    }
+
+    @Override
+    public void setTintList(ColorStateList tint) {
+        mState.mTint = tint;
+        updateTint(getState());
+    }
+
+    @Override
+    public void setTintMode(PorterDuff.Mode tintMode) {
+        mState.mTintMode = tintMode;
+        updateTint(getState());
+    }
+
+    private boolean updateTint(int[] state) {
+        if (!isCompatTintEnabled()) {
+            // If compat tinting is not enabled, fail fast
+            return false;
+        }
+
+        final ColorStateList tintList = mState.mTint;
+        final PorterDuff.Mode tintMode = mState.mTintMode;
+
+        if (tintList != null && tintMode != null) {
+            final int color = tintList.getColorForState(state, tintList.getDefaultColor());
+            if (!mColorFilterSet || color != mCurrentColor || tintMode != mCurrentMode) {
+                setColorFilter(color, tintMode);
+                mCurrentColor = color;
+                mCurrentMode = tintMode;
+                mColorFilterSet = true;
+                return true;
+            }
+        } else {
+            mColorFilterSet = false;
+            clearColorFilter();
+        }
+        return false;
+    }
+
+    /**
+     * Returns the wrapped {@link Drawable}
+     */
+    public final Drawable getWrappedDrawable() {
+        return mDrawable;
+    }
+
+    /**
+     * Sets the current wrapped {@link Drawable}
+     */
+    public final void setWrappedDrawable(Drawable dr) {
+        if (mDrawable != null) {
+            mDrawable.setCallback(null);
+        }
+
+        mDrawable = dr;
+
+        if (dr != null) {
+            dr.setCallback(this);
+            // Only call setters for data that's stored in the base Drawable.
+            dr.setVisible(isVisible(), true);
+            dr.setState(getState());
+            dr.setLevel(getLevel());
+            dr.setBounds(getBounds());
+            if (mState != null) {
+                mState.mDrawableState = dr.getConstantState();
+            }
+        }
+
+        invalidateSelf();
+    }
+
+    protected boolean isCompatTintEnabled() {
+        // It's enabled by default on Gingerbread
+        return true;
+    }
+
+    protected static abstract class DrawableWrapperState extends Drawable.ConstantState {
+        int mChangingConfigurations;
+        Drawable.ConstantState mDrawableState;
+
+        ColorStateList mTint = null;
+        PorterDuff.Mode mTintMode = DEFAULT_TINT_MODE;
+
+        DrawableWrapperState(@Nullable DrawableWrapperState orig, @Nullable Resources res) {
+            if (orig != null) {
+                mChangingConfigurations = orig.mChangingConfigurations;
+                mDrawableState = orig.mDrawableState;
+                mTint = orig.mTint;
+                mTintMode = orig.mTintMode;
+            }
+        }
+
+        @Override
+        public Drawable newDrawable() {
+            return newDrawable(null);
+        }
+
+        public abstract Drawable newDrawable(@Nullable Resources res);
+
+        @Override
+        public int getChangingConfigurations() {
+            return mChangingConfigurations
+                    | (mDrawableState != null ? mDrawableState.getChangingConfigurations() : 0);
+        }
+
+        boolean canConstantState() {
+            return mDrawableState != null;
+        }
+    }
+
+    private static class DrawableWrapperStateBase extends DrawableWrapperState {
+        DrawableWrapperStateBase(
+                @Nullable DrawableWrapperState orig, @Nullable Resources res) {
+            super(orig, res);
+        }
+
+        @Override
+        public Drawable newDrawable(@Nullable Resources res) {
+            return new DrawableWrapperGingerbread(this, res);
+        }
+    }
+}
diff --git a/v4/donut/android/support/v4/graphics/drawable/TintAwareDrawable.java b/compat/gingerbread/android/support/v4/graphics/drawable/TintAwareDrawable.java
similarity index 100%
rename from v4/donut/android/support/v4/graphics/drawable/TintAwareDrawable.java
rename to compat/gingerbread/android/support/v4/graphics/drawable/TintAwareDrawable.java
diff --git a/v4/donut/android/support/v4/os/BuildCompat.java b/compat/gingerbread/android/support/v4/os/BuildCompat.java
similarity index 100%
rename from v4/donut/android/support/v4/os/BuildCompat.java
rename to compat/gingerbread/android/support/v4/os/BuildCompat.java
diff --git a/v4/donut/android/support/v4/view/LayoutInflaterCompatBase.java b/compat/gingerbread/android/support/v4/view/LayoutInflaterCompatBase.java
similarity index 100%
rename from v4/donut/android/support/v4/view/LayoutInflaterCompatBase.java
rename to compat/gingerbread/android/support/v4/view/LayoutInflaterCompatBase.java
diff --git a/v4/donut/android/support/v4/view/LayoutInflaterFactory.java b/compat/gingerbread/android/support/v4/view/LayoutInflaterFactory.java
similarity index 100%
rename from v4/donut/android/support/v4/view/LayoutInflaterFactory.java
rename to compat/gingerbread/android/support/v4/view/LayoutInflaterFactory.java
diff --git a/v4/donut/android/support/v4/view/TintableBackgroundView.java b/compat/gingerbread/android/support/v4/view/TintableBackgroundView.java
similarity index 100%
rename from v4/donut/android/support/v4/view/TintableBackgroundView.java
rename to compat/gingerbread/android/support/v4/view/TintableBackgroundView.java
diff --git a/v4/donut/android/support/v4/view/ViewCompatBase.java b/compat/gingerbread/android/support/v4/view/ViewCompatBase.java
similarity index 100%
rename from v4/donut/android/support/v4/view/ViewCompatBase.java
rename to compat/gingerbread/android/support/v4/view/ViewCompatBase.java
diff --git a/compat/gingerbread/android/support/v4/view/animation/PathInterpolatorCompatBase.java b/compat/gingerbread/android/support/v4/view/animation/PathInterpolatorCompatBase.java
new file mode 100644
index 0000000..9857632
--- /dev/null
+++ b/compat/gingerbread/android/support/v4/view/animation/PathInterpolatorCompatBase.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2015 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 android.support.v4.view.animation;
+
+import android.graphics.Path;
+import android.view.animation.Interpolator;
+
+/**
+ * Base implementation for path interpolator compatibility.
+ */
+class PathInterpolatorCompatBase  {
+
+    private PathInterpolatorCompatBase() {
+        // prevent instantiation
+    }
+
+    public static Interpolator create(Path path) {
+        return new PathInterpolatorGingerbread(path);
+    }
+
+    public static Interpolator create(float controlX, float controlY) {
+        return new PathInterpolatorGingerbread(controlX, controlY);
+    }
+
+    public static Interpolator create(float controlX1, float controlY1,
+            float controlX2, float controlY2) {
+        return new PathInterpolatorGingerbread(controlX1, controlY1, controlX2, controlY2);
+    }
+}
diff --git a/compat/gingerbread/android/support/v4/view/animation/PathInterpolatorGingerbread.java b/compat/gingerbread/android/support/v4/view/animation/PathInterpolatorGingerbread.java
new file mode 100644
index 0000000..b95fc04
--- /dev/null
+++ b/compat/gingerbread/android/support/v4/view/animation/PathInterpolatorGingerbread.java
@@ -0,0 +1,112 @@
+/*
+ * Copyright (C) 2015 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 android.support.v4.view.animation;
+
+import android.graphics.Path;
+import android.graphics.PathMeasure;
+import android.view.animation.Interpolator;
+
+/**
+ * A path interpolator implementation compatible with API 9+.
+ */
+class PathInterpolatorGingerbread implements Interpolator {
+
+    /**
+     * Governs the accuracy of the approximation of the {@link Path}.
+     */
+    private static final float PRECISION = 0.002f;
+
+    private final float[] mX;
+    private final float[] mY;
+
+    public PathInterpolatorGingerbread(Path path) {
+        final PathMeasure pathMeasure = new PathMeasure(path, false /* forceClosed */);
+
+        final float pathLength = pathMeasure.getLength();
+        final int numPoints = (int) (pathLength / PRECISION) + 1;
+
+        mX = new float[numPoints];
+        mY = new float[numPoints];
+
+        final float[] position = new float[2];
+        for (int i = 0; i < numPoints; ++i) {
+            final float distance = (i * pathLength) / (numPoints - 1);
+            pathMeasure.getPosTan(distance, position, null /* tangent */);
+
+            mX[i] = position[0];
+            mY[i] = position[1];
+        }
+    }
+
+    public PathInterpolatorGingerbread(float controlX, float controlY) {
+        this(createQuad(controlX, controlY));
+    }
+
+    public PathInterpolatorGingerbread(float controlX1, float controlY1,
+            float controlX2, float controlY2) {
+        this(createCubic(controlX1, controlY1, controlX2, controlY2));
+    }
+
+    @Override
+    public float getInterpolation(float t) {
+        if (t <= 0.0f) {
+            return 0.0f;
+        } else if (t >= 1.0f) {
+            return 1.0f;
+        }
+
+        // Do a binary search for the correct x to interpolate between.
+        int startIndex = 0;
+        int endIndex = mX.length - 1;
+        while (endIndex - startIndex > 1) {
+            int midIndex = (startIndex + endIndex) / 2;
+            if (t < mX[midIndex]) {
+                endIndex = midIndex;
+            } else {
+                startIndex = midIndex;
+            }
+        }
+
+        final float xRange = mX[endIndex] - mX[startIndex];
+        if (xRange == 0) {
+            return mY[startIndex];
+        }
+
+        final float tInRange = t - mX[startIndex];
+        final float fraction = tInRange / xRange;
+
+        final float startY = mY[startIndex];
+        final float endY = mY[endIndex];
+
+        return startY + (fraction * (endY - startY));
+    }
+
+    private static Path createQuad(float controlX, float controlY) {
+        final Path path = new Path();
+        path.moveTo(0.0f, 0.0f);
+        path.quadTo(controlX, controlY, 1.0f, 1.0f);
+        return path;
+    }
+
+    private static Path createCubic(float controlX1, float controlY1,
+            float controlX2, float controlY2) {
+        final Path path = new Path();
+        path.moveTo(0.0f, 0.0f);
+        path.cubicTo(controlX1, controlY1, controlX2, controlY2, 1.0f, 1.0f);
+        return path;
+    }
+}
diff --git a/compat/gingerbread/android/support/v4/widget/CompoundButtonCompatGingerbread.java b/compat/gingerbread/android/support/v4/widget/CompoundButtonCompatGingerbread.java
new file mode 100644
index 0000000..6e3e0e4
--- /dev/null
+++ b/compat/gingerbread/android/support/v4/widget/CompoundButtonCompatGingerbread.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2015 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 android.support.v4.widget;
+
+import android.content.res.ColorStateList;
+import android.graphics.PorterDuff;
+import android.graphics.drawable.Drawable;
+import android.util.Log;
+import android.widget.CompoundButton;
+
+import java.lang.reflect.Field;
+
+class CompoundButtonCompatGingerbread {
+
+    private static final String TAG = "CompoundButtonCompatGingerbread";
+
+    private static Field sButtonDrawableField;
+    private static boolean sButtonDrawableFieldFetched;
+
+    static void setButtonTintList(CompoundButton button, ColorStateList tint) {
+        if (button instanceof TintableCompoundButton) {
+            ((TintableCompoundButton) button).setSupportButtonTintList(tint);
+        }
+    }
+
+    static ColorStateList getButtonTintList(CompoundButton button) {
+        if (button instanceof TintableCompoundButton) {
+             return((TintableCompoundButton) button).getSupportButtonTintList();
+        }
+        return null;
+    }
+
+    static void setButtonTintMode(CompoundButton button, PorterDuff.Mode tintMode) {
+        if (button instanceof TintableCompoundButton) {
+            ((TintableCompoundButton) button).setSupportButtonTintMode(tintMode);
+        }
+    }
+
+    static PorterDuff.Mode getButtonTintMode(CompoundButton button) {
+        if (button instanceof TintableCompoundButton) {
+            return ((TintableCompoundButton) button).getSupportButtonTintMode();
+        }
+        return null;
+    }
+
+    static Drawable getButtonDrawable(CompoundButton button) {
+        if (!sButtonDrawableFieldFetched) {
+            try {
+                sButtonDrawableField = CompoundButton.class.getDeclaredField("mButtonDrawable");
+                sButtonDrawableField.setAccessible(true);
+            } catch (NoSuchFieldException e) {
+                Log.i(TAG, "Failed to retrieve mButtonDrawable field", e);
+            }
+            sButtonDrawableFieldFetched = true;
+        }
+
+        if (sButtonDrawableField != null) {
+            try {
+                return (Drawable) sButtonDrawableField.get(button);
+            } catch (IllegalAccessException e) {
+                Log.i(TAG, "Failed to get button drawable via reflection", e);
+                sButtonDrawableField = null;
+            }
+        }
+        return null;
+    }
+
+}
diff --git a/compat/gingerbread/android/support/v4/widget/ListViewCompatGingerbread.java b/compat/gingerbread/android/support/v4/widget/ListViewCompatGingerbread.java
new file mode 100644
index 0000000..14d27b0
--- /dev/null
+++ b/compat/gingerbread/android/support/v4/widget/ListViewCompatGingerbread.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2016 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 android.support.v4.widget;
+
+import android.view.View;
+import android.widget.AbsListView;
+import android.widget.ListView;
+
+class ListViewCompatGingerbread {
+    static void scrollListBy(final ListView listView, int y) {
+        final int firstPosition = listView.getFirstVisiblePosition();
+        if (firstPosition == ListView.INVALID_POSITION) {
+            return;
+        }
+
+        final View firstView = listView.getChildAt(0);
+        if (firstView == null) {
+            return;
+        }
+
+        final int newTop = firstView.getTop() - y;
+        listView.setSelectionFromTop(firstPosition, newTop);
+    }
+}
diff --git a/v4/donut/android/support/v4/widget/TintableCompoundButton.java b/compat/gingerbread/android/support/v4/widget/TintableCompoundButton.java
similarity index 100%
rename from v4/donut/android/support/v4/widget/TintableCompoundButton.java
rename to compat/gingerbread/android/support/v4/widget/TintableCompoundButton.java
diff --git a/v4/honeycomb/android/support/v4/app/ActivityCompatHoneycomb.java b/compat/honeycomb/android/support/v4/app/ActivityCompatHoneycomb.java
similarity index 100%
rename from v4/honeycomb/android/support/v4/app/ActivityCompatHoneycomb.java
rename to compat/honeycomb/android/support/v4/app/ActivityCompatHoneycomb.java
diff --git a/v4/honeycomb/android/support/v4/app/NotificationBuilderWithBuilderAccessor.java b/compat/honeycomb/android/support/v4/app/NotificationBuilderWithBuilderAccessor.java
similarity index 100%
rename from v4/honeycomb/android/support/v4/app/NotificationBuilderWithBuilderAccessor.java
rename to compat/honeycomb/android/support/v4/app/NotificationBuilderWithBuilderAccessor.java
diff --git a/v4/honeycomb/android/support/v4/app/NotificationCompatHoneycomb.java b/compat/honeycomb/android/support/v4/app/NotificationCompatHoneycomb.java
similarity index 100%
rename from v4/honeycomb/android/support/v4/app/NotificationCompatHoneycomb.java
rename to compat/honeycomb/android/support/v4/app/NotificationCompatHoneycomb.java
diff --git a/v4/honeycomb/android/support/v4/content/ContextCompatHoneycomb.java b/compat/honeycomb/android/support/v4/content/ContextCompatHoneycomb.java
similarity index 100%
rename from v4/honeycomb/android/support/v4/content/ContextCompatHoneycomb.java
rename to compat/honeycomb/android/support/v4/content/ContextCompatHoneycomb.java
diff --git a/v4/honeycomb/android/support/v4/content/ExecutorCompatHoneycomb.java b/compat/honeycomb/android/support/v4/content/ExecutorCompatHoneycomb.java
similarity index 100%
rename from v4/honeycomb/android/support/v4/content/ExecutorCompatHoneycomb.java
rename to compat/honeycomb/android/support/v4/content/ExecutorCompatHoneycomb.java
diff --git a/v4/honeycomb/android/support/v4/content/IntentCompatHoneycomb.java b/compat/honeycomb/android/support/v4/content/IntentCompatHoneycomb.java
similarity index 100%
rename from v4/honeycomb/android/support/v4/content/IntentCompatHoneycomb.java
rename to compat/honeycomb/android/support/v4/content/IntentCompatHoneycomb.java
diff --git a/v4/honeycomb/android/support/v4/graphics/drawable/DrawableCompatHoneycomb.java b/compat/honeycomb/android/support/v4/graphics/drawable/DrawableCompatHoneycomb.java
similarity index 100%
rename from v4/honeycomb/android/support/v4/graphics/drawable/DrawableCompatHoneycomb.java
rename to compat/honeycomb/android/support/v4/graphics/drawable/DrawableCompatHoneycomb.java
diff --git a/compat/honeycomb/android/support/v4/graphics/drawable/DrawableWrapperHoneycomb.java b/compat/honeycomb/android/support/v4/graphics/drawable/DrawableWrapperHoneycomb.java
new file mode 100644
index 0000000..4c494dd
--- /dev/null
+++ b/compat/honeycomb/android/support/v4/graphics/drawable/DrawableWrapperHoneycomb.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2015 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 android.support.v4.graphics.drawable;
+
+import android.content.res.Resources;
+import android.graphics.drawable.Drawable;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+
+class DrawableWrapperHoneycomb extends DrawableWrapperGingerbread {
+
+    DrawableWrapperHoneycomb(Drawable drawable) {
+        super(drawable);
+    }
+
+    DrawableWrapperHoneycomb(DrawableWrapperState state, Resources resources) {
+        super(state, resources);
+    }
+
+    @Override
+    public void jumpToCurrentState() {
+        mDrawable.jumpToCurrentState();
+    }
+
+    @NonNull
+    @Override
+    DrawableWrapperState mutateConstantState() {
+        return new DrawableWrapperStateHoneycomb(mState, null);
+    }
+
+    private static class DrawableWrapperStateHoneycomb extends DrawableWrapperState {
+        DrawableWrapperStateHoneycomb(@Nullable DrawableWrapperState orig,
+                @Nullable Resources res) {
+            super(orig, res);
+        }
+
+        @Override
+        public Drawable newDrawable(@Nullable Resources res) {
+            return new DrawableWrapperHoneycomb(this, res);
+        }
+    }
+}
diff --git a/v4/honeycomb/android/support/v4/os/AsyncTaskCompatHoneycomb.java b/compat/honeycomb/android/support/v4/os/AsyncTaskCompatHoneycomb.java
similarity index 100%
rename from v4/honeycomb/android/support/v4/os/AsyncTaskCompatHoneycomb.java
rename to compat/honeycomb/android/support/v4/os/AsyncTaskCompatHoneycomb.java
diff --git a/v4/honeycomb/android/support/v4/view/KeyEventCompatHoneycomb.java b/compat/honeycomb/android/support/v4/view/KeyEventCompatHoneycomb.java
similarity index 100%
rename from v4/honeycomb/android/support/v4/view/KeyEventCompatHoneycomb.java
rename to compat/honeycomb/android/support/v4/view/KeyEventCompatHoneycomb.java
diff --git a/v4/honeycomb/android/support/v4/view/LayoutInflaterCompatHC.java b/compat/honeycomb/android/support/v4/view/LayoutInflaterCompatHC.java
similarity index 100%
rename from v4/honeycomb/android/support/v4/view/LayoutInflaterCompatHC.java
rename to compat/honeycomb/android/support/v4/view/LayoutInflaterCompatHC.java
diff --git a/v4/honeycomb/android/support/v4/view/MenuItemCompatHoneycomb.java b/compat/honeycomb/android/support/v4/view/MenuItemCompatHoneycomb.java
similarity index 100%
rename from v4/honeycomb/android/support/v4/view/MenuItemCompatHoneycomb.java
rename to compat/honeycomb/android/support/v4/view/MenuItemCompatHoneycomb.java
diff --git a/v4/honeycomb/android/support/v4/view/VelocityTrackerCompatHoneycomb.java b/compat/honeycomb/android/support/v4/view/VelocityTrackerCompatHoneycomb.java
similarity index 100%
rename from v4/honeycomb/android/support/v4/view/VelocityTrackerCompatHoneycomb.java
rename to compat/honeycomb/android/support/v4/view/VelocityTrackerCompatHoneycomb.java
diff --git a/v4/honeycomb/android/support/v4/view/ViewCompatHC.java b/compat/honeycomb/android/support/v4/view/ViewCompatHC.java
similarity index 100%
rename from v4/honeycomb/android/support/v4/view/ViewCompatHC.java
rename to compat/honeycomb/android/support/v4/view/ViewCompatHC.java
diff --git a/v4/honeycomb/android/support/v4/view/ViewGroupCompatHC.java b/compat/honeycomb/android/support/v4/view/ViewGroupCompatHC.java
similarity index 100%
rename from v4/honeycomb/android/support/v4/view/ViewGroupCompatHC.java
rename to compat/honeycomb/android/support/v4/view/ViewGroupCompatHC.java
diff --git a/v4/honeycomb/android/support/v4/widget/SearchViewCompatHoneycomb.java b/compat/honeycomb/android/support/v4/widget/SearchViewCompatHoneycomb.java
similarity index 100%
rename from v4/honeycomb/android/support/v4/widget/SearchViewCompatHoneycomb.java
rename to compat/honeycomb/android/support/v4/widget/SearchViewCompatHoneycomb.java
diff --git a/v4/honeycomb_mr1/android/support/v4/animation/HoneycombMr1AnimatorCompatProvider.java b/compat/honeycomb_mr1/android/support/v4/animation/HoneycombMr1AnimatorCompatProvider.java
similarity index 100%
rename from v4/honeycomb_mr1/android/support/v4/animation/HoneycombMr1AnimatorCompatProvider.java
rename to compat/honeycomb_mr1/android/support/v4/animation/HoneycombMr1AnimatorCompatProvider.java
diff --git a/v4/honeycomb_mr1/android/support/v4/graphics/BitmapCompatHoneycombMr1.java b/compat/honeycomb_mr1/android/support/v4/graphics/BitmapCompatHoneycombMr1.java
similarity index 100%
rename from v4/honeycomb_mr1/android/support/v4/graphics/BitmapCompatHoneycombMr1.java
rename to compat/honeycomb_mr1/android/support/v4/graphics/BitmapCompatHoneycombMr1.java
diff --git a/v4/honeycomb_mr1/android/support/v4/view/MotionEventCompatHoneycombMr1.java b/compat/honeycomb_mr1/android/support/v4/view/MotionEventCompatHoneycombMr1.java
similarity index 100%
rename from v4/honeycomb_mr1/android/support/v4/view/MotionEventCompatHoneycombMr1.java
rename to compat/honeycomb_mr1/android/support/v4/view/MotionEventCompatHoneycombMr1.java
diff --git a/v4/honeycomb_mr2/android/support/v4/content/res/ConfigurationHelperHoneycombMr2.java b/compat/honeycomb_mr2/android/support/v4/content/res/ConfigurationHelperHoneycombMr2.java
similarity index 100%
rename from v4/honeycomb_mr2/android/support/v4/content/res/ConfigurationHelperHoneycombMr2.java
rename to compat/honeycomb_mr2/android/support/v4/content/res/ConfigurationHelperHoneycombMr2.java
diff --git a/v4/honeycomb_mr2/android/support/v4/net/ConnectivityManagerCompatHoneycombMR2.java b/compat/honeycomb_mr2/android/support/v4/net/ConnectivityManagerCompatHoneycombMR2.java
similarity index 100%
rename from v4/honeycomb_mr2/android/support/v4/net/ConnectivityManagerCompatHoneycombMR2.java
rename to compat/honeycomb_mr2/android/support/v4/net/ConnectivityManagerCompatHoneycombMR2.java
diff --git a/v4/honeycomb_mr2/android/support/v4/os/ParcelableCompatCreatorCallbacks.java b/compat/honeycomb_mr2/android/support/v4/os/ParcelableCompatCreatorCallbacks.java
similarity index 100%
rename from v4/honeycomb_mr2/android/support/v4/os/ParcelableCompatCreatorCallbacks.java
rename to compat/honeycomb_mr2/android/support/v4/os/ParcelableCompatCreatorCallbacks.java
diff --git a/v4/honeycomb_mr2/android/support/v4/os/ParcelableCompatHoneycombMR2.java b/compat/honeycomb_mr2/android/support/v4/os/ParcelableCompatHoneycombMR2.java
similarity index 100%
rename from v4/honeycomb_mr2/android/support/v4/os/ParcelableCompatHoneycombMR2.java
rename to compat/honeycomb_mr2/android/support/v4/os/ParcelableCompatHoneycombMR2.java
diff --git a/v4/ics-mr1/android/support/v4/content/IntentCompatIcsMr1.java b/compat/ics-mr1/android/support/v4/content/IntentCompatIcsMr1.java
similarity index 100%
rename from v4/ics-mr1/android/support/v4/content/IntentCompatIcsMr1.java
rename to compat/ics-mr1/android/support/v4/content/IntentCompatIcsMr1.java
diff --git a/v4/ics-mr1/android/support/v4/content/res/ResourcesCompatIcsMr1.java b/compat/ics-mr1/android/support/v4/content/res/ResourcesCompatIcsMr1.java
similarity index 100%
rename from v4/ics-mr1/android/support/v4/content/res/ResourcesCompatIcsMr1.java
rename to compat/ics-mr1/android/support/v4/content/res/ResourcesCompatIcsMr1.java
diff --git a/v4/ics-mr1/android/support/v4/view/ViewCompatICSMr1.java b/compat/ics-mr1/android/support/v4/view/ViewCompatICSMr1.java
similarity index 100%
rename from v4/ics-mr1/android/support/v4/view/ViewCompatICSMr1.java
rename to compat/ics-mr1/android/support/v4/view/ViewCompatICSMr1.java
diff --git a/v4/ics-mr1/android/support/v4/view/accessibility/AccessibilityRecordCompatIcsMr1.java b/compat/ics-mr1/android/support/v4/view/accessibility/AccessibilityRecordCompatIcsMr1.java
similarity index 100%
rename from v4/ics-mr1/android/support/v4/view/accessibility/AccessibilityRecordCompatIcsMr1.java
rename to compat/ics-mr1/android/support/v4/view/accessibility/AccessibilityRecordCompatIcsMr1.java
diff --git a/v4/ics/android/support/v4/accessibilityservice/AccessibilityServiceInfoCompatIcs.java b/compat/ics/android/support/v4/accessibilityservice/AccessibilityServiceInfoCompatIcs.java
similarity index 100%
rename from v4/ics/android/support/v4/accessibilityservice/AccessibilityServiceInfoCompatIcs.java
rename to compat/ics/android/support/v4/accessibilityservice/AccessibilityServiceInfoCompatIcs.java
diff --git a/v4/ics/android/support/v4/app/NotificationCompatIceCreamSandwich.java b/compat/ics/android/support/v4/app/NotificationCompatIceCreamSandwich.java
similarity index 100%
rename from v4/ics/android/support/v4/app/NotificationCompatIceCreamSandwich.java
rename to compat/ics/android/support/v4/app/NotificationCompatIceCreamSandwich.java
diff --git a/v4/ics/android/support/v4/app/NotificationManagerCompatIceCreamSandwich.java b/compat/ics/android/support/v4/app/NotificationManagerCompatIceCreamSandwich.java
similarity index 100%
rename from v4/ics/android/support/v4/app/NotificationManagerCompatIceCreamSandwich.java
rename to compat/ics/android/support/v4/app/NotificationManagerCompatIceCreamSandwich.java
diff --git a/v4/ics/android/support/v4/app/ShareCompatICS.java b/compat/ics/android/support/v4/app/ShareCompatICS.java
similarity index 100%
rename from v4/ics/android/support/v4/app/ShareCompatICS.java
rename to compat/ics/android/support/v4/app/ShareCompatICS.java
diff --git a/v4/ics/android/support/v4/net/DatagramSocketWrapper.java b/compat/ics/android/support/v4/net/DatagramSocketWrapper.java
similarity index 100%
rename from v4/ics/android/support/v4/net/DatagramSocketWrapper.java
rename to compat/ics/android/support/v4/net/DatagramSocketWrapper.java
diff --git a/v4/ics/android/support/v4/net/TrafficStatsCompatIcs.java b/compat/ics/android/support/v4/net/TrafficStatsCompatIcs.java
similarity index 100%
rename from v4/ics/android/support/v4/net/TrafficStatsCompatIcs.java
rename to compat/ics/android/support/v4/net/TrafficStatsCompatIcs.java
diff --git a/v4/ics/android/support/v4/text/ICUCompatIcs.java b/compat/ics/android/support/v4/text/ICUCompatIcs.java
similarity index 100%
rename from v4/ics/android/support/v4/text/ICUCompatIcs.java
rename to compat/ics/android/support/v4/text/ICUCompatIcs.java
diff --git a/v4/ics/android/support/v4/view/AccessibilityDelegateCompatIcs.java b/compat/ics/android/support/v4/view/AccessibilityDelegateCompatIcs.java
similarity index 100%
rename from v4/ics/android/support/v4/view/AccessibilityDelegateCompatIcs.java
rename to compat/ics/android/support/v4/view/AccessibilityDelegateCompatIcs.java
diff --git a/v4/ics/android/support/v4/view/MenuItemCompatIcs.java b/compat/ics/android/support/v4/view/MenuItemCompatIcs.java
similarity index 100%
rename from v4/ics/android/support/v4/view/MenuItemCompatIcs.java
rename to compat/ics/android/support/v4/view/MenuItemCompatIcs.java
diff --git a/v4/ics/android/support/v4/view/MotionEventCompatICS.java b/compat/ics/android/support/v4/view/MotionEventCompatICS.java
similarity index 100%
rename from v4/ics/android/support/v4/view/MotionEventCompatICS.java
rename to compat/ics/android/support/v4/view/MotionEventCompatICS.java
diff --git a/v4/ics/android/support/v4/view/ViewCompatICS.java b/compat/ics/android/support/v4/view/ViewCompatICS.java
similarity index 100%
rename from v4/ics/android/support/v4/view/ViewCompatICS.java
rename to compat/ics/android/support/v4/view/ViewCompatICS.java
diff --git a/v4/ics/android/support/v4/view/ViewConfigurationCompatICS.java b/compat/ics/android/support/v4/view/ViewConfigurationCompatICS.java
similarity index 100%
rename from v4/ics/android/support/v4/view/ViewConfigurationCompatICS.java
rename to compat/ics/android/support/v4/view/ViewConfigurationCompatICS.java
diff --git a/v4/ics/android/support/v4/view/ViewGroupCompatIcs.java b/compat/ics/android/support/v4/view/ViewGroupCompatIcs.java
similarity index 100%
rename from v4/ics/android/support/v4/view/ViewGroupCompatIcs.java
rename to compat/ics/android/support/v4/view/ViewGroupCompatIcs.java
diff --git a/v4/ics/android/support/v4/view/ViewParentCompatICS.java b/compat/ics/android/support/v4/view/ViewParentCompatICS.java
similarity index 100%
rename from v4/ics/android/support/v4/view/ViewParentCompatICS.java
rename to compat/ics/android/support/v4/view/ViewParentCompatICS.java
diff --git a/v4/ics/android/support/v4/view/ViewPropertyAnimatorCompatICS.java b/compat/ics/android/support/v4/view/ViewPropertyAnimatorCompatICS.java
similarity index 100%
rename from v4/ics/android/support/v4/view/ViewPropertyAnimatorCompatICS.java
rename to compat/ics/android/support/v4/view/ViewPropertyAnimatorCompatICS.java
diff --git a/v4/ics/android/support/v4/view/ViewPropertyAnimatorListener.java b/compat/ics/android/support/v4/view/ViewPropertyAnimatorListener.java
similarity index 100%
rename from v4/ics/android/support/v4/view/ViewPropertyAnimatorListener.java
rename to compat/ics/android/support/v4/view/ViewPropertyAnimatorListener.java
diff --git a/v4/java/android/support/v4/view/ViewPropertyAnimatorListenerAdapter.java b/compat/ics/android/support/v4/view/ViewPropertyAnimatorListenerAdapter.java
similarity index 100%
rename from v4/java/android/support/v4/view/ViewPropertyAnimatorListenerAdapter.java
rename to compat/ics/android/support/v4/view/ViewPropertyAnimatorListenerAdapter.java
diff --git a/v4/ics/android/support/v4/view/ViewPropertyAnimatorUpdateListener.java b/compat/ics/android/support/v4/view/ViewPropertyAnimatorUpdateListener.java
similarity index 100%
rename from v4/ics/android/support/v4/view/ViewPropertyAnimatorUpdateListener.java
rename to compat/ics/android/support/v4/view/ViewPropertyAnimatorUpdateListener.java
diff --git a/v4/ics/android/support/v4/view/accessibility/AccessibilityEventCompatIcs.java b/compat/ics/android/support/v4/view/accessibility/AccessibilityEventCompatIcs.java
similarity index 100%
rename from v4/ics/android/support/v4/view/accessibility/AccessibilityEventCompatIcs.java
rename to compat/ics/android/support/v4/view/accessibility/AccessibilityEventCompatIcs.java
diff --git a/v4/ics/android/support/v4/view/accessibility/AccessibilityManagerCompatIcs.java b/compat/ics/android/support/v4/view/accessibility/AccessibilityManagerCompatIcs.java
similarity index 100%
rename from v4/ics/android/support/v4/view/accessibility/AccessibilityManagerCompatIcs.java
rename to compat/ics/android/support/v4/view/accessibility/AccessibilityManagerCompatIcs.java
diff --git a/compat/ics/android/support/v4/view/accessibility/AccessibilityNodeInfoCompatIcs.java b/compat/ics/android/support/v4/view/accessibility/AccessibilityNodeInfoCompatIcs.java
new file mode 100644
index 0000000..17f9aa8
--- /dev/null
+++ b/compat/ics/android/support/v4/view/accessibility/AccessibilityNodeInfoCompatIcs.java
@@ -0,0 +1,219 @@
+/*
+ * 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 android.support.v4.view.accessibility;
+
+import android.graphics.Rect;
+import android.view.View;
+import android.view.accessibility.AccessibilityNodeInfo;
+
+import java.util.List;
+
+/**
+ * ICS specific AccessibilityNodeInfo API implementation.
+ */
+class AccessibilityNodeInfoCompatIcs {
+    public static Object obtain() {
+        return AccessibilityNodeInfo.obtain();
+    }
+
+    public static Object obtain(View source) {
+        return AccessibilityNodeInfo.obtain(source);
+    }
+
+    public static Object obtain(Object info) {
+        return AccessibilityNodeInfo.obtain((AccessibilityNodeInfo) info);
+    }
+
+    public static void addAction(Object info, int action) {
+        ((AccessibilityNodeInfo) info).addAction(action);
+    }
+
+    public static void addChild(Object info, View child) {
+        ((AccessibilityNodeInfo) info).addChild(child);
+    }
+
+    @SuppressWarnings("unchecked")
+    public static List<Object> findAccessibilityNodeInfosByText(Object info, String text) {
+        Object result = ((AccessibilityNodeInfo) info).findAccessibilityNodeInfosByText(text);
+        return (List<Object>) result;
+    }
+
+    public static int getActions(Object info) {
+        return ((AccessibilityNodeInfo) info).getActions();
+    }
+
+    public static void getBoundsInParent(Object info, Rect outBounds) {
+        ((AccessibilityNodeInfo) info).getBoundsInParent(outBounds);
+    }
+
+    public static void getBoundsInScreen(Object info, Rect outBounds) {
+        ((AccessibilityNodeInfo) info).getBoundsInScreen(outBounds);
+    }
+
+    public static Object getChild(Object info, int index) {
+        return ((AccessibilityNodeInfo) info).getChild(index);
+    }
+
+    public static int getChildCount(Object info) {
+        return ((AccessibilityNodeInfo) info).getChildCount();
+    }
+
+    public static CharSequence getClassName(Object info) {
+        return ((AccessibilityNodeInfo) info).getClassName();
+    }
+
+    public static CharSequence getContentDescription(Object info) {
+        return ((AccessibilityNodeInfo) info).getContentDescription();
+    }
+
+    public static CharSequence getPackageName(Object info) {
+        return ((AccessibilityNodeInfo) info).getPackageName();
+    }
+
+    public static Object getParent(Object info) {
+        return ((AccessibilityNodeInfo) info).getParent();
+    }
+
+    public static CharSequence getText(Object info) {
+        return ((AccessibilityNodeInfo) info).getText();
+    }
+
+    public static int getWindowId(Object info) {
+        return ((AccessibilityNodeInfo) info).getWindowId();
+    }
+
+    public static boolean isCheckable(Object info) {
+        return ((AccessibilityNodeInfo) info).isCheckable();
+    }
+
+    public static boolean isChecked(Object info) {
+        return ((AccessibilityNodeInfo) info).isChecked();
+    }
+
+    public static boolean isClickable(Object info) {
+        return ((AccessibilityNodeInfo) info).isClickable();
+    }
+
+    public static boolean isEnabled(Object info) {
+        return ((AccessibilityNodeInfo) info).isEnabled();
+    }
+
+    public static boolean isFocusable(Object info) {
+        return ((AccessibilityNodeInfo) info).isFocusable();
+    }
+
+    public static boolean isFocused(Object info) {
+        return ((AccessibilityNodeInfo) info).isFocused();
+    }
+
+    public static boolean isLongClickable(Object info) {
+        return ((AccessibilityNodeInfo) info).isLongClickable();
+    }
+
+    public static boolean isPassword(Object info) {
+        return ((AccessibilityNodeInfo) info).isPassword();
+    }
+
+    public static boolean isScrollable(Object info) {
+        return ((AccessibilityNodeInfo) info).isScrollable();
+    }
+
+    public static boolean isSelected(Object info) {
+        return ((AccessibilityNodeInfo) info).isSelected();
+    }
+
+    public static boolean performAction(Object info, int action) {
+        return ((AccessibilityNodeInfo) info).performAction(action);
+    }
+
+    public static void setBoundsInParent(Object info, Rect bounds) {
+        ((AccessibilityNodeInfo) info).setBoundsInParent(bounds);
+    }
+
+    public static void setBoundsInScreen(Object info, Rect bounds) {
+        ((AccessibilityNodeInfo) info).setBoundsInScreen(bounds);
+    }
+
+    public static void setCheckable(Object info, boolean checkable) {
+        ((AccessibilityNodeInfo) info).setCheckable(checkable);
+    }
+
+    public static void setChecked(Object info, boolean checked) {
+        ((AccessibilityNodeInfo) info).setChecked(checked);
+    }
+
+    public static void setClassName(Object info, CharSequence className) {
+        ((AccessibilityNodeInfo) info).setClassName(className);
+    }
+
+    public static void setClickable(Object info, boolean clickable) {
+        ((AccessibilityNodeInfo) info).setClickable(clickable);
+    }
+
+    public static void setContentDescription(Object info, CharSequence contentDescription) {
+        ((AccessibilityNodeInfo) info).setContentDescription(contentDescription);
+    }
+
+    public static void setEnabled(Object info, boolean enabled) {
+        ((AccessibilityNodeInfo) info).setEnabled(enabled);
+    }
+
+    public static void setFocusable(Object info, boolean focusable) {
+        ((AccessibilityNodeInfo) info).setFocusable(focusable);
+    }
+
+    public static void setFocused(Object info, boolean focused) {
+        ((AccessibilityNodeInfo) info).setFocused(focused);
+    }
+
+    public static void setLongClickable(Object info, boolean longClickable) {
+        ((AccessibilityNodeInfo) info).setLongClickable(longClickable);
+    }
+
+    public static void setPackageName(Object info, CharSequence packageName) {
+        ((AccessibilityNodeInfo) info).setPackageName(packageName);
+    }
+
+    public static void setParent(Object info, View parent) {
+        ((AccessibilityNodeInfo) info).setParent(parent);
+    }
+
+    public static void setPassword(Object info, boolean password) {
+        ((AccessibilityNodeInfo) info).setPassword(password);
+    }
+
+    public static void setScrollable(Object info, boolean scrollable) {
+        ((AccessibilityNodeInfo) info).setScrollable(scrollable);
+    }
+
+    public static void setSelected(Object info, boolean selected) {
+        ((AccessibilityNodeInfo) info).setSelected(selected);
+    }
+
+    public static void setSource(Object info, View source) {
+        ((AccessibilityNodeInfo) info).setSource(source);
+    }
+
+    public static void setText(Object info, CharSequence text) {
+        ((AccessibilityNodeInfo) info).setText(text);
+    }
+
+    public static void recycle(Object info) {
+        ((AccessibilityNodeInfo) info).recycle();
+    }
+
+}
diff --git a/v4/ics/android/support/v4/view/accessibility/AccessibilityRecordCompatIcs.java b/compat/ics/android/support/v4/view/accessibility/AccessibilityRecordCompatIcs.java
similarity index 100%
rename from v4/ics/android/support/v4/view/accessibility/AccessibilityRecordCompatIcs.java
rename to compat/ics/android/support/v4/view/accessibility/AccessibilityRecordCompatIcs.java
diff --git a/v4/ics/android/support/v4/widget/EdgeEffectCompatIcs.java b/compat/ics/android/support/v4/widget/EdgeEffectCompatIcs.java
similarity index 100%
rename from v4/ics/android/support/v4/widget/EdgeEffectCompatIcs.java
rename to compat/ics/android/support/v4/widget/EdgeEffectCompatIcs.java
diff --git a/v4/ics/android/support/v4/widget/ScrollerCompatIcs.java b/compat/ics/android/support/v4/widget/ScrollerCompatIcs.java
similarity index 100%
rename from v4/ics/android/support/v4/widget/ScrollerCompatIcs.java
rename to compat/ics/android/support/v4/widget/ScrollerCompatIcs.java
diff --git a/v4/ics/android/support/v4/widget/SearchViewCompatIcs.java b/compat/ics/android/support/v4/widget/SearchViewCompatIcs.java
similarity index 100%
rename from v4/ics/android/support/v4/widget/SearchViewCompatIcs.java
rename to compat/ics/android/support/v4/widget/SearchViewCompatIcs.java
diff --git a/compat/java/android/support/v4/accessibilityservice/AccessibilityServiceInfoCompat.java b/compat/java/android/support/v4/accessibilityservice/AccessibilityServiceInfoCompat.java
new file mode 100644
index 0000000..e9b50a0
--- /dev/null
+++ b/compat/java/android/support/v4/accessibilityservice/AccessibilityServiceInfoCompat.java
@@ -0,0 +1,455 @@
+/*
+ * 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 android.support.v4.accessibilityservice;
+
+import android.accessibilityservice.AccessibilityService;
+import android.accessibilityservice.AccessibilityServiceInfo;
+import android.content.pm.ResolveInfo;
+import android.os.Build;
+import android.view.View;
+
+/**
+ * Helper for accessing features in {@link android.accessibilityservice.AccessibilityService}
+ * introduced after API level 4 in a backwards compatible fashion.
+ */
+public final class AccessibilityServiceInfoCompat {
+
+    static interface AccessibilityServiceInfoVersionImpl {
+        public String getId(AccessibilityServiceInfo info);
+        public ResolveInfo getResolveInfo(AccessibilityServiceInfo info);
+        public boolean getCanRetrieveWindowContent(AccessibilityServiceInfo info);
+        public String getDescription(AccessibilityServiceInfo info);
+        public String getSettingsActivityName(AccessibilityServiceInfo info);
+        public int getCapabilities(AccessibilityServiceInfo info);
+    }
+
+    static class AccessibilityServiceInfoStubImpl implements AccessibilityServiceInfoVersionImpl {
+
+        @Override
+        public boolean getCanRetrieveWindowContent(AccessibilityServiceInfo info) {
+            return false;
+        }
+
+        @Override
+        public String getDescription(AccessibilityServiceInfo info) {
+            return null;
+        }
+
+        @Override
+        public String getId(AccessibilityServiceInfo info) {
+            return null;
+        }
+
+        @Override
+        public ResolveInfo getResolveInfo(AccessibilityServiceInfo info) {
+            return null;
+        }
+
+        @Override
+        public String getSettingsActivityName(AccessibilityServiceInfo info) {
+            return null;
+        }
+
+        @Override
+        public int getCapabilities(AccessibilityServiceInfo info) {
+            return 0;
+        }
+    }
+
+    static class AccessibilityServiceInfoIcsImpl extends AccessibilityServiceInfoStubImpl {
+
+        @Override
+        public boolean getCanRetrieveWindowContent(AccessibilityServiceInfo info) {
+            return AccessibilityServiceInfoCompatIcs.getCanRetrieveWindowContent(info);
+        }
+
+        @Override
+        public String getDescription(AccessibilityServiceInfo info) {
+            return AccessibilityServiceInfoCompatIcs.getDescription(info);
+        }
+
+        @Override
+        public String getId(AccessibilityServiceInfo info) {
+            return AccessibilityServiceInfoCompatIcs.getId(info);
+        }
+
+        @Override
+        public ResolveInfo getResolveInfo(AccessibilityServiceInfo info) {
+            return AccessibilityServiceInfoCompatIcs.getResolveInfo(info);
+        }
+
+        @Override
+        public String getSettingsActivityName(AccessibilityServiceInfo info) {
+            return AccessibilityServiceInfoCompatIcs.getSettingsActivityName(info);
+        }
+
+        @Override
+        public int getCapabilities(AccessibilityServiceInfo info) {
+            if (getCanRetrieveWindowContent(info)) {
+                return CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT;
+            }
+            return 0;
+        }
+    }
+
+    static class AccessibilityServiceInfoJellyBeanMr2 extends AccessibilityServiceInfoIcsImpl {
+        @Override
+        public int getCapabilities(AccessibilityServiceInfo info) {
+            return AccessibilityServiceInfoCompatJellyBeanMr2.getCapabilities(info);
+        }
+    }
+
+    static {
+        if (Build.VERSION.SDK_INT >= 18) { // JellyBean MR2
+            IMPL = new AccessibilityServiceInfoJellyBeanMr2();
+        } else if (Build.VERSION.SDK_INT >= 14) { // ICS
+            IMPL = new AccessibilityServiceInfoIcsImpl();
+        } else {
+            IMPL = new AccessibilityServiceInfoStubImpl();
+        }
+    }
+
+    // Capabilities
+
+    private static final AccessibilityServiceInfoVersionImpl IMPL;
+
+    /**
+     * Capability: This accessibility service can retrieve the active window content.
+     */
+    public static final int CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT = 0x00000001;
+
+    /**
+     * Capability: This accessibility service can request touch exploration mode in which
+     * touched items are spoken aloud and the UI can be explored via gestures.
+     */
+    public static final int CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION = 0x00000002;
+
+    /**
+     * Capability: This accessibility service can request enhanced web accessibility
+     * enhancements. For example, installing scripts to make app content more accessible.
+     */
+    public static final int CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 0x00000004;
+
+    /**
+     * Capability: This accessibility service can filter the key event stream.
+     */
+    public static final int CAPABILITY_CAN_FILTER_KEY_EVENTS = 0x00000008;
+
+    // Feedback types
+
+    /**
+     * Denotes braille feedback.
+     */
+    public static final int FEEDBACK_BRAILLE = 0x0000020;
+
+    /**
+     * Mask for all feedback types.
+     *
+     * @see AccessibilityServiceInfo#FEEDBACK_SPOKEN
+     * @see AccessibilityServiceInfo#FEEDBACK_HAPTIC
+     * @see AccessibilityServiceInfo#FEEDBACK_AUDIBLE
+     * @see AccessibilityServiceInfo#FEEDBACK_VISUAL
+     * @see AccessibilityServiceInfo#FEEDBACK_GENERIC
+     * @see FEEDBACK_BRAILLE
+     */
+    public static final int FEEDBACK_ALL_MASK = 0xFFFFFFFF;
+
+    // Flags
+
+    /**
+     * If an {@link AccessibilityService} is the default for a given type.
+     * Default service is invoked only if no package specific one exists. In case of
+     * more than one package specific service only the earlier registered is notified.
+     */
+    public static final int DEFAULT = 0x0000001;
+
+    /**
+     * If this flag is set the system will regard views that are not important
+     * for accessibility in addition to the ones that are important for accessibility.
+     * That is, views that are marked as not important for accessibility via
+     * {@link View#IMPORTANT_FOR_ACCESSIBILITY_NO} or
+     * {@link View#IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS} and views that are
+     * marked as potentially important for accessibility via
+     * {@link View#IMPORTANT_FOR_ACCESSIBILITY_AUTO} for which the system has determined
+     * that are not important for accessibility, are both reported while querying the
+     * window content and also the accessibility service will receive accessibility events
+     * from them.
+     * <p>
+     * <strong>Note:</strong> For accessibility services targeting API version
+     * {@link Build.VERSION_CODES#JELLY_BEAN} or higher this flag has to be explicitly
+     * set for the system to regard views that are not important for accessibility. For
+     * accessibility services targeting API version lower than
+     * {@link Build.VERSION_CODES#JELLY_BEAN} this flag is ignored and all views are
+     * regarded for accessibility purposes.
+     * </p>
+     * <p>
+     * Usually views not important for accessibility are layout managers that do not
+     * react to user actions, do not draw any content, and do not have any special
+     * semantics in the context of the screen content. For example, a three by three
+     * grid can be implemented as three horizontal linear layouts and one vertical,
+     * or three vertical linear layouts and one horizontal, or one grid layout, etc.
+     * In this context the actual layout mangers used to achieve the grid configuration
+     * are not important, rather it is important that there are nine evenly distributed
+     * elements.
+     * </p>
+     */
+    public static final int FLAG_INCLUDE_NOT_IMPORTANT_VIEWS = 0x0000002;
+
+    /**
+     * This flag requests that the system gets into touch exploration mode.
+     * In this mode a single finger moving on the screen behaves as a mouse
+     * pointer hovering over the user interface. The system will also detect
+     * certain gestures performed on the touch screen and notify this service.
+     * The system will enable touch exploration mode if there is at least one
+     * accessibility service that has this flag set. Hence, clearing this
+     * flag does not guarantee that the device will not be in touch exploration
+     * mode since there may be another enabled service that requested it.
+     * <p>
+     * For accessibility services targeting API version higher than
+     * {@link Build.VERSION_CODES#JELLY_BEAN_MR1} that want to set
+     * this flag have to declare this capability in their meta-data by setting
+     * the attribute canRequestTouchExplorationMode to true, otherwise this flag
+     * will be ignored. For how to declare the meta-data of a service refer to
+     * {@value AccessibilityService#SERVICE_META_DATA}.
+     * </p>
+     * <p>
+     * Services targeting API version equal to or lower than
+     * {@link Build.VERSION_CODES#JELLY_BEAN_MR1} will work normally, i.e.
+     * the first time they are run, if this flag is specified, a dialog is
+     * shown to the user to confirm enabling explore by touch.
+     * </p>
+     */
+    public static final int FLAG_REQUEST_TOUCH_EXPLORATION_MODE = 0x0000004;
+
+    /**
+     * This flag requests from the system to enable web accessibility enhancing
+     * extensions. Such extensions aim to provide improved accessibility support
+     * for content presented in a {@link android.webkit.WebView}. An example of such
+     * an extension is injecting JavaScript from a secure source. The system will enable
+     * enhanced web accessibility if there is at least one accessibility service
+     * that has this flag set. Hence, clearing this flag does not guarantee that the
+     * device will not have enhanced web accessibility enabled since there may be
+     * another enabled service that requested it.
+     * <p>
+     * Services that want to set this flag have to declare this capability
+     * in their meta-data by setting the attribute canRequestEnhancedWebAccessibility
+     * to true, otherwise this flag will be ignored. For how to declare the meta-data
+     * of a service refer to {@value AccessibilityService#SERVICE_META_DATA}.
+     * </p>
+     */
+    public static final int FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 0x00000008;
+
+    /**
+     * This flag requests that the AccessibilityNodeInfos obtained
+     * by an {@link AccessibilityService} contain the id of the source view.
+     * The source view id will be a fully qualified resource name of the
+     * form "package:id/name", for example "foo.bar:id/my_list", and it is
+     * useful for UI test automation. This flag is not set by default.
+     */
+    public static final int FLAG_REPORT_VIEW_IDS = 0x00000010;
+
+    /**
+     * This flag requests from the system to filter key events. If this flag
+     * is set the accessibility service will receive the key events before
+     * applications allowing it implement global shortcuts. Setting this flag
+     * does not guarantee that this service will filter key events since only
+     * one service can do so at any given time. This avoids user confusion due
+     * to behavior change in case different key filtering services are enabled.
+     * If there is already another key filtering service enabled, this one will
+     * not receive key events.
+     * <p>
+     * Services that want to set this flag have to declare this capability
+     * in their meta-data by setting the attribute canRequestFilterKeyEvents
+     * to true, otherwise this flag will be ignored. For how to declare the meta
+     * -data of a service refer to {@value AccessibilityService#SERVICE_META_DATA}.
+     * </p>
+     */
+    public static final int FLAG_REQUEST_FILTER_KEY_EVENTS = 0x00000020;
+
+    /*
+     * Hide constructor
+     */
+    private AccessibilityServiceInfoCompat() {}
+
+    /**
+     * The accessibility service id.
+     * <p>
+     * <strong>Generated by the system.</strong>
+     * </p>
+     *
+     * @return The id.
+     */
+    public static String getId(AccessibilityServiceInfo info) {
+        return IMPL.getId(info);
+    }
+
+    /**
+     * The service {@link ResolveInfo}.
+     * <p>
+     * <strong>Generated by the system.</strong>
+     * </p>
+     *
+     * @return The info.
+     */
+    public static ResolveInfo getResolveInfo(AccessibilityServiceInfo info) {
+        return IMPL.getResolveInfo(info);
+    }
+
+    /**
+     * The settings activity name.
+     * <p>
+     * <strong>Statically set from {@link AccessibilityService#SERVICE_META_DATA
+     * meta-data}.</strong>
+     * </p>
+     *
+     * @return The settings activity name.
+     */
+    public static String getSettingsActivityName(AccessibilityServiceInfo info) {
+        return IMPL.getSettingsActivityName(info);
+    }
+
+    /**
+     * Whether this service can retrieve the current window's content.
+     * <p>
+     * <strong>Statically set from {@link AccessibilityService#SERVICE_META_DATA
+     * meta-data}.</strong>
+     * </p>
+     *
+     * @return True window content can be retrieved.
+     */
+    public static boolean getCanRetrieveWindowContent(AccessibilityServiceInfo info) {
+        return IMPL.getCanRetrieveWindowContent(info);
+    }
+
+    /**
+     * Description of the accessibility service.
+     * <p>
+     * <strong>Statically set from {@link AccessibilityService#SERVICE_META_DATA
+     * meta-data}.</strong>
+     * </p>
+     *
+     * @return The description.
+     */
+    public static String getDescription(AccessibilityServiceInfo info) {
+        return IMPL.getDescription(info);
+    }
+
+    /**
+     * Returns the string representation of a feedback type. For example,
+     * {@link AccessibilityServiceInfo#FEEDBACK_SPOKEN} is represented by the
+     * string FEEDBACK_SPOKEN.
+     *
+     * @param feedbackType The feedback type.
+     * @return The string representation.
+     */
+    public static String feedbackTypeToString(int feedbackType) {
+        StringBuilder builder = new StringBuilder();
+        builder.append("[");
+        while (feedbackType > 0) {
+            final int feedbackTypeFlag = 1 << Integer.numberOfTrailingZeros(feedbackType);
+            feedbackType &= ~feedbackTypeFlag;
+            if (builder.length() > 1) {
+                builder.append(", ");
+            }
+            switch (feedbackTypeFlag) {
+                case AccessibilityServiceInfo.FEEDBACK_AUDIBLE:
+                    builder.append("FEEDBACK_AUDIBLE");
+                    break;
+                case AccessibilityServiceInfo.FEEDBACK_HAPTIC:
+                    builder.append("FEEDBACK_HAPTIC");
+                    break;
+                case AccessibilityServiceInfo.FEEDBACK_GENERIC:
+                    builder.append("FEEDBACK_GENERIC");
+                    break;
+                case AccessibilityServiceInfo.FEEDBACK_SPOKEN:
+                    builder.append("FEEDBACK_SPOKEN");
+                    break;
+                case AccessibilityServiceInfo.FEEDBACK_VISUAL:
+                    builder.append("FEEDBACK_VISUAL");
+                    break;
+            }
+        }
+        builder.append("]");
+        return builder.toString();
+    }
+
+    /**
+     * Returns the string representation of a flag. For example,
+     * {@link AccessibilityServiceInfo#DEFAULT} is represented by the
+     * string DEFAULT.
+     *
+     * @param flag The flag.
+     * @return The string representation.
+     */
+    public static String flagToString(int flag) {
+        switch (flag) {
+            case DEFAULT:
+                return "DEFAULT";
+            case FLAG_INCLUDE_NOT_IMPORTANT_VIEWS:
+                return "FLAG_INCLUDE_NOT_IMPORTANT_VIEWS";
+            case FLAG_REQUEST_TOUCH_EXPLORATION_MODE:
+                return "FLAG_REQUEST_TOUCH_EXPLORATION_MODE";
+            case FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY:
+                return "FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY";
+            case FLAG_REPORT_VIEW_IDS:
+                return "FLAG_REPORT_VIEW_IDS";
+            case FLAG_REQUEST_FILTER_KEY_EVENTS:
+                return "FLAG_REQUEST_FILTER_KEY_EVENTS";
+            default:
+                return null;
+        }
+    }
+
+    /**
+     * Returns the bit mask of capabilities this accessibility service has such as
+     * being able to retrieve the active window content, etc.
+     *
+     * @param info The service info whose capabilities to get.
+     * @return The capability bit mask.
+     *
+     * @see #CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT
+     * @see #CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION
+     * @see #CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY
+     * @see #CAPABILITY_CAN_FILTER_KEY_EVENTS
+     */
+    public static int getCapabilities(AccessibilityServiceInfo info) {
+        return IMPL.getCapabilities(info);
+    }
+
+    /**
+     * Returns the string representation of a capability. For example,
+     * {@link #CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT} is represented
+     * by the string CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT.
+     *
+     * @param capability The capability.
+     * @return The string representation.
+     */
+    public static String capabilityToString(int capability) {
+        switch (capability) {
+            case CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT:
+                return "CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT";
+            case CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION:
+                return "CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION";
+            case CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY:
+                return "CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY";
+            case CAPABILITY_CAN_FILTER_KEY_EVENTS:
+                return "CAPABILITY_CAN_FILTER_KEY_EVENTS";
+            default:
+                return "UNKNOWN";
+        }
+    }
+}
diff --git a/v4/java/android/support/v4/accessibilityservice/package.html b/compat/java/android/support/v4/accessibilityservice/package.html
similarity index 100%
rename from v4/java/android/support/v4/accessibilityservice/package.html
rename to compat/java/android/support/v4/accessibilityservice/package.html
diff --git a/compat/java/android/support/v4/animation/AnimatorCompatHelper.java b/compat/java/android/support/v4/animation/AnimatorCompatHelper.java
new file mode 100644
index 0000000..389719e
--- /dev/null
+++ b/compat/java/android/support/v4/animation/AnimatorCompatHelper.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2015 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 android.support.v4.animation;
+
+import android.os.Build;
+import android.view.View;
+
+/**
+ * @hide
+ */
+public final class AnimatorCompatHelper {
+
+    private final static AnimatorProvider IMPL;
+
+    static {
+        if (Build.VERSION.SDK_INT >= 12) {
+            IMPL = new HoneycombMr1AnimatorCompatProvider();
+        } else {
+            IMPL = new GingerbreadAnimatorCompatProvider();
+        }
+    }
+
+    public static ValueAnimatorCompat emptyValueAnimator() {
+        return IMPL.emptyValueAnimator();
+    }
+
+    private AnimatorCompatHelper() {}
+
+    public static void clearInterpolator(View view) {
+        IMPL.clearInterpolator(view);
+    }
+}
diff --git a/compat/java/android/support/v4/app/ActivityCompat.java b/compat/java/android/support/v4/app/ActivityCompat.java
new file mode 100644
index 0000000..ac3b991
--- /dev/null
+++ b/compat/java/android/support/v4/app/ActivityCompat.java
@@ -0,0 +1,538 @@
+/*
+ * 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 android.support.v4.app;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentSender;
+import android.content.pm.PackageManager;
+import android.graphics.Matrix;
+import android.graphics.RectF;
+import android.net.Uri;
+import android.os.Build;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Parcelable;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.v4.content.ContextCompat;
+import android.view.View;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Helper for accessing features in {@link android.app.Activity}
+ * introduced after API level 4 in a backwards compatible fashion.
+ */
+public class ActivityCompat extends ContextCompat {
+
+    /**
+     * This interface is the contract for receiving the results for permission requests.
+     */
+    public interface OnRequestPermissionsResultCallback {
+
+        /**
+         * Callback for the result from requesting permissions. This method
+         * is invoked for every call on {@link #requestPermissions(android.app.Activity,
+         * String[], int)}.
+         * <p>
+         * <strong>Note:</strong> It is possible that the permissions request interaction
+         * with the user is interrupted. In this case you will receive empty permissions
+         * and results arrays which should be treated as a cancellation.
+         * </p>
+         *
+         * @param requestCode The request code passed in {@link #requestPermissions(
+         * android.app.Activity, String[], int)}
+         * @param permissions The requested permissions. Never null.
+         * @param grantResults The grant results for the corresponding permissions
+         *     which is either {@link android.content.pm.PackageManager#PERMISSION_GRANTED}
+         *     or {@link android.content.pm.PackageManager#PERMISSION_DENIED}. Never null.
+         *
+         * @see #requestPermissions(android.app.Activity, String[], int)
+         */
+        void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
+                @NonNull int[] grantResults);
+    }
+
+    /**
+     * Invalidate the activity's options menu, if able.
+     *
+     * <p>Before API level 11 (Android 3.0/Honeycomb) the lifecycle of the
+     * options menu was controlled primarily by the user's operation of
+     * the hardware menu key. When the user presses down on the menu key
+     * for the first time the menu was created and prepared by calls
+     * to {@link Activity#onCreateOptionsMenu(android.view.Menu)} and
+     * {@link Activity#onPrepareOptionsMenu(android.view.Menu)} respectively.
+     * Subsequent presses of the menu key kept the existing instance of the
+     * Menu itself and called {@link Activity#onPrepareOptionsMenu(android.view.Menu)}
+     * to give the activity an opportunity to contextually alter the menu
+     * before the menu panel was shown.</p>
+     *
+     * <p>In Android 3.0+ the Action Bar forces the options menu to be built early
+     * so that items chosen to show as actions may be displayed when the activity
+     * first becomes visible. The Activity method invalidateOptionsMenu forces
+     * the entire menu to be destroyed and recreated from
+     * {@link Activity#onCreateOptionsMenu(android.view.Menu)}, offering a similar
+     * though heavier-weight opportunity to change the menu's contents. Normally
+     * this functionality is used to support a changing configuration of Fragments.</p>
+     *
+     * <p>Applications may use this support helper to signal a significant change in
+     * activity state that should cause the options menu to be rebuilt. If the app
+     * is running on an older platform version that does not support menu invalidation
+     * the app will still receive {@link Activity#onPrepareOptionsMenu(android.view.Menu)}
+     * the next time the user presses the menu key and this method will return false.
+     * If this method returns true the options menu was successfully invalidated.</p>
+     *
+     * @param activity Invalidate the options menu of this activity
+     * @return true if this operation was supported and it completed; false if it was not available.
+     */
+    public static boolean invalidateOptionsMenu(Activity activity) {
+        if (Build.VERSION.SDK_INT >= 11) {
+            ActivityCompatHoneycomb.invalidateOptionsMenu(activity);
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * Start an activity with additional launch information, if able.
+     *
+     * <p>In Android 4.1+ additional options were introduced to allow for more
+     * control on activity launch animations. Applications can use this method
+     * along with {@link ActivityOptionsCompat} to use these animations when
+     * available. When run on versions of the platform where this feature does
+     * not exist the activity will be launched normally.</p>
+     *
+     * @param activity Context to launch activity from.
+     * @param intent The description of the activity to start.
+     * @param options Additional options for how the Activity should be started.
+     *                May be null if there are no options. See
+     *                {@link ActivityOptionsCompat} for how to build the Bundle
+     *                supplied here; there are no supported definitions for
+     *                building it manually.
+     */
+    public static void startActivity(Activity activity, Intent intent, @Nullable Bundle options) {
+        if (Build.VERSION.SDK_INT >= 16) {
+            ActivityCompatJB.startActivity(activity, intent, options);
+        } else {
+            activity.startActivity(intent);
+        }
+    }
+
+    /**
+     * Start new activity with options, if able, for which you would like a
+     * result when it finished.
+     *
+     * <p>In Android 4.1+ additional options were introduced to allow for more
+     * control on activity launch animations. Applications can use this method
+     * along with {@link ActivityOptionsCompat} to use these animations when
+     * available. When run on versions of the platform where this feature does
+     * not exist the activity will be launched normally.</p>
+     *
+     * @param activity Origin activity to launch from.
+     * @param intent The description of the activity to start.
+     * @param requestCode If >= 0, this code will be returned in
+     *                   onActivityResult() when the activity exits.
+     * @param options Additional options for how the Activity should be started.
+     *                May be null if there are no options. See
+     *                {@link ActivityOptionsCompat} for how to build the Bundle
+     *                supplied here; there are no supported definitions for
+     *                building it manually.
+     */
+    public static void startActivityForResult(Activity activity, Intent intent, int requestCode,
+            @Nullable Bundle options) {
+        if (Build.VERSION.SDK_INT >= 16) {
+            ActivityCompatJB.startActivityForResult(activity, intent, requestCode, options);
+        } else {
+            activity.startActivityForResult(intent, requestCode);
+        }
+    }
+
+    /**
+     * Start new IntentSender with options, if able, for which you would like a
+     * result when it finished.
+     *
+     * <p>In Android 4.1+ additional options were introduced to allow for more
+     * control on activity launch animations. Applications can use this method
+     * along with {@link ActivityOptionsCompat} to use these animations when
+     * available. When run on versions of the platform where this feature does
+     * not exist the activity will be launched normally.</p>
+     *
+     * @param activity Origin activity to launch from.
+     * @param intent The IntentSender to launch.
+     * @param requestCode If >= 0, this code will be returned in
+     *                   onActivityResult() when the activity exits.
+     * @param fillInIntent If non-null, this will be provided as the
+     *                     intent parameter to {@link IntentSender#sendIntent}.
+     * @param flagsMask Intent flags in the original IntentSender that you
+     *                  would like to change.
+     * @param flagsValues Desired values for any bits set in <var>flagsMask</var>
+     * @param extraFlags Always set to 0.
+     * @param options Additional options for how the Activity should be started.
+     *                May be null if there are no options. See
+     *                {@link ActivityOptionsCompat} for how to build the Bundle
+     *                supplied here; there are no supported definitions for
+     *                building it manually.
+     */
+    public static void startIntentSenderForResult(Activity activity, IntentSender intent,
+            int requestCode, Intent fillInIntent, int flagsMask, int flagsValues,
+            int extraFlags, @Nullable Bundle options) throws IntentSender.SendIntentException {
+        if (Build.VERSION.SDK_INT >= 16) {
+            ActivityCompatJB.startIntentSenderForResult(activity, intent, requestCode, fillInIntent,
+                    flagsMask, flagsValues, extraFlags, options);
+        } else {
+            activity.startIntentSenderForResult(intent, requestCode, fillInIntent, flagsMask,
+                    flagsValues, extraFlags);
+        }
+    }
+
+    /**
+     * Finish this activity, and tries to finish all activities immediately below it
+     * in the current task that have the same affinity.
+     *
+     * <p>On Android 4.1+ calling this method will call through to the native version of this
+     * method. For other platforms {@link Activity#finish()} will be called instead.</p>
+     */
+    public static void finishAffinity(Activity activity) {
+        if (Build.VERSION.SDK_INT >= 16) {
+            ActivityCompatJB.finishAffinity(activity);
+        } else {
+            activity.finish();
+        }
+    }
+
+    /**
+     * Reverses the Activity Scene entry Transition and triggers the calling Activity
+     * to reverse its exit Transition. When the exit Transition completes,
+     * {@link Activity#finish()} is called. If no entry Transition was used, finish() is called
+     * immediately and the Activity exit Transition is run.
+     *
+     * <p>On Android 4.4 or lower, this method only finishes the Activity with no
+     * special exit transition.</p>
+     */
+    public static void finishAfterTransition(Activity activity) {
+        if (Build.VERSION.SDK_INT >= 21) {
+            ActivityCompat21.finishAfterTransition(activity);
+        } else {
+            activity.finish();
+        }
+    }
+
+    /**
+     * Backwards compatible implementation of {@link android.app.Activity#getReferrer()
+     * Activity.getReferrer}.  Uses the platform's implementation if available, otherwise
+     * only falls back to digging any explicitly specified referrer from the activity's intent.
+     */
+    public Uri getReferrer(Activity activity) {
+        if (Build.VERSION.SDK_INT >= 22) {
+            return ActivityCompat22.getReferrer(activity);
+        }
+        Intent intent = activity.getIntent();
+        Uri referrer = intent.getParcelableExtra("android.intent.extra.REFERRER");
+        if (referrer != null) {
+            return referrer;
+        }
+        String referrerName = intent.getStringExtra("android.intent.extra.REFERRER_NAME");
+        if (referrerName != null) {
+            return Uri.parse(referrerName);
+        }
+        return null;
+    }
+
+    /**
+     * When {@link android.app.ActivityOptions#makeSceneTransitionAnimation(Activity,
+     * android.view.View, String)} was used to start an Activity, <var>callback</var>
+     * will be called to handle shared elements on the <i>launched</i> Activity. This requires
+     * {@link android.view.Window#FEATURE_CONTENT_TRANSITIONS}.
+     *
+     * @param callback Used to manipulate shared element transitions on the launched Activity.
+     */
+    public static void setEnterSharedElementCallback(Activity activity,
+            SharedElementCallback callback) {
+        if (Build.VERSION.SDK_INT >= 23) {
+            ActivityCompatApi23.setEnterSharedElementCallback(activity, createCallback23(callback));
+        } else if (Build.VERSION.SDK_INT >= 21) {
+            ActivityCompat21.setEnterSharedElementCallback(activity, createCallback(callback));
+        }
+    }
+
+    /**
+     * When {@link android.app.ActivityOptions#makeSceneTransitionAnimation(Activity,
+     * android.view.View, String)} was used to start an Activity, <var>callback</var>
+     * will be called to handle shared elements on the <i>launching</i> Activity. Most
+     * calls will only come when returning from the started Activity.
+     * This requires {@link android.view.Window#FEATURE_CONTENT_TRANSITIONS}.
+     *
+     * @param callback Used to manipulate shared element transitions on the launching Activity.
+     */
+    public static void setExitSharedElementCallback(Activity activity,
+            SharedElementCallback callback) {
+        if (Build.VERSION.SDK_INT >= 23) {
+            ActivityCompatApi23.setExitSharedElementCallback(activity, createCallback23(callback));
+        } else if (Build.VERSION.SDK_INT >= 21) {
+            ActivityCompat21.setExitSharedElementCallback(activity, createCallback(callback));
+        }
+    }
+
+    public static void postponeEnterTransition(Activity activity) {
+        if (Build.VERSION.SDK_INT >= 21) {
+            ActivityCompat21.postponeEnterTransition(activity);
+        }
+    }
+
+    public static void startPostponedEnterTransition(Activity activity) {
+        if (Build.VERSION.SDK_INT >= 21) {
+            ActivityCompat21.startPostponedEnterTransition(activity);
+        }
+    }
+
+    /**
+     * Requests permissions to be granted to this application. These permissions
+     * must be requested in your manifest, they should not be granted to your app,
+     * and they should have protection level {@link android.content.pm.PermissionInfo
+     * #PROTECTION_DANGEROUS dangerous}, regardless whether they are declared by
+     * the platform or a third-party app.
+     * <p>
+     * Normal permissions {@link android.content.pm.PermissionInfo#PROTECTION_NORMAL}
+     * are granted at install time if requested in the manifest. Signature permissions
+     * {@link android.content.pm.PermissionInfo#PROTECTION_SIGNATURE} are granted at
+     * install time if requested in the manifest and the signature of your app matches
+     * the signature of the app declaring the permissions.
+     * </p>
+     * <p>
+     * If your app does not have the requested permissions the user will be presented
+     * with UI for accepting them. After the user has accepted or rejected the
+     * requested permissions you will receive a callback reporting whether the
+     * permissions were granted or not. Your activity has to implement {@link
+     * android.support.v4.app.ActivityCompat.OnRequestPermissionsResultCallback}
+     * and the results of permission requests will be delivered to its {@link
+     * android.support.v4.app.ActivityCompat.OnRequestPermissionsResultCallback#onRequestPermissionsResult(
+     * int, String[], int[])} method.
+     * </p>
+     * <p>
+     * Note that requesting a permission does not guarantee it will be granted and
+     * your app should be able to run without having this permission.
+     * </p>
+     * <p>
+     * This method may start an activity allowing the user to choose which permissions
+     * to grant and which to reject. Hence, you should be prepared that your activity
+     * may be paused and resumed. Further, granting some permissions may require
+     * a restart of you application. In such a case, the system will recreate the
+     * activity stack before delivering the result to your onRequestPermissionsResult(
+     * int, String[], int[]).
+     * </p>
+     * <p>
+     * When checking whether you have a permission you should use {@link
+     * #checkSelfPermission(android.content.Context, String)}.
+     * </p>
+     * <p>
+     * Calling this API for permissions already granted to your app would show UI
+     * to the user to decided whether the app can still hold these permissions. This
+     * can be useful if the way your app uses the data guarded by the permissions
+     * changes significantly.
+     * </p>
+     *
+     * @param activity The target activity.
+     * @param permissions The requested permissions.
+     * @param requestCode Application specific request code to match with a result
+     *    reported to {@link OnRequestPermissionsResultCallback#onRequestPermissionsResult(
+     *    int, String[], int[])}.
+     *
+     * @see #checkSelfPermission(android.content.Context, String)
+     * @see #shouldShowRequestPermissionRationale(android.app.Activity, String)
+     */
+    public static void requestPermissions(final @NonNull Activity activity,
+            final @NonNull String[] permissions, final int requestCode) {
+        if (Build.VERSION.SDK_INT >= 23) {
+            ActivityCompatApi23.requestPermissions(activity, permissions, requestCode);
+        } else if (activity instanceof OnRequestPermissionsResultCallback) {
+            Handler handler = new Handler(Looper.getMainLooper());
+            handler.post(new Runnable() {
+                @Override
+                public void run() {
+                    final int[] grantResults = new int[permissions.length];
+
+                    PackageManager packageManager = activity.getPackageManager();
+                    String packageName = activity.getPackageName();
+
+                    final int permissionCount = permissions.length;
+                    for (int i = 0; i < permissionCount; i++) {
+                        grantResults[i] = packageManager.checkPermission(
+                                permissions[i], packageName);
+                    }
+
+                    ((OnRequestPermissionsResultCallback) activity).onRequestPermissionsResult(
+                            requestCode, permissions, grantResults);
+                }
+            });
+        }
+    }
+
+    /**
+     * Gets whether you should show UI with rationale for requesting a permission.
+     * You should do this only if you do not have the permission and the context in
+     * which the permission is requested does not clearly communicate to the user
+     * what would be the benefit from granting this permission.
+     * <p>
+     * For example, if you write a camera app, requesting the camera permission
+     * would be expected by the user and no rationale for why it is requested is
+     * needed. If however, the app needs location for tagging photos then a non-tech
+     * savvy user may wonder how location is related to taking photos. In this case
+     * you may choose to show UI with rationale of requesting this permission.
+     * </p>
+     *
+     * @param activity The target activity.
+     * @param permission A permission your app wants to request.
+     * @return Whether you can show permission rationale UI.
+     *
+     * @see #checkSelfPermission(android.content.Context, String)
+     * @see #requestPermissions(android.app.Activity, String[], int)
+     */
+    public static boolean shouldShowRequestPermissionRationale(@NonNull Activity activity,
+            @NonNull String permission) {
+        if (Build.VERSION.SDK_INT >= 23) {
+            return ActivityCompatApi23.shouldShowRequestPermissionRationale(activity, permission);
+        }
+        return false;
+    }
+
+    private static ActivityCompat21.SharedElementCallback21 createCallback(
+            SharedElementCallback callback) {
+        ActivityCompat21.SharedElementCallback21 newCallback = null;
+        if (callback != null) {
+            newCallback = new ActivityCompat.SharedElementCallback21Impl(callback);
+        }
+        return newCallback;
+    }
+
+    private static ActivityCompatApi23.SharedElementCallback23 createCallback23(
+            SharedElementCallback callback) {
+        ActivityCompatApi23.SharedElementCallback23 newCallback = null;
+        if (callback != null) {
+            newCallback = new ActivityCompat.SharedElementCallback23Impl(callback);
+        }
+        return newCallback;
+    }
+
+    private static class SharedElementCallback21Impl
+            extends ActivityCompat21.SharedElementCallback21 {
+
+        private SharedElementCallback mCallback;
+
+        public SharedElementCallback21Impl(SharedElementCallback callback) {
+            mCallback = callback;
+        }
+
+        @Override
+        public void onSharedElementStart(List<String> sharedElementNames,
+                List<View> sharedElements, List<View> sharedElementSnapshots) {
+            mCallback.onSharedElementStart(sharedElementNames, sharedElements,
+                    sharedElementSnapshots);
+        }
+
+        @Override
+        public void onSharedElementEnd(List<String> sharedElementNames, List<View> sharedElements,
+                List<View> sharedElementSnapshots) {
+            mCallback.onSharedElementEnd(sharedElementNames, sharedElements,
+                    sharedElementSnapshots);
+        }
+
+        @Override
+        public void onRejectSharedElements(List<View> rejectedSharedElements) {
+            mCallback.onRejectSharedElements(rejectedSharedElements);
+        }
+
+        @Override
+        public void onMapSharedElements(List<String> names, Map<String, View> sharedElements) {
+            mCallback.onMapSharedElements(names, sharedElements);
+        }
+
+        @Override
+        public Parcelable onCaptureSharedElementSnapshot(View sharedElement,
+                Matrix viewToGlobalMatrix, RectF screenBounds) {
+            return mCallback.onCaptureSharedElementSnapshot(sharedElement, viewToGlobalMatrix,
+                    screenBounds);
+        }
+
+        @Override
+        public View onCreateSnapshotView(Context context, Parcelable snapshot) {
+            return mCallback.onCreateSnapshotView(context, snapshot);
+        }
+    }
+
+    private static class SharedElementCallback23Impl
+            extends ActivityCompatApi23.SharedElementCallback23 {
+
+        private SharedElementCallback mCallback;
+
+        public SharedElementCallback23Impl(SharedElementCallback callback) {
+            mCallback = callback;
+        }
+
+        @Override
+        public void onSharedElementStart(List<String> sharedElementNames,
+                List<View> sharedElements, List<View> sharedElementSnapshots) {
+            mCallback.onSharedElementStart(sharedElementNames, sharedElements,
+                    sharedElementSnapshots);
+        }
+
+        @Override
+        public void onSharedElementEnd(List<String> sharedElementNames, List<View> sharedElements,
+                List<View> sharedElementSnapshots) {
+            mCallback.onSharedElementEnd(sharedElementNames, sharedElements,
+                    sharedElementSnapshots);
+        }
+
+        @Override
+        public void onRejectSharedElements(List<View> rejectedSharedElements) {
+            mCallback.onRejectSharedElements(rejectedSharedElements);
+        }
+
+        @Override
+        public void onMapSharedElements(List<String> names, Map<String, View> sharedElements) {
+            mCallback.onMapSharedElements(names, sharedElements);
+        }
+
+        @Override
+        public Parcelable onCaptureSharedElementSnapshot(View sharedElement,
+                Matrix viewToGlobalMatrix, RectF screenBounds) {
+            return mCallback.onCaptureSharedElementSnapshot(sharedElement, viewToGlobalMatrix,
+                    screenBounds);
+        }
+
+        @Override
+        public View onCreateSnapshotView(Context context, Parcelable snapshot) {
+            return mCallback.onCreateSnapshotView(context, snapshot);
+        }
+
+        @Override
+        public void onSharedElementsArrived(List<String> sharedElementNames,
+                List<View> sharedElements,
+                final ActivityCompatApi23.OnSharedElementsReadyListenerBridge listener) {
+            mCallback.onSharedElementsArrived(sharedElementNames, sharedElements,
+                    new SharedElementCallback.OnSharedElementsReadyListener() {
+                        @Override
+                        public void onSharedElementsReady() {
+                            listener.onSharedElementsReady();
+                        }
+                    });
+        }
+    }
+}
diff --git a/v4/java/android/support/v4/app/ActivityManagerCompat.java b/compat/java/android/support/v4/app/ActivityManagerCompat.java
similarity index 100%
rename from v4/java/android/support/v4/app/ActivityManagerCompat.java
rename to compat/java/android/support/v4/app/ActivityManagerCompat.java
diff --git a/compat/java/android/support/v4/app/ActivityOptionsCompat.java b/compat/java/android/support/v4/app/ActivityOptionsCompat.java
new file mode 100644
index 0000000..7d3d89e
--- /dev/null
+++ b/compat/java/android/support/v4/app/ActivityOptionsCompat.java
@@ -0,0 +1,490 @@
+/*
+ * Copyright (C) 2012 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 android.support.v4.app;
+
+import android.app.Activity;
+import android.app.PendingIntent;
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.Rect;
+import android.os.Build;
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.support.v4.util.Pair;
+import android.view.View;
+
+/**
+ * Helper for accessing features in {@link android.app.ActivityOptions}
+ * introduced in API level 16 in a backwards compatible fashion.
+ */
+public class ActivityOptionsCompat {
+    /**
+     * A long in the extras delivered by {@link #requestUsageTimeReport} that contains
+     * the total time (in ms) the user spent in the app flow.
+     */
+    public static final String EXTRA_USAGE_TIME_REPORT = "android.activity.usage_time";
+
+    /**
+     * A Bundle in the extras delivered by {@link #requestUsageTimeReport} that contains
+     * detailed information about the time spent in each package associated with the app;
+     * each key is a package name, whose value is a long containing the time (in ms).
+     */
+    public static final String EXTRA_USAGE_TIME_REPORT_PACKAGES = "android.usage_time_packages";
+
+    /**
+     * Create an ActivityOptions specifying a custom animation to run when the
+     * activity is displayed.
+     *
+     * @param context Who is defining this. This is the application that the
+     * animation resources will be loaded from.
+     * @param enterResId A resource ID of the animation resource to use for the
+     * incoming activity. Use 0 for no animation.
+     * @param exitResId A resource ID of the animation resource to use for the
+     * outgoing activity. Use 0 for no animation.
+     * @return Returns a new ActivityOptions object that you can use to supply
+     * these options as the options Bundle when starting an activity.
+     */
+    public static ActivityOptionsCompat makeCustomAnimation(Context context,
+            int enterResId, int exitResId) {
+        if (Build.VERSION.SDK_INT >= 24) {
+            return new ActivityOptionsImpl24(
+                ActivityOptionsCompat24.makeCustomAnimation(context, enterResId, exitResId));
+        } else if (Build.VERSION.SDK_INT >= 23) {
+            return new ActivityOptionsImpl23(
+                ActivityOptionsCompat23.makeCustomAnimation(context, enterResId, exitResId));
+        } else if (Build.VERSION.SDK_INT >= 21) {
+            return new ActivityOptionsImpl21(
+                ActivityOptionsCompat21.makeCustomAnimation(context, enterResId, exitResId));
+        } else if (Build.VERSION.SDK_INT >= 16) {
+            return new ActivityOptionsImplJB(
+                ActivityOptionsCompatJB.makeCustomAnimation(context, enterResId, exitResId));
+        }
+        return new ActivityOptionsCompat();
+    }
+
+    /**
+     * Create an ActivityOptions specifying an animation where the new activity is
+     * scaled from a small originating area of the screen to its final full
+     * representation.
+     * <p/>
+     * If the Intent this is being used with has not set its
+     * {@link android.content.Intent#setSourceBounds(android.graphics.Rect)},
+     * those bounds will be filled in for you based on the initial bounds passed
+     * in here.
+     *
+     * @param source The View that the new activity is animating from. This
+     * defines the coordinate space for startX and startY.
+     * @param startX The x starting location of the new activity, relative to
+     * source.
+     * @param startY The y starting location of the activity, relative to source.
+     * @param startWidth The initial width of the new activity.
+     * @param startHeight The initial height of the new activity.
+     * @return Returns a new ActivityOptions object that you can use to supply
+     * these options as the options Bundle when starting an activity.
+     */
+    public static ActivityOptionsCompat makeScaleUpAnimation(View source,
+            int startX, int startY, int startWidth, int startHeight) {
+        if (Build.VERSION.SDK_INT >= 24) {
+            return new ActivityOptionsImpl24(
+                ActivityOptionsCompat24.makeScaleUpAnimation(source, startX, startY,
+                        startWidth, startHeight));
+        } else if (Build.VERSION.SDK_INT >= 23) {
+            return new ActivityOptionsImpl23(
+                ActivityOptionsCompat23.makeScaleUpAnimation(source, startX, startY,
+                        startWidth, startHeight));
+        } else if (Build.VERSION.SDK_INT >= 21) {
+            return new ActivityOptionsImpl21(
+                ActivityOptionsCompat21.makeScaleUpAnimation(source, startX, startY,
+                        startWidth, startHeight));
+        } else if (Build.VERSION.SDK_INT >= 16) {
+            return new ActivityOptionsImplJB(
+                ActivityOptionsCompatJB.makeScaleUpAnimation(source, startX, startY,
+                        startWidth, startHeight));
+        }
+        return new ActivityOptionsCompat();
+    }
+
+    /**
+     * Create an ActivityOptions specifying an animation where the new
+     * activity is revealed from a small originating area of the screen to
+     * its final full representation.
+     *
+     * @param source The View that the new activity is animating from.  This
+     * defines the coordinate space for <var>startX</var> and <var>startY</var>.
+     * @param startX The x starting location of the new activity, relative to <var>source</var>.
+     * @param startY The y starting location of the activity, relative to <var>source</var>.
+     * @param width The initial width of the new activity.
+     * @param height The initial height of the new activity.
+     * @return Returns a new ActivityOptions object that you can use to
+     * supply these options as the options Bundle when starting an activity.
+     */
+    public static ActivityOptionsCompat makeClipRevealAnimation(View source,
+            int startX, int startY, int width, int height) {
+        if (Build.VERSION.SDK_INT >= 24) {
+            return new ActivityOptionsImpl24(
+                ActivityOptionsCompat24.makeClipRevealAnimation(source, startX, startY,
+                        width, height));
+        } else if (Build.VERSION.SDK_INT >= 23) {
+            return new ActivityOptionsImpl23(
+                ActivityOptionsCompat23.makeClipRevealAnimation(source, startX, startY,
+                        width, height));
+        }
+        return new ActivityOptionsCompat();
+    }
+
+    /**
+     * Create an ActivityOptions specifying an animation where a thumbnail is
+     * scaled from a given position to the new activity window that is being
+     * started.
+     * <p/>
+     * If the Intent this is being used with has not set its
+     * {@link android.content.Intent#setSourceBounds(android.graphics.Rect)},
+     * those bounds will be filled in for you based on the initial thumbnail
+     * location and size provided here.
+     *
+     * @param source The View that this thumbnail is animating from. This
+     * defines the coordinate space for startX and startY.
+     * @param thumbnail The bitmap that will be shown as the initial thumbnail
+     * of the animation.
+     * @param startX The x starting location of the bitmap, relative to source.
+     * @param startY The y starting location of the bitmap, relative to source.
+     * @return Returns a new ActivityOptions object that you can use to supply
+     * these options as the options Bundle when starting an activity.
+     */
+    public static ActivityOptionsCompat makeThumbnailScaleUpAnimation(View source,
+            Bitmap thumbnail, int startX, int startY) {
+        if (Build.VERSION.SDK_INT >= 24) {
+            return new ActivityOptionsImpl24(
+                ActivityOptionsCompat24.makeThumbnailScaleUpAnimation(source, thumbnail,
+                        startX, startY));
+        } else if (Build.VERSION.SDK_INT >= 23) {
+            return new ActivityOptionsImpl23(
+                ActivityOptionsCompat23.makeThumbnailScaleUpAnimation(source, thumbnail,
+                        startX, startY));
+        } else if (Build.VERSION.SDK_INT >= 21) {
+            return new ActivityOptionsImpl21(
+                ActivityOptionsCompat21.makeThumbnailScaleUpAnimation(source, thumbnail,
+                        startX, startY));
+        } else if (Build.VERSION.SDK_INT >= 16) {
+            return new ActivityOptionsImplJB(
+                ActivityOptionsCompatJB.makeThumbnailScaleUpAnimation(source, thumbnail,
+                        startX, startY));
+        }
+        return new ActivityOptionsCompat();
+    }
+
+    /**
+     * Create an ActivityOptions to transition between Activities using cross-Activity scene
+     * animations. This method carries the position of one shared element to the started Activity.
+     * The position of <code>sharedElement</code> will be used as the epicenter for the
+     * exit Transition. The position of the shared element in the launched Activity will be the
+     * epicenter of its entering Transition.
+     *
+     * <p>This requires {@link android.view.Window#FEATURE_CONTENT_TRANSITIONS} to be
+     * enabled on the calling Activity to cause an exit transition. The same must be in
+     * the called Activity to get an entering transition.</p>
+     * @param activity The Activity whose window contains the shared elements.
+     * @param sharedElement The View to transition to the started Activity. sharedElement must
+     *                      have a non-null sharedElementName.
+     * @param sharedElementName The shared element name as used in the target Activity. This may
+     *                          be null if it has the same name as sharedElement.
+     * @return Returns a new ActivityOptions object that you can use to
+     *         supply these options as the options Bundle when starting an activity.
+     */
+    public static ActivityOptionsCompat makeSceneTransitionAnimation(Activity activity,
+            View sharedElement, String sharedElementName) {
+        if (Build.VERSION.SDK_INT >= 24) {
+            return new ActivityOptionsCompat.ActivityOptionsImpl24(
+                    ActivityOptionsCompat24.makeSceneTransitionAnimation(activity,
+                            sharedElement, sharedElementName));
+        } else if (Build.VERSION.SDK_INT >= 23) {
+            return new ActivityOptionsCompat.ActivityOptionsImpl23(
+                    ActivityOptionsCompat23.makeSceneTransitionAnimation(activity,
+                            sharedElement, sharedElementName));
+        } else if (Build.VERSION.SDK_INT >= 21) {
+            return new ActivityOptionsCompat.ActivityOptionsImpl21(
+                    ActivityOptionsCompat21.makeSceneTransitionAnimation(activity,
+                            sharedElement, sharedElementName));
+        }
+        return new ActivityOptionsCompat();
+    }
+
+    /**
+     * Create an ActivityOptions to transition between Activities using cross-Activity scene
+     * animations. This method carries the position of multiple shared elements to the started
+     * Activity. The position of the first element in sharedElements
+     * will be used as the epicenter for the exit Transition. The position of the associated
+     * shared element in the launched Activity will be the epicenter of its entering Transition.
+     *
+     * <p>This requires {@link android.view.Window#FEATURE_CONTENT_TRANSITIONS} to be
+     * enabled on the calling Activity to cause an exit transition. The same must be in
+     * the called Activity to get an entering transition.</p>
+     * @param activity The Activity whose window contains the shared elements.
+     * @param sharedElements The names of the shared elements to transfer to the called
+     *                       Activity and their associated Views. The Views must each have
+     *                       a unique shared element name.
+     * @return Returns a new ActivityOptions object that you can use to
+     *         supply these options as the options Bundle when starting an activity.
+     */
+    public static ActivityOptionsCompat makeSceneTransitionAnimation(Activity activity,
+            Pair<View, String>... sharedElements) {
+        if (Build.VERSION.SDK_INT >= 21) {
+            View[] views = null;
+            String[] names = null;
+            if (sharedElements != null) {
+                views = new View[sharedElements.length];
+                names = new String[sharedElements.length];
+                for (int i = 0; i < sharedElements.length; i++) {
+                    views[i] = sharedElements[i].first;
+                    names[i] = sharedElements[i].second;
+                }
+            }
+            if (Build.VERSION.SDK_INT >= 24) {
+                return new ActivityOptionsCompat.ActivityOptionsImpl24(
+                        ActivityOptionsCompat24.makeSceneTransitionAnimation(activity, views, names));
+            } else if (Build.VERSION.SDK_INT >= 23) {
+                return new ActivityOptionsCompat.ActivityOptionsImpl23(
+                        ActivityOptionsCompat23.makeSceneTransitionAnimation(activity, views, names));
+            } else {
+                return new ActivityOptionsCompat.ActivityOptionsImpl21(
+                        ActivityOptionsCompat21.makeSceneTransitionAnimation(activity, views, names));
+            }
+        }
+        return new ActivityOptionsCompat();
+    }
+
+    /**
+     * If set along with Intent.FLAG_ACTIVITY_NEW_DOCUMENT then the task being launched will not be
+     * presented to the user but will instead be only available through the recents task list.
+     * In addition, the new task wil be affiliated with the launching activity's task.
+     * Affiliated tasks are grouped together in the recents task list.
+     *
+     * <p>This behavior is not supported for activities with {@link
+     * android.R.styleable#AndroidManifestActivity_launchMode launchMode} values of
+     * <code>singleInstance</code> or <code>singleTask</code>.
+     */
+    public static ActivityOptionsCompat makeTaskLaunchBehind() {
+        if (Build.VERSION.SDK_INT >= 24) {
+            return new ActivityOptionsCompat.ActivityOptionsImpl24(
+                    ActivityOptionsCompat24.makeTaskLaunchBehind());
+        } else if (Build.VERSION.SDK_INT >= 23) {
+            return new ActivityOptionsCompat.ActivityOptionsImpl23(
+                    ActivityOptionsCompat23.makeTaskLaunchBehind());
+        } else if (Build.VERSION.SDK_INT >= 21) {
+            return new ActivityOptionsCompat.ActivityOptionsImpl21(
+                    ActivityOptionsCompat21.makeTaskLaunchBehind());
+        }
+        return new ActivityOptionsCompat();
+    }
+
+    /**
+     * Create a basic ActivityOptions that has no special animation associated with it.
+     * Other options can still be set.
+     */
+    public static ActivityOptionsCompat makeBasic() {
+        if (Build.VERSION.SDK_INT >= 24) {
+            return new ActivityOptionsCompat.ActivityOptionsImpl24(
+                    ActivityOptionsCompat24.makeBasic());
+        } else if (Build.VERSION.SDK_INT >= 23) {
+            return new ActivityOptionsCompat.ActivityOptionsImpl23(
+                    ActivityOptionsCompat23.makeBasic());
+        }
+        return new ActivityOptionsCompat();
+    }
+
+    private static class ActivityOptionsImplJB extends ActivityOptionsCompat {
+        private final ActivityOptionsCompatJB mImpl;
+
+        ActivityOptionsImplJB(ActivityOptionsCompatJB impl) {
+            mImpl = impl;
+        }
+
+        @Override
+        public Bundle toBundle() {
+            return mImpl.toBundle();
+        }
+
+        @Override
+        public void update(ActivityOptionsCompat otherOptions) {
+            if (otherOptions instanceof ActivityOptionsImplJB) {
+                ActivityOptionsImplJB otherImpl = (ActivityOptionsImplJB)otherOptions;
+                mImpl.update(otherImpl.mImpl);
+            }
+        }
+    }
+
+    private static class ActivityOptionsImpl21 extends ActivityOptionsCompat {
+        private final ActivityOptionsCompat21 mImpl;
+
+        ActivityOptionsImpl21(ActivityOptionsCompat21 impl) {
+            mImpl = impl;
+        }
+
+        @Override
+        public Bundle toBundle() {
+            return mImpl.toBundle();
+        }
+
+        @Override
+        public void update(ActivityOptionsCompat otherOptions) {
+            if (otherOptions instanceof ActivityOptionsCompat.ActivityOptionsImpl21) {
+                ActivityOptionsCompat.ActivityOptionsImpl21
+                        otherImpl = (ActivityOptionsCompat.ActivityOptionsImpl21)otherOptions;
+                mImpl.update(otherImpl.mImpl);
+            }
+        }
+    }
+
+    private static class ActivityOptionsImpl23 extends ActivityOptionsCompat {
+        private final ActivityOptionsCompat23 mImpl;
+
+        ActivityOptionsImpl23(ActivityOptionsCompat23 impl) {
+            mImpl = impl;
+        }
+
+        @Override
+        public Bundle toBundle() {
+            return mImpl.toBundle();
+        }
+
+        @Override
+        public void update(ActivityOptionsCompat otherOptions) {
+            if (otherOptions instanceof ActivityOptionsCompat.ActivityOptionsImpl23) {
+                ActivityOptionsCompat.ActivityOptionsImpl23
+                        otherImpl = (ActivityOptionsCompat.ActivityOptionsImpl23)otherOptions;
+                mImpl.update(otherImpl.mImpl);
+            }
+        }
+
+        @Override
+        public void requestUsageTimeReport(PendingIntent receiver) {
+            mImpl.requestUsageTimeReport(receiver);
+        }
+    }
+
+    private static class ActivityOptionsImpl24 extends ActivityOptionsCompat {
+        private final ActivityOptionsCompat24 mImpl;
+
+        ActivityOptionsImpl24(ActivityOptionsCompat24 impl) {
+            mImpl = impl;
+        }
+
+        @Override
+        public Bundle toBundle() {
+            return mImpl.toBundle();
+        }
+
+        @Override
+        public void update(ActivityOptionsCompat otherOptions) {
+            if (otherOptions instanceof ActivityOptionsCompat.ActivityOptionsImpl24) {
+                ActivityOptionsCompat.ActivityOptionsImpl24
+                        otherImpl = (ActivityOptionsCompat.ActivityOptionsImpl24)otherOptions;
+                mImpl.update(otherImpl.mImpl);
+            }
+        }
+
+        @Override
+        public ActivityOptionsCompat setLaunchBounds(@Nullable Rect screenSpacePixelRect) {
+            return new ActivityOptionsImpl24(mImpl.setLaunchBounds(screenSpacePixelRect));
+        }
+
+        @Override
+        public Rect getLaunchBounds() {
+            return mImpl.getLaunchBounds();
+        }
+
+        @Override
+        public void requestUsageTimeReport(PendingIntent receiver) {
+            mImpl.requestUsageTimeReport(receiver);
+        }
+    }
+
+    protected ActivityOptionsCompat() {
+    }
+
+    /**
+     * Sets the bounds (window size) that the activity should be launched in.
+     * Rect position should be provided in pixels and in screen coordinates.
+     * Set to null explicitly for fullscreen.
+     * <p>
+     * <strong>NOTE:<strong/> This value is ignored on devices that don't have
+     * {@link android.content.pm.PackageManager#FEATURE_FREEFORM_WINDOW_MANAGEMENT} or
+     * {@link android.content.pm.PackageManager#FEATURE_PICTURE_IN_PICTURE} enabled.
+     * @param screenSpacePixelRect Launch bounds to use for the activity or null for fullscreen.
+     */
+    public ActivityOptionsCompat setLaunchBounds(@Nullable Rect screenSpacePixelRect) {
+        return null;
+    }
+
+    /**
+     * Returns the bounds that should be used to launch the activity.
+     * @see #setLaunchBounds(Rect)
+     * @return Bounds used to launch the activity.
+     */
+    @Nullable
+    public Rect getLaunchBounds() {
+        return null;
+    }
+
+    /**
+     * Returns the created options as a Bundle, which can be passed to
+     * {@link ActivityCompat#startActivity(android.app.Activity, android.content.Intent, android.os.Bundle)}.
+     * Note that the returned Bundle is still owned by the ActivityOptions
+     * object; you must not modify it, but can supply it to the startActivity
+     * methods that take an options Bundle.
+     */
+    public Bundle toBundle() {
+        return null;
+    }
+
+    /**
+     * Update the current values in this ActivityOptions from those supplied in
+     * otherOptions. Any values defined in otherOptions replace those in the
+     * base options.
+     */
+    public void update(ActivityOptionsCompat otherOptions) {
+        // Do nothing.
+    }
+
+    /**
+     * Ask the the system track that time the user spends in the app being launched, and
+     * report it back once done.  The report will be sent to the given receiver, with
+     * the extras {@link #EXTRA_USAGE_TIME_REPORT} and {@link #EXTRA_USAGE_TIME_REPORT_PACKAGES}
+     * filled in.
+     *
+     * <p>The time interval tracked is from launching this activity until the user leaves
+     * that activity's flow.  They are considered to stay in the flow as long as
+     * new activities are being launched or returned to from the original flow,
+     * even if this crosses package or task boundaries.  For example, if the originator
+     * starts an activity to view an image, and while there the user selects to share,
+     * which launches their email app in a new task, and they complete the share, the
+     * time during that entire operation will be included until they finally hit back from
+     * the original image viewer activity.</p>
+     *
+     * <p>The user is considered to complete a flow once they switch to another
+     * activity that is not part of the tracked flow.  This may happen, for example, by
+     * using the notification shade, launcher, or recents to launch or switch to another
+     * app.  Simply going in to these navigation elements does not break the flow (although
+     * the launcher and recents stops time tracking of the session); it is the act of
+     * going somewhere else that completes the tracking.</p>
+     *
+     * @param receiver A broadcast receiver that willl receive the report.
+     */
+    public void requestUsageTimeReport(PendingIntent receiver) {
+        // Do nothing.
+    }
+}
diff --git a/v4/java/android/support/v4/app/AppOpsManagerCompat.java b/compat/java/android/support/v4/app/AppOpsManagerCompat.java
similarity index 100%
rename from v4/java/android/support/v4/app/AppOpsManagerCompat.java
rename to compat/java/android/support/v4/app/AppOpsManagerCompat.java
diff --git a/compat/java/android/support/v4/app/BundleCompat.java b/compat/java/android/support/v4/app/BundleCompat.java
new file mode 100644
index 0000000..17e28d4
--- /dev/null
+++ b/compat/java/android/support/v4/app/BundleCompat.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2015 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 android.support.v4.app;
+
+import android.os.Build;
+import android.os.Bundle;
+import android.os.IBinder;
+
+/**
+ * Helper for accessing features in {@link Bundle}
+ * introduced after API level 4 in a backwards compatible fashion.
+ */
+public final class BundleCompat {
+
+    private BundleCompat() {}
+
+    /**
+     * A convenience method to handle getting an {@link IBinder} inside a {@link Bundle} for all
+     * Android versions.
+     * @param bundle The bundle to get the {@link IBinder}.
+     * @param key    The key to use while getting the {@link IBinder}.
+     * @return       The {@link IBinder} that was obtained.
+     */
+    public static IBinder getBinder(Bundle bundle, String key) {
+        if (Build.VERSION.SDK_INT >= 18) {
+            return BundleCompatJellybeanMR2.getBinder(bundle, key);
+        } else {
+            return BundleCompatGingerbread.getBinder(bundle, key);
+        }
+    }
+
+    /**
+     * A convenience method to handle putting an {@link IBinder} inside a {@link Bundle} for all
+     * Android versions.
+     * @param bundle The bundle to insert the {@link IBinder}.
+     * @param key    The key to use while putting the {@link IBinder}.
+     * @param binder The {@link IBinder} to put.
+     */
+    public static void putBinder(Bundle bundle, String key, IBinder binder) {
+        if (Build.VERSION.SDK_INT >= 18) {
+            BundleCompatJellybeanMR2.putBinder(bundle, key, binder);
+        } else {
+            BundleCompatGingerbread.putBinder(bundle, key, binder);
+        }
+    }
+}
diff --git a/v4/java/android/support/v4/app/INotificationSideChannel.aidl b/compat/java/android/support/v4/app/INotificationSideChannel.aidl
similarity index 100%
rename from v4/java/android/support/v4/app/INotificationSideChannel.aidl
rename to compat/java/android/support/v4/app/INotificationSideChannel.aidl
diff --git a/compat/java/android/support/v4/app/NotificationCompat.java b/compat/java/android/support/v4/app/NotificationCompat.java
new file mode 100644
index 0000000..0c515a1
--- /dev/null
+++ b/compat/java/android/support/v4/app/NotificationCompat.java
@@ -0,0 +1,4004 @@
+/*
+ * Copyright (C) 2012 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 android.support.v4.app;
+
+import android.app.Activity;
+import android.app.Notification;
+import android.app.PendingIntent;
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.Color;
+import android.media.AudioManager;
+import android.net.Uri;
+import android.os.Build;
+import android.os.Bundle;
+import android.os.Parcelable;
+import android.support.annotation.ColorInt;
+import android.support.v4.os.BuildCompat;
+import android.support.v4.view.GravityCompat;
+import android.view.Gravity;
+import android.widget.RemoteViews;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * Helper for accessing features in {@link android.app.Notification}
+ * introduced after API level 4 in a backwards compatible fashion.
+ */
+public class NotificationCompat {
+
+    /**
+     * Use all default values (where applicable).
+     */
+    public static final int DEFAULT_ALL = ~0;
+
+    /**
+     * Use the default notification sound. This will ignore any sound set using
+     * {@link Builder#setSound}
+     *
+     * <p>
+     * A notification that is noisy is more likely to be presented as a heads-up notification,
+     * on some platforms.
+     * </p>
+     *
+     * @see Builder#setDefaults
+     */
+    public static final int DEFAULT_SOUND = 1;
+
+    /**
+     * Use the default notification vibrate. This will ignore any vibrate set using
+     * {@link Builder#setVibrate}. Using phone vibration requires the
+     * {@link android.Manifest.permission#VIBRATE VIBRATE} permission.
+     *
+     * <p>
+     * A notification that vibrates is more likely to be presented as a heads-up notification,
+     * on some platforms.
+     * </p>
+     *
+     * @see Builder#setDefaults
+     */
+    public static final int DEFAULT_VIBRATE = 2;
+
+    /**
+     * Use the default notification lights. This will ignore the
+     * {@link #FLAG_SHOW_LIGHTS} bit, and values set with {@link Builder#setLights}.
+     *
+     * @see Builder#setDefaults
+     */
+    public static final int DEFAULT_LIGHTS = 4;
+
+    /**
+     * Use this constant as the value for audioStreamType to request that
+     * the default stream type for notifications be used.  Currently the
+     * default stream type is {@link AudioManager#STREAM_NOTIFICATION}.
+     */
+    public static final int STREAM_DEFAULT = -1;
+
+    /**
+     * Bit set in the Notification flags field when LEDs should be turned on
+     * for this notification.
+     */
+    public static final int FLAG_SHOW_LIGHTS        = 0x00000001;
+
+    /**
+     * Bit set in the Notification flags field if this notification is in
+     * reference to something that is ongoing, like a phone call.  It should
+     * not be set if this notification is in reference to something that
+     * happened at a particular point in time, like a missed phone call.
+     */
+    public static final int FLAG_ONGOING_EVENT      = 0x00000002;
+
+    /**
+     * Bit set in the Notification flags field if
+     * the audio will be repeated until the notification is
+     * cancelled or the notification window is opened.
+     */
+    public static final int FLAG_INSISTENT          = 0x00000004;
+
+    /**
+     * Bit set in the Notification flags field if the notification's sound,
+     * vibrate and ticker should only be played if the notification is not already showing.
+     */
+    public static final int FLAG_ONLY_ALERT_ONCE    = 0x00000008;
+
+    /**
+     * Bit set in the Notification flags field if the notification should be canceled when
+     * it is clicked by the user.
+     */
+    public static final int FLAG_AUTO_CANCEL        = 0x00000010;
+
+    /**
+     * Bit set in the Notification flags field if the notification should not be canceled
+     * when the user clicks the Clear all button.
+     */
+    public static final int FLAG_NO_CLEAR           = 0x00000020;
+
+    /**
+     * Bit set in the Notification flags field if this notification represents a currently
+     * running service.  This will normally be set for you by
+     * {@link android.app.Service#startForeground}.
+     */
+    public static final int FLAG_FOREGROUND_SERVICE = 0x00000040;
+
+    /**
+     * Obsolete flag indicating high-priority notifications; use the priority field instead.
+     *
+     * @deprecated Use {@link NotificationCompat.Builder#setPriority(int)} with a positive value.
+     */
+    @Deprecated
+    public static final int FLAG_HIGH_PRIORITY      = 0x00000080;
+
+    /**
+     * Bit set in the Notification flags field if this notification is relevant to the current
+     * device only and it is not recommended that it bridge to other devices.
+     */
+    public static final int FLAG_LOCAL_ONLY         = 0x00000100;
+
+    /**
+     * Bit set in the Notification flags field if this notification is the group summary for a
+     * group of notifications. Grouped notifications may display in a cluster or stack on devices
+     * which support such rendering. Requires a group key also be set using
+     * {@link Builder#setGroup}.
+     */
+    public static final int FLAG_GROUP_SUMMARY      = 0x00000200;
+
+    /**
+     * Default notification priority for {@link NotificationCompat.Builder#setPriority(int)}.
+     * If your application does not prioritize its own notifications,
+     * use this value for all notifications.
+     */
+    public static final int PRIORITY_DEFAULT = 0;
+
+    /**
+     * Lower notification priority for {@link NotificationCompat.Builder#setPriority(int)},
+     * for items that are less important. The UI may choose to show
+     * these items smaller, or at a different position in the list,
+     * compared with your app's {@link #PRIORITY_DEFAULT} items.
+     */
+    public static final int PRIORITY_LOW = -1;
+
+    /**
+     * Lowest notification priority for {@link NotificationCompat.Builder#setPriority(int)};
+     * these items might not be shown to the user except under
+     * special circumstances, such as detailed notification logs.
+     */
+    public static final int PRIORITY_MIN = -2;
+
+    /**
+     * Higher notification priority for {@link NotificationCompat.Builder#setPriority(int)},
+     * for more important notifications or alerts. The UI may choose
+     * to show these items larger, or at a different position in
+     * notification lists, compared with your app's {@link #PRIORITY_DEFAULT} items.
+     */
+    public static final int PRIORITY_HIGH = 1;
+
+    /**
+     * Highest notification priority for {@link NotificationCompat.Builder#setPriority(int)},
+     * for your application's most important items that require the user's
+     * prompt attention or input.
+     */
+    public static final int PRIORITY_MAX = 2;
+
+    /**
+     * Notification extras key: this is the title of the notification,
+     * as supplied to {@link Builder#setContentTitle(CharSequence)}.
+     */
+    public static final String EXTRA_TITLE = "android.title";
+
+    /**
+     * Notification extras key: this is the title of the notification when shown in expanded form,
+     * e.g. as supplied to {@link BigTextStyle#setBigContentTitle(CharSequence)}.
+     */
+    public static final String EXTRA_TITLE_BIG = EXTRA_TITLE + ".big";
+
+    /**
+     * Notification extras key: this is the main text payload, as supplied to
+     * {@link Builder#setContentText(CharSequence)}.
+     */
+    public static final String EXTRA_TEXT = "android.text";
+
+    /**
+     * Notification extras key: this is a third line of text, as supplied to
+     * {@link Builder#setSubText(CharSequence)}.
+     */
+    public static final String EXTRA_SUB_TEXT = "android.subText";
+
+    /**
+     * Notification extras key: this is the remote input history, as supplied to
+     * {@link Builder#setRemoteInputHistory(CharSequence[])}.
+     *
+     * Apps can fill this through {@link Builder#setRemoteInputHistory(CharSequence[])}
+     * with the most recent inputs that have been sent through a {@link RemoteInput} of this
+     * Notification and are expected to clear it once the it is no longer relevant (e.g. for chat
+     * notifications once the other party has responded).
+     *
+     * The extra with this key is of type CharSequence[] and contains the most recent entry at
+     * the 0 index, the second most recent at the 1 index, etc.
+     *
+     * @see Builder#setRemoteInputHistory(CharSequence[])
+     */
+    public static final String EXTRA_REMOTE_INPUT_HISTORY = "android.remoteInputHistory";
+
+    /**
+     * Notification extras key: this is a small piece of additional text as supplied to
+     * {@link Builder#setContentInfo(CharSequence)}.
+     */
+    public static final String EXTRA_INFO_TEXT = "android.infoText";
+
+    /**
+     * Notification extras key: this is a line of summary information intended to be shown
+     * alongside expanded notifications, as supplied to (e.g.)
+     * {@link BigTextStyle#setSummaryText(CharSequence)}.
+     */
+    public static final String EXTRA_SUMMARY_TEXT = "android.summaryText";
+
+    /**
+     * Notification extras key: this is the longer text shown in the big form of a
+     * {@link BigTextStyle} notification, as supplied to
+     * {@link BigTextStyle#bigText(CharSequence)}.
+     */
+    public static final String EXTRA_BIG_TEXT = "android.bigText";
+
+    /**
+     * Notification extras key: this is the resource ID of the notification's main small icon, as
+     * supplied to {@link Builder#setSmallIcon(int)}.
+     */
+    public static final String EXTRA_SMALL_ICON = "android.icon";
+
+    /**
+     * Notification extras key: this is a bitmap to be used instead of the small icon when showing the
+     * notification payload, as
+     * supplied to {@link Builder#setLargeIcon(android.graphics.Bitmap)}.
+     */
+    public static final String EXTRA_LARGE_ICON = "android.largeIcon";
+
+    /**
+     * Notification extras key: this is a bitmap to be used instead of the one from
+     * {@link Builder#setLargeIcon(android.graphics.Bitmap)} when the notification is
+     * shown in its expanded form, as supplied to
+     * {@link BigPictureStyle#bigLargeIcon(android.graphics.Bitmap)}.
+     */
+    public static final String EXTRA_LARGE_ICON_BIG = EXTRA_LARGE_ICON + ".big";
+
+    /**
+     * Notification extras key: this is the progress value supplied to
+     * {@link Builder#setProgress(int, int, boolean)}.
+     */
+    public static final String EXTRA_PROGRESS = "android.progress";
+
+    /**
+     * Notification extras key: this is the maximum value supplied to
+     * {@link Builder#setProgress(int, int, boolean)}.
+     */
+    public static final String EXTRA_PROGRESS_MAX = "android.progressMax";
+
+    /**
+     * Notification extras key: whether the progress bar is indeterminate, supplied to
+     * {@link Builder#setProgress(int, int, boolean)}.
+     */
+    public static final String EXTRA_PROGRESS_INDETERMINATE = "android.progressIndeterminate";
+
+    /**
+     * Notification extras key: whether the when field set using {@link Builder#setWhen} should
+     * be shown as a count-up timer (specifically a {@link android.widget.Chronometer}) instead
+     * of a timestamp, as supplied to {@link Builder#setUsesChronometer(boolean)}.
+     */
+    public static final String EXTRA_SHOW_CHRONOMETER = "android.showChronometer";
+
+    /**
+     * Notification extras key: whether the when field set using {@link Builder#setWhen} should
+     * be shown, as supplied to {@link Builder#setShowWhen(boolean)}.
+     */
+    public static final String EXTRA_SHOW_WHEN = "android.showWhen";
+
+    /**
+     * Notification extras key: this is a bitmap to be shown in {@link BigPictureStyle} expanded
+     * notifications, supplied to {@link BigPictureStyle#bigPicture(android.graphics.Bitmap)}.
+     */
+    public static final String EXTRA_PICTURE = "android.picture";
+
+    /**
+     * Notification extras key: An array of CharSequences to show in {@link InboxStyle} expanded
+     * notifications, each of which was supplied to {@link InboxStyle#addLine(CharSequence)}.
+     */
+    public static final String EXTRA_TEXT_LINES = "android.textLines";
+
+    /**
+     * Notification extras key: A string representing the name of the specific
+     * {@link android.app.Notification.Style} used to create this notification.
+     */
+    public static final String EXTRA_TEMPLATE = "android.template";
+
+    /**
+     * Notification extras key: A String array containing the people that this
+     * notification relates to, each of which was supplied to
+     * {@link Builder#addPerson(String)}.
+     */
+    public static final String EXTRA_PEOPLE = "android.people";
+
+    /**
+     * Notification extras key: A
+     * {@link android.content.ContentUris content URI} pointing to an image that can be displayed
+     * in the background when the notification is selected. The URI must point to an image stream
+     * suitable for passing into
+     * {@link android.graphics.BitmapFactory#decodeStream(java.io.InputStream)
+     * BitmapFactory.decodeStream}; all other content types will be ignored. The content provider
+     * URI used for this purpose must require no permissions to read the image data.
+     */
+    public static final String EXTRA_BACKGROUND_IMAGE_URI = "android.backgroundImageUri";
+
+    /**
+     * Notification key: A
+     * {@link android.media.session.MediaSession.Token} associated with a
+     * {@link android.app.Notification.MediaStyle} notification.
+     */
+    public static final String EXTRA_MEDIA_SESSION = "android.mediaSession";
+
+    /**
+     * Notification extras key: the indices of actions to be shown in the compact view,
+     * as supplied to (e.g.) {@link Notification.MediaStyle#setShowActionsInCompactView(int...)}.
+     */
+    public static final String EXTRA_COMPACT_ACTIONS = "android.compactActions";
+
+    /**
+     * Notification key: the username to be displayed for all messages sent by the user
+     * including
+     * direct replies
+     * {@link MessagingStyle} notification.
+     */
+    public static final String EXTRA_SELF_DISPLAY_NAME = "android.selfDisplayName";
+
+    /**
+     * Notification key: a {@link String} to be displayed as the title to a conversation
+     * represented by a {@link MessagingStyle}
+     */
+    public static final String EXTRA_CONVERSATION_TITLE = "android.conversationTitle";
+
+    /**
+     * Notification key: an array of {@link Bundle} objects representing
+     * {@link MessagingStyle.Message} objects for a {@link MessagingStyle} notification.
+     */
+    public static final String EXTRA_MESSAGES = "android.messages";
+
+    /**
+     * Value of {@link Notification#color} equal to 0 (also known as
+     * {@link android.graphics.Color#TRANSPARENT Color.TRANSPARENT}),
+     * telling the system not to decorate this notification with any special color but instead use
+     * default colors when presenting this notification.
+     */
+    @ColorInt
+    public static final int COLOR_DEFAULT = Color.TRANSPARENT;
+
+    /**
+     * Notification visibility: Show this notification in its entirety on all lockscreens.
+     *
+     * {@see android.app.Notification#visibility}
+     */
+    public static final int VISIBILITY_PUBLIC = 1;
+
+    /**
+     * Notification visibility: Show this notification on all lockscreens, but conceal sensitive or
+     * private information on secure lockscreens.
+     *
+     * {@see android.app.Notification#visibility}
+     */
+    public static final int VISIBILITY_PRIVATE = 0;
+
+    /**
+     * Notification visibility: Do not reveal any part of this notification on a secure lockscreen.
+     *
+     * {@see android.app.Notification#visibility}
+     */
+    public static final int VISIBILITY_SECRET = -1;
+
+    /**
+     * Notification category: incoming call (voice or video) or similar synchronous communication request.
+     */
+    public static final String CATEGORY_CALL = NotificationCompatApi21.CATEGORY_CALL;
+
+    /**
+     * Notification category: incoming direct message (SMS, instant message, etc.).
+     */
+    public static final String CATEGORY_MESSAGE = NotificationCompatApi21.CATEGORY_MESSAGE;
+
+    /**
+     * Notification category: asynchronous bulk message (email).
+     */
+    public static final String CATEGORY_EMAIL = NotificationCompatApi21.CATEGORY_EMAIL;
+
+    /**
+     * Notification category: calendar event.
+     */
+    public static final String CATEGORY_EVENT = NotificationCompatApi21.CATEGORY_EVENT;
+
+    /**
+     * Notification category: promotion or advertisement.
+     */
+    public static final String CATEGORY_PROMO = NotificationCompatApi21.CATEGORY_PROMO;
+
+    /**
+     * Notification category: alarm or timer.
+     */
+    public static final String CATEGORY_ALARM = NotificationCompatApi21.CATEGORY_ALARM;
+
+    /**
+     * Notification category: progress of a long-running background operation.
+     */
+    public static final String CATEGORY_PROGRESS = NotificationCompatApi21.CATEGORY_PROGRESS;
+
+    /**
+     * Notification category: social network or sharing update.
+     */
+    public static final String CATEGORY_SOCIAL = NotificationCompatApi21.CATEGORY_SOCIAL;
+
+    /**
+     * Notification category: error in background operation or authentication status.
+     */
+    public static final String CATEGORY_ERROR = NotificationCompatApi21.CATEGORY_ERROR;
+
+    /**
+     * Notification category: media transport control for playback.
+     */
+    public static final String CATEGORY_TRANSPORT = NotificationCompatApi21.CATEGORY_TRANSPORT;
+
+    /**
+     * Notification category: system or device status update.  Reserved for system use.
+     */
+    public static final String CATEGORY_SYSTEM = NotificationCompatApi21.CATEGORY_SYSTEM;
+
+    /**
+     * Notification category: indication of running background service.
+     */
+    public static final String CATEGORY_SERVICE = NotificationCompatApi21.CATEGORY_SERVICE;
+
+    /**
+     * Notification category: user-scheduled reminder.
+     */
+    public static final String CATEGORY_REMINDER = NotificationCompatApi23.CATEGORY_REMINDER;
+
+    /**
+     * Notification category: a specific, timely recommendation for a single thing.
+     * For example, a news app might want to recommend a news story it believes the user will
+     * want to read next.
+     */
+    public static final String CATEGORY_RECOMMENDATION =
+            NotificationCompatApi21.CATEGORY_RECOMMENDATION;
+
+    /**
+     * Notification category: ongoing information about device or contextual status.
+     */
+    public static final String CATEGORY_STATUS = NotificationCompatApi21.CATEGORY_STATUS;
+
+    private static final NotificationCompatImpl IMPL;
+
+    interface NotificationCompatImpl {
+        public Notification build(Builder b, BuilderExtender extender);
+        public Bundle getExtras(Notification n);
+        public int getActionCount(Notification n);
+        public Action getAction(Notification n, int actionIndex);
+        public Action[] getActionsFromParcelableArrayList(ArrayList<Parcelable> parcelables);
+        public ArrayList<Parcelable> getParcelableArrayListForActions(Action[] actions);
+        public String getCategory(Notification n);
+        public boolean getLocalOnly(Notification n);
+        public String getGroup(Notification n);
+        public boolean isGroupSummary(Notification n);
+        public String getSortKey(Notification n);
+        Bundle getBundleForUnreadConversation(NotificationCompatBase.UnreadConversation uc);
+        NotificationCompatBase.UnreadConversation getUnreadConversationFromBundle(
+                Bundle b, NotificationCompatBase.UnreadConversation.Factory factory,
+                RemoteInputCompatBase.RemoteInput.Factory remoteInputFactory);
+    }
+
+    /**
+     * Interface for appcompat to extend v4 builder with media style.
+     *
+     * @hide
+     */
+    protected static class BuilderExtender {
+        public Notification build(Builder b, NotificationBuilderWithBuilderAccessor builder) {
+            return builder.build();
+        }
+    }
+
+    static class NotificationCompatImplBase implements NotificationCompatImpl {
+        @Override
+        public Notification build(Builder b, BuilderExtender extender) {
+            Notification result = b.mNotification;
+            result = NotificationCompatBase.add(result, b.mContext,
+                    b.mContentTitle, b.mContentText, b.mContentIntent, b.mFullScreenIntent);
+            // translate high priority requests into legacy flag
+            if (b.mPriority > PRIORITY_DEFAULT) {
+                result.flags |= FLAG_HIGH_PRIORITY;
+            }
+            if (b.mContentView != null) {
+                result.contentView = b.mContentView;
+            }
+            return result;
+        }
+
+        @Override
+        public Bundle getExtras(Notification n) {
+            return null;
+        }
+
+        @Override
+        public int getActionCount(Notification n) {
+            return 0;
+        }
+
+        @Override
+        public Action getAction(Notification n, int actionIndex) {
+            return null;
+        }
+
+        @Override
+        public Action[] getActionsFromParcelableArrayList(
+                ArrayList<Parcelable> parcelables) {
+            return null;
+        }
+
+        @Override
+        public ArrayList<Parcelable> getParcelableArrayListForActions(Action[] actions) {
+            return null;
+        }
+
+        @Override
+        public String getCategory(Notification n) {
+            return null;
+        }
+
+        @Override
+        public boolean getLocalOnly(Notification n) {
+            return false;
+        }
+
+        @Override
+        public String getGroup(Notification n) {
+            return null;
+        }
+
+        @Override
+        public boolean isGroupSummary(Notification n) {
+            return false;
+        }
+
+        @Override
+        public String getSortKey(Notification n) {
+            return null;
+        }
+
+        @Override
+        public Bundle getBundleForUnreadConversation(NotificationCompatBase.UnreadConversation uc) {
+            return null;
+        }
+
+        @Override
+        public NotificationCompatBase.UnreadConversation getUnreadConversationFromBundle(
+                Bundle b, NotificationCompatBase.UnreadConversation.Factory factory,
+                RemoteInputCompatBase.RemoteInput.Factory remoteInputFactory) {
+            return null;
+        }
+    }
+
+    static class NotificationCompatImplHoneycomb extends NotificationCompatImplBase {
+        @Override
+        public Notification build(Builder b, BuilderExtender extender) {
+            Notification notification = NotificationCompatHoneycomb.add(b.mContext, b.mNotification,
+                    b.mContentTitle, b.mContentText, b.mContentInfo, b.mTickerView,
+                    b.mNumber, b.mContentIntent, b.mFullScreenIntent, b.mLargeIcon);
+            if (b.mContentView != null) {
+                notification.contentView = b.mContentView;
+            }
+            return notification;
+        }
+    }
+
+    static class NotificationCompatImplIceCreamSandwich extends NotificationCompatImplBase {
+        @Override
+        public Notification build(Builder b, BuilderExtender extender) {
+            NotificationCompatIceCreamSandwich.Builder builder =
+                    new NotificationCompatIceCreamSandwich.Builder(
+                            b.mContext, b.mNotification, b.mContentTitle, b.mContentText, b.mContentInfo,
+                            b.mTickerView, b.mNumber, b.mContentIntent, b.mFullScreenIntent, b.mLargeIcon,
+                            b.mProgressMax, b.mProgress, b.mProgressIndeterminate);
+            Notification notification = extender.build(b, builder);
+            if (b.mContentView != null) {
+                notification.contentView = b.mContentView;
+            }
+            return notification;
+        }
+    }
+
+    static class NotificationCompatImplJellybean extends NotificationCompatImplBase {
+        @Override
+        public Notification build(Builder b, BuilderExtender extender) {
+            NotificationCompatJellybean.Builder builder = new NotificationCompatJellybean.Builder(
+                    b.mContext, b.mNotification, b.mContentTitle, b.mContentText, b.mContentInfo,
+                    b.mTickerView, b.mNumber, b.mContentIntent, b.mFullScreenIntent, b.mLargeIcon,
+                    b.mProgressMax, b.mProgress, b.mProgressIndeterminate,
+                    b.mUseChronometer, b.mPriority, b.mSubText, b.mLocalOnly, b.mExtras,
+                    b.mGroupKey, b.mGroupSummary, b.mSortKey, b.mContentView, b.mBigContentView);
+            addActionsToBuilder(builder, b.mActions);
+            addStyleToBuilderJellybean(builder, b.mStyle);
+            Notification notification = extender.build(b, builder);
+            if (b.mStyle != null) {
+                b.mStyle.addCompatExtras(getExtras(notification));
+            }
+            return notification;
+        }
+
+        @Override
+        public Bundle getExtras(Notification n) {
+            return NotificationCompatJellybean.getExtras(n);
+        }
+
+        @Override
+        public int getActionCount(Notification n) {
+            return NotificationCompatJellybean.getActionCount(n);
+        }
+
+        @Override
+        public Action getAction(Notification n, int actionIndex) {
+            return (Action) NotificationCompatJellybean.getAction(n, actionIndex, Action.FACTORY,
+                    RemoteInput.FACTORY);
+        }
+
+        @Override
+        public Action[] getActionsFromParcelableArrayList(
+                ArrayList<Parcelable> parcelables) {
+            return (Action[]) NotificationCompatJellybean.getActionsFromParcelableArrayList(
+                    parcelables, Action.FACTORY, RemoteInput.FACTORY);
+        }
+
+        @Override
+        public ArrayList<Parcelable> getParcelableArrayListForActions(
+                Action[] actions) {
+            return NotificationCompatJellybean.getParcelableArrayListForActions(actions);
+        }
+
+        @Override
+        public boolean getLocalOnly(Notification n) {
+            return NotificationCompatJellybean.getLocalOnly(n);
+        }
+
+        @Override
+        public String getGroup(Notification n) {
+            return NotificationCompatJellybean.getGroup(n);
+        }
+
+        @Override
+        public boolean isGroupSummary(Notification n) {
+            return NotificationCompatJellybean.isGroupSummary(n);
+        }
+
+        @Override
+        public String getSortKey(Notification n) {
+            return NotificationCompatJellybean.getSortKey(n);
+        }
+    }
+
+    static class NotificationCompatImplKitKat extends NotificationCompatImplJellybean {
+        @Override
+        public Notification build(Builder b, BuilderExtender extender) {
+            NotificationCompatKitKat.Builder builder = new NotificationCompatKitKat.Builder(
+                    b.mContext, b.mNotification, b.mContentTitle, b.mContentText, b.mContentInfo,
+                    b.mTickerView, b.mNumber, b.mContentIntent, b.mFullScreenIntent, b.mLargeIcon,
+                    b.mProgressMax, b.mProgress, b.mProgressIndeterminate, b.mShowWhen,
+                    b.mUseChronometer, b.mPriority, b.mSubText, b.mLocalOnly,
+                    b.mPeople, b.mExtras, b.mGroupKey, b.mGroupSummary, b.mSortKey,
+                    b.mContentView, b.mBigContentView);
+            addActionsToBuilder(builder, b.mActions);
+            addStyleToBuilderJellybean(builder, b.mStyle);
+            return extender.build(b, builder);
+        }
+
+        @Override
+        public Bundle getExtras(Notification n) {
+            return NotificationCompatKitKat.getExtras(n);
+        }
+
+        @Override
+        public int getActionCount(Notification n) {
+            return NotificationCompatKitKat.getActionCount(n);
+        }
+
+        @Override
+        public Action getAction(Notification n, int actionIndex) {
+            return (Action) NotificationCompatKitKat.getAction(n, actionIndex, Action.FACTORY,
+                    RemoteInput.FACTORY);
+        }
+
+        @Override
+        public boolean getLocalOnly(Notification n) {
+            return NotificationCompatKitKat.getLocalOnly(n);
+        }
+
+        @Override
+        public String getGroup(Notification n) {
+            return NotificationCompatKitKat.getGroup(n);
+        }
+
+        @Override
+        public boolean isGroupSummary(Notification n) {
+            return NotificationCompatKitKat.isGroupSummary(n);
+        }
+
+        @Override
+        public String getSortKey(Notification n) {
+            return NotificationCompatKitKat.getSortKey(n);
+        }
+    }
+
+    static class NotificationCompatImplApi20 extends NotificationCompatImplKitKat {
+        @Override
+        public Notification build(Builder b, BuilderExtender extender) {
+            NotificationCompatApi20.Builder builder = new NotificationCompatApi20.Builder(
+                    b.mContext, b.mNotification, b.mContentTitle, b.mContentText, b.mContentInfo,
+                    b.mTickerView, b.mNumber, b.mContentIntent, b.mFullScreenIntent, b.mLargeIcon,
+                    b.mProgressMax, b.mProgress, b.mProgressIndeterminate, b.mShowWhen,
+                    b.mUseChronometer, b.mPriority, b.mSubText, b.mLocalOnly, b.mPeople, b.mExtras,
+                    b.mGroupKey, b.mGroupSummary, b.mSortKey, b.mContentView, b.mBigContentView);
+            addActionsToBuilder(builder, b.mActions);
+            addStyleToBuilderJellybean(builder, b.mStyle);
+            Notification notification = extender.build(b, builder);
+            if (b.mStyle != null) {
+                b.mStyle.addCompatExtras(getExtras(notification));
+            }
+            return notification;
+        }
+
+        @Override
+        public Action getAction(Notification n, int actionIndex) {
+            return (Action) NotificationCompatApi20.getAction(n, actionIndex, Action.FACTORY,
+                    RemoteInput.FACTORY);
+        }
+
+        @Override
+        public Action[] getActionsFromParcelableArrayList(
+                ArrayList<Parcelable> parcelables) {
+            return (Action[]) NotificationCompatApi20.getActionsFromParcelableArrayList(
+                    parcelables, Action.FACTORY, RemoteInput.FACTORY);
+        }
+
+        @Override
+        public ArrayList<Parcelable> getParcelableArrayListForActions(
+                Action[] actions) {
+            return NotificationCompatApi20.getParcelableArrayListForActions(actions);
+        }
+
+        @Override
+        public boolean getLocalOnly(Notification n) {
+            return NotificationCompatApi20.getLocalOnly(n);
+        }
+
+        @Override
+        public String getGroup(Notification n) {
+            return NotificationCompatApi20.getGroup(n);
+        }
+
+        @Override
+        public boolean isGroupSummary(Notification n) {
+            return NotificationCompatApi20.isGroupSummary(n);
+        }
+
+        @Override
+        public String getSortKey(Notification n) {
+            return NotificationCompatApi20.getSortKey(n);
+        }
+    }
+
+    static class NotificationCompatImplApi21 extends NotificationCompatImplApi20 {
+        @Override
+        public Notification build(Builder b, BuilderExtender extender) {
+            NotificationCompatApi21.Builder builder = new NotificationCompatApi21.Builder(
+                    b.mContext, b.mNotification, b.mContentTitle, b.mContentText, b.mContentInfo,
+                    b.mTickerView, b.mNumber, b.mContentIntent, b.mFullScreenIntent, b.mLargeIcon,
+                    b.mProgressMax, b.mProgress, b.mProgressIndeterminate, b.mShowWhen,
+                    b.mUseChronometer, b.mPriority, b.mSubText, b.mLocalOnly, b.mCategory,
+                    b.mPeople, b.mExtras, b.mColor, b.mVisibility, b.mPublicVersion,
+                    b.mGroupKey, b.mGroupSummary, b.mSortKey, b.mContentView, b.mBigContentView,
+                    b.mHeadsUpContentView);
+            addActionsToBuilder(builder, b.mActions);
+            addStyleToBuilderJellybean(builder, b.mStyle);
+            Notification notification = extender.build(b, builder);
+            if (b.mStyle != null) {
+                b.mStyle.addCompatExtras(getExtras(notification));
+            }
+            return notification;
+        }
+
+        @Override
+        public String getCategory(Notification notif) {
+            return NotificationCompatApi21.getCategory(notif);
+        }
+
+        @Override
+        public Bundle getBundleForUnreadConversation(NotificationCompatBase.UnreadConversation uc) {
+            return NotificationCompatApi21.getBundleForUnreadConversation(uc);
+        }
+
+        @Override
+        public NotificationCompatBase.UnreadConversation getUnreadConversationFromBundle(
+                Bundle b, NotificationCompatBase.UnreadConversation.Factory factory,
+                RemoteInputCompatBase.RemoteInput.Factory remoteInputFactory) {
+            return NotificationCompatApi21.getUnreadConversationFromBundle(
+                    b, factory, remoteInputFactory);
+        }
+    }
+
+    static class NotificationCompatImplApi24 extends NotificationCompatImplApi21 {
+        @Override
+        public Notification build(Builder b,
+                BuilderExtender extender) {
+            NotificationCompatApi24.Builder builder = new NotificationCompatApi24.Builder(
+                    b.mContext, b.mNotification, b.mContentTitle, b.mContentText, b.mContentInfo,
+                    b.mTickerView, b.mNumber, b.mContentIntent, b.mFullScreenIntent, b.mLargeIcon,
+                    b.mProgressMax, b.mProgress, b.mProgressIndeterminate, b.mShowWhen,
+                    b.mUseChronometer, b.mPriority, b.mSubText, b.mLocalOnly, b.mCategory,
+                    b.mPeople, b.mExtras, b.mColor, b.mVisibility, b.mPublicVersion,
+                    b.mGroupKey, b.mGroupSummary, b.mSortKey, b.mRemoteInputHistory, b.mContentView,
+                    b.mBigContentView, b.mHeadsUpContentView);
+            addActionsToBuilder(builder, b.mActions);
+            addStyleToBuilderApi24(builder, b.mStyle);
+            Notification notification = extender.build(b, builder);
+            if (b.mStyle != null) {
+                b.mStyle.addCompatExtras(getExtras(notification));
+            }
+            return notification;
+        }
+    }
+
+    private static void addActionsToBuilder(NotificationBuilderWithActions builder,
+            ArrayList<Action> actions) {
+        for (Action action : actions) {
+            builder.addAction(action);
+        }
+    }
+
+    private static void addStyleToBuilderJellybean(NotificationBuilderWithBuilderAccessor builder,
+            Style style) {
+        if (style != null) {
+            if (style instanceof BigTextStyle) {
+                BigTextStyle bigTextStyle = (BigTextStyle) style;
+                NotificationCompatJellybean.addBigTextStyle(builder,
+                        bigTextStyle.mBigContentTitle,
+                        bigTextStyle.mSummaryTextSet,
+                        bigTextStyle.mSummaryText,
+                        bigTextStyle.mBigText);
+            } else if (style instanceof InboxStyle) {
+                InboxStyle inboxStyle = (InboxStyle) style;
+                NotificationCompatJellybean.addInboxStyle(builder,
+                        inboxStyle.mBigContentTitle,
+                        inboxStyle.mSummaryTextSet,
+                        inboxStyle.mSummaryText,
+                        inboxStyle.mTexts);
+            } else if (style instanceof BigPictureStyle) {
+                BigPictureStyle bigPictureStyle = (BigPictureStyle) style;
+                NotificationCompatJellybean.addBigPictureStyle(builder,
+                        bigPictureStyle.mBigContentTitle,
+                        bigPictureStyle.mSummaryTextSet,
+                        bigPictureStyle.mSummaryText,
+                        bigPictureStyle.mPicture,
+                        bigPictureStyle.mBigLargeIcon,
+                        bigPictureStyle.mBigLargeIconSet);
+            } else if (style instanceof MessagingStyle) {
+                // TODO implement BigText fallback
+            }
+        }
+    }
+
+    private static void addStyleToBuilderApi24(NotificationBuilderWithBuilderAccessor builder,
+            Style style) {
+        if (style != null) {
+            if (style instanceof MessagingStyle) {
+                MessagingStyle messagingStyle = (MessagingStyle) style;
+                List<CharSequence> texts = new ArrayList<>();
+                List<Long> timestamps = new ArrayList<>();
+                List<CharSequence> senders = new ArrayList<>();
+                List<String> dataMimeTypes = new ArrayList<>();
+                List<Uri> dataUris = new ArrayList<>();
+
+                for (MessagingStyle.Message message : messagingStyle.mMessages) {
+                    texts.add(message.getText());
+                    timestamps.add(message.getTimestamp());
+                    senders.add(message.getSender());
+                    dataMimeTypes.add(message.getDataMimeType());
+                    dataUris.add(message.getDataUri());
+                }
+                NotificationCompatApi24.addMessagingStyle(builder, messagingStyle.mUserDisplayName,
+                        messagingStyle.mConversationTitle, texts, timestamps, senders,
+                        dataMimeTypes, dataUris);
+            } else {
+                addStyleToBuilderJellybean(builder, style);
+            }
+        }
+    }
+
+    static {
+        if (BuildCompat.isAtLeastN()) {
+            IMPL = new NotificationCompatImplApi24();
+        } else if (Build.VERSION.SDK_INT >= 21) {
+            IMPL = new NotificationCompatImplApi21();
+        } else if (Build.VERSION.SDK_INT >= 20) {
+            IMPL = new NotificationCompatImplApi20();
+        } else if (Build.VERSION.SDK_INT >= 19) {
+            IMPL = new NotificationCompatImplKitKat();
+        } else if (Build.VERSION.SDK_INT >= 16) {
+            IMPL = new NotificationCompatImplJellybean();
+        } else if (Build.VERSION.SDK_INT >= 14) {
+            IMPL = new NotificationCompatImplIceCreamSandwich();
+        } else if (Build.VERSION.SDK_INT >= 11) {
+            IMPL = new NotificationCompatImplHoneycomb();
+        } else {
+            IMPL = new NotificationCompatImplBase();
+        }
+    }
+
+    /**
+     * Builder class for {@link NotificationCompat} objects.  Allows easier control over
+     * all the flags, as well as help constructing the typical notification layouts.
+     * <p>
+     * On platform versions that don't offer expanded notifications, methods that depend on
+     * expanded notifications have no effect.
+     * </p>
+     * <p>
+     * For example, action buttons won't appear on platforms prior to Android 4.1. Action
+     * buttons depend on expanded notifications, which are only available in Android 4.1
+     * and later.
+     * <p>
+     * For this reason, you should always ensure that UI controls in a notification are also
+     * available in an {@link android.app.Activity} in your app, and you should always start that
+     * {@link android.app.Activity} when users click the notification. To do this, use the
+     * {@link NotificationCompat.Builder#setContentIntent setContentIntent()}
+     * method.
+     * </p>
+     *
+     */
+    public static class Builder {
+        /**
+         * Maximum length of CharSequences accepted by Builder and friends.
+         *
+         * <p>
+         * Avoids spamming the system with overly large strings such as full e-mails.
+         */
+        private static final int MAX_CHARSEQUENCE_LENGTH = 5 * 1024;
+
+        // All these variables are declared public/hidden so they can be accessed by a builder
+        // extender.
+
+        /** @hide */
+        public Context mContext;
+
+        /** @hide */
+        public CharSequence mContentTitle;
+        /** @hide */
+        public CharSequence mContentText;
+        PendingIntent mContentIntent;
+        PendingIntent mFullScreenIntent;
+        RemoteViews mTickerView;
+        /** @hide */
+        public Bitmap mLargeIcon;
+        /** @hide */
+        public CharSequence mContentInfo;
+        /** @hide */
+        public int mNumber;
+        int mPriority;
+        boolean mShowWhen = true;
+        /** @hide */
+        public boolean mUseChronometer;
+        /** @hide */
+        public Style mStyle;
+        /** @hide */
+        public CharSequence mSubText;
+        /** @hide */
+        public CharSequence[] mRemoteInputHistory;
+        int mProgressMax;
+        int mProgress;
+        boolean mProgressIndeterminate;
+        String mGroupKey;
+        boolean mGroupSummary;
+        String mSortKey;
+        /** @hide */
+        public ArrayList<Action> mActions = new ArrayList<Action>();
+        boolean mLocalOnly = false;
+        String mCategory;
+        Bundle mExtras;
+        int mColor = COLOR_DEFAULT;
+        int mVisibility = VISIBILITY_PRIVATE;
+        Notification mPublicVersion;
+        RemoteViews mContentView;
+        RemoteViews mBigContentView;
+        RemoteViews mHeadsUpContentView;
+
+        /** @hide */
+        public Notification mNotification = new Notification();
+        public ArrayList<String> mPeople;
+
+        /**
+         * Constructor.
+         *
+         * Automatically sets the when field to {@link System#currentTimeMillis()
+         * System.currentTimeMillis()} and the audio stream to the
+         * {@link Notification#STREAM_DEFAULT}.
+         *
+         * @param context A {@link Context} that will be used to construct the
+         *      RemoteViews. The Context will not be held past the lifetime of this
+         *      Builder object.
+         */
+        public Builder(Context context) {
+            mContext = context;
+
+            // Set defaults to match the defaults of a Notification
+            mNotification.when = System.currentTimeMillis();
+            mNotification.audioStreamType = Notification.STREAM_DEFAULT;
+            mPriority = PRIORITY_DEFAULT;
+            mPeople = new ArrayList<String>();
+        }
+
+        /**
+         * Set the time that the event occurred.  Notifications in the panel are
+         * sorted by this time.
+         */
+        public Builder setWhen(long when) {
+            mNotification.when = when;
+            return this;
+        }
+
+        /**
+         * Control whether the timestamp set with {@link #setWhen(long) setWhen} is shown
+         * in the content view.
+         */
+        public Builder setShowWhen(boolean show) {
+            mShowWhen = show;
+            return this;
+        }
+
+        /**
+         * Show the {@link Notification#when} field as a stopwatch.
+         *
+         * Instead of presenting <code>when</code> as a timestamp, the notification will show an
+         * automatically updating display of the minutes and seconds since <code>when</code>.
+         *
+         * Useful when showing an elapsed time (like an ongoing phone call).
+         *
+         * @see android.widget.Chronometer
+         * @see Notification#when
+         */
+        public Builder setUsesChronometer(boolean b) {
+            mUseChronometer = b;
+            return this;
+        }
+
+        /**
+         * Set the small icon to use in the notification layouts.  Different classes of devices
+         * may return different sizes.  See the UX guidelines for more information on how to
+         * design these icons.
+         *
+         * @param icon A resource ID in the application's package of the drawble to use.
+         */
+        public Builder setSmallIcon(int icon) {
+            mNotification.icon = icon;
+            return this;
+        }
+
+        /**
+         * A variant of {@link #setSmallIcon(int) setSmallIcon(int)} that takes an additional
+         * level parameter for when the icon is a {@link android.graphics.drawable.LevelListDrawable
+         * LevelListDrawable}.
+         *
+         * @param icon A resource ID in the application's package of the drawble to use.
+         * @param level The level to use for the icon.
+         *
+         * @see android.graphics.drawable.LevelListDrawable
+         */
+        public Builder setSmallIcon(int icon, int level) {
+            mNotification.icon = icon;
+            mNotification.iconLevel = level;
+            return this;
+        }
+
+        /**
+         * Set the title (first row) of the notification, in a standard notification.
+         */
+        public Builder setContentTitle(CharSequence title) {
+            mContentTitle = limitCharSequenceLength(title);
+            return this;
+        }
+
+        /**
+         * Set the text (second row) of the notification, in a standard notification.
+         */
+        public Builder setContentText(CharSequence text) {
+            mContentText = limitCharSequenceLength(text);
+            return this;
+        }
+
+        /**
+         * Set the third line of text in the platform notification template.
+         * Don't use if you're also using {@link #setProgress(int, int, boolean)};
+         * they occupy the same location in the standard template.
+         * <br>
+         * If the platform does not provide large-format notifications, this method has no effect.
+         * The third line of text only appears in expanded view.
+         * <br>
+         */
+        public Builder setSubText(CharSequence text) {
+            mSubText = limitCharSequenceLength(text);
+            return this;
+        }
+
+        /**
+         * Set the remote input history.
+         *
+         * This should be set to the most recent inputs that have been sent
+         * through a {@link RemoteInput} of this Notification and cleared once the it is no
+         * longer relevant (e.g. for chat notifications once the other party has responded).
+         *
+         * The most recent input must be stored at the 0 index, the second most recent at the
+         * 1 index, etc. Note that the system will limit both how far back the inputs will be shown
+         * and how much of each individual input is shown.
+         *
+         * <p>Note: The reply text will only be shown on notifications that have least one action
+         * with a {@code RemoteInput}.</p>
+         */
+        public Builder setRemoteInputHistory(CharSequence[] text) {
+            mRemoteInputHistory = text;
+            return this;
+        }
+
+        /**
+         * Set the large number at the right-hand side of the notification.  This is
+         * equivalent to setContentInfo, although it might show the number in a different
+         * font size for readability.
+         */
+        public Builder setNumber(int number) {
+            mNumber = number;
+            return this;
+        }
+
+        /**
+         * Set the large text at the right-hand side of the notification.
+         */
+        public Builder setContentInfo(CharSequence info) {
+            mContentInfo = limitCharSequenceLength(info);
+            return this;
+        }
+
+        /**
+         * Set the progress this notification represents, which may be
+         * represented as a {@link android.widget.ProgressBar}.
+         */
+        public Builder setProgress(int max, int progress, boolean indeterminate) {
+            mProgressMax = max;
+            mProgress = progress;
+            mProgressIndeterminate = indeterminate;
+            return this;
+        }
+
+        /**
+         * Supply a custom RemoteViews to use instead of the standard one.
+         */
+        public Builder setContent(RemoteViews views) {
+            mNotification.contentView = views;
+            return this;
+        }
+
+        /**
+         * Supply a {@link PendingIntent} to send when the notification is clicked.
+         * If you do not supply an intent, you can now add PendingIntents to individual
+         * views to be launched when clicked by calling {@link RemoteViews#setOnClickPendingIntent
+         * RemoteViews.setOnClickPendingIntent(int,PendingIntent)}.  Be sure to
+         * read {@link Notification#contentIntent Notification.contentIntent} for
+         * how to correctly use this.
+         */
+        public Builder setContentIntent(PendingIntent intent) {
+            mContentIntent = intent;
+            return this;
+        }
+
+        /**
+         * Supply a {@link PendingIntent} to send when the notification is cleared by the user
+         * directly from the notification panel.  For example, this intent is sent when the user
+         * clicks the "Clear all" button, or the individual "X" buttons on notifications.  This
+         * intent is not sent when the application calls
+         * {@link android.app.NotificationManager#cancel NotificationManager.cancel(int)}.
+         */
+        public Builder setDeleteIntent(PendingIntent intent) {
+            mNotification.deleteIntent = intent;
+            return this;
+        }
+
+        /**
+         * An intent to launch instead of posting the notification to the status bar.
+         * Only for use with extremely high-priority notifications demanding the user's
+         * <strong>immediate</strong> attention, such as an incoming phone call or
+         * alarm clock that the user has explicitly set to a particular time.
+         * If this facility is used for something else, please give the user an option
+         * to turn it off and use a normal notification, as this can be extremely
+         * disruptive.
+         *
+         * <p>
+         * On some platforms, the system UI may choose to display a heads-up notification,
+         * instead of launching this intent, while the user is using the device.
+         * </p>
+         *
+         * @param intent The pending intent to launch.
+         * @param highPriority Passing true will cause this notification to be sent
+         *          even if other notifications are suppressed.
+         */
+        public Builder setFullScreenIntent(PendingIntent intent, boolean highPriority) {
+            mFullScreenIntent = intent;
+            setFlag(FLAG_HIGH_PRIORITY, highPriority);
+            return this;
+        }
+
+        /**
+         * Set the text that is displayed in the status bar when the notification first
+         * arrives.
+         */
+        public Builder setTicker(CharSequence tickerText) {
+            mNotification.tickerText = limitCharSequenceLength(tickerText);
+            return this;
+        }
+
+        /**
+         * Set the text that is displayed in the status bar when the notification first
+         * arrives, and also a RemoteViews object that may be displayed instead on some
+         * devices.
+         */
+        public Builder setTicker(CharSequence tickerText, RemoteViews views) {
+            mNotification.tickerText = limitCharSequenceLength(tickerText);
+            mTickerView = views;
+            return this;
+        }
+
+        /**
+         * Set the large icon that is shown in the ticker and notification.
+         */
+        public Builder setLargeIcon(Bitmap icon) {
+            mLargeIcon = icon;
+            return this;
+        }
+
+        /**
+         * Set the sound to play.  It will play on the default stream.
+         *
+         * <p>
+         * On some platforms, a notification that is noisy is more likely to be presented
+         * as a heads-up notification.
+         * </p>
+         */
+        public Builder setSound(Uri sound) {
+            mNotification.sound = sound;
+            mNotification.audioStreamType = Notification.STREAM_DEFAULT;
+            return this;
+        }
+
+        /**
+         * Set the sound to play.  It will play on the stream you supply.
+         *
+         * <p>
+         * On some platforms, a notification that is noisy is more likely to be presented
+         * as a heads-up notification.
+         * </p>
+         *
+         * @see Notification#STREAM_DEFAULT
+         * @see AudioManager for the <code>STREAM_</code> constants.
+         */
+        public Builder setSound(Uri sound, int streamType) {
+            mNotification.sound = sound;
+            mNotification.audioStreamType = streamType;
+            return this;
+        }
+
+        /**
+         * Set the vibration pattern to use.
+         *
+         * <p>
+         * On some platforms, a notification that vibrates is more likely to be presented
+         * as a heads-up notification.
+         * </p>
+         *
+         * @see android.os.Vibrator for a discussion of the <code>pattern</code>
+         * parameter.
+         */
+        public Builder setVibrate(long[] pattern) {
+            mNotification.vibrate = pattern;
+            return this;
+        }
+
+        /**
+         * Set the argb value that you would like the LED on the device to blink, as well as the
+         * rate.  The rate is specified in terms of the number of milliseconds to be on
+         * and then the number of milliseconds to be off.
+         */
+        public Builder setLights(@ColorInt int argb, int onMs, int offMs) {
+            mNotification.ledARGB = argb;
+            mNotification.ledOnMS = onMs;
+            mNotification.ledOffMS = offMs;
+            boolean showLights = mNotification.ledOnMS != 0 && mNotification.ledOffMS != 0;
+            mNotification.flags = (mNotification.flags & ~Notification.FLAG_SHOW_LIGHTS) |
+                    (showLights ? Notification.FLAG_SHOW_LIGHTS : 0);
+            return this;
+        }
+
+        /**
+         * Set whether this is an ongoing notification.
+         *
+         * <p>Ongoing notifications differ from regular notifications in the following ways:
+         * <ul>
+         *   <li>Ongoing notifications are sorted above the regular notifications in the
+         *   notification panel.</li>
+         *   <li>Ongoing notifications do not have an 'X' close button, and are not affected
+         *   by the "Clear all" button.
+         * </ul>
+         */
+        public Builder setOngoing(boolean ongoing) {
+            setFlag(Notification.FLAG_ONGOING_EVENT, ongoing);
+            return this;
+        }
+
+        /**
+         * Set this flag if you would only like the sound, vibrate
+         * and ticker to be played if the notification is not already showing.
+         */
+        public Builder setOnlyAlertOnce(boolean onlyAlertOnce) {
+            setFlag(Notification.FLAG_ONLY_ALERT_ONCE, onlyAlertOnce);
+            return this;
+        }
+
+        /**
+         * Setting this flag will make it so the notification is automatically
+         * canceled when the user clicks it in the panel.  The PendingIntent
+         * set with {@link #setDeleteIntent} will be broadcast when the notification
+         * is canceled.
+         */
+        public Builder setAutoCancel(boolean autoCancel) {
+            setFlag(Notification.FLAG_AUTO_CANCEL, autoCancel);
+            return this;
+        }
+
+        /**
+         * Set whether or not this notification is only relevant to the current device.
+         *
+         * <p>Some notifications can be bridged to other devices for remote display.
+         * This hint can be set to recommend this notification not be bridged.
+         */
+        public Builder setLocalOnly(boolean b) {
+            mLocalOnly = b;
+            return this;
+        }
+
+        /**
+         * Set the notification category.
+         *
+         * <p>Must be one of the predefined notification categories (see the <code>CATEGORY_*</code>
+         * constants in {@link Notification}) that best describes this notification.
+         * May be used by the system for ranking and filtering.
+         */
+        public Builder setCategory(String category) {
+            mCategory = category;
+            return this;
+        }
+
+        /**
+         * Set the default notification options that will be used.
+         * <p>
+         * The value should be one or more of the following fields combined with
+         * bitwise-or:
+         * {@link Notification#DEFAULT_SOUND}, {@link Notification#DEFAULT_VIBRATE},
+         * {@link Notification#DEFAULT_LIGHTS}.
+         * <p>
+         * For all default values, use {@link Notification#DEFAULT_ALL}.
+         */
+        public Builder setDefaults(int defaults) {
+            mNotification.defaults = defaults;
+            if ((defaults & Notification.DEFAULT_LIGHTS) != 0) {
+                mNotification.flags |= Notification.FLAG_SHOW_LIGHTS;
+            }
+            return this;
+        }
+
+        private void setFlag(int mask, boolean value) {
+            if (value) {
+                mNotification.flags |= mask;
+            } else {
+                mNotification.flags &= ~mask;
+            }
+        }
+
+        /**
+         * Set the relative priority for this notification.
+         *
+         * Priority is an indication of how much of the user's
+         * valuable attention should be consumed by this
+         * notification. Low-priority notifications may be hidden from
+         * the user in certain situations, while the user might be
+         * interrupted for a higher-priority notification.
+         * The system sets a notification's priority based on various factors including the
+         * setPriority value. The effect may differ slightly on different platforms.
+         *
+         * @param pri Relative priority for this notification. Must be one of
+         *     the priority constants defined by {@link NotificationCompat}.
+         *     Acceptable values range from {@link
+         *     NotificationCompat#PRIORITY_MIN} (-2) to {@link
+         *     NotificationCompat#PRIORITY_MAX} (2).
+         */
+        public Builder setPriority(int pri) {
+            mPriority = pri;
+            return this;
+        }
+
+        /**
+         * Add a person that is relevant to this notification.
+         *
+         * <P>
+         * Depending on user preferences, this annotation may allow the notification to pass
+         * through interruption filters, and to appear more prominently in the user interface.
+         * </P>
+         *
+         * <P>
+         * The person should be specified by the {@code String} representation of a
+         * {@link android.provider.ContactsContract.Contacts#CONTENT_LOOKUP_URI}.
+         * </P>
+         *
+         * <P>The system will also attempt to resolve {@code mailto:} and {@code tel:} schema
+         * URIs.  The path part of these URIs must exist in the contacts database, in the
+         * appropriate column, or the reference will be discarded as invalid. Telephone schema
+         * URIs will be resolved by {@link android.provider.ContactsContract.PhoneLookup}.
+         * </P>
+         *
+         * @param uri A URI for the person.
+         * @see Notification#EXTRA_PEOPLE
+         */
+        public Builder addPerson(String uri) {
+            mPeople.add(uri);
+            return this;
+        }
+
+        /**
+         * Set this notification to be part of a group of notifications sharing the same key.
+         * Grouped notifications may display in a cluster or stack on devices which
+         * support such rendering.
+         *
+         * <p>To make this notification the summary for its group, also call
+         * {@link #setGroupSummary}. A sort order can be specified for group members by using
+         * {@link #setSortKey}.
+         * @param groupKey The group key of the group.
+         * @return this object for method chaining
+         */
+        public Builder setGroup(String groupKey) {
+            mGroupKey = groupKey;
+            return this;
+        }
+
+        /**
+         * Set this notification to be the group summary for a group of notifications.
+         * Grouped notifications may display in a cluster or stack on devices which
+         * support such rendering. Requires a group key also be set using {@link #setGroup}.
+         * @param isGroupSummary Whether this notification should be a group summary.
+         * @return this object for method chaining
+         */
+        public Builder setGroupSummary(boolean isGroupSummary) {
+            mGroupSummary = isGroupSummary;
+            return this;
+        }
+
+        /**
+         * Set a sort key that orders this notification among other notifications from the
+         * same package. This can be useful if an external sort was already applied and an app
+         * would like to preserve this. Notifications will be sorted lexicographically using this
+         * value, although providing different priorities in addition to providing sort key may
+         * cause this value to be ignored.
+         *
+         * <p>This sort key can also be used to order members of a notification group. See
+         * {@link Builder#setGroup}.
+         *
+         * @see String#compareTo(String)
+         */
+        public Builder setSortKey(String sortKey) {
+            mSortKey = sortKey;
+            return this;
+        }
+
+        /**
+         * Merge additional metadata into this notification.
+         *
+         * <p>Values within the Bundle will replace existing extras values in this Builder.
+         *
+         * @see Notification#extras
+         */
+        public Builder addExtras(Bundle extras) {
+            if (extras != null) {
+                if (mExtras == null) {
+                    mExtras = new Bundle(extras);
+                } else {
+                    mExtras.putAll(extras);
+                }
+            }
+            return this;
+        }
+
+        /**
+         * Set metadata for this notification.
+         *
+         * <p>A reference to the Bundle is held for the lifetime of this Builder, and the Bundle's
+         * current contents are copied into the Notification each time {@link #build()} is
+         * called.
+         *
+         * <p>Replaces any existing extras values with those from the provided Bundle.
+         * Use {@link #addExtras} to merge in metadata instead.
+         *
+         * @see Notification#extras
+         */
+        public Builder setExtras(Bundle extras) {
+            mExtras = extras;
+            return this;
+        }
+
+        /**
+         * Get the current metadata Bundle used by this notification Builder.
+         *
+         * <p>The returned Bundle is shared with this Builder.
+         *
+         * <p>The current contents of this Bundle are copied into the Notification each time
+         * {@link #build()} is called.
+         *
+         * @see Notification#extras
+         */
+        public Bundle getExtras() {
+            if (mExtras == null) {
+                mExtras = new Bundle();
+            }
+            return mExtras;
+        }
+
+        /**
+         * Add an action to this notification. Actions are typically displayed by
+         * the system as a button adjacent to the notification content.
+         * <br>
+         * Action buttons won't appear on platforms prior to Android 4.1. Action
+         * buttons depend on expanded notifications, which are only available in Android 4.1
+         * and later. To ensure that an action button's functionality is always available, first
+         * implement the functionality in the {@link android.app.Activity} that starts when a user
+         * clicks the  notification (see {@link #setContentIntent setContentIntent()}), and then
+         * enhance the notification by implementing the same functionality with
+         * {@link #addAction addAction()}.
+         *
+         * @param icon Resource ID of a drawable that represents the action.
+         * @param title Text describing the action.
+         * @param intent {@link android.app.PendingIntent} to be fired when the action is invoked.
+         */
+        public Builder addAction(int icon, CharSequence title, PendingIntent intent) {
+            mActions.add(new Action(icon, title, intent));
+            return this;
+        }
+
+        /**
+         * Add an action to this notification. Actions are typically displayed by
+         * the system as a button adjacent to the notification content.
+         * <br>
+         * Action buttons won't appear on platforms prior to Android 4.1. Action
+         * buttons depend on expanded notifications, which are only available in Android 4.1
+         * and later. To ensure that an action button's functionality is always available, first
+         * implement the functionality in the {@link android.app.Activity} that starts when a user
+         * clicks the  notification (see {@link #setContentIntent setContentIntent()}), and then
+         * enhance the notification by implementing the same functionality with
+         * {@link #addAction addAction()}.
+         *
+         * @param action The action to add.
+         */
+        public Builder addAction(Action action) {
+            mActions.add(action);
+            return this;
+        }
+
+        /**
+         * Add a rich notification style to be applied at build time.
+         * <br>
+         * If the platform does not provide rich notification styles, this method has no effect. The
+         * user will always see the normal notification style.
+         *
+         * @param style Object responsible for modifying the notification style.
+         */
+        public Builder setStyle(Style style) {
+            if (mStyle != style) {
+                mStyle = style;
+                if (mStyle != null) {
+                    mStyle.setBuilder(this);
+                }
+            }
+            return this;
+        }
+
+        /**
+         * Sets {@link Notification#color}.
+         *
+         * @param argb The accent color to use
+         *
+         * @return The same Builder.
+         */
+        public Builder setColor(@ColorInt int argb) {
+            mColor = argb;
+            return this;
+        }
+
+        /**
+         * Sets {@link Notification#visibility}.
+         *
+         * @param visibility One of {@link Notification#VISIBILITY_PRIVATE} (the default),
+         *                   {@link Notification#VISIBILITY_PUBLIC}, or
+         *                   {@link Notification#VISIBILITY_SECRET}.
+         */
+        public Builder setVisibility(int visibility) {
+            mVisibility = visibility;
+            return this;
+        }
+
+        /**
+         * Supply a replacement Notification whose contents should be shown in insecure contexts
+         * (i.e. atop the secure lockscreen). See {@link Notification#visibility} and
+         * {@link #VISIBILITY_PUBLIC}.
+         *
+         * @param n A replacement notification, presumably with some or all info redacted.
+         * @return The same Builder.
+         */
+        public Builder setPublicVersion(Notification n) {
+            mPublicVersion = n;
+            return this;
+        }
+
+        /**
+         * Supply custom RemoteViews to use instead of the platform template.
+         *
+         * This will override the layout that would otherwise be constructed by this Builder
+         * object.
+         */
+        public Builder setCustomContentView(RemoteViews contentView) {
+            mContentView = contentView;
+            return this;
+        }
+
+        /**
+         * Supply custom RemoteViews to use instead of the platform template in the expanded form.
+         *
+         * This will override the expanded layout that would otherwise be constructed by this
+         * Builder object.
+         *
+         * No-op on versions prior to {@link android.os.Build.VERSION_CODES#JELLY_BEAN}.
+         */
+        public Builder setCustomBigContentView(RemoteViews contentView) {
+            mBigContentView = contentView;
+            return this;
+        }
+
+        /**
+         * Supply custom RemoteViews to use instead of the platform template in the heads up dialog.
+         *
+         * This will override the heads-up layout that would otherwise be constructed by this
+         * Builder object.
+         *
+         * No-op on versions prior to {@link android.os.Build.VERSION_CODES#LOLLIPOP}.
+         */
+        public Builder setCustomHeadsUpContentView(RemoteViews contentView) {
+            mHeadsUpContentView = contentView;
+            return this;
+        }
+
+        /**
+         * Apply an extender to this notification builder. Extenders may be used to add
+         * metadata or change options on this builder.
+         */
+        public Builder extend(Extender extender) {
+            extender.extend(this);
+            return this;
+        }
+
+        /**
+         * @deprecated Use {@link #build()} instead.
+         */
+        @Deprecated
+        public Notification getNotification() {
+            return build();
+        }
+
+        /**
+         * Combine all of the options that have been set and return a new {@link Notification}
+         * object.
+         */
+        public Notification build() {
+            return IMPL.build(this, getExtender());
+        }
+
+        /**
+         * @hide
+         */
+        protected BuilderExtender getExtender() {
+            return new BuilderExtender();
+        }
+
+        protected static CharSequence limitCharSequenceLength(CharSequence cs) {
+            if (cs == null) return cs;
+            if (cs.length() > MAX_CHARSEQUENCE_LENGTH) {
+                cs = cs.subSequence(0, MAX_CHARSEQUENCE_LENGTH);
+            }
+            return cs;
+        }
+    }
+
+    /**
+     * An object that can apply a rich notification style to a {@link Notification.Builder}
+     * object.
+     * <br>
+     * If the platform does not provide rich notification styles, methods in this class have no
+     * effect.
+     */
+    public static abstract class Style {
+        Builder mBuilder;
+        CharSequence mBigContentTitle;
+        CharSequence mSummaryText;
+        boolean mSummaryTextSet = false;
+
+        public void setBuilder(Builder builder) {
+            if (mBuilder != builder) {
+                mBuilder = builder;
+                if (mBuilder != null) {
+                    mBuilder.setStyle(this);
+                }
+            }
+        }
+
+        public Notification build() {
+            Notification notification = null;
+            if (mBuilder != null) {
+                notification = mBuilder.build();
+            }
+            return notification;
+        }
+
+        /**
+         * @hide
+         */
+        // TODO: implement for all styles
+        public void addCompatExtras(Bundle extras) {
+        }
+
+        /**
+         * @hide
+         */
+        // TODO: implement for all styles
+        protected void restoreFromCompatExtras(Bundle extras) {
+        }
+    }
+
+    /**
+     * Helper class for generating large-format notifications that include a large image attachment.
+     * <br>
+     * If the platform does not provide large-format notifications, this method has no effect. The
+     * user will always see the normal notification view.
+     * <br>
+     * This class is a "rebuilder": It attaches to a Builder object and modifies its behavior, like so:
+     * <pre class="prettyprint">
+     * Notification notif = new Notification.Builder(mContext)
+     *     .setContentTitle(&quot;New photo from &quot; + sender.toString())
+     *     .setContentText(subject)
+     *     .setSmallIcon(R.drawable.new_post)
+     *     .setLargeIcon(aBitmap)
+     *     .setStyle(new Notification.BigPictureStyle()
+     *         .bigPicture(aBigBitmap))
+     *     .build();
+     * </pre>
+     *
+     * @see Notification#bigContentView
+     */
+    public static class BigPictureStyle extends Style {
+        Bitmap mPicture;
+        Bitmap mBigLargeIcon;
+        boolean mBigLargeIconSet;
+
+        public BigPictureStyle() {
+        }
+
+        public BigPictureStyle(Builder builder) {
+            setBuilder(builder);
+        }
+
+        /**
+         * Overrides ContentTitle in the big form of the template.
+         * This defaults to the value passed to setContentTitle().
+         */
+        public BigPictureStyle setBigContentTitle(CharSequence title) {
+            mBigContentTitle = Builder.limitCharSequenceLength(title);
+            return this;
+        }
+
+        /**
+         * Set the first line of text after the detail section in the big form of the template.
+         */
+        public BigPictureStyle setSummaryText(CharSequence cs) {
+            mSummaryText = Builder.limitCharSequenceLength(cs);
+            mSummaryTextSet = true;
+            return this;
+        }
+
+        /**
+         * Provide the bitmap to be used as the payload for the BigPicture notification.
+         */
+        public BigPictureStyle bigPicture(Bitmap b) {
+            mPicture = b;
+            return this;
+        }
+
+        /**
+         * Override the large icon when the big notification is shown.
+         */
+        public BigPictureStyle bigLargeIcon(Bitmap b) {
+            mBigLargeIcon = b;
+            mBigLargeIconSet = true;
+            return this;
+        }
+    }
+
+    /**
+     * Helper class for generating large-format notifications that include a lot of text.
+     *
+     * <br>
+     * If the platform does not provide large-format notifications, this method has no effect. The
+     * user will always see the normal notification view.
+     * <br>
+     * This class is a "rebuilder": It attaches to a Builder object and modifies its behavior, like so:
+     * <pre class="prettyprint">
+     * Notification notif = new Notification.Builder(mContext)
+     *     .setContentTitle(&quot;New mail from &quot; + sender.toString())
+     *     .setContentText(subject)
+     *     .setSmallIcon(R.drawable.new_mail)
+     *     .setLargeIcon(aBitmap)
+     *     .setStyle(new Notification.BigTextStyle()
+     *         .bigText(aVeryLongString))
+     *     .build();
+     * </pre>
+     *
+     * @see Notification#bigContentView
+     */
+    public static class BigTextStyle extends Style {
+        CharSequence mBigText;
+
+        public BigTextStyle() {
+        }
+
+        public BigTextStyle(Builder builder) {
+            setBuilder(builder);
+        }
+
+        /**
+         * Overrides ContentTitle in the big form of the template.
+         * This defaults to the value passed to setContentTitle().
+         */
+        public BigTextStyle setBigContentTitle(CharSequence title) {
+            mBigContentTitle = Builder.limitCharSequenceLength(title);
+            return this;
+        }
+
+        /**
+         * Set the first line of text after the detail section in the big form of the template.
+         */
+        public BigTextStyle setSummaryText(CharSequence cs) {
+            mSummaryText = Builder.limitCharSequenceLength(cs);
+            mSummaryTextSet = true;
+            return this;
+        }
+
+        /**
+         * Provide the longer text to be displayed in the big form of the
+         * template in place of the content text.
+         */
+        public BigTextStyle bigText(CharSequence cs) {
+            mBigText = Builder.limitCharSequenceLength(cs);
+            return this;
+        }
+    }
+
+    /**
+     * Helper class for generating large-format notifications that include multiple back-and-forth
+     * messages of varying types between any number of people.
+     *
+     * <br>
+     * If the platform does not provide large-format notifications, this method has no effect. The
+     * user will always see the normal notification view.
+     * <br>
+     * This class is a "rebuilder": It attaches to a Builder object and modifies its behavior, like
+     * so:
+     * <pre class="prettyprint">
+     *
+     * Notification noti = new Notification.Builder()
+     *     .setContentTitle(&quot;2 new messages wtih &quot; + sender.toString())
+     *     .setContentText(subject)
+     *     .setSmallIcon(R.drawable.new_message)
+     *     .setLargeIcon(aBitmap)
+     *     .setStyle(new Notification.MessagingStyle(resources.getString(R.string.reply_name))
+     *         .addMessage(messages[0].getText(), messages[0].getTime(), messages[0].getSender())
+     *         .addMessage(messages[1].getText(), messages[1].getTime(), messages[1].getSender()))
+     *     .build();
+     * </pre>
+     */
+    public static class MessagingStyle extends Style {
+
+        /**
+         * The maximum number of messages that will be retained in the Notification itself (the
+         * number displayed is up to the platform).
+         */
+        public static final int MAXIMUM_RETAINED_MESSAGES = 25;
+
+        CharSequence mUserDisplayName;
+        CharSequence mConversationTitle;
+        List<Message> mMessages = new ArrayList<>();
+
+        MessagingStyle() {
+        }
+
+        /**
+         * @param userDisplayName the name to be displayed for any replies sent by the user before the
+         * posting app reposts the notification with those messages after they've been actually
+         * sent and in previous messages sent by the user added in
+         * {@link #addMessage(Message)}
+         */
+        public MessagingStyle(CharSequence userDisplayName) {
+            mUserDisplayName = userDisplayName;
+        }
+
+        /**
+         * Returns the name to be displayed for any replies sent by the user
+         */
+        public CharSequence getUserDisplayName() {
+            return mUserDisplayName;
+        }
+
+        /**
+         * Sets the title to be displayed on this conversation. This should only be used for
+         * group messaging and left unset for one-on-one conversations.
+         * @param conversationTitle
+         * @return this object for method chaining.
+         */
+        public MessagingStyle setConversationTitle(CharSequence conversationTitle) {
+            mConversationTitle = conversationTitle;
+            return this;
+        }
+
+        /**
+         * Return the title to be displayed on this conversation. Can be <code>null</code> and
+         * should be for one-on-one conversations
+         */
+        public CharSequence getConversationTitle() {
+            return mConversationTitle;
+        }
+
+        /**
+         * Adds a message for display by this notification. Convenience call for a simple
+         * {@link Message} in {@link #addMessage(Message)}
+         * @param text A {@link CharSequence} to be displayed as the message content
+         * @param timestamp Time at which the message arrived
+         * @param sender A {@link CharSequence} to be used for displaying the name of the
+         * sender. Should be <code>null</code> for messages by the current user, in which case
+         * the platform will insert {@link #getUserDisplayName()}.
+         * Should be unique amongst all individuals in the conversation, and should be
+         * consistent during re-posts of the notification.
+         *
+         * @see Message#Message(CharSequence, long, CharSequence)
+         *
+         * @return this object for method chaining
+         */
+        public MessagingStyle addMessage(CharSequence text, long timestamp, CharSequence sender) {
+            mMessages.add(new Message(text, timestamp, sender));
+            if (mMessages.size() > MAXIMUM_RETAINED_MESSAGES) {
+                mMessages.remove(0);
+            }
+            return this;
+        }
+
+        /**
+         * Adds a {@link Message} for display in this notification.
+         * @param message The {@link Message} to be displayed
+         * @return this object for method chaining
+         */
+        public MessagingStyle addMessage(Message message) {
+            mMessages.add(message);
+            if (mMessages.size() > MAXIMUM_RETAINED_MESSAGES) {
+                mMessages.remove(0);
+            }
+            return this;
+        }
+
+        /**
+         * Gets the list of {@code Message} objects that represent the notification
+         */
+        public List<Message> getMessages() {
+            return mMessages;
+        }
+
+        /**
+         * Retrieves a {@link MessagingStyle} from a {@link Notification}, enabling an application
+         * that has set a {@link MessagingStyle} using {@link NotificationCompat} or
+         * {@link android.app.Notification.Builder} to send messaging information to another
+         * application using {@link NotificationCompat}, regardless of the API level of the system.
+         * Returns {@code null} if there is no {@link MessagingStyle} set.
+         */
+        public static MessagingStyle extractMessagingStyleFromNotification(Notification notif) {
+            MessagingStyle style;
+            Bundle extras = IMPL.getExtras(notif);
+            if (!extras.containsKey(EXTRA_SELF_DISPLAY_NAME)) {
+                style = null;
+            } else {
+                try {
+                    style = new MessagingStyle();
+                    style.restoreFromCompatExtras(extras);
+                } catch (ClassCastException e) {
+                    style = null;
+                }
+            }
+            return style;
+        }
+
+        @Override
+        public void addCompatExtras(Bundle extras) {
+            super.addCompatExtras(extras);
+            if (mUserDisplayName != null) {
+                extras.putCharSequence(EXTRA_SELF_DISPLAY_NAME, mUserDisplayName);
+            }
+            if (mConversationTitle != null) {
+                extras.putCharSequence(EXTRA_CONVERSATION_TITLE, mConversationTitle);
+            }
+            if (!mMessages.isEmpty()) { extras.putParcelableArray(EXTRA_MESSAGES,
+                    Message.getBundleArrayForMessages(mMessages));
+            }
+        }
+
+        /**
+         * @hide
+         */
+        @Override
+        protected void restoreFromCompatExtras(Bundle extras) {
+            mMessages.clear();
+            mUserDisplayName = extras.getString(EXTRA_SELF_DISPLAY_NAME);
+            mConversationTitle = extras.getString(EXTRA_CONVERSATION_TITLE);
+            Parcelable[] parcelables = extras.getParcelableArray(EXTRA_MESSAGES);
+            if (parcelables != null) {
+                mMessages = Message.getMessagesFromBundleArray(parcelables);
+            }
+        }
+
+        public static final class Message {
+
+            static final String KEY_TEXT = "text";
+            static final String KEY_TIMESTAMP = "time";
+            static final String KEY_SENDER = "sender";
+            static final String KEY_DATA_MIME_TYPE = "type";
+            static final String KEY_DATA_URI= "uri";
+
+            private final CharSequence mText;
+            private final long mTimestamp;
+            private final CharSequence mSender;
+
+            private String mDataMimeType;
+            private Uri mDataUri;
+
+            /**
+             * Constructor
+             * @param text A {@link CharSequence} to be displayed as the message content
+             * @param timestamp Time at which the message arrived
+             * @param sender A {@link CharSequence} to be used for displaying the name of the
+             * sender. Should be <code>null</code> for messages by the current user, in which case
+             * the platform will insert {@link MessagingStyle#getUserDisplayName()}.
+             * Should be unique amongst all individuals in the conversation, and should be
+             * consistent during re-posts of the notification.
+             */
+            public Message(CharSequence text, long timestamp, CharSequence sender){
+                mText = text;
+                mTimestamp = timestamp;
+                mSender = sender;
+            }
+
+            /**
+             * Sets a binary blob of data and an associated MIME type for a message. In the case
+             * where the platform doesn't support the MIME type, the original text provided in the
+             * constructor will be used.
+             * @param dataMimeType The MIME type of the content. See
+             * <a href="{@docRoot}notifications/messaging.html"> for the list of supported MIME
+             * types on Android and Android Wear.
+             * @param dataUri The uri containing the content whose type is given by the MIME type.
+             * <p class="note">
+             * <ol>
+             *   <li>Notification Listeners including the System UI need permission to access the
+             *       data the Uri points to. The recommended ways to do this are:</li>
+             *   <li>Store the data in your own ContentProvider, making sure that other apps have
+             *       the correct permission to access your provider. The preferred mechanism for
+             *       providing access is to use per-URI permissions which are temporary and only
+             *       grant access to the receiving application. An easy way to create a
+             *       ContentProvider like this is to use the FileProvider helper class.</li>
+             *   <li>Use the system MediaStore. The MediaStore is primarily aimed at video, audio
+             *       and image MIME types, however beginning with Android 3.0 (API level 11) it can
+             *       also store non-media types (see MediaStore.Files for more info). Files can be
+             *       inserted into the MediaStore using scanFile() after which a content:// style
+             *       Uri suitable for sharing is passed to the provided onScanCompleted() callback.
+             *       Note that once added to the system MediaStore the content is accessible to any
+             *       app on the device.</li>
+             * </ol>
+             * @return this object for method chaining
+             */
+            public Message setData(String dataMimeType, Uri dataUri) {
+                mDataMimeType = dataMimeType;
+                mDataUri = dataUri;
+                return this;
+            }
+
+            /**
+             * Get the text to be used for this message, or the fallback text if a type and content
+             * Uri have been set
+             */
+            public CharSequence getText() {
+                return mText;
+            }
+
+            /**
+             * Get the time at which this message arrived
+             */
+            public long getTimestamp() {
+                return mTimestamp;
+            }
+
+            /**
+             * Get the text used to display the contact's name in the messaging experience
+             */
+            public CharSequence getSender() {
+                return mSender;
+            }
+
+            /**
+             * Get the MIME type of the data pointed to by the Uri
+             */
+            public String getDataMimeType() {
+                return mDataMimeType;
+            }
+
+            /**
+             * Get the the Uri pointing to the content of the message. Can be null, in which case
+             * {@see #getText()} is used.
+             */
+            public Uri getDataUri() {
+                return mDataUri;
+            }
+
+            private Bundle toBundle() {
+                Bundle bundle = new Bundle();
+                if (mText != null) {
+                    bundle.putCharSequence(KEY_TEXT, mText);
+                }
+                bundle.putLong(KEY_TIMESTAMP, mTimestamp);
+                if (mSender != null) {
+                    bundle.putCharSequence(KEY_SENDER, mSender);
+                }
+                if (mDataMimeType != null) {
+                    bundle.putString(KEY_DATA_MIME_TYPE, mDataMimeType);
+                }
+                if (mDataUri != null) {
+                    bundle.putParcelable(KEY_DATA_URI, mDataUri);
+                }
+                return bundle;
+            }
+
+            static Bundle[] getBundleArrayForMessages(List<Message> messages) {
+                Bundle[] bundles = new Bundle[messages.size()];
+                final int N = messages.size();
+                for (int i = 0; i < N; i++) {
+                    bundles[i] = messages.get(i).toBundle();
+                }
+                return bundles;
+            }
+
+            static List<Message> getMessagesFromBundleArray(Parcelable[] bundles) {
+                List<Message> messages = new ArrayList<>(bundles.length);
+                for (int i = 0; i < bundles.length; i++) {
+                    if (bundles[i] instanceof Bundle) {
+                        Message message = getMessageFromBundle((Bundle)bundles[i]);
+                        if (message != null) {
+                            messages.add(message);
+                        }
+                    }
+                }
+                return messages;
+            }
+
+            static Message getMessageFromBundle(Bundle bundle) {
+                try {
+                    if (!bundle.containsKey(KEY_TEXT) || !bundle.containsKey(KEY_TIMESTAMP)) {
+                        return null;
+                    } else {
+                        Message message = new Message(bundle.getCharSequence(KEY_TEXT),
+                                bundle.getLong(KEY_TIMESTAMP), bundle.getCharSequence(KEY_SENDER));
+                        if (bundle.containsKey(KEY_DATA_MIME_TYPE) &&
+                                bundle.containsKey(KEY_DATA_URI)) {
+
+                            message.setData(bundle.getString(KEY_DATA_MIME_TYPE),
+                                    (Uri) bundle.getParcelable(KEY_DATA_URI));
+                        }
+                        return message;
+                    }
+                } catch (ClassCastException e) {
+                    return null;
+                }
+            }
+        }
+    }
+
+    /**
+     * Helper class for generating large-format notifications that include a list of (up to 5) strings.
+     *
+     * <br>
+     * If the platform does not provide large-format notifications, this method has no effect. The
+     * user will always see the normal notification view.
+     * <br>
+     * This class is a "rebuilder": It attaches to a Builder object and modifies its behavior, like so:
+     * <pre class="prettyprint">
+     * Notification noti = new Notification.Builder()
+     *     .setContentTitle(&quot;5 New mails from &quot; + sender.toString())
+     *     .setContentText(subject)
+     *     .setSmallIcon(R.drawable.new_mail)
+     *     .setLargeIcon(aBitmap)
+     *     .setStyle(new Notification.InboxStyle()
+     *         .addLine(str1)
+     *         .addLine(str2)
+     *         .setContentTitle(&quot;&quot;)
+     *         .setSummaryText(&quot;+3 more&quot;))
+     *     .build();
+     * </pre>
+     *
+     * @see Notification#bigContentView
+     */
+    public static class InboxStyle extends Style {
+        ArrayList<CharSequence> mTexts = new ArrayList<CharSequence>();
+
+        public InboxStyle() {
+        }
+
+        public InboxStyle(Builder builder) {
+            setBuilder(builder);
+        }
+
+        /**
+         * Overrides ContentTitle in the big form of the template.
+         * This defaults to the value passed to setContentTitle().
+         */
+        public InboxStyle setBigContentTitle(CharSequence title) {
+            mBigContentTitle = Builder.limitCharSequenceLength(title);
+            return this;
+        }
+
+        /**
+         * Set the first line of text after the detail section in the big form of the template.
+         */
+        public InboxStyle setSummaryText(CharSequence cs) {
+            mSummaryText = Builder.limitCharSequenceLength(cs);
+            mSummaryTextSet = true;
+            return this;
+        }
+
+        /**
+         * Append a line to the digest section of the Inbox notification.
+         */
+        public InboxStyle addLine(CharSequence cs) {
+            mTexts.add(Builder.limitCharSequenceLength(cs));
+            return this;
+        }
+    }
+
+    /**
+     * Structure to encapsulate a named action that can be shown as part of this notification.
+     * It must include an icon, a label, and a {@link PendingIntent} to be fired when the action is
+     * selected by the user. Action buttons won't appear on platforms prior to Android 4.1.
+     * <p>
+     * Apps should use {@link NotificationCompat.Builder#addAction(int, CharSequence, PendingIntent)}
+     * or {@link NotificationCompat.Builder#addAction(NotificationCompat.Action)}
+     * to attach actions.
+     */
+    public static class Action extends NotificationCompatBase.Action {
+        private final Bundle mExtras;
+        private final RemoteInput[] mRemoteInputs;
+        private boolean mAllowGeneratedReplies = false;
+
+        /**
+         * Small icon representing the action.
+         */
+        public int icon;
+        /**
+         * Title of the action.
+         */
+        public CharSequence title;
+        /**
+         * Intent to send when the user invokes this action. May be null, in which case the action
+         * may be rendered in a disabled presentation.
+         */
+        public PendingIntent actionIntent;
+
+        public Action(int icon, CharSequence title, PendingIntent intent) {
+            this(icon, title, intent, new Bundle(), null, false);
+        }
+
+        private Action(int icon, CharSequence title, PendingIntent intent, Bundle extras,
+                RemoteInput[] remoteInputs, boolean allowGeneratedReplies) {
+            this.icon = icon;
+            this.title = NotificationCompat.Builder.limitCharSequenceLength(title);
+            this.actionIntent = intent;
+            this.mExtras = extras != null ? extras : new Bundle();
+            this.mRemoteInputs = remoteInputs;
+            this.mAllowGeneratedReplies = allowGeneratedReplies;
+        }
+
+        @Override
+        public int getIcon() {
+            return icon;
+        }
+
+        @Override
+        public CharSequence getTitle() {
+            return title;
+        }
+
+        @Override
+        public PendingIntent getActionIntent() {
+            return actionIntent;
+        }
+
+        /**
+         * Get additional metadata carried around with this Action.
+         */
+        @Override
+        public Bundle getExtras() {
+            return mExtras;
+        }
+
+        /**
+         * Return whether the platform should automatically generate possible replies for this
+         * {@link Action}
+         */
+        @Override
+        public boolean getAllowGeneratedReplies() {
+            return mAllowGeneratedReplies;
+        }
+
+        /**
+         * Get the list of inputs to be collected from the user when this action is sent.
+         * May return null if no remote inputs were added.
+         */
+        @Override
+        public RemoteInput[] getRemoteInputs() {
+            return mRemoteInputs;
+        }
+
+        /**
+         * Builder class for {@link Action} objects.
+         */
+        public static final class Builder {
+            private final int mIcon;
+            private final CharSequence mTitle;
+            private final PendingIntent mIntent;
+            private boolean mAllowGeneratedReplies;
+            private final Bundle mExtras;
+            private ArrayList<RemoteInput> mRemoteInputs;
+
+            /**
+             * Construct a new builder for {@link Action} object.
+             * @param icon icon to show for this action
+             * @param title the title of the action
+             * @param intent the {@link PendingIntent} to fire when users trigger this action
+             */
+            public Builder(int icon, CharSequence title, PendingIntent intent) {
+                this(icon, title, intent, new Bundle());
+            }
+
+            /**
+             * Construct a new builder for {@link Action} object using the fields from an
+             * {@link Action}.
+             * @param action the action to read fields from.
+             */
+            public Builder(Action action) {
+                this(action.icon, action.title, action.actionIntent, new Bundle(action.mExtras));
+            }
+
+            private Builder(int icon, CharSequence title, PendingIntent intent, Bundle extras) {
+                mIcon = icon;
+                mTitle = NotificationCompat.Builder.limitCharSequenceLength(title);
+                mIntent = intent;
+                mExtras = extras;
+            }
+
+            /**
+             * Merge additional metadata into this builder.
+             *
+             * <p>Values within the Bundle will replace existing extras values in this Builder.
+             *
+             * @see NotificationCompat.Action#getExtras
+             */
+            public Builder addExtras(Bundle extras) {
+                if (extras != null) {
+                    mExtras.putAll(extras);
+                }
+                return this;
+            }
+
+            /**
+             * Get the metadata Bundle used by this Builder.
+             *
+             * <p>The returned Bundle is shared with this Builder.
+             */
+            public Bundle getExtras() {
+                return mExtras;
+            }
+
+            /**
+             * Add an input to be collected from the user when this action is sent.
+             * Response values can be retrieved from the fired intent by using the
+             * {@link RemoteInput#getResultsFromIntent} function.
+             * @param remoteInput a {@link RemoteInput} to add to the action
+             * @return this object for method chaining
+             */
+            public Builder addRemoteInput(RemoteInput remoteInput) {
+                if (mRemoteInputs == null) {
+                    mRemoteInputs = new ArrayList<RemoteInput>();
+                }
+                mRemoteInputs.add(remoteInput);
+                return this;
+            }
+
+            /**
+             * Set whether the platform should automatically generate possible replies to add to
+             * {@link RemoteInput#getChoices()}. If the {@link Action} doesn't have a
+             * {@link RemoteInput}, this has no effect.
+             * @param allowGeneratedReplies {@code true} to allow generated replies, {@code false}
+             * otherwise
+             * @return this object for method chaining
+             * The default value is {@code false}
+             */
+            public Builder setAllowGeneratedReplies(boolean allowGeneratedReplies) {
+                mAllowGeneratedReplies = allowGeneratedReplies;
+                return this;
+            }
+
+            /**
+             * Apply an extender to this action builder. Extenders may be used to add
+             * metadata or change options on this builder.
+             */
+            public Builder extend(Extender extender) {
+                extender.extend(this);
+                return this;
+            }
+
+            /**
+             * Combine all of the options that have been set and return a new {@link Action}
+             * object.
+             * @return the built action
+             */
+            public Action build() {
+                RemoteInput[] remoteInputs = mRemoteInputs != null
+                        ? mRemoteInputs.toArray(new RemoteInput[mRemoteInputs.size()]) : null;
+                return new Action(mIcon, mTitle, mIntent, mExtras, remoteInputs,
+                        mAllowGeneratedReplies);
+            }
+        }
+
+
+        /**
+         * Extender interface for use with {@link Builder#extend}. Extenders may be used to add
+         * metadata or change options on an action builder.
+         */
+        public interface Extender {
+            /**
+             * Apply this extender to a notification action builder.
+             * @param builder the builder to be modified.
+             * @return the build object for chaining.
+             */
+            public Builder extend(Builder builder);
+        }
+
+        /**
+         * Wearable extender for notification actions. To add extensions to an action,
+         * create a new {@link NotificationCompat.Action.WearableExtender} object using
+         * the {@code WearableExtender()} constructor and apply it to a
+         * {@link NotificationCompat.Action.Builder} using
+         * {@link NotificationCompat.Action.Builder#extend}.
+         *
+         * <pre class="prettyprint">
+         * NotificationCompat.Action action = new NotificationCompat.Action.Builder(
+         *         R.drawable.archive_all, "Archive all", actionIntent)
+         *         .extend(new NotificationCompat.Action.WearableExtender()
+         *                 .setAvailableOffline(false))
+         *         .build();</pre>
+         */
+        public static final class WearableExtender implements Extender {
+            /** Notification action extra which contains wearable extensions */
+            private static final String EXTRA_WEARABLE_EXTENSIONS = "android.wearable.EXTENSIONS";
+
+            // Keys within EXTRA_WEARABLE_EXTENSIONS for wearable options.
+            private static final String KEY_FLAGS = "flags";
+            private static final String KEY_IN_PROGRESS_LABEL = "inProgressLabel";
+            private static final String KEY_CONFIRM_LABEL = "confirmLabel";
+            private static final String KEY_CANCEL_LABEL = "cancelLabel";
+
+            // Flags bitwise-ored to mFlags
+            private static final int FLAG_AVAILABLE_OFFLINE = 0x1;
+            private static final int FLAG_HINT_LAUNCHES_ACTIVITY = 1 << 1;
+
+            // Default value for flags integer
+            private static final int DEFAULT_FLAGS = FLAG_AVAILABLE_OFFLINE;
+
+            private int mFlags = DEFAULT_FLAGS;
+
+            private CharSequence mInProgressLabel;
+            private CharSequence mConfirmLabel;
+            private CharSequence mCancelLabel;
+
+            /**
+             * Create a {@link NotificationCompat.Action.WearableExtender} with default
+             * options.
+             */
+            public WearableExtender() {
+            }
+
+            /**
+             * Create a {@link NotificationCompat.Action.WearableExtender} by reading
+             * wearable options present in an existing notification action.
+             * @param action the notification action to inspect.
+             */
+            public WearableExtender(Action action) {
+                Bundle wearableBundle = action.getExtras().getBundle(EXTRA_WEARABLE_EXTENSIONS);
+                if (wearableBundle != null) {
+                    mFlags = wearableBundle.getInt(KEY_FLAGS, DEFAULT_FLAGS);
+                    mInProgressLabel = wearableBundle.getCharSequence(KEY_IN_PROGRESS_LABEL);
+                    mConfirmLabel = wearableBundle.getCharSequence(KEY_CONFIRM_LABEL);
+                    mCancelLabel = wearableBundle.getCharSequence(KEY_CANCEL_LABEL);
+                }
+            }
+
+            /**
+             * Apply wearable extensions to a notification action that is being built. This is
+             * typically called by the {@link NotificationCompat.Action.Builder#extend}
+             * method of {@link NotificationCompat.Action.Builder}.
+             */
+            @Override
+            public Action.Builder extend(Action.Builder builder) {
+                Bundle wearableBundle = new Bundle();
+
+                if (mFlags != DEFAULT_FLAGS) {
+                    wearableBundle.putInt(KEY_FLAGS, mFlags);
+                }
+                if (mInProgressLabel != null) {
+                    wearableBundle.putCharSequence(KEY_IN_PROGRESS_LABEL, mInProgressLabel);
+                }
+                if (mConfirmLabel != null) {
+                    wearableBundle.putCharSequence(KEY_CONFIRM_LABEL, mConfirmLabel);
+                }
+                if (mCancelLabel != null) {
+                    wearableBundle.putCharSequence(KEY_CANCEL_LABEL, mCancelLabel);
+                }
+
+                builder.getExtras().putBundle(EXTRA_WEARABLE_EXTENSIONS, wearableBundle);
+                return builder;
+            }
+
+            @Override
+            public WearableExtender clone() {
+                WearableExtender that = new WearableExtender();
+                that.mFlags = this.mFlags;
+                that.mInProgressLabel = this.mInProgressLabel;
+                that.mConfirmLabel = this.mConfirmLabel;
+                that.mCancelLabel = this.mCancelLabel;
+                return that;
+            }
+
+            /**
+             * Set whether this action is available when the wearable device is not connected to
+             * a companion device. The user can still trigger this action when the wearable device
+             * is offline, but a visual hint will indicate that the action may not be available.
+             * Defaults to true.
+             */
+            public WearableExtender setAvailableOffline(boolean availableOffline) {
+                setFlag(FLAG_AVAILABLE_OFFLINE, availableOffline);
+                return this;
+            }
+
+            /**
+             * Get whether this action is available when the wearable device is not connected to
+             * a companion device. The user can still trigger this action when the wearable device
+             * is offline, but a visual hint will indicate that the action may not be available.
+             * Defaults to true.
+             */
+            public boolean isAvailableOffline() {
+                return (mFlags & FLAG_AVAILABLE_OFFLINE) != 0;
+            }
+
+            private void setFlag(int mask, boolean value) {
+                if (value) {
+                    mFlags |= mask;
+                } else {
+                    mFlags &= ~mask;
+                }
+            }
+
+            /**
+             * Set a label to display while the wearable is preparing to automatically execute the
+             * action. This is usually a 'ing' verb ending in ellipsis like "Sending..."
+             *
+             * @param label the label to display while the action is being prepared to execute
+             * @return this object for method chaining
+             */
+            public WearableExtender setInProgressLabel(CharSequence label) {
+                mInProgressLabel = label;
+                return this;
+            }
+
+            /**
+             * Get the label to display while the wearable is preparing to automatically execute
+             * the action. This is usually a 'ing' verb ending in ellipsis like "Sending..."
+             *
+             * @return the label to display while the action is being prepared to execute
+             */
+            public CharSequence getInProgressLabel() {
+                return mInProgressLabel;
+            }
+
+            /**
+             * Set a label to display to confirm that the action should be executed.
+             * This is usually an imperative verb like "Send".
+             *
+             * @param label the label to confirm the action should be executed
+             * @return this object for method chaining
+             */
+            public WearableExtender setConfirmLabel(CharSequence label) {
+                mConfirmLabel = label;
+                return this;
+            }
+
+            /**
+             * Get the label to display to confirm that the action should be executed.
+             * This is usually an imperative verb like "Send".
+             *
+             * @return the label to confirm the action should be executed
+             */
+            public CharSequence getConfirmLabel() {
+                return mConfirmLabel;
+            }
+
+            /**
+             * Set a label to display to cancel the action.
+             * This is usually an imperative verb, like "Cancel".
+             *
+             * @param label the label to display to cancel the action
+             * @return this object for method chaining
+             */
+            public WearableExtender setCancelLabel(CharSequence label) {
+                mCancelLabel = label;
+                return this;
+            }
+
+            /**
+             * Get the label to display to cancel the action.
+             * This is usually an imperative verb like "Cancel".
+             *
+             * @return the label to display to cancel the action
+             */
+            public CharSequence getCancelLabel() {
+                return mCancelLabel;
+            }
+
+            /**
+             * Set a hint that this Action will launch an {@link Activity} directly, telling the
+             * platform that it can generate the appropriate transitions.
+             * @param hintLaunchesActivity {@code true} if the content intent will launch
+             * an activity and transitions should be generated, false otherwise.
+             * @return this object for method chaining
+             */
+            public WearableExtender setHintLaunchesActivity(
+                    boolean hintLaunchesActivity) {
+                setFlag(FLAG_HINT_LAUNCHES_ACTIVITY, hintLaunchesActivity);
+                return this;
+            }
+
+            /**
+             * Get a hint that this Action will launch an {@link Activity} directly, telling the
+             * platform that it can generate the appropriate transitions
+             * @return {@code true} if the content intent will launch an activity and transitions
+             * should be generated, false otherwise. The default value is {@code false} if this was
+             * never set.
+             */
+            public boolean getHintLaunchesActivity() {
+                return (mFlags & FLAG_HINT_LAUNCHES_ACTIVITY) != 0;
+            }
+        }
+
+        /** @hide */
+        public static final Factory FACTORY = new Factory() {
+            @Override
+            public NotificationCompatBase.Action build(int icon, CharSequence title,
+                    PendingIntent actionIntent, Bundle extras,
+                    RemoteInputCompatBase.RemoteInput[] remoteInputs,
+                    boolean allowGeneratedReplies) {
+                return new Action(icon, title, actionIntent, extras,
+                        (RemoteInput[]) remoteInputs, allowGeneratedReplies);
+            }
+
+            @Override
+            public Action[] newArray(int length) {
+                return new Action[length];
+            }
+        };
+    }
+
+
+    /**
+     * Extender interface for use with {@link Builder#extend}. Extenders may be used to add
+     * metadata or change options on a notification builder.
+     */
+    public interface Extender {
+        /**
+         * Apply this extender to a notification builder.
+         * @param builder the builder to be modified.
+         * @return the build object for chaining.
+         */
+        public Builder extend(Builder builder);
+    }
+
+    /**
+     * Helper class to add wearable extensions to notifications.
+     * <p class="note"> See
+     * <a href="{@docRoot}wear/notifications/creating.html">Creating Notifications
+     * for Android Wear</a> for more information on how to use this class.
+     * <p>
+     * To create a notification with wearable extensions:
+     * <ol>
+     *   <li>Create a {@link NotificationCompat.Builder}, setting any desired
+     *   properties.
+     *   <li>Create a {@link NotificationCompat.WearableExtender}.
+     *   <li>Set wearable-specific properties using the
+     *   {@code add} and {@code set} methods of {@link NotificationCompat.WearableExtender}.
+     *   <li>Call {@link NotificationCompat.Builder#extend} to apply the extensions to a
+     *   notification.
+     *   <li>Post the notification to the notification
+     *   system with the {@code NotificationManagerCompat.notify(...)} methods
+     *   and not the {@code NotificationManager.notify(...)} methods.
+     * </ol>
+     *
+     * <pre class="prettyprint">
+     * Notification notif = new NotificationCompat.Builder(mContext)
+     *         .setContentTitle(&quot;New mail from &quot; + sender.toString())
+     *         .setContentText(subject)
+     *         .setSmallIcon(R.drawable.new_mail)
+     *         .extend(new NotificationCompat.WearableExtender()
+     *                 .setContentIcon(R.drawable.new_mail))
+     *         .build();
+     * NotificationManagerCompat.from(mContext).notify(0, notif);</pre>
+     *
+     * <p>Wearable extensions can be accessed on an existing notification by using the
+     * {@code WearableExtender(Notification)} constructor,
+     * and then using the {@code get} methods to access values.
+     *
+     * <pre class="prettyprint">
+     * NotificationCompat.WearableExtender wearableExtender =
+     *         new NotificationCompat.WearableExtender(notification);
+     * List&lt;Notification&gt; pages = wearableExtender.getPages();</pre>
+     */
+    public static final class WearableExtender implements Extender {
+        /**
+         * Sentinel value for an action index that is unset.
+         */
+        public static final int UNSET_ACTION_INDEX = -1;
+
+        /**
+         * Size value for use with {@link #setCustomSizePreset} to show this notification with
+         * default sizing.
+         * <p>For custom display notifications created using {@link #setDisplayIntent},
+         * the default is {@link #SIZE_MEDIUM}. All other notifications size automatically based
+         * on their content.
+         */
+        public static final int SIZE_DEFAULT = 0;
+
+        /**
+         * Size value for use with {@link #setCustomSizePreset} to show this notification
+         * with an extra small size.
+         * <p>This value is only applicable for custom display notifications created using
+         * {@link #setDisplayIntent}.
+         */
+        public static final int SIZE_XSMALL = 1;
+
+        /**
+         * Size value for use with {@link #setCustomSizePreset} to show this notification
+         * with a small size.
+         * <p>This value is only applicable for custom display notifications created using
+         * {@link #setDisplayIntent}.
+         */
+        public static final int SIZE_SMALL = 2;
+
+        /**
+         * Size value for use with {@link #setCustomSizePreset} to show this notification
+         * with a medium size.
+         * <p>This value is only applicable for custom display notifications created using
+         * {@link #setDisplayIntent}.
+         */
+        public static final int SIZE_MEDIUM = 3;
+
+        /**
+         * Size value for use with {@link #setCustomSizePreset} to show this notification
+         * with a large size.
+         * <p>This value is only applicable for custom display notifications created using
+         * {@link #setDisplayIntent}.
+         */
+        public static final int SIZE_LARGE = 4;
+
+        /**
+         * Size value for use with {@link #setCustomSizePreset} to show this notification
+         * full screen.
+         * <p>This value is only applicable for custom display notifications created using
+         * {@link #setDisplayIntent}.
+         */
+        public static final int SIZE_FULL_SCREEN = 5;
+
+        /**
+         * Sentinel value for use with {@link #setHintScreenTimeout} to keep the screen on for a
+         * short amount of time when this notification is displayed on the screen. This
+         * is the default value.
+         */
+        public static final int SCREEN_TIMEOUT_SHORT = 0;
+
+        /**
+         * Sentinel value for use with {@link #setHintScreenTimeout} to keep the screen on
+         * for a longer amount of time when this notification is displayed on the screen.
+         */
+        public static final int SCREEN_TIMEOUT_LONG = -1;
+
+        /** Notification extra which contains wearable extensions */
+        private static final String EXTRA_WEARABLE_EXTENSIONS = "android.wearable.EXTENSIONS";
+
+        // Keys within EXTRA_WEARABLE_EXTENSIONS for wearable options.
+        private static final String KEY_ACTIONS = "actions";
+        private static final String KEY_FLAGS = "flags";
+        private static final String KEY_DISPLAY_INTENT = "displayIntent";
+        private static final String KEY_PAGES = "pages";
+        private static final String KEY_BACKGROUND = "background";
+        private static final String KEY_CONTENT_ICON = "contentIcon";
+        private static final String KEY_CONTENT_ICON_GRAVITY = "contentIconGravity";
+        private static final String KEY_CONTENT_ACTION_INDEX = "contentActionIndex";
+        private static final String KEY_CUSTOM_SIZE_PRESET = "customSizePreset";
+        private static final String KEY_CUSTOM_CONTENT_HEIGHT = "customContentHeight";
+        private static final String KEY_GRAVITY = "gravity";
+        private static final String KEY_HINT_SCREEN_TIMEOUT = "hintScreenTimeout";
+        private static final String KEY_DISMISSAL_ID = "dismissalId";
+
+        // Flags bitwise-ored to mFlags
+        private static final int FLAG_CONTENT_INTENT_AVAILABLE_OFFLINE = 0x1;
+        private static final int FLAG_HINT_HIDE_ICON = 1 << 1;
+        private static final int FLAG_HINT_SHOW_BACKGROUND_ONLY = 1 << 2;
+        private static final int FLAG_START_SCROLL_BOTTOM = 1 << 3;
+        private static final int FLAG_HINT_AVOID_BACKGROUND_CLIPPING = 1 << 4;
+        private static final int FLAG_BIG_PICTURE_AMBIENT = 1 << 5;
+        private static final int FLAG_HINT_CONTENT_INTENT_LAUNCHES_ACTIVITY = 1 << 6;
+
+        // Default value for flags integer
+        private static final int DEFAULT_FLAGS = FLAG_CONTENT_INTENT_AVAILABLE_OFFLINE;
+
+        private static final int DEFAULT_CONTENT_ICON_GRAVITY = GravityCompat.END;
+        private static final int DEFAULT_GRAVITY = Gravity.BOTTOM;
+
+        private ArrayList<Action> mActions = new ArrayList<Action>();
+        private int mFlags = DEFAULT_FLAGS;
+        private PendingIntent mDisplayIntent;
+        private ArrayList<Notification> mPages = new ArrayList<Notification>();
+        private Bitmap mBackground;
+        private int mContentIcon;
+        private int mContentIconGravity = DEFAULT_CONTENT_ICON_GRAVITY;
+        private int mContentActionIndex = UNSET_ACTION_INDEX;
+        private int mCustomSizePreset = SIZE_DEFAULT;
+        private int mCustomContentHeight;
+        private int mGravity = DEFAULT_GRAVITY;
+        private int mHintScreenTimeout;
+        private String mDismissalId;
+
+        /**
+         * Create a {@link NotificationCompat.WearableExtender} with default
+         * options.
+         */
+        public WearableExtender() {
+        }
+
+        public WearableExtender(Notification notif) {
+            Bundle extras = getExtras(notif);
+            Bundle wearableBundle = extras != null ? extras.getBundle(EXTRA_WEARABLE_EXTENSIONS)
+                    : null;
+            if (wearableBundle != null) {
+                Action[] actions = IMPL.getActionsFromParcelableArrayList(
+                        wearableBundle.getParcelableArrayList(KEY_ACTIONS));
+                if (actions != null) {
+                    Collections.addAll(mActions, actions);
+                }
+
+                mFlags = wearableBundle.getInt(KEY_FLAGS, DEFAULT_FLAGS);
+                mDisplayIntent = wearableBundle.getParcelable(KEY_DISPLAY_INTENT);
+
+                Notification[] pages = getNotificationArrayFromBundle(
+                        wearableBundle, KEY_PAGES);
+                if (pages != null) {
+                    Collections.addAll(mPages, pages);
+                }
+
+                mBackground = wearableBundle.getParcelable(KEY_BACKGROUND);
+                mContentIcon = wearableBundle.getInt(KEY_CONTENT_ICON);
+                mContentIconGravity = wearableBundle.getInt(KEY_CONTENT_ICON_GRAVITY,
+                        DEFAULT_CONTENT_ICON_GRAVITY);
+                mContentActionIndex = wearableBundle.getInt(KEY_CONTENT_ACTION_INDEX,
+                        UNSET_ACTION_INDEX);
+                mCustomSizePreset = wearableBundle.getInt(KEY_CUSTOM_SIZE_PRESET,
+                        SIZE_DEFAULT);
+                mCustomContentHeight = wearableBundle.getInt(KEY_CUSTOM_CONTENT_HEIGHT);
+                mGravity = wearableBundle.getInt(KEY_GRAVITY, DEFAULT_GRAVITY);
+                mHintScreenTimeout = wearableBundle.getInt(KEY_HINT_SCREEN_TIMEOUT);
+                mDismissalId = wearableBundle.getString(KEY_DISMISSAL_ID);
+            }
+        }
+
+        /**
+         * Apply wearable extensions to a notification that is being built. This is typically
+         * called by the {@link NotificationCompat.Builder#extend} method of
+         * {@link NotificationCompat.Builder}.
+         */
+        @Override
+        public NotificationCompat.Builder extend(NotificationCompat.Builder builder) {
+            Bundle wearableBundle = new Bundle();
+
+            if (!mActions.isEmpty()) {
+                wearableBundle.putParcelableArrayList(KEY_ACTIONS,
+                        IMPL.getParcelableArrayListForActions(mActions.toArray(
+                                new Action[mActions.size()])));
+            }
+            if (mFlags != DEFAULT_FLAGS) {
+                wearableBundle.putInt(KEY_FLAGS, mFlags);
+            }
+            if (mDisplayIntent != null) {
+                wearableBundle.putParcelable(KEY_DISPLAY_INTENT, mDisplayIntent);
+            }
+            if (!mPages.isEmpty()) {
+                wearableBundle.putParcelableArray(KEY_PAGES, mPages.toArray(
+                        new Notification[mPages.size()]));
+            }
+            if (mBackground != null) {
+                wearableBundle.putParcelable(KEY_BACKGROUND, mBackground);
+            }
+            if (mContentIcon != 0) {
+                wearableBundle.putInt(KEY_CONTENT_ICON, mContentIcon);
+            }
+            if (mContentIconGravity != DEFAULT_CONTENT_ICON_GRAVITY) {
+                wearableBundle.putInt(KEY_CONTENT_ICON_GRAVITY, mContentIconGravity);
+            }
+            if (mContentActionIndex != UNSET_ACTION_INDEX) {
+                wearableBundle.putInt(KEY_CONTENT_ACTION_INDEX,
+                        mContentActionIndex);
+            }
+            if (mCustomSizePreset != SIZE_DEFAULT) {
+                wearableBundle.putInt(KEY_CUSTOM_SIZE_PRESET, mCustomSizePreset);
+            }
+            if (mCustomContentHeight != 0) {
+                wearableBundle.putInt(KEY_CUSTOM_CONTENT_HEIGHT, mCustomContentHeight);
+            }
+            if (mGravity != DEFAULT_GRAVITY) {
+                wearableBundle.putInt(KEY_GRAVITY, mGravity);
+            }
+            if (mHintScreenTimeout != 0) {
+                wearableBundle.putInt(KEY_HINT_SCREEN_TIMEOUT, mHintScreenTimeout);
+            }
+            if (mDismissalId != null) {
+                wearableBundle.putString(KEY_DISMISSAL_ID, mDismissalId);
+            }
+
+            builder.getExtras().putBundle(EXTRA_WEARABLE_EXTENSIONS, wearableBundle);
+            return builder;
+        }
+
+        @Override
+        public WearableExtender clone() {
+            WearableExtender that = new WearableExtender();
+            that.mActions = new ArrayList<Action>(this.mActions);
+            that.mFlags = this.mFlags;
+            that.mDisplayIntent = this.mDisplayIntent;
+            that.mPages = new ArrayList<Notification>(this.mPages);
+            that.mBackground = this.mBackground;
+            that.mContentIcon = this.mContentIcon;
+            that.mContentIconGravity = this.mContentIconGravity;
+            that.mContentActionIndex = this.mContentActionIndex;
+            that.mCustomSizePreset = this.mCustomSizePreset;
+            that.mCustomContentHeight = this.mCustomContentHeight;
+            that.mGravity = this.mGravity;
+            that.mHintScreenTimeout = this.mHintScreenTimeout;
+            that.mDismissalId = this.mDismissalId;
+            return that;
+        }
+
+        /**
+         * Add a wearable action to this notification.
+         *
+         * <p>When wearable actions are added using this method, the set of actions that
+         * show on a wearable device splits from devices that only show actions added
+         * using {@link NotificationCompat.Builder#addAction}. This allows for customization
+         * of which actions display on different devices.
+         *
+         * @param action the action to add to this notification
+         * @return this object for method chaining
+         * @see NotificationCompat.Action
+         */
+        public WearableExtender addAction(Action action) {
+            mActions.add(action);
+            return this;
+        }
+
+        /**
+         * Adds wearable actions to this notification.
+         *
+         * <p>When wearable actions are added using this method, the set of actions that
+         * show on a wearable device splits from devices that only show actions added
+         * using {@link NotificationCompat.Builder#addAction}. This allows for customization
+         * of which actions display on different devices.
+         *
+         * @param actions the actions to add to this notification
+         * @return this object for method chaining
+         * @see NotificationCompat.Action
+         */
+        public WearableExtender addActions(List<Action> actions) {
+            mActions.addAll(actions);
+            return this;
+        }
+
+        /**
+         * Clear all wearable actions present on this builder.
+         * @return this object for method chaining.
+         * @see #addAction
+         */
+        public WearableExtender clearActions() {
+            mActions.clear();
+            return this;
+        }
+
+        /**
+         * Get the wearable actions present on this notification.
+         */
+        public List<Action> getActions() {
+            return mActions;
+        }
+
+        /**
+         * Set an intent to launch inside of an activity view when displaying
+         * this notification. The {@link PendingIntent} provided should be for an activity.
+         *
+         * <pre class="prettyprint">
+         * Intent displayIntent = new Intent(context, MyDisplayActivity.class);
+         * PendingIntent displayPendingIntent = PendingIntent.getActivity(context,
+         *         0, displayIntent, PendingIntent.FLAG_UPDATE_CURRENT);
+         * Notification notif = new NotificationCompat.Builder(context)
+         *         .extend(new NotificationCompat.WearableExtender()
+         *                 .setDisplayIntent(displayPendingIntent)
+         *                 .setCustomSizePreset(NotificationCompat.WearableExtender.SIZE_MEDIUM))
+         *         .build();</pre>
+         *
+         * <p>The activity to launch needs to allow embedding, must be exported, and
+         * should have an empty task affinity. It is also recommended to use the device
+         * default light theme.
+         *
+         * <p>Example AndroidManifest.xml entry:
+         * <pre class="prettyprint">
+         * &lt;activity android:name=&quot;com.example.MyDisplayActivity&quot;
+         *     android:exported=&quot;true&quot;
+         *     android:allowEmbedded=&quot;true&quot;
+         *     android:taskAffinity=&quot;&quot;
+         *     android:theme=&quot;@android:style/Theme.DeviceDefault.Light&quot; /&gt;</pre>
+         *
+         * @param intent the {@link PendingIntent} for an activity
+         * @return this object for method chaining
+         * @see NotificationCompat.WearableExtender#getDisplayIntent
+         */
+        public WearableExtender setDisplayIntent(PendingIntent intent) {
+            mDisplayIntent = intent;
+            return this;
+        }
+
+        /**
+         * Get the intent to launch inside of an activity view when displaying this
+         * notification. This {@code PendingIntent} should be for an activity.
+         */
+        public PendingIntent getDisplayIntent() {
+            return mDisplayIntent;
+        }
+
+        /**
+         * Add an additional page of content to display with this notification. The current
+         * notification forms the first page, and pages added using this function form
+         * subsequent pages. This field can be used to separate a notification into multiple
+         * sections.
+         *
+         * @param page the notification to add as another page
+         * @return this object for method chaining
+         * @see NotificationCompat.WearableExtender#getPages
+         */
+        public WearableExtender addPage(Notification page) {
+            mPages.add(page);
+            return this;
+        }
+
+        /**
+         * Add additional pages of content to display with this notification. The current
+         * notification forms the first page, and pages added using this function form
+         * subsequent pages. This field can be used to separate a notification into multiple
+         * sections.
+         *
+         * @param pages a list of notifications
+         * @return this object for method chaining
+         * @see NotificationCompat.WearableExtender#getPages
+         */
+        public WearableExtender addPages(List<Notification> pages) {
+            mPages.addAll(pages);
+            return this;
+        }
+
+        /**
+         * Clear all additional pages present on this builder.
+         * @return this object for method chaining.
+         * @see #addPage
+         */
+        public WearableExtender clearPages() {
+            mPages.clear();
+            return this;
+        }
+
+        /**
+         * Get the array of additional pages of content for displaying this notification. The
+         * current notification forms the first page, and elements within this array form
+         * subsequent pages. This field can be used to separate a notification into multiple
+         * sections.
+         * @return the pages for this notification
+         */
+        public List<Notification> getPages() {
+            return mPages;
+        }
+
+        /**
+         * Set a background image to be displayed behind the notification content.
+         * Contrary to the {@link NotificationCompat.BigPictureStyle}, this background
+         * will work with any notification style.
+         *
+         * @param background the background bitmap
+         * @return this object for method chaining
+         * @see NotificationCompat.WearableExtender#getBackground
+         */
+        public WearableExtender setBackground(Bitmap background) {
+            mBackground = background;
+            return this;
+        }
+
+        /**
+         * Get a background image to be displayed behind the notification content.
+         * Contrary to the {@link NotificationCompat.BigPictureStyle}, this background
+         * will work with any notification style.
+         *
+         * @return the background image
+         * @see NotificationCompat.WearableExtender#setBackground
+         */
+        public Bitmap getBackground() {
+            return mBackground;
+        }
+
+        /**
+         * Set an icon that goes with the content of this notification.
+         */
+        public WearableExtender setContentIcon(int icon) {
+            mContentIcon = icon;
+            return this;
+        }
+
+        /**
+         * Get an icon that goes with the content of this notification.
+         */
+        public int getContentIcon() {
+            return mContentIcon;
+        }
+
+        /**
+         * Set the gravity that the content icon should have within the notification display.
+         * Supported values include {@link android.view.Gravity#START} and
+         * {@link android.view.Gravity#END}. The default value is {@link android.view.Gravity#END}.
+         * @see #setContentIcon
+         */
+        public WearableExtender setContentIconGravity(int contentIconGravity) {
+            mContentIconGravity = contentIconGravity;
+            return this;
+        }
+
+        /**
+         * Get the gravity that the content icon should have within the notification display.
+         * Supported values include {@link android.view.Gravity#START} and
+         * {@link android.view.Gravity#END}. The default value is {@link android.view.Gravity#END}.
+         * @see #getContentIcon
+         */
+        public int getContentIconGravity() {
+            return mContentIconGravity;
+        }
+
+        /**
+         * Set an action from this notification's actions to be clickable with the content of
+         * this notification. This action will no longer display separately from the
+         * notification's content.
+         *
+         * <p>For notifications with multiple pages, child pages can also have content actions
+         * set, although the list of available actions comes from the main notification and not
+         * from the child page's notification.
+         *
+         * @param actionIndex The index of the action to hoist onto the current notification page.
+         *                    If wearable actions were added to the main notification, this index
+         *                    will apply to that list, otherwise it will apply to the regular
+         *                    actions list.
+         */
+        public WearableExtender setContentAction(int actionIndex) {
+            mContentActionIndex = actionIndex;
+            return this;
+        }
+
+        /**
+         * Get the index of the notification action, if any, that was specified as being clickable
+         * with the content of this notification. This action will no longer display separately
+         * from the notification's content.
+         *
+         * <p>For notifications with multiple pages, child pages can also have content actions
+         * set, although the list of available actions comes from the main notification and not
+         * from the child page's notification.
+         *
+         * <p>If wearable specific actions were added to the main notification, this index will
+         * apply to that list, otherwise it will apply to the regular actions list.
+         *
+         * @return the action index or {@link #UNSET_ACTION_INDEX} if no action was selected.
+         */
+        public int getContentAction() {
+            return mContentActionIndex;
+        }
+
+        /**
+         * Set the gravity that this notification should have within the available viewport space.
+         * Supported values include {@link android.view.Gravity#TOP},
+         * {@link android.view.Gravity#CENTER_VERTICAL} and {@link android.view.Gravity#BOTTOM}.
+         * The default value is {@link android.view.Gravity#BOTTOM}.
+         */
+        public WearableExtender setGravity(int gravity) {
+            mGravity = gravity;
+            return this;
+        }
+
+        /**
+         * Get the gravity that this notification should have within the available viewport space.
+         * Supported values include {@link android.view.Gravity#TOP},
+         * {@link android.view.Gravity#CENTER_VERTICAL} and {@link android.view.Gravity#BOTTOM}.
+         * The default value is {@link android.view.Gravity#BOTTOM}.
+         */
+        public int getGravity() {
+            return mGravity;
+        }
+
+        /**
+         * Set the custom size preset for the display of this notification out of the available
+         * presets found in {@link NotificationCompat.WearableExtender}, e.g.
+         * {@link #SIZE_LARGE}.
+         * <p>Some custom size presets are only applicable for custom display notifications created
+         * using {@link NotificationCompat.WearableExtender#setDisplayIntent}. Check the
+         * documentation for the preset in question. See also
+         * {@link #setCustomContentHeight} and {@link #getCustomSizePreset}.
+         */
+        public WearableExtender setCustomSizePreset(int sizePreset) {
+            mCustomSizePreset = sizePreset;
+            return this;
+        }
+
+        /**
+         * Get the custom size preset for the display of this notification out of the available
+         * presets found in {@link NotificationCompat.WearableExtender}, e.g.
+         * {@link #SIZE_LARGE}.
+         * <p>Some custom size presets are only applicable for custom display notifications created
+         * using {@link #setDisplayIntent}. Check the documentation for the preset in question.
+         * See also {@link #setCustomContentHeight} and {@link #setCustomSizePreset}.
+         */
+        public int getCustomSizePreset() {
+            return mCustomSizePreset;
+        }
+
+        /**
+         * Set the custom height in pixels for the display of this notification's content.
+         * <p>This option is only available for custom display notifications created
+         * using {@link NotificationCompat.WearableExtender#setDisplayIntent}. See also
+         * {@link NotificationCompat.WearableExtender#setCustomSizePreset} and
+         * {@link #getCustomContentHeight}.
+         */
+        public WearableExtender setCustomContentHeight(int height) {
+            mCustomContentHeight = height;
+            return this;
+        }
+
+        /**
+         * Get the custom height in pixels for the display of this notification's content.
+         * <p>This option is only available for custom display notifications created
+         * using {@link #setDisplayIntent}. See also {@link #setCustomSizePreset} and
+         * {@link #setCustomContentHeight}.
+         */
+        public int getCustomContentHeight() {
+            return mCustomContentHeight;
+        }
+
+        /**
+         * Set whether the scrolling position for the contents of this notification should start
+         * at the bottom of the contents instead of the top when the contents are too long to
+         * display within the screen.  Default is false (start scroll at the top).
+         */
+        public WearableExtender setStartScrollBottom(boolean startScrollBottom) {
+            setFlag(FLAG_START_SCROLL_BOTTOM, startScrollBottom);
+            return this;
+        }
+
+        /**
+         * Get whether the scrolling position for the contents of this notification should start
+         * at the bottom of the contents instead of the top when the contents are too long to
+         * display within the screen. Default is false (start scroll at the top).
+         */
+        public boolean getStartScrollBottom() {
+            return (mFlags & FLAG_START_SCROLL_BOTTOM) != 0;
+        }
+
+        /**
+         * Set whether the content intent is available when the wearable device is not connected
+         * to a companion device.  The user can still trigger this intent when the wearable device
+         * is offline, but a visual hint will indicate that the content intent may not be available.
+         * Defaults to true.
+         */
+        public WearableExtender setContentIntentAvailableOffline(
+                boolean contentIntentAvailableOffline) {
+            setFlag(FLAG_CONTENT_INTENT_AVAILABLE_OFFLINE, contentIntentAvailableOffline);
+            return this;
+        }
+
+        /**
+         * Get whether the content intent is available when the wearable device is not connected
+         * to a companion device.  The user can still trigger this intent when the wearable device
+         * is offline, but a visual hint will indicate that the content intent may not be available.
+         * Defaults to true.
+         */
+        public boolean getContentIntentAvailableOffline() {
+            return (mFlags & FLAG_CONTENT_INTENT_AVAILABLE_OFFLINE) != 0;
+        }
+
+        /**
+         * Set a hint that this notification's icon should not be displayed.
+         * @param hintHideIcon {@code true} to hide the icon, {@code false} otherwise.
+         * @return this object for method chaining
+         */
+        public WearableExtender setHintHideIcon(boolean hintHideIcon) {
+            setFlag(FLAG_HINT_HIDE_ICON, hintHideIcon);
+            return this;
+        }
+
+        /**
+         * Get a hint that this notification's icon should not be displayed.
+         * @return {@code true} if this icon should not be displayed, false otherwise.
+         * The default value is {@code false} if this was never set.
+         */
+        public boolean getHintHideIcon() {
+            return (mFlags & FLAG_HINT_HIDE_ICON) != 0;
+        }
+
+        /**
+         * Set a visual hint that only the background image of this notification should be
+         * displayed, and other semantic content should be hidden. This hint is only applicable
+         * to sub-pages added using {@link #addPage}.
+         */
+        public WearableExtender setHintShowBackgroundOnly(boolean hintShowBackgroundOnly) {
+            setFlag(FLAG_HINT_SHOW_BACKGROUND_ONLY, hintShowBackgroundOnly);
+            return this;
+        }
+
+        /**
+         * Get a visual hint that only the background image of this notification should be
+         * displayed, and other semantic content should be hidden. This hint is only applicable
+         * to sub-pages added using {@link NotificationCompat.WearableExtender#addPage}.
+         */
+        public boolean getHintShowBackgroundOnly() {
+            return (mFlags & FLAG_HINT_SHOW_BACKGROUND_ONLY) != 0;
+        }
+
+        /**
+         * Set a hint that this notification's background should not be clipped if possible,
+         * and should instead be resized to fully display on the screen, retaining the aspect
+         * ratio of the image. This can be useful for images like barcodes or qr codes.
+         * @param hintAvoidBackgroundClipping {@code true} to avoid clipping if possible.
+         * @return this object for method chaining
+         */
+        public WearableExtender setHintAvoidBackgroundClipping(
+                boolean hintAvoidBackgroundClipping) {
+            setFlag(FLAG_HINT_AVOID_BACKGROUND_CLIPPING, hintAvoidBackgroundClipping);
+            return this;
+        }
+
+        /**
+         * Get a hint that this notification's background should not be clipped if possible,
+         * and should instead be resized to fully display on the screen, retaining the aspect
+         * ratio of the image. This can be useful for images like barcodes or qr codes.
+         * @return {@code true} if it's ok if the background is clipped on the screen, false
+         * otherwise. The default value is {@code false} if this was never set.
+         */
+        public boolean getHintAvoidBackgroundClipping() {
+            return (mFlags & FLAG_HINT_AVOID_BACKGROUND_CLIPPING) != 0;
+        }
+
+        /**
+         * Set a hint that the screen should remain on for at least this duration when
+         * this notification is displayed on the screen.
+         * @param timeout The requested screen timeout in milliseconds. Can also be either
+         *     {@link #SCREEN_TIMEOUT_SHORT} or {@link #SCREEN_TIMEOUT_LONG}.
+         * @return this object for method chaining
+         */
+        public WearableExtender setHintScreenTimeout(int timeout) {
+            mHintScreenTimeout = timeout;
+            return this;
+        }
+
+        /**
+         * Get the duration, in milliseconds, that the screen should remain on for
+         * when this notification is displayed.
+         * @return the duration in milliseconds if > 0, or either one of the sentinel values
+         *     {@link #SCREEN_TIMEOUT_SHORT} or {@link #SCREEN_TIMEOUT_LONG}.
+         */
+        public int getHintScreenTimeout() {
+            return mHintScreenTimeout;
+        }
+
+        /**
+         * Set a hint that this notification's {@link BigPictureStyle} (if present) should be
+         * converted to low-bit and displayed in ambient mode, especially useful for barcodes and
+         * qr codes, as well as other simple black-and-white tickets.
+         * @param hintAmbientBigPicture {@code true} to enable converstion and ambient.
+         * @return this object for method chaining
+         */
+        public WearableExtender setHintAmbientBigPicture(boolean hintAmbientBigPicture) {
+            setFlag(FLAG_BIG_PICTURE_AMBIENT, hintAmbientBigPicture);
+            return this;
+        }
+
+        /**
+         * Get a hint that this notification's {@link BigPictureStyle} (if present) should be
+         * converted to low-bit and displayed in ambient mode, especially useful for barcodes and
+         * qr codes, as well as other simple black-and-white tickets.
+         * @return {@code true} if it should be displayed in ambient, false otherwise
+         * otherwise. The default value is {@code false} if this was never set.
+         */
+        public boolean getHintAmbientBigPicture() {
+            return (mFlags & FLAG_BIG_PICTURE_AMBIENT) != 0;
+        }
+
+        /**
+         * Set a hint that this notification's content intent will launch an {@link Activity}
+         * directly, telling the platform that it can generate the appropriate transitions.
+         * @param hintContentIntentLaunchesActivity {@code true} if the content intent will launch
+         * an activity and transitions should be generated, false otherwise.
+         * @return this object for method chaining
+         */
+        public WearableExtender setHintContentIntentLaunchesActivity(
+                boolean hintContentIntentLaunchesActivity) {
+            setFlag(FLAG_HINT_CONTENT_INTENT_LAUNCHES_ACTIVITY, hintContentIntentLaunchesActivity);
+            return this;
+        }
+
+        /**
+         * Get a hint that this notification's content intent will launch an {@link Activity}
+         * directly, telling the platform that it can generate the appropriate transitions
+         * @return {@code true} if the content intent will launch an activity and transitions should
+         * be generated, false otherwise. The default value is {@code false} if this was never set.
+         */
+        public boolean getHintContentIntentLaunchesActivity() {
+            return (mFlags & FLAG_HINT_CONTENT_INTENT_LAUNCHES_ACTIVITY) != 0;
+        }
+
+        /**
+         * When you post a notification, if you set the dismissal id field, then when that
+         * notification is canceled, notifications on other wearables and the paired Android phone
+         * having that same dismissal id will also be canceled.  Note that this only works if you
+         * have notification bridge mode set to NO_BRIDGING in your Wear app manifest.  See
+         * <a href="{@docRoot}wear/notifications/index.html">Adding Wearable Features to
+         * Notifications</a> for more information on how to use the bridge mode feature.
+         * @param dismissalId the dismissal id of the notification.
+         * @return this object for method chaining
+         */
+        public WearableExtender setDismissalId(String dismissalId) {
+            mDismissalId = dismissalId;
+            return this;
+        }
+
+        /**
+         * Returns the dismissal id of the notification.
+         * @return the dismissal id of the notification or null if it has not been set.
+         */
+        public String getDismissalId() {
+            return mDismissalId;
+        }
+
+        private void setFlag(int mask, boolean value) {
+            if (value) {
+                mFlags |= mask;
+            } else {
+                mFlags &= ~mask;
+            }
+        }
+    }
+
+    /**
+     * <p>Helper class to add Android Auto extensions to notifications. To create a notification
+     * with car extensions:
+     *
+     * <ol>
+     *  <li>Create an {@link NotificationCompat.Builder}, setting any desired
+     *  properties.
+     *  <li>Create a {@link CarExtender}.
+     *  <li>Set car-specific properties using the {@code add} and {@code set} methods of
+     *  {@link CarExtender}.
+     *  <li>Call {@link android.support.v4.app.NotificationCompat.Builder#extend(NotificationCompat.Extender)}
+     *  to apply the extensions to a notification.
+     *  <li>Post the notification to the notification system with the
+     *  {@code NotificationManagerCompat.notify(...)} methods and not the
+     *  {@code NotificationManager.notify(...)} methods.
+     * </ol>
+     *
+     * <pre class="prettyprint">
+     * Notification notification = new NotificationCompat.Builder(context)
+     *         ...
+     *         .extend(new CarExtender()
+     *                 .set*(...))
+     *         .build();
+     * </pre>
+     *
+     * <p>Car extensions can be accessed on an existing notification by using the
+     * {@code CarExtender(Notification)} constructor, and then using the {@code get} methods
+     * to access values.
+     */
+    public static final class CarExtender implements Extender {
+        private static final String TAG = "CarExtender";
+
+        private static final String EXTRA_CAR_EXTENDER = "android.car.EXTENSIONS";
+        private static final String EXTRA_LARGE_ICON = "large_icon";
+        private static final String EXTRA_CONVERSATION = "car_conversation";
+        private static final String EXTRA_COLOR = "app_color";
+
+        private Bitmap mLargeIcon;
+        private UnreadConversation mUnreadConversation;
+        private int mColor = NotificationCompat.COLOR_DEFAULT;
+
+        /**
+         * Create a {@link CarExtender} with default options.
+         */
+        public CarExtender() {
+        }
+
+        /**
+         * Create a {@link CarExtender} from the CarExtender options of an existing Notification.
+         *
+         * @param notif The notification from which to copy options.
+         */
+        public CarExtender(Notification notif) {
+            if (Build.VERSION.SDK_INT < 21) {
+                return;
+            }
+
+            Bundle carBundle = getExtras(notif)==null ?
+                    null : getExtras(notif).getBundle(EXTRA_CAR_EXTENDER);
+            if (carBundle != null) {
+                mLargeIcon = carBundle.getParcelable(EXTRA_LARGE_ICON);
+                mColor = carBundle.getInt(EXTRA_COLOR, NotificationCompat.COLOR_DEFAULT);
+
+                Bundle b = carBundle.getBundle(EXTRA_CONVERSATION);
+                mUnreadConversation = (UnreadConversation) IMPL.getUnreadConversationFromBundle(
+                        b, UnreadConversation.FACTORY, RemoteInput.FACTORY);
+            }
+        }
+
+        /**
+         * Apply car extensions to a notification that is being built. This is typically called by
+         * the {@link android.support.v4.app.NotificationCompat.Builder#extend(NotificationCompat.Extender)}
+         * method of {@link NotificationCompat.Builder}.
+         */
+        @Override
+        public NotificationCompat.Builder extend(NotificationCompat.Builder builder) {
+            if (Build.VERSION.SDK_INT < 21) {
+                return builder;
+            }
+
+            Bundle carExtensions = new Bundle();
+
+            if (mLargeIcon != null) {
+                carExtensions.putParcelable(EXTRA_LARGE_ICON, mLargeIcon);
+            }
+            if (mColor != NotificationCompat.COLOR_DEFAULT) {
+                carExtensions.putInt(EXTRA_COLOR, mColor);
+            }
+
+            if (mUnreadConversation != null) {
+                Bundle b = IMPL.getBundleForUnreadConversation(mUnreadConversation);
+                carExtensions.putBundle(EXTRA_CONVERSATION, b);
+            }
+
+            builder.getExtras().putBundle(EXTRA_CAR_EXTENDER, carExtensions);
+            return builder;
+        }
+
+        /**
+         * Sets the accent color to use when Android Auto presents the notification.
+         *
+         * Android Auto uses the color set with {@link android.support.v4.app.NotificationCompat.Builder#setColor(int)}
+         * to accent the displayed notification. However, not all colors are acceptable in an
+         * automotive setting. This method can be used to override the color provided in the
+         * notification in such a situation.
+         */
+        public CarExtender setColor(@ColorInt int color) {
+            mColor = color;
+            return this;
+        }
+
+        /**
+         * Gets the accent color.
+         *
+         * @see #setColor
+         */
+        @ColorInt
+        public int getColor() {
+            return mColor;
+        }
+
+        /**
+         * Sets the large icon of the car notification.
+         *
+         * If no large icon is set in the extender, Android Auto will display the icon
+         * specified by {@link android.support.v4.app.NotificationCompat.Builder#setLargeIcon(android.graphics.Bitmap)}
+         *
+         * @param largeIcon The large icon to use in the car notification.
+         * @return This object for method chaining.
+         */
+        public CarExtender setLargeIcon(Bitmap largeIcon) {
+            mLargeIcon = largeIcon;
+            return this;
+        }
+
+        /**
+         * Gets the large icon used in this car notification, or null if no icon has been set.
+         *
+         * @return The large icon for the car notification.
+         * @see CarExtender#setLargeIcon
+         */
+        public Bitmap getLargeIcon() {
+            return mLargeIcon;
+        }
+
+        /**
+         * Sets the unread conversation in a message notification.
+         *
+         * @param unreadConversation The unread part of the conversation this notification conveys.
+         * @return This object for method chaining.
+         */
+        public CarExtender setUnreadConversation(UnreadConversation unreadConversation) {
+            mUnreadConversation = unreadConversation;
+            return this;
+        }
+
+        /**
+         * Returns the unread conversation conveyed by this notification.
+         * @see #setUnreadConversation(UnreadConversation)
+         */
+        public UnreadConversation getUnreadConversation() {
+            return mUnreadConversation;
+        }
+
+        /**
+         * A class which holds the unread messages from a conversation.
+         */
+        public static class UnreadConversation extends NotificationCompatBase.UnreadConversation {
+            private final String[] mMessages;
+            private final RemoteInput mRemoteInput;
+            private final PendingIntent mReplyPendingIntent;
+            private final PendingIntent mReadPendingIntent;
+            private final String[] mParticipants;
+            private final long mLatestTimestamp;
+
+            UnreadConversation(String[] messages, RemoteInput remoteInput,
+                    PendingIntent replyPendingIntent, PendingIntent readPendingIntent,
+                    String[] participants, long latestTimestamp) {
+                mMessages = messages;
+                mRemoteInput = remoteInput;
+                mReadPendingIntent = readPendingIntent;
+                mReplyPendingIntent = replyPendingIntent;
+                mParticipants = participants;
+                mLatestTimestamp = latestTimestamp;
+            }
+
+            /**
+             * Gets the list of messages conveyed by this notification.
+             */
+            @Override
+            public String[] getMessages() {
+                return mMessages;
+            }
+
+            /**
+             * Gets the remote input that will be used to convey the response to a message list, or
+             * null if no such remote input exists.
+             */
+            @Override
+            public RemoteInput getRemoteInput() {
+                return mRemoteInput;
+            }
+
+            /**
+             * Gets the pending intent that will be triggered when the user replies to this
+             * notification.
+             */
+            @Override
+            public PendingIntent getReplyPendingIntent() {
+                return mReplyPendingIntent;
+            }
+
+            /**
+             * Gets the pending intent that Android Auto will send after it reads aloud all messages
+             * in this object's message list.
+             */
+            @Override
+            public PendingIntent getReadPendingIntent() {
+                return mReadPendingIntent;
+            }
+
+            /**
+             * Gets the participants in the conversation.
+             */
+            @Override
+            public String[] getParticipants() {
+                return mParticipants;
+            }
+
+            /**
+             * Gets the firs participant in the conversation.
+             */
+            @Override
+            public String getParticipant() {
+                return mParticipants.length > 0 ? mParticipants[0] : null;
+            }
+
+            /**
+             * Gets the timestamp of the conversation.
+             */
+            @Override
+            public long getLatestTimestamp() {
+                return mLatestTimestamp;
+            }
+
+            /** @hide */
+            static final Factory FACTORY = new Factory() {
+                @Override
+                public UnreadConversation build(
+                        String[] messages, RemoteInputCompatBase.RemoteInput remoteInput,
+                        PendingIntent replyPendingIntent, PendingIntent readPendingIntent,
+                        String[] participants, long latestTimestamp) {
+                    return new UnreadConversation(
+                            messages, (RemoteInput) remoteInput, replyPendingIntent,
+                            readPendingIntent,
+                            participants, latestTimestamp);
+                }
+            };
+
+            /**
+             * Builder class for {@link CarExtender.UnreadConversation} objects.
+             */
+            public static class Builder {
+                private final List<String> mMessages = new ArrayList<String>();
+                private final String mParticipant;
+                private RemoteInput mRemoteInput;
+                private PendingIntent mReadPendingIntent;
+                private PendingIntent mReplyPendingIntent;
+                private long mLatestTimestamp;
+
+                /**
+                 * Constructs a new builder for {@link CarExtender.UnreadConversation}.
+                 *
+                 * @param name The name of the other participant in the conversation.
+                 */
+                public Builder(String name) {
+                    mParticipant = name;
+                }
+
+                /**
+                 * Appends a new unread message to the list of messages for this conversation.
+                 *
+                 * The messages should be added from oldest to newest.
+                 *
+                 * @param message The text of the new unread message.
+                 * @return This object for method chaining.
+                 */
+                public Builder addMessage(String message) {
+                    mMessages.add(message);
+                    return this;
+                }
+
+                /**
+                 * Sets the pending intent and remote input which will convey the reply to this
+                 * notification.
+                 *
+                 * @param pendingIntent The pending intent which will be triggered on a reply.
+                 * @param remoteInput The remote input parcelable which will carry the reply.
+                 * @return This object for method chaining.
+                 *
+                 * @see CarExtender.UnreadConversation#getRemoteInput
+                 * @see CarExtender.UnreadConversation#getReplyPendingIntent
+                 */
+                public Builder setReplyAction(
+                        PendingIntent pendingIntent, RemoteInput remoteInput) {
+                    mRemoteInput = remoteInput;
+                    mReplyPendingIntent = pendingIntent;
+
+                    return this;
+                }
+
+                /**
+                 * Sets the pending intent that will be sent once the messages in this notification
+                 * are read.
+                 *
+                 * @param pendingIntent The pending intent to use.
+                 * @return This object for method chaining.
+                 */
+                public Builder setReadPendingIntent(PendingIntent pendingIntent) {
+                    mReadPendingIntent = pendingIntent;
+                    return this;
+                }
+
+                /**
+                 * Sets the timestamp of the most recent message in an unread conversation.
+                 *
+                 * If a messaging notification has been posted by your application and has not
+                 * yet been cancelled, posting a later notification with the same id and tag
+                 * but without a newer timestamp may result in Android Auto not displaying a
+                 * heads up notification for the later notification.
+                 *
+                 * @param timestamp The timestamp of the most recent message in the conversation.
+                 * @return This object for method chaining.
+                 */
+                public Builder setLatestTimestamp(long timestamp) {
+                    mLatestTimestamp = timestamp;
+                    return this;
+                }
+
+                /**
+                 * Builds a new unread conversation object.
+                 *
+                 * @return The new unread conversation object.
+                 */
+                public UnreadConversation build() {
+                    String[] messages = mMessages.toArray(new String[mMessages.size()]);
+                    String[] participants = { mParticipant };
+                    return new UnreadConversation(messages, mRemoteInput, mReplyPendingIntent,
+                            mReadPendingIntent, participants, mLatestTimestamp);
+                }
+            }
+        }
+    }
+
+
+    /**
+     * Get an array of Notification objects from a parcelable array bundle field.
+     * Update the bundle to have a typed array so fetches in the future don't need
+     * to do an array copy.
+     */
+    private static Notification[] getNotificationArrayFromBundle(Bundle bundle, String key) {
+        Parcelable[] array = bundle.getParcelableArray(key);
+        if (array instanceof Notification[] || array == null) {
+            return (Notification[]) array;
+        }
+        Notification[] typedArray = new Notification[array.length];
+        for (int i = 0; i < array.length; i++) {
+            typedArray[i] = (Notification) array[i];
+        }
+        bundle.putParcelableArray(key, typedArray);
+        return typedArray;
+    }
+
+    /**
+     * Gets the {@link Notification#extras} field from a notification in a backwards
+     * compatible manner. Extras field was supported from JellyBean (Api level 16)
+     * forwards. This function will return null on older api levels.
+     */
+    public static Bundle getExtras(Notification notif) {
+        return IMPL.getExtras(notif);
+    }
+
+    /**
+     * Get the number of actions in this notification in a backwards compatible
+     * manner. Actions were supported from JellyBean (Api level 16) forwards.
+     */
+    public static int getActionCount(Notification notif) {
+        return IMPL.getActionCount(notif);
+    }
+
+    /**
+     * Get an action on this notification in a backwards compatible
+     * manner. Actions were supported from JellyBean (Api level 16) forwards.
+     * @param notif The notification to inspect.
+     * @param actionIndex The index of the action to retrieve.
+     */
+    public static Action getAction(Notification notif, int actionIndex) {
+        return IMPL.getAction(notif, actionIndex);
+    }
+
+    /**
+     * Get the category of this notification in a backwards compatible
+     * manner.
+     * @param notif The notification to inspect.
+     */
+    public static String getCategory(Notification notif) {
+        return IMPL.getCategory(notif);
+    }
+
+    /**
+     * Get whether or not this notification is only relevant to the current device.
+     *
+     * <p>Some notifications can be bridged to other devices for remote display.
+     * If this hint is set, it is recommend that this notification not be bridged.
+     */
+    public static boolean getLocalOnly(Notification notif) {
+        return IMPL.getLocalOnly(notif);
+    }
+
+    /**
+     * Get the key used to group this notification into a cluster or stack
+     * with other notifications on devices which support such rendering.
+     */
+    public static String getGroup(Notification notif) {
+        return IMPL.getGroup(notif);
+    }
+
+    /**
+     * Get whether this notification to be the group summary for a group of notifications.
+     * Grouped notifications may display in a cluster or stack on devices which
+     * support such rendering. Requires a group key also be set using {@link Builder#setGroup}.
+     * @return Whether this notification is a group summary.
+     */
+    public static boolean isGroupSummary(Notification notif) {
+        return IMPL.isGroupSummary(notif);
+    }
+
+    /**
+     * Get a sort key that orders this notification among other notifications from the
+     * same package. This can be useful if an external sort was already applied and an app
+     * would like to preserve this. Notifications will be sorted lexicographically using this
+     * value, although providing different priorities in addition to providing sort key may
+     * cause this value to be ignored.
+     *
+     * <p>This sort key can also be used to order members of a notification group. See
+     * {@link Builder#setGroup}.
+     *
+     * @see String#compareTo(String)
+     */
+    public static String getSortKey(Notification notif) {
+        return IMPL.getSortKey(notif);
+    }
+}
diff --git a/v4/java/android/support/v4/app/NotificationCompatExtras.java b/compat/java/android/support/v4/app/NotificationCompatExtras.java
similarity index 100%
rename from v4/java/android/support/v4/app/NotificationCompatExtras.java
rename to compat/java/android/support/v4/app/NotificationCompatExtras.java
diff --git a/v4/java/android/support/v4/app/NotificationCompatSideChannelService.java b/compat/java/android/support/v4/app/NotificationCompatSideChannelService.java
similarity index 100%
rename from v4/java/android/support/v4/app/NotificationCompatSideChannelService.java
rename to compat/java/android/support/v4/app/NotificationCompatSideChannelService.java
diff --git a/compat/java/android/support/v4/app/NotificationManagerCompat.java b/compat/java/android/support/v4/app/NotificationManagerCompat.java
new file mode 100644
index 0000000..3763e7b
--- /dev/null
+++ b/compat/java/android/support/v4/app/NotificationManagerCompat.java
@@ -0,0 +1,709 @@
+/*
+ * Copyright (C) 2014 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 android.support.v4.app;
+
+import android.app.Notification;
+import android.app.NotificationManager;
+import android.app.Service;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.ServiceConnection;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.os.Build;
+import android.os.Bundle;
+import android.os.DeadObjectException;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.IBinder;
+import android.os.Message;
+import android.os.RemoteException;
+import android.provider.Settings;
+import android.support.v4.os.BuildCompat;
+import android.util.Log;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Compatibility library for NotificationManager with fallbacks for older platforms.
+ *
+ * <p>To use this class, call the static function {@link #from} to get a
+ * {@link NotificationManagerCompat} object, and then call one of its
+ * methods to post or cancel notifications.
+ */
+public final class NotificationManagerCompat {
+    private static final String TAG = "NotifManCompat";
+
+    /**
+     * Notification extras key: if set to true, the posted notification should use
+     * the side channel for delivery instead of using notification manager.
+     */
+    public static final String EXTRA_USE_SIDE_CHANNEL =
+            NotificationCompatJellybean.EXTRA_USE_SIDE_CHANNEL;
+
+    /**
+     * Intent action to register for on a service to receive side channel
+     * notifications. The listening service must be in the same package as an enabled
+     * {@link android.service.notification.NotificationListenerService}.
+     */
+    public static final String ACTION_BIND_SIDE_CHANNEL =
+            "android.support.BIND_NOTIFICATION_SIDE_CHANNEL";
+
+    /**
+     * Maximum sdk build version which needs support for side channeled notifications.
+     * Currently the only needed use is for side channeling group children before KITKAT_WATCH.
+     */
+    static final int MAX_SIDE_CHANNEL_SDK_VERSION = 19;
+
+    /** Base time delay for a side channel listener queue retry. */
+    private static final int SIDE_CHANNEL_RETRY_BASE_INTERVAL_MS = 1000;
+    /** Maximum retries for a side channel listener before dropping tasks. */
+    private static final int SIDE_CHANNEL_RETRY_MAX_COUNT = 6;
+    /** Hidden field Settings.Secure.ENABLED_NOTIFICATION_LISTENERS */
+    private static final String SETTING_ENABLED_NOTIFICATION_LISTENERS =
+            "enabled_notification_listeners";
+    private static final int SIDE_CHANNEL_BIND_FLAGS;
+
+    /** Cache of enabled notification listener components */
+    private static final Object sEnabledNotificationListenersLock = new Object();
+    /** Guarded by {@link #sEnabledNotificationListenersLock} */
+    private static String sEnabledNotificationListeners;
+    /** Guarded by {@link #sEnabledNotificationListenersLock} */
+    private static Set<String> sEnabledNotificationListenerPackages = new HashSet<String>();
+
+    private final Context mContext;
+    private final NotificationManager mNotificationManager;
+    /** Lock for mutable static fields */
+    private static final Object sLock = new Object();
+    /** Guarded by {@link #sLock} */
+    private static SideChannelManager sSideChannelManager;
+
+    /**
+     * Value signifying that the user has not expressed an importance.
+     *
+     * This value is for persisting preferences, and should never be associated with
+     * an actual notification.
+     */
+    public static final int IMPORTANCE_UNSPECIFIED = -1000;
+
+    /**
+     * A notification with no importance: shows nowhere, is blocked.
+     */
+    public static final int IMPORTANCE_NONE = 0;
+
+    /**
+     * Min notification importance: only shows in the shade, below the fold.
+     */
+    public static final int IMPORTANCE_MIN = 1;
+
+    /**
+     * Low notification importance: shows everywhere, but is not intrusive.
+     */
+    public static final int IMPORTANCE_LOW = 2;
+
+    /**
+     * Default notification importance: shows everywhere, allowed to makes noise,
+     * but does not visually intrude.
+     */
+    public static final int IMPORTANCE_DEFAULT = 3;
+
+    /**
+     * Higher notification importance: shows everywhere, allowed to makes noise and peek.
+     */
+    public static final int IMPORTANCE_HIGH = 4;
+
+    /**
+     * Highest notification importance: shows everywhere, allowed to makes noise, peek, and
+     * use full screen intents.
+     */
+    public static final int IMPORTANCE_MAX = 5;
+
+    /** Get a {@link NotificationManagerCompat} instance for a provided context. */
+    public static NotificationManagerCompat from(Context context) {
+        return new NotificationManagerCompat(context);
+    }
+
+    private NotificationManagerCompat(Context context) {
+        mContext = context;
+        mNotificationManager = (NotificationManager) mContext.getSystemService(
+                Context.NOTIFICATION_SERVICE);
+    }
+
+    private static final Impl IMPL;
+
+    interface Impl {
+        void cancelNotification(NotificationManager notificationManager, String tag, int id);
+
+        void postNotification(NotificationManager notificationManager, String tag, int id,
+                Notification notification);
+
+        int getSideChannelBindFlags();
+
+        boolean areNotificationsEnabled(Context context, NotificationManager notificationManager);
+
+        int getImportance(NotificationManager notificationManager);
+    }
+
+    static class ImplBase implements Impl {
+
+        @Override
+        public void cancelNotification(NotificationManager notificationManager, String tag,
+                int id) {
+            notificationManager.cancel(tag, id);
+        }
+
+        @Override
+        public void postNotification(NotificationManager notificationManager, String tag, int id,
+                Notification notification) {
+            notificationManager.notify(tag, id, notification);
+        }
+
+        @Override
+        public int getSideChannelBindFlags() {
+            return Service.BIND_AUTO_CREATE;
+        }
+
+        @Override
+        public boolean areNotificationsEnabled(Context context,
+                NotificationManager notificationManager) {
+            return true;
+        }
+
+        @Override
+        public int getImportance(NotificationManager notificationManager) {
+            return IMPORTANCE_UNSPECIFIED;
+        }
+    }
+
+    static class ImplIceCreamSandwich extends ImplBase {
+        @Override
+        public int getSideChannelBindFlags() {
+            return NotificationManagerCompatIceCreamSandwich.SIDE_CHANNEL_BIND_FLAGS;
+        }
+    }
+
+    static class ImplKitKat extends ImplIceCreamSandwich {
+        @Override
+        public boolean areNotificationsEnabled(Context context,
+                NotificationManager notificationManager) {
+            return NotificationManagerCompatKitKat.areNotificationsEnabled(context);
+        }
+    }
+
+    static class ImplApi24 extends ImplKitKat {
+        @Override
+        public boolean areNotificationsEnabled(Context context,
+                NotificationManager notificationManager) {
+            return NotificationManagerCompatApi24.areNotificationsEnabled(notificationManager);
+        }
+
+        @Override
+        public int getImportance(NotificationManager notificationManager) {
+            return NotificationManagerCompatApi24.getImportance(notificationManager);
+        }
+    }
+
+    static {
+        if (BuildCompat.isAtLeastN()) {
+            IMPL = new ImplApi24();
+        } else if (Build.VERSION.SDK_INT >= 19) {
+            IMPL = new ImplKitKat();
+        }  else if (Build.VERSION.SDK_INT >= 14) {
+            IMPL = new ImplIceCreamSandwich();
+        } else {
+            IMPL = new ImplBase();
+        }
+        SIDE_CHANNEL_BIND_FLAGS = IMPL.getSideChannelBindFlags();
+    }
+
+    /**
+     * Cancel a previously shown notification.
+     * @param id the ID of the notification
+     */
+    public void cancel(int id) {
+        cancel(null, id);
+    }
+
+    /**
+     * Cancel a previously shown notification.
+     * @param tag the string identifier of the notification.
+     * @param id the ID of the notification
+     */
+    public void cancel(String tag, int id) {
+        IMPL.cancelNotification(mNotificationManager, tag, id);
+        if (Build.VERSION.SDK_INT <= MAX_SIDE_CHANNEL_SDK_VERSION) {
+            pushSideChannelQueue(new CancelTask(mContext.getPackageName(), id, tag));
+        }
+    }
+
+    /** Cancel all previously shown notifications. */
+    public void cancelAll() {
+        mNotificationManager.cancelAll();
+        if (Build.VERSION.SDK_INT <= MAX_SIDE_CHANNEL_SDK_VERSION) {
+            pushSideChannelQueue(new CancelTask(mContext.getPackageName()));
+        }
+    }
+
+    /**
+     * Post a notification to be shown in the status bar, stream, etc.
+     * @param id the ID of the notification
+     * @param notification the notification to post to the system
+     */
+    public void notify(int id, Notification notification) {
+        notify(null, id, notification);
+    }
+
+    /**
+     * Post a notification to be shown in the status bar, stream, etc.
+     * @param tag the string identifier for a notification. Can be {@code null}.
+     * @param id the ID of the notification. The pair (tag, id) must be unique within your app.
+     * @param notification the notification to post to the system
+    */
+    public void notify(String tag, int id, Notification notification) {
+        if (useSideChannelForNotification(notification)) {
+            pushSideChannelQueue(new NotifyTask(mContext.getPackageName(), id, tag, notification));
+            // Cancel this notification in notification manager if it just transitioned to being
+            // side channelled.
+            IMPL.cancelNotification(mNotificationManager, tag, id);
+        } else {
+            IMPL.postNotification(mNotificationManager, tag, id, notification);
+        }
+    }
+
+    /**
+     * Returns whether notifications from the calling package are not blocked.
+     */
+    public boolean areNotificationsEnabled() {
+        return IMPL.areNotificationsEnabled(mContext, mNotificationManager);
+    }
+
+    /**
+     * Returns the user specified importance for notifications from the calling package.
+     *
+     * @return An importance level, such as {@link #IMPORTANCE_DEFAULT}.
+     */
+    public int getImportance() {
+        return IMPL.getImportance(mNotificationManager);
+    }
+
+    /**
+     * Get the set of packages that have an enabled notification listener component within them.
+     */
+    public static Set<String> getEnabledListenerPackages(Context context) {
+        final String enabledNotificationListeners = Settings.Secure.getString(
+                context.getContentResolver(),
+                SETTING_ENABLED_NOTIFICATION_LISTENERS);
+        synchronized (sEnabledNotificationListenersLock) {
+            // Parse the string again if it is different from the last time this method was called.
+            if (enabledNotificationListeners != null
+                    && !enabledNotificationListeners.equals(sEnabledNotificationListeners)) {
+                final String[] components = enabledNotificationListeners.split(":");
+                Set<String> packageNames = new HashSet<String>(components.length);
+                for (String component : components) {
+                    ComponentName componentName = ComponentName.unflattenFromString(component);
+                    if (componentName != null) {
+                        packageNames.add(componentName.getPackageName());
+                    }
+                }
+                sEnabledNotificationListenerPackages = packageNames;
+                sEnabledNotificationListeners = enabledNotificationListeners;
+            }
+            return sEnabledNotificationListenerPackages;
+        }
+    }
+
+    /**
+     * Returns true if this notification should use the side channel for delivery.
+     */
+    private static boolean useSideChannelForNotification(Notification notification) {
+        Bundle extras = NotificationCompat.getExtras(notification);
+        return extras != null && extras.getBoolean(EXTRA_USE_SIDE_CHANNEL);
+    }
+
+    /**
+     * Push a notification task for distribution to notification side channels.
+     */
+    private void pushSideChannelQueue(Task task) {
+        synchronized (sLock) {
+            if (sSideChannelManager == null) {
+                sSideChannelManager = new SideChannelManager(mContext.getApplicationContext());
+            }
+            sSideChannelManager.queueTask(task);
+        }
+    }
+
+    /**
+     * Helper class to manage a queue of pending tasks to send to notification side channel
+     * listeners.
+     */
+    private static class SideChannelManager implements Handler.Callback, ServiceConnection {
+        private static final int MSG_QUEUE_TASK = 0;
+        private static final int MSG_SERVICE_CONNECTED = 1;
+        private static final int MSG_SERVICE_DISCONNECTED = 2;
+        private static final int MSG_RETRY_LISTENER_QUEUE = 3;
+
+        private static final String KEY_BINDER = "binder";
+
+        private final Context mContext;
+        private final HandlerThread mHandlerThread;
+        private final Handler mHandler;
+        private final Map<ComponentName, ListenerRecord> mRecordMap =
+                new HashMap<ComponentName, ListenerRecord>();
+        private Set<String> mCachedEnabledPackages = new HashSet<String>();
+
+        public SideChannelManager(Context context) {
+            mContext = context;
+            mHandlerThread = new HandlerThread("NotificationManagerCompat");
+            mHandlerThread.start();
+            mHandler = new Handler(mHandlerThread.getLooper(), this);
+        }
+
+        /**
+         * Queue a new task to be sent to all listeners. This function can be called
+         * from any thread.
+         */
+        public void queueTask(Task task) {
+            mHandler.obtainMessage(MSG_QUEUE_TASK, task).sendToTarget();
+        }
+
+        @Override
+        public boolean handleMessage(Message msg) {
+            switch (msg.what) {
+                case MSG_QUEUE_TASK:
+                    handleQueueTask((Task) msg.obj);
+                    return true;
+                case MSG_SERVICE_CONNECTED:
+                    ServiceConnectedEvent event = (ServiceConnectedEvent) msg.obj;
+                    handleServiceConnected(event.componentName, event.iBinder);
+                    return true;
+                case MSG_SERVICE_DISCONNECTED:
+                    handleServiceDisconnected((ComponentName) msg.obj);
+                    return true;
+                case MSG_RETRY_LISTENER_QUEUE:
+                    handleRetryListenerQueue((ComponentName) msg.obj);
+                    return true;
+            }
+            return false;
+        }
+
+        private void handleQueueTask(Task task) {
+            updateListenerMap();
+            for (ListenerRecord record : mRecordMap.values()) {
+                record.taskQueue.add(task);
+                processListenerQueue(record);
+            }
+        }
+
+        private void handleServiceConnected(ComponentName componentName, IBinder iBinder) {
+            ListenerRecord record = mRecordMap.get(componentName);
+            if (record != null) {
+                record.service = INotificationSideChannel.Stub.asInterface(iBinder);
+                record.retryCount = 0;
+                processListenerQueue(record);
+            }
+        }
+
+        private void handleServiceDisconnected(ComponentName componentName) {
+            ListenerRecord record = mRecordMap.get(componentName);
+            if (record != null) {
+                ensureServiceUnbound(record);
+            }
+        }
+
+        private void handleRetryListenerQueue(ComponentName componentName) {
+            ListenerRecord record = mRecordMap.get(componentName);
+            if (record != null) {
+                processListenerQueue(record);
+            }
+        }
+
+        @Override
+        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
+            if (Log.isLoggable(TAG, Log.DEBUG)) {
+                Log.d(TAG, "Connected to service " + componentName);
+            }
+            mHandler.obtainMessage(MSG_SERVICE_CONNECTED,
+                    new ServiceConnectedEvent(componentName, iBinder))
+                    .sendToTarget();
+        }
+
+        @Override
+        public void onServiceDisconnected(ComponentName componentName) {
+            if (Log.isLoggable(TAG, Log.DEBUG)) {
+                Log.d(TAG, "Disconnected from service " + componentName);
+            }
+            mHandler.obtainMessage(MSG_SERVICE_DISCONNECTED, componentName).sendToTarget();
+        }
+
+        /**
+         * Check the current list of enabled listener packages and update the records map
+         * accordingly.
+         */
+        private void updateListenerMap() {
+            Set<String> enabledPackages = getEnabledListenerPackages(mContext);
+            if (enabledPackages.equals(mCachedEnabledPackages)) {
+                // Short-circuit when the list of enabled packages has not changed.
+                return;
+            }
+            mCachedEnabledPackages = enabledPackages;
+            List<ResolveInfo> resolveInfos = mContext.getPackageManager().queryIntentServices(
+                    new Intent().setAction(ACTION_BIND_SIDE_CHANNEL), PackageManager.GET_SERVICES);
+            Set<ComponentName> enabledComponents = new HashSet<ComponentName>();
+            for (ResolveInfo resolveInfo : resolveInfos) {
+                if (!enabledPackages.contains(resolveInfo.serviceInfo.packageName)) {
+                    continue;
+                }
+                ComponentName componentName = new ComponentName(
+                        resolveInfo.serviceInfo.packageName, resolveInfo.serviceInfo.name);
+                if (resolveInfo.serviceInfo.permission != null) {
+                    Log.w(TAG, "Permission present on component " + componentName
+                            + ", not adding listener record.");
+                    continue;
+                }
+                enabledComponents.add(componentName);
+            }
+            // Ensure all enabled components have a record in the listener map.
+            for (ComponentName componentName : enabledComponents) {
+                if (!mRecordMap.containsKey(componentName)) {
+                    if (Log.isLoggable(TAG, Log.DEBUG)) {
+                        Log.d(TAG, "Adding listener record for " + componentName);
+                    }
+                    mRecordMap.put(componentName, new ListenerRecord(componentName));
+                }
+            }
+            // Remove listener records that are no longer for enabled components.
+            Iterator<Map.Entry<ComponentName, ListenerRecord>> it =
+                    mRecordMap.entrySet().iterator();
+            while (it.hasNext()) {
+                Map.Entry<ComponentName, ListenerRecord> entry = it.next();
+                if (!enabledComponents.contains(entry.getKey())) {
+                    if (Log.isLoggable(TAG, Log.DEBUG)) {
+                        Log.d(TAG, "Removing listener record for " + entry.getKey());
+                    }
+                    ensureServiceUnbound(entry.getValue());
+                    it.remove();
+                }
+            }
+        }
+
+        /**
+         * Ensure we are already attempting to bind to a service, or start a new binding if not.
+         * @return Whether the service bind attempt was successful.
+         */
+        private boolean ensureServiceBound(ListenerRecord record) {
+            if (record.bound) {
+                return true;
+            }
+            Intent intent = new Intent(ACTION_BIND_SIDE_CHANNEL).setComponent(record.componentName);
+            record.bound = mContext.bindService(intent, this, SIDE_CHANNEL_BIND_FLAGS);
+            if (record.bound) {
+                record.retryCount = 0;
+            } else {
+                Log.w(TAG, "Unable to bind to listener " + record.componentName);
+                mContext.unbindService(this);
+            }
+            return record.bound;
+        }
+
+        /**
+         * Ensure we have unbound from a service.
+         */
+        private void ensureServiceUnbound(ListenerRecord record) {
+            if (record.bound) {
+                mContext.unbindService(this);
+                record.bound = false;
+            }
+            record.service = null;
+        }
+
+        /**
+         * Schedule a delayed retry to communicate with a listener service.
+         * After a maximum number of attempts (with exponential back-off), start
+         * dropping pending tasks for this listener.
+         */
+        private void scheduleListenerRetry(ListenerRecord record) {
+            if (mHandler.hasMessages(MSG_RETRY_LISTENER_QUEUE, record.componentName)) {
+                return;
+            }
+            record.retryCount++;
+            if (record.retryCount > SIDE_CHANNEL_RETRY_MAX_COUNT) {
+                Log.w(TAG, "Giving up on delivering " + record.taskQueue.size() + " tasks to "
+                        + record.componentName + " after " + record.retryCount + " retries");
+                record.taskQueue.clear();
+                return;
+            }
+            int delayMs = SIDE_CHANNEL_RETRY_BASE_INTERVAL_MS * (1 << (record.retryCount - 1));
+            if (Log.isLoggable(TAG, Log.DEBUG)) {
+                Log.d(TAG, "Scheduling retry for " + delayMs + " ms");
+            }
+            Message msg = mHandler.obtainMessage(MSG_RETRY_LISTENER_QUEUE, record.componentName);
+            mHandler.sendMessageDelayed(msg, delayMs);
+        }
+
+        /**
+         * Perform a processing step for a listener. First check the bind state, then attempt
+         * to flush the task queue, and if an error is encountered, schedule a retry.
+         */
+        private void processListenerQueue(ListenerRecord record) {
+            if (Log.isLoggable(TAG, Log.DEBUG)) {
+                Log.d(TAG, "Processing component " + record.componentName + ", "
+                        + record.taskQueue.size() + " queued tasks");
+            }
+            if (record.taskQueue.isEmpty()) {
+                return;
+            }
+            if (!ensureServiceBound(record) || record.service == null) {
+                // Ensure bind has started and that a service interface is ready to use.
+                scheduleListenerRetry(record);
+                return;
+            }
+            // Attempt to flush all items in the task queue.
+            while (true) {
+                Task task = record.taskQueue.peek();
+                if (task == null) {
+                    break;
+                }
+                try {
+                    if (Log.isLoggable(TAG, Log.DEBUG)) {
+                        Log.d(TAG, "Sending task " + task);
+                    }
+                    task.send(record.service);
+                    record.taskQueue.remove();
+                } catch (DeadObjectException e) {
+                    if (Log.isLoggable(TAG, Log.DEBUG)) {
+                        Log.d(TAG, "Remote service has died: " + record.componentName);
+                    }
+                    break;
+                } catch (RemoteException e) {
+                    Log.w(TAG, "RemoteException communicating with " + record.componentName, e);
+                    break;
+                }
+            }
+            if (!record.taskQueue.isEmpty()) {
+                // Some tasks were not sent, meaning an error was encountered, schedule a retry.
+                scheduleListenerRetry(record);
+            }
+        }
+
+        /** A per-side-channel-service listener state record */
+        private static class ListenerRecord {
+            public final ComponentName componentName;
+            /** Whether the service is currently bound to. */
+            public boolean bound = false;
+            /** The service stub provided by onServiceConnected */
+            public INotificationSideChannel service;
+            /** Queue of pending tasks to send to this listener service */
+            public LinkedList<Task> taskQueue = new LinkedList<Task>();
+            /** Number of retries attempted while connecting to this listener service */
+            public int retryCount = 0;
+
+            public ListenerRecord(ComponentName componentName) {
+                this.componentName = componentName;
+            }
+        }
+    }
+
+    private static class ServiceConnectedEvent {
+        final ComponentName componentName;
+        final IBinder iBinder;
+
+        public ServiceConnectedEvent(ComponentName componentName,
+                final IBinder iBinder) {
+            this.componentName = componentName;
+            this.iBinder = iBinder;
+        }
+    }
+
+    private interface Task {
+        public void send(INotificationSideChannel service) throws RemoteException;
+    }
+
+    private static class NotifyTask implements Task {
+        final String packageName;
+        final int id;
+        final String tag;
+        final Notification notif;
+
+        public NotifyTask(String packageName, int id, String tag, Notification notif) {
+            this.packageName = packageName;
+            this.id = id;
+            this.tag = tag;
+            this.notif = notif;
+        }
+
+        @Override
+        public void send(INotificationSideChannel service) throws RemoteException {
+            service.notify(packageName, id, tag, notif);
+        }
+
+        public String toString() {
+            StringBuilder sb = new StringBuilder("NotifyTask[");
+            sb.append("packageName:").append(packageName);
+            sb.append(", id:").append(id);
+            sb.append(", tag:").append(tag);
+            sb.append("]");
+            return sb.toString();
+        }
+    }
+
+    private static class CancelTask implements Task {
+        final String packageName;
+        final int id;
+        final String tag;
+        final boolean all;
+
+        public CancelTask(String packageName) {
+            this.packageName = packageName;
+            this.id = 0;
+            this.tag = null;
+            this.all = true;
+        }
+
+        public CancelTask(String packageName, int id, String tag) {
+            this.packageName = packageName;
+            this.id = id;
+            this.tag = tag;
+            this.all = false;
+        }
+
+        @Override
+        public void send(INotificationSideChannel service) throws RemoteException {
+            if (all) {
+                service.cancelAll(packageName);
+            } else {
+                service.cancel(packageName, id, tag);
+            }
+        }
+
+        public String toString() {
+            StringBuilder sb = new StringBuilder("CancelTask[");
+            sb.append("packageName:").append(packageName);
+            sb.append(", id:").append(id);
+            sb.append(", tag:").append(tag);
+            sb.append(", all:").append(all);
+            sb.append("]");
+            return sb.toString();
+        }
+    }
+}
diff --git a/compat/java/android/support/v4/app/RemoteInput.java b/compat/java/android/support/v4/app/RemoteInput.java
new file mode 100644
index 0000000..99b018d
--- /dev/null
+++ b/compat/java/android/support/v4/app/RemoteInput.java
@@ -0,0 +1,281 @@
+/*
+ * Copyright (C) 2014 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 android.support.v4.app;
+
+import android.content.Intent;
+import android.os.Build;
+import android.os.Bundle;
+import android.util.Log;
+
+/**
+ * Helper for using the {@link android.app.RemoteInput} API
+ * introduced after API level 4 in a backwards compatible fashion.
+ */
+public final class RemoteInput extends RemoteInputCompatBase.RemoteInput {
+    private static final String TAG = "RemoteInput";
+
+    /** Label used to denote the clip data type used for remote input transport */
+    public static final String RESULTS_CLIP_LABEL = RemoteInputCompatJellybean.RESULTS_CLIP_LABEL;
+
+    /** Extra added to a clip data intent object to hold the results bundle. */
+    public static final String EXTRA_RESULTS_DATA = RemoteInputCompatJellybean.EXTRA_RESULTS_DATA;
+
+    private final String mResultKey;
+    private final CharSequence mLabel;
+    private final CharSequence[] mChoices;
+    private final boolean mAllowFreeFormInput;
+    private final Bundle mExtras;
+
+    private RemoteInput(String resultKey, CharSequence label, CharSequence[] choices,
+            boolean allowFreeFormInput, Bundle extras) {
+        this.mResultKey = resultKey;
+        this.mLabel = label;
+        this.mChoices = choices;
+        this.mAllowFreeFormInput = allowFreeFormInput;
+        this.mExtras = extras;
+    }
+
+    /**
+     * Get the key that the result of this input will be set in from the Bundle returned by
+     * {@link #getResultsFromIntent} when the {@link android.app.PendingIntent} is sent.
+     */
+    @Override
+    public String getResultKey() {
+        return mResultKey;
+    }
+
+    /**
+     * Get the label to display to users when collecting this input.
+     */
+    @Override
+    public CharSequence getLabel() {
+        return mLabel;
+    }
+
+    /**
+     * Get possible input choices. This can be {@code null} if there are no choices to present.
+     */
+    @Override
+    public CharSequence[] getChoices() {
+        return mChoices;
+    }
+
+    /**
+     * Get whether or not users can provide an arbitrary value for
+     * input. If you set this to {@code false}, users must select one of the
+     * choices in {@link #getChoices}. An {@link IllegalArgumentException} is thrown
+     * if you set this to false and {@link #getChoices} returns {@code null} or empty.
+     */
+    @Override
+    public boolean getAllowFreeFormInput() {
+        return mAllowFreeFormInput;
+    }
+
+    /**
+     * Get additional metadata carried around with this remote input.
+     */
+    @Override
+    public Bundle getExtras() {
+        return mExtras;
+    }
+
+    /**
+     * Builder class for {@link android.support.v4.app.RemoteInput} objects.
+     */
+    public static final class Builder {
+        private final String mResultKey;
+        private CharSequence mLabel;
+        private CharSequence[] mChoices;
+        private boolean mAllowFreeFormInput = true;
+        private Bundle mExtras = new Bundle();
+
+        /**
+         * Create a builder object for {@link android.support.v4.app.RemoteInput} objects.
+         * @param resultKey the Bundle key that refers to this input when collected from the user
+         */
+        public Builder(String resultKey) {
+            if (resultKey == null) {
+                throw new IllegalArgumentException("Result key can't be null");
+            }
+            mResultKey = resultKey;
+        }
+
+        /**
+         * Set a label to be displayed to the user when collecting this input.
+         * @param label The label to show to users when they input a response.
+         * @return this object for method chaining
+         */
+        public Builder setLabel(CharSequence label) {
+            mLabel = label;
+            return this;
+        }
+
+        /**
+         * Specifies choices available to the user to satisfy this input.
+         * @param choices an array of pre-defined choices for users input.
+         *        You must provide a non-null and non-empty array if
+         *        you disabled free form input using {@link #setAllowFreeFormInput}.
+         * @return this object for method chaining
+         */
+        public Builder setChoices(CharSequence[] choices) {
+            mChoices = choices;
+            return this;
+        }
+
+        /**
+         * Specifies whether the user can provide arbitrary values.
+         *
+         * @param allowFreeFormInput The default is {@code true}.
+         *         If you specify {@code false}, you must provide a non-null
+         *         and non-empty array to {@link #setChoices} or an
+         *         {@link IllegalArgumentException} is thrown.
+         * @return this object for method chaining
+         */
+        public Builder setAllowFreeFormInput(boolean allowFreeFormInput) {
+            mAllowFreeFormInput = allowFreeFormInput;
+            return this;
+        }
+
+        /**
+         * Merge additional metadata into this builder.
+         *
+         * <p>Values within the Bundle will replace existing extras values in this Builder.
+         *
+         * @see RemoteInput#getExtras
+         */
+        public Builder addExtras(Bundle extras) {
+            if (extras != null) {
+                mExtras.putAll(extras);
+            }
+            return this;
+        }
+
+        /**
+         * Get the metadata Bundle used by this Builder.
+         *
+         * <p>The returned Bundle is shared with this Builder.
+         */
+        public Bundle getExtras() {
+            return mExtras;
+        }
+
+        /**
+         * Combine all of the options that have been set and return a new
+         * {@link android.support.v4.app.RemoteInput} object.
+         */
+        public RemoteInput build() {
+            return new RemoteInput(mResultKey, mLabel, mChoices, mAllowFreeFormInput, mExtras);
+        }
+    }
+
+    /**
+     * Get the remote input results bundle from an intent. The returned Bundle will
+     * contain a key/value for every result key populated by remote input collector.
+     * Use the {@link Bundle#getCharSequence(String)} method to retrieve a value.
+     * @param intent The intent object that fired in response to an action or content intent
+     *               which also had one or more remote input requested.
+     */
+    public static Bundle getResultsFromIntent(Intent intent) {
+        return IMPL.getResultsFromIntent(intent);
+    }
+
+    /**
+     * Populate an intent object with the results gathered from remote input. This method
+     * should only be called by remote input collection services when sending results to a
+     * pending intent.
+     * @param remoteInputs The remote inputs for which results are being provided
+     * @param intent The intent to add remote inputs to. The {@link android.content.ClipData}
+     *               field of the intent will be modified to contain the results.
+     * @param results A bundle holding the remote input results. This bundle should
+     *                be populated with keys matching the result keys specified in
+     *                {@code remoteInputs} with values being the result per key.
+     */
+    public static void addResultsToIntent(RemoteInput[] remoteInputs, Intent intent,
+            Bundle results) {
+        IMPL.addResultsToIntent(remoteInputs, intent, results);
+    }
+
+    private static final Impl IMPL;
+
+    interface Impl {
+        Bundle getResultsFromIntent(Intent intent);
+        void addResultsToIntent(RemoteInput[] remoteInputs, Intent intent,
+                Bundle results);
+    }
+
+    static class ImplBase implements Impl {
+        @Override
+        public Bundle getResultsFromIntent(Intent intent) {
+            Log.w(TAG, "RemoteInput is only supported from API Level 16");
+            return null;
+        }
+
+        @Override
+        public void addResultsToIntent(RemoteInput[] remoteInputs, Intent intent, Bundle results) {
+            Log.w(TAG, "RemoteInput is only supported from API Level 16");
+        }
+    }
+
+    static class ImplJellybean implements Impl {
+        @Override
+        public Bundle getResultsFromIntent(Intent intent) {
+            return RemoteInputCompatJellybean.getResultsFromIntent(intent);
+        }
+
+        @Override
+        public void addResultsToIntent(RemoteInput[] remoteInputs, Intent intent, Bundle results) {
+            RemoteInputCompatJellybean.addResultsToIntent(remoteInputs, intent, results);
+        }
+    }
+
+    static class ImplApi20 implements Impl {
+        @Override
+        public Bundle getResultsFromIntent(Intent intent) {
+            return RemoteInputCompatApi20.getResultsFromIntent(intent);
+        }
+
+        @Override
+        public void addResultsToIntent(RemoteInput[] remoteInputs, Intent intent, Bundle results) {
+            RemoteInputCompatApi20.addResultsToIntent(remoteInputs, intent, results);
+        }
+    }
+
+    static {
+        if (Build.VERSION.SDK_INT >= 20) {
+            IMPL = new ImplApi20();
+        } else if (Build.VERSION.SDK_INT >= 16) {
+            IMPL = new ImplJellybean();
+        } else {
+            IMPL = new ImplBase();
+        }
+    }
+
+    /** @hide */
+    public static final Factory FACTORY = new Factory() {
+        @Override
+        public RemoteInput build(String resultKey,
+                CharSequence label, CharSequence[] choices, boolean allowFreeFormInput,
+                Bundle extras) {
+            return new RemoteInput(resultKey, label, choices, allowFreeFormInput, extras);
+        }
+
+        @Override
+        public RemoteInput[] newArray(int size) {
+            return new RemoteInput[size];
+        }
+    };
+}
diff --git a/v4/java/android/support/v4/app/ServiceCompat.java b/compat/java/android/support/v4/app/ServiceCompat.java
similarity index 100%
rename from v4/java/android/support/v4/app/ServiceCompat.java
rename to compat/java/android/support/v4/app/ServiceCompat.java
diff --git a/compat/java/android/support/v4/app/ShareCompat.java b/compat/java/android/support/v4/app/ShareCompat.java
new file mode 100644
index 0000000..27dc48f
--- /dev/null
+++ b/compat/java/android/support/v4/app/ShareCompat.java
@@ -0,0 +1,963 @@
+/*
+ * 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 android.support.v4.app;
+
+import android.app.Activity;
+import android.content.ComponentName;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.graphics.drawable.Drawable;
+import android.net.Uri;
+import android.os.Build;
+import android.support.annotation.StringRes;
+import android.support.v4.content.IntentCompat;
+import android.support.v4.view.MenuItemCompat;
+import android.text.Html;
+import android.text.Spanned;
+import android.util.Log;
+import android.view.Menu;
+import android.view.MenuItem;
+
+import java.util.ArrayList;
+
+/**
+ * Extra helper functionality for sharing data between activities.
+ *
+ * ShareCompat provides functionality to extend the {@link Intent#ACTION_SEND}/
+ * {@link Intent#ACTION_SEND_MULTIPLE} protocol and support retrieving more info
+ * about the activity that invoked a social sharing action.
+ *
+ * {@link IntentBuilder} provides helper functions for constructing a sharing
+ * intent that always includes data about the calling activity and app.
+ * This lets the called activity provide attribution for the app that shared
+ * content. Constructing an intent this way can be done in a method-chaining style.
+ * To obtain an IntentBuilder with info about your calling activity, use the static
+ * method {@link IntentBuilder#from(Activity)}.
+ *
+ * {@link IntentReader} provides helper functions for parsing the defined extras
+ * within an {@link Intent#ACTION_SEND} or {@link Intent#ACTION_SEND_MULTIPLE} intent
+ * used to launch an activity. You can also obtain a Drawable for the caller's
+ * application icon and the application's localized label (the app's human-readable name).
+ * Social apps that enable sharing content are encouraged to use this information
+ * to call out the app that the content was shared from.
+ */
+public final class ShareCompat {
+    /**
+     * Intent extra that stores the name of the calling package for an ACTION_SEND intent.
+     * When an activity is started using startActivityForResult this is redundant info.
+     * (It is also provided by {@link Activity#getCallingPackage()}.)
+     *
+     * Instead of using this constant directly, consider using {@link #getCallingPackage(Activity)}
+     * or {@link IntentReader#getCallingPackage()}.
+     */
+    public static final String EXTRA_CALLING_PACKAGE =
+            "android.support.v4.app.EXTRA_CALLING_PACKAGE";
+
+    /**
+     * Intent extra that stores the {@link ComponentName} of the calling activity for
+     * an ACTION_SEND intent.
+     */
+    public static final String EXTRA_CALLING_ACTIVITY =
+            "android.support.v4.app.EXTRA_CALLING_ACTIVITY";
+
+    /**
+     * Compatibility shims for sharing operations
+     */
+    interface ShareCompatImpl {
+        void configureMenuItem(MenuItem item, IntentBuilder shareIntent);
+        String escapeHtml(CharSequence text);
+    }
+
+    static class ShareCompatImplBase implements ShareCompatImpl {
+        @Override
+        public void configureMenuItem(MenuItem item, IntentBuilder shareIntent) {
+            item.setIntent(shareIntent.createChooserIntent());
+        }
+
+        @Override
+        public String escapeHtml(CharSequence text) {
+            StringBuilder out = new StringBuilder();
+            withinStyle(out, text, 0, text.length());
+            return out.toString();
+        }
+
+        private static void withinStyle(StringBuilder out, CharSequence text,
+                int start, int end) {
+            for (int i = start; i < end; i++) {
+                char c = text.charAt(i);
+
+                if (c == '<') {
+                    out.append("&lt;");
+                } else if (c == '>') {
+                    out.append("&gt;");
+                } else if (c == '&') {
+                    out.append("&amp;");
+                } else if (c > 0x7E || c < ' ') {
+                    out.append("&#" + ((int) c) + ";");
+                } else if (c == ' ') {
+                    while (i + 1 < end && text.charAt(i + 1) == ' ') {
+                        out.append("&nbsp;");
+                        i++;
+                    }
+
+                    out.append(' ');
+                } else {
+                    out.append(c);
+                }
+            }
+        }
+    }
+
+    static class ShareCompatImplICS extends ShareCompatImplBase {
+        @Override
+        public void configureMenuItem(MenuItem item, IntentBuilder shareIntent) {
+            ShareCompatICS.configureMenuItem(item, shareIntent.getActivity(),
+                    shareIntent.getIntent());
+            if (shouldAddChooserIntent(item)) {
+                item.setIntent(shareIntent.createChooserIntent());
+            }
+        }
+
+        boolean shouldAddChooserIntent(MenuItem item) {
+            return !item.hasSubMenu();
+        }
+    }
+
+    static class ShareCompatImplJB extends ShareCompatImplICS {
+        @Override
+        public String escapeHtml(CharSequence html) {
+            return ShareCompatJB.escapeHtml(html);
+        }
+
+        @Override
+        boolean shouldAddChooserIntent(MenuItem item) {
+            return false;
+        }
+    }
+
+    private static ShareCompatImpl IMPL;
+
+    static {
+        if (Build.VERSION.SDK_INT >= 16) {
+            IMPL = new ShareCompatImplJB();
+        } else if (Build.VERSION.SDK_INT >= 14) {
+            IMPL = new ShareCompatImplICS();
+        } else {
+            IMPL = new ShareCompatImplBase();
+        }
+    }
+
+    private ShareCompat() {}
+
+    /**
+     * Retrieve the name of the package that launched calledActivity from a share intent.
+     * Apps that provide social sharing functionality can use this to provide attribution
+     * for the app that shared the content.
+     *
+     * <p><em>Note:</em> This data may have been provided voluntarily by the calling
+     * application. As such it should not be trusted for accuracy in the context of
+     * security or verification.</p>
+     *
+     * @param calledActivity Current activity that was launched to share content
+     * @return Name of the calling package
+     */
+    public static String getCallingPackage(Activity calledActivity) {
+        String result = calledActivity.getCallingPackage();
+        if (result == null) {
+            result = calledActivity.getIntent().getStringExtra(EXTRA_CALLING_PACKAGE);
+        }
+        return result;
+    }
+
+    /**
+     * Retrieve the ComponentName of the activity that launched calledActivity from a share intent.
+     * Apps that provide social sharing functionality can use this to provide attribution
+     * for the app that shared the content.
+     *
+     * <p><em>Note:</em> This data may have been provided voluntarily by the calling
+     * application. As such it should not be trusted for accuracy in the context of
+     * security or verification.</p>
+     *
+     * @param calledActivity Current activity that was launched to share content
+     * @return ComponentName of the calling activity
+     */
+    public static ComponentName getCallingActivity(Activity calledActivity) {
+        ComponentName result = calledActivity.getCallingActivity();
+        if (result == null) {
+            result = calledActivity.getIntent().getParcelableExtra(EXTRA_CALLING_ACTIVITY);
+        }
+        return result;
+    }
+
+    /**
+     * Configure a {@link MenuItem} to act as a sharing action.
+     *
+     * <p>If the app is running on API level 14 or higher (Android 4.0/Ice Cream Sandwich)
+     * this method will configure a ShareActionProvider to provide a more robust UI
+     * for selecting the target of the share. History will be tracked for each calling
+     * activity in a file named with the prefix ".sharecompat_" in the application's
+     * private data directory. If the application wishes to set this MenuItem to show
+     * as an action in the Action Bar it should use
+     * {@link MenuItemCompat#setShowAsAction(MenuItem, int)} to request that behavior
+     * in addition to calling this method.</p>
+     *
+     * <p>If the app is running on an older platform version this method will configure
+     * a standard activity chooser dialog for the menu item.</p>
+     *
+     * <p>During the calling activity's lifecycle, if data within the share intent must
+     * change the app should change that state in one of several ways:</p>
+     * <ul>
+     * <li>Call {@link ActivityCompat#invalidateOptionsMenu(Activity)}. If the app is running
+     * on API level 11 or above and uses the Action Bar its menu will be recreated and rebuilt.
+     * If not, the activity will receive a call to {@link Activity#onPrepareOptionsMenu(Menu)}
+     * the next time the user presses the menu key to open the options menu panel. The activity
+     * can then call configureMenuItem again with a new or altered IntentBuilder to reconfigure
+     * the share menu item.</li>
+     * <li>Keep a reference to the MenuItem object for the share item once it has been created
+     * and call configureMenuItem to update the associated sharing intent as needed.</li>
+     * </ul>
+     *
+     * @param item MenuItem to configure for sharing
+     * @param shareIntent IntentBuilder with data about the content to share
+     */
+    public static void configureMenuItem(MenuItem item, IntentBuilder shareIntent) {
+        IMPL.configureMenuItem(item, shareIntent);
+    }
+
+    /**
+     * Configure a menu item to act as a sharing action.
+     *
+     * @param menu Menu containing the item to use for sharing
+     * @param menuItemId ID of the share item within menu
+     * @param shareIntent IntentBuilder with data about the content to share
+     * @see #configureMenuItem(MenuItem, IntentBuilder)
+     */
+    public static void configureMenuItem(Menu menu, int menuItemId, IntentBuilder shareIntent) {
+        MenuItem item = menu.findItem(menuItemId);
+        if (item == null) {
+            throw new IllegalArgumentException("Could not find menu item with id " + menuItemId +
+                    " in the supplied menu");
+        }
+        configureMenuItem(item, shareIntent);
+    }
+
+    /**
+     * IntentBuilder is a helper for constructing {@link Intent#ACTION_SEND} and
+     * {@link Intent#ACTION_SEND_MULTIPLE} sharing intents and starting activities
+     * to share content. The ComponentName and package name of the calling activity
+     * will be included.
+     */
+    public static class IntentBuilder {
+        private Activity mActivity;
+        private Intent mIntent;
+        private CharSequence mChooserTitle;
+        private ArrayList<String> mToAddresses;
+        private ArrayList<String> mCcAddresses;
+        private ArrayList<String> mBccAddresses;
+
+        private ArrayList<Uri> mStreams;
+
+        /**
+         * Create a new IntentBuilder for launching a sharing action from launchingActivity.
+         *
+         * @param launchingActivity Activity that the share will be launched from
+         * @return a new IntentBuilder instance
+         */
+        public static IntentBuilder from(Activity launchingActivity) {
+            return new IntentBuilder(launchingActivity);
+        }
+
+        private IntentBuilder(Activity launchingActivity) {
+            mActivity = launchingActivity;
+            mIntent = new Intent().setAction(Intent.ACTION_SEND);
+            mIntent.putExtra(EXTRA_CALLING_PACKAGE, launchingActivity.getPackageName());
+            mIntent.putExtra(EXTRA_CALLING_ACTIVITY, launchingActivity.getComponentName());
+            mIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
+        }
+
+        /**
+         * Retrieve the Intent as configured so far by the IntentBuilder. This Intent
+         * is suitable for use in a ShareActionProvider or chooser dialog.
+         *
+         * <p>To create an intent that will launch the activity chooser so that the user
+         * may select a target for the share, see {@link #createChooserIntent()}.
+         *
+         * @return The current Intent being configured by this builder
+         */
+        public Intent getIntent() {
+            if (mToAddresses != null) {
+                combineArrayExtra(Intent.EXTRA_EMAIL, mToAddresses);
+                mToAddresses = null;
+            }
+            if (mCcAddresses != null) {
+                combineArrayExtra(Intent.EXTRA_CC, mCcAddresses);
+                mCcAddresses = null;
+            }
+            if (mBccAddresses != null) {
+                combineArrayExtra(Intent.EXTRA_BCC, mBccAddresses);
+                mBccAddresses = null;
+            }
+
+            // Check if we need to change the action.
+            boolean needsSendMultiple = mStreams != null && mStreams.size() > 1;
+            boolean isSendMultiple = mIntent.getAction().equals(Intent.ACTION_SEND_MULTIPLE);
+
+            if (!needsSendMultiple && isSendMultiple) {
+                // Change back to a single send action; place the first stream into the
+                // intent for single sharing.
+                mIntent.setAction(Intent.ACTION_SEND);
+                if (mStreams != null && !mStreams.isEmpty()) {
+                    mIntent.putExtra(Intent.EXTRA_STREAM, mStreams.get(0));
+                } else {
+                    mIntent.removeExtra(Intent.EXTRA_STREAM);
+                }
+                mStreams = null;
+            }
+
+            if (needsSendMultiple && !isSendMultiple) {
+                // Change to a multiple send action; place the relevant ArrayList into the
+                // intent for multiple sharing.
+                mIntent.setAction(Intent.ACTION_SEND_MULTIPLE);
+                if (mStreams != null && !mStreams.isEmpty()) {
+                    mIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, mStreams);
+                } else {
+                    mIntent.removeExtra(Intent.EXTRA_STREAM);
+                }
+            }
+
+            return mIntent;
+        }
+
+        Activity getActivity() {
+            return mActivity;
+        }
+
+        private void combineArrayExtra(String extra, ArrayList<String> add) {
+            String[] currentAddresses = mIntent.getStringArrayExtra(extra);
+            int currentLength = currentAddresses != null ? currentAddresses.length : 0;
+            String[] finalAddresses = new String[currentLength + add.size()];
+            add.toArray(finalAddresses);
+            if (currentAddresses != null) {
+                System.arraycopy(currentAddresses, 0, finalAddresses, add.size(), currentLength);
+            }
+            mIntent.putExtra(extra, finalAddresses);
+        }
+
+        private void combineArrayExtra(String extra, String[] add) {
+            // Add any items still pending
+            Intent intent = getIntent();
+            String[] old = intent.getStringArrayExtra(extra);
+            int oldLength = old != null ? old.length : 0;
+            String[] result = new String[oldLength + add.length];
+            if (old != null) System.arraycopy(old, 0, result, 0, oldLength);
+            System.arraycopy(add, 0, result, oldLength, add.length);
+            intent.putExtra(extra, result);
+        }
+
+        /**
+         * Create an Intent that will launch the standard Android activity chooser,
+         * allowing the user to pick what activity/app on the system should handle
+         * the share.
+         *
+         * @return A chooser Intent for the currently configured sharing action
+         */
+        public Intent createChooserIntent() {
+            return Intent.createChooser(getIntent(), mChooserTitle);
+        }
+
+        /**
+         * Start a chooser activity for the current share intent.
+         *
+         * <p>Note that under most circumstances you should use
+         * {@link ShareCompat#configureMenuItem(MenuItem, IntentBuilder)
+         *  ShareCompat.configureMenuItem()} to add a Share item to the menu while
+         * presenting a detail view of the content to be shared instead
+         * of invoking this directly.</p>
+         */
+        public void startChooser() {
+            mActivity.startActivity(createChooserIntent());
+        }
+
+        /**
+         * Set the title that will be used for the activity chooser for this share.
+         *
+         * @param title Title string
+         * @return This IntentBuilder for method chaining
+         */
+        public IntentBuilder setChooserTitle(CharSequence title) {
+            mChooserTitle = title;
+            return this;
+        }
+
+        /**
+         * Set the title that will be used for the activity chooser for this share.
+         *
+         * @param resId Resource ID of the title string to use
+         * @return This IntentBuilder for method chaining
+         */
+        public IntentBuilder setChooserTitle(@StringRes int resId) {
+            return setChooserTitle(mActivity.getText(resId));
+        }
+
+        /**
+         * Set the type of data being shared
+         *
+         * @param mimeType mimetype of the shared data
+         * @return This IntentBuilder for method chaining
+         * @see Intent#setType(String)
+         */
+        public IntentBuilder setType(String mimeType) {
+            mIntent.setType(mimeType);
+            return this;
+        }
+
+        /**
+         * Set the literal text data to be sent as part of the share.
+         * This may be a styled CharSequence.
+         *
+         * @param text Text to share
+         * @return This IntentBuilder for method chaining
+         * @see Intent#EXTRA_TEXT
+         */
+        public IntentBuilder setText(CharSequence text) {
+            mIntent.putExtra(Intent.EXTRA_TEXT, text);
+            return this;
+        }
+
+        /**
+         * Set an HTML string to be sent as part of the share.
+         * If {@link Intent#EXTRA_TEXT EXTRA_TEXT} has not already been supplied,
+         * a styled version of the supplied HTML text will be added as EXTRA_TEXT as
+         * parsed by {@link android.text.Html#fromHtml(String) Html.fromHtml}.
+         *
+         * @param htmlText A string containing HTML markup as a richer version of the text
+         *                 provided by EXTRA_TEXT.
+         * @return This IntentBuilder for method chaining
+         * @see #setText(CharSequence)
+         */
+        public IntentBuilder setHtmlText(String htmlText) {
+            mIntent.putExtra(IntentCompat.EXTRA_HTML_TEXT, htmlText);
+            if (!mIntent.hasExtra(Intent.EXTRA_TEXT)) {
+                // Supply a default if EXTRA_TEXT isn't set
+                setText(Html.fromHtml(htmlText));
+            }
+            return this;
+        }
+
+        /**
+         * Set a stream URI to the data that should be shared.
+         *
+         * <p>This replaces all currently set stream URIs and will produce a single-stream
+         * ACTION_SEND intent.</p>
+         *
+         * @param streamUri URI of the stream to share
+         * @return This IntentBuilder for method chaining
+         * @see Intent#EXTRA_STREAM
+         */
+        public IntentBuilder setStream(Uri streamUri) {
+            if (!mIntent.getAction().equals(Intent.ACTION_SEND)) {
+                mIntent.setAction(Intent.ACTION_SEND);
+            }
+            mStreams = null;
+            mIntent.putExtra(Intent.EXTRA_STREAM, streamUri);
+            return this;
+        }
+
+        /**
+         * Add a stream URI to the data that should be shared. If this is not the first
+         * stream URI added the final intent constructed will become an ACTION_SEND_MULTIPLE
+         * intent. Not all apps will handle both ACTION_SEND and ACTION_SEND_MULTIPLE.
+         *
+         * @param streamUri URI of the stream to share
+         * @return This IntentBuilder for method chaining
+         * @see Intent#EXTRA_STREAM
+         * @see Intent#ACTION_SEND
+         * @see Intent#ACTION_SEND_MULTIPLE
+         */
+        public IntentBuilder addStream(Uri streamUri) {
+            Uri currentStream = mIntent.getParcelableExtra(Intent.EXTRA_STREAM);
+            if (mStreams == null && currentStream == null) {
+                return setStream(streamUri);
+            }
+            if (mStreams == null) {
+                mStreams = new ArrayList<Uri>();
+            }
+            if (currentStream != null) {
+                mIntent.removeExtra(Intent.EXTRA_STREAM);
+                mStreams.add(currentStream);
+            }
+            mStreams.add(streamUri);
+            return this;
+        }
+
+        /**
+         * Set an array of email addresses as recipients of this share.
+         * This replaces all current "to" recipients that have been set so far.
+         *
+         * @param addresses Email addresses to send to
+         * @return This IntentBuilder for method chaining
+         * @see Intent#EXTRA_EMAIL
+         */
+        public IntentBuilder setEmailTo(String[] addresses) {
+            if (mToAddresses != null) {
+                mToAddresses = null;
+            }
+            mIntent.putExtra(Intent.EXTRA_EMAIL, addresses);
+            return this;
+        }
+
+        /**
+         * Add an email address to be used in the "to" field of the final Intent.
+         *
+         * @param address Email address to send to
+         * @return This IntentBuilder for method chaining
+         * @see Intent#EXTRA_EMAIL
+         */
+        public IntentBuilder addEmailTo(String address) {
+            if (mToAddresses == null) {
+                mToAddresses = new ArrayList<String>();
+            }
+            mToAddresses.add(address);
+            return this;
+        }
+
+        /**
+         * Add an array of email addresses to be used in the "to" field of the final Intent.
+         *
+         * @param addresses Email addresses to send to
+         * @return This IntentBuilder for method chaining
+         * @see Intent#EXTRA_EMAIL
+         */
+        public IntentBuilder addEmailTo(String[] addresses) {
+            combineArrayExtra(Intent.EXTRA_EMAIL, addresses);
+            return this;
+        }
+
+        /**
+         * Set an array of email addresses to CC on this share.
+         * This replaces all current "CC" recipients that have been set so far.
+         *
+         * @param addresses Email addresses to CC on the share
+         * @return This IntentBuilder for method chaining
+         * @see Intent#EXTRA_CC
+         */
+        public IntentBuilder setEmailCc(String[] addresses) {
+            mIntent.putExtra(Intent.EXTRA_CC, addresses);
+            return this;
+        }
+
+        /**
+         * Add an email address to be used in the "cc" field of the final Intent.
+         *
+         * @param address Email address to CC
+         * @return This IntentBuilder for method chaining
+         * @see Intent#EXTRA_CC
+         */
+        public IntentBuilder addEmailCc(String address) {
+            if (mCcAddresses == null) {
+                mCcAddresses = new ArrayList<String>();
+            }
+            mCcAddresses.add(address);
+            return this;
+        }
+
+        /**
+         * Add an array of email addresses to be used in the "cc" field of the final Intent.
+         *
+         * @param addresses Email addresses to CC
+         * @return This IntentBuilder for method chaining
+         * @see Intent#EXTRA_CC
+         */
+        public IntentBuilder addEmailCc(String[] addresses) {
+            combineArrayExtra(Intent.EXTRA_CC, addresses);
+            return this;
+        }
+
+        /**
+         * Set an array of email addresses to BCC on this share.
+         * This replaces all current "BCC" recipients that have been set so far.
+         *
+         * @param addresses Email addresses to BCC on the share
+         * @return This IntentBuilder for method chaining
+         * @see Intent#EXTRA_BCC
+         */
+        public IntentBuilder setEmailBcc(String[] addresses) {
+            mIntent.putExtra(Intent.EXTRA_BCC, addresses);
+            return this;
+        }
+
+        /**
+         * Add an email address to be used in the "bcc" field of the final Intent.
+         *
+         * @param address Email address to BCC
+         * @return This IntentBuilder for method chaining
+         * @see Intent#EXTRA_BCC
+         */
+        public IntentBuilder addEmailBcc(String address) {
+            if (mBccAddresses == null) {
+                mBccAddresses = new ArrayList<String>();
+            }
+            mBccAddresses.add(address);
+            return this;
+        }
+
+        /**
+         * Add an array of email addresses to be used in the "bcc" field of the final Intent.
+         *
+         * @param addresses Email addresses to BCC
+         * @return This IntentBuilder for method chaining
+         * @see Intent#EXTRA_BCC
+         */
+        public IntentBuilder addEmailBcc(String[] addresses) {
+            combineArrayExtra(Intent.EXTRA_BCC, addresses);
+            return this;
+        }
+
+        /**
+         * Set a subject heading for this share; useful for sharing via email.
+         *
+         * @param subject Subject heading for this share
+         * @return This IntentBuilder for method chaining
+         * @see Intent#EXTRA_SUBJECT
+         */
+        public IntentBuilder setSubject(String subject) {
+            mIntent.putExtra(Intent.EXTRA_SUBJECT, subject);
+            return this;
+        }
+    }
+
+    /**
+     * IntentReader is a helper for reading the data contained within a sharing (ACTION_SEND)
+     * Intent. It provides methods to parse standard elements included with a share
+     * in addition to extra metadata about the app that shared the content.
+     *
+     * <p>Social sharing apps are encouraged to provide attribution for the app that shared
+     * the content. IntentReader offers access to the application label, calling activity info,
+     * and application icon of the app that shared the content. This data may have been provided
+     * voluntarily by the calling app and should always be displayed to the user before submission
+     * for manual verification. The user should be offered the option to omit this information
+     * from shared posts if desired.</p>
+     *
+     * <p>Activities that intend to receive sharing intents should configure an intent-filter
+     * to accept {@link Intent#ACTION_SEND} intents ("android.intent.action.SEND") and optionally
+     * accept {@link Intent#ACTION_SEND_MULTIPLE} ("android.intent.action.SEND_MULTIPLE") if
+     * the activity is equipped to handle multiple data streams.</p>
+     */
+    public static class IntentReader {
+        private static final String TAG = "IntentReader";
+
+        private Activity mActivity;
+        private Intent mIntent;
+        private String mCallingPackage;
+        private ComponentName mCallingActivity;
+
+        private ArrayList<Uri> mStreams;
+
+        /**
+         * Get an IntentReader for parsing and interpreting the sharing intent
+         * used to start the given activity.
+         *
+         * @param activity Activity that was started to share content
+         * @return IntentReader for parsing sharing data
+         */
+        public static IntentReader from(Activity activity) {
+            return new IntentReader(activity);
+        }
+
+        private IntentReader(Activity activity) {
+            mActivity = activity;
+            mIntent = activity.getIntent();
+            mCallingPackage = ShareCompat.getCallingPackage(activity);
+            mCallingActivity = ShareCompat.getCallingActivity(activity);
+        }
+
+        /**
+         * Returns true if the activity this reader was obtained for was
+         * started with an {@link Intent#ACTION_SEND} or {@link Intent#ACTION_SEND_MULTIPLE}
+         * sharing Intent.
+         *
+         * @return true if the activity was started with an ACTION_SEND
+         *         or ACTION_SEND_MULTIPLE Intent
+         */
+        public boolean isShareIntent() {
+            final String action = mIntent.getAction();
+            return Intent.ACTION_SEND.equals(action) || Intent.ACTION_SEND_MULTIPLE.equals(action);
+        }
+
+        /**
+         * Returns true if the activity this reader was obtained for was started with an
+         * {@link Intent#ACTION_SEND} intent and contains a single shared item.
+         * The shared content should be obtained using either the {@link #getText()}
+         * or {@link #getStream()} methods depending on the type of content shared.
+         *
+         * @return true if the activity was started with an ACTION_SEND intent
+         */
+        public boolean isSingleShare() {
+            return Intent.ACTION_SEND.equals(mIntent.getAction());
+        }
+
+        /**
+         * Returns true if the activity this reader was obtained for was started with an
+         * {@link Intent#ACTION_SEND_MULTIPLE} intent. The Intent may contain more than
+         * one stream item.
+         *
+         * @return true if the activity was started with an ACTION_SEND_MULTIPLE intent
+         */
+        public boolean isMultipleShare() {
+            return Intent.ACTION_SEND_MULTIPLE.equals(mIntent.getAction());
+        }
+
+        /**
+         * Get the mimetype of the data shared to this activity.
+         *
+         * @return mimetype of the shared data
+         * @see Intent#getType()
+         */
+        public String getType() {
+            return mIntent.getType();
+        }
+
+        /**
+         * Get the literal text shared with the target activity.
+         *
+         * @return Literal shared text or null if none was supplied
+         * @see Intent#EXTRA_TEXT
+         */
+        public CharSequence getText() {
+            return mIntent.getCharSequenceExtra(Intent.EXTRA_TEXT);
+        }
+
+        /**
+         * Get the styled HTML text shared with the target activity.
+         * If no HTML text was supplied but {@link Intent#EXTRA_TEXT} contained
+         * styled text, it will be converted to HTML if possible and returned.
+         * If the text provided by {@link Intent#EXTRA_TEXT} was not styled text,
+         * it will be escaped by {@link android.text.Html#escapeHtml(CharSequence)}
+         * and returned. If no text was provided at all, this method will return null.
+         *
+         * @return Styled text provided by the sender as HTML.
+         */
+        public String getHtmlText() {
+            String result = mIntent.getStringExtra(IntentCompat.EXTRA_HTML_TEXT);
+            if (result == null) {
+                CharSequence text = getText();
+                if (text instanceof Spanned) {
+                    result = Html.toHtml((Spanned) text);
+                } else if (text != null) {
+                    result = IMPL.escapeHtml(text);
+                }
+            }
+            return result;
+        }
+
+        /**
+         * Get a URI referring to a data stream shared with the target activity.
+         *
+         * <p>This call will fail if the share intent contains multiple stream items.
+         * If {@link #isMultipleShare()} returns true the application should use
+         * {@link #getStream(int)} and {@link #getStreamCount()} to retrieve the
+         * included stream items.</p>
+         *
+         * @return A URI referring to a data stream to be shared or null if one was not supplied
+         * @see Intent#EXTRA_STREAM
+         */
+        public Uri getStream() {
+            return mIntent.getParcelableExtra(Intent.EXTRA_STREAM);
+        }
+
+        /**
+         * Get the URI of a stream item shared with the target activity.
+         * Index should be in the range [0-getStreamCount()).
+         *
+         * @param index Index of text item to retrieve
+         * @return Requested stream item URI
+         * @see Intent#EXTRA_STREAM
+         * @see Intent#ACTION_SEND_MULTIPLE
+         */
+        public Uri getStream(int index) {
+            if (mStreams == null && isMultipleShare()) {
+                mStreams = mIntent.getParcelableArrayListExtra(Intent.EXTRA_STREAM);
+            }
+            if (mStreams != null) {
+                return mStreams.get(index);
+            }
+            if (index == 0) {
+                return mIntent.getParcelableExtra(Intent.EXTRA_STREAM);
+            }
+            throw new IndexOutOfBoundsException("Stream items available: " + getStreamCount() +
+                    " index requested: " + index);
+        }
+
+        /**
+         * Return the number of stream items shared. The return value will be 0 or 1 if
+         * this was an {@link Intent#ACTION_SEND} intent, or 0 or more if it was an
+         * {@link Intent#ACTION_SEND_MULTIPLE} intent.
+         *
+         * @return Count of text items contained within the Intent
+         */
+        public int getStreamCount() {
+            if (mStreams == null && isMultipleShare()) {
+                mStreams = mIntent.getParcelableArrayListExtra(Intent.EXTRA_STREAM);
+            }
+            if (mStreams != null) {
+                return mStreams.size();
+            }
+            return mIntent.hasExtra(Intent.EXTRA_STREAM) ? 1 : 0;
+        }
+
+        /**
+         * Get an array of Strings, each an email address to share to.
+         *
+         * @return An array of email addresses or null if none were supplied.
+         * @see Intent#EXTRA_EMAIL
+         */
+        public String[] getEmailTo() {
+            return mIntent.getStringArrayExtra(Intent.EXTRA_EMAIL);
+        }
+
+        /**
+         * Get an array of Strings, each an email address to CC on this share.
+         *
+         * @return An array of email addresses or null if none were supplied.
+         * @see Intent#EXTRA_CC
+         */
+        public String[] getEmailCc() {
+            return mIntent.getStringArrayExtra(Intent.EXTRA_CC);
+        }
+
+        /**
+         * Get an array of Strings, each an email address to BCC on this share.
+         *
+         * @return An array of email addresses or null if none were supplied.
+         * @see Intent#EXTRA_BCC
+         */
+        public String[] getEmailBcc() {
+            return mIntent.getStringArrayExtra(Intent.EXTRA_BCC);
+        }
+
+        /**
+         * Get a subject heading for this share; useful when sharing via email.
+         *
+         * @return The subject heading for this share or null if one was not supplied.
+         * @see Intent#EXTRA_SUBJECT
+         */
+        public String getSubject() {
+            return mIntent.getStringExtra(Intent.EXTRA_SUBJECT);
+        }
+
+        /**
+         * Get the name of the package that invoked this sharing intent. If the activity
+         * was not started for a result, IntentBuilder will read this from extra metadata placed
+         * in the Intent by ShareBuilder.
+         *
+         * <p><em>Note:</em> This data may have been provided voluntarily by the calling
+         * application. As such it should not be trusted for accuracy in the context of
+         * security or verification.</p>
+         *
+         * @return Name of the package that started this activity or null if unknown
+         * @see Activity#getCallingPackage()
+         * @see ShareCompat#EXTRA_CALLING_PACKAGE
+         */
+        public String getCallingPackage() {
+            return mCallingPackage;
+        }
+
+        /**
+         * Get the {@link ComponentName} of the Activity that invoked this sharing intent.
+         * If the target sharing activity was not started for a result, IntentBuilder will read
+         * this from extra metadata placed in the intent by ShareBuilder.
+         *
+         * <p><em>Note:</em> This data may have been provided voluntarily by the calling
+         * application. As such it should not be trusted for accuracy in the context of
+         * security or verification.</p>
+         *
+         * @return ComponentName of the calling Activity or null if unknown
+         * @see Activity#getCallingActivity()
+         * @see ShareCompat#EXTRA_CALLING_ACTIVITY
+         */
+        public ComponentName getCallingActivity() {
+            return mCallingActivity;
+        }
+
+        /**
+         * Get the icon of the calling activity as a Drawable if data about
+         * the calling activity is available.
+         *
+         * <p><em>Note:</em> This data may have been provided voluntarily by the calling
+         * application. As such it should not be trusted for accuracy in the context of
+         * security or verification.</p>
+         *
+         * @return The calling Activity's icon or null if unknown
+         */
+        public Drawable getCallingActivityIcon() {
+            if (mCallingActivity == null) return null;
+
+            PackageManager pm = mActivity.getPackageManager();
+            try {
+                return pm.getActivityIcon(mCallingActivity);
+            } catch (NameNotFoundException e) {
+                Log.e(TAG, "Could not retrieve icon for calling activity", e);
+            }
+            return null;
+        }
+
+        /**
+         * Get the icon of the calling application as a Drawable if data
+         * about the calling package is available.
+         *
+         * <p><em>Note:</em> This data may have been provided voluntarily by the calling
+         * application. As such it should not be trusted for accuracy in the context of
+         * security or verification.</p>
+         *
+         * @return The calling application's icon or null if unknown
+         */
+        public Drawable getCallingApplicationIcon() {
+            if (mCallingPackage == null) return null;
+
+            PackageManager pm = mActivity.getPackageManager();
+            try {
+                return pm.getApplicationIcon(mCallingPackage);
+            } catch (NameNotFoundException e) {
+                Log.e(TAG, "Could not retrieve icon for calling application", e);
+            }
+            return null;
+        }
+
+        /**
+         * Get the human-readable label (title) of the calling application if
+         * data about the calling package is available.
+         *
+         * <p><em>Note:</em> This data may have been provided voluntarily by the calling
+         * application. As such it should not be trusted for accuracy in the context of
+         * security or verification.</p>
+         *
+         * @return The calling application's label or null if unknown
+         */
+        public CharSequence getCallingApplicationLabel() {
+            if (mCallingPackage == null) return null;
+
+            PackageManager pm = mActivity.getPackageManager();
+            try {
+                return pm.getApplicationLabel(pm.getApplicationInfo(mCallingPackage, 0));
+            } catch (NameNotFoundException e) {
+                Log.e(TAG, "Could not retrieve label for calling application", e);
+            }
+            return null;
+        }
+    }
+}
diff --git a/compat/java/android/support/v4/app/SharedElementCallback.java b/compat/java/android/support/v4/app/SharedElementCallback.java
new file mode 100644
index 0000000..5c64762
--- /dev/null
+++ b/compat/java/android/support/v4/app/SharedElementCallback.java
@@ -0,0 +1,320 @@
+/*
+ * Copyright (C) 2014 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 android.support.v4.app;
+
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Matrix;
+import android.graphics.Rect;
+import android.graphics.RectF;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.Drawable;
+import android.os.Bundle;
+import android.os.Parcelable;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.ImageView.ScaleType;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Listener provided in
+ * {@link FragmentActivity#setEnterSharedElementCallback(SharedElementCallback)} and
+ * {@link FragmentActivity#setExitSharedElementCallback(SharedElementCallback)}
+ * to monitor the Activity transitions. The events can be used to customize Activity
+ * Transition behavior.
+ */
+public abstract class SharedElementCallback {
+    private Matrix mTempMatrix;
+    private static int MAX_IMAGE_SIZE = (1024 * 1024);
+    private static final String BUNDLE_SNAPSHOT_BITMAP = "sharedElement:snapshot:bitmap";
+    private static final String BUNDLE_SNAPSHOT_IMAGE_SCALETYPE = "sharedElement:snapshot:imageScaleType";
+    private static final String BUNDLE_SNAPSHOT_IMAGE_MATRIX = "sharedElement:snapshot:imageMatrix";
+
+    /**
+     * In Activity Transitions, onSharedElementStart is called immediately before
+     * capturing the start of the shared element state on enter and reenter transitions and
+     * immediately before capturing the end of the shared element state for exit and return
+     * transitions.
+     * <p>
+     * In Fragment Transitions, onSharedElementStart is called immediately before capturing the
+     * start state of all shared element transitions.
+     * <p>
+     * This call can be used to adjust the transition start state by modifying the shared
+     * element Views. Note that no layout step will be executed between onSharedElementStart
+     * and the transition state capture.
+     * <p>
+     * For Activity Transitions, any changes made in {@link #onSharedElementEnd(List, List, List)}
+     * that are not updated during layout should be corrected in onSharedElementStart for exit and
+     * return transitions. For example, rotation or scale will not be affected by layout and
+     * if changed in {@link #onSharedElementEnd(List, List, List)}, it will also have to be reset
+     * in onSharedElementStart again to correct the end state.
+     *
+     * @param sharedElementNames The names of the shared elements that were accepted into
+     *                           the View hierarchy.
+     * @param sharedElements The shared elements that are part of the View hierarchy.
+     * @param sharedElementSnapshots The Views containing snap shots of the shared element
+     *                               from the launching Window. These elements will not
+     *                               be part of the scene, but will be positioned relative
+     *                               to the Window decor View. This list is null for Fragment
+     *                               Transitions.
+     */
+    public void onSharedElementStart(List<String> sharedElementNames,
+            List<View> sharedElements, List<View> sharedElementSnapshots) {}
+
+    /**
+     * In Activity Transitions, onSharedElementEnd is called immediately before
+     * capturing the end of the shared element state on enter and reenter transitions and
+     * immediately before capturing the start of the shared element state for exit and return
+     * transitions.
+     * <p>
+     * In Fragment Transitions, onSharedElementEnd is called immediately before capturing the
+     * end state of all shared element transitions.
+     * <p>
+     * This call can be used to adjust the transition end state by modifying the shared
+     * element Views. Note that no layout step will be executed between onSharedElementEnd
+     * and the transition state capture.
+     * <p>
+     * Any changes made in {@link #onSharedElementStart(List, List, List)} that are not updated
+     * during layout should be corrected in onSharedElementEnd. For example, rotation or scale
+     * will not be affected by layout and if changed in
+     * {@link #onSharedElementStart(List, List, List)}, it will also have to be reset in
+     * onSharedElementEnd again to correct the end state.
+     *
+     * @param sharedElementNames The names of the shared elements that were accepted into
+     *                           the View hierarchy.
+     * @param sharedElements The shared elements that are part of the View hierarchy.
+     * @param sharedElementSnapshots The Views containing snap shots of the shared element
+     *                               from the launching Window. These elements will not
+     *                               be part of the scene, but will be positioned relative
+     *                               to the Window decor View. This list will be null for
+     *                               Fragment Transitions.
+     */
+    public void onSharedElementEnd(List<String> sharedElementNames,
+            List<View> sharedElements, List<View> sharedElementSnapshots) {}
+
+    /**
+     * Called after {@link #onMapSharedElements(java.util.List, java.util.Map)} when
+     * transferring shared elements in. Any shared elements that have no mapping will be in
+     * <var>rejectedSharedElements</var>. The elements remaining in
+     * <var>rejectedSharedElements</var> will be transitioned out of the Scene. If a
+     * View is removed from <var>rejectedSharedElements</var>, it must be handled by the
+     * <code>SharedElementListener</code>.
+     * <p>
+     * Views in rejectedSharedElements will have their position and size set to the
+     * position of the calling shared element, relative to the Window decor View and contain
+     * snapshots of the View from the calling Activity or Fragment. This
+     * view may be safely added to the decor View's overlay to remain in position.
+     * </p>
+     * <p>This method is not called for Fragment Transitions. All rejected shared elements
+     * will be handled by the exit transition.</p>
+     *
+     * @param rejectedSharedElements Views containing visual information of shared elements
+     *                               that are not part of the entering scene. These Views
+     *                               are positioned relative to the Window decor View. A
+     *                               View removed from this list will not be transitioned
+     *                               automatically.
+     */
+    public void onRejectSharedElements(List<View> rejectedSharedElements) {}
+
+    /**
+     * Lets the SharedElementCallback adjust the mapping of shared element names to
+     * Views.
+     *
+     * @param names The names of all shared elements transferred from the calling Activity
+     *              or Fragment in the order they were provided.
+     * @param sharedElements The mapping of shared element names to Views. The best guess
+     *                       will be filled into sharedElements based on the transitionNames.
+     */
+    public void onMapSharedElements(List<String> names, Map<String, View> sharedElements) {}
+
+
+    /**
+     * Creates a snapshot of a shared element to be used by the remote Activity and reconstituted
+     * with {@link #onCreateSnapshotView(android.content.Context, android.os.Parcelable)}. A
+     * null return value will mean that the remote Activity will have a null snapshot View in
+     * {@link #onSharedElementStart(java.util.List, java.util.List, java.util.List)} and
+     * {@link #onSharedElementEnd(java.util.List, java.util.List, java.util.List)}.
+     *
+     * <p>This is not called for Fragment Transitions.</p>
+     *
+     * @param sharedElement The shared element View to create a snapshot for.
+     * @param viewToGlobalMatrix A matrix containing a transform from the view to the screen
+     *                           coordinates.
+     * @param screenBounds The bounds of shared element in screen coordinate space. This is
+     *                     the bounds of the view with the viewToGlobalMatrix applied.
+     * @return A snapshot to send to the remote Activity to be reconstituted with
+     * {@link #onCreateSnapshotView(android.content.Context, android.os.Parcelable)} and passed
+     * into {@link #onSharedElementStart(java.util.List, java.util.List, java.util.List)} and
+     * {@link #onSharedElementEnd(java.util.List, java.util.List, java.util.List)}.
+     */
+    public Parcelable onCaptureSharedElementSnapshot(View sharedElement, Matrix viewToGlobalMatrix,
+            RectF screenBounds) {
+        if (sharedElement instanceof ImageView) {
+            ImageView imageView = ((ImageView) sharedElement);
+            Drawable d = imageView.getDrawable();
+            Drawable bg = imageView.getBackground();
+            if (d != null && bg == null) {
+                Bitmap bitmap = createDrawableBitmap(d);
+                if (bitmap != null) {
+                    Bundle bundle = new Bundle();
+                    bundle.putParcelable(BUNDLE_SNAPSHOT_BITMAP, bitmap);
+                    bundle.putString(BUNDLE_SNAPSHOT_IMAGE_SCALETYPE,
+                            imageView.getScaleType().toString());
+                    if (imageView.getScaleType() == ScaleType.MATRIX) {
+                        Matrix matrix = imageView.getImageMatrix();
+                        float[] values = new float[9];
+                        matrix.getValues(values);
+                        bundle.putFloatArray(BUNDLE_SNAPSHOT_IMAGE_MATRIX, values);
+                    }
+                    return bundle;
+                }
+            }
+        }
+        int bitmapWidth = Math.round(screenBounds.width());
+        int bitmapHeight = Math.round(screenBounds.height());
+        Bitmap bitmap = null;
+        if (bitmapWidth > 0 && bitmapHeight > 0) {
+            float scale = Math.min(1f, ((float)MAX_IMAGE_SIZE) / (bitmapWidth * bitmapHeight));
+            bitmapWidth *= scale;
+            bitmapHeight *= scale;
+            if (mTempMatrix == null) {
+                mTempMatrix = new Matrix();
+            }
+            mTempMatrix.set(viewToGlobalMatrix);
+            mTempMatrix.postTranslate(-screenBounds.left, -screenBounds.top);
+            mTempMatrix.postScale(scale, scale);
+            bitmap = Bitmap.createBitmap(bitmapWidth, bitmapHeight, Bitmap.Config.ARGB_8888);
+            Canvas canvas = new Canvas(bitmap);
+            canvas.concat(mTempMatrix);
+            sharedElement.draw(canvas);
+        }
+        return bitmap;
+    }
+
+    /**
+     * Get a copy of bitmap of given drawable.
+     */
+    private static Bitmap createDrawableBitmap(Drawable drawable) {
+        int width = drawable.getIntrinsicWidth();
+        int height = drawable.getIntrinsicHeight();
+        if (width <= 0 || height <= 0) {
+            return null;
+        }
+        float scale = Math.min(1f, ((float)MAX_IMAGE_SIZE) / (width * height));
+        if (drawable instanceof BitmapDrawable && scale == 1f) {
+            // return same bitmap if scale down not needed
+            return ((BitmapDrawable) drawable).getBitmap();
+        }
+        int bitmapWidth = (int) (width * scale);
+        int bitmapHeight = (int) (height * scale);
+        Bitmap bitmap = Bitmap.createBitmap(bitmapWidth, bitmapHeight, Bitmap.Config.ARGB_8888);
+        Canvas canvas = new Canvas(bitmap);
+        Rect existingBounds = drawable.getBounds();
+        int left = existingBounds.left;
+        int top = existingBounds.top;
+        int right = existingBounds.right;
+        int bottom = existingBounds.bottom;
+        drawable.setBounds(0, 0, bitmapWidth, bitmapHeight);
+        drawable.draw(canvas);
+        drawable.setBounds(left, top, right, bottom);
+        return bitmap;
+    }
+
+    /**
+     * Reconstitutes a snapshot View from a Parcelable returned in
+     * {@link #onCaptureSharedElementSnapshot(android.view.View, android.graphics.Matrix,
+     * android.graphics.RectF)} to be used in {@link #onSharedElementStart(java.util.List,
+     * java.util.List, java.util.List)} and {@link #onSharedElementEnd(java.util.List,
+     * java.util.List, java.util.List)}. The returned View will be sized and positioned after
+     * this call so that it is ready to be added to the decor View's overlay.
+     *
+     * <p>This is not called for Fragment Transitions.</p>
+     *
+     * @param context The Context used to create the snapshot View.
+     * @param snapshot The Parcelable returned by {@link #onCaptureSharedElementSnapshot(
+     * android.view.View, android.graphics.Matrix, android.graphics.RectF)}.
+     * @return A View to be sent in {@link #onSharedElementStart(java.util.List, java.util.List,
+     * java.util.List)} and {@link #onSharedElementEnd(java.util.List, java.util.List,
+     * java.util.List)}. A null value will produce a null snapshot value for those two methods.
+     */
+    public View onCreateSnapshotView(Context context, Parcelable snapshot) {
+        ImageView view = null;
+        if (snapshot instanceof Bundle) {
+            Bundle bundle = (Bundle) snapshot;
+            Bitmap bitmap = (Bitmap) bundle.getParcelable(BUNDLE_SNAPSHOT_BITMAP);
+            if (bitmap == null) {
+                return null;
+            }
+            ImageView imageView = new ImageView(context);
+            view = imageView;
+            imageView.setImageBitmap(bitmap);
+            imageView.setScaleType(
+                    ScaleType.valueOf(bundle.getString(BUNDLE_SNAPSHOT_IMAGE_SCALETYPE)));
+            if (imageView.getScaleType() == ScaleType.MATRIX) {
+                float[] values = bundle.getFloatArray(BUNDLE_SNAPSHOT_IMAGE_MATRIX);
+                Matrix matrix = new Matrix();
+                matrix.setValues(values);
+                imageView.setImageMatrix(matrix);
+            }
+        } else if (snapshot instanceof Bitmap) {
+            Bitmap bitmap = (Bitmap) snapshot;
+            view = new ImageView(context);
+            view.setImageBitmap(bitmap);
+        }
+        return view;
+    }
+
+    /**
+     * Called during an Activity Transition when the shared elements have arrived at the
+     * final location and are ready to be transferred. This method is called for both the
+     * source and destination Activities.
+     * <p>
+     * When the shared elements are ready to be transferred,
+     * {@link OnSharedElementsReadyListener#onSharedElementsReady()}
+     * must be called to trigger the transfer.
+     * <p>
+     * The default behavior is to trigger the transfer immediately.
+     *
+     * @param sharedElementNames The names of the shared elements that are being transferred..
+     * @param sharedElements The shared elements that are part of the View hierarchy.
+     * @param listener The listener to call when the shared elements are ready to be hidden
+     *                 in the source Activity or shown in the destination Activity.
+     */
+    public void onSharedElementsArrived(List<String> sharedElementNames,
+            List<View> sharedElements, OnSharedElementsReadyListener listener) {
+        listener.onSharedElementsReady();
+    }
+
+    /**
+     * Listener to be called after {@link
+     * SharedElementCallback#onSharedElementsArrived(List, List, OnSharedElementsReadyListener)}
+     * when the shared elements are ready to be hidden in the source Activity and shown in the
+     * destination Activity.
+     */
+    public interface OnSharedElementsReadyListener {
+
+        /**
+         * Call this method during or after the OnSharedElementsReadyListener has been received
+         * in {@link SharedElementCallback#onSharedElementsArrived(List, List,
+         * OnSharedElementsReadyListener)} to indicate that the shared elements are ready to be
+         * hidden in the source and shown in the destination Activity.
+         */
+        void onSharedElementsReady();
+    }
+}
diff --git a/compat/java/android/support/v4/app/package.html b/compat/java/android/support/v4/app/package.html
new file mode 100755
index 0000000..02d1b79
--- /dev/null
+++ b/compat/java/android/support/v4/app/package.html
@@ -0,0 +1,8 @@
+<body>
+
+Support android.app classes to assist with development of applications for
+android API level 4 or later.  The main features here are backwards-compatible
+versions of {@link android.support.v4.app.FragmentManager} and
+{@link android.support.v4.app.LoaderManager}.
+
+</body>
diff --git a/v4/java/android/support/v4/content/ContentResolverCompat.java b/compat/java/android/support/v4/content/ContentResolverCompat.java
similarity index 100%
rename from v4/java/android/support/v4/content/ContentResolverCompat.java
rename to compat/java/android/support/v4/content/ContentResolverCompat.java
diff --git a/compat/java/android/support/v4/content/ContextCompat.java b/compat/java/android/support/v4/content/ContextCompat.java
new file mode 100644
index 0000000..3c6100e
--- /dev/null
+++ b/compat/java/android/support/v4/content/ContextCompat.java
@@ -0,0 +1,552 @@
+/*
+ * Copyright (C) 2012 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 android.support.v4.content;
+
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ApplicationInfo;
+import android.content.res.ColorStateList;
+import android.graphics.drawable.Drawable;
+import android.os.Build;
+import android.os.Bundle;
+import android.os.Environment;
+import android.os.Process;
+import android.support.annotation.NonNull;
+import android.support.v4.os.BuildCompat;
+import android.support.v4.os.EnvironmentCompat;
+import android.util.Log;
+import android.util.TypedValue;
+
+import java.io.File;
+
+/**
+ * Helper for accessing features in {@link android.content.Context}
+ * introduced after API level 4 in a backwards compatible fashion.
+ */
+public class ContextCompat {
+    private static final String TAG = "ContextCompat";
+
+    private static final String DIR_ANDROID = "Android";
+    private static final String DIR_OBB = "obb";
+
+    private static final Object sLock = new Object();
+
+    private static TypedValue sTempValue;
+
+    /**
+     * Start a set of activities as a synthesized task stack, if able.
+     *
+     * <p>In API level 11 (Android 3.0/Honeycomb) the recommended conventions for
+     * app navigation using the back key changed. The back key's behavior is local
+     * to the current task and does not capture navigation across different tasks.
+     * Navigating across tasks and easily reaching the previous task is accomplished
+     * through the "recents" UI, accessible through the software-provided Recents key
+     * on the navigation or system bar. On devices with the older hardware button configuration
+     * the recents UI can be accessed with a long press on the Home key.</p>
+     *
+     * <p>When crossing from one task stack to another post-Android 3.0,
+     * the application should synthesize a back stack/history for the new task so that
+     * the user may navigate out of the new task and back to the Launcher by repeated
+     * presses of the back key. Back key presses should not navigate across task stacks.</p>
+     *
+     * <p>startActivities provides a mechanism for constructing a synthetic task stack of
+     * multiple activities. If the underlying API is not available on the system this method
+     * will return false.</p>
+     *
+     * @param context Start activities using this activity as the starting context
+     * @param intents Array of intents defining the activities that will be started. The element
+     *                length-1 will correspond to the top activity on the resulting task stack.
+     * @return true if the underlying API was available and the call was successful, false otherwise
+     */
+    public static boolean startActivities(Context context, Intent[] intents) {
+        return startActivities(context, intents, null);
+    }
+
+    /**
+     * Start a set of activities as a synthesized task stack, if able.
+     *
+     * <p>In API level 11 (Android 3.0/Honeycomb) the recommended conventions for
+     * app navigation using the back key changed. The back key's behavior is local
+     * to the current task and does not capture navigation across different tasks.
+     * Navigating across tasks and easily reaching the previous task is accomplished
+     * through the "recents" UI, accessible through the software-provided Recents key
+     * on the navigation or system bar. On devices with the older hardware button configuration
+     * the recents UI can be accessed with a long press on the Home key.</p>
+     *
+     * <p>When crossing from one task stack to another post-Android 3.0,
+     * the application should synthesize a back stack/history for the new task so that
+     * the user may navigate out of the new task and back to the Launcher by repeated
+     * presses of the back key. Back key presses should not navigate across task stacks.</p>
+     *
+     * <p>startActivities provides a mechanism for constructing a synthetic task stack of
+     * multiple activities. If the underlying API is not available on the system this method
+     * will return false.</p>
+     *
+     * @param context Start activities using this activity as the starting context
+     * @param intents Array of intents defining the activities that will be started. The element
+     *                length-1 will correspond to the top activity on the resulting task stack.
+     * @param options Additional options for how the Activity should be started.
+     * See {@link android.content.Context#startActivity(Intent, android.os.Bundle)}
+     * @return true if the underlying API was available and the call was successful, false otherwise
+     */
+    public static boolean startActivities(Context context, Intent[] intents,
+            Bundle options) {
+        final int version = Build.VERSION.SDK_INT;
+        if (version >= 16) {
+            ContextCompatJellybean.startActivities(context, intents, options);
+            return true;
+        } else if (version >= 11) {
+            ContextCompatHoneycomb.startActivities(context, intents);
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * Returns the absolute path to the directory on the filesystem where all
+     * private files belonging to this app are stored. Apps should not use this
+     * path directly; they should instead use {@link Context#getFilesDir()},
+     * {@link Context#getCacheDir()}, {@link Context#getDir(String, int)}, or
+     * other storage APIs on {@link Context}.
+     * <p>
+     * The returned path may change over time if the calling app is moved to an
+     * adopted storage device, so only relative paths should be persisted.
+     * <p>
+     * No additional permissions are required for the calling app to read or
+     * write files under the returned path.
+     *
+     * @see ApplicationInfo#dataDir
+     */
+    public static File getDataDir(Context context) {
+        if (BuildCompat.isAtLeastN()) {
+            return ContextCompatApi24.getDataDir(context);
+        } else {
+            final String dataDir = context.getApplicationInfo().dataDir;
+            return dataDir != null ? new File(dataDir) : null;
+        }
+    }
+
+    /**
+     * Returns absolute paths to application-specific directories on all
+     * external storage devices where the application's OBB files (if there are
+     * any) can be found. Note if the application does not have any OBB files,
+     * these directories may not exist.
+     * <p>
+     * This is like {@link Context#getFilesDir()} in that these files will be
+     * deleted when the application is uninstalled, however there are some
+     * important differences:
+     * <ul>
+     * <li>External files are not always available: they will disappear if the
+     * user mounts the external storage on a computer or removes it.
+     * <li>There is no security enforced with these files.
+     * </ul>
+     * <p>
+     * External storage devices returned here are considered a permanent part of
+     * the device, including both emulated external storage and physical media
+     * slots, such as SD cards in a battery compartment. The returned paths do
+     * not include transient devices, such as USB flash drives.
+     * <p>
+     * An application may store data on any or all of the returned devices. For
+     * example, an app may choose to store large files on the device with the
+     * most available space, as measured by {@link android.os.StatFs}.
+     * <p>
+     * Starting in {@link android.os.Build.VERSION_CODES#KITKAT}, no permissions
+     * are required to write to the returned paths; they're always accessible to
+     * the calling app. Before then,
+     * {@link android.Manifest.permission#WRITE_EXTERNAL_STORAGE} is required to
+     * write. Write access outside of these paths on secondary external storage
+     * devices is not available. To request external storage access in a
+     * backwards compatible way, consider using {@code android:maxSdkVersion}
+     * like this:
+     *
+     * <pre class="prettyprint">&lt;uses-permission
+     *     android:name="android.permission.WRITE_EXTERNAL_STORAGE"
+     *     android:maxSdkVersion="18" /&gt;</pre>
+     * <p>
+     * The first path returned is the same as {@link Context#getObbDir()}.
+     * Returned paths may be {@code null} if a storage device is unavailable.
+     *
+     * @see Context#getObbDir()
+     * @see EnvironmentCompat#getStorageState(File)
+     */
+    public static File[] getObbDirs(Context context) {
+        final int version = Build.VERSION.SDK_INT;
+        if (version >= 19) {
+            return ContextCompatKitKat.getObbDirs(context);
+        } else {
+            final File single;
+            if (version >= 11) {
+                single = ContextCompatHoneycomb.getObbDir(context);
+            } else {
+                single = buildPath(Environment.getExternalStorageDirectory(), DIR_ANDROID, DIR_OBB,
+                        context.getPackageName());
+            }
+            return new File[] { single };
+        }
+    }
+
+    /**
+     * Returns absolute paths to application-specific directories on all
+     * external storage devices where the application can place persistent files
+     * it owns. These files are internal to the application, and not typically
+     * visible to the user as media.
+     * <p>
+     * This is like {@link Context#getFilesDir()} in that these files will be
+     * deleted when the application is uninstalled, however there are some
+     * important differences:
+     * <ul>
+     * <li>External files are not always available: they will disappear if the
+     * user mounts the external storage on a computer or removes it.
+     * <li>There is no security enforced with these files.
+     * </ul>
+     * <p>
+     * External storage devices returned here are considered a permanent part of
+     * the device, including both emulated external storage and physical media
+     * slots, such as SD cards in a battery compartment. The returned paths do
+     * not include transient devices, such as USB flash drives.
+     * <p>
+     * An application may store data on any or all of the returned devices. For
+     * example, an app may choose to store large files on the device with the
+     * most available space, as measured by {@link android.os.StatFs}.
+     * <p>
+     * Starting in {@link android.os.Build.VERSION_CODES#KITKAT}, no permissions
+     * are required to write to the returned paths; they're always accessible to
+     * the calling app. Before then,
+     * {@link android.Manifest.permission#WRITE_EXTERNAL_STORAGE} is required to
+     * write. Write access outside of these paths on secondary external storage
+     * devices is not available. To request external storage access in a
+     * backwards compatible way, consider using {@code android:maxSdkVersion}
+     * like this:
+     *
+     * <pre class="prettyprint">&lt;uses-permission
+     *     android:name="android.permission.WRITE_EXTERNAL_STORAGE"
+     *     android:maxSdkVersion="18" /&gt;</pre>
+     * <p>
+     * The first path returned is the same as
+     * {@link Context#getExternalFilesDir(String)}. Returned paths may be
+     * {@code null} if a storage device is unavailable.
+     *
+     * @see Context#getExternalFilesDir(String)
+     * @see EnvironmentCompat#getStorageState(File)
+     */
+    public static File[] getExternalFilesDirs(Context context, String type) {
+        final int version = Build.VERSION.SDK_INT;
+        if (version >= 19) {
+            return ContextCompatKitKat.getExternalFilesDirs(context, type);
+        } else {
+            return new File[] { context.getExternalFilesDir(type) };
+        }
+    }
+
+    /**
+     * Returns absolute paths to application-specific directories on all
+     * external storage devices where the application can place cache files it
+     * owns. These files are internal to the application, and not typically
+     * visible to the user as media.
+     * <p>
+     * This is like {@link Context#getCacheDir()} in that these files will be
+     * deleted when the application is uninstalled, however there are some
+     * important differences:
+     * <ul>
+     * <li>External files are not always available: they will disappear if the
+     * user mounts the external storage on a computer or removes it.
+     * <li>There is no security enforced with these files.
+     * </ul>
+     * <p>
+     * External storage devices returned here are considered a permanent part of
+     * the device, including both emulated external storage and physical media
+     * slots, such as SD cards in a battery compartment. The returned paths do
+     * not include transient devices, such as USB flash drives.
+     * <p>
+     * An application may store data on any or all of the returned devices. For
+     * example, an app may choose to store large files on the device with the
+     * most available space, as measured by {@link android.os.StatFs}.
+     * <p>
+     * Starting in {@link android.os.Build.VERSION_CODES#KITKAT}, no permissions
+     * are required to write to the returned paths; they're always accessible to
+     * the calling app. Before then,
+     * {@link android.Manifest.permission#WRITE_EXTERNAL_STORAGE} is required to
+     * write. Write access outside of these paths on secondary external storage
+     * devices is not available. To request external storage access in a
+     * backwards compatible way, consider using {@code android:maxSdkVersion}
+     * like this:
+     *
+     * <pre class="prettyprint">&lt;uses-permission
+     *     android:name="android.permission.WRITE_EXTERNAL_STORAGE"
+     *     android:maxSdkVersion="18" /&gt;</pre>
+     * <p>
+     * The first path returned is the same as
+     * {@link Context#getExternalCacheDir()}. Returned paths may be {@code null}
+     * if a storage device is unavailable.
+     *
+     * @see Context#getExternalCacheDir()
+     * @see EnvironmentCompat#getStorageState(File)
+     */
+    public static File[] getExternalCacheDirs(Context context) {
+        final int version = Build.VERSION.SDK_INT;
+        if (version >= 19) {
+            return ContextCompatKitKat.getExternalCacheDirs(context);
+        } else {
+            return new File[] { context.getExternalCacheDir() };
+        }
+    }
+
+    private static File buildPath(File base, String... segments) {
+        File cur = base;
+        for (String segment : segments) {
+            if (cur == null) {
+                cur = new File(segment);
+            } else if (segment != null) {
+                cur = new File(cur, segment);
+            }
+        }
+        return cur;
+    }
+
+    /**
+     * Returns a drawable object associated with a particular resource ID.
+     * <p>
+     * Starting in {@link android.os.Build.VERSION_CODES#LOLLIPOP}, the
+     * returned drawable will be styled for the specified Context's theme.
+     *
+     * @param id The desired resource identifier, as generated by the aapt tool.
+     *           This integer encodes the package, type, and resource entry.
+     *           The value 0 is an invalid identifier.
+     * @return Drawable An object that can be used to draw this resource.
+     */
+    public static final Drawable getDrawable(Context context, int id) {
+        final int version = Build.VERSION.SDK_INT;
+        if (version >= 21) {
+            return ContextCompatApi21.getDrawable(context, id);
+        } else if (version >= 16) {
+            return context.getResources().getDrawable(id);
+        } else {
+            // Prior to JELLY_BEAN, Resources.getDrawable() would not correctly
+            // retrieve the final configuration density when the resource ID
+            // is a reference another Drawable resource. As a workaround, try
+            // to resolve the drawable reference manually.
+            final int resolvedId;
+            synchronized (sLock) {
+                if (sTempValue == null) {
+                    sTempValue = new TypedValue();
+                }
+                context.getResources().getValue(id, sTempValue, true);
+                resolvedId = sTempValue.resourceId;
+            }
+            return context.getResources().getDrawable(resolvedId);
+        }
+    }
+
+    /**
+     * Returns a color state list associated with a particular resource ID.
+     * <p>
+     * Starting in {@link android.os.Build.VERSION_CODES#M}, the returned
+     * color state list will be styled for the specified Context's theme.
+     *
+     * @param id The desired resource identifier, as generated by the aapt
+     *           tool. This integer encodes the package, type, and resource
+     *           entry. The value 0 is an invalid identifier.
+     * @return A color state list, or {@code null} if the resource could not be
+     *         resolved.
+     * @throws android.content.res.Resources.NotFoundException if the given ID
+     *         does not exist.
+     */
+    public static final ColorStateList getColorStateList(Context context, int id) {
+        final int version = Build.VERSION.SDK_INT;
+        if (version >= 23) {
+            return ContextCompatApi23.getColorStateList(context, id);
+        } else {
+            return context.getResources().getColorStateList(id);
+        }
+    }
+
+    /**
+     * Returns a color associated with a particular resource ID
+     * <p>
+     * Starting in {@link android.os.Build.VERSION_CODES#M}, the returned
+     * color will be styled for the specified Context's theme.
+     *
+     * @param id The desired resource identifier, as generated by the aapt
+     *           tool. This integer encodes the package, type, and resource
+     *           entry. The value 0 is an invalid identifier.
+     * @return A single color value in the form 0xAARRGGBB.
+     * @throws android.content.res.Resources.NotFoundException if the given ID
+     *         does not exist.
+     */
+    public static final int getColor(Context context, int id) {
+        final int version = Build.VERSION.SDK_INT;
+        if (version >= 23) {
+            return ContextCompatApi23.getColor(context, id);
+        } else {
+            return context.getResources().getColor(id);
+        }
+    }
+
+    /**
+     * Determine whether <em>you</em> have been granted a particular permission.
+     *
+     * @param permission The name of the permission being checked.
+     *
+     * @return {@link android.content.pm.PackageManager#PERMISSION_GRANTED} if you have the
+     * permission, or {@link android.content.pm.PackageManager#PERMISSION_DENIED} if not.
+     *
+     * @see android.content.pm.PackageManager#checkPermission(String, String)
+     */
+    public static int checkSelfPermission(@NonNull Context context, @NonNull String permission) {
+        if (permission == null) {
+            throw new IllegalArgumentException("permission is null");
+        }
+
+        return context.checkPermission(permission, android.os.Process.myPid(), Process.myUid());
+    }
+
+    /**
+     * Returns the absolute path to the directory on the filesystem similar to
+     * {@link Context#getFilesDir()}.  The difference is that files placed under this
+     * directory will be excluded from automatic backup to remote storage on
+     * devices running {@link android.os.Build.VERSION_CODES#LOLLIPOP} or later.  See
+     * {@link android.app.backup.BackupAgent BackupAgent} for a full discussion
+     * of the automatic backup mechanism in Android.
+     *
+     * <p>No permissions are required to read or write to the returned path, since this
+     * path is internal storage.
+     *
+     * @return The path of the directory holding application files that will not be
+     *         automatically backed up to remote storage.
+     *
+     * @see android.content.Context.getFilesDir
+     */
+    public static final File getNoBackupFilesDir(Context context) {
+        final int version = Build.VERSION.SDK_INT;
+        if (version >= 21) {
+            return ContextCompatApi21.getNoBackupFilesDir(context);
+        } else {
+            ApplicationInfo appInfo = context.getApplicationInfo();
+            return createFilesDir(new File(appInfo.dataDir, "no_backup"));
+        }
+    }
+
+    /**
+     * Returns the absolute path to the application specific cache directory on
+     * the filesystem designed for storing cached code. On devices running
+     * {@link android.os.Build.VERSION_CODES#LOLLIPOP} or later, the system will delete
+     * any files stored in this location both when your specific application is
+     * upgraded, and when the entire platform is upgraded.
+     * <p>
+     * This location is optimal for storing compiled or optimized code generated
+     * by your application at runtime.
+     * <p>
+     * Apps require no extra permissions to read or write to the returned path,
+     * since this path lives in their private storage.
+     *
+     * @return The path of the directory holding application code cache files.
+     */
+    public static File getCodeCacheDir(Context context) {
+        final int version = Build.VERSION.SDK_INT;
+        if (version >= 21) {
+            return ContextCompatApi21.getCodeCacheDir(context);
+        } else {
+            ApplicationInfo appInfo = context.getApplicationInfo();
+            return createFilesDir(new File(appInfo.dataDir, "code_cache"));
+        }
+    }
+
+    private synchronized static File createFilesDir(File file) {
+        if (!file.exists()) {
+            if (!file.mkdirs()) {
+                if (file.exists()) {
+                    // spurious failure; probably racing with another process for this app
+                    return file;
+                }
+                Log.w(TAG, "Unable to create files subdir " + file.getPath());
+                return null;
+            }
+        }
+        return file;
+    }
+
+    /**
+     * Return a new Context object for the current Context but whose storage
+     * APIs are backed by device-protected storage.
+     * <p>
+     * On devices with direct boot, data stored in this location is encrypted
+     * with a key tied to the physical device, and it can be accessed
+     * immediately after the device has booted successfully, both
+     * <em>before and after</em> the user has authenticated with their
+     * credentials (such as a lock pattern or PIN).
+     * <p>
+     * Because device-protected data is available without user authentication,
+     * you should carefully limit the data you store using this Context. For
+     * example, storing sensitive authentication tokens or passwords in the
+     * device-protected area is strongly discouraged.
+     * <p>
+     * If the underlying device does not have the ability to store
+     * device-protected and credential-protected data using different keys, then
+     * both storage areas will become available at the same time. They remain as
+     * two distinct storage locations on disk, and only the window of
+     * availability changes.
+     * <p>
+     * Each call to this method returns a new instance of a Context object;
+     * Context objects are not shared, however common state (ClassLoader, other
+     * Resources for the same configuration) may be so the Context itself can be
+     * fairly lightweight.
+     * <p>
+     * Prior to {@link BuildCompat#isAtLeastN()} this method returns
+     * {@code null}, since device-protected storage is not available.
+     *
+     * @see ContextCompat#isDeviceProtectedStorage(Context)
+     */
+    public static Context createDeviceProtectedStorageContext(Context context) {
+        if (BuildCompat.isAtLeastN()) {
+            return ContextCompatApi24.createDeviceProtectedStorageContext(context);
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * @removed
+     * @deprecated Removed. Do not use.
+     */
+    @Deprecated
+    public static Context createDeviceEncryptedStorageContext(Context context) {
+        return createDeviceProtectedStorageContext(context);
+    }
+
+    /**
+     * Indicates if the storage APIs of this Context are backed by
+     * device-encrypted storage.
+     *
+     * @see ContextCompat#createDeviceProtectedStorageContext(Context)
+     */
+    public static boolean isDeviceProtectedStorage(Context context) {
+        if (BuildCompat.isAtLeastN()) {
+            return ContextCompatApi24.isDeviceProtectedStorage(context);
+        } else {
+            return false;
+        }
+    }
+
+    /**
+     * @removed
+     * @deprecated Removed. Do not use.
+     */
+    @Deprecated
+    public static boolean isDeviceEncryptedStorage(Context context) {
+        return isDeviceProtectedStorage(context);
+    }
+}
diff --git a/v4/java/android/support/v4/content/IntentCompat.java b/compat/java/android/support/v4/content/IntentCompat.java
similarity index 100%
rename from v4/java/android/support/v4/content/IntentCompat.java
rename to compat/java/android/support/v4/content/IntentCompat.java
diff --git a/compat/java/android/support/v4/content/ModernAsyncTask.java b/compat/java/android/support/v4/content/ModernAsyncTask.java
new file mode 100644
index 0000000..7d9f0c3
--- /dev/null
+++ b/compat/java/android/support/v4/content/ModernAsyncTask.java
@@ -0,0 +1,508 @@
+/*
+ * 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 android.support.v4.content;
+
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.Callable;
+import java.util.concurrent.CancellationException;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Executor;
+import java.util.concurrent.FutureTask;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
+import android.os.Process;
+
+/**
+ * Copy of the required parts of {@link android.os.AsyncTask} from Android 3.0 that is
+ * needed to support AsyncTaskLoader.  We use this rather than the one from the platform
+ * because we rely on some subtle behavior of AsyncTask that is not reliable on
+ * older platforms.
+ *
+ * <p>Note that for now this is not publicly available because it is not a
+ * complete implementation, only sufficient for the needs of
+ * {@link AsyncTaskLoader}.
+ */
+abstract class ModernAsyncTask<Params, Progress, Result> {
+    private static final String LOG_TAG = "AsyncTask";
+
+    private static final int CORE_POOL_SIZE = 5;
+    private static final int MAXIMUM_POOL_SIZE = 128;
+    private static final int KEEP_ALIVE = 1;
+
+    private static final ThreadFactory sThreadFactory = new ThreadFactory() {
+        private final AtomicInteger mCount = new AtomicInteger(1);
+
+        @Override
+        public Thread newThread(Runnable r) {
+            return new Thread(r, "ModernAsyncTask #" + mCount.getAndIncrement());
+        }
+    };
+
+    private static final BlockingQueue<Runnable> sPoolWorkQueue =
+            new LinkedBlockingQueue<Runnable>(10);
+
+    /**
+     * An {@link Executor} that can be used to execute tasks in parallel.
+     */
+    public static final Executor THREAD_POOL_EXECUTOR
+            = new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE,
+                    TimeUnit.SECONDS, sPoolWorkQueue, sThreadFactory);
+
+    private static final int MESSAGE_POST_RESULT = 0x1;
+    private static final int MESSAGE_POST_PROGRESS = 0x2;
+
+    private static InternalHandler sHandler;
+
+    private static volatile Executor sDefaultExecutor = THREAD_POOL_EXECUTOR;
+    private final WorkerRunnable<Params, Result> mWorker;
+    private final FutureTask<Result> mFuture;
+
+    private volatile Status mStatus = Status.PENDING;
+
+    private final AtomicBoolean mTaskInvoked = new AtomicBoolean();
+
+    /**
+     * Indicates the current status of the task. Each status will be set only once
+     * during the lifetime of a task.
+     */
+    public enum Status {
+        /**
+         * Indicates that the task has not been executed yet.
+         */
+        PENDING,
+        /**
+         * Indicates that the task is running.
+         */
+        RUNNING,
+        /**
+         * Indicates that {@link android.os.AsyncTask#onPostExecute(Object)} has finished.
+         */
+        FINISHED,
+    }
+
+    private static Handler getHandler() {
+        synchronized (ModernAsyncTask.class) {
+            if (sHandler == null) {
+                sHandler = new InternalHandler();
+            }
+            return sHandler;
+        }
+    }
+
+    /** @hide */
+    public static void setDefaultExecutor(Executor exec) {
+        sDefaultExecutor = exec;
+    }
+
+    /**
+     * Creates a new asynchronous task. This constructor must be invoked on the UI thread.
+     */
+    public ModernAsyncTask() {
+        mWorker = new WorkerRunnable<Params, Result>() {
+            @Override
+            public Result call() throws Exception {
+                mTaskInvoked.set(true);
+
+                Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
+                return postResult(doInBackground(mParams));
+            }
+        };
+
+        mFuture = new FutureTask<Result>(mWorker) {
+            @Override
+            protected void done() {
+                try {
+                    final Result result = get();
+
+                    postResultIfNotInvoked(result);
+                } catch (InterruptedException e) {
+                    android.util.Log.w(LOG_TAG, e);
+                } catch (ExecutionException e) {
+                    throw new RuntimeException(
+                            "An error occurred while executing doInBackground()", e.getCause());
+                } catch (CancellationException e) {
+                    postResultIfNotInvoked(null);
+                } catch (Throwable t) {
+                    throw new RuntimeException(
+                            "An error occurred while executing doInBackground()", t);
+                }
+            }
+        };
+    }
+
+    private void postResultIfNotInvoked(Result result) {
+        final boolean wasTaskInvoked = mTaskInvoked.get();
+        if (!wasTaskInvoked) {
+            postResult(result);
+        }
+    }
+
+    private Result postResult(Result result) {
+        Message message = getHandler().obtainMessage(MESSAGE_POST_RESULT,
+                new AsyncTaskResult<Result>(this, result));
+        message.sendToTarget();
+        return result;
+    }
+
+    /**
+     * Returns the current status of this task.
+     *
+     * @return The current status.
+     */
+    public final Status getStatus() {
+        return mStatus;
+    }
+
+    /**
+     * Override this method to perform a computation on a background thread. The
+     * specified parameters are the parameters passed to {@link #execute}
+     * by the caller of this task.
+     *
+     * This method can call {@link #publishProgress} to publish updates
+     * on the UI thread.
+     *
+     * @param params The parameters of the task.
+     *
+     * @return A result, defined by the subclass of this task.
+     *
+     * @see #onPreExecute()
+     * @see #onPostExecute
+     * @see #publishProgress
+     */
+    protected abstract Result doInBackground(Params... params);
+
+    /**
+     * Runs on the UI thread before {@link #doInBackground}.
+     *
+     * @see #onPostExecute
+     * @see #doInBackground
+     */
+    protected void onPreExecute() {
+    }
+
+    /**
+     * <p>Runs on the UI thread after {@link #doInBackground}. The
+     * specified result is the value returned by {@link #doInBackground}.</p>
+     *
+     * <p>This method won't be invoked if the task was cancelled.</p>
+     *
+     * @param result The result of the operation computed by {@link #doInBackground}.
+     *
+     * @see #onPreExecute
+     * @see #doInBackground
+     * @see #onCancelled(Object)
+     */
+    @SuppressWarnings({"UnusedDeclaration"})
+    protected void onPostExecute(Result result) {
+    }
+
+    /**
+     * Runs on the UI thread after {@link #publishProgress} is invoked.
+     * The specified values are the values passed to {@link #publishProgress}.
+     *
+     * @param values The values indicating progress.
+     *
+     * @see #publishProgress
+     * @see #doInBackground
+     */
+    @SuppressWarnings({"UnusedDeclaration"})
+    protected void onProgressUpdate(Progress... values) {
+    }
+
+    /**
+     * <p>Runs on the UI thread after {@link #cancel(boolean)} is invoked and
+     * {@link #doInBackground(Object[])} has finished.</p>
+     *
+     * <p>The default implementation simply invokes {@link #onCancelled()} and
+     * ignores the result. If you write your own implementation, do not call
+     * <code>super.onCancelled(result)</code>.</p>
+     *
+     * @param result The result, if any, computed in
+     *               {@link #doInBackground(Object[])}, can be null
+     *
+     * @see #cancel(boolean)
+     * @see #isCancelled()
+     */
+    @SuppressWarnings({"UnusedParameters"})
+    protected void onCancelled(Result result) {
+        onCancelled();
+    }
+
+    /**
+     * <p>Applications should preferably override {@link #onCancelled(Object)}.
+     * This method is invoked by the default implementation of
+     * {@link #onCancelled(Object)}.</p>
+     *
+     * <p>Runs on the UI thread after {@link #cancel(boolean)} is invoked and
+     * {@link #doInBackground(Object[])} has finished.</p>
+     *
+     * @see #onCancelled(Object)
+     * @see #cancel(boolean)
+     * @see #isCancelled()
+     */
+    protected void onCancelled() {
+    }
+
+    /**
+     * Returns <tt>true</tt> if this task was cancelled before it completed
+     * normally. If you are calling {@link #cancel(boolean)} on the task,
+     * the value returned by this method should be checked periodically from
+     * {@link #doInBackground(Object[])} to end the task as soon as possible.
+     *
+     * @return <tt>true</tt> if task was cancelled before it completed
+     *
+     * @see #cancel(boolean)
+     */
+    public final boolean isCancelled() {
+        return mFuture.isCancelled();
+    }
+
+    /**
+     * <p>Attempts to cancel execution of this task.  This attempt will
+     * fail if the task has already completed, already been cancelled,
+     * or could not be cancelled for some other reason. If successful,
+     * and this task has not started when <tt>cancel</tt> is called,
+     * this task should never run. If the task has already started,
+     * then the <tt>mayInterruptIfRunning</tt> parameter determines
+     * whether the thread executing this task should be interrupted in
+     * an attempt to stop the task.</p>
+     *
+     * <p>Calling this method will result in {@link #onCancelled(Object)} being
+     * invoked on the UI thread after {@link #doInBackground(Object[])}
+     * returns. Calling this method guarantees that {@link #onPostExecute(Object)}
+     * is never invoked. After invoking this method, you should check the
+     * value returned by {@link #isCancelled()} periodically from
+     * {@link #doInBackground(Object[])} to finish the task as early as
+     * possible.</p>
+     *
+     * @param mayInterruptIfRunning <tt>true</tt> if the thread executing this
+     *        task should be interrupted; otherwise, in-progress tasks are allowed
+     *        to complete.
+     *
+     * @return <tt>false</tt> if the task could not be cancelled,
+     *         typically because it has already completed normally;
+     *         <tt>true</tt> otherwise
+     *
+     * @see #isCancelled()
+     * @see #onCancelled(Object)
+     */
+    public final boolean cancel(boolean mayInterruptIfRunning) {
+        return mFuture.cancel(mayInterruptIfRunning);
+    }
+
+    /**
+     * Waits if necessary for the computation to complete, and then
+     * retrieves its result.
+     *
+     * @return The computed result.
+     *
+     * @throws CancellationException If the computation was cancelled.
+     * @throws ExecutionException If the computation threw an exception.
+     * @throws InterruptedException If the current thread was interrupted
+     *         while waiting.
+     */
+    public final Result get() throws InterruptedException, ExecutionException {
+        return mFuture.get();
+    }
+
+    /**
+     * Waits if necessary for at most the given time for the computation
+     * to complete, and then retrieves its result.
+     *
+     * @param timeout Time to wait before cancelling the operation.
+     * @param unit The time unit for the timeout.
+     *
+     * @return The computed result.
+     *
+     * @throws CancellationException If the computation was cancelled.
+     * @throws ExecutionException If the computation threw an exception.
+     * @throws InterruptedException If the current thread was interrupted
+     *         while waiting.
+     * @throws TimeoutException If the wait timed out.
+     */
+    public final Result get(long timeout, TimeUnit unit) throws InterruptedException,
+            ExecutionException, TimeoutException {
+        return mFuture.get(timeout, unit);
+    }
+
+    /**
+     * Executes the task with the specified parameters. The task returns
+     * itself (this) so that the caller can keep a reference to it.
+     *
+     * <p>Note: this function schedules the task on a queue for a single background
+     * thread or pool of threads depending on the platform version.  When first
+     * introduced, AsyncTasks were executed serially on a single background thread.
+     * Starting with {@link android.os.Build.VERSION_CODES#DONUT}, this was changed
+     * to a pool of threads allowing multiple tasks to operate in parallel.  After
+     * {@link android.os.Build.VERSION_CODES#HONEYCOMB}, it is planned to change this
+     * back to a single thread to avoid common application errors caused
+     * by parallel execution.  If you truly want parallel execution, you can use
+     * the {@link #executeOnExecutor} version of this method
+     * with {@link #THREAD_POOL_EXECUTOR}; however, see commentary there for warnings on
+     * its use.
+     *
+     * <p>This method must be invoked on the UI thread.
+     *
+     * @param params The parameters of the task.
+     *
+     * @return This instance of AsyncTask.
+     *
+     * @throws IllegalStateException If {@link #getStatus()} returns either
+     *         {@link android.os.AsyncTask.Status#RUNNING} or
+     *          {@link android.os.AsyncTask.Status#FINISHED}.
+     */
+    public final ModernAsyncTask<Params, Progress, Result> execute(Params... params) {
+        return executeOnExecutor(sDefaultExecutor, params);
+    }
+
+    /**
+     * Executes the task with the specified parameters. The task returns
+     * itself (this) so that the caller can keep a reference to it.
+     *
+     * <p>This method is typically used with {@link #THREAD_POOL_EXECUTOR} to
+     * allow multiple tasks to run in parallel on a pool of threads managed by
+     * AsyncTask, however you can also use your own {@link Executor} for custom
+     * behavior.
+     *
+     * <p><em>Warning:</em> Allowing multiple tasks to run in parallel from
+     * a thread pool is generally <em>not</em> what one wants, because the order
+     * of their operation is not defined.  For example, if these tasks are used
+     * to modify any state in common (such as writing a file due to a button click),
+     * there are no guarantees on the order of the modifications.
+     * Without careful work it is possible in rare cases for the newer version
+     * of the data to be over-written by an older one, leading to obscure data
+     * loss and stability issues.
+     *
+     * <p>This method must be invoked on the UI thread.
+     *
+     * @param exec The executor to use.  {@link #THREAD_POOL_EXECUTOR} is available as a
+     *              convenient process-wide thread pool for tasks that are loosely coupled.
+     * @param params The parameters of the task.
+     *
+     * @return This instance of AsyncTask.
+     *
+     * @throws IllegalStateException If {@link #getStatus()} returns either
+     *         {@link android.os.AsyncTask.Status#RUNNING}
+     *          or {@link android.os.AsyncTask.Status#FINISHED}.
+     */
+    public final ModernAsyncTask<Params, Progress, Result> executeOnExecutor(Executor exec,
+            Params... params) {
+        if (mStatus != Status.PENDING) {
+            switch (mStatus) {
+                case RUNNING:
+                    throw new IllegalStateException("Cannot execute task:"
+                            + " the task is already running.");
+                case FINISHED:
+                    throw new IllegalStateException("Cannot execute task:"
+                            + " the task has already been executed "
+                            + "(a task can be executed only once)");
+            }
+        }
+
+        mStatus = Status.RUNNING;
+
+        onPreExecute();
+
+        mWorker.mParams = params;
+        exec.execute(mFuture);
+
+        return this;
+    }
+
+    /**
+     * Convenience version of {@link #execute(Object...)} for use with
+     * a simple Runnable object.
+     */
+    public static void execute(Runnable runnable) {
+        sDefaultExecutor.execute(runnable);
+    }
+
+    /**
+     * This method can be invoked from {@link #doInBackground} to
+     * publish updates on the UI thread while the background computation is
+     * still running. Each call to this method will trigger the execution of
+     * {@link #onProgressUpdate} on the UI thread.
+     *
+     * {@link #onProgressUpdate} will note be called if the task has been
+     * canceled.
+     *
+     * @param values The progress values to update the UI with.
+     *
+     * @see #onProgressUpdate
+     * @see #doInBackground
+     */
+    protected final void publishProgress(Progress... values) {
+        if (!isCancelled()) {
+            getHandler().obtainMessage(MESSAGE_POST_PROGRESS,
+                    new AsyncTaskResult<Progress>(this, values)).sendToTarget();
+        }
+    }
+
+    private void finish(Result result) {
+        if (isCancelled()) {
+            onCancelled(result);
+        } else {
+            onPostExecute(result);
+        }
+        mStatus = Status.FINISHED;
+    }
+
+    private static class InternalHandler extends Handler {
+        public InternalHandler() {
+            super(Looper.getMainLooper());
+        }
+
+        @SuppressWarnings({"unchecked", "RawUseOfParameterizedType"})
+        @Override
+        public void handleMessage(Message msg) {
+            AsyncTaskResult result = (AsyncTaskResult) msg.obj;
+            switch (msg.what) {
+                case MESSAGE_POST_RESULT:
+                    // There is only one result
+                    result.mTask.finish(result.mData[0]);
+                    break;
+                case MESSAGE_POST_PROGRESS:
+                    result.mTask.onProgressUpdate(result.mData);
+                    break;
+            }
+        }
+    }
+
+    private static abstract class WorkerRunnable<Params, Result> implements Callable<Result> {
+        Params[] mParams;
+    }
+
+    @SuppressWarnings({"RawUseOfParameterizedType"})
+    private static class AsyncTaskResult<Data> {
+        final ModernAsyncTask mTask;
+        final Data[] mData;
+
+        AsyncTaskResult(ModernAsyncTask task, Data... data) {
+            mTask = task;
+            mData = data;
+        }
+    }
+}
diff --git a/v4/java/android/support/v4/content/ParallelExecutorCompat.java b/compat/java/android/support/v4/content/ParallelExecutorCompat.java
similarity index 100%
rename from v4/java/android/support/v4/content/ParallelExecutorCompat.java
rename to compat/java/android/support/v4/content/ParallelExecutorCompat.java
diff --git a/compat/java/android/support/v4/content/SharedPreferencesCompat.java b/compat/java/android/support/v4/content/SharedPreferencesCompat.java
new file mode 100644
index 0000000..e748f48
--- /dev/null
+++ b/compat/java/android/support/v4/content/SharedPreferencesCompat.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2015 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 android.support.v4.content;
+
+import android.content.SharedPreferences;
+import android.os.Build;
+import android.support.annotation.NonNull;
+
+public final class SharedPreferencesCompat {
+
+    public final static class EditorCompat {
+
+        private static EditorCompat sInstance;
+
+        private static class Helper {
+            public void apply(@NonNull SharedPreferences.Editor editor) {
+                try {
+                    editor.apply();
+                } catch (AbstractMethodError unused) {
+                    // The app injected its own pre-Gingerbread
+                    // SharedPreferences.Editor implementation without
+                    // an apply method.
+                    editor.commit();
+                }
+            }
+        }
+
+        private final Helper mHelper;
+
+        private EditorCompat() {
+            mHelper = new Helper();
+        }
+
+        public static EditorCompat getInstance() {
+            if (sInstance == null) {
+                sInstance = new EditorCompat();
+            }
+            return sInstance;
+        }
+
+        public void apply(@NonNull SharedPreferences.Editor editor) {
+            // Note that this redirection is needed to not break the public API chain
+            // of getInstance().apply() calls. Otherwise this method could (and should)
+            // be static.
+            mHelper.apply(editor);
+        }
+    }
+
+    private SharedPreferencesCompat() {}
+
+}
diff --git a/compat/java/android/support/v4/content/package.html b/compat/java/android/support/v4/content/package.html
new file mode 100755
index 0000000..33bf4b5
--- /dev/null
+++ b/compat/java/android/support/v4/content/package.html
@@ -0,0 +1,10 @@
+<body>
+
+Support android.content classes to assist with development of applications for
+android API level 4 or later.  The main features here are
+{@link android.support.v4.content.Loader} and related classes and
+{@link android.support.v4.content.LocalBroadcastManager} to
+provide a cleaner implementation of broadcasts that don't need to go outside
+of an app.
+
+</body>
diff --git a/v4/java/android/support/v4/content/pm/ActivityInfoCompat.java b/compat/java/android/support/v4/content/pm/ActivityInfoCompat.java
similarity index 100%
rename from v4/java/android/support/v4/content/pm/ActivityInfoCompat.java
rename to compat/java/android/support/v4/content/pm/ActivityInfoCompat.java
diff --git a/v4/java/android/support/v4/content/pm/package.html b/compat/java/android/support/v4/content/pm/package.html
similarity index 100%
rename from v4/java/android/support/v4/content/pm/package.html
rename to compat/java/android/support/v4/content/pm/package.html
diff --git a/compat/java/android/support/v4/content/res/ConfigurationHelper.java b/compat/java/android/support/v4/content/res/ConfigurationHelper.java
new file mode 100644
index 0000000..ebf6df5
--- /dev/null
+++ b/compat/java/android/support/v4/content/res/ConfigurationHelper.java
@@ -0,0 +1,136 @@
+/*
+ * Copyright (C) 2016 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 android.support.v4.content.res;
+
+import android.content.res.Resources;
+import android.os.Build;
+import android.support.annotation.NonNull;
+
+/**
+ * Helper class which allows access to properties of {@link android.content.res.Configuration} in
+ * a backward compatible fashion.
+ */
+public final class ConfigurationHelper {
+
+    private static final ConfigurationHelperImpl IMPL;
+
+    static {
+        final int sdk = Build.VERSION.SDK_INT;
+        if (sdk >= 17) {
+            IMPL = new JellybeanMr1Impl();
+        } else if (sdk >= 13) {
+            IMPL = new HoneycombMr2Impl();
+        } else {
+            IMPL = new GingerbreadImpl();
+        }
+    }
+
+    private ConfigurationHelper() {}
+
+    private interface ConfigurationHelperImpl {
+        int getScreenHeightDp(@NonNull Resources resources);
+        int getScreenWidthDp(@NonNull Resources resources);
+        int getSmallestScreenWidthDp(@NonNull Resources resources);
+        int getDensityDpi(@NonNull Resources resources);
+    }
+
+    private static class GingerbreadImpl implements ConfigurationHelperImpl {
+        @Override
+        public int getScreenHeightDp(@NonNull Resources resources) {
+            return ConfigurationHelperGingerbread.getScreenHeightDp(resources);
+        }
+
+        @Override
+        public int getScreenWidthDp(@NonNull Resources resources) {
+            return ConfigurationHelperGingerbread.getScreenWidthDp(resources);
+        }
+
+        @Override
+        public int getSmallestScreenWidthDp(@NonNull Resources resources) {
+            return ConfigurationHelperGingerbread.getSmallestScreenWidthDp(resources);
+        }
+
+        @Override
+        public int getDensityDpi(@NonNull Resources resources) {
+            return ConfigurationHelperGingerbread.getDensityDpi(resources);
+        }
+    }
+
+    private static class HoneycombMr2Impl extends GingerbreadImpl {
+        @Override
+        public int getScreenHeightDp(@NonNull Resources resources) {
+            return ConfigurationHelperHoneycombMr2.getScreenHeightDp(resources);
+        }
+
+        @Override
+        public int getScreenWidthDp(@NonNull Resources resources) {
+            return ConfigurationHelperHoneycombMr2.getScreenWidthDp(resources);
+        }
+
+        @Override
+        public int getSmallestScreenWidthDp(@NonNull Resources resources) {
+            return ConfigurationHelperHoneycombMr2.getSmallestScreenWidthDp(resources);
+        }
+    }
+
+    private static class JellybeanMr1Impl extends HoneycombMr2Impl {
+        @Override
+        public int getDensityDpi(@NonNull Resources resources) {
+            return ConfigurationHelperJellybeanMr1.getDensityDpi(resources);
+        }
+    }
+
+    /**
+     * Returns the current height of the available screen space, in dp units.
+     *
+     * <p>Uses {@code Configuration.screenHeightDp} when available, otherwise an approximation
+     * is computed and returned.</p>
+     */
+    public static int getScreenHeightDp(@NonNull Resources resources) {
+        return IMPL.getScreenHeightDp(resources);
+    }
+
+    /**
+     * Returns the current width of the available screen space, in dp units.
+     *
+     * <p>Uses {@code Configuration.screenWidthDp} when available, otherwise an approximation
+     * is computed and returned.</p>
+     */
+    public static int getScreenWidthDp(@NonNull Resources resources) {
+        return IMPL.getScreenWidthDp(resources);
+    }
+
+    /**
+     * Returns The smallest screen size an application will see in normal operation, in dp units.
+     *
+     * <p>Uses {@code Configuration.smallestScreenWidthDp} when available, otherwise an
+     * approximation is computed and returned.</p>
+     */
+    public static int getSmallestScreenWidthDp(@NonNull Resources resources) {
+        return IMPL.getSmallestScreenWidthDp(resources);
+    }
+
+    /**
+     * Returns the target screen density being rendered to.
+     *
+     * <p>Uses {@code Configuration.densityDpi} when available, otherwise an approximation
+     * is computed and returned.</p>
+     */
+    public static int getDensityDpi(@NonNull Resources resources) {
+        return IMPL.getDensityDpi(resources);
+    }
+}
diff --git a/v4/java/android/support/v4/content/res/ResourcesCompat.java b/compat/java/android/support/v4/content/res/ResourcesCompat.java
similarity index 100%
rename from v4/java/android/support/v4/content/res/ResourcesCompat.java
rename to compat/java/android/support/v4/content/res/ResourcesCompat.java
diff --git a/v4/java/android/support/v4/database/DatabaseUtilsCompat.java b/compat/java/android/support/v4/database/DatabaseUtilsCompat.java
similarity index 100%
rename from v4/java/android/support/v4/database/DatabaseUtilsCompat.java
rename to compat/java/android/support/v4/database/DatabaseUtilsCompat.java
diff --git a/v4/java/android/support/v4/database/package.html b/compat/java/android/support/v4/database/package.html
similarity index 100%
rename from v4/java/android/support/v4/database/package.html
rename to compat/java/android/support/v4/database/package.html
diff --git a/v4/java/android/support/v4/graphics/BitmapCompat.java b/compat/java/android/support/v4/graphics/BitmapCompat.java
similarity index 100%
rename from v4/java/android/support/v4/graphics/BitmapCompat.java
rename to compat/java/android/support/v4/graphics/BitmapCompat.java
diff --git a/compat/java/android/support/v4/graphics/drawable/DrawableCompat.java b/compat/java/android/support/v4/graphics/drawable/DrawableCompat.java
new file mode 100644
index 0000000..d4ffc36
--- /dev/null
+++ b/compat/java/android/support/v4/graphics/drawable/DrawableCompat.java
@@ -0,0 +1,544 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.support.v4.graphics.drawable;
+
+import android.content.res.ColorStateList;
+import android.content.res.Resources;
+import android.graphics.ColorFilter;
+import android.graphics.PorterDuff;
+import android.graphics.drawable.Drawable;
+import android.support.annotation.ColorInt;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.v4.view.ViewCompat;
+import android.util.AttributeSet;
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+
+import java.io.IOException;
+
+/**
+ * Helper for accessing features in {@link android.graphics.drawable.Drawable}
+ * introduced after API level 4 in a backwards compatible fashion.
+ */
+public final class DrawableCompat {
+    /**
+     * Interface for the full API.
+     */
+    interface DrawableImpl {
+        void jumpToCurrentState(Drawable drawable);
+        void setAutoMirrored(Drawable drawable, boolean mirrored);
+        boolean isAutoMirrored(Drawable drawable);
+        void setHotspot(Drawable drawable, float x, float y);
+        void setHotspotBounds(Drawable drawable, int left, int top, int right, int bottom);
+        void setTint(Drawable drawable, int tint);
+        void setTintList(Drawable drawable, ColorStateList tint);
+        void setTintMode(Drawable drawable, PorterDuff.Mode tintMode);
+        Drawable wrap(Drawable drawable);
+        boolean setLayoutDirection(Drawable drawable, int layoutDirection);
+        int getLayoutDirection(Drawable drawable);
+        int getAlpha(Drawable drawable);
+        void applyTheme(Drawable drawable, Resources.Theme t);
+        boolean canApplyTheme(Drawable drawable);
+        ColorFilter getColorFilter(Drawable drawable);
+        void clearColorFilter(Drawable drawable);
+        void inflate(Drawable drawable, Resources res, XmlPullParser parser, AttributeSet attrs,
+                     Resources.Theme t) throws IOException, XmlPullParserException;
+    }
+
+    /**
+     * Interface implementation that doesn't use anything about v4 APIs.
+     */
+    static class BaseDrawableImpl implements DrawableImpl {
+        @Override
+        public void jumpToCurrentState(Drawable drawable) {
+        }
+
+        @Override
+        public void setAutoMirrored(Drawable drawable, boolean mirrored) {
+        }
+
+        @Override
+        public boolean isAutoMirrored(Drawable drawable) {
+            return false;
+        }
+
+        @Override
+        public void setHotspot(Drawable drawable, float x, float y) {
+        }
+
+        @Override
+        public void setHotspotBounds(Drawable drawable, int left, int top, int right, int bottom) {
+        }
+
+        @Override
+        public void setTint(Drawable drawable, int tint) {
+            DrawableCompatBase.setTint(drawable, tint);
+        }
+
+        @Override
+        public void setTintList(Drawable drawable, ColorStateList tint) {
+            DrawableCompatBase.setTintList(drawable, tint);
+        }
+
+        @Override
+        public void setTintMode(Drawable drawable, PorterDuff.Mode tintMode) {
+            DrawableCompatBase.setTintMode(drawable, tintMode);
+        }
+
+        @Override
+        public Drawable wrap(Drawable drawable) {
+            return DrawableCompatBase.wrapForTinting(drawable);
+        }
+
+        @Override
+        public boolean setLayoutDirection(Drawable drawable, int layoutDirection) {
+            // No op for API < 23
+            return false;
+        }
+
+        @Override
+        public int getLayoutDirection(Drawable drawable) {
+            return ViewCompat.LAYOUT_DIRECTION_LTR;
+        }
+
+        @Override
+        public int getAlpha(Drawable drawable) {
+            return 0;
+        }
+
+        @Override
+        public void applyTheme(Drawable drawable, Resources.Theme t) {
+        }
+
+        @Override
+        public boolean canApplyTheme(Drawable drawable) {
+            return false;
+        }
+
+        @Override
+        public ColorFilter getColorFilter(Drawable drawable) {
+            return null;
+        }
+
+        @Override
+        public void clearColorFilter(Drawable drawable) {
+            drawable.clearColorFilter();
+        }
+
+        @Override
+        public void inflate(Drawable drawable, Resources res, XmlPullParser parser,
+                            AttributeSet attrs, Resources.Theme t)
+                throws IOException, XmlPullParserException {
+            DrawableCompatBase.inflate(drawable, res, parser, attrs, t);
+        }
+    }
+
+    /**
+     * Interface implementation for devices with at least v11 APIs.
+     */
+    static class HoneycombDrawableImpl extends BaseDrawableImpl {
+        @Override
+        public void jumpToCurrentState(Drawable drawable) {
+            DrawableCompatHoneycomb.jumpToCurrentState(drawable);
+        }
+
+        @Override
+        public Drawable wrap(Drawable drawable) {
+            return DrawableCompatHoneycomb.wrapForTinting(drawable);
+        }
+    }
+
+    static class JellybeanMr1DrawableImpl extends HoneycombDrawableImpl {
+        @Override
+        public boolean setLayoutDirection(Drawable drawable, int layoutDirection) {
+            return DrawableCompatJellybeanMr1.setLayoutDirection(drawable, layoutDirection);
+        }
+
+        @Override
+        public int getLayoutDirection(Drawable drawable) {
+            final int dir = DrawableCompatJellybeanMr1.getLayoutDirection(drawable);
+            return dir >= 0 ? dir : ViewCompat.LAYOUT_DIRECTION_LTR;
+        }
+    }
+
+    /**
+     * Interface implementation for devices with at least KitKat APIs.
+     */
+    static class KitKatDrawableImpl extends JellybeanMr1DrawableImpl {
+        @Override
+        public void setAutoMirrored(Drawable drawable, boolean mirrored) {
+            DrawableCompatKitKat.setAutoMirrored(drawable, mirrored);
+        }
+
+        @Override
+        public boolean isAutoMirrored(Drawable drawable) {
+            return DrawableCompatKitKat.isAutoMirrored(drawable);
+        }
+
+        @Override
+        public Drawable wrap(Drawable drawable) {
+            return DrawableCompatKitKat.wrapForTinting(drawable);
+        }
+
+        @Override
+        public int getAlpha(Drawable drawable) {
+            return DrawableCompatKitKat.getAlpha(drawable);
+        }
+    }
+
+    /**
+     * Interface implementation for devices with at least L APIs.
+     */
+    static class LollipopDrawableImpl extends KitKatDrawableImpl {
+        @Override
+        public void setHotspot(Drawable drawable, float x, float y) {
+            DrawableCompatLollipop.setHotspot(drawable, x, y);
+        }
+
+        @Override
+        public void setHotspotBounds(Drawable drawable, int left, int top, int right, int bottom) {
+            DrawableCompatLollipop.setHotspotBounds(drawable, left, top, right, bottom);
+        }
+
+        @Override
+        public void setTint(Drawable drawable, int tint) {
+            DrawableCompatLollipop.setTint(drawable, tint);
+        }
+
+        @Override
+        public void setTintList(Drawable drawable, ColorStateList tint) {
+            DrawableCompatLollipop.setTintList(drawable, tint);
+        }
+
+        @Override
+        public void setTintMode(Drawable drawable, PorterDuff.Mode tintMode) {
+            DrawableCompatLollipop.setTintMode(drawable, tintMode);
+        }
+
+        @Override
+        public Drawable wrap(Drawable drawable) {
+            return DrawableCompatLollipop.wrapForTinting(drawable);
+        }
+
+        @Override
+        public void applyTheme(Drawable drawable, Resources.Theme t) {
+            DrawableCompatLollipop.applyTheme(drawable, t);
+        }
+
+        @Override
+        public boolean canApplyTheme(Drawable drawable) {
+            return DrawableCompatLollipop.canApplyTheme(drawable);
+        }
+
+        @Override
+        public ColorFilter getColorFilter(Drawable drawable) {
+            return DrawableCompatLollipop.getColorFilter(drawable);
+        }
+
+        @Override
+        public void clearColorFilter(Drawable drawable) {
+            DrawableCompatLollipop.clearColorFilter(drawable);
+        }
+
+        @Override
+        public void inflate(Drawable drawable, Resources res, XmlPullParser parser,
+                            AttributeSet attrs, Resources.Theme t)
+                throws IOException, XmlPullParserException {
+            DrawableCompatLollipop.inflate(drawable, res, parser, attrs, t);
+        }
+    }
+
+    /**
+     * Interface implementation for devices with at least M APIs.
+     */
+    static class MDrawableImpl extends LollipopDrawableImpl {
+        @Override
+        public boolean setLayoutDirection(Drawable drawable, int layoutDirection) {
+            return DrawableCompatApi23.setLayoutDirection(drawable, layoutDirection);
+        }
+
+        @Override
+        public int getLayoutDirection(Drawable drawable) {
+            return DrawableCompatApi23.getLayoutDirection(drawable);
+        }
+
+        @Override
+        public Drawable wrap(Drawable drawable) {
+            // No need to wrap on M+
+            return drawable;
+        }
+
+        @Override
+        public void clearColorFilter(Drawable drawable) {
+            // We can use clearColorFilter() safely on M+
+            drawable.clearColorFilter();
+        }
+    }
+
+    /**
+     * Select the correct implementation to use for the current platform.
+     */
+    static final DrawableImpl IMPL;
+    static {
+        final int version = android.os.Build.VERSION.SDK_INT;
+        if (version >= 23) {
+            IMPL = new MDrawableImpl();
+        } else if (version >= 21) {
+            IMPL = new LollipopDrawableImpl();
+        } else if (version >= 19) {
+            IMPL = new KitKatDrawableImpl();
+        } else if (version >= 17) {
+            IMPL = new JellybeanMr1DrawableImpl();
+        } else if (version >= 11) {
+            IMPL = new HoneycombDrawableImpl();
+        } else {
+            IMPL = new BaseDrawableImpl();
+        }
+    }
+
+    /**
+     * Call {@link Drawable#jumpToCurrentState() Drawable.jumpToCurrentState()}.
+     * <p>
+     * If running on a pre-{@link android.os.Build.VERSION_CODES#HONEYCOMB}
+     * device this method does nothing.
+     *
+     * @param drawable The Drawable against which to invoke the method.
+     */
+    public static void jumpToCurrentState(@NonNull Drawable drawable) {
+        IMPL.jumpToCurrentState(drawable);
+    }
+
+    /**
+     * Set whether this Drawable is automatically mirrored when its layout
+     * direction is RTL (right-to left). See
+     * {@link android.util.LayoutDirection}.
+     * <p>
+     * If running on a pre-{@link android.os.Build.VERSION_CODES#KITKAT} device
+     * this method does nothing.
+     *
+     * @param drawable The Drawable against which to invoke the method.
+     * @param mirrored Set to true if the Drawable should be mirrored, false if
+     *            not.
+     */
+    public static void setAutoMirrored(@NonNull Drawable drawable, boolean mirrored) {
+        IMPL.setAutoMirrored(drawable, mirrored);
+    }
+
+    /**
+     * Tells if this Drawable will be automatically mirrored when its layout
+     * direction is RTL right-to-left. See {@link android.util.LayoutDirection}.
+     * <p>
+     * If running on a pre-{@link android.os.Build.VERSION_CODES#KITKAT} device
+     * this method returns false.
+     *
+     * @param drawable The Drawable against which to invoke the method.
+     * @return boolean Returns true if this Drawable will be automatically
+     *         mirrored.
+     */
+    public static boolean isAutoMirrored(@NonNull Drawable drawable) {
+        return IMPL.isAutoMirrored(drawable);
+    }
+
+    /**
+     * Specifies the hotspot's location within the drawable.
+     *
+     * @param drawable The Drawable against which to invoke the method.
+     * @param x The X coordinate of the center of the hotspot
+     * @param y The Y coordinate of the center of the hotspot
+     */
+    public static void setHotspot(@NonNull Drawable drawable, float x, float y) {
+        IMPL.setHotspot(drawable, x, y);
+    }
+
+    /**
+     * Sets the bounds to which the hotspot is constrained, if they should be
+     * different from the drawable bounds.
+     *
+     * @param drawable The Drawable against which to invoke the method.
+     */
+    public static void setHotspotBounds(@NonNull Drawable drawable, int left, int top,
+            int right, int bottom) {
+        IMPL.setHotspotBounds(drawable, left, top, right, bottom);
+    }
+
+    /**
+     * Specifies a tint for {@code drawable}.
+     *
+     * @param drawable The Drawable against which to invoke the method.
+     * @param tint     Color to use for tinting this drawable
+     */
+    public static void setTint(@NonNull Drawable drawable, @ColorInt int tint) {
+        IMPL.setTint(drawable, tint);
+    }
+
+    /**
+     * Specifies a tint for {@code drawable} as a color state list.
+     *
+     * @param drawable The Drawable against which to invoke the method.
+     * @param tint     Color state list to use for tinting this drawable, or null to clear the tint
+     */
+    public static void setTintList(@NonNull Drawable drawable, @Nullable ColorStateList tint) {
+        IMPL.setTintList(drawable, tint);
+    }
+
+    /**
+     * Specifies a tint blending mode for {@code drawable}.
+     *
+     * @param drawable The Drawable against which to invoke the method.
+     * @param tintMode A Porter-Duff blending mode
+     */
+    public static void setTintMode(@NonNull Drawable drawable, @Nullable PorterDuff.Mode tintMode) {
+        IMPL.setTintMode(drawable, tintMode);
+    }
+
+    /**
+     * Get the alpha value of the {@code drawable}.
+     * 0 means fully transparent, 255 means fully opaque.
+     *
+     * @param drawable The Drawable against which to invoke the method.
+     */
+    public static int getAlpha(@NonNull Drawable drawable) {
+        return IMPL.getAlpha(drawable);
+    }
+
+    /**
+     * Applies the specified theme to this Drawable and its children.
+     */
+    public static void applyTheme(@NonNull Drawable drawable, @NonNull Resources.Theme t) {
+        IMPL.applyTheme(drawable, t);
+    }
+
+    /**
+     * Whether a theme can be applied to this Drawable and its children.
+     */
+    public static boolean canApplyTheme(@NonNull Drawable drawable) {
+        return IMPL.canApplyTheme(drawable);
+    }
+
+    /**
+     * Returns the current color filter, or {@code null} if none set.
+     *
+     * @return the current color filter, or {@code null} if none set
+     */
+    public static ColorFilter getColorFilter(@NonNull Drawable drawable) {
+        return IMPL.getColorFilter(drawable);
+    }
+
+    /**
+     * Removes the color filter from the given drawable.
+     */
+    public static void clearColorFilter(@NonNull Drawable drawable) {
+        IMPL.clearColorFilter(drawable);
+    }
+
+    /**
+     * Inflate this Drawable from an XML resource optionally styled by a theme.
+     *
+     * @param res Resources used to resolve attribute values
+     * @param parser XML parser from which to inflate this Drawable
+     * @param attrs Base set of attribute values
+     * @param theme Theme to apply, may be null
+     * @throws XmlPullParserException
+     * @throws IOException
+     */
+    public static void inflate(@NonNull Drawable drawable, @NonNull Resources res,
+            @NonNull XmlPullParser parser, @NonNull AttributeSet attrs,
+            @Nullable Resources.Theme theme)
+            throws XmlPullParserException, IOException {
+        IMPL.inflate(drawable, res, parser, attrs, theme);
+    }
+
+    /**
+     * Potentially wrap {@code drawable} so that it may be used for tinting across the
+     * different API levels, via the tinting methods in this class.
+     *
+     * <p>You must use the result of this call. If the given drawable is being used by a view
+     * (as it's background for instance), you must replace the original drawable with
+     * the result of this call:</p>
+     *
+     * <pre>
+     * Drawable bg = DrawableCompat.wrap(view.getBackground());
+     * // Need to set the background with the wrapped drawable
+     * view.setBackground(bg);
+     *
+     * // You can now tint the drawable
+     * DrawableCompat.setTint(bg, ...);
+     * </pre>
+     *
+     * <p>If you need to get hold of the original {@link android.graphics.drawable.Drawable} again,
+     * you can use the value returned from {@link #unwrap(Drawable)}.</p>
+     *
+     * @param drawable The Drawable to process
+     * @return A drawable capable of being tinted across all API levels.
+     *
+     * @see #setTint(Drawable, int)
+     * @see #setTintList(Drawable, ColorStateList)
+     * @see #setTintMode(Drawable, PorterDuff.Mode)
+     * @see #unwrap(Drawable)
+     */
+    public static Drawable wrap(@NonNull Drawable drawable) {
+        return IMPL.wrap(drawable);
+    }
+
+    /**
+     * Unwrap {@code drawable} if it is the result of a call to {@link #wrap(Drawable)}. If
+     * the {@code drawable} is not the result of a call to {@link #wrap(Drawable)} then
+     * {@code drawable} is returned as-is.
+     *
+     * @param drawable The drawable to unwrap
+     * @return the unwrapped {@link Drawable} or {@code drawable} if it hasn't been wrapped.
+     *
+     * @see #wrap(Drawable)
+     */
+    public static <T extends Drawable> T unwrap(@NonNull Drawable drawable) {
+        if (drawable instanceof DrawableWrapper) {
+            return (T) ((DrawableWrapper) drawable).getWrappedDrawable();
+        }
+        return (T) drawable;
+    }
+
+    /**
+     * Set the layout direction for this drawable. Should be a resolved
+     * layout direction, as the Drawable has no capacity to do the resolution on
+     * its own.
+     *
+     * @param layoutDirection the resolved layout direction for the drawable,
+     *                        either {@link ViewCompat#LAYOUT_DIRECTION_LTR}
+     *                        or {@link ViewCompat#LAYOUT_DIRECTION_RTL}
+     * @return {@code true} if the layout direction change has caused the
+     *         appearance of the drawable to change such that it needs to be
+     *         re-drawn, {@code false} otherwise
+     * @see #getLayoutDirection(Drawable)
+     */
+    public static boolean setLayoutDirection(@NonNull Drawable drawable, int layoutDirection) {
+        return IMPL.setLayoutDirection(drawable, layoutDirection);
+    }
+
+    /**
+     * Returns the resolved layout direction for this Drawable.
+     *
+     * @return One of {@link ViewCompat#LAYOUT_DIRECTION_LTR},
+     *         {@link ViewCompat#LAYOUT_DIRECTION_RTL}
+     * @see #setLayoutDirection(Drawable, int)
+     */
+    public static int getLayoutDirection(@NonNull Drawable drawable) {
+        return IMPL.getLayoutDirection(drawable);
+    }
+
+    private DrawableCompat() {}
+}
diff --git a/v4/java/android/support/v4/hardware/display/DisplayManagerCompat.java b/compat/java/android/support/v4/hardware/display/DisplayManagerCompat.java
similarity index 100%
rename from v4/java/android/support/v4/hardware/display/DisplayManagerCompat.java
rename to compat/java/android/support/v4/hardware/display/DisplayManagerCompat.java
diff --git a/v4/java/android/support/v4/hardware/fingerprint/FingerprintManagerCompat.java b/compat/java/android/support/v4/hardware/fingerprint/FingerprintManagerCompat.java
similarity index 100%
rename from v4/java/android/support/v4/hardware/fingerprint/FingerprintManagerCompat.java
rename to compat/java/android/support/v4/hardware/fingerprint/FingerprintManagerCompat.java
diff --git a/v4/java/android/support/v4/internal/view/SupportMenu.java b/compat/java/android/support/v4/internal/view/SupportMenu.java
similarity index 100%
rename from v4/java/android/support/v4/internal/view/SupportMenu.java
rename to compat/java/android/support/v4/internal/view/SupportMenu.java
diff --git a/v4/java/android/support/v4/internal/view/SupportMenuItem.java b/compat/java/android/support/v4/internal/view/SupportMenuItem.java
similarity index 100%
rename from v4/java/android/support/v4/internal/view/SupportMenuItem.java
rename to compat/java/android/support/v4/internal/view/SupportMenuItem.java
diff --git a/v4/java/android/support/v4/internal/view/SupportSubMenu.java b/compat/java/android/support/v4/internal/view/SupportSubMenu.java
similarity index 100%
rename from v4/java/android/support/v4/internal/view/SupportSubMenu.java
rename to compat/java/android/support/v4/internal/view/SupportSubMenu.java
diff --git a/compat/java/android/support/v4/net/ConnectivityManagerCompat.java b/compat/java/android/support/v4/net/ConnectivityManagerCompat.java
new file mode 100644
index 0000000..9137d4a
--- /dev/null
+++ b/compat/java/android/support/v4/net/ConnectivityManagerCompat.java
@@ -0,0 +1,124 @@
+/*
+ * Copyright (C) 2012 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 android.support.v4.net;
+
+import android.content.Intent;
+import android.net.ConnectivityManager;
+import android.net.NetworkInfo;
+import android.os.Build;
+
+import static android.net.ConnectivityManager.TYPE_MOBILE;
+import static android.net.ConnectivityManager.TYPE_MOBILE_DUN;
+import static android.net.ConnectivityManager.TYPE_MOBILE_HIPRI;
+import static android.net.ConnectivityManager.TYPE_MOBILE_MMS;
+import static android.net.ConnectivityManager.TYPE_MOBILE_SUPL;
+import static android.net.ConnectivityManager.TYPE_WIFI;
+import static android.net.ConnectivityManager.TYPE_WIMAX;
+
+/**
+ * Helper for accessing features in {@link ConnectivityManager} introduced after
+ * API level 16 in a backwards compatible fashion.
+ */
+public final class ConnectivityManagerCompat {
+
+    interface ConnectivityManagerCompatImpl {
+        boolean isActiveNetworkMetered(ConnectivityManager cm);
+    }
+
+    static class BaseConnectivityManagerCompatImpl implements ConnectivityManagerCompatImpl {
+        @Override
+        public boolean isActiveNetworkMetered(ConnectivityManager cm) {
+            final NetworkInfo info = cm.getActiveNetworkInfo();
+            if (info == null) {
+                // err on side of caution
+                return true;
+            }
+
+            final int type = info.getType();
+            switch (type) {
+                case TYPE_MOBILE:
+                case TYPE_MOBILE_DUN:
+                case TYPE_MOBILE_HIPRI:
+                case TYPE_MOBILE_MMS:
+                case TYPE_MOBILE_SUPL:
+                case TYPE_WIMAX:
+                    return true;
+                case TYPE_WIFI:
+                    return false;
+                default:
+                    // err on side of caution
+                    return true;
+            }
+        }
+    }
+
+    static class HoneycombMR2ConnectivityManagerCompatImpl
+            implements ConnectivityManagerCompatImpl {
+        @Override
+        public boolean isActiveNetworkMetered(ConnectivityManager cm) {
+            return ConnectivityManagerCompatHoneycombMR2.isActiveNetworkMetered(cm);
+        }
+    }
+
+    static class JellyBeanConnectivityManagerCompatImpl implements ConnectivityManagerCompatImpl {
+        @Override
+        public boolean isActiveNetworkMetered(ConnectivityManager cm) {
+            return ConnectivityManagerCompatJellyBean.isActiveNetworkMetered(cm);
+        }
+    }
+
+    private static final ConnectivityManagerCompatImpl IMPL;
+
+    static {
+        if (Build.VERSION.SDK_INT >= 16) {
+            IMPL = new JellyBeanConnectivityManagerCompatImpl();
+        } else if (Build.VERSION.SDK_INT >= 13) {
+            IMPL = new HoneycombMR2ConnectivityManagerCompatImpl();
+        } else {
+            IMPL = new BaseConnectivityManagerCompatImpl();
+        }
+    }
+
+    /**
+     * Returns if the currently active data network is metered. A network is
+     * classified as metered when the user is sensitive to heavy data usage on
+     * that connection. You should check this before doing large data transfers,
+     * and warn the user or delay the operation until another network is
+     * available.
+     */
+    public static boolean isActiveNetworkMetered(ConnectivityManager cm) {
+        return IMPL.isActiveNetworkMetered(cm);
+    }
+
+    /**
+     * Return the {@link NetworkInfo} that caused the given
+     * {@link ConnectivityManager#CONNECTIVITY_ACTION} broadcast. This obtains
+     * the current state from {@link ConnectivityManager} instead of using the
+     * potentially-stale value from
+     * {@link ConnectivityManager#EXTRA_NETWORK_INFO}. May be {@code null}.
+     */
+    public static NetworkInfo getNetworkInfoFromBroadcast(ConnectivityManager cm, Intent intent) {
+        final NetworkInfo info = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
+        if (info != null) {
+            return cm.getNetworkInfo(info.getType());
+        } else {
+            return null;
+        }
+    }
+
+    private ConnectivityManagerCompat() {}
+}
diff --git a/v4/java/android/support/v4/net/TrafficStatsCompat.java b/compat/java/android/support/v4/net/TrafficStatsCompat.java
similarity index 100%
rename from v4/java/android/support/v4/net/TrafficStatsCompat.java
rename to compat/java/android/support/v4/net/TrafficStatsCompat.java
diff --git a/v4/java/android/support/v4/os/AsyncTaskCompat.java b/compat/java/android/support/v4/os/AsyncTaskCompat.java
similarity index 100%
rename from v4/java/android/support/v4/os/AsyncTaskCompat.java
rename to compat/java/android/support/v4/os/AsyncTaskCompat.java
diff --git a/v4/java/android/support/v4/os/CancellationSignal.java b/compat/java/android/support/v4/os/CancellationSignal.java
similarity index 100%
rename from v4/java/android/support/v4/os/CancellationSignal.java
rename to compat/java/android/support/v4/os/CancellationSignal.java
diff --git a/v4/java/android/support/v4/os/EnvironmentCompat.java b/compat/java/android/support/v4/os/EnvironmentCompat.java
similarity index 100%
rename from v4/java/android/support/v4/os/EnvironmentCompat.java
rename to compat/java/android/support/v4/os/EnvironmentCompat.java
diff --git a/v4/java/android/support/v4/os/IResultReceiver.aidl b/compat/java/android/support/v4/os/IResultReceiver.aidl
similarity index 100%
rename from v4/java/android/support/v4/os/IResultReceiver.aidl
rename to compat/java/android/support/v4/os/IResultReceiver.aidl
diff --git a/v4/java/android/support/v4/os/OperationCanceledException.java b/compat/java/android/support/v4/os/OperationCanceledException.java
similarity index 100%
rename from v4/java/android/support/v4/os/OperationCanceledException.java
rename to compat/java/android/support/v4/os/OperationCanceledException.java
diff --git a/v4/java/android/support/v4/os/ParcelableCompat.java b/compat/java/android/support/v4/os/ParcelableCompat.java
similarity index 100%
rename from v4/java/android/support/v4/os/ParcelableCompat.java
rename to compat/java/android/support/v4/os/ParcelableCompat.java
diff --git a/v4/java/android/support/v4/os/ResultReceiver.aidl b/compat/java/android/support/v4/os/ResultReceiver.aidl
similarity index 100%
rename from v4/java/android/support/v4/os/ResultReceiver.aidl
rename to compat/java/android/support/v4/os/ResultReceiver.aidl
diff --git a/compat/java/android/support/v4/os/ResultReceiver.java b/compat/java/android/support/v4/os/ResultReceiver.java
new file mode 100644
index 0000000..ce66dc6
--- /dev/null
+++ b/compat/java/android/support/v4/os/ResultReceiver.java
@@ -0,0 +1,149 @@
+/*
+ * Copyright (C) 2015 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 android.support.v4.os;
+
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.os.RemoteException;
+import android.support.v4.os.IResultReceiver;
+
+/**
+ * Generic interface for receiving a callback result from someone.  Use this
+ * by creating a subclass and implement {@link #onReceiveResult}, which you can
+ * then pass to others and send through IPC, and receive results they
+ * supply with {@link #send}.
+ *
+ * <p>Note: the implementation underneath is just a simple wrapper around
+ * a {@link Binder} that is used to perform the communication.  This means
+ * semantically you should treat it as such: this class does not impact process
+ * lifecycle management (you must be using some higher-level component to tell
+ * the system that your process needs to continue running), the connection will
+ * break if your process goes away for any reason, etc.</p>
+ * @hide
+ */
+public class ResultReceiver implements Parcelable {
+    final boolean mLocal;
+    final Handler mHandler;
+    
+    IResultReceiver mReceiver;
+    
+    class MyRunnable implements Runnable {
+        final int mResultCode;
+        final Bundle mResultData;
+        
+        MyRunnable(int resultCode, Bundle resultData) {
+            mResultCode = resultCode;
+            mResultData = resultData;
+        }
+        
+        @Override
+        public void run() {
+            onReceiveResult(mResultCode, mResultData);
+        }
+    }
+    
+    class MyResultReceiver extends IResultReceiver.Stub {
+        @Override
+        public void send(int resultCode, Bundle resultData) {
+            if (mHandler != null) {
+                mHandler.post(new MyRunnable(resultCode, resultData));
+            } else {
+                onReceiveResult(resultCode, resultData);
+            }
+        }
+    }
+    
+    /**
+     * Create a new ResultReceive to receive results.  Your
+     * {@link #onReceiveResult} method will be called from the thread running
+     * <var>handler</var> if given, or from an arbitrary thread if null.
+     */
+    public ResultReceiver(Handler handler) {
+        mLocal = true;
+        mHandler = handler;
+    }
+    
+    /**
+     * Deliver a result to this receiver.  Will call {@link #onReceiveResult},
+     * always asynchronously if the receiver has supplied a Handler in which
+     * to dispatch the result.
+     * @param resultCode Arbitrary result code to deliver, as defined by you.
+     * @param resultData Any additional data provided by you.
+     */
+    public void send(int resultCode, Bundle resultData) {
+        if (mLocal) {
+            if (mHandler != null) {
+                mHandler.post(new MyRunnable(resultCode, resultData));
+            } else {
+                onReceiveResult(resultCode, resultData);
+            }
+            return;
+        }
+        
+        if (mReceiver != null) {
+            try {
+                mReceiver.send(resultCode, resultData);
+            } catch (RemoteException e) {
+            }
+        }
+    }
+    
+    /**
+     * Override to receive results delivered to this object.
+     * 
+     * @param resultCode Arbitrary result code delivered by the sender, as
+     * defined by the sender.
+     * @param resultData Any additional data provided by the sender.
+     */
+    protected void onReceiveResult(int resultCode, Bundle resultData) {
+    }
+    
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @Override
+    public void writeToParcel(Parcel out, int flags) {
+        synchronized (this) {
+            if (mReceiver == null) {
+                mReceiver = new MyResultReceiver();
+            }
+            out.writeStrongBinder(mReceiver.asBinder());
+        }
+    }
+
+    ResultReceiver(Parcel in) {
+        mLocal = false;
+        mHandler = null;
+        mReceiver = IResultReceiver.Stub.asInterface(in.readStrongBinder());
+    }
+    
+    public static final Creator<ResultReceiver> CREATOR
+            = new Creator<ResultReceiver>() {
+        @Override
+        public ResultReceiver createFromParcel(Parcel in) {
+            return new ResultReceiver(in);
+        }
+        @Override
+        public ResultReceiver[] newArray(int size) {
+            return new ResultReceiver[size];
+        }
+    };
+}
diff --git a/v4/java/android/support/v4/os/TraceCompat.java b/compat/java/android/support/v4/os/TraceCompat.java
similarity index 100%
rename from v4/java/android/support/v4/os/TraceCompat.java
rename to compat/java/android/support/v4/os/TraceCompat.java
diff --git a/v4/java/android/support/v4/os/UserManagerCompat.java b/compat/java/android/support/v4/os/UserManagerCompat.java
similarity index 100%
rename from v4/java/android/support/v4/os/UserManagerCompat.java
rename to compat/java/android/support/v4/os/UserManagerCompat.java
diff --git a/v4/java/android/support/v4/os/package.html b/compat/java/android/support/v4/os/package.html
similarity index 100%
rename from v4/java/android/support/v4/os/package.html
rename to compat/java/android/support/v4/os/package.html
diff --git a/v4/java/android/support/v4/text/ICUCompat.java b/compat/java/android/support/v4/text/ICUCompat.java
similarity index 100%
rename from v4/java/android/support/v4/text/ICUCompat.java
rename to compat/java/android/support/v4/text/ICUCompat.java
diff --git a/v4/java/android/support/v4/text/TextDirectionHeuristicCompat.java b/compat/java/android/support/v4/text/TextDirectionHeuristicCompat.java
similarity index 100%
rename from v4/java/android/support/v4/text/TextDirectionHeuristicCompat.java
rename to compat/java/android/support/v4/text/TextDirectionHeuristicCompat.java
diff --git a/v4/java/android/support/v4/text/TextDirectionHeuristicsCompat.java b/compat/java/android/support/v4/text/TextDirectionHeuristicsCompat.java
similarity index 100%
rename from v4/java/android/support/v4/text/TextDirectionHeuristicsCompat.java
rename to compat/java/android/support/v4/text/TextDirectionHeuristicsCompat.java
diff --git a/compat/java/android/support/v4/text/TextUtilsCompat.java b/compat/java/android/support/v4/text/TextUtilsCompat.java
new file mode 100644
index 0000000..f512c16
--- /dev/null
+++ b/compat/java/android/support/v4/text/TextUtilsCompat.java
@@ -0,0 +1,155 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.support.v4.text;
+
+import android.os.Build;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.v4.view.ViewCompat;
+
+import java.util.Locale;
+
+public final class TextUtilsCompat {
+    private static class TextUtilsCompatImpl {
+        @NonNull
+        public String htmlEncode(@NonNull String s) {
+            StringBuilder sb = new StringBuilder();
+            char c;
+            for (int i = 0; i < s.length(); i++) {
+                c = s.charAt(i);
+                switch (c) {
+                    case '<':
+                        sb.append("&lt;"); //$NON-NLS-1$
+                        break;
+                    case '>':
+                        sb.append("&gt;"); //$NON-NLS-1$
+                        break;
+                    case '&':
+                        sb.append("&amp;"); //$NON-NLS-1$
+                        break;
+                    case '\'':
+                        //http://www.w3.org/TR/xhtml1
+                        // The named character reference &apos; (the apostrophe, U+0027) was
+                        // introduced in XML 1.0 but does not appear in HTML. Authors should
+                        // therefore use &#39; instead of &apos; to work as expected in HTML 4
+                        // user agents.
+                        sb.append("&#39;"); //$NON-NLS-1$
+                        break;
+                    case '"':
+                        sb.append("&quot;"); //$NON-NLS-1$
+                        break;
+                    default:
+                        sb.append(c);
+                }
+            }
+            return sb.toString();
+        }
+
+        public int getLayoutDirectionFromLocale(@Nullable Locale locale) {
+            if (locale != null && !locale.equals(ROOT)) {
+                final String scriptSubtag = ICUCompat.maximizeAndGetScript(locale);
+                if (scriptSubtag == null) return getLayoutDirectionFromFirstChar(locale);
+
+                // This is intentionally limited to Arabic and Hebrew scripts, since older
+                // versions of Android platform only considered those scripts to be right-to-left.
+                if (scriptSubtag.equalsIgnoreCase(ARAB_SCRIPT_SUBTAG) ||
+                        scriptSubtag.equalsIgnoreCase(HEBR_SCRIPT_SUBTAG)) {
+                    return ViewCompat.LAYOUT_DIRECTION_RTL;
+                }
+            }
+            return ViewCompat.LAYOUT_DIRECTION_LTR;
+        }
+
+        /**
+         * Fallback algorithm to detect the locale direction. Rely on the first char of the
+         * localized locale name. This will not work if the localized locale name is in English
+         * (this is the case for ICU 4.4 and "Urdu" script)
+         *
+         * @param locale
+         * @return the layout direction. This may be one of:
+         * {@link ViewCompat#LAYOUT_DIRECTION_LTR} or
+         * {@link ViewCompat#LAYOUT_DIRECTION_RTL}.
+         *
+         * Be careful: this code will need to be updated when vertical scripts will be supported
+         */
+        private static int getLayoutDirectionFromFirstChar(@NonNull Locale locale) {
+            switch(Character.getDirectionality(locale.getDisplayName(locale).charAt(0))) {
+                case Character.DIRECTIONALITY_RIGHT_TO_LEFT:
+                case Character.DIRECTIONALITY_RIGHT_TO_LEFT_ARABIC:
+                    return ViewCompat.LAYOUT_DIRECTION_RTL;
+
+                case Character.DIRECTIONALITY_LEFT_TO_RIGHT:
+                default:
+                    return ViewCompat.LAYOUT_DIRECTION_LTR;
+            }
+        }
+    }
+
+    private static class TextUtilsCompatJellybeanMr1Impl extends TextUtilsCompatImpl {
+        @Override
+        @NonNull
+        public String htmlEncode(@NonNull String s) {
+            return TextUtilsCompatJellybeanMr1.htmlEncode(s);
+        }
+
+        @Override
+        public int getLayoutDirectionFromLocale(@Nullable Locale locale) {
+            return TextUtilsCompatJellybeanMr1.getLayoutDirectionFromLocale(locale);
+        }
+    }
+
+    private static final TextUtilsCompatImpl IMPL;
+    static {
+        final int version = Build.VERSION.SDK_INT;
+        if (version >= 17) { // JellyBean MR1
+            IMPL = new TextUtilsCompatJellybeanMr1Impl();
+        } else {
+            IMPL = new TextUtilsCompatImpl();
+        }
+    }
+
+    /**
+     * Html-encode the string.
+     * @param s the string to be encoded
+     * @return the encoded string
+     */
+    @NonNull
+    public static String htmlEncode(@NonNull String s) {
+        return IMPL.htmlEncode(s);
+    }
+
+    /**
+     * Return the layout direction for a given Locale
+     *
+     * @param locale the Locale for which we want the layout direction. Can be null.
+     * @return the layout direction. This may be one of:
+     * {@link ViewCompat#LAYOUT_DIRECTION_LTR} or
+     * {@link ViewCompat#LAYOUT_DIRECTION_RTL}.
+     *
+     * Be careful: this code will need to be updated when vertical scripts will be supported
+     */
+    public static int getLayoutDirectionFromLocale(@Nullable Locale locale) {
+        return IMPL.getLayoutDirectionFromLocale(locale);
+    }
+
+    public static final Locale ROOT = new Locale("", "");
+
+    private static String ARAB_SCRIPT_SUBTAG = "Arab";
+    private static String HEBR_SCRIPT_SUBTAG = "Hebr";
+
+    private TextUtilsCompat() {}
+}
diff --git a/compat/java/android/support/v4/text/util/LinkifyCompat.java b/compat/java/android/support/v4/text/util/LinkifyCompat.java
new file mode 100644
index 0000000..3894f6b
--- /dev/null
+++ b/compat/java/android/support/v4/text/util/LinkifyCompat.java
@@ -0,0 +1,503 @@
+/*
+ * Copyright (C) 2016 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 android.support.v4.text.util;
+
+import android.support.annotation.IntDef;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.v4.util.PatternsCompat;
+import android.text.Spannable;
+import android.text.SpannableString;
+import android.text.Spanned;
+import android.text.method.LinkMovementMethod;
+import android.text.method.MovementMethod;
+import android.text.style.URLSpan;
+import android.text.util.Linkify;
+import android.text.util.Linkify.MatchFilter;
+import android.text.util.Linkify.TransformFilter;
+import android.webkit.WebView;
+import android.widget.TextView;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Locale;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * LinkifyCompat brings in {@code Linkify} improvements for URLs and email addresses to older API
+ * levels.
+ */
+public final class LinkifyCompat {
+    private static final String[] EMPTY_STRING = new String[0];
+
+    private static final Comparator<LinkSpec>  COMPARATOR = new Comparator<LinkSpec>() {
+        @Override
+        public final int compare(LinkSpec a, LinkSpec b) {
+            if (a.start < b.start) {
+                return -1;
+            }
+
+            if (a.start > b.start) {
+                return 1;
+            }
+
+            if (a.end < b.end) {
+                return 1;
+            }
+
+            if (a.end > b.end) {
+                return -1;
+            }
+
+            return 0;
+        }
+    };
+
+    @IntDef(flag = true, value = { Linkify.WEB_URLS, Linkify.EMAIL_ADDRESSES, Linkify.PHONE_NUMBERS,
+            Linkify.MAP_ADDRESSES, Linkify.ALL })
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface LinkifyMask {}
+
+    /**
+     *  Scans the text of the provided Spannable and turns all occurrences
+     *  of the link types indicated in the mask into clickable links.
+     *  If the mask is nonzero, it also removes any existing URLSpans
+     *  attached to the Spannable, to avoid problems if you call it
+     *  repeatedly on the same text.
+     *
+     *  @param text Spannable whose text is to be marked-up with links
+     *  @param mask Mask to define which kinds of links will be searched.
+     *
+     *  @return True if at least one link is found and applied.
+     */
+    public static final boolean addLinks(@NonNull Spannable text, @LinkifyMask int mask) {
+        if (mask == 0) {
+            return false;
+        }
+
+        URLSpan[] old = text.getSpans(0, text.length(), URLSpan.class);
+
+        for (int i = old.length - 1; i >= 0; i--) {
+            text.removeSpan(old[i]);
+        }
+
+        // Use framework to linkify phone numbers.
+        boolean frameworkReturn = false;
+        if ((mask & Linkify.PHONE_NUMBERS) != 0) {
+            frameworkReturn = Linkify.addLinks(text, Linkify.PHONE_NUMBERS);
+        }
+
+        ArrayList<LinkSpec> links = new ArrayList<LinkSpec>();
+
+        if ((mask & Linkify.WEB_URLS) != 0) {
+            gatherLinks(links, text, PatternsCompat.AUTOLINK_WEB_URL,
+                    new String[] { "http://", "https://", "rtsp://" },
+                    Linkify.sUrlMatchFilter, null);
+        }
+
+        if ((mask & Linkify.EMAIL_ADDRESSES) != 0) {
+            gatherLinks(links, text, PatternsCompat.AUTOLINK_EMAIL_ADDRESS,
+                    new String[] { "mailto:" },
+                    null, null);
+        }
+
+        if ((mask & Linkify.MAP_ADDRESSES) != 0) {
+            gatherMapLinks(links, text);
+        }
+
+        pruneOverlaps(links, text);
+
+        if (links.size() == 0) {
+            return false;
+        }
+
+        for (LinkSpec link: links) {
+            if (link.frameworkAddedSpan == null) {
+                applyLink(link.url, link.start, link.end, text);
+            }
+        }
+
+        return true;
+    }
+
+    /**
+     *  Scans the text of the provided TextView and turns all occurrences of
+     *  the link types indicated in the mask into clickable links.  If matches
+     *  are found the movement method for the TextView is set to
+     *  LinkMovementMethod.
+     *
+     *  @param text TextView whose text is to be marked-up with links
+     *  @param mask Mask to define which kinds of links will be searched.
+     *
+     *  @return True if at least one link is found and applied.
+     */
+    public static final boolean addLinks(@NonNull TextView text, @LinkifyMask int mask) {
+        if (mask == 0) {
+            return false;
+        }
+
+        CharSequence t = text.getText();
+
+        if (t instanceof Spannable) {
+            if (addLinks((Spannable) t, mask)) {
+                addLinkMovementMethod(text);
+                return true;
+            }
+
+            return false;
+        } else {
+            SpannableString s = SpannableString.valueOf(t);
+
+            if (addLinks(s, mask)) {
+                addLinkMovementMethod(text);
+                text.setText(s);
+
+                return true;
+            }
+
+            return false;
+        }
+    }
+
+    /**
+     *  Applies a regex to the text of a TextView turning the matches into
+     *  links.  If links are found then UrlSpans are applied to the link
+     *  text match areas, and the movement method for the text is changed
+     *  to LinkMovementMethod.
+     *
+     *  @param text         TextView whose text is to be marked-up with links
+     *  @param pattern      Regex pattern to be used for finding links
+     *  @param scheme       URL scheme string (eg <code>http://</code>) to be
+     *                      prepended to the links that do not start with this scheme.
+     */
+    public static final void addLinks(@NonNull TextView text, @NonNull Pattern pattern,
+            @Nullable String scheme) {
+        addLinks(text, pattern, scheme, null, null, null);
+    }
+
+    /**
+     *  Applies a regex to the text of a TextView turning the matches into
+     *  links.  If links are found then UrlSpans are applied to the link
+     *  text match areas, and the movement method for the text is changed
+     *  to LinkMovementMethod.
+     *
+     *  @param text         TextView whose text is to be marked-up with links
+     *  @param pattern      Regex pattern to be used for finding links
+     *  @param scheme       URL scheme string (eg <code>http://</code>) to be
+     *                      prepended to the links that do not start with this scheme.
+     *  @param matchFilter  The filter that is used to allow the client code
+     *                      additional control over which pattern matches are
+     *                      to be converted into links.
+     */
+    public static final void addLinks(@NonNull TextView text, @NonNull Pattern pattern,
+            @Nullable String scheme, @Nullable MatchFilter matchFilter,
+            @Nullable TransformFilter transformFilter) {
+        addLinks(text, pattern, scheme, null, matchFilter, transformFilter);
+    }
+
+    /**
+     *  Applies a regex to the text of a TextView turning the matches into
+     *  links.  If links are found then UrlSpans are applied to the link
+     *  text match areas, and the movement method for the text is changed
+     *  to LinkMovementMethod.
+     *
+     *  @param text TextView whose text is to be marked-up with links.
+     *  @param pattern Regex pattern to be used for finding links.
+     *  @param defaultScheme The default scheme to be prepended to links if the link does not
+     *                       start with one of the <code>schemes</code> given.
+     *  @param schemes Array of schemes (eg <code>http://</code>) to check if the link found
+     *                 contains a scheme. Passing a null or empty value means prepend defaultScheme
+     *                 to all links.
+     *  @param matchFilter  The filter that is used to allow the client code additional control
+     *                      over which pattern matches are to be converted into links.
+     *  @param transformFilter Filter to allow the client code to update the link found.
+     */
+    public static final void addLinks(@NonNull TextView text, @NonNull Pattern pattern,
+            @Nullable  String defaultScheme, @Nullable String[] schemes,
+            @Nullable MatchFilter matchFilter, @Nullable TransformFilter transformFilter) {
+        SpannableString spannable = SpannableString.valueOf(text.getText());
+
+        boolean linksAdded = addLinks(spannable, pattern, defaultScheme, schemes, matchFilter,
+                transformFilter);
+        if (linksAdded) {
+            text.setText(spannable);
+            addLinkMovementMethod(text);
+        }
+    }
+
+    /**
+     *  Applies a regex to a Spannable turning the matches into
+     *  links.
+     *
+     *  @param text         Spannable whose text is to be marked-up with links
+     *  @param pattern      Regex pattern to be used for finding links
+     *  @param scheme       URL scheme string (eg <code>http://</code>) to be
+     *                      prepended to the links that do not start with this scheme.
+     */
+    public static final boolean addLinks(@NonNull Spannable text, @NonNull Pattern pattern,
+            @Nullable String scheme) {
+        return addLinks(text, pattern, scheme, null, null, null);
+    }
+
+    /**
+     * Applies a regex to a Spannable turning the matches into
+     * links.
+     *
+     * @param spannable    Spannable whose text is to be marked-up with links
+     * @param pattern      Regex pattern to be used for finding links
+     * @param scheme       URL scheme string (eg <code>http://</code>) to be
+     *                     prepended to the links that do not start with this scheme.
+     * @param matchFilter  The filter that is used to allow the client code
+     *                     additional control over which pattern matches are
+     *                     to be converted into links.
+     * @param transformFilter Filter to allow the client code to update the link found.
+     *
+     * @return True if at least one link is found and applied.
+     */
+    public static final boolean addLinks(@NonNull Spannable spannable, @NonNull Pattern pattern,
+            @Nullable String scheme, @Nullable MatchFilter matchFilter,
+            @Nullable TransformFilter transformFilter) {
+        return addLinks(spannable, pattern, scheme, null, matchFilter,
+                transformFilter);
+    }
+
+    /**
+     * Applies a regex to a Spannable turning the matches into links.
+     *
+     * @param spannable Spannable whose text is to be marked-up with links.
+     * @param pattern Regex pattern to be used for finding links.
+     * @param defaultScheme The default scheme to be prepended to links if the link does not
+     *                      start with one of the <code>schemes</code> given.
+     * @param schemes Array of schemes (eg <code>http://</code>) to check if the link found
+     *                contains a scheme. Passing a null or empty value means prepend defaultScheme
+     *                to all links.
+     * @param matchFilter  The filter that is used to allow the client code additional control
+     *                     over which pattern matches are to be converted into links.
+     * @param transformFilter Filter to allow the client code to update the link found.
+     *
+     * @return True if at least one link is found and applied.
+     */
+    public static final boolean addLinks(@NonNull Spannable spannable, @NonNull Pattern pattern,
+            @Nullable  String defaultScheme, @Nullable String[] schemes,
+            @Nullable MatchFilter matchFilter, @Nullable TransformFilter transformFilter) {
+        final String[] schemesCopy;
+        if (defaultScheme == null) defaultScheme = "";
+        if (schemes == null || schemes.length < 1) {
+            schemes = EMPTY_STRING;
+        }
+
+        schemesCopy = new String[schemes.length + 1];
+        schemesCopy[0] = defaultScheme.toLowerCase(Locale.ROOT);
+        for (int index = 0; index < schemes.length; index++) {
+            String scheme = schemes[index];
+            schemesCopy[index + 1] = (scheme == null) ? "" : scheme.toLowerCase(Locale.ROOT);
+        }
+
+        boolean hasMatches = false;
+        Matcher m = pattern.matcher(spannable);
+
+        while (m.find()) {
+            int start = m.start();
+            int end = m.end();
+            boolean allowed = true;
+
+            if (matchFilter != null) {
+                allowed = matchFilter.acceptMatch(spannable, start, end);
+            }
+
+            if (allowed) {
+                String url = makeUrl(m.group(0), schemesCopy, m, transformFilter);
+
+                applyLink(url, start, end, spannable);
+                hasMatches = true;
+            }
+        }
+
+        return hasMatches;
+    }
+
+    private static void addLinkMovementMethod(@NonNull TextView t) {
+        MovementMethod m = t.getMovementMethod();
+
+        if ((m == null) || !(m instanceof LinkMovementMethod)) {
+            if (t.getLinksClickable()) {
+                t.setMovementMethod(LinkMovementMethod.getInstance());
+            }
+        }
+    }
+
+    private static String makeUrl(@NonNull String url, @NonNull String[] prefixes,
+            Matcher matcher, @Nullable Linkify.TransformFilter filter) {
+        if (filter != null) {
+            url = filter.transformUrl(matcher, url);
+        }
+
+        boolean hasPrefix = false;
+
+        for (int i = 0; i < prefixes.length; i++) {
+            if (url.regionMatches(true, 0, prefixes[i], 0, prefixes[i].length())) {
+                hasPrefix = true;
+
+                // Fix capitalization if necessary
+                if (!url.regionMatches(false, 0, prefixes[i], 0, prefixes[i].length())) {
+                    url = prefixes[i] + url.substring(prefixes[i].length());
+                }
+
+                break;
+            }
+        }
+
+        if (!hasPrefix && prefixes.length > 0) {
+            url = prefixes[0] + url;
+        }
+
+        return url;
+    }
+
+    private static void gatherLinks(ArrayList<LinkSpec> links,
+            Spannable s, Pattern pattern, String[] schemes,
+            Linkify.MatchFilter matchFilter, Linkify.TransformFilter transformFilter) {
+        Matcher m = pattern.matcher(s);
+
+        while (m.find()) {
+            int start = m.start();
+            int end = m.end();
+
+            if (matchFilter == null || matchFilter.acceptMatch(s, start, end)) {
+                LinkSpec spec = new LinkSpec();
+                String url = makeUrl(m.group(0), schemes, m, transformFilter);
+
+                spec.url = url;
+                spec.start = start;
+                spec.end = end;
+
+                links.add(spec);
+            }
+        }
+    }
+
+    private static void applyLink(String url, int start, int end, Spannable text) {
+        URLSpan span = new URLSpan(url);
+
+        text.setSpan(span, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+    }
+
+    private static final void gatherMapLinks(ArrayList<LinkSpec> links, Spannable s) {
+        String string = s.toString();
+        String address;
+        int base = 0;
+
+        try {
+            while ((address = WebView.findAddress(string)) != null) {
+                int start = string.indexOf(address);
+
+                if (start < 0) {
+                    break;
+                }
+
+                LinkSpec spec = new LinkSpec();
+                int length = address.length();
+                int end = start + length;
+
+                spec.start = base + start;
+                spec.end = base + end;
+                string = string.substring(end);
+                base += end;
+
+                String encodedAddress = null;
+
+                try {
+                    encodedAddress = URLEncoder.encode(address,"UTF-8");
+                } catch (UnsupportedEncodingException e) {
+                    continue;
+                }
+
+                spec.url = "geo:0,0?q=" + encodedAddress;
+                links.add(spec);
+            }
+        } catch (UnsupportedOperationException e) {
+            // findAddress may fail with an unsupported exception on platforms without a WebView.
+            // In this case, we will not append anything to the links variable: it would have died
+            // in WebView.findAddress.
+            return;
+        }
+    }
+
+    private static final void pruneOverlaps(ArrayList<LinkSpec> links, Spannable text) {
+        // Append spans added by framework
+        URLSpan[] urlSpans = text.getSpans(0, text.length(), URLSpan.class);
+        for (int i = 0; i < urlSpans.length; i++) {
+            LinkSpec spec = new LinkSpec();
+            spec.frameworkAddedSpan = urlSpans[i];
+            spec.start = text.getSpanStart(urlSpans[i]);
+            spec.end = text.getSpanEnd(urlSpans[i]);
+            links.add(spec);
+        }
+
+        Collections.sort(links, COMPARATOR);
+
+        int len = links.size();
+        int i = 0;
+
+        while (i < len - 1) {
+            LinkSpec a = links.get(i);
+            LinkSpec b = links.get(i + 1);
+            int remove = -1;
+
+            if ((a.start <= b.start) && (a.end > b.start)) {
+                if (b.end <= a.end) {
+                    remove = i + 1;
+                } else if ((a.end - a.start) > (b.end - b.start)) {
+                    remove = i + 1;
+                } else if ((a.end - a.start) < (b.end - b.start)) {
+                    remove = i;
+                }
+
+                if (remove != -1) {
+                    URLSpan span = links.get(remove).frameworkAddedSpan;
+                    if (span != null) {
+                        text.removeSpan(span);
+                    }
+                    links.remove(remove);
+                    len--;
+                    continue;
+                }
+
+            }
+
+            i++;
+        }
+    }
+
+    /**
+     * Do not create this static utility class.
+     */
+    private LinkifyCompat() {}
+
+    private static class LinkSpec {
+        URLSpan frameworkAddedSpan;
+        String url;
+        int start;
+        int end;
+    }
+}
diff --git a/v4/java/android/support/v4/util/ArrayMap.java b/compat/java/android/support/v4/util/ArrayMap.java
similarity index 100%
rename from v4/java/android/support/v4/util/ArrayMap.java
rename to compat/java/android/support/v4/util/ArrayMap.java
diff --git a/v4/java/android/support/v4/util/AtomicFile.java b/compat/java/android/support/v4/util/AtomicFile.java
similarity index 100%
rename from v4/java/android/support/v4/util/AtomicFile.java
rename to compat/java/android/support/v4/util/AtomicFile.java
diff --git a/v4/java/android/support/v4/util/CircularArray.java b/compat/java/android/support/v4/util/CircularArray.java
similarity index 100%
rename from v4/java/android/support/v4/util/CircularArray.java
rename to compat/java/android/support/v4/util/CircularArray.java
diff --git a/v4/java/android/support/v4/util/CircularIntArray.java b/compat/java/android/support/v4/util/CircularIntArray.java
similarity index 100%
rename from v4/java/android/support/v4/util/CircularIntArray.java
rename to compat/java/android/support/v4/util/CircularIntArray.java
diff --git a/v4/java/android/support/v4/util/ContainerHelpers.java b/compat/java/android/support/v4/util/ContainerHelpers.java
similarity index 100%
rename from v4/java/android/support/v4/util/ContainerHelpers.java
rename to compat/java/android/support/v4/util/ContainerHelpers.java
diff --git a/v4/java/android/support/v4/util/DebugUtils.java b/compat/java/android/support/v4/util/DebugUtils.java
similarity index 100%
rename from v4/java/android/support/v4/util/DebugUtils.java
rename to compat/java/android/support/v4/util/DebugUtils.java
diff --git a/v4/java/android/support/v4/util/LogWriter.java b/compat/java/android/support/v4/util/LogWriter.java
similarity index 100%
rename from v4/java/android/support/v4/util/LogWriter.java
rename to compat/java/android/support/v4/util/LogWriter.java
diff --git a/v4/java/android/support/v4/util/LongSparseArray.java b/compat/java/android/support/v4/util/LongSparseArray.java
similarity index 100%
rename from v4/java/android/support/v4/util/LongSparseArray.java
rename to compat/java/android/support/v4/util/LongSparseArray.java
diff --git a/v4/java/android/support/v4/util/LruCache.java b/compat/java/android/support/v4/util/LruCache.java
similarity index 100%
rename from v4/java/android/support/v4/util/LruCache.java
rename to compat/java/android/support/v4/util/LruCache.java
diff --git a/v4/java/android/support/v4/util/MapCollections.java b/compat/java/android/support/v4/util/MapCollections.java
similarity index 100%
rename from v4/java/android/support/v4/util/MapCollections.java
rename to compat/java/android/support/v4/util/MapCollections.java
diff --git a/v4/java/android/support/v4/util/Pair.java b/compat/java/android/support/v4/util/Pair.java
similarity index 100%
rename from v4/java/android/support/v4/util/Pair.java
rename to compat/java/android/support/v4/util/Pair.java
diff --git a/compat/java/android/support/v4/util/PatternsCompat.java b/compat/java/android/support/v4/util/PatternsCompat.java
new file mode 100644
index 0000000..bbd38a1
--- /dev/null
+++ b/compat/java/android/support/v4/util/PatternsCompat.java
@@ -0,0 +1,349 @@
+/*
+ * Copyright (C) 2016 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 android.support.v4.util;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * Commonly used regular expression patterns.
+ */
+public final class PatternsCompat {
+    /**
+     *  Regular expression to match all IANA top-level domains.
+     *
+     *  List accurate as of 2015/11/24.  List taken from:
+     *  http://data.iana.org/TLD/tlds-alpha-by-domain.txt
+     *  This pattern is auto-generated by frameworks/ex/common/tools/make-iana-tld-pattern.py
+     *
+     *  @hide
+     */
+    static final String IANA_TOP_LEVEL_DOMAINS =
+        "(?:"
+        + "(?:aaa|aarp|abb|abbott|abogado|academy|accenture|accountant|accountants|aco|active"
+        + "|actor|ads|adult|aeg|aero|afl|agency|aig|airforce|airtel|allfinanz|alsace|amica|amsterdam"
+        + "|android|apartments|app|apple|aquarelle|aramco|archi|army|arpa|arte|asia|associates"
+        + "|attorney|auction|audio|auto|autos|axa|azure|a[cdefgilmoqrstuwxz])"
+        + "|(?:band|bank|bar|barcelona|barclaycard|barclays|bargains|bauhaus|bayern|bbc|bbva"
+        + "|bcn|beats|beer|bentley|berlin|best|bet|bharti|bible|bid|bike|bing|bingo|bio|biz|black"
+        + "|blackfriday|bloomberg|blue|bms|bmw|bnl|bnpparibas|boats|bom|bond|boo|boots|boutique"
+        + "|bradesco|bridgestone|broadway|broker|brother|brussels|budapest|build|builders|business"
+        + "|buzz|bzh|b[abdefghijmnorstvwyz])"
+        + "|(?:cab|cafe|cal|camera|camp|cancerresearch|canon|capetown|capital|car|caravan|cards"
+        + "|care|career|careers|cars|cartier|casa|cash|casino|cat|catering|cba|cbn|ceb|center|ceo"
+        + "|cern|cfa|cfd|chanel|channel|chat|cheap|chloe|christmas|chrome|church|cipriani|cisco"
+        + "|citic|city|cityeats|claims|cleaning|click|clinic|clothing|cloud|club|clubmed|coach"
+        + "|codes|coffee|college|cologne|com|commbank|community|company|computer|comsec|condos"
+        + "|construction|consulting|contractors|cooking|cool|coop|corsica|country|coupons|courses"
+        + "|credit|creditcard|creditunion|cricket|crown|crs|cruises|csc|cuisinella|cymru|cyou|c[acdfghiklmnoruvwxyz])"
+        + "|(?:dabur|dad|dance|date|dating|datsun|day|dclk|deals|degree|delivery|dell|delta"
+        + "|democrat|dental|dentist|desi|design|dev|diamonds|diet|digital|direct|directory|discount"
+        + "|dnp|docs|dog|doha|domains|doosan|download|drive|durban|dvag|d[ejkmoz])"
+        + "|(?:earth|eat|edu|education|email|emerck|energy|engineer|engineering|enterprises"
+        + "|epson|equipment|erni|esq|estate|eurovision|eus|events|everbank|exchange|expert|exposed"
+        + "|express|e[cegrstu])"
+        + "|(?:fage|fail|fairwinds|faith|family|fan|fans|farm|fashion|feedback|ferrero|film"
+        + "|final|finance|financial|firmdale|fish|fishing|fit|fitness|flights|florist|flowers|flsmidth"
+        + "|fly|foo|football|forex|forsale|forum|foundation|frl|frogans|fund|furniture|futbol|fyi"
+        + "|f[ijkmor])"
+        + "|(?:gal|gallery|game|garden|gbiz|gdn|gea|gent|genting|ggee|gift|gifts|gives|giving"
+        + "|glass|gle|global|globo|gmail|gmo|gmx|gold|goldpoint|golf|goo|goog|google|gop|gov|grainger"
+        + "|graphics|gratis|green|gripe|group|gucci|guge|guide|guitars|guru|g[abdefghilmnpqrstuwy])"
+        + "|(?:hamburg|hangout|haus|healthcare|help|here|hermes|hiphop|hitachi|hiv|hockey|holdings"
+        + "|holiday|homedepot|homes|honda|horse|host|hosting|hoteles|hotmail|house|how|hsbc|hyundai"
+        + "|h[kmnrtu])"
+        + "|(?:ibm|icbc|ice|icu|ifm|iinet|immo|immobilien|industries|infiniti|info|ing|ink|institute"
+        + "|insure|int|international|investments|ipiranga|irish|ist|istanbul|itau|iwc|i[delmnoqrst])"
+        + "|(?:jaguar|java|jcb|jetzt|jewelry|jlc|jll|jobs|joburg|jprs|juegos|j[emop])"
+        + "|(?:kaufen|kddi|kia|kim|kinder|kitchen|kiwi|koeln|komatsu|krd|kred|kyoto|k[eghimnprwyz])"
+        + "|(?:lacaixa|lancaster|land|landrover|lasalle|lat|latrobe|law|lawyer|lds|lease|leclerc"
+        + "|legal|lexus|lgbt|liaison|lidl|life|lifestyle|lighting|limited|limo|linde|link|live"
+        + "|lixil|loan|loans|lol|london|lotte|lotto|love|ltd|ltda|lupin|luxe|luxury|l[abcikrstuvy])"
+        + "|(?:madrid|maif|maison|man|management|mango|market|marketing|markets|marriott|mba"
+        + "|media|meet|melbourne|meme|memorial|men|menu|meo|miami|microsoft|mil|mini|mma|mobi|moda"
+        + "|moe|moi|mom|monash|money|montblanc|mormon|mortgage|moscow|motorcycles|mov|movie|movistar"
+        + "|mtn|mtpc|mtr|museum|mutuelle|m[acdeghklmnopqrstuvwxyz])"
+        + "|(?:nadex|nagoya|name|navy|nec|net|netbank|network|neustar|new|news|nexus|ngo|nhk"
+        + "|nico|ninja|nissan|nokia|nra|nrw|ntt|nyc|n[acefgilopruz])"
+        + "|(?:obi|office|okinawa|omega|one|ong|onl|online|ooo|oracle|orange|org|organic|osaka"
+        + "|otsuka|ovh|om)"
+        + "|(?:page|panerai|paris|partners|parts|party|pet|pharmacy|philips|photo|photography"
+        + "|photos|physio|piaget|pics|pictet|pictures|ping|pink|pizza|place|play|playstation|plumbing"
+        + "|plus|pohl|poker|porn|post|praxi|press|pro|prod|productions|prof|properties|property"
+        + "|protection|pub|p[aefghklmnrstwy])"
+        + "|(?:qpon|quebec|qa)"
+        + "|(?:racing|realtor|realty|recipes|red|redstone|rehab|reise|reisen|reit|ren|rent|rentals"
+        + "|repair|report|republican|rest|restaurant|review|reviews|rich|ricoh|rio|rip|rocher|rocks"
+        + "|rodeo|rsvp|ruhr|run|rwe|ryukyu|r[eosuw])"
+        + "|(?:saarland|sakura|sale|samsung|sandvik|sandvikcoromant|sanofi|sap|sapo|sarl|saxo"
+        + "|sbs|sca|scb|schmidt|scholarships|school|schule|schwarz|science|scor|scot|seat|security"
+        + "|seek|sener|services|seven|sew|sex|sexy|shiksha|shoes|show|shriram|singles|site|ski"
+        + "|sky|skype|sncf|soccer|social|software|sohu|solar|solutions|sony|soy|space|spiegel|spreadbetting"
+        + "|srl|stada|starhub|statoil|stc|stcgroup|stockholm|studio|study|style|sucks|supplies"
+        + "|supply|support|surf|surgery|suzuki|swatch|swiss|sydney|systems|s[abcdeghijklmnortuvxyz])"
+        + "|(?:tab|taipei|tatamotors|tatar|tattoo|tax|taxi|team|tech|technology|tel|telefonica"
+        + "|temasek|tennis|thd|theater|theatre|tickets|tienda|tips|tires|tirol|today|tokyo|tools"
+        + "|top|toray|toshiba|tours|town|toyota|toys|trade|trading|training|travel|trust|tui|t[cdfghjklmnortvwz])"
+        + "|(?:ubs|university|uno|uol|u[agksyz])"
+        + "|(?:vacations|vana|vegas|ventures|versicherung|vet|viajes|video|villas|vin|virgin"
+        + "|vision|vista|vistaprint|viva|vlaanderen|vodka|vote|voting|voto|voyage|v[aceginu])"
+        + "|(?:wales|walter|wang|watch|webcam|website|wed|wedding|weir|whoswho|wien|wiki|williamhill"
+        + "|win|windows|wine|wme|work|works|world|wtc|wtf|w[fs])"
+        + "|(?:\u03b5\u03bb|\u0431\u0435\u043b|\u0434\u0435\u0442\u0438|\u043a\u043e\u043c|\u043c\u043a\u0434"
+        + "|\u043c\u043e\u043d|\u043c\u043e\u0441\u043a\u0432\u0430|\u043e\u043d\u043b\u0430\u0439\u043d"
+        + "|\u043e\u0440\u0433|\u0440\u0443\u0441|\u0440\u0444|\u0441\u0430\u0439\u0442|\u0441\u0440\u0431"
+        + "|\u0443\u043a\u0440|\u049b\u0430\u0437|\u0570\u0561\u0575|\u05e7\u05d5\u05dd|\u0627\u0631\u0627\u0645\u0643\u0648"
+        + "|\u0627\u0644\u0627\u0631\u062f\u0646|\u0627\u0644\u062c\u0632\u0627\u0626\u0631|\u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629"
+        + "|\u0627\u0644\u0645\u063a\u0631\u0628|\u0627\u0645\u0627\u0631\u0627\u062a|\u0627\u06cc\u0631\u0627\u0646"
+        + "|\u0628\u0627\u0632\u0627\u0631|\u0628\u06be\u0627\u0631\u062a|\u062a\u0648\u0646\u0633"
+        + "|\u0633\u0648\u062f\u0627\u0646|\u0633\u0648\u0631\u064a\u0629|\u0634\u0628\u0643\u0629"
+        + "|\u0639\u0631\u0627\u0642|\u0639\u0645\u0627\u0646|\u0641\u0644\u0633\u0637\u064a\u0646"
+        + "|\u0642\u0637\u0631|\u0643\u0648\u0645|\u0645\u0635\u0631|\u0645\u0644\u064a\u0633\u064a\u0627"
+        + "|\u0645\u0648\u0642\u0639|\u0915\u0949\u092e|\u0928\u0947\u091f|\u092d\u093e\u0930\u0924"
+        + "|\u0938\u0902\u0917\u0920\u0928|\u09ad\u09be\u09b0\u09a4|\u0a2d\u0a3e\u0a30\u0a24|\u0aad\u0abe\u0ab0\u0aa4"
+        + "|\u0b87\u0ba8\u0bcd\u0ba4\u0bbf\u0baf\u0bbe|\u0b87\u0bb2\u0b99\u0bcd\u0b95\u0bc8|\u0b9a\u0bbf\u0b99\u0bcd\u0b95\u0baa\u0bcd\u0baa\u0bc2\u0bb0\u0bcd"
+        + "|\u0c2d\u0c3e\u0c30\u0c24\u0c4d|\u0dbd\u0d82\u0d9a\u0dcf|\u0e04\u0e2d\u0e21|\u0e44\u0e17\u0e22"
+        + "|\u10d2\u10d4|\u307f\u3093\u306a|\u30b0\u30fc\u30b0\u30eb|\u30b3\u30e0|\u4e16\u754c"
+        + "|\u4e2d\u4fe1|\u4e2d\u56fd|\u4e2d\u570b|\u4e2d\u6587\u7f51|\u4f01\u4e1a|\u4f5b\u5c71"
+        + "|\u4fe1\u606f|\u5065\u5eb7|\u516b\u5366|\u516c\u53f8|\u516c\u76ca|\u53f0\u6e7e|\u53f0\u7063"
+        + "|\u5546\u57ce|\u5546\u5e97|\u5546\u6807|\u5728\u7ebf|\u5927\u62ff|\u5a31\u4e50|\u5de5\u884c"
+        + "|\u5e7f\u4e1c|\u6148\u5584|\u6211\u7231\u4f60|\u624b\u673a|\u653f\u52a1|\u653f\u5e9c"
+        + "|\u65b0\u52a0\u5761|\u65b0\u95fb|\u65f6\u5c1a|\u673a\u6784|\u6de1\u9a6c\u9521|\u6e38\u620f"
+        + "|\u70b9\u770b|\u79fb\u52a8|\u7ec4\u7ec7\u673a\u6784|\u7f51\u5740|\u7f51\u5e97|\u7f51\u7edc"
+        + "|\u8c37\u6b4c|\u96c6\u56e2|\u98de\u5229\u6d66|\u9910\u5385|\u9999\u6e2f|\ub2f7\ub137"
+        + "|\ub2f7\ucef4|\uc0bc\uc131|\ud55c\uad6d|xbox"
+        + "|xerox|xin|xn\\-\\-11b4c3d|xn\\-\\-1qqw23a|xn\\-\\-30rr7y|xn\\-\\-3bst00m|xn\\-\\-3ds443g"
+        + "|xn\\-\\-3e0b707e|xn\\-\\-3pxu8k|xn\\-\\-42c2d9a|xn\\-\\-45brj9c|xn\\-\\-45q11c|xn\\-\\-4gbrim"
+        + "|xn\\-\\-55qw42g|xn\\-\\-55qx5d|xn\\-\\-6frz82g|xn\\-\\-6qq986b3xl|xn\\-\\-80adxhks"
+        + "|xn\\-\\-80ao21a|xn\\-\\-80asehdb|xn\\-\\-80aswg|xn\\-\\-90a3ac|xn\\-\\-90ais|xn\\-\\-9dbq2a"
+        + "|xn\\-\\-9et52u|xn\\-\\-b4w605ferd|xn\\-\\-c1avg|xn\\-\\-c2br7g|xn\\-\\-cg4bki|xn\\-\\-clchc0ea0b2g2a9gcd"
+        + "|xn\\-\\-czr694b|xn\\-\\-czrs0t|xn\\-\\-czru2d|xn\\-\\-d1acj3b|xn\\-\\-d1alf|xn\\-\\-efvy88h"
+        + "|xn\\-\\-estv75g|xn\\-\\-fhbei|xn\\-\\-fiq228c5hs|xn\\-\\-fiq64b|xn\\-\\-fiqs8s|xn\\-\\-fiqz9s"
+        + "|xn\\-\\-fjq720a|xn\\-\\-flw351e|xn\\-\\-fpcrj9c3d|xn\\-\\-fzc2c9e2c|xn\\-\\-gecrj9c"
+        + "|xn\\-\\-h2brj9c|xn\\-\\-hxt814e|xn\\-\\-i1b6b1a6a2e|xn\\-\\-imr513n|xn\\-\\-io0a7i"
+        + "|xn\\-\\-j1aef|xn\\-\\-j1amh|xn\\-\\-j6w193g|xn\\-\\-kcrx77d1x4a|xn\\-\\-kprw13d|xn\\-\\-kpry57d"
+        + "|xn\\-\\-kput3i|xn\\-\\-l1acc|xn\\-\\-lgbbat1ad8j|xn\\-\\-mgb9awbf|xn\\-\\-mgba3a3ejt"
+        + "|xn\\-\\-mgba3a4f16a|xn\\-\\-mgbaam7a8h|xn\\-\\-mgbab2bd|xn\\-\\-mgbayh7gpa|xn\\-\\-mgbbh1a71e"
+        + "|xn\\-\\-mgbc0a9azcg|xn\\-\\-mgberp4a5d4ar|xn\\-\\-mgbpl2fh|xn\\-\\-mgbtx2b|xn\\-\\-mgbx4cd0ab"
+        + "|xn\\-\\-mk1bu44c|xn\\-\\-mxtq1m|xn\\-\\-ngbc5azd|xn\\-\\-node|xn\\-\\-nqv7f|xn\\-\\-nqv7fs00ema"
+        + "|xn\\-\\-nyqy26a|xn\\-\\-o3cw4h|xn\\-\\-ogbpf8fl|xn\\-\\-p1acf|xn\\-\\-p1ai|xn\\-\\-pgbs0dh"
+        + "|xn\\-\\-pssy2u|xn\\-\\-q9jyb4c|xn\\-\\-qcka1pmc|xn\\-\\-qxam|xn\\-\\-rhqv96g|xn\\-\\-s9brj9c"
+        + "|xn\\-\\-ses554g|xn\\-\\-t60b56a|xn\\-\\-tckwe|xn\\-\\-unup4y|xn\\-\\-vermgensberater\\-ctb"
+        + "|xn\\-\\-vermgensberatung\\-pwb|xn\\-\\-vhquv|xn\\-\\-vuq861b|xn\\-\\-wgbh1c|xn\\-\\-wgbl6a"
+        + "|xn\\-\\-xhq521b|xn\\-\\-xkc2al3hye2a|xn\\-\\-xkc2dl3a5ee0h|xn\\-\\-y9a3aq|xn\\-\\-yfro4i67o"
+        + "|xn\\-\\-ygbi2ammx|xn\\-\\-zfr164b|xperia|xxx|xyz)"
+        + "|(?:yachts|yamaxun|yandex|yodobashi|yoga|yokohama|youtube|y[et])"
+        + "|(?:zara|zip|zone|zuerich|z[amw]))";
+
+    public static final Pattern IP_ADDRESS
+            = Pattern.compile(
+            "((25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}|[1-9][0-9]|[1-9])\\.(25[0-5]|2[0-4]"
+                    + "[0-9]|[0-1][0-9]{2}|[1-9][0-9]|[1-9]|0)\\.(25[0-5]|2[0-4][0-9]|[0-1]"
+                    + "[0-9]{2}|[1-9][0-9]|[1-9]|0)\\.(25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}"
+                    + "|[1-9][0-9]|[0-9]))");
+
+    /**
+     * Valid UCS characters defined in RFC 3987. Excludes space characters.
+     */
+    private static final String UCS_CHAR = "[" +
+            "\u00A0-\uD7FF" +
+            "\uF900-\uFDCF" +
+            "\uFDF0-\uFFEF" +
+            "\uD800\uDC00-\uD83F\uDFFD" +
+            "\uD840\uDC00-\uD87F\uDFFD" +
+            "\uD880\uDC00-\uD8BF\uDFFD" +
+            "\uD8C0\uDC00-\uD8FF\uDFFD" +
+            "\uD900\uDC00-\uD93F\uDFFD" +
+            "\uD940\uDC00-\uD97F\uDFFD" +
+            "\uD980\uDC00-\uD9BF\uDFFD" +
+            "\uD9C0\uDC00-\uD9FF\uDFFD" +
+            "\uDA00\uDC00-\uDA3F\uDFFD" +
+            "\uDA40\uDC00-\uDA7F\uDFFD" +
+            "\uDA80\uDC00-\uDABF\uDFFD" +
+            "\uDAC0\uDC00-\uDAFF\uDFFD" +
+            "\uDB00\uDC00-\uDB3F\uDFFD" +
+            "\uDB44\uDC00-\uDB7F\uDFFD" +
+            "&&[^\u00A0[\u2000-\u200A]\u2028\u2029\u202F\u3000]]";
+
+    /**
+     * Valid characters for IRI label defined in RFC 3987.
+     */
+    private static final String LABEL_CHAR = "a-zA-Z0-9" + UCS_CHAR;
+
+    /**
+     * Valid characters for IRI TLD defined in RFC 3987.
+     */
+    private static final String TLD_CHAR = "a-zA-Z" + UCS_CHAR;
+
+    /**
+     * RFC 1035 Section 2.3.4 limits the labels to a maximum 63 octets.
+     */
+    private static final String IRI_LABEL =
+            "[" + LABEL_CHAR + "](?:[" + LABEL_CHAR + "_\\-]{0,61}[" + LABEL_CHAR + "]){0,1}";
+
+    /**
+     * RFC 3492 references RFC 1034 and limits Punycode algorithm output to 63 characters.
+     */
+    private static final String PUNYCODE_TLD = "xn\\-\\-[\\w\\-]{0,58}\\w";
+
+    private static final String TLD = "(" + PUNYCODE_TLD + "|" + "[" + TLD_CHAR + "]{2,63}" +")";
+
+    private static final String HOST_NAME = "(" + IRI_LABEL + "\\.)+" + TLD;
+
+    public static final Pattern DOMAIN_NAME
+            = Pattern.compile("(" + HOST_NAME + "|" + IP_ADDRESS + ")");
+
+    private static final String PROTOCOL = "(?i:http|https|rtsp)://";
+
+    /* A word boundary or end of input.  This is to stop foo.sure from matching as foo.su */
+    private static final String WORD_BOUNDARY = "(?:\\b|$|^)";
+
+    private static final String USER_INFO = "(?:[a-zA-Z0-9\\$\\-\\_\\.\\+\\!\\*\\'\\(\\)"
+            + "\\,\\;\\?\\&\\=]|(?:\\%[a-fA-F0-9]{2})){1,64}(?:\\:(?:[a-zA-Z0-9\\$\\-\\_"
+            + "\\.\\+\\!\\*\\'\\(\\)\\,\\;\\?\\&\\=]|(?:\\%[a-fA-F0-9]{2})){1,25})?\\@";
+
+    private static final String PORT_NUMBER = "\\:\\d{1,5}";
+
+    private static final String PATH_AND_QUERY = "[/\\?](?:(?:[" + LABEL_CHAR
+            + ";/\\?:@&=#~"  // plus optional query params
+            + "\\-\\.\\+!\\*'\\(\\),_\\$])|(?:%[a-fA-F0-9]{2}))*";
+
+    /**
+     *  Regular expression pattern to match most part of RFC 3987
+     *  Internationalized URLs, aka IRIs.
+     */
+    public static final Pattern WEB_URL = Pattern.compile("("
+            + "("
+            + "(?:" + PROTOCOL + "(?:" + USER_INFO + ")?" + ")?"
+            + "(?:" + DOMAIN_NAME + ")"
+            + "(?:" + PORT_NUMBER + ")?"
+            + ")"
+            + "(" + PATH_AND_QUERY + ")?"
+            + WORD_BOUNDARY
+            + ")");
+
+    /**
+     * Regular expression that matches known TLDs and punycode TLDs
+     */
+    private static final String STRICT_TLD = "(?:" +
+            IANA_TOP_LEVEL_DOMAINS + "|" + PUNYCODE_TLD + ")";
+
+    /**
+     * Regular expression that matches host names using {@link #STRICT_TLD}
+     */
+    private static final String STRICT_HOST_NAME = "(?:(?:" + IRI_LABEL + "\\.)+"
+            + STRICT_TLD + ")";
+
+    /**
+     * Regular expression that matches domain names using either {@link #STRICT_HOST_NAME} or
+     * {@link #IP_ADDRESS}
+     */
+    private static final Pattern STRICT_DOMAIN_NAME
+            = Pattern.compile("(?:" + STRICT_HOST_NAME + "|" + IP_ADDRESS + ")");
+
+    /**
+     * Regular expression that matches domain names without a TLD
+     */
+    private static final String RELAXED_DOMAIN_NAME =
+            "(?:" + "(?:" + IRI_LABEL + "(?:\\.(?=\\S))" +"?)+" + "|" + IP_ADDRESS + ")";
+
+    /**
+     * Regular expression to match strings that do not start with a supported protocol. The TLDs
+     * are expected to be one of the known TLDs.
+     */
+    private static final String WEB_URL_WITHOUT_PROTOCOL = "("
+            + WORD_BOUNDARY
+            + "(?<!:\\/\\/)"
+            + "("
+            + "(?:" + STRICT_DOMAIN_NAME + ")"
+            + "(?:" + PORT_NUMBER + ")?"
+            + ")"
+            + "(?:" + PATH_AND_QUERY + ")?"
+            + WORD_BOUNDARY
+            + ")";
+
+    /**
+     * Regular expression to match strings that start with a supported protocol. Rules for domain
+     * names and TLDs are more relaxed. TLDs are optional.
+     */
+    private static final String WEB_URL_WITH_PROTOCOL = "("
+            + WORD_BOUNDARY
+            + "(?:"
+            + "(?:" + PROTOCOL + "(?:" + USER_INFO + ")?" + ")"
+            + "(?:" + RELAXED_DOMAIN_NAME + ")?"
+            + "(?:" + PORT_NUMBER + ")?"
+            + ")"
+            + "(?:" + PATH_AND_QUERY + ")?"
+            + WORD_BOUNDARY
+            + ")";
+
+    /**
+     * Regular expression pattern to match IRIs. If a string starts with http(s):// the expression
+     * tries to match the URL structure with a relaxed rule for TLDs. If the string does not start
+     * with http(s):// the TLDs are expected to be one of the known TLDs.
+     *
+     * @hide
+     */
+    public static final Pattern AUTOLINK_WEB_URL = Pattern.compile(
+            "(" + WEB_URL_WITH_PROTOCOL + "|" + WEB_URL_WITHOUT_PROTOCOL + ")");
+
+    /**
+     * Regular expression for valid email characters. Does not include some of the valid characters
+     * defined in RFC5321: #&~!^`{}/=$*?|
+     */
+    private static final String EMAIL_CHAR = LABEL_CHAR + "\\+\\-_%'";
+
+    /**
+     * Regular expression for local part of an email address. RFC5321 section 4.5.3.1.1 limits
+     * the local part to be at most 64 octets.
+     */
+    private static final String EMAIL_ADDRESS_LOCAL_PART =
+            "[" + EMAIL_CHAR + "]" + "(?:[" + EMAIL_CHAR + "\\.]{1,62}[" + EMAIL_CHAR + "])?";
+
+    /**
+     * Regular expression for the domain part of an email address. RFC5321 section 4.5.3.1.2 limits
+     * the domain to be at most 255 octets.
+     */
+    private static final String EMAIL_ADDRESS_DOMAIN =
+            "(?=.{1,255}(?:\\s|$|^))" + HOST_NAME;
+
+    /**
+     * Regular expression pattern to match email addresses. It excludes double quoted local parts
+     * and the special characters #&~!^`{}/=$*?| that are included in RFC5321.
+     * @hide
+     */
+    public static final Pattern AUTOLINK_EMAIL_ADDRESS = Pattern.compile("(" + WORD_BOUNDARY +
+            "(?:" + EMAIL_ADDRESS_LOCAL_PART + "@" + EMAIL_ADDRESS_DOMAIN + ")" +
+            WORD_BOUNDARY + ")"
+    );
+
+    public static final Pattern EMAIL_ADDRESS
+            = Pattern.compile(
+            "[a-zA-Z0-9\\+\\.\\_\\%\\-\\+]{1,256}" +
+                    "\\@" +
+                    "[a-zA-Z0-9][a-zA-Z0-9\\-]{0,64}" +
+                    "(" +
+                    "\\." +
+                    "[a-zA-Z0-9][a-zA-Z0-9\\-]{0,25}" +
+                    ")+"
+    );
+
+    /**
+     * Do not create this static utility class.
+     */
+    private PatternsCompat() {}
+}
diff --git a/compat/java/android/support/v4/util/Pools.java b/compat/java/android/support/v4/util/Pools.java
new file mode 100644
index 0000000..6882660
--- /dev/null
+++ b/compat/java/android/support/v4/util/Pools.java
@@ -0,0 +1,166 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+package android.support.v4.util;
+
+
+/**
+ * Helper class for creating pools of objects. An example use looks like this:
+ * <pre>
+ * public class MyPooledClass {
+ *
+ *     private static final SynchronizedPool<MyPooledClass> sPool =
+ *             new SynchronizedPool<MyPooledClass>(10);
+ *
+ *     public static MyPooledClass obtain() {
+ *         MyPooledClass instance = sPool.acquire();
+ *         return (instance != null) ? instance : new MyPooledClass();
+ *     }
+ *
+ *     public void recycle() {
+ *          // Clear state if needed.
+ *          sPool.release(this);
+ *     }
+ *
+ *     . . .
+ * }
+ * </pre>
+ *
+ */
+public final class Pools {
+
+    /**
+     * Interface for managing a pool of objects.
+     *
+     * @param <T> The pooled type.
+     */
+    public static interface Pool<T> {
+
+        /**
+         * @return An instance from the pool if such, null otherwise.
+         */
+        public T acquire();
+
+        /**
+         * Release an instance to the pool.
+         *
+         * @param instance The instance to release.
+         * @return Whether the instance was put in the pool.
+         *
+         * @throws IllegalStateException If the instance is already in the pool.
+         */
+        public boolean release(T instance);
+    }
+
+    private Pools() {
+        /* do nothing - hiding constructor */
+    }
+
+    /**
+     * Simple (non-synchronized) pool of objects.
+     *
+     * @param <T> The pooled type.
+     */
+    public static class SimplePool<T> implements Pool<T> {
+        private final Object[] mPool;
+
+        private int mPoolSize;
+
+        /**
+         * Creates a new instance.
+         *
+         * @param maxPoolSize The max pool size.
+         *
+         * @throws IllegalArgumentException If the max pool size is less than zero.
+         */
+        public SimplePool(int maxPoolSize) {
+            if (maxPoolSize <= 0) {
+                throw new IllegalArgumentException("The max pool size must be > 0");
+            }
+            mPool = new Object[maxPoolSize];
+        }
+
+        @Override
+        @SuppressWarnings("unchecked")
+        public T acquire() {
+            if (mPoolSize > 0) {
+                final int lastPooledIndex = mPoolSize - 1;
+                T instance = (T) mPool[lastPooledIndex];
+                mPool[lastPooledIndex] = null;
+                mPoolSize--;
+                return instance;
+            }
+            return null;
+        }
+
+        @Override
+        public boolean release(T instance) {
+            if (isInPool(instance)) {
+                throw new IllegalStateException("Already in the pool!");
+            }
+            if (mPoolSize < mPool.length) {
+                mPool[mPoolSize] = instance;
+                mPoolSize++;
+                return true;
+            }
+            return false;
+        }
+
+        private boolean isInPool(T instance) {
+            for (int i = 0; i < mPoolSize; i++) {
+                if (mPool[i] == instance) {
+                    return true;
+                }
+            }
+            return false;
+        }
+    }
+
+    /**
+     * Synchronized) pool of objects.
+     *
+     * @param <T> The pooled type.
+     */
+    public static class SynchronizedPool<T> extends SimplePool<T> {
+        private final Object mLock = new Object();
+
+        /**
+         * Creates a new instance.
+         *
+         * @param maxPoolSize The max pool size.
+         *
+         * @throws IllegalArgumentException If the max pool size is less than zero.
+         */
+        public SynchronizedPool(int maxPoolSize) {
+            super(maxPoolSize);
+        }
+
+        @Override
+        public T acquire() {
+            synchronized (mLock) {
+                return super.acquire();
+            }
+        }
+
+        @Override
+        public boolean release(T element) {
+            synchronized (mLock) {
+                return super.release(element);
+            }
+        }
+    }
+}
diff --git a/v4/java/android/support/v4/util/SimpleArrayMap.java b/compat/java/android/support/v4/util/SimpleArrayMap.java
similarity index 100%
rename from v4/java/android/support/v4/util/SimpleArrayMap.java
rename to compat/java/android/support/v4/util/SimpleArrayMap.java
diff --git a/v4/java/android/support/v4/util/SparseArrayCompat.java b/compat/java/android/support/v4/util/SparseArrayCompat.java
similarity index 100%
rename from v4/java/android/support/v4/util/SparseArrayCompat.java
rename to compat/java/android/support/v4/util/SparseArrayCompat.java
diff --git a/v4/java/android/support/v4/util/TimeUtils.java b/compat/java/android/support/v4/util/TimeUtils.java
similarity index 100%
rename from v4/java/android/support/v4/util/TimeUtils.java
rename to compat/java/android/support/v4/util/TimeUtils.java
diff --git a/v4/java/android/support/v4/util/package.html b/compat/java/android/support/v4/util/package.html
old mode 100755
new mode 100644
similarity index 100%
rename from v4/java/android/support/v4/util/package.html
rename to compat/java/android/support/v4/util/package.html
diff --git a/compat/java/android/support/v4/view/AccessibilityDelegateCompat.java b/compat/java/android/support/v4/view/AccessibilityDelegateCompat.java
new file mode 100644
index 0000000..920b6e5
--- /dev/null
+++ b/compat/java/android/support/v4/view/AccessibilityDelegateCompat.java
@@ -0,0 +1,515 @@
+/*
+ * 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 android.support.v4.view;
+
+import android.os.Build;
+import android.os.Bundle;
+import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat;
+import android.support.v4.view.accessibility.AccessibilityNodeProviderCompat;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.accessibility.AccessibilityEvent;
+
+/**
+ * Helper for accessing {@link View.AccessibilityDelegate} introduced after
+ * API level 4 in a backwards compatible fashion.
+ * <p>
+ * <strong>Note:</strong> On platform versions prior to
+ * {@link android.os.Build.VERSION_CODES#M API 23}, delegate methods on
+ * views in the {@code android.widget.*} package are called <i>before</i>
+ * host methods. This prevents certain properties such as class name from
+ * being modified by overriding
+ * {@link AccessibilityDelegateCompat#onInitializeAccessibilityNodeInfo(View, AccessibilityNodeInfoCompat)},
+ * as any changes will be overwritten by the host class.
+ * <p>
+ * Starting in {@link android.os.Build.VERSION_CODES#M API 23}, delegate
+ * methods are called <i>after</i> host methods, which all properties to be
+ * modified without being overwritten by the host class.
+ */
+public class AccessibilityDelegateCompat {
+
+    static interface AccessibilityDelegateImpl {
+        public Object newAccessiblityDelegateDefaultImpl();
+        public Object newAccessiblityDelegateBridge(AccessibilityDelegateCompat listener);
+        public boolean dispatchPopulateAccessibilityEvent(Object delegate, View host,
+                AccessibilityEvent event);
+        public void onInitializeAccessibilityEvent(Object delegate, View host,
+                AccessibilityEvent event);
+        public void onInitializeAccessibilityNodeInfo(Object delegate, View host,
+                AccessibilityNodeInfoCompat info);
+        public void onPopulateAccessibilityEvent(Object delegate, View host,
+                AccessibilityEvent event);
+        public boolean onRequestSendAccessibilityEvent(Object delegate, ViewGroup host, View child,
+                AccessibilityEvent event);
+        public void sendAccessibilityEvent(Object delegate, View host, int eventType);
+        public void sendAccessibilityEventUnchecked(Object delegate, View host,
+                AccessibilityEvent event);
+        public AccessibilityNodeProviderCompat getAccessibilityNodeProvider(Object delegate,
+                View host);
+        public boolean performAccessibilityAction(Object delegate, View host, int action,
+                Bundle args);
+    }
+
+    static class AccessibilityDelegateStubImpl implements AccessibilityDelegateImpl {
+        @Override
+        public Object newAccessiblityDelegateDefaultImpl() {
+            return null;
+        }
+
+        @Override
+        public Object newAccessiblityDelegateBridge(AccessibilityDelegateCompat listener) {
+            return null;
+        }
+
+        @Override
+        public boolean dispatchPopulateAccessibilityEvent(Object delegate, View host,
+                AccessibilityEvent event) {
+            return false;
+        }
+
+        @Override
+        public void onInitializeAccessibilityEvent(Object delegate, View host,
+                AccessibilityEvent event) {
+
+        }
+
+        @Override
+        public void onInitializeAccessibilityNodeInfo(Object delegate, View host,
+                AccessibilityNodeInfoCompat info) {
+
+        }
+
+        @Override
+        public void onPopulateAccessibilityEvent(Object delegate, View host,
+                AccessibilityEvent event) {
+
+        }
+
+        @Override
+        public boolean onRequestSendAccessibilityEvent(Object delegate, ViewGroup host, View child,
+                AccessibilityEvent event) {
+            return true;
+        }
+
+        @Override
+        public void sendAccessibilityEvent(Object delegate, View host, int eventType) {
+
+        }
+
+        @Override
+        public void sendAccessibilityEventUnchecked(Object delegate, View host,
+                AccessibilityEvent event) {
+
+        }
+
+        @Override
+        public AccessibilityNodeProviderCompat getAccessibilityNodeProvider(Object delegate,
+                View host) {
+            return null;
+        }
+
+        @Override
+        public boolean performAccessibilityAction(Object delegate, View host, int action,
+                Bundle args) {
+            return false;
+        }
+    }
+
+    static class AccessibilityDelegateIcsImpl extends AccessibilityDelegateStubImpl {
+        @Override
+        public Object newAccessiblityDelegateDefaultImpl() {
+            return AccessibilityDelegateCompatIcs.newAccessibilityDelegateDefaultImpl();
+        }
+
+        @Override
+        public Object newAccessiblityDelegateBridge(final AccessibilityDelegateCompat compat) {
+            return AccessibilityDelegateCompatIcs.newAccessibilityDelegateBridge(
+                    new AccessibilityDelegateCompatIcs.AccessibilityDelegateBridge() {
+                @Override
+                public boolean dispatchPopulateAccessibilityEvent(View host,
+                        AccessibilityEvent event) {
+                    return compat.dispatchPopulateAccessibilityEvent(host, event);
+                }
+
+                @Override
+                public void onInitializeAccessibilityEvent(View host, AccessibilityEvent event) {
+                    compat.onInitializeAccessibilityEvent(host, event);
+                }
+
+                @Override
+                public void onInitializeAccessibilityNodeInfo(View host, Object info) {
+                    compat.onInitializeAccessibilityNodeInfo(host,
+                            new AccessibilityNodeInfoCompat(info));
+                }
+
+                @Override
+                public void onPopulateAccessibilityEvent(View host, AccessibilityEvent event) {
+                    compat.onPopulateAccessibilityEvent(host, event);
+                }
+
+                @Override
+                public boolean onRequestSendAccessibilityEvent(ViewGroup host, View child,
+                        AccessibilityEvent event) {
+                    return compat.onRequestSendAccessibilityEvent(host, child, event);
+                }
+
+                @Override
+                public void sendAccessibilityEvent(View host, int eventType) {
+                    compat.sendAccessibilityEvent(host, eventType);
+                }
+
+                @Override
+                public void sendAccessibilityEventUnchecked(View host, AccessibilityEvent event) {
+                    compat.sendAccessibilityEventUnchecked(host, event);
+                }
+            });
+        }
+
+        @Override
+        public boolean dispatchPopulateAccessibilityEvent(Object delegate, View host,
+                AccessibilityEvent event) {
+            return AccessibilityDelegateCompatIcs.dispatchPopulateAccessibilityEvent(delegate,
+                    host, event);
+        }
+
+        @Override
+        public void onInitializeAccessibilityEvent(Object delegate, View host,
+                AccessibilityEvent event) {
+            AccessibilityDelegateCompatIcs.onInitializeAccessibilityEvent(delegate, host, event);
+        }
+
+        @Override
+        public void onInitializeAccessibilityNodeInfo(Object delegate, View host,
+                AccessibilityNodeInfoCompat info) {
+            AccessibilityDelegateCompatIcs.onInitializeAccessibilityNodeInfo(delegate, host,
+                    info.getInfo());
+        }
+
+        @Override
+        public void onPopulateAccessibilityEvent(Object delegate, View host,
+                AccessibilityEvent event) {
+            AccessibilityDelegateCompatIcs.onPopulateAccessibilityEvent(delegate, host, event);
+        }
+
+        @Override
+        public boolean onRequestSendAccessibilityEvent(Object delegate, ViewGroup host, View child,
+                AccessibilityEvent event) {
+            return AccessibilityDelegateCompatIcs.onRequestSendAccessibilityEvent(delegate, host,
+                    child, event);
+        }
+
+        @Override
+        public void sendAccessibilityEvent(Object delegate, View host, int eventType) {
+            AccessibilityDelegateCompatIcs.sendAccessibilityEvent(delegate, host, eventType);
+        }
+
+        @Override
+        public void sendAccessibilityEventUnchecked(Object delegate, View host,
+                AccessibilityEvent event) {
+            AccessibilityDelegateCompatIcs.sendAccessibilityEventUnchecked(delegate, host, event);
+        }
+    }
+
+    static class AccessibilityDelegateJellyBeanImpl extends AccessibilityDelegateIcsImpl {
+        @Override
+        public Object newAccessiblityDelegateBridge(final AccessibilityDelegateCompat compat) {
+            return AccessibilityDelegateCompatJellyBean.newAccessibilityDelegateBridge(
+                    new AccessibilityDelegateCompatJellyBean
+                            .AccessibilityDelegateBridgeJellyBean() {
+                @Override
+                public boolean dispatchPopulateAccessibilityEvent(View host,
+                        AccessibilityEvent event) {
+                    return compat.dispatchPopulateAccessibilityEvent(host, event);
+                }
+
+                @Override
+                public void onInitializeAccessibilityEvent(View host, AccessibilityEvent event) {
+                    compat.onInitializeAccessibilityEvent(host, event);
+                }
+
+                @Override
+                public void onInitializeAccessibilityNodeInfo(View host, Object info) {
+                    compat.onInitializeAccessibilityNodeInfo(host,
+                            new AccessibilityNodeInfoCompat(info));
+                }
+
+                @Override
+                public void onPopulateAccessibilityEvent(View host, AccessibilityEvent event) {
+                    compat.onPopulateAccessibilityEvent(host, event);
+                }
+
+                @Override
+                public boolean onRequestSendAccessibilityEvent(ViewGroup host, View child,
+                        AccessibilityEvent event) {
+                    return compat.onRequestSendAccessibilityEvent(host, child, event);
+                }
+
+                @Override
+                public void sendAccessibilityEvent(View host, int eventType) {
+                    compat.sendAccessibilityEvent(host, eventType);
+                }
+
+                @Override
+                public void sendAccessibilityEventUnchecked(View host, AccessibilityEvent event) {
+                    compat.sendAccessibilityEventUnchecked(host, event);
+                }
+
+                @Override
+                public Object getAccessibilityNodeProvider(View host) {
+                    AccessibilityNodeProviderCompat provider =
+                        compat.getAccessibilityNodeProvider(host);
+                    return (provider != null) ? provider.getProvider() : null;
+                }
+
+                @Override
+                public boolean performAccessibilityAction(View host, int action, Bundle args) {
+                    return compat.performAccessibilityAction(host, action, args);
+                }
+            });
+        }
+
+        @Override
+        public AccessibilityNodeProviderCompat getAccessibilityNodeProvider(Object delegate,
+                View host) {
+            Object provider = AccessibilityDelegateCompatJellyBean.getAccessibilityNodeProvider(
+                    delegate, host);
+            if (provider != null) {
+                return new AccessibilityNodeProviderCompat(provider);
+            }
+            return null;
+        }
+
+        @Override
+        public boolean performAccessibilityAction(Object delegate, View host, int action,
+                Bundle args) {
+            return AccessibilityDelegateCompatJellyBean.performAccessibilityAction(delegate,
+                    host, action, args);
+        }
+    }
+
+    private static final AccessibilityDelegateImpl IMPL;
+    private static final Object DEFAULT_DELEGATE;
+
+    static {
+        if (Build.VERSION.SDK_INT >= 16) { // JellyBean
+            IMPL = new AccessibilityDelegateJellyBeanImpl();
+        } else if (Build.VERSION.SDK_INT >= 14) { // ICS
+            IMPL = new AccessibilityDelegateIcsImpl();
+        } else {
+            IMPL = new AccessibilityDelegateStubImpl();
+        }
+        DEFAULT_DELEGATE = IMPL.newAccessiblityDelegateDefaultImpl();
+    }
+
+    final Object mBridge;
+
+    /**
+     * Creates a new instance.
+     */
+    public AccessibilityDelegateCompat() {
+        mBridge = IMPL.newAccessiblityDelegateBridge(this);
+    }
+
+    /**
+     * @return The wrapped bridge implementation.
+     */
+    Object getBridge() {
+        return mBridge;
+    }
+
+    /**
+     * Sends an accessibility event of the given type. If accessibility is not
+     * enabled this method has no effect.
+     * <p>
+     * The default implementation behaves as {@link View#sendAccessibilityEvent(int)
+     * View#sendAccessibilityEvent(int)} for the case of no accessibility delegate
+     * been set.
+     * </p>
+     *
+     * @param host The View hosting the delegate.
+     * @param eventType The type of the event to send.
+     *
+     * @see View#sendAccessibilityEvent(int) View#sendAccessibilityEvent(int)
+     */
+    public void sendAccessibilityEvent(View host, int eventType) {
+        IMPL.sendAccessibilityEvent(DEFAULT_DELEGATE, host, eventType);
+    }
+
+    /**
+     * Sends an accessibility event. This method behaves exactly as
+     * {@link #sendAccessibilityEvent(View, int)} but takes as an argument an
+     * empty {@link AccessibilityEvent} and does not perform a check whether
+     * accessibility is enabled.
+     * <p>
+     * The default implementation behaves as
+     * {@link View#sendAccessibilityEventUnchecked(AccessibilityEvent)
+     * View#sendAccessibilityEventUnchecked(AccessibilityEvent)} for
+     * the case of no accessibility delegate been set.
+     * </p>
+     *
+     * @param host The View hosting the delegate.
+     * @param event The event to send.
+     *
+     * @see View#sendAccessibilityEventUnchecked(AccessibilityEvent)
+     *      View#sendAccessibilityEventUnchecked(AccessibilityEvent)
+     */
+    public void sendAccessibilityEventUnchecked(View host, AccessibilityEvent event) {
+        IMPL.sendAccessibilityEventUnchecked(DEFAULT_DELEGATE, host, event);
+    }
+
+    /**
+     * Dispatches an {@link AccessibilityEvent} to the host {@link View} first and then
+     * to its children for adding their text content to the event.
+     * <p>
+     * The default implementation behaves as
+     * {@link View#dispatchPopulateAccessibilityEvent(AccessibilityEvent)
+     * View#dispatchPopulateAccessibilityEvent(AccessibilityEvent)} for
+     * the case of no accessibility delegate been set.
+     * </p>
+     *
+     * @param host The View hosting the delegate.
+     * @param event The event.
+     * @return True if the event population was completed.
+     *
+     * @see View#dispatchPopulateAccessibilityEvent(AccessibilityEvent)
+     *      View#dispatchPopulateAccessibilityEvent(AccessibilityEvent)
+     */
+    public boolean dispatchPopulateAccessibilityEvent(View host, AccessibilityEvent event) {
+        return IMPL.dispatchPopulateAccessibilityEvent(DEFAULT_DELEGATE, host, event);
+    }
+
+    /**
+     * Gives a chance to the host View to populate the accessibility event with its
+     * text content.
+     * <p>
+     * The default implementation behaves as
+     * {@link ViewCompat#onPopulateAccessibilityEvent(View, AccessibilityEvent)
+     * ViewCompat#onPopulateAccessibilityEvent(AccessibilityEvent)} for
+     * the case of no accessibility delegate been set.
+     * </p>
+     *
+     * @param host The View hosting the delegate.
+     * @param event The accessibility event which to populate.
+     *
+     * @see ViewCompat#onPopulateAccessibilityEvent(View ,AccessibilityEvent)
+     *      ViewCompat#onPopulateAccessibilityEvent(View, AccessibilityEvent)
+     */
+    public void onPopulateAccessibilityEvent(View host, AccessibilityEvent event) {
+        IMPL.onPopulateAccessibilityEvent(DEFAULT_DELEGATE, host, event);
+    }
+
+    /**
+     * Initializes an {@link AccessibilityEvent} with information about the
+     * the host View which is the event source.
+     * <p>
+     * The default implementation behaves as
+     * {@link ViewCompat#onInitializeAccessibilityEvent(View v, AccessibilityEvent event)
+     * ViewCompat#onInitalizeAccessibilityEvent(View v, AccessibilityEvent event)} for
+     * the case of no accessibility delegate been set.
+     * </p>
+     *
+     * @param host The View hosting the delegate.
+     * @param event The event to initialize.
+     *
+     * @see ViewCompat#onInitializeAccessibilityEvent(View, AccessibilityEvent)
+     *      ViewCompat#onInitializeAccessibilityEvent(View, AccessibilityEvent)
+     */
+    public void onInitializeAccessibilityEvent(View host, AccessibilityEvent event) {
+        IMPL.onInitializeAccessibilityEvent(DEFAULT_DELEGATE, host, event);
+    }
+
+    /**
+     * Initializes an {@link AccessibilityNodeInfoCompat} with information about the host view.
+     * <p>
+     * The default implementation behaves as
+     * {@link ViewCompat#onInitializeAccessibilityNodeInfo(View, AccessibilityNodeInfoCompat)
+     * ViewCompat#onInitializeAccessibilityNodeInfo(View, AccessibilityNodeInfoCompat)} for
+     * the case of no accessibility delegate been set.
+     * </p>
+     *
+     * @param host The View hosting the delegate.
+     * @param info The instance to initialize.
+     *
+     * @see ViewCompat#onInitializeAccessibilityNodeInfo(View, AccessibilityNodeInfoCompat)
+     *      ViewCompat#onInitializeAccessibilityNodeInfo(View, AccessibilityNodeInfoCompat)
+     */
+    public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfoCompat info) {
+        IMPL.onInitializeAccessibilityNodeInfo(DEFAULT_DELEGATE, host, info);
+    }
+
+    /**
+     * Called when a child of the host View has requested sending an
+     * {@link AccessibilityEvent} and gives an opportunity to the parent (the host)
+     * to augment the event.
+     * <p>
+     * The default implementation behaves as
+     * {@link ViewGroupCompat#onRequestSendAccessibilityEvent(ViewGroup, View, AccessibilityEvent)
+     * ViewGroupCompat#onRequestSendAccessibilityEvent(ViewGroup, View, AccessibilityEvent)} for
+     * the case of no accessibility delegate been set.
+     * </p>
+     *
+     * @param host The View hosting the delegate.
+     * @param child The child which requests sending the event.
+     * @param event The event to be sent.
+     * @return True if the event should be sent
+     *
+     * @see ViewGroupCompat#onRequestSendAccessibilityEvent(ViewGroup, View, AccessibilityEvent)
+     *      ViewGroupCompat#onRequestSendAccessibilityEvent(ViewGroup, View, AccessibilityEvent)
+     */
+    public boolean onRequestSendAccessibilityEvent(ViewGroup host, View child,
+            AccessibilityEvent event) {
+        return IMPL.onRequestSendAccessibilityEvent(DEFAULT_DELEGATE, host, child, event);
+    }
+
+    /**
+     * Gets the provider for managing a virtual view hierarchy rooted at this View
+     * and reported to {@link android.accessibilityservice.AccessibilityService}s
+     * that explore the window content.
+     * <p>
+     * The default implementation behaves as
+     * {@link ViewCompat#getAccessibilityNodeProvider(View) ViewCompat#getAccessibilityNodeProvider(View)}
+     * for the case of no accessibility delegate been set.
+     * </p>
+     *
+     * @return The provider.
+     *
+     * @see AccessibilityNodeProviderCompat
+     */
+    public AccessibilityNodeProviderCompat getAccessibilityNodeProvider(View host) {
+        return IMPL.getAccessibilityNodeProvider(DEFAULT_DELEGATE, host);
+    }
+
+    /**
+     * Performs the specified accessibility action on the view. For
+     * possible accessibility actions look at {@link AccessibilityNodeInfoCompat}.
+     * <p>
+     * The default implementation behaves as
+     * {@link View#performAccessibilityAction(int, Bundle)
+     *  View#performAccessibilityAction(int, Bundle)} for the case of
+     *  no accessibility delegate been set.
+     * </p>
+     *
+     * @param action The action to perform.
+     * @return Whether the action was performed.
+     *
+     * @see View#performAccessibilityAction(int, Bundle)
+     *      View#performAccessibilityAction(int, Bundle)
+     */
+    public boolean performAccessibilityAction(View host, int action, Bundle args) {
+        return IMPL.performAccessibilityAction(DEFAULT_DELEGATE, host, action, args);
+    }
+}
diff --git a/v4/java/android/support/v4/view/ActionProvider.java b/compat/java/android/support/v4/view/ActionProvider.java
similarity index 100%
rename from v4/java/android/support/v4/view/ActionProvider.java
rename to compat/java/android/support/v4/view/ActionProvider.java
diff --git a/compat/java/android/support/v4/view/GestureDetectorCompat.java b/compat/java/android/support/v4/view/GestureDetectorCompat.java
new file mode 100644
index 0000000..aaed921
--- /dev/null
+++ b/compat/java/android/support/v4/view/GestureDetectorCompat.java
@@ -0,0 +1,568 @@
+/*
+ * Copyright (C) 2012 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 android.support.v4.view;
+
+import android.content.Context;
+import android.os.Build;
+import android.os.Handler;
+import android.os.Message;
+import android.view.GestureDetector;
+import android.view.GestureDetector.OnDoubleTapListener;
+import android.view.GestureDetector.OnGestureListener;
+import android.view.MotionEvent;
+import android.view.VelocityTracker;
+import android.view.View;
+import android.view.ViewConfiguration;
+
+/**
+ * Detects various gestures and events using the supplied {@link MotionEvent}s.
+ * The {@link OnGestureListener} callback will notify users when a particular
+ * motion event has occurred. This class should only be used with {@link MotionEvent}s
+ * reported via touch (don't use for trackball events).
+ *
+ * <p>This compatibility implementation of the framework's GestureDetector guarantees
+ * the newer focal point scrolling behavior from Jellybean MR1 on all platform versions.</p>
+ *
+ * To use this class:
+ * <ul>
+ *  <li>Create an instance of the {@code GestureDetectorCompat} for your {@link View}
+ *  <li>In the {@link View#onTouchEvent(MotionEvent)} method ensure you call
+ *          {@link #onTouchEvent(MotionEvent)}. The methods defined in your callback
+ *          will be executed when the events occur.
+ * </ul>
+ */
+public final class GestureDetectorCompat {
+    interface GestureDetectorCompatImpl {
+        boolean isLongpressEnabled();
+        boolean onTouchEvent(MotionEvent ev);
+        void setIsLongpressEnabled(boolean enabled);
+        void setOnDoubleTapListener(OnDoubleTapListener listener);
+    }
+
+    static class GestureDetectorCompatImplBase implements GestureDetectorCompatImpl {
+        private int mTouchSlopSquare;
+        private int mDoubleTapSlopSquare;
+        private int mMinimumFlingVelocity;
+        private int mMaximumFlingVelocity;
+
+        private static final int LONGPRESS_TIMEOUT = ViewConfiguration.getLongPressTimeout();
+        private static final int TAP_TIMEOUT = ViewConfiguration.getTapTimeout();
+        private static final int DOUBLE_TAP_TIMEOUT = ViewConfiguration.getDoubleTapTimeout();
+
+        // constants for Message.what used by GestureHandler below
+        private static final int SHOW_PRESS = 1;
+        private static final int LONG_PRESS = 2;
+        private static final int TAP = 3;
+
+        private final Handler mHandler;
+        private final OnGestureListener mListener;
+        private OnDoubleTapListener mDoubleTapListener;
+
+        private boolean mStillDown;
+        private boolean mDeferConfirmSingleTap;
+        private boolean mInLongPress;
+        private boolean mAlwaysInTapRegion;
+        private boolean mAlwaysInBiggerTapRegion;
+
+        private MotionEvent mCurrentDownEvent;
+        private MotionEvent mPreviousUpEvent;
+
+        /**
+         * True when the user is still touching for the second tap (down, move, and
+         * up events). Can only be true if there is a double tap listener attached.
+         */
+        private boolean mIsDoubleTapping;
+
+        private float mLastFocusX;
+        private float mLastFocusY;
+        private float mDownFocusX;
+        private float mDownFocusY;
+
+        private boolean mIsLongpressEnabled;
+
+        /**
+         * Determines speed during touch scrolling
+         */
+        private VelocityTracker mVelocityTracker;
+
+        private class GestureHandler extends Handler {
+            GestureHandler() {
+                super();
+            }
+
+            GestureHandler(Handler handler) {
+                super(handler.getLooper());
+            }
+
+            @Override
+            public void handleMessage(Message msg) {
+                switch (msg.what) {
+                case SHOW_PRESS:
+                    mListener.onShowPress(mCurrentDownEvent);
+                    break;
+
+                case LONG_PRESS:
+                    dispatchLongPress();
+                    break;
+
+                case TAP:
+                    // If the user's finger is still down, do not count it as a tap
+                    if (mDoubleTapListener != null) {
+                        if (!mStillDown) {
+                            mDoubleTapListener.onSingleTapConfirmed(mCurrentDownEvent);
+                        } else {
+                            mDeferConfirmSingleTap = true;
+                        }
+                    }
+                    break;
+
+                default:
+                    throw new RuntimeException("Unknown message " + msg); //never
+                }
+            }
+        }
+
+        /**
+         * Creates a GestureDetector with the supplied listener.
+         * You may only use this constructor from a UI thread (this is the usual situation).
+         * @see android.os.Handler#Handler()
+         *
+         * @param context the application's context
+         * @param listener the listener invoked for all the callbacks, this must
+         * not be null.
+         * @param handler the handler to use
+         *
+         * @throws NullPointerException if {@code listener} is null.
+         */
+        public GestureDetectorCompatImplBase(Context context, OnGestureListener listener,
+                Handler handler) {
+            if (handler != null) {
+                mHandler = new GestureHandler(handler);
+            } else {
+                mHandler = new GestureHandler();
+            }
+            mListener = listener;
+            if (listener instanceof OnDoubleTapListener) {
+                setOnDoubleTapListener((OnDoubleTapListener) listener);
+            }
+            init(context);
+        }
+
+        private void init(Context context) {
+            if (context == null) {
+                throw new IllegalArgumentException("Context must not be null");
+            }
+            if (mListener == null) {
+                throw new IllegalArgumentException("OnGestureListener must not be null");
+            }
+            mIsLongpressEnabled = true;
+
+            final ViewConfiguration configuration = ViewConfiguration.get(context);
+            final int touchSlop = configuration.getScaledTouchSlop();
+            final int doubleTapSlop = configuration.getScaledDoubleTapSlop();
+            mMinimumFlingVelocity = configuration.getScaledMinimumFlingVelocity();
+            mMaximumFlingVelocity = configuration.getScaledMaximumFlingVelocity();
+
+            mTouchSlopSquare = touchSlop * touchSlop;
+            mDoubleTapSlopSquare = doubleTapSlop * doubleTapSlop;
+        }
+
+        /**
+         * Sets the listener which will be called for double-tap and related
+         * gestures.
+         *
+         * @param onDoubleTapListener the listener invoked for all the callbacks, or
+         *        null to stop listening for double-tap gestures.
+         */
+        @Override
+        public void setOnDoubleTapListener(OnDoubleTapListener onDoubleTapListener) {
+            mDoubleTapListener = onDoubleTapListener;
+        }
+
+        /**
+         * Set whether longpress is enabled, if this is enabled when a user
+         * presses and holds down you get a longpress event and nothing further.
+         * If it's disabled the user can press and hold down and then later
+         * moved their finger and you will get scroll events. By default
+         * longpress is enabled.
+         *
+         * @param isLongpressEnabled whether longpress should be enabled.
+         */
+        @Override
+        public void setIsLongpressEnabled(boolean isLongpressEnabled) {
+            mIsLongpressEnabled = isLongpressEnabled;
+        }
+
+        /**
+         * @return true if longpress is enabled, else false.
+         */
+        @Override
+        public boolean isLongpressEnabled() {
+            return mIsLongpressEnabled;
+        }
+
+        /**
+         * Analyzes the given motion event and if applicable triggers the
+         * appropriate callbacks on the {@link OnGestureListener} supplied.
+         *
+         * @param ev The current motion event.
+         * @return true if the {@link OnGestureListener} consumed the event,
+         *              else false.
+         */
+        @Override
+        public boolean onTouchEvent(MotionEvent ev) {
+            final int action = ev.getAction();
+
+            if (mVelocityTracker == null) {
+                mVelocityTracker = VelocityTracker.obtain();
+            }
+            mVelocityTracker.addMovement(ev);
+
+            final boolean pointerUp =
+                    (action & MotionEventCompat.ACTION_MASK) == MotionEventCompat.ACTION_POINTER_UP;
+            final int skipIndex = pointerUp ? MotionEventCompat.getActionIndex(ev) : -1;
+
+            // Determine focal point
+            float sumX = 0, sumY = 0;
+            final int count = ev.getPointerCount();
+            for (int i = 0; i < count; i++) {
+                if (skipIndex == i) continue;
+                sumX += ev.getX(i);
+                sumY += ev.getY(i);
+            }
+            final int div = pointerUp ? count - 1 : count;
+            final float focusX = sumX / div;
+            final float focusY = sumY / div;
+
+            boolean handled = false;
+
+            switch (action & MotionEventCompat.ACTION_MASK) {
+            case MotionEventCompat.ACTION_POINTER_DOWN:
+                mDownFocusX = mLastFocusX = focusX;
+                mDownFocusY = mLastFocusY = focusY;
+                // Cancel long press and taps
+                cancelTaps();
+                break;
+
+            case MotionEventCompat.ACTION_POINTER_UP:
+                mDownFocusX = mLastFocusX = focusX;
+                mDownFocusY = mLastFocusY = focusY;
+
+                // Check the dot product of current velocities.
+                // If the pointer that left was opposing another velocity vector, clear.
+                mVelocityTracker.computeCurrentVelocity(1000, mMaximumFlingVelocity);
+                final int upIndex = MotionEventCompat.getActionIndex(ev);
+                final int id1 = ev.getPointerId(upIndex);
+                final float x1 = VelocityTrackerCompat.getXVelocity(mVelocityTracker, id1);
+                final float y1 = VelocityTrackerCompat.getYVelocity(mVelocityTracker, id1);
+                for (int i = 0; i < count; i++) {
+                    if (i == upIndex) continue;
+
+                    final int id2 = ev.getPointerId(i);
+                    final float x = x1 * VelocityTrackerCompat.getXVelocity(mVelocityTracker, id2);
+                    final float y = y1 * VelocityTrackerCompat.getYVelocity(mVelocityTracker, id2);
+
+                    final float dot = x + y;
+                    if (dot < 0) {
+                        mVelocityTracker.clear();
+                        break;
+                    }
+                }
+                break;
+
+            case MotionEvent.ACTION_DOWN:
+                if (mDoubleTapListener != null) {
+                    boolean hadTapMessage = mHandler.hasMessages(TAP);
+                    if (hadTapMessage) mHandler.removeMessages(TAP);
+                    if ((mCurrentDownEvent != null) && (mPreviousUpEvent != null) && hadTapMessage &&
+                            isConsideredDoubleTap(mCurrentDownEvent, mPreviousUpEvent, ev)) {
+                        // This is a second tap
+                        mIsDoubleTapping = true;
+                        // Give a callback with the first tap of the double-tap
+                        handled |= mDoubleTapListener.onDoubleTap(mCurrentDownEvent);
+                        // Give a callback with down event of the double-tap
+                        handled |= mDoubleTapListener.onDoubleTapEvent(ev);
+                    } else {
+                        // This is a first tap
+                        mHandler.sendEmptyMessageDelayed(TAP, DOUBLE_TAP_TIMEOUT);
+                    }
+                }
+
+                mDownFocusX = mLastFocusX = focusX;
+                mDownFocusY = mLastFocusY = focusY;
+                if (mCurrentDownEvent != null) {
+                    mCurrentDownEvent.recycle();
+                }
+                mCurrentDownEvent = MotionEvent.obtain(ev);
+                mAlwaysInTapRegion = true;
+                mAlwaysInBiggerTapRegion = true;
+                mStillDown = true;
+                mInLongPress = false;
+                mDeferConfirmSingleTap = false;
+
+                if (mIsLongpressEnabled) {
+                    mHandler.removeMessages(LONG_PRESS);
+                    mHandler.sendEmptyMessageAtTime(LONG_PRESS, mCurrentDownEvent.getDownTime()
+                            + TAP_TIMEOUT + LONGPRESS_TIMEOUT);
+                }
+                mHandler.sendEmptyMessageAtTime(SHOW_PRESS, mCurrentDownEvent.getDownTime() + TAP_TIMEOUT);
+                handled |= mListener.onDown(ev);
+                break;
+
+            case MotionEvent.ACTION_MOVE:
+                if (mInLongPress) {
+                    break;
+                }
+                final float scrollX = mLastFocusX - focusX;
+                final float scrollY = mLastFocusY - focusY;
+                if (mIsDoubleTapping) {
+                    // Give the move events of the double-tap
+                    handled |= mDoubleTapListener.onDoubleTapEvent(ev);
+                } else if (mAlwaysInTapRegion) {
+                    final int deltaX = (int) (focusX - mDownFocusX);
+                    final int deltaY = (int) (focusY - mDownFocusY);
+                    int distance = (deltaX * deltaX) + (deltaY * deltaY);
+                    if (distance > mTouchSlopSquare) {
+                        handled = mListener.onScroll(mCurrentDownEvent, ev, scrollX, scrollY);
+                        mLastFocusX = focusX;
+                        mLastFocusY = focusY;
+                        mAlwaysInTapRegion = false;
+                        mHandler.removeMessages(TAP);
+                        mHandler.removeMessages(SHOW_PRESS);
+                        mHandler.removeMessages(LONG_PRESS);
+                    }
+                    if (distance > mTouchSlopSquare) {
+                        mAlwaysInBiggerTapRegion = false;
+                    }
+                } else if ((Math.abs(scrollX) >= 1) || (Math.abs(scrollY) >= 1)) {
+                    handled = mListener.onScroll(mCurrentDownEvent, ev, scrollX, scrollY);
+                    mLastFocusX = focusX;
+                    mLastFocusY = focusY;
+                }
+                break;
+
+            case MotionEvent.ACTION_UP:
+                mStillDown = false;
+                MotionEvent currentUpEvent = MotionEvent.obtain(ev);
+                if (mIsDoubleTapping) {
+                    // Finally, give the up event of the double-tap
+                    handled |= mDoubleTapListener.onDoubleTapEvent(ev);
+                } else if (mInLongPress) {
+                    mHandler.removeMessages(TAP);
+                    mInLongPress = false;
+                } else if (mAlwaysInTapRegion) {
+                    handled = mListener.onSingleTapUp(ev);
+                    if (mDeferConfirmSingleTap && mDoubleTapListener != null) {
+                        mDoubleTapListener.onSingleTapConfirmed(ev);
+                    }
+                } else {
+                    // A fling must travel the minimum tap distance
+                    final VelocityTracker velocityTracker = mVelocityTracker;
+                    final int pointerId = ev.getPointerId(0);
+                    velocityTracker.computeCurrentVelocity(1000, mMaximumFlingVelocity);
+                    final float velocityY = VelocityTrackerCompat.getYVelocity(
+                            velocityTracker, pointerId);
+                    final float velocityX = VelocityTrackerCompat.getXVelocity(
+                            velocityTracker, pointerId);
+
+                    if ((Math.abs(velocityY) > mMinimumFlingVelocity)
+                            || (Math.abs(velocityX) > mMinimumFlingVelocity)){
+                        handled = mListener.onFling(mCurrentDownEvent, ev, velocityX, velocityY);
+                    }
+                }
+                if (mPreviousUpEvent != null) {
+                    mPreviousUpEvent.recycle();
+                }
+                // Hold the event we obtained above - listeners may have changed the original.
+                mPreviousUpEvent = currentUpEvent;
+                if (mVelocityTracker != null) {
+                    // This may have been cleared when we called out to the
+                    // application above.
+                    mVelocityTracker.recycle();
+                    mVelocityTracker = null;
+                }
+                mIsDoubleTapping = false;
+                mDeferConfirmSingleTap = false;
+                mHandler.removeMessages(SHOW_PRESS);
+                mHandler.removeMessages(LONG_PRESS);
+                break;
+
+            case MotionEvent.ACTION_CANCEL:
+                cancel();
+                break;
+            }
+
+            return handled;
+        }
+
+        private void cancel() {
+            mHandler.removeMessages(SHOW_PRESS);
+            mHandler.removeMessages(LONG_PRESS);
+            mHandler.removeMessages(TAP);
+            mVelocityTracker.recycle();
+            mVelocityTracker = null;
+            mIsDoubleTapping = false;
+            mStillDown = false;
+            mAlwaysInTapRegion = false;
+            mAlwaysInBiggerTapRegion = false;
+            mDeferConfirmSingleTap = false;
+            if (mInLongPress) {
+                mInLongPress = false;
+            }
+        }
+
+        private void cancelTaps() {
+            mHandler.removeMessages(SHOW_PRESS);
+            mHandler.removeMessages(LONG_PRESS);
+            mHandler.removeMessages(TAP);
+            mIsDoubleTapping = false;
+            mAlwaysInTapRegion = false;
+            mAlwaysInBiggerTapRegion = false;
+            mDeferConfirmSingleTap = false;
+            if (mInLongPress) {
+                mInLongPress = false;
+            }
+        }
+
+        private boolean isConsideredDoubleTap(MotionEvent firstDown, MotionEvent firstUp,
+                MotionEvent secondDown) {
+            if (!mAlwaysInBiggerTapRegion) {
+                return false;
+            }
+
+            if (secondDown.getEventTime() - firstUp.getEventTime() > DOUBLE_TAP_TIMEOUT) {
+                return false;
+            }
+
+            int deltaX = (int) firstDown.getX() - (int) secondDown.getX();
+            int deltaY = (int) firstDown.getY() - (int) secondDown.getY();
+            return (deltaX * deltaX + deltaY * deltaY < mDoubleTapSlopSquare);
+        }
+
+        private void dispatchLongPress() {
+            mHandler.removeMessages(TAP);
+            mDeferConfirmSingleTap = false;
+            mInLongPress = true;
+            mListener.onLongPress(mCurrentDownEvent);
+        }
+    }
+
+    static class GestureDetectorCompatImplJellybeanMr2 implements GestureDetectorCompatImpl {
+        private final GestureDetector mDetector;
+
+        public GestureDetectorCompatImplJellybeanMr2(Context context, OnGestureListener listener,
+                Handler handler) {
+            mDetector = new GestureDetector(context, listener, handler);
+        }
+
+        @Override
+        public boolean isLongpressEnabled() {
+            return mDetector.isLongpressEnabled();
+        }
+
+        @Override
+        public boolean onTouchEvent(MotionEvent ev) {
+            return mDetector.onTouchEvent(ev);
+        }
+
+        @Override
+        public void setIsLongpressEnabled(boolean enabled) {
+            mDetector.setIsLongpressEnabled(enabled);
+        }
+
+        @Override
+        public void setOnDoubleTapListener(OnDoubleTapListener listener) {
+            mDetector.setOnDoubleTapListener(listener);
+        }
+    }
+
+    private final GestureDetectorCompatImpl mImpl;
+
+    /**
+     * Creates a GestureDetectorCompat with the supplied listener.
+     * As usual, you may only use this constructor from a UI thread.
+     * @see android.os.Handler#Handler()
+     *
+     * @param context the application's context
+     * @param listener the listener invoked for all the callbacks, this must
+     * not be null.
+     */
+    public GestureDetectorCompat(Context context, OnGestureListener listener) {
+        this(context, listener, null);
+    }
+
+    /**
+     * Creates a GestureDetectorCompat with the supplied listener.
+     * As usual, you may only use this constructor from a UI thread.
+     * @see android.os.Handler#Handler()
+     *
+     * @param context the application's context
+     * @param listener the listener invoked for all the callbacks, this must
+     * not be null.
+     * @param handler the handler that will be used for posting deferred messages
+     */
+    public GestureDetectorCompat(Context context, OnGestureListener listener, Handler handler) {
+        if (Build.VERSION.SDK_INT > 17) {
+            mImpl = new GestureDetectorCompatImplJellybeanMr2(context, listener, handler);
+        } else {
+            mImpl = new GestureDetectorCompatImplBase(context, listener, handler);
+        }
+    }
+
+    /**
+     * @return true if longpress is enabled, else false.
+     */
+    public boolean isLongpressEnabled() {
+        return mImpl.isLongpressEnabled();
+    }
+
+    /**
+     * Analyzes the given motion event and if applicable triggers the
+     * appropriate callbacks on the {@link OnGestureListener} supplied.
+     *
+     * @param event The current motion event.
+     * @return true if the {@link OnGestureListener} consumed the event,
+     *              else false.
+     */
+    public boolean onTouchEvent(MotionEvent event) {
+        return mImpl.onTouchEvent(event);
+    }
+
+    /**
+     * Set whether longpress is enabled, if this is enabled when a user
+     * presses and holds down you get a longpress event and nothing further.
+     * If it's disabled the user can press and hold down and then later
+     * moved their finger and you will get scroll events. By default
+     * longpress is enabled.
+     *
+     * @param enabled whether longpress should be enabled.
+     */
+    public void setIsLongpressEnabled(boolean enabled) {
+        mImpl.setIsLongpressEnabled(enabled);
+    }
+
+    /**
+     * Sets the listener which will be called for double-tap and related
+     * gestures.
+     *
+     * @param listener the listener invoked for all the callbacks, or
+     *        null to stop listening for double-tap gestures.
+     */
+    public void setOnDoubleTapListener(OnDoubleTapListener listener) {
+        mImpl.setOnDoubleTapListener(listener);
+    }
+}
diff --git a/v4/java/android/support/v4/view/GravityCompat.java b/compat/java/android/support/v4/view/GravityCompat.java
similarity index 100%
rename from v4/java/android/support/v4/view/GravityCompat.java
rename to compat/java/android/support/v4/view/GravityCompat.java
diff --git a/v4/java/android/support/v4/view/InputDeviceCompat.java b/compat/java/android/support/v4/view/InputDeviceCompat.java
similarity index 100%
rename from v4/java/android/support/v4/view/InputDeviceCompat.java
rename to compat/java/android/support/v4/view/InputDeviceCompat.java
diff --git a/compat/java/android/support/v4/view/KeyEventCompat.java b/compat/java/android/support/v4/view/KeyEventCompat.java
new file mode 100644
index 0000000..cf47264
--- /dev/null
+++ b/compat/java/android/support/v4/view/KeyEventCompat.java
@@ -0,0 +1,197 @@
+/*
+ * 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 android.support.v4.view;
+
+import android.view.KeyEvent;
+import android.view.View;
+
+/**
+ * Helper for accessing features in {@link KeyEvent} introduced after
+ * API level 4 in a backwards compatible fashion.
+ */
+public final class KeyEventCompat {
+    /**
+     * Interface for the full API.
+     */
+    interface KeyEventVersionImpl {
+        int normalizeMetaState(int metaState);
+        boolean metaStateHasModifiers(int metaState, int modifiers);
+        boolean metaStateHasNoModifiers(int metaState);
+        boolean isCtrlPressed(KeyEvent event);
+    }
+
+    /**
+     * Interface implementation that doesn't use anything about v4 APIs.
+     */
+    static class BaseKeyEventVersionImpl implements KeyEventVersionImpl {
+        private static final int META_MODIFIER_MASK =
+                KeyEvent.META_SHIFT_ON | KeyEvent.META_SHIFT_LEFT_ON | KeyEvent.META_SHIFT_RIGHT_ON
+                | KeyEvent.META_ALT_ON | KeyEvent.META_ALT_LEFT_ON | KeyEvent.META_ALT_RIGHT_ON
+                | KeyEvent.META_SYM_ON;
+
+        // Mask of all lock key meta states.
+        private static final int META_ALL_MASK = META_MODIFIER_MASK;
+
+        private static int metaStateFilterDirectionalModifiers(int metaState,
+                int modifiers, int basic, int left, int right) {
+            final boolean wantBasic = (modifiers & basic) != 0;
+            final int directional = left | right;
+            final boolean wantLeftOrRight = (modifiers & directional) != 0;
+
+            if (wantBasic) {
+                if (wantLeftOrRight) {
+                    throw new IllegalArgumentException("bad arguments");
+                }
+                return metaState & ~directional;
+            } else if (wantLeftOrRight) {
+                return metaState & ~basic;
+            } else {
+                return metaState;
+            }
+        }
+
+        @Override
+        public int normalizeMetaState(int metaState) {
+            if ((metaState & (KeyEvent.META_SHIFT_LEFT_ON | KeyEvent.META_SHIFT_RIGHT_ON)) != 0) {
+                metaState |= KeyEvent.META_SHIFT_ON;
+            }
+            if ((metaState & (KeyEvent.META_ALT_LEFT_ON | KeyEvent.META_ALT_RIGHT_ON)) != 0) {
+                metaState |= KeyEvent.META_ALT_ON;
+            }
+            return metaState & META_ALL_MASK;
+        }
+ 
+        @Override
+        public boolean metaStateHasModifiers(int metaState, int modifiers) {
+            metaState = normalizeMetaState(metaState) & META_MODIFIER_MASK;
+            metaState = metaStateFilterDirectionalModifiers(metaState, modifiers,
+                    KeyEvent.META_SHIFT_ON, KeyEvent.META_SHIFT_LEFT_ON, KeyEvent.META_SHIFT_RIGHT_ON);
+            metaState = metaStateFilterDirectionalModifiers(metaState, modifiers,
+                    KeyEvent.META_ALT_ON, KeyEvent.META_ALT_LEFT_ON, KeyEvent.META_ALT_RIGHT_ON);
+            return metaState == modifiers;
+        }
+
+        @Override
+        public boolean metaStateHasNoModifiers(int metaState) {
+            return (normalizeMetaState(metaState) & META_MODIFIER_MASK) == 0;
+        }
+
+        @Override
+        public boolean isCtrlPressed(KeyEvent event) {
+            return false;
+        }
+    }
+
+    /**
+     * Interface implementation for devices with at least v11 APIs.
+     */
+    static class HoneycombKeyEventVersionImpl extends BaseKeyEventVersionImpl {
+        @Override
+        public int normalizeMetaState(int metaState) {
+            return KeyEventCompatHoneycomb.normalizeMetaState(metaState);
+        }
+        
+        @Override
+        public boolean metaStateHasModifiers(int metaState, int modifiers) {
+            return KeyEventCompatHoneycomb.metaStateHasModifiers(metaState, modifiers);
+        }
+
+        @Override
+        public boolean metaStateHasNoModifiers(int metaState) {
+            return KeyEventCompatHoneycomb.metaStateHasNoModifiers(metaState);
+        }
+
+        @Override
+        public boolean isCtrlPressed(KeyEvent event) {
+            return KeyEventCompatHoneycomb.isCtrlPressed(event);
+        }
+    }
+
+    /**
+     * Select the correct implementation to use for the current platform.
+     */
+    static final KeyEventVersionImpl IMPL;
+    static {
+        if (android.os.Build.VERSION.SDK_INT >= 11) {
+            IMPL = new HoneycombKeyEventVersionImpl();
+        } else {
+            IMPL = new BaseKeyEventVersionImpl();
+        }
+    }
+
+    // -------------------------------------------------------------------
+
+    public static int normalizeMetaState(int metaState) {
+        return IMPL.normalizeMetaState(metaState);
+    }
+
+    public static boolean metaStateHasModifiers(int metaState, int modifiers) {
+        return IMPL.metaStateHasModifiers(metaState, modifiers);
+    }
+
+    public static boolean metaStateHasNoModifiers(int metaState) {
+        return IMPL.metaStateHasNoModifiers(metaState);
+    }
+
+    public static boolean hasModifiers(KeyEvent event, int modifiers) {
+        return IMPL.metaStateHasModifiers(event.getMetaState(), modifiers);
+    }
+
+    public static boolean hasNoModifiers(KeyEvent event) {
+        return IMPL.metaStateHasNoModifiers(event.getMetaState());
+    }
+
+    /**
+     * @deprecated Call {@link KeyEvent#startTracking()} directly.
+     */
+    @Deprecated
+    public static void startTracking(KeyEvent event) {
+        event.startTracking();
+    }
+
+    /**
+     * @deprecated Call {@link KeyEvent#isTracking()} directly.
+     */
+    @Deprecated
+    public static boolean isTracking(KeyEvent event) {
+        return event.isTracking();
+    }
+
+    /**
+     * @deprecated Call {@link View#getKeyDispatcherState()} directly.
+     */
+    @Deprecated
+    public static Object getKeyDispatcherState(View view) {
+        return view.getKeyDispatcherState();
+    }
+
+    /**
+     * @deprecated Call
+     * {@link KeyEvent#dispatch(KeyEvent.Callback, KeyEvent.DispatcherState, Object)} directly.
+     */
+    @Deprecated
+    public static boolean dispatch(KeyEvent event, KeyEvent.Callback receiver, Object state,
+                Object target) {
+        return event.dispatch(receiver, (KeyEvent.DispatcherState)state, target);
+    }
+
+    public static boolean isCtrlPressed(KeyEvent event) {
+        return IMPL.isCtrlPressed(event);
+    }
+
+    private KeyEventCompat() {}
+}
diff --git a/v4/java/android/support/v4/view/LayoutInflaterCompat.java b/compat/java/android/support/v4/view/LayoutInflaterCompat.java
similarity index 100%
rename from v4/java/android/support/v4/view/LayoutInflaterCompat.java
rename to compat/java/android/support/v4/view/LayoutInflaterCompat.java
diff --git a/v4/java/android/support/v4/view/MarginLayoutParamsCompat.java b/compat/java/android/support/v4/view/MarginLayoutParamsCompat.java
similarity index 100%
rename from v4/java/android/support/v4/view/MarginLayoutParamsCompat.java
rename to compat/java/android/support/v4/view/MarginLayoutParamsCompat.java
diff --git a/v4/java/android/support/v4/view/MenuCompat.java b/compat/java/android/support/v4/view/MenuCompat.java
similarity index 100%
rename from v4/java/android/support/v4/view/MenuCompat.java
rename to compat/java/android/support/v4/view/MenuCompat.java
diff --git a/v4/java/android/support/v4/view/MenuItemCompat.java b/compat/java/android/support/v4/view/MenuItemCompat.java
similarity index 100%
rename from v4/java/android/support/v4/view/MenuItemCompat.java
rename to compat/java/android/support/v4/view/MenuItemCompat.java
diff --git a/compat/java/android/support/v4/view/MotionEventCompat.java b/compat/java/android/support/v4/view/MotionEventCompat.java
new file mode 100644
index 0000000..2db588c
--- /dev/null
+++ b/compat/java/android/support/v4/view/MotionEventCompat.java
@@ -0,0 +1,495 @@
+/*
+ * 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 android.support.v4.view;
+
+import android.os.Build;
+import android.view.MotionEvent;
+
+/**
+ * Helper for accessing features in {@link MotionEvent} introduced
+ * after API level 4 in a backwards compatible fashion.
+ */
+public final class MotionEventCompat {
+    /**
+     * Interface for the full API.
+     */
+    interface MotionEventVersionImpl {
+        float getAxisValue(MotionEvent event, int axis);
+        float getAxisValue(MotionEvent event, int axis, int pointerIndex);
+        int getButtonState(MotionEvent event);
+    }
+
+    /**
+     * Interface implementation that doesn't use anything about v4 APIs.
+     */
+    static class BaseMotionEventVersionImpl implements MotionEventVersionImpl {
+        @Override
+        public float getAxisValue(MotionEvent event, int axis) {
+            return 0;
+        }
+
+        @Override
+        public float getAxisValue(MotionEvent event, int axis, int pointerIndex) {
+            return 0;
+        }
+
+        @Override
+        public int getButtonState(MotionEvent event) {
+            return 0;
+        }
+    }
+
+    /**
+     * Interface implementation for devices with at least v12 APIs.
+     */
+    static class HoneycombMr1MotionEventVersionImpl extends BaseMotionEventVersionImpl {
+
+        @Override
+        public float getAxisValue(MotionEvent event, int axis) {
+            return MotionEventCompatHoneycombMr1.getAxisValue(event, axis);
+        }
+
+        @Override
+        public float getAxisValue(MotionEvent event, int axis, int pointerIndex) {
+            return MotionEventCompatHoneycombMr1.getAxisValue(event, axis, pointerIndex);
+        }
+    }
+
+
+    /**
+     * Interface implementation for devices with at least v14 APIs.
+     */
+    private static class ICSMotionEventVersionImpl extends HoneycombMr1MotionEventVersionImpl {
+        @Override
+        public int getButtonState(MotionEvent event) {
+            return MotionEventCompatICS.getButtonState(event);
+        }
+    }
+
+    /**
+     * Select the correct implementation to use for the current platform.
+     */
+    static final MotionEventVersionImpl IMPL;
+    static {
+        if (Build.VERSION.SDK_INT >= 14) {
+            IMPL = new ICSMotionEventVersionImpl();
+        } else if (Build.VERSION.SDK_INT >= 12) {
+            IMPL = new HoneycombMr1MotionEventVersionImpl();
+        } else {
+            IMPL = new BaseMotionEventVersionImpl();
+        }
+    }
+
+    // -------------------------------------------------------------------
+
+    /**
+     * Synonym for {@link MotionEvent#ACTION_MASK}.
+     */
+    public static final int ACTION_MASK = 0xff;
+
+    /**
+     * Synonym for {@link MotionEvent#ACTION_POINTER_DOWN}.
+     */
+    public static final int ACTION_POINTER_DOWN = 5;
+
+    /**
+     * Synonym for {@link MotionEvent#ACTION_POINTER_UP}.
+     */
+    public static final int ACTION_POINTER_UP = 6;
+
+    /**
+     * Synonym for {@link MotionEvent#ACTION_HOVER_MOVE}.
+     */
+    public static final int ACTION_HOVER_MOVE = 7;
+
+    /**
+     * Synonym for {@link MotionEvent#ACTION_SCROLL}.
+     */
+    public static final int ACTION_SCROLL = 8;
+
+    /**
+     * Synonym for {@link MotionEvent#ACTION_POINTER_INDEX_MASK}.
+     */
+    public static final int ACTION_POINTER_INDEX_MASK  = 0xff00;
+
+    /**
+     * Synonym for {@link MotionEvent#ACTION_POINTER_INDEX_SHIFT}.
+     */
+    public static final int ACTION_POINTER_INDEX_SHIFT = 8;
+
+    /**
+     * Synonym for {@link MotionEvent#ACTION_HOVER_ENTER}.
+     */
+    public static final int ACTION_HOVER_ENTER = 9;
+
+    /**
+     * Synonym for {@link MotionEvent#ACTION_HOVER_EXIT}.
+     */
+    public static final int ACTION_HOVER_EXIT = 10;
+
+    /**
+     * Synonym for {@link MotionEvent#AXIS_X}.
+     */
+    public static final int AXIS_X = 0;
+
+    /**
+     * Synonym for {@link MotionEvent#AXIS_Y}.
+     */
+    public static final int AXIS_Y = 1;
+
+    /**
+     * Synonym for {@link MotionEvent#AXIS_PRESSURE}.
+     */
+    public static final int AXIS_PRESSURE = 2;
+
+    /**
+     * Synonym for {@link MotionEvent#AXIS_SIZE}.
+     */
+    public static final int AXIS_SIZE = 3;
+
+    /**
+     * Synonym for {@link MotionEvent#AXIS_TOUCH_MAJOR}.
+     */
+    public static final int AXIS_TOUCH_MAJOR = 4;
+
+    /**
+     * Synonym for {@link MotionEvent#AXIS_TOUCH_MINOR}.
+     */
+    public static final int AXIS_TOUCH_MINOR = 5;
+
+    /**
+     * Synonym for {@link MotionEvent#AXIS_TOOL_MAJOR}.
+     */
+    public static final int AXIS_TOOL_MAJOR = 6;
+
+    /**
+     * Synonym for {@link MotionEvent#AXIS_TOOL_MINOR}.
+     */
+    public static final int AXIS_TOOL_MINOR = 7;
+
+    /**
+     * Synonym for {@link MotionEvent#AXIS_ORIENTATION}.
+     */
+    public static final int AXIS_ORIENTATION = 8;
+
+    /**
+     * Synonym for {@link MotionEvent#AXIS_VSCROLL}.
+     */
+    public static final int AXIS_VSCROLL = 9;
+
+    /**
+     * Synonym for {@link MotionEvent#AXIS_HSCROLL}.
+     */
+    public static final int AXIS_HSCROLL = 10;
+
+    /**
+     * Synonym for {@link MotionEvent#AXIS_Z}.
+     */
+    public static final int AXIS_Z = 11;
+
+    /**
+     * Synonym for {@link MotionEvent#AXIS_RX}.
+     */
+    public static final int AXIS_RX = 12;
+
+    /**
+     * Synonym for {@link MotionEvent#AXIS_RY}.
+     */
+    public static final int AXIS_RY = 13;
+
+    /**
+     * Synonym for {@link MotionEvent#AXIS_RZ}.
+     */
+    public static final int AXIS_RZ = 14;
+
+    /**
+     * Synonym for {@link MotionEvent#AXIS_HAT_X}.
+     */
+    public static final int AXIS_HAT_X = 15;
+
+    /**
+     * Synonym for {@link MotionEvent#AXIS_HAT_Y}.
+     */
+    public static final int AXIS_HAT_Y = 16;
+
+    /**
+     * Synonym for {@link MotionEvent#AXIS_LTRIGGER}.
+     */
+    public static final int AXIS_LTRIGGER = 17;
+
+    /**
+     * Synonym for {@link MotionEvent#AXIS_RTRIGGER}.
+     */
+    public static final int AXIS_RTRIGGER = 18;
+
+    /**
+     * Synonym for {@link MotionEvent#AXIS_THROTTLE}.
+     */
+    public static final int AXIS_THROTTLE = 19;
+
+    /**
+     * Synonym for {@link MotionEvent#AXIS_RUDDER}.
+     */
+    public static final int AXIS_RUDDER = 20;
+
+    /**
+     * Synonym for {@link MotionEvent#AXIS_WHEEL}.
+     */
+    public static final int AXIS_WHEEL = 21;
+
+    /**
+     * Synonym for {@link MotionEvent#AXIS_GAS}.
+     */
+    public static final int AXIS_GAS = 22;
+
+    /**
+     * Synonym for {@link MotionEvent#AXIS_BRAKE}.
+     */
+    public static final int AXIS_BRAKE = 23;
+
+    /**
+     * Synonym for {@link MotionEvent#AXIS_DISTANCE}.
+     */
+    public static final int AXIS_DISTANCE = 24;
+
+    /**
+     * Synonym for {@link MotionEvent#AXIS_TILT}.
+     */
+    public static final int AXIS_TILT = 25;
+
+    /**
+     * Synonym for {@link MotionEvent#AXIS_RELATIVE_X}.
+     */
+    public static final int AXIS_RELATIVE_X = 27;
+
+    /**
+     * Synonym for {@link MotionEvent#AXIS_RELATIVE_Y}.
+     */
+    public static final int AXIS_RELATIVE_Y = 28;
+
+    /**
+     * Synonym for {@link MotionEvent#AXIS_GENERIC_1}.
+     */
+    public static final int AXIS_GENERIC_1 = 32;
+
+    /**
+     * Synonym for {@link MotionEvent#AXIS_GENERIC_2}.
+     */
+    public static final int AXIS_GENERIC_2 = 33;
+
+    /**
+     * Synonym for {@link MotionEvent#AXIS_GENERIC_3}.
+     */
+    public static final int AXIS_GENERIC_3 = 34;
+
+    /**
+     * Synonym for {@link MotionEvent#AXIS_GENERIC_4}.
+     */
+    public static final int AXIS_GENERIC_4 = 35;
+
+    /**
+     * Synonym for {@link MotionEvent#AXIS_GENERIC_5}.
+     */
+    public static final int AXIS_GENERIC_5 = 36;
+
+    /**
+     * Synonym for {@link MotionEvent#AXIS_GENERIC_6}.
+     */
+    public static final int AXIS_GENERIC_6 = 37;
+
+    /**
+     * Synonym for {@link MotionEvent#AXIS_GENERIC_7}.
+     */
+    public static final int AXIS_GENERIC_7 = 38;
+
+    /**
+     * Synonym for {@link MotionEvent#AXIS_GENERIC_8}.
+     */
+    public static final int AXIS_GENERIC_8 = 39;
+
+    /**
+     * Synonym for {@link MotionEvent#AXIS_GENERIC_9}.
+     */
+    public static final int AXIS_GENERIC_9 = 40;
+
+    /**
+     * Synonym for {@link MotionEvent#AXIS_GENERIC_10}.
+     */
+    public static final int AXIS_GENERIC_10 = 41;
+
+    /**
+     * Synonym for {@link MotionEvent#AXIS_GENERIC_11}.
+     */
+    public static final int AXIS_GENERIC_11 = 42;
+
+    /**
+     * Synonym for {@link MotionEvent#AXIS_GENERIC_12}.
+     */
+    public static final int AXIS_GENERIC_12 = 43;
+
+    /**
+     * Synonym for {@link MotionEvent#AXIS_GENERIC_13}.
+     */
+    public static final int AXIS_GENERIC_13 = 44;
+
+    /**
+     * Synonym for {@link MotionEvent#AXIS_GENERIC_14}.
+     */
+    public static final int AXIS_GENERIC_14 = 45;
+
+    /**
+     * Synonym for {@link MotionEvent#AXIS_GENERIC_15}.
+     */
+    public static final int AXIS_GENERIC_15 = 46;
+
+    /**
+     * Synonym for {@link MotionEvent#AXIS_GENERIC_16}.
+     */
+    public static final int AXIS_GENERIC_16 = 47;
+
+    /**
+     * Synonym for {@link MotionEvent#BUTTON_PRIMARY}.
+     */
+    public static final int BUTTON_PRIMARY = 1;
+
+    /**
+     * Call {@link MotionEvent#getAction}, returning only the {@link #ACTION_MASK}
+     * portion.
+     */
+    public static int getActionMasked(MotionEvent event) {
+        return event.getAction() & ACTION_MASK;
+    }
+
+    /**
+     * Call {@link MotionEvent#getAction}, returning only the pointer index
+     * portion
+     */
+    public static int getActionIndex(MotionEvent event) {
+        return (event.getAction() & ACTION_POINTER_INDEX_MASK)
+                >> ACTION_POINTER_INDEX_SHIFT;
+    }
+
+    /**
+     * Call {@link MotionEvent#findPointerIndex(int)}.
+     *
+     * @deprecated Call {@link MotionEvent#findPointerIndex(int)} directly.
+     */
+    @Deprecated
+    public static int findPointerIndex(MotionEvent event, int pointerId) {
+        return event.findPointerIndex(pointerId);
+    }
+
+    /**
+     * Call {@link MotionEvent#getPointerId(int)}.
+     *
+     * @deprecated Call {@link MotionEvent#getPointerId(int)} directly.
+     */
+    @Deprecated
+    public static int getPointerId(MotionEvent event, int pointerIndex) {
+        return event.getPointerId(pointerIndex);
+    }
+
+    /**
+     * Call {@link MotionEvent#getX(int)}.
+     *
+     * @deprecated Call {@link MotionEvent#getX()} directly.
+     */
+    @Deprecated
+    public static float getX(MotionEvent event, int pointerIndex) {
+        return event.getX(pointerIndex);
+    }
+
+    /**
+     * Call {@link MotionEvent#getY(int)}.
+     *
+     * @deprecated Call {@link MotionEvent#getY()} directly.
+     */
+    @Deprecated
+    public static float getY(MotionEvent event, int pointerIndex) {
+        return event.getY(pointerIndex);
+    }
+
+    /**
+     * The number of pointers of data contained in this event.  Always
+     *
+     * @deprecated Call {@link MotionEvent#getPointerCount()} directly.
+     */
+    @Deprecated
+    public static int getPointerCount(MotionEvent event) {
+        return event.getPointerCount();
+    }
+
+    /**
+     * Gets the source of the event.
+     *
+     * @return The event source or {@link InputDeviceCompat#SOURCE_UNKNOWN} if unknown.
+     * @deprecated Call {@link MotionEvent#getSource()} directly.
+     */
+    @Deprecated
+    public static int getSource(MotionEvent event) {
+        return event.getSource();
+    }
+
+    /**
+     * Determines whether the event is from the given source.
+     * @param source The input source to check against.
+     * @return Whether the event is from the given source.
+     */
+    public static boolean isFromSource(MotionEvent event, int source) {
+        return (event.getSource() & source) == source;
+    }
+
+    /**
+     * Get axis value for the first pointer index (may be an
+     * arbitrary pointer identifier).
+     *
+     * @param axis The axis identifier for the axis value to retrieve.
+     *
+     * @see #AXIS_X
+     * @see #AXIS_Y
+     */
+    public static float getAxisValue(MotionEvent event, int axis) {
+        return IMPL.getAxisValue(event, axis);
+    }
+
+    /**
+     * Returns the value of the requested axis for the given pointer <em>index</em>
+     * (use {@link #getPointerId(MotionEvent, int)} to find the pointer identifier for this index).
+     *
+     * @param axis The axis identifier for the axis value to retrieve.
+     * @param pointerIndex Raw index of pointer to retrieve.  Value may be from 0
+     * (the first pointer that is down) to {@link #getPointerCount(MotionEvent)}-1.
+     * @return The value of the axis, or 0 if the axis is not available.
+     *
+     * @see #AXIS_X
+     * @see #AXIS_Y
+     */
+    public static float getAxisValue(MotionEvent event, int axis, int pointerIndex) {
+        return IMPL.getAxisValue(event, axis, pointerIndex);
+    }
+
+    /**
+     *
+     * @param event
+     * @return
+     */
+    public static int getButtonState(MotionEvent event) {
+        return IMPL.getButtonState(event);
+    }
+
+    private MotionEventCompat() {}
+}
diff --git a/v4/java/android/support/v4/view/NestedScrollingChild.java b/compat/java/android/support/v4/view/NestedScrollingChild.java
similarity index 100%
rename from v4/java/android/support/v4/view/NestedScrollingChild.java
rename to compat/java/android/support/v4/view/NestedScrollingChild.java
diff --git a/v4/java/android/support/v4/view/NestedScrollingParent.java b/compat/java/android/support/v4/view/NestedScrollingParent.java
similarity index 100%
rename from v4/java/android/support/v4/view/NestedScrollingParent.java
rename to compat/java/android/support/v4/view/NestedScrollingParent.java
diff --git a/compat/java/android/support/v4/view/OnApplyWindowInsetsListener.java b/compat/java/android/support/v4/view/OnApplyWindowInsetsListener.java
new file mode 100644
index 0000000..d53896e
--- /dev/null
+++ b/compat/java/android/support/v4/view/OnApplyWindowInsetsListener.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2014 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 android.support.v4.view;
+
+import android.view.View;
+
+/**
+ * Listener for applying window insets on a view in a custom way.
+ *
+ * <p>Apps may choose to implement this interface if they want to apply custom policy
+ * to the way that window insets are treated for a view. If an OnApplyWindowInsetsListener
+ * is set, it's
+ * {@link #onApplyWindowInsets(android.view.View, WindowInsetsCompat) onApplyWindowInsets}
+ * method will be called instead of the View's own {@code onApplyWindowInsets} method.
+ * The listener may optionally call the parameter View's <code>onApplyWindowInsets</code>
+ * method to apply the View's normal behavior as part of its own.</p>
+ */
+public interface OnApplyWindowInsetsListener {
+    /**
+     * When {@link ViewCompat#setOnApplyWindowInsetsListener(View, OnApplyWindowInsetsListener) set}
+     * on a View, this listener method will be called instead of the view's own
+     * {@code onApplyWindowInsets} method.
+     *
+     * @param v The view applying window insets
+     * @param insets The insets to apply
+     * @return The insets supplied, minus any insets that were consumed
+     */
+    WindowInsetsCompat onApplyWindowInsets(View v, WindowInsetsCompat insets);
+}
\ No newline at end of file
diff --git a/v4/java/android/support/v4/view/PointerIconCompat.java b/compat/java/android/support/v4/view/PointerIconCompat.java
similarity index 100%
rename from v4/java/android/support/v4/view/PointerIconCompat.java
rename to compat/java/android/support/v4/view/PointerIconCompat.java
diff --git a/v4/java/android/support/v4/view/ScaleGestureDetectorCompat.java b/compat/java/android/support/v4/view/ScaleGestureDetectorCompat.java
similarity index 100%
rename from v4/java/android/support/v4/view/ScaleGestureDetectorCompat.java
rename to compat/java/android/support/v4/view/ScaleGestureDetectorCompat.java
diff --git a/v4/java/android/support/v4/view/ScrollingView.java b/compat/java/android/support/v4/view/ScrollingView.java
similarity index 100%
rename from v4/java/android/support/v4/view/ScrollingView.java
rename to compat/java/android/support/v4/view/ScrollingView.java
diff --git a/v4/java/android/support/v4/view/VelocityTrackerCompat.java b/compat/java/android/support/v4/view/VelocityTrackerCompat.java
similarity index 100%
rename from v4/java/android/support/v4/view/VelocityTrackerCompat.java
rename to compat/java/android/support/v4/view/VelocityTrackerCompat.java
diff --git a/compat/java/android/support/v4/view/ViewCompat.java b/compat/java/android/support/v4/view/ViewCompat.java
new file mode 100644
index 0000000..79b1a43
--- /dev/null
+++ b/compat/java/android/support/v4/view/ViewCompat.java
@@ -0,0 +1,3481 @@
+/*
+ * 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 android.support.v4.view;
+
+import android.content.res.ColorStateList;
+import android.graphics.Matrix;
+import android.graphics.Paint;
+import android.graphics.PixelFormat;
+import android.graphics.PorterDuff;
+import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
+import android.os.Bundle;
+import android.support.annotation.FloatRange;
+import android.support.annotation.IdRes;
+import android.support.annotation.IntDef;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.v4.os.BuildCompat;
+import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat;
+import android.support.v4.view.accessibility.AccessibilityNodeProviderCompat;
+import android.util.Log;
+import android.view.MotionEvent;
+import android.view.VelocityTracker;
+import android.view.View;
+import android.view.ViewConfiguration;
+import android.view.ViewGroup;
+import android.view.ViewParent;
+import android.view.accessibility.AccessibilityEvent;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.WeakHashMap;
+
+/**
+ * Helper for accessing features in {@link View} introduced after API
+ * level 4 in a backwards compatible fashion.
+ */
+public class ViewCompat {
+    private static final String TAG = "ViewCompat";
+
+    /** @hide */
+    @IntDef({View.FOCUS_LEFT, View.FOCUS_UP, View.FOCUS_RIGHT, View.FOCUS_DOWN,
+            View.FOCUS_FORWARD, View.FOCUS_BACKWARD})
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface FocusDirection {}
+
+    /** @hide */
+    @IntDef({View.FOCUS_LEFT, View.FOCUS_UP, View.FOCUS_RIGHT, View.FOCUS_DOWN})
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface FocusRealDirection {}
+
+    /** @hide */
+    @IntDef({View.FOCUS_FORWARD, View.FOCUS_BACKWARD})
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface FocusRelativeDirection {}
+
+    /** @hide */
+    @IntDef({OVER_SCROLL_ALWAYS, OVER_SCROLL_IF_CONTENT_SCROLLS, OVER_SCROLL_NEVER})
+    @Retention(RetentionPolicy.SOURCE)
+    private @interface OverScroll {}
+
+    /**
+     * Always allow a user to over-scroll this view, provided it is a
+     * view that can scroll.
+     */
+    public static final int OVER_SCROLL_ALWAYS = 0;
+
+    /**
+     * Allow a user to over-scroll this view only if the content is large
+     * enough to meaningfully scroll, provided it is a view that can scroll.
+     */
+    public static final int OVER_SCROLL_IF_CONTENT_SCROLLS = 1;
+
+    /**
+     * Never allow a user to over-scroll this view.
+     */
+    public static final int OVER_SCROLL_NEVER = 2;
+
+    private static final long FAKE_FRAME_TIME = 10;
+
+    /** @hide */
+    @IntDef({
+            IMPORTANT_FOR_ACCESSIBILITY_AUTO,
+            IMPORTANT_FOR_ACCESSIBILITY_YES,
+            IMPORTANT_FOR_ACCESSIBILITY_NO,
+            IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS
+    })
+    @Retention(RetentionPolicy.SOURCE)
+    private @interface ImportantForAccessibility {}
+
+    /**
+     * Automatically determine whether a view is important for accessibility.
+     */
+    public static final int IMPORTANT_FOR_ACCESSIBILITY_AUTO = 0x00000000;
+
+    /**
+     * The view is important for accessibility.
+     */
+    public static final int IMPORTANT_FOR_ACCESSIBILITY_YES = 0x00000001;
+
+    /**
+     * The view is not important for accessibility.
+     */
+    public static final int IMPORTANT_FOR_ACCESSIBILITY_NO = 0x00000002;
+
+    /**
+     * The view is not important for accessibility, nor are any of its
+     * descendant views.
+     */
+    public static final int IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS = 0x00000004;
+
+    /** @hide */
+    @IntDef({
+            ACCESSIBILITY_LIVE_REGION_NONE,
+            ACCESSIBILITY_LIVE_REGION_POLITE,
+            ACCESSIBILITY_LIVE_REGION_ASSERTIVE
+    })
+    @Retention(RetentionPolicy.SOURCE)
+    private @interface AccessibilityLiveRegion {}
+
+    /**
+     * Live region mode specifying that accessibility services should not
+     * automatically announce changes to this view. This is the default live
+     * region mode for most views.
+     * <p>
+     * Use with {@link ViewCompat#setAccessibilityLiveRegion(View, int)}.
+     */
+    public static final int ACCESSIBILITY_LIVE_REGION_NONE = 0x00000000;
+
+    /**
+     * Live region mode specifying that accessibility services should announce
+     * changes to this view.
+     * <p>
+     * Use with {@link ViewCompat#setAccessibilityLiveRegion(View, int)}.
+     */
+    public static final int ACCESSIBILITY_LIVE_REGION_POLITE = 0x00000001;
+
+    /**
+     * Live region mode specifying that accessibility services should interrupt
+     * ongoing speech to immediately announce changes to this view.
+     * <p>
+     * Use with {@link ViewCompat#setAccessibilityLiveRegion(View, int)}.
+     */
+    public static final int ACCESSIBILITY_LIVE_REGION_ASSERTIVE = 0x00000002;
+
+    /** @hide */
+    @IntDef({LAYER_TYPE_NONE, LAYER_TYPE_SOFTWARE, LAYER_TYPE_HARDWARE})
+    @Retention(RetentionPolicy.SOURCE)
+    private @interface LayerType {}
+
+    /**
+     * Indicates that the view does not have a layer.
+     */
+    public static final int LAYER_TYPE_NONE = 0;
+
+    /**
+     * <p>Indicates that the view has a software layer. A software layer is backed
+     * by a bitmap and causes the view to be rendered using Android's software
+     * rendering pipeline, even if hardware acceleration is enabled.</p>
+     *
+     * <p>Software layers have various usages:</p>
+     * <p>When the application is not using hardware acceleration, a software layer
+     * is useful to apply a specific color filter and/or blending mode and/or
+     * translucency to a view and all its children.</p>
+     * <p>When the application is using hardware acceleration, a software layer
+     * is useful to render drawing primitives not supported by the hardware
+     * accelerated pipeline. It can also be used to cache a complex view tree
+     * into a texture and reduce the complexity of drawing operations. For instance,
+     * when animating a complex view tree with a translation, a software layer can
+     * be used to render the view tree only once.</p>
+     * <p>Software layers should be avoided when the affected view tree updates
+     * often. Every update will require to re-render the software layer, which can
+     * potentially be slow (particularly when hardware acceleration is turned on
+     * since the layer will have to be uploaded into a hardware texture after every
+     * update.)</p>
+     */
+    public static final int LAYER_TYPE_SOFTWARE = 1;
+
+    /**
+     * <p>Indicates that the view has a hardware layer. A hardware layer is backed
+     * by a hardware specific texture (generally Frame Buffer Objects or FBO on
+     * OpenGL hardware) and causes the view to be rendered using Android's hardware
+     * rendering pipeline, but only if hardware acceleration is turned on for the
+     * view hierarchy. When hardware acceleration is turned off, hardware layers
+     * behave exactly as {@link #LAYER_TYPE_SOFTWARE software layers}.</p>
+     *
+     * <p>A hardware layer is useful to apply a specific color filter and/or
+     * blending mode and/or translucency to a view and all its children.</p>
+     * <p>A hardware layer can be used to cache a complex view tree into a
+     * texture and reduce the complexity of drawing operations. For instance,
+     * when animating a complex view tree with a translation, a hardware layer can
+     * be used to render the view tree only once.</p>
+     * <p>A hardware layer can also be used to increase the rendering quality when
+     * rotation transformations are applied on a view. It can also be used to
+     * prevent potential clipping issues when applying 3D transforms on a view.</p>
+     */
+    public static final int LAYER_TYPE_HARDWARE = 2;
+
+    /** @hide */
+    @IntDef({
+            LAYOUT_DIRECTION_LTR,
+            LAYOUT_DIRECTION_RTL,
+            LAYOUT_DIRECTION_INHERIT,
+            LAYOUT_DIRECTION_LOCALE})
+    @Retention(RetentionPolicy.SOURCE)
+    private @interface LayoutDirectionMode {}
+
+    /** @hide */
+    @IntDef({
+            LAYOUT_DIRECTION_LTR,
+            LAYOUT_DIRECTION_RTL
+    })
+    @Retention(RetentionPolicy.SOURCE)
+    private @interface ResolvedLayoutDirectionMode {}
+
+    /**
+     * Horizontal layout direction of this view is from Left to Right.
+     */
+    public static final int LAYOUT_DIRECTION_LTR = 0;
+
+    /**
+     * Horizontal layout direction of this view is from Right to Left.
+     */
+    public static final int LAYOUT_DIRECTION_RTL = 1;
+
+    /**
+     * Horizontal layout direction of this view is inherited from its parent.
+     * Use with {@link #setLayoutDirection}.
+     */
+    public static final int LAYOUT_DIRECTION_INHERIT = 2;
+
+    /**
+     * Horizontal layout direction of this view is from deduced from the default language
+     * script for the locale. Use with {@link #setLayoutDirection}.
+     */
+    public static final int LAYOUT_DIRECTION_LOCALE = 3;
+
+    /**
+     * Bits of {@link #getMeasuredWidthAndState} and
+     * {@link #getMeasuredWidthAndState} that provide the actual measured size.
+     */
+    public static final int MEASURED_SIZE_MASK = 0x00ffffff;
+
+    /**
+     * Bits of {@link #getMeasuredWidthAndState} and
+     * {@link #getMeasuredWidthAndState} that provide the additional state bits.
+     */
+    public static final int MEASURED_STATE_MASK = 0xff000000;
+
+    /**
+     * Bit shift of {@link #MEASURED_STATE_MASK} to get to the height bits
+     * for functions that combine both width and height into a single int,
+     * such as {@link #getMeasuredState} and the childState argument of
+     * {@link #resolveSizeAndState(int, int, int)}.
+     */
+    public static final int MEASURED_HEIGHT_STATE_SHIFT = 16;
+
+    /**
+     * Bit of {@link #getMeasuredWidthAndState} and
+     * {@link #getMeasuredWidthAndState} that indicates the measured size
+     * is smaller that the space the view would like to have.
+     */
+    public static final int MEASURED_STATE_TOO_SMALL = 0x01000000;
+
+    /**
+     * Indicates no axis of view scrolling.
+     */
+    public static final int SCROLL_AXIS_NONE = 0;
+
+    /**
+     * Indicates scrolling along the horizontal axis.
+     */
+    public static final int SCROLL_AXIS_HORIZONTAL = 1 << 0;
+
+    /**
+     * Indicates scrolling along the vertical axis.
+     */
+    public static final int SCROLL_AXIS_VERTICAL = 1 << 1;
+
+    /** @hide */
+    @Retention(RetentionPolicy.SOURCE)
+    @IntDef(flag = true,
+            value = {
+                    SCROLL_INDICATOR_TOP,
+                    SCROLL_INDICATOR_BOTTOM,
+                    SCROLL_INDICATOR_LEFT,
+                    SCROLL_INDICATOR_RIGHT,
+                    SCROLL_INDICATOR_START,
+                    SCROLL_INDICATOR_END,
+            })
+    public @interface ScrollIndicators {}
+
+    /**
+     * Scroll indicator direction for the top edge of the view.
+     *
+     * @see #setScrollIndicators(View, int)
+     * @see #setScrollIndicators(View, int, int)
+     * @see #getScrollIndicators(View)
+     */
+    public static final int SCROLL_INDICATOR_TOP = 0x1;
+
+    /**
+     * Scroll indicator direction for the bottom edge of the view.
+     *
+     * @see #setScrollIndicators(View, int)
+     * @see #setScrollIndicators(View, int, int)
+     * @see #getScrollIndicators(View)
+     */
+    public static final int SCROLL_INDICATOR_BOTTOM = 0x2;
+
+    /**
+     * Scroll indicator direction for the left edge of the view.
+     *
+     * @see #setScrollIndicators(View, int)
+     * @see #setScrollIndicators(View, int, int)
+     * @see #getScrollIndicators(View)
+     */
+    public static final int SCROLL_INDICATOR_LEFT = 0x4;
+
+    /**
+     * Scroll indicator direction for the right edge of the view.
+     *
+     * @see #setScrollIndicators(View, int)
+     * @see #setScrollIndicators(View, int, int)
+     * @see #getScrollIndicators(View)
+     */
+    public static final int SCROLL_INDICATOR_RIGHT = 0x8;
+
+    /**
+     * Scroll indicator direction for the starting edge of the view.
+     *
+     * @see #setScrollIndicators(View, int)
+     * @see #setScrollIndicators(View, int, int)
+     * @see #getScrollIndicators(View)
+     */
+    public static final int SCROLL_INDICATOR_START = 0x10;
+
+    /**
+     * Scroll indicator direction for the ending edge of the view.
+     *
+     * @see #setScrollIndicators(View, int)
+     * @see #setScrollIndicators(View, int, int)
+     * @see #getScrollIndicators(View)
+     */
+    public static final int SCROLL_INDICATOR_END = 0x20;
+
+    interface ViewCompatImpl {
+        boolean canScrollHorizontally(View v, int direction);
+        boolean canScrollVertically(View v, int direction);
+        void onInitializeAccessibilityEvent(View v, AccessibilityEvent event);
+        void onPopulateAccessibilityEvent(View v, AccessibilityEvent event);
+        void onInitializeAccessibilityNodeInfo(View v, AccessibilityNodeInfoCompat info);
+        void setAccessibilityDelegate(View v, @Nullable AccessibilityDelegateCompat delegate);
+        boolean hasAccessibilityDelegate(View v);
+        boolean hasTransientState(View view);
+        void setHasTransientState(View view, boolean hasTransientState);
+        void postInvalidateOnAnimation(View view);
+        void postInvalidateOnAnimation(View view, int left, int top, int right, int bottom);
+        void postOnAnimation(View view, Runnable action);
+        void postOnAnimationDelayed(View view, Runnable action, long delayMillis);
+        int getImportantForAccessibility(View view);
+        void setImportantForAccessibility(View view, int mode);
+        boolean isImportantForAccessibility(View view);
+        boolean performAccessibilityAction(View view, int action, Bundle arguments);
+        AccessibilityNodeProviderCompat getAccessibilityNodeProvider(View view);
+        float getAlpha(View view);
+        void setLayerType(View view, int layerType, Paint paint);
+        int getLayerType(View view);
+        int getLabelFor(View view);
+        void setLabelFor(View view, int id);
+        void setLayerPaint(View view, Paint paint);
+        int getLayoutDirection(View view);
+        void setLayoutDirection(View view, int layoutDirection);
+        ViewParent getParentForAccessibility(View view);
+        int resolveSizeAndState(int size, int measureSpec, int childMeasuredState);
+        int getMeasuredWidthAndState(View view);
+        int getMeasuredHeightAndState(View view);
+        int getMeasuredState(View view);
+        int getAccessibilityLiveRegion(View view);
+        void setAccessibilityLiveRegion(View view, int mode);
+        int getPaddingStart(View view);
+        int getPaddingEnd(View view);
+        void setPaddingRelative(View view, int start, int top, int end, int bottom);
+        void dispatchStartTemporaryDetach(View view);
+        void dispatchFinishTemporaryDetach(View view);
+        float getX(View view);
+        float getY(View view);
+        float getRotation(View view);
+        float getRotationX(View view);
+        float getRotationY(View view);
+        float getScaleX(View view);
+        float getScaleY(View view);
+        float getTranslationX(View view);
+        float getTranslationY(View view);
+        @Nullable Matrix getMatrix(View view);
+        int getMinimumWidth(View view);
+        int getMinimumHeight(View view);
+        ViewPropertyAnimatorCompat animate(View view);
+        void setRotation(View view, float value);
+        void setRotationX(View view, float value);
+        void setRotationY(View view, float value);
+        void setScaleX(View view, float value);
+        void setScaleY(View view, float value);
+        void setTranslationX(View view, float value);
+        void setTranslationY(View view, float value);
+        void setX(View view, float value);
+        void setY(View view, float value);
+        void setAlpha(View view, float value);
+        void setPivotX(View view, float value);
+        void setPivotY(View view, float value);
+        float getPivotX(View view);
+        float getPivotY(View view);
+        void setElevation(View view, float elevation);
+        float getElevation(View view);
+        void setTranslationZ(View view, float translationZ);
+        float getTranslationZ(View view);
+        void setClipBounds(View view, Rect clipBounds);
+        Rect getClipBounds(View view);
+        void setTransitionName(View view, String transitionName);
+        String getTransitionName(View view);
+        int getWindowSystemUiVisibility(View view);
+        void requestApplyInsets(View view);
+        void setChildrenDrawingOrderEnabled(ViewGroup viewGroup, boolean enabled);
+        boolean getFitsSystemWindows(View view);
+        boolean hasOverlappingRendering(View view);
+        void setFitsSystemWindows(View view, boolean fitSystemWindows);
+        void jumpDrawablesToCurrentState(View v);
+        void setOnApplyWindowInsetsListener(View view, OnApplyWindowInsetsListener listener);
+        WindowInsetsCompat onApplyWindowInsets(View v, WindowInsetsCompat insets);
+        WindowInsetsCompat dispatchApplyWindowInsets(View v, WindowInsetsCompat insets);
+        void setSaveFromParentEnabled(View view, boolean enabled);
+        void setActivated(View view, boolean activated);
+        boolean isPaddingRelative(View view);
+        ColorStateList getBackgroundTintList(View view);
+        void setBackgroundTintList(View view, ColorStateList tintList);
+        PorterDuff.Mode getBackgroundTintMode(View view);
+        void setBackgroundTintMode(View view, PorterDuff.Mode mode);
+        void setNestedScrollingEnabled(View view, boolean enabled);
+        boolean isNestedScrollingEnabled(View view);
+        boolean startNestedScroll(View view, int axes);
+        void stopNestedScroll(View view);
+        boolean hasNestedScrollingParent(View view);
+        boolean dispatchNestedScroll(View view, int dxConsumed, int dyConsumed, int dxUnconsumed,
+                int dyUnconsumed, int[] offsetInWindow);
+        boolean dispatchNestedPreScroll(View view, int dx, int dy, int[] consumed,
+                int[] offsetInWindow);
+        boolean dispatchNestedFling(View view, float velocityX, float velocityY, boolean consumed);
+        boolean dispatchNestedPreFling(View view, float velocityX, float velocityY);
+        boolean isInLayout(View view);
+        boolean isLaidOut(View view);
+        boolean isLayoutDirectionResolved(View view);
+        int combineMeasuredStates(int curState, int newState);
+        float getZ(View view);
+        void setZ(View view, float z);
+        boolean isAttachedToWindow(View view);
+        boolean hasOnClickListeners(View view);
+        void setScrollIndicators(View view, int indicators);
+        void setScrollIndicators(View view, int indicators, int mask);
+        int getScrollIndicators(View view);
+        void offsetTopAndBottom(View view, int offset);
+        void offsetLeftAndRight(View view, int offset);
+        void setPointerIcon(View view, PointerIconCompat pointerIcon);
+    }
+
+    static class BaseViewCompatImpl implements ViewCompatImpl {
+        private Method mDispatchStartTemporaryDetach;
+        private Method mDispatchFinishTemporaryDetach;
+        private boolean mTempDetachBound;
+        WeakHashMap<View, ViewPropertyAnimatorCompat> mViewPropertyAnimatorCompatMap = null;
+        private static Method sChildrenDrawingOrderMethod;
+
+        @Override
+        public boolean canScrollHorizontally(View v, int direction) {
+            return (v instanceof ScrollingView) &&
+                canScrollingViewScrollHorizontally((ScrollingView) v, direction);
+        }
+        @Override
+        public boolean canScrollVertically(View v, int direction) {
+            return (v instanceof ScrollingView) &&
+                    canScrollingViewScrollVertically((ScrollingView) v, direction);
+        }
+
+        @Override
+        public void setAccessibilityDelegate(View v, AccessibilityDelegateCompat delegate) {
+            // Do nothing; API doesn't exist
+        }
+
+        @Override
+        public boolean hasAccessibilityDelegate(View v) {
+            return false;
+        }
+
+        @Override
+        public void onPopulateAccessibilityEvent(View v, AccessibilityEvent event) {
+            // Do nothing; API doesn't exist
+        }
+        @Override
+        public void onInitializeAccessibilityEvent(View v, AccessibilityEvent event) {
+         // Do nothing; API doesn't exist
+        }
+        @Override
+        public void onInitializeAccessibilityNodeInfo(View v, AccessibilityNodeInfoCompat info) {
+            // Do nothing; API doesn't exist
+        }
+        @Override
+        public boolean hasTransientState(View view) {
+            // A view can't have transient state if transient state wasn't supported.
+            return false;
+        }
+        @Override
+        public void setHasTransientState(View view, boolean hasTransientState) {
+            // Do nothing; API doesn't exist
+        }
+        @Override
+        public void postInvalidateOnAnimation(View view) {
+            view.invalidate();
+        }
+        @Override
+        public void postInvalidateOnAnimation(View view, int left, int top, int right, int bottom) {
+            view.invalidate(left, top, right, bottom);
+        }
+        @Override
+        public void postOnAnimation(View view, Runnable action) {
+            view.postDelayed(action, getFrameTime());
+        }
+        @Override
+        public void postOnAnimationDelayed(View view, Runnable action, long delayMillis) {
+            view.postDelayed(action, getFrameTime() + delayMillis);
+        }
+        long getFrameTime() {
+            return FAKE_FRAME_TIME;
+        }
+        @Override
+        public int getImportantForAccessibility(View view) {
+            return 0;
+        }
+        @Override
+        public void setImportantForAccessibility(View view, int mode) {
+
+        }
+        @Override
+        public boolean isImportantForAccessibility(View view) {
+            return true;
+        }
+        @Override
+        public boolean performAccessibilityAction(View view, int action, Bundle arguments) {
+            return false;
+        }
+        @Override
+        public AccessibilityNodeProviderCompat getAccessibilityNodeProvider(View view) {
+            return null;
+        }
+        @Override
+        public float getAlpha(View view) {
+            return 1.0f;
+        }
+        @Override
+        public void setLayerType(View view, int layerType, Paint paint) {
+            // No-op until layers became available (HC)
+        }
+        @Override
+        public int getLayerType(View view) {
+            return LAYER_TYPE_NONE;
+        }
+        @Override
+        public int getLabelFor(View view) {
+            return 0;
+        }
+        @Override
+        public void setLabelFor(View view, int id) {
+
+        }
+        @Override
+        public void setLayerPaint(View view, Paint p) {
+            // No-op until layers became available (HC)
+        }
+
+        @Override
+        public int getLayoutDirection(View view) {
+            return LAYOUT_DIRECTION_LTR;
+        }
+
+        @Override
+        public void setLayoutDirection(View view, int layoutDirection) {
+            // No-op
+        }
+
+        @Override
+        public ViewParent getParentForAccessibility(View view) {
+            return view.getParent();
+        }
+
+        @Override
+        public int resolveSizeAndState(int size, int measureSpec, int childMeasuredState) {
+            return View.resolveSize(size, measureSpec);
+        }
+
+        @Override
+        public int getMeasuredWidthAndState(View view) {
+            return view.getMeasuredWidth();
+        }
+
+        @Override
+        public int getMeasuredHeightAndState(View view) {
+            return view.getMeasuredHeight();
+        }
+
+        @Override
+        public int getMeasuredState(View view) {
+            return 0;
+        }
+
+        @Override
+        public int getAccessibilityLiveRegion(View view) {
+            return ACCESSIBILITY_LIVE_REGION_NONE;
+        }
+
+        @Override
+        public void setAccessibilityLiveRegion(View view, int mode) {
+            // No-op
+        }
+
+        @Override
+        public int getPaddingStart(View view) {
+            return view.getPaddingLeft();
+        }
+
+        @Override
+        public int getPaddingEnd(View view) {
+            return view.getPaddingRight();
+        }
+
+        @Override
+        public void setPaddingRelative(View view, int start, int top, int end, int bottom) {
+            view.setPadding(start, top, end, bottom);
+        }
+
+        @Override
+        public void dispatchStartTemporaryDetach(View view) {
+            if (!mTempDetachBound) {
+                bindTempDetach();
+            }
+            if (mDispatchStartTemporaryDetach != null) {
+                try {
+                    mDispatchStartTemporaryDetach.invoke(view);
+                } catch (Exception e) {
+                    Log.d(TAG, "Error calling dispatchStartTemporaryDetach", e);
+                }
+            } else {
+                // Try this instead
+                view.onStartTemporaryDetach();
+            }
+        }
+
+        @Override
+        public void dispatchFinishTemporaryDetach(View view) {
+            if (!mTempDetachBound) {
+                bindTempDetach();
+            }
+            if (mDispatchFinishTemporaryDetach != null) {
+                try {
+                    mDispatchFinishTemporaryDetach.invoke(view);
+                } catch (Exception e) {
+                    Log.d(TAG, "Error calling dispatchFinishTemporaryDetach", e);
+                }
+            } else {
+                // Try this instead
+                view.onFinishTemporaryDetach();
+            }
+        }
+
+        @Override
+        public boolean hasOverlappingRendering(View view) {
+            return true;
+        }
+
+        private void bindTempDetach() {
+            try {
+                mDispatchStartTemporaryDetach = View.class.getDeclaredMethod(
+                        "dispatchStartTemporaryDetach");
+                mDispatchFinishTemporaryDetach = View.class.getDeclaredMethod(
+                        "dispatchFinishTemporaryDetach");
+            } catch (NoSuchMethodException e) {
+                Log.e(TAG, "Couldn't find method", e);
+            }
+            mTempDetachBound = true;
+        }
+
+        @Override
+        public float getTranslationX(View view) {
+            return 0;
+        }
+
+        @Override
+        public float getTranslationY(View view) {
+            return 0;
+        }
+
+        @Override
+        public float getX(View view) {
+            return 0;
+        }
+
+        @Override
+        public float getY(View view) {
+            return 0;
+        }
+
+        @Override
+        public float getRotation(View view) {
+            return 0;
+        }
+
+        @Override
+        public float getRotationX(View view) {
+            return 0;
+        }
+
+        @Override
+        public float getRotationY(View view) {
+            return 0;
+        }
+
+        @Override
+        public float getScaleX(View view) {
+            return 0;
+        }
+
+        @Override
+        public float getScaleY(View view) {
+            return 0;
+        }
+
+        @Override
+        public Matrix getMatrix(View view) {
+            return null;
+        }
+
+        @Override
+        public int getMinimumWidth(View view) {
+            return ViewCompatBase.getMinimumWidth(view);
+        }
+
+        @Override
+        public int getMinimumHeight(View view) {
+            return ViewCompatBase.getMinimumHeight(view);
+        }
+
+        @Override
+        public ViewPropertyAnimatorCompat animate(View view) {
+            return new ViewPropertyAnimatorCompat(view);
+        }
+
+        @Override
+        public void setRotation(View view, float value) {
+            // noop
+        }
+
+        @Override
+        public void setTranslationX(View view, float value) {
+            // noop
+        }
+
+        @Override
+        public void setTranslationY(View view, float value) {
+            // noop
+        }
+
+        @Override
+        public void setAlpha(View view, float value) {
+            // noop
+        }
+
+        @Override
+        public void setRotationX(View view, float value) {
+            // noop
+        }
+
+        @Override
+        public void setRotationY(View view, float value) {
+            // noop
+        }
+
+        @Override
+        public void setScaleX(View view, float value) {
+            // noop
+        }
+
+        @Override
+        public void setScaleY(View view, float value) {
+            // noop
+        }
+
+        @Override
+        public void setX(View view, float value) {
+            // noop
+        }
+
+        @Override
+        public void setY(View view, float value) {
+            // noop
+        }
+
+        @Override
+        public void setPivotX(View view, float value) {
+            // noop
+        }
+
+        @Override
+        public void setPivotY(View view, float value) {
+            // noop
+        }
+
+        @Override
+        public float getPivotX(View view) {
+            return 0;
+        }
+
+        @Override
+        public float getPivotY(View view) {
+            return 0;
+        }
+
+        @Override
+        public void setTransitionName(View view, String transitionName) {
+        }
+
+        @Override
+        public String getTransitionName(View view) {
+            return null;
+        }
+
+        @Override
+        public int getWindowSystemUiVisibility(View view) {
+            return 0;
+        }
+
+        @Override
+        public void requestApplyInsets(View view) {
+        }
+
+        @Override
+        public void setElevation(View view, float elevation) {
+        }
+
+        @Override
+        public float getElevation(View view) {
+            return 0f;
+        }
+
+        @Override
+        public void setTranslationZ(View view, float translationZ) {
+        }
+
+        @Override
+        public float getTranslationZ(View view) {
+            return 0f;
+        }
+
+        @Override
+        public void setClipBounds(View view, Rect clipBounds) {
+        }
+
+        @Override
+        public Rect getClipBounds(View view) {
+            return null;
+        }
+
+        @Override
+        public void setChildrenDrawingOrderEnabled(ViewGroup viewGroup, boolean enabled) {
+            if (sChildrenDrawingOrderMethod == null) {
+                try {
+                    sChildrenDrawingOrderMethod = ViewGroup.class
+                            .getDeclaredMethod("setChildrenDrawingOrderEnabled", boolean.class);
+                } catch (NoSuchMethodException e) {
+                    Log.e(TAG, "Unable to find childrenDrawingOrderEnabled", e);
+                }
+                sChildrenDrawingOrderMethod.setAccessible(true);
+            }
+            try {
+                sChildrenDrawingOrderMethod.invoke(viewGroup, enabled);
+            } catch (IllegalAccessException e) {
+                Log.e(TAG, "Unable to invoke childrenDrawingOrderEnabled", e);
+            } catch (IllegalArgumentException e) {
+                Log.e(TAG, "Unable to invoke childrenDrawingOrderEnabled", e);
+            } catch (InvocationTargetException e) {
+                Log.e(TAG, "Unable to invoke childrenDrawingOrderEnabled", e);
+            }
+        }
+
+        @Override
+        public boolean getFitsSystemWindows(View view) {
+            return false;
+        }
+
+        @Override
+        public void setFitsSystemWindows(View view, boolean fitSystemWindows) {
+            // noop
+        }
+
+        @Override
+        public void jumpDrawablesToCurrentState(View view) {
+            // Do nothing; API didn't exist.
+        }
+
+        @Override
+        public void setOnApplyWindowInsetsListener(View view,
+                OnApplyWindowInsetsListener listener) {
+            // noop
+        }
+
+        @Override
+        public WindowInsetsCompat onApplyWindowInsets(View v, WindowInsetsCompat insets) {
+            return insets;
+        }
+
+        @Override
+        public WindowInsetsCompat dispatchApplyWindowInsets(View v, WindowInsetsCompat insets) {
+            return insets;
+        }
+
+        @Override
+        public void setSaveFromParentEnabled(View v, boolean enabled) {
+            // noop
+        }
+
+        @Override
+        public void setActivated(View view, boolean activated) {
+            // noop
+        }
+
+        @Override
+        public boolean isPaddingRelative(View view) {
+            return false;
+        }
+
+        @Override
+        public void setNestedScrollingEnabled(View view, boolean enabled) {
+            if (view instanceof NestedScrollingChild) {
+                ((NestedScrollingChild) view).setNestedScrollingEnabled(enabled);
+            }
+        }
+
+        @Override
+        public boolean isNestedScrollingEnabled(View view) {
+            if (view instanceof NestedScrollingChild) {
+                return ((NestedScrollingChild) view).isNestedScrollingEnabled();
+            }
+            return false;
+        }
+
+        @Override
+        public ColorStateList getBackgroundTintList(View view) {
+            return ViewCompatBase.getBackgroundTintList(view);
+        }
+
+        @Override
+        public void setBackgroundTintList(View view, ColorStateList tintList) {
+            ViewCompatBase.setBackgroundTintList(view, tintList);
+        }
+
+        @Override
+        public void setBackgroundTintMode(View view, PorterDuff.Mode mode) {
+            ViewCompatBase.setBackgroundTintMode(view, mode);
+        }
+
+        @Override
+        public PorterDuff.Mode getBackgroundTintMode(View view) {
+            return ViewCompatBase.getBackgroundTintMode(view);
+        }
+
+        private boolean canScrollingViewScrollHorizontally(ScrollingView view, int direction) {
+            final int offset = view.computeHorizontalScrollOffset();
+            final int range = view.computeHorizontalScrollRange() -
+                    view.computeHorizontalScrollExtent();
+            if (range == 0) return false;
+            if (direction < 0) {
+                return offset > 0;
+            } else {
+                return offset < range - 1;
+            }
+        }
+
+        private boolean canScrollingViewScrollVertically(ScrollingView view, int direction) {
+            final int offset = view.computeVerticalScrollOffset();
+            final int range = view.computeVerticalScrollRange() -
+                    view.computeVerticalScrollExtent();
+            if (range == 0) return false;
+            if (direction < 0) {
+                return offset > 0;
+            } else {
+                return offset < range - 1;
+            }
+        }
+
+        @Override
+        public boolean startNestedScroll(View view, int axes) {
+            if (view instanceof NestedScrollingChild) {
+                return ((NestedScrollingChild) view).startNestedScroll(axes);
+            }
+            return false;
+        }
+
+        @Override
+        public void stopNestedScroll(View view) {
+            if (view instanceof NestedScrollingChild) {
+                ((NestedScrollingChild) view).stopNestedScroll();
+            }
+        }
+
+        @Override
+        public boolean hasNestedScrollingParent(View view) {
+            if (view instanceof NestedScrollingChild) {
+                return ((NestedScrollingChild) view).hasNestedScrollingParent();
+            }
+            return false;
+        }
+
+        @Override
+        public boolean dispatchNestedScroll(View view, int dxConsumed, int dyConsumed,
+                int dxUnconsumed, int dyUnconsumed, int[] offsetInWindow) {
+            if (view instanceof NestedScrollingChild) {
+                return ((NestedScrollingChild) view).dispatchNestedScroll(dxConsumed, dyConsumed,
+                        dxUnconsumed, dyUnconsumed, offsetInWindow);
+            }
+            return false;
+        }
+
+        @Override
+        public boolean dispatchNestedPreScroll(View view, int dx, int dy,
+                int[] consumed, int[] offsetInWindow) {
+            if (view instanceof NestedScrollingChild) {
+                return ((NestedScrollingChild) view).dispatchNestedPreScroll(dx, dy, consumed,
+                        offsetInWindow);
+            }
+            return false;
+        }
+
+        @Override
+        public boolean dispatchNestedFling(View view, float velocityX, float velocityY,
+                boolean consumed) {
+            if (view instanceof NestedScrollingChild) {
+                return ((NestedScrollingChild) view).dispatchNestedFling(velocityX, velocityY,
+                        consumed);
+            }
+            return false;
+        }
+
+        @Override
+        public boolean dispatchNestedPreFling(View view, float velocityX, float velocityY) {
+            if (view instanceof NestedScrollingChild) {
+                return ((NestedScrollingChild) view).dispatchNestedPreFling(velocityX, velocityY);
+            }
+            return false;
+        }
+
+        @Override
+        public boolean isInLayout(View view) {
+            return false;
+        }
+
+        @Override
+        public boolean isLaidOut(View view) {
+            return ViewCompatBase.isLaidOut(view);
+        }
+
+        @Override
+        public boolean isLayoutDirectionResolved(View view) {
+            return false;
+        }
+
+        @Override
+        public int combineMeasuredStates(int curState, int newState) {
+            return curState | newState;
+        }
+
+        @Override
+        public float getZ(View view) {
+            return getTranslationZ(view) + getElevation(view);
+        }
+
+        @Override
+        public void setZ(View view, float z) {
+            // no-op
+        }
+
+        @Override
+        public boolean isAttachedToWindow(View view) {
+            return ViewCompatBase.isAttachedToWindow(view);
+        }
+
+        @Override
+        public boolean hasOnClickListeners(View view) {
+            return false;
+        }
+
+        @Override
+        public int getScrollIndicators(View view) {
+            return 0;
+        }
+
+        @Override
+        public void setScrollIndicators(View view, int indicators) {
+            // no-op
+        }
+
+        @Override
+        public void setScrollIndicators(View view, int indicators, int mask) {
+            // no-op
+        }
+
+        @Override
+        public void offsetLeftAndRight(View view, int offset) {
+            ViewCompatBase.offsetLeftAndRight(view, offset);
+        }
+
+        @Override
+        public void offsetTopAndBottom(View view, int offset) {
+            ViewCompatBase.offsetTopAndBottom(view, offset);
+        }
+
+        @Override
+        public void setPointerIcon(View view, PointerIconCompat pointerIcon) {
+            // no-op
+        }
+    }
+
+    static class HCViewCompatImpl extends BaseViewCompatImpl {
+        @Override
+        long getFrameTime() {
+            return ViewCompatHC.getFrameTime();
+        }
+        @Override
+        public float getAlpha(View view) {
+            return ViewCompatHC.getAlpha(view);
+        }
+        @Override
+        public void setLayerType(View view, int layerType, Paint paint) {
+            ViewCompatHC.setLayerType(view, layerType, paint);
+        }
+        @Override
+        public int getLayerType(View view)  {
+            return ViewCompatHC.getLayerType(view);
+        }
+        @Override
+        public void setLayerPaint(View view, Paint paint) {
+            // Make sure the paint is correct; this will be cheap if it's the same
+            // instance as was used to call setLayerType earlier.
+            setLayerType(view, getLayerType(view), paint);
+            // This is expensive, but the only way to accomplish this before JB-MR1.
+            view.invalidate();
+        }
+        @Override
+        public int resolveSizeAndState(int size, int measureSpec, int childMeasuredState) {
+            return ViewCompatHC.resolveSizeAndState(size, measureSpec, childMeasuredState);
+        }
+        @Override
+        public int getMeasuredWidthAndState(View view) {
+            return ViewCompatHC.getMeasuredWidthAndState(view);
+        }
+        @Override
+        public int getMeasuredHeightAndState(View view) {
+            return ViewCompatHC.getMeasuredHeightAndState(view);
+        }
+        @Override
+        public int getMeasuredState(View view) {
+            return ViewCompatHC.getMeasuredState(view);
+        }
+        @Override
+        public float getTranslationX(View view) {
+            return ViewCompatHC.getTranslationX(view);
+        }
+        @Override
+        public float getTranslationY(View view) {
+            return ViewCompatHC.getTranslationY(view);
+        }
+
+        @Override
+        public Matrix getMatrix(View view) {
+            return ViewCompatHC.getMatrix(view);
+        }
+
+        @Override
+        public void setTranslationX(View view, float value) {
+            ViewCompatHC.setTranslationX(view, value);
+        }
+        @Override
+        public void setTranslationY(View view, float value) {
+            ViewCompatHC.setTranslationY(view, value);
+        }
+        @Override
+        public void setAlpha(View view, float value) {
+            ViewCompatHC.setAlpha(view, value);
+        }
+        @Override
+        public void setX(View view, float value) {
+            ViewCompatHC.setX(view, value);
+        }
+        @Override
+        public void setY(View view, float value) {
+            ViewCompatHC.setY(view, value);
+        }
+        @Override
+        public void setRotation(View view, float value) {
+            ViewCompatHC.setRotation(view, value);
+        }
+        @Override
+        public void setRotationX(View view, float value) {
+            ViewCompatHC.setRotationX(view, value);
+        }
+        @Override
+        public void setRotationY(View view, float value) {
+            ViewCompatHC.setRotationY(view, value);
+        }
+        @Override
+        public void setScaleX(View view, float value) {
+            ViewCompatHC.setScaleX(view, value);
+        }
+        @Override
+        public void setScaleY(View view, float value) {
+            ViewCompatHC.setScaleY(view, value);
+        }
+        @Override
+        public void setPivotX(View view, float value) {
+            ViewCompatHC.setPivotX(view, value);
+        }
+        @Override
+        public void setPivotY(View view, float value) {
+            ViewCompatHC.setPivotY(view, value);
+        }
+        @Override
+        public float getX(View view) {
+            return ViewCompatHC.getX(view);
+        }
+
+        @Override
+        public float getY(View view) {
+            return ViewCompatHC.getY(view);
+        }
+
+        @Override
+        public float getRotation(View view) {
+            return ViewCompatHC.getRotation(view);
+        }
+
+        @Override
+        public float getRotationX(View view) {
+            return ViewCompatHC.getRotationX(view);
+        }
+
+        @Override
+        public float getRotationY(View view) {
+            return ViewCompatHC.getRotationY(view);
+        }
+
+        @Override
+        public float getScaleX(View view) {
+            return ViewCompatHC.getScaleX(view);
+        }
+
+        @Override
+        public float getScaleY(View view) {
+            return ViewCompatHC.getScaleY(view);
+        }
+
+        @Override
+        public float getPivotX(View view) {
+            return ViewCompatHC.getPivotX(view);
+        }
+        @Override
+        public float getPivotY(View view) {
+            return ViewCompatHC.getPivotY(view);
+        }
+        @Override
+        public void jumpDrawablesToCurrentState(View view) {
+            ViewCompatHC.jumpDrawablesToCurrentState(view);
+        }
+
+        @Override
+        public void setSaveFromParentEnabled(View view, boolean enabled) {
+            ViewCompatHC.setSaveFromParentEnabled(view, enabled);
+        }
+
+        @Override
+        public void setActivated(View view, boolean activated) {
+            ViewCompatHC.setActivated(view, activated);
+        }
+
+        @Override
+        public int combineMeasuredStates(int curState, int newState) {
+            return ViewCompatHC.combineMeasuredStates(curState, newState);
+        }
+
+        @Override
+        public void offsetLeftAndRight(View view, int offset) {
+            ViewCompatHC.offsetLeftAndRight(view, offset);
+        }
+
+        @Override
+        public void offsetTopAndBottom(View view, int offset) {
+            ViewCompatHC.offsetTopAndBottom(view, offset);
+        }
+    }
+
+    static class ICSViewCompatImpl extends HCViewCompatImpl {
+        static Field mAccessibilityDelegateField;
+        static boolean accessibilityDelegateCheckFailed = false;
+        @Override
+        public boolean canScrollHorizontally(View v, int direction) {
+            return ViewCompatICS.canScrollHorizontally(v, direction);
+        }
+        @Override
+        public boolean canScrollVertically(View v, int direction) {
+            return ViewCompatICS.canScrollVertically(v, direction);
+        }
+        @Override
+        public void onPopulateAccessibilityEvent(View v, AccessibilityEvent event) {
+            ViewCompatICS.onPopulateAccessibilityEvent(v, event);
+        }
+        @Override
+        public void onInitializeAccessibilityEvent(View v, AccessibilityEvent event) {
+            ViewCompatICS.onInitializeAccessibilityEvent(v, event);
+        }
+        @Override
+        public void onInitializeAccessibilityNodeInfo(View v, AccessibilityNodeInfoCompat info) {
+            ViewCompatICS.onInitializeAccessibilityNodeInfo(v, info.getInfo());
+        }
+        @Override
+        public void setAccessibilityDelegate(View v,
+                @Nullable AccessibilityDelegateCompat delegate) {
+            ViewCompatICS.setAccessibilityDelegate(v,
+                    delegate == null ? null : delegate.getBridge());
+        }
+
+        @Override
+        public boolean hasAccessibilityDelegate(View v) {
+            if (accessibilityDelegateCheckFailed) {
+                return false; // View implementation might have changed.
+            }
+            if (mAccessibilityDelegateField == null) {
+                try {
+                    mAccessibilityDelegateField = View.class
+                            .getDeclaredField("mAccessibilityDelegate");
+                    mAccessibilityDelegateField.setAccessible(true);
+                } catch (Throwable t) {
+                    accessibilityDelegateCheckFailed = true;
+                    return false;
+                }
+            }
+            try {
+                return mAccessibilityDelegateField.get(v) != null;
+            } catch (Throwable t) {
+                accessibilityDelegateCheckFailed = true;
+                return false;
+            }
+        }
+
+        @Override
+        public ViewPropertyAnimatorCompat animate(View view) {
+            if (mViewPropertyAnimatorCompatMap == null) {
+                mViewPropertyAnimatorCompatMap = new WeakHashMap<>();
+            }
+            ViewPropertyAnimatorCompat vpa = mViewPropertyAnimatorCompatMap.get(view);
+            if (vpa == null) {
+                vpa = new ViewPropertyAnimatorCompat(view);
+                mViewPropertyAnimatorCompatMap.put(view, vpa);
+            }
+            return vpa;
+        }
+
+        @Override
+        public void setFitsSystemWindows(View view, boolean fitSystemWindows) {
+            ViewCompatICS.setFitsSystemWindows(view, fitSystemWindows);
+        }
+    }
+
+    static class ICSMr1ViewCompatImpl extends ICSViewCompatImpl {
+        @Override
+        public boolean hasOnClickListeners(View view) {
+            return ViewCompatICSMr1.hasOnClickListeners(view);
+        }
+    }
+
+    static class JBViewCompatImpl extends ICSMr1ViewCompatImpl {
+        @Override
+        public boolean hasTransientState(View view) {
+            return ViewCompatJB.hasTransientState(view);
+        }
+        @Override
+        public void setHasTransientState(View view, boolean hasTransientState) {
+            ViewCompatJB.setHasTransientState(view, hasTransientState);
+        }
+        @Override
+        public void postInvalidateOnAnimation(View view) {
+            ViewCompatJB.postInvalidateOnAnimation(view);
+        }
+        @Override
+        public void postInvalidateOnAnimation(View view, int left, int top, int right, int bottom) {
+            ViewCompatJB.postInvalidateOnAnimation(view, left, top, right, bottom);
+        }
+        @Override
+        public void postOnAnimation(View view, Runnable action) {
+            ViewCompatJB.postOnAnimation(view, action);
+        }
+        @Override
+        public void postOnAnimationDelayed(View view, Runnable action, long delayMillis) {
+            ViewCompatJB.postOnAnimationDelayed(view, action, delayMillis);
+        }
+        @Override
+        public int getImportantForAccessibility(View view) {
+            return ViewCompatJB.getImportantForAccessibility(view);
+        }
+        @Override
+        public void setImportantForAccessibility(View view, int mode) {
+            // IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS is not available
+            // on this platform so replace with IMPORTANT_FOR_ACCESSIBILITY_NO
+            // which is closer semantically.
+            if (mode == IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS) {
+                mode = IMPORTANT_FOR_ACCESSIBILITY_NO;
+            }
+            ViewCompatJB.setImportantForAccessibility(view, mode);
+        }
+        @Override
+        public boolean performAccessibilityAction(View view, int action, Bundle arguments) {
+            return ViewCompatJB.performAccessibilityAction(view, action, arguments);
+        }
+        @Override
+        public AccessibilityNodeProviderCompat getAccessibilityNodeProvider(View view) {
+            Object compat = ViewCompatJB.getAccessibilityNodeProvider(view);
+            if (compat != null) {
+                return new AccessibilityNodeProviderCompat(compat);
+            }
+            return null;
+        }
+
+        @Override
+        public ViewParent getParentForAccessibility(View view) {
+            return ViewCompatJB.getParentForAccessibility(view);
+        }
+
+        @Override
+        public int getMinimumWidth(View view) {
+            return ViewCompatJB.getMinimumWidth(view);
+        }
+
+        @Override
+        public int getMinimumHeight(View view) {
+            return ViewCompatJB.getMinimumHeight(view);
+        }
+
+        @Override
+        public void requestApplyInsets(View view) {
+            ViewCompatJB.requestApplyInsets(view);
+        }
+
+        @Override
+        public boolean getFitsSystemWindows(View view) {
+            return ViewCompatJB.getFitsSystemWindows(view);
+        }
+
+        @Override
+        public boolean hasOverlappingRendering(View view) {
+            return ViewCompatJB.hasOverlappingRendering(view);
+        }
+    }
+
+    static class JbMr1ViewCompatImpl extends JBViewCompatImpl {
+
+        @Override
+        public int getLabelFor(View view) {
+            return ViewCompatJellybeanMr1.getLabelFor(view);
+        }
+
+        @Override
+        public void setLabelFor(View view, int id) {
+            ViewCompatJellybeanMr1.setLabelFor(view, id);
+        }
+
+        @Override
+        public void setLayerPaint(View view, Paint paint) {
+            ViewCompatJellybeanMr1.setLayerPaint(view, paint);
+        }
+
+        @Override
+        public int getLayoutDirection(View view) {
+            return ViewCompatJellybeanMr1.getLayoutDirection(view);
+        }
+
+        @Override
+        public void setLayoutDirection(View view, int layoutDirection) {
+            ViewCompatJellybeanMr1.setLayoutDirection(view, layoutDirection);
+        }
+
+        @Override
+        public int getPaddingStart(View view) {
+            return ViewCompatJellybeanMr1.getPaddingStart(view);
+        }
+
+        @Override
+        public int getPaddingEnd(View view) {
+            return ViewCompatJellybeanMr1.getPaddingEnd(view);
+        }
+
+        @Override
+        public void setPaddingRelative(View view, int start, int top, int end, int bottom) {
+            ViewCompatJellybeanMr1.setPaddingRelative(view, start, top, end, bottom);
+        }
+
+        @Override
+        public int getWindowSystemUiVisibility(View view) {
+            return ViewCompatJellybeanMr1.getWindowSystemUiVisibility(view);
+        }
+
+        @Override
+        public boolean isPaddingRelative(View view) {
+            return ViewCompatJellybeanMr1.isPaddingRelative(view);
+        }
+    }
+
+    static class JbMr2ViewCompatImpl extends JbMr1ViewCompatImpl {
+        @Override
+        public void setClipBounds(View view, Rect clipBounds) {
+            ViewCompatJellybeanMr2.setClipBounds(view, clipBounds);
+        }
+
+        @Override
+        public Rect getClipBounds(View view) {
+            return ViewCompatJellybeanMr2.getClipBounds(view);
+        }
+
+        @Override
+        public boolean isInLayout(View view) {
+            return ViewCompatJellybeanMr2.isInLayout(view);
+        }
+    }
+
+    static class KitKatViewCompatImpl extends JbMr2ViewCompatImpl {
+        @Override
+        public int getAccessibilityLiveRegion(View view) {
+            return ViewCompatKitKat.getAccessibilityLiveRegion(view);
+        }
+
+        @Override
+        public void setAccessibilityLiveRegion(View view, int mode) {
+            ViewCompatKitKat.setAccessibilityLiveRegion(view, mode);
+        }
+
+        @Override
+        public void setImportantForAccessibility(View view, int mode) {
+            ViewCompatJB.setImportantForAccessibility(view, mode);
+        }
+
+        @Override
+        public boolean isLaidOut(View view) {
+            return ViewCompatKitKat.isLaidOut(view);
+        }
+
+        @Override
+        public boolean isLayoutDirectionResolved(View view) {
+            return ViewCompatKitKat.isLayoutDirectionResolved(view);
+        }
+
+        @Override
+        public boolean isAttachedToWindow(View view) {
+            return ViewCompatKitKat.isAttachedToWindow(view);
+        }
+    }
+
+    static class LollipopViewCompatImpl extends KitKatViewCompatImpl {
+        @Override
+        public void setTransitionName(View view, String transitionName) {
+            ViewCompatLollipop.setTransitionName(view, transitionName);
+        }
+
+        @Override
+        public String getTransitionName(View view) {
+            return ViewCompatLollipop.getTransitionName(view);
+        }
+
+        @Override
+        public void requestApplyInsets(View view) {
+            ViewCompatLollipop.requestApplyInsets(view);
+        }
+
+        @Override
+        public void setElevation(View view, float elevation) {
+            ViewCompatLollipop.setElevation(view, elevation);
+        }
+
+        @Override
+        public float getElevation(View view) {
+            return ViewCompatLollipop.getElevation(view);
+        }
+
+        @Override
+        public void setTranslationZ(View view, float translationZ) {
+            ViewCompatLollipop.setTranslationZ(view, translationZ);
+        }
+
+        @Override
+        public float getTranslationZ(View view) {
+            return ViewCompatLollipop.getTranslationZ(view);
+        }
+
+        @Override
+        public void setOnApplyWindowInsetsListener(View view,
+                final OnApplyWindowInsetsListener listener) {
+            ViewCompatLollipop.OnApplyWindowInsetsListenerBridge bridge =
+                    new ViewCompatLollipop.OnApplyWindowInsetsListenerBridge() {
+                        @Override
+                        public Object onApplyWindowInsets(View v, Object insets) {
+                            WindowInsetsCompat compatInsets = WindowInsetsCompat.wrap(insets);
+                            compatInsets = listener.onApplyWindowInsets(v, compatInsets);
+                            return WindowInsetsCompat.unwrap(compatInsets);
+                        }
+                    };
+            ViewCompatLollipop.setOnApplyWindowInsetsListener(view, bridge);
+        }
+
+        @Override
+        public void setNestedScrollingEnabled(View view, boolean enabled) {
+            ViewCompatLollipop.setNestedScrollingEnabled(view, enabled);
+        }
+
+        @Override
+        public boolean isNestedScrollingEnabled(View view) {
+            return ViewCompatLollipop.isNestedScrollingEnabled(view);
+        }
+
+        @Override
+        public boolean startNestedScroll(View view, int axes) {
+            return ViewCompatLollipop.startNestedScroll(view, axes);
+        }
+
+        @Override
+        public void stopNestedScroll(View view) {
+            ViewCompatLollipop.stopNestedScroll(view);
+        }
+
+        @Override
+        public boolean hasNestedScrollingParent(View view) {
+            return ViewCompatLollipop.hasNestedScrollingParent(view);
+        }
+
+        @Override
+        public boolean dispatchNestedScroll(View view, int dxConsumed, int dyConsumed,
+                int dxUnconsumed, int dyUnconsumed, int[] offsetInWindow) {
+            return ViewCompatLollipop.dispatchNestedScroll(view, dxConsumed, dyConsumed,
+                    dxUnconsumed, dyUnconsumed, offsetInWindow);
+        }
+
+        @Override
+        public boolean dispatchNestedPreScroll(View view, int dx, int dy,
+                int[] consumed, int[] offsetInWindow) {
+            return ViewCompatLollipop.dispatchNestedPreScroll(view, dx, dy, consumed,
+                    offsetInWindow);
+        }
+
+        @Override
+        public boolean dispatchNestedFling(View view, float velocityX, float velocityY,
+                boolean consumed) {
+            return ViewCompatLollipop.dispatchNestedFling(view, velocityX, velocityY, consumed);
+        }
+
+        @Override
+        public boolean dispatchNestedPreFling(View view, float velocityX, float velocityY) {
+            return ViewCompatLollipop.dispatchNestedPreFling(view, velocityX, velocityY);
+        }
+
+        @Override
+        public boolean isImportantForAccessibility(View view) {
+            return ViewCompatLollipop.isImportantForAccessibility(view);
+        }
+
+        @Override
+        public ColorStateList getBackgroundTintList(View view) {
+            return ViewCompatLollipop.getBackgroundTintList(view);
+        }
+
+        @Override
+        public void setBackgroundTintList(View view, ColorStateList tintList) {
+            ViewCompatLollipop.setBackgroundTintList(view, tintList);
+        }
+
+        @Override
+        public void setBackgroundTintMode(View view, PorterDuff.Mode mode) {
+            ViewCompatLollipop.setBackgroundTintMode(view, mode);
+        }
+
+        @Override
+        public PorterDuff.Mode getBackgroundTintMode(View view) {
+            return ViewCompatLollipop.getBackgroundTintMode(view);
+        }
+
+        @Override
+        public WindowInsetsCompat onApplyWindowInsets(View v, WindowInsetsCompat insets) {
+            return WindowInsetsCompat.wrap(
+                    ViewCompatLollipop.onApplyWindowInsets(v, WindowInsetsCompat.unwrap(insets)));
+        }
+
+        @Override
+        public WindowInsetsCompat dispatchApplyWindowInsets(View v, WindowInsetsCompat insets) {
+            return WindowInsetsCompat.wrap(
+                    ViewCompatLollipop.dispatchApplyWindowInsets(
+                            v, WindowInsetsCompat.unwrap(insets)));
+        }
+
+        @Override
+        public float getZ(View view) {
+            return ViewCompatLollipop.getZ(view);
+        }
+
+        @Override
+        public void setZ(View view, float z) {
+            ViewCompatLollipop.setZ(view, z);
+        }
+
+        @Override
+        public void offsetLeftAndRight(View view, int offset) {
+            ViewCompatLollipop.offsetLeftAndRight(view, offset);
+        }
+
+        @Override
+        public void offsetTopAndBottom(View view, int offset) {
+            ViewCompatLollipop.offsetTopAndBottom(view, offset);
+        }
+    }
+
+    static class MarshmallowViewCompatImpl extends LollipopViewCompatImpl {
+        @Override
+        public void setScrollIndicators(View view, int indicators) {
+            ViewCompatMarshmallow.setScrollIndicators(view, indicators);
+        }
+
+        @Override
+        public void setScrollIndicators(View view, int indicators, int mask) {
+            ViewCompatMarshmallow.setScrollIndicators(view, indicators, mask);
+        }
+
+        @Override
+        public int getScrollIndicators(View view) {
+            return ViewCompatMarshmallow.getScrollIndicators(view);
+        }
+
+
+        @Override
+        public void offsetLeftAndRight(View view, int offset) {
+            ViewCompatMarshmallow.offsetLeftAndRight(view, offset);
+        }
+
+        @Override
+        public void offsetTopAndBottom(View view, int offset) {
+            ViewCompatMarshmallow.offsetTopAndBottom(view, offset);
+        }
+    }
+
+    static class Api24ViewCompatImpl extends MarshmallowViewCompatImpl {
+        @Override
+        public void setPointerIcon(View view, PointerIconCompat pointerIconCompat) {
+            ViewCompatApi24.setPointerIcon(view, pointerIconCompat.getPointerIcon());
+        }
+    }
+
+    static final ViewCompatImpl IMPL;
+    static {
+        final int version = android.os.Build.VERSION.SDK_INT;
+        if (BuildCompat.isAtLeastN()) {
+            IMPL = new Api24ViewCompatImpl();
+        } else if (version >= 23) {
+            IMPL = new MarshmallowViewCompatImpl();
+        } else if (version >= 21) {
+            IMPL = new LollipopViewCompatImpl();
+        } else if (version >= 19) {
+            IMPL = new KitKatViewCompatImpl();
+        } else if (version >= 18) {
+            IMPL = new JbMr2ViewCompatImpl();
+        } else if (version >= 17) {
+            IMPL = new JbMr1ViewCompatImpl();
+        } else if (version >= 16) {
+            IMPL = new JBViewCompatImpl();
+        } else if (version >= 15) {
+            IMPL = new ICSMr1ViewCompatImpl();
+        } else if (version >= 14) {
+            IMPL = new ICSViewCompatImpl();
+        } else if (version >= 11) {
+            IMPL = new HCViewCompatImpl();
+        } else {
+            IMPL = new BaseViewCompatImpl();
+        }
+    }
+
+    /**
+     * Check if this view can be scrolled horizontally in a certain direction.
+     *
+     * @param v The View against which to invoke the method.
+     * @param direction Negative to check scrolling left, positive to check scrolling right.
+     * @return true if this view can be scrolled in the specified direction, false otherwise.
+     */
+    public static boolean canScrollHorizontally(View v, int direction) {
+        return IMPL.canScrollHorizontally(v, direction);
+    }
+
+    /**
+     * Check if this view can be scrolled vertically in a certain direction.
+     *
+     * @param v The View against which to invoke the method.
+     * @param direction Negative to check scrolling up, positive to check scrolling down.
+     * @return true if this view can be scrolled in the specified direction, false otherwise.
+     */
+    public static boolean canScrollVertically(View v, int direction) {
+        return IMPL.canScrollVertically(v, direction);
+    }
+
+    /**
+     * Returns the over-scroll mode for this view. The result will be
+     * one of {@link #OVER_SCROLL_ALWAYS} (default), {@link #OVER_SCROLL_IF_CONTENT_SCROLLS}
+     * (allow over-scrolling only if the view content is larger than the container),
+     * or {@link #OVER_SCROLL_NEVER}.
+     *
+     * @param v The View against which to invoke the method.
+     * @return This view's over-scroll mode.
+     * @deprecated Call {@link View#getOverScrollMode()} directly.
+     */
+    @Deprecated
+    @OverScroll
+    public static int getOverScrollMode(View v) {
+        //noinspection ResourceType
+        return v.getOverScrollMode();
+    }
+
+    /**
+     * Set the over-scroll mode for this view. Valid over-scroll modes are
+     * {@link #OVER_SCROLL_ALWAYS} (default), {@link #OVER_SCROLL_IF_CONTENT_SCROLLS}
+     * (allow over-scrolling only if the view content is larger than the container),
+     * or {@link #OVER_SCROLL_NEVER}.
+     *
+     * Setting the over-scroll mode of a view will have an effect only if the
+     * view is capable of scrolling.
+     *
+     * @param v The View against which to invoke the method.
+     * @param overScrollMode The new over-scroll mode for this view.
+     * @deprecated Call {@link View#setOverScrollMode(int)} directly.
+     */
+    @Deprecated
+    public static void setOverScrollMode(View v, @OverScroll int overScrollMode) {
+        v.setOverScrollMode(overScrollMode);
+    }
+
+    /**
+     * Called from {@link View#dispatchPopulateAccessibilityEvent(AccessibilityEvent)}
+     * giving a chance to this View to populate the accessibility event with its
+     * text content. While this method is free to modify event
+     * attributes other than text content, doing so should normally be performed in
+     * {@link View#onInitializeAccessibilityEvent(AccessibilityEvent)}.
+     * <p>
+     * Example: Adding formatted date string to an accessibility event in addition
+     *          to the text added by the super implementation:
+     * <pre> public void onPopulateAccessibilityEvent(AccessibilityEvent event) {
+     *     super.onPopulateAccessibilityEvent(event);
+     *     final int flags = DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_SHOW_WEEKDAY;
+     *     String selectedDateUtterance = DateUtils.formatDateTime(mContext,
+     *         mCurrentDate.getTimeInMillis(), flags);
+     *     event.getText().add(selectedDateUtterance);
+     * }</pre>
+     * <p>
+     * If an {@link AccessibilityDelegateCompat} has been specified via calling
+     * {@link ViewCompat#setAccessibilityDelegate(View, AccessibilityDelegateCompat)} its
+     * {@link AccessibilityDelegateCompat#onPopulateAccessibilityEvent(View, AccessibilityEvent)}
+     * is responsible for handling this call.
+     * </p>
+     * <p class="note"><strong>Note:</strong> Always call the super implementation before adding
+     * information to the event, in case the default implementation has basic information to add.
+     * </p>
+     *
+     * @param v The View against which to invoke the method.
+     * @param event The accessibility event which to populate.
+     *
+     * @see View#sendAccessibilityEvent(int)
+     * @see View#dispatchPopulateAccessibilityEvent(AccessibilityEvent)
+     */
+    public static void onPopulateAccessibilityEvent(View v, AccessibilityEvent event) {
+        IMPL.onPopulateAccessibilityEvent(v, event);
+    }
+
+    /**
+     * Initializes an {@link AccessibilityEvent} with information about
+     * this View which is the event source. In other words, the source of
+     * an accessibility event is the view whose state change triggered firing
+     * the event.
+     * <p>
+     * Example: Setting the password property of an event in addition
+     *          to properties set by the super implementation:
+     * <pre> public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
+     *     super.onInitializeAccessibilityEvent(event);
+     *     event.setPassword(true);
+     * }</pre>
+     * <p>
+     * If an {@link AccessibilityDelegateCompat} has been specified via calling
+     * {@link ViewCompat#setAccessibilityDelegate(View, AccessibilityDelegateCompat)}, its
+     * {@link AccessibilityDelegateCompat#onInitializeAccessibilityEvent(View, AccessibilityEvent)}
+     * is responsible for handling this call.
+     *
+     * @param v The View against which to invoke the method.
+     * @param event The event to initialize.
+     *
+     * @see View#sendAccessibilityEvent(int)
+     * @see View#dispatchPopulateAccessibilityEvent(AccessibilityEvent)
+     */
+    public static void onInitializeAccessibilityEvent(View v, AccessibilityEvent event) {
+        IMPL.onInitializeAccessibilityEvent(v, event);
+    }
+
+    /**
+     * Initializes an {@link AccessibilityNodeInfoCompat} with information
+     * about this view. The base implementation sets:
+     * <ul>
+     * <li>{@link AccessibilityNodeInfoCompat#setParent(View)},</li>
+     * <li>{@link AccessibilityNodeInfoCompat#setBoundsInParent(Rect)},</li>
+     * <li>{@link AccessibilityNodeInfoCompat#setBoundsInScreen(Rect)},</li>
+     * <li>{@link AccessibilityNodeInfoCompat#setPackageName(CharSequence)},</li>
+     * <li>{@link AccessibilityNodeInfoCompat#setClassName(CharSequence)},</li>
+     * <li>{@link AccessibilityNodeInfoCompat#setContentDescription(CharSequence)},</li>
+     * <li>{@link AccessibilityNodeInfoCompat#setEnabled(boolean)},</li>
+     * <li>{@link AccessibilityNodeInfoCompat#setClickable(boolean)},</li>
+     * <li>{@link AccessibilityNodeInfoCompat#setFocusable(boolean)},</li>
+     * <li>{@link AccessibilityNodeInfoCompat#setFocused(boolean)},</li>
+     * <li>{@link AccessibilityNodeInfoCompat#setLongClickable(boolean)},</li>
+     * <li>{@link AccessibilityNodeInfoCompat#setSelected(boolean)},</li>
+     * </ul>
+     * <p>
+     * If an {@link AccessibilityDelegateCompat} has been specified via calling
+     * {@link ViewCompat#setAccessibilityDelegate(View, AccessibilityDelegateCompat)}, its
+     * {@link AccessibilityDelegateCompat#onInitializeAccessibilityNodeInfo(View, AccessibilityNodeInfoCompat)}
+     * method is responsible for handling this call.
+     *
+     * @param v The View against which to invoke the method.
+     * @param info The instance to initialize.
+     */
+    public static void onInitializeAccessibilityNodeInfo(View v, AccessibilityNodeInfoCompat info) {
+        IMPL.onInitializeAccessibilityNodeInfo(v, info);
+    }
+
+    /**
+     * Sets a delegate for implementing accessibility support via composition
+     * (as opposed to inheritance). For more details, see
+     * {@link AccessibilityDelegateCompat}.
+     * <p>
+     * On platform versions prior to API 14, this method is a no-op.
+     * <p>
+     * <strong>Note:</strong> On platform versions prior to
+     * {@link android.os.Build.VERSION_CODES#M API 23}, delegate methods on
+     * views in the {@code android.widget.*} package are called <i>before</i>
+     * host methods. This prevents certain properties such as class name from
+     * being modified by overriding
+     * {@link AccessibilityDelegateCompat#onInitializeAccessibilityNodeInfo(View, AccessibilityNodeInfoCompat)},
+     * as any changes will be overwritten by the host class.
+     * <p>
+     * Starting in {@link android.os.Build.VERSION_CODES#M API 23}, delegate
+     * methods are called <i>after</i> host methods, which all properties to be
+     * modified without being overwritten by the host class.
+     *
+     * @param delegate the object to which accessibility method calls should be
+     *                 delegated
+     * @see AccessibilityDelegateCompat
+     */
+    public static void setAccessibilityDelegate(View v, AccessibilityDelegateCompat delegate) {
+        IMPL.setAccessibilityDelegate(v, delegate);
+    }
+
+    /**
+     * Checks whether provided View has an accessibility delegate attached to it.
+     *
+     * @param v The View instance to check
+     * @return True if the View has an accessibility delegate
+     */
+    public static boolean hasAccessibilityDelegate(View v) {
+        return IMPL.hasAccessibilityDelegate(v);
+    }
+
+    /**
+     * Indicates whether the view is currently tracking transient state that the
+     * app should not need to concern itself with saving and restoring, but that
+     * the framework should take special note to preserve when possible.
+     *
+     * @param view View to check for transient state
+     * @return true if the view has transient state
+     */
+    public static boolean hasTransientState(View view) {
+        return IMPL.hasTransientState(view);
+    }
+
+    /**
+     * Set whether this view is currently tracking transient state that the
+     * framework should attempt to preserve when possible.
+     *
+     * @param view View tracking transient state
+     * @param hasTransientState true if this view has transient state
+     */
+    public static void setHasTransientState(View view, boolean hasTransientState) {
+        IMPL.setHasTransientState(view, hasTransientState);
+    }
+
+    /**
+     * <p>Cause an invalidate to happen on the next animation time step, typically the
+     * next display frame.</p>
+     *
+     * <p>This method can be invoked from outside of the UI thread
+     * only when this View is attached to a window.</p>
+     *
+     * @param view View to invalidate
+     */
+    public static void postInvalidateOnAnimation(View view) {
+        IMPL.postInvalidateOnAnimation(view);
+    }
+
+    /**
+     * <p>Cause an invalidate of the specified area to happen on the next animation
+     * time step, typically the next display frame.</p>
+     *
+     * <p>This method can be invoked from outside of the UI thread
+     * only when this View is attached to a window.</p>
+     *
+     * @param view View to invalidate
+     * @param left The left coordinate of the rectangle to invalidate.
+     * @param top The top coordinate of the rectangle to invalidate.
+     * @param right The right coordinate of the rectangle to invalidate.
+     * @param bottom The bottom coordinate of the rectangle to invalidate.
+     */
+    public static void postInvalidateOnAnimation(View view, int left, int top,
+            int right, int bottom) {
+        IMPL.postInvalidateOnAnimation(view, left, top, right, bottom);
+    }
+
+    /**
+     * <p>Causes the Runnable to execute on the next animation time step.
+     * The runnable will be run on the user interface thread.</p>
+     *
+     * <p>This method can be invoked from outside of the UI thread
+     * only when this View is attached to a window.</p>
+     *
+     * @param view View to post this Runnable to
+     * @param action The Runnable that will be executed.
+     */
+    public static void postOnAnimation(View view, Runnable action) {
+        IMPL.postOnAnimation(view, action);
+    }
+
+    /**
+     * <p>Causes the Runnable to execute on the next animation time step,
+     * after the specified amount of time elapses.
+     * The runnable will be run on the user interface thread.</p>
+     *
+     * <p>This method can be invoked from outside of the UI thread
+     * only when this View is attached to a window.</p>
+     *
+     * @param view The view to post this Runnable to
+     * @param action The Runnable that will be executed.
+     * @param delayMillis The delay (in milliseconds) until the Runnable
+     *        will be executed.
+     */
+    public static void postOnAnimationDelayed(View view, Runnable action, long delayMillis) {
+        IMPL.postOnAnimationDelayed(view, action, delayMillis);
+    }
+
+    /**
+     * Gets the mode for determining whether this View is important for accessibility
+     * which is if it fires accessibility events and if it is reported to
+     * accessibility services that query the screen.
+     *
+     * @param view The view whose property to get.
+     * @return The mode for determining whether a View is important for accessibility.
+     *
+     * @see #IMPORTANT_FOR_ACCESSIBILITY_YES
+     * @see #IMPORTANT_FOR_ACCESSIBILITY_NO
+     * @see #IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS
+     * @see #IMPORTANT_FOR_ACCESSIBILITY_AUTO
+     */
+    @ImportantForAccessibility
+    public static int getImportantForAccessibility(View view) {
+        //noinspection ResourceType
+        return IMPL.getImportantForAccessibility(view);
+    }
+
+    /**
+     * Sets how to determine whether this view is important for accessibility
+     * which is if it fires accessibility events and if it is reported to
+     * accessibility services that query the screen.
+     * <p>
+     * <em>Note:</em> If the current paltform version does not support the
+     *  {@link #IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS} mode, then
+     *  {@link #IMPORTANT_FOR_ACCESSIBILITY_NO} will be used as it is the
+     *  closest terms of semantics.
+     * </p>
+     *
+     * @param view The view whose property to set.
+     * @param mode How to determine whether this view is important for accessibility.
+     *
+     * @see #IMPORTANT_FOR_ACCESSIBILITY_YES
+     * @see #IMPORTANT_FOR_ACCESSIBILITY_NO
+     * @see #IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS
+     * @see #IMPORTANT_FOR_ACCESSIBILITY_AUTO
+     */
+    public static void setImportantForAccessibility(View view,
+            @ImportantForAccessibility int mode) {
+        IMPL.setImportantForAccessibility(view, mode);
+    }
+
+    /**
+     * Performs the specified accessibility action on the view. For
+     * possible accessibility actions look at {@link AccessibilityNodeInfoCompat}.
+     * <p>
+     * If an {@link AccessibilityDelegateCompat} has been specified via calling
+     * {@link #setAccessibilityDelegate(View, AccessibilityDelegateCompat)} its
+     * {@link AccessibilityDelegateCompat#performAccessibilityAction(View, int, Bundle)}
+     * is responsible for handling this call.
+     * </p>
+     *
+     * @param action The action to perform.
+     * @param arguments Optional action arguments.
+     * @return Whether the action was performed.
+     */
+    public static boolean performAccessibilityAction(View view, int action, Bundle arguments) {
+        return IMPL.performAccessibilityAction(view, action, arguments);
+    }
+
+    /**
+     * Gets the provider for managing a virtual view hierarchy rooted at this View
+     * and reported to {@link android.accessibilityservice.AccessibilityService}s
+     * that explore the window content.
+     * <p>
+     * If this method returns an instance, this instance is responsible for managing
+     * {@link AccessibilityNodeInfoCompat}s describing the virtual sub-tree rooted at
+     * this View including the one representing the View itself. Similarly the returned
+     * instance is responsible for performing accessibility actions on any virtual
+     * view or the root view itself.
+     * </p>
+     * <p>
+     * If an {@link AccessibilityDelegateCompat} has been specified via calling
+     * {@link #setAccessibilityDelegate(View, AccessibilityDelegateCompat)} its
+     * {@link AccessibilityDelegateCompat#getAccessibilityNodeProvider(View)}
+     * is responsible for handling this call.
+     * </p>
+     *
+     * @param view The view whose property to get.
+     * @return The provider.
+     *
+     * @see AccessibilityNodeProviderCompat
+     */
+    public static AccessibilityNodeProviderCompat getAccessibilityNodeProvider(View view) {
+        return IMPL.getAccessibilityNodeProvider(view);
+    }
+
+    /**
+     * The opacity of the view. This is a value from 0 to 1, where 0 means the view is
+     * completely transparent and 1 means the view is completely opaque.
+     *
+     * <p>By default this is 1.0f. Prior to API 11, the returned value is always 1.0f.
+     * @return The opacity of the view.
+     */
+    public static float getAlpha(View view) {
+        return IMPL.getAlpha(view);
+    }
+
+    /**
+     * <p>Specifies the type of layer backing this view. The layer can be
+     * {@link #LAYER_TYPE_NONE disabled}, {@link #LAYER_TYPE_SOFTWARE software} or
+     * {@link #LAYER_TYPE_HARDWARE hardware}.</p>
+     *
+     * <p>A layer is associated with an optional {@link android.graphics.Paint}
+     * instance that controls how the layer is composed on screen. The following
+     * properties of the paint are taken into account when composing the layer:</p>
+     * <ul>
+     * <li>{@link android.graphics.Paint#getAlpha() Translucency (alpha)}</li>
+     * <li>{@link android.graphics.Paint#getXfermode() Blending mode}</li>
+     * <li>{@link android.graphics.Paint#getColorFilter() Color filter}</li>
+     * </ul>
+     *
+     * <p>If this view has an alpha value set to < 1.0 by calling
+     * setAlpha(float), the alpha value of the layer's paint is replaced by
+     * this view's alpha value. Calling setAlpha(float) is therefore
+     * equivalent to setting a hardware layer on this view and providing a paint with
+     * the desired alpha value.<p>
+     *
+     * <p>Refer to the documentation of {@link #LAYER_TYPE_NONE disabled},
+     * {@link #LAYER_TYPE_SOFTWARE software} and {@link #LAYER_TYPE_HARDWARE hardware}
+     * for more information on when and how to use layers.</p>
+     *
+     * @param view View to set the layer type for
+     * @param layerType The type of layer to use with this view, must be one of
+     *        {@link #LAYER_TYPE_NONE}, {@link #LAYER_TYPE_SOFTWARE} or
+     *        {@link #LAYER_TYPE_HARDWARE}
+     * @param paint The paint used to compose the layer. This argument is optional
+     *        and can be null. It is ignored when the layer type is
+     *        {@link #LAYER_TYPE_NONE}
+     */
+    public static void setLayerType(View view, @LayerType int layerType, Paint paint) {
+        IMPL.setLayerType(view, layerType, paint);
+    }
+
+    /**
+     * Indicates what type of layer is currently associated with this view. By default
+     * a view does not have a layer, and the layer type is {@link #LAYER_TYPE_NONE}.
+     * Refer to the documentation of
+     * {@link #setLayerType(android.view.View, int, android.graphics.Paint)}
+     * for more information on the different types of layers.
+     *
+     * @param view The view to fetch the layer type from
+     * @return {@link #LAYER_TYPE_NONE}, {@link #LAYER_TYPE_SOFTWARE} or
+     *         {@link #LAYER_TYPE_HARDWARE}
+     *
+     * @see #setLayerType(android.view.View, int, android.graphics.Paint)
+     * @see #LAYER_TYPE_NONE
+     * @see #LAYER_TYPE_SOFTWARE
+     * @see #LAYER_TYPE_HARDWARE
+     */
+    @LayerType
+    public static int getLayerType(View view) {
+        //noinspection ResourceType
+        return IMPL.getLayerType(view);
+    }
+
+    /**
+     * Gets the id of a view for which a given view serves as a label for
+     * accessibility purposes.
+     *
+     * @param view The view on which to invoke the corresponding method.
+     * @return The labeled view id.
+     */
+    public static int getLabelFor(View view) {
+        return IMPL.getLabelFor(view);
+    }
+
+    /**
+     * Sets the id of a view for which a given view serves as a label for
+     * accessibility purposes.
+     *
+     * @param view The view on which to invoke the corresponding method.
+     * @param labeledId The labeled view id.
+     */
+    public static void setLabelFor(View view, @IdRes int labeledId) {
+        IMPL.setLabelFor(view, labeledId);
+    }
+
+    /**
+     * Updates the {@link Paint} object used with the current layer (used only if the current
+     * layer type is not set to {@link #LAYER_TYPE_NONE}). Changed properties of the Paint
+     * provided to {@link #setLayerType(android.view.View, int, android.graphics.Paint)}
+     * will be used the next time the View is redrawn, but
+     * {@link #setLayerPaint(android.view.View, android.graphics.Paint)}
+     * must be called to ensure that the view gets redrawn immediately.
+     *
+     * <p>A layer is associated with an optional {@link android.graphics.Paint}
+     * instance that controls how the layer is composed on screen. The following
+     * properties of the paint are taken into account when composing the layer:</p>
+     * <ul>
+     * <li>{@link android.graphics.Paint#getAlpha() Translucency (alpha)}</li>
+     * <li>{@link android.graphics.Paint#getXfermode() Blending mode}</li>
+     * <li>{@link android.graphics.Paint#getColorFilter() Color filter}</li>
+     * </ul>
+     *
+     * <p>If this view has an alpha value set to < 1.0 by calling
+     * View#setAlpha(float), the alpha value of the layer's paint is replaced by
+     * this view's alpha value. Calling View#setAlpha(float) is therefore
+     * equivalent to setting a hardware layer on this view and providing a paint with
+     * the desired alpha value.</p>
+     *
+     * @param view View to set a layer paint for
+     * @param paint The paint used to compose the layer. This argument is optional
+     *        and can be null. It is ignored when the layer type is
+     *        {@link #LAYER_TYPE_NONE}
+     *
+     * @see #setLayerType(View, int, android.graphics.Paint)
+     */
+    public static void setLayerPaint(View view, Paint paint) {
+        IMPL.setLayerPaint(view, paint);
+    }
+
+    /**
+     * Returns the resolved layout direction for this view.
+     *
+     * @param view View to get layout direction for
+     * @return {@link #LAYOUT_DIRECTION_RTL} if the layout direction is RTL or returns
+     * {@link #LAYOUT_DIRECTION_LTR} if the layout direction is not RTL.
+     *
+     * For compatibility, this will return {@link #LAYOUT_DIRECTION_LTR} if API version
+     * is lower than Jellybean MR1 (API 17)
+     */
+    @ResolvedLayoutDirectionMode
+    public static int getLayoutDirection(View view) {
+        //noinspection ResourceType
+        return IMPL.getLayoutDirection(view);
+    }
+
+    /**
+     * Set the layout direction for this view. This will propagate a reset of layout direction
+     * resolution to the view's children and resolve layout direction for this view.
+     *
+     * @param view View to set layout direction for
+     * @param layoutDirection the layout direction to set. Should be one of:
+     *
+     * {@link #LAYOUT_DIRECTION_LTR},
+     * {@link #LAYOUT_DIRECTION_RTL},
+     * {@link #LAYOUT_DIRECTION_INHERIT},
+     * {@link #LAYOUT_DIRECTION_LOCALE}.
+     *
+     * Resolution will be done if the value is set to LAYOUT_DIRECTION_INHERIT. The resolution
+     * proceeds up the parent chain of the view to get the value. If there is no parent, then it
+     * will return the default {@link #LAYOUT_DIRECTION_LTR}.
+     */
+    public static void setLayoutDirection(View view, @LayoutDirectionMode int layoutDirection) {
+        IMPL.setLayoutDirection(view, layoutDirection);
+    }
+
+    /**
+     * Gets the parent for accessibility purposes. Note that the parent for
+     * accessibility is not necessary the immediate parent. It is the first
+     * predecessor that is important for accessibility.
+     *
+     * @param view View to retrieve parent for
+     * @return The parent for use in accessibility inspection
+     */
+    public static ViewParent getParentForAccessibility(View view) {
+        return IMPL.getParentForAccessibility(view);
+    }
+
+    /**
+     * Indicates whether this View is opaque. An opaque View guarantees that it will
+     * draw all the pixels overlapping its bounds using a fully opaque color.
+     *
+     * @return True if this View is guaranteed to be fully opaque, false otherwise.
+     * @deprecated Use {@link View#isOpaque()} directly.
+     */
+    @Deprecated
+    public static boolean isOpaque(View view) {
+        return view.isOpaque();
+    }
+
+    /**
+     * Utility to reconcile a desired size and state, with constraints imposed
+     * by a MeasureSpec.  Will take the desired size, unless a different size
+     * is imposed by the constraints.  The returned value is a compound integer,
+     * with the resolved size in the {@link #MEASURED_SIZE_MASK} bits and
+     * optionally the bit {@link #MEASURED_STATE_TOO_SMALL} set if the resulting
+     * size is smaller than the size the view wants to be.
+     *
+     * @param size How big the view wants to be
+     * @param measureSpec Constraints imposed by the parent
+     * @return Size information bit mask as defined by
+     * {@link #MEASURED_SIZE_MASK} and {@link #MEASURED_STATE_TOO_SMALL}.
+     */
+    public static int resolveSizeAndState(int size, int measureSpec, int childMeasuredState) {
+        return IMPL.resolveSizeAndState(size, measureSpec, childMeasuredState);
+    }
+
+    /**
+     * Return the full width measurement information for this view as computed
+     * by the most recent call to {@link android.view.View#measure(int, int)}.
+     * This result is a bit mask as defined by {@link #MEASURED_SIZE_MASK} and
+     * {@link #MEASURED_STATE_TOO_SMALL}.
+     * This should be used during measurement and layout calculations only. Use
+     * {@link android.view.View#getWidth()} to see how wide a view is after layout.
+     *
+     * @return The measured width of this view as a bit mask.
+     */
+    public static int getMeasuredWidthAndState(View view) {
+        return IMPL.getMeasuredWidthAndState(view);
+    }
+
+    /**
+     * Return the full height measurement information for this view as computed
+     * by the most recent call to {@link android.view.View#measure(int, int)}.
+     * This result is a bit mask as defined by {@link #MEASURED_SIZE_MASK} and
+     * {@link #MEASURED_STATE_TOO_SMALL}.
+     * This should be used during measurement and layout calculations only. Use
+     * {@link android.view.View#getHeight()} to see how wide a view is after layout.
+     *
+     * @return The measured width of this view as a bit mask.
+     */
+    public static int getMeasuredHeightAndState(View view) {
+        return IMPL.getMeasuredHeightAndState(view);
+    }
+
+    /**
+     * Return only the state bits of {@link #getMeasuredWidthAndState}
+     * and {@link #getMeasuredHeightAndState}, combined into one integer.
+     * The width component is in the regular bits {@link #MEASURED_STATE_MASK}
+     * and the height component is at the shifted bits
+     * {@link #MEASURED_HEIGHT_STATE_SHIFT}>>{@link #MEASURED_STATE_MASK}.
+     */
+    public static int getMeasuredState(View view) {
+        return IMPL.getMeasuredState(view);
+    }
+
+    /**
+     * Merge two states as returned by {@link #getMeasuredState(View)}.
+     * @param curState The current state as returned from a view or the result
+     * of combining multiple views.
+     * @param newState The new view state to combine.
+     * @return Returns a new integer reflecting the combination of the two
+     * states.
+     */
+    public static int combineMeasuredStates(int curState, int newState) {
+        return IMPL.combineMeasuredStates(curState, newState);
+    }
+
+    /**
+     * Gets the live region mode for the specified View.
+     *
+     * @param view The view from which to obtain the live region mode
+     * @return The live region mode for the view.
+     *
+     * @see ViewCompat#setAccessibilityLiveRegion(View, int)
+     */
+    @AccessibilityLiveRegion
+    public static int getAccessibilityLiveRegion(View view) {
+        //noinspection ResourceType
+        return IMPL.getAccessibilityLiveRegion(view);
+    }
+
+    /**
+     * Sets the live region mode for the specified view. This indicates to
+     * accessibility services whether they should automatically notify the user
+     * about changes to the view's content description or text, or to the
+     * content descriptions or text of the view's children (where applicable).
+     * <p>
+     * For example, in a login screen with a TextView that displays an "incorrect
+     * password" notification, that view should be marked as a live region with
+     * mode {@link #ACCESSIBILITY_LIVE_REGION_POLITE}.
+     * <p>
+     * To disable change notifications for this view, use
+     * {@link #ACCESSIBILITY_LIVE_REGION_NONE}. This is the default live region
+     * mode for most views.
+     * <p>
+     * To indicate that the user should be notified of changes, use
+     * {@link #ACCESSIBILITY_LIVE_REGION_POLITE}.
+     * <p>
+     * If the view's changes should interrupt ongoing speech and notify the user
+     * immediately, use {@link #ACCESSIBILITY_LIVE_REGION_ASSERTIVE}.
+     *
+     * @param view The view on which to set the live region mode
+     * @param mode The live region mode for this view, one of:
+     *        <ul>
+     *        <li>{@link #ACCESSIBILITY_LIVE_REGION_NONE}
+     *        <li>{@link #ACCESSIBILITY_LIVE_REGION_POLITE}
+     *        <li>{@link #ACCESSIBILITY_LIVE_REGION_ASSERTIVE}
+     *        </ul>
+     */
+    public static void setAccessibilityLiveRegion(View view, @AccessibilityLiveRegion int mode) {
+        IMPL.setAccessibilityLiveRegion(view, mode);
+    }
+
+    /**
+     * Returns the start padding of the specified view depending on its resolved layout direction.
+     * If there are inset and enabled scrollbars, this value may include the space
+     * required to display the scrollbars as well.
+     *
+     * @param view The view to get padding for
+     * @return the start padding in pixels
+     */
+    public static int getPaddingStart(View view) {
+        return IMPL.getPaddingStart(view);
+    }
+
+    /**
+     * Returns the end padding of the specified view depending on its resolved layout direction.
+     * If there are inset and enabled scrollbars, this value may include the space
+     * required to display the scrollbars as well.
+     *
+     * @param view The view to get padding for
+     * @return the end padding in pixels
+     */
+    public static int getPaddingEnd(View view) {
+        return IMPL.getPaddingEnd(view);
+    }
+
+    /**
+     * Sets the relative padding. The view may add on the space required to display
+     * the scrollbars, depending on the style and visibility of the scrollbars.
+     * So the values returned from {@link #getPaddingStart}, {@link View#getPaddingTop},
+     * {@link #getPaddingEnd} and {@link View#getPaddingBottom} may be different
+     * from the values set in this call.
+     *
+     * @param view The view on which to set relative padding
+     * @param start the start padding in pixels
+     * @param top the top padding in pixels
+     * @param end the end padding in pixels
+     * @param bottom the bottom padding in pixels
+     */
+    public static void setPaddingRelative(View view, int start, int top, int end, int bottom) {
+        IMPL.setPaddingRelative(view, start, top, end, bottom);
+    }
+
+    /**
+     * Notify a view that it is being temporarily detached.
+     */
+    public static void dispatchStartTemporaryDetach(View view) {
+        IMPL.dispatchStartTemporaryDetach(view);
+    }
+
+    /**
+     * Notify a view that its temporary detach has ended; the view is now reattached.
+     */
+    public static void dispatchFinishTemporaryDetach(View view) {
+        IMPL.dispatchFinishTemporaryDetach(view);
+    }
+
+    /**
+     * The horizontal location of this view relative to its {@link View#getLeft() left} position.
+     * This position is post-layout, in addition to wherever the object's
+     * layout placed it.
+     *
+     * <p>Prior to API 11 this will return 0.</p>
+     *
+     * @return The horizontal position of this view relative to its left position, in pixels.
+     */
+    public static float getTranslationX(View view) {
+        return IMPL.getTranslationX(view);
+    }
+
+    /**
+     * The vertical location of this view relative to its {@link View#getTop() top} position.
+     * This position is post-layout, in addition to wherever the object's
+     * layout placed it.
+     *
+     * <p>Prior to API 11 this will return 0.</p>
+     *
+     * @return The vertical position of this view relative to its top position, in pixels.
+     */
+    public static float getTranslationY(View view) {
+        return IMPL.getTranslationY(view);
+    }
+
+    /**
+     * The transform matrix of this view, which is calculated based on the current
+     * rotation, scale, and pivot properties.
+     * <p>
+     * Prior to 11, this method will return {@code null}.
+     *
+     * @param view The view whose Matrix will be returned
+     * @return The current transform matrix for the view
+     *
+     * @see #getRotation(View)
+     * @see #getScaleX(View)
+     * @see #getScaleY(View)
+     * @see #getPivotX(View)
+     * @see #getPivotY(View)
+     */
+    @Nullable
+    public static Matrix getMatrix(View view) {
+        return IMPL.getMatrix(view);
+    }
+
+    /**
+     * Returns the minimum width of the view.
+     *
+     * <p>Prior to API 16 this will return 0.</p>
+     *
+     * @return the minimum width the view will try to be.
+     */
+    public static int getMinimumWidth(View view) {
+        return IMPL.getMinimumWidth(view);
+    }
+
+    /**
+     * Returns the minimum height of the view.
+     *
+     * <p>Prior to API 16 this will return 0.</p>
+     *
+     * @return the minimum height the view will try to be.
+     */
+    public static int getMinimumHeight(View view) {
+        return IMPL.getMinimumHeight(view);
+    }
+
+    /**
+     * This method returns a ViewPropertyAnimator object, which can be used to animate
+     * specific properties on this View.
+     *
+     * <p>Prior to API 14, this method will do nothing.</p>
+     *
+     * @return ViewPropertyAnimator The ViewPropertyAnimator associated with this View.
+     */
+    public static ViewPropertyAnimatorCompat animate(View view) {
+        return IMPL.animate(view);
+    }
+
+    /**
+     * Sets the horizontal location of this view relative to its left position.
+     * This effectively positions the object post-layout, in addition to wherever the object's
+     * layout placed it.
+     *
+     * <p>Prior to API 11 this will have no effect.</p>
+     *
+     * @param value The horizontal position of this view relative to its left position,
+     * in pixels.
+     */
+    public static void setTranslationX(View view, float value) {
+        IMPL.setTranslationX(view, value);
+    }
+
+    /**
+     * Sets the vertical location of this view relative to its top position.
+     * This effectively positions the object post-layout, in addition to wherever the object's
+     * layout placed it.
+     *
+     * <p>Prior to API 11 this will have no effect.</p>
+     *
+     * @param value The vertical position of this view relative to its top position,
+     * in pixels.
+     *
+     * @attr name android:translationY
+     */
+    public static void setTranslationY(View view, float value) {
+        IMPL.setTranslationY(view, value);
+    }
+
+    /**
+     * <p>Sets the opacity of the view. This is a value from 0 to 1, where 0 means the view is
+     * completely transparent and 1 means the view is completely opaque.</p>
+     *
+     * <p> Note that setting alpha to a translucent value (0 < alpha < 1) can have significant
+     * performance implications, especially for large views. It is best to use the alpha property
+     * sparingly and transiently, as in the case of fading animations.</p>
+     *
+     * <p>Prior to API 11 this will have no effect.</p>
+     *
+     * @param value The opacity of the view.
+     */
+    public static void setAlpha(View view, @FloatRange(from=0.0, to=1.0) float value) {
+        IMPL.setAlpha(view, value);
+    }
+
+    /**
+     * Sets the visual x position of this view, in pixels. This is equivalent to setting the
+     * {@link #setTranslationX(View, float) translationX} property to be the difference between
+     * the x value passed in and the current left property of the view as determined
+     * by the layout bounds.
+     *
+     * <p>Prior to API 11 this will have no effect.</p>
+     *
+     * @param value The visual x position of this view, in pixels.
+     */
+    public static void setX(View view, float value) {
+        IMPL.setX(view, value);
+    }
+
+    /**
+     * Sets the visual y position of this view, in pixels. This is equivalent to setting the
+     * {@link #setTranslationY(View, float) translationY} property to be the difference between
+     * the y value passed in and the current top property of the view as determined by the
+     * layout bounds.
+     *
+     * <p>Prior to API 11 this will have no effect.</p>
+     *
+     * @param value The visual y position of this view, in pixels.
+     */
+    public static void setY(View view, float value) {
+        IMPL.setY(view, value);
+    }
+
+    /**
+     * Sets the degrees that the view is rotated around the pivot point. Increasing values
+     * result in clockwise rotation.
+     *
+     * <p>Prior to API 11 this will have no effect.</p>
+     *
+     * @param value The degrees of rotation.
+     */
+    public static void setRotation(View view, float value) {
+        IMPL.setRotation(view, value);
+    }
+
+    /**
+     * Sets the degrees that the view is rotated around the horizontal axis through the pivot point.
+     * Increasing values result in clockwise rotation from the viewpoint of looking down the
+     * x axis.
+     *
+     * <p>Prior to API 11 this will have no effect.</p>
+     *
+     * @param value The degrees of X rotation.
+     */
+    public static void setRotationX(View view, float value) {
+        IMPL.setRotationX(view, value);
+    }
+
+    /**
+     * Sets the degrees that the view is rotated around the vertical axis through the pivot point.
+     * Increasing values result in counter-clockwise rotation from the viewpoint of looking
+     * down the y axis.
+     *
+     * <p>Prior to API 11 this will have no effect.</p>
+     *
+     * @param value The degrees of Y rotation.
+     */
+    public static void setRotationY(View view, float value) {
+        IMPL.setRotationY(view, value);
+    }
+
+    /**
+     * Sets the amount that the view is scaled in x around the pivot point, as a proportion of
+     * the view's unscaled width. A value of 1 means that no scaling is applied.
+     *
+     * <p>Prior to API 11 this will have no effect.</p>
+     *
+     * @param value The scaling factor.
+     */
+    public static void setScaleX(View view, float value) {
+        IMPL.setScaleX(view, value);
+    }
+
+    /**
+     * Sets the amount that the view is scaled in Y around the pivot point, as a proportion of
+     * the view's unscaled width. A value of 1 means that no scaling is applied.
+     *
+     * <p>Prior to API 11 this will have no effect.</p>
+     *
+     * @param value The scaling factor.
+     */
+    public static void setScaleY(View view, float value) {
+        IMPL.setScaleY(view, value);
+    }
+
+    /**
+     * The x location of the point around which the view is
+     * {@link #setRotation(View, float) rotated} and {@link #setScaleX(View, float) scaled}.
+     *
+     * <p>Prior to API 11 this will have no effect.</p>
+     *
+     */
+    public static float getPivotX(View view) {
+        return IMPL.getPivotX(view);
+    }
+
+    /**
+     * Sets the x location of the point around which the view is
+     * {@link #setRotation(View, float) rotated} and {@link #setScaleX(View, float) scaled}.
+     * By default, the pivot point is centered on the object.
+     * Setting this property disables this behavior and causes the view to use only the
+     * explicitly set pivotX and pivotY values.
+     *
+     * <p>Prior to API 11 this will have no effect.</p>
+     *
+     * @param value The x location of the pivot point.
+     */
+    public static void setPivotX(View view, float value) {
+        IMPL.setPivotX(view, value);
+    }
+
+    /**
+     * The y location of the point around which the view is {@link #setRotation(View,
+     * float) rotated} and {@link #setScaleY(View, float) scaled}.
+     *
+     * <p>Prior to API 11 this will return 0.</p>
+     *
+     * @return The y location of the pivot point.
+     */
+    public static float getPivotY(View view) {
+        return IMPL.getPivotY(view);
+    }
+
+    /**
+     * Sets the y location of the point around which the view is
+     * {@link #setRotation(View, float) rotated} and {@link #setScaleY(View, float) scaled}.
+     * By default, the pivot point is centered on the object.
+     * Setting this property disables this behavior and causes the view to use only the
+     * explicitly set pivotX and pivotY values.
+     *
+     * <p>Prior to API 11 this will have no effect.</p>
+     *
+     * @param value The y location of the pivot point.
+     */
+    public static void setPivotY(View view, float value) {
+        IMPL.setPivotY(view, value);
+    }
+
+    public static float getRotation(View view) {
+        return IMPL.getRotation(view);
+    }
+
+    public static float getRotationX(View view) {
+        return IMPL.getRotationX(view);
+    }
+
+    public static float getRotationY(View view) {
+        return IMPL.getRotationY(view);
+    }
+
+    public static float getScaleX(View view) {
+        return IMPL.getScaleX(view);
+    }
+
+    public static float getScaleY(View view) {
+        return IMPL.getScaleY(view);
+    }
+
+    public static float getX(View view) {
+        return IMPL.getX(view);
+    }
+
+    public static float getY(View view) {
+        return IMPL.getY(view);
+    }
+
+    /**
+     * Sets the base elevation of this view, in pixels.
+     */
+    public static void setElevation(View view, float elevation) {
+        IMPL.setElevation(view, elevation);
+    }
+
+    /**
+     * The base elevation of this view relative to its parent, in pixels.
+     *
+     * @return The base depth position of the view, in pixels.
+     */
+    public static float getElevation(View view) {
+        return IMPL.getElevation(view);
+    }
+
+    /**
+     * Sets the depth location of this view relative to its {@link #getElevation(View) elevation}.
+     */
+    public static void setTranslationZ(View view, float translationZ) {
+        IMPL.setTranslationZ(view, translationZ);
+    }
+
+    /**
+     * The depth location of this view relative to its {@link #getElevation(View) elevation}.
+     *
+     * @return The depth of this view relative to its elevation.
+     */
+    public static float getTranslationZ(View view) {
+        return IMPL.getTranslationZ(view);
+    }
+
+    /**
+     * Sets the name of the View to be used to identify Views in Transitions.
+     * Names should be unique in the View hierarchy.
+     *
+     * @param view The View against which to invoke the method.
+     * @param transitionName The name of the View to uniquely identify it for Transitions.
+     */
+    public static void setTransitionName(View view, String transitionName) {
+        IMPL.setTransitionName(view, transitionName);
+    }
+
+    /**
+     * Returns the name of the View to be used to identify Views in Transitions.
+     * Names should be unique in the View hierarchy.
+     *
+     * <p>This returns null if the View has not been given a name.</p>
+     *
+     * @param view The View against which to invoke the method.
+     * @return The name used of the View to be used to identify Views in Transitions or null
+     * if no name has been given.
+     */
+    public static String getTransitionName(View view) {
+        return IMPL.getTransitionName(view);
+    }
+
+    /**
+     * Returns the current system UI visibility that is currently set for the entire window.
+     */
+    public static int getWindowSystemUiVisibility(View view) {
+        return IMPL.getWindowSystemUiVisibility(view);
+    }
+
+    /**
+     * Ask that a new dispatch of {@code View.onApplyWindowInsets(WindowInsets)} be performed. This
+     * falls back to {@code View.requestFitSystemWindows()} where available.
+     */
+    public static void requestApplyInsets(View view) {
+        IMPL.requestApplyInsets(view);
+    }
+
+    /**
+     * Tells the ViewGroup whether to draw its children in the order defined by the method
+     * {@code ViewGroup.getChildDrawingOrder(int, int)}.
+     *
+     * @param enabled true if the order of the children when drawing is determined by
+     *        {@link ViewGroup#getChildDrawingOrder(int, int)}, false otherwise
+     *
+     * <p>Prior to API 7 this will have no effect.</p>
+     */
+    public static void setChildrenDrawingOrderEnabled(ViewGroup viewGroup, boolean enabled) {
+       IMPL.setChildrenDrawingOrderEnabled(viewGroup, enabled);
+    }
+
+    /**
+     * Returns true if this view should adapt to fit system window insets. This method will always
+     * return false before API 16 (Jellybean).
+     */
+    public static boolean getFitsSystemWindows(View v) {
+        return IMPL.getFitsSystemWindows(v);
+    }
+
+    /**
+     * Sets whether or not this view should account for system screen decorations
+     * such as the status bar and inset its content; that is, controlling whether
+     * the default implementation of {@link View#fitSystemWindows(Rect)} will be
+     * executed. See that method for more details.
+     */
+    public static void setFitsSystemWindows(View view, boolean fitSystemWindows) {
+        IMPL.setFitsSystemWindows(view, fitSystemWindows);
+    }
+
+    /**
+     * On API 11 devices and above, call <code>Drawable.jumpToCurrentState()</code>
+     * on all Drawable objects associated with this view.
+     * <p>
+     * On API 21 and above, also calls <code>StateListAnimator#jumpToCurrentState()</code>
+     * if there is a StateListAnimator attached to this view.
+     */
+    public static void jumpDrawablesToCurrentState(View v) {
+        IMPL.jumpDrawablesToCurrentState(v);
+    }
+
+    /**
+     * Set an {@link OnApplyWindowInsetsListener} to take over the policy for applying
+     * window insets to this view. This will only take effect on devices with API 21 or above.
+     */
+    public static void setOnApplyWindowInsetsListener(View v,
+            OnApplyWindowInsetsListener listener) {
+        IMPL.setOnApplyWindowInsetsListener(v, listener);
+    }
+
+    /**
+     * Called when the view should apply {@link WindowInsetsCompat} according to its internal policy.
+     *
+     * <p>Clients may supply an {@link OnApplyWindowInsetsListener} to a view. If one is set
+     * it will be called during dispatch instead of this method. The listener may optionally
+     * call this method from its own implementation if it wishes to apply the view's default
+     * insets policy in addition to its own.</p>
+     *
+     * @param view The View against which to invoke the method.
+     * @param insets Insets to apply
+     * @return The supplied insets with any applied insets consumed
+     */
+    public static WindowInsetsCompat onApplyWindowInsets(View view, WindowInsetsCompat insets) {
+        return IMPL.onApplyWindowInsets(view, insets);
+    }
+
+    /**
+     * Request to apply the given window insets to this view or another view in its subtree.
+     *
+     * <p>This method should be called by clients wishing to apply insets corresponding to areas
+     * obscured by window decorations or overlays. This can include the status and navigation bars,
+     * action bars, input methods and more. New inset categories may be added in the future.
+     * The method returns the insets provided minus any that were applied by this view or its
+     * children.</p>
+     *
+     * @param insets Insets to apply
+     * @return The provided insets minus the insets that were consumed
+     */
+    public static WindowInsetsCompat dispatchApplyWindowInsets(View view,
+            WindowInsetsCompat insets) {
+        return IMPL.dispatchApplyWindowInsets(view, insets);
+    }
+
+    /**
+     * Controls whether the entire hierarchy under this view will save its
+     * state when a state saving traversal occurs from its parent.
+     *
+     * @param enabled Set to false to <em>disable</em> state saving, or true
+     * (the default) to allow it.
+     */
+    public static void setSaveFromParentEnabled(View v, boolean enabled) {
+        IMPL.setSaveFromParentEnabled(v, enabled);
+    }
+
+    /**
+     * Changes the activated state of this view. A view can be activated or not.
+     * Note that activation is not the same as selection.  Selection is
+     * a transient property, representing the view (hierarchy) the user is
+     * currently interacting with.  Activation is a longer-term state that the
+     * user can move views in and out of.
+     *
+     * @param activated true if the view must be activated, false otherwise
+     */
+    public static void setActivated(View view, boolean activated) {
+        IMPL.setActivated(view, activated);
+    }
+
+    /**
+     * Returns whether this View has content which overlaps.
+     *
+     * <p>This function, intended to be overridden by specific View types, is an optimization when
+     * alpha is set on a view. If rendering overlaps in a view with alpha < 1, that view is drawn to
+     * an offscreen buffer and then composited into place, which can be expensive. If the view has
+     * no overlapping rendering, the view can draw each primitive with the appropriate alpha value
+     * directly. An example of overlapping rendering is a TextView with a background image, such as
+     * a Button. An example of non-overlapping rendering is a TextView with no background, or an
+     * ImageView with only the foreground image. The default implementation returns true; subclasses
+     * should override if they have cases which can be optimized.</p>
+     *
+     * @return true if the content in this view might overlap, false otherwise.
+     */
+    public static boolean hasOverlappingRendering(View view) {
+        return IMPL.hasOverlappingRendering(view);
+    }
+
+    /**
+     * Return if the padding as been set through relative values
+     * {@code View.setPaddingRelative(int, int, int, int)} or thru
+     *
+     * @return true if the padding is relative or false if it is not.
+     */
+    public static boolean isPaddingRelative(View view) {
+        return IMPL.isPaddingRelative(view);
+    }
+
+    /**
+     * Return the tint applied to the background drawable, if specified.
+     * <p>
+     * Only returns meaningful info when running on API v21 or newer, or if {@code view}
+     * implements the {@code TintableBackgroundView} interface.
+     */
+    public static ColorStateList getBackgroundTintList(View view) {
+        return IMPL.getBackgroundTintList(view);
+    }
+
+    /**
+     * Applies a tint to the background drawable.
+     * <p>
+     * This will always take effect when running on API v21 or newer. When running on platforms
+     * previous to API v21, it will only take effect if {@code view} implement the
+     * {@code TintableBackgroundView} interface.
+     */
+    public static void setBackgroundTintList(View view, ColorStateList tintList) {
+        IMPL.setBackgroundTintList(view, tintList);
+    }
+
+    /**
+     * Return the blending mode used to apply the tint to the background
+     * drawable, if specified.
+     * <p>
+     * Only returns meaningful info when running on API v21 or newer, or if {@code view}
+     * implements the {@code TintableBackgroundView} interface.
+     */
+    public static PorterDuff.Mode getBackgroundTintMode(View view) {
+        return IMPL.getBackgroundTintMode(view);
+    }
+
+    /**
+     * Specifies the blending mode used to apply the tint specified by
+     * {@link #setBackgroundTintList(android.view.View, android.content.res.ColorStateList)} to
+     * the background drawable. The default mode is {@link PorterDuff.Mode#SRC_IN}.
+     * <p>
+     * This will always take effect when running on API v21 or newer. When running on platforms
+     * previous to API v21, it will only take effect if {@code view} implement the
+     * {@code TintableBackgroundView} interface.
+     */
+    public static void setBackgroundTintMode(View view, PorterDuff.Mode mode) {
+        IMPL.setBackgroundTintMode(view, mode);
+    }
+    // TODO: getters for various view properties (rotation, etc)
+
+    /**
+     * Enable or disable nested scrolling for this view.
+     *
+     * <p>If this property is set to true the view will be permitted to initiate nested
+     * scrolling operations with a compatible parent view in the current hierarchy. If this
+     * view does not implement nested scrolling this will have no effect. Disabling nested scrolling
+     * while a nested scroll is in progress has the effect of
+     * {@link #stopNestedScroll(View) stopping} the nested scroll.</p>
+     *
+     * @param enabled true to enable nested scrolling, false to disable
+     *
+     * @see #isNestedScrollingEnabled(View)
+     */
+    public static void setNestedScrollingEnabled(View view, boolean enabled) {
+        IMPL.setNestedScrollingEnabled(view, enabled);
+    }
+
+    /**
+     * Returns true if nested scrolling is enabled for this view.
+     *
+     * <p>If nested scrolling is enabled and this View class implementation supports it,
+     * this view will act as a nested scrolling child view when applicable, forwarding data
+     * about the scroll operation in progress to a compatible and cooperating nested scrolling
+     * parent.</p>
+     *
+     * @return true if nested scrolling is enabled
+     *
+     * @see #setNestedScrollingEnabled(View, boolean)
+     */
+    public static boolean isNestedScrollingEnabled(View view) {
+        return IMPL.isNestedScrollingEnabled(view);
+    }
+
+    /**
+     * Begin a nestable scroll operation along the given axes.
+     *
+     * <p>A view starting a nested scroll promises to abide by the following contract:</p>
+     *
+     * <p>The view will call startNestedScroll upon initiating a scroll operation. In the case
+     * of a touch scroll this corresponds to the initial {@link MotionEvent#ACTION_DOWN}.
+     * In the case of touch scrolling the nested scroll will be terminated automatically in
+     * the same manner as {@link ViewParent#requestDisallowInterceptTouchEvent(boolean)}.
+     * In the event of programmatic scrolling the caller must explicitly call
+     * {@link #stopNestedScroll(View)} to indicate the end of the nested scroll.</p>
+     *
+     * <p>If <code>startNestedScroll</code> returns true, a cooperative parent was found.
+     * If it returns false the caller may ignore the rest of this contract until the next scroll.
+     * Calling startNestedScroll while a nested scroll is already in progress will return true.</p>
+     *
+     * <p>At each incremental step of the scroll the caller should invoke
+     * {@link #dispatchNestedPreScroll(View, int, int, int[], int[]) dispatchNestedPreScroll}
+     * once it has calculated the requested scrolling delta. If it returns true the nested scrolling
+     * parent at least partially consumed the scroll and the caller should adjust the amount it
+     * scrolls by.</p>
+     *
+     * <p>After applying the remainder of the scroll delta the caller should invoke
+     * {@link #dispatchNestedScroll(View, int, int, int, int, int[]) dispatchNestedScroll}, passing
+     * both the delta consumed and the delta unconsumed. A nested scrolling parent may treat
+     * these values differently. See
+     * {@link NestedScrollingParent#onNestedScroll(View, int, int, int, int)}.
+     * </p>
+     *
+     * @param axes Flags consisting of a combination of {@link ViewCompat#SCROLL_AXIS_HORIZONTAL}
+     *             and/or {@link ViewCompat#SCROLL_AXIS_VERTICAL}.
+     * @return true if a cooperative parent was found and nested scrolling has been enabled for
+     *         the current gesture.
+     *
+     * @see #stopNestedScroll(View)
+     * @see #dispatchNestedPreScroll(View, int, int, int[], int[])
+     * @see #dispatchNestedScroll(View, int, int, int, int, int[])
+     */
+    public static boolean startNestedScroll(View view, int axes) {
+        return IMPL.startNestedScroll(view, axes);
+    }
+
+    /**
+     * Stop a nested scroll in progress.
+     *
+     * <p>Calling this method when a nested scroll is not currently in progress is harmless.</p>
+     *
+     * @see #startNestedScroll(View, int)
+     */
+    public static void stopNestedScroll(View view) {
+        IMPL.stopNestedScroll(view);
+    }
+
+    /**
+     * Returns true if this view has a nested scrolling parent.
+     *
+     * <p>The presence of a nested scrolling parent indicates that this view has initiated
+     * a nested scroll and it was accepted by an ancestor view further up the view hierarchy.</p>
+     *
+     * @return whether this view has a nested scrolling parent
+     */
+    public static boolean hasNestedScrollingParent(View view) {
+        return IMPL.hasNestedScrollingParent(view);
+    }
+
+    /**
+     * Dispatch one step of a nested scroll in progress.
+     *
+     * <p>Implementations of views that support nested scrolling should call this to report
+     * info about a scroll in progress to the current nested scrolling parent. If a nested scroll
+     * is not currently in progress or nested scrolling is not
+     * {@link #isNestedScrollingEnabled(View) enabled} for this view this method does nothing.</p>
+     *
+     * <p>Compatible View implementations should also call
+     * {@link #dispatchNestedPreScroll(View, int, int, int[], int[]) dispatchNestedPreScroll} before
+     * consuming a component of the scroll event themselves.</p>
+     *
+     * @param dxConsumed Horizontal distance in pixels consumed by this view during this scroll step
+     * @param dyConsumed Vertical distance in pixels consumed by this view during this scroll step
+     * @param dxUnconsumed Horizontal scroll distance in pixels not consumed by this view
+     * @param dyUnconsumed Horizontal scroll distance in pixels not consumed by this view
+     * @param offsetInWindow Optional. If not null, on return this will contain the offset
+     *                       in local view coordinates of this view from before this operation
+     *                       to after it completes. View implementations may use this to adjust
+     *                       expected input coordinate tracking.
+     * @return true if the event was dispatched, false if it could not be dispatched.
+     * @see #dispatchNestedPreScroll(View, int, int, int[], int[])
+     */
+    public static boolean dispatchNestedScroll(View view, int dxConsumed, int dyConsumed,
+            int dxUnconsumed, int dyUnconsumed, int[] offsetInWindow) {
+        return IMPL.dispatchNestedScroll(view, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed,
+                offsetInWindow);
+    }
+
+    /**
+     * Dispatch one step of a nested scroll in progress before this view consumes any portion of it.
+     *
+     * <p>Nested pre-scroll events are to nested scroll events what touch intercept is to touch.
+     * <code>dispatchNestedPreScroll</code> offers an opportunity for the parent view in a nested
+     * scrolling operation to consume some or all of the scroll operation before the child view
+     * consumes it.</p>
+     *
+     * @param dx Horizontal scroll distance in pixels
+     * @param dy Vertical scroll distance in pixels
+     * @param consumed Output. If not null, consumed[0] will contain the consumed component of dx
+     *                 and consumed[1] the consumed dy.
+     * @param offsetInWindow Optional. If not null, on return this will contain the offset
+     *                       in local view coordinates of this view from before this operation
+     *                       to after it completes. View implementations may use this to adjust
+     *                       expected input coordinate tracking.
+     * @return true if the parent consumed some or all of the scroll delta
+     * @see #dispatchNestedScroll(View, int, int, int, int, int[])
+     */
+    public static boolean dispatchNestedPreScroll(View view, int dx, int dy, int[] consumed,
+            int[] offsetInWindow) {
+        return IMPL.dispatchNestedPreScroll(view, dx, dy, consumed, offsetInWindow);
+    }
+
+    /**
+     * Dispatch a fling to a nested scrolling parent.
+     *
+     * <p>This method should be used to indicate that a nested scrolling child has detected
+     * suitable conditions for a fling. Generally this means that a touch scroll has ended with a
+     * {@link VelocityTracker velocity} in the direction of scrolling that meets or exceeds
+     * the {@link ViewConfiguration#getScaledMinimumFlingVelocity() minimum fling velocity}
+     * along a scrollable axis.</p>
+     *
+     * <p>If a nested scrolling child view would normally fling but it is at the edge of
+     * its own content, it can use this method to delegate the fling to its nested scrolling
+     * parent instead. The parent may optionally consume the fling or observe a child fling.</p>
+     *
+     * @param velocityX Horizontal fling velocity in pixels per second
+     * @param velocityY Vertical fling velocity in pixels per second
+     * @param consumed true if the child consumed the fling, false otherwise
+     * @return true if the nested scrolling parent consumed or otherwise reacted to the fling
+     */
+    public static boolean dispatchNestedFling(View view, float velocityX, float velocityY,
+            boolean consumed) {
+        return IMPL.dispatchNestedFling(view, velocityX, velocityY, consumed);
+    }
+
+    /**
+     * Dispatch a fling to a nested scrolling parent before it is processed by this view.
+     *
+     * <p>Nested pre-fling events are to nested fling events what touch intercept is to touch
+     * and what nested pre-scroll is to nested scroll. <code>dispatchNestedPreFling</code>
+     * offsets an opportunity for the parent view in a nested fling to fully consume the fling
+     * before the child view consumes it. If this method returns <code>true</code>, a nested
+     * parent view consumed the fling and this view should not scroll as a result.</p>
+     *
+     * <p>For a better user experience, only one view in a nested scrolling chain should consume
+     * the fling at a time. If a parent view consumed the fling this method will return false.
+     * Custom view implementations should account for this in two ways:</p>
+     *
+     * <ul>
+     *     <li>If a custom view is paged and needs to settle to a fixed page-point, do not
+     *     call <code>dispatchNestedPreFling</code>; consume the fling and settle to a valid
+     *     position regardless.</li>
+     *     <li>If a nested parent does consume the fling, this view should not scroll at all,
+     *     even to settle back to a valid idle position.</li>
+     * </ul>
+     *
+     * <p>Views should also not offer fling velocities to nested parent views along an axis
+     * where scrolling is not currently supported; a {@link android.widget.ScrollView ScrollView}
+     * should not offer a horizontal fling velocity to its parents since scrolling along that
+     * axis is not permitted and carrying velocity along that motion does not make sense.</p>
+     *
+     * @param velocityX Horizontal fling velocity in pixels per second
+     * @param velocityY Vertical fling velocity in pixels per second
+     * @return true if a nested scrolling parent consumed the fling
+     */
+    public static boolean dispatchNestedPreFling(View view, float velocityX, float velocityY) {
+        return IMPL.dispatchNestedPreFling(view, velocityX, velocityY);
+    }
+
+    /**
+     * Returns whether the view hierarchy is currently undergoing a layout pass. This
+     * information is useful to avoid situations such as calling {@link View#requestLayout()}
+     * during a layout pass.
+     * <p>
+     * Compatibility:
+     * <ul>
+     *     <li>API < 18: Always returns {@code false}</li>
+     * </ul>
+     *
+     * @return whether the view hierarchy is currently undergoing a layout pass
+     */
+    public static boolean isInLayout(View view) {
+        return IMPL.isInLayout(view);
+    }
+
+    /**
+     * Returns true if {@code view} has been through at least one layout since it
+     * was last attached to or detached from a window.
+     */
+    public static boolean isLaidOut(View view) {
+        return IMPL.isLaidOut(view);
+    }
+
+    /**
+     * Returns whether layout direction has been resolved.
+     * <p>
+     * Compatibility:
+     * <ul>
+     *     <li>API < 19: Always returns {@code false}</li>
+     * </ul>
+     *
+     * @return true if layout direction has been resolved.
+     */
+    public static boolean isLayoutDirectionResolved(View view) {
+        return IMPL.isLayoutDirectionResolved(view);
+    }
+
+    /**
+     * The visual z position of this view, in pixels. This is equivalent to the
+     * {@link #setTranslationZ(View, float) translationZ} property plus the current
+     * {@link #getElevation(View) elevation} property.
+     *
+     * @return The visual z position of this view, in pixels.
+     */
+    public static float getZ(View view) {
+        return IMPL.getZ(view);
+    }
+
+    /**
+     * Sets the visual z position of this view, in pixels. This is equivalent to setting the
+     * {@link #setTranslationZ(View, float) translationZ} property to be the difference between
+     * the x value passed in and the current {@link #getElevation(View) elevation} property.
+     * <p>
+     * Compatibility:
+     * <ul>
+     *     <li>API < 21: No-op
+     * </ul>
+     *
+     * @param z The visual z position of this view, in pixels.
+     */
+    public static void setZ(View view, float z) {
+        IMPL.setZ(view, z);
+    }
+
+    /**
+     * Offset this view's vertical location by the specified number of pixels.
+     *
+     * @param offset the number of pixels to offset the view by
+     */
+    public static void offsetTopAndBottom(View view, int offset) {
+        IMPL.offsetTopAndBottom(view, offset);
+    }
+
+    /**
+     * Offset this view's horizontal location by the specified amount of pixels.
+     *
+     * @param offset the number of pixels to offset the view by
+     */
+    public static void offsetLeftAndRight(View view, int offset) {
+        IMPL.offsetLeftAndRight(view, offset);
+    }
+
+    /**
+     * Sets a rectangular area on this view to which the view will be clipped
+     * when it is drawn. Setting the value to null will remove the clip bounds
+     * and the view will draw normally, using its full bounds.
+     *
+     * <p>Prior to API 18 this does nothing.</p>
+     *
+     * @param view       The view to set clipBounds.
+     * @param clipBounds The rectangular area, in the local coordinates of
+     * this view, to which future drawing operations will be clipped.
+     */
+    public static void setClipBounds(View view, Rect clipBounds) {
+        IMPL.setClipBounds(view, clipBounds);
+    }
+
+    /**
+     * Returns a copy of the current {@link #setClipBounds(View, Rect)}.
+     *
+     * <p>Prior to API 18 this will return null.</p>
+     *
+     * @return A copy of the current clip bounds if clip bounds are set,
+     * otherwise null.
+     */
+    public static Rect getClipBounds(View view) {
+        return IMPL.getClipBounds(view);
+    }
+
+    /**
+     * Returns true if the provided view is currently attached to a window.
+     */
+    public static boolean isAttachedToWindow(View view) {
+        return IMPL.isAttachedToWindow(view);
+    }
+
+    /**
+     * Returns whether the provided view has an attached {@link View.OnClickListener}.
+     *
+     * @return true if there is a listener, false if there is none.
+     */
+    public static boolean hasOnClickListeners(View view) {
+        return IMPL.hasOnClickListeners(view);
+    }
+
+    /**
+     * Sets the state of all scroll indicators.
+     * <p>
+     * See {@link #setScrollIndicators(View, int, int)} for usage information.
+     *
+     * @param indicators a bitmask of indicators that should be enabled, or
+     *                   {@code 0} to disable all indicators
+     *
+     * @see #setScrollIndicators(View, int, int)
+     * @see #getScrollIndicators(View)
+     */
+    public static void setScrollIndicators(@NonNull View view, @ScrollIndicators int indicators) {
+        IMPL.setScrollIndicators(view, indicators);
+    }
+
+    /**
+     * Sets the state of the scroll indicators specified by the mask. To change
+     * all scroll indicators at once, see {@link #setScrollIndicators(View, int)}.
+     * <p>
+     * When a scroll indicator is enabled, it will be displayed if the view
+     * can scroll in the direction of the indicator.
+     * <p>
+     * Multiple indicator types may be enabled or disabled by passing the
+     * logical OR of the desired types. If multiple types are specified, they
+     * will all be set to the same enabled state.
+     * <p>
+     * For example, to enable the top scroll indicatorExample: {@code setScrollIndicators}
+     *
+     * @param indicators the indicator direction, or the logical OR of multiple
+     *             indicator directions. One or more of:
+     *             <ul>
+     *               <li>{@link #SCROLL_INDICATOR_TOP}</li>
+     *               <li>{@link #SCROLL_INDICATOR_BOTTOM}</li>
+     *               <li>{@link #SCROLL_INDICATOR_LEFT}</li>
+     *               <li>{@link #SCROLL_INDICATOR_RIGHT}</li>
+     *               <li>{@link #SCROLL_INDICATOR_START}</li>
+     *               <li>{@link #SCROLL_INDICATOR_END}</li>
+     *             </ul>
+     *
+     * @see #setScrollIndicators(View, int)
+     * @see #getScrollIndicators(View)
+     */
+    public static void setScrollIndicators(@NonNull View view, @ScrollIndicators int indicators,
+            @ScrollIndicators int mask) {
+        IMPL.setScrollIndicators(view, indicators, mask);
+    }
+
+    /**
+     * Returns a bitmask representing the enabled scroll indicators.
+     * <p>
+     * For example, if the top and left scroll indicators are enabled and all
+     * other indicators are disabled, the return value will be
+     * {@code ViewCompat.SCROLL_INDICATOR_TOP | ViewCompat.SCROLL_INDICATOR_LEFT}.
+     * <p>
+     * To check whether the bottom scroll indicator is enabled, use the value
+     * of {@code (ViewCompat.getScrollIndicators(view) & ViewCompat.SCROLL_INDICATOR_BOTTOM) != 0}.
+     *
+     * @return a bitmask representing the enabled scroll indicators
+     */
+    public static int getScrollIndicators(@NonNull View view) {
+        return IMPL.getScrollIndicators(view);
+    }
+
+    /**
+     * Set the pointer icon for the current view.
+     * @param pointerIcon A PointerIconCompat instance which will be shown when the mouse hovers.
+     */
+    public static void setPointerIcon(@NonNull View view, PointerIconCompat pointerIcon) {
+        IMPL.setPointerIcon(view, pointerIcon);
+    }
+
+    protected ViewCompat() {}
+}
diff --git a/compat/java/android/support/v4/view/ViewConfigurationCompat.java b/compat/java/android/support/v4/view/ViewConfigurationCompat.java
new file mode 100644
index 0000000..b6e2e73
--- /dev/null
+++ b/compat/java/android/support/v4/view/ViewConfigurationCompat.java
@@ -0,0 +1,100 @@
+/*
+ * 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 android.support.v4.view;
+
+import android.view.ViewConfiguration;
+
+/**
+ * Helper for accessing features in {@link ViewConfiguration}
+ * introduced after API level 4 in a backwards compatible fashion.
+ */
+public final class ViewConfigurationCompat {
+    /**
+     * Interface for the full API.
+     */
+    interface ViewConfigurationVersionImpl {
+        boolean hasPermanentMenuKey(ViewConfiguration config);
+    }
+
+    /**
+     * Interface implementation that doesn't use anything about v4 APIs.
+     */
+    static class BaseViewConfigurationVersionImpl implements ViewConfigurationVersionImpl {
+        @Override
+        public boolean hasPermanentMenuKey(ViewConfiguration config) {
+            // Pre-HC devices will always have a menu button
+            return true;
+        }
+    }
+
+    /**
+     * Interface implementation for devices with at least v11 APIs.
+     */
+    static class HoneycombViewConfigurationVersionImpl extends BaseViewConfigurationVersionImpl {
+        @Override
+        public boolean hasPermanentMenuKey(ViewConfiguration config) {
+            // There is no way to check on Honeycomb so we assume false
+            return false;
+        }
+    }
+
+    /**
+     * Interface implementation for devices with at least v14 APIs.
+     */
+    static class IcsViewConfigurationVersionImpl extends HoneycombViewConfigurationVersionImpl {
+        @Override
+        public boolean hasPermanentMenuKey(ViewConfiguration config) {
+            return ViewConfigurationCompatICS.hasPermanentMenuKey(config);
+        }
+    }
+
+    /**
+     * Select the correct implementation to use for the current platform.
+     */
+    static final ViewConfigurationVersionImpl IMPL;
+    static {
+        if (android.os.Build.VERSION.SDK_INT >= 14) {
+            IMPL = new IcsViewConfigurationVersionImpl();
+        } else if (android.os.Build.VERSION.SDK_INT >= 11) {
+            IMPL = new HoneycombViewConfigurationVersionImpl();
+        } else {
+            IMPL = new BaseViewConfigurationVersionImpl();
+        }
+    }
+
+    // -------------------------------------------------------------------
+
+    /**
+     * Call {@link ViewConfiguration#getScaledPagingTouchSlop()}.
+     *
+     * @deprecated Call {@link ViewConfiguration#getScaledPagingTouchSlop()} directly.
+     */
+    @Deprecated
+    public static int getScaledPagingTouchSlop(ViewConfiguration config) {
+        return config.getScaledPagingTouchSlop();
+    }
+
+    /**
+     * Report if the device has a permanent menu key available to the user, in a backwards
+     * compatible way.
+     */
+    public static boolean hasPermanentMenuKey(ViewConfiguration config) {
+        return IMPL.hasPermanentMenuKey(config);
+    }
+
+    private ViewConfigurationCompat() {}
+}
diff --git a/compat/java/android/support/v4/view/ViewGroupCompat.java b/compat/java/android/support/v4/view/ViewGroupCompat.java
new file mode 100644
index 0000000..0fa76cd
--- /dev/null
+++ b/compat/java/android/support/v4/view/ViewGroupCompat.java
@@ -0,0 +1,267 @@
+/*
+ * 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 android.support.v4.view;
+
+import android.os.Build;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.accessibility.AccessibilityEvent;
+
+/**
+ * Helper for accessing features in {@link ViewGroup}
+ * introduced after API level 4 in a backwards compatible fashion.
+ */
+public final class ViewGroupCompat {
+
+    /**
+     * This constant is a {@link #setLayoutMode(ViewGroup, int) layoutMode}.
+     * Clip bounds are the raw values of {@link android.view.View#getLeft() left},
+     * {@link android.view.View#getTop() top},
+     * {@link android.view.View#getRight() right} and {@link android.view.View#getBottom() bottom}.
+     */
+    public static final int LAYOUT_MODE_CLIP_BOUNDS = 0;
+
+    /**
+     * This constant is a {@link #setLayoutMode(ViewGroup, int) layoutMode}.
+     * Optical bounds describe where a widget appears to be. They sit inside the clip
+     * bounds which need to cover a larger area to allow other effects,
+     * such as shadows and glows, to be drawn.
+     */
+    public static final int LAYOUT_MODE_OPTICAL_BOUNDS = 1;
+
+    interface ViewGroupCompatImpl {
+        boolean onRequestSendAccessibilityEvent(ViewGroup group, View child,
+                AccessibilityEvent event);
+        void setMotionEventSplittingEnabled(ViewGroup group, boolean split);
+        int getLayoutMode(ViewGroup group);
+        void setLayoutMode(ViewGroup group, int mode);
+        void setTransitionGroup(ViewGroup group, boolean isTransitionGroup);
+        boolean isTransitionGroup(ViewGroup group);
+        int getNestedScrollAxes(ViewGroup group);
+    }
+
+    static class ViewGroupCompatStubImpl implements ViewGroupCompatImpl {
+        @Override
+        public boolean onRequestSendAccessibilityEvent(
+                ViewGroup group, View child, AccessibilityEvent event) {
+            return true;
+        }
+
+        @Override
+        public void setMotionEventSplittingEnabled(ViewGroup group, boolean split) {
+            // no-op, didn't exist.
+        }
+
+        @Override
+        public int getLayoutMode(ViewGroup group) {
+            return LAYOUT_MODE_CLIP_BOUNDS;
+        }
+
+        @Override
+        public void setLayoutMode(ViewGroup group, int mode) {
+            // no-op, didn't exist. Views only support clip bounds.
+        }
+
+        @Override
+        public void setTransitionGroup(ViewGroup group, boolean isTransitionGroup) {
+        }
+
+        @Override
+        public boolean isTransitionGroup(ViewGroup group) {
+            return false;
+        }
+
+        @Override
+        public int getNestedScrollAxes(ViewGroup group) {
+            if (group instanceof NestedScrollingParent) {
+                return ((NestedScrollingParent) group).getNestedScrollAxes();
+            }
+            return ViewCompat.SCROLL_AXIS_NONE;
+        }
+    }
+
+    static class ViewGroupCompatHCImpl extends ViewGroupCompatStubImpl {
+        @Override
+        public void setMotionEventSplittingEnabled(ViewGroup group, boolean split) {
+            ViewGroupCompatHC.setMotionEventSplittingEnabled(group, split);
+        }
+    }
+
+    static class ViewGroupCompatIcsImpl extends ViewGroupCompatHCImpl {
+        @Override
+        public boolean onRequestSendAccessibilityEvent(
+                ViewGroup group, View child, AccessibilityEvent event) {
+            return ViewGroupCompatIcs.onRequestSendAccessibilityEvent(group, child, event);
+        }
+    }
+
+    static class ViewGroupCompatJellybeanMR2Impl extends ViewGroupCompatIcsImpl {
+        @Override
+        public int getLayoutMode(ViewGroup group) {
+            return ViewGroupCompatJellybeanMR2.getLayoutMode(group);
+        }
+
+        @Override
+        public void setLayoutMode(ViewGroup group, int mode) {
+            ViewGroupCompatJellybeanMR2.setLayoutMode(group, mode);
+        }
+    }
+
+    static class ViewGroupCompatLollipopImpl extends ViewGroupCompatJellybeanMR2Impl {
+        @Override
+        public void setTransitionGroup(ViewGroup group, boolean isTransitionGroup) {
+            ViewGroupCompatLollipop.setTransitionGroup(group, isTransitionGroup);
+        }
+
+        @Override
+        public boolean isTransitionGroup(ViewGroup group) {
+            return ViewGroupCompatLollipop.isTransitionGroup(group);
+        }
+
+        @Override
+        public int getNestedScrollAxes(ViewGroup group) {
+            return ViewGroupCompatLollipop.getNestedScrollAxes(group);
+        }
+    }
+
+    static final ViewGroupCompatImpl IMPL;
+    static {
+        final int version = Build.VERSION.SDK_INT;
+        if (version >= 21) {
+            IMPL = new ViewGroupCompatLollipopImpl();
+        } else if (version >= 18) {
+            IMPL = new ViewGroupCompatJellybeanMR2Impl();
+        } else if (version >= 14) {
+            IMPL = new ViewGroupCompatIcsImpl();
+        } else if (version >= 11) {
+            IMPL = new ViewGroupCompatHCImpl();
+        } else {
+            IMPL = new ViewGroupCompatStubImpl();
+        }
+    }
+
+    /*
+     * Hide the constructor.
+     */
+    private ViewGroupCompat() {}
+
+    /**
+     * Called when a child has requested sending an {@link AccessibilityEvent} and
+     * gives an opportunity to its parent to augment the event.
+     * <p>
+     * If an {@link AccessibilityDelegateCompat} has been specified via calling
+     * {@link ViewCompat#setAccessibilityDelegate(View, AccessibilityDelegateCompat)} its
+     * {@link AccessibilityDelegateCompat#onRequestSendAccessibilityEvent(ViewGroup, View,
+     * AccessibilityEvent)} is responsible for handling this call.
+     * </p>
+     *
+     * @param group The group whose method to invoke.
+     * @param child The child which requests sending the event.
+     * @param event The event to be sent.
+     * @return True if the event should be sent.
+     */
+    public static boolean onRequestSendAccessibilityEvent(ViewGroup group, View child,
+            AccessibilityEvent event) {
+        return IMPL.onRequestSendAccessibilityEvent(group, child, event);
+    }
+
+    /**
+     * Enable or disable the splitting of MotionEvents to multiple children during touch event
+     * dispatch. This behavior is enabled by default for applications that target an
+     * SDK version of 11 (Honeycomb) or newer. On earlier platform versions this feature
+     * was not supported and this method is a no-op.
+     *
+     * <p>When this option is enabled MotionEvents may be split and dispatched to different child
+     * views depending on where each pointer initially went down. This allows for user interactions
+     * such as scrolling two panes of content independently, chording of buttons, and performing
+     * independent gestures on different pieces of content.
+     *
+     * @param group ViewGroup to modify
+     * @param split <code>true</code> to allow MotionEvents to be split and dispatched to multiple
+     *              child views. <code>false</code> to only allow one child view to be the target of
+     *              any MotionEvent received by this ViewGroup.
+     */
+    public static void setMotionEventSplittingEnabled(ViewGroup group, boolean split) {
+        IMPL.setMotionEventSplittingEnabled(group, split);
+    }
+
+    /**
+     * Returns the basis of alignment during layout operations on this ViewGroup:
+     * either {@link #LAYOUT_MODE_CLIP_BOUNDS} or {@link #LAYOUT_MODE_OPTICAL_BOUNDS}.
+     * <p>
+     * If no layoutMode was explicitly set, either programmatically or in an XML resource,
+     * the method returns the layoutMode of the view's parent ViewGroup if such a parent exists,
+     * otherwise the method returns a default value of {@link #LAYOUT_MODE_CLIP_BOUNDS}.
+     *
+     * @return the layout mode to use during layout operations
+     *
+     * @see #setLayoutMode(ViewGroup, int)
+     */
+    public static int getLayoutMode(ViewGroup group) {
+        return IMPL.getLayoutMode(group);
+    }
+
+    /**
+     * Sets the basis of alignment during the layout of this ViewGroup.
+     * Valid values are either {@link #LAYOUT_MODE_CLIP_BOUNDS} or
+     * {@link #LAYOUT_MODE_OPTICAL_BOUNDS}.
+     *
+     * @param mode the layout mode to use during layout operations
+     *
+     * @see #getLayoutMode(ViewGroup)
+     */
+    public static void setLayoutMode(ViewGroup group, int mode) {
+        IMPL.setLayoutMode(group, mode);
+    }
+
+    /**
+     * Changes whether or not this ViewGroup should be treated as a single entity during
+     * Activity Transitions.
+     * @param isTransitionGroup Whether or not the ViewGroup should be treated as a unit
+     *                          in Activity transitions. If false, the ViewGroup won't transition,
+     *                          only its children. If true, the entire ViewGroup will transition
+     *                          together.
+     */
+    public static void setTransitionGroup(ViewGroup group, boolean isTransitionGroup) {
+        IMPL.setTransitionGroup(group, isTransitionGroup);
+    }
+
+    /**
+     * Returns true if this ViewGroup should be considered as a single entity for removal
+     * when executing an Activity transition. If this is false, child elements will move
+     * individually during the transition.
+     */
+    public static boolean isTransitionGroup(ViewGroup group) {
+        return IMPL.isTransitionGroup(group);
+    }
+
+    /**
+     * Return the current axes of nested scrolling for this ViewGroup.
+     *
+     * <p>A ViewGroup returning something other than {@link ViewCompat#SCROLL_AXIS_NONE} is
+     * currently acting as a nested scrolling parent for one or more descendant views in
+     * the hierarchy.</p>
+     *
+     * @return Flags indicating the current axes of nested scrolling
+     * @see ViewCompat#SCROLL_AXIS_HORIZONTAL
+     * @see ViewCompat#SCROLL_AXIS_VERTICAL
+     * @see ViewCompat#SCROLL_AXIS_NONE
+     */
+    public static int getNestedScrollAxes(ViewGroup group) {
+        return IMPL.getNestedScrollAxes(group);
+    }
+}
diff --git a/v4/java/android/support/v4/view/ViewParentCompat.java b/compat/java/android/support/v4/view/ViewParentCompat.java
similarity index 100%
rename from v4/java/android/support/v4/view/ViewParentCompat.java
rename to compat/java/android/support/v4/view/ViewParentCompat.java
diff --git a/v4/java/android/support/v4/view/ViewPropertyAnimatorCompat.java b/compat/java/android/support/v4/view/ViewPropertyAnimatorCompat.java
similarity index 100%
rename from v4/java/android/support/v4/view/ViewPropertyAnimatorCompat.java
rename to compat/java/android/support/v4/view/ViewPropertyAnimatorCompat.java
diff --git a/v4/java/android/support/v4/view/WindowCompat.java b/compat/java/android/support/v4/view/WindowCompat.java
similarity index 100%
rename from v4/java/android/support/v4/view/WindowCompat.java
rename to compat/java/android/support/v4/view/WindowCompat.java
diff --git a/compat/java/android/support/v4/view/WindowInsetsCompat.java b/compat/java/android/support/v4/view/WindowInsetsCompat.java
new file mode 100644
index 0000000..e21a0d1
--- /dev/null
+++ b/compat/java/android/support/v4/view/WindowInsetsCompat.java
@@ -0,0 +1,515 @@
+/*
+ * Copyright (C) 2016 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 android.support.v4.view;
+
+import android.graphics.Rect;
+import android.os.Build;
+
+/**
+ * Describes a set of insets for window content.
+ *
+ * <p>WindowInsetsCompats are immutable and may be expanded to include more inset types in the
+ * future. To adjust insets, use one of the supplied clone methods to obtain a new
+ * WindowInsetsCompat instance with the adjusted properties.</p>
+ */
+public class WindowInsetsCompat {
+    private interface WindowInsetsCompatImpl {
+        int getSystemWindowInsetLeft(Object insets);
+        int getSystemWindowInsetTop(Object insets);
+        int getSystemWindowInsetRight(Object insets);
+        int getSystemWindowInsetBottom(Object insets);
+        boolean hasSystemWindowInsets(Object insets);
+        boolean hasInsets(Object insets);
+        boolean isConsumed(Object insets);
+        boolean isRound(Object insets);
+        WindowInsetsCompat consumeSystemWindowInsets(Object insets);
+        WindowInsetsCompat replaceSystemWindowInsets(Object insets,
+                int left, int top, int right, int bottom);
+        WindowInsetsCompat replaceSystemWindowInsets(Object insets, Rect systemWindowInsets);
+        int getStableInsetTop(Object insets);
+        int getStableInsetLeft(Object insets);
+        int getStableInsetRight(Object insets);
+        int getStableInsetBottom(Object insets);
+        boolean hasStableInsets(Object insets);
+        WindowInsetsCompat consumeStableInsets(Object insets);
+        Object getSourceWindowInsets(Object src);
+    }
+
+    private static class WindowInsetsCompatBaseImpl implements WindowInsetsCompatImpl {
+        @Override
+        public int getSystemWindowInsetLeft(Object insets) {
+            return 0;
+        }
+
+        @Override
+        public int getSystemWindowInsetTop(Object insets) {
+            return 0;
+        }
+
+        @Override
+        public int getSystemWindowInsetRight(Object insets) {
+            return 0;
+        }
+
+        @Override
+        public int getSystemWindowInsetBottom(Object insets) {
+            return 0;
+        }
+
+        @Override
+        public boolean hasSystemWindowInsets(Object insets) {
+            return false;
+        }
+
+        @Override
+        public boolean hasInsets(Object insets) {
+            return false;
+        }
+
+        @Override
+        public boolean isConsumed(Object insets) {
+            return false;
+        }
+
+        @Override
+        public boolean isRound(Object insets) {
+            return false;
+        }
+
+        @Override
+        public WindowInsetsCompat consumeSystemWindowInsets(Object insets) {
+            return null;
+        }
+
+        @Override
+        public WindowInsetsCompat replaceSystemWindowInsets(Object insets, int left, int top, int right, int bottom) {
+            return null;
+        }
+
+        @Override
+        public WindowInsetsCompat replaceSystemWindowInsets(Object insets, Rect systemWindowInsets) {
+            return null;
+        }
+
+        @Override
+        public int getStableInsetTop(Object insets) {
+            return 0;
+        }
+
+        @Override
+        public int getStableInsetLeft(Object insets) {
+            return 0;
+        }
+
+        @Override
+        public int getStableInsetRight(Object insets) {
+            return 0;
+        }
+
+        @Override
+        public int getStableInsetBottom(Object insets) {
+            return 0;
+        }
+
+        @Override
+        public boolean hasStableInsets(Object insets) {
+            return false;
+        }
+
+        @Override
+        public WindowInsetsCompat consumeStableInsets(Object insets) {
+            return null;
+        }
+
+        @Override
+        public Object getSourceWindowInsets(Object src) {
+            return null;
+        }
+    }
+
+    private static class WindowInsetsCompatApi20Impl extends WindowInsetsCompatBaseImpl {
+        @Override
+        public WindowInsetsCompat consumeSystemWindowInsets(Object insets) {
+            return new WindowInsetsCompat(
+                    WindowInsetsCompatApi20.consumeSystemWindowInsets(insets));
+        }
+
+        @Override
+        public int getSystemWindowInsetBottom(Object insets) {
+            return WindowInsetsCompatApi20.getSystemWindowInsetBottom(insets);
+        }
+
+        @Override
+        public int getSystemWindowInsetLeft(Object insets) {
+            return WindowInsetsCompatApi20.getSystemWindowInsetLeft(insets);
+        }
+
+        @Override
+        public int getSystemWindowInsetRight(Object insets) {
+            return WindowInsetsCompatApi20.getSystemWindowInsetRight(insets);
+        }
+
+        @Override
+        public int getSystemWindowInsetTop(Object insets) {
+            return WindowInsetsCompatApi20.getSystemWindowInsetTop(insets);
+        }
+
+        @Override
+        public boolean hasInsets(Object insets) {
+            return WindowInsetsCompatApi20.hasInsets(insets);
+        }
+
+        @Override
+        public boolean hasSystemWindowInsets(Object insets) {
+            return WindowInsetsCompatApi20.hasSystemWindowInsets(insets);
+        }
+
+        @Override
+        public boolean isRound(Object insets) {
+            return WindowInsetsCompatApi20.isRound(insets);
+        }
+
+        @Override
+        public WindowInsetsCompat replaceSystemWindowInsets(Object insets, int left, int top,
+                int right, int bottom) {
+            return new WindowInsetsCompat(WindowInsetsCompatApi20.replaceSystemWindowInsets(insets,
+                    left, top, right, bottom));
+        }
+
+        @Override
+        public Object getSourceWindowInsets(Object src) {
+            return WindowInsetsCompatApi20.getSourceWindowInsets(src);
+        }
+    }
+
+    private static class WindowInsetsCompatApi21Impl extends WindowInsetsCompatApi20Impl {
+        @Override
+        public WindowInsetsCompat consumeStableInsets(Object insets) {
+            return new WindowInsetsCompat(WindowInsetsCompatApi21.consumeStableInsets(insets));
+        }
+
+        @Override
+        public int getStableInsetBottom(Object insets) {
+            return WindowInsetsCompatApi21.getStableInsetBottom(insets);
+        }
+
+        @Override
+        public int getStableInsetLeft(Object insets) {
+            return WindowInsetsCompatApi21.getStableInsetLeft(insets);
+        }
+
+        @Override
+        public int getStableInsetRight(Object insets) {
+            return WindowInsetsCompatApi21.getStableInsetRight(insets);
+        }
+
+        @Override
+        public int getStableInsetTop(Object insets) {
+            return WindowInsetsCompatApi21.getStableInsetTop(insets);
+        }
+
+        @Override
+        public boolean hasStableInsets(Object insets) {
+            return WindowInsetsCompatApi21.hasStableInsets(insets);
+        }
+
+        @Override
+        public boolean isConsumed(Object insets) {
+            return WindowInsetsCompatApi21.isConsumed(insets);
+        }
+
+        @Override
+        public WindowInsetsCompat replaceSystemWindowInsets(Object insets,
+                Rect systemWindowInsets) {
+            return new WindowInsetsCompat(WindowInsetsCompatApi21.replaceSystemWindowInsets(insets,
+                    systemWindowInsets));
+        }
+    }
+
+    private static final WindowInsetsCompatImpl IMPL;
+    static {
+        final int version = Build.VERSION.SDK_INT;
+        if (version >= 21) {
+            IMPL = new WindowInsetsCompatApi21Impl();
+        } else if (version >= 20) {
+            IMPL = new WindowInsetsCompatApi20Impl();
+        } else {
+            IMPL = new WindowInsetsCompatBaseImpl();
+        }
+    }
+
+    private final Object mInsets;
+
+    private WindowInsetsCompat(Object insets) {
+        mInsets = insets;
+    }
+
+    public WindowInsetsCompat(WindowInsetsCompat src) {
+        mInsets = src == null ? null : IMPL.getSourceWindowInsets(src.mInsets);
+    }
+
+    /**
+     * Returns the left system window inset in pixels.
+     *
+     * <p>The system window inset represents the area of a full-screen window that is
+     * partially or fully obscured by the status bar, navigation bar, IME or other system windows.
+     * </p>
+     *
+     * @return The left system window inset
+     */
+    public int getSystemWindowInsetLeft() {
+        return IMPL.getSystemWindowInsetLeft(mInsets);
+    }
+
+    /**
+     * Returns the top system window inset in pixels.
+     *
+     * <p>The system window inset represents the area of a full-screen window that is
+     * partially or fully obscured by the status bar, navigation bar, IME or other system windows.
+     * </p>
+     *
+     * @return The top system window inset
+     */
+    public int getSystemWindowInsetTop() {
+        return IMPL.getSystemWindowInsetTop(mInsets);
+    }
+
+    /**
+     * Returns the right system window inset in pixels.
+     *
+     * <p>The system window inset represents the area of a full-screen window that is
+     * partially or fully obscured by the status bar, navigation bar, IME or other system windows.
+     * </p>
+     *
+     * @return The right system window inset
+     */
+    public int getSystemWindowInsetRight() {
+        return IMPL.getSystemWindowInsetRight(mInsets);
+    }
+
+    /**
+     * Returns the bottom system window inset in pixels.
+     *
+     * <p>The system window inset represents the area of a full-screen window that is
+     * partially or fully obscured by the status bar, navigation bar, IME or other system windows.
+     * </p>
+     *
+     * @return The bottom system window inset
+     */
+    public int getSystemWindowInsetBottom() {
+        return IMPL.getSystemWindowInsetBottom(mInsets);
+    }
+
+    /**
+     * Returns true if this WindowInsets has nonzero system window insets.
+     *
+     * <p>The system window inset represents the area of a full-screen window that is
+     * partially or fully obscured by the status bar, navigation bar, IME or other system windows.
+     * </p>
+     *
+     * @return true if any of the system window inset values are nonzero
+     */
+    public boolean hasSystemWindowInsets() {
+        return IMPL.hasSystemWindowInsets(mInsets);
+    }
+
+    /**
+     * Returns true if this WindowInsets has any nonzero insets.
+     *
+     * @return true if any inset values are nonzero
+     */
+    public boolean hasInsets() {
+        return IMPL.hasInsets(mInsets);
+    }
+
+    /**
+     * Check if these insets have been fully consumed.
+     *
+     * <p>Insets are considered "consumed" if the applicable <code>consume*</code> methods
+     * have been called such that all insets have been set to zero. This affects propagation of
+     * insets through the view hierarchy; insets that have not been fully consumed will continue
+     * to propagate down to child views.</p>
+     *
+     * <p>The result of this method is equivalent to the return value of
+     * {@link android.view.View#fitSystemWindows(android.graphics.Rect)}.</p>
+     *
+     * @return true if the insets have been fully consumed.
+     */
+    public boolean isConsumed() {
+        return IMPL.isConsumed(mInsets);
+    }
+
+    /**
+     * Returns true if the associated window has a round shape.
+     *
+     * <p>A round window's left, top, right and bottom edges reach all the way to the
+     * associated edges of the window but the corners may not be visible. Views responding
+     * to round insets should take care to not lay out critical elements within the corners
+     * where they may not be accessible.</p>
+     *
+     * @return True if the window is round
+     */
+    public boolean isRound() {
+        return IMPL.isRound(mInsets);
+    }
+
+    /**
+     * Returns a copy of this WindowInsets with the system window insets fully consumed.
+     *
+     * @return A modified copy of this WindowInsets
+     */
+    public WindowInsetsCompat consumeSystemWindowInsets() {
+        return IMPL.consumeSystemWindowInsets(mInsets);
+    }
+
+    /**
+     * Returns a copy of this WindowInsets with selected system window insets replaced
+     * with new values.
+     *
+     * @param left New left inset in pixels
+     * @param top New top inset in pixels
+     * @param right New right inset in pixels
+     * @param bottom New bottom inset in pixels
+     * @return A modified copy of this WindowInsets
+     */
+    public WindowInsetsCompat replaceSystemWindowInsets(int left, int top, int right, int bottom) {
+        return IMPL.replaceSystemWindowInsets(mInsets, left, top, right, bottom);
+    }
+
+    /**
+     * Returns a copy of this WindowInsets with selected system window insets replaced
+     * with new values.
+     *
+     * @param systemWindowInsets New system window insets. Each field is the inset in pixels
+     *                           for that edge
+     * @return A modified copy of this WindowInsets
+     */
+    public WindowInsetsCompat replaceSystemWindowInsets(Rect systemWindowInsets) {
+        return IMPL.replaceSystemWindowInsets(mInsets, systemWindowInsets);
+    }
+
+    /**
+     * Returns the top stable inset in pixels.
+     *
+     * <p>The stable inset represents the area of a full-screen window that <b>may</b> be
+     * partially or fully obscured by the system UI elements.  This value does not change
+     * based on the visibility state of those elements; for example, if the status bar is
+     * normally shown, but temporarily hidden, the stable inset will still provide the inset
+     * associated with the status bar being shown.</p>
+     *
+     * @return The top stable inset
+     */
+    public int getStableInsetTop() {
+        return IMPL.getStableInsetTop(mInsets);
+    }
+
+
+    /**
+     * Returns the left stable inset in pixels.
+     *
+     * <p>The stable inset represents the area of a full-screen window that <b>may</b> be
+     * partially or fully obscured by the system UI elements.  This value does not change
+     * based on the visibility state of those elements; for example, if the status bar is
+     * normally shown, but temporarily hidden, the stable inset will still provide the inset
+     * associated with the status bar being shown.</p>
+     *
+     * @return The left stable inset
+     */
+    public int getStableInsetLeft() {
+        return IMPL.getStableInsetLeft(mInsets);
+    }
+
+    /**
+     * Returns the right stable inset in pixels.
+     *
+     * <p>The stable inset represents the area of a full-screen window that <b>may</b> be
+     * partially or fully obscured by the system UI elements.  This value does not change
+     * based on the visibility state of those elements; for example, if the status bar is
+     * normally shown, but temporarily hidden, the stable inset will still provide the inset
+     * associated with the status bar being shown.</p>
+     *
+     * @return The right stable inset
+     */
+    public int getStableInsetRight() {
+        return IMPL.getStableInsetRight(mInsets);
+    }
+
+
+    /**
+     * Returns the bottom stable inset in pixels.
+     *
+     * <p>The stable inset represents the area of a full-screen window that <b>may</b> be
+     * partially or fully obscured by the system UI elements.  This value does not change
+     * based on the visibility state of those elements; for example, if the status bar is
+     * normally shown, but temporarily hidden, the stable inset will still provide the inset
+     * associated with the status bar being shown.</p>
+     *
+     * @return The bottom stable inset
+     */
+    public int getStableInsetBottom() {
+        return IMPL.getStableInsetBottom(mInsets);
+    }
+
+    /**
+     * Returns true if this WindowInsets has nonzero stable insets.
+     *
+     * <p>The stable inset represents the area of a full-screen window that <b>may</b> be
+     * partially or fully obscured by the system UI elements.  This value does not change
+     * based on the visibility state of those elements; for example, if the status bar is
+     * normally shown, but temporarily hidden, the stable inset will still provide the inset
+     * associated with the status bar being shown.</p>
+     *
+     * @return true if any of the stable inset values are nonzero
+     */
+    public boolean hasStableInsets() {
+        return IMPL.hasStableInsets(mInsets);
+    }
+
+    /**
+     * Returns a copy of this WindowInsets with the stable insets fully consumed.
+     *
+     * @return A modified copy of this WindowInsetsCompat
+     */
+    public WindowInsetsCompat consumeStableInsets() {
+        return IMPL.consumeStableInsets(mInsets);
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+        WindowInsetsCompat other = (WindowInsetsCompat) o;
+        return mInsets == null ? other.mInsets == null : mInsets.equals(other.mInsets);
+    }
+
+    @Override
+    public int hashCode() {
+        return mInsets == null ? 0 : mInsets.hashCode();
+    }
+
+    static WindowInsetsCompat wrap(Object insets) {
+        return insets == null ? null : new WindowInsetsCompat(insets);
+    }
+
+    static Object unwrap(WindowInsetsCompat insets) {
+        return insets == null ? null : insets.mInsets;
+    }
+}
diff --git a/v4/java/android/support/v4/view/accessibility/AccessibilityEventCompat.java b/compat/java/android/support/v4/view/accessibility/AccessibilityEventCompat.java
similarity index 100%
rename from v4/java/android/support/v4/view/accessibility/AccessibilityEventCompat.java
rename to compat/java/android/support/v4/view/accessibility/AccessibilityEventCompat.java
diff --git a/compat/java/android/support/v4/view/accessibility/AccessibilityManagerCompat.java b/compat/java/android/support/v4/view/accessibility/AccessibilityManagerCompat.java
new file mode 100644
index 0000000..734c246c
--- /dev/null
+++ b/compat/java/android/support/v4/view/accessibility/AccessibilityManagerCompat.java
@@ -0,0 +1,225 @@
+/*
+ * 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 android.support.v4.view.accessibility;
+
+import android.accessibilityservice.AccessibilityServiceInfo;
+import android.os.Build;
+import android.support.v4.view.accessibility.AccessibilityManagerCompatIcs.AccessibilityStateChangeListenerBridge;
+import android.view.accessibility.AccessibilityManager;
+
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * Helper for accessing features in {@link AccessibilityManager}
+ * introduced after API level 4 in a backwards compatible fashion.
+ */
+public final class AccessibilityManagerCompat {
+
+    interface AccessibilityManagerVersionImpl {
+        public Object newAccessiblityStateChangeListener(
+                AccessibilityStateChangeListenerCompat listener);
+        public boolean addAccessibilityStateChangeListener(AccessibilityManager manager,
+                AccessibilityStateChangeListenerCompat listener);
+        public boolean removeAccessibilityStateChangeListener(AccessibilityManager manager,
+                AccessibilityStateChangeListenerCompat listener);
+        public List<AccessibilityServiceInfo> getEnabledAccessibilityServiceList(
+                AccessibilityManager manager,int feedbackTypeFlags);
+        public List<AccessibilityServiceInfo> getInstalledAccessibilityServiceList(
+                AccessibilityManager manager);
+        public boolean isTouchExplorationEnabled(AccessibilityManager manager);
+    }
+
+    static class AccessibilityManagerStubImpl implements AccessibilityManagerVersionImpl {
+        @Override
+        public Object newAccessiblityStateChangeListener(
+                AccessibilityStateChangeListenerCompat listener) {
+            return null;
+        }
+
+        @Override
+        public boolean addAccessibilityStateChangeListener(AccessibilityManager manager,
+                AccessibilityStateChangeListenerCompat listener) {
+            return false;
+        }
+
+        @Override
+        public boolean removeAccessibilityStateChangeListener(AccessibilityManager manager,
+                AccessibilityStateChangeListenerCompat listener) {
+            return false;
+        }
+
+        @Override
+        public List<AccessibilityServiceInfo> getEnabledAccessibilityServiceList(
+                AccessibilityManager manager, int feedbackTypeFlags) {
+            return Collections.emptyList();
+        }
+
+        @Override
+        public List<AccessibilityServiceInfo> getInstalledAccessibilityServiceList(
+                AccessibilityManager manager) {
+            return Collections.emptyList();
+        }
+
+        @Override
+        public boolean isTouchExplorationEnabled(AccessibilityManager manager) {
+            return false;
+        }
+    }
+
+    static class AccessibilityManagerIcsImpl extends AccessibilityManagerStubImpl {
+        
+        @Override
+        public Object newAccessiblityStateChangeListener(
+                final AccessibilityStateChangeListenerCompat listener) {
+            return AccessibilityManagerCompatIcs.newAccessibilityStateChangeListener(
+                new AccessibilityStateChangeListenerBridge() {
+                    @Override
+                    public void onAccessibilityStateChanged(boolean enabled) {
+                        listener.onAccessibilityStateChanged(enabled);
+                    }
+                });
+        }
+
+        @Override
+        public boolean addAccessibilityStateChangeListener(AccessibilityManager manager,
+                AccessibilityStateChangeListenerCompat listener) {
+            return AccessibilityManagerCompatIcs.addAccessibilityStateChangeListener(manager,
+                    listener.mListener);
+        }
+
+        @Override
+        public boolean removeAccessibilityStateChangeListener(AccessibilityManager manager,
+                final AccessibilityStateChangeListenerCompat listener) {
+            return AccessibilityManagerCompatIcs.removeAccessibilityStateChangeListener(manager,
+                    listener.mListener);
+        }
+
+        @Override
+        public List<AccessibilityServiceInfo> getEnabledAccessibilityServiceList(
+                AccessibilityManager manager, int feedbackTypeFlags) {
+            return AccessibilityManagerCompatIcs.getEnabledAccessibilityServiceList(manager,
+                    feedbackTypeFlags);
+        }
+
+        @Override
+        public List<AccessibilityServiceInfo> getInstalledAccessibilityServiceList(
+                AccessibilityManager manager) {
+            return AccessibilityManagerCompatIcs.getInstalledAccessibilityServiceList(manager);
+        }
+
+        @Override
+        public boolean isTouchExplorationEnabled(AccessibilityManager manager) {
+            return AccessibilityManagerCompatIcs.isTouchExplorationEnabled(manager);
+        }
+    }
+
+    static {
+        if (Build.VERSION.SDK_INT >= 14) { // ICS
+            IMPL = new AccessibilityManagerIcsImpl();
+        } else {
+            IMPL = new AccessibilityManagerStubImpl();
+        }
+    }
+
+    private static final AccessibilityManagerVersionImpl IMPL;
+
+    /**
+     * Registers an {@link AccessibilityManager.AccessibilityStateChangeListener} for changes in
+     * the global accessibility state of the system.
+     *
+     * @param manager The accessibility manager.
+     * @param listener The listener.
+     * @return True if successfully registered.
+     */
+    public static boolean addAccessibilityStateChangeListener(AccessibilityManager manager,
+            AccessibilityStateChangeListenerCompat listener) {
+        return IMPL.addAccessibilityStateChangeListener(manager, listener);
+    }
+
+    /**
+     * Unregisters an {@link AccessibilityManager.AccessibilityStateChangeListener}.
+     *
+     * @param manager The accessibility manager.
+     * @param listener The listener.
+     * @return True if successfully unregistered.
+     */
+    public static boolean removeAccessibilityStateChangeListener(AccessibilityManager manager,
+            AccessibilityStateChangeListenerCompat listener) {
+        return IMPL.removeAccessibilityStateChangeListener(manager, listener);
+    }
+
+    /**
+     * Returns the {@link AccessibilityServiceInfo}s of the installed accessibility services.
+     *
+     * @param manager The accessibility manager.
+     * @return An unmodifiable list with {@link AccessibilityServiceInfo}s.
+     */
+    public static List<AccessibilityServiceInfo> getInstalledAccessibilityServiceList(
+            AccessibilityManager manager) {
+        return IMPL.getInstalledAccessibilityServiceList(manager);
+    }
+
+    /**
+     * Returns the {@link AccessibilityServiceInfo}s of the enabled accessibility services
+     * for a given feedback type.
+     *
+     * @param manager The accessibility manager.
+     * @param feedbackTypeFlags The feedback type flags.
+     * @return An unmodifiable list with {@link AccessibilityServiceInfo}s.
+     *
+     * @see AccessibilityServiceInfo#FEEDBACK_AUDIBLE
+     * @see AccessibilityServiceInfo#FEEDBACK_GENERIC
+     * @see AccessibilityServiceInfo#FEEDBACK_HAPTIC
+     * @see AccessibilityServiceInfo#FEEDBACK_SPOKEN
+     * @see AccessibilityServiceInfo#FEEDBACK_VISUAL
+     */
+    public static List<AccessibilityServiceInfo> getEnabledAccessibilityServiceList(
+            AccessibilityManager manager, int feedbackTypeFlags) {
+        return IMPL.getEnabledAccessibilityServiceList(manager, feedbackTypeFlags);
+    }
+
+    /**
+     * Returns if the touch exploration in the system is enabled.
+     *
+     * @param manager The accessibility manager.
+     * @return True if touch exploration is enabled, false otherwise.
+     */
+    public static boolean isTouchExplorationEnabled(AccessibilityManager manager) {
+        return IMPL.isTouchExplorationEnabled(manager);
+    }
+
+    /**
+     * Listener for the accessibility state.
+     */
+    public static abstract class AccessibilityStateChangeListenerCompat {
+        final Object mListener;
+
+        public AccessibilityStateChangeListenerCompat() {
+            mListener = IMPL.newAccessiblityStateChangeListener(this);
+        }
+
+        /**
+         * Called back on change in the accessibility state.
+         *
+         * @param enabled Whether accessibility is enabled.
+         */
+        public abstract void onAccessibilityStateChanged(boolean enabled);
+    }
+
+    private AccessibilityManagerCompat() {}
+}
diff --git a/compat/java/android/support/v4/view/accessibility/AccessibilityNodeInfoCompat.java b/compat/java/android/support/v4/view/accessibility/AccessibilityNodeInfoCompat.java
new file mode 100644
index 0000000..25afe36
--- /dev/null
+++ b/compat/java/android/support/v4/view/accessibility/AccessibilityNodeInfoCompat.java
@@ -0,0 +1,4363 @@
+/*
+ * 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 android.support.v4.view.accessibility;
+
+import android.graphics.Rect;
+import android.os.Build;
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.support.v4.accessibilityservice.AccessibilityServiceInfoCompat;
+import android.support.v4.view.ViewCompat;
+import android.text.InputType;
+import android.view.View;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * Helper for accessing {@link android.view.accessibility.AccessibilityNodeInfo}
+ * introduced after API level 4 in a backwards compatible fashion.
+ */
+public class AccessibilityNodeInfoCompat {
+
+    public static class AccessibilityActionCompat {
+
+        /**
+         * Action that gives input focus to the node.
+         */
+        public static final AccessibilityActionCompat ACTION_FOCUS =
+                new AccessibilityActionCompat(
+                        AccessibilityNodeInfoCompat.ACTION_FOCUS, null);
+
+        /**
+         * Action that clears input focus of the node.
+         */
+        public static final AccessibilityActionCompat ACTION_CLEAR_FOCUS =
+                new AccessibilityActionCompat(
+                        AccessibilityNodeInfoCompat.ACTION_CLEAR_FOCUS, null);
+
+        /**
+         *  Action that selects the node.
+         */
+        public static final AccessibilityActionCompat ACTION_SELECT =
+                new AccessibilityActionCompat(
+                        AccessibilityNodeInfoCompat.ACTION_SELECT, null);
+
+        /**
+         * Action that deselects the node.
+         */
+        public static final AccessibilityActionCompat ACTION_CLEAR_SELECTION =
+                new AccessibilityActionCompat(
+                        AccessibilityNodeInfoCompat.ACTION_CLEAR_SELECTION, null);
+
+        /**
+         * Action that clicks on the node info.
+         */
+        public static final AccessibilityActionCompat ACTION_CLICK =
+                new AccessibilityActionCompat(
+                        AccessibilityNodeInfoCompat.ACTION_CLICK, null);
+
+        /**
+         * Action that long clicks on the node.
+         */
+        public static final AccessibilityActionCompat ACTION_LONG_CLICK =
+                new AccessibilityActionCompat(
+                        AccessibilityNodeInfoCompat.ACTION_LONG_CLICK, null);
+
+        /**
+         * Action that gives accessibility focus to the node.
+         */
+        public static final AccessibilityActionCompat ACTION_ACCESSIBILITY_FOCUS =
+                new AccessibilityActionCompat(
+                        AccessibilityNodeInfoCompat.ACTION_ACCESSIBILITY_FOCUS, null);
+
+        /**
+         * Action that clears accessibility focus of the node.
+         */
+        public static final AccessibilityActionCompat ACTION_CLEAR_ACCESSIBILITY_FOCUS =
+                new AccessibilityActionCompat(
+                        AccessibilityNodeInfoCompat.ACTION_CLEAR_ACCESSIBILITY_FOCUS, null);
+
+        /**
+         * Action that requests to go to the next entity in this node's text
+         * at a given movement granularity. For example, move to the next character,
+         * word, etc.
+         * <p>
+         * <strong>Arguments:</strong>
+         * {@link AccessibilityNodeInfoCompat#ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT
+         *  AccessibilityNodeInfoCompat.ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT},
+         * {@link AccessibilityNodeInfoCompat#ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN
+         *  AccessibilityNodeInfoCompat.ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN}<br>
+         * <strong>Example:</strong> Move to the previous character and do not extend selection.
+         * <code><pre><p>
+         *   Bundle arguments = new Bundle();
+         *   arguments.putInt(AccessibilityNodeInfoCompat.ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT,
+         *           AccessibilityNodeInfoCompat.MOVEMENT_GRANULARITY_CHARACTER);
+         *   arguments.putBoolean(
+         *           AccessibilityNodeInfoCompat.ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN, false);
+         *   info.performAction(
+         *           AccessibilityActionCompat.ACTION_NEXT_AT_MOVEMENT_GRANULARITY.getId(),
+         *           arguments);
+         * </code></pre></p>
+         * </p>
+         *
+         * @see AccessibilityNodeInfoCompat#ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT
+         *  AccessibilityNodeInfoCompat.ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT
+         * @see AccessibilityNodeInfoCompat#ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN
+         *  AccessibilityNodeInfoCompat.ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN
+         *
+         * @see AccessibilityNodeInfoCompat#setMovementGranularities(int)
+         *  AccessibilityNodeInfoCompat.ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN
+         * @see AccessibilityNodeInfoCompat#getMovementGranularities()
+         *  AccessibilityNodeInfoCompat.getMovementGranularities()
+         *
+         * @see AccessibilityNodeInfoCompat#MOVEMENT_GRANULARITY_CHARACTER
+         *  AccessibilityNodeInfoCompat.MOVEMENT_GRANULARITY_CHARACTER
+         * @see AccessibilityNodeInfoCompat#MOVEMENT_GRANULARITY_WORD
+         *  AccessibilityNodeInfoCompat.MOVEMENT_GRANULARITY_WORD
+         * @see AccessibilityNodeInfoCompat#MOVEMENT_GRANULARITY_LINE
+         *  AccessibilityNodeInfoCompat.MOVEMENT_GRANULARITY_LINE
+         * @see AccessibilityNodeInfoCompat#MOVEMENT_GRANULARITY_PARAGRAPH
+         *  AccessibilityNodeInfoCompat.MOVEMENT_GRANULARITY_PARAGRAPH
+         * @see AccessibilityNodeInfoCompat#MOVEMENT_GRANULARITY_PAGE
+         *  AccessibilityNodeInfoCompat.MOVEMENT_GRANULARITY_PAGE
+         */
+        public static final AccessibilityActionCompat ACTION_NEXT_AT_MOVEMENT_GRANULARITY =
+                new AccessibilityActionCompat(
+                        AccessibilityNodeInfoCompat.ACTION_NEXT_AT_MOVEMENT_GRANULARITY, null);
+
+        /**
+         * Action that requests to go to the previous entity in this node's text
+         * at a given movement granularity. For example, move to the next character,
+         * word, etc.
+         * <p>
+         * <strong>Arguments:</strong>
+         * {@link AccessibilityNodeInfoCompat#ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT
+         *  AccessibilityNodeInfoCompat.ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT},
+         * {@link AccessibilityNodeInfoCompat#ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN
+         *  AccessibilityNodeInfoCompat.ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN}<br>
+         * <strong>Example:</strong> Move to the next character and do not extend selection.
+         * <code><pre><p>
+         *   Bundle arguments = new Bundle();
+         *   arguments.putInt(AccessibilityNodeInfoCompat.ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT,
+         *           AccessibilityNodeInfoCompat.MOVEMENT_GRANULARITY_CHARACTER);
+         *   arguments.putBoolean(
+         *           AccessibilityNodeInfoCompat.ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN, false);
+         *   info.performAction(
+         *           AccessibilityActionCompat.ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY.getId(),
+         *           arguments);
+         * </code></pre></p>
+         * </p>
+         *
+         * @see AccessibilityNodeInfoCompat#ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT
+         *  AccessibilityNodeInfoCompat.ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT
+         * @see AccessibilityNodeInfoCompat#ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN
+         *  AccessibilityNodeInfoCompat.ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN
+         *
+         * @see AccessibilityNodeInfoCompat#setMovementGranularities(int)
+         *   AccessibilityNodeInfoCompat.setMovementGranularities(int)
+         * @see AccessibilityNodeInfoCompat#getMovementGranularities()
+         *  AccessibilityNodeInfoCompat.getMovementGranularities()
+         *
+         * @see AccessibilityNodeInfoCompat#MOVEMENT_GRANULARITY_CHARACTER
+         *  AccessibilityNodeInfoCompat.MOVEMENT_GRANULARITY_CHARACTER
+         * @see AccessibilityNodeInfoCompat#MOVEMENT_GRANULARITY_WORD
+         *  AccessibilityNodeInfoCompat.MOVEMENT_GRANULARITY_WORD
+         * @see AccessibilityNodeInfoCompat#MOVEMENT_GRANULARITY_LINE
+         *  AccessibilityNodeInfoCompat.MOVEMENT_GRANULARITY_LINE
+         * @see AccessibilityNodeInfoCompat#MOVEMENT_GRANULARITY_PARAGRAPH
+         *  AccessibilityNodeInfoCompat.MOVEMENT_GRANULARITY_PARAGRAPH
+         * @see AccessibilityNodeInfoCompat#MOVEMENT_GRANULARITY_PAGE
+         *  AccessibilityNodeInfoCompat.MOVEMENT_GRANULARITY_PAGE
+         */
+        public static final AccessibilityActionCompat ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY =
+                new AccessibilityActionCompat(
+                        AccessibilityNodeInfoCompat.ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY, null);
+
+        /**
+         * Action to move to the next HTML element of a given type. For example, move
+         * to the BUTTON, INPUT, TABLE, etc.
+         * <p>
+         * <strong>Arguments:</strong>
+         * {@link AccessibilityNodeInfoCompat#ACTION_ARGUMENT_HTML_ELEMENT_STRING
+         *  AccessibilityNodeInfoCompat.ACTION_ARGUMENT_HTML_ELEMENT_STRING}<br>
+         * <strong>Example:</strong>
+         * <code><pre><p>
+         *   Bundle arguments = new Bundle();
+         *   arguments.putString(
+         *           AccessibilityNodeInfoCompat.ACTION_ARGUMENT_HTML_ELEMENT_STRING, "BUTTON");
+         *   info.performAction(
+         *           AccessibilityActionCompat.ACTION_NEXT_HTML_ELEMENT.getId(), arguments);
+         * </code></pre></p>
+         * </p>
+         */
+        public static final AccessibilityActionCompat ACTION_NEXT_HTML_ELEMENT =
+                new AccessibilityActionCompat(
+                        AccessibilityNodeInfoCompat.ACTION_NEXT_HTML_ELEMENT, null);
+
+        /**
+         * Action to move to the previous HTML element of a given type. For example, move
+         * to the BUTTON, INPUT, TABLE, etc.
+         * <p>
+         * <strong>Arguments:</strong>
+         * {@link AccessibilityNodeInfoCompat#ACTION_ARGUMENT_HTML_ELEMENT_STRING
+         *  AccessibilityNodeInfoCompat.ACTION_ARGUMENT_HTML_ELEMENT_STRING}<br>
+         * <strong>Example:</strong>
+         * <code><pre><p>
+         *   Bundle arguments = new Bundle();
+         *   arguments.putString(
+         *           AccessibilityNodeInfoCompat.ACTION_ARGUMENT_HTML_ELEMENT_STRING, "BUTTON");
+         *   info.performAction(
+         *           AccessibilityActionCompat.ACTION_PREVIOUS_HTML_ELEMENT.getId(), arguments);
+         * </code></pre></p>
+         * </p>
+         */
+        public static final AccessibilityActionCompat ACTION_PREVIOUS_HTML_ELEMENT =
+                new AccessibilityActionCompat(
+                        AccessibilityNodeInfoCompat.ACTION_PREVIOUS_HTML_ELEMENT, null);
+
+        /**
+         * Action to scroll the node content forward.
+         */
+        public static final AccessibilityActionCompat ACTION_SCROLL_FORWARD =
+                new AccessibilityActionCompat(
+                        AccessibilityNodeInfoCompat.ACTION_SCROLL_FORWARD, null);
+
+        /**
+         * Action to scroll the node content backward.
+         */
+        public static final AccessibilityActionCompat ACTION_SCROLL_BACKWARD =
+                new AccessibilityActionCompat(
+                        AccessibilityNodeInfoCompat.ACTION_SCROLL_BACKWARD, null);
+
+        /**
+         * Action to copy the current selection to the clipboard.
+         */
+        public static final AccessibilityActionCompat ACTION_COPY =
+                new AccessibilityActionCompat(
+                        AccessibilityNodeInfoCompat.ACTION_COPY, null);
+
+        /**
+         * Action to paste the current clipboard content.
+         */
+        public static final AccessibilityActionCompat ACTION_PASTE =
+                new AccessibilityActionCompat(
+                        AccessibilityNodeInfoCompat.ACTION_PASTE, null);
+
+        /**
+         * Action to cut the current selection and place it to the clipboard.
+         */
+        public static final AccessibilityActionCompat ACTION_CUT =
+                new AccessibilityActionCompat(
+                        AccessibilityNodeInfoCompat.ACTION_CUT, null);
+
+        /**
+         * Action to set the selection. Performing this action with no arguments
+         * clears the selection.
+         * <p>
+         * <strong>Arguments:</strong>
+         * {@link AccessibilityNodeInfoCompat#ACTION_ARGUMENT_SELECTION_START_INT
+         *  AccessibilityNodeInfoCompat.ACTION_ARGUMENT_SELECTION_START_INT},
+         * {@link AccessibilityNodeInfoCompat#ACTION_ARGUMENT_SELECTION_END_INT
+         *  AccessibilityNodeInfoCompat.ACTION_ARGUMENT_SELECTION_END_INT}<br>
+         * <strong>Example:</strong>
+         * <code><pre><p>
+         *   Bundle arguments = new Bundle();
+         *   arguments.putInt(AccessibilityNodeInfoCompat.ACTION_ARGUMENT_SELECTION_START_INT, 1);
+         *   arguments.putInt(AccessibilityNodeInfoCompat.ACTION_ARGUMENT_SELECTION_END_INT, 2);
+         *   info.performAction(AccessibilityActionCompat.ACTION_SET_SELECTION.getId(), arguments);
+         * </code></pre></p>
+         * </p>
+         *
+         * @see AccessibilityNodeInfoCompat#ACTION_ARGUMENT_SELECTION_START_INT
+         *  AccessibilityNodeInfoCompat.ACTION_ARGUMENT_SELECTION_START_INT
+         * @see AccessibilityNodeInfoCompat#ACTION_ARGUMENT_SELECTION_END_INT
+         *  AccessibilityNodeInfoCompat.ACTION_ARGUMENT_SELECTION_END_INT
+         */
+        public static final AccessibilityActionCompat ACTION_SET_SELECTION =
+                new AccessibilityActionCompat(
+                        AccessibilityNodeInfoCompat.ACTION_SET_SELECTION, null);
+
+        /**
+         * Action to expand an expandable node.
+         */
+        public static final AccessibilityActionCompat ACTION_EXPAND =
+                new AccessibilityActionCompat(
+                        AccessibilityNodeInfoCompat.ACTION_EXPAND, null);
+
+        /**
+         * Action to collapse an expandable node.
+         */
+        public static final AccessibilityActionCompat ACTION_COLLAPSE =
+                new AccessibilityActionCompat(
+                        AccessibilityNodeInfoCompat.ACTION_COLLAPSE, null);
+
+        /**
+         * Action to dismiss a dismissable node.
+         */
+        public static final AccessibilityActionCompat ACTION_DISMISS =
+                new AccessibilityActionCompat(
+                        AccessibilityNodeInfoCompat.ACTION_DISMISS, null);
+
+        /**
+         * Action that sets the text of the node. Performing the action without argument,
+         * using <code> null</code> or empty {@link CharSequence} will clear the text. This
+         * action will also put the cursor at the end of text.
+         * <p>
+         * <strong>Arguments:</strong>
+         * {@link AccessibilityNodeInfoCompat#ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE
+         *  AccessibilityNodeInfoCompat.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE}<br>
+         * <strong>Example:</strong>
+         * <code><pre><p>
+         *   Bundle arguments = new Bundle();
+         *   arguments.putCharSequence(AccessibilityNodeInfoCompat.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE,
+         *       "android");
+         *   info.performAction(AccessibilityActionCompat.ACTION_SET_TEXT.getId(), arguments);
+         * </code></pre></p>
+         */
+        public static final AccessibilityActionCompat ACTION_SET_TEXT =
+                new AccessibilityActionCompat(
+                        AccessibilityNodeInfoCompat.ACTION_SET_TEXT, null);
+
+        /**
+         * Action that requests the node make its bounding rectangle visible
+         * on the screen, scrolling if necessary just enough.
+         *
+         * @see View#requestRectangleOnScreen(Rect)
+         */
+        public static final AccessibilityActionCompat ACTION_SHOW_ON_SCREEN =
+                new AccessibilityActionCompat(IMPL.getActionShowOnScreen());
+
+        /**
+         * Action that scrolls the node to make the specified collection
+         * position visible on screen.
+         * <p>
+         * <strong>Arguments:</strong>
+         * <ul>
+         *     <li>{@link AccessibilityNodeInfoCompat#ACTION_ARGUMENT_ROW_INT}</li>
+         *     <li>{@link AccessibilityNodeInfoCompat#ACTION_ARGUMENT_COLUMN_INT}</li>
+         * <ul>
+         *
+         * @see AccessibilityNodeInfoCompat#getCollectionInfo()
+         */
+        public static final AccessibilityActionCompat ACTION_SCROLL_TO_POSITION =
+                new AccessibilityActionCompat(IMPL.getActionScrollToPosition());
+
+        /**
+         * Action to scroll the node content up.
+         */
+        public static final AccessibilityActionCompat ACTION_SCROLL_UP =
+                new AccessibilityActionCompat(IMPL.getActionScrollUp());
+
+        /**
+         * Action to scroll the node content left.
+         */
+        public static final AccessibilityActionCompat ACTION_SCROLL_LEFT =
+                new AccessibilityActionCompat(IMPL.getActionScrollLeft());
+
+        /**
+         * Action to scroll the node content down.
+         */
+        public static final AccessibilityActionCompat ACTION_SCROLL_DOWN =
+                new AccessibilityActionCompat(IMPL.getActionScrollDown());
+
+        /**
+         * Action to scroll the node content right.
+         */
+        public static final AccessibilityActionCompat ACTION_SCROLL_RIGHT =
+                new AccessibilityActionCompat(IMPL.getActionScrollRight());
+
+        /**
+         * Action that context clicks the node.
+         */
+        public static final AccessibilityActionCompat ACTION_CONTEXT_CLICK =
+                new AccessibilityActionCompat(IMPL.getActionContextClick());
+
+        /**
+         * Action that sets progress between {@link  RangeInfoCompat#getMin() RangeInfo.getMin()} and
+         * {@link  RangeInfoCompat#getMax() RangeInfo.getMax()}. It should use the same value type as
+         * {@link RangeInfoCompat#getType() RangeInfo.getType()}
+         * <p>
+         * <strong>Arguments:</strong>
+         * {@link AccessibilityNodeInfoCompat#ACTION_ARGUMENT_PROGRESS_VALUE}
+         *
+         * @see RangeInfoCompat
+         */
+        public static final AccessibilityActionCompat ACTION_SET_PROGRESS =
+                new AccessibilityActionCompat(IMPL.getActionSetProgress());
+
+        private final Object mAction;
+
+        /**
+         * Creates a new instance.
+         *
+         * @param actionId The action id.
+         * @param label The action label.
+         */
+        public AccessibilityActionCompat(int actionId, CharSequence label) {
+            this(IMPL.newAccessibilityAction(actionId, label));
+        }
+
+        private AccessibilityActionCompat(Object action) {
+            mAction = action;
+        }
+
+        /**
+         * Gets the id for this action.
+         *
+         * @return The action id.
+         */
+        public int getId() {
+            return IMPL.getAccessibilityActionId(mAction);
+        }
+
+        /**
+         * Gets the label for this action. Its purpose is to describe the
+         * action to user.
+         *
+         * @return The label.
+         */
+        public CharSequence getLabel() {
+            return IMPL.getAccessibilityActionLabel(mAction);
+        }
+    }
+
+    public static class CollectionInfoCompat {
+        /** Selection mode where items are not selectable. */
+        public static final int SELECTION_MODE_NONE = 0;
+
+        /** Selection mode where a single item may be selected. */
+        public static final int SELECTION_MODE_SINGLE = 1;
+
+        /** Selection mode where multiple items may be selected. */
+        public static final int SELECTION_MODE_MULTIPLE = 2;
+
+        final Object mInfo;
+
+        /**
+         * Returns a cached instance if such is available otherwise a new one.
+         *
+         * @return An instance.
+         */
+        public static CollectionInfoCompat obtain(int rowCount, int columnCount,
+                boolean hierarchical, int selectionMode) {
+            return new CollectionInfoCompat(IMPL.obtainCollectionInfo(rowCount, columnCount,
+                    hierarchical, selectionMode));
+        }
+
+        public static CollectionInfoCompat obtain(int rowCount, int columnCount,
+                boolean hierarchical) {
+            return new CollectionInfoCompat(IMPL.obtainCollectionInfo(rowCount, columnCount,
+                    hierarchical));
+        }
+
+        private CollectionInfoCompat(Object info) {
+            mInfo = info;
+        }
+
+        public int getColumnCount() {
+            return IMPL.getCollectionInfoColumnCount(mInfo);
+        }
+
+        public int getRowCount() {
+            return IMPL.getCollectionInfoRowCount(mInfo);
+        }
+
+        public boolean isHierarchical() {
+            return IMPL.isCollectionInfoHierarchical(mInfo);
+        }
+
+        public int getSelectionMode() {
+            return IMPL.getCollectionInfoSelectionMode(mInfo);
+        }
+    }
+
+    public static class CollectionItemInfoCompat {
+
+        private final Object mInfo;
+
+        /**
+         * Returns a cached instance if such is available otherwise a new one.
+         *
+         * @return An instance.
+         */
+        public static CollectionItemInfoCompat obtain(int rowIndex, int rowSpan,
+                int columnIndex, int columnSpan, boolean heading, boolean selected) {
+            return new CollectionItemInfoCompat(IMPL.obtainCollectionItemInfo(rowIndex, rowSpan,
+                    columnIndex, columnSpan, heading, selected));
+        }
+
+        public static CollectionItemInfoCompat obtain(int rowIndex, int rowSpan,
+                int columnIndex, int columnSpan, boolean heading) {
+            return new CollectionItemInfoCompat(IMPL.obtainCollectionItemInfo(rowIndex, rowSpan,
+                    columnIndex, columnSpan, heading));
+        }
+
+        private CollectionItemInfoCompat(Object info) {
+            mInfo = info;
+        }
+
+        public int getColumnIndex() {
+            return IMPL.getCollectionItemColumnIndex(mInfo);
+        }
+
+        public int getColumnSpan() {
+            return IMPL.getCollectionItemColumnSpan(mInfo);
+        }
+
+        public int getRowIndex() {
+            return IMPL.getCollectionItemRowIndex(mInfo);
+        }
+
+        public int getRowSpan() {
+            return IMPL.getCollectionItemRowSpan(mInfo);
+        }
+
+        public boolean isHeading() {
+            return IMPL.isCollectionItemHeading(mInfo);
+        }
+
+        public boolean isSelected() {
+            return IMPL.isCollectionItemSelected(mInfo);
+        }
+    }
+
+    public static class RangeInfoCompat {
+        /** Range type: integer. */
+        public static final int RANGE_TYPE_INT = 0;
+        /** Range type: float. */
+        public static final int RANGE_TYPE_FLOAT = 1;
+        /** Range type: percent with values from zero to one.*/
+        public static final int RANGE_TYPE_PERCENT = 2;
+
+        public static RangeInfoCompat obtain(int type, float min, float max, float current) {
+            return new RangeInfoCompat(IMPL.obtainRangeInfo(type, min, max, current));
+        }
+
+        private final Object mInfo;
+
+        private RangeInfoCompat(Object info) {
+            mInfo = info;
+        }
+
+        public float getCurrent() {
+            return AccessibilityNodeInfoCompatKitKat.RangeInfo.getCurrent(mInfo);
+        }
+
+        public float getMax() {
+            return AccessibilityNodeInfoCompatKitKat.RangeInfo.getMax(mInfo);
+        }
+
+        public float getMin() {
+            return AccessibilityNodeInfoCompatKitKat.RangeInfo.getMin(mInfo);
+        }
+
+        public int getType() {
+            return AccessibilityNodeInfoCompatKitKat.RangeInfo.getType(mInfo);
+        }
+    }
+
+    interface AccessibilityNodeInfoImpl {
+        Object newAccessibilityAction(int actionId, CharSequence label);
+        Object obtain();
+        Object obtain(View source);
+        Object obtain(Object info);
+        Object obtain(View root, int virtualDescendantId);
+        void setSource(Object info, View source);
+        void setSource(Object info, View root, int virtualDescendantId);
+        Object findFocus(Object info, int focus);
+        Object focusSearch(Object info, int direction);
+        int getWindowId(Object info);
+        int getChildCount(Object info);
+        Object getChild(Object info, int index);
+        void addChild(Object info, View child);
+        void addChild(Object info, View child, int virtualDescendantId);
+        boolean removeChild(Object info, View child);
+        boolean removeChild(Object info, View root, int virtualDescendantId);
+        int getActions(Object info);
+        void addAction(Object info, int action);
+        void addAction(Object info, Object action);
+        boolean removeAction(Object info, Object action);
+        int getAccessibilityActionId(Object action);
+        CharSequence getAccessibilityActionLabel(Object action);
+        boolean performAction(Object info, int action);
+        boolean performAction(Object info, int action, Bundle arguments);
+        void setMovementGranularities(Object info, int granularities);
+        int getMovementGranularities(Object info);
+        List<Object> findAccessibilityNodeInfosByText(Object info, String text);
+        Object getParent(Object info);
+        void setParent(Object info, View root, int virtualDescendantId);
+        void setParent(Object info, View parent);
+        void getBoundsInParent(Object info, Rect outBounds);
+        void setBoundsInParent(Object info, Rect bounds);
+        void getBoundsInScreen(Object info, Rect outBounds);
+        void setBoundsInScreen(Object info, Rect bounds);
+        boolean isCheckable(Object info);
+        void setCheckable(Object info, boolean checkable);
+        boolean isChecked(Object info);
+        void setChecked(Object info, boolean checked);
+        boolean isFocusable(Object info);
+        void setFocusable(Object info, boolean focusable);
+        boolean isFocused(Object info);
+        void setFocused(Object info, boolean focused);
+        boolean isVisibleToUser(Object info);
+        void setVisibleToUser(Object info, boolean visibleToUser);
+        boolean isAccessibilityFocused(Object info);
+        void setAccessibilityFocused(Object info, boolean focused);
+        boolean isSelected(Object info);
+        void setSelected(Object info, boolean selected);
+        boolean isClickable(Object info);
+        void setClickable(Object info, boolean clickable);
+        boolean isLongClickable(Object info);
+        void setLongClickable(Object info, boolean longClickable);
+        boolean isEnabled(Object info);
+        void setEnabled(Object info, boolean enabled);
+        boolean isPassword(Object info);
+        void setPassword(Object info, boolean password);
+        boolean isScrollable(Object info);
+        void setScrollable(Object info, boolean scrollable);
+        CharSequence getPackageName(Object info);
+        void setPackageName(Object info, CharSequence packageName);
+        CharSequence getClassName(Object info);
+        void setClassName(Object info, CharSequence className);
+        CharSequence getText(Object info);
+        void setText(Object info, CharSequence text);
+        CharSequence getContentDescription(Object info);
+        void setContentDescription(Object info, CharSequence contentDescription);
+        void recycle(Object info);
+        String getViewIdResourceName(Object info);
+        void setViewIdResourceName(Object info, String viewId);
+        int getLiveRegion(Object info);
+        void setLiveRegion(Object info, int mode);
+        Object getCollectionInfo(Object info);
+        void setCollectionInfo(Object info, Object collectionInfo);
+        Object getCollectionItemInfo(Object info);
+        void setCollectionItemInfo(Object info, Object collectionItemInfo);
+        Object getRangeInfo(Object info);
+        void setRangeInfo(Object info, Object rangeInfo);
+        List<Object> getActionList(Object info);
+        Object obtainCollectionInfo(int rowCount, int columnCount, boolean hierarchical,
+                int selectionMode);
+        Object obtainCollectionInfo(int rowCount, int columnCount, boolean hierarchical);
+        int getCollectionInfoColumnCount(Object info);
+        int getCollectionInfoRowCount(Object info);
+        boolean isCollectionInfoHierarchical(Object info);
+        int getCollectionInfoSelectionMode(Object info);
+        Object obtainCollectionItemInfo(int rowIndex, int rowSpan, int columnIndex,
+                int columnSpan, boolean heading, boolean selected);
+        Object obtainCollectionItemInfo(int rowIndex, int rowSpan, int columnIndex,
+                int columnSpan, boolean heading);
+        int getCollectionItemColumnIndex(Object info);
+        int getCollectionItemColumnSpan(Object info);
+        int getCollectionItemRowIndex(Object info);
+        int getCollectionItemRowSpan(Object info);
+        boolean isCollectionItemHeading(Object info);
+        boolean isCollectionItemSelected(Object info);
+        Object obtainRangeInfo(int type, float min, float max, float current);
+        Object getTraversalBefore(Object info);
+        void setTraversalBefore(Object info, View view);
+        void setTraversalBefore(Object info, View root, int virtualDescendantId);
+        Object getTraversalAfter(Object info);
+        void setTraversalAfter(Object info, View view);
+        void setTraversalAfter(Object info, View root, int virtualDescendantId);
+        void setContentInvalid(Object info, boolean contentInvalid);
+        boolean isContentInvalid(Object info);
+        void setError(Object info, CharSequence error);
+        CharSequence getError(Object info);
+        void setLabelFor(Object info, View labeled);
+        void setLabelFor(Object info, View root, int virtualDescendantId);
+        Object getLabelFor(Object info);
+        void setLabeledBy(Object info, View labeled);
+        void setLabeledBy(Object info, View root, int virtualDescendantId);
+        Object getLabeledBy(Object info);
+        boolean canOpenPopup(Object info);
+        void setCanOpenPopup(Object info, boolean opensPopup);
+        List<Object> findAccessibilityNodeInfosByViewId(Object info, String viewId);
+        Bundle getExtras(Object info);
+        int getInputType(Object info);
+        void setInputType(Object info, int inputType);
+        void setMaxTextLength(Object info, int max);
+        int getMaxTextLength(Object info);
+        void setTextSelection(Object info, int start, int end);
+        int getTextSelectionStart(Object info);
+        int getTextSelectionEnd(Object info);
+        Object getWindow(Object info);
+        boolean isDismissable(Object info);
+        void setDismissable(Object info, boolean dismissable);
+        boolean isEditable(Object info);
+        void setEditable(Object info, boolean editable);
+        int getDrawingOrder(Object info);
+        void setDrawingOrder(Object info, int drawingOrderInParent);
+        boolean isImportantForAccessibility(Object info);
+        void setImportantForAccessibility(Object info, boolean importantForAccessibility);
+        boolean isMultiLine(Object info);
+        void setMultiLine(Object info, boolean multiLine);
+        boolean refresh(Object info);
+        CharSequence getRoleDescription(Object info);
+        void setRoleDescription(Object info, CharSequence roleDescription);
+        Object getActionScrollToPosition();
+        Object getActionSetProgress();
+        boolean isContextClickable(Object info);
+        void setContextClickable(Object info, boolean contextClickable);
+        Object getActionShowOnScreen();
+        Object getActionScrollUp();
+        Object getActionScrollDown();
+        Object getActionScrollLeft();
+        Object getActionScrollRight();
+        Object getActionContextClick();
+    }
+
+    static class AccessibilityNodeInfoStubImpl implements AccessibilityNodeInfoImpl {
+        @Override
+        public Object newAccessibilityAction(int actionId, CharSequence label) {
+            return null;
+        }
+
+        @Override
+        public Object obtain() {
+            return null;
+        }
+
+        @Override
+        public Object obtain(View source) {
+            return null;
+        }
+
+        @Override
+        public Object obtain(View root, int virtualDescendantId) {
+            return null;
+        }
+
+        @Override
+        public Object obtain(Object info) {
+            return null;
+        }
+
+        @Override
+        public void addAction(Object info, int action) {
+
+        }
+
+        @Override
+        public void addAction(Object info, Object action) {
+
+        }
+
+        @Override
+        public boolean removeAction(Object info, Object action) {
+            return false;
+        }
+
+        @Override
+        public int getAccessibilityActionId(Object action) {
+            return 0;
+        }
+
+        @Override
+        public CharSequence getAccessibilityActionLabel(Object action) {
+            return null;
+        }
+
+        @Override
+        public void addChild(Object info, View child) {
+
+        }
+
+        @Override
+        public void addChild(Object info, View child, int virtualDescendantId) {
+
+        }
+
+        @Override
+        public boolean removeChild(Object info, View child) {
+            return false;
+        }
+
+        @Override
+        public boolean removeChild(Object info, View root, int virtualDescendantId) {
+            return false;
+        }
+
+        @Override
+        public List<Object> findAccessibilityNodeInfosByText(Object info, String text) {
+            return Collections.emptyList();
+        }
+
+        @Override
+        public int getActions(Object info) {
+            return 0;
+        }
+
+        @Override
+        public void getBoundsInParent(Object info, Rect outBounds) {
+
+        }
+
+        @Override
+        public void getBoundsInScreen(Object info, Rect outBounds) {
+
+        }
+
+        @Override
+        public Object getChild(Object info, int index) {
+            return null;
+        }
+
+        @Override
+        public int getChildCount(Object info) {
+            return 0;
+        }
+
+        @Override
+        public CharSequence getClassName(Object info) {
+            return null;
+        }
+
+        @Override
+        public CharSequence getContentDescription(Object info) {
+            return null;
+        }
+
+        @Override
+        public CharSequence getPackageName(Object info) {
+            return null;
+        }
+
+        @Override
+        public Object getParent(Object info) {
+            return null;
+        }
+
+        @Override
+        public CharSequence getText(Object info) {
+            return null;
+        }
+
+        @Override
+        public int getWindowId(Object info) {
+            return 0;
+        }
+
+        @Override
+        public boolean isCheckable(Object info) {
+            return false;
+        }
+
+        @Override
+        public boolean isChecked(Object info) {
+            return false;
+        }
+
+        @Override
+        public boolean isClickable(Object info) {
+            return false;
+        }
+
+        @Override
+        public boolean isEnabled(Object info) {
+            return false;
+        }
+
+        @Override
+        public boolean isFocusable(Object info) {
+            return false;
+        }
+
+        @Override
+        public boolean isFocused(Object info) {
+            return false;
+        }
+
+        @Override
+        public boolean isVisibleToUser(Object info) {
+            return false;
+        }
+
+        @Override
+        public boolean isAccessibilityFocused(Object info) {
+            return false;
+        }
+
+        @Override
+        public boolean isLongClickable(Object info) {
+            return false;
+        }
+
+        @Override
+        public boolean isPassword(Object info) {
+            return false;
+        }
+
+        @Override
+        public boolean isScrollable(Object info) {
+            return false;
+        }
+
+        @Override
+        public boolean isSelected(Object info) {
+            return false;
+        }
+
+        @Override
+        public boolean performAction(Object info, int action) {
+            return false;
+        }
+
+        @Override
+        public boolean performAction(Object info, int action, Bundle arguments) {
+            return false;
+        }
+
+        @Override
+        public void setMovementGranularities(Object info, int granularities) {
+
+        }
+
+        @Override
+        public int getMovementGranularities(Object info) {
+            return 0;
+        }
+
+        @Override
+        public void setBoundsInParent(Object info, Rect bounds) {
+
+        }
+
+        @Override
+        public void setBoundsInScreen(Object info, Rect bounds) {
+
+        }
+
+        @Override
+        public void setCheckable(Object info, boolean checkable) {
+
+        }
+
+        @Override
+        public void setChecked(Object info, boolean checked) {
+
+        }
+
+        @Override
+        public void setClassName(Object info, CharSequence className) {
+
+        }
+
+        @Override
+        public void setClickable(Object info, boolean clickable) {
+
+        }
+
+        @Override
+        public void setContentDescription(Object info, CharSequence contentDescription) {
+
+        }
+
+        @Override
+        public void setEnabled(Object info, boolean enabled) {
+
+        }
+
+        @Override
+        public void setFocusable(Object info, boolean focusable) {
+
+        }
+
+        @Override
+        public void setFocused(Object info, boolean focused) {
+
+        }
+
+        @Override
+        public void setVisibleToUser(Object info, boolean visibleToUser) {
+
+        }
+
+        @Override
+        public void setAccessibilityFocused(Object info, boolean focused) {
+
+        }
+
+        @Override
+        public void setLongClickable(Object info, boolean longClickable) {
+
+        }
+
+        @Override
+        public void setPackageName(Object info, CharSequence packageName) {
+
+        }
+
+        @Override
+        public void setParent(Object info, View parent) {
+
+        }
+
+        @Override
+        public void setPassword(Object info, boolean password) {
+
+        }
+
+        @Override
+        public void setScrollable(Object info, boolean scrollable) {
+
+        }
+
+        @Override
+        public void setSelected(Object info, boolean selected) {
+
+        }
+
+        @Override
+        public void setSource(Object info, View source) {
+
+        }
+
+        @Override
+        public void setSource(Object info, View root, int virtualDescendantId) {
+
+        }
+
+        @Override
+        public Object findFocus(Object info, int focus) {
+            return null;
+        }
+
+        @Override
+        public Object focusSearch(Object info, int direction) {
+            return null;
+        }
+
+        @Override
+        public void setText(Object info, CharSequence text) {
+
+        }
+
+        @Override
+        public void recycle(Object info) {
+
+        }
+
+        @Override
+        public void setParent(Object info, View root, int virtualDescendantId) {
+
+        }
+
+        @Override
+        public String getViewIdResourceName(Object info) {
+            return null;
+        }
+
+        @Override
+        public void setViewIdResourceName(Object info, String viewId) {
+
+        }
+
+        @Override
+        public int getLiveRegion(Object info) {
+            return ViewCompat.ACCESSIBILITY_LIVE_REGION_NONE;
+        }
+
+        @Override
+        public void setLiveRegion(Object info, int mode) {
+            // No-op
+        }
+
+        @Override
+        public Object getCollectionInfo(Object info) {
+            return null;
+        }
+
+        @Override
+        public void setCollectionInfo(Object info, Object collectionInfo) {
+        }
+
+        @Override
+        public Object getCollectionItemInfo(Object info) {
+            return null;
+        }
+
+        @Override
+        public void setCollectionItemInfo(Object info, Object collectionItemInfo) {
+        }
+
+        @Override
+        public Object getRangeInfo(Object info) {
+            return null;
+        }
+
+        @Override
+        public void setRangeInfo(Object info, Object rangeInfo) {
+        }
+
+        @Override
+        public List<Object> getActionList(Object info) {
+            return null;
+        }
+
+        @Override
+        public Object obtainCollectionInfo(int rowCount, int columnCount, boolean hierarchical,
+                int selectionMode) {
+            return null;
+        }
+
+        @Override
+        public Object obtainCollectionInfo(int rowCount, int columnCount, boolean hierarchical) {
+            return null;
+        }
+
+        @Override
+        public int getCollectionInfoColumnCount(Object info) {
+            return 0;
+        }
+
+        @Override
+        public int getCollectionInfoRowCount(Object info) {
+            return 0;
+        }
+
+        @Override
+        public boolean isCollectionInfoHierarchical(Object info) {
+            return false;
+        }
+
+        @Override
+        public Object obtainCollectionItemInfo(int rowIndex, int rowSpan, int columnIndex,
+                int columnSpan, boolean heading, boolean selected) {
+            return null;
+        }
+
+        @Override
+        public Object obtainCollectionItemInfo(int rowIndex, int rowSpan, int columnIndex,
+                int columnSpan, boolean heading) {
+            return null;
+        }
+
+        @Override
+        public int getCollectionItemColumnIndex(Object info) {
+            return 0;
+        }
+
+        @Override
+        public int getCollectionItemColumnSpan(Object info) {
+            return 0;
+        }
+
+        @Override
+        public int getCollectionItemRowIndex(Object info) {
+            return 0;
+        }
+
+        @Override
+        public int getCollectionItemRowSpan(Object info) {
+            return 0;
+        }
+
+        @Override
+        public boolean isCollectionItemHeading(Object info) {
+            return false;
+        }
+
+        @Override
+        public boolean isCollectionItemSelected(Object info) {
+            return false;
+        }
+
+        @Override
+        public Object obtainRangeInfo(int type, float min, float max, float current) {
+            return null;
+        }
+
+        @Override
+        public Object getTraversalBefore(Object info) {
+            return null;
+        }
+
+        @Override
+        public void setTraversalBefore(Object info, View view) {
+        }
+
+        @Override
+        public void setTraversalBefore(Object info, View root, int virtualDescendantId) {
+        }
+
+        @Override
+        public Object getTraversalAfter(Object info) {
+            return null;
+        }
+
+        @Override
+        public void setTraversalAfter(Object info, View view) {
+        }
+
+        @Override
+        public void setTraversalAfter(Object info, View root, int virtualDescendantId) {
+        }
+
+        @Override
+        public void setContentInvalid(Object info, boolean contentInvalid) {
+        }
+
+        @Override
+        public boolean isContentInvalid(Object info) {
+            return false;
+        }
+
+        @Override
+        public void setError(Object info, CharSequence error) {
+        }
+
+        @Override
+        public CharSequence getError(Object info) {
+            return null;
+        }
+
+        @Override
+        public void setLabelFor(Object info, View labeled) {
+        }
+
+        @Override
+        public void setLabelFor(Object info, View root, int virtualDescendantId) {
+        }
+
+        @Override
+        public Object getLabelFor(Object info) {
+            return null;
+        }
+
+        @Override
+        public void setLabeledBy(Object info, View labeled) {
+        }
+
+        @Override
+        public void setLabeledBy(Object info, View root, int virtualDescendantId) {
+        }
+
+        @Override
+        public Object getLabeledBy(Object info){
+            return null;
+        }
+
+        @Override
+        public boolean canOpenPopup(Object info) {
+            return false;
+        }
+
+        @Override
+        public void setCanOpenPopup(Object info, boolean opensPopup) {
+        }
+
+        @Override
+        public List<Object> findAccessibilityNodeInfosByViewId(Object info, String viewId) {
+            return  Collections.emptyList();
+        }
+
+        @Override
+        public Bundle getExtras(Object info) {
+            return new Bundle();
+        }
+
+        @Override
+        public int getInputType(Object info) {
+            return InputType.TYPE_NULL;
+        }
+
+        @Override
+        public void setInputType(Object info, int inputType) {
+        }
+
+        @Override
+        public void setMaxTextLength(Object info, int max) {
+        }
+
+        @Override
+        public int getMaxTextLength(Object info) {
+            return -1;
+        }
+
+        @Override
+        public void setTextSelection(Object info, int start, int end) {
+        }
+
+        @Override
+        public int getTextSelectionStart(Object info) {
+            return -1;
+        }
+
+        @Override
+        public int getTextSelectionEnd(Object info) {
+            return -1;
+        }
+
+        @Override
+        public Object getWindow(Object info) {
+            return null;
+        }
+
+        @Override
+        public boolean isDismissable(Object info) {
+            return false;
+        }
+
+        @Override
+        public void setDismissable(Object info, boolean dismissable) {
+        }
+
+        @Override
+        public boolean isEditable(Object info) {
+            return false;
+        }
+
+        @Override
+        public void setEditable(Object info, boolean editable) {
+        }
+
+        @Override
+        public boolean isMultiLine(Object info) {
+            return false;
+        }
+
+        @Override
+        public void setMultiLine(Object info, boolean multiLine) {
+        }
+
+        @Override
+        public boolean refresh(Object info) {
+            return false;
+        }
+
+        @Override
+        public CharSequence getRoleDescription(Object info) {
+            return null;
+        }
+
+        @Override
+        public void setRoleDescription(Object info, CharSequence roleDescription) {
+        }
+
+        @Override
+        public Object getActionScrollToPosition() {
+            return null;
+        }
+
+        @Override
+        public Object getActionSetProgress() {
+            return null;
+        }
+
+        @Override
+        public boolean isContextClickable(Object info) {
+            return false;
+        }
+
+        @Override
+        public void setContextClickable(Object info, boolean contextClickable) {
+            // Do nothing.
+        }
+
+        @Override
+        public Object getActionShowOnScreen() {
+            return null;
+        }
+
+        @Override
+        public Object getActionScrollUp() {
+            return null;
+        }
+
+        @Override
+        public Object getActionScrollDown() {
+            return null;
+        }
+
+        @Override
+        public Object getActionScrollLeft() {
+            return null;
+        }
+
+        @Override
+        public Object getActionScrollRight() {
+            return null;
+        }
+
+        @Override
+        public Object getActionContextClick() {
+            return null;
+        }
+
+        @Override
+        public int getCollectionInfoSelectionMode(Object info) {
+            return 0;
+        }
+
+        @Override
+        public int getDrawingOrder(Object info) {
+            return 0;
+        }
+
+        @Override
+        public void setDrawingOrder(Object info, int drawingOrderInParent) {
+        }
+
+        @Override
+        public boolean isImportantForAccessibility(Object info) {
+            return true;
+        }
+
+        @Override
+        public void setImportantForAccessibility(Object info, boolean importantForAccessibility) {
+        }
+    }
+
+    static class AccessibilityNodeInfoIcsImpl extends AccessibilityNodeInfoStubImpl {
+        @Override
+        public Object obtain() {
+            return AccessibilityNodeInfoCompatIcs.obtain();
+        }
+
+        @Override
+        public Object obtain(View source) {
+            return AccessibilityNodeInfoCompatIcs.obtain(source);
+        }
+
+        @Override
+        public Object obtain(Object info) {
+            return AccessibilityNodeInfoCompatIcs.obtain(info);
+        }
+
+        @Override
+        public void addAction(Object info, int action) {
+            AccessibilityNodeInfoCompatIcs.addAction(info, action);
+        }
+
+        @Override
+        public void addChild(Object info, View child) {
+            AccessibilityNodeInfoCompatIcs.addChild(info, child);
+        }
+
+        @Override
+        public List<Object> findAccessibilityNodeInfosByText(Object info, String text) {
+            return AccessibilityNodeInfoCompatIcs.findAccessibilityNodeInfosByText(info, text);
+        }
+
+        @Override
+        public int getActions(Object info) {
+            return AccessibilityNodeInfoCompatIcs.getActions(info);
+        }
+
+        @Override
+        public void getBoundsInParent(Object info, Rect outBounds) {
+            AccessibilityNodeInfoCompatIcs.getBoundsInParent(info, outBounds);
+        }
+
+        @Override
+        public void getBoundsInScreen(Object info, Rect outBounds) {
+            AccessibilityNodeInfoCompatIcs.getBoundsInScreen(info, outBounds);
+        }
+
+        @Override
+        public Object getChild(Object info, int index) {
+            return AccessibilityNodeInfoCompatIcs.getChild(info, index);
+        }
+
+        @Override
+        public int getChildCount(Object info) {
+            return AccessibilityNodeInfoCompatIcs.getChildCount(info);
+        }
+
+        @Override
+        public CharSequence getClassName(Object info) {
+            return AccessibilityNodeInfoCompatIcs.getClassName(info);
+        }
+
+        @Override
+        public CharSequence getContentDescription(Object info) {
+            return AccessibilityNodeInfoCompatIcs.getContentDescription(info);
+        }
+
+        @Override
+        public CharSequence getPackageName(Object info) {
+            return AccessibilityNodeInfoCompatIcs.getPackageName(info);
+        }
+
+        @Override
+        public Object getParent(Object info) {
+            return AccessibilityNodeInfoCompatIcs.getParent(info);
+        }
+
+        @Override
+        public CharSequence getText(Object info) {
+            return AccessibilityNodeInfoCompatIcs.getText(info);
+        }
+
+        @Override
+        public int getWindowId(Object info) {
+            return AccessibilityNodeInfoCompatIcs.getWindowId(info);
+        }
+
+        @Override
+        public boolean isCheckable(Object info) {
+            return AccessibilityNodeInfoCompatIcs.isCheckable(info);
+        }
+
+        @Override
+        public boolean isChecked(Object info) {
+            return AccessibilityNodeInfoCompatIcs.isChecked(info);
+        }
+
+        @Override
+        public boolean isClickable(Object info) {
+            return AccessibilityNodeInfoCompatIcs.isClickable(info);
+        }
+
+        @Override
+        public boolean isEnabled(Object info) {
+            return AccessibilityNodeInfoCompatIcs.isEnabled(info);
+        }
+
+        @Override
+        public boolean isFocusable(Object info) {
+            return AccessibilityNodeInfoCompatIcs.isFocusable(info);
+        }
+
+        @Override
+        public boolean isFocused(Object info) {
+            return AccessibilityNodeInfoCompatIcs.isFocused(info);
+        }
+
+        @Override
+        public boolean isLongClickable(Object info) {
+            return AccessibilityNodeInfoCompatIcs.isLongClickable(info);
+        }
+
+        @Override
+        public boolean isPassword(Object info) {
+            return AccessibilityNodeInfoCompatIcs.isPassword(info);
+        }
+
+        @Override
+        public boolean isScrollable(Object info) {
+            return AccessibilityNodeInfoCompatIcs.isScrollable(info);
+        }
+
+        @Override
+        public boolean isSelected(Object info) {
+            return AccessibilityNodeInfoCompatIcs.isSelected(info);
+        }
+
+        @Override
+        public boolean performAction(Object info, int action) {
+            return AccessibilityNodeInfoCompatIcs.performAction(info, action);
+        }
+
+        @Override
+        public void setBoundsInParent(Object info, Rect bounds) {
+            AccessibilityNodeInfoCompatIcs.setBoundsInParent(info, bounds);
+        }
+
+        @Override
+        public void setBoundsInScreen(Object info, Rect bounds) {
+            AccessibilityNodeInfoCompatIcs.setBoundsInScreen(info, bounds);
+        }
+
+        @Override
+        public void setCheckable(Object info, boolean checkable) {
+            AccessibilityNodeInfoCompatIcs.setCheckable(info, checkable);
+        }
+
+        @Override
+        public void setChecked(Object info, boolean checked) {
+            AccessibilityNodeInfoCompatIcs.setChecked(info, checked);
+        }
+
+        @Override
+        public void setClassName(Object info, CharSequence className) {
+            AccessibilityNodeInfoCompatIcs.setClassName(info, className);
+        }
+
+        @Override
+        public void setClickable(Object info, boolean clickable) {
+            AccessibilityNodeInfoCompatIcs.setClickable(info, clickable);
+        }
+
+        @Override
+        public void setContentDescription(Object info, CharSequence contentDescription) {
+            AccessibilityNodeInfoCompatIcs.setContentDescription(info, contentDescription);
+        }
+
+        @Override
+        public void setEnabled(Object info, boolean enabled) {
+            AccessibilityNodeInfoCompatIcs.setEnabled(info, enabled);
+        }
+
+        @Override
+        public void setFocusable(Object info, boolean focusable) {
+            AccessibilityNodeInfoCompatIcs.setFocusable(info, focusable);
+        }
+
+        @Override
+        public void setFocused(Object info, boolean focused) {
+            AccessibilityNodeInfoCompatIcs.setFocused(info, focused);
+        }
+
+        @Override
+        public void setLongClickable(Object info, boolean longClickable) {
+            AccessibilityNodeInfoCompatIcs.setLongClickable(info, longClickable);
+        }
+
+        @Override
+        public void setPackageName(Object info, CharSequence packageName) {
+            AccessibilityNodeInfoCompatIcs.setPackageName(info, packageName);
+        }
+
+        @Override
+        public void setParent(Object info, View parent) {
+            AccessibilityNodeInfoCompatIcs.setParent(info, parent);
+        }
+
+        @Override
+        public void setPassword(Object info, boolean password) {
+            AccessibilityNodeInfoCompatIcs.setPassword(info, password);
+        }
+
+        @Override
+        public void setScrollable(Object info, boolean scrollable) {
+            AccessibilityNodeInfoCompatIcs.setScrollable(info, scrollable);
+        }
+
+        @Override
+        public void setSelected(Object info, boolean selected) {
+            AccessibilityNodeInfoCompatIcs.setSelected(info, selected);
+        }
+
+        @Override
+        public void setSource(Object info, View source) {
+            AccessibilityNodeInfoCompatIcs.setSource(info, source);
+        }
+
+        @Override
+        public void setText(Object info, CharSequence text) {
+            AccessibilityNodeInfoCompatIcs.setText(info, text);
+        }
+
+        @Override
+        public void recycle(Object info) {
+            AccessibilityNodeInfoCompatIcs.recycle(info);
+        }
+    }
+
+    static class AccessibilityNodeInfoJellybeanImpl extends AccessibilityNodeInfoIcsImpl {
+        @Override
+        public Object obtain(View root, int virtualDescendantId) {
+            return AccessibilityNodeInfoCompatJellyBean.obtain(root, virtualDescendantId);
+        }
+
+        @Override
+        public Object findFocus(Object info, int focus) {
+            return AccessibilityNodeInfoCompatJellyBean.findFocus(info, focus);
+        }
+
+        @Override
+        public Object focusSearch(Object info, int direction) {
+            return AccessibilityNodeInfoCompatJellyBean.focusSearch(info, direction);
+        }
+
+        @Override
+        public void addChild(Object info, View child, int virtualDescendantId) {
+            AccessibilityNodeInfoCompatJellyBean.addChild(info, child, virtualDescendantId);
+        }
+
+        @Override
+        public void setSource(Object info, View root, int virtualDescendantId) {
+            AccessibilityNodeInfoCompatJellyBean.setSource(info, root, virtualDescendantId);
+        }
+
+        @Override
+        public boolean isVisibleToUser(Object info) {
+            return AccessibilityNodeInfoCompatJellyBean.isVisibleToUser(info);
+        }
+
+        @Override
+        public void setVisibleToUser(Object info, boolean visibleToUser) {
+            AccessibilityNodeInfoCompatJellyBean.setVisibleToUser(info, visibleToUser);
+        }
+
+        @Override
+        public boolean isAccessibilityFocused(Object info) {
+            return AccessibilityNodeInfoCompatJellyBean.isAccessibilityFocused(info);
+        }
+
+        @Override
+        public void setAccessibilityFocused(Object info, boolean focused) {
+            AccessibilityNodeInfoCompatJellyBean.setAccesibilityFocused(info, focused);
+        }
+
+        @Override
+        public boolean performAction(Object info, int action, Bundle arguments) {
+            return AccessibilityNodeInfoCompatJellyBean.performAction(info, action, arguments);
+        }
+
+        @Override
+        public void setMovementGranularities(Object info, int granularities) {
+            AccessibilityNodeInfoCompatJellyBean.setMovementGranularities(info, granularities);
+        }
+
+        @Override
+        public int getMovementGranularities(Object info) {
+            return AccessibilityNodeInfoCompatJellyBean.getMovementGranularities(info);
+        }
+
+        @Override
+        public void setParent(Object info, View root, int virtualDescendantId) {
+            AccessibilityNodeInfoCompatJellyBean.setParent(info, root, virtualDescendantId);
+        }
+    }
+
+    static class AccessibilityNodeInfoJellybeanMr1Impl extends AccessibilityNodeInfoJellybeanImpl {
+
+        @Override
+        public void setLabelFor(Object info, View labeled) {
+            AccessibilityNodeInfoCompatJellybeanMr1.setLabelFor(info, labeled);
+        }
+
+        @Override
+        public void setLabelFor(Object info, View root, int virtualDescendantId) {
+            AccessibilityNodeInfoCompatJellybeanMr1.setLabelFor(info, root, virtualDescendantId);
+        }
+
+        @Override
+        public Object getLabelFor(Object info) {
+            return AccessibilityNodeInfoCompatJellybeanMr1.getLabelFor(info);
+        }
+
+        @Override
+        public void setLabeledBy(Object info, View labeled) {
+            AccessibilityNodeInfoCompatJellybeanMr1.setLabeledBy(info, labeled);
+        }
+
+        @Override
+        public void setLabeledBy(Object info, View root, int virtualDescendantId) {
+            AccessibilityNodeInfoCompatJellybeanMr1.setLabeledBy(info, root, virtualDescendantId);
+        }
+
+        @Override
+        public Object getLabeledBy(Object info) {
+            return AccessibilityNodeInfoCompatJellybeanMr1.getLabeledBy(info);
+        }
+    }
+
+    static class AccessibilityNodeInfoJellybeanMr2Impl extends
+            AccessibilityNodeInfoJellybeanMr1Impl {
+
+        @Override
+        public String getViewIdResourceName(Object info) {
+            return AccessibilityNodeInfoCompatJellybeanMr2.getViewIdResourceName(info);
+        }
+
+        @Override
+        public void setViewIdResourceName(Object info, String viewId) {
+            AccessibilityNodeInfoCompatJellybeanMr2.setViewIdResourceName(info, viewId);
+        }
+
+        @Override
+        public List<Object> findAccessibilityNodeInfosByViewId(Object info, String viewId) {
+            return AccessibilityNodeInfoCompatJellybeanMr2.findAccessibilityNodeInfosByViewId(info,
+                    viewId);
+        }
+
+        @Override
+        public void setTextSelection(Object info, int start, int end) {
+            AccessibilityNodeInfoCompatJellybeanMr2.setTextSelection(info, start, end);
+        }
+
+        @Override
+        public int getTextSelectionStart(Object info) {
+            return AccessibilityNodeInfoCompatJellybeanMr2.getTextSelectionStart(info);
+        }
+
+        @Override
+        public int getTextSelectionEnd(Object info) {
+            return AccessibilityNodeInfoCompatJellybeanMr2.getTextSelectionEnd(info);
+        }
+
+        @Override
+        public boolean isEditable(Object info) {
+            return AccessibilityNodeInfoCompatJellybeanMr2.isEditable(info);
+        }
+
+        @Override
+        public void setEditable(Object info, boolean editable) {
+            AccessibilityNodeInfoCompatJellybeanMr2.setEditable(info, editable);
+        }
+
+        @Override
+        public boolean refresh(Object info) {
+            return AccessibilityNodeInfoCompatJellybeanMr2.refresh(info);
+        }
+    }
+
+    static class AccessibilityNodeInfoKitKatImpl extends AccessibilityNodeInfoJellybeanMr2Impl {
+        @Override
+        public int getLiveRegion(Object info) {
+            return AccessibilityNodeInfoCompatKitKat.getLiveRegion(info);
+        }
+
+        @Override
+        public void setLiveRegion(Object info, int mode) {
+            AccessibilityNodeInfoCompatKitKat.setLiveRegion(info, mode);
+        }
+
+        @Override
+        public Object getCollectionInfo(Object info) {
+            return AccessibilityNodeInfoCompatKitKat.getCollectionInfo(info);
+        }
+
+        @Override
+        public void setCollectionInfo(Object info, Object collectionInfo) {
+            AccessibilityNodeInfoCompatKitKat.setCollectionInfo(info, collectionInfo);
+        }
+
+        @Override
+        public Object obtainCollectionInfo(int rowCount, int columnCount,
+                boolean hierarchical, int selectionMode) {
+            return AccessibilityNodeInfoCompatKitKat.obtainCollectionInfo(rowCount, columnCount,
+                    hierarchical, selectionMode);
+        }
+
+        @Override
+        public Object obtainCollectionInfo(int rowCount, int columnCount, boolean hierarchical) {
+            return AccessibilityNodeInfoCompatKitKat.obtainCollectionInfo(rowCount, columnCount,
+                    hierarchical);
+        }
+
+        @Override
+        public Object obtainCollectionItemInfo(int rowIndex, int rowSpan, int columnIndex,
+                int columnSpan, boolean heading, boolean selected) {
+            return AccessibilityNodeInfoCompatKitKat
+                    .obtainCollectionItemInfo(rowIndex, rowSpan, columnIndex, columnSpan, heading);
+        }
+
+        @Override
+        public Object obtainCollectionItemInfo(int rowIndex, int rowSpan, int columnIndex,
+                int columnSpan, boolean heading) {
+            return AccessibilityNodeInfoCompatKitKat
+                    .obtainCollectionItemInfo(rowIndex, rowSpan, columnIndex, columnSpan, heading);
+        }
+
+        @Override
+        public int getCollectionInfoColumnCount(Object info) {
+            return AccessibilityNodeInfoCompatKitKat.CollectionInfo.getColumnCount(info);
+        }
+
+        @Override
+        public int getCollectionInfoRowCount(Object info) {
+            return AccessibilityNodeInfoCompatKitKat.CollectionInfo.getRowCount(info);
+        }
+
+        @Override
+        public boolean isCollectionInfoHierarchical(Object info) {
+            return AccessibilityNodeInfoCompatKitKat.CollectionInfo.isHierarchical(info);
+        }
+
+        @Override
+        public Object getCollectionItemInfo(Object info) {
+            return AccessibilityNodeInfoCompatKitKat.getCollectionItemInfo(info);
+        }
+
+        @Override
+        public Object getRangeInfo(Object info) {
+            return AccessibilityNodeInfoCompatKitKat.getRangeInfo(info);
+        }
+
+        @Override
+        public void setRangeInfo(Object info, Object rangeInfo) {
+            AccessibilityNodeInfoCompatKitKat.setRangeInfo(info, rangeInfo);
+        }
+
+        @Override
+        public int getCollectionItemColumnIndex(Object info) {
+            return AccessibilityNodeInfoCompatKitKat.CollectionItemInfo.getColumnIndex(info);
+        }
+
+        @Override
+        public int getCollectionItemColumnSpan(Object info) {
+            return AccessibilityNodeInfoCompatKitKat.CollectionItemInfo.getColumnSpan(info);
+        }
+
+        @Override
+        public int getCollectionItemRowIndex(Object info) {
+            return AccessibilityNodeInfoCompatKitKat.CollectionItemInfo.getRowIndex(info);
+        }
+
+        @Override
+        public int getCollectionItemRowSpan(Object info) {
+            return AccessibilityNodeInfoCompatKitKat.CollectionItemInfo.getRowSpan(info);
+        }
+
+        @Override
+        public boolean isCollectionItemHeading(Object info) {
+            return AccessibilityNodeInfoCompatKitKat.CollectionItemInfo.isHeading(info);
+        }
+
+        @Override
+        public void setCollectionItemInfo(Object info, Object collectionItemInfo) {
+            AccessibilityNodeInfoCompatKitKat.setCollectionItemInfo(info, collectionItemInfo);
+        }
+
+        @Override
+        public Object obtainRangeInfo(int type, float min, float max, float current) {
+            return AccessibilityNodeInfoCompatKitKat.obtainRangeInfo(type, min, max, current);
+        }
+
+        @Override
+        public void setContentInvalid(Object info, boolean contentInvalid) {
+            AccessibilityNodeInfoCompatKitKat.setContentInvalid(info, contentInvalid);
+        }
+
+        @Override
+        public boolean isContentInvalid(Object info) {
+            return AccessibilityNodeInfoCompatKitKat.isContentInvalid(info);
+        }
+
+        @Override
+        public boolean canOpenPopup(Object info) {
+            return AccessibilityNodeInfoCompatKitKat.canOpenPopup(info);
+        }
+
+        @Override
+        public void setCanOpenPopup(Object info, boolean opensPopup) {
+            AccessibilityNodeInfoCompatKitKat.setCanOpenPopup(info, opensPopup);
+        }
+
+        @Override
+        public Bundle getExtras(Object info) {
+            return AccessibilityNodeInfoCompatKitKat.getExtras(info);
+        }
+
+        @Override
+        public int getInputType(Object info) {
+            return AccessibilityNodeInfoCompatKitKat.getInputType(info);
+        }
+
+        @Override
+        public void setInputType(Object info, int inputType) {
+            AccessibilityNodeInfoCompatKitKat.setInputType(info, inputType);
+        }
+
+        @Override
+        public boolean isDismissable(Object info) {
+            return AccessibilityNodeInfoCompatKitKat.isDismissable(info);
+        }
+
+        @Override
+        public void setDismissable(Object info, boolean dismissable) {
+            AccessibilityNodeInfoCompatKitKat.setDismissable(info, dismissable);
+        }
+
+        @Override
+        public boolean isMultiLine(Object info) {
+            return AccessibilityNodeInfoCompatKitKat.isMultiLine(info);
+        }
+
+        @Override
+        public void setMultiLine(Object info, boolean multiLine) {
+            AccessibilityNodeInfoCompatKitKat.setMultiLine(info, multiLine);
+        }
+
+        @Override
+        public CharSequence getRoleDescription(Object info) {
+            return AccessibilityNodeInfoCompatKitKat.getRoleDescription(info);
+        }
+
+        @Override
+        public void setRoleDescription(Object info, CharSequence roleDescription) {
+            AccessibilityNodeInfoCompatKitKat.setRoleDescription(info, roleDescription);
+        }
+    }
+
+    static class AccessibilityNodeInfoApi21Impl extends AccessibilityNodeInfoKitKatImpl {
+        @Override
+        public Object newAccessibilityAction(int actionId, CharSequence label) {
+            return AccessibilityNodeInfoCompatApi21.newAccessibilityAction(actionId, label);
+        }
+
+        @Override
+        public List<Object> getActionList(Object info) {
+            return AccessibilityNodeInfoCompatApi21.getActionList(info);
+        }
+
+        @Override
+        public Object obtainCollectionInfo(int rowCount, int columnCount, boolean hierarchical,
+                int selectionMode) {
+            return AccessibilityNodeInfoCompatApi21.obtainCollectionInfo(rowCount, columnCount,
+                    hierarchical, selectionMode);
+        }
+
+        @Override
+        public void addAction(Object info, Object action) {
+            AccessibilityNodeInfoCompatApi21.addAction(info, action);
+        }
+
+        @Override
+        public boolean removeAction(Object info, Object action) {
+            return AccessibilityNodeInfoCompatApi21.removeAction(info, action);
+        }
+
+        @Override
+        public int getAccessibilityActionId(Object action) {
+            return AccessibilityNodeInfoCompatApi21.getAccessibilityActionId(action);
+        }
+
+        @Override
+        public CharSequence getAccessibilityActionLabel(Object action) {
+            return AccessibilityNodeInfoCompatApi21.getAccessibilityActionLabel(action);
+        }
+
+        @Override
+        public Object obtainCollectionItemInfo(int rowIndex, int rowSpan, int columnIndex,
+                int columnSpan, boolean heading, boolean selected) {
+            return AccessibilityNodeInfoCompatApi21.obtainCollectionItemInfo(rowIndex, rowSpan,
+                    columnIndex, columnSpan, heading, selected);
+        }
+
+        @Override
+        public boolean isCollectionItemSelected(Object info) {
+            return AccessibilityNodeInfoCompatApi21.CollectionItemInfo.isSelected(info);
+        }
+
+        @Override
+        public CharSequence getError(Object info) {
+            return AccessibilityNodeInfoCompatApi21.getError(info);
+        }
+
+        @Override
+        public void setError(Object info, CharSequence error) {
+            AccessibilityNodeInfoCompatApi21.setError(info, error);
+        }
+
+        @Override
+        public void setMaxTextLength(Object info, int max) {
+            AccessibilityNodeInfoCompatApi21.setMaxTextLength(info, max);
+        }
+
+        @Override
+        public int getMaxTextLength(Object info) {
+            return AccessibilityNodeInfoCompatApi21.getMaxTextLength(info);
+        }
+
+        @Override
+        public Object getWindow(Object info) {
+            return AccessibilityNodeInfoCompatApi21.getWindow(info);
+        }
+
+        @Override
+        public boolean removeChild(Object info, View child) {
+            return AccessibilityNodeInfoCompatApi21.removeChild(info, child);
+        }
+
+        @Override
+        public boolean removeChild(Object info, View root, int virtualDescendantId) {
+            return AccessibilityNodeInfoCompatApi21.removeChild(info, root, virtualDescendantId);
+        }
+
+        @Override
+        public int getCollectionInfoSelectionMode(Object info) {
+            return AccessibilityNodeInfoCompatApi21.CollectionInfo.getSelectionMode(info);
+        }
+    }
+
+    static class AccessibilityNodeInfoApi22Impl extends AccessibilityNodeInfoApi21Impl {
+        @Override
+        public Object getTraversalBefore(Object info) {
+            return AccessibilityNodeInfoCompatApi22.getTraversalBefore(info);
+        }
+
+        @Override
+        public void setTraversalBefore(Object info, View view) {
+            AccessibilityNodeInfoCompatApi22.setTraversalBefore(info, view);
+        }
+
+        @Override
+        public void setTraversalBefore(Object info, View root, int virtualDescendantId) {
+            AccessibilityNodeInfoCompatApi22.setTraversalBefore(info, root, virtualDescendantId);
+        }
+
+        @Override
+        public Object getTraversalAfter(Object info) {
+            return AccessibilityNodeInfoCompatApi22.getTraversalAfter(info);
+        }
+
+        @Override
+        public void setTraversalAfter(Object info, View view) {
+            AccessibilityNodeInfoCompatApi22.setTraversalAfter(info, view);
+        }
+
+        @Override
+        public void setTraversalAfter(Object info, View root, int virtualDescendantId) {
+            AccessibilityNodeInfoCompatApi22.setTraversalAfter(info, root, virtualDescendantId);
+        }
+    }
+
+    static class AccessibilityNodeInfoApi23Impl extends AccessibilityNodeInfoApi22Impl {
+        @Override
+        public Object getActionScrollToPosition() {
+            return AccessibilityNodeInfoCompatApi23.getActionScrollToPosition();
+        }
+
+        @Override
+        public Object getActionShowOnScreen() {
+            return AccessibilityNodeInfoCompatApi23.getActionShowOnScreen();
+        }
+
+        @Override
+        public Object getActionScrollUp() {
+            return AccessibilityNodeInfoCompatApi23.getActionScrollUp();
+        }
+
+        @Override
+        public Object getActionScrollDown() {
+            return AccessibilityNodeInfoCompatApi23.getActionScrollDown();
+        }
+
+        @Override
+        public Object getActionScrollLeft() {
+            return AccessibilityNodeInfoCompatApi23.getActionScrollLeft();
+        }
+
+        @Override
+        public Object getActionScrollRight() {
+            return AccessibilityNodeInfoCompatApi23.getActionScrollRight();
+        }
+
+        @Override
+        public Object getActionContextClick() {
+            return AccessibilityNodeInfoCompatApi23.getActionContextClick();
+        }
+
+        @Override
+        public boolean isContextClickable(Object info) {
+            return AccessibilityNodeInfoCompatApi23.isContextClickable(info);
+        }
+
+        @Override
+        public void setContextClickable(Object info, boolean contextClickable) {
+            AccessibilityNodeInfoCompatApi23.setContextClickable(info, contextClickable);
+        }
+    }
+
+    static class AccessibilityNodeInfoApi24Impl extends AccessibilityNodeInfoApi23Impl {
+        @Override
+        public Object getActionSetProgress() {
+            return AccessibilityNodeInfoCompatApi24.getActionSetProgress();
+        }
+
+        @Override
+        public int getDrawingOrder(Object info) {
+            return AccessibilityNodeInfoCompatApi24.getDrawingOrder(info);
+        }
+
+        @Override
+        public void setDrawingOrder(Object info, int drawingOrderInParent) {
+            AccessibilityNodeInfoCompatApi24.setDrawingOrder(info, drawingOrderInParent);
+        }
+
+        @Override
+        public boolean isImportantForAccessibility(Object info) {
+            return AccessibilityNodeInfoCompatApi24.isImportantForAccessibility(info);
+        }
+
+        @Override
+        public void setImportantForAccessibility(Object info, boolean importantForAccessibility) {
+            AccessibilityNodeInfoCompatApi24.setImportantForAccessibility(
+                    info, importantForAccessibility);
+        }
+
+    }
+
+    static {
+        if (Build.VERSION.SDK_INT >= 24) {
+            IMPL = new AccessibilityNodeInfoApi24Impl();
+        } else if (Build.VERSION.SDK_INT >= 23) {
+            IMPL = new AccessibilityNodeInfoApi23Impl();
+        } else if (Build.VERSION.SDK_INT >= 22) {
+            IMPL = new AccessibilityNodeInfoApi22Impl();
+        } else if (Build.VERSION.SDK_INT >= 21) {
+            IMPL = new AccessibilityNodeInfoApi21Impl();
+        } else if (Build.VERSION.SDK_INT >= 19) { // KitKat
+            IMPL = new AccessibilityNodeInfoKitKatImpl();
+        } else if (Build.VERSION.SDK_INT >= 18) { // JellyBean MR2
+            IMPL = new AccessibilityNodeInfoJellybeanMr2Impl();
+        } else if (Build.VERSION.SDK_INT >= 17) { // JellyBean MR1
+            IMPL = new AccessibilityNodeInfoJellybeanMr1Impl();
+        } else if (Build.VERSION.SDK_INT >= 16) { // JellyBean
+            IMPL = new AccessibilityNodeInfoJellybeanImpl();
+        } else if (Build.VERSION.SDK_INT >= 14) { // ICS
+            IMPL = new AccessibilityNodeInfoIcsImpl();
+        } else {
+            IMPL = new AccessibilityNodeInfoStubImpl();
+        }
+    }
+
+    private static final AccessibilityNodeInfoImpl IMPL;
+
+    private final Object mInfo;
+
+    // Actions introduced in IceCreamSandwich
+
+    /**
+     * Action that focuses the node.
+     */
+    public static final int ACTION_FOCUS = 0x00000001;
+
+    /**
+     * Action that unfocuses the node.
+     */
+    public static final int ACTION_CLEAR_FOCUS = 0x00000002;
+
+    /**
+     * Action that selects the node.
+     */
+    public static final int ACTION_SELECT = 0x00000004;
+
+    /**
+     * Action that unselects the node.
+     */
+    public static final int ACTION_CLEAR_SELECTION = 0x00000008;
+
+    /**
+     * Action that clicks on the node info.
+     */
+    public static final int ACTION_CLICK = 0x00000010;
+
+    /**
+     * Action that long clicks on the node.
+     */
+    public static final int ACTION_LONG_CLICK = 0x00000020;
+
+    // Actions introduced in JellyBean
+
+    /**
+     * Action that gives accessibility focus to the node.
+     */
+    public static final int ACTION_ACCESSIBILITY_FOCUS = 0x00000040;
+
+    /**
+     * Action that clears accessibility focus of the node.
+     */
+    public static final int ACTION_CLEAR_ACCESSIBILITY_FOCUS = 0x00000080;
+
+    /**
+     * Action that requests to go to the next entity in this node's text
+     * at a given movement granularity. For example, move to the next character,
+     * word, etc.
+     * <p>
+     * <strong>Arguments:</strong> {@link #ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT}<,
+     * {@link #ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN}<br>
+     * <strong>Example:</strong> Move to the previous character and do not extend selection.
+     * <code><pre><p>
+     *   Bundle arguments = new Bundle();
+     *   arguments.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT,
+     *           AccessibilityNodeInfo.MOVEMENT_GRANULARITY_CHARACTER);
+     *   arguments.putBoolean(AccessibilityNodeInfo.ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN,
+     *           false);
+     *   info.performAction(AccessibilityNodeInfo.ACTION_NEXT_AT_MOVEMENT_GRANULARITY, arguments);
+     * </code></pre></p>
+     * </p>
+     *
+     * @see #ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT
+     * @see #ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN
+     *
+     * @see #setMovementGranularities(int)
+     * @see #getMovementGranularities()
+     *
+     * @see #MOVEMENT_GRANULARITY_CHARACTER
+     * @see #MOVEMENT_GRANULARITY_WORD
+     * @see #MOVEMENT_GRANULARITY_LINE
+     * @see #MOVEMENT_GRANULARITY_PARAGRAPH
+     * @see #MOVEMENT_GRANULARITY_PAGE
+     */
+    public static final int ACTION_NEXT_AT_MOVEMENT_GRANULARITY = 0x00000100;
+
+    /**
+     * Action that requests to go to the previous entity in this node's text
+     * at a given movement granularity. For example, move to the next character,
+     * word, etc.
+     * <p>
+     * <strong>Arguments:</strong> {@link #ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT}<,
+     * {@link #ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN}<br>
+     * <strong>Example:</strong> Move to the next character and do not extend selection.
+     * <code><pre><p>
+     *   Bundle arguments = new Bundle();
+     *   arguments.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT,
+     *           AccessibilityNodeInfo.MOVEMENT_GRANULARITY_CHARACTER);
+     *   arguments.putBoolean(AccessibilityNodeInfo.ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN,
+     *           false);
+     *   info.performAction(AccessibilityNodeInfo.ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY,
+     *           arguments);
+     * </code></pre></p>
+     * </p>
+     *
+     * @see #ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT
+     * @see #ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN
+     *
+     * @see #setMovementGranularities(int)
+     * @see #getMovementGranularities()
+     *
+     * @see #MOVEMENT_GRANULARITY_CHARACTER
+     * @see #MOVEMENT_GRANULARITY_WORD
+     * @see #MOVEMENT_GRANULARITY_LINE
+     * @see #MOVEMENT_GRANULARITY_PARAGRAPH
+     * @see #MOVEMENT_GRANULARITY_PAGE
+     */
+    public static final int ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY = 0x00000200;
+
+    /**
+     * Action to move to the next HTML element of a given type. For example, move
+     * to the BUTTON, INPUT, TABLE, etc.
+     * <p>
+     * <strong>Arguments:</strong> {@link #ACTION_ARGUMENT_HTML_ELEMENT_STRING}<br>
+     * <strong>Example:</strong>
+     * <code><pre><p>
+     *   Bundle arguments = new Bundle();
+     *   arguments.putString(AccessibilityNodeInfo.ACTION_ARGUMENT_HTML_ELEMENT_STRING, "BUTTON");
+     *   info.performAction(AccessibilityNodeInfo.ACTION_NEXT_HTML_ELEMENT, arguments);
+     * </code></pre></p>
+     * </p>
+     */
+    public static final int ACTION_NEXT_HTML_ELEMENT = 0x00000400;
+
+    /**
+     * Action to move to the previous HTML element of a given type. For example, move
+     * to the BUTTON, INPUT, TABLE, etc.
+     * <p>
+     * <strong>Arguments:</strong> {@link #ACTION_ARGUMENT_HTML_ELEMENT_STRING}<br>
+     * <strong>Example:</strong>
+     * <code><pre><p>
+     *   Bundle arguments = new Bundle();
+     *   arguments.putString(AccessibilityNodeInfo.ACTION_ARGUMENT_HTML_ELEMENT_STRING, "BUTTON");
+     *   info.performAction(AccessibilityNodeInfo.ACTION_PREVIOUS_HTML_ELEMENT, arguments);
+     * </code></pre></p>
+     * </p>
+     */
+    public static final int ACTION_PREVIOUS_HTML_ELEMENT = 0x00000800;
+
+    /**
+     * Action to scroll the node content forward.
+     */
+    public static final int ACTION_SCROLL_FORWARD = 0x00001000;
+
+    /**
+     * Action to scroll the node content backward.
+     */
+    public static final int ACTION_SCROLL_BACKWARD = 0x00002000;
+
+    // Actions introduced in JellyBeanMr2
+
+    /**
+     * Action to copy the current selection to the clipboard.
+     */
+    public static final int ACTION_COPY = 0x00004000;
+
+    /**
+     * Action to paste the current clipboard content.
+     */
+    public static final int ACTION_PASTE = 0x00008000;
+
+    /**
+     * Action to cut the current selection and place it to the clipboard.
+     */
+    public static final int ACTION_CUT = 0x00010000;
+
+    /**
+     * Action to set the selection. Performing this action with no arguments
+     * clears the selection.
+     * <p>
+     * <strong>Arguments:</strong> {@link #ACTION_ARGUMENT_SELECTION_START_INT},
+     * {@link #ACTION_ARGUMENT_SELECTION_END_INT}<br>
+     * <strong>Example:</strong>
+     * <code><pre><p>
+     *   Bundle arguments = new Bundle();
+     *   arguments.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_START_INT, 1);
+     *   arguments.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_END_INT, 2);
+     *   info.performAction(AccessibilityNodeInfo.ACTION_SET_SELECTION, arguments);
+     * </code></pre></p>
+     * </p>
+     *
+     * @see #ACTION_ARGUMENT_SELECTION_START_INT
+     * @see #ACTION_ARGUMENT_SELECTION_END_INT
+     */
+    public static final int ACTION_SET_SELECTION = 0x00020000;
+
+    /**
+     * Action to expand an expandable node.
+     */
+    public static final int ACTION_EXPAND = 0x00040000;
+
+    /**
+     * Action to collapse an expandable node.
+     */
+    public static final int ACTION_COLLAPSE = 0x00080000;
+
+    /**
+     * Action to dismiss a dismissable node.
+     */
+    public static final int ACTION_DISMISS = 0x00100000;
+
+    /**
+     * Action that sets the text of the node. Performing the action without argument, using <code>
+     * null</code> or empty {@link CharSequence} will clear the text. This action will also put the
+     * cursor at the end of text.
+     * <p>
+     * <strong>Arguments:</strong> {@link #ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE}<br>
+     * <strong>Example:</strong>
+     * <code><pre><p>
+     *   Bundle arguments = new Bundle();
+     *   arguments.putCharSequence(AccessibilityNodeInfo.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE,
+     *       "android");
+     *   info.performAction(AccessibilityNodeInfo.ACTION_SET_TEXT, arguments);
+     * </code></pre></p>
+     */
+    public static final int ACTION_SET_TEXT = 0x00200000;
+
+    // Action arguments
+
+    /**
+     * Argument for which movement granularity to be used when traversing the node text.
+     * <p>
+     * <strong>Type:</strong> int<br>
+     * <strong>Actions:</strong> {@link #ACTION_NEXT_AT_MOVEMENT_GRANULARITY},
+     * {@link #ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY}
+     * </p>
+     */
+    public static final String ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT =
+        "ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT";
+
+    /**
+     * Argument for which HTML element to get moving to the next/previous HTML element.
+     * <p>
+     * <strong>Type:</strong> String<br>
+     * <strong>Actions:</strong> {@link #ACTION_NEXT_HTML_ELEMENT},
+     *         {@link #ACTION_PREVIOUS_HTML_ELEMENT}
+     * </p>
+     */
+    public static final String ACTION_ARGUMENT_HTML_ELEMENT_STRING =
+        "ACTION_ARGUMENT_HTML_ELEMENT_STRING";
+
+    /**
+     * Argument for whether when moving at granularity to extend the selection
+     * or to move it otherwise.
+     * <p>
+     * <strong>Type:</strong> boolean<br>
+     * <strong>Actions:</strong> {@link #ACTION_NEXT_AT_MOVEMENT_GRANULARITY},
+     * {@link #ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY}
+     * </p>
+     *
+     * @see #ACTION_NEXT_AT_MOVEMENT_GRANULARITY
+     * @see #ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY
+     */
+    public static final String ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN =
+            "ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN";
+
+    /**
+     * Argument for specifying the selection start.
+     * <p>
+     * <strong>Type:</strong> int<br>
+     * <strong>Actions:</strong> {@link #ACTION_SET_SELECTION}
+     * </p>
+     *
+     * @see #ACTION_SET_SELECTION
+     */
+    public static final String ACTION_ARGUMENT_SELECTION_START_INT =
+            "ACTION_ARGUMENT_SELECTION_START_INT";
+
+    /**
+     * Argument for specifying the selection end.
+     * <p>
+     * <strong>Type:</strong> int<br>
+     * <strong>Actions:</strong> {@link #ACTION_SET_SELECTION}
+     * </p>
+     *
+     * @see #ACTION_SET_SELECTION
+     */
+    public static final String ACTION_ARGUMENT_SELECTION_END_INT =
+            "ACTION_ARGUMENT_SELECTION_END_INT";
+
+    /**
+     * Argument for specifying the text content to set
+     * <p>
+     * <strong>Type:</strong> CharSequence<br>
+     * <strong>Actions:</strong> {@link #ACTION_SET_TEXT}
+     * </p>
+     *
+     * @see #ACTION_SET_TEXT
+     */
+    public static final String ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE =
+            "ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE";
+
+    /**
+     * Argument for specifying the collection row to make visible on screen.
+     * <p>
+     * <strong>Type:</strong> int<br>
+     * <strong>Actions:</strong>
+     * <ul>
+     *     <li>{@link AccessibilityActionCompat#ACTION_SCROLL_TO_POSITION}</li>
+     * </ul>
+     *
+     * @see AccessibilityActionCompat#ACTION_SCROLL_TO_POSITION
+     */
+    public static final String ACTION_ARGUMENT_ROW_INT =
+            "android.view.accessibility.action.ARGUMENT_ROW_INT";
+
+    /**
+     * Argument for specifying the collection column to make visible on screen.
+     * <p>
+     * <strong>Type:</strong> int<br>
+     * <strong>Actions:</strong>
+     * <ul>
+     *     <li>{@link AccessibilityActionCompat#ACTION_SCROLL_TO_POSITION}</li>
+     * </ul>
+     *
+     * @see AccessibilityActionCompat#ACTION_SCROLL_TO_POSITION
+     */
+    public static final String ACTION_ARGUMENT_COLUMN_INT =
+            "android.view.accessibility.action.ARGUMENT_COLUMN_INT";
+
+    /**
+     * Argument for specifying the progress value to set.
+     * <p>
+     * <strong>Type:</strong> float<br>
+     * <strong>Actions:</strong>
+     * <ul>
+     *     <li>{@link AccessibilityActionCompat#ACTION_SET_PROGRESS}</li>
+     * </ul>
+     *
+     * @see AccessibilityActionCompat#ACTION_SET_PROGRESS
+     */
+    public static final String ACTION_ARGUMENT_PROGRESS_VALUE =
+            "android.view.accessibility.action.ARGUMENT_PROGRESS_VALUE";
+
+    // Focus types
+
+    /**
+     * The input focus.
+     */
+    public static final int FOCUS_INPUT = 1;
+
+    /**
+     * The accessibility focus.
+     */
+    public static final int FOCUS_ACCESSIBILITY = 2;
+
+    // Movement granularities
+
+    /**
+     * Movement granularity bit for traversing the text of a node by character.
+     */
+    public static final int MOVEMENT_GRANULARITY_CHARACTER = 0x00000001;
+
+    /**
+     * Movement granularity bit for traversing the text of a node by word.
+     */
+    public static final int MOVEMENT_GRANULARITY_WORD = 0x00000002;
+
+    /**
+     * Movement granularity bit for traversing the text of a node by line.
+     */
+    public static final int MOVEMENT_GRANULARITY_LINE = 0x00000004;
+
+    /**
+     * Movement granularity bit for traversing the text of a node by paragraph.
+     */
+    public static final int MOVEMENT_GRANULARITY_PARAGRAPH = 0x00000008;
+
+    /**
+     * Movement granularity bit for traversing the text of a node by page.
+     */
+    public static final int MOVEMENT_GRANULARITY_PAGE = 0x00000010;
+
+    /**
+     * Creates a wrapper for info implementation.
+     *
+     * @param object The info to wrap.
+     * @return A wrapper for if the object is not null, null otherwise.
+     */
+    static AccessibilityNodeInfoCompat wrapNonNullInstance(Object object) {
+        if (object != null) {
+            return new AccessibilityNodeInfoCompat(object);
+        }
+        return null;
+    }
+
+    /**
+     * Creates a new instance wrapping an
+     * {@link android.view.accessibility.AccessibilityNodeInfo}.
+     *
+     * @param info The info.
+     */
+    public AccessibilityNodeInfoCompat(Object info) {
+        mInfo = info;
+    }
+
+    /**
+     * @return The wrapped {@link android.view.accessibility.AccessibilityNodeInfo}.
+     */
+    public Object getInfo() {
+        return mInfo;
+    }
+
+    /**
+     * Returns a cached instance if such is available otherwise a new one and
+     * sets the source.
+     *
+     * @return An instance.
+     * @see #setSource(View)
+     */
+    public static AccessibilityNodeInfoCompat obtain(View source) {
+        return AccessibilityNodeInfoCompat.wrapNonNullInstance(IMPL.obtain(source));
+    }
+
+    /**
+     * Returns a cached instance if such is available otherwise a new one
+     * and sets the source.
+     *
+     * @param root The root of the virtual subtree.
+     * @param virtualDescendantId The id of the virtual descendant.
+     * @return An instance.
+     *
+     * @see #setSource(View, int)
+     */
+    public static AccessibilityNodeInfoCompat obtain(View root, int virtualDescendantId) {
+        return AccessibilityNodeInfoCompat.wrapNonNullInstance(
+                IMPL.obtain(root, virtualDescendantId));
+    }
+
+    /**
+     * Returns a cached instance if such is available otherwise a new one.
+     *
+     * @return An instance.
+     */
+    public static AccessibilityNodeInfoCompat obtain() {
+        return AccessibilityNodeInfoCompat.wrapNonNullInstance(IMPL.obtain());
+    }
+
+    /**
+     * Returns a cached instance if such is available or a new one is create.
+     * The returned instance is initialized from the given <code>info</code>.
+     *
+     * @param info The other info.
+     * @return An instance.
+     */
+    public static AccessibilityNodeInfoCompat obtain(AccessibilityNodeInfoCompat info) {
+        return AccessibilityNodeInfoCompat.wrapNonNullInstance(IMPL.obtain(info.mInfo));
+    }
+
+    /**
+     * Sets the source.
+     *
+     * @param source The info source.
+     */
+    public void setSource(View source) {
+        IMPL.setSource(mInfo, source);
+    }
+
+    /**
+     * Sets the source to be a virtual descendant of the given <code>root</code>.
+     * If <code>virtualDescendantId</code> is {@link View#NO_ID} the root
+     * is set as the source.
+     * <p>
+     * A virtual descendant is an imaginary View that is reported as a part of the view
+     * hierarchy for accessibility purposes. This enables custom views that draw complex
+     * content to report themselves as a tree of virtual views, thus conveying their
+     * logical structure.
+     * </p>
+     * <p>
+     *   <strong>Note:</strong> Cannot be called from an
+     *   {@link android.accessibilityservice.AccessibilityService}.
+     *   This class is made immutable before being delivered to an AccessibilityService.
+     * </p>
+     *
+     * @param root The root of the virtual subtree.
+     * @param virtualDescendantId The id of the virtual descendant.
+     */
+    public void setSource(View root, int virtualDescendantId) {
+        IMPL.setSource(mInfo, root, virtualDescendantId);
+    }
+
+    /**
+     * Find the view that has the specified focus type. The search starts from
+     * the view represented by this node info.
+     *
+     * @param focus The focus to find. One of {@link #FOCUS_INPUT} or
+     *         {@link #FOCUS_ACCESSIBILITY}.
+     * @return The node info of the focused view or null.
+     *
+     * @see #FOCUS_INPUT
+     * @see #FOCUS_ACCESSIBILITY
+     */
+    public AccessibilityNodeInfoCompat findFocus(int focus) {
+        return AccessibilityNodeInfoCompat.wrapNonNullInstance(IMPL.findFocus(mInfo, focus));
+    }
+
+    /**
+     * Searches for the nearest view in the specified direction that can take
+     * input focus.
+     *
+     * @param direction The direction. Can be one of:
+     *     {@link View#FOCUS_DOWN},
+     *     {@link View#FOCUS_UP},
+     *     {@link View#FOCUS_LEFT},
+     *     {@link View#FOCUS_RIGHT},
+     *     {@link View#FOCUS_FORWARD},
+     *     {@link View#FOCUS_BACKWARD}.
+     *
+     * @return The node info for the view that can take accessibility focus.
+     */
+    public AccessibilityNodeInfoCompat focusSearch(int direction) {
+        return AccessibilityNodeInfoCompat.wrapNonNullInstance(IMPL.focusSearch(mInfo, direction));
+    }
+
+    /**
+     * Gets the id of the window from which the info comes from.
+     *
+     * @return The window id.
+     */
+    public int getWindowId() {
+        return IMPL.getWindowId(mInfo);
+    }
+
+    /**
+     * Gets the number of children.
+     *
+     * @return The child count.
+     */
+    public int getChildCount() {
+        return IMPL.getChildCount(mInfo);
+    }
+
+    /**
+     * Get the child at given index.
+     * <p>
+     * <strong>Note:</strong> It is a client responsibility to recycle the
+     * received info by calling {@link AccessibilityNodeInfoCompat#recycle()} to
+     * avoid creating of multiple instances.
+     * </p>
+     *
+     * @param index The child index.
+     * @return The child node.
+     * @throws IllegalStateException If called outside of an
+     *             AccessibilityService.
+     */
+    public AccessibilityNodeInfoCompat getChild(int index) {
+        return AccessibilityNodeInfoCompat.wrapNonNullInstance(IMPL.getChild(mInfo, index));
+    }
+
+    /**
+     * Adds a child.
+     * <p>
+     * <strong>Note:</strong> Cannot be called from an
+     * {@link android.accessibilityservice.AccessibilityService}. This class is
+     * made immutable before being delivered to an AccessibilityService.
+     * </p>
+     *
+     * @param child The child.
+     * @throws IllegalStateException If called from an AccessibilityService.
+     */
+    public void addChild(View child) {
+        IMPL.addChild(mInfo, child);
+    }
+
+    /**
+     * Adds a virtual child which is a descendant of the given <code>root</code>.
+     * If <code>virtualDescendantId</code> is {@link View#NO_ID} the root
+     * is added as a child.
+     * <p>
+     * A virtual descendant is an imaginary View that is reported as a part of the view
+     * hierarchy for accessibility purposes. This enables custom views that draw complex
+     * content to report them selves as a tree of virtual views, thus conveying their
+     * logical structure.
+     * </p>
+     *
+     * @param root The root of the virtual subtree.
+     * @param virtualDescendantId The id of the virtual child.
+     */
+    public void addChild(View root, int virtualDescendantId) {
+        IMPL.addChild(mInfo, root, virtualDescendantId);
+    }
+
+    /**
+     * Removes a child. If the child was not previously added to the node,
+     * calling this method has no effect.
+     * <p>
+     * <strong>Note:</strong> Cannot be called from an
+     * {@link android.accessibilityservice.AccessibilityService}.
+     * This class is made immutable before being delivered to an AccessibilityService.
+     * </p>
+     *
+     * @param child The child.
+     * @return true if the child was present
+     *
+     * @throws IllegalStateException If called from an AccessibilityService.
+     */
+    public boolean removeChild(View child) {
+        return IMPL.removeChild(mInfo, child);
+    }
+
+    /**
+     * Removes a virtual child which is a descendant of the given
+     * <code>root</code>. If the child was not previously added to the node,
+     * calling this method has no effect.
+     *
+     * @param root The root of the virtual subtree.
+     * @param virtualDescendantId The id of the virtual child.
+     * @return true if the child was present
+     * @see #addChild(View, int)
+     */
+    public boolean removeChild(View root, int virtualDescendantId) {
+        return IMPL.removeChild(mInfo, root, virtualDescendantId);
+    }
+
+    /**
+     * Gets the actions that can be performed on the node.
+     *
+     * @return The bit mask of with actions.
+     * @see android.view.accessibility.AccessibilityNodeInfo#ACTION_FOCUS
+     * @see android.view.accessibility.AccessibilityNodeInfo#ACTION_CLEAR_FOCUS
+     * @see android.view.accessibility.AccessibilityNodeInfo#ACTION_SELECT
+     * @see android.view.accessibility.AccessibilityNodeInfo#ACTION_CLEAR_SELECTION
+     */
+    public int getActions() {
+        return IMPL.getActions(mInfo);
+    }
+
+    /**
+     * Adds an action that can be performed on the node.
+     * <p>
+     * <strong>Note:</strong> Cannot be called from an
+     * {@link android.accessibilityservice.AccessibilityService}. This class is
+     * made immutable before being delivered to an AccessibilityService.
+     * </p>
+     *
+     * @param action The action.
+     * @throws IllegalStateException If called from an AccessibilityService.
+     */
+    public void addAction(int action) {
+        IMPL.addAction(mInfo, action);
+    }
+
+    /**
+     * Adds an action that can be performed on the node.
+     * <p>
+     * <strong>Note:</strong> Cannot be called from an
+     * {@link android.accessibilityservice.AccessibilityService}. This class is
+     * made immutable before being delivered to an AccessibilityService.
+     * </p>
+     *
+     * @param action The action.
+     * @throws IllegalStateException If called from an AccessibilityService.
+     */
+    public void addAction(AccessibilityActionCompat action) {
+        IMPL.addAction(mInfo, action.mAction);
+    }
+
+    /**
+     * Removes an action that can be performed on the node. If the action was
+     * not already added to the node, calling this method has no effect.
+     * <p>
+     *   <strong>Note:</strong> Cannot be called from an
+     *   {@link android.accessibilityservice.AccessibilityService}.
+     *   This class is made immutable before being delivered to an AccessibilityService.
+     * </p>
+     *
+     * @param action The action to be removed.
+     * @return The action removed from the list of actions.
+     *
+     * @throws IllegalStateException If called from an AccessibilityService.
+     */
+    public boolean removeAction(AccessibilityActionCompat action) {
+        return IMPL.removeAction(mInfo, action.mAction);
+    }
+
+    /**
+     * Performs an action on the node.
+     * <p>
+     * <strong>Note:</strong> An action can be performed only if the request is
+     * made from an {@link android.accessibilityservice.AccessibilityService}.
+     * </p>
+     *
+     * @param action The action to perform.
+     * @return True if the action was performed.
+     * @throws IllegalStateException If called outside of an
+     *             AccessibilityService.
+     */
+    public boolean performAction(int action) {
+        return IMPL.performAction(mInfo, action);
+    }
+
+    /**
+     * Performs an action on the node.
+     * <p>
+     *   <strong>Note:</strong> An action can be performed only if the request is made
+     *   from an {@link android.accessibilityservice.AccessibilityService}.
+     * </p>
+     *
+     * @param action The action to perform.
+     * @param arguments A bundle with additional arguments.
+     * @return True if the action was performed.
+     *
+     * @throws IllegalStateException If called outside of an AccessibilityService.
+     */
+    public boolean performAction(int action, Bundle arguments) {
+        return IMPL.performAction(mInfo, action, arguments);
+    }
+
+    /**
+     * Sets the movement granularities for traversing the text of this node.
+     * <p>
+     *   <strong>Note:</strong> Cannot be called from an
+     *   {@link android.accessibilityservice.AccessibilityService}.
+     *   This class is made immutable before being delivered to an AccessibilityService.
+     * </p>
+     *
+     * @param granularities The bit mask with granularities.
+     *
+     * @throws IllegalStateException If called from an AccessibilityService.
+     */
+    public void setMovementGranularities(int granularities) {
+        IMPL.setMovementGranularities(mInfo, granularities);
+    }
+
+    /**
+     * Gets the movement granularities for traversing the text of this node.
+     *
+     * @return The bit mask with granularities.
+     */
+    public int getMovementGranularities() {
+        return IMPL.getMovementGranularities(mInfo);
+    }
+
+    /**
+     * Finds {@link android.view.accessibility.AccessibilityNodeInfo}s by text. The match
+     * is case insensitive containment. The search is relative to this info i.e. this
+     * info is the root of the traversed tree.
+     * <p>
+     * <strong>Note:</strong> It is a client responsibility to recycle the
+     * received info by calling {@link android.view.accessibility.AccessibilityNodeInfo#recycle()}
+     * to avoid creating of multiple instances.
+     * </p>
+     *
+     * @param text The searched text.
+     * @return A list of node info.
+     */
+    public List<AccessibilityNodeInfoCompat> findAccessibilityNodeInfosByText(String text) {
+        List<AccessibilityNodeInfoCompat> result = new ArrayList<AccessibilityNodeInfoCompat>();
+        List<Object> infos = IMPL.findAccessibilityNodeInfosByText(mInfo, text);
+        final int infoCount = infos.size();
+        for (int i = 0; i < infoCount; i++) {
+            Object info = infos.get(i);
+            result.add(new AccessibilityNodeInfoCompat(info));
+        }
+        return result;
+    }
+
+    /**
+     * Gets the parent.
+     * <p>
+     * <strong>Note:</strong> It is a client responsibility to recycle the
+     * received info by calling {@link android.view.accessibility.AccessibilityNodeInfo#recycle()}
+     * to avoid creating of multiple instances.
+     * </p>
+     *
+     * @return The parent.
+     */
+    public AccessibilityNodeInfoCompat getParent() {
+        return AccessibilityNodeInfoCompat.wrapNonNullInstance(IMPL.getParent(mInfo));
+    }
+
+    /**
+     * Sets the parent.
+     * <p>
+     * <strong>Note:</strong> Cannot be called from an
+     * {@link android.accessibilityservice.AccessibilityService}. This class is
+     * made immutable before being delivered to an AccessibilityService.
+     * </p>
+     *
+     * @param parent The parent.
+     * @throws IllegalStateException If called from an AccessibilityService.
+     */
+    public void setParent(View parent) {
+        IMPL.setParent(mInfo, parent);
+    }
+
+    /**
+     * Sets the parent to be a virtual descendant of the given <code>root</code>.
+     * If <code>virtualDescendantId</code> equals to {@link View#NO_ID} the root
+     * is set as the parent.
+     * <p>
+     * A virtual descendant is an imaginary View that is reported as a part of the view
+     * hierarchy for accessibility purposes. This enables custom views that draw complex
+     * content to report them selves as a tree of virtual views, thus conveying their
+     * logical structure.
+     * </p>
+     * <p>
+     *   <strong>Note:</strong> Cannot be called from an
+     *   {@link android.accessibilityservice.AccessibilityService}.
+     *   This class is made immutable before being delivered to an AccessibilityService.
+     * </p>
+     *
+     * @param root The root of the virtual subtree.
+     * @param virtualDescendantId The id of the virtual descendant.
+     */
+    public void setParent(View root, int virtualDescendantId) {
+        IMPL.setParent(mInfo, root, virtualDescendantId);
+    }
+
+    /**
+     * Gets the node bounds in parent coordinates.
+     *
+     * @param outBounds The output node bounds.
+     */
+    public void getBoundsInParent(Rect outBounds) {
+        IMPL.getBoundsInParent(mInfo, outBounds);
+    }
+
+    /**
+     * Sets the node bounds in parent coordinates.
+     * <p>
+     * <strong>Note:</strong> Cannot be called from an
+     * {@link android.accessibilityservice.AccessibilityService}. This class is
+     * made immutable before being delivered to an AccessibilityService.
+     * </p>
+     *
+     * @param bounds The node bounds.
+     *@throws IllegalStateException If called from an AccessibilityService.
+     */
+    public void setBoundsInParent(Rect bounds) {
+        IMPL.setBoundsInParent(mInfo, bounds);
+    }
+
+    /**
+     * Gets the node bounds in screen coordinates.
+     *
+     * @param outBounds The output node bounds.
+     */
+    public void getBoundsInScreen(Rect outBounds) {
+        IMPL.getBoundsInScreen(mInfo, outBounds);
+    }
+
+    /**
+     * Sets the node bounds in screen coordinates.
+     * <p>
+     * <strong>Note:</strong> Cannot be called from an
+     * {@link android.accessibilityservice.AccessibilityService}. This class is
+     * made immutable before being delivered to an AccessibilityService.
+     * </p>
+     *
+     * @param bounds The node bounds.
+     * @throws IllegalStateException If called from an AccessibilityService.
+     */
+    public void setBoundsInScreen(Rect bounds) {
+        IMPL.setBoundsInScreen(mInfo, bounds);
+    }
+
+    /**
+     * Gets whether this node is checkable.
+     *
+     * @return True if the node is checkable.
+     */
+    public boolean isCheckable() {
+        return IMPL.isCheckable(mInfo);
+    }
+
+    /**
+     * Sets whether this node is checkable.
+     * <p>
+     * <strong>Note:</strong> Cannot be called from an
+     * {@link android.accessibilityservice.AccessibilityService}. This class is
+     * made immutable before being delivered to an AccessibilityService.
+     * </p>
+     *
+     * @param checkable True if the node is checkable.
+     * @throws IllegalStateException If called from an AccessibilityService.
+     */
+    public void setCheckable(boolean checkable) {
+        IMPL.setCheckable(mInfo, checkable);
+    }
+
+    /**
+     * Gets whether this node is checked.
+     *
+     * @return True if the node is checked.
+     */
+    public boolean isChecked() {
+        return IMPL.isChecked(mInfo);
+    }
+
+    /**
+     * Sets whether this node is checked.
+     * <p>
+     * <strong>Note:</strong> Cannot be called from an
+     * {@link android.accessibilityservice.AccessibilityService}. This class is
+     * made immutable before being delivered to an AccessibilityService.
+     * </p>
+     *
+     * @param checked True if the node is checked.
+     * @throws IllegalStateException If called from an AccessibilityService.
+     */
+    public void setChecked(boolean checked) {
+        IMPL.setChecked(mInfo, checked);
+    }
+
+    /**
+     * Gets whether this node is focusable.
+     *
+     * @return True if the node is focusable.
+     */
+    public boolean isFocusable() {
+        return IMPL.isFocusable(mInfo);
+    }
+
+    /**
+     * Sets whether this node is focusable.
+     * <p>
+     * <strong>Note:</strong> Cannot be called from an
+     * {@link android.accessibilityservice.AccessibilityService}. This class is
+     * made immutable before being delivered to an AccessibilityService.
+     * </p>
+     *
+     * @param focusable True if the node is focusable.
+     * @throws IllegalStateException If called from an AccessibilityService.
+     */
+    public void setFocusable(boolean focusable) {
+        IMPL.setFocusable(mInfo, focusable);
+    }
+
+    /**
+     * Gets whether this node is focused.
+     *
+     * @return True if the node is focused.
+     */
+    public boolean isFocused() {
+        return IMPL.isFocused(mInfo);
+    }
+
+    /**
+     * Sets whether this node is focused.
+     * <p>
+     * <strong>Note:</strong> Cannot be called from an
+     * {@link android.accessibilityservice.AccessibilityService}. This class is
+     * made immutable before being delivered to an AccessibilityService.
+     * </p>
+     *
+     * @param focused True if the node is focused.
+     * @throws IllegalStateException If called from an AccessibilityService.
+     */
+    public void setFocused(boolean focused) {
+        IMPL.setFocused(mInfo, focused);
+    }
+
+    /**
+     * Sets whether this node is visible to the user.
+     *
+     * @return Whether the node is visible to the user.
+     */
+    public boolean isVisibleToUser() {
+        return IMPL.isVisibleToUser(mInfo);
+    }
+
+    /**
+     * Sets whether this node is visible to the user.
+     * <p>
+     *   <strong>Note:</strong> Cannot be called from an
+     *   {@link android.accessibilityservice.AccessibilityService}.
+     *   This class is made immutable before being delivered to an AccessibilityService.
+     * </p>
+     *
+     * @param visibleToUser Whether the node is visible to the user.
+     *
+     * @throws IllegalStateException If called from an AccessibilityService.
+     */
+    public void setVisibleToUser(boolean visibleToUser) {
+        IMPL.setVisibleToUser(mInfo, visibleToUser);
+    }
+
+    /**
+     * Gets whether this node is accessibility focused.
+     *
+     * @return True if the node is accessibility focused.
+     */
+    public boolean isAccessibilityFocused() {
+        return IMPL.isAccessibilityFocused(mInfo);
+    }
+
+    /**
+     * Sets whether this node is accessibility focused.
+     * <p>
+     *   <strong>Note:</strong> Cannot be called from an
+     *   {@link android.accessibilityservice.AccessibilityService}.
+     *   This class is made immutable before being delivered to an AccessibilityService.
+     * </p>
+     *
+     * @param focused True if the node is accessibility focused.
+     *
+     * @throws IllegalStateException If called from an AccessibilityService.
+     */
+    public void setAccessibilityFocused(boolean focused) {
+        IMPL.setAccessibilityFocused(mInfo, focused);
+    }
+
+    /**
+     * Gets whether this node is selected.
+     *
+     * @return True if the node is selected.
+     */
+    public boolean isSelected() {
+        return IMPL.isSelected(mInfo);
+    }
+
+    /**
+     * Sets whether this node is selected.
+     * <p>
+     * <strong>Note:</strong> Cannot be called from an
+     * {@link android.accessibilityservice.AccessibilityService}. This class is
+     * made immutable before being delivered to an AccessibilityService.
+     * </p>
+     *
+     * @param selected True if the node is selected.
+     * @throws IllegalStateException If called from an AccessibilityService.
+     */
+    public void setSelected(boolean selected) {
+        IMPL.setSelected(mInfo, selected);
+    }
+
+    /**
+     * Gets whether this node is clickable.
+     *
+     * @return True if the node is clickable.
+     */
+    public boolean isClickable() {
+        return IMPL.isClickable(mInfo);
+    }
+
+    /**
+     * Sets whether this node is clickable.
+     * <p>
+     * <strong>Note:</strong> Cannot be called from an
+     * {@link android.accessibilityservice.AccessibilityService}. This class is
+     * made immutable before being delivered to an AccessibilityService.
+     * </p>
+     *
+     * @param clickable True if the node is clickable.
+     * @throws IllegalStateException If called from an AccessibilityService.
+     */
+    public void setClickable(boolean clickable) {
+        IMPL.setClickable(mInfo, clickable);
+    }
+
+    /**
+     * Gets whether this node is long clickable.
+     *
+     * @return True if the node is long clickable.
+     */
+    public boolean isLongClickable() {
+        return IMPL.isLongClickable(mInfo);
+    }
+
+    /**
+     * Sets whether this node is long clickable.
+     * <p>
+     * <strong>Note:</strong> Cannot be called from an
+     * {@link android.accessibilityservice.AccessibilityService}. This class is
+     * made immutable before being delivered to an AccessibilityService.
+     * </p>
+     *
+     * @param longClickable True if the node is long clickable.
+     * @throws IllegalStateException If called from an AccessibilityService.
+     */
+    public void setLongClickable(boolean longClickable) {
+        IMPL.setLongClickable(mInfo, longClickable);
+    }
+
+    /**
+     * Gets whether this node is enabled.
+     *
+     * @return True if the node is enabled.
+     */
+    public boolean isEnabled() {
+        return IMPL.isEnabled(mInfo);
+    }
+
+    /**
+     * Sets whether this node is enabled.
+     * <p>
+     * <strong>Note:</strong> Cannot be called from an
+     * {@link android.accessibilityservice.AccessibilityService}. This class is
+     * made immutable before being delivered to an AccessibilityService.
+     * </p>
+     *
+     * @param enabled True if the node is enabled.
+     * @throws IllegalStateException If called from an AccessibilityService.
+     */
+    public void setEnabled(boolean enabled) {
+        IMPL.setEnabled(mInfo, enabled);
+    }
+
+    /**
+     * Gets whether this node is a password.
+     *
+     * @return True if the node is a password.
+     */
+    public boolean isPassword() {
+        return IMPL.isPassword(mInfo);
+    }
+
+    /**
+     * Sets whether this node is a password.
+     * <p>
+     * <strong>Note:</strong> Cannot be called from an
+     * {@link android.accessibilityservice.AccessibilityService}. This class is
+     * made immutable before being delivered to an AccessibilityService.
+     * </p>
+     *
+     * @param password True if the node is a password.
+     * @throws IllegalStateException If called from an AccessibilityService.
+     */
+    public void setPassword(boolean password) {
+        IMPL.setPassword(mInfo, password);
+    }
+
+    /**
+     * Gets if the node is scrollable.
+     *
+     * @return True if the node is scrollable, false otherwise.
+     */
+    public boolean isScrollable() {
+        return IMPL.isScrollable(mInfo);
+    }
+
+    /**
+     * Sets if the node is scrollable.
+     * <p>
+     * <strong>Note:</strong> Cannot be called from an
+     * {@link android.accessibilityservice.AccessibilityService}. This class is
+     * made immutable before being delivered to an AccessibilityService.
+     * </p>
+     *
+     * @param scrollable True if the node is scrollable, false otherwise.
+     * @throws IllegalStateException If called from an AccessibilityService.
+     */
+    public void setScrollable(boolean scrollable) {
+        IMPL.setScrollable(mInfo, scrollable);
+    }
+
+    /**
+     * Returns whether the node originates from a view considered important for accessibility.
+     *
+     * @return {@code true} if the node originates from a view considered important for
+     *         accessibility, {@code false} otherwise
+     *
+     * @see View#isImportantForAccessibility()
+     */
+    public boolean isImportantForAccessibility() {
+        return IMPL.isImportantForAccessibility(mInfo);
+    }
+
+    /**
+     * Sets whether the node is considered important for accessibility.
+     * <p>
+     *   <strong>Note:</strong> Cannot be called from an
+     *   {@link android.accessibilityservice.AccessibilityService}.
+     *   This class is made immutable before being delivered to an AccessibilityService.
+     * </p>
+     *
+     * @param important {@code true} if the node is considered important for accessibility,
+     *                  {@code false} otherwise
+     */
+    public void setImportantForAccessibility(boolean important) {
+        IMPL.setImportantForAccessibility(mInfo, important);
+    }
+
+    /**
+     * Gets the package this node comes from.
+     *
+     * @return The package name.
+     */
+    public CharSequence getPackageName() {
+        return IMPL.getPackageName(mInfo);
+    }
+
+    /**
+     * Sets the package this node comes from.
+     * <p>
+     * <strong>Note:</strong> Cannot be called from an
+     * {@link android.accessibilityservice.AccessibilityService}. This class is
+     * made immutable before being delivered to an AccessibilityService.
+     * </p>
+     *
+     * @param packageName The package name.
+     * @throws IllegalStateException If called from an AccessibilityService.
+     */
+    public void setPackageName(CharSequence packageName) {
+        IMPL.setPackageName(mInfo, packageName);
+    }
+
+    /**
+     * Gets the class this node comes from.
+     *
+     * @return The class name.
+     */
+    public CharSequence getClassName() {
+        return IMPL.getClassName(mInfo);
+    }
+
+    /**
+     * Sets the class this node comes from.
+     * <p>
+     * <strong>Note:</strong> Cannot be called from an
+     * {@link android.accessibilityservice.AccessibilityService}. This class is
+     * made immutable before being delivered to an AccessibilityService.
+     * </p>
+     *
+     * @param className The class name.
+     * @throws IllegalStateException If called from an AccessibilityService.
+     */
+    public void setClassName(CharSequence className) {
+        IMPL.setClassName(mInfo, className);
+    }
+
+    /**
+     * Gets the text of this node.
+     *
+     * @return The text.
+     */
+    public CharSequence getText() {
+        return IMPL.getText(mInfo);
+    }
+
+    /**
+     * Sets the text of this node.
+     * <p>
+     * <strong>Note:</strong> Cannot be called from an
+     * {@link android.accessibilityservice.AccessibilityService}. This class is
+     * made immutable before being delivered to an AccessibilityService.
+     * </p>
+     *
+     * @param text The text.
+     * @throws IllegalStateException If called from an AccessibilityService.
+     */
+    public void setText(CharSequence text) {
+        IMPL.setText(mInfo, text);
+    }
+
+    /**
+     * Gets the content description of this node.
+     *
+     * @return The content description.
+     */
+    public CharSequence getContentDescription() {
+        return IMPL.getContentDescription(mInfo);
+    }
+
+    /**
+     * Sets the content description of this node.
+     * <p>
+     * <strong>Note:</strong> Cannot be called from an
+     * {@link android.accessibilityservice.AccessibilityService}. This class is
+     * made immutable before being delivered to an AccessibilityService.
+     * </p>
+     *
+     * @param contentDescription The content description.
+     * @throws IllegalStateException If called from an AccessibilityService.
+     */
+    public void setContentDescription(CharSequence contentDescription) {
+        IMPL.setContentDescription(mInfo, contentDescription);
+    }
+
+    /**
+     * Return an instance back to be reused.
+     * <p>
+     * <strong>Note:</strong> You must not touch the object after calling this function.
+     *
+     * @throws IllegalStateException If the info is already recycled.
+     */
+    public void recycle() {
+        IMPL.recycle(mInfo);
+    }
+
+    /**
+     * Sets the fully qualified resource name of the source view's id.
+     *
+     * <p>
+     *   <strong>Note:</strong> Cannot be called from an
+     *   {@link android.accessibilityservice.AccessibilityService}.
+     *   This class is made immutable before being delivered to an AccessibilityService.
+     * </p>
+     *
+     * @param viewId The id resource name.
+     */
+    public void setViewIdResourceName(String viewId) {
+        IMPL.setViewIdResourceName(mInfo, viewId);
+    }
+
+    /**
+     * Gets the fully qualified resource name of the source view's id.
+     *
+     * <p>
+     *   <strong>Note:</strong> The primary usage of this API is for UI test automation
+     *   and in order to report the source view id of an {@link AccessibilityNodeInfoCompat}
+     *   the client has to set the {@link AccessibilityServiceInfoCompat#FLAG_REPORT_VIEW_IDS}
+     *   flag when configuring his {@link android.accessibilityservice.AccessibilityService}.
+     * </p>
+     *
+     * @return The id resource name.
+     */
+    public String getViewIdResourceName() {
+        return IMPL.getViewIdResourceName(mInfo);
+    }
+
+    /**
+     * Gets the node's live region mode.
+     * <p>
+     * A live region is a node that contains information that is important for
+     * the user and when it changes the user should be notified. For example,
+     * in a login screen with a TextView that displays an "incorrect password"
+     * notification, that view should be marked as a live region with mode
+     * {@link ViewCompat#ACCESSIBILITY_LIVE_REGION_POLITE}.
+     * <p>
+     * It is the responsibility of the accessibility service to monitor
+     * {@link AccessibilityEventCompat#TYPE_WINDOW_CONTENT_CHANGED} events
+     * indicating changes to live region nodes and their children.
+     *
+     * @return The live region mode, or
+     *         {@link ViewCompat#ACCESSIBILITY_LIVE_REGION_NONE} if the view is
+     *         not a live region.
+     * @see ViewCompat#getAccessibilityLiveRegion(View)
+     */
+    public int getLiveRegion() {
+        return IMPL.getLiveRegion(mInfo);
+    }
+
+    /**
+     * Sets the node's live region mode.
+     * <p>
+     * <strong>Note:</strong> Cannot be called from an
+     * {@link android.accessibilityservice.AccessibilityService}. This class is
+     * made immutable before being delivered to an AccessibilityService.
+     *
+     * @param mode The live region mode, or
+     *        {@link ViewCompat#ACCESSIBILITY_LIVE_REGION_NONE} if the view is
+     *        not a live region.
+     * @see ViewCompat#setAccessibilityLiveRegion(View, int)
+     */
+    public void setLiveRegion(int mode) {
+        IMPL.setLiveRegion(mInfo, mode);
+    }
+
+    /**
+     * Get the drawing order of the view corresponding it this node.
+     * <p>
+     * Drawing order is determined only within the node's parent, so this index is only relative
+     * to its siblings.
+     * <p>
+     * In some cases, the drawing order is essentially simultaneous, so it is possible for two
+     * siblings to return the same value. It is also possible that values will be skipped.
+     *
+     * @return The drawing position of the view corresponding to this node relative to its siblings.
+     */
+    public int getDrawingOrder() {
+        return IMPL.getDrawingOrder(mInfo);
+    }
+
+    /**
+     * Set the drawing order of the view corresponding it this node.
+     *
+     * <p>
+     *   <strong>Note:</strong> Cannot be called from an
+     *   {@link android.accessibilityservice.AccessibilityService}.
+     *   This class is made immutable before being delivered to an AccessibilityService.
+     * </p>
+     * @param drawingOrderInParent
+     * @throws IllegalStateException If called from an AccessibilityService.
+     */
+    public void setDrawingOrder(int drawingOrderInParent) {
+        IMPL.setDrawingOrder(mInfo, drawingOrderInParent);
+    }
+
+    /**
+     * Gets the collection info if the node is a collection. A collection
+     * child is always a collection item.
+     *
+     * @return The collection info.
+     */
+    public CollectionInfoCompat getCollectionInfo() {
+        Object info = IMPL.getCollectionInfo(mInfo);
+        if (info == null) return null;
+        return new CollectionInfoCompat(info);
+    }
+
+    public void setCollectionInfo(Object collectionInfo) {
+        IMPL.setCollectionInfo(mInfo, ((CollectionInfoCompat) collectionInfo).mInfo);
+    }
+
+    public void setCollectionItemInfo(Object collectionItemInfo) {
+        IMPL.setCollectionItemInfo(mInfo, ((CollectionItemInfoCompat) collectionItemInfo).mInfo);
+    }
+
+    /**
+     * Gets the collection item info if the node is a collection item. A collection
+     * item is always a child of a collection.
+     *
+     * @return The collection item info.
+     */
+    public CollectionItemInfoCompat getCollectionItemInfo() {
+        Object info = IMPL.getCollectionItemInfo(mInfo);
+        if (info == null) return null;
+        return new CollectionItemInfoCompat(info);
+    }
+
+    /**
+     * Gets the range info if this node is a range.
+     *
+     * @return The range.
+     */
+    public RangeInfoCompat getRangeInfo() {
+        Object info = IMPL.getRangeInfo(mInfo);
+        if (info == null) return null;
+        return new RangeInfoCompat(info);
+    }
+
+    /**
+     * Sets the range info if this node is a range.
+     * <p>
+     *   <strong>Note:</strong> Cannot be called from an
+     *   {@link android.accessibilityservice.AccessibilityService}.
+     *   This class is made immutable before being delivered to an AccessibilityService.
+     * </p>
+     *
+     * @param rangeInfo The range info.
+     */
+    public void setRangeInfo(RangeInfoCompat rangeInfo) {
+        IMPL.setRangeInfo(mInfo, rangeInfo.mInfo);
+    }
+
+    /**
+     * Gets the actions that can be performed on the node.
+     *
+     * @return A list of AccessibilityActions.
+     */
+    public List<AccessibilityActionCompat> getActionList() {
+        List<Object> actions = IMPL.getActionList(mInfo);
+        if (actions != null) {
+            List<AccessibilityActionCompat> result = new ArrayList<AccessibilityActionCompat>();
+            final int actionCount = actions.size();
+            for (int i = 0; i < actionCount; i++) {
+                Object action = actions.get(i);
+                result.add(new AccessibilityActionCompat(action));
+            }
+            return result;
+        } else {
+            return Collections.<AccessibilityActionCompat>emptyList();
+        }
+    }
+
+    /**
+     * Sets if the content of this node is invalid. For example,
+     * a date is not well-formed.
+     * <p>
+     *   <strong>Note:</strong> Cannot be called from an
+     *   {@link android.accessibilityservice.AccessibilityService}.
+     *   This class is made immutable before being delivered to an AccessibilityService.
+     * </p>
+     *
+     * @param contentInvalid If the node content is invalid.
+     */
+    public void setContentInvalid(boolean contentInvalid) {
+        IMPL.setContentInvalid(mInfo, contentInvalid);
+    }
+
+    /**
+     * Gets if the content of this node is invalid. For example,
+     * a date is not well-formed.
+     *
+     * @return If the node content is invalid.
+     */
+    public boolean isContentInvalid() {
+        return IMPL.isContentInvalid(mInfo);
+    }
+
+    /**
+     * Gets whether this node is context clickable.
+     *
+     * @return True if the node is context clickable.
+     */
+    public boolean isContextClickable() {
+        return IMPL.isContextClickable(mInfo);
+    }
+
+    /**
+     * Sets whether this node is context clickable.
+     * <p>
+     * <strong>Note:</strong> Cannot be called from an
+     * {@link android.accessibilityservice.AccessibilityService}. This class is made immutable
+     * before being delivered to an AccessibilityService.
+     * </p>
+     *
+     * @param contextClickable True if the node is context clickable.
+     * @throws IllegalStateException If called from an AccessibilityService.
+     */
+    public void setContextClickable(boolean contextClickable) {
+        IMPL.setContextClickable(mInfo, contextClickable);
+    }
+
+    /**
+     * Sets the error text of this node.
+     * <p>
+     *   <strong>Note:</strong> Cannot be called from an
+     *   {@link android.accessibilityservice.AccessibilityService}.
+     *   This class is made immutable before being delivered to an AccessibilityService.
+     * </p>
+     *
+     * @param error The error text.
+     *
+     * @throws IllegalStateException If called from an AccessibilityService.
+     */
+    public void setError(CharSequence error) {
+        IMPL.setError(mInfo, error);
+    }
+
+    /**
+     * Gets the error text of this node.
+     *
+     * @return The error text.
+     */
+    public CharSequence getError() {
+        return IMPL.getError(mInfo);
+    }
+
+    /**
+     * Sets the view for which the view represented by this info serves as a
+     * label for accessibility purposes.
+     *
+     * @param labeled The view for which this info serves as a label.
+     */
+    public void setLabelFor(View labeled) {
+        IMPL.setLabelFor(mInfo, labeled);
+    }
+
+    /**
+     * Sets the view for which the view represented by this info serves as a
+     * label for accessibility purposes. If <code>virtualDescendantId</code>
+     * is {@link View#NO_ID} the root is set as the labeled.
+     * <p>
+     * A virtual descendant is an imaginary View that is reported as a part of the view
+     * hierarchy for accessibility purposes. This enables custom views that draw complex
+     * content to report themselves as a tree of virtual views, thus conveying their
+     * logical structure.
+     * </p>
+     *
+     * @param root The root whose virtual descendant serves as a label.
+     * @param virtualDescendantId The id of the virtual descendant.
+     */
+    public void setLabelFor(View root, int virtualDescendantId) {
+        IMPL.setLabelFor(mInfo, root, virtualDescendantId);
+    }
+
+    /**
+     * Gets the node info for which the view represented by this info serves as
+     * a label for accessibility purposes.
+     * <p>
+     *   <strong>Note:</strong> It is a client responsibility to recycle the
+     *     received info by calling {@link AccessibilityNodeInfoCompat#recycle()}
+     *     to avoid creating of multiple instances.
+     * </p>
+     *
+     * @return The labeled info.
+     */
+    public AccessibilityNodeInfoCompat getLabelFor() {
+        return AccessibilityNodeInfoCompat.wrapNonNullInstance(IMPL.getLabelFor(mInfo));
+    }
+
+    /**
+     * Sets the view which serves as the label of the view represented by
+     * this info for accessibility purposes.
+     *
+     * @param label The view that labels this node's source.
+     */
+    public void setLabeledBy(View label) {
+        IMPL.setLabeledBy(mInfo, label);
+    }
+
+    /**
+     * Sets the view which serves as the label of the view represented by
+     * this info for accessibility purposes. If <code>virtualDescendantId</code>
+     * is {@link View#NO_ID} the root is set as the label.
+     * <p>
+     * A virtual descendant is an imaginary View that is reported as a part of the view
+     * hierarchy for accessibility purposes. This enables custom views that draw complex
+     * content to report themselves as a tree of virtual views, thus conveying their
+     * logical structure.
+     * </p>
+     * <p>
+     *   <strong>Note:</strong> Cannot be called from an
+     *   {@link android.accessibilityservice.AccessibilityService}.
+     *   This class is made immutable before being delivered to an AccessibilityService.
+     * </p>
+     *
+     * @param root The root whose virtual descendant labels this node's source.
+     * @param virtualDescendantId The id of the virtual descendant.
+     */
+    public void setLabeledBy(View root, int virtualDescendantId) {
+        IMPL.setLabeledBy(mInfo, root, virtualDescendantId);
+    }
+
+    /**
+     * Gets the node info which serves as the label of the view represented by
+     * this info for accessibility purposes.
+     * <p>
+     *   <strong>Note:</strong> It is a client responsibility to recycle the
+     *     received info by calling {@link AccessibilityNodeInfoCompat#recycle()}
+     *     to avoid creating of multiple instances.
+     * </p>
+     *
+     * @return The label.
+     */
+    public AccessibilityNodeInfoCompat getLabeledBy() {
+        return AccessibilityNodeInfoCompat.wrapNonNullInstance(IMPL.getLabeledBy(mInfo));
+    }
+
+    /**
+     * Gets if this node opens a popup or a dialog.
+     *
+     * @return If the the node opens a popup.
+     */
+    public boolean canOpenPopup() {
+        return IMPL.canOpenPopup(mInfo);
+    }
+
+    /**
+     * Sets if this node opens a popup or a dialog.
+     * <p>
+     *   <strong>Note:</strong> Cannot be called from an
+     *   {@link android.accessibilityservice.AccessibilityService}.
+     *   This class is made immutable before being delivered to an AccessibilityService.
+     * </p>
+     *
+     * @param opensPopup If the the node opens a popup.
+     */
+    public void setCanOpenPopup(boolean opensPopup) {
+        IMPL.setCanOpenPopup(mInfo, opensPopup);
+    }
+
+    /**
+     * Finds {@link AccessibilityNodeInfoCompat}s by the fully qualified view id's resource
+     * name where a fully qualified id is of the from "package:id/id_resource_name".
+     * For example, if the target application's package is "foo.bar" and the id
+     * resource name is "baz", the fully qualified resource id is "foo.bar:id/baz".
+     *
+     * <p>
+     *   <strong>Note:</strong> It is a client responsibility to recycle the
+     *     received info by calling {@link AccessibilityNodeInfoCompat#recycle()}
+     *     to avoid creating of multiple instances.
+     * </p>
+     * <p>
+     *   <strong>Note:</strong> The primary usage of this API is for UI test automation
+     *   and in order to report the fully qualified view id if an
+     *   {@link AccessibilityNodeInfoCompat} the client has to set the
+     *   {@link android.accessibilityservice.AccessibilityServiceInfo#FLAG_REPORT_VIEW_IDS}
+     *   flag when configuring his {@link android.accessibilityservice.AccessibilityService}.
+     * </p>
+     *
+     * @param viewId The fully qualified resource name of the view id to find.
+     * @return A list of node info.
+     */
+    public List<AccessibilityNodeInfoCompat> findAccessibilityNodeInfosByViewId(String viewId) {
+        List<Object> nodes = IMPL.findAccessibilityNodeInfosByViewId(mInfo, viewId);
+        if (nodes != null) {
+            List<AccessibilityNodeInfoCompat> result = new ArrayList<AccessibilityNodeInfoCompat>();
+            for (Object node : nodes) {
+                result.add(new AccessibilityNodeInfoCompat(node));
+            }
+            return result;
+        } else {
+            return Collections.emptyList();
+        }
+    }
+
+    /**
+     * Gets an optional bundle with extra data. The bundle
+     * is lazily created and never <code>null</code>.
+     * <p>
+     * <strong>Note:</strong> It is recommended to use the package
+     * name of your application as a prefix for the keys to avoid
+     * collisions which may confuse an accessibility service if the
+     * same key has different meaning when emitted from different
+     * applications.
+     * </p>
+     *
+     * @return The bundle.
+     */
+    public Bundle getExtras() {
+        return IMPL.getExtras(mInfo);
+    }
+
+    /**
+     * Gets the input type of the source as defined by {@link InputType}.
+     *
+     * @return The input type.
+     */
+    public int getInputType() {
+        return IMPL.getInputType(mInfo);
+    }
+
+    /**
+     * Sets the input type of the source as defined by {@link InputType}.
+     * <p>
+     *   <strong>Note:</strong> Cannot be called from an
+     *   {@link android.accessibilityservice.AccessibilityService}.
+     *   This class is made immutable before being delivered to an
+     *   AccessibilityService.
+     * </p>
+     *
+     * @param inputType The input type.
+     *
+     * @throws IllegalStateException If called from an AccessibilityService.
+     */
+    public void setInputType(int inputType) {
+        IMPL.setInputType(mInfo, inputType);
+    }
+
+    /**
+     * Sets the maximum text length, or -1 for no limit.
+     * <p>
+     * Typically used to indicate that an editable text field has a limit on
+     * the number of characters entered.
+     * <p>
+     * <strong>Note:</strong> Cannot be called from an
+     * {@link android.accessibilityservice.AccessibilityService}.
+     * This class is made immutable before being delivered to an AccessibilityService.
+     *
+     * @param max The maximum text length.
+     * @see #getMaxTextLength()
+     *
+     * @throws IllegalStateException If called from an AccessibilityService.
+     */
+    public void setMaxTextLength(int max) {
+        IMPL.setMaxTextLength(mInfo, max);
+    }
+
+    /**
+     * Returns the maximum text length for this node.
+     *
+     * @return The maximum text length, or -1 for no limit.
+     * @see #setMaxTextLength(int)
+     */
+    public int getMaxTextLength() {
+        return IMPL.getMaxTextLength(mInfo);
+    }
+
+    /**
+     * Sets the text selection start and end.
+     * <p>
+     *   <strong>Note:</strong> Cannot be called from an
+     *   {@link android.accessibilityservice.AccessibilityService}.
+     *   This class is made immutable before being delivered to an AccessibilityService.
+     * </p>
+     *
+     * @param start The text selection start.
+     * @param end The text selection end.
+     *
+     * @throws IllegalStateException If called from an AccessibilityService.
+     */
+    public void setTextSelection(int start, int end) {
+        IMPL.setTextSelection(mInfo, start, end);
+    }
+
+    /**
+     * Gets the text selection start.
+     *
+     * @return The text selection start if there is selection or -1.
+     */
+    public int getTextSelectionStart() {
+        return IMPL.getTextSelectionStart(mInfo);
+    }
+
+    /**
+     * Gets the text selection end.
+     *
+     * @return The text selection end if there is selection or -1.
+     */
+    public int getTextSelectionEnd() {
+        return IMPL.getTextSelectionEnd(mInfo);
+    }
+
+    /**
+     * Gets the node before which this one is visited during traversal. A screen-reader
+     * must visit the content of this node before the content of the one it precedes.
+     *
+     * @return The succeeding node if such or <code>null</code>.
+     *
+     * @see #setTraversalBefore(android.view.View)
+     * @see #setTraversalBefore(android.view.View, int)
+     */
+    public AccessibilityNodeInfoCompat getTraversalBefore() {
+        return AccessibilityNodeInfoCompat.wrapNonNullInstance(IMPL.getTraversalBefore(mInfo));
+    }
+
+    /**
+     * Sets the view before whose node this one should be visited during traversal. A
+     * screen-reader must visit the content of this node before the content of the one
+     * it precedes.
+     * <p>
+     *   <strong>Note:</strong> Cannot be called from an
+     *   {@link android.accessibilityservice.AccessibilityService}.
+     *   This class is made immutable before being delivered to an AccessibilityService.
+     * </p>
+     *
+     * @param view The view providing the preceding node.
+     *
+     * @see #getTraversalBefore()
+     */
+    public void setTraversalBefore(View view) {
+        IMPL.setTraversalBefore(mInfo, view);
+    }
+
+    /**
+     * Sets the node before which this one is visited during traversal. A screen-reader
+     * must visit the content of this node before the content of the one it precedes.
+     * The successor is a virtual descendant of the given <code>root</code>. If
+     * <code>virtualDescendantId</code> equals to {@link View#NO_ID} the root is set
+     * as the successor.
+     * <p>
+     * A virtual descendant is an imaginary View that is reported as a part of the view
+     * hierarchy for accessibility purposes. This enables custom views that draw complex
+     * content to report them selves as a tree of virtual views, thus conveying their
+     * logical structure.
+     * </p>
+     * <p>
+     *   <strong>Note:</strong> Cannot be called from an
+     *   {@link android.accessibilityservice.AccessibilityService}.
+     *   This class is made immutable before being delivered to an AccessibilityService.
+     * </p>
+     *
+     * @param root The root of the virtual subtree.
+     * @param virtualDescendantId The id of the virtual descendant.
+     */
+    public void setTraversalBefore(View root, int virtualDescendantId) {
+        IMPL.setTraversalBefore(mInfo, root, virtualDescendantId);
+    }
+
+    /**
+     * Gets the node after which this one is visited in accessibility traversal.
+     * A screen-reader must visit the content of the other node before the content
+     * of this one.
+     *
+     * @return The succeeding node if such or <code>null</code>.
+     *
+     * @see #setTraversalAfter(android.view.View)
+     * @see #setTraversalAfter(android.view.View, int)
+     */
+    public AccessibilityNodeInfoCompat getTraversalAfter() {
+        return AccessibilityNodeInfoCompat.wrapNonNullInstance(IMPL.getTraversalAfter(mInfo));
+    }
+
+    /**
+     * Sets the view whose node is visited after this one in accessibility traversal.
+     * A screen-reader must visit the content of the other node before the content
+     * of this one.
+     * <p>
+     *   <strong>Note:</strong> Cannot be called from an
+     *   {@link android.accessibilityservice.AccessibilityService}.
+     *   This class is made immutable before being delivered to an AccessibilityService.
+     * </p>
+     *
+     * @param view The previous view.
+     *
+     * @see #getTraversalAfter()
+     */
+    public void setTraversalAfter(View view) {
+        IMPL.setTraversalAfter(mInfo, view);
+    }
+
+    /**
+     * Sets the node after which this one is visited in accessibility traversal.
+     * A screen-reader must visit the content of the other node before the content
+     * of this one. If <code>virtualDescendantId</code> equals to {@link View#NO_ID}
+     * the root is set as the predecessor.
+     * <p>
+     * A virtual descendant is an imaginary View that is reported as a part of the view
+     * hierarchy for accessibility purposes. This enables custom views that draw complex
+     * content to report them selves as a tree of virtual views, thus conveying their
+     * logical structure.
+     * </p>
+     * <p>
+     *   <strong>Note:</strong> Cannot be called from an
+     *   {@link android.accessibilityservice.AccessibilityService}.
+     *   This class is made immutable before being delivered to an AccessibilityService.
+     * </p>
+     *
+     * @param root The root of the virtual subtree.
+     * @param virtualDescendantId The id of the virtual descendant.
+     */
+    public void setTraversalAfter(View root, int virtualDescendantId) {
+        IMPL.setTraversalAfter(mInfo, root, virtualDescendantId);
+    }
+
+    /**
+     * Gets the window to which this node belongs.
+     *
+     * @return The window.
+     *
+     * @see android.accessibilityservice.AccessibilityService#getWindows()
+     */
+    public AccessibilityWindowInfoCompat getWindow() {
+        return AccessibilityWindowInfoCompat.wrapNonNullInstance(IMPL.getWindow(mInfo));
+    }
+
+    /**
+     * Gets if the node can be dismissed.
+     *
+     * @return If the node can be dismissed.
+     */
+    public boolean isDismissable() {
+        return IMPL.isDismissable(mInfo);
+    }
+
+    /**
+     * Sets if the node can be dismissed.
+     * <p>
+     *   <strong>Note:</strong> Cannot be called from an
+     *   {@link android.accessibilityservice.AccessibilityService}.
+     *   This class is made immutable before being delivered to an AccessibilityService.
+     * </p>
+     *
+     * @param dismissable If the node can be dismissed.
+     */
+    public void setDismissable(boolean dismissable) {
+        IMPL.setDismissable(mInfo, dismissable);
+    }
+
+    /**
+     * Gets if the node is editable.
+     *
+     * @return True if the node is editable, false otherwise.
+     */
+    public boolean isEditable() {
+        return IMPL.isEditable(mInfo);
+    }
+
+    /**
+     * Sets whether this node is editable.
+     * <p>
+     *   <strong>Note:</strong> Cannot be called from an
+     *   {@link android.accessibilityservice.AccessibilityService}.
+     *   This class is made immutable before being delivered to an AccessibilityService.
+     * </p>
+     *
+     * @param editable True if the node is editable.
+     *
+     * @throws IllegalStateException If called from an AccessibilityService.
+     */
+    public void setEditable(boolean editable) {
+        IMPL.setEditable(mInfo, editable);
+    }
+
+    /**
+     * Gets if the node is a multi line editable text.
+     *
+     * @return True if the node is multi line.
+     */
+    public boolean isMultiLine() {
+        return IMPL.isMultiLine(mInfo);
+    }
+
+    /**
+     * Sets if the node is a multi line editable text.
+     * <p>
+     *   <strong>Note:</strong> Cannot be called from an
+     *   {@link android.accessibilityservice.AccessibilityService}.
+     *   This class is made immutable before being delivered to an AccessibilityService.
+     * </p>
+     *
+     * @param multiLine True if the node is multi line.
+     */
+    public void setMultiLine(boolean multiLine) {
+        IMPL.setMultiLine(mInfo, multiLine);
+    }
+
+    /**
+     * Refreshes this info with the latest state of the view it represents.
+     * <p>
+     * <strong>Note:</strong> If this method returns false this info is obsolete
+     * since it represents a view that is no longer in the view tree and should
+     * be recycled.
+     * </p>
+     * @return Whether the refresh succeeded.
+     */
+    public boolean refresh() {
+        return IMPL.refresh(mInfo);
+    }
+
+    /**
+     * Gets the custom role description.
+     * @return The role description.
+     */
+    public @Nullable CharSequence getRoleDescription() {
+        return IMPL.getRoleDescription(mInfo);
+    }
+
+    /**
+     * Sets the custom role description.
+     *
+     * <p>
+     *   The role description allows you to customize the name for the view's semantic
+     *   role. For example, if you create a custom subclass of {@link android.view.View}
+     *   to display a menu bar, you could assign it the role description of "menu bar".
+     * </p>
+     * <p>
+     *   <strong>Warning:</strong> For consistency with other applications, you should
+     *   not use the role description to force accessibility services to describe
+     *   standard views (such as buttons or checkboxes) using specific wording. For
+     *   example, you should not set a role description of "check box" or "tick box" for
+     *   a standard {@link android.widget.CheckBox}. Instead let accessibility services
+     *   decide what feedback to provide.
+     * </p>
+     * <p>
+     *   <strong>Note:</strong> Cannot be called from an
+     *   {@link android.accessibilityservice.AccessibilityService}.
+     *   This class is made immutable before being delivered to an AccessibilityService.
+     * </p>
+     *
+     * @param roleDescription The role description.
+     */
+    public void setRoleDescription(@Nullable CharSequence roleDescription) {
+        IMPL.setRoleDescription(mInfo, roleDescription);
+    }
+
+    @Override
+    public int hashCode() {
+        return (mInfo == null) ? 0 : mInfo.hashCode();
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj == null) {
+            return false;
+        }
+        if (getClass() != obj.getClass()) {
+            return false;
+        }
+        AccessibilityNodeInfoCompat other = (AccessibilityNodeInfoCompat) obj;
+        if (mInfo == null) {
+            if (other.mInfo != null) {
+                return false;
+            }
+        } else if (!mInfo.equals(other.mInfo)) {
+            return false;
+        }
+        return true;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder builder = new StringBuilder();
+        builder.append(super.toString());
+
+        Rect bounds = new Rect();
+
+        getBoundsInParent(bounds);
+        builder.append("; boundsInParent: " + bounds);
+
+        getBoundsInScreen(bounds);
+        builder.append("; boundsInScreen: " + bounds);
+
+        builder.append("; packageName: ").append(getPackageName());
+        builder.append("; className: ").append(getClassName());
+        builder.append("; text: ").append(getText());
+        builder.append("; contentDescription: ").append(getContentDescription());
+        builder.append("; viewId: ").append(getViewIdResourceName());
+
+        builder.append("; checkable: ").append(isCheckable());
+        builder.append("; checked: ").append(isChecked());
+        builder.append("; focusable: ").append(isFocusable());
+        builder.append("; focused: ").append(isFocused());
+        builder.append("; selected: ").append(isSelected());
+        builder.append("; clickable: ").append(isClickable());
+        builder.append("; longClickable: ").append(isLongClickable());
+        builder.append("; enabled: ").append(isEnabled());
+        builder.append("; password: ").append(isPassword());
+        builder.append("; scrollable: " + isScrollable());
+
+        builder.append("; [");
+        for (int actionBits = getActions(); actionBits != 0;) {
+            final int action = 1 << Integer.numberOfTrailingZeros(actionBits);
+            actionBits &= ~action;
+            builder.append(getActionSymbolicName(action));
+            if (actionBits != 0) {
+                builder.append(", ");
+            }
+        }
+        builder.append("]");
+
+        return builder.toString();
+    }
+
+    private static String getActionSymbolicName(int action) {
+        switch (action) {
+            case ACTION_FOCUS:
+                return "ACTION_FOCUS";
+            case ACTION_CLEAR_FOCUS:
+                return "ACTION_CLEAR_FOCUS";
+            case ACTION_SELECT:
+                return "ACTION_SELECT";
+            case ACTION_CLEAR_SELECTION:
+                return "ACTION_CLEAR_SELECTION";
+            case ACTION_CLICK:
+                return "ACTION_CLICK";
+            case ACTION_LONG_CLICK:
+                return "ACTION_LONG_CLICK";
+            case ACTION_ACCESSIBILITY_FOCUS:
+                return "ACTION_ACCESSIBILITY_FOCUS";
+            case ACTION_CLEAR_ACCESSIBILITY_FOCUS:
+                return "ACTION_CLEAR_ACCESSIBILITY_FOCUS";
+            case ACTION_NEXT_AT_MOVEMENT_GRANULARITY:
+                return "ACTION_NEXT_AT_MOVEMENT_GRANULARITY";
+            case ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY:
+                return "ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY";
+            case ACTION_NEXT_HTML_ELEMENT:
+                return "ACTION_NEXT_HTML_ELEMENT";
+            case ACTION_PREVIOUS_HTML_ELEMENT:
+                return "ACTION_PREVIOUS_HTML_ELEMENT";
+            case ACTION_SCROLL_FORWARD:
+                return "ACTION_SCROLL_FORWARD";
+            case ACTION_SCROLL_BACKWARD:
+                return "ACTION_SCROLL_BACKWARD";
+            case ACTION_CUT:
+                return "ACTION_CUT";
+            case ACTION_COPY:
+                return "ACTION_COPY";
+            case ACTION_PASTE:
+                return "ACTION_PASTE";
+            case ACTION_SET_SELECTION:
+                return "ACTION_SET_SELECTION";
+            default:
+                return"ACTION_UNKNOWN";
+        }
+    }
+}
diff --git a/compat/java/android/support/v4/view/accessibility/AccessibilityNodeProviderCompat.java b/compat/java/android/support/v4/view/accessibility/AccessibilityNodeProviderCompat.java
new file mode 100644
index 0000000..42a883b
--- /dev/null
+++ b/compat/java/android/support/v4/view/accessibility/AccessibilityNodeProviderCompat.java
@@ -0,0 +1,253 @@
+/*
+ * Copyright (C) 2012 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 android.support.v4.view.accessibility;
+
+import android.os.Build;
+import android.os.Bundle;
+import android.view.View;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Helper for accessing {@link android.view.accessibility.AccessibilityNodeProvider}
+ * introduced after API level 4 in a backwards compatible fashion.
+ */
+public class AccessibilityNodeProviderCompat {
+
+    interface AccessibilityNodeProviderImpl {
+        public Object newAccessibilityNodeProviderBridge(AccessibilityNodeProviderCompat compat);
+    }
+
+    static class AccessibilityNodeProviderStubImpl implements AccessibilityNodeProviderImpl {
+        @Override
+        public Object newAccessibilityNodeProviderBridge(AccessibilityNodeProviderCompat compat) {
+            return null;
+        }
+    }
+
+    static class AccessibilityNodeProviderJellyBeanImpl extends AccessibilityNodeProviderStubImpl {
+        @Override
+        public Object newAccessibilityNodeProviderBridge(
+                final AccessibilityNodeProviderCompat compat) {
+            return AccessibilityNodeProviderCompatJellyBean.newAccessibilityNodeProviderBridge(
+                    new AccessibilityNodeProviderCompatJellyBean.AccessibilityNodeInfoBridge() {
+                        @Override
+                        public boolean performAction(int virtualViewId, int action,
+                                Bundle arguments) {
+                            return compat.performAction(virtualViewId, action, arguments);
+                        }
+
+                        @Override
+                        public List<Object> findAccessibilityNodeInfosByText(
+                                            String text, int virtualViewId) {
+                            List<AccessibilityNodeInfoCompat> compatInfos =
+                                compat.findAccessibilityNodeInfosByText(text, virtualViewId);
+                            List<Object> infos = new ArrayList<Object>();
+                            final int infoCount = compatInfos.size();
+                            for (int i = 0; i < infoCount; i++) {
+                                AccessibilityNodeInfoCompat infoCompat = compatInfos.get(i);
+                                infos.add(infoCompat.getInfo());
+                            }
+                            return infos;
+                        }
+
+                        @Override
+                        public Object createAccessibilityNodeInfo(
+                                int virtualViewId) {
+                            final AccessibilityNodeInfoCompat compatInfo = compat
+                                    .createAccessibilityNodeInfo(virtualViewId);
+                            if (compatInfo == null) {
+                                return null;
+                            } else {
+                                return compatInfo.getInfo();
+                            }
+                        }
+                    });
+        }
+    }
+
+    static class AccessibilityNodeProviderKitKatImpl extends AccessibilityNodeProviderStubImpl {
+        @Override
+        public Object newAccessibilityNodeProviderBridge(
+                final AccessibilityNodeProviderCompat compat) {
+            return AccessibilityNodeProviderCompatKitKat.newAccessibilityNodeProviderBridge(
+                    new AccessibilityNodeProviderCompatKitKat.AccessibilityNodeInfoBridge() {
+                        @Override
+                        public boolean performAction(
+                                int virtualViewId, int action, Bundle arguments) {
+                            return compat.performAction(virtualViewId, action, arguments);
+                        }
+
+                        @Override
+                        public List<Object> findAccessibilityNodeInfosByText(
+                                String text, int virtualViewId) {
+                            List<AccessibilityNodeInfoCompat> compatInfos =
+                                    compat.findAccessibilityNodeInfosByText(text, virtualViewId);
+                            List<Object> infos = new ArrayList<Object>();
+                            final int infoCount = compatInfos.size();
+                            for (int i = 0; i < infoCount; i++) {
+                                AccessibilityNodeInfoCompat infoCompat = compatInfos.get(i);
+                                infos.add(infoCompat.getInfo());
+                            }
+                            return infos;
+                        }
+
+                        @Override
+                        public Object createAccessibilityNodeInfo(int virtualViewId) {
+                            final AccessibilityNodeInfoCompat compatInfo =
+                                    compat.createAccessibilityNodeInfo(virtualViewId);
+                            if (compatInfo == null) {
+                                return null;
+                            } else {
+                                return compatInfo.getInfo();
+                            }
+                        }
+
+                        @Override
+                        public Object findFocus(int focus) {
+                            final AccessibilityNodeInfoCompat compatInfo = compat.findFocus(focus);
+                            if (compatInfo == null) {
+                                return null;
+                            } else {
+                                return compatInfo.getInfo();
+                            }
+                        }
+                    });
+        }
+    }
+
+    /**
+     * The virtual id for the hosting View.
+     */
+    public static final int HOST_VIEW_ID = -1;
+
+    private static final AccessibilityNodeProviderImpl IMPL;
+
+    private final Object mProvider;
+
+    static {
+        if (Build.VERSION.SDK_INT >= 19) { // KitKat
+            IMPL = new AccessibilityNodeProviderKitKatImpl();
+        } else if (Build.VERSION.SDK_INT >= 16) { // JellyBean
+            IMPL = new AccessibilityNodeProviderJellyBeanImpl();
+        } else {
+            IMPL = new AccessibilityNodeProviderStubImpl();
+        }
+    }
+
+    /**
+     * Creates a new instance.
+     */
+    public AccessibilityNodeProviderCompat() {
+        mProvider = IMPL.newAccessibilityNodeProviderBridge(this);
+    }
+
+    /**
+     * Creates a new instance wrapping an
+     * {@link android.view.accessibility.AccessibilityNodeProvider}.
+     *
+     * @param provider The provider.
+     */
+    public AccessibilityNodeProviderCompat(Object provider) {
+        mProvider = provider;
+    }
+
+    /**
+     * @return The wrapped {@link android.view.accessibility.AccessibilityNodeProvider}.
+     */
+    public Object getProvider() {
+        return mProvider;
+    }
+
+    /**
+     * Returns an {@link AccessibilityNodeInfoCompat} representing a virtual view,
+     * i.e. a descendant of the host View, with the given <code>virtualViewId</code>
+     * or the host View itself if <code>virtualViewId</code> equals to {@link #HOST_VIEW_ID}.
+     * <p>
+     * A virtual descendant is an imaginary View that is reported as a part of the view
+     * hierarchy for accessibility purposes. This enables custom views that draw complex
+     * content to report them selves as a tree of virtual views, thus conveying their
+     * logical structure.
+     * </p>
+     * <p>
+     * The implementer is responsible for obtaining an accessibility node info from the
+     * pool of reusable instances and setting the desired properties of the node info
+     * before returning it.
+     * </p>
+     *
+     * @param virtualViewId A client defined virtual view id.
+     * @return A populated {@link AccessibilityNodeInfoCompat} for a virtual descendant
+     *     or the host View.
+     *
+     * @see AccessibilityNodeInfoCompat
+     */
+    public AccessibilityNodeInfoCompat createAccessibilityNodeInfo(int virtualViewId) {
+        return null;
+    }
+
+    /**
+     * Performs an accessibility action on a virtual view, i.e. a descendant of the
+     * host View, with the given <code>virtualViewId</code> or the host View itself
+     * if <code>virtualViewId</code> equals to {@link #HOST_VIEW_ID}.
+     *
+     * @param virtualViewId A client defined virtual view id.
+     * @param action The action to perform.
+     * @param arguments Optional arguments.
+     * @return True if the action was performed.
+     *
+     * @see #createAccessibilityNodeInfo(int)
+     * @see AccessibilityNodeInfoCompat
+     */
+    public boolean performAction(int virtualViewId, int action, Bundle arguments) {
+        return false;
+    }
+
+    /**
+     * Finds {@link AccessibilityNodeInfoCompat}s by text. The match is case insensitive
+     * containment. The search is relative to the virtual view, i.e. a descendant of the
+     * host View, with the given <code>virtualViewId</code> or the host View itself
+     * <code>virtualViewId</code> equals to {@link #HOST_VIEW_ID}.
+     *
+     * @param virtualViewId A client defined virtual view id which defined
+     *     the root of the tree in which to perform the search.
+     * @param text The searched text.
+     * @return A list of node info.
+     *
+     * @see #createAccessibilityNodeInfo(int)
+     * @see AccessibilityNodeInfoCompat
+     */
+    public List<AccessibilityNodeInfoCompat> findAccessibilityNodeInfosByText(String text,
+            int virtualViewId) {
+        return null;
+    }
+
+    /**
+     * Find the virtual view, i.e. a descendant of the host View, that has the
+     * specified focus type.
+     *
+     * @param focus The focus to find. One of
+     *            {@link AccessibilityNodeInfoCompat#FOCUS_INPUT} or
+     *            {@link AccessibilityNodeInfoCompat#FOCUS_ACCESSIBILITY}.
+     * @return The node info of the focused view or null.
+     * @see AccessibilityNodeInfoCompat#FOCUS_INPUT
+     * @see AccessibilityNodeInfoCompat#FOCUS_ACCESSIBILITY
+     */
+    public AccessibilityNodeInfoCompat findFocus(int focus) {
+        return null;
+    }
+}
diff --git a/compat/java/android/support/v4/view/accessibility/AccessibilityRecordCompat.java b/compat/java/android/support/v4/view/accessibility/AccessibilityRecordCompat.java
new file mode 100644
index 0000000..9d00c58
--- /dev/null
+++ b/compat/java/android/support/v4/view/accessibility/AccessibilityRecordCompat.java
@@ -0,0 +1,1092 @@
+/*
+ * 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 android.support.v4.view.accessibility;
+
+import android.os.Build;
+import android.os.Parcelable;
+import android.view.View;
+import android.view.accessibility.AccessibilityEvent;
+
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * Helper for accessing {@link android.view.accessibility.AccessibilityRecord}
+ * introduced after API level 4 in a backwards compatible fashion.
+ */
+public class AccessibilityRecordCompat {
+
+    static interface AccessibilityRecordImpl {
+        public Object obtain();
+        public Object obtain(Object record);
+        public void setSource(Object record, View source);
+        public void setSource(Object record, View root, int virtualDescendantId);
+        public AccessibilityNodeInfoCompat getSource(Object record);
+        public int getWindowId(Object record);
+        public boolean isChecked(Object record);
+        public void setChecked(Object record, boolean isChecked);
+        public boolean isEnabled(Object record);
+        public void setEnabled(Object record, boolean isEnabled);
+        public boolean isPassword(Object record);
+        public void setPassword(Object record, boolean isPassword);
+        public boolean isFullScreen(Object record);
+        public void setFullScreen(Object record, boolean isFullScreen);
+        public boolean isScrollable(Object record);
+        public void setScrollable(Object record, boolean scrollable);
+        public int getItemCount(Object record);
+        public void setItemCount(Object record, int itemCount);
+        public int getCurrentItemIndex(Object record);
+        public void setCurrentItemIndex(Object record, int currentItemIndex);
+        public int getFromIndex(Object record);
+        public void setFromIndex(Object record, int fromIndex);
+        public int getToIndex(Object record);
+        public void setToIndex(Object record, int toIndex);
+        public int getScrollX(Object record);
+        public void setScrollX(Object record, int scrollX);
+        public int getScrollY(Object record);
+        public void setScrollY(Object record, int scrollY);
+        public int getMaxScrollX(Object record);
+        public void setMaxScrollX(Object record, int maxScrollX);
+        public int getMaxScrollY(Object record);
+        public void setMaxScrollY(Object record, int maxScrollY);
+        public int getAddedCount(Object record);
+        public void setAddedCount(Object record, int addedCount);
+        public int getRemovedCount(Object record);
+        public void setRemovedCount(Object record, int removedCount);
+        public CharSequence getClassName(Object record);
+        public void setClassName(Object record, CharSequence className);
+        public List<CharSequence> getText(Object record);
+        public CharSequence getBeforeText(Object record);
+        public void setBeforeText(Object record, CharSequence beforeText);
+        public CharSequence getContentDescription(Object record);
+        public void setContentDescription(Object record, CharSequence contentDescription);
+        public Parcelable getParcelableData(Object record);
+        public void setParcelableData(Object record, Parcelable parcelableData);
+        public void recycle(Object record);
+    }
+
+    static class AccessibilityRecordStubImpl implements AccessibilityRecordImpl {
+        @Override
+        public Object obtain() {
+            return null;
+        }
+
+        @Override
+        public Object obtain(Object record) {
+            return null;
+        }
+
+        @Override
+        public int getAddedCount(Object record) {
+            return 0;
+        }
+
+        @Override
+        public CharSequence getBeforeText(Object record) {
+            return null;
+        }
+
+        @Override
+        public CharSequence getClassName(Object record) {
+            return null;
+        }
+
+        @Override
+        public CharSequence getContentDescription(Object record) {
+            return null;
+        }
+
+        @Override
+        public int getCurrentItemIndex(Object record) {
+            return 0;
+        }
+
+        @Override
+        public int getFromIndex(Object record) {
+            return 0;
+        }
+
+        @Override
+        public int getItemCount(Object record) {
+            return 0;
+        }
+
+        @Override
+        public int getMaxScrollX(Object record) {
+            return 0;
+        }
+
+        @Override
+        public int getMaxScrollY(Object record) {
+            return 0;
+        }
+
+        @Override
+        public Parcelable getParcelableData(Object record) {
+            return null;
+        }
+
+        @Override
+        public int getRemovedCount(Object record) {
+            return 0;
+        }
+
+        @Override
+        public int getScrollX(Object record) {
+            return 0;
+        }
+
+        @Override
+        public int getScrollY(Object record) {
+            return 0;
+        }
+
+        @Override
+        public AccessibilityNodeInfoCompat getSource(Object record) {
+            return null;
+        }
+
+        @Override
+        public List<CharSequence> getText(Object record) {
+            return Collections.emptyList();
+        }
+
+        @Override
+        public int getToIndex(Object record) {
+            return 0;
+        }
+
+        @Override
+        public int getWindowId(Object record) {
+            return 0;
+        }
+
+        @Override
+        public boolean isChecked(Object record) {
+            return false;
+        }
+
+        @Override
+        public boolean isEnabled(Object record) {
+            return false;
+        }
+
+        @Override
+        public boolean isFullScreen(Object record) {
+            return false;
+        }
+
+        @Override
+        public boolean isPassword(Object record) {
+            return false;
+        }
+
+        @Override
+        public boolean isScrollable(Object record) {
+            return false;
+        }
+
+        @Override
+        public void recycle(Object record) {
+
+        }
+
+        @Override
+        public void setAddedCount(Object record, int addedCount) {
+
+        }
+
+        @Override
+        public void setBeforeText(Object record, CharSequence beforeText) {
+
+        }
+
+        @Override
+        public void setChecked(Object record, boolean isChecked) {
+
+        }
+
+        @Override
+        public void setClassName(Object record, CharSequence className) {
+
+        }
+
+        @Override
+        public void setContentDescription(Object record, CharSequence contentDescription) {
+
+        }
+
+        @Override
+        public void setCurrentItemIndex(Object record, int currentItemIndex) {
+
+        }
+
+        @Override
+        public void setEnabled(Object record, boolean isEnabled) {
+
+        }
+
+        @Override
+        public void setFromIndex(Object record, int fromIndex) {
+
+        }
+
+        @Override
+        public void setFullScreen(Object record, boolean isFullScreen) {
+
+        }
+
+        @Override
+        public void setItemCount(Object record, int itemCount) {
+
+        }
+
+        @Override
+        public void setMaxScrollX(Object record, int maxScrollX) {
+
+        }
+
+        @Override
+        public void setMaxScrollY(Object record, int maxScrollY) {
+
+        }
+
+        @Override
+        public void setParcelableData(Object record, Parcelable parcelableData) {
+
+        }
+
+        @Override
+        public void setPassword(Object record, boolean isPassword) {
+
+        }
+
+        @Override
+        public void setRemovedCount(Object record, int removedCount) {
+
+        }
+
+        @Override
+        public void setScrollX(Object record, int scrollX) {
+
+        }
+
+        @Override
+        public void setScrollY(Object record, int scrollY) {
+
+        }
+
+        @Override
+        public void setScrollable(Object record, boolean scrollable) {
+
+        }
+
+        @Override
+        public void setSource(Object record, View source) {
+
+        }
+
+        @Override
+        public void setSource(Object record, View root, int virtualDescendantId) {
+
+        }
+
+        @Override
+        public void setToIndex(Object record, int toIndex) {
+
+        }
+    }
+
+    static class AccessibilityRecordIcsImpl extends AccessibilityRecordStubImpl {
+        @Override
+        public Object obtain() {
+            return AccessibilityRecordCompatIcs.obtain();
+        }
+
+        @Override
+        public Object obtain(Object record) {
+            return AccessibilityRecordCompatIcs.obtain(record);
+        }
+
+        @Override
+        public int getAddedCount(Object record) {
+            return AccessibilityRecordCompatIcs.getAddedCount(record);
+        }
+
+        @Override
+        public CharSequence getBeforeText(Object record) {
+            return AccessibilityRecordCompatIcs.getBeforeText(record);
+        }
+
+        @Override
+        public CharSequence getClassName(Object record) {
+            return AccessibilityRecordCompatIcs.getClassName(record);
+        }
+
+        @Override
+        public CharSequence getContentDescription(Object record) {
+            return AccessibilityRecordCompatIcs.getContentDescription(record);
+        }
+
+        @Override
+        public int getCurrentItemIndex(Object record) {
+            return AccessibilityRecordCompatIcs.getCurrentItemIndex(record);
+        }
+
+        @Override
+        public int getFromIndex(Object record) {
+            return AccessibilityRecordCompatIcs.getFromIndex(record);
+        }
+
+        @Override
+        public int getItemCount(Object record) {
+            return AccessibilityRecordCompatIcs.getItemCount(record);
+        }
+
+        @Override
+        public Parcelable getParcelableData(Object record) {
+            return AccessibilityRecordCompatIcs.getParcelableData(record);
+        }
+
+        @Override
+        public int getRemovedCount(Object record) {
+            return AccessibilityRecordCompatIcs.getRemovedCount(record);
+        }
+
+        @Override
+        public int getScrollX(Object record) {
+            return AccessibilityRecordCompatIcs.getScrollX(record);
+        }
+
+        @Override
+        public int getScrollY(Object record) {
+            return AccessibilityRecordCompatIcs.getScrollY(record);
+        }
+
+        @Override
+        public AccessibilityNodeInfoCompat getSource(Object record) {
+            return AccessibilityNodeInfoCompat.wrapNonNullInstance(
+                    AccessibilityRecordCompatIcs.getSource(record));
+        }
+
+        @Override
+        public List<CharSequence> getText(Object record) {
+            return AccessibilityRecordCompatIcs.getText(record);
+        }
+
+        @Override
+        public int getToIndex(Object record) {
+            return AccessibilityRecordCompatIcs.getToIndex(record);
+        }
+
+        @Override
+        public int getWindowId(Object record) {
+            return AccessibilityRecordCompatIcs.getWindowId(record);
+        }
+
+        @Override
+        public boolean isChecked(Object record) {
+            return AccessibilityRecordCompatIcs.isChecked(record);
+        }
+
+        @Override
+        public boolean isEnabled(Object record) {
+            return AccessibilityRecordCompatIcs.isEnabled(record);
+        }
+
+        @Override
+        public boolean isFullScreen(Object record) {
+            return AccessibilityRecordCompatIcs.isFullScreen(record);
+        }
+
+        @Override
+        public boolean isPassword(Object record) {
+            return AccessibilityRecordCompatIcs.isPassword(record);
+        }
+
+        @Override
+        public boolean isScrollable(Object record) {
+            return AccessibilityRecordCompatIcs.isScrollable(record);
+        }
+
+        @Override
+        public void recycle(Object record) {
+            AccessibilityRecordCompatIcs.recycle(record);
+        }
+
+        @Override
+        public void setAddedCount(Object record, int addedCount) {
+            AccessibilityRecordCompatIcs.setAddedCount(record, addedCount);
+        }
+
+        @Override
+        public void setBeforeText(Object record, CharSequence beforeText) {
+            AccessibilityRecordCompatIcs.setBeforeText(record, beforeText);
+        }
+
+        @Override
+        public void setChecked(Object record, boolean isChecked) {
+            AccessibilityRecordCompatIcs.setChecked(record, isChecked);
+        }
+
+        @Override
+        public void setClassName(Object record, CharSequence className) {
+            AccessibilityRecordCompatIcs.setClassName(record, className);
+        }
+
+        @Override
+        public void setContentDescription(Object record, CharSequence contentDescription) {
+            AccessibilityRecordCompatIcs.setContentDescription(record, contentDescription);
+        }
+
+        @Override
+        public void setCurrentItemIndex(Object record, int currentItemIndex) {
+            AccessibilityRecordCompatIcs.setCurrentItemIndex(record, currentItemIndex);
+        }
+
+        @Override
+        public void setEnabled(Object record, boolean isEnabled) {
+            AccessibilityRecordCompatIcs.setEnabled(record, isEnabled);
+        }
+
+        @Override
+        public void setFromIndex(Object record, int fromIndex) {
+            AccessibilityRecordCompatIcs.setFromIndex(record, fromIndex);
+        }
+
+        @Override
+        public void setFullScreen(Object record, boolean isFullScreen) {
+            AccessibilityRecordCompatIcs.setFullScreen(record, isFullScreen);
+        }
+
+        @Override
+        public void setItemCount(Object record, int itemCount) {
+            AccessibilityRecordCompatIcs.setItemCount(record, itemCount);
+        }
+
+        @Override
+        public void setParcelableData(Object record, Parcelable parcelableData) {
+            AccessibilityRecordCompatIcs.setParcelableData(record, parcelableData);
+        }
+
+        @Override
+        public void setPassword(Object record, boolean isPassword) {
+            AccessibilityRecordCompatIcs.setPassword(record, isPassword);
+        }
+
+        @Override
+        public void setRemovedCount(Object record, int removedCount) {
+            AccessibilityRecordCompatIcs.setRemovedCount(record, removedCount);
+        }
+
+        @Override
+        public void setScrollX(Object record, int scrollX) {
+            AccessibilityRecordCompatIcs.setScrollX(record, scrollX);
+        }
+
+        @Override
+        public void setScrollY(Object record, int scrollY) {
+            AccessibilityRecordCompatIcs.setScrollY(record, scrollY);
+        }
+
+        @Override
+        public void setScrollable(Object record, boolean scrollable) {
+            AccessibilityRecordCompatIcs.setScrollable(record, scrollable);
+        }
+
+        @Override
+        public void setSource(Object record, View source) {
+            AccessibilityRecordCompatIcs.setSource(record, source);
+        }
+
+        @Override
+        public void setToIndex(Object record, int toIndex) {
+            AccessibilityRecordCompatIcs.setToIndex(record, toIndex);
+        }
+    }
+
+    static class AccessibilityRecordIcsMr1Impl extends AccessibilityRecordIcsImpl {
+        @Override
+        public int getMaxScrollX(Object record) {
+            return AccessibilityRecordCompatIcsMr1.getMaxScrollX(record);
+        }
+
+        @Override
+        public int getMaxScrollY(Object record) {
+            return AccessibilityRecordCompatIcsMr1.getMaxScrollY(record);
+        }
+
+        @Override
+        public void setMaxScrollX(Object record, int maxScrollX) {
+            AccessibilityRecordCompatIcsMr1.setMaxScrollX(record, maxScrollX);
+        }
+
+        @Override
+        public void setMaxScrollY(Object record, int maxScrollY) {
+            AccessibilityRecordCompatIcsMr1.setMaxScrollY(record, maxScrollY);
+        }
+    }
+
+    static class AccessibilityRecordJellyBeanImpl extends AccessibilityRecordIcsMr1Impl {
+        @Override
+        public void setSource(Object record, View root, int virtualDescendantId) {
+            AccessibilityRecordCompatJellyBean.setSource(record, root, virtualDescendantId);
+        }
+    }
+
+    static {
+        if (Build.VERSION.SDK_INT >= 16) { // JellyBean
+            IMPL = new AccessibilityRecordJellyBeanImpl();
+        } else if (Build.VERSION.SDK_INT >= 15) {  // ICS MR1
+            IMPL = new AccessibilityRecordIcsMr1Impl();
+        } else if (Build.VERSION.SDK_INT >= 14) { // ICS
+            IMPL = new AccessibilityRecordIcsImpl();
+        } else {
+            IMPL = new AccessibilityRecordStubImpl();
+        }
+    }
+
+    private static final AccessibilityRecordImpl IMPL;
+
+    private final Object mRecord;
+
+    /**
+     * @deprecated This is not type safe. If you want to modify an
+     * {@link AccessibilityEvent}'s properties defined in
+     * {@link android.view.accessibility.AccessibilityRecord} use
+     * {@link AccessibilityEventCompat#asRecord(AccessibilityEvent)}. This method will be removed
+     * in a subsequent release of the support library.
+     */
+    @Deprecated
+    public AccessibilityRecordCompat(Object record) {
+        mRecord = record;
+    }
+
+    /**
+     * @return The wrapped implementation.
+     *
+     * @deprecated This method will be removed in a subsequent release of
+     * the support library.
+     */
+    @Deprecated
+    public Object getImpl() {
+        return mRecord;
+    }
+
+    /**
+     * Returns a cached instance if such is available or a new one is
+     * instantiated. The instance is initialized with data from the
+     * given record.
+     *
+     * @return An instance.
+     */
+    public static AccessibilityRecordCompat obtain(AccessibilityRecordCompat record) {
+       return new AccessibilityRecordCompat(IMPL.obtain(record.mRecord));
+    }
+
+    /**
+     * Returns a cached instance if such is available or a new one is
+     * instantiated.
+     *
+     * @return An instance.
+     */
+    public static AccessibilityRecordCompat obtain() {
+        return new AccessibilityRecordCompat(IMPL.obtain());
+    }
+
+    /**
+     * Sets the event source.
+     *
+     * @param source The source.
+     *
+     * @throws IllegalStateException If called from an AccessibilityService.
+     */
+    public void setSource(View source) {
+        IMPL.setSource(mRecord, source);
+    }
+
+    /**
+     * Sets the source to be a virtual descendant of the given <code>root</code>.
+     * If <code>virtualDescendantId</code> equals to {@link View#NO_ID} the root
+     * is set as the source.
+     * <p>
+     * A virtual descendant is an imaginary View that is reported as a part of the view
+     * hierarchy for accessibility purposes. This enables custom views that draw complex
+     * content to report them selves as a tree of virtual views, thus conveying their
+     * logical structure.
+     * </p>
+     *
+     * @param root The root of the virtual subtree.
+     * @param virtualDescendantId The id of the virtual descendant.
+     */
+    public void setSource(View root, int virtualDescendantId) {
+        IMPL.setSource(mRecord, root, virtualDescendantId);
+    }
+
+    /**
+     * Gets the {@link android.view.accessibility.AccessibilityNodeInfo} of
+     * the event source.
+     * <p>
+     * <strong>Note:</strong> It is a client responsibility to recycle the
+     * received info by calling
+     * {@link android.view.accessibility.AccessibilityNodeInfo#recycle()
+     * AccessibilityNodeInfo#recycle()} to avoid creating of multiple instances.
+     *</p>
+     *
+     * @return The info of the source.
+     */
+    public AccessibilityNodeInfoCompat getSource() {
+        return IMPL.getSource(mRecord);
+    }
+
+    /**
+     * Gets the id of the window from which the event comes from.
+     *
+     * @return The window id.
+     */
+    public int getWindowId() {
+        return IMPL.getWindowId(mRecord);
+    }
+
+    /**
+     * Gets if the source is checked.
+     *
+     * @return True if the view is checked, false otherwise.
+     */
+    public boolean isChecked() {
+        return IMPL.isChecked(mRecord);
+    }
+
+    /**
+     * Sets if the source is checked.
+     *
+     * @param isChecked True if the view is checked, false otherwise.
+     *
+     * @throws IllegalStateException If called from an AccessibilityService.
+     */
+    public void setChecked(boolean isChecked) {
+        IMPL.setChecked(mRecord, isChecked);
+    }
+
+    /**
+     * Gets if the source is enabled.
+     *
+     * @return True if the view is enabled, false otherwise.
+     */
+    public boolean isEnabled() {
+        return IMPL.isEnabled(mRecord);
+    }
+
+    /**
+     * Sets if the source is enabled.
+     *
+     * @param isEnabled True if the view is enabled, false otherwise.
+     *
+     * @throws IllegalStateException If called from an AccessibilityService.
+     */
+    public void setEnabled(boolean isEnabled) {
+        IMPL.setEnabled(mRecord, isEnabled);
+    }
+
+    /**
+     * Gets if the source is a password field.
+     *
+     * @return True if the view is a password field, false otherwise.
+     */
+    public boolean isPassword() {
+        return IMPL.isPassword(mRecord);
+    }
+
+    /**
+     * Sets if the source is a password field.
+     *
+     * @param isPassword True if the view is a password field, false otherwise.
+     *
+     * @throws IllegalStateException If called from an AccessibilityService.
+     */
+    public void setPassword(boolean isPassword) {
+        IMPL.setPassword(mRecord, isPassword);
+    }
+
+    /**
+     * Gets if the source is taking the entire screen.
+     *
+     * @return True if the source is full screen, false otherwise.
+     */
+    public boolean isFullScreen() {
+        return IMPL.isFullScreen(mRecord);
+    }
+
+    /**
+     * Sets if the source is taking the entire screen.
+     *
+     * @param isFullScreen True if the source is full screen, false otherwise.
+     *
+     * @throws IllegalStateException If called from an AccessibilityService.
+     */
+    public void setFullScreen(boolean isFullScreen) {
+        IMPL.setFullScreen(mRecord, isFullScreen);
+    }
+
+    /**
+     * Gets if the source is scrollable.
+     *
+     * @return True if the source is scrollable, false otherwise.
+     */
+    public boolean isScrollable() {
+        return IMPL.isScrollable(mRecord);
+    }
+
+    /**
+     * Sets if the source is scrollable.
+     *
+     * @param scrollable True if the source is scrollable, false otherwise.
+     *
+     * @throws IllegalStateException If called from an AccessibilityService.
+     */
+    public void setScrollable(boolean scrollable) {
+        IMPL.setScrollable(mRecord, scrollable);
+    }
+
+    /**
+     * Gets the number of items that can be visited.
+     *
+     * @return The number of items.
+     */
+    public int getItemCount() {
+        return IMPL.getItemCount(mRecord);
+    }
+
+    /**
+     * Sets the number of items that can be visited.
+     *
+     * @param itemCount The number of items.
+     *
+     * @throws IllegalStateException If called from an AccessibilityService.
+     */
+    public void setItemCount(int itemCount) {
+        IMPL.setItemCount(mRecord, itemCount);
+    }
+
+    /**
+     * Gets the index of the source in the list of items the can be visited.
+     *
+     * @return The current item index.
+     */
+    public int getCurrentItemIndex() {
+        return IMPL.getCurrentItemIndex(mRecord);
+    }
+
+    /**
+     * Sets the index of the source in the list of items that can be visited.
+     *
+     * @param currentItemIndex The current item index.
+     *
+     * @throws IllegalStateException If called from an AccessibilityService.
+     */
+    public void setCurrentItemIndex(int currentItemIndex) {
+        IMPL.setCurrentItemIndex(mRecord, currentItemIndex);
+    }
+
+    /**
+     * Gets the index of the first character of the changed sequence,
+     * or the beginning of a text selection or the index of the first
+     * visible item when scrolling.
+     *
+     * @return The index of the first character or selection
+     *        start or the first visible item.
+     */
+    public int getFromIndex() {
+        return IMPL.getFromIndex(mRecord);
+    }
+
+    /**
+     * Sets the index of the first character of the changed sequence
+     * or the beginning of a text selection or the index of the first
+     * visible item when scrolling.
+     *
+     * @param fromIndex The index of the first character or selection
+     *        start or the first visible item.
+     *
+     * @throws IllegalStateException If called from an AccessibilityService.
+     */
+    public void setFromIndex(int fromIndex) {
+        IMPL.setFromIndex(mRecord, fromIndex);
+    }
+
+    /**
+     * Gets the index of text selection end or the index of the last
+     * visible item when scrolling.
+     *
+     * @return The index of selection end or last item index.
+     */
+    public int getToIndex() {
+        return IMPL.getToIndex(mRecord);
+    }
+
+    /**
+     * Sets the index of text selection end or the index of the last
+     * visible item when scrolling.
+     *
+     * @param toIndex The index of selection end or last item index.
+     */
+    public void setToIndex(int toIndex) {
+        IMPL.setToIndex(mRecord, toIndex);
+    }
+
+    /**
+     * Gets the scroll offset of the source left edge in pixels.
+     *
+     * @return The scroll.
+     */
+    public int getScrollX() {
+        return IMPL.getScrollX(mRecord);
+    }
+
+    /**
+     * Sets the scroll offset of the source left edge in pixels.
+     *
+     * @param scrollX The scroll.
+     */
+    public void setScrollX(int scrollX) {
+        IMPL.setScrollX(mRecord, scrollX);
+    }
+
+    /**
+     * Gets the scroll offset of the source top edge in pixels.
+     *
+     * @return The scroll.
+     */
+    public int getScrollY() {
+        return IMPL.getScrollY(mRecord);
+    }
+
+    /**
+     * Sets the scroll offset of the source top edge in pixels.
+     *
+     * @param scrollY The scroll.
+     */
+    public void setScrollY(int scrollY) {
+        IMPL.setScrollY(mRecord, scrollY);
+    }
+
+    /**
+     * Gets the max scroll offset of the source left edge in pixels.
+     *
+     * @return The max scroll.
+     */
+    public int getMaxScrollX() {
+        return IMPL.getMaxScrollX(mRecord);
+    }
+    /**
+     * Sets the max scroll offset of the source left edge in pixels.
+     *
+     * @param maxScrollX The max scroll.
+     */
+    public void setMaxScrollX(int maxScrollX) {
+        IMPL.setMaxScrollX(mRecord, maxScrollX);
+    }
+
+    /**
+     * Gets the max scroll offset of the source top edge in pixels.
+     *
+     * @return The max scroll.
+     */
+    public int getMaxScrollY() {
+        return IMPL.getMaxScrollY(mRecord);
+    }
+
+    /**
+     * Sets the max scroll offset of the source top edge in pixels.
+     *
+     * @param maxScrollY The max scroll.
+     */
+    public void setMaxScrollY(int maxScrollY) {
+        IMPL.setMaxScrollY(mRecord, maxScrollY);
+    }
+
+    /**
+     * Gets the number of added characters.
+     *
+     * @return The number of added characters.
+     */
+    public int getAddedCount() {
+        return IMPL.getAddedCount(mRecord);
+    }
+
+    /**
+     * Sets the number of added characters.
+     *
+     * @param addedCount The number of added characters.
+     *
+     * @throws IllegalStateException If called from an AccessibilityService.
+     */
+    public void setAddedCount(int addedCount) {
+        IMPL.setAddedCount(mRecord, addedCount);
+    }
+
+    /**
+     * Gets the number of removed characters.
+     *
+     * @return The number of removed characters.
+     */
+    public int getRemovedCount() {
+        return IMPL.getRemovedCount(mRecord);
+    }
+
+    /**
+     * Sets the number of removed characters.
+     *
+     * @param removedCount The number of removed characters.
+     *
+     * @throws IllegalStateException If called from an AccessibilityService.
+     */
+    public void setRemovedCount(int removedCount) {
+        IMPL.setRemovedCount(mRecord, removedCount);
+    }
+
+    /**
+     * Gets the class name of the source.
+     *
+     * @return The class name.
+     */
+    public CharSequence getClassName() {
+        return IMPL.getClassName(mRecord);
+    }
+
+    /**
+     * Sets the class name of the source.
+     *
+     * @param className The lass name.
+     *
+     * @throws IllegalStateException If called from an AccessibilityService.
+     */
+    public void setClassName(CharSequence className) {
+        IMPL.setClassName(mRecord, className);
+    }
+
+    /**
+     * Gets the text of the event. The index in the list represents the priority
+     * of the text. Specifically, the lower the index the higher the priority.
+     *
+     * @return The text.
+     */
+    public List<CharSequence> getText() {
+        return IMPL.getText(mRecord);
+    }
+
+    /**
+     * Sets the text before a change.
+     *
+     * @return The text before the change.
+     */
+    public CharSequence getBeforeText() {
+        return IMPL.getBeforeText(mRecord);
+    }
+
+    /**
+     * Sets the text before a change.
+     *
+     * @param beforeText The text before the change.
+     *
+     * @throws IllegalStateException If called from an AccessibilityService.
+     */
+    public void setBeforeText(CharSequence beforeText) {
+        IMPL.setBeforeText(mRecord, beforeText);
+    }
+
+    /**
+     * Gets the description of the source.
+     *
+     * @return The description.
+     */
+    public CharSequence getContentDescription() {
+        return IMPL.getContentDescription(mRecord);
+    }
+
+    /**
+     * Sets the description of the source.
+     *
+     * @param contentDescription The description.
+     *
+     * @throws IllegalStateException If called from an AccessibilityService.
+     */
+    public void setContentDescription(CharSequence contentDescription) {
+        IMPL.setContentDescription(mRecord, contentDescription);
+    }
+
+    /**
+     * Gets the {@link Parcelable} data.
+     *
+     * @return The parcelable data.
+     */
+    public Parcelable getParcelableData() {
+        return IMPL.getParcelableData(mRecord);
+    }
+
+    /**
+     * Sets the {@link Parcelable} data of the event.
+     *
+     * @param parcelableData The parcelable data.
+     *
+     * @throws IllegalStateException If called from an AccessibilityService.
+     */
+    public void setParcelableData(Parcelable parcelableData) {
+        IMPL.setParcelableData(mRecord, parcelableData);
+    }
+
+    /**
+     * Return an instance back to be reused.
+     * <p>
+     * <strong>Note:</strong> You must not touch the object after calling this
+     * function.
+     * </p>
+     *
+     * @throws IllegalStateException If the record is already recycled.
+     */
+    public void recycle() {
+        IMPL.recycle(mRecord);
+    }
+
+    @Override
+    public int hashCode() {
+        return (mRecord == null) ? 0 : mRecord.hashCode();
+    }
+
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj == null) {
+            return false;
+        }
+        if (getClass() != obj.getClass()) {
+            return false;
+        }
+        AccessibilityRecordCompat other = (AccessibilityRecordCompat) obj;
+        if (mRecord == null) {
+            if (other.mRecord != null) {
+                return false;
+            }
+        } else if (!mRecord.equals(other.mRecord)) {
+            return false;
+        }
+        return true;
+    }
+}
diff --git a/compat/java/android/support/v4/view/accessibility/AccessibilityWindowInfoCompat.java b/compat/java/android/support/v4/view/accessibility/AccessibilityWindowInfoCompat.java
new file mode 100644
index 0000000..2232430
--- /dev/null
+++ b/compat/java/android/support/v4/view/accessibility/AccessibilityWindowInfoCompat.java
@@ -0,0 +1,505 @@
+/*
+ * Copyright (C) 2015 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 android.support.v4.view.accessibility;
+
+import android.graphics.Rect;
+import android.os.Build;
+
+/**
+ * Helper for accessing {@link android.view.accessibility.AccessibilityWindowInfo}
+ * introduced after API level 4 in a backwards compatible fashion.
+ */
+public class AccessibilityWindowInfoCompat {
+
+    private interface AccessibilityWindowInfoImpl {
+        Object obtain();
+        Object obtain(Object info);
+        int getType(Object info);
+        int getLayer(Object info);
+        Object getRoot(Object info);
+        Object getParent(Object info);
+        int getId(Object info);
+        void getBoundsInScreen(Object info, Rect outBounds);
+        boolean isActive(Object info);
+        boolean isFocused(Object info);
+        boolean isAccessibilityFocused(Object info);
+        int getChildCount(Object info);
+        Object getChild(Object info, int index);
+        CharSequence getTitle(Object info);
+        Object getAnchor(Object info);
+        void recycle(Object info);
+    }
+
+    private static class AccessibilityWindowInfoStubImpl implements AccessibilityWindowInfoImpl {
+
+        @Override
+        public Object obtain() {
+            return null;
+        }
+
+        @Override
+        public Object obtain(Object info) {
+            return null;
+        }
+
+        @Override
+        public int getType(Object info) {
+            return UNDEFINED;
+        }
+
+        @Override
+        public int getLayer(Object info) {
+            return UNDEFINED;
+        }
+
+        @Override
+        public Object getRoot(Object info) {
+            return null;
+        }
+
+        @Override
+        public Object getParent(Object info) {
+            return null;
+        }
+
+        @Override
+        public int getId(Object info) {
+            return UNDEFINED;
+        }
+
+        @Override
+        public void getBoundsInScreen(Object info, Rect outBounds) {
+        }
+
+        @Override
+        public boolean isActive(Object info) {
+            return true;
+        }
+
+        @Override
+        public boolean isFocused(Object info) {
+            return true;
+        }
+
+        @Override
+        public boolean isAccessibilityFocused(Object info) {
+            return true;
+        }
+
+        @Override
+        public int getChildCount(Object info) {
+            return 0;
+        }
+
+        @Override
+        public Object getChild(Object info, int index) {
+            return null;
+        }
+
+        @Override
+        public void recycle(Object info) {
+        }
+
+        @Override
+        public CharSequence getTitle(Object info) {
+            return null;
+        }
+
+        @Override
+        public Object getAnchor(Object info) {
+            return null;
+        }
+    }
+
+    private static class AccessibilityWindowInfoApi21Impl extends AccessibilityWindowInfoStubImpl {
+        @Override
+        public Object obtain() {
+            return AccessibilityWindowInfoCompatApi21.obtain();
+        }
+
+        @Override
+        public Object obtain(Object info) {
+            return AccessibilityWindowInfoCompatApi21.obtain(info);
+        }
+
+        @Override
+        public int getType(Object info) {
+            return AccessibilityWindowInfoCompatApi21.getType(info);
+        }
+
+        @Override
+        public int getLayer(Object info) {
+            return AccessibilityWindowInfoCompatApi21.getLayer(info);
+        }
+
+        @Override
+        public Object getRoot(Object info) {
+            return AccessibilityWindowInfoCompatApi21.getRoot(info);
+        }
+
+        @Override
+        public Object getParent(Object info) {
+            return AccessibilityWindowInfoCompatApi21.getParent(info);
+        }
+
+        @Override
+        public int getId(Object info) {
+            return AccessibilityWindowInfoCompatApi21.getId(info);
+        }
+
+        @Override
+        public void getBoundsInScreen(Object info, Rect outBounds) {
+            AccessibilityWindowInfoCompatApi21.getBoundsInScreen(info, outBounds);
+        }
+
+        @Override
+        public boolean isActive(Object info) {
+            return AccessibilityWindowInfoCompatApi21.isActive(info);
+        }
+
+        @Override
+        public boolean isFocused(Object info) {
+            return AccessibilityWindowInfoCompatApi21.isFocused(info);
+        }
+
+        @Override
+        public boolean isAccessibilityFocused(Object info) {
+            return AccessibilityWindowInfoCompatApi21.isAccessibilityFocused(info);
+        }
+
+        @Override
+        public int getChildCount(Object info) {
+            return AccessibilityWindowInfoCompatApi21.getChildCount(info);
+        }
+
+        @Override
+        public Object getChild(Object info, int index) {
+            return AccessibilityWindowInfoCompatApi21.getChild(info, index);
+        }
+
+        @Override
+        public void recycle(Object info) {
+            AccessibilityWindowInfoCompatApi21.recycle(info);
+        }
+    }
+
+    private static class AccessibilityWindowInfoApi24Impl extends AccessibilityWindowInfoApi21Impl {
+        @Override
+        public CharSequence getTitle(Object info) {
+            return AccessibilityWindowInfoCompatApi24.getTitle(info);
+        }
+
+        @Override
+        public Object getAnchor(Object info) {
+            return AccessibilityWindowInfoCompatApi24.getAnchor(info);
+        }
+    }
+
+    static {
+        if (Build.VERSION.SDK_INT >= 24) {
+            IMPL = new AccessibilityWindowInfoApi24Impl();
+        } else  if (Build.VERSION.SDK_INT >= 21) {
+            IMPL = new AccessibilityWindowInfoApi21Impl();
+        } else {
+            IMPL = new AccessibilityWindowInfoStubImpl();
+        }
+    }
+
+    private static final AccessibilityWindowInfoImpl IMPL;
+    private Object mInfo;
+
+    private static final int UNDEFINED = -1;
+
+    /**
+     * Window type: This is an application window. Such a window shows UI for
+     * interacting with an application.
+     */
+    public static final int TYPE_APPLICATION = 1;
+
+    /**
+     * Window type: This is an input method window. Such a window shows UI for
+     * inputting text such as keyboard, suggestions, etc.
+     */
+    public static final int TYPE_INPUT_METHOD = 2;
+
+    /**
+     * Window type: This is an system window. Such a window shows UI for
+     * interacting with the system.
+     */
+    public static final int TYPE_SYSTEM = 3;
+
+    /**
+     * Window type: Windows that are overlaid <em>only</em> by an {@link
+     * android.accessibilityservice.AccessibilityService} for interception of
+     * user interactions without changing the windows an accessibility service
+     * can introspect. In particular, an accessibility service can introspect
+     * only windows that a sighted user can interact with which they can touch
+     * these windows or can type into these windows. For example, if there
+     * is a full screen accessibility overlay that is touchable, the windows
+     * below it will be introspectable by an accessibility service regardless
+     * they are covered by a touchable window.
+     */
+    public static final int TYPE_ACCESSIBILITY_OVERLAY = 4;
+
+    /**
+     * Window type: A system window used to divide the screen in split-screen mode.
+     * This type of window is present only in split-screen mode.
+     */
+    public static final int TYPE_SPLIT_SCREEN_DIVIDER = 5;
+
+    /**
+     * Creates a wrapper for info implementation.
+     *
+     * @param object The info to wrap.
+     * @return A wrapper for if the object is not null, null otherwise.
+     */
+    static AccessibilityWindowInfoCompat wrapNonNullInstance(Object object) {
+        if (object != null) {
+            return new AccessibilityWindowInfoCompat(object);
+        }
+        return null;
+    }
+
+    private AccessibilityWindowInfoCompat(Object info) {
+        mInfo = info;
+    }
+
+    /**
+     * Gets the type of the window.
+     *
+     * @return The type.
+     *
+     * @see #TYPE_APPLICATION
+     * @see #TYPE_INPUT_METHOD
+     * @see #TYPE_SYSTEM
+     * @see #TYPE_ACCESSIBILITY_OVERLAY
+     */
+    public int getType() {
+        return IMPL.getType(mInfo);
+    }
+
+    /**
+     * Gets the layer which determines the Z-order of the window. Windows
+     * with greater layer appear on top of windows with lesser layer.
+     *
+     * @return The window layer.
+     */
+    public int getLayer() {
+        return IMPL.getLayer(mInfo);
+    }
+
+    /**
+     * Gets the root node in the window's hierarchy.
+     *
+     * @return The root node.
+     */
+    public AccessibilityNodeInfoCompat getRoot() {
+        return AccessibilityNodeInfoCompat.wrapNonNullInstance(IMPL.getRoot(mInfo));
+    }
+
+    /**
+     * Gets the parent window if such.
+     *
+     * @return The parent window.
+     */
+    public AccessibilityWindowInfoCompat getParent() {
+        return wrapNonNullInstance(IMPL.getParent(mInfo));
+    }
+
+    /**
+     * Gets the unique window id.
+     *
+     * @return windowId The window id.
+     */
+    public int getId() {
+        return IMPL.getId(mInfo);
+    }
+
+    /**
+     * Gets the bounds of this window in the screen.
+     *
+     * @param outBounds The out window bounds.
+     */
+    public void getBoundsInScreen(Rect outBounds) {
+        IMPL.getBoundsInScreen(mInfo, outBounds);
+    }
+
+    /**
+     * Gets if this window is active. An active window is the one
+     * the user is currently touching or the window has input focus
+     * and the user is not touching any window.
+     *
+     * @return Whether this is the active window.
+     */
+    public boolean isActive() {
+        return IMPL.isActive(mInfo);
+    }
+
+    /**
+     * Gets if this window has input focus.
+     *
+     * @return Whether has input focus.
+     */
+    public boolean isFocused() {
+        return IMPL.isFocused(mInfo);
+    }
+
+    /**
+     * Gets if this window has accessibility focus.
+     *
+     * @return Whether has accessibility focus.
+     */
+    public boolean isAccessibilityFocused() {
+        return IMPL.isAccessibilityFocused(mInfo);
+    }
+
+    /**
+     * Gets the number of child windows.
+     *
+     * @return The child count.
+     */
+    public int getChildCount() {
+        return IMPL.getChildCount(mInfo);
+    }
+
+    /**
+     * Gets the child window at a given index.
+     *
+     * @param index The index.
+     * @return The child.
+     */
+    public AccessibilityWindowInfoCompat getChild(int index) {
+        return wrapNonNullInstance(IMPL.getChild(mInfo, index));
+    }
+
+    /**
+     * Gets the title of the window.
+     *
+     * @return The title of the window, or the application label for the window if no title was
+     * explicitly set, or {@code null} if neither is available.
+     */
+    public CharSequence getTitle() {
+        return IMPL.getTitle(mInfo);
+    }
+
+    /**
+     * Gets the node that anchors this window to another.
+     *
+     * @return The anchor node, or {@code null} if none exists.
+     */
+    public AccessibilityNodeInfoCompat getAnchor() {
+        return AccessibilityNodeInfoCompat.wrapNonNullInstance(IMPL.getAnchor(mInfo));
+    }
+
+    /**
+     * Returns a cached instance if such is available or a new one is
+     * created.
+     *
+     * @return An instance.
+     */
+    public static AccessibilityWindowInfoCompat obtain() {
+        return wrapNonNullInstance(IMPL.obtain());
+    }
+
+    /**
+     * Returns a cached instance if such is available or a new one is
+     * created. The returned instance is initialized from the given
+     * <code>info</code>.
+     *
+     * @param info The other info.
+     * @return An instance.
+     */
+    public static AccessibilityWindowInfoCompat obtain(AccessibilityWindowInfoCompat info) {
+        return wrapNonNullInstance(IMPL.obtain(info.mInfo));
+    }
+
+    /**
+     * Return an instance back to be reused.
+     * <p>
+     * <strong>Note:</strong> You must not touch the object after calling this function.
+     * </p>
+     *
+     * @throws IllegalStateException If the info is already recycled.
+     */
+    public void recycle() {
+        IMPL.recycle(mInfo);
+    }
+
+    @Override
+    public int hashCode() {
+        return (mInfo == null) ? 0 : mInfo.hashCode();
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj == null) {
+            return false;
+        }
+        if (getClass() != obj.getClass()) {
+            return false;
+        }
+        AccessibilityWindowInfoCompat other = (AccessibilityWindowInfoCompat) obj;
+        if (mInfo == null) {
+            if (other.mInfo != null) {
+                return false;
+            }
+        } else if (!mInfo.equals(other.mInfo)) {
+            return false;
+        }
+        return true;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder builder = new StringBuilder();
+        Rect bounds = new Rect();
+        getBoundsInScreen(bounds);
+        builder.append("AccessibilityWindowInfo[");
+        builder.append("id=").append(getId());
+        builder.append(", type=").append(typeToString(getType()));
+        builder.append(", layer=").append(getLayer());
+        builder.append(", bounds=").append(bounds);
+        builder.append(", focused=").append(isFocused());
+        builder.append(", active=").append(isActive());
+        builder.append(", hasParent=").append(getParent() != null);
+        builder.append(", hasChildren=").append(getChildCount() > 0);
+        builder.append(']');
+        return builder.toString();
+    }
+
+    private static String typeToString(int type) {
+        switch (type) {
+            case TYPE_APPLICATION: {
+                return "TYPE_APPLICATION";
+            }
+            case TYPE_INPUT_METHOD: {
+                return "TYPE_INPUT_METHOD";
+            }
+            case TYPE_SYSTEM: {
+                return "TYPE_SYSTEM";
+            }
+            case TYPE_ACCESSIBILITY_OVERLAY: {
+                return "TYPE_ACCESSIBILITY_OVERLAY";
+            }
+            default:
+                return "<UNKNOWN>";
+        }
+    }
+}
diff --git a/v4/java/android/support/v4/view/accessibility/package.html b/compat/java/android/support/v4/view/accessibility/package.html
similarity index 100%
rename from v4/java/android/support/v4/view/accessibility/package.html
rename to compat/java/android/support/v4/view/accessibility/package.html
diff --git a/v4/java/android/support/v4/view/animation/PathInterpolatorCompat.java b/compat/java/android/support/v4/view/animation/PathInterpolatorCompat.java
similarity index 100%
rename from v4/java/android/support/v4/view/animation/PathInterpolatorCompat.java
rename to compat/java/android/support/v4/view/animation/PathInterpolatorCompat.java
diff --git a/v4/java/android/support/v4/view/package.html b/compat/java/android/support/v4/view/package.html
similarity index 100%
rename from v4/java/android/support/v4/view/package.html
rename to compat/java/android/support/v4/view/package.html
diff --git a/compat/java/android/support/v4/widget/CompoundButtonCompat.java b/compat/java/android/support/v4/widget/CompoundButtonCompat.java
new file mode 100644
index 0000000..52cdc49
--- /dev/null
+++ b/compat/java/android/support/v4/widget/CompoundButtonCompat.java
@@ -0,0 +1,174 @@
+/*
+ * Copyright (C) 2015 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 android.support.v4.widget;
+
+import android.content.res.ColorStateList;
+import android.graphics.PorterDuff;
+import android.graphics.drawable.Drawable;
+import android.os.Build;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.v4.graphics.drawable.DrawableCompat;
+import android.widget.CompoundButton;
+
+/**
+ * Helper for accessing {@link android.widget.CompoundButton} methods introduced after
+ * API level 4 in a backwards compatible fashion.
+ */
+public final class CompoundButtonCompat {
+
+    private static final CompoundButtonCompatImpl IMPL;
+
+    static {
+        final int sdk = Build.VERSION.SDK_INT;
+        if (sdk >= 23) {
+            IMPL = new Api23CompoundButtonImpl();
+        } else if (sdk >= 21) {
+            IMPL = new LollipopCompoundButtonImpl();
+        } else {
+            IMPL = new BaseCompoundButtonCompat();
+        }
+    }
+
+    interface CompoundButtonCompatImpl {
+        void setButtonTintList(CompoundButton button, ColorStateList tint);
+        ColorStateList getButtonTintList(CompoundButton button);
+        void setButtonTintMode(CompoundButton button, PorterDuff.Mode tintMode);
+        PorterDuff.Mode getButtonTintMode(CompoundButton button);
+        Drawable getButtonDrawable(CompoundButton button);
+    }
+
+    static class BaseCompoundButtonCompat implements CompoundButtonCompatImpl {
+        @Override
+        public void setButtonTintList(CompoundButton button, ColorStateList tint) {
+            CompoundButtonCompatGingerbread.setButtonTintList(button, tint);
+        }
+
+        @Override
+        public ColorStateList getButtonTintList(CompoundButton button) {
+            return CompoundButtonCompatGingerbread.getButtonTintList(button);
+        }
+
+        @Override
+        public void setButtonTintMode(CompoundButton button, PorterDuff.Mode tintMode) {
+            CompoundButtonCompatGingerbread.setButtonTintMode(button, tintMode);
+        }
+
+        @Override
+        public PorterDuff.Mode getButtonTintMode(CompoundButton button) {
+            return CompoundButtonCompatGingerbread.getButtonTintMode(button);
+        }
+
+        @Override
+        public Drawable getButtonDrawable(CompoundButton button) {
+            return CompoundButtonCompatGingerbread.getButtonDrawable(button);
+        }
+    }
+
+    static class LollipopCompoundButtonImpl extends BaseCompoundButtonCompat {
+        @Override
+        public void setButtonTintList(CompoundButton button, ColorStateList tint) {
+            CompoundButtonCompatLollipop.setButtonTintList(button, tint);
+        }
+
+        @Override
+        public ColorStateList getButtonTintList(CompoundButton button) {
+            return CompoundButtonCompatLollipop.getButtonTintList(button);
+        }
+
+        @Override
+        public void setButtonTintMode(CompoundButton button, PorterDuff.Mode tintMode) {
+            CompoundButtonCompatLollipop.setButtonTintMode(button, tintMode);
+        }
+
+        @Override
+        public PorterDuff.Mode getButtonTintMode(CompoundButton button) {
+            return CompoundButtonCompatLollipop.getButtonTintMode(button);
+        }
+    }
+
+    static class Api23CompoundButtonImpl extends LollipopCompoundButtonImpl {
+        @Override
+        public Drawable getButtonDrawable(CompoundButton button) {
+            return CompoundButtonCompatApi23.getButtonDrawable(button);
+        }
+    }
+
+    private CompoundButtonCompat() {}
+
+    /**
+     * Applies a tint to the button drawable. Does not modify the current tint
+     * mode, which is {@link PorterDuff.Mode#SRC_IN} by default.
+     * <p>
+     * Subsequent calls to {@link CompoundButton#setButtonDrawable(Drawable)} should
+     * automatically mutate the drawable and apply the specified tint and tint
+     * mode using {@link DrawableCompat#setTintList(Drawable, ColorStateList)}.
+     *
+     * @param tint the tint to apply, may be {@code null} to clear tint
+     *
+     * @see #setButtonTintList(CompoundButton, ColorStateList)
+     */
+    public static void setButtonTintList(@NonNull CompoundButton button, @Nullable ColorStateList tint) {
+        IMPL.setButtonTintList(button, tint);
+    }
+
+    /**
+     * Returns the tint applied to the button drawable
+     *
+     * @see #setButtonTintList(CompoundButton, ColorStateList)
+     */
+    @Nullable
+    public static ColorStateList getButtonTintList(@NonNull CompoundButton button) {
+        return IMPL.getButtonTintList(button);
+    }
+
+    /**
+     * Specifies the blending mode used to apply the tint specified by
+     * {@link #setButtonTintList(CompoundButton, ColorStateList)}} to the button drawable. The
+     * default mode is {@link PorterDuff.Mode#SRC_IN}.
+     *
+     * @param tintMode the blending mode used to apply the tint, may be
+     *                 {@code null} to clear tint
+     *
+     * @see #getButtonTintMode(CompoundButton)
+     * @see DrawableCompat#setTintMode(Drawable, PorterDuff.Mode)
+     */
+    public static void setButtonTintMode(@NonNull CompoundButton button,
+            @Nullable PorterDuff.Mode tintMode) {
+        IMPL.setButtonTintMode(button, tintMode);
+    }
+
+    /**
+     * @return the blending mode used to apply the tint to the button drawable
+     * @attr name android:buttonTintMode
+     * @see #setButtonTintMode(PorterDuff.Mode)
+     */
+    @Nullable
+    public static PorterDuff.Mode getButtonTintMode(@NonNull CompoundButton button) {
+        return IMPL.getButtonTintMode(button);
+    }
+
+    /**
+     * Returns the drawable used as the compound button image
+     *
+     * @see CompoundButton#setButtonDrawable(Drawable)
+     */
+    @Nullable
+    public static Drawable getButtonDrawable(@NonNull CompoundButton button) {
+        return IMPL.getButtonDrawable(button);
+    }
+}
diff --git a/compat/java/android/support/v4/widget/EdgeEffectCompat.java b/compat/java/android/support/v4/widget/EdgeEffectCompat.java
new file mode 100644
index 0000000..d65fb67
--- /dev/null
+++ b/compat/java/android/support/v4/widget/EdgeEffectCompat.java
@@ -0,0 +1,276 @@
+/*
+ * 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 android.support.v4.widget;
+
+import android.content.Context;
+import android.graphics.Canvas;
+import android.os.Build;
+
+/**
+ * Helper for accessing {@link android.widget.EdgeEffect} introduced after
+ * API level 4 in a backwards compatible fashion.
+ *
+ * This class is used to access {@link android.widget.EdgeEffect} on platform versions     
+ * that support it. When running on older platforms it will result in no-ops. It should     
+ * be used by views that wish to use the standard Android visual effects at the edges       
+ * of scrolling containers.
+ */
+public final class EdgeEffectCompat {
+    private Object mEdgeEffect;
+
+    private static final EdgeEffectImpl IMPL;
+
+    static {
+        if (Build.VERSION.SDK_INT >= 21) {
+            IMPL = new EdgeEffectLollipopImpl(); // Lollipop
+        } else if (Build.VERSION.SDK_INT >= 14) { // ICS
+            IMPL = new EdgeEffectIcsImpl();
+        } else {
+            IMPL = new BaseEdgeEffectImpl();
+        }
+    }
+
+    interface EdgeEffectImpl {
+        public Object newEdgeEffect(Context context);
+        public void setSize(Object edgeEffect, int width, int height);
+        public boolean isFinished(Object edgeEffect);
+        public void finish(Object edgeEffect);
+        public boolean onPull(Object edgeEffect, float deltaDistance);
+        public boolean onRelease(Object edgeEffect);
+        public boolean onAbsorb(Object edgeEffect, int velocity);
+        public boolean draw(Object edgeEffect, Canvas canvas);
+        public boolean onPull(Object edgeEffect, float deltaDistance, float displacement);
+    }
+
+    /**
+     * Null implementation to use pre-ICS
+     */
+    static class BaseEdgeEffectImpl implements EdgeEffectImpl {
+        @Override
+        public Object newEdgeEffect(Context context) {
+            return null;
+        }
+
+        @Override
+        public void setSize(Object edgeEffect, int width, int height) {
+        }
+
+        @Override
+        public boolean isFinished(Object edgeEffect) {
+            return true;
+        }
+
+        @Override
+        public void finish(Object edgeEffect) {
+        }
+
+        @Override
+        public boolean onPull(Object edgeEffect, float deltaDistance) {
+            return false;
+        }
+
+        @Override
+        public boolean onRelease(Object edgeEffect) {
+            return false;
+        }
+
+        @Override
+        public boolean onAbsorb(Object edgeEffect, int velocity) {
+            return false;
+        }
+
+        @Override
+        public boolean draw(Object edgeEffect, Canvas canvas) {
+            return false;
+        }
+
+        @Override
+        public boolean onPull(Object edgeEffect, float deltaDistance, float displacement) {
+            return false;
+        }
+    }
+
+    static class EdgeEffectIcsImpl implements EdgeEffectImpl {
+        @Override
+        public Object newEdgeEffect(Context context) {
+            return EdgeEffectCompatIcs.newEdgeEffect(context);
+        }
+
+        @Override
+        public void setSize(Object edgeEffect, int width, int height) {
+            EdgeEffectCompatIcs.setSize(edgeEffect, width, height);
+        }
+
+        @Override
+        public boolean isFinished(Object edgeEffect) {
+            return EdgeEffectCompatIcs.isFinished(edgeEffect);
+        }
+
+        @Override
+        public void finish(Object edgeEffect) {
+            EdgeEffectCompatIcs.finish(edgeEffect);
+        }
+
+        @Override
+        public boolean onPull(Object edgeEffect, float deltaDistance) {
+            return EdgeEffectCompatIcs.onPull(edgeEffect, deltaDistance);
+        }
+
+        @Override
+        public boolean onRelease(Object edgeEffect) {
+            return EdgeEffectCompatIcs.onRelease(edgeEffect);
+        }
+
+        @Override
+        public boolean onAbsorb(Object edgeEffect, int velocity) {
+            return EdgeEffectCompatIcs.onAbsorb(edgeEffect, velocity);
+        }
+
+        @Override
+        public boolean draw(Object edgeEffect, Canvas canvas) {
+            return EdgeEffectCompatIcs.draw(edgeEffect, canvas);
+        }
+
+        @Override
+        public boolean onPull(Object edgeEffect, float deltaDistance, float displacement) {
+            return EdgeEffectCompatIcs.onPull(edgeEffect, deltaDistance);
+        }
+    }
+
+    static class EdgeEffectLollipopImpl extends EdgeEffectIcsImpl {
+        @Override
+        public boolean onPull(Object edgeEffect, float deltaDistance, float displacement) {
+            return EdgeEffectCompatLollipop.onPull(edgeEffect, deltaDistance, displacement);
+        }
+    }
+
+    /**
+     * Construct a new EdgeEffect themed using the given context.
+     *
+     * <p>Note: On platform versions that do not support EdgeEffect, all operations
+     * on the newly constructed object will be mocked/no-ops.</p>
+     *
+     * @param context Context to use for theming the effect
+     */
+    public EdgeEffectCompat(Context context) {
+        mEdgeEffect = IMPL.newEdgeEffect(context);
+    }
+
+    /**
+     * Set the size of this edge effect in pixels.
+     *
+     * @param width Effect width in pixels
+     * @param height Effect height in pixels
+     */
+    public void setSize(int width, int height) {
+        IMPL.setSize(mEdgeEffect, width, height);
+    }
+
+    /**
+     * Reports if this EdgeEffectCompat's animation is finished. If this method returns false
+     * after a call to {@link #draw(Canvas)} the host widget should schedule another
+     * drawing pass to continue the animation.
+     *
+     * @return true if animation is finished, false if drawing should continue on the next frame.
+     */
+    public boolean isFinished() {
+        return IMPL.isFinished(mEdgeEffect);
+    }
+
+    /**
+     * Immediately finish the current animation.
+     * After this call {@link #isFinished()} will return true.
+     */
+    public void finish() {
+        IMPL.finish(mEdgeEffect);
+    }
+
+    /**
+     * A view should call this when content is pulled away from an edge by the user.
+     * This will update the state of the current visual effect and its associated animation.
+     * The host view should always {@link android.view.View#invalidate()} if this method
+     * returns true and draw the results accordingly.
+     *
+     * @param deltaDistance Change in distance since the last call. Values may be 0 (no change) to
+     *                      1.f (full length of the view) or negative values to express change
+     *                      back toward the edge reached to initiate the effect.
+     * @return true if the host view should call invalidate, false if it should not.
+     * @deprecated use {@link #onPull(float, float)}
+     */
+    @Deprecated
+    public boolean onPull(float deltaDistance) {
+        return IMPL.onPull(mEdgeEffect, deltaDistance);
+    }
+
+    /**
+     * A view should call this when content is pulled away from an edge by the user.
+     * This will update the state of the current visual effect and its associated animation.
+     * The host view should always {@link android.view.View#invalidate()} if this method
+     * returns true and draw the results accordingly.
+     *
+     * @param deltaDistance Change in distance since the last call. Values may be 0 (no change) to
+     *                      1.f (full length of the view) or negative values to express change
+     *                      back toward the edge reached to initiate the effect.
+     * @param displacement The displacement from the starting side of the effect of the point
+     *                     initiating the pull. In the case of touch this is the finger position.
+     *                     Values may be from 0-1.
+     * @return true if the host view should call invalidate, false if it should not.
+     */
+    public boolean onPull(float deltaDistance, float displacement) {
+        return IMPL.onPull(mEdgeEffect, deltaDistance, displacement);
+    }
+
+    /**
+     * Call when the object is released after being pulled.
+     * This will begin the "decay" phase of the effect. After calling this method
+     * the host view should {@link android.view.View#invalidate()} if this method
+     * returns true and thereby draw the results accordingly.
+     *
+     * @return true if the host view should invalidate, false if it should not.
+     */
+    public boolean onRelease() {
+        return IMPL.onRelease(mEdgeEffect);
+    }
+
+    /**
+     * Call when the effect absorbs an impact at the given velocity.
+     * Used when a fling reaches the scroll boundary.
+     *
+     * <p>When using a {@link android.widget.Scroller} or {@link android.widget.OverScroller},
+     * the method <code>getCurrVelocity</code> will provide a reasonable approximation
+     * to use here.</p>
+     *
+     * @param velocity Velocity at impact in pixels per second.
+     * @return true if the host view should invalidate, false if it should not.
+     */
+    public boolean onAbsorb(int velocity) {
+        return IMPL.onAbsorb(mEdgeEffect, velocity);
+    }
+
+    /**
+     * Draw into the provided canvas. Assumes that the canvas has been rotated
+     * accordingly and the size has been set. The effect will be drawn the full
+     * width of X=0 to X=width, beginning from Y=0 and extending to some factor <
+     * 1.f of height.
+     *
+     * @param canvas Canvas to draw into
+     * @return true if drawing should continue beyond this frame to continue the
+     *         animation
+     */
+    public boolean draw(Canvas canvas) {
+        return IMPL.draw(mEdgeEffect, canvas);
+    }
+}
diff --git a/v4/java/android/support/v4/widget/ListPopupWindowCompat.java b/compat/java/android/support/v4/widget/ListPopupWindowCompat.java
similarity index 100%
rename from v4/java/android/support/v4/widget/ListPopupWindowCompat.java
rename to compat/java/android/support/v4/widget/ListPopupWindowCompat.java
diff --git a/compat/java/android/support/v4/widget/ListViewCompat.java b/compat/java/android/support/v4/widget/ListViewCompat.java
new file mode 100644
index 0000000..6e98540
--- /dev/null
+++ b/compat/java/android/support/v4/widget/ListViewCompat.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2016 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 android.support.v4.widget;
+
+import android.os.Build;
+import android.support.annotation.NonNull;
+import android.widget.ListView;
+
+/**
+ * Helper for accessing features in {@link ListView} introduced after API level
+ * 4 in a backwards compatible fashion.
+ */
+public final class ListViewCompat {
+
+    /**
+     * Scrolls the list items within the view by a specified number of pixels.
+     *
+     * @param listView the list to scroll
+     * @param y the amount of pixels to scroll by vertically
+     */
+    public static void scrollListBy(@NonNull ListView listView, int y) {
+        if (Build.VERSION.SDK_INT >= 19) {
+            ListViewCompatKitKat.scrollListBy(listView, y);
+        } else {
+            ListViewCompatGingerbread.scrollListBy(listView, y);
+        }
+    }
+
+    private ListViewCompat() {}
+}
diff --git a/v4/java/android/support/v4/widget/PopupMenuCompat.java b/compat/java/android/support/v4/widget/PopupMenuCompat.java
similarity index 100%
rename from v4/java/android/support/v4/widget/PopupMenuCompat.java
rename to compat/java/android/support/v4/widget/PopupMenuCompat.java
diff --git a/compat/java/android/support/v4/widget/PopupWindowCompat.java b/compat/java/android/support/v4/widget/PopupWindowCompat.java
new file mode 100644
index 0000000..2047662
--- /dev/null
+++ b/compat/java/android/support/v4/widget/PopupWindowCompat.java
@@ -0,0 +1,250 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.support.v4.widget;
+
+import android.support.v4.view.GravityCompat;
+import android.support.v4.view.ViewCompat;
+import android.view.Gravity;
+import android.view.View;
+import android.view.WindowManager;
+import android.widget.PopupWindow;
+
+import java.lang.reflect.Method;
+
+/**
+ * Helper for accessing features in PopupWindow introduced after API level 4
+ * in a backwards compatible fashion.
+ */
+public final class PopupWindowCompat {
+    /**
+     * Interface for the full API.
+     */
+    interface PopupWindowImpl {
+        void showAsDropDown(PopupWindow popup, View anchor, int xoff, int yoff, int gravity);
+        void setOverlapAnchor(PopupWindow popupWindow, boolean overlapAnchor);
+        boolean getOverlapAnchor(PopupWindow popupWindow);
+        void setWindowLayoutType(PopupWindow popupWindow, int layoutType);
+        int getWindowLayoutType(PopupWindow popupWindow);
+    }
+
+    /**
+     * Interface implementation that doesn't use anything above v4 APIs.
+     */
+    static class BasePopupWindowImpl implements PopupWindowImpl {
+        private static Method sSetWindowLayoutTypeMethod;
+        private static boolean sSetWindowLayoutTypeMethodAttempted;
+        private static Method sGetWindowLayoutTypeMethod;
+        private static boolean sGetWindowLayoutTypeMethodAttempted;
+
+        @Override
+        public void showAsDropDown(PopupWindow popup, View anchor, int xoff, int yoff,
+                int gravity) {
+            final int hgrav = GravityCompat.getAbsoluteGravity(gravity,
+                    ViewCompat.getLayoutDirection(anchor)) & Gravity.HORIZONTAL_GRAVITY_MASK;
+            if (hgrav == Gravity.RIGHT) {
+                // Flip the location to align the right sides of the popup and
+                // anchor instead of left.
+                xoff -= (popup.getWidth() - anchor.getWidth());
+            }
+            popup.showAsDropDown(anchor, xoff, yoff);
+        }
+
+        @Override
+        public void setOverlapAnchor(PopupWindow popupWindow, boolean overlapAnchor) {
+            // noop
+        }
+
+        @Override
+        public boolean getOverlapAnchor(PopupWindow popupWindow) {
+            return false;
+        }
+
+        @Override
+        public void setWindowLayoutType(PopupWindow popupWindow, int layoutType) {
+            if (!sSetWindowLayoutTypeMethodAttempted) {
+                try {
+                    sSetWindowLayoutTypeMethod = PopupWindow.class.getDeclaredMethod(
+                            "setWindowLayoutType", int.class);
+                    sSetWindowLayoutTypeMethod.setAccessible(true);
+                } catch (Exception e) {
+                    // Reflection method fetch failed. Oh well.
+                }
+                sSetWindowLayoutTypeMethodAttempted = true;
+            }
+
+            if (sSetWindowLayoutTypeMethod != null) {
+                try {
+                    sSetWindowLayoutTypeMethod.invoke(popupWindow, layoutType);
+                } catch (Exception e) {
+                    // Reflection call failed. Oh well.
+                }
+            }
+        }
+
+        @Override
+        public int getWindowLayoutType(PopupWindow popupWindow) {
+            if (!sGetWindowLayoutTypeMethodAttempted) {
+                try {
+                    sGetWindowLayoutTypeMethod = PopupWindow.class.getDeclaredMethod(
+                            "getWindowLayoutType");
+                    sGetWindowLayoutTypeMethod.setAccessible(true);
+                } catch (Exception e) {
+                    // Reflection method fetch failed. Oh well.
+                }
+                sGetWindowLayoutTypeMethodAttempted = true;
+            }
+
+            if (sGetWindowLayoutTypeMethod != null) {
+                try {
+                    return (Integer) sGetWindowLayoutTypeMethod.invoke(popupWindow);
+                } catch (Exception e) {
+                    // Reflection call failed. Oh well.
+                }
+            }
+            return 0;
+        }
+    }
+
+    /**
+     * Interface implementation for devices with at least KitKat APIs.
+     */
+    static class KitKatPopupWindowImpl extends BasePopupWindowImpl {
+        @Override
+        public void showAsDropDown(PopupWindow popup, View anchor, int xoff, int yoff,
+                int gravity) {
+            PopupWindowCompatKitKat.showAsDropDown(popup, anchor, xoff, yoff, gravity);
+        }
+    }
+
+    static class Api21PopupWindowImpl extends KitKatPopupWindowImpl {
+        @Override
+        public void setOverlapAnchor(PopupWindow popupWindow, boolean overlapAnchor) {
+            PopupWindowCompatApi21.setOverlapAnchor(popupWindow, overlapAnchor);
+        }
+
+        @Override
+        public boolean getOverlapAnchor(PopupWindow popupWindow) {
+            return PopupWindowCompatApi21.getOverlapAnchor(popupWindow);
+        }
+    }
+
+    static class Api23PopupWindowImpl extends Api21PopupWindowImpl {
+        @Override
+        public void setOverlapAnchor(PopupWindow popupWindow, boolean overlapAnchor) {
+            PopupWindowCompatApi23.setOverlapAnchor(popupWindow, overlapAnchor);
+        }
+
+        @Override
+        public boolean getOverlapAnchor(PopupWindow popupWindow) {
+            return PopupWindowCompatApi23.getOverlapAnchor(popupWindow);
+        }
+
+        @Override
+        public void setWindowLayoutType(PopupWindow popupWindow, int layoutType) {
+            PopupWindowCompatApi23.setWindowLayoutType(popupWindow, layoutType);
+        }
+
+        @Override
+        public int getWindowLayoutType(PopupWindow popupWindow) {
+            return PopupWindowCompatApi23.getWindowLayoutType(popupWindow);
+        }
+    }
+
+    /**
+     * Select the correct implementation to use for the current platform.
+     */
+    static final PopupWindowImpl IMPL;
+    static {
+        final int version = android.os.Build.VERSION.SDK_INT;
+        if (version >= 23) {
+            IMPL = new Api23PopupWindowImpl();
+        } else if (version >= 21) {
+            IMPL = new Api21PopupWindowImpl();
+        } else if (version >= 19) {
+            IMPL = new KitKatPopupWindowImpl();
+        } else {
+            IMPL = new BasePopupWindowImpl();
+        }
+    }
+
+    private PopupWindowCompat() {
+        // This class is not publicly instantiable.
+    }
+
+    /**
+     * <p>Display the content view in a popup window anchored to the bottom-left
+     * corner of the anchor view offset by the specified x and y coordinates.
+     * If there is not enough room on screen to show
+     * the popup in its entirety, this method tries to find a parent scroll
+     * view to scroll. If no parent scroll view can be scrolled, the bottom-left
+     * corner of the popup is pinned at the top left corner of the anchor view.</p>
+     * <p>If the view later scrolls to move <code>anchor</code> to a different
+     * location, the popup will be moved correspondingly.</p>
+     *
+     * @param popup the PopupWindow to show
+     * @param anchor the view on which to pin the popup window
+     * @param xoff A horizontal offset from the anchor in pixels
+     * @param yoff A vertical offset from the anchor in pixels
+     * @param gravity Alignment of the popup relative to the anchor
+     */
+    public static void showAsDropDown(PopupWindow popup, View anchor, int xoff, int yoff,
+            int gravity) {
+        IMPL.showAsDropDown(popup, anchor, xoff, yoff, gravity);
+    }
+
+    /**
+     * Sets whether the popup window should overlap its anchor view when
+     * displayed as a drop-down.
+     *
+     * @param overlapAnchor Whether the popup should overlap its anchor.
+     */
+    public static void setOverlapAnchor(PopupWindow popupWindow, boolean overlapAnchor) {
+        IMPL.setOverlapAnchor(popupWindow, overlapAnchor);
+    }
+
+    /**
+     * Returns whether the popup window should overlap its anchor view when
+     * displayed as a drop-down.
+     *
+     * @return Whether the popup should overlap its anchor.
+     */
+    public static boolean getOverlapAnchor(PopupWindow popupWindow) {
+        return IMPL.getOverlapAnchor(popupWindow);
+    }
+
+    /**
+     * Set the layout type for this window. This value will be passed through to
+     * {@link WindowManager.LayoutParams#type} therefore the value should match any value
+     * {@link WindowManager.LayoutParams#type} accepts.
+     *
+     * @param layoutType Layout type for this window.
+     *
+     * @see WindowManager.LayoutParams#type
+     */
+    public static void setWindowLayoutType(PopupWindow popupWindow, int layoutType) {
+        IMPL.setWindowLayoutType(popupWindow, layoutType);
+    }
+
+    /**
+     * Returns the layout type for this window.
+     *
+     * @see #setWindowLayoutType(PopupWindow popupWindow, int)
+     */
+    public static int getWindowLayoutType(PopupWindow popupWindow) {
+        return IMPL.getWindowLayoutType(popupWindow);
+    }
+}
diff --git a/compat/java/android/support/v4/widget/ScrollerCompat.java b/compat/java/android/support/v4/widget/ScrollerCompat.java
new file mode 100644
index 0000000..4c8f80b
--- /dev/null
+++ b/compat/java/android/support/v4/widget/ScrollerCompat.java
@@ -0,0 +1,280 @@
+/*
+ * Copyright (C) 2012 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 android.support.v4.widget;
+
+import android.content.Context;
+import android.os.Build;
+import android.view.animation.AnimationUtils;
+import android.view.animation.Interpolator;
+import android.widget.OverScroller;
+import android.widget.Scroller;
+
+/**
+ * Provides access to new {@link android.widget.Scroller Scroller} APIs when available.
+ *
+ * <p>This class provides a platform version-independent mechanism for obeying the
+ * current device's preferred scroll physics and fling behavior. It offers a subset of
+ * the APIs from Scroller or OverScroller.</p>
+ */
+public final class ScrollerCompat {
+    OverScroller mScroller;
+
+    public static ScrollerCompat create(Context context) {
+        return create(context, null);
+    }
+
+    public static ScrollerCompat create(Context context, Interpolator interpolator) {
+        return new ScrollerCompat(context, interpolator);
+    }
+
+    /**
+     * Private constructer where API version can be provided.
+     * Useful for unit testing.
+     */
+    private ScrollerCompat(Context context, Interpolator interpolator) {
+        mScroller = interpolator != null ?
+                new OverScroller(context, interpolator) : new OverScroller(context);
+    }
+
+    /**
+     * Returns whether the scroller has finished scrolling.
+     *
+     * @return True if the scroller has finished scrolling, false otherwise.
+     */
+    public boolean isFinished() {
+        return mScroller.isFinished();
+    }
+
+    /**
+     * Returns the current X offset in the scroll.
+     *
+     * @return The new X offset as an absolute distance from the origin.
+     */
+    public int getCurrX() {
+        return mScroller.getCurrX();
+    }
+
+    /**
+     * Returns the current Y offset in the scroll.
+     *
+     * @return The new Y offset as an absolute distance from the origin.
+     */
+    public int getCurrY() {
+        return mScroller.getCurrY();
+    }
+
+    /**
+     * @return The final X position for the scroll in progress, if known.
+     */
+    public int getFinalX() {
+        return mScroller.getFinalX();
+    }
+
+    /**
+     * @return The final Y position for the scroll in progress, if known.
+     */
+    public int getFinalY() {
+        return mScroller.getFinalY();
+    }
+
+    /**
+     * Returns the current velocity on platform versions that support it.
+     *
+     * <p>The device must support at least API level 14 (Ice Cream Sandwich).
+     * On older platform versions this method will return 0. This method should
+     * only be used as input for nonessential visual effects such as {@link EdgeEffectCompat}.</p>
+     *
+     * @return The original velocity less the deceleration. Result may be
+     * negative.
+     */
+    public float getCurrVelocity() {
+        return Build.VERSION.SDK_INT < 14 ? 0 : ScrollerCompatIcs.getCurrVelocity(mScroller);
+    }
+
+    /**
+     * Call this when you want to know the new location.  If it returns true,
+     * the animation is not yet finished.  loc will be altered to provide the
+     * new location.
+     */
+    public boolean computeScrollOffset() {
+        return mScroller.computeScrollOffset();
+    }
+
+    /**
+     * Start scrolling by providing a starting point and the distance to travel.
+     * The scroll will use the default value of 250 milliseconds for the
+     * duration.
+     *
+     * @param startX Starting horizontal scroll offset in pixels. Positive
+     *        numbers will scroll the content to the left.
+     * @param startY Starting vertical scroll offset in pixels. Positive numbers
+     *        will scroll the content up.
+     * @param dx Horizontal distance to travel. Positive numbers will scroll the
+     *        content to the left.
+     * @param dy Vertical distance to travel. Positive numbers will scroll the
+     *        content up.
+     */
+    public void startScroll(int startX, int startY, int dx, int dy) {
+        mScroller.startScroll(startX, startY, dx, dy);
+    }
+
+    /**
+     * Start scrolling by providing a starting point and the distance to travel.
+     *
+     * @param startX Starting horizontal scroll offset in pixels. Positive
+     *        numbers will scroll the content to the left.
+     * @param startY Starting vertical scroll offset in pixels. Positive numbers
+     *        will scroll the content up.
+     * @param dx Horizontal distance to travel. Positive numbers will scroll the
+     *        content to the left.
+     * @param dy Vertical distance to travel. Positive numbers will scroll the
+     *        content up.
+     * @param duration Duration of the scroll in milliseconds.
+     */
+    public void startScroll(int startX, int startY, int dx, int dy, int duration) {
+        mScroller.startScroll(startX, startY, dx, dy, duration);
+    }
+
+    /**
+     * Start scrolling based on a fling gesture. The distance travelled will
+     * depend on the initial velocity of the fling.
+     *
+     * @param startX Starting point of the scroll (X)
+     * @param startY Starting point of the scroll (Y)
+     * @param velocityX Initial velocity of the fling (X) measured in pixels per
+     *        second.
+     * @param velocityY Initial velocity of the fling (Y) measured in pixels per
+     *        second
+     * @param minX Minimum X value. The scroller will not scroll past this
+     *        point.
+     * @param maxX Maximum X value. The scroller will not scroll past this
+     *        point.
+     * @param minY Minimum Y value. The scroller will not scroll past this
+     *        point.
+     * @param maxY Maximum Y value. The scroller will not scroll past this
+     *        point.
+     */
+    public void fling(int startX, int startY, int velocityX, int velocityY,
+            int minX, int maxX, int minY, int maxY) {
+        mScroller.fling(startX, startY, velocityX, velocityY, minX, maxX, minY, maxY);
+    }
+
+    /**
+     * Start scrolling based on a fling gesture. The distance travelled will
+     * depend on the initial velocity of the fling.
+     *
+     * @param startX Starting point of the scroll (X)
+     * @param startY Starting point of the scroll (Y)
+     * @param velocityX Initial velocity of the fling (X) measured in pixels per
+     *        second.
+     * @param velocityY Initial velocity of the fling (Y) measured in pixels per
+     *        second
+     * @param minX Minimum X value. The scroller will not scroll past this
+     *        point.
+     * @param maxX Maximum X value. The scroller will not scroll past this
+     *        point.
+     * @param minY Minimum Y value. The scroller will not scroll past this
+     *        point.
+     * @param maxY Maximum Y value. The scroller will not scroll past this
+     *        point.
+     * @param overX Overfling range. If > 0, horizontal overfling in either
+     *            direction will be possible.
+     * @param overY Overfling range. If > 0, vertical overfling in either
+     *            direction will be possible.
+     */
+    public void fling(int startX, int startY, int velocityX, int velocityY,
+            int minX, int maxX, int minY, int maxY, int overX, int overY) {
+        mScroller.fling(startX, startY, velocityX, velocityY,
+                minX, maxX, minY, maxY, overX, overY);
+    }
+
+    /**
+     * Call this when you want to 'spring back' into a valid coordinate range.
+     *
+     * @param startX Starting X coordinate
+     * @param startY Starting Y coordinate
+     * @param minX Minimum valid X value
+     * @param maxX Maximum valid X value
+     * @param minY Minimum valid Y value
+     * @param maxY Maximum valid Y value
+     * @return true if a springback was initiated, false if startX and startY were
+     *          already within the valid range.
+     */
+    public boolean springBack(int startX, int startY, int minX, int maxX, int minY, int maxY) {
+        return mScroller.springBack(startX, startY, minX, maxX, minY, maxY);
+    }
+
+    /**
+     * Stops the animation. Aborting the animation causes the scroller to move to the final x and y
+     * position.
+     */
+    public void abortAnimation() {
+        mScroller.abortAnimation();
+    }
+
+
+    /**
+     * Notify the scroller that we've reached a horizontal boundary.
+     * Normally the information to handle this will already be known
+     * when the animation is started, such as in a call to one of the
+     * fling functions. However there are cases where this cannot be known
+     * in advance. This function will transition the current motion and
+     * animate from startX to finalX as appropriate.
+     *
+     * @param startX Starting/current X position
+     * @param finalX Desired final X position
+     * @param overX Magnitude of overscroll allowed. This should be the maximum
+     *              desired distance from finalX. Absolute value - must be positive.
+     */
+    public void notifyHorizontalEdgeReached(int startX, int finalX, int overX) {
+        mScroller.notifyHorizontalEdgeReached(startX, finalX, overX);
+    }
+
+    /**
+     * Notify the scroller that we've reached a vertical boundary.
+     * Normally the information to handle this will already be known
+     * when the animation is started, such as in a call to one of the
+     * fling functions. However there are cases where this cannot be known
+     * in advance. This function will animate a parabolic motion from
+     * startY to finalY.
+     *
+     * @param startY Starting/current Y position
+     * @param finalY Desired final Y position
+     * @param overY Magnitude of overscroll allowed. This should be the maximum
+     *              desired distance from finalY. Absolute value - must be positive.
+     */
+    public void notifyVerticalEdgeReached(int startY, int finalY, int overY) {
+        mScroller.notifyVerticalEdgeReached(startY, finalY, overY);
+    }
+
+    /**
+     * Returns whether the current Scroller is currently returning to a valid position.
+     * Valid bounds were provided by the
+     * {@link #fling(int, int, int, int, int, int, int, int, int, int)} method.
+     *
+     * One should check this value before calling
+     * {@link #startScroll(int, int, int, int)} as the interpolation currently in progress
+     * to restore a valid position will then be stopped. The caller has to take into account
+     * the fact that the started scroll will start from an overscrolled position.
+     *
+     * @return true when the current position is overscrolled and in the process of
+     *         interpolating back to a valid value.
+     */
+    public boolean isOverScrolled() {
+        return mScroller.isOverScrolled();
+    }
+}
diff --git a/v4/java/android/support/v4/widget/SearchViewCompat.java b/compat/java/android/support/v4/widget/SearchViewCompat.java
similarity index 100%
rename from v4/java/android/support/v4/widget/SearchViewCompat.java
rename to compat/java/android/support/v4/widget/SearchViewCompat.java
diff --git a/compat/java/android/support/v4/widget/TextViewCompat.java b/compat/java/android/support/v4/widget/TextViewCompat.java
new file mode 100644
index 0000000..3239587
--- /dev/null
+++ b/compat/java/android/support/v4/widget/TextViewCompat.java
@@ -0,0 +1,271 @@
+/*
+ * Copyright (C) 2015 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 android.support.v4.widget;
+
+import android.graphics.drawable.Drawable;
+import android.os.Build;
+import android.support.annotation.DrawableRes;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.annotation.StyleRes;
+import android.widget.TextView;
+
+/**
+ * Helper for accessing features in {@link TextView} introduced after API level
+ * 4 in a backwards compatible fashion.
+ */
+public final class TextViewCompat {
+
+    // Hide constructor
+    private TextViewCompat() {}
+
+    interface TextViewCompatImpl {
+        void setCompoundDrawablesRelative(@NonNull TextView textView,
+                @Nullable Drawable start, @Nullable Drawable top, @Nullable Drawable end,
+                @Nullable Drawable bottom);
+        void setCompoundDrawablesRelativeWithIntrinsicBounds(@NonNull TextView textView,
+                @Nullable Drawable start, @Nullable Drawable top, @Nullable Drawable end,
+                @Nullable Drawable bottom);
+        void setCompoundDrawablesRelativeWithIntrinsicBounds(@NonNull TextView textView,
+                @DrawableRes int start, @DrawableRes int top, @DrawableRes int end,
+                @DrawableRes int bottom);
+        int getMaxLines(TextView textView);
+        int getMinLines(TextView textView);
+        void setTextAppearance(@NonNull TextView textView, @StyleRes int resId);
+    }
+
+    static class BaseTextViewCompatImpl implements TextViewCompatImpl {
+        @Override
+        public void setCompoundDrawablesRelative(@NonNull TextView textView,
+                @Nullable Drawable start, @Nullable Drawable top, @Nullable Drawable end,
+                @Nullable Drawable bottom) {
+            textView.setCompoundDrawables(start, top, end, bottom);
+        }
+
+        @Override
+        public void setCompoundDrawablesRelativeWithIntrinsicBounds(@NonNull TextView textView,
+                @Nullable Drawable start, @Nullable Drawable top, @Nullable Drawable end,
+                @Nullable Drawable bottom) {
+            textView.setCompoundDrawablesWithIntrinsicBounds(start, top, end, bottom);
+        }
+
+        @Override
+        public void setCompoundDrawablesRelativeWithIntrinsicBounds(@NonNull TextView textView,
+                @DrawableRes int start, @DrawableRes int top, @DrawableRes int end,
+                @DrawableRes int bottom) {
+            textView.setCompoundDrawablesWithIntrinsicBounds(start, top, end, bottom);
+        }
+
+        @Override
+        public int getMaxLines(TextView textView) {
+            return TextViewCompatGingerbread.getMaxLines(textView);
+        }
+
+        @Override
+        public int getMinLines(TextView textView) {
+            return TextViewCompatGingerbread.getMinLines(textView);
+        }
+
+        @Override
+        public void setTextAppearance(TextView textView, @StyleRes int resId) {
+            TextViewCompatGingerbread.setTextAppearance(textView, resId);
+        }
+    }
+
+    static class JbTextViewCompatImpl extends BaseTextViewCompatImpl {
+        @Override
+        public int getMaxLines(TextView textView) {
+            return TextViewCompatJb.getMaxLines(textView);
+        }
+
+        @Override
+        public int getMinLines(TextView textView) {
+            return TextViewCompatJb.getMinLines(textView);
+        }
+    }
+
+    static class JbMr1TextViewCompatImpl extends JbTextViewCompatImpl {
+        @Override
+        public void setCompoundDrawablesRelative(@NonNull TextView textView,
+                @Nullable Drawable start, @Nullable Drawable top, @Nullable Drawable end,
+                @Nullable Drawable bottom) {
+            TextViewCompatJbMr1.setCompoundDrawablesRelative(textView, start, top, end, bottom);
+        }
+
+        @Override
+        public void setCompoundDrawablesRelativeWithIntrinsicBounds(@NonNull TextView textView,
+                @Nullable Drawable start, @Nullable Drawable top, @Nullable Drawable end,
+                @Nullable Drawable bottom) {
+            TextViewCompatJbMr1.setCompoundDrawablesRelativeWithIntrinsicBounds(textView,
+                    start, top, end, bottom);
+        }
+
+        @Override
+        public void setCompoundDrawablesRelativeWithIntrinsicBounds(@NonNull TextView textView,
+                @DrawableRes int start, @DrawableRes int top, @DrawableRes int end,
+                @DrawableRes int bottom) {
+            TextViewCompatJbMr1.setCompoundDrawablesRelativeWithIntrinsicBounds(textView,
+                    start, top, end, bottom);
+        }
+    }
+
+    static class JbMr2TextViewCompatImpl extends JbMr1TextViewCompatImpl {
+        @Override
+        public void setCompoundDrawablesRelative(@NonNull TextView textView,
+                @Nullable Drawable start, @Nullable Drawable top, @Nullable Drawable end,
+                @Nullable Drawable bottom) {
+            TextViewCompatJbMr2.setCompoundDrawablesRelative(textView, start, top, end, bottom);
+        }
+
+        @Override
+        public void setCompoundDrawablesRelativeWithIntrinsicBounds(@NonNull TextView textView,
+                @Nullable Drawable start, @Nullable Drawable top, @Nullable Drawable end,
+                @Nullable Drawable bottom) {
+            TextViewCompatJbMr2
+                    .setCompoundDrawablesRelativeWithIntrinsicBounds(textView, start, top, end,
+                            bottom);
+        }
+
+        @Override
+        public void setCompoundDrawablesRelativeWithIntrinsicBounds(@NonNull TextView textView,
+                @DrawableRes int start, @DrawableRes int top, @DrawableRes int end,
+                @DrawableRes int bottom) {
+            TextViewCompatJbMr2.setCompoundDrawablesRelativeWithIntrinsicBounds(textView,
+                    start, top, end, bottom);
+        }
+    }
+
+    static class Api23TextViewCompatImpl extends JbMr2TextViewCompatImpl {
+        @Override
+        public void setTextAppearance(@NonNull TextView textView, @StyleRes int resId) {
+            TextViewCompatApi23.setTextAppearance(textView, resId);
+        }
+    }
+
+    static final TextViewCompatImpl IMPL;
+
+    static {
+        final int version = Build.VERSION.SDK_INT;
+        if (version >= 23) {
+            IMPL = new Api23TextViewCompatImpl();
+        } else if (version >= 18) {
+            IMPL = new JbMr2TextViewCompatImpl();
+        } else if (version >= 17) {
+            IMPL = new JbMr1TextViewCompatImpl();
+        } else if (version >= 16) {
+            IMPL = new JbTextViewCompatImpl();
+        } else {
+            IMPL = new BaseTextViewCompatImpl();
+        }
+    }
+
+    /**
+     * Sets the Drawables (if any) to appear to the start of, above, to the end
+     * of, and below the text. Use {@code null} if you do not want a Drawable
+     * there. The Drawables must already have had {@link Drawable#setBounds}
+     * called.
+     * <p/>
+     * Calling this method will overwrite any Drawables previously set using
+     * {@link TextView#setCompoundDrawables} or related methods.
+     *
+     * @param textView The TextView against which to invoke the method.
+     * @attr name android:drawableStart
+     * @attr name android:drawableTop
+     * @attr name android:drawableEnd
+     * @attr name android:drawableBottom
+     */
+    public static void setCompoundDrawablesRelative(@NonNull TextView textView,
+            @Nullable Drawable start, @Nullable Drawable top, @Nullable Drawable end,
+            @Nullable Drawable bottom) {
+        IMPL.setCompoundDrawablesRelative(textView, start, top, end, bottom);
+    }
+
+    /**
+     * Sets the Drawables (if any) to appear to the start of, above, to the end
+     * of, and below the text. Use {@code null} if you do not want a Drawable
+     * there. The Drawables' bounds will be set to their intrinsic bounds.
+     * <p/>
+     * Calling this method will overwrite any Drawables previously set using
+     * {@link TextView#setCompoundDrawables} or related methods.
+     *
+     * @param textView The TextView against which to invoke the method.
+     * @attr name android:drawableStart
+     * @attr name android:drawableTop
+     * @attr name android:drawableEnd
+     * @attr name android:drawableBottom
+     */
+    public static void setCompoundDrawablesRelativeWithIntrinsicBounds(@NonNull TextView textView,
+            @Nullable Drawable start, @Nullable Drawable top, @Nullable Drawable end,
+            @Nullable Drawable bottom) {
+        IMPL.setCompoundDrawablesRelativeWithIntrinsicBounds(textView, start, top, end, bottom);
+    }
+
+    /**
+     * Sets the Drawables (if any) to appear to the start of, above, to the end
+     * of, and below the text. Use 0 if you do not want a Drawable there. The
+     * Drawables' bounds will be set to their intrinsic bounds.
+     * <p/>
+     * Calling this method will overwrite any Drawables previously set using
+     * {@link TextView#setCompoundDrawables} or related methods.
+     *
+     * @param textView The TextView against which to invoke the method.
+     * @param start    Resource identifier of the start Drawable.
+     * @param top      Resource identifier of the top Drawable.
+     * @param end      Resource identifier of the end Drawable.
+     * @param bottom   Resource identifier of the bottom Drawable.
+     * @attr name android:drawableStart
+     * @attr name android:drawableTop
+     * @attr name android:drawableEnd
+     * @attr name android:drawableBottom
+     */
+    public static void setCompoundDrawablesRelativeWithIntrinsicBounds(@NonNull TextView textView,
+            @DrawableRes int start, @DrawableRes int top, @DrawableRes int end,
+            @DrawableRes int bottom) {
+        IMPL.setCompoundDrawablesRelativeWithIntrinsicBounds(textView, start, top, end, bottom);
+    }
+
+    /**
+     * Returns the maximum number of lines displayed in the given TextView, or -1 if the maximum
+     * height was set in pixels instead.
+     */
+    public static int getMaxLines(@NonNull TextView textView) {
+        return IMPL.getMaxLines(textView);
+    }
+
+    /**
+     * Returns the minimum number of lines displayed in the given TextView, or -1 if the minimum
+     * height was set in pixels instead.
+     */
+    public static int getMinLines(@NonNull TextView textView) {
+        return IMPL.getMinLines(textView);
+    }
+
+    /**
+     * Sets the text appearance from the specified style resource.
+     * <p>
+     * Use a framework-defined {@code TextAppearance} style like
+     * {@link android.R.style#TextAppearance_Material_Body1 @android:style/TextAppearance.Material.Body1}
+     * or see {@link android.R.styleable#TextAppearance TextAppearance} for the
+     * set of attributes that can be used in a custom style.
+     *
+     * @param textView The TextView against which to invoke the method.
+     * @param resId    The resource identifier of the style to apply.
+     */
+    public static void setTextAppearance(@NonNull TextView textView, @StyleRes int resId) {
+        IMPL.setTextAppearance(textView, resId);
+    }
+}
diff --git a/compat/java/android/support/v4/widget/TextViewCompatGingerbread.java b/compat/java/android/support/v4/widget/TextViewCompatGingerbread.java
new file mode 100644
index 0000000..65056f5
--- /dev/null
+++ b/compat/java/android/support/v4/widget/TextViewCompatGingerbread.java
@@ -0,0 +1,98 @@
+/*
+ * Copyright (C) 2015 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 android.support.v4.widget;
+
+import android.util.Log;
+import android.widget.TextView;
+
+import java.lang.reflect.Field;
+
+class TextViewCompatGingerbread {
+
+    private static final String LOG_TAG = "TextViewCompatGingerbread";
+    private static final int LINES = 1;
+
+    private static Field sMaximumField;
+    private static boolean sMaximumFieldFetched;
+    private static Field sMaxModeField;
+    private static boolean sMaxModeFieldFetched;
+
+    private static Field sMinimumField;
+    private static boolean sMinimumFieldFetched;
+    private static Field sMinModeField;
+    private static boolean sMinModeFieldFetched;
+
+    static int getMaxLines(TextView textView) {
+        if (!sMaxModeFieldFetched) {
+            sMaxModeField = retrieveField("mMaxMode");
+            sMaxModeFieldFetched = true;
+        }
+        if (sMaxModeField != null && retrieveIntFromField(sMaxModeField, textView) == LINES) {
+            // If the max mode is using lines, we can grab the maximum value
+            if (!sMaximumFieldFetched) {
+                sMaximumField = retrieveField("mMaximum");
+                sMaximumFieldFetched = true;
+            }
+            if (sMaximumField != null) {
+                return retrieveIntFromField(sMaximumField, textView);
+            }
+        }
+        return -1;
+    }
+
+    static int getMinLines(TextView textView) {
+        if (!sMinModeFieldFetched) {
+            sMinModeField = retrieveField("mMinMode");
+            sMinModeFieldFetched = true;
+        }
+        if (sMinModeField != null && retrieveIntFromField(sMinModeField, textView) == LINES) {
+            // If the min mode is using lines, we can grab the maximum value
+            if (!sMinimumFieldFetched) {
+                sMinimumField = retrieveField("mMinimum");
+                sMinimumFieldFetched = true;
+            }
+            if (sMinimumField != null) {
+                return retrieveIntFromField(sMinimumField, textView);
+            }
+        }
+        return -1;
+    }
+
+    private static Field retrieveField(String fieldName) {
+        Field field = null;
+        try {
+            field = TextView.class.getDeclaredField(fieldName);
+            field.setAccessible(true);
+        } catch (NoSuchFieldException e) {
+            Log.e(LOG_TAG, "Could not retrieve " + fieldName + " field.");
+        }
+        return field;
+    }
+
+    private static int retrieveIntFromField(Field field, TextView textView) {
+        try {
+            return field.getInt(textView);
+        } catch (IllegalAccessException e) {
+            Log.d(LOG_TAG, "Could not retrieve value of " + field.getName() + " field.");
+        }
+        return -1;
+    }
+
+    static void setTextAppearance(TextView textView, int resId) {
+        textView.setTextAppearance(textView.getContext(), resId);
+    }
+}
diff --git a/v4/java/android/support/v4/widget/package.html b/compat/java/android/support/v4/widget/package.html
similarity index 100%
rename from v4/java/android/support/v4/widget/package.html
rename to compat/java/android/support/v4/widget/package.html
diff --git a/v4/jellybean-mr1/android/support/v4/content/res/ConfigurationHelperJellybeanMr1.java b/compat/jellybean-mr1/android/support/v4/content/res/ConfigurationHelperJellybeanMr1.java
similarity index 100%
rename from v4/jellybean-mr1/android/support/v4/content/res/ConfigurationHelperJellybeanMr1.java
rename to compat/jellybean-mr1/android/support/v4/content/res/ConfigurationHelperJellybeanMr1.java
diff --git a/v4/jellybean-mr1/android/support/v4/graphics/drawable/DrawableCompatJellybeanMr1.java b/compat/jellybean-mr1/android/support/v4/graphics/drawable/DrawableCompatJellybeanMr1.java
similarity index 100%
rename from v4/jellybean-mr1/android/support/v4/graphics/drawable/DrawableCompatJellybeanMr1.java
rename to compat/jellybean-mr1/android/support/v4/graphics/drawable/DrawableCompatJellybeanMr1.java
diff --git a/v4/jellybean-mr1/android/support/v4/hardware/display/DisplayManagerJellybeanMr1.java b/compat/jellybean-mr1/android/support/v4/hardware/display/DisplayManagerJellybeanMr1.java
similarity index 100%
rename from v4/jellybean-mr1/android/support/v4/hardware/display/DisplayManagerJellybeanMr1.java
rename to compat/jellybean-mr1/android/support/v4/hardware/display/DisplayManagerJellybeanMr1.java
diff --git a/v4/jellybean-mr1/android/support/v4/text/TextUtilsCompatJellybeanMr1.java b/compat/jellybean-mr1/android/support/v4/text/TextUtilsCompatJellybeanMr1.java
similarity index 100%
rename from v4/jellybean-mr1/android/support/v4/text/TextUtilsCompatJellybeanMr1.java
rename to compat/jellybean-mr1/android/support/v4/text/TextUtilsCompatJellybeanMr1.java
diff --git a/v4/jellybean-mr1/android/support/v4/view/GravityCompatJellybeanMr1.java b/compat/jellybean-mr1/android/support/v4/view/GravityCompatJellybeanMr1.java
similarity index 100%
rename from v4/jellybean-mr1/android/support/v4/view/GravityCompatJellybeanMr1.java
rename to compat/jellybean-mr1/android/support/v4/view/GravityCompatJellybeanMr1.java
diff --git a/v4/jellybean-mr1/android/support/v4/view/MarginLayoutParamsCompatJellybeanMr1.java b/compat/jellybean-mr1/android/support/v4/view/MarginLayoutParamsCompatJellybeanMr1.java
similarity index 100%
rename from v4/jellybean-mr1/android/support/v4/view/MarginLayoutParamsCompatJellybeanMr1.java
rename to compat/jellybean-mr1/android/support/v4/view/MarginLayoutParamsCompatJellybeanMr1.java
diff --git a/v4/jellybean-mr1/android/support/v4/view/ViewCompatJellybeanMr1.java b/compat/jellybean-mr1/android/support/v4/view/ViewCompatJellybeanMr1.java
similarity index 100%
rename from v4/jellybean-mr1/android/support/v4/view/ViewCompatJellybeanMr1.java
rename to compat/jellybean-mr1/android/support/v4/view/ViewCompatJellybeanMr1.java
diff --git a/v4/jellybean-mr1/android/support/v4/view/accessibility/AccessibilityNodeInfoCompatJellybeanMr1.java b/compat/jellybean-mr1/android/support/v4/view/accessibility/AccessibilityNodeInfoCompatJellybeanMr1.java
similarity index 100%
rename from v4/jellybean-mr1/android/support/v4/view/accessibility/AccessibilityNodeInfoCompatJellybeanMr1.java
rename to compat/jellybean-mr1/android/support/v4/view/accessibility/AccessibilityNodeInfoCompatJellybeanMr1.java
diff --git a/v4/jellybean-mr1/android/support/v4/widget/TextViewCompatJbMr1.java b/compat/jellybean-mr1/android/support/v4/widget/TextViewCompatJbMr1.java
similarity index 100%
rename from v4/jellybean-mr1/android/support/v4/widget/TextViewCompatJbMr1.java
rename to compat/jellybean-mr1/android/support/v4/widget/TextViewCompatJbMr1.java
diff --git a/v4/jellybean-mr2/android/support/v4/accessibilityservice/AccessibilityServiceInfoCompatJellyBeanMr2.java b/compat/jellybean-mr2/android/support/v4/accessibilityservice/AccessibilityServiceInfoCompatJellyBeanMr2.java
similarity index 100%
rename from v4/jellybean-mr2/android/support/v4/accessibilityservice/AccessibilityServiceInfoCompatJellyBeanMr2.java
rename to compat/jellybean-mr2/android/support/v4/accessibilityservice/AccessibilityServiceInfoCompatJellyBeanMr2.java
diff --git a/v4/jellybean-mr2/android/support/v4/app/BundleCompatJellybeanMR2.java b/compat/jellybean-mr2/android/support/v4/app/BundleCompatJellybeanMR2.java
similarity index 100%
rename from v4/jellybean-mr2/android/support/v4/app/BundleCompatJellybeanMR2.java
rename to compat/jellybean-mr2/android/support/v4/app/BundleCompatJellybeanMR2.java
diff --git a/v4/jellybean-mr2/android/support/v4/graphics/BitmapCompatJellybeanMR2.java b/compat/jellybean-mr2/android/support/v4/graphics/BitmapCompatJellybeanMR2.java
similarity index 100%
rename from v4/jellybean-mr2/android/support/v4/graphics/BitmapCompatJellybeanMR2.java
rename to compat/jellybean-mr2/android/support/v4/graphics/BitmapCompatJellybeanMR2.java
diff --git a/v4/jellybean-mr2/android/support/v4/os/TraceJellybeanMR2.java b/compat/jellybean-mr2/android/support/v4/os/TraceJellybeanMR2.java
similarity index 100%
rename from v4/jellybean-mr2/android/support/v4/os/TraceJellybeanMR2.java
rename to compat/jellybean-mr2/android/support/v4/os/TraceJellybeanMR2.java
diff --git a/v4/jellybean-mr2/android/support/v4/view/ViewCompatJellybeanMr2.java b/compat/jellybean-mr2/android/support/v4/view/ViewCompatJellybeanMr2.java
similarity index 100%
rename from v4/jellybean-mr2/android/support/v4/view/ViewCompatJellybeanMr2.java
rename to compat/jellybean-mr2/android/support/v4/view/ViewCompatJellybeanMr2.java
diff --git a/v4/jellybean-mr2/android/support/v4/view/ViewGroupCompatJellybeanMR2.java b/compat/jellybean-mr2/android/support/v4/view/ViewGroupCompatJellybeanMR2.java
similarity index 100%
rename from v4/jellybean-mr2/android/support/v4/view/ViewGroupCompatJellybeanMR2.java
rename to compat/jellybean-mr2/android/support/v4/view/ViewGroupCompatJellybeanMR2.java
diff --git a/v4/jellybean-mr2/android/support/v4/view/ViewPropertyAnimatorCompatJellybeanMr2.java b/compat/jellybean-mr2/android/support/v4/view/ViewPropertyAnimatorCompatJellybeanMr2.java
similarity index 100%
rename from v4/jellybean-mr2/android/support/v4/view/ViewPropertyAnimatorCompatJellybeanMr2.java
rename to compat/jellybean-mr2/android/support/v4/view/ViewPropertyAnimatorCompatJellybeanMr2.java
diff --git a/v4/jellybean-mr2/android/support/v4/view/accessibility/AccessibilityNodeInfoCompatJellybeanMr2.java b/compat/jellybean-mr2/android/support/v4/view/accessibility/AccessibilityNodeInfoCompatJellybeanMr2.java
similarity index 100%
rename from v4/jellybean-mr2/android/support/v4/view/accessibility/AccessibilityNodeInfoCompatJellybeanMr2.java
rename to compat/jellybean-mr2/android/support/v4/view/accessibility/AccessibilityNodeInfoCompatJellybeanMr2.java
diff --git a/v4/jellybean-mr2/android/support/v4/widget/TextViewCompatJbMr2.java b/compat/jellybean-mr2/android/support/v4/widget/TextViewCompatJbMr2.java
similarity index 100%
rename from v4/jellybean-mr2/android/support/v4/widget/TextViewCompatJbMr2.java
rename to compat/jellybean-mr2/android/support/v4/widget/TextViewCompatJbMr2.java
diff --git a/v4/jellybean/android/support/v4/app/ActivityCompatJB.java b/compat/jellybean/android/support/v4/app/ActivityCompatJB.java
similarity index 100%
rename from v4/jellybean/android/support/v4/app/ActivityCompatJB.java
rename to compat/jellybean/android/support/v4/app/ActivityCompatJB.java
diff --git a/v4/jellybean/android/support/v4/app/ActivityOptionsCompatJB.java b/compat/jellybean/android/support/v4/app/ActivityOptionsCompatJB.java
similarity index 100%
rename from v4/jellybean/android/support/v4/app/ActivityOptionsCompatJB.java
rename to compat/jellybean/android/support/v4/app/ActivityOptionsCompatJB.java
diff --git a/v4/jellybean/android/support/v4/app/BundleUtil.java b/compat/jellybean/android/support/v4/app/BundleUtil.java
similarity index 100%
rename from v4/jellybean/android/support/v4/app/BundleUtil.java
rename to compat/jellybean/android/support/v4/app/BundleUtil.java
diff --git a/v4/jellybean/android/support/v4/app/NotificationBuilderWithActions.java b/compat/jellybean/android/support/v4/app/NotificationBuilderWithActions.java
similarity index 100%
rename from v4/jellybean/android/support/v4/app/NotificationBuilderWithActions.java
rename to compat/jellybean/android/support/v4/app/NotificationBuilderWithActions.java
diff --git a/v4/jellybean/android/support/v4/app/NotificationCompatJellybean.java b/compat/jellybean/android/support/v4/app/NotificationCompatJellybean.java
similarity index 100%
rename from v4/jellybean/android/support/v4/app/NotificationCompatJellybean.java
rename to compat/jellybean/android/support/v4/app/NotificationCompatJellybean.java
diff --git a/v4/jellybean/android/support/v4/app/RemoteInputCompatJellybean.java b/compat/jellybean/android/support/v4/app/RemoteInputCompatJellybean.java
similarity index 100%
rename from v4/jellybean/android/support/v4/app/RemoteInputCompatJellybean.java
rename to compat/jellybean/android/support/v4/app/RemoteInputCompatJellybean.java
diff --git a/v4/jellybean/android/support/v4/app/ShareCompatJB.java b/compat/jellybean/android/support/v4/app/ShareCompatJB.java
similarity index 100%
rename from v4/jellybean/android/support/v4/app/ShareCompatJB.java
rename to compat/jellybean/android/support/v4/app/ShareCompatJB.java
diff --git a/v4/jellybean/android/support/v4/content/ContentResolverCompatJellybean.java b/compat/jellybean/android/support/v4/content/ContentResolverCompatJellybean.java
similarity index 100%
rename from v4/jellybean/android/support/v4/content/ContentResolverCompatJellybean.java
rename to compat/jellybean/android/support/v4/content/ContentResolverCompatJellybean.java
diff --git a/v4/jellybean/android/support/v4/content/ContextCompatJellybean.java b/compat/jellybean/android/support/v4/content/ContextCompatJellybean.java
similarity index 100%
rename from v4/jellybean/android/support/v4/content/ContextCompatJellybean.java
rename to compat/jellybean/android/support/v4/content/ContextCompatJellybean.java
diff --git a/v4/jellybean/android/support/v4/net/ConnectivityManagerCompatJellyBean.java b/compat/jellybean/android/support/v4/net/ConnectivityManagerCompatJellyBean.java
similarity index 100%
rename from v4/jellybean/android/support/v4/net/ConnectivityManagerCompatJellyBean.java
rename to compat/jellybean/android/support/v4/net/ConnectivityManagerCompatJellyBean.java
diff --git a/v4/jellybean/android/support/v4/os/CancellationSignalCompatJellybean.java b/compat/jellybean/android/support/v4/os/CancellationSignalCompatJellybean.java
similarity index 100%
rename from v4/jellybean/android/support/v4/os/CancellationSignalCompatJellybean.java
rename to compat/jellybean/android/support/v4/os/CancellationSignalCompatJellybean.java
diff --git a/v4/jellybean/android/support/v4/view/AccessibilityDelegateCompatJellyBean.java b/compat/jellybean/android/support/v4/view/AccessibilityDelegateCompatJellyBean.java
similarity index 100%
rename from v4/jellybean/android/support/v4/view/AccessibilityDelegateCompatJellyBean.java
rename to compat/jellybean/android/support/v4/view/AccessibilityDelegateCompatJellyBean.java
diff --git a/v4/jellybean/android/support/v4/view/ViewCompatJB.java b/compat/jellybean/android/support/v4/view/ViewCompatJB.java
similarity index 100%
rename from v4/jellybean/android/support/v4/view/ViewCompatJB.java
rename to compat/jellybean/android/support/v4/view/ViewCompatJB.java
diff --git a/v4/jellybean/android/support/v4/view/ViewPropertyAnimatorCompatJB.java b/compat/jellybean/android/support/v4/view/ViewPropertyAnimatorCompatJB.java
similarity index 100%
rename from v4/jellybean/android/support/v4/view/ViewPropertyAnimatorCompatJB.java
rename to compat/jellybean/android/support/v4/view/ViewPropertyAnimatorCompatJB.java
diff --git a/v4/jellybean/android/support/v4/view/accessibility/AccessibilityNodeInfoCompatJellyBean.java b/compat/jellybean/android/support/v4/view/accessibility/AccessibilityNodeInfoCompatJellyBean.java
similarity index 100%
rename from v4/jellybean/android/support/v4/view/accessibility/AccessibilityNodeInfoCompatJellyBean.java
rename to compat/jellybean/android/support/v4/view/accessibility/AccessibilityNodeInfoCompatJellyBean.java
diff --git a/v4/jellybean/android/support/v4/view/accessibility/AccessibilityNodeProviderCompatJellyBean.java b/compat/jellybean/android/support/v4/view/accessibility/AccessibilityNodeProviderCompatJellyBean.java
similarity index 100%
rename from v4/jellybean/android/support/v4/view/accessibility/AccessibilityNodeProviderCompatJellyBean.java
rename to compat/jellybean/android/support/v4/view/accessibility/AccessibilityNodeProviderCompatJellyBean.java
diff --git a/v4/jellybean/android/support/v4/view/accessibility/AccessibilityRecordCompatJellyBean.java b/compat/jellybean/android/support/v4/view/accessibility/AccessibilityRecordCompatJellyBean.java
similarity index 100%
rename from v4/jellybean/android/support/v4/view/accessibility/AccessibilityRecordCompatJellyBean.java
rename to compat/jellybean/android/support/v4/view/accessibility/AccessibilityRecordCompatJellyBean.java
diff --git a/v4/jellybean/android/support/v4/widget/TextViewCompatJb.java b/compat/jellybean/android/support/v4/widget/TextViewCompatJb.java
similarity index 100%
rename from v4/jellybean/android/support/v4/widget/TextViewCompatJb.java
rename to compat/jellybean/android/support/v4/widget/TextViewCompatJb.java
diff --git a/v4/kitkat/android/support/v4/app/ActivityManagerCompatKitKat.java b/compat/kitkat/android/support/v4/app/ActivityManagerCompatKitKat.java
similarity index 100%
rename from v4/kitkat/android/support/v4/app/ActivityManagerCompatKitKat.java
rename to compat/kitkat/android/support/v4/app/ActivityManagerCompatKitKat.java
diff --git a/v4/kitkat/android/support/v4/app/NotificationCompatKitKat.java b/compat/kitkat/android/support/v4/app/NotificationCompatKitKat.java
similarity index 100%
rename from v4/kitkat/android/support/v4/app/NotificationCompatKitKat.java
rename to compat/kitkat/android/support/v4/app/NotificationCompatKitKat.java
diff --git a/v4/kitkat/android/support/v4/app/NotificationManagerCompatKitKat.java b/compat/kitkat/android/support/v4/app/NotificationManagerCompatKitKat.java
similarity index 100%
rename from v4/kitkat/android/support/v4/app/NotificationManagerCompatKitKat.java
rename to compat/kitkat/android/support/v4/app/NotificationManagerCompatKitKat.java
diff --git a/v4/kitkat/android/support/v4/content/ContextCompatKitKat.java b/compat/kitkat/android/support/v4/content/ContextCompatKitKat.java
similarity index 100%
rename from v4/kitkat/android/support/v4/content/ContextCompatKitKat.java
rename to compat/kitkat/android/support/v4/content/ContextCompatKitKat.java
diff --git a/v4/kitkat/android/support/v4/graphics/BitmapCompatKitKat.java b/compat/kitkat/android/support/v4/graphics/BitmapCompatKitKat.java
similarity index 100%
rename from v4/kitkat/android/support/v4/graphics/BitmapCompatKitKat.java
rename to compat/kitkat/android/support/v4/graphics/BitmapCompatKitKat.java
diff --git a/v4/kitkat/android/support/v4/graphics/drawable/DrawableCompatKitKat.java b/compat/kitkat/android/support/v4/graphics/drawable/DrawableCompatKitKat.java
similarity index 100%
rename from v4/kitkat/android/support/v4/graphics/drawable/DrawableCompatKitKat.java
rename to compat/kitkat/android/support/v4/graphics/drawable/DrawableCompatKitKat.java
diff --git a/v4/kitkat/android/support/v4/graphics/drawable/DrawableWrapperKitKat.java b/compat/kitkat/android/support/v4/graphics/drawable/DrawableWrapperKitKat.java
similarity index 100%
rename from v4/kitkat/android/support/v4/graphics/drawable/DrawableWrapperKitKat.java
rename to compat/kitkat/android/support/v4/graphics/drawable/DrawableWrapperKitKat.java
diff --git a/v4/kitkat/android/support/v4/os/EnvironmentCompatKitKat.java b/compat/kitkat/android/support/v4/os/EnvironmentCompatKitKat.java
similarity index 100%
rename from v4/kitkat/android/support/v4/os/EnvironmentCompatKitKat.java
rename to compat/kitkat/android/support/v4/os/EnvironmentCompatKitKat.java
diff --git a/v4/kitkat/android/support/v4/view/ScaleGestureDetectorCompatKitKat.java b/compat/kitkat/android/support/v4/view/ScaleGestureDetectorCompatKitKat.java
similarity index 100%
rename from v4/kitkat/android/support/v4/view/ScaleGestureDetectorCompatKitKat.java
rename to compat/kitkat/android/support/v4/view/ScaleGestureDetectorCompatKitKat.java
diff --git a/v4/kitkat/android/support/v4/view/ViewCompatKitKat.java b/compat/kitkat/android/support/v4/view/ViewCompatKitKat.java
similarity index 100%
rename from v4/kitkat/android/support/v4/view/ViewCompatKitKat.java
rename to compat/kitkat/android/support/v4/view/ViewCompatKitKat.java
diff --git a/v4/kitkat/android/support/v4/view/ViewParentCompatKitKat.java b/compat/kitkat/android/support/v4/view/ViewParentCompatKitKat.java
similarity index 100%
rename from v4/kitkat/android/support/v4/view/ViewParentCompatKitKat.java
rename to compat/kitkat/android/support/v4/view/ViewParentCompatKitKat.java
diff --git a/v4/kitkat/android/support/v4/view/ViewPropertyAnimatorCompatKK.java b/compat/kitkat/android/support/v4/view/ViewPropertyAnimatorCompatKK.java
similarity index 100%
rename from v4/kitkat/android/support/v4/view/ViewPropertyAnimatorCompatKK.java
rename to compat/kitkat/android/support/v4/view/ViewPropertyAnimatorCompatKK.java
diff --git a/v4/kitkat/android/support/v4/view/accessibility/AccessibilityEventCompatKitKat.java b/compat/kitkat/android/support/v4/view/accessibility/AccessibilityEventCompatKitKat.java
similarity index 100%
rename from v4/kitkat/android/support/v4/view/accessibility/AccessibilityEventCompatKitKat.java
rename to compat/kitkat/android/support/v4/view/accessibility/AccessibilityEventCompatKitKat.java
diff --git a/compat/kitkat/android/support/v4/view/accessibility/AccessibilityNodeInfoCompatKitKat.java b/compat/kitkat/android/support/v4/view/accessibility/AccessibilityNodeInfoCompatKitKat.java
new file mode 100644
index 0000000..1efc7e9
--- /dev/null
+++ b/compat/kitkat/android/support/v4/view/accessibility/AccessibilityNodeInfoCompatKitKat.java
@@ -0,0 +1,203 @@
+/*
+ * Copyright (C) 2012 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 android.support.v4.view.accessibility;
+
+import android.os.Bundle;
+import android.view.accessibility.AccessibilityNodeInfo;
+
+/**
+ * KitKat-specific AccessibilityNodeInfo API implementation.
+ */
+class AccessibilityNodeInfoCompatKitKat {
+    private static final byte TRAIT_UNSET = -1;
+    private static final String TRAITS_KEY =
+            "android.view.accessibility.AccessibilityNodeInfo.traits";
+    private static final long TRAIT_HAS_IMAGE = 0x00000001;
+    private static final String ROLE_DESCRIPTION_KEY =
+            "AccessibilityNodeInfo.roleDescription";
+
+    static int getLiveRegion(Object info) {
+        return ((AccessibilityNodeInfo) info).getLiveRegion();
+    }
+
+    static void setLiveRegion(Object info, int mode) {
+        ((AccessibilityNodeInfo) info).setLiveRegion(mode);
+    }
+
+    static Object getCollectionInfo(Object info) {
+        return ((AccessibilityNodeInfo) info).getCollectionInfo();
+    }
+
+    static Object getCollectionItemInfo(Object info) {
+        return ((AccessibilityNodeInfo) info).getCollectionItemInfo();
+    }
+
+    public static void setCollectionInfo(Object info, Object collectionInfo) {
+        ((AccessibilityNodeInfo) info).setCollectionInfo(
+                (AccessibilityNodeInfo.CollectionInfo)collectionInfo);
+    }
+
+    public static void setCollectionItemInfo(Object info, Object collectionItemInfo) {
+        ((AccessibilityNodeInfo) info).setCollectionItemInfo(
+                (AccessibilityNodeInfo.CollectionItemInfo) collectionItemInfo);
+    }
+
+    static Object getRangeInfo(Object info) {
+        return ((AccessibilityNodeInfo) info).getRangeInfo();
+    }
+
+    public static void setRangeInfo(Object info, Object rangeInfo) {
+        ((AccessibilityNodeInfo) info).setRangeInfo((AccessibilityNodeInfo.RangeInfo) rangeInfo);
+    }
+
+    public static Object obtainCollectionInfo(int rowCount, int columnCount,
+            boolean hierarchical, int selectionMode) {
+        return AccessibilityNodeInfo.CollectionInfo.obtain(rowCount, columnCount, hierarchical);
+    }
+
+    public static Object obtainCollectionInfo(int rowCount, int columnCount, boolean hierarchical) {
+        return AccessibilityNodeInfo.CollectionInfo.obtain(rowCount, columnCount, hierarchical);
+    }
+
+    public static Object obtainCollectionItemInfo(int rowIndex, int rowSpan, int columnIndex,
+            int columnSpan, boolean heading) {
+        return AccessibilityNodeInfo.CollectionItemInfo.obtain(rowIndex, rowSpan, columnIndex,
+                columnSpan, heading);
+    }
+
+    public static void setContentInvalid(Object info, boolean contentInvalid) {
+        ((AccessibilityNodeInfo) info).setContentInvalid(contentInvalid);
+    }
+
+    public static boolean isContentInvalid(Object info) {
+        return ((AccessibilityNodeInfo) info).isContentInvalid();
+    }
+
+    public static boolean canOpenPopup(Object info) {
+        return ((AccessibilityNodeInfo) info).canOpenPopup();
+    }
+
+    public static void setCanOpenPopup(Object info, boolean opensPopup) {
+        ((AccessibilityNodeInfo) info).setCanOpenPopup(opensPopup);
+    }
+
+    public static Bundle getExtras(Object info) {
+        return ((AccessibilityNodeInfo) info).getExtras();
+    }
+
+    private static long getTraits(Object info) {
+        return getExtras(info).getLong(TRAITS_KEY, TRAIT_UNSET);
+    }
+
+    private static void setTrait(Object info, long trait) {
+        Bundle extras = getExtras(info);
+        long traits = extras.getLong(TRAITS_KEY, 0);
+        extras.putLong(TRAITS_KEY, traits | trait);
+    }
+
+    public static int getInputType(Object info) {
+        return ((AccessibilityNodeInfo) info).getInputType();
+    }
+
+    public static void setInputType(Object info, int inputType) {
+        ((AccessibilityNodeInfo) info).setInputType(inputType);
+    }
+
+    public static boolean isDismissable(Object info) {
+        return ((AccessibilityNodeInfo) info).isDismissable();
+    }
+
+    public static void setDismissable(Object info, boolean dismissable) {
+        ((AccessibilityNodeInfo) info).setDismissable(dismissable);
+    }
+
+    public static boolean isMultiLine(Object info) {
+        return ((AccessibilityNodeInfo) info).isMultiLine();
+    }
+
+    public static void setMultiLine(Object info, boolean multiLine) {
+        ((AccessibilityNodeInfo) info).setMultiLine(multiLine);
+    }
+
+    public static CharSequence getRoleDescription(Object info) {
+        Bundle extras = getExtras(info);
+        return extras.getCharSequence(ROLE_DESCRIPTION_KEY);
+    }
+
+    public static void setRoleDescription(Object info, CharSequence roleDescription) {
+        Bundle extras = getExtras(info);
+        extras.putCharSequence(ROLE_DESCRIPTION_KEY, roleDescription);
+    }
+
+    public static Object obtainRangeInfo(int type, float min, float max, float current) {
+        return AccessibilityNodeInfo.RangeInfo.obtain(type, min, max, current);
+    }
+
+    static class CollectionInfo {
+        static int getColumnCount(Object info) {
+            return ((AccessibilityNodeInfo.CollectionInfo) info).getColumnCount();
+        }
+
+        static int getRowCount(Object info) {
+            return ((AccessibilityNodeInfo.CollectionInfo) info).getRowCount();
+        }
+
+        static boolean isHierarchical(Object info) {
+            return ((AccessibilityNodeInfo.CollectionInfo) info).isHierarchical();
+        }
+    }
+
+    static class CollectionItemInfo {
+        static int getColumnIndex(Object info) {
+            return ((AccessibilityNodeInfo.CollectionItemInfo) info).getColumnIndex();
+        }
+
+        static int getColumnSpan(Object info) {
+            return ((AccessibilityNodeInfo.CollectionItemInfo) info).getColumnSpan();
+        }
+
+        static int getRowIndex(Object info) {
+            return ((AccessibilityNodeInfo.CollectionItemInfo) info).getRowIndex();
+        }
+
+        static int getRowSpan(Object info) {
+            return ((AccessibilityNodeInfo.CollectionItemInfo) info).getRowSpan();
+        }
+
+        static boolean isHeading(Object info) {
+            return ((AccessibilityNodeInfo.CollectionItemInfo) info).isHeading();
+        }
+    }
+
+    static class RangeInfo {
+        static float getCurrent(Object info) {
+            return ((AccessibilityNodeInfo.RangeInfo) info).getCurrent();
+        }
+
+        static float getMax(Object info) {
+            return ((AccessibilityNodeInfo.RangeInfo) info).getMax();
+        }
+
+        static float getMin(Object info) {
+            return ((AccessibilityNodeInfo.RangeInfo) info).getMin();
+        }
+
+        static int getType(Object info) {
+            return ((AccessibilityNodeInfo.RangeInfo) info).getType();
+        }
+    }
+}
diff --git a/v4/kitkat/android/support/v4/view/accessibility/AccessibilityNodeProviderCompatKitKat.java b/compat/kitkat/android/support/v4/view/accessibility/AccessibilityNodeProviderCompatKitKat.java
similarity index 100%
rename from v4/kitkat/android/support/v4/view/accessibility/AccessibilityNodeProviderCompatKitKat.java
rename to compat/kitkat/android/support/v4/view/accessibility/AccessibilityNodeProviderCompatKitKat.java
diff --git a/v4/kitkat/android/support/v4/widget/ListPopupWindowCompatKitKat.java b/compat/kitkat/android/support/v4/widget/ListPopupWindowCompatKitKat.java
similarity index 100%
rename from v4/kitkat/android/support/v4/widget/ListPopupWindowCompatKitKat.java
rename to compat/kitkat/android/support/v4/widget/ListPopupWindowCompatKitKat.java
diff --git a/v4/kitkat/android/support/v4/widget/ListViewCompatKitKat.java b/compat/kitkat/android/support/v4/widget/ListViewCompatKitKat.java
similarity index 100%
rename from v4/kitkat/android/support/v4/widget/ListViewCompatKitKat.java
rename to compat/kitkat/android/support/v4/widget/ListViewCompatKitKat.java
diff --git a/v4/kitkat/android/support/v4/widget/PopupMenuCompatKitKat.java b/compat/kitkat/android/support/v4/widget/PopupMenuCompatKitKat.java
similarity index 100%
rename from v4/kitkat/android/support/v4/widget/PopupMenuCompatKitKat.java
rename to compat/kitkat/android/support/v4/widget/PopupMenuCompatKitKat.java
diff --git a/v4/kitkat/android/support/v4/widget/PopupWindowCompatKitKat.java b/compat/kitkat/android/support/v4/widget/PopupWindowCompatKitKat.java
similarity index 100%
rename from v4/kitkat/android/support/v4/widget/PopupWindowCompatKitKat.java
rename to compat/kitkat/android/support/v4/widget/PopupWindowCompatKitKat.java
diff --git a/compat/tests/AndroidManifest.xml b/compat/tests/AndroidManifest.xml
new file mode 100644
index 0000000..e0acc6c
--- /dev/null
+++ b/compat/tests/AndroidManifest.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2015 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+          xmlns:tools="http://schemas.android.com/tools"
+          package="android.support.compat.test">
+    <uses-sdk
+            android:minSdkVersion="9"
+            android:targetSdkVersion="23"
+            tools:overrideLibrary="android.support.test, android.app, android.support.test.rule,
+                      android.support.test.espresso, android.support.test.espresso.idling"/>
+
+    <uses-permission android:name="android.permission.VIBRATE"/>
+    <uses-permission android:name="android.permission.WAKE_LOCK"/>
+    <uses-permission android:name="android.permission.READ_CONTACTS"/>
+    <uses-permission android:name="android.permission.WRITE_CONTACTS"/>
+
+    <application
+            android:supportsRtl="true"
+            android:theme="@style/TestActivityTheme">
+        <uses-library android:name="android.test.runner" />
+        <activity android:name="android.support.v4.widget.TextViewTestActivity"/>
+
+        <activity android:name="android.support.v4.view.VpaActivity"/>
+
+        <activity
+            android:name="android.support.v4.ThemedYellowActivity"
+            android:theme="@style/YellowTheme" />
+    </application>
+
+    <instrumentation android:name="android.test.InstrumentationTestRunner"
+                     android:targetPackage="android.support.v4.test"
+                     />
+</manifest>
diff --git a/v17/tests/NO_DOCS b/compat/tests/NO_DOCS
similarity index 100%
copy from v17/tests/NO_DOCS
copy to compat/tests/NO_DOCS
diff --git a/v4/tests/java/android/support/v4/BaseInstrumentationTestCase.java b/compat/tests/java/android/support/v4/BaseInstrumentationTestCase.java
similarity index 100%
rename from v4/tests/java/android/support/v4/BaseInstrumentationTestCase.java
rename to compat/tests/java/android/support/v4/BaseInstrumentationTestCase.java
diff --git a/v4/tests/java/android/support/v4/BaseTestActivity.java b/compat/tests/java/android/support/v4/BaseTestActivity.java
similarity index 100%
rename from v4/tests/java/android/support/v4/BaseTestActivity.java
rename to compat/tests/java/android/support/v4/BaseTestActivity.java
diff --git a/v4/tests/java/android/support/v4/ThemedYellowActivity.java b/compat/tests/java/android/support/v4/ThemedYellowActivity.java
similarity index 100%
rename from v4/tests/java/android/support/v4/ThemedYellowActivity.java
rename to compat/tests/java/android/support/v4/ThemedYellowActivity.java
diff --git a/compat/tests/java/android/support/v4/content/ContextCompatTest.java b/compat/tests/java/android/support/v4/content/ContextCompatTest.java
new file mode 100644
index 0000000..5047ae3
--- /dev/null
+++ b/compat/tests/java/android/support/v4/content/ContextCompatTest.java
@@ -0,0 +1,181 @@
+/*
+ * Copyright (C) 2015 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 android.support.v4.content;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.content.res.ColorStateList;
+import android.graphics.drawable.Drawable;
+import android.os.Build;
+import android.support.compat.test.R;
+import android.support.v4.BaseInstrumentationTestCase;
+import android.support.v4.ThemedYellowActivity;
+import android.support.v4.testutils.TestUtils;
+import android.test.suitebuilder.annotation.SmallTest;
+import android.util.DisplayMetrics;
+
+import static org.junit.Assert.assertEquals;
+
+@SmallTest
+public class ContextCompatTest extends BaseInstrumentationTestCase<ThemedYellowActivity> {
+    private Context mContext;
+
+    public ContextCompatTest() {
+        super(ThemedYellowActivity.class);
+    }
+
+    @Before
+    public void setup() {
+        mContext = mActivityTestRule.getActivity();
+    }
+
+    @Test
+    public void testGetColor() throws Throwable {
+        assertEquals("Unthemed color load", 0xFFFF8090,
+                ContextCompat.getColor(mContext, R.color.text_color));
+
+        if (Build.VERSION.SDK_INT >= 23) {
+            // The following test is only expected to pass on v23+ devices. The result of
+            // calling theme-aware getColor() in pre-v23 is undefined.
+            assertEquals("Themed yellow color load",
+                    ContextCompat.getColor(mContext, R.color.simple_themed_selector),
+                    0xFFF0B000);
+        }
+    }
+
+    @Test
+    public void testGetColorStateList() throws Throwable {
+        ColorStateList unthemedColorStateList =
+                ContextCompat.getColorStateList(mContext, R.color.complex_unthemed_selector);
+        assertEquals("Unthemed color state list load: default", 0xFF70A0C0,
+                unthemedColorStateList.getDefaultColor());
+        assertEquals("Unthemed color state list load: focused", 0xFF70B0F0,
+                unthemedColorStateList.getColorForState(
+                        new int[]{android.R.attr.state_focused}, 0));
+        assertEquals("Unthemed color state list load: pressed", 0xFF6080B0,
+                unthemedColorStateList.getColorForState(
+                        new int[]{android.R.attr.state_pressed}, 0));
+
+        if (Build.VERSION.SDK_INT >= 23) {
+            // The following tests are only expected to pass on v23+ devices. The result of
+            // calling theme-aware getColorStateList() in pre-v23 is undefined.
+            ColorStateList themedYellowColorStateList =
+                    ContextCompat.getColorStateList(mContext, R.color.complex_themed_selector);
+            assertEquals("Themed yellow color state list load: default", 0xFFF0B000,
+                    themedYellowColorStateList.getDefaultColor());
+            assertEquals("Themed yellow color state list load: focused", 0xFFF0A020,
+                    themedYellowColorStateList.getColorForState(
+                            new int[]{android.R.attr.state_focused}, 0));
+            assertEquals("Themed yellow color state list load: pressed", 0xFFE0A040,
+                    themedYellowColorStateList.getColorForState(
+                            new int[]{android.R.attr.state_pressed}, 0));
+        }
+    }
+
+    @Test
+    public void testGetDrawable() throws Throwable {
+        Drawable unthemedDrawable =
+                ContextCompat.getDrawable(mContext, R.drawable.test_drawable_red);
+        TestUtils.assertAllPixelsOfColor("Unthemed drawable load",
+                unthemedDrawable, mContext.getResources().getColor(R.color.test_red));
+
+        if (Build.VERSION.SDK_INT >= 23) {
+            // The following test is only expected to pass on v23+ devices. The result of
+            // calling theme-aware getDrawable() in pre-v23 is undefined.
+            Drawable themedYellowDrawable =
+                    ContextCompat.getDrawable(mContext, R.drawable.themed_drawable);
+            TestUtils.assertAllPixelsOfColor("Themed yellow drawable load",
+                    themedYellowDrawable, 0xFFF0B000);
+        }
+    }
+
+    @Test
+    public void testDrawableConfigurationWorkaround() throws Throwable {
+        final int expectedWidth = scaleFromDensity(7, DisplayMetrics.DENSITY_LOW,
+                mContext.getResources().getDisplayMetrics().densityDpi);
+
+        // Ensure we retrieve the correct drawable configuration. Specifically,
+        // this tests a workaround for a bug in drawable configuration that
+        // exists on API < 16 for references to drawables.
+        Drawable referencedDrawable = ContextCompat.getDrawable(mContext,
+                R.drawable.aliased_drawable);
+        assertEquals("Drawable configuration does not match DisplayMetrics",
+                expectedWidth, referencedDrawable.getIntrinsicWidth());
+    }
+
+    private static int scaleFromDensity(int size, int sdensity, int tdensity) {
+        if (sdensity == tdensity) {
+            return size;
+        }
+
+        // Scale by tdensity / sdensity, rounding up.
+        return ((size * tdensity) + (sdensity >> 1)) / sdensity;
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testCheckSelfPermissionNull() {
+        ContextCompat.checkSelfPermission(mContext, null);
+    }
+
+    @Test
+    public void testCheckSelfPermission() {
+        assertEquals("Vibrate permission granted", PackageManager.PERMISSION_GRANTED,
+                ContextCompat.checkSelfPermission(mContext,
+                        android.Manifest.permission.VIBRATE));
+        assertEquals("Wake lock permission granted", PackageManager.PERMISSION_GRANTED,
+                ContextCompat.checkSelfPermission(mContext,
+                        android.Manifest.permission.WAKE_LOCK));
+
+        if (Build.VERSION.SDK_INT >= 23) {
+            // As documented in http://developer.android.com/training/permissions/requesting.html
+            // starting in Android M (v23) dangerous permissions are not granted automactically
+            // to apps targeting SDK 23 even if those are defined in the manifest.
+            // This is why the following permissions are expected to be denied.
+            assertEquals("Read contacts permission granted", PackageManager.PERMISSION_DENIED,
+                    ContextCompat.checkSelfPermission(mContext,
+                            android.Manifest.permission.READ_CONTACTS));
+            assertEquals("Write contacts permission granted", PackageManager.PERMISSION_DENIED,
+                    ContextCompat.checkSelfPermission(mContext,
+                            android.Manifest.permission.WRITE_CONTACTS));
+        } else {
+            // And on older devices declared dangerous permissions are expected to be granted.
+            assertEquals("Read contacts permission denied", PackageManager.PERMISSION_GRANTED,
+                    ContextCompat.checkSelfPermission(mContext,
+                            android.Manifest.permission.READ_CONTACTS));
+            assertEquals("Write contacts permission denied", PackageManager.PERMISSION_GRANTED,
+                    ContextCompat.checkSelfPermission(mContext,
+                            android.Manifest.permission.WRITE_CONTACTS));
+        }
+
+        // The following permissions (normal and dangerous) are expected to be denied as they are
+        // not declared in our manifest.
+        assertEquals("Access network state permission denied", PackageManager.PERMISSION_DENIED,
+                ContextCompat.checkSelfPermission(mContext,
+                        android.Manifest.permission.ACCESS_NETWORK_STATE));
+        assertEquals("Bluetooth permission denied", PackageManager.PERMISSION_DENIED,
+                ContextCompat.checkSelfPermission(mContext,
+                        android.Manifest.permission.BLUETOOTH));
+        assertEquals("Call phone permission denied", PackageManager.PERMISSION_DENIED,
+                ContextCompat.checkSelfPermission(mContext,
+                        android.Manifest.permission.CALL_PHONE));
+        assertEquals("Delete packages permission denied", PackageManager.PERMISSION_DENIED,
+                ContextCompat.checkSelfPermission(mContext,
+                        android.Manifest.permission.DELETE_PACKAGES));
+    }
+}
\ No newline at end of file
diff --git a/compat/tests/java/android/support/v4/content/res/ResourcesCompatTest.java b/compat/tests/java/android/support/v4/content/res/ResourcesCompatTest.java
new file mode 100644
index 0000000..716796e
--- /dev/null
+++ b/compat/tests/java/android/support/v4/content/res/ResourcesCompatTest.java
@@ -0,0 +1,280 @@
+/*
+ * Copyright (C) 2015 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 android.support.v4.content.res;
+
+import android.content.res.ColorStateList;
+import android.content.res.Resources;
+import android.graphics.drawable.Drawable;
+import android.os.Build;
+import android.support.compat.test.R;
+import android.support.test.InstrumentationRegistry;
+import android.support.v4.testutils.TestUtils;
+import android.test.suitebuilder.annotation.SmallTest;
+import android.util.DisplayMetrics;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+@SmallTest
+public class ResourcesCompatTest {
+    private Resources mResources;
+
+    @Before
+    public void setup() {
+        mResources = InstrumentationRegistry.getContext().getResources();
+    }
+
+    @Test
+    public void testGetColor() throws Throwable {
+        assertEquals("Unthemed color load",
+                ResourcesCompat.getColor(mResources, R.color.text_color, null),
+                0xFFFF8090);
+
+        if (Build.VERSION.SDK_INT >= 23) {
+            // The following tests are only expected to pass on v23+ devices. The result of
+            // calling theme-aware getColor() in pre-v23 is undefined.
+            final Resources.Theme yellowTheme = mResources.newTheme();
+            yellowTheme.applyStyle(R.style.YellowTheme, true);
+            assertEquals("Themed yellow color load", 0xFFF0B000,
+                    ResourcesCompat.getColor(mResources, R.color.simple_themed_selector,
+                            yellowTheme));
+
+            final Resources.Theme lilacTheme = mResources.newTheme();
+            lilacTheme.applyStyle(R.style.LilacTheme, true);
+            assertEquals("Themed lilac color load", 0xFFF080F0,
+                    ResourcesCompat.getColor(mResources, R.color.simple_themed_selector,
+                            lilacTheme));
+        }
+    }
+
+    @Test
+    public void testGetColorStateList() throws Throwable {
+        final ColorStateList unthemedColorStateList =
+                ResourcesCompat.getColorStateList(mResources, R.color.complex_unthemed_selector,
+                        null);
+        assertEquals("Unthemed color state list load: default", 0xFF70A0C0,
+                unthemedColorStateList.getDefaultColor());
+        assertEquals("Unthemed color state list load: focused", 0xFF70B0F0,
+                unthemedColorStateList.getColorForState(
+                        new int[]{android.R.attr.state_focused}, 0));
+        assertEquals("Unthemed color state list load: pressed", 0xFF6080B0,
+                unthemedColorStateList.getColorForState(
+                        new int[]{android.R.attr.state_pressed}, 0));
+
+        if (Build.VERSION.SDK_INT >= 23) {
+            // The following tests are only expected to pass on v23+ devices. The result of
+            // calling theme-aware getColorStateList() in pre-v23 is undefined.
+            final Resources.Theme yellowTheme = mResources.newTheme();
+            yellowTheme.applyStyle(R.style.YellowTheme, true);
+            final ColorStateList themedYellowColorStateList =
+                    ResourcesCompat.getColorStateList(mResources, R.color.complex_themed_selector,
+                            yellowTheme);
+            assertEquals("Themed yellow color state list load: default", 0xFFF0B000,
+                    themedYellowColorStateList.getDefaultColor());
+            assertEquals("Themed yellow color state list load: focused", 0xFFF0A020,
+                    themedYellowColorStateList.getColorForState(
+                            new int[]{android.R.attr.state_focused}, 0));
+            assertEquals("Themed yellow color state list load: pressed", 0xFFE0A040,
+                    themedYellowColorStateList.getColorForState(
+                            new int[]{android.R.attr.state_pressed}, 0));
+
+            final Resources.Theme lilacTheme = mResources.newTheme();
+            lilacTheme.applyStyle(R.style.LilacTheme, true);
+            final ColorStateList themedLilacColorStateList =
+                    ResourcesCompat.getColorStateList(mResources, R.color.complex_themed_selector,
+                            lilacTheme);
+            assertEquals("Themed lilac color state list load: default", 0xFFF080F0,
+                    themedLilacColorStateList.getDefaultColor());
+            assertEquals("Themed lilac color state list load: focused", 0xFFF070D0,
+                    themedLilacColorStateList.getColorForState(
+                            new int[]{android.R.attr.state_focused}, 0));
+            assertEquals("Themed lilac color state list load: pressed", 0xFFE070A0,
+                    themedLilacColorStateList.getColorForState(
+                            new int[]{android.R.attr.state_pressed}, 0));
+        }
+    }
+
+    @Test
+    public void testGetDrawable() throws Throwable {
+        final Drawable unthemedDrawable =
+                ResourcesCompat.getDrawable(mResources, R.drawable.test_drawable_red, null);
+        TestUtils.assertAllPixelsOfColor("Unthemed drawable load",
+                unthemedDrawable, mResources.getColor(R.color.test_red));
+
+        if (Build.VERSION.SDK_INT >= 23) {
+            // The following tests are only expected to pass on v23+ devices. The result of
+            // calling theme-aware getDrawable() in pre-v23 is undefined.
+            final Resources.Theme yellowTheme = mResources.newTheme();
+            yellowTheme.applyStyle(R.style.YellowTheme, true);
+            final Drawable themedYellowDrawable =
+                    ResourcesCompat.getDrawable(mResources, R.drawable.themed_drawable,
+                            yellowTheme);
+            TestUtils.assertAllPixelsOfColor("Themed yellow drawable load",
+                    themedYellowDrawable, 0xFFF0B000);
+
+            final Resources.Theme lilacTheme = mResources.newTheme();
+            lilacTheme.applyStyle(R.style.LilacTheme, true);
+            final Drawable themedLilacDrawable =
+                    ResourcesCompat.getDrawable(mResources, R.drawable.themed_drawable, lilacTheme);
+            TestUtils.assertAllPixelsOfColor("Themed lilac drawable load",
+                    themedLilacDrawable, 0xFFF080F0);
+        }
+    }
+
+    @Test
+    public void testGetDrawableForDensityUnthemed() throws Throwable {
+        // Density-aware drawable loading for now only works on raw bitmap drawables.
+
+        // Different variants of density_aware_drawable are set up in the following way:
+        //    mdpi - 12x12 px which is 12x12 dip
+        //    hdpi - 21x21 px which is 14x14 dip
+        //   xhdpi - 32x32 px which is 16x16 dip
+        //  xxhdpi - 54x54 px which is 18x18 dip
+        // The tests below (on v15+ devices) are checking that an unthemed density-aware
+        // loading of raw bitmap drawables returns a drawable with matching intrinsic
+        // dimensions.
+
+        final Drawable unthemedDrawableForMediumDensity =
+                ResourcesCompat.getDrawableForDensity(mResources, R.drawable.density_aware_drawable,
+                        DisplayMetrics.DENSITY_MEDIUM, null);
+        // For pre-v15 devices we should get a drawable that corresponds to the density of the
+        // current device. For v15+ devices we should get a drawable that corresponds to the
+        // density requested in the API call.
+        final int expectedSizeForMediumDensity = (Build.VERSION.SDK_INT < 15) ?
+                mResources.getDimensionPixelSize(R.dimen.density_aware_size) : 12;
+        assertEquals("Unthemed density-aware drawable load: medium width",
+                expectedSizeForMediumDensity, unthemedDrawableForMediumDensity.getIntrinsicWidth());
+        assertEquals("Unthemed density-aware drawable load: medium height",
+                expectedSizeForMediumDensity,
+                unthemedDrawableForMediumDensity.getIntrinsicHeight());
+
+        final Drawable unthemedDrawableForHighDensity =
+                ResourcesCompat.getDrawableForDensity(mResources, R.drawable.density_aware_drawable,
+                        DisplayMetrics.DENSITY_HIGH, null);
+        // For pre-v15 devices we should get a drawable that corresponds to the density of the
+        // current device. For v15+ devices we should get a drawable that corresponds to the
+        // density requested in the API call.
+        final int expectedSizeForHighDensity = (Build.VERSION.SDK_INT < 15) ?
+                mResources.getDimensionPixelSize(R.dimen.density_aware_size) : 21;
+        assertEquals("Unthemed density-aware drawable load: high width",
+                expectedSizeForHighDensity, unthemedDrawableForHighDensity.getIntrinsicWidth());
+        assertEquals("Unthemed density-aware drawable load: high height",
+                expectedSizeForHighDensity, unthemedDrawableForHighDensity.getIntrinsicHeight());
+
+        final Drawable unthemedDrawableForXHighDensity =
+                ResourcesCompat.getDrawableForDensity(mResources, R.drawable.density_aware_drawable,
+                        DisplayMetrics.DENSITY_XHIGH, null);
+        // For pre-v15 devices we should get a drawable that corresponds to the density of the
+        // current device. For v15+ devices we should get a drawable that corresponds to the
+        // density requested in the API call.
+        final int expectedSizeForXHighDensity = (Build.VERSION.SDK_INT < 15) ?
+                mResources.getDimensionPixelSize(R.dimen.density_aware_size) : 32;
+        assertEquals("Unthemed density-aware drawable load: xhigh width",
+                expectedSizeForXHighDensity, unthemedDrawableForXHighDensity.getIntrinsicWidth());
+        assertEquals("Unthemed density-aware drawable load: xhigh height",
+                expectedSizeForXHighDensity, unthemedDrawableForXHighDensity.getIntrinsicHeight());
+
+        final Drawable unthemedDrawableForXXHighDensity =
+                ResourcesCompat.getDrawableForDensity(mResources, R.drawable.density_aware_drawable,
+                        DisplayMetrics.DENSITY_XXHIGH, null);
+        // For pre-v15 devices we should get a drawable that corresponds to the density of the
+        // current device. For v15+ devices we should get a drawable that corresponds to the
+        // density requested in the API call.
+        final int expectedSizeForXXHighDensity = (Build.VERSION.SDK_INT < 15) ?
+                mResources.getDimensionPixelSize(R.dimen.density_aware_size) : 54;
+        assertEquals("Unthemed density-aware drawable load: xxhigh width",
+                expectedSizeForXXHighDensity, unthemedDrawableForXXHighDensity.getIntrinsicWidth());
+        assertEquals("Unthemed density-aware drawable load: xxhigh height",
+                expectedSizeForXXHighDensity,
+                unthemedDrawableForXXHighDensity.getIntrinsicHeight());
+    }
+
+    @Test
+    public void testGetDrawableForDensityThemed() throws Throwable {
+        if (Build.VERSION.SDK_INT < 21) {
+            // The following tests are only expected to pass on v21+ devices. The result of
+            // calling theme-aware getDrawableForDensity() in pre-v21 is undefined.
+            return;
+        }
+
+        // Density- and theme-aware drawable loading for now only works partially. This test
+        // checks only for theming of a tinted bitmap XML drawable, but not correct scaling.
+
+        // Set up the two test themes, yellow and lilac.
+        final Resources.Theme yellowTheme = mResources.newTheme();
+        yellowTheme.applyStyle(R.style.YellowTheme, true);
+
+        final Resources.Theme lilacTheme = mResources.newTheme();
+        lilacTheme.applyStyle(R.style.LilacTheme, true);
+
+        Drawable themedYellowDrawableForMediumDensity =
+                ResourcesCompat.getDrawableForDensity(mResources, R.drawable.themed_bitmap,
+                        DisplayMetrics.DENSITY_MEDIUM, yellowTheme);
+        // We should get a drawable that corresponds to the theme requested in the API call.
+        TestUtils.assertAllPixelsOfColor("Themed yellow density-aware drawable load : medium color",
+                themedYellowDrawableForMediumDensity, 0xFFF0B000);
+
+        Drawable themedLilacDrawableForMediumDensity =
+                ResourcesCompat.getDrawableForDensity(mResources, R.drawable.themed_bitmap,
+                        DisplayMetrics.DENSITY_MEDIUM, lilacTheme);
+        // We should get a drawable that corresponds to the theme requested in the API call.
+        TestUtils.assertAllPixelsOfColor("Themed lilac density-aware drawable load : medium color",
+                themedLilacDrawableForMediumDensity, 0xFFF080F0);
+
+        Drawable themedYellowDrawableForHighDensity =
+                ResourcesCompat.getDrawableForDensity(mResources, R.drawable.themed_bitmap,
+                        DisplayMetrics.DENSITY_HIGH, yellowTheme);
+        // We should get a drawable that corresponds to the theme requested in the API call.
+        TestUtils.assertAllPixelsOfColor("Themed yellow density-aware drawable load : high color",
+                themedYellowDrawableForHighDensity, 0xFFF0B000);
+
+        Drawable themedLilacDrawableForHighDensity =
+                ResourcesCompat.getDrawableForDensity(mResources, R.drawable.themed_bitmap,
+                        DisplayMetrics.DENSITY_HIGH, lilacTheme);
+        // We should get a drawable that corresponds to the theme requested in the API call.
+        TestUtils.assertAllPixelsOfColor("Themed lilac density-aware drawable load : high color",
+                themedLilacDrawableForHighDensity, 0xFFF080F0);
+
+        Drawable themedYellowDrawableForXHighDensity =
+                ResourcesCompat.getDrawableForDensity(mResources, R.drawable.themed_bitmap,
+                        DisplayMetrics.DENSITY_XHIGH, yellowTheme);
+        // We should get a drawable that corresponds to the theme requested in the API call.
+        TestUtils.assertAllPixelsOfColor("Themed yellow density-aware drawable load : xhigh color",
+                themedYellowDrawableForXHighDensity, 0xFFF0B000);
+
+        Drawable themedLilacDrawableForXHighDensity =
+                ResourcesCompat.getDrawableForDensity(mResources, R.drawable.themed_bitmap,
+                        DisplayMetrics.DENSITY_XHIGH, lilacTheme);
+        // We should get a drawable that corresponds to the theme requested in the API call.
+        TestUtils.assertAllPixelsOfColor("Themed lilac density-aware drawable load : xhigh color",
+                themedLilacDrawableForXHighDensity, 0xFFF080F0);
+
+        Drawable themedYellowDrawableForXXHighDensity =
+                ResourcesCompat.getDrawableForDensity(mResources, R.drawable.themed_bitmap,
+                        DisplayMetrics.DENSITY_XXHIGH, yellowTheme);
+        // We should get a drawable that corresponds to the theme requested in the API call.
+        TestUtils.assertAllPixelsOfColor("Themed yellow density-aware drawable load : xxhigh color",
+                themedYellowDrawableForXXHighDensity, 0xFFF0B000);
+
+        Drawable themedLilacDrawableForXXHighDensity =
+                ResourcesCompat.getDrawableForDensity(mResources, R.drawable.themed_bitmap,
+                        DisplayMetrics.DENSITY_XXHIGH, lilacTheme);
+        // We should get a drawable that corresponds to the theme requested in the API call.
+        TestUtils.assertAllPixelsOfColor("Themed lilac density-aware drawable load : xxhigh color",
+                themedLilacDrawableForXXHighDensity, 0xFFF080F0);
+    }
+}
diff --git a/compat/tests/java/android/support/v4/graphics/DrawableCompatTest.java b/compat/tests/java/android/support/v4/graphics/DrawableCompatTest.java
new file mode 100644
index 0000000..fce5ead
--- /dev/null
+++ b/compat/tests/java/android/support/v4/graphics/DrawableCompatTest.java
@@ -0,0 +1,129 @@
+/*
+ * Copyright (C) 2016 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 android.support.v4.graphics;
+
+import android.content.res.ColorStateList;
+import android.graphics.Color;
+import android.graphics.PorterDuff;
+import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.GradientDrawable;
+import android.os.Build;
+import android.support.test.runner.AndroidJUnit4;
+import android.support.v4.graphics.drawable.DrawableCompat;
+import android.test.suitebuilder.annotation.SmallTest;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.junit.Assert.*;
+import static org.mockito.Mockito.*;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class DrawableCompatTest {
+    @Test
+    public void testDrawableWrap() {
+        final Drawable original = new GradientDrawable();
+        final Drawable wrappedDrawable = DrawableCompat.wrap(original);
+
+        if (Build.VERSION.SDK_INT < 23) {
+            assertNotSame(original, wrappedDrawable);
+        } else {
+            assertSame(original, wrappedDrawable);
+        }
+    }
+
+    @Test
+    public void testDrawableUnwrap() {
+        final Drawable original = new GradientDrawable();
+        final Drawable wrappedDrawable = DrawableCompat.wrap(original);
+        assertSame(original, DrawableCompat.unwrap(wrappedDrawable));
+    }
+
+    @Test
+    public void testDrawableChangeBoundsCopy() {
+        final Rect bounds = new Rect(0, 0, 10, 10);
+
+        final Drawable drawable = new GradientDrawable();
+
+        final Drawable wrapper = DrawableCompat.wrap(drawable);
+        wrapper.setBounds(bounds);
+
+        // Assert that the bounds were given to the original drawable
+        assertEquals(bounds, drawable.getBounds());
+    }
+
+    @Test
+    public void testDrawableWrapOnlyWrapsOnce() {
+        final Drawable wrappedDrawable = DrawableCompat.wrap(new GradientDrawable());
+        assertSame(wrappedDrawable, DrawableCompat.wrap(wrappedDrawable));
+    }
+
+    @Test
+    public void testWrapMutatedDrawableHasConstantState() {
+        // First create a Drawable, and mutated it so that it has a constant state
+        Drawable drawable = new GradientDrawable();
+        drawable = drawable.mutate();
+        assertNotNull(drawable.getConstantState());
+
+        // Now wrap and assert that the wrapper also returns a constant state
+        final Drawable wrapper = DrawableCompat.wrap(drawable);
+        assertNotNull(wrapper.getConstantState());
+    }
+
+    @Test
+    public void testWrappedDrawableHasCallbackSet() {
+        // First create a Drawable
+        final Drawable drawable = new GradientDrawable();
+
+        // Now wrap it and set a mock as the wrapper's callback
+        final Drawable wrapper = DrawableCompat.wrap(drawable);
+        final Drawable.Callback mockCallback = mock(Drawable.Callback.class);
+        wrapper.setCallback(mockCallback);
+
+        // Now make the wrapped drawable invalidate itself
+        drawable.invalidateSelf();
+
+        // ...and verify that the wrapper calls to be invalidated
+        verify(mockCallback, times(1)).invalidateDrawable(wrapper);
+    }
+
+    @Test
+    public void testDoesNotWrapTintAwareDrawable() {
+        final TestTintAwareDrawable tintAwareDrawable = new TestTintAwareDrawable();
+        final Drawable wrapped = DrawableCompat.wrap(tintAwareDrawable);
+        // Assert that the tint aware drawable was not wrapped
+        assertSame(tintAwareDrawable, wrapped);
+    }
+
+    @Test
+    public void testTintAwareDrawableGetsTintCallsDirectly() {
+        final TestTintAwareDrawable d = mock(TestTintAwareDrawable.class);
+
+        final ColorStateList tint = ColorStateList.valueOf(Color.BLACK);
+        final PorterDuff.Mode tintMode = PorterDuff.Mode.DST;
+
+        // Now set the tint list and mode using DrawableCompat
+        DrawableCompat.setTintList(d, tint);
+        DrawableCompat.setTintMode(d, tintMode);
+
+        // Verify that the calls were directly on to the TintAwareDrawable
+        verify(d).setTintList(tint);
+        verify(d).setTintMode(tintMode);
+    }
+
+}
\ No newline at end of file
diff --git a/v4/tests/java/android/support/v4/graphics/TestTintAwareDrawable.java b/compat/tests/java/android/support/v4/graphics/TestTintAwareDrawable.java
similarity index 100%
rename from v4/tests/java/android/support/v4/graphics/TestTintAwareDrawable.java
rename to compat/tests/java/android/support/v4/graphics/TestTintAwareDrawable.java
diff --git a/v4/tests/java/android/support/v4/testutils/LayoutDirectionActions.java b/compat/tests/java/android/support/v4/testutils/LayoutDirectionActions.java
similarity index 100%
rename from v4/tests/java/android/support/v4/testutils/LayoutDirectionActions.java
rename to compat/tests/java/android/support/v4/testutils/LayoutDirectionActions.java
diff --git a/compat/tests/java/android/support/v4/testutils/TestUtils.java b/compat/tests/java/android/support/v4/testutils/TestUtils.java
new file mode 100644
index 0000000..0bb8e1f
--- /dev/null
+++ b/compat/tests/java/android/support/v4/testutils/TestUtils.java
@@ -0,0 +1,113 @@
+/*
+ * Copyright (C) 2015 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 android.support.v4.testutils;
+
+import java.lang.IllegalArgumentException;
+import java.lang.RuntimeException;
+
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
+import android.support.annotation.ColorInt;
+import android.support.annotation.NonNull;
+import android.util.DisplayMetrics;
+import android.util.TypedValue;
+
+import junit.framework.Assert;
+
+public class TestUtils {
+    /**
+     * Checks whether all the pixels in the specified drawable are of the same specified color.
+     * If the passed <code>Drawable</code> does not have positive intrinsic dimensions set, this
+     * method will throw an <code>IllegalArgumentException</code>. If there is a color mismatch,
+     * this method will call <code>Assert.fail</code> with detailed description of the mismatch.
+     */
+    public static void assertAllPixelsOfColor(String failMessagePrefix, @NonNull Drawable drawable,
+            @ColorInt int color) {
+        int drawableWidth = drawable.getIntrinsicWidth();
+        int drawableHeight = drawable.getIntrinsicHeight();
+
+        if ((drawableWidth <= 0) || (drawableHeight <= 0)) {
+            throw new IllegalArgumentException("Drawable must be configured to have non-zero size");
+        }
+
+        assertAllPixelsOfColor(failMessagePrefix, drawable, drawableWidth, drawableHeight, color,
+                false);
+    }
+
+    /**
+     * Checks whether all the pixels in the specified drawable are of the same specified color.
+     *
+     * In case there is a color mismatch, the behavior of this method depends on the
+     * <code>throwExceptionIfFails</code> parameter. If it is <code>true</code>, this method will
+     * throw an <code>Exception</code> describing the mismatch. Otherwise this method will call
+     * <code>Assert.fail</code> with detailed description of the mismatch.
+     */
+    public static void assertAllPixelsOfColor(String failMessagePrefix, @NonNull Drawable drawable,
+            int drawableWidth, int drawableHeight, @ColorInt int color,
+            boolean throwExceptionIfFails) {
+        // Create a bitmap
+        Bitmap bitmap = Bitmap.createBitmap(drawableWidth, drawableHeight, Bitmap.Config.ARGB_8888);
+        // Create a canvas that wraps the bitmap
+        Canvas canvas = new Canvas(bitmap);
+        // Configure the drawable to have bounds that match its intrinsic size
+        drawable.setBounds(0, 0, drawableWidth, drawableHeight);
+        // And ask the drawable to draw itself to the canvas / bitmap
+        drawable.draw(canvas);
+
+        try {
+            int[] rowPixels = new int[drawableWidth];
+            for (int row = 0; row < drawableHeight; row++) {
+                bitmap.getPixels(rowPixels, 0, drawableWidth, 0, row, drawableWidth, 1);
+                for (int column = 0; column < drawableWidth; column++) {
+                    if (rowPixels[column] != color) {
+                        String mismatchDescription = failMessagePrefix
+                                + ": expected all drawable colors to be ["
+                                + Color.red(color) + "," + Color.green(color) + ","
+                                + Color.blue(color)
+                                + "] but at position (" + row + "," + column + ") found ["
+                                + Color.red(rowPixels[column]) + ","
+                                + Color.green(rowPixels[column]) + ","
+                                + Color.blue(rowPixels[column]) + "]";
+                        if (throwExceptionIfFails) {
+                            throw new RuntimeException(mismatchDescription);
+                        } else {
+                            Assert.fail(mismatchDescription);
+                        }
+                    }
+                }
+            }
+        } finally {
+            bitmap.recycle();
+        }
+    }
+
+    /**
+     * Checks whether the specified rectangle matches the specified left / top / right /
+     * bottom bounds.
+     */
+    public static void assertRectangleBounds(String failMessagePrefix, @NonNull Rect rectangle,
+            int left, int top, int right, int bottom) {
+        Assert.assertEquals(failMessagePrefix + " left", rectangle.left, left);
+        Assert.assertEquals(failMessagePrefix + " top", rectangle.top, top);
+        Assert.assertEquals(failMessagePrefix + " right", rectangle.right, right);
+        Assert.assertEquals(failMessagePrefix + " bottom", rectangle.bottom, bottom);
+    }
+}
\ No newline at end of file
diff --git a/v4/tests/java/android/support/v4/testutils/TextViewActions.java b/compat/tests/java/android/support/v4/testutils/TextViewActions.java
similarity index 100%
rename from v4/tests/java/android/support/v4/testutils/TextViewActions.java
rename to compat/tests/java/android/support/v4/testutils/TextViewActions.java
diff --git a/compat/tests/java/android/support/v4/text/util/LinkifyCompatTest.java b/compat/tests/java/android/support/v4/text/util/LinkifyCompatTest.java
new file mode 100644
index 0000000..f867188
--- /dev/null
+++ b/compat/tests/java/android/support/v4/text/util/LinkifyCompatTest.java
@@ -0,0 +1,834 @@
+/*
+ * Copyright (C) 2016 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 android.support.v4.text.util;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import android.support.test.runner.AndroidJUnit4;
+import android.support.v4.util.PatternsCompat;
+import android.test.suitebuilder.annotation.SmallTest;
+import android.text.Spannable;
+import android.text.SpannableString;
+import android.text.style.URLSpan;
+import android.text.util.Linkify;
+import android.text.util.Linkify.MatchFilter;
+import android.text.util.Linkify.TransformFilter;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.Locale;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class LinkifyCompatTest {
+    private static final Pattern LINKIFY_TEST_PATTERN = Pattern.compile(
+            "(test:)?[a-zA-Z0-9]+(\\.pattern)?");
+
+    private MatchFilter mMatchFilterStartWithDot = new MatchFilter() {
+        public final boolean acceptMatch(final CharSequence s, final int start, final int end) {
+            if (start == 0) {
+                return true;
+            }
+
+            if (s.charAt(start - 1) == '.') {
+                return false;
+            }
+
+            return true;
+        }
+    };
+
+    private TransformFilter mTransformFilterUpperChar = new TransformFilter() {
+        public final String transformUrl(final Matcher match, String url) {
+            StringBuilder buffer = new StringBuilder();
+            String matchingRegion = match.group();
+
+            for (int i = 0, size = matchingRegion.length(); i < size; i++) {
+                char character = matchingRegion.charAt(i);
+
+                if (character == '.' || Character.isLowerCase(character)
+                        || Character.isDigit(character)) {
+                    buffer.append(character);
+                }
+            }
+            return buffer.toString();
+        }
+    };
+
+    @Test
+    public void testAddLinks1() {
+        // Verify URLs including the ones that have new gTLDs, and the
+        // ones that look like gTLDs (and so are accepted by linkify)
+        // and the ones that should not be linkified due to non-compliant
+        // gTLDs
+        final String longGTLD =
+                "abcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabc";
+        SpannableString spannable = new SpannableString("name@gmail.com, "
+                + "www.google.com, http://www.google.com/language_tools?hl=en, "
+                + "a.bd, "   // a URL with accepted TLD so should be linkified
+                + "d.e, f.1, g.12, "  // not valid, so should not be linkified
+                + "http://h." + longGTLD + " "  // valid, should be linkified
+                + "j." + longGTLD + "a"); // not a valid URL (gtld too long), no linkify
+
+        assertTrue(LinkifyCompat.addLinks(spannable, Linkify.WEB_URLS));
+        URLSpan[] spans = spannable.getSpans(0, spannable.length(), URLSpan.class);
+        assertEquals(4, spans.length);
+        assertEquals("http://www.google.com", spans[0].getURL());
+        assertEquals("http://www.google.com/language_tools?hl=en", spans[1].getURL());
+        assertEquals("http://a.bd", spans[2].getURL());
+        assertEquals("http://h." + longGTLD, spans[3].getURL());
+
+        assertTrue(LinkifyCompat.addLinks(spannable, Linkify.EMAIL_ADDRESSES));
+        spans = spannable.getSpans(0, spannable.length(), URLSpan.class);
+        assertEquals(1, spans.length);
+        assertEquals("mailto:name@gmail.com", spans[0].getURL());
+
+        try {
+            LinkifyCompat.addLinks((Spannable) null, Linkify.WEB_URLS);
+            fail("Should throw NullPointerException!");
+        } catch (NullPointerException e) {
+            // expect
+        }
+
+        assertFalse(LinkifyCompat.addLinks((Spannable) null, 0));
+    }
+
+    @Test
+    public void testAddLinks2() {
+        String text = "google.pattern, test:AZ0101.pattern";
+
+        SpannableString spannable = new SpannableString(text);
+        LinkifyCompat.addLinks(spannable, LINKIFY_TEST_PATTERN, "Test:");
+        URLSpan[] spans = (spannable.getSpans(0, spannable.length(), URLSpan.class));
+        assertEquals(2, spans.length);
+        assertEquals("test:google.pattern", spans[0].getURL());
+        assertEquals("test:AZ0101.pattern", spans[1].getURL());
+
+        try {
+            LinkifyCompat.addLinks((Spannable)null, LINKIFY_TEST_PATTERN, "Test:");
+            fail("Should throw NullPointerException!");
+        } catch (NullPointerException e) {
+        }
+
+        try {
+            LinkifyCompat.addLinks(spannable, null, "Test:");
+            fail("Should throw NullPointerException!");
+        } catch (NullPointerException e) {
+        }
+
+        spannable = new SpannableString(text);
+        LinkifyCompat.addLinks(spannable, LINKIFY_TEST_PATTERN, null);
+        spans = (spannable.getSpans(0, spannable.length(), URLSpan.class));
+        assertEquals(2, spans.length);
+        assertEquals("google.pattern", spans[0].getURL());
+        assertEquals("test:AZ0101.pattern", spans[1].getURL());
+    }
+
+    @Test
+    public void testAddLinks3() {
+        String text = "FilterUpperCase.pattern, 12.345.pattern";
+
+        SpannableString spannable = new SpannableString(text);
+        LinkifyCompat.addLinks(spannable, LINKIFY_TEST_PATTERN, "Test:",
+                mMatchFilterStartWithDot, mTransformFilterUpperChar);
+        URLSpan[] spans = (spannable.getSpans(0, spannable.length(), URLSpan.class));
+        assertEquals(2, spans.length);
+        assertEquals("test:ilterpperase.pattern", spans[0].getURL());
+        assertEquals("test:12", spans[1].getURL());
+
+        try {
+            LinkifyCompat.addLinks((Spannable)null, LINKIFY_TEST_PATTERN, "Test:",
+                    mMatchFilterStartWithDot, mTransformFilterUpperChar);
+            fail("Should throw NullPointerException!");
+        } catch (NullPointerException e) {
+            // expect
+        }
+
+        try {
+            LinkifyCompat.addLinks(spannable, null, "Test:", mMatchFilterStartWithDot,
+                    mTransformFilterUpperChar);
+            fail("Should throw NullPointerException!");
+        } catch (NullPointerException e) {
+            // expect
+        }
+
+        spannable = new SpannableString(text);
+        LinkifyCompat.addLinks(spannable, LINKIFY_TEST_PATTERN, null, mMatchFilterStartWithDot,
+                mTransformFilterUpperChar);
+        spans = (spannable.getSpans(0, spannable.length(), URLSpan.class));
+        assertEquals(2, spans.length);
+        assertEquals("ilterpperase.pattern", spans[0].getURL());
+        assertEquals("12", spans[1].getURL());
+
+        spannable = new SpannableString(text);
+        LinkifyCompat.addLinks(spannable, LINKIFY_TEST_PATTERN, "Test:", null, mTransformFilterUpperChar);
+        spans = (spannable.getSpans(0, spannable.length(), URLSpan.class));
+        assertEquals(3, spans.length);
+        assertEquals("test:ilterpperase.pattern", spans[0].getURL());
+        assertEquals("test:12", spans[1].getURL());
+        assertEquals("test:345.pattern", spans[2].getURL());
+
+        spannable = new SpannableString(text);
+        LinkifyCompat.addLinks(spannable, LINKIFY_TEST_PATTERN, "Test:", mMatchFilterStartWithDot, null);
+        spans = (spannable.getSpans(0, spannable.length(), URLSpan.class));
+        assertEquals(2, spans.length);
+        assertEquals("test:FilterUpperCase.pattern", spans[0].getURL());
+        assertEquals("test:12", spans[1].getURL());
+    }
+
+    @Test
+    public void testAddLinks4() {
+        String numbersInvalid = "123456789 not a phone number";
+        String numbersUKLocal = "tel:(0812)1234560 (0812)1234561";
+        String numbersUSLocal = "tel:(812)1234562 (812)123.4563 "
+                + " tel:(800)5551210 (800)555-1211 555-1212";
+        String numbersIntl = "tel:+4408121234564 +44-0812-123-4565"
+                + " tel:+18005551213 +1-800-555-1214";
+        SpannableString spannable = new SpannableString(
+                numbersInvalid
+                        + " " + numbersUKLocal
+                        + " " + numbersUSLocal
+                        + " " + numbersIntl);
+
+        // phonenumber linkify is locale-dependent
+        if (Locale.US.equals(Locale.getDefault())) {
+            assertTrue(LinkifyCompat.addLinks(spannable, Linkify.PHONE_NUMBERS));
+            URLSpan[] spans = spannable.getSpans(0, spannable.length(), URLSpan.class);
+            assertEquals(9, spans.length);
+            assertEquals("tel:8121234562", spans[0].getURL());
+            assertEquals("tel:8121234563", spans[1].getURL());
+            assertEquals("tel:8005551210", spans[2].getURL());
+            assertEquals("tel:8005551211", spans[3].getURL());
+            assertEquals("tel:5551212", spans[4].getURL());
+            assertEquals("tel:+4408121234564", spans[5].getURL());
+            assertEquals("tel:+4408121234565", spans[6].getURL());
+            assertEquals("tel:+18005551213", spans[7].getURL());
+            assertEquals("tel:+18005551214", spans[8].getURL());
+        }
+
+        try {
+            LinkifyCompat.addLinks((Spannable) null, Linkify.WEB_URLS);
+            fail("Should throw NullPointerException!");
+        } catch (NullPointerException e) {
+            // expect
+        }
+
+        assertFalse(LinkifyCompat.addLinks((Spannable) null, 0));
+    }
+
+    @Test
+    public void testAddLinks_spanOverlapPruning() {
+        SpannableString spannable = new SpannableString("800-555-1211@gmail.com 800-555-1222.com"
+                + " phone800-555-1233");
+
+        // phonenumber linkify is locale-dependent
+        if (Locale.US.equals(Locale.getDefault())) {
+            assertTrue(LinkifyCompat.addLinks(spannable, Linkify.ALL));
+            URLSpan[] spans = spannable.getSpans(0, spannable.length(), URLSpan.class);
+            assertEquals(3, spans.length);
+            assertEquals("tel:8005551233", spans[0].getURL());
+            assertEquals("mailto:800-555-1211@gmail.com", spans[1].getURL());
+            assertEquals("http://800-555-1222.com", spans[2].getURL());
+        }
+    }
+
+    @Test
+    public void testAddLinks_addsLinksWhenDefaultSchemeIsNull() {
+        Spannable spannable = new SpannableString("any https://android.com any android.com any");
+        LinkifyCompat.addLinks(spannable, PatternsCompat.AUTOLINK_WEB_URL, null, null, null);
+
+        URLSpan[] spans = spannable.getSpans(0, spannable.length(), URLSpan.class);
+        assertEquals("android.com and https://android.com should be linkified", 2, spans.length);
+        assertEquals("https://android.com", spans[0].getURL());
+        assertEquals("android.com", spans[1].getURL());
+    }
+
+    @Test
+    public void testAddLinks_addsLinksWhenSchemesArrayIsNull() {
+        Spannable spannable = new SpannableString("any https://android.com any android.com any");
+        LinkifyCompat.addLinks(spannable, PatternsCompat.AUTOLINK_WEB_URL, "http://", null, null);
+
+        URLSpan[] spans = spannable.getSpans(0, spannable.length(), URLSpan.class);
+        assertEquals("android.com and https://android.com should be linkified", 2, spans.length);
+        // expected behavior, passing null schemes array means: prepend defaultScheme to all links.
+        assertEquals("http://https://android.com", spans[0].getURL());
+        assertEquals("http://android.com", spans[1].getURL());
+    }
+
+    @Test
+    public void testAddLinks_prependsDefaultSchemeToBeginingOfLink() {
+        Spannable spannable = new SpannableString("any android.com any");
+        LinkifyCompat.addLinks(spannable, PatternsCompat.AUTOLINK_WEB_URL, "http://",
+                new String[] { "http://", "https://"}, null, null);
+
+        URLSpan[] spans = spannable.getSpans(0, spannable.length(), URLSpan.class);
+        assertEquals("android.com should be linkified", 1, spans.length);
+        assertEquals("http://android.com", spans[0].getURL());
+    }
+
+    @Test
+    public void testAddLinks_doesNotPrependSchemeIfSchemeExists() {
+        Spannable spannable = new SpannableString("any https://android.com any");
+        LinkifyCompat.addLinks(spannable, PatternsCompat.AUTOLINK_WEB_URL, "http://",
+                new String[] { "http://", "https://"}, null, null);
+
+        URLSpan[] spans = spannable.getSpans(0, spannable.length(), URLSpan.class);
+        assertEquals("android.com should be linkified", 1, spans.length);
+        assertEquals("https://android.com", spans[0].getURL());
+    }
+
+    // WEB_URLS Related Tests
+
+    @Test
+    public void testAddLinks_doesNotAddLinksForUrlWithoutProtocolAndWithoutKnownTld()
+            throws Exception {
+        Spannable spannable = new SpannableString("hey man.its me");
+        boolean linksAdded = LinkifyCompat.addLinks(spannable, Linkify.ALL);
+        assertFalse("Should not add link with unknown TLD", linksAdded);
+    }
+
+    @Test
+    public void testAddLinks_shouldNotAddEmailAddressAsUrl() throws Exception {
+        String url = "name@gmail.com";
+        assertAddLinksWithWebUrlFails("Should not recognize email address as URL", url);
+    }
+
+    public void testAddLinks_acceptsUrlsWithCommasInRequestParameterValues() throws Exception {
+        String url = "https://android.com/path?ll=37.4221,-122.0836&z=17&pll=37.4221,-122.0836";
+        assertAddLinksWithWebUrlSucceeds("Should accept commas", url);
+    }
+
+    @Test
+    public void testAddLinks_addsLinksForUrlWithProtocolWithoutTld() throws Exception {
+        String url = "http://android/#notld///a/n/d/r/o/i/d&p1=1&p2=2";
+        assertAddLinksWithWebUrlSucceeds("Should accept URL starting with protocol but does not" +
+                " have TLD", url);
+    }
+
+    @Test
+    public void testAddLinks_matchesProtocolCaseInsensitive() throws Exception {
+        String url = "hTtP://android.com";
+        assertAddLinksWithWebUrlSucceeds("Protocol matching should be case insensitive", url);
+    }
+
+    @Test
+    public void testAddLinks_matchesValidUrlWithSchemeAndHostname() throws Exception {
+        String url = "http://www.android.com";
+        assertAddLinksWithWebUrlSucceeds("Should match valid URL with scheme and hostname", url);
+    }
+
+    @Test
+    public void testAddLinks_matchesValidUrlWithSchemeHostnameAndNewTld() throws Exception {
+        String url = "http://www.android.me";
+        assertAddLinksWithWebUrlSucceeds("Should match valid URL with scheme hostname and new TLD",
+                url);
+    }
+
+    @Test
+    public void testAddLinks_matchesValidUrlWithHostnameAndNewTld() throws Exception {
+        String url = "android.camera";
+        assertAddLinksWithWebUrlSucceeds("Should match valid URL with hostname and new TLD", url);
+    }
+
+    @Test
+    public void testAddLinks_matchesPunycodeUrl() throws Exception {
+        String url = "http://xn--fsqu00a.xn--unup4y";
+        assertAddLinksWithWebUrlSucceeds("Should match Punycode URL", url);
+    }
+
+    @Test
+    public void testAddLinks_matchesPunycodeUrlWithoutProtocol() throws Exception {
+        String url = "xn--fsqu00a.xn--unup4y";
+        assertAddLinksWithWebUrlSucceeds("Should match Punycode URL without protocol", url);
+    }
+
+    @Test
+    public void testAddLinks_doesNotMatchPunycodeTldThatStartsWithDash() throws Exception {
+        String url = "xn--fsqu00a.-xn--unup4y";
+        assertAddLinksWithWebUrlFails("Should not match Punycode TLD that starts with dash", url);
+    }
+
+    @Test
+    public void testAddLinks_partiallyMatchesPunycodeTldThatEndsWithDash() throws Exception {
+        String url = "http://xn--fsqu00a.xn--unup4y-";
+        assertAddLinksWithWebUrlPartiallyMatches("Should partially match Punycode TLD that ends " +
+                "with dash", "http://xn--fsqu00a.xn--unup4y", url);
+    }
+
+    @Test
+    public void testAddLinks_matchesUrlWithUnicodeDomainName() throws Exception {
+        String url = "http://\uD604\uAE08\uC601\uC218\uC99D.kr";
+        assertAddLinksWithWebUrlSucceeds("Should match URL with Unicode domain name", url);
+    }
+
+    @Test
+    public void testAddLinks_matchesUrlWithUnicodeDomainNameWithoutProtocol() throws Exception {
+        String url = "\uD604\uAE08\uC601\uC218\uC99D.kr";
+        assertAddLinksWithWebUrlSucceeds("Should match URL without protocol and with Unicode " +
+                "domain name", url);
+    }
+
+    @Test
+    public void testAddLinks_matchesUrlWithUnicodeDomainNameAndTld() throws Exception {
+        String url = "\uB3C4\uBA54\uC778.\uD55C\uAD6D";
+        assertAddLinksWithWebUrlSucceeds("Should match URL with Unicode domain name and TLD", url);
+    }
+
+    @Test
+    public void testAddLinks_matchesUrlWithUnicodePath() throws Exception {
+        String url = "http://android.com/\u2019/a";
+        assertAddLinksWithWebUrlSucceeds("Should match URL with Unicode path", url);
+    }
+
+    @Test
+    public void testAddLinks_matchesValidUrlWithPort() throws Exception {
+        String url = "http://www.example.com:8080";
+        assertAddLinksWithWebUrlSucceeds("Should match URL with port", url);
+    }
+
+    @Test
+    public void testAddLinks_matchesUrlWithPortAndQuery() throws Exception {
+        String url = "http://www.example.com:8080/?foo=bar";
+        assertAddLinksWithWebUrlSucceeds("Should match URL with port and query", url);
+    }
+
+    @Test
+    public void testAddLinks_matchesUrlWithTilde() throws Exception {
+        String url = "http://www.example.com:8080/~user/?foo=bar";
+        assertAddLinksWithWebUrlSucceeds("Should match URL with tilde", url);
+    }
+
+    @Test
+    public void testAddLinks_matchesUrlStartingWithHttpAndDoesNotHaveTld() throws Exception {
+        String url = "http://android/#notld///a/n/d/r/o/i/d&p1=1&p2=2";
+        assertAddLinksWithWebUrlSucceeds("Should match URL without a TLD and starting with http",
+                url);
+    }
+
+    @Test
+    public void testAddLinks_doesNotMatchUrlsWithoutProtocolAndWithUnknownTld() throws Exception {
+        String url = "thank.you";
+        assertAddLinksWithWebUrlFails("Should not match URL that does not start with a protocol " +
+                "and does not contain a known TLD", url);
+    }
+
+    @Test
+    public void testAddLinks_matchesValidUrlWithEmoji() throws Exception {
+        String url = "Thank\u263A.com";
+        assertAddLinksWithWebUrlSucceeds("Should match URL with emoji", url);
+    }
+
+    @Test
+    public void testAddLinks_doesNotMatchUrlsWithEmojiWithoutProtocolAndWithoutKnownTld()
+            throws Exception {
+        String url = "Thank\u263A.you";
+        assertAddLinksWithWebUrlFails("Should not match URLs containing emoji and with unknown " +
+                "TLD", url);
+    }
+
+    @Test
+    public void testAddLinks_matchesDomainNameWithSurrogatePairs() throws Exception {
+        String url = "android\uD83C\uDF38.com";
+        assertAddLinksWithWebUrlSucceeds("Should match domain name with Unicode surrogate pairs",
+                url);
+    }
+
+    @Test
+    public void testAddLinks_matchesTldWithSurrogatePairs() throws Exception {
+        String url = "http://android.\uD83C\uDF38com";
+        assertAddLinksWithWebUrlSucceeds("Should match TLD with Unicode surrogate pairs", url);
+    }
+
+    @Test
+    public void testAddLinks_doesNotMatchUrlWithExcludedSurrogate() throws Exception {
+        String url = "android\uD83F\uDFFE.com";
+        assertAddLinksWithWebUrlFails("Should not match URL with excluded Unicode surrogate" +
+                " pair",  url);
+    }
+
+    @Test
+    public void testAddLinks_matchesPathWithSurrogatePairs() throws Exception {
+        String url = "http://android.com/path-with-\uD83C\uDF38?v=\uD83C\uDF38f";
+        assertAddLinksWithWebUrlSucceeds("Should match path and query with Unicode surrogate pairs",
+                url);
+    }
+
+    @Test
+    public void testAddLinks__doesNotMatchUnicodeSpaces() throws Exception {
+        String part1 = "http://and";
+        String part2 = "roid.com";
+        String[] emptySpaces = new String[]{
+                "\u00A0", // no-break space
+                "\u2000", // en quad
+                "\u2001", // em quad
+                "\u2002", // en space
+                "\u2003", // em space
+                "\u2004", // three-per-em space
+                "\u2005", // four-per-em space
+                "\u2006", // six-per-em space
+                "\u2007", // figure space
+                "\u2008", // punctuation space
+                "\u2009", // thin space
+                "\u200A", // hair space
+                "\u2028", // line separator
+                "\u2029", // paragraph separator
+                "\u202F", // narrow no-break space
+                "\u3000"  // ideographic space
+        };
+
+        for (String emptySpace : emptySpaces) {
+            String url = part1 + emptySpace + part2;
+            assertAddLinksWithWebUrlPartiallyMatches("Should not include empty space with code: " +
+                    emptySpace.codePointAt(0), part1, url);
+        }
+    }
+
+    @Test
+    public void testAddLinks_matchesDomainNameWithDash() throws Exception {
+        String url = "http://a-nd.r-oid.com";
+        assertAddLinksWithWebUrlSucceeds("Should match domain name with '-'", url);
+
+        url = "a-nd.r-oid.com";
+        assertAddLinksWithWebUrlSucceeds("Should match domain name with '-'", url);
+    }
+
+    @Test
+    public void testAddLinks_matchesDomainNameWithUnderscore() throws Exception {
+        String url = "http://a_nd.r_oid.com";
+        assertAddLinksWithWebUrlSucceeds("Should match domain name with '_'", url);
+
+        url = "a_nd.r_oid.com";
+        assertAddLinksWithWebUrlSucceeds("Should match domain name with '_'", url);
+    }
+
+    @Test
+    public void testAddLinks_matchesPathAndQueryWithDollarSign() throws Exception {
+        String url = "http://android.com/path$?v=$val";
+        assertAddLinksWithWebUrlSucceeds("Should match path and query with '$'", url);
+
+        url = "android.com/path$?v=$val";
+        assertAddLinksWithWebUrlSucceeds("Should match path and query with '$'", url);
+    }
+
+    @Test
+    public void testAddLinks_matchesEmptyPathWithQueryParams() throws Exception {
+        String url = "http://android.com?q=v";
+        assertAddLinksWithWebUrlSucceeds("Should match empty path with query params", url);
+
+        url = "android.com?q=v";
+        assertAddLinksWithWebUrlSucceeds("Should match empty path with query params", url);
+
+        url = "http://android.com/?q=v";
+        assertAddLinksWithWebUrlSucceeds("Should match empty path with query params", url);
+
+        url = "android.com/?q=v";
+        assertAddLinksWithWebUrlSucceeds("Should match empty path with query params", url);
+    }
+
+    // EMAIL_ADDRESSES Related Tests
+
+    @Test
+    public void testAddLinks_email_matchesShortValidEmail() throws Exception {
+        String email = "a@a.co";
+        assertAddLinksWithEmailSucceeds("Should match email: " + email, email);
+    }
+
+    @Test
+    public void testAddLinks_email_matchesRegularEmail() throws Exception {
+        String email = "email@android.com";
+        assertAddLinksWithEmailSucceeds("Should match email: " + email, email);
+    }
+
+    @Test
+    public void testAddLinks_email_matchesEmailWithMultipleSubdomains() throws Exception {
+        String email = "email@e.somelongdomainnameforandroid.abc.uk";
+        assertAddLinksWithEmailSucceeds("Should match email: " + email, email);
+    }
+
+    @Test
+    public void testAddLinks_email_matchesLocalPartWithDot() throws Exception {
+        String email = "e.mail@android.com";
+        assertAddLinksWithEmailSucceeds("Should match email: " + email, email);
+    }
+
+    @Test
+    public void testAddLinks_email_matchesLocalPartWithPlus() throws Exception {
+        String email = "e+mail@android.com";
+        assertAddLinksWithEmailSucceeds("Should match email: " + email, email);
+    }
+
+    @Test
+    public void testAddLinks_email_matchesLocalPartWithUnderscore() throws Exception {
+        String email = "e_mail@android.com";
+        assertAddLinksWithEmailSucceeds("Should match email: " + email, email);
+    }
+
+    @Test
+    public void testAddLinks_email_matchesLocalPartWithDash() throws Exception {
+        String email = "e-mail@android.com";
+        assertAddLinksWithEmailSucceeds("Should match email: " + email, email);
+    }
+
+    @Test
+    public void testAddLinks_email_matchesLocalPartWithApostrophe() throws Exception {
+        String email = "e'mail@android.com";
+        assertAddLinksWithEmailSucceeds("Should match email: " + email, email);
+    }
+
+    @Test
+    public void testAddLinks_email_matchesLocalPartWithDigits() throws Exception {
+        String email = "123@android.com";
+        assertAddLinksWithEmailSucceeds("Should match email: " + email, email);
+    }
+
+    @Test
+    public void testAddLinks_email_matchesUnicodeLocalPart() throws Exception {
+        String email = "\uD604\uAE08\uC601\uC218\uC99D@android.kr";
+        assertAddLinksWithEmailSucceeds("Should match email: " + email, email);
+    }
+
+    @Test
+    public void testAddLinks_email_matchesLocalPartWithEmoji() throws Exception {
+        String email = "smiley\u263A@android.com";
+        assertAddLinksWithEmailSucceeds("Should match email: " + email, email);
+    }
+
+    @Test
+    public void testAddLinks_email_matchesLocalPartWithSurrogatePairs()
+            throws Exception {
+        String email = "a\uD83C\uDF38a@android.com";
+        assertAddLinksWithEmailSucceeds("Should match email: " + email, email);
+    }
+
+    @Test
+    public void testAddLinks_email_matchesDomainWithDash() throws Exception {
+        String email = "email@an-droid.com";
+        assertAddLinksWithEmailSucceeds("Should match email: " + email, email);
+    }
+
+    @Test
+    public void testAddLinks_email_matchesUnicodeDomain() throws Exception {
+        String email = "email@\uD604\uAE08\uC601\uC218\uC99D.kr";
+        assertAddLinksWithEmailSucceeds("Should match email: " + email, email);
+    }
+
+    @Test
+    public void testAddLinks_email_matchesUnicodeLocalPartAndDomain()
+            throws Exception {
+        String email = "\uD604\uAE08\uC601\uC218\uC99D@\uD604\uAE08\uC601\uC218\uC99D.kr";
+        assertAddLinksWithEmailSucceeds("Should match email: " + email, email);
+    }
+
+    @Test
+    public void testAddLinks_email_matchesDomainWithEmoji() throws Exception {
+        String email = "smiley@\u263Aandroid.com";
+        assertAddLinksWithEmailSucceeds("Should match email: " + email, email);
+    }
+
+    @Test
+    public void testAddLinks_email_matchesDomainWithSurrogatePairs()
+            throws Exception {
+        String email = "email@\uD83C\uDF38android.com";
+        assertAddLinksWithEmailSucceeds("Should match email: " + email, email);
+    }
+
+    @Test
+    public void testAddLinks_email_matchesLocalPartAndDomainWithSurrogatePairs()
+            throws Exception {
+        String email = "a\uD83C\uDF38a@\uD83C\uDF38android.com";
+        assertAddLinksWithEmailSucceeds("Should match email: " + email, email);
+    }
+
+    @Test
+    public void testAddLinks_partiallyMatchesEmailEndingWithDot() throws Exception {
+        String email = "email@android.co.uk.";
+        assertAddLinksWithEmailPartiallyMatches("Should partially match email ending with dot",
+                "mailto:email@android.co.uk", email);
+    }
+
+    @Test
+    public void testAddLinks_email_partiallyMatchesLocalPartStartingWithDot()
+            throws Exception {
+        String email = ".email@android.com";
+        assertAddLinksWithEmailPartiallyMatches("Should partially match email starting " +
+                "with dot", "mailto:email@android.com", email);
+    }
+
+    @Test
+    public void testAddLinks_email_doesNotMatchStringWithoutAtSign() throws Exception {
+        String email = "android.com";
+        assertAddLinksWithEmailFails("Should not match email: " + email, email);
+    }
+
+    @Test
+    public void testAddLinks_email_doesNotMatchPlainString() throws Exception {
+        String email = "email";
+        assertAddLinksWithEmailFails("Should not match email: " + email, email);
+    }
+
+    @Test
+    public void testAddLinks_email_doesNotMatchEmailWithoutTld() throws Exception {
+        String email = "email@android";
+        assertAddLinksWithEmailFails("Should not match email: " + email, email);
+    }
+
+    @Test
+    public void testAddLinks_email_doesNotMatchLocalPartEndingWithDot()
+            throws Exception {
+        String email = "email.@android.com";
+        assertAddLinksWithEmailFails("Should not match email: " + email, email);
+    }
+
+    @Test
+    public void testAddLinks_email_doesNotMatchDomainStartingWithDash()
+            throws Exception {
+        String email = "email@-android.com";
+        assertAddLinksWithEmailFails("Should not match email: " + email, email);
+    }
+
+    @Test
+    public void testAddLinks_email_doesNotMatchDomainWithConsecutiveDots()
+            throws Exception {
+        String email = "email@android..com";
+        assertAddLinksWithEmailFails("Should not match email: " + email, email);
+    }
+
+    @Test
+    public void testAddLinks_email_doesNotMatchEmailWithIp() throws Exception {
+        String email = "email@127.0.0.1";
+        assertAddLinksWithEmailFails("Should not match email: " + email, email);
+    }
+
+    @Test
+    public void testAddLinks_email_doesNotMatchEmailWithInvalidTld()
+            throws Exception {
+        String email = "email@android.c";
+        assertAddLinksWithEmailFails("Should not match email: " + email, email);
+    }
+
+    @Test
+    public void testAddLinks_email_matchesLocalPartUpTo64Chars() throws Exception {
+        String localPart = "";
+        for (int i = 0; i < 64; i++) {
+            localPart += "a";
+        }
+        String email = localPart + "@android.com";
+        assertAddLinksWithEmailSucceeds("Should match email local part of length: " +
+                localPart.length(), email);
+
+        email = localPart + "a@android.com";
+        assertAddLinksWithEmailFails("Should not match email local part of length:" +
+                localPart.length(), email);
+    }
+
+    @Test
+    public void testAddLinks_email_matchesSubdomainUpTo63Chars() throws Exception {
+        String subdomain = "";
+        for (int i = 0; i < 63; i++) {
+            subdomain += "a";
+        }
+        String email = "email@" + subdomain + ".com";
+
+        assertAddLinksWithEmailSucceeds("Should match email subdomain of length: " +
+                subdomain.length(), email);
+
+        subdomain += "a";
+        email = "email@" + subdomain + ".com";
+
+        assertAddLinksWithEmailFails("Should not match email subdomain of length:" +
+                subdomain.length(), email);
+    }
+
+    @Test
+    public void testAddLinks_email_matchesDomainUpTo255Chars() throws Exception {
+        String domain = "";
+        while (domain.length() <= 250) {
+            domain += "d.";
+        }
+        domain += "com";
+        assertEquals(255, domain.length());
+        String email = "a@" + domain;
+        assertAddLinksWithEmailSucceeds("Should match email domain of length: " +
+                domain.length(), email);
+
+        email = email + "m";
+        assertAddLinksWithEmailFails("Should not match email domain of length:" +
+                domain.length(), email);
+    }
+
+    // Utility functions
+    private static void assertAddLinksWithWebUrlSucceeds(String msg, String url) {
+        assertAddLinksSucceeds(msg, url, Linkify.WEB_URLS);
+    }
+
+    private static void assertAddLinksWithWebUrlFails(String msg, String url) {
+        assertAddLinksFails(msg, url, Linkify.WEB_URLS);
+    }
+
+    private static void assertAddLinksWithWebUrlPartiallyMatches(String msg, String expected,
+            String url) {
+        assertAddLinksPartiallyMatches(msg, expected, url, Linkify.WEB_URLS);
+    }
+
+    private static void assertAddLinksWithEmailSucceeds(String msg, String url) {
+        assertAddLinksSucceeds(msg, url, Linkify.EMAIL_ADDRESSES);
+    }
+
+    private static void assertAddLinksWithEmailFails(String msg, String url) {
+        assertAddLinksFails(msg, url, Linkify.EMAIL_ADDRESSES);
+    }
+
+    private static void assertAddLinksWithEmailPartiallyMatches(String msg, String expected,
+            String url) {
+        assertAddLinksPartiallyMatches(msg, expected, url, Linkify.EMAIL_ADDRESSES);
+    }
+
+    private static void assertAddLinksSucceeds(String msg, String string, int type) {
+        String str = "start " + string + " end";
+        Spannable spannable = new SpannableString(str);
+
+        boolean linksAdded = LinkifyCompat.addLinks(spannable, type);
+        URLSpan[] spans = spannable.getSpans(0, str.length(), URLSpan.class);
+
+        assertTrue(msg, linksAdded);
+        assertEquals("Span should start from the beginning of: " + string,
+                "start ".length(), spannable.getSpanStart(spans[0]));
+        assertEquals("Span should end at the end of: " + string,
+                str.length() - " end".length(), spannable.getSpanEnd(spans[0]));
+    }
+
+    private static void assertAddLinksFails(String msg, String string, int type) {
+        Spannable spannable = new SpannableString("start " + string + " end");
+        boolean linksAdded = LinkifyCompat.addLinks(spannable, type);
+        assertFalse(msg, linksAdded);
+    }
+
+    private static void assertAddLinksPartiallyMatches(String msg, String expected,
+            String string, int type) {
+        Spannable spannable = new SpannableString("start " + string + " end");
+        boolean linksAdded = LinkifyCompat.addLinks(spannable, type);
+        URLSpan[] spans = spannable.getSpans(0, spannable.length(), URLSpan.class);
+        assertTrue(msg, linksAdded);
+        assertEquals(msg, expected, spans[0].getURL().toString());
+    }
+}
\ No newline at end of file
diff --git a/compat/tests/java/android/support/v4/util/PatternsCompatTest.java b/compat/tests/java/android/support/v4/util/PatternsCompatTest.java
new file mode 100644
index 0000000..ab6ad2a
--- /dev/null
+++ b/compat/tests/java/android/support/v4/util/PatternsCompatTest.java
@@ -0,0 +1,885 @@
+/*
+ * Copyright (C) 2016 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 android.support.v4.util;
+
+import android.support.test.runner.AndroidJUnit4;
+import android.test.suitebuilder.annotation.SmallTest;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertFalse;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class PatternsCompatTest {
+
+    // Tests for PatternsCompat.IANA_TOP_LEVEL_DOMAINS
+
+    @Test
+    public void testIanaTopLevelDomains_matchesValidTld() throws Exception {
+        Pattern pattern = Pattern.compile(PatternsCompat.IANA_TOP_LEVEL_DOMAINS);
+        assertTrue("Should match 'com'", pattern.matcher("com").matches());
+    }
+
+    @Test
+    public void testIanaTopLevelDomains_matchesValidNewTld() throws Exception {
+        Pattern pattern = Pattern.compile(PatternsCompat.IANA_TOP_LEVEL_DOMAINS);
+        assertTrue("Should match 'me'", pattern.matcher("me").matches());
+    }
+
+    @Test
+    public void testIanaTopLevelDomains_matchesPunycodeTld() throws Exception {
+        Pattern pattern = Pattern.compile(PatternsCompat.IANA_TOP_LEVEL_DOMAINS);
+        assertTrue("Should match Punycode TLD", pattern.matcher("xn--qxam").matches());
+    }
+
+    @Test
+    public void testIanaTopLevelDomains_matchesIriTLD() throws Exception {
+        Pattern pattern = Pattern.compile(PatternsCompat.IANA_TOP_LEVEL_DOMAINS);
+        assertTrue("Should match IRI TLD", pattern.matcher("\uD55C\uAD6D").matches());
+    }
+
+    @Test
+    public void testIanaTopLevelDomains_doesNotMatchWrongTld() throws Exception {
+        Pattern pattern = Pattern.compile(PatternsCompat.IANA_TOP_LEVEL_DOMAINS);
+        assertFalse("Should not match 'mem'", pattern.matcher("mem").matches());
+    }
+
+    @Test
+    public void testIanaTopLevelDomains_doesNotMatchWrongPunycodeTld() throws Exception {
+        Pattern pattern = Pattern.compile(PatternsCompat.IANA_TOP_LEVEL_DOMAINS);
+        assertFalse("Should not match invalid Punycode TLD", pattern.matcher("xn").matches());
+    }
+
+    // Tests for PatternsCompat.WEB_URL
+
+    @Test
+    public void testWebUrl_matchesValidUrlWithSchemeAndHostname() throws Exception {
+        String url = "http://www.android.com";
+        assertTrue("Should match URL with scheme and hostname",
+                PatternsCompat.WEB_URL.matcher(url).matches());
+    }
+
+    @Test
+    public void testWebUrl_matchesValidUrlWithSchemeHostnameAndNewTld() throws Exception {
+        String url = "http://www.android.me";
+        assertTrue("Should match URL with scheme, hostname and new TLD",
+                PatternsCompat.WEB_URL.matcher(url).matches());
+    }
+
+    @Test
+    public void testWebUrl_matchesValidUrlWithHostnameAndNewTld() throws Exception {
+        String url = "android.me";
+        assertTrue("Should match URL with hostname and new TLD",
+                PatternsCompat.WEB_URL.matcher(url).matches());
+    }
+
+    @Test
+    public void testWebUrl_matchesChinesePunycodeUrlWithProtocol() throws Exception {
+        String url = "http://xn--fsqu00a.xn--0zwm56d";
+        assertTrue("Should match Chinese Punycode URL with protocol",
+                PatternsCompat.WEB_URL.matcher(url).matches());
+    }
+
+    @Test
+    public void testWebUrl_matchesChinesePunycodeUrlWithoutProtocol() throws Exception {
+        String url = "xn--fsqu00a.xn--0zwm56d";
+        assertTrue("Should match Chinese Punycode URL without protocol",
+                PatternsCompat.WEB_URL.matcher(url).matches());
+    }
+
+    @Test
+    public void testWebUrl_matchesArabicPunycodeUrlWithProtocol() throws Exception {
+        String url = "http://xn--4gbrim.xn----rmckbbajlc6dj7bxne2c.xn--wgbh1c/ar/default.aspx";
+        assertTrue("Should match arabic Punycode URL with protocol",
+                PatternsCompat.WEB_URL.matcher(url).matches());
+    }
+
+    @Test
+    public void testWebUrl_matchesArabicPunycodeUrlWithoutProtocol() throws Exception {
+        String url = "xn--4gbrim.xn----rmckbbajlc6dj7bxne2c.xn--wgbh1c/ar/default.aspx";
+        assertTrue("Should match Arabic Punycode URL without protocol",
+                PatternsCompat.WEB_URL.matcher(url).matches());
+    }
+
+    @Test
+    public void testWebUrl_matchesUrlWithUnicodeDomainNameWithProtocol() throws Exception {
+        String url = "http://\uD604\uAE08\uC601\uC218\uC99D.kr";
+        assertTrue("Should match URL with Unicode domain name",
+                PatternsCompat.WEB_URL.matcher(url).matches());
+    }
+
+    @Test
+    public void testWebUrl_matchesUrlWithUnicodeDomainNameWithoutProtocol() throws Exception {
+        String url = "\uD604\uAE08\uC601\uC218\uC99D.kr";
+        assertTrue("Should match URL without protocol and with Unicode domain name",
+                PatternsCompat.WEB_URL.matcher(url).matches());
+    }
+
+    @Test
+    public void testWebUrl_matchesUrlWithUnicodeTld() throws Exception {
+        String url = "\uB3C4\uBA54\uC778.\uD55C\uAD6D";
+        assertTrue("Should match URL with Unicode TLD",
+                PatternsCompat.WEB_URL.matcher(url).matches());
+    }
+
+    @Test
+    public void testWebUrl_matchesUrlWithUnicodePath() throws Exception {
+        String url = "http://brainstormtech.blogs.fortune.cnn.com/2010/03/11/" +
+                "top-five-moments-from-eric-schmidt\u2019s-talk-in-abu-dhabi/";
+        assertTrue("Should match URL with Unicode path",
+                PatternsCompat.WEB_URL.matcher(url).matches());
+    }
+
+    @Test
+    public void testWebUrl_doesNotMatchValidUrlWithInvalidProtocol() throws Exception {
+        String url = "ftp://www.example.com";
+        assertFalse("Should not match URL with invalid protocol",
+                PatternsCompat.WEB_URL.matcher(url).matches());
+    }
+
+    @Test
+    public void testWebUrl_matchesValidUrlWithPort() throws Exception {
+        String url = "http://www.example.com:8080";
+        assertTrue("Should match URL with port", PatternsCompat.WEB_URL.matcher(url).matches());
+    }
+
+    @Test
+    public void testWebUrl_matchesUrlWithPortAndQuery() throws Exception {
+        String url = "http://www.example.com:8080/?foo=bar";
+        assertTrue("Should match URL with port and query",
+                PatternsCompat.WEB_URL.matcher(url).matches());
+    }
+
+    @Test
+    public void testWebUrl_matchesUrlWithTilde() throws Exception {
+        String url = "http://www.example.com:8080/~user/?foo=bar";
+        assertTrue("Should match URL with tilde", PatternsCompat.WEB_URL.matcher(url).matches());
+    }
+
+    @Test
+    public void testWebUrl_matchesProtocolCaseInsensitive() throws Exception {
+        String url = "hTtP://android.com";
+        assertTrue("Protocol matching should be case insensitive",
+                PatternsCompat.WEB_URL.matcher(url).matches());
+    }
+
+    @Test
+    public void testWebUrl_matchesDomainNameWithDash() throws Exception {
+        String url = "http://a-nd.r-oid.com";
+        assertTrue("Should match dash in domain name",
+                PatternsCompat.WEB_URL.matcher(url).matches());
+
+        url = "a-nd.r-oid.com";
+        assertTrue("Should match dash in domain name",
+                PatternsCompat.WEB_URL.matcher(url).matches());
+    }
+
+    @Test
+    public void testWebUrl_matchesDomainNameWithUnderscore() throws Exception {
+        String url = "http://a_nd.r_oid.com";
+        assertTrue("Should match underscore in domain name",
+                PatternsCompat.WEB_URL.matcher(url).matches());
+
+        url = "a_nd.r_oid.com";
+        assertTrue("Should match underscore in domain name",
+                PatternsCompat.WEB_URL.matcher(url).matches());
+    }
+
+    @Test
+    public void testWebUrl_matchesPathAndQueryWithDollarSign() throws Exception {
+        String url = "http://android.com/path$?v=$val";
+        assertTrue("Should match dollar sign in path/query",
+                PatternsCompat.WEB_URL.matcher(url).matches());
+
+        url = "android.com/path$?v=$val";
+        assertTrue("Should match dollar sign in path/query",
+                PatternsCompat.WEB_URL.matcher(url).matches());
+    }
+
+    @Test
+    public void testWebUrl_matchesEmptyPathWithQueryParams() throws Exception {
+        String url = "http://android.com?q=v";
+        assertTrue("Should match empty path with query param",
+                PatternsCompat.WEB_URL.matcher(url).matches());
+
+        url = "android.com?q=v";
+        assertTrue("Should match empty path with query param",
+                PatternsCompat.WEB_URL.matcher(url).matches());
+
+        url = "http://android.com/?q=v";
+        assertTrue("Should match empty path with query param",
+                PatternsCompat.WEB_URL.matcher(url).matches());
+
+        url = "android.com/?q=v";
+        assertTrue("Should match empty path with query param",
+                PatternsCompat.WEB_URL.matcher(url).matches());
+    }
+
+    // Tests for PatternsCompat.AUTOLINK_WEB_URL
+
+    @Test
+    public void testAutoLinkWebUrl_matchesValidUrlWithSchemeAndHostname() throws Exception {
+        String url = "http://www.android.com";
+        assertTrue("Should match URL with scheme and hostname",
+                PatternsCompat.AUTOLINK_WEB_URL.matcher(url).matches());
+    }
+
+    @Test
+    public void testAutoLinkWebUrl_matchesValidUrlWithSchemeHostnameAndNewTld() throws Exception {
+        String url = "http://www.android.me";
+        assertTrue("Should match URL with scheme, hostname and new TLD",
+                PatternsCompat.AUTOLINK_WEB_URL.matcher(url).matches());
+    }
+
+    @Test
+    public void testAutoLinkWebUrl_matchesValidUrlWithHostnameAndNewTld() throws Exception {
+        String url = "android.me";
+        assertTrue("Should match URL with hostname and new TLD",
+                PatternsCompat.AUTOLINK_WEB_URL.matcher(url).matches());
+
+        url = "android.camera";
+        assertTrue("Should match URL with hostname and new TLD",
+                PatternsCompat.AUTOLINK_WEB_URL.matcher(url).matches());
+    }
+
+    @Test
+    public void testAutoLinkWebUrl_matchesChinesePunycodeUrlWithProtocol() throws Exception {
+        String url = "http://xn--fsqu00a.xn--0zwm56d";
+        assertTrue("Should match Chinese Punycode URL with protocol",
+                PatternsCompat.AUTOLINK_WEB_URL.matcher(url).matches());
+    }
+
+    @Test
+    public void testAutoLinkWebUrl_matchesChinesePunycodeUrlWithoutProtocol() throws Exception {
+        String url = "xn--fsqu00a.xn--0zwm56d";
+        assertTrue("Should match Chinese Punycode URL without protocol",
+                PatternsCompat.AUTOLINK_WEB_URL.matcher(url).matches());
+    }
+
+    @Test
+    public void testAutoLinkWebUrl_matchesArabicPunycodeUrlWithProtocol() throws Exception {
+        String url = "http://xn--4gbrim.xn--rmckbbajlc6dj7bxne2c.xn--wgbh1c/ar/default.aspx";
+        assertTrue("Should match Arabic Punycode URL with protocol",
+                PatternsCompat.AUTOLINK_WEB_URL.matcher(url).matches());
+    }
+
+    @Test
+    public void testAutoLinkWebUrl_matchesArabicPunycodeUrlWithoutProtocol() throws Exception {
+        String url = "xn--4gbrim.xn--rmckbbajlc6dj7bxne2c.xn--wgbh1c/ar/default.aspx";
+        assertTrue("Should match Arabic Punycode URL without protocol",
+                PatternsCompat.AUTOLINK_WEB_URL.matcher(url).matches());
+    }
+
+    @Test
+    public void testAutoLinkWebUrl_doesNotMatchPunycodeTldThatStartsWithDash() throws Exception {
+        String url = "http://xn--fsqu00a.-xn--0zwm56d";
+        assertFalse("Should not match Punycode TLD that starts with dash",
+                PatternsCompat.AUTOLINK_WEB_URL.matcher(url).matches());
+    }
+
+    @Test
+    public void testAutoLinkWebUrl_doesNotMatchPunycodeTldThatEndsWithDash() throws Exception {
+        String url = "http://xn--fsqu00a.xn--0zwm56d-";
+        assertFalse("Should not match Punycode TLD that ends with dash",
+                PatternsCompat.AUTOLINK_WEB_URL.matcher(url).matches());
+    }
+
+    @Test
+    public void testAutoLinkWebUrl_matchesUrlWithUnicodeDomainName() throws Exception {
+        String url = "http://\uD604\uAE08\uC601\uC218\uC99D.kr";
+        assertTrue("Should match URL with Unicode domain name",
+                PatternsCompat.AUTOLINK_WEB_URL.matcher(url).matches());
+
+        url = "\uD604\uAE08\uC601\uC218\uC99D.kr";
+        assertTrue("hould match URL without protocol and with Unicode domain name",
+                PatternsCompat.AUTOLINK_WEB_URL.matcher(url).matches());
+    }
+
+    @Test
+    public void testAutoLinkWebUrl_matchesUrlWithUnicodeTld() throws Exception {
+        String url = "\uB3C4\uBA54\uC778.\uD55C\uAD6D";
+        assertTrue("Should match URL with Unicode TLD",
+                PatternsCompat.AUTOLINK_WEB_URL.matcher(url).matches());
+    }
+
+    @Test
+    public void testAutoLinkWebUrl_matchesUrlWithUnicodePath() throws Exception {
+        String url = "http://brainstormtech.blogs.fortune.cnn.com/2010/03/11/" +
+                "top-five-moments-from-eric-schmidt\u2019s-talk-in-abu-dhabi/";
+        assertTrue("Should match URL with Unicode path",
+                PatternsCompat.AUTOLINK_WEB_URL.matcher(url).matches());
+    }
+
+    @Test
+    public void testAutoLinkWebUrl_doesNotMatchValidUrlWithInvalidProtocol() throws Exception {
+        String url = "ftp://www.example.com";
+        assertFalse("Should not match URL with invalid protocol",
+                PatternsCompat.AUTOLINK_WEB_URL.matcher(url).matches());
+    }
+
+    @Test
+    public void testAutoLinkWebUrl_matchesValidUrlWithPort() throws Exception {
+        String url = "http://www.example.com:8080";
+        assertTrue("Should match URL with port",
+                PatternsCompat.AUTOLINK_WEB_URL.matcher(url).matches());
+    }
+
+    @Test
+    public void testAutoLinkWebUrl_matchesUrlWithPortAndQuery() throws Exception {
+        String url = "http://www.example.com:8080/?foo=bar";
+        assertTrue("Should match URL with port and query",
+                PatternsCompat.AUTOLINK_WEB_URL.matcher(url).matches());
+    }
+
+    @Test
+    public void testAutoLinkWebUrl_matchesUrlWithTilde() throws Exception {
+        String url = "http://www.example.com:8080/~user/?foo=bar";
+        assertTrue("Should match URL with tilde",
+                PatternsCompat.AUTOLINK_WEB_URL.matcher(url).matches());
+    }
+
+    @Test
+    public void testAutoLinkWebUrl_matchesProtocolCaseInsensitive() throws Exception {
+        String url = "hTtP://android.com";
+        assertTrue("Protocol matching should be case insensitive",
+                PatternsCompat.AUTOLINK_WEB_URL.matcher(url).matches());
+    }
+
+    @Test
+    public void testAutoLinkWebUrl_matchesUrlStartingWithHttpAndDoesNotHaveTld() throws Exception {
+        String url = "http://android/#notld///a/n/d/r/o/i/d&p1=1&p2=2";
+        assertTrue("Should match URL without a TLD and starting with http ",
+                PatternsCompat.AUTOLINK_WEB_URL.matcher(url).matches());
+    }
+
+    @Test
+    public void testAutoLinkWebUrl_doesNotMatchUrlsWithoutProtocolAndWithUnknownTld()
+            throws Exception {
+        String url = "thank.you";
+        assertFalse("Should not match URL that does not start with a protocol and " +
+                        "does not contain a known TLD",
+                PatternsCompat.AUTOLINK_WEB_URL.matcher(url).matches());
+    }
+
+    @Test
+    public void testAutoLinkWebUrl_doesNotPartiallyMatchUnknownProtocol() throws Exception {
+        String url = "ftp://foo.bar/baz";
+        assertFalse("Should not partially match URL with unknown protocol",
+                PatternsCompat.AUTOLINK_WEB_URL.matcher(url).find());
+    }
+
+    @Test
+    public void testAutoLinkWebUrl_matchesValidUrlWithEmoji() throws Exception {
+        String url = "Thank\u263A.com";
+        assertTrue("Should match URL with emoji",
+                PatternsCompat.AUTOLINK_WEB_URL.matcher(url).matches());
+    }
+
+    @Test
+    public void testAutoLinkWebUrl_doesNotMatchUrlsWithEmojiWithoutProtocolAndWithoutKnownTld()
+            throws Exception {
+        String url = "Thank\u263A.you";
+        assertFalse("Should not match URLs containing emoji and with unknown TLD",
+                PatternsCompat.AUTOLINK_WEB_URL.matcher(url).matches());
+    }
+
+    @Test
+    public void testAutoLinkWebUrl_doesNotMatchEmailAddress()
+            throws Exception {
+        String url = "android@android.com";
+        assertFalse("Should not match email address",
+                PatternsCompat.AUTOLINK_WEB_URL.matcher(url).matches());
+    }
+
+    @Test
+    public void testAutoLinkWebUrl_matchesDomainNameWithSurrogatePairs() throws Exception {
+        String url = "android\uD83C\uDF38.com";
+        assertTrue("Should match domain name with Unicode surrogate pairs",
+                PatternsCompat.AUTOLINK_WEB_URL.matcher(url).matches());
+    }
+
+    @Test
+    public void testAutoLinkWebUrl_matchesTldWithSurrogatePairs() throws Exception {
+        String url = "http://android.\uD83C\uDF38com";
+        assertTrue("Should match TLD with Unicode surrogate pairs",
+                PatternsCompat.AUTOLINK_WEB_URL.matcher(url).matches());
+    }
+
+    @Test
+    public void testAutoLinkWebUrl_matchesPathWithSurrogatePairs() throws Exception {
+        String url = "http://android.com/path-with-\uD83C\uDF38?v=\uD83C\uDF38";
+        assertTrue("Should match path and query with Unicode surrogate pairs",
+                PatternsCompat.AUTOLINK_WEB_URL.matcher(url).matches());
+    }
+
+    @Test
+    public void testAutoLinkWebUrl_doesNotMatchUrlWithExcludedSurrogate() throws Exception {
+        String url = "http://android\uD83F\uDFFE.com";
+        assertFalse("Should not match URL with excluded Unicode surrogate pair",
+                PatternsCompat.AUTOLINK_WEB_URL.matcher(url).matches());
+    }
+
+    @Test
+    public void testAutoLinkWebUrl_doesNotMatchUnicodeSpaces() throws Exception {
+        String part1 = "http://and";
+        String part2 = "roid";
+        String[] emptySpaces = new String[]{
+                "\u00A0", // no-break space
+                "\u2000", // en quad
+                "\u2001", // em quad
+                "\u2002", // en space
+                "\u2003", // em space
+                "\u2004", // three-per-em space
+                "\u2005", // four-per-em space
+                "\u2006", // six-per-em space
+                "\u2007", // figure space
+                "\u2008", // punctuation space
+                "\u2009", // thin space
+                "\u200A", // hair space
+                "\u2028", // line separator
+                "\u2029", // paragraph separator
+                "\u202F", // narrow no-break space
+                "\u3000" // ideographic space
+        };
+
+        for (String emptySpace : emptySpaces) {
+            String url = part1 + emptySpace + part2;
+            assertFalse("Should not match empty space - code:" + emptySpace.codePointAt(0),
+                    PatternsCompat.AUTOLINK_WEB_URL.matcher(url).matches());
+        }
+    }
+
+    @Test
+    public void testAutoLinkWebUrl_matchesDomainNameWithDash() throws Exception {
+        String url = "http://a-nd.r-oid.com";
+        assertTrue("Should match dash in domain name",
+                PatternsCompat.AUTOLINK_WEB_URL.matcher(url).matches());
+
+        url = "a-nd.r-oid.com";
+        assertTrue("Should match dash in domain name",
+                PatternsCompat.AUTOLINK_WEB_URL.matcher(url).matches());
+    }
+
+    @Test
+    public void testAutoLinkWebUrl_matchesDomainNameWithUnderscore() throws Exception {
+        String url = "http://a_nd.r_oid.com";
+        assertTrue("Should match underscore in domain name",
+                PatternsCompat.AUTOLINK_WEB_URL.matcher(url).matches());
+
+        url = "a_nd.r_oid.com";
+        assertTrue("Should match underscore in domain name",
+                PatternsCompat.AUTOLINK_WEB_URL.matcher(url).matches());
+    }
+
+    @Test
+    public void testAutoLinkWebUrl_matchesPathAndQueryWithDollarSign() throws Exception {
+        String url = "http://android.com/path$?v=$val";
+        assertTrue("Should match dollar sign in path/query",
+                PatternsCompat.AUTOLINK_WEB_URL.matcher(url).matches());
+
+        url = "android.com/path$?v=$val";
+        assertTrue("Should match dollar sign in path/query",
+                PatternsCompat.AUTOLINK_WEB_URL.matcher(url).matches());
+    }
+
+    @Test
+    public void testAutoLinkWebUrl_matchesEmptyPathWithQueryParams() throws Exception {
+        String url = "http://android.com?q=v";
+        assertTrue("Should match empty path with query param",
+                PatternsCompat.AUTOLINK_WEB_URL.matcher(url).matches());
+
+        url = "android.com?q=v";
+        assertTrue("Should match empty path with query param",
+                PatternsCompat.AUTOLINK_WEB_URL.matcher(url).matches());
+
+        url = "http://android.com/?q=v";
+        assertTrue("Should match empty path with query param",
+                PatternsCompat.AUTOLINK_WEB_URL.matcher(url).matches());
+
+        url = "android.com/?q=v";
+        assertTrue("Should match empty path with query param",
+                PatternsCompat.AUTOLINK_WEB_URL.matcher(url).matches());
+    }
+
+    // Tests for PatternsCompat.IP_ADDRESS
+
+    @Test
+    public void testIpPattern() throws Exception {
+        boolean t;
+
+        t = PatternsCompat.IP_ADDRESS.matcher("172.29.86.3").matches();
+        assertTrue("Valid IP", t);
+
+        t = PatternsCompat.IP_ADDRESS.matcher("1234.4321.9.9").matches();
+        assertFalse("Invalid IP", t);
+    }
+
+    // Tests for PatternsCompat.DOMAIN_NAME
+
+    @Test
+    public void testDomain_matchesPunycodeTld() throws Exception {
+        String domain = "xn--fsqu00a.xn--0zwm56d";
+        assertTrue("Should match domain name in Punycode",
+                PatternsCompat.DOMAIN_NAME.matcher(domain).matches());
+    }
+
+    @Test
+    public void testDomain_doesNotMatchPunycodeThatStartsWithDash() throws Exception {
+        String domain = "xn--fsqu00a.-xn--0zwm56d";
+        assertFalse("Should not match Punycode TLD that starts with a dash",
+                PatternsCompat.DOMAIN_NAME.matcher(domain).matches());
+    }
+
+    @Test
+    public void testDomain_doesNotMatchPunycodeThatEndsWithDash() throws Exception {
+        String domain = "xn--fsqu00a.xn--0zwm56d-";
+        assertFalse("Should not match Punycode TLD that ends with a dash",
+                PatternsCompat.DOMAIN_NAME.matcher(domain).matches());
+    }
+
+    @Test
+    public void testDomain_doesNotMatchPunycodeLongerThanAllowed() throws Exception {
+        String tld = "xn--";
+        for(int i=0; i<=6; i++) {
+            tld += "0123456789";
+        }
+        String domain = "xn--fsqu00a." + tld;
+        assertFalse("Should not match Punycode TLD that is longer than 63 chars",
+                PatternsCompat.DOMAIN_NAME.matcher(domain).matches());
+    }
+
+    @Test
+    public void testDomain_matchesObsoleteTld() throws Exception {
+        String domain = "test.yu";
+        assertTrue("Should match domain names with obsolete TLD",
+                PatternsCompat.DOMAIN_NAME.matcher(domain).matches());
+    }
+
+    @Test
+    public void testDomain_matchesWithSubDomain() throws Exception {
+        String domain = "mail.example.com";
+        assertTrue("Should match domain names with subdomains",
+                PatternsCompat.DOMAIN_NAME.matcher(domain).matches());
+    }
+
+    @Test
+    public void testDomain_matchesWithoutSubDomain() throws Exception {
+        String domain = "android.me";
+        assertTrue("Should match domain names without subdomains",
+                PatternsCompat.DOMAIN_NAME.matcher(domain).matches());
+    }
+
+    @Test
+    public void testDomain_matchesUnicodeDomainNames() throws Exception {
+        String domain = "\uD604\uAE08\uC601\uC218\uC99D.kr";
+        assertTrue("Should match unicodedomain names",
+                PatternsCompat.DOMAIN_NAME.matcher(domain).matches());
+    }
+
+    @Test
+    public void testDomain_doesNotMatchInvalidDomain() throws Exception {
+        String domain = "__+&42.xer";
+        assertFalse("Should not match invalid domain name",
+                PatternsCompat.DOMAIN_NAME.matcher(domain).matches());
+    }
+
+    @Test
+    public void testDomain_matchesPunycodeArabicDomainName() throws Exception {
+        String domain = "xn--4gbrim.xn----rmckbbajlc6dj7bxne2c.xn--wgbh1c";
+        assertTrue("Should match Punycode Arabic domain name",
+                PatternsCompat.DOMAIN_NAME.matcher(domain).matches());
+    }
+
+    @Test
+    public void testDomain_matchesDomainNameWithDash() throws Exception {
+        String url = "http://a-nd.r-oid.com";
+        assertTrue("Should match dash in domain name",
+                PatternsCompat.AUTOLINK_WEB_URL.matcher(url).matches());
+
+        url = "a-nd.r-oid.com";
+        assertTrue("Should match dash in domain name",
+                PatternsCompat.AUTOLINK_WEB_URL.matcher(url).matches());
+    }
+
+    @Test
+    public void testDomain_matchesDomainNameWithUnderscore() throws Exception {
+        String url = "http://a_nd.r_oid.com";
+        assertTrue("Should match underscore in domain name",
+                PatternsCompat.AUTOLINK_WEB_URL.matcher(url).matches());
+
+        url = "a_nd.r_oid.com";
+        assertTrue("Should match underscore in domain name",
+                PatternsCompat.AUTOLINK_WEB_URL.matcher(url).matches());
+    }
+
+    // Tests for PatternsCompat.AUTOLINK_EMAIL_ADDRESS
+
+    @Test
+    public void testAutoLinkEmailAddress_matchesShortValidEmail() throws Exception {
+        String email = "a@a.co";
+        assertTrue("Should match short valid email: " + email,
+                PatternsCompat.AUTOLINK_EMAIL_ADDRESS.matcher(email).matches());
+    }
+
+    @Test
+    public void testAutoLinkEmailAddress_matchesRegularEmail() throws Exception {
+        String email = "email@android.com";
+        assertTrue("Should match email: " + email,
+                PatternsCompat.AUTOLINK_EMAIL_ADDRESS.matcher(email).matches());
+    }
+
+    @Test
+    public void testAutoLinkEmailAddress_matchesEmailWithMultipleSubdomains() throws Exception {
+        String email = "email@e.somelongdomainnameforandroid.abc.uk";
+        assertTrue("Should match email: " + email,
+                PatternsCompat.AUTOLINK_EMAIL_ADDRESS.matcher(email).matches());
+    }
+
+    @Test
+    public void testAutoLinkEmailAddress_matchesLocalPartWithDot() throws Exception {
+        String email = "e.mail@android.com";
+        assertTrue("Should match email: " + email,
+                PatternsCompat.AUTOLINK_EMAIL_ADDRESS.matcher(email).matches());
+    }
+
+    @Test
+    public void testAutoLinkEmailAddress_matchesLocalPartWithPlus() throws Exception {
+        String email = "e+mail@android.com";
+        assertTrue("Should match email: " + email,
+                PatternsCompat.AUTOLINK_EMAIL_ADDRESS.matcher(email).matches());
+    }
+
+    @Test
+    public void testAutoLinkEmailAddress_matchesLocalPartWithUnderscore() throws Exception {
+        String email = "e_mail@android.com";
+        assertTrue("Should match email: " + email,
+                PatternsCompat.AUTOLINK_EMAIL_ADDRESS.matcher(email).matches());
+    }
+
+    @Test
+    public void testAutoLinkEmailAddress_matchesLocalPartWithDash() throws Exception {
+        String email = "e-mail@android.com";
+        assertTrue("Should match email: " + email,
+                PatternsCompat.AUTOLINK_EMAIL_ADDRESS.matcher(email).matches());
+    }
+
+    @Test
+    public void testAutoLinkEmailAddress_matchesLocalPartWithApostrophe() throws Exception {
+        String email = "e'mail@android.com";
+        assertTrue("Should match email: " + email,
+                PatternsCompat.AUTOLINK_EMAIL_ADDRESS.matcher(email).matches());
+    }
+
+    @Test
+    public void testAutoLinkEmailAddress_matchesLocalPartWithDigits() throws Exception {
+        String email = "123@android.com";
+        assertTrue("Should match email: " + email,
+                PatternsCompat.AUTOLINK_EMAIL_ADDRESS.matcher(email).matches());
+    }
+
+    @Test
+    public void testAutoLinkEmailAddress_matchesUnicodeLocalPart() throws Exception {
+        String email = "\uD604\uAE08\uC601\uC218\uC99D@android.kr";
+        assertTrue("Should match email: " + email,
+                PatternsCompat.AUTOLINK_EMAIL_ADDRESS.matcher(email).matches());
+    }
+
+    @Test
+    public void testAutoLinkEmailAddress_matchesLocalPartWithEmoji() throws Exception {
+        String email = "smiley\u263A@android.com";
+        assertTrue("Should match email: " + email,
+                PatternsCompat.AUTOLINK_EMAIL_ADDRESS.matcher(email).matches());
+    }
+
+    @Test
+    public void testAutoLinkEmailAddress_matchesLocalPartWithSurrogatePairs() throws Exception {
+        String email = "\uD83C\uDF38@android.com";
+        assertTrue("Should match email: " + email,
+                PatternsCompat.AUTOLINK_EMAIL_ADDRESS.matcher(email).matches());
+    }
+
+    @Test
+    public void testAutoLinkEmailAddress_matchesDomainWithDash() throws Exception {
+        String email = "email@an-droid.com";
+        assertTrue("Should match email: " + email,
+                PatternsCompat.AUTOLINK_EMAIL_ADDRESS.matcher(email).matches());
+    }
+
+    @Test
+    public void testAutoLinkEmailAddress_matchesUnicodeDomain() throws Exception {
+        String email = "email@\uD604\uAE08\uC601\uC218\uC99D.kr";
+        assertTrue("Should match email: " + email,
+                PatternsCompat.AUTOLINK_EMAIL_ADDRESS.matcher(email).matches());
+    }
+
+    @Test
+    public void testAutoLinkEmailAddress_matchesUnicodeLocalPartAndDomain() throws Exception {
+        String email = "\uD604\uAE08\uC601\uC218\uC99D@\uD604\uAE08\uC601\uC218\uC99D.kr";
+        assertTrue("Should match email: " + email,
+                PatternsCompat.AUTOLINK_EMAIL_ADDRESS.matcher(email).matches());
+    }
+
+    @Test
+    public void testAutoLinkEmailAddress_matchesDomainWithEmoji() throws Exception {
+        String email = "smiley@\u263Aandroid.com";
+        assertTrue("Should match email: " + email,
+                PatternsCompat.AUTOLINK_EMAIL_ADDRESS.matcher(email).matches());
+    }
+
+    @Test
+    public void testAutoLinkEmailAddress_matchesDomainWithSurrogatePairs() throws Exception {
+        String email = "email@\uD83C\uDF38android.com";
+        assertTrue("Should match email: " + email,
+                PatternsCompat.AUTOLINK_EMAIL_ADDRESS.matcher(email).matches());
+    }
+
+    @Test
+    public void testAutoLinkEmailAddress_matchesLocalPartAndDomainWithSurrogatePairs()
+            throws Exception {
+        String email = "\uD83C\uDF38@\uD83C\uDF38android.com";
+        assertTrue("Should match email: " + email,
+                PatternsCompat.AUTOLINK_EMAIL_ADDRESS.matcher(email).matches());
+    }
+
+    @Test
+    public void testAutoLinkEmailAddress_doesNotMatchStringWithoutAtSign() throws Exception {
+        String email = "android.com";
+        assertFalse("Should not match email: " + email,
+                PatternsCompat.AUTOLINK_EMAIL_ADDRESS.matcher(email).matches());
+    }
+
+    @Test
+    public void testAutoLinkEmailAddress_doesNotMatchPlainString() throws Exception {
+        String email = "email";
+        assertFalse("Should not match email: " + email,
+                PatternsCompat.AUTOLINK_EMAIL_ADDRESS.matcher(email).matches());
+    }
+
+    @Test
+    public void testAutoLinkEmailAddress_doesNotMatchStringWithMultipleAtSigns() throws Exception {
+        String email = "email@android@android.com";
+        assertFalse("Should not match email: " + email,
+                PatternsCompat.AUTOLINK_EMAIL_ADDRESS.matcher(email).matches());
+    }
+
+    @Test
+    public void testAutoLinkEmailAddress_doesNotMatchEmailWithoutTld() throws Exception {
+        String email = "email@android";
+        assertFalse("Should not match email: " + email,
+                PatternsCompat.AUTOLINK_EMAIL_ADDRESS.matcher(email).matches());
+    }
+
+    @Test
+    public void testAutoLinkEmailAddress_doesNotMatchLocalPartEndingWithDot() throws Exception {
+        String email = "email.@android.com";
+        assertFalse("Should not match email: " + email,
+                PatternsCompat.AUTOLINK_EMAIL_ADDRESS.matcher(email).matches());
+    }
+
+    @Test
+    public void testAutoLinkEmailAddress_doesNotMatchLocalPartStartingWithDot() throws Exception {
+        String email = ".email@android.com";
+        assertFalse("Should not match email: " + email,
+                PatternsCompat.AUTOLINK_EMAIL_ADDRESS.matcher(email).matches());
+    }
+
+    @Test
+    public void testAutoLinkEmailAddress_doesNotMatchDomainStartingWithDash() throws Exception {
+        String email = "email@-android.com";
+        assertFalse("Should not match email: " + email,
+                PatternsCompat.AUTOLINK_EMAIL_ADDRESS.matcher(email).matches());
+    }
+
+    @Test
+    public void testAutoLinkEmailAddress_doesNotMatchDomainWithConsecutiveDots() throws Exception {
+        String email = "email@android..com";
+        assertFalse("Should not match email: " + email,
+                PatternsCompat.AUTOLINK_EMAIL_ADDRESS.matcher(email).matches());
+    }
+
+    @Test
+    public void testAutoLinkEmailAddress_doesNotMatchEmailWithIpAsDomain() throws Exception {
+        String email = "email@127.0.0.1";
+        assertFalse("Should not match email: " + email,
+                PatternsCompat.AUTOLINK_EMAIL_ADDRESS.matcher(email).matches());
+    }
+
+    @Test
+    public void testAutoLinkEmailAddress_doesNotMatchEmailWithInvalidTld() throws Exception {
+        String email = "email@android.c";
+        assertFalse("Should not match email: " + email,
+                PatternsCompat.AUTOLINK_EMAIL_ADDRESS.matcher(email).matches());
+    }
+
+    @Test
+    public void testAutoLinkEmailAddress_matchesLocalPartUpTo64Chars() throws Exception {
+        String localPart = "";
+        for (int i = 0; i < 64; i++) {
+            localPart += "a";
+        }
+        String email = localPart + "@android.com";
+
+        assertTrue("Should match local part of length: " + localPart.length(),
+                PatternsCompat.AUTOLINK_EMAIL_ADDRESS.matcher(email).matches());
+
+        email = localPart + "a@android.com";
+        assertFalse("Should not match local part of length: " + localPart.length(),
+                PatternsCompat.AUTOLINK_EMAIL_ADDRESS.matcher(email).matches());
+    }
+
+    @Test
+    public void testAutoLinkEmailAddress_matchesSubdomainUpTo63Chars() throws Exception {
+        String subdomain = "";
+        for (int i = 0; i < 63; i++) {
+            subdomain += "a";
+        }
+        String email = "email@" + subdomain + ".com";
+
+        assertTrue("Should match subdomain of length: " + subdomain.length(),
+                PatternsCompat.AUTOLINK_EMAIL_ADDRESS.matcher(email).matches());
+
+        subdomain += "a";
+        email = "email@" + subdomain + ".com";
+        assertFalse("Should not match local part of length: " + subdomain.length(),
+                PatternsCompat.AUTOLINK_EMAIL_ADDRESS.matcher(email).matches());
+    }
+
+    @Test
+    public void testAutoLinkEmailAddress_matchesDomainUpTo255Chars() throws Exception {
+        String longDomain = "";
+        while (longDomain.length() <= 250) {
+            longDomain += "d.";
+        }
+        longDomain += "com";
+        assertEquals(255, longDomain.length());
+        String email = "a@" + longDomain;
+
+        assertTrue("Should match domain of length: " + longDomain.length(),
+                PatternsCompat.AUTOLINK_EMAIL_ADDRESS.matcher(email).matches());
+
+        email = email + "m";
+        assertEquals(258, email.length());
+        assertFalse("Should not match domain of length: " + longDomain.length(),
+                PatternsCompat.AUTOLINK_EMAIL_ADDRESS.matcher(email).matches());
+    }
+}
diff --git a/v4/tests/java/android/support/v4/view/GravityCompatTest.java b/compat/tests/java/android/support/v4/view/GravityCompatTest.java
similarity index 100%
rename from v4/tests/java/android/support/v4/view/GravityCompatTest.java
rename to compat/tests/java/android/support/v4/view/GravityCompatTest.java
diff --git a/v4/tests/java/android/support/v4/view/MarginLayoutParamsCompatTest.java b/compat/tests/java/android/support/v4/view/MarginLayoutParamsCompatTest.java
similarity index 100%
rename from v4/tests/java/android/support/v4/view/MarginLayoutParamsCompatTest.java
rename to compat/tests/java/android/support/v4/view/MarginLayoutParamsCompatTest.java
diff --git a/v4/tests/java/android/support/v4/view/ViewCompatTest.java b/compat/tests/java/android/support/v4/view/ViewCompatTest.java
similarity index 100%
rename from v4/tests/java/android/support/v4/view/ViewCompatTest.java
rename to compat/tests/java/android/support/v4/view/ViewCompatTest.java
diff --git a/compat/tests/java/android/support/v4/view/ViewPropertyAnimatorCompatTest.java b/compat/tests/java/android/support/v4/view/ViewPropertyAnimatorCompatTest.java
new file mode 100644
index 0000000..b04c195
--- /dev/null
+++ b/compat/tests/java/android/support/v4/view/ViewPropertyAnimatorCompatTest.java
@@ -0,0 +1,132 @@
+/*
+ * Copyright (C) 2016 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 android.support.v4.view;
+
+import android.app.Activity;
+import android.support.compat.test.R;
+import android.support.test.InstrumentationRegistry;
+import android.support.v4.BaseInstrumentationTestCase;
+import android.test.suitebuilder.annotation.MediumTest;
+import android.view.View;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+import org.junit.Before;
+import org.junit.Test;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+@MediumTest
+public class ViewPropertyAnimatorCompatTest extends BaseInstrumentationTestCase<VpaActivity> {
+
+    private static final int WAIT_TIMEOUT_MS = 200;
+
+    private View mView;
+    private int mNumListenerCalls = 0;
+
+    public ViewPropertyAnimatorCompatTest() {
+        super(VpaActivity.class);
+    }
+
+    @Before
+    public void setUp() {
+        final Activity activity = mActivityTestRule.getActivity();
+        mView = activity.findViewById(R.id.view);
+    }
+
+    @Test
+    public void testWithEndAction() throws Throwable {
+        final CountDownLatch latch1 = new CountDownLatch(1);
+        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
+            @Override
+            public void run() {
+                ViewCompat.animate(mView).alpha(0).setDuration(100).withEndAction(new Runnable() {
+                    @Override
+                    public void run() {
+                        latch1.countDown();
+                    }
+                });
+            }
+        });
+        assertTrue(latch1.await(300, TimeUnit.MILLISECONDS));
+
+        // This test ensures that the endAction listener will be called exactly once
+        mNumListenerCalls = 0;
+        final CountDownLatch latch2 = new CountDownLatch(1);
+        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
+            @Override
+            public void run() {
+                ViewCompat.animate(mView).alpha(0).setDuration(50).withEndAction(new Runnable() {
+                    @Override
+                    public void run() {
+                        ++mNumListenerCalls;
+                        ViewCompat.animate(mView).alpha(1);
+                        latch2.countDown();
+                    }
+                });
+            }
+        });
+        assertTrue(latch2.await(200, TimeUnit.MILLISECONDS));
+        waitAndCheckCallCount(1);
+    }
+
+    @Test
+    public void testWithStartAction() throws Throwable {
+        final CountDownLatch latch1 = new CountDownLatch(1);
+        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
+            @Override
+            public void run() {
+                ViewCompat.animate(mView).alpha(0).setDuration(100).withStartAction(new Runnable() {
+                    @Override
+                    public void run() {
+                        latch1.countDown();
+                    }
+                });
+            }
+        });
+        assertTrue(latch1.await(100, TimeUnit.MILLISECONDS));
+
+        // This test ensures that the startAction listener will be called exactly once
+        mNumListenerCalls = 0;
+        final CountDownLatch latch2 = new CountDownLatch(1);
+        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
+            @Override
+            public void run() {
+                ViewCompat.animate(mView).alpha(0).setDuration(50).withStartAction(new Runnable() {
+                    @Override
+                    public void run() {
+                        ++mNumListenerCalls;
+                        ViewCompat.animate(mView).alpha(1);
+                        latch2.countDown();
+                    }
+                });
+            }
+        });
+        assertTrue(latch2.await(200, TimeUnit.MILLISECONDS));
+        waitAndCheckCallCount(1);
+    }
+
+    void waitAndCheckCallCount(final int count) throws InterruptedException {
+        int timeLeft = WAIT_TIMEOUT_MS;
+        while (mNumListenerCalls != count) {
+            Thread.sleep(20);
+            timeLeft -= 20;
+            assertTrue(timeLeft > 0);
+        }
+    }
+}
diff --git a/compat/tests/java/android/support/v4/view/VpaActivity.java b/compat/tests/java/android/support/v4/view/VpaActivity.java
new file mode 100644
index 0000000..7b19151
--- /dev/null
+++ b/compat/tests/java/android/support/v4/view/VpaActivity.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2016 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 android.support.v4.view;
+
+import android.support.compat.test.R;
+import android.support.v4.BaseTestActivity;
+
+public class VpaActivity extends BaseTestActivity {
+    @Override
+    protected int getContentViewLayoutResId() {
+        return R.layout.vpa_activity;
+    }
+}
diff --git a/v4/tests/java/android/support/v4/widget/GingerbreadScrollerCompatTest.java b/compat/tests/java/android/support/v4/widget/GingerbreadScrollerCompatTest.java
similarity index 100%
rename from v4/tests/java/android/support/v4/widget/GingerbreadScrollerCompatTest.java
rename to compat/tests/java/android/support/v4/widget/GingerbreadScrollerCompatTest.java
diff --git a/v4/tests/java/android/support/v4/widget/IcsScrollerCompatTest.java b/compat/tests/java/android/support/v4/widget/IcsScrollerCompatTest.java
similarity index 100%
rename from v4/tests/java/android/support/v4/widget/IcsScrollerCompatTest.java
rename to compat/tests/java/android/support/v4/widget/IcsScrollerCompatTest.java
diff --git a/v4/tests/java/android/support/v4/widget/ScrollerCompatTestBase.java b/compat/tests/java/android/support/v4/widget/ScrollerCompatTestBase.java
similarity index 100%
rename from v4/tests/java/android/support/v4/widget/ScrollerCompatTestBase.java
rename to compat/tests/java/android/support/v4/widget/ScrollerCompatTestBase.java
diff --git a/compat/tests/java/android/support/v4/widget/TextViewCompatTest.java b/compat/tests/java/android/support/v4/widget/TextViewCompatTest.java
new file mode 100644
index 0000000..27a85ef
--- /dev/null
+++ b/compat/tests/java/android/support/v4/widget/TextViewCompatTest.java
@@ -0,0 +1,390 @@
+/*
+ * Copyright (C) 2015 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 android.support.v4.widget;
+
+import android.content.res.Resources;
+import android.graphics.drawable.ColorDrawable;
+import android.graphics.drawable.Drawable;
+import android.support.annotation.ColorInt;
+import android.support.compat.test.R;
+import android.support.v4.BaseInstrumentationTestCase;
+import android.support.v4.testutils.TestUtils;
+import android.support.v4.view.ViewCompat;
+import android.test.suitebuilder.annotation.MediumTest;
+import android.test.suitebuilder.annotation.SmallTest;
+import android.widget.TextView;
+import org.junit.Before;
+import org.junit.Test;
+
+import static android.support.test.espresso.Espresso.onView;
+import static android.support.test.espresso.matcher.ViewMatchers.withId;
+import static android.support.v4.testutils.LayoutDirectionActions.setLayoutDirection;
+import static android.support.v4.testutils.TextViewActions.*;
+import static org.junit.Assert.*;
+
+public class TextViewCompatTest extends BaseInstrumentationTestCase<TextViewTestActivity> {
+    private static final String TAG = "TextViewCompatTest";
+
+    private TextView mTextView;
+
+    private class TestDrawable extends ColorDrawable {
+        private int mWidth;
+        private int mHeight;
+
+        public TestDrawable(@ColorInt int color, int width, int height) {
+            super(color);
+            mWidth = width;
+            mHeight = height;
+        }
+
+        @Override
+        public int getIntrinsicWidth() {
+            return mWidth;
+        }
+
+        @Override
+        public int getIntrinsicHeight() {
+            return mHeight;
+        }
+    }
+
+    public TextViewCompatTest() {
+        super(TextViewTestActivity.class);
+    }
+
+    @Before
+    public void setUp() {
+        mTextView = (TextView) mActivityTestRule.getActivity().findViewById(R.id.text_view);
+    }
+
+    @Test
+    @SmallTest
+    public void testMaxLines() throws Throwable {
+        final int maxLinesCount = 4;
+        onView(withId(R.id.text_view)).perform(setMaxLines(maxLinesCount));
+
+        assertEquals("Empty view: Max lines must match", TextViewCompat.getMaxLines(mTextView),
+                maxLinesCount);
+
+        onView(withId(R.id.text_view)).perform(setText(R.string.test_text_short));
+        assertEquals("Short text: Max lines must match", TextViewCompat.getMaxLines(mTextView),
+                maxLinesCount);
+
+        onView(withId(R.id.text_view)).perform(setText(R.string.test_text_medium));
+        assertEquals("Medium text: Max lines must match", TextViewCompat.getMaxLines(mTextView),
+                maxLinesCount);
+
+        onView(withId(R.id.text_view)).perform(setText(R.string.test_text_long));
+        assertEquals("Long text: Max lines must match", TextViewCompat.getMaxLines(mTextView),
+                maxLinesCount);
+    }
+
+    @Test
+    @SmallTest
+    public void testMinLines() throws Throwable {
+        final int minLinesCount = 3;
+        onView(withId(R.id.text_view)).perform(setMinLines(minLinesCount));
+
+        assertEquals("Empty view: Min lines must match", TextViewCompat.getMinLines(mTextView),
+                minLinesCount);
+
+        onView(withId(R.id.text_view)).perform(setText(R.string.test_text_short));
+        assertEquals("Short text: Min lines must match", TextViewCompat.getMinLines(mTextView),
+                minLinesCount);
+
+        onView(withId(R.id.text_view)).perform(setText(R.string.test_text_medium));
+        assertEquals("Medium text: Min lines must match", TextViewCompat.getMinLines(mTextView),
+                minLinesCount);
+
+        onView(withId(R.id.text_view)).perform(setText(R.string.test_text_long));
+        assertEquals("Long text: Min lines must match", TextViewCompat.getMinLines(mTextView),
+                minLinesCount);
+    }
+
+    @Test
+    @SmallTest
+    public void testStyle() throws Throwable {
+        onView(withId(R.id.text_view)).perform(setTextAppearance(R.style.TextMediumStyle));
+
+        final Resources res = mActivityTestRule.getActivity().getResources();
+        assertTrue("Styled text view: style",
+                mTextView.getTypeface().isItalic() || (mTextView.getPaint().getTextSkewX() < 0));
+        assertEquals("Styled text view: color", mTextView.getTextColors().getDefaultColor(),
+                res.getColor(R.color.text_color));
+        assertEquals("Styled text view: size", mTextView.getTextSize(),
+                (float) res.getDimensionPixelSize(R.dimen.text_medium_size), 1.0f);
+    }
+
+    @Test
+    @SmallTest
+    public void testCompoundDrawablesRelative() throws Throwable {
+        final Drawable drawableStart = new ColorDrawable(0xFFFF0000);
+        drawableStart.setBounds(0, 0, 20, 20);
+        final Drawable drawableTop = new ColorDrawable(0xFF00FF00);
+        drawableTop.setBounds(0, 0, 30, 25);
+        final Drawable drawableEnd = new ColorDrawable(0xFF0000FF);
+        drawableEnd.setBounds(0, 0, 25, 20);
+
+        onView(withId(R.id.text_view)).perform(setText(R.string.test_text_medium));
+        onView(withId(R.id.text_view)).perform(setCompoundDrawablesRelative(drawableStart,
+                drawableTop, drawableEnd, null));
+
+        final Drawable[] drawablesAbsolute = mTextView.getCompoundDrawables();
+
+        assertEquals("Compound drawable: left", drawablesAbsolute[0], drawableStart);
+        assertEquals("Compound drawable: left width",
+                drawablesAbsolute[0].getBounds().width(), 20);
+        assertEquals("Compound drawable: left height",
+                drawablesAbsolute[0].getBounds().height(), 20);
+
+        assertEquals("Compound drawable: top", drawablesAbsolute[1], drawableTop);
+        assertEquals("Compound drawable: top width",
+                drawablesAbsolute[1].getBounds().width(), 30);
+        assertEquals("Compound drawable: top height",
+                drawablesAbsolute[1].getBounds().height(), 25);
+
+        assertEquals("Compound drawable: right", drawablesAbsolute[2], drawableEnd);
+        assertEquals("Compound drawable: right width",
+                drawablesAbsolute[2].getBounds().width(), 25);
+        assertEquals("Compound drawable: right height",
+                drawablesAbsolute[2].getBounds().height(), 20);
+
+        assertNull("Compound drawable: bottom", drawablesAbsolute[3]);
+    }
+
+    @Test
+    @SmallTest
+    public void testCompoundDrawablesRelativeRtl() throws Throwable {
+        onView(withId(R.id.text_view)).perform(setLayoutDirection(ViewCompat.LAYOUT_DIRECTION_RTL));
+
+        final Drawable drawableStart = new ColorDrawable(0xFFFF0000);
+        drawableStart.setBounds(0, 0, 20, 20);
+        final Drawable drawableTop = new ColorDrawable(0xFF00FF00);
+        drawableTop.setBounds(0, 0, 30, 25);
+        final Drawable drawableEnd = new ColorDrawable(0xFF0000FF);
+        drawableEnd.setBounds(0, 0, 25, 20);
+
+        onView(withId(R.id.text_view)).perform(setText(R.string.test_text_medium));
+        onView(withId(R.id.text_view)).perform(setCompoundDrawablesRelative(drawableStart,
+                drawableTop, drawableEnd, null));
+
+        // Check to see whether our text view is under RTL mode
+        if (ViewCompat.getLayoutDirection(mTextView) != ViewCompat.LAYOUT_DIRECTION_RTL) {
+            // This will happen on v17- devices
+            return;
+        }
+
+        final Drawable[] drawablesAbsolute = mTextView.getCompoundDrawables();
+
+        // End drawable should be returned as left
+        assertEquals("Compound drawable: left", drawablesAbsolute[0], drawableEnd);
+        assertEquals("Compound drawable: left width",
+                drawablesAbsolute[0].getBounds().width(), 25);
+        assertEquals("Compound drawable: left height",
+                drawablesAbsolute[0].getBounds().height(), 20);
+
+        assertEquals("Compound drawable: top", drawablesAbsolute[1], drawableTop);
+        assertEquals("Compound drawable: left width",
+                drawablesAbsolute[1].getBounds().width(), 30);
+        assertEquals("Compound drawable: left height",
+                drawablesAbsolute[1].getBounds().height(), 25);
+
+        // Start drawable should be returned as right
+        assertEquals("Compound drawable: right", drawablesAbsolute[2], drawableStart);
+        assertEquals("Compound drawable: left width",
+                drawablesAbsolute[2].getBounds().width(), 20);
+        assertEquals("Compound drawable: left height",
+                drawablesAbsolute[2].getBounds().height(), 20);
+
+        assertNull("Compound drawable: bottom", drawablesAbsolute[3]);
+    }
+
+    @Test
+    @SmallTest
+    public void testCompoundDrawablesRelativeWithIntrinsicBounds() throws Throwable {
+        final Drawable drawableStart = new TestDrawable(0xFFFF0000, 30, 20);
+        final Drawable drawableEnd = new TestDrawable(0xFF0000FF, 25, 45);
+        final Drawable drawableBottom = new TestDrawable(0xFF00FF00, 15, 35);
+
+        onView(withId(R.id.text_view)).perform(setText(R.string.test_text_long));
+        onView(withId(R.id.text_view)).perform(setCompoundDrawablesRelativeWithIntrinsicBounds(
+                drawableStart, null, drawableEnd, drawableBottom));
+
+        final Drawable[] drawablesAbsolute = mTextView.getCompoundDrawables();
+
+        assertEquals("Compound drawable: left", drawablesAbsolute[0], drawableStart);
+        assertEquals("Compound drawable: left width",
+                drawablesAbsolute[0].getBounds().width(), 30);
+        assertEquals("Compound drawable: left height",
+                drawablesAbsolute[0].getBounds().height(), 20);
+
+        assertNull("Compound drawable: top", drawablesAbsolute[1]);
+
+        assertEquals("Compound drawable: right", drawablesAbsolute[2], drawableEnd);
+        assertEquals("Compound drawable: right width",
+                drawablesAbsolute[2].getBounds().width(), 25);
+        assertEquals("Compound drawable: right height",
+                drawablesAbsolute[2].getBounds().height(), 45);
+
+        assertEquals("Compound drawable: bottom", drawablesAbsolute[3], drawableBottom);
+        assertEquals("Compound drawable: bottom width",
+                drawablesAbsolute[3].getBounds().width(), 15);
+        assertEquals("Compound drawable: bottom height",
+                drawablesAbsolute[3].getBounds().height(), 35);
+    }
+
+    @Test
+    @SmallTest
+    public void testCompoundDrawablesRelativeWithIntrinsicBoundsRtl() throws Throwable {
+        onView(withId(R.id.text_view)).perform(setLayoutDirection(ViewCompat.LAYOUT_DIRECTION_RTL));
+
+        final Drawable drawableStart = new TestDrawable(0xFFFF0000, 30, 20);
+        final Drawable drawableEnd = new TestDrawable(0xFF0000FF, 25, 45);
+        final Drawable drawableBottom = new TestDrawable(0xFF00FF00, 15, 35);
+
+        onView(withId(R.id.text_view)).perform(setText(R.string.test_text_long));
+        onView(withId(R.id.text_view)).perform(setCompoundDrawablesRelativeWithIntrinsicBounds(
+                drawableStart, null, drawableEnd, drawableBottom));
+
+        // Check to see whether our text view is under RTL mode
+        if (ViewCompat.getLayoutDirection(mTextView) != ViewCompat.LAYOUT_DIRECTION_RTL) {
+            // This will happen on v17- devices
+            return;
+        }
+
+        final Drawable[] drawablesAbsolute = mTextView.getCompoundDrawables();
+
+        // End drawable should be returned as left
+        assertEquals("Compound drawable: left", drawablesAbsolute[0], drawableEnd);
+        assertEquals("Compound drawable: left width",
+                drawablesAbsolute[0].getBounds().width(), 25);
+        assertEquals("Compound drawable: left height",
+                drawablesAbsolute[0].getBounds().height(), 45);
+
+        assertNull("Compound drawable: top", drawablesAbsolute[1]);
+
+        // Start drawable should be returned as right
+        assertEquals("Compound drawable: right", drawablesAbsolute[2], drawableStart);
+        assertEquals("Compound drawable: right width",
+                drawablesAbsolute[2].getBounds().width(), 30);
+        assertEquals("Compound drawable: right height",
+                drawablesAbsolute[2].getBounds().height(), 20);
+
+        assertEquals("Compound drawable: bottom", drawablesAbsolute[3], drawableBottom);
+        assertEquals("Compound drawable: bottom width",
+                drawablesAbsolute[3].getBounds().width(), 15);
+        assertEquals("Compound drawable: bottom height",
+                drawablesAbsolute[3].getBounds().height(), 35);
+    }
+
+    @Test
+    @MediumTest
+    public void testCompoundDrawablesRelativeWithIntrinsicBoundsById() throws Throwable {
+        onView(withId(R.id.text_view)).perform(setText(R.string.test_text_long));
+        onView(withId(R.id.text_view)).perform(setCompoundDrawablesRelativeWithIntrinsicBounds(
+                R.drawable.test_drawable_red, 0,
+                R.drawable.test_drawable_green, R.drawable.test_drawable_blue));
+
+        final Drawable[] drawablesAbsolute = mTextView.getCompoundDrawables();
+        final Resources res = mActivityTestRule.getActivity().getResources();
+
+        // The entire left drawable should be the specific red color
+        TestUtils.assertAllPixelsOfColor("Compound drawable: left color",
+                drawablesAbsolute[0], res.getColor(R.color.test_red));
+        assertEquals("Compound drawable: left width",
+                drawablesAbsolute[0].getBounds().width(),
+                res.getDimensionPixelSize(R.dimen.drawable_small_size));
+        assertEquals("Compound drawable: left height",
+                drawablesAbsolute[0].getBounds().height(),
+                res.getDimensionPixelSize(R.dimen.drawable_medium_size));
+
+        assertNull("Compound drawable: top", drawablesAbsolute[1]);
+
+        // The entire right drawable should be the specific green color
+        TestUtils.assertAllPixelsOfColor("Compound drawable: right color",
+                drawablesAbsolute[2], res.getColor(R.color.test_green));
+        assertEquals("Compound drawable: right width",
+                drawablesAbsolute[2].getBounds().width(),
+                res.getDimensionPixelSize(R.dimen.drawable_medium_size));
+        assertEquals("Compound drawable: right height",
+                drawablesAbsolute[2].getBounds().height(),
+                res.getDimensionPixelSize(R.dimen.drawable_large_size));
+
+        // The entire bottom drawable should be the specific blue color
+        TestUtils.assertAllPixelsOfColor("Compound drawable: bottom color",
+                drawablesAbsolute[3], res.getColor(R.color.test_blue));
+        assertEquals("Compound drawable: bottom width",
+                drawablesAbsolute[3].getBounds().width(),
+                res.getDimensionPixelSize(R.dimen.drawable_large_size));
+        assertEquals("Compound drawable: bottom height",
+                drawablesAbsolute[3].getBounds().height(),
+                res.getDimensionPixelSize(R.dimen.drawable_small_size));
+    }
+
+    @Test
+    @MediumTest
+    public void testCompoundDrawablesRelativeWithIntrinsicBoundsByIdRtl() throws Throwable {
+        onView(withId(R.id.text_view)).perform(setLayoutDirection(ViewCompat.LAYOUT_DIRECTION_RTL));
+
+        onView(withId(R.id.text_view)).perform(setText(R.string.test_text_long));
+        onView(withId(R.id.text_view)).perform(setCompoundDrawablesRelativeWithIntrinsicBounds(
+                R.drawable.test_drawable_red, 0,
+                R.drawable.test_drawable_green, R.drawable.test_drawable_blue));
+
+        // Check to see whether our text view is under RTL mode
+        if (ViewCompat.getLayoutDirection(mTextView) != ViewCompat.LAYOUT_DIRECTION_RTL) {
+            // This will happen on v17- devices
+            return;
+        }
+
+        final Drawable[] drawablesAbsolute = mTextView.getCompoundDrawables();
+        final Resources res = mActivityTestRule.getActivity().getResources();
+
+        // The entire left / end drawable should be the specific green color
+        TestUtils.assertAllPixelsOfColor("Compound drawable: left color",
+                drawablesAbsolute[0], res.getColor(R.color.test_green));
+        assertEquals("Compound drawable: left width",
+                drawablesAbsolute[0].getBounds().width(),
+                res.getDimensionPixelSize(R.dimen.drawable_medium_size));
+        assertEquals("Compound drawable: left height",
+                drawablesAbsolute[0].getBounds().height(),
+                res.getDimensionPixelSize(R.dimen.drawable_large_size));
+
+        assertNull("Compound drawable: top", drawablesAbsolute[1]);
+
+        // The entire right drawable should be the specific red color
+        TestUtils.assertAllPixelsOfColor("Compound drawable: right color",
+                drawablesAbsolute[2], res.getColor(R.color.test_red));
+        assertEquals("Compound drawable: right width",
+                drawablesAbsolute[2].getBounds().width(),
+                res.getDimensionPixelSize(R.dimen.drawable_small_size));
+        assertEquals("Compound drawable: right height",
+                drawablesAbsolute[2].getBounds().height(),
+                res.getDimensionPixelSize(R.dimen.drawable_medium_size));
+
+        // The entire bottom drawable should be the specific blue color
+        TestUtils.assertAllPixelsOfColor("Compound drawable: bottom color",
+                drawablesAbsolute[3], res.getColor(R.color.test_blue));
+        assertEquals("Compound drawable: bottom width",
+                drawablesAbsolute[3].getBounds().width(),
+                res.getDimensionPixelSize(R.dimen.drawable_large_size));
+        assertEquals("Compound drawable: bottom height",
+                drawablesAbsolute[3].getBounds().height(),
+                res.getDimensionPixelSize(R.dimen.drawable_small_size));
+    }
+}
diff --git a/compat/tests/java/android/support/v4/widget/TextViewTestActivity.java b/compat/tests/java/android/support/v4/widget/TextViewTestActivity.java
new file mode 100644
index 0000000..d99a534
--- /dev/null
+++ b/compat/tests/java/android/support/v4/widget/TextViewTestActivity.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2015 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 android.support.v4.widget;
+
+import android.support.compat.test.R;
+import android.support.v4.BaseTestActivity;
+
+public class TextViewTestActivity extends BaseTestActivity {
+    @Override
+    protected int getContentViewLayoutResId() {
+        return R.layout.text_view_activity;
+    }
+}
diff --git a/v4/tests/res/color/complex_themed_selector.xml b/compat/tests/res/color/complex_themed_selector.xml
similarity index 100%
rename from v4/tests/res/color/complex_themed_selector.xml
rename to compat/tests/res/color/complex_themed_selector.xml
diff --git a/v4/tests/res/color/complex_unthemed_selector.xml b/compat/tests/res/color/complex_unthemed_selector.xml
similarity index 100%
rename from v4/tests/res/color/complex_unthemed_selector.xml
rename to compat/tests/res/color/complex_unthemed_selector.xml
diff --git a/v4/tests/res/color/simple_themed_selector.xml b/compat/tests/res/color/simple_themed_selector.xml
similarity index 100%
rename from v4/tests/res/color/simple_themed_selector.xml
rename to compat/tests/res/color/simple_themed_selector.xml
diff --git a/v4/tests/res/drawable-hdpi/density_aware_drawable.png b/compat/tests/res/drawable-hdpi/density_aware_drawable.png
similarity index 100%
rename from v4/tests/res/drawable-hdpi/density_aware_drawable.png
rename to compat/tests/res/drawable-hdpi/density_aware_drawable.png
Binary files differ
diff --git a/v4/tests/res/drawable-ldpi/aliased_drawable_alternate.png b/compat/tests/res/drawable-ldpi/aliased_drawable_alternate.png
similarity index 100%
rename from v4/tests/res/drawable-ldpi/aliased_drawable_alternate.png
rename to compat/tests/res/drawable-ldpi/aliased_drawable_alternate.png
Binary files differ
diff --git a/v4/tests/res/drawable-mdpi/density_aware_drawable.png b/compat/tests/res/drawable-mdpi/density_aware_drawable.png
similarity index 100%
rename from v4/tests/res/drawable-mdpi/density_aware_drawable.png
rename to compat/tests/res/drawable-mdpi/density_aware_drawable.png
Binary files differ
diff --git a/v4/tests/res/drawable-mdpi/test_drawable.png b/compat/tests/res/drawable-mdpi/test_drawable.png
similarity index 100%
rename from v4/tests/res/drawable-mdpi/test_drawable.png
rename to compat/tests/res/drawable-mdpi/test_drawable.png
Binary files differ
diff --git a/v4/tests/res/drawable-xhdpi/density_aware_drawable.png b/compat/tests/res/drawable-xhdpi/density_aware_drawable.png
similarity index 100%
rename from v4/tests/res/drawable-xhdpi/density_aware_drawable.png
rename to compat/tests/res/drawable-xhdpi/density_aware_drawable.png
Binary files differ
diff --git a/v4/tests/res/drawable-xxhdpi/density_aware_drawable.png b/compat/tests/res/drawable-xxhdpi/density_aware_drawable.png
similarity index 100%
rename from v4/tests/res/drawable-xxhdpi/density_aware_drawable.png
rename to compat/tests/res/drawable-xxhdpi/density_aware_drawable.png
Binary files differ
diff --git a/v4/tests/res/drawable/test_drawable_blue.xml b/compat/tests/res/drawable/test_drawable_blue.xml
similarity index 100%
rename from v4/tests/res/drawable/test_drawable_blue.xml
rename to compat/tests/res/drawable/test_drawable_blue.xml
diff --git a/v4/tests/res/drawable/test_drawable_green.xml b/compat/tests/res/drawable/test_drawable_green.xml
similarity index 100%
rename from v4/tests/res/drawable/test_drawable_green.xml
rename to compat/tests/res/drawable/test_drawable_green.xml
diff --git a/v4/tests/res/drawable/test_drawable_red.xml b/compat/tests/res/drawable/test_drawable_red.xml
similarity index 100%
rename from v4/tests/res/drawable/test_drawable_red.xml
rename to compat/tests/res/drawable/test_drawable_red.xml
diff --git a/v4/tests/res/drawable/themed_bitmap.xml b/compat/tests/res/drawable/themed_bitmap.xml
similarity index 100%
rename from v4/tests/res/drawable/themed_bitmap.xml
rename to compat/tests/res/drawable/themed_bitmap.xml
diff --git a/v4/tests/res/drawable/themed_drawable.xml b/compat/tests/res/drawable/themed_drawable.xml
similarity index 100%
rename from v4/tests/res/drawable/themed_drawable.xml
rename to compat/tests/res/drawable/themed_drawable.xml
diff --git a/v4/tests/res/layout/text_view_activity.xml b/compat/tests/res/layout/text_view_activity.xml
similarity index 100%
rename from v4/tests/res/layout/text_view_activity.xml
rename to compat/tests/res/layout/text_view_activity.xml
diff --git a/v4/tests/res/layout/vpa_activity.xml b/compat/tests/res/layout/vpa_activity.xml
similarity index 100%
rename from v4/tests/res/layout/vpa_activity.xml
rename to compat/tests/res/layout/vpa_activity.xml
diff --git a/v4/tests/res/values-hdpi/dimens.xml b/compat/tests/res/values-hdpi/dimens.xml
similarity index 100%
rename from v4/tests/res/values-hdpi/dimens.xml
rename to compat/tests/res/values-hdpi/dimens.xml
diff --git a/v4/tests/res/values-mdpi/dimens.xml b/compat/tests/res/values-mdpi/dimens.xml
similarity index 100%
rename from v4/tests/res/values-mdpi/dimens.xml
rename to compat/tests/res/values-mdpi/dimens.xml
diff --git a/v4/tests/res/values-xhdpi/dimens.xml b/compat/tests/res/values-xhdpi/dimens.xml
similarity index 100%
rename from v4/tests/res/values-xhdpi/dimens.xml
rename to compat/tests/res/values-xhdpi/dimens.xml
diff --git a/v4/tests/res/values-xxhdpi/dimens.xml b/compat/tests/res/values-xxhdpi/dimens.xml
similarity index 100%
rename from v4/tests/res/values-xxhdpi/dimens.xml
rename to compat/tests/res/values-xxhdpi/dimens.xml
diff --git a/v4/tests/res/values/attrs.xml b/compat/tests/res/values/attrs.xml
similarity index 100%
rename from v4/tests/res/values/attrs.xml
rename to compat/tests/res/values/attrs.xml
diff --git a/v4/tests/res/values/colors.xml b/compat/tests/res/values/colors.xml
similarity index 100%
rename from v4/tests/res/values/colors.xml
rename to compat/tests/res/values/colors.xml
diff --git a/v4/tests/res/values/dimens.xml b/compat/tests/res/values/dimens.xml
similarity index 100%
rename from v4/tests/res/values/dimens.xml
rename to compat/tests/res/values/dimens.xml
diff --git a/v4/tests/res/values/drawables.xml b/compat/tests/res/values/drawables.xml
similarity index 100%
rename from v4/tests/res/values/drawables.xml
rename to compat/tests/res/values/drawables.xml
diff --git a/compat/tests/res/values/strings.xml b/compat/tests/res/values/strings.xml
new file mode 100644
index 0000000..4aebfae
--- /dev/null
+++ b/compat/tests/res/values/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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">
+    <!-- Short text for testing. -->
+    <string name="test_text_short">Lorem ipsum</string>
+    <!-- Medium text for testing. -->
+    <string name="test_text_medium">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam dui neque, suscipit quis rhoncus vitae, rhoncus hendrerit neque.</string>
+    <!-- Long text for testing. -->
+    <string name="test_text_long">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam dui neque, suscipit quis rhoncus vitae, rhoncus hendrerit neque. Proin ac mauris cursus nulla aliquam viverra. Vivamus pharetra luctus magna, lacinia imperdiet leo mollis eget. Fusce a diam ipsum. Etiam sit amet nisl et velit aliquam dignissim eget nec nisi. Duis bibendum euismod tortor non pulvinar. Nunc quis neque ultricies nulla luctus aliquet. Sed consectetur, orci ac vehicula consectetur, metus sem pellentesque turpis, sed venenatis nisi lorem vitae ante.</string>
+</resources>
\ No newline at end of file
diff --git a/v4/tests/res/values/styles.xml b/compat/tests/res/values/styles.xml
similarity index 100%
rename from v4/tests/res/values/styles.xml
rename to compat/tests/res/values/styles.xml
diff --git a/core-combined/Android.mk b/core-combined/Android.mk
new file mode 100644
index 0000000..d183f4d
--- /dev/null
+++ b/core-combined/Android.mk
@@ -0,0 +1,37 @@
+# Copyright (C) 2016 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.
+
+LOCAL_PATH := $(call my-dir)
+
+# Here is the final static library that apps can link against.
+# Applications that use this library must specify
+#
+#   LOCAL_STATIC_ANDROID_LIBRARIES := \
+#       android-support-v4
+#
+# in their makefiles to include the resources and their dependencies in their package.
+include $(CLEAR_VARS)
+LOCAL_USE_AAPT2 := true
+LOCAL_MODULE := android-support-v4
+LOCAL_SDK_VERSION := 9
+LOCAL_STATIC_JAVA_LIBRARIES := \
+    android-support-compat \
+    android-support-media-compat \
+    android-support-core-utils \
+    android-support-core-ui \
+    android-support-fragment
+LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
+LOCAL_JAR_EXCLUDE_FILES := none
+LOCAL_JAVA_LANGUAGE_VERSION := 1.7
+include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/core-combined/AndroidManifest.xml b/core-combined/AndroidManifest.xml
new file mode 100644
index 0000000..d76c581
--- /dev/null
+++ b/core-combined/AndroidManifest.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+          xmlns:tools="http://schemas.android.com/tools"
+          package="android.support.v4">
+    <uses-sdk android:minSdkVersion="9" tools:overrideLibrary="android.support.v4"/>
+    <application />
+</manifest>
diff --git a/core-combined/build.gradle b/core-combined/build.gradle
new file mode 100644
index 0000000..697bcd2
--- /dev/null
+++ b/core-combined/build.gradle
@@ -0,0 +1,32 @@
+apply plugin: 'com.android.library'
+
+archivesBaseName = 'support-v4'
+dependencies {
+    compile project(':support-compat')
+    compile project(':support-media-compat')
+    compile project(':support-core-utils')
+    compile project(':support-core-ui')
+    compile project(':support-fragment')
+}
+
+android {
+    compileSdkVersion project.ext.currentSdk
+
+    defaultConfig {
+        minSdkVersion 9
+        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
+        // This disables the builds tools automatic vector -> PNG generation
+        generatedDensities = []
+    }
+
+    sourceSets {
+        main.manifest.srcFile 'AndroidManifest.xml'
+    }
+
+    compileOptions {
+        sourceCompatibility JavaVersion.VERSION_1_7
+        targetCompatibility JavaVersion.VERSION_1_7
+    }
+}
+
+
diff --git a/core-ui/Android.mk b/core-ui/Android.mk
new file mode 100644
index 0000000..e727122
--- /dev/null
+++ b/core-ui/Android.mk
@@ -0,0 +1,78 @@
+# 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.
+
+LOCAL_PATH := $(call my-dir)
+
+# A helper sub-library that makes direct use of Honeycomb APIs.
+include $(CLEAR_VARS)
+LOCAL_MODULE := android-support-core-ui-honeycomb
+LOCAL_SDK_VERSION := 11
+LOCAL_SRC_FILES := $(call all-java-files-under, honeycomb)
+LOCAL_STATIC_JAVA_LIBRARIES := \
+    android-support-annotations \
+    android-support-compat
+LOCAL_JAVA_LANGUAGE_VERSION := 1.7
+include $(BUILD_STATIC_JAVA_LIBRARY)
+
+# -----------------------------------------------------------------------
+
+# A helper sub-library that makes direct use of Ice Cream Sandwich APIs.
+include $(CLEAR_VARS)
+LOCAL_MODULE := android-support-core-ui-ics
+LOCAL_SDK_VERSION := 14
+LOCAL_SRC_FILES := $(call all-java-files-under, ics)
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-core-ui-honeycomb
+LOCAL_JAVA_LANGUAGE_VERSION := 1.7
+include $(BUILD_STATIC_JAVA_LIBRARY)
+
+# -----------------------------------------------------------------------
+
+# A helper sub-library that makes direct use of JellyBean MR2 APIs.
+include $(CLEAR_VARS)
+LOCAL_MODULE := android-support-core-ui-jellybean-mr2
+LOCAL_SDK_VERSION := 18
+LOCAL_SRC_FILES := $(call all-java-files-under, jellybean-mr2)
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-core-ui-ics
+LOCAL_JAVA_LANGUAGE_VERSION := 1.7
+include $(BUILD_STATIC_JAVA_LIBRARY)
+
+# -----------------------------------------------------------------------
+
+# A helper sub-library that makes direct use of Lollipop APIs.
+include $(CLEAR_VARS)
+LOCAL_MODULE := android-support-core-ui-api21
+LOCAL_SDK_VERSION := 21
+LOCAL_SRC_FILES := $(call all-java-files-under, api21)
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-core-ui-jellybean-mr2
+LOCAL_JAVA_LANGUAGE_VERSION := 1.7
+include $(BUILD_STATIC_JAVA_LIBRARY)
+
+# -----------------------------------------------------------------------
+
+# Here is the final static library that apps can link against.
+include $(CLEAR_VARS)
+LOCAL_USE_AAPT2 := true
+LOCAL_MODULE := android-support-core-ui
+LOCAL_SDK_VERSION := 9
+LOCAL_AIDL_INCLUDES := frameworks/support/core-ui/java
+LOCAL_SRC_FILES := $(call all-java-files-under, java) \
+    $(call all-Iaidl-files-under, java)
+LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-core-ui-api21
+LOCAL_SHARED_ANDROID_LIBRARIES := \
+    android-support-compat \
+    android-support-annotations
+LOCAL_JAR_EXCLUDE_FILES := none
+LOCAL_JAVA_LANGUAGE_VERSION := 1.7
+include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/core-ui/AndroidManifest.xml b/core-ui/AndroidManifest.xml
new file mode 100644
index 0000000..9bcc44e
--- /dev/null
+++ b/core-ui/AndroidManifest.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+          xmlns:tools="http://schemas.android.com/tools"
+          package="android.support.coreui">
+    <uses-sdk android:minSdkVersion="9" tools:overrideLibrary="android.support.coreui"/>
+    <application />
+</manifest>
diff --git a/v4/NOTICES.md b/core-ui/NOTICES.md
similarity index 100%
rename from v4/NOTICES.md
rename to core-ui/NOTICES.md
diff --git a/v4/api21/android/support/v4/widget/DrawerLayoutCompatApi21.java b/core-ui/api21/android/support/v4/widget/DrawerLayoutCompatApi21.java
similarity index 100%
rename from v4/api21/android/support/v4/widget/DrawerLayoutCompatApi21.java
rename to core-ui/api21/android/support/v4/widget/DrawerLayoutCompatApi21.java
diff --git a/v4/api21/android/support/v4/widget/DrawerLayoutImpl.java b/core-ui/api21/android/support/v4/widget/DrawerLayoutImpl.java
similarity index 100%
rename from v4/api21/android/support/v4/widget/DrawerLayoutImpl.java
rename to core-ui/api21/android/support/v4/widget/DrawerLayoutImpl.java
diff --git a/core-ui/build.gradle b/core-ui/build.gradle
new file mode 100644
index 0000000..fca03a8
--- /dev/null
+++ b/core-ui/build.gradle
@@ -0,0 +1,138 @@
+apply plugin: 'com.android.library'
+archivesBaseName = 'support-core-ui'
+
+
+createApiSourceSets(project, gradle.ext.studioCompat.modules.coreui.apiTargets)
+dependencies {
+    compile project(':support-compat')
+    androidTestCompile ('com.android.support.test:runner:0.4.1') {
+        exclude module: 'support-annotations'
+    }
+    androidTestCompile ('com.android.support.test.espresso:espresso-core:2.2.1') {
+        exclude module: 'support-annotations'
+    }
+    androidTestCompile 'org.mockito:mockito-core:1.9.5'
+    androidTestCompile 'com.google.dexmaker:dexmaker:1.2'
+    androidTestCompile 'com.google.dexmaker:dexmaker-mockito:1.2'
+    testCompile 'junit:junit:4.12'
+}
+
+sourceCompatibility = JavaVersion.VERSION_1_7
+targetCompatibility = JavaVersion.VERSION_1_7
+setApiModuleDependencies(project, dependencies, gradle.ext.studioCompat.modules.coreui.dependencies)
+
+android {
+    compileSdkVersion 9
+
+    defaultConfig {
+        minSdkVersion 9
+        // TODO: get target from branch
+        //targetSdkVersion 19
+
+        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
+    }
+
+    sourceSets {
+        main.manifest.srcFile 'AndroidManifest.xml'
+        main.java.srcDirs = ['java']
+        main.aidl.srcDirs = ['java']
+
+        androidTest.setRoot('tests')
+        androidTest.java.srcDir 'tests/java'
+        androidTest.res.srcDir 'tests/res'
+        androidTest.manifest.srcFile 'tests/AndroidManifest.xml'
+    }
+
+    lintOptions {
+        // TODO: fix errors and reenable.
+        abortOnError false
+    }
+
+    buildTypes.all {
+        consumerProguardFiles 'proguard-rules.pro'
+    }
+
+    compileOptions {
+        sourceCompatibility JavaVersion.VERSION_1_7
+        targetCompatibility JavaVersion.VERSION_1_7
+    }
+
+    testOptions {
+        unitTests.returnDefaultValues = true
+        compileSdkVersion project.ext.currentSdk
+    }
+}
+
+android.libraryVariants.all { variant ->
+    def name = variant.buildType.name
+
+    if (name.equals(com.android.builder.core.BuilderConstants.DEBUG)) {
+        return; // Skip debug builds.
+    }
+    def suffix = name.capitalize()
+
+    def jarTask = project.tasks.create(name: "jar${suffix}", type: Jar){
+        dependsOn variant.javaCompile
+        from variant.javaCompile.destinationDir
+        from 'LICENSE.txt'
+    }
+    def javadocTask = project.tasks.create(name: "javadoc${suffix}", type: Javadoc) {
+        source android.sourceSets.main.java
+        classpath = files(variant.javaCompile.classpath.files) + files(
+                "${android.sdkDirectory}/platforms/${android.compileSdkVersion}/android.jar")
+    }
+
+    def javadocJarTask = project.tasks.create(name: "javadocJar${suffix}", type: Jar) {
+        classifier = 'javadoc'
+        from 'build/docs/javadoc'
+    }
+
+    def sourcesJarTask = project.tasks.create(name: "sourceJar${suffix}", type: Jar) {
+        classifier = 'sources'
+        from android.sourceSets.main.java.srcDirs
+        exclude('android/content/pm/**')
+        exclude('android/service/media/**')
+    }
+
+    project.ext.allSS.each { ss ->
+        javadocTask.source ss.java
+        sourcesJarTask.from ss.java.srcDirs
+    }
+
+    artifacts.add('archives', javadocJarTask);
+    artifacts.add('archives', sourcesJarTask);
+}
+
+uploadArchives {
+    repositories {
+        mavenDeployer {
+            repository(url: uri(rootProject.ext.supportRepoOut)) {
+            }
+
+            pom.project {
+                name 'Android Support Library v4'
+                description "The Support Library is a static library that you can add to your Android application in order to use APIs that are either not available for older platform versions or utility APIs that aren't a part of the framework APIs. Compatible on devices running API 4 or later."
+                url 'http://developer.android.com/tools/extras/support-library.html'
+                inceptionYear '2011'
+
+                licenses {
+                    license {
+                        name 'The Apache Software License, Version 2.0'
+                        url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+                        distribution 'repo'
+                    }
+                }
+
+                scm {
+                    url "http://source.android.com"
+                    connection "scm:git:https://android.googlesource.com/platform/frameworks/support"
+                }
+                developers {
+                    developer {
+                        name 'The Android Open Source Project'
+                    }
+                }
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/v4/honeycomb/android/support/v4/app/ActionBarDrawerToggleHoneycomb.java b/core-ui/honeycomb/android/support/v4/app/ActionBarDrawerToggleHoneycomb.java
similarity index 100%
rename from v4/honeycomb/android/support/v4/app/ActionBarDrawerToggleHoneycomb.java
rename to core-ui/honeycomb/android/support/v4/app/ActionBarDrawerToggleHoneycomb.java
diff --git a/v4/ics/android/support/v4/view/PagerTitleStripIcs.java b/core-ui/ics/android/support/v4/view/PagerTitleStripIcs.java
similarity index 100%
rename from v4/ics/android/support/v4/view/PagerTitleStripIcs.java
rename to core-ui/ics/android/support/v4/view/PagerTitleStripIcs.java
diff --git a/v4/java/android/support/v4/app/ActionBarDrawerToggle.java b/core-ui/java/android/support/v4/app/ActionBarDrawerToggle.java
similarity index 100%
rename from v4/java/android/support/v4/app/ActionBarDrawerToggle.java
rename to core-ui/java/android/support/v4/app/ActionBarDrawerToggle.java
diff --git a/core-ui/java/android/support/v4/app/package.html b/core-ui/java/android/support/v4/app/package.html
new file mode 100755
index 0000000..02d1b79
--- /dev/null
+++ b/core-ui/java/android/support/v4/app/package.html
@@ -0,0 +1,8 @@
+<body>
+
+Support android.app classes to assist with development of applications for
+android API level 4 or later.  The main features here are backwards-compatible
+versions of {@link android.support.v4.app.FragmentManager} and
+{@link android.support.v4.app.LoaderManager}.
+
+</body>
diff --git a/core-ui/java/android/support/v4/view/AbsSavedState.java b/core-ui/java/android/support/v4/view/AbsSavedState.java
new file mode 100644
index 0000000..be15396
--- /dev/null
+++ b/core-ui/java/android/support/v4/view/AbsSavedState.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright (C) 2016 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 android.support.v4.view;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.support.v4.os.ParcelableCompat;
+import android.support.v4.os.ParcelableCompatCreatorCallbacks;
+
+/**
+ * A {@link Parcelable} implementation that should be used by inheritance
+ * hierarchies to ensure the state of all classes along the chain is saved.
+ */
+public abstract class AbsSavedState implements Parcelable {
+    public static final AbsSavedState EMPTY_STATE = new AbsSavedState() {};
+
+    private final Parcelable mSuperState;
+
+    /**
+     * Constructor used to make the EMPTY_STATE singleton
+     */
+    private AbsSavedState() {
+        mSuperState = null;
+    }
+
+    /**
+     * Constructor called by derived classes when creating their SavedState objects
+     *
+     * @param superState The state of the superclass of this view
+     */
+    protected AbsSavedState(Parcelable superState) {
+        if (superState == null) {
+            throw new IllegalArgumentException("superState must not be null");
+        }
+        mSuperState = superState != EMPTY_STATE ? superState : null;
+    }
+
+    /**
+     * Constructor used when reading from a parcel. Reads the state of the superclass.
+     *
+     * @param source parcel to read from
+     */
+    protected AbsSavedState(Parcel source) {
+        this(source, null);
+    }
+
+    /**
+     * Constructor used when reading from a parcel. Reads the state of the superclass.
+     *
+     * @param source parcel to read from
+     * @param loader ClassLoader to use for reading
+     */
+    protected AbsSavedState(Parcel source, ClassLoader loader) {
+        Parcelable superState = source.readParcelable(loader);
+        mSuperState = superState != null ? superState : EMPTY_STATE;
+    }
+
+    final public Parcelable getSuperState() {
+        return mSuperState;
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeParcelable(mSuperState, flags);
+    }
+
+    public static final Parcelable.Creator<AbsSavedState> CREATOR
+            = ParcelableCompat.newCreator(new ParcelableCompatCreatorCallbacks<AbsSavedState>() {
+        @Override
+        public AbsSavedState createFromParcel(Parcel in, ClassLoader loader) {
+            Parcelable superState = in.readParcelable(loader);
+            if (superState != null) {
+                throw new IllegalStateException("superState must be null");
+            }
+            return EMPTY_STATE;
+        }
+
+        @Override
+        public AbsSavedState[] newArray(int size) {
+            return new AbsSavedState[size];
+        }
+    });
+}
diff --git a/v4/java/android/support/v4/view/AsyncLayoutInflater.java b/core-ui/java/android/support/v4/view/AsyncLayoutInflater.java
similarity index 100%
rename from v4/java/android/support/v4/view/AsyncLayoutInflater.java
rename to core-ui/java/android/support/v4/view/AsyncLayoutInflater.java
diff --git a/core-ui/java/android/support/v4/view/NestedScrollingChildHelper.java b/core-ui/java/android/support/v4/view/NestedScrollingChildHelper.java
new file mode 100644
index 0000000..b79f533
--- /dev/null
+++ b/core-ui/java/android/support/v4/view/NestedScrollingChildHelper.java
@@ -0,0 +1,283 @@
+/*
+ * Copyright (C) 2015 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 android.support.v4.view;
+
+import android.view.View;
+import android.view.ViewParent;
+
+/**
+ * Helper class for implementing nested scrolling child views compatible with Android platform
+ * versions earlier than Android 5.0 Lollipop (API 21).
+ *
+ * <p>{@link android.view.View View} subclasses should instantiate a final instance of this
+ * class as a field at construction. For each <code>View</code> method that has a matching
+ * method signature in this class, delegate the operation to the helper instance in an overridden
+ * method implementation. This implements the standard framework policy for nested scrolling.</p>
+ *
+ * <p>Views invoking nested scrolling functionality should always do so from the relevant
+ * {@link android.support.v4.view.ViewCompat}, {@link android.support.v4.view.ViewGroupCompat} or
+ * {@link android.support.v4.view.ViewParentCompat} compatibility
+ * shim static methods. This ensures interoperability with nested scrolling views on Android
+ * 5.0 Lollipop and newer.</p>
+ */
+public class NestedScrollingChildHelper {
+    private final View mView;
+    private ViewParent mNestedScrollingParent;
+    private boolean mIsNestedScrollingEnabled;
+    private int[] mTempNestedScrollConsumed;
+
+    /**
+     * Construct a new helper for a given view.
+     */
+    public NestedScrollingChildHelper(View view) {
+        mView = view;
+    }
+
+    /**
+     * Enable nested scrolling.
+     *
+     * <p>This is a delegate method. Call it from your {@link android.view.View View} subclass
+     * method/{@link android.support.v4.view.NestedScrollingChild} interface method with the same
+     * signature to implement the standard policy.</p>
+     *
+     * @param enabled true to enable nested scrolling dispatch from this view, false otherwise
+     */
+    public void setNestedScrollingEnabled(boolean enabled) {
+        if (mIsNestedScrollingEnabled) {
+            ViewCompat.stopNestedScroll(mView);
+        }
+        mIsNestedScrollingEnabled = enabled;
+    }
+
+    /**
+     * Check if nested scrolling is enabled for this view.
+     *
+     * <p>This is a delegate method. Call it from your {@link android.view.View View} subclass
+     * method/{@link android.support.v4.view.NestedScrollingChild} interface method with the same
+     * signature to implement the standard policy.</p>
+     *
+     * @return true if nested scrolling is enabled for this view
+     */
+    public boolean isNestedScrollingEnabled() {
+        return mIsNestedScrollingEnabled;
+    }
+
+    /**
+     * Check if this view has a nested scrolling parent view currently receiving events for
+     * a nested scroll in progress.
+     *
+     * <p>This is a delegate method. Call it from your {@link android.view.View View} subclass
+     * method/{@link android.support.v4.view.NestedScrollingChild} interface method with the same
+     * signature to implement the standard policy.</p>
+     *
+     * @return true if this view has a nested scrolling parent, false otherwise
+     */
+    public boolean hasNestedScrollingParent() {
+        return mNestedScrollingParent != null;
+    }
+
+    /**
+     * Start a new nested scroll for this view.
+     *
+     * <p>This is a delegate method. Call it from your {@link android.view.View View} subclass
+     * method/{@link android.support.v4.view.NestedScrollingChild} interface method with the same
+     * signature to implement the standard policy.</p>
+     *
+     * @param axes Supported nested scroll axes.
+     *             See {@link android.support.v4.view.NestedScrollingChild#startNestedScroll(int)}.
+     * @return true if a cooperating parent view was found and nested scrolling started successfully
+     */
+    public boolean startNestedScroll(int axes) {
+        if (hasNestedScrollingParent()) {
+            // Already in progress
+            return true;
+        }
+        if (isNestedScrollingEnabled()) {
+            ViewParent p = mView.getParent();
+            View child = mView;
+            while (p != null) {
+                if (ViewParentCompat.onStartNestedScroll(p, child, mView, axes)) {
+                    mNestedScrollingParent = p;
+                    ViewParentCompat.onNestedScrollAccepted(p, child, mView, axes);
+                    return true;
+                }
+                if (p instanceof View) {
+                    child = (View) p;
+                }
+                p = p.getParent();
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Stop a nested scroll in progress.
+     *
+     * <p>This is a delegate method. Call it from your {@link android.view.View View} subclass
+     * method/{@link android.support.v4.view.NestedScrollingChild} interface method with the same
+     * signature to implement the standard policy.</p>
+     */
+    public void stopNestedScroll() {
+        if (mNestedScrollingParent != null) {
+            ViewParentCompat.onStopNestedScroll(mNestedScrollingParent, mView);
+            mNestedScrollingParent = null;
+        }
+    }
+
+    /**
+     * Dispatch one step of a nested scrolling operation to the current nested scrolling parent.
+     *
+     * <p>This is a delegate method. Call it from your {@link android.view.View View} subclass
+     * method/{@link android.support.v4.view.NestedScrollingChild} interface method with the same
+     * signature to implement the standard policy.</p>
+     *
+     * @return true if the parent consumed any of the nested scroll
+     */
+    public boolean dispatchNestedScroll(int dxConsumed, int dyConsumed,
+            int dxUnconsumed, int dyUnconsumed, int[] offsetInWindow) {
+        if (isNestedScrollingEnabled() && mNestedScrollingParent != null) {
+            if (dxConsumed != 0 || dyConsumed != 0 || dxUnconsumed != 0 || dyUnconsumed != 0) {
+                int startX = 0;
+                int startY = 0;
+                if (offsetInWindow != null) {
+                    mView.getLocationInWindow(offsetInWindow);
+                    startX = offsetInWindow[0];
+                    startY = offsetInWindow[1];
+                }
+
+                ViewParentCompat.onNestedScroll(mNestedScrollingParent, mView, dxConsumed,
+                        dyConsumed, dxUnconsumed, dyUnconsumed);
+
+                if (offsetInWindow != null) {
+                    mView.getLocationInWindow(offsetInWindow);
+                    offsetInWindow[0] -= startX;
+                    offsetInWindow[1] -= startY;
+                }
+                return true;
+            } else if (offsetInWindow != null) {
+                // No motion, no dispatch. Keep offsetInWindow up to date.
+                offsetInWindow[0] = 0;
+                offsetInWindow[1] = 0;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Dispatch one step of a nested pre-scrolling operation to the current nested scrolling parent.
+     *
+     * <p>This is a delegate method. Call it from your {@link android.view.View View} subclass
+     * method/{@link android.support.v4.view.NestedScrollingChild} interface method with the same
+     * signature to implement the standard policy.</p>
+     *
+     * @return true if the parent consumed any of the nested scroll
+     */
+    public boolean dispatchNestedPreScroll(int dx, int dy, int[] consumed, int[] offsetInWindow) {
+        if (isNestedScrollingEnabled() && mNestedScrollingParent != null) {
+            if (dx != 0 || dy != 0) {
+                int startX = 0;
+                int startY = 0;
+                if (offsetInWindow != null) {
+                    mView.getLocationInWindow(offsetInWindow);
+                    startX = offsetInWindow[0];
+                    startY = offsetInWindow[1];
+                }
+
+                if (consumed == null) {
+                    if (mTempNestedScrollConsumed == null) {
+                        mTempNestedScrollConsumed = new int[2];
+                    }
+                    consumed = mTempNestedScrollConsumed;
+                }
+                consumed[0] = 0;
+                consumed[1] = 0;
+                ViewParentCompat.onNestedPreScroll(mNestedScrollingParent, mView, dx, dy, consumed);
+
+                if (offsetInWindow != null) {
+                    mView.getLocationInWindow(offsetInWindow);
+                    offsetInWindow[0] -= startX;
+                    offsetInWindow[1] -= startY;
+                }
+                return consumed[0] != 0 || consumed[1] != 0;
+            } else if (offsetInWindow != null) {
+                offsetInWindow[0] = 0;
+                offsetInWindow[1] = 0;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Dispatch a nested fling operation to the current nested scrolling parent.
+     *
+     * <p>This is a delegate method. Call it from your {@link android.view.View View} subclass
+     * method/{@link android.support.v4.view.NestedScrollingChild} interface method with the same
+     * signature to implement the standard policy.</p>
+     *
+     * @return true if the parent consumed the nested fling
+     */
+    public boolean dispatchNestedFling(float velocityX, float velocityY, boolean consumed) {
+        if (isNestedScrollingEnabled() && mNestedScrollingParent != null) {
+            return ViewParentCompat.onNestedFling(mNestedScrollingParent, mView, velocityX,
+                    velocityY, consumed);
+        }
+        return false;
+    }
+
+    /**
+     * Dispatch a nested pre-fling operation to the current nested scrolling parent.
+     *
+     * <p>This is a delegate method. Call it from your {@link android.view.View View} subclass
+     * method/{@link android.support.v4.view.NestedScrollingChild} interface method with the same
+     * signature to implement the standard policy.</p>
+     *
+     * @return true if the parent consumed the nested fling
+     */
+    public boolean dispatchNestedPreFling(float velocityX, float velocityY) {
+        if (isNestedScrollingEnabled() && mNestedScrollingParent != null) {
+            return ViewParentCompat.onNestedPreFling(mNestedScrollingParent, mView, velocityX,
+                    velocityY);
+        }
+        return false;
+    }
+
+    /**
+     * View subclasses should always call this method on their
+     * <code>NestedScrollingChildHelper</code> when detached from a window.
+     *
+     * <p>This is a delegate method. Call it from your {@link android.view.View View} subclass
+     * method/{@link android.support.v4.view.NestedScrollingChild} interface method with the same
+     * signature to implement the standard policy.</p>
+     */
+    public void onDetachedFromWindow() {
+        ViewCompat.stopNestedScroll(mView);
+    }
+
+    /**
+     * Called when a nested scrolling child stops its current nested scroll operation.
+     *
+     * <p>This is a delegate method. Call it from your {@link android.view.View View} subclass
+     * method/{@link android.support.v4.view.NestedScrollingChild} interface method with the same
+     * signature to implement the standard policy.</p>
+     *
+     * @param child Child view stopping its nested scroll. This may not be a direct child view.
+     */
+    public void onStopNestedScroll(View child) {
+        ViewCompat.stopNestedScroll(mView);
+    }
+}
diff --git a/core-ui/java/android/support/v4/view/NestedScrollingParentHelper.java b/core-ui/java/android/support/v4/view/NestedScrollingParentHelper.java
new file mode 100644
index 0000000..d76aff7
--- /dev/null
+++ b/core-ui/java/android/support/v4/view/NestedScrollingParentHelper.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2015 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 android.support.v4.view;
+
+import android.view.View;
+import android.view.ViewGroup;
+
+/**
+ * Helper class for implementing nested scrolling parent views compatible with Android platform
+ * versions earlier than Android 5.0 Lollipop (API 21).
+ *
+ * <p>{@link android.view.ViewGroup ViewGroup} subclasses should instantiate a final instance
+ * of this class as a field at construction. For each <code>ViewGroup</code> method that has
+ * a matching method signature in this class, delegate the operation to the helper instance
+ * in an overridden method implementation. This implements the standard framework policy
+ * for nested scrolling.</p>
+ *
+ * <p>Views invoking nested scrolling functionality should always do so from the relevant
+ * {@link android.support.v4.view.ViewCompat}, {@link android.support.v4.view.ViewGroupCompat} or
+ * {@link android.support.v4.view.ViewParentCompat} compatibility
+ * shim static methods. This ensures interoperability with nested scrolling views on Android
+ * 5.0 Lollipop and newer.</p>
+ */
+public class NestedScrollingParentHelper {
+    private final ViewGroup mViewGroup;
+    private int mNestedScrollAxes;
+
+    /**
+     * Construct a new helper for a given ViewGroup
+     */
+    public NestedScrollingParentHelper(ViewGroup viewGroup) {
+        mViewGroup = viewGroup;
+    }
+
+    /**
+     * Called when a nested scrolling operation initiated by a descendant view is accepted
+     * by this ViewGroup.
+     *
+     * <p>This is a delegate method. Call it from your {@link android.view.ViewGroup ViewGroup}
+     * subclass method/{@link android.support.v4.view.NestedScrollingParent} interface method with
+     * the same signature to implement the standard policy.</p>
+     */
+    public void onNestedScrollAccepted(View child, View target, int axes) {
+        mNestedScrollAxes = axes;
+    }
+
+    /**
+     * Return the current axes of nested scrolling for this ViewGroup.
+     *
+     * <p>This is a delegate method. Call it from your {@link android.view.ViewGroup ViewGroup}
+     * subclass method/{@link android.support.v4.view.NestedScrollingParent} interface method with
+     * the same signature to implement the standard policy.</p>
+     */
+    public int getNestedScrollAxes() {
+        return mNestedScrollAxes;
+    }
+
+    /**
+     * React to a nested scroll operation ending.
+     *
+     * <p>This is a delegate method. Call it from your {@link android.view.ViewGroup ViewGroup}
+     * subclass method/{@link android.support.v4.view.NestedScrollingParent} interface method with
+     * the same signature to implement the standard policy.</p>
+     *
+     * @param target View that initiated the nested scroll
+     */
+    public void onStopNestedScroll(View target) {
+        mNestedScrollAxes = 0;
+    }
+}
diff --git a/v4/java/android/support/v4/view/PagerAdapter.java b/core-ui/java/android/support/v4/view/PagerAdapter.java
similarity index 100%
rename from v4/java/android/support/v4/view/PagerAdapter.java
rename to core-ui/java/android/support/v4/view/PagerAdapter.java
diff --git a/v4/java/android/support/v4/view/PagerTabStrip.java b/core-ui/java/android/support/v4/view/PagerTabStrip.java
similarity index 100%
rename from v4/java/android/support/v4/view/PagerTabStrip.java
rename to core-ui/java/android/support/v4/view/PagerTabStrip.java
diff --git a/core-ui/java/android/support/v4/view/PagerTitleStrip.java b/core-ui/java/android/support/v4/view/PagerTitleStrip.java
new file mode 100644
index 0000000..4a3467b
--- /dev/null
+++ b/core-ui/java/android/support/v4/view/PagerTitleStrip.java
@@ -0,0 +1,522 @@
+/*
+ * 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 android.support.v4.view;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.database.DataSetObserver;
+import android.graphics.drawable.Drawable;
+import android.support.annotation.ColorInt;
+import android.support.annotation.FloatRange;
+import android.text.TextUtils.TruncateAt;
+import android.util.AttributeSet;
+import android.util.TypedValue;
+import android.view.Gravity;
+import android.view.ViewGroup;
+import android.view.ViewParent;
+import android.widget.TextView;
+
+import java.lang.ref.WeakReference;
+
+/**
+ * PagerTitleStrip is a non-interactive indicator of the current, next,
+ * and previous pages of a {@link ViewPager}. It is intended to be used as a
+ * child view of a ViewPager widget in your XML layout.
+ * Add it as a child of a ViewPager in your layout file and set its
+ * android:layout_gravity to TOP or BOTTOM to pin it to the top or bottom
+ * of the ViewPager. The title from each page is supplied by the method
+ * {@link PagerAdapter#getPageTitle(int)} in the adapter supplied to
+ * the ViewPager.
+ *
+ * <p>For an interactive indicator, see {@link PagerTabStrip}.</p>
+ */
+@ViewPager.DecorView
+public class PagerTitleStrip extends ViewGroup {
+    private static final String TAG = "PagerTitleStrip";
+
+    ViewPager mPager;
+    TextView mPrevText;
+    TextView mCurrText;
+    TextView mNextText;
+
+    private int mLastKnownCurrentPage = -1;
+    private float mLastKnownPositionOffset = -1;
+    private int mScaledTextSpacing;
+    private int mGravity;
+
+    private boolean mUpdatingText;
+    private boolean mUpdatingPositions;
+
+    private final PageListener mPageListener = new PageListener();
+
+    private WeakReference<PagerAdapter> mWatchingAdapter;
+
+    private static final int[] ATTRS = new int[] {
+        android.R.attr.textAppearance,
+        android.R.attr.textSize,
+        android.R.attr.textColor,
+        android.R.attr.gravity
+    };
+
+    private static final int[] TEXT_ATTRS = new int[] {
+        0x0101038c // android.R.attr.textAllCaps
+    };
+
+    private static final float SIDE_ALPHA = 0.6f;
+    private static final int TEXT_SPACING = 16; // dip
+
+    private int mNonPrimaryAlpha;
+    int mTextColor;
+
+    interface PagerTitleStripImpl {
+        void setSingleLineAllCaps(TextView text);
+    }
+
+    static class PagerTitleStripImplBase implements PagerTitleStripImpl {
+        @Override
+        public void setSingleLineAllCaps(TextView text) {
+            text.setSingleLine();
+        }
+    }
+
+    static class PagerTitleStripImplIcs implements PagerTitleStripImpl {
+        @Override
+        public void setSingleLineAllCaps(TextView text) {
+            PagerTitleStripIcs.setSingleLineAllCaps(text);
+        }
+    }
+
+    private static final PagerTitleStripImpl IMPL;
+    static {
+        if (android.os.Build.VERSION.SDK_INT >= 14) {
+            IMPL = new PagerTitleStripImplIcs();
+        } else {
+            IMPL = new PagerTitleStripImplBase();
+        }
+    }
+
+    private static void setSingleLineAllCaps(TextView text) {
+        IMPL.setSingleLineAllCaps(text);
+    }
+
+    public PagerTitleStrip(Context context) {
+        this(context, null);
+    }
+
+    public PagerTitleStrip(Context context, AttributeSet attrs) {
+        super(context, attrs);
+
+        addView(mPrevText = new TextView(context));
+        addView(mCurrText = new TextView(context));
+        addView(mNextText = new TextView(context));
+
+        final TypedArray a = context.obtainStyledAttributes(attrs, ATTRS);
+        final int textAppearance = a.getResourceId(0, 0);
+        if (textAppearance != 0) {
+            mPrevText.setTextAppearance(context, textAppearance);
+            mCurrText.setTextAppearance(context, textAppearance);
+            mNextText.setTextAppearance(context, textAppearance);
+        }
+        final int textSize = a.getDimensionPixelSize(1, 0);
+        if (textSize != 0) {
+            setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize);
+        }
+        if (a.hasValue(2)) {
+            final int textColor = a.getColor(2, 0);
+            mPrevText.setTextColor(textColor);
+            mCurrText.setTextColor(textColor);
+            mNextText.setTextColor(textColor);
+        }
+        mGravity = a.getInteger(3, Gravity.BOTTOM);
+        a.recycle();
+
+        mTextColor = mCurrText.getTextColors().getDefaultColor();
+        setNonPrimaryAlpha(SIDE_ALPHA);
+
+        mPrevText.setEllipsize(TruncateAt.END);
+        mCurrText.setEllipsize(TruncateAt.END);
+        mNextText.setEllipsize(TruncateAt.END);
+
+        boolean allCaps = false;
+        if (textAppearance != 0) {
+            final TypedArray ta = context.obtainStyledAttributes(textAppearance, TEXT_ATTRS);
+            allCaps = ta.getBoolean(0, false);
+            ta.recycle();
+        }
+
+        if (allCaps) {
+            setSingleLineAllCaps(mPrevText);
+            setSingleLineAllCaps(mCurrText);
+            setSingleLineAllCaps(mNextText);
+        } else {
+            mPrevText.setSingleLine();
+            mCurrText.setSingleLine();
+            mNextText.setSingleLine();
+        }
+
+        final float density = context.getResources().getDisplayMetrics().density;
+        mScaledTextSpacing = (int) (TEXT_SPACING * density);
+    }
+
+    /**
+     * Set the required spacing between title segments.
+     *
+     * @param spacingPixels Spacing between each title displayed in pixels
+     */
+    public void setTextSpacing(int spacingPixels) {
+        mScaledTextSpacing = spacingPixels;
+        requestLayout();
+    }
+
+    /**
+     * @return The required spacing between title segments in pixels
+     */
+    public int getTextSpacing() {
+        return mScaledTextSpacing;
+    }
+
+    /**
+     * Set the alpha value used for non-primary page titles.
+     *
+     * @param alpha Opacity value in the range 0-1f
+     */
+    public void setNonPrimaryAlpha(@FloatRange(from=0.0, to=1.0) float alpha) {
+        mNonPrimaryAlpha = (int) (alpha * 255) & 0xFF;
+        final int transparentColor = (mNonPrimaryAlpha << 24) | (mTextColor & 0xFFFFFF);
+        mPrevText.setTextColor(transparentColor);
+        mNextText.setTextColor(transparentColor);
+    }
+
+    /**
+     * Set the color value used as the base color for all displayed page titles.
+     * Alpha will be ignored for non-primary page titles. See {@link #setNonPrimaryAlpha(float)}.
+     *
+     * @param color Color hex code in 0xAARRGGBB format
+     */
+    public void setTextColor(@ColorInt int color) {
+        mTextColor = color;
+        mCurrText.setTextColor(color);
+        final int transparentColor = (mNonPrimaryAlpha << 24) | (mTextColor & 0xFFFFFF);
+        mPrevText.setTextColor(transparentColor);
+        mNextText.setTextColor(transparentColor);
+    }
+
+    /**
+     * Set the default text size to a given unit and value.
+     * See {@link TypedValue} for the possible dimension units.
+     *
+     * <p>Example: to set the text size to 14px, use
+     * setTextSize(TypedValue.COMPLEX_UNIT_PX, 14);</p>
+     *
+     * @param unit The desired dimension unit
+     * @param size The desired size in the given units
+     */
+    public void setTextSize(int unit, float size) {
+        mPrevText.setTextSize(unit, size);
+        mCurrText.setTextSize(unit, size);
+        mNextText.setTextSize(unit, size);
+    }
+
+    /**
+     * Set the {@link Gravity} used to position text within the title strip.
+     * Only the vertical gravity component is used.
+     *
+     * @param gravity {@link Gravity} constant for positioning title text
+     */
+    public void setGravity(int gravity) {
+        mGravity = gravity;
+        requestLayout();
+    }
+
+    @Override
+    protected void onAttachedToWindow() {
+        super.onAttachedToWindow();
+
+        final ViewParent parent = getParent();
+        if (!(parent instanceof ViewPager)) {
+            throw new IllegalStateException(
+                    "PagerTitleStrip must be a direct child of a ViewPager.");
+        }
+
+        final ViewPager pager = (ViewPager) parent;
+        final PagerAdapter adapter = pager.getAdapter();
+
+        pager.setInternalPageChangeListener(mPageListener);
+        pager.addOnAdapterChangeListener(mPageListener);
+        mPager = pager;
+        updateAdapter(mWatchingAdapter != null ? mWatchingAdapter.get() : null, adapter);
+    }
+
+    @Override
+    protected void onDetachedFromWindow() {
+        super.onDetachedFromWindow();
+        if (mPager != null) {
+            updateAdapter(mPager.getAdapter(), null);
+            mPager.setInternalPageChangeListener(null);
+            mPager.removeOnAdapterChangeListener(mPageListener);
+            mPager = null;
+        }
+    }
+
+    void updateText(int currentItem, PagerAdapter adapter) {
+        final int itemCount = adapter != null ? adapter.getCount() : 0;
+        mUpdatingText = true;
+
+        CharSequence text = null;
+        if (currentItem >= 1 && adapter != null) {
+            text = adapter.getPageTitle(currentItem - 1);
+        }
+        mPrevText.setText(text);
+
+        mCurrText.setText(adapter != null && currentItem < itemCount ?
+                adapter.getPageTitle(currentItem) : null);
+
+        text = null;
+        if (currentItem + 1 < itemCount && adapter != null) {
+            text = adapter.getPageTitle(currentItem + 1);
+        }
+        mNextText.setText(text);
+
+        // Measure everything
+        final int width = getWidth() - getPaddingLeft() - getPaddingRight();
+        final int maxWidth = Math.max(0, (int) (width * 0.8f));
+        final int childWidthSpec = MeasureSpec.makeMeasureSpec(maxWidth, MeasureSpec.AT_MOST);
+        final int childHeight = getHeight() - getPaddingTop() - getPaddingBottom();
+        final int maxHeight = Math.max(0, childHeight);
+        final int childHeightSpec = MeasureSpec.makeMeasureSpec(maxHeight, MeasureSpec.AT_MOST);
+        mPrevText.measure(childWidthSpec, childHeightSpec);
+        mCurrText.measure(childWidthSpec, childHeightSpec);
+        mNextText.measure(childWidthSpec, childHeightSpec);
+
+        mLastKnownCurrentPage = currentItem;
+
+        if (!mUpdatingPositions) {
+            updateTextPositions(currentItem, mLastKnownPositionOffset, false);
+        }
+
+        mUpdatingText = false;
+    }
+
+    @Override
+    public void requestLayout() {
+        if (!mUpdatingText) {
+            super.requestLayout();
+        }
+    }
+
+    void updateAdapter(PagerAdapter oldAdapter, PagerAdapter newAdapter) {
+        if (oldAdapter != null) {
+            oldAdapter.unregisterDataSetObserver(mPageListener);
+            mWatchingAdapter = null;
+        }
+        if (newAdapter != null) {
+            newAdapter.registerDataSetObserver(mPageListener);
+            mWatchingAdapter = new WeakReference<PagerAdapter>(newAdapter);
+        }
+        if (mPager != null) {
+            mLastKnownCurrentPage = -1;
+            mLastKnownPositionOffset = -1;
+            updateText(mPager.getCurrentItem(), newAdapter);
+            requestLayout();
+        }
+    }
+
+    void updateTextPositions(int position, float positionOffset, boolean force) {
+        if (position != mLastKnownCurrentPage) {
+            updateText(position, mPager.getAdapter());
+        } else if (!force && positionOffset == mLastKnownPositionOffset) {
+            return;
+        }
+
+        mUpdatingPositions = true;
+
+        final int prevWidth = mPrevText.getMeasuredWidth();
+        final int currWidth = mCurrText.getMeasuredWidth();
+        final int nextWidth = mNextText.getMeasuredWidth();
+        final int halfCurrWidth = currWidth / 2;
+
+        final int stripWidth = getWidth();
+        final int stripHeight = getHeight();
+        final int paddingLeft = getPaddingLeft();
+        final int paddingRight = getPaddingRight();
+        final int paddingTop = getPaddingTop();
+        final int paddingBottom = getPaddingBottom();
+        final int textPaddedLeft = paddingLeft + halfCurrWidth;
+        final int textPaddedRight = paddingRight + halfCurrWidth;
+        final int contentWidth = stripWidth - textPaddedLeft - textPaddedRight;
+
+        float currOffset = positionOffset + 0.5f;
+        if (currOffset > 1.f) {
+            currOffset -= 1.f;
+        }
+        final int currCenter = stripWidth - textPaddedRight - (int) (contentWidth * currOffset);
+        final int currLeft = currCenter - currWidth / 2;
+        final int currRight = currLeft + currWidth;
+
+        final int prevBaseline = mPrevText.getBaseline();
+        final int currBaseline = mCurrText.getBaseline();
+        final int nextBaseline = mNextText.getBaseline();
+        final int maxBaseline = Math.max(Math.max(prevBaseline, currBaseline), nextBaseline);
+        final int prevTopOffset = maxBaseline - prevBaseline;
+        final int currTopOffset = maxBaseline - currBaseline;
+        final int nextTopOffset = maxBaseline - nextBaseline;
+        final int alignedPrevHeight = prevTopOffset + mPrevText.getMeasuredHeight();
+        final int alignedCurrHeight = currTopOffset + mCurrText.getMeasuredHeight();
+        final int alignedNextHeight = nextTopOffset + mNextText.getMeasuredHeight();
+        final int maxTextHeight = Math.max(Math.max(alignedPrevHeight, alignedCurrHeight),
+                alignedNextHeight);
+
+        final int vgrav = mGravity & Gravity.VERTICAL_GRAVITY_MASK;
+
+        int prevTop;
+        int currTop;
+        int nextTop;
+        switch (vgrav) {
+            default:
+            case Gravity.TOP:
+                prevTop = paddingTop + prevTopOffset;
+                currTop = paddingTop + currTopOffset;
+                nextTop = paddingTop + nextTopOffset;
+                break;
+            case Gravity.CENTER_VERTICAL:
+                final int paddedHeight = stripHeight - paddingTop - paddingBottom;
+                final int centeredTop = (paddedHeight - maxTextHeight) / 2;
+                prevTop = centeredTop + prevTopOffset;
+                currTop = centeredTop + currTopOffset;
+                nextTop = centeredTop + nextTopOffset;
+                break;
+            case Gravity.BOTTOM:
+                final int bottomGravTop = stripHeight - paddingBottom - maxTextHeight;
+                prevTop = bottomGravTop + prevTopOffset;
+                currTop = bottomGravTop + currTopOffset;
+                nextTop = bottomGravTop + nextTopOffset;
+                break;
+        }
+
+        mCurrText.layout(currLeft, currTop, currRight,
+                currTop + mCurrText.getMeasuredHeight());
+
+        final int prevLeft = Math.min(paddingLeft, currLeft - mScaledTextSpacing - prevWidth);
+        mPrevText.layout(prevLeft, prevTop, prevLeft + prevWidth,
+                prevTop + mPrevText.getMeasuredHeight());
+
+        final int nextLeft = Math.max(stripWidth - paddingRight - nextWidth,
+                currRight + mScaledTextSpacing);
+        mNextText.layout(nextLeft, nextTop, nextLeft + nextWidth,
+                nextTop + mNextText.getMeasuredHeight());
+
+        mLastKnownPositionOffset = positionOffset;
+        mUpdatingPositions = false;
+    }
+
+    @Override
+    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+        final int widthMode = MeasureSpec.getMode(widthMeasureSpec);
+        if (widthMode != MeasureSpec.EXACTLY) {
+            throw new IllegalStateException("Must measure with an exact width");
+        }
+
+        final int heightPadding = getPaddingTop() + getPaddingBottom();
+        final int childHeightSpec = getChildMeasureSpec(heightMeasureSpec,
+                heightPadding, LayoutParams.WRAP_CONTENT);
+
+        final int widthSize = MeasureSpec.getSize(widthMeasureSpec);
+        final int widthPadding = (int) (widthSize * 0.2f);
+        final int childWidthSpec = getChildMeasureSpec(widthMeasureSpec,
+                widthPadding, LayoutParams.WRAP_CONTENT);
+
+        mPrevText.measure(childWidthSpec, childHeightSpec);
+        mCurrText.measure(childWidthSpec, childHeightSpec);
+        mNextText.measure(childWidthSpec, childHeightSpec);
+
+        final int height;
+        final int heightMode = MeasureSpec.getMode(heightMeasureSpec);
+        if (heightMode == MeasureSpec.EXACTLY) {
+            height = MeasureSpec.getSize(heightMeasureSpec);
+        } else {
+            final int textHeight = mCurrText.getMeasuredHeight();
+            final int minHeight = getMinHeight();
+            height = Math.max(minHeight, textHeight + heightPadding);
+        }
+
+        final int childState = ViewCompat.getMeasuredState(mCurrText);
+        final int measuredHeight = ViewCompat.resolveSizeAndState(height, heightMeasureSpec,
+                childState << ViewCompat.MEASURED_HEIGHT_STATE_SHIFT);
+        setMeasuredDimension(widthSize, measuredHeight);
+    }
+
+    @Override
+    protected void onLayout(boolean changed, int l, int t, int r, int b) {
+        if (mPager != null) {
+            final float offset = mLastKnownPositionOffset >= 0 ? mLastKnownPositionOffset : 0;
+            updateTextPositions(mLastKnownCurrentPage, offset, true);
+        }
+    }
+
+    int getMinHeight() {
+        int minHeight = 0;
+        final Drawable bg = getBackground();
+        if (bg != null) {
+            minHeight = bg.getIntrinsicHeight();
+        }
+        return minHeight;
+    }
+
+    private class PageListener extends DataSetObserver implements ViewPager.OnPageChangeListener,
+            ViewPager.OnAdapterChangeListener {
+        private int mScrollState;
+
+        @Override
+        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
+            if (positionOffset > 0.5f) {
+                // Consider ourselves to be on the next page when we're 50% of the way there.
+                position++;
+            }
+            updateTextPositions(position, positionOffset, false);
+        }
+
+        @Override
+        public void onPageSelected(int position) {
+            if (mScrollState == ViewPager.SCROLL_STATE_IDLE) {
+                // Only update the text here if we're not dragging or settling.
+                updateText(mPager.getCurrentItem(), mPager.getAdapter());
+
+                final float offset = mLastKnownPositionOffset >= 0 ? mLastKnownPositionOffset : 0;
+                updateTextPositions(mPager.getCurrentItem(), offset, true);
+            }
+        }
+
+        @Override
+        public void onPageScrollStateChanged(int state) {
+            mScrollState = state;
+        }
+
+        @Override
+        public void onAdapterChanged(ViewPager viewPager, PagerAdapter oldAdapter,
+                PagerAdapter newAdapter) {
+            updateAdapter(oldAdapter, newAdapter);
+        }
+
+        @Override
+        public void onChanged() {
+            updateText(mPager.getCurrentItem(), mPager.getAdapter());
+
+            final float offset = mLastKnownPositionOffset >= 0 ? mLastKnownPositionOffset : 0;
+            updateTextPositions(mPager.getCurrentItem(), offset, true);
+        }
+    }
+}
diff --git a/core-ui/java/android/support/v4/view/ViewPager.java b/core-ui/java/android/support/v4/view/ViewPager.java
new file mode 100644
index 0000000..dbbc232
--- /dev/null
+++ b/core-ui/java/android/support/v4/view/ViewPager.java
@@ -0,0 +1,3130 @@
+/*
+ * 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 android.support.v4.view;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.content.res.TypedArray;
+import android.database.DataSetObserver;
+import android.graphics.Canvas;
+import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
+import android.os.Build;
+import android.os.Bundle;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.os.SystemClock;
+import android.support.annotation.CallSuper;
+import android.support.annotation.DrawableRes;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.v4.os.ParcelableCompat;
+import android.support.v4.os.ParcelableCompatCreatorCallbacks;
+import android.support.v4.view.accessibility.AccessibilityEventCompat;
+import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat;
+import android.support.v4.view.accessibility.AccessibilityRecordCompat;
+import android.support.v4.widget.EdgeEffectCompat;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.FocusFinder;
+import android.view.Gravity;
+import android.view.KeyEvent;
+import android.view.MotionEvent;
+import android.view.SoundEffectConstants;
+import android.view.VelocityTracker;
+import android.view.View;
+import android.view.ViewConfiguration;
+import android.view.ViewGroup;
+import android.view.ViewParent;
+import android.view.accessibility.AccessibilityEvent;
+import android.view.animation.Interpolator;
+import android.widget.Scroller;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+/**
+ * Layout manager that allows the user to flip left and right
+ * through pages of data.  You supply an implementation of a
+ * {@link PagerAdapter} to generate the pages that the view shows.
+ *
+ * <p>ViewPager is most often used in conjunction with {@link android.app.Fragment},
+ * which is a convenient way to supply and manage the lifecycle of each page.
+ * There are standard adapters implemented for using fragments with the ViewPager,
+ * which cover the most common use cases.  These are
+ * {@link android.support.v4.app.FragmentPagerAdapter} and
+ * {@link android.support.v4.app.FragmentStatePagerAdapter}; each of these
+ * classes have simple code showing how to build a full user interface
+ * with them.
+ *
+ * <p>Views which are annotated with the {@link DecorView} annotation are treated as
+ * part of the view pagers 'decor'. Each decor view's position can be controlled via
+ * its {@code android:layout_gravity} attribute. For example:
+ *
+ * <pre>
+ * &lt;android.support.v4.view.ViewPager
+ *     android:layout_width=&quot;match_parent&quot;
+ *     android:layout_height=&quot;match_parent&quot;&gt;
+ *
+ *     &lt;android.support.v4.view.PagerTitleStrip
+ *         android:layout_width=&quot;match_parent&quot;
+ *         android:layout_height=&quot;wrap_content&quot;
+ *         android:layout_gravity=&quot;top&quot; /&gt;
+ *
+ * &lt;/android.support.v4.view.ViewPager&gt;
+ * </pre>
+ *
+ * <p>For more information about how to use ViewPager, read <a
+ * href="{@docRoot}training/implementing-navigation/lateral.html">Creating Swipe Views with
+ * Tabs</a>.</p>
+ *
+ * <p>Below is a more complicated example of ViewPager, using it in conjunction
+ * with {@link android.app.ActionBar} tabs.  You can find other examples of using
+ * ViewPager in the API 4+ Support Demos and API 13+ Support Demos sample code.
+ *
+ * {@sample frameworks/support/samples/Support13Demos/src/com/example/android/supportv13/app/ActionBarTabsPager.java
+ *      complete}
+ */
+public class ViewPager extends ViewGroup {
+    private static final String TAG = "ViewPager";
+    private static final boolean DEBUG = false;
+
+    private static final boolean USE_CACHE = false;
+
+    private static final int DEFAULT_OFFSCREEN_PAGES = 1;
+    private static final int MAX_SETTLE_DURATION = 600; // ms
+    private static final int MIN_DISTANCE_FOR_FLING = 25; // dips
+
+    private static final int DEFAULT_GUTTER_SIZE = 16; // dips
+
+    private static final int MIN_FLING_VELOCITY = 400; // dips
+
+    private static final int[] LAYOUT_ATTRS = new int[] {
+        android.R.attr.layout_gravity
+    };
+
+    /**
+     * Used to track what the expected number of items in the adapter should be.
+     * If the app changes this when we don't expect it, we'll throw a big obnoxious exception.
+     */
+    private int mExpectedAdapterCount;
+
+    static class ItemInfo {
+        Object object;
+        int position;
+        boolean scrolling;
+        float widthFactor;
+        float offset;
+    }
+
+    private static final Comparator<ItemInfo> COMPARATOR = new Comparator<ItemInfo>(){
+        @Override
+        public int compare(ItemInfo lhs, ItemInfo rhs) {
+            return lhs.position - rhs.position;
+        }
+    };
+
+    private static final Interpolator sInterpolator = new Interpolator() {
+        @Override
+        public float getInterpolation(float t) {
+            t -= 1.0f;
+            return t * t * t * t * t + 1.0f;
+        }
+    };
+
+    private final ArrayList<ItemInfo> mItems = new ArrayList<ItemInfo>();
+    private final ItemInfo mTempItem = new ItemInfo();
+
+    private final Rect mTempRect = new Rect();
+
+    private PagerAdapter mAdapter;
+    private int mCurItem;   // Index of currently displayed page.
+    private int mRestoredCurItem = -1;
+    private Parcelable mRestoredAdapterState = null;
+    private ClassLoader mRestoredClassLoader = null;
+
+    private Scroller mScroller;
+    private boolean mIsScrollStarted;
+
+    private PagerObserver mObserver;
+
+    private int mPageMargin;
+    private Drawable mMarginDrawable;
+    private int mTopPageBounds;
+    private int mBottomPageBounds;
+
+    // Offsets of the first and last items, if known.
+    // Set during population, used to determine if we are at the beginning
+    // or end of the pager data set during touch scrolling.
+    private float mFirstOffset = -Float.MAX_VALUE;
+    private float mLastOffset = Float.MAX_VALUE;
+
+    private int mChildWidthMeasureSpec;
+    private int mChildHeightMeasureSpec;
+    private boolean mInLayout;
+
+    private boolean mScrollingCacheEnabled;
+
+    private boolean mPopulatePending;
+    private int mOffscreenPageLimit = DEFAULT_OFFSCREEN_PAGES;
+
+    private boolean mIsBeingDragged;
+    private boolean mIsUnableToDrag;
+    private int mDefaultGutterSize;
+    private int mGutterSize;
+    private int mTouchSlop;
+    /**
+     * Position of the last motion event.
+     */
+    private float mLastMotionX;
+    private float mLastMotionY;
+    private float mInitialMotionX;
+    private float mInitialMotionY;
+    /**
+     * ID of the active pointer. This is used to retain consistency during
+     * drags/flings if multiple pointers are used.
+     */
+    private int mActivePointerId = INVALID_POINTER;
+    /**
+     * Sentinel value for no current active pointer.
+     * Used by {@link #mActivePointerId}.
+     */
+    private static final int INVALID_POINTER = -1;
+
+    /**
+     * Determines speed during touch scrolling
+     */
+    private VelocityTracker mVelocityTracker;
+    private int mMinimumVelocity;
+    private int mMaximumVelocity;
+    private int mFlingDistance;
+    private int mCloseEnough;
+
+    // If the pager is at least this close to its final position, complete the scroll
+    // on touch down and let the user interact with the content inside instead of
+    // "catching" the flinging pager.
+    private static final int CLOSE_ENOUGH = 2; // dp
+
+    private boolean mFakeDragging;
+    private long mFakeDragBeginTime;
+
+    private EdgeEffectCompat mLeftEdge;
+    private EdgeEffectCompat mRightEdge;
+
+    private boolean mFirstLayout = true;
+    private boolean mNeedCalculatePageOffsets = false;
+    private boolean mCalledSuper;
+    private int mDecorChildCount;
+
+    private List<OnPageChangeListener> mOnPageChangeListeners;
+    private OnPageChangeListener mOnPageChangeListener;
+    private OnPageChangeListener mInternalPageChangeListener;
+    private List<OnAdapterChangeListener> mAdapterChangeListeners;
+    private PageTransformer mPageTransformer;
+    private Method mSetChildrenDrawingOrderEnabled;
+
+    private static final int DRAW_ORDER_DEFAULT = 0;
+    private static final int DRAW_ORDER_FORWARD = 1;
+    private static final int DRAW_ORDER_REVERSE = 2;
+    private int mDrawingOrder;
+    private ArrayList<View> mDrawingOrderedChildren;
+    private static final ViewPositionComparator sPositionComparator = new ViewPositionComparator();
+
+    /**
+     * Indicates that the pager is in an idle, settled state. The current page
+     * is fully in view and no animation is in progress.
+     */
+    public static final int SCROLL_STATE_IDLE = 0;
+
+    /**
+     * Indicates that the pager is currently being dragged by the user.
+     */
+    public static final int SCROLL_STATE_DRAGGING = 1;
+
+    /**
+     * Indicates that the pager is in the process of settling to a final position.
+     */
+    public static final int SCROLL_STATE_SETTLING = 2;
+
+    private final Runnable mEndScrollRunnable = new Runnable() {
+        @Override
+        public void run() {
+            setScrollState(SCROLL_STATE_IDLE);
+            populate();
+        }
+    };
+
+    private int mScrollState = SCROLL_STATE_IDLE;
+
+    /**
+     * Callback interface for responding to changing state of the selected page.
+     */
+    public interface OnPageChangeListener {
+
+        /**
+         * This method will be invoked when the current page is scrolled, either as part
+         * of a programmatically initiated smooth scroll or a user initiated touch scroll.
+         *
+         * @param position Position index of the first page currently being displayed.
+         *                 Page position+1 will be visible if positionOffset is nonzero.
+         * @param positionOffset Value from [0, 1) indicating the offset from the page at position.
+         * @param positionOffsetPixels Value in pixels indicating the offset from position.
+         */
+        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels);
+
+        /**
+         * This method will be invoked when a new page becomes selected. Animation is not
+         * necessarily complete.
+         *
+         * @param position Position index of the new selected page.
+         */
+        public void onPageSelected(int position);
+
+        /**
+         * Called when the scroll state changes. Useful for discovering when the user
+         * begins dragging, when the pager is automatically settling to the current page,
+         * or when it is fully stopped/idle.
+         *
+         * @param state The new scroll state.
+         * @see ViewPager#SCROLL_STATE_IDLE
+         * @see ViewPager#SCROLL_STATE_DRAGGING
+         * @see ViewPager#SCROLL_STATE_SETTLING
+         */
+        public void onPageScrollStateChanged(int state);
+    }
+
+    /**
+     * Simple implementation of the {@link OnPageChangeListener} interface with stub
+     * implementations of each method. Extend this if you do not intend to override
+     * every method of {@link OnPageChangeListener}.
+     */
+    public static class SimpleOnPageChangeListener implements OnPageChangeListener {
+        @Override
+        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
+            // This space for rent
+        }
+
+        @Override
+        public void onPageSelected(int position) {
+            // This space for rent
+        }
+
+        @Override
+        public void onPageScrollStateChanged(int state) {
+            // This space for rent
+        }
+    }
+
+    /**
+     * A PageTransformer is invoked whenever a visible/attached page is scrolled.
+     * This offers an opportunity for the application to apply a custom transformation
+     * to the page views using animation properties.
+     *
+     * <p>As property animation is only supported as of Android 3.0 and forward,
+     * setting a PageTransformer on a ViewPager on earlier platform versions will
+     * be ignored.</p>
+     */
+    public interface PageTransformer {
+        /**
+         * Apply a property transformation to the given page.
+         *
+         * @param page Apply the transformation to this page
+         * @param position Position of page relative to the current front-and-center
+         *                 position of the pager. 0 is front and center. 1 is one full
+         *                 page position to the right, and -1 is one page position to the left.
+         */
+        public void transformPage(View page, float position);
+    }
+
+    /**
+     * Callback interface for responding to adapter changes.
+     */
+    public interface OnAdapterChangeListener {
+        /**
+         * Called when the adapter for the given view pager has changed.
+         *
+         * @param viewPager  ViewPager where the adapter change has happened
+         * @param oldAdapter the previously set adapter
+         * @param newAdapter the newly set adapter
+         */
+        void onAdapterChanged(@NonNull ViewPager viewPager,
+                @Nullable PagerAdapter oldAdapter, @Nullable PagerAdapter newAdapter);
+    }
+
+    /**
+     * Annotation which allows marking of views to be decoration views when added to a view
+     * pager.
+     *
+     * <p>Views marked with this annotation can be added to the view pager with a layout resource.
+     * An example being {@link PagerTitleStrip}.</p>
+     *
+     * <p>You can also control whether a view is a decor view but setting
+     * {@link LayoutParams#isDecor} on the child's layout params.</p>
+     */
+    @Retention(RetentionPolicy.RUNTIME)
+    @Target(ElementType.TYPE)
+    public @interface DecorView {
+    }
+
+    public ViewPager(Context context) {
+        super(context);
+        initViewPager();
+    }
+
+    public ViewPager(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        initViewPager();
+    }
+
+    void initViewPager() {
+        setWillNotDraw(false);
+        setDescendantFocusability(FOCUS_AFTER_DESCENDANTS);
+        setFocusable(true);
+        final Context context = getContext();
+        mScroller = new Scroller(context, sInterpolator);
+        final ViewConfiguration configuration = ViewConfiguration.get(context);
+        final float density = context.getResources().getDisplayMetrics().density;
+
+        mTouchSlop = configuration.getScaledPagingTouchSlop();
+        mMinimumVelocity = (int) (MIN_FLING_VELOCITY * density);
+        mMaximumVelocity = configuration.getScaledMaximumFlingVelocity();
+        mLeftEdge = new EdgeEffectCompat(context);
+        mRightEdge = new EdgeEffectCompat(context);
+
+        mFlingDistance = (int) (MIN_DISTANCE_FOR_FLING * density);
+        mCloseEnough = (int) (CLOSE_ENOUGH * density);
+        mDefaultGutterSize = (int) (DEFAULT_GUTTER_SIZE * density);
+
+        ViewCompat.setAccessibilityDelegate(this, new MyAccessibilityDelegate());
+
+        if (ViewCompat.getImportantForAccessibility(this)
+                == ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_AUTO) {
+            ViewCompat.setImportantForAccessibility(this,
+                    ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_YES);
+        }
+
+        ViewCompat.setOnApplyWindowInsetsListener(this,
+                new android.support.v4.view.OnApplyWindowInsetsListener() {
+                    private final Rect mTempRect = new Rect();
+
+                    @Override
+                    public WindowInsetsCompat onApplyWindowInsets(final View v,
+                            final WindowInsetsCompat originalInsets) {
+                        // First let the ViewPager itself try and consume them...
+                        final WindowInsetsCompat applied =
+                                ViewCompat.onApplyWindowInsets(v, originalInsets);
+                        if (applied.isConsumed()) {
+                            // If the ViewPager consumed all insets, return now
+                            return applied;
+                        }
+
+                        // Now we'll manually dispatch the insets to our children. Since ViewPager
+                        // children are always full-height, we do not want to use the standard
+                        // ViewGroup dispatchApplyWindowInsets since if child 0 consumes them,
+                        // the rest of the children will not receive any insets. To workaround this
+                        // we manually dispatch the applied insets, not allowing children to
+                        // consume them from each other. We do however keep track of any insets
+                        // which are consumed, returning the union of our children's consumption
+                        final Rect res = mTempRect;
+                        res.left = applied.getSystemWindowInsetLeft();
+                        res.top = applied.getSystemWindowInsetTop();
+                        res.right = applied.getSystemWindowInsetRight();
+                        res.bottom = applied.getSystemWindowInsetBottom();
+
+                        for (int i = 0, count = getChildCount(); i < count; i++) {
+                            final WindowInsetsCompat childInsets = ViewCompat
+                                    .dispatchApplyWindowInsets(getChildAt(i), applied);
+                            // Now keep track of any consumed by tracking each dimension's min
+                            // value
+                            res.left = Math.min(childInsets.getSystemWindowInsetLeft(),
+                                    res.left);
+                            res.top = Math.min(childInsets.getSystemWindowInsetTop(),
+                                    res.top);
+                            res.right = Math.min(childInsets.getSystemWindowInsetRight(),
+                                    res.right);
+                            res.bottom = Math.min(childInsets.getSystemWindowInsetBottom(),
+                                    res.bottom);
+                        }
+
+                        // Now return a new WindowInsets, using the consumed window insets
+                        return applied.replaceSystemWindowInsets(
+                                res.left, res.top, res.right, res.bottom);
+                    }
+                });
+    }
+
+    @Override
+    protected void onDetachedFromWindow() {
+        removeCallbacks(mEndScrollRunnable);
+        // To be on the safe side, abort the scroller
+        if ((mScroller != null) && !mScroller.isFinished()) {
+            mScroller.abortAnimation();
+        }
+        super.onDetachedFromWindow();
+    }
+
+    private void setScrollState(int newState) {
+        if (mScrollState == newState) {
+            return;
+        }
+
+        mScrollState = newState;
+        if (mPageTransformer != null) {
+            // PageTransformers can do complex things that benefit from hardware layers.
+            enableLayers(newState != SCROLL_STATE_IDLE);
+        }
+        dispatchOnScrollStateChanged(newState);
+    }
+
+    /**
+     * Set a PagerAdapter that will supply views for this pager as needed.
+     *
+     * @param adapter Adapter to use
+     */
+    public void setAdapter(PagerAdapter adapter) {
+        if (mAdapter != null) {
+            mAdapter.setViewPagerObserver(null);
+            mAdapter.startUpdate(this);
+            for (int i = 0; i < mItems.size(); i++) {
+                final ItemInfo ii = mItems.get(i);
+                mAdapter.destroyItem(this, ii.position, ii.object);
+            }
+            mAdapter.finishUpdate(this);
+            mItems.clear();
+            removeNonDecorViews();
+            mCurItem = 0;
+            scrollTo(0, 0);
+        }
+
+        final PagerAdapter oldAdapter = mAdapter;
+        mAdapter = adapter;
+        mExpectedAdapterCount = 0;
+
+        if (mAdapter != null) {
+            if (mObserver == null) {
+                mObserver = new PagerObserver();
+            }
+            mAdapter.setViewPagerObserver(mObserver);
+            mPopulatePending = false;
+            final boolean wasFirstLayout = mFirstLayout;
+            mFirstLayout = true;
+            mExpectedAdapterCount = mAdapter.getCount();
+            if (mRestoredCurItem >= 0) {
+                mAdapter.restoreState(mRestoredAdapterState, mRestoredClassLoader);
+                setCurrentItemInternal(mRestoredCurItem, false, true);
+                mRestoredCurItem = -1;
+                mRestoredAdapterState = null;
+                mRestoredClassLoader = null;
+            } else if (!wasFirstLayout) {
+                populate();
+            } else {
+                requestLayout();
+            }
+        }
+
+        // Dispatch the change to any listeners
+        if (mAdapterChangeListeners != null && !mAdapterChangeListeners.isEmpty()) {
+            for (int i = 0, count = mAdapterChangeListeners.size(); i < count; i++) {
+                mAdapterChangeListeners.get(i).onAdapterChanged(this, oldAdapter, adapter);
+            }
+        }
+    }
+
+    private void removeNonDecorViews() {
+        for (int i = 0; i < getChildCount(); i++) {
+            final View child = getChildAt(i);
+            final LayoutParams lp = (LayoutParams) child.getLayoutParams();
+            if (!lp.isDecor) {
+                removeViewAt(i);
+                i--;
+            }
+        }
+    }
+
+    /**
+     * Retrieve the current adapter supplying pages.
+     *
+     * @return The currently registered PagerAdapter
+     */
+    public PagerAdapter getAdapter() {
+        return mAdapter;
+    }
+
+    /**
+     * Add a listener that will be invoked whenever the adapter for this ViewPager changes.
+     *
+     * @param listener listener to add
+     */
+    public void addOnAdapterChangeListener(@NonNull OnAdapterChangeListener listener) {
+        if (mAdapterChangeListeners == null) {
+            mAdapterChangeListeners = new ArrayList<>();
+        }
+        mAdapterChangeListeners.add(listener);
+    }
+
+    /**
+     * Remove a listener that was previously added via
+     * {@link #addOnAdapterChangeListener(OnAdapterChangeListener)}.
+     *
+     * @param listener listener to remove
+     */
+    public void removeOnAdapterChangeListener(@NonNull OnAdapterChangeListener listener) {
+        if (mAdapterChangeListeners != null) {
+            mAdapterChangeListeners.remove(listener);
+        }
+    }
+
+    private int getClientWidth() {
+        return getMeasuredWidth() - getPaddingLeft() - getPaddingRight();
+    }
+
+    /**
+     * Set the currently selected page. If the ViewPager has already been through its first
+     * layout with its current adapter there will be a smooth animated transition between
+     * the current item and the specified item.
+     *
+     * @param item Item index to select
+     */
+    public void setCurrentItem(int item) {
+        mPopulatePending = false;
+        setCurrentItemInternal(item, !mFirstLayout, false);
+    }
+
+    /**
+     * Set the currently selected page.
+     *
+     * @param item Item index to select
+     * @param smoothScroll True to smoothly scroll to the new item, false to transition immediately
+     */
+    public void setCurrentItem(int item, boolean smoothScroll) {
+        mPopulatePending = false;
+        setCurrentItemInternal(item, smoothScroll, false);
+    }
+
+    public int getCurrentItem() {
+        return mCurItem;
+    }
+
+    void setCurrentItemInternal(int item, boolean smoothScroll, boolean always) {
+        setCurrentItemInternal(item, smoothScroll, always, 0);
+    }
+
+    void setCurrentItemInternal(int item, boolean smoothScroll, boolean always, int velocity) {
+        if (mAdapter == null || mAdapter.getCount() <= 0) {
+            setScrollingCacheEnabled(false);
+            return;
+        }
+        if (!always && mCurItem == item && mItems.size() != 0) {
+            setScrollingCacheEnabled(false);
+            return;
+        }
+
+        if (item < 0) {
+            item = 0;
+        } else if (item >= mAdapter.getCount()) {
+            item = mAdapter.getCount() - 1;
+        }
+        final int pageLimit = mOffscreenPageLimit;
+        if (item > (mCurItem + pageLimit) || item < (mCurItem - pageLimit)) {
+            // We are doing a jump by more than one page.  To avoid
+            // glitches, we want to keep all current pages in the view
+            // until the scroll ends.
+            for (int i=0; i<mItems.size(); i++) {
+                mItems.get(i).scrolling = true;
+            }
+        }
+        final boolean dispatchSelected = mCurItem != item;
+
+        if (mFirstLayout) {
+            // We don't have any idea how big we are yet and shouldn't have any pages either.
+            // Just set things up and let the pending layout handle things.
+            mCurItem = item;
+            if (dispatchSelected) {
+                dispatchOnPageSelected(item);
+            }
+            requestLayout();
+        } else {
+            populate(item);
+            scrollToItem(item, smoothScroll, velocity, dispatchSelected);
+        }
+    }
+
+    private void scrollToItem(int item, boolean smoothScroll, int velocity,
+            boolean dispatchSelected) {
+        final ItemInfo curInfo = infoForPosition(item);
+        int destX = 0;
+        if (curInfo != null) {
+            final int width = getClientWidth();
+            destX = (int) (width * Math.max(mFirstOffset,
+                    Math.min(curInfo.offset, mLastOffset)));
+        }
+        if (smoothScroll) {
+            smoothScrollTo(destX, 0, velocity);
+            if (dispatchSelected) {
+                dispatchOnPageSelected(item);
+            }
+        } else {
+            if (dispatchSelected) {
+                dispatchOnPageSelected(item);
+            }
+            completeScroll(false);
+            scrollTo(destX, 0);
+            pageScrolled(destX);
+        }
+    }
+
+    /**
+     * Set a listener that will be invoked whenever the page changes or is incrementally
+     * scrolled. See {@link OnPageChangeListener}.
+     *
+     * @param listener Listener to set
+     *
+     * @deprecated Use {@link #addOnPageChangeListener(OnPageChangeListener)}
+     * and {@link #removeOnPageChangeListener(OnPageChangeListener)} instead.
+     */
+    @Deprecated
+    public void setOnPageChangeListener(OnPageChangeListener listener) {
+        mOnPageChangeListener = listener;
+    }
+
+    /**
+     * Add a listener that will be invoked whenever the page changes or is incrementally
+     * scrolled. See {@link OnPageChangeListener}.
+     *
+     * <p>Components that add a listener should take care to remove it when finished.
+     * Other components that take ownership of a view may call {@link #clearOnPageChangeListeners()}
+     * to remove all attached listeners.</p>
+     *
+     * @param listener listener to add
+     */
+    public void addOnPageChangeListener(OnPageChangeListener listener) {
+        if (mOnPageChangeListeners == null) {
+            mOnPageChangeListeners = new ArrayList<>();
+        }
+        mOnPageChangeListeners.add(listener);
+    }
+
+    /**
+     * Remove a listener that was previously added via
+     * {@link #addOnPageChangeListener(OnPageChangeListener)}.
+     *
+     * @param listener listener to remove
+     */
+    public void removeOnPageChangeListener(OnPageChangeListener listener) {
+        if (mOnPageChangeListeners != null) {
+            mOnPageChangeListeners.remove(listener);
+        }
+    }
+
+    /**
+     * Remove all listeners that are notified of any changes in scroll state or position.
+     */
+    public void clearOnPageChangeListeners() {
+        if (mOnPageChangeListeners != null) {
+            mOnPageChangeListeners.clear();
+        }
+    }
+
+    /**
+     * Set a {@link PageTransformer} that will be called for each attached page whenever
+     * the scroll position is changed. This allows the application to apply custom property
+     * transformations to each page, overriding the default sliding look and feel.
+     *
+     * <p><em>Note:</em> Prior to Android 3.0 the property animation APIs did not exist.
+     * As a result, setting a PageTransformer prior to Android 3.0 (API 11) will have no effect.</p>
+     *
+     * @param reverseDrawingOrder true if the supplied PageTransformer requires page views
+     *                            to be drawn from last to first instead of first to last.
+     * @param transformer PageTransformer that will modify each page's animation properties
+     */
+    public void setPageTransformer(boolean reverseDrawingOrder, PageTransformer transformer) {
+        if (Build.VERSION.SDK_INT >= 11) {
+            final boolean hasTransformer = transformer != null;
+            final boolean needsPopulate = hasTransformer != (mPageTransformer != null);
+            mPageTransformer = transformer;
+            setChildrenDrawingOrderEnabledCompat(hasTransformer);
+            if (hasTransformer) {
+                mDrawingOrder = reverseDrawingOrder ? DRAW_ORDER_REVERSE : DRAW_ORDER_FORWARD;
+            } else {
+                mDrawingOrder = DRAW_ORDER_DEFAULT;
+            }
+            if (needsPopulate) populate();
+        }
+    }
+
+    void setChildrenDrawingOrderEnabledCompat(boolean enable) {
+        if (Build.VERSION.SDK_INT >= 7) {
+            if (mSetChildrenDrawingOrderEnabled == null) {
+                try {
+                    mSetChildrenDrawingOrderEnabled = ViewGroup.class.getDeclaredMethod(
+                            "setChildrenDrawingOrderEnabled", new Class[] { Boolean.TYPE });
+                } catch (NoSuchMethodException e) {
+                    Log.e(TAG, "Can't find setChildrenDrawingOrderEnabled", e);
+                }
+            }
+            try {
+                mSetChildrenDrawingOrderEnabled.invoke(this, enable);
+            } catch (Exception e) {
+                Log.e(TAG, "Error changing children drawing order", e);
+            }
+        }
+    }
+
+    @Override
+    protected int getChildDrawingOrder(int childCount, int i) {
+        final int index = mDrawingOrder == DRAW_ORDER_REVERSE ? childCount - 1 - i : i;
+        final int result = ((LayoutParams) mDrawingOrderedChildren.get(index).getLayoutParams()).childIndex;
+        return result;
+    }
+
+    /**
+     * Set a separate OnPageChangeListener for internal use by the support library.
+     *
+     * @param listener Listener to set
+     * @return The old listener that was set, if any.
+     */
+    OnPageChangeListener setInternalPageChangeListener(OnPageChangeListener listener) {
+        OnPageChangeListener oldListener = mInternalPageChangeListener;
+        mInternalPageChangeListener = listener;
+        return oldListener;
+    }
+
+    /**
+     * Returns the number of pages that will be retained to either side of the
+     * current page in the view hierarchy in an idle state. Defaults to 1.
+     *
+     * @return How many pages will be kept offscreen on either side
+     * @see #setOffscreenPageLimit(int)
+     */
+    public int getOffscreenPageLimit() {
+        return mOffscreenPageLimit;
+    }
+
+    /**
+     * Set the number of pages that should be retained to either side of the
+     * current page in the view hierarchy in an idle state. Pages beyond this
+     * limit will be recreated from the adapter when needed.
+     *
+     * <p>This is offered as an optimization. If you know in advance the number
+     * of pages you will need to support or have lazy-loading mechanisms in place
+     * on your pages, tweaking this setting can have benefits in perceived smoothness
+     * of paging animations and interaction. If you have a small number of pages (3-4)
+     * that you can keep active all at once, less time will be spent in layout for
+     * newly created view subtrees as the user pages back and forth.</p>
+     *
+     * <p>You should keep this limit low, especially if your pages have complex layouts.
+     * This setting defaults to 1.</p>
+     *
+     * @param limit How many pages will be kept offscreen in an idle state.
+     */
+    public void setOffscreenPageLimit(int limit) {
+        if (limit < DEFAULT_OFFSCREEN_PAGES) {
+            Log.w(TAG, "Requested offscreen page limit " + limit + " too small; defaulting to " +
+                    DEFAULT_OFFSCREEN_PAGES);
+            limit = DEFAULT_OFFSCREEN_PAGES;
+        }
+        if (limit != mOffscreenPageLimit) {
+            mOffscreenPageLimit = limit;
+            populate();
+        }
+    }
+
+    /**
+     * Set the margin between pages.
+     *
+     * @param marginPixels Distance between adjacent pages in pixels
+     * @see #getPageMargin()
+     * @see #setPageMarginDrawable(Drawable)
+     * @see #setPageMarginDrawable(int)
+     */
+    public void setPageMargin(int marginPixels) {
+        final int oldMargin = mPageMargin;
+        mPageMargin = marginPixels;
+
+        final int width = getWidth();
+        recomputeScrollPosition(width, width, marginPixels, oldMargin);
+
+        requestLayout();
+    }
+
+    /**
+     * Return the margin between pages.
+     *
+     * @return The size of the margin in pixels
+     */
+    public int getPageMargin() {
+        return mPageMargin;
+    }
+
+    /**
+     * Set a drawable that will be used to fill the margin between pages.
+     *
+     * @param d Drawable to display between pages
+     */
+    public void setPageMarginDrawable(Drawable d) {
+        mMarginDrawable = d;
+        if (d != null) refreshDrawableState();
+        setWillNotDraw(d == null);
+        invalidate();
+    }
+
+    /**
+     * Set a drawable that will be used to fill the margin between pages.
+     *
+     * @param resId Resource ID of a drawable to display between pages
+     */
+    public void setPageMarginDrawable(@DrawableRes int resId) {
+        setPageMarginDrawable(getContext().getResources().getDrawable(resId));
+    }
+
+    @Override
+    protected boolean verifyDrawable(Drawable who) {
+        return super.verifyDrawable(who) || who == mMarginDrawable;
+    }
+
+    @Override
+    protected void drawableStateChanged() {
+        super.drawableStateChanged();
+        final Drawable d = mMarginDrawable;
+        if (d != null && d.isStateful()) {
+            d.setState(getDrawableState());
+        }
+    }
+
+    // We want the duration of the page snap animation to be influenced by the distance that
+    // the screen has to travel, however, we don't want this duration to be effected in a
+    // purely linear fashion. Instead, we use this method to moderate the effect that the distance
+    // of travel has on the overall snap duration.
+    float distanceInfluenceForSnapDuration(float f) {
+        f -= 0.5f; // center the values about 0.
+        f *= 0.3f * Math.PI / 2.0f;
+        return (float) Math.sin(f);
+    }
+
+    /**
+     * Like {@link View#scrollBy}, but scroll smoothly instead of immediately.
+     *
+     * @param x the number of pixels to scroll by on the X axis
+     * @param y the number of pixels to scroll by on the Y axis
+     */
+    void smoothScrollTo(int x, int y) {
+        smoothScrollTo(x, y, 0);
+    }
+
+    /**
+     * Like {@link View#scrollBy}, but scroll smoothly instead of immediately.
+     *
+     * @param x the number of pixels to scroll by on the X axis
+     * @param y the number of pixels to scroll by on the Y axis
+     * @param velocity the velocity associated with a fling, if applicable. (0 otherwise)
+     */
+    void smoothScrollTo(int x, int y, int velocity) {
+        if (getChildCount() == 0) {
+            // Nothing to do.
+            setScrollingCacheEnabled(false);
+            return;
+        }
+
+        int sx;
+        boolean wasScrolling = (mScroller != null) && !mScroller.isFinished();
+        if (wasScrolling) {
+            // We're in the middle of a previously initiated scrolling. Check to see
+            // whether that scrolling has actually started (if we always call getStartX
+            // we can get a stale value from the scroller if it hadn't yet had its first
+            // computeScrollOffset call) to decide what is the current scrolling position.
+            sx = mIsScrollStarted ? mScroller.getCurrX() : mScroller.getStartX();
+            // And abort the current scrolling.
+            mScroller.abortAnimation();
+            setScrollingCacheEnabled(false);
+        } else {
+            sx = getScrollX();
+        }
+        int sy = getScrollY();
+        int dx = x - sx;
+        int dy = y - sy;
+        if (dx == 0 && dy == 0) {
+            completeScroll(false);
+            populate();
+            setScrollState(SCROLL_STATE_IDLE);
+            return;
+        }
+
+        setScrollingCacheEnabled(true);
+        setScrollState(SCROLL_STATE_SETTLING);
+
+        final int width = getClientWidth();
+        final int halfWidth = width / 2;
+        final float distanceRatio = Math.min(1f, 1.0f * Math.abs(dx) / width);
+        final float distance = halfWidth + halfWidth *
+                distanceInfluenceForSnapDuration(distanceRatio);
+
+        int duration;
+        velocity = Math.abs(velocity);
+        if (velocity > 0) {
+            duration = 4 * Math.round(1000 * Math.abs(distance / velocity));
+        } else {
+            final float pageWidth = width * mAdapter.getPageWidth(mCurItem);
+            final float pageDelta = (float) Math.abs(dx) / (pageWidth + mPageMargin);
+            duration = (int) ((pageDelta + 1) * 100);
+        }
+        duration = Math.min(duration, MAX_SETTLE_DURATION);
+
+        // Reset the "scroll started" flag. It will be flipped to true in all places
+        // where we call computeScrollOffset().
+        mIsScrollStarted = false;
+        mScroller.startScroll(sx, sy, dx, dy, duration);
+        ViewCompat.postInvalidateOnAnimation(this);
+    }
+
+    ItemInfo addNewItem(int position, int index) {
+        ItemInfo ii = new ItemInfo();
+        ii.position = position;
+        ii.object = mAdapter.instantiateItem(this, position);
+        ii.widthFactor = mAdapter.getPageWidth(position);
+        if (index < 0 || index >= mItems.size()) {
+            mItems.add(ii);
+        } else {
+            mItems.add(index, ii);
+        }
+        return ii;
+    }
+
+    void dataSetChanged() {
+        // This method only gets called if our observer is attached, so mAdapter is non-null.
+
+        final int adapterCount = mAdapter.getCount();
+        mExpectedAdapterCount = adapterCount;
+        boolean needPopulate = mItems.size() < mOffscreenPageLimit * 2 + 1 &&
+                mItems.size() < adapterCount;
+        int newCurrItem = mCurItem;
+
+        boolean isUpdating = false;
+        for (int i = 0; i < mItems.size(); i++) {
+            final ItemInfo ii = mItems.get(i);
+            final int newPos = mAdapter.getItemPosition(ii.object);
+
+            if (newPos == PagerAdapter.POSITION_UNCHANGED) {
+                continue;
+            }
+
+            if (newPos == PagerAdapter.POSITION_NONE) {
+                mItems.remove(i);
+                i--;
+
+                if (!isUpdating) {
+                    mAdapter.startUpdate(this);
+                    isUpdating = true;
+                }
+
+                mAdapter.destroyItem(this, ii.position, ii.object);
+                needPopulate = true;
+
+                if (mCurItem == ii.position) {
+                    // Keep the current item in the valid range
+                    newCurrItem = Math.max(0, Math.min(mCurItem, adapterCount - 1));
+                    needPopulate = true;
+                }
+                continue;
+            }
+
+            if (ii.position != newPos) {
+                if (ii.position == mCurItem) {
+                    // Our current item changed position. Follow it.
+                    newCurrItem = newPos;
+                }
+
+                ii.position = newPos;
+                needPopulate = true;
+            }
+        }
+
+        if (isUpdating) {
+            mAdapter.finishUpdate(this);
+        }
+
+        Collections.sort(mItems, COMPARATOR);
+
+        if (needPopulate) {
+            // Reset our known page widths; populate will recompute them.
+            final int childCount = getChildCount();
+            for (int i = 0; i < childCount; i++) {
+                final View child = getChildAt(i);
+                final LayoutParams lp = (LayoutParams) child.getLayoutParams();
+                if (!lp.isDecor) {
+                    lp.widthFactor = 0.f;
+                }
+            }
+
+            setCurrentItemInternal(newCurrItem, false, true);
+            requestLayout();
+        }
+    }
+
+    void populate() {
+        populate(mCurItem);
+    }
+
+    void populate(int newCurrentItem) {
+        ItemInfo oldCurInfo = null;
+        if (mCurItem != newCurrentItem) {
+            oldCurInfo = infoForPosition(mCurItem);
+            mCurItem = newCurrentItem;
+        }
+
+        if (mAdapter == null) {
+            sortChildDrawingOrder();
+            return;
+        }
+
+        // Bail now if we are waiting to populate.  This is to hold off
+        // on creating views from the time the user releases their finger to
+        // fling to a new position until we have finished the scroll to
+        // that position, avoiding glitches from happening at that point.
+        if (mPopulatePending) {
+            if (DEBUG) Log.i(TAG, "populate is pending, skipping for now...");
+            sortChildDrawingOrder();
+            return;
+        }
+
+        // Also, don't populate until we are attached to a window.  This is to
+        // avoid trying to populate before we have restored our view hierarchy
+        // state and conflicting with what is restored.
+        if (getWindowToken() == null) {
+            return;
+        }
+
+        mAdapter.startUpdate(this);
+
+        final int pageLimit = mOffscreenPageLimit;
+        final int startPos = Math.max(0, mCurItem - pageLimit);
+        final int N = mAdapter.getCount();
+        final int endPos = Math.min(N-1, mCurItem + pageLimit);
+
+        if (N != mExpectedAdapterCount) {
+            String resName;
+            try {
+                resName = getResources().getResourceName(getId());
+            } catch (Resources.NotFoundException e) {
+                resName = Integer.toHexString(getId());
+            }
+            throw new IllegalStateException("The application's PagerAdapter changed the adapter's" +
+                    " contents without calling PagerAdapter#notifyDataSetChanged!" +
+                    " Expected adapter item count: " + mExpectedAdapterCount + ", found: " + N +
+                    " Pager id: " + resName +
+                    " Pager class: " + getClass() +
+                    " Problematic adapter: " + mAdapter.getClass());
+        }
+
+        // Locate the currently focused item or add it if needed.
+        int curIndex = -1;
+        ItemInfo curItem = null;
+        for (curIndex = 0; curIndex < mItems.size(); curIndex++) {
+            final ItemInfo ii = mItems.get(curIndex);
+            if (ii.position >= mCurItem) {
+                if (ii.position == mCurItem) curItem = ii;
+                break;
+            }
+        }
+
+        if (curItem == null && N > 0) {
+            curItem = addNewItem(mCurItem, curIndex);
+        }
+
+        // Fill 3x the available width or up to the number of offscreen
+        // pages requested to either side, whichever is larger.
+        // If we have no current item we have no work to do.
+        if (curItem != null) {
+            float extraWidthLeft = 0.f;
+            int itemIndex = curIndex - 1;
+            ItemInfo ii = itemIndex >= 0 ? mItems.get(itemIndex) : null;
+            final int clientWidth = getClientWidth();
+            final float leftWidthNeeded = clientWidth <= 0 ? 0 :
+                    2.f - curItem.widthFactor + (float) getPaddingLeft() / (float) clientWidth;
+            for (int pos = mCurItem - 1; pos >= 0; pos--) {
+                if (extraWidthLeft >= leftWidthNeeded && pos < startPos) {
+                    if (ii == null) {
+                        break;
+                    }
+                    if (pos == ii.position && !ii.scrolling) {
+                        mItems.remove(itemIndex);
+                        mAdapter.destroyItem(this, pos, ii.object);
+                        if (DEBUG) {
+                            Log.i(TAG, "populate() - destroyItem() with pos: " + pos +
+                                    " view: " + ((View) ii.object));
+                        }
+                        itemIndex--;
+                        curIndex--;
+                        ii = itemIndex >= 0 ? mItems.get(itemIndex) : null;
+                    }
+                } else if (ii != null && pos == ii.position) {
+                    extraWidthLeft += ii.widthFactor;
+                    itemIndex--;
+                    ii = itemIndex >= 0 ? mItems.get(itemIndex) : null;
+                } else {
+                    ii = addNewItem(pos, itemIndex + 1);
+                    extraWidthLeft += ii.widthFactor;
+                    curIndex++;
+                    ii = itemIndex >= 0 ? mItems.get(itemIndex) : null;
+                }
+            }
+
+            float extraWidthRight = curItem.widthFactor;
+            itemIndex = curIndex + 1;
+            if (extraWidthRight < 2.f) {
+                ii = itemIndex < mItems.size() ? mItems.get(itemIndex) : null;
+                final float rightWidthNeeded = clientWidth <= 0 ? 0 :
+                        (float) getPaddingRight() / (float) clientWidth + 2.f;
+                for (int pos = mCurItem + 1; pos < N; pos++) {
+                    if (extraWidthRight >= rightWidthNeeded && pos > endPos) {
+                        if (ii == null) {
+                            break;
+                        }
+                        if (pos == ii.position && !ii.scrolling) {
+                            mItems.remove(itemIndex);
+                            mAdapter.destroyItem(this, pos, ii.object);
+                            if (DEBUG) {
+                                Log.i(TAG, "populate() - destroyItem() with pos: " + pos +
+                                        " view: " + ((View) ii.object));
+                            }
+                            ii = itemIndex < mItems.size() ? mItems.get(itemIndex) : null;
+                        }
+                    } else if (ii != null && pos == ii.position) {
+                        extraWidthRight += ii.widthFactor;
+                        itemIndex++;
+                        ii = itemIndex < mItems.size() ? mItems.get(itemIndex) : null;
+                    } else {
+                        ii = addNewItem(pos, itemIndex);
+                        itemIndex++;
+                        extraWidthRight += ii.widthFactor;
+                        ii = itemIndex < mItems.size() ? mItems.get(itemIndex) : null;
+                    }
+                }
+            }
+
+            calculatePageOffsets(curItem, curIndex, oldCurInfo);
+        }
+
+        if (DEBUG) {
+            Log.i(TAG, "Current page list:");
+            for (int i=0; i<mItems.size(); i++) {
+                Log.i(TAG, "#" + i + ": page " + mItems.get(i).position);
+            }
+        }
+
+        mAdapter.setPrimaryItem(this, mCurItem, curItem != null ? curItem.object : null);
+
+        mAdapter.finishUpdate(this);
+
+        // Check width measurement of current pages and drawing sort order.
+        // Update LayoutParams as needed.
+        final int childCount = getChildCount();
+        for (int i = 0; i < childCount; i++) {
+            final View child = getChildAt(i);
+            final LayoutParams lp = (LayoutParams) child.getLayoutParams();
+            lp.childIndex = i;
+            if (!lp.isDecor && lp.widthFactor == 0.f) {
+                // 0 means requery the adapter for this, it doesn't have a valid width.
+                final ItemInfo ii = infoForChild(child);
+                if (ii != null) {
+                    lp.widthFactor = ii.widthFactor;
+                    lp.position = ii.position;
+                }
+            }
+        }
+        sortChildDrawingOrder();
+
+        if (hasFocus()) {
+            View currentFocused = findFocus();
+            ItemInfo ii = currentFocused != null ? infoForAnyChild(currentFocused) : null;
+            if (ii == null || ii.position != mCurItem) {
+                for (int i=0; i<getChildCount(); i++) {
+                    View child = getChildAt(i);
+                    ii = infoForChild(child);
+                    if (ii != null && ii.position == mCurItem) {
+                        if (child.requestFocus(View.FOCUS_FORWARD)) {
+                            break;
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    private void sortChildDrawingOrder() {
+        if (mDrawingOrder != DRAW_ORDER_DEFAULT) {
+            if (mDrawingOrderedChildren == null) {
+                mDrawingOrderedChildren = new ArrayList<View>();
+            } else {
+                mDrawingOrderedChildren.clear();
+            }
+            final int childCount = getChildCount();
+            for (int i = 0; i < childCount; i++) {
+                final View child = getChildAt(i);
+                mDrawingOrderedChildren.add(child);
+            }
+            Collections.sort(mDrawingOrderedChildren, sPositionComparator);
+        }
+    }
+
+    private void calculatePageOffsets(ItemInfo curItem, int curIndex, ItemInfo oldCurInfo) {
+        final int N = mAdapter.getCount();
+        final int width = getClientWidth();
+        final float marginOffset = width > 0 ? (float) mPageMargin / width : 0;
+        // Fix up offsets for later layout.
+        if (oldCurInfo != null) {
+            final int oldCurPosition = oldCurInfo.position;
+            // Base offsets off of oldCurInfo.
+            if (oldCurPosition < curItem.position) {
+                int itemIndex = 0;
+                ItemInfo ii = null;
+                float offset = oldCurInfo.offset + oldCurInfo.widthFactor + marginOffset;
+                for (int pos = oldCurPosition + 1;
+                        pos <= curItem.position && itemIndex < mItems.size(); pos++) {
+                    ii = mItems.get(itemIndex);
+                    while (pos > ii.position && itemIndex < mItems.size() - 1) {
+                        itemIndex++;
+                        ii = mItems.get(itemIndex);
+                    }
+                    while (pos < ii.position) {
+                        // We don't have an item populated for this,
+                        // ask the adapter for an offset.
+                        offset += mAdapter.getPageWidth(pos) + marginOffset;
+                        pos++;
+                    }
+                    ii.offset = offset;
+                    offset += ii.widthFactor + marginOffset;
+                }
+            } else if (oldCurPosition > curItem.position) {
+                int itemIndex = mItems.size() - 1;
+                ItemInfo ii = null;
+                float offset = oldCurInfo.offset;
+                for (int pos = oldCurPosition - 1;
+                        pos >= curItem.position && itemIndex >= 0; pos--) {
+                    ii = mItems.get(itemIndex);
+                    while (pos < ii.position && itemIndex > 0) {
+                        itemIndex--;
+                        ii = mItems.get(itemIndex);
+                    }
+                    while (pos > ii.position) {
+                        // We don't have an item populated for this,
+                        // ask the adapter for an offset.
+                        offset -= mAdapter.getPageWidth(pos) + marginOffset;
+                        pos--;
+                    }
+                    offset -= ii.widthFactor + marginOffset;
+                    ii.offset = offset;
+                }
+            }
+        }
+
+        // Base all offsets off of curItem.
+        final int itemCount = mItems.size();
+        float offset = curItem.offset;
+        int pos = curItem.position - 1;
+        mFirstOffset = curItem.position == 0 ? curItem.offset : -Float.MAX_VALUE;
+        mLastOffset = curItem.position == N - 1 ?
+                curItem.offset + curItem.widthFactor - 1 : Float.MAX_VALUE;
+        // Previous pages
+        for (int i = curIndex - 1; i >= 0; i--, pos--) {
+            final ItemInfo ii = mItems.get(i);
+            while (pos > ii.position) {
+                offset -= mAdapter.getPageWidth(pos--) + marginOffset;
+            }
+            offset -= ii.widthFactor + marginOffset;
+            ii.offset = offset;
+            if (ii.position == 0) mFirstOffset = offset;
+        }
+        offset = curItem.offset + curItem.widthFactor + marginOffset;
+        pos = curItem.position + 1;
+        // Next pages
+        for (int i = curIndex + 1; i < itemCount; i++, pos++) {
+            final ItemInfo ii = mItems.get(i);
+            while (pos < ii.position) {
+                offset += mAdapter.getPageWidth(pos++) + marginOffset;
+            }
+            if (ii.position == N - 1) {
+                mLastOffset = offset + ii.widthFactor - 1;
+            }
+            ii.offset = offset;
+            offset += ii.widthFactor + marginOffset;
+        }
+
+        mNeedCalculatePageOffsets = false;
+    }
+
+    /**
+     * This is the persistent state that is saved by ViewPager.  Only needed
+     * if you are creating a sublass of ViewPager that must save its own
+     * state, in which case it should implement a subclass of this which
+     * contains that state.
+     */
+    public static class SavedState extends AbsSavedState {
+        int position;
+        Parcelable adapterState;
+        ClassLoader loader;
+
+        public SavedState(Parcelable superState) {
+            super(superState);
+        }
+
+        @Override
+        public void writeToParcel(Parcel out, int flags) {
+            super.writeToParcel(out, flags);
+            out.writeInt(position);
+            out.writeParcelable(adapterState, flags);
+        }
+
+        @Override
+        public String toString() {
+            return "FragmentPager.SavedState{"
+                    + Integer.toHexString(System.identityHashCode(this))
+                    + " position=" + position + "}";
+        }
+
+        public static final Parcelable.Creator<SavedState> CREATOR
+                = ParcelableCompat.newCreator(new ParcelableCompatCreatorCallbacks<SavedState>() {
+                    @Override
+                    public SavedState createFromParcel(Parcel in, ClassLoader loader) {
+                        return new SavedState(in, loader);
+                    }
+                    @Override
+                    public SavedState[] newArray(int size) {
+                        return new SavedState[size];
+                    }
+                });
+
+        SavedState(Parcel in, ClassLoader loader) {
+            super(in, loader);
+            if (loader == null) {
+                loader = getClass().getClassLoader();
+            }
+            position = in.readInt();
+            adapterState = in.readParcelable(loader);
+            this.loader = loader;
+        }
+    }
+
+    @Override
+    public Parcelable onSaveInstanceState() {
+        Parcelable superState = super.onSaveInstanceState();
+        SavedState ss = new SavedState(superState);
+        ss.position = mCurItem;
+        if (mAdapter != null) {
+            ss.adapterState = mAdapter.saveState();
+        }
+        return ss;
+    }
+
+    @Override
+    public void onRestoreInstanceState(Parcelable state) {
+        if (!(state instanceof SavedState)) {
+            super.onRestoreInstanceState(state);
+            return;
+        }
+
+        SavedState ss = (SavedState)state;
+        super.onRestoreInstanceState(ss.getSuperState());
+
+        if (mAdapter != null) {
+            mAdapter.restoreState(ss.adapterState, ss.loader);
+            setCurrentItemInternal(ss.position, false, true);
+        } else {
+            mRestoredCurItem = ss.position;
+            mRestoredAdapterState = ss.adapterState;
+            mRestoredClassLoader = ss.loader;
+        }
+    }
+
+    @Override
+    public void addView(View child, int index, ViewGroup.LayoutParams params) {
+        if (!checkLayoutParams(params)) {
+            params = generateLayoutParams(params);
+        }
+        final LayoutParams lp = (LayoutParams) params;
+        // Any views added via inflation should be classed as part of the decor
+        lp.isDecor |= isDecorView(child);
+        if (mInLayout) {
+            if (lp != null && lp.isDecor) {
+                throw new IllegalStateException("Cannot add pager decor view during layout");
+            }
+            lp.needsMeasure = true;
+            addViewInLayout(child, index, params);
+        } else {
+            super.addView(child, index, params);
+        }
+
+        if (USE_CACHE) {
+            if (child.getVisibility() != GONE) {
+                child.setDrawingCacheEnabled(mScrollingCacheEnabled);
+            } else {
+                child.setDrawingCacheEnabled(false);
+            }
+        }
+    }
+
+    private static boolean isDecorView(@NonNull View view) {
+        Class<?> clazz = view.getClass();
+        return clazz.getAnnotation(DecorView.class) != null;
+    }
+
+    @Override
+    public void removeView(View view) {
+        if (mInLayout) {
+            removeViewInLayout(view);
+        } else {
+            super.removeView(view);
+        }
+    }
+
+    ItemInfo infoForChild(View child) {
+        for (int i=0; i<mItems.size(); i++) {
+            ItemInfo ii = mItems.get(i);
+            if (mAdapter.isViewFromObject(child, ii.object)) {
+                return ii;
+            }
+        }
+        return null;
+    }
+
+    ItemInfo infoForAnyChild(View child) {
+        ViewParent parent;
+        while ((parent=child.getParent()) != this) {
+            if (parent == null || !(parent instanceof View)) {
+                return null;
+            }
+            child = (View)parent;
+        }
+        return infoForChild(child);
+    }
+
+    ItemInfo infoForPosition(int position) {
+        for (int i = 0; i < mItems.size(); i++) {
+            ItemInfo ii = mItems.get(i);
+            if (ii.position == position) {
+                return ii;
+            }
+        }
+        return null;
+    }
+
+    @Override
+    protected void onAttachedToWindow() {
+        super.onAttachedToWindow();
+        mFirstLayout = true;
+    }
+
+    @Override
+    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+        // For simple implementation, our internal size is always 0.
+        // We depend on the container to specify the layout size of
+        // our view.  We can't really know what it is since we will be
+        // adding and removing different arbitrary views and do not
+        // want the layout to change as this happens.
+        setMeasuredDimension(getDefaultSize(0, widthMeasureSpec),
+                getDefaultSize(0, heightMeasureSpec));
+
+        final int measuredWidth = getMeasuredWidth();
+        final int maxGutterSize = measuredWidth / 10;
+        mGutterSize = Math.min(maxGutterSize, mDefaultGutterSize);
+
+        // Children are just made to fill our space.
+        int childWidthSize = measuredWidth - getPaddingLeft() - getPaddingRight();
+        int childHeightSize = getMeasuredHeight() - getPaddingTop() - getPaddingBottom();
+
+        /*
+         * Make sure all children have been properly measured. Decor views first.
+         * Right now we cheat and make this less complicated by assuming decor
+         * views won't intersect. We will pin to edges based on gravity.
+         */
+        int size = getChildCount();
+        for (int i = 0; i < size; ++i) {
+            final View child = getChildAt(i);
+            if (child.getVisibility() != GONE) {
+                final LayoutParams lp = (LayoutParams) child.getLayoutParams();
+                if (lp != null && lp.isDecor) {
+                    final int hgrav = lp.gravity & Gravity.HORIZONTAL_GRAVITY_MASK;
+                    final int vgrav = lp.gravity & Gravity.VERTICAL_GRAVITY_MASK;
+                    int widthMode = MeasureSpec.AT_MOST;
+                    int heightMode = MeasureSpec.AT_MOST;
+                    boolean consumeVertical = vgrav == Gravity.TOP || vgrav == Gravity.BOTTOM;
+                    boolean consumeHorizontal = hgrav == Gravity.LEFT || hgrav == Gravity.RIGHT;
+
+                    if (consumeVertical) {
+                        widthMode = MeasureSpec.EXACTLY;
+                    } else if (consumeHorizontal) {
+                        heightMode = MeasureSpec.EXACTLY;
+                    }
+
+                    int widthSize = childWidthSize;
+                    int heightSize = childHeightSize;
+                    if (lp.width != LayoutParams.WRAP_CONTENT) {
+                        widthMode = MeasureSpec.EXACTLY;
+                        if (lp.width != LayoutParams.FILL_PARENT) {
+                            widthSize = lp.width;
+                        }
+                    }
+                    if (lp.height != LayoutParams.WRAP_CONTENT) {
+                        heightMode = MeasureSpec.EXACTLY;
+                        if (lp.height != LayoutParams.FILL_PARENT) {
+                            heightSize = lp.height;
+                        }
+                    }
+                    final int widthSpec = MeasureSpec.makeMeasureSpec(widthSize, widthMode);
+                    final int heightSpec = MeasureSpec.makeMeasureSpec(heightSize, heightMode);
+                    child.measure(widthSpec, heightSpec);
+
+                    if (consumeVertical) {
+                        childHeightSize -= child.getMeasuredHeight();
+                    } else if (consumeHorizontal) {
+                        childWidthSize -= child.getMeasuredWidth();
+                    }
+                }
+            }
+        }
+
+        mChildWidthMeasureSpec = MeasureSpec.makeMeasureSpec(childWidthSize, MeasureSpec.EXACTLY);
+        mChildHeightMeasureSpec = MeasureSpec.makeMeasureSpec(childHeightSize, MeasureSpec.EXACTLY);
+
+        // Make sure we have created all fragments that we need to have shown.
+        mInLayout = true;
+        populate();
+        mInLayout = false;
+
+        // Page views next.
+        size = getChildCount();
+        for (int i = 0; i < size; ++i) {
+            final View child = getChildAt(i);
+            if (child.getVisibility() != GONE) {
+                if (DEBUG) Log.v(TAG, "Measuring #" + i + " " + child
+                        + ": " + mChildWidthMeasureSpec);
+
+                final LayoutParams lp = (LayoutParams) child.getLayoutParams();
+                if (lp == null || !lp.isDecor) {
+                    final int widthSpec = MeasureSpec.makeMeasureSpec(
+                            (int) (childWidthSize * lp.widthFactor), MeasureSpec.EXACTLY);
+                    child.measure(widthSpec, mChildHeightMeasureSpec);
+                }
+            }
+        }
+    }
+
+    @Override
+    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
+        super.onSizeChanged(w, h, oldw, oldh);
+
+        // Make sure scroll position is set correctly.
+        if (w != oldw) {
+            recomputeScrollPosition(w, oldw, mPageMargin, mPageMargin);
+        }
+    }
+
+    private void recomputeScrollPosition(int width, int oldWidth, int margin, int oldMargin) {
+        if (oldWidth > 0 && !mItems.isEmpty()) {
+            if (!mScroller.isFinished()) {
+                mScroller.setFinalX(getCurrentItem() * getClientWidth());
+            } else {
+                final int widthWithMargin = width - getPaddingLeft() - getPaddingRight() + margin;
+                final int oldWidthWithMargin = oldWidth - getPaddingLeft() - getPaddingRight()
+                        + oldMargin;
+                final int xpos = getScrollX();
+                final float pageOffset = (float) xpos / oldWidthWithMargin;
+                final int newOffsetPixels = (int) (pageOffset * widthWithMargin);
+
+                scrollTo(newOffsetPixels, getScrollY());
+            }
+        } else {
+            final ItemInfo ii = infoForPosition(mCurItem);
+            final float scrollOffset = ii != null ? Math.min(ii.offset, mLastOffset) : 0;
+            final int scrollPos = (int) (scrollOffset *
+                                         (width - getPaddingLeft() - getPaddingRight()));
+            if (scrollPos != getScrollX()) {
+                completeScroll(false);
+                scrollTo(scrollPos, getScrollY());
+            }
+        }
+    }
+
+    @Override
+    protected void onLayout(boolean changed, int l, int t, int r, int b) {
+        final int count = getChildCount();
+        int width = r - l;
+        int height = b - t;
+        int paddingLeft = getPaddingLeft();
+        int paddingTop = getPaddingTop();
+        int paddingRight = getPaddingRight();
+        int paddingBottom = getPaddingBottom();
+        final int scrollX = getScrollX();
+
+        int decorCount = 0;
+
+        // First pass - decor views. We need to do this in two passes so that
+        // we have the proper offsets for non-decor views later.
+        for (int i = 0; i < count; i++) {
+            final View child = getChildAt(i);
+            if (child.getVisibility() != GONE) {
+                final LayoutParams lp = (LayoutParams) child.getLayoutParams();
+                int childLeft = 0;
+                int childTop = 0;
+                if (lp.isDecor) {
+                    final int hgrav = lp.gravity & Gravity.HORIZONTAL_GRAVITY_MASK;
+                    final int vgrav = lp.gravity & Gravity.VERTICAL_GRAVITY_MASK;
+                    switch (hgrav) {
+                        default:
+                            childLeft = paddingLeft;
+                            break;
+                        case Gravity.LEFT:
+                            childLeft = paddingLeft;
+                            paddingLeft += child.getMeasuredWidth();
+                            break;
+                        case Gravity.CENTER_HORIZONTAL:
+                            childLeft = Math.max((width - child.getMeasuredWidth()) / 2,
+                                    paddingLeft);
+                            break;
+                        case Gravity.RIGHT:
+                            childLeft = width - paddingRight - child.getMeasuredWidth();
+                            paddingRight += child.getMeasuredWidth();
+                            break;
+                    }
+                    switch (vgrav) {
+                        default:
+                            childTop = paddingTop;
+                            break;
+                        case Gravity.TOP:
+                            childTop = paddingTop;
+                            paddingTop += child.getMeasuredHeight();
+                            break;
+                        case Gravity.CENTER_VERTICAL:
+                            childTop = Math.max((height - child.getMeasuredHeight()) / 2,
+                                    paddingTop);
+                            break;
+                        case Gravity.BOTTOM:
+                            childTop = height - paddingBottom - child.getMeasuredHeight();
+                            paddingBottom += child.getMeasuredHeight();
+                            break;
+                    }
+                    childLeft += scrollX;
+                    child.layout(childLeft, childTop,
+                            childLeft + child.getMeasuredWidth(),
+                            childTop + child.getMeasuredHeight());
+                    decorCount++;
+                }
+            }
+        }
+
+        final int childWidth = width - paddingLeft - paddingRight;
+        // Page views. Do this once we have the right padding offsets from above.
+        for (int i = 0; i < count; i++) {
+            final View child = getChildAt(i);
+            if (child.getVisibility() != GONE) {
+                final LayoutParams lp = (LayoutParams) child.getLayoutParams();
+                ItemInfo ii;
+                if (!lp.isDecor && (ii = infoForChild(child)) != null) {
+                    int loff = (int) (childWidth * ii.offset);
+                    int childLeft = paddingLeft + loff;
+                    int childTop = paddingTop;
+                    if (lp.needsMeasure) {
+                        // This was added during layout and needs measurement.
+                        // Do it now that we know what we're working with.
+                        lp.needsMeasure = false;
+                        final int widthSpec = MeasureSpec.makeMeasureSpec(
+                                (int) (childWidth * lp.widthFactor),
+                                MeasureSpec.EXACTLY);
+                        final int heightSpec = MeasureSpec.makeMeasureSpec(
+                                (int) (height - paddingTop - paddingBottom),
+                                MeasureSpec.EXACTLY);
+                        child.measure(widthSpec, heightSpec);
+                    }
+                    if (DEBUG) Log.v(TAG, "Positioning #" + i + " " + child + " f=" + ii.object
+                            + ":" + childLeft + "," + childTop + " " + child.getMeasuredWidth()
+                            + "x" + child.getMeasuredHeight());
+                    child.layout(childLeft, childTop,
+                            childLeft + child.getMeasuredWidth(),
+                            childTop + child.getMeasuredHeight());
+                }
+            }
+        }
+        mTopPageBounds = paddingTop;
+        mBottomPageBounds = height - paddingBottom;
+        mDecorChildCount = decorCount;
+
+        if (mFirstLayout) {
+            scrollToItem(mCurItem, false, 0, false);
+        }
+        mFirstLayout = false;
+    }
+
+    @Override
+    public void computeScroll() {
+        mIsScrollStarted = true;
+        if (!mScroller.isFinished() && mScroller.computeScrollOffset()) {
+            int oldX = getScrollX();
+            int oldY = getScrollY();
+            int x = mScroller.getCurrX();
+            int y = mScroller.getCurrY();
+
+            if (oldX != x || oldY != y) {
+                scrollTo(x, y);
+                if (!pageScrolled(x)) {
+                    mScroller.abortAnimation();
+                    scrollTo(0, y);
+                }
+            }
+
+            // Keep on drawing until the animation has finished.
+            ViewCompat.postInvalidateOnAnimation(this);
+            return;
+        }
+
+        // Done with scroll, clean up state.
+        completeScroll(true);
+    }
+
+    private boolean pageScrolled(int xpos) {
+        if (mItems.size() == 0) {
+            if (mFirstLayout) {
+                // If we haven't been laid out yet, we probably just haven't been populated yet.
+                // Let's skip this call since it doesn't make sense in this state
+                return false;
+            }
+            mCalledSuper = false;
+            onPageScrolled(0, 0, 0);
+            if (!mCalledSuper) {
+                throw new IllegalStateException(
+                        "onPageScrolled did not call superclass implementation");
+            }
+            return false;
+        }
+        final ItemInfo ii = infoForCurrentScrollPosition();
+        final int width = getClientWidth();
+        final int widthWithMargin = width + mPageMargin;
+        final float marginOffset = (float) mPageMargin / width;
+        final int currentPage = ii.position;
+        final float pageOffset = (((float) xpos / width) - ii.offset) /
+                (ii.widthFactor + marginOffset);
+        final int offsetPixels = (int) (pageOffset * widthWithMargin);
+
+        mCalledSuper = false;
+        onPageScrolled(currentPage, pageOffset, offsetPixels);
+        if (!mCalledSuper) {
+            throw new IllegalStateException(
+                    "onPageScrolled did not call superclass implementation");
+        }
+        return true;
+    }
+
+    /**
+     * This method will be invoked when the current page is scrolled, either as part
+     * of a programmatically initiated smooth scroll or a user initiated touch scroll.
+     * If you override this method you must call through to the superclass implementation
+     * (e.g. super.onPageScrolled(position, offset, offsetPixels)) before onPageScrolled
+     * returns.
+     *
+     * @param position Position index of the first page currently being displayed.
+     *                 Page position+1 will be visible if positionOffset is nonzero.
+     * @param offset Value from [0, 1) indicating the offset from the page at position.
+     * @param offsetPixels Value in pixels indicating the offset from position.
+     */
+    @CallSuper
+    protected void onPageScrolled(int position, float offset, int offsetPixels) {
+        // Offset any decor views if needed - keep them on-screen at all times.
+        if (mDecorChildCount > 0) {
+            final int scrollX = getScrollX();
+            int paddingLeft = getPaddingLeft();
+            int paddingRight = getPaddingRight();
+            final int width = getWidth();
+            final int childCount = getChildCount();
+            for (int i = 0; i < childCount; i++) {
+                final View child = getChildAt(i);
+                final LayoutParams lp = (LayoutParams) child.getLayoutParams();
+                if (!lp.isDecor) continue;
+
+                final int hgrav = lp.gravity & Gravity.HORIZONTAL_GRAVITY_MASK;
+                int childLeft = 0;
+                switch (hgrav) {
+                    default:
+                        childLeft = paddingLeft;
+                        break;
+                    case Gravity.LEFT:
+                        childLeft = paddingLeft;
+                        paddingLeft += child.getWidth();
+                        break;
+                    case Gravity.CENTER_HORIZONTAL:
+                        childLeft = Math.max((width - child.getMeasuredWidth()) / 2,
+                                paddingLeft);
+                        break;
+                    case Gravity.RIGHT:
+                        childLeft = width - paddingRight - child.getMeasuredWidth();
+                        paddingRight += child.getMeasuredWidth();
+                        break;
+                }
+                childLeft += scrollX;
+
+                final int childOffset = childLeft - child.getLeft();
+                if (childOffset != 0) {
+                    child.offsetLeftAndRight(childOffset);
+                }
+            }
+        }
+
+        dispatchOnPageScrolled(position, offset, offsetPixels);
+
+        if (mPageTransformer != null) {
+            final int scrollX = getScrollX();
+            final int childCount = getChildCount();
+            for (int i = 0; i < childCount; i++) {
+                final View child = getChildAt(i);
+                final LayoutParams lp = (LayoutParams) child.getLayoutParams();
+
+                if (lp.isDecor) continue;
+                final float transformPos = (float) (child.getLeft() - scrollX) / getClientWidth();
+                mPageTransformer.transformPage(child, transformPos);
+            }
+        }
+
+        mCalledSuper = true;
+    }
+
+    private void dispatchOnPageScrolled(int position, float offset, int offsetPixels) {
+        if (mOnPageChangeListener != null) {
+            mOnPageChangeListener.onPageScrolled(position, offset, offsetPixels);
+        }
+        if (mOnPageChangeListeners != null) {
+            for (int i = 0, z = mOnPageChangeListeners.size(); i < z; i++) {
+                OnPageChangeListener listener = mOnPageChangeListeners.get(i);
+                if (listener != null) {
+                    listener.onPageScrolled(position, offset, offsetPixels);
+                }
+            }
+        }
+        if (mInternalPageChangeListener != null) {
+            mInternalPageChangeListener.onPageScrolled(position, offset, offsetPixels);
+        }
+    }
+
+    private void dispatchOnPageSelected(int position) {
+        if (mOnPageChangeListener != null) {
+            mOnPageChangeListener.onPageSelected(position);
+        }
+        if (mOnPageChangeListeners != null) {
+            for (int i = 0, z = mOnPageChangeListeners.size(); i < z; i++) {
+                OnPageChangeListener listener = mOnPageChangeListeners.get(i);
+                if (listener != null) {
+                    listener.onPageSelected(position);
+                }
+            }
+        }
+        if (mInternalPageChangeListener != null) {
+            mInternalPageChangeListener.onPageSelected(position);
+        }
+    }
+
+    private void dispatchOnScrollStateChanged(int state) {
+        if (mOnPageChangeListener != null) {
+            mOnPageChangeListener.onPageScrollStateChanged(state);
+        }
+        if (mOnPageChangeListeners != null) {
+            for (int i = 0, z = mOnPageChangeListeners.size(); i < z; i++) {
+                OnPageChangeListener listener = mOnPageChangeListeners.get(i);
+                if (listener != null) {
+                    listener.onPageScrollStateChanged(state);
+                }
+            }
+        }
+        if (mInternalPageChangeListener != null) {
+            mInternalPageChangeListener.onPageScrollStateChanged(state);
+        }
+    }
+
+    private void completeScroll(boolean postEvents) {
+        boolean needPopulate = mScrollState == SCROLL_STATE_SETTLING;
+        if (needPopulate) {
+            // Done with scroll, no longer want to cache view drawing.
+            setScrollingCacheEnabled(false);
+            boolean wasScrolling = !mScroller.isFinished();
+            if (wasScrolling) {
+                mScroller.abortAnimation();
+                int oldX = getScrollX();
+                int oldY = getScrollY();
+                int x = mScroller.getCurrX();
+                int y = mScroller.getCurrY();
+                if (oldX != x || oldY != y) {
+                    scrollTo(x, y);
+                    if (x != oldX) {
+                        pageScrolled(x);
+                    }
+                }
+            }
+        }
+        mPopulatePending = false;
+        for (int i=0; i<mItems.size(); i++) {
+            ItemInfo ii = mItems.get(i);
+            if (ii.scrolling) {
+                needPopulate = true;
+                ii.scrolling = false;
+            }
+        }
+        if (needPopulate) {
+            if (postEvents) {
+                ViewCompat.postOnAnimation(this, mEndScrollRunnable);
+            } else {
+                mEndScrollRunnable.run();
+            }
+        }
+    }
+
+    private boolean isGutterDrag(float x, float dx) {
+        return (x < mGutterSize && dx > 0) || (x > getWidth() - mGutterSize && dx < 0);
+    }
+
+    private void enableLayers(boolean enable) {
+        final int childCount = getChildCount();
+        for (int i = 0; i < childCount; i++) {
+            final int layerType = enable ?
+                    ViewCompat.LAYER_TYPE_HARDWARE : ViewCompat.LAYER_TYPE_NONE;
+            ViewCompat.setLayerType(getChildAt(i), layerType, null);
+        }
+    }
+
+    @Override
+    public boolean onInterceptTouchEvent(MotionEvent ev) {
+        /*
+         * This method JUST determines whether we want to intercept the motion.
+         * If we return true, onMotionEvent will be called and we do the actual
+         * scrolling there.
+         */
+
+        final int action = ev.getAction() & MotionEventCompat.ACTION_MASK;
+
+        // Always take care of the touch gesture being complete.
+        if (action == MotionEvent.ACTION_CANCEL || action == MotionEvent.ACTION_UP) {
+            // Release the drag.
+            if (DEBUG) Log.v(TAG, "Intercept done!");
+            resetTouch();
+            return false;
+        }
+
+        // Nothing more to do here if we have decided whether or not we
+        // are dragging.
+        if (action != MotionEvent.ACTION_DOWN) {
+            if (mIsBeingDragged) {
+                if (DEBUG) Log.v(TAG, "Intercept returning true!");
+                return true;
+            }
+            if (mIsUnableToDrag) {
+                if (DEBUG) Log.v(TAG, "Intercept returning false!");
+                return false;
+            }
+        }
+
+        switch (action) {
+            case MotionEvent.ACTION_MOVE: {
+                /*
+                 * mIsBeingDragged == false, otherwise the shortcut would have caught it. Check
+                 * whether the user has moved far enough from his original down touch.
+                 */
+
+                /*
+                * Locally do absolute value. mLastMotionY is set to the y value
+                * of the down event.
+                */
+                final int activePointerId = mActivePointerId;
+                if (activePointerId == INVALID_POINTER) {
+                    // If we don't have a valid id, the touch down wasn't on content.
+                    break;
+                }
+
+                final int pointerIndex = ev.findPointerIndex(activePointerId);
+                final float x = ev.getX(pointerIndex);
+                final float dx = x - mLastMotionX;
+                final float xDiff = Math.abs(dx);
+                final float y = ev.getY(pointerIndex);
+                final float yDiff = Math.abs(y - mInitialMotionY);
+                if (DEBUG) Log.v(TAG, "Moved x to " + x + "," + y + " diff=" + xDiff + "," + yDiff);
+
+                if (dx != 0 && !isGutterDrag(mLastMotionX, dx) &&
+                        canScroll(this, false, (int) dx, (int) x, (int) y)) {
+                    // Nested view has scrollable area under this point. Let it be handled there.
+                    mLastMotionX = x;
+                    mLastMotionY = y;
+                    mIsUnableToDrag = true;
+                    return false;
+                }
+                if (xDiff > mTouchSlop && xDiff * 0.5f > yDiff) {
+                    if (DEBUG) Log.v(TAG, "Starting drag!");
+                    mIsBeingDragged = true;
+                    requestParentDisallowInterceptTouchEvent(true);
+                    setScrollState(SCROLL_STATE_DRAGGING);
+                    mLastMotionX = dx > 0 ? mInitialMotionX + mTouchSlop :
+                            mInitialMotionX - mTouchSlop;
+                    mLastMotionY = y;
+                    setScrollingCacheEnabled(true);
+                } else if (yDiff > mTouchSlop) {
+                    // The finger has moved enough in the vertical
+                    // direction to be counted as a drag...  abort
+                    // any attempt to drag horizontally, to work correctly
+                    // with children that have scrolling containers.
+                    if (DEBUG) Log.v(TAG, "Starting unable to drag!");
+                    mIsUnableToDrag = true;
+                }
+                if (mIsBeingDragged) {
+                    // Scroll to follow the motion event
+                    if (performDrag(x)) {
+                        ViewCompat.postInvalidateOnAnimation(this);
+                    }
+                }
+                break;
+            }
+
+            case MotionEvent.ACTION_DOWN: {
+                /*
+                 * Remember location of down touch.
+                 * ACTION_DOWN always refers to pointer index 0.
+                 */
+                mLastMotionX = mInitialMotionX = ev.getX();
+                mLastMotionY = mInitialMotionY = ev.getY();
+                mActivePointerId = ev.getPointerId(0);
+                mIsUnableToDrag = false;
+
+                mIsScrollStarted = true;
+                mScroller.computeScrollOffset();
+                if (mScrollState == SCROLL_STATE_SETTLING &&
+                        Math.abs(mScroller.getFinalX() - mScroller.getCurrX()) > mCloseEnough) {
+                    // Let the user 'catch' the pager as it animates.
+                    mScroller.abortAnimation();
+                    mPopulatePending = false;
+                    populate();
+                    mIsBeingDragged = true;
+                    requestParentDisallowInterceptTouchEvent(true);
+                    setScrollState(SCROLL_STATE_DRAGGING);
+                } else {
+                    completeScroll(false);
+                    mIsBeingDragged = false;
+                }
+
+                if (DEBUG) Log.v(TAG, "Down at " + mLastMotionX + "," + mLastMotionY
+                        + " mIsBeingDragged=" + mIsBeingDragged
+                        + "mIsUnableToDrag=" + mIsUnableToDrag);
+                break;
+            }
+
+            case MotionEventCompat.ACTION_POINTER_UP:
+                onSecondaryPointerUp(ev);
+                break;
+        }
+
+        if (mVelocityTracker == null) {
+            mVelocityTracker = VelocityTracker.obtain();
+        }
+        mVelocityTracker.addMovement(ev);
+
+        /*
+         * The only time we want to intercept motion events is if we are in the
+         * drag mode.
+         */
+        return mIsBeingDragged;
+    }
+
+    @Override
+    public boolean onTouchEvent(MotionEvent ev) {
+        if (mFakeDragging) {
+            // A fake drag is in progress already, ignore this real one
+            // but still eat the touch events.
+            // (It is likely that the user is multi-touching the screen.)
+            return true;
+        }
+
+        if (ev.getAction() == MotionEvent.ACTION_DOWN && ev.getEdgeFlags() != 0) {
+            // Don't handle edge touches immediately -- they may actually belong to one of our
+            // descendants.
+            return false;
+        }
+
+        if (mAdapter == null || mAdapter.getCount() == 0) {
+            // Nothing to present or scroll; nothing to touch.
+            return false;
+        }
+
+        if (mVelocityTracker == null) {
+            mVelocityTracker = VelocityTracker.obtain();
+        }
+        mVelocityTracker.addMovement(ev);
+
+        final int action = ev.getAction();
+        boolean needsInvalidate = false;
+
+        switch (action & MotionEventCompat.ACTION_MASK) {
+            case MotionEvent.ACTION_DOWN: {
+                mScroller.abortAnimation();
+                mPopulatePending = false;
+                populate();
+
+                // Remember where the motion event started
+                mLastMotionX = mInitialMotionX = ev.getX();
+                mLastMotionY = mInitialMotionY = ev.getY();
+                mActivePointerId = ev.getPointerId(0);
+                break;
+            }
+            case MotionEvent.ACTION_MOVE:
+                if (!mIsBeingDragged) {
+                    final int pointerIndex = ev.findPointerIndex(mActivePointerId);
+                    if (pointerIndex == -1) {
+                        // A child has consumed some touch events and put us into an inconsistent state.
+                        needsInvalidate = resetTouch();
+                        break;
+                    }
+                    final float x = ev.getX(pointerIndex);
+                    final float xDiff = Math.abs(x - mLastMotionX);
+                    final float y = ev.getY(pointerIndex);
+                    final float yDiff = Math.abs(y - mLastMotionY);
+                    if (DEBUG) Log.v(TAG, "Moved x to " + x + "," + y + " diff=" + xDiff + "," + yDiff);
+                    if (xDiff > mTouchSlop && xDiff > yDiff) {
+                        if (DEBUG) Log.v(TAG, "Starting drag!");
+                        mIsBeingDragged = true;
+                        requestParentDisallowInterceptTouchEvent(true);
+                        mLastMotionX = x - mInitialMotionX > 0 ? mInitialMotionX + mTouchSlop :
+                                mInitialMotionX - mTouchSlop;
+                        mLastMotionY = y;
+                        setScrollState(SCROLL_STATE_DRAGGING);
+                        setScrollingCacheEnabled(true);
+
+                        // Disallow Parent Intercept, just in case
+                        ViewParent parent = getParent();
+                        if (parent != null) {
+                            parent.requestDisallowInterceptTouchEvent(true);
+                        }
+                    }
+                }
+                // Not else! Note that mIsBeingDragged can be set above.
+                if (mIsBeingDragged) {
+                    // Scroll to follow the motion event
+                    final int activePointerIndex = ev.findPointerIndex(mActivePointerId);
+                    final float x = ev.getX(activePointerIndex);
+                    needsInvalidate |= performDrag(x);
+                }
+                break;
+            case MotionEvent.ACTION_UP:
+                if (mIsBeingDragged) {
+                    final VelocityTracker velocityTracker = mVelocityTracker;
+                    velocityTracker.computeCurrentVelocity(1000, mMaximumVelocity);
+                    int initialVelocity = (int) VelocityTrackerCompat.getXVelocity(
+                            velocityTracker, mActivePointerId);
+                    mPopulatePending = true;
+                    final int width = getClientWidth();
+                    final int scrollX = getScrollX();
+                    final ItemInfo ii = infoForCurrentScrollPosition();
+                    final float marginOffset = (float) mPageMargin / width;
+                    final int currentPage = ii.position;
+                    final float pageOffset = (((float) scrollX / width) - ii.offset)
+                            / (ii.widthFactor + marginOffset);
+                    final int activePointerIndex = ev.findPointerIndex(mActivePointerId);
+                    final float x = ev.getX(activePointerIndex);
+                    final int totalDelta = (int) (x - mInitialMotionX);
+                    int nextPage = determineTargetPage(currentPage, pageOffset, initialVelocity,
+                            totalDelta);
+                    setCurrentItemInternal(nextPage, true, true, initialVelocity);
+
+                    needsInvalidate = resetTouch();
+                }
+                break;
+            case MotionEvent.ACTION_CANCEL:
+                if (mIsBeingDragged) {
+                    scrollToItem(mCurItem, true, 0, false);
+                    needsInvalidate = resetTouch();
+                }
+                break;
+            case MotionEventCompat.ACTION_POINTER_DOWN: {
+                final int index = MotionEventCompat.getActionIndex(ev);
+                final float x = ev.getX(index);
+                mLastMotionX = x;
+                mActivePointerId = ev.getPointerId(index);
+                break;
+            }
+            case MotionEventCompat.ACTION_POINTER_UP:
+                onSecondaryPointerUp(ev);
+                mLastMotionX = ev.getX(ev.findPointerIndex(mActivePointerId));
+                break;
+        }
+        if (needsInvalidate) {
+            ViewCompat.postInvalidateOnAnimation(this);
+        }
+        return true;
+    }
+
+    private boolean resetTouch() {
+        boolean needsInvalidate;
+        mActivePointerId = INVALID_POINTER;
+        endDrag();
+        needsInvalidate = mLeftEdge.onRelease() | mRightEdge.onRelease();
+        return needsInvalidate;
+    }
+
+    private void requestParentDisallowInterceptTouchEvent(boolean disallowIntercept) {
+        final ViewParent parent = getParent();
+        if (parent != null) {
+            parent.requestDisallowInterceptTouchEvent(disallowIntercept);
+        }
+    }
+
+    private boolean performDrag(float x) {
+        boolean needsInvalidate = false;
+
+        final float deltaX = mLastMotionX - x;
+        mLastMotionX = x;
+
+        float oldScrollX = getScrollX();
+        float scrollX = oldScrollX + deltaX;
+        final int width = getClientWidth();
+
+        float leftBound = width * mFirstOffset;
+        float rightBound = width * mLastOffset;
+        boolean leftAbsolute = true;
+        boolean rightAbsolute = true;
+
+        final ItemInfo firstItem = mItems.get(0);
+        final ItemInfo lastItem = mItems.get(mItems.size() - 1);
+        if (firstItem.position != 0) {
+            leftAbsolute = false;
+            leftBound = firstItem.offset * width;
+        }
+        if (lastItem.position != mAdapter.getCount() - 1) {
+            rightAbsolute = false;
+            rightBound = lastItem.offset * width;
+        }
+
+        if (scrollX < leftBound) {
+            if (leftAbsolute) {
+                float over = leftBound - scrollX;
+                needsInvalidate = mLeftEdge.onPull(Math.abs(over) / width);
+            }
+            scrollX = leftBound;
+        } else if (scrollX > rightBound) {
+            if (rightAbsolute) {
+                float over = scrollX - rightBound;
+                needsInvalidate = mRightEdge.onPull(Math.abs(over) / width);
+            }
+            scrollX = rightBound;
+        }
+        // Don't lose the rounded component
+        mLastMotionX += scrollX - (int) scrollX;
+        scrollTo((int) scrollX, getScrollY());
+        pageScrolled((int) scrollX);
+
+        return needsInvalidate;
+    }
+
+    /**
+     * @return Info about the page at the current scroll position.
+     *         This can be synthetic for a missing middle page; the 'object' field can be null.
+     */
+    private ItemInfo infoForCurrentScrollPosition() {
+        final int width = getClientWidth();
+        final float scrollOffset = width > 0 ? (float) getScrollX() / width : 0;
+        final float marginOffset = width > 0 ? (float) mPageMargin / width : 0;
+        int lastPos = -1;
+        float lastOffset = 0.f;
+        float lastWidth = 0.f;
+        boolean first = true;
+
+        ItemInfo lastItem = null;
+        for (int i = 0; i < mItems.size(); i++) {
+            ItemInfo ii = mItems.get(i);
+            float offset;
+            if (!first && ii.position != lastPos + 1) {
+                // Create a synthetic item for a missing page.
+                ii = mTempItem;
+                ii.offset = lastOffset + lastWidth + marginOffset;
+                ii.position = lastPos + 1;
+                ii.widthFactor = mAdapter.getPageWidth(ii.position);
+                i--;
+            }
+            offset = ii.offset;
+
+            final float leftBound = offset;
+            final float rightBound = offset + ii.widthFactor + marginOffset;
+            if (first || scrollOffset >= leftBound) {
+                if (scrollOffset < rightBound || i == mItems.size() - 1) {
+                    return ii;
+                }
+            } else {
+                return lastItem;
+            }
+            first = false;
+            lastPos = ii.position;
+            lastOffset = offset;
+            lastWidth = ii.widthFactor;
+            lastItem = ii;
+        }
+
+        return lastItem;
+    }
+
+    private int determineTargetPage(int currentPage, float pageOffset, int velocity, int deltaX) {
+        int targetPage;
+        if (Math.abs(deltaX) > mFlingDistance && Math.abs(velocity) > mMinimumVelocity) {
+            targetPage = velocity > 0 ? currentPage : currentPage + 1;
+        } else {
+            final float truncator = currentPage >= mCurItem ? 0.4f : 0.6f;
+            targetPage = currentPage + (int) (pageOffset + truncator);
+        }
+
+        if (mItems.size() > 0) {
+            final ItemInfo firstItem = mItems.get(0);
+            final ItemInfo lastItem = mItems.get(mItems.size() - 1);
+
+            // Only let the user target pages we have items for
+            targetPage = Math.max(firstItem.position, Math.min(targetPage, lastItem.position));
+        }
+
+        return targetPage;
+    }
+
+    @Override
+    public void draw(Canvas canvas) {
+        super.draw(canvas);
+        boolean needsInvalidate = false;
+
+        final int overScrollMode = ViewCompat.getOverScrollMode(this);
+        if (overScrollMode == ViewCompat.OVER_SCROLL_ALWAYS ||
+                (overScrollMode == ViewCompat.OVER_SCROLL_IF_CONTENT_SCROLLS &&
+                        mAdapter != null && mAdapter.getCount() > 1)) {
+            if (!mLeftEdge.isFinished()) {
+                final int restoreCount = canvas.save();
+                final int height = getHeight() - getPaddingTop() - getPaddingBottom();
+                final int width = getWidth();
+
+                canvas.rotate(270);
+                canvas.translate(-height + getPaddingTop(), mFirstOffset * width);
+                mLeftEdge.setSize(height, width);
+                needsInvalidate |= mLeftEdge.draw(canvas);
+                canvas.restoreToCount(restoreCount);
+            }
+            if (!mRightEdge.isFinished()) {
+                final int restoreCount = canvas.save();
+                final int width = getWidth();
+                final int height = getHeight() - getPaddingTop() - getPaddingBottom();
+
+                canvas.rotate(90);
+                canvas.translate(-getPaddingTop(), -(mLastOffset + 1) * width);
+                mRightEdge.setSize(height, width);
+                needsInvalidate |= mRightEdge.draw(canvas);
+                canvas.restoreToCount(restoreCount);
+            }
+        } else {
+            mLeftEdge.finish();
+            mRightEdge.finish();
+        }
+
+        if (needsInvalidate) {
+            // Keep animating
+            ViewCompat.postInvalidateOnAnimation(this);
+        }
+    }
+
+    @Override
+    protected void onDraw(Canvas canvas) {
+        super.onDraw(canvas);
+
+        // Draw the margin drawable between pages if needed.
+        if (mPageMargin > 0 && mMarginDrawable != null && mItems.size() > 0 && mAdapter != null) {
+            final int scrollX = getScrollX();
+            final int width = getWidth();
+
+            final float marginOffset = (float) mPageMargin / width;
+            int itemIndex = 0;
+            ItemInfo ii = mItems.get(0);
+            float offset = ii.offset;
+            final int itemCount = mItems.size();
+            final int firstPos = ii.position;
+            final int lastPos = mItems.get(itemCount - 1).position;
+            for (int pos = firstPos; pos < lastPos; pos++) {
+                while (pos > ii.position && itemIndex < itemCount) {
+                    ii = mItems.get(++itemIndex);
+                }
+
+                float drawAt;
+                if (pos == ii.position) {
+                    drawAt = (ii.offset + ii.widthFactor) * width;
+                    offset = ii.offset + ii.widthFactor + marginOffset;
+                } else {
+                    float widthFactor = mAdapter.getPageWidth(pos);
+                    drawAt = (offset + widthFactor) * width;
+                    offset += widthFactor + marginOffset;
+                }
+
+                if (drawAt + mPageMargin > scrollX) {
+                    mMarginDrawable.setBounds(Math.round(drawAt), mTopPageBounds,
+                            Math.round(drawAt + mPageMargin), mBottomPageBounds);
+                    mMarginDrawable.draw(canvas);
+                }
+
+                if (drawAt > scrollX + width) {
+                    break; // No more visible, no sense in continuing
+                }
+            }
+        }
+    }
+
+    /**
+     * Start a fake drag of the pager.
+     *
+     * <p>A fake drag can be useful if you want to synchronize the motion of the ViewPager
+     * with the touch scrolling of another view, while still letting the ViewPager
+     * control the snapping motion and fling behavior. (e.g. parallax-scrolling tabs.)
+     * Call {@link #fakeDragBy(float)} to simulate the actual drag motion. Call
+     * {@link #endFakeDrag()} to complete the fake drag and fling as necessary.
+     *
+     * <p>During a fake drag the ViewPager will ignore all touch events. If a real drag
+     * is already in progress, this method will return false.
+     *
+     * @return true if the fake drag began successfully, false if it could not be started.
+     *
+     * @see #fakeDragBy(float)
+     * @see #endFakeDrag()
+     */
+    public boolean beginFakeDrag() {
+        if (mIsBeingDragged) {
+            return false;
+        }
+        mFakeDragging = true;
+        setScrollState(SCROLL_STATE_DRAGGING);
+        mInitialMotionX = mLastMotionX = 0;
+        if (mVelocityTracker == null) {
+            mVelocityTracker = VelocityTracker.obtain();
+        } else {
+            mVelocityTracker.clear();
+        }
+        final long time = SystemClock.uptimeMillis();
+        final MotionEvent ev = MotionEvent.obtain(time, time, MotionEvent.ACTION_DOWN, 0, 0, 0);
+        mVelocityTracker.addMovement(ev);
+        ev.recycle();
+        mFakeDragBeginTime = time;
+        return true;
+    }
+
+    /**
+     * End a fake drag of the pager.
+     *
+     * @see #beginFakeDrag()
+     * @see #fakeDragBy(float)
+     */
+    public void endFakeDrag() {
+        if (!mFakeDragging) {
+            throw new IllegalStateException("No fake drag in progress. Call beginFakeDrag first.");
+        }
+
+        if (mAdapter != null) {
+            final VelocityTracker velocityTracker = mVelocityTracker;
+            velocityTracker.computeCurrentVelocity(1000, mMaximumVelocity);
+            int initialVelocity = (int) VelocityTrackerCompat.getXVelocity(
+                    velocityTracker, mActivePointerId);
+            mPopulatePending = true;
+            final int width = getClientWidth();
+            final int scrollX = getScrollX();
+            final ItemInfo ii = infoForCurrentScrollPosition();
+            final int currentPage = ii.position;
+            final float pageOffset = (((float) scrollX / width) - ii.offset) / ii.widthFactor;
+            final int totalDelta = (int) (mLastMotionX - mInitialMotionX);
+            int nextPage = determineTargetPage(currentPage, pageOffset, initialVelocity,
+                    totalDelta);
+            setCurrentItemInternal(nextPage, true, true, initialVelocity);
+        }
+        endDrag();
+
+        mFakeDragging = false;
+    }
+
+    /**
+     * Fake drag by an offset in pixels. You must have called {@link #beginFakeDrag()} first.
+     *
+     * @param xOffset Offset in pixels to drag by.
+     * @see #beginFakeDrag()
+     * @see #endFakeDrag()
+     */
+    public void fakeDragBy(float xOffset) {
+        if (!mFakeDragging) {
+            throw new IllegalStateException("No fake drag in progress. Call beginFakeDrag first.");
+        }
+
+        if (mAdapter == null) {
+            return;
+        }
+
+        mLastMotionX += xOffset;
+
+        float oldScrollX = getScrollX();
+        float scrollX = oldScrollX - xOffset;
+        final int width = getClientWidth();
+
+        float leftBound = width * mFirstOffset;
+        float rightBound = width * mLastOffset;
+
+        final ItemInfo firstItem = mItems.get(0);
+        final ItemInfo lastItem = mItems.get(mItems.size() - 1);
+        if (firstItem.position != 0) {
+            leftBound = firstItem.offset * width;
+        }
+        if (lastItem.position != mAdapter.getCount() - 1) {
+            rightBound = lastItem.offset * width;
+        }
+
+        if (scrollX < leftBound) {
+            scrollX = leftBound;
+        } else if (scrollX > rightBound) {
+            scrollX = rightBound;
+        }
+        // Don't lose the rounded component
+        mLastMotionX += scrollX - (int) scrollX;
+        scrollTo((int) scrollX, getScrollY());
+        pageScrolled((int) scrollX);
+
+        // Synthesize an event for the VelocityTracker.
+        final long time = SystemClock.uptimeMillis();
+        final MotionEvent ev = MotionEvent.obtain(mFakeDragBeginTime, time, MotionEvent.ACTION_MOVE,
+                mLastMotionX, 0, 0);
+        mVelocityTracker.addMovement(ev);
+        ev.recycle();
+    }
+
+    /**
+     * Returns true if a fake drag is in progress.
+     *
+     * @return true if currently in a fake drag, false otherwise.
+     *
+     * @see #beginFakeDrag()
+     * @see #fakeDragBy(float)
+     * @see #endFakeDrag()
+     */
+    public boolean isFakeDragging() {
+        return mFakeDragging;
+    }
+
+    private void onSecondaryPointerUp(MotionEvent ev) {
+        final int pointerIndex = MotionEventCompat.getActionIndex(ev);
+        final int pointerId = ev.getPointerId(pointerIndex);
+        if (pointerId == mActivePointerId) {
+            // This was our active pointer going up. Choose a new
+            // active pointer and adjust accordingly.
+            final int newPointerIndex = pointerIndex == 0 ? 1 : 0;
+            mLastMotionX = ev.getX(newPointerIndex);
+            mActivePointerId = ev.getPointerId(newPointerIndex);
+            if (mVelocityTracker != null) {
+                mVelocityTracker.clear();
+            }
+        }
+    }
+
+    private void endDrag() {
+        mIsBeingDragged = false;
+        mIsUnableToDrag = false;
+
+        if (mVelocityTracker != null) {
+            mVelocityTracker.recycle();
+            mVelocityTracker = null;
+        }
+    }
+
+    private void setScrollingCacheEnabled(boolean enabled) {
+        if (mScrollingCacheEnabled != enabled) {
+            mScrollingCacheEnabled = enabled;
+            if (USE_CACHE) {
+                final int size = getChildCount();
+                for (int i = 0; i < size; ++i) {
+                    final View child = getChildAt(i);
+                    if (child.getVisibility() != GONE) {
+                        child.setDrawingCacheEnabled(enabled);
+                    }
+                }
+            }
+        }
+    }
+
+    public boolean canScrollHorizontally(int direction) {
+        if (mAdapter == null) {
+            return false;
+        }
+
+        final int width = getClientWidth();
+        final int scrollX = getScrollX();
+        if (direction < 0) {
+            return (scrollX > (int) (width * mFirstOffset));
+        } else if (direction > 0) {
+            return (scrollX < (int) (width * mLastOffset));
+        } else {
+            return false;
+        }
+    }
+
+    /**
+     * Tests scrollability within child views of v given a delta of dx.
+     *
+     * @param v View to test for horizontal scrollability
+     * @param checkV Whether the view v passed should itself be checked for scrollability (true),
+     *               or just its children (false).
+     * @param dx Delta scrolled in pixels
+     * @param x X coordinate of the active touch point
+     * @param y Y coordinate of the active touch point
+     * @return true if child views of v can be scrolled by delta of dx.
+     */
+    protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) {
+        if (v instanceof ViewGroup) {
+            final ViewGroup group = (ViewGroup) v;
+            final int scrollX = v.getScrollX();
+            final int scrollY = v.getScrollY();
+            final int count = group.getChildCount();
+            // Count backwards - let topmost views consume scroll distance first.
+            for (int i = count - 1; i >= 0; i--) {
+                // TODO: Add versioned support here for transformed views.
+                // This will not work for transformed views in Honeycomb+
+                final View child = group.getChildAt(i);
+                if (x + scrollX >= child.getLeft() && x + scrollX < child.getRight() &&
+                        y + scrollY >= child.getTop() && y + scrollY < child.getBottom() &&
+                        canScroll(child, true, dx, x + scrollX - child.getLeft(),
+                                y + scrollY - child.getTop())) {
+                    return true;
+                }
+            }
+        }
+
+        return checkV && ViewCompat.canScrollHorizontally(v, -dx);
+    }
+
+    @Override
+    public boolean dispatchKeyEvent(KeyEvent event) {
+        // Let the focused view and/or our descendants get the key first
+        return super.dispatchKeyEvent(event) || executeKeyEvent(event);
+    }
+
+    /**
+     * You can call this function yourself to have the scroll view perform
+     * scrolling from a key event, just as if the event had been dispatched to
+     * it by the view hierarchy.
+     *
+     * @param event The key event to execute.
+     * @return Return true if the event was handled, else false.
+     */
+    public boolean executeKeyEvent(KeyEvent event) {
+        boolean handled = false;
+        if (event.getAction() == KeyEvent.ACTION_DOWN) {
+            switch (event.getKeyCode()) {
+                case KeyEvent.KEYCODE_DPAD_LEFT:
+                    handled = arrowScroll(FOCUS_LEFT);
+                    break;
+                case KeyEvent.KEYCODE_DPAD_RIGHT:
+                    handled = arrowScroll(FOCUS_RIGHT);
+                    break;
+                case KeyEvent.KEYCODE_TAB:
+                    if (Build.VERSION.SDK_INT >= 11) {
+                        // The focus finder had a bug handling FOCUS_FORWARD and FOCUS_BACKWARD
+                        // before Android 3.0. Ignore the tab key on those devices.
+                        if (KeyEventCompat.hasNoModifiers(event)) {
+                            handled = arrowScroll(FOCUS_FORWARD);
+                        } else if (KeyEventCompat.hasModifiers(event, KeyEvent.META_SHIFT_ON)) {
+                            handled = arrowScroll(FOCUS_BACKWARD);
+                        }
+                    }
+                    break;
+            }
+        }
+        return handled;
+    }
+
+    public boolean arrowScroll(int direction) {
+        View currentFocused = findFocus();
+        if (currentFocused == this) {
+            currentFocused = null;
+        } else if (currentFocused != null) {
+            boolean isChild = false;
+            for (ViewParent parent = currentFocused.getParent(); parent instanceof ViewGroup;
+                    parent = parent.getParent()) {
+                if (parent == this) {
+                    isChild = true;
+                    break;
+                }
+            }
+            if (!isChild) {
+                // This would cause the focus search down below to fail in fun ways.
+                final StringBuilder sb = new StringBuilder();
+                sb.append(currentFocused.getClass().getSimpleName());
+                for (ViewParent parent = currentFocused.getParent(); parent instanceof ViewGroup;
+                        parent = parent.getParent()) {
+                    sb.append(" => ").append(parent.getClass().getSimpleName());
+                }
+                Log.e(TAG, "arrowScroll tried to find focus based on non-child " +
+                        "current focused view " + sb.toString());
+                currentFocused = null;
+            }
+        }
+
+        boolean handled = false;
+
+        View nextFocused = FocusFinder.getInstance().findNextFocus(this, currentFocused,
+                direction);
+        if (nextFocused != null && nextFocused != currentFocused) {
+            if (direction == View.FOCUS_LEFT) {
+                // If there is nothing to the left, or this is causing us to
+                // jump to the right, then what we really want to do is page left.
+                final int nextLeft = getChildRectInPagerCoordinates(mTempRect, nextFocused).left;
+                final int currLeft = getChildRectInPagerCoordinates(mTempRect, currentFocused).left;
+                if (currentFocused != null && nextLeft >= currLeft) {
+                    handled = pageLeft();
+                } else {
+                    handled = nextFocused.requestFocus();
+                }
+            } else if (direction == View.FOCUS_RIGHT) {
+                // If there is nothing to the right, or this is causing us to
+                // jump to the left, then what we really want to do is page right.
+                final int nextLeft = getChildRectInPagerCoordinates(mTempRect, nextFocused).left;
+                final int currLeft = getChildRectInPagerCoordinates(mTempRect, currentFocused).left;
+                if (currentFocused != null && nextLeft <= currLeft) {
+                    handled = pageRight();
+                } else {
+                    handled = nextFocused.requestFocus();
+                }
+            }
+        } else if (direction == FOCUS_LEFT || direction == FOCUS_BACKWARD) {
+            // Trying to move left and nothing there; try to page.
+            handled = pageLeft();
+        } else if (direction == FOCUS_RIGHT || direction == FOCUS_FORWARD) {
+            // Trying to move right and nothing there; try to page.
+            handled = pageRight();
+        }
+        if (handled) {
+            playSoundEffect(SoundEffectConstants.getContantForFocusDirection(direction));
+        }
+        return handled;
+    }
+
+    private Rect getChildRectInPagerCoordinates(Rect outRect, View child) {
+        if (outRect == null) {
+            outRect = new Rect();
+        }
+        if (child == null) {
+            outRect.set(0, 0, 0, 0);
+            return outRect;
+        }
+        outRect.left = child.getLeft();
+        outRect.right = child.getRight();
+        outRect.top = child.getTop();
+        outRect.bottom = child.getBottom();
+
+        ViewParent parent = child.getParent();
+        while (parent instanceof ViewGroup && parent != this) {
+            final ViewGroup group = (ViewGroup) parent;
+            outRect.left += group.getLeft();
+            outRect.right += group.getRight();
+            outRect.top += group.getTop();
+            outRect.bottom += group.getBottom();
+
+            parent = group.getParent();
+        }
+        return outRect;
+    }
+
+    boolean pageLeft() {
+        if (mCurItem > 0) {
+            setCurrentItem(mCurItem-1, true);
+            return true;
+        }
+        return false;
+    }
+
+    boolean pageRight() {
+        if (mAdapter != null && mCurItem < (mAdapter.getCount()-1)) {
+            setCurrentItem(mCurItem+1, true);
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * We only want the current page that is being shown to be focusable.
+     */
+    @Override
+    public void addFocusables(ArrayList<View> views, int direction, int focusableMode) {
+        final int focusableCount = views.size();
+
+        final int descendantFocusability = getDescendantFocusability();
+
+        if (descendantFocusability != FOCUS_BLOCK_DESCENDANTS) {
+            for (int i = 0; i < getChildCount(); i++) {
+                final View child = getChildAt(i);
+                if (child.getVisibility() == VISIBLE) {
+                    ItemInfo ii = infoForChild(child);
+                    if (ii != null && ii.position == mCurItem) {
+                        child.addFocusables(views, direction, focusableMode);
+                    }
+                }
+            }
+        }
+
+        // we add ourselves (if focusable) in all cases except for when we are
+        // FOCUS_AFTER_DESCENDANTS and there are some descendants focusable.  this is
+        // to avoid the focus search finding layouts when a more precise search
+        // among the focusable children would be more interesting.
+        if (
+            descendantFocusability != FOCUS_AFTER_DESCENDANTS ||
+                // No focusable descendants
+                (focusableCount == views.size())) {
+            // Note that we can't call the superclass here, because it will
+            // add all views in.  So we need to do the same thing View does.
+            if (!isFocusable()) {
+                return;
+            }
+            if ((focusableMode & FOCUSABLES_TOUCH_MODE) == FOCUSABLES_TOUCH_MODE &&
+                    isInTouchMode() && !isFocusableInTouchMode()) {
+                return;
+            }
+            if (views != null) {
+                views.add(this);
+            }
+        }
+    }
+
+    /**
+     * We only want the current page that is being shown to be touchable.
+     */
+    @Override
+    public void addTouchables(ArrayList<View> views) {
+        // Note that we don't call super.addTouchables(), which means that
+        // we don't call View.addTouchables().  This is okay because a ViewPager
+        // is itself not touchable.
+        for (int i = 0; i < getChildCount(); i++) {
+            final View child = getChildAt(i);
+            if (child.getVisibility() == VISIBLE) {
+                ItemInfo ii = infoForChild(child);
+                if (ii != null && ii.position == mCurItem) {
+                    child.addTouchables(views);
+                }
+            }
+        }
+    }
+
+    /**
+     * We only want the current page that is being shown to be focusable.
+     */
+    @Override
+    protected boolean onRequestFocusInDescendants(int direction,
+            Rect previouslyFocusedRect) {
+        int index;
+        int increment;
+        int end;
+        int count = getChildCount();
+        if ((direction & FOCUS_FORWARD) != 0) {
+            index = 0;
+            increment = 1;
+            end = count;
+        } else {
+            index = count - 1;
+            increment = -1;
+            end = -1;
+        }
+        for (int i = index; i != end; i += increment) {
+            View child = getChildAt(i);
+            if (child.getVisibility() == VISIBLE) {
+                ItemInfo ii = infoForChild(child);
+                if (ii != null && ii.position == mCurItem) {
+                    if (child.requestFocus(direction, previouslyFocusedRect)) {
+                        return true;
+                    }
+                }
+            }
+        }
+        return false;
+    }
+
+    @Override
+    public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
+        // Dispatch scroll events from this ViewPager.
+        if (event.getEventType() == AccessibilityEventCompat.TYPE_VIEW_SCROLLED) {
+            return super.dispatchPopulateAccessibilityEvent(event);
+        }
+
+        // Dispatch all other accessibility events from the current page.
+        final int childCount = getChildCount();
+        for (int i = 0; i < childCount; i++) {
+            final View child = getChildAt(i);
+            if (child.getVisibility() == VISIBLE) {
+                final ItemInfo ii = infoForChild(child);
+                if (ii != null && ii.position == mCurItem &&
+                        child.dispatchPopulateAccessibilityEvent(event)) {
+                    return true;
+                }
+            }
+        }
+
+        return false;
+    }
+
+    @Override
+    protected ViewGroup.LayoutParams generateDefaultLayoutParams() {
+        return new LayoutParams();
+    }
+
+    @Override
+    protected ViewGroup.LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) {
+        return generateDefaultLayoutParams();
+    }
+
+    @Override
+    protected boolean checkLayoutParams(ViewGroup.LayoutParams p) {
+        return p instanceof LayoutParams && super.checkLayoutParams(p);
+    }
+
+    @Override
+    public ViewGroup.LayoutParams generateLayoutParams(AttributeSet attrs) {
+        return new LayoutParams(getContext(), attrs);
+    }
+
+    class MyAccessibilityDelegate extends AccessibilityDelegateCompat {
+
+        @Override
+        public void onInitializeAccessibilityEvent(View host, AccessibilityEvent event) {
+            super.onInitializeAccessibilityEvent(host, event);
+            event.setClassName(ViewPager.class.getName());
+            final AccessibilityRecordCompat recordCompat =
+                    AccessibilityEventCompat.asRecord(event);
+            recordCompat.setScrollable(canScroll());
+            if (event.getEventType() == AccessibilityEventCompat.TYPE_VIEW_SCROLLED
+                    && mAdapter != null) {
+                recordCompat.setItemCount(mAdapter.getCount());
+                recordCompat.setFromIndex(mCurItem);
+                recordCompat.setToIndex(mCurItem);
+            }
+        }
+
+        @Override
+        public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfoCompat info) {
+            super.onInitializeAccessibilityNodeInfo(host, info);
+            info.setClassName(ViewPager.class.getName());
+            info.setScrollable(canScroll());
+            if (canScrollHorizontally(1)) {
+                info.addAction(AccessibilityNodeInfoCompat.ACTION_SCROLL_FORWARD);
+            }
+            if (canScrollHorizontally(-1)) {
+                info.addAction(AccessibilityNodeInfoCompat.ACTION_SCROLL_BACKWARD);
+            }
+        }
+
+        @Override
+        public boolean performAccessibilityAction(View host, int action, Bundle args) {
+            if (super.performAccessibilityAction(host, action, args)) {
+                return true;
+            }
+            switch (action) {
+                case AccessibilityNodeInfoCompat.ACTION_SCROLL_FORWARD: {
+                    if (canScrollHorizontally(1)) {
+                        setCurrentItem(mCurItem + 1);
+                        return true;
+                    }
+                } return false;
+                case AccessibilityNodeInfoCompat.ACTION_SCROLL_BACKWARD: {
+                    if (canScrollHorizontally(-1)) {
+                        setCurrentItem(mCurItem - 1);
+                        return true;
+                    }
+                } return false;
+            }
+            return false;
+        }
+
+        private boolean canScroll() {
+            return (mAdapter != null) && (mAdapter.getCount() > 1);
+        }
+    }
+
+    private class PagerObserver extends DataSetObserver {
+        @Override
+        public void onChanged() {
+            dataSetChanged();
+        }
+        @Override
+        public void onInvalidated() {
+            dataSetChanged();
+        }
+    }
+
+    /**
+     * Layout parameters that should be supplied for views added to a
+     * ViewPager.
+     */
+    public static class LayoutParams extends ViewGroup.LayoutParams {
+        /**
+         * true if this view is a decoration on the pager itself and not
+         * a view supplied by the adapter.
+         */
+        public boolean isDecor;
+
+        /**
+         * Gravity setting for use on decor views only:
+         * Where to position the view page within the overall ViewPager
+         * container; constants are defined in {@link android.view.Gravity}.
+         */
+        public int gravity;
+
+        /**
+         * Width as a 0-1 multiplier of the measured pager width
+         */
+        float widthFactor = 0.f;
+
+        /**
+         * true if this view was added during layout and needs to be measured
+         * before being positioned.
+         */
+        boolean needsMeasure;
+
+        /**
+         * Adapter position this view is for if !isDecor
+         */
+        int position;
+
+        /**
+         * Current child index within the ViewPager that this view occupies
+         */
+        int childIndex;
+
+        public LayoutParams() {
+            super(FILL_PARENT, FILL_PARENT);
+        }
+
+        public LayoutParams(Context context, AttributeSet attrs) {
+            super(context, attrs);
+
+            final TypedArray a = context.obtainStyledAttributes(attrs, LAYOUT_ATTRS);
+            gravity = a.getInteger(0, Gravity.TOP);
+            a.recycle();
+        }
+    }
+
+    static class ViewPositionComparator implements Comparator<View> {
+        @Override
+        public int compare(View lhs, View rhs) {
+            final LayoutParams llp = (LayoutParams) lhs.getLayoutParams();
+            final LayoutParams rlp = (LayoutParams) rhs.getLayoutParams();
+            if (llp.isDecor != rlp.isDecor) {
+                return llp.isDecor ? 1 : -1;
+            }
+            return llp.position - rlp.position;
+        }
+    }
+}
diff --git a/v4/java/android/support/v4/view/animation/FastOutLinearInInterpolator.java b/core-ui/java/android/support/v4/view/animation/FastOutLinearInInterpolator.java
similarity index 100%
rename from v4/java/android/support/v4/view/animation/FastOutLinearInInterpolator.java
rename to core-ui/java/android/support/v4/view/animation/FastOutLinearInInterpolator.java
diff --git a/v4/java/android/support/v4/view/animation/FastOutSlowInInterpolator.java b/core-ui/java/android/support/v4/view/animation/FastOutSlowInInterpolator.java
similarity index 100%
rename from v4/java/android/support/v4/view/animation/FastOutSlowInInterpolator.java
rename to core-ui/java/android/support/v4/view/animation/FastOutSlowInInterpolator.java
diff --git a/v4/java/android/support/v4/view/animation/LinearOutSlowInInterpolator.java b/core-ui/java/android/support/v4/view/animation/LinearOutSlowInInterpolator.java
similarity index 100%
rename from v4/java/android/support/v4/view/animation/LinearOutSlowInInterpolator.java
rename to core-ui/java/android/support/v4/view/animation/LinearOutSlowInInterpolator.java
diff --git a/v4/java/android/support/v4/view/animation/LookupTableInterpolator.java b/core-ui/java/android/support/v4/view/animation/LookupTableInterpolator.java
similarity index 100%
rename from v4/java/android/support/v4/view/animation/LookupTableInterpolator.java
rename to core-ui/java/android/support/v4/view/animation/LookupTableInterpolator.java
diff --git a/v4/java/android/support/v4/view/package.html b/core-ui/java/android/support/v4/view/package.html
similarity index 100%
copy from v4/java/android/support/v4/view/package.html
copy to core-ui/java/android/support/v4/view/package.html
diff --git a/v4/java/android/support/v4/widget/AutoScrollHelper.java b/core-ui/java/android/support/v4/widget/AutoScrollHelper.java
similarity index 100%
rename from v4/java/android/support/v4/widget/AutoScrollHelper.java
rename to core-ui/java/android/support/v4/widget/AutoScrollHelper.java
diff --git a/core-ui/java/android/support/v4/widget/CircleImageView.java b/core-ui/java/android/support/v4/widget/CircleImageView.java
new file mode 100644
index 0000000..629bd44
--- /dev/null
+++ b/core-ui/java/android/support/v4/widget/CircleImageView.java
@@ -0,0 +1,159 @@
+/*
+ * Copyright (C) 2014 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 android.support.v4.widget;
+
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.graphics.RadialGradient;
+import android.graphics.Shader;
+import android.graphics.drawable.ShapeDrawable;
+import android.graphics.drawable.shapes.OvalShape;
+import android.support.v4.view.ViewCompat;
+import android.view.animation.Animation;
+import android.widget.ImageView;
+
+/**
+ * Private class created to work around issues with AnimationListeners being
+ * called before the animation is actually complete and support shadows on older
+ * platforms.
+ *
+ * @hide
+ */
+class CircleImageView extends ImageView {
+
+    private static final int KEY_SHADOW_COLOR = 0x1E000000;
+    private static final int FILL_SHADOW_COLOR = 0x3D000000;
+    // PX
+    private static final float X_OFFSET = 0f;
+    private static final float Y_OFFSET = 1.75f;
+    private static final float SHADOW_RADIUS = 3.5f;
+    private static final int SHADOW_ELEVATION = 4;
+
+    private Animation.AnimationListener mListener;
+    private int mShadowRadius;
+
+    public CircleImageView(Context context, int color) {
+        super(context);
+        final float density = getContext().getResources().getDisplayMetrics().density;
+        final int shadowYOffset = (int) (density * Y_OFFSET);
+        final int shadowXOffset = (int) (density * X_OFFSET);
+
+        mShadowRadius = (int) (density * SHADOW_RADIUS);
+
+        ShapeDrawable circle;
+        if (elevationSupported()) {
+            circle = new ShapeDrawable(new OvalShape());
+            ViewCompat.setElevation(this, SHADOW_ELEVATION * density);
+        } else {
+            OvalShape oval = new OvalShadow(mShadowRadius);
+            circle = new ShapeDrawable(oval);
+            ViewCompat.setLayerType(this, ViewCompat.LAYER_TYPE_SOFTWARE, circle.getPaint());
+            circle.getPaint().setShadowLayer(mShadowRadius, shadowXOffset, shadowYOffset,
+                    KEY_SHADOW_COLOR);
+            final int padding = mShadowRadius;
+            // set padding so the inner image sits correctly within the shadow.
+            setPadding(padding, padding, padding, padding);
+        }
+        circle.getPaint().setColor(color);
+        setBackgroundDrawable(circle);
+    }
+
+    private boolean elevationSupported() {
+        return android.os.Build.VERSION.SDK_INT >= 21;
+    }
+
+    @Override
+    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+        if (!elevationSupported()) {
+            setMeasuredDimension(getMeasuredWidth() + mShadowRadius * 2, getMeasuredHeight()
+                    + mShadowRadius * 2);
+        }
+    }
+
+    public void setAnimationListener(Animation.AnimationListener listener) {
+        mListener = listener;
+    }
+
+    @Override
+    public void onAnimationStart() {
+        super.onAnimationStart();
+        if (mListener != null) {
+            mListener.onAnimationStart(getAnimation());
+        }
+    }
+
+    @Override
+    public void onAnimationEnd() {
+        super.onAnimationEnd();
+        if (mListener != null) {
+            mListener.onAnimationEnd(getAnimation());
+        }
+    }
+
+    /**
+     * Update the background color of the circle image view.
+     *
+     * @param colorRes Id of a color resource.
+     */
+    public void setBackgroundColorRes(int colorRes) {
+        setBackgroundColor(getContext().getResources().getColor(colorRes));
+    }
+
+    @Override
+    public void setBackgroundColor(int color) {
+        if (getBackground() instanceof ShapeDrawable) {
+            ((ShapeDrawable) getBackground()).getPaint().setColor(color);
+        }
+    }
+
+    private class OvalShadow extends OvalShape {
+        private RadialGradient mRadialGradient;
+        private Paint mShadowPaint;
+
+        public OvalShadow(int shadowRadius) {
+            super();
+            mShadowPaint = new Paint();
+            mShadowRadius = shadowRadius;
+            updateRadialGradient((int) rect().width());
+        }
+
+        @Override
+        protected void onResize(float width, float height) {
+            super.onResize(width, height);
+            updateRadialGradient((int) width);
+        }
+
+        @Override
+        public void draw(Canvas canvas, Paint paint) {
+            final int viewWidth = CircleImageView.this.getWidth();
+            final int viewHeight = CircleImageView.this.getHeight();
+            canvas.drawCircle(viewWidth / 2, viewHeight / 2, viewWidth / 2, mShadowPaint);
+            canvas.drawCircle(viewWidth / 2, viewHeight / 2, viewWidth / 2 - mShadowRadius, paint);
+        }
+
+        private void updateRadialGradient(int diameter) {
+            mRadialGradient = new RadialGradient(diameter / 2, diameter / 2,
+                    mShadowRadius, new int[] {
+                    FILL_SHADOW_COLOR, Color.TRANSPARENT
+            }, null, Shader.TileMode.CLAMP);
+            mShadowPaint.setShader(mRadialGradient);
+        }
+    }
+}
diff --git a/v4/java/android/support/v4/widget/ContentLoadingProgressBar.java b/core-ui/java/android/support/v4/widget/ContentLoadingProgressBar.java
similarity index 100%
rename from v4/java/android/support/v4/widget/ContentLoadingProgressBar.java
rename to core-ui/java/android/support/v4/widget/ContentLoadingProgressBar.java
diff --git a/core-ui/java/android/support/v4/widget/CursorAdapter.java b/core-ui/java/android/support/v4/widget/CursorAdapter.java
new file mode 100644
index 0000000..7476413
--- /dev/null
+++ b/core-ui/java/android/support/v4/widget/CursorAdapter.java
@@ -0,0 +1,492 @@
+/*
+ * 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 android.support.v4.widget;
+
+import android.content.Context;
+import android.database.ContentObserver;
+import android.database.Cursor;
+import android.database.DataSetObserver;
+import android.os.Handler;
+import android.util.Log;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.BaseAdapter;
+import android.widget.Filter;
+import android.widget.FilterQueryProvider;
+import android.widget.Filterable;
+
+/**
+ * Static library support version of the framework's {@link android.widget.CursorAdapter}.
+ * Used to write apps that run on platforms prior to Android 3.0.  When running
+ * on Android 3.0 or above, this implementation is still used; it does not try
+ * to switch to the framework's implementation.  See the framework SDK
+ * documentation for a class overview.
+ */
+public abstract class CursorAdapter extends BaseAdapter implements Filterable,
+        CursorFilter.CursorFilterClient {
+    /**
+     * This field should be made private, so it is hidden from the SDK.
+     * {@hide}
+     */
+    protected boolean mDataValid;
+    /**
+     * This field should be made private, so it is hidden from the SDK.
+     * {@hide}
+     */
+    protected boolean mAutoRequery;
+    /**
+     * This field should be made private, so it is hidden from the SDK.
+     * {@hide}
+     */
+    protected Cursor mCursor;
+    /**
+     * This field should be made private, so it is hidden from the SDK.
+     * {@hide}
+     */
+    protected Context mContext;
+    /**
+     * This field should be made private, so it is hidden from the SDK.
+     * {@hide}
+     */
+    protected int mRowIDColumn;
+    /**
+     * This field should be made private, so it is hidden from the SDK.
+     * {@hide}
+     */
+    protected ChangeObserver mChangeObserver;
+    /**
+     * This field should be made private, so it is hidden from the SDK.
+     * {@hide}
+     */
+    protected DataSetObserver mDataSetObserver;
+    /**
+     * This field should be made private, so it is hidden from the SDK.
+     * {@hide}
+     */
+    protected CursorFilter mCursorFilter;
+    /**
+     * This field should be made private, so it is hidden from the SDK.
+     * {@hide}
+     */
+    protected FilterQueryProvider mFilterQueryProvider;
+
+    /**
+     * If set the adapter will call requery() on the cursor whenever a content change
+     * notification is delivered. Implies {@link #FLAG_REGISTER_CONTENT_OBSERVER}.
+     *
+     * @deprecated This option is discouraged, as it results in Cursor queries
+     * being performed on the application's UI thread and thus can cause poor
+     * responsiveness or even Application Not Responding errors.  As an alternative,
+     * use {@link android.app.LoaderManager} with a {@link android.content.CursorLoader}.
+     */
+    @Deprecated
+    public static final int FLAG_AUTO_REQUERY = 0x01;
+
+    /**
+     * If set the adapter will register a content observer on the cursor and will call
+     * {@link #onContentChanged()} when a notification comes in.  Be careful when
+     * using this flag: you will need to unset the current Cursor from the adapter
+     * to avoid leaks due to its registered observers.  This flag is not needed
+     * when using a CursorAdapter with a
+     * {@link android.content.CursorLoader}.
+     */
+    public static final int FLAG_REGISTER_CONTENT_OBSERVER = 0x02;
+
+    /**
+     * Constructor that always enables auto-requery.
+     *
+     * @deprecated This option is discouraged, as it results in Cursor queries
+     * being performed on the application's UI thread and thus can cause poor
+     * responsiveness or even Application Not Responding errors.  As an alternative,
+     * use {@link android.app.LoaderManager} with a {@link android.content.CursorLoader}.
+     *
+     * @param c The cursor from which to get the data.
+     * @param context The context
+     */
+    @Deprecated
+    public CursorAdapter(Context context, Cursor c) {
+        init(context, c, FLAG_AUTO_REQUERY);
+    }
+
+    /**
+     * Constructor that allows control over auto-requery.  It is recommended
+     * you not use this, but instead {@link #CursorAdapter(Context, Cursor, int)}.
+     * When using this constructor, {@link #FLAG_REGISTER_CONTENT_OBSERVER}
+     * will always be set.
+     *
+     * @param c The cursor from which to get the data.
+     * @param context The context
+     * @param autoRequery If true the adapter will call requery() on the
+     *                    cursor whenever it changes so the most recent
+     *                    data is always displayed.  Using true here is discouraged.
+     */
+    public CursorAdapter(Context context, Cursor c, boolean autoRequery) {
+        init(context, c, autoRequery ? FLAG_AUTO_REQUERY : FLAG_REGISTER_CONTENT_OBSERVER);
+    }
+
+    /**
+     * Recommended constructor.
+     *
+     * @param c The cursor from which to get the data.
+     * @param context The context
+     * @param flags Flags used to determine the behavior of the adapter; may
+     * be any combination of {@link #FLAG_AUTO_REQUERY} and
+     * {@link #FLAG_REGISTER_CONTENT_OBSERVER}.
+     */
+    public CursorAdapter(Context context, Cursor c, int flags) {
+        init(context, c, flags);
+    }
+
+    /**
+     * @deprecated Don't use this, use the normal constructor.  This will
+     * be removed in the future.
+     */
+    @Deprecated
+    protected void init(Context context, Cursor c, boolean autoRequery) {
+        init(context, c, autoRequery ? FLAG_AUTO_REQUERY : FLAG_REGISTER_CONTENT_OBSERVER);
+    }
+
+    void init(Context context, Cursor c, int flags) {
+        if ((flags & FLAG_AUTO_REQUERY) == FLAG_AUTO_REQUERY) {
+            flags |= FLAG_REGISTER_CONTENT_OBSERVER;
+            mAutoRequery = true;
+        } else {
+            mAutoRequery = false;
+        }
+        boolean cursorPresent = c != null;
+        mCursor = c;
+        mDataValid = cursorPresent;
+        mContext = context;
+        mRowIDColumn = cursorPresent ? c.getColumnIndexOrThrow("_id") : -1;
+        if ((flags & FLAG_REGISTER_CONTENT_OBSERVER) == FLAG_REGISTER_CONTENT_OBSERVER) {
+            mChangeObserver = new ChangeObserver();
+            mDataSetObserver = new MyDataSetObserver();
+        } else {
+            mChangeObserver = null;
+            mDataSetObserver = null;
+        }
+
+        if (cursorPresent) {
+            if (mChangeObserver != null) c.registerContentObserver(mChangeObserver);
+            if (mDataSetObserver != null) c.registerDataSetObserver(mDataSetObserver);
+        }
+    }
+
+    /**
+     * Returns the cursor.
+     * @return the cursor.
+     */
+    @Override
+    public Cursor getCursor() {
+        return mCursor;
+    }
+
+    /**
+     * @see android.widget.ListAdapter#getCount()
+     */
+    @Override
+    public int getCount() {
+        if (mDataValid && mCursor != null) {
+            return mCursor.getCount();
+        } else {
+            return 0;
+        }
+    }
+    
+    /**
+     * @see android.widget.ListAdapter#getItem(int)
+     */
+    @Override
+    public Object getItem(int position) {
+        if (mDataValid && mCursor != null) {
+            mCursor.moveToPosition(position);
+            return mCursor;
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * @see android.widget.ListAdapter#getItemId(int)
+     */
+    @Override
+    public long getItemId(int position) {
+        if (mDataValid && mCursor != null) {
+            if (mCursor.moveToPosition(position)) {
+                return mCursor.getLong(mRowIDColumn);
+            } else {
+                return 0;
+            }
+        } else {
+            return 0;
+        }
+    }
+    
+    @Override
+    public boolean hasStableIds() {
+        return true;
+    }
+
+    /**
+     * @see android.widget.ListAdapter#getView(int, View, ViewGroup)
+     */
+    @Override
+    public View getView(int position, View convertView, ViewGroup parent) {
+        if (!mDataValid) {
+            throw new IllegalStateException("this should only be called when the cursor is valid");
+        }
+        if (!mCursor.moveToPosition(position)) {
+            throw new IllegalStateException("couldn't move cursor to position " + position);
+        }
+        View v;
+        if (convertView == null) {
+            v = newView(mContext, mCursor, parent);
+        } else {
+            v = convertView;
+        }
+        bindView(v, mContext, mCursor);
+        return v;
+    }
+
+    @Override
+    public View getDropDownView(int position, View convertView, ViewGroup parent) {
+        if (mDataValid) {
+            mCursor.moveToPosition(position);
+            View v;
+            if (convertView == null) {
+                v = newDropDownView(mContext, mCursor, parent);
+            } else {
+                v = convertView;
+            }
+            bindView(v, mContext, mCursor);
+            return v;
+        } else {
+            return null;
+        }
+    }
+    
+    /**
+     * Makes a new view to hold the data pointed to by cursor.
+     * @param context Interface to application's global information
+     * @param cursor The cursor from which to get the data. The cursor is already
+     * moved to the correct position.
+     * @param parent The parent to which the new view is attached to
+     * @return the newly created view.
+     */
+    public abstract View newView(Context context, Cursor cursor, ViewGroup parent);
+
+    /**
+     * Makes a new drop down view to hold the data pointed to by cursor.
+     * @param context Interface to application's global information
+     * @param cursor The cursor from which to get the data. The cursor is already
+     * moved to the correct position.
+     * @param parent The parent to which the new view is attached to
+     * @return the newly created view.
+     */
+    public View newDropDownView(Context context, Cursor cursor, ViewGroup parent) {
+        return newView(context, cursor, parent);
+    }
+
+    /**
+     * Bind an existing view to the data pointed to by cursor
+     * @param view Existing view, returned earlier by newView
+     * @param context Interface to application's global information
+     * @param cursor The cursor from which to get the data. The cursor is already
+     * moved to the correct position.
+     */
+    public abstract void bindView(View view, Context context, Cursor cursor);
+    
+    /**
+     * Change the underlying cursor to a new cursor. If there is an existing cursor it will be
+     * closed.
+     * 
+     * @param cursor The new cursor to be used
+     */
+    @Override
+    public void changeCursor(Cursor cursor) {
+        Cursor old = swapCursor(cursor);
+        if (old != null) {
+            old.close();
+        }
+    }
+
+    /**
+     * Swap in a new Cursor, returning the old Cursor.  Unlike
+     * {@link #changeCursor(Cursor)}, the returned old Cursor is <em>not</em>
+     * closed.
+     *
+     * @param newCursor The new cursor to be used.
+     * @return Returns the previously set Cursor, or null if there was not one.
+     * If the given new Cursor is the same instance is the previously set
+     * Cursor, null is also returned.
+     */
+    public Cursor swapCursor(Cursor newCursor) {
+        if (newCursor == mCursor) {
+            return null;
+        }
+        Cursor oldCursor = mCursor;
+        if (oldCursor != null) {
+            if (mChangeObserver != null) oldCursor.unregisterContentObserver(mChangeObserver);
+            if (mDataSetObserver != null) oldCursor.unregisterDataSetObserver(mDataSetObserver);
+        }
+        mCursor = newCursor;
+        if (newCursor != null) {
+            if (mChangeObserver != null) newCursor.registerContentObserver(mChangeObserver);
+            if (mDataSetObserver != null) newCursor.registerDataSetObserver(mDataSetObserver);
+            mRowIDColumn = newCursor.getColumnIndexOrThrow("_id");
+            mDataValid = true;
+            // notify the observers about the new cursor
+            notifyDataSetChanged();
+        } else {
+            mRowIDColumn = -1;
+            mDataValid = false;
+            // notify the observers about the lack of a data set
+            notifyDataSetInvalidated();
+        }
+        return oldCursor;
+    }
+
+    /**
+     * <p>Converts the cursor into a CharSequence. Subclasses should override this
+     * method to convert their results. The default implementation returns an
+     * empty String for null values or the default String representation of
+     * the value.</p>
+     *
+     * @param cursor the cursor to convert to a CharSequence
+     * @return a CharSequence representing the value
+     */
+    @Override
+    public CharSequence convertToString(Cursor cursor) {
+        return cursor == null ? "" : cursor.toString();
+    }
+
+    /**
+     * Runs a query with the specified constraint. This query is requested
+     * by the filter attached to this adapter.
+     *
+     * The query is provided by a
+     * {@link android.widget.FilterQueryProvider}.
+     * If no provider is specified, the current cursor is not filtered and returned.
+     *
+     * After this method returns the resulting cursor is passed to {@link #changeCursor(Cursor)}
+     * and the previous cursor is closed.
+     *
+     * This method is always executed on a background thread, not on the
+     * application's main thread (or UI thread.)
+     * 
+     * Contract: when constraint is null or empty, the original results,
+     * prior to any filtering, must be returned.
+     *
+     * @param constraint the constraint with which the query must be filtered
+     *
+     * @return a Cursor representing the results of the new query
+     *
+     * @see #getFilter()
+     * @see #getFilterQueryProvider()
+     * @see #setFilterQueryProvider(android.widget.FilterQueryProvider)
+     */
+    @Override
+    public Cursor runQueryOnBackgroundThread(CharSequence constraint) {
+        if (mFilterQueryProvider != null) {
+            return mFilterQueryProvider.runQuery(constraint);
+        }
+
+        return mCursor;
+    }
+
+    @Override
+    public Filter getFilter() {
+        if (mCursorFilter == null) {
+            mCursorFilter = new CursorFilter(this);
+        }
+        return mCursorFilter;
+    }
+
+    /**
+     * Returns the query filter provider used for filtering. When the
+     * provider is null, no filtering occurs.
+     *
+     * @return the current filter query provider or null if it does not exist
+     *
+     * @see #setFilterQueryProvider(android.widget.FilterQueryProvider)
+     * @see #runQueryOnBackgroundThread(CharSequence)
+     */
+    public FilterQueryProvider getFilterQueryProvider() {
+        return mFilterQueryProvider;
+    }
+
+    /**
+     * Sets the query filter provider used to filter the current Cursor.
+     * The provider's
+     * {@link android.widget.FilterQueryProvider#runQuery(CharSequence)}
+     * method is invoked when filtering is requested by a client of
+     * this adapter.
+     *
+     * @param filterQueryProvider the filter query provider or null to remove it
+     *
+     * @see #getFilterQueryProvider()
+     * @see #runQueryOnBackgroundThread(CharSequence)
+     */
+    public void setFilterQueryProvider(FilterQueryProvider filterQueryProvider) {
+        mFilterQueryProvider = filterQueryProvider;
+    }
+
+    /**
+     * Called when the {@link ContentObserver} on the cursor receives a change notification.
+     * The default implementation provides the auto-requery logic, but may be overridden by
+     * sub classes.
+     * 
+     * @see ContentObserver#onChange(boolean)
+     */
+    protected void onContentChanged() {
+        if (mAutoRequery && mCursor != null && !mCursor.isClosed()) {
+            if (false) Log.v("Cursor", "Auto requerying " + mCursor + " due to update");
+            mDataValid = mCursor.requery();
+        }
+    }
+
+    private class ChangeObserver extends ContentObserver {
+        public ChangeObserver() {
+            super(new Handler());
+        }
+
+        @Override
+        public boolean deliverSelfNotifications() {
+            return true;
+        }
+
+        @Override
+        public void onChange(boolean selfChange) {
+            onContentChanged();
+        }
+    }
+
+    private class MyDataSetObserver extends DataSetObserver {
+        @Override
+        public void onChanged() {
+            mDataValid = true;
+            notifyDataSetChanged();
+        }
+
+        @Override
+        public void onInvalidated() {
+            mDataValid = false;
+            notifyDataSetInvalidated();
+        }
+    }
+
+}
diff --git a/v4/java/android/support/v4/widget/CursorFilter.java b/core-ui/java/android/support/v4/widget/CursorFilter.java
similarity index 100%
rename from v4/java/android/support/v4/widget/CursorFilter.java
rename to core-ui/java/android/support/v4/widget/CursorFilter.java
diff --git a/core-ui/java/android/support/v4/widget/DrawerLayout.java b/core-ui/java/android/support/v4/widget/DrawerLayout.java
new file mode 100644
index 0000000..452d570
--- /dev/null
+++ b/core-ui/java/android/support/v4/widget/DrawerLayout.java
@@ -0,0 +1,2398 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+package android.support.v4.widget;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.PixelFormat;
+import android.graphics.Rect;
+import android.graphics.drawable.ColorDrawable;
+import android.graphics.drawable.Drawable;
+import android.os.Build;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.os.SystemClock;
+import android.support.annotation.ColorInt;
+import android.support.annotation.DrawableRes;
+import android.support.annotation.IntDef;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.v4.content.ContextCompat;
+import android.support.v4.graphics.drawable.DrawableCompat;
+import android.support.v4.os.ParcelableCompat;
+import android.support.v4.os.ParcelableCompatCreatorCallbacks;
+import android.support.v4.view.AbsSavedState;
+import android.support.v4.view.AccessibilityDelegateCompat;
+import android.support.v4.view.GravityCompat;
+import android.support.v4.view.KeyEventCompat;
+import android.support.v4.view.MotionEventCompat;
+import android.support.v4.view.ViewCompat;
+import android.support.v4.view.ViewGroupCompat;
+import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat;
+import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat;
+import android.util.AttributeSet;
+import android.view.Gravity;
+import android.view.KeyEvent;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.ViewParent;
+import android.view.accessibility.AccessibilityEvent;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * DrawerLayout acts as a top-level container for window content that allows for
+ * interactive "drawer" views to be pulled out from one or both vertical edges of the window.
+ *
+ * <p>Drawer positioning and layout is controlled using the <code>android:layout_gravity</code>
+ * attribute on child views corresponding to which side of the view you want the drawer
+ * to emerge from: left or right (or start/end on platform versions that support layout direction.)
+ * Note that you can only have one drawer view for each vertical edge of the window. If your
+ * layout configures more than one drawer view per vertical edge of the window, an exception will
+ * be thrown at runtime.
+ * </p>
+ *
+ * <p>To use a DrawerLayout, position your primary content view as the first child with
+ * width and height of <code>match_parent</code> and no <code>layout_gravity></code>.
+ * Add drawers as child views after the main content view and set the <code>layout_gravity</code>
+ * appropriately. Drawers commonly use <code>match_parent</code> for height with a fixed width.</p>
+ *
+ * <p>{@link DrawerListener} can be used to monitor the state and motion of drawer views.
+ * Avoid performing expensive operations such as layout during animation as it can cause
+ * stuttering; try to perform expensive operations during the {@link #STATE_IDLE} state.
+ * {@link SimpleDrawerListener} offers default/no-op implementations of each callback method.</p>
+ *
+ * <p>As per the <a href="{@docRoot}design/patterns/navigation-drawer.html">Android Design
+ * guide</a>, any drawers positioned to the left/start should
+ * always contain content for navigating around the application, whereas any drawers
+ * positioned to the right/end should always contain actions to take on the current content.
+ * This preserves the same navigation left, actions right structure present in the Action Bar
+ * and elsewhere.</p>
+ *
+ * <p>For more information about how to use DrawerLayout, read <a
+ * href="{@docRoot}training/implementing-navigation/nav-drawer.html">Creating a Navigation
+ * Drawer</a>.</p>
+ */
+public class DrawerLayout extends ViewGroup implements DrawerLayoutImpl {
+    private static final String TAG = "DrawerLayout";
+
+    @IntDef({STATE_IDLE, STATE_DRAGGING, STATE_SETTLING})
+    @Retention(RetentionPolicy.SOURCE)
+    private @interface State {}
+
+    /**
+     * Indicates that any drawers are in an idle, settled state. No animation is in progress.
+     */
+    public static final int STATE_IDLE = ViewDragHelper.STATE_IDLE;
+
+    /**
+     * Indicates that a drawer is currently being dragged by the user.
+     */
+    public static final int STATE_DRAGGING = ViewDragHelper.STATE_DRAGGING;
+
+    /**
+     * Indicates that a drawer is in the process of settling to a final position.
+     */
+    public static final int STATE_SETTLING = ViewDragHelper.STATE_SETTLING;
+
+    /** @hide */
+    @IntDef({LOCK_MODE_UNLOCKED, LOCK_MODE_LOCKED_CLOSED, LOCK_MODE_LOCKED_OPEN,
+            LOCK_MODE_UNDEFINED})
+    @Retention(RetentionPolicy.SOURCE)
+    private @interface LockMode {}
+
+    /**
+     * The drawer is unlocked.
+     */
+    public static final int LOCK_MODE_UNLOCKED = 0;
+
+    /**
+     * The drawer is locked closed. The user may not open it, though
+     * the app may open it programmatically.
+     */
+    public static final int LOCK_MODE_LOCKED_CLOSED = 1;
+
+    /**
+     * The drawer is locked open. The user may not close it, though the app
+     * may close it programmatically.
+     */
+    public static final int LOCK_MODE_LOCKED_OPEN = 2;
+
+    /**
+     * The drawer's lock state is reset to default.
+     */
+    public static final int LOCK_MODE_UNDEFINED = 3;
+
+    /** @hide */
+    @IntDef({Gravity.LEFT, Gravity.RIGHT, GravityCompat.START, GravityCompat.END})
+    @Retention(RetentionPolicy.SOURCE)
+    private @interface EdgeGravity {}
+
+
+    private static final int MIN_DRAWER_MARGIN = 64; // dp
+    private static final int DRAWER_ELEVATION = 10; //dp
+
+    private static final int DEFAULT_SCRIM_COLOR = 0x99000000;
+
+    /**
+     * Length of time to delay before peeking the drawer.
+     */
+    private static final int PEEK_DELAY = 160; // ms
+
+    /**
+     * Minimum velocity that will be detected as a fling
+     */
+    private static final int MIN_FLING_VELOCITY = 400; // dips per second
+
+    /**
+     * Experimental feature.
+     */
+    private static final boolean ALLOW_EDGE_LOCK = false;
+
+    private static final boolean CHILDREN_DISALLOW_INTERCEPT = true;
+
+    private static final float TOUCH_SLOP_SENSITIVITY = 1.f;
+
+    private static final int[] LAYOUT_ATTRS = new int[] {
+            android.R.attr.layout_gravity
+    };
+
+    /** Whether we can use NO_HIDE_DESCENDANTS accessibility importance. */
+    private static final boolean CAN_HIDE_DESCENDANTS = Build.VERSION.SDK_INT >= 19;
+
+    /** Whether the drawer shadow comes from setting elevation on the drawer. */
+    private static final boolean SET_DRAWER_SHADOW_FROM_ELEVATION =
+            Build.VERSION.SDK_INT >= 21;
+
+    private final ChildAccessibilityDelegate mChildAccessibilityDelegate =
+            new ChildAccessibilityDelegate();
+    private float mDrawerElevation;
+
+    private int mMinDrawerMargin;
+
+    private int mScrimColor = DEFAULT_SCRIM_COLOR;
+    private float mScrimOpacity;
+    private Paint mScrimPaint = new Paint();
+
+    private final ViewDragHelper mLeftDragger;
+    private final ViewDragHelper mRightDragger;
+    private final ViewDragCallback mLeftCallback;
+    private final ViewDragCallback mRightCallback;
+    private int mDrawerState;
+    private boolean mInLayout;
+    private boolean mFirstLayout = true;
+
+    private @LockMode int mLockModeLeft = LOCK_MODE_UNDEFINED;
+    private @LockMode int mLockModeRight = LOCK_MODE_UNDEFINED;
+    private @LockMode int mLockModeStart = LOCK_MODE_UNDEFINED;
+    private @LockMode int mLockModeEnd = LOCK_MODE_UNDEFINED;
+
+    private boolean mDisallowInterceptRequested;
+    private boolean mChildrenCanceledTouch;
+
+    private @Nullable DrawerListener mListener;
+    private List<DrawerListener> mListeners;
+
+    private float mInitialMotionX;
+    private float mInitialMotionY;
+
+    private Drawable mStatusBarBackground;
+    private Drawable mShadowLeftResolved;
+    private Drawable mShadowRightResolved;
+
+    private CharSequence mTitleLeft;
+    private CharSequence mTitleRight;
+
+    private Object mLastInsets;
+    private boolean mDrawStatusBarBackground;
+
+    /** Shadow drawables for different gravity */
+    private Drawable mShadowStart = null;
+    private Drawable mShadowEnd = null;
+    private Drawable mShadowLeft = null;
+    private Drawable mShadowRight = null;
+
+    private final ArrayList<View> mNonDrawerViews;
+
+    /**
+     * Listener for monitoring events about drawers.
+     */
+    public interface DrawerListener {
+        /**
+         * Called when a drawer's position changes.
+         * @param drawerView The child view that was moved
+         * @param slideOffset The new offset of this drawer within its range, from 0-1
+         */
+        public void onDrawerSlide(View drawerView, float slideOffset);
+
+        /**
+         * Called when a drawer has settled in a completely open state.
+         * The drawer is interactive at this point.
+         *
+         * @param drawerView Drawer view that is now open
+         */
+        public void onDrawerOpened(View drawerView);
+
+        /**
+         * Called when a drawer has settled in a completely closed state.
+         *
+         * @param drawerView Drawer view that is now closed
+         */
+        public void onDrawerClosed(View drawerView);
+
+        /**
+         * Called when the drawer motion state changes. The new state will
+         * be one of {@link #STATE_IDLE}, {@link #STATE_DRAGGING} or {@link #STATE_SETTLING}.
+         *
+         * @param newState The new drawer motion state
+         */
+        public void onDrawerStateChanged(@State int newState);
+    }
+
+    /**
+     * Stub/no-op implementations of all methods of {@link DrawerListener}.
+     * Override this if you only care about a few of the available callback methods.
+     */
+    public static abstract class SimpleDrawerListener implements DrawerListener {
+        @Override
+        public void onDrawerSlide(View drawerView, float slideOffset) {
+        }
+
+        @Override
+        public void onDrawerOpened(View drawerView) {
+        }
+
+        @Override
+        public void onDrawerClosed(View drawerView) {
+        }
+
+        @Override
+        public void onDrawerStateChanged(int newState) {
+        }
+    }
+
+    interface DrawerLayoutCompatImpl {
+        void configureApplyInsets(View drawerLayout);
+        void dispatchChildInsets(View child, Object insets, int drawerGravity);
+        void applyMarginInsets(MarginLayoutParams lp, Object insets, int drawerGravity);
+        int getTopInset(Object lastInsets);
+        Drawable getDefaultStatusBarBackground(Context context);
+    }
+
+    static class DrawerLayoutCompatImplBase implements DrawerLayoutCompatImpl {
+        @Override
+        public void configureApplyInsets(View drawerLayout) {
+            // This space for rent
+        }
+
+        @Override
+        public void dispatchChildInsets(View child, Object insets, int drawerGravity) {
+            // This space for rent
+        }
+
+        @Override
+        public void applyMarginInsets(MarginLayoutParams lp, Object insets, int drawerGravity) {
+            // This space for rent
+        }
+
+        @Override
+        public int getTopInset(Object insets) {
+            return 0;
+        }
+
+        @Override
+        public Drawable getDefaultStatusBarBackground(Context context) {
+            return null;
+        }
+    }
+
+    static class DrawerLayoutCompatImplApi21 implements DrawerLayoutCompatImpl {
+        @Override
+        public void configureApplyInsets(View drawerLayout) {
+            DrawerLayoutCompatApi21.configureApplyInsets(drawerLayout);
+        }
+
+        @Override
+        public void dispatchChildInsets(View child, Object insets, int drawerGravity) {
+            DrawerLayoutCompatApi21.dispatchChildInsets(child, insets, drawerGravity);
+        }
+
+        @Override
+        public void applyMarginInsets(MarginLayoutParams lp, Object insets, int drawerGravity) {
+            DrawerLayoutCompatApi21.applyMarginInsets(lp, insets, drawerGravity);
+        }
+
+        @Override
+        public int getTopInset(Object insets) {
+            return DrawerLayoutCompatApi21.getTopInset(insets);
+        }
+
+        @Override
+        public Drawable getDefaultStatusBarBackground(Context context) {
+            return DrawerLayoutCompatApi21.getDefaultStatusBarBackground(context);
+        }
+    }
+
+    static {
+        final int version = Build.VERSION.SDK_INT;
+        if (version >= 21) {
+            IMPL = new DrawerLayoutCompatImplApi21();
+        } else {
+            IMPL = new DrawerLayoutCompatImplBase();
+        }
+    }
+
+    static final DrawerLayoutCompatImpl IMPL;
+
+    public DrawerLayout(Context context) {
+        this(context, null);
+    }
+
+    public DrawerLayout(Context context, AttributeSet attrs) {
+        this(context, attrs, 0);
+    }
+
+    public DrawerLayout(Context context, AttributeSet attrs, int defStyle) {
+        super(context, attrs, defStyle);
+        setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);
+        final float density = getResources().getDisplayMetrics().density;
+        mMinDrawerMargin = (int) (MIN_DRAWER_MARGIN * density + 0.5f);
+        final float minVel = MIN_FLING_VELOCITY * density;
+
+        mLeftCallback = new ViewDragCallback(Gravity.LEFT);
+        mRightCallback = new ViewDragCallback(Gravity.RIGHT);
+
+        mLeftDragger = ViewDragHelper.create(this, TOUCH_SLOP_SENSITIVITY, mLeftCallback);
+        mLeftDragger.setEdgeTrackingEnabled(ViewDragHelper.EDGE_LEFT);
+        mLeftDragger.setMinVelocity(minVel);
+        mLeftCallback.setDragger(mLeftDragger);
+
+        mRightDragger = ViewDragHelper.create(this, TOUCH_SLOP_SENSITIVITY, mRightCallback);
+        mRightDragger.setEdgeTrackingEnabled(ViewDragHelper.EDGE_RIGHT);
+        mRightDragger.setMinVelocity(minVel);
+        mRightCallback.setDragger(mRightDragger);
+
+        // So that we can catch the back button
+        setFocusableInTouchMode(true);
+
+        ViewCompat.setImportantForAccessibility(this,
+                ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_YES);
+
+        ViewCompat.setAccessibilityDelegate(this, new AccessibilityDelegate());
+        ViewGroupCompat.setMotionEventSplittingEnabled(this, false);
+        if (ViewCompat.getFitsSystemWindows(this)) {
+            IMPL.configureApplyInsets(this);
+            mStatusBarBackground = IMPL.getDefaultStatusBarBackground(context);
+        }
+
+        mDrawerElevation = DRAWER_ELEVATION * density;
+
+        mNonDrawerViews = new ArrayList<View>();
+    }
+
+    /**
+     * Sets the base elevation of the drawer(s) relative to the parent, in pixels. Note that the
+     * elevation change is only supported in API 21 and above.
+     *
+     * @param elevation The base depth position of the view, in pixels.
+     */
+    public void setDrawerElevation(float elevation) {
+        mDrawerElevation = elevation;
+        for (int i = 0; i < getChildCount(); i++) {
+            View child = getChildAt(i);
+            if (isDrawerView(child)) {
+                ViewCompat.setElevation(child, mDrawerElevation);
+            }
+        }
+    }
+
+    /**
+     * The base elevation of the drawer(s) relative to the parent, in pixels. Note that the
+     * elevation change is only supported in API 21 and above. For unsupported API levels, 0 will
+     * be returned as the elevation.
+     *
+     * @return The base depth position of the view, in pixels.
+     */
+    public float getDrawerElevation() {
+        if (SET_DRAWER_SHADOW_FROM_ELEVATION) {
+            return mDrawerElevation;
+        }
+        return 0f;
+    }
+
+    /**
+     * @hide Internal use only; called to apply window insets when configured
+     * with fitsSystemWindows="true"
+     */
+    @Override
+    public void setChildInsets(Object insets, boolean draw) {
+        mLastInsets = insets;
+        mDrawStatusBarBackground = draw;
+        setWillNotDraw(!draw && getBackground() == null);
+        requestLayout();
+    }
+
+    /**
+     * Set a simple drawable used for the left or right shadow. The drawable provided must have a
+     * nonzero intrinsic width. For API 21 and above, an elevation will be set on the drawer
+     * instead of the drawable provided.
+     *
+     * <p>Note that for better support for both left-to-right and right-to-left layout
+     * directions, a drawable for RTL layout (in additional to the one in LTR layout) can be
+     * defined with a resource qualifier "ldrtl" for API 17 and above with the gravity
+     * {@link GravityCompat#START}. Alternatively, for API 23 and above, the drawable can
+     * auto-mirrored such that the drawable will be mirrored in RTL layout.</p>
+     *
+     * @param shadowDrawable Shadow drawable to use at the edge of a drawer
+     * @param gravity Which drawer the shadow should apply to
+     */
+    public void setDrawerShadow(Drawable shadowDrawable, @EdgeGravity int gravity) {
+        /*
+         * TODO Someone someday might want to set more complex drawables here.
+         * They're probably nuts, but we might want to consider registering callbacks,
+         * setting states, etc. properly.
+         */
+        if (SET_DRAWER_SHADOW_FROM_ELEVATION) {
+            // No op. Drawer shadow will come from setting an elevation on the drawer.
+            return;
+        }
+        if ((gravity & GravityCompat.START) == GravityCompat.START) {
+            mShadowStart = shadowDrawable;
+        } else if ((gravity & GravityCompat.END) == GravityCompat.END) {
+            mShadowEnd = shadowDrawable;
+        } else if ((gravity & Gravity.LEFT) == Gravity.LEFT) {
+            mShadowLeft = shadowDrawable;
+        } else if ((gravity & Gravity.RIGHT) == Gravity.RIGHT) {
+            mShadowRight = shadowDrawable;
+        } else {
+            return;
+        }
+        resolveShadowDrawables();
+        invalidate();
+    }
+
+    /**
+     * Set a simple drawable used for the left or right shadow. The drawable provided must have a
+     * nonzero intrinsic width. For API 21 and above, an elevation will be set on the drawer
+     * instead of the drawable provided.
+     *
+     * <p>Note that for better support for both left-to-right and right-to-left layout
+     * directions, a drawable for RTL layout (in additional to the one in LTR layout) can be
+     * defined with a resource qualifier "ldrtl" for API 17 and above with the gravity
+     * {@link GravityCompat#START}. Alternatively, for API 23 and above, the drawable can
+     * auto-mirrored such that the drawable will be mirrored in RTL layout.</p>
+     *
+     * @param resId Resource id of a shadow drawable to use at the edge of a drawer
+     * @param gravity Which drawer the shadow should apply to
+     */
+    public void setDrawerShadow(@DrawableRes int resId, @EdgeGravity int gravity) {
+        setDrawerShadow(getResources().getDrawable(resId), gravity);
+    }
+
+    /**
+     * Set a color to use for the scrim that obscures primary content while a drawer is open.
+     *
+     * @param color Color to use in 0xAARRGGBB format.
+     */
+    public void setScrimColor(@ColorInt int color) {
+        mScrimColor = color;
+        invalidate();
+    }
+
+    /**
+     * Set a listener to be notified of drawer events. Note that this method is deprecated
+     * and you should use {@link #addDrawerListener(DrawerListener)} to add a listener and
+     * {@link #removeDrawerListener(DrawerListener)} to remove a registered listener.
+     *
+     * @param listener Listener to notify when drawer events occur
+     * @deprecated Use {@link #addDrawerListener(DrawerListener)}
+     * @see DrawerListener
+     * @see #addDrawerListener(DrawerListener)
+     * @see #removeDrawerListener(DrawerListener)
+     */
+    @Deprecated
+    public void setDrawerListener(DrawerListener listener) {
+        // The logic in this method emulates what we had before support for multiple
+        // registered listeners.
+        if (mListener != null) {
+            removeDrawerListener(mListener);
+        }
+        if (listener != null) {
+            addDrawerListener(listener);
+        }
+        // Update the deprecated field so that we can remove the passed listener the next
+        // time we're called
+        mListener = listener;
+    }
+
+    /**
+     * Adds the specified listener to the list of listeners that will be notified of drawer events.
+     *
+     * @param listener Listener to notify when drawer events occur.
+     * @see #removeDrawerListener(DrawerListener)
+     */
+    public void addDrawerListener(@NonNull DrawerListener listener) {
+        if (listener == null) {
+            return;
+        }
+        if (mListeners == null) {
+            mListeners = new ArrayList<DrawerListener>();
+        }
+        mListeners.add(listener);
+    }
+
+    /**
+     * Removes the specified listener from the list of listeners that will be notified of drawer
+     * events.
+     *
+     * @param listener Listener to remove from being notified of drawer events
+     * @see #addDrawerListener(DrawerListener)
+     */
+    public void removeDrawerListener(@NonNull DrawerListener listener) {
+        if (listener == null) {
+            return;
+        }
+        if (mListeners == null) {
+            // This can happen if this method is called before the first call to addDrawerListener
+            return;
+        }
+        mListeners.remove(listener);
+    }
+
+    /**
+     * Enable or disable interaction with all drawers.
+     *
+     * <p>This allows the application to restrict the user's ability to open or close
+     * any drawer within this layout. DrawerLayout will still respond to calls to
+     * {@link #openDrawer(int)}, {@link #closeDrawer(int)} and friends if a drawer is locked.</p>
+     *
+     * <p>Locking drawers open or closed will implicitly open or close
+     * any drawers as appropriate.</p>
+     *
+     * @param lockMode The new lock mode for the given drawer. One of {@link #LOCK_MODE_UNLOCKED},
+     *                 {@link #LOCK_MODE_LOCKED_CLOSED} or {@link #LOCK_MODE_LOCKED_OPEN}.
+     */
+    public void setDrawerLockMode(@LockMode int lockMode) {
+        setDrawerLockMode(lockMode, Gravity.LEFT);
+        setDrawerLockMode(lockMode, Gravity.RIGHT);
+    }
+
+    /**
+     * Enable or disable interaction with the given drawer.
+     *
+     * <p>This allows the application to restrict the user's ability to open or close
+     * the given drawer. DrawerLayout will still respond to calls to {@link #openDrawer(int)},
+     * {@link #closeDrawer(int)} and friends if a drawer is locked.</p>
+     *
+     * <p>Locking a drawer open or closed will implicitly open or close
+     * that drawer as appropriate.</p>
+     *
+     * @param lockMode The new lock mode for the given drawer. One of {@link #LOCK_MODE_UNLOCKED},
+     *                 {@link #LOCK_MODE_LOCKED_CLOSED} or {@link #LOCK_MODE_LOCKED_OPEN}.
+     * @param edgeGravity Gravity.LEFT, RIGHT, START or END.
+     *                    Expresses which drawer to change the mode for.
+     *
+     * @see #LOCK_MODE_UNLOCKED
+     * @see #LOCK_MODE_LOCKED_CLOSED
+     * @see #LOCK_MODE_LOCKED_OPEN
+     */
+    public void setDrawerLockMode(@LockMode int lockMode, @EdgeGravity int edgeGravity) {
+        final int absGravity = GravityCompat.getAbsoluteGravity(edgeGravity,
+                ViewCompat.getLayoutDirection(this));
+
+        switch (edgeGravity) {
+            case Gravity.LEFT:
+                mLockModeLeft = lockMode;
+                break;
+            case Gravity.RIGHT:
+                mLockModeRight = lockMode;
+                break;
+            case GravityCompat.START:
+                mLockModeStart = lockMode;
+                break;
+            case GravityCompat.END:
+                mLockModeEnd = lockMode;
+                break;
+        }
+
+        if (lockMode != LOCK_MODE_UNLOCKED) {
+            // Cancel interaction in progress
+            final ViewDragHelper helper = absGravity == Gravity.LEFT ? mLeftDragger : mRightDragger;
+            helper.cancel();
+        }
+        switch (lockMode) {
+            case LOCK_MODE_LOCKED_OPEN:
+                final View toOpen = findDrawerWithGravity(absGravity);
+                if (toOpen != null) {
+                    openDrawer(toOpen);
+                }
+                break;
+            case LOCK_MODE_LOCKED_CLOSED:
+                final View toClose = findDrawerWithGravity(absGravity);
+                if (toClose != null) {
+                    closeDrawer(toClose);
+                }
+            break;
+                // default: do nothing
+        }
+    }
+
+    /**
+     * Enable or disable interaction with the given drawer.
+     *
+     * <p>This allows the application to restrict the user's ability to open or close
+     * the given drawer. DrawerLayout will still respond to calls to {@link #openDrawer(int)},
+     * {@link #closeDrawer(int)} and friends if a drawer is locked.</p>
+     *
+     * <p>Locking a drawer open or closed will implicitly open or close
+     * that drawer as appropriate.</p>
+     *
+     * @param lockMode The new lock mode for the given drawer. One of {@link #LOCK_MODE_UNLOCKED},
+     *                 {@link #LOCK_MODE_LOCKED_CLOSED} or {@link #LOCK_MODE_LOCKED_OPEN}.
+     * @param drawerView The drawer view to change the lock mode for
+     *
+     * @see #LOCK_MODE_UNLOCKED
+     * @see #LOCK_MODE_LOCKED_CLOSED
+     * @see #LOCK_MODE_LOCKED_OPEN
+     */
+    public void setDrawerLockMode(@LockMode int lockMode, View drawerView) {
+        if (!isDrawerView(drawerView)) {
+            throw new IllegalArgumentException("View " + drawerView + " is not a " +
+                    "drawer with appropriate layout_gravity");
+        }
+        final int gravity = ((LayoutParams) drawerView.getLayoutParams()).gravity;
+        setDrawerLockMode(lockMode, gravity);
+    }
+
+    /**
+     * Check the lock mode of the drawer with the given gravity.
+     *
+     * @param edgeGravity Gravity of the drawer to check
+     * @return one of {@link #LOCK_MODE_UNLOCKED}, {@link #LOCK_MODE_LOCKED_CLOSED} or
+     *         {@link #LOCK_MODE_LOCKED_OPEN}.
+     */
+    @LockMode
+    public int getDrawerLockMode(@EdgeGravity int edgeGravity) {
+        int layoutDirection = ViewCompat.getLayoutDirection(this);
+
+        switch (edgeGravity) {
+            case Gravity.LEFT:
+                if (mLockModeLeft != LOCK_MODE_UNDEFINED) {
+                    return mLockModeLeft;
+                }
+                int leftLockMode = (layoutDirection == ViewCompat.LAYOUT_DIRECTION_LTR) ?
+                        mLockModeStart : mLockModeEnd;
+                if (leftLockMode != LOCK_MODE_UNDEFINED) {
+                    return leftLockMode;
+                }
+                break;
+            case Gravity.RIGHT:
+                if (mLockModeRight != LOCK_MODE_UNDEFINED) {
+                    return mLockModeRight;
+                }
+                int rightLockMode = (layoutDirection == ViewCompat.LAYOUT_DIRECTION_LTR) ?
+                        mLockModeEnd : mLockModeStart;
+                if (rightLockMode != LOCK_MODE_UNDEFINED) {
+                    return rightLockMode;
+                }
+                break;
+            case GravityCompat.START:
+                if (mLockModeStart != LOCK_MODE_UNDEFINED) {
+                    return mLockModeStart;
+                }
+                int startLockMode = (layoutDirection == ViewCompat.LAYOUT_DIRECTION_LTR) ?
+                        mLockModeLeft : mLockModeRight;
+                if (startLockMode != LOCK_MODE_UNDEFINED) {
+                    return startLockMode;
+                }
+                break;
+            case GravityCompat.END:
+                if (mLockModeEnd != LOCK_MODE_UNDEFINED) {
+                    return mLockModeEnd;
+                }
+                int endLockMode = (layoutDirection == ViewCompat.LAYOUT_DIRECTION_LTR) ?
+                        mLockModeRight : mLockModeLeft;
+                if (endLockMode != LOCK_MODE_UNDEFINED) {
+                    return endLockMode;
+                }
+                break;
+        }
+
+        return LOCK_MODE_UNLOCKED;
+    }
+
+    /**
+     * Check the lock mode of the given drawer view.
+     *
+     * @param drawerView Drawer view to check lock mode
+     * @return one of {@link #LOCK_MODE_UNLOCKED}, {@link #LOCK_MODE_LOCKED_CLOSED} or
+     *         {@link #LOCK_MODE_LOCKED_OPEN}.
+     */
+    @LockMode
+    public int getDrawerLockMode(View drawerView) {
+        if (!isDrawerView(drawerView)) {
+            throw new IllegalArgumentException("View " + drawerView + " is not a drawer");
+        }
+        final int drawerGravity = ((LayoutParams) drawerView.getLayoutParams()).gravity;
+        return getDrawerLockMode(drawerGravity);
+    }
+
+    /**
+     * Sets the title of the drawer with the given gravity.
+     * <p>
+     * When accessibility is turned on, this is the title that will be used to
+     * identify the drawer to the active accessibility service.
+     *
+     * @param edgeGravity Gravity.LEFT, RIGHT, START or END. Expresses which
+     *            drawer to set the title for.
+     * @param title The title for the drawer.
+     */
+    public void setDrawerTitle(@EdgeGravity int edgeGravity, CharSequence title) {
+        final int absGravity = GravityCompat.getAbsoluteGravity(
+                edgeGravity, ViewCompat.getLayoutDirection(this));
+        if (absGravity == Gravity.LEFT) {
+            mTitleLeft = title;
+        } else if (absGravity == Gravity.RIGHT) {
+            mTitleRight = title;
+        }
+    }
+
+    /**
+     * Returns the title of the drawer with the given gravity.
+     *
+     * @param edgeGravity Gravity.LEFT, RIGHT, START or END. Expresses which
+     *            drawer to return the title for.
+     * @return The title of the drawer, or null if none set.
+     * @see #setDrawerTitle(int, CharSequence)
+     */
+    @Nullable
+    public CharSequence getDrawerTitle(@EdgeGravity int edgeGravity) {
+        final int absGravity = GravityCompat.getAbsoluteGravity(
+                edgeGravity, ViewCompat.getLayoutDirection(this));
+        if (absGravity == Gravity.LEFT) {
+            return mTitleLeft;
+        } else if (absGravity == Gravity.RIGHT) {
+            return mTitleRight;
+        }
+        return null;
+    }
+
+    /**
+     * Resolve the shared state of all drawers from the component ViewDragHelpers.
+     * Should be called whenever a ViewDragHelper's state changes.
+     */
+    void updateDrawerState(int forGravity, @State int activeState, View activeDrawer) {
+        final int leftState = mLeftDragger.getViewDragState();
+        final int rightState = mRightDragger.getViewDragState();
+
+        final int state;
+        if (leftState == STATE_DRAGGING || rightState == STATE_DRAGGING) {
+            state = STATE_DRAGGING;
+        } else if (leftState == STATE_SETTLING || rightState == STATE_SETTLING) {
+            state = STATE_SETTLING;
+        } else {
+            state = STATE_IDLE;
+        }
+
+        if (activeDrawer != null && activeState == STATE_IDLE) {
+            final LayoutParams lp = (LayoutParams) activeDrawer.getLayoutParams();
+            if (lp.onScreen == 0) {
+                dispatchOnDrawerClosed(activeDrawer);
+            } else if (lp.onScreen == 1) {
+                dispatchOnDrawerOpened(activeDrawer);
+            }
+        }
+
+        if (state != mDrawerState) {
+            mDrawerState = state;
+
+            if (mListeners != null) {
+                // Notify the listeners. Do that from the end of the list so that if a listener
+                // removes itself as the result of being called, it won't mess up with our iteration
+                int listenerCount = mListeners.size();
+                for (int i = listenerCount - 1; i >= 0; i--) {
+                    mListeners.get(i).onDrawerStateChanged(state);
+                }
+            }
+        }
+    }
+
+    void dispatchOnDrawerClosed(View drawerView) {
+        final LayoutParams lp = (LayoutParams) drawerView.getLayoutParams();
+        if ((lp.openState & LayoutParams.FLAG_IS_OPENED) == 1) {
+            lp.openState = 0;
+
+            if (mListeners != null) {
+                // Notify the listeners. Do that from the end of the list so that if a listener
+                // removes itself as the result of being called, it won't mess up with our iteration
+                int listenerCount = mListeners.size();
+                for (int i = listenerCount - 1; i >= 0; i--) {
+                    mListeners.get(i).onDrawerClosed(drawerView);
+                }
+            }
+
+            updateChildrenImportantForAccessibility(drawerView, false);
+
+            // Only send WINDOW_STATE_CHANGE if the host has window focus. This
+            // may change if support for multiple foreground windows (e.g. IME)
+            // improves.
+            if (hasWindowFocus()) {
+                final View rootView = getRootView();
+                if (rootView != null) {
+                    rootView.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
+                }
+            }
+        }
+    }
+
+    void dispatchOnDrawerOpened(View drawerView) {
+        final LayoutParams lp = (LayoutParams) drawerView.getLayoutParams();
+        if ((lp.openState & LayoutParams.FLAG_IS_OPENED) == 0) {
+            lp.openState = LayoutParams.FLAG_IS_OPENED;
+            if (mListeners != null) {
+                // Notify the listeners. Do that from the end of the list so that if a listener
+                // removes itself as the result of being called, it won't mess up with our iteration
+                int listenerCount = mListeners.size();
+                for (int i = listenerCount - 1; i >= 0; i--) {
+                    mListeners.get(i).onDrawerOpened(drawerView);
+                }
+            }
+
+            updateChildrenImportantForAccessibility(drawerView, true);
+
+            // Only send WINDOW_STATE_CHANGE if the host has window focus.
+            if (hasWindowFocus()) {
+                sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
+            }
+
+            drawerView.requestFocus();
+        }
+    }
+
+    private void updateChildrenImportantForAccessibility(View drawerView, boolean isDrawerOpen) {
+        final int childCount = getChildCount();
+        for (int i = 0; i < childCount; i++) {
+            final View child = getChildAt(i);
+            if (!isDrawerOpen && !isDrawerView(child)
+                    || isDrawerOpen && child == drawerView) {
+                // Drawer is closed and this is a content view or this is an
+                // open drawer view, so it should be visible.
+                ViewCompat.setImportantForAccessibility(child,
+                        ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_YES);
+            } else {
+                ViewCompat.setImportantForAccessibility(child,
+                        ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS);
+            }
+        }
+    }
+
+    void dispatchOnDrawerSlide(View drawerView, float slideOffset) {
+        if (mListeners != null) {
+            // Notify the listeners. Do that from the end of the list so that if a listener
+            // removes itself as the result of being called, it won't mess up with our iteration
+            int listenerCount = mListeners.size();
+            for (int i = listenerCount - 1; i >= 0; i--) {
+                mListeners.get(i).onDrawerSlide(drawerView, slideOffset);
+            }
+        }
+    }
+
+    void setDrawerViewOffset(View drawerView, float slideOffset) {
+        final LayoutParams lp = (LayoutParams) drawerView.getLayoutParams();
+        if (slideOffset == lp.onScreen) {
+            return;
+        }
+
+        lp.onScreen = slideOffset;
+        dispatchOnDrawerSlide(drawerView, slideOffset);
+    }
+
+    float getDrawerViewOffset(View drawerView) {
+        return ((LayoutParams) drawerView.getLayoutParams()).onScreen;
+    }
+
+    /**
+     * @return the absolute gravity of the child drawerView, resolved according
+     *         to the current layout direction
+     */
+    int getDrawerViewAbsoluteGravity(View drawerView) {
+        final int gravity = ((LayoutParams) drawerView.getLayoutParams()).gravity;
+        return GravityCompat.getAbsoluteGravity(gravity, ViewCompat.getLayoutDirection(this));
+    }
+
+    boolean checkDrawerViewAbsoluteGravity(View drawerView, int checkFor) {
+        final int absGravity = getDrawerViewAbsoluteGravity(drawerView);
+        return (absGravity & checkFor) == checkFor;
+    }
+
+    View findOpenDrawer() {
+        final int childCount = getChildCount();
+        for (int i = 0; i < childCount; i++) {
+            final View child = getChildAt(i);
+            final LayoutParams childLp = (LayoutParams) child.getLayoutParams();
+            if ((childLp.openState & LayoutParams.FLAG_IS_OPENED) == 1) {
+                return child;
+            }
+        }
+        return null;
+    }
+
+    void moveDrawerToOffset(View drawerView, float slideOffset) {
+        final float oldOffset = getDrawerViewOffset(drawerView);
+        final int width = drawerView.getWidth();
+        final int oldPos = (int) (width * oldOffset);
+        final int newPos = (int) (width * slideOffset);
+        final int dx = newPos - oldPos;
+
+        drawerView.offsetLeftAndRight(
+                checkDrawerViewAbsoluteGravity(drawerView, Gravity.LEFT) ? dx : -dx);
+        setDrawerViewOffset(drawerView, slideOffset);
+    }
+
+    /**
+     * @param gravity the gravity of the child to return. If specified as a
+     *            relative value, it will be resolved according to the current
+     *            layout direction.
+     * @return the drawer with the specified gravity
+     */
+    View findDrawerWithGravity(int gravity) {
+        final int absHorizGravity = GravityCompat.getAbsoluteGravity(
+                gravity, ViewCompat.getLayoutDirection(this)) & Gravity.HORIZONTAL_GRAVITY_MASK;
+        final int childCount = getChildCount();
+        for (int i = 0; i < childCount; i++) {
+            final View child = getChildAt(i);
+            final int childAbsGravity = getDrawerViewAbsoluteGravity(child);
+            if ((childAbsGravity & Gravity.HORIZONTAL_GRAVITY_MASK) == absHorizGravity) {
+                return child;
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Simple gravity to string - only supports LEFT and RIGHT for debugging output.
+     *
+     * @param gravity Absolute gravity value
+     * @return LEFT or RIGHT as appropriate, or a hex string
+     */
+    static String gravityToString(@EdgeGravity int gravity) {
+        if ((gravity & Gravity.LEFT) == Gravity.LEFT) {
+            return "LEFT";
+        }
+        if ((gravity & Gravity.RIGHT) == Gravity.RIGHT) {
+            return "RIGHT";
+        }
+        return Integer.toHexString(gravity);
+    }
+
+    @Override
+    protected void onDetachedFromWindow() {
+        super.onDetachedFromWindow();
+        mFirstLayout = true;
+    }
+
+    @Override
+    protected void onAttachedToWindow() {
+        super.onAttachedToWindow();
+        mFirstLayout = true;
+    }
+
+    @Override
+    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+        int widthMode = MeasureSpec.getMode(widthMeasureSpec);
+        int heightMode = MeasureSpec.getMode(heightMeasureSpec);
+        int widthSize = MeasureSpec.getSize(widthMeasureSpec);
+        int heightSize = MeasureSpec.getSize(heightMeasureSpec);
+
+        if (widthMode != MeasureSpec.EXACTLY || heightMode != MeasureSpec.EXACTLY) {
+            if (isInEditMode()) {
+                // Don't crash the layout editor. Consume all of the space if specified
+                // or pick a magic number from thin air otherwise.
+                // TODO Better communication with tools of this bogus state.
+                // It will crash on a real device.
+                if (widthMode == MeasureSpec.AT_MOST) {
+                    widthMode = MeasureSpec.EXACTLY;
+                } else if (widthMode == MeasureSpec.UNSPECIFIED) {
+                    widthMode = MeasureSpec.EXACTLY;
+                    widthSize = 300;
+                }
+                if (heightMode == MeasureSpec.AT_MOST) {
+                    heightMode = MeasureSpec.EXACTLY;
+                }
+                else if (heightMode == MeasureSpec.UNSPECIFIED) {
+                    heightMode = MeasureSpec.EXACTLY;
+                    heightSize = 300;
+                }
+            } else {
+                throw new IllegalArgumentException(
+                        "DrawerLayout must be measured with MeasureSpec.EXACTLY.");
+            }
+        }
+
+        setMeasuredDimension(widthSize, heightSize);
+
+        final boolean applyInsets = mLastInsets != null && ViewCompat.getFitsSystemWindows(this);
+        final int layoutDirection = ViewCompat.getLayoutDirection(this);
+
+        // Only one drawer is permitted along each vertical edge (left / right). These two booleans
+        // are tracking the presence of the edge drawers.
+        boolean hasDrawerOnLeftEdge = false;
+        boolean hasDrawerOnRightEdge = false;
+        final int childCount = getChildCount();
+        for (int i = 0; i < childCount; i++) {
+            final View child = getChildAt(i);
+
+            if (child.getVisibility() == GONE) {
+                continue;
+            }
+
+            final LayoutParams lp = (LayoutParams) child.getLayoutParams();
+
+            if (applyInsets) {
+                final int cgrav = GravityCompat.getAbsoluteGravity(lp.gravity, layoutDirection);
+                if (ViewCompat.getFitsSystemWindows(child)) {
+                    IMPL.dispatchChildInsets(child, mLastInsets, cgrav);
+                } else {
+                    IMPL.applyMarginInsets(lp, mLastInsets, cgrav);
+                }
+            }
+
+            if (isContentView(child)) {
+                // Content views get measured at exactly the layout's size.
+                final int contentWidthSpec = MeasureSpec.makeMeasureSpec(
+                        widthSize - lp.leftMargin - lp.rightMargin, MeasureSpec.EXACTLY);
+                final int contentHeightSpec = MeasureSpec.makeMeasureSpec(
+                        heightSize - lp.topMargin - lp.bottomMargin, MeasureSpec.EXACTLY);
+                child.measure(contentWidthSpec, contentHeightSpec);
+            } else if (isDrawerView(child)) {
+                if (SET_DRAWER_SHADOW_FROM_ELEVATION) {
+                    if (ViewCompat.getElevation(child) != mDrawerElevation) {
+                        ViewCompat.setElevation(child, mDrawerElevation);
+                    }
+                }
+                final @EdgeGravity int childGravity =
+                        getDrawerViewAbsoluteGravity(child) & Gravity.HORIZONTAL_GRAVITY_MASK;
+                // Note that the isDrawerView check guarantees that childGravity here is either
+                // LEFT or RIGHT
+                boolean isLeftEdgeDrawer = (childGravity == Gravity.LEFT);
+                if ((isLeftEdgeDrawer && hasDrawerOnLeftEdge) ||
+                        (!isLeftEdgeDrawer && hasDrawerOnRightEdge)) {
+                    throw new IllegalStateException("Child drawer has absolute gravity " +
+                            gravityToString(childGravity) + " but this " + TAG + " already has a " +
+                            "drawer view along that edge");
+                }
+                if (isLeftEdgeDrawer) {
+                    hasDrawerOnLeftEdge = true;
+                } else {
+                    hasDrawerOnRightEdge = true;
+                }
+                final int drawerWidthSpec = getChildMeasureSpec(widthMeasureSpec,
+                        mMinDrawerMargin + lp.leftMargin + lp.rightMargin,
+                        lp.width);
+                final int drawerHeightSpec = getChildMeasureSpec(heightMeasureSpec,
+                        lp.topMargin + lp.bottomMargin,
+                        lp.height);
+                child.measure(drawerWidthSpec, drawerHeightSpec);
+            } else {
+                throw new IllegalStateException("Child " + child + " at index " + i +
+                        " does not have a valid layout_gravity - must be Gravity.LEFT, " +
+                        "Gravity.RIGHT or Gravity.NO_GRAVITY");
+            }
+        }
+    }
+
+    private void resolveShadowDrawables() {
+        if (SET_DRAWER_SHADOW_FROM_ELEVATION) {
+            return;
+        }
+        mShadowLeftResolved = resolveLeftShadow();
+        mShadowRightResolved = resolveRightShadow();
+    }
+
+    private Drawable resolveLeftShadow() {
+        int layoutDirection = ViewCompat.getLayoutDirection(this);
+        // Prefer shadows defined with start/end gravity over left and right.
+        if (layoutDirection == ViewCompat.LAYOUT_DIRECTION_LTR) {
+            if (mShadowStart != null) {
+                // Correct drawable layout direction, if needed.
+                mirror(mShadowStart, layoutDirection);
+                return mShadowStart;
+            }
+        } else {
+            if (mShadowEnd != null) {
+                // Correct drawable layout direction, if needed.
+                mirror(mShadowEnd, layoutDirection);
+                return mShadowEnd;
+            }
+        }
+        return mShadowLeft;
+    }
+
+    private Drawable resolveRightShadow() {
+        int layoutDirection = ViewCompat.getLayoutDirection(this);
+        if (layoutDirection == ViewCompat.LAYOUT_DIRECTION_LTR) {
+            if (mShadowEnd != null) {
+                // Correct drawable layout direction, if needed.
+                mirror(mShadowEnd, layoutDirection);
+                return mShadowEnd;
+            }
+        } else {
+            if (mShadowStart != null) {
+                // Correct drawable layout direction, if needed.
+                mirror(mShadowStart, layoutDirection);
+                return mShadowStart;
+            }
+        }
+        return mShadowRight;
+    }
+
+    /**
+     * Change the layout direction of the given drawable.
+     * Return true if auto-mirror is supported and drawable's layout direction can be changed.
+     * Otherwise, return false.
+     */
+    private boolean mirror(Drawable drawable, int layoutDirection) {
+        if (drawable == null || !DrawableCompat.isAutoMirrored(drawable)) {
+            return false;
+        }
+
+        DrawableCompat.setLayoutDirection(drawable, layoutDirection);
+        return true;
+    }
+
+    @Override
+    protected void onLayout(boolean changed, int l, int t, int r, int b) {
+        mInLayout = true;
+        final int width = r - l;
+        final int childCount = getChildCount();
+        for (int i = 0; i < childCount; i++) {
+            final View child = getChildAt(i);
+
+            if (child.getVisibility() == GONE) {
+                continue;
+            }
+
+            final LayoutParams lp = (LayoutParams) child.getLayoutParams();
+
+            if (isContentView(child)) {
+                child.layout(lp.leftMargin, lp.topMargin,
+                        lp.leftMargin + child.getMeasuredWidth(),
+                        lp.topMargin + child.getMeasuredHeight());
+            } else { // Drawer, if it wasn't onMeasure would have thrown an exception.
+                final int childWidth = child.getMeasuredWidth();
+                final int childHeight = child.getMeasuredHeight();
+                int childLeft;
+
+                final float newOffset;
+                if (checkDrawerViewAbsoluteGravity(child, Gravity.LEFT)) {
+                    childLeft = -childWidth + (int) (childWidth * lp.onScreen);
+                    newOffset = (float) (childWidth + childLeft) / childWidth;
+                } else { // Right; onMeasure checked for us.
+                    childLeft = width - (int) (childWidth * lp.onScreen);
+                    newOffset = (float) (width - childLeft) / childWidth;
+                }
+
+                final boolean changeOffset = newOffset != lp.onScreen;
+
+                final int vgrav = lp.gravity & Gravity.VERTICAL_GRAVITY_MASK;
+
+                switch (vgrav) {
+                    default:
+                    case Gravity.TOP: {
+                        child.layout(childLeft, lp.topMargin, childLeft + childWidth,
+                                lp.topMargin + childHeight);
+                        break;
+                    }
+
+                    case Gravity.BOTTOM: {
+                        final int height = b - t;
+                        child.layout(childLeft,
+                                height - lp.bottomMargin - child.getMeasuredHeight(),
+                                childLeft + childWidth,
+                                height - lp.bottomMargin);
+                        break;
+                    }
+
+                    case Gravity.CENTER_VERTICAL: {
+                        final int height = b - t;
+                        int childTop = (height - childHeight) / 2;
+
+                        // Offset for margins. If things don't fit right because of
+                        // bad measurement before, oh well.
+                        if (childTop < lp.topMargin) {
+                            childTop = lp.topMargin;
+                        } else if (childTop + childHeight > height - lp.bottomMargin) {
+                            childTop = height - lp.bottomMargin - childHeight;
+                        }
+                        child.layout(childLeft, childTop, childLeft + childWidth,
+                                childTop + childHeight);
+                        break;
+                    }
+                }
+
+                if (changeOffset) {
+                    setDrawerViewOffset(child, newOffset);
+                }
+
+                final int newVisibility = lp.onScreen > 0 ? VISIBLE : INVISIBLE;
+                if (child.getVisibility() != newVisibility) {
+                    child.setVisibility(newVisibility);
+                }
+            }
+        }
+        mInLayout = false;
+        mFirstLayout = false;
+    }
+
+    @Override
+    public void requestLayout() {
+        if (!mInLayout) {
+            super.requestLayout();
+        }
+    }
+
+    @Override
+    public void computeScroll() {
+        final int childCount = getChildCount();
+        float scrimOpacity = 0;
+        for (int i = 0; i < childCount; i++) {
+            final float onscreen = ((LayoutParams) getChildAt(i).getLayoutParams()).onScreen;
+            scrimOpacity = Math.max(scrimOpacity, onscreen);
+        }
+        mScrimOpacity = scrimOpacity;
+
+        // "|" used on purpose; both need to run.
+        if (mLeftDragger.continueSettling(true) | mRightDragger.continueSettling(true)) {
+            ViewCompat.postInvalidateOnAnimation(this);
+        }
+    }
+
+    private static boolean hasOpaqueBackground(View v) {
+        final Drawable bg = v.getBackground();
+        if (bg != null) {
+            return bg.getOpacity() == PixelFormat.OPAQUE;
+        }
+        return false;
+    }
+
+    /**
+     * Set a drawable to draw in the insets area for the status bar.
+     * Note that this will only be activated if this DrawerLayout fitsSystemWindows.
+     *
+     * @param bg Background drawable to draw behind the status bar
+     */
+    public void setStatusBarBackground(Drawable bg) {
+        mStatusBarBackground = bg;
+        invalidate();
+    }
+
+    /**
+     * Gets the drawable used to draw in the insets area for the status bar.
+     *
+     * @return The status bar background drawable, or null if none set
+     */
+    public Drawable getStatusBarBackgroundDrawable() {
+        return mStatusBarBackground;
+    }
+
+    /**
+     * Set a drawable to draw in the insets area for the status bar.
+     * Note that this will only be activated if this DrawerLayout fitsSystemWindows.
+     *
+     * @param resId Resource id of a background drawable to draw behind the status bar
+     */
+    public void setStatusBarBackground(int resId) {
+        mStatusBarBackground = resId != 0 ? ContextCompat.getDrawable(getContext(), resId) : null;
+        invalidate();
+    }
+
+    /**
+     * Set a drawable to draw in the insets area for the status bar.
+     * Note that this will only be activated if this DrawerLayout fitsSystemWindows.
+     *
+     * @param color Color to use as a background drawable to draw behind the status bar
+     *              in 0xAARRGGBB format.
+     */
+    public void setStatusBarBackgroundColor(@ColorInt int color) {
+        mStatusBarBackground = new ColorDrawable(color);
+        invalidate();
+    }
+
+    public void onRtlPropertiesChanged(int layoutDirection) {
+        resolveShadowDrawables();
+    }
+
+    @Override
+    public void onDraw(Canvas c) {
+        super.onDraw(c);
+        if (mDrawStatusBarBackground && mStatusBarBackground != null) {
+            final int inset = IMPL.getTopInset(mLastInsets);
+            if (inset > 0) {
+                mStatusBarBackground.setBounds(0, 0, getWidth(), inset);
+                mStatusBarBackground.draw(c);
+            }
+        }
+    }
+
+    @Override
+    protected boolean drawChild(Canvas canvas, View child, long drawingTime) {
+        final int height = getHeight();
+        final boolean drawingContent = isContentView(child);
+        int clipLeft = 0, clipRight = getWidth();
+
+        final int restoreCount = canvas.save();
+        if (drawingContent) {
+            final int childCount = getChildCount();
+            for (int i = 0; i < childCount; i++) {
+                final View v = getChildAt(i);
+                if (v == child || v.getVisibility() != VISIBLE ||
+                        !hasOpaqueBackground(v) || !isDrawerView(v) ||
+                        v.getHeight() < height) {
+                    continue;
+                }
+
+                if (checkDrawerViewAbsoluteGravity(v, Gravity.LEFT)) {
+                    final int vright = v.getRight();
+                    if (vright > clipLeft) clipLeft = vright;
+                } else {
+                    final int vleft = v.getLeft();
+                    if (vleft < clipRight) clipRight = vleft;
+                }
+            }
+            canvas.clipRect(clipLeft, 0, clipRight, getHeight());
+        }
+        final boolean result = super.drawChild(canvas, child, drawingTime);
+        canvas.restoreToCount(restoreCount);
+
+        if (mScrimOpacity > 0 && drawingContent) {
+            final int baseAlpha = (mScrimColor & 0xff000000) >>> 24;
+            final int imag = (int) (baseAlpha * mScrimOpacity);
+            final int color = imag << 24 | (mScrimColor & 0xffffff);
+            mScrimPaint.setColor(color);
+
+            canvas.drawRect(clipLeft, 0, clipRight, getHeight(), mScrimPaint);
+        } else if (mShadowLeftResolved != null
+                &&  checkDrawerViewAbsoluteGravity(child, Gravity.LEFT)) {
+            final int shadowWidth = mShadowLeftResolved.getIntrinsicWidth();
+            final int childRight = child.getRight();
+            final int drawerPeekDistance = mLeftDragger.getEdgeSize();
+            final float alpha =
+                    Math.max(0, Math.min((float) childRight / drawerPeekDistance, 1.f));
+            mShadowLeftResolved.setBounds(childRight, child.getTop(),
+                    childRight + shadowWidth, child.getBottom());
+            mShadowLeftResolved.setAlpha((int) (0xff * alpha));
+            mShadowLeftResolved.draw(canvas);
+        } else if (mShadowRightResolved != null
+                &&  checkDrawerViewAbsoluteGravity(child, Gravity.RIGHT)) {
+            final int shadowWidth = mShadowRightResolved.getIntrinsicWidth();
+            final int childLeft = child.getLeft();
+            final int showing = getWidth() - childLeft;
+            final int drawerPeekDistance = mRightDragger.getEdgeSize();
+            final float alpha =
+                    Math.max(0, Math.min((float) showing / drawerPeekDistance, 1.f));
+            mShadowRightResolved.setBounds(childLeft - shadowWidth, child.getTop(),
+                    childLeft, child.getBottom());
+            mShadowRightResolved.setAlpha((int) (0xff * alpha));
+            mShadowRightResolved.draw(canvas);
+        }
+        return result;
+    }
+
+    boolean isContentView(View child) {
+        return ((LayoutParams) child.getLayoutParams()).gravity == Gravity.NO_GRAVITY;
+    }
+
+    boolean isDrawerView(View child) {
+        final int gravity = ((LayoutParams) child.getLayoutParams()).gravity;
+        final int absGravity = GravityCompat.getAbsoluteGravity(gravity,
+                ViewCompat.getLayoutDirection(child));
+        if ((absGravity & Gravity.LEFT) != 0) {
+            // This child is a left-edge drawer
+            return true;
+        }
+        if ((absGravity & Gravity.RIGHT) != 0) {
+            // This child is a right-edge drawer
+            return true;
+        }
+        return false;
+    }
+
+    @Override
+    public boolean onInterceptTouchEvent(MotionEvent ev) {
+        final int action = MotionEventCompat.getActionMasked(ev);
+
+        // "|" used deliberately here; both methods should be invoked.
+        final boolean interceptForDrag = mLeftDragger.shouldInterceptTouchEvent(ev) |
+                mRightDragger.shouldInterceptTouchEvent(ev);
+
+        boolean interceptForTap = false;
+
+        switch (action) {
+            case MotionEvent.ACTION_DOWN: {
+                final float x = ev.getX();
+                final float y = ev.getY();
+                mInitialMotionX = x;
+                mInitialMotionY = y;
+                if (mScrimOpacity > 0) {
+                    final View child = mLeftDragger.findTopChildUnder((int) x, (int) y);
+                    if (child != null && isContentView(child)) {
+                        interceptForTap = true;
+                    }
+                }
+                mDisallowInterceptRequested = false;
+                mChildrenCanceledTouch = false;
+                break;
+            }
+
+            case MotionEvent.ACTION_MOVE: {
+                // If we cross the touch slop, don't perform the delayed peek for an edge touch.
+                if (mLeftDragger.checkTouchSlop(ViewDragHelper.DIRECTION_ALL)) {
+                    mLeftCallback.removeCallbacks();
+                    mRightCallback.removeCallbacks();
+                }
+                break;
+            }
+
+            case MotionEvent.ACTION_CANCEL:
+            case MotionEvent.ACTION_UP: {
+                closeDrawers(true);
+                mDisallowInterceptRequested = false;
+                mChildrenCanceledTouch = false;
+            }
+        }
+
+        return interceptForDrag || interceptForTap || hasPeekingDrawer() || mChildrenCanceledTouch;
+    }
+
+    @Override
+    public boolean onTouchEvent(MotionEvent ev) {
+        mLeftDragger.processTouchEvent(ev);
+        mRightDragger.processTouchEvent(ev);
+
+        final int action = ev.getAction();
+        boolean wantTouchEvents = true;
+
+        switch (action & MotionEventCompat.ACTION_MASK) {
+            case MotionEvent.ACTION_DOWN: {
+                final float x = ev.getX();
+                final float y = ev.getY();
+                mInitialMotionX = x;
+                mInitialMotionY = y;
+                mDisallowInterceptRequested = false;
+                mChildrenCanceledTouch = false;
+                break;
+            }
+
+            case MotionEvent.ACTION_UP: {
+                final float x = ev.getX();
+                final float y = ev.getY();
+                boolean peekingOnly = true;
+                final View touchedView = mLeftDragger.findTopChildUnder((int) x, (int) y);
+                if (touchedView != null && isContentView(touchedView)) {
+                    final float dx = x - mInitialMotionX;
+                    final float dy = y - mInitialMotionY;
+                    final int slop = mLeftDragger.getTouchSlop();
+                    if (dx * dx + dy * dy < slop * slop) {
+                        // Taps close a dimmed open drawer but only if it isn't locked open.
+                        final View openDrawer = findOpenDrawer();
+                        if (openDrawer != null) {
+                            peekingOnly = getDrawerLockMode(openDrawer) == LOCK_MODE_LOCKED_OPEN;
+                        }
+                    }
+                }
+                closeDrawers(peekingOnly);
+                mDisallowInterceptRequested = false;
+                break;
+            }
+
+            case MotionEvent.ACTION_CANCEL: {
+                closeDrawers(true);
+                mDisallowInterceptRequested = false;
+                mChildrenCanceledTouch = false;
+                break;
+            }
+        }
+
+        return wantTouchEvents;
+    }
+
+    @Override
+    public void requestDisallowInterceptTouchEvent(boolean disallowIntercept) {
+        if (CHILDREN_DISALLOW_INTERCEPT ||
+                (!mLeftDragger.isEdgeTouched(ViewDragHelper.EDGE_LEFT) &&
+                !mRightDragger.isEdgeTouched(ViewDragHelper.EDGE_RIGHT))) {
+            // If we have an edge touch we want to skip this and track it for later instead.
+            super.requestDisallowInterceptTouchEvent(disallowIntercept);
+        }
+        mDisallowInterceptRequested = disallowIntercept;
+        if (disallowIntercept) {
+            closeDrawers(true);
+        }
+    }
+
+    /**
+     * Close all currently open drawer views by animating them out of view.
+     */
+    public void closeDrawers() {
+        closeDrawers(false);
+    }
+
+    void closeDrawers(boolean peekingOnly) {
+        boolean needsInvalidate = false;
+        final int childCount = getChildCount();
+        for (int i = 0; i < childCount; i++) {
+            final View child = getChildAt(i);
+            final LayoutParams lp = (LayoutParams) child.getLayoutParams();
+
+            if (!isDrawerView(child) || (peekingOnly && !lp.isPeeking)) {
+                continue;
+            }
+
+            final int childWidth = child.getWidth();
+
+            if (checkDrawerViewAbsoluteGravity(child, Gravity.LEFT)) {
+                needsInvalidate |= mLeftDragger.smoothSlideViewTo(child,
+                        -childWidth, child.getTop());
+            } else {
+                needsInvalidate |= mRightDragger.smoothSlideViewTo(child,
+                        getWidth(), child.getTop());
+            }
+
+            lp.isPeeking = false;
+        }
+
+        mLeftCallback.removeCallbacks();
+        mRightCallback.removeCallbacks();
+
+        if (needsInvalidate) {
+            invalidate();
+        }
+    }
+
+    /**
+     * Open the specified drawer view by animating it into view.
+     *
+     * @param drawerView Drawer view to open
+     */
+    public void openDrawer(View drawerView) {
+        openDrawer(drawerView, true);
+    }
+
+    /**
+     * Open the specified drawer view.
+     *
+     * @param drawerView Drawer view to open
+     * @param animate Whether opening of the drawer should be animated.
+     */
+    public void openDrawer(View drawerView, boolean animate) {
+        if (!isDrawerView(drawerView)) {
+            throw new IllegalArgumentException("View " + drawerView + " is not a sliding drawer");
+        }
+
+        final LayoutParams lp = (LayoutParams) drawerView.getLayoutParams();
+        if (mFirstLayout) {
+            lp.onScreen = 1.f;
+            lp.openState = LayoutParams.FLAG_IS_OPENED;
+
+            updateChildrenImportantForAccessibility(drawerView, true);
+        } else if (animate) {
+            lp.openState |= LayoutParams.FLAG_IS_OPENING;
+
+            if (checkDrawerViewAbsoluteGravity(drawerView, Gravity.LEFT)) {
+                mLeftDragger.smoothSlideViewTo(drawerView, 0, drawerView.getTop());
+            } else {
+                mRightDragger.smoothSlideViewTo(drawerView, getWidth() - drawerView.getWidth(),
+                        drawerView.getTop());
+            }
+        } else {
+            moveDrawerToOffset(drawerView, 1.f);
+            updateDrawerState(lp.gravity, STATE_IDLE, drawerView);
+            drawerView.setVisibility(VISIBLE);
+        }
+        invalidate();
+    }
+
+    /**
+     * Open the specified drawer by animating it out of view.
+     *
+     * @param gravity Gravity.LEFT to move the left drawer or Gravity.RIGHT for the right.
+     *                GravityCompat.START or GravityCompat.END may also be used.
+     */
+    public void openDrawer(@EdgeGravity int gravity) {
+        openDrawer(gravity, true);
+    }
+
+    /**
+     * Open the specified drawer.
+     *
+     * @param gravity Gravity.LEFT to move the left drawer or Gravity.RIGHT for the right.
+     *                GravityCompat.START or GravityCompat.END may also be used.
+     * @param animate Whether opening of the drawer should be animated.
+     */
+    public void openDrawer(@EdgeGravity int gravity, boolean animate) {
+        final View drawerView = findDrawerWithGravity(gravity);
+        if (drawerView == null) {
+            throw new IllegalArgumentException("No drawer view found with gravity " +
+                    gravityToString(gravity));
+        }
+        openDrawer(drawerView, animate);
+    }
+
+    /**
+     * Close the specified drawer view by animating it into view.
+     *
+     * @param drawerView Drawer view to close
+     */
+    public void closeDrawer(View drawerView) {
+        closeDrawer(drawerView, true);
+    }
+
+    /**
+     * Close the specified drawer view.
+     *
+     * @param drawerView Drawer view to close
+     * @param animate Whether closing of the drawer should be animated.
+     */
+    public void closeDrawer(View drawerView, boolean animate) {
+        if (!isDrawerView(drawerView)) {
+            throw new IllegalArgumentException("View " + drawerView + " is not a sliding drawer");
+        }
+
+        final LayoutParams lp = (LayoutParams) drawerView.getLayoutParams();
+        if (mFirstLayout) {
+            lp.onScreen = 0.f;
+            lp.openState = 0;
+        } else if (animate) {
+            lp.openState |= LayoutParams.FLAG_IS_CLOSING;
+
+            if (checkDrawerViewAbsoluteGravity(drawerView, Gravity.LEFT)) {
+                mLeftDragger.smoothSlideViewTo(drawerView, -drawerView.getWidth(),
+                        drawerView.getTop());
+            } else {
+                mRightDragger.smoothSlideViewTo(drawerView, getWidth(), drawerView.getTop());
+            }
+        } else {
+            moveDrawerToOffset(drawerView, 0.f);
+            updateDrawerState(lp.gravity, STATE_IDLE, drawerView);
+            drawerView.setVisibility(INVISIBLE);
+        }
+        invalidate();
+    }
+
+    /**
+     * Close the specified drawer by animating it out of view.
+     *
+     * @param gravity Gravity.LEFT to move the left drawer or Gravity.RIGHT for the right.
+     *                GravityCompat.START or GravityCompat.END may also be used.
+     */
+    public void closeDrawer(@EdgeGravity int gravity) {
+        closeDrawer(gravity, true);
+    }
+
+    /**
+     * Close the specified drawer.
+     *
+     * @param gravity Gravity.LEFT to move the left drawer or Gravity.RIGHT for the right.
+     *                GravityCompat.START or GravityCompat.END may also be used.
+     * @param animate Whether closing of the drawer should be animated.
+     */
+    public void closeDrawer(@EdgeGravity int gravity, boolean animate) {
+        final View drawerView = findDrawerWithGravity(gravity);
+        if (drawerView == null) {
+            throw new IllegalArgumentException("No drawer view found with gravity " +
+                    gravityToString(gravity));
+        }
+        closeDrawer(drawerView, animate);
+    }
+
+    /**
+     * Check if the given drawer view is currently in an open state.
+     * To be considered "open" the drawer must have settled into its fully
+     * visible state. To check for partial visibility use
+     * {@link #isDrawerVisible(android.view.View)}.
+     *
+     * @param drawer Drawer view to check
+     * @return true if the given drawer view is in an open state
+     * @see #isDrawerVisible(android.view.View)
+     */
+    public boolean isDrawerOpen(View drawer) {
+        if (!isDrawerView(drawer)) {
+            throw new IllegalArgumentException("View " + drawer + " is not a drawer");
+        }
+        LayoutParams drawerLp = (LayoutParams) drawer.getLayoutParams();
+        return (drawerLp.openState & LayoutParams.FLAG_IS_OPENED) == 1;
+    }
+
+    /**
+     * Check if the given drawer view is currently in an open state.
+     * To be considered "open" the drawer must have settled into its fully
+     * visible state. If there is no drawer with the given gravity this method
+     * will return false.
+     *
+     * @param drawerGravity Gravity of the drawer to check
+     * @return true if the given drawer view is in an open state
+     */
+    public boolean isDrawerOpen(@EdgeGravity int drawerGravity) {
+        final View drawerView = findDrawerWithGravity(drawerGravity);
+        if (drawerView != null) {
+            return isDrawerOpen(drawerView);
+        }
+        return false;
+    }
+
+    /**
+     * Check if a given drawer view is currently visible on-screen. The drawer
+     * may be only peeking onto the screen, fully extended, or anywhere inbetween.
+     *
+     * @param drawer Drawer view to check
+     * @return true if the given drawer is visible on-screen
+     * @see #isDrawerOpen(android.view.View)
+     */
+    public boolean isDrawerVisible(View drawer) {
+        if (!isDrawerView(drawer)) {
+            throw new IllegalArgumentException("View " + drawer + " is not a drawer");
+        }
+        return ((LayoutParams) drawer.getLayoutParams()).onScreen > 0;
+    }
+
+    /**
+     * Check if a given drawer view is currently visible on-screen. The drawer
+     * may be only peeking onto the screen, fully extended, or anywhere in between.
+     * If there is no drawer with the given gravity this method will return false.
+     *
+     * @param drawerGravity Gravity of the drawer to check
+     * @return true if the given drawer is visible on-screen
+     */
+    public boolean isDrawerVisible(@EdgeGravity int drawerGravity) {
+        final View drawerView = findDrawerWithGravity(drawerGravity);
+        if (drawerView != null) {
+            return isDrawerVisible(drawerView);
+        }
+        return false;
+    }
+
+    private boolean hasPeekingDrawer() {
+        final int childCount = getChildCount();
+        for (int i = 0; i < childCount; i++) {
+            final LayoutParams lp = (LayoutParams) getChildAt(i).getLayoutParams();
+            if (lp.isPeeking) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    @Override
+    protected ViewGroup.LayoutParams generateDefaultLayoutParams() {
+        return new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
+    }
+
+    @Override
+    protected ViewGroup.LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) {
+        return p instanceof LayoutParams
+                ? new LayoutParams((LayoutParams) p)
+                : p instanceof ViewGroup.MarginLayoutParams
+                ? new LayoutParams((MarginLayoutParams) p)
+                : new LayoutParams(p);
+    }
+
+    @Override
+    protected boolean checkLayoutParams(ViewGroup.LayoutParams p) {
+        return p instanceof LayoutParams && super.checkLayoutParams(p);
+    }
+
+    @Override
+    public ViewGroup.LayoutParams generateLayoutParams(AttributeSet attrs) {
+        return new LayoutParams(getContext(), attrs);
+    }
+
+    @Override
+    public void addFocusables(ArrayList<View> views, int direction, int focusableMode) {
+        if (getDescendantFocusability() == FOCUS_BLOCK_DESCENDANTS) {
+            return;
+        }
+
+        // Only the views in the open drawers are focusables. Add normal child views when
+        // no drawers are opened.
+        final int childCount = getChildCount();
+        boolean isDrawerOpen = false;
+        for (int i = 0; i < childCount; i++) {
+            final View child = getChildAt(i);
+            if (isDrawerView(child)) {
+                if (isDrawerOpen(child)) {
+                    isDrawerOpen = true;
+                    child.addFocusables(views, direction, focusableMode);
+                }
+            } else {
+                mNonDrawerViews.add(child);
+            }
+        }
+
+        if (!isDrawerOpen) {
+            final int nonDrawerViewsCount = mNonDrawerViews.size();
+            for (int i = 0; i < nonDrawerViewsCount; ++i) {
+                final View child = mNonDrawerViews.get(i);
+                if (child.getVisibility() == View.VISIBLE) {
+                    child.addFocusables(views, direction, focusableMode);
+                }
+            }
+        }
+
+        mNonDrawerViews.clear();
+    }
+
+    private boolean hasVisibleDrawer() {
+        return findVisibleDrawer() != null;
+    }
+
+    private View findVisibleDrawer() {
+        final int childCount = getChildCount();
+        for (int i = 0; i < childCount; i++) {
+            final View child = getChildAt(i);
+            if (isDrawerView(child) && isDrawerVisible(child)) {
+                return child;
+            }
+        }
+        return null;
+    }
+
+    void cancelChildViewTouch() {
+        // Cancel child touches
+        if (!mChildrenCanceledTouch) {
+            final long now = SystemClock.uptimeMillis();
+            final MotionEvent cancelEvent = MotionEvent.obtain(now, now,
+                    MotionEvent.ACTION_CANCEL, 0.0f, 0.0f, 0);
+            final int childCount = getChildCount();
+            for (int i = 0; i < childCount; i++) {
+                getChildAt(i).dispatchTouchEvent(cancelEvent);
+            }
+            cancelEvent.recycle();
+            mChildrenCanceledTouch = true;
+        }
+    }
+
+    @Override
+    public boolean onKeyDown(int keyCode, KeyEvent event) {
+        if (keyCode == KeyEvent.KEYCODE_BACK && hasVisibleDrawer()) {
+            event.startTracking();
+            return true;
+        }
+        return super.onKeyDown(keyCode, event);
+    }
+
+    @Override
+    public boolean onKeyUp(int keyCode, KeyEvent event) {
+        if (keyCode == KeyEvent.KEYCODE_BACK) {
+            final View visibleDrawer = findVisibleDrawer();
+            if (visibleDrawer != null && getDrawerLockMode(visibleDrawer) == LOCK_MODE_UNLOCKED) {
+                closeDrawers();
+            }
+            return visibleDrawer != null;
+        }
+        return super.onKeyUp(keyCode, event);
+    }
+
+    @Override
+    protected void onRestoreInstanceState(Parcelable state) {
+        if (!(state instanceof SavedState)) {
+            super.onRestoreInstanceState(state);
+            return;
+        }
+
+        final SavedState ss = (SavedState) state;
+        super.onRestoreInstanceState(ss.getSuperState());
+
+        if (ss.openDrawerGravity != Gravity.NO_GRAVITY) {
+            final View toOpen = findDrawerWithGravity(ss.openDrawerGravity);
+            if (toOpen != null) {
+                openDrawer(toOpen);
+            }
+        }
+
+        if (ss.lockModeLeft != LOCK_MODE_UNDEFINED) {
+            setDrawerLockMode(ss.lockModeLeft, Gravity.LEFT);
+        }
+        if (ss.lockModeRight != LOCK_MODE_UNDEFINED) {
+            setDrawerLockMode(ss.lockModeRight, Gravity.RIGHT);
+        }
+        if (ss.lockModeStart != LOCK_MODE_UNDEFINED) {
+            setDrawerLockMode(ss.lockModeStart, GravityCompat.START);
+        }
+        if (ss.lockModeEnd != LOCK_MODE_UNDEFINED) {
+            setDrawerLockMode(ss.lockModeEnd, GravityCompat.END);
+        }
+    }
+
+    @Override
+    protected Parcelable onSaveInstanceState() {
+        final Parcelable superState = super.onSaveInstanceState();
+        final SavedState ss = new SavedState(superState);
+
+        final int childCount = getChildCount();
+        for (int i = 0; i < childCount; i++) {
+            final View child = getChildAt(i);
+            LayoutParams lp = (LayoutParams) child.getLayoutParams();
+            // Is the current child fully opened (that is, not closing)?
+            boolean isOpenedAndNotClosing = (lp.openState == LayoutParams.FLAG_IS_OPENED);
+            // Is the current child opening?
+            boolean isClosedAndOpening = (lp.openState == LayoutParams.FLAG_IS_OPENING);
+            if (isOpenedAndNotClosing || isClosedAndOpening) {
+                // If one of the conditions above holds, save the child's gravity
+                // so that we open that child during state restore.
+                ss.openDrawerGravity = lp.gravity;
+                break;
+            }
+        }
+
+        ss.lockModeLeft = mLockModeLeft;
+        ss.lockModeRight = mLockModeRight;
+        ss.lockModeStart = mLockModeStart;
+        ss.lockModeEnd = mLockModeEnd;
+
+        return ss;
+    }
+
+    @Override
+    public void addView(View child, int index, ViewGroup.LayoutParams params) {
+        super.addView(child, index, params);
+
+        final View openDrawer = findOpenDrawer();
+        if (openDrawer != null || isDrawerView(child)) {
+            // A drawer is already open or the new view is a drawer, so the
+            // new view should start out hidden.
+            ViewCompat.setImportantForAccessibility(child,
+                    ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS);
+        } else {
+            // Otherwise this is a content view and no drawer is open, so the
+            // new view should start out visible.
+            ViewCompat.setImportantForAccessibility(child,
+                    ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_YES);
+        }
+
+        // We only need a delegate here if the framework doesn't understand
+        // NO_HIDE_DESCENDANTS importance.
+        if (!CAN_HIDE_DESCENDANTS) {
+            ViewCompat.setAccessibilityDelegate(child, mChildAccessibilityDelegate);
+        }
+    }
+
+    private static boolean includeChildForAccessibility(View child) {
+        // If the child is not important for accessibility we make
+        // sure this hides the entire subtree rooted at it as the
+        // IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDATS is not
+        // supported on older platforms but we want to hide the entire
+        // content and not opened drawers if a drawer is opened.
+        return ViewCompat.getImportantForAccessibility(child)
+                != ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS
+                    && ViewCompat.getImportantForAccessibility(child)
+                != ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_NO;
+    }
+
+    /**
+     * State persisted across instances
+     */
+    protected static class SavedState extends AbsSavedState {
+        int openDrawerGravity = Gravity.NO_GRAVITY;
+        @LockMode int lockModeLeft;
+        @LockMode int lockModeRight;
+        @LockMode int lockModeStart;
+        @LockMode int lockModeEnd;
+
+        public SavedState(Parcel in, ClassLoader loader) {
+            super(in, loader);
+            openDrawerGravity = in.readInt();
+            lockModeLeft = in.readInt();
+            lockModeRight = in.readInt();
+            lockModeStart = in.readInt();
+            lockModeEnd = in.readInt();
+        }
+
+        public SavedState(Parcelable superState) {
+            super(superState);
+        }
+
+        @Override
+        public void writeToParcel(Parcel dest, int flags) {
+            super.writeToParcel(dest, flags);
+            dest.writeInt(openDrawerGravity);
+            dest.writeInt(lockModeLeft);
+            dest.writeInt(lockModeRight);
+            dest.writeInt(lockModeStart);
+            dest.writeInt(lockModeEnd);
+        }
+
+        public static final Creator<SavedState> CREATOR = ParcelableCompat.newCreator(
+                new ParcelableCompatCreatorCallbacks<SavedState>() {
+                    @Override
+                    public SavedState createFromParcel(Parcel in, ClassLoader loader) {
+                        return new SavedState(in, loader);
+                    }
+
+                    @Override
+                    public SavedState[] newArray(int size) {
+                        return new SavedState[size];
+                    }
+                });
+    }
+
+    private class ViewDragCallback extends ViewDragHelper.Callback {
+        private final int mAbsGravity;
+        private ViewDragHelper mDragger;
+
+        private final Runnable mPeekRunnable = new Runnable() {
+            @Override public void run() {
+                peekDrawer();
+            }
+        };
+
+        public ViewDragCallback(int gravity) {
+            mAbsGravity = gravity;
+        }
+
+        public void setDragger(ViewDragHelper dragger) {
+            mDragger = dragger;
+        }
+
+        public void removeCallbacks() {
+            DrawerLayout.this.removeCallbacks(mPeekRunnable);
+        }
+
+        @Override
+        public boolean tryCaptureView(View child, int pointerId) {
+            // Only capture views where the gravity matches what we're looking for.
+            // This lets us use two ViewDragHelpers, one for each side drawer.
+            return isDrawerView(child) && checkDrawerViewAbsoluteGravity(child, mAbsGravity)
+                    && getDrawerLockMode(child) == LOCK_MODE_UNLOCKED;
+        }
+
+        @Override
+        public void onViewDragStateChanged(int state) {
+            updateDrawerState(mAbsGravity, state, mDragger.getCapturedView());
+        }
+
+        @Override
+        public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) {
+            float offset;
+            final int childWidth = changedView.getWidth();
+
+            // This reverses the positioning shown in onLayout.
+            if (checkDrawerViewAbsoluteGravity(changedView, Gravity.LEFT)) {
+                offset = (float) (childWidth + left) / childWidth;
+            } else {
+                final int width = getWidth();
+                offset = (float) (width - left) / childWidth;
+            }
+            setDrawerViewOffset(changedView, offset);
+            changedView.setVisibility(offset == 0 ? INVISIBLE : VISIBLE);
+            invalidate();
+        }
+
+        @Override
+        public void onViewCaptured(View capturedChild, int activePointerId) {
+            final LayoutParams lp = (LayoutParams) capturedChild.getLayoutParams();
+            lp.isPeeking = false;
+
+            closeOtherDrawer();
+        }
+
+        private void closeOtherDrawer() {
+            final int otherGrav = mAbsGravity == Gravity.LEFT ? Gravity.RIGHT : Gravity.LEFT;
+            final View toClose = findDrawerWithGravity(otherGrav);
+            if (toClose != null) {
+                closeDrawer(toClose);
+            }
+        }
+
+        @Override
+        public void onViewReleased(View releasedChild, float xvel, float yvel) {
+            // Offset is how open the drawer is, therefore left/right values
+            // are reversed from one another.
+            final float offset = getDrawerViewOffset(releasedChild);
+            final int childWidth = releasedChild.getWidth();
+
+            int left;
+            if (checkDrawerViewAbsoluteGravity(releasedChild, Gravity.LEFT)) {
+                left = xvel > 0 || xvel == 0 && offset > 0.5f ? 0 : -childWidth;
+            } else {
+                final int width = getWidth();
+                left = xvel < 0 || xvel == 0 && offset > 0.5f ? width - childWidth : width;
+            }
+
+            mDragger.settleCapturedViewAt(left, releasedChild.getTop());
+            invalidate();
+        }
+
+        @Override
+        public void onEdgeTouched(int edgeFlags, int pointerId) {
+            postDelayed(mPeekRunnable, PEEK_DELAY);
+        }
+
+        private void peekDrawer() {
+            final View toCapture;
+            final int childLeft;
+            final int peekDistance = mDragger.getEdgeSize();
+            final boolean leftEdge = mAbsGravity == Gravity.LEFT;
+            if (leftEdge) {
+                toCapture = findDrawerWithGravity(Gravity.LEFT);
+                childLeft = (toCapture != null ? -toCapture.getWidth() : 0) + peekDistance;
+            } else {
+                toCapture = findDrawerWithGravity(Gravity.RIGHT);
+                childLeft = getWidth() - peekDistance;
+            }
+            // Only peek if it would mean making the drawer more visible and the drawer isn't locked
+            if (toCapture != null && ((leftEdge && toCapture.getLeft() < childLeft) ||
+                    (!leftEdge && toCapture.getLeft() > childLeft)) &&
+                    getDrawerLockMode(toCapture) == LOCK_MODE_UNLOCKED) {
+                final LayoutParams lp = (LayoutParams) toCapture.getLayoutParams();
+                mDragger.smoothSlideViewTo(toCapture, childLeft, toCapture.getTop());
+                lp.isPeeking = true;
+                invalidate();
+
+                closeOtherDrawer();
+
+                cancelChildViewTouch();
+            }
+        }
+
+        @Override
+        public boolean onEdgeLock(int edgeFlags) {
+            if (ALLOW_EDGE_LOCK) {
+                final View drawer = findDrawerWithGravity(mAbsGravity);
+                if (drawer != null && !isDrawerOpen(drawer)) {
+                    closeDrawer(drawer);
+                }
+                return true;
+            }
+            return false;
+        }
+
+        @Override
+        public void onEdgeDragStarted(int edgeFlags, int pointerId) {
+            final View toCapture;
+            if ((edgeFlags & ViewDragHelper.EDGE_LEFT) == ViewDragHelper.EDGE_LEFT) {
+                toCapture = findDrawerWithGravity(Gravity.LEFT);
+            } else {
+                toCapture = findDrawerWithGravity(Gravity.RIGHT);
+            }
+
+            if (toCapture != null && getDrawerLockMode(toCapture) == LOCK_MODE_UNLOCKED) {
+                mDragger.captureChildView(toCapture, pointerId);
+            }
+        }
+
+        @Override
+        public int getViewHorizontalDragRange(View child) {
+            return isDrawerView(child) ? child.getWidth() : 0;
+        }
+
+        @Override
+        public int clampViewPositionHorizontal(View child, int left, int dx) {
+            if (checkDrawerViewAbsoluteGravity(child, Gravity.LEFT)) {
+                return Math.max(-child.getWidth(), Math.min(left, 0));
+            } else {
+                final int width = getWidth();
+                return Math.max(width - child.getWidth(), Math.min(left, width));
+            }
+        }
+
+        @Override
+        public int clampViewPositionVertical(View child, int top, int dy) {
+            return child.getTop();
+        }
+    }
+
+    public static class LayoutParams extends ViewGroup.MarginLayoutParams {
+        private static final int FLAG_IS_OPENED = 0x1;
+        private static final int FLAG_IS_OPENING = 0x2;
+        private static final int FLAG_IS_CLOSING = 0x4;
+
+        public int gravity = Gravity.NO_GRAVITY;
+        private float onScreen;
+        private boolean isPeeking;
+        private int openState;
+
+        public LayoutParams(Context c, AttributeSet attrs) {
+            super(c, attrs);
+
+            final TypedArray a = c.obtainStyledAttributes(attrs, LAYOUT_ATTRS);
+            this.gravity = a.getInt(0, Gravity.NO_GRAVITY);
+            a.recycle();
+        }
+
+        public LayoutParams(int width, int height) {
+            super(width, height);
+        }
+
+        public LayoutParams(int width, int height, int gravity) {
+            this(width, height);
+            this.gravity = gravity;
+        }
+
+        public LayoutParams(LayoutParams source) {
+            super(source);
+            this.gravity = source.gravity;
+        }
+
+        public LayoutParams(ViewGroup.LayoutParams source) {
+            super(source);
+        }
+
+        public LayoutParams(ViewGroup.MarginLayoutParams source) {
+            super(source);
+        }
+    }
+
+    class AccessibilityDelegate extends AccessibilityDelegateCompat {
+        private final Rect mTmpRect = new Rect();
+
+        @Override
+        public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfoCompat info) {
+            if (CAN_HIDE_DESCENDANTS) {
+                super.onInitializeAccessibilityNodeInfo(host, info);
+            } else {
+                // Obtain a node for the host, then manually generate the list
+                // of children to only include non-obscured views.
+                final AccessibilityNodeInfoCompat superNode =
+                        AccessibilityNodeInfoCompat.obtain(info);
+                super.onInitializeAccessibilityNodeInfo(host, superNode);
+
+                info.setSource(host);
+                final ViewParent parent = ViewCompat.getParentForAccessibility(host);
+                if (parent instanceof View) {
+                    info.setParent((View) parent);
+                }
+                copyNodeInfoNoChildren(info, superNode);
+                superNode.recycle();
+
+                addChildrenForAccessibility(info, (ViewGroup) host);
+            }
+
+            info.setClassName(DrawerLayout.class.getName());
+
+            // This view reports itself as focusable so that it can intercept
+            // the back button, but we should prevent this view from reporting
+            // itself as focusable to accessibility services.
+            info.setFocusable(false);
+            info.setFocused(false);
+            info.removeAction(AccessibilityActionCompat.ACTION_FOCUS);
+            info.removeAction(AccessibilityActionCompat.ACTION_CLEAR_FOCUS);
+        }
+
+        @Override
+        public void onInitializeAccessibilityEvent(View host, AccessibilityEvent event) {
+            super.onInitializeAccessibilityEvent(host, event);
+
+            event.setClassName(DrawerLayout.class.getName());
+        }
+
+        @Override
+        public boolean dispatchPopulateAccessibilityEvent(View host, AccessibilityEvent event) {
+            // Special case to handle window state change events. As far as
+            // accessibility services are concerned, state changes from
+            // DrawerLayout invalidate the entire contents of the screen (like
+            // an Activity or Dialog) and they should announce the title of the
+            // new content.
+            if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) {
+                final List<CharSequence> eventText = event.getText();
+                final View visibleDrawer = findVisibleDrawer();
+                if (visibleDrawer != null) {
+                    final int edgeGravity = getDrawerViewAbsoluteGravity(visibleDrawer);
+                    final CharSequence title = getDrawerTitle(edgeGravity);
+                    if (title != null) {
+                        eventText.add(title);
+                    }
+                }
+
+                return true;
+            }
+
+            return super.dispatchPopulateAccessibilityEvent(host, event);
+        }
+
+        @Override
+        public boolean onRequestSendAccessibilityEvent(ViewGroup host, View child,
+                AccessibilityEvent event) {
+            if (CAN_HIDE_DESCENDANTS || includeChildForAccessibility(child)) {
+                return super.onRequestSendAccessibilityEvent(host, child, event);
+            }
+            return false;
+        }
+
+        private void addChildrenForAccessibility(AccessibilityNodeInfoCompat info, ViewGroup v) {
+            final int childCount = v.getChildCount();
+            for (int i = 0; i < childCount; i++) {
+                final View child = v.getChildAt(i);
+                if (includeChildForAccessibility(child)) {
+                    info.addChild(child);
+                }
+            }
+        }
+
+        /**
+         * This should really be in AccessibilityNodeInfoCompat, but there unfortunately
+         * seem to be a few elements that are not easily cloneable using the underlying API.
+         * Leave it private here as it's not general-purpose useful.
+         */
+        private void copyNodeInfoNoChildren(AccessibilityNodeInfoCompat dest,
+                AccessibilityNodeInfoCompat src) {
+            final Rect rect = mTmpRect;
+
+            src.getBoundsInParent(rect);
+            dest.setBoundsInParent(rect);
+
+            src.getBoundsInScreen(rect);
+            dest.setBoundsInScreen(rect);
+
+            dest.setVisibleToUser(src.isVisibleToUser());
+            dest.setPackageName(src.getPackageName());
+            dest.setClassName(src.getClassName());
+            dest.setContentDescription(src.getContentDescription());
+
+            dest.setEnabled(src.isEnabled());
+            dest.setClickable(src.isClickable());
+            dest.setFocusable(src.isFocusable());
+            dest.setFocused(src.isFocused());
+            dest.setAccessibilityFocused(src.isAccessibilityFocused());
+            dest.setSelected(src.isSelected());
+            dest.setLongClickable(src.isLongClickable());
+
+            dest.addAction(src.getActions());
+        }
+    }
+
+    final class ChildAccessibilityDelegate extends AccessibilityDelegateCompat {
+        @Override
+        public void onInitializeAccessibilityNodeInfo(View child,
+                AccessibilityNodeInfoCompat info) {
+            super.onInitializeAccessibilityNodeInfo(child, info);
+
+            if (!includeChildForAccessibility(child)) {
+                // If we are ignoring the sub-tree rooted at the child,
+                // break the connection to the rest of the node tree.
+                // For details refer to includeChildForAccessibility.
+                info.setParent(null);
+            }
+        }
+    }
+}
diff --git a/v4/java/android/support/v4/widget/ExploreByTouchHelper.java b/core-ui/java/android/support/v4/widget/ExploreByTouchHelper.java
similarity index 100%
rename from v4/java/android/support/v4/widget/ExploreByTouchHelper.java
rename to core-ui/java/android/support/v4/widget/ExploreByTouchHelper.java
diff --git a/core-ui/java/android/support/v4/widget/FocusStrategy.java b/core-ui/java/android/support/v4/widget/FocusStrategy.java
new file mode 100644
index 0000000..ac16ebe
--- /dev/null
+++ b/core-ui/java/android/support/v4/widget/FocusStrategy.java
@@ -0,0 +1,455 @@
+/*
+ * Copyright (C) 2015 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 android.support.v4.widget;
+
+import android.graphics.Rect;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.view.View;
+
+import android.support.v4.view.ViewCompat.FocusRealDirection;
+import android.support.v4.view.ViewCompat.FocusRelativeDirection;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+
+/**
+ * Implements absolute and relative focus movement strategies. Adapted from
+ * android.view.FocusFinder to work with generic collections of bounded items.
+ */
+class FocusStrategy {
+    public static <L,T> T findNextFocusInRelativeDirection(@NonNull L focusables,
+            @NonNull CollectionAdapter<L,T> collectionAdapter, @NonNull BoundsAdapter<T> adapter,
+            @Nullable T focused, @FocusRelativeDirection int direction, boolean isLayoutRtl,
+            boolean wrap) {
+        final int count = collectionAdapter.size(focusables);
+        final ArrayList<T> sortedFocusables = new ArrayList<>(count);
+        for (int i = 0; i < count; i++) {
+            sortedFocusables.add(collectionAdapter.get(focusables, i));
+        }
+
+        final SequentialComparator<T> comparator = new SequentialComparator<>(isLayoutRtl, adapter);
+        Collections.sort(sortedFocusables, comparator);
+
+        switch (direction) {
+            case View.FOCUS_FORWARD:
+                return getNextFocusable(focused, sortedFocusables, wrap);
+            case View.FOCUS_BACKWARD:
+                return getPreviousFocusable(focused, sortedFocusables, wrap);
+            default:
+                throw new IllegalArgumentException("direction must be one of "
+                        + "{FOCUS_FORWARD, FOCUS_BACKWARD}.");
+        }
+    }
+
+    private static <T> T getNextFocusable(T focused, ArrayList<T> focusables, boolean wrap) {
+        final int count = focusables.size();
+
+        // The position of the next focusable item, which is the first item if
+        // no item is currently focused.
+        final int position = (focused == null ? -1 : focusables.lastIndexOf(focused)) + 1;
+        if (position < count) {
+            return focusables.get(position);
+        } else if (wrap && count > 0) {
+            return focusables.get(0);
+        } else {
+            return null;
+        }
+    }
+
+    private static <T> T getPreviousFocusable(T focused, ArrayList<T> focusables, boolean wrap) {
+        final int count = focusables.size();
+
+        // The position of the previous focusable item, which is the last item
+        // if no item is currently focused.
+        final int position = (focused == null ? count : focusables.indexOf(focused)) - 1;
+        if (position >= 0) {
+            return focusables.get(position);
+        } else if (wrap && count > 0) {
+            return focusables.get(count - 1);
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * Sorts views according to their visual layout and geometry for default tab order.
+     * This is used for sequential focus traversal.
+     */
+    private static class SequentialComparator<T> implements Comparator<T> {
+        private final Rect mTemp1 = new Rect();
+        private final Rect mTemp2 = new Rect();
+
+        private final boolean mIsLayoutRtl;
+        private final BoundsAdapter<T> mAdapter;
+
+        public SequentialComparator(boolean isLayoutRtl, BoundsAdapter<T> adapter) {
+            mIsLayoutRtl = isLayoutRtl;
+            mAdapter = adapter;
+        }
+
+        @Override
+        public int compare(T first, T second) {
+            final Rect firstRect = mTemp1;
+            final Rect secondRect = mTemp2;
+
+            mAdapter.obtainBounds(first, firstRect);
+            mAdapter.obtainBounds(second, secondRect);
+
+            if (firstRect.top < secondRect.top) {
+                return -1;
+            } else if (firstRect.top > secondRect.top) {
+                return 1;
+            } else if (firstRect.left < secondRect.left) {
+                return mIsLayoutRtl ? 1 : -1;
+            } else if (firstRect.left > secondRect.left) {
+                return mIsLayoutRtl ? -1 : 1;
+            } else if (firstRect.bottom < secondRect.bottom) {
+                return -1;
+            } else if (firstRect.bottom > secondRect.bottom) {
+                return 1;
+            } else if (firstRect.right < secondRect.right) {
+                return mIsLayoutRtl ? 1 : -1;
+            } else if (firstRect.right > secondRect.right) {
+                return mIsLayoutRtl ? -1 : 1;
+            } else {
+                // The view are distinct but completely coincident so we
+                // consider them equal for our purposes. Since the sort is
+                // stable, this means that the views will retain their
+                // layout order relative to one another.
+                return 0;
+            }
+        }
+    }
+
+    public static <L,T> T findNextFocusInAbsoluteDirection(@NonNull L focusables,
+            @NonNull CollectionAdapter<L,T> collectionAdapter, @NonNull BoundsAdapter<T> adapter,
+            @Nullable T focused, @NonNull Rect focusedRect, int direction) {
+        // Initialize the best candidate to something impossible so that
+        // the first plausible view will become the best choice.
+        final Rect bestCandidateRect = new Rect(focusedRect);
+
+        switch (direction) {
+            case View.FOCUS_LEFT:
+                bestCandidateRect.offset(focusedRect.width() + 1, 0);
+                break;
+            case View.FOCUS_RIGHT:
+                bestCandidateRect.offset(-(focusedRect.width() + 1), 0);
+                break;
+            case View.FOCUS_UP:
+                bestCandidateRect.offset(0, focusedRect.height() + 1);
+                break;
+            case View.FOCUS_DOWN:
+                bestCandidateRect.offset(0, -(focusedRect.height() + 1));
+                break;
+            default:
+                throw new IllegalArgumentException("direction must be one of "
+                        + "{FOCUS_UP, FOCUS_DOWN, FOCUS_LEFT, FOCUS_RIGHT}.");
+        }
+
+        T closest = null;
+
+        final int count = collectionAdapter.size(focusables);
+        final Rect focusableRect = new Rect();
+        for (int i = 0; i < count; i++) {
+            final T focusable = collectionAdapter.get(focusables, i);
+            if (focusable == focused) {
+                continue;
+            }
+
+            // get focus bounds of other view
+            adapter.obtainBounds(focusable, focusableRect);
+            if (isBetterCandidate(direction, focusedRect, focusableRect, bestCandidateRect)) {
+                bestCandidateRect.set(focusableRect);
+                closest = focusable;
+            }
+        }
+
+        return closest;
+    }
+
+    /**
+     * Is candidate a better candidate than currentBest for a focus search
+     * in a particular direction from a source rect? This is the core
+     * routine that determines the order of focus searching.
+     *
+     * @param direction   the direction (up, down, left, right)
+     * @param source      the source from which we are searching
+     * @param candidate   the candidate rectangle
+     * @param currentBest the current best rectangle
+     * @return {@code true} if the candidate rectangle is a better than the
+     * current best rectangle, {@code false} otherwise
+     */
+    private static boolean isBetterCandidate(
+            @FocusRealDirection int direction, @NonNull Rect source,
+            @NonNull Rect candidate, @NonNull Rect currentBest) {
+        // To be a better candidate, need to at least be a candidate in the
+        // first place. :)
+        if (!isCandidate(source, candidate, direction)) {
+            return false;
+        }
+
+        // We know that candidateRect is a candidate. If currentBest is not
+        // a candidate, candidateRect is better.
+        if (!isCandidate(source, currentBest, direction)) {
+            return true;
+        }
+
+        // If candidateRect is better by beam, it wins.
+        if (beamBeats(direction, source, candidate, currentBest)) {
+            return true;
+        }
+
+        // If currentBest is better, then candidateRect cant' be. :)
+        if (beamBeats(direction, source, currentBest, candidate)) {
+            return false;
+        }
+
+        // Otherwise, do fudge-tastic comparison of the major and minor
+        // axis.
+        final int candidateDist = getWeightedDistanceFor(
+                majorAxisDistance(direction, source, candidate),
+                minorAxisDistance(direction, source, candidate));
+        final int currentBestDist = getWeightedDistanceFor(
+                majorAxisDistance(direction, source, currentBest),
+                minorAxisDistance(direction, source, currentBest));
+        return candidateDist < currentBestDist;
+    }
+
+    /**
+     * One rectangle may be another candidate than another by virtue of
+     * being exclusively in the beam of the source rect.
+     *
+     * @return whether rect1 is a better candidate than rect2 by virtue of
+     * it being in source's beam
+     */
+    private static boolean beamBeats(@FocusRealDirection int direction,
+            @NonNull Rect source, @NonNull Rect rect1, @NonNull Rect rect2) {
+        final boolean rect1InSrcBeam = beamsOverlap(direction, source, rect1);
+        final boolean rect2InSrcBeam = beamsOverlap(direction, source, rect2);
+
+        // If rect1 isn't exclusively in the src beam, it doesn't win.
+        if (rect2InSrcBeam || !rect1InSrcBeam) {
+            return false;
+        }
+
+        // We know rect1 is in the beam, and rect2 is not.
+
+        // If rect1 is to the direction of, and rect2 is not, rect1 wins.
+        // For example, for direction left, if rect1 is to the left of the
+        // source and rect2 is below, then we always prefer the in beam
+        // rect1, since rect2 could be reached by going down.
+        if (!isToDirectionOf(direction, source, rect2)) {
+            return true;
+        }
+
+        // For horizontal directions, being exclusively in beam always
+        // wins.
+        if (direction == View.FOCUS_LEFT || direction == View.FOCUS_RIGHT) {
+            return true;
+        }
+
+        // For vertical directions, beams only beat up to a point: now, as
+        // long as rect2 isn't completely closer, rect1 wins, e.g. for
+        // direction down, completely closer means for rect2's top edge to
+        // be closer to the source's top edge than rect1's bottom edge.
+        return majorAxisDistance(direction, source, rect1)
+                < majorAxisDistanceToFarEdge(direction, source, rect2);
+    }
+
+    /**
+     * Fudge-factor opportunity: how to calculate distance given major and
+     * minor axis distances.
+     * <p/>
+     * Warning: this fudge factor is finely tuned, be sure to run all focus
+     * tests if you dare tweak it.
+     */
+    private static int getWeightedDistanceFor(int majorAxisDistance, int minorAxisDistance) {
+        return 13 * majorAxisDistance * majorAxisDistance
+                + minorAxisDistance * minorAxisDistance;
+    }
+
+    /**
+     * Is destRect a candidate for the next focus given the direction? This
+     * checks whether the dest is at least partially to the direction of
+     * (e.g. left of) from source.
+     * <p/>
+     * Includes an edge case for an empty rect,which is used in some cases
+     * when searching from a point on the screen.
+     */
+    private static boolean isCandidate(@NonNull Rect srcRect, @NonNull Rect destRect,
+            @FocusRealDirection int direction) {
+        switch (direction) {
+            case View.FOCUS_LEFT:
+                return (srcRect.right > destRect.right || srcRect.left >= destRect.right)
+                        && srcRect.left > destRect.left;
+            case View.FOCUS_RIGHT:
+                return (srcRect.left < destRect.left || srcRect.right <= destRect.left)
+                        && srcRect.right < destRect.right;
+            case View.FOCUS_UP:
+                return (srcRect.bottom > destRect.bottom || srcRect.top >= destRect.bottom)
+                        && srcRect.top > destRect.top;
+            case View.FOCUS_DOWN:
+                return (srcRect.top < destRect.top || srcRect.bottom <= destRect.top)
+                        && srcRect.bottom < destRect.bottom;
+        }
+        throw new IllegalArgumentException("direction must be one of "
+                + "{FOCUS_UP, FOCUS_DOWN, FOCUS_LEFT, FOCUS_RIGHT}.");
+    }
+
+
+    /**
+     * Do the "beams" w.r.t the given direction's axis of rect1 and rect2 overlap?
+     *
+     * @param direction the direction (up, down, left, right)
+     * @param rect1     the first rectangle
+     * @param rect2     the second rectangle
+     * @return whether the beams overlap
+     */
+    private static boolean beamsOverlap(@FocusRealDirection int direction,
+            @NonNull Rect rect1, @NonNull Rect rect2) {
+        switch (direction) {
+            case View.FOCUS_LEFT:
+            case View.FOCUS_RIGHT:
+                return (rect2.bottom >= rect1.top) && (rect2.top <= rect1.bottom);
+            case View.FOCUS_UP:
+            case View.FOCUS_DOWN:
+                return (rect2.right >= rect1.left) && (rect2.left <= rect1.right);
+        }
+        throw new IllegalArgumentException("direction must be one of "
+                + "{FOCUS_UP, FOCUS_DOWN, FOCUS_LEFT, FOCUS_RIGHT}.");
+    }
+
+    /**
+     * e.g for left, is 'to left of'
+     */
+    private static boolean isToDirectionOf(@FocusRealDirection int direction,
+            @NonNull Rect src, @NonNull Rect dest) {
+        switch (direction) {
+            case View.FOCUS_LEFT:
+                return src.left >= dest.right;
+            case View.FOCUS_RIGHT:
+                return src.right <= dest.left;
+            case View.FOCUS_UP:
+                return src.top >= dest.bottom;
+            case View.FOCUS_DOWN:
+                return src.bottom <= dest.top;
+        }
+        throw new IllegalArgumentException("direction must be one of "
+                + "{FOCUS_UP, FOCUS_DOWN, FOCUS_LEFT, FOCUS_RIGHT}.");
+    }
+
+    /**
+     * @return the distance from the edge furthest in the given direction
+     * of source to the edge nearest in the given direction of
+     * dest. If the dest is not in the direction from source,
+     * returns 0.
+     */
+    private static int majorAxisDistance(@FocusRealDirection int direction,
+            @NonNull Rect source, @NonNull Rect dest) {
+        return Math.max(0, majorAxisDistanceRaw(direction, source, dest));
+    }
+
+    private static int majorAxisDistanceRaw(@FocusRealDirection int direction,
+            @NonNull Rect source, @NonNull Rect dest) {
+        switch (direction) {
+            case View.FOCUS_LEFT:
+                return source.left - dest.right;
+            case View.FOCUS_RIGHT:
+                return dest.left - source.right;
+            case View.FOCUS_UP:
+                return source.top - dest.bottom;
+            case View.FOCUS_DOWN:
+                return dest.top - source.bottom;
+        }
+        throw new IllegalArgumentException("direction must be one of "
+                + "{FOCUS_UP, FOCUS_DOWN, FOCUS_LEFT, FOCUS_RIGHT}.");
+    }
+
+    /**
+     * @return the distance along the major axis w.r.t the direction from
+     * the edge of source to the far edge of dest. If the dest is
+     * not in the direction from source, returns 1 to break ties
+     * with {@link #majorAxisDistance}.
+     */
+    private static int majorAxisDistanceToFarEdge(@FocusRealDirection int direction,
+            @NonNull Rect source, @NonNull Rect dest) {
+        return Math.max(1, majorAxisDistanceToFarEdgeRaw(direction, source, dest));
+    }
+
+    private static int majorAxisDistanceToFarEdgeRaw(
+            @FocusRealDirection int direction, @NonNull Rect source,
+            @NonNull Rect dest) {
+        switch (direction) {
+            case View.FOCUS_LEFT:
+                return source.left - dest.left;
+            case View.FOCUS_RIGHT:
+                return dest.right - source.right;
+            case View.FOCUS_UP:
+                return source.top - dest.top;
+            case View.FOCUS_DOWN:
+                return dest.bottom - source.bottom;
+        }
+        throw new IllegalArgumentException("direction must be one of "
+                + "{FOCUS_UP, FOCUS_DOWN, FOCUS_LEFT, FOCUS_RIGHT}.");
+    }
+
+    /**
+     * Finds the distance on the minor axis w.r.t the direction to the
+     * nearest edge of the destination rectangle.
+     *
+     * @param direction the direction (up, down, left, right)
+     * @param source the source rect
+     * @param dest the destination rect
+     * @return the distance
+     */
+    private static int minorAxisDistance(@FocusRealDirection int direction, @NonNull Rect source,
+            @NonNull Rect dest) {
+        switch (direction) {
+            case View.FOCUS_LEFT:
+            case View.FOCUS_RIGHT:
+                // the distance between the center verticals
+                return Math.abs(
+                        ((source.top + source.height() / 2) -
+                                ((dest.top + dest.height() / 2))));
+            case View.FOCUS_UP:
+            case View.FOCUS_DOWN:
+                // the distance between the center horizontals
+                return Math.abs(
+                        ((source.left + source.width() / 2) -
+                                ((dest.left + dest.width() / 2))));
+        }
+        throw new IllegalArgumentException("direction must be one of "
+                + "{FOCUS_UP, FOCUS_DOWN, FOCUS_LEFT, FOCUS_RIGHT}.");
+    }
+
+    /**
+     * Adapter used to obtain bounds from a generic data type.
+     */
+    public interface BoundsAdapter<T> {
+        void obtainBounds(T data, Rect outBounds);
+    }
+
+    /**
+     * Adapter used to obtain items from a generic collection type.
+     */
+    public interface CollectionAdapter<T, V> {
+        V get(T collection, int index);
+        int size(T collection);
+    }
+}
diff --git a/v4/java/android/support/v4/widget/ListViewAutoScrollHelper.java b/core-ui/java/android/support/v4/widget/ListViewAutoScrollHelper.java
similarity index 100%
rename from v4/java/android/support/v4/widget/ListViewAutoScrollHelper.java
rename to core-ui/java/android/support/v4/widget/ListViewAutoScrollHelper.java
diff --git a/core-ui/java/android/support/v4/widget/MaterialProgressDrawable.java b/core-ui/java/android/support/v4/widget/MaterialProgressDrawable.java
new file mode 100644
index 0000000..50939ad
--- /dev/null
+++ b/core-ui/java/android/support/v4/widget/MaterialProgressDrawable.java
@@ -0,0 +1,791 @@
+/*
+ * Copyright (C) 2014 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 android.support.v4.widget;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.ColorFilter;
+import android.graphics.Paint;
+import android.graphics.Paint.Style;
+import android.graphics.Path;
+import android.graphics.PixelFormat;
+import android.graphics.Rect;
+import android.graphics.RectF;
+import android.graphics.drawable.Animatable;
+import android.graphics.drawable.Drawable;
+import android.support.annotation.IntDef;
+import android.support.annotation.NonNull;
+import android.support.v4.view.animation.FastOutSlowInInterpolator;
+import android.util.DisplayMetrics;
+import android.view.View;
+import android.view.animation.Animation;
+import android.view.animation.Interpolator;
+import android.view.animation.LinearInterpolator;
+import android.view.animation.Transformation;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.util.ArrayList;
+
+/**
+ * Fancy progress indicator for Material theme.
+ *
+ * @hide
+ */
+class MaterialProgressDrawable extends Drawable implements Animatable {
+    private static final Interpolator LINEAR_INTERPOLATOR = new LinearInterpolator();
+    private static final Interpolator MATERIAL_INTERPOLATOR = new FastOutSlowInInterpolator();
+
+    private static final float FULL_ROTATION = 1080.0f;
+    @Retention(RetentionPolicy.SOURCE)
+    @IntDef({LARGE, DEFAULT})
+    public @interface ProgressDrawableSize {}
+    // Maps to ProgressBar.Large style
+    static final int LARGE = 0;
+    // Maps to ProgressBar default style
+    static final int DEFAULT = 1;
+
+    // Maps to ProgressBar default style
+    private static final int CIRCLE_DIAMETER = 40;
+    private static final float CENTER_RADIUS = 8.75f; //should add up to 10 when + stroke_width
+    private static final float STROKE_WIDTH = 2.5f;
+
+    // Maps to ProgressBar.Large style
+    private static final int CIRCLE_DIAMETER_LARGE = 56;
+    private static final float CENTER_RADIUS_LARGE = 12.5f;
+    private static final float STROKE_WIDTH_LARGE = 3f;
+
+    private final int[] COLORS = new int[] {
+        Color.BLACK
+    };
+
+    /**
+     * The value in the linear interpolator for animating the drawable at which
+     * the color transition should start
+     */
+    private static final float COLOR_START_DELAY_OFFSET = 0.75f;
+    private static final float END_TRIM_START_DELAY_OFFSET = 0.5f;
+    private static final float START_TRIM_DURATION_OFFSET = 0.5f;
+
+    /** The duration of a single progress spin in milliseconds. */
+    private static final int ANIMATION_DURATION = 1332;
+
+    /** The number of points in the progress "star". */
+    private static final float NUM_POINTS = 5f;
+    /** The list of animators operating on this drawable. */
+    private final ArrayList<Animation> mAnimators = new ArrayList<Animation>();
+
+    /** The indicator ring, used to manage animation state. */
+    private final Ring mRing;
+
+    /** Canvas rotation in degrees. */
+    private float mRotation;
+
+    /** Layout info for the arrowhead in dp */
+    private static final int ARROW_WIDTH = 10;
+    private static final int ARROW_HEIGHT = 5;
+    private static final float ARROW_OFFSET_ANGLE = 5;
+
+    /** Layout info for the arrowhead for the large spinner in dp */
+    private static final int ARROW_WIDTH_LARGE = 12;
+    private static final int ARROW_HEIGHT_LARGE = 6;
+    private static final float MAX_PROGRESS_ARC = .8f;
+
+    private Resources mResources;
+    private View mParent;
+    private Animation mAnimation;
+    private float mRotationCount;
+    private double mWidth;
+    private double mHeight;
+    boolean mFinishing;
+
+    public MaterialProgressDrawable(Context context, View parent) {
+        mParent = parent;
+        mResources = context.getResources();
+
+        mRing = new Ring(mCallback);
+        mRing.setColors(COLORS);
+
+        updateSizes(DEFAULT);
+        setupAnimators();
+    }
+
+    private void setSizeParameters(double progressCircleWidth, double progressCircleHeight,
+            double centerRadius, double strokeWidth, float arrowWidth, float arrowHeight) {
+        final Ring ring = mRing;
+        final DisplayMetrics metrics = mResources.getDisplayMetrics();
+        final float screenDensity = metrics.density;
+
+        mWidth = progressCircleWidth * screenDensity;
+        mHeight = progressCircleHeight * screenDensity;
+        ring.setStrokeWidth((float) strokeWidth * screenDensity);
+        ring.setCenterRadius(centerRadius * screenDensity);
+        ring.setColorIndex(0);
+        ring.setArrowDimensions(arrowWidth * screenDensity, arrowHeight * screenDensity);
+        ring.setInsets((int) mWidth, (int) mHeight);
+    }
+
+    /**
+     * Set the overall size for the progress spinner. This updates the radius
+     * and stroke width of the ring.
+     *
+     * @param size One of {@link MaterialProgressDrawable.LARGE} or
+     *            {@link MaterialProgressDrawable.DEFAULT}
+     */
+    public void updateSizes(@ProgressDrawableSize int size) {
+        if (size == LARGE) {
+            setSizeParameters(CIRCLE_DIAMETER_LARGE, CIRCLE_DIAMETER_LARGE, CENTER_RADIUS_LARGE,
+                    STROKE_WIDTH_LARGE, ARROW_WIDTH_LARGE, ARROW_HEIGHT_LARGE);
+        } else {
+            setSizeParameters(CIRCLE_DIAMETER, CIRCLE_DIAMETER, CENTER_RADIUS, STROKE_WIDTH,
+                    ARROW_WIDTH, ARROW_HEIGHT);
+        }
+    }
+
+    /**
+     * @param show Set to true to display the arrowhead on the progress spinner.
+     */
+    public void showArrow(boolean show) {
+        mRing.setShowArrow(show);
+    }
+
+    /**
+     * @param scale Set the scale of the arrowhead for the spinner.
+     */
+    public void setArrowScale(float scale) {
+        mRing.setArrowScale(scale);
+    }
+
+    /**
+     * Set the start and end trim for the progress spinner arc.
+     *
+     * @param startAngle start angle
+     * @param endAngle end angle
+     */
+    public void setStartEndTrim(float startAngle, float endAngle) {
+        mRing.setStartTrim(startAngle);
+        mRing.setEndTrim(endAngle);
+    }
+
+    /**
+     * Set the amount of rotation to apply to the progress spinner.
+     *
+     * @param rotation Rotation is from [0..1]
+     */
+    public void setProgressRotation(float rotation) {
+        mRing.setRotation(rotation);
+    }
+
+    /**
+     * Update the background color of the circle image view.
+     */
+    public void setBackgroundColor(int color) {
+        mRing.setBackgroundColor(color);
+     }
+
+    /**
+     * Set the colors used in the progress animation from color resources.
+     * The first color will also be the color of the bar that grows in response
+     * to a user swipe gesture.
+     *
+     * @param colors
+     */
+    public void setColorSchemeColors(int... colors) {
+        mRing.setColors(colors);
+        mRing.setColorIndex(0);
+    }
+
+    @Override
+    public int getIntrinsicHeight() {
+        return (int) mHeight;
+    }
+
+    @Override
+    public int getIntrinsicWidth() {
+        return (int) mWidth;
+    }
+
+    @Override
+    public void draw(Canvas c) {
+        final Rect bounds = getBounds();
+        final int saveCount = c.save();
+        c.rotate(mRotation, bounds.exactCenterX(), bounds.exactCenterY());
+        mRing.draw(c, bounds);
+        c.restoreToCount(saveCount);
+    }
+
+    @Override
+    public void setAlpha(int alpha) {
+        mRing.setAlpha(alpha);
+    }
+
+    public int getAlpha() {
+        return mRing.getAlpha();
+    }
+
+    @Override
+    public void setColorFilter(ColorFilter colorFilter) {
+        mRing.setColorFilter(colorFilter);
+    }
+
+    @SuppressWarnings("unused")
+    void setRotation(float rotation) {
+        mRotation = rotation;
+        invalidateSelf();
+    }
+
+    @SuppressWarnings("unused")
+    private float getRotation() {
+        return mRotation;
+    }
+
+    @Override
+    public int getOpacity() {
+        return PixelFormat.TRANSLUCENT;
+    }
+
+    @Override
+    public boolean isRunning() {
+        final ArrayList<Animation> animators = mAnimators;
+        final int N = animators.size();
+        for (int i = 0; i < N; i++) {
+            final Animation animator = animators.get(i);
+            if (animator.hasStarted() && !animator.hasEnded()) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    @Override
+    public void start() {
+        mAnimation.reset();
+        mRing.storeOriginals();
+        // Already showing some part of the ring
+        if (mRing.getEndTrim() != mRing.getStartTrim()) {
+            mFinishing = true;
+            mAnimation.setDuration(ANIMATION_DURATION/2);
+            mParent.startAnimation(mAnimation);
+        } else {
+            mRing.setColorIndex(0);
+            mRing.resetOriginals();
+            mAnimation.setDuration(ANIMATION_DURATION);
+            mParent.startAnimation(mAnimation);
+        }
+    }
+
+    @Override
+    public void stop() {
+        mParent.clearAnimation();
+        setRotation(0);
+        mRing.setShowArrow(false);
+        mRing.setColorIndex(0);
+        mRing.resetOriginals();
+    }
+
+    private float getMinProgressArc(Ring ring) {
+        return (float) Math.toRadians(
+                ring.getStrokeWidth() / (2 * Math.PI * ring.getCenterRadius()));
+    }
+
+    // Adapted from ArgbEvaluator.java
+    private int evaluateColorChange(float fraction, int startValue, int endValue) {
+        int startInt = (Integer) startValue;
+        int startA = (startInt >> 24) & 0xff;
+        int startR = (startInt >> 16) & 0xff;
+        int startG = (startInt >> 8) & 0xff;
+        int startB = startInt & 0xff;
+
+        int endInt = (Integer) endValue;
+        int endA = (endInt >> 24) & 0xff;
+        int endR = (endInt >> 16) & 0xff;
+        int endG = (endInt >> 8) & 0xff;
+        int endB = endInt & 0xff;
+
+        return (int)((startA + (int)(fraction * (endA - startA))) << 24) |
+                (int)((startR + (int)(fraction * (endR - startR))) << 16) |
+                (int)((startG + (int)(fraction * (endG - startG))) << 8) |
+                (int)((startB + (int)(fraction * (endB - startB))));
+    }
+
+    /**
+     * Update the ring color if this is within the last 25% of the animation.
+     * The new ring color will be a translation from the starting ring color to
+     * the next color.
+     */
+    private void updateRingColor(float interpolatedTime, Ring ring) {
+        if (interpolatedTime > COLOR_START_DELAY_OFFSET) {
+            // scale the interpolatedTime so that the full
+            // transformation from 0 - 1 takes place in the
+            // remaining time
+            ring.setColor(evaluateColorChange((interpolatedTime - COLOR_START_DELAY_OFFSET)
+                    / (1.0f - COLOR_START_DELAY_OFFSET), ring.getStartingColor(),
+                    ring.getNextColor()));
+        }
+    }
+
+    private void applyFinishTranslation(float interpolatedTime, Ring ring) {
+        // shrink back down and complete a full rotation before
+        // starting other circles
+        // Rotation goes between [0..1].
+        updateRingColor(interpolatedTime, ring);
+        float targetRotation = (float) (Math.floor(ring.getStartingRotation() / MAX_PROGRESS_ARC)
+                + 1f);
+        final float minProgressArc = getMinProgressArc(ring);
+        final float startTrim = ring.getStartingStartTrim()
+                + (ring.getStartingEndTrim() - minProgressArc - ring.getStartingStartTrim())
+                * interpolatedTime;
+        ring.setStartTrim(startTrim);
+        ring.setEndTrim(ring.getStartingEndTrim());
+        final float rotation = ring.getStartingRotation()
+                + ((targetRotation - ring.getStartingRotation()) * interpolatedTime);
+        ring.setRotation(rotation);
+    }
+
+    private void setupAnimators() {
+        final Ring ring = mRing;
+        final Animation animation = new Animation() {
+                @Override
+            public void applyTransformation(float interpolatedTime, Transformation t) {
+                if (mFinishing) {
+                    applyFinishTranslation(interpolatedTime, ring);
+                } else {
+                    // The minProgressArc is calculated from 0 to create an
+                    // angle that matches the stroke width.
+                    final float minProgressArc = getMinProgressArc(ring);
+                    final float startingEndTrim = ring.getStartingEndTrim();
+                    final float startingTrim = ring.getStartingStartTrim();
+                    final float startingRotation = ring.getStartingRotation();
+
+                    updateRingColor(interpolatedTime, ring);
+
+                    // Moving the start trim only occurs in the first 50% of a
+                    // single ring animation
+                    if (interpolatedTime <= START_TRIM_DURATION_OFFSET) {
+                        // scale the interpolatedTime so that the full
+                        // transformation from 0 - 1 takes place in the
+                        // remaining time
+                        final float scaledTime = (interpolatedTime)
+                                / (1.0f - START_TRIM_DURATION_OFFSET);
+                        final float startTrim = startingTrim
+                                + ((MAX_PROGRESS_ARC - minProgressArc) * MATERIAL_INTERPOLATOR
+                                        .getInterpolation(scaledTime));
+                        ring.setStartTrim(startTrim);
+                    }
+
+                    // Moving the end trim starts after 50% of a single ring
+                    // animation completes
+                    if (interpolatedTime > END_TRIM_START_DELAY_OFFSET) {
+                        // scale the interpolatedTime so that the full
+                        // transformation from 0 - 1 takes place in the
+                        // remaining time
+                        final float minArc = MAX_PROGRESS_ARC - minProgressArc;
+                        float scaledTime = (interpolatedTime - START_TRIM_DURATION_OFFSET)
+                                / (1.0f - START_TRIM_DURATION_OFFSET);
+                        final float endTrim = startingEndTrim
+                                + (minArc * MATERIAL_INTERPOLATOR.getInterpolation(scaledTime));
+                        ring.setEndTrim(endTrim);
+                    }
+
+                    final float rotation = startingRotation + (0.25f * interpolatedTime);
+                    ring.setRotation(rotation);
+
+                    float groupRotation = ((FULL_ROTATION / NUM_POINTS) * interpolatedTime)
+                            + (FULL_ROTATION * (mRotationCount / NUM_POINTS));
+                    setRotation(groupRotation);
+                }
+            }
+        };
+        animation.setRepeatCount(Animation.INFINITE);
+        animation.setRepeatMode(Animation.RESTART);
+        animation.setInterpolator(LINEAR_INTERPOLATOR);
+        animation.setAnimationListener(new Animation.AnimationListener() {
+
+                @Override
+            public void onAnimationStart(Animation animation) {
+                mRotationCount = 0;
+            }
+
+                @Override
+            public void onAnimationEnd(Animation animation) {
+                // do nothing
+            }
+
+                @Override
+            public void onAnimationRepeat(Animation animation) {
+                ring.storeOriginals();
+                ring.goToNextColor();
+                ring.setStartTrim(ring.getEndTrim());
+                if (mFinishing) {
+                    // finished closing the last ring from the swipe gesture; go
+                    // into progress mode
+                    mFinishing = false;
+                    animation.setDuration(ANIMATION_DURATION);
+                    ring.setShowArrow(false);
+                } else {
+                    mRotationCount = (mRotationCount + 1) % (NUM_POINTS);
+                }
+            }
+        });
+        mAnimation = animation;
+    }
+
+    private final Callback mCallback = new Callback() {
+        @Override
+        public void invalidateDrawable(Drawable d) {
+            invalidateSelf();
+        }
+
+        @Override
+        public void scheduleDrawable(Drawable d, Runnable what, long when) {
+            scheduleSelf(what, when);
+        }
+
+        @Override
+        public void unscheduleDrawable(Drawable d, Runnable what) {
+            unscheduleSelf(what);
+        }
+    };
+
+    private static class Ring {
+        private final RectF mTempBounds = new RectF();
+        private final Paint mPaint = new Paint();
+        private final Paint mArrowPaint = new Paint();
+
+        private final Callback mCallback;
+
+        private float mStartTrim = 0.0f;
+        private float mEndTrim = 0.0f;
+        private float mRotation = 0.0f;
+        private float mStrokeWidth = 5.0f;
+        private float mStrokeInset = 2.5f;
+
+        private int[] mColors;
+        // mColorIndex represents the offset into the available mColors that the
+        // progress circle should currently display. As the progress circle is
+        // animating, the mColorIndex moves by one to the next available color.
+        private int mColorIndex;
+        private float mStartingStartTrim;
+        private float mStartingEndTrim;
+        private float mStartingRotation;
+        private boolean mShowArrow;
+        private Path mArrow;
+        private float mArrowScale;
+        private double mRingCenterRadius;
+        private int mArrowWidth;
+        private int mArrowHeight;
+        private int mAlpha;
+        private final Paint mCirclePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
+        private int mBackgroundColor;
+        private int mCurrentColor;
+
+        public Ring(Callback callback) {
+            mCallback = callback;
+
+            mPaint.setStrokeCap(Paint.Cap.SQUARE);
+            mPaint.setAntiAlias(true);
+            mPaint.setStyle(Style.STROKE);
+
+            mArrowPaint.setStyle(Paint.Style.FILL);
+            mArrowPaint.setAntiAlias(true);
+        }
+
+        public void setBackgroundColor(int color) {
+            mBackgroundColor = color;
+        }
+
+        /**
+         * Set the dimensions of the arrowhead.
+         *
+         * @param width Width of the hypotenuse of the arrow head
+         * @param height Height of the arrow point
+         */
+        public void setArrowDimensions(float width, float height) {
+            mArrowWidth = (int) width;
+            mArrowHeight = (int) height;
+        }
+
+        /**
+         * Draw the progress spinner
+         */
+        public void draw(Canvas c, Rect bounds) {
+            final RectF arcBounds = mTempBounds;
+            arcBounds.set(bounds);
+            arcBounds.inset(mStrokeInset, mStrokeInset);
+
+            final float startAngle = (mStartTrim + mRotation) * 360;
+            final float endAngle = (mEndTrim + mRotation) * 360;
+            float sweepAngle = endAngle - startAngle;
+
+            mPaint.setColor(mCurrentColor);
+            c.drawArc(arcBounds, startAngle, sweepAngle, false, mPaint);
+
+            drawTriangle(c, startAngle, sweepAngle, bounds);
+
+            if (mAlpha < 255) {
+                mCirclePaint.setColor(mBackgroundColor);
+                mCirclePaint.setAlpha(255 - mAlpha);
+                c.drawCircle(bounds.exactCenterX(), bounds.exactCenterY(), bounds.width() / 2,
+                        mCirclePaint);
+            }
+        }
+
+        private void drawTriangle(Canvas c, float startAngle, float sweepAngle, Rect bounds) {
+            if (mShowArrow) {
+                if (mArrow == null) {
+                    mArrow = new android.graphics.Path();
+                    mArrow.setFillType(android.graphics.Path.FillType.EVEN_ODD);
+                } else {
+                    mArrow.reset();
+                }
+
+                // Adjust the position of the triangle so that it is inset as
+                // much as the arc, but also centered on the arc.
+                float inset = (int) mStrokeInset / 2 * mArrowScale;
+                float x = (float) (mRingCenterRadius * Math.cos(0) + bounds.exactCenterX());
+                float y = (float) (mRingCenterRadius * Math.sin(0) + bounds.exactCenterY());
+
+                // Update the path each time. This works around an issue in SKIA
+                // where concatenating a rotation matrix to a scale matrix
+                // ignored a starting negative rotation. This appears to have
+                // been fixed as of API 21.
+                mArrow.moveTo(0, 0);
+                mArrow.lineTo(mArrowWidth * mArrowScale, 0);
+                mArrow.lineTo((mArrowWidth * mArrowScale / 2), (mArrowHeight
+                        * mArrowScale));
+                mArrow.offset(x - inset, y);
+                mArrow.close();
+                // draw a triangle
+                mArrowPaint.setColor(mCurrentColor);
+                c.rotate(startAngle + sweepAngle - ARROW_OFFSET_ANGLE, bounds.exactCenterX(),
+                        bounds.exactCenterY());
+                c.drawPath(mArrow, mArrowPaint);
+            }
+        }
+
+        /**
+         * Set the colors the progress spinner alternates between.
+         *
+         * @param colors Array of integers describing the colors. Must be non-<code>null</code>.
+         */
+        public void setColors(@NonNull int[] colors) {
+            mColors = colors;
+            // if colors are reset, make sure to reset the color index as well
+            setColorIndex(0);
+        }
+
+        /**
+         * Set the absolute color of the progress spinner. This is should only
+         * be used when animating between current and next color when the
+         * spinner is rotating.
+         *
+         * @param color int describing the color.
+         */
+        public void setColor(int color) {
+            mCurrentColor = color;
+        }
+
+        /**
+         * @param index Index into the color array of the color to display in
+         *            the progress spinner.
+         */
+        public void setColorIndex(int index) {
+            mColorIndex = index;
+            mCurrentColor = mColors[mColorIndex];
+        }
+
+        /**
+         * @return int describing the next color the progress spinner should use when drawing.
+         */
+        public int getNextColor() {
+            return mColors[getNextColorIndex()];
+        }
+
+        private int getNextColorIndex() {
+            return (mColorIndex + 1) % (mColors.length);
+        }
+
+        /**
+         * Proceed to the next available ring color. This will automatically
+         * wrap back to the beginning of colors.
+         */
+        public void goToNextColor() {
+            setColorIndex(getNextColorIndex());
+        }
+
+        public void setColorFilter(ColorFilter filter) {
+            mPaint.setColorFilter(filter);
+            invalidateSelf();
+        }
+
+        /**
+         * @param alpha Set the alpha of the progress spinner and associated arrowhead.
+         */
+        public void setAlpha(int alpha) {
+            mAlpha = alpha;
+        }
+
+        /**
+         * @return Current alpha of the progress spinner and arrowhead.
+         */
+        public int getAlpha() {
+            return mAlpha;
+        }
+
+        /**
+         * @param strokeWidth Set the stroke width of the progress spinner in pixels.
+         */
+        public void setStrokeWidth(float strokeWidth) {
+            mStrokeWidth = strokeWidth;
+            mPaint.setStrokeWidth(strokeWidth);
+            invalidateSelf();
+        }
+
+        @SuppressWarnings("unused")
+        public float getStrokeWidth() {
+            return mStrokeWidth;
+        }
+
+        @SuppressWarnings("unused")
+        public void setStartTrim(float startTrim) {
+            mStartTrim = startTrim;
+            invalidateSelf();
+        }
+
+        @SuppressWarnings("unused")
+        public float getStartTrim() {
+            return mStartTrim;
+        }
+
+        public float getStartingStartTrim() {
+            return mStartingStartTrim;
+        }
+
+        public float getStartingEndTrim() {
+            return mStartingEndTrim;
+        }
+
+        public int getStartingColor() {
+            return mColors[mColorIndex];
+        }
+
+        @SuppressWarnings("unused")
+        public void setEndTrim(float endTrim) {
+            mEndTrim = endTrim;
+            invalidateSelf();
+        }
+
+        @SuppressWarnings("unused")
+        public float getEndTrim() {
+            return mEndTrim;
+        }
+
+        @SuppressWarnings("unused")
+        public void setRotation(float rotation) {
+            mRotation = rotation;
+            invalidateSelf();
+        }
+
+        @SuppressWarnings("unused")
+        public float getRotation() {
+            return mRotation;
+        }
+
+        public void setInsets(int width, int height) {
+            final float minEdge = (float) Math.min(width, height);
+            float insets;
+            if (mRingCenterRadius <= 0 || minEdge < 0) {
+                insets = (float) Math.ceil(mStrokeWidth / 2.0f);
+            } else {
+                insets = (float) (minEdge / 2.0f - mRingCenterRadius);
+            }
+            mStrokeInset = insets;
+        }
+
+        @SuppressWarnings("unused")
+        public float getInsets() {
+            return mStrokeInset;
+        }
+
+        /**
+         * @param centerRadius Inner radius in px of the circle the progress
+         *            spinner arc traces.
+         */
+        public void setCenterRadius(double centerRadius) {
+            mRingCenterRadius = centerRadius;
+        }
+
+        public double getCenterRadius() {
+            return mRingCenterRadius;
+        }
+
+        /**
+         * @param show Set to true to show the arrow head on the progress spinner.
+         */
+        public void setShowArrow(boolean show) {
+            if (mShowArrow != show) {
+                mShowArrow = show;
+                invalidateSelf();
+            }
+        }
+
+        /**
+         * @param scale Set the scale of the arrowhead for the spinner.
+         */
+        public void setArrowScale(float scale) {
+            if (scale != mArrowScale) {
+                mArrowScale = scale;
+                invalidateSelf();
+            }
+        }
+
+        /**
+         * @return The amount the progress spinner is currently rotated, between [0..1].
+         */
+        public float getStartingRotation() {
+            return mStartingRotation;
+        }
+
+        /**
+         * If the start / end trim are offset to begin with, store them so that
+         * animation starts from that offset.
+         */
+        public void storeOriginals() {
+            mStartingStartTrim = mStartTrim;
+            mStartingEndTrim = mEndTrim;
+            mStartingRotation = mRotation;
+        }
+
+        /**
+         * Reset the progress spinner to default rotation, start and end angles.
+         */
+        public void resetOriginals() {
+            mStartingStartTrim = 0;
+            mStartingEndTrim = 0;
+            mStartingRotation = 0;
+            setStartTrim(0);
+            setEndTrim(0);
+            setRotation(0);
+        }
+
+        private void invalidateSelf() {
+            mCallback.invalidateDrawable(null);
+        }
+    }
+}
diff --git a/core-ui/java/android/support/v4/widget/NestedScrollView.java b/core-ui/java/android/support/v4/widget/NestedScrollView.java
new file mode 100644
index 0000000..fb978ae
--- /dev/null
+++ b/core-ui/java/android/support/v4/widget/NestedScrollView.java
@@ -0,0 +1,1950 @@
+/*
+ * Copyright (C) 2015 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 android.support.v4.widget;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.Canvas;
+import android.graphics.Rect;
+import android.os.Bundle;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.support.v4.view.AccessibilityDelegateCompat;
+import android.support.v4.view.InputDeviceCompat;
+import android.support.v4.view.MotionEventCompat;
+import android.support.v4.view.NestedScrollingChild;
+import android.support.v4.view.NestedScrollingChildHelper;
+import android.support.v4.view.NestedScrollingParent;
+import android.support.v4.view.NestedScrollingParentHelper;
+import android.support.v4.view.ScrollingView;
+import android.support.v4.view.VelocityTrackerCompat;
+import android.support.v4.view.ViewCompat;
+import android.support.v4.view.accessibility.AccessibilityEventCompat;
+import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat;
+import android.support.v4.view.accessibility.AccessibilityRecordCompat;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.util.TypedValue;
+import android.view.FocusFinder;
+import android.view.KeyEvent;
+import android.view.MotionEvent;
+import android.view.VelocityTracker;
+import android.view.View;
+import android.view.ViewConfiguration;
+import android.view.ViewGroup;
+import android.view.ViewParent;
+import android.view.accessibility.AccessibilityEvent;
+import android.view.animation.AnimationUtils;
+import android.widget.FrameLayout;
+import android.widget.ScrollView;
+
+import java.util.List;
+
+/**
+ * NestedScrollView is just like {@link android.widget.ScrollView}, but it supports acting
+ * as both a nested scrolling parent and child on both new and old versions of Android.
+ * Nested scrolling is enabled by default.
+ */
+public class NestedScrollView extends FrameLayout implements NestedScrollingParent,
+        NestedScrollingChild, ScrollingView {
+    static final int ANIMATED_SCROLL_GAP = 250;
+
+    static final float MAX_SCROLL_FACTOR = 0.5f;
+
+    private static final String TAG = "NestedScrollView";
+
+    /**
+     * Interface definition for a callback to be invoked when the scroll
+     * X or Y positions of a view change.
+     *
+     * <p>This version of the interface works on all versions of Android, back to API v4.</p>
+     *
+     * @see #setOnScrollChangeListener(OnScrollChangeListener)
+     */
+    public interface OnScrollChangeListener {
+        /**
+         * Called when the scroll position of a view changes.
+         *
+         * @param v The view whose scroll position has changed.
+         * @param scrollX Current horizontal scroll origin.
+         * @param scrollY Current vertical scroll origin.
+         * @param oldScrollX Previous horizontal scroll origin.
+         * @param oldScrollY Previous vertical scroll origin.
+         */
+        void onScrollChange(NestedScrollView v, int scrollX, int scrollY,
+                int oldScrollX, int oldScrollY);
+    }
+
+    private long mLastScroll;
+
+    private final Rect mTempRect = new Rect();
+    private ScrollerCompat mScroller;
+    private EdgeEffectCompat mEdgeGlowTop;
+    private EdgeEffectCompat mEdgeGlowBottom;
+
+    /**
+     * Position of the last motion event.
+     */
+    private int mLastMotionY;
+
+    /**
+     * True when the layout has changed but the traversal has not come through yet.
+     * Ideally the view hierarchy would keep track of this for us.
+     */
+    private boolean mIsLayoutDirty = true;
+    private boolean mIsLaidOut = false;
+
+    /**
+     * The child to give focus to in the event that a child has requested focus while the
+     * layout is dirty. This prevents the scroll from being wrong if the child has not been
+     * laid out before requesting focus.
+     */
+    private View mChildToScrollTo = null;
+
+    /**
+     * True if the user is currently dragging this ScrollView around. This is
+     * not the same as 'is being flinged', which can be checked by
+     * mScroller.isFinished() (flinging begins when the user lifts his finger).
+     */
+    private boolean mIsBeingDragged = false;
+
+    /**
+     * Determines speed during touch scrolling
+     */
+    private VelocityTracker mVelocityTracker;
+
+    /**
+     * When set to true, the scroll view measure its child to make it fill the currently
+     * visible area.
+     */
+    private boolean mFillViewport;
+
+    /**
+     * Whether arrow scrolling is animated.
+     */
+    private boolean mSmoothScrollingEnabled = true;
+
+    private int mTouchSlop;
+    private int mMinimumVelocity;
+    private int mMaximumVelocity;
+
+    /**
+     * ID of the active pointer. This is used to retain consistency during
+     * drags/flings if multiple pointers are used.
+     */
+    private int mActivePointerId = INVALID_POINTER;
+
+    /**
+     * Used during scrolling to retrieve the new offset within the window.
+     */
+    private final int[] mScrollOffset = new int[2];
+    private final int[] mScrollConsumed = new int[2];
+    private int mNestedYOffset;
+
+    /**
+     * Sentinel value for no current active pointer.
+     * Used by {@link #mActivePointerId}.
+     */
+    private static final int INVALID_POINTER = -1;
+
+    private SavedState mSavedState;
+
+    private static final AccessibilityDelegate ACCESSIBILITY_DELEGATE = new AccessibilityDelegate();
+
+    private static final int[] SCROLLVIEW_STYLEABLE = new int[] {
+            android.R.attr.fillViewport
+    };
+
+    private final NestedScrollingParentHelper mParentHelper;
+    private final NestedScrollingChildHelper mChildHelper;
+
+    private float mVerticalScrollFactor;
+
+    private OnScrollChangeListener mOnScrollChangeListener;
+
+    public NestedScrollView(Context context) {
+        this(context, null);
+    }
+
+    public NestedScrollView(Context context, AttributeSet attrs) {
+        this(context, attrs, 0);
+    }
+
+    public NestedScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+        initScrollView();
+
+        final TypedArray a = context.obtainStyledAttributes(
+                attrs, SCROLLVIEW_STYLEABLE, defStyleAttr, 0);
+
+        setFillViewport(a.getBoolean(0, false));
+
+        a.recycle();
+
+        mParentHelper = new NestedScrollingParentHelper(this);
+        mChildHelper = new NestedScrollingChildHelper(this);
+
+        // ...because why else would you be using this widget?
+        setNestedScrollingEnabled(true);
+
+        ViewCompat.setAccessibilityDelegate(this, ACCESSIBILITY_DELEGATE);
+    }
+
+    // NestedScrollingChild
+
+    @Override
+    public void setNestedScrollingEnabled(boolean enabled) {
+        mChildHelper.setNestedScrollingEnabled(enabled);
+    }
+
+    @Override
+    public boolean isNestedScrollingEnabled() {
+        return mChildHelper.isNestedScrollingEnabled();
+    }
+
+    @Override
+    public boolean startNestedScroll(int axes) {
+        return mChildHelper.startNestedScroll(axes);
+    }
+
+    @Override
+    public void stopNestedScroll() {
+        mChildHelper.stopNestedScroll();
+    }
+
+    @Override
+    public boolean hasNestedScrollingParent() {
+        return mChildHelper.hasNestedScrollingParent();
+    }
+
+    @Override
+    public boolean dispatchNestedScroll(int dxConsumed, int dyConsumed, int dxUnconsumed,
+            int dyUnconsumed, int[] offsetInWindow) {
+        return mChildHelper.dispatchNestedScroll(dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed,
+                offsetInWindow);
+    }
+
+    @Override
+    public boolean dispatchNestedPreScroll(int dx, int dy, int[] consumed, int[] offsetInWindow) {
+        return mChildHelper.dispatchNestedPreScroll(dx, dy, consumed, offsetInWindow);
+    }
+
+    @Override
+    public boolean dispatchNestedFling(float velocityX, float velocityY, boolean consumed) {
+        return mChildHelper.dispatchNestedFling(velocityX, velocityY, consumed);
+    }
+
+    @Override
+    public boolean dispatchNestedPreFling(float velocityX, float velocityY) {
+        return mChildHelper.dispatchNestedPreFling(velocityX, velocityY);
+    }
+
+    // NestedScrollingParent
+
+    @Override
+    public boolean onStartNestedScroll(View child, View target, int nestedScrollAxes) {
+        return (nestedScrollAxes & ViewCompat.SCROLL_AXIS_VERTICAL) != 0;
+    }
+
+    @Override
+    public void onNestedScrollAccepted(View child, View target, int nestedScrollAxes) {
+        mParentHelper.onNestedScrollAccepted(child, target, nestedScrollAxes);
+        startNestedScroll(ViewCompat.SCROLL_AXIS_VERTICAL);
+    }
+
+    @Override
+    public void onStopNestedScroll(View target) {
+        mParentHelper.onStopNestedScroll(target);
+        stopNestedScroll();
+    }
+
+    @Override
+    public void onNestedScroll(View target, int dxConsumed, int dyConsumed, int dxUnconsumed,
+            int dyUnconsumed) {
+        final int oldScrollY = getScrollY();
+        scrollBy(0, dyUnconsumed);
+        final int myConsumed = getScrollY() - oldScrollY;
+        final int myUnconsumed = dyUnconsumed - myConsumed;
+        dispatchNestedScroll(0, myConsumed, 0, myUnconsumed, null);
+    }
+
+    @Override
+    public void onNestedPreScroll(View target, int dx, int dy, int[] consumed) {
+        dispatchNestedPreScroll(dx, dy, consumed, null);
+    }
+
+    @Override
+    public boolean onNestedFling(View target, float velocityX, float velocityY, boolean consumed) {
+        if (!consumed) {
+            flingWithNestedDispatch((int) velocityY);
+            return true;
+        }
+        return false;
+    }
+
+    @Override
+    public boolean onNestedPreFling(View target, float velocityX, float velocityY) {
+        return dispatchNestedPreFling(velocityX, velocityY);
+    }
+
+    @Override
+    public int getNestedScrollAxes() {
+        return mParentHelper.getNestedScrollAxes();
+    }
+
+    // ScrollView import
+
+    public boolean shouldDelayChildPressedState() {
+        return true;
+    }
+
+    @Override
+    protected float getTopFadingEdgeStrength() {
+        if (getChildCount() == 0) {
+            return 0.0f;
+        }
+
+        final int length = getVerticalFadingEdgeLength();
+        final int scrollY = getScrollY();
+        if (scrollY < length) {
+            return scrollY / (float) length;
+        }
+
+        return 1.0f;
+    }
+
+    @Override
+    protected float getBottomFadingEdgeStrength() {
+        if (getChildCount() == 0) {
+            return 0.0f;
+        }
+
+        final int length = getVerticalFadingEdgeLength();
+        final int bottomEdge = getHeight() - getPaddingBottom();
+        final int span = getChildAt(0).getBottom() - getScrollY() - bottomEdge;
+        if (span < length) {
+            return span / (float) length;
+        }
+
+        return 1.0f;
+    }
+
+    /**
+     * @return The maximum amount this scroll view will scroll in response to
+     *   an arrow event.
+     */
+    public int getMaxScrollAmount() {
+        return (int) (MAX_SCROLL_FACTOR * getHeight());
+    }
+
+    private void initScrollView() {
+        mScroller = ScrollerCompat.create(getContext(), null);
+        setFocusable(true);
+        setDescendantFocusability(FOCUS_AFTER_DESCENDANTS);
+        setWillNotDraw(false);
+        final ViewConfiguration configuration = ViewConfiguration.get(getContext());
+        mTouchSlop = configuration.getScaledTouchSlop();
+        mMinimumVelocity = configuration.getScaledMinimumFlingVelocity();
+        mMaximumVelocity = configuration.getScaledMaximumFlingVelocity();
+    }
+
+    @Override
+    public void addView(View child) {
+        if (getChildCount() > 0) {
+            throw new IllegalStateException("ScrollView can host only one direct child");
+        }
+
+        super.addView(child);
+    }
+
+    @Override
+    public void addView(View child, int index) {
+        if (getChildCount() > 0) {
+            throw new IllegalStateException("ScrollView can host only one direct child");
+        }
+
+        super.addView(child, index);
+    }
+
+    @Override
+    public void addView(View child, ViewGroup.LayoutParams params) {
+        if (getChildCount() > 0) {
+            throw new IllegalStateException("ScrollView can host only one direct child");
+        }
+
+        super.addView(child, params);
+    }
+
+    @Override
+    public void addView(View child, int index, ViewGroup.LayoutParams params) {
+        if (getChildCount() > 0) {
+            throw new IllegalStateException("ScrollView can host only one direct child");
+        }
+
+        super.addView(child, index, params);
+    }
+
+    /**
+     * Register a callback to be invoked when the scroll X or Y positions of
+     * this view change.
+     * <p>This version of the method works on all versions of Android, back to API v4.</p>
+     *
+     * @param l The listener to notify when the scroll X or Y position changes.
+     * @see android.view.View#getScrollX()
+     * @see android.view.View#getScrollY()
+     */
+    public void setOnScrollChangeListener(OnScrollChangeListener l) {
+        mOnScrollChangeListener = l;
+    }
+
+    /**
+     * @return Returns true this ScrollView can be scrolled
+     */
+    private boolean canScroll() {
+        View child = getChildAt(0);
+        if (child != null) {
+            int childHeight = child.getHeight();
+            return getHeight() < childHeight + getPaddingTop() + getPaddingBottom();
+        }
+        return false;
+    }
+
+    /**
+     * Indicates whether this ScrollView's content is stretched to fill the viewport.
+     *
+     * @return True if the content fills the viewport, false otherwise.
+     *
+     * @attr name android:fillViewport
+     */
+    public boolean isFillViewport() {
+        return mFillViewport;
+    }
+
+    /**
+     * Set whether this ScrollView should stretch its content height to fill the viewport or not.
+     *
+     * @param fillViewport True to stretch the content's height to the viewport's
+     *        boundaries, false otherwise.
+     *
+     * @attr name android:fillViewport
+     */
+    public void setFillViewport(boolean fillViewport) {
+        if (fillViewport != mFillViewport) {
+            mFillViewport = fillViewport;
+            requestLayout();
+        }
+    }
+
+    /**
+     * @return Whether arrow scrolling will animate its transition.
+     */
+    public boolean isSmoothScrollingEnabled() {
+        return mSmoothScrollingEnabled;
+    }
+
+    /**
+     * Set whether arrow scrolling will animate its transition.
+     * @param smoothScrollingEnabled whether arrow scrolling will animate its transition
+     */
+    public void setSmoothScrollingEnabled(boolean smoothScrollingEnabled) {
+        mSmoothScrollingEnabled = smoothScrollingEnabled;
+    }
+
+    @Override
+    protected void onScrollChanged(int l, int t, int oldl, int oldt) {
+        super.onScrollChanged(l, t, oldl, oldt);
+
+        if (mOnScrollChangeListener != null) {
+            mOnScrollChangeListener.onScrollChange(this, l, t, oldl, oldt);
+        }
+    }
+
+    @Override
+    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+
+        if (!mFillViewport) {
+            return;
+        }
+
+        final int heightMode = MeasureSpec.getMode(heightMeasureSpec);
+        if (heightMode == MeasureSpec.UNSPECIFIED) {
+            return;
+        }
+
+        if (getChildCount() > 0) {
+            final View child = getChildAt(0);
+            int height = getMeasuredHeight();
+            if (child.getMeasuredHeight() < height) {
+                final FrameLayout.LayoutParams lp = (LayoutParams) child.getLayoutParams();
+
+                int childWidthMeasureSpec = getChildMeasureSpec(widthMeasureSpec,
+                        getPaddingLeft() + getPaddingRight(), lp.width);
+                height -= getPaddingTop();
+                height -= getPaddingBottom();
+                int childHeightMeasureSpec =
+                        MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);
+
+                child.measure(childWidthMeasureSpec, childHeightMeasureSpec);
+            }
+        }
+    }
+
+    @Override
+    public boolean dispatchKeyEvent(KeyEvent event) {
+        // Let the focused view and/or our descendants get the key first
+        return super.dispatchKeyEvent(event) || executeKeyEvent(event);
+    }
+
+    /**
+     * You can call this function yourself to have the scroll view perform
+     * scrolling from a key event, just as if the event had been dispatched to
+     * it by the view hierarchy.
+     *
+     * @param event The key event to execute.
+     * @return Return true if the event was handled, else false.
+     */
+    public boolean executeKeyEvent(KeyEvent event) {
+        mTempRect.setEmpty();
+
+        if (!canScroll()) {
+            if (isFocused() && event.getKeyCode() != KeyEvent.KEYCODE_BACK) {
+                View currentFocused = findFocus();
+                if (currentFocused == this) currentFocused = null;
+                View nextFocused = FocusFinder.getInstance().findNextFocus(this,
+                        currentFocused, View.FOCUS_DOWN);
+                return nextFocused != null
+                        && nextFocused != this
+                        && nextFocused.requestFocus(View.FOCUS_DOWN);
+            }
+            return false;
+        }
+
+        boolean handled = false;
+        if (event.getAction() == KeyEvent.ACTION_DOWN) {
+            switch (event.getKeyCode()) {
+                case KeyEvent.KEYCODE_DPAD_UP:
+                    if (!event.isAltPressed()) {
+                        handled = arrowScroll(View.FOCUS_UP);
+                    } else {
+                        handled = fullScroll(View.FOCUS_UP);
+                    }
+                    break;
+                case KeyEvent.KEYCODE_DPAD_DOWN:
+                    if (!event.isAltPressed()) {
+                        handled = arrowScroll(View.FOCUS_DOWN);
+                    } else {
+                        handled = fullScroll(View.FOCUS_DOWN);
+                    }
+                    break;
+                case KeyEvent.KEYCODE_SPACE:
+                    pageScroll(event.isShiftPressed() ? View.FOCUS_UP : View.FOCUS_DOWN);
+                    break;
+            }
+        }
+
+        return handled;
+    }
+
+    private boolean inChild(int x, int y) {
+        if (getChildCount() > 0) {
+            final int scrollY = getScrollY();
+            final View child = getChildAt(0);
+            return !(y < child.getTop() - scrollY
+                    || y >= child.getBottom() - scrollY
+                    || x < child.getLeft()
+                    || x >= child.getRight());
+        }
+        return false;
+    }
+
+    private void initOrResetVelocityTracker() {
+        if (mVelocityTracker == null) {
+            mVelocityTracker = VelocityTracker.obtain();
+        } else {
+            mVelocityTracker.clear();
+        }
+    }
+
+    private void initVelocityTrackerIfNotExists() {
+        if (mVelocityTracker == null) {
+            mVelocityTracker = VelocityTracker.obtain();
+        }
+    }
+
+    private void recycleVelocityTracker() {
+        if (mVelocityTracker != null) {
+            mVelocityTracker.recycle();
+            mVelocityTracker = null;
+        }
+    }
+
+    @Override
+    public void requestDisallowInterceptTouchEvent(boolean disallowIntercept) {
+        if (disallowIntercept) {
+            recycleVelocityTracker();
+        }
+        super.requestDisallowInterceptTouchEvent(disallowIntercept);
+    }
+
+
+    @Override
+    public boolean onInterceptTouchEvent(MotionEvent ev) {
+        /*
+         * This method JUST determines whether we want to intercept the motion.
+         * If we return true, onMotionEvent will be called and we do the actual
+         * scrolling there.
+         */
+
+        /*
+        * Shortcut the most recurring case: the user is in the dragging
+        * state and he is moving his finger.  We want to intercept this
+        * motion.
+        */
+        final int action = ev.getAction();
+        if ((action == MotionEvent.ACTION_MOVE) && (mIsBeingDragged)) {
+            return true;
+        }
+
+        switch (action & MotionEventCompat.ACTION_MASK) {
+            case MotionEvent.ACTION_MOVE: {
+                /*
+                 * mIsBeingDragged == false, otherwise the shortcut would have caught it. Check
+                 * whether the user has moved far enough from his original down touch.
+                 */
+
+                /*
+                * Locally do absolute value. mLastMotionY is set to the y value
+                * of the down event.
+                */
+                final int activePointerId = mActivePointerId;
+                if (activePointerId == INVALID_POINTER) {
+                    // If we don't have a valid id, the touch down wasn't on content.
+                    break;
+                }
+
+                final int pointerIndex = ev.findPointerIndex(activePointerId);
+                if (pointerIndex == -1) {
+                    Log.e(TAG, "Invalid pointerId=" + activePointerId
+                            + " in onInterceptTouchEvent");
+                    break;
+                }
+
+                final int y = (int) ev.getY(pointerIndex);
+                final int yDiff = Math.abs(y - mLastMotionY);
+                if (yDiff > mTouchSlop
+                        && (getNestedScrollAxes() & ViewCompat.SCROLL_AXIS_VERTICAL) == 0) {
+                    mIsBeingDragged = true;
+                    mLastMotionY = y;
+                    initVelocityTrackerIfNotExists();
+                    mVelocityTracker.addMovement(ev);
+                    mNestedYOffset = 0;
+                    final ViewParent parent = getParent();
+                    if (parent != null) {
+                        parent.requestDisallowInterceptTouchEvent(true);
+                    }
+                }
+                break;
+            }
+
+            case MotionEvent.ACTION_DOWN: {
+                final int y = (int) ev.getY();
+                if (!inChild((int) ev.getX(), (int) y)) {
+                    mIsBeingDragged = false;
+                    recycleVelocityTracker();
+                    break;
+                }
+
+                /*
+                 * Remember location of down touch.
+                 * ACTION_DOWN always refers to pointer index 0.
+                 */
+                mLastMotionY = y;
+                mActivePointerId = ev.getPointerId(0);
+
+                initOrResetVelocityTracker();
+                mVelocityTracker.addMovement(ev);
+                /*
+                 * If being flinged and user touches the screen, initiate drag;
+                 * otherwise don't. mScroller.isFinished should be false when
+                 * being flinged. We need to call computeScrollOffset() first so that
+                 * isFinished() is correct.
+                */
+                mScroller.computeScrollOffset();
+                mIsBeingDragged = !mScroller.isFinished();
+                startNestedScroll(ViewCompat.SCROLL_AXIS_VERTICAL);
+                break;
+            }
+
+            case MotionEvent.ACTION_CANCEL:
+            case MotionEvent.ACTION_UP:
+                /* Release the drag */
+                mIsBeingDragged = false;
+                mActivePointerId = INVALID_POINTER;
+                recycleVelocityTracker();
+                if (mScroller.springBack(getScrollX(), getScrollY(), 0, 0, 0, getScrollRange())) {
+                    ViewCompat.postInvalidateOnAnimation(this);
+                }
+                stopNestedScroll();
+                break;
+            case MotionEventCompat.ACTION_POINTER_UP:
+                onSecondaryPointerUp(ev);
+                break;
+        }
+
+        /*
+        * The only time we want to intercept motion events is if we are in the
+        * drag mode.
+        */
+        return mIsBeingDragged;
+    }
+
+    @Override
+    public boolean onTouchEvent(MotionEvent ev) {
+        initVelocityTrackerIfNotExists();
+
+        MotionEvent vtev = MotionEvent.obtain(ev);
+
+        final int actionMasked = MotionEventCompat.getActionMasked(ev);
+
+        if (actionMasked == MotionEvent.ACTION_DOWN) {
+            mNestedYOffset = 0;
+        }
+        vtev.offsetLocation(0, mNestedYOffset);
+
+        switch (actionMasked) {
+            case MotionEvent.ACTION_DOWN: {
+                if (getChildCount() == 0) {
+                    return false;
+                }
+                if ((mIsBeingDragged = !mScroller.isFinished())) {
+                    final ViewParent parent = getParent();
+                    if (parent != null) {
+                        parent.requestDisallowInterceptTouchEvent(true);
+                    }
+                }
+
+                /*
+                 * If being flinged and user touches, stop the fling. isFinished
+                 * will be false if being flinged.
+                 */
+                if (!mScroller.isFinished()) {
+                    mScroller.abortAnimation();
+                }
+
+                // Remember where the motion event started
+                mLastMotionY = (int) ev.getY();
+                mActivePointerId = ev.getPointerId(0);
+                startNestedScroll(ViewCompat.SCROLL_AXIS_VERTICAL);
+                break;
+            }
+            case MotionEvent.ACTION_MOVE:
+                final int activePointerIndex = ev.findPointerIndex(mActivePointerId);
+                if (activePointerIndex == -1) {
+                    Log.e(TAG, "Invalid pointerId=" + mActivePointerId + " in onTouchEvent");
+                    break;
+                }
+
+                final int y = (int) ev.getY(activePointerIndex);
+                int deltaY = mLastMotionY - y;
+                if (dispatchNestedPreScroll(0, deltaY, mScrollConsumed, mScrollOffset)) {
+                    deltaY -= mScrollConsumed[1];
+                    vtev.offsetLocation(0, mScrollOffset[1]);
+                    mNestedYOffset += mScrollOffset[1];
+                }
+                if (!mIsBeingDragged && Math.abs(deltaY) > mTouchSlop) {
+                    final ViewParent parent = getParent();
+                    if (parent != null) {
+                        parent.requestDisallowInterceptTouchEvent(true);
+                    }
+                    mIsBeingDragged = true;
+                    if (deltaY > 0) {
+                        deltaY -= mTouchSlop;
+                    } else {
+                        deltaY += mTouchSlop;
+                    }
+                }
+                if (mIsBeingDragged) {
+                    // Scroll to follow the motion event
+                    mLastMotionY = y - mScrollOffset[1];
+
+                    final int oldY = getScrollY();
+                    final int range = getScrollRange();
+                    final int overscrollMode = ViewCompat.getOverScrollMode(this);
+                    boolean canOverscroll = overscrollMode == ViewCompat.OVER_SCROLL_ALWAYS ||
+                            (overscrollMode == ViewCompat.OVER_SCROLL_IF_CONTENT_SCROLLS &&
+                                    range > 0);
+
+                    // Calling overScrollByCompat will call onOverScrolled, which
+                    // calls onScrollChanged if applicable.
+                    if (overScrollByCompat(0, deltaY, 0, getScrollY(), 0, range, 0,
+                            0, true) && !hasNestedScrollingParent()) {
+                        // Break our velocity if we hit a scroll barrier.
+                        mVelocityTracker.clear();
+                    }
+
+                    final int scrolledDeltaY = getScrollY() - oldY;
+                    final int unconsumedY = deltaY - scrolledDeltaY;
+                    if (dispatchNestedScroll(0, scrolledDeltaY, 0, unconsumedY, mScrollOffset)) {
+                        mLastMotionY -= mScrollOffset[1];
+                        vtev.offsetLocation(0, mScrollOffset[1]);
+                        mNestedYOffset += mScrollOffset[1];
+                    } else if (canOverscroll) {
+                        ensureGlows();
+                        final int pulledToY = oldY + deltaY;
+                        if (pulledToY < 0) {
+                            mEdgeGlowTop.onPull((float) deltaY / getHeight(),
+                                    ev.getX(activePointerIndex) / getWidth());
+                            if (!mEdgeGlowBottom.isFinished()) {
+                                mEdgeGlowBottom.onRelease();
+                            }
+                        } else if (pulledToY > range) {
+                            mEdgeGlowBottom.onPull((float) deltaY / getHeight(),
+                                    1.f - ev.getX(activePointerIndex)
+                                            / getWidth());
+                            if (!mEdgeGlowTop.isFinished()) {
+                                mEdgeGlowTop.onRelease();
+                            }
+                        }
+                        if (mEdgeGlowTop != null
+                                && (!mEdgeGlowTop.isFinished() || !mEdgeGlowBottom.isFinished())) {
+                            ViewCompat.postInvalidateOnAnimation(this);
+                        }
+                    }
+                }
+                break;
+            case MotionEvent.ACTION_UP:
+                if (mIsBeingDragged) {
+                    final VelocityTracker velocityTracker = mVelocityTracker;
+                    velocityTracker.computeCurrentVelocity(1000, mMaximumVelocity);
+                    int initialVelocity = (int) VelocityTrackerCompat.getYVelocity(velocityTracker,
+                            mActivePointerId);
+
+                    if ((Math.abs(initialVelocity) > mMinimumVelocity)) {
+                        flingWithNestedDispatch(-initialVelocity);
+                    } else if (mScroller.springBack(getScrollX(), getScrollY(), 0, 0, 0,
+                            getScrollRange())) {
+                        ViewCompat.postInvalidateOnAnimation(this);
+                    }
+                }
+                mActivePointerId = INVALID_POINTER;
+                endDrag();
+                break;
+            case MotionEvent.ACTION_CANCEL:
+                if (mIsBeingDragged && getChildCount() > 0) {
+                    if (mScroller.springBack(getScrollX(), getScrollY(), 0, 0, 0,
+                            getScrollRange())) {
+                        ViewCompat.postInvalidateOnAnimation(this);
+                    }
+                }
+                mActivePointerId = INVALID_POINTER;
+                endDrag();
+                break;
+            case MotionEventCompat.ACTION_POINTER_DOWN: {
+                final int index = MotionEventCompat.getActionIndex(ev);
+                mLastMotionY = (int) ev.getY(index);
+                mActivePointerId = ev.getPointerId(index);
+                break;
+            }
+            case MotionEventCompat.ACTION_POINTER_UP:
+                onSecondaryPointerUp(ev);
+                mLastMotionY = (int) ev.getY(ev.findPointerIndex(mActivePointerId));
+                break;
+        }
+
+        if (mVelocityTracker != null) {
+            mVelocityTracker.addMovement(vtev);
+        }
+        vtev.recycle();
+        return true;
+    }
+
+    private void onSecondaryPointerUp(MotionEvent ev) {
+        final int pointerIndex = (ev.getAction() & MotionEventCompat.ACTION_POINTER_INDEX_MASK) >>
+                MotionEventCompat.ACTION_POINTER_INDEX_SHIFT;
+        final int pointerId = ev.getPointerId(pointerIndex);
+        if (pointerId == mActivePointerId) {
+            // This was our active pointer going up. Choose a new
+            // active pointer and adjust accordingly.
+            // TODO: Make this decision more intelligent.
+            final int newPointerIndex = pointerIndex == 0 ? 1 : 0;
+            mLastMotionY = (int) ev.getY(newPointerIndex);
+            mActivePointerId = ev.getPointerId(newPointerIndex);
+            if (mVelocityTracker != null) {
+                mVelocityTracker.clear();
+            }
+        }
+    }
+
+    public boolean onGenericMotionEvent(MotionEvent event) {
+        if ((event.getSource() & InputDeviceCompat.SOURCE_CLASS_POINTER) != 0) {
+            switch (event.getAction()) {
+                case MotionEventCompat.ACTION_SCROLL: {
+                    if (!mIsBeingDragged) {
+                        final float vscroll = MotionEventCompat.getAxisValue(event,
+                                MotionEventCompat.AXIS_VSCROLL);
+                        if (vscroll != 0) {
+                            final int delta = (int) (vscroll * getVerticalScrollFactorCompat());
+                            final int range = getScrollRange();
+                            int oldScrollY = getScrollY();
+                            int newScrollY = oldScrollY - delta;
+                            if (newScrollY < 0) {
+                                newScrollY = 0;
+                            } else if (newScrollY > range) {
+                                newScrollY = range;
+                            }
+                            if (newScrollY != oldScrollY) {
+                                super.scrollTo(getScrollX(), newScrollY);
+                                return true;
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        return false;
+    }
+
+    private float getVerticalScrollFactorCompat() {
+        if (mVerticalScrollFactor == 0) {
+            TypedValue outValue = new TypedValue();
+            final Context context = getContext();
+            if (!context.getTheme().resolveAttribute(
+                    android.R.attr.listPreferredItemHeight, outValue, true)) {
+                throw new IllegalStateException(
+                        "Expected theme to define listPreferredItemHeight.");
+            }
+            mVerticalScrollFactor = outValue.getDimension(
+                    context.getResources().getDisplayMetrics());
+        }
+        return mVerticalScrollFactor;
+    }
+
+    @Override
+    protected void onOverScrolled(int scrollX, int scrollY,
+            boolean clampedX, boolean clampedY) {
+        super.scrollTo(scrollX, scrollY);
+    }
+
+    boolean overScrollByCompat(int deltaX, int deltaY,
+            int scrollX, int scrollY,
+            int scrollRangeX, int scrollRangeY,
+            int maxOverScrollX, int maxOverScrollY,
+            boolean isTouchEvent) {
+        final int overScrollMode = ViewCompat.getOverScrollMode(this);
+        final boolean canScrollHorizontal =
+                computeHorizontalScrollRange() > computeHorizontalScrollExtent();
+        final boolean canScrollVertical =
+                computeVerticalScrollRange() > computeVerticalScrollExtent();
+        final boolean overScrollHorizontal = overScrollMode == ViewCompat.OVER_SCROLL_ALWAYS ||
+                (overScrollMode == ViewCompat.OVER_SCROLL_IF_CONTENT_SCROLLS && canScrollHorizontal);
+        final boolean overScrollVertical = overScrollMode == ViewCompat.OVER_SCROLL_ALWAYS ||
+                (overScrollMode == ViewCompat.OVER_SCROLL_IF_CONTENT_SCROLLS && canScrollVertical);
+
+        int newScrollX = scrollX + deltaX;
+        if (!overScrollHorizontal) {
+            maxOverScrollX = 0;
+        }
+
+        int newScrollY = scrollY + deltaY;
+        if (!overScrollVertical) {
+            maxOverScrollY = 0;
+        }
+
+        // Clamp values if at the limits and record
+        final int left = -maxOverScrollX;
+        final int right = maxOverScrollX + scrollRangeX;
+        final int top = -maxOverScrollY;
+        final int bottom = maxOverScrollY + scrollRangeY;
+
+        boolean clampedX = false;
+        if (newScrollX > right) {
+            newScrollX = right;
+            clampedX = true;
+        } else if (newScrollX < left) {
+            newScrollX = left;
+            clampedX = true;
+        }
+
+        boolean clampedY = false;
+        if (newScrollY > bottom) {
+            newScrollY = bottom;
+            clampedY = true;
+        } else if (newScrollY < top) {
+            newScrollY = top;
+            clampedY = true;
+        }
+
+        if (clampedY) {
+            mScroller.springBack(newScrollX, newScrollY, 0, 0, 0, getScrollRange());
+        }
+
+        onOverScrolled(newScrollX, newScrollY, clampedX, clampedY);
+
+        return clampedX || clampedY;
+    }
+
+    private int getScrollRange() {
+        int scrollRange = 0;
+        if (getChildCount() > 0) {
+            View child = getChildAt(0);
+            scrollRange = Math.max(0,
+                    child.getHeight() - (getHeight() - getPaddingBottom() - getPaddingTop()));
+        }
+        return scrollRange;
+    }
+
+    /**
+     * <p>
+     * Finds the next focusable component that fits in the specified bounds.
+     * </p>
+     *
+     * @param topFocus look for a candidate is the one at the top of the bounds
+     *                 if topFocus is true, or at the bottom of the bounds if topFocus is
+     *                 false
+     * @param top      the top offset of the bounds in which a focusable must be
+     *                 found
+     * @param bottom   the bottom offset of the bounds in which a focusable must
+     *                 be found
+     * @return the next focusable component in the bounds or null if none can
+     *         be found
+     */
+    private View findFocusableViewInBounds(boolean topFocus, int top, int bottom) {
+
+        List<View> focusables = getFocusables(View.FOCUS_FORWARD);
+        View focusCandidate = null;
+
+        /*
+         * A fully contained focusable is one where its top is below the bound's
+         * top, and its bottom is above the bound's bottom. A partially
+         * contained focusable is one where some part of it is within the
+         * bounds, but it also has some part that is not within bounds.  A fully contained
+         * focusable is preferred to a partially contained focusable.
+         */
+        boolean foundFullyContainedFocusable = false;
+
+        int count = focusables.size();
+        for (int i = 0; i < count; i++) {
+            View view = focusables.get(i);
+            int viewTop = view.getTop();
+            int viewBottom = view.getBottom();
+
+            if (top < viewBottom && viewTop < bottom) {
+                /*
+                 * the focusable is in the target area, it is a candidate for
+                 * focusing
+                 */
+
+                final boolean viewIsFullyContained = (top < viewTop) &&
+                        (viewBottom < bottom);
+
+                if (focusCandidate == null) {
+                    /* No candidate, take this one */
+                    focusCandidate = view;
+                    foundFullyContainedFocusable = viewIsFullyContained;
+                } else {
+                    final boolean viewIsCloserToBoundary =
+                            (topFocus && viewTop < focusCandidate.getTop()) ||
+                                    (!topFocus && viewBottom > focusCandidate
+                                            .getBottom());
+
+                    if (foundFullyContainedFocusable) {
+                        if (viewIsFullyContained && viewIsCloserToBoundary) {
+                            /*
+                             * We're dealing with only fully contained views, so
+                             * it has to be closer to the boundary to beat our
+                             * candidate
+                             */
+                            focusCandidate = view;
+                        }
+                    } else {
+                        if (viewIsFullyContained) {
+                            /* Any fully contained view beats a partially contained view */
+                            focusCandidate = view;
+                            foundFullyContainedFocusable = true;
+                        } else if (viewIsCloserToBoundary) {
+                            /*
+                             * Partially contained view beats another partially
+                             * contained view if it's closer
+                             */
+                            focusCandidate = view;
+                        }
+                    }
+                }
+            }
+        }
+
+        return focusCandidate;
+    }
+
+    /**
+     * <p>Handles scrolling in response to a "page up/down" shortcut press. This
+     * method will scroll the view by one page up or down and give the focus
+     * to the topmost/bottommost component in the new visible area. If no
+     * component is a good candidate for focus, this scrollview reclaims the
+     * focus.</p>
+     *
+     * @param direction the scroll direction: {@link android.view.View#FOCUS_UP}
+     *                  to go one page up or
+     *                  {@link android.view.View#FOCUS_DOWN} to go one page down
+     * @return true if the key event is consumed by this method, false otherwise
+     */
+    public boolean pageScroll(int direction) {
+        boolean down = direction == View.FOCUS_DOWN;
+        int height = getHeight();
+
+        if (down) {
+            mTempRect.top = getScrollY() + height;
+            int count = getChildCount();
+            if (count > 0) {
+                View view = getChildAt(count - 1);
+                if (mTempRect.top + height > view.getBottom()) {
+                    mTempRect.top = view.getBottom() - height;
+                }
+            }
+        } else {
+            mTempRect.top = getScrollY() - height;
+            if (mTempRect.top < 0) {
+                mTempRect.top = 0;
+            }
+        }
+        mTempRect.bottom = mTempRect.top + height;
+
+        return scrollAndFocus(direction, mTempRect.top, mTempRect.bottom);
+    }
+
+    /**
+     * <p>Handles scrolling in response to a "home/end" shortcut press. This
+     * method will scroll the view to the top or bottom and give the focus
+     * to the topmost/bottommost component in the new visible area. If no
+     * component is a good candidate for focus, this scrollview reclaims the
+     * focus.</p>
+     *
+     * @param direction the scroll direction: {@link android.view.View#FOCUS_UP}
+     *                  to go the top of the view or
+     *                  {@link android.view.View#FOCUS_DOWN} to go the bottom
+     * @return true if the key event is consumed by this method, false otherwise
+     */
+    public boolean fullScroll(int direction) {
+        boolean down = direction == View.FOCUS_DOWN;
+        int height = getHeight();
+
+        mTempRect.top = 0;
+        mTempRect.bottom = height;
+
+        if (down) {
+            int count = getChildCount();
+            if (count > 0) {
+                View view = getChildAt(count - 1);
+                mTempRect.bottom = view.getBottom() + getPaddingBottom();
+                mTempRect.top = mTempRect.bottom - height;
+            }
+        }
+
+        return scrollAndFocus(direction, mTempRect.top, mTempRect.bottom);
+    }
+
+    /**
+     * <p>Scrolls the view to make the area defined by <code>top</code> and
+     * <code>bottom</code> visible. This method attempts to give the focus
+     * to a component visible in this area. If no component can be focused in
+     * the new visible area, the focus is reclaimed by this ScrollView.</p>
+     *
+     * @param direction the scroll direction: {@link android.view.View#FOCUS_UP}
+     *                  to go upward, {@link android.view.View#FOCUS_DOWN} to downward
+     * @param top       the top offset of the new area to be made visible
+     * @param bottom    the bottom offset of the new area to be made visible
+     * @return true if the key event is consumed by this method, false otherwise
+     */
+    private boolean scrollAndFocus(int direction, int top, int bottom) {
+        boolean handled = true;
+
+        int height = getHeight();
+        int containerTop = getScrollY();
+        int containerBottom = containerTop + height;
+        boolean up = direction == View.FOCUS_UP;
+
+        View newFocused = findFocusableViewInBounds(up, top, bottom);
+        if (newFocused == null) {
+            newFocused = this;
+        }
+
+        if (top >= containerTop && bottom <= containerBottom) {
+            handled = false;
+        } else {
+            int delta = up ? (top - containerTop) : (bottom - containerBottom);
+            doScrollY(delta);
+        }
+
+        if (newFocused != findFocus()) newFocused.requestFocus(direction);
+
+        return handled;
+    }
+
+    /**
+     * Handle scrolling in response to an up or down arrow click.
+     *
+     * @param direction The direction corresponding to the arrow key that was
+     *                  pressed
+     * @return True if we consumed the event, false otherwise
+     */
+    public boolean arrowScroll(int direction) {
+
+        View currentFocused = findFocus();
+        if (currentFocused == this) currentFocused = null;
+
+        View nextFocused = FocusFinder.getInstance().findNextFocus(this, currentFocused, direction);
+
+        final int maxJump = getMaxScrollAmount();
+
+        if (nextFocused != null && isWithinDeltaOfScreen(nextFocused, maxJump, getHeight())) {
+            nextFocused.getDrawingRect(mTempRect);
+            offsetDescendantRectToMyCoords(nextFocused, mTempRect);
+            int scrollDelta = computeScrollDeltaToGetChildRectOnScreen(mTempRect);
+            doScrollY(scrollDelta);
+            nextFocused.requestFocus(direction);
+        } else {
+            // no new focus
+            int scrollDelta = maxJump;
+
+            if (direction == View.FOCUS_UP && getScrollY() < scrollDelta) {
+                scrollDelta = getScrollY();
+            } else if (direction == View.FOCUS_DOWN) {
+                if (getChildCount() > 0) {
+                    int daBottom = getChildAt(0).getBottom();
+                    int screenBottom = getScrollY() + getHeight() - getPaddingBottom();
+                    if (daBottom - screenBottom < maxJump) {
+                        scrollDelta = daBottom - screenBottom;
+                    }
+                }
+            }
+            if (scrollDelta == 0) {
+                return false;
+            }
+            doScrollY(direction == View.FOCUS_DOWN ? scrollDelta : -scrollDelta);
+        }
+
+        if (currentFocused != null && currentFocused.isFocused()
+                && isOffScreen(currentFocused)) {
+            // previously focused item still has focus and is off screen, give
+            // it up (take it back to ourselves)
+            // (also, need to temporarily force FOCUS_BEFORE_DESCENDANTS so we are
+            // sure to
+            // get it)
+            final int descendantFocusability = getDescendantFocusability();  // save
+            setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS);
+            requestFocus();
+            setDescendantFocusability(descendantFocusability);  // restore
+        }
+        return true;
+    }
+
+    /**
+     * @return whether the descendant of this scroll view is scrolled off
+     *  screen.
+     */
+    private boolean isOffScreen(View descendant) {
+        return !isWithinDeltaOfScreen(descendant, 0, getHeight());
+    }
+
+    /**
+     * @return whether the descendant of this scroll view is within delta
+     *  pixels of being on the screen.
+     */
+    private boolean isWithinDeltaOfScreen(View descendant, int delta, int height) {
+        descendant.getDrawingRect(mTempRect);
+        offsetDescendantRectToMyCoords(descendant, mTempRect);
+
+        return (mTempRect.bottom + delta) >= getScrollY()
+                && (mTempRect.top - delta) <= (getScrollY() + height);
+    }
+
+    /**
+     * Smooth scroll by a Y delta
+     *
+     * @param delta the number of pixels to scroll by on the Y axis
+     */
+    private void doScrollY(int delta) {
+        if (delta != 0) {
+            if (mSmoothScrollingEnabled) {
+                smoothScrollBy(0, delta);
+            } else {
+                scrollBy(0, delta);
+            }
+        }
+    }
+
+    /**
+     * Like {@link View#scrollBy}, but scroll smoothly instead of immediately.
+     *
+     * @param dx the number of pixels to scroll by on the X axis
+     * @param dy the number of pixels to scroll by on the Y axis
+     */
+    public final void smoothScrollBy(int dx, int dy) {
+        if (getChildCount() == 0) {
+            // Nothing to do.
+            return;
+        }
+        long duration = AnimationUtils.currentAnimationTimeMillis() - mLastScroll;
+        if (duration > ANIMATED_SCROLL_GAP) {
+            final int height = getHeight() - getPaddingBottom() - getPaddingTop();
+            final int bottom = getChildAt(0).getHeight();
+            final int maxY = Math.max(0, bottom - height);
+            final int scrollY = getScrollY();
+            dy = Math.max(0, Math.min(scrollY + dy, maxY)) - scrollY;
+
+            mScroller.startScroll(getScrollX(), scrollY, 0, dy);
+            ViewCompat.postInvalidateOnAnimation(this);
+        } else {
+            if (!mScroller.isFinished()) {
+                mScroller.abortAnimation();
+            }
+            scrollBy(dx, dy);
+        }
+        mLastScroll = AnimationUtils.currentAnimationTimeMillis();
+    }
+
+    /**
+     * Like {@link #scrollTo}, but scroll smoothly instead of immediately.
+     *
+     * @param x the position where to scroll on the X axis
+     * @param y the position where to scroll on the Y axis
+     */
+    public final void smoothScrollTo(int x, int y) {
+        smoothScrollBy(x - getScrollX(), y - getScrollY());
+    }
+
+    /**
+     * <p>The scroll range of a scroll view is the overall height of all of its
+     * children.</p>
+     * @hide
+     */
+    @Override
+    public int computeVerticalScrollRange() {
+        final int count = getChildCount();
+        final int contentHeight = getHeight() - getPaddingBottom() - getPaddingTop();
+        if (count == 0) {
+            return contentHeight;
+        }
+
+        int scrollRange = getChildAt(0).getBottom();
+        final int scrollY = getScrollY();
+        final int overscrollBottom = Math.max(0, scrollRange - contentHeight);
+        if (scrollY < 0) {
+            scrollRange -= scrollY;
+        } else if (scrollY > overscrollBottom) {
+            scrollRange += scrollY - overscrollBottom;
+        }
+
+        return scrollRange;
+    }
+
+    /** @hide */
+    @Override
+    public int computeVerticalScrollOffset() {
+        return Math.max(0, super.computeVerticalScrollOffset());
+    }
+
+    /** @hide */
+    @Override
+    public int computeVerticalScrollExtent() {
+        return super.computeVerticalScrollExtent();
+    }
+
+    /** @hide */
+    @Override
+    public int computeHorizontalScrollRange() {
+        return super.computeHorizontalScrollRange();
+    }
+
+    /** @hide */
+    @Override
+    public int computeHorizontalScrollOffset() {
+        return super.computeHorizontalScrollOffset();
+    }
+
+    /** @hide */
+    @Override
+    public int computeHorizontalScrollExtent() {
+        return super.computeHorizontalScrollExtent();
+    }
+
+    @Override
+    protected void measureChild(View child, int parentWidthMeasureSpec, int parentHeightMeasureSpec) {
+        ViewGroup.LayoutParams lp = child.getLayoutParams();
+
+        int childWidthMeasureSpec;
+        int childHeightMeasureSpec;
+
+        childWidthMeasureSpec = getChildMeasureSpec(parentWidthMeasureSpec, getPaddingLeft()
+                + getPaddingRight(), lp.width);
+
+        childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
+
+        child.measure(childWidthMeasureSpec, childHeightMeasureSpec);
+    }
+
+    @Override
+    protected void measureChildWithMargins(View child, int parentWidthMeasureSpec, int widthUsed,
+            int parentHeightMeasureSpec, int heightUsed) {
+        final MarginLayoutParams lp = (MarginLayoutParams) child.getLayoutParams();
+
+        final int childWidthMeasureSpec = getChildMeasureSpec(parentWidthMeasureSpec,
+                getPaddingLeft() + getPaddingRight() + lp.leftMargin + lp.rightMargin
+                        + widthUsed, lp.width);
+        final int childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(
+                lp.topMargin + lp.bottomMargin, MeasureSpec.UNSPECIFIED);
+
+        child.measure(childWidthMeasureSpec, childHeightMeasureSpec);
+    }
+
+    @Override
+    public void computeScroll() {
+        if (mScroller.computeScrollOffset()) {
+            int oldX = getScrollX();
+            int oldY = getScrollY();
+            int x = mScroller.getCurrX();
+            int y = mScroller.getCurrY();
+
+            if (oldX != x || oldY != y) {
+                final int range = getScrollRange();
+                final int overscrollMode = ViewCompat.getOverScrollMode(this);
+                final boolean canOverscroll = overscrollMode == ViewCompat.OVER_SCROLL_ALWAYS ||
+                        (overscrollMode == ViewCompat.OVER_SCROLL_IF_CONTENT_SCROLLS && range > 0);
+
+                overScrollByCompat(x - oldX, y - oldY, oldX, oldY, 0, range,
+                        0, 0, false);
+
+                if (canOverscroll) {
+                    ensureGlows();
+                    if (y <= 0 && oldY > 0) {
+                        mEdgeGlowTop.onAbsorb((int) mScroller.getCurrVelocity());
+                    } else if (y >= range && oldY < range) {
+                        mEdgeGlowBottom.onAbsorb((int) mScroller.getCurrVelocity());
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * Scrolls the view to the given child.
+     *
+     * @param child the View to scroll to
+     */
+    private void scrollToChild(View child) {
+        child.getDrawingRect(mTempRect);
+
+        /* Offset from child's local coordinates to ScrollView coordinates */
+        offsetDescendantRectToMyCoords(child, mTempRect);
+
+        int scrollDelta = computeScrollDeltaToGetChildRectOnScreen(mTempRect);
+
+        if (scrollDelta != 0) {
+            scrollBy(0, scrollDelta);
+        }
+    }
+
+    /**
+     * If rect is off screen, scroll just enough to get it (or at least the
+     * first screen size chunk of it) on screen.
+     *
+     * @param rect      The rectangle.
+     * @param immediate True to scroll immediately without animation
+     * @return true if scrolling was performed
+     */
+    private boolean scrollToChildRect(Rect rect, boolean immediate) {
+        final int delta = computeScrollDeltaToGetChildRectOnScreen(rect);
+        final boolean scroll = delta != 0;
+        if (scroll) {
+            if (immediate) {
+                scrollBy(0, delta);
+            } else {
+                smoothScrollBy(0, delta);
+            }
+        }
+        return scroll;
+    }
+
+    /**
+     * Compute the amount to scroll in the Y direction in order to get
+     * a rectangle completely on the screen (or, if taller than the screen,
+     * at least the first screen size chunk of it).
+     *
+     * @param rect The rect.
+     * @return The scroll delta.
+     */
+    protected int computeScrollDeltaToGetChildRectOnScreen(Rect rect) {
+        if (getChildCount() == 0) return 0;
+
+        int height = getHeight();
+        int screenTop = getScrollY();
+        int screenBottom = screenTop + height;
+
+        int fadingEdge = getVerticalFadingEdgeLength();
+
+        // leave room for top fading edge as long as rect isn't at very top
+        if (rect.top > 0) {
+            screenTop += fadingEdge;
+        }
+
+        // leave room for bottom fading edge as long as rect isn't at very bottom
+        if (rect.bottom < getChildAt(0).getHeight()) {
+            screenBottom -= fadingEdge;
+        }
+
+        int scrollYDelta = 0;
+
+        if (rect.bottom > screenBottom && rect.top > screenTop) {
+            // need to move down to get it in view: move down just enough so
+            // that the entire rectangle is in view (or at least the first
+            // screen size chunk).
+
+            if (rect.height() > height) {
+                // just enough to get screen size chunk on
+                scrollYDelta += (rect.top - screenTop);
+            } else {
+                // get entire rect at bottom of screen
+                scrollYDelta += (rect.bottom - screenBottom);
+            }
+
+            // make sure we aren't scrolling beyond the end of our content
+            int bottom = getChildAt(0).getBottom();
+            int distanceToBottom = bottom - screenBottom;
+            scrollYDelta = Math.min(scrollYDelta, distanceToBottom);
+
+        } else if (rect.top < screenTop && rect.bottom < screenBottom) {
+            // need to move up to get it in view: move up just enough so that
+            // entire rectangle is in view (or at least the first screen
+            // size chunk of it).
+
+            if (rect.height() > height) {
+                // screen size chunk
+                scrollYDelta -= (screenBottom - rect.bottom);
+            } else {
+                // entire rect at top
+                scrollYDelta -= (screenTop - rect.top);
+            }
+
+            // make sure we aren't scrolling any further than the top our content
+            scrollYDelta = Math.max(scrollYDelta, -getScrollY());
+        }
+        return scrollYDelta;
+    }
+
+    @Override
+    public void requestChildFocus(View child, View focused) {
+        if (!mIsLayoutDirty) {
+            scrollToChild(focused);
+        } else {
+            // The child may not be laid out yet, we can't compute the scroll yet
+            mChildToScrollTo = focused;
+        }
+        super.requestChildFocus(child, focused);
+    }
+
+
+    /**
+     * When looking for focus in children of a scroll view, need to be a little
+     * more careful not to give focus to something that is scrolled off screen.
+     *
+     * This is more expensive than the default {@link android.view.ViewGroup}
+     * implementation, otherwise this behavior might have been made the default.
+     */
+    @Override
+    protected boolean onRequestFocusInDescendants(int direction,
+            Rect previouslyFocusedRect) {
+
+        // convert from forward / backward notation to up / down / left / right
+        // (ugh).
+        if (direction == View.FOCUS_FORWARD) {
+            direction = View.FOCUS_DOWN;
+        } else if (direction == View.FOCUS_BACKWARD) {
+            direction = View.FOCUS_UP;
+        }
+
+        final View nextFocus = previouslyFocusedRect == null ?
+                FocusFinder.getInstance().findNextFocus(this, null, direction) :
+                FocusFinder.getInstance().findNextFocusFromRect(this,
+                        previouslyFocusedRect, direction);
+
+        if (nextFocus == null) {
+            return false;
+        }
+
+        if (isOffScreen(nextFocus)) {
+            return false;
+        }
+
+        return nextFocus.requestFocus(direction, previouslyFocusedRect);
+    }
+
+    @Override
+    public boolean requestChildRectangleOnScreen(View child, Rect rectangle,
+            boolean immediate) {
+        // offset into coordinate space of this scroll view
+        rectangle.offset(child.getLeft() - child.getScrollX(),
+                child.getTop() - child.getScrollY());
+
+        return scrollToChildRect(rectangle, immediate);
+    }
+
+    @Override
+    public void requestLayout() {
+        mIsLayoutDirty = true;
+        super.requestLayout();
+    }
+
+    @Override
+    protected void onLayout(boolean changed, int l, int t, int r, int b) {
+        super.onLayout(changed, l, t, r, b);
+        mIsLayoutDirty = false;
+        // Give a child focus if it needs it
+        if (mChildToScrollTo != null && isViewDescendantOf(mChildToScrollTo, this)) {
+            scrollToChild(mChildToScrollTo);
+        }
+        mChildToScrollTo = null;
+
+        if (!mIsLaidOut) {
+            if (mSavedState != null) {
+                scrollTo(getScrollX(), mSavedState.scrollPosition);
+                mSavedState = null;
+            } // mScrollY default value is "0"
+
+            final int childHeight = (getChildCount() > 0) ? getChildAt(0).getMeasuredHeight() : 0;
+            final int scrollRange = Math.max(0,
+                    childHeight - (b - t - getPaddingBottom() - getPaddingTop()));
+
+            // Don't forget to clamp
+            if (getScrollY() > scrollRange) {
+                scrollTo(getScrollX(), scrollRange);
+            } else if (getScrollY() < 0) {
+                scrollTo(getScrollX(), 0);
+            }
+        }
+
+        // Calling this with the present values causes it to re-claim them
+        scrollTo(getScrollX(), getScrollY());
+        mIsLaidOut = true;
+    }
+
+    @Override
+    public void onAttachedToWindow() {
+        super.onAttachedToWindow();
+
+        mIsLaidOut = false;
+    }
+
+    @Override
+    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
+        super.onSizeChanged(w, h, oldw, oldh);
+
+        View currentFocused = findFocus();
+        if (null == currentFocused || this == currentFocused)
+            return;
+
+        // If the currently-focused view was visible on the screen when the
+        // screen was at the old height, then scroll the screen to make that
+        // view visible with the new screen height.
+        if (isWithinDeltaOfScreen(currentFocused, 0, oldh)) {
+            currentFocused.getDrawingRect(mTempRect);
+            offsetDescendantRectToMyCoords(currentFocused, mTempRect);
+            int scrollDelta = computeScrollDeltaToGetChildRectOnScreen(mTempRect);
+            doScrollY(scrollDelta);
+        }
+    }
+
+    /**
+     * Return true if child is a descendant of parent, (or equal to the parent).
+     */
+    private static boolean isViewDescendantOf(View child, View parent) {
+        if (child == parent) {
+            return true;
+        }
+
+        final ViewParent theParent = child.getParent();
+        return (theParent instanceof ViewGroup) && isViewDescendantOf((View) theParent, parent);
+    }
+
+    /**
+     * Fling the scroll view
+     *
+     * @param velocityY The initial velocity in the Y direction. Positive
+     *                  numbers mean that the finger/cursor is moving down the screen,
+     *                  which means we want to scroll towards the top.
+     */
+    public void fling(int velocityY) {
+        if (getChildCount() > 0) {
+            int height = getHeight() - getPaddingBottom() - getPaddingTop();
+            int bottom = getChildAt(0).getHeight();
+
+            mScroller.fling(getScrollX(), getScrollY(), 0, velocityY, 0, 0, 0,
+                    Math.max(0, bottom - height), 0, height/2);
+
+            ViewCompat.postInvalidateOnAnimation(this);
+        }
+    }
+
+    private void flingWithNestedDispatch(int velocityY) {
+        final int scrollY = getScrollY();
+        final boolean canFling = (scrollY > 0 || velocityY > 0) &&
+                (scrollY < getScrollRange() || velocityY < 0);
+        if (!dispatchNestedPreFling(0, velocityY)) {
+            dispatchNestedFling(0, velocityY, canFling);
+            if (canFling) {
+                fling(velocityY);
+            }
+        }
+    }
+
+    private void endDrag() {
+        mIsBeingDragged = false;
+
+        recycleVelocityTracker();
+        stopNestedScroll();
+
+        if (mEdgeGlowTop != null) {
+            mEdgeGlowTop.onRelease();
+            mEdgeGlowBottom.onRelease();
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     *
+     * <p>This version also clamps the scrolling to the bounds of our child.
+     */
+    @Override
+    public void scrollTo(int x, int y) {
+        // we rely on the fact the View.scrollBy calls scrollTo.
+        if (getChildCount() > 0) {
+            View child = getChildAt(0);
+            x = clamp(x, getWidth() - getPaddingRight() - getPaddingLeft(), child.getWidth());
+            y = clamp(y, getHeight() - getPaddingBottom() - getPaddingTop(), child.getHeight());
+            if (x != getScrollX() || y != getScrollY()) {
+                super.scrollTo(x, y);
+            }
+        }
+    }
+
+    private void ensureGlows() {
+        if (ViewCompat.getOverScrollMode(this) != ViewCompat.OVER_SCROLL_NEVER) {
+            if (mEdgeGlowTop == null) {
+                Context context = getContext();
+                mEdgeGlowTop = new EdgeEffectCompat(context);
+                mEdgeGlowBottom = new EdgeEffectCompat(context);
+            }
+        } else {
+            mEdgeGlowTop = null;
+            mEdgeGlowBottom = null;
+        }
+    }
+
+    @Override
+    public void draw(Canvas canvas) {
+        super.draw(canvas);
+        if (mEdgeGlowTop != null) {
+            final int scrollY = getScrollY();
+            if (!mEdgeGlowTop.isFinished()) {
+                final int restoreCount = canvas.save();
+                final int width = getWidth() - getPaddingLeft() - getPaddingRight();
+
+                canvas.translate(getPaddingLeft(), Math.min(0, scrollY));
+                mEdgeGlowTop.setSize(width, getHeight());
+                if (mEdgeGlowTop.draw(canvas)) {
+                    ViewCompat.postInvalidateOnAnimation(this);
+                }
+                canvas.restoreToCount(restoreCount);
+            }
+            if (!mEdgeGlowBottom.isFinished()) {
+                final int restoreCount = canvas.save();
+                final int width = getWidth() - getPaddingLeft() - getPaddingRight();
+                final int height = getHeight();
+
+                canvas.translate(-width + getPaddingLeft(),
+                        Math.max(getScrollRange(), scrollY) + height);
+                canvas.rotate(180, width, 0);
+                mEdgeGlowBottom.setSize(width, height);
+                if (mEdgeGlowBottom.draw(canvas)) {
+                    ViewCompat.postInvalidateOnAnimation(this);
+                }
+                canvas.restoreToCount(restoreCount);
+            }
+        }
+    }
+
+    private static int clamp(int n, int my, int child) {
+        if (my >= child || n < 0) {
+            /* my >= child is this case:
+             *                    |--------------- me ---------------|
+             *     |------ child ------|
+             * or
+             *     |--------------- me ---------------|
+             *            |------ child ------|
+             * or
+             *     |--------------- me ---------------|
+             *                                  |------ child ------|
+             *
+             * n < 0 is this case:
+             *     |------ me ------|
+             *                    |-------- child --------|
+             *     |-- mScrollX --|
+             */
+            return 0;
+        }
+        if ((my+n) > child) {
+            /* this case:
+             *                    |------ me ------|
+             *     |------ child ------|
+             *     |-- mScrollX --|
+             */
+            return child-my;
+        }
+        return n;
+    }
+
+    @Override
+    protected void onRestoreInstanceState(Parcelable state) {
+        if (!(state instanceof SavedState)) {
+            super.onRestoreInstanceState(state);
+            return;
+        }
+
+        SavedState ss = (SavedState) state;
+        super.onRestoreInstanceState(ss.getSuperState());
+        mSavedState = ss;
+        requestLayout();
+    }
+
+    @Override
+    protected Parcelable onSaveInstanceState() {
+        Parcelable superState = super.onSaveInstanceState();
+        SavedState ss = new SavedState(superState);
+        ss.scrollPosition = getScrollY();
+        return ss;
+    }
+
+    static class SavedState extends BaseSavedState {
+        public int scrollPosition;
+
+        SavedState(Parcelable superState) {
+            super(superState);
+        }
+
+        public SavedState(Parcel source) {
+            super(source);
+            scrollPosition = source.readInt();
+        }
+
+        @Override
+        public void writeToParcel(Parcel dest, int flags) {
+            super.writeToParcel(dest, flags);
+            dest.writeInt(scrollPosition);
+        }
+
+        @Override
+        public String toString() {
+            return "HorizontalScrollView.SavedState{"
+                    + Integer.toHexString(System.identityHashCode(this))
+                    + " scrollPosition=" + scrollPosition + "}";
+        }
+
+        public static final Parcelable.Creator<SavedState> CREATOR
+                = new Parcelable.Creator<SavedState>() {
+            @Override
+            public SavedState createFromParcel(Parcel in) {
+                return new SavedState(in);
+            }
+
+            @Override
+            public SavedState[] newArray(int size) {
+                return new SavedState[size];
+            }
+        };
+    }
+
+    static class AccessibilityDelegate extends AccessibilityDelegateCompat {
+        @Override
+        public boolean performAccessibilityAction(View host, int action, Bundle arguments) {
+            if (super.performAccessibilityAction(host, action, arguments)) {
+                return true;
+            }
+            final NestedScrollView nsvHost = (NestedScrollView) host;
+            if (!nsvHost.isEnabled()) {
+                return false;
+            }
+            switch (action) {
+                case AccessibilityNodeInfoCompat.ACTION_SCROLL_FORWARD: {
+                    final int viewportHeight = nsvHost.getHeight() - nsvHost.getPaddingBottom()
+                            - nsvHost.getPaddingTop();
+                    final int targetScrollY = Math.min(nsvHost.getScrollY() + viewportHeight,
+                            nsvHost.getScrollRange());
+                    if (targetScrollY != nsvHost.getScrollY()) {
+                        nsvHost.smoothScrollTo(0, targetScrollY);
+                        return true;
+                    }
+                }
+                return false;
+                case AccessibilityNodeInfoCompat.ACTION_SCROLL_BACKWARD: {
+                    final int viewportHeight = nsvHost.getHeight() - nsvHost.getPaddingBottom()
+                            - nsvHost.getPaddingTop();
+                    final int targetScrollY = Math.max(nsvHost.getScrollY() - viewportHeight, 0);
+                    if (targetScrollY != nsvHost.getScrollY()) {
+                        nsvHost.smoothScrollTo(0, targetScrollY);
+                        return true;
+                    }
+                }
+                return false;
+            }
+            return false;
+        }
+
+        @Override
+        public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfoCompat info) {
+            super.onInitializeAccessibilityNodeInfo(host, info);
+            final NestedScrollView nsvHost = (NestedScrollView) host;
+            info.setClassName(ScrollView.class.getName());
+            if (nsvHost.isEnabled()) {
+                final int scrollRange = nsvHost.getScrollRange();
+                if (scrollRange > 0) {
+                    info.setScrollable(true);
+                    if (nsvHost.getScrollY() > 0) {
+                        info.addAction(AccessibilityNodeInfoCompat.ACTION_SCROLL_BACKWARD);
+                    }
+                    if (nsvHost.getScrollY() < scrollRange) {
+                        info.addAction(AccessibilityNodeInfoCompat.ACTION_SCROLL_FORWARD);
+                    }
+                }
+            }
+        }
+
+        @Override
+        public void onInitializeAccessibilityEvent(View host, AccessibilityEvent event) {
+            super.onInitializeAccessibilityEvent(host, event);
+            final NestedScrollView nsvHost = (NestedScrollView) host;
+            event.setClassName(ScrollView.class.getName());
+            final AccessibilityRecordCompat record = AccessibilityEventCompat.asRecord(event);
+            final boolean scrollable = nsvHost.getScrollRange() > 0;
+            record.setScrollable(scrollable);
+            record.setScrollX(nsvHost.getScrollX());
+            record.setScrollY(nsvHost.getScrollY());
+            record.setMaxScrollX(nsvHost.getScrollX());
+            record.setMaxScrollY(nsvHost.getScrollRange());
+        }
+    }
+}
diff --git a/v4/java/android/support/v4/widget/ResourceCursorAdapter.java b/core-ui/java/android/support/v4/widget/ResourceCursorAdapter.java
similarity index 100%
rename from v4/java/android/support/v4/widget/ResourceCursorAdapter.java
rename to core-ui/java/android/support/v4/widget/ResourceCursorAdapter.java
diff --git a/v4/java/android/support/v4/widget/SimpleCursorAdapter.java b/core-ui/java/android/support/v4/widget/SimpleCursorAdapter.java
similarity index 100%
rename from v4/java/android/support/v4/widget/SimpleCursorAdapter.java
rename to core-ui/java/android/support/v4/widget/SimpleCursorAdapter.java
diff --git a/core-ui/java/android/support/v4/widget/SlidingPaneLayout.java b/core-ui/java/android/support/v4/widget/SlidingPaneLayout.java
new file mode 100644
index 0000000..1acdf84
--- /dev/null
+++ b/core-ui/java/android/support/v4/widget/SlidingPaneLayout.java
@@ -0,0 +1,1667 @@
+/*
+ * Copyright (C) 2012 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 android.support.v4.widget;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.PixelFormat;
+import android.graphics.PorterDuff;
+import android.graphics.PorterDuffColorFilter;
+import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
+import android.os.Build;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.support.annotation.ColorInt;
+import android.support.annotation.DrawableRes;
+import android.support.v4.os.ParcelableCompat;
+import android.support.v4.os.ParcelableCompatCreatorCallbacks;
+import android.support.v4.view.AbsSavedState;
+import android.support.v4.view.AccessibilityDelegateCompat;
+import android.support.v4.view.MotionEventCompat;
+import android.support.v4.view.ViewCompat;
+import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewConfiguration;
+import android.view.ViewGroup;
+import android.view.ViewParent;
+import android.view.accessibility.AccessibilityEvent;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+
+/**
+ * SlidingPaneLayout provides a horizontal, multi-pane layout for use at the top level
+ * of a UI. A left (or first) pane is treated as a content list or browser, subordinate to a
+ * primary detail view for displaying content.
+ *
+ * <p>Child views may overlap if their combined width exceeds the available width
+ * in the SlidingPaneLayout. When this occurs the user may slide the topmost view out of the way
+ * by dragging it, or by navigating in the direction of the overlapped view using a keyboard.
+ * If the content of the dragged child view is itself horizontally scrollable, the user may
+ * grab it by the very edge.</p>
+ *
+ * <p>Thanks to this sliding behavior, SlidingPaneLayout may be suitable for creating layouts
+ * that can smoothly adapt across many different screen sizes, expanding out fully on larger
+ * screens and collapsing on smaller screens.</p>
+ *
+ * <p>SlidingPaneLayout is distinct from a navigation drawer as described in the design
+ * guide and should not be used in the same scenarios. SlidingPaneLayout should be thought
+ * of only as a way to allow a two-pane layout normally used on larger screens to adapt to smaller
+ * screens in a natural way. The interaction patterns expressed by SlidingPaneLayout imply
+ * a physicality and direct information hierarchy between panes that does not necessarily exist
+ * in a scenario where a navigation drawer should be used instead.</p>
+ *
+ * <p>Appropriate uses of SlidingPaneLayout include pairings of panes such as a contact list and
+ * subordinate interactions with those contacts, or an email thread list with the content pane
+ * displaying the contents of the selected thread. Inappropriate uses of SlidingPaneLayout include
+ * switching between disparate functions of your app, such as jumping from a social stream view
+ * to a view of your personal profile - cases such as this should use the navigation drawer
+ * pattern instead. ({@link DrawerLayout DrawerLayout} implements this pattern.)</p>
+ *
+ * <p>Like {@link android.widget.LinearLayout LinearLayout}, SlidingPaneLayout supports
+ * the use of the layout parameter <code>layout_weight</code> on child views to determine
+ * how to divide leftover space after measurement is complete. It is only relevant for width.
+ * When views do not overlap weight behaves as it does in a LinearLayout.</p>
+ *
+ * <p>When views do overlap, weight on a slideable pane indicates that the pane should be
+ * sized to fill all available space in the closed state. Weight on a pane that becomes covered
+ * indicates that the pane should be sized to fill all available space except a small minimum strip
+ * that the user may use to grab the slideable view and pull it back over into a closed state.</p>
+ */
+public class SlidingPaneLayout extends ViewGroup {
+    private static final String TAG = "SlidingPaneLayout";
+
+    /**
+     * Default size of the overhang for a pane in the open state.
+     * At least this much of a sliding pane will remain visible.
+     * This indicates that there is more content available and provides
+     * a "physical" edge to grab to pull it closed.
+     */
+    private static final int DEFAULT_OVERHANG_SIZE = 32; // dp;
+
+    /**
+     * If no fade color is given by default it will fade to 80% gray.
+     */
+    private static final int DEFAULT_FADE_COLOR = 0xcccccccc;
+
+    /**
+     * The fade color used for the sliding panel. 0 = no fading.
+     */
+    private int mSliderFadeColor = DEFAULT_FADE_COLOR;
+
+    /**
+     * Minimum velocity that will be detected as a fling
+     */
+    private static final int MIN_FLING_VELOCITY = 400; // dips per second
+
+    /**
+     * The fade color used for the panel covered by the slider. 0 = no fading.
+     */
+    private int mCoveredFadeColor;
+
+    /**
+     * Drawable used to draw the shadow between panes by default.
+     */
+    private Drawable mShadowDrawableLeft;
+
+    /**
+     * Drawable used to draw the shadow between panes to support RTL (right to left language).
+     */
+    private Drawable mShadowDrawableRight;
+
+    /**
+     * The size of the overhang in pixels.
+     * This is the minimum section of the sliding panel that will
+     * be visible in the open state to allow for a closing drag.
+     */
+    private final int mOverhangSize;
+
+    /**
+     * True if a panel can slide with the current measurements
+     */
+    private boolean mCanSlide;
+
+    /**
+     * The child view that can slide, if any.
+     */
+    private View mSlideableView;
+
+    /**
+     * How far the panel is offset from its closed position.
+     * range [0, 1] where 0 = closed, 1 = open.
+     */
+    private float mSlideOffset;
+
+    /**
+     * How far the non-sliding panel is parallaxed from its usual position when open.
+     * range [0, 1]
+     */
+    private float mParallaxOffset;
+
+    /**
+     * How far in pixels the slideable panel may move.
+     */
+    private int mSlideRange;
+
+    /**
+     * A panel view is locked into internal scrolling or another condition that
+     * is preventing a drag.
+     */
+    private boolean mIsUnableToDrag;
+
+    /**
+     * Distance in pixels to parallax the fixed pane by when fully closed
+     */
+    private int mParallaxBy;
+
+    private float mInitialMotionX;
+    private float mInitialMotionY;
+
+    private PanelSlideListener mPanelSlideListener;
+
+    private final ViewDragHelper mDragHelper;
+
+    /**
+     * Stores whether or not the pane was open the last time it was slideable.
+     * If open/close operations are invoked this state is modified. Used by
+     * instance state save/restore.
+     */
+    private boolean mPreservedOpenState;
+    private boolean mFirstLayout = true;
+
+    private final Rect mTmpRect = new Rect();
+
+    private final ArrayList<DisableLayerRunnable> mPostedRunnables =
+            new ArrayList<DisableLayerRunnable>();
+
+    static final SlidingPanelLayoutImpl IMPL;
+
+    static {
+        final int deviceVersion = Build.VERSION.SDK_INT;
+        if (deviceVersion >= 17) {
+            IMPL = new SlidingPanelLayoutImplJBMR1();
+        } else if (deviceVersion >= 16) {
+            IMPL = new SlidingPanelLayoutImplJB();
+        } else {
+            IMPL = new SlidingPanelLayoutImplBase();
+        }
+    }
+
+    /**
+     * Listener for monitoring events about sliding panes.
+     */
+    public interface PanelSlideListener {
+        /**
+         * Called when a sliding pane's position changes.
+         * @param panel The child view that was moved
+         * @param slideOffset The new offset of this sliding pane within its range, from 0-1
+         */
+        public void onPanelSlide(View panel, float slideOffset);
+        /**
+         * Called when a sliding pane becomes slid completely open. The pane may or may not
+         * be interactive at this point depending on how much of the pane is visible.
+         * @param panel The child view that was slid to an open position, revealing other panes
+         */
+        public void onPanelOpened(View panel);
+
+        /**
+         * Called when a sliding pane becomes slid completely closed. The pane is now guaranteed
+         * to be interactive. It may now obscure other views in the layout.
+         * @param panel The child view that was slid to a closed position
+         */
+        public void onPanelClosed(View panel);
+    }
+
+    /**
+     * No-op stubs for {@link PanelSlideListener}. If you only want to implement a subset
+     * of the listener methods you can extend this instead of implement the full interface.
+     */
+    public static class SimplePanelSlideListener implements PanelSlideListener {
+        @Override
+        public void onPanelSlide(View panel, float slideOffset) {
+        }
+        @Override
+        public void onPanelOpened(View panel) {
+        }
+        @Override
+        public void onPanelClosed(View panel) {
+        }
+    }
+
+    public SlidingPaneLayout(Context context) {
+        this(context, null);
+    }
+
+    public SlidingPaneLayout(Context context, AttributeSet attrs) {
+        this(context, attrs, 0);
+    }
+
+    public SlidingPaneLayout(Context context, AttributeSet attrs, int defStyle) {
+        super(context, attrs, defStyle);
+
+        final float density = context.getResources().getDisplayMetrics().density;
+        mOverhangSize = (int) (DEFAULT_OVERHANG_SIZE * density + 0.5f);
+
+        final ViewConfiguration viewConfig = ViewConfiguration.get(context);
+
+        setWillNotDraw(false);
+
+        ViewCompat.setAccessibilityDelegate(this, new AccessibilityDelegate());
+        ViewCompat.setImportantForAccessibility(this, ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_YES);
+
+        mDragHelper = ViewDragHelper.create(this, 0.5f, new DragHelperCallback());
+        mDragHelper.setMinVelocity(MIN_FLING_VELOCITY * density);
+    }
+
+    /**
+     * Set a distance to parallax the lower pane by when the upper pane is in its
+     * fully closed state. The lower pane will scroll between this position and
+     * its fully open state.
+     *
+     * @param parallaxBy Distance to parallax by in pixels
+     */
+    public void setParallaxDistance(int parallaxBy) {
+        mParallaxBy = parallaxBy;
+        requestLayout();
+    }
+
+    /**
+     * @return The distance the lower pane will parallax by when the upper pane is fully closed.
+     *
+     * @see #setParallaxDistance(int)
+     */
+    public int getParallaxDistance() {
+        return mParallaxBy;
+    }
+
+    /**
+     * Set the color used to fade the sliding pane out when it is slid most of the way offscreen.
+     *
+     * @param color An ARGB-packed color value
+     */
+    public void setSliderFadeColor(@ColorInt int color) {
+        mSliderFadeColor = color;
+    }
+
+    /**
+     * @return The ARGB-packed color value used to fade the sliding pane
+     */
+    @ColorInt
+    public int getSliderFadeColor() {
+        return mSliderFadeColor;
+    }
+
+    /**
+     * Set the color used to fade the pane covered by the sliding pane out when the pane
+     * will become fully covered in the closed state.
+     *
+     * @param color An ARGB-packed color value
+     */
+    public void setCoveredFadeColor(@ColorInt int color) {
+        mCoveredFadeColor = color;
+    }
+
+    /**
+     * @return The ARGB-packed color value used to fade the fixed pane
+     */
+    @ColorInt
+    public int getCoveredFadeColor() {
+        return mCoveredFadeColor;
+    }
+
+    public void setPanelSlideListener(PanelSlideListener listener) {
+        mPanelSlideListener = listener;
+    }
+
+    void dispatchOnPanelSlide(View panel) {
+        if (mPanelSlideListener != null) {
+            mPanelSlideListener.onPanelSlide(panel, mSlideOffset);
+        }
+    }
+
+    void dispatchOnPanelOpened(View panel) {
+        if (mPanelSlideListener != null) {
+            mPanelSlideListener.onPanelOpened(panel);
+        }
+        sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
+    }
+
+    void dispatchOnPanelClosed(View panel) {
+        if (mPanelSlideListener != null) {
+            mPanelSlideListener.onPanelClosed(panel);
+        }
+        sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
+    }
+
+    void updateObscuredViewsVisibility(View panel) {
+        final boolean isLayoutRtl = isLayoutRtlSupport();
+        final int startBound = isLayoutRtl ? (getWidth() - getPaddingRight()) :
+            getPaddingLeft();
+        final int endBound = isLayoutRtl ? getPaddingLeft() :
+            (getWidth() - getPaddingRight());
+        final int topBound = getPaddingTop();
+        final int bottomBound = getHeight() - getPaddingBottom();
+        final int left;
+        final int right;
+        final int top;
+        final int bottom;
+        if (panel != null && viewIsOpaque(panel)) {
+            left = panel.getLeft();
+            right = panel.getRight();
+            top = panel.getTop();
+            bottom = panel.getBottom();
+        } else {
+            left = right = top = bottom = 0;
+        }
+
+        for (int i = 0, childCount = getChildCount(); i < childCount; i++) {
+            final View child = getChildAt(i);
+
+            if (child == panel) {
+                // There are still more children above the panel but they won't be affected.
+                break;
+            } else if (child.getVisibility() == GONE) {
+                continue;
+            }
+
+            final int clampedChildLeft = Math.max((isLayoutRtl ? endBound :
+                startBound), child.getLeft());
+            final int clampedChildTop = Math.max(topBound, child.getTop());
+            final int clampedChildRight = Math.min((isLayoutRtl ? startBound :
+                endBound), child.getRight());
+            final int clampedChildBottom = Math.min(bottomBound, child.getBottom());
+            final int vis;
+            if (clampedChildLeft >= left && clampedChildTop >= top &&
+                    clampedChildRight <= right && clampedChildBottom <= bottom) {
+                vis = INVISIBLE;
+            } else {
+                vis = VISIBLE;
+            }
+            child.setVisibility(vis);
+        }
+    }
+
+    void setAllChildrenVisible() {
+        for (int i = 0, childCount = getChildCount(); i < childCount; i++) {
+            final View child = getChildAt(i);
+            if (child.getVisibility() == INVISIBLE) {
+                child.setVisibility(VISIBLE);
+            }
+        }
+    }
+
+    private static boolean viewIsOpaque(View v) {
+        if (v.isOpaque()) {
+            return true;
+        }
+
+        // View#isOpaque didn't take all valid opaque scrollbar modes into account
+        // before API 18 (JB-MR2). On newer devices rely solely on isOpaque above and return false
+        // here. On older devices, check the view's background drawable directly as a fallback.
+        if (Build.VERSION.SDK_INT >= 18) {
+            return false;
+        }
+
+        final Drawable bg = v.getBackground();
+        if (bg != null) {
+            return bg.getOpacity() == PixelFormat.OPAQUE;
+        }
+        return false;
+    }
+
+    @Override
+    protected void onAttachedToWindow() {
+        super.onAttachedToWindow();
+        mFirstLayout = true;
+    }
+
+    @Override
+    protected void onDetachedFromWindow() {
+        super.onDetachedFromWindow();
+        mFirstLayout = true;
+
+        for (int i = 0, count = mPostedRunnables.size(); i < count; i++) {
+            final DisableLayerRunnable dlr = mPostedRunnables.get(i);
+            dlr.run();
+        }
+        mPostedRunnables.clear();
+    }
+
+    @Override
+    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+        int widthMode = MeasureSpec.getMode(widthMeasureSpec);
+        int widthSize = MeasureSpec.getSize(widthMeasureSpec);
+        int heightMode = MeasureSpec.getMode(heightMeasureSpec);
+        int heightSize = MeasureSpec.getSize(heightMeasureSpec);
+
+        if (widthMode != MeasureSpec.EXACTLY) {
+            if (isInEditMode()) {
+                // Don't crash the layout editor. Consume all of the space if specified
+                // or pick a magic number from thin air otherwise.
+                // TODO Better communication with tools of this bogus state.
+                // It will crash on a real device.
+                if (widthMode == MeasureSpec.AT_MOST) {
+                    widthMode = MeasureSpec.EXACTLY;
+                } else if (widthMode == MeasureSpec.UNSPECIFIED) {
+                    widthMode = MeasureSpec.EXACTLY;
+                    widthSize = 300;
+                }
+            } else {
+                throw new IllegalStateException("Width must have an exact value or MATCH_PARENT");
+            }
+        } else if (heightMode == MeasureSpec.UNSPECIFIED) {
+            if (isInEditMode()) {
+                // Don't crash the layout editor. Pick a magic number from thin air instead.
+                // TODO Better communication with tools of this bogus state.
+                // It will crash on a real device.
+                if (heightMode == MeasureSpec.UNSPECIFIED) {
+                    heightMode = MeasureSpec.AT_MOST;
+                    heightSize = 300;
+                }
+            } else {
+                throw new IllegalStateException("Height must not be UNSPECIFIED");
+            }
+        }
+
+        int layoutHeight = 0;
+        int maxLayoutHeight = -1;
+        switch (heightMode) {
+            case MeasureSpec.EXACTLY:
+                layoutHeight = maxLayoutHeight = heightSize - getPaddingTop() - getPaddingBottom();
+                break;
+            case MeasureSpec.AT_MOST:
+                maxLayoutHeight = heightSize - getPaddingTop() - getPaddingBottom();
+                break;
+        }
+
+        float weightSum = 0;
+        boolean canSlide = false;
+        final int widthAvailable = widthSize - getPaddingLeft() - getPaddingRight();
+        int widthRemaining = widthAvailable;
+        final int childCount = getChildCount();
+
+        if (childCount > 2) {
+            Log.e(TAG, "onMeasure: More than two child views are not supported.");
+        }
+
+        // We'll find the current one below.
+        mSlideableView = null;
+
+        // First pass. Measure based on child LayoutParams width/height.
+        // Weight will incur a second pass.
+        for (int i = 0; i < childCount; i++) {
+            final View child = getChildAt(i);
+            final LayoutParams lp = (LayoutParams) child.getLayoutParams();
+
+            if (child.getVisibility() == GONE) {
+                lp.dimWhenOffset = false;
+                continue;
+            }
+
+            if (lp.weight > 0) {
+                weightSum += lp.weight;
+
+                // If we have no width, weight is the only contributor to the final size.
+                // Measure this view on the weight pass only.
+                if (lp.width == 0) continue;
+            }
+
+            int childWidthSpec;
+            final int horizontalMargin = lp.leftMargin + lp.rightMargin;
+            if (lp.width == LayoutParams.WRAP_CONTENT) {
+                childWidthSpec = MeasureSpec.makeMeasureSpec(widthAvailable - horizontalMargin,
+                        MeasureSpec.AT_MOST);
+            } else if (lp.width == LayoutParams.FILL_PARENT) {
+                childWidthSpec = MeasureSpec.makeMeasureSpec(widthAvailable - horizontalMargin,
+                        MeasureSpec.EXACTLY);
+            } else {
+                childWidthSpec = MeasureSpec.makeMeasureSpec(lp.width, MeasureSpec.EXACTLY);
+            }
+
+            int childHeightSpec;
+            if (lp.height == LayoutParams.WRAP_CONTENT) {
+                childHeightSpec = MeasureSpec.makeMeasureSpec(maxLayoutHeight, MeasureSpec.AT_MOST);
+            } else if (lp.height == LayoutParams.FILL_PARENT) {
+                childHeightSpec = MeasureSpec.makeMeasureSpec(maxLayoutHeight, MeasureSpec.EXACTLY);
+            } else {
+                childHeightSpec = MeasureSpec.makeMeasureSpec(lp.height, MeasureSpec.EXACTLY);
+            }
+
+            child.measure(childWidthSpec, childHeightSpec);
+            final int childWidth = child.getMeasuredWidth();
+            final int childHeight = child.getMeasuredHeight();
+
+            if (heightMode == MeasureSpec.AT_MOST && childHeight > layoutHeight) {
+                layoutHeight = Math.min(childHeight, maxLayoutHeight);
+            }
+
+            widthRemaining -= childWidth;
+            canSlide |= lp.slideable = widthRemaining < 0;
+            if (lp.slideable) {
+                mSlideableView = child;
+            }
+        }
+
+        // Resolve weight and make sure non-sliding panels are smaller than the full screen.
+        if (canSlide || weightSum > 0) {
+            final int fixedPanelWidthLimit = widthAvailable - mOverhangSize;
+
+            for (int i = 0; i < childCount; i++) {
+                final View child = getChildAt(i);
+
+                if (child.getVisibility() == GONE) {
+                    continue;
+                }
+
+                final LayoutParams lp = (LayoutParams) child.getLayoutParams();
+
+                if (child.getVisibility() == GONE) {
+                    continue;
+                }
+
+                final boolean skippedFirstPass = lp.width == 0 && lp.weight > 0;
+                final int measuredWidth = skippedFirstPass ? 0 : child.getMeasuredWidth();
+                if (canSlide && child != mSlideableView) {
+                    if (lp.width < 0 && (measuredWidth > fixedPanelWidthLimit || lp.weight > 0)) {
+                        // Fixed panels in a sliding configuration should
+                        // be clamped to the fixed panel limit.
+                        final int childHeightSpec;
+                        if (skippedFirstPass) {
+                            // Do initial height measurement if we skipped measuring this view
+                            // the first time around.
+                            if (lp.height == LayoutParams.WRAP_CONTENT) {
+                                childHeightSpec = MeasureSpec.makeMeasureSpec(maxLayoutHeight,
+                                        MeasureSpec.AT_MOST);
+                            } else if (lp.height == LayoutParams.FILL_PARENT) {
+                                childHeightSpec = MeasureSpec.makeMeasureSpec(maxLayoutHeight,
+                                        MeasureSpec.EXACTLY);
+                            } else {
+                                childHeightSpec = MeasureSpec.makeMeasureSpec(lp.height,
+                                        MeasureSpec.EXACTLY);
+                            }
+                        } else {
+                            childHeightSpec = MeasureSpec.makeMeasureSpec(
+                                    child.getMeasuredHeight(), MeasureSpec.EXACTLY);
+                        }
+                        final int childWidthSpec = MeasureSpec.makeMeasureSpec(
+                                fixedPanelWidthLimit, MeasureSpec.EXACTLY);
+                        child.measure(childWidthSpec, childHeightSpec);
+                    }
+                } else if (lp.weight > 0) {
+                    int childHeightSpec;
+                    if (lp.width == 0) {
+                        // This was skipped the first time; figure out a real height spec.
+                        if (lp.height == LayoutParams.WRAP_CONTENT) {
+                            childHeightSpec = MeasureSpec.makeMeasureSpec(maxLayoutHeight,
+                                    MeasureSpec.AT_MOST);
+                        } else if (lp.height == LayoutParams.FILL_PARENT) {
+                            childHeightSpec = MeasureSpec.makeMeasureSpec(maxLayoutHeight,
+                                    MeasureSpec.EXACTLY);
+                        } else {
+                            childHeightSpec = MeasureSpec.makeMeasureSpec(lp.height,
+                                    MeasureSpec.EXACTLY);
+                        }
+                    } else {
+                        childHeightSpec = MeasureSpec.makeMeasureSpec(
+                                child.getMeasuredHeight(), MeasureSpec.EXACTLY);
+                    }
+
+                    if (canSlide) {
+                        // Consume available space
+                        final int horizontalMargin = lp.leftMargin + lp.rightMargin;
+                        final int newWidth = widthAvailable - horizontalMargin;
+                        final int childWidthSpec = MeasureSpec.makeMeasureSpec(
+                                newWidth, MeasureSpec.EXACTLY);
+                        if (measuredWidth != newWidth) {
+                            child.measure(childWidthSpec, childHeightSpec);
+                        }
+                    } else {
+                        // Distribute the extra width proportionally similar to LinearLayout
+                        final int widthToDistribute = Math.max(0, widthRemaining);
+                        final int addedWidth = (int) (lp.weight * widthToDistribute / weightSum);
+                        final int childWidthSpec = MeasureSpec.makeMeasureSpec(
+                                measuredWidth + addedWidth, MeasureSpec.EXACTLY);
+                        child.measure(childWidthSpec, childHeightSpec);
+                    }
+                }
+            }
+        }
+
+        final int measuredWidth = widthSize;
+        final int measuredHeight = layoutHeight + getPaddingTop() + getPaddingBottom();
+
+        setMeasuredDimension(measuredWidth, measuredHeight);
+        mCanSlide = canSlide;
+
+        if (mDragHelper.getViewDragState() != ViewDragHelper.STATE_IDLE && !canSlide) {
+            // Cancel scrolling in progress, it's no longer relevant.
+            mDragHelper.abort();
+        }
+    }
+
+    @Override
+    protected void onLayout(boolean changed, int l, int t, int r, int b) {
+        final boolean isLayoutRtl = isLayoutRtlSupport();
+        if (isLayoutRtl) {
+            mDragHelper.setEdgeTrackingEnabled(ViewDragHelper.EDGE_RIGHT);
+        } else {
+            mDragHelper.setEdgeTrackingEnabled(ViewDragHelper.EDGE_LEFT);
+        }
+        final int width = r - l;
+        final int paddingStart = isLayoutRtl ? getPaddingRight() : getPaddingLeft();
+        final int paddingEnd = isLayoutRtl ? getPaddingLeft() : getPaddingRight();
+        final int paddingTop = getPaddingTop();
+
+        final int childCount = getChildCount();
+        int xStart = paddingStart;
+        int nextXStart = xStart;
+
+        if (mFirstLayout) {
+            mSlideOffset = mCanSlide && mPreservedOpenState ? 1.f : 0.f;
+        }
+
+        for (int i = 0; i < childCount; i++) {
+            final View child = getChildAt(i);
+
+            if (child.getVisibility() == GONE) {
+                continue;
+            }
+
+            final LayoutParams lp = (LayoutParams) child.getLayoutParams();
+
+            final int childWidth = child.getMeasuredWidth();
+            int offset = 0;
+
+            if (lp.slideable) {
+                final int margin = lp.leftMargin + lp.rightMargin;
+                final int range = Math.min(nextXStart,
+                        width - paddingEnd - mOverhangSize) - xStart - margin;
+                mSlideRange = range;
+                final int lpMargin = isLayoutRtl ? lp.rightMargin : lp.leftMargin;
+                lp.dimWhenOffset = xStart + lpMargin + range + childWidth / 2 >
+                        width - paddingEnd;
+                final int pos = (int) (range * mSlideOffset);
+                xStart += pos + lpMargin;
+                mSlideOffset = (float) pos / mSlideRange;
+            } else if (mCanSlide && mParallaxBy != 0) {
+                offset = (int) ((1 - mSlideOffset) * mParallaxBy);
+                xStart = nextXStart;
+            } else {
+                xStart = nextXStart;
+            }
+
+            final int childRight;
+            final int childLeft;
+            if (isLayoutRtl) {
+                childRight = width - xStart + offset;
+                childLeft = childRight - childWidth;
+            } else {
+                childLeft = xStart - offset;
+                childRight = childLeft + childWidth;
+            }
+
+            final int childTop = paddingTop;
+            final int childBottom = childTop + child.getMeasuredHeight();
+            child.layout(childLeft, paddingTop, childRight, childBottom);
+
+            nextXStart += child.getWidth();
+        }
+
+        if (mFirstLayout) {
+            if (mCanSlide) {
+                if (mParallaxBy != 0) {
+                    parallaxOtherViews(mSlideOffset);
+                }
+                if (((LayoutParams) mSlideableView.getLayoutParams()).dimWhenOffset) {
+                    dimChildView(mSlideableView, mSlideOffset, mSliderFadeColor);
+                }
+            } else {
+                // Reset the dim level of all children; it's irrelevant when nothing moves.
+                for (int i = 0; i < childCount; i++) {
+                    dimChildView(getChildAt(i), 0, mSliderFadeColor);
+                }
+            }
+            updateObscuredViewsVisibility(mSlideableView);
+        }
+
+        mFirstLayout = false;
+    }
+
+    @Override
+    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
+        super.onSizeChanged(w, h, oldw, oldh);
+        // Recalculate sliding panes and their details
+        if (w != oldw) {
+            mFirstLayout = true;
+        }
+    }
+
+    @Override
+    public void requestChildFocus(View child, View focused) {
+        super.requestChildFocus(child, focused);
+        if (!isInTouchMode() && !mCanSlide) {
+            mPreservedOpenState = child == mSlideableView;
+        }
+    }
+
+    @Override
+    public boolean onInterceptTouchEvent(MotionEvent ev) {
+        final int action = MotionEventCompat.getActionMasked(ev);
+
+        // Preserve the open state based on the last view that was touched.
+        if (!mCanSlide && action == MotionEvent.ACTION_DOWN && getChildCount() > 1) {
+            // After the first things will be slideable.
+            final View secondChild = getChildAt(1);
+            if (secondChild != null) {
+                mPreservedOpenState = !mDragHelper.isViewUnder(secondChild,
+                        (int) ev.getX(), (int) ev.getY());
+            }
+        }
+
+        if (!mCanSlide || (mIsUnableToDrag && action != MotionEvent.ACTION_DOWN)) {
+            mDragHelper.cancel();
+            return super.onInterceptTouchEvent(ev);
+        }
+
+        if (action == MotionEvent.ACTION_CANCEL || action == MotionEvent.ACTION_UP) {
+            mDragHelper.cancel();
+            return false;
+        }
+
+        boolean interceptTap = false;
+
+        switch (action) {
+            case MotionEvent.ACTION_DOWN: {
+                mIsUnableToDrag = false;
+                final float x = ev.getX();
+                final float y = ev.getY();
+                mInitialMotionX = x;
+                mInitialMotionY = y;
+
+                if (mDragHelper.isViewUnder(mSlideableView, (int) x, (int) y) &&
+                        isDimmed(mSlideableView)) {
+                    interceptTap = true;
+                }
+                break;
+            }
+
+            case MotionEvent.ACTION_MOVE: {
+                final float x = ev.getX();
+                final float y = ev.getY();
+                final float adx = Math.abs(x - mInitialMotionX);
+                final float ady = Math.abs(y - mInitialMotionY);
+                final int slop = mDragHelper.getTouchSlop();
+                if (adx > slop && ady > adx) {
+                    mDragHelper.cancel();
+                    mIsUnableToDrag = true;
+                    return false;
+                }
+            }
+        }
+
+        final boolean interceptForDrag = mDragHelper.shouldInterceptTouchEvent(ev);
+
+        return interceptForDrag || interceptTap;
+    }
+
+    @Override
+    public boolean onTouchEvent(MotionEvent ev) {
+        if (!mCanSlide) {
+            return super.onTouchEvent(ev);
+        }
+
+        mDragHelper.processTouchEvent(ev);
+
+        final int action = ev.getAction();
+        boolean wantTouchEvents = true;
+
+        switch (action & MotionEventCompat.ACTION_MASK) {
+            case MotionEvent.ACTION_DOWN: {
+                final float x = ev.getX();
+                final float y = ev.getY();
+                mInitialMotionX = x;
+                mInitialMotionY = y;
+                break;
+            }
+
+            case MotionEvent.ACTION_UP: {
+                if (isDimmed(mSlideableView)) {
+                    final float x = ev.getX();
+                    final float y = ev.getY();
+                    final float dx = x - mInitialMotionX;
+                    final float dy = y - mInitialMotionY;
+                    final int slop = mDragHelper.getTouchSlop();
+                    if (dx * dx + dy * dy < slop * slop &&
+                            mDragHelper.isViewUnder(mSlideableView, (int) x, (int) y)) {
+                        // Taps close a dimmed open pane.
+                        closePane(mSlideableView, 0);
+                        break;
+                    }
+                }
+                break;
+            }
+        }
+
+        return wantTouchEvents;
+    }
+
+    private boolean closePane(View pane, int initialVelocity) {
+        if (mFirstLayout || smoothSlideTo(0.f, initialVelocity)) {
+            mPreservedOpenState = false;
+            return true;
+        }
+        return false;
+    }
+
+    private boolean openPane(View pane, int initialVelocity) {
+        if (mFirstLayout || smoothSlideTo(1.f, initialVelocity)) {
+            mPreservedOpenState = true;
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * @deprecated Renamed to {@link #openPane()} - this method is going away soon!
+     */
+    @Deprecated
+    public void smoothSlideOpen() {
+        openPane();
+    }
+
+    /**
+     * Open the sliding pane if it is currently slideable. If first layout
+     * has already completed this will animate.
+     *
+     * @return true if the pane was slideable and is now open/in the process of opening
+     */
+    public boolean openPane() {
+        return openPane(mSlideableView, 0);
+    }
+
+    /**
+     * @deprecated Renamed to {@link #closePane()} - this method is going away soon!
+     */
+    @Deprecated
+    public void smoothSlideClosed() {
+        closePane();
+    }
+
+    /**
+     * Close the sliding pane if it is currently slideable. If first layout
+     * has already completed this will animate.
+     *
+     * @return true if the pane was slideable and is now closed/in the process of closing
+     */
+    public boolean closePane() {
+        return closePane(mSlideableView, 0);
+    }
+
+    /**
+     * Check if the layout is completely open. It can be open either because the slider
+     * itself is open revealing the left pane, or if all content fits without sliding.
+     *
+     * @return true if sliding panels are completely open
+     */
+    public boolean isOpen() {
+        return !mCanSlide || mSlideOffset == 1;
+    }
+
+    /**
+     * @return true if content in this layout can be slid open and closed
+     * @deprecated Renamed to {@link #isSlideable()} - this method is going away soon!
+     */
+    @Deprecated
+    public boolean canSlide() {
+        return mCanSlide;
+    }
+
+    /**
+     * Check if the content in this layout cannot fully fit side by side and therefore
+     * the content pane can be slid back and forth.
+     *
+     * @return true if content in this layout can be slid open and closed
+     */
+    public boolean isSlideable() {
+        return mCanSlide;
+    }
+
+    private void onPanelDragged(int newLeft) {
+        if (mSlideableView == null) {
+            // This can happen if we're aborting motion during layout because everything now fits.
+            mSlideOffset = 0;
+            return;
+        }
+        final boolean isLayoutRtl = isLayoutRtlSupport();
+        final LayoutParams lp = (LayoutParams) mSlideableView.getLayoutParams();
+
+        int childWidth = mSlideableView.getWidth();
+        final int newStart = isLayoutRtl ? getWidth() - newLeft - childWidth : newLeft;
+
+        final int paddingStart = isLayoutRtl ? getPaddingRight() : getPaddingLeft();
+        final int lpMargin = isLayoutRtl ? lp.rightMargin : lp.leftMargin;
+        final int startBound = paddingStart + lpMargin;
+
+        mSlideOffset = (float) (newStart - startBound) / mSlideRange;
+
+        if (mParallaxBy != 0) {
+            parallaxOtherViews(mSlideOffset);
+        }
+
+        if (lp.dimWhenOffset) {
+            dimChildView(mSlideableView, mSlideOffset, mSliderFadeColor);
+        }
+        dispatchOnPanelSlide(mSlideableView);
+    }
+
+    private void dimChildView(View v, float mag, int fadeColor) {
+        final LayoutParams lp = (LayoutParams) v.getLayoutParams();
+
+        if (mag > 0 && fadeColor != 0) {
+            final int baseAlpha = (fadeColor & 0xff000000) >>> 24;
+            int imag = (int) (baseAlpha * mag);
+            int color = imag << 24 | (fadeColor & 0xffffff);
+            if (lp.dimPaint == null) {
+                lp.dimPaint = new Paint();
+            }
+            lp.dimPaint.setColorFilter(new PorterDuffColorFilter(color, PorterDuff.Mode.SRC_OVER));
+            if (ViewCompat.getLayerType(v) != ViewCompat.LAYER_TYPE_HARDWARE) {
+                ViewCompat.setLayerType(v, ViewCompat.LAYER_TYPE_HARDWARE, lp.dimPaint);
+            }
+            invalidateChildRegion(v);
+        } else if (ViewCompat.getLayerType(v) != ViewCompat.LAYER_TYPE_NONE) {
+            if (lp.dimPaint != null) {
+                lp.dimPaint.setColorFilter(null);
+            }
+            final DisableLayerRunnable dlr = new DisableLayerRunnable(v);
+            mPostedRunnables.add(dlr);
+            ViewCompat.postOnAnimation(this, dlr);
+        }
+    }
+
+    @Override
+    protected boolean drawChild(Canvas canvas, View child, long drawingTime) {
+        final LayoutParams lp = (LayoutParams) child.getLayoutParams();
+        boolean result;
+        final int save = canvas.save(Canvas.CLIP_SAVE_FLAG);
+
+        if (mCanSlide && !lp.slideable && mSlideableView != null) {
+            // Clip against the slider; no sense drawing what will immediately be covered.
+            canvas.getClipBounds(mTmpRect);
+            if (isLayoutRtlSupport()) {
+                mTmpRect.left = Math.max(mTmpRect.left, mSlideableView.getRight());
+            } else {
+                mTmpRect.right = Math.min(mTmpRect.right, mSlideableView.getLeft());
+            }
+            canvas.clipRect(mTmpRect);
+        }
+
+        if (Build.VERSION.SDK_INT >= 11) { // HC
+            result = super.drawChild(canvas, child, drawingTime);
+        } else {
+            if (lp.dimWhenOffset && mSlideOffset > 0) {
+                if (!child.isDrawingCacheEnabled()) {
+                    child.setDrawingCacheEnabled(true);
+                }
+                final Bitmap cache = child.getDrawingCache();
+                if (cache != null) {
+                    canvas.drawBitmap(cache, child.getLeft(), child.getTop(), lp.dimPaint);
+                    result = false;
+                } else {
+                    Log.e(TAG, "drawChild: child view " + child + " returned null drawing cache");
+                    result = super.drawChild(canvas, child, drawingTime);
+                }
+            } else {
+                if (child.isDrawingCacheEnabled()) {
+                    child.setDrawingCacheEnabled(false);
+                }
+                result = super.drawChild(canvas, child, drawingTime);
+            }
+        }
+
+        canvas.restoreToCount(save);
+
+        return result;
+    }
+
+    private void invalidateChildRegion(View v) {
+        IMPL.invalidateChildRegion(this, v);
+    }
+
+    /**
+     * Smoothly animate mDraggingPane to the target X position within its range.
+     *
+     * @param slideOffset position to animate to
+     * @param velocity initial velocity in case of fling, or 0.
+     */
+    boolean smoothSlideTo(float slideOffset, int velocity) {
+        if (!mCanSlide) {
+            // Nothing to do.
+            return false;
+        }
+
+        final boolean isLayoutRtl = isLayoutRtlSupport();
+        final LayoutParams lp = (LayoutParams) mSlideableView.getLayoutParams();
+
+        int x;
+        if (isLayoutRtl) {
+            int startBound = getPaddingRight() + lp.rightMargin;
+            int childWidth = mSlideableView.getWidth();
+            x = (int) (getWidth() - (startBound + slideOffset * mSlideRange + childWidth));
+        } else {
+            int startBound = getPaddingLeft() + lp.leftMargin;
+            x = (int) (startBound + slideOffset * mSlideRange);
+        }
+
+        if (mDragHelper.smoothSlideViewTo(mSlideableView, x, mSlideableView.getTop())) {
+            setAllChildrenVisible();
+            ViewCompat.postInvalidateOnAnimation(this);
+            return true;
+        }
+        return false;
+    }
+
+    @Override
+    public void computeScroll() {
+        if (mDragHelper.continueSettling(true)) {
+            if (!mCanSlide) {
+                mDragHelper.abort();
+                return;
+            }
+
+            ViewCompat.postInvalidateOnAnimation(this);
+        }
+    }
+
+    /**
+     * @deprecated Renamed to {@link #setShadowDrawableLeft(Drawable d)} to support LTR (left to
+     * right language) and {@link #setShadowDrawableRight(Drawable d)} to support RTL (right to left
+     * language) during opening/closing.
+     *
+     * @param d drawable to use as a shadow
+     */
+    @Deprecated
+    public void setShadowDrawable(Drawable d) {
+        setShadowDrawableLeft(d);
+    }
+
+    /**
+     * Set a drawable to use as a shadow cast by the right pane onto the left pane
+     * during opening/closing.
+     *
+     * @param d drawable to use as a shadow
+     */
+    public void setShadowDrawableLeft(Drawable d) {
+        mShadowDrawableLeft = d;
+    }
+
+    /**
+     * Set a drawable to use as a shadow cast by the left pane onto the right pane
+     * during opening/closing to support right to left language.
+     *
+     * @param d drawable to use as a shadow
+     */
+    public void setShadowDrawableRight(Drawable d) {
+        mShadowDrawableRight = d;
+    }
+
+    /**
+     * Set a drawable to use as a shadow cast by the right pane onto the left pane
+     * during opening/closing.
+     *
+     * @param resId Resource ID of a drawable to use
+     * @deprecated Renamed to {@link #setShadowResourceLeft(int)} to support LTR (left to
+     * right language) and {@link #setShadowResourceRight(int)} to support RTL (right to left
+     * language) during opening/closing.
+     */
+    @Deprecated
+    public void setShadowResource(@DrawableRes int resId) {
+        setShadowDrawable(getResources().getDrawable(resId));
+    }
+
+    /**
+     * Set a drawable to use as a shadow cast by the right pane onto the left pane
+     * during opening/closing.
+     *
+     * @param resId Resource ID of a drawable to use
+     */
+    public void setShadowResourceLeft(int resId) {
+        setShadowDrawableLeft(getResources().getDrawable(resId));
+    }
+
+    /**
+     * Set a drawable to use as a shadow cast by the left pane onto the right pane
+     * during opening/closing to support right to left language.
+     *
+     * @param resId Resource ID of a drawable to use
+     */
+    public void setShadowResourceRight(int resId) {
+        setShadowDrawableRight(getResources().getDrawable(resId));
+    }
+
+
+    @Override
+    public void draw(Canvas c) {
+        super.draw(c);
+        final boolean isLayoutRtl = isLayoutRtlSupport();
+        Drawable shadowDrawable;
+        if (isLayoutRtl) {
+            shadowDrawable = mShadowDrawableRight;
+        } else {
+            shadowDrawable = mShadowDrawableLeft;
+        }
+
+        final View shadowView = getChildCount() > 1 ? getChildAt(1) : null;
+        if (shadowView == null || shadowDrawable == null) {
+            // No need to draw a shadow if we don't have one.
+            return;
+        }
+
+        final int top = shadowView.getTop();
+        final int bottom = shadowView.getBottom();
+
+        final int shadowWidth = shadowDrawable.getIntrinsicWidth();
+        final int left;
+        final int right;
+        if (isLayoutRtlSupport()) {
+            left = shadowView.getRight();
+            right = left + shadowWidth;
+        } else {
+            right = shadowView.getLeft();
+            left = right - shadowWidth;
+        }
+
+        shadowDrawable.setBounds(left, top, right, bottom);
+        shadowDrawable.draw(c);
+    }
+
+    private void parallaxOtherViews(float slideOffset) {
+        final boolean isLayoutRtl = isLayoutRtlSupport();
+        final LayoutParams slideLp = (LayoutParams) mSlideableView.getLayoutParams();
+        final boolean dimViews = slideLp.dimWhenOffset &&
+                (isLayoutRtl ? slideLp.rightMargin : slideLp.leftMargin) <= 0;
+        final int childCount = getChildCount();
+        for (int i = 0; i < childCount; i++) {
+            final View v = getChildAt(i);
+            if (v == mSlideableView) continue;
+
+            final int oldOffset = (int) ((1 - mParallaxOffset) * mParallaxBy);
+            mParallaxOffset = slideOffset;
+            final int newOffset = (int) ((1 - slideOffset) * mParallaxBy);
+            final int dx = oldOffset - newOffset;
+
+            v.offsetLeftAndRight(isLayoutRtl ? -dx : dx);
+
+            if (dimViews) {
+                dimChildView(v, isLayoutRtl ? mParallaxOffset - 1 :
+                    1 - mParallaxOffset, mCoveredFadeColor);
+            }
+        }
+    }
+
+    /**
+     * Tests scrollability within child views of v given a delta of dx.
+     *
+     * @param v View to test for horizontal scrollability
+     * @param checkV Whether the view v passed should itself be checked for scrollability (true),
+     *               or just its children (false).
+     * @param dx Delta scrolled in pixels
+     * @param x X coordinate of the active touch point
+     * @param y Y coordinate of the active touch point
+     * @return true if child views of v can be scrolled by delta of dx.
+     */
+    protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) {
+        if (v instanceof ViewGroup) {
+            final ViewGroup group = (ViewGroup) v;
+            final int scrollX = v.getScrollX();
+            final int scrollY = v.getScrollY();
+            final int count = group.getChildCount();
+            // Count backwards - let topmost views consume scroll distance first.
+            for (int i = count - 1; i >= 0; i--) {
+                // TODO: Add versioned support here for transformed views.
+                // This will not work for transformed views in Honeycomb+
+                final View child = group.getChildAt(i);
+                if (x + scrollX >= child.getLeft() && x + scrollX < child.getRight() &&
+                        y + scrollY >= child.getTop() && y + scrollY < child.getBottom() &&
+                        canScroll(child, true, dx, x + scrollX - child.getLeft(),
+                                y + scrollY - child.getTop())) {
+                    return true;
+                }
+            }
+        }
+
+        return checkV && ViewCompat.canScrollHorizontally(v, (isLayoutRtlSupport() ? dx : -dx));
+    }
+
+    boolean isDimmed(View child) {
+        if (child == null) {
+            return false;
+        }
+        final LayoutParams lp = (LayoutParams) child.getLayoutParams();
+        return mCanSlide && lp.dimWhenOffset && mSlideOffset > 0;
+    }
+
+    @Override
+    protected ViewGroup.LayoutParams generateDefaultLayoutParams() {
+        return new LayoutParams();
+    }
+
+    @Override
+    protected ViewGroup.LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) {
+        return p instanceof MarginLayoutParams
+                ? new LayoutParams((MarginLayoutParams) p)
+                : new LayoutParams(p);
+    }
+
+    @Override
+    protected boolean checkLayoutParams(ViewGroup.LayoutParams p) {
+        return p instanceof LayoutParams && super.checkLayoutParams(p);
+    }
+
+    @Override
+    public ViewGroup.LayoutParams generateLayoutParams(AttributeSet attrs) {
+        return new LayoutParams(getContext(), attrs);
+    }
+
+    @Override
+    protected Parcelable onSaveInstanceState() {
+        Parcelable superState = super.onSaveInstanceState();
+
+        SavedState ss = new SavedState(superState);
+        ss.isOpen = isSlideable() ? isOpen() : mPreservedOpenState;
+
+        return ss;
+    }
+
+    @Override
+    protected void onRestoreInstanceState(Parcelable state) {
+        if (!(state instanceof SavedState)) {
+            super.onRestoreInstanceState(state);
+            return;
+        }
+
+        SavedState ss = (SavedState) state;
+        super.onRestoreInstanceState(ss.getSuperState());
+
+        if (ss.isOpen) {
+            openPane();
+        } else {
+            closePane();
+        }
+        mPreservedOpenState = ss.isOpen;
+    }
+
+    private class DragHelperCallback extends ViewDragHelper.Callback {
+
+        @Override
+        public boolean tryCaptureView(View child, int pointerId) {
+            if (mIsUnableToDrag) {
+                return false;
+            }
+
+            return ((LayoutParams) child.getLayoutParams()).slideable;
+        }
+
+        @Override
+        public void onViewDragStateChanged(int state) {
+            if (mDragHelper.getViewDragState() == ViewDragHelper.STATE_IDLE) {
+                if (mSlideOffset == 0) {
+                    updateObscuredViewsVisibility(mSlideableView);
+                    dispatchOnPanelClosed(mSlideableView);
+                    mPreservedOpenState = false;
+                } else {
+                    dispatchOnPanelOpened(mSlideableView);
+                    mPreservedOpenState = true;
+                }
+            }
+        }
+
+        @Override
+        public void onViewCaptured(View capturedChild, int activePointerId) {
+            // Make all child views visible in preparation for sliding things around
+            setAllChildrenVisible();
+        }
+
+        @Override
+        public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) {
+            onPanelDragged(left);
+            invalidate();
+        }
+
+        @Override
+        public void onViewReleased(View releasedChild, float xvel, float yvel) {
+            final LayoutParams lp = (LayoutParams) releasedChild.getLayoutParams();
+
+            int left;
+            if (isLayoutRtlSupport()) {
+                int startToRight =  getPaddingRight() + lp.rightMargin;
+                if (xvel < 0 || (xvel == 0 && mSlideOffset > 0.5f)) {
+                    startToRight += mSlideRange;
+                }
+                int childWidth = mSlideableView.getWidth();
+                left = getWidth() - startToRight - childWidth;
+            } else {
+                left = getPaddingLeft() + lp.leftMargin;
+                if (xvel > 0 || (xvel == 0 && mSlideOffset > 0.5f)) {
+                    left += mSlideRange;
+                }
+            }
+            mDragHelper.settleCapturedViewAt(left, releasedChild.getTop());
+            invalidate();
+        }
+
+        @Override
+        public int getViewHorizontalDragRange(View child) {
+            return mSlideRange;
+        }
+
+        @Override
+        public int clampViewPositionHorizontal(View child, int left, int dx) {
+            final LayoutParams lp = (LayoutParams) mSlideableView.getLayoutParams();
+
+            final int newLeft;
+            if (isLayoutRtlSupport()) {
+                int startBound = getWidth() -
+                        (getPaddingRight() + lp.rightMargin + mSlideableView.getWidth());
+                int endBound =  startBound - mSlideRange;
+                newLeft = Math.max(Math.min(left, startBound), endBound);
+            } else {
+                int startBound = getPaddingLeft() + lp.leftMargin;
+                int endBound = startBound + mSlideRange;
+                newLeft = Math.min(Math.max(left, startBound), endBound);
+            }
+            return newLeft;
+        }
+
+        @Override
+        public int clampViewPositionVertical(View child, int top, int dy) {
+            // Make sure we never move views vertically.
+            // This could happen if the child has less height than its parent.
+            return child.getTop();
+        }
+
+        @Override
+        public void onEdgeDragStarted(int edgeFlags, int pointerId) {
+            mDragHelper.captureChildView(mSlideableView, pointerId);
+        }
+    }
+
+    public static class LayoutParams extends ViewGroup.MarginLayoutParams {
+        private static final int[] ATTRS = new int[] {
+            android.R.attr.layout_weight
+        };
+
+        /**
+         * The weighted proportion of how much of the leftover space
+         * this child should consume after measurement.
+         */
+        public float weight = 0;
+
+        /**
+         * True if this pane is the slideable pane in the layout.
+         */
+        boolean slideable;
+
+        /**
+         * True if this view should be drawn dimmed
+         * when it's been offset from its default position.
+         */
+        boolean dimWhenOffset;
+
+        Paint dimPaint;
+
+        public LayoutParams() {
+            super(FILL_PARENT, FILL_PARENT);
+        }
+
+        public LayoutParams(int width, int height) {
+            super(width, height);
+        }
+
+        public LayoutParams(android.view.ViewGroup.LayoutParams source) {
+            super(source);
+        }
+
+        public LayoutParams(MarginLayoutParams source) {
+            super(source);
+        }
+
+        public LayoutParams(LayoutParams source) {
+            super(source);
+            this.weight = source.weight;
+        }
+
+        public LayoutParams(Context c, AttributeSet attrs) {
+            super(c, attrs);
+
+            final TypedArray a = c.obtainStyledAttributes(attrs, ATTRS);
+            this.weight = a.getFloat(0, 0);
+            a.recycle();
+        }
+
+    }
+
+    static class SavedState extends AbsSavedState {
+        boolean isOpen;
+
+        SavedState(Parcelable superState) {
+            super(superState);
+        }
+
+        private SavedState(Parcel in, ClassLoader loader) {
+            super(in, loader);
+            isOpen = in.readInt() != 0;
+        }
+
+        @Override
+        public void writeToParcel(Parcel out, int flags) {
+            super.writeToParcel(out, flags);
+            out.writeInt(isOpen ? 1 : 0);
+        }
+
+        public static final Creator<SavedState> CREATOR = ParcelableCompat.newCreator(
+                new ParcelableCompatCreatorCallbacks<SavedState>() {
+                    @Override
+                    public SavedState createFromParcel(Parcel in, ClassLoader loader) {
+                        return new SavedState(in, loader);
+                    }
+
+                    @Override
+                    public SavedState[] newArray(int size) {
+                        return new SavedState[size];
+                    }
+                });
+    }
+
+    interface SlidingPanelLayoutImpl {
+        void invalidateChildRegion(SlidingPaneLayout parent, View child);
+    }
+
+    static class SlidingPanelLayoutImplBase implements SlidingPanelLayoutImpl {
+        @Override
+        public void invalidateChildRegion(SlidingPaneLayout parent, View child) {
+            ViewCompat.postInvalidateOnAnimation(parent, child.getLeft(), child.getTop(),
+                    child.getRight(), child.getBottom());
+        }
+    }
+
+    static class SlidingPanelLayoutImplJB extends SlidingPanelLayoutImplBase {
+        /*
+         * Private API hacks! Nasty! Bad!
+         *
+         * In Jellybean, some optimizations in the hardware UI renderer
+         * prevent a changed Paint on a View using a hardware layer from having
+         * the intended effect. This twiddles some internal bits on the view to force
+         * it to recreate the display list.
+         */
+        private Method mGetDisplayList;
+        private Field mRecreateDisplayList;
+
+        SlidingPanelLayoutImplJB() {
+            try {
+                mGetDisplayList = View.class.getDeclaredMethod("getDisplayList", (Class[]) null);
+            } catch (NoSuchMethodException e) {
+                Log.e(TAG, "Couldn't fetch getDisplayList method; dimming won't work right.", e);
+            }
+            try {
+                mRecreateDisplayList = View.class.getDeclaredField("mRecreateDisplayList");
+                mRecreateDisplayList.setAccessible(true);
+            } catch (NoSuchFieldException e) {
+                Log.e(TAG, "Couldn't fetch mRecreateDisplayList field; dimming will be slow.", e);
+            }
+        }
+
+        @Override
+        public void invalidateChildRegion(SlidingPaneLayout parent, View child) {
+            if (mGetDisplayList != null && mRecreateDisplayList != null) {
+                try {
+                    mRecreateDisplayList.setBoolean(child, true);
+                    mGetDisplayList.invoke(child, (Object[]) null);
+                } catch (Exception e) {
+                    Log.e(TAG, "Error refreshing display list state", e);
+                }
+            } else {
+                // Slow path. REALLY slow path. Let's hope we don't get here.
+                child.invalidate();
+                return;
+            }
+            super.invalidateChildRegion(parent, child);
+        }
+    }
+
+    static class SlidingPanelLayoutImplJBMR1 extends SlidingPanelLayoutImplBase {
+        @Override
+        public void invalidateChildRegion(SlidingPaneLayout parent, View child) {
+            ViewCompat.setLayerPaint(child, ((LayoutParams) child.getLayoutParams()).dimPaint);
+        }
+    }
+
+    class AccessibilityDelegate extends AccessibilityDelegateCompat {
+        private final Rect mTmpRect = new Rect();
+
+        @Override
+        public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfoCompat info) {
+            final AccessibilityNodeInfoCompat superNode = AccessibilityNodeInfoCompat.obtain(info);
+            super.onInitializeAccessibilityNodeInfo(host, superNode);
+            copyNodeInfoNoChildren(info, superNode);
+            superNode.recycle();
+
+            info.setClassName(SlidingPaneLayout.class.getName());
+            info.setSource(host);
+
+            final ViewParent parent = ViewCompat.getParentForAccessibility(host);
+            if (parent instanceof View) {
+                info.setParent((View) parent);
+            }
+
+            // This is a best-approximation of addChildrenForAccessibility()
+            // that accounts for filtering.
+            final int childCount = getChildCount();
+            for (int i = 0; i < childCount; i++) {
+                final View child = getChildAt(i);
+                if (!filter(child) && (child.getVisibility() == View.VISIBLE)) {
+                    // Force importance to "yes" since we can't read the value.
+                    ViewCompat.setImportantForAccessibility(
+                            child, ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_YES);
+                    info.addChild(child);
+                }
+            }
+        }
+
+        @Override
+        public void onInitializeAccessibilityEvent(View host, AccessibilityEvent event) {
+            super.onInitializeAccessibilityEvent(host, event);
+
+            event.setClassName(SlidingPaneLayout.class.getName());
+        }
+
+        @Override
+        public boolean onRequestSendAccessibilityEvent(ViewGroup host, View child,
+                AccessibilityEvent event) {
+            if (!filter(child)) {
+                return super.onRequestSendAccessibilityEvent(host, child, event);
+            }
+            return false;
+        }
+
+        public boolean filter(View child) {
+            return isDimmed(child);
+        }
+
+        /**
+         * This should really be in AccessibilityNodeInfoCompat, but there unfortunately
+         * seem to be a few elements that are not easily cloneable using the underlying API.
+         * Leave it private here as it's not general-purpose useful.
+         */
+        private void copyNodeInfoNoChildren(AccessibilityNodeInfoCompat dest,
+                AccessibilityNodeInfoCompat src) {
+            final Rect rect = mTmpRect;
+
+            src.getBoundsInParent(rect);
+            dest.setBoundsInParent(rect);
+
+            src.getBoundsInScreen(rect);
+            dest.setBoundsInScreen(rect);
+
+            dest.setVisibleToUser(src.isVisibleToUser());
+            dest.setPackageName(src.getPackageName());
+            dest.setClassName(src.getClassName());
+            dest.setContentDescription(src.getContentDescription());
+
+            dest.setEnabled(src.isEnabled());
+            dest.setClickable(src.isClickable());
+            dest.setFocusable(src.isFocusable());
+            dest.setFocused(src.isFocused());
+            dest.setAccessibilityFocused(src.isAccessibilityFocused());
+            dest.setSelected(src.isSelected());
+            dest.setLongClickable(src.isLongClickable());
+
+            dest.addAction(src.getActions());
+
+            dest.setMovementGranularities(src.getMovementGranularities());
+        }
+    }
+
+    private class DisableLayerRunnable implements Runnable {
+        final View mChildView;
+
+        DisableLayerRunnable(View childView) {
+            mChildView = childView;
+        }
+
+        @Override
+        public void run() {
+            if (mChildView.getParent() == SlidingPaneLayout.this) {
+                ViewCompat.setLayerType(mChildView, ViewCompat.LAYER_TYPE_NONE, null);
+                invalidateChildRegion(mChildView);
+            }
+            mPostedRunnables.remove(this);
+        }
+    }
+
+    private boolean isLayoutRtlSupport() {
+        return ViewCompat.getLayoutDirection(this) == ViewCompat.LAYOUT_DIRECTION_RTL;
+    }
+}
diff --git a/v4/java/android/support/v4/widget/Space.java b/core-ui/java/android/support/v4/widget/Space.java
similarity index 100%
rename from v4/java/android/support/v4/widget/Space.java
rename to core-ui/java/android/support/v4/widget/Space.java
diff --git a/v4/java/android/support/v4/widget/SwipeProgressBar.java b/core-ui/java/android/support/v4/widget/SwipeProgressBar.java
similarity index 100%
rename from v4/java/android/support/v4/widget/SwipeProgressBar.java
rename to core-ui/java/android/support/v4/widget/SwipeProgressBar.java
diff --git a/core-ui/java/android/support/v4/widget/SwipeRefreshLayout.java b/core-ui/java/android/support/v4/widget/SwipeRefreshLayout.java
new file mode 100644
index 0000000..c057798
--- /dev/null
+++ b/core-ui/java/android/support/v4/widget/SwipeRefreshLayout.java
@@ -0,0 +1,1192 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.support.v4.widget;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.content.res.TypedArray;
+import android.support.annotation.ColorInt;
+import android.support.annotation.ColorRes;
+import android.support.annotation.Nullable;
+import android.support.annotation.VisibleForTesting;
+import android.support.v4.view.MotionEventCompat;
+import android.support.v4.view.NestedScrollingChild;
+import android.support.v4.view.NestedScrollingChildHelper;
+import android.support.v4.view.NestedScrollingParent;
+import android.support.v4.view.NestedScrollingParentHelper;
+import android.support.v4.view.ViewCompat;
+import android.util.AttributeSet;
+import android.util.DisplayMetrics;
+import android.util.Log;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewConfiguration;
+import android.view.ViewGroup;
+import android.view.animation.Animation;
+import android.view.animation.Animation.AnimationListener;
+import android.view.animation.DecelerateInterpolator;
+import android.view.animation.Transformation;
+import android.widget.AbsListView;
+
+/**
+ * The SwipeRefreshLayout should be used whenever the user can refresh the
+ * contents of a view via a vertical swipe gesture. The activity that
+ * instantiates this view should add an OnRefreshListener to be notified
+ * whenever the swipe to refresh gesture is completed. The SwipeRefreshLayout
+ * will notify the listener each and every time the gesture is completed again;
+ * the listener is responsible for correctly determining when to actually
+ * initiate a refresh of its content. If the listener determines there should
+ * not be a refresh, it must call setRefreshing(false) to cancel any visual
+ * indication of a refresh. If an activity wishes to show just the progress
+ * animation, it should call setRefreshing(true). To disable the gesture and
+ * progress animation, call setEnabled(false) on the view.
+ * <p>
+ * This layout should be made the parent of the view that will be refreshed as a
+ * result of the gesture and can only support one direct child. This view will
+ * also be made the target of the gesture and will be forced to match both the
+ * width and the height supplied in this layout. The SwipeRefreshLayout does not
+ * provide accessibility events; instead, a menu item must be provided to allow
+ * refresh of the content wherever this gesture is used.
+ * </p>
+ */
+public class SwipeRefreshLayout extends ViewGroup implements NestedScrollingParent,
+        NestedScrollingChild {
+    // Maps to ProgressBar.Large style
+    public static final int LARGE = MaterialProgressDrawable.LARGE;
+    // Maps to ProgressBar default style
+    public static final int DEFAULT = MaterialProgressDrawable.DEFAULT;
+
+    @VisibleForTesting
+    static final int CIRCLE_DIAMETER = 40;
+    @VisibleForTesting
+    static final int CIRCLE_DIAMETER_LARGE = 56;
+
+    private static final String LOG_TAG = SwipeRefreshLayout.class.getSimpleName();
+
+    private static final int MAX_ALPHA = 255;
+    private static final int STARTING_PROGRESS_ALPHA = (int) (.3f * MAX_ALPHA);
+
+    private static final float DECELERATE_INTERPOLATION_FACTOR = 2f;
+    private static final int INVALID_POINTER = -1;
+    private static final float DRAG_RATE = .5f;
+
+    // Max amount of circle that can be filled by progress during swipe gesture,
+    // where 1.0 is a full circle
+    private static final float MAX_PROGRESS_ANGLE = .8f;
+
+    private static final int SCALE_DOWN_DURATION = 150;
+
+    private static final int ALPHA_ANIMATION_DURATION = 300;
+
+    private static final int ANIMATE_TO_TRIGGER_DURATION = 200;
+
+    private static final int ANIMATE_TO_START_DURATION = 200;
+
+    // Default background for the progress spinner
+    private static final int CIRCLE_BG_LIGHT = 0xFFFAFAFA;
+    // Default offset in dips from the top of the view to where the progress spinner should stop
+    private static final int DEFAULT_CIRCLE_TARGET = 64;
+
+    private View mTarget; // the target of the gesture
+    private OnRefreshListener mListener;
+    private boolean mRefreshing = false;
+    private int mTouchSlop;
+    private float mTotalDragDistance = -1;
+
+    // If nested scrolling is enabled, the total amount that needed to be
+    // consumed by this as the nested scrolling parent is used in place of the
+    // overscroll determined by MOVE events in the onTouch handler
+    private float mTotalUnconsumed;
+    private final NestedScrollingParentHelper mNestedScrollingParentHelper;
+    private final NestedScrollingChildHelper mNestedScrollingChildHelper;
+    private final int[] mParentScrollConsumed = new int[2];
+    private final int[] mParentOffsetInWindow = new int[2];
+    private boolean mNestedScrollInProgress;
+
+    private int mMediumAnimationDuration;
+    private int mCurrentTargetOffsetTop;
+
+    private float mInitialMotionY;
+    private float mInitialDownY;
+    private boolean mIsBeingDragged;
+    private int mActivePointerId = INVALID_POINTER;
+    // Whether this item is scaled up rather than clipped
+    private boolean mScale;
+
+    // Target is returning to its start offset because it was cancelled or a
+    // refresh was triggered.
+    private boolean mReturningToStart;
+    private final DecelerateInterpolator mDecelerateInterpolator;
+    private static final int[] LAYOUT_ATTRS = new int[] {
+        android.R.attr.enabled
+    };
+
+    private CircleImageView mCircleView;
+    private int mCircleViewIndex = -1;
+
+    protected int mFrom;
+
+    private float mStartingScale;
+
+    protected int mOriginalOffsetTop;
+
+    private MaterialProgressDrawable mProgress;
+
+    private Animation mScaleAnimation;
+
+    private Animation mScaleDownAnimation;
+
+    private Animation mAlphaStartAnimation;
+
+    private Animation mAlphaMaxAnimation;
+
+    private Animation mScaleDownToStartAnimation;
+
+    private float mSpinnerFinalOffset;
+
+    private boolean mNotify;
+
+    private int mCircleDiameter;
+
+    // Whether the client has set a custom starting position;
+    private boolean mUsingCustomStart;
+
+    private OnChildScrollUpCallback mChildScrollUpCallback;
+
+    private Animation.AnimationListener mRefreshListener = new Animation.AnimationListener() {
+        @Override
+        public void onAnimationStart(Animation animation) {
+        }
+
+        @Override
+        public void onAnimationRepeat(Animation animation) {
+        }
+
+        @Override
+        public void onAnimationEnd(Animation animation) {
+            if (mRefreshing) {
+                // Make sure the progress view is fully visible
+                mProgress.setAlpha(MAX_ALPHA);
+                mProgress.start();
+                if (mNotify) {
+                    if (mListener != null) {
+                        mListener.onRefresh();
+                    }
+                }
+                mCurrentTargetOffsetTop = mCircleView.getTop();
+            } else {
+                reset();
+            }
+        }
+    };
+
+    private void reset() {
+        mCircleView.clearAnimation();
+        mProgress.stop();
+        mCircleView.setVisibility(View.GONE);
+        setColorViewAlpha(MAX_ALPHA);
+        // Return the circle to its start position
+        if (mScale) {
+            setAnimationProgress(0 /* animation complete and view is hidden */);
+        } else {
+            setTargetOffsetTopAndBottom(mOriginalOffsetTop - mCurrentTargetOffsetTop,
+                    true /* requires update */);
+        }
+        mCurrentTargetOffsetTop = mCircleView.getTop();
+    }
+
+    @Override
+    protected void onDetachedFromWindow() {
+        super.onDetachedFromWindow();
+        reset();
+    }
+
+    private void setColorViewAlpha(int targetAlpha) {
+        mCircleView.getBackground().setAlpha(targetAlpha);
+        mProgress.setAlpha(targetAlpha);
+    }
+
+    /**
+     * The refresh indicator starting and resting position is always positioned
+     * near the top of the refreshing content. This position is a consistent
+     * location, but can be adjusted in either direction based on whether or not
+     * there is a toolbar or actionbar present.
+     *
+     * @param scale Set to true if there is no view at a higher z-order than where the progress
+     *              spinner is set to appear. Setting it to true will cause indicator to be scaled
+     *              up rather than clipped.
+     * @param start The offset in pixels from the top of this view at which the
+     *              progress spinner should appear.
+     * @param end The offset in pixels from the top of this view at which the
+     *            progress spinner should come to rest after a successful swipe
+     *            gesture.
+     */
+    public void setProgressViewOffset(boolean scale, int start, int end) {
+        mScale = scale;
+        mCircleView.setVisibility(View.GONE);
+        mOriginalOffsetTop = mCurrentTargetOffsetTop = start;
+        mSpinnerFinalOffset = end;
+        mUsingCustomStart = true;
+        mCircleView.invalidate();
+    }
+
+    /**
+     * The refresh indicator resting position is always positioned near the top
+     * of the refreshing content. This position is a consistent location, but
+     * can be adjusted in either direction based on whether or not there is a
+     * toolbar or actionbar present.
+     *
+     * @param scale Set to true if there is no view at a higher z-order than where the progress
+     *              spinner is set to appear. Setting it to true will cause indicator to be scaled
+     *              up rather than clipped.
+     * @param end The offset in pixels from the top of this view at which the
+     *            progress spinner should come to rest after a successful swipe
+     *            gesture.
+     */
+    public void setProgressViewEndTarget(boolean scale, int end) {
+        mSpinnerFinalOffset = end;
+        mScale = scale;
+        mCircleView.invalidate();
+    }
+
+    /**
+     * One of DEFAULT, or LARGE.
+     */
+    public void setSize(int size) {
+        if (size != MaterialProgressDrawable.LARGE && size != MaterialProgressDrawable.DEFAULT) {
+            return;
+        }
+        final DisplayMetrics metrics = getResources().getDisplayMetrics();
+        if (size == MaterialProgressDrawable.LARGE) {
+            mCircleDiameter = (int) (CIRCLE_DIAMETER_LARGE * metrics.density);
+        } else {
+            mCircleDiameter = (int) (CIRCLE_DIAMETER * metrics.density);
+        }
+        // force the bounds of the progress circle inside the circle view to
+        // update by setting it to null before updating its size and then
+        // re-setting it
+        mCircleView.setImageDrawable(null);
+        mProgress.updateSizes(size);
+        mCircleView.setImageDrawable(mProgress);
+    }
+
+    /**
+     * Simple constructor to use when creating a SwipeRefreshLayout from code.
+     *
+     * @param context
+     */
+    public SwipeRefreshLayout(Context context) {
+        this(context, null);
+    }
+
+    /**
+     * Constructor that is called when inflating SwipeRefreshLayout from XML.
+     *
+     * @param context
+     * @param attrs
+     */
+    public SwipeRefreshLayout(Context context, AttributeSet attrs) {
+        super(context, attrs);
+
+        mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
+
+        mMediumAnimationDuration = getResources().getInteger(
+                android.R.integer.config_mediumAnimTime);
+
+        setWillNotDraw(false);
+        mDecelerateInterpolator = new DecelerateInterpolator(DECELERATE_INTERPOLATION_FACTOR);
+
+        final TypedArray a = context.obtainStyledAttributes(attrs, LAYOUT_ATTRS);
+        setEnabled(a.getBoolean(0, true));
+        a.recycle();
+
+        final DisplayMetrics metrics = getResources().getDisplayMetrics();
+        mCircleDiameter = (int) (CIRCLE_DIAMETER * metrics.density);
+
+        createProgressView();
+        ViewCompat.setChildrenDrawingOrderEnabled(this, true);
+        // the absolute offset has to take into account that the circle starts at an offset
+        mSpinnerFinalOffset = DEFAULT_CIRCLE_TARGET * metrics.density;
+        mTotalDragDistance = mSpinnerFinalOffset;
+        mNestedScrollingParentHelper = new NestedScrollingParentHelper(this);
+
+        mNestedScrollingChildHelper = new NestedScrollingChildHelper(this);
+        setNestedScrollingEnabled(true);
+
+        mOriginalOffsetTop = mCurrentTargetOffsetTop = -mCircleDiameter;
+        moveToStart(1.0f);
+    }
+
+    @Override
+    protected int getChildDrawingOrder(int childCount, int i) {
+        if (mCircleViewIndex < 0) {
+            return i;
+        } else if (i == childCount - 1) {
+            // Draw the selected child last
+            return mCircleViewIndex;
+        } else if (i >= mCircleViewIndex) {
+            // Move the children after the selected child earlier one
+            return i + 1;
+        } else {
+            // Keep the children before the selected child the same
+            return i;
+        }
+    }
+
+    private void createProgressView() {
+        mCircleView = new CircleImageView(getContext(), CIRCLE_BG_LIGHT);
+        mProgress = new MaterialProgressDrawable(getContext(), this);
+        mProgress.setBackgroundColor(CIRCLE_BG_LIGHT);
+        mCircleView.setImageDrawable(mProgress);
+        mCircleView.setVisibility(View.GONE);
+        addView(mCircleView);
+    }
+
+    /**
+     * Set the listener to be notified when a refresh is triggered via the swipe
+     * gesture.
+     */
+    public void setOnRefreshListener(OnRefreshListener listener) {
+        mListener = listener;
+    }
+
+    /**
+     * Pre API 11, alpha is used to make the progress circle appear instead of scale.
+     */
+    private boolean isAlphaUsedForScale() {
+        return android.os.Build.VERSION.SDK_INT < 11;
+    }
+
+    /**
+     * Notify the widget that refresh state has changed. Do not call this when
+     * refresh is triggered by a swipe gesture.
+     *
+     * @param refreshing Whether or not the view should show refresh progress.
+     */
+    public void setRefreshing(boolean refreshing) {
+        if (refreshing && mRefreshing != refreshing) {
+            // scale and show
+            mRefreshing = refreshing;
+            int endTarget = 0;
+            if (!mUsingCustomStart) {
+                endTarget = (int) (mSpinnerFinalOffset + mOriginalOffsetTop);
+            } else {
+                endTarget = (int) mSpinnerFinalOffset;
+            }
+            setTargetOffsetTopAndBottom(endTarget - mCurrentTargetOffsetTop,
+                    true /* requires update */);
+            mNotify = false;
+            startScaleUpAnimation(mRefreshListener);
+        } else {
+            setRefreshing(refreshing, false /* notify */);
+        }
+    }
+
+    private void startScaleUpAnimation(AnimationListener listener) {
+        mCircleView.setVisibility(View.VISIBLE);
+        if (android.os.Build.VERSION.SDK_INT >= 11) {
+            // Pre API 11, alpha is used in place of scale up to show the
+            // progress circle appearing.
+            // Don't adjust the alpha during appearance otherwise.
+            mProgress.setAlpha(MAX_ALPHA);
+        }
+        mScaleAnimation = new Animation() {
+            @Override
+            public void applyTransformation(float interpolatedTime, Transformation t) {
+                setAnimationProgress(interpolatedTime);
+            }
+        };
+        mScaleAnimation.setDuration(mMediumAnimationDuration);
+        if (listener != null) {
+            mCircleView.setAnimationListener(listener);
+        }
+        mCircleView.clearAnimation();
+        mCircleView.startAnimation(mScaleAnimation);
+    }
+
+    /**
+     * Pre API 11, this does an alpha animation.
+     * @param progress
+     */
+    private void setAnimationProgress(float progress) {
+        if (isAlphaUsedForScale()) {
+            setColorViewAlpha((int) (progress * MAX_ALPHA));
+        } else {
+            ViewCompat.setScaleX(mCircleView, progress);
+            ViewCompat.setScaleY(mCircleView, progress);
+        }
+    }
+
+    private void setRefreshing(boolean refreshing, final boolean notify) {
+        if (mRefreshing != refreshing) {
+            mNotify = notify;
+            ensureTarget();
+            mRefreshing = refreshing;
+            if (mRefreshing) {
+                animateOffsetToCorrectPosition(mCurrentTargetOffsetTop, mRefreshListener);
+            } else {
+                startScaleDownAnimation(mRefreshListener);
+            }
+        }
+    }
+
+    private void startScaleDownAnimation(Animation.AnimationListener listener) {
+        mScaleDownAnimation = new Animation() {
+            @Override
+            public void applyTransformation(float interpolatedTime, Transformation t) {
+                setAnimationProgress(1 - interpolatedTime);
+            }
+        };
+        mScaleDownAnimation.setDuration(SCALE_DOWN_DURATION);
+        mCircleView.setAnimationListener(listener);
+        mCircleView.clearAnimation();
+        mCircleView.startAnimation(mScaleDownAnimation);
+    }
+
+    private void startProgressAlphaStartAnimation() {
+        mAlphaStartAnimation = startAlphaAnimation(mProgress.getAlpha(), STARTING_PROGRESS_ALPHA);
+    }
+
+    private void startProgressAlphaMaxAnimation() {
+        mAlphaMaxAnimation = startAlphaAnimation(mProgress.getAlpha(), MAX_ALPHA);
+    }
+
+    private Animation startAlphaAnimation(final int startingAlpha, final int endingAlpha) {
+        // Pre API 11, alpha is used in place of scale. Don't also use it to
+        // show the trigger point.
+        if (mScale && isAlphaUsedForScale()) {
+            return null;
+        }
+        Animation alpha = new Animation() {
+            @Override
+            public void applyTransformation(float interpolatedTime, Transformation t) {
+                mProgress
+                        .setAlpha((int) (startingAlpha+ ((endingAlpha - startingAlpha)
+                                * interpolatedTime)));
+            }
+        };
+        alpha.setDuration(ALPHA_ANIMATION_DURATION);
+        // Clear out the previous animation listeners.
+        mCircleView.setAnimationListener(null);
+        mCircleView.clearAnimation();
+        mCircleView.startAnimation(alpha);
+        return alpha;
+    }
+
+    /**
+     * @deprecated Use {@link #setProgressBackgroundColorSchemeResource(int)}
+     */
+    @Deprecated
+    public void setProgressBackgroundColor(int colorRes) {
+        setProgressBackgroundColorSchemeResource(colorRes);
+    }
+
+    /**
+     * Set the background color of the progress spinner disc.
+     *
+     * @param colorRes Resource id of the color.
+     */
+    public void setProgressBackgroundColorSchemeResource(@ColorRes int colorRes) {
+        setProgressBackgroundColorSchemeColor(getResources().getColor(colorRes));
+    }
+
+    /**
+     * Set the background color of the progress spinner disc.
+     *
+     * @param color
+     */
+    public void setProgressBackgroundColorSchemeColor(@ColorInt int color) {
+        mCircleView.setBackgroundColor(color);
+        mProgress.setBackgroundColor(color);
+    }
+
+    /**
+     * @deprecated Use {@link #setColorSchemeResources(int...)}
+     */
+    @Deprecated
+    public void setColorScheme(@ColorInt int... colors) {
+        setColorSchemeResources(colors);
+    }
+
+    /**
+     * Set the color resources used in the progress animation from color resources.
+     * The first color will also be the color of the bar that grows in response
+     * to a user swipe gesture.
+     *
+     * @param colorResIds
+     */
+    public void setColorSchemeResources(@ColorRes int... colorResIds) {
+        final Resources res = getResources();
+        int[] colorRes = new int[colorResIds.length];
+        for (int i = 0; i < colorResIds.length; i++) {
+            colorRes[i] = res.getColor(colorResIds[i]);
+        }
+        setColorSchemeColors(colorRes);
+    }
+
+    /**
+     * Set the colors used in the progress animation. The first
+     * color will also be the color of the bar that grows in response to a user
+     * swipe gesture.
+     *
+     * @param colors
+     */
+    public void setColorSchemeColors(@ColorInt int... colors) {
+        ensureTarget();
+        mProgress.setColorSchemeColors(colors);
+    }
+
+    /**
+     * @return Whether the SwipeRefreshWidget is actively showing refresh
+     *         progress.
+     */
+    public boolean isRefreshing() {
+        return mRefreshing;
+    }
+
+    private void ensureTarget() {
+        // Don't bother getting the parent height if the parent hasn't been laid
+        // out yet.
+        if (mTarget == null) {
+            for (int i = 0; i < getChildCount(); i++) {
+                View child = getChildAt(i);
+                if (!child.equals(mCircleView)) {
+                    mTarget = child;
+                    break;
+                }
+            }
+        }
+    }
+
+    /**
+     * Set the distance to trigger a sync in dips
+     *
+     * @param distance
+     */
+    public void setDistanceToTriggerSync(int distance) {
+        mTotalDragDistance = distance;
+    }
+
+    @Override
+    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
+        final int width = getMeasuredWidth();
+        final int height = getMeasuredHeight();
+        if (getChildCount() == 0) {
+            return;
+        }
+        if (mTarget == null) {
+            ensureTarget();
+        }
+        if (mTarget == null) {
+            return;
+        }
+        final View child = mTarget;
+        final int childLeft = getPaddingLeft();
+        final int childTop = getPaddingTop();
+        final int childWidth = width - getPaddingLeft() - getPaddingRight();
+        final int childHeight = height - getPaddingTop() - getPaddingBottom();
+        child.layout(childLeft, childTop, childLeft + childWidth, childTop + childHeight);
+        int circleWidth = mCircleView.getMeasuredWidth();
+        int circleHeight = mCircleView.getMeasuredHeight();
+        mCircleView.layout((width / 2 - circleWidth / 2), mCurrentTargetOffsetTop,
+                (width / 2 + circleWidth / 2), mCurrentTargetOffsetTop + circleHeight);
+    }
+
+    @Override
+    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+        if (mTarget == null) {
+            ensureTarget();
+        }
+        if (mTarget == null) {
+            return;
+        }
+        mTarget.measure(MeasureSpec.makeMeasureSpec(
+                getMeasuredWidth() - getPaddingLeft() - getPaddingRight(),
+                MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(
+                getMeasuredHeight() - getPaddingTop() - getPaddingBottom(), MeasureSpec.EXACTLY));
+        mCircleView.measure(MeasureSpec.makeMeasureSpec(mCircleDiameter, MeasureSpec.EXACTLY),
+                MeasureSpec.makeMeasureSpec(mCircleDiameter, MeasureSpec.EXACTLY));
+        mCircleViewIndex = -1;
+        // Get the index of the circleview.
+        for (int index = 0; index < getChildCount(); index++) {
+            if (getChildAt(index) == mCircleView) {
+                mCircleViewIndex = index;
+                break;
+            }
+        }
+    }
+
+    /**
+     * Get the diameter of the progress circle that is displayed as part of the
+     * swipe to refresh layout.
+     *
+     * @return Diameter in pixels of the progress circle view.
+     */
+    public int getProgressCircleDiameter() {
+        return mCircleDiameter;
+    }
+
+    /**
+     * @return Whether it is possible for the child view of this layout to
+     *         scroll up. Override this if the child view is a custom view.
+     */
+    public boolean canChildScrollUp() {
+        if (mChildScrollUpCallback != null) {
+            return mChildScrollUpCallback.canChildScrollUp(this, mTarget);
+        }
+        if (android.os.Build.VERSION.SDK_INT < 14) {
+            if (mTarget instanceof AbsListView) {
+                final AbsListView absListView = (AbsListView) mTarget;
+                return absListView.getChildCount() > 0
+                        && (absListView.getFirstVisiblePosition() > 0 || absListView.getChildAt(0)
+                                .getTop() < absListView.getPaddingTop());
+            } else {
+                return ViewCompat.canScrollVertically(mTarget, -1) || mTarget.getScrollY() > 0;
+            }
+        } else {
+            return ViewCompat.canScrollVertically(mTarget, -1);
+        }
+    }
+
+    /**
+     * Set a callback to override {@link SwipeRefreshLayout#canChildScrollUp()} method. Non-null
+     * callback will return the value provided by the callback and ignore all internal logic.
+     * @param callback Callback that should be called when canChildScrollUp() is called.
+     */
+    public void setOnChildScrollUpCallback(@Nullable OnChildScrollUpCallback callback) {
+        mChildScrollUpCallback = callback;
+    }
+
+    @Override
+    public boolean onInterceptTouchEvent(MotionEvent ev) {
+        ensureTarget();
+
+        final int action = MotionEventCompat.getActionMasked(ev);
+
+        if (mReturningToStart && action == MotionEvent.ACTION_DOWN) {
+            mReturningToStart = false;
+        }
+
+        if (!isEnabled() || mReturningToStart || canChildScrollUp()
+                || mRefreshing || mNestedScrollInProgress) {
+            // Fail fast if we're not in a state where a swipe is possible
+            return false;
+        }
+
+        switch (action) {
+            case MotionEvent.ACTION_DOWN:
+                setTargetOffsetTopAndBottom(mOriginalOffsetTop - mCircleView.getTop(), true);
+                mActivePointerId = ev.getPointerId(0);
+                mIsBeingDragged = false;
+                final float initialDownY = getMotionEventY(ev, mActivePointerId);
+                if (initialDownY == -1) {
+                    return false;
+                }
+                mInitialDownY = initialDownY;
+                break;
+
+            case MotionEvent.ACTION_MOVE:
+                if (mActivePointerId == INVALID_POINTER) {
+                    Log.e(LOG_TAG, "Got ACTION_MOVE event but don't have an active pointer id.");
+                    return false;
+                }
+
+                final float y = getMotionEventY(ev, mActivePointerId);
+                if (y == -1) {
+                    return false;
+                }
+                final float yDiff = y - mInitialDownY;
+                if (yDiff > mTouchSlop && !mIsBeingDragged) {
+                    mInitialMotionY = mInitialDownY + mTouchSlop;
+                    mIsBeingDragged = true;
+                    mProgress.setAlpha(STARTING_PROGRESS_ALPHA);
+                }
+                break;
+
+            case MotionEventCompat.ACTION_POINTER_UP:
+                onSecondaryPointerUp(ev);
+                break;
+
+            case MotionEvent.ACTION_UP:
+            case MotionEvent.ACTION_CANCEL:
+                mIsBeingDragged = false;
+                mActivePointerId = INVALID_POINTER;
+                break;
+        }
+
+        return mIsBeingDragged;
+    }
+
+    private float getMotionEventY(MotionEvent ev, int activePointerId) {
+        final int index = ev.findPointerIndex(activePointerId);
+        if (index < 0) {
+            return -1;
+        }
+        return ev.getY(index);
+    }
+
+    @Override
+    public void requestDisallowInterceptTouchEvent(boolean b) {
+        // if this is a List < L or another view that doesn't support nested
+        // scrolling, ignore this request so that the vertical scroll event
+        // isn't stolen
+        if ((android.os.Build.VERSION.SDK_INT < 21 && mTarget instanceof AbsListView)
+                || (mTarget != null && !ViewCompat.isNestedScrollingEnabled(mTarget))) {
+            // Nope.
+        } else {
+            super.requestDisallowInterceptTouchEvent(b);
+        }
+    }
+
+    // NestedScrollingParent
+
+    @Override
+    public boolean onStartNestedScroll(View child, View target, int nestedScrollAxes) {
+        return isEnabled() && !mReturningToStart && !mRefreshing
+                && (nestedScrollAxes & ViewCompat.SCROLL_AXIS_VERTICAL) != 0;
+    }
+
+    @Override
+    public void onNestedScrollAccepted(View child, View target, int axes) {
+        // Reset the counter of how much leftover scroll needs to be consumed.
+        mNestedScrollingParentHelper.onNestedScrollAccepted(child, target, axes);
+        // Dispatch up to the nested parent
+        startNestedScroll(axes & ViewCompat.SCROLL_AXIS_VERTICAL);
+        mTotalUnconsumed = 0;
+        mNestedScrollInProgress = true;
+    }
+
+    @Override
+    public void onNestedPreScroll(View target, int dx, int dy, int[] consumed) {
+        // If we are in the middle of consuming, a scroll, then we want to move the spinner back up
+        // before allowing the list to scroll
+        if (dy > 0 && mTotalUnconsumed > 0) {
+            if (dy > mTotalUnconsumed) {
+                consumed[1] = dy - (int) mTotalUnconsumed;
+                mTotalUnconsumed = 0;
+            } else {
+                mTotalUnconsumed -= dy;
+                consumed[1] = dy;
+            }
+            moveSpinner(mTotalUnconsumed);
+        }
+
+        // If a client layout is using a custom start position for the circle
+        // view, they mean to hide it again before scrolling the child view
+        // If we get back to mTotalUnconsumed == 0 and there is more to go, hide
+        // the circle so it isn't exposed if its blocking content is moved
+        if (mUsingCustomStart && dy > 0 && mTotalUnconsumed == 0
+                && Math.abs(dy - consumed[1]) > 0) {
+            mCircleView.setVisibility(View.GONE);
+        }
+
+        // Now let our nested parent consume the leftovers
+        final int[] parentConsumed = mParentScrollConsumed;
+        if (dispatchNestedPreScroll(dx - consumed[0], dy - consumed[1], parentConsumed, null)) {
+            consumed[0] += parentConsumed[0];
+            consumed[1] += parentConsumed[1];
+        }
+    }
+
+    @Override
+    public int getNestedScrollAxes() {
+        return mNestedScrollingParentHelper.getNestedScrollAxes();
+    }
+
+    @Override
+    public void onStopNestedScroll(View target) {
+        mNestedScrollingParentHelper.onStopNestedScroll(target);
+        mNestedScrollInProgress = false;
+        // Finish the spinner for nested scrolling if we ever consumed any
+        // unconsumed nested scroll
+        if (mTotalUnconsumed > 0) {
+            finishSpinner(mTotalUnconsumed);
+            mTotalUnconsumed = 0;
+        }
+        // Dispatch up our nested parent
+        stopNestedScroll();
+    }
+
+    @Override
+    public void onNestedScroll(final View target, final int dxConsumed, final int dyConsumed,
+            final int dxUnconsumed, final int dyUnconsumed) {
+        // Dispatch up to the nested parent first
+        dispatchNestedScroll(dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed,
+                mParentOffsetInWindow);
+
+        // This is a bit of a hack. Nested scrolling works from the bottom up, and as we are
+        // sometimes between two nested scrolling views, we need a way to be able to know when any
+        // nested scrolling parent has stopped handling events. We do that by using the
+        // 'offset in window 'functionality to see if we have been moved from the event.
+        // This is a decent indication of whether we should take over the event stream or not.
+        final int dy = dyUnconsumed + mParentOffsetInWindow[1];
+        if (dy < 0 && !canChildScrollUp()) {
+            mTotalUnconsumed += Math.abs(dy);
+            moveSpinner(mTotalUnconsumed);
+        }
+    }
+
+    // NestedScrollingChild
+
+    @Override
+    public void setNestedScrollingEnabled(boolean enabled) {
+        mNestedScrollingChildHelper.setNestedScrollingEnabled(enabled);
+    }
+
+    @Override
+    public boolean isNestedScrollingEnabled() {
+        return mNestedScrollingChildHelper.isNestedScrollingEnabled();
+    }
+
+    @Override
+    public boolean startNestedScroll(int axes) {
+        return mNestedScrollingChildHelper.startNestedScroll(axes);
+    }
+
+    @Override
+    public void stopNestedScroll() {
+        mNestedScrollingChildHelper.stopNestedScroll();
+    }
+
+    @Override
+    public boolean hasNestedScrollingParent() {
+        return mNestedScrollingChildHelper.hasNestedScrollingParent();
+    }
+
+    @Override
+    public boolean dispatchNestedScroll(int dxConsumed, int dyConsumed, int dxUnconsumed,
+            int dyUnconsumed, int[] offsetInWindow) {
+        return mNestedScrollingChildHelper.dispatchNestedScroll(dxConsumed, dyConsumed,
+                dxUnconsumed, dyUnconsumed, offsetInWindow);
+    }
+
+    @Override
+    public boolean dispatchNestedPreScroll(int dx, int dy, int[] consumed, int[] offsetInWindow) {
+        return mNestedScrollingChildHelper.dispatchNestedPreScroll(dx, dy, consumed, offsetInWindow);
+    }
+
+    @Override
+    public boolean onNestedPreFling(View target, float velocityX,
+            float velocityY) {
+        return dispatchNestedPreFling(velocityX, velocityY);
+    }
+
+    @Override
+    public boolean onNestedFling(View target, float velocityX, float velocityY,
+            boolean consumed) {
+        return dispatchNestedFling(velocityX, velocityY, consumed);
+    }
+
+    @Override
+    public boolean dispatchNestedFling(float velocityX, float velocityY, boolean consumed) {
+        return mNestedScrollingChildHelper.dispatchNestedFling(velocityX, velocityY, consumed);
+    }
+
+    @Override
+    public boolean dispatchNestedPreFling(float velocityX, float velocityY) {
+        return mNestedScrollingChildHelper.dispatchNestedPreFling(velocityX, velocityY);
+    }
+
+    private boolean isAnimationRunning(Animation animation) {
+        return animation != null && animation.hasStarted() && !animation.hasEnded();
+    }
+
+    private void moveSpinner(float overscrollTop) {
+        mProgress.showArrow(true);
+        float originalDragPercent = overscrollTop / mTotalDragDistance;
+
+        float dragPercent = Math.min(1f, Math.abs(originalDragPercent));
+        float adjustedPercent = (float) Math.max(dragPercent - .4, 0) * 5 / 3;
+        float extraOS = Math.abs(overscrollTop) - mTotalDragDistance;
+        float slingshotDist = mUsingCustomStart ? mSpinnerFinalOffset - mOriginalOffsetTop
+                : mSpinnerFinalOffset;
+        float tensionSlingshotPercent = Math.max(0, Math.min(extraOS, slingshotDist * 2)
+                / slingshotDist);
+        float tensionPercent = (float) ((tensionSlingshotPercent / 4) - Math.pow(
+                (tensionSlingshotPercent / 4), 2)) * 2f;
+        float extraMove = (slingshotDist) * tensionPercent * 2;
+
+        int targetY = mOriginalOffsetTop + (int) ((slingshotDist * dragPercent) + extraMove);
+        // where 1.0f is a full circle
+        if (mCircleView.getVisibility() != View.VISIBLE) {
+            mCircleView.setVisibility(View.VISIBLE);
+        }
+        if (!mScale) {
+            ViewCompat.setScaleX(mCircleView, 1f);
+            ViewCompat.setScaleY(mCircleView, 1f);
+        }
+
+        if (mScale) {
+            setAnimationProgress(Math.min(1f, overscrollTop / mTotalDragDistance));
+        }
+        if (overscrollTop < mTotalDragDistance) {
+            if (mProgress.getAlpha() > STARTING_PROGRESS_ALPHA
+                    && !isAnimationRunning(mAlphaStartAnimation)) {
+                // Animate the alpha
+                startProgressAlphaStartAnimation();
+            }
+        } else {
+            if (mProgress.getAlpha() < MAX_ALPHA && !isAnimationRunning(mAlphaMaxAnimation)) {
+                // Animate the alpha
+                startProgressAlphaMaxAnimation();
+            }
+        }
+        float strokeStart = adjustedPercent * .8f;
+        mProgress.setStartEndTrim(0f, Math.min(MAX_PROGRESS_ANGLE, strokeStart));
+        mProgress.setArrowScale(Math.min(1f, adjustedPercent));
+
+        float rotation = (-0.25f + .4f * adjustedPercent + tensionPercent * 2) * .5f;
+        mProgress.setProgressRotation(rotation);
+        setTargetOffsetTopAndBottom(targetY - mCurrentTargetOffsetTop, true /* requires update */);
+    }
+
+    private void finishSpinner(float overscrollTop) {
+        if (overscrollTop > mTotalDragDistance) {
+            setRefreshing(true, true /* notify */);
+        } else {
+            // cancel refresh
+            mRefreshing = false;
+            mProgress.setStartEndTrim(0f, 0f);
+            Animation.AnimationListener listener = null;
+            if (!mScale) {
+                listener = new Animation.AnimationListener() {
+
+                    @Override
+                    public void onAnimationStart(Animation animation) {
+                    }
+
+                    @Override
+                    public void onAnimationEnd(Animation animation) {
+                        if (!mScale) {
+                            startScaleDownAnimation(null);
+                        }
+                    }
+
+                    @Override
+                    public void onAnimationRepeat(Animation animation) {
+                    }
+
+                };
+            }
+            animateOffsetToStartPosition(mCurrentTargetOffsetTop, listener);
+            mProgress.showArrow(false);
+        }
+    }
+
+    @Override
+    public boolean onTouchEvent(MotionEvent ev) {
+        final int action = MotionEventCompat.getActionMasked(ev);
+        int pointerIndex = -1;
+
+        if (mReturningToStart && action == MotionEvent.ACTION_DOWN) {
+            mReturningToStart = false;
+        }
+
+        if (!isEnabled() || mReturningToStart || canChildScrollUp() || mNestedScrollInProgress) {
+            // Fail fast if we're not in a state where a swipe is possible
+            return false;
+        }
+
+        switch (action) {
+            case MotionEvent.ACTION_DOWN:
+                mActivePointerId = ev.getPointerId(0);
+                mIsBeingDragged = false;
+                break;
+
+            case MotionEvent.ACTION_MOVE: {
+                pointerIndex = ev.findPointerIndex(mActivePointerId);
+                if (pointerIndex < 0) {
+                    Log.e(LOG_TAG, "Got ACTION_MOVE event but have an invalid active pointer id.");
+                    return false;
+                }
+
+                final float y = ev.getY(pointerIndex);
+                final float overscrollTop = (y - mInitialMotionY) * DRAG_RATE;
+                if (mIsBeingDragged) {
+                    if (overscrollTop > 0) {
+                        moveSpinner(overscrollTop);
+                    } else {
+                        return false;
+                    }
+                }
+                break;
+            }
+            case MotionEventCompat.ACTION_POINTER_DOWN: {
+                pointerIndex = MotionEventCompat.getActionIndex(ev);
+                if (pointerIndex < 0) {
+                    Log.e(LOG_TAG, "Got ACTION_POINTER_DOWN event but have an invalid action index.");
+                    return false;
+                }
+                mActivePointerId = ev.getPointerId(pointerIndex);
+                break;
+            }
+
+            case MotionEventCompat.ACTION_POINTER_UP:
+                onSecondaryPointerUp(ev);
+                break;
+
+            case MotionEvent.ACTION_UP: {
+                pointerIndex = ev.findPointerIndex(mActivePointerId);
+                if (pointerIndex < 0) {
+                    Log.e(LOG_TAG, "Got ACTION_UP event but don't have an active pointer id.");
+                    return false;
+                }
+
+                final float y = ev.getY(pointerIndex);
+                final float overscrollTop = (y - mInitialMotionY) * DRAG_RATE;
+                mIsBeingDragged = false;
+                finishSpinner(overscrollTop);
+                mActivePointerId = INVALID_POINTER;
+                return false;
+            }
+            case MotionEvent.ACTION_CANCEL:
+                return false;
+        }
+
+        return true;
+    }
+
+    private void animateOffsetToCorrectPosition(int from, AnimationListener listener) {
+        mFrom = from;
+        mAnimateToCorrectPosition.reset();
+        mAnimateToCorrectPosition.setDuration(ANIMATE_TO_TRIGGER_DURATION);
+        mAnimateToCorrectPosition.setInterpolator(mDecelerateInterpolator);
+        if (listener != null) {
+            mCircleView.setAnimationListener(listener);
+        }
+        mCircleView.clearAnimation();
+        mCircleView.startAnimation(mAnimateToCorrectPosition);
+    }
+
+    private void animateOffsetToStartPosition(int from, AnimationListener listener) {
+        if (mScale) {
+            // Scale the item back down
+            startScaleDownReturnToStartAnimation(from, listener);
+        } else {
+            mFrom = from;
+            mAnimateToStartPosition.reset();
+            mAnimateToStartPosition.setDuration(ANIMATE_TO_START_DURATION);
+            mAnimateToStartPosition.setInterpolator(mDecelerateInterpolator);
+            if (listener != null) {
+                mCircleView.setAnimationListener(listener);
+            }
+            mCircleView.clearAnimation();
+            mCircleView.startAnimation(mAnimateToStartPosition);
+        }
+    }
+
+    private final Animation mAnimateToCorrectPosition = new Animation() {
+        @Override
+        public void applyTransformation(float interpolatedTime, Transformation t) {
+            int targetTop = 0;
+            int endTarget = 0;
+            if (!mUsingCustomStart) {
+                endTarget = (int) (mSpinnerFinalOffset - Math.abs(mOriginalOffsetTop));
+            } else {
+                endTarget = (int) mSpinnerFinalOffset;
+            }
+            targetTop = (mFrom + (int) ((endTarget - mFrom) * interpolatedTime));
+            int offset = targetTop - mCircleView.getTop();
+            setTargetOffsetTopAndBottom(offset, false /* requires update */);
+            mProgress.setArrowScale(1 - interpolatedTime);
+        }
+    };
+
+    private void moveToStart(float interpolatedTime) {
+        int targetTop = 0;
+        targetTop = (mFrom + (int) ((mOriginalOffsetTop - mFrom) * interpolatedTime));
+        int offset = targetTop - mCircleView.getTop();
+        setTargetOffsetTopAndBottom(offset, false /* requires update */);
+    }
+
+    private final Animation mAnimateToStartPosition = new Animation() {
+        @Override
+        public void applyTransformation(float interpolatedTime, Transformation t) {
+            moveToStart(interpolatedTime);
+        }
+    };
+
+    private void startScaleDownReturnToStartAnimation(int from,
+            Animation.AnimationListener listener) {
+        mFrom = from;
+        if (isAlphaUsedForScale()) {
+            mStartingScale = mProgress.getAlpha();
+        } else {
+            mStartingScale = ViewCompat.getScaleX(mCircleView);
+        }
+        mScaleDownToStartAnimation = new Animation() {
+            @Override
+            public void applyTransformation(float interpolatedTime, Transformation t) {
+                float targetScale = (mStartingScale + (-mStartingScale  * interpolatedTime));
+                setAnimationProgress(targetScale);
+                moveToStart(interpolatedTime);
+            }
+        };
+        mScaleDownToStartAnimation.setDuration(SCALE_DOWN_DURATION);
+        if (listener != null) {
+            mCircleView.setAnimationListener(listener);
+        }
+        mCircleView.clearAnimation();
+        mCircleView.startAnimation(mScaleDownToStartAnimation);
+    }
+
+    private void setTargetOffsetTopAndBottom(int offset, boolean requiresUpdate) {
+        mCircleView.bringToFront();
+        mCircleView.offsetTopAndBottom(offset);
+        mCurrentTargetOffsetTop = mCircleView.getTop();
+        if (requiresUpdate && android.os.Build.VERSION.SDK_INT < 11) {
+            invalidate();
+        }
+    }
+
+    private void onSecondaryPointerUp(MotionEvent ev) {
+        final int pointerIndex = MotionEventCompat.getActionIndex(ev);
+        final int pointerId = ev.getPointerId(pointerIndex);
+        if (pointerId == mActivePointerId) {
+            // This was our active pointer going up. Choose a new
+            // active pointer and adjust accordingly.
+            final int newPointerIndex = pointerIndex == 0 ? 1 : 0;
+            mActivePointerId = ev.getPointerId(newPointerIndex);
+        }
+    }
+
+    /**
+     * Classes that wish to be notified when the swipe gesture correctly
+     * triggers a refresh should implement this interface.
+     */
+    public interface OnRefreshListener {
+        public void onRefresh();
+    }
+
+    /**
+     * Classes that wish to override {@link SwipeRefreshLayout#canChildScrollUp()} method
+     * behavior should implement this interface.
+     */
+    public interface OnChildScrollUpCallback {
+        /**
+         * Callback that will be called when {@link SwipeRefreshLayout#canChildScrollUp()} method
+         * is called to allow the implementer to override its behavior.
+         *
+         * @param parent SwipeRefreshLayout that this callback is overriding.
+         * @param child The child view of SwipeRefreshLayout.
+         *
+         * @return Whether it is possible for the child view of parent layout to scroll up.
+         */
+        public boolean canChildScrollUp(SwipeRefreshLayout parent, @Nullable View child);
+    }
+}
diff --git a/core-ui/java/android/support/v4/widget/ViewDragHelper.java b/core-ui/java/android/support/v4/widget/ViewDragHelper.java
new file mode 100644
index 0000000..39972f0
--- /dev/null
+++ b/core-ui/java/android/support/v4/widget/ViewDragHelper.java
@@ -0,0 +1,1506 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+package android.support.v4.widget;
+
+import android.content.Context;
+import android.support.v4.view.MotionEventCompat;
+import android.support.v4.view.VelocityTrackerCompat;
+import android.support.v4.view.ViewCompat;
+import android.util.Log;
+import android.view.MotionEvent;
+import android.view.VelocityTracker;
+import android.view.View;
+import android.view.ViewConfiguration;
+import android.view.ViewGroup;
+import android.view.animation.Interpolator;
+
+import java.util.Arrays;
+
+/**
+ * ViewDragHelper is a utility class for writing custom ViewGroups. It offers a number
+ * of useful operations and state tracking for allowing a user to drag and reposition
+ * views within their parent ViewGroup.
+ */
+public class ViewDragHelper {
+    private static final String TAG = "ViewDragHelper";
+
+    /**
+     * A null/invalid pointer ID.
+     */
+    public static final int INVALID_POINTER = -1;
+
+    /**
+     * A view is not currently being dragged or animating as a result of a fling/snap.
+     */
+    public static final int STATE_IDLE = 0;
+
+    /**
+     * A view is currently being dragged. The position is currently changing as a result
+     * of user input or simulated user input.
+     */
+    public static final int STATE_DRAGGING = 1;
+
+    /**
+     * A view is currently settling into place as a result of a fling or
+     * predefined non-interactive motion.
+     */
+    public static final int STATE_SETTLING = 2;
+
+    /**
+     * Edge flag indicating that the left edge should be affected.
+     */
+    public static final int EDGE_LEFT = 1 << 0;
+
+    /**
+     * Edge flag indicating that the right edge should be affected.
+     */
+    public static final int EDGE_RIGHT = 1 << 1;
+
+    /**
+     * Edge flag indicating that the top edge should be affected.
+     */
+    public static final int EDGE_TOP = 1 << 2;
+
+    /**
+     * Edge flag indicating that the bottom edge should be affected.
+     */
+    public static final int EDGE_BOTTOM = 1 << 3;
+
+    /**
+     * Edge flag set indicating all edges should be affected.
+     */
+    public static final int EDGE_ALL = EDGE_LEFT | EDGE_TOP | EDGE_RIGHT | EDGE_BOTTOM;
+
+    /**
+     * Indicates that a check should occur along the horizontal axis
+     */
+    public static final int DIRECTION_HORIZONTAL = 1 << 0;
+
+    /**
+     * Indicates that a check should occur along the vertical axis
+     */
+    public static final int DIRECTION_VERTICAL = 1 << 1;
+
+    /**
+     * Indicates that a check should occur along all axes
+     */
+    public static final int DIRECTION_ALL = DIRECTION_HORIZONTAL | DIRECTION_VERTICAL;
+
+    private static final int EDGE_SIZE = 20; // dp
+
+    private static final int BASE_SETTLE_DURATION = 256; // ms
+    private static final int MAX_SETTLE_DURATION = 600; // ms
+
+    // Current drag state; idle, dragging or settling
+    private int mDragState;
+
+    // Distance to travel before a drag may begin
+    private int mTouchSlop;
+
+    // Last known position/pointer tracking
+    private int mActivePointerId = INVALID_POINTER;
+    private float[] mInitialMotionX;
+    private float[] mInitialMotionY;
+    private float[] mLastMotionX;
+    private float[] mLastMotionY;
+    private int[] mInitialEdgesTouched;
+    private int[] mEdgeDragsInProgress;
+    private int[] mEdgeDragsLocked;
+    private int mPointersDown;
+
+    private VelocityTracker mVelocityTracker;
+    private float mMaxVelocity;
+    private float mMinVelocity;
+
+    private int mEdgeSize;
+    private int mTrackingEdges;
+
+    private ScrollerCompat mScroller;
+
+    private final Callback mCallback;
+
+    private View mCapturedView;
+    private boolean mReleaseInProgress;
+
+    private final ViewGroup mParentView;
+
+    /**
+     * A Callback is used as a communication channel with the ViewDragHelper back to the
+     * parent view using it. <code>on*</code>methods are invoked on siginficant events and several
+     * accessor methods are expected to provide the ViewDragHelper with more information
+     * about the state of the parent view upon request. The callback also makes decisions
+     * governing the range and draggability of child views.
+     */
+    public static abstract class Callback {
+        /**
+         * Called when the drag state changes. See the <code>STATE_*</code> constants
+         * for more information.
+         *
+         * @param state The new drag state
+         *
+         * @see #STATE_IDLE
+         * @see #STATE_DRAGGING
+         * @see #STATE_SETTLING
+         */
+        public void onViewDragStateChanged(int state) {}
+
+        /**
+         * Called when the captured view's position changes as the result of a drag or settle.
+         *
+         * @param changedView View whose position changed
+         * @param left New X coordinate of the left edge of the view
+         * @param top New Y coordinate of the top edge of the view
+         * @param dx Change in X position from the last call
+         * @param dy Change in Y position from the last call
+         */
+        public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) {}
+
+        /**
+         * Called when a child view is captured for dragging or settling. The ID of the pointer
+         * currently dragging the captured view is supplied. If activePointerId is
+         * identified as {@link #INVALID_POINTER} the capture is programmatic instead of
+         * pointer-initiated.
+         *
+         * @param capturedChild Child view that was captured
+         * @param activePointerId Pointer id tracking the child capture
+         */
+        public void onViewCaptured(View capturedChild, int activePointerId) {}
+
+        /**
+         * Called when the child view is no longer being actively dragged.
+         * The fling velocity is also supplied, if relevant. The velocity values may
+         * be clamped to system minimums or maximums.
+         *
+         * <p>Calling code may decide to fling or otherwise release the view to let it
+         * settle into place. It should do so using {@link #settleCapturedViewAt(int, int)}
+         * or {@link #flingCapturedView(int, int, int, int)}. If the Callback invokes
+         * one of these methods, the ViewDragHelper will enter {@link #STATE_SETTLING}
+         * and the view capture will not fully end until it comes to a complete stop.
+         * If neither of these methods is invoked before <code>onViewReleased</code> returns,
+         * the view will stop in place and the ViewDragHelper will return to
+         * {@link #STATE_IDLE}.</p>
+         *
+         * @param releasedChild The captured child view now being released
+         * @param xvel X velocity of the pointer as it left the screen in pixels per second.
+         * @param yvel Y velocity of the pointer as it left the screen in pixels per second.
+         */
+        public void onViewReleased(View releasedChild, float xvel, float yvel) {}
+
+        /**
+         * Called when one of the subscribed edges in the parent view has been touched
+         * by the user while no child view is currently captured.
+         *
+         * @param edgeFlags A combination of edge flags describing the edge(s) currently touched
+         * @param pointerId ID of the pointer touching the described edge(s)
+         * @see #EDGE_LEFT
+         * @see #EDGE_TOP
+         * @see #EDGE_RIGHT
+         * @see #EDGE_BOTTOM
+         */
+        public void onEdgeTouched(int edgeFlags, int pointerId) {}
+
+        /**
+         * Called when the given edge may become locked. This can happen if an edge drag
+         * was preliminarily rejected before beginning, but after {@link #onEdgeTouched(int, int)}
+         * was called. This method should return true to lock this edge or false to leave it
+         * unlocked. The default behavior is to leave edges unlocked.
+         *
+         * @param edgeFlags A combination of edge flags describing the edge(s) locked
+         * @return true to lock the edge, false to leave it unlocked
+         */
+        public boolean onEdgeLock(int edgeFlags) {
+            return false;
+        }
+
+        /**
+         * Called when the user has started a deliberate drag away from one
+         * of the subscribed edges in the parent view while no child view is currently captured.
+         *
+         * @param edgeFlags A combination of edge flags describing the edge(s) dragged
+         * @param pointerId ID of the pointer touching the described edge(s)
+         * @see #EDGE_LEFT
+         * @see #EDGE_TOP
+         * @see #EDGE_RIGHT
+         * @see #EDGE_BOTTOM
+         */
+        public void onEdgeDragStarted(int edgeFlags, int pointerId) {}
+
+        /**
+         * Called to determine the Z-order of child views.
+         *
+         * @param index the ordered position to query for
+         * @return index of the view that should be ordered at position <code>index</code>
+         */
+        public int getOrderedChildIndex(int index) {
+            return index;
+        }
+
+        /**
+         * Return the magnitude of a draggable child view's horizontal range of motion in pixels.
+         * This method should return 0 for views that cannot move horizontally.
+         *
+         * @param child Child view to check
+         * @return range of horizontal motion in pixels
+         */
+        public int getViewHorizontalDragRange(View child) {
+            return 0;
+        }
+
+        /**
+         * Return the magnitude of a draggable child view's vertical range of motion in pixels.
+         * This method should return 0 for views that cannot move vertically.
+         *
+         * @param child Child view to check
+         * @return range of vertical motion in pixels
+         */
+        public int getViewVerticalDragRange(View child) {
+            return 0;
+        }
+
+        /**
+         * Called when the user's input indicates that they want to capture the given child view
+         * with the pointer indicated by pointerId. The callback should return true if the user
+         * is permitted to drag the given view with the indicated pointer.
+         *
+         * <p>ViewDragHelper may call this method multiple times for the same view even if
+         * the view is already captured; this indicates that a new pointer is trying to take
+         * control of the view.</p>
+         *
+         * <p>If this method returns true, a call to {@link #onViewCaptured(android.view.View, int)}
+         * will follow if the capture is successful.</p>
+         *
+         * @param child Child the user is attempting to capture
+         * @param pointerId ID of the pointer attempting the capture
+         * @return true if capture should be allowed, false otherwise
+         */
+        public abstract boolean tryCaptureView(View child, int pointerId);
+
+        /**
+         * Restrict the motion of the dragged child view along the horizontal axis.
+         * The default implementation does not allow horizontal motion; the extending
+         * class must override this method and provide the desired clamping.
+         *
+         *
+         * @param child Child view being dragged
+         * @param left Attempted motion along the X axis
+         * @param dx Proposed change in position for left
+         * @return The new clamped position for left
+         */
+        public int clampViewPositionHorizontal(View child, int left, int dx) {
+            return 0;
+        }
+
+        /**
+         * Restrict the motion of the dragged child view along the vertical axis.
+         * The default implementation does not allow vertical motion; the extending
+         * class must override this method and provide the desired clamping.
+         *
+         *
+         * @param child Child view being dragged
+         * @param top Attempted motion along the Y axis
+         * @param dy Proposed change in position for top
+         * @return The new clamped position for top
+         */
+        public int clampViewPositionVertical(View child, int top, int dy) {
+            return 0;
+        }
+    }
+
+    /**
+     * Interpolator defining the animation curve for mScroller
+     */
+    private static final Interpolator sInterpolator = new Interpolator() {
+        @Override
+        public float getInterpolation(float t) {
+            t -= 1.0f;
+            return t * t * t * t * t + 1.0f;
+        }
+    };
+
+    private final Runnable mSetIdleRunnable = new Runnable() {
+        @Override
+        public void run() {
+            setDragState(STATE_IDLE);
+        }
+    };
+
+    /**
+     * Factory method to create a new ViewDragHelper.
+     *
+     * @param forParent Parent view to monitor
+     * @param cb Callback to provide information and receive events
+     * @return a new ViewDragHelper instance
+     */
+    public static ViewDragHelper create(ViewGroup forParent, Callback cb) {
+        return new ViewDragHelper(forParent.getContext(), forParent, cb);
+    }
+
+    /**
+     * Factory method to create a new ViewDragHelper.
+     *
+     * @param forParent Parent view to monitor
+     * @param sensitivity Multiplier for how sensitive the helper should be about detecting
+     *                    the start of a drag. Larger values are more sensitive. 1.0f is normal.
+     * @param cb Callback to provide information and receive events
+     * @return a new ViewDragHelper instance
+     */
+    public static ViewDragHelper create(ViewGroup forParent, float sensitivity, Callback cb) {
+        final ViewDragHelper helper = create(forParent, cb);
+        helper.mTouchSlop = (int) (helper.mTouchSlop * (1 / sensitivity));
+        return helper;
+    }
+
+    /**
+     * Apps should use ViewDragHelper.create() to get a new instance.
+     * This will allow VDH to use internal compatibility implementations for different
+     * platform versions.
+     *
+     * @param context Context to initialize config-dependent params from
+     * @param forParent Parent view to monitor
+     */
+    private ViewDragHelper(Context context, ViewGroup forParent, Callback cb) {
+        if (forParent == null) {
+            throw new IllegalArgumentException("Parent view may not be null");
+        }
+        if (cb == null) {
+            throw new IllegalArgumentException("Callback may not be null");
+        }
+
+        mParentView = forParent;
+        mCallback = cb;
+
+        final ViewConfiguration vc = ViewConfiguration.get(context);
+        final float density = context.getResources().getDisplayMetrics().density;
+        mEdgeSize = (int) (EDGE_SIZE * density + 0.5f);
+
+        mTouchSlop = vc.getScaledTouchSlop();
+        mMaxVelocity = vc.getScaledMaximumFlingVelocity();
+        mMinVelocity = vc.getScaledMinimumFlingVelocity();
+        mScroller = ScrollerCompat.create(context, sInterpolator);
+    }
+
+    /**
+     * Set the minimum velocity that will be detected as having a magnitude greater than zero
+     * in pixels per second. Callback methods accepting a velocity will be clamped appropriately.
+     *
+     * @param minVel Minimum velocity to detect
+     */
+    public void setMinVelocity(float minVel) {
+        mMinVelocity = minVel;
+    }
+
+    /**
+     * Return the currently configured minimum velocity. Any flings with a magnitude less
+     * than this value in pixels per second. Callback methods accepting a velocity will receive
+     * zero as a velocity value if the real detected velocity was below this threshold.
+     *
+     * @return the minimum velocity that will be detected
+     */
+    public float getMinVelocity() {
+        return mMinVelocity;
+    }
+
+    /**
+     * Retrieve the current drag state of this helper. This will return one of
+     * {@link #STATE_IDLE}, {@link #STATE_DRAGGING} or {@link #STATE_SETTLING}.
+     * @return The current drag state
+     */
+    public int getViewDragState() {
+        return mDragState;
+    }
+
+    /**
+     * Enable edge tracking for the selected edges of the parent view.
+     * The callback's {@link Callback#onEdgeTouched(int, int)} and
+     * {@link Callback#onEdgeDragStarted(int, int)} methods will only be invoked
+     * for edges for which edge tracking has been enabled.
+     *
+     * @param edgeFlags Combination of edge flags describing the edges to watch
+     * @see #EDGE_LEFT
+     * @see #EDGE_TOP
+     * @see #EDGE_RIGHT
+     * @see #EDGE_BOTTOM
+     */
+    public void setEdgeTrackingEnabled(int edgeFlags) {
+        mTrackingEdges = edgeFlags;
+    }
+
+    /**
+     * Return the size of an edge. This is the range in pixels along the edges of this view
+     * that will actively detect edge touches or drags if edge tracking is enabled.
+     *
+     * @return The size of an edge in pixels
+     * @see #setEdgeTrackingEnabled(int)
+     */
+    public int getEdgeSize() {
+        return mEdgeSize;
+    }
+
+    /**
+     * Capture a specific child view for dragging within the parent. The callback will be notified
+     * but {@link Callback#tryCaptureView(android.view.View, int)} will not be asked permission to
+     * capture this view.
+     *
+     * @param childView Child view to capture
+     * @param activePointerId ID of the pointer that is dragging the captured child view
+     */
+    public void captureChildView(View childView, int activePointerId) {
+        if (childView.getParent() != mParentView) {
+            throw new IllegalArgumentException("captureChildView: parameter must be a descendant " +
+                    "of the ViewDragHelper's tracked parent view (" + mParentView + ")");
+        }
+
+        mCapturedView = childView;
+        mActivePointerId = activePointerId;
+        mCallback.onViewCaptured(childView, activePointerId);
+        setDragState(STATE_DRAGGING);
+    }
+
+    /**
+     * @return The currently captured view, or null if no view has been captured.
+     */
+    public View getCapturedView() {
+        return mCapturedView;
+    }
+
+    /**
+     * @return The ID of the pointer currently dragging the captured view,
+     *         or {@link #INVALID_POINTER}.
+     */
+    public int getActivePointerId() {
+        return mActivePointerId;
+    }
+
+    /**
+     * @return The minimum distance in pixels that the user must travel to initiate a drag
+     */
+    public int getTouchSlop() {
+        return mTouchSlop;
+    }
+
+    /**
+     * The result of a call to this method is equivalent to
+     * {@link #processTouchEvent(android.view.MotionEvent)} receiving an ACTION_CANCEL event.
+     */
+    public void cancel() {
+        mActivePointerId = INVALID_POINTER;
+        clearMotionHistory();
+
+        if (mVelocityTracker != null) {
+            mVelocityTracker.recycle();
+            mVelocityTracker = null;
+        }
+    }
+
+    /**
+     * {@link #cancel()}, but also abort all motion in progress and snap to the end of any
+     * animation.
+     */
+    public void abort() {
+        cancel();
+        if (mDragState == STATE_SETTLING) {
+            final int oldX = mScroller.getCurrX();
+            final int oldY = mScroller.getCurrY();
+            mScroller.abortAnimation();
+            final int newX = mScroller.getCurrX();
+            final int newY = mScroller.getCurrY();
+            mCallback.onViewPositionChanged(mCapturedView, newX, newY, newX - oldX, newY - oldY);
+        }
+        setDragState(STATE_IDLE);
+    }
+
+    /**
+     * Animate the view <code>child</code> to the given (left, top) position.
+     * If this method returns true, the caller should invoke {@link #continueSettling(boolean)}
+     * on each subsequent frame to continue the motion until it returns false. If this method
+     * returns false there is no further work to do to complete the movement.
+     *
+     * <p>This operation does not count as a capture event, though {@link #getCapturedView()}
+     * will still report the sliding view while the slide is in progress.</p>
+     *
+     * @param child Child view to capture and animate
+     * @param finalLeft Final left position of child
+     * @param finalTop Final top position of child
+     * @return true if animation should continue through {@link #continueSettling(boolean)} calls
+     */
+    public boolean smoothSlideViewTo(View child, int finalLeft, int finalTop) {
+        mCapturedView = child;
+        mActivePointerId = INVALID_POINTER;
+
+        boolean continueSliding = forceSettleCapturedViewAt(finalLeft, finalTop, 0, 0);
+        if (!continueSliding && mDragState == STATE_IDLE && mCapturedView != null) {
+            // If we're in an IDLE state to begin with and aren't moving anywhere, we
+            // end up having a non-null capturedView with an IDLE dragState
+            mCapturedView = null;
+        }
+
+        return continueSliding;
+    }
+
+    /**
+     * Settle the captured view at the given (left, top) position.
+     * The appropriate velocity from prior motion will be taken into account.
+     * If this method returns true, the caller should invoke {@link #continueSettling(boolean)}
+     * on each subsequent frame to continue the motion until it returns false. If this method
+     * returns false there is no further work to do to complete the movement.
+     *
+     * @param finalLeft Settled left edge position for the captured view
+     * @param finalTop Settled top edge position for the captured view
+     * @return true if animation should continue through {@link #continueSettling(boolean)} calls
+     */
+    public boolean settleCapturedViewAt(int finalLeft, int finalTop) {
+        if (!mReleaseInProgress) {
+            throw new IllegalStateException("Cannot settleCapturedViewAt outside of a call to " +
+                    "Callback#onViewReleased");
+        }
+
+        return forceSettleCapturedViewAt(finalLeft, finalTop,
+                (int) VelocityTrackerCompat.getXVelocity(mVelocityTracker, mActivePointerId),
+                (int) VelocityTrackerCompat.getYVelocity(mVelocityTracker, mActivePointerId));
+    }
+
+    /**
+     * Settle the captured view at the given (left, top) position.
+     *
+     * @param finalLeft Target left position for the captured view
+     * @param finalTop Target top position for the captured view
+     * @param xvel Horizontal velocity
+     * @param yvel Vertical velocity
+     * @return true if animation should continue through {@link #continueSettling(boolean)} calls
+     */
+    private boolean forceSettleCapturedViewAt(int finalLeft, int finalTop, int xvel, int yvel) {
+        final int startLeft = mCapturedView.getLeft();
+        final int startTop = mCapturedView.getTop();
+        final int dx = finalLeft - startLeft;
+        final int dy = finalTop - startTop;
+
+        if (dx == 0 && dy == 0) {
+            // Nothing to do. Send callbacks, be done.
+            mScroller.abortAnimation();
+            setDragState(STATE_IDLE);
+            return false;
+        }
+
+        final int duration = computeSettleDuration(mCapturedView, dx, dy, xvel, yvel);
+        mScroller.startScroll(startLeft, startTop, dx, dy, duration);
+
+        setDragState(STATE_SETTLING);
+        return true;
+    }
+
+    private int computeSettleDuration(View child, int dx, int dy, int xvel, int yvel) {
+        xvel = clampMag(xvel, (int) mMinVelocity, (int) mMaxVelocity);
+        yvel = clampMag(yvel, (int) mMinVelocity, (int) mMaxVelocity);
+        final int absDx = Math.abs(dx);
+        final int absDy = Math.abs(dy);
+        final int absXVel = Math.abs(xvel);
+        final int absYVel = Math.abs(yvel);
+        final int addedVel = absXVel + absYVel;
+        final int addedDistance = absDx + absDy;
+
+        final float xweight = xvel != 0 ? (float) absXVel / addedVel :
+                (float) absDx / addedDistance;
+        final float yweight = yvel != 0 ? (float) absYVel / addedVel :
+                (float) absDy / addedDistance;
+
+        int xduration = computeAxisDuration(dx, xvel, mCallback.getViewHorizontalDragRange(child));
+        int yduration = computeAxisDuration(dy, yvel, mCallback.getViewVerticalDragRange(child));
+
+        return (int) (xduration * xweight + yduration * yweight);
+    }
+
+    private int computeAxisDuration(int delta, int velocity, int motionRange) {
+        if (delta == 0) {
+            return 0;
+        }
+
+        final int width = mParentView.getWidth();
+        final int halfWidth = width / 2;
+        final float distanceRatio = Math.min(1f, (float) Math.abs(delta) / width);
+        final float distance = halfWidth + halfWidth *
+                distanceInfluenceForSnapDuration(distanceRatio);
+
+        int duration;
+        velocity = Math.abs(velocity);
+        if (velocity > 0) {
+            duration = 4 * Math.round(1000 * Math.abs(distance / velocity));
+        } else {
+            final float range = (float) Math.abs(delta) / motionRange;
+            duration = (int) ((range + 1) * BASE_SETTLE_DURATION);
+        }
+        return Math.min(duration, MAX_SETTLE_DURATION);
+    }
+
+    /**
+     * Clamp the magnitude of value for absMin and absMax.
+     * If the value is below the minimum, it will be clamped to zero.
+     * If the value is above the maximum, it will be clamped to the maximum.
+     *
+     * @param value Value to clamp
+     * @param absMin Absolute value of the minimum significant value to return
+     * @param absMax Absolute value of the maximum value to return
+     * @return The clamped value with the same sign as <code>value</code>
+     */
+    private int clampMag(int value, int absMin, int absMax) {
+        final int absValue = Math.abs(value);
+        if (absValue < absMin) return 0;
+        if (absValue > absMax) return value > 0 ? absMax : -absMax;
+        return value;
+    }
+
+    /**
+     * Clamp the magnitude of value for absMin and absMax.
+     * If the value is below the minimum, it will be clamped to zero.
+     * If the value is above the maximum, it will be clamped to the maximum.
+     *
+     * @param value Value to clamp
+     * @param absMin Absolute value of the minimum significant value to return
+     * @param absMax Absolute value of the maximum value to return
+     * @return The clamped value with the same sign as <code>value</code>
+     */
+    private float clampMag(float value, float absMin, float absMax) {
+        final float absValue = Math.abs(value);
+        if (absValue < absMin) return 0;
+        if (absValue > absMax) return value > 0 ? absMax : -absMax;
+        return value;
+    }
+
+    private float distanceInfluenceForSnapDuration(float f) {
+        f -= 0.5f; // center the values about 0.
+        f *= 0.3f * Math.PI / 2.0f;
+        return (float) Math.sin(f);
+    }
+
+    /**
+     * Settle the captured view based on standard free-moving fling behavior.
+     * The caller should invoke {@link #continueSettling(boolean)} on each subsequent frame
+     * to continue the motion until it returns false.
+     *
+     * @param minLeft Minimum X position for the view's left edge
+     * @param minTop Minimum Y position for the view's top edge
+     * @param maxLeft Maximum X position for the view's left edge
+     * @param maxTop Maximum Y position for the view's top edge
+     */
+    public void flingCapturedView(int minLeft, int minTop, int maxLeft, int maxTop) {
+        if (!mReleaseInProgress) {
+            throw new IllegalStateException("Cannot flingCapturedView outside of a call to " +
+                    "Callback#onViewReleased");
+        }
+
+        mScroller.fling(mCapturedView.getLeft(), mCapturedView.getTop(),
+                (int) VelocityTrackerCompat.getXVelocity(mVelocityTracker, mActivePointerId),
+                (int) VelocityTrackerCompat.getYVelocity(mVelocityTracker, mActivePointerId),
+                minLeft, maxLeft, minTop, maxTop);
+
+        setDragState(STATE_SETTLING);
+    }
+
+    /**
+     * Move the captured settling view by the appropriate amount for the current time.
+     * If <code>continueSettling</code> returns true, the caller should call it again
+     * on the next frame to continue.
+     *
+     * @param deferCallbacks true if state callbacks should be deferred via posted message.
+     *                       Set this to true if you are calling this method from
+     *                       {@link android.view.View#computeScroll()} or similar methods
+     *                       invoked as part of layout or drawing.
+     * @return true if settle is still in progress
+     */
+    public boolean continueSettling(boolean deferCallbacks) {
+        if (mDragState == STATE_SETTLING) {
+            boolean keepGoing = mScroller.computeScrollOffset();
+            final int x = mScroller.getCurrX();
+            final int y = mScroller.getCurrY();
+            final int dx = x - mCapturedView.getLeft();
+            final int dy = y - mCapturedView.getTop();
+
+            if (dx != 0) {
+                ViewCompat.offsetLeftAndRight(mCapturedView, dx);
+            }
+            if (dy != 0) {
+                ViewCompat.offsetTopAndBottom(mCapturedView, dy);
+            }
+
+            if (dx != 0 || dy != 0) {
+                mCallback.onViewPositionChanged(mCapturedView, x, y, dx, dy);
+            }
+
+            if (keepGoing && x == mScroller.getFinalX() && y == mScroller.getFinalY()) {
+                // Close enough. The interpolator/scroller might think we're still moving
+                // but the user sure doesn't.
+                mScroller.abortAnimation();
+                keepGoing = false;
+            }
+
+            if (!keepGoing) {
+                if (deferCallbacks) {
+                    mParentView.post(mSetIdleRunnable);
+                } else {
+                    setDragState(STATE_IDLE);
+                }
+            }
+        }
+
+        return mDragState == STATE_SETTLING;
+    }
+
+    /**
+     * Like all callback events this must happen on the UI thread, but release
+     * involves some extra semantics. During a release (mReleaseInProgress)
+     * is the only time it is valid to call {@link #settleCapturedViewAt(int, int)}
+     * or {@link #flingCapturedView(int, int, int, int)}.
+     */
+    private void dispatchViewReleased(float xvel, float yvel) {
+        mReleaseInProgress = true;
+        mCallback.onViewReleased(mCapturedView, xvel, yvel);
+        mReleaseInProgress = false;
+
+        if (mDragState == STATE_DRAGGING) {
+            // onViewReleased didn't call a method that would have changed this. Go idle.
+            setDragState(STATE_IDLE);
+        }
+    }
+
+    private void clearMotionHistory() {
+        if (mInitialMotionX == null) {
+            return;
+        }
+        Arrays.fill(mInitialMotionX, 0);
+        Arrays.fill(mInitialMotionY, 0);
+        Arrays.fill(mLastMotionX, 0);
+        Arrays.fill(mLastMotionY, 0);
+        Arrays.fill(mInitialEdgesTouched, 0);
+        Arrays.fill(mEdgeDragsInProgress, 0);
+        Arrays.fill(mEdgeDragsLocked, 0);
+        mPointersDown = 0;
+    }
+
+    private void clearMotionHistory(int pointerId) {
+        if (mInitialMotionX == null) {
+            return;
+        }
+        mInitialMotionX[pointerId] = 0;
+        mInitialMotionY[pointerId] = 0;
+        mLastMotionX[pointerId] = 0;
+        mLastMotionY[pointerId] = 0;
+        mInitialEdgesTouched[pointerId] = 0;
+        mEdgeDragsInProgress[pointerId] = 0;
+        mEdgeDragsLocked[pointerId] = 0;
+        mPointersDown &= ~(1 << pointerId);
+    }
+
+    private void ensureMotionHistorySizeForId(int pointerId) {
+        if (mInitialMotionX == null || mInitialMotionX.length <= pointerId) {
+            float[] imx = new float[pointerId + 1];
+            float[] imy = new float[pointerId + 1];
+            float[] lmx = new float[pointerId + 1];
+            float[] lmy = new float[pointerId + 1];
+            int[] iit = new int[pointerId + 1];
+            int[] edip = new int[pointerId + 1];
+            int[] edl = new int[pointerId + 1];
+
+            if (mInitialMotionX != null) {
+                System.arraycopy(mInitialMotionX, 0, imx, 0, mInitialMotionX.length);
+                System.arraycopy(mInitialMotionY, 0, imy, 0, mInitialMotionY.length);
+                System.arraycopy(mLastMotionX, 0, lmx, 0, mLastMotionX.length);
+                System.arraycopy(mLastMotionY, 0, lmy, 0, mLastMotionY.length);
+                System.arraycopy(mInitialEdgesTouched, 0, iit, 0, mInitialEdgesTouched.length);
+                System.arraycopy(mEdgeDragsInProgress, 0, edip, 0, mEdgeDragsInProgress.length);
+                System.arraycopy(mEdgeDragsLocked, 0, edl, 0, mEdgeDragsLocked.length);
+            }
+
+            mInitialMotionX = imx;
+            mInitialMotionY = imy;
+            mLastMotionX = lmx;
+            mLastMotionY = lmy;
+            mInitialEdgesTouched = iit;
+            mEdgeDragsInProgress = edip;
+            mEdgeDragsLocked = edl;
+        }
+    }
+
+    private void saveInitialMotion(float x, float y, int pointerId) {
+        ensureMotionHistorySizeForId(pointerId);
+        mInitialMotionX[pointerId] = mLastMotionX[pointerId] = x;
+        mInitialMotionY[pointerId] = mLastMotionY[pointerId] = y;
+        mInitialEdgesTouched[pointerId] = getEdgesTouched((int) x, (int) y);
+        mPointersDown |= 1 << pointerId;
+    }
+
+    private void saveLastMotion(MotionEvent ev) {
+        final int pointerCount = ev.getPointerCount();
+        for (int i = 0; i < pointerCount; i++) {
+            final int pointerId = ev.getPointerId(i);
+            final float x = ev.getX(i);
+            final float y = ev.getY(i);
+            mLastMotionX[pointerId] = x;
+            mLastMotionY[pointerId] = y;
+        }
+    }
+
+    /**
+     * Check if the given pointer ID represents a pointer that is currently down (to the best
+     * of the ViewDragHelper's knowledge).
+     *
+     * <p>The state used to report this information is populated by the methods
+     * {@link #shouldInterceptTouchEvent(android.view.MotionEvent)} or
+     * {@link #processTouchEvent(android.view.MotionEvent)}. If one of these methods has not
+     * been called for all relevant MotionEvents to track, the information reported
+     * by this method may be stale or incorrect.</p>
+     *
+     * @param pointerId pointer ID to check; corresponds to IDs provided by MotionEvent
+     * @return true if the pointer with the given ID is still down
+     */
+    public boolean isPointerDown(int pointerId) {
+        return (mPointersDown & 1 << pointerId) != 0;
+    }
+
+    void setDragState(int state) {
+        mParentView.removeCallbacks(mSetIdleRunnable);
+        if (mDragState != state) {
+            mDragState = state;
+            mCallback.onViewDragStateChanged(state);
+            if (mDragState == STATE_IDLE) {
+                mCapturedView = null;
+            }
+        }
+    }
+
+    /**
+     * Attempt to capture the view with the given pointer ID. The callback will be involved.
+     * This will put us into the "dragging" state. If we've already captured this view with
+     * this pointer this method will immediately return true without consulting the callback.
+     *
+     * @param toCapture View to capture
+     * @param pointerId Pointer to capture with
+     * @return true if capture was successful
+     */
+    boolean tryCaptureViewForDrag(View toCapture, int pointerId) {
+        if (toCapture == mCapturedView && mActivePointerId == pointerId) {
+            // Already done!
+            return true;
+        }
+        if (toCapture != null && mCallback.tryCaptureView(toCapture, pointerId)) {
+            mActivePointerId = pointerId;
+            captureChildView(toCapture, pointerId);
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * Tests scrollability within child views of v given a delta of dx.
+     *
+     * @param v View to test for horizontal scrollability
+     * @param checkV Whether the view v passed should itself be checked for scrollability (true),
+     *               or just its children (false).
+     * @param dx Delta scrolled in pixels along the X axis
+     * @param dy Delta scrolled in pixels along the Y axis
+     * @param x X coordinate of the active touch point
+     * @param y Y coordinate of the active touch point
+     * @return true if child views of v can be scrolled by delta of dx.
+     */
+    protected boolean canScroll(View v, boolean checkV, int dx, int dy, int x, int y) {
+        if (v instanceof ViewGroup) {
+            final ViewGroup group = (ViewGroup) v;
+            final int scrollX = v.getScrollX();
+            final int scrollY = v.getScrollY();
+            final int count = group.getChildCount();
+            // Count backwards - let topmost views consume scroll distance first.
+            for (int i = count - 1; i >= 0; i--) {
+                // TODO: Add versioned support here for transformed views.
+                // This will not work for transformed views in Honeycomb+
+                final View child = group.getChildAt(i);
+                if (x + scrollX >= child.getLeft() && x + scrollX < child.getRight() &&
+                        y + scrollY >= child.getTop() && y + scrollY < child.getBottom() &&
+                        canScroll(child, true, dx, dy, x + scrollX - child.getLeft(),
+                                y + scrollY - child.getTop())) {
+                    return true;
+                }
+            }
+        }
+
+        return checkV && (ViewCompat.canScrollHorizontally(v, -dx) ||
+                ViewCompat.canScrollVertically(v, -dy));
+    }
+
+    /**
+     * Check if this event as provided to the parent view's onInterceptTouchEvent should
+     * cause the parent to intercept the touch event stream.
+     *
+     * @param ev MotionEvent provided to onInterceptTouchEvent
+     * @return true if the parent view should return true from onInterceptTouchEvent
+     */
+    public boolean shouldInterceptTouchEvent(MotionEvent ev) {
+        final int action = MotionEventCompat.getActionMasked(ev);
+        final int actionIndex = MotionEventCompat.getActionIndex(ev);
+
+        if (action == MotionEvent.ACTION_DOWN) {
+            // Reset things for a new event stream, just in case we didn't get
+            // the whole previous stream.
+            cancel();
+        }
+
+        if (mVelocityTracker == null) {
+            mVelocityTracker = VelocityTracker.obtain();
+        }
+        mVelocityTracker.addMovement(ev);
+
+        switch (action) {
+            case MotionEvent.ACTION_DOWN: {
+                final float x = ev.getX();
+                final float y = ev.getY();
+                final int pointerId = ev.getPointerId(0);
+                saveInitialMotion(x, y, pointerId);
+
+                final View toCapture = findTopChildUnder((int) x, (int) y);
+
+                // Catch a settling view if possible.
+                if (toCapture == mCapturedView && mDragState == STATE_SETTLING) {
+                    tryCaptureViewForDrag(toCapture, pointerId);
+                }
+
+                final int edgesTouched = mInitialEdgesTouched[pointerId];
+                if ((edgesTouched & mTrackingEdges) != 0) {
+                    mCallback.onEdgeTouched(edgesTouched & mTrackingEdges, pointerId);
+                }
+                break;
+            }
+
+            case MotionEventCompat.ACTION_POINTER_DOWN: {
+                final int pointerId = ev.getPointerId(actionIndex);
+                final float x = ev.getX(actionIndex);
+                final float y = ev.getY(actionIndex);
+
+                saveInitialMotion(x, y, pointerId);
+
+                // A ViewDragHelper can only manipulate one view at a time.
+                if (mDragState == STATE_IDLE) {
+                    final int edgesTouched = mInitialEdgesTouched[pointerId];
+                    if ((edgesTouched & mTrackingEdges) != 0) {
+                        mCallback.onEdgeTouched(edgesTouched & mTrackingEdges, pointerId);
+                    }
+                } else if (mDragState == STATE_SETTLING) {
+                    // Catch a settling view if possible.
+                    final View toCapture = findTopChildUnder((int) x, (int) y);
+                    if (toCapture == mCapturedView) {
+                        tryCaptureViewForDrag(toCapture, pointerId);
+                    }
+                }
+                break;
+            }
+
+            case MotionEvent.ACTION_MOVE: {
+                if (mInitialMotionX == null || mInitialMotionY == null) break;
+
+                // First to cross a touch slop over a draggable view wins. Also report edge drags.
+                final int pointerCount = ev.getPointerCount();
+                for (int i = 0; i < pointerCount; i++) {
+                    final int pointerId = ev.getPointerId(i);
+
+                    // If pointer is invalid then skip the ACTION_MOVE.
+                    if (!isValidPointerForActionMove(pointerId)) continue;
+
+                    final float x = ev.getX(i);
+                    final float y = ev.getY(i);
+                    final float dx = x - mInitialMotionX[pointerId];
+                    final float dy = y - mInitialMotionY[pointerId];
+
+                    final View toCapture = findTopChildUnder((int) x, (int) y);
+                    final boolean pastSlop = toCapture != null && checkTouchSlop(toCapture, dx, dy);
+                    if (pastSlop) {
+                        // check the callback's
+                        // getView[Horizontal|Vertical]DragRange methods to know
+                        // if you can move at all along an axis, then see if it
+                        // would clamp to the same value. If you can't move at
+                        // all in every dimension with a nonzero range, bail.
+                        final int oldLeft = toCapture.getLeft();
+                        final int targetLeft = oldLeft + (int) dx;
+                        final int newLeft = mCallback.clampViewPositionHorizontal(toCapture,
+                                targetLeft, (int) dx);
+                        final int oldTop = toCapture.getTop();
+                        final int targetTop = oldTop + (int) dy;
+                        final int newTop = mCallback.clampViewPositionVertical(toCapture, targetTop,
+                                (int) dy);
+                        final int horizontalDragRange = mCallback.getViewHorizontalDragRange(
+                                toCapture);
+                        final int verticalDragRange = mCallback.getViewVerticalDragRange(toCapture);
+                        if ((horizontalDragRange == 0 || horizontalDragRange > 0
+                                && newLeft == oldLeft) && (verticalDragRange == 0
+                                || verticalDragRange > 0 && newTop == oldTop)) {
+                            break;
+                        }
+                    }
+                    reportNewEdgeDrags(dx, dy, pointerId);
+                    if (mDragState == STATE_DRAGGING) {
+                        // Callback might have started an edge drag
+                        break;
+                    }
+
+                    if (pastSlop && tryCaptureViewForDrag(toCapture, pointerId)) {
+                        break;
+                    }
+                }
+                saveLastMotion(ev);
+                break;
+            }
+
+            case MotionEventCompat.ACTION_POINTER_UP: {
+                final int pointerId = ev.getPointerId(actionIndex);
+                clearMotionHistory(pointerId);
+                break;
+            }
+
+            case MotionEvent.ACTION_UP:
+            case MotionEvent.ACTION_CANCEL: {
+                cancel();
+                break;
+            }
+        }
+
+        return mDragState == STATE_DRAGGING;
+    }
+
+    /**
+     * Process a touch event received by the parent view. This method will dispatch callback events
+     * as needed before returning. The parent view's onTouchEvent implementation should call this.
+     *
+     * @param ev The touch event received by the parent view
+     */
+    public void processTouchEvent(MotionEvent ev) {
+        final int action = MotionEventCompat.getActionMasked(ev);
+        final int actionIndex = MotionEventCompat.getActionIndex(ev);
+
+        if (action == MotionEvent.ACTION_DOWN) {
+            // Reset things for a new event stream, just in case we didn't get
+            // the whole previous stream.
+            cancel();
+        }
+
+        if (mVelocityTracker == null) {
+            mVelocityTracker = VelocityTracker.obtain();
+        }
+        mVelocityTracker.addMovement(ev);
+
+        switch (action) {
+            case MotionEvent.ACTION_DOWN: {
+                final float x = ev.getX();
+                final float y = ev.getY();
+                final int pointerId = ev.getPointerId(0);
+                final View toCapture = findTopChildUnder((int) x, (int) y);
+
+                saveInitialMotion(x, y, pointerId);
+
+                // Since the parent is already directly processing this touch event,
+                // there is no reason to delay for a slop before dragging.
+                // Start immediately if possible.
+                tryCaptureViewForDrag(toCapture, pointerId);
+
+                final int edgesTouched = mInitialEdgesTouched[pointerId];
+                if ((edgesTouched & mTrackingEdges) != 0) {
+                    mCallback.onEdgeTouched(edgesTouched & mTrackingEdges, pointerId);
+                }
+                break;
+            }
+
+            case MotionEventCompat.ACTION_POINTER_DOWN: {
+                final int pointerId = ev.getPointerId(actionIndex);
+                final float x = ev.getX(actionIndex);
+                final float y = ev.getY(actionIndex);
+
+                saveInitialMotion(x, y, pointerId);
+
+                // A ViewDragHelper can only manipulate one view at a time.
+                if (mDragState == STATE_IDLE) {
+                    // If we're idle we can do anything! Treat it like a normal down event.
+
+                    final View toCapture = findTopChildUnder((int) x, (int) y);
+                    tryCaptureViewForDrag(toCapture, pointerId);
+
+                    final int edgesTouched = mInitialEdgesTouched[pointerId];
+                    if ((edgesTouched & mTrackingEdges) != 0) {
+                        mCallback.onEdgeTouched(edgesTouched & mTrackingEdges, pointerId);
+                    }
+                } else if (isCapturedViewUnder((int) x, (int) y)) {
+                    // We're still tracking a captured view. If the same view is under this
+                    // point, we'll swap to controlling it with this pointer instead.
+                    // (This will still work if we're "catching" a settling view.)
+
+                    tryCaptureViewForDrag(mCapturedView, pointerId);
+                }
+                break;
+            }
+
+            case MotionEvent.ACTION_MOVE: {
+                if (mDragState == STATE_DRAGGING) {
+                    // If pointer is invalid then skip the ACTION_MOVE.
+                    if (!isValidPointerForActionMove(mActivePointerId)) break;
+
+                    final int index = ev.findPointerIndex(mActivePointerId);
+                    final float x = ev.getX(index);
+                    final float y = ev.getY(index);
+                    final int idx = (int) (x - mLastMotionX[mActivePointerId]);
+                    final int idy = (int) (y - mLastMotionY[mActivePointerId]);
+
+                    dragTo(mCapturedView.getLeft() + idx, mCapturedView.getTop() + idy, idx, idy);
+
+                    saveLastMotion(ev);
+                } else {
+                    // Check to see if any pointer is now over a draggable view.
+                    final int pointerCount = ev.getPointerCount();
+                    for (int i = 0; i < pointerCount; i++) {
+                        final int pointerId = ev.getPointerId(i);
+
+                        // If pointer is invalid then skip the ACTION_MOVE.
+                        if (!isValidPointerForActionMove(pointerId)) continue;
+
+                        final float x = ev.getX(i);
+                        final float y = ev.getY(i);
+                        final float dx = x - mInitialMotionX[pointerId];
+                        final float dy = y - mInitialMotionY[pointerId];
+
+                        reportNewEdgeDrags(dx, dy, pointerId);
+                        if (mDragState == STATE_DRAGGING) {
+                            // Callback might have started an edge drag.
+                            break;
+                        }
+
+                        final View toCapture = findTopChildUnder((int) x, (int) y);
+                        if (checkTouchSlop(toCapture, dx, dy) &&
+                                tryCaptureViewForDrag(toCapture, pointerId)) {
+                            break;
+                        }
+                    }
+                    saveLastMotion(ev);
+                }
+                break;
+            }
+
+            case MotionEventCompat.ACTION_POINTER_UP: {
+                final int pointerId = ev.getPointerId(actionIndex);
+                if (mDragState == STATE_DRAGGING && pointerId == mActivePointerId) {
+                    // Try to find another pointer that's still holding on to the captured view.
+                    int newActivePointer = INVALID_POINTER;
+                    final int pointerCount = ev.getPointerCount();
+                    for (int i = 0; i < pointerCount; i++) {
+                        final int id = ev.getPointerId(i);
+                        if (id == mActivePointerId) {
+                            // This one's going away, skip.
+                            continue;
+                        }
+
+                        final float x = ev.getX(i);
+                        final float y = ev.getY(i);
+                        if (findTopChildUnder((int) x, (int) y) == mCapturedView &&
+                                tryCaptureViewForDrag(mCapturedView, id)) {
+                            newActivePointer = mActivePointerId;
+                            break;
+                        }
+                    }
+
+                    if (newActivePointer == INVALID_POINTER) {
+                        // We didn't find another pointer still touching the view, release it.
+                        releaseViewForPointerUp();
+                    }
+                }
+                clearMotionHistory(pointerId);
+                break;
+            }
+
+            case MotionEvent.ACTION_UP: {
+                if (mDragState == STATE_DRAGGING) {
+                    releaseViewForPointerUp();
+                }
+                cancel();
+                break;
+            }
+
+            case MotionEvent.ACTION_CANCEL: {
+                if (mDragState == STATE_DRAGGING) {
+                    dispatchViewReleased(0, 0);
+                }
+                cancel();
+                break;
+            }
+        }
+    }
+
+    private void reportNewEdgeDrags(float dx, float dy, int pointerId) {
+        int dragsStarted = 0;
+        if (checkNewEdgeDrag(dx, dy, pointerId, EDGE_LEFT)) {
+            dragsStarted |= EDGE_LEFT;
+        }
+        if (checkNewEdgeDrag(dy, dx, pointerId, EDGE_TOP)) {
+            dragsStarted |= EDGE_TOP;
+        }
+        if (checkNewEdgeDrag(dx, dy, pointerId, EDGE_RIGHT)) {
+            dragsStarted |= EDGE_RIGHT;
+        }
+        if (checkNewEdgeDrag(dy, dx, pointerId, EDGE_BOTTOM)) {
+            dragsStarted |= EDGE_BOTTOM;
+        }
+
+        if (dragsStarted != 0) {
+            mEdgeDragsInProgress[pointerId] |= dragsStarted;
+            mCallback.onEdgeDragStarted(dragsStarted, pointerId);
+        }
+    }
+
+    private boolean checkNewEdgeDrag(float delta, float odelta, int pointerId, int edge) {
+        final float absDelta = Math.abs(delta);
+        final float absODelta = Math.abs(odelta);
+
+        if ((mInitialEdgesTouched[pointerId] & edge) != edge  || (mTrackingEdges & edge) == 0 ||
+                (mEdgeDragsLocked[pointerId] & edge) == edge ||
+                (mEdgeDragsInProgress[pointerId] & edge) == edge ||
+                (absDelta <= mTouchSlop && absODelta <= mTouchSlop)) {
+            return false;
+        }
+        if (absDelta < absODelta * 0.5f && mCallback.onEdgeLock(edge)) {
+            mEdgeDragsLocked[pointerId] |= edge;
+            return false;
+        }
+        return (mEdgeDragsInProgress[pointerId] & edge) == 0 && absDelta > mTouchSlop;
+    }
+
+    /**
+     * Check if we've crossed a reasonable touch slop for the given child view.
+     * If the child cannot be dragged along the horizontal or vertical axis, motion
+     * along that axis will not count toward the slop check.
+     *
+     * @param child Child to check
+     * @param dx Motion since initial position along X axis
+     * @param dy Motion since initial position along Y axis
+     * @return true if the touch slop has been crossed
+     */
+    private boolean checkTouchSlop(View child, float dx, float dy) {
+        if (child == null) {
+            return false;
+        }
+        final boolean checkHorizontal = mCallback.getViewHorizontalDragRange(child) > 0;
+        final boolean checkVertical = mCallback.getViewVerticalDragRange(child) > 0;
+
+        if (checkHorizontal && checkVertical) {
+            return dx * dx + dy * dy > mTouchSlop * mTouchSlop;
+        } else if (checkHorizontal) {
+            return Math.abs(dx) > mTouchSlop;
+        } else if (checkVertical) {
+            return Math.abs(dy) > mTouchSlop;
+        }
+        return false;
+    }
+
+    /**
+     * Check if any pointer tracked in the current gesture has crossed
+     * the required slop threshold.
+     *
+     * <p>This depends on internal state populated by
+     * {@link #shouldInterceptTouchEvent(android.view.MotionEvent)} or
+     * {@link #processTouchEvent(android.view.MotionEvent)}. You should only rely on
+     * the results of this method after all currently available touch data
+     * has been provided to one of these two methods.</p>
+     *
+     * @param directions Combination of direction flags, see {@link #DIRECTION_HORIZONTAL},
+     *                   {@link #DIRECTION_VERTICAL}, {@link #DIRECTION_ALL}
+     * @return true if the slop threshold has been crossed, false otherwise
+     */
+    public boolean checkTouchSlop(int directions) {
+        final int count = mInitialMotionX.length;
+        for (int i = 0; i < count; i++) {
+            if (checkTouchSlop(directions, i)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Check if the specified pointer tracked in the current gesture has crossed
+     * the required slop threshold.
+     *
+     * <p>This depends on internal state populated by
+     * {@link #shouldInterceptTouchEvent(android.view.MotionEvent)} or
+     * {@link #processTouchEvent(android.view.MotionEvent)}. You should only rely on
+     * the results of this method after all currently available touch data
+     * has been provided to one of these two methods.</p>
+     *
+     * @param directions Combination of direction flags, see {@link #DIRECTION_HORIZONTAL},
+     *                   {@link #DIRECTION_VERTICAL}, {@link #DIRECTION_ALL}
+     * @param pointerId ID of the pointer to slop check as specified by MotionEvent
+     * @return true if the slop threshold has been crossed, false otherwise
+     */
+    public boolean checkTouchSlop(int directions, int pointerId) {
+        if (!isPointerDown(pointerId)) {
+            return false;
+        }
+
+        final boolean checkHorizontal = (directions & DIRECTION_HORIZONTAL) == DIRECTION_HORIZONTAL;
+        final boolean checkVertical = (directions & DIRECTION_VERTICAL) == DIRECTION_VERTICAL;
+
+        final float dx = mLastMotionX[pointerId] - mInitialMotionX[pointerId];
+        final float dy = mLastMotionY[pointerId] - mInitialMotionY[pointerId];
+
+        if (checkHorizontal && checkVertical) {
+            return dx * dx + dy * dy > mTouchSlop * mTouchSlop;
+        } else if (checkHorizontal) {
+            return Math.abs(dx) > mTouchSlop;
+        } else if (checkVertical) {
+            return Math.abs(dy) > mTouchSlop;
+        }
+        return false;
+    }
+
+    /**
+     * Check if any of the edges specified were initially touched in the currently active gesture.
+     * If there is no currently active gesture this method will return false.
+     *
+     * @param edges Edges to check for an initial edge touch. See {@link #EDGE_LEFT},
+     *              {@link #EDGE_TOP}, {@link #EDGE_RIGHT}, {@link #EDGE_BOTTOM} and
+     *              {@link #EDGE_ALL}
+     * @return true if any of the edges specified were initially touched in the current gesture
+     */
+    public boolean isEdgeTouched(int edges) {
+        final int count = mInitialEdgesTouched.length;
+        for (int i = 0; i < count; i++) {
+            if (isEdgeTouched(edges, i)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Check if any of the edges specified were initially touched by the pointer with
+     * the specified ID. If there is no currently active gesture or if there is no pointer with
+     * the given ID currently down this method will return false.
+     *
+     * @param edges Edges to check for an initial edge touch. See {@link #EDGE_LEFT},
+     *              {@link #EDGE_TOP}, {@link #EDGE_RIGHT}, {@link #EDGE_BOTTOM} and
+     *              {@link #EDGE_ALL}
+     * @return true if any of the edges specified were initially touched in the current gesture
+     */
+    public boolean isEdgeTouched(int edges, int pointerId) {
+        return isPointerDown(pointerId) && (mInitialEdgesTouched[pointerId] & edges) != 0;
+    }
+
+    private void releaseViewForPointerUp() {
+        mVelocityTracker.computeCurrentVelocity(1000, mMaxVelocity);
+        final float xvel = clampMag(
+                VelocityTrackerCompat.getXVelocity(mVelocityTracker, mActivePointerId),
+                mMinVelocity, mMaxVelocity);
+        final float yvel = clampMag(
+                VelocityTrackerCompat.getYVelocity(mVelocityTracker, mActivePointerId),
+                mMinVelocity, mMaxVelocity);
+        dispatchViewReleased(xvel, yvel);
+    }
+
+    private void dragTo(int left, int top, int dx, int dy) {
+        int clampedX = left;
+        int clampedY = top;
+        final int oldLeft = mCapturedView.getLeft();
+        final int oldTop = mCapturedView.getTop();
+        if (dx != 0) {
+            clampedX = mCallback.clampViewPositionHorizontal(mCapturedView, left, dx);
+            ViewCompat.offsetLeftAndRight(mCapturedView, clampedX - oldLeft);
+        }
+        if (dy != 0) {
+            clampedY = mCallback.clampViewPositionVertical(mCapturedView, top, dy);
+            ViewCompat.offsetTopAndBottom(mCapturedView, clampedY - oldTop);
+        }
+
+        if (dx != 0 || dy != 0) {
+            final int clampedDx = clampedX - oldLeft;
+            final int clampedDy = clampedY - oldTop;
+            mCallback.onViewPositionChanged(mCapturedView, clampedX, clampedY,
+                    clampedDx, clampedDy);
+        }
+    }
+
+    /**
+     * Determine if the currently captured view is under the given point in the
+     * parent view's coordinate system. If there is no captured view this method
+     * will return false.
+     *
+     * @param x X position to test in the parent's coordinate system
+     * @param y Y position to test in the parent's coordinate system
+     * @return true if the captured view is under the given point, false otherwise
+     */
+    public boolean isCapturedViewUnder(int x, int y) {
+        return isViewUnder(mCapturedView, x, y);
+    }
+
+    /**
+     * Determine if the supplied view is under the given point in the
+     * parent view's coordinate system.
+     *
+     * @param view Child view of the parent to hit test
+     * @param x X position to test in the parent's coordinate system
+     * @param y Y position to test in the parent's coordinate system
+     * @return true if the supplied view is under the given point, false otherwise
+     */
+    public boolean isViewUnder(View view, int x, int y) {
+        if (view == null) {
+            return false;
+        }
+        return x >= view.getLeft() &&
+                x < view.getRight() &&
+                y >= view.getTop() &&
+                y < view.getBottom();
+    }
+
+    /**
+     * Find the topmost child under the given point within the parent view's coordinate system.
+     * The child order is determined using {@link Callback#getOrderedChildIndex(int)}.
+     *
+     * @param x X position to test in the parent's coordinate system
+     * @param y Y position to test in the parent's coordinate system
+     * @return The topmost child view under (x, y) or null if none found.
+     */
+    public View findTopChildUnder(int x, int y) {
+        final int childCount = mParentView.getChildCount();
+        for (int i = childCount - 1; i >= 0; i--) {
+            final View child = mParentView.getChildAt(mCallback.getOrderedChildIndex(i));
+            if (x >= child.getLeft() && x < child.getRight() &&
+                    y >= child.getTop() && y < child.getBottom()) {
+                return child;
+            }
+        }
+        return null;
+    }
+
+    private int getEdgesTouched(int x, int y) {
+        int result = 0;
+
+        if (x < mParentView.getLeft() + mEdgeSize) result |= EDGE_LEFT;
+        if (y < mParentView.getTop() + mEdgeSize) result |= EDGE_TOP;
+        if (x > mParentView.getRight() - mEdgeSize) result |= EDGE_RIGHT;
+        if (y > mParentView.getBottom() - mEdgeSize) result |= EDGE_BOTTOM;
+
+        return result;
+    }
+
+    private boolean isValidPointerForActionMove(int pointerId) {
+        if (!isPointerDown(pointerId)) {
+            Log.e(TAG, "Ignoring pointerId=" + pointerId + " because ACTION_DOWN was not received "
+                    + "for this pointer before ACTION_MOVE. It likely happened because "
+                    + " ViewDragHelper did not receive all the events in the event stream.");
+            return false;
+        }
+        return true;
+    }
+}
\ No newline at end of file
diff --git a/v4/java/android/support/v4/widget/package.html b/core-ui/java/android/support/v4/widget/package.html
similarity index 100%
copy from v4/java/android/support/v4/widget/package.html
copy to core-ui/java/android/support/v4/widget/package.html
diff --git a/v4/jellybean-mr2/android/support/v4/app/ActionBarDrawerToggleJellybeanMR2.java b/core-ui/jellybean-mr2/android/support/v4/app/ActionBarDrawerToggleJellybeanMR2.java
similarity index 100%
rename from v4/jellybean-mr2/android/support/v4/app/ActionBarDrawerToggleJellybeanMR2.java
rename to core-ui/jellybean-mr2/android/support/v4/app/ActionBarDrawerToggleJellybeanMR2.java
diff --git a/v4/proguard-rules.pro b/core-ui/proguard-rules.pro
similarity index 100%
rename from v4/proguard-rules.pro
rename to core-ui/proguard-rules.pro
diff --git a/core-ui/tests/AndroidManifest.xml b/core-ui/tests/AndroidManifest.xml
new file mode 100644
index 0000000..7c39d4d
--- /dev/null
+++ b/core-ui/tests/AndroidManifest.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2015 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+          xmlns:tools="http://schemas.android.com/tools"
+          package="android.support.coreui.test">
+    <uses-sdk
+            android:minSdkVersion="9"
+            android:targetSdkVersion="23"
+            tools:overrideLibrary="android.support.test, android.app, android.support.test.rule,
+                      android.support.test.espresso, android.support.test.espresso.idling"/>
+
+    <uses-permission android:name="android.permission.VIBRATE"/>
+    <uses-permission android:name="android.permission.WAKE_LOCK"/>
+    <uses-permission android:name="android.permission.READ_CONTACTS"/>
+    <uses-permission android:name="android.permission.WRITE_CONTACTS"/>
+
+    <application
+            android:supportsRtl="true"
+            android:theme="@style/TestActivityTheme">
+        <uses-library android:name="android.test.runner" />
+        <activity android:name="android.support.v4.widget.ExploreByTouchHelperTestActivity"/>
+
+        <activity android:name="android.support.v4.widget.SwipeRefreshLayoutActivity"/>
+
+        <activity android:name="android.support.v4.view.ViewPagerWithTitleStripActivity"/>
+
+        <activity android:name="android.support.v4.view.ViewPagerWithTabStripActivity"/>
+    </application>
+
+    <instrumentation android:name="android.test.InstrumentationTestRunner"
+                     android:targetPackage="android.support.coreui.test"
+                     />
+</manifest>
diff --git a/v17/tests/NO_DOCS b/core-ui/tests/NO_DOCS
similarity index 100%
copy from v17/tests/NO_DOCS
copy to core-ui/tests/NO_DOCS
diff --git a/v4/tests/java/android/support/v4/BaseInstrumentationTestCase.java b/core-ui/tests/java/android/support/v4/BaseInstrumentationTestCase.java
similarity index 100%
copy from v4/tests/java/android/support/v4/BaseInstrumentationTestCase.java
copy to core-ui/tests/java/android/support/v4/BaseInstrumentationTestCase.java
diff --git a/v4/tests/java/android/support/v4/BaseTestActivity.java b/core-ui/tests/java/android/support/v4/BaseTestActivity.java
similarity index 100%
copy from v4/tests/java/android/support/v4/BaseTestActivity.java
copy to core-ui/tests/java/android/support/v4/BaseTestActivity.java
diff --git a/core-ui/tests/java/android/support/v4/testutils/TestUtils.java b/core-ui/tests/java/android/support/v4/testutils/TestUtils.java
new file mode 100644
index 0000000..25f910e
--- /dev/null
+++ b/core-ui/tests/java/android/support/v4/testutils/TestUtils.java
@@ -0,0 +1,107 @@
+/*
+ * Copyright (C) 2015 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 android.support.v4.testutils;
+
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
+import android.support.annotation.ColorInt;
+import android.support.annotation.NonNull;
+import junit.framework.Assert;
+
+public class TestUtils {
+    /**
+     * Checks whether all the pixels in the specified drawable are of the same specified color.
+     * If the passed <code>Drawable</code> does not have positive intrinsic dimensions set, this
+     * method will throw an <code>IllegalArgumentException</code>. If there is a color mismatch,
+     * this method will call <code>Assert.fail</code> with detailed description of the mismatch.
+     */
+    public static void assertAllPixelsOfColor(String failMessagePrefix, @NonNull Drawable drawable,
+            @ColorInt int color) {
+        int drawableWidth = drawable.getIntrinsicWidth();
+        int drawableHeight = drawable.getIntrinsicHeight();
+
+        if ((drawableWidth <= 0) || (drawableHeight <= 0)) {
+            throw new IllegalArgumentException("Drawable must be configured to have non-zero size");
+        }
+
+        assertAllPixelsOfColor(failMessagePrefix, drawable, drawableWidth, drawableHeight, color,
+                false);
+    }
+
+    /**
+     * Checks whether all the pixels in the specified drawable are of the same specified color.
+     *
+     * In case there is a color mismatch, the behavior of this method depends on the
+     * <code>throwExceptionIfFails</code> parameter. If it is <code>true</code>, this method will
+     * throw an <code>Exception</code> describing the mismatch. Otherwise this method will call
+     * <code>Assert.fail</code> with detailed description of the mismatch.
+     */
+    public static void assertAllPixelsOfColor(String failMessagePrefix, @NonNull Drawable drawable,
+            int drawableWidth, int drawableHeight, @ColorInt int color,
+            boolean throwExceptionIfFails) {
+        // Create a bitmap
+        Bitmap bitmap = Bitmap.createBitmap(drawableWidth, drawableHeight, Bitmap.Config.ARGB_8888);
+        // Create a canvas that wraps the bitmap
+        Canvas canvas = new Canvas(bitmap);
+        // Configure the drawable to have bounds that match its intrinsic size
+        drawable.setBounds(0, 0, drawableWidth, drawableHeight);
+        // And ask the drawable to draw itself to the canvas / bitmap
+        drawable.draw(canvas);
+
+        try {
+            int[] rowPixels = new int[drawableWidth];
+            for (int row = 0; row < drawableHeight; row++) {
+                bitmap.getPixels(rowPixels, 0, drawableWidth, 0, row, drawableWidth, 1);
+                for (int column = 0; column < drawableWidth; column++) {
+                    if (rowPixels[column] != color) {
+                        String mismatchDescription = failMessagePrefix
+                                + ": expected all drawable colors to be ["
+                                + Color.red(color) + "," + Color.green(color) + ","
+                                + Color.blue(color)
+                                + "] but at position (" + row + "," + column + ") found ["
+                                + Color.red(rowPixels[column]) + ","
+                                + Color.green(rowPixels[column]) + ","
+                                + Color.blue(rowPixels[column]) + "]";
+                        if (throwExceptionIfFails) {
+                            throw new RuntimeException(mismatchDescription);
+                        } else {
+                            Assert.fail(mismatchDescription);
+                        }
+                    }
+                }
+            }
+        } finally {
+            bitmap.recycle();
+        }
+    }
+
+    /**
+     * Checks whether the specified rectangle matches the specified left / top / right /
+     * bottom bounds.
+     */
+    public static void assertRectangleBounds(String failMessagePrefix, @NonNull Rect rectangle,
+            int left, int top, int right, int bottom) {
+        Assert.assertEquals(failMessagePrefix + " left", rectangle.left, left);
+        Assert.assertEquals(failMessagePrefix + " top", rectangle.top, top);
+        Assert.assertEquals(failMessagePrefix + " right", rectangle.right, right);
+        Assert.assertEquals(failMessagePrefix + " bottom", rectangle.bottom, bottom);
+    }
+}
\ No newline at end of file
diff --git a/v4/tests/java/android/support/v4/testutils/TestUtilsAssertions.java b/core-ui/tests/java/android/support/v4/testutils/TestUtilsAssertions.java
similarity index 100%
rename from v4/tests/java/android/support/v4/testutils/TestUtilsAssertions.java
rename to core-ui/tests/java/android/support/v4/testutils/TestUtilsAssertions.java
diff --git a/v4/tests/java/android/support/v4/testutils/TestUtilsMatchers.java b/core-ui/tests/java/android/support/v4/testutils/TestUtilsMatchers.java
similarity index 100%
rename from v4/tests/java/android/support/v4/testutils/TestUtilsMatchers.java
rename to core-ui/tests/java/android/support/v4/testutils/TestUtilsMatchers.java
diff --git a/core-ui/tests/java/android/support/v4/view/BaseViewPagerTest.java b/core-ui/tests/java/android/support/v4/view/BaseViewPagerTest.java
new file mode 100644
index 0000000..66a7208
--- /dev/null
+++ b/core-ui/tests/java/android/support/v4/view/BaseViewPagerTest.java
@@ -0,0 +1,979 @@
+/*
+ * Copyright (C) 2015 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 android.support.v4.view;
+
+import android.app.Activity;
+import android.graphics.Color;
+import android.support.coreui.test.R;
+import android.support.test.espresso.ViewAction;
+import android.support.v4.BaseInstrumentationTestCase;
+import android.support.v4.testutils.TestUtilsMatchers;
+import android.test.suitebuilder.annotation.MediumTest;
+import android.test.suitebuilder.annotation.SmallTest;
+import android.text.TextUtils;
+import android.util.Pair;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.ArgumentCaptor;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static android.support.test.espresso.Espresso.onView;
+import static android.support.test.espresso.action.ViewActions.swipeLeft;
+import static android.support.test.espresso.action.ViewActions.swipeRight;
+import static android.support.test.espresso.assertion.PositionAssertions.*;
+import static android.support.test.espresso.assertion.ViewAssertions.doesNotExist;
+import static android.support.test.espresso.assertion.ViewAssertions.matches;
+import static android.support.test.espresso.matcher.ViewMatchers.*;
+import static android.support.v4.testutils.TestUtilsAssertions.hasDisplayedChildren;
+import static android.support.v4.testutils.TestUtilsMatchers.*;
+import static android.support.v4.view.ViewPagerActions.*;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.allOf;
+import static org.hamcrest.core.IsNot.not;
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.*;
+
+/**
+ * Base class for testing <code>ViewPager</code>. Most of the testing logic should be in this
+ * class as it is independent on the specific pager title implementation (interactive or non
+ * interactive).
+ *
+ * Testing logic that does depend on the specific pager title implementation is pushed into the
+ * extending classes in <code>assertStripInteraction()</code> method.
+ */
+public abstract class BaseViewPagerTest<T extends Activity> extends BaseInstrumentationTestCase<T> {
+    protected ViewPager mViewPager;
+
+    protected static class BasePagerAdapter<Q> extends PagerAdapter {
+        protected ArrayList<Pair<String, Q>> mEntries = new ArrayList<>();
+
+        public void add(String title, Q content) {
+            mEntries.add(new Pair(title, content));
+        }
+
+        @Override
+        public int getCount() {
+            return mEntries.size();
+        }
+
+        protected void configureInstantiatedItem(View view, int position) {
+            switch (position) {
+                case 0:
+                    view.setId(R.id.page_0);
+                    break;
+                case 1:
+                    view.setId(R.id.page_1);
+                    break;
+                case 2:
+                    view.setId(R.id.page_2);
+                    break;
+                case 3:
+                    view.setId(R.id.page_3);
+                    break;
+                case 4:
+                    view.setId(R.id.page_4);
+                    break;
+                case 5:
+                    view.setId(R.id.page_5);
+                    break;
+                case 6:
+                    view.setId(R.id.page_6);
+                    break;
+                case 7:
+                    view.setId(R.id.page_7);
+                    break;
+                case 8:
+                    view.setId(R.id.page_8);
+                    break;
+                case 9:
+                    view.setId(R.id.page_9);
+                    break;
+            }
+        }
+
+        @Override
+        public void destroyItem(ViewGroup container, int position, Object object) {
+            // The adapter is also responsible for removing the view.
+            container.removeView(((ViewHolder) object).view);
+        }
+
+        @Override
+        public int getItemPosition(Object object) {
+            return ((ViewHolder) object).position;
+        }
+
+        @Override
+        public boolean isViewFromObject(View view, Object object) {
+            return ((ViewHolder) object).view == view;
+        }
+
+        @Override
+        public CharSequence getPageTitle(int position) {
+            return mEntries.get(position).first;
+        }
+
+        protected static class ViewHolder {
+            final View view;
+            final int position;
+
+            public ViewHolder(View view, int position) {
+                this.view = view;
+                this.position = position;
+            }
+        }
+    }
+
+    protected static class ColorPagerAdapter extends BasePagerAdapter<Integer> {
+        @Override
+        public Object instantiateItem(ViewGroup container, int position) {
+            final View view = new View(container.getContext());
+            view.setBackgroundColor(mEntries.get(position).second);
+            configureInstantiatedItem(view, position);
+
+            // Unlike ListView adapters, the ViewPager adapter is responsible
+            // for adding the view to the container.
+            container.addView(view);
+
+            return new ViewHolder(view, position);
+        }
+    }
+
+    protected static class TextPagerAdapter extends BasePagerAdapter<String> {
+        @Override
+        public Object instantiateItem(ViewGroup container, int position) {
+            final TextView view = new TextView(container.getContext());
+            view.setText(mEntries.get(position).second);
+            configureInstantiatedItem(view, position);
+
+            // Unlike ListView adapters, the ViewPager adapter is responsible
+            // for adding the view to the container.
+            container.addView(view);
+
+            return new ViewHolder(view, position);
+        }
+    }
+
+    public BaseViewPagerTest(Class<T> activityClass) {
+        super(activityClass);
+    }
+
+    @Before
+    public void setUp() throws Exception {
+        final T activity = mActivityTestRule.getActivity();
+        mViewPager = (ViewPager) activity.findViewById(R.id.pager);
+
+        ColorPagerAdapter adapter = new ColorPagerAdapter();
+        adapter.add("Red", Color.RED);
+        adapter.add("Green", Color.GREEN);
+        adapter.add("Blue", Color.BLUE);
+        onView(withId(R.id.pager)).perform(setAdapter(adapter), scrollToPage(0, false));
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        onView(withId(R.id.pager)).perform(setAdapter(null));
+    }
+
+    private void verifyPageSelections(boolean smoothScroll) {
+        assertEquals("Initial state", 0, mViewPager.getCurrentItem());
+
+        ViewPager.OnPageChangeListener mockPageChangeListener =
+                mock(ViewPager.OnPageChangeListener.class);
+        mViewPager.addOnPageChangeListener(mockPageChangeListener);
+
+        onView(withId(R.id.pager)).perform(scrollRight(smoothScroll));
+        assertEquals("Scroll right", 1, mViewPager.getCurrentItem());
+        verify(mockPageChangeListener, times(1)).onPageSelected(1);
+
+        onView(withId(R.id.pager)).perform(scrollRight(smoothScroll));
+        assertEquals("Scroll right", 2, mViewPager.getCurrentItem());
+        verify(mockPageChangeListener, times(1)).onPageSelected(2);
+
+        // Try "scrolling" beyond the last page and test that we're still on the last page.
+        onView(withId(R.id.pager)).perform(scrollRight(smoothScroll));
+        assertEquals("Scroll right beyond last page", 2, mViewPager.getCurrentItem());
+        // We're still on this page, so we shouldn't have been called again with index 2
+        verify(mockPageChangeListener, times(1)).onPageSelected(2);
+
+        onView(withId(R.id.pager)).perform(scrollLeft(smoothScroll));
+        assertEquals("Scroll left", 1, mViewPager.getCurrentItem());
+        // Verify that this is the second time we're called on index 1
+        verify(mockPageChangeListener, times(2)).onPageSelected(1);
+
+        onView(withId(R.id.pager)).perform(scrollLeft(smoothScroll));
+        assertEquals("Scroll left", 0, mViewPager.getCurrentItem());
+        // Verify that this is the first time we're called on index 0
+        verify(mockPageChangeListener, times(1)).onPageSelected(0);
+
+        // Try "scrolling" beyond the first page and test that we're still on the first page.
+        onView(withId(R.id.pager)).perform(scrollLeft(smoothScroll));
+        assertEquals("Scroll left beyond first page", 0, mViewPager.getCurrentItem());
+        // We're still on this page, so we shouldn't have been called again with index 0
+        verify(mockPageChangeListener, times(1)).onPageSelected(0);
+
+        // Unregister our listener
+        mViewPager.removeOnPageChangeListener(mockPageChangeListener);
+
+        // Go from index 0 to index 2
+        onView(withId(R.id.pager)).perform(scrollToPage(2, smoothScroll));
+        assertEquals("Scroll to last page", 2, mViewPager.getCurrentItem());
+        // Our listener is not registered anymore, so we shouldn't have been called with index 2
+        verify(mockPageChangeListener, times(1)).onPageSelected(2);
+
+        // And back to 0
+        onView(withId(R.id.pager)).perform(scrollToPage(0, smoothScroll));
+        assertEquals("Scroll to first page", 0, mViewPager.getCurrentItem());
+        // Our listener is not registered anymore, so we shouldn't have been called with index 0
+        verify(mockPageChangeListener, times(1)).onPageSelected(0);
+
+        // Verify the overall sequence of calls to onPageSelected of our listener
+        ArgumentCaptor<Integer> pageSelectedCaptor = ArgumentCaptor.forClass(int.class);
+        verify(mockPageChangeListener, times(4)).onPageSelected(pageSelectedCaptor.capture());
+        assertThat(pageSelectedCaptor.getAllValues(), TestUtilsMatchers.matches(1, 2, 1, 0));
+    }
+
+    @Test
+    @SmallTest
+    public void testPageSelectionsImmediate() {
+        verifyPageSelections(false);
+    }
+
+    @Test
+    @SmallTest
+    public void testPageSelectionsSmooth() {
+        verifyPageSelections(true);
+    }
+
+    @Test
+    @SmallTest
+    public void testPageSwipes() {
+        assertEquals("Initial state", 0, mViewPager.getCurrentItem());
+
+        ViewPager.OnPageChangeListener mockPageChangeListener =
+                mock(ViewPager.OnPageChangeListener.class);
+        mViewPager.addOnPageChangeListener(mockPageChangeListener);
+
+        onView(withId(R.id.pager)).perform(wrap(swipeLeft()));
+        assertEquals("Swipe left", 1, mViewPager.getCurrentItem());
+        verify(mockPageChangeListener, times(1)).onPageSelected(1);
+
+        onView(withId(R.id.pager)).perform(wrap(swipeLeft()));
+        assertEquals("Swipe left", 2, mViewPager.getCurrentItem());
+        verify(mockPageChangeListener, times(1)).onPageSelected(2);
+
+        // Try swiping beyond the last page and test that we're still on the last page.
+        onView(withId(R.id.pager)).perform(wrap(swipeLeft()));
+        assertEquals("Swipe left beyond last page", 2, mViewPager.getCurrentItem());
+        // We're still on this page, so we shouldn't have been called again with index 2
+        verify(mockPageChangeListener, times(1)).onPageSelected(2);
+
+        onView(withId(R.id.pager)).perform(wrap(swipeRight()));
+        assertEquals("Swipe right", 1, mViewPager.getCurrentItem());
+        // Verify that this is the second time we're called on index 1
+        verify(mockPageChangeListener, times(2)).onPageSelected(1);
+
+        onView(withId(R.id.pager)).perform(wrap(swipeRight()));
+        assertEquals("Swipe right", 0, mViewPager.getCurrentItem());
+        // Verify that this is the first time we're called on index 0
+        verify(mockPageChangeListener, times(1)).onPageSelected(0);
+
+        // Try swiping beyond the first page and test that we're still on the first page.
+        onView(withId(R.id.pager)).perform(wrap(swipeRight()));
+        assertEquals("Swipe right beyond first page", 0, mViewPager.getCurrentItem());
+        // We're still on this page, so we shouldn't have been called again with index 0
+        verify(mockPageChangeListener, times(1)).onPageSelected(0);
+
+        mViewPager.removeOnPageChangeListener(mockPageChangeListener);
+
+        // Verify the overall sequence of calls to onPageSelected of our listener
+        ArgumentCaptor<Integer> pageSelectedCaptor = ArgumentCaptor.forClass(int.class);
+        verify(mockPageChangeListener, times(4)).onPageSelected(pageSelectedCaptor.capture());
+        assertThat(pageSelectedCaptor.getAllValues(), TestUtilsMatchers.matches(1, 2, 1, 0));
+    }
+
+    @Test
+    @SmallTest
+    public void testPageSwipesComposite() {
+        assertEquals("Initial state", 0, mViewPager.getCurrentItem());
+
+        onView(withId(R.id.pager)).perform(wrap(swipeLeft()), wrap(swipeLeft()));
+        assertEquals("Swipe twice left", 2, mViewPager.getCurrentItem());
+
+        onView(withId(R.id.pager)).perform(wrap(swipeLeft()), wrap(swipeRight()));
+        assertEquals("Swipe left beyond last page and then right", 1, mViewPager.getCurrentItem());
+
+        onView(withId(R.id.pager)).perform(wrap(swipeRight()), wrap(swipeRight()));
+        assertEquals("Swipe right and then right beyond first page", 0,
+                mViewPager.getCurrentItem());
+
+        onView(withId(R.id.pager)).perform(wrap(swipeRight()), wrap(swipeLeft()));
+        assertEquals("Swipe right beyond first page and then left", 1, mViewPager.getCurrentItem());
+    }
+
+    private void verifyPageContent(boolean smoothScroll) {
+        assertEquals("Initial state", 0, mViewPager.getCurrentItem());
+
+        // Verify the displayed content to match the initial adapter - with 3 pages and each
+        // one rendered as a View.
+
+        // Page #0 should be displayed, page #1 should not be displayed and page #2 should not exist
+        // yet as it's outside of the offscreen window limit.
+        onView(withId(R.id.page_0)).check(matches(allOf(
+                isOfClass(View.class),
+                isDisplayed(),
+                backgroundColor(Color.RED))));
+        onView(withId(R.id.page_1)).check(matches(not(isDisplayed())));
+        onView(withId(R.id.page_2)).check(doesNotExist());
+
+        // Scroll one page to select page #1
+        onView(withId(R.id.pager)).perform(scrollRight(smoothScroll));
+        assertEquals("Scroll right", 1, mViewPager.getCurrentItem());
+        // Pages #0 / #2 should not be displayed, page #1 should be displayed.
+        onView(withId(R.id.page_0)).check(matches(not(isDisplayed())));
+        onView(withId(R.id.page_1)).check(matches(allOf(
+                isOfClass(View.class),
+                isDisplayed(),
+                backgroundColor(Color.GREEN))));
+        onView(withId(R.id.page_2)).check(matches(not(isDisplayed())));
+
+        // Scroll one more page to select page #2
+        onView(withId(R.id.pager)).perform(scrollRight(smoothScroll));
+        assertEquals("Scroll right again", 2, mViewPager.getCurrentItem());
+        // Page #0 should not exist as it's bumped to the outside of the offscreen window limit,
+        // page #1 should not be displayed, page #2 should be displayed.
+        onView(withId(R.id.page_0)).check(doesNotExist());
+        onView(withId(R.id.page_1)).check(matches(not(isDisplayed())));
+        onView(withId(R.id.page_2)).check(matches(allOf(
+                isOfClass(View.class),
+                isDisplayed(),
+                backgroundColor(Color.BLUE))));
+    }
+
+    @Test
+    @SmallTest
+    public void testPageContentImmediate() {
+        verifyPageContent(false);
+    }
+
+    @Test
+    @SmallTest
+    public void testPageContentSmooth() {
+        verifyPageContent(true);
+    }
+
+    private void verifyAdapterChange(boolean smoothScroll) {
+        // Verify that we have the expected initial adapter
+        PagerAdapter initialAdapter = mViewPager.getAdapter();
+        assertEquals("Initial adapter class", ColorPagerAdapter.class, initialAdapter.getClass());
+        assertEquals("Initial adapter page count", 3, initialAdapter.getCount());
+
+        // Create a new adapter
+        TextPagerAdapter newAdapter = new TextPagerAdapter();
+        newAdapter.add("Title 0", "Body 0");
+        newAdapter.add("Title 1", "Body 1");
+        newAdapter.add("Title 2", "Body 2");
+        newAdapter.add("Title 3", "Body 3");
+        onView(withId(R.id.pager)).perform(setAdapter(newAdapter), scrollToPage(0, smoothScroll));
+
+        // Verify the displayed content to match the newly set adapter - with 4 pages and each
+        // one rendered as a TextView.
+
+        // Page #0 should be displayed, page #1 should not be displayed and pages #2 / #3 should not
+        // exist yet as they're outside of the offscreen window limit.
+        onView(withId(R.id.page_0)).check(matches(allOf(
+                isOfClass(TextView.class),
+                isDisplayed(),
+                withText("Body 0"))));
+        onView(withId(R.id.page_1)).check(matches(not(isDisplayed())));
+        onView(withId(R.id.page_2)).check(doesNotExist());
+        onView(withId(R.id.page_3)).check(doesNotExist());
+
+        // Scroll one page to select page #1
+        onView(withId(R.id.pager)).perform(scrollRight(smoothScroll));
+        assertEquals("Scroll right", 1, mViewPager.getCurrentItem());
+        // Pages #0 / #2 should not be displayed, page #1 should be displayed, page #3 is still
+        // outside the offscreen limit.
+        onView(withId(R.id.page_0)).check(matches(not(isDisplayed())));
+        onView(withId(R.id.page_1)).check(matches(allOf(
+                isOfClass(TextView.class),
+                isDisplayed(),
+                withText("Body 1"))));
+        onView(withId(R.id.page_2)).check(matches(not(isDisplayed())));
+        onView(withId(R.id.page_3)).check(doesNotExist());
+
+        // Scroll one more page to select page #2
+        onView(withId(R.id.pager)).perform(scrollRight(smoothScroll));
+        assertEquals("Scroll right again", 2, mViewPager.getCurrentItem());
+        // Page #0 should not exist as it's bumped to the outside of the offscreen window limit,
+        // pages #1 / #3 should not be displayed, page #2 should be displayed.
+        onView(withId(R.id.page_0)).check(doesNotExist());
+        onView(withId(R.id.page_1)).check(matches(not(isDisplayed())));
+        onView(withId(R.id.page_2)).check(matches(allOf(
+                isOfClass(TextView.class),
+                isDisplayed(),
+                withText("Body 2"))));
+        onView(withId(R.id.page_3)).check(matches(not(isDisplayed())));
+
+        // Scroll one more page to select page #2
+        onView(withId(R.id.pager)).perform(scrollRight(smoothScroll));
+        assertEquals("Scroll right one more time", 3, mViewPager.getCurrentItem());
+        // Pages #0 / #1 should not exist as they're bumped to the outside of the offscreen window
+        // limit, page #2 should not be displayed, page #3 should be displayed.
+        onView(withId(R.id.page_0)).check(doesNotExist());
+        onView(withId(R.id.page_1)).check(doesNotExist());
+        onView(withId(R.id.page_2)).check(matches(not(isDisplayed())));
+        onView(withId(R.id.page_3)).check(matches(allOf(
+                isOfClass(TextView.class),
+                isDisplayed(),
+                withText("Body 3"))));
+    }
+
+    @Test
+    @SmallTest
+    public void testAdapterChangeImmediate() {
+        verifyAdapterChange(false);
+    }
+
+    @Test
+    @SmallTest
+    public void testAdapterChangeSmooth() {
+        verifyAdapterChange(true);
+    }
+
+    private void verifyTitleStripLayout(String expectedStartTitle, String expectedSelectedTitle,
+            String expectedEndTitle, int selectedPageId) {
+        // Check that the title strip spans the whole width of the pager and is aligned to
+        // its top
+        onView(withId(R.id.titles)).check(isLeftAlignedWith(withId(R.id.pager)));
+        onView(withId(R.id.titles)).check(isRightAlignedWith(withId(R.id.pager)));
+        onView(withId(R.id.titles)).check(isTopAlignedWith(withId(R.id.pager)));
+
+        // Check that the currently selected page spans the whole width of the pager and is below
+        // the title strip
+        onView(withId(selectedPageId)).check(isLeftAlignedWith(withId(R.id.pager)));
+        onView(withId(selectedPageId)).check(isRightAlignedWith(withId(R.id.pager)));
+        onView(withId(selectedPageId)).check(isBelow(withId(R.id.titles)));
+        onView(withId(selectedPageId)).check(isBottomAlignedWith(withId(R.id.pager)));
+
+        boolean hasStartTitle = !TextUtils.isEmpty(expectedStartTitle);
+        boolean hasEndTitle = !TextUtils.isEmpty(expectedEndTitle);
+
+        // Check that the title strip shows the expected number of children (tab titles)
+        int nonNullTitles = (hasStartTitle ? 1 : 0) + 1 + (hasEndTitle ? 1 : 0);
+        onView(withId(R.id.titles)).check(hasDisplayedChildren(nonNullTitles));
+
+        if (hasStartTitle) {
+            // Check that the title for the start page is displayed at the start edge of its parent
+            // (title strip)
+            onView(withId(R.id.titles)).check(matches(hasDescendant(
+                    allOf(withText(expectedStartTitle), isDisplayed(), startAlignedToParent()))));
+        }
+        // Check that the title for the selected page is displayed centered in its parent
+        // (title strip)
+        onView(withId(R.id.titles)).check(matches(hasDescendant(
+                allOf(withText(expectedSelectedTitle), isDisplayed(), centerAlignedInParent()))));
+        if (hasEndTitle) {
+            // Check that the title for the end page is displayed at the end edge of its parent
+            // (title strip)
+            onView(withId(R.id.titles)).check(matches(hasDescendant(
+                    allOf(withText(expectedEndTitle), isDisplayed(), endAlignedToParent()))));
+        }
+    }
+
+    private void verifyPagerStrip(boolean smoothScroll) {
+        // Set an adapter with 5 pages
+        final ColorPagerAdapter adapter = new ColorPagerAdapter();
+        adapter.add("Red", Color.RED);
+        adapter.add("Green", Color.GREEN);
+        adapter.add("Blue", Color.BLUE);
+        adapter.add("Yellow", Color.YELLOW);
+        adapter.add("Magenta", Color.MAGENTA);
+        onView(withId(R.id.pager)).perform(setAdapter(adapter),
+                scrollToPage(0, smoothScroll));
+
+        // Check that the pager has a title strip
+        onView(withId(R.id.pager)).check(matches(hasDescendant(withId(R.id.titles))));
+        // Check that the title strip is displayed and is of the expected class
+        onView(withId(R.id.titles)).check(matches(allOf(
+                isDisplayed(), isOfClass(getStripClass()))));
+
+        // The following block tests the overall layout of tab strip and main pager content
+        // (vertical stacking), the content of the tab strip (showing texts for the selected
+        // tab and the ones on its left / right) as well as the alignment of the content in the
+        // tab strip (selected in center, others on left and right).
+
+        // Check the content and alignment of title strip for selected page #0
+        verifyTitleStripLayout(null, "Red", "Green", R.id.page_0);
+
+        // Scroll one page to select page #1 and check layout / content of title strip
+        onView(withId(R.id.pager)).perform(scrollRight(smoothScroll));
+        verifyTitleStripLayout("Red", "Green", "Blue", R.id.page_1);
+
+        // Scroll one page to select page #2 and check layout / content of title strip
+        onView(withId(R.id.pager)).perform(scrollRight(smoothScroll));
+        verifyTitleStripLayout("Green", "Blue", "Yellow", R.id.page_2);
+
+        // Scroll one page to select page #3 and check layout / content of title strip
+        onView(withId(R.id.pager)).perform(scrollRight(smoothScroll));
+        verifyTitleStripLayout("Blue", "Yellow", "Magenta", R.id.page_3);
+
+        // Scroll one page to select page #4 and check layout / content of title strip
+        onView(withId(R.id.pager)).perform(scrollRight(smoothScroll));
+        verifyTitleStripLayout("Yellow", "Magenta", null, R.id.page_4);
+
+        // Scroll back to page #0
+        onView(withId(R.id.pager)).perform(scrollToPage(0, smoothScroll));
+
+        assertStripInteraction(smoothScroll);
+    }
+
+    @Test
+    @SmallTest
+    public void testPagerStripImmediate() {
+        verifyPagerStrip(false);
+    }
+
+    @Test
+    @SmallTest
+    public void testPagerStripSmooth() {
+        verifyPagerStrip(true);
+    }
+
+    /**
+     * Returns the class of the pager strip.
+     */
+    protected abstract Class getStripClass();
+
+    /**
+     * Checks assertions that are specific to the pager strip implementation (interactive or
+     * non interactive).
+     */
+    protected abstract void assertStripInteraction(boolean smoothScroll);
+
+    /**
+     * Helper method that performs the specified action on the <code>ViewPager</code> and then
+     * checks the sequence of calls to the page change listener based on the specified expected
+     * scroll state changes.
+     *
+     * If that expected list is empty, this method verifies that there were no calls to
+     * onPageScrollStateChanged when the action was performed. Otherwise it verifies that the actual
+     * sequence of calls to onPageScrollStateChanged matches the expected (specified) one.
+     */
+    private void verifyScrollStateChange(ViewAction viewAction, int... expectedScrollStateChanges) {
+        ViewPager.OnPageChangeListener mockPageChangeListener =
+                mock(ViewPager.OnPageChangeListener.class);
+        mViewPager.addOnPageChangeListener(mockPageChangeListener);
+
+        // Perform our action
+        onView(withId(R.id.pager)).perform(viewAction);
+
+        int expectedScrollStateChangeCount = (expectedScrollStateChanges != null) ?
+                expectedScrollStateChanges.length : 0;
+
+        if (expectedScrollStateChangeCount == 0) {
+            verify(mockPageChangeListener, never()).onPageScrollStateChanged(anyInt());
+        } else {
+            ArgumentCaptor<Integer> pageScrollStateCaptor = ArgumentCaptor.forClass(int.class);
+            verify(mockPageChangeListener, times(expectedScrollStateChangeCount)).
+                    onPageScrollStateChanged(pageScrollStateCaptor.capture());
+            assertThat(pageScrollStateCaptor.getAllValues(),
+                    TestUtilsMatchers.matches(expectedScrollStateChanges));
+        }
+
+        // Remove our mock listener to get back to clean state for the next test
+        mViewPager.removeOnPageChangeListener(mockPageChangeListener);
+    }
+
+    @Test
+    @SmallTest
+    public void testPageScrollStateChangedImmediate() {
+        // Note that all the actions tested in this method are immediate (no scrolling) and
+        // as such we test that we do not get any calls to onPageScrollStateChanged in any of them
+
+        // Select one page to the right
+        verifyScrollStateChange(scrollRight(false));
+        // Select one more page to the right
+        verifyScrollStateChange(scrollRight(false));
+        // Select one page to the left
+        verifyScrollStateChange(scrollLeft(false));
+        // Select one more page to the left
+        verifyScrollStateChange(scrollLeft(false));
+        // Select last page
+        verifyScrollStateChange(scrollToLast(false));
+        // Select first page
+        verifyScrollStateChange(scrollToFirst(false));
+    }
+
+    @Test
+    @MediumTest
+    public void testPageScrollStateChangedSmooth() {
+        // Note that all the actions tested in this method use smooth scrolling and as such we test
+        // that we get the matching calls to onPageScrollStateChanged
+        final int[] expectedScrollStateChanges = new int[] {
+                ViewPager.SCROLL_STATE_SETTLING, ViewPager.SCROLL_STATE_IDLE
+        };
+
+        // Select one page to the right
+        verifyScrollStateChange(scrollRight(true), expectedScrollStateChanges);
+        // Select one more page to the right
+        verifyScrollStateChange(scrollRight(true), expectedScrollStateChanges);
+        // Select one page to the left
+        verifyScrollStateChange(scrollLeft(true), expectedScrollStateChanges);
+        // Select one more page to the left
+        verifyScrollStateChange(scrollLeft(true), expectedScrollStateChanges);
+        // Select last page
+        verifyScrollStateChange(scrollToLast(true), expectedScrollStateChanges);
+        // Select first page
+        verifyScrollStateChange(scrollToFirst(true), expectedScrollStateChanges);
+    }
+
+    @Test
+    @MediumTest
+    public void testPageScrollStateChangedSwipe() {
+        // Note that all the actions tested in this method use swiping and as such we test
+        // that we get the matching calls to onPageScrollStateChanged
+        final int[] expectedScrollStateChanges = new int[] { ViewPager.SCROLL_STATE_DRAGGING,
+                ViewPager.SCROLL_STATE_SETTLING, ViewPager.SCROLL_STATE_IDLE };
+
+        // Swipe one page to the left
+        verifyScrollStateChange(wrap(swipeLeft()), expectedScrollStateChanges);
+        assertEquals("Swipe left", 1, mViewPager.getCurrentItem());
+
+        // Swipe one more page to the left
+        verifyScrollStateChange(wrap(swipeLeft()), expectedScrollStateChanges);
+        assertEquals("Swipe left", 2, mViewPager.getCurrentItem());
+
+        // Swipe one page to the right
+        verifyScrollStateChange(wrap(swipeRight()), expectedScrollStateChanges);
+        assertEquals("Swipe right", 1, mViewPager.getCurrentItem());
+
+        // Swipe one more page to the right
+        verifyScrollStateChange(wrap(swipeRight()), expectedScrollStateChanges);
+        assertEquals("Swipe right", 0, mViewPager.getCurrentItem());
+    }
+
+    /**
+     * Helper method to verify the internal consistency of values passed to
+     * {@link ViewPager.OnPageChangeListener#onPageScrolled} callback when we go from a page with
+     * lower index to a page with higher index.
+     *
+     * @param startPageIndex Index of the starting page.
+     * @param endPageIndex Index of the ending page.
+     * @param pageWidth Page width in pixels.
+     * @param positions List of "position" values passed to all
+     *      {@link ViewPager.OnPageChangeListener#onPageScrolled} calls.
+     * @param positionOffsets List of "positionOffset" values passed to all
+     *      {@link ViewPager.OnPageChangeListener#onPageScrolled} calls.
+     * @param positionOffsetPixels List of "positionOffsetPixel" values passed to all
+     *      {@link ViewPager.OnPageChangeListener#onPageScrolled} calls.
+     */
+    private void verifyScrollCallbacksToHigherPage(int startPageIndex, int endPageIndex,
+            int pageWidth, List<Integer> positions, List<Float> positionOffsets,
+            List<Integer> positionOffsetPixels) {
+        int callbackCount = positions.size();
+
+        // The last entry in all three lists must match the index of the end page
+        Assert.assertEquals("Position at last index",
+                endPageIndex, (int) positions.get(callbackCount - 1));
+        Assert.assertEquals("Position offset at last index",
+                0.0f, positionOffsets.get(callbackCount - 1), 0.0f);
+        Assert.assertEquals("Position offset pixel at last index",
+                0, (int) positionOffsetPixels.get(callbackCount - 1));
+
+        // If this was our only callback, return. This can happen on immediate page change
+        // or on very slow devices.
+        if (callbackCount == 1) {
+            return;
+        }
+
+        // If we have additional callbacks, verify that the values provided to our callback reflect
+        // a valid sequence of events going from startPageIndex to endPageIndex.
+        for (int i = 0; i < callbackCount - 1; i++) {
+            // Page position must be between start page and end page
+            int pagePositionCurr = positions.get(i);
+            if ((pagePositionCurr < startPageIndex) || (pagePositionCurr > endPageIndex)) {
+                Assert.fail("Position at #" + i + " is " + pagePositionCurr +
+                        ", but should be between " + startPageIndex + " and " + endPageIndex);
+            }
+
+            // Page position sequence cannot be decreasing
+            int pagePositionNext = positions.get(i + 1);
+            if (pagePositionCurr > pagePositionNext) {
+                Assert.fail("Position at #" + i + " is " + pagePositionCurr +
+                        " and then decreases to " + pagePositionNext + " at #" + (i + 1));
+            }
+
+            // Position offset must be in [0..1) range (inclusive / exclusive)
+            float positionOffsetCurr = positionOffsets.get(i);
+            if ((positionOffsetCurr < 0.0f) || (positionOffsetCurr >= 1.0f)) {
+                Assert.fail("Position offset at #" + i + " is " + positionOffsetCurr +
+                        ", but should be in [0..1) range");
+            }
+
+            // Position pixel offset must be in [0..pageWidth) range (inclusive / exclusive)
+            int positionOffsetPixelCurr = positionOffsetPixels.get(i);
+            if ((positionOffsetPixelCurr < 0.0f) || (positionOffsetPixelCurr >= pageWidth)) {
+                Assert.fail("Position pixel offset at #" + i + " is " + positionOffsetCurr +
+                        ", but should be in [0.." + pageWidth + ") range");
+            }
+
+            // Position pixel offset must match the position offset and page width within
+            // a one-pixel tolerance range
+            Assert.assertEquals("Position pixel offset at #" + i + " is " +
+                    positionOffsetPixelCurr + ", but doesn't match position offset which is" +
+                    positionOffsetCurr + " and page width which is " + pageWidth,
+                    positionOffsetPixelCurr, positionOffsetCurr * pageWidth, 1.0f);
+
+            // If we stay on the same page between this index and the next one, both position
+            // offset and position pixel offset must increase
+            if (pagePositionNext == pagePositionCurr) {
+                float positionOffsetNext = positionOffsets.get(i + 1);
+                // Note that since position offset sequence is float, we are checking for strict
+                // increasing
+                if (positionOffsetNext <= positionOffsetCurr) {
+                    Assert.fail("Position offset at #" + i + " is " + positionOffsetCurr +
+                            " and at #" + (i + 1) + " is " + positionOffsetNext +
+                            ". Since both are for page " + pagePositionCurr +
+                            ", they cannot decrease");
+                }
+
+                int positionOffsetPixelNext = positionOffsetPixels.get(i + 1);
+                // Note that since position offset pixel sequence is the mapping of position offset
+                // into screen pixels, we can get two (or more) callbacks with strictly increasing
+                // position offsets that are converted into the same pixel value. This is why here
+                // we are checking for non-strict increasing
+                if (positionOffsetPixelNext < positionOffsetPixelCurr) {
+                    Assert.fail("Position offset pixel at #" + i + " is " +
+                            positionOffsetPixelCurr + " and at #" + (i + 1) + " is " +
+                            positionOffsetPixelNext + ". Since both are for page " +
+                            pagePositionCurr + ", they cannot decrease");
+                }
+            }
+        }
+    }
+
+    /**
+     * Helper method to verify the internal consistency of values passed to
+     * {@link ViewPager.OnPageChangeListener#onPageScrolled} callback when we go from a page with
+     * higher index to a page with lower index.
+     *
+     * @param startPageIndex Index of the starting page.
+     * @param endPageIndex Index of the ending page.
+     * @param pageWidth Page width in pixels.
+     * @param positions List of "position" values passed to all
+     *      {@link ViewPager.OnPageChangeListener#onPageScrolled} calls.
+     * @param positionOffsets List of "positionOffset" values passed to all
+     *      {@link ViewPager.OnPageChangeListener#onPageScrolled} calls.
+     * @param positionOffsetPixels List of "positionOffsetPixel" values passed to all
+     *      {@link ViewPager.OnPageChangeListener#onPageScrolled} calls.
+     */
+    private void verifyScrollCallbacksToLowerPage(int startPageIndex, int endPageIndex,
+            int pageWidth, List<Integer> positions, List<Float> positionOffsets,
+            List<Integer> positionOffsetPixels) {
+        int callbackCount = positions.size();
+
+        // The last entry in all three lists must match the index of the end page
+        Assert.assertEquals("Position at last index",
+                endPageIndex, (int) positions.get(callbackCount - 1));
+        Assert.assertEquals("Position offset at last index",
+                0.0f, positionOffsets.get(callbackCount - 1), 0.0f);
+        Assert.assertEquals("Position offset pixel at last index",
+                0, (int) positionOffsetPixels.get(callbackCount - 1));
+
+        // If this was our only callback, return. This can happen on immediate page change
+        // or on very slow devices.
+        if (callbackCount == 1) {
+            return;
+        }
+
+        // If we have additional callbacks, verify that the values provided to our callback reflect
+        // a valid sequence of events going from startPageIndex to endPageIndex.
+        for (int i = 0; i < callbackCount - 1; i++) {
+            // Page position must be between start page and end page
+            int pagePositionCurr = positions.get(i);
+            if ((pagePositionCurr > startPageIndex) || (pagePositionCurr < endPageIndex)) {
+                Assert.fail("Position at #" + i + " is " + pagePositionCurr +
+                        ", but should be between " + endPageIndex + " and " + startPageIndex);
+            }
+
+            // Page position sequence cannot be increasing
+            int pagePositionNext = positions.get(i + 1);
+            if (pagePositionCurr < pagePositionNext) {
+                Assert.fail("Position at #" + i + " is " + pagePositionCurr +
+                        " and then increases to " + pagePositionNext + " at #" + (i + 1));
+            }
+
+            // Position offset must be in [0..1) range (inclusive / exclusive)
+            float positionOffsetCurr = positionOffsets.get(i);
+            if ((positionOffsetCurr < 0.0f) || (positionOffsetCurr >= 1.0f)) {
+                Assert.fail("Position offset at #" + i + " is " + positionOffsetCurr +
+                        ", but should be in [0..1) range");
+            }
+
+            // Position pixel offset must be in [0..pageWidth) range (inclusive / exclusive)
+            int positionOffsetPixelCurr = positionOffsetPixels.get(i);
+            if ((positionOffsetPixelCurr < 0.0f) || (positionOffsetPixelCurr >= pageWidth)) {
+                Assert.fail("Position pixel offset at #" + i + " is " + positionOffsetCurr +
+                        ", but should be in [0.." + pageWidth + ") range");
+            }
+
+            // Position pixel offset must match the position offset and page width within
+            // a one-pixel tolerance range
+            Assert.assertEquals("Position pixel offset at #" + i + " is " +
+                            positionOffsetPixelCurr + ", but doesn't match position offset which is" +
+                            positionOffsetCurr + " and page width which is " + pageWidth,
+                    positionOffsetPixelCurr, positionOffsetCurr * pageWidth, 1.0f);
+
+            // If we stay on the same page between this index and the next one, both position
+            // offset and position pixel offset must decrease
+            if (pagePositionNext == pagePositionCurr) {
+                float positionOffsetNext = positionOffsets.get(i + 1);
+                // Note that since position offset sequence is float, we are checking for strict
+                // decreasing
+                if (positionOffsetNext >= positionOffsetCurr) {
+                    Assert.fail("Position offset at #" + i + " is " + positionOffsetCurr +
+                            " and at #" + (i + 1) + " is " + positionOffsetNext +
+                            ". Since both are for page " + pagePositionCurr +
+                            ", they cannot increase");
+                }
+
+                int positionOffsetPixelNext = positionOffsetPixels.get(i + 1);
+                // Note that since position offset pixel sequence is the mapping of position offset
+                // into screen pixels, we can get two (or more) callbacks with strictly decreasing
+                // position offsets that are converted into the same pixel value. This is why here
+                // we are checking for non-strict decreasing
+                if (positionOffsetPixelNext > positionOffsetPixelCurr) {
+                    Assert.fail("Position offset pixel at #" + i + " is " +
+                            positionOffsetPixelCurr + " and at #" + (i + 1) + " is " +
+                            positionOffsetPixelNext + ". Since both are for page " +
+                            pagePositionCurr + ", they cannot increase");
+                }
+            }
+        }
+    }
+
+    private void verifyScrollCallbacksToHigherPage(ViewAction viewAction,
+            int expectedEndPageIndex) {
+        final int startPageIndex = mViewPager.getCurrentItem();
+
+        ViewPager.OnPageChangeListener mockPageChangeListener =
+                mock(ViewPager.OnPageChangeListener.class);
+        mViewPager.addOnPageChangeListener(mockPageChangeListener);
+
+        // Perform our action
+        onView(withId(R.id.pager)).perform(viewAction);
+
+        final int endPageIndex = mViewPager.getCurrentItem();
+        Assert.assertEquals("Current item after action", expectedEndPageIndex, endPageIndex);
+
+        ArgumentCaptor<Integer> positionCaptor = ArgumentCaptor.forClass(int.class);
+        ArgumentCaptor<Float> positionOffsetCaptor = ArgumentCaptor.forClass(float.class);
+        ArgumentCaptor<Integer> positionOffsetPixelsCaptor = ArgumentCaptor.forClass(int.class);
+        verify(mockPageChangeListener, atLeastOnce()).onPageScrolled(positionCaptor.capture(),
+                positionOffsetCaptor.capture(), positionOffsetPixelsCaptor.capture());
+
+        verifyScrollCallbacksToHigherPage(startPageIndex, endPageIndex, mViewPager.getWidth(),
+                positionCaptor.getAllValues(), positionOffsetCaptor.getAllValues(),
+                positionOffsetPixelsCaptor.getAllValues());
+
+        // Remove our mock listener to get back to clean state for the next test
+        mViewPager.removeOnPageChangeListener(mockPageChangeListener);
+    }
+
+    private void verifyScrollCallbacksToLowerPage(ViewAction viewAction,
+            int expectedEndPageIndex) {
+        final int startPageIndex = mViewPager.getCurrentItem();
+
+        ViewPager.OnPageChangeListener mockPageChangeListener =
+                mock(ViewPager.OnPageChangeListener.class);
+        mViewPager.addOnPageChangeListener(mockPageChangeListener);
+
+        // Perform our action
+        onView(withId(R.id.pager)).perform(viewAction);
+
+        final int endPageIndex = mViewPager.getCurrentItem();
+        Assert.assertEquals("Current item after action", expectedEndPageIndex, endPageIndex);
+
+        ArgumentCaptor<Integer> positionCaptor = ArgumentCaptor.forClass(int.class);
+        ArgumentCaptor<Float> positionOffsetCaptor = ArgumentCaptor.forClass(float.class);
+        ArgumentCaptor<Integer> positionOffsetPixelsCaptor = ArgumentCaptor.forClass(int.class);
+        verify(mockPageChangeListener, atLeastOnce()).onPageScrolled(positionCaptor.capture(),
+                positionOffsetCaptor.capture(), positionOffsetPixelsCaptor.capture());
+
+        verifyScrollCallbacksToLowerPage(startPageIndex, endPageIndex, mViewPager.getWidth(),
+                positionCaptor.getAllValues(), positionOffsetCaptor.getAllValues(),
+                positionOffsetPixelsCaptor.getAllValues());
+
+        // Remove our mock listener to get back to clean state for the next test
+        mViewPager.removeOnPageChangeListener(mockPageChangeListener);
+    }
+
+    @Test
+    @SmallTest
+    public void testPageScrollPositionChangesImmediate() {
+        // Scroll one page to the right
+        verifyScrollCallbacksToHigherPage(scrollRight(false), 1);
+        // Scroll one more page to the right
+        verifyScrollCallbacksToHigherPage(scrollRight(false), 2);
+        // Scroll one page to the left
+        verifyScrollCallbacksToLowerPage(scrollLeft(false), 1);
+        // Scroll one more page to the left
+        verifyScrollCallbacksToLowerPage(scrollLeft(false), 0);
+
+        // Scroll to the last page
+        verifyScrollCallbacksToHigherPage(scrollToLast(false), 2);
+        // Scroll to the first page
+        verifyScrollCallbacksToLowerPage(scrollToFirst(false), 0);
+    }
+
+    @Test
+    @MediumTest
+    public void testPageScrollPositionChangesSmooth() {
+        // Scroll one page to the right
+        verifyScrollCallbacksToHigherPage(scrollRight(true), 1);
+        // Scroll one more page to the right
+        verifyScrollCallbacksToHigherPage(scrollRight(true), 2);
+        // Scroll one page to the left
+        verifyScrollCallbacksToLowerPage(scrollLeft(true), 1);
+        // Scroll one more page to the left
+        verifyScrollCallbacksToLowerPage(scrollLeft(true), 0);
+
+        // Scroll to the last page
+        verifyScrollCallbacksToHigherPage(scrollToLast(true), 2);
+        // Scroll to the first page
+        verifyScrollCallbacksToLowerPage(scrollToFirst(true), 0);
+    }
+
+    @Test
+    @MediumTest
+    public void testPageScrollPositionChangesSwipe() {
+        // Swipe one page to the left
+        verifyScrollCallbacksToHigherPage(wrap(swipeLeft()), 1);
+        // Swipe one more page to the left
+        verifyScrollCallbacksToHigherPage(wrap(swipeLeft()), 2);
+        // Swipe one page to the right
+        verifyScrollCallbacksToLowerPage(wrap(swipeRight()), 1);
+        // Swipe one more page to the right
+        verifyScrollCallbacksToLowerPage(wrap(swipeRight()), 0);
+    }
+}
diff --git a/v4/tests/java/android/support/v4/view/ViewPagerActions.java b/core-ui/tests/java/android/support/v4/view/ViewPagerActions.java
similarity index 100%
rename from v4/tests/java/android/support/v4/view/ViewPagerActions.java
rename to core-ui/tests/java/android/support/v4/view/ViewPagerActions.java
diff --git a/core-ui/tests/java/android/support/v4/view/ViewPagerWithTabStripActivity.java b/core-ui/tests/java/android/support/v4/view/ViewPagerWithTabStripActivity.java
new file mode 100644
index 0000000..55fd51e
--- /dev/null
+++ b/core-ui/tests/java/android/support/v4/view/ViewPagerWithTabStripActivity.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2015 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 android.support.v4.view;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.support.coreui.test.R;
+import android.view.WindowManager;
+
+public class ViewPagerWithTabStripActivity extends Activity {
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
+        setContentView(R.layout.view_pager_with_tab_strip);
+    }
+}
diff --git a/core-ui/tests/java/android/support/v4/view/ViewPagerWithTabStripTest.java b/core-ui/tests/java/android/support/v4/view/ViewPagerWithTabStripTest.java
new file mode 100644
index 0000000..cd26461
--- /dev/null
+++ b/core-ui/tests/java/android/support/v4/view/ViewPagerWithTabStripTest.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2015 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 android.support.v4.view;
+
+import android.support.coreui.test.R;
+
+import static android.support.test.espresso.Espresso.onView;
+import static android.support.test.espresso.action.ViewActions.click;
+import static android.support.test.espresso.matcher.ViewMatchers.isDescendantOfA;
+import static android.support.test.espresso.matcher.ViewMatchers.withId;
+import static android.support.test.espresso.matcher.ViewMatchers.withText;
+import static android.support.v4.view.ViewPagerActions.clickBetweenTwoTitles;
+import static android.support.v4.view.ViewPagerActions.scrollRight;
+import static android.support.v4.view.ViewPagerActions.scrollToPage;
+import static org.hamcrest.Matchers.allOf;
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Provides assertions that depend on the interactive nature of <code>PagerTabStrip</code>.
+ */
+public class ViewPagerWithTabStripTest extends BaseViewPagerTest<ViewPagerWithTabStripActivity> {
+    public ViewPagerWithTabStripTest() {
+        super(ViewPagerWithTabStripActivity.class);
+    }
+
+    @Override
+    protected Class getStripClass() {
+        return PagerTabStrip.class;
+    }
+
+    @Override
+    protected void assertStripInteraction(boolean smoothScroll) {
+        // The following block tests that ViewPager page selection changes on clicking titles of
+        // various tabs as PagerTabStrip is interactive
+
+        // Click the tab title for page #0 and verify that we're still on page #0
+        onView(allOf(isDescendantOfA(withId(R.id.titles)), withText("Red"))).perform(click());
+        assertEquals("Click tab #0 on tab #0", 0, mViewPager.getCurrentItem());
+
+        // Click the tab title for page #1 and verify that we're on page #1
+        onView(allOf(isDescendantOfA(withId(R.id.titles)), withText("Green"))).perform(click());
+        assertEquals("Click tab #1 on tab #0", 1, mViewPager.getCurrentItem());
+
+        // Click the tab title for page #0 and verify that we're on page #0
+        onView(allOf(isDescendantOfA(withId(R.id.titles)), withText("Red"))).perform(click());
+        assertEquals("Click tab #0 on tab #1", 0, mViewPager.getCurrentItem());
+
+        // Go back to page #1
+        onView(withId(R.id.pager)).perform(scrollRight(smoothScroll));
+
+        // Click the tab title for page #1 and verify that we're still on page #1
+        onView(allOf(isDescendantOfA(withId(R.id.titles)), withText("Green"))).perform(click());
+        assertEquals("Click tab #1 on tab #1", 1, mViewPager.getCurrentItem());
+
+        // Click the tab title for page #2 and verify that we're on page #2
+        onView(allOf(isDescendantOfA(withId(R.id.titles)), withText("Blue"))).perform(click());
+        assertEquals("Click tab #2 on tab #1", 2, mViewPager.getCurrentItem());
+
+        // The following block tests that ViewPager page selection changes on clicking in
+        // between titles of tabs as that functionality is exposed by PagerTabStrip
+
+        // Scroll back to page #0
+        onView(withId(R.id.pager)).perform(scrollToPage(0, smoothScroll));
+
+        // Click between titles of page #0 and page #1 and verify that we're on page #1
+        onView(withId(R.id.titles)).perform(clickBetweenTwoTitles("Red", "Green"));
+        assertEquals("Click in between tabs #0 and #1 on tab #0", 1, mViewPager.getCurrentItem());
+
+        // Click between titles of page #0 and page #1 and verify that we're on page #0
+        onView(withId(R.id.titles)).perform(clickBetweenTwoTitles("Red", "Green"));
+        assertEquals("Click in between tabs #0 and #1 on tab #1", 0, mViewPager.getCurrentItem());
+
+        // Go back to page #1
+        onView(withId(R.id.pager)).perform(scrollRight(smoothScroll));
+
+        // Click between titles of page #1 and page #2 and verify that we're on page #2
+        onView(withId(R.id.titles)).perform(clickBetweenTwoTitles("Green", "Blue"));
+        assertEquals("Click in between tabs #1 and #2 on tab #1", 2, mViewPager.getCurrentItem());
+    }
+}
diff --git a/core-ui/tests/java/android/support/v4/view/ViewPagerWithTitleStripActivity.java b/core-ui/tests/java/android/support/v4/view/ViewPagerWithTitleStripActivity.java
new file mode 100644
index 0000000..e5a62a1
--- /dev/null
+++ b/core-ui/tests/java/android/support/v4/view/ViewPagerWithTitleStripActivity.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2015 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 android.support.v4.view;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.support.coreui.test.R;
+import android.view.WindowManager;
+
+public class ViewPagerWithTitleStripActivity extends Activity {
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
+        setContentView(R.layout.view_pager_with_title_strip);
+    }
+}
diff --git a/core-ui/tests/java/android/support/v4/view/ViewPagerWithTitleStripTest.java b/core-ui/tests/java/android/support/v4/view/ViewPagerWithTitleStripTest.java
new file mode 100644
index 0000000..d54992c
--- /dev/null
+++ b/core-ui/tests/java/android/support/v4/view/ViewPagerWithTitleStripTest.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2015 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 android.support.v4.view;
+
+import android.support.coreui.test.R;
+
+import static android.support.test.espresso.Espresso.onView;
+import static android.support.test.espresso.action.ViewActions.click;
+import static android.support.test.espresso.matcher.ViewMatchers.isDescendantOfA;
+import static android.support.test.espresso.matcher.ViewMatchers.withId;
+import static android.support.test.espresso.matcher.ViewMatchers.withText;
+import static android.support.v4.view.ViewPagerActions.clickBetweenTwoTitles;
+import static android.support.v4.view.ViewPagerActions.scrollRight;
+import static android.support.v4.view.ViewPagerActions.scrollToPage;
+import static org.hamcrest.Matchers.allOf;
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Provides assertions that depend on the non-interactive nature of <code>PagerTabStrip</code>.
+ */
+public class ViewPagerWithTitleStripTest
+        extends BaseViewPagerTest<ViewPagerWithTitleStripActivity> {
+    public ViewPagerWithTitleStripTest() {
+        super(ViewPagerWithTitleStripActivity.class);
+    }
+
+    @Override
+    protected Class getStripClass() {
+        return PagerTitleStrip.class;
+    }
+
+    @Override
+    protected void assertStripInteraction(boolean smoothScroll) {
+        // The following block tests that nothing happens on clicking titles of various tabs
+        // as PagerTitleStrip is not interactive
+
+        // Click the tab title for page #0 and verify that we're still on page #0
+        onView(allOf(isDescendantOfA(withId(R.id.titles)), withText("Red"))).perform(click());
+        assertEquals("Click tab #0 on tab #0", 0, mViewPager.getCurrentItem());
+
+        // Click the tab title for page #1 and verify that we're still on page #0
+        onView(allOf(isDescendantOfA(withId(R.id.titles)), withText("Green"))).perform(click());
+        assertEquals("Click tab #1 on tab #0", 0, mViewPager.getCurrentItem());
+
+        onView(withId(R.id.pager)).perform(scrollRight(smoothScroll));
+
+        // Click the tab title for page #0 and verify that we're still on page #1
+        onView(allOf(isDescendantOfA(withId(R.id.titles)), withText("Red"))).perform(click());
+        assertEquals("Click tab #0 on tab #1", 1, mViewPager.getCurrentItem());
+
+        // Click the tab title for page #1 and verify that we're still on page #1
+        onView(allOf(isDescendantOfA(withId(R.id.titles)), withText("Green"))).perform(click());
+        assertEquals("Click tab #1 on tab #1", 1, mViewPager.getCurrentItem());
+
+        // Click the tab title for page #2 and verify that we're still on page #1
+        onView(allOf(isDescendantOfA(withId(R.id.titles)), withText("Blue"))).perform(click());
+        assertEquals("Click tab #2 on tab #1", 1, mViewPager.getCurrentItem());
+
+
+        // The following block tests that nothing happens on clicking in between titles of various
+        // tabs as PagerTitleStrip is not interactive
+
+        // Scroll back to page #0
+        onView(withId(R.id.pager)).perform(scrollToPage(0, smoothScroll));
+
+        // Click between titles of page #0 and page #1 and verify that we're still on page #0
+        onView(withId(R.id.titles)).perform(clickBetweenTwoTitles("Red", "Green"));
+        assertEquals("Click in between tabs #0 and #1 on tab #0", 0, mViewPager.getCurrentItem());
+
+        // Go to page #1
+        onView(withId(R.id.pager)).perform(scrollRight(smoothScroll));
+
+        // Click between titles of page #1 and page #2 and verify that we're still on page #1
+        onView(withId(R.id.titles)).perform(clickBetweenTwoTitles("Green", "Blue"));
+        assertEquals("Click in between tabs #1 and #2 on tab #1", 1, mViewPager.getCurrentItem());
+
+        // Click between titles of page #0 and page #1 and verify that we're still on page #1
+        onView(withId(R.id.titles)).perform(clickBetweenTwoTitles("Red", "Green"));
+        assertEquals("Click in between tabs #0 and #1 on tab #1", 1, mViewPager.getCurrentItem());
+    }
+}
diff --git a/core-ui/tests/java/android/support/v4/widget/ExploreByTouchHelperTest.java b/core-ui/tests/java/android/support/v4/widget/ExploreByTouchHelperTest.java
new file mode 100644
index 0000000..836dd5c
--- /dev/null
+++ b/core-ui/tests/java/android/support/v4/widget/ExploreByTouchHelperTest.java
@@ -0,0 +1,149 @@
+/*
+ * Copyright (C) 2016 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 android.support.v4.widget;
+
+import android.graphics.Rect;
+import android.os.Build;
+import android.os.Bundle;
+import android.support.coreui.test.R;
+import android.support.test.annotation.UiThreadTest;
+import android.support.v4.BaseInstrumentationTestCase;
+import android.support.v4.view.ViewCompat;
+import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat;
+import android.test.suitebuilder.annotation.SmallTest;
+import android.view.View;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.List;
+
+import static junit.framework.Assert.assertFalse;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assume.assumeTrue;
+
+@SmallTest
+public class ExploreByTouchHelperTest extends BaseInstrumentationTestCase<ExploreByTouchHelperTestActivity> {
+    private View mHost;
+
+    public ExploreByTouchHelperTest() {
+        super(ExploreByTouchHelperTestActivity.class);
+    }
+
+    @Before
+    public void setUp() {
+        // Accessibility delegates are only supported on API 14+.
+        assumeTrue(Build.VERSION.SDK_INT >= 14);
+        mHost = mActivityTestRule.getActivity().findViewById(R.id.host_view);
+    }
+
+    @Test
+    @UiThreadTest
+    public void testBoundsInScreen() {
+        final ExploreByTouchHelper helper = new ParentBoundsHelper(mHost);
+        ViewCompat.setAccessibilityDelegate(mHost, helper);
+
+        final AccessibilityNodeInfoCompat node =
+                helper.getAccessibilityNodeProvider(mHost).createAccessibilityNodeInfo(1);
+        assertNotNull(node);
+
+        final Rect hostBounds = new Rect();
+        mHost.getLocalVisibleRect(hostBounds);
+        assertFalse("Host has not been laid out", hostBounds.isEmpty());
+
+        final Rect nodeBoundsInParent = new Rect();
+        node.getBoundsInParent(nodeBoundsInParent);
+        assertEquals("Wrong bounds in parent", hostBounds, nodeBoundsInParent);
+
+        final Rect hostBoundsOnScreen = getBoundsOnScreen(mHost);
+        final Rect nodeBoundsInScreen = new Rect();
+        node.getBoundsInScreen(nodeBoundsInScreen);
+        assertEquals("Wrong bounds in screen", hostBoundsOnScreen, nodeBoundsInScreen);
+
+        final int scrollX = 100;
+        final int scrollY = 50;
+        mHost.scrollTo(scrollX, scrollY);
+
+        // Generate a node for the new position.
+        final AccessibilityNodeInfoCompat scrolledNode =
+                helper.getAccessibilityNodeProvider(mHost).createAccessibilityNodeInfo(1);
+        assertNotNull(scrolledNode);
+
+        mHost.getLocalVisibleRect(hostBounds);
+        hostBounds.intersect(nodeBoundsInParent);
+        final Rect scrolledNodeBoundsInParent = new Rect();
+        scrolledNode.getBoundsInParent(scrolledNodeBoundsInParent);
+        assertEquals("Wrong bounds in parent after scrolling",
+                hostBounds, scrolledNodeBoundsInParent);
+
+        final Rect expectedBoundsInScreen = new Rect(hostBoundsOnScreen);
+        expectedBoundsInScreen.offset(-scrollX, -scrollY);
+        expectedBoundsInScreen.intersect(hostBoundsOnScreen);
+        scrolledNode.getBoundsInScreen(nodeBoundsInScreen);
+        assertEquals("Wrong bounds in screen after scrolling",
+                expectedBoundsInScreen, nodeBoundsInScreen);
+
+        ViewCompat.setAccessibilityDelegate(mHost, null);
+    }
+
+    private static Rect getBoundsOnScreen(View v) {
+        final int[] tempLocation = new int[2];
+        final Rect hostBoundsOnScreen = new Rect(0, 0, v.getWidth(), v.getHeight());
+        v.getLocationOnScreen(tempLocation);
+        hostBoundsOnScreen.offset(tempLocation[0], tempLocation[1]);
+        return hostBoundsOnScreen;
+    }
+
+    /**
+     * An extension of ExploreByTouchHelper that contains a single virtual view
+     * whose bounds match the host view.
+     */
+    private static class ParentBoundsHelper extends ExploreByTouchHelper {
+        private final View mHost;
+
+        public ParentBoundsHelper(View host) {
+            super(host);
+
+            mHost = host;
+        }
+
+        @Override
+        protected int getVirtualViewAt(float x, float y) {
+            return 1;
+        }
+
+        @Override
+        protected void getVisibleVirtualViews(List<Integer> virtualViewIds) {
+            virtualViewIds.add(1);
+        }
+
+        @Override
+        protected void onPopulateNodeForVirtualView(int virtualViewId, AccessibilityNodeInfoCompat node) {
+            if (virtualViewId == 1) {
+                node.setContentDescription("test");
+
+                final Rect hostBounds = new Rect(0, 0, mHost.getWidth(), mHost.getHeight());
+                node.setBoundsInParent(hostBounds);
+            }
+        }
+
+        @Override
+        protected boolean onPerformActionForVirtualView(int virtualViewId, int action, Bundle arguments) {
+            return false;
+        }
+    }
+}
diff --git a/core-ui/tests/java/android/support/v4/widget/ExploreByTouchHelperTestActivity.java b/core-ui/tests/java/android/support/v4/widget/ExploreByTouchHelperTestActivity.java
new file mode 100644
index 0000000..19d1598
--- /dev/null
+++ b/core-ui/tests/java/android/support/v4/widget/ExploreByTouchHelperTestActivity.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2016 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 android.support.v4.widget;
+
+import android.support.coreui.test.R;
+import android.support.v4.BaseTestActivity;
+
+public class ExploreByTouchHelperTestActivity extends BaseTestActivity {
+    @Override
+    protected int getContentViewLayoutResId() {
+        return R.layout.explore_by_touch_helper_activity;
+    }
+}
diff --git a/v4/tests/java/android/support/v4/widget/SwipeRefreshLayoutActions.java b/core-ui/tests/java/android/support/v4/widget/SwipeRefreshLayoutActions.java
similarity index 100%
rename from v4/tests/java/android/support/v4/widget/SwipeRefreshLayoutActions.java
rename to core-ui/tests/java/android/support/v4/widget/SwipeRefreshLayoutActions.java
diff --git a/core-ui/tests/java/android/support/v4/widget/SwipeRefreshLayoutActivity.java b/core-ui/tests/java/android/support/v4/widget/SwipeRefreshLayoutActivity.java
new file mode 100644
index 0000000..f9245bc
--- /dev/null
+++ b/core-ui/tests/java/android/support/v4/widget/SwipeRefreshLayoutActivity.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2016 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 android.support.v4.widget;
+
+import android.support.coreui.test.R;
+import android.support.v4.BaseTestActivity;
+
+public class SwipeRefreshLayoutActivity extends BaseTestActivity {
+    @Override
+    protected int getContentViewLayoutResId() {
+        return R.layout.swipe_refresh_layout_activity;
+    }
+}
diff --git a/core-ui/tests/java/android/support/v4/widget/SwipeRefreshLayoutTest.java b/core-ui/tests/java/android/support/v4/widget/SwipeRefreshLayoutTest.java
new file mode 100644
index 0000000..3efd652
--- /dev/null
+++ b/core-ui/tests/java/android/support/v4/widget/SwipeRefreshLayoutTest.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2016 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 android.support.v4.widget;
+
+import static android.support.test.espresso.Espresso.onView;
+import static android.support.test.espresso.matcher.ViewMatchers.withId;
+import static android.support.v4.widget.SwipeRefreshLayoutActions.setRefreshing;
+import static android.support.v4.widget.SwipeRefreshLayoutActions.setSize;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import android.support.coreui.test.R;
+import android.support.v4.BaseInstrumentationTestCase;
+import android.test.suitebuilder.annotation.MediumTest;
+import android.test.suitebuilder.annotation.SmallTest;
+
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Tests SwipeRefreshLayout widget.
+ */
+public class SwipeRefreshLayoutTest
+        extends BaseInstrumentationTestCase<SwipeRefreshLayoutActivity> {
+
+    private SwipeRefreshLayout mSwipeRefresh;
+
+    public SwipeRefreshLayoutTest() {
+        super(SwipeRefreshLayoutActivity.class);
+    }
+
+    @Before
+    public void setUp() {
+        mSwipeRefresh = (SwipeRefreshLayout) mActivityTestRule.getActivity().findViewById(
+                R.id.swipe_refresh);
+    }
+
+    @Test
+    @MediumTest
+    public void testStartAndStopRefreshing() throws Throwable {
+        assertFalse(mSwipeRefresh.isRefreshing());
+        for (int i = 0; i < 5; i++) {
+            onView(withId(R.id.swipe_refresh)).perform(setRefreshing());
+            assertTrue(mSwipeRefresh.isRefreshing());
+
+            // onView(..).perform(..) does not work when views are animated.
+            // Therefore this is using a posted task to turn off refreshing.
+            mSwipeRefresh.getHandler().post(new Runnable() {
+                @Override
+                public void run() {
+                    mSwipeRefresh.setRefreshing(false);
+                }
+            });
+            long waitTime = 1000;
+            while (mSwipeRefresh.isRefreshing()) {
+                Thread.sleep(20);
+                waitTime -= 20;
+                assertTrue("Timed out while waiting for SwipeRefreshLayout to stop refreshing",
+                        waitTime > 0);
+            }
+        }
+    }
+
+    @Test
+    @SmallTest
+    public void testSetSize() throws Throwable {
+        float density = mSwipeRefresh.getResources().getDisplayMetrics().density;
+        assertEquals((int) (SwipeRefreshLayout.CIRCLE_DIAMETER * density),
+                mSwipeRefresh.getProgressCircleDiameter());
+        onView(withId(R.id.swipe_refresh)).perform(setSize(SwipeRefreshLayout.LARGE));
+        assertEquals((int) (SwipeRefreshLayout.CIRCLE_DIAMETER_LARGE * density),
+                mSwipeRefresh.getProgressCircleDiameter());
+        onView(withId(R.id.swipe_refresh)).perform(setSize(SwipeRefreshLayout.DEFAULT));
+        assertEquals((int) (SwipeRefreshLayout.CIRCLE_DIAMETER * density),
+                mSwipeRefresh.getProgressCircleDiameter());
+        onView(withId(R.id.swipe_refresh)).perform(setSize(SwipeRefreshLayout.DEFAULT));
+    }
+}
diff --git a/v4/tests/res/anim/fade_in.xml b/core-ui/tests/res/anim/fade_in.xml
similarity index 100%
rename from v4/tests/res/anim/fade_in.xml
rename to core-ui/tests/res/anim/fade_in.xml
diff --git a/v4/tests/res/anim/fade_out.xml b/core-ui/tests/res/anim/fade_out.xml
similarity index 100%
rename from v4/tests/res/anim/fade_out.xml
rename to core-ui/tests/res/anim/fade_out.xml
diff --git a/v4/tests/res/anim/long_fade_in.xml b/core-ui/tests/res/anim/long_fade_in.xml
similarity index 100%
rename from v4/tests/res/anim/long_fade_in.xml
rename to core-ui/tests/res/anim/long_fade_in.xml
diff --git a/v4/tests/res/anim/long_fade_out.xml b/core-ui/tests/res/anim/long_fade_out.xml
similarity index 100%
rename from v4/tests/res/anim/long_fade_out.xml
rename to core-ui/tests/res/anim/long_fade_out.xml
diff --git a/v4/tests/res/layout/activity_content.xml b/core-ui/tests/res/layout/activity_content.xml
similarity index 100%
rename from v4/tests/res/layout/activity_content.xml
rename to core-ui/tests/res/layout/activity_content.xml
diff --git a/v4/tests/res/layout/explore_by_touch_helper_activity.xml b/core-ui/tests/res/layout/explore_by_touch_helper_activity.xml
similarity index 100%
rename from v4/tests/res/layout/explore_by_touch_helper_activity.xml
rename to core-ui/tests/res/layout/explore_by_touch_helper_activity.xml
diff --git a/v4/tests/res/layout/fragment_a.xml b/core-ui/tests/res/layout/fragment_a.xml
similarity index 100%
rename from v4/tests/res/layout/fragment_a.xml
rename to core-ui/tests/res/layout/fragment_a.xml
diff --git a/v4/tests/res/layout/fragment_b.xml b/core-ui/tests/res/layout/fragment_b.xml
similarity index 100%
rename from v4/tests/res/layout/fragment_b.xml
rename to core-ui/tests/res/layout/fragment_b.xml
diff --git a/v4/tests/res/layout/fragment_c.xml b/core-ui/tests/res/layout/fragment_c.xml
similarity index 100%
rename from v4/tests/res/layout/fragment_c.xml
rename to core-ui/tests/res/layout/fragment_c.xml
diff --git a/v4/tests/res/layout/fragment_end.xml b/core-ui/tests/res/layout/fragment_end.xml
similarity index 100%
rename from v4/tests/res/layout/fragment_end.xml
rename to core-ui/tests/res/layout/fragment_end.xml
diff --git a/v4/tests/res/layout/fragment_middle.xml b/core-ui/tests/res/layout/fragment_middle.xml
similarity index 100%
rename from v4/tests/res/layout/fragment_middle.xml
rename to core-ui/tests/res/layout/fragment_middle.xml
diff --git a/v4/tests/res/layout/fragment_start.xml b/core-ui/tests/res/layout/fragment_start.xml
similarity index 100%
rename from v4/tests/res/layout/fragment_start.xml
rename to core-ui/tests/res/layout/fragment_start.xml
diff --git a/v4/tests/res/layout/strict_view_fragment.xml b/core-ui/tests/res/layout/strict_view_fragment.xml
similarity index 100%
rename from v4/tests/res/layout/strict_view_fragment.xml
rename to core-ui/tests/res/layout/strict_view_fragment.xml
diff --git a/v4/tests/res/layout/swipe_refresh_layout_activity.xml b/core-ui/tests/res/layout/swipe_refresh_layout_activity.xml
similarity index 100%
rename from v4/tests/res/layout/swipe_refresh_layout_activity.xml
rename to core-ui/tests/res/layout/swipe_refresh_layout_activity.xml
diff --git a/v4/tests/res/layout/view_pager_with_tab_strip.xml b/core-ui/tests/res/layout/view_pager_with_tab_strip.xml
similarity index 100%
rename from v4/tests/res/layout/view_pager_with_tab_strip.xml
rename to core-ui/tests/res/layout/view_pager_with_tab_strip.xml
diff --git a/v4/tests/res/layout/view_pager_with_title_strip.xml b/core-ui/tests/res/layout/view_pager_with_title_strip.xml
similarity index 100%
rename from v4/tests/res/layout/view_pager_with_title_strip.xml
rename to core-ui/tests/res/layout/view_pager_with_title_strip.xml
diff --git a/v4/tests/res/transition/change_bounds.xml b/core-ui/tests/res/transition/change_bounds.xml
similarity index 100%
rename from v4/tests/res/transition/change_bounds.xml
rename to core-ui/tests/res/transition/change_bounds.xml
diff --git a/v4/tests/res/transition/fade.xml b/core-ui/tests/res/transition/fade.xml
similarity index 100%
rename from v4/tests/res/transition/fade.xml
rename to core-ui/tests/res/transition/fade.xml
diff --git a/core-ui/tests/res/values/colors.xml b/core-ui/tests/res/values/colors.xml
new file mode 100644
index 0000000..d0d5309
--- /dev/null
+++ b/core-ui/tests/res/values/colors.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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">
+    <color name="text_color">#FF8090</color>
+
+    <color name="test_red">#FF6030</color>
+    <color name="test_green">#50E080</color>
+    <color name="test_blue">#3050CF</color>
+    <color name="test_yellow">#F0F000</color>
+</resources>
diff --git a/core-ui/tests/res/values/dimens.xml b/core-ui/tests/res/values/dimens.xml
new file mode 100644
index 0000000..c3617a9
--- /dev/null
+++ b/core-ui/tests/res/values/dimens.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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">
+    <dimen name="text_medium_size">20sp</dimen>
+</resources>
\ No newline at end of file
diff --git a/v4/tests/res/values/ids.xml b/core-ui/tests/res/values/ids.xml
similarity index 100%
rename from v4/tests/res/values/ids.xml
rename to core-ui/tests/res/values/ids.xml
diff --git a/core-ui/tests/res/values/strings.xml b/core-ui/tests/res/values/strings.xml
new file mode 100644
index 0000000..2fa1430
--- /dev/null
+++ b/core-ui/tests/res/values/strings.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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="hello">Hello World</string>
+</resources>
\ No newline at end of file
diff --git a/core-ui/tests/res/values/styles.xml b/core-ui/tests/res/values/styles.xml
new file mode 100644
index 0000000..ae6325b
--- /dev/null
+++ b/core-ui/tests/res/values/styles.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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">
+    <style name="TestActivityTheme">
+        <item name="android:windowAnimationStyle">@null</item>
+    </style>
+    <style name="TextMediumStyle" parent="@android:style/TextAppearance.Medium">
+        <item name="android:textSize">@dimen/text_medium_size</item>
+        <item name="android:textColor">@color/text_color</item>
+        <item name="android:textStyle">italic</item>
+    </style>
+</resources>
\ No newline at end of file
diff --git a/customtabs/Android.mk b/customtabs/Android.mk
index fb2f354..50e6dbc 100644
--- a/customtabs/Android.mk
+++ b/customtabs/Android.mk
@@ -25,15 +25,6 @@
 LOCAL_SRC_FILES := $(call all-java-files-under, src) \
     $(call all-Iaidl-files-under, src)
 LOCAL_JAVA_LIBRARIES := android-support-annotations \
-android-support-v4
+android-support-compat
 LOCAL_JAVA_LANGUAGE_VERSION := 1.7
 include $(BUILD_STATIC_JAVA_LIBRARY)
-
-# API Check
-# ---------------------------------------------
-support_module := $(LOCAL_MODULE)
-support_module_api_dir := $(LOCAL_PATH)/api
-support_module_src_files := $(LOCAL_SRC_FILES)
-support_module_java_libraries := $(LOCAL_JAVA_LIBRARIES)
-support_module_java_packages := android.support.customtabs
-include $(SUPPORT_API_CHECK)
diff --git a/customtabs/api/23.0.0.txt b/customtabs/api/23.0.0.txt
deleted file mode 100644
index 0e1745d..0000000
--- a/customtabs/api/23.0.0.txt
+++ /dev/null
@@ -1,79 +0,0 @@
-package android.support.customtabs {
-
-  public class CustomTabsCallback {
-    ctor public CustomTabsCallback();
-    method public void extraCallback(java.lang.String, android.os.Bundle);
-    method public void onNavigationEvent(int, android.os.Bundle);
-    field public static final int NAVIGATION_ABORTED = 4; // 0x4
-    field public static final int NAVIGATION_FAILED = 3; // 0x3
-    field public static final int NAVIGATION_FINISHED = 2; // 0x2
-    field public static final int NAVIGATION_STARTED = 1; // 0x1
-  }
-
-  public class CustomTabsClient {
-    method public static boolean bindCustomTabsService(android.content.Context, java.lang.String, android.support.customtabs.CustomTabsServiceConnection);
-    method public android.os.Bundle extraCommand(java.lang.String, android.os.Bundle);
-    method public android.support.customtabs.CustomTabsSession newSession(android.support.customtabs.CustomTabsCallback);
-    method public boolean warmup(long);
-  }
-
-  public final class CustomTabsIntent {
-    method public void launchUrl(android.app.Activity, android.net.Uri);
-    field public static final java.lang.String EXTRA_ACTION_BUTTON_BUNDLE = "android.support.customtabs.extra.ACTION_BUTTON_BUNDLE";
-    field public static final java.lang.String EXTRA_CLOSE_BUTTON_ICON = "android.support.customtabs.extra.CLOSE_BUTTON_ICON";
-    field public static final java.lang.String EXTRA_EXIT_ANIMATION_BUNDLE = "android.support.customtabs.extra.EXIT_ANIMATION_BUNDLE";
-    field public static final java.lang.String EXTRA_MENU_ITEMS = "android.support.customtabs.extra.MENU_ITEMS";
-    field public static final java.lang.String EXTRA_SESSION = "android.support.customtabs.extra.SESSION";
-    field public static final java.lang.String EXTRA_TITLE_VISIBILITY_STATE = "android.support.customtabs.extra.TITLE_VISIBILITY";
-    field public static final java.lang.String EXTRA_TOOLBAR_COLOR = "android.support.customtabs.extra.TOOLBAR_COLOR";
-    field public static final java.lang.String KEY_DESCRIPTION = "android.support.customtabs.customaction.DESCRIPTION";
-    field public static final java.lang.String KEY_ICON = "android.support.customtabs.customaction.ICON";
-    field public static final java.lang.String KEY_MENU_ITEM_TITLE = "android.support.customtabs.customaction.MENU_ITEM_TITLE";
-    field public static final java.lang.String KEY_PENDING_INTENT = "android.support.customtabs.customaction.PENDING_INTENT";
-    field public static final int NO_TITLE = 0; // 0x0
-    field public static final int SHOW_PAGE_TITLE = 1; // 0x1
-    field public final android.content.Intent intent;
-    field public final android.os.Bundle startAnimationBundle;
-  }
-
-  public static final class CustomTabsIntent.Builder {
-    ctor public CustomTabsIntent.Builder();
-    ctor public CustomTabsIntent.Builder(android.support.customtabs.CustomTabsSession);
-    method public android.support.customtabs.CustomTabsIntent.Builder addMenuItem(java.lang.String, android.app.PendingIntent);
-    method public android.support.customtabs.CustomTabsIntent build();
-    method public android.support.customtabs.CustomTabsIntent.Builder setActionButton(android.graphics.Bitmap, java.lang.String, android.app.PendingIntent);
-    method public android.support.customtabs.CustomTabsIntent.Builder setCloseButtonIcon(android.graphics.Bitmap);
-    method public android.support.customtabs.CustomTabsIntent.Builder setExitAnimations(android.content.Context, int, int);
-    method public android.support.customtabs.CustomTabsIntent.Builder setShowTitle(boolean);
-    method public android.support.customtabs.CustomTabsIntent.Builder setStartAnimations(android.content.Context, int, int);
-    method public android.support.customtabs.CustomTabsIntent.Builder setToolbarColor(int);
-  }
-
-  public abstract class CustomTabsService extends android.app.Service {
-    ctor public CustomTabsService();
-    method protected boolean cleanUpSession(android.support.customtabs.CustomTabsSessionToken);
-    method protected abstract android.os.Bundle extraCommand(java.lang.String, android.os.Bundle);
-    method protected abstract boolean mayLaunchUrl(android.support.customtabs.CustomTabsSessionToken, android.net.Uri, android.os.Bundle, java.util.List<android.os.Bundle>);
-    method protected abstract boolean newSession(android.support.customtabs.CustomTabsSessionToken);
-    method public android.os.IBinder onBind(android.content.Intent);
-    method protected abstract boolean warmup(long);
-    field public static final java.lang.String ACTION_CUSTOM_TABS_CONNECTION = "android.support.customtabs.action.CustomTabsService";
-    field public static final java.lang.String KEY_URL = "android.support.customtabs.otherurls.URL";
-  }
-
-  public abstract class CustomTabsServiceConnection implements android.content.ServiceConnection {
-    ctor public CustomTabsServiceConnection();
-    method public abstract void onCustomTabsServiceConnected(android.content.ComponentName, android.support.customtabs.CustomTabsClient);
-    method public final void onServiceConnected(android.content.ComponentName, android.os.IBinder);
-  }
-
-  public final class CustomTabsSession {
-    method public boolean mayLaunchUrl(android.net.Uri, android.os.Bundle, java.util.List<android.os.Bundle>);
-  }
-
-  public class CustomTabsSessionToken {
-    method public android.support.customtabs.CustomTabsCallback getCallback();
-  }
-
-}
-
diff --git a/customtabs/api/23.1.0.txt b/customtabs/api/23.1.0.txt
deleted file mode 100644
index caa5ea4..0000000
--- a/customtabs/api/23.1.0.txt
+++ /dev/null
@@ -1,88 +0,0 @@
-package android.support.customtabs {
-
-  public class CustomTabsCallback {
-    ctor public CustomTabsCallback();
-    method public void extraCallback(java.lang.String, android.os.Bundle);
-    method public void onNavigationEvent(int, android.os.Bundle);
-    field public static final int NAVIGATION_ABORTED = 4; // 0x4
-    field public static final int NAVIGATION_FAILED = 3; // 0x3
-    field public static final int NAVIGATION_FINISHED = 2; // 0x2
-    field public static final int NAVIGATION_STARTED = 1; // 0x1
-    field public static final int TAB_HIDDEN = 6; // 0x6
-    field public static final int TAB_SHOWN = 5; // 0x5
-  }
-
-  public class CustomTabsClient {
-    method public static boolean bindCustomTabsService(android.content.Context, java.lang.String, android.support.customtabs.CustomTabsServiceConnection);
-    method public android.os.Bundle extraCommand(java.lang.String, android.os.Bundle);
-    method public android.support.customtabs.CustomTabsSession newSession(android.support.customtabs.CustomTabsCallback);
-    method public boolean warmup(long);
-  }
-
-  public final class CustomTabsIntent {
-    method public void launchUrl(android.app.Activity, android.net.Uri);
-    field public static final java.lang.String EXTRA_ACTION_BUTTON_BUNDLE = "android.support.customtabs.extra.ACTION_BUTTON_BUNDLE";
-    field public static final java.lang.String EXTRA_CLOSE_BUTTON_ICON = "android.support.customtabs.extra.CLOSE_BUTTON_ICON";
-    field public static final java.lang.String EXTRA_ENABLE_URLBAR_HIDING = "android.support.customtabs.extra.ENABLE_URLBAR_HIDING";
-    field public static final java.lang.String EXTRA_EXIT_ANIMATION_BUNDLE = "android.support.customtabs.extra.EXIT_ANIMATION_BUNDLE";
-    field public static final java.lang.String EXTRA_MENU_ITEMS = "android.support.customtabs.extra.MENU_ITEMS";
-    field public static final java.lang.String EXTRA_SESSION = "android.support.customtabs.extra.SESSION";
-    field public static final java.lang.String EXTRA_TINT_ACTION_BUTTON = "android.support.customtabs.extra.TINT_ACTION_BUTTON";
-    field public static final java.lang.String EXTRA_TITLE_VISIBILITY_STATE = "android.support.customtabs.extra.TITLE_VISIBILITY";
-    field public static final java.lang.String EXTRA_TOOLBAR_COLOR = "android.support.customtabs.extra.TOOLBAR_COLOR";
-    field public static final java.lang.String KEY_DESCRIPTION = "android.support.customtabs.customaction.DESCRIPTION";
-    field public static final java.lang.String KEY_ICON = "android.support.customtabs.customaction.ICON";
-    field public static final java.lang.String KEY_MENU_ITEM_TITLE = "android.support.customtabs.customaction.MENU_ITEM_TITLE";
-    field public static final java.lang.String KEY_PENDING_INTENT = "android.support.customtabs.customaction.PENDING_INTENT";
-    field public static final int NO_TITLE = 0; // 0x0
-    field public static final int SHOW_PAGE_TITLE = 1; // 0x1
-    field public final android.content.Intent intent;
-    field public final android.os.Bundle startAnimationBundle;
-  }
-
-  public static final class CustomTabsIntent.Builder {
-    ctor public CustomTabsIntent.Builder();
-    ctor public CustomTabsIntent.Builder(android.support.customtabs.CustomTabsSession);
-    method public android.support.customtabs.CustomTabsIntent.Builder addMenuItem(java.lang.String, android.app.PendingIntent);
-    method public android.support.customtabs.CustomTabsIntent build();
-    method public android.support.customtabs.CustomTabsIntent.Builder enableUrlBarHiding();
-    method public android.support.customtabs.CustomTabsIntent.Builder setActionButton(android.graphics.Bitmap, java.lang.String, android.app.PendingIntent, boolean);
-    method public android.support.customtabs.CustomTabsIntent.Builder setActionButton(android.graphics.Bitmap, java.lang.String, android.app.PendingIntent);
-    method public android.support.customtabs.CustomTabsIntent.Builder setCloseButtonIcon(android.graphics.Bitmap);
-    method public android.support.customtabs.CustomTabsIntent.Builder setExitAnimations(android.content.Context, int, int);
-    method public android.support.customtabs.CustomTabsIntent.Builder setShowTitle(boolean);
-    method public android.support.customtabs.CustomTabsIntent.Builder setStartAnimations(android.content.Context, int, int);
-    method public android.support.customtabs.CustomTabsIntent.Builder setToolbarColor(int);
-  }
-
-  public abstract class CustomTabsService extends android.app.Service {
-    ctor public CustomTabsService();
-    method protected boolean cleanUpSession(android.support.customtabs.CustomTabsSessionToken);
-    method protected abstract android.os.Bundle extraCommand(java.lang.String, android.os.Bundle);
-    method protected abstract boolean mayLaunchUrl(android.support.customtabs.CustomTabsSessionToken, android.net.Uri, android.os.Bundle, java.util.List<android.os.Bundle>);
-    method protected abstract boolean newSession(android.support.customtabs.CustomTabsSessionToken);
-    method public android.os.IBinder onBind(android.content.Intent);
-    method protected abstract boolean updateVisuals(android.support.customtabs.CustomTabsSessionToken, android.os.Bundle);
-    method protected abstract boolean warmup(long);
-    field public static final java.lang.String ACTION_CUSTOM_TABS_CONNECTION = "android.support.customtabs.action.CustomTabsService";
-    field public static final java.lang.String KEY_URL = "android.support.customtabs.otherurls.URL";
-  }
-
-  public abstract class CustomTabsServiceConnection implements android.content.ServiceConnection {
-    ctor public CustomTabsServiceConnection();
-    method public abstract void onCustomTabsServiceConnected(android.content.ComponentName, android.support.customtabs.CustomTabsClient);
-    method public final void onServiceConnected(android.content.ComponentName, android.os.IBinder);
-  }
-
-  public final class CustomTabsSession {
-    method public boolean mayLaunchUrl(android.net.Uri, android.os.Bundle, java.util.List<android.os.Bundle>);
-    method public boolean setActionButton(android.graphics.Bitmap, java.lang.String);
-  }
-
-  public class CustomTabsSessionToken {
-    method public android.support.customtabs.CustomTabsCallback getCallback();
-    method public static android.support.customtabs.CustomTabsSessionToken getSessionTokenFromIntent(android.content.Intent);
-  }
-
-}
-
diff --git a/customtabs/api/23.1.1.txt b/customtabs/api/23.1.1.txt
deleted file mode 100644
index caa5ea4..0000000
--- a/customtabs/api/23.1.1.txt
+++ /dev/null
@@ -1,88 +0,0 @@
-package android.support.customtabs {
-
-  public class CustomTabsCallback {
-    ctor public CustomTabsCallback();
-    method public void extraCallback(java.lang.String, android.os.Bundle);
-    method public void onNavigationEvent(int, android.os.Bundle);
-    field public static final int NAVIGATION_ABORTED = 4; // 0x4
-    field public static final int NAVIGATION_FAILED = 3; // 0x3
-    field public static final int NAVIGATION_FINISHED = 2; // 0x2
-    field public static final int NAVIGATION_STARTED = 1; // 0x1
-    field public static final int TAB_HIDDEN = 6; // 0x6
-    field public static final int TAB_SHOWN = 5; // 0x5
-  }
-
-  public class CustomTabsClient {
-    method public static boolean bindCustomTabsService(android.content.Context, java.lang.String, android.support.customtabs.CustomTabsServiceConnection);
-    method public android.os.Bundle extraCommand(java.lang.String, android.os.Bundle);
-    method public android.support.customtabs.CustomTabsSession newSession(android.support.customtabs.CustomTabsCallback);
-    method public boolean warmup(long);
-  }
-
-  public final class CustomTabsIntent {
-    method public void launchUrl(android.app.Activity, android.net.Uri);
-    field public static final java.lang.String EXTRA_ACTION_BUTTON_BUNDLE = "android.support.customtabs.extra.ACTION_BUTTON_BUNDLE";
-    field public static final java.lang.String EXTRA_CLOSE_BUTTON_ICON = "android.support.customtabs.extra.CLOSE_BUTTON_ICON";
-    field public static final java.lang.String EXTRA_ENABLE_URLBAR_HIDING = "android.support.customtabs.extra.ENABLE_URLBAR_HIDING";
-    field public static final java.lang.String EXTRA_EXIT_ANIMATION_BUNDLE = "android.support.customtabs.extra.EXIT_ANIMATION_BUNDLE";
-    field public static final java.lang.String EXTRA_MENU_ITEMS = "android.support.customtabs.extra.MENU_ITEMS";
-    field public static final java.lang.String EXTRA_SESSION = "android.support.customtabs.extra.SESSION";
-    field public static final java.lang.String EXTRA_TINT_ACTION_BUTTON = "android.support.customtabs.extra.TINT_ACTION_BUTTON";
-    field public static final java.lang.String EXTRA_TITLE_VISIBILITY_STATE = "android.support.customtabs.extra.TITLE_VISIBILITY";
-    field public static final java.lang.String EXTRA_TOOLBAR_COLOR = "android.support.customtabs.extra.TOOLBAR_COLOR";
-    field public static final java.lang.String KEY_DESCRIPTION = "android.support.customtabs.customaction.DESCRIPTION";
-    field public static final java.lang.String KEY_ICON = "android.support.customtabs.customaction.ICON";
-    field public static final java.lang.String KEY_MENU_ITEM_TITLE = "android.support.customtabs.customaction.MENU_ITEM_TITLE";
-    field public static final java.lang.String KEY_PENDING_INTENT = "android.support.customtabs.customaction.PENDING_INTENT";
-    field public static final int NO_TITLE = 0; // 0x0
-    field public static final int SHOW_PAGE_TITLE = 1; // 0x1
-    field public final android.content.Intent intent;
-    field public final android.os.Bundle startAnimationBundle;
-  }
-
-  public static final class CustomTabsIntent.Builder {
-    ctor public CustomTabsIntent.Builder();
-    ctor public CustomTabsIntent.Builder(android.support.customtabs.CustomTabsSession);
-    method public android.support.customtabs.CustomTabsIntent.Builder addMenuItem(java.lang.String, android.app.PendingIntent);
-    method public android.support.customtabs.CustomTabsIntent build();
-    method public android.support.customtabs.CustomTabsIntent.Builder enableUrlBarHiding();
-    method public android.support.customtabs.CustomTabsIntent.Builder setActionButton(android.graphics.Bitmap, java.lang.String, android.app.PendingIntent, boolean);
-    method public android.support.customtabs.CustomTabsIntent.Builder setActionButton(android.graphics.Bitmap, java.lang.String, android.app.PendingIntent);
-    method public android.support.customtabs.CustomTabsIntent.Builder setCloseButtonIcon(android.graphics.Bitmap);
-    method public android.support.customtabs.CustomTabsIntent.Builder setExitAnimations(android.content.Context, int, int);
-    method public android.support.customtabs.CustomTabsIntent.Builder setShowTitle(boolean);
-    method public android.support.customtabs.CustomTabsIntent.Builder setStartAnimations(android.content.Context, int, int);
-    method public android.support.customtabs.CustomTabsIntent.Builder setToolbarColor(int);
-  }
-
-  public abstract class CustomTabsService extends android.app.Service {
-    ctor public CustomTabsService();
-    method protected boolean cleanUpSession(android.support.customtabs.CustomTabsSessionToken);
-    method protected abstract android.os.Bundle extraCommand(java.lang.String, android.os.Bundle);
-    method protected abstract boolean mayLaunchUrl(android.support.customtabs.CustomTabsSessionToken, android.net.Uri, android.os.Bundle, java.util.List<android.os.Bundle>);
-    method protected abstract boolean newSession(android.support.customtabs.CustomTabsSessionToken);
-    method public android.os.IBinder onBind(android.content.Intent);
-    method protected abstract boolean updateVisuals(android.support.customtabs.CustomTabsSessionToken, android.os.Bundle);
-    method protected abstract boolean warmup(long);
-    field public static final java.lang.String ACTION_CUSTOM_TABS_CONNECTION = "android.support.customtabs.action.CustomTabsService";
-    field public static final java.lang.String KEY_URL = "android.support.customtabs.otherurls.URL";
-  }
-
-  public abstract class CustomTabsServiceConnection implements android.content.ServiceConnection {
-    ctor public CustomTabsServiceConnection();
-    method public abstract void onCustomTabsServiceConnected(android.content.ComponentName, android.support.customtabs.CustomTabsClient);
-    method public final void onServiceConnected(android.content.ComponentName, android.os.IBinder);
-  }
-
-  public final class CustomTabsSession {
-    method public boolean mayLaunchUrl(android.net.Uri, android.os.Bundle, java.util.List<android.os.Bundle>);
-    method public boolean setActionButton(android.graphics.Bitmap, java.lang.String);
-  }
-
-  public class CustomTabsSessionToken {
-    method public android.support.customtabs.CustomTabsCallback getCallback();
-    method public static android.support.customtabs.CustomTabsSessionToken getSessionTokenFromIntent(android.content.Intent);
-  }
-
-}
-
diff --git a/customtabs/api/current.txt b/customtabs/api/current.txt
deleted file mode 100644
index 23f0b0a..0000000
--- a/customtabs/api/current.txt
+++ /dev/null
@@ -1,106 +0,0 @@
-package android.support.customtabs {
-
-  public class CustomTabsCallback {
-    ctor public CustomTabsCallback();
-    method public void extraCallback(java.lang.String, android.os.Bundle);
-    method public void onNavigationEvent(int, android.os.Bundle);
-    field public static final int NAVIGATION_ABORTED = 4; // 0x4
-    field public static final int NAVIGATION_FAILED = 3; // 0x3
-    field public static final int NAVIGATION_FINISHED = 2; // 0x2
-    field public static final int NAVIGATION_STARTED = 1; // 0x1
-    field public static final int TAB_HIDDEN = 6; // 0x6
-    field public static final int TAB_SHOWN = 5; // 0x5
-  }
-
-  public class CustomTabsClient {
-    method public static boolean bindCustomTabsService(android.content.Context, java.lang.String, android.support.customtabs.CustomTabsServiceConnection);
-    method public static boolean connectAndInitialize(android.content.Context, java.lang.String);
-    method public android.os.Bundle extraCommand(java.lang.String, android.os.Bundle);
-    method public static java.lang.String getPackageName(android.content.Context, java.util.List<java.lang.String>);
-    method public static java.lang.String getPackageName(android.content.Context, java.util.List<java.lang.String>, boolean);
-    method public android.support.customtabs.CustomTabsSession newSession(android.support.customtabs.CustomTabsCallback);
-    method public boolean warmup(long);
-  }
-
-  public final class CustomTabsIntent {
-    method public static int getMaxToolbarItems();
-    method public void launchUrl(android.app.Activity, android.net.Uri);
-    field public static final java.lang.String EXTRA_ACTION_BUTTON_BUNDLE = "android.support.customtabs.extra.ACTION_BUTTON_BUNDLE";
-    field public static final java.lang.String EXTRA_CLOSE_BUTTON_ICON = "android.support.customtabs.extra.CLOSE_BUTTON_ICON";
-    field public static final java.lang.String EXTRA_DEFAULT_SHARE_MENU_ITEM = "android.support.customtabs.extra.SHARE_MENU_ITEM";
-    field public static final java.lang.String EXTRA_ENABLE_URLBAR_HIDING = "android.support.customtabs.extra.ENABLE_URLBAR_HIDING";
-    field public static final java.lang.String EXTRA_EXIT_ANIMATION_BUNDLE = "android.support.customtabs.extra.EXIT_ANIMATION_BUNDLE";
-    field public static final java.lang.String EXTRA_MENU_ITEMS = "android.support.customtabs.extra.MENU_ITEMS";
-    field public static final java.lang.String EXTRA_REMOTEVIEWS = "android.support.customtabs.extra.EXTRA_REMOTEVIEWS";
-    field public static final java.lang.String EXTRA_REMOTEVIEWS_CLICKED_ID = "android.support.customtabs.extra.EXTRA_REMOTEVIEWS_CLICKED_ID";
-    field public static final java.lang.String EXTRA_REMOTEVIEWS_PENDINGINTENT = "android.support.customtabs.extra.EXTRA_REMOTEVIEWS_PENDINGINTENT";
-    field public static final java.lang.String EXTRA_REMOTEVIEWS_VIEW_IDS = "android.support.customtabs.extra.EXTRA_REMOTEVIEWS_VIEW_IDS";
-    field public static final java.lang.String EXTRA_SECONDARY_TOOLBAR_COLOR = "android.support.customtabs.extra.SECONDARY_TOOLBAR_COLOR";
-    field public static final java.lang.String EXTRA_SESSION = "android.support.customtabs.extra.SESSION";
-    field public static final java.lang.String EXTRA_TINT_ACTION_BUTTON = "android.support.customtabs.extra.TINT_ACTION_BUTTON";
-    field public static final java.lang.String EXTRA_TITLE_VISIBILITY_STATE = "android.support.customtabs.extra.TITLE_VISIBILITY";
-    field public static final java.lang.String EXTRA_TOOLBAR_COLOR = "android.support.customtabs.extra.TOOLBAR_COLOR";
-    field public static final java.lang.String EXTRA_TOOLBAR_ITEMS = "android.support.customtabs.extra.TOOLBAR_ITEMS";
-    field public static final java.lang.String KEY_DESCRIPTION = "android.support.customtabs.customaction.DESCRIPTION";
-    field public static final java.lang.String KEY_ICON = "android.support.customtabs.customaction.ICON";
-    field public static final java.lang.String KEY_ID = "android.support.customtabs.customaction.ID";
-    field public static final java.lang.String KEY_MENU_ITEM_TITLE = "android.support.customtabs.customaction.MENU_ITEM_TITLE";
-    field public static final java.lang.String KEY_PENDING_INTENT = "android.support.customtabs.customaction.PENDING_INTENT";
-    field public static final int NO_TITLE = 0; // 0x0
-    field public static final int SHOW_PAGE_TITLE = 1; // 0x1
-    field public static final int TOOLBAR_ACTION_BUTTON_ID = 0; // 0x0
-    field public final android.content.Intent intent;
-    field public final android.os.Bundle startAnimationBundle;
-  }
-
-  public static final class CustomTabsIntent.Builder {
-    ctor public CustomTabsIntent.Builder();
-    ctor public CustomTabsIntent.Builder(android.support.customtabs.CustomTabsSession);
-    method public android.support.customtabs.CustomTabsIntent.Builder addDefaultShareMenuItem();
-    method public android.support.customtabs.CustomTabsIntent.Builder addMenuItem(java.lang.String, android.app.PendingIntent);
-    method public deprecated android.support.customtabs.CustomTabsIntent.Builder addToolbarItem(int, android.graphics.Bitmap, java.lang.String, android.app.PendingIntent) throws java.lang.IllegalStateException;
-    method public android.support.customtabs.CustomTabsIntent build();
-    method public android.support.customtabs.CustomTabsIntent.Builder enableUrlBarHiding();
-    method public android.support.customtabs.CustomTabsIntent.Builder setActionButton(android.graphics.Bitmap, java.lang.String, android.app.PendingIntent, boolean);
-    method public android.support.customtabs.CustomTabsIntent.Builder setActionButton(android.graphics.Bitmap, java.lang.String, android.app.PendingIntent);
-    method public android.support.customtabs.CustomTabsIntent.Builder setCloseButtonIcon(android.graphics.Bitmap);
-    method public android.support.customtabs.CustomTabsIntent.Builder setExitAnimations(android.content.Context, int, int);
-    method public android.support.customtabs.CustomTabsIntent.Builder setSecondaryToolbarColor(int);
-    method public android.support.customtabs.CustomTabsIntent.Builder setSecondaryToolbarViews(android.widget.RemoteViews, int[], android.app.PendingIntent);
-    method public android.support.customtabs.CustomTabsIntent.Builder setShowTitle(boolean);
-    method public android.support.customtabs.CustomTabsIntent.Builder setStartAnimations(android.content.Context, int, int);
-    method public android.support.customtabs.CustomTabsIntent.Builder setToolbarColor(int);
-  }
-
-  public abstract class CustomTabsService extends android.app.Service {
-    ctor public CustomTabsService();
-    method protected boolean cleanUpSession(android.support.customtabs.CustomTabsSessionToken);
-    method protected abstract android.os.Bundle extraCommand(java.lang.String, android.os.Bundle);
-    method protected abstract boolean mayLaunchUrl(android.support.customtabs.CustomTabsSessionToken, android.net.Uri, android.os.Bundle, java.util.List<android.os.Bundle>);
-    method protected abstract boolean newSession(android.support.customtabs.CustomTabsSessionToken);
-    method public android.os.IBinder onBind(android.content.Intent);
-    method protected abstract boolean updateVisuals(android.support.customtabs.CustomTabsSessionToken, android.os.Bundle);
-    method protected abstract boolean warmup(long);
-    field public static final java.lang.String ACTION_CUSTOM_TABS_CONNECTION = "android.support.customtabs.action.CustomTabsService";
-    field public static final java.lang.String KEY_URL = "android.support.customtabs.otherurls.URL";
-  }
-
-  public abstract class CustomTabsServiceConnection implements android.content.ServiceConnection {
-    ctor public CustomTabsServiceConnection();
-    method public abstract void onCustomTabsServiceConnected(android.content.ComponentName, android.support.customtabs.CustomTabsClient);
-    method public final void onServiceConnected(android.content.ComponentName, android.os.IBinder);
-  }
-
-  public final class CustomTabsSession {
-    method public boolean mayLaunchUrl(android.net.Uri, android.os.Bundle, java.util.List<android.os.Bundle>);
-    method public boolean setActionButton(android.graphics.Bitmap, java.lang.String);
-    method public boolean setToolbarItem(int, android.graphics.Bitmap, java.lang.String);
-  }
-
-  public class CustomTabsSessionToken {
-    method public android.support.customtabs.CustomTabsCallback getCallback();
-    method public static android.support.customtabs.CustomTabsSessionToken getSessionTokenFromIntent(android.content.Intent);
-  }
-
-}
-
diff --git a/customtabs/build.gradle b/customtabs/build.gradle
index 0e0e530..150467f 100644
--- a/customtabs/build.gradle
+++ b/customtabs/build.gradle
@@ -3,7 +3,7 @@
 archivesBaseName = 'customtabs'
 
 dependencies {
-    compile project(':support-v4')
+    compile project(':support-compat')
     compile project(':support-annotations')
 
     androidTestCompile ('com.android.support.test:runner:0.4.1') {
diff --git a/customtabs/src/android/support/customtabs/CustomTabsClient.java b/customtabs/src/android/support/customtabs/CustomTabsClient.java
index f743c7d..6bd8896 100644
--- a/customtabs/src/android/support/customtabs/CustomTabsClient.java
+++ b/customtabs/src/android/support/customtabs/CustomTabsClient.java
@@ -123,7 +123,7 @@
      * necessary.
      *
      * @param context     {@link Context} to use to connect to the remote service.
-     * @param packageName Package name of the target implamentation.
+     * @param packageName Package name of the target implementation.
      * @return Whether the binding was successful.
      */
     public static boolean connectAndInitialize(Context context, String packageName) {
diff --git a/customtabs/src/android/support/customtabs/CustomTabsSession.java b/customtabs/src/android/support/customtabs/CustomTabsSession.java
index db6c2b7..bc05f8b 100644
--- a/customtabs/src/android/support/customtabs/CustomTabsSession.java
+++ b/customtabs/src/android/support/customtabs/CustomTabsSession.java
@@ -16,6 +16,7 @@
 
 package android.support.customtabs;
 
+import android.app.PendingIntent;
 import android.content.ComponentName;
 import android.graphics.Bitmap;
 import android.net.Uri;
@@ -23,6 +24,9 @@
 import android.os.IBinder;
 import android.os.RemoteException;
 import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.view.View;
+import android.widget.RemoteViews;
 
 import java.util.List;
 
@@ -77,7 +81,39 @@
      * @see {@link CustomTabsSession#setToolbarItem(int, Bitmap, String)}
      */
     public boolean setActionButton(@NonNull Bitmap icon, @NonNull String description) {
-        return setToolbarItem(CustomTabsIntent.TOOLBAR_ACTION_BUTTON_ID, icon, description);
+        Bundle bundle = new Bundle();
+        bundle.putParcelable(CustomTabsIntent.KEY_ICON, icon);
+        bundle.putString(CustomTabsIntent.KEY_DESCRIPTION, description);
+
+        Bundle metaBundle = new Bundle();
+        metaBundle.putBundle(CustomTabsIntent.EXTRA_ACTION_BUTTON_BUNDLE, bundle);
+        try {
+            return mService.updateVisuals(mCallback, metaBundle);
+        } catch (RemoteException e) {
+            return false;
+        }
+    }
+
+    /**
+     * Updates the {@link RemoteViews} of the secondary toolbar in an existing custom tab session.
+     * @param remoteViews   The updated {@link RemoteViews} that will be shown in secondary toolbar.
+     *                      If null, the current secondary toolbar will be dismissed.
+     * @param clickableIDs  The ids of clickable views. The onClick event of these views will be
+     *                      handled by custom tabs.
+     * @param pendingIntent The {@link PendingIntent} that will be sent when the user clicks on one
+     *                      of the {@link View}s in clickableIDs.
+     */
+    public boolean setSecondaryToolbarViews(@Nullable RemoteViews remoteViews,
+            @Nullable int[] clickableIDs, @Nullable PendingIntent pendingIntent) {
+        Bundle bundle = new Bundle();
+        bundle.putParcelable(CustomTabsIntent.EXTRA_REMOTEVIEWS, remoteViews);
+        bundle.putIntArray(CustomTabsIntent.EXTRA_REMOTEVIEWS_VIEW_IDS, clickableIDs);
+        bundle.putParcelable(CustomTabsIntent.EXTRA_REMOTEVIEWS_PENDINGINTENT, pendingIntent);
+        try {
+            return mService.updateVisuals(mCallback, bundle);
+        } catch (RemoteException e) {
+            return false;
+        }
     }
 
     /**
@@ -87,7 +123,10 @@
      * @param icon          The new icon of the toolbar item.
      * @param description   Content description of the toolbar item.
      * @return              Whether the update succeeded.
+     * @deprecated Use
+     * CustomTabsSession#setSecondaryToolbarViews(RemoteViews, int[], PendingIntent)
      */
+    @Deprecated
     public boolean setToolbarItem(int id, @NonNull Bitmap icon, @NonNull String description) {
         Bundle bundle = new Bundle();
         bundle.putInt(CustomTabsIntent.KEY_ID, id);
diff --git a/design/Android.mk b/design/Android.mk
index c9ba6ec..e9ba5b6 100644
--- a/design/Android.mk
+++ b/design/Android.mk
@@ -35,13 +35,11 @@
 LOCAL_JAVA_LANGUAGE_VERSION := 1.7
 include $(BUILD_STATIC_JAVA_LIBRARY)
 
-support_module_src_files := $(LOCAL_SRC_FILES)
-
 # A helper sub-library to resolve cyclic dependencies between src and the platform dependent
 # implementations
 include $(CLEAR_VARS)
 LOCAL_MODULE := android-support-design-base
-LOCAL_SDK_VERSION := 7
+LOCAL_SDK_VERSION := 9
 LOCAL_SRC_FILES := $(call all-java-files-under, base)
 LOCAL_JAVA_LIBRARIES := \
     android-support-design-res \
@@ -51,13 +49,11 @@
 LOCAL_JAVA_LANGUAGE_VERSION := 1.7
 include $(BUILD_STATIC_JAVA_LIBRARY)
 
-support_module_src_files += $(LOCAL_SRC_FILES)
-
-# A helper sub-library that makes direct use of Eclair MR1 APIs
+# A helper sub-library that makes direct use of Gingerbread APIs
 include $(CLEAR_VARS)
-LOCAL_MODULE := android-support-design-eclair-mr1
-LOCAL_SDK_VERSION := 7
-LOCAL_SRC_FILES := $(call all-java-files-under, eclair-mr1)
+LOCAL_MODULE := android-support-design-gingerbread
+LOCAL_SDK_VERSION := 9
+LOCAL_SRC_FILES := $(call all-java-files-under, gingerbread)
 LOCAL_STATIC_JAVA_LIBRARIES := android-support-design-base
 LOCAL_JAVA_LIBRARIES := \
     android-support-design-res \
@@ -67,14 +63,12 @@
 LOCAL_JAVA_LANGUAGE_VERSION := 1.7
 include $(BUILD_STATIC_JAVA_LIBRARY)
 
-support_module_src_files += $(LOCAL_SRC_FILES)
-
 # A helper sub-library that makes direct use of Honeycomb APIs
 include $(CLEAR_VARS)
 LOCAL_MODULE := android-support-design-honeycomb
 LOCAL_SDK_VERSION := 11
 LOCAL_SRC_FILES := $(call all-java-files-under, honeycomb)
-LOCAL_STATIC_JAVA_LIBRARIES := android-support-design-eclair-mr1
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-design-gingerbread
 LOCAL_JAVA_LIBRARIES := \
     android-support-design-res \
     android-support-v4 \
@@ -83,8 +77,6 @@
 LOCAL_JAVA_LANGUAGE_VERSION := 1.7
 include $(BUILD_STATIC_JAVA_LIBRARY)
 
-support_module_src_files += $(LOCAL_SRC_FILES)
-
 # A helper sub-library that makes direct use of Honeycomb MR1 APIs
 include $(CLEAR_VARS)
 LOCAL_MODULE := android-support-design-honeycomb-mr1
@@ -99,8 +91,6 @@
 LOCAL_JAVA_LANGUAGE_VERSION := 1.7
 include $(BUILD_STATIC_JAVA_LIBRARY)
 
-support_module_src_files += $(LOCAL_SRC_FILES)
-
 # A helper sub-library that makes direct use of ICS APIs
 include $(CLEAR_VARS)
 LOCAL_MODULE := android-support-design-ics
@@ -115,8 +105,6 @@
 LOCAL_JAVA_LANGUAGE_VERSION := 1.7
 include $(BUILD_STATIC_JAVA_LIBRARY)
 
-support_module_src_files += $(LOCAL_SRC_FILES)
-
 # A helper sub-library that makes direct use of Lollipop APIs
 include $(CLEAR_VARS)
 LOCAL_MODULE := android-support-design-lollipop
@@ -131,8 +119,6 @@
 LOCAL_JAVA_LANGUAGE_VERSION := 1.7
 include $(BUILD_STATIC_JAVA_LIBRARY)
 
-support_module_src_files += $(LOCAL_SRC_FILES)
-
 # Here is the final static library that apps can link against.
 # Applications that use this library must specify
 #
@@ -155,13 +141,3 @@
 LOCAL_JAVA_LANGUAGE_VERSION := 1.7
 LOCAL_AAPT_FLAGS := --add-javadoc-annotation doconly
 include $(BUILD_STATIC_JAVA_LIBRARY)
-
-support_module_src_files += $(LOCAL_SRC_FILES)
-
-# API Check
-# ---------------------------------------------
-support_module := $(LOCAL_MODULE)
-support_module_api_dir := $(LOCAL_PATH)/api
-support_module_java_libraries := $(LOCAL_JAVA_LIBRARIES)
-support_module_java_packages := android.support.design.*
-include $(SUPPORT_API_CHECK)
diff --git a/design/AndroidManifest.xml b/design/AndroidManifest.xml
index 963f89b..82f19db 100644
--- a/design/AndroidManifest.xml
+++ b/design/AndroidManifest.xml
@@ -15,6 +15,6 @@
 -->
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
           package="android.support.design">
-    <uses-sdk android:minSdkVersion="7"/>
+    <uses-sdk android:minSdkVersion="9"/>
     <application />
 </manifest>
diff --git a/design/api/22.2.0.txt b/design/api/22.2.0.txt
deleted file mode 100644
index 6053b92..0000000
--- a/design/api/22.2.0.txt
+++ /dev/null
@@ -1,339 +0,0 @@
-package android.support.design.widget {
-
-  public class AppBarLayout extends android.widget.LinearLayout {
-    ctor public AppBarLayout(android.content.Context);
-    ctor public AppBarLayout(android.content.Context, android.util.AttributeSet);
-    method public void addOnOffsetChangedListener(android.support.design.widget.AppBarLayout.OnOffsetChangedListener);
-    method public float getTargetElevation();
-    method public final int getTotalScrollRange();
-    method public void removeOnOffsetChangedListener(android.support.design.widget.AppBarLayout.OnOffsetChangedListener);
-    method public void setTargetElevation(float);
-  }
-
-  public static class AppBarLayout.Behavior extends android.support.design.widget.ViewOffsetBehavior {
-    ctor public AppBarLayout.Behavior();
-    ctor public AppBarLayout.Behavior(android.content.Context, android.util.AttributeSet);
-    method public boolean onLayoutChild(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, int);
-    method public boolean onNestedFling(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.view.View, float, float, boolean);
-    method public void onNestedPreScroll(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.view.View, int, int, int[]);
-    method public void onNestedScroll(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.view.View, int, int, int, int);
-    method public void onRestoreInstanceState(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.os.Parcelable);
-    method public android.os.Parcelable onSaveInstanceState(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout);
-    method public boolean onStartNestedScroll(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.view.View, android.view.View, int);
-    method public void onStopNestedScroll(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.view.View);
-  }
-
-  protected static class AppBarLayout.Behavior.SavedState extends android.view.View.BaseSavedState {
-    ctor public AppBarLayout.Behavior.SavedState(android.os.Parcel);
-    ctor public AppBarLayout.Behavior.SavedState(android.os.Parcelable);
-    field public static final android.os.Parcelable.Creator<android.support.design.widget.AppBarLayout.Behavior.SavedState> CREATOR;
-  }
-
-  public static class AppBarLayout.LayoutParams extends android.widget.LinearLayout.LayoutParams {
-    ctor public AppBarLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public AppBarLayout.LayoutParams(int, int);
-    ctor public AppBarLayout.LayoutParams(int, int, float);
-    ctor public AppBarLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public AppBarLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public AppBarLayout.LayoutParams(android.widget.LinearLayout.LayoutParams);
-    ctor public AppBarLayout.LayoutParams(android.support.design.widget.AppBarLayout.LayoutParams);
-    method public int getScrollFlags();
-    method public android.view.animation.Interpolator getScrollInterpolator();
-    method public void setScrollFlags(int);
-    method public void setScrollInterpolator(android.view.animation.Interpolator);
-    field public static final int SCROLL_FLAG_ENTER_ALWAYS = 4; // 0x4
-    field public static final int SCROLL_FLAG_ENTER_ALWAYS_COLLAPSED = 8; // 0x8
-    field public static final int SCROLL_FLAG_EXIT_UNTIL_COLLAPSED = 2; // 0x2
-    field public static final int SCROLL_FLAG_SCROLL = 1; // 0x1
-  }
-
-  public static abstract interface AppBarLayout.OnOffsetChangedListener {
-    method public abstract void onOffsetChanged(android.support.design.widget.AppBarLayout, int);
-  }
-
-  public static class AppBarLayout.ScrollingViewBehavior extends android.support.design.widget.ViewOffsetBehavior {
-    ctor public AppBarLayout.ScrollingViewBehavior();
-    ctor public AppBarLayout.ScrollingViewBehavior(android.content.Context, android.util.AttributeSet);
-    method public int getOverlayTop();
-    method public boolean layoutDependsOn(android.support.design.widget.CoordinatorLayout, android.view.View, android.view.View);
-    method public boolean onDependentViewChanged(android.support.design.widget.CoordinatorLayout, android.view.View, android.view.View);
-    method public boolean onMeasureChild(android.support.design.widget.CoordinatorLayout, android.view.View, int, int, int, int);
-    method public void setOverlayTop(int);
-  }
-
-  public class CollapsingToolbarLayout extends android.widget.FrameLayout {
-    ctor public CollapsingToolbarLayout(android.content.Context);
-    ctor public CollapsingToolbarLayout(android.content.Context, android.util.AttributeSet);
-    ctor public CollapsingToolbarLayout(android.content.Context, android.util.AttributeSet, int);
-    method public android.graphics.drawable.Drawable getContentScrim();
-    method public android.graphics.drawable.Drawable getStatusBarScrim();
-    method public void setCollapsedTitleTextAppearance(int);
-    method public void setCollapsedTitleTextColor(int);
-    method public void setContentScrim(android.graphics.drawable.Drawable);
-    method public void setContentScrimColor(int);
-    method public void setContentScrimResource(int);
-    method public void setExpandedTitleColor(int);
-    method public void setExpandedTitleTextAppearance(int);
-    method public void setStatusBarScrim(android.graphics.drawable.Drawable);
-    method public void setStatusBarScrimColor(int);
-    method public void setStatusBarScrimResource(int);
-    method public void setTitle(java.lang.CharSequence);
-  }
-
-  public static class CollapsingToolbarLayout.LayoutParams extends android.widget.FrameLayout.LayoutParams {
-    ctor public CollapsingToolbarLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public CollapsingToolbarLayout.LayoutParams(int, int);
-    ctor public CollapsingToolbarLayout.LayoutParams(int, int, int);
-    ctor public CollapsingToolbarLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public CollapsingToolbarLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public CollapsingToolbarLayout.LayoutParams(android.widget.FrameLayout.LayoutParams);
-    method public int getCollapseMode();
-    method public float getParallaxMultiplier();
-    method public void setCollapseMode(int);
-    method public void setParallaxMultiplier(float);
-    field public static final int COLLAPSE_MODE_OFF = 0; // 0x0
-    field public static final int COLLAPSE_MODE_PARALLAX = 2; // 0x2
-    field public static final int COLLAPSE_MODE_PIN = 1; // 0x1
-  }
-
-  public class CoordinatorLayout extends android.view.ViewGroup {
-    ctor public CoordinatorLayout(android.content.Context);
-    ctor public CoordinatorLayout(android.content.Context, android.util.AttributeSet);
-    ctor public CoordinatorLayout(android.content.Context, android.util.AttributeSet, int);
-    method public void dispatchDependentViewsChanged(android.view.View);
-    method public boolean doViewsOverlap(android.view.View, android.view.View);
-    method public java.util.List<android.view.View> getDependencies(android.view.View);
-    method public android.graphics.drawable.Drawable getStatusBarBackground();
-    method public boolean isPointInChildBounds(android.view.View, int, int);
-    method public void onAttachedToWindow();
-    method public void onDetachedFromWindow();
-    method public void onDraw(android.graphics.Canvas);
-    method protected void onLayout(boolean, int, int, int, int);
-    method public void onLayoutChild(android.view.View, int);
-    method public void onMeasureChild(android.view.View, int, int, int, int);
-    method public void setStatusBarBackground(android.graphics.drawable.Drawable);
-    method public void setStatusBarBackgroundColor(int);
-    method public void setStatusBarBackgroundResource(int);
-  }
-
-  public static abstract class CoordinatorLayout.Behavior {
-    ctor public CoordinatorLayout.Behavior();
-    ctor public CoordinatorLayout.Behavior(android.content.Context, android.util.AttributeSet);
-    method public boolean blocksInteractionBelow(android.support.design.widget.CoordinatorLayout, V);
-    method public final int getScrimColor(android.support.design.widget.CoordinatorLayout, V);
-    method public final float getScrimOpacity(android.support.design.widget.CoordinatorLayout, V);
-    method public static java.lang.Object getTag(android.view.View);
-    method public boolean isDirty(android.support.design.widget.CoordinatorLayout, V);
-    method public boolean layoutDependsOn(android.support.design.widget.CoordinatorLayout, V, android.view.View);
-    method public android.support.v4.view.WindowInsetsCompat onApplyWindowInsets(android.support.design.widget.CoordinatorLayout, V, android.support.v4.view.WindowInsetsCompat);
-    method public boolean onDependentViewChanged(android.support.design.widget.CoordinatorLayout, V, android.view.View);
-    method public boolean onInterceptTouchEvent(android.support.design.widget.CoordinatorLayout, V, android.view.MotionEvent);
-    method public boolean onLayoutChild(android.support.design.widget.CoordinatorLayout, V, int);
-    method public boolean onMeasureChild(android.support.design.widget.CoordinatorLayout, V, int, int, int, int);
-    method public boolean onNestedFling(android.support.design.widget.CoordinatorLayout, V, android.view.View, float, float, boolean);
-    method public boolean onNestedPreFling(android.support.design.widget.CoordinatorLayout, V, android.view.View, float, float);
-    method public void onNestedPreScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, int, int, int[]);
-    method public void onNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, int, int, int, int);
-    method public void onNestedScrollAccepted(android.support.design.widget.CoordinatorLayout, V, android.view.View, android.view.View, int);
-    method public void onRestoreInstanceState(android.support.design.widget.CoordinatorLayout, V, android.os.Parcelable);
-    method public android.os.Parcelable onSaveInstanceState(android.support.design.widget.CoordinatorLayout, V);
-    method public boolean onStartNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, android.view.View, int);
-    method public void onStopNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View);
-    method public boolean onTouchEvent(android.support.design.widget.CoordinatorLayout, V, android.view.MotionEvent);
-    method public static void setTag(android.view.View, java.lang.Object);
-  }
-
-  public static abstract class CoordinatorLayout.DefaultBehavior implements java.lang.annotation.Annotation {
-  }
-
-  public static class CoordinatorLayout.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
-    ctor public CoordinatorLayout.LayoutParams(int, int);
-    ctor public CoordinatorLayout.LayoutParams(android.support.design.widget.CoordinatorLayout.LayoutParams);
-    ctor public CoordinatorLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public CoordinatorLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
-    method public int getAnchorId();
-    method public android.support.design.widget.CoordinatorLayout.Behavior getBehavior();
-    method public void setAnchorId(int);
-    method public void setBehavior(android.support.design.widget.CoordinatorLayout.Behavior);
-    field public int anchorGravity;
-    field public int gravity;
-    field public int keyline;
-  }
-
-  protected static class CoordinatorLayout.SavedState extends android.view.View.BaseSavedState {
-    ctor public CoordinatorLayout.SavedState(android.os.Parcel);
-    ctor public CoordinatorLayout.SavedState(android.os.Parcelable);
-    field public static final android.os.Parcelable.Creator<android.support.design.widget.CoordinatorLayout.SavedState> CREATOR;
-  }
-
-  public class FloatingActionButton extends android.widget.ImageView {
-    ctor public FloatingActionButton(android.content.Context);
-    ctor public FloatingActionButton(android.content.Context, android.util.AttributeSet);
-    ctor public FloatingActionButton(android.content.Context, android.util.AttributeSet, int);
-    method public void setRippleColor(int);
-  }
-
-  public static class FloatingActionButton.Behavior extends android.support.design.widget.CoordinatorLayout.Behavior {
-    ctor public FloatingActionButton.Behavior();
-    method public boolean layoutDependsOn(android.support.design.widget.CoordinatorLayout, android.support.design.widget.FloatingActionButton, android.view.View);
-    method public boolean onDependentViewChanged(android.support.design.widget.CoordinatorLayout, android.support.design.widget.FloatingActionButton, android.view.View);
-  }
-
-  public class NavigationView extends android.widget.FrameLayout {
-    ctor public NavigationView(android.content.Context);
-    ctor public NavigationView(android.content.Context, android.util.AttributeSet);
-    ctor public NavigationView(android.content.Context, android.util.AttributeSet, int);
-    method public void addHeaderView(android.view.View);
-    method public android.graphics.drawable.Drawable getItemBackground();
-    method public android.content.res.ColorStateList getItemIconTintList();
-    method public android.content.res.ColorStateList getItemTextColor();
-    method public android.view.Menu getMenu();
-    method public android.view.View inflateHeaderView(int);
-    method public void inflateMenu(int);
-    method public void removeHeaderView(android.view.View);
-    method public void setItemBackground(android.graphics.drawable.Drawable);
-    method public void setItemBackgroundResource(int);
-    method public void setItemIconTintList(android.content.res.ColorStateList);
-    method public void setItemTextColor(android.content.res.ColorStateList);
-    method public void setNavigationItemSelectedListener(android.support.design.widget.NavigationView.OnNavigationItemSelectedListener);
-  }
-
-  public static abstract interface NavigationView.OnNavigationItemSelectedListener {
-    method public abstract boolean onNavigationItemSelected(android.view.MenuItem);
-  }
-
-  public static class NavigationView.SavedState extends android.view.View.BaseSavedState {
-    ctor public NavigationView.SavedState(android.os.Parcel);
-    ctor public NavigationView.SavedState(android.os.Parcelable);
-    field public static final android.os.Parcelable.Creator<android.support.design.widget.NavigationView.SavedState> CREATOR;
-    field public android.os.Bundle menuState;
-  }
-
-  public class Snackbar {
-    method public void dismiss();
-    method public int getDuration();
-    method public android.view.View getView();
-    method public static android.support.design.widget.Snackbar make(android.view.View, java.lang.CharSequence, int);
-    method public static android.support.design.widget.Snackbar make(android.view.View, int, int);
-    method public android.support.design.widget.Snackbar setAction(int, android.view.View.OnClickListener);
-    method public android.support.design.widget.Snackbar setAction(java.lang.CharSequence, android.view.View.OnClickListener);
-    method public android.support.design.widget.Snackbar setDuration(int);
-    method public android.support.design.widget.Snackbar setText(java.lang.CharSequence);
-    method public android.support.design.widget.Snackbar setText(int);
-    method public void show();
-    field public static final int LENGTH_LONG = 0; // 0x0
-    field public static final int LENGTH_SHORT = -1; // 0xffffffff
-  }
-
-  public class SwipeDismissBehavior extends android.support.design.widget.CoordinatorLayout.Behavior {
-    ctor public SwipeDismissBehavior();
-    method public int getDragState();
-    method public void setDragDismissDistance(float);
-    method public void setEndAlphaSwipeDistance(float);
-    method public void setListener(android.support.design.widget.SwipeDismissBehavior.OnDismissListener);
-    method public void setSensitivity(float);
-    method public void setStartAlphaSwipeDistance(float);
-    method public void setSwipeDirection(int);
-    field public static final int STATE_DRAGGING = 1; // 0x1
-    field public static final int STATE_IDLE = 0; // 0x0
-    field public static final int STATE_SETTLING = 2; // 0x2
-    field public static final int SWIPE_DIRECTION_ANY = 2; // 0x2
-    field public static final int SWIPE_DIRECTION_END_TO_START = 1; // 0x1
-    field public static final int SWIPE_DIRECTION_START_TO_END = 0; // 0x0
-  }
-
-  public static abstract interface SwipeDismissBehavior.OnDismissListener {
-    method public abstract void onDismiss(android.view.View);
-    method public abstract void onDragStateChanged(int);
-  }
-
-  public class TabLayout extends android.widget.HorizontalScrollView {
-    ctor public TabLayout(android.content.Context);
-    ctor public TabLayout(android.content.Context, android.util.AttributeSet);
-    ctor public TabLayout(android.content.Context, android.util.AttributeSet, int);
-    method public void addTab(android.support.design.widget.TabLayout.Tab);
-    method public void addTab(android.support.design.widget.TabLayout.Tab, int);
-    method public void addTab(android.support.design.widget.TabLayout.Tab, boolean);
-    method public void addTab(android.support.design.widget.TabLayout.Tab, int, boolean);
-    method public android.support.design.widget.TabLayout.Tab getTabAt(int);
-    method public int getTabCount();
-    method public int getTabGravity();
-    method public int getTabMode();
-    method public android.content.res.ColorStateList getTabTextColors();
-    method public android.support.design.widget.TabLayout.Tab newTab();
-    method public void removeAllTabs();
-    method public void removeTab(android.support.design.widget.TabLayout.Tab);
-    method public void removeTabAt(int);
-    method public void setOnTabSelectedListener(android.support.design.widget.TabLayout.OnTabSelectedListener);
-    method public void setScrollPosition(int, float, boolean);
-    method public void setTabGravity(int);
-    method public void setTabMode(int);
-    method public void setTabTextColors(android.content.res.ColorStateList);
-    method public void setTabTextColors(int, int);
-    method public void setTabsFromPagerAdapter(android.support.v4.view.PagerAdapter);
-    method public void setupWithViewPager(android.support.v4.view.ViewPager);
-    field public static final int GRAVITY_CENTER = 1; // 0x1
-    field public static final int GRAVITY_FILL = 0; // 0x0
-    field public static final int MODE_FIXED = 1; // 0x1
-    field public static final int MODE_SCROLLABLE = 0; // 0x0
-  }
-
-  public static abstract interface TabLayout.OnTabSelectedListener {
-    method public abstract void onTabReselected(android.support.design.widget.TabLayout.Tab);
-    method public abstract void onTabSelected(android.support.design.widget.TabLayout.Tab);
-    method public abstract void onTabUnselected(android.support.design.widget.TabLayout.Tab);
-  }
-
-  public static final class TabLayout.Tab {
-    method public java.lang.CharSequence getContentDescription();
-    method public android.graphics.drawable.Drawable getIcon();
-    method public int getPosition();
-    method public java.lang.Object getTag();
-    method public java.lang.CharSequence getText();
-    method public void select();
-    method public android.support.design.widget.TabLayout.Tab setContentDescription(int);
-    method public android.support.design.widget.TabLayout.Tab setContentDescription(java.lang.CharSequence);
-    method public android.support.design.widget.TabLayout.Tab setCustomView(android.view.View);
-    method public android.support.design.widget.TabLayout.Tab setCustomView(int);
-    method public android.support.design.widget.TabLayout.Tab setIcon(android.graphics.drawable.Drawable);
-    method public android.support.design.widget.TabLayout.Tab setIcon(int);
-    method public android.support.design.widget.TabLayout.Tab setTag(java.lang.Object);
-    method public android.support.design.widget.TabLayout.Tab setText(java.lang.CharSequence);
-    method public android.support.design.widget.TabLayout.Tab setText(int);
-    field public static final int INVALID_POSITION = -1; // 0xffffffff
-  }
-
-  public static class TabLayout.TabLayoutOnPageChangeListener implements android.support.v4.view.ViewPager.OnPageChangeListener {
-    ctor public TabLayout.TabLayoutOnPageChangeListener(android.support.design.widget.TabLayout);
-    method public void onPageScrollStateChanged(int);
-    method public void onPageScrolled(int, float, int);
-    method public void onPageSelected(int);
-  }
-
-  public static class TabLayout.ViewPagerOnTabSelectedListener implements android.support.design.widget.TabLayout.OnTabSelectedListener {
-    ctor public TabLayout.ViewPagerOnTabSelectedListener(android.support.v4.view.ViewPager);
-    method public void onTabReselected(android.support.design.widget.TabLayout.Tab);
-    method public void onTabSelected(android.support.design.widget.TabLayout.Tab);
-    method public void onTabUnselected(android.support.design.widget.TabLayout.Tab);
-  }
-
-  public class TextInputLayout extends android.widget.LinearLayout {
-    ctor public TextInputLayout(android.content.Context);
-    ctor public TextInputLayout(android.content.Context, android.util.AttributeSet);
-    method public android.widget.EditText getEditText();
-    method public void setError(java.lang.CharSequence);
-    method public void setErrorEnabled(boolean);
-    method public void setHint(java.lang.CharSequence);
-  }
-
-   class ViewOffsetBehavior extends android.support.design.widget.CoordinatorLayout.Behavior {
-    ctor public ViewOffsetBehavior();
-    ctor public ViewOffsetBehavior(android.content.Context, android.util.AttributeSet);
-    method public int getLeftAndRightOffset();
-    method public int getTopAndBottomOffset();
-    method public boolean setLeftAndRightOffset(int);
-    method public boolean setTopAndBottomOffset(int);
-  }
-
-}
-
diff --git a/design/api/22.2.1.txt b/design/api/22.2.1.txt
deleted file mode 100644
index 85e2841..0000000
--- a/design/api/22.2.1.txt
+++ /dev/null
@@ -1,349 +0,0 @@
-package android.support.design.widget {
-
-  public class AppBarLayout extends android.widget.LinearLayout {
-    ctor public AppBarLayout(android.content.Context);
-    ctor public AppBarLayout(android.content.Context, android.util.AttributeSet);
-    method public void addOnOffsetChangedListener(android.support.design.widget.AppBarLayout.OnOffsetChangedListener);
-    method public float getTargetElevation();
-    method public final int getTotalScrollRange();
-    method public void removeOnOffsetChangedListener(android.support.design.widget.AppBarLayout.OnOffsetChangedListener);
-    method public void setTargetElevation(float);
-  }
-
-  public static class AppBarLayout.Behavior extends android.support.design.widget.ViewOffsetBehavior {
-    ctor public AppBarLayout.Behavior();
-    ctor public AppBarLayout.Behavior(android.content.Context, android.util.AttributeSet);
-    method public boolean onLayoutChild(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, int);
-    method public boolean onNestedFling(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.view.View, float, float, boolean);
-    method public void onNestedPreScroll(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.view.View, int, int, int[]);
-    method public void onNestedScroll(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.view.View, int, int, int, int);
-    method public void onRestoreInstanceState(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.os.Parcelable);
-    method public android.os.Parcelable onSaveInstanceState(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout);
-    method public boolean onStartNestedScroll(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.view.View, android.view.View, int);
-    method public void onStopNestedScroll(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.view.View);
-  }
-
-  protected static class AppBarLayout.Behavior.SavedState extends android.view.View.BaseSavedState {
-    ctor public AppBarLayout.Behavior.SavedState(android.os.Parcel);
-    ctor public AppBarLayout.Behavior.SavedState(android.os.Parcelable);
-    field public static final android.os.Parcelable.Creator<android.support.design.widget.AppBarLayout.Behavior.SavedState> CREATOR;
-  }
-
-  public static class AppBarLayout.LayoutParams extends android.widget.LinearLayout.LayoutParams {
-    ctor public AppBarLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public AppBarLayout.LayoutParams(int, int);
-    ctor public AppBarLayout.LayoutParams(int, int, float);
-    ctor public AppBarLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public AppBarLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public AppBarLayout.LayoutParams(android.widget.LinearLayout.LayoutParams);
-    ctor public AppBarLayout.LayoutParams(android.support.design.widget.AppBarLayout.LayoutParams);
-    method public int getScrollFlags();
-    method public android.view.animation.Interpolator getScrollInterpolator();
-    method public void setScrollFlags(int);
-    method public void setScrollInterpolator(android.view.animation.Interpolator);
-    field public static final int SCROLL_FLAG_ENTER_ALWAYS = 4; // 0x4
-    field public static final int SCROLL_FLAG_ENTER_ALWAYS_COLLAPSED = 8; // 0x8
-    field public static final int SCROLL_FLAG_EXIT_UNTIL_COLLAPSED = 2; // 0x2
-    field public static final int SCROLL_FLAG_SCROLL = 1; // 0x1
-  }
-
-  public static abstract interface AppBarLayout.OnOffsetChangedListener {
-    method public abstract void onOffsetChanged(android.support.design.widget.AppBarLayout, int);
-  }
-
-  public static class AppBarLayout.ScrollingViewBehavior extends android.support.design.widget.ViewOffsetBehavior {
-    ctor public AppBarLayout.ScrollingViewBehavior();
-    ctor public AppBarLayout.ScrollingViewBehavior(android.content.Context, android.util.AttributeSet);
-    method public int getOverlayTop();
-    method public boolean layoutDependsOn(android.support.design.widget.CoordinatorLayout, android.view.View, android.view.View);
-    method public boolean onDependentViewChanged(android.support.design.widget.CoordinatorLayout, android.view.View, android.view.View);
-    method public boolean onMeasureChild(android.support.design.widget.CoordinatorLayout, android.view.View, int, int, int, int);
-    method public void setOverlayTop(int);
-  }
-
-  public class CollapsingToolbarLayout extends android.widget.FrameLayout {
-    ctor public CollapsingToolbarLayout(android.content.Context);
-    ctor public CollapsingToolbarLayout(android.content.Context, android.util.AttributeSet);
-    ctor public CollapsingToolbarLayout(android.content.Context, android.util.AttributeSet, int);
-    method public android.graphics.drawable.Drawable getContentScrim();
-    method public android.graphics.drawable.Drawable getStatusBarScrim();
-    method public void setCollapsedTitleTextAppearance(int);
-    method public void setCollapsedTitleTextColor(int);
-    method public void setContentScrim(android.graphics.drawable.Drawable);
-    method public void setContentScrimColor(int);
-    method public void setContentScrimResource(int);
-    method public void setExpandedTitleColor(int);
-    method public void setExpandedTitleTextAppearance(int);
-    method public void setStatusBarScrim(android.graphics.drawable.Drawable);
-    method public void setStatusBarScrimColor(int);
-    method public void setStatusBarScrimResource(int);
-    method public void setTitle(java.lang.CharSequence);
-  }
-
-  public static class CollapsingToolbarLayout.LayoutParams extends android.widget.FrameLayout.LayoutParams {
-    ctor public CollapsingToolbarLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public CollapsingToolbarLayout.LayoutParams(int, int);
-    ctor public CollapsingToolbarLayout.LayoutParams(int, int, int);
-    ctor public CollapsingToolbarLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public CollapsingToolbarLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public CollapsingToolbarLayout.LayoutParams(android.widget.FrameLayout.LayoutParams);
-    method public int getCollapseMode();
-    method public float getParallaxMultiplier();
-    method public void setCollapseMode(int);
-    method public void setParallaxMultiplier(float);
-    field public static final int COLLAPSE_MODE_OFF = 0; // 0x0
-    field public static final int COLLAPSE_MODE_PARALLAX = 2; // 0x2
-    field public static final int COLLAPSE_MODE_PIN = 1; // 0x1
-  }
-
-  public class CoordinatorLayout extends android.view.ViewGroup {
-    ctor public CoordinatorLayout(android.content.Context);
-    ctor public CoordinatorLayout(android.content.Context, android.util.AttributeSet);
-    ctor public CoordinatorLayout(android.content.Context, android.util.AttributeSet, int);
-    method public void dispatchDependentViewsChanged(android.view.View);
-    method public boolean doViewsOverlap(android.view.View, android.view.View);
-    method public java.util.List<android.view.View> getDependencies(android.view.View);
-    method public android.graphics.drawable.Drawable getStatusBarBackground();
-    method public boolean isPointInChildBounds(android.view.View, int, int);
-    method public void onAttachedToWindow();
-    method public void onDetachedFromWindow();
-    method public void onDraw(android.graphics.Canvas);
-    method protected void onLayout(boolean, int, int, int, int);
-    method public void onLayoutChild(android.view.View, int);
-    method public void onMeasureChild(android.view.View, int, int, int, int);
-    method public void setStatusBarBackground(android.graphics.drawable.Drawable);
-    method public void setStatusBarBackgroundColor(int);
-    method public void setStatusBarBackgroundResource(int);
-  }
-
-  public static abstract class CoordinatorLayout.Behavior {
-    ctor public CoordinatorLayout.Behavior();
-    ctor public CoordinatorLayout.Behavior(android.content.Context, android.util.AttributeSet);
-    method public boolean blocksInteractionBelow(android.support.design.widget.CoordinatorLayout, V);
-    method public final int getScrimColor(android.support.design.widget.CoordinatorLayout, V);
-    method public final float getScrimOpacity(android.support.design.widget.CoordinatorLayout, V);
-    method public static java.lang.Object getTag(android.view.View);
-    method public boolean isDirty(android.support.design.widget.CoordinatorLayout, V);
-    method public boolean layoutDependsOn(android.support.design.widget.CoordinatorLayout, V, android.view.View);
-    method public android.support.v4.view.WindowInsetsCompat onApplyWindowInsets(android.support.design.widget.CoordinatorLayout, V, android.support.v4.view.WindowInsetsCompat);
-    method public boolean onDependentViewChanged(android.support.design.widget.CoordinatorLayout, V, android.view.View);
-    method public void onDependentViewRemoved(android.support.design.widget.CoordinatorLayout, V, android.view.View);
-    method public boolean onInterceptTouchEvent(android.support.design.widget.CoordinatorLayout, V, android.view.MotionEvent);
-    method public boolean onLayoutChild(android.support.design.widget.CoordinatorLayout, V, int);
-    method public boolean onMeasureChild(android.support.design.widget.CoordinatorLayout, V, int, int, int, int);
-    method public boolean onNestedFling(android.support.design.widget.CoordinatorLayout, V, android.view.View, float, float, boolean);
-    method public boolean onNestedPreFling(android.support.design.widget.CoordinatorLayout, V, android.view.View, float, float);
-    method public void onNestedPreScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, int, int, int[]);
-    method public void onNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, int, int, int, int);
-    method public void onNestedScrollAccepted(android.support.design.widget.CoordinatorLayout, V, android.view.View, android.view.View, int);
-    method public void onRestoreInstanceState(android.support.design.widget.CoordinatorLayout, V, android.os.Parcelable);
-    method public android.os.Parcelable onSaveInstanceState(android.support.design.widget.CoordinatorLayout, V);
-    method public boolean onStartNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, android.view.View, int);
-    method public void onStopNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View);
-    method public boolean onTouchEvent(android.support.design.widget.CoordinatorLayout, V, android.view.MotionEvent);
-    method public static void setTag(android.view.View, java.lang.Object);
-  }
-
-  public static abstract class CoordinatorLayout.DefaultBehavior implements java.lang.annotation.Annotation {
-  }
-
-  public static class CoordinatorLayout.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
-    ctor public CoordinatorLayout.LayoutParams(int, int);
-    ctor public CoordinatorLayout.LayoutParams(android.support.design.widget.CoordinatorLayout.LayoutParams);
-    ctor public CoordinatorLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public CoordinatorLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
-    method public int getAnchorId();
-    method public android.support.design.widget.CoordinatorLayout.Behavior getBehavior();
-    method public void setAnchorId(int);
-    method public void setBehavior(android.support.design.widget.CoordinatorLayout.Behavior);
-    field public int anchorGravity;
-    field public int gravity;
-    field public int keyline;
-  }
-
-  protected static class CoordinatorLayout.SavedState extends android.view.View.BaseSavedState {
-    ctor public CoordinatorLayout.SavedState(android.os.Parcel);
-    ctor public CoordinatorLayout.SavedState(android.os.Parcelable);
-    field public static final android.os.Parcelable.Creator<android.support.design.widget.CoordinatorLayout.SavedState> CREATOR;
-  }
-
-  public class FloatingActionButton extends android.widget.ImageView {
-    ctor public FloatingActionButton(android.content.Context);
-    ctor public FloatingActionButton(android.content.Context, android.util.AttributeSet);
-    ctor public FloatingActionButton(android.content.Context, android.util.AttributeSet, int);
-    method public void hide();
-    method public void setRippleColor(int);
-    method public void show();
-  }
-
-  public static class FloatingActionButton.Behavior extends android.support.design.widget.CoordinatorLayout.Behavior {
-    ctor public FloatingActionButton.Behavior();
-    method public boolean layoutDependsOn(android.support.design.widget.CoordinatorLayout, android.support.design.widget.FloatingActionButton, android.view.View);
-    method public boolean onDependentViewChanged(android.support.design.widget.CoordinatorLayout, android.support.design.widget.FloatingActionButton, android.view.View);
-    method public void onDependentViewRemoved(android.support.design.widget.CoordinatorLayout, android.support.design.widget.FloatingActionButton, android.view.View);
-    method public boolean onLayoutChild(android.support.design.widget.CoordinatorLayout, android.support.design.widget.FloatingActionButton, int);
-  }
-
-  public class NavigationView extends android.widget.FrameLayout {
-    ctor public NavigationView(android.content.Context);
-    ctor public NavigationView(android.content.Context, android.util.AttributeSet);
-    ctor public NavigationView(android.content.Context, android.util.AttributeSet, int);
-    method public void addHeaderView(android.view.View);
-    method public android.graphics.drawable.Drawable getItemBackground();
-    method public android.content.res.ColorStateList getItemIconTintList();
-    method public android.content.res.ColorStateList getItemTextColor();
-    method public android.view.Menu getMenu();
-    method public android.view.View inflateHeaderView(int);
-    method public void inflateMenu(int);
-    method public void removeHeaderView(android.view.View);
-    method public void setItemBackground(android.graphics.drawable.Drawable);
-    method public void setItemBackgroundResource(int);
-    method public void setItemIconTintList(android.content.res.ColorStateList);
-    method public void setItemTextColor(android.content.res.ColorStateList);
-    method public void setNavigationItemSelectedListener(android.support.design.widget.NavigationView.OnNavigationItemSelectedListener);
-  }
-
-  public static abstract interface NavigationView.OnNavigationItemSelectedListener {
-    method public abstract boolean onNavigationItemSelected(android.view.MenuItem);
-  }
-
-  public static class NavigationView.SavedState extends android.view.View.BaseSavedState {
-    ctor public NavigationView.SavedState(android.os.Parcel);
-    ctor public NavigationView.SavedState(android.os.Parcelable);
-    field public static final android.os.Parcelable.Creator<android.support.design.widget.NavigationView.SavedState> CREATOR;
-    field public android.os.Bundle menuState;
-  }
-
-  public class Snackbar {
-    method public void dismiss();
-    method public int getDuration();
-    method public android.view.View getView();
-    method public static android.support.design.widget.Snackbar make(android.view.View, java.lang.CharSequence, int);
-    method public static android.support.design.widget.Snackbar make(android.view.View, int, int);
-    method public android.support.design.widget.Snackbar setAction(int, android.view.View.OnClickListener);
-    method public android.support.design.widget.Snackbar setAction(java.lang.CharSequence, android.view.View.OnClickListener);
-    method public android.support.design.widget.Snackbar setActionTextColor(android.content.res.ColorStateList);
-    method public android.support.design.widget.Snackbar setActionTextColor(int);
-    method public android.support.design.widget.Snackbar setDuration(int);
-    method public android.support.design.widget.Snackbar setText(java.lang.CharSequence);
-    method public android.support.design.widget.Snackbar setText(int);
-    method public void show();
-    field public static final int LENGTH_INDEFINITE = -2; // 0xfffffffe
-    field public static final int LENGTH_LONG = 0; // 0x0
-    field public static final int LENGTH_SHORT = -1; // 0xffffffff
-  }
-
-  public class SwipeDismissBehavior extends android.support.design.widget.CoordinatorLayout.Behavior {
-    ctor public SwipeDismissBehavior();
-    method public int getDragState();
-    method public void setDragDismissDistance(float);
-    method public void setEndAlphaSwipeDistance(float);
-    method public void setListener(android.support.design.widget.SwipeDismissBehavior.OnDismissListener);
-    method public void setSensitivity(float);
-    method public void setStartAlphaSwipeDistance(float);
-    method public void setSwipeDirection(int);
-    field public static final int STATE_DRAGGING = 1; // 0x1
-    field public static final int STATE_IDLE = 0; // 0x0
-    field public static final int STATE_SETTLING = 2; // 0x2
-    field public static final int SWIPE_DIRECTION_ANY = 2; // 0x2
-    field public static final int SWIPE_DIRECTION_END_TO_START = 1; // 0x1
-    field public static final int SWIPE_DIRECTION_START_TO_END = 0; // 0x0
-  }
-
-  public static abstract interface SwipeDismissBehavior.OnDismissListener {
-    method public abstract void onDismiss(android.view.View);
-    method public abstract void onDragStateChanged(int);
-  }
-
-  public class TabLayout extends android.widget.HorizontalScrollView {
-    ctor public TabLayout(android.content.Context);
-    ctor public TabLayout(android.content.Context, android.util.AttributeSet);
-    ctor public TabLayout(android.content.Context, android.util.AttributeSet, int);
-    method public void addTab(android.support.design.widget.TabLayout.Tab);
-    method public void addTab(android.support.design.widget.TabLayout.Tab, int);
-    method public void addTab(android.support.design.widget.TabLayout.Tab, boolean);
-    method public void addTab(android.support.design.widget.TabLayout.Tab, int, boolean);
-    method public int getSelectedTabPosition();
-    method public android.support.design.widget.TabLayout.Tab getTabAt(int);
-    method public int getTabCount();
-    method public int getTabGravity();
-    method public int getTabMode();
-    method public android.content.res.ColorStateList getTabTextColors();
-    method public android.support.design.widget.TabLayout.Tab newTab();
-    method public void removeAllTabs();
-    method public void removeTab(android.support.design.widget.TabLayout.Tab);
-    method public void removeTabAt(int);
-    method public void setOnTabSelectedListener(android.support.design.widget.TabLayout.OnTabSelectedListener);
-    method public void setScrollPosition(int, float, boolean);
-    method public void setTabGravity(int);
-    method public void setTabMode(int);
-    method public void setTabTextColors(android.content.res.ColorStateList);
-    method public void setTabTextColors(int, int);
-    method public void setTabsFromPagerAdapter(android.support.v4.view.PagerAdapter);
-    method public void setupWithViewPager(android.support.v4.view.ViewPager);
-    field public static final int GRAVITY_CENTER = 1; // 0x1
-    field public static final int GRAVITY_FILL = 0; // 0x0
-    field public static final int MODE_FIXED = 1; // 0x1
-    field public static final int MODE_SCROLLABLE = 0; // 0x0
-  }
-
-  public static abstract interface TabLayout.OnTabSelectedListener {
-    method public abstract void onTabReselected(android.support.design.widget.TabLayout.Tab);
-    method public abstract void onTabSelected(android.support.design.widget.TabLayout.Tab);
-    method public abstract void onTabUnselected(android.support.design.widget.TabLayout.Tab);
-  }
-
-  public static final class TabLayout.Tab {
-    method public java.lang.CharSequence getContentDescription();
-    method public android.graphics.drawable.Drawable getIcon();
-    method public int getPosition();
-    method public java.lang.Object getTag();
-    method public java.lang.CharSequence getText();
-    method public boolean isSelected();
-    method public void select();
-    method public android.support.design.widget.TabLayout.Tab setContentDescription(int);
-    method public android.support.design.widget.TabLayout.Tab setContentDescription(java.lang.CharSequence);
-    method public android.support.design.widget.TabLayout.Tab setCustomView(android.view.View);
-    method public android.support.design.widget.TabLayout.Tab setCustomView(int);
-    method public android.support.design.widget.TabLayout.Tab setIcon(android.graphics.drawable.Drawable);
-    method public android.support.design.widget.TabLayout.Tab setIcon(int);
-    method public android.support.design.widget.TabLayout.Tab setTag(java.lang.Object);
-    method public android.support.design.widget.TabLayout.Tab setText(java.lang.CharSequence);
-    method public android.support.design.widget.TabLayout.Tab setText(int);
-    field public static final int INVALID_POSITION = -1; // 0xffffffff
-  }
-
-  public static class TabLayout.TabLayoutOnPageChangeListener implements android.support.v4.view.ViewPager.OnPageChangeListener {
-    ctor public TabLayout.TabLayoutOnPageChangeListener(android.support.design.widget.TabLayout);
-    method public void onPageScrollStateChanged(int);
-    method public void onPageScrolled(int, float, int);
-    method public void onPageSelected(int);
-  }
-
-  public static class TabLayout.ViewPagerOnTabSelectedListener implements android.support.design.widget.TabLayout.OnTabSelectedListener {
-    ctor public TabLayout.ViewPagerOnTabSelectedListener(android.support.v4.view.ViewPager);
-    method public void onTabReselected(android.support.design.widget.TabLayout.Tab);
-    method public void onTabSelected(android.support.design.widget.TabLayout.Tab);
-    method public void onTabUnselected(android.support.design.widget.TabLayout.Tab);
-  }
-
-  public class TextInputLayout extends android.widget.LinearLayout {
-    ctor public TextInputLayout(android.content.Context);
-    ctor public TextInputLayout(android.content.Context, android.util.AttributeSet);
-    method public android.widget.EditText getEditText();
-    method public void setError(java.lang.CharSequence);
-    method public void setErrorEnabled(boolean);
-    method public void setHint(java.lang.CharSequence);
-  }
-
-   class ViewOffsetBehavior extends android.support.design.widget.CoordinatorLayout.Behavior {
-    ctor public ViewOffsetBehavior();
-    ctor public ViewOffsetBehavior(android.content.Context, android.util.AttributeSet);
-    method public int getLeftAndRightOffset();
-    method public int getTopAndBottomOffset();
-    method public boolean setLeftAndRightOffset(int);
-    method public boolean setTopAndBottomOffset(int);
-  }
-
-}
-
diff --git a/design/api/23.0.0.txt b/design/api/23.0.0.txt
deleted file mode 100644
index de4e09b..0000000
--- a/design/api/23.0.0.txt
+++ /dev/null
@@ -1,386 +0,0 @@
-package android.support.design.widget {
-
-  public class AppBarLayout extends android.widget.LinearLayout {
-    ctor public AppBarLayout(android.content.Context);
-    ctor public AppBarLayout(android.content.Context, android.util.AttributeSet);
-    method public void addOnOffsetChangedListener(android.support.design.widget.AppBarLayout.OnOffsetChangedListener);
-    method public float getTargetElevation();
-    method public final int getTotalScrollRange();
-    method public void removeOnOffsetChangedListener(android.support.design.widget.AppBarLayout.OnOffsetChangedListener);
-    method public void setExpanded(boolean);
-    method public void setExpanded(boolean, boolean);
-    method public void setTargetElevation(float);
-  }
-
-  public static class AppBarLayout.Behavior extends android.support.design.widget.ViewOffsetBehavior {
-    ctor public AppBarLayout.Behavior();
-    ctor public AppBarLayout.Behavior(android.content.Context, android.util.AttributeSet);
-    method public boolean onInterceptTouchEvent(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.view.MotionEvent);
-    method public boolean onLayoutChild(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, int);
-    method public boolean onNestedFling(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.view.View, float, float, boolean);
-    method public void onNestedPreScroll(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.view.View, int, int, int[]);
-    method public void onNestedScroll(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.view.View, int, int, int, int);
-    method public void onRestoreInstanceState(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.os.Parcelable);
-    method public android.os.Parcelable onSaveInstanceState(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout);
-    method public boolean onStartNestedScroll(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.view.View, android.view.View, int);
-    method public void onStopNestedScroll(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.view.View);
-    method public boolean onTouchEvent(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.view.MotionEvent);
-  }
-
-  protected static class AppBarLayout.Behavior.SavedState extends android.view.View.BaseSavedState {
-    ctor public AppBarLayout.Behavior.SavedState(android.os.Parcel);
-    ctor public AppBarLayout.Behavior.SavedState(android.os.Parcelable);
-    field public static final android.os.Parcelable.Creator<android.support.design.widget.AppBarLayout.Behavior.SavedState> CREATOR;
-  }
-
-  public static class AppBarLayout.LayoutParams extends android.widget.LinearLayout.LayoutParams {
-    ctor public AppBarLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public AppBarLayout.LayoutParams(int, int);
-    ctor public AppBarLayout.LayoutParams(int, int, float);
-    ctor public AppBarLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public AppBarLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public AppBarLayout.LayoutParams(android.widget.LinearLayout.LayoutParams);
-    ctor public AppBarLayout.LayoutParams(android.support.design.widget.AppBarLayout.LayoutParams);
-    method public int getScrollFlags();
-    method public android.view.animation.Interpolator getScrollInterpolator();
-    method public void setScrollFlags(int);
-    method public void setScrollInterpolator(android.view.animation.Interpolator);
-    field public static final int SCROLL_FLAG_ENTER_ALWAYS = 4; // 0x4
-    field public static final int SCROLL_FLAG_ENTER_ALWAYS_COLLAPSED = 8; // 0x8
-    field public static final int SCROLL_FLAG_EXIT_UNTIL_COLLAPSED = 2; // 0x2
-    field public static final int SCROLL_FLAG_SCROLL = 1; // 0x1
-  }
-
-  public static abstract interface AppBarLayout.OnOffsetChangedListener {
-    method public abstract void onOffsetChanged(android.support.design.widget.AppBarLayout, int);
-  }
-
-  public static class AppBarLayout.ScrollingViewBehavior extends android.support.design.widget.ViewOffsetBehavior {
-    ctor public AppBarLayout.ScrollingViewBehavior();
-    ctor public AppBarLayout.ScrollingViewBehavior(android.content.Context, android.util.AttributeSet);
-    method public int getOverlayTop();
-    method public boolean layoutDependsOn(android.support.design.widget.CoordinatorLayout, android.view.View, android.view.View);
-    method public boolean onDependentViewChanged(android.support.design.widget.CoordinatorLayout, android.view.View, android.view.View);
-    method public boolean onMeasureChild(android.support.design.widget.CoordinatorLayout, android.view.View, int, int, int, int);
-    method public void setOverlayTop(int);
-  }
-
-  public class CollapsingToolbarLayout extends android.widget.FrameLayout {
-    ctor public CollapsingToolbarLayout(android.content.Context);
-    ctor public CollapsingToolbarLayout(android.content.Context, android.util.AttributeSet);
-    ctor public CollapsingToolbarLayout(android.content.Context, android.util.AttributeSet, int);
-    method public int getCollapsedTitleGravity();
-    method public android.graphics.drawable.Drawable getContentScrim();
-    method public int getExpandedTitleGravity();
-    method public android.graphics.drawable.Drawable getStatusBarScrim();
-    method public java.lang.CharSequence getTitle();
-    method public boolean isTitleEnabled();
-    method public void setCollapsedTitleGravity(int);
-    method public void setCollapsedTitleTextAppearance(int);
-    method public void setCollapsedTitleTextColor(int);
-    method public void setContentScrim(android.graphics.drawable.Drawable);
-    method public void setContentScrimColor(int);
-    method public void setContentScrimResource(int);
-    method public void setExpandedTitleColor(int);
-    method public void setExpandedTitleGravity(int);
-    method public void setExpandedTitleTextAppearance(int);
-    method public void setStatusBarScrim(android.graphics.drawable.Drawable);
-    method public void setStatusBarScrimColor(int);
-    method public void setStatusBarScrimResource(int);
-    method public void setTitle(java.lang.CharSequence);
-    method public void setTitleEnabled(boolean);
-  }
-
-  public static class CollapsingToolbarLayout.LayoutParams extends android.widget.FrameLayout.LayoutParams {
-    ctor public CollapsingToolbarLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public CollapsingToolbarLayout.LayoutParams(int, int);
-    ctor public CollapsingToolbarLayout.LayoutParams(int, int, int);
-    ctor public CollapsingToolbarLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public CollapsingToolbarLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public CollapsingToolbarLayout.LayoutParams(android.widget.FrameLayout.LayoutParams);
-    method public int getCollapseMode();
-    method public float getParallaxMultiplier();
-    method public void setCollapseMode(int);
-    method public void setParallaxMultiplier(float);
-    field public static final int COLLAPSE_MODE_OFF = 0; // 0x0
-    field public static final int COLLAPSE_MODE_PARALLAX = 2; // 0x2
-    field public static final int COLLAPSE_MODE_PIN = 1; // 0x1
-  }
-
-  public class CoordinatorLayout extends android.view.ViewGroup {
-    ctor public CoordinatorLayout(android.content.Context);
-    ctor public CoordinatorLayout(android.content.Context, android.util.AttributeSet);
-    ctor public CoordinatorLayout(android.content.Context, android.util.AttributeSet, int);
-    method public void dispatchDependentViewsChanged(android.view.View);
-    method public boolean doViewsOverlap(android.view.View, android.view.View);
-    method public java.util.List<android.view.View> getDependencies(android.view.View);
-    method public android.graphics.drawable.Drawable getStatusBarBackground();
-    method public boolean isPointInChildBounds(android.view.View, int, int);
-    method public void onAttachedToWindow();
-    method public void onDetachedFromWindow();
-    method public void onDraw(android.graphics.Canvas);
-    method protected void onLayout(boolean, int, int, int, int);
-    method public void onLayoutChild(android.view.View, int);
-    method public void onMeasureChild(android.view.View, int, int, int, int);
-    method public void setStatusBarBackground(android.graphics.drawable.Drawable);
-    method public void setStatusBarBackgroundColor(int);
-    method public void setStatusBarBackgroundResource(int);
-  }
-
-  public static abstract class CoordinatorLayout.Behavior {
-    ctor public CoordinatorLayout.Behavior();
-    ctor public CoordinatorLayout.Behavior(android.content.Context, android.util.AttributeSet);
-    method public boolean blocksInteractionBelow(android.support.design.widget.CoordinatorLayout, V);
-    method public final int getScrimColor(android.support.design.widget.CoordinatorLayout, V);
-    method public final float getScrimOpacity(android.support.design.widget.CoordinatorLayout, V);
-    method public static java.lang.Object getTag(android.view.View);
-    method public boolean isDirty(android.support.design.widget.CoordinatorLayout, V);
-    method public boolean layoutDependsOn(android.support.design.widget.CoordinatorLayout, V, android.view.View);
-    method public android.support.v4.view.WindowInsetsCompat onApplyWindowInsets(android.support.design.widget.CoordinatorLayout, V, android.support.v4.view.WindowInsetsCompat);
-    method public boolean onDependentViewChanged(android.support.design.widget.CoordinatorLayout, V, android.view.View);
-    method public void onDependentViewRemoved(android.support.design.widget.CoordinatorLayout, V, android.view.View);
-    method public boolean onInterceptTouchEvent(android.support.design.widget.CoordinatorLayout, V, android.view.MotionEvent);
-    method public boolean onLayoutChild(android.support.design.widget.CoordinatorLayout, V, int);
-    method public boolean onMeasureChild(android.support.design.widget.CoordinatorLayout, V, int, int, int, int);
-    method public boolean onNestedFling(android.support.design.widget.CoordinatorLayout, V, android.view.View, float, float, boolean);
-    method public boolean onNestedPreFling(android.support.design.widget.CoordinatorLayout, V, android.view.View, float, float);
-    method public void onNestedPreScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, int, int, int[]);
-    method public void onNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, int, int, int, int);
-    method public void onNestedScrollAccepted(android.support.design.widget.CoordinatorLayout, V, android.view.View, android.view.View, int);
-    method public void onRestoreInstanceState(android.support.design.widget.CoordinatorLayout, V, android.os.Parcelable);
-    method public android.os.Parcelable onSaveInstanceState(android.support.design.widget.CoordinatorLayout, V);
-    method public boolean onStartNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, android.view.View, int);
-    method public void onStopNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View);
-    method public boolean onTouchEvent(android.support.design.widget.CoordinatorLayout, V, android.view.MotionEvent);
-    method public static void setTag(android.view.View, java.lang.Object);
-  }
-
-  public static abstract class CoordinatorLayout.DefaultBehavior implements java.lang.annotation.Annotation {
-  }
-
-  public static class CoordinatorLayout.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
-    ctor public CoordinatorLayout.LayoutParams(int, int);
-    ctor public CoordinatorLayout.LayoutParams(android.support.design.widget.CoordinatorLayout.LayoutParams);
-    ctor public CoordinatorLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public CoordinatorLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
-    method public int getAnchorId();
-    method public android.support.design.widget.CoordinatorLayout.Behavior getBehavior();
-    method public void setAnchorId(int);
-    method public void setBehavior(android.support.design.widget.CoordinatorLayout.Behavior);
-    field public int anchorGravity;
-    field public int gravity;
-    field public int keyline;
-  }
-
-  protected static class CoordinatorLayout.SavedState extends android.view.View.BaseSavedState {
-    ctor public CoordinatorLayout.SavedState(android.os.Parcel);
-    ctor public CoordinatorLayout.SavedState(android.os.Parcelable);
-    field public static final android.os.Parcelable.Creator<android.support.design.widget.CoordinatorLayout.SavedState> CREATOR;
-  }
-
-  public class FloatingActionButton extends android.widget.ImageView {
-    ctor public FloatingActionButton(android.content.Context);
-    ctor public FloatingActionButton(android.content.Context, android.util.AttributeSet);
-    ctor public FloatingActionButton(android.content.Context, android.util.AttributeSet, int);
-    method public void hide();
-    method public void setRippleColor(int);
-    method public void show();
-  }
-
-  public static class FloatingActionButton.Behavior extends android.support.design.widget.CoordinatorLayout.Behavior {
-    ctor public FloatingActionButton.Behavior();
-    method public boolean layoutDependsOn(android.support.design.widget.CoordinatorLayout, android.support.design.widget.FloatingActionButton, android.view.View);
-    method public boolean onDependentViewChanged(android.support.design.widget.CoordinatorLayout, android.support.design.widget.FloatingActionButton, android.view.View);
-    method public void onDependentViewRemoved(android.support.design.widget.CoordinatorLayout, android.support.design.widget.FloatingActionButton, android.view.View);
-    method public boolean onLayoutChild(android.support.design.widget.CoordinatorLayout, android.support.design.widget.FloatingActionButton, int);
-  }
-
-  public class NavigationView extends android.widget.FrameLayout {
-    ctor public NavigationView(android.content.Context);
-    ctor public NavigationView(android.content.Context, android.util.AttributeSet);
-    ctor public NavigationView(android.content.Context, android.util.AttributeSet, int);
-    method public void addHeaderView(android.view.View);
-    method public android.graphics.drawable.Drawable getItemBackground();
-    method public android.content.res.ColorStateList getItemIconTintList();
-    method public android.content.res.ColorStateList getItemTextColor();
-    method public android.view.Menu getMenu();
-    method public android.view.View inflateHeaderView(int);
-    method public void inflateMenu(int);
-    method public void removeHeaderView(android.view.View);
-    method public void setCheckedItem(int);
-    method public void setItemBackground(android.graphics.drawable.Drawable);
-    method public void setItemBackgroundResource(int);
-    method public void setItemIconTintList(android.content.res.ColorStateList);
-    method public void setItemTextAppearance(int);
-    method public void setItemTextColor(android.content.res.ColorStateList);
-    method public void setNavigationItemSelectedListener(android.support.design.widget.NavigationView.OnNavigationItemSelectedListener);
-  }
-
-  public static abstract interface NavigationView.OnNavigationItemSelectedListener {
-    method public abstract boolean onNavigationItemSelected(android.view.MenuItem);
-  }
-
-  public static class NavigationView.SavedState extends android.view.View.BaseSavedState {
-    ctor public NavigationView.SavedState(android.os.Parcel);
-    ctor public NavigationView.SavedState(android.os.Parcelable);
-    field public static final android.os.Parcelable.Creator<android.support.design.widget.NavigationView.SavedState> CREATOR;
-    field public android.os.Bundle menuState;
-  }
-
-  public final class Snackbar {
-    method public void dismiss();
-    method public int getDuration();
-    method public android.view.View getView();
-    method public boolean isShown();
-    method public static android.support.design.widget.Snackbar make(android.view.View, java.lang.CharSequence, int);
-    method public static android.support.design.widget.Snackbar make(android.view.View, int, int);
-    method public android.support.design.widget.Snackbar setAction(int, android.view.View.OnClickListener);
-    method public android.support.design.widget.Snackbar setAction(java.lang.CharSequence, android.view.View.OnClickListener);
-    method public android.support.design.widget.Snackbar setActionTextColor(android.content.res.ColorStateList);
-    method public android.support.design.widget.Snackbar setActionTextColor(int);
-    method public android.support.design.widget.Snackbar setCallback(android.support.design.widget.Snackbar.Callback);
-    method public android.support.design.widget.Snackbar setDuration(int);
-    method public android.support.design.widget.Snackbar setText(java.lang.CharSequence);
-    method public android.support.design.widget.Snackbar setText(int);
-    method public void show();
-    field public static final int LENGTH_INDEFINITE = -2; // 0xfffffffe
-    field public static final int LENGTH_LONG = 0; // 0x0
-    field public static final int LENGTH_SHORT = -1; // 0xffffffff
-  }
-
-  public static abstract class Snackbar.Callback {
-    ctor public Snackbar.Callback();
-    method public void onDismissed(android.support.design.widget.Snackbar, int);
-    method public void onShown(android.support.design.widget.Snackbar);
-    field public static final int DISMISS_EVENT_ACTION = 1; // 0x1
-    field public static final int DISMISS_EVENT_CONSECUTIVE = 4; // 0x4
-    field public static final int DISMISS_EVENT_MANUAL = 3; // 0x3
-    field public static final int DISMISS_EVENT_SWIPE = 0; // 0x0
-    field public static final int DISMISS_EVENT_TIMEOUT = 2; // 0x2
-  }
-
-  public class SwipeDismissBehavior extends android.support.design.widget.CoordinatorLayout.Behavior {
-    ctor public SwipeDismissBehavior();
-    method public int getDragState();
-    method public void setDragDismissDistance(float);
-    method public void setEndAlphaSwipeDistance(float);
-    method public void setListener(android.support.design.widget.SwipeDismissBehavior.OnDismissListener);
-    method public void setSensitivity(float);
-    method public void setStartAlphaSwipeDistance(float);
-    method public void setSwipeDirection(int);
-    field public static final int STATE_DRAGGING = 1; // 0x1
-    field public static final int STATE_IDLE = 0; // 0x0
-    field public static final int STATE_SETTLING = 2; // 0x2
-    field public static final int SWIPE_DIRECTION_ANY = 2; // 0x2
-    field public static final int SWIPE_DIRECTION_END_TO_START = 1; // 0x1
-    field public static final int SWIPE_DIRECTION_START_TO_END = 0; // 0x0
-  }
-
-  public static abstract interface SwipeDismissBehavior.OnDismissListener {
-    method public abstract void onDismiss(android.view.View);
-    method public abstract void onDragStateChanged(int);
-  }
-
-  public class TabLayout extends android.widget.HorizontalScrollView {
-    ctor public TabLayout(android.content.Context);
-    ctor public TabLayout(android.content.Context, android.util.AttributeSet);
-    ctor public TabLayout(android.content.Context, android.util.AttributeSet, int);
-    method public void addTab(android.support.design.widget.TabLayout.Tab);
-    method public void addTab(android.support.design.widget.TabLayout.Tab, int);
-    method public void addTab(android.support.design.widget.TabLayout.Tab, boolean);
-    method public void addTab(android.support.design.widget.TabLayout.Tab, int, boolean);
-    method public int getSelectedTabPosition();
-    method public android.support.design.widget.TabLayout.Tab getTabAt(int);
-    method public int getTabCount();
-    method public int getTabGravity();
-    method public int getTabMode();
-    method public android.content.res.ColorStateList getTabTextColors();
-    method public android.support.design.widget.TabLayout.Tab newTab();
-    method public void removeAllTabs();
-    method public void removeTab(android.support.design.widget.TabLayout.Tab);
-    method public void removeTabAt(int);
-    method public void setOnTabSelectedListener(android.support.design.widget.TabLayout.OnTabSelectedListener);
-    method public void setScrollPosition(int, float, boolean);
-    method public void setSelectedTabIndicatorColor(int);
-    method public void setSelectedTabIndicatorHeight(int);
-    method public void setTabGravity(int);
-    method public void setTabMode(int);
-    method public void setTabTextColors(android.content.res.ColorStateList);
-    method public void setTabTextColors(int, int);
-    method public void setTabsFromPagerAdapter(android.support.v4.view.PagerAdapter);
-    method public void setupWithViewPager(android.support.v4.view.ViewPager);
-    field public static final int GRAVITY_CENTER = 1; // 0x1
-    field public static final int GRAVITY_FILL = 0; // 0x0
-    field public static final int MODE_FIXED = 1; // 0x1
-    field public static final int MODE_SCROLLABLE = 0; // 0x0
-  }
-
-  public static abstract interface TabLayout.OnTabSelectedListener {
-    method public abstract void onTabReselected(android.support.design.widget.TabLayout.Tab);
-    method public abstract void onTabSelected(android.support.design.widget.TabLayout.Tab);
-    method public abstract void onTabUnselected(android.support.design.widget.TabLayout.Tab);
-  }
-
-  public static final class TabLayout.Tab {
-    method public java.lang.CharSequence getContentDescription();
-    method public android.view.View getCustomView();
-    method public android.graphics.drawable.Drawable getIcon();
-    method public int getPosition();
-    method public java.lang.Object getTag();
-    method public java.lang.CharSequence getText();
-    method public boolean isSelected();
-    method public void select();
-    method public android.support.design.widget.TabLayout.Tab setContentDescription(int);
-    method public android.support.design.widget.TabLayout.Tab setContentDescription(java.lang.CharSequence);
-    method public android.support.design.widget.TabLayout.Tab setCustomView(android.view.View);
-    method public android.support.design.widget.TabLayout.Tab setCustomView(int);
-    method public android.support.design.widget.TabLayout.Tab setIcon(android.graphics.drawable.Drawable);
-    method public android.support.design.widget.TabLayout.Tab setIcon(int);
-    method public android.support.design.widget.TabLayout.Tab setTag(java.lang.Object);
-    method public android.support.design.widget.TabLayout.Tab setText(java.lang.CharSequence);
-    method public android.support.design.widget.TabLayout.Tab setText(int);
-    field public static final int INVALID_POSITION = -1; // 0xffffffff
-  }
-
-  public static class TabLayout.TabLayoutOnPageChangeListener implements android.support.v4.view.ViewPager.OnPageChangeListener {
-    ctor public TabLayout.TabLayoutOnPageChangeListener(android.support.design.widget.TabLayout);
-    method public void onPageScrollStateChanged(int);
-    method public void onPageScrolled(int, float, int);
-    method public void onPageSelected(int);
-  }
-
-  public static class TabLayout.ViewPagerOnTabSelectedListener implements android.support.design.widget.TabLayout.OnTabSelectedListener {
-    ctor public TabLayout.ViewPagerOnTabSelectedListener(android.support.v4.view.ViewPager);
-    method public void onTabReselected(android.support.design.widget.TabLayout.Tab);
-    method public void onTabSelected(android.support.design.widget.TabLayout.Tab);
-    method public void onTabUnselected(android.support.design.widget.TabLayout.Tab);
-  }
-
-  public class TextInputLayout extends android.widget.LinearLayout {
-    ctor public TextInputLayout(android.content.Context);
-    ctor public TextInputLayout(android.content.Context, android.util.AttributeSet);
-    ctor public TextInputLayout(android.content.Context, android.util.AttributeSet, int);
-    method public android.widget.EditText getEditText();
-    method public java.lang.CharSequence getError();
-    method public java.lang.CharSequence getHint();
-    method public boolean isErrorEnabled();
-    method public boolean isHintAnimationEnabled();
-    method public void setError(java.lang.CharSequence);
-    method public void setErrorEnabled(boolean);
-    method public void setHint(java.lang.CharSequence);
-    method public void setHintAnimationEnabled(boolean);
-    method public void setHintTextAppearance(int);
-    method public void setTypeface(android.graphics.Typeface);
-  }
-
-   class ViewOffsetBehavior extends android.support.design.widget.CoordinatorLayout.Behavior {
-    ctor public ViewOffsetBehavior();
-    ctor public ViewOffsetBehavior(android.content.Context, android.util.AttributeSet);
-    method public int getLeftAndRightOffset();
-    method public int getTopAndBottomOffset();
-    method public boolean setLeftAndRightOffset(int);
-    method public boolean setTopAndBottomOffset(int);
-  }
-
-}
-
diff --git a/design/api/23.1.0.txt b/design/api/23.1.0.txt
deleted file mode 100644
index f68ab1b..0000000
--- a/design/api/23.1.0.txt
+++ /dev/null
@@ -1,420 +0,0 @@
-package android.support.design.widget {
-
-  public class AppBarLayout extends android.widget.LinearLayout {
-    ctor public AppBarLayout(android.content.Context);
-    ctor public AppBarLayout(android.content.Context, android.util.AttributeSet);
-    method public void addOnOffsetChangedListener(android.support.design.widget.AppBarLayout.OnOffsetChangedListener);
-    method public float getTargetElevation();
-    method public final int getTotalScrollRange();
-    method public void removeOnOffsetChangedListener(android.support.design.widget.AppBarLayout.OnOffsetChangedListener);
-    method public void setExpanded(boolean);
-    method public void setExpanded(boolean, boolean);
-    method public void setTargetElevation(float);
-  }
-
-  public static class AppBarLayout.Behavior extends android.support.design.widget.HeaderBehavior {
-    ctor public AppBarLayout.Behavior();
-    ctor public AppBarLayout.Behavior(android.content.Context, android.util.AttributeSet);
-    method public boolean onLayoutChild(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, int);
-    method public boolean onNestedFling(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.view.View, float, float, boolean);
-    method public void onNestedPreScroll(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.view.View, int, int, int[]);
-    method public void onNestedScroll(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.view.View, int, int, int, int);
-    method public void onRestoreInstanceState(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.os.Parcelable);
-    method public android.os.Parcelable onSaveInstanceState(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout);
-    method public boolean onStartNestedScroll(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.view.View, android.view.View, int);
-    method public void onStopNestedScroll(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.view.View);
-    method public void setDragCallback(android.support.design.widget.AppBarLayout.Behavior.DragCallback);
-  }
-
-  public static abstract class AppBarLayout.Behavior.DragCallback {
-    ctor public AppBarLayout.Behavior.DragCallback();
-    method public abstract boolean canDrag(android.support.design.widget.AppBarLayout);
-  }
-
-  protected static class AppBarLayout.Behavior.SavedState extends android.view.View.BaseSavedState {
-    ctor public AppBarLayout.Behavior.SavedState(android.os.Parcel, java.lang.ClassLoader);
-    ctor public AppBarLayout.Behavior.SavedState(android.os.Parcelable);
-    field public static final android.os.Parcelable.Creator<android.support.design.widget.AppBarLayout.Behavior.SavedState> CREATOR;
-  }
-
-  public static class AppBarLayout.LayoutParams extends android.widget.LinearLayout.LayoutParams {
-    ctor public AppBarLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public AppBarLayout.LayoutParams(int, int);
-    ctor public AppBarLayout.LayoutParams(int, int, float);
-    ctor public AppBarLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public AppBarLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public AppBarLayout.LayoutParams(android.widget.LinearLayout.LayoutParams);
-    ctor public AppBarLayout.LayoutParams(android.support.design.widget.AppBarLayout.LayoutParams);
-    method public int getScrollFlags();
-    method public android.view.animation.Interpolator getScrollInterpolator();
-    method public void setScrollFlags(int);
-    method public void setScrollInterpolator(android.view.animation.Interpolator);
-    field public static final int SCROLL_FLAG_ENTER_ALWAYS = 4; // 0x4
-    field public static final int SCROLL_FLAG_ENTER_ALWAYS_COLLAPSED = 8; // 0x8
-    field public static final int SCROLL_FLAG_EXIT_UNTIL_COLLAPSED = 2; // 0x2
-    field public static final int SCROLL_FLAG_SCROLL = 1; // 0x1
-    field public static final int SCROLL_FLAG_SNAP = 16; // 0x10
-  }
-
-  public static abstract interface AppBarLayout.OnOffsetChangedListener {
-    method public abstract void onOffsetChanged(android.support.design.widget.AppBarLayout, int);
-  }
-
-  public static class AppBarLayout.ScrollingViewBehavior extends android.support.design.widget.HeaderScrollingViewBehavior {
-    ctor public AppBarLayout.ScrollingViewBehavior();
-    ctor public AppBarLayout.ScrollingViewBehavior(android.content.Context, android.util.AttributeSet);
-    method public int getOverlayTop();
-    method public boolean layoutDependsOn(android.support.design.widget.CoordinatorLayout, android.view.View, android.view.View);
-    method public boolean onDependentViewChanged(android.support.design.widget.CoordinatorLayout, android.view.View, android.view.View);
-    method public boolean onLayoutChild(android.support.design.widget.CoordinatorLayout, android.view.View, int);
-    method public void setOverlayTop(int);
-  }
-
-  public class CollapsingToolbarLayout extends android.widget.FrameLayout {
-    ctor public CollapsingToolbarLayout(android.content.Context);
-    ctor public CollapsingToolbarLayout(android.content.Context, android.util.AttributeSet);
-    ctor public CollapsingToolbarLayout(android.content.Context, android.util.AttributeSet, int);
-    method public int getCollapsedTitleGravity();
-    method public android.graphics.Typeface getCollapsedTitleTypeface();
-    method public android.graphics.drawable.Drawable getContentScrim();
-    method public int getExpandedTitleGravity();
-    method public android.graphics.Typeface getExpandedTitleTypeface();
-    method public android.graphics.drawable.Drawable getStatusBarScrim();
-    method public java.lang.CharSequence getTitle();
-    method public boolean isTitleEnabled();
-    method public void setCollapsedTitleGravity(int);
-    method public void setCollapsedTitleTextAppearance(int);
-    method public void setCollapsedTitleTextColor(int);
-    method public void setCollapsedTitleTypeface(android.graphics.Typeface);
-    method public void setContentScrim(android.graphics.drawable.Drawable);
-    method public void setContentScrimColor(int);
-    method public void setContentScrimResource(int);
-    method public void setExpandedTitleColor(int);
-    method public void setExpandedTitleGravity(int);
-    method public void setExpandedTitleTextAppearance(int);
-    method public void setExpandedTitleTypeface(android.graphics.Typeface);
-    method public void setScrimsShown(boolean);
-    method public void setScrimsShown(boolean, boolean);
-    method public void setStatusBarScrim(android.graphics.drawable.Drawable);
-    method public void setStatusBarScrimColor(int);
-    method public void setStatusBarScrimResource(int);
-    method public void setTitle(java.lang.CharSequence);
-    method public void setTitleEnabled(boolean);
-  }
-
-  public static class CollapsingToolbarLayout.LayoutParams extends android.widget.FrameLayout.LayoutParams {
-    ctor public CollapsingToolbarLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public CollapsingToolbarLayout.LayoutParams(int, int);
-    ctor public CollapsingToolbarLayout.LayoutParams(int, int, int);
-    ctor public CollapsingToolbarLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public CollapsingToolbarLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public CollapsingToolbarLayout.LayoutParams(android.widget.FrameLayout.LayoutParams);
-    method public int getCollapseMode();
-    method public float getParallaxMultiplier();
-    method public void setCollapseMode(int);
-    method public void setParallaxMultiplier(float);
-    field public static final int COLLAPSE_MODE_OFF = 0; // 0x0
-    field public static final int COLLAPSE_MODE_PARALLAX = 2; // 0x2
-    field public static final int COLLAPSE_MODE_PIN = 1; // 0x1
-  }
-
-  public class CoordinatorLayout extends android.view.ViewGroup {
-    ctor public CoordinatorLayout(android.content.Context);
-    ctor public CoordinatorLayout(android.content.Context, android.util.AttributeSet);
-    ctor public CoordinatorLayout(android.content.Context, android.util.AttributeSet, int);
-    method public void dispatchDependentViewsChanged(android.view.View);
-    method public boolean doViewsOverlap(android.view.View, android.view.View);
-    method public java.util.List<android.view.View> getDependencies(android.view.View);
-    method public android.graphics.drawable.Drawable getStatusBarBackground();
-    method public boolean isPointInChildBounds(android.view.View, int, int);
-    method public void onAttachedToWindow();
-    method public void onDetachedFromWindow();
-    method public void onDraw(android.graphics.Canvas);
-    method protected void onLayout(boolean, int, int, int, int);
-    method public void onLayoutChild(android.view.View, int);
-    method public void onMeasureChild(android.view.View, int, int, int, int);
-    method public void setStatusBarBackground(android.graphics.drawable.Drawable);
-    method public void setStatusBarBackgroundColor(int);
-    method public void setStatusBarBackgroundResource(int);
-  }
-
-  public static abstract class CoordinatorLayout.Behavior {
-    ctor public CoordinatorLayout.Behavior();
-    ctor public CoordinatorLayout.Behavior(android.content.Context, android.util.AttributeSet);
-    method public boolean blocksInteractionBelow(android.support.design.widget.CoordinatorLayout, V);
-    method public final int getScrimColor(android.support.design.widget.CoordinatorLayout, V);
-    method public final float getScrimOpacity(android.support.design.widget.CoordinatorLayout, V);
-    method public static java.lang.Object getTag(android.view.View);
-    method public boolean isDirty(android.support.design.widget.CoordinatorLayout, V);
-    method public boolean layoutDependsOn(android.support.design.widget.CoordinatorLayout, V, android.view.View);
-    method public android.support.v4.view.WindowInsetsCompat onApplyWindowInsets(android.support.design.widget.CoordinatorLayout, V, android.support.v4.view.WindowInsetsCompat);
-    method public boolean onDependentViewChanged(android.support.design.widget.CoordinatorLayout, V, android.view.View);
-    method public void onDependentViewRemoved(android.support.design.widget.CoordinatorLayout, V, android.view.View);
-    method public boolean onInterceptTouchEvent(android.support.design.widget.CoordinatorLayout, V, android.view.MotionEvent);
-    method public boolean onLayoutChild(android.support.design.widget.CoordinatorLayout, V, int);
-    method public boolean onMeasureChild(android.support.design.widget.CoordinatorLayout, V, int, int, int, int);
-    method public boolean onNestedFling(android.support.design.widget.CoordinatorLayout, V, android.view.View, float, float, boolean);
-    method public boolean onNestedPreFling(android.support.design.widget.CoordinatorLayout, V, android.view.View, float, float);
-    method public void onNestedPreScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, int, int, int[]);
-    method public void onNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, int, int, int, int);
-    method public void onNestedScrollAccepted(android.support.design.widget.CoordinatorLayout, V, android.view.View, android.view.View, int);
-    method public void onRestoreInstanceState(android.support.design.widget.CoordinatorLayout, V, android.os.Parcelable);
-    method public android.os.Parcelable onSaveInstanceState(android.support.design.widget.CoordinatorLayout, V);
-    method public boolean onStartNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, android.view.View, int);
-    method public void onStopNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View);
-    method public boolean onTouchEvent(android.support.design.widget.CoordinatorLayout, V, android.view.MotionEvent);
-    method public static void setTag(android.view.View, java.lang.Object);
-  }
-
-  public static abstract class CoordinatorLayout.DefaultBehavior implements java.lang.annotation.Annotation {
-  }
-
-  public static class CoordinatorLayout.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
-    ctor public CoordinatorLayout.LayoutParams(int, int);
-    ctor public CoordinatorLayout.LayoutParams(android.support.design.widget.CoordinatorLayout.LayoutParams);
-    ctor public CoordinatorLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public CoordinatorLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
-    method public int getAnchorId();
-    method public android.support.design.widget.CoordinatorLayout.Behavior getBehavior();
-    method public void setAnchorId(int);
-    method public void setBehavior(android.support.design.widget.CoordinatorLayout.Behavior);
-    field public int anchorGravity;
-    field public int gravity;
-    field public int keyline;
-  }
-
-  protected static class CoordinatorLayout.SavedState extends android.view.View.BaseSavedState {
-    ctor public CoordinatorLayout.SavedState(android.os.Parcel, java.lang.ClassLoader);
-    ctor public CoordinatorLayout.SavedState(android.os.Parcelable);
-    field public static final android.os.Parcelable.Creator<android.support.design.widget.CoordinatorLayout.SavedState> CREATOR;
-  }
-
-  public class FloatingActionButton extends android.widget.ImageButton {
-    ctor public FloatingActionButton(android.content.Context);
-    ctor public FloatingActionButton(android.content.Context, android.util.AttributeSet);
-    ctor public FloatingActionButton(android.content.Context, android.util.AttributeSet, int);
-    method public void hide();
-    method public void hide(android.support.design.widget.FloatingActionButton.OnVisibilityChangedListener);
-    method public void setRippleColor(int);
-    method public void show();
-    method public void show(android.support.design.widget.FloatingActionButton.OnVisibilityChangedListener);
-  }
-
-  public static class FloatingActionButton.Behavior extends android.support.design.widget.CoordinatorLayout.Behavior {
-    ctor public FloatingActionButton.Behavior();
-    method public boolean layoutDependsOn(android.support.design.widget.CoordinatorLayout, android.support.design.widget.FloatingActionButton, android.view.View);
-    method public boolean onDependentViewChanged(android.support.design.widget.CoordinatorLayout, android.support.design.widget.FloatingActionButton, android.view.View);
-    method public boolean onLayoutChild(android.support.design.widget.CoordinatorLayout, android.support.design.widget.FloatingActionButton, int);
-  }
-
-  public static abstract class FloatingActionButton.OnVisibilityChangedListener {
-    ctor public FloatingActionButton.OnVisibilityChangedListener();
-    method public void onHidden(android.support.design.widget.FloatingActionButton);
-    method public void onShown(android.support.design.widget.FloatingActionButton);
-  }
-
-   abstract class HeaderBehavior extends android.support.design.widget.ViewOffsetBehavior {
-    ctor public HeaderBehavior();
-    ctor public HeaderBehavior(android.content.Context, android.util.AttributeSet);
-  }
-
-   abstract class HeaderScrollingViewBehavior extends android.support.design.widget.ViewOffsetBehavior {
-    ctor public HeaderScrollingViewBehavior();
-    ctor public HeaderScrollingViewBehavior(android.content.Context, android.util.AttributeSet);
-    method public boolean onMeasureChild(android.support.design.widget.CoordinatorLayout, android.view.View, int, int, int, int);
-  }
-
-  public class NavigationView extends android.widget.FrameLayout {
-    ctor public NavigationView(android.content.Context);
-    ctor public NavigationView(android.content.Context, android.util.AttributeSet);
-    ctor public NavigationView(android.content.Context, android.util.AttributeSet, int);
-    method public void addHeaderView(android.view.View);
-    method public android.graphics.drawable.Drawable getItemBackground();
-    method public android.content.res.ColorStateList getItemIconTintList();
-    method public android.content.res.ColorStateList getItemTextColor();
-    method public android.view.Menu getMenu();
-    method public android.view.View inflateHeaderView(int);
-    method public void inflateMenu(int);
-    method public void removeHeaderView(android.view.View);
-    method public void setCheckedItem(int);
-    method public void setItemBackground(android.graphics.drawable.Drawable);
-    method public void setItemBackgroundResource(int);
-    method public void setItemIconTintList(android.content.res.ColorStateList);
-    method public void setItemTextAppearance(int);
-    method public void setItemTextColor(android.content.res.ColorStateList);
-    method public void setNavigationItemSelectedListener(android.support.design.widget.NavigationView.OnNavigationItemSelectedListener);
-  }
-
-  public static abstract interface NavigationView.OnNavigationItemSelectedListener {
-    method public abstract boolean onNavigationItemSelected(android.view.MenuItem);
-  }
-
-  public static class NavigationView.SavedState extends android.view.View.BaseSavedState {
-    ctor public NavigationView.SavedState(android.os.Parcel, java.lang.ClassLoader);
-    ctor public NavigationView.SavedState(android.os.Parcelable);
-    field public static final android.os.Parcelable.Creator<android.support.design.widget.NavigationView.SavedState> CREATOR;
-    field public android.os.Bundle menuState;
-  }
-
-  public final class Snackbar {
-    method public void dismiss();
-    method public int getDuration();
-    method public android.view.View getView();
-    method public boolean isShown();
-    method public boolean isShownOrQueued();
-    method public static android.support.design.widget.Snackbar make(android.view.View, java.lang.CharSequence, int);
-    method public static android.support.design.widget.Snackbar make(android.view.View, int, int);
-    method public android.support.design.widget.Snackbar setAction(int, android.view.View.OnClickListener);
-    method public android.support.design.widget.Snackbar setAction(java.lang.CharSequence, android.view.View.OnClickListener);
-    method public android.support.design.widget.Snackbar setActionTextColor(android.content.res.ColorStateList);
-    method public android.support.design.widget.Snackbar setActionTextColor(int);
-    method public android.support.design.widget.Snackbar setCallback(android.support.design.widget.Snackbar.Callback);
-    method public android.support.design.widget.Snackbar setDuration(int);
-    method public android.support.design.widget.Snackbar setText(java.lang.CharSequence);
-    method public android.support.design.widget.Snackbar setText(int);
-    method public void show();
-    field public static final int LENGTH_INDEFINITE = -2; // 0xfffffffe
-    field public static final int LENGTH_LONG = 0; // 0x0
-    field public static final int LENGTH_SHORT = -1; // 0xffffffff
-  }
-
-  public static abstract class Snackbar.Callback {
-    ctor public Snackbar.Callback();
-    method public void onDismissed(android.support.design.widget.Snackbar, int);
-    method public void onShown(android.support.design.widget.Snackbar);
-    field public static final int DISMISS_EVENT_ACTION = 1; // 0x1
-    field public static final int DISMISS_EVENT_CONSECUTIVE = 4; // 0x4
-    field public static final int DISMISS_EVENT_MANUAL = 3; // 0x3
-    field public static final int DISMISS_EVENT_SWIPE = 0; // 0x0
-    field public static final int DISMISS_EVENT_TIMEOUT = 2; // 0x2
-  }
-
-  public class SwipeDismissBehavior extends android.support.design.widget.CoordinatorLayout.Behavior {
-    ctor public SwipeDismissBehavior();
-    method public int getDragState();
-    method public void setDragDismissDistance(float);
-    method public void setEndAlphaSwipeDistance(float);
-    method public void setListener(android.support.design.widget.SwipeDismissBehavior.OnDismissListener);
-    method public void setSensitivity(float);
-    method public void setStartAlphaSwipeDistance(float);
-    method public void setSwipeDirection(int);
-    field public static final int STATE_DRAGGING = 1; // 0x1
-    field public static final int STATE_IDLE = 0; // 0x0
-    field public static final int STATE_SETTLING = 2; // 0x2
-    field public static final int SWIPE_DIRECTION_ANY = 2; // 0x2
-    field public static final int SWIPE_DIRECTION_END_TO_START = 1; // 0x1
-    field public static final int SWIPE_DIRECTION_START_TO_END = 0; // 0x0
-  }
-
-  public static abstract interface SwipeDismissBehavior.OnDismissListener {
-    method public abstract void onDismiss(android.view.View);
-    method public abstract void onDragStateChanged(int);
-  }
-
-  public class TabLayout extends android.widget.HorizontalScrollView {
-    ctor public TabLayout(android.content.Context);
-    ctor public TabLayout(android.content.Context, android.util.AttributeSet);
-    ctor public TabLayout(android.content.Context, android.util.AttributeSet, int);
-    method public void addTab(android.support.design.widget.TabLayout.Tab);
-    method public void addTab(android.support.design.widget.TabLayout.Tab, int);
-    method public void addTab(android.support.design.widget.TabLayout.Tab, boolean);
-    method public void addTab(android.support.design.widget.TabLayout.Tab, int, boolean);
-    method public int getSelectedTabPosition();
-    method public android.support.design.widget.TabLayout.Tab getTabAt(int);
-    method public int getTabCount();
-    method public int getTabGravity();
-    method public int getTabMode();
-    method public android.content.res.ColorStateList getTabTextColors();
-    method public android.support.design.widget.TabLayout.Tab newTab();
-    method public void removeAllTabs();
-    method public void removeTab(android.support.design.widget.TabLayout.Tab);
-    method public void removeTabAt(int);
-    method public void setOnTabSelectedListener(android.support.design.widget.TabLayout.OnTabSelectedListener);
-    method public void setScrollPosition(int, float, boolean);
-    method public void setSelectedTabIndicatorColor(int);
-    method public void setSelectedTabIndicatorHeight(int);
-    method public void setTabGravity(int);
-    method public void setTabMode(int);
-    method public void setTabTextColors(android.content.res.ColorStateList);
-    method public void setTabTextColors(int, int);
-    method public void setTabsFromPagerAdapter(android.support.v4.view.PagerAdapter);
-    method public void setupWithViewPager(android.support.v4.view.ViewPager);
-    field public static final int GRAVITY_CENTER = 1; // 0x1
-    field public static final int GRAVITY_FILL = 0; // 0x0
-    field public static final int MODE_FIXED = 1; // 0x1
-    field public static final int MODE_SCROLLABLE = 0; // 0x0
-  }
-
-  public static abstract interface TabLayout.OnTabSelectedListener {
-    method public abstract void onTabReselected(android.support.design.widget.TabLayout.Tab);
-    method public abstract void onTabSelected(android.support.design.widget.TabLayout.Tab);
-    method public abstract void onTabUnselected(android.support.design.widget.TabLayout.Tab);
-  }
-
-  public static final class TabLayout.Tab {
-    method public java.lang.CharSequence getContentDescription();
-    method public android.view.View getCustomView();
-    method public android.graphics.drawable.Drawable getIcon();
-    method public int getPosition();
-    method public java.lang.Object getTag();
-    method public java.lang.CharSequence getText();
-    method public boolean isSelected();
-    method public void select();
-    method public android.support.design.widget.TabLayout.Tab setContentDescription(int);
-    method public android.support.design.widget.TabLayout.Tab setContentDescription(java.lang.CharSequence);
-    method public android.support.design.widget.TabLayout.Tab setCustomView(android.view.View);
-    method public android.support.design.widget.TabLayout.Tab setCustomView(int);
-    method public android.support.design.widget.TabLayout.Tab setIcon(android.graphics.drawable.Drawable);
-    method public android.support.design.widget.TabLayout.Tab setIcon(int);
-    method public android.support.design.widget.TabLayout.Tab setTag(java.lang.Object);
-    method public android.support.design.widget.TabLayout.Tab setText(java.lang.CharSequence);
-    method public android.support.design.widget.TabLayout.Tab setText(int);
-    field public static final int INVALID_POSITION = -1; // 0xffffffff
-  }
-
-  public static class TabLayout.TabLayoutOnPageChangeListener implements android.support.v4.view.ViewPager.OnPageChangeListener {
-    ctor public TabLayout.TabLayoutOnPageChangeListener(android.support.design.widget.TabLayout);
-    method public void onPageScrollStateChanged(int);
-    method public void onPageScrolled(int, float, int);
-    method public void onPageSelected(int);
-  }
-
-  public static class TabLayout.ViewPagerOnTabSelectedListener implements android.support.design.widget.TabLayout.OnTabSelectedListener {
-    ctor public TabLayout.ViewPagerOnTabSelectedListener(android.support.v4.view.ViewPager);
-    method public void onTabReselected(android.support.design.widget.TabLayout.Tab);
-    method public void onTabSelected(android.support.design.widget.TabLayout.Tab);
-    method public void onTabUnselected(android.support.design.widget.TabLayout.Tab);
-  }
-
-  public class TextInputLayout extends android.widget.LinearLayout {
-    ctor public TextInputLayout(android.content.Context);
-    ctor public TextInputLayout(android.content.Context, android.util.AttributeSet);
-    ctor public TextInputLayout(android.content.Context, android.util.AttributeSet, int);
-    method public int getCounterMaxLength();
-    method public android.widget.EditText getEditText();
-    method public java.lang.CharSequence getError();
-    method public java.lang.CharSequence getHint();
-    method public android.graphics.Typeface getTypeface();
-    method public boolean isErrorEnabled();
-    method public boolean isHintAnimationEnabled();
-    method public void setCounterEnabled(boolean);
-    method public void setCounterMaxLength(int);
-    method public void setError(java.lang.CharSequence);
-    method public void setErrorEnabled(boolean);
-    method public void setHint(java.lang.CharSequence);
-    method public void setHintAnimationEnabled(boolean);
-    method public void setHintTextAppearance(int);
-    method public void setTypeface(android.graphics.Typeface);
-  }
-
-   class ViewOffsetBehavior extends android.support.design.widget.CoordinatorLayout.Behavior {
-    ctor public ViewOffsetBehavior();
-    ctor public ViewOffsetBehavior(android.content.Context, android.util.AttributeSet);
-    method public int getLeftAndRightOffset();
-    method public int getTopAndBottomOffset();
-    method public boolean setLeftAndRightOffset(int);
-    method public boolean setTopAndBottomOffset(int);
-  }
-
-}
-
diff --git a/design/api/23.1.1.txt b/design/api/23.1.1.txt
deleted file mode 100644
index 94df705..0000000
--- a/design/api/23.1.1.txt
+++ /dev/null
@@ -1,423 +0,0 @@
-package android.support.design.widget {
-
-  public class AppBarLayout extends android.widget.LinearLayout {
-    ctor public AppBarLayout(android.content.Context);
-    ctor public AppBarLayout(android.content.Context, android.util.AttributeSet);
-    method public void addOnOffsetChangedListener(android.support.design.widget.AppBarLayout.OnOffsetChangedListener);
-    method public float getTargetElevation();
-    method public final int getTotalScrollRange();
-    method public void removeOnOffsetChangedListener(android.support.design.widget.AppBarLayout.OnOffsetChangedListener);
-    method public void setExpanded(boolean);
-    method public void setExpanded(boolean, boolean);
-    method public void setTargetElevation(float);
-  }
-
-  public static class AppBarLayout.Behavior extends android.support.design.widget.HeaderBehavior {
-    ctor public AppBarLayout.Behavior();
-    ctor public AppBarLayout.Behavior(android.content.Context, android.util.AttributeSet);
-    method public boolean onLayoutChild(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, int);
-    method public boolean onNestedFling(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.view.View, float, float, boolean);
-    method public void onNestedPreScroll(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.view.View, int, int, int[]);
-    method public void onNestedScroll(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.view.View, int, int, int, int);
-    method public void onRestoreInstanceState(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.os.Parcelable);
-    method public android.os.Parcelable onSaveInstanceState(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout);
-    method public boolean onStartNestedScroll(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.view.View, android.view.View, int);
-    method public void onStopNestedScroll(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.view.View);
-    method public void setDragCallback(android.support.design.widget.AppBarLayout.Behavior.DragCallback);
-  }
-
-  public static abstract class AppBarLayout.Behavior.DragCallback {
-    ctor public AppBarLayout.Behavior.DragCallback();
-    method public abstract boolean canDrag(android.support.design.widget.AppBarLayout);
-  }
-
-  protected static class AppBarLayout.Behavior.SavedState extends android.view.View.BaseSavedState {
-    ctor public AppBarLayout.Behavior.SavedState(android.os.Parcel, java.lang.ClassLoader);
-    ctor public AppBarLayout.Behavior.SavedState(android.os.Parcelable);
-    field public static final android.os.Parcelable.Creator<android.support.design.widget.AppBarLayout.Behavior.SavedState> CREATOR;
-  }
-
-  public static class AppBarLayout.LayoutParams extends android.widget.LinearLayout.LayoutParams {
-    ctor public AppBarLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public AppBarLayout.LayoutParams(int, int);
-    ctor public AppBarLayout.LayoutParams(int, int, float);
-    ctor public AppBarLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public AppBarLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public AppBarLayout.LayoutParams(android.widget.LinearLayout.LayoutParams);
-    ctor public AppBarLayout.LayoutParams(android.support.design.widget.AppBarLayout.LayoutParams);
-    method public int getScrollFlags();
-    method public android.view.animation.Interpolator getScrollInterpolator();
-    method public void setScrollFlags(int);
-    method public void setScrollInterpolator(android.view.animation.Interpolator);
-    field public static final int SCROLL_FLAG_ENTER_ALWAYS = 4; // 0x4
-    field public static final int SCROLL_FLAG_ENTER_ALWAYS_COLLAPSED = 8; // 0x8
-    field public static final int SCROLL_FLAG_EXIT_UNTIL_COLLAPSED = 2; // 0x2
-    field public static final int SCROLL_FLAG_SCROLL = 1; // 0x1
-    field public static final int SCROLL_FLAG_SNAP = 16; // 0x10
-  }
-
-  public static abstract interface AppBarLayout.OnOffsetChangedListener {
-    method public abstract void onOffsetChanged(android.support.design.widget.AppBarLayout, int);
-  }
-
-  public static class AppBarLayout.ScrollingViewBehavior extends android.support.design.widget.HeaderScrollingViewBehavior {
-    ctor public AppBarLayout.ScrollingViewBehavior();
-    ctor public AppBarLayout.ScrollingViewBehavior(android.content.Context, android.util.AttributeSet);
-    method public int getOverlayTop();
-    method public boolean layoutDependsOn(android.support.design.widget.CoordinatorLayout, android.view.View, android.view.View);
-    method public boolean onDependentViewChanged(android.support.design.widget.CoordinatorLayout, android.view.View, android.view.View);
-    method public boolean onLayoutChild(android.support.design.widget.CoordinatorLayout, android.view.View, int);
-    method public void setOverlayTop(int);
-  }
-
-  public class CollapsingToolbarLayout extends android.widget.FrameLayout {
-    ctor public CollapsingToolbarLayout(android.content.Context);
-    ctor public CollapsingToolbarLayout(android.content.Context, android.util.AttributeSet);
-    ctor public CollapsingToolbarLayout(android.content.Context, android.util.AttributeSet, int);
-    method public int getCollapsedTitleGravity();
-    method public android.graphics.Typeface getCollapsedTitleTypeface();
-    method public android.graphics.drawable.Drawable getContentScrim();
-    method public int getExpandedTitleGravity();
-    method public android.graphics.Typeface getExpandedTitleTypeface();
-    method public android.graphics.drawable.Drawable getStatusBarScrim();
-    method public java.lang.CharSequence getTitle();
-    method public boolean isTitleEnabled();
-    method public void setCollapsedTitleGravity(int);
-    method public void setCollapsedTitleTextAppearance(int);
-    method public void setCollapsedTitleTextColor(int);
-    method public void setCollapsedTitleTypeface(android.graphics.Typeface);
-    method public void setContentScrim(android.graphics.drawable.Drawable);
-    method public void setContentScrimColor(int);
-    method public void setContentScrimResource(int);
-    method public void setExpandedTitleColor(int);
-    method public void setExpandedTitleGravity(int);
-    method public void setExpandedTitleTextAppearance(int);
-    method public void setExpandedTitleTypeface(android.graphics.Typeface);
-    method public void setScrimsShown(boolean);
-    method public void setScrimsShown(boolean, boolean);
-    method public void setStatusBarScrim(android.graphics.drawable.Drawable);
-    method public void setStatusBarScrimColor(int);
-    method public void setStatusBarScrimResource(int);
-    method public void setTitle(java.lang.CharSequence);
-    method public void setTitleEnabled(boolean);
-  }
-
-  public static class CollapsingToolbarLayout.LayoutParams extends android.widget.FrameLayout.LayoutParams {
-    ctor public CollapsingToolbarLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public CollapsingToolbarLayout.LayoutParams(int, int);
-    ctor public CollapsingToolbarLayout.LayoutParams(int, int, int);
-    ctor public CollapsingToolbarLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public CollapsingToolbarLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public CollapsingToolbarLayout.LayoutParams(android.widget.FrameLayout.LayoutParams);
-    method public int getCollapseMode();
-    method public float getParallaxMultiplier();
-    method public void setCollapseMode(int);
-    method public void setParallaxMultiplier(float);
-    field public static final int COLLAPSE_MODE_OFF = 0; // 0x0
-    field public static final int COLLAPSE_MODE_PARALLAX = 2; // 0x2
-    field public static final int COLLAPSE_MODE_PIN = 1; // 0x1
-  }
-
-  public class CoordinatorLayout extends android.view.ViewGroup {
-    ctor public CoordinatorLayout(android.content.Context);
-    ctor public CoordinatorLayout(android.content.Context, android.util.AttributeSet);
-    ctor public CoordinatorLayout(android.content.Context, android.util.AttributeSet, int);
-    method public void dispatchDependentViewsChanged(android.view.View);
-    method public boolean doViewsOverlap(android.view.View, android.view.View);
-    method public java.util.List<android.view.View> getDependencies(android.view.View);
-    method public android.graphics.drawable.Drawable getStatusBarBackground();
-    method public boolean isPointInChildBounds(android.view.View, int, int);
-    method public void onAttachedToWindow();
-    method public void onDetachedFromWindow();
-    method public void onDraw(android.graphics.Canvas);
-    method protected void onLayout(boolean, int, int, int, int);
-    method public void onLayoutChild(android.view.View, int);
-    method public void onMeasureChild(android.view.View, int, int, int, int);
-    method public void setStatusBarBackground(android.graphics.drawable.Drawable);
-    method public void setStatusBarBackgroundColor(int);
-    method public void setStatusBarBackgroundResource(int);
-  }
-
-  public static abstract class CoordinatorLayout.Behavior {
-    ctor public CoordinatorLayout.Behavior();
-    ctor public CoordinatorLayout.Behavior(android.content.Context, android.util.AttributeSet);
-    method public boolean blocksInteractionBelow(android.support.design.widget.CoordinatorLayout, V);
-    method public final int getScrimColor(android.support.design.widget.CoordinatorLayout, V);
-    method public final float getScrimOpacity(android.support.design.widget.CoordinatorLayout, V);
-    method public static java.lang.Object getTag(android.view.View);
-    method public boolean isDirty(android.support.design.widget.CoordinatorLayout, V);
-    method public boolean layoutDependsOn(android.support.design.widget.CoordinatorLayout, V, android.view.View);
-    method public android.support.v4.view.WindowInsetsCompat onApplyWindowInsets(android.support.design.widget.CoordinatorLayout, V, android.support.v4.view.WindowInsetsCompat);
-    method public boolean onDependentViewChanged(android.support.design.widget.CoordinatorLayout, V, android.view.View);
-    method public void onDependentViewRemoved(android.support.design.widget.CoordinatorLayout, V, android.view.View);
-    method public boolean onInterceptTouchEvent(android.support.design.widget.CoordinatorLayout, V, android.view.MotionEvent);
-    method public boolean onLayoutChild(android.support.design.widget.CoordinatorLayout, V, int);
-    method public boolean onMeasureChild(android.support.design.widget.CoordinatorLayout, V, int, int, int, int);
-    method public boolean onNestedFling(android.support.design.widget.CoordinatorLayout, V, android.view.View, float, float, boolean);
-    method public boolean onNestedPreFling(android.support.design.widget.CoordinatorLayout, V, android.view.View, float, float);
-    method public void onNestedPreScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, int, int, int[]);
-    method public void onNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, int, int, int, int);
-    method public void onNestedScrollAccepted(android.support.design.widget.CoordinatorLayout, V, android.view.View, android.view.View, int);
-    method public void onRestoreInstanceState(android.support.design.widget.CoordinatorLayout, V, android.os.Parcelable);
-    method public android.os.Parcelable onSaveInstanceState(android.support.design.widget.CoordinatorLayout, V);
-    method public boolean onStartNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, android.view.View, int);
-    method public void onStopNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View);
-    method public boolean onTouchEvent(android.support.design.widget.CoordinatorLayout, V, android.view.MotionEvent);
-    method public static void setTag(android.view.View, java.lang.Object);
-  }
-
-  public static abstract class CoordinatorLayout.DefaultBehavior implements java.lang.annotation.Annotation {
-  }
-
-  public static class CoordinatorLayout.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
-    ctor public CoordinatorLayout.LayoutParams(int, int);
-    ctor public CoordinatorLayout.LayoutParams(android.support.design.widget.CoordinatorLayout.LayoutParams);
-    ctor public CoordinatorLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public CoordinatorLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
-    method public int getAnchorId();
-    method public android.support.design.widget.CoordinatorLayout.Behavior getBehavior();
-    method public void setAnchorId(int);
-    method public void setBehavior(android.support.design.widget.CoordinatorLayout.Behavior);
-    field public int anchorGravity;
-    field public int gravity;
-    field public int keyline;
-  }
-
-  protected static class CoordinatorLayout.SavedState extends android.view.View.BaseSavedState {
-    ctor public CoordinatorLayout.SavedState(android.os.Parcel, java.lang.ClassLoader);
-    ctor public CoordinatorLayout.SavedState(android.os.Parcelable);
-    field public static final android.os.Parcelable.Creator<android.support.design.widget.CoordinatorLayout.SavedState> CREATOR;
-  }
-
-  public class FloatingActionButton extends android.widget.ImageButton {
-    ctor public FloatingActionButton(android.content.Context);
-    ctor public FloatingActionButton(android.content.Context, android.util.AttributeSet);
-    ctor public FloatingActionButton(android.content.Context, android.util.AttributeSet, int);
-    method public void hide();
-    method public void hide(android.support.design.widget.FloatingActionButton.OnVisibilityChangedListener);
-    method public void setRippleColor(int);
-    method public void show();
-    method public void show(android.support.design.widget.FloatingActionButton.OnVisibilityChangedListener);
-  }
-
-  public static class FloatingActionButton.Behavior extends android.support.design.widget.CoordinatorLayout.Behavior {
-    ctor public FloatingActionButton.Behavior();
-    method public boolean layoutDependsOn(android.support.design.widget.CoordinatorLayout, android.support.design.widget.FloatingActionButton, android.view.View);
-    method public boolean onDependentViewChanged(android.support.design.widget.CoordinatorLayout, android.support.design.widget.FloatingActionButton, android.view.View);
-    method public boolean onLayoutChild(android.support.design.widget.CoordinatorLayout, android.support.design.widget.FloatingActionButton, int);
-  }
-
-  public static abstract class FloatingActionButton.OnVisibilityChangedListener {
-    ctor public FloatingActionButton.OnVisibilityChangedListener();
-    method public void onHidden(android.support.design.widget.FloatingActionButton);
-    method public void onShown(android.support.design.widget.FloatingActionButton);
-  }
-
-   abstract class HeaderBehavior extends android.support.design.widget.ViewOffsetBehavior {
-    ctor public HeaderBehavior();
-    ctor public HeaderBehavior(android.content.Context, android.util.AttributeSet);
-  }
-
-   abstract class HeaderScrollingViewBehavior extends android.support.design.widget.ViewOffsetBehavior {
-    ctor public HeaderScrollingViewBehavior();
-    ctor public HeaderScrollingViewBehavior(android.content.Context, android.util.AttributeSet);
-    method public boolean onMeasureChild(android.support.design.widget.CoordinatorLayout, android.view.View, int, int, int, int);
-  }
-
-  public class NavigationView extends android.widget.FrameLayout {
-    ctor public NavigationView(android.content.Context);
-    ctor public NavigationView(android.content.Context, android.util.AttributeSet);
-    ctor public NavigationView(android.content.Context, android.util.AttributeSet, int);
-    method public void addHeaderView(android.view.View);
-    method public int getHeaderCount();
-    method public android.view.View getHeaderView(int);
-    method public android.graphics.drawable.Drawable getItemBackground();
-    method public android.content.res.ColorStateList getItemIconTintList();
-    method public android.content.res.ColorStateList getItemTextColor();
-    method public android.view.Menu getMenu();
-    method public android.view.View inflateHeaderView(int);
-    method public void inflateMenu(int);
-    method public void removeHeaderView(android.view.View);
-    method public void setCheckedItem(int);
-    method public void setItemBackground(android.graphics.drawable.Drawable);
-    method public void setItemBackgroundResource(int);
-    method public void setItemIconTintList(android.content.res.ColorStateList);
-    method public void setItemTextAppearance(int);
-    method public void setItemTextColor(android.content.res.ColorStateList);
-    method public void setNavigationItemSelectedListener(android.support.design.widget.NavigationView.OnNavigationItemSelectedListener);
-  }
-
-  public static abstract interface NavigationView.OnNavigationItemSelectedListener {
-    method public abstract boolean onNavigationItemSelected(android.view.MenuItem);
-  }
-
-  public static class NavigationView.SavedState extends android.view.View.BaseSavedState {
-    ctor public NavigationView.SavedState(android.os.Parcel, java.lang.ClassLoader);
-    ctor public NavigationView.SavedState(android.os.Parcelable);
-    field public static final android.os.Parcelable.Creator<android.support.design.widget.NavigationView.SavedState> CREATOR;
-    field public android.os.Bundle menuState;
-  }
-
-  public final class Snackbar {
-    method public void dismiss();
-    method public int getDuration();
-    method public android.view.View getView();
-    method public boolean isShown();
-    method public boolean isShownOrQueued();
-    method public static android.support.design.widget.Snackbar make(android.view.View, java.lang.CharSequence, int);
-    method public static android.support.design.widget.Snackbar make(android.view.View, int, int);
-    method public android.support.design.widget.Snackbar setAction(int, android.view.View.OnClickListener);
-    method public android.support.design.widget.Snackbar setAction(java.lang.CharSequence, android.view.View.OnClickListener);
-    method public android.support.design.widget.Snackbar setActionTextColor(android.content.res.ColorStateList);
-    method public android.support.design.widget.Snackbar setActionTextColor(int);
-    method public android.support.design.widget.Snackbar setCallback(android.support.design.widget.Snackbar.Callback);
-    method public android.support.design.widget.Snackbar setDuration(int);
-    method public android.support.design.widget.Snackbar setText(java.lang.CharSequence);
-    method public android.support.design.widget.Snackbar setText(int);
-    method public void show();
-    field public static final int LENGTH_INDEFINITE = -2; // 0xfffffffe
-    field public static final int LENGTH_LONG = 0; // 0x0
-    field public static final int LENGTH_SHORT = -1; // 0xffffffff
-  }
-
-  public static abstract class Snackbar.Callback {
-    ctor public Snackbar.Callback();
-    method public void onDismissed(android.support.design.widget.Snackbar, int);
-    method public void onShown(android.support.design.widget.Snackbar);
-    field public static final int DISMISS_EVENT_ACTION = 1; // 0x1
-    field public static final int DISMISS_EVENT_CONSECUTIVE = 4; // 0x4
-    field public static final int DISMISS_EVENT_MANUAL = 3; // 0x3
-    field public static final int DISMISS_EVENT_SWIPE = 0; // 0x0
-    field public static final int DISMISS_EVENT_TIMEOUT = 2; // 0x2
-  }
-
-  public class SwipeDismissBehavior extends android.support.design.widget.CoordinatorLayout.Behavior {
-    ctor public SwipeDismissBehavior();
-    method public boolean canSwipeDismissView(android.view.View);
-    method public int getDragState();
-    method public void setDragDismissDistance(float);
-    method public void setEndAlphaSwipeDistance(float);
-    method public void setListener(android.support.design.widget.SwipeDismissBehavior.OnDismissListener);
-    method public void setSensitivity(float);
-    method public void setStartAlphaSwipeDistance(float);
-    method public void setSwipeDirection(int);
-    field public static final int STATE_DRAGGING = 1; // 0x1
-    field public static final int STATE_IDLE = 0; // 0x0
-    field public static final int STATE_SETTLING = 2; // 0x2
-    field public static final int SWIPE_DIRECTION_ANY = 2; // 0x2
-    field public static final int SWIPE_DIRECTION_END_TO_START = 1; // 0x1
-    field public static final int SWIPE_DIRECTION_START_TO_END = 0; // 0x0
-  }
-
-  public static abstract interface SwipeDismissBehavior.OnDismissListener {
-    method public abstract void onDismiss(android.view.View);
-    method public abstract void onDragStateChanged(int);
-  }
-
-  public class TabLayout extends android.widget.HorizontalScrollView {
-    ctor public TabLayout(android.content.Context);
-    ctor public TabLayout(android.content.Context, android.util.AttributeSet);
-    ctor public TabLayout(android.content.Context, android.util.AttributeSet, int);
-    method public void addTab(android.support.design.widget.TabLayout.Tab);
-    method public void addTab(android.support.design.widget.TabLayout.Tab, int);
-    method public void addTab(android.support.design.widget.TabLayout.Tab, boolean);
-    method public void addTab(android.support.design.widget.TabLayout.Tab, int, boolean);
-    method public int getSelectedTabPosition();
-    method public android.support.design.widget.TabLayout.Tab getTabAt(int);
-    method public int getTabCount();
-    method public int getTabGravity();
-    method public int getTabMode();
-    method public android.content.res.ColorStateList getTabTextColors();
-    method public android.support.design.widget.TabLayout.Tab newTab();
-    method public void removeAllTabs();
-    method public void removeTab(android.support.design.widget.TabLayout.Tab);
-    method public void removeTabAt(int);
-    method public void setOnTabSelectedListener(android.support.design.widget.TabLayout.OnTabSelectedListener);
-    method public void setScrollPosition(int, float, boolean);
-    method public void setSelectedTabIndicatorColor(int);
-    method public void setSelectedTabIndicatorHeight(int);
-    method public void setTabGravity(int);
-    method public void setTabMode(int);
-    method public void setTabTextColors(android.content.res.ColorStateList);
-    method public void setTabTextColors(int, int);
-    method public void setTabsFromPagerAdapter(android.support.v4.view.PagerAdapter);
-    method public void setupWithViewPager(android.support.v4.view.ViewPager);
-    field public static final int GRAVITY_CENTER = 1; // 0x1
-    field public static final int GRAVITY_FILL = 0; // 0x0
-    field public static final int MODE_FIXED = 1; // 0x1
-    field public static final int MODE_SCROLLABLE = 0; // 0x0
-  }
-
-  public static abstract interface TabLayout.OnTabSelectedListener {
-    method public abstract void onTabReselected(android.support.design.widget.TabLayout.Tab);
-    method public abstract void onTabSelected(android.support.design.widget.TabLayout.Tab);
-    method public abstract void onTabUnselected(android.support.design.widget.TabLayout.Tab);
-  }
-
-  public static final class TabLayout.Tab {
-    method public java.lang.CharSequence getContentDescription();
-    method public android.view.View getCustomView();
-    method public android.graphics.drawable.Drawable getIcon();
-    method public int getPosition();
-    method public java.lang.Object getTag();
-    method public java.lang.CharSequence getText();
-    method public boolean isSelected();
-    method public void select();
-    method public android.support.design.widget.TabLayout.Tab setContentDescription(int);
-    method public android.support.design.widget.TabLayout.Tab setContentDescription(java.lang.CharSequence);
-    method public android.support.design.widget.TabLayout.Tab setCustomView(android.view.View);
-    method public android.support.design.widget.TabLayout.Tab setCustomView(int);
-    method public android.support.design.widget.TabLayout.Tab setIcon(android.graphics.drawable.Drawable);
-    method public android.support.design.widget.TabLayout.Tab setIcon(int);
-    method public android.support.design.widget.TabLayout.Tab setTag(java.lang.Object);
-    method public android.support.design.widget.TabLayout.Tab setText(java.lang.CharSequence);
-    method public android.support.design.widget.TabLayout.Tab setText(int);
-    field public static final int INVALID_POSITION = -1; // 0xffffffff
-  }
-
-  public static class TabLayout.TabLayoutOnPageChangeListener implements android.support.v4.view.ViewPager.OnPageChangeListener {
-    ctor public TabLayout.TabLayoutOnPageChangeListener(android.support.design.widget.TabLayout);
-    method public void onPageScrollStateChanged(int);
-    method public void onPageScrolled(int, float, int);
-    method public void onPageSelected(int);
-  }
-
-  public static class TabLayout.ViewPagerOnTabSelectedListener implements android.support.design.widget.TabLayout.OnTabSelectedListener {
-    ctor public TabLayout.ViewPagerOnTabSelectedListener(android.support.v4.view.ViewPager);
-    method public void onTabReselected(android.support.design.widget.TabLayout.Tab);
-    method public void onTabSelected(android.support.design.widget.TabLayout.Tab);
-    method public void onTabUnselected(android.support.design.widget.TabLayout.Tab);
-  }
-
-  public class TextInputLayout extends android.widget.LinearLayout {
-    ctor public TextInputLayout(android.content.Context);
-    ctor public TextInputLayout(android.content.Context, android.util.AttributeSet);
-    ctor public TextInputLayout(android.content.Context, android.util.AttributeSet, int);
-    method public int getCounterMaxLength();
-    method public android.widget.EditText getEditText();
-    method public java.lang.CharSequence getError();
-    method public java.lang.CharSequence getHint();
-    method public android.graphics.Typeface getTypeface();
-    method public boolean isErrorEnabled();
-    method public boolean isHintAnimationEnabled();
-    method public void setCounterEnabled(boolean);
-    method public void setCounterMaxLength(int);
-    method public void setError(java.lang.CharSequence);
-    method public void setErrorEnabled(boolean);
-    method public void setHint(java.lang.CharSequence);
-    method public void setHintAnimationEnabled(boolean);
-    method public void setHintTextAppearance(int);
-    method public void setTypeface(android.graphics.Typeface);
-  }
-
-   class ViewOffsetBehavior extends android.support.design.widget.CoordinatorLayout.Behavior {
-    ctor public ViewOffsetBehavior();
-    ctor public ViewOffsetBehavior(android.content.Context, android.util.AttributeSet);
-    method public int getLeftAndRightOffset();
-    method public int getTopAndBottomOffset();
-    method public boolean setLeftAndRightOffset(int);
-    method public boolean setTopAndBottomOffset(int);
-  }
-
-}
-
diff --git a/design/api/current.txt b/design/api/current.txt
deleted file mode 100644
index aefeea2..0000000
--- a/design/api/current.txt
+++ /dev/null
@@ -1,518 +0,0 @@
-package android.support.design.widget {
-
-  public class AppBarLayout extends android.widget.LinearLayout {
-    ctor public AppBarLayout(android.content.Context);
-    ctor public AppBarLayout(android.content.Context, android.util.AttributeSet);
-    method public void addOnOffsetChangedListener(android.support.design.widget.AppBarLayout.OnOffsetChangedListener);
-    method public deprecated float getTargetElevation();
-    method public final int getTotalScrollRange();
-    method public void removeOnOffsetChangedListener(android.support.design.widget.AppBarLayout.OnOffsetChangedListener);
-    method public void setExpanded(boolean);
-    method public void setExpanded(boolean, boolean);
-    method public deprecated void setTargetElevation(float);
-  }
-
-  public static class AppBarLayout.Behavior extends android.support.design.widget.HeaderBehavior {
-    ctor public AppBarLayout.Behavior();
-    ctor public AppBarLayout.Behavior(android.content.Context, android.util.AttributeSet);
-    method public boolean onLayoutChild(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, int);
-    method public boolean onMeasureChild(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, int, int, int, int);
-    method public boolean onNestedFling(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.view.View, float, float, boolean);
-    method public void onNestedPreScroll(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.view.View, int, int, int[]);
-    method public void onNestedScroll(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.view.View, int, int, int, int);
-    method public void onRestoreInstanceState(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.os.Parcelable);
-    method public android.os.Parcelable onSaveInstanceState(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout);
-    method public boolean onStartNestedScroll(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.view.View, android.view.View, int);
-    method public void onStopNestedScroll(android.support.design.widget.CoordinatorLayout, android.support.design.widget.AppBarLayout, android.view.View);
-    method public void setDragCallback(android.support.design.widget.AppBarLayout.Behavior.DragCallback);
-  }
-
-  public static abstract class AppBarLayout.Behavior.DragCallback {
-    ctor public AppBarLayout.Behavior.DragCallback();
-    method public abstract boolean canDrag(android.support.design.widget.AppBarLayout);
-  }
-
-  protected static class AppBarLayout.Behavior.SavedState extends android.support.v4.view.AbsSavedState {
-    ctor public AppBarLayout.Behavior.SavedState(android.os.Parcel, java.lang.ClassLoader);
-    ctor public AppBarLayout.Behavior.SavedState(android.os.Parcelable);
-    field public static final android.os.Parcelable.Creator<android.support.design.widget.AppBarLayout.Behavior.SavedState> CREATOR;
-  }
-
-  public static class AppBarLayout.LayoutParams extends android.widget.LinearLayout.LayoutParams {
-    ctor public AppBarLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public AppBarLayout.LayoutParams(int, int);
-    ctor public AppBarLayout.LayoutParams(int, int, float);
-    ctor public AppBarLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public AppBarLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public AppBarLayout.LayoutParams(android.widget.LinearLayout.LayoutParams);
-    ctor public AppBarLayout.LayoutParams(android.support.design.widget.AppBarLayout.LayoutParams);
-    method public int getScrollFlags();
-    method public android.view.animation.Interpolator getScrollInterpolator();
-    method public void setScrollFlags(int);
-    method public void setScrollInterpolator(android.view.animation.Interpolator);
-    field public static final int SCROLL_FLAG_ENTER_ALWAYS = 4; // 0x4
-    field public static final int SCROLL_FLAG_ENTER_ALWAYS_COLLAPSED = 8; // 0x8
-    field public static final int SCROLL_FLAG_EXIT_UNTIL_COLLAPSED = 2; // 0x2
-    field public static final int SCROLL_FLAG_SCROLL = 1; // 0x1
-    field public static final int SCROLL_FLAG_SNAP = 16; // 0x10
-  }
-
-  public static abstract interface AppBarLayout.OnOffsetChangedListener {
-    method public abstract void onOffsetChanged(android.support.design.widget.AppBarLayout, int);
-  }
-
-  public static class AppBarLayout.ScrollingViewBehavior extends android.support.design.widget.HeaderScrollingViewBehavior {
-    ctor public AppBarLayout.ScrollingViewBehavior();
-    ctor public AppBarLayout.ScrollingViewBehavior(android.content.Context, android.util.AttributeSet);
-    method public boolean layoutDependsOn(android.support.design.widget.CoordinatorLayout, android.view.View, android.view.View);
-    method public boolean onDependentViewChanged(android.support.design.widget.CoordinatorLayout, android.view.View, android.view.View);
-  }
-
-  public class BottomSheetBehavior extends android.support.design.widget.CoordinatorLayout.Behavior {
-    ctor public BottomSheetBehavior();
-    ctor public BottomSheetBehavior(android.content.Context, android.util.AttributeSet);
-    method public static android.support.design.widget.BottomSheetBehavior<V> from(V);
-    method public final int getPeekHeight();
-    method public boolean getSkipCollapsed();
-    method public final int getState();
-    method public boolean isHideable();
-    method public void setBottomSheetCallback(android.support.design.widget.BottomSheetBehavior.BottomSheetCallback);
-    method public void setHideable(boolean);
-    method public final void setPeekHeight(int);
-    method public void setSkipCollapsed(boolean);
-    method public final void setState(int);
-    field public static final int STATE_COLLAPSED = 4; // 0x4
-    field public static final int STATE_DRAGGING = 1; // 0x1
-    field public static final int STATE_EXPANDED = 3; // 0x3
-    field public static final int STATE_HIDDEN = 5; // 0x5
-    field public static final int STATE_SETTLING = 2; // 0x2
-  }
-
-  public static abstract class BottomSheetBehavior.BottomSheetCallback {
-    ctor public BottomSheetBehavior.BottomSheetCallback();
-    method public abstract void onSlide(android.view.View, float);
-    method public abstract void onStateChanged(android.view.View, int);
-  }
-
-  protected static class BottomSheetBehavior.SavedState extends android.support.v4.view.AbsSavedState {
-    ctor public BottomSheetBehavior.SavedState(android.os.Parcel);
-    ctor public BottomSheetBehavior.SavedState(android.os.Parcel, java.lang.ClassLoader);
-    ctor public BottomSheetBehavior.SavedState(android.os.Parcelable, int);
-    field public static final android.os.Parcelable.Creator<android.support.design.widget.BottomSheetBehavior.SavedState> CREATOR;
-  }
-
-  public class BottomSheetDialog extends android.support.v7.app.AppCompatDialog {
-    ctor public BottomSheetDialog(android.content.Context);
-    ctor public BottomSheetDialog(android.content.Context, int);
-    ctor protected BottomSheetDialog(android.content.Context, boolean, android.content.DialogInterface.OnCancelListener);
-  }
-
-  public class BottomSheetDialogFragment extends android.support.v7.app.AppCompatDialogFragment {
-    ctor public BottomSheetDialogFragment();
-  }
-
-  public class CollapsingToolbarLayout extends android.widget.FrameLayout {
-    ctor public CollapsingToolbarLayout(android.content.Context);
-    ctor public CollapsingToolbarLayout(android.content.Context, android.util.AttributeSet);
-    ctor public CollapsingToolbarLayout(android.content.Context, android.util.AttributeSet, int);
-    method public int getCollapsedTitleGravity();
-    method public android.graphics.Typeface getCollapsedTitleTypeface();
-    method public android.graphics.drawable.Drawable getContentScrim();
-    method public int getExpandedTitleGravity();
-    method public int getExpandedTitleMarginBottom();
-    method public int getExpandedTitleMarginEnd();
-    method public int getExpandedTitleMarginStart();
-    method public int getExpandedTitleMarginTop();
-    method public android.graphics.Typeface getExpandedTitleTypeface();
-    method public long getScrimAnimationDuration();
-    method public int getScrimVisibleHeightTrigger();
-    method public android.graphics.drawable.Drawable getStatusBarScrim();
-    method public java.lang.CharSequence getTitle();
-    method public boolean isTitleEnabled();
-    method public void setCollapsedTitleGravity(int);
-    method public void setCollapsedTitleTextAppearance(int);
-    method public void setCollapsedTitleTextColor(int);
-    method public void setCollapsedTitleTypeface(android.graphics.Typeface);
-    method public void setContentScrim(android.graphics.drawable.Drawable);
-    method public void setContentScrimColor(int);
-    method public void setContentScrimResource(int);
-    method public void setExpandedTitleColor(int);
-    method public void setExpandedTitleGravity(int);
-    method public void setExpandedTitleMargin(int, int, int, int);
-    method public void setExpandedTitleMarginBottom(int);
-    method public void setExpandedTitleMarginEnd(int);
-    method public void setExpandedTitleMarginStart(int);
-    method public void setExpandedTitleMarginTop(int);
-    method public void setExpandedTitleTextAppearance(int);
-    method public void setExpandedTitleTypeface(android.graphics.Typeface);
-    method public void setScrimAnimationDuration(long);
-    method public void setScrimVisibleHeightTrigger(int);
-    method public void setScrimsShown(boolean);
-    method public void setScrimsShown(boolean, boolean);
-    method public void setStatusBarScrim(android.graphics.drawable.Drawable);
-    method public void setStatusBarScrimColor(int);
-    method public void setStatusBarScrimResource(int);
-    method public void setTitle(java.lang.CharSequence);
-    method public void setTitleEnabled(boolean);
-  }
-
-  public static class CollapsingToolbarLayout.LayoutParams extends android.widget.FrameLayout.LayoutParams {
-    ctor public CollapsingToolbarLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public CollapsingToolbarLayout.LayoutParams(int, int);
-    ctor public CollapsingToolbarLayout.LayoutParams(int, int, int);
-    ctor public CollapsingToolbarLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public CollapsingToolbarLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public CollapsingToolbarLayout.LayoutParams(android.widget.FrameLayout.LayoutParams);
-    method public int getCollapseMode();
-    method public float getParallaxMultiplier();
-    method public void setCollapseMode(int);
-    method public void setParallaxMultiplier(float);
-    field public static final int COLLAPSE_MODE_OFF = 0; // 0x0
-    field public static final int COLLAPSE_MODE_PARALLAX = 2; // 0x2
-    field public static final int COLLAPSE_MODE_PIN = 1; // 0x1
-  }
-
-  public class CoordinatorLayout extends android.view.ViewGroup {
-    ctor public CoordinatorLayout(android.content.Context);
-    ctor public CoordinatorLayout(android.content.Context, android.util.AttributeSet);
-    ctor public CoordinatorLayout(android.content.Context, android.util.AttributeSet, int);
-    method public void dispatchDependentViewsChanged(android.view.View);
-    method public boolean doViewsOverlap(android.view.View, android.view.View);
-    method public java.util.List<android.view.View> getDependencies(android.view.View);
-    method public android.graphics.drawable.Drawable getStatusBarBackground();
-    method public boolean isPointInChildBounds(android.view.View, int, int);
-    method public void onAttachedToWindow();
-    method public void onDetachedFromWindow();
-    method public void onDraw(android.graphics.Canvas);
-    method protected void onLayout(boolean, int, int, int, int);
-    method public void onLayoutChild(android.view.View, int);
-    method public void onMeasureChild(android.view.View, int, int, int, int);
-    method public void setStatusBarBackground(android.graphics.drawable.Drawable);
-    method public void setStatusBarBackgroundColor(int);
-    method public void setStatusBarBackgroundResource(int);
-  }
-
-  public static abstract class CoordinatorLayout.Behavior {
-    ctor public CoordinatorLayout.Behavior();
-    ctor public CoordinatorLayout.Behavior(android.content.Context, android.util.AttributeSet);
-    method public boolean blocksInteractionBelow(android.support.design.widget.CoordinatorLayout, V);
-    method public int getScrimColor(android.support.design.widget.CoordinatorLayout, V);
-    method public float getScrimOpacity(android.support.design.widget.CoordinatorLayout, V);
-    method public static java.lang.Object getTag(android.view.View);
-    method public boolean isDirty(android.support.design.widget.CoordinatorLayout, V);
-    method public boolean layoutDependsOn(android.support.design.widget.CoordinatorLayout, V, android.view.View);
-    method public android.support.v4.view.WindowInsetsCompat onApplyWindowInsets(android.support.design.widget.CoordinatorLayout, V, android.support.v4.view.WindowInsetsCompat);
-    method public boolean onDependentViewChanged(android.support.design.widget.CoordinatorLayout, V, android.view.View);
-    method public void onDependentViewRemoved(android.support.design.widget.CoordinatorLayout, V, android.view.View);
-    method public boolean onInterceptTouchEvent(android.support.design.widget.CoordinatorLayout, V, android.view.MotionEvent);
-    method public boolean onLayoutChild(android.support.design.widget.CoordinatorLayout, V, int);
-    method public boolean onMeasureChild(android.support.design.widget.CoordinatorLayout, V, int, int, int, int);
-    method public boolean onNestedFling(android.support.design.widget.CoordinatorLayout, V, android.view.View, float, float, boolean);
-    method public boolean onNestedPreFling(android.support.design.widget.CoordinatorLayout, V, android.view.View, float, float);
-    method public void onNestedPreScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, int, int, int[]);
-    method public void onNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, int, int, int, int);
-    method public void onNestedScrollAccepted(android.support.design.widget.CoordinatorLayout, V, android.view.View, android.view.View, int);
-    method public void onRestoreInstanceState(android.support.design.widget.CoordinatorLayout, V, android.os.Parcelable);
-    method public android.os.Parcelable onSaveInstanceState(android.support.design.widget.CoordinatorLayout, V);
-    method public boolean onStartNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View, android.view.View, int);
-    method public void onStopNestedScroll(android.support.design.widget.CoordinatorLayout, V, android.view.View);
-    method public boolean onTouchEvent(android.support.design.widget.CoordinatorLayout, V, android.view.MotionEvent);
-    method public static void setTag(android.view.View, java.lang.Object);
-  }
-
-  public static abstract class CoordinatorLayout.DefaultBehavior implements java.lang.annotation.Annotation {
-  }
-
-  public static class CoordinatorLayout.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
-    ctor public CoordinatorLayout.LayoutParams(int, int);
-    ctor public CoordinatorLayout.LayoutParams(android.support.design.widget.CoordinatorLayout.LayoutParams);
-    ctor public CoordinatorLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public CoordinatorLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
-    method public int getAnchorId();
-    method public android.support.design.widget.CoordinatorLayout.Behavior getBehavior();
-    method public void setAnchorId(int);
-    method public void setBehavior(android.support.design.widget.CoordinatorLayout.Behavior);
-    field public int anchorGravity;
-    field public int gravity;
-    field public int keyline;
-  }
-
-  protected static class CoordinatorLayout.SavedState extends android.support.v4.view.AbsSavedState {
-    ctor public CoordinatorLayout.SavedState(android.os.Parcel, java.lang.ClassLoader);
-    ctor public CoordinatorLayout.SavedState(android.os.Parcelable);
-    field public static final android.os.Parcelable.Creator<android.support.design.widget.CoordinatorLayout.SavedState> CREATOR;
-  }
-
-  public class FloatingActionButton extends android.support.design.widget.VisibilityAwareImageButton {
-    ctor public FloatingActionButton(android.content.Context);
-    ctor public FloatingActionButton(android.content.Context, android.util.AttributeSet);
-    ctor public FloatingActionButton(android.content.Context, android.util.AttributeSet, int);
-    method public float getCompatElevation();
-    method public android.graphics.drawable.Drawable getContentBackground();
-    method public boolean getContentRect(android.graphics.Rect);
-    method public int getSize();
-    method public boolean getUseCompatPadding();
-    method public void hide();
-    method public void hide(android.support.design.widget.FloatingActionButton.OnVisibilityChangedListener);
-    method public void setCompatElevation(float);
-    method public void setRippleColor(int);
-    method public void setSize(int);
-    method public void setUseCompatPadding(boolean);
-    method public void show();
-    method public void show(android.support.design.widget.FloatingActionButton.OnVisibilityChangedListener);
-    field public static final int SIZE_AUTO = -1; // 0xffffffff
-    field public static final int SIZE_MINI = 1; // 0x1
-    field public static final int SIZE_NORMAL = 0; // 0x0
-  }
-
-  public static class FloatingActionButton.Behavior extends android.support.design.widget.CoordinatorLayout.Behavior {
-    ctor public FloatingActionButton.Behavior();
-    ctor public FloatingActionButton.Behavior(android.content.Context, android.util.AttributeSet);
-    method public boolean layoutDependsOn(android.support.design.widget.CoordinatorLayout, android.support.design.widget.FloatingActionButton, android.view.View);
-    method public boolean onDependentViewChanged(android.support.design.widget.CoordinatorLayout, android.support.design.widget.FloatingActionButton, android.view.View);
-    method public void onDependentViewRemoved(android.support.design.widget.CoordinatorLayout, android.support.design.widget.FloatingActionButton, android.view.View);
-    method public boolean onLayoutChild(android.support.design.widget.CoordinatorLayout, android.support.design.widget.FloatingActionButton, int);
-  }
-
-  public static abstract class FloatingActionButton.OnVisibilityChangedListener {
-    ctor public FloatingActionButton.OnVisibilityChangedListener();
-    method public void onHidden(android.support.design.widget.FloatingActionButton);
-    method public void onShown(android.support.design.widget.FloatingActionButton);
-  }
-
-   abstract class HeaderBehavior extends android.support.design.widget.ViewOffsetBehavior {
-    ctor public HeaderBehavior();
-    ctor public HeaderBehavior(android.content.Context, android.util.AttributeSet);
-  }
-
-   abstract class HeaderScrollingViewBehavior extends android.support.design.widget.ViewOffsetBehavior {
-    ctor public HeaderScrollingViewBehavior();
-    ctor public HeaderScrollingViewBehavior(android.content.Context, android.util.AttributeSet);
-    method public final int getOverlayTop();
-    method protected void layoutChild(android.support.design.widget.CoordinatorLayout, android.view.View, int);
-    method public boolean onMeasureChild(android.support.design.widget.CoordinatorLayout, android.view.View, int, int, int, int);
-    method public final void setOverlayTop(int);
-  }
-
-  public class NavigationView extends android.widget.FrameLayout {
-    ctor public NavigationView(android.content.Context);
-    ctor public NavigationView(android.content.Context, android.util.AttributeSet);
-    ctor public NavigationView(android.content.Context, android.util.AttributeSet, int);
-    method public void addHeaderView(android.view.View);
-    method public int getHeaderCount();
-    method public android.view.View getHeaderView(int);
-    method public android.graphics.drawable.Drawable getItemBackground();
-    method public android.content.res.ColorStateList getItemIconTintList();
-    method public android.content.res.ColorStateList getItemTextColor();
-    method public android.view.Menu getMenu();
-    method public android.view.View inflateHeaderView(int);
-    method public void inflateMenu(int);
-    method public void removeHeaderView(android.view.View);
-    method public void setCheckedItem(int);
-    method public void setItemBackground(android.graphics.drawable.Drawable);
-    method public void setItemBackgroundResource(int);
-    method public void setItemIconTintList(android.content.res.ColorStateList);
-    method public void setItemTextAppearance(int);
-    method public void setItemTextColor(android.content.res.ColorStateList);
-    method public void setNavigationItemSelectedListener(android.support.design.widget.NavigationView.OnNavigationItemSelectedListener);
-  }
-
-  public static abstract interface NavigationView.OnNavigationItemSelectedListener {
-    method public abstract boolean onNavigationItemSelected(android.view.MenuItem);
-  }
-
-  public static class NavigationView.SavedState extends android.support.v4.view.AbsSavedState {
-    ctor public NavigationView.SavedState(android.os.Parcel, java.lang.ClassLoader);
-    ctor public NavigationView.SavedState(android.os.Parcelable);
-    field public static final android.os.Parcelable.Creator<android.support.design.widget.NavigationView.SavedState> CREATOR;
-    field public android.os.Bundle menuState;
-  }
-
-  public final class Snackbar {
-    method public void dismiss();
-    method public int getDuration();
-    method public android.view.View getView();
-    method public boolean isShown();
-    method public boolean isShownOrQueued();
-    method public static android.support.design.widget.Snackbar make(android.view.View, java.lang.CharSequence, int);
-    method public static android.support.design.widget.Snackbar make(android.view.View, int, int);
-    method public android.support.design.widget.Snackbar setAction(int, android.view.View.OnClickListener);
-    method public android.support.design.widget.Snackbar setAction(java.lang.CharSequence, android.view.View.OnClickListener);
-    method public android.support.design.widget.Snackbar setActionTextColor(android.content.res.ColorStateList);
-    method public android.support.design.widget.Snackbar setActionTextColor(int);
-    method public android.support.design.widget.Snackbar setCallback(android.support.design.widget.Snackbar.Callback);
-    method public android.support.design.widget.Snackbar setDuration(int);
-    method public android.support.design.widget.Snackbar setText(java.lang.CharSequence);
-    method public android.support.design.widget.Snackbar setText(int);
-    method public void show();
-    field public static final int LENGTH_INDEFINITE = -2; // 0xfffffffe
-    field public static final int LENGTH_LONG = 0; // 0x0
-    field public static final int LENGTH_SHORT = -1; // 0xffffffff
-  }
-
-  public static abstract class Snackbar.Callback {
-    ctor public Snackbar.Callback();
-    method public void onDismissed(android.support.design.widget.Snackbar, int);
-    method public void onShown(android.support.design.widget.Snackbar);
-    field public static final int DISMISS_EVENT_ACTION = 1; // 0x1
-    field public static final int DISMISS_EVENT_CONSECUTIVE = 4; // 0x4
-    field public static final int DISMISS_EVENT_MANUAL = 3; // 0x3
-    field public static final int DISMISS_EVENT_SWIPE = 0; // 0x0
-    field public static final int DISMISS_EVENT_TIMEOUT = 2; // 0x2
-  }
-
-  public class SwipeDismissBehavior extends android.support.design.widget.CoordinatorLayout.Behavior {
-    ctor public SwipeDismissBehavior();
-    method public boolean canSwipeDismissView(android.view.View);
-    method public int getDragState();
-    method public void setDragDismissDistance(float);
-    method public void setEndAlphaSwipeDistance(float);
-    method public void setListener(android.support.design.widget.SwipeDismissBehavior.OnDismissListener);
-    method public void setSensitivity(float);
-    method public void setStartAlphaSwipeDistance(float);
-    method public void setSwipeDirection(int);
-    field public static final int STATE_DRAGGING = 1; // 0x1
-    field public static final int STATE_IDLE = 0; // 0x0
-    field public static final int STATE_SETTLING = 2; // 0x2
-    field public static final int SWIPE_DIRECTION_ANY = 2; // 0x2
-    field public static final int SWIPE_DIRECTION_END_TO_START = 1; // 0x1
-    field public static final int SWIPE_DIRECTION_START_TO_END = 0; // 0x0
-  }
-
-  public static abstract interface SwipeDismissBehavior.OnDismissListener {
-    method public abstract void onDismiss(android.view.View);
-    method public abstract void onDragStateChanged(int);
-  }
-
-  public final class TabItem extends android.view.View {
-    ctor public TabItem(android.content.Context);
-    ctor public TabItem(android.content.Context, android.util.AttributeSet);
-  }
-
-  public class TabLayout extends android.widget.HorizontalScrollView {
-    ctor public TabLayout(android.content.Context);
-    ctor public TabLayout(android.content.Context, android.util.AttributeSet);
-    ctor public TabLayout(android.content.Context, android.util.AttributeSet, int);
-    method public void addOnTabSelectedListener(android.support.design.widget.TabLayout.OnTabSelectedListener);
-    method public void addTab(android.support.design.widget.TabLayout.Tab);
-    method public void addTab(android.support.design.widget.TabLayout.Tab, int);
-    method public void addTab(android.support.design.widget.TabLayout.Tab, boolean);
-    method public void addTab(android.support.design.widget.TabLayout.Tab, int, boolean);
-    method public int getSelectedTabPosition();
-    method public android.support.design.widget.TabLayout.Tab getTabAt(int);
-    method public int getTabCount();
-    method public int getTabGravity();
-    method public int getTabMode();
-    method public android.content.res.ColorStateList getTabTextColors();
-    method public android.support.design.widget.TabLayout.Tab newTab();
-    method public void removeAllTabs();
-    method public void removeOnTabSelectedListener(android.support.design.widget.TabLayout.OnTabSelectedListener);
-    method public void removeTab(android.support.design.widget.TabLayout.Tab);
-    method public void removeTabAt(int);
-    method public deprecated void setOnTabSelectedListener(android.support.design.widget.TabLayout.OnTabSelectedListener);
-    method public void setScrollPosition(int, float, boolean);
-    method public void setSelectedTabIndicatorColor(int);
-    method public void setSelectedTabIndicatorHeight(int);
-    method public void setTabGravity(int);
-    method public void setTabMode(int);
-    method public void setTabTextColors(android.content.res.ColorStateList);
-    method public void setTabTextColors(int, int);
-    method public deprecated void setTabsFromPagerAdapter(android.support.v4.view.PagerAdapter);
-    method public void setupWithViewPager(android.support.v4.view.ViewPager);
-    method public void setupWithViewPager(android.support.v4.view.ViewPager, boolean);
-    field public static final int GRAVITY_CENTER = 1; // 0x1
-    field public static final int GRAVITY_FILL = 0; // 0x0
-    field public static final int MODE_FIXED = 1; // 0x1
-    field public static final int MODE_SCROLLABLE = 0; // 0x0
-  }
-
-  public static abstract interface TabLayout.OnTabSelectedListener {
-    method public abstract void onTabReselected(android.support.design.widget.TabLayout.Tab);
-    method public abstract void onTabSelected(android.support.design.widget.TabLayout.Tab);
-    method public abstract void onTabUnselected(android.support.design.widget.TabLayout.Tab);
-  }
-
-  public static final class TabLayout.Tab {
-    method public java.lang.CharSequence getContentDescription();
-    method public android.view.View getCustomView();
-    method public android.graphics.drawable.Drawable getIcon();
-    method public int getPosition();
-    method public java.lang.Object getTag();
-    method public java.lang.CharSequence getText();
-    method public boolean isSelected();
-    method public void select();
-    method public android.support.design.widget.TabLayout.Tab setContentDescription(int);
-    method public android.support.design.widget.TabLayout.Tab setContentDescription(java.lang.CharSequence);
-    method public android.support.design.widget.TabLayout.Tab setCustomView(android.view.View);
-    method public android.support.design.widget.TabLayout.Tab setCustomView(int);
-    method public android.support.design.widget.TabLayout.Tab setIcon(android.graphics.drawable.Drawable);
-    method public android.support.design.widget.TabLayout.Tab setIcon(int);
-    method public android.support.design.widget.TabLayout.Tab setTag(java.lang.Object);
-    method public android.support.design.widget.TabLayout.Tab setText(java.lang.CharSequence);
-    method public android.support.design.widget.TabLayout.Tab setText(int);
-    field public static final int INVALID_POSITION = -1; // 0xffffffff
-  }
-
-  public static class TabLayout.TabLayoutOnPageChangeListener implements android.support.v4.view.ViewPager.OnPageChangeListener {
-    ctor public TabLayout.TabLayoutOnPageChangeListener(android.support.design.widget.TabLayout);
-    method public void onPageScrollStateChanged(int);
-    method public void onPageScrolled(int, float, int);
-    method public void onPageSelected(int);
-  }
-
-  public static class TabLayout.ViewPagerOnTabSelectedListener implements android.support.design.widget.TabLayout.OnTabSelectedListener {
-    ctor public TabLayout.ViewPagerOnTabSelectedListener(android.support.v4.view.ViewPager);
-    method public void onTabReselected(android.support.design.widget.TabLayout.Tab);
-    method public void onTabSelected(android.support.design.widget.TabLayout.Tab);
-    method public void onTabUnselected(android.support.design.widget.TabLayout.Tab);
-  }
-
-  public class TextInputEditText extends android.support.v7.widget.AppCompatEditText {
-    ctor public TextInputEditText(android.content.Context);
-    ctor public TextInputEditText(android.content.Context, android.util.AttributeSet);
-    ctor public TextInputEditText(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class TextInputLayout extends android.widget.LinearLayout {
-    ctor public TextInputLayout(android.content.Context);
-    ctor public TextInputLayout(android.content.Context, android.util.AttributeSet);
-    ctor public TextInputLayout(android.content.Context, android.util.AttributeSet, int);
-    method public int getCounterMaxLength();
-    method public android.widget.EditText getEditText();
-    method public java.lang.CharSequence getError();
-    method public java.lang.CharSequence getHint();
-    method public android.graphics.Typeface getTypeface();
-    method public boolean isCounterEnabled();
-    method public boolean isErrorEnabled();
-    method public boolean isHintAnimationEnabled();
-    method public boolean isHintEnabled();
-    method public android.os.Parcelable onSaveInstanceState();
-    method public void setCounterEnabled(boolean);
-    method public void setCounterMaxLength(int);
-    method public void setError(java.lang.CharSequence);
-    method public void setErrorEnabled(boolean);
-    method public void setHint(java.lang.CharSequence);
-    method public void setHintAnimationEnabled(boolean);
-    method public void setHintEnabled(boolean);
-    method public void setHintTextAppearance(int);
-    method public void setTypeface(android.graphics.Typeface);
-  }
-
-   class ViewOffsetBehavior extends android.support.design.widget.CoordinatorLayout.Behavior {
-    ctor public ViewOffsetBehavior();
-    ctor public ViewOffsetBehavior(android.content.Context, android.util.AttributeSet);
-    method public int getLeftAndRightOffset();
-    method public int getTopAndBottomOffset();
-    method protected void layoutChild(android.support.design.widget.CoordinatorLayout, V, int);
-    method public boolean setLeftAndRightOffset(int);
-    method public boolean setTopAndBottomOffset(int);
-  }
-
-   class VisibilityAwareImageButton extends android.widget.ImageButton {
-    ctor public VisibilityAwareImageButton(android.content.Context);
-    ctor public VisibilityAwareImageButton(android.content.Context, android.util.AttributeSet);
-    ctor public VisibilityAwareImageButton(android.content.Context, android.util.AttributeSet, int);
-  }
-
-}
-
diff --git a/design/api/removed.txt b/design/api/removed.txt
deleted file mode 100644
index e69de29..0000000
--- a/design/api/removed.txt
+++ /dev/null
diff --git a/design/build.gradle b/design/build.gradle
index 7148e50..b949d61 100644
--- a/design/build.gradle
+++ b/design/build.gradle
@@ -23,7 +23,7 @@
     compileSdkVersion project.ext.currentSdk
 
     defaultConfig {
-        minSdkVersion 7
+        minSdkVersion 9
         testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
         // This disables the builds tools automatic vector -> PNG generation
         generatedDensities = []
@@ -31,7 +31,7 @@
 
     sourceSets {
         main.manifest.srcFile 'AndroidManifest.xml'
-        main.java.srcDirs = ['base', 'eclair-mr1', 'honeycomb', 'honeycomb-mr1', 'ics', 'lollipop', 'src']
+        main.java.srcDirs = ['base', 'gingerbread', 'honeycomb', 'honeycomb-mr1', 'ics', 'lollipop', 'src']
         main.res.srcDirs 'res', 'res-public'
         main.assets.srcDir 'assets'
         main.resources.srcDir 'src'
diff --git a/design/eclair-mr1/android/support/design/widget/FloatingActionButtonEclairMr1.java b/design/eclair-mr1/android/support/design/widget/FloatingActionButtonEclairMr1.java
deleted file mode 100644
index 54e99e0..0000000
--- a/design/eclair-mr1/android/support/design/widget/FloatingActionButtonEclairMr1.java
+++ /dev/null
@@ -1,287 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.design.widget;
-
-import android.content.res.ColorStateList;
-import android.graphics.Color;
-import android.graphics.PorterDuff;
-import android.graphics.Rect;
-import android.graphics.drawable.Drawable;
-import android.graphics.drawable.GradientDrawable;
-import android.graphics.drawable.LayerDrawable;
-import android.support.annotation.Nullable;
-import android.support.design.R;
-import android.support.design.widget.AnimationUtils.AnimationListenerAdapter;
-import android.support.v4.graphics.drawable.DrawableCompat;
-import android.view.View;
-import android.view.animation.Animation;
-import android.view.animation.Transformation;
-
-class FloatingActionButtonEclairMr1 extends FloatingActionButtonImpl {
-
-    private int mAnimationDuration;
-    private StateListAnimator mStateListAnimator;
-    private boolean mIsHiding;
-
-    ShadowDrawableWrapper mShadowDrawable;
-
-    FloatingActionButtonEclairMr1(VisibilityAwareImageButton view,
-            ShadowViewDelegate shadowViewDelegate) {
-        super(view, shadowViewDelegate);
-
-        mAnimationDuration = view.getResources().getInteger(android.R.integer.config_shortAnimTime);
-
-        mStateListAnimator = new StateListAnimator();
-        mStateListAnimator.setTarget(view);
-
-        // Elevate with translationZ when pressed or focused
-        mStateListAnimator.addState(PRESSED_ENABLED_STATE_SET,
-                setupAnimation(new ElevateToTranslationZAnimation()));
-        mStateListAnimator.addState(FOCUSED_ENABLED_STATE_SET,
-                setupAnimation(new ElevateToTranslationZAnimation()));
-        // Reset back to elevation by default
-        mStateListAnimator.addState(EMPTY_STATE_SET,
-                setupAnimation(new ResetElevationAnimation()));
-    }
-
-    @Override
-    void setBackgroundDrawable(ColorStateList backgroundTint,
-            PorterDuff.Mode backgroundTintMode, int rippleColor, int borderWidth) {
-        // Now we need to tint the original background with the tint, using
-        // an InsetDrawable if we have a border width
-        mShapeDrawable = DrawableCompat.wrap(createShapeDrawable());
-        DrawableCompat.setTintList(mShapeDrawable, backgroundTint);
-        if (backgroundTintMode != null) {
-            DrawableCompat.setTintMode(mShapeDrawable, backgroundTintMode);
-        }
-
-        // Now we created a mask Drawable which will be used for touch feedback.
-        GradientDrawable touchFeedbackShape = createShapeDrawable();
-
-        // We'll now wrap that touch feedback mask drawable with a ColorStateList. We do not need
-        // to inset for any border here as LayerDrawable will nest the padding for us
-        mRippleDrawable = DrawableCompat.wrap(touchFeedbackShape);
-        DrawableCompat.setTintList(mRippleDrawable, createColorStateList(rippleColor));
-
-        final Drawable[] layers;
-        if (borderWidth > 0) {
-            mBorderDrawable = createBorderDrawable(borderWidth, backgroundTint);
-            layers = new Drawable[] {mBorderDrawable, mShapeDrawable, mRippleDrawable};
-        } else {
-            mBorderDrawable = null;
-            layers = new Drawable[] {mShapeDrawable, mRippleDrawable};
-        }
-
-        mContentBackground = new LayerDrawable(layers);
-
-        mShadowDrawable = new ShadowDrawableWrapper(
-                mView.getResources(),
-                mContentBackground,
-                mShadowViewDelegate.getRadius(),
-                mElevation,
-                mElevation + mPressedTranslationZ);
-        mShadowDrawable.setAddPaddingForCorners(false);
-        mShadowViewDelegate.setBackgroundDrawable(mShadowDrawable);
-    }
-
-    @Override
-    void setBackgroundTintList(ColorStateList tint) {
-        if (mShapeDrawable != null) {
-            DrawableCompat.setTintList(mShapeDrawable, tint);
-        }
-        if (mBorderDrawable != null) {
-            mBorderDrawable.setBorderTint(tint);
-        }
-    }
-
-    @Override
-    void setBackgroundTintMode(PorterDuff.Mode tintMode) {
-        if (mShapeDrawable != null) {
-            DrawableCompat.setTintMode(mShapeDrawable, tintMode);
-        }
-    }
-
-    @Override
-    void setRippleColor(int rippleColor) {
-        if (mRippleDrawable != null) {
-            DrawableCompat.setTintList(mRippleDrawable, createColorStateList(rippleColor));
-        }
-    }
-
-    @Override
-    float getElevation() {
-        return mElevation;
-    }
-
-    @Override
-    void onElevationChanged(float elevation) {
-        if (mShadowDrawable != null) {
-            mShadowDrawable.setShadowSize(elevation, elevation + mPressedTranslationZ);
-            updatePadding();
-        }
-    }
-
-    @Override
-    void onTranslationZChanged(float translationZ) {
-        if (mShadowDrawable != null) {
-            mShadowDrawable.setMaxShadowSize(mElevation + translationZ);
-            updatePadding();
-        }
-    }
-
-    @Override
-    void onDrawableStateChanged(int[] state) {
-        mStateListAnimator.setState(state);
-    }
-
-    @Override
-    void jumpDrawableToCurrentState() {
-        mStateListAnimator.jumpToCurrentState();
-    }
-
-    @Override
-    void hide(@Nullable final InternalVisibilityChangedListener listener, final boolean fromUser) {
-        if (mIsHiding || mView.getVisibility() != View.VISIBLE) {
-            // A hide animation is in progress, or we're already hidden. Skip the call
-            if (listener != null) {
-                listener.onHidden();
-            }
-            return;
-        }
-
-        Animation anim = android.view.animation.AnimationUtils.loadAnimation(
-                mView.getContext(), R.anim.design_fab_out);
-        anim.setInterpolator(AnimationUtils.FAST_OUT_LINEAR_IN_INTERPOLATOR);
-        anim.setDuration(SHOW_HIDE_ANIM_DURATION);
-        anim.setAnimationListener(new AnimationUtils.AnimationListenerAdapter() {
-            @Override
-            public void onAnimationStart(Animation animation) {
-                mIsHiding = true;
-            }
-
-            @Override
-            public void onAnimationEnd(Animation animation) {
-                mIsHiding = false;
-                mView.internalSetVisibility(View.GONE, fromUser);
-                if (listener != null) {
-                    listener.onHidden();
-                }
-            }
-        });
-        mView.startAnimation(anim);
-    }
-
-    @Override
-    void show(@Nullable final InternalVisibilityChangedListener listener, final boolean fromUser) {
-        if (mView.getVisibility() != View.VISIBLE || mIsHiding) {
-            // If the view is not visible, or is visible and currently being hidden, run
-            // the show animation
-            mView.clearAnimation();
-            mView.internalSetVisibility(View.VISIBLE, fromUser);
-            Animation anim = android.view.animation.AnimationUtils.loadAnimation(
-                    mView.getContext(), R.anim.design_fab_in);
-            anim.setDuration(SHOW_HIDE_ANIM_DURATION);
-            anim.setInterpolator(AnimationUtils.LINEAR_OUT_SLOW_IN_INTERPOLATOR);
-            anim.setAnimationListener(new AnimationListenerAdapter() {
-                @Override
-                public void onAnimationEnd(Animation animation) {
-                    if (listener != null) {
-                        listener.onShown();
-                    }
-                }
-            });
-            mView.startAnimation(anim);
-        } else {
-            if (listener != null) {
-                listener.onShown();
-            }
-        }
-    }
-
-    @Override
-    void onCompatShadowChanged() {
-        // Ignore pre-v21
-    }
-
-    void getPadding(Rect rect) {
-        mShadowDrawable.getPadding(rect);
-    }
-
-    private Animation setupAnimation(Animation animation) {
-        animation.setInterpolator(AnimationUtils.FAST_OUT_SLOW_IN_INTERPOLATOR);
-        animation.setDuration(mAnimationDuration);
-        return animation;
-    }
-
-    private abstract class BaseShadowAnimation extends Animation {
-        private float mShadowSizeStart;
-        private float mShadowSizeDiff;
-
-        @Override
-        public void reset() {
-            super.reset();
-
-            mShadowSizeStart = mShadowDrawable.getShadowSize();
-            mShadowSizeDiff = getTargetShadowSize() - mShadowSizeStart;
-        }
-
-        @Override
-        protected void applyTransformation(float interpolatedTime, Transformation t) {
-            mShadowDrawable.setShadowSize(mShadowSizeStart + (mShadowSizeDiff * interpolatedTime));
-        }
-
-        /**
-         * @return the shadow size we want to animate to.
-         */
-        protected abstract float getTargetShadowSize();
-    }
-
-    private class ResetElevationAnimation extends BaseShadowAnimation {
-        @Override
-        protected float getTargetShadowSize() {
-            return mElevation;
-        }
-    }
-
-    private class ElevateToTranslationZAnimation extends BaseShadowAnimation {
-        @Override
-        protected float getTargetShadowSize() {
-            return mElevation + mPressedTranslationZ;
-        }
-    }
-
-    private static ColorStateList createColorStateList(int selectedColor) {
-        final int[][] states = new int[3][];
-        final int[] colors = new int[3];
-        int i = 0;
-
-        states[i] = FOCUSED_ENABLED_STATE_SET;
-        colors[i] = selectedColor;
-        i++;
-
-        states[i] = PRESSED_ENABLED_STATE_SET;
-        colors[i] = selectedColor;
-        i++;
-
-        // Default enabled state
-        states[i] = new int[0];
-        colors[i] = Color.TRANSPARENT;
-        i++;
-
-        return new ColorStateList(states, colors);
-    }
-}
\ No newline at end of file
diff --git a/design/eclair-mr1/android/support/design/widget/ValueAnimatorCompatImplEclairMr1.java b/design/eclair-mr1/android/support/design/widget/ValueAnimatorCompatImplEclairMr1.java
deleted file mode 100644
index 55d816a..0000000
--- a/design/eclair-mr1/android/support/design/widget/ValueAnimatorCompatImplEclairMr1.java
+++ /dev/null
@@ -1,194 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.design.widget;
-
-import android.os.Handler;
-import android.os.Looper;
-import android.os.SystemClock;
-import android.view.animation.AccelerateDecelerateInterpolator;
-import android.view.animation.Interpolator;
-
-/**
- * A 'fake' ValueAnimator implementation which uses a Runnable.
- */
-class ValueAnimatorCompatImplEclairMr1 extends ValueAnimatorCompat.Impl {
-
-    private static final int HANDLER_DELAY = 10;
-    private static final int DEFAULT_DURATION = 200;
-
-    private static final Handler sHandler = new Handler(Looper.getMainLooper());
-
-    private long mStartTime;
-    private boolean mIsRunning;
-
-    private final int[] mIntValues = new int[2];
-    private final float[] mFloatValues = new float[2];
-
-    private long mDuration = DEFAULT_DURATION;
-    private Interpolator mInterpolator;
-    private AnimatorListenerProxy mListener;
-    private AnimatorUpdateListenerProxy mUpdateListener;
-
-    private float mAnimatedFraction;
-
-    @Override
-    public void start() {
-        if (mIsRunning) {
-            // If we're already running, ignore
-            return;
-        }
-
-        if (mInterpolator == null) {
-            mInterpolator = new AccelerateDecelerateInterpolator();
-        }
-
-        mStartTime = SystemClock.uptimeMillis();
-        mIsRunning = true;
-
-        // Reset the animated fraction
-        mAnimatedFraction = 0f;
-
-        if (mListener != null) {
-            mListener.onAnimationStart();
-        }
-
-        sHandler.postDelayed(mRunnable, HANDLER_DELAY);
-    }
-
-    @Override
-    public boolean isRunning() {
-        return mIsRunning;
-    }
-
-    @Override
-    public void setInterpolator(Interpolator interpolator) {
-        mInterpolator = interpolator;
-    }
-
-    @Override
-    public void setListener(AnimatorListenerProxy listener) {
-        mListener = listener;
-    }
-
-    @Override
-    public void setUpdateListener(AnimatorUpdateListenerProxy updateListener) {
-        mUpdateListener = updateListener;
-    }
-
-    @Override
-    public void setIntValues(int from, int to) {
-        mIntValues[0] = from;
-        mIntValues[1] = to;
-    }
-
-    @Override
-    public int getAnimatedIntValue() {
-        return AnimationUtils.lerp(mIntValues[0], mIntValues[1], getAnimatedFraction());
-    }
-
-    @Override
-    public void setFloatValues(float from, float to) {
-        mFloatValues[0] = from;
-        mFloatValues[1] = to;
-    }
-
-    @Override
-    public float getAnimatedFloatValue() {
-        return AnimationUtils.lerp(mFloatValues[0], mFloatValues[1], getAnimatedFraction());
-    }
-
-    @Override
-    public void setDuration(long duration) {
-        mDuration = duration;
-    }
-
-    @Override
-    public void cancel() {
-        mIsRunning = false;
-        sHandler.removeCallbacks(mRunnable);
-
-        if (mListener != null) {
-            mListener.onAnimationCancel();
-            mListener.onAnimationEnd();
-        }
-    }
-
-    @Override
-    public float getAnimatedFraction() {
-        return mAnimatedFraction;
-    }
-
-    @Override
-    public void end() {
-        if (mIsRunning) {
-            mIsRunning = false;
-            sHandler.removeCallbacks(mRunnable);
-
-            // Set our animated fraction to 1
-            mAnimatedFraction = 1f;
-
-            if (mUpdateListener != null) {
-                mUpdateListener.onAnimationUpdate();
-            }
-
-            if (mListener != null) {
-                mListener.onAnimationEnd();
-            }
-        }
-    }
-
-    @Override
-    public long getDuration() {
-        return mDuration;
-    }
-
-    private void update() {
-        if (mIsRunning) {
-            // Update the animated fraction
-            final long elapsed = SystemClock.uptimeMillis() - mStartTime;
-            final float linearFraction = MathUtils.constrain(elapsed / (float) mDuration, 0f, 1f);
-            mAnimatedFraction = mInterpolator != null
-                    ? mInterpolator.getInterpolation(linearFraction)
-                    : linearFraction;
-
-            // If we're running, dispatch tp the listener
-            if (mUpdateListener != null) {
-                mUpdateListener.onAnimationUpdate();
-            }
-
-            // Check to see if we've passed the animation duration
-            if (SystemClock.uptimeMillis() >= (mStartTime + mDuration)) {
-                mIsRunning = false;
-
-                if (mListener != null) {
-                    mListener.onAnimationEnd();
-                }
-            }
-        }
-
-        if (mIsRunning) {
-            // If we're still running, post another delayed runnable
-            sHandler.postDelayed(mRunnable, HANDLER_DELAY);
-        }
-    }
-
-    private final Runnable mRunnable = new Runnable() {
-        public void run() {
-            update();
-        }
-    };
-}
diff --git a/design/gingerbread/android/support/design/widget/FloatingActionButtonGingerbread.java b/design/gingerbread/android/support/design/widget/FloatingActionButtonGingerbread.java
new file mode 100644
index 0000000..a6fa8d7
--- /dev/null
+++ b/design/gingerbread/android/support/design/widget/FloatingActionButtonGingerbread.java
@@ -0,0 +1,288 @@
+/*
+ * Copyright (C) 2015 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 android.support.design.widget;
+
+import android.content.res.ColorStateList;
+import android.graphics.Color;
+import android.graphics.PorterDuff;
+import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.GradientDrawable;
+import android.graphics.drawable.LayerDrawable;
+import android.support.annotation.Nullable;
+import android.support.design.R;
+import android.support.design.widget.AnimationUtils.AnimationListenerAdapter;
+import android.support.v4.graphics.drawable.DrawableCompat;
+import android.view.View;
+import android.view.animation.Animation;
+import android.view.animation.Transformation;
+
+class FloatingActionButtonGingerbread extends FloatingActionButtonImpl {
+
+    private int mAnimationDuration;
+    private StateListAnimator mStateListAnimator;
+    private boolean mIsHiding;
+
+    ShadowDrawableWrapper mShadowDrawable;
+
+    FloatingActionButtonGingerbread(VisibilityAwareImageButton view,
+            ShadowViewDelegate shadowViewDelegate) {
+        super(view, shadowViewDelegate);
+
+        mAnimationDuration = view.getResources().getInteger(android.R.integer.config_shortAnimTime);
+
+        mStateListAnimator = new StateListAnimator();
+        mStateListAnimator.setTarget(view);
+
+        // Elevate with translationZ when pressed or focused
+        mStateListAnimator.addState(PRESSED_ENABLED_STATE_SET,
+                setupAnimation(new ElevateToTranslationZAnimation()));
+        mStateListAnimator.addState(FOCUSED_ENABLED_STATE_SET,
+                setupAnimation(new ElevateToTranslationZAnimation()));
+        // Reset back to elevation by default
+        mStateListAnimator.addState(EMPTY_STATE_SET,
+                setupAnimation(new ResetElevationAnimation()));
+    }
+
+    @Override
+    void setBackgroundDrawable(ColorStateList backgroundTint,
+            PorterDuff.Mode backgroundTintMode, int rippleColor, int borderWidth) {
+        // Now we need to tint the original background with the tint, using
+        // an InsetDrawable if we have a border width
+        mShapeDrawable = DrawableCompat.wrap(createShapeDrawable());
+        DrawableCompat.setTintList(mShapeDrawable, backgroundTint);
+        if (backgroundTintMode != null) {
+            DrawableCompat.setTintMode(mShapeDrawable, backgroundTintMode);
+        }
+
+        // Now we created a mask Drawable which will be used for touch feedback.
+        GradientDrawable touchFeedbackShape = createShapeDrawable();
+
+        // We'll now wrap that touch feedback mask drawable with a ColorStateList. We do not need
+        // to inset for any border here as LayerDrawable will nest the padding for us
+        mRippleDrawable = DrawableCompat.wrap(touchFeedbackShape);
+        DrawableCompat.setTintList(mRippleDrawable, createColorStateList(rippleColor));
+
+        final Drawable[] layers;
+        if (borderWidth > 0) {
+            mBorderDrawable = createBorderDrawable(borderWidth, backgroundTint);
+            layers = new Drawable[] {mBorderDrawable, mShapeDrawable, mRippleDrawable};
+        } else {
+            mBorderDrawable = null;
+            layers = new Drawable[] {mShapeDrawable, mRippleDrawable};
+        }
+
+        mContentBackground = new LayerDrawable(layers);
+
+        mShadowDrawable = new ShadowDrawableWrapper(
+                mView.getResources(),
+                mContentBackground,
+                mShadowViewDelegate.getRadius(),
+                mElevation,
+                mElevation + mPressedTranslationZ);
+        mShadowDrawable.setAddPaddingForCorners(false);
+        mShadowViewDelegate.setBackgroundDrawable(mShadowDrawable);
+    }
+
+    @Override
+    void setBackgroundTintList(ColorStateList tint) {
+        if (mShapeDrawable != null) {
+            DrawableCompat.setTintList(mShapeDrawable, tint);
+        }
+        if (mBorderDrawable != null) {
+            mBorderDrawable.setBorderTint(tint);
+        }
+    }
+
+    @Override
+    void setBackgroundTintMode(PorterDuff.Mode tintMode) {
+        if (mShapeDrawable != null) {
+            DrawableCompat.setTintMode(mShapeDrawable, tintMode);
+        }
+    }
+
+    @Override
+    void setRippleColor(int rippleColor) {
+        if (mRippleDrawable != null) {
+            DrawableCompat.setTintList(mRippleDrawable, createColorStateList(rippleColor));
+        }
+    }
+
+    @Override
+    float getElevation() {
+        return mElevation;
+    }
+
+    @Override
+    void onElevationChanged(float elevation) {
+        if (mShadowDrawable != null) {
+            mShadowDrawable.setShadowSize(elevation, elevation + mPressedTranslationZ);
+            updatePadding();
+        }
+    }
+
+    @Override
+    void onTranslationZChanged(float translationZ) {
+        if (mShadowDrawable != null) {
+            mShadowDrawable.setMaxShadowSize(mElevation + translationZ);
+            updatePadding();
+        }
+    }
+
+    @Override
+    void onDrawableStateChanged(int[] state) {
+        mStateListAnimator.setState(state);
+    }
+
+    @Override
+    void jumpDrawableToCurrentState() {
+        mStateListAnimator.jumpToCurrentState();
+    }
+
+    @Override
+    void hide(@Nullable final InternalVisibilityChangedListener listener, final boolean fromUser) {
+        if (mIsHiding || mView.getVisibility() != View.VISIBLE) {
+            // A hide animation is in progress, or we're already hidden. Skip the call
+            if (listener != null) {
+                listener.onHidden();
+            }
+            return;
+        }
+
+        Animation anim = android.view.animation.AnimationUtils.loadAnimation(
+                mView.getContext(), R.anim.design_fab_out);
+        anim.setInterpolator(AnimationUtils.FAST_OUT_LINEAR_IN_INTERPOLATOR);
+        anim.setDuration(SHOW_HIDE_ANIM_DURATION);
+        anim.setAnimationListener(new AnimationUtils.AnimationListenerAdapter() {
+            @Override
+            public void onAnimationStart(Animation animation) {
+                mIsHiding = true;
+            }
+
+            @Override
+            public void onAnimationEnd(Animation animation) {
+                mIsHiding = false;
+                mView.internalSetVisibility(View.GONE, fromUser);
+                if (listener != null) {
+                    listener.onHidden();
+                }
+            }
+        });
+        mView.startAnimation(anim);
+    }
+
+    @Override
+    void show(@Nullable final InternalVisibilityChangedListener listener, final boolean fromUser) {
+        if (mView.getVisibility() != View.VISIBLE || mIsHiding) {
+            // If the view is not visible, or is visible and currently being hidden, run
+            // the show animation
+            mView.clearAnimation();
+            mView.internalSetVisibility(View.VISIBLE, fromUser);
+            Animation anim = android.view.animation.AnimationUtils.loadAnimation(
+                    mView.getContext(), R.anim.design_fab_in);
+            anim.setDuration(SHOW_HIDE_ANIM_DURATION);
+            anim.setInterpolator(AnimationUtils.LINEAR_OUT_SLOW_IN_INTERPOLATOR);
+            anim.setAnimationListener(new AnimationListenerAdapter() {
+                @Override
+                public void onAnimationEnd(Animation animation) {
+                    if (listener != null) {
+                        listener.onShown();
+                    }
+                }
+            });
+            mView.startAnimation(anim);
+        } else {
+            if (listener != null) {
+                listener.onShown();
+            }
+        }
+    }
+
+    @Override
+    void onCompatShadowChanged() {
+        // Ignore pre-v21
+    }
+
+    @Override
+    void getPadding(Rect rect) {
+        mShadowDrawable.getPadding(rect);
+    }
+
+    private Animation setupAnimation(Animation animation) {
+        animation.setInterpolator(AnimationUtils.FAST_OUT_SLOW_IN_INTERPOLATOR);
+        animation.setDuration(mAnimationDuration);
+        return animation;
+    }
+
+    private abstract class BaseShadowAnimation extends Animation {
+        private float mShadowSizeStart;
+        private float mShadowSizeDiff;
+
+        @Override
+        public void reset() {
+            super.reset();
+
+            mShadowSizeStart = mShadowDrawable.getShadowSize();
+            mShadowSizeDiff = getTargetShadowSize() - mShadowSizeStart;
+        }
+
+        @Override
+        protected void applyTransformation(float interpolatedTime, Transformation t) {
+            mShadowDrawable.setShadowSize(mShadowSizeStart + (mShadowSizeDiff * interpolatedTime));
+        }
+
+        /**
+         * @return the shadow size we want to animate to.
+         */
+        protected abstract float getTargetShadowSize();
+    }
+
+    private class ResetElevationAnimation extends BaseShadowAnimation {
+        @Override
+        protected float getTargetShadowSize() {
+            return mElevation;
+        }
+    }
+
+    private class ElevateToTranslationZAnimation extends BaseShadowAnimation {
+        @Override
+        protected float getTargetShadowSize() {
+            return mElevation + mPressedTranslationZ;
+        }
+    }
+
+    private static ColorStateList createColorStateList(int selectedColor) {
+        final int[][] states = new int[3][];
+        final int[] colors = new int[3];
+        int i = 0;
+
+        states[i] = FOCUSED_ENABLED_STATE_SET;
+        colors[i] = selectedColor;
+        i++;
+
+        states[i] = PRESSED_ENABLED_STATE_SET;
+        colors[i] = selectedColor;
+        i++;
+
+        // Default enabled state
+        states[i] = new int[0];
+        colors[i] = Color.TRANSPARENT;
+        i++;
+
+        return new ColorStateList(states, colors);
+    }
+}
\ No newline at end of file
diff --git a/design/gingerbread/android/support/design/widget/ValueAnimatorCompatImplGingerbread.java b/design/gingerbread/android/support/design/widget/ValueAnimatorCompatImplGingerbread.java
new file mode 100644
index 0000000..438fe8a
--- /dev/null
+++ b/design/gingerbread/android/support/design/widget/ValueAnimatorCompatImplGingerbread.java
@@ -0,0 +1,195 @@
+/*
+ * Copyright (C) 2015 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 android.support.design.widget;
+
+import android.os.Handler;
+import android.os.Looper;
+import android.os.SystemClock;
+import android.view.animation.AccelerateDecelerateInterpolator;
+import android.view.animation.Interpolator;
+
+/**
+ * A 'fake' ValueAnimator implementation which uses a Runnable.
+ */
+class ValueAnimatorCompatImplGingerbread extends ValueAnimatorCompat.Impl {
+
+    private static final int HANDLER_DELAY = 10;
+    private static final int DEFAULT_DURATION = 200;
+
+    private static final Handler sHandler = new Handler(Looper.getMainLooper());
+
+    private long mStartTime;
+    private boolean mIsRunning;
+
+    private final int[] mIntValues = new int[2];
+    private final float[] mFloatValues = new float[2];
+
+    private long mDuration = DEFAULT_DURATION;
+    private Interpolator mInterpolator;
+    private AnimatorListenerProxy mListener;
+    private AnimatorUpdateListenerProxy mUpdateListener;
+
+    private float mAnimatedFraction;
+
+    @Override
+    public void start() {
+        if (mIsRunning) {
+            // If we're already running, ignore
+            return;
+        }
+
+        if (mInterpolator == null) {
+            mInterpolator = new AccelerateDecelerateInterpolator();
+        }
+
+        mStartTime = SystemClock.uptimeMillis();
+        mIsRunning = true;
+
+        // Reset the animated fraction
+        mAnimatedFraction = 0f;
+
+        if (mListener != null) {
+            mListener.onAnimationStart();
+        }
+
+        sHandler.postDelayed(mRunnable, HANDLER_DELAY);
+    }
+
+    @Override
+    public boolean isRunning() {
+        return mIsRunning;
+    }
+
+    @Override
+    public void setInterpolator(Interpolator interpolator) {
+        mInterpolator = interpolator;
+    }
+
+    @Override
+    public void setListener(AnimatorListenerProxy listener) {
+        mListener = listener;
+    }
+
+    @Override
+    public void setUpdateListener(AnimatorUpdateListenerProxy updateListener) {
+        mUpdateListener = updateListener;
+    }
+
+    @Override
+    public void setIntValues(int from, int to) {
+        mIntValues[0] = from;
+        mIntValues[1] = to;
+    }
+
+    @Override
+    public int getAnimatedIntValue() {
+        return AnimationUtils.lerp(mIntValues[0], mIntValues[1], getAnimatedFraction());
+    }
+
+    @Override
+    public void setFloatValues(float from, float to) {
+        mFloatValues[0] = from;
+        mFloatValues[1] = to;
+    }
+
+    @Override
+    public float getAnimatedFloatValue() {
+        return AnimationUtils.lerp(mFloatValues[0], mFloatValues[1], getAnimatedFraction());
+    }
+
+    @Override
+    public void setDuration(long duration) {
+        mDuration = duration;
+    }
+
+    @Override
+    public void cancel() {
+        mIsRunning = false;
+        sHandler.removeCallbacks(mRunnable);
+
+        if (mListener != null) {
+            mListener.onAnimationCancel();
+            mListener.onAnimationEnd();
+        }
+    }
+
+    @Override
+    public float getAnimatedFraction() {
+        return mAnimatedFraction;
+    }
+
+    @Override
+    public void end() {
+        if (mIsRunning) {
+            mIsRunning = false;
+            sHandler.removeCallbacks(mRunnable);
+
+            // Set our animated fraction to 1
+            mAnimatedFraction = 1f;
+
+            if (mUpdateListener != null) {
+                mUpdateListener.onAnimationUpdate();
+            }
+
+            if (mListener != null) {
+                mListener.onAnimationEnd();
+            }
+        }
+    }
+
+    @Override
+    public long getDuration() {
+        return mDuration;
+    }
+
+    private void update() {
+        if (mIsRunning) {
+            // Update the animated fraction
+            final long elapsed = SystemClock.uptimeMillis() - mStartTime;
+            final float linearFraction = MathUtils.constrain(elapsed / (float) mDuration, 0f, 1f);
+            mAnimatedFraction = mInterpolator != null
+                    ? mInterpolator.getInterpolation(linearFraction)
+                    : linearFraction;
+
+            // If we're running, dispatch tp the listener
+            if (mUpdateListener != null) {
+                mUpdateListener.onAnimationUpdate();
+            }
+
+            // Check to see if we've passed the animation duration
+            if (SystemClock.uptimeMillis() >= (mStartTime + mDuration)) {
+                mIsRunning = false;
+
+                if (mListener != null) {
+                    mListener.onAnimationEnd();
+                }
+            }
+        }
+
+        if (mIsRunning) {
+            // If we're still running, post another delayed runnable
+            sHandler.postDelayed(mRunnable, HANDLER_DELAY);
+        }
+    }
+
+    private final Runnable mRunnable = new Runnable() {
+        @Override
+        public void run() {
+            update();
+        }
+    };
+}
diff --git a/design/ics/android/support/design/widget/FloatingActionButtonIcs.java b/design/ics/android/support/design/widget/FloatingActionButtonIcs.java
index 4c256bc..25dd270 100644
--- a/design/ics/android/support/design/widget/FloatingActionButtonIcs.java
+++ b/design/ics/android/support/design/widget/FloatingActionButtonIcs.java
@@ -22,7 +22,7 @@
 import android.support.v4.view.ViewCompat;
 import android.view.View;
 
-class FloatingActionButtonIcs extends FloatingActionButtonEclairMr1 {
+class FloatingActionButtonIcs extends FloatingActionButtonGingerbread {
 
     private boolean mIsHiding;
 
diff --git a/design/lollipop/android/support/design/widget/CoordinatorLayoutInsetsHelperLollipop.java b/design/lollipop/android/support/design/widget/CoordinatorLayoutInsetsHelperLollipop.java
index 6615050..7f673c7 100644
--- a/design/lollipop/android/support/design/widget/CoordinatorLayoutInsetsHelperLollipop.java
+++ b/design/lollipop/android/support/design/widget/CoordinatorLayoutInsetsHelperLollipop.java
@@ -22,6 +22,7 @@
 
 class CoordinatorLayoutInsetsHelperLollipop implements CoordinatorLayoutInsetsHelper {
 
+    @Override
     public void setupForWindowInsets(View view, OnApplyWindowInsetsListener insetsListener) {
         if (ViewCompat.getFitsSystemWindows(view)) {
             // First apply the insets listener
diff --git a/design/lollipop/android/support/design/widget/FloatingActionButtonLollipop.java b/design/lollipop/android/support/design/widget/FloatingActionButtonLollipop.java
index 2b85845..89d78b7 100644
--- a/design/lollipop/android/support/design/widget/FloatingActionButtonLollipop.java
+++ b/design/lollipop/android/support/design/widget/FloatingActionButtonLollipop.java
@@ -156,6 +156,7 @@
         return new CircularBorderDrawableLollipop();
     }
 
+    @Override
     void getPadding(Rect rect) {
         if (mShadowViewDelegate.isCompatPaddingEnabled()) {
             final float radius = mShadowViewDelegate.getRadius();
diff --git a/design/res/values/attrs.xml b/design/res/values/attrs.xml
index 73f46d0..fc233da 100644
--- a/design/res/values/attrs.xml
+++ b/design/res/values/attrs.xml
@@ -42,6 +42,11 @@
         <attr name="useCompatPadding" format="boolean"/>
     </declare-styleable>
 
+    <declare-styleable name="FloatingActionButton_Behavior_Layout">
+        <!-- Whether the FAB should automatically hide when there is no space for it. -->
+        <attr name="behavior_autoHide" format="boolean"/>
+    </declare-styleable>
+
     <declare-styleable name="ScrimInsetsFrameLayout">
         <attr name="insetForeground" format="color|reference"/>
     </declare-styleable>
diff --git a/design/src/android/support/design/widget/AppBarLayout.java b/design/src/android/support/design/widget/AppBarLayout.java
index 841018f..560d467 100644
--- a/design/src/android/support/design/widget/AppBarLayout.java
+++ b/design/src/android/support/design/widget/AppBarLayout.java
@@ -43,6 +43,8 @@
 import java.util.ArrayList;
 import java.util.List;
 
+import static android.support.design.widget.ViewUtils.objectEquals;
+
 /**
  * AppBarLayout is a vertical {@link LinearLayout} which implements many of the features of
  * material designs app bar concept, namely scrolling gestures.
@@ -514,7 +516,7 @@
     /**
      * @deprecated target elevation is now deprecated. AppBarLayout's elevation is now
      * controlled via a {@link android.animation.StateListAnimator}. If a target
-     * elevation is set, either by this method or the {@code app:elevation} attibute,
+     * elevation is set, either by this method or the {@code app:elevation} attribute,
      * a new state list animator is created which uses the given {@code elevation} value.
      *
      * @attr ref android.support.design.R.styleable#AppBarLayout_elevation
@@ -558,7 +560,7 @@
         }
 
         // If our insets have changed, keep them and invalidate the scroll ranges...
-        if (newInsets != mLastInsets) {
+        if (!objectEquals(mLastInsets, newInsets)) {
             mLastInsets = newInsets;
             invalidateScrollRanges();
         }
@@ -857,7 +859,7 @@
                         0, -velocityY);
             } else {
                 // If we're scrolling up and the child also consumed the fling. We'll fake scroll
-                // upto our 'collapsed' offset
+                // up to our 'collapsed' offset
                 if (velocityY < 0) {
                     // We're scrolling down
                     final int targetScroll = -child.getTotalScrollRange()
@@ -1247,9 +1249,9 @@
                 if (child.getTop() + offset <= 0 && visBottom >= 0) {
                     final SavedState ss = new SavedState(superState);
                     ss.firstVisibleChildIndex = i;
-                    ss.firstVisibileChildAtMinimumHeight =
+                    ss.firstVisibleChildAtMinimumHeight =
                             visBottom == ViewCompat.getMinimumHeight(child);
-                    ss.firstVisibileChildPercentageShown = visBottom / (float) child.getHeight();
+                    ss.firstVisibleChildPercentageShown = visBottom / (float) child.getHeight();
                     return ss;
                 }
             }
@@ -1265,8 +1267,8 @@
                 final SavedState ss = (SavedState) state;
                 super.onRestoreInstanceState(parent, appBarLayout, ss.getSuperState());
                 mOffsetToChildIndexOnLayout = ss.firstVisibleChildIndex;
-                mOffsetToChildIndexOnLayoutPerc = ss.firstVisibileChildPercentageShown;
-                mOffsetToChildIndexOnLayoutIsMinHeight = ss.firstVisibileChildAtMinimumHeight;
+                mOffsetToChildIndexOnLayoutPerc = ss.firstVisibleChildPercentageShown;
+                mOffsetToChildIndexOnLayoutIsMinHeight = ss.firstVisibleChildAtMinimumHeight;
             } else {
                 super.onRestoreInstanceState(parent, appBarLayout, state);
                 mOffsetToChildIndexOnLayout = INVALID_POSITION;
@@ -1275,14 +1277,14 @@
 
         protected static class SavedState extends AbsSavedState {
             int firstVisibleChildIndex;
-            float firstVisibileChildPercentageShown;
-            boolean firstVisibileChildAtMinimumHeight;
+            float firstVisibleChildPercentageShown;
+            boolean firstVisibleChildAtMinimumHeight;
 
             public SavedState(Parcel source, ClassLoader loader) {
                 super(source, loader);
                 firstVisibleChildIndex = source.readInt();
-                firstVisibileChildPercentageShown = source.readFloat();
-                firstVisibileChildAtMinimumHeight = source.readByte() != 0;
+                firstVisibleChildPercentageShown = source.readFloat();
+                firstVisibleChildAtMinimumHeight = source.readByte() != 0;
             }
 
             public SavedState(Parcelable superState) {
@@ -1293,8 +1295,8 @@
             public void writeToParcel(Parcel dest, int flags) {
                 super.writeToParcel(dest, flags);
                 dest.writeInt(firstVisibleChildIndex);
-                dest.writeFloat(firstVisibileChildPercentageShown);
-                dest.writeByte((byte) (firstVisibileChildAtMinimumHeight ? 1 : 0));
+                dest.writeFloat(firstVisibleChildPercentageShown);
+                dest.writeByte((byte) (firstVisibleChildAtMinimumHeight ? 1 : 0));
             }
 
             public static final Parcelable.Creator<SavedState> CREATOR =
diff --git a/design/src/android/support/design/widget/BottomSheetBehavior.java b/design/src/android/support/design/widget/BottomSheetBehavior.java
index b9a7a0f..68d8e52 100644
--- a/design/src/android/support/design/widget/BottomSheetBehavior.java
+++ b/design/src/android/support/design/widget/BottomSheetBehavior.java
@@ -68,8 +68,10 @@
          * Called when the bottom sheet is being dragged.
          *
          * @param bottomSheet The bottom sheet view.
-         * @param slideOffset The new offset of this bottom sheet within its range, from 0 to 1
-         *                    when it is moving upward, and from 0 to -1 when it moving downward.
+         * @param slideOffset The new offset of this bottom sheet within [-1,1] range. Offset
+         *                    increases as this bottom sheet is moving upward. From 0 to 1 the sheet
+         *                    is between collapsed and expanded states and from -1 to 0 it is
+         *                    between hidden and collapsed states.
          */
         public abstract void onSlide(@NonNull View bottomSheet, float slideOffset);
     }
diff --git a/design/src/android/support/design/widget/CollapsingTextHelper.java b/design/src/android/support/design/widget/CollapsingTextHelper.java
index 4a95a13..79ff63d 100644
--- a/design/src/android/support/design/widget/CollapsingTextHelper.java
+++ b/design/src/android/support/design/widget/CollapsingTextHelper.java
@@ -458,7 +458,7 @@
             }
 
             if (DEBUG_DRAW) {
-                // Just a debug tool, which drawn a Magneta rect in the text bounds
+                // Just a debug tool, which drawn a magenta rect in the text bounds
                 canvas.drawRect(mCurrentBounds.left, y + ascent, mCurrentBounds.right, y + descent,
                         DEBUG_DRAW_PAINT);
             }
@@ -507,26 +507,27 @@
     private void calculateUsingTextSize(final float textSize) {
         if (mText == null) return;
 
+        final float collapsedWidth = mCollapsedBounds.width();
+        final float expandedWidth = mExpandedBounds.width();
+
         final float availableWidth;
         final float newTextSize;
         boolean updateDrawText = false;
 
         if (isClose(textSize, mCollapsedTextSize)) {
-            availableWidth = mCollapsedBounds.width();
             newTextSize = mCollapsedTextSize;
             mScale = 1f;
             if (mCurrentTypeface != mCollapsedTypeface) {
                 mCurrentTypeface = mCollapsedTypeface;
                 updateDrawText = true;
             }
+            availableWidth = collapsedWidth;
         } else {
-            availableWidth = mExpandedBounds.width();
             newTextSize = mExpandedTextSize;
             if (mCurrentTypeface != mExpandedTypeface) {
                 mCurrentTypeface = mExpandedTypeface;
                 updateDrawText = true;
             }
-
             if (isClose(textSize, mExpandedTextSize)) {
                 // If we're close to the expanded text size, snap to it and use a scale of 1
                 mScale = 1f;
@@ -534,6 +535,21 @@
                 // Else, we'll scale down from the expanded text size
                 mScale = textSize / mExpandedTextSize;
             }
+
+            final float textSizeRatio = mCollapsedTextSize / mExpandedTextSize;
+            // This is the size of the expanded bounds when it is scaled to match the
+            // collapsed text size
+            final float scaledDownWidth = expandedWidth * textSizeRatio;
+
+            if (scaledDownWidth > collapsedWidth) {
+                // If the scaled down size is larger than the actual collapsed width, we need to
+                // cap the available width so that when the expanded text scales down, it matches
+                // the collapsed width
+                availableWidth = Math.min(collapsedWidth / textSizeRatio, expandedWidth);
+            } else {
+                // Otherwise we'll just use the expanded width
+                availableWidth = expandedWidth;
+            }
         }
 
         if (availableWidth > 0) {
diff --git a/design/src/android/support/design/widget/CollapsingToolbarLayout.java b/design/src/android/support/design/widget/CollapsingToolbarLayout.java
index 2181a1c..b54c0f7 100644
--- a/design/src/android/support/design/widget/CollapsingToolbarLayout.java
+++ b/design/src/android/support/design/widget/CollapsingToolbarLayout.java
@@ -48,6 +48,8 @@
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 
+import static android.support.design.widget.ViewUtils.objectEquals;
+
 /**
  * CollapsingToolbarLayout is a wrapper for {@link Toolbar} which implements a collapsing app bar.
  * It is designed to be used as a direct child of a {@link AppBarLayout}.
@@ -217,7 +219,7 @@
                     @Override
                     public WindowInsetsCompat onApplyWindowInsets(View v,
                             WindowInsetsCompat insets) {
-                        return setWindowInsets(insets);
+                        return onWindowInsetChanged(insets);
                     }
                 });
     }
@@ -250,12 +252,21 @@
         super.onDetachedFromWindow();
     }
 
-    private WindowInsetsCompat setWindowInsets(WindowInsetsCompat insets) {
-        if (mLastInsets != insets) {
-            mLastInsets = insets;
+    private WindowInsetsCompat onWindowInsetChanged(final WindowInsetsCompat insets) {
+        WindowInsetsCompat newInsets = null;
+
+        if (ViewCompat.getFitsSystemWindows(this)) {
+            // If we're set to fit system windows, keep the insets
+            newInsets = insets;
+        }
+
+        // If our insets have changed, keep them and invalidate the scroll ranges...
+        if (!objectEquals(mLastInsets, newInsets)) {
+            mLastInsets = newInsets;
             requestLayout();
         }
-        return insets.consumeSystemWindowInsets();
+
+        return insets;
     }
 
     @Override
@@ -996,7 +1007,7 @@
     public void setScrimVisibleHeightTrigger(@IntRange(from = 0) final int height) {
         if (mScrimVisibleHeightTrigger != height) {
             mScrimVisibleHeightTrigger = height;
-            // Update the scrim visibilty
+            // Update the scrim visibility
             updateScrimVisibility();
         }
     }
@@ -1009,7 +1020,7 @@
      */
     public int getScrimVisibleHeightTrigger() {
         if (mScrimVisibleHeightTrigger >= 0) {
-            // If we have one explictly set, return it
+            // If we have one explicitly set, return it
             return mScrimVisibleHeightTrigger;
         }
 
diff --git a/design/src/android/support/design/widget/CoordinatorLayout.java b/design/src/android/support/design/widget/CoordinatorLayout.java
index b86a977..304cc5c 100644
--- a/design/src/android/support/design/widget/CoordinatorLayout.java
+++ b/design/src/android/support/design/widget/CoordinatorLayout.java
@@ -65,6 +65,8 @@
 import java.util.List;
 import java.util.Map;
 
+import static android.support.design.widget.ViewUtils.objectEquals;
+
 /**
  * CoordinatorLayout is a super-powered {@link android.widget.FrameLayout FrameLayout}.
  *
@@ -332,7 +334,7 @@
     }
 
     private WindowInsetsCompat setWindowInsets(WindowInsetsCompat insets) {
-        if (mLastInsets != insets) {
+        if (!objectEquals(mLastInsets, insets)) {
             mLastInsets = insets;
             mDrawStatusBarBackground = insets != null && insets.getSystemWindowInsetTop() > 0;
             setWillNotDraw(!mDrawStatusBarBackground && getBackground() == null);
@@ -882,17 +884,8 @@
         }
     }
 
-    /**
-     * Calculate the desired child rect relative to an anchor rect, respecting both
-     * gravity and anchorGravity.
-     *
-     * @param child child view to calculate a rect for
-     * @param layoutDirection the desired layout direction for the CoordinatorLayout
-     * @param anchorRect rect in CoordinatorLayout coordinates of the anchor view area
-     * @param out rect to set to the output values
-     */
-    void getDesiredAnchoredChildRect(View child, int layoutDirection, Rect anchorRect, Rect out) {
-        final LayoutParams lp = (LayoutParams) child.getLayoutParams();
+    private void getDesiredAnchoredChildRectWithoutConstraints(View child, int layoutDirection,
+            Rect anchorRect, Rect out, LayoutParams lp, int childWidth, int childHeight) {
         final int absGravity = GravityCompat.getAbsoluteGravity(
                 resolveAnchoredChildGravity(lp.gravity), layoutDirection);
         final int absAnchorGravity = GravityCompat.getAbsoluteGravity(
@@ -904,9 +897,6 @@
         final int anchorHgrav = absAnchorGravity & Gravity.HORIZONTAL_GRAVITY_MASK;
         final int anchorVgrav = absAnchorGravity & Gravity.VERTICAL_GRAVITY_MASK;
 
-        final int childWidth = child.getMeasuredWidth();
-        final int childHeight = child.getMeasuredHeight();
-
         int left;
         int top;
 
@@ -966,21 +956,43 @@
                 break;
         }
 
+        out.set(left, top, left + childWidth, top + childHeight);
+    }
+
+    private void constrainChildRect(LayoutParams lp, Rect out, int childWidth, int childHeight) {
         final int width = getWidth();
         final int height = getHeight();
 
         // Obey margins and padding
-        left = Math.max(getPaddingLeft() + lp.leftMargin,
-                Math.min(left,
+        int left = Math.max(getPaddingLeft() + lp.leftMargin,
+                Math.min(out.left,
                         width - getPaddingRight() - childWidth - lp.rightMargin));
-        top = Math.max(getPaddingTop() + lp.topMargin,
-                Math.min(top,
+        int top = Math.max(getPaddingTop() + lp.topMargin,
+                Math.min(out.top,
                         height - getPaddingBottom() - childHeight - lp.bottomMargin));
 
         out.set(left, top, left + childWidth, top + childHeight);
     }
 
     /**
+     * Calculate the desired child rect relative to an anchor rect, respecting both
+     * gravity and anchorGravity.
+     *
+     * @param child child view to calculate a rect for
+     * @param layoutDirection the desired layout direction for the CoordinatorLayout
+     * @param anchorRect rect in CoordinatorLayout coordinates of the anchor view area
+     * @param out rect to set to the output values
+     */
+    void getDesiredAnchoredChildRect(View child, int layoutDirection, Rect anchorRect, Rect out) {
+        final LayoutParams lp = (LayoutParams) child.getLayoutParams();
+        final int childWidth = child.getMeasuredWidth();
+        final int childHeight = child.getMeasuredHeight();
+        getDesiredAnchoredChildRectWithoutConstraints(child, layoutDirection, anchorRect, out, lp,
+                childWidth, childHeight);
+        constrainChildRect(lp, out, childWidth, childHeight);
+    }
+
+    /**
      * CORE ASSUMPTION: anchor has been laid out by the time this is called for a given child view.
      *
      * @param child child to lay out
@@ -1381,7 +1393,14 @@
 
             getDescendantRect(lp.mAnchorView, anchorRect);
             getChildRect(child, false, childRect);
-            getDesiredAnchoredChildRect(child, layoutDirection, anchorRect, desiredChildRect);
+
+            int childWidth = child.getMeasuredWidth();
+            int childHeight = child.getMeasuredHeight();
+            getDesiredAnchoredChildRectWithoutConstraints(child, layoutDirection, anchorRect,
+                    desiredChildRect, lp, childWidth, childHeight);
+            boolean changed = desiredChildRect.left != childRect.left ||
+                    desiredChildRect.top != childRect.top;
+            constrainChildRect(lp, desiredChildRect, childWidth, childHeight);
 
             final int dx = desiredChildRect.left - childRect.left;
             final int dy = desiredChildRect.top - childRect.top;
@@ -1393,7 +1412,7 @@
                 child.offsetTopAndBottom(dy);
             }
 
-            if (dx != 0 || dy != 0) {
+            if (changed) {
                 // If we have needed to move, make sure to notify the child's Behavior
                 final Behavior b = lp.getBehavior();
                 if (b != null) {
@@ -1464,6 +1483,7 @@
         return p instanceof LayoutParams && super.checkLayoutParams(p);
     }
 
+    @Override
     public boolean onStartNestedScroll(View child, View target, int nestedScrollAxes) {
         boolean handled = false;
 
@@ -1485,6 +1505,7 @@
         return handled;
     }
 
+    @Override
     public void onNestedScrollAccepted(View child, View target, int nestedScrollAxes) {
         mNestedScrollingParentHelper.onNestedScrollAccepted(child, target, nestedScrollAxes);
         mNestedScrollingDirectChild = child;
@@ -1505,6 +1526,7 @@
         }
     }
 
+    @Override
     public void onStopNestedScroll(View target) {
         mNestedScrollingParentHelper.onStopNestedScroll(target);
 
@@ -1528,6 +1550,7 @@
         mNestedScrollingTarget = null;
     }
 
+    @Override
     public void onNestedScroll(View target, int dxConsumed, int dyConsumed,
             int dxUnconsumed, int dyUnconsumed) {
         final int childCount = getChildCount();
@@ -1553,6 +1576,7 @@
         }
     }
 
+    @Override
     public void onNestedPreScroll(View target, int dx, int dy, int[] consumed) {
         int xConsumed = 0;
         int yConsumed = 0;
@@ -1588,6 +1612,7 @@
         }
     }
 
+    @Override
     public boolean onNestedFling(View target, float velocityX, float velocityY, boolean consumed) {
         boolean handled = false;
 
@@ -1611,6 +1636,7 @@
         return handled;
     }
 
+    @Override
     public boolean onNestedPreFling(View target, float velocityX, float velocityY) {
         boolean handled = false;
 
@@ -1630,6 +1656,7 @@
         return handled;
     }
 
+    @Override
     public int getNestedScrollAxes() {
         return mNestedScrollingParentHelper.getNestedScrollAxes();
     }
diff --git a/design/src/android/support/design/widget/DrawableUtils.java b/design/src/android/support/design/widget/DrawableUtils.java
index 1c46e6b..1e2e6cf 100644
--- a/design/src/android/support/design/widget/DrawableUtils.java
+++ b/design/src/android/support/design/widget/DrawableUtils.java
@@ -34,20 +34,12 @@
     private static Method sSetConstantStateMethod;
     private static boolean sSetConstantStateMethodFetched;
 
-    private static Field sDrawableContainerStateField;
-    private static boolean sDrawableContainerStateFieldFetched;
-
     private DrawableUtils() {}
 
     static boolean setContainerConstantState(DrawableContainer drawable,
             Drawable.ConstantState constantState) {
-        if (Build.VERSION.SDK_INT >= 9) {
-            // We can use getDeclaredMethod() on v9+
-            return setContainerConstantStateV9(drawable, constantState);
-        } else {
-            // Else we'll just have to set the field directly
-            return setContainerConstantStateV7(drawable, constantState);
-        }
+        // We can use getDeclaredMethod() on v9+
+        return setContainerConstantStateV9(drawable, constantState);
     }
 
     private static boolean setContainerConstantStateV9(DrawableContainer drawable,
@@ -72,28 +64,4 @@
         }
         return false;
     }
-
-    private static boolean setContainerConstantStateV7(DrawableContainer drawable,
-            Drawable.ConstantState constantState) {
-        if (!sDrawableContainerStateFieldFetched) {
-            try {
-                sDrawableContainerStateField = DrawableContainer.class
-                        .getDeclaredField("mDrawableContainerStateField");
-                sDrawableContainerStateField.setAccessible(true);
-            } catch (NoSuchFieldException e) {
-                Log.e(LOG_TAG, "Could not fetch mDrawableContainerStateField. Oh well.");
-            }
-            sDrawableContainerStateFieldFetched = true;
-        }
-        if (sDrawableContainerStateField != null) {
-            try {
-                sDrawableContainerStateField.set(drawable, constantState);
-                return true;
-            } catch (Exception e) {
-                Log.e(LOG_TAG, "Could not set mDrawableContainerStateField. Oh well.");
-            }
-        }
-        return false;
-    }
-
 }
diff --git a/design/src/android/support/design/widget/FloatingActionButton.java b/design/src/android/support/design/widget/FloatingActionButton.java
index d3b8c19..f75bc1a 100644
--- a/design/src/android/support/design/widget/FloatingActionButton.java
+++ b/design/src/android/support/design/widget/FloatingActionButton.java
@@ -30,6 +30,7 @@
 import android.support.annotation.IntDef;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
+import android.support.annotation.VisibleForTesting;
 import android.support.design.R;
 import android.support.design.widget.FloatingActionButtonImpl.InternalVisibilityChangedListener;
 import android.support.v4.content.res.ConfigurationHelper;
@@ -546,16 +547,48 @@
         // because we can use view translation properties which greatly simplifies the code.
         private static final boolean SNACKBAR_BEHAVIOR_ENABLED = Build.VERSION.SDK_INT >= 11;
 
+        private static final boolean AUTO_HIDE_DEFAULT = true;
+
         private ValueAnimatorCompat mFabTranslationYAnimator;
         private float mFabTranslationY;
         private Rect mTmpRect;
+        private OnVisibilityChangedListener mInternalAutoHideListener;
+        private boolean mAutoHide;
 
         public Behavior() {
             super();
+            mAutoHide = AUTO_HIDE_DEFAULT;
         }
 
         public Behavior(Context context, AttributeSet attrs) {
             super(context, attrs);
+            TypedArray a = context.obtainStyledAttributes(attrs,
+                    R.styleable.FloatingActionButton_Behavior_Layout);
+            mAutoHide = a.getBoolean(
+                    R.styleable.FloatingActionButton_Behavior_Layout_behavior_autoHide,
+                    AUTO_HIDE_DEFAULT);
+            a.recycle();
+        }
+
+        /**
+         * Sets whether this FAB should automatically hide when there is not enough space. This
+         * works with {@link AppBarLayout} and {@link BottomSheetBehavior}.
+         *
+         * @attr ref android.support.design.R.styleable#FloatingActionButton_Behavior_Layout_behavior_autoHide
+         * @param autoHide {@code true} to hide automatically.
+         */
+        public void setAutoHide(boolean autoHide) {
+            mAutoHide = autoHide;
+        }
+
+        /**
+         * Returns whether this FAB automatically hides when there is not enough space.
+         *
+         * @attr ref android.support.design.R.styleable#FloatingActionButton_Behavior_Layout_behavior_autoHide
+         * @return {@code true} if it hides automatically.
+         */
+        public boolean getAutoHide() {
+            return mAutoHide;
         }
 
         @Override
@@ -573,7 +606,9 @@
             } else if (dependency instanceof AppBarLayout) {
                 // If we're depending on an AppBarLayout we will show/hide it automatically
                 // if the FAB is anchored to the AppBarLayout
-                updateFabVisibility(parent, (AppBarLayout) dependency, child);
+                updateFabVisibilityForAppBarLayout(parent, (AppBarLayout) dependency, child);
+            } else if (isBottomSheet(dependency)) {
+                updateFabVisibilityForBottomSheet(dependency, child);
             }
             return false;
         }
@@ -586,21 +621,45 @@
             }
         }
 
-        private boolean updateFabVisibility(CoordinatorLayout parent,
-                AppBarLayout appBarLayout, FloatingActionButton child) {
+        private static boolean isBottomSheet(View view) {
+            CoordinatorLayout.LayoutParams lp =
+                    (CoordinatorLayout.LayoutParams) view.getLayoutParams();
+            return lp != null && lp.getBehavior() instanceof BottomSheetBehavior;
+        }
+
+        @VisibleForTesting
+        void setInternalAutoHideListener(OnVisibilityChangedListener listener) {
+            mInternalAutoHideListener = listener;
+        }
+
+        private boolean shouldUpdateVisibility(View dependency, FloatingActionButton child) {
             final CoordinatorLayout.LayoutParams lp =
                     (CoordinatorLayout.LayoutParams) child.getLayoutParams();
-            if (lp.getAnchorId() != appBarLayout.getId()) {
+            if (!mAutoHide) {
+                return false;
+            }
+
+            if (lp.getAnchorId() != dependency.getId()) {
                 // The anchor ID doesn't match the dependency, so we won't automatically
                 // show/hide the FAB
                 return false;
             }
 
+            //noinspection RedundantIfStatement
             if (child.getUserSetVisibility() != VISIBLE) {
                 // The view isn't set to be visible so skip changing its visibility
                 return false;
             }
 
+            return true;
+        }
+
+        private boolean updateFabVisibilityForAppBarLayout(CoordinatorLayout parent,
+                AppBarLayout appBarLayout, FloatingActionButton child) {
+            if (!shouldUpdateVisibility(appBarLayout, child)) {
+                return false;
+            }
+
             if (mTmpRect == null) {
                 mTmpRect = new Rect();
             }
@@ -611,10 +670,25 @@
 
             if (rect.bottom <= appBarLayout.getMinimumHeightForVisibleOverlappingContent()) {
                 // If the anchor's bottom is below the seam, we'll animate our FAB out
-                child.hide(null, false);
+                child.hide(mInternalAutoHideListener, false);
             } else {
                 // Else, we'll animate our FAB back in
-                child.show(null, false);
+                child.show(mInternalAutoHideListener, false);
+            }
+            return true;
+        }
+
+        private boolean updateFabVisibilityForBottomSheet(View bottomSheet,
+                FloatingActionButton child) {
+            if (!shouldUpdateVisibility(bottomSheet, child)) {
+                return false;
+            }
+            CoordinatorLayout.LayoutParams lp =
+                    (CoordinatorLayout.LayoutParams) child.getLayoutParams();
+            if (bottomSheet.getTop() < child.getHeight() / 2 + lp.topMargin) {
+                child.hide(mInternalAutoHideListener, false);
+            } else {
+                child.show(mInternalAutoHideListener, false);
             }
             return true;
         }
@@ -683,9 +757,15 @@
             final List<View> dependencies = parent.getDependencies(child);
             for (int i = 0, count = dependencies.size(); i < count; i++) {
                 final View dependency = dependencies.get(i);
-                if (dependency instanceof AppBarLayout
-                        && updateFabVisibility(parent, (AppBarLayout) dependency, child)) {
-                    break;
+                if (dependency instanceof AppBarLayout) {
+                    if (updateFabVisibilityForAppBarLayout(
+                            parent, (AppBarLayout) dependency, child)) {
+                        break;
+                    }
+                } else if (isBottomSheet(dependency)) {
+                    if (updateFabVisibilityForBottomSheet(dependency, child)) {
+                        break;
+                    }
                 }
             }
             // Now let the CoordinatorLayout lay out the FAB
@@ -769,7 +849,7 @@
         } else if (sdk >= 14) {
             return new FloatingActionButtonIcs(this, new ShadowDelegateImpl());
         } else {
-            return new FloatingActionButtonEclairMr1(this, new ShadowDelegateImpl());
+            return new FloatingActionButtonGingerbread(this, new ShadowDelegateImpl());
         }
     }
 
diff --git a/design/src/android/support/design/widget/HeaderBehavior.java b/design/src/android/support/design/widget/HeaderBehavior.java
index 9924d48..7dd2700 100644
--- a/design/src/android/support/design/widget/HeaderBehavior.java
+++ b/design/src/android/support/design/widget/HeaderBehavior.java
@@ -71,7 +71,7 @@
                 final int y = (int) ev.getY();
                 if (canDragView(child) && parent.isPointInChildBounds(child, x, y)) {
                     mLastMotionY = y;
-                    mActivePointerId = MotionEventCompat.getPointerId(ev, 0);
+                    mActivePointerId = ev.getPointerId(0);
                     ensureVelocityTracker();
                 }
                 break;
@@ -83,12 +83,12 @@
                     // If we don't have a valid id, the touch down wasn't on content.
                     break;
                 }
-                final int pointerIndex = MotionEventCompat.findPointerIndex(ev, activePointerId);
+                final int pointerIndex = ev.findPointerIndex(activePointerId);
                 if (pointerIndex == -1) {
                     break;
                 }
 
-                final int y = (int) MotionEventCompat.getY(ev, pointerIndex);
+                final int y = (int) ev.getY(pointerIndex);
                 final int yDiff = Math.abs(y - mLastMotionY);
                 if (yDiff > mTouchSlop) {
                     mIsBeingDragged = true;
@@ -129,7 +129,7 @@
 
                 if (parent.isPointInChildBounds(child, x, y) && canDragView(child)) {
                     mLastMotionY = y;
-                    mActivePointerId = MotionEventCompat.getPointerId(ev, 0);
+                    mActivePointerId = ev.getPointerId(0);
                     ensureVelocityTracker();
                 } else {
                     return false;
@@ -138,13 +138,12 @@
             }
 
             case MotionEvent.ACTION_MOVE: {
-                final int activePointerIndex = MotionEventCompat.findPointerIndex(ev,
-                        mActivePointerId);
+                final int activePointerIndex = ev.findPointerIndex(mActivePointerId);
                 if (activePointerIndex == -1) {
                     return false;
                 }
 
-                final int y = (int) MotionEventCompat.getY(ev, activePointerIndex);
+                final int y = (int) ev.getY(activePointerIndex);
                 int dy = mLastMotionY - y;
 
                 if (!mIsBeingDragged && Math.abs(dy) > mTouchSlop) {
diff --git a/design/src/android/support/design/widget/TextInputLayout.java b/design/src/android/support/design/widget/TextInputLayout.java
index 2bb959c..171b62b 100644
--- a/design/src/android/support/design/widget/TextInputLayout.java
+++ b/design/src/android/support/design/widget/TextInputLayout.java
@@ -25,7 +25,6 @@
 import android.graphics.Typeface;
 import android.graphics.drawable.Drawable;
 import android.graphics.drawable.DrawableContainer;
-import android.graphics.drawable.InsetDrawable;
 import android.os.Build;
 import android.os.Parcel;
 import android.os.Parcelable;
@@ -34,7 +33,7 @@
 import android.support.annotation.StyleRes;
 import android.support.design.R;
 import android.support.v4.content.ContextCompat;
-import android.support.v4.graphics.drawable.DrawableWrapper;
+import android.support.v4.graphics.drawable.DrawableCompat;
 import android.support.v4.os.ParcelableCompat;
 import android.support.v4.os.ParcelableCompatCreatorCallbacks;
 import android.support.v4.view.AbsSavedState;
@@ -725,36 +724,11 @@
         } else {
             // Else reset the color filter and refresh the drawable state so that the
             // normal tint is used
-            clearColorFilter(editTextBackground);
+            DrawableCompat.clearColorFilter(editTextBackground);
             mEditText.refreshDrawableState();
         }
     }
 
-    private static void clearColorFilter(@NonNull Drawable drawable) {
-        drawable.clearColorFilter();
-
-        if (Build.VERSION.SDK_INT == 21 || Build.VERSION.SDK_INT == 22) {
-            // API 21 + 22 have an issue where clearing a color filter on a DrawableContainer
-            // will not propagate to all of its children. To workaround this we unwrap the drawable
-            // to find any DrawableContainers, and then unwrap those to clear the filter on its
-            // children manually
-            if (drawable instanceof InsetDrawable) {
-                clearColorFilter(((InsetDrawable) drawable).getDrawable());
-            } else if (drawable instanceof DrawableWrapper) {
-                clearColorFilter(((DrawableWrapper) drawable).getWrappedDrawable());
-            } else if (drawable instanceof DrawableContainer) {
-                final DrawableContainer container = (DrawableContainer) drawable;
-                final DrawableContainer.DrawableContainerState state =
-                        (DrawableContainer.DrawableContainerState) container.getConstantState();
-                if (state != null) {
-                    for (int i = 0, count = state.getChildCount(); i < count; i++) {
-                        clearColorFilter(state.getChild(i));
-                    }
-                }
-            }
-        }
-    }
-
     private void ensureBackgroundDrawableStateWorkaround() {
         final int sdk = Build.VERSION.SDK_INT;
         if (sdk != 21 && sdk != 22) {
@@ -768,7 +742,7 @@
 
         if (!mHasReconstructedEditTextBackground) {
             // This is gross. There is an issue in the platform which affects container Drawables
-            // where the first drawable retrieved from resources will propogate any changes
+            // where the first drawable retrieved from resources will propagate any changes
             // (like color filter) to all instances from the cache. We'll try to workaround it...
 
             final Drawable newBg = bg.getConstantState().newDrawable();
diff --git a/design/src/android/support/design/widget/ViewUtils.java b/design/src/android/support/design/widget/ViewUtils.java
index c27716c..e2eedb2 100644
--- a/design/src/android/support/design/widget/ViewUtils.java
+++ b/design/src/android/support/design/widget/ViewUtils.java
@@ -26,7 +26,7 @@
         public ValueAnimatorCompat createAnimator() {
             return new ValueAnimatorCompat(Build.VERSION.SDK_INT >= 12
                     ? new ValueAnimatorCompatImplHoneycombMr1()
-                    : new ValueAnimatorCompatImplEclairMr1());
+                    : new ValueAnimatorCompatImplGingerbread());
         }
     };
 
@@ -34,4 +34,8 @@
         return DEFAULT_ANIMATOR_CREATOR.createAnimator();
     }
 
+    static boolean objectEquals(Object a, Object b) {
+        return (a == b) || (a != null && a.equals(b));
+    }
+
 }
diff --git a/design/tests/AndroidManifest.xml b/design/tests/AndroidManifest.xml
index aee8877..f500372 100755
--- a/design/tests/AndroidManifest.xml
+++ b/design/tests/AndroidManifest.xml
@@ -19,7 +19,7 @@
           package="android.support.design.test">
 
     <uses-sdk
-            android:minSdkVersion="7"
+            android:minSdkVersion="9"
             android:targetSdkVersion="23"
             tools:overrideLibrary="android.support.test, android.app, android.support.test.rule,
                       android.support.test.espresso, android.support.test.espresso.idling"/>
diff --git a/design/tests/res/layout/test_design_bottom_sheet_behavior.xml b/design/tests/res/layout/test_design_bottom_sheet_behavior.xml
index 570a7f8..8a2835e 100644
--- a/design/tests/res/layout/test_design_bottom_sheet_behavior.xml
+++ b/design/tests/res/layout/test_design_bottom_sheet_behavior.xml
@@ -33,4 +33,14 @@
 
     </LinearLayout>
 
+    <android.support.design.widget.FloatingActionButton
+            android:id="@+id/fab"
+            android:layout_height="wrap_content"
+            android:layout_width="wrap_content"
+            android:src="@drawable/ic_add"
+            app:layout_anchor="@id/bottom_sheet"
+            app:layout_anchorGravity="top|end"
+            app:useCompatPadding="true"
+            app:backgroundTint="#f00"/>
+
 </android.support.design.widget.CoordinatorLayout>
diff --git a/design/tests/src/android/support/design/widget/BottomSheetBehaviorActivity.java b/design/tests/src/android/support/design/widget/BottomSheetBehaviorActivity.java
index 44fd41b..6e04241 100644
--- a/design/tests/src/android/support/design/widget/BottomSheetBehaviorActivity.java
+++ b/design/tests/src/android/support/design/widget/BottomSheetBehaviorActivity.java
@@ -31,6 +31,8 @@
 
     BottomSheetBehavior mBehavior;
 
+    FloatingActionButton mFab;
+
     @Override
     protected int getContentViewLayoutResId() {
         return R.layout.test_design_bottom_sheet_behavior;
@@ -41,6 +43,7 @@
         mCoordinatorLayout = (CoordinatorLayout) findViewById(R.id.coordinator);
         mBottomSheet = (LinearLayout) findViewById(R.id.bottom_sheet);
         mBehavior = BottomSheetBehavior.from(mBottomSheet);
+        mFab = (FloatingActionButton) findViewById(R.id.fab);
         Intent intent = getIntent();
         if (intent != null) {
             int initialState = intent.getIntExtra(EXTRA_INITIAL_STATE, -1);
diff --git a/design/tests/src/android/support/design/widget/BottomSheetBehaviorTest.java b/design/tests/src/android/support/design/widget/BottomSheetBehaviorTest.java
index bb3b39d..98cfbe8 100644
--- a/design/tests/src/android/support/design/widget/BottomSheetBehaviorTest.java
+++ b/design/tests/src/android/support/design/widget/BottomSheetBehaviorTest.java
@@ -17,6 +17,10 @@
 package android.support.design.widget;
 
 
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.not;
+import static org.hamcrest.MatcherAssert.assertThat;
+
 import android.os.SystemClock;
 import android.support.annotation.LayoutRes;
 import android.support.annotation.NonNull;
@@ -53,10 +57,6 @@
 import org.hamcrest.Matcher;
 import org.junit.Test;
 
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.CoreMatchers.not;
-import static org.hamcrest.MatcherAssert.assertThat;
-
 public class BottomSheetBehaviorTest extends
         BaseInstrumentationTestCase<BottomSheetBehaviorActivity> {
 
@@ -110,6 +110,59 @@
     }
 
     /**
+     * Wait for a FAB to change its visibility (either shown or hidden).
+     */
+    private static class OnVisibilityChangedListener extends
+            FloatingActionButton.OnVisibilityChangedListener implements IdlingResource {
+
+        private final boolean mShown;
+        private boolean mIsIdle;
+        private ResourceCallback mResourceCallback;
+
+        OnVisibilityChangedListener(boolean shown) {
+            mShown = shown;
+        }
+
+        private void transitionToIdle() {
+            if (!mIsIdle) {
+                mIsIdle = true;
+                if (mResourceCallback != null) {
+                    mResourceCallback.onTransitionToIdle();
+                }
+            }
+        }
+
+        @Override
+        public void onShown(FloatingActionButton fab) {
+            if (mShown) {
+                transitionToIdle();
+            }
+        }
+
+        @Override
+        public void onHidden(FloatingActionButton fab) {
+            if (!mShown) {
+                transitionToIdle();
+            }
+        }
+
+        @Override
+        public String getName() {
+            return OnVisibilityChangedListener.class.getSimpleName();
+        }
+
+        @Override
+        public boolean isIdleNow() {
+            return mIsIdle;
+        }
+
+        @Override
+        public void registerIdleTransitionCallback(ResourceCallback resourceCallback) {
+            mResourceCallback = resourceCallback;
+        }
+    }
+
+    /**
      * This is like {@link GeneralSwipeAction}, but it does not send ACTION_UP at the end.
      */
     private static class DragAction implements ViewAction {
@@ -538,6 +591,22 @@
                 });
     }
 
+    @Test
+    public void testFabVisibility() {
+        withFabVisibilityChange(false, new Runnable() {
+            @Override
+            public void run() {
+                checkSetState(BottomSheetBehavior.STATE_EXPANDED, ViewMatchers.isDisplayed());
+            }
+        });
+        withFabVisibilityChange(true, new Runnable() {
+            @Override
+            public void run() {
+                checkSetState(BottomSheetBehavior.STATE_COLLAPSED, ViewMatchers.isDisplayed());
+            }
+        });
+    }
+
     private void checkSetState(final int state, Matcher<View> matcher) {
         registerIdlingResourceCallback();
         try {
@@ -568,6 +637,21 @@
         }
     }
 
+    private void withFabVisibilityChange(boolean shown, Runnable action) {
+        OnVisibilityChangedListener listener = new OnVisibilityChangedListener(shown);
+        CoordinatorLayout.LayoutParams lp =
+                (CoordinatorLayout.LayoutParams) mActivityTestRule.getActivity().mFab
+                        .getLayoutParams();
+        FloatingActionButton.Behavior behavior = (FloatingActionButton.Behavior) lp.getBehavior();
+        behavior.setInternalAutoHideListener(listener);
+        Espresso.registerIdlingResources(listener);
+        try {
+            action.run();
+        } finally {
+            Espresso.unregisterIdlingResources(listener);
+        }
+    }
+
     private ViewGroup getBottomSheet() {
         return mActivityTestRule.getActivity().mBottomSheet;
     }
diff --git a/documents-archive/Android.mk b/documents-archive/Android.mk
index 98d28c3..32ec7d6 100644
--- a/documents-archive/Android.mk
+++ b/documents-archive/Android.mk
@@ -37,13 +37,3 @@
 LOCAL_JAVA_LANGUAGE_VERSION := 1.7
 LOCAL_AAPT_FLAGS := --add-javadoc-annotation doconly
 include $(BUILD_STATIC_JAVA_LIBRARY)
-
-support_module_src_files += $(LOCAL_SRC_FILES)
-
-# API Check
-# ---------------------------------------------
-support_module := $(LOCAL_MODULE)
-support_module_api_dir := $(LOCAL_PATH)/api
-support_module_java_libraries := $(LOCAL_JAVA_LIBRARIES)
-support_module_java_packages := android.support.provider.*
-include $(SUPPORT_API_CHECK)
diff --git a/documents-archive/api/current.txt b/documents-archive/api/current.txt
deleted file mode 100644
index e69de29..0000000
--- a/documents-archive/api/current.txt
+++ /dev/null
diff --git a/documents-archive/api/removed.txt b/documents-archive/api/removed.txt
deleted file mode 100644
index e69de29..0000000
--- a/documents-archive/api/removed.txt
+++ /dev/null
diff --git a/fragment/Android.mk b/fragment/Android.mk
new file mode 100644
index 0000000..7251d9c
--- /dev/null
+++ b/fragment/Android.mk
@@ -0,0 +1,97 @@
+# 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.
+
+LOCAL_PATH := $(call my-dir)
+
+# A helper sub-library that makes direct use of Gingerbread APIs.
+include $(CLEAR_VARS)
+LOCAL_MODULE := android-support-fragment-gingerbread
+LOCAL_SDK_VERSION := 9
+LOCAL_SRC_FILES := $(call all-java-files-under, gingerbread)
+LOCAL_JAVA_LIBRARIES := \
+    android-support-annotations \
+    android-support-compat \
+    android-support-core-utils \
+    android-support-media-compat \
+    android-support-core-ui
+LOCAL_JAVA_LANGUAGE_VERSION := 1.7
+include $(BUILD_STATIC_JAVA_LIBRARY)
+
+# -----------------------------------------------------------------------
+
+# A helper sub-library that makes direct use of Honeycomb APIs.
+include $(CLEAR_VARS)
+LOCAL_MODULE := android-support-fragment-honeycomb
+LOCAL_SDK_VERSION := 11
+LOCAL_SRC_FILES := $(call all-java-files-under, honeycomb)
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-fragment-gingerbread
+LOCAL_JAVA_LANGUAGE_VERSION := 1.7
+include $(BUILD_STATIC_JAVA_LIBRARY)
+
+# -----------------------------------------------------------------------
+
+# A helper sub-library that makes direct use of JellyBean APIs.
+include $(CLEAR_VARS)
+LOCAL_MODULE := android-support-fragment-jellybean
+LOCAL_SDK_VERSION := 16
+LOCAL_SRC_FILES := $(call all-java-files-under, jellybean)
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-fragment-honeycomb
+LOCAL_JAVA_LIBRARIES := \
+    android-support-annotations \
+    android-support-compat \
+    android-support-media-compat \
+    android-support-core-ui \
+    android-support-core-utils
+LOCAL_JAVA_LANGUAGE_VERSION := 1.7
+include $(BUILD_STATIC_JAVA_LIBRARY)
+
+# -----------------------------------------------------------------------
+
+# A helper sub-library that makes direct use of Lollipop APIs.
+include $(CLEAR_VARS)
+LOCAL_MODULE := android-support-fragment-api21
+LOCAL_SDK_VERSION := 21
+LOCAL_SRC_FILES := $(call all-java-files-under, api21)
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-fragment-jellybean
+LOCAL_JAVA_LIBRARIES := \
+    android-support-annotations \
+    android-support-compat \
+    android-support-media-compat \
+    android-support-core-ui \
+    android-support-core-utils
+LOCAL_JAVA_LANGUAGE_VERSION := 1.7
+include $(BUILD_STATIC_JAVA_LIBRARY)
+
+# -----------------------------------------------------------------------
+
+# Here is the final static library that apps can link against.
+include $(CLEAR_VARS)
+LOCAL_USE_AAPT2 := true
+LOCAL_MODULE := android-support-fragment
+LOCAL_SDK_VERSION := 9
+LOCAL_AIDL_INCLUDES := frameworks/support/fragment/java
+LOCAL_SRC_FILES := $(call all-java-files-under, java) \
+    $(call all-Iaidl-files-under, java)
+LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-fragment-api21
+LOCAL_JAVA_LIBRARIES := \
+    android-support-annotations \
+    android-support-compat \
+    android-support-media-compat \
+    android-support-core-ui \
+    android-support-core-utils
+LOCAL_JAR_EXCLUDE_FILES := none
+LOCAL_JAVA_LANGUAGE_VERSION := 1.7
+LOCAL_AAPT_FLAGS := --add-javadoc-annotation doconly
+include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/fragment/AndroidManifest.xml b/fragment/AndroidManifest.xml
new file mode 100644
index 0000000..54e61d3
--- /dev/null
+++ b/fragment/AndroidManifest.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+          xmlns:tools="http://schemas.android.com/tools"
+          package="android.support.fragment">
+    <uses-sdk android:minSdkVersion="9" tools:overrideLibrary="android.support.fragment"/>
+    <application />
+</manifest>
diff --git a/fragment/api21/android/support/v4/app/FragmentTransitionCompat21.java b/fragment/api21/android/support/v4/app/FragmentTransitionCompat21.java
new file mode 100644
index 0000000..49f2ade
--- /dev/null
+++ b/fragment/api21/android/support/v4/app/FragmentTransitionCompat21.java
@@ -0,0 +1,500 @@
+/*
+ * Copyright (C) 2014 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 android.support.v4.app;
+
+import android.graphics.Rect;
+import android.transition.Transition;
+import android.transition.TransitionManager;
+import android.transition.TransitionSet;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.ViewTreeObserver;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+class FragmentTransitionCompat21 {
+    public static String getTransitionName(View view) {
+        return view.getTransitionName();
+    }
+
+    public static Object cloneTransition(Object transition) {
+        if (transition != null) {
+            transition = ((Transition)transition).clone();
+        }
+        return transition;
+    }
+
+    public static Object captureExitingViews(Object exitTransition, View root,
+            ArrayList<View> viewList, Map<String, View> namedViews, View nonExistentView) {
+        if (exitTransition != null) {
+            captureTransitioningViews(viewList, root);
+            if (namedViews != null) {
+                viewList.removeAll(namedViews.values());
+            }
+            if (viewList.isEmpty()) {
+                exitTransition = null;
+            } else {
+                viewList.add(nonExistentView);
+                addTargets((Transition) exitTransition, viewList);
+            }
+        }
+        return exitTransition;
+    }
+
+    public static void excludeTarget(Object transitionObject, View view, boolean exclude) {
+        Transition transition = (Transition) transitionObject;
+        transition.excludeTarget(view, exclude);
+    }
+
+    public static void beginDelayedTransition(ViewGroup sceneRoot, Object transitionObject) {
+        Transition transition = (Transition) transitionObject;
+        TransitionManager.beginDelayedTransition(sceneRoot, transition);
+    }
+
+    public static void setEpicenter(Object transitionObject, View view) {
+        Transition transition = (Transition) transitionObject;
+        final Rect epicenter = getBoundsOnScreen(view);
+
+        transition.setEpicenterCallback(new Transition.EpicenterCallback() {
+            @Override
+            public Rect onGetEpicenter(Transition transition) {
+                return epicenter;
+            }
+        });
+    }
+
+    public static Object wrapSharedElementTransition(Object transitionObj) {
+        if (transitionObj == null) {
+            return null;
+        }
+        Transition transition = (Transition) transitionObj;
+        if (transition == null) {
+            return null;
+        }
+        TransitionSet transitionSet = new TransitionSet();
+        transitionSet.addTransition(transition);
+        return transitionSet;
+    }
+
+    private static void excludeViews(Transition transition, Transition fromTransition,
+            ArrayList<View> views, boolean exclude) {
+        if (transition != null) {
+            final int viewCount = fromTransition == null ? 0 : views.size();
+            for (int i = 0; i < viewCount; i++) {
+                transition.excludeTarget(views.get(i), exclude);
+            }
+        }
+    }
+
+    /**
+     * Exclude (or remove the exclude) of shared element views from the enter and exit transitions.
+     *
+     * @param enterTransitionObj The enter transition
+     * @param exitTransitionObj The exit transition
+     * @param sharedElementTransitionObj The shared element transition
+     * @param views The shared element target views.
+     * @param exclude <code>true</code> to exclude or <code>false</code> to remove the excluded
+     *                views.
+     */
+    public static void excludeSharedElementViews(Object enterTransitionObj,
+            Object exitTransitionObj, Object sharedElementTransitionObj, ArrayList<View> views,
+            boolean exclude) {
+        Transition enterTransition = (Transition) enterTransitionObj;
+        Transition exitTransition = (Transition) exitTransitionObj;
+        Transition sharedElementTransition = (Transition) sharedElementTransitionObj;
+        excludeViews(enterTransition, sharedElementTransition, views, exclude);
+        excludeViews(exitTransition, sharedElementTransition, views, exclude);
+    }
+
+    /**
+     * Prepares the enter transition by adding a non-existent view to the transition's target list
+     * and setting it epicenter callback. By adding a non-existent view to the target list,
+     * we can prevent any view from being targeted at the beginning of the transition.
+     * We will add to the views before the end state of the transition is captured so that the
+     * views will appear. At the start of the transition, we clear the list of targets so that
+     * we can restore the state of the transition and use it again.
+     *
+     * <p>The shared element transition maps its shared elements immediately prior to
+     *  capturing the final state of the Transition.</p>
+     */
+    public static void addTransitionTargets(Object enterTransitionObject,
+            Object sharedElementTransitionObject, Object exitTransitionObject, final View container,
+            final ViewRetriever inFragment, final View nonExistentView,
+            EpicenterView epicenterView, final Map<String, String> nameOverrides,
+            final ArrayList<View> enteringViews, final ArrayList<View> exitingViews,
+            final Map<String, View> namedViews, final Map<String, View> renamedViews,
+            final ArrayList<View> sharedElementTargets) {
+        final Transition enterTransition = (Transition) enterTransitionObject;
+        final Transition exitTransition = (Transition) exitTransitionObject;
+        final Transition sharedElementTransition = (Transition) sharedElementTransitionObject;
+        excludeViews(enterTransition, exitTransition, exitingViews, true);
+        if (enterTransitionObject != null || sharedElementTransitionObject != null) {
+            if (enterTransition != null) {
+                enterTransition.addTarget(nonExistentView);
+            }
+            if (sharedElementTransitionObject != null) {
+                setSharedElementTargets(sharedElementTransition, nonExistentView,
+                        namedViews, sharedElementTargets);
+                excludeViews(enterTransition, sharedElementTransition, sharedElementTargets, true);
+                excludeViews(exitTransition, sharedElementTransition, sharedElementTargets, true);
+            }
+
+            container.getViewTreeObserver().addOnPreDrawListener(
+                    new ViewTreeObserver.OnPreDrawListener() {
+                        @Override
+                        public boolean onPreDraw() {
+                            container.getViewTreeObserver().removeOnPreDrawListener(this);
+                            if (enterTransition != null) {
+                                enterTransition.removeTarget(nonExistentView);
+                            }
+                            if (inFragment != null) {
+                                View fragmentView = inFragment.getView();
+                                if (fragmentView != null) {
+                                    if (!nameOverrides.isEmpty()) {
+                                        findNamedViews(renamedViews, fragmentView);
+                                        renamedViews.keySet().retainAll(nameOverrides.values());
+                                        for (Map.Entry<String, String> entry : nameOverrides
+                                                .entrySet()) {
+                                            String to = entry.getValue();
+                                            View view = renamedViews.get(to);
+                                            if (view != null) {
+                                                String from = entry.getKey();
+                                                view.setTransitionName(from);
+                                            }
+                                        }
+                                    }
+                                    if (enterTransition != null) {
+                                        captureTransitioningViews(enteringViews, fragmentView);
+                                        enteringViews.removeAll(renamedViews.values());
+                                        enteringViews.add(nonExistentView);
+                                        addTargets(enterTransition, enteringViews);
+                                    }
+                                }
+                            }
+                            excludeViews(exitTransition, enterTransition, enteringViews, true);
+
+                            return true;
+                        }
+                    });
+            setSharedElementEpicenter(enterTransition, epicenterView);
+        }
+    }
+
+    public static Object mergeTransitions(Object enterTransitionObject,
+            Object exitTransitionObject, Object sharedElementTransitionObject,
+            boolean allowOverlap) {
+        boolean overlap = true;
+        Transition enterTransition = (Transition) enterTransitionObject;
+        Transition exitTransition = (Transition) exitTransitionObject;
+        Transition sharedElementTransition = (Transition) sharedElementTransitionObject;
+
+        if (enterTransition != null && exitTransition != null) {
+            overlap = allowOverlap;
+        }
+
+        // Wrap the transitions. Explicit targets like in enter and exit will cause the
+        // views to be targeted regardless of excluded views. If that happens, then the
+        // excluded fragments views (hidden fragments) will still be in the transition.
+
+        Transition transition;
+        if (overlap) {
+            // Regular transition -- do it all together
+            TransitionSet transitionSet = new TransitionSet();
+            if (enterTransition != null) {
+                transitionSet.addTransition(enterTransition);
+            }
+            if (exitTransition != null) {
+                transitionSet.addTransition(exitTransition);
+            }
+            if (sharedElementTransition != null) {
+                transitionSet.addTransition(sharedElementTransition);
+            }
+            transition = transitionSet;
+        } else {
+            // First do exit, then enter, but allow shared element transition to happen
+            // during both.
+            Transition staggered = null;
+            if (exitTransition != null && enterTransition != null) {
+                staggered = new TransitionSet()
+                        .addTransition(exitTransition)
+                        .addTransition(enterTransition)
+                        .setOrdering(TransitionSet.ORDERING_SEQUENTIAL);
+            } else if (exitTransition != null) {
+                staggered = exitTransition;
+            } else if (enterTransition != null) {
+                staggered = enterTransition;
+            }
+            if (sharedElementTransition != null) {
+                TransitionSet together = new TransitionSet();
+                if (staggered != null) {
+                    together.addTransition(staggered);
+                }
+                together.addTransition(sharedElementTransition);
+                transition = together;
+            } else {
+                transition = staggered;
+            }
+        }
+        return transition;
+    }
+
+    /**
+     * Finds all children of the shared elements and sets the wrapping TransitionSet
+     * targets to point to those. It also limits transitions that have no targets to the
+     * specific shared elements. This allows developers to target child views of the
+     * shared elements specifically, but this doesn't happen by default.
+     */
+    public static void setSharedElementTargets(Object transitionObj,
+            View nonExistentView, Map<String, View> namedViews,
+            ArrayList<View> sharedElementTargets) {
+        TransitionSet transition = (TransitionSet) transitionObj;
+        sharedElementTargets.clear();
+        sharedElementTargets.addAll(namedViews.values());
+
+        final List<View> views = transition.getTargets();
+        views.clear();
+        final int count = sharedElementTargets.size();
+        for (int i = 0; i < count; i++) {
+            final View view = sharedElementTargets.get(i);
+            bfsAddViewChildren(views, view);
+        }
+        sharedElementTargets.add(nonExistentView);
+        addTargets(transition, sharedElementTargets);
+    }
+
+    /**
+     * Uses a breadth-first scheme to add startView and all of its children to views.
+     * It won't add a child if it is already in views.
+     */
+    private static void bfsAddViewChildren(final List<View> views, final View startView) {
+        final int startIndex = views.size();
+        if (containedBeforeIndex(views, startView, startIndex)) {
+            return; // This child is already in the list, so all its children are also.
+        }
+        views.add(startView);
+        for (int index = startIndex; index < views.size(); index++) {
+            final View view = views.get(index);
+            if (view instanceof ViewGroup) {
+                ViewGroup viewGroup = (ViewGroup) view;
+                final int childCount =  viewGroup.getChildCount();
+                for (int childIndex = 0; childIndex < childCount; childIndex++) {
+                    final View child = viewGroup.getChildAt(childIndex);
+                    if (!containedBeforeIndex(views, child, startIndex)) {
+                        views.add(child);
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * Does a linear search through views for view, limited to maxIndex.
+     */
+    private static boolean containedBeforeIndex(final List<View> views, final View view,
+            final int maxIndex) {
+        for (int i = 0; i < maxIndex; i++) {
+            if (views.get(i) == view) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private static void setSharedElementEpicenter(Transition transition,
+            final EpicenterView epicenterView) {
+        if (transition != null) {
+            transition.setEpicenterCallback(new Transition.EpicenterCallback() {
+                private Rect mEpicenter;
+
+                @Override
+                public Rect onGetEpicenter(Transition transition) {
+                    if (mEpicenter == null && epicenterView.epicenter != null) {
+                        mEpicenter = getBoundsOnScreen(epicenterView.epicenter);
+                    }
+                    return mEpicenter;
+                }
+            });
+        }
+    }
+
+    private static Rect getBoundsOnScreen(View view) {
+        Rect epicenter = new Rect();
+        int[] loc = new int[2];
+        view.getLocationOnScreen(loc);
+        // not as good as View.getBoundsOnScreen, but that's not public
+        epicenter.set(loc[0], loc[1], loc[0] + view.getWidth(), loc[1] + view.getHeight());
+        return epicenter;
+    }
+
+    private static void captureTransitioningViews(ArrayList<View> transitioningViews, View view) {
+        if (view.getVisibility() == View.VISIBLE) {
+            if (view instanceof ViewGroup) {
+                ViewGroup viewGroup = (ViewGroup) view;
+                if (viewGroup.isTransitionGroup()) {
+                    transitioningViews.add(viewGroup);
+                } else {
+                    int count = viewGroup.getChildCount();
+                    for (int i = 0; i < count; i++) {
+                        View child = viewGroup.getChildAt(i);
+                        captureTransitioningViews(transitioningViews, child);
+                    }
+                }
+            } else {
+                transitioningViews.add(view);
+            }
+        }
+    }
+
+    public static void findNamedViews(Map<String, View> namedViews, View view) {
+        if (view.getVisibility() == View.VISIBLE) {
+            String transitionName = view.getTransitionName();
+            if (transitionName != null) {
+                namedViews.put(transitionName, view);
+            }
+            if (view instanceof ViewGroup) {
+                ViewGroup viewGroup = (ViewGroup) view;
+                int count = viewGroup.getChildCount();
+                for (int i = 0; i < count; i++) {
+                    View child = viewGroup.getChildAt(i);
+                    findNamedViews(namedViews, child);
+                }
+            }
+        }
+    }
+
+    public static void cleanupTransitions(final View sceneRoot, final View nonExistentView,
+            Object enterTransitionObject, final ArrayList<View> enteringViews,
+            Object exitTransitionObject, final ArrayList<View> exitingViews,
+            Object sharedElementTransitionObject, final ArrayList<View> sharedElementTargets,
+            Object overallTransitionObject, final ArrayList<View> hiddenViews,
+            final Map<String, View> renamedViews) {
+        final Transition enterTransition = (Transition) enterTransitionObject;
+        final Transition exitTransition = (Transition) exitTransitionObject;
+        final Transition sharedElementTransition = (Transition) sharedElementTransitionObject;
+        final Transition overallTransition = (Transition) overallTransitionObject;
+        if (overallTransition != null) {
+            sceneRoot.getViewTreeObserver().addOnPreDrawListener(
+                    new ViewTreeObserver.OnPreDrawListener() {
+                @Override
+                public boolean onPreDraw() {
+                    sceneRoot.getViewTreeObserver().removeOnPreDrawListener(this);
+                    if (enterTransition != null) {
+                        removeTargets(enterTransition, enteringViews);
+                        excludeViews(enterTransition, exitTransition, exitingViews, false);
+                        excludeViews(enterTransition, sharedElementTransition, sharedElementTargets,
+                                false);
+                    }
+                    if (exitTransition != null) {
+                        removeTargets(exitTransition, exitingViews);
+                        excludeViews(exitTransition, enterTransition, enteringViews, false);
+                        excludeViews(exitTransition, sharedElementTransition, sharedElementTargets,
+                                false);
+                    }
+                    if (sharedElementTransition != null) {
+                        removeTargets(sharedElementTransition, sharedElementTargets);
+                    }
+                    for (Map.Entry<String, View> entry : renamedViews.entrySet()) {
+                        View view = entry.getValue();
+                        String name = entry.getKey();
+                        view.setTransitionName(name);
+                    }
+                    int numViews = hiddenViews.size();
+                    for (int i = 0; i < numViews; i++) {
+                        overallTransition.excludeTarget(hiddenViews.get(i), false);
+                    }
+                    overallTransition.excludeTarget(nonExistentView, false);
+                    return true;
+                }
+            });
+        }
+    }
+
+    /**
+     * This method removes the views from transitions that target ONLY those views.
+     * The views list should match those added in addTargets and should contain
+     * one view that is not in the view hierarchy (state.nonExistentView).
+     */
+    public static void removeTargets(Object transitionObject, ArrayList<View> views) {
+        Transition transition = (Transition) transitionObject;
+        if (transition instanceof TransitionSet) {
+            TransitionSet set = (TransitionSet) transition;
+            int numTransitions = set.getTransitionCount();
+            for (int i = 0; i < numTransitions; i++) {
+                Transition child = set.getTransitionAt(i);
+                removeTargets(child, views);
+            }
+        } else if (!hasSimpleTarget(transition)) {
+            List<View> targets = transition.getTargets();
+            if (targets != null && targets.size() == views.size() &&
+                    targets.containsAll(views)) {
+                // We have an exact match. We must have added these earlier in addTargets
+                for (int i = views.size() - 1; i >= 0; i--) {
+                    transition.removeTarget(views.get(i));
+                }
+            }
+        }
+    }
+
+    /**
+     * This method adds views as targets to the transition, but only if the transition
+     * doesn't already have a target. It is best for views to contain one View object
+     * that does not exist in the view hierarchy (state.nonExistentView) so that
+     * when they are removed later, a list match will suffice to remove the targets.
+     * Otherwise, if you happened to have targeted the exact views for the transition,
+     * the removeTargets call will remove them unexpectedly.
+     */
+    public static void addTargets(Object transitionObject, ArrayList<View> views) {
+        Transition transition = (Transition) transitionObject;
+        if (transition instanceof TransitionSet) {
+            TransitionSet set = (TransitionSet) transition;
+            int numTransitions = set.getTransitionCount();
+            for (int i = 0; i < numTransitions; i++) {
+                Transition child = set.getTransitionAt(i);
+                addTargets(child, views);
+            }
+        } else if (!hasSimpleTarget(transition)) {
+            List<View> targets = transition.getTargets();
+            if (isNullOrEmpty(targets)) {
+                // We can just add the target views
+                int numViews = views.size();
+                for (int i = 0; i < numViews; i++) {
+                    transition.addTarget(views.get(i));
+                }
+            }
+        }
+    }
+
+    private static boolean hasSimpleTarget(Transition transition) {
+        return !isNullOrEmpty(transition.getTargetIds()) ||
+                !isNullOrEmpty(transition.getTargetNames()) ||
+                !isNullOrEmpty(transition.getTargetTypes());
+    }
+
+    private static boolean isNullOrEmpty(List list) {
+        return list == null || list.isEmpty();
+    }
+
+    public interface ViewRetriever {
+        View getView();
+    }
+
+    public static class EpicenterView {
+        public View epicenter;
+    }
+}
diff --git a/fragment/build.gradle b/fragment/build.gradle
new file mode 100644
index 0000000..58cd944
--- /dev/null
+++ b/fragment/build.gradle
@@ -0,0 +1,137 @@
+apply plugin: 'com.android.library'
+archivesBaseName = 'support-fragment'
+
+
+createApiSourceSets(project, gradle.ext.studioCompat.modules.fragment.apiTargets)
+dependencies {
+    compile project(':support-compat')
+    compile project(':support-media-compat')
+    compile project(':support-core-ui')
+    compile project(':support-core-utils')
+    androidTestCompile ('com.android.support.test:runner:0.4.1') {
+        exclude module: 'support-annotations'
+    }
+    androidTestCompile ('com.android.support.test.espresso:espresso-core:2.2.1') {
+        exclude module: 'support-annotations'
+    }
+    androidTestCompile 'org.mockito:mockito-core:1.9.5'
+    androidTestCompile 'com.google.dexmaker:dexmaker:1.2'
+    androidTestCompile 'com.google.dexmaker:dexmaker-mockito:1.2'
+    testCompile 'junit:junit:4.12'
+}
+
+sourceCompatibility = JavaVersion.VERSION_1_7
+targetCompatibility = JavaVersion.VERSION_1_7
+setApiModuleDependencies(project, dependencies, gradle.ext.studioCompat.modules.fragment.dependencies)
+
+android {
+    compileSdkVersion 9
+
+    defaultConfig {
+        minSdkVersion 9
+        // TODO: get target from branch
+        //targetSdkVersion 19
+
+        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
+    }
+
+    sourceSets {
+        main.manifest.srcFile 'AndroidManifest.xml'
+        main.java.srcDirs = ['java']
+        main.aidl.srcDirs = ['java']
+
+        androidTest.setRoot('tests')
+        androidTest.java.srcDir 'tests/java'
+        androidTest.res.srcDir 'tests/res'
+        androidTest.manifest.srcFile 'tests/AndroidManifest.xml'
+    }
+
+    lintOptions {
+        // TODO: fix errors and reenable.
+        abortOnError false
+    }
+
+    compileOptions {
+        sourceCompatibility JavaVersion.VERSION_1_7
+        targetCompatibility JavaVersion.VERSION_1_7
+    }
+
+    testOptions {
+        unitTests.returnDefaultValues = true
+        compileSdkVersion project.ext.currentSdk
+    }
+}
+
+android.libraryVariants.all { variant ->
+    def name = variant.buildType.name
+
+    if (name.equals(com.android.builder.core.BuilderConstants.DEBUG)) {
+        return; // Skip debug builds.
+    }
+    def suffix = name.capitalize()
+
+    def jarTask = project.tasks.create(name: "jar${suffix}", type: Jar){
+        dependsOn variant.javaCompile
+        from variant.javaCompile.destinationDir
+        from 'LICENSE.txt'
+    }
+    def javadocTask = project.tasks.create(name: "javadoc${suffix}", type: Javadoc) {
+        source android.sourceSets.main.java
+        classpath = files(variant.javaCompile.classpath.files) + files(
+                "${android.sdkDirectory}/platforms/${android.compileSdkVersion}/android.jar")
+    }
+
+    def javadocJarTask = project.tasks.create(name: "javadocJar${suffix}", type: Jar) {
+        classifier = 'javadoc'
+        from 'build/docs/javadoc'
+    }
+
+    def sourcesJarTask = project.tasks.create(name: "sourceJar${suffix}", type: Jar) {
+        classifier = 'sources'
+        from android.sourceSets.main.java.srcDirs
+        exclude('android/content/pm/**')
+        exclude('android/service/media/**')
+    }
+
+    project.ext.allSS.each { ss ->
+        javadocTask.source ss.java
+        sourcesJarTask.from ss.java.srcDirs
+    }
+
+    artifacts.add('archives', javadocJarTask);
+    artifacts.add('archives', sourcesJarTask);
+}
+
+uploadArchives {
+    repositories {
+        mavenDeployer {
+            repository(url: uri(rootProject.ext.supportRepoOut)) {
+            }
+
+            pom.project {
+                name 'Android Support Library v4'
+                description "The Support Library is a static library that you can add to your Android application in order to use APIs that are either not available for older platform versions or utility APIs that aren't a part of the framework APIs. Compatible on devices running API 4 or later."
+                url 'http://developer.android.com/tools/extras/support-library.html'
+                inceptionYear '2011'
+
+                licenses {
+                    license {
+                        name 'The Apache Software License, Version 2.0'
+                        url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+                        distribution 'repo'
+                    }
+                }
+
+                scm {
+                    url "http://source.android.com"
+                    connection "scm:git:https://android.googlesource.com/platform/frameworks/support"
+                }
+                developers {
+                    developer {
+                        name 'The Android Open Source Project'
+                    }
+                }
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/fragment/gingerbread/android/support/v4/app/BaseFragmentActivityGingerbread.java b/fragment/gingerbread/android/support/v4/app/BaseFragmentActivityGingerbread.java
new file mode 100644
index 0000000..890b802
--- /dev/null
+++ b/fragment/gingerbread/android/support/v4/app/BaseFragmentActivityGingerbread.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright (C) 2015 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 android.support.v4.app;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentSender;
+import android.os.Build;
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.util.AttributeSet;
+import android.view.View;
+
+/**
+ * Base class for {@code FragmentActivity} to be able to use Gingerbread APIs.
+ *
+ * @hide
+ */
+abstract class BaseFragmentActivityGingerbread extends Activity {
+
+    // We need to keep track of whether startIntentSenderForResult originated from a Fragment, so we
+    // can conditionally check whether the requestCode collides with our reserved ID space for the
+    // request index (see above). Unfortunately we can't just call
+    // super.startIntentSenderForResult(...) to bypass the check when the call didn't come from a
+    // fragment, since we need to use the ActivityCompat version for backward compatibility.
+    boolean mStartedIntentSenderFromFragment;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        if (Build.VERSION.SDK_INT < 11 && getLayoutInflater().getFactory() == null) {
+            // On pre-HC devices we need to manually install ourselves as a Factory.
+            // On HC and above, we are automatically installed as a private factory
+            getLayoutInflater().setFactory(this);
+        }
+
+        super.onCreate(savedInstanceState);
+    }
+
+    @Override
+    public View onCreateView(String name, Context context, AttributeSet attrs) {
+        final View v = dispatchFragmentsOnCreateView(null, name, context, attrs);
+        if (v == null) {
+            return super.onCreateView(name, context, attrs);
+        }
+        return v;
+    }
+
+    abstract View dispatchFragmentsOnCreateView(View parent, String name,
+            Context context, AttributeSet attrs);
+
+
+    @Override
+    public void startIntentSenderForResult(IntentSender intent, int requestCode,
+            @Nullable Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags)
+            throws IntentSender.SendIntentException {
+        // If this was started from a Fragment we've already checked the upper 16 bits were not in
+        // use, and then repurposed them for the Fragment's index.
+        if (!mStartedIntentSenderFromFragment) {
+            if (requestCode != -1) {
+                checkForValidRequestCode(requestCode);
+            }
+        }
+        super.startIntentSenderForResult(intent, requestCode, fillInIntent, flagsMask, flagsValues,
+                extraFlags);
+    }
+
+    /**
+     * Checks whether the given request code is a valid code by masking it with 0xffff0000. Throws
+     * an {@link IllegalArgumentException} if the code is not valid.
+     */
+    static void checkForValidRequestCode(int requestCode) {
+        if ((requestCode & 0xffff0000) != 0) {
+            throw new IllegalArgumentException("Can only use lower 16 bits for requestCode");
+        }
+    }
+}
diff --git a/fragment/honeycomb/android/support/v4/app/BaseFragmentActivityHoneycomb.java b/fragment/honeycomb/android/support/v4/app/BaseFragmentActivityHoneycomb.java
new file mode 100644
index 0000000..95f3d8d
--- /dev/null
+++ b/fragment/honeycomb/android/support/v4/app/BaseFragmentActivityHoneycomb.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2015 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 android.support.v4.app;
+
+import android.content.Context;
+import android.os.Build;
+import android.util.AttributeSet;
+import android.view.View;
+
+/**
+ * Base class for {@code FragmentActivity} to be able to use v11 APIs.
+ *
+ * @hide
+ */
+abstract class BaseFragmentActivityHoneycomb extends BaseFragmentActivityGingerbread {
+
+    @Override
+    public View onCreateView(View parent, String name, Context context, AttributeSet attrs) {
+        final View v = dispatchFragmentsOnCreateView(parent, name, context, attrs);
+        if (v == null && Build.VERSION.SDK_INT >= 11) {
+            // If we're running on HC or above, let the super have a go
+            return super.onCreateView(parent, name, context, attrs);
+        }
+        return v;
+    }
+
+}
diff --git a/fragment/java/android/support/v4/app/BackStackRecord.java b/fragment/java/android/support/v4/app/BackStackRecord.java
new file mode 100644
index 0000000..99696bf
--- /dev/null
+++ b/fragment/java/android/support/v4/app/BackStackRecord.java
@@ -0,0 +1,1538 @@
+/*
+ * 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 android.support.v4.app;
+
+import android.os.Build;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.support.v4.util.ArrayMap;
+import android.support.v4.util.LogWriter;
+import android.text.TextUtils;
+import android.util.Log;
+import android.util.SparseArray;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.ViewTreeObserver;
+
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+
+final class BackStackState implements Parcelable {
+    final int[] mOps;
+    final int mTransition;
+    final int mTransitionStyle;
+    final String mName;
+    final int mIndex;
+    final int mBreadCrumbTitleRes;
+    final CharSequence mBreadCrumbTitleText;
+    final int mBreadCrumbShortTitleRes;
+    final CharSequence mBreadCrumbShortTitleText;
+    final ArrayList<String> mSharedElementSourceNames;
+    final ArrayList<String> mSharedElementTargetNames;
+
+    public BackStackState(BackStackRecord bse) {
+        int numRemoved = 0;
+        BackStackRecord.Op op = bse.mHead;
+        while (op != null) {
+            if (op.removed != null) numRemoved += op.removed.size();
+            op = op.next;
+        }
+        mOps = new int[bse.mNumOp*7 + numRemoved];
+
+        if (!bse.mAddToBackStack) {
+            throw new IllegalStateException("Not on back stack");
+        }
+
+        op = bse.mHead;
+        int pos = 0;
+        while (op != null) {
+            mOps[pos++] = op.cmd;
+            mOps[pos++] = op.fragment != null ? op.fragment.mIndex : -1;
+            mOps[pos++] = op.enterAnim;
+            mOps[pos++] = op.exitAnim;
+            mOps[pos++] = op.popEnterAnim;
+            mOps[pos++] = op.popExitAnim;
+            if (op.removed != null) {
+                final int N = op.removed.size();
+                mOps[pos++] = N;
+                for (int i=0; i<N; i++) {
+                    mOps[pos++] = op.removed.get(i).mIndex;
+                }
+            } else {
+                mOps[pos++] = 0;
+            }
+            op = op.next;
+        }
+        mTransition = bse.mTransition;
+        mTransitionStyle = bse.mTransitionStyle;
+        mName = bse.mName;
+        mIndex = bse.mIndex;
+        mBreadCrumbTitleRes = bse.mBreadCrumbTitleRes;
+        mBreadCrumbTitleText = bse.mBreadCrumbTitleText;
+        mBreadCrumbShortTitleRes = bse.mBreadCrumbShortTitleRes;
+        mBreadCrumbShortTitleText = bse.mBreadCrumbShortTitleText;
+        mSharedElementSourceNames = bse.mSharedElementSourceNames;
+        mSharedElementTargetNames = bse.mSharedElementTargetNames;
+    }
+
+    public BackStackState(Parcel in) {
+        mOps = in.createIntArray();
+        mTransition = in.readInt();
+        mTransitionStyle = in.readInt();
+        mName = in.readString();
+        mIndex = in.readInt();
+        mBreadCrumbTitleRes = in.readInt();
+        mBreadCrumbTitleText = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in);
+        mBreadCrumbShortTitleRes = in.readInt();
+        mBreadCrumbShortTitleText = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in);
+        mSharedElementSourceNames = in.createStringArrayList();
+        mSharedElementTargetNames = in.createStringArrayList();
+    }
+
+    public BackStackRecord instantiate(FragmentManagerImpl fm) {
+        BackStackRecord bse = new BackStackRecord(fm);
+        int pos = 0;
+        int num = 0;
+        while (pos < mOps.length) {
+            BackStackRecord.Op op = new BackStackRecord.Op();
+            op.cmd = mOps[pos++];
+            if (FragmentManagerImpl.DEBUG) Log.v(FragmentManagerImpl.TAG,
+                    "Instantiate " + bse + " op #" + num + " base fragment #" + mOps[pos]);
+            int findex = mOps[pos++];
+            if (findex >= 0) {
+                Fragment f = fm.mActive.get(findex);
+                op.fragment = f;
+            } else {
+                op.fragment = null;
+            }
+            op.enterAnim = mOps[pos++];
+            op.exitAnim = mOps[pos++];
+            op.popEnterAnim = mOps[pos++];
+            op.popExitAnim = mOps[pos++];
+            final int N = mOps[pos++];
+            if (N > 0) {
+                op.removed = new ArrayList<Fragment>(N);
+                for (int i=0; i<N; i++) {
+                    if (FragmentManagerImpl.DEBUG) Log.v(FragmentManagerImpl.TAG,
+                            "Instantiate " + bse + " set remove fragment #" + mOps[pos]);
+                    Fragment r = fm.mActive.get(mOps[pos++]);
+                    op.removed.add(r);
+                }
+            }
+            bse.mEnterAnim = op.enterAnim;
+            bse.mExitAnim = op.exitAnim;
+            bse.mPopEnterAnim = op.popEnterAnim;
+            bse.mPopExitAnim = op.popExitAnim;
+            bse.addOp(op);
+            num++;
+        }
+        bse.mTransition = mTransition;
+        bse.mTransitionStyle = mTransitionStyle;
+        bse.mName = mName;
+        bse.mIndex = mIndex;
+        bse.mAddToBackStack = true;
+        bse.mBreadCrumbTitleRes = mBreadCrumbTitleRes;
+        bse.mBreadCrumbTitleText = mBreadCrumbTitleText;
+        bse.mBreadCrumbShortTitleRes = mBreadCrumbShortTitleRes;
+        bse.mBreadCrumbShortTitleText = mBreadCrumbShortTitleText;
+        bse.mSharedElementSourceNames = mSharedElementSourceNames;
+        bse.mSharedElementTargetNames = mSharedElementTargetNames;
+        bse.bumpBackStackNesting(1);
+        return bse;
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeIntArray(mOps);
+        dest.writeInt(mTransition);
+        dest.writeInt(mTransitionStyle);
+        dest.writeString(mName);
+        dest.writeInt(mIndex);
+        dest.writeInt(mBreadCrumbTitleRes);
+        TextUtils.writeToParcel(mBreadCrumbTitleText, dest, 0);
+        dest.writeInt(mBreadCrumbShortTitleRes);
+        TextUtils.writeToParcel(mBreadCrumbShortTitleText, dest, 0);
+        dest.writeStringList(mSharedElementSourceNames);
+        dest.writeStringList(mSharedElementTargetNames);
+    }
+
+    public static final Parcelable.Creator<BackStackState> CREATOR
+            = new Parcelable.Creator<BackStackState>() {
+        @Override
+        public BackStackState createFromParcel(Parcel in) {
+            return new BackStackState(in);
+        }
+
+        @Override
+        public BackStackState[] newArray(int size) {
+            return new BackStackState[size];
+        }
+    };
+}
+
+/**
+ * @hide Entry of an operation on the fragment back stack.
+ */
+final class BackStackRecord extends FragmentTransaction implements
+        FragmentManager.BackStackEntry, Runnable {
+    static final String TAG = FragmentManagerImpl.TAG;
+    static final boolean SUPPORTS_TRANSITIONS = Build.VERSION.SDK_INT >= 21;
+
+    final FragmentManagerImpl mManager;
+
+    static final int OP_NULL = 0;
+    static final int OP_ADD = 1;
+    static final int OP_REPLACE = 2;
+    static final int OP_REMOVE = 3;
+    static final int OP_HIDE = 4;
+    static final int OP_SHOW = 5;
+    static final int OP_DETACH = 6;
+    static final int OP_ATTACH = 7;
+
+    static final class Op {
+        Op next;
+        Op prev;
+        int cmd;
+        Fragment fragment;
+        int enterAnim;
+        int exitAnim;
+        int popEnterAnim;
+        int popExitAnim;
+        ArrayList<Fragment> removed;
+    }
+
+    Op mHead;
+    Op mTail;
+    int mNumOp;
+    int mEnterAnim;
+    int mExitAnim;
+    int mPopEnterAnim;
+    int mPopExitAnim;
+    int mTransition;
+    int mTransitionStyle;
+    boolean mAddToBackStack;
+    boolean mAllowAddToBackStack = true;
+    String mName;
+    boolean mCommitted;
+    int mIndex = -1;
+
+    int mBreadCrumbTitleRes;
+    CharSequence mBreadCrumbTitleText;
+    int mBreadCrumbShortTitleRes;
+    CharSequence mBreadCrumbShortTitleText;
+
+    ArrayList<String> mSharedElementSourceNames;
+    ArrayList<String> mSharedElementTargetNames;
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder(128);
+        sb.append("BackStackEntry{");
+        sb.append(Integer.toHexString(System.identityHashCode(this)));
+        if (mIndex >= 0) {
+            sb.append(" #");
+            sb.append(mIndex);
+        }
+        if (mName != null) {
+            sb.append(" ");
+            sb.append(mName);
+        }
+        sb.append("}");
+        return sb.toString();
+    }
+
+    public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) {
+        dump(prefix, writer, true);
+    }
+
+    public void dump(String prefix, PrintWriter writer, boolean full) {
+        if (full) {
+            writer.print(prefix); writer.print("mName="); writer.print(mName);
+                    writer.print(" mIndex="); writer.print(mIndex);
+                    writer.print(" mCommitted="); writer.println(mCommitted);
+            if (mTransition != FragmentTransaction.TRANSIT_NONE) {
+                writer.print(prefix); writer.print("mTransition=#");
+                        writer.print(Integer.toHexString(mTransition));
+                        writer.print(" mTransitionStyle=#");
+                        writer.println(Integer.toHexString(mTransitionStyle));
+            }
+            if (mEnterAnim != 0 || mExitAnim !=0) {
+                writer.print(prefix); writer.print("mEnterAnim=#");
+                        writer.print(Integer.toHexString(mEnterAnim));
+                        writer.print(" mExitAnim=#");
+                        writer.println(Integer.toHexString(mExitAnim));
+            }
+            if (mPopEnterAnim != 0 || mPopExitAnim !=0) {
+                writer.print(prefix); writer.print("mPopEnterAnim=#");
+                        writer.print(Integer.toHexString(mPopEnterAnim));
+                        writer.print(" mPopExitAnim=#");
+                        writer.println(Integer.toHexString(mPopExitAnim));
+            }
+            if (mBreadCrumbTitleRes != 0 || mBreadCrumbTitleText != null) {
+                writer.print(prefix); writer.print("mBreadCrumbTitleRes=#");
+                        writer.print(Integer.toHexString(mBreadCrumbTitleRes));
+                        writer.print(" mBreadCrumbTitleText=");
+                        writer.println(mBreadCrumbTitleText);
+            }
+            if (mBreadCrumbShortTitleRes != 0 || mBreadCrumbShortTitleText != null) {
+                writer.print(prefix); writer.print("mBreadCrumbShortTitleRes=#");
+                        writer.print(Integer.toHexString(mBreadCrumbShortTitleRes));
+                        writer.print(" mBreadCrumbShortTitleText=");
+                        writer.println(mBreadCrumbShortTitleText);
+            }
+        }
+
+        if (mHead != null) {
+            writer.print(prefix); writer.println("Operations:");
+            String innerPrefix = prefix + "    ";
+            Op op = mHead;
+            int num = 0;
+            while (op != null) {
+                String cmdStr;
+                switch (op.cmd) {
+                    case OP_NULL: cmdStr="NULL"; break;
+                    case OP_ADD: cmdStr="ADD"; break;
+                    case OP_REPLACE: cmdStr="REPLACE"; break;
+                    case OP_REMOVE: cmdStr="REMOVE"; break;
+                    case OP_HIDE: cmdStr="HIDE"; break;
+                    case OP_SHOW: cmdStr="SHOW"; break;
+                    case OP_DETACH: cmdStr="DETACH"; break;
+                    case OP_ATTACH: cmdStr="ATTACH"; break;
+                    default: cmdStr="cmd=" + op.cmd; break;
+                }
+                writer.print(prefix); writer.print("  Op #"); writer.print(num);
+                        writer.print(": "); writer.print(cmdStr);
+                        writer.print(" "); writer.println(op.fragment);
+                if (full) {
+                    if (op.enterAnim != 0 || op.exitAnim != 0) {
+                        writer.print(prefix); writer.print("enterAnim=#");
+                                writer.print(Integer.toHexString(op.enterAnim));
+                                writer.print(" exitAnim=#");
+                                writer.println(Integer.toHexString(op.exitAnim));
+                    }
+                    if (op.popEnterAnim != 0 || op.popExitAnim != 0) {
+                        writer.print(prefix); writer.print("popEnterAnim=#");
+                                writer.print(Integer.toHexString(op.popEnterAnim));
+                                writer.print(" popExitAnim=#");
+                                writer.println(Integer.toHexString(op.popExitAnim));
+                    }
+                }
+                if (op.removed != null && op.removed.size() > 0) {
+                    for (int i=0; i<op.removed.size(); i++) {
+                        writer.print(innerPrefix);
+                        if (op.removed.size() == 1) {
+                            writer.print("Removed: ");
+                        } else {
+                            if (i == 0) {
+                                writer.println("Removed:");
+                            }
+                            writer.print(innerPrefix); writer.print("  #"); writer.print(i);
+                                    writer.print(": "); 
+                        }
+                        writer.println(op.removed.get(i));
+                    }
+                }
+                op = op.next;
+                num++;
+            }
+        }
+    }
+
+    public BackStackRecord(FragmentManagerImpl manager) {
+        mManager = manager;
+    }
+
+    @Override
+    public int getId() {
+        return mIndex;
+    }
+
+    @Override
+    public int getBreadCrumbTitleRes() {
+        return mBreadCrumbTitleRes;
+    }
+
+    @Override
+    public int getBreadCrumbShortTitleRes() {
+        return mBreadCrumbShortTitleRes;
+    }
+
+    @Override
+    public CharSequence getBreadCrumbTitle() {
+        if (mBreadCrumbTitleRes != 0) {
+            return mManager.mHost.getContext().getText(mBreadCrumbTitleRes);
+        }
+        return mBreadCrumbTitleText;
+    }
+
+    @Override
+    public CharSequence getBreadCrumbShortTitle() {
+        if (mBreadCrumbShortTitleRes != 0) {
+            return mManager.mHost.getContext().getText(mBreadCrumbShortTitleRes);
+        }
+        return mBreadCrumbShortTitleText;
+    }
+
+    void addOp(Op op) {
+        if (mHead == null) {
+            mHead = mTail = op;
+        } else {
+            op.prev = mTail;
+            mTail.next = op;
+            mTail = op;
+        }
+        op.enterAnim = mEnterAnim;
+        op.exitAnim = mExitAnim;
+        op.popEnterAnim = mPopEnterAnim;
+        op.popExitAnim = mPopExitAnim;
+        mNumOp++;
+    }
+
+    @Override
+    public FragmentTransaction add(Fragment fragment, String tag) {
+        doAddOp(0, fragment, tag, OP_ADD);
+        return this;
+    }
+
+    @Override
+    public FragmentTransaction add(int containerViewId, Fragment fragment) {
+        doAddOp(containerViewId, fragment, null, OP_ADD);
+        return this;
+    }
+
+    @Override
+    public FragmentTransaction add(int containerViewId, Fragment fragment, String tag) {
+        doAddOp(containerViewId, fragment, tag, OP_ADD);
+        return this;
+    }
+
+    private void doAddOp(int containerViewId, Fragment fragment, String tag, int opcmd) {
+        fragment.mFragmentManager = mManager;
+
+        if (tag != null) {
+            if (fragment.mTag != null && !tag.equals(fragment.mTag)) {
+                throw new IllegalStateException("Can't change tag of fragment "
+                        + fragment + ": was " + fragment.mTag
+                        + " now " + tag);
+            }
+            fragment.mTag = tag;
+        }
+
+        if (containerViewId != 0) {
+            if (containerViewId == View.NO_ID) {
+                throw new IllegalArgumentException("Can't add fragment "
+                        + fragment + " with tag " + tag + " to container view with no id");
+            }
+            if (fragment.mFragmentId != 0 && fragment.mFragmentId != containerViewId) {
+                throw new IllegalStateException("Can't change container ID of fragment "
+                        + fragment + ": was " + fragment.mFragmentId
+                        + " now " + containerViewId);
+            }
+            fragment.mContainerId = fragment.mFragmentId = containerViewId;
+        }
+
+        Op op = new Op();
+        op.cmd = opcmd;
+        op.fragment = fragment;
+        addOp(op);
+    }
+
+    @Override
+    public FragmentTransaction replace(int containerViewId, Fragment fragment) {
+        return replace(containerViewId, fragment, null);
+    }
+
+    @Override
+    public FragmentTransaction replace(int containerViewId, Fragment fragment, String tag) {
+        if (containerViewId == 0) {
+            throw new IllegalArgumentException("Must use non-zero containerViewId");
+        }
+
+        doAddOp(containerViewId, fragment, tag, OP_REPLACE);
+        return this;
+    }
+
+    @Override
+    public FragmentTransaction remove(Fragment fragment) {
+        Op op = new Op();
+        op.cmd = OP_REMOVE;
+        op.fragment = fragment;
+        addOp(op);
+
+        return this;
+    }
+
+    @Override
+    public FragmentTransaction hide(Fragment fragment) {
+        Op op = new Op();
+        op.cmd = OP_HIDE;
+        op.fragment = fragment;
+        addOp(op);
+
+        return this;
+    }
+
+    @Override
+    public FragmentTransaction show(Fragment fragment) {
+        Op op = new Op();
+        op.cmd = OP_SHOW;
+        op.fragment = fragment;
+        addOp(op);
+
+        return this;
+    }
+
+    @Override
+    public FragmentTransaction detach(Fragment fragment) {
+        Op op = new Op();
+        op.cmd = OP_DETACH;
+        op.fragment = fragment;
+        addOp(op);
+
+        return this;
+    }
+
+    @Override
+    public FragmentTransaction attach(Fragment fragment) {
+        Op op = new Op();
+        op.cmd = OP_ATTACH;
+        op.fragment = fragment;
+        addOp(op);
+
+        return this;
+    }
+
+    @Override
+    public FragmentTransaction setCustomAnimations(int enter, int exit) {
+        return setCustomAnimations(enter, exit, 0, 0);
+    }
+
+    @Override
+    public FragmentTransaction setCustomAnimations(int enter, int exit,
+            int popEnter, int popExit) {
+        mEnterAnim = enter;
+        mExitAnim = exit;
+        mPopEnterAnim = popEnter;
+        mPopExitAnim = popExit;
+        return this;
+    }
+
+    @Override
+    public FragmentTransaction setTransition(int transition) {
+        mTransition = transition;
+        return this;
+    }
+
+    @Override
+    public FragmentTransaction addSharedElement(View sharedElement, String name) {
+        if (SUPPORTS_TRANSITIONS) {
+            String transitionName = FragmentTransitionCompat21.getTransitionName(sharedElement);
+            if (transitionName == null) {
+                throw new IllegalArgumentException("Unique transitionNames are required for all" +
+                        " sharedElements");
+            }
+            if (mSharedElementSourceNames == null) {
+                mSharedElementSourceNames = new ArrayList<String>();
+                mSharedElementTargetNames = new ArrayList<String>();
+            }
+
+            mSharedElementSourceNames.add(transitionName);
+            mSharedElementTargetNames.add(name);
+        }
+        return this;
+    }
+
+    @Override
+    public FragmentTransaction setTransitionStyle(int styleRes) {
+        mTransitionStyle = styleRes;
+        return this;
+    }
+
+    @Override
+    public FragmentTransaction addToBackStack(String name) {
+        if (!mAllowAddToBackStack) {
+            throw new IllegalStateException(
+                    "This FragmentTransaction is not allowed to be added to the back stack.");
+        }
+        mAddToBackStack = true;
+        mName = name;
+        return this;
+    }
+
+    @Override
+    public boolean isAddToBackStackAllowed() {
+        return mAllowAddToBackStack;
+    }
+
+    @Override
+    public FragmentTransaction disallowAddToBackStack() {
+        if (mAddToBackStack) {
+            throw new IllegalStateException(
+                    "This transaction is already being added to the back stack");
+        }
+        mAllowAddToBackStack = false;
+        return this;
+    }
+
+    @Override
+    public FragmentTransaction setBreadCrumbTitle(int res) {
+        mBreadCrumbTitleRes = res;
+        mBreadCrumbTitleText = null;
+        return this;
+    }
+
+    @Override
+    public FragmentTransaction setBreadCrumbTitle(CharSequence text) {
+        mBreadCrumbTitleRes = 0;
+        mBreadCrumbTitleText = text;
+        return this;
+    }
+
+    @Override
+    public FragmentTransaction setBreadCrumbShortTitle(int res) {
+        mBreadCrumbShortTitleRes = res;
+        mBreadCrumbShortTitleText = null;
+        return this;
+    }
+
+    @Override
+    public FragmentTransaction setBreadCrumbShortTitle(CharSequence text) {
+        mBreadCrumbShortTitleRes = 0;
+        mBreadCrumbShortTitleText = text;
+        return this;
+    }
+
+    void bumpBackStackNesting(int amt) {
+        if (!mAddToBackStack) {
+            return;
+        }
+        if (FragmentManagerImpl.DEBUG) Log.v(TAG, "Bump nesting in " + this
+                + " by " + amt);
+        Op op = mHead;
+        while (op != null) {
+            if (op.fragment != null) {
+                op.fragment.mBackStackNesting += amt;
+                if (FragmentManagerImpl.DEBUG) Log.v(TAG, "Bump nesting of "
+                        + op.fragment + " to " + op.fragment.mBackStackNesting);
+            }
+            if (op.removed != null) {
+                for (int i=op.removed.size()-1; i>=0; i--) {
+                    Fragment r = op.removed.get(i);
+                    r.mBackStackNesting += amt;
+                    if (FragmentManagerImpl.DEBUG) Log.v(TAG, "Bump nesting of "
+                            + r + " to " + r.mBackStackNesting);
+                }
+            }
+            op = op.next;
+        }
+    }
+
+    @Override
+    public int commit() {
+        return commitInternal(false);
+    }
+
+    @Override
+    public int commitAllowingStateLoss() {
+        return commitInternal(true);
+    }
+
+    @Override
+    public void commitNow() {
+        disallowAddToBackStack();
+        mManager.execSingleAction(this, false);
+    }
+
+    @Override
+    public void commitNowAllowingStateLoss() {
+        disallowAddToBackStack();
+        mManager.execSingleAction(this, true);
+    }
+    
+    int commitInternal(boolean allowStateLoss) {
+        if (mCommitted) throw new IllegalStateException("commit already called");
+        if (FragmentManagerImpl.DEBUG) {
+            Log.v(TAG, "Commit: " + this);
+            LogWriter logw = new LogWriter(TAG);
+            PrintWriter pw = new PrintWriter(logw);
+            dump("  ", null, pw, null);
+        }
+        mCommitted = true;
+        if (mAddToBackStack) {
+            mIndex = mManager.allocBackStackIndex(this);
+        } else {
+            mIndex = -1;
+        }
+        mManager.enqueueAction(this, allowStateLoss);
+        return mIndex;
+    }
+
+    @Override
+    public void run() {
+        if (FragmentManagerImpl.DEBUG) Log.v(TAG, "Run: " + this);
+
+        if (mAddToBackStack) {
+            if (mIndex < 0) {
+                throw new IllegalStateException("addToBackStack() called after commit()");
+            }
+        }
+
+        bumpBackStackNesting(1);
+
+        TransitionState state = null;
+        SparseArray<Fragment> firstOutFragments = null;
+        SparseArray<Fragment> lastInFragments = null;
+        if (SUPPORTS_TRANSITIONS && mManager.mCurState >= Fragment.CREATED) {
+            firstOutFragments = new SparseArray<Fragment>();
+            lastInFragments = new SparseArray<Fragment>();
+
+            calculateFragments(firstOutFragments, lastInFragments);
+
+            state = beginTransition(firstOutFragments, lastInFragments, false);
+        }
+
+        int transitionStyle = state != null ? 0 : mTransitionStyle;
+        int transition = state != null ? 0 : mTransition;
+        Op op = mHead;
+        while (op != null) {
+            int enterAnim = state != null ? 0 : op.enterAnim;
+            int exitAnim = state != null ? 0 : op.exitAnim;
+            switch (op.cmd) {
+                case OP_ADD: {
+                    Fragment f = op.fragment;
+                    f.mNextAnim = enterAnim;
+                    mManager.addFragment(f, false);
+                } break;
+                case OP_REPLACE: {
+                    Fragment f = op.fragment;
+                    int containerId = f.mContainerId;
+                    if (mManager.mAdded != null) {
+                        for (int i = mManager.mAdded.size() - 1; i >= 0; i--) {
+                            Fragment old = mManager.mAdded.get(i);
+                            if (FragmentManagerImpl.DEBUG) Log.v(TAG,
+                                    "OP_REPLACE: adding=" + f + " old=" + old);
+                            if (old.mContainerId == containerId) {
+                                if (old == f) {
+                                    op.fragment = f = null;
+                                } else {
+                                    if (op.removed == null) {
+                                        op.removed = new ArrayList<Fragment>();
+                                    }
+                                    op.removed.add(old);
+                                    old.mNextAnim = exitAnim;
+                                    if (mAddToBackStack) {
+                                        old.mBackStackNesting += 1;
+                                        if (FragmentManagerImpl.DEBUG) Log.v(TAG, "Bump nesting of "
+                                                + old + " to " + old.mBackStackNesting);
+                                    }
+                                    mManager.removeFragment(old, transition, transitionStyle);
+                                }
+                            }
+                        }
+                    }
+                    if (f != null) {
+                        f.mNextAnim = enterAnim;
+                        mManager.addFragment(f, false);
+                    }
+                } break;
+                case OP_REMOVE: {
+                    Fragment f = op.fragment;
+                    f.mNextAnim = exitAnim;
+                    mManager.removeFragment(f, transition, transitionStyle);
+                } break;
+                case OP_HIDE: {
+                    Fragment f = op.fragment;
+                    f.mNextAnim = exitAnim;
+                    mManager.hideFragment(f, transition, transitionStyle);
+                } break;
+                case OP_SHOW: {
+                    Fragment f = op.fragment;
+                    f.mNextAnim = enterAnim;
+                    mManager.showFragment(f, transition, transitionStyle);
+                } break;
+                case OP_DETACH: {
+                    Fragment f = op.fragment;
+                    f.mNextAnim = exitAnim;
+                    mManager.detachFragment(f, transition, transitionStyle);
+                } break;
+                case OP_ATTACH: {
+                    Fragment f = op.fragment;
+                    f.mNextAnim = enterAnim;
+                    mManager.attachFragment(f, transition, transitionStyle);
+                } break;
+                default: {
+                    throw new IllegalArgumentException("Unknown cmd: " + op.cmd);
+                }
+            }
+
+            op = op.next;
+        }
+
+        mManager.moveToState(mManager.mCurState, transition, transitionStyle, true);
+
+        if (mAddToBackStack) {
+            mManager.addBackStackState(this);
+        }
+    }
+
+    private static void setFirstOut(SparseArray<Fragment> firstOutFragments,
+            SparseArray<Fragment> lastInFragments, Fragment fragment) {
+        if (fragment != null) {
+            int containerId = fragment.mContainerId;
+            if (containerId != 0 && !fragment.isHidden()) {
+                if (fragment.isAdded() && fragment.getView() != null
+                        && firstOutFragments.get(containerId) == null) {
+                    firstOutFragments.put(containerId, fragment);
+                }
+                if (lastInFragments.get(containerId) == fragment) {
+                    lastInFragments.remove(containerId);
+                }
+            }
+        }
+    }
+
+    private void setLastIn(SparseArray<Fragment> firstOutFragments,
+            SparseArray<Fragment> lastInFragments, Fragment fragment) {
+        if (fragment != null) {
+            int containerId = fragment.mContainerId;
+            if (containerId != 0) {
+                if (!fragment.isAdded()) {
+                    lastInFragments.put(containerId, fragment);
+                }
+                if (firstOutFragments.get(containerId) == fragment) {
+                    firstOutFragments.remove(containerId);
+                }
+            }
+            if (fragment.mState < Fragment.CREATED && mManager.mCurState >= Fragment.CREATED) {
+                mManager.makeActive(fragment);
+                mManager.moveToState(fragment, Fragment.CREATED, 0, 0, false);
+            }
+        }
+    }
+
+    /**
+     * Finds the first removed fragment and last added fragments when going forward.
+     * If none of the fragments have transitions, then both lists will be empty.
+     *
+     * @param firstOutFragments The list of first fragments to be removed, keyed on the
+     *                          container ID. This list will be modified by the method.
+     * @param lastInFragments The list of last fragments to be added, keyed on the
+     *                        container ID. This list will be modified by the method.
+     */
+    private void calculateFragments(SparseArray<Fragment> firstOutFragments,
+            SparseArray<Fragment> lastInFragments) {
+        if (!mManager.mContainer.onHasView()) {
+            return; // nothing to see, so no transitions
+        }
+        Op op = mHead;
+        while (op != null) {
+            switch (op.cmd) {
+                case OP_ADD:
+                    setLastIn(firstOutFragments, lastInFragments, op.fragment);
+                    break;
+                case OP_REPLACE: {
+                    Fragment f = op.fragment;
+                    if (mManager.mAdded != null) {
+                        for (int i = 0; i < mManager.mAdded.size(); i++) {
+                            Fragment old = mManager.mAdded.get(i);
+                            if (f == null || old.mContainerId == f.mContainerId) {
+                                if (old == f) {
+                                    f = null;
+                                    lastInFragments.remove(old.mContainerId);
+                                } else {
+                                    setFirstOut(firstOutFragments, lastInFragments, old);
+                                }
+                            }
+                        }
+                    }
+                    setLastIn(firstOutFragments, lastInFragments, op.fragment);
+                    break;
+                }
+                case OP_REMOVE:
+                    setFirstOut(firstOutFragments, lastInFragments, op.fragment);
+                    break;
+                case OP_HIDE:
+                    setFirstOut(firstOutFragments, lastInFragments, op.fragment);
+                    break;
+                case OP_SHOW:
+                    setLastIn(firstOutFragments, lastInFragments, op.fragment);
+                    break;
+                case OP_DETACH:
+                    setFirstOut(firstOutFragments, lastInFragments, op.fragment);
+                    break;
+                case OP_ATTACH:
+                    setLastIn(firstOutFragments, lastInFragments, op.fragment);
+                    break;
+            }
+
+            op = op.next;
+        }
+    }
+
+    /**
+     * Finds the first removed fragment and last added fragments when popping the back stack.
+     * If none of the fragments have transitions, then both lists will be empty.
+     *
+     * @param firstOutFragments The list of first fragments to be removed, keyed on the
+     *                          container ID. This list will be modified by the method.
+     * @param lastInFragments The list of last fragments to be added, keyed on the
+     *                        container ID. This list will be modified by the method.
+     */
+    public void calculateBackFragments(SparseArray<Fragment> firstOutFragments,
+            SparseArray<Fragment> lastInFragments) {
+        if (!mManager.mContainer.onHasView()) {
+            return; // nothing to see, so no transitions
+        }
+        Op op = mTail;
+        while (op != null) {
+            switch (op.cmd) {
+                case OP_ADD:
+                    setFirstOut(firstOutFragments, lastInFragments, op.fragment);
+                    break;
+                case OP_REPLACE:
+                    if (op.removed != null) {
+                        for (int i = op.removed.size() - 1; i >= 0; i--) {
+                            setLastIn(firstOutFragments, lastInFragments, op.removed.get(i));
+                        }
+                    }
+                    setFirstOut(firstOutFragments, lastInFragments, op.fragment);
+                    break;
+                case OP_REMOVE:
+                    setLastIn(firstOutFragments, lastInFragments, op.fragment);
+                    break;
+                case OP_HIDE:
+                    setLastIn(firstOutFragments, lastInFragments, op.fragment);
+                    break;
+                case OP_SHOW:
+                    setFirstOut(firstOutFragments, lastInFragments, op.fragment);
+                    break;
+                case OP_DETACH:
+                    setLastIn(firstOutFragments, lastInFragments, op.fragment);
+                    break;
+                case OP_ATTACH:
+                    setFirstOut(firstOutFragments, lastInFragments, op.fragment);
+                    break;
+            }
+
+            op = op.prev;
+        }
+    }
+
+    public TransitionState popFromBackStack(boolean doStateMove, TransitionState state,
+            SparseArray<Fragment> firstOutFragments, SparseArray<Fragment> lastInFragments) {
+        if (FragmentManagerImpl.DEBUG) {
+            Log.v(TAG, "popFromBackStack: " + this);
+            LogWriter logw = new LogWriter(TAG);
+            PrintWriter pw = new PrintWriter(logw);
+            dump("  ", null, pw, null);
+        }
+
+        if (SUPPORTS_TRANSITIONS && mManager.mCurState >= Fragment.CREATED) {
+            if (state == null) {
+                if (firstOutFragments.size() != 0 || lastInFragments.size() != 0) {
+                    state = beginTransition(firstOutFragments, lastInFragments, true);
+                }
+            } else if (!doStateMove) {
+                setNameOverrides(state, mSharedElementTargetNames, mSharedElementSourceNames);
+            }
+        }
+
+        bumpBackStackNesting(-1);
+
+        int transitionStyle = state != null ? 0 : mTransitionStyle;
+        int transition = state != null ? 0 : mTransition;
+        Op op = mTail;
+        while (op != null) {
+            int popEnterAnim = state != null ? 0 : op.popEnterAnim;
+            int popExitAnim= state != null ? 0 : op.popExitAnim;
+            switch (op.cmd) {
+                case OP_ADD: {
+                    Fragment f = op.fragment;
+                    f.mNextAnim = popExitAnim;
+                    mManager.removeFragment(f,
+                            FragmentManagerImpl.reverseTransit(transition), transitionStyle);
+                } break;
+                case OP_REPLACE: {
+                    Fragment f = op.fragment;
+                    if (f != null) {
+                        f.mNextAnim = popExitAnim;
+                        mManager.removeFragment(f,
+                                FragmentManagerImpl.reverseTransit(transition), transitionStyle);
+                    }
+                    if (op.removed != null) {
+                        for (int i=0; i<op.removed.size(); i++) {
+                            Fragment old = op.removed.get(i);
+                            old.mNextAnim = popEnterAnim;
+                            mManager.addFragment(old, false);
+                        }
+                    }
+                } break;
+                case OP_REMOVE: {
+                    Fragment f = op.fragment;
+                    f.mNextAnim = popEnterAnim;
+                    mManager.addFragment(f, false);
+                } break;
+                case OP_HIDE: {
+                    Fragment f = op.fragment;
+                    f.mNextAnim = popEnterAnim;
+                    mManager.showFragment(f,
+                            FragmentManagerImpl.reverseTransit(transition), transitionStyle);
+                } break;
+                case OP_SHOW: {
+                    Fragment f = op.fragment;
+                    f.mNextAnim = popExitAnim;
+                    mManager.hideFragment(f,
+                            FragmentManagerImpl.reverseTransit(transition), transitionStyle);
+                } break;
+                case OP_DETACH: {
+                    Fragment f = op.fragment;
+                    f.mNextAnim = popEnterAnim;
+                    mManager.attachFragment(f,
+                            FragmentManagerImpl.reverseTransit(transition), transitionStyle);
+                } break;
+                case OP_ATTACH: {
+                    Fragment f = op.fragment;
+                    f.mNextAnim = popEnterAnim;
+                    mManager.detachFragment(f,
+                            FragmentManagerImpl.reverseTransit(transition), transitionStyle);
+                } break;
+                default: {
+                    throw new IllegalArgumentException("Unknown cmd: " + op.cmd);
+                }
+            }
+
+            op = op.prev;
+        }
+
+        if (doStateMove) {
+            mManager.moveToState(mManager.mCurState,
+                    FragmentManagerImpl.reverseTransit(transition), transitionStyle, true);
+            state = null;
+        }
+
+        if (mIndex >= 0) {
+            mManager.freeBackStackIndex(mIndex);
+            mIndex = -1;
+        }
+        return state;
+    }
+
+    @Override
+    public String getName() {
+        return mName;
+    }
+
+    public int getTransition() {
+        return mTransition;
+    }
+
+    public int getTransitionStyle() {
+        return mTransitionStyle;
+    }
+
+    @Override
+    public boolean isEmpty() {
+        return mNumOp == 0;
+    }
+
+    /**
+     * When custom fragment transitions are used, this sets up the state for each transition
+     * and begins the transition. A different transition is started for each fragment container
+     * and consists of up to 3 different transitions: the exit transition, a shared element
+     * transition and an enter transition.
+     *
+     * <p>The exit transition operates against the leaf nodes of the first fragment
+     * with a view that was removed. If no such fragment was removed, then no exit
+     * transition is executed. The exit transition comes from the outgoing fragment.</p>
+     *
+     * <p>The enter transition operates against the last fragment that was added. If
+     * that fragment does not have a view or no fragment was added, then no enter
+     * transition is executed. The enter transition comes from the incoming fragment.</p>
+     *
+     * <p>The shared element transition operates against all views and comes either
+     * from the outgoing fragment or the incoming fragment, depending on whether this
+     * is going forward or popping the back stack. When going forward, the incoming
+     * fragment's enter shared element transition is used, but when going back, the
+     * outgoing fragment's return shared element transition is used. Shared element
+     * transitions only operate if there is both an incoming and outgoing fragment.</p>
+     *
+     * @param firstOutFragments The list of first fragments to be removed, keyed on the
+     *                          container ID.
+     * @param lastInFragments The list of last fragments to be added, keyed on the
+     *                        container ID.
+     * @param isBack true if this is popping the back stack or false if this is a
+     *               forward operation.
+     * @return The TransitionState used to complete the operation of the transition
+     * in {@link #setNameOverrides(BackStackRecord.TransitionState, java.util.ArrayList,
+     * java.util.ArrayList)}.
+     */
+    private TransitionState beginTransition(SparseArray<Fragment> firstOutFragments,
+            SparseArray<Fragment> lastInFragments, boolean isBack) {
+        TransitionState state = new TransitionState();
+
+        // Adding a non-existent target view makes sure that the transitions don't target
+        // any views by default. They'll only target the views we tell add. If we don't
+        // add any, then no views will be targeted.
+        state.nonExistentView = new View(mManager.mHost.getContext());
+
+        boolean anyTransitionStarted = false;
+        // Go over all leaving fragments.
+        for (int i = 0; i < firstOutFragments.size(); i++) {
+            int containerId = firstOutFragments.keyAt(i);
+            if (configureTransitions(containerId, state, isBack, firstOutFragments,
+                    lastInFragments)) {
+                anyTransitionStarted = true;
+            }
+        }
+
+        // Now go over all entering fragments that didn't have a leaving fragment.
+        for (int i = 0; i < lastInFragments.size(); i++) {
+            int containerId = lastInFragments.keyAt(i);
+            if (firstOutFragments.get(containerId) == null &&
+                configureTransitions(containerId, state, isBack, firstOutFragments,
+                        lastInFragments)) {
+                anyTransitionStarted = true;
+            }
+        }
+
+        if (!anyTransitionStarted) {
+            state = null;
+        }
+
+        return state;
+    }
+
+    private static Object getEnterTransition(Fragment inFragment, boolean isBack) {
+        if (inFragment == null) {
+            return null;
+        }
+        return FragmentTransitionCompat21.cloneTransition(isBack ?
+                inFragment.getReenterTransition() : inFragment.getEnterTransition());
+    }
+
+    private static Object getExitTransition(Fragment outFragment, boolean isBack) {
+        if (outFragment == null) {
+            return null;
+        }
+        return FragmentTransitionCompat21.cloneTransition(isBack ?
+                outFragment.getReturnTransition() : outFragment.getExitTransition());
+    }
+
+    private static Object getSharedElementTransition(Fragment inFragment, Fragment outFragment,
+            boolean isBack) {
+        if (inFragment == null || outFragment == null) {
+            return null;
+        }
+        return FragmentTransitionCompat21.wrapSharedElementTransition(isBack ?
+                outFragment.getSharedElementReturnTransition() :
+                inFragment.getSharedElementEnterTransition());
+    }
+
+    private static Object captureExitingViews(Object exitTransition, Fragment outFragment,
+            ArrayList<View> exitingViews, ArrayMap<String, View> namedViews, View nonExistentView) {
+        if (exitTransition != null) {
+            exitTransition = FragmentTransitionCompat21.captureExitingViews(exitTransition,
+                    outFragment.getView(), exitingViews, namedViews, nonExistentView);
+        }
+        return exitTransition;
+    }
+
+    private ArrayMap<String, View> remapSharedElements(TransitionState state, Fragment outFragment,
+            boolean isBack) {
+        ArrayMap<String, View> namedViews = new ArrayMap<String, View>();
+        if (mSharedElementSourceNames != null) {
+            FragmentTransitionCompat21.findNamedViews(namedViews, outFragment.getView());
+            if (isBack) {
+                namedViews.retainAll(mSharedElementTargetNames);
+            } else {
+                namedViews = remapNames(mSharedElementSourceNames, mSharedElementTargetNames,
+                        namedViews);
+            }
+        }
+
+        if (isBack) {
+            if (outFragment.mEnterTransitionCallback != null) {
+                outFragment.mEnterTransitionCallback.onMapSharedElements(
+                        mSharedElementTargetNames, namedViews);
+            }
+            setBackNameOverrides(state, namedViews, false);
+        } else {
+            if (outFragment.mExitTransitionCallback != null) {
+                outFragment.mExitTransitionCallback.onMapSharedElements(
+                        mSharedElementTargetNames, namedViews);
+            }
+            setNameOverrides(state, namedViews, false);
+        }
+
+        return namedViews;
+    }
+
+    /**
+     * Configures custom transitions for a specific fragment container.
+     *
+     * @param containerId The container ID of the fragments to configure the transition for.
+     * @param state The Transition State keeping track of the executing transitions.
+     * @param firstOutFragments The list of first fragments to be removed, keyed on the
+     *                          container ID.
+     * @param lastInFragments The list of last fragments to be added, keyed on the
+     *                        container ID.
+     * @param isBack true if this is popping the back stack or false if this is a
+     *               forward operation.
+     */
+    private boolean configureTransitions(int containerId, TransitionState state, boolean isBack,
+            SparseArray<Fragment> firstOutFragments, SparseArray<Fragment> lastInFragments) {
+        ViewGroup sceneRoot = (ViewGroup) mManager.mContainer.onFindViewById(containerId);
+        if (sceneRoot == null) {
+            return false;
+        }
+        final Fragment inFragment = lastInFragments.get(containerId);
+        Fragment outFragment = firstOutFragments.get(containerId);
+
+        Object enterTransition = getEnterTransition(inFragment, isBack);
+        Object sharedElementTransition = getSharedElementTransition(inFragment, outFragment,
+                isBack);
+        Object exitTransition = getExitTransition(outFragment, isBack);
+        ArrayMap<String, View> namedViews = null;
+        ArrayList<View> sharedElementTargets = new ArrayList<View>();
+        if (sharedElementTransition != null) {
+            namedViews = remapSharedElements(state, outFragment, isBack);
+            if (namedViews.isEmpty()) {
+                sharedElementTransition = null;
+                namedViews = null;
+            } else {
+                // Notify the start of the transition.
+                SharedElementCallback callback = isBack ?
+                        outFragment.mEnterTransitionCallback :
+                        inFragment.mEnterTransitionCallback;
+                if (callback != null) {
+                    ArrayList<String> names = new ArrayList<String>(namedViews.keySet());
+                    ArrayList<View> views = new ArrayList<View>(namedViews.values());
+                    callback.onSharedElementStart(names, views, null);
+                }
+                prepareSharedElementTransition(state, sceneRoot, sharedElementTransition,
+                        inFragment, outFragment, isBack, sharedElementTargets, enterTransition,
+                        exitTransition);
+            }
+        }
+        if (enterTransition == null && sharedElementTransition == null &&
+                exitTransition == null) {
+            return false; // no transitions!
+        }
+
+        ArrayList<View> exitingViews = new ArrayList<View>();
+        exitTransition = captureExitingViews(exitTransition, outFragment, exitingViews,
+                namedViews, state.nonExistentView);
+
+        // Set the epicenter of the exit transition
+        if (mSharedElementTargetNames != null && namedViews != null) {
+            View epicenterView = namedViews.get(mSharedElementTargetNames.get(0));
+            if (epicenterView != null) {
+                if (exitTransition != null) {
+                    FragmentTransitionCompat21.setEpicenter(exitTransition, epicenterView);
+                }
+                if (sharedElementTransition != null) {
+                    FragmentTransitionCompat21.setEpicenter(sharedElementTransition,
+                            epicenterView);
+                }
+            }
+        }
+
+        FragmentTransitionCompat21.ViewRetriever viewRetriever =
+                new FragmentTransitionCompat21.ViewRetriever() {
+                    @Override
+                    public View getView() {
+                        return inFragment.getView();
+                    }
+                };
+
+        ArrayList<View> enteringViews = new ArrayList<View>();
+        ArrayMap<String, View> renamedViews = new ArrayMap<String, View>();
+
+        boolean allowOverlap = true;
+        if (inFragment != null) {
+            allowOverlap = isBack ? inFragment.getAllowReturnTransitionOverlap() :
+                    inFragment.getAllowEnterTransitionOverlap();
+        }
+        Object transition = FragmentTransitionCompat21.mergeTransitions(enterTransition,
+                exitTransition, sharedElementTransition, allowOverlap);
+
+        if (transition != null) {
+            FragmentTransitionCompat21.addTransitionTargets(enterTransition,
+                    sharedElementTransition, exitTransition, sceneRoot, viewRetriever,
+                    state.nonExistentView, state.enteringEpicenterView, state.nameOverrides,
+                    enteringViews, exitingViews, namedViews, renamedViews, sharedElementTargets);
+            excludeHiddenFragmentsAfterEnter(sceneRoot, state, containerId, transition);
+
+            // We want to exclude hidden views later, so we need a non-null list in the
+            // transition now.
+            FragmentTransitionCompat21.excludeTarget(transition, state.nonExistentView, true);
+            // Now exclude all currently hidden fragments.
+            excludeHiddenFragments(state, containerId, transition);
+
+            FragmentTransitionCompat21.beginDelayedTransition(sceneRoot, transition);
+
+            FragmentTransitionCompat21.cleanupTransitions(sceneRoot, state.nonExistentView,
+                    enterTransition, enteringViews, exitTransition, exitingViews,
+                    sharedElementTransition, sharedElementTargets,
+                    transition, state.hiddenFragmentViews, renamedViews);
+        }
+        return transition != null;
+    }
+
+    private void prepareSharedElementTransition(final TransitionState state, final View sceneRoot,
+            final Object sharedElementTransition, final Fragment inFragment,
+            final Fragment outFragment, final boolean isBack,
+            final ArrayList<View> sharedElementTargets, final Object enterTransition,
+            final Object exitTransition) {
+        if (sharedElementTransition != null) {
+            sceneRoot.getViewTreeObserver().addOnPreDrawListener(
+                    new ViewTreeObserver.OnPreDrawListener() {
+                @Override
+                public boolean onPreDraw() {
+                    sceneRoot.getViewTreeObserver().removeOnPreDrawListener(this);
+
+                    // Remove the exclude for the shared elements from the exiting fragment.
+                    FragmentTransitionCompat21.removeTargets(sharedElementTransition,
+                            sharedElementTargets);
+                    // keep the nonExistentView as excluded so the list doesn't get emptied
+                    sharedElementTargets.remove(state.nonExistentView);
+                    FragmentTransitionCompat21.excludeSharedElementViews(enterTransition,
+                            exitTransition, sharedElementTransition, sharedElementTargets, false);
+                    sharedElementTargets.clear();
+
+                    ArrayMap<String, View> namedViews = mapSharedElementsIn(
+                            state, isBack, inFragment);
+                    FragmentTransitionCompat21.setSharedElementTargets(sharedElementTransition,
+                            state.nonExistentView, namedViews, sharedElementTargets);
+
+                    setEpicenterIn(namedViews, state);
+
+                    callSharedElementEnd(state, inFragment, outFragment, isBack,
+                            namedViews);
+
+                    // Exclude the shared elements from the entering fragment.
+                    FragmentTransitionCompat21.excludeSharedElementViews(enterTransition,
+                            exitTransition, sharedElementTransition, sharedElementTargets, true);
+                    return true;
+                }
+            });
+        }
+    }
+
+    private void callSharedElementEnd(TransitionState state, Fragment inFragment,
+            Fragment outFragment, boolean isBack, ArrayMap<String, View> namedViews) {
+        SharedElementCallback sharedElementCallback = isBack ?
+                outFragment.mEnterTransitionCallback :
+                inFragment.mEnterTransitionCallback;
+        if (sharedElementCallback != null) {
+            ArrayList<String> names = new ArrayList<String>(namedViews.keySet());
+            ArrayList<View> views = new ArrayList<View>(namedViews.values());
+            sharedElementCallback.onSharedElementEnd(names, views, null);
+        }
+    }
+
+    private void setEpicenterIn(ArrayMap<String, View> namedViews, TransitionState state) {
+        if (mSharedElementTargetNames != null && !namedViews.isEmpty()) {
+            // now we know the epicenter of the entering transition.
+            View epicenter = namedViews
+                    .get(mSharedElementTargetNames.get(0));
+            if (epicenter != null) {
+                state.enteringEpicenterView.epicenter = epicenter;
+            }
+        }
+    }
+
+    private ArrayMap<String, View> mapSharedElementsIn(TransitionState state,
+            boolean isBack, Fragment inFragment) {
+        // Now map the shared elements in the incoming fragment
+        ArrayMap<String, View> namedViews = mapEnteringSharedElements(state, inFragment, isBack);
+
+        // remap shared elements and set the name mapping used
+        // in the shared element transition.
+        if (isBack) {
+            if (inFragment.mExitTransitionCallback != null) {
+                inFragment.mExitTransitionCallback.onMapSharedElements(
+                        mSharedElementTargetNames, namedViews);
+            }
+            setBackNameOverrides(state, namedViews, true);
+        } else {
+            if (inFragment.mEnterTransitionCallback != null) {
+                inFragment.mEnterTransitionCallback.onMapSharedElements(
+                        mSharedElementTargetNames, namedViews);
+            }
+            setNameOverrides(state, namedViews, true);
+        }
+        return namedViews;
+    }
+
+    /**
+     * Remaps a name-to-View map, substituting different names for keys.
+     *
+     * @param inMap A list of keys found in the map, in the order in toGoInMap
+     * @param toGoInMap A list of keys to use for the new map, in the order of inMap
+     * @param namedViews The current mapping
+     * @return A copy of namedViews with the keys coming from toGoInMap.
+     */
+    private static ArrayMap<String, View> remapNames(ArrayList<String> inMap,
+            ArrayList<String> toGoInMap, ArrayMap<String, View> namedViews) {
+        if (namedViews.isEmpty()) {
+            return namedViews;
+        }
+        ArrayMap<String, View> remappedViews = new ArrayMap<String, View>();
+        int numKeys = inMap.size();
+        for (int i = 0; i < numKeys; i++) {
+            View view = namedViews.get(inMap.get(i));
+            if (view != null) {
+                remappedViews.put(toGoInMap.get(i), view);
+            }
+        }
+        return remappedViews;
+    }
+
+    /**
+     * Maps shared elements to views in the entering fragment.
+     *
+     * @param state The transition State as returned from {@link #beginTransition(
+     * android.util.SparseArray, android.util.SparseArray, boolean)}.
+     * @param inFragment The last fragment to be added.
+     * @param isBack true if this is popping the back stack or false if this is a
+     *               forward operation.
+     */
+    private ArrayMap<String, View> mapEnteringSharedElements(TransitionState state,
+            Fragment inFragment, boolean isBack) {
+        ArrayMap<String, View> namedViews = new ArrayMap<String, View>();
+        View root = inFragment.getView();
+        if (root != null) {
+            if (mSharedElementSourceNames != null) {
+                FragmentTransitionCompat21.findNamedViews(namedViews, root);
+                if (isBack) {
+                    namedViews = remapNames(mSharedElementSourceNames,
+                            mSharedElementTargetNames, namedViews);
+                } else {
+                    namedViews.retainAll(mSharedElementTargetNames);
+                }
+            }
+        }
+        return namedViews;
+    }
+
+    private void excludeHiddenFragmentsAfterEnter(final View sceneRoot, final TransitionState state,
+            final int containerId, final Object transition) {
+        sceneRoot.getViewTreeObserver().addOnPreDrawListener(
+                new ViewTreeObserver.OnPreDrawListener() {
+            @Override
+            public boolean onPreDraw() {
+                sceneRoot.getViewTreeObserver().removeOnPreDrawListener(this);
+                excludeHiddenFragments(state, containerId, transition);
+                return true;
+            }
+        });
+    }
+
+    private void excludeHiddenFragments(TransitionState state, int containerId, Object transition) {
+        if (mManager.mAdded != null) {
+            for (int i = 0; i < mManager.mAdded.size(); i++) {
+                Fragment fragment = mManager.mAdded.get(i);
+                if (fragment.mView != null && fragment.mContainer != null &&
+                        fragment.mContainerId == containerId) {
+                    if (fragment.mHidden) {
+                        if (!state.hiddenFragmentViews.contains(fragment.mView)) {
+                            FragmentTransitionCompat21.excludeTarget(transition, fragment.mView,
+                                    true);
+                            state.hiddenFragmentViews.add(fragment.mView);
+                        }
+                    } else {
+                        FragmentTransitionCompat21.excludeTarget(transition, fragment.mView,
+                                false);
+                        state.hiddenFragmentViews.remove(fragment.mView);
+                    }
+                }
+            }
+        }
+    }
+
+    private static void setNameOverride(ArrayMap<String, String> overrides,
+            String source, String target) {
+        if (source != null && target != null) {
+            for (int index = 0; index < overrides.size(); index++) {
+                if (source.equals(overrides.valueAt(index))) {
+                    overrides.setValueAt(index, target);
+                    return;
+                }
+            }
+            overrides.put(source, target);
+        }
+    }
+
+    private static void setNameOverrides(TransitionState state, ArrayList<String> sourceNames,
+            ArrayList<String> targetNames) {
+        if (sourceNames != null) {
+            for (int i = 0; i < sourceNames.size(); i++) {
+                String source = sourceNames.get(i);
+                String target = targetNames.get(i);
+                setNameOverride(state.nameOverrides, source, target);
+            }
+        }
+    }
+
+    private void setBackNameOverrides(TransitionState state, ArrayMap<String, View> namedViews,
+            boolean isEnd) {
+        int count = mSharedElementTargetNames == null ? 0 : mSharedElementTargetNames.size();
+        for (int i = 0; i < count; i++) {
+            String source = mSharedElementSourceNames.get(i);
+            String originalTarget = mSharedElementTargetNames.get(i);
+            View view = namedViews.get(originalTarget);
+            if (view != null) {
+                String target = FragmentTransitionCompat21.getTransitionName(view);
+                if (isEnd) {
+                    setNameOverride(state.nameOverrides, source, target);
+                } else {
+                    setNameOverride(state.nameOverrides, target, source);
+                }
+            }
+        }
+    }
+
+    private void setNameOverrides(TransitionState state, ArrayMap<String, View> namedViews,
+            boolean isEnd) {
+        int count = namedViews.size();
+        for (int i = 0; i < count; i++) {
+            String source = namedViews.keyAt(i);
+            String target = FragmentTransitionCompat21.getTransitionName(namedViews.valueAt(i));
+            if (isEnd) {
+                setNameOverride(state.nameOverrides, source, target);
+            } else {
+                setNameOverride(state.nameOverrides, target, source);
+            }
+        }
+    }
+
+    public class TransitionState {
+        public ArrayMap<String, String> nameOverrides = new ArrayMap<String, String>();
+        public ArrayList<View> hiddenFragmentViews = new ArrayList<View>();
+
+        public FragmentTransitionCompat21.EpicenterView enteringEpicenterView =
+                new FragmentTransitionCompat21.EpicenterView();
+        public View nonExistentView;
+    }
+}
diff --git a/fragment/java/android/support/v4/app/DialogFragment.java b/fragment/java/android/support/v4/app/DialogFragment.java
new file mode 100644
index 0000000..b3a4f87
--- /dev/null
+++ b/fragment/java/android/support/v4/app/DialogFragment.java
@@ -0,0 +1,465 @@
+/*
+ * 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 android.support.v4.app;
+
+import android.app.Activity;
+import android.app.Dialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.os.Bundle;
+import android.support.annotation.IntDef;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.annotation.StyleRes;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.Window;
+import android.view.WindowManager;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * Static library support version of the framework's {@link android.app.DialogFragment}.
+ * Used to write apps that run on platforms prior to Android 3.0.  When running
+ * on Android 3.0 or above, this implementation is still used; it does not try
+ * to switch to the framework's implementation.  See the framework SDK
+ * documentation for a class overview.
+ */
+public class DialogFragment extends Fragment
+        implements DialogInterface.OnCancelListener, DialogInterface.OnDismissListener {
+
+    /** @hide */
+    @IntDef({STYLE_NORMAL, STYLE_NO_TITLE, STYLE_NO_FRAME, STYLE_NO_INPUT})
+    @Retention(RetentionPolicy.SOURCE)
+    private @interface DialogStyle {}
+
+    /**
+     * Style for {@link #setStyle(int, int)}: a basic,
+     * normal dialog.
+     */
+    public static final int STYLE_NORMAL = 0;
+
+    /**
+     * Style for {@link #setStyle(int, int)}: don't include
+     * a title area.
+     */
+    public static final int STYLE_NO_TITLE = 1;
+
+    /**
+     * Style for {@link #setStyle(int, int)}: don't draw
+     * any frame at all; the view hierarchy returned by {@link #onCreateView}
+     * is entirely responsible for drawing the dialog.
+     */
+    public static final int STYLE_NO_FRAME = 2;
+
+    /**
+     * Style for {@link #setStyle(int, int)}: like
+     * {@link #STYLE_NO_FRAME}, but also disables all input to the dialog.
+     * The user can not touch it, and its window will not receive input focus.
+     */
+    public static final int STYLE_NO_INPUT = 3;
+
+    private static final String SAVED_DIALOG_STATE_TAG = "android:savedDialogState";
+    private static final String SAVED_STYLE = "android:style";
+    private static final String SAVED_THEME = "android:theme";
+    private static final String SAVED_CANCELABLE = "android:cancelable";
+    private static final String SAVED_SHOWS_DIALOG = "android:showsDialog";
+    private static final String SAVED_BACK_STACK_ID = "android:backStackId";
+
+    int mStyle = STYLE_NORMAL;
+    int mTheme = 0;
+    boolean mCancelable = true;
+    boolean mShowsDialog = true;
+    int mBackStackId = -1;
+
+    Dialog mDialog;
+    boolean mViewDestroyed;
+    boolean mDismissed;
+    boolean mShownByMe;
+
+    public DialogFragment() {
+    }
+
+    /**
+     * Call to customize the basic appearance and behavior of the
+     * fragment's dialog.  This can be used for some common dialog behaviors,
+     * taking care of selecting flags, theme, and other options for you.  The
+     * same effect can be achieve by manually setting Dialog and Window
+     * attributes yourself.  Calling this after the fragment's Dialog is
+     * created will have no effect.
+     *
+     * @param style Selects a standard style: may be {@link #STYLE_NORMAL},
+     * {@link #STYLE_NO_TITLE}, {@link #STYLE_NO_FRAME}, or
+     * {@link #STYLE_NO_INPUT}.
+     * @param theme Optional custom theme.  If 0, an appropriate theme (based
+     * on the style) will be selected for you.
+     */
+    public void setStyle(@DialogStyle int style, @StyleRes int theme) {
+        mStyle = style;
+        if (mStyle == STYLE_NO_FRAME || mStyle == STYLE_NO_INPUT) {
+            mTheme = android.R.style.Theme_Panel;
+        }
+        if (theme != 0) {
+            mTheme = theme;
+        }
+    }
+
+    /**
+     * Display the dialog, adding the fragment to the given FragmentManager.  This
+     * is a convenience for explicitly creating a transaction, adding the
+     * fragment to it with the given tag, and committing it.  This does
+     * <em>not</em> add the transaction to the back stack.  When the fragment
+     * is dismissed, a new transaction will be executed to remove it from
+     * the activity.
+     * @param manager The FragmentManager this fragment will be added to.
+     * @param tag The tag for this fragment, as per
+     * {@link FragmentTransaction#add(Fragment, String) FragmentTransaction.add}.
+     */
+    public void show(FragmentManager manager, String tag) {
+        mDismissed = false;
+        mShownByMe = true;
+        FragmentTransaction ft = manager.beginTransaction();
+        ft.add(this, tag);
+        ft.commit();
+    }
+
+    /**
+     * Display the dialog, adding the fragment using an existing transaction
+     * and then committing the transaction.
+     * @param transaction An existing transaction in which to add the fragment.
+     * @param tag The tag for this fragment, as per
+     * {@link FragmentTransaction#add(Fragment, String) FragmentTransaction.add}.
+     * @return Returns the identifier of the committed transaction, as per
+     * {@link FragmentTransaction#commit() FragmentTransaction.commit()}.
+     */
+    public int show(FragmentTransaction transaction, String tag) {
+        mDismissed = false;
+        mShownByMe = true;
+        transaction.add(this, tag);
+        mViewDestroyed = false;
+        mBackStackId = transaction.commit();
+        return mBackStackId;
+    }
+
+    /**
+     * Dismiss the fragment and its dialog.  If the fragment was added to the
+     * back stack, all back stack state up to and including this entry will
+     * be popped.  Otherwise, a new transaction will be committed to remove
+     * the fragment.
+     */
+    public void dismiss() {
+        dismissInternal(false);
+    }
+
+    /**
+     * Version of {@link #dismiss()} that uses
+     * {@link FragmentTransaction#commitAllowingStateLoss()
+     * FragmentTransaction.commitAllowingStateLoss()}. See linked
+     * documentation for further details.
+     */
+    public void dismissAllowingStateLoss() {
+        dismissInternal(true);
+    }
+
+    void dismissInternal(boolean allowStateLoss) {
+        if (mDismissed) {
+            return;
+        }
+        mDismissed = true;
+        mShownByMe = false;
+        if (mDialog != null) {
+            mDialog.dismiss();
+            mDialog = null;
+        }
+        mViewDestroyed = true;
+        if (mBackStackId >= 0) {
+            getFragmentManager().popBackStack(mBackStackId,
+                    FragmentManager.POP_BACK_STACK_INCLUSIVE);
+            mBackStackId = -1;
+        } else {
+            FragmentTransaction ft = getFragmentManager().beginTransaction();
+            ft.remove(this);
+            if (allowStateLoss) {
+                ft.commitAllowingStateLoss();
+            } else {
+                ft.commit();
+            }
+        }
+    }
+    
+    public Dialog getDialog() {
+        return mDialog;
+    }
+
+    @StyleRes
+    public int getTheme() {
+        return mTheme;
+    }
+
+    /**
+     * Control whether the shown Dialog is cancelable.  Use this instead of
+     * directly calling {@link Dialog#setCancelable(boolean)
+     * Dialog.setCancelable(boolean)}, because DialogFragment needs to change
+     * its behavior based on this.
+     *
+     * @param cancelable If true, the dialog is cancelable.  The default
+     * is true.
+     */
+    public void setCancelable(boolean cancelable) {
+        mCancelable = cancelable;
+        if (mDialog != null) mDialog.setCancelable(cancelable);
+    }
+
+    /**
+     * Return the current value of {@link #setCancelable(boolean)}.
+     */
+    public boolean isCancelable() {
+        return mCancelable;
+    }
+
+    /**
+     * Controls whether this fragment should be shown in a dialog.  If not
+     * set, no Dialog will be created in {@link #onActivityCreated(Bundle)},
+     * and the fragment's view hierarchy will thus not be added to it.  This
+     * allows you to instead use it as a normal fragment (embedded inside of
+     * its activity).
+     *
+     * <p>This is normally set for you based on whether the fragment is
+     * associated with a container view ID passed to
+     * {@link FragmentTransaction#add(int, Fragment) FragmentTransaction.add(int, Fragment)}.
+     * If the fragment was added with a container, setShowsDialog will be
+     * initialized to false; otherwise, it will be true.
+     *
+     * @param showsDialog If true, the fragment will be displayed in a Dialog.
+     * If false, no Dialog will be created and the fragment's view hierarchy
+     * left undisturbed.
+     */
+    public void setShowsDialog(boolean showsDialog) {
+        mShowsDialog = showsDialog;
+    }
+
+    /**
+     * Return the current value of {@link #setShowsDialog(boolean)}.
+     */
+    public boolean getShowsDialog() {
+        return mShowsDialog;
+    }
+
+    @Override
+    public void onAttach(Context context) {
+        super.onAttach(context);
+        if (!mShownByMe) {
+            // If not explicitly shown through our API, take this as an
+            // indication that the dialog is no longer dismissed.
+            mDismissed = false;
+        }
+    }
+
+    @Override
+    public void onDetach() {
+        super.onDetach();
+        if (!mShownByMe && !mDismissed) {
+            // The fragment was not shown by a direct call here, it is not
+            // dismissed, and now it is being detached...  well, okay, thou
+            // art now dismissed.  Have fun.
+            mDismissed = true;
+        }
+    }
+
+    @Override
+    public void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        mShowsDialog = mContainerId == 0;
+
+        if (savedInstanceState != null) {
+            mStyle = savedInstanceState.getInt(SAVED_STYLE, STYLE_NORMAL);
+            mTheme = savedInstanceState.getInt(SAVED_THEME, 0);
+            mCancelable = savedInstanceState.getBoolean(SAVED_CANCELABLE, true);
+            mShowsDialog = savedInstanceState.getBoolean(SAVED_SHOWS_DIALOG, mShowsDialog);
+            mBackStackId = savedInstanceState.getInt(SAVED_BACK_STACK_ID, -1);
+        }
+    }
+
+    /** @hide */
+    @Override
+    public LayoutInflater getLayoutInflater(Bundle savedInstanceState) {
+        if (!mShowsDialog) {
+            return super.getLayoutInflater(savedInstanceState);
+        }
+
+        mDialog = onCreateDialog(savedInstanceState);
+
+        if (mDialog != null) {
+            setupDialog(mDialog, mStyle);
+
+            return (LayoutInflater) mDialog.getContext().getSystemService(
+                    Context.LAYOUT_INFLATER_SERVICE);
+        }
+        return (LayoutInflater) mHost.getContext().getSystemService(
+                Context.LAYOUT_INFLATER_SERVICE);
+    }
+
+    /** @hide */
+    public void setupDialog(Dialog dialog, int style) {
+        switch (style) {
+            case STYLE_NO_INPUT:
+                dialog.getWindow().addFlags(
+                        WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
+                                WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
+                // fall through...
+            case STYLE_NO_FRAME:
+            case STYLE_NO_TITLE:
+                dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
+        }
+    }
+    
+    /**
+     * Override to build your own custom Dialog container.  This is typically
+     * used to show an AlertDialog instead of a generic Dialog; when doing so,
+     * {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)} does not need
+     * to be implemented since the AlertDialog takes care of its own content.
+     * 
+     * <p>This method will be called after {@link #onCreate(Bundle)} and
+     * before {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)}.  The
+     * default implementation simply instantiates and returns a {@link Dialog}
+     * class.
+     * 
+     * <p><em>Note: DialogFragment own the {@link Dialog#setOnCancelListener
+     * Dialog.setOnCancelListener} and {@link Dialog#setOnDismissListener
+     * Dialog.setOnDismissListener} callbacks.  You must not set them yourself.</em>
+     * To find out about these events, override {@link #onCancel(DialogInterface)}
+     * and {@link #onDismiss(DialogInterface)}.</p>
+     * 
+     * @param savedInstanceState The last saved instance state of the Fragment,
+     * or null if this is a freshly created Fragment.
+     * 
+     * @return Return a new Dialog instance to be displayed by the Fragment.
+     */
+    @NonNull
+    public Dialog onCreateDialog(Bundle savedInstanceState) {
+        return new Dialog(getActivity(), getTheme());
+    }
+
+    @Override
+    public void onCancel(DialogInterface dialog) {
+    }
+
+    @Override
+    public void onDismiss(DialogInterface dialog) {
+        if (!mViewDestroyed) {
+            // Note: we need to use allowStateLoss, because the dialog
+            // dispatches this asynchronously so we can receive the call
+            // after the activity is paused.  Worst case, when the user comes
+            // back to the activity they see the dialog again.
+            dismissInternal(true);
+        }
+    }
+
+    @Override
+    public void onActivityCreated(Bundle savedInstanceState) {
+        super.onActivityCreated(savedInstanceState);
+
+        if (!mShowsDialog) {
+            return;
+        }
+
+        View view = getView();
+        if (view != null) {
+            if (view.getParent() != null) {
+                throw new IllegalStateException(
+                        "DialogFragment can not be attached to a container view");
+            }
+            mDialog.setContentView(view);
+        }
+        final Activity activity = getActivity();
+        if (activity != null) {
+            mDialog.setOwnerActivity(activity);
+        }
+        mDialog.setCancelable(mCancelable);
+        mDialog.setOnCancelListener(this);
+        mDialog.setOnDismissListener(this);
+        if (savedInstanceState != null) {
+            Bundle dialogState = savedInstanceState.getBundle(SAVED_DIALOG_STATE_TAG);
+            if (dialogState != null) {
+                mDialog.onRestoreInstanceState(dialogState);
+            }
+        }
+    }
+
+    @Override
+    public void onStart() {
+        super.onStart();
+
+        if (mDialog != null) {
+            mViewDestroyed = false;
+            mDialog.show();
+        }
+    }
+
+    @Override
+    public void onSaveInstanceState(Bundle outState) {
+        super.onSaveInstanceState(outState);
+        if (mDialog != null) {
+            Bundle dialogState = mDialog.onSaveInstanceState();
+            if (dialogState != null) {
+                outState.putBundle(SAVED_DIALOG_STATE_TAG, dialogState);
+            }
+        }
+        if (mStyle != STYLE_NORMAL) {
+            outState.putInt(SAVED_STYLE, mStyle);
+        }
+        if (mTheme != 0) {
+            outState.putInt(SAVED_THEME, mTheme);
+        }
+        if (!mCancelable) {
+            outState.putBoolean(SAVED_CANCELABLE, mCancelable);
+        }
+        if (!mShowsDialog) {
+            outState.putBoolean(SAVED_SHOWS_DIALOG, mShowsDialog);
+        }
+        if (mBackStackId != -1) {
+            outState.putInt(SAVED_BACK_STACK_ID, mBackStackId);
+        }
+    }
+
+    @Override
+    public void onStop() {
+        super.onStop();
+        if (mDialog != null) {
+            mDialog.hide();
+        }
+    }
+
+    /**
+     * Remove dialog.
+     */
+    @Override
+    public void onDestroyView() {
+        super.onDestroyView();
+        if (mDialog != null) {
+            // Set removed here because this dismissal is just to hide
+            // the dialog -- we don't want this to cause the fragment to
+            // actually be removed.
+            mViewDestroyed = true;
+            mDialog.dismiss();
+            mDialog = null;
+        }
+    }
+}
diff --git a/fragment/java/android/support/v4/app/Fragment.java b/fragment/java/android/support/v4/app/Fragment.java
new file mode 100644
index 0000000..07aea7c
--- /dev/null
+++ b/fragment/java/android/support/v4/app/Fragment.java
@@ -0,0 +1,2351 @@
+/*
+ * 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 android.support.v4.app;
+
+import android.app.Activity;
+import android.content.ComponentCallbacks;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentSender;
+import android.content.res.Configuration;
+import android.content.res.Resources;
+import android.os.Bundle;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.support.annotation.CallSuper;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.annotation.StringRes;
+import android.support.v4.util.SimpleArrayMap;
+import android.support.v4.util.DebugUtils;
+import android.support.v4.view.LayoutInflaterCompat;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.util.SparseArray;
+import android.view.ContextMenu;
+import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.ContextMenu.ContextMenuInfo;
+import android.view.View.OnCreateContextMenuListener;
+import android.view.animation.Animation;
+import android.widget.AdapterView;
+
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
+
+final class FragmentState implements Parcelable {
+    final String mClassName;
+    final int mIndex;
+    final boolean mFromLayout;
+    final int mFragmentId;
+    final int mContainerId;
+    final String mTag;
+    final boolean mRetainInstance;
+    final boolean mDetached;
+    final Bundle mArguments;
+    final boolean mHidden;
+    
+    Bundle mSavedFragmentState;
+    
+    Fragment mInstance;
+
+    public FragmentState(Fragment frag) {
+        mClassName = frag.getClass().getName();
+        mIndex = frag.mIndex;
+        mFromLayout = frag.mFromLayout;
+        mFragmentId = frag.mFragmentId;
+        mContainerId = frag.mContainerId;
+        mTag = frag.mTag;
+        mRetainInstance = frag.mRetainInstance;
+        mDetached = frag.mDetached;
+        mArguments = frag.mArguments;
+        mHidden = frag.mHidden;
+    }
+    
+    public FragmentState(Parcel in) {
+        mClassName = in.readString();
+        mIndex = in.readInt();
+        mFromLayout = in.readInt() != 0;
+        mFragmentId = in.readInt();
+        mContainerId = in.readInt();
+        mTag = in.readString();
+        mRetainInstance = in.readInt() != 0;
+        mDetached = in.readInt() != 0;
+        mArguments = in.readBundle();
+        mHidden = in.readInt() != 0;
+        mSavedFragmentState = in.readBundle();
+    }
+
+    public Fragment instantiate(FragmentHostCallback host, Fragment parent,
+            FragmentManagerNonConfig childNonConfig) {
+        if (mInstance == null) {
+            final Context context = host.getContext();
+            if (mArguments != null) {
+                mArguments.setClassLoader(context.getClassLoader());
+            }
+
+            mInstance = Fragment.instantiate(context, mClassName, mArguments);
+
+            if (mSavedFragmentState != null) {
+                mSavedFragmentState.setClassLoader(context.getClassLoader());
+                mInstance.mSavedFragmentState = mSavedFragmentState;
+            }
+            mInstance.setIndex(mIndex, parent);
+            mInstance.mFromLayout = mFromLayout;
+            mInstance.mRestored = true;
+            mInstance.mFragmentId = mFragmentId;
+            mInstance.mContainerId = mContainerId;
+            mInstance.mTag = mTag;
+            mInstance.mRetainInstance = mRetainInstance;
+            mInstance.mDetached = mDetached;
+            mInstance.mHidden = mHidden;
+            mInstance.mFragmentManager = host.mFragmentManager;
+
+            if (FragmentManagerImpl.DEBUG) Log.v(FragmentManagerImpl.TAG,
+                    "Instantiated fragment " + mInstance);
+        }
+        mInstance.mChildNonConfig = childNonConfig;
+        return mInstance;
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeString(mClassName);
+        dest.writeInt(mIndex);
+        dest.writeInt(mFromLayout ? 1 : 0);
+        dest.writeInt(mFragmentId);
+        dest.writeInt(mContainerId);
+        dest.writeString(mTag);
+        dest.writeInt(mRetainInstance ? 1 : 0);
+        dest.writeInt(mDetached ? 1 : 0);
+        dest.writeBundle(mArguments);
+        dest.writeInt(mHidden? 1 : 0);
+        dest.writeBundle(mSavedFragmentState);
+    }
+    
+    public static final Parcelable.Creator<FragmentState> CREATOR
+            = new Parcelable.Creator<FragmentState>() {
+        @Override
+        public FragmentState createFromParcel(Parcel in) {
+            return new FragmentState(in);
+        }
+
+        @Override
+        public FragmentState[] newArray(int size) {
+            return new FragmentState[size];
+        }
+    };
+}
+
+/**
+ * Static library support version of the framework's {@link android.app.Fragment}.
+ * Used to write apps that run on platforms prior to Android 3.0.  When running
+ * on Android 3.0 or above, this implementation is still used; it does not try
+ * to switch to the framework's implementation. See the framework {@link android.app.Fragment}
+ * documentation for a class overview.
+ *
+ * <p>The main differences when using this support version instead of the framework version are:
+ * <ul>
+ *  <li>Your activity must extend {@link FragmentActivity}
+ *  <li>You must call {@link FragmentActivity#getSupportFragmentManager} to get the
+ *  {@link FragmentManager}
+ * </ul>
+ *
+ */
+public class Fragment implements ComponentCallbacks, OnCreateContextMenuListener {
+    private static final SimpleArrayMap<String, Class<?>> sClassMap =
+            new SimpleArrayMap<String, Class<?>>();
+
+    static final Object USE_DEFAULT_TRANSITION = new Object();
+
+    static final int INITIALIZING = 0;     // Not yet created.
+    static final int CREATED = 1;          // Created.
+    static final int ACTIVITY_CREATED = 2; // The activity has finished its creation.
+    static final int STOPPED = 3;          // Fully created, not started.
+    static final int STARTED = 4;          // Created and started, not resumed.
+    static final int RESUMED = 5;          // Created started and resumed.
+    
+    int mState = INITIALIZING;
+    
+    // Non-null if the fragment's view hierarchy is currently animating away,
+    // meaning we need to wait a bit on completely destroying it.  This is the
+    // view that is animating.
+    View mAnimatingAway;
+
+    // If mAnimatingAway != null, this is the state we should move to once the
+    // animation is done.
+    int mStateAfterAnimating;
+
+    // When instantiated from saved state, this is the saved state.
+    Bundle mSavedFragmentState;
+    SparseArray<Parcelable> mSavedViewState;
+    
+    // Index into active fragment array.
+    int mIndex = -1;
+    
+    // Internal unique name for this fragment;
+    String mWho;
+    
+    // Construction arguments;
+    Bundle mArguments;
+
+    // Target fragment.
+    Fragment mTarget;
+
+    // For use when retaining a fragment: this is the index of the last mTarget.
+    int mTargetIndex = -1;
+
+    // Target request code.
+    int mTargetRequestCode;
+
+    // True if the fragment is in the list of added fragments.
+    boolean mAdded;
+    
+    // If set this fragment is being removed from its activity.
+    boolean mRemoving;
+    
+    // Set to true if this fragment was instantiated from a layout file.
+    boolean mFromLayout;
+    
+    // Set to true when the view has actually been inflated in its layout.
+    boolean mInLayout;
+
+    // True if this fragment has been restored from previously saved state.
+    boolean mRestored;
+
+    // Number of active back stack entries this fragment is in.
+    int mBackStackNesting;
+
+    // The fragment manager we are associated with.  Set as soon as the
+    // fragment is used in a transaction; cleared after it has been removed
+    // from all transactions.
+    FragmentManagerImpl mFragmentManager;
+
+    // Host this fragment is attached to.
+    FragmentHostCallback mHost;
+
+    // Private fragment manager for child fragments inside of this one.
+    FragmentManagerImpl mChildFragmentManager;
+
+    // For use when restoring fragment state and descendant fragments are retained.
+    // This state is set by FragmentState.instantiate and cleared in onCreate.
+    FragmentManagerNonConfig mChildNonConfig;
+
+    // If this Fragment is contained in another Fragment, this is that container.
+    Fragment mParentFragment;
+
+    // The optional identifier for this fragment -- either the container ID if it
+    // was dynamically added to the view hierarchy, or the ID supplied in
+    // layout.
+    int mFragmentId;
+    
+    // When a fragment is being dynamically added to the view hierarchy, this
+    // is the identifier of the parent container it is being added to.
+    int mContainerId;
+    
+    // The optional named tag for this fragment -- usually used to find
+    // fragments that are not part of the layout.
+    String mTag;
+    
+    // Set to true when the app has requested that this fragment be hidden
+    // from the user.
+    boolean mHidden;
+    
+    // Set to true when the app has requested that this fragment be deactivated.
+    boolean mDetached;
+
+    // If set this fragment would like its instance retained across
+    // configuration changes.
+    boolean mRetainInstance;
+
+    // If set this fragment is being retained across the current config change.
+    boolean mRetaining;
+    
+    // If set this fragment has menu items to contribute.
+    boolean mHasMenu;
+
+    // Set to true to allow the fragment's menu to be shown.
+    boolean mMenuVisible = true;
+
+    // Used to verify that subclasses call through to super class.
+    boolean mCalled;
+    
+    // If app has requested a specific animation, this is the one to use.
+    int mNextAnim;
+    
+    // The parent container of the fragment after dynamically added to UI.
+    ViewGroup mContainer;
+    
+    // The View generated for this fragment.
+    View mView;
+    
+    // The real inner view that will save/restore state.
+    View mInnerView;
+
+    // Whether this fragment should defer starting until after other fragments
+    // have been started and their loaders are finished.
+    boolean mDeferStart;
+    
+    // Hint provided by the app that this fragment is currently visible to the user.
+    boolean mUserVisibleHint = true;
+
+    LoaderManagerImpl mLoaderManager;
+    boolean mLoadersStarted;
+    boolean mCheckedForLoaderManager;
+
+    Object mEnterTransition = null;
+    Object mReturnTransition = USE_DEFAULT_TRANSITION;
+    Object mExitTransition = null;
+    Object mReenterTransition = USE_DEFAULT_TRANSITION;
+    Object mSharedElementEnterTransition = null;
+    Object mSharedElementReturnTransition = USE_DEFAULT_TRANSITION;
+    Boolean mAllowReturnTransitionOverlap;
+    Boolean mAllowEnterTransitionOverlap;
+
+    SharedElementCallback mEnterTransitionCallback = null;
+    SharedElementCallback mExitTransitionCallback = null;
+
+    /**
+     * State information that has been retrieved from a fragment instance
+     * through {@link FragmentManager#saveFragmentInstanceState(Fragment)
+     * FragmentManager.saveFragmentInstanceState}.
+     */
+    public static class SavedState implements Parcelable {
+        final Bundle mState;
+
+        SavedState(Bundle state) {
+            mState = state;
+        }
+
+        SavedState(Parcel in, ClassLoader loader) {
+            mState = in.readBundle();
+            if (loader != null && mState != null) {
+                mState.setClassLoader(loader);
+            }
+        }
+
+        @Override
+        public int describeContents() {
+            return 0;
+        }
+
+        @Override
+        public void writeToParcel(Parcel dest, int flags) {
+            dest.writeBundle(mState);
+        }
+
+        public static final Parcelable.Creator<SavedState> CREATOR
+                = new Parcelable.Creator<SavedState>() {
+            @Override
+            public SavedState createFromParcel(Parcel in) {
+                return new SavedState(in, null);
+            }
+
+            @Override
+            public SavedState[] newArray(int size) {
+                return new SavedState[size];
+            }
+        };
+    }
+
+    /**
+     * Thrown by {@link Fragment#instantiate(Context, String, Bundle)} when
+     * there is an instantiation failure.
+     */
+    static public class InstantiationException extends RuntimeException {
+        public InstantiationException(String msg, Exception cause) {
+            super(msg, cause);
+        }
+    }
+
+    /**
+     * Default constructor.  <strong>Every</strong> fragment must have an
+     * empty constructor, so it can be instantiated when restoring its
+     * activity's state.  It is strongly recommended that subclasses do not
+     * have other constructors with parameters, since these constructors
+     * will not be called when the fragment is re-instantiated; instead,
+     * arguments can be supplied by the caller with {@link #setArguments}
+     * and later retrieved by the Fragment with {@link #getArguments}.
+     * 
+     * <p>Applications should generally not implement a constructor.  The
+     * first place application code an run where the fragment is ready to
+     * be used is in {@link #onAttach(Activity)}, the point where the fragment
+     * is actually associated with its activity.  Some applications may also
+     * want to implement {@link #onInflate} to retrieve attributes from a
+     * layout resource, though should take care here because this happens for
+     * the fragment is attached to its activity.
+     */
+    public Fragment() {
+    }
+
+    /**
+     * Like {@link #instantiate(Context, String, Bundle)} but with a null
+     * argument Bundle.
+     */
+    public static Fragment instantiate(Context context, String fname) {
+        return instantiate(context, fname, null);
+    }
+
+    /**
+     * Create a new instance of a Fragment with the given class name.  This is
+     * the same as calling its empty constructor.
+     *
+     * @param context The calling context being used to instantiate the fragment.
+     * This is currently just used to get its ClassLoader.
+     * @param fname The class name of the fragment to instantiate.
+     * @param args Bundle of arguments to supply to the fragment, which it
+     * can retrieve with {@link #getArguments()}.  May be null.
+     * @return Returns a new fragment instance.
+     * @throws InstantiationException If there is a failure in instantiating
+     * the given fragment class.  This is a runtime exception; it is not
+     * normally expected to happen.
+     */
+    public static Fragment instantiate(Context context, String fname, @Nullable Bundle args) {
+        try {
+            Class<?> clazz = sClassMap.get(fname);
+            if (clazz == null) {
+                // Class not found in the cache, see if it's real, and try to add it
+                clazz = context.getClassLoader().loadClass(fname);
+                sClassMap.put(fname, clazz);
+            }
+            Fragment f = (Fragment)clazz.newInstance();
+            if (args != null) {
+                args.setClassLoader(f.getClass().getClassLoader());
+                f.mArguments = args;
+            }
+            return f;
+        } catch (ClassNotFoundException e) {
+            throw new InstantiationException("Unable to instantiate fragment " + fname
+                    + ": make sure class name exists, is public, and has an"
+                    + " empty constructor that is public", e);
+        } catch (java.lang.InstantiationException e) {
+            throw new InstantiationException("Unable to instantiate fragment " + fname
+                    + ": make sure class name exists, is public, and has an"
+                    + " empty constructor that is public", e);
+        } catch (IllegalAccessException e) {
+            throw new InstantiationException("Unable to instantiate fragment " + fname
+                    + ": make sure class name exists, is public, and has an"
+                    + " empty constructor that is public", e);
+        }
+    }
+
+    /**
+     * Determine if the given fragment name is a support library fragment class.
+     *
+     * @param context Context used to determine the correct ClassLoader to use
+     * @param fname Class name of the fragment to test
+     * @return true if <code>fname</code> is <code>android.support.v4.app.Fragment</code>
+     *         or a subclass, false otherwise.
+     */
+    static boolean isSupportFragmentClass(Context context, String fname) {
+        try {
+            Class<?> clazz = sClassMap.get(fname);
+            if (clazz == null) {
+                // Class not found in the cache, see if it's real, and try to add it
+                clazz = context.getClassLoader().loadClass(fname);
+                sClassMap.put(fname, clazz);
+            }
+            return Fragment.class.isAssignableFrom(clazz);
+        } catch (ClassNotFoundException e) {
+            return false;
+        }
+    }
+    
+    final void restoreViewState(Bundle savedInstanceState) {
+        if (mSavedViewState != null) {
+            mInnerView.restoreHierarchyState(mSavedViewState);
+            mSavedViewState = null;
+        }
+        mCalled = false;
+        onViewStateRestored(savedInstanceState);
+        if (!mCalled) {
+            throw new SuperNotCalledException("Fragment " + this
+                    + " did not call through to super.onViewStateRestored()");
+        }
+    }
+
+    final void setIndex(int index, Fragment parent) {
+        mIndex = index;
+        if (parent != null) {
+            mWho = parent.mWho + ":" + mIndex;
+        } else {
+            mWho = "android:fragment:" + mIndex;
+        }
+    }
+
+    final boolean isInBackStack() {
+        return mBackStackNesting > 0;
+    }
+
+    /**
+     * Subclasses can not override equals().
+     */
+    @Override final public boolean equals(Object o) {
+        return super.equals(o);
+    }
+
+    /**
+     * Subclasses can not override hashCode().
+     */
+    @Override final public int hashCode() {
+        return super.hashCode();
+    }
+    
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder(128);
+        DebugUtils.buildShortClassTag(this, sb);
+        if (mIndex >= 0) {
+            sb.append(" #");
+            sb.append(mIndex);
+        }
+        if (mFragmentId != 0) {
+            sb.append(" id=0x");
+            sb.append(Integer.toHexString(mFragmentId));
+        }
+        if (mTag != null) {
+            sb.append(" ");
+            sb.append(mTag);
+        }
+        sb.append('}');
+        return sb.toString();
+    }
+    
+    /**
+     * Return the identifier this fragment is known by.  This is either
+     * the android:id value supplied in a layout or the container view ID
+     * supplied when adding the fragment.
+     */
+    final public int getId() {
+        return mFragmentId;
+    }
+    
+    /**
+     * Get the tag name of the fragment, if specified.
+     */
+    final public String getTag() {
+        return mTag;
+    }
+    
+    /**
+     * Supply the construction arguments for this fragment.  This can only
+     * be called before the fragment has been attached to its activity; that
+     * is, you should call it immediately after constructing the fragment.  The
+     * arguments supplied here will be retained across fragment destroy and
+     * creation.
+     */
+    public void setArguments(Bundle args) {
+        if (mIndex >= 0) {
+            throw new IllegalStateException("Fragment already active");
+        }
+        mArguments = args;
+    }
+
+    /**
+     * Return the arguments supplied when the fragment was instantiated,
+     * if any.
+     */
+    final public Bundle getArguments() {
+        return mArguments;
+    }
+
+    /**
+     * Set the initial saved state that this Fragment should restore itself
+     * from when first being constructed, as returned by
+     * {@link FragmentManager#saveFragmentInstanceState(Fragment)
+     * FragmentManager.saveFragmentInstanceState}.
+     *
+     * @param state The state the fragment should be restored from.
+     */
+    public void setInitialSavedState(SavedState state) {
+        if (mIndex >= 0) {
+            throw new IllegalStateException("Fragment already active");
+        }
+        mSavedFragmentState = state != null && state.mState != null
+                ? state.mState : null;
+    }
+
+    /**
+     * Optional target for this fragment.  This may be used, for example,
+     * if this fragment is being started by another, and when done wants to
+     * give a result back to the first.  The target set here is retained
+     * across instances via {@link FragmentManager#putFragment
+     * FragmentManager.putFragment()}.
+     *
+     * @param fragment The fragment that is the target of this one.
+     * @param requestCode Optional request code, for convenience if you
+     * are going to call back with {@link #onActivityResult(int, int, Intent)}.
+     */
+    public void setTargetFragment(Fragment fragment, int requestCode) {
+        mTarget = fragment;
+        mTargetRequestCode = requestCode;
+    }
+
+    /**
+     * Return the target fragment set by {@link #setTargetFragment}.
+     */
+    final public Fragment getTargetFragment() {
+        return mTarget;
+    }
+
+    /**
+     * Return the target request code set by {@link #setTargetFragment}.
+     */
+    final public int getTargetRequestCode() {
+        return mTargetRequestCode;
+    }
+
+    /**
+     * Return the {@link Context} this fragment is currently associated with.
+     */
+    public Context getContext() {
+        return mHost == null ? null : mHost.getContext();
+    }
+
+    /**
+     * Return the {@link FragmentActivity} this fragment is currently associated with.
+     * May return {@code null} if the fragment is associated with a {@link Context}
+     * instead.
+     */
+    final public FragmentActivity getActivity() {
+        return mHost == null ? null : (FragmentActivity) mHost.getActivity();
+    }
+
+    /**
+     * Return the host object of this fragment. May return {@code null} if the fragment
+     * isn't currently being hosted.
+     */
+    final public Object getHost() {
+        return mHost == null ? null : mHost.onGetHost();
+    }
+
+    /**
+     * Return <code>getActivity().getResources()</code>.
+     */
+    final public Resources getResources() {
+        if (mHost == null) {
+            throw new IllegalStateException("Fragment " + this + " not attached to Activity");
+        }
+        return mHost.getContext().getResources();
+    }
+
+    /**
+     * Return a localized, styled CharSequence from the application's package's
+     * default string table.
+     *
+     * @param resId Resource id for the CharSequence text
+     */
+    public final CharSequence getText(@StringRes int resId) {
+        return getResources().getText(resId);
+    }
+
+    /**
+     * Return a localized string from the application's package's
+     * default string table.
+     *
+     * @param resId Resource id for the string
+     */
+    public final String getString(@StringRes int resId) {
+        return getResources().getString(resId);
+    }
+
+    /**
+     * Return a localized formatted string from the application's package's
+     * default string table, substituting the format arguments as defined in
+     * {@link java.util.Formatter} and {@link java.lang.String#format}.
+     *
+     * @param resId Resource id for the format string
+     * @param formatArgs The format arguments that will be used for substitution.
+     */
+
+    public final String getString(@StringRes int resId, Object... formatArgs) {
+        return getResources().getString(resId, formatArgs);
+    }
+
+    /**
+     * Return the FragmentManager for interacting with fragments associated
+     * with this fragment's activity.  Note that this will be non-null slightly
+     * before {@link #getActivity()}, during the time from when the fragment is
+     * placed in a {@link FragmentTransaction} until it is committed and
+     * attached to its activity.
+     *
+     * <p>If this Fragment is a child of another Fragment, the FragmentManager
+     * returned here will be the parent's {@link #getChildFragmentManager()}.
+     */
+    final public FragmentManager getFragmentManager() {
+        return mFragmentManager;
+    }
+
+    /**
+     * Return a private FragmentManager for placing and managing Fragments
+     * inside of this Fragment.
+     */
+    final public FragmentManager getChildFragmentManager() {
+        if (mChildFragmentManager == null) {
+            instantiateChildFragmentManager();
+            if (mState >= RESUMED) {
+                mChildFragmentManager.dispatchResume();
+            } else if (mState >= STARTED) {
+                mChildFragmentManager.dispatchStart();
+            } else if (mState >= ACTIVITY_CREATED) {
+                mChildFragmentManager.dispatchActivityCreated();
+            } else if (mState >= CREATED) {
+                mChildFragmentManager.dispatchCreate();
+            }
+        }
+        return mChildFragmentManager;
+    }
+
+    /**
+     * Returns the parent Fragment containing this Fragment.  If this Fragment
+     * is attached directly to an Activity, returns null.
+     */
+    final public Fragment getParentFragment() {
+        return mParentFragment;
+    }
+
+    /**
+     * Return true if the fragment is currently added to its activity.
+     */
+    final public boolean isAdded() {
+        return mHost != null && mAdded;
+    }
+
+    /**
+     * Return true if the fragment has been explicitly detached from the UI.
+     * That is, {@link FragmentTransaction#detach(Fragment)
+     * FragmentTransaction.detach(Fragment)} has been used on it.
+     */
+    final public boolean isDetached() {
+        return mDetached;
+    }
+
+    /**
+     * Return true if this fragment is currently being removed from its
+     * activity.  This is  <em>not</em> whether its activity is finishing, but
+     * rather whether it is in the process of being removed from its activity.
+     */
+    final public boolean isRemoving() {
+        return mRemoving;
+    }
+    
+    /**
+     * Return true if the layout is included as part of an activity view
+     * hierarchy via the &lt;fragment&gt; tag.  This will always be true when
+     * fragments are created through the &lt;fragment&gt; tag, <em>except</em>
+     * in the case where an old fragment is restored from a previous state and
+     * it does not appear in the layout of the current state.
+     */
+    final public boolean isInLayout() {
+        return mInLayout;
+    }
+
+    /**
+     * Return true if the fragment is in the resumed state.  This is true
+     * for the duration of {@link #onResume()} and {@link #onPause()} as well.
+     */
+    final public boolean isResumed() {
+        return mState >= RESUMED;
+    }
+    
+    /**
+     * Return true if the fragment is currently visible to the user.  This means
+     * it: (1) has been added, (2) has its view attached to the window, and 
+     * (3) is not hidden.
+     */
+    final public boolean isVisible() {
+        return isAdded() && !isHidden() && mView != null
+                && mView.getWindowToken() != null && mView.getVisibility() == View.VISIBLE;
+    }
+    
+    /**
+     * Return true if the fragment has been hidden.  By default fragments
+     * are shown.  You can find out about changes to this state with
+     * {@link #onHiddenChanged}.  Note that the hidden state is orthogonal
+     * to other states -- that is, to be visible to the user, a fragment
+     * must be both started and not hidden.
+     */
+    final public boolean isHidden() {
+        return mHidden;
+    }
+
+    /** @hide */
+    final public boolean hasOptionsMenu() {
+        return mHasMenu;
+    }
+
+    /** @hide */
+    final public boolean isMenuVisible() {
+        return mMenuVisible;
+    }
+
+    /**
+     * Called when the hidden state (as returned by {@link #isHidden()} of
+     * the fragment has changed.  Fragments start out not hidden; this will
+     * be called whenever the fragment changes state from that.
+     * @param hidden True if the fragment is now hidden, false if it is not
+     * visible.
+     */
+    public void onHiddenChanged(boolean hidden) {
+    }
+    
+    /**
+     * Control whether a fragment instance is retained across Activity
+     * re-creation (such as from a configuration change).  This can only
+     * be used with fragments not in the back stack.  If set, the fragment
+     * lifecycle will be slightly different when an activity is recreated:
+     * <ul>
+     * <li> {@link #onDestroy()} will not be called (but {@link #onDetach()} still
+     * will be, because the fragment is being detached from its current activity).
+     * <li> {@link #onCreate(Bundle)} will not be called since the fragment
+     * is not being re-created.
+     * <li> {@link #onAttach(Activity)} and {@link #onActivityCreated(Bundle)} <b>will</b>
+     * still be called.
+     * </ul>
+     */
+    public void setRetainInstance(boolean retain) {
+        mRetainInstance = retain;
+    }
+    
+    final public boolean getRetainInstance() {
+        return mRetainInstance;
+    }
+    
+    /**
+     * Report that this fragment would like to participate in populating
+     * the options menu by receiving a call to {@link #onCreateOptionsMenu}
+     * and related methods.
+     *
+     * @param hasMenu If true, the fragment has menu items to contribute.
+     */
+    public void setHasOptionsMenu(boolean hasMenu) {
+        if (mHasMenu != hasMenu) {
+            mHasMenu = hasMenu;
+            if (isAdded() && !isHidden()) {
+                mHost.onSupportInvalidateOptionsMenu();
+            }
+        }
+    }
+
+    /**
+     * Set a hint for whether this fragment's menu should be visible.  This
+     * is useful if you know that a fragment has been placed in your view
+     * hierarchy so that the user can not currently seen it, so any menu items
+     * it has should also not be shown.
+     *
+     * @param menuVisible The default is true, meaning the fragment's menu will
+     * be shown as usual.  If false, the user will not see the menu.
+     */
+    public void setMenuVisibility(boolean menuVisible) {
+        if (mMenuVisible != menuVisible) {
+            mMenuVisible = menuVisible;
+            if (mHasMenu && isAdded() && !isHidden()) {
+                mHost.onSupportInvalidateOptionsMenu();
+            }
+        }
+    }
+
+    /**
+     * Set a hint to the system about whether this fragment's UI is currently visible
+     * to the user. This hint defaults to true and is persistent across fragment instance
+     * state save and restore.
+     *
+     * <p>An app may set this to false to indicate that the fragment's UI is
+     * scrolled out of visibility or is otherwise not directly visible to the user.
+     * This may be used by the system to prioritize operations such as fragment lifecycle updates
+     * or loader ordering behavior.</p>
+     *
+     * @param isVisibleToUser true if this fragment's UI is currently visible to the user (default),
+     *                        false if it is not.
+     */
+    public void setUserVisibleHint(boolean isVisibleToUser) {
+        if (!mUserVisibleHint && isVisibleToUser && mState < STARTED
+                && mFragmentManager != null && isAdded()) {
+            mFragmentManager.performPendingDeferredStart(this);
+        }
+        mUserVisibleHint = isVisibleToUser;
+        mDeferStart = mState < STARTED && !isVisibleToUser;
+    }
+
+    /**
+     * @return The current value of the user-visible hint on this fragment.
+     * @see #setUserVisibleHint(boolean)
+     */
+    public boolean getUserVisibleHint() {
+        return mUserVisibleHint;
+    }
+
+    /**
+     * Return the LoaderManager for this fragment, creating it if needed.
+     */
+    public LoaderManager getLoaderManager() {
+        if (mLoaderManager != null) {
+            return mLoaderManager;
+        }
+        if (mHost == null) {
+            throw new IllegalStateException("Fragment " + this + " not attached to Activity");
+        }
+        mCheckedForLoaderManager = true;
+        mLoaderManager = mHost.getLoaderManager(mWho, mLoadersStarted, true);
+        return mLoaderManager;
+    }
+
+    /**
+     * Call {@link Activity#startActivity(Intent)} from the fragment's
+     * containing Activity.
+     */
+    public void startActivity(Intent intent) {
+        startActivity(intent, null);
+    }
+
+    /**
+     * Call {@link Activity#startActivity(Intent, Bundle)} from the fragment's
+     * containing Activity.
+     */
+    public void startActivity(Intent intent, @Nullable Bundle options) {
+        if (mHost == null) {
+            throw new IllegalStateException("Fragment " + this + " not attached to Activity");
+        }
+        mHost.onStartActivityFromFragment(this /*fragment*/, intent, -1, options);
+    }
+
+    /**
+     * Call {@link Activity#startActivityForResult(Intent, int)} from the fragment's
+     * containing Activity.
+     */
+    public void startActivityForResult(Intent intent, int requestCode) {
+        startActivityForResult(intent, requestCode, null);
+    }
+
+    /**
+     * Call {@link Activity#startActivityForResult(Intent, int, Bundle)} from the fragment's
+     * containing Activity.
+     */
+    public void startActivityForResult(Intent intent, int requestCode, @Nullable Bundle options) {
+        if (mHost == null) {
+            throw new IllegalStateException("Fragment " + this + " not attached to Activity");
+        }
+        mHost.onStartActivityFromFragment(this /*fragment*/, intent, requestCode, options);
+    }
+
+    /**
+     * Call {@link Activity#startIntentSenderForResult(IntentSender, int, Intent, int, int, int,
+     * Bundle)} from the fragment's containing Activity.
+     */
+    public void startIntentSenderForResult(IntentSender intent, int requestCode,
+            @Nullable Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags,
+            Bundle options) throws IntentSender.SendIntentException {
+        if (mHost == null) {
+            throw new IllegalStateException("Fragment " + this + " not attached to Activity");
+        }
+        mHost.onStartIntentSenderFromFragment(this, intent, requestCode, fillInIntent, flagsMask,
+                flagsValues, extraFlags, options);
+    }
+
+    /**
+     * Receive the result from a previous call to
+     * {@link #startActivityForResult(Intent, int)}.  This follows the
+     * related Activity API as described there in
+     * {@link Activity#onActivityResult(int, int, Intent)}.
+     *
+     * @param requestCode The integer request code originally supplied to
+     *                    startActivityForResult(), allowing you to identify who this
+     *                    result came from.
+     * @param resultCode The integer result code returned by the child activity
+     *                   through its setResult().
+     * @param data An Intent, which can return result data to the caller
+     *               (various data can be attached to Intent "extras").
+     */
+    public void onActivityResult(int requestCode, int resultCode, Intent data) {
+    }
+
+    /**
+     * Requests permissions to be granted to this application. These permissions
+     * must be requested in your manifest, they should not be granted to your app,
+     * and they should have protection level {@link android.content.pm.PermissionInfo
+     * #PROTECTION_DANGEROUS dangerous}, regardless whether they are declared by
+     * the platform or a third-party app.
+     * <p>
+     * Normal permissions {@link android.content.pm.PermissionInfo#PROTECTION_NORMAL}
+     * are granted at install time if requested in the manifest. Signature permissions
+     * {@link android.content.pm.PermissionInfo#PROTECTION_SIGNATURE} are granted at
+     * install time if requested in the manifest and the signature of your app matches
+     * the signature of the app declaring the permissions.
+     * </p>
+     * <p>
+     * If your app does not have the requested permissions the user will be presented
+     * with UI for accepting them. After the user has accepted or rejected the
+     * requested permissions you will receive a callback on {@link
+     * #onRequestPermissionsResult(int, String[], int[])} reporting whether the
+     * permissions were granted or not.
+     * </p>
+     * <p>
+     * Note that requesting a permission does not guarantee it will be granted and
+     * your app should be able to run without having this permission.
+     * </p>
+     * <p>
+     * This method may start an activity allowing the user to choose which permissions
+     * to grant and which to reject. Hence, you should be prepared that your activity
+     * may be paused and resumed. Further, granting some permissions may require
+     * a restart of you application. In such a case, the system will recreate the
+     * activity stack before delivering the result to {@link
+     * #onRequestPermissionsResult(int, String[], int[])}.
+     * </p>
+     * <p>
+     * When checking whether you have a permission you should use {@link
+     * android.content.Context#checkSelfPermission(String)}.
+     * </p>
+     * <p>
+     * Calling this API for permissions already granted to your app would show UI
+     * to the user to decided whether the app can still hold these permissions. This
+     * can be useful if the way your app uses the data guarded by the permissions
+     * changes significantly.
+     * </p>
+     * <p>
+     * A sample permissions request looks like this:
+     * </p>
+     * <code><pre><p>
+     * private void showContacts() {
+     *     if (getActivity().checkSelfPermission(Manifest.permission.READ_CONTACTS)
+     *             != PackageManager.PERMISSION_GRANTED) {
+     *         requestPermissions(new String[]{Manifest.permission.READ_CONTACTS},
+     *                 PERMISSIONS_REQUEST_READ_CONTACTS);
+     *     } else {
+     *         doShowContacts();
+     *     }
+     * }
+     *
+     * {@literal @}Override
+     * public void onRequestPermissionsResult(int requestCode, String[] permissions,
+     *         int[] grantResults) {
+     *     if (requestCode == PERMISSIONS_REQUEST_READ_CONTACTS
+     *             && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
+     *         doShowContacts();
+     *     }
+     * }
+     * </code></pre></p>
+     *
+     * @param permissions The requested permissions.
+     * @param requestCode Application specific request code to match with a result
+     *    reported to {@link #onRequestPermissionsResult(int, String[], int[])}.
+     *
+     * @see #onRequestPermissionsResult(int, String[], int[])
+     * @see android.content.Context#checkSelfPermission(String)
+     */
+    public final void requestPermissions(@NonNull String[] permissions, int requestCode) {
+        if (mHost == null) {
+            throw new IllegalStateException("Fragment " + this + " not attached to Activity");
+        }
+        mHost.onRequestPermissionsFromFragment(this, permissions, requestCode);
+    }
+
+    /**
+     * Callback for the result from requesting permissions. This method
+     * is invoked for every call on {@link #requestPermissions(String[], int)}.
+     * <p>
+     * <strong>Note:</strong> It is possible that the permissions request interaction
+     * with the user is interrupted. In this case you will receive empty permissions
+     * and results arrays which should be treated as a cancellation.
+     * </p>
+     *
+     * @param requestCode The request code passed in {@link #requestPermissions(String[], int)}.
+     * @param permissions The requested permissions. Never null.
+     * @param grantResults The grant results for the corresponding permissions
+     *     which is either {@link android.content.pm.PackageManager#PERMISSION_GRANTED}
+     *     or {@link android.content.pm.PackageManager#PERMISSION_DENIED}. Never null.
+     *
+     * @see #requestPermissions(String[], int)
+     */
+    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
+            @NonNull int[] grantResults) {
+        /* callback - do nothing */
+    }
+
+    /**
+     * Gets whether you should show UI with rationale for requesting a permission.
+     * You should do this only if you do not have the permission and the context in
+     * which the permission is requested does not clearly communicate to the user
+     * what would be the benefit from granting this permission.
+     * <p>
+     * For example, if you write a camera app, requesting the camera permission
+     * would be expected by the user and no rationale for why it is requested is
+     * needed. If however, the app needs location for tagging photos then a non-tech
+     * savvy user may wonder how location is related to taking photos. In this case
+     * you may choose to show UI with rationale of requesting this permission.
+     * </p>
+     *
+     * @param permission A permission your app wants to request.
+     * @return Whether you can show permission rationale UI.
+     *
+     * @see Context#checkSelfPermission(String)
+     * @see #requestPermissions(String[], int)
+     * @see #onRequestPermissionsResult(int, String[], int[])
+     */
+    public boolean shouldShowRequestPermissionRationale(@NonNull String permission) {
+        if (mHost != null) {
+            return mHost.onShouldShowRequestPermissionRationale(permission);
+        }
+        return false;
+    }
+
+    /**
+     * @hide Hack so that DialogFragment can make its Dialog before creating
+     * its views, and the view construction can use the dialog's context for
+     * inflation.  Maybe this should become a public API. Note sure.
+     */
+    public LayoutInflater getLayoutInflater(Bundle savedInstanceState) {
+        LayoutInflater result = mHost.onGetLayoutInflater();
+        getChildFragmentManager(); // Init if needed; use raw implementation below.
+        LayoutInflaterCompat.setFactory(result, mChildFragmentManager.getLayoutInflaterFactory());
+        return result;
+    }
+
+    /**
+     * Called when a fragment is being created as part of a view layout
+     * inflation, typically from setting the content view of an activity.  This
+     * may be called immediately after the fragment is created from a <fragment>
+     * tag in a layout file.  Note this is <em>before</em> the fragment's
+     * {@link #onAttach(Activity)} has been called; all you should do here is
+     * parse the attributes and save them away.
+     * 
+     * <p>This is called every time the fragment is inflated, even if it is
+     * being inflated into a new instance with saved state.  It typically makes
+     * sense to re-parse the parameters each time, to allow them to change with
+     * different configurations.</p>
+     *
+     * <p>Here is a typical implementation of a fragment that can take parameters
+     * both through attributes supplied here as well from {@link #getArguments()}:</p>
+     *
+     * {@sample development/samples/ApiDemos/src/com/example/android/apis/app/FragmentArguments.java
+     *      fragment}
+     *
+     * <p>Note that parsing the XML attributes uses a "styleable" resource.  The
+     * declaration for the styleable used here is:</p>
+     *
+     * {@sample development/samples/ApiDemos/res/values/attrs.xml fragment_arguments}
+     * 
+     * <p>The fragment can then be declared within its activity's content layout
+     * through a tag like this:</p>
+     *
+     * {@sample development/samples/ApiDemos/res/layout/fragment_arguments.xml from_attributes}
+     *
+     * <p>This fragment can also be created dynamically from arguments given
+     * at runtime in the arguments Bundle; here is an example of doing so at
+     * creation of the containing activity:</p>
+     *
+     * {@sample development/samples/ApiDemos/src/com/example/android/apis/app/FragmentArguments.java
+     *      create}
+     *
+     * @param context The Activity that is inflating this fragment.
+     * @param attrs The attributes at the tag where the fragment is
+     * being created.
+     * @param savedInstanceState If the fragment is being re-created from
+     * a previous saved state, this is the state.
+     */
+    @CallSuper
+    public void onInflate(Context context, AttributeSet attrs, Bundle savedInstanceState) {
+        mCalled = true;
+        final Activity hostActivity = mHost == null ? null : mHost.getActivity();
+        if (hostActivity != null) {
+            mCalled = false;
+            onInflate(hostActivity, attrs, savedInstanceState);
+        }
+    }
+
+    /**
+     * Called when a fragment is being created as part of a view layout
+     * inflation, typically from setting the content view of an activity.
+     *
+     * @deprecated See {@link #onInflate(Context, AttributeSet, Bundle)}.
+     */
+    @Deprecated
+    @CallSuper
+    public void onInflate(Activity activity, AttributeSet attrs, Bundle savedInstanceState) {
+        mCalled = true;
+    }
+
+    /**
+     * Called when a fragment is attached as a child of this fragment.
+     *
+     * <p>This is called after the attached fragment's <code>onAttach</code> and before
+     * the attached fragment's <code>onCreate</code> if the fragment has not yet had a previous
+     * call to <code>onCreate</code>.</p>
+     *
+     * @param childFragment child fragment being attached
+     */
+    public void onAttachFragment(Fragment childFragment) {
+    }
+
+    /**
+     * Called when a fragment is first attached to its context.
+     * {@link #onCreate(Bundle)} will be called after this.
+     */
+    @CallSuper
+    public void onAttach(Context context) {
+        mCalled = true;
+        final Activity hostActivity = mHost == null ? null : mHost.getActivity();
+        if (hostActivity != null) {
+            mCalled = false;
+            onAttach(hostActivity);
+        }
+    }
+
+    /**
+     * Called when a fragment is first attached to its activity.
+     * {@link #onCreate(Bundle)} will be called after this.
+     *
+     * @deprecated See {@link #onAttach(Context)}.
+     */
+    @Deprecated
+    @CallSuper
+    public void onAttach(Activity activity) {
+        mCalled = true;
+    }
+
+    /**
+     * Called when a fragment loads an animation.
+     */
+    public Animation onCreateAnimation(int transit, boolean enter, int nextAnim) {
+        return null;
+    }
+
+    /**
+     * Called to do initial creation of a fragment.  This is called after
+     * {@link #onAttach(Activity)} and before
+     * {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)}.
+     * 
+     * <p>Note that this can be called while the fragment's activity is
+     * still in the process of being created.  As such, you can not rely
+     * on things like the activity's content view hierarchy being initialized
+     * at this point.  If you want to do work once the activity itself is
+     * created, see {@link #onActivityCreated(Bundle)}.
+     *
+     * <p>Any restored child fragments will be created before the base
+     * <code>Fragment.onCreate</code> method returns.</p>
+     * 
+     * @param savedInstanceState If the fragment is being re-created from
+     * a previous saved state, this is the state.
+     */
+    @CallSuper
+    public void onCreate(@Nullable Bundle savedInstanceState) {
+        mCalled = true;
+        restoreChildFragmentState(savedInstanceState);
+        if (mChildFragmentManager != null
+                && !mChildFragmentManager.isStateAtLeast(Fragment.CREATED)) {
+            mChildFragmentManager.dispatchCreate();
+        }
+    }
+
+    /**
+     * Restore the state of the child FragmentManager. Called by either
+     * {@link #onCreate(Bundle)} for non-retained instance fragments or by
+     * {@link FragmentManagerImpl#moveToState(Fragment, int, int, int, boolean)}
+     * for retained instance fragments.
+     *
+     * <p><strong>Postcondition:</strong> if there were child fragments to restore,
+     * the child FragmentManager will be instantiated and brought to the {@link #CREATED} state.
+     * </p>
+     *
+     * @param savedInstanceState the savedInstanceState potentially containing fragment info
+     */
+    void restoreChildFragmentState(@Nullable Bundle savedInstanceState) {
+        if (savedInstanceState != null) {
+            Parcelable p = savedInstanceState.getParcelable(
+                    FragmentActivity.FRAGMENTS_TAG);
+            if (p != null) {
+                if (mChildFragmentManager == null) {
+                    instantiateChildFragmentManager();
+                }
+                mChildFragmentManager.restoreAllState(p, mChildNonConfig);
+                mChildNonConfig = null;
+                mChildFragmentManager.dispatchCreate();
+            }
+        }
+    }
+
+    /**
+     * Called to have the fragment instantiate its user interface view.
+     * This is optional, and non-graphical fragments can return null (which
+     * is the default implementation).  This will be called between
+     * {@link #onCreate(Bundle)} and {@link #onActivityCreated(Bundle)}.
+     * 
+     * <p>If you return a View from here, you will later be called in
+     * {@link #onDestroyView} when the view is being released.
+     * 
+     * @param inflater The LayoutInflater object that can be used to inflate
+     * any views in the fragment,
+     * @param container If non-null, this is the parent view that the fragment's
+     * UI should be attached to.  The fragment should not add the view itself,
+     * but this can be used to generate the LayoutParams of the view.
+     * @param savedInstanceState If non-null, this fragment is being re-constructed
+     * from a previous saved state as given here.
+     * 
+     * @return Return the View for the fragment's UI, or null.
+     */
+    @Nullable
+    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
+            @Nullable Bundle savedInstanceState) {
+        return null;
+    }
+
+    /**
+     * Called immediately after {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)}
+     * has returned, but before any saved state has been restored in to the view.
+     * This gives subclasses a chance to initialize themselves once
+     * they know their view hierarchy has been completely created.  The fragment's
+     * view hierarchy is not however attached to its parent at this point.
+     * @param view The View returned by {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)}.
+     * @param savedInstanceState If non-null, this fragment is being re-constructed
+     * from a previous saved state as given here.
+     */
+    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
+    }
+
+    /**
+     * Get the root view for the fragment's layout (the one returned by {@link #onCreateView}),
+     * if provided.
+     * 
+     * @return The fragment's root view, or null if it has no layout.
+     */
+    @Nullable
+    public View getView() {
+        return mView;
+    }
+    
+    /**
+     * Called when the fragment's activity has been created and this
+     * fragment's view hierarchy instantiated.  It can be used to do final
+     * initialization once these pieces are in place, such as retrieving
+     * views or restoring state.  It is also useful for fragments that use
+     * {@link #setRetainInstance(boolean)} to retain their instance,
+     * as this callback tells the fragment when it is fully associated with
+     * the new activity instance.  This is called after {@link #onCreateView}
+     * and before {@link #onViewStateRestored(Bundle)}.
+     *
+     * @param savedInstanceState If the fragment is being re-created from
+     * a previous saved state, this is the state.
+     */
+    @CallSuper
+    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
+        mCalled = true;
+    }
+
+    /**
+     * Called when all saved state has been restored into the view hierarchy
+     * of the fragment.  This can be used to do initialization based on saved
+     * state that you are letting the view hierarchy track itself, such as
+     * whether check box widgets are currently checked.  This is called
+     * after {@link #onActivityCreated(Bundle)} and before
+     * {@link #onStart()}.
+     *
+     * @param savedInstanceState If the fragment is being re-created from
+     * a previous saved state, this is the state.
+     */
+    @CallSuper
+    public void onViewStateRestored(@Nullable Bundle savedInstanceState) {
+        mCalled = true;
+    }
+
+    /**
+     * Called when the Fragment is visible to the user.  This is generally
+     * tied to {@link Activity#onStart() Activity.onStart} of the containing
+     * Activity's lifecycle.
+     */
+    @CallSuper
+    public void onStart() {
+        mCalled = true;
+
+        if (!mLoadersStarted) {
+            mLoadersStarted = true;
+            if (!mCheckedForLoaderManager) {
+                mCheckedForLoaderManager = true;
+                mLoaderManager = mHost.getLoaderManager(mWho, mLoadersStarted, false);
+            }
+            if (mLoaderManager != null) {
+                mLoaderManager.doStart();
+            }
+        }
+    }
+
+    /**
+     * Called when the fragment is visible to the user and actively running.
+     * This is generally
+     * tied to {@link Activity#onResume() Activity.onResume} of the containing
+     * Activity's lifecycle.
+     */
+    @CallSuper
+    public void onResume() {
+        mCalled = true;
+    }
+    
+    /**
+     * Called to ask the fragment to save its current dynamic state, so it
+     * can later be reconstructed in a new instance of its process is
+     * restarted.  If a new instance of the fragment later needs to be
+     * created, the data you place in the Bundle here will be available
+     * in the Bundle given to {@link #onCreate(Bundle)},
+     * {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)}, and
+     * {@link #onActivityCreated(Bundle)}.
+     *
+     * <p>This corresponds to {@link Activity#onSaveInstanceState(Bundle)
+     * Activity.onSaveInstanceState(Bundle)} and most of the discussion there
+     * applies here as well.  Note however: <em>this method may be called
+     * at any time before {@link #onDestroy()}</em>.  There are many situations
+     * where a fragment may be mostly torn down (such as when placed on the
+     * back stack with no UI showing), but its state will not be saved until
+     * its owning activity actually needs to save its state.
+     *
+     * @param outState Bundle in which to place your saved state.
+     */
+    public void onSaveInstanceState(Bundle outState) {
+    }
+
+    /**
+     * Called when the Fragment's activity changes from fullscreen mode to multi-window mode and
+     * visa-versa. This is generally tied to {@link Activity#onMultiWindowModeChanged} of the
+     * containing Activity.
+     *
+     * @param isInMultiWindowMode True if the activity is in multi-window mode.
+     */
+    public void onMultiWindowModeChanged(boolean isInMultiWindowMode) {
+    }
+
+    /**
+     * Called by the system when the activity changes to and from picture-in-picture mode. This is
+     * generally tied to {@link Activity#onPictureInPictureModeChanged} of the containing Activity.
+     *
+     * @param isInPictureInPictureMode True if the activity is in picture-in-picture mode.
+     */
+    public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode) {
+    }
+
+    @Override
+    @CallSuper
+    public void onConfigurationChanged(Configuration newConfig) {
+        mCalled = true;
+    }
+
+    /**
+     * Called when the Fragment is no longer resumed.  This is generally
+     * tied to {@link Activity#onPause() Activity.onPause} of the containing
+     * Activity's lifecycle.
+     */
+    @CallSuper
+    public void onPause() {
+        mCalled = true;
+    }
+    
+    /**
+     * Called when the Fragment is no longer started.  This is generally
+     * tied to {@link Activity#onStop() Activity.onStop} of the containing
+     * Activity's lifecycle.
+     */
+    @CallSuper
+    public void onStop() {
+        mCalled = true;
+    }
+
+    @Override
+    @CallSuper
+    public void onLowMemory() {
+        mCalled = true;
+    }
+    
+    /**
+     * Called when the view previously created by {@link #onCreateView} has
+     * been detached from the fragment.  The next time the fragment needs
+     * to be displayed, a new view will be created.  This is called
+     * after {@link #onStop()} and before {@link #onDestroy()}.  It is called
+     * <em>regardless</em> of whether {@link #onCreateView} returned a
+     * non-null view.  Internally it is called after the view's state has
+     * been saved but before it has been removed from its parent.
+     */
+    @CallSuper
+    public void onDestroyView() {
+        mCalled = true;
+    }
+    
+    /**
+     * Called when the fragment is no longer in use.  This is called
+     * after {@link #onStop()} and before {@link #onDetach()}.
+     */
+    @CallSuper
+    public void onDestroy() {
+        mCalled = true;
+        //Log.v("foo", "onDestroy: mCheckedForLoaderManager=" + mCheckedForLoaderManager
+        //        + " mLoaderManager=" + mLoaderManager);
+        if (!mCheckedForLoaderManager) {
+            mCheckedForLoaderManager = true;
+            mLoaderManager = mHost.getLoaderManager(mWho, mLoadersStarted, false);
+        }
+        if (mLoaderManager != null) {
+            mLoaderManager.doDestroy();
+        }
+    }
+
+    /**
+     * Called by the fragment manager once this fragment has been removed,
+     * so that we don't have any left-over state if the application decides
+     * to re-use the instance.  This only clears state that the framework
+     * internally manages, not things the application sets.
+     */
+    void initState() {
+        mIndex = -1;
+        mWho = null;
+        mAdded = false;
+        mRemoving = false;
+        mFromLayout = false;
+        mInLayout = false;
+        mRestored = false;
+        mBackStackNesting = 0;
+        mFragmentManager = null;
+        mChildFragmentManager = null;
+        mHost = null;
+        mFragmentId = 0;
+        mContainerId = 0;
+        mTag = null;
+        mHidden = false;
+        mDetached = false;
+        mRetaining = false;
+        mLoaderManager = null;
+        mLoadersStarted = false;
+        mCheckedForLoaderManager = false;
+    }
+
+    /**
+     * Called when the fragment is no longer attached to its activity.  This
+     * is called after {@link #onDestroy()}.
+     */
+    @CallSuper
+    public void onDetach() {
+        mCalled = true;
+    }
+    
+    /**
+     * Initialize the contents of the Fragment host's standard options menu.  You
+     * should place your menu items in to <var>menu</var>.  For this method
+     * to be called, you must have first called {@link #setHasOptionsMenu}.  See
+     * {@link Activity#onCreateOptionsMenu(Menu) Activity.onCreateOptionsMenu}
+     * for more information.
+     * 
+     * @param menu The options menu in which you place your items.
+     * 
+     * @see #setHasOptionsMenu
+     * @see #onPrepareOptionsMenu
+     * @see #onOptionsItemSelected
+     */
+    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
+    }
+
+    /**
+     * Prepare the Fragment host's standard options menu to be displayed.  This is
+     * called right before the menu is shown, every time it is shown.  You can
+     * use this method to efficiently enable/disable items or otherwise
+     * dynamically modify the contents.  See
+     * {@link Activity#onPrepareOptionsMenu(Menu) Activity.onPrepareOptionsMenu}
+     * for more information.
+     * 
+     * @param menu The options menu as last shown or first initialized by
+     *             onCreateOptionsMenu().
+     * 
+     * @see #setHasOptionsMenu
+     * @see #onCreateOptionsMenu
+     */
+    public void onPrepareOptionsMenu(Menu menu) {
+    }
+
+    /**
+     * Called when this fragment's option menu items are no longer being
+     * included in the overall options menu.  Receiving this call means that
+     * the menu needed to be rebuilt, but this fragment's items were not
+     * included in the newly built menu (its {@link #onCreateOptionsMenu(Menu, MenuInflater)}
+     * was not called).
+     */
+    public void onDestroyOptionsMenu() {
+    }
+    
+    /**
+     * This hook is called whenever an item in your options menu is selected.
+     * The default implementation simply returns false to have the normal
+     * processing happen (calling the item's Runnable or sending a message to
+     * its Handler as appropriate).  You can use this method for any items
+     * for which you would like to do processing without those other
+     * facilities.
+     * 
+     * <p>Derived classes should call through to the base class for it to
+     * perform the default menu handling.
+     * 
+     * @param item The menu item that was selected.
+     * 
+     * @return boolean Return false to allow normal menu processing to
+     *         proceed, true to consume it here.
+     * 
+     * @see #onCreateOptionsMenu
+     */
+    public boolean onOptionsItemSelected(MenuItem item) {
+        return false;
+    }
+
+    /**
+     * This hook is called whenever the options menu is being closed (either by the user canceling
+     * the menu with the back/menu button, or when an item is selected).
+     *  
+     * @param menu The options menu as last shown or first initialized by
+     *             onCreateOptionsMenu().
+     */
+    public void onOptionsMenuClosed(Menu menu) {
+    }
+    
+    /**
+     * Called when a context menu for the {@code view} is about to be shown.
+     * Unlike {@link #onCreateOptionsMenu}, this will be called every
+     * time the context menu is about to be shown and should be populated for
+     * the view (or item inside the view for {@link AdapterView} subclasses,
+     * this can be found in the {@code menuInfo})).
+     * <p>
+     * Use {@link #onContextItemSelected(android.view.MenuItem)} to know when an
+     * item has been selected.
+     * <p>
+     * The default implementation calls up to
+     * {@link Activity#onCreateContextMenu Activity.onCreateContextMenu}, though
+     * you can not call this implementation if you don't want that behavior.
+     * <p>
+     * It is not safe to hold onto the context menu after this method returns.
+     * {@inheritDoc}
+     */
+    @Override
+    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
+        getActivity().onCreateContextMenu(menu, v, menuInfo);
+    }
+
+    /**
+     * Registers a context menu to be shown for the given view (multiple views
+     * can show the context menu). This method will set the
+     * {@link OnCreateContextMenuListener} on the view to this fragment, so
+     * {@link #onCreateContextMenu(ContextMenu, View, ContextMenuInfo)} will be
+     * called when it is time to show the context menu.
+     * 
+     * @see #unregisterForContextMenu(View)
+     * @param view The view that should show a context menu.
+     */
+    public void registerForContextMenu(View view) {
+        view.setOnCreateContextMenuListener(this);
+    }
+    
+    /**
+     * Prevents a context menu to be shown for the given view. This method will
+     * remove the {@link OnCreateContextMenuListener} on the view.
+     * 
+     * @see #registerForContextMenu(View)
+     * @param view The view that should stop showing a context menu.
+     */
+    public void unregisterForContextMenu(View view) {
+        view.setOnCreateContextMenuListener(null);
+    }
+    
+    /**
+     * This hook is called whenever an item in a context menu is selected. The
+     * default implementation simply returns false to have the normal processing
+     * happen (calling the item's Runnable or sending a message to its Handler
+     * as appropriate). You can use this method for any items for which you
+     * would like to do processing without those other facilities.
+     * <p>
+     * Use {@link MenuItem#getMenuInfo()} to get extra information set by the
+     * View that added this menu item.
+     * <p>
+     * Derived classes should call through to the base class for it to perform
+     * the default menu handling.
+     * 
+     * @param item The context menu item that was selected.
+     * @return boolean Return false to allow normal context menu processing to
+     *         proceed, true to consume it here.
+     */
+    public boolean onContextItemSelected(MenuItem item) {
+        return false;
+    }
+
+    /**
+     * When custom transitions are used with Fragments, the enter transition callback
+     * is called when this Fragment is attached or detached when not popping the back stack.
+     *
+     * @param callback Used to manipulate the shared element transitions on this Fragment
+     *                 when added not as a pop from the back stack.
+     */
+    public void setEnterSharedElementCallback(SharedElementCallback callback) {
+        mEnterTransitionCallback = callback;
+    }
+
+    /**
+     * When custom transitions are used with Fragments, the exit transition callback
+     * is called when this Fragment is attached or detached when popping the back stack.
+     *
+     * @param callback Used to manipulate the shared element transitions on this Fragment
+     *                 when added as a pop from the back stack.
+     */
+    public void setExitSharedElementCallback(SharedElementCallback callback) {
+        mExitTransitionCallback = callback;
+    }
+
+    /**
+     * Sets the Transition that will be used to move Views into the initial scene. The entering
+     * Views will be those that are regular Views or ViewGroups that have
+     * {@link ViewGroup#isTransitionGroup} return true. Typical Transitions will extend
+     * {@link android.transition.Visibility} as entering is governed by changing visibility from
+     * {@link View#INVISIBLE} to {@link View#VISIBLE}. If <code>transition</code> is null,
+     * entering Views will remain unaffected.
+     *
+     * @param transition The Transition to use to move Views into the initial Scene.
+     */
+    public void setEnterTransition(Object transition) {
+        mEnterTransition = transition;
+    }
+
+    /**
+     * Returns the Transition that will be used to move Views into the initial scene. The entering
+     * Views will be those that are regular Views or ViewGroups that have
+     * {@link ViewGroup#isTransitionGroup} return true. Typical Transitions will extend
+     * {@link android.transition.Visibility} as entering is governed by changing visibility from
+     * {@link View#INVISIBLE} to {@link View#VISIBLE}.
+     *
+     * @return the Transition to use to move Views into the initial Scene.
+     */
+    public Object getEnterTransition() {
+        return mEnterTransition;
+    }
+
+    /**
+     * Sets the Transition that will be used to move Views out of the scene when the Fragment is
+     * preparing to be removed, hidden, or detached because of popping the back stack. The exiting
+     * Views will be those that are regular Views or ViewGroups that have
+     * {@link ViewGroup#isTransitionGroup} return true. Typical Transitions will extend
+     * {@link android.transition.Visibility} as entering is governed by changing visibility from
+     * {@link View#VISIBLE} to {@link View#INVISIBLE}. If <code>transition</code> is null,
+     * entering Views will remain unaffected. If nothing is set, the default will be to
+     * use the same value as set in {@link #setEnterTransition(Object)}.
+     *
+     * @param transition The Transition to use to move Views out of the Scene when the Fragment
+     *                   is preparing to close. <code>transition</code> must be an
+     *                   android.transition.Transition.
+     */
+    public void setReturnTransition(Object transition) {
+        mReturnTransition = transition;
+    }
+
+    /**
+     * Returns the Transition that will be used to move Views out of the scene when the Fragment is
+     * preparing to be removed, hidden, or detached because of popping the back stack. The exiting
+     * Views will be those that are regular Views or ViewGroups that have
+     * {@link ViewGroup#isTransitionGroup} return true. Typical Transitions will extend
+     * {@link android.transition.Visibility} as entering is governed by changing visibility from
+     * {@link View#VISIBLE} to {@link View#INVISIBLE}. If <code>transition</code> is null,
+     * entering Views will remain unaffected.
+     *
+     * @return the Transition to use to move Views out of the Scene when the Fragment
+     *         is preparing to close.
+     */
+    public Object getReturnTransition() {
+        return mReturnTransition == USE_DEFAULT_TRANSITION ? getEnterTransition()
+                : mReturnTransition;
+    }
+
+    /**
+     * Sets the Transition that will be used to move Views out of the scene when the
+     * fragment is removed, hidden, or detached when not popping the back stack.
+     * The exiting Views will be those that are regular Views or ViewGroups that
+     * have {@link ViewGroup#isTransitionGroup} return true. Typical Transitions will extend
+     * {@link android.transition.Visibility} as exiting is governed by changing visibility
+     * from {@link View#VISIBLE} to {@link View#INVISIBLE}. If transition is null, the views will
+     * remain unaffected.
+     *
+     * @param transition The Transition to use to move Views out of the Scene when the Fragment
+     *                   is being closed not due to popping the back stack. <code>transition</code>
+     *                   must be an android.transition.Transition.
+     */
+    public void setExitTransition(Object transition) {
+        mExitTransition = transition;
+    }
+
+    /**
+     * Returns the Transition that will be used to move Views out of the scene when the
+     * fragment is removed, hidden, or detached when not popping the back stack.
+     * The exiting Views will be those that are regular Views or ViewGroups that
+     * have {@link ViewGroup#isTransitionGroup} return true. Typical Transitions will extend
+     * {@link android.transition.Visibility} as exiting is governed by changing visibility
+     * from {@link View#VISIBLE} to {@link View#INVISIBLE}. If transition is null, the views will
+     * remain unaffected.
+     *
+     * @return the Transition to use to move Views out of the Scene when the Fragment
+     *         is being closed not due to popping the back stack.
+     */
+    public Object getExitTransition() {
+        return mExitTransition;
+    }
+
+    /**
+     * Sets the Transition that will be used to move Views in to the scene when returning due
+     * to popping a back stack. The entering Views will be those that are regular Views
+     * or ViewGroups that have {@link ViewGroup#isTransitionGroup} return true. Typical Transitions
+     * will extend {@link android.transition.Visibility} as exiting is governed by changing
+     * visibility from {@link View#VISIBLE} to {@link View#INVISIBLE}. If transition is null,
+     * the views will remain unaffected. If nothing is set, the default will be to use the same
+     * transition as {@link #setExitTransition(Object)}.
+     *
+     * @param transition The Transition to use to move Views into the scene when reentering from a
+     *                   previously-started Activity. <code>transition</code>
+     *                   must be an android.transition.Transition.
+     */
+    public void setReenterTransition(Object transition) {
+        mReenterTransition = transition;
+    }
+
+    /**
+     * Returns the Transition that will be used to move Views in to the scene when returning due
+     * to popping a back stack. The entering Views will be those that are regular Views
+     * or ViewGroups that have {@link ViewGroup#isTransitionGroup} return true. Typical Transitions
+     * will extend {@link android.transition.Visibility} as exiting is governed by changing
+     * visibility from {@link View#VISIBLE} to {@link View#INVISIBLE}. If transition is null,
+     * the views will remain unaffected. If nothing is set, the default will be to use the same
+     * transition as {@link #setExitTransition(Object)}.
+     *
+     * @return the Transition to use to move Views into the scene when reentering from a
+     *                   previously-started Activity.
+     */
+    public Object getReenterTransition() {
+        return mReenterTransition == USE_DEFAULT_TRANSITION ? getExitTransition()
+                : mReenterTransition;
+    }
+
+    /**
+     * Sets the Transition that will be used for shared elements transferred into the content
+     * Scene. Typical Transitions will affect size and location, such as
+     * {@link android.transition.ChangeBounds}. A null
+     * value will cause transferred shared elements to blink to the final position.
+     *
+     * @param transition The Transition to use for shared elements transferred into the content
+     *                   Scene.  <code>transition</code> must be an android.transition.Transition.
+     */
+    public void setSharedElementEnterTransition(Object transition) {
+        mSharedElementEnterTransition = transition;
+    }
+
+    /**
+     * Returns the Transition that will be used for shared elements transferred into the content
+     * Scene. Typical Transitions will affect size and location, such as
+     * {@link android.transition.ChangeBounds}. A null
+     * value will cause transferred shared elements to blink to the final position.
+     *
+     * @return The Transition to use for shared elements transferred into the content
+     *                   Scene.
+     */
+    public Object getSharedElementEnterTransition() {
+        return mSharedElementEnterTransition;
+    }
+
+    /**
+     * Sets the Transition that will be used for shared elements transferred back during a
+     * pop of the back stack. This Transition acts in the leaving Fragment.
+     * Typical Transitions will affect size and location, such as
+     * {@link android.transition.ChangeBounds}. A null
+     * value will cause transferred shared elements to blink to the final position.
+     * If no value is set, the default will be to use the same value as
+     * {@link #setSharedElementEnterTransition(Object)}.
+     *
+     * @param transition The Transition to use for shared elements transferred out of the content
+     *                   Scene. <code>transition</code> must be an android.transition.Transition.
+     */
+    public void setSharedElementReturnTransition(Object transition) {
+        mSharedElementReturnTransition = transition;
+    }
+
+    /**
+     * Return the Transition that will be used for shared elements transferred back during a
+     * pop of the back stack. This Transition acts in the leaving Fragment.
+     * Typical Transitions will affect size and location, such as
+     * {@link android.transition.ChangeBounds}. A null
+     * value will cause transferred shared elements to blink to the final position.
+     * If no value is set, the default will be to use the same value as
+     * {@link #setSharedElementEnterTransition(Object)}.
+     *
+     * @return The Transition to use for shared elements transferred out of the content
+     *                   Scene.
+     */
+    public Object getSharedElementReturnTransition() {
+        return mSharedElementReturnTransition == USE_DEFAULT_TRANSITION ?
+                getSharedElementEnterTransition() : mSharedElementReturnTransition;
+    }
+
+    /**
+     * Sets whether the the exit transition and enter transition overlap or not.
+     * When true, the enter transition will start as soon as possible. When false, the
+     * enter transition will wait until the exit transition completes before starting.
+     *
+     * @param allow true to start the enter transition when possible or false to
+     *              wait until the exiting transition completes.
+     */
+    public void setAllowEnterTransitionOverlap(boolean allow) {
+        mAllowEnterTransitionOverlap = allow;
+    }
+
+    /**
+     * Returns whether the the exit transition and enter transition overlap or not.
+     * When true, the enter transition will start as soon as possible. When false, the
+     * enter transition will wait until the exit transition completes before starting.
+     *
+     * @return true when the enter transition should start as soon as possible or false to
+     * when it should wait until the exiting transition completes.
+     */
+    public boolean getAllowEnterTransitionOverlap() {
+        return (mAllowEnterTransitionOverlap == null) ? true : mAllowEnterTransitionOverlap;
+    }
+
+    /**
+     * Sets whether the the return transition and reenter transition overlap or not.
+     * When true, the reenter transition will start as soon as possible. When false, the
+     * reenter transition will wait until the return transition completes before starting.
+     *
+     * @param allow true to start the reenter transition when possible or false to wait until the
+     *              return transition completes.
+     */
+    public void setAllowReturnTransitionOverlap(boolean allow) {
+        mAllowReturnTransitionOverlap = allow;
+    }
+
+    /**
+     * Returns whether the the return transition and reenter transition overlap or not.
+     * When true, the reenter transition will start as soon as possible. When false, the
+     * reenter transition will wait until the return transition completes before starting.
+     *
+     * @return true to start the reenter transition when possible or false to wait until the
+     *         return transition completes.
+     */
+    public boolean getAllowReturnTransitionOverlap() {
+        return (mAllowReturnTransitionOverlap == null) ? true : mAllowReturnTransitionOverlap;
+    }
+
+    /**
+     * Print the Fragments's state into the given stream.
+     *
+     * @param prefix Text to print at the front of each line.
+     * @param fd The raw file descriptor that the dump is being sent to.
+     * @param writer The PrintWriter to which you should dump your state.  This will be
+     * closed for you after you return.
+     * @param args additional arguments to the dump request.
+     */
+    public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) {
+        writer.print(prefix); writer.print("mFragmentId=#");
+                writer.print(Integer.toHexString(mFragmentId));
+                writer.print(" mContainerId=#");
+                writer.print(Integer.toHexString(mContainerId));
+                writer.print(" mTag="); writer.println(mTag);
+        writer.print(prefix); writer.print("mState="); writer.print(mState);
+                writer.print(" mIndex="); writer.print(mIndex);
+                writer.print(" mWho="); writer.print(mWho);
+                writer.print(" mBackStackNesting="); writer.println(mBackStackNesting);
+        writer.print(prefix); writer.print("mAdded="); writer.print(mAdded);
+                writer.print(" mRemoving="); writer.print(mRemoving);
+                writer.print(" mFromLayout="); writer.print(mFromLayout);
+                writer.print(" mInLayout="); writer.println(mInLayout);
+        writer.print(prefix); writer.print("mHidden="); writer.print(mHidden);
+                writer.print(" mDetached="); writer.print(mDetached);
+                writer.print(" mMenuVisible="); writer.print(mMenuVisible);
+                writer.print(" mHasMenu="); writer.println(mHasMenu);
+        writer.print(prefix); writer.print("mRetainInstance="); writer.print(mRetainInstance);
+                writer.print(" mRetaining="); writer.print(mRetaining);
+                writer.print(" mUserVisibleHint="); writer.println(mUserVisibleHint);
+        if (mFragmentManager != null) {
+            writer.print(prefix); writer.print("mFragmentManager=");
+                    writer.println(mFragmentManager);
+        }
+        if (mHost != null) {
+            writer.print(prefix); writer.print("mHost=");
+                    writer.println(mHost);
+        }
+        if (mParentFragment != null) {
+            writer.print(prefix); writer.print("mParentFragment=");
+                    writer.println(mParentFragment);
+        }
+        if (mArguments != null) {
+            writer.print(prefix); writer.print("mArguments="); writer.println(mArguments);
+        }
+        if (mSavedFragmentState != null) {
+            writer.print(prefix); writer.print("mSavedFragmentState=");
+                    writer.println(mSavedFragmentState);
+        }
+        if (mSavedViewState != null) {
+            writer.print(prefix); writer.print("mSavedViewState=");
+                    writer.println(mSavedViewState);
+        }
+        if (mTarget != null) {
+            writer.print(prefix); writer.print("mTarget="); writer.print(mTarget);
+                    writer.print(" mTargetRequestCode=");
+                    writer.println(mTargetRequestCode);
+        }
+        if (mNextAnim != 0) {
+            writer.print(prefix); writer.print("mNextAnim="); writer.println(mNextAnim);
+        }
+        if (mContainer != null) {
+            writer.print(prefix); writer.print("mContainer="); writer.println(mContainer);
+        }
+        if (mView != null) {
+            writer.print(prefix); writer.print("mView="); writer.println(mView);
+        }
+        if (mInnerView != null) {
+            writer.print(prefix); writer.print("mInnerView="); writer.println(mView);
+        }
+        if (mAnimatingAway != null) {
+            writer.print(prefix); writer.print("mAnimatingAway="); writer.println(mAnimatingAway);
+            writer.print(prefix); writer.print("mStateAfterAnimating=");
+                    writer.println(mStateAfterAnimating);
+        }
+        if (mLoaderManager != null) {
+            writer.print(prefix); writer.println("Loader Manager:");
+            mLoaderManager.dump(prefix + "  ", fd, writer, args);
+        }
+        if (mChildFragmentManager != null) {
+            writer.print(prefix); writer.println("Child " + mChildFragmentManager + ":");
+            mChildFragmentManager.dump(prefix + "  ", fd, writer, args);
+        }
+    }
+
+    Fragment findFragmentByWho(String who) {
+        if (who.equals(mWho)) {
+            return this;
+        }
+        if (mChildFragmentManager != null) {
+            return mChildFragmentManager.findFragmentByWho(who);
+        }
+        return null;
+    }
+
+    void instantiateChildFragmentManager() {
+        mChildFragmentManager = new FragmentManagerImpl();
+        mChildFragmentManager.attachController(mHost, new FragmentContainer() {
+            @Override
+            @Nullable
+            public View onFindViewById(int id) {
+                if (mView == null) {
+                    throw new IllegalStateException("Fragment does not have a view");
+                }
+                return mView.findViewById(id);
+            }
+
+            @Override
+            public boolean onHasView() {
+                return (mView != null);
+            }
+        }, this);
+    }
+
+    void performCreate(Bundle savedInstanceState) {
+        if (mChildFragmentManager != null) {
+            mChildFragmentManager.noteStateNotSaved();
+        }
+        mState = CREATED;
+        mCalled = false;
+        onCreate(savedInstanceState);
+        if (!mCalled) {
+            throw new SuperNotCalledException("Fragment " + this
+                    + " did not call through to super.onCreate()");
+        }
+    }
+
+    View performCreateView(LayoutInflater inflater, ViewGroup container,
+            Bundle savedInstanceState) {
+        if (mChildFragmentManager != null) {
+            mChildFragmentManager.noteStateNotSaved();
+        }
+        return onCreateView(inflater, container, savedInstanceState);
+    }
+
+    void performActivityCreated(Bundle savedInstanceState) {
+        if (mChildFragmentManager != null) {
+            mChildFragmentManager.noteStateNotSaved();
+        }
+        mState = ACTIVITY_CREATED;
+        mCalled = false;
+        onActivityCreated(savedInstanceState);
+        if (!mCalled) {
+            throw new SuperNotCalledException("Fragment " + this
+                    + " did not call through to super.onActivityCreated()");
+        }
+        if (mChildFragmentManager != null) {
+            mChildFragmentManager.dispatchActivityCreated();
+        }
+    }
+
+    void performStart() {
+        if (mChildFragmentManager != null) {
+            mChildFragmentManager.noteStateNotSaved();
+            mChildFragmentManager.execPendingActions();
+        }
+        mState = STARTED;
+        mCalled = false;
+        onStart();
+        if (!mCalled) {
+            throw new SuperNotCalledException("Fragment " + this
+                    + " did not call through to super.onStart()");
+        }
+        if (mChildFragmentManager != null) {
+            mChildFragmentManager.dispatchStart();
+        }
+        if (mLoaderManager != null) {
+            mLoaderManager.doReportStart();
+        }
+    }
+
+    void performResume() {
+        if (mChildFragmentManager != null) {
+            mChildFragmentManager.noteStateNotSaved();
+            mChildFragmentManager.execPendingActions();
+        }
+        mState = RESUMED;
+        mCalled = false;
+        onResume();
+        if (!mCalled) {
+            throw new SuperNotCalledException("Fragment " + this
+                    + " did not call through to super.onResume()");
+        }
+        if (mChildFragmentManager != null) {
+            mChildFragmentManager.dispatchResume();
+            mChildFragmentManager.execPendingActions();
+        }
+    }
+
+    void performMultiWindowModeChanged(boolean isInMultiWindowMode) {
+        onMultiWindowModeChanged(isInMultiWindowMode);
+        if (mChildFragmentManager != null) {
+            mChildFragmentManager.dispatchMultiWindowModeChanged(isInMultiWindowMode);
+        }
+    }
+
+    void performPictureInPictureModeChanged(boolean isInPictureInPictureMode) {
+        onPictureInPictureModeChanged(isInPictureInPictureMode);
+        if (mChildFragmentManager != null) {
+            mChildFragmentManager.dispatchPictureInPictureModeChanged(isInPictureInPictureMode);
+        }
+    }
+
+    void performConfigurationChanged(Configuration newConfig) {
+        onConfigurationChanged(newConfig);
+        if (mChildFragmentManager != null) {
+            mChildFragmentManager.dispatchConfigurationChanged(newConfig);
+        }
+    }
+
+    void performLowMemory() {
+        onLowMemory();
+        if (mChildFragmentManager != null) {
+            mChildFragmentManager.dispatchLowMemory();
+        }
+    }
+
+    /*
+    void performTrimMemory(int level) {
+        onTrimMemory(level);
+        if (mChildFragmentManager != null) {
+            mChildFragmentManager.dispatchTrimMemory(level);
+        }
+    }
+    */
+
+    boolean performCreateOptionsMenu(Menu menu, MenuInflater inflater) {
+        boolean show = false;
+        if (!mHidden) {
+            if (mHasMenu && mMenuVisible) {
+                show = true;
+                onCreateOptionsMenu(menu, inflater);
+            }
+            if (mChildFragmentManager != null) {
+                show |= mChildFragmentManager.dispatchCreateOptionsMenu(menu, inflater);
+            }
+        }
+        return show;
+    }
+
+    boolean performPrepareOptionsMenu(Menu menu) {
+        boolean show = false;
+        if (!mHidden) {
+            if (mHasMenu && mMenuVisible) {
+                show = true;
+                onPrepareOptionsMenu(menu);
+            }
+            if (mChildFragmentManager != null) {
+                show |= mChildFragmentManager.dispatchPrepareOptionsMenu(menu);
+            }
+        }
+        return show;
+    }
+
+    boolean performOptionsItemSelected(MenuItem item) {
+        if (!mHidden) {
+            if (mHasMenu && mMenuVisible) {
+                if (onOptionsItemSelected(item)) {
+                    return true;
+                }
+            }
+            if (mChildFragmentManager != null) {
+                if (mChildFragmentManager.dispatchOptionsItemSelected(item)) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    boolean performContextItemSelected(MenuItem item) {
+        if (!mHidden) {
+            if (onContextItemSelected(item)) {
+                return true;
+            }
+            if (mChildFragmentManager != null) {
+                if (mChildFragmentManager.dispatchContextItemSelected(item)) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    void performOptionsMenuClosed(Menu menu) {
+        if (!mHidden) {
+            if (mHasMenu && mMenuVisible) {
+                onOptionsMenuClosed(menu);
+            }
+            if (mChildFragmentManager != null) {
+                mChildFragmentManager.dispatchOptionsMenuClosed(menu);
+            }
+        }
+    }
+
+    void performSaveInstanceState(Bundle outState) {
+        onSaveInstanceState(outState);
+        if (mChildFragmentManager != null) {
+            Parcelable p = mChildFragmentManager.saveAllState();
+            if (p != null) {
+                outState.putParcelable(FragmentActivity.FRAGMENTS_TAG, p);
+            }
+        }
+    }
+
+    void performPause() {
+        if (mChildFragmentManager != null) {
+            mChildFragmentManager.dispatchPause();
+        }
+        mState = STARTED;
+        mCalled = false;
+        onPause();
+        if (!mCalled) {
+            throw new SuperNotCalledException("Fragment " + this
+                    + " did not call through to super.onPause()");
+        }
+    }
+
+    void performStop() {
+        if (mChildFragmentManager != null) {
+            mChildFragmentManager.dispatchStop();
+        }
+        mState = STOPPED;
+        mCalled = false;
+        onStop();
+        if (!mCalled) {
+            throw new SuperNotCalledException("Fragment " + this
+                    + " did not call through to super.onStop()");
+        }
+    }
+
+    void performReallyStop() {
+        if (mChildFragmentManager != null) {
+            mChildFragmentManager.dispatchReallyStop();
+        }
+        mState = ACTIVITY_CREATED;
+        if (mLoadersStarted) {
+            mLoadersStarted = false;
+            if (!mCheckedForLoaderManager) {
+                mCheckedForLoaderManager = true;
+                mLoaderManager = mHost.getLoaderManager(mWho, mLoadersStarted, false);
+            }
+            if (mLoaderManager != null) {
+                if (mHost.getRetainLoaders()) {
+                    mLoaderManager.doRetain();
+                } else {
+                    mLoaderManager.doStop();
+                }
+            }
+        }
+    }
+
+    void performDestroyView() {
+        if (mChildFragmentManager != null) {
+            mChildFragmentManager.dispatchDestroyView();
+        }
+        mState = CREATED;
+        mCalled = false;
+        onDestroyView();
+        if (!mCalled) {
+            throw new SuperNotCalledException("Fragment " + this
+                    + " did not call through to super.onDestroyView()");
+        }
+        if (mLoaderManager != null) {
+            mLoaderManager.doReportNextStart();
+        }
+    }
+
+    void performDestroy() {
+        if (mChildFragmentManager != null) {
+            mChildFragmentManager.dispatchDestroy();
+        }
+        mState = INITIALIZING;
+        mCalled = false;
+        onDestroy();
+        if (!mCalled) {
+            throw new SuperNotCalledException("Fragment " + this
+                    + " did not call through to super.onDestroy()");
+        }
+        mChildFragmentManager = null;
+    }
+
+    void performDetach() {
+        mCalled = false;
+        onDetach();
+        if (!mCalled) {
+            throw new SuperNotCalledException("Fragment " + this
+                    + " did not call through to super.onDetach()");
+        }
+
+        // Destroy the child FragmentManager if we still have it here.
+        // We won't unless we're retaining our instance and if we do,
+        // our child FragmentManager instance state will have already been saved.
+        if (mChildFragmentManager != null) {
+            if (!mRetaining) {
+                throw new IllegalStateException("Child FragmentManager of " + this + " was not "
+                        + " destroyed and this fragment is not retaining instance");
+            }
+            mChildFragmentManager.dispatchDestroy();
+            mChildFragmentManager = null;
+        }
+    }
+
+}
diff --git a/fragment/java/android/support/v4/app/FragmentActivity.java b/fragment/java/android/support/v4/app/FragmentActivity.java
new file mode 100644
index 0000000..c4953c0
--- /dev/null
+++ b/fragment/java/android/support/v4/app/FragmentActivity.java
@@ -0,0 +1,1095 @@
+/*
+ * 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 android.support.v4.app;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentSender;
+import android.content.res.Configuration;
+import android.content.res.Resources;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.os.Parcelable;
+import android.support.annotation.CallSuper;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.v4.media.session.MediaControllerCompat;
+import android.support.v4.util.SimpleArrayMap;
+import android.support.v4.util.SparseArrayCompat;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.KeyEvent;
+import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.Window;
+
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
+
+/**
+ * Base class for activities that want to use the support-based
+ * {@link android.support.v4.app.Fragment} and
+ * {@link android.support.v4.content.Loader} APIs.
+ *
+ * <p>When using this class as opposed to new platform's built-in fragment
+ * and loader support, you must use the {@link #getSupportFragmentManager()}
+ * and {@link #getSupportLoaderManager()} methods respectively to access
+ * those features.
+ *
+ * <p>Known limitations:</p>
+ * <ul>
+ * <li> <p>When using the <code>&lt;fragment></code> tag, this implementation can not
+ * use the parent view's ID as the new fragment's ID.  You must explicitly
+ * specify an ID (or tag) in the <code>&lt;fragment></code>.</p>
+ * <li> <p>Prior to Honeycomb (3.0), an activity's state was saved before pausing.
+ * Fragments are a significant amount of new state, and dynamic enough that one
+ * often wants them to change between pausing and stopping.  These classes
+ * throw an exception if you try to change the fragment state after it has been
+ * saved, to avoid accidental loss of UI state.  However this is too restrictive
+ * prior to Honeycomb, where the state is saved before pausing.  To address this,
+ * when running on platforms prior to Honeycomb an exception will not be thrown
+ * if you change fragments between the state save and the activity being stopped.
+ * This means that in some cases if the activity is restored from its last saved
+ * state, this may be a snapshot slightly before what the user last saw.</p>
+ * </ul>
+ */
+public class FragmentActivity extends BaseFragmentActivityJB implements
+        ActivityCompat.OnRequestPermissionsResultCallback,
+        ActivityCompatApi23.RequestPermissionsRequestCodeValidator {
+    private static final String TAG = "FragmentActivity";
+
+    static final String FRAGMENTS_TAG = "android:support:fragments";
+    static final String NEXT_CANDIDATE_REQUEST_INDEX_TAG = "android:support:next_request_index";
+    static final String ALLOCATED_REQUEST_INDICIES_TAG = "android:support:request_indicies";
+    static final String REQUEST_FRAGMENT_WHO_TAG = "android:support:request_fragment_who";
+    static final int MAX_NUM_PENDING_FRAGMENT_ACTIVITY_RESULTS = 0xffff - 1;
+
+    // This is the SDK API version of Honeycomb (3.0).
+    private static final int HONEYCOMB = 11;
+
+    static final int MSG_REALLY_STOPPED = 1;
+    static final int MSG_RESUME_PENDING = 2;
+
+    final Handler mHandler = new Handler() {
+        @Override
+        public void handleMessage(Message msg) {
+            switch (msg.what) {
+                case MSG_REALLY_STOPPED:
+                    if (mStopped) {
+                        doReallyStop(false);
+                    }
+                    break;
+                case MSG_RESUME_PENDING:
+                    onResumeFragments();
+                    mFragments.execPendingActions();
+                    break;
+                default:
+                    super.handleMessage(msg);
+            }
+        }
+
+    };
+    final FragmentController mFragments = FragmentController.createController(new HostCallbacks());
+
+    boolean mCreated;
+    boolean mResumed;
+    boolean mStopped;
+    boolean mReallyStopped;
+    boolean mRetaining;
+
+    boolean mOptionsMenuInvalidated;
+    boolean mRequestedPermissionsFromFragment;
+
+    // A hint for the next candidate request index. Request indicies are ints between 0 and 2^16-1
+    // which are encoded into the upper 16 bits of the requestCode for
+    // Fragment.startActivityForResult(...) calls. This allows us to dispatch onActivityResult(...)
+    // to the appropriate Fragment. Request indicies are allocated by allocateRequestIndex(...).
+    int mNextCandidateRequestIndex;
+    // A map from request index to Fragment "who" (i.e. a Fragment's unique identifier). Used to
+    // keep track of the originating Fragment for Fragment.startActivityForResult(...) calls, so we
+    // can dispatch the onActivityResult(...) to the appropriate Fragment. Will only contain entries
+    // for startActivityForResult calls where a result has not yet been delivered.
+    SparseArrayCompat<String> mPendingFragmentActivityResults;
+
+    static final class NonConfigurationInstances {
+        Object custom;
+        FragmentManagerNonConfig fragments;
+        SimpleArrayMap<String, LoaderManager> loaders;
+    }
+
+    MediaControllerCompat mMediaController;
+
+    // ------------------------------------------------------------------------
+    // HOOKS INTO ACTIVITY
+    // ------------------------------------------------------------------------
+
+    /**
+     * Dispatch incoming result to the correct fragment.
+     */
+    @Override
+    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+        mFragments.noteStateNotSaved();
+        int requestIndex = requestCode>>16;
+        if (requestIndex != 0) {
+            requestIndex--;
+
+            String who = mPendingFragmentActivityResults.get(requestIndex);
+            mPendingFragmentActivityResults.remove(requestIndex);
+            if (who == null) {
+                Log.w(TAG, "Activity result delivered for unknown Fragment.");
+                return;
+            }
+            Fragment targetFragment = mFragments.findFragmentByWho(who);
+            if (targetFragment == null) {
+                Log.w(TAG, "Activity result no fragment exists for who: " + who);
+            } else {
+                targetFragment.onActivityResult(requestCode & 0xffff, resultCode, data);
+            }
+            return;
+        }
+
+        super.onActivityResult(requestCode, resultCode, data);
+    }
+
+    /**
+     * Take care of popping the fragment back stack or finishing the activity
+     * as appropriate.
+     */
+    @Override
+    public void onBackPressed() {
+        if (!mFragments.getSupportFragmentManager().popBackStackImmediate()) {
+            super.onBackPressed();
+        }
+    }
+
+    /**
+     * Sets a {@link MediaControllerCompat} for later retrieval via
+     * {@link #getSupportMediaController()}.
+     *
+     * <p>On API 21 and later, this controller will be tied to the window of the activity and
+     * media key and volume events which are received while the Activity is in the foreground
+     * will be forwarded to the controller and used to invoke transport controls or adjust the
+     * volume. Prior to API 21, the global handling of media key and volume events through an
+     * active {@link android.support.v4.media.session.MediaSessionCompat} and media button receiver
+     * will still be respected.</p>
+     *
+     * @param mediaController The controller for the session which should receive
+     *     media keys and volume changes on API 21 and later.
+     * @see #getSupportMediaController()
+     * @see #setMediaController(android.media.session.MediaController)
+     */
+    final public void setSupportMediaController(MediaControllerCompat mediaController) {
+        mMediaController = mediaController;
+        if (android.os.Build.VERSION.SDK_INT >= 21) {
+            ActivityCompat21.setMediaController(this, mediaController.getMediaController());
+        }
+    }
+
+    /**
+     * Retrieves the current {@link MediaControllerCompat} for sending media key and volume events.
+     *
+     * @return The controller which should receive events.
+     * @see #setSupportMediaController(MediaControllerCompat)
+     * @see #getMediaController()
+     */
+    final public MediaControllerCompat getSupportMediaController() {
+        return mMediaController;
+    }
+
+    /**
+     * Reverses the Activity Scene entry Transition and triggers the calling Activity
+     * to reverse its exit Transition. When the exit Transition completes,
+     * {@link #finish()} is called. If no entry Transition was used, finish() is called
+     * immediately and the Activity exit Transition is run.
+     *
+     * <p>On Android 4.4 or lower, this method only finishes the Activity with no
+     * special exit transition.</p>
+     */
+    public void supportFinishAfterTransition() {
+        ActivityCompat.finishAfterTransition(this);
+    }
+
+    /**
+     * When {@link android.app.ActivityOptions#makeSceneTransitionAnimation(Activity,
+     * android.view.View, String)} was used to start an Activity, <var>callback</var>
+     * will be called to handle shared elements on the <i>launched</i> Activity. This requires
+     * {@link Window#FEATURE_CONTENT_TRANSITIONS}.
+     *
+     * @param callback Used to manipulate shared element transitions on the launched Activity.
+     */
+    public void setEnterSharedElementCallback(SharedElementCallback callback) {
+        ActivityCompat.setEnterSharedElementCallback(this, callback);
+    }
+
+    /**
+     * When {@link android.app.ActivityOptions#makeSceneTransitionAnimation(Activity,
+     * android.view.View, String)} was used to start an Activity, <var>listener</var>
+     * will be called to handle shared elements on the <i>launching</i> Activity. Most
+     * calls will only come when returning from the started Activity.
+     * This requires {@link Window#FEATURE_CONTENT_TRANSITIONS}.
+     *
+     * @param listener Used to manipulate shared element transitions on the launching Activity.
+     */
+    public void setExitSharedElementCallback(SharedElementCallback listener) {
+        ActivityCompat.setExitSharedElementCallback(this, listener);
+    }
+
+    /**
+     * Support library version of {@link android.app.Activity#postponeEnterTransition()} that works
+     * only on API 21 and later.
+     */
+    public void supportPostponeEnterTransition() {
+        ActivityCompat.postponeEnterTransition(this);
+    }
+
+    /**
+     * Support library version of {@link android.app.Activity#startPostponedEnterTransition()}
+     * that only works with API 21 and later.
+     */
+    public void supportStartPostponedEnterTransition() {
+        ActivityCompat.startPostponedEnterTransition(this);
+    }
+
+    /**
+     * {@inheritDoc}
+     *
+     * <p><strong>Note:</strong> If you override this method you must call
+     * <code>super.onMultiWindowModeChanged</code> to correctly dispatch the event
+     * to support fragments attached to this activity.</p>
+     *
+     * @param isInMultiWindowMode True if the activity is in multi-window mode.
+     */
+    @CallSuper
+    public void onMultiWindowModeChanged(boolean isInMultiWindowMode) {
+        mFragments.dispatchMultiWindowModeChanged(isInMultiWindowMode);
+    }
+
+    /**
+     * {@inheritDoc}
+     *
+     * <p><strong>Note:</strong> If you override this method you must call
+     * <code>super.onPictureInPictureModeChanged</code> to correctly dispatch the event
+     * to support fragments attached to this activity.</p>
+     *
+     * @param isInPictureInPictureMode True if the activity is in picture-in-picture mode.
+     */
+    @CallSuper
+    public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode) {
+        mFragments.dispatchPictureInPictureModeChanged(isInPictureInPictureMode);
+    }
+
+    /**
+     * Dispatch configuration change to all fragments.
+     */
+    @Override
+    public void onConfigurationChanged(Configuration newConfig) {
+        super.onConfigurationChanged(newConfig);
+        mFragments.dispatchConfigurationChanged(newConfig);
+    }
+
+    /**
+     * Perform initialization of all fragments and loaders.
+     */
+    @SuppressWarnings("deprecation")
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        mFragments.attachHost(null /*parent*/);
+
+        super.onCreate(savedInstanceState);
+
+        NonConfigurationInstances nc =
+                (NonConfigurationInstances) getLastNonConfigurationInstance();
+        if (nc != null) {
+            mFragments.restoreLoaderNonConfig(nc.loaders);
+        }
+        if (savedInstanceState != null) {
+            Parcelable p = savedInstanceState.getParcelable(FRAGMENTS_TAG);
+            mFragments.restoreAllState(p, nc != null ? nc.fragments : null);
+
+            // Check if there are any pending onActivityResult calls to descendent Fragments.
+            if (savedInstanceState.containsKey(NEXT_CANDIDATE_REQUEST_INDEX_TAG)) {
+                mNextCandidateRequestIndex =
+                        savedInstanceState.getInt(NEXT_CANDIDATE_REQUEST_INDEX_TAG);
+                int[] requestCodes = savedInstanceState.getIntArray(ALLOCATED_REQUEST_INDICIES_TAG);
+                String[] fragmentWhos = savedInstanceState.getStringArray(REQUEST_FRAGMENT_WHO_TAG);
+                if (requestCodes == null || fragmentWhos == null ||
+                            requestCodes.length != fragmentWhos.length) {
+                    Log.w(TAG, "Invalid requestCode mapping in savedInstanceState.");
+                } else {
+                    mPendingFragmentActivityResults = new SparseArrayCompat<>(requestCodes.length);
+                    for (int i = 0; i < requestCodes.length; i++) {
+                        mPendingFragmentActivityResults.put(requestCodes[i], fragmentWhos[i]);
+                    }
+                }
+            }
+        }
+
+        if (mPendingFragmentActivityResults == null) {
+            mPendingFragmentActivityResults = new SparseArrayCompat<>();
+            mNextCandidateRequestIndex = 0;
+        }
+
+        mFragments.dispatchCreate();
+    }
+
+    /**
+     * Dispatch to Fragment.onCreateOptionsMenu().
+     */
+    @Override
+    public boolean onCreatePanelMenu(int featureId, Menu menu) {
+        if (featureId == Window.FEATURE_OPTIONS_PANEL) {
+            boolean show = super.onCreatePanelMenu(featureId, menu);
+            show |= mFragments.dispatchCreateOptionsMenu(menu, getMenuInflater());
+            if (android.os.Build.VERSION.SDK_INT >= HONEYCOMB) {
+                return show;
+            }
+            // Prior to Honeycomb, the framework can't invalidate the options
+            // menu, so we must always say we have one in case the app later
+            // invalidates it and needs to have it shown.
+            return true;
+        }
+        return super.onCreatePanelMenu(featureId, menu);
+    }
+
+    @Override
+    final View dispatchFragmentsOnCreateView(View parent, String name, Context context,
+            AttributeSet attrs) {
+        return mFragments.onCreateView(parent, name, context, attrs);
+    }
+
+    /**
+     * Destroy all fragments and loaders.
+     */
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();
+
+        doReallyStop(false);
+
+        mFragments.dispatchDestroy();
+        mFragments.doLoaderDestroy();
+    }
+
+    /**
+     * Dispatch onLowMemory() to all fragments.
+     */
+    @Override
+    public void onLowMemory() {
+        super.onLowMemory();
+        mFragments.dispatchLowMemory();
+    }
+
+    /**
+     * Dispatch context and options menu to fragments.
+     */
+    @Override
+    public boolean onMenuItemSelected(int featureId, MenuItem item) {
+        if (super.onMenuItemSelected(featureId, item)) {
+            return true;
+        }
+        
+        switch (featureId) {
+            case Window.FEATURE_OPTIONS_PANEL:
+                return mFragments.dispatchOptionsItemSelected(item);
+                
+            case Window.FEATURE_CONTEXT_MENU:
+                return mFragments.dispatchContextItemSelected(item);
+
+            default:
+                return false;
+        }
+    }
+
+    /**
+     * Call onOptionsMenuClosed() on fragments.
+     */
+    @Override
+    public void onPanelClosed(int featureId, Menu menu) {
+        switch (featureId) {
+            case Window.FEATURE_OPTIONS_PANEL:
+                mFragments.dispatchOptionsMenuClosed(menu);
+                break;
+        }
+        super.onPanelClosed(featureId, menu);
+    }
+    
+    /**
+     * Dispatch onPause() to fragments.
+     */
+    @Override
+    protected void onPause() {
+        super.onPause();
+        mResumed = false;
+        if (mHandler.hasMessages(MSG_RESUME_PENDING)) {
+            mHandler.removeMessages(MSG_RESUME_PENDING);
+            onResumeFragments();
+        }
+        mFragments.dispatchPause();
+    }
+
+    /**
+     * Handle onNewIntent() to inform the fragment manager that the
+     * state is not saved.  If you are handling new intents and may be
+     * making changes to the fragment state, you want to be sure to call
+     * through to the super-class here first.  Otherwise, if your state
+     * is saved but the activity is not stopped, you could get an
+     * onNewIntent() call which happens before onResume() and trying to
+     * perform fragment operations at that point will throw IllegalStateException
+     * because the fragment manager thinks the state is still saved.
+     */
+    @Override
+    protected void onNewIntent(Intent intent) {
+        super.onNewIntent(intent);
+        mFragments.noteStateNotSaved();
+    }
+
+    /**
+     * Hook in to note that fragment state is no longer saved.
+     */
+    public void onStateNotSaved() {
+        mFragments.noteStateNotSaved();
+    }
+
+    /**
+     * Dispatch onResume() to fragments.  Note that for better inter-operation
+     * with older versions of the platform, at the point of this call the
+     * fragments attached to the activity are <em>not</em> resumed.  This means
+     * that in some cases the previous state may still be saved, not allowing
+     * fragment transactions that modify the state.  To correctly interact
+     * with fragments in their proper state, you should instead override
+     * {@link #onResumeFragments()}.
+     */
+    @Override
+    protected void onResume() {
+        super.onResume();
+        mHandler.sendEmptyMessage(MSG_RESUME_PENDING);
+        mResumed = true;
+        mFragments.execPendingActions();
+    }
+
+    /**
+     * Dispatch onResume() to fragments.
+     */
+    @Override
+    protected void onPostResume() {
+        super.onPostResume();
+        mHandler.removeMessages(MSG_RESUME_PENDING);
+        onResumeFragments();
+        mFragments.execPendingActions();
+    }
+
+    /**
+     * This is the fragment-orientated version of {@link #onResume()} that you
+     * can override to perform operations in the Activity at the same point
+     * where its fragments are resumed.  Be sure to always call through to
+     * the super-class.
+     */
+    protected void onResumeFragments() {
+        mFragments.dispatchResume();
+    }
+
+    /**
+     * Dispatch onPrepareOptionsMenu() to fragments.
+     */
+    @Override
+    public boolean onPreparePanel(int featureId, View view, Menu menu) {
+        if (featureId == Window.FEATURE_OPTIONS_PANEL && menu != null) {
+            if (mOptionsMenuInvalidated) {
+                mOptionsMenuInvalidated = false;
+                menu.clear();
+                onCreatePanelMenu(featureId, menu);
+            }
+            boolean goforit = onPrepareOptionsPanel(view, menu);
+            goforit |= mFragments.dispatchPrepareOptionsMenu(menu);
+            return goforit;
+        }
+        return super.onPreparePanel(featureId, view, menu);
+    }
+
+    /**
+     * @hide
+     */
+    protected boolean onPrepareOptionsPanel(View view, Menu menu) {
+        return super.onPreparePanel(Window.FEATURE_OPTIONS_PANEL, view, menu);
+    }
+
+    /**
+     * Retain all appropriate fragment and loader state.  You can NOT
+     * override this yourself!  Use {@link #onRetainCustomNonConfigurationInstance()}
+     * if you want to retain your own state.
+     */
+    @Override
+    public final Object onRetainNonConfigurationInstance() {
+        if (mStopped) {
+            doReallyStop(true);
+        }
+
+        Object custom = onRetainCustomNonConfigurationInstance();
+
+        FragmentManagerNonConfig fragments = mFragments.retainNestedNonConfig();
+        SimpleArrayMap<String, LoaderManager> loaders = mFragments.retainLoaderNonConfig();
+
+        if (fragments == null && loaders == null && custom == null) {
+            return null;
+        }
+
+        NonConfigurationInstances nci = new NonConfigurationInstances();
+        nci.custom = custom;
+        nci.fragments = fragments;
+        nci.loaders = loaders;
+        return nci;
+    }
+
+    /**
+     * Save all appropriate fragment state.
+     */
+    @Override
+    protected void onSaveInstanceState(Bundle outState) {
+        super.onSaveInstanceState(outState);
+        Parcelable p = mFragments.saveAllState();
+        if (p != null) {
+            outState.putParcelable(FRAGMENTS_TAG, p);
+        }
+        if (mPendingFragmentActivityResults.size() > 0) {
+            outState.putInt(NEXT_CANDIDATE_REQUEST_INDEX_TAG, mNextCandidateRequestIndex);
+
+            int[] requestCodes = new int[mPendingFragmentActivityResults.size()];
+            String[] fragmentWhos = new String[mPendingFragmentActivityResults.size()];
+            for (int i = 0; i < mPendingFragmentActivityResults.size(); i++) {
+                requestCodes[i] = mPendingFragmentActivityResults.keyAt(i);
+                fragmentWhos[i] = mPendingFragmentActivityResults.valueAt(i);
+            }
+            outState.putIntArray(ALLOCATED_REQUEST_INDICIES_TAG, requestCodes);
+            outState.putStringArray(REQUEST_FRAGMENT_WHO_TAG, fragmentWhos);
+        }
+    }
+
+    /**
+     * Dispatch onStart() to all fragments.  Ensure any created loaders are
+     * now started.
+     */
+    @Override
+    protected void onStart() {
+        super.onStart();
+
+        mStopped = false;
+        mReallyStopped = false;
+        mHandler.removeMessages(MSG_REALLY_STOPPED);
+
+        if (!mCreated) {
+            mCreated = true;
+            mFragments.dispatchActivityCreated();
+        }
+
+        mFragments.noteStateNotSaved();
+        mFragments.execPendingActions();
+
+        mFragments.doLoaderStart();
+
+        // NOTE: HC onStart goes here.
+
+        mFragments.dispatchStart();
+        mFragments.reportLoaderStart();
+    }
+
+    /**
+     * Dispatch onStop() to all fragments.  Ensure all loaders are stopped.
+     */
+    @Override
+    protected void onStop() {
+        super.onStop();
+
+        mStopped = true;
+        mHandler.sendEmptyMessage(MSG_REALLY_STOPPED);
+
+        mFragments.dispatchStop();
+    }
+
+    // ------------------------------------------------------------------------
+    // NEW METHODS
+    // ------------------------------------------------------------------------
+
+    /**
+     * Use this instead of {@link #onRetainNonConfigurationInstance()}.
+     * Retrieve later with {@link #getLastCustomNonConfigurationInstance()}.
+     */
+    public Object onRetainCustomNonConfigurationInstance() {
+        return null;
+    }
+
+    /**
+     * Return the value previously returned from
+     * {@link #onRetainCustomNonConfigurationInstance()}.
+     */
+    @SuppressWarnings("deprecation")
+    public Object getLastCustomNonConfigurationInstance() {
+        NonConfigurationInstances nc = (NonConfigurationInstances)
+                getLastNonConfigurationInstance();
+        return nc != null ? nc.custom : null;
+    }
+
+    /**
+     * Support library version of {@link Activity#invalidateOptionsMenu}.
+     *
+     * <p>Invalidate the activity's options menu. This will cause relevant presentations
+     * of the menu to fully update via calls to onCreateOptionsMenu and
+     * onPrepareOptionsMenu the next time the menu is requested.
+     */
+    public void supportInvalidateOptionsMenu() {
+        if (android.os.Build.VERSION.SDK_INT >= HONEYCOMB) {
+            // If we are running on HC or greater, we can use the framework
+            // API to invalidate the options menu.
+            ActivityCompatHoneycomb.invalidateOptionsMenu(this);
+            return;
+        }
+
+        // Whoops, older platform...  we'll use a hack, to manually rebuild
+        // the options menu the next time it is prepared.
+        mOptionsMenuInvalidated = true;
+    }
+
+    /**
+     * Print the Activity's state into the given stream.  This gets invoked if
+     * you run "adb shell dumpsys activity <activity_component_name>".
+     *
+     * @param prefix Desired prefix to prepend at each line of output.
+     * @param fd The raw file descriptor that the dump is being sent to.
+     * @param writer The PrintWriter to which you should dump your state.  This will be
+     * closed for you after you return.
+     * @param args additional arguments to the dump request.
+     */
+    public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) {
+        if (android.os.Build.VERSION.SDK_INT >= HONEYCOMB) {
+            // XXX This can only work if we can call the super-class impl. :/
+            //ActivityCompatHoneycomb.dump(this, prefix, fd, writer, args);
+        }
+        writer.print(prefix); writer.print("Local FragmentActivity ");
+                writer.print(Integer.toHexString(System.identityHashCode(this)));
+                writer.println(" State:");
+        String innerPrefix = prefix + "  ";
+        writer.print(innerPrefix); writer.print("mCreated=");
+                writer.print(mCreated); writer.print("mResumed=");
+                writer.print(mResumed); writer.print(" mStopped=");
+                writer.print(mStopped); writer.print(" mReallyStopped=");
+                writer.println(mReallyStopped);
+        mFragments.dumpLoaders(innerPrefix, fd, writer, args);
+        mFragments.getSupportFragmentManager().dump(prefix, fd, writer, args);
+        writer.print(prefix); writer.println("View Hierarchy:");
+        dumpViewHierarchy(prefix + "  ", writer, getWindow().getDecorView());
+    }
+
+    private static String viewToString(View view) {
+        StringBuilder out = new StringBuilder(128);
+        out.append(view.getClass().getName());
+        out.append('{');
+        out.append(Integer.toHexString(System.identityHashCode(view)));
+        out.append(' ');
+        switch (view.getVisibility()) {
+            case View.VISIBLE: out.append('V'); break;
+            case View.INVISIBLE: out.append('I'); break;
+            case View.GONE: out.append('G'); break;
+            default: out.append('.'); break;
+        }
+        out.append(view.isFocusable() ? 'F' : '.');
+        out.append(view.isEnabled() ? 'E' : '.');
+        out.append(view.willNotDraw() ? '.' : 'D');
+        out.append(view.isHorizontalScrollBarEnabled()? 'H' : '.');
+        out.append(view.isVerticalScrollBarEnabled() ? 'V' : '.');
+        out.append(view.isClickable() ? 'C' : '.');
+        out.append(view.isLongClickable() ? 'L' : '.');
+        out.append(' ');
+        out.append(view.isFocused() ? 'F' : '.');
+        out.append(view.isSelected() ? 'S' : '.');
+        out.append(view.isPressed() ? 'P' : '.');
+        out.append(' ');
+        out.append(view.getLeft());
+        out.append(',');
+        out.append(view.getTop());
+        out.append('-');
+        out.append(view.getRight());
+        out.append(',');
+        out.append(view.getBottom());
+        final int id = view.getId();
+        if (id != View.NO_ID) {
+            out.append(" #");
+            out.append(Integer.toHexString(id));
+            final Resources r = view.getResources();
+            if (id != 0 && r != null) {
+                try {
+                    String pkgname;
+                    switch (id&0xff000000) {
+                        case 0x7f000000:
+                            pkgname="app";
+                            break;
+                        case 0x01000000:
+                            pkgname="android";
+                            break;
+                        default:
+                            pkgname = r.getResourcePackageName(id);
+                            break;
+                    }
+                    String typename = r.getResourceTypeName(id);
+                    String entryname = r.getResourceEntryName(id);
+                    out.append(" ");
+                    out.append(pkgname);
+                    out.append(":");
+                    out.append(typename);
+                    out.append("/");
+                    out.append(entryname);
+                } catch (Resources.NotFoundException e) {
+                }
+            }
+        }
+        out.append("}");
+        return out.toString();
+    }
+
+    private void dumpViewHierarchy(String prefix, PrintWriter writer, View view) {
+        writer.print(prefix);
+        if (view == null) {
+            writer.println("null");
+            return;
+        }
+        writer.println(viewToString(view));
+        if (!(view instanceof ViewGroup)) {
+            return;
+        }
+        ViewGroup grp = (ViewGroup)view;
+        final int N = grp.getChildCount();
+        if (N <= 0) {
+            return;
+        }
+        prefix = prefix + "  ";
+        for (int i=0; i<N; i++) {
+            dumpViewHierarchy(prefix, writer, grp.getChildAt(i));
+        }
+    }
+
+    void doReallyStop(boolean retaining) {
+        if (!mReallyStopped) {
+            mReallyStopped = true;
+            mRetaining = retaining;
+            mHandler.removeMessages(MSG_REALLY_STOPPED);
+            onReallyStop();
+        } else if (retaining) {
+            // We're already really stopped, but we've been asked to retain.
+            // Our fragments are taken care of but we need to mark the loaders for retention.
+            // In order to do this correctly we need to restart the loaders first before
+            // handing them off to the next activity.
+            mFragments.doLoaderStart();
+            mFragments.doLoaderStop(true);
+        }
+    }
+
+    /**
+     * Pre-HC, we didn't have a way to determine whether an activity was
+     * being stopped for a config change or not until we saw
+     * onRetainNonConfigurationInstance() called after onStop().  However
+     * we need to know this, to know whether to retain fragments.  This will
+     * tell us what we need to know.
+     */
+    void onReallyStop() {
+        mFragments.doLoaderStop(mRetaining);
+
+        mFragments.dispatchReallyStop();
+    }
+
+    // ------------------------------------------------------------------------
+    // FRAGMENT SUPPORT
+    // ------------------------------------------------------------------------
+
+    /**
+     * Called when a fragment is attached to the activity.
+     *
+     * <p>This is called after the attached fragment's <code>onAttach</code> and before
+     * the attached fragment's <code>onCreate</code> if the fragment has not yet had a previous
+     * call to <code>onCreate</code>.</p>
+     */
+    @SuppressWarnings("unused")
+    public void onAttachFragment(Fragment fragment) {
+    }
+
+    /**
+     * Return the FragmentManager for interacting with fragments associated
+     * with this activity.
+     */
+    public FragmentManager getSupportFragmentManager() {
+        return mFragments.getSupportFragmentManager();
+    }
+
+    public LoaderManager getSupportLoaderManager() {
+        return mFragments.getSupportLoaderManager();
+    }
+
+    /**
+     * Modifies the standard behavior to allow results to be delivered to fragments.
+     * This imposes a restriction that requestCode be <= 0xffff.
+     */
+    @Override
+    public void startActivityForResult(Intent intent, int requestCode) {
+        // If this was started from a Fragment we've already checked the upper 16 bits were not in
+        // use, and then repurposed them for the Fragment's index.
+        if (!mStartedActivityFromFragment) {
+            if (requestCode != -1) {
+                checkForValidRequestCode(requestCode);
+            }
+        }
+        super.startActivityForResult(intent, requestCode);
+    }
+
+    @Override
+    public final void validateRequestPermissionsRequestCode(int requestCode) {
+        // We use 16 bits of the request code to encode the fragment id when
+        // requesting permissions from a fragment. Hence, requestPermissions()
+        // should validate the code against that but we cannot override it as
+        // we can not then call super and also the ActivityCompat would call
+        // back to this override. To handle this we use dependency inversion
+        // where we are the validator of request codes when requesting
+        // permissions in ActivityCompat.
+        if (!mRequestedPermissionsFromFragment
+                && requestCode != -1) {
+            checkForValidRequestCode(requestCode);
+        }
+    }
+
+    /**
+     * Callback for the result from requesting permissions. This method
+     * is invoked for every call on {@link #requestPermissions(String[], int)}.
+     * <p>
+     * <strong>Note:</strong> It is possible that the permissions request interaction
+     * with the user is interrupted. In this case you will receive empty permissions
+     * and results arrays which should be treated as a cancellation.
+     * </p>
+     *
+     * @param requestCode The request code passed in {@link #requestPermissions(String[], int)}.
+     * @param permissions The requested permissions. Never null.
+     * @param grantResults The grant results for the corresponding permissions
+     *     which is either {@link android.content.pm.PackageManager#PERMISSION_GRANTED}
+     *     or {@link android.content.pm.PackageManager#PERMISSION_DENIED}. Never null.
+     *
+     * @see #requestPermissions(String[], int)
+     */
+    @Override
+    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
+            @NonNull int[] grantResults) {
+        int index = (requestCode >> 16) & 0xffff;
+        if (index != 0) {
+            index--;
+
+            String who = mPendingFragmentActivityResults.get(index);
+            mPendingFragmentActivityResults.remove(index);
+            if (who == null) {
+                Log.w(TAG, "Activity result delivered for unknown Fragment.");
+                return;
+            }
+            Fragment frag = mFragments.findFragmentByWho(who);
+            if (frag == null) {
+                Log.w(TAG, "Activity result no fragment exists for who: " + who);
+            } else {
+                frag.onRequestPermissionsResult(requestCode & 0xffff, permissions, grantResults);
+            }
+        }
+    }
+
+    /**
+     * Called by Fragment.startActivityForResult() to implement its behavior.
+     */
+    public void startActivityFromFragment(Fragment fragment, Intent intent,
+            int requestCode) {
+        startActivityFromFragment(fragment, intent, requestCode, null);
+    }
+
+    /**
+     * Called by Fragment.startActivityForResult() to implement its behavior.
+     */
+    public void startActivityFromFragment(Fragment fragment, Intent intent,
+            int requestCode, @Nullable Bundle options) {
+        mStartedActivityFromFragment = true;
+        try {
+            if (requestCode == -1) {
+                ActivityCompat.startActivityForResult(this, intent, -1, options);
+                return;
+            }
+            checkForValidRequestCode(requestCode);
+            int requestIndex = allocateRequestIndex(fragment);
+            ActivityCompat.startActivityForResult(
+                    this, intent, ((requestIndex + 1) << 16) + (requestCode & 0xffff), options);
+        } finally {
+            mStartedActivityFromFragment = false;
+        }
+    }
+
+    /**
+     * Called by Fragment.startIntentSenderForResult() to implement its behavior.
+     */
+    public void startIntentSenderFromFragment(Fragment fragment, IntentSender intent,
+            int requestCode, @Nullable Intent fillInIntent, int flagsMask, int flagsValues,
+            int extraFlags, Bundle options) throws IntentSender.SendIntentException {
+        mStartedIntentSenderFromFragment = true;
+        try {
+            if (requestCode == -1) {
+                ActivityCompat.startIntentSenderForResult(this, intent, requestCode, fillInIntent,
+                        flagsMask, flagsValues, extraFlags, options);
+                return;
+            }
+            checkForValidRequestCode(requestCode);
+            int requestIndex = allocateRequestIndex(fragment);
+            ActivityCompat.startIntentSenderForResult(this, intent,
+                    ((requestIndex + 1) << 16) + (requestCode & 0xffff), fillInIntent,
+                    flagsMask, flagsValues, extraFlags, options);
+        } finally {
+            mStartedIntentSenderFromFragment = false;
+        }
+    }
+
+    // Allocates the next available startActivityForResult request index.
+    private int allocateRequestIndex(Fragment fragment) {
+        // Sanity check that we havn't exhaused the request index space.
+        if (mPendingFragmentActivityResults.size() >= MAX_NUM_PENDING_FRAGMENT_ACTIVITY_RESULTS) {
+            throw new IllegalStateException("Too many pending Fragment activity results.");
+        }
+
+        // Find an unallocated request index in the mPendingFragmentActivityResults map.
+        while (mPendingFragmentActivityResults.indexOfKey(mNextCandidateRequestIndex) >= 0) {
+            mNextCandidateRequestIndex =
+                    (mNextCandidateRequestIndex + 1) % MAX_NUM_PENDING_FRAGMENT_ACTIVITY_RESULTS;
+        }
+
+        int requestIndex = mNextCandidateRequestIndex;
+        mPendingFragmentActivityResults.put(requestIndex, fragment.mWho);
+        mNextCandidateRequestIndex =
+                (mNextCandidateRequestIndex + 1) % MAX_NUM_PENDING_FRAGMENT_ACTIVITY_RESULTS;
+
+        return requestIndex;
+    }
+
+    /**
+     * Called by Fragment.requestPermissions() to implement its behavior.
+     */
+    private void requestPermissionsFromFragment(Fragment fragment, String[] permissions,
+            int requestCode) {
+        if (requestCode == -1) {
+            ActivityCompat.requestPermissions(this, permissions, requestCode);
+            return;
+        }
+        checkForValidRequestCode(requestCode);
+        try {
+            mRequestedPermissionsFromFragment = true;
+            int requestIndex = allocateRequestIndex(fragment);
+            ActivityCompat.requestPermissions(this, permissions,
+                    ((requestIndex + 1) << 16) + (requestCode & 0xffff));
+        } finally {
+            mRequestedPermissionsFromFragment = false;
+        }
+    }
+
+    class HostCallbacks extends FragmentHostCallback<FragmentActivity> {
+        public HostCallbacks() {
+            super(FragmentActivity.this /*fragmentActivity*/);
+        }
+
+        @Override
+        public void onDump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) {
+            FragmentActivity.this.dump(prefix, fd, writer, args);
+        }
+
+        @Override
+        public boolean onShouldSaveFragmentState(Fragment fragment) {
+            return !isFinishing();
+        }
+
+        @Override
+        public LayoutInflater onGetLayoutInflater() {
+            return FragmentActivity.this.getLayoutInflater().cloneInContext(FragmentActivity.this);
+        }
+
+        @Override
+        public FragmentActivity onGetHost() {
+            return FragmentActivity.this;
+        }
+
+        @Override
+        public void onSupportInvalidateOptionsMenu() {
+            FragmentActivity.this.supportInvalidateOptionsMenu();
+        }
+
+        @Override
+        public void onStartActivityFromFragment(Fragment fragment, Intent intent, int requestCode) {
+            FragmentActivity.this.startActivityFromFragment(fragment, intent, requestCode);
+        }
+
+        @Override
+        public void onStartActivityFromFragment(
+                Fragment fragment, Intent intent, int requestCode, @Nullable Bundle options) {
+            FragmentActivity.this.startActivityFromFragment(fragment, intent, requestCode, options);
+        }
+
+        @Override
+        public void onStartIntentSenderFromFragment(Fragment fragment, IntentSender intent,
+                int requestCode, @Nullable Intent fillInIntent, int flagsMask, int flagsValues,
+                int extraFlags, Bundle options) throws IntentSender.SendIntentException {
+            FragmentActivity.this.startIntentSenderFromFragment(fragment, intent, requestCode,
+                    fillInIntent, flagsMask, flagsValues, extraFlags, options);
+        }
+
+        @Override
+        public void onRequestPermissionsFromFragment(@NonNull Fragment fragment,
+                @NonNull String[] permissions, int requestCode) {
+            FragmentActivity.this.requestPermissionsFromFragment(fragment, permissions,
+                    requestCode);
+        }
+
+        @Override
+        public boolean onShouldShowRequestPermissionRationale(@NonNull String permission) {
+            return ActivityCompat.shouldShowRequestPermissionRationale(
+                    FragmentActivity.this, permission);
+        }
+
+        @Override
+        public boolean onHasWindowAnimations() {
+            return getWindow() != null;
+        }
+
+        @Override
+        public int onGetWindowAnimations() {
+            final Window w = getWindow();
+            return (w == null) ? 0 : w.getAttributes().windowAnimations;
+        }
+
+        @Override
+        public void onAttachFragment(Fragment fragment) {
+            FragmentActivity.this.onAttachFragment(fragment);
+        }
+
+        @Nullable
+        @Override
+        public View onFindViewById(int id) {
+            return FragmentActivity.this.findViewById(id);
+        }
+
+        @Override
+        public boolean onHasView() {
+            final Window w = getWindow();
+            return (w != null && w.peekDecorView() != null);
+        }
+    }
+}
diff --git a/v4/java/android/support/v4/app/FragmentContainer.java b/fragment/java/android/support/v4/app/FragmentContainer.java
similarity index 100%
rename from v4/java/android/support/v4/app/FragmentContainer.java
rename to fragment/java/android/support/v4/app/FragmentContainer.java
diff --git a/v4/java/android/support/v4/app/FragmentController.java b/fragment/java/android/support/v4/app/FragmentController.java
similarity index 100%
rename from v4/java/android/support/v4/app/FragmentController.java
rename to fragment/java/android/support/v4/app/FragmentController.java
diff --git a/fragment/java/android/support/v4/app/FragmentHostCallback.java b/fragment/java/android/support/v4/app/FragmentHostCallback.java
new file mode 100644
index 0000000..75fde03
--- /dev/null
+++ b/fragment/java/android/support/v4/app/FragmentHostCallback.java
@@ -0,0 +1,366 @@
+/*
+ * Copyright (C) 2015 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 android.support.v4.app;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentSender;
+import android.os.Bundle;
+import android.os.Handler;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.v4.util.SimpleArrayMap;
+import android.view.LayoutInflater;
+import android.view.View;
+
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
+
+/**
+ * Integration points with the Fragment host.
+ * <p>
+ * Fragments may be hosted by any object; such as an {@link Activity}. In order to
+ * host fragments, implement {@link FragmentHostCallback}, overriding the methods
+ * applicable to the host.
+ */
+public abstract class FragmentHostCallback<E> extends FragmentContainer {
+    private final Activity mActivity;
+    final Context mContext;
+    private final Handler mHandler;
+    final int mWindowAnimations;
+    final FragmentManagerImpl mFragmentManager = new FragmentManagerImpl();
+    /** The loader managers for individual fragments [i.e. Fragment#getLoaderManager()] */
+    private SimpleArrayMap<String, LoaderManager> mAllLoaderManagers;
+    /** Whether or not fragment loaders should retain their state */
+    private boolean mRetainLoaders;
+    /** The loader manger for the fragment host [i.e. Activity#getLoaderManager()] */
+    private LoaderManagerImpl mLoaderManager;
+    private boolean mCheckedForLoaderManager;
+    /** Whether or not the fragment host loader manager was started */
+    private boolean mLoadersStarted;
+
+    public FragmentHostCallback(Context context, Handler handler, int windowAnimations) {
+        this(null /*activity*/, context, handler, windowAnimations);
+    }
+
+    FragmentHostCallback(FragmentActivity activity) {
+        this(activity, activity /*context*/, activity.mHandler, 0 /*windowAnimations*/);
+    }
+
+    FragmentHostCallback(Activity activity, Context context, Handler handler,
+            int windowAnimations) {
+        mActivity = activity;
+        mContext = context;
+        mHandler = handler;
+        mWindowAnimations = windowAnimations;
+    }
+
+    /**
+     * Print internal state into the given stream.
+     *
+     * @param prefix Desired prefix to prepend at each line of output.
+     * @param fd The raw file descriptor that the dump is being sent to.
+     * @param writer The PrintWriter to which you should dump your state. This will be closed
+     *                  for you after you return.
+     * @param args additional arguments to the dump request.
+     */
+    public void onDump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) {
+    }
+
+    /**
+     * Return {@code true} if the fragment's state needs to be saved.
+     */
+    public boolean onShouldSaveFragmentState(Fragment fragment) {
+        return true;
+    }
+
+    /**
+     * Return a {@link LayoutInflater}.
+     * See {@link Activity#getLayoutInflater()}.
+     */
+    public LayoutInflater onGetLayoutInflater() {
+        return (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+    }
+
+    /**
+     * Return the object that's currently hosting the fragment. If a {@link Fragment}
+     * is hosted by a {@link FragmentActivity}, the object returned here should be
+     * the same object returned from {@link Fragment#getActivity()}.
+     */
+    @Nullable
+    public abstract E onGetHost();
+
+    /**
+     * Invalidates the activity's options menu.
+     * See {@link FragmentActivity#supportInvalidateOptionsMenu()}
+     */
+    public void onSupportInvalidateOptionsMenu() {
+    }
+
+    /**
+     * Starts a new {@link Activity} from the given fragment.
+     * See {@link FragmentActivity#startActivityForResult(Intent, int)}.
+     */
+    public void onStartActivityFromFragment(Fragment fragment, Intent intent, int requestCode) {
+        onStartActivityFromFragment(fragment, intent, requestCode, null);
+    }
+
+    /**
+     * Starts a new {@link Activity} from the given fragment.
+     * See {@link FragmentActivity#startActivityForResult(Intent, int, Bundle)}.
+     */
+    public void onStartActivityFromFragment(
+            Fragment fragment, Intent intent, int requestCode, @Nullable Bundle options) {
+        if (requestCode != -1) {
+            throw new IllegalStateException(
+                    "Starting activity with a requestCode requires a FragmentActivity host");
+        }
+        mContext.startActivity(intent);
+    }
+
+    /**
+     * Starts a new {@link IntentSender} from the given fragment.
+     * See {@link Activity#startIntentSender(IntentSender, Intent, int, int, int, Bundle)}.
+     */
+    public void onStartIntentSenderFromFragment(Fragment fragment, IntentSender intent,
+            int requestCode, @Nullable Intent fillInIntent, int flagsMask, int flagsValues,
+            int extraFlags, Bundle options) throws IntentSender.SendIntentException {
+        if (requestCode != -1) {
+            throw new IllegalStateException(
+                    "Starting intent sender with a requestCode requires a FragmentActivity host");
+        }
+        ActivityCompat.startIntentSenderForResult(mActivity, intent, requestCode, fillInIntent,
+                flagsMask, flagsValues, extraFlags, options);
+    }
+
+    /**
+     * Requests permissions from the given fragment.
+     * See {@link FragmentActivity#requestPermissions(String[], int)}
+     */
+    public void onRequestPermissionsFromFragment(@NonNull Fragment fragment,
+            @NonNull String[] permissions, int requestCode) {
+    }
+
+    /**
+     * Checks whether to show permission rationale UI from a fragment.
+     * See {@link FragmentActivity#shouldShowRequestPermissionRationale(String)}
+     */
+    public boolean onShouldShowRequestPermissionRationale(@NonNull String permission) {
+        return false;
+    }
+
+    /**
+     * Return {@code true} if there are window animations.
+     */
+    public boolean onHasWindowAnimations() {
+        return true;
+    }
+
+    /**
+     * Return the window animations.
+     */
+    public int onGetWindowAnimations() {
+        return mWindowAnimations;
+    }
+
+    @Nullable
+    @Override
+    public View onFindViewById(int id) {
+        return null;
+    }
+
+    @Override
+    public boolean onHasView() {
+        return true;
+    }
+
+    Activity getActivity() {
+        return mActivity;
+    }
+
+    Context getContext() {
+        return mContext;
+    }
+
+    Handler getHandler() {
+        return mHandler;
+    }
+
+    FragmentManagerImpl getFragmentManagerImpl() {
+        return mFragmentManager;
+    }
+
+    LoaderManagerImpl getLoaderManagerImpl() {
+        if (mLoaderManager != null) {
+            return mLoaderManager;
+        }
+        mCheckedForLoaderManager = true;
+        mLoaderManager = getLoaderManager("(root)", mLoadersStarted, true /*create*/);
+        return mLoaderManager;
+    }
+
+    void inactivateFragment(String who) {
+        //Log.v(TAG, "invalidateSupportFragment: who=" + who);
+        if (mAllLoaderManagers != null) {
+            LoaderManagerImpl lm = (LoaderManagerImpl) mAllLoaderManagers.get(who);
+            if (lm != null && !lm.mRetaining) {
+                lm.doDestroy();
+                mAllLoaderManagers.remove(who);
+            }
+        }
+    }
+
+    void onAttachFragment(Fragment fragment) {
+    }
+
+    boolean getRetainLoaders() {
+        return mRetainLoaders;
+    }
+
+    void doLoaderStart() {
+        if (mLoadersStarted) {
+            return;
+        }
+        mLoadersStarted = true;
+
+        if (mLoaderManager != null) {
+            mLoaderManager.doStart();
+        } else if (!mCheckedForLoaderManager) {
+            mLoaderManager = getLoaderManager("(root)", mLoadersStarted, false);
+            // the returned loader manager may be a new one, so we have to start it
+            if ((mLoaderManager != null) && (!mLoaderManager.mStarted)) {
+                mLoaderManager.doStart();
+            }
+        }
+        mCheckedForLoaderManager = true;
+    }
+
+    // retain -- whether to stop the loader or retain it
+    void doLoaderStop(boolean retain) {
+        mRetainLoaders = retain;
+
+        if (mLoaderManager == null) {
+            return;
+        }
+
+        if (!mLoadersStarted) {
+            return;
+        }
+        mLoadersStarted = false;
+
+        if (retain) {
+            mLoaderManager.doRetain();
+        } else {
+            mLoaderManager.doStop();
+        }
+    }
+
+    void doLoaderRetain() {
+        if (mLoaderManager == null) {
+            return;
+        }
+        mLoaderManager.doRetain();
+    }
+
+    void doLoaderDestroy() {
+        if (mLoaderManager == null) {
+            return;
+        }
+        mLoaderManager.doDestroy();
+    }
+
+    void reportLoaderStart() {
+        if (mAllLoaderManagers != null) {
+            final int N = mAllLoaderManagers.size();
+            LoaderManagerImpl loaders[] = new LoaderManagerImpl[N];
+            for (int i=N-1; i>=0; i--) {
+                loaders[i] = (LoaderManagerImpl) mAllLoaderManagers.valueAt(i);
+            }
+            for (int i=0; i<N; i++) {
+                LoaderManagerImpl lm = loaders[i];
+                lm.finishRetain();
+                lm.doReportStart();
+            }
+        }
+    }
+
+    LoaderManagerImpl getLoaderManager(String who, boolean started, boolean create) {
+        if (mAllLoaderManagers == null) {
+            mAllLoaderManagers = new SimpleArrayMap<String, LoaderManager>();
+        }
+        LoaderManagerImpl lm = (LoaderManagerImpl) mAllLoaderManagers.get(who);
+        if (lm == null) {
+            if (create) {
+                lm = new LoaderManagerImpl(who, this, started);
+                mAllLoaderManagers.put(who, lm);
+            }
+        } else {
+            lm.updateHostController(this);
+        }
+        return lm;
+    }
+
+    SimpleArrayMap<String, LoaderManager> retainLoaderNonConfig() {
+        boolean retainLoaders = false;
+        if (mAllLoaderManagers != null) {
+            // Restart any loader managers that were already stopped so that they
+            // will be ready to retain
+            final int N = mAllLoaderManagers.size();
+            LoaderManagerImpl loaders[] = new LoaderManagerImpl[N];
+            for (int i=N-1; i>=0; i--) {
+                loaders[i] = (LoaderManagerImpl) mAllLoaderManagers.valueAt(i);
+            }
+            final boolean doRetainLoaders = getRetainLoaders();
+            for (int i=0; i<N; i++) {
+                LoaderManagerImpl lm = loaders[i];
+                if (!lm.mRetaining && doRetainLoaders) {
+                    if (!lm.mStarted) {
+                        lm.doStart();
+                    }
+                    lm.doRetain();
+                }
+                if (lm.mRetaining) {
+                    retainLoaders = true;
+                } else {
+                    lm.doDestroy();
+                    mAllLoaderManagers.remove(lm.mWho);
+                }
+            }
+        }
+
+        if (retainLoaders) {
+            return mAllLoaderManagers;
+        }
+        return null;
+    }
+
+    void restoreLoaderNonConfig(SimpleArrayMap<String, LoaderManager> loaderManagers) {
+        mAllLoaderManagers = loaderManagers;
+    }
+
+    void dumpLoaders(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) {
+        writer.print(prefix); writer.print("mLoadersStarted=");
+        writer.println(mLoadersStarted);
+        if (mLoaderManager != null) {
+            writer.print(prefix); writer.print("Loader Manager ");
+            writer.print(Integer.toHexString(System.identityHashCode(mLoaderManager)));
+            writer.println(":");
+            mLoaderManager.dump(prefix + "  ", fd, writer, args);
+        }
+    }
+}
diff --git a/fragment/java/android/support/v4/app/FragmentManager.java b/fragment/java/android/support/v4/app/FragmentManager.java
new file mode 100644
index 0000000..6f251e7
--- /dev/null
+++ b/fragment/java/android/support/v4/app/FragmentManager.java
@@ -0,0 +1,2470 @@
+/*
+ * 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 android.support.v4.app;
+
+import android.content.Context;
+import android.content.res.Configuration;
+import android.content.res.Resources.NotFoundException;
+import android.content.res.TypedArray;
+import android.os.Build;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.support.annotation.CallSuper;
+import android.support.annotation.IdRes;
+import android.support.annotation.StringRes;
+import android.support.v4.os.BuildCompat;
+import android.support.v4.util.DebugUtils;
+import android.support.v4.util.LogWriter;
+import android.support.v4.view.LayoutInflaterFactory;
+import android.support.v4.view.ViewCompat;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.util.SparseArray;
+import android.view.animation.AccelerateInterpolator;
+import android.view.animation.AlphaAnimation;
+import android.view.animation.Animation;
+import android.view.animation.AnimationSet;
+import android.view.animation.AnimationUtils;
+import android.view.animation.DecelerateInterpolator;
+import android.view.animation.Interpolator;
+import android.view.animation.ScaleAnimation;
+import android.view.animation.Animation.AnimationListener;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewGroup;
+
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * Static library support version of the framework's {@link android.app.FragmentManager}.
+ * Used to write apps that run on platforms prior to Android 3.0.  When running
+ * on Android 3.0 or above, this implementation is still used; it does not try
+ * to switch to the framework's implementation.  See the framework {@link FragmentManager}
+ * documentation for a class overview.
+ *
+ * <p>Your activity must derive from {@link FragmentActivity} to use this. From such an activity,
+ * you can acquire the {@link FragmentManager} by calling
+ * {@link FragmentActivity#getSupportFragmentManager}.
+ */
+public abstract class FragmentManager {
+    /**
+     * Representation of an entry on the fragment back stack, as created
+     * with {@link FragmentTransaction#addToBackStack(String)
+     * FragmentTransaction.addToBackStack()}.  Entries can later be
+     * retrieved with {@link FragmentManager#getBackStackEntryAt(int)
+     * FragmentManager.getBackStackEntry()}.
+     *
+     * <p>Note that you should never hold on to a BackStackEntry object;
+     * the identifier as returned by {@link #getId} is the only thing that
+     * will be persisted across activity instances.
+     */
+    public interface BackStackEntry {
+        /**
+         * Return the unique identifier for the entry.  This is the only
+         * representation of the entry that will persist across activity
+         * instances.
+         */
+        public int getId();
+
+        /**
+         * Get the name that was supplied to
+         * {@link FragmentTransaction#addToBackStack(String)
+         * FragmentTransaction.addToBackStack(String)} when creating this entry.
+         */
+        public String getName();
+
+        /**
+         * Return the full bread crumb title resource identifier for the entry,
+         * or 0 if it does not have one.
+         */
+        @StringRes
+        public int getBreadCrumbTitleRes();
+
+        /**
+         * Return the short bread crumb title resource identifier for the entry,
+         * or 0 if it does not have one.
+         */
+        @StringRes
+        public int getBreadCrumbShortTitleRes();
+
+        /**
+         * Return the full bread crumb title for the entry, or null if it
+         * does not have one.
+         */
+        public CharSequence getBreadCrumbTitle();
+
+        /**
+         * Return the short bread crumb title for the entry, or null if it
+         * does not have one.
+         */
+        public CharSequence getBreadCrumbShortTitle();
+    }
+
+    /**
+     * Interface to watch for changes to the back stack.
+     */
+    public interface OnBackStackChangedListener {
+        /**
+         * Called whenever the contents of the back stack change.
+         */
+        public void onBackStackChanged();
+    }
+
+    /**
+     * Start a series of edit operations on the Fragments associated with
+     * this FragmentManager.
+     * 
+     * <p>Note: A fragment transaction can only be created/committed prior
+     * to an activity saving its state.  If you try to commit a transaction
+     * after {@link FragmentActivity#onSaveInstanceState FragmentActivity.onSaveInstanceState()}
+     * (and prior to a following {@link FragmentActivity#onStart FragmentActivity.onStart}
+     * or {@link FragmentActivity#onResume FragmentActivity.onResume()}, you will get an error.
+     * This is because the framework takes care of saving your current fragments
+     * in the state, and if changes are made after the state is saved then they
+     * will be lost.</p>
+     */
+    public abstract FragmentTransaction beginTransaction();
+
+    /**
+     * @hide -- remove once prebuilts are in.
+     * @deprecated
+     */
+    @Deprecated
+    public FragmentTransaction openTransaction() {
+        return beginTransaction();
+    }
+    
+    /**
+     * After a {@link FragmentTransaction} is committed with
+     * {@link FragmentTransaction#commit FragmentTransaction.commit()}, it
+     * is scheduled to be executed asynchronously on the process's main thread.
+     * If you want to immediately executing any such pending operations, you
+     * can call this function (only from the main thread) to do so.  Note that
+     * all callbacks and other related behavior will be done from within this
+     * call, so be careful about where this is called from.
+     *
+     * <p>If you are committing a single transaction that does not modify the
+     * fragment back stack, strongly consider using
+     * {@link FragmentTransaction#commitNow()} instead. This can help avoid
+     * unwanted side effects when other code in your app has pending committed
+     * transactions that expect different timing.</p>
+     *
+     * @return Returns true if there were any pending transactions to be
+     * executed.
+     */
+    public abstract boolean executePendingTransactions();
+
+    /**
+     * Finds a fragment that was identified by the given id either when inflated
+     * from XML or as the container ID when added in a transaction.  This first
+     * searches through fragments that are currently added to the manager's
+     * activity; if no such fragment is found, then all fragments currently
+     * on the back stack associated with this ID are searched.
+     * @return The fragment if found or null otherwise.
+     */
+    public abstract Fragment findFragmentById(@IdRes int id);
+
+    /**
+     * Finds a fragment that was identified by the given tag either when inflated
+     * from XML or as supplied when added in a transaction.  This first
+     * searches through fragments that are currently added to the manager's
+     * activity; if no such fragment is found, then all fragments currently
+     * on the back stack are searched.
+     * @return The fragment if found or null otherwise.
+     */
+    public abstract Fragment findFragmentByTag(String tag);
+
+    /**
+     * Flag for {@link #popBackStack(String, int)}
+     * and {@link #popBackStack(int, int)}: If set, and the name or ID of
+     * a back stack entry has been supplied, then all matching entries will
+     * be consumed until one that doesn't match is found or the bottom of
+     * the stack is reached.  Otherwise, all entries up to but not including that entry
+     * will be removed.
+     */
+    public static final int POP_BACK_STACK_INCLUSIVE = 1<<0;
+
+    /**
+     * Pop the top state off the back stack.  Returns true if there was one
+     * to pop, else false.  This function is asynchronous -- it enqueues the
+     * request to pop, but the action will not be performed until the application
+     * returns to its event loop.
+     */
+    public abstract void popBackStack();
+
+    /**
+     * Like {@link #popBackStack()}, but performs the operation immediately
+     * inside of the call.  This is like calling {@link #executePendingTransactions()}
+     * afterwards.
+     * @return Returns true if there was something popped, else false.
+     */
+    public abstract boolean popBackStackImmediate();
+
+    /**
+     * Pop the last fragment transition from the manager's fragment
+     * back stack.  If there is nothing to pop, false is returned.
+     * This function is asynchronous -- it enqueues the
+     * request to pop, but the action will not be performed until the application
+     * returns to its event loop.
+     * 
+     * @param name If non-null, this is the name of a previous back state
+     * to look for; if found, all states up to that state will be popped.  The
+     * {@link #POP_BACK_STACK_INCLUSIVE} flag can be used to control whether
+     * the named state itself is popped. If null, only the top state is popped.
+     * @param flags Either 0 or {@link #POP_BACK_STACK_INCLUSIVE}.
+     */
+    public abstract void popBackStack(String name, int flags);
+
+    /**
+     * Like {@link #popBackStack(String, int)}, but performs the operation immediately
+     * inside of the call.  This is like calling {@link #executePendingTransactions()}
+     * afterwards.
+     * @return Returns true if there was something popped, else false.
+     */
+    public abstract boolean popBackStackImmediate(String name, int flags);
+
+    /**
+     * Pop all back stack states up to the one with the given identifier.
+     * This function is asynchronous -- it enqueues the
+     * request to pop, but the action will not be performed until the application
+     * returns to its event loop.
+     * 
+     * @param id Identifier of the stated to be popped. If no identifier exists,
+     * false is returned.
+     * The identifier is the number returned by
+     * {@link FragmentTransaction#commit() FragmentTransaction.commit()}.  The
+     * {@link #POP_BACK_STACK_INCLUSIVE} flag can be used to control whether
+     * the named state itself is popped.
+     * @param flags Either 0 or {@link #POP_BACK_STACK_INCLUSIVE}.
+     */
+    public abstract void popBackStack(int id, int flags);
+
+    /**
+     * Like {@link #popBackStack(int, int)}, but performs the operation immediately
+     * inside of the call.  This is like calling {@link #executePendingTransactions()}
+     * afterwards.
+     * @return Returns true if there was something popped, else false.
+     */
+    public abstract boolean popBackStackImmediate(int id, int flags);
+
+    /**
+     * Return the number of entries currently in the back stack.
+     */
+    public abstract int getBackStackEntryCount();
+
+    /**
+     * Return the BackStackEntry at index <var>index</var> in the back stack;
+     * entries start index 0 being the bottom of the stack.
+     */
+    public abstract BackStackEntry getBackStackEntryAt(int index);
+
+    /**
+     * Add a new listener for changes to the fragment back stack.
+     */
+    public abstract void addOnBackStackChangedListener(OnBackStackChangedListener listener);
+
+    /**
+     * Remove a listener that was previously added with
+     * {@link #addOnBackStackChangedListener(OnBackStackChangedListener)}.
+     */
+    public abstract void removeOnBackStackChangedListener(OnBackStackChangedListener listener);
+
+    /**
+     * Put a reference to a fragment in a Bundle.  This Bundle can be
+     * persisted as saved state, and when later restoring
+     * {@link #getFragment(Bundle, String)} will return the current
+     * instance of the same fragment.
+     *
+     * @param bundle The bundle in which to put the fragment reference.
+     * @param key The name of the entry in the bundle.
+     * @param fragment The Fragment whose reference is to be stored.
+     */
+    public abstract void putFragment(Bundle bundle, String key, Fragment fragment);
+
+    /**
+     * Retrieve the current Fragment instance for a reference previously
+     * placed with {@link #putFragment(Bundle, String, Fragment)}.
+     *
+     * @param bundle The bundle from which to retrieve the fragment reference.
+     * @param key The name of the entry in the bundle.
+     * @return Returns the current Fragment instance that is associated with
+     * the given reference.
+     */
+    public abstract Fragment getFragment(Bundle bundle, String key);
+
+    /**
+     * Get a list of all fragments that have been added to the fragment manager.
+     *
+     * @return The list of all fragments or null if none.
+     * @hide
+     */
+    public abstract List<Fragment> getFragments();
+
+    /**
+     * Save the current instance state of the given Fragment.  This can be
+     * used later when creating a new instance of the Fragment and adding
+     * it to the fragment manager, to have it create itself to match the
+     * current state returned here.  Note that there are limits on how
+     * this can be used:
+     *
+     * <ul>
+     * <li>The Fragment must currently be attached to the FragmentManager.
+     * <li>A new Fragment created using this saved state must be the same class
+     * type as the Fragment it was created from.
+     * <li>The saved state can not contain dependencies on other fragments --
+     * that is it can't use {@link #putFragment(Bundle, String, Fragment)} to
+     * store a fragment reference because that reference may not be valid when
+     * this saved state is later used.  Likewise the Fragment's target and
+     * result code are not included in this state.
+     * </ul>
+     *
+     * @param f The Fragment whose state is to be saved.
+     * @return The generated state.  This will be null if there was no
+     * interesting state created by the fragment.
+     */
+    public abstract Fragment.SavedState saveFragmentInstanceState(Fragment f);
+
+    /**
+     * Returns true if the final {@link android.app.Activity#onDestroy() Activity.onDestroy()}
+     * call has been made on the FragmentManager's Activity, so this instance is now dead.
+     */
+    public abstract boolean isDestroyed();
+
+    /**
+     * Print the FragmentManager's state into the given stream.
+     *
+     * @param prefix Text to print at the front of each line.
+     * @param fd The raw file descriptor that the dump is being sent to.
+     * @param writer A PrintWriter to which the dump is to be set.
+     * @param args Additional arguments to the dump request.
+     */
+    public abstract void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args);
+
+    /**
+     * Control whether the framework's internal fragment manager debugging
+     * logs are turned on.  If enabled, you will see output in logcat as
+     * the framework performs fragment operations.
+     */
+    public static void enableDebugLogging(boolean enabled) {
+        FragmentManagerImpl.DEBUG = enabled;
+    }
+}
+
+final class FragmentManagerState implements Parcelable {
+    FragmentState[] mActive;
+    int[] mAdded;
+    BackStackState[] mBackStack;
+    
+    public FragmentManagerState() {
+    }
+    
+    public FragmentManagerState(Parcel in) {
+        mActive = in.createTypedArray(FragmentState.CREATOR);
+        mAdded = in.createIntArray();
+        mBackStack = in.createTypedArray(BackStackState.CREATOR);
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeTypedArray(mActive, flags);
+        dest.writeIntArray(mAdded);
+        dest.writeTypedArray(mBackStack, flags);
+    }
+    
+    public static final Parcelable.Creator<FragmentManagerState> CREATOR
+            = new Parcelable.Creator<FragmentManagerState>() {
+        @Override
+        public FragmentManagerState createFromParcel(Parcel in) {
+            return new FragmentManagerState(in);
+        }
+
+        @Override
+        public FragmentManagerState[] newArray(int size) {
+            return new FragmentManagerState[size];
+        }
+    };
+}
+
+/**
+ * Container for fragments associated with an activity.
+ */
+final class FragmentManagerImpl extends FragmentManager implements LayoutInflaterFactory {
+    static boolean DEBUG = false;
+    static final String TAG = "FragmentManager";
+    
+    static final boolean HONEYCOMB = android.os.Build.VERSION.SDK_INT >= 11;
+
+    static final String TARGET_REQUEST_CODE_STATE_TAG = "android:target_req_state";
+    static final String TARGET_STATE_TAG = "android:target_state";
+    static final String VIEW_STATE_TAG = "android:view_state";
+    static final String USER_VISIBLE_HINT_TAG = "android:user_visible_hint";
+
+    static class AnimateOnHWLayerIfNeededListener implements AnimationListener {
+        private AnimationListener mOriginalListener;
+        private boolean mShouldRunOnHWLayer;
+        private View mView;
+
+        public AnimateOnHWLayerIfNeededListener(final View v, Animation anim) {
+            if (v == null || anim == null) {
+                return;
+            }
+            mView = v;
+        }
+
+        public AnimateOnHWLayerIfNeededListener(final View v, Animation anim,
+                AnimationListener listener) {
+            if (v == null || anim == null) {
+                return;
+            }
+            mOriginalListener = listener;
+            mView = v;
+            mShouldRunOnHWLayer = true;
+        }
+
+        @Override
+        @CallSuper
+        public void onAnimationStart(Animation animation) {
+            if (mOriginalListener != null) {
+                mOriginalListener.onAnimationStart(animation);
+            }
+        }
+
+        @Override
+        @CallSuper
+        public void onAnimationEnd(Animation animation) {
+            if (mView != null && mShouldRunOnHWLayer) {
+                // If we're attached to a window, assume we're in the normal performTraversals
+                // drawing path for Animations running. It's not safe to change the layer type
+                // during drawing, so post it to the View to run later. If we're not attached
+                // or we're running on N and above, post it to the view. If we're not on N and
+                // not attached, do it right now since existing platform versions don't run the
+                // hwui renderer for detached views off the UI thread making changing layer type
+                // safe, but posting may not be.
+                // Prior to N posting to a detached view from a non-Looper thread could cause
+                // leaks, since the thread-local run queue on a non-Looper thread would never
+                // be flushed.
+                if (ViewCompat.isAttachedToWindow(mView) || BuildCompat.isAtLeastN()) {
+                    mView.post(new Runnable() {
+                        @Override
+                        public void run() {
+                            ViewCompat.setLayerType(mView, ViewCompat.LAYER_TYPE_NONE, null);
+                        }
+                    });
+                } else {
+                    ViewCompat.setLayerType(mView, ViewCompat.LAYER_TYPE_NONE, null);
+                }
+            }
+            if (mOriginalListener != null) {
+                mOriginalListener.onAnimationEnd(animation);
+            }
+        }
+
+        @Override
+        public void onAnimationRepeat(Animation animation) {
+            if (mOriginalListener != null) {
+                mOriginalListener.onAnimationRepeat(animation);
+            }
+        }
+    }
+
+    ArrayList<Runnable> mPendingActions;
+    Runnable[] mTmpActions;
+    boolean mExecutingActions;
+    
+    ArrayList<Fragment> mActive;
+    ArrayList<Fragment> mAdded;
+    ArrayList<Integer> mAvailIndices;
+    ArrayList<BackStackRecord> mBackStack;
+    ArrayList<Fragment> mCreatedMenus;
+    
+    // Must be accessed while locked.
+    ArrayList<BackStackRecord> mBackStackIndices;
+    ArrayList<Integer> mAvailBackStackIndices;
+
+    ArrayList<OnBackStackChangedListener> mBackStackChangeListeners;
+
+    int mCurState = Fragment.INITIALIZING;
+    FragmentHostCallback mHost;
+    FragmentController mController;
+    FragmentContainer mContainer;
+    Fragment mParent;
+
+    static Field sAnimationListenerField = null;
+    
+    boolean mNeedMenuInvalidate;
+    boolean mStateSaved;
+    boolean mDestroyed;
+    String mNoTransactionsBecause;
+    boolean mHavePendingDeferredStart;
+    
+    // Temporary vars for state save and restore.
+    Bundle mStateBundle = null;
+    SparseArray<Parcelable> mStateArray = null;
+    
+    Runnable mExecCommit = new Runnable() {
+        @Override
+        public void run() {
+            execPendingActions();
+        }
+    };
+
+    static boolean modifiesAlpha(Animation anim) {
+        if (anim instanceof AlphaAnimation) {
+            return true;
+        } else if (anim instanceof AnimationSet) {
+            List<Animation> anims = ((AnimationSet) anim).getAnimations();
+            for (int i = 0; i < anims.size(); i++) {
+                if (anims.get(i) instanceof AlphaAnimation) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    static boolean shouldRunOnHWLayer(View v, Animation anim) {
+        return Build.VERSION.SDK_INT >= 19
+                && ViewCompat.getLayerType(v) == ViewCompat.LAYER_TYPE_NONE
+                && ViewCompat.hasOverlappingRendering(v)
+                && modifiesAlpha(anim);
+    }
+
+    private void throwException(RuntimeException ex) {
+        Log.e(TAG, ex.getMessage());
+        Log.e(TAG, "Activity state:");
+        LogWriter logw = new LogWriter(TAG);
+        PrintWriter pw = new PrintWriter(logw);
+        if (mHost != null) {
+            try {
+                mHost.onDump("  ", null, pw, new String[] { });
+            } catch (Exception e) {
+                Log.e(TAG, "Failed dumping state", e);
+            }
+        } else {
+            try {
+                dump("  ", null, pw, new String[] { });
+            } catch (Exception e) {
+                Log.e(TAG, "Failed dumping state", e);
+            }
+        }
+        throw ex;
+    }
+
+    @Override
+    public FragmentTransaction beginTransaction() {
+        return new BackStackRecord(this);
+    }
+
+    @Override
+    public boolean executePendingTransactions() {
+        return execPendingActions();
+    }
+
+    @Override
+    public void popBackStack() {
+        enqueueAction(new Runnable() {
+            @Override public void run() {
+                popBackStackState(mHost.getHandler(), null, -1, 0);
+            }
+        }, false);
+    }
+
+    @Override
+    public boolean popBackStackImmediate() {
+        checkStateLoss();
+        executePendingTransactions();
+        return popBackStackState(mHost.getHandler(), null, -1, 0);
+    }
+
+    @Override
+    public void popBackStack(final String name, final int flags) {
+        enqueueAction(new Runnable() {
+            @Override public void run() {
+                popBackStackState(mHost.getHandler(), name, -1, flags);
+            }
+        }, false);
+    }
+
+    @Override
+    public boolean popBackStackImmediate(String name, int flags) {
+        checkStateLoss();
+        executePendingTransactions();
+        return popBackStackState(mHost.getHandler(), name, -1, flags);
+    }
+
+    @Override
+    public void popBackStack(final int id, final int flags) {
+        if (id < 0) {
+            throw new IllegalArgumentException("Bad id: " + id);
+        }
+        enqueueAction(new Runnable() {
+            @Override public void run() {
+                popBackStackState(mHost.getHandler(), null, id, flags);
+            }
+        }, false);
+    }
+
+    @Override
+    public boolean popBackStackImmediate(int id, int flags) {
+        checkStateLoss();
+        executePendingTransactions();
+        if (id < 0) {
+            throw new IllegalArgumentException("Bad id: " + id);
+        }
+        return popBackStackState(mHost.getHandler(), null, id, flags);
+    }
+
+    @Override
+    public int getBackStackEntryCount() {
+        return mBackStack != null ? mBackStack.size() : 0;
+    }
+
+    @Override
+    public BackStackEntry getBackStackEntryAt(int index) {
+        return mBackStack.get(index);
+    }
+
+    @Override
+    public void addOnBackStackChangedListener(OnBackStackChangedListener listener) {
+        if (mBackStackChangeListeners == null) {
+            mBackStackChangeListeners = new ArrayList<OnBackStackChangedListener>();
+        }
+        mBackStackChangeListeners.add(listener);
+    }
+
+    @Override
+    public void removeOnBackStackChangedListener(OnBackStackChangedListener listener) {
+        if (mBackStackChangeListeners != null) {
+            mBackStackChangeListeners.remove(listener);
+        }
+    }
+
+    @Override
+    public void putFragment(Bundle bundle, String key, Fragment fragment) {
+        if (fragment.mIndex < 0) {
+            throwException(new IllegalStateException("Fragment " + fragment
+                    + " is not currently in the FragmentManager"));
+        }
+        bundle.putInt(key, fragment.mIndex);
+    }
+
+    @Override
+    public Fragment getFragment(Bundle bundle, String key) {
+        int index = bundle.getInt(key, -1);
+        if (index == -1) {
+            return null;
+        }
+        if (index >= mActive.size()) {
+            throwException(new IllegalStateException("Fragment no longer exists for key "
+                    + key + ": index " + index));
+        }
+        Fragment f = mActive.get(index);
+        if (f == null) {
+            throwException(new IllegalStateException("Fragment no longer exists for key "
+                    + key + ": index " + index));
+        }
+        return f;
+    }
+
+    @Override
+    public List<Fragment> getFragments() {
+        return mActive;
+    }
+
+    @Override
+    public Fragment.SavedState saveFragmentInstanceState(Fragment fragment) {
+        if (fragment.mIndex < 0) {
+            throwException( new IllegalStateException("Fragment " + fragment
+                    + " is not currently in the FragmentManager"));
+        }
+        if (fragment.mState > Fragment.INITIALIZING) {
+            Bundle result = saveFragmentBasicState(fragment);
+            return result != null ? new Fragment.SavedState(result) : null;
+        }
+        return null;
+    }
+
+    @Override
+    public boolean isDestroyed() {
+        return mDestroyed;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder(128);
+        sb.append("FragmentManager{");
+        sb.append(Integer.toHexString(System.identityHashCode(this)));
+        sb.append(" in ");
+        if (mParent != null) {
+            DebugUtils.buildShortClassTag(mParent, sb);
+        } else {
+            DebugUtils.buildShortClassTag(mHost, sb);
+        }
+        sb.append("}}");
+        return sb.toString();
+    }
+
+    @Override
+    public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) {
+        String innerPrefix = prefix + "    ";
+
+        int N;
+        if (mActive != null) {
+            N = mActive.size();
+            if (N > 0) {
+                writer.print(prefix); writer.print("Active Fragments in ");
+                        writer.print(Integer.toHexString(System.identityHashCode(this)));
+                        writer.println(":");
+                for (int i=0; i<N; i++) {
+                    Fragment f = mActive.get(i);
+                    writer.print(prefix); writer.print("  #"); writer.print(i);
+                            writer.print(": "); writer.println(f);
+                    if (f != null) {
+                        f.dump(innerPrefix, fd, writer, args);
+                    }
+                }
+            }
+        }
+
+        if (mAdded != null) {
+            N = mAdded.size();
+            if (N > 0) {
+                writer.print(prefix); writer.println("Added Fragments:");
+                for (int i=0; i<N; i++) {
+                    Fragment f = mAdded.get(i);
+                    writer.print(prefix); writer.print("  #"); writer.print(i);
+                            writer.print(": "); writer.println(f.toString());
+                }
+            }
+        }
+
+        if (mCreatedMenus != null) {
+            N = mCreatedMenus.size();
+            if (N > 0) {
+                writer.print(prefix); writer.println("Fragments Created Menus:");
+                for (int i=0; i<N; i++) {
+                    Fragment f = mCreatedMenus.get(i);
+                    writer.print(prefix); writer.print("  #"); writer.print(i);
+                            writer.print(": "); writer.println(f.toString());
+                }
+            }
+        }
+
+        if (mBackStack != null) {
+            N = mBackStack.size();
+            if (N > 0) {
+                writer.print(prefix); writer.println("Back Stack:");
+                for (int i=0; i<N; i++) {
+                    BackStackRecord bs = mBackStack.get(i);
+                    writer.print(prefix); writer.print("  #"); writer.print(i);
+                            writer.print(": "); writer.println(bs.toString());
+                    bs.dump(innerPrefix, fd, writer, args);
+                }
+            }
+        }
+
+        synchronized (this) {
+            if (mBackStackIndices != null) {
+                N = mBackStackIndices.size();
+                if (N > 0) {
+                    writer.print(prefix); writer.println("Back Stack Indices:");
+                    for (int i=0; i<N; i++) {
+                        BackStackRecord bs = mBackStackIndices.get(i);
+                        writer.print(prefix); writer.print("  #"); writer.print(i);
+                                writer.print(": "); writer.println(bs);
+                    }
+                }
+            }
+
+            if (mAvailBackStackIndices != null && mAvailBackStackIndices.size() > 0) {
+                writer.print(prefix); writer.print("mAvailBackStackIndices: ");
+                        writer.println(Arrays.toString(mAvailBackStackIndices.toArray()));
+            }
+        }
+
+        if (mPendingActions != null) {
+            N = mPendingActions.size();
+            if (N > 0) {
+                writer.print(prefix); writer.println("Pending Actions:");
+                for (int i=0; i<N; i++) {
+                    Runnable r = mPendingActions.get(i);
+                    writer.print(prefix); writer.print("  #"); writer.print(i);
+                            writer.print(": "); writer.println(r);
+                }
+            }
+        }
+
+        writer.print(prefix); writer.println("FragmentManager misc state:");
+        writer.print(prefix); writer.print("  mHost="); writer.println(mHost);
+        writer.print(prefix); writer.print("  mContainer="); writer.println(mContainer);
+        if (mParent != null) {
+            writer.print(prefix); writer.print("  mParent="); writer.println(mParent);
+        }
+        writer.print(prefix); writer.print("  mCurState="); writer.print(mCurState);
+                writer.print(" mStateSaved="); writer.print(mStateSaved);
+                writer.print(" mDestroyed="); writer.println(mDestroyed);
+        if (mNeedMenuInvalidate) {
+            writer.print(prefix); writer.print("  mNeedMenuInvalidate=");
+                    writer.println(mNeedMenuInvalidate);
+        }
+        if (mNoTransactionsBecause != null) {
+            writer.print(prefix); writer.print("  mNoTransactionsBecause=");
+                    writer.println(mNoTransactionsBecause);
+        }
+        if (mAvailIndices != null && mAvailIndices.size() > 0) {
+            writer.print(prefix); writer.print("  mAvailIndices: ");
+                    writer.println(Arrays.toString(mAvailIndices.toArray()));
+        }
+    }
+
+    static final Interpolator DECELERATE_QUINT = new DecelerateInterpolator(2.5f);
+    static final Interpolator DECELERATE_CUBIC = new DecelerateInterpolator(1.5f);
+    static final Interpolator ACCELERATE_QUINT = new AccelerateInterpolator(2.5f);
+    static final Interpolator ACCELERATE_CUBIC = new AccelerateInterpolator(1.5f);
+    
+    static final int ANIM_DUR = 220;
+    
+    static Animation makeOpenCloseAnimation(Context context, float startScale,
+            float endScale, float startAlpha, float endAlpha) {
+        AnimationSet set = new AnimationSet(false);
+        ScaleAnimation scale = new ScaleAnimation(startScale, endScale, startScale, endScale,
+                Animation.RELATIVE_TO_SELF, .5f, Animation.RELATIVE_TO_SELF, .5f);
+        scale.setInterpolator(DECELERATE_QUINT);
+        scale.setDuration(ANIM_DUR);
+        set.addAnimation(scale);
+        AlphaAnimation alpha = new AlphaAnimation(startAlpha, endAlpha);
+        alpha.setInterpolator(DECELERATE_CUBIC);
+        alpha.setDuration(ANIM_DUR);
+        set.addAnimation(alpha);
+        return set;
+    }
+    
+    static Animation makeFadeAnimation(Context context, float start, float end) {
+        AlphaAnimation anim = new AlphaAnimation(start, end);
+        anim.setInterpolator(DECELERATE_CUBIC);
+        anim.setDuration(ANIM_DUR);
+        return anim;
+    }
+
+    Animation loadAnimation(Fragment fragment, int transit, boolean enter,
+            int transitionStyle) {
+        Animation animObj = fragment.onCreateAnimation(transit, enter,
+                fragment.mNextAnim);
+        if (animObj != null) {
+            return animObj;
+        }
+        
+        if (fragment.mNextAnim != 0) {
+            Animation anim = AnimationUtils.loadAnimation(mHost.getContext(), fragment.mNextAnim);
+            if (anim != null) {
+                return anim;
+            }
+        }
+        
+        if (transit == 0) {
+            return null;
+        }
+        
+        int styleIndex = transitToStyleIndex(transit, enter);
+        if (styleIndex < 0) {
+            return null;
+        }
+
+        switch (styleIndex) {
+            case ANIM_STYLE_OPEN_ENTER:
+                return makeOpenCloseAnimation(mHost.getContext(), 1.125f, 1.0f, 0, 1);
+            case ANIM_STYLE_OPEN_EXIT:
+                return makeOpenCloseAnimation(mHost.getContext(), 1.0f, .975f, 1, 0);
+            case ANIM_STYLE_CLOSE_ENTER:
+                return makeOpenCloseAnimation(mHost.getContext(), .975f, 1.0f, 0, 1);
+            case ANIM_STYLE_CLOSE_EXIT:
+                return makeOpenCloseAnimation(mHost.getContext(), 1.0f, 1.075f, 1, 0);
+            case ANIM_STYLE_FADE_ENTER:
+                return makeFadeAnimation(mHost.getContext(), 0, 1);
+            case ANIM_STYLE_FADE_EXIT:
+                return makeFadeAnimation(mHost.getContext(), 1, 0);
+        }
+        
+        if (transitionStyle == 0 && mHost.onHasWindowAnimations()) {
+            transitionStyle = mHost.onGetWindowAnimations();
+        }
+        if (transitionStyle == 0) {
+            return null;
+        }
+        
+        //TypedArray attrs = mActivity.obtainStyledAttributes(transitionStyle,
+        //        com.android.internal.R.styleable.FragmentAnimation);
+        //int anim = attrs.getResourceId(styleIndex, 0);
+        //attrs.recycle();
+        
+        //if (anim == 0) {
+        //    return null;
+        //}
+        
+        //return AnimatorInflater.loadAnimator(mActivity, anim);
+        return null;
+    }
+    
+    public void performPendingDeferredStart(Fragment f) {
+        if (f.mDeferStart) {
+            if (mExecutingActions) {
+                // Wait until we're done executing our pending transactions
+                mHavePendingDeferredStart = true;
+                return;
+            }
+            f.mDeferStart = false;
+            moveToState(f, mCurState, 0, 0, false);
+        }
+    }
+
+    /**
+     * Sets the to be animated view on hardware layer during the animation. Note
+     * that calling this will replace any existing animation listener on the animation
+     * with a new one, as animations do not support more than one listeners. Therefore,
+     * animations that already have listeners should do the layer change operations
+     * in their existing listeners, rather than calling this function.
+     */
+    private void setHWLayerAnimListenerIfAlpha(final View v, Animation anim) {
+        if (v == null || anim == null) {
+            return;
+        }
+        if (shouldRunOnHWLayer(v, anim)) {
+            AnimationListener originalListener = null;
+            try {
+                if (sAnimationListenerField == null) {
+                    sAnimationListenerField = Animation.class.getDeclaredField("mListener");
+                    sAnimationListenerField.setAccessible(true);
+                }
+                originalListener = (AnimationListener) sAnimationListenerField.get(anim);
+            } catch (NoSuchFieldException e) {
+                Log.e(TAG, "No field with the name mListener is found in Animation class", e);
+            } catch (IllegalAccessException e) {
+                Log.e(TAG, "Cannot access Animation's mListener field", e);
+            }
+            // If there's already a listener set on the animation, we need wrap the new listener
+            // around the existing listener, so that they will both get animation listener
+            // callbacks.
+            ViewCompat.setLayerType(v, ViewCompat.LAYER_TYPE_HARDWARE, null);
+            anim.setAnimationListener(new AnimateOnHWLayerIfNeededListener(v, anim,
+                    originalListener));
+        }
+    }
+
+    boolean isStateAtLeast(int state) {
+        return mCurState >= state;
+    }
+
+    void moveToState(Fragment f, int newState, int transit, int transitionStyle,
+            boolean keepActive) {
+        // Fragments that are not currently added will sit in the onCreate() state.
+        if ((!f.mAdded || f.mDetached) && newState > Fragment.CREATED) {
+            newState = Fragment.CREATED;
+        }
+        if (f.mRemoving && newState > f.mState) {
+            // While removing a fragment, we can't change it to a higher state.
+            newState = f.mState;
+        }
+        // Defer start if requested; don't allow it to move to STARTED or higher
+        // if it's not already started.
+        if (f.mDeferStart && f.mState < Fragment.STARTED && newState > Fragment.STOPPED) {
+            newState = Fragment.STOPPED;
+        }
+        if (f.mState < newState) {
+            // For fragments that are created from a layout, when restoring from
+            // state we don't want to allow them to be created until they are
+            // being reloaded from the layout.
+            if (f.mFromLayout && !f.mInLayout) {
+                return;
+            }  
+            if (f.mAnimatingAway != null) {
+                // The fragment is currently being animated...  but!  Now we
+                // want to move our state back up.  Give up on waiting for the
+                // animation, move to whatever the final state should be once
+                // the animation is done, and then we can proceed from there.
+                f.mAnimatingAway = null;
+                moveToState(f, f.mStateAfterAnimating, 0, 0, true);
+            }
+            switch (f.mState) {
+                case Fragment.INITIALIZING:
+                    if (DEBUG) Log.v(TAG, "moveto CREATED: " + f);
+                    if (f.mSavedFragmentState != null) {
+                        f.mSavedFragmentState.setClassLoader(mHost.getContext().getClassLoader());
+                        f.mSavedViewState = f.mSavedFragmentState.getSparseParcelableArray(
+                                FragmentManagerImpl.VIEW_STATE_TAG);
+                        f.mTarget = getFragment(f.mSavedFragmentState,
+                                FragmentManagerImpl.TARGET_STATE_TAG);
+                        if (f.mTarget != null) {
+                            f.mTargetRequestCode = f.mSavedFragmentState.getInt(
+                                    FragmentManagerImpl.TARGET_REQUEST_CODE_STATE_TAG, 0);
+                        }
+                        f.mUserVisibleHint = f.mSavedFragmentState.getBoolean(
+                                FragmentManagerImpl.USER_VISIBLE_HINT_TAG, true);
+                        if (!f.mUserVisibleHint) {
+                            f.mDeferStart = true;
+                            if (newState > Fragment.STOPPED) {
+                                newState = Fragment.STOPPED;
+                            }
+                        }
+                    }
+                    f.mHost = mHost;
+                    f.mParentFragment = mParent;
+                    f.mFragmentManager = mParent != null
+                            ? mParent.mChildFragmentManager : mHost.getFragmentManagerImpl();
+                    f.mCalled = false;
+                    f.onAttach(mHost.getContext());
+                    if (!f.mCalled) {
+                        throw new SuperNotCalledException("Fragment " + f
+                                + " did not call through to super.onAttach()");
+                    }
+                    if (f.mParentFragment == null) {
+                        mHost.onAttachFragment(f);
+                    } else {
+                        f.mParentFragment.onAttachFragment(f);
+                    }
+
+                    if (!f.mRetaining) {
+                        f.performCreate(f.mSavedFragmentState);
+                    } else {
+                        f.restoreChildFragmentState(f.mSavedFragmentState);
+                        f.mState = Fragment.CREATED;
+                    }
+                    f.mRetaining = false;
+                    if (f.mFromLayout) {
+                        // For fragments that are part of the content view
+                        // layout, we need to instantiate the view immediately
+                        // and the inflater will take care of adding it.
+                        f.mView = f.performCreateView(f.getLayoutInflater(
+                                f.mSavedFragmentState), null, f.mSavedFragmentState);
+                        if (f.mView != null) {
+                            f.mInnerView = f.mView;
+                            if (Build.VERSION.SDK_INT >= 11) {
+                                ViewCompat.setSaveFromParentEnabled(f.mView, false);
+                            } else {
+                                f.mView = NoSaveStateFrameLayout.wrap(f.mView);
+                            }
+                            if (f.mHidden) f.mView.setVisibility(View.GONE);
+                            f.onViewCreated(f.mView, f.mSavedFragmentState);
+                        } else {
+                            f.mInnerView = null;
+                        }
+                    }
+                case Fragment.CREATED:
+                    if (newState > Fragment.CREATED) {
+                        if (DEBUG) Log.v(TAG, "moveto ACTIVITY_CREATED: " + f);
+                        if (!f.mFromLayout) {
+                            ViewGroup container = null;
+                            if (f.mContainerId != 0) {
+                                if (f.mContainerId == View.NO_ID) {
+                                    throwException(new IllegalArgumentException(
+                                            "Cannot create fragment "
+                                                    + f
+                                                    + " for a container view with no id"));
+                                }
+                                container = (ViewGroup) mContainer.onFindViewById(f.mContainerId);
+                                if (container == null && !f.mRestored) {
+                                    String resName;
+                                    try {
+                                        resName = f.getResources().getResourceName(f.mContainerId);
+                                    } catch (NotFoundException e) {
+                                        resName = "unknown";
+                                    }
+                                    throwException(new IllegalArgumentException(
+                                            "No view found for id 0x"
+                                            + Integer.toHexString(f.mContainerId) + " ("
+                                            + resName
+                                            + ") for fragment " + f));
+                                }
+                            }
+                            f.mContainer = container;
+                            f.mView = f.performCreateView(f.getLayoutInflater(
+                                    f.mSavedFragmentState), container, f.mSavedFragmentState);
+                            if (f.mView != null) {
+                                f.mInnerView = f.mView;
+                                if (Build.VERSION.SDK_INT >= 11) {
+                                    ViewCompat.setSaveFromParentEnabled(f.mView, false);
+                                } else {
+                                    f.mView = NoSaveStateFrameLayout.wrap(f.mView);
+                                }
+                                if (container != null) {
+                                    Animation anim = loadAnimation(f, transit, true,
+                                            transitionStyle);
+                                    if (anim != null) {
+                                        setHWLayerAnimListenerIfAlpha(f.mView, anim);
+                                        f.mView.startAnimation(anim);
+                                    }
+                                    container.addView(f.mView);
+                                }
+                                if (f.mHidden) f.mView.setVisibility(View.GONE);
+                                f.onViewCreated(f.mView, f.mSavedFragmentState);
+                            } else {
+                                f.mInnerView = null;
+                            }
+                        }
+
+                        f.performActivityCreated(f.mSavedFragmentState);
+                        if (f.mView != null) {
+                            f.restoreViewState(f.mSavedFragmentState);
+                        }
+                        f.mSavedFragmentState = null;
+                    }
+                case Fragment.ACTIVITY_CREATED:
+                    if (newState > Fragment.ACTIVITY_CREATED) {
+                        f.mState = Fragment.STOPPED;
+                    }
+                case Fragment.STOPPED:
+                    if (newState > Fragment.STOPPED) {
+                        if (DEBUG) Log.v(TAG, "moveto STARTED: " + f);
+                        f.performStart();
+                    }
+                case Fragment.STARTED:
+                    if (newState > Fragment.STARTED) {
+                        if (DEBUG) Log.v(TAG, "moveto RESUMED: " + f);
+                        f.performResume();
+                        f.mSavedFragmentState = null;
+                        f.mSavedViewState = null;
+                    }
+            }
+        } else if (f.mState > newState) {
+            switch (f.mState) {
+                case Fragment.RESUMED:
+                    if (newState < Fragment.RESUMED) {
+                        if (DEBUG) Log.v(TAG, "movefrom RESUMED: " + f);
+                        f.performPause();
+                    }
+                case Fragment.STARTED:
+                    if (newState < Fragment.STARTED) {
+                        if (DEBUG) Log.v(TAG, "movefrom STARTED: " + f);
+                        f.performStop();
+                    }
+                case Fragment.STOPPED:
+                    if (newState < Fragment.STOPPED) {
+                        if (DEBUG) Log.v(TAG, "movefrom STOPPED: " + f);
+                        f.performReallyStop();
+                    }
+                case Fragment.ACTIVITY_CREATED:
+                    if (newState < Fragment.ACTIVITY_CREATED) {
+                        if (DEBUG) Log.v(TAG, "movefrom ACTIVITY_CREATED: " + f);
+                        if (f.mView != null) {
+                            // Need to save the current view state if not
+                            // done already.
+                            if (mHost.onShouldSaveFragmentState(f) && f.mSavedViewState == null) {
+                                saveFragmentViewState(f);
+                            }
+                        }
+                        f.performDestroyView();
+                        if (f.mView != null && f.mContainer != null) {
+                            Animation anim = null;
+                            if (mCurState > Fragment.INITIALIZING && !mDestroyed) {
+                                anim = loadAnimation(f, transit, false,
+                                        transitionStyle);
+                            }
+                            if (anim != null) {
+                                final Fragment fragment = f;
+                                f.mAnimatingAway = f.mView;
+                                f.mStateAfterAnimating = newState;
+                                final View viewToAnimate = f.mView;
+                                anim.setAnimationListener(new AnimateOnHWLayerIfNeededListener(
+                                        viewToAnimate, anim) {
+                                    @Override
+                                    public void onAnimationEnd(Animation animation) {
+                                        super.onAnimationEnd(animation);
+                                        if (fragment.mAnimatingAway != null) {
+                                            fragment.mAnimatingAway = null;
+                                            moveToState(fragment, fragment.mStateAfterAnimating,
+                                                    0, 0, false);
+                                        }
+                                    }
+                                });
+                                f.mView.startAnimation(anim);
+                            }
+                            f.mContainer.removeView(f.mView);
+                        }
+                        f.mContainer = null;
+                        f.mView = null;
+                        f.mInnerView = null;
+                    }
+                case Fragment.CREATED:
+                    if (newState < Fragment.CREATED) {
+                        if (mDestroyed) {
+                            if (f.mAnimatingAway != null) {
+                                // The fragment's containing activity is
+                                // being destroyed, but this fragment is
+                                // currently animating away.  Stop the
+                                // animation right now -- it is not needed,
+                                // and we can't wait any more on destroying
+                                // the fragment.
+                                View v = f.mAnimatingAway;
+                                f.mAnimatingAway = null;
+                                v.clearAnimation();
+                            }
+                        }
+                        if (f.mAnimatingAway != null) {
+                            // We are waiting for the fragment's view to finish
+                            // animating away.  Just make a note of the state
+                            // the fragment now should move to once the animation
+                            // is done.
+                            f.mStateAfterAnimating = newState;
+                            newState = Fragment.CREATED;
+                        } else {
+                            if (DEBUG) Log.v(TAG, "movefrom CREATED: " + f);
+                            if (!f.mRetaining) {
+                                f.performDestroy();
+                            } else {
+                                f.mState = Fragment.INITIALIZING;
+                            }
+
+                            f.performDetach();
+                            if (!keepActive) {
+                                if (!f.mRetaining) {
+                                    makeInactive(f);
+                                } else {
+                                    f.mHost = null;
+                                    f.mParentFragment = null;
+                                    f.mFragmentManager = null;
+                                }
+                            }
+                        }
+                    }
+            }
+        }
+
+        if (f.mState != newState) {
+            Log.w(TAG, "moveToState: Fragment state for " + f + " not updated inline; "
+                    + "expected state " + newState + " found " + f.mState);
+            f.mState = newState;
+        }
+    }
+    
+    void moveToState(Fragment f) {
+        moveToState(f, mCurState, 0, 0, false);
+    }
+
+    void moveToState(int newState, boolean always) {
+        moveToState(newState, 0, 0, always);
+    }
+    
+    void moveToState(int newState, int transit, int transitStyle, boolean always) {
+        if (mHost == null && newState != Fragment.INITIALIZING) {
+            throw new IllegalStateException("No host");
+        }
+
+        if (!always && mCurState == newState) {
+            return;
+        }
+
+        mCurState = newState;
+        if (mActive != null) {
+            boolean loadersRunning = false;
+            for (int i=0; i<mActive.size(); i++) {
+                Fragment f = mActive.get(i);
+                if (f != null) {
+                    moveToState(f, newState, transit, transitStyle, false);
+                    if (f.mLoaderManager != null) {
+                        loadersRunning |= f.mLoaderManager.hasRunningLoaders();
+                    }
+                }
+            }
+
+            if (!loadersRunning) {
+                startPendingDeferredFragments();
+            }
+
+            if (mNeedMenuInvalidate && mHost != null && mCurState == Fragment.RESUMED) {
+                mHost.onSupportInvalidateOptionsMenu();
+                mNeedMenuInvalidate = false;
+            }
+        }
+    }
+
+    void startPendingDeferredFragments() {
+        if (mActive == null) return;
+
+        for (int i=0; i<mActive.size(); i++) {
+            Fragment f = mActive.get(i);
+            if (f != null) {
+                performPendingDeferredStart(f);
+            }
+        }
+    }
+    
+    void makeActive(Fragment f) {
+        if (f.mIndex >= 0) {
+            return;
+        }
+        
+        if (mAvailIndices == null || mAvailIndices.size() <= 0) {
+            if (mActive == null) {
+                mActive = new ArrayList<Fragment>();
+            }
+            f.setIndex(mActive.size(), mParent);
+            mActive.add(f);
+            
+        } else {
+            f.setIndex(mAvailIndices.remove(mAvailIndices.size()-1), mParent);
+            mActive.set(f.mIndex, f);
+        }
+        if (DEBUG) Log.v(TAG, "Allocated fragment index " + f);
+    }
+    
+    void makeInactive(Fragment f) {
+        if (f.mIndex < 0) {
+            return;
+        }
+        
+        if (DEBUG) Log.v(TAG, "Freeing fragment index " + f);
+        mActive.set(f.mIndex, null);
+        if (mAvailIndices == null) {
+            mAvailIndices = new ArrayList<Integer>();
+        }
+        mAvailIndices.add(f.mIndex);
+        mHost.inactivateFragment(f.mWho);
+        f.initState();
+    }
+    
+    public void addFragment(Fragment fragment, boolean moveToStateNow) {
+        if (mAdded == null) {
+            mAdded = new ArrayList<Fragment>();
+        }
+        if (DEBUG) Log.v(TAG, "add: " + fragment);
+        makeActive(fragment);
+        if (!fragment.mDetached) {
+            if (mAdded.contains(fragment)) {
+                throw new IllegalStateException("Fragment already added: " + fragment);
+            }
+            mAdded.add(fragment);
+            fragment.mAdded = true;
+            fragment.mRemoving = false;
+            if (fragment.mHasMenu && fragment.mMenuVisible) {
+                mNeedMenuInvalidate = true;
+            }
+            if (moveToStateNow) {
+                moveToState(fragment);
+            }
+        }
+    }
+    
+    public void removeFragment(Fragment fragment, int transition, int transitionStyle) {
+        if (DEBUG) Log.v(TAG, "remove: " + fragment + " nesting=" + fragment.mBackStackNesting);
+        final boolean inactive = !fragment.isInBackStack();
+        if (!fragment.mDetached || inactive) {
+            if (mAdded != null) {
+                mAdded.remove(fragment);
+            }
+            if (fragment.mHasMenu && fragment.mMenuVisible) {
+                mNeedMenuInvalidate = true;
+            }
+            fragment.mAdded = false;
+            fragment.mRemoving = true;
+            moveToState(fragment, inactive ? Fragment.INITIALIZING : Fragment.CREATED,
+                    transition, transitionStyle, false);
+        }
+    }
+    
+    public void hideFragment(Fragment fragment, int transition, int transitionStyle) {
+        if (DEBUG) Log.v(TAG, "hide: " + fragment);
+        if (!fragment.mHidden) {
+            fragment.mHidden = true;
+            if (fragment.mView != null) {
+                Animation anim = loadAnimation(fragment, transition, false,
+                        transitionStyle);
+                if (anim != null) {
+                    setHWLayerAnimListenerIfAlpha(fragment.mView, anim);
+                    fragment.mView.startAnimation(anim);
+                }
+                fragment.mView.setVisibility(View.GONE);
+            }
+            if (fragment.mAdded && fragment.mHasMenu && fragment.mMenuVisible) {
+                mNeedMenuInvalidate = true;
+            }
+            fragment.onHiddenChanged(true);
+        }
+    }
+    
+    public void showFragment(Fragment fragment, int transition, int transitionStyle) {
+        if (DEBUG) Log.v(TAG, "show: " + fragment);
+        if (fragment.mHidden) {
+            fragment.mHidden = false;
+            if (fragment.mView != null) {
+                Animation anim = loadAnimation(fragment, transition, true,
+                        transitionStyle);
+                if (anim != null) {
+                    setHWLayerAnimListenerIfAlpha(fragment.mView, anim);
+                    fragment.mView.startAnimation(anim);
+                }
+                fragment.mView.setVisibility(View.VISIBLE);
+            }
+            if (fragment.mAdded && fragment.mHasMenu && fragment.mMenuVisible) {
+                mNeedMenuInvalidate = true;
+            }
+            fragment.onHiddenChanged(false);
+        }
+    }
+    
+    public void detachFragment(Fragment fragment, int transition, int transitionStyle) {
+        if (DEBUG) Log.v(TAG, "detach: " + fragment);
+        if (!fragment.mDetached) {
+            fragment.mDetached = true;
+            if (fragment.mAdded) {
+                // We are not already in back stack, so need to remove the fragment.
+                if (mAdded != null) {
+                    if (DEBUG) Log.v(TAG, "remove from detach: " + fragment);
+                    mAdded.remove(fragment);
+                }
+                if (fragment.mHasMenu && fragment.mMenuVisible) {
+                    mNeedMenuInvalidate = true;
+                }
+                fragment.mAdded = false;
+                moveToState(fragment, Fragment.CREATED, transition, transitionStyle, false);
+            }
+        }
+    }
+
+    public void attachFragment(Fragment fragment, int transition, int transitionStyle) {
+        if (DEBUG) Log.v(TAG, "attach: " + fragment);
+        if (fragment.mDetached) {
+            fragment.mDetached = false;
+            if (!fragment.mAdded) {
+                if (mAdded == null) {
+                    mAdded = new ArrayList<Fragment>();
+                }
+                if (mAdded.contains(fragment)) {
+                    throw new IllegalStateException("Fragment already added: " + fragment);
+                }
+                if (DEBUG) Log.v(TAG, "add from attach: " + fragment);
+                mAdded.add(fragment);
+                fragment.mAdded = true;
+                if (fragment.mHasMenu && fragment.mMenuVisible) {
+                    mNeedMenuInvalidate = true;
+                }
+                moveToState(fragment, mCurState, transition, transitionStyle, false);
+            }
+        }
+    }
+
+    @Override
+    public Fragment findFragmentById(int id) {
+        if (mAdded != null) {
+            // First look through added fragments.
+            for (int i=mAdded.size()-1; i>=0; i--) {
+                Fragment f = mAdded.get(i);
+                if (f != null && f.mFragmentId == id) {
+                    return f;
+                }
+            }
+        }
+        if (mActive != null) {
+            // Now for any known fragment.
+            for (int i=mActive.size()-1; i>=0; i--) {
+                Fragment f = mActive.get(i);
+                if (f != null && f.mFragmentId == id) {
+                    return f;
+                }
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public Fragment findFragmentByTag(String tag) {
+        if (mAdded != null && tag != null) {
+            // First look through added fragments.
+            for (int i=mAdded.size()-1; i>=0; i--) {
+                Fragment f = mAdded.get(i);
+                if (f != null && tag.equals(f.mTag)) {
+                    return f;
+                }
+            }
+        }
+        if (mActive != null && tag != null) {
+            // Now for any known fragment.
+            for (int i=mActive.size()-1; i>=0; i--) {
+                Fragment f = mActive.get(i);
+                if (f != null && tag.equals(f.mTag)) {
+                    return f;
+                }
+            }
+        }
+        return null;
+    }
+    
+    public Fragment findFragmentByWho(String who) {
+        if (mActive != null && who != null) {
+            for (int i=mActive.size()-1; i>=0; i--) {
+                Fragment f = mActive.get(i);
+                if (f != null && (f=f.findFragmentByWho(who)) != null) {
+                    return f;
+                }
+            }
+        }
+        return null;
+    }
+    
+    private void checkStateLoss() {
+        if (mStateSaved) {
+            throw new IllegalStateException(
+                    "Can not perform this action after onSaveInstanceState");
+        }
+        if (mNoTransactionsBecause != null) {
+            throw new IllegalStateException(
+                    "Can not perform this action inside of " + mNoTransactionsBecause);
+        }
+    }
+
+    /**
+     * Adds an action to the queue of pending actions.
+     *
+     * @param action the action to add
+     * @param allowStateLoss whether to allow loss of state information
+     * @throws IllegalStateException if the activity has been destroyed
+     */
+    public void enqueueAction(Runnable action, boolean allowStateLoss) {
+        if (!allowStateLoss) {
+            checkStateLoss();
+        }
+        synchronized (this) {
+            if (mDestroyed || mHost == null) {
+                throw new IllegalStateException("Activity has been destroyed");
+            }
+            if (mPendingActions == null) {
+                mPendingActions = new ArrayList<Runnable>();
+            }
+            mPendingActions.add(action);
+            if (mPendingActions.size() == 1) {
+                mHost.getHandler().removeCallbacks(mExecCommit);
+                mHost.getHandler().post(mExecCommit);
+            }
+        }
+    }
+    
+    public int allocBackStackIndex(BackStackRecord bse) {
+        synchronized (this) {
+            if (mAvailBackStackIndices == null || mAvailBackStackIndices.size() <= 0) {
+                if (mBackStackIndices == null) {
+                    mBackStackIndices = new ArrayList<BackStackRecord>();
+                }
+                int index = mBackStackIndices.size();
+                if (DEBUG) Log.v(TAG, "Setting back stack index " + index + " to " + bse);
+                mBackStackIndices.add(bse);
+                return index;
+
+            } else {
+                int index = mAvailBackStackIndices.remove(mAvailBackStackIndices.size()-1);
+                if (DEBUG) Log.v(TAG, "Adding back stack index " + index + " with " + bse);
+                mBackStackIndices.set(index, bse);
+                return index;
+            }
+        }
+    }
+
+    public void setBackStackIndex(int index, BackStackRecord bse) {
+        synchronized (this) {
+            if (mBackStackIndices == null) {
+                mBackStackIndices = new ArrayList<BackStackRecord>();
+            }
+            int N = mBackStackIndices.size();
+            if (index < N) {
+                if (DEBUG) Log.v(TAG, "Setting back stack index " + index + " to " + bse);
+                mBackStackIndices.set(index, bse);
+            } else {
+                while (N < index) {
+                    mBackStackIndices.add(null);
+                    if (mAvailBackStackIndices == null) {
+                        mAvailBackStackIndices = new ArrayList<Integer>();
+                    }
+                    if (DEBUG) Log.v(TAG, "Adding available back stack index " + N);
+                    mAvailBackStackIndices.add(N);
+                    N++;
+                }
+                if (DEBUG) Log.v(TAG, "Adding back stack index " + index + " with " + bse);
+                mBackStackIndices.add(bse);
+            }
+        }
+    }
+
+    public void freeBackStackIndex(int index) {
+        synchronized (this) {
+            mBackStackIndices.set(index, null);
+            if (mAvailBackStackIndices == null) {
+                mAvailBackStackIndices = new ArrayList<Integer>();
+            }
+            if (DEBUG) Log.v(TAG, "Freeing back stack index " + index);
+            mAvailBackStackIndices.add(index);
+        }
+    }
+
+    public void execSingleAction(Runnable action, boolean allowStateLoss) {
+        if (mExecutingActions) {
+            throw new IllegalStateException("FragmentManager is already executing transactions");
+        }
+
+        if (Looper.myLooper() != mHost.getHandler().getLooper()) {
+            throw new IllegalStateException("Must be called from main thread of fragment host");
+        }
+
+        if (!allowStateLoss) {
+            checkStateLoss();
+        }
+
+        mExecutingActions = true;
+        action.run();
+        mExecutingActions = false;
+
+        doPendingDeferredStart();
+    }
+
+    /**
+     * Only call from main thread!
+     */
+    public boolean execPendingActions() {
+        if (mExecutingActions) {
+            throw new IllegalStateException("FragmentManager is already executing transactions");
+        }
+        
+        if (Looper.myLooper() != mHost.getHandler().getLooper()) {
+            throw new IllegalStateException("Must be called from main thread of fragment host");
+        }
+
+        boolean didSomething = false;
+
+        while (true) {
+            int numActions;
+            
+            synchronized (this) {
+                if (mPendingActions == null || mPendingActions.size() == 0) {
+                    break;
+                }
+                
+                numActions = mPendingActions.size();
+                if (mTmpActions == null || mTmpActions.length < numActions) {
+                    mTmpActions = new Runnable[numActions];
+                }
+                mPendingActions.toArray(mTmpActions);
+                mPendingActions.clear();
+                mHost.getHandler().removeCallbacks(mExecCommit);
+            }
+            
+            mExecutingActions = true;
+            for (int i=0; i<numActions; i++) {
+                mTmpActions[i].run();
+                mTmpActions[i] = null;
+            }
+            mExecutingActions = false;
+            didSomething = true;
+        }
+        
+        doPendingDeferredStart();
+
+        return didSomething;
+    }
+
+    void doPendingDeferredStart() {
+        if (mHavePendingDeferredStart) {
+            boolean loadersRunning = false;
+            for (int i = 0; i < mActive.size(); i++) {
+                Fragment f = mActive.get(i);
+                if (f != null && f.mLoaderManager != null) {
+                    loadersRunning |= f.mLoaderManager.hasRunningLoaders();
+                }
+            }
+            if (!loadersRunning) {
+                mHavePendingDeferredStart = false;
+                startPendingDeferredFragments();
+            }
+        }
+    }
+
+    void reportBackStackChanged() {
+        if (mBackStackChangeListeners != null) {
+            for (int i=0; i<mBackStackChangeListeners.size(); i++) {
+                mBackStackChangeListeners.get(i).onBackStackChanged();
+            }
+        }
+    }
+
+    void addBackStackState(BackStackRecord state) {
+        if (mBackStack == null) {
+            mBackStack = new ArrayList<BackStackRecord>();
+        }
+        mBackStack.add(state);
+        reportBackStackChanged();
+    }
+    
+    @SuppressWarnings("unused")
+    boolean popBackStackState(Handler handler, String name, int id, int flags) {
+        if (mBackStack == null) {
+            return false;
+        }
+        if (name == null && id < 0 && (flags&POP_BACK_STACK_INCLUSIVE) == 0) {
+            int last = mBackStack.size()-1;
+            if (last < 0) {
+                return false;
+            }
+            final BackStackRecord bss = mBackStack.remove(last);
+            SparseArray<Fragment> firstOutFragments = new SparseArray<Fragment>();
+            SparseArray<Fragment> lastInFragments = new SparseArray<Fragment>();
+            if (mCurState >= Fragment.CREATED) {
+                bss.calculateBackFragments(firstOutFragments, lastInFragments);
+            }
+            bss.popFromBackStack(true, null, firstOutFragments, lastInFragments);
+            reportBackStackChanged();
+        } else {
+            int index = -1;
+            if (name != null || id >= 0) {
+                // If a name or ID is specified, look for that place in
+                // the stack.
+                index = mBackStack.size()-1;
+                while (index >= 0) {
+                    BackStackRecord bss = mBackStack.get(index);
+                    if (name != null && name.equals(bss.getName())) {
+                        break;
+                    }
+                    if (id >= 0 && id == bss.mIndex) {
+                        break;
+                    }
+                    index--;
+                }
+                if (index < 0) {
+                    return false;
+                }
+                if ((flags&POP_BACK_STACK_INCLUSIVE) != 0) {
+                    index--;
+                    // Consume all following entries that match.
+                    while (index >= 0) {
+                        BackStackRecord bss = mBackStack.get(index);
+                        if ((name != null && name.equals(bss.getName()))
+                                || (id >= 0 && id == bss.mIndex)) {
+                            index--;
+                            continue;
+                        }
+                        break;
+                    }
+                }
+            }
+            if (index == mBackStack.size()-1) {
+                return false;
+            }
+            final ArrayList<BackStackRecord> states
+                    = new ArrayList<BackStackRecord>();
+            for (int i=mBackStack.size()-1; i>index; i--) {
+                states.add(mBackStack.remove(i));
+            }
+            final int LAST = states.size()-1;
+            SparseArray<Fragment> firstOutFragments = new SparseArray<Fragment>();
+            SparseArray<Fragment> lastInFragments = new SparseArray<Fragment>();
+            if (mCurState >= Fragment.CREATED) {
+                for (int i = 0; i <= LAST; i++) {
+                    states.get(i).calculateBackFragments(firstOutFragments, lastInFragments);
+                }
+            }
+            BackStackRecord.TransitionState state = null;
+            for (int i=0; i<=LAST; i++) {
+                if (DEBUG) Log.v(TAG, "Popping back stack state: " + states.get(i));
+                state = states.get(i).popFromBackStack(i == LAST, state,
+                        firstOutFragments, lastInFragments);
+            }
+            reportBackStackChanged();
+        }
+        return true;
+    }
+    
+    FragmentManagerNonConfig retainNonConfig() {
+        ArrayList<Fragment> fragments = null;
+        ArrayList<FragmentManagerNonConfig> childFragments = null;
+        if (mActive != null) {
+            for (int i=0; i<mActive.size(); i++) {
+                Fragment f = mActive.get(i);
+                if (f != null) {
+                    if (f.mRetainInstance) {
+                        if (fragments == null) {
+                            fragments = new ArrayList<Fragment>();
+                        }
+                        fragments.add(f);
+                        f.mRetaining = true;
+                        f.mTargetIndex = f.mTarget != null ? f.mTarget.mIndex : -1;
+                        if (DEBUG) Log.v(TAG, "retainNonConfig: keeping retained " + f);
+                    }
+                    boolean addedChild = false;
+                    if (f.mChildFragmentManager != null) {
+                        FragmentManagerNonConfig child = f.mChildFragmentManager.retainNonConfig();
+                        if (child != null) {
+                            if (childFragments == null) {
+                                childFragments = new ArrayList<FragmentManagerNonConfig>();
+                                for (int j = 0; j < i; j++) {
+                                    childFragments.add(null);
+                                }
+                            }
+                            childFragments.add(child);
+                            addedChild = true;
+                        }
+                    }
+                    if (childFragments != null && !addedChild) {
+                        childFragments.add(null);
+                    }
+                }
+            }
+        }
+        if (fragments == null && childFragments == null) {
+            return null;
+        }
+        return new FragmentManagerNonConfig(fragments, childFragments);
+    }
+    
+    void saveFragmentViewState(Fragment f) {
+        if (f.mInnerView == null) {
+            return;
+        }
+        if (mStateArray == null) {
+            mStateArray = new SparseArray<Parcelable>();
+        } else {
+            mStateArray.clear();
+        }
+        f.mInnerView.saveHierarchyState(mStateArray);
+        if (mStateArray.size() > 0) {
+            f.mSavedViewState = mStateArray;
+            mStateArray = null;
+        }
+    }
+    
+    Bundle saveFragmentBasicState(Fragment f) {
+        Bundle result = null;
+
+        if (mStateBundle == null) {
+            mStateBundle = new Bundle();
+        }
+        f.performSaveInstanceState(mStateBundle);
+        if (!mStateBundle.isEmpty()) {
+            result = mStateBundle;
+            mStateBundle = null;
+        }
+
+        if (f.mView != null) {
+            saveFragmentViewState(f);
+        }
+        if (f.mSavedViewState != null) {
+            if (result == null) {
+                result = new Bundle();
+            }
+            result.putSparseParcelableArray(
+                    FragmentManagerImpl.VIEW_STATE_TAG, f.mSavedViewState);
+        }
+        if (!f.mUserVisibleHint) {
+            if (result == null) {
+                result = new Bundle();
+            }
+            // Only add this if it's not the default value
+            result.putBoolean(FragmentManagerImpl.USER_VISIBLE_HINT_TAG, f.mUserVisibleHint);
+        }
+
+        return result;
+    }
+
+    Parcelable saveAllState() {
+        // Make sure all pending operations have now been executed to get
+        // our state update-to-date.
+        execPendingActions();
+
+        if (HONEYCOMB) {
+            // As of Honeycomb, we save state after pausing.  Prior to that
+            // it is before pausing.  With fragments this is an issue, since
+            // there are many things you may do after pausing but before
+            // stopping that change the fragment state.  For those older
+            // devices, we will not at this point say that we have saved
+            // the state, so we will allow them to continue doing fragment
+            // transactions.  This retains the same semantics as Honeycomb,
+            // though you do have the risk of losing the very most recent state
+            // if the process is killed...  we'll live with that.
+            mStateSaved = true;
+        }
+
+        if (mActive == null || mActive.size() <= 0) {
+            return null;
+        }
+        
+        // First collect all active fragments.
+        int N = mActive.size();
+        FragmentState[] active = new FragmentState[N];
+        boolean haveFragments = false;
+        for (int i=0; i<N; i++) {
+            Fragment f = mActive.get(i);
+            if (f != null) {
+                if (f.mIndex < 0) {
+                    throwException(new IllegalStateException(
+                            "Failure saving state: active " + f
+                            + " has cleared index: " + f.mIndex));
+                }
+
+                haveFragments = true;
+                
+                FragmentState fs = new FragmentState(f);
+                active[i] = fs;
+                
+                if (f.mState > Fragment.INITIALIZING && fs.mSavedFragmentState == null) {
+                    fs.mSavedFragmentState = saveFragmentBasicState(f);
+
+                    if (f.mTarget != null) {
+                        if (f.mTarget.mIndex < 0) {
+                            throwException(new IllegalStateException(
+                                    "Failure saving state: " + f
+                                    + " has target not in fragment manager: " + f.mTarget));
+                        }
+                        if (fs.mSavedFragmentState == null) {
+                            fs.mSavedFragmentState = new Bundle();
+                        }
+                        putFragment(fs.mSavedFragmentState,
+                                FragmentManagerImpl.TARGET_STATE_TAG, f.mTarget);
+                        if (f.mTargetRequestCode != 0) {
+                            fs.mSavedFragmentState.putInt(
+                                    FragmentManagerImpl.TARGET_REQUEST_CODE_STATE_TAG,
+                                    f.mTargetRequestCode);
+                        }
+                    }
+
+                } else {
+                    fs.mSavedFragmentState = f.mSavedFragmentState;
+                }
+                
+                if (DEBUG) Log.v(TAG, "Saved state of " + f + ": "
+                        + fs.mSavedFragmentState);
+            }
+        }
+        
+        if (!haveFragments) {
+            if (DEBUG) Log.v(TAG, "saveAllState: no fragments!");
+            return null;
+        }
+        
+        int[] added = null;
+        BackStackState[] backStack = null;
+        
+        // Build list of currently added fragments.
+        if (mAdded != null) {
+            N = mAdded.size();
+            if (N > 0) {
+                added = new int[N];
+                for (int i=0; i<N; i++) {
+                    added[i] = mAdded.get(i).mIndex;
+                    if (added[i] < 0) {
+                        throwException(new IllegalStateException(
+                                "Failure saving state: active " + mAdded.get(i)
+                                + " has cleared index: " + added[i]));
+                    }
+                    if (DEBUG) Log.v(TAG, "saveAllState: adding fragment #" + i
+                            + ": " + mAdded.get(i));
+                }
+            }
+        }
+        
+        // Now save back stack.
+        if (mBackStack != null) {
+            N = mBackStack.size();
+            if (N > 0) {
+                backStack = new BackStackState[N];
+                for (int i=0; i<N; i++) {
+                    backStack[i] = new BackStackState(mBackStack.get(i));
+                    if (DEBUG) Log.v(TAG, "saveAllState: adding back stack #" + i
+                            + ": " + mBackStack.get(i));
+                }
+            }
+        }
+        
+        FragmentManagerState fms = new FragmentManagerState();
+        fms.mActive = active;
+        fms.mAdded = added;
+        fms.mBackStack = backStack;
+        return fms;
+    }
+    
+    void restoreAllState(Parcelable state, FragmentManagerNonConfig nonConfig) {
+        // If there is no saved state at all, then there can not be
+        // any nonConfig fragments either, so that is that.
+        if (state == null) return;
+        FragmentManagerState fms = (FragmentManagerState)state;
+        if (fms.mActive == null) return;
+
+        List<FragmentManagerNonConfig> childNonConfigs = null;
+
+        // First re-attach any non-config instances we are retaining back
+        // to their saved state, so we don't try to instantiate them again.
+        if (nonConfig != null) {
+            List<Fragment> nonConfigFragments = nonConfig.getFragments();
+            childNonConfigs = nonConfig.getChildNonConfigs();
+            final int count = nonConfigFragments != null ? nonConfigFragments.size() : 0;
+            for (int i = 0; i < count; i++) {
+                Fragment f = nonConfigFragments.get(i);
+                if (DEBUG) Log.v(TAG, "restoreAllState: re-attaching retained " + f);
+                FragmentState fs = fms.mActive[f.mIndex];
+                fs.mInstance = f;
+                f.mSavedViewState = null;
+                f.mBackStackNesting = 0;
+                f.mInLayout = false;
+                f.mAdded = false;
+                f.mTarget = null;
+                if (fs.mSavedFragmentState != null) {
+                    fs.mSavedFragmentState.setClassLoader(mHost.getContext().getClassLoader());
+                    f.mSavedViewState = fs.mSavedFragmentState.getSparseParcelableArray(
+                            FragmentManagerImpl.VIEW_STATE_TAG);
+                    f.mSavedFragmentState = fs.mSavedFragmentState;
+                }
+            }
+        }
+        
+        // Build the full list of active fragments, instantiating them from
+        // their saved state.
+        mActive = new ArrayList<>(fms.mActive.length);
+        if (mAvailIndices != null) {
+            mAvailIndices.clear();
+        }
+        for (int i=0; i<fms.mActive.length; i++) {
+            FragmentState fs = fms.mActive[i];
+            if (fs != null) {
+                FragmentManagerNonConfig childNonConfig = null;
+                if (childNonConfigs != null && i < childNonConfigs.size()) {
+                    childNonConfig = childNonConfigs.get(i);
+                }
+                Fragment f = fs.instantiate(mHost, mParent, childNonConfig);
+                if (DEBUG) Log.v(TAG, "restoreAllState: active #" + i + ": " + f);
+                mActive.add(f);
+                // Now that the fragment is instantiated (or came from being
+                // retained above), clear mInstance in case we end up re-restoring
+                // from this FragmentState again.
+                fs.mInstance = null;
+            } else {
+                mActive.add(null);
+                if (mAvailIndices == null) {
+                    mAvailIndices = new ArrayList<Integer>();
+                }
+                if (DEBUG) Log.v(TAG, "restoreAllState: avail #" + i);
+                mAvailIndices.add(i);
+            }
+        }
+        
+        // Update the target of all retained fragments.
+        if (nonConfig != null) {
+            List<Fragment> nonConfigFragments = nonConfig.getFragments();
+            final int count = nonConfigFragments != null ? nonConfigFragments.size() : 0;
+            for (int i = 0; i < count; i++) {
+                Fragment f = nonConfigFragments.get(i);
+                if (f.mTargetIndex >= 0) {
+                    if (f.mTargetIndex < mActive.size()) {
+                        f.mTarget = mActive.get(f.mTargetIndex);
+                    } else {
+                        Log.w(TAG, "Re-attaching retained fragment " + f
+                                + " target no longer exists: " + f.mTargetIndex);
+                        f.mTarget = null;
+                    }
+                }
+            }
+        }
+
+        // Build the list of currently added fragments.
+        if (fms.mAdded != null) {
+            mAdded = new ArrayList<Fragment>(fms.mAdded.length);
+            for (int i=0; i<fms.mAdded.length; i++) {
+                Fragment f = mActive.get(fms.mAdded[i]);
+                if (f == null) {
+                    throwException(new IllegalStateException(
+                            "No instantiated fragment for index #" + fms.mAdded[i]));
+                }
+                f.mAdded = true;
+                if (DEBUG) Log.v(TAG, "restoreAllState: added #" + i + ": " + f);
+                if (mAdded.contains(f)) {
+                    throw new IllegalStateException("Already added!");
+                }
+                mAdded.add(f);
+            }
+        } else {
+            mAdded = null;
+        }
+        
+        // Build the back stack.
+        if (fms.mBackStack != null) {
+            mBackStack = new ArrayList<BackStackRecord>(fms.mBackStack.length);
+            for (int i=0; i<fms.mBackStack.length; i++) {
+                BackStackRecord bse = fms.mBackStack[i].instantiate(this);
+                if (DEBUG) {
+                    Log.v(TAG, "restoreAllState: back stack #" + i
+                        + " (index " + bse.mIndex + "): " + bse);
+                    LogWriter logw = new LogWriter(TAG);
+                    PrintWriter pw = new PrintWriter(logw);
+                    bse.dump("  ", pw, false);
+                }
+                mBackStack.add(bse);
+                if (bse.mIndex >= 0) {
+                    setBackStackIndex(bse.mIndex, bse);
+                }
+            }
+        } else {
+            mBackStack = null;
+        }
+    }
+
+    public void attachController(FragmentHostCallback host,
+            FragmentContainer container, Fragment parent) {
+        if (mHost != null) throw new IllegalStateException("Already attached");
+        mHost = host;
+        mContainer = container;
+        mParent = parent;
+    }
+    
+    public void noteStateNotSaved() {
+        mStateSaved = false;
+    }
+    
+    public void dispatchCreate() {
+        mStateSaved = false;
+        moveToState(Fragment.CREATED, false);
+    }
+    
+    public void dispatchActivityCreated() {
+        mStateSaved = false;
+        moveToState(Fragment.ACTIVITY_CREATED, false);
+    }
+    
+    public void dispatchStart() {
+        mStateSaved = false;
+        moveToState(Fragment.STARTED, false);
+    }
+    
+    public void dispatchResume() {
+        mStateSaved = false;
+        moveToState(Fragment.RESUMED, false);
+    }
+    
+    public void dispatchPause() {
+        moveToState(Fragment.STARTED, false);
+    }
+    
+    public void dispatchStop() {
+        // See saveAllState() for the explanation of this.  We do this for
+        // all platform versions, to keep our behavior more consistent between
+        // them.
+        mStateSaved = true;
+
+        moveToState(Fragment.STOPPED, false);
+    }
+    
+    public void dispatchReallyStop() {
+        moveToState(Fragment.ACTIVITY_CREATED, false);
+    }
+
+    public void dispatchDestroyView() {
+        moveToState(Fragment.CREATED, false);
+    }
+
+    public void dispatchDestroy() {
+        mDestroyed = true;
+        execPendingActions();
+        moveToState(Fragment.INITIALIZING, false);
+        mHost = null;
+        mContainer = null;
+        mParent = null;
+    }
+
+    public void dispatchMultiWindowModeChanged(boolean isInMultiWindowMode) {
+        if (mAdded == null) {
+            return;
+        }
+        for (int i = mAdded.size() - 1; i >= 0; --i) {
+            final android.support.v4.app.Fragment f = mAdded.get(i);
+            if (f != null) {
+                f.performMultiWindowModeChanged(isInMultiWindowMode);
+            }
+        }
+    }
+
+    public void dispatchPictureInPictureModeChanged(boolean isInPictureInPictureMode) {
+        if (mAdded == null) {
+            return;
+        }
+        for (int i = mAdded.size() - 1; i >= 0; --i) {
+            final android.support.v4.app.Fragment f = mAdded.get(i);
+            if (f != null) {
+                f.performPictureInPictureModeChanged(isInPictureInPictureMode);
+            }
+        }
+    }
+
+    public void dispatchConfigurationChanged(Configuration newConfig) {
+        if (mAdded != null) {
+            for (int i=0; i<mAdded.size(); i++) {
+                Fragment f = mAdded.get(i);
+                if (f != null) {
+                    f.performConfigurationChanged(newConfig);
+                }
+            }
+        }
+    }
+
+    public void dispatchLowMemory() {
+        if (mAdded != null) {
+            for (int i=0; i<mAdded.size(); i++) {
+                Fragment f = mAdded.get(i);
+                if (f != null) {
+                    f.performLowMemory();
+                }
+            }
+        }
+    }
+
+    public boolean dispatchCreateOptionsMenu(Menu menu, MenuInflater inflater) {
+        boolean show = false;
+        ArrayList<Fragment> newMenus = null;
+        if (mAdded != null) {
+            for (int i=0; i<mAdded.size(); i++) {
+                Fragment f = mAdded.get(i);
+                if (f != null) {
+                    if (f.performCreateOptionsMenu(menu, inflater)) {
+                        show = true;
+                        if (newMenus == null) {
+                            newMenus = new ArrayList<Fragment>();
+                        }
+                        newMenus.add(f);
+                    }
+                }
+            }
+        }
+
+        if (mCreatedMenus != null) {
+            for (int i=0; i<mCreatedMenus.size(); i++) {
+                Fragment f = mCreatedMenus.get(i);
+                if (newMenus == null || !newMenus.contains(f)) {
+                    f.onDestroyOptionsMenu();
+                }
+            }
+        }
+
+        mCreatedMenus = newMenus;
+
+        return show;
+    }
+    
+    public boolean dispatchPrepareOptionsMenu(Menu menu) {
+        boolean show = false;
+        if (mAdded != null) {
+            for (int i=0; i<mAdded.size(); i++) {
+                Fragment f = mAdded.get(i);
+                if (f != null) {
+                    if (f.performPrepareOptionsMenu(menu)) {
+                        show = true;
+                    }
+                }
+            }
+        }
+        return show;
+    }
+    
+    public boolean dispatchOptionsItemSelected(MenuItem item) {
+        if (mAdded != null) {
+            for (int i=0; i<mAdded.size(); i++) {
+                Fragment f = mAdded.get(i);
+                if (f != null) {
+                    if (f.performOptionsItemSelected(item)) {
+                        return true;
+                    }
+                }
+            }
+        }
+        return false;
+    }
+    
+    public boolean dispatchContextItemSelected(MenuItem item) {
+        if (mAdded != null) {
+            for (int i=0; i<mAdded.size(); i++) {
+                Fragment f = mAdded.get(i);
+                if (f != null) {
+                    if (f.performContextItemSelected(item)) {
+                        return true;
+                    }
+                }
+            }
+        }
+        return false;
+    }
+    
+    public void dispatchOptionsMenuClosed(Menu menu) {
+        if (mAdded != null) {
+            for (int i=0; i<mAdded.size(); i++) {
+                Fragment f = mAdded.get(i);
+                if (f != null) {
+                    f.performOptionsMenuClosed(menu);
+                }
+            }
+        }
+    }
+
+    public static int reverseTransit(int transit) {
+        int rev = 0;
+        switch (transit) {
+            case FragmentTransaction.TRANSIT_FRAGMENT_OPEN:
+                rev = FragmentTransaction.TRANSIT_FRAGMENT_CLOSE;
+                break;
+            case FragmentTransaction.TRANSIT_FRAGMENT_CLOSE:
+                rev = FragmentTransaction.TRANSIT_FRAGMENT_OPEN;
+                break;
+            case FragmentTransaction.TRANSIT_FRAGMENT_FADE:
+                rev = FragmentTransaction.TRANSIT_FRAGMENT_FADE;
+                break;
+        }
+        return rev;
+        
+    }
+    
+    public static final int ANIM_STYLE_OPEN_ENTER = 1;
+    public static final int ANIM_STYLE_OPEN_EXIT = 2;
+    public static final int ANIM_STYLE_CLOSE_ENTER = 3;
+    public static final int ANIM_STYLE_CLOSE_EXIT = 4;
+    public static final int ANIM_STYLE_FADE_ENTER = 5;
+    public static final int ANIM_STYLE_FADE_EXIT = 6;
+    
+    public static int transitToStyleIndex(int transit, boolean enter) {
+        int animAttr = -1;
+        switch (transit) {
+            case FragmentTransaction.TRANSIT_FRAGMENT_OPEN:
+                animAttr = enter ? ANIM_STYLE_OPEN_ENTER : ANIM_STYLE_OPEN_EXIT;
+                break;
+            case FragmentTransaction.TRANSIT_FRAGMENT_CLOSE:
+                animAttr = enter ? ANIM_STYLE_CLOSE_ENTER : ANIM_STYLE_CLOSE_EXIT;
+                break;
+            case FragmentTransaction.TRANSIT_FRAGMENT_FADE:
+                animAttr = enter ? ANIM_STYLE_FADE_ENTER : ANIM_STYLE_FADE_EXIT;
+                break;
+        }
+        return animAttr;
+    }
+
+    @Override
+    public View onCreateView(View parent, String name, Context context, AttributeSet attrs) {
+        if (!"fragment".equals(name)) {
+            return null;
+        }
+
+        String fname = attrs.getAttributeValue(null, "class");
+        TypedArray a =  context.obtainStyledAttributes(attrs, FragmentTag.Fragment);
+        if (fname == null) {
+            fname = a.getString(FragmentTag.Fragment_name);
+        }
+        int id = a.getResourceId(FragmentTag.Fragment_id, View.NO_ID);
+        String tag = a.getString(FragmentTag.Fragment_tag);
+        a.recycle();
+
+        if (!Fragment.isSupportFragmentClass(mHost.getContext(), fname)) {
+            // Invalid support lib fragment; let the device's framework handle it.
+            // This will allow android.app.Fragments to do the right thing.
+            return null;
+        }
+
+        int containerId = parent != null ? parent.getId() : 0;
+        if (containerId == View.NO_ID && id == View.NO_ID && tag == null) {
+            throw new IllegalArgumentException(attrs.getPositionDescription()
+                    + ": Must specify unique android:id, android:tag, or have a parent with an id for " + fname);
+        }
+
+        // If we restored from a previous state, we may already have
+        // instantiated this fragment from the state and should use
+        // that instance instead of making a new one.
+        Fragment fragment = id != View.NO_ID ? findFragmentById(id) : null;
+        if (fragment == null && tag != null) {
+            fragment = findFragmentByTag(tag);
+        }
+        if (fragment == null && containerId != View.NO_ID) {
+            fragment = findFragmentById(containerId);
+        }
+
+        if (FragmentManagerImpl.DEBUG) Log.v(TAG, "onCreateView: id=0x"
+                + Integer.toHexString(id) + " fname=" + fname
+                + " existing=" + fragment);
+        if (fragment == null) {
+            fragment = Fragment.instantiate(context, fname);
+            fragment.mFromLayout = true;
+            fragment.mFragmentId = id != 0 ? id : containerId;
+            fragment.mContainerId = containerId;
+            fragment.mTag = tag;
+            fragment.mInLayout = true;
+            fragment.mFragmentManager = this;
+            fragment.mHost = mHost;
+            fragment.onInflate(mHost.getContext(), attrs, fragment.mSavedFragmentState);
+            addFragment(fragment, true);
+
+        } else if (fragment.mInLayout) {
+            // A fragment already exists and it is not one we restored from
+            // previous state.
+            throw new IllegalArgumentException(attrs.getPositionDescription()
+                    + ": Duplicate id 0x" + Integer.toHexString(id)
+                    + ", tag " + tag + ", or parent id 0x" + Integer.toHexString(containerId)
+                    + " with another fragment for " + fname);
+        } else {
+            // This fragment was retained from a previous instance; get it
+            // going now.
+            fragment.mInLayout = true;
+            fragment.mHost = mHost;
+            // If this fragment is newly instantiated (either right now, or
+            // from last saved state), then give it the attributes to
+            // initialize itself.
+            if (!fragment.mRetaining) {
+                fragment.onInflate(mHost.getContext(), attrs, fragment.mSavedFragmentState);
+            }
+        }
+
+        // If we haven't finished entering the CREATED state ourselves yet,
+        // push the inflated child fragment along.
+        if (mCurState < Fragment.CREATED && fragment.mFromLayout) {
+            moveToState(fragment, Fragment.CREATED, 0, 0, false);
+        } else {
+            moveToState(fragment);
+        }
+
+        if (fragment.mView == null) {
+            throw new IllegalStateException("Fragment " + fname
+                    + " did not create a view.");
+        }
+        if (id != 0) {
+            fragment.mView.setId(id);
+        }
+        if (fragment.mView.getTag() == null) {
+            fragment.mView.setTag(tag);
+        }
+        return fragment.mView;
+    }
+
+    LayoutInflaterFactory getLayoutInflaterFactory() {
+        return this;
+    }
+
+    static class FragmentTag {
+        public static final int[] Fragment = {
+                0x01010003, 0x010100d0, 0x010100d1
+        };
+        public static final int Fragment_id = 1;
+        public static final int Fragment_name = 0;
+        public static final int Fragment_tag = 2;
+    }
+}
diff --git a/v4/java/android/support/v4/app/FragmentManagerNonConfig.java b/fragment/java/android/support/v4/app/FragmentManagerNonConfig.java
similarity index 100%
rename from v4/java/android/support/v4/app/FragmentManagerNonConfig.java
rename to fragment/java/android/support/v4/app/FragmentManagerNonConfig.java
diff --git a/fragment/java/android/support/v4/app/FragmentPagerAdapter.java b/fragment/java/android/support/v4/app/FragmentPagerAdapter.java
new file mode 100644
index 0000000..096995d
--- /dev/null
+++ b/fragment/java/android/support/v4/app/FragmentPagerAdapter.java
@@ -0,0 +1,178 @@
+/*
+ * 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 android.support.v4.app;
+
+import android.os.Parcelable;
+import android.support.v4.view.PagerAdapter;
+import android.util.Log;
+import android.view.View;
+import android.view.ViewGroup;
+
+/**
+ * Implementation of {@link PagerAdapter} that
+ * represents each page as a {@link Fragment} that is persistently
+ * kept in the fragment manager as long as the user can return to the page.
+ *
+ * <p>This version of the pager is best for use when there are a handful of
+ * typically more static fragments to be paged through, such as a set of tabs.
+ * The fragment of each page the user visits will be kept in memory, though its
+ * view hierarchy may be destroyed when not visible.  This can result in using
+ * a significant amount of memory since fragment instances can hold on to an
+ * arbitrary amount of state.  For larger sets of pages, consider
+ * {@link FragmentStatePagerAdapter}.
+ *
+ * <p>When using FragmentPagerAdapter the host ViewPager must have a
+ * valid ID set.</p>
+ *
+ * <p>Subclasses only need to implement {@link #getItem(int)}
+ * and {@link #getCount()} to have a working adapter.
+ *
+ * <p>Here is an example implementation of a pager containing fragments of
+ * lists:
+ *
+ * {@sample frameworks/support/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentPagerSupport.java
+ *      complete}
+ *
+ * <p>The <code>R.layout.fragment_pager</code> resource of the top-level fragment is:
+ *
+ * {@sample frameworks/support/samples/Support4Demos/res/layout/fragment_pager.xml
+ *      complete}
+ *
+ * <p>The <code>R.layout.fragment_pager_list</code> resource containing each
+ * individual fragment's layout is:
+ *
+ * {@sample frameworks/support/samples/Support4Demos/res/layout/fragment_pager_list.xml
+ *      complete}
+ */
+public abstract class FragmentPagerAdapter extends PagerAdapter {
+    private static final String TAG = "FragmentPagerAdapter";
+    private static final boolean DEBUG = false;
+
+    private final FragmentManager mFragmentManager;
+    private FragmentTransaction mCurTransaction = null;
+    private Fragment mCurrentPrimaryItem = null;
+
+    public FragmentPagerAdapter(FragmentManager fm) {
+        mFragmentManager = fm;
+    }
+
+    /**
+     * Return the Fragment associated with a specified position.
+     */
+    public abstract Fragment getItem(int position);
+
+    @Override
+    public void startUpdate(ViewGroup container) {
+        if (container.getId() == View.NO_ID) {
+            throw new IllegalStateException("ViewPager with adapter " + this
+                    + " requires a view id");
+        }
+    }
+
+    @Override
+    public Object instantiateItem(ViewGroup container, int position) {
+        if (mCurTransaction == null) {
+            mCurTransaction = mFragmentManager.beginTransaction();
+        }
+
+        final long itemId = getItemId(position);
+
+        // Do we already have this fragment?
+        String name = makeFragmentName(container.getId(), itemId);
+        Fragment fragment = mFragmentManager.findFragmentByTag(name);
+        if (fragment != null) {
+            if (DEBUG) Log.v(TAG, "Attaching item #" + itemId + ": f=" + fragment);
+            mCurTransaction.attach(fragment);
+        } else {
+            fragment = getItem(position);
+            if (DEBUG) Log.v(TAG, "Adding item #" + itemId + ": f=" + fragment);
+            mCurTransaction.add(container.getId(), fragment,
+                    makeFragmentName(container.getId(), itemId));
+        }
+        if (fragment != mCurrentPrimaryItem) {
+            fragment.setMenuVisibility(false);
+            fragment.setUserVisibleHint(false);
+        }
+
+        return fragment;
+    }
+
+    @Override
+    public void destroyItem(ViewGroup container, int position, Object object) {
+        if (mCurTransaction == null) {
+            mCurTransaction = mFragmentManager.beginTransaction();
+        }
+        if (DEBUG) Log.v(TAG, "Detaching item #" + getItemId(position) + ": f=" + object
+                + " v=" + ((Fragment)object).getView());
+        mCurTransaction.detach((Fragment)object);
+    }
+
+    @Override
+    public void setPrimaryItem(ViewGroup container, int position, Object object) {
+        Fragment fragment = (Fragment)object;
+        if (fragment != mCurrentPrimaryItem) {
+            if (mCurrentPrimaryItem != null) {
+                mCurrentPrimaryItem.setMenuVisibility(false);
+                mCurrentPrimaryItem.setUserVisibleHint(false);
+            }
+            if (fragment != null) {
+                fragment.setMenuVisibility(true);
+                fragment.setUserVisibleHint(true);
+            }
+            mCurrentPrimaryItem = fragment;
+        }
+    }
+
+    @Override
+    public void finishUpdate(ViewGroup container) {
+        if (mCurTransaction != null) {
+            mCurTransaction.commitNowAllowingStateLoss();
+            mCurTransaction = null;
+        }
+    }
+
+    @Override
+    public boolean isViewFromObject(View view, Object object) {
+        return ((Fragment)object).getView() == view;
+    }
+
+    @Override
+    public Parcelable saveState() {
+        return null;
+    }
+
+    @Override
+    public void restoreState(Parcelable state, ClassLoader loader) {
+    }
+
+    /**
+     * Return a unique identifier for the item at the given position.
+     *
+     * <p>The default implementation returns the given position.
+     * Subclasses should override this method if the positions of items can change.</p>
+     *
+     * @param position Position within this adapter
+     * @return Unique identifier for the item at position
+     */
+    public long getItemId(int position) {
+        return position;
+    }
+
+    private static String makeFragmentName(int viewId, long id) {
+        return "android:switcher:" + viewId + ":" + id;
+    }
+}
diff --git a/fragment/java/android/support/v4/app/FragmentStatePagerAdapter.java b/fragment/java/android/support/v4/app/FragmentStatePagerAdapter.java
new file mode 100644
index 0000000..1a4a1cd
--- /dev/null
+++ b/fragment/java/android/support/v4/app/FragmentStatePagerAdapter.java
@@ -0,0 +1,229 @@
+/*
+ * 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 android.support.v4.app;
+
+import android.os.Bundle;
+import android.os.Parcelable;
+import android.support.v4.view.PagerAdapter;
+import android.util.Log;
+import android.view.View;
+import android.view.ViewGroup;
+
+import java.util.ArrayList;
+
+/**
+ * Implementation of {@link PagerAdapter} that
+ * uses a {@link Fragment} to manage each page. This class also handles
+ * saving and restoring of fragment's state.
+ *
+ * <p>This version of the pager is more useful when there are a large number
+ * of pages, working more like a list view.  When pages are not visible to
+ * the user, their entire fragment may be destroyed, only keeping the saved
+ * state of that fragment.  This allows the pager to hold on to much less
+ * memory associated with each visited page as compared to
+ * {@link FragmentPagerAdapter} at the cost of potentially more overhead when
+ * switching between pages.
+ *
+ * <p>When using FragmentPagerAdapter the host ViewPager must have a
+ * valid ID set.</p>
+ *
+ * <p>Subclasses only need to implement {@link #getItem(int)}
+ * and {@link #getCount()} to have a working adapter.
+ *
+ * <p>Here is an example implementation of a pager containing fragments of
+ * lists:
+ *
+ * {@sample frameworks/support/samples/Support13Demos/src/com/example/android/supportv13/app/FragmentStatePagerSupport.java
+ *      complete}
+ *
+ * <p>The <code>R.layout.fragment_pager</code> resource of the top-level fragment is:
+ *
+ * {@sample frameworks/support/samples/Support13Demos/res/layout/fragment_pager.xml
+ *      complete}
+ *
+ * <p>The <code>R.layout.fragment_pager_list</code> resource containing each
+ * individual fragment's layout is:
+ *
+ * {@sample frameworks/support/samples/Support13Demos/res/layout/fragment_pager_list.xml
+ *      complete}
+ */
+public abstract class FragmentStatePagerAdapter extends PagerAdapter {
+    private static final String TAG = "FragmentStatePagerAdapter";
+    private static final boolean DEBUG = false;
+
+    private final FragmentManager mFragmentManager;
+    private FragmentTransaction mCurTransaction = null;
+
+    private ArrayList<Fragment.SavedState> mSavedState = new ArrayList<Fragment.SavedState>();
+    private ArrayList<Fragment> mFragments = new ArrayList<Fragment>();
+    private Fragment mCurrentPrimaryItem = null;
+
+    public FragmentStatePagerAdapter(FragmentManager fm) {
+        mFragmentManager = fm;
+    }
+
+    /**
+     * Return the Fragment associated with a specified position.
+     */
+    public abstract Fragment getItem(int position);
+
+    @Override
+    public void startUpdate(ViewGroup container) {
+        if (container.getId() == View.NO_ID) {
+            throw new IllegalStateException("ViewPager with adapter " + this
+                    + " requires a view id");
+        }
+    }
+
+    @Override
+    public Object instantiateItem(ViewGroup container, int position) {
+        // If we already have this item instantiated, there is nothing
+        // to do.  This can happen when we are restoring the entire pager
+        // from its saved state, where the fragment manager has already
+        // taken care of restoring the fragments we previously had instantiated.
+        if (mFragments.size() > position) {
+            Fragment f = mFragments.get(position);
+            if (f != null) {
+                return f;
+            }
+        }
+
+        if (mCurTransaction == null) {
+            mCurTransaction = mFragmentManager.beginTransaction();
+        }
+
+        Fragment fragment = getItem(position);
+        if (DEBUG) Log.v(TAG, "Adding item #" + position + ": f=" + fragment);
+        if (mSavedState.size() > position) {
+            Fragment.SavedState fss = mSavedState.get(position);
+            if (fss != null) {
+                fragment.setInitialSavedState(fss);
+            }
+        }
+        while (mFragments.size() <= position) {
+            mFragments.add(null);
+        }
+        fragment.setMenuVisibility(false);
+        fragment.setUserVisibleHint(false);
+        mFragments.set(position, fragment);
+        mCurTransaction.add(container.getId(), fragment);
+
+        return fragment;
+    }
+
+    @Override
+    public void destroyItem(ViewGroup container, int position, Object object) {
+        Fragment fragment = (Fragment) object;
+
+        if (mCurTransaction == null) {
+            mCurTransaction = mFragmentManager.beginTransaction();
+        }
+        if (DEBUG) Log.v(TAG, "Removing item #" + position + ": f=" + object
+                + " v=" + ((Fragment)object).getView());
+        while (mSavedState.size() <= position) {
+            mSavedState.add(null);
+        }
+        mSavedState.set(position, fragment.isAdded()
+                ? mFragmentManager.saveFragmentInstanceState(fragment) : null);
+        mFragments.set(position, null);
+
+        mCurTransaction.remove(fragment);
+    }
+
+    @Override
+    public void setPrimaryItem(ViewGroup container, int position, Object object) {
+        Fragment fragment = (Fragment)object;
+        if (fragment != mCurrentPrimaryItem) {
+            if (mCurrentPrimaryItem != null) {
+                mCurrentPrimaryItem.setMenuVisibility(false);
+                mCurrentPrimaryItem.setUserVisibleHint(false);
+            }
+            if (fragment != null) {
+                fragment.setMenuVisibility(true);
+                fragment.setUserVisibleHint(true);
+            }
+            mCurrentPrimaryItem = fragment;
+        }
+    }
+
+    @Override
+    public void finishUpdate(ViewGroup container) {
+        if (mCurTransaction != null) {
+            mCurTransaction.commitNowAllowingStateLoss();
+            mCurTransaction = null;
+        }
+    }
+
+    @Override
+    public boolean isViewFromObject(View view, Object object) {
+        return ((Fragment)object).getView() == view;
+    }
+
+    @Override
+    public Parcelable saveState() {
+        Bundle state = null;
+        if (mSavedState.size() > 0) {
+            state = new Bundle();
+            Fragment.SavedState[] fss = new Fragment.SavedState[mSavedState.size()];
+            mSavedState.toArray(fss);
+            state.putParcelableArray("states", fss);
+        }
+        for (int i=0; i<mFragments.size(); i++) {
+            Fragment f = mFragments.get(i);
+            if (f != null && f.isAdded()) {
+                if (state == null) {
+                    state = new Bundle();
+                }
+                String key = "f" + i;
+                mFragmentManager.putFragment(state, key, f);
+            }
+        }
+        return state;
+    }
+
+    @Override
+    public void restoreState(Parcelable state, ClassLoader loader) {
+        if (state != null) {
+            Bundle bundle = (Bundle)state;
+            bundle.setClassLoader(loader);
+            Parcelable[] fss = bundle.getParcelableArray("states");
+            mSavedState.clear();
+            mFragments.clear();
+            if (fss != null) {
+                for (int i=0; i<fss.length; i++) {
+                    mSavedState.add((Fragment.SavedState)fss[i]);
+                }
+            }
+            Iterable<String> keys = bundle.keySet();
+            for (String key: keys) {
+                if (key.startsWith("f")) {
+                    int index = Integer.parseInt(key.substring(1));
+                    Fragment f = mFragmentManager.getFragment(bundle, key);
+                    if (f != null) {
+                        while (mFragments.size() <= index) {
+                            mFragments.add(null);
+                        }
+                        f.setMenuVisibility(false);
+                        mFragments.set(index, f);
+                    } else {
+                        Log.w(TAG, "Bad fragment at key " + key);
+                    }
+                }
+            }
+        }
+    }
+}
diff --git a/fragment/java/android/support/v4/app/FragmentTabHost.java b/fragment/java/android/support/v4/app/FragmentTabHost.java
new file mode 100644
index 0000000..d1931d0
--- /dev/null
+++ b/fragment/java/android/support/v4/app/FragmentTabHost.java
@@ -0,0 +1,361 @@
+/*
+ * Copyright (C) 2012 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 android.support.v4.app;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.os.Bundle;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.util.AttributeSet;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.FrameLayout;
+import android.widget.LinearLayout;
+import android.widget.TabHost;
+import android.widget.TabWidget;
+
+import java.util.ArrayList;
+
+/**
+ * Special TabHost that allows the use of {@link Fragment} objects for
+ * its tab content.  When placing this in a view hierarchy, after inflating
+ * the hierarchy you must call {@link #setup(Context, FragmentManager, int)}
+ * to complete the initialization of the tab host.
+ *
+ * <p>Here is a simple example of using a FragmentTabHost in an Activity:
+ *
+ * {@sample frameworks/support/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentTabs.java
+ *      complete}
+ *
+ * <p>This can also be used inside of a fragment through fragment nesting:
+ *
+ * {@sample frameworks/support/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentTabsFragmentSupport.java
+ *      complete}
+ */
+public class FragmentTabHost extends TabHost
+        implements TabHost.OnTabChangeListener {
+    private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();
+    private FrameLayout mRealTabContent;
+    private Context mContext;
+    private FragmentManager mFragmentManager;
+    private int mContainerId;
+    private TabHost.OnTabChangeListener mOnTabChangeListener;
+    private TabInfo mLastTab;
+    private boolean mAttached;
+
+    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;
+        }
+    }
+
+    static class SavedState extends BaseSavedState {
+        String curTab;
+
+        SavedState(Parcelable superState) {
+            super(superState);
+        }
+
+        private SavedState(Parcel in) {
+            super(in);
+            curTab = in.readString();
+        }
+
+        @Override
+        public void writeToParcel(Parcel out, int flags) {
+            super.writeToParcel(out, flags);
+            out.writeString(curTab);
+        }
+
+        @Override
+        public String toString() {
+            return "FragmentTabHost.SavedState{"
+                    + Integer.toHexString(System.identityHashCode(this))
+                    + " curTab=" + curTab + "}";
+        }
+
+        public static final Parcelable.Creator<SavedState> CREATOR
+                = new Parcelable.Creator<SavedState>() {
+            @Override
+            public SavedState createFromParcel(Parcel in) {
+                return new SavedState(in);
+            }
+
+            @Override
+            public SavedState[] newArray(int size) {
+                return new SavedState[size];
+            }
+        };
+    }
+
+    public FragmentTabHost(Context context) {
+        // Note that we call through to the version that takes an AttributeSet,
+        // because the simple Context construct can result in a broken object!
+        super(context, null);
+        initFragmentTabHost(context, null);
+    }
+
+    public FragmentTabHost(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        initFragmentTabHost(context, attrs);
+    }
+
+    private void initFragmentTabHost(Context context, AttributeSet attrs) {
+        TypedArray a = context.obtainStyledAttributes(attrs,
+                new int[] { android.R.attr.inflatedId }, 0, 0);
+        mContainerId = a.getResourceId(0, 0);
+        a.recycle();
+
+        super.setOnTabChangedListener(this);
+    }
+
+    private void ensureHierarchy(Context context) {
+        // If owner hasn't made its own view hierarchy, then as a convenience
+        // we will construct a standard one here.
+        if (findViewById(android.R.id.tabs) == null) {
+            LinearLayout ll = new LinearLayout(context);
+            ll.setOrientation(LinearLayout.VERTICAL);
+            addView(ll, new FrameLayout.LayoutParams(
+                    ViewGroup.LayoutParams.FILL_PARENT,
+                    ViewGroup.LayoutParams.FILL_PARENT));
+
+            TabWidget tw = new TabWidget(context);
+            tw.setId(android.R.id.tabs);
+            tw.setOrientation(TabWidget.HORIZONTAL);
+            ll.addView(tw, new LinearLayout.LayoutParams(
+                    ViewGroup.LayoutParams.FILL_PARENT,
+                    ViewGroup.LayoutParams.WRAP_CONTENT, 0));
+
+            FrameLayout fl = new FrameLayout(context);
+            fl.setId(android.R.id.tabcontent);
+            ll.addView(fl, new LinearLayout.LayoutParams(0, 0, 0));
+
+            mRealTabContent = fl = new FrameLayout(context);
+            mRealTabContent.setId(mContainerId);
+            ll.addView(fl, new LinearLayout.LayoutParams(
+                    LinearLayout.LayoutParams.FILL_PARENT, 0, 1));
+        }
+    }
+
+    /**
+     * @deprecated Don't call the original TabHost setup, you must instead
+     * call {@link #setup(Context, FragmentManager)} or
+     * {@link #setup(Context, FragmentManager, int)}.
+     */
+    @Override @Deprecated
+    public void setup() {
+        throw new IllegalStateException(
+                "Must call setup() that takes a Context and FragmentManager");
+    }
+
+    public void setup(Context context, FragmentManager manager) {
+        ensureHierarchy(context);  // Ensure views required by super.setup()
+        super.setup();
+        mContext = context;
+        mFragmentManager = manager;
+        ensureContent();
+    }
+
+    public void setup(Context context, FragmentManager manager, int containerId) {
+        ensureHierarchy(context);  // Ensure views required by super.setup()
+        super.setup();
+        mContext = context;
+        mFragmentManager = manager;
+        mContainerId = containerId;
+        ensureContent();
+        mRealTabContent.setId(containerId);
+
+        // We must have an ID to be able to save/restore our state.  If
+        // the owner hasn't set one at this point, we will set it ourselves.
+        if (getId() == View.NO_ID) {
+            setId(android.R.id.tabhost);
+        }
+    }
+
+    private void ensureContent() {
+        if (mRealTabContent == null) {
+            mRealTabContent = (FrameLayout)findViewById(mContainerId);
+            if (mRealTabContent == null) {
+                throw new IllegalStateException(
+                        "No tab content FrameLayout found for id " + mContainerId);
+            }
+        }
+    }
+
+    @Override
+    public void setOnTabChangedListener(OnTabChangeListener l) {
+        mOnTabChangeListener = l;
+    }
+
+    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);
+
+        if (mAttached) {
+            // If we are already attached to the window, then check to make
+            // sure this tab's fragment is inactive if it exists.  This shouldn't
+            // normally happen.
+            info.fragment = mFragmentManager.findFragmentByTag(tag);
+            if (info.fragment != null && !info.fragment.isDetached()) {
+                FragmentTransaction ft = mFragmentManager.beginTransaction();
+                ft.detach(info.fragment);
+                ft.commit();
+            }
+        }
+
+        mTabs.add(info);
+        addTab(tabSpec);
+    }
+
+    @Override
+    protected void onAttachedToWindow() {
+        super.onAttachedToWindow();
+
+        String currentTab = getCurrentTabTag();
+
+        // Go through all tabs and make sure their fragments match
+        // the correct state.
+        FragmentTransaction ft = null;
+        for (int i=0; i<mTabs.size(); i++) {
+            TabInfo tab = mTabs.get(i);
+            tab.fragment = mFragmentManager.findFragmentByTag(tab.tag);
+            if (tab.fragment != null && !tab.fragment.isDetached()) {
+                if (tab.tag.equals(currentTab)) {
+                    // The fragment for this tab is already there and
+                    // active, and it is what we really want to have
+                    // as the current tab.  Nothing to do.
+                    mLastTab = tab;
+                } else {
+                    // This fragment was restored in the active state,
+                    // but is not the current tab.  Deactivate it.
+                    if (ft == null) {
+                        ft = mFragmentManager.beginTransaction();
+                    }
+                    ft.detach(tab.fragment);
+                }
+            }
+        }
+
+        // We are now ready to go.  Make sure we are switched to the
+        // correct tab.
+        mAttached = true;
+        ft = doTabChanged(currentTab, ft);
+        if (ft != null) {
+            ft.commit();
+            mFragmentManager.executePendingTransactions();
+        }
+    }
+
+    @Override
+    protected void onDetachedFromWindow() {
+        super.onDetachedFromWindow();
+        mAttached = false;
+    }
+
+    @Override
+    protected Parcelable onSaveInstanceState() {
+        Parcelable superState = super.onSaveInstanceState();
+        SavedState ss = new SavedState(superState);
+        ss.curTab = getCurrentTabTag();
+        return ss;
+    }
+
+    @Override
+    protected void onRestoreInstanceState(Parcelable state) {
+        if (!(state instanceof SavedState)) {
+            super.onRestoreInstanceState(state);
+            return;
+        }
+        SavedState ss = (SavedState) state;
+        super.onRestoreInstanceState(ss.getSuperState());
+        setCurrentTabByTag(ss.curTab);
+    }
+
+    @Override
+    public void onTabChanged(String tabId) {
+        if (mAttached) {
+            FragmentTransaction ft = doTabChanged(tabId, null);
+            if (ft != null) {
+                ft.commit();
+            }
+        }
+        if (mOnTabChangeListener != null) {
+            mOnTabChangeListener.onTabChanged(tabId);
+        }
+    }
+
+    private FragmentTransaction doTabChanged(String tabId, FragmentTransaction ft) {
+        TabInfo newTab = null;
+        for (int i=0; i<mTabs.size(); i++) {
+            TabInfo tab = mTabs.get(i);
+            if (tab.tag.equals(tabId)) {
+                newTab = tab;
+            }
+        }
+        if (newTab == null) {
+            throw new IllegalStateException("No tab known for tag " + tabId);
+        }
+        if (mLastTab != newTab) {
+            if (ft == null) {
+                ft = mFragmentManager.beginTransaction();
+            }
+            if (mLastTab != null) {
+                if (mLastTab.fragment != null) {
+                    ft.detach(mLastTab.fragment);
+                }
+            }
+            if (newTab != null) {
+                if (newTab.fragment == null) {
+                    newTab.fragment = Fragment.instantiate(mContext,
+                            newTab.clss.getName(), newTab.args);
+                    ft.add(mContainerId, newTab.fragment, newTab.tag);
+                } else {
+                    ft.attach(newTab.fragment);
+                }
+            }
+
+            mLastTab = newTab;
+        }
+        return ft;
+    }
+}
diff --git a/fragment/java/android/support/v4/app/FragmentTransaction.java b/fragment/java/android/support/v4/app/FragmentTransaction.java
new file mode 100644
index 0000000..cea0282
--- /dev/null
+++ b/fragment/java/android/support/v4/app/FragmentTransaction.java
@@ -0,0 +1,347 @@
+/*
+ * 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 android.support.v4.app;
+
+import android.support.annotation.AnimRes;
+import android.support.annotation.IdRes;
+import android.support.annotation.IntDef;
+import android.support.annotation.Nullable;
+import android.support.annotation.StringRes;
+import android.support.annotation.StyleRes;
+import android.support.v4.util.Pair;
+import android.view.View;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * Static library support version of the framework's {@link android.app.FragmentTransaction}.
+ * Used to write apps that run on platforms prior to Android 3.0.  When running
+ * on Android 3.0 or above, this implementation is still used; it does not try
+ * to switch to the framework's implementation.  See the framework SDK
+ * documentation for a class overview.
+ */
+public abstract class FragmentTransaction {
+    /**
+     * Calls {@link #add(int, Fragment, String)} with a 0 containerViewId.
+     */
+    public abstract FragmentTransaction add(Fragment fragment, String tag);
+    
+    /**
+     * Calls {@link #add(int, Fragment, String)} with a null tag.
+     */
+    public abstract FragmentTransaction add(@IdRes int containerViewId, Fragment fragment);
+    
+    /**
+     * Add a fragment to the activity state.  This fragment may optionally
+     * also have its view (if {@link Fragment#onCreateView Fragment.onCreateView}
+     * returns non-null) into a container view of the activity.
+     * 
+     * @param containerViewId Optional identifier of the container this fragment is
+     * to be placed in.  If 0, it will not be placed in a container.
+     * @param fragment The fragment to be added.  This fragment must not already
+     * be added to the activity.
+     * @param tag Optional tag name for the fragment, to later retrieve the
+     * fragment with {@link FragmentManager#findFragmentByTag(String)
+     * FragmentManager.findFragmentByTag(String)}.
+     * 
+     * @return Returns the same FragmentTransaction instance.
+     */
+    public abstract FragmentTransaction add(@IdRes int containerViewId, Fragment fragment,
+            @Nullable String tag);
+    
+    /**
+     * Calls {@link #replace(int, Fragment, String)} with a null tag.
+     */
+    public abstract FragmentTransaction replace(@IdRes int containerViewId, Fragment fragment);
+    
+    /**
+     * Replace an existing fragment that was added to a container.  This is
+     * essentially the same as calling {@link #remove(Fragment)} for all
+     * currently added fragments that were added with the same containerViewId
+     * and then {@link #add(int, Fragment, String)} with the same arguments
+     * given here.
+     * 
+     * @param containerViewId Identifier of the container whose fragment(s) are
+     * to be replaced.
+     * @param fragment The new fragment to place in the container.
+     * @param tag Optional tag name for the fragment, to later retrieve the
+     * fragment with {@link FragmentManager#findFragmentByTag(String)
+     * FragmentManager.findFragmentByTag(String)}.
+     * 
+     * @return Returns the same FragmentTransaction instance.
+     */
+    public abstract FragmentTransaction replace(@IdRes int containerViewId, Fragment fragment,
+            @Nullable String tag);
+    
+    /**
+     * Remove an existing fragment.  If it was added to a container, its view
+     * is also removed from that container.
+     * 
+     * @param fragment The fragment to be removed.
+     * 
+     * @return Returns the same FragmentTransaction instance.
+     */
+    public abstract FragmentTransaction remove(Fragment fragment);
+    
+    /**
+     * Hides an existing fragment.  This is only relevant for fragments whose
+     * views have been added to a container, as this will cause the view to
+     * be hidden.
+     * 
+     * @param fragment The fragment to be hidden.
+     * 
+     * @return Returns the same FragmentTransaction instance.
+     */
+    public abstract FragmentTransaction hide(Fragment fragment);
+    
+    /**
+     * Shows a previously hidden fragment.  This is only relevant for fragments whose
+     * views have been added to a container, as this will cause the view to
+     * be shown.
+     * 
+     * @param fragment The fragment to be shown.
+     * 
+     * @return Returns the same FragmentTransaction instance.
+     */
+    public abstract FragmentTransaction show(Fragment fragment);
+
+    /**
+     * Detach the given fragment from the UI.  This is the same state as
+     * when it is put on the back stack: the fragment is removed from
+     * the UI, however its state is still being actively managed by the
+     * fragment manager.  When going into this state its view hierarchy
+     * is destroyed.
+     *
+     * @param fragment The fragment to be detached.
+     *
+     * @return Returns the same FragmentTransaction instance.
+     */
+    public abstract FragmentTransaction detach(Fragment fragment);
+
+    /**
+     * Re-attach a fragment after it had previously been detached from
+     * the UI with {@link #detach(Fragment)}.  This
+     * causes its view hierarchy to be re-created, attached to the UI,
+     * and displayed.
+     *
+     * @param fragment The fragment to be attached.
+     *
+     * @return Returns the same FragmentTransaction instance.
+     */
+    public abstract FragmentTransaction attach(Fragment fragment);
+
+    /**
+     * @return <code>true</code> if this transaction contains no operations,
+     * <code>false</code> otherwise.
+     */
+    public abstract boolean isEmpty();
+    
+    /**
+     * Bit mask that is set for all enter transitions.
+     */
+    public static final int TRANSIT_ENTER_MASK = 0x1000;
+    
+    /**
+     * Bit mask that is set for all exit transitions.
+     */
+    public static final int TRANSIT_EXIT_MASK = 0x2000;
+
+    /** @hide */
+    @IntDef({TRANSIT_NONE, TRANSIT_FRAGMENT_OPEN, TRANSIT_FRAGMENT_CLOSE, TRANSIT_FRAGMENT_FADE})
+    @Retention(RetentionPolicy.SOURCE)
+    private @interface Transit {}
+
+    /** Not set up for a transition. */
+    public static final int TRANSIT_UNSET = -1;
+    /** No animation for transition. */
+    public static final int TRANSIT_NONE = 0;
+    /** Fragment is being added onto the stack */
+    public static final int TRANSIT_FRAGMENT_OPEN = 1 | TRANSIT_ENTER_MASK;
+    /** Fragment is being removed from the stack */
+    public static final int TRANSIT_FRAGMENT_CLOSE = 2 | TRANSIT_EXIT_MASK;
+    /** Fragment should simply fade in or out; that is, no strong navigation associated
+     * with it except that it is appearing or disappearing for some reason. */
+    public static final int TRANSIT_FRAGMENT_FADE = 3 | TRANSIT_ENTER_MASK;
+
+    /**
+     * Set specific animation resources to run for the fragments that are
+     * entering and exiting in this transaction. These animations will not be
+     * played when popping the back stack.
+     */
+    public abstract FragmentTransaction setCustomAnimations(@AnimRes int enter,
+            @AnimRes int exit);
+
+    /**
+     * Set specific animation resources to run for the fragments that are
+     * entering and exiting in this transaction. The <code>popEnter</code>
+     * and <code>popExit</code> animations will be played for enter/exit
+     * operations specifically when popping the back stack.
+     */
+    public abstract FragmentTransaction setCustomAnimations(@AnimRes int enter,
+            @AnimRes int exit, @AnimRes int popEnter, @AnimRes int popExit);
+
+    /**
+     * Used with custom Transitions to map a View from a removed or hidden
+     * Fragment to a View from a shown or added Fragment.
+     * <var>sharedElement</var> must have a unique transitionName in the View hierarchy.
+     *
+     * @param sharedElement A View in a disappearing Fragment to match with a View in an
+     *                      appearing Fragment.
+     * @param name The transitionName for a View in an appearing Fragment to match to the shared
+     *             element.
+     * @see Fragment#setSharedElementReturnTransition(Object)
+     * @see Fragment#setSharedElementEnterTransition(Object)
+     */
+    public abstract FragmentTransaction addSharedElement(View sharedElement, String name);
+
+    /**
+     * Select a standard transition animation for this transaction.  May be
+     * one of {@link #TRANSIT_NONE}, {@link #TRANSIT_FRAGMENT_OPEN},
+     * {@link #TRANSIT_FRAGMENT_CLOSE}, or {@link #TRANSIT_FRAGMENT_FADE}.
+     */
+    public abstract FragmentTransaction setTransition(@Transit int transit);
+
+    /**
+     * Set a custom style resource that will be used for resolving transit
+     * animations.
+     */
+    public abstract FragmentTransaction setTransitionStyle(@StyleRes int styleRes);
+    
+    /**
+     * Add this transaction to the back stack.  This means that the transaction
+     * will be remembered after it is committed, and will reverse its operation
+     * when later popped off the stack.
+     *
+     * @param name An optional name for this back stack state, or null.
+     */
+    public abstract FragmentTransaction addToBackStack(@Nullable String name);
+
+    /**
+     * Returns true if this FragmentTransaction is allowed to be added to the back
+     * stack. If this method would return false, {@link #addToBackStack(String)}
+     * will throw {@link IllegalStateException}.
+     *
+     * @return True if {@link #addToBackStack(String)} is permitted on this transaction.
+     */
+    public abstract boolean isAddToBackStackAllowed();
+
+    /**
+     * Disallow calls to {@link #addToBackStack(String)}. Any future calls to
+     * addToBackStack will throw {@link IllegalStateException}. If addToBackStack
+     * has already been called, this method will throw IllegalStateException.
+     */
+    public abstract FragmentTransaction disallowAddToBackStack();
+
+    /**
+     * Set the full title to show as a bread crumb when this transaction
+     * is on the back stack.
+     *
+     * @param res A string resource containing the title.
+     */
+    public abstract FragmentTransaction setBreadCrumbTitle(@StringRes int res);
+
+    /**
+     * Like {@link #setBreadCrumbTitle(int)} but taking a raw string; this
+     * method is <em>not</em> recommended, as the string can not be changed
+     * later if the locale changes.
+     */
+    public abstract FragmentTransaction setBreadCrumbTitle(CharSequence text);
+
+    /**
+     * Set the short title to show as a bread crumb when this transaction
+     * is on the back stack.
+     *
+     * @param res A string resource containing the title.
+     */
+    public abstract FragmentTransaction setBreadCrumbShortTitle(@StringRes int res);
+
+    /**
+     * Like {@link #setBreadCrumbShortTitle(int)} but taking a raw string; this
+     * method is <em>not</em> recommended, as the string can not be changed
+     * later if the locale changes.
+     */
+    public abstract FragmentTransaction setBreadCrumbShortTitle(CharSequence text);
+
+    /**
+     * Schedules a commit of this transaction.  The commit does
+     * not happen immediately; it will be scheduled as work on the main thread
+     * to be done the next time that thread is ready.
+     *
+     * <p class="note">A transaction can only be committed with this method
+     * prior to its containing activity saving its state.  If the commit is
+     * attempted after that point, an exception will be thrown.  This is
+     * because the state after the commit can be lost if the activity needs to
+     * be restored from its state.  See {@link #commitAllowingStateLoss()} for
+     * situations where it may be okay to lose the commit.</p>
+     * 
+     * @return Returns the identifier of this transaction's back stack entry,
+     * if {@link #addToBackStack(String)} had been called.  Otherwise, returns
+     * a negative number.
+     */
+    public abstract int commit();
+
+    /**
+     * Like {@link #commit} but allows the commit to be executed after an
+     * activity's state is saved.  This is dangerous because the commit can
+     * be lost if the activity needs to later be restored from its state, so
+     * this should only be used for cases where it is okay for the UI state
+     * to change unexpectedly on the user.
+     */
+    public abstract int commitAllowingStateLoss();
+
+    /**
+     * Commits this transaction synchronously. Any added fragments will be
+     * initialized and brought completely to the lifecycle state of their host
+     * and any removed fragments will be torn down accordingly before this
+     * call returns. Committing a transaction in this way allows fragments
+     * to be added as dedicated, encapsulated components that monitor the
+     * lifecycle state of their host while providing firmer ordering guarantees
+     * around when those fragments are fully initialized and ready. Fragments
+     * that manage views will have those views created and attached.
+     *
+     * <p>Calling <code>commitNow</code> is preferable to calling
+     * {@link #commit()} followed by {@link FragmentManager#executePendingTransactions()}
+     * as the latter will have the side effect of attempting to commit <em>all</em>
+     * currently pending transactions whether that is the desired behavior
+     * or not.</p>
+     *
+     * <p>Transactions committed in this way may not be added to the
+     * FragmentManager's back stack, as doing so would break other expected
+     * ordering guarantees for other asynchronously committed transactions.
+     * This method will throw {@link IllegalStateException} if the transaction
+     * previously requested to be added to the back stack with
+     * {@link #addToBackStack(String)}.</p>
+     *
+     * <p class="note">A transaction can only be committed with this method
+     * prior to its containing activity saving its state.  If the commit is
+     * attempted after that point, an exception will be thrown.  This is
+     * because the state after the commit can be lost if the activity needs to
+     * be restored from its state.  See {@link #commitAllowingStateLoss()} for
+     * situations where it may be okay to lose the commit.</p>
+     */
+    public abstract void commitNow();
+
+    /**
+     * Like {@link #commitNow} but allows the commit to be executed after an
+     * activity's state is saved.  This is dangerous because the commit can
+     * be lost if the activity needs to later be restored from its state, so
+     * this should only be used for cases where it is okay for the UI state
+     * to change unexpectedly on the user.
+     */
+    public abstract void commitNowAllowingStateLoss();
+}
diff --git a/fragment/java/android/support/v4/app/ListFragment.java b/fragment/java/android/support/v4/app/ListFragment.java
new file mode 100644
index 0000000..ead7b4a
--- /dev/null
+++ b/fragment/java/android/support/v4/app/ListFragment.java
@@ -0,0 +1,377 @@
+/*
+ * 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 android.support.v4.app;
+
+import android.content.Context;
+import android.os.Bundle;
+import android.os.Handler;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.animation.AnimationUtils;
+import android.widget.AdapterView;
+import android.widget.FrameLayout;
+import android.widget.LinearLayout;
+import android.widget.ListAdapter;
+import android.widget.ListView;
+import android.widget.ProgressBar;
+import android.widget.TextView;
+
+/**
+ * Static library support version of the framework's {@link android.app.ListFragment}.
+ * Used to write apps that run on platforms prior to Android 3.0.  When running
+ * on Android 3.0 or above, this implementation is still used; it does not try
+ * to switch to the framework's implementation.  See the framework SDK
+ * documentation for a class overview.
+ */
+public class ListFragment extends Fragment {
+    static final int INTERNAL_EMPTY_ID = 0x00ff0001;
+    static final int INTERNAL_PROGRESS_CONTAINER_ID = 0x00ff0002;
+    static final int INTERNAL_LIST_CONTAINER_ID = 0x00ff0003;
+    
+    final private Handler mHandler = new Handler();
+
+    final private Runnable mRequestFocus = new Runnable() {
+        @Override
+        public void run() {
+            mList.focusableViewAvailable(mList);
+        }
+    };
+    
+    final private AdapterView.OnItemClickListener mOnClickListener
+            = new AdapterView.OnItemClickListener() {
+        @Override
+        public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
+            onListItemClick((ListView)parent, v, position, id);
+        }
+    };
+
+    ListAdapter mAdapter;
+    ListView mList;
+    View mEmptyView;
+    TextView mStandardEmptyView;
+    View mProgressContainer;
+    View mListContainer;
+    CharSequence mEmptyText;
+    boolean mListShown;
+
+    public ListFragment() {
+    }
+
+    /**
+     * Provide default implementation to return a simple list view.  Subclasses
+     * can override to replace with their own layout.  If doing so, the
+     * returned view hierarchy <em>must</em> have a ListView whose id
+     * is {@link android.R.id#list android.R.id.list} and can optionally
+     * have a sibling view id {@link android.R.id#empty android.R.id.empty}
+     * that is to be shown when the list is empty.
+     * 
+     * <p>If you are overriding this method with your own custom content,
+     * consider including the standard layout {@link android.R.layout#list_content}
+     * in your layout file, so that you continue to retain all of the standard
+     * behavior of ListFragment.  In particular, this is currently the only
+     * way to have the built-in indeterminant progress state be shown.
+     */
+    @Override
+    public View onCreateView(LayoutInflater inflater, ViewGroup container,
+            Bundle savedInstanceState) {
+        final Context context = getContext();
+
+        FrameLayout root = new FrameLayout(context);
+
+        // ------------------------------------------------------------------
+
+        LinearLayout pframe = new LinearLayout(context);
+        pframe.setId(INTERNAL_PROGRESS_CONTAINER_ID);
+        pframe.setOrientation(LinearLayout.VERTICAL);
+        pframe.setVisibility(View.GONE);
+        pframe.setGravity(Gravity.CENTER);
+
+        ProgressBar progress = new ProgressBar(context, null,
+                android.R.attr.progressBarStyleLarge);
+        pframe.addView(progress, new FrameLayout.LayoutParams(
+                ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
+
+        root.addView(pframe, new FrameLayout.LayoutParams(
+                ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT));
+
+        // ------------------------------------------------------------------
+
+        FrameLayout lframe = new FrameLayout(context);
+        lframe.setId(INTERNAL_LIST_CONTAINER_ID);
+        
+        TextView tv = new TextView(context);
+        tv.setId(INTERNAL_EMPTY_ID);
+        tv.setGravity(Gravity.CENTER);
+        lframe.addView(tv, new FrameLayout.LayoutParams(
+                ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT));
+        
+        ListView lv = new ListView(context);
+        lv.setId(android.R.id.list);
+        lv.setDrawSelectorOnTop(false);
+        lframe.addView(lv, new FrameLayout.LayoutParams(
+                ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT));
+
+        root.addView(lframe, new FrameLayout.LayoutParams(
+                ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT));
+        
+        // ------------------------------------------------------------------
+
+        root.setLayoutParams(new FrameLayout.LayoutParams(
+                ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT));
+        
+        return root;
+    }
+
+    /**
+     * Attach to list view once the view hierarchy has been created.
+     */
+    @Override
+    public void onViewCreated(View view, Bundle savedInstanceState) {
+        super.onViewCreated(view, savedInstanceState);
+        ensureList();
+    }
+
+    /**
+     * Detach from list view.
+     */
+    @Override
+    public void onDestroyView() {
+        mHandler.removeCallbacks(mRequestFocus);
+        mList = null;
+        mListShown = false;
+        mEmptyView = mProgressContainer = mListContainer = null;
+        mStandardEmptyView = null;
+        super.onDestroyView();
+    }
+
+    /**
+     * This method will be called when an item in the list is selected.
+     * Subclasses should override. Subclasses can call
+     * getListView().getItemAtPosition(position) if they need to access the
+     * data associated with the selected item.
+     *
+     * @param l The ListView where the click happened
+     * @param v The view that was clicked within the ListView
+     * @param position The position of the view in the list
+     * @param id The row id of the item that was clicked
+     */
+    public void onListItemClick(ListView l, View v, int position, long id) {
+    }
+
+    /**
+     * Provide the cursor for the list view.
+     */
+    public void setListAdapter(ListAdapter adapter) {
+        boolean hadAdapter = mAdapter != null;
+        mAdapter = adapter;
+        if (mList != null) {
+            mList.setAdapter(adapter);
+            if (!mListShown && !hadAdapter) {
+                // The list was hidden, and previously didn't have an
+                // adapter.  It is now time to show it.
+                setListShown(true, getView().getWindowToken() != null);
+            }
+        }
+    }
+
+    /**
+     * Set the currently selected list item to the specified
+     * position with the adapter's data
+     *
+     * @param position
+     */
+    public void setSelection(int position) {
+        ensureList();
+        mList.setSelection(position);
+    }
+
+    /**
+     * Get the position of the currently selected list item.
+     */
+    public int getSelectedItemPosition() {
+        ensureList();
+        return mList.getSelectedItemPosition();
+    }
+
+    /**
+     * Get the cursor row ID of the currently selected list item.
+     */
+    public long getSelectedItemId() {
+        ensureList();
+        return mList.getSelectedItemId();
+    }
+
+    /**
+     * Get the fragment's list view widget.
+     */
+    public ListView getListView() {
+        ensureList();
+        return mList;
+    }
+
+    /**
+     * The default content for a ListFragment has a TextView that can
+     * be shown when the list is empty.  If you would like to have it
+     * shown, call this method to supply the text it should use.
+     */
+    public void setEmptyText(CharSequence text) {
+        ensureList();
+        if (mStandardEmptyView == null) {
+            throw new IllegalStateException("Can't be used with a custom content view");
+        }
+        mStandardEmptyView.setText(text);
+        if (mEmptyText == null) {
+            mList.setEmptyView(mStandardEmptyView);
+        }
+        mEmptyText = text;
+    }
+    
+    /**
+     * Control whether the list is being displayed.  You can make it not
+     * displayed if you are waiting for the initial data to show in it.  During
+     * this time an indeterminant progress indicator will be shown instead.
+     * 
+     * <p>Applications do not normally need to use this themselves.  The default
+     * behavior of ListFragment is to start with the list not being shown, only
+     * showing it once an adapter is given with {@link #setListAdapter(ListAdapter)}.
+     * If the list at that point had not been shown, when it does get shown
+     * it will be do without the user ever seeing the hidden state.
+     * 
+     * @param shown If true, the list view is shown; if false, the progress
+     * indicator.  The initial value is true.
+     */
+    public void setListShown(boolean shown) {
+        setListShown(shown, true);
+    }
+    
+    /**
+     * Like {@link #setListShown(boolean)}, but no animation is used when
+     * transitioning from the previous state.
+     */
+    public void setListShownNoAnimation(boolean shown) {
+        setListShown(shown, false);
+    }
+    
+    /**
+     * Control whether the list is being displayed.  You can make it not
+     * displayed if you are waiting for the initial data to show in it.  During
+     * this time an indeterminant progress indicator will be shown instead.
+     * 
+     * @param shown If true, the list view is shown; if false, the progress
+     * indicator.  The initial value is true.
+     * @param animate If true, an animation will be used to transition to the
+     * new state.
+     */
+    private void setListShown(boolean shown, boolean animate) {
+        ensureList();
+        if (mProgressContainer == null) {
+            throw new IllegalStateException("Can't be used with a custom content view");
+        }
+        if (mListShown == shown) {
+            return;
+        }
+        mListShown = shown;
+        if (shown) {
+            if (animate) {
+                mProgressContainer.startAnimation(AnimationUtils.loadAnimation(
+                        getContext(), android.R.anim.fade_out));
+                mListContainer.startAnimation(AnimationUtils.loadAnimation(
+                        getContext(), android.R.anim.fade_in));
+            } else {
+                mProgressContainer.clearAnimation();
+                mListContainer.clearAnimation();
+            }
+            mProgressContainer.setVisibility(View.GONE);
+            mListContainer.setVisibility(View.VISIBLE);
+        } else {
+            if (animate) {
+                mProgressContainer.startAnimation(AnimationUtils.loadAnimation(
+                        getContext(), android.R.anim.fade_in));
+                mListContainer.startAnimation(AnimationUtils.loadAnimation(
+                        getContext(), android.R.anim.fade_out));
+            } else {
+                mProgressContainer.clearAnimation();
+                mListContainer.clearAnimation();
+            }
+            mProgressContainer.setVisibility(View.VISIBLE);
+            mListContainer.setVisibility(View.GONE);
+        }
+    }
+    
+    /**
+     * Get the ListAdapter associated with this fragment's ListView.
+     */
+    public ListAdapter getListAdapter() {
+        return mAdapter;
+    }
+
+    private void ensureList() {
+        if (mList != null) {
+            return;
+        }
+        View root = getView();
+        if (root == null) {
+            throw new IllegalStateException("Content view not yet created");
+        }
+        if (root instanceof ListView) {
+            mList = (ListView)root;
+        } else {
+            mStandardEmptyView = (TextView)root.findViewById(INTERNAL_EMPTY_ID);
+            if (mStandardEmptyView == null) {
+                mEmptyView = root.findViewById(android.R.id.empty);
+            } else {
+                mStandardEmptyView.setVisibility(View.GONE);
+            }
+            mProgressContainer = root.findViewById(INTERNAL_PROGRESS_CONTAINER_ID);
+            mListContainer = root.findViewById(INTERNAL_LIST_CONTAINER_ID);
+            View rawListView = root.findViewById(android.R.id.list);
+            if (!(rawListView instanceof ListView)) {
+                if (rawListView == null) {
+                    throw new RuntimeException(
+                            "Your content must have a ListView whose id attribute is " +
+                            "'android.R.id.list'");
+                }
+                throw new RuntimeException(
+                        "Content has view with id attribute 'android.R.id.list' "
+                        + "that is not a ListView class");
+            }
+            mList = (ListView)rawListView;
+            if (mEmptyView != null) {
+                mList.setEmptyView(mEmptyView);
+            } else if (mEmptyText != null) {
+                mStandardEmptyView.setText(mEmptyText);
+                mList.setEmptyView(mStandardEmptyView);
+            }
+        }
+        mListShown = true;
+        mList.setOnItemClickListener(mOnClickListener);
+        if (mAdapter != null) {
+            ListAdapter adapter = mAdapter;
+            mAdapter = null;
+            setListAdapter(adapter);
+        } else {
+            // We are starting without an adapter, so assume we won't
+            // have our data right away and start with the progress indicator.
+            if (mProgressContainer != null) {
+                setListShown(false, false);
+            }
+        }
+        mHandler.post(mRequestFocus);
+    }
+}
diff --git a/fragment/java/android/support/v4/app/LoaderManager.java b/fragment/java/android/support/v4/app/LoaderManager.java
new file mode 100644
index 0000000..634a6bc
--- /dev/null
+++ b/fragment/java/android/support/v4/app/LoaderManager.java
@@ -0,0 +1,892 @@
+/*
+ * 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 android.support.v4.app;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.support.v4.content.Loader;
+import android.support.v4.util.DebugUtils;
+import android.support.v4.util.SparseArrayCompat;
+import android.util.Log;
+
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
+import java.lang.reflect.Modifier;
+
+/**
+ * Static library support version of the framework's {@link android.app.LoaderManager}.
+ * Used to write apps that run on platforms prior to Android 3.0.  When running
+ * on Android 3.0 or above, this implementation is still used; it does not try
+ * to switch to the framework's implementation.  See the framework SDK
+ * documentation for a class overview.
+ * 
+ * <p>Your activity must derive from {@link FragmentActivity} to use this.
+ */
+public abstract class LoaderManager {
+    /**
+     * Callback interface for a client to interact with the manager.
+     */
+    public interface LoaderCallbacks<D> {
+        /**
+         * Instantiate and return a new Loader for the given ID.
+         *
+         * @param id The ID whose loader is to be created.
+         * @param args Any arguments supplied by the caller.
+         * @return Return a new Loader instance that is ready to start loading.
+         */
+        public Loader<D> onCreateLoader(int id, Bundle args);
+
+        /**
+         * Called when a previously created loader has finished its load.  Note
+         * that normally an application is <em>not</em> allowed to commit fragment
+         * transactions while in this call, since it can happen after an
+         * activity's state is saved.  See {@link FragmentManager#beginTransaction()
+         * FragmentManager.openTransaction()} for further discussion on this.
+         * 
+         * <p>This function is guaranteed to be called prior to the release of
+         * the last data that was supplied for this Loader.  At this point
+         * you should remove all use of the old data (since it will be released
+         * soon), but should not do your own release of the data since its Loader
+         * owns it and will take care of that.  The Loader will take care of
+         * management of its data so you don't have to.  In particular:
+         *
+         * <ul>
+         * <li> <p>The Loader will monitor for changes to the data, and report
+         * them to you through new calls here.  You should not monitor the
+         * data yourself.  For example, if the data is a {@link android.database.Cursor}
+         * and you place it in a {@link android.widget.CursorAdapter}, use
+         * the {@link android.widget.CursorAdapter#CursorAdapter(android.content.Context,
+         * android.database.Cursor, int)} constructor <em>without</em> passing
+         * in either {@link android.widget.CursorAdapter#FLAG_AUTO_REQUERY}
+         * or {@link android.widget.CursorAdapter#FLAG_REGISTER_CONTENT_OBSERVER}
+         * (that is, use 0 for the flags argument).  This prevents the CursorAdapter
+         * from doing its own observing of the Cursor, which is not needed since
+         * when a change happens you will get a new Cursor throw another call
+         * here.
+         * <li> The Loader will release the data once it knows the application
+         * is no longer using it.  For example, if the data is
+         * a {@link android.database.Cursor} from a {@link android.content.CursorLoader},
+         * you should not call close() on it yourself.  If the Cursor is being placed in a
+         * {@link android.widget.CursorAdapter}, you should use the
+         * {@link android.widget.CursorAdapter#swapCursor(android.database.Cursor)}
+         * method so that the old Cursor is not closed.
+         * </ul>
+         *
+         * @param loader The Loader that has finished.
+         * @param data The data generated by the Loader.
+         */
+        public void onLoadFinished(Loader<D> loader, D data);
+
+        /**
+         * Called when a previously created loader is being reset, and thus
+         * making its data unavailable.  The application should at this point
+         * remove any references it has to the Loader's data.
+         *
+         * @param loader The Loader that is being reset.
+         */
+        public void onLoaderReset(Loader<D> loader);
+    }
+    
+    /**
+     * Ensures a loader is initialized and active.  If the loader doesn't
+     * already exist, one is created and (if the activity/fragment is currently
+     * started) starts the loader.  Otherwise the last created
+     * loader is re-used.
+     *
+     * <p>In either case, the given callback is associated with the loader, and
+     * will be called as the loader state changes.  If at the point of call
+     * the caller is in its started state, and the requested loader
+     * already exists and has generated its data, then
+     * callback {@link LoaderCallbacks#onLoadFinished} will
+     * be called immediately (inside of this function), so you must be prepared
+     * for this to happen.
+     *
+     * @param id A unique identifier for this loader.  Can be whatever you want.
+     * Identifiers are scoped to a particular LoaderManager instance.
+     * @param args Optional arguments to supply to the loader at construction.
+     * If a loader already exists (a new one does not need to be created), this
+     * parameter will be ignored and the last arguments continue to be used.
+     * @param callback Interface the LoaderManager will call to report about
+     * changes in the state of the loader.  Required.
+     */
+    public abstract <D> Loader<D> initLoader(int id, Bundle args,
+            LoaderManager.LoaderCallbacks<D> callback);
+
+    /**
+     * Starts a new or restarts an existing {@link android.content.Loader} in
+     * this manager, registers the callbacks to it,
+     * and (if the activity/fragment is currently started) starts loading it.
+     * If a loader with the same id has previously been
+     * started it will automatically be destroyed when the new loader completes
+     * its work. The callback will be delivered before the old loader
+     * is destroyed.
+     *
+     * @param id A unique identifier for this loader.  Can be whatever you want.
+     * Identifiers are scoped to a particular LoaderManager instance.
+     * @param args Optional arguments to supply to the loader at construction.
+     * @param callback Interface the LoaderManager will call to report about
+     * changes in the state of the loader.  Required.
+     */
+    public abstract <D> Loader<D> restartLoader(int id, Bundle args,
+            LoaderManager.LoaderCallbacks<D> callback);
+
+    /**
+     * Stops and removes the loader with the given ID.  If this loader
+     * had previously reported data to the client through
+     * {@link LoaderCallbacks#onLoadFinished(Loader, Object)}, a call
+     * will be made to {@link LoaderCallbacks#onLoaderReset(Loader)}.
+     */
+    public abstract void destroyLoader(int id);
+
+    /**
+     * Return the Loader with the given id or null if no matching Loader
+     * is found.
+     */
+    public abstract <D> Loader<D> getLoader(int id);
+
+    /**
+     * Print the LoaderManager's state into the given stream.
+     *
+     * @param prefix Text to print at the front of each line.
+     * @param fd The raw file descriptor that the dump is being sent to.
+     * @param writer A PrintWriter to which the dump is to be set.
+     * @param args Additional arguments to the dump request.
+     */
+    public abstract void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args);
+
+    /**
+     * Control whether the framework's internal loader manager debugging
+     * logs are turned on.  If enabled, you will see output in logcat as
+     * the framework performs loader operations.
+     */
+    public static void enableDebugLogging(boolean enabled) {
+        LoaderManagerImpl.DEBUG = enabled;
+    }
+
+    /**
+     * Returns true if any loaders managed are currently running and have not
+     * returned data to the application yet.
+     */
+    public boolean hasRunningLoaders() { return false; }
+}
+
+/**
+ * @hide
+ */
+class LoaderManagerImpl extends LoaderManager {
+    static final String TAG = "LoaderManager";
+    static boolean DEBUG = false;
+
+    // These are the currently active loaders.  A loader is here
+    // from the time its load is started until it has been explicitly
+    // stopped or restarted by the application.
+    final SparseArrayCompat<LoaderInfo> mLoaders = new SparseArrayCompat<LoaderInfo>();
+
+    // These are previously run loaders.  This list is maintained internally
+    // to avoid destroying a loader while an application is still using it.
+    // It allows an application to restart a loader, but continue using its
+    // previously run loader until the new loader's data is available.
+    final SparseArrayCompat<LoaderInfo> mInactiveLoaders = new SparseArrayCompat<LoaderInfo>();
+
+    final String mWho;
+
+    boolean mStarted;
+    boolean mRetaining;
+    boolean mRetainingStarted;
+    
+    boolean mCreatingLoader;
+    private FragmentHostCallback mHost;
+
+    final class LoaderInfo implements Loader.OnLoadCompleteListener<Object>,
+            Loader.OnLoadCanceledListener<Object> {
+        final int mId;
+        final Bundle mArgs;
+        LoaderManager.LoaderCallbacks<Object> mCallbacks;
+        Loader<Object> mLoader;
+        boolean mHaveData;
+        boolean mDeliveredData;
+        Object mData;
+        @SuppressWarnings("hiding")
+        boolean mStarted;
+        @SuppressWarnings("hiding")
+        boolean mRetaining;
+        @SuppressWarnings("hiding")
+        boolean mRetainingStarted;
+        boolean mReportNextStart;
+        boolean mDestroyed;
+        boolean mListenerRegistered;
+
+        LoaderInfo mPendingLoader;
+        
+        public LoaderInfo(int id, Bundle args, LoaderManager.LoaderCallbacks<Object> callbacks) {
+            mId = id;
+            mArgs = args;
+            mCallbacks = callbacks;
+        }
+        
+        void start() {
+            if (mRetaining && mRetainingStarted) {
+                // Our owner is started, but we were being retained from a
+                // previous instance in the started state...  so there is really
+                // nothing to do here, since the loaders are still started.
+                mStarted = true;
+                return;
+            }
+
+            if (mStarted) {
+                // If loader already started, don't restart.
+                return;
+            }
+
+            mStarted = true;
+            
+            if (DEBUG) Log.v(TAG, "  Starting: " + this);
+            if (mLoader == null && mCallbacks != null) {
+               mLoader = mCallbacks.onCreateLoader(mId, mArgs);
+            }
+            if (mLoader != null) {
+                if (mLoader.getClass().isMemberClass()
+                        && !Modifier.isStatic(mLoader.getClass().getModifiers())) {
+                    throw new IllegalArgumentException(
+                            "Object returned from onCreateLoader must not be a non-static inner member class: "
+                            + mLoader);
+                }
+                if (!mListenerRegistered) {
+                    mLoader.registerListener(mId, this);
+                    mLoader.registerOnLoadCanceledListener(this);
+                    mListenerRegistered = true;
+                }
+                mLoader.startLoading();
+            }
+        }
+        
+        void retain() {
+            if (DEBUG) Log.v(TAG, "  Retaining: " + this);
+            mRetaining = true;
+            mRetainingStarted = mStarted;
+            mStarted = false;
+            mCallbacks = null;
+        }
+        
+        void finishRetain() {
+            if (mRetaining) {
+                if (DEBUG) Log.v(TAG, "  Finished Retaining: " + this);
+                mRetaining = false;
+                if (mStarted != mRetainingStarted) {
+                    if (!mStarted) {
+                        // This loader was retained in a started state, but
+                        // at the end of retaining everything our owner is
+                        // no longer started...  so make it stop.
+                        stop();
+                    }
+                }
+            }
+
+            if (mStarted && mHaveData && !mReportNextStart) {
+                // This loader has retained its data, either completely across
+                // a configuration change or just whatever the last data set
+                // was after being restarted from a stop, and now at the point of
+                // finishing the retain we find we remain started, have
+                // our data, and the owner has a new callback...  so
+                // let's deliver the data now.
+                callOnLoadFinished(mLoader, mData);
+            }
+        }
+        
+        void reportStart() {
+            if (mStarted) {
+                if (mReportNextStart) {
+                    mReportNextStart = false;
+                    if (mHaveData && !mRetaining) {
+                        callOnLoadFinished(mLoader, mData);
+                    }
+                }
+            }
+        }
+
+        void stop() {
+            if (DEBUG) Log.v(TAG, "  Stopping: " + this);
+            mStarted = false;
+            if (!mRetaining) {
+                if (mLoader != null && mListenerRegistered) {
+                    // Let the loader know we're done with it
+                    mListenerRegistered = false;
+                    mLoader.unregisterListener(this);
+                    mLoader.unregisterOnLoadCanceledListener(this);
+                    mLoader.stopLoading();
+                }
+            }
+        }
+
+        boolean cancel() {
+            if (DEBUG) Log.v(TAG, "  Canceling: " + this);
+            if (mStarted && mLoader != null && mListenerRegistered) {
+                final boolean cancelLoadResult = mLoader.cancelLoad();
+                if (!cancelLoadResult) {
+                    onLoadCanceled(mLoader);
+                }
+                return cancelLoadResult;
+            }
+            return false;
+        }
+
+        void destroy() {
+            if (DEBUG) Log.v(TAG, "  Destroying: " + this);
+            mDestroyed = true;
+            boolean needReset = mDeliveredData;
+            mDeliveredData = false;
+            if (mCallbacks != null && mLoader != null && mHaveData && needReset) {
+                if (DEBUG) Log.v(TAG, "  Resetting: " + this);
+                String lastBecause = null;
+                if (mHost != null) {
+                    lastBecause = mHost.mFragmentManager.mNoTransactionsBecause;
+                    mHost.mFragmentManager.mNoTransactionsBecause = "onLoaderReset";
+                }
+                try {
+                    mCallbacks.onLoaderReset(mLoader);
+                } finally {
+                    if (mHost != null) {
+                        mHost.mFragmentManager.mNoTransactionsBecause = lastBecause;
+                    }
+                }
+            }
+            mCallbacks = null;
+            mData = null;
+            mHaveData = false;
+            if (mLoader != null) {
+                if (mListenerRegistered) {
+                    mListenerRegistered = false;
+                    mLoader.unregisterListener(this);
+                    mLoader.unregisterOnLoadCanceledListener(this);
+                }
+                mLoader.reset();
+            }
+            if (mPendingLoader != null) {
+                mPendingLoader.destroy();
+            }
+        }
+
+        @Override
+        public void onLoadCanceled(Loader<Object> loader) {
+            if (DEBUG) Log.v(TAG, "onLoadCanceled: " + this);
+
+            if (mDestroyed) {
+                if (DEBUG) Log.v(TAG, "  Ignoring load canceled -- destroyed");
+                return;
+            }
+
+            if (mLoaders.get(mId) != this) {
+                // This cancellation message is not coming from the current active loader.
+                // We don't care about it.
+                if (DEBUG) Log.v(TAG, "  Ignoring load canceled -- not active");
+                return;
+            }
+
+            LoaderInfo pending = mPendingLoader;
+            if (pending != null) {
+                // There is a new request pending and we were just
+                // waiting for the old one to cancel or complete before starting
+                // it.  So now it is time, switch over to the new loader.
+                if (DEBUG) Log.v(TAG, "  Switching to pending loader: " + pending);
+                mPendingLoader = null;
+                mLoaders.put(mId, null);
+                destroy();
+                installLoader(pending);
+            }
+        }
+
+        @Override
+        public void onLoadComplete(Loader<Object> loader, Object data) {
+            if (DEBUG) Log.v(TAG, "onLoadComplete: " + this);
+            
+            if (mDestroyed) {
+                if (DEBUG) Log.v(TAG, "  Ignoring load complete -- destroyed");
+                return;
+            }
+
+            if (mLoaders.get(mId) != this) {
+                // This data is not coming from the current active loader.
+                // We don't care about it.
+                if (DEBUG) Log.v(TAG, "  Ignoring load complete -- not active");
+                return;
+            }
+            
+            LoaderInfo pending = mPendingLoader;
+            if (pending != null) {
+                // There is a new request pending and we were just
+                // waiting for the old one to complete before starting
+                // it.  So now it is time, switch over to the new loader.
+                if (DEBUG) Log.v(TAG, "  Switching to pending loader: " + pending);
+                mPendingLoader = null;
+                mLoaders.put(mId, null);
+                destroy();
+                installLoader(pending);
+                return;
+            }
+            
+            // Notify of the new data so the app can switch out the old data before
+            // we try to destroy it.
+            if (mData != data || !mHaveData) {
+                mData = data;
+                mHaveData = true;
+                if (mStarted) {
+                    callOnLoadFinished(loader, data);
+                }
+            }
+
+            //if (DEBUG) Log.v(TAG, "  onLoadFinished returned: " + this);
+
+            // We have now given the application the new loader with its
+            // loaded data, so it should have stopped using the previous
+            // loader.  If there is a previous loader on the inactive list,
+            // clean it up.
+            LoaderInfo info = mInactiveLoaders.get(mId);
+            if (info != null && info != this) {
+                info.mDeliveredData = false;
+                info.destroy();
+                mInactiveLoaders.remove(mId);
+            }
+
+            if (mHost != null && !hasRunningLoaders()) {
+                mHost.mFragmentManager.startPendingDeferredFragments();
+            }
+        }
+
+        void callOnLoadFinished(Loader<Object> loader, Object data) {
+            if (mCallbacks != null) {
+                String lastBecause = null;
+                if (mHost != null) {
+                    lastBecause = mHost.mFragmentManager.mNoTransactionsBecause;
+                    mHost.mFragmentManager.mNoTransactionsBecause = "onLoadFinished";
+                }
+                try {
+                    if (DEBUG) Log.v(TAG, "  onLoadFinished in " + loader + ": "
+                            + loader.dataToString(data));
+                    mCallbacks.onLoadFinished(loader, data);
+                } finally {
+                    if (mHost != null) {
+                        mHost.mFragmentManager.mNoTransactionsBecause = lastBecause;
+                    }
+                }
+                mDeliveredData = true;
+            }
+        }
+        
+        @Override
+        public String toString() {
+            StringBuilder sb = new StringBuilder(64);
+            sb.append("LoaderInfo{");
+            sb.append(Integer.toHexString(System.identityHashCode(this)));
+            sb.append(" #");
+            sb.append(mId);
+            sb.append(" : ");
+            DebugUtils.buildShortClassTag(mLoader, sb);
+            sb.append("}}");
+            return sb.toString();
+        }
+
+        public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) {
+            writer.print(prefix); writer.print("mId="); writer.print(mId);
+                    writer.print(" mArgs="); writer.println(mArgs);
+            writer.print(prefix); writer.print("mCallbacks="); writer.println(mCallbacks);
+            writer.print(prefix); writer.print("mLoader="); writer.println(mLoader);
+            if (mLoader != null) {
+                mLoader.dump(prefix + "  ", fd, writer, args);
+            }
+            if (mHaveData || mDeliveredData) {
+                writer.print(prefix); writer.print("mHaveData="); writer.print(mHaveData);
+                        writer.print("  mDeliveredData="); writer.println(mDeliveredData);
+                writer.print(prefix); writer.print("mData="); writer.println(mData);
+            }
+            writer.print(prefix); writer.print("mStarted="); writer.print(mStarted);
+                    writer.print(" mReportNextStart="); writer.print(mReportNextStart);
+                    writer.print(" mDestroyed="); writer.println(mDestroyed);
+            writer.print(prefix); writer.print("mRetaining="); writer.print(mRetaining);
+                    writer.print(" mRetainingStarted="); writer.print(mRetainingStarted);
+                    writer.print(" mListenerRegistered="); writer.println(mListenerRegistered);
+            if (mPendingLoader != null) {
+                writer.print(prefix); writer.println("Pending Loader ");
+                        writer.print(mPendingLoader); writer.println(":");
+                mPendingLoader.dump(prefix + "  ", fd, writer, args);
+            }
+        }
+    }
+    
+    LoaderManagerImpl(String who, FragmentHostCallback host, boolean started) {
+        mWho = who;
+        mHost = host;
+        mStarted = started;
+    }
+    
+    void updateHostController(FragmentHostCallback host) {
+        mHost = host;
+    }
+    
+    private LoaderInfo createLoader(int id, Bundle args,
+            LoaderManager.LoaderCallbacks<Object> callback) {
+        LoaderInfo info = new LoaderInfo(id, args,  callback);
+        Loader<Object> loader = callback.onCreateLoader(id, args);
+        info.mLoader = loader;
+        return info;
+    }
+    
+    private LoaderInfo createAndInstallLoader(int id, Bundle args,
+            LoaderManager.LoaderCallbacks<Object> callback) {
+        try {
+            mCreatingLoader = true;
+            LoaderInfo info = createLoader(id, args, callback);
+            installLoader(info);
+            return info;
+        } finally {
+            mCreatingLoader = false;
+        }
+    }
+    
+    void installLoader(LoaderInfo info) {
+        mLoaders.put(info.mId, info);
+        if (mStarted) {
+            // The activity will start all existing loaders in it's onStart(),
+            // so only start them here if we're past that point of the activity's
+            // life cycle
+            info.start();
+        }
+    }
+    
+    /**
+     * Call to initialize a particular ID with a Loader.  If this ID already
+     * has a Loader associated with it, it is left unchanged and any previous
+     * callbacks replaced with the newly provided ones.  If there is not currently
+     * a Loader for the ID, a new one is created and started.
+     * 
+     * <p>This function should generally be used when a component is initializing,
+     * to ensure that a Loader it relies on is created.  This allows it to re-use
+     * an existing Loader's data if there already is one, so that for example
+     * when an {@link Activity} is re-created after a configuration change it
+     * does not need to re-create its loaders.
+     * 
+     * <p>Note that in the case where an existing Loader is re-used, the
+     * <var>args</var> given here <em>will be ignored</em> because you will
+     * continue using the previous Loader.
+     * 
+     * @param id A unique (to this LoaderManager instance) identifier under
+     * which to manage the new Loader.
+     * @param args Optional arguments that will be propagated to
+     * {@link android.support.v4.app.LoaderManager.LoaderCallbacks#onCreateLoader(int, Bundle) LoaderCallbacks.onCreateLoader()}.
+     * @param callback Interface implementing management of this Loader.  Required.
+     * Its onCreateLoader() method will be called while inside of the function to
+     * instantiate the Loader object.
+     */
+    @Override
+    @SuppressWarnings("unchecked")
+    public <D> Loader<D> initLoader(int id, Bundle args, LoaderManager.LoaderCallbacks<D> callback) {
+        if (mCreatingLoader) {
+            throw new IllegalStateException("Called while creating a loader");
+        }
+        
+        LoaderInfo info = mLoaders.get(id);
+        
+        if (DEBUG) Log.v(TAG, "initLoader in " + this + ": args=" + args);
+
+        if (info == null) {
+            // Loader doesn't already exist; create.
+            info = createAndInstallLoader(id, args,  (LoaderManager.LoaderCallbacks<Object>)callback);
+            if (DEBUG) Log.v(TAG, "  Created new loader " + info);
+        } else {
+            if (DEBUG) Log.v(TAG, "  Re-using existing loader " + info);
+            info.mCallbacks = (LoaderManager.LoaderCallbacks<Object>)callback;
+        }
+        
+        if (info.mHaveData && mStarted) {
+            // If the loader has already generated its data, report it now.
+            info.callOnLoadFinished(info.mLoader, info.mData);
+        }
+        
+        return (Loader<D>)info.mLoader;
+    }
+    
+    /**
+     * Call to re-create the Loader associated with a particular ID.  If there
+     * is currently a Loader associated with this ID, it will be
+     * canceled/stopped/destroyed as appropriate.  A new Loader with the given
+     * arguments will be created and its data delivered to you once available.
+     * 
+     * <p>This function does some throttling of Loaders.  If too many Loaders
+     * have been created for the given ID but not yet generated their data,
+     * new calls to this function will create and return a new Loader but not
+     * actually start it until some previous loaders have completed.
+     * 
+     * <p>After calling this function, any previous Loaders associated with
+     * this ID will be considered invalid, and you will receive no further
+     * data updates from them.
+     * 
+     * @param id A unique (to this LoaderManager instance) identifier under
+     * which to manage the new Loader.
+     * @param args Optional arguments that will be propagated to
+     * {@link android.support.v4.app.LoaderManager.LoaderCallbacks#onCreateLoader(int, Bundle) LoaderCallbacks.onCreateLoader()}.
+     * @param callback Interface implementing management of this Loader.  Required.
+     * Its onCreateLoader() method will be called while inside of the function to
+     * instantiate the Loader object.
+     */
+    @Override
+    @SuppressWarnings("unchecked")
+    public <D> Loader<D> restartLoader(int id, Bundle args, LoaderManager.LoaderCallbacks<D> callback) {
+        if (mCreatingLoader) {
+            throw new IllegalStateException("Called while creating a loader");
+        }
+        
+        LoaderInfo info = mLoaders.get(id);
+        if (DEBUG) Log.v(TAG, "restartLoader in " + this + ": args=" + args);
+        if (info != null) {
+            LoaderInfo inactive = mInactiveLoaders.get(id);
+            if (inactive != null) {
+                if (info.mHaveData) {
+                    // This loader now has data...  we are probably being
+                    // called from within onLoadComplete, where we haven't
+                    // yet destroyed the last inactive loader.  So just do
+                    // that now.
+                    if (DEBUG) Log.v(TAG, "  Removing last inactive loader: " + info);
+                    inactive.mDeliveredData = false;
+                    inactive.destroy();
+                    info.mLoader.abandon();
+                    mInactiveLoaders.put(id, info);
+                } else {
+                    // We already have an inactive loader for this ID that we are
+                    // waiting for! Try to cancel; if this returns true then the task is still
+                    // running and we have more work to do.
+                    if (!info.cancel()) {
+                        // The current Loader has not been started or was successfully canceled,
+                        // we thus have no reason to keep it around. Remove it and a new
+                        // LoaderInfo will be created below.
+                        if (DEBUG) Log.v(TAG, "  Current loader is stopped; replacing");
+                        mLoaders.put(id, null);
+                        info.destroy();
+                    } else {
+                        // Now we have three active loaders... we'll queue
+                        // up this request to be processed once one of the other loaders
+                        // finishes.
+                        if (DEBUG) Log.v(TAG,
+                                "  Current loader is running; configuring pending loader");
+                        if (info.mPendingLoader != null) {
+                            if (DEBUG) Log.v(TAG, "  Removing pending loader: " + info.mPendingLoader);
+                            info.mPendingLoader.destroy();
+                            info.mPendingLoader = null;
+                        }
+                        if (DEBUG) Log.v(TAG, "  Enqueuing as new pending loader");
+                        info.mPendingLoader = createLoader(id, args, 
+                                (LoaderManager.LoaderCallbacks<Object>)callback);
+                        return (Loader<D>)info.mPendingLoader.mLoader;
+                    }
+                }
+            } else {
+                // Keep track of the previous instance of this loader so we can destroy
+                // it when the new one completes.
+                if (DEBUG) Log.v(TAG, "  Making last loader inactive: " + info);
+                info.mLoader.abandon();
+                mInactiveLoaders.put(id, info);
+            }
+        }
+        
+        info = createAndInstallLoader(id, args,  (LoaderManager.LoaderCallbacks<Object>)callback);
+        return (Loader<D>)info.mLoader;
+    }
+    
+    /**
+     * Rip down, tear apart, shred to pieces a current Loader ID.  After returning
+     * from this function, any Loader objects associated with this ID are
+     * destroyed.  Any data associated with them is destroyed.  You better not
+     * be using it when you do this.
+     * @param id Identifier of the Loader to be destroyed.
+     */
+    @Override
+    public void destroyLoader(int id) {
+        if (mCreatingLoader) {
+            throw new IllegalStateException("Called while creating a loader");
+        }
+        
+        if (DEBUG) Log.v(TAG, "destroyLoader in " + this + " of " + id);
+        int idx = mLoaders.indexOfKey(id);
+        if (idx >= 0) {
+            LoaderInfo info = mLoaders.valueAt(idx);
+            mLoaders.removeAt(idx);
+            info.destroy();
+        }
+        idx = mInactiveLoaders.indexOfKey(id);
+        if (idx >= 0) {
+            LoaderInfo info = mInactiveLoaders.valueAt(idx);
+            mInactiveLoaders.removeAt(idx);
+            info.destroy();
+        }
+        if (mHost != null && !hasRunningLoaders()) {
+            mHost.mFragmentManager.startPendingDeferredFragments();
+        }
+    }
+
+    /**
+     * Return the most recent Loader object associated with the
+     * given ID.
+     */
+    @Override
+    @SuppressWarnings("unchecked")
+    public <D> Loader<D> getLoader(int id) {
+        if (mCreatingLoader) {
+            throw new IllegalStateException("Called while creating a loader");
+        }
+        
+        LoaderInfo loaderInfo = mLoaders.get(id);
+        if (loaderInfo != null) {
+            if (loaderInfo.mPendingLoader != null) {
+                return (Loader<D>)loaderInfo.mPendingLoader.mLoader;
+            }
+            return (Loader<D>)loaderInfo.mLoader;
+        }
+        return null;
+    }
+ 
+    void doStart() {
+        if (DEBUG) Log.v(TAG, "Starting in " + this);
+        if (mStarted) {
+            RuntimeException e = new RuntimeException("here");
+            e.fillInStackTrace();
+            Log.w(TAG, "Called doStart when already started: " + this, e);
+            return;
+        }
+        
+        mStarted = true;
+
+        // Call out to sub classes so they can start their loaders
+        // Let the existing loaders know that we want to be notified when a load is complete
+        for (int i = mLoaders.size()-1; i >= 0; i--) {
+            mLoaders.valueAt(i).start();
+        }
+    }
+    
+    void doStop() {
+        if (DEBUG) Log.v(TAG, "Stopping in " + this);
+        if (!mStarted) {
+            RuntimeException e = new RuntimeException("here");
+            e.fillInStackTrace();
+            Log.w(TAG, "Called doStop when not started: " + this, e);
+            return;
+        }
+
+        for (int i = mLoaders.size()-1; i >= 0; i--) {
+            mLoaders.valueAt(i).stop();
+        }
+        mStarted = false;
+    }
+    
+    void doRetain() {
+        if (DEBUG) Log.v(TAG, "Retaining in " + this);
+        if (!mStarted) {
+            RuntimeException e = new RuntimeException("here");
+            e.fillInStackTrace();
+            Log.w(TAG, "Called doRetain when not started: " + this, e);
+            return;
+        }
+
+        mRetaining = true;
+        mStarted = false;
+        for (int i = mLoaders.size()-1; i >= 0; i--) {
+            mLoaders.valueAt(i).retain();
+        }
+    }
+    
+    void finishRetain() {
+        if (mRetaining) {
+            if (DEBUG) Log.v(TAG, "Finished Retaining in " + this);
+
+            mRetaining = false;
+            for (int i = mLoaders.size()-1; i >= 0; i--) {
+                mLoaders.valueAt(i).finishRetain();
+            }
+        }
+    }
+    
+    void doReportNextStart() {
+        for (int i = mLoaders.size()-1; i >= 0; i--) {
+            mLoaders.valueAt(i).mReportNextStart = true;
+        }
+    }
+
+    void doReportStart() {
+        for (int i = mLoaders.size()-1; i >= 0; i--) {
+            mLoaders.valueAt(i).reportStart();
+        }
+    }
+
+    void doDestroy() {
+        if (!mRetaining) {
+            if (DEBUG) Log.v(TAG, "Destroying Active in " + this);
+            for (int i = mLoaders.size()-1; i >= 0; i--) {
+                mLoaders.valueAt(i).destroy();
+            }
+            mLoaders.clear();
+        }
+        
+        if (DEBUG) Log.v(TAG, "Destroying Inactive in " + this);
+        for (int i = mInactiveLoaders.size()-1; i >= 0; i--) {
+            mInactiveLoaders.valueAt(i).destroy();
+        }
+        mInactiveLoaders.clear();
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder(128);
+        sb.append("LoaderManager{");
+        sb.append(Integer.toHexString(System.identityHashCode(this)));
+        sb.append(" in ");
+        DebugUtils.buildShortClassTag(mHost, sb);
+        sb.append("}}");
+        return sb.toString();
+    }
+
+    @Override
+    public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) {
+        if (mLoaders.size() > 0) {
+            writer.print(prefix); writer.println("Active Loaders:");
+            String innerPrefix = prefix + "    ";
+            for (int i=0; i < mLoaders.size(); i++) {
+                LoaderInfo li = mLoaders.valueAt(i);
+                writer.print(prefix); writer.print("  #"); writer.print(mLoaders.keyAt(i));
+                        writer.print(": "); writer.println(li.toString());
+                li.dump(innerPrefix, fd, writer, args);
+            }
+        }
+        if (mInactiveLoaders.size() > 0) {
+            writer.print(prefix); writer.println("Inactive Loaders:");
+            String innerPrefix = prefix + "    ";
+            for (int i=0; i < mInactiveLoaders.size(); i++) {
+                LoaderInfo li = mInactiveLoaders.valueAt(i);
+                writer.print(prefix); writer.print("  #"); writer.print(mInactiveLoaders.keyAt(i));
+                        writer.print(": "); writer.println(li.toString());
+                li.dump(innerPrefix, fd, writer, args);
+            }
+        }
+    }
+
+    @Override
+    public boolean hasRunningLoaders() {
+        boolean loadersRunning = false;
+        final int count = mLoaders.size();
+        for (int i = 0; i < count; i++) {
+            final LoaderInfo li = mLoaders.valueAt(i);
+            loadersRunning |= li.mStarted && !li.mDeliveredData;
+        }
+        return loadersRunning;
+    }
+}
diff --git a/v4/java/android/support/v4/app/NoSaveStateFrameLayout.java b/fragment/java/android/support/v4/app/NoSaveStateFrameLayout.java
similarity index 100%
rename from v4/java/android/support/v4/app/NoSaveStateFrameLayout.java
rename to fragment/java/android/support/v4/app/NoSaveStateFrameLayout.java
diff --git a/v4/java/android/support/v4/app/SuperNotCalledException.java b/fragment/java/android/support/v4/app/SuperNotCalledException.java
similarity index 100%
rename from v4/java/android/support/v4/app/SuperNotCalledException.java
rename to fragment/java/android/support/v4/app/SuperNotCalledException.java
diff --git a/fragment/java/android/support/v4/app/package.html b/fragment/java/android/support/v4/app/package.html
new file mode 100755
index 0000000..02d1b79
--- /dev/null
+++ b/fragment/java/android/support/v4/app/package.html
@@ -0,0 +1,8 @@
+<body>
+
+Support android.app classes to assist with development of applications for
+android API level 4 or later.  The main features here are backwards-compatible
+versions of {@link android.support.v4.app.FragmentManager} and
+{@link android.support.v4.app.LoaderManager}.
+
+</body>
diff --git a/v4/jellybean/android/support/v4/app/BaseFragmentActivityJB.java b/fragment/jellybean/android/support/v4/app/BaseFragmentActivityJB.java
similarity index 100%
rename from v4/jellybean/android/support/v4/app/BaseFragmentActivityJB.java
rename to fragment/jellybean/android/support/v4/app/BaseFragmentActivityJB.java
diff --git a/fragment/tests/AndroidManifest.xml b/fragment/tests/AndroidManifest.xml
new file mode 100644
index 0000000..9cab8ca
--- /dev/null
+++ b/fragment/tests/AndroidManifest.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2015 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+          xmlns:tools="http://schemas.android.com/tools"
+          package="android.support.fragment.test">
+    <uses-sdk
+            android:minSdkVersion="9"
+            android:targetSdkVersion="23"
+            tools:overrideLibrary="android.support.test, android.app, android.support.test.rule,
+                      android.support.test.espresso, android.support.test.espresso.idling"/>
+
+    <uses-permission android:name="android.permission.VIBRATE"/>
+    <uses-permission android:name="android.permission.WAKE_LOCK"/>
+    <uses-permission android:name="android.permission.READ_CONTACTS"/>
+    <uses-permission android:name="android.permission.WRITE_CONTACTS"/>
+
+    <application
+            android:supportsRtl="true"
+            android:theme="@style/TestActivityTheme">
+        <uses-library android:name="android.test.runner" />
+        <activity android:name="android.support.v4.app.test.FragmentTestActivity"/>
+
+        <activity android:name="android.support.v4.app.test.EmptyFragmentTestActivity" />
+
+        <activity android:name="android.support.v4.app.test.FragmentResultActivity" />
+    </application>
+
+    <instrumentation android:name="android.test.InstrumentationTestRunner"
+                     android:targetPackage="android.support.fragment.test"
+                     />
+</manifest>
diff --git a/v17/tests/NO_DOCS b/fragment/tests/NO_DOCS
similarity index 100%
copy from v17/tests/NO_DOCS
copy to fragment/tests/NO_DOCS
diff --git a/v4/tests/java/android/support/v4/BaseInstrumentationTestCase.java b/fragment/tests/java/android/support/v4/BaseInstrumentationTestCase.java
similarity index 100%
copy from v4/tests/java/android/support/v4/BaseInstrumentationTestCase.java
copy to fragment/tests/java/android/support/v4/BaseInstrumentationTestCase.java
diff --git a/v4/tests/java/android/support/v4/BaseTestActivity.java b/fragment/tests/java/android/support/v4/BaseTestActivity.java
similarity index 100%
copy from v4/tests/java/android/support/v4/BaseTestActivity.java
copy to fragment/tests/java/android/support/v4/BaseTestActivity.java
diff --git a/v4/tests/java/android/support/v4/app/ChildFragmentStateTest.java b/fragment/tests/java/android/support/v4/app/ChildFragmentStateTest.java
similarity index 100%
rename from v4/tests/java/android/support/v4/app/ChildFragmentStateTest.java
rename to fragment/tests/java/android/support/v4/app/ChildFragmentStateTest.java
diff --git a/fragment/tests/java/android/support/v4/app/FragmentLifecycleTest.java b/fragment/tests/java/android/support/v4/app/FragmentLifecycleTest.java
new file mode 100644
index 0000000..73b04c6
--- /dev/null
+++ b/fragment/tests/java/android/support/v4/app/FragmentLifecycleTest.java
@@ -0,0 +1,706 @@
+/*
+ * Copyright (C) 2016 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 android.support.v4.app;
+
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.Parcelable;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.fragment.test.R;
+import android.support.test.annotation.UiThreadTest;
+import android.support.test.rule.ActivityTestRule;
+import android.support.test.runner.AndroidJUnit4;
+import android.support.v4.app.test.EmptyFragmentTestActivity;
+import android.test.suitebuilder.annotation.MediumTest;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.Window;
+
+import android.widget.TextView;
+import org.junit.Assert;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
+
+import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertFalse;
+import static junit.framework.Assert.assertNotNull;
+import static junit.framework.Assert.assertNotSame;
+import static junit.framework.Assert.assertNull;
+import static junit.framework.Assert.assertSame;
+import static junit.framework.Assert.assertTrue;
+import static org.junit.Assert.assertNotEquals;
+
+@RunWith(AndroidJUnit4.class)
+@MediumTest
+public class FragmentLifecycleTest {
+
+    @Rule
+    public ActivityTestRule<EmptyFragmentTestActivity> mActivityRule =
+            new ActivityTestRule<EmptyFragmentTestActivity>(EmptyFragmentTestActivity.class);
+
+    @Test
+    public void basicLifecycle() throws Throwable {
+        final FragmentManager fm = mActivityRule.getActivity().getSupportFragmentManager();
+        final StrictFragment strictFragment = new StrictFragment();
+
+        // Add fragment; StrictFragment will throw if it detects any violation
+        // in standard lifecycle method ordering or expected preconditions.
+        fm.beginTransaction().add(strictFragment, "EmptyHeadless").commit();
+        executePendingTransactions(fm);
+
+        assertTrue("fragment is not added", strictFragment.isAdded());
+        assertFalse("fragment is detached", strictFragment.isDetached());
+        assertTrue("fragment is not resumed", strictFragment.isResumed());
+
+        // Test removal as well; StrictFragment will throw here too.
+        fm.beginTransaction().remove(strictFragment).commit();
+        executePendingTransactions(fm);
+
+        assertFalse("fragment is added", strictFragment.isAdded());
+        assertFalse("fragment is resumed", strictFragment.isResumed());
+
+        // This one is perhaps counterintuitive; "detached" means specifically detached
+        // but still managed by a FragmentManager. The .remove call above
+        // should not enter this state.
+        assertFalse("fragment is detached", strictFragment.isDetached());
+    }
+
+    @Test
+    public void detachment() throws Throwable {
+        final FragmentManager fm = mActivityRule.getActivity().getSupportFragmentManager();
+        final StrictFragment f1 = new StrictFragment();
+        final StrictFragment f2 = new StrictFragment();
+
+        fm.beginTransaction().add(f1, "1").add(f2, "2").commit();
+        executePendingTransactions(fm);
+
+        assertTrue("fragment 1 is not added", f1.isAdded());
+        assertTrue("fragment 2 is not added", f2.isAdded());
+
+        // Test detaching fragments using StrictFragment to throw on errors.
+        fm.beginTransaction().detach(f1).detach(f2).commit();
+        executePendingTransactions(fm);
+
+        assertTrue("fragment 1 is not detached", f1.isDetached());
+        assertTrue("fragment 2 is not detached", f2.isDetached());
+        assertFalse("fragment 1 is added", f1.isAdded());
+        assertFalse("fragment 2 is added", f2.isAdded());
+
+        // Only reattach f1; leave v2 detached.
+        fm.beginTransaction().attach(f1).commit();
+        executePendingTransactions(fm);
+
+        assertTrue("fragment 1 is not added", f1.isAdded());
+        assertFalse("fragment 1 is detached", f1.isDetached());
+        assertTrue("fragment 2 is not detached", f2.isDetached());
+
+        // Remove both from the FragmentManager.
+        fm.beginTransaction().remove(f1).remove(f2).commit();
+        executePendingTransactions(fm);
+
+        assertFalse("fragment 1 is added", f1.isAdded());
+        assertFalse("fragment 2 is added", f2.isAdded());
+        assertFalse("fragment 1 is detached", f1.isDetached());
+        assertFalse("fragment 2 is detached", f2.isDetached());
+    }
+
+    @Test
+    public void basicBackStack() throws Throwable {
+        final FragmentManager fm = mActivityRule.getActivity().getSupportFragmentManager();
+        final StrictFragment f1 = new StrictFragment();
+        final StrictFragment f2 = new StrictFragment();
+
+        // Add a fragment normally to set up
+        fm.beginTransaction().add(f1, "1").commit();
+        executePendingTransactions(fm);
+
+        assertTrue("fragment 1 is not added", f1.isAdded());
+
+        // Remove the first one and add a second. We're not using replace() here since
+        // these fragments are headless and as of this test writing, replace() only works
+        // for fragments with views and a container view id.
+        // Add it to the back stack so we can pop it afterwards.
+        fm.beginTransaction().remove(f1).add(f2, "2").addToBackStack("stack1").commit();
+        executePendingTransactions(fm);
+
+        assertFalse("fragment 1 is added", f1.isAdded());
+        assertTrue("fragment 2 is not added", f2.isAdded());
+
+        // Test popping the stack
+        fm.popBackStack();
+        executePendingTransactions(fm);
+
+        assertFalse("fragment 2 is added", f2.isAdded());
+        assertTrue("fragment 1 is not added", f1.isAdded());
+    }
+
+    @Test
+    public void attachBackStack() throws Throwable {
+        final FragmentManager fm = mActivityRule.getActivity().getSupportFragmentManager();
+        final StrictFragment f1 = new StrictFragment();
+        final StrictFragment f2 = new StrictFragment();
+
+        // Add a fragment normally to set up
+        fm.beginTransaction().add(f1, "1").commit();
+        executePendingTransactions(fm);
+
+        assertTrue("fragment 1 is not added", f1.isAdded());
+
+        fm.beginTransaction().detach(f1).add(f2, "2").addToBackStack("stack1").commit();
+        executePendingTransactions(fm);
+
+        assertTrue("fragment 1 is not detached", f1.isDetached());
+        assertFalse("fragment 2 is detached", f2.isDetached());
+        assertFalse("fragment 1 is added", f1.isAdded());
+        assertTrue("fragment 2 is not added", f2.isAdded());
+    }
+
+    @Test
+    public void viewLifecycle() throws Throwable {
+        // Test basic lifecycle when the fragment creates a view
+
+        final FragmentManager fm = mActivityRule.getActivity().getSupportFragmentManager();
+        final StrictViewFragment f1 = new StrictViewFragment();
+
+        fm.beginTransaction().add(android.R.id.content, f1).commit();
+        executePendingTransactions(fm);
+
+        assertTrue("fragment 1 is not added", f1.isAdded());
+        final View view = f1.getView();
+        assertNotNull("fragment 1 returned null from getView", view);
+        assertTrue("fragment 1's view is not attached to a window", view.isAttachedToWindow());
+
+        fm.beginTransaction().remove(f1).commit();
+        executePendingTransactions(fm);
+
+        assertFalse("fragment 1 is added", f1.isAdded());
+        assertNull("fragment 1 returned non-null from getView after removal", f1.getView());
+        assertFalse("fragment 1's previous view is still attached to a window",
+                view.isAttachedToWindow());
+    }
+
+    @Test
+    public void viewReplace() throws Throwable {
+        // Replace one view with another, then reverse it with the back stack
+
+        final FragmentManager fm = mActivityRule.getActivity().getSupportFragmentManager();
+        final StrictViewFragment f1 = new StrictViewFragment();
+        final StrictViewFragment f2 = new StrictViewFragment();
+
+        fm.beginTransaction().add(android.R.id.content, f1).commit();
+        executePendingTransactions(fm);
+
+        assertTrue("fragment 1 is not added", f1.isAdded());
+
+        View origView1 = f1.getView();
+        assertNotNull("fragment 1 returned null view", origView1);
+        assertTrue("fragment 1's view not attached", origView1.isAttachedToWindow());
+
+        fm.beginTransaction().replace(android.R.id.content, f2).addToBackStack("stack1").commit();
+        executePendingTransactions(fm);
+
+        assertFalse("fragment 1 is added", f1.isAdded());
+        assertTrue("fragment 2 is added", f2.isAdded());
+        assertNull("fragment 1 returned non-null view", f1.getView());
+        assertFalse("fragment 1's old view still attached", origView1.isAttachedToWindow());
+        View origView2 = f2.getView();
+        assertNotNull("fragment 2 returned null view", origView2);
+        assertTrue("fragment 2's view not attached", origView2.isAttachedToWindow());
+
+        fm.popBackStack();
+        executePendingTransactions(fm);
+
+        assertTrue("fragment 1 is not added", f1.isAdded());
+        assertFalse("fragment 2 is added", f2.isAdded());
+        assertNull("fragment 2 returned non-null view", f2.getView());
+        assertFalse("fragment 2's view still attached", origView2.isAttachedToWindow());
+        View newView1 = f1.getView();
+        assertNotSame("fragment 1 had same view from last attachment", origView1, newView1);
+        assertTrue("fragment 1's view not attached", newView1.isAttachedToWindow());
+    }
+
+    @Test
+    @UiThreadTest
+    public void restoreRetainedInstanceFragments() throws Throwable {
+        // Create a new FragmentManager in isolation, nest some assorted fragments
+        // and then restore them to a second new FragmentManager.
+
+        final FragmentController fc1 = FragmentController.createController(
+                new HostCallbacks(mActivityRule.getActivity()));
+
+        final FragmentManager fm1 = fc1.getSupportFragmentManager();
+
+        fc1.attachHost(null);
+        fc1.dispatchCreate();
+
+        // Configure fragments.
+
+        // Grandparent fragment will not retain instance
+        final StateSaveFragment grandparentFragment = new StateSaveFragment("Grandparent",
+                "UnsavedGrandparent");
+        assertNotNull("grandparent fragment saved state not initialized",
+                grandparentFragment.getSavedState());
+        assertNotNull("grandparent fragment unsaved state not initialized",
+                grandparentFragment.getUnsavedState());
+        fm1.beginTransaction().add(grandparentFragment, "tag:grandparent").commitNow();
+
+        // Parent fragment will retain instance
+        final StateSaveFragment parentFragment = new StateSaveFragment("Parent", "UnsavedParent");
+        assertNotNull("parent fragment saved state not initialized",
+                parentFragment.getSavedState());
+        assertNotNull("parent fragment unsaved state not initialized",
+                parentFragment.getUnsavedState());
+        parentFragment.setRetainInstance(true);
+        grandparentFragment.getChildFragmentManager().beginTransaction()
+                .add(parentFragment, "tag:parent").commitNow();
+        assertSame("parent fragment is not a child of grandparent",
+                grandparentFragment, parentFragment.getParentFragment());
+
+        // Child fragment will not retain instance
+        final StateSaveFragment childFragment = new StateSaveFragment("Child", "UnsavedChild");
+        assertNotNull("child fragment saved state not initialized",
+                childFragment.getSavedState());
+        assertNotNull("child fragment unsaved state not initialized",
+                childFragment.getUnsavedState());
+        parentFragment.getChildFragmentManager().beginTransaction()
+                .add(childFragment, "tag:child").commitNow();
+        assertSame("child fragment is not a child of grandpanret",
+                parentFragment, childFragment.getParentFragment());
+
+        // Saved for comparison later
+        final FragmentManager parentChildFragmentManager = parentFragment.getChildFragmentManager();
+
+        fc1.dispatchActivityCreated();
+        fc1.noteStateNotSaved();
+        fc1.execPendingActions();
+        fc1.doLoaderStart();
+        fc1.dispatchStart();
+        fc1.reportLoaderStart();
+        fc1.dispatchResume();
+        fc1.execPendingActions();
+
+        // Bring the state back down to destroyed, simulating an activity restart
+        fc1.dispatchPause();
+        final Parcelable savedState = fc1.saveAllState();
+        final FragmentManagerNonConfig nonconf = fc1.retainNestedNonConfig();
+        fc1.dispatchStop();
+        fc1.dispatchReallyStop();
+        fc1.dispatchDestroy();
+
+        // Create the new controller and restore state
+        final FragmentController fc2 = FragmentController.createController(
+                new HostCallbacks(mActivityRule.getActivity()));
+
+        final FragmentManager fm2 = fc2.getSupportFragmentManager();
+
+        fc2.attachHost(null);
+        fc2.restoreAllState(savedState, nonconf);
+        fc2.dispatchCreate();
+
+        // Confirm that the restored fragments are available and in the expected states
+        final StateSaveFragment restoredGrandparent = (StateSaveFragment) fm2.findFragmentByTag(
+                "tag:grandparent");
+        assertNotNull("grandparent fragment not restored", restoredGrandparent);
+
+        assertNotSame("grandparent fragment instance was saved",
+                grandparentFragment, restoredGrandparent);
+        assertEquals("grandparent fragment saved state was not equal",
+                grandparentFragment.getSavedState(), restoredGrandparent.getSavedState());
+        assertNotEquals("grandparent fragment unsaved state was unexpectedly preserved",
+                grandparentFragment.getUnsavedState(), restoredGrandparent.getUnsavedState());
+
+        final StateSaveFragment restoredParent = (StateSaveFragment) restoredGrandparent
+                .getChildFragmentManager().findFragmentByTag("tag:parent");
+        assertNotNull("parent fragment not restored", restoredParent);
+
+        assertSame("parent fragment instance was not saved", parentFragment, restoredParent);
+        assertEquals("parent fragment saved state was not equal",
+                parentFragment.getSavedState(), restoredParent.getSavedState());
+        assertEquals("parent fragment unsaved state was not equal",
+                parentFragment.getUnsavedState(), restoredParent.getUnsavedState());
+        assertNotSame("parent fragment has the same child FragmentManager",
+                parentChildFragmentManager, restoredParent.getChildFragmentManager());
+
+        final StateSaveFragment restoredChild = (StateSaveFragment) restoredParent
+                .getChildFragmentManager().findFragmentByTag("tag:child");
+        assertNotNull("child fragment not restored", restoredChild);
+
+        assertNotSame("child fragment instance state was saved", childFragment, restoredChild);
+        assertEquals("child fragment saved state was not equal",
+                childFragment.getSavedState(), restoredChild.getSavedState());
+        assertNotEquals("child fragment saved state was unexpectedly equal",
+                childFragment.getUnsavedState(), restoredChild.getUnsavedState());
+
+        fc2.dispatchActivityCreated();
+        fc2.noteStateNotSaved();
+        fc2.execPendingActions();
+        fc2.doLoaderStart();
+        fc2.dispatchStart();
+        fc2.reportLoaderStart();
+        fc2.dispatchResume();
+        fc2.execPendingActions();
+
+        // Test that the fragments are in the configuration we expect
+
+        // Bring the state back down to destroyed before we finish the test
+        fc2.dispatchPause();
+        fc2.saveAllState();
+        fc2.dispatchStop();
+        fc2.dispatchReallyStop();
+        fc2.dispatchDestroy();
+
+        assertTrue("grandparent not destroyed", restoredGrandparent.mCalledOnDestroy);
+        assertTrue("parent not destroyed", restoredParent.mCalledOnDestroy);
+        assertTrue("child not destroyed", restoredChild.mCalledOnDestroy);
+    }
+
+    @Test
+    @UiThreadTest
+    public void saveAnimationState() throws Throwable {
+        FragmentController fc = startupFragmentController(null);
+        FragmentManager fm = fc.getSupportFragmentManager();
+
+        fm.beginTransaction()
+                .setCustomAnimations(0, R.anim.fade_out, R.anim.fade_in, R.anim.fade_out)
+                .add(android.R.id.content, SimpleFragment.create(R.layout.fragment_a))
+                .addToBackStack(null)
+                .commit();
+        fm.executePendingTransactions();
+
+        assertAnimationsMatch(fm, 0, R.anim.fade_out, R.anim.fade_in, R.anim.fade_out);
+
+        // Causes save and restore of fragments and back stack
+        fc = restartFragmentController(fc);
+        fm = fc.getSupportFragmentManager();
+
+        assertAnimationsMatch(fm, 0, R.anim.fade_out, R.anim.fade_in, R.anim.fade_out);
+
+        fm.beginTransaction()
+                .setCustomAnimations(R.anim.fade_in, R.anim.fade_out, 0, 0)
+                .replace(android.R.id.content, SimpleFragment.create(R.layout.fragment_b))
+                .addToBackStack(null)
+                .commit();
+        fm.executePendingTransactions();
+
+        assertAnimationsMatch(fm, R.anim.fade_in, R.anim.fade_out, 0, 0);
+
+        // Causes save and restore of fragments and back stack
+        fc = restartFragmentController(fc);
+        fm = fc.getSupportFragmentManager();
+
+        assertAnimationsMatch(fm, R.anim.fade_in, R.anim.fade_out, 0, 0);
+
+        fm.popBackStackImmediate();
+
+        assertAnimationsMatch(fm, 0, R.anim.fade_out, R.anim.fade_in, R.anim.fade_out);
+
+        shutdownFragmentController(fc);
+    }
+
+    /**
+     * This test confirms that as long as a parent fragment has called super.onCreate,
+     * any child fragments added, committed and with transactions executed will be brought
+     * to at least the CREATED state by the time the parent fragment receives onCreateView.
+     * This means the child fragment will have received onAttach/onCreate.
+     */
+    @Test
+    @UiThreadTest
+    public void childFragmentManagerAttach() throws Throwable {
+        FragmentController fc = FragmentController.createController(
+                new HostCallbacks(mActivityRule.getActivity()));
+        fc.attachHost(null);
+        fc.dispatchCreate();
+
+        FragmentManager fm = fc.getSupportFragmentManager();
+
+        ChildFragmentManagerFragment fragment = new ChildFragmentManagerFragment();
+        fm.beginTransaction()
+                .add(android.R.id.content, fragment)
+                .commitNow();
+
+        fc.dispatchActivityCreated();
+
+        fc.dispatchStart();
+        fc.dispatchResume();
+
+        // Confirm that the parent fragment received onAttachFragment
+        assertTrue("parent fragment did not receive onAttachFragment",
+                fragment.mCalledOnAttachFragment);
+
+        fc.dispatchStop();
+        fc.dispatchReallyStop();
+        fc.dispatchDestroy();
+    }
+
+    private void assertAnimationsMatch(FragmentManager fm, int enter, int exit, int popEnter,
+            int popExit) {
+        FragmentManagerImpl fmImpl = (FragmentManagerImpl) fm;
+        BackStackRecord record = fmImpl.mBackStack.get(fmImpl.mBackStack.size() - 1);
+
+        Assert.assertEquals(enter, record.mEnterAnim);
+        Assert.assertEquals(exit, record.mExitAnim);
+        Assert.assertEquals(popEnter, record.mPopEnterAnim);
+        Assert.assertEquals(popExit, record.mPopExitAnim);
+    }
+
+    private FragmentController restartFragmentController(FragmentController fc) {
+        Parcelable savedState = shutdownFragmentController(fc);
+        return startupFragmentController(savedState);
+    }
+
+    private FragmentController startupFragmentController(Parcelable savedState) {
+        final FragmentController fc = FragmentController.createController(
+                new HostCallbacks(mActivityRule.getActivity()));
+        fc.attachHost(null);
+        fc.restoreAllState(savedState, (FragmentManagerNonConfig) null);
+        fc.dispatchCreate();
+        fc.dispatchActivityCreated();
+        fc.noteStateNotSaved();
+        fc.execPendingActions();
+        fc.doLoaderStart();
+        fc.dispatchStart();
+        fc.reportLoaderStart();
+        fc.dispatchResume();
+        fc.execPendingActions();
+        return fc;
+    }
+
+    private Parcelable shutdownFragmentController(FragmentController fc) {
+        fc.dispatchPause();
+        final Parcelable savedState = fc.saveAllState();
+        fc.dispatchStop();
+        fc.dispatchReallyStop();
+        fc.dispatchDestroy();
+        return savedState;
+    }
+
+    private void executePendingTransactions(final FragmentManager fm) throws Throwable {
+        mActivityRule.runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                fm.executePendingTransactions();
+            }
+        });
+    }
+
+    public static class StateSaveFragment extends StrictFragment {
+        private static final String STATE_KEY = "state";
+
+        private String mSavedState;
+        private String mUnsavedState;
+
+        public StateSaveFragment() {
+        }
+
+        public StateSaveFragment(String savedState, String unsavedState) {
+            mSavedState = savedState;
+            mUnsavedState = unsavedState;
+        }
+
+        public String getSavedState() {
+            return mSavedState;
+        }
+
+        public String getUnsavedState() {
+            return mUnsavedState;
+        }
+
+        @Override
+        public void onCreate(Bundle savedInstanceState) {
+            super.onCreate(savedInstanceState);
+            if (savedInstanceState != null) {
+                mSavedState = savedInstanceState.getString(STATE_KEY);
+            }
+        }
+
+        @Override
+        public void onSaveInstanceState(Bundle outState) {
+            super.onSaveInstanceState(outState);
+            outState.putString(STATE_KEY, mSavedState);
+        }
+    }
+
+    public static class ChildFragmentManagerFragment extends StrictFragment {
+        private FragmentManager mSavedChildFragmentManager;
+
+        @Override
+        public void onAttach(Context context) {
+            super.onAttach(context);
+            mSavedChildFragmentManager = getChildFragmentManager();
+        }
+
+        @Nullable
+        @Override
+        public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
+                @Nullable Bundle savedInstanceState) {
+            assertSame("child FragmentManagers not the same instance", mSavedChildFragmentManager,
+                    getChildFragmentManager());
+            ChildFragmentManagerChildFragment child = new ChildFragmentManagerChildFragment("foo");
+            mSavedChildFragmentManager.beginTransaction()
+                    .add(child, "tag")
+                    .commitNow();
+            assertEquals("argument strings don't match", "foo", child.getString());
+            return new TextView(container.getContext());
+        }
+    }
+
+    public static class ChildFragmentManagerChildFragment extends StrictFragment {
+        private String mString;
+
+        public ChildFragmentManagerChildFragment() {
+        }
+
+        public ChildFragmentManagerChildFragment(String arg) {
+            final Bundle b = new Bundle();
+            b.putString("string", arg);
+            setArguments(b);
+        }
+
+        @Override
+        public void onAttach(Context context) {
+            super.onAttach(context);
+            mString = getArguments().getString("string", "NO VALUE");
+        }
+
+        public String getString() {
+            return mString;
+        }
+    }
+
+    static class HostCallbacks extends FragmentHostCallback<FragmentActivity> {
+        private final FragmentActivity mActivity;
+
+        public HostCallbacks(FragmentActivity activity) {
+            super(activity);
+            mActivity = activity;
+        }
+
+        @Override
+        public void onDump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) {
+        }
+
+        @Override
+        public boolean onShouldSaveFragmentState(Fragment fragment) {
+            return !mActivity.isFinishing();
+        }
+
+        @Override
+        public LayoutInflater onGetLayoutInflater() {
+            return mActivity.getLayoutInflater().cloneInContext(mActivity);
+        }
+
+        @Override
+        public FragmentActivity onGetHost() {
+            return mActivity;
+        }
+
+        @Override
+        public void onSupportInvalidateOptionsMenu() {
+            mActivity.supportInvalidateOptionsMenu();
+        }
+
+        @Override
+        public void onStartActivityFromFragment(Fragment fragment, Intent intent, int requestCode) {
+            mActivity.startActivityFromFragment(fragment, intent, requestCode);
+        }
+
+        @Override
+        public void onStartActivityFromFragment(
+                Fragment fragment, Intent intent, int requestCode, @Nullable Bundle options) {
+            mActivity.startActivityFromFragment(fragment, intent, requestCode, options);
+        }
+
+        @Override
+        public void onRequestPermissionsFromFragment(@NonNull Fragment fragment,
+                @NonNull String[] permissions, int requestCode) {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public boolean onShouldShowRequestPermissionRationale(@NonNull String permission) {
+            return ActivityCompat.shouldShowRequestPermissionRationale(
+                    mActivity, permission);
+        }
+
+        @Override
+        public boolean onHasWindowAnimations() {
+            return mActivity.getWindow() != null;
+        }
+
+        @Override
+        public int onGetWindowAnimations() {
+            final Window w = mActivity.getWindow();
+            return (w == null) ? 0 : w.getAttributes().windowAnimations;
+        }
+
+        @Override
+        public void onAttachFragment(Fragment fragment) {
+            mActivity.onAttachFragment(fragment);
+        }
+
+        @Nullable
+        @Override
+        public View onFindViewById(int id) {
+            return mActivity.findViewById(id);
+        }
+
+        @Override
+        public boolean onHasView() {
+            final Window w = mActivity.getWindow();
+            return (w != null && w.peekDecorView() != null);
+        }
+    }
+
+    public static class SimpleFragment extends Fragment {
+        private int mLayoutId;
+        private static final String LAYOUT_ID = "layoutId";
+
+        @Override
+        public void onCreate(Bundle savedInstanceState) {
+            super.onCreate(savedInstanceState);
+            if (savedInstanceState != null) {
+                mLayoutId = savedInstanceState.getInt(LAYOUT_ID, mLayoutId);
+            }
+        }
+
+        @Override
+        public void onSaveInstanceState(Bundle outState) {
+            super.onSaveInstanceState(outState);
+            outState.putInt(LAYOUT_ID, mLayoutId);
+        }
+
+        @Override
+        public View onCreateView(LayoutInflater inflater, ViewGroup container,
+                Bundle savedInstanceState) {
+            return inflater.inflate(mLayoutId, container, false);
+        }
+
+        public static SimpleFragment create(int layoutId) {
+            SimpleFragment fragment = new SimpleFragment();
+            fragment.mLayoutId = layoutId;
+            return fragment;
+        }
+    }
+}
diff --git a/fragment/tests/java/android/support/v4/app/FragmentReceiveResultTest.java b/fragment/tests/java/android/support/v4/app/FragmentReceiveResultTest.java
new file mode 100644
index 0000000..0bbc3a3
--- /dev/null
+++ b/fragment/tests/java/android/support/v4/app/FragmentReceiveResultTest.java
@@ -0,0 +1,169 @@
+/*
+ * Copyright (C) 2016 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 android.support.v4.app;
+
+import android.app.Activity;
+import android.app.Instrumentation;
+import android.app.PendingIntent;
+import android.content.Intent;
+import android.content.IntentSender;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.runner.AndroidJUnit4;
+import android.support.v4.BaseInstrumentationTestCase;
+import android.support.v4.app.test.FragmentResultActivity;
+import android.support.v4.app.test.FragmentTestActivity;
+import android.support.fragment.test.R;
+import android.test.suitebuilder.annotation.SmallTest;
+
+import static junit.framework.TestCase.assertEquals;
+import static junit.framework.TestCase.assertTrue;
+import static junit.framework.TestCase.fail;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+/**
+ * Tests for Fragment startActivityForResult and startIntentSenderForResult.
+ */
+@RunWith(AndroidJUnit4.class)
+public class FragmentReceiveResultTest extends BaseInstrumentationTestCase<FragmentTestActivity> {
+    private FragmentTestActivity mActivity;
+    private TestFragment mFragment;
+
+    public FragmentReceiveResultTest() {
+        super(FragmentTestActivity.class);
+    }
+
+    @Before
+    public void setUp() {
+        mActivity = mActivityTestRule.getActivity();
+        mFragment = attachTestFragment();
+    }
+
+    @Test
+    @SmallTest
+    public void testStartActivityForResultOk() {
+        startActivityForResult(10, Activity.RESULT_OK, "content 10");
+
+        assertTrue("Fragment should receive result", mFragment.mHasResult);
+        assertEquals(10, mFragment.mRequestCode);
+        assertEquals(Activity.RESULT_OK, mFragment.mResultCode);
+        assertEquals("content 10", mFragment.mResultContent);
+    }
+
+    @Test
+    @SmallTest
+    public void testStartActivityForResultCanceled() {
+        startActivityForResult(20, Activity.RESULT_CANCELED, "content 20");
+
+        assertTrue("Fragment should receive result", mFragment.mHasResult);
+        assertEquals(20, mFragment.mRequestCode);
+        assertEquals(Activity.RESULT_CANCELED, mFragment.mResultCode);
+        assertEquals("content 20", mFragment.mResultContent);
+    }
+
+    @Test
+    @SmallTest
+    public void testStartIntentSenderForResultOk() {
+        startIntentSenderForResult(30, Activity.RESULT_OK, "content 30");
+
+        assertTrue("Fragment should receive result", mFragment.mHasResult);
+        assertEquals(30, mFragment.mRequestCode);
+        assertEquals(Activity.RESULT_OK, mFragment.mResultCode);
+        assertEquals("content 30", mFragment.mResultContent);
+    }
+
+    @Test
+    @SmallTest
+    public void testStartIntentSenderForResultCanceled() {
+        startIntentSenderForResult(40, Activity.RESULT_CANCELED, "content 40");
+
+        assertTrue("Fragment should receive result", mFragment.mHasResult);
+        assertEquals(40, mFragment.mRequestCode);
+        assertEquals(Activity.RESULT_CANCELED, mFragment.mResultCode);
+        assertEquals("content 40", mFragment.mResultContent);
+    }
+
+    private TestFragment attachTestFragment() {
+        final TestFragment fragment = new TestFragment();
+        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
+            @Override
+            public void run() {
+                mActivity.getSupportFragmentManager().beginTransaction()
+                        .add(R.id.content, fragment)
+                        .addToBackStack(null)
+                        .commitAllowingStateLoss();
+                mActivity.getFragmentManager().executePendingTransactions();
+            }
+        });
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+        return fragment;
+    }
+
+    private void startActivityForResult(final int requestCode, final int resultCode,
+            final String content) {
+        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
+            @Override
+            public void run() {
+                Intent intent = new Intent(mActivity, FragmentResultActivity.class);
+                intent.putExtra(FragmentResultActivity.EXTRA_RESULT_CODE, resultCode);
+                intent.putExtra(FragmentResultActivity.EXTRA_RESULT_CONTENT, content);
+
+                mFragment.startActivityForResult(intent, requestCode);
+            }
+        });
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+    }
+
+    private void startIntentSenderForResult(final int requestCode, final int resultCode,
+            final String content) {
+        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
+            @Override
+            public void run() {
+                Intent intent = new Intent(mActivity, FragmentResultActivity.class);
+                intent.putExtra(FragmentResultActivity.EXTRA_RESULT_CODE, resultCode);
+                intent.putExtra(FragmentResultActivity.EXTRA_RESULT_CONTENT, content);
+
+                PendingIntent pendingIntent = PendingIntent.getActivity(mActivity,
+                        requestCode, intent, 0);
+
+                try {
+                    mFragment.startIntentSenderForResult(pendingIntent.getIntentSender(),
+                            requestCode, null, 0, 0, 0, null);
+                } catch (IntentSender.SendIntentException e) {
+                    fail("IntentSender failed");
+                }
+            }
+        });
+        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
+    }
+
+    private static class TestFragment extends Fragment {
+        boolean mHasResult = false;
+        int mRequestCode = -1;
+        int mResultCode = 100;
+        String mResultContent;
+
+        @Override
+        public void onActivityResult(int requestCode, int resultCode, Intent data) {
+            mHasResult = true;
+            mRequestCode = requestCode;
+            mResultCode = resultCode;
+            mResultContent = data.getStringExtra(FragmentResultActivity.EXTRA_RESULT_CONTENT);
+        }
+    }
+}
diff --git a/fragment/tests/java/android/support/v4/app/FragmentReplaceTest.java b/fragment/tests/java/android/support/v4/app/FragmentReplaceTest.java
new file mode 100644
index 0000000..89566eb
--- /dev/null
+++ b/fragment/tests/java/android/support/v4/app/FragmentReplaceTest.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2016 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 android.support.v4.app;
+
+import android.app.Fragment;
+import android.support.fragment.test.R;
+import android.support.test.filters.SdkSuppress;
+import android.support.v4.app.test.FragmentTestActivity;
+import android.support.v4.app.test.FragmentTestActivity.TestFragment;
+import android.test.ActivityInstrumentationTestCase2;
+import android.test.UiThreadTest;
+import android.view.KeyEvent;
+
+/**
+ * Test to prevent regressions in SupportFragmentManager fragment replace method. See b/24693644
+ */
+public class FragmentReplaceTest extends
+        ActivityInstrumentationTestCase2<FragmentTestActivity> {
+    private FragmentTestActivity mActivity;
+
+
+    public FragmentReplaceTest() {
+        super(FragmentTestActivity.class);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mActivity = getActivity();
+    }
+
+    @UiThreadTest
+    public void testReplaceFragment() throws Throwable {
+        mActivity.getSupportFragmentManager().beginTransaction()
+                .add(R.id.content, TestFragment.create(R.layout.fragment_a))
+                .addToBackStack(null)
+                .commit();
+        mActivity.getSupportFragmentManager().executePendingTransactions();
+        assertNotNull(mActivity.findViewById(R.id.textA));
+        assertNull(mActivity.findViewById(R.id.textB));
+        assertNull(mActivity.findViewById(R.id.textC));
+
+
+        mActivity.getSupportFragmentManager().beginTransaction()
+                .add(R.id.content, TestFragment.create(R.layout.fragment_b))
+                .addToBackStack(null)
+                .commit();
+        mActivity.getSupportFragmentManager().executePendingTransactions();
+        assertNotNull(mActivity.findViewById(R.id.textA));
+        assertNotNull(mActivity.findViewById(R.id.textB));
+        assertNull(mActivity.findViewById(R.id.textC));
+
+        mActivity.getSupportFragmentManager().beginTransaction()
+                .replace(R.id.content, TestFragment.create(R.layout.fragment_c))
+                .addToBackStack(null)
+                .commit();
+        mActivity.getSupportFragmentManager().executePendingTransactions();
+        assertNull(mActivity.findViewById(R.id.textA));
+        assertNull(mActivity.findViewById(R.id.textB));
+        assertNotNull(mActivity.findViewById(R.id.textC));
+    }
+
+    @SdkSuppress(minSdkVersion = 11)
+    @UiThreadTest
+    public void testBackPressWithFrameworkFragment() throws Throwable {
+        mActivity.getFragmentManager().beginTransaction()
+                .add(R.id.content, new Fragment())
+                .addToBackStack(null)
+                .commit();
+        mActivity.getFragmentManager().executePendingTransactions();
+        assertEquals(1, mActivity.getFragmentManager().getBackStackEntryCount());
+
+        getInstrumentation().sendKeyDownUpSync(KeyEvent.KEYCODE_BACK);
+
+        assertEquals(0, mActivity.getFragmentManager().getBackStackEntryCount());
+    }
+}
diff --git a/fragment/tests/java/android/support/v4/app/FragmentTest.java b/fragment/tests/java/android/support/v4/app/FragmentTest.java
new file mode 100644
index 0000000..8c2c028
--- /dev/null
+++ b/fragment/tests/java/android/support/v4/app/FragmentTest.java
@@ -0,0 +1,174 @@
+/*
+ * Copyright (C) 2016 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 android.support.v4.app;
+
+import android.os.Bundle;
+import android.support.fragment.test.R;
+import android.support.v4.app.test.FragmentTestActivity;
+import android.test.ActivityInstrumentationTestCase2;
+import android.test.UiThreadTest;
+import android.test.suitebuilder.annotation.MediumTest;
+import android.test.suitebuilder.annotation.SmallTest;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * Miscellaneous tests for fragments that aren't big enough to belong to their own classes.
+ */
+public class FragmentTest extends
+        ActivityInstrumentationTestCase2<FragmentTestActivity> {
+    private FragmentTestActivity mActivity;
+
+    public FragmentTest() {
+        super(FragmentTestActivity.class);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mActivity = getActivity();
+    }
+
+    @SmallTest
+    @UiThreadTest
+    public void testOnCreateOrder() throws Throwable {
+        OrderFragment fragment1 = new OrderFragment();
+        OrderFragment fragment2 = new OrderFragment();
+        mActivity.getSupportFragmentManager()
+                .beginTransaction()
+                .add(R.id.content, fragment1)
+                .add(R.id.content, fragment2)
+                .commitNow();
+        assertEquals(0, fragment1.createOrder);
+        assertEquals(1, fragment2.createOrder);
+    }
+
+    @SmallTest
+    public void testChildFragmentManagerGone() throws Throwable {
+        final FragmentA fragmentA = new FragmentA();
+        final FragmentB fragmentB = new FragmentB();
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mActivity.getSupportFragmentManager().beginTransaction()
+                        .add(R.id.content, fragmentA)
+                        .commitNow();
+            }
+        });
+        getInstrumentation().waitForIdleSync();
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mActivity.getSupportFragmentManager().beginTransaction()
+                        .setCustomAnimations(R.anim.long_fade_in, R.anim.long_fade_out,
+                                R.anim.long_fade_in, R.anim.long_fade_out)
+                        .replace(R.id.content, fragmentB)
+                        .addToBackStack(null)
+                        .commit();
+            }
+        });
+        // Wait for the middle of the animation
+        Thread.sleep(150);
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mActivity.getSupportFragmentManager().beginTransaction()
+                        .setCustomAnimations(R.anim.long_fade_in, R.anim.long_fade_out,
+                                R.anim.long_fade_in, R.anim.long_fade_out)
+                        .replace(R.id.content, fragmentA)
+                        .addToBackStack(null)
+                        .commit();
+            }
+        });
+        // Wait for the middle of the animation
+        Thread.sleep(150);
+        getInstrumentation().waitForIdleSync();
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mActivity.getSupportFragmentManager().popBackStack();
+            }
+        });
+        // Wait for the middle of the animation
+        Thread.sleep(150);
+        getInstrumentation().waitForIdleSync();
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mActivity.getSupportFragmentManager().popBackStack();
+            }
+        });
+    }
+
+    @MediumTest
+    @UiThreadTest
+    public void testViewOrder() throws Throwable {
+        FragmentA fragmentA = new FragmentA();
+        FragmentB fragmentB = new FragmentB();
+        FragmentC fragmentC = new FragmentC();
+        mActivity.getSupportFragmentManager()
+                .beginTransaction()
+                .add(R.id.content, fragmentA)
+                .add(R.id.content, fragmentB)
+                .add(R.id.content, fragmentC)
+                .commitNow();
+        ViewGroup content = (ViewGroup) mActivity.findViewById(R.id.content);
+        assertEquals(3, content.getChildCount());
+        assertNotNull(content.getChildAt(0).findViewById(R.id.textA));
+        assertNotNull(content.getChildAt(1).findViewById(R.id.textB));
+        assertNotNull(content.getChildAt(2).findViewById(R.id.textC));
+    }
+
+    public static class OrderFragment extends Fragment {
+        private static AtomicInteger sOrder = new AtomicInteger();
+        public int createOrder = -1;
+
+        public OrderFragment() {}
+
+        @Override
+        public void onCreate(Bundle savedInstanceState) {
+            createOrder = sOrder.getAndIncrement();
+            super.onCreate(savedInstanceState);
+        }
+    }
+
+    public static class FragmentA extends Fragment {
+        @Override
+        public View onCreateView(LayoutInflater inflater, ViewGroup container,
+                Bundle savedInstanceState) {
+            return inflater.inflate(R.layout.fragment_a, container, false);
+        }
+    }
+
+    public static class FragmentB extends Fragment {
+        @Override
+        public View onCreateView(LayoutInflater inflater, ViewGroup container,
+                Bundle savedInstanceState) {
+            return inflater.inflate(R.layout.fragment_b, container, false);
+        }
+    }
+
+    public static class FragmentC extends Fragment {
+        @Override
+        public View onCreateView(LayoutInflater inflater, ViewGroup container,
+                Bundle savedInstanceState) {
+            return inflater.inflate(R.layout.fragment_c, container, false);
+        }
+    }
+}
diff --git a/fragment/tests/java/android/support/v4/app/FragmentTransitionTest.java b/fragment/tests/java/android/support/v4/app/FragmentTransitionTest.java
new file mode 100644
index 0000000..0b0c736
--- /dev/null
+++ b/fragment/tests/java/android/support/v4/app/FragmentTransitionTest.java
@@ -0,0 +1,380 @@
+/*
+ * Copyright (C) 2015 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 android.support.v4.app;
+
+import android.os.Build.VERSION;
+import android.os.Build.VERSION_CODES;
+import android.support.fragment.test.R;
+import android.support.v4.app.test.FragmentTestActivity;
+import android.support.v4.app.test.FragmentTestActivity.TestFragment;
+import android.support.v4.view.ViewCompat;
+import android.test.ActivityInstrumentationTestCase2;
+import android.test.suitebuilder.annotation.MediumTest;
+import android.view.View;
+
+@MediumTest
+public class FragmentTransitionTest extends
+        ActivityInstrumentationTestCase2<FragmentTestActivity> {
+    private TestFragment mStartFragment;
+    private TestFragment mMidFragment;
+    private TestFragment mEndFragment;
+    private FragmentTestActivity mActivity;
+
+    public FragmentTransitionTest() {
+        super(FragmentTestActivity.class);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mStartFragment = null;
+        mMidFragment = null;
+        mEndFragment = null;
+        mActivity = getActivity();
+    }
+
+    public void testFragmentTransition() throws Throwable {
+        if (VERSION.SDK_INT < VERSION_CODES.LOLLIPOP) {
+            return;
+        }
+        launchStartFragment();
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                final View sharedElement = mActivity.findViewById(R.id.hello);
+                assertEquals("source", ViewCompat.getTransitionName(sharedElement));
+
+                mEndFragment = TestFragment.create(R.layout.fragment_end);
+                mActivity.getSupportFragmentManager().beginTransaction()
+                        .replace(R.id.content, mEndFragment)
+                        .addSharedElement(sharedElement, "destination")
+                        .addToBackStack(null)
+                        .commit();
+                mActivity.getSupportFragmentManager().executePendingTransactions();
+            }
+        });
+        waitForEnd(mEndFragment, TestFragment.ENTER);
+        assertTrue(mEndFragment.wasEndCalled(TestFragment.ENTER));
+        assertTrue(mStartFragment.wasEndCalled(TestFragment.EXIT));
+        assertTrue(mEndFragment.wasEndCalled(TestFragment.SHARED_ELEMENT_ENTER));
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                final View textView = mActivity.findViewById(R.id.hello);
+                assertEquals("destination", ViewCompat.getTransitionName(textView));
+                mActivity.getSupportFragmentManager().popBackStack();
+                mActivity.getSupportFragmentManager().executePendingTransactions();
+            }
+        });
+        waitForEnd(mStartFragment, TestFragment.REENTER);
+        assertTrue(mStartFragment.wasEndCalled(TestFragment.REENTER));
+        assertTrue(mEndFragment.wasEndCalled(TestFragment.RETURN));
+    }
+
+    public void testFirstOutLastInTransition() throws Throwable {
+        if (VERSION.SDK_INT < VERSION_CODES.LOLLIPOP) {
+            return;
+        }
+        launchStartFragment();
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mMidFragment = TestFragment.create(R.layout.fragment_middle);
+                mEndFragment = TestFragment.create(R.layout.fragment_end);
+                mActivity.getSupportFragmentManager().beginTransaction()
+                        .replace(R.id.content, mMidFragment)
+                        .replace(R.id.content, mEndFragment)
+                        .addToBackStack(null)
+                        .commit();
+                mActivity.getSupportFragmentManager().executePendingTransactions();
+            }
+        });
+        waitForEnd(mEndFragment, TestFragment.ENTER);
+        assertTrue(mEndFragment.wasEndCalled(TestFragment.ENTER));
+        assertFalse(mEndFragment.wasEndCalled(TestFragment.EXIT));
+        assertFalse(mEndFragment.wasEndCalled(TestFragment.RETURN));
+        assertFalse(mEndFragment.wasEndCalled(TestFragment.REENTER));
+
+        assertTrue(mStartFragment.wasEndCalled(TestFragment.EXIT));
+        assertFalse(mStartFragment.wasEndCalled(TestFragment.ENTER));
+        assertFalse(mStartFragment.wasEndCalled(TestFragment.RETURN));
+        assertFalse(mStartFragment.wasEndCalled(TestFragment.REENTER));
+
+        assertFalse(mMidFragment.wasStartCalled(TestFragment.ENTER));
+        assertFalse(mMidFragment.wasStartCalled(TestFragment.EXIT));
+        assertFalse(mMidFragment.wasStartCalled(TestFragment.REENTER));
+        assertFalse(mMidFragment.wasStartCalled(TestFragment.RETURN));
+
+        mStartFragment.clearNotifications();
+        mEndFragment.clearNotifications();
+
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mActivity.getSupportFragmentManager().popBackStack();
+                mActivity.getSupportFragmentManager().executePendingTransactions();
+            }
+        });
+        waitForEnd(mEndFragment, TestFragment.RETURN);
+        assertTrue(mEndFragment.wasEndCalled(TestFragment.RETURN));
+        assertFalse(mMidFragment.wasStartCalled(TestFragment.ENTER));
+        assertFalse(mMidFragment.wasStartCalled(TestFragment.EXIT));
+        assertFalse(mMidFragment.wasStartCalled(TestFragment.REENTER));
+        assertFalse(mMidFragment.wasStartCalled(TestFragment.RETURN));
+
+        assertTrue(mStartFragment.wasStartCalled(TestFragment.REENTER));
+        assertFalse(mStartFragment.wasStartCalled(TestFragment.ENTER));
+        assertFalse(mStartFragment.wasStartCalled(TestFragment.EXIT));
+        assertFalse(mStartFragment.wasStartCalled(TestFragment.RETURN));
+    }
+
+    public void testPopTwo() throws Throwable {
+        if (VERSION.SDK_INT < VERSION_CODES.LOLLIPOP) {
+            return;
+        }
+        launchStartFragment();
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mMidFragment = TestFragment.create(R.layout.fragment_middle);
+                mActivity.getSupportFragmentManager().beginTransaction()
+                        .replace(R.id.content, mMidFragment)
+                        .addToBackStack(null)
+                        .commit();
+                mActivity.getSupportFragmentManager().executePendingTransactions();
+            }
+        });
+        waitForEnd(mMidFragment, TestFragment.ENTER);
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mEndFragment = TestFragment.create(R.layout.fragment_end);
+                mActivity.getSupportFragmentManager().beginTransaction()
+                        .replace(R.id.content, mEndFragment)
+                        .addToBackStack(null)
+                        .commit();
+                mActivity.getSupportFragmentManager().executePendingTransactions();
+            }
+        });
+        waitForEnd(mEndFragment, TestFragment.ENTER);
+        assertTrue(mEndFragment.wasEndCalled(TestFragment.ENTER));
+        assertFalse(mEndFragment.wasEndCalled(TestFragment.EXIT));
+        assertFalse(mEndFragment.wasEndCalled(TestFragment.RETURN));
+        assertFalse(mEndFragment.wasEndCalled(TestFragment.REENTER));
+
+        assertTrue(mStartFragment.wasEndCalled(TestFragment.EXIT));
+        assertFalse(mStartFragment.wasEndCalled(TestFragment.ENTER));
+        assertFalse(mStartFragment.wasEndCalled(TestFragment.RETURN));
+        assertFalse(mStartFragment.wasEndCalled(TestFragment.REENTER));
+
+        assertTrue(mMidFragment.wasStartCalled(TestFragment.ENTER));
+        assertTrue(mMidFragment.wasStartCalled(TestFragment.EXIT));
+        assertFalse(mMidFragment.wasStartCalled(TestFragment.REENTER));
+        assertFalse(mMidFragment.wasStartCalled(TestFragment.RETURN));
+
+        mStartFragment.clearNotifications();
+        mMidFragment.clearNotifications();
+        mEndFragment.clearNotifications();
+
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                FragmentManager fm = mActivity.getSupportFragmentManager();
+                int id = fm.getBackStackEntryAt(0).getId();
+                fm.popBackStack(id, FragmentManager.POP_BACK_STACK_INCLUSIVE);
+                fm.executePendingTransactions();
+            }
+        });
+        waitForEnd(mEndFragment, TestFragment.RETURN);
+        assertTrue(mEndFragment.wasEndCalled(TestFragment.RETURN));
+
+        assertFalse(mMidFragment.wasStartCalled(TestFragment.ENTER));
+        assertFalse(mMidFragment.wasStartCalled(TestFragment.EXIT));
+        assertFalse(mMidFragment.wasStartCalled(TestFragment.REENTER));
+        assertFalse(mMidFragment.wasStartCalled(TestFragment.RETURN));
+
+        assertTrue(mStartFragment.wasStartCalled(TestFragment.REENTER));
+        assertFalse(mStartFragment.wasStartCalled(TestFragment.ENTER));
+        assertFalse(mStartFragment.wasStartCalled(TestFragment.EXIT));
+        assertFalse(mStartFragment.wasStartCalled(TestFragment.RETURN));
+    }
+
+    public void testNullTransition() throws Throwable {
+        if (VERSION.SDK_INT < VERSION_CODES.LOLLIPOP) {
+            return;
+        }
+        getInstrumentation().waitForIdleSync();
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mStartFragment = TestFragment.create(R.layout.fragment_start);
+                mStartFragment.clearTransitions();
+                mActivity.getSupportFragmentManager().beginTransaction()
+                        .replace(R.id.content, mStartFragment)
+                        .commit();
+                mActivity.getSupportFragmentManager().executePendingTransactions();
+            }
+        });
+        waitForStart(mStartFragment, TestFragment.ENTER);
+        // No transitions
+        assertFalse(mStartFragment.wasStartCalled(TestFragment.ENTER));
+
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mMidFragment = TestFragment.create(R.layout.fragment_middle);
+                mEndFragment = TestFragment.create(R.layout.fragment_end);
+                mEndFragment.clearTransitions();
+                mActivity.getSupportFragmentManager().beginTransaction()
+                        .replace(R.id.content, mMidFragment)
+                        .replace(R.id.content, mEndFragment)
+                        .addToBackStack(null)
+                        .commit();
+                mActivity.getSupportFragmentManager().executePendingTransactions();
+            }
+        });
+        waitForStart(mEndFragment, TestFragment.ENTER);
+        assertFalse(mEndFragment.wasEndCalled(TestFragment.ENTER));
+        assertFalse(mEndFragment.wasEndCalled(TestFragment.EXIT));
+        assertFalse(mEndFragment.wasEndCalled(TestFragment.RETURN));
+        assertFalse(mEndFragment.wasEndCalled(TestFragment.REENTER));
+
+        assertFalse(mStartFragment.wasEndCalled(TestFragment.EXIT));
+        assertFalse(mStartFragment.wasEndCalled(TestFragment.ENTER));
+        assertFalse(mStartFragment.wasEndCalled(TestFragment.RETURN));
+        assertFalse(mStartFragment.wasEndCalled(TestFragment.REENTER));
+
+        assertFalse(mMidFragment.wasStartCalled(TestFragment.ENTER));
+        assertFalse(mMidFragment.wasStartCalled(TestFragment.EXIT));
+        assertFalse(mMidFragment.wasStartCalled(TestFragment.REENTER));
+        assertFalse(mMidFragment.wasStartCalled(TestFragment.RETURN));
+
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mActivity.getSupportFragmentManager().popBackStack();
+                mActivity.getSupportFragmentManager().executePendingTransactions();
+            }
+        });
+        waitForStart(mEndFragment, TestFragment.RETURN);
+        assertFalse(mEndFragment.wasEndCalled(TestFragment.RETURN));
+        assertFalse(mMidFragment.wasStartCalled(TestFragment.ENTER));
+        assertFalse(mMidFragment.wasStartCalled(TestFragment.EXIT));
+        assertFalse(mMidFragment.wasStartCalled(TestFragment.REENTER));
+        assertFalse(mMidFragment.wasStartCalled(TestFragment.RETURN));
+
+        assertFalse(mStartFragment.wasStartCalled(TestFragment.REENTER));
+        assertFalse(mStartFragment.wasStartCalled(TestFragment.ENTER));
+        assertFalse(mStartFragment.wasStartCalled(TestFragment.EXIT));
+        assertFalse(mStartFragment.wasStartCalled(TestFragment.RETURN));
+    }
+
+    public void testRemoveAdded() throws Throwable {
+        if (VERSION.SDK_INT < VERSION_CODES.LOLLIPOP) {
+            return;
+        }
+        launchStartFragment();
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mEndFragment = TestFragment.create(R.layout.fragment_end);
+                mActivity.getSupportFragmentManager().beginTransaction()
+                        .replace(R.id.content, mEndFragment)
+                        .replace(R.id.content, mStartFragment)
+                        .replace(R.id.content, mEndFragment)
+                        .addToBackStack(null)
+                        .commit();
+                mActivity.getSupportFragmentManager().executePendingTransactions();
+            }
+        });
+        assertTrue(waitForEnd(mEndFragment, TestFragment.ENTER));
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mActivity.getSupportFragmentManager().popBackStack();
+                mActivity.getSupportFragmentManager().executePendingTransactions();
+            }
+        });
+        assertTrue(waitForEnd(mStartFragment, TestFragment.REENTER));
+    }
+
+    public void testAddRemoved() throws Throwable {
+        if (VERSION.SDK_INT < VERSION_CODES.LOLLIPOP) {
+            return;
+        }
+        launchStartFragment();
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mEndFragment = TestFragment.create(R.layout.fragment_end);
+                mActivity.getSupportFragmentManager().beginTransaction()
+                        .replace(R.id.content, mEndFragment)
+                        .replace(R.id.content, mStartFragment)
+                        .addToBackStack(null)
+                        .commit();
+                mActivity.getSupportFragmentManager().executePendingTransactions();
+            }
+        });
+        waitForStart(mStartFragment, TestFragment.ENTER);
+        assertFalse(mStartFragment.wasStartCalled(TestFragment.ENTER));
+        assertFalse(mStartFragment.wasStartCalled(TestFragment.EXIT));
+        assertFalse(mEndFragment.wasStartCalled(TestFragment.ENTER));
+        assertFalse(mEndFragment.wasStartCalled(TestFragment.EXIT));
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mActivity.getSupportFragmentManager().popBackStack();
+                mActivity.getSupportFragmentManager().executePendingTransactions();
+            }
+        });
+        waitForStart(mStartFragment, TestFragment.REENTER);
+        assertFalse(mStartFragment.wasStartCalled(TestFragment.REENTER));
+        assertFalse(mStartFragment.wasStartCalled(TestFragment.RETURN));
+        assertFalse(mEndFragment.wasStartCalled(TestFragment.REENTER));
+        assertFalse(mEndFragment.wasStartCalled(TestFragment.RETURN));
+    }
+
+    private void launchStartFragment() throws Throwable {
+        getInstrumentation().waitForIdleSync();
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mStartFragment = TestFragment.create(R.layout.fragment_start);
+                mActivity.getSupportFragmentManager().beginTransaction()
+                        .replace(R.id.content, mStartFragment)
+                        .commit();
+                mActivity.getSupportFragmentManager().executePendingTransactions();
+            }
+        });
+        assertTrue(waitForEnd(mStartFragment, TestFragment.ENTER));
+        mStartFragment.clearNotifications();
+    }
+
+    private boolean waitForStart(TestFragment fragment, int key) throws InterruptedException {
+        boolean started = fragment.waitForStart(key);
+        getInstrumentation().waitForIdleSync();
+        return started;
+    }
+
+    private boolean waitForEnd(TestFragment fragment, int key) throws InterruptedException {
+        if (!waitForStart(fragment, key)) {
+            return false;
+        }
+        final boolean ended = fragment.waitForEnd(key);
+        getInstrumentation().waitForIdleSync();
+        return ended;
+    }
+}
diff --git a/v4/tests/java/android/support/v4/app/NestedFragmentRestoreTest.java b/fragment/tests/java/android/support/v4/app/NestedFragmentRestoreTest.java
similarity index 100%
rename from v4/tests/java/android/support/v4/app/NestedFragmentRestoreTest.java
rename to fragment/tests/java/android/support/v4/app/NestedFragmentRestoreTest.java
diff --git a/v4/tests/java/android/support/v4/app/NestedFragmentTest.java b/fragment/tests/java/android/support/v4/app/NestedFragmentTest.java
similarity index 100%
rename from v4/tests/java/android/support/v4/app/NestedFragmentTest.java
rename to fragment/tests/java/android/support/v4/app/NestedFragmentTest.java
diff --git a/v4/tests/java/android/support/v4/app/StrictFragment.java b/fragment/tests/java/android/support/v4/app/StrictFragment.java
similarity index 100%
rename from v4/tests/java/android/support/v4/app/StrictFragment.java
rename to fragment/tests/java/android/support/v4/app/StrictFragment.java
diff --git a/fragment/tests/java/android/support/v4/app/StrictViewFragment.java b/fragment/tests/java/android/support/v4/app/StrictViewFragment.java
new file mode 100644
index 0000000..e0bdf33
--- /dev/null
+++ b/fragment/tests/java/android/support/v4/app/StrictViewFragment.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2016 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 android.support.v4.app;
+
+import android.support.fragment.test.R;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+public class StrictViewFragment extends StrictFragment {
+    boolean mOnCreateViewCalled, mOnViewCreatedCalled, mOnDestroyViewCalled;
+
+    @Override
+    public View onCreateView(LayoutInflater inflater, ViewGroup container,
+            Bundle savedInstanceState) {
+        checkGetActivity();
+        checkState("onCreateView", CREATED);
+        final View result = inflater.inflate(R.layout.strict_view_fragment, container, false);
+        mOnCreateViewCalled = true;
+        return result;
+    }
+
+    @Override
+    public void onViewCreated(View view, Bundle savedInstanceState) {
+        if (view == null) {
+            throw new IllegalArgumentException("onViewCreated view argument should not be null");
+        }
+        checkGetActivity();
+        checkState("onViewCreated", CREATED);
+        mOnViewCreatedCalled = true;
+    }
+
+    @Override
+    public void onDestroyView() {
+        super.onDestroyView();
+        if (getView() == null) {
+            throw new IllegalStateException("getView returned null in onDestroyView");
+        }
+        checkGetActivity();
+        checkState("onDestroyView", CREATED);
+        mOnDestroyViewCalled = true;
+    }
+}
diff --git a/v4/tests/java/android/support/v4/app/test/EmptyFragmentTestActivity.java b/fragment/tests/java/android/support/v4/app/test/EmptyFragmentTestActivity.java
similarity index 100%
rename from v4/tests/java/android/support/v4/app/test/EmptyFragmentTestActivity.java
rename to fragment/tests/java/android/support/v4/app/test/EmptyFragmentTestActivity.java
diff --git a/v4/tests/java/android/support/v4/app/test/FragmentResultActivity.java b/fragment/tests/java/android/support/v4/app/test/FragmentResultActivity.java
similarity index 100%
rename from v4/tests/java/android/support/v4/app/test/FragmentResultActivity.java
rename to fragment/tests/java/android/support/v4/app/test/FragmentResultActivity.java
diff --git a/fragment/tests/java/android/support/v4/app/test/FragmentTestActivity.java b/fragment/tests/java/android/support/v4/app/test/FragmentTestActivity.java
new file mode 100644
index 0000000..5d13fe7
--- /dev/null
+++ b/fragment/tests/java/android/support/v4/app/test/FragmentTestActivity.java
@@ -0,0 +1,261 @@
+/*
+ * Copyright (C) 2015 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 android.support.v4.app.test;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Build.VERSION;
+import android.os.Build.VERSION_CODES;
+import android.os.Bundle;
+import android.support.fragment.test.R;
+import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentActivity;
+import android.transition.Transition;
+import android.transition.Transition.TransitionListener;
+import android.transition.TransitionInflater;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * A simple activity used for Fragment Transitions and lifecycle event ordering
+ */
+public class FragmentTestActivity extends FragmentActivity {
+    @Override
+    public void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+        setContentView(R.layout.activity_content);
+    }
+
+    public static class TestFragment extends Fragment {
+        public static final int ENTER = 0;
+        public static final int RETURN = 1;
+        public static final int EXIT = 2;
+        public static final int REENTER = 3;
+        public static final int SHARED_ELEMENT_ENTER = 4;
+        public static final int SHARED_ELEMENT_RETURN = 5;
+        private static final int TRANSITION_COUNT = 6;
+
+        private static final String LAYOUT_ID = "layoutId";
+        private static final String TRANSITION_KEY = "transition_";
+        private int mLayoutId = R.layout.fragment_start;
+        private final int[] mTransitionIds = new int[] {
+                R.transition.fade,
+                R.transition.fade,
+                R.transition.fade,
+                R.transition.fade,
+                R.transition.change_bounds,
+                R.transition.change_bounds,
+        };
+        private final Object[] mListeners = new Object[TRANSITION_COUNT];
+
+        public TestFragment() {
+            if (VERSION.SDK_INT >= VERSION_CODES.KITKAT) {
+                for (int i = 0; i < TRANSITION_COUNT; i++) {
+                    mListeners[i] = new TransitionCalledListener();
+                }
+            }
+        }
+
+        public static TestFragment create(int layoutId) {
+            TestFragment testFragment = new TestFragment();
+            testFragment.mLayoutId = layoutId;
+            return testFragment;
+        }
+
+        public void clearTransitions() {
+            for (int i = 0; i < TRANSITION_COUNT; i++) {
+                mTransitionIds[i] = 0;
+            }
+        }
+
+        public void clearNotifications() {
+            for (int i = 0; i < TRANSITION_COUNT; i++) {
+                ((TransitionCalledListener)mListeners[i]).startLatch = new CountDownLatch(1);
+                ((TransitionCalledListener)mListeners[i]).endLatch = new CountDownLatch(1);
+            }
+        }
+
+        @Override
+        public void onCreate(Bundle savedInstanceState) {
+            super.onCreate(savedInstanceState);
+            if (savedInstanceState != null) {
+                mLayoutId = savedInstanceState.getInt(LAYOUT_ID, mLayoutId);
+                for (int i = 0; i < TRANSITION_COUNT; i++) {
+                    String key = TRANSITION_KEY + i;
+                    mTransitionIds[i] = savedInstanceState.getInt(key, mTransitionIds[i]);
+                }
+            }
+        }
+
+        @Override
+        public void onSaveInstanceState(Bundle outState) {
+            super.onSaveInstanceState(outState);
+            outState.putInt(LAYOUT_ID, mLayoutId);
+            for (int i = 0; i < TRANSITION_COUNT; i++) {
+                String key = TRANSITION_KEY + i;
+                outState.putInt(key, mTransitionIds[i]);
+            }
+        }
+
+        @Override
+        public View onCreateView(LayoutInflater inflater, ViewGroup container,
+                Bundle savedInstanceState) {
+            return inflater.inflate(mLayoutId, container, false);
+        }
+
+        @SuppressWarnings("deprecation")
+        @Override
+        public void onAttach(Activity activity) {
+            super.onAttach(activity);
+            if (VERSION.SDK_INT > VERSION_CODES.KITKAT) {
+                setEnterTransition(loadTransition(ENTER));
+                setReenterTransition(loadTransition(REENTER));
+                setExitTransition(loadTransition(EXIT));
+                setReturnTransition(loadTransition(RETURN));
+                setSharedElementEnterTransition(loadTransition(SHARED_ELEMENT_ENTER));
+                setSharedElementReturnTransition(loadTransition(SHARED_ELEMENT_RETURN));
+            }
+        }
+
+        public boolean wasStartCalled(int transitionKey) {
+            return ((TransitionCalledListener)mListeners[transitionKey]).startLatch.getCount() == 0;
+        }
+
+        public boolean wasEndCalled(int transitionKey) {
+            return ((TransitionCalledListener)mListeners[transitionKey]).endLatch.getCount() == 0;
+        }
+
+        public boolean waitForStart(int transitionKey)
+                throws InterruptedException {
+            TransitionCalledListener l = ((TransitionCalledListener)mListeners[transitionKey]);
+            return l.startLatch.await(500,TimeUnit.MILLISECONDS);
+        }
+
+        public boolean waitForEnd(int transitionKey)
+                throws InterruptedException {
+            TransitionCalledListener l = ((TransitionCalledListener)mListeners[transitionKey]);
+            return l.endLatch.await(500,TimeUnit.MILLISECONDS);
+        }
+
+        private Transition loadTransition(int key) {
+            final int id = mTransitionIds[key];
+            if (id == 0) {
+                return null;
+            }
+            Transition transition = TransitionInflater.from(getActivity()).inflateTransition(id);
+            transition.addListener(((TransitionCalledListener)mListeners[key]));
+            return transition;
+        }
+
+        private class TransitionCalledListener implements TransitionListener {
+            public CountDownLatch startLatch = new CountDownLatch(1);
+            public CountDownLatch endLatch = new CountDownLatch(1);
+
+            public TransitionCalledListener() {
+            }
+
+            @Override
+            public void onTransitionStart(Transition transition) {
+                startLatch.countDown();
+            }
+
+            @Override
+            public void onTransitionEnd(Transition transition) {
+                endLatch.countDown();
+            }
+
+            @Override
+            public void onTransitionCancel(Transition transition) {
+            }
+
+            @Override
+            public void onTransitionPause(Transition transition) {
+            }
+
+            @Override
+            public void onTransitionResume(Transition transition) {
+            }
+        }
+    }
+
+    public static class ParentFragment extends Fragment {
+        static final String CHILD_FRAGMENT_TAG = "childFragment";
+        public boolean wasAttachedInTime;
+
+        private boolean mRetainChild;
+
+        @Override
+        public void onCreate(Bundle savedInstanceState) {
+            super.onCreate(savedInstanceState);
+
+            ChildFragment f = getChildFragment();
+            if (f == null) {
+                f = new ChildFragment();
+                if (mRetainChild) {
+                    f.setRetainInstance(true);
+                }
+                getChildFragmentManager().beginTransaction().add(f, CHILD_FRAGMENT_TAG).commitNow();
+            }
+            wasAttachedInTime = f.attached;
+        }
+
+        public ChildFragment getChildFragment() {
+            return (ChildFragment) getChildFragmentManager().findFragmentByTag(CHILD_FRAGMENT_TAG);
+        }
+
+        public void setRetainChildInstance(boolean retainChild) {
+            mRetainChild = retainChild;
+        }
+    }
+
+    public static class ChildFragment extends Fragment {
+        private OnAttachListener mOnAttachListener;
+
+        public boolean attached;
+        public boolean onActivityResultCalled;
+        public int onActivityResultRequestCode;
+        public int onActivityResultResultCode;
+
+        @Override
+        public void onAttach(Context activity) {
+            super.onAttach(activity);
+            attached = true;
+            if (mOnAttachListener != null) {
+                mOnAttachListener.onAttach(activity, this);
+            }
+        }
+
+        public void setOnAttachListener(OnAttachListener listener) {
+            mOnAttachListener = listener;
+        }
+
+        public interface OnAttachListener {
+            void onAttach(Context activity, ChildFragment fragment);
+        }
+
+        @Override
+        public void onActivityResult(int requestCode, int resultCode, Intent data) {
+            onActivityResultCalled = true;
+            onActivityResultRequestCode = requestCode;
+            onActivityResultResultCode = resultCode;
+        }
+    }
+}
diff --git a/v4/tests/res/anim/fade_in.xml b/fragment/tests/res/anim/fade_in.xml
similarity index 100%
copy from v4/tests/res/anim/fade_in.xml
copy to fragment/tests/res/anim/fade_in.xml
diff --git a/v4/tests/res/anim/fade_out.xml b/fragment/tests/res/anim/fade_out.xml
similarity index 100%
copy from v4/tests/res/anim/fade_out.xml
copy to fragment/tests/res/anim/fade_out.xml
diff --git a/v4/tests/res/anim/long_fade_in.xml b/fragment/tests/res/anim/long_fade_in.xml
similarity index 100%
copy from v4/tests/res/anim/long_fade_in.xml
copy to fragment/tests/res/anim/long_fade_in.xml
diff --git a/v4/tests/res/anim/long_fade_out.xml b/fragment/tests/res/anim/long_fade_out.xml
similarity index 100%
copy from v4/tests/res/anim/long_fade_out.xml
copy to fragment/tests/res/anim/long_fade_out.xml
diff --git a/v4/tests/res/layout/activity_content.xml b/fragment/tests/res/layout/activity_content.xml
similarity index 100%
copy from v4/tests/res/layout/activity_content.xml
copy to fragment/tests/res/layout/activity_content.xml
diff --git a/v4/tests/res/layout/explore_by_touch_helper_activity.xml b/fragment/tests/res/layout/explore_by_touch_helper_activity.xml
similarity index 100%
copy from v4/tests/res/layout/explore_by_touch_helper_activity.xml
copy to fragment/tests/res/layout/explore_by_touch_helper_activity.xml
diff --git a/v4/tests/res/layout/fragment_a.xml b/fragment/tests/res/layout/fragment_a.xml
similarity index 100%
copy from v4/tests/res/layout/fragment_a.xml
copy to fragment/tests/res/layout/fragment_a.xml
diff --git a/v4/tests/res/layout/fragment_b.xml b/fragment/tests/res/layout/fragment_b.xml
similarity index 100%
copy from v4/tests/res/layout/fragment_b.xml
copy to fragment/tests/res/layout/fragment_b.xml
diff --git a/v4/tests/res/layout/fragment_c.xml b/fragment/tests/res/layout/fragment_c.xml
similarity index 100%
copy from v4/tests/res/layout/fragment_c.xml
copy to fragment/tests/res/layout/fragment_c.xml
diff --git a/v4/tests/res/layout/fragment_end.xml b/fragment/tests/res/layout/fragment_end.xml
similarity index 100%
copy from v4/tests/res/layout/fragment_end.xml
copy to fragment/tests/res/layout/fragment_end.xml
diff --git a/v4/tests/res/layout/fragment_middle.xml b/fragment/tests/res/layout/fragment_middle.xml
similarity index 100%
copy from v4/tests/res/layout/fragment_middle.xml
copy to fragment/tests/res/layout/fragment_middle.xml
diff --git a/v4/tests/res/layout/fragment_start.xml b/fragment/tests/res/layout/fragment_start.xml
similarity index 100%
copy from v4/tests/res/layout/fragment_start.xml
copy to fragment/tests/res/layout/fragment_start.xml
diff --git a/v4/tests/res/layout/strict_view_fragment.xml b/fragment/tests/res/layout/strict_view_fragment.xml
similarity index 100%
copy from v4/tests/res/layout/strict_view_fragment.xml
copy to fragment/tests/res/layout/strict_view_fragment.xml
diff --git a/v4/tests/res/layout/swipe_refresh_layout_activity.xml b/fragment/tests/res/layout/swipe_refresh_layout_activity.xml
similarity index 100%
copy from v4/tests/res/layout/swipe_refresh_layout_activity.xml
copy to fragment/tests/res/layout/swipe_refresh_layout_activity.xml
diff --git a/v4/tests/res/layout/view_pager_with_tab_strip.xml b/fragment/tests/res/layout/view_pager_with_tab_strip.xml
similarity index 100%
copy from v4/tests/res/layout/view_pager_with_tab_strip.xml
copy to fragment/tests/res/layout/view_pager_with_tab_strip.xml
diff --git a/v4/tests/res/layout/view_pager_with_title_strip.xml b/fragment/tests/res/layout/view_pager_with_title_strip.xml
similarity index 100%
copy from v4/tests/res/layout/view_pager_with_title_strip.xml
copy to fragment/tests/res/layout/view_pager_with_title_strip.xml
diff --git a/v4/tests/res/transition/change_bounds.xml b/fragment/tests/res/transition/change_bounds.xml
similarity index 100%
copy from v4/tests/res/transition/change_bounds.xml
copy to fragment/tests/res/transition/change_bounds.xml
diff --git a/v4/tests/res/transition/fade.xml b/fragment/tests/res/transition/fade.xml
similarity index 100%
copy from v4/tests/res/transition/fade.xml
copy to fragment/tests/res/transition/fade.xml
diff --git a/fragment/tests/res/values/colors.xml b/fragment/tests/res/values/colors.xml
new file mode 100644
index 0000000..d0d5309
--- /dev/null
+++ b/fragment/tests/res/values/colors.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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">
+    <color name="text_color">#FF8090</color>
+
+    <color name="test_red">#FF6030</color>
+    <color name="test_green">#50E080</color>
+    <color name="test_blue">#3050CF</color>
+    <color name="test_yellow">#F0F000</color>
+</resources>
diff --git a/fragment/tests/res/values/dimens.xml b/fragment/tests/res/values/dimens.xml
new file mode 100644
index 0000000..c3617a9
--- /dev/null
+++ b/fragment/tests/res/values/dimens.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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">
+    <dimen name="text_medium_size">20sp</dimen>
+</resources>
\ No newline at end of file
diff --git a/v4/tests/res/values/ids.xml b/fragment/tests/res/values/ids.xml
similarity index 100%
copy from v4/tests/res/values/ids.xml
copy to fragment/tests/res/values/ids.xml
diff --git a/fragment/tests/res/values/strings.xml b/fragment/tests/res/values/strings.xml
new file mode 100644
index 0000000..2fa1430
--- /dev/null
+++ b/fragment/tests/res/values/strings.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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="hello">Hello World</string>
+</resources>
\ No newline at end of file
diff --git a/fragment/tests/res/values/styles.xml b/fragment/tests/res/values/styles.xml
new file mode 100644
index 0000000..ae6325b
--- /dev/null
+++ b/fragment/tests/res/values/styles.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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">
+    <style name="TestActivityTheme">
+        <item name="android:windowAnimationStyle">@null</item>
+    </style>
+    <style name="TextMediumStyle" parent="@android:style/TextAppearance.Medium">
+        <item name="android:textSize">@dimen/text_medium_size</item>
+        <item name="android:textColor">@color/text_color</item>
+        <item name="android:textStyle">italic</item>
+    </style>
+</resources>
\ No newline at end of file
diff --git a/graphics/drawable/Android.mk b/graphics/drawable/Android.mk
index 2aa2767..61039fb 100644
--- a/graphics/drawable/Android.mk
+++ b/graphics/drawable/Android.mk
@@ -21,29 +21,14 @@
 # ---------------------------------------------
 include $(CLEAR_VARS)
 LOCAL_MODULE := android-support-vectordrawable
-
-ifdef SUPPORT_CURRENT_SDK_VERSION
 LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
-else
-LOCAL_SDK_VERSION := current
-endif
-
 LOCAL_SRC_FILES := $(call all-java-files-under, static/src)
 
-LOCAL_JAVA_LIBRARIES := android-support-v4
+LOCAL_JAVA_LIBRARIES := android-support-compat
 
 LOCAL_JAVA_LANGUAGE_VERSION := 1.7
 include $(BUILD_STATIC_JAVA_LIBRARY)
 
-# Static API Check
-support_module := $(LOCAL_MODULE)
-support_module_api_dir := $(LOCAL_PATH)/static/api
-support_module_src_files := $(LOCAL_SRC_FILES)
-support_module_java_libraries := $(LOCAL_JAVA_LIBRARIES)
-support_module_java_packages := android.support.graphics.drawable
-include $(SUPPORT_API_CHECK)
-
-
 # ---------------------------------------------
 #
 # Animated vector drawable library
@@ -51,26 +36,11 @@
 # ---------------------------------------------
 include $(CLEAR_VARS)
 LOCAL_MODULE := android-support-animatedvectordrawable
-
-ifdef SUPPORT_CURRENT_SDK_VERSION
 LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
-else
-LOCAL_SDK_VERSION := current
-endif
-
 LOCAL_SRC_FILES := $(call all-java-files-under, animated/src)
 
-LOCAL_JAVA_LIBRARIES := android-support-v4 android-support-vectordrawable
+LOCAL_JAVA_LIBRARIES := android-support-compat android-support-vectordrawable
 
 LOCAL_AAPT_FLAGS := --no-version-vectors
 LOCAL_JAVA_LANGUAGE_VERSION := 1.7
 include $(BUILD_STATIC_JAVA_LIBRARY)
-
-# Animated API Check
-support_module := $(LOCAL_MODULE)
-support_module_api_dir := $(LOCAL_PATH)/animated/api
-support_module_src_files := $(LOCAL_SRC_FILES) \
-    static/src/android/support/graphics/drawable/VectorDrawableCommon.java
-support_module_java_libraries := $(LOCAL_JAVA_LIBRARIES)
-support_module_java_packages := android.support.graphics.drawable
-include $(SUPPORT_API_CHECK)
diff --git a/graphics/drawable/animated/src/android/support/graphics/drawable/AnimatedVectorDrawableCompat.java b/graphics/drawable/animated/src/android/support/graphics/drawable/AnimatedVectorDrawableCompat.java
index a8b3230..f172738 100644
--- a/graphics/drawable/animated/src/android/support/graphics/drawable/AnimatedVectorDrawableCompat.java
+++ b/graphics/drawable/animated/src/android/support/graphics/drawable/AnimatedVectorDrawableCompat.java
@@ -250,6 +250,7 @@
         mAnimatedVectorState.mVectorDrawable.setColorFilter(colorFilter);
     }
 
+    @Override
     public void setTint(int tint) {
         if (mDelegateDrawable != null) {
             DrawableCompat.setTint(mDelegateDrawable, tint);
@@ -259,6 +260,7 @@
         mAnimatedVectorState.mVectorDrawable.setTint(tint);
     }
 
+    @Override
     public void setTintList(ColorStateList tint) {
         if (mDelegateDrawable != null) {
             DrawableCompat.setTintList(mDelegateDrawable, tint);
@@ -268,6 +270,7 @@
         mAnimatedVectorState.mVectorDrawable.setTintList(tint);
     }
 
+    @Override
     public void setTintMode(PorterDuff.Mode tintMode) {
         if (mDelegateDrawable != null) {
             DrawableCompat.setTintMode(mDelegateDrawable, tintMode);
@@ -302,6 +305,7 @@
         return mAnimatedVectorState.mVectorDrawable.getOpacity();
     }
 
+    @Override
     public int getIntrinsicWidth() {
         if (mDelegateDrawable != null) {
             return mDelegateDrawable.getIntrinsicWidth();
@@ -309,6 +313,7 @@
         return mAnimatedVectorState.mVectorDrawable.getIntrinsicWidth();
     }
 
+    @Override
     public int getIntrinsicHeight() {
         if (mDelegateDrawable != null) {
             return mDelegateDrawable.getIntrinsicHeight();
@@ -405,6 +410,7 @@
         return;
     }
 
+    @Override
     public boolean canApplyTheme() {
         if (mDelegateDrawable != null) {
             return DrawableCompat.canApplyTheme(mDelegateDrawable);
diff --git a/graphics/drawable/static/build.gradle b/graphics/drawable/static/build.gradle
index f7a5b97..3976438 100644
--- a/graphics/drawable/static/build.gradle
+++ b/graphics/drawable/static/build.gradle
@@ -3,7 +3,7 @@
 archivesBaseName = 'support-vector-drawable'
 
 dependencies {
-    compile project(':support-v4')
+    compile project(':support-compat')
     androidTestCompile ('com.android.support.test:runner:0.4.1') {
         exclude module: 'support-annotations'
     }
@@ -17,7 +17,7 @@
     compileSdkVersion 23
 
     defaultConfig {
-        minSdkVersion 7
+        minSdkVersion 9
         testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
         // This disables the builds tools automatic vector -> PNG generation
         generatedDensities = []
diff --git a/graphics/drawable/static/src/android/support/graphics/drawable/VectorDrawableCompat.java b/graphics/drawable/static/src/android/support/graphics/drawable/VectorDrawableCompat.java
index 7e82be5..0e63713 100644
--- a/graphics/drawable/static/src/android/support/graphics/drawable/VectorDrawableCompat.java
+++ b/graphics/drawable/static/src/android/support/graphics/drawable/VectorDrawableCompat.java
@@ -217,6 +217,7 @@
         canvas.restoreToCount(saveCount);
     }
 
+    @Override
     public int getAlpha() {
         if (mDelegateDrawable != null) {
             return DrawableCompat.getAlpha(mDelegateDrawable);
@@ -264,6 +265,7 @@
         return new PorterDuffColorFilter(color, tintMode);
     }
 
+    @Override
     public void setTint(int tint) {
         if (mDelegateDrawable != null) {
             DrawableCompat.setTint(mDelegateDrawable, tint);
@@ -273,6 +275,7 @@
         setTintList(ColorStateList.valueOf(tint));
     }
 
+    @Override
     public void setTintList(ColorStateList tint) {
         if (mDelegateDrawable != null) {
             DrawableCompat.setTintList(mDelegateDrawable, tint);
@@ -287,6 +290,7 @@
         }
     }
 
+    @Override
     public void setTintMode(Mode tintMode) {
         if (mDelegateDrawable != null) {
             DrawableCompat.setTintMode(mDelegateDrawable, tintMode);
@@ -354,6 +358,7 @@
     }
 
     // Don't support re-applying themes. The initial theme loading is working.
+    @Override
     public boolean canApplyTheme() {
         if (mDelegateDrawable != null) {
             DrawableCompat.canApplyTheme(mDelegateDrawable);
@@ -455,6 +460,7 @@
         inflate(res, parser, attrs, null);
     }
 
+    @Override
     public void inflate(Resources res, XmlPullParser parser, AttributeSet attrs, Theme theme)
             throws XmlPullParserException, IOException {
         if (mDelegateDrawable != null) {
@@ -990,7 +996,7 @@
         }
 
         public void draw(Canvas canvas, int w, int h, ColorFilter filter) {
-            // Travese the tree in pre-order to draw.
+            // Traverse the tree in pre-order to draw.
             drawGroupTree(mRootGroup, IDENTITY_MATRIX, canvas, w, h, filter);
         }
 
diff --git a/graphics/drawable/static/tests/AndroidManifest.xml b/graphics/drawable/static/tests/AndroidManifest.xml
index 27f3fbd..3a6942d 100644
--- a/graphics/drawable/static/tests/AndroidManifest.xml
+++ b/graphics/drawable/static/tests/AndroidManifest.xml
@@ -18,7 +18,7 @@
           xmlns:tools="http://schemas.android.com/tools"
           package="android.support.graphics.drawable.test">
     <uses-sdk
-            android:minSdkVersion="8"
+            android:minSdkVersion="9"
             android:targetSdkVersion="23"
             tools:overrideLibrary="android.support.test, android.app, android.support.test.rule,
                 android.support.test.espresso, android.support.test.espresso.idling" />
diff --git a/media-compat/Android.mk b/media-compat/Android.mk
new file mode 100644
index 0000000..e8f9c8b
--- /dev/null
+++ b/media-compat/Android.mk
@@ -0,0 +1,111 @@
+# 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.
+
+LOCAL_PATH := $(call my-dir)
+
+# -----------------------------------------------------------------------
+
+# A helper sub-library that makes direct use of Ice Cream Sandwich APIs.
+include $(CLEAR_VARS)
+LOCAL_MODULE := android-support-media-compat-ics
+LOCAL_SDK_VERSION := 14
+LOCAL_SRC_FILES := $(call all-java-files-under, ics)
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-annotations android-support-compat
+LOCAL_JAVA_LANGUAGE_VERSION := 1.7
+include $(BUILD_STATIC_JAVA_LIBRARY)
+
+# -----------------------------------------------------------------------
+
+# A helper sub-library that makes direct use of JellyBean MR2 APIs.
+include $(CLEAR_VARS)
+LOCAL_MODULE := android-support-media-compat-jellybean-mr2
+LOCAL_SDK_VERSION := 18
+LOCAL_SRC_FILES := $(call all-java-files-under, jellybean-mr2)
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-media-compat-ics
+LOCAL_JAVA_LANGUAGE_VERSION := 1.7
+include $(BUILD_STATIC_JAVA_LIBRARY)
+
+# -----------------------------------------------------------------------
+
+# A helper sub-library that makes direct use of KitKat APIs.
+include $(CLEAR_VARS)
+LOCAL_MODULE := android-support-media-compat-kitkat
+LOCAL_SDK_VERSION := 19
+LOCAL_SRC_FILES := $(call all-java-files-under, kitkat)
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-media-compat-jellybean-mr2
+LOCAL_JAVA_LANGUAGE_VERSION := 1.7
+include $(BUILD_STATIC_JAVA_LIBRARY)
+
+# -----------------------------------------------------------------------
+
+# A helper sub-library that makes direct use of Lollipop APIs.
+include $(CLEAR_VARS)
+LOCAL_MODULE := android-support-media-compat-api21
+LOCAL_SDK_VERSION := 21
+LOCAL_SRC_FILES := $(call all-java-files-under, api21)
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-media-compat-kitkat
+LOCAL_JAVA_LANGUAGE_VERSION := 1.7
+include $(BUILD_STATIC_JAVA_LIBRARY)
+
+# -----------------------------------------------------------------------
+
+# A helper sub-library that makes direct use of V22 APIs.
+include $(CLEAR_VARS)
+LOCAL_MODULE := android-support-media-compat-api22
+LOCAL_SDK_VERSION := 22
+LOCAL_SRC_FILES := $(call all-java-files-under, api22)
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-media-compat-api21
+LOCAL_JAVA_LANGUAGE_VERSION := 1.7
+include $(BUILD_STATIC_JAVA_LIBRARY)
+
+# -----------------------------------------------------------------------
+
+# A helper sub-library that makes direct use of V23 APIs.
+include $(CLEAR_VARS)
+LOCAL_MODULE := android-support-media-compat-api23
+LOCAL_SDK_VERSION := 23
+LOCAL_SRC_FILES := $(call all-java-files-under, api23)
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-media-compat-api22
+LOCAL_JAVA_LANGUAGE_VERSION := 1.7
+include $(BUILD_STATIC_JAVA_LIBRARY)
+
+# -----------------------------------------------------------------------
+
+# A helper sub-library that makes direct use of V24 APIs.
+include $(CLEAR_VARS)
+LOCAL_MODULE := android-support-media-compat-api24
+LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
+LOCAL_SRC_FILES := $(call all-java-files-under, api24)
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-media-compat-api23
+LOCAL_JAVA_LANGUAGE_VERSION := 1.7
+include $(BUILD_STATIC_JAVA_LIBRARY)
+
+# -----------------------------------------------------------------------
+
+# Here is the final static library that apps can link against.
+include $(CLEAR_VARS)
+LOCAL_USE_AAPT2 := true
+LOCAL_MODULE := android-support-media-compat
+LOCAL_SDK_VERSION := 9
+LOCAL_AIDL_INCLUDES := frameworks/support/media-compat/java
+LOCAL_SRC_FILES := $(call all-java-files-under, java) \
+    $(call all-Iaidl-files-under, java)
+LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
+LOCAL_STATIC_JAVA_LIBRARIES += android-support-media-compat-api24
+LOCAL_SHARED_ANDROID_LIBRARIES := \
+    android-support-compat \
+    android-support-annotations
+LOCAL_JAR_EXCLUDE_FILES := none
+LOCAL_JAVA_LANGUAGE_VERSION := 1.7
+include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/media-compat/AndroidManifest.xml b/media-compat/AndroidManifest.xml
new file mode 100644
index 0000000..c971549
--- /dev/null
+++ b/media-compat/AndroidManifest.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+          xmlns:tools="http://schemas.android.com/tools"
+          package="android.support.mediacompat">
+    <uses-sdk android:minSdkVersion="9" tools:overrideLibrary="android.support.mediacompat"/>
+    <application />
+</manifest>
diff --git a/v4/api21/android/support/v4/media/MediaBrowserCompatApi21.java b/media-compat/api21/android/support/v4/media/MediaBrowserCompatApi21.java
similarity index 100%
rename from v4/api21/android/support/v4/media/MediaBrowserCompatApi21.java
rename to media-compat/api21/android/support/v4/media/MediaBrowserCompatApi21.java
diff --git a/v4/api21/android/support/v4/media/MediaBrowserServiceCompatApi21.java b/media-compat/api21/android/support/v4/media/MediaBrowserServiceCompatApi21.java
similarity index 100%
rename from v4/api21/android/support/v4/media/MediaBrowserServiceCompatApi21.java
rename to media-compat/api21/android/support/v4/media/MediaBrowserServiceCompatApi21.java
diff --git a/v4/api21/android/support/v4/media/MediaDescriptionCompatApi21.java b/media-compat/api21/android/support/v4/media/MediaDescriptionCompatApi21.java
similarity index 100%
rename from v4/api21/android/support/v4/media/MediaDescriptionCompatApi21.java
rename to media-compat/api21/android/support/v4/media/MediaDescriptionCompatApi21.java
diff --git a/v4/api21/android/support/v4/media/MediaMetadataCompatApi21.java b/media-compat/api21/android/support/v4/media/MediaMetadataCompatApi21.java
similarity index 100%
rename from v4/api21/android/support/v4/media/MediaMetadataCompatApi21.java
rename to media-compat/api21/android/support/v4/media/MediaMetadataCompatApi21.java
diff --git a/v4/api21/android/support/v4/media/ParceledListSliceAdapterApi21.java b/media-compat/api21/android/support/v4/media/ParceledListSliceAdapterApi21.java
similarity index 100%
rename from v4/api21/android/support/v4/media/ParceledListSliceAdapterApi21.java
rename to media-compat/api21/android/support/v4/media/ParceledListSliceAdapterApi21.java
diff --git a/v4/api21/android/support/v4/media/VolumeProviderCompatApi21.java b/media-compat/api21/android/support/v4/media/VolumeProviderCompatApi21.java
similarity index 100%
rename from v4/api21/android/support/v4/media/VolumeProviderCompatApi21.java
rename to media-compat/api21/android/support/v4/media/VolumeProviderCompatApi21.java
diff --git a/v4/api21/android/support/v4/media/session/MediaControllerCompatApi21.java b/media-compat/api21/android/support/v4/media/session/MediaControllerCompatApi21.java
similarity index 100%
rename from v4/api21/android/support/v4/media/session/MediaControllerCompatApi21.java
rename to media-compat/api21/android/support/v4/media/session/MediaControllerCompatApi21.java
diff --git a/v4/api21/android/support/v4/media/session/MediaSessionCompatApi21.java b/media-compat/api21/android/support/v4/media/session/MediaSessionCompatApi21.java
similarity index 100%
rename from v4/api21/android/support/v4/media/session/MediaSessionCompatApi21.java
rename to media-compat/api21/android/support/v4/media/session/MediaSessionCompatApi21.java
diff --git a/v4/api21/android/support/v4/media/session/PlaybackStateCompatApi21.java b/media-compat/api21/android/support/v4/media/session/PlaybackStateCompatApi21.java
similarity index 100%
rename from v4/api21/android/support/v4/media/session/PlaybackStateCompatApi21.java
rename to media-compat/api21/android/support/v4/media/session/PlaybackStateCompatApi21.java
diff --git a/v4/api22/android/support/v4/media/session/MediaSessionCompatApi22.java b/media-compat/api22/android/support/v4/media/session/MediaSessionCompatApi22.java
similarity index 100%
rename from v4/api22/android/support/v4/media/session/MediaSessionCompatApi22.java
rename to media-compat/api22/android/support/v4/media/session/MediaSessionCompatApi22.java
diff --git a/v4/api22/android/support/v4/media/session/PlaybackStateCompatApi22.java b/media-compat/api22/android/support/v4/media/session/PlaybackStateCompatApi22.java
similarity index 100%
rename from v4/api22/android/support/v4/media/session/PlaybackStateCompatApi22.java
rename to media-compat/api22/android/support/v4/media/session/PlaybackStateCompatApi22.java
diff --git a/v4/api23/android/support/v4/media/MediaBrowserCompatApi23.java b/media-compat/api23/android/support/v4/media/MediaBrowserCompatApi23.java
similarity index 100%
rename from v4/api23/android/support/v4/media/MediaBrowserCompatApi23.java
rename to media-compat/api23/android/support/v4/media/MediaBrowserCompatApi23.java
diff --git a/v4/api23/android/support/v4/media/MediaBrowserServiceCompatApi23.java b/media-compat/api23/android/support/v4/media/MediaBrowserServiceCompatApi23.java
similarity index 100%
rename from v4/api23/android/support/v4/media/MediaBrowserServiceCompatApi23.java
rename to media-compat/api23/android/support/v4/media/MediaBrowserServiceCompatApi23.java
diff --git a/v4/api23/android/support/v4/media/MediaDescriptionCompatApi23.java b/media-compat/api23/android/support/v4/media/MediaDescriptionCompatApi23.java
similarity index 100%
rename from v4/api23/android/support/v4/media/MediaDescriptionCompatApi23.java
rename to media-compat/api23/android/support/v4/media/MediaDescriptionCompatApi23.java
diff --git a/v4/api23/android/support/v4/media/session/MediaControllerCompatApi23.java b/media-compat/api23/android/support/v4/media/session/MediaControllerCompatApi23.java
similarity index 100%
rename from v4/api23/android/support/v4/media/session/MediaControllerCompatApi23.java
rename to media-compat/api23/android/support/v4/media/session/MediaControllerCompatApi23.java
diff --git a/v4/api23/android/support/v4/media/session/MediaSessionCompatApi23.java b/media-compat/api23/android/support/v4/media/session/MediaSessionCompatApi23.java
similarity index 100%
rename from v4/api23/android/support/v4/media/session/MediaSessionCompatApi23.java
rename to media-compat/api23/android/support/v4/media/session/MediaSessionCompatApi23.java
diff --git a/v4/api24/android/support/v4/media/MediaBrowserCompatApi24.java b/media-compat/api24/android/support/v4/media/MediaBrowserCompatApi24.java
similarity index 100%
rename from v4/api24/android/support/v4/media/MediaBrowserCompatApi24.java
rename to media-compat/api24/android/support/v4/media/MediaBrowserCompatApi24.java
diff --git a/v4/api24/android/support/v4/media/MediaBrowserServiceCompatApi24.java b/media-compat/api24/android/support/v4/media/MediaBrowserServiceCompatApi24.java
similarity index 100%
rename from v4/api24/android/support/v4/media/MediaBrowserServiceCompatApi24.java
rename to media-compat/api24/android/support/v4/media/MediaBrowserServiceCompatApi24.java
diff --git a/v4/api24/android/support/v4/media/session/MediaControllerCompatApi24.java b/media-compat/api24/android/support/v4/media/session/MediaControllerCompatApi24.java
similarity index 100%
rename from v4/api24/android/support/v4/media/session/MediaControllerCompatApi24.java
rename to media-compat/api24/android/support/v4/media/session/MediaControllerCompatApi24.java
diff --git a/v4/api24/android/support/v4/media/session/MediaSessionCompatApi24.java b/media-compat/api24/android/support/v4/media/session/MediaSessionCompatApi24.java
similarity index 100%
rename from v4/api24/android/support/v4/media/session/MediaSessionCompatApi24.java
rename to media-compat/api24/android/support/v4/media/session/MediaSessionCompatApi24.java
diff --git a/media-compat/build.gradle b/media-compat/build.gradle
new file mode 100644
index 0000000..660937d
--- /dev/null
+++ b/media-compat/build.gradle
@@ -0,0 +1,121 @@
+apply plugin: 'com.android.library'
+archivesBaseName = 'support-media-compat'
+
+
+createApiSourceSets(project, gradle.ext.studioCompat.modules.mediacompat.apiTargets)
+dependencies {
+    compile project(':support-compat')
+    androidTestCompile ('com.android.support.test:runner:0.4.1') {
+        exclude module: 'support-annotations'
+    }
+    androidTestCompile ('com.android.support.test.espresso:espresso-core:2.2.1') {
+        exclude module: 'support-annotations'
+    }
+    androidTestCompile 'org.mockito:mockito-core:1.9.5'
+    androidTestCompile 'com.google.dexmaker:dexmaker:1.2'
+    androidTestCompile 'com.google.dexmaker:dexmaker-mockito:1.2'
+}
+
+sourceCompatibility = JavaVersion.VERSION_1_7
+targetCompatibility = JavaVersion.VERSION_1_7
+setApiModuleDependencies(project, dependencies, gradle.ext.studioCompat.modules.mediacompat.dependencies)
+
+android {
+    compileSdkVersion 9
+
+    defaultConfig {
+        minSdkVersion 9
+        // TODO: get target from branch
+        //targetSdkVersion 19
+    }
+
+    sourceSets {
+        main.manifest.srcFile 'AndroidManifest.xml'
+        main.java.srcDirs = ['java']
+        main.aidl.srcDirs = ['java']
+    }
+
+    lintOptions {
+        // TODO: fix errors and reenable.
+        abortOnError false
+    }
+
+    compileOptions {
+        sourceCompatibility JavaVersion.VERSION_1_7
+        targetCompatibility JavaVersion.VERSION_1_7
+    }
+}
+
+android.libraryVariants.all { variant ->
+    def name = variant.buildType.name
+
+    if (name.equals(com.android.builder.core.BuilderConstants.DEBUG)) {
+        return; // Skip debug builds.
+    }
+    def suffix = name.capitalize()
+
+    def jarTask = project.tasks.create(name: "jar${suffix}", type: Jar){
+        dependsOn variant.javaCompile
+        from variant.javaCompile.destinationDir
+        from 'LICENSE.txt'
+    }
+    def javadocTask = project.tasks.create(name: "javadoc${suffix}", type: Javadoc) {
+        source android.sourceSets.main.java
+        classpath = files(variant.javaCompile.classpath.files) + files(
+                "${android.sdkDirectory}/platforms/${android.compileSdkVersion}/android.jar")
+    }
+
+    def javadocJarTask = project.tasks.create(name: "javadocJar${suffix}", type: Jar) {
+        classifier = 'javadoc'
+        from 'build/docs/javadoc'
+    }
+
+    def sourcesJarTask = project.tasks.create(name: "sourceJar${suffix}", type: Jar) {
+        classifier = 'sources'
+        from android.sourceSets.main.java.srcDirs
+        exclude('android/content/pm/**')
+        exclude('android/service/media/**')
+    }
+
+    project.ext.allSS.each { ss ->
+        javadocTask.source ss.java
+        sourcesJarTask.from ss.java.srcDirs
+    }
+
+    artifacts.add('archives', javadocJarTask);
+    artifacts.add('archives', sourcesJarTask);
+}
+
+uploadArchives {
+    repositories {
+        mavenDeployer {
+            repository(url: uri(rootProject.ext.supportRepoOut)) {
+            }
+
+            pom.project {
+                name 'Android Support Library v4'
+                description "The Support Library is a static library that you can add to your Android application in order to use APIs that are either not available for older platform versions or utility APIs that aren't a part of the framework APIs. Compatible on devices running API 4 or later."
+                url 'http://developer.android.com/tools/extras/support-library.html'
+                inceptionYear '2011'
+
+                licenses {
+                    license {
+                        name 'The Apache Software License, Version 2.0'
+                        url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+                        distribution 'repo'
+                    }
+                }
+
+                scm {
+                    url "http://source.android.com"
+                    connection "scm:git:https://android.googlesource.com/platform/frameworks/support"
+                }
+                developers {
+                    developer {
+                        name 'The Android Open Source Project'
+                    }
+                }
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/v4/ics/android/support/v4/media/session/MediaSessionCompatApi14.java b/media-compat/ics/android/support/v4/media/session/MediaSessionCompatApi14.java
similarity index 100%
rename from v4/ics/android/support/v4/media/session/MediaSessionCompatApi14.java
rename to media-compat/ics/android/support/v4/media/session/MediaSessionCompatApi14.java
diff --git a/v4/java/android/support/v4/media/MediaBrowserCompat.java b/media-compat/java/android/support/v4/media/MediaBrowserCompat.java
similarity index 100%
rename from v4/java/android/support/v4/media/MediaBrowserCompat.java
rename to media-compat/java/android/support/v4/media/MediaBrowserCompat.java
diff --git a/v4/java/android/support/v4/media/MediaBrowserCompatUtils.java b/media-compat/java/android/support/v4/media/MediaBrowserCompatUtils.java
similarity index 100%
rename from v4/java/android/support/v4/media/MediaBrowserCompatUtils.java
rename to media-compat/java/android/support/v4/media/MediaBrowserCompatUtils.java
diff --git a/v4/java/android/support/v4/media/MediaBrowserProtocol.java b/media-compat/java/android/support/v4/media/MediaBrowserProtocol.java
similarity index 100%
rename from v4/java/android/support/v4/media/MediaBrowserProtocol.java
rename to media-compat/java/android/support/v4/media/MediaBrowserProtocol.java
diff --git a/media-compat/java/android/support/v4/media/MediaBrowserServiceCompat.java b/media-compat/java/android/support/v4/media/MediaBrowserServiceCompat.java
new file mode 100644
index 0000000..e9b773a
--- /dev/null
+++ b/media-compat/java/android/support/v4/media/MediaBrowserServiceCompat.java
@@ -0,0 +1,1194 @@
+/*
+ * Copyright (C) 2015 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 android.support.v4.media;
+
+import static android.support.v4.media.MediaBrowserProtocol.CLIENT_MSG_ADD_SUBSCRIPTION;
+import static android.support.v4.media.MediaBrowserProtocol.CLIENT_MSG_CONNECT;
+import static android.support.v4.media.MediaBrowserProtocol.CLIENT_MSG_DISCONNECT;
+import static android.support.v4.media.MediaBrowserProtocol.CLIENT_MSG_GET_MEDIA_ITEM;
+import static android.support.v4.media.MediaBrowserProtocol.CLIENT_MSG_REGISTER_CALLBACK_MESSENGER;
+import static android.support.v4.media.MediaBrowserProtocol.CLIENT_MSG_REMOVE_SUBSCRIPTION;
+import static android.support.v4.media.MediaBrowserProtocol.CLIENT_MSG_UNREGISTER_CALLBACK_MESSENGER;
+import static android.support.v4.media.MediaBrowserProtocol.DATA_CALLBACK_TOKEN;
+import static android.support.v4.media.MediaBrowserProtocol.DATA_CALLING_UID;
+import static android.support.v4.media.MediaBrowserProtocol.DATA_MEDIA_ITEM_ID;
+import static android.support.v4.media.MediaBrowserProtocol.DATA_MEDIA_ITEM_LIST;
+import static android.support.v4.media.MediaBrowserProtocol.DATA_MEDIA_SESSION_TOKEN;
+import static android.support.v4.media.MediaBrowserProtocol.DATA_OPTIONS;
+import static android.support.v4.media.MediaBrowserProtocol.DATA_PACKAGE_NAME;
+import static android.support.v4.media.MediaBrowserProtocol.DATA_RESULT_RECEIVER;
+import static android.support.v4.media.MediaBrowserProtocol.DATA_ROOT_HINTS;
+import static android.support.v4.media.MediaBrowserProtocol.EXTRA_CLIENT_VERSION;
+import static android.support.v4.media.MediaBrowserProtocol.EXTRA_MESSENGER_BINDER;
+import static android.support.v4.media.MediaBrowserProtocol.EXTRA_SERVICE_VERSION;
+import static android.support.v4.media.MediaBrowserProtocol.SERVICE_MSG_ON_CONNECT;
+import static android.support.v4.media.MediaBrowserProtocol.SERVICE_MSG_ON_CONNECT_FAILED;
+import static android.support.v4.media.MediaBrowserProtocol.SERVICE_MSG_ON_LOAD_CHILDREN;
+import static android.support.v4.media.MediaBrowserProtocol.SERVICE_VERSION_CURRENT;
+
+import android.app.Service;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.os.Binder;
+import android.os.Build;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.IBinder;
+import android.os.Message;
+import android.os.Messenger;
+import android.os.Parcel;
+import android.os.RemoteException;
+import android.support.annotation.IntDef;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.v4.app.BundleCompat;
+import android.support.v4.media.session.MediaSessionCompat;
+import android.support.v4.os.BuildCompat;
+import android.support.v4.os.ResultReceiver;
+import android.support.v4.util.ArrayMap;
+import android.support.v4.util.Pair;
+import android.text.TextUtils;
+import android.util.Log;
+
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * Base class for media browse services.
+ * <p>
+ * Media browse services enable applications to browse media content provided by an application
+ * and ask the application to start playing it. They may also be used to control content that
+ * is already playing by way of a {@link MediaSessionCompat}.
+ * </p>
+ *
+ * To extend this class, you must declare the service in your manifest file with
+ * an intent filter with the {@link #SERVICE_INTERFACE} action.
+ *
+ * For example:
+ * </p><pre>
+ * &lt;service android:name=".MyMediaBrowserServiceCompat"
+ *          android:label="&#64;string/service_name" >
+ *     &lt;intent-filter>
+ *         &lt;action android:name="android.media.browse.MediaBrowserService" />
+ *     &lt;/intent-filter>
+ * &lt;/service>
+ * </pre>
+ */
+public abstract class MediaBrowserServiceCompat extends Service {
+    private static final String TAG = "MBServiceCompat";
+    private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
+
+    private MediaBrowserServiceImpl mImpl;
+
+    /**
+     * The {@link Intent} that must be declared as handled by the service.
+     */
+    public static final String SERVICE_INTERFACE = "android.media.browse.MediaBrowserService";
+
+    /**
+     * A key for passing the MediaItem to the ResultReceiver in getItem.
+     *
+     * @hide
+     */
+    public static final String KEY_MEDIA_ITEM = "media_item";
+
+    private static final int RESULT_FLAG_OPTION_NOT_HANDLED = 0x00000001;
+
+    /** @hide */
+    @Retention(RetentionPolicy.SOURCE)
+    @IntDef(flag=true, value = { RESULT_FLAG_OPTION_NOT_HANDLED })
+    private @interface ResultFlags { }
+
+    private final ArrayMap<IBinder, ConnectionRecord> mConnections = new ArrayMap<>();
+    private ConnectionRecord mCurConnection;
+    private final ServiceHandler mHandler = new ServiceHandler();
+    MediaSessionCompat.Token mSession;
+
+    interface MediaBrowserServiceImpl {
+        void onCreate();
+        IBinder onBind(Intent intent);
+        void setSessionToken(MediaSessionCompat.Token token);
+        void notifyChildrenChanged(final String parentId, final Bundle options);
+        Bundle getBrowserRootHints();
+    }
+
+    class MediaBrowserServiceImplBase implements MediaBrowserServiceImpl {
+        private Messenger mMessenger;
+
+        @Override
+        public void onCreate() {
+            mMessenger = new Messenger(mHandler);
+        }
+
+        @Override
+        public IBinder onBind(Intent intent) {
+            if (SERVICE_INTERFACE.equals(intent.getAction())) {
+                return mMessenger.getBinder();
+            }
+            return null;
+        }
+
+        @Override
+        public void setSessionToken(final MediaSessionCompat.Token token) {
+            mHandler.post(new Runnable() {
+                @Override
+                public void run() {
+                    for (IBinder key : mConnections.keySet()) {
+                        ConnectionRecord connection = mConnections.get(key);
+                        try {
+                            connection.callbacks.onConnect(connection.root.getRootId(), token,
+                                    connection.root.getExtras());
+                        } catch (RemoteException e) {
+                            Log.w(TAG, "Connection for " + connection.pkg + " is no longer valid.");
+                            mConnections.remove(key);
+                        }
+                    }
+                }
+            });
+        }
+
+        @Override
+        public void notifyChildrenChanged(@NonNull final String parentId, final Bundle options) {
+            mHandler.post(new Runnable() {
+                @Override
+                public void run() {
+                    for (IBinder binder : mConnections.keySet()) {
+                        ConnectionRecord connection = mConnections.get(binder);
+                        List<Pair<IBinder, Bundle>> callbackList =
+                                connection.subscriptions.get(parentId);
+                        if (callbackList != null) {
+                            for (Pair<IBinder, Bundle> callback : callbackList) {
+                                if (MediaBrowserCompatUtils.hasDuplicatedItems(
+                                        options, callback.second)) {
+                                    performLoadChildren(parentId, connection, callback.second);
+                                }
+                            }
+                        }
+                    }
+                }
+            });
+        }
+
+        @Override
+        public Bundle getBrowserRootHints() {
+            if (mCurConnection == null) {
+                throw new IllegalStateException("This should be called inside of onLoadChildren or"
+                        + " onLoadItem methods");
+            }
+            return mCurConnection.rootHints == null ? null : new Bundle(mCurConnection.rootHints);
+        }
+    }
+
+    class MediaBrowserServiceImplApi21 implements MediaBrowserServiceImpl,
+            MediaBrowserServiceCompatApi21.ServiceCompatProxy {
+        Object mServiceObj;
+        Messenger mMessenger;
+
+        @Override
+        public void onCreate() {
+            mServiceObj = MediaBrowserServiceCompatApi21.createService(
+                    MediaBrowserServiceCompat.this, this);
+            MediaBrowserServiceCompatApi21.onCreate(mServiceObj);
+        }
+
+        @Override
+        public IBinder onBind(Intent intent) {
+            return MediaBrowserServiceCompatApi21.onBind(mServiceObj, intent);
+        }
+
+        @Override
+        public void setSessionToken(MediaSessionCompat.Token token) {
+            MediaBrowserServiceCompatApi21.setSessionToken(mServiceObj, token.getToken());
+        }
+
+        @Override
+        public void notifyChildrenChanged(final String parentId, final Bundle options) {
+            if (mMessenger == null) {
+                MediaBrowserServiceCompatApi21.notifyChildrenChanged(mServiceObj, parentId);
+            } else {
+                mHandler.post(new Runnable() {
+                    @Override
+                    public void run() {
+                        for (IBinder binder : mConnections.keySet()) {
+                            ConnectionRecord connection = mConnections.get(binder);
+                            List<Pair<IBinder, Bundle>> callbackList =
+                                    connection.subscriptions.get(parentId);
+                            if (callbackList != null) {
+                                for (Pair<IBinder, Bundle> callback : callbackList) {
+                                    if (MediaBrowserCompatUtils.hasDuplicatedItems(
+                                            options, callback.second)) {
+                                        performLoadChildren(parentId, connection, callback.second);
+                                    }
+                                }
+                            }
+                        }
+                    }
+                });
+            }
+        }
+
+        @Override
+        public Bundle getBrowserRootHints() {
+            if (mMessenger == null) {
+                // TODO: Handle getBrowserRootHints when connected with framework MediaBrowser.
+                return null;
+            }
+            if (mCurConnection == null) {
+                throw new IllegalStateException("This should be called inside of onLoadChildren or"
+                        + " onLoadItem methods");
+            }
+            return mCurConnection.rootHints == null ? null : new Bundle(mCurConnection.rootHints);
+        }
+
+        @Override
+        public MediaBrowserServiceCompatApi21.BrowserRoot onGetRoot(
+                String clientPackageName, int clientUid, Bundle rootHints) {
+            Bundle rootExtras = null;
+            if (rootHints != null && rootHints.getInt(EXTRA_CLIENT_VERSION, 0) != 0) {
+                rootHints.remove(EXTRA_CLIENT_VERSION);
+                mMessenger = new Messenger(mHandler);
+                rootExtras = new Bundle();
+                rootExtras.putInt(EXTRA_SERVICE_VERSION, SERVICE_VERSION_CURRENT);
+                BundleCompat.putBinder(rootExtras, EXTRA_MESSENGER_BINDER, mMessenger.getBinder());
+            }
+            BrowserRoot root = MediaBrowserServiceCompat.this.onGetRoot(
+                    clientPackageName, clientUid, rootHints);
+            if (root == null) {
+                return null;
+            }
+            if (rootExtras == null) {
+                rootExtras = root.getExtras();
+            } else if (root.getExtras() != null) {
+                rootExtras.putAll(root.getExtras());
+            }
+            return new MediaBrowserServiceCompatApi21.BrowserRoot(
+                    root.getRootId(), rootExtras);
+        }
+
+        @Override
+        public void onLoadChildren(String parentId,
+                final MediaBrowserServiceCompatApi21.ResultWrapper<List<Parcel>> resultWrapper) {
+            final Result<List<MediaBrowserCompat.MediaItem>> result
+                    = new Result<List<MediaBrowserCompat.MediaItem>>(parentId) {
+                @Override
+                void onResultSent(List<MediaBrowserCompat.MediaItem> list, @ResultFlags int flags) {
+                    List<Parcel> parcelList = null;
+                    if (list != null) {
+                        parcelList = new ArrayList<>();
+                        for (MediaBrowserCompat.MediaItem item : list) {
+                            Parcel parcel = Parcel.obtain();
+                            item.writeToParcel(parcel, 0);
+                            parcelList.add(parcel);
+                        }
+                    }
+                    resultWrapper.sendResult(parcelList);
+                }
+
+                @Override
+                public void detach() {
+                    resultWrapper.detach();
+                }
+            };
+            MediaBrowserServiceCompat.this.onLoadChildren(parentId, result);
+        }
+    }
+
+    class MediaBrowserServiceImplApi23 extends MediaBrowserServiceImplApi21 implements
+            MediaBrowserServiceCompatApi23.ServiceCompatProxy {
+        @Override
+        public void onCreate() {
+            mServiceObj = MediaBrowserServiceCompatApi23.createService(
+                    MediaBrowserServiceCompat.this, this);
+            MediaBrowserServiceCompatApi21.onCreate(mServiceObj);
+        }
+
+        @Override
+        public void onLoadItem(String itemId,
+                final MediaBrowserServiceCompatApi21.ResultWrapper<Parcel> resultWrapper) {
+            final Result<MediaBrowserCompat.MediaItem> result
+                    = new Result<MediaBrowserCompat.MediaItem>(itemId) {
+                @Override
+                void onResultSent(MediaBrowserCompat.MediaItem item, @ResultFlags int flags) {
+                    Parcel parcelItem = Parcel.obtain();
+                    item.writeToParcel(parcelItem, 0);
+                    resultWrapper.sendResult(parcelItem);
+                }
+
+                @Override
+                public void detach() {
+                    resultWrapper.detach();
+                }
+            };
+            MediaBrowserServiceCompat.this.onLoadItem(itemId, result);
+        }
+    }
+
+    class MediaBrowserServiceImplApi24 extends MediaBrowserServiceImplApi23 implements
+            MediaBrowserServiceCompatApi24.ServiceCompatProxy {
+        @Override
+        public void onCreate() {
+            mServiceObj = MediaBrowserServiceCompatApi24.createService(
+                    MediaBrowserServiceCompat.this, this);
+            MediaBrowserServiceCompatApi21.onCreate(mServiceObj);
+        }
+
+        @Override
+        public void notifyChildrenChanged(final String parentId, final Bundle options) {
+            if (options == null) {
+                MediaBrowserServiceCompatApi21.notifyChildrenChanged(mServiceObj, parentId);
+            } else {
+                MediaBrowserServiceCompatApi24.notifyChildrenChanged(mServiceObj, parentId,
+                        options);
+            }
+        }
+
+        @Override
+        public void onLoadChildren(String parentId,
+                final MediaBrowserServiceCompatApi24.ResultWrapper resultWrapper, Bundle options) {
+            final Result<List<MediaBrowserCompat.MediaItem>> result
+                    = new Result<List<MediaBrowserCompat.MediaItem>>(parentId) {
+                @Override
+                void onResultSent(List<MediaBrowserCompat.MediaItem> list, @ResultFlags int flags) {
+                    List<Parcel> parcelList = null;
+                    if (list != null) {
+                        parcelList = new ArrayList<>();
+                        for (MediaBrowserCompat.MediaItem item : list) {
+                            Parcel parcel = Parcel.obtain();
+                            item.writeToParcel(parcel, 0);
+                            parcelList.add(parcel);
+                        }
+                    }
+                    resultWrapper.sendResult(parcelList, flags);
+                }
+
+                @Override
+                public void detach() {
+                    resultWrapper.detach();
+                }
+            };
+            MediaBrowserServiceCompat.this.onLoadChildren(parentId, result, options);
+        }
+
+        @Override
+        public Bundle getBrowserRootHints() {
+            return MediaBrowserServiceCompatApi24.getBrowserRootHints(mServiceObj);
+        }
+    }
+
+    private final class ServiceHandler extends Handler {
+        private final ServiceBinderImpl mServiceBinderImpl = new ServiceBinderImpl();
+
+        @Override
+        public void handleMessage(Message msg) {
+            Bundle data = msg.getData();
+            switch (msg.what) {
+                case CLIENT_MSG_CONNECT:
+                    mServiceBinderImpl.connect(data.getString(DATA_PACKAGE_NAME),
+                            data.getInt(DATA_CALLING_UID), data.getBundle(DATA_ROOT_HINTS),
+                            new ServiceCallbacksCompat(msg.replyTo));
+                    break;
+                case CLIENT_MSG_DISCONNECT:
+                    mServiceBinderImpl.disconnect(new ServiceCallbacksCompat(msg.replyTo));
+                    break;
+                case CLIENT_MSG_ADD_SUBSCRIPTION:
+                    mServiceBinderImpl.addSubscription(data.getString(DATA_MEDIA_ITEM_ID),
+                            BundleCompat.getBinder(data, DATA_CALLBACK_TOKEN),
+                            data.getBundle(DATA_OPTIONS),
+                            new ServiceCallbacksCompat(msg.replyTo));
+                    break;
+                case CLIENT_MSG_REMOVE_SUBSCRIPTION:
+                    mServiceBinderImpl.removeSubscription(data.getString(DATA_MEDIA_ITEM_ID),
+                            BundleCompat.getBinder(data, DATA_CALLBACK_TOKEN),
+                            new ServiceCallbacksCompat(msg.replyTo));
+                    break;
+                case CLIENT_MSG_GET_MEDIA_ITEM:
+                    mServiceBinderImpl.getMediaItem(data.getString(DATA_MEDIA_ITEM_ID),
+                            (ResultReceiver) data.getParcelable(DATA_RESULT_RECEIVER),
+                            new ServiceCallbacksCompat(msg.replyTo));
+                    break;
+                case CLIENT_MSG_REGISTER_CALLBACK_MESSENGER:
+                    mServiceBinderImpl.registerCallbacks(new ServiceCallbacksCompat(msg.replyTo),
+                            data.getBundle(DATA_ROOT_HINTS));
+                    break;
+                case CLIENT_MSG_UNREGISTER_CALLBACK_MESSENGER:
+                    mServiceBinderImpl.unregisterCallbacks(new ServiceCallbacksCompat(msg.replyTo));
+                    break;
+                default:
+                    Log.w(TAG, "Unhandled message: " + msg
+                            + "\n  Service version: " + SERVICE_VERSION_CURRENT
+                            + "\n  Client version: " + msg.arg1);
+            }
+        }
+
+        @Override
+        public boolean sendMessageAtTime(Message msg, long uptimeMillis) {
+            // Binder.getCallingUid() in handleMessage will return the uid of this process.
+            // In order to get the right calling uid, Binder.getCallingUid() should be called here.
+            Bundle data = msg.getData();
+            data.setClassLoader(MediaBrowserCompat.class.getClassLoader());
+            data.putInt(DATA_CALLING_UID, Binder.getCallingUid());
+            return super.sendMessageAtTime(msg, uptimeMillis);
+        }
+
+        public void postOrRun(Runnable r) {
+            if (Thread.currentThread() == getLooper().getThread()) {
+                r.run();
+            } else {
+                post(r);
+            }
+        }
+    }
+
+    /**
+     * All the info about a connection.
+     */
+    private class ConnectionRecord {
+        String pkg;
+        Bundle rootHints;
+        ServiceCallbacks callbacks;
+        BrowserRoot root;
+        HashMap<String, List<Pair<IBinder, Bundle>>> subscriptions = new HashMap();
+    }
+
+    /**
+     * Completion handler for asynchronous callback methods in {@link MediaBrowserServiceCompat}.
+     * <p>
+     * Each of the methods that takes one of these to send the result must call
+     * {@link #sendResult} to respond to the caller with the given results. If those
+     * functions return without calling {@link #sendResult}, they must instead call
+     * {@link #detach} before returning, and then may call {@link #sendResult} when
+     * they are done. If more than one of those methods is called, an exception will
+     * be thrown.
+     *
+     * @see MediaBrowserServiceCompat#onLoadChildren
+     * @see MediaBrowserServiceCompat#onLoadItem
+     */
+    public static class Result<T> {
+        private Object mDebug;
+        private boolean mDetachCalled;
+        private boolean mSendResultCalled;
+        private int mFlags;
+
+        Result(Object debug) {
+            mDebug = debug;
+        }
+
+        /**
+         * Send the result back to the caller.
+         */
+        public void sendResult(T result) {
+            if (mSendResultCalled) {
+                throw new IllegalStateException("sendResult() called twice for: " + mDebug);
+            }
+            mSendResultCalled = true;
+            onResultSent(result, mFlags);
+        }
+
+        /**
+         * Detach this message from the current thread and allow the {@link #sendResult}
+         * call to happen later.
+         */
+        public void detach() {
+            if (mDetachCalled) {
+                throw new IllegalStateException("detach() called when detach() had already"
+                        + " been called for: " + mDebug);
+            }
+            if (mSendResultCalled) {
+                throw new IllegalStateException("detach() called when sendResult() had already"
+                        + " been called for: " + mDebug);
+            }
+            mDetachCalled = true;
+        }
+
+        boolean isDone() {
+            return mDetachCalled || mSendResultCalled;
+        }
+
+        void setFlags(@ResultFlags int flags) {
+            mFlags = flags;
+        }
+
+        /**
+         * Called when the result is sent, after assertions about not being called twice
+         * have happened.
+         */
+        void onResultSent(T result, @ResultFlags int flags) {
+        }
+    }
+
+    private class ServiceBinderImpl {
+        public void connect(final String pkg, final int uid, final Bundle rootHints,
+                final ServiceCallbacks callbacks) {
+
+            if (!isValidPackage(pkg, uid)) {
+                throw new IllegalArgumentException("Package/uid mismatch: uid=" + uid
+                        + " package=" + pkg);
+            }
+
+            mHandler.postOrRun(new Runnable() {
+                @Override
+                public void run() {
+                    final IBinder b = callbacks.asBinder();
+
+                    // Clear out the old subscriptions. We are getting new ones.
+                    mConnections.remove(b);
+
+                    final ConnectionRecord connection = new ConnectionRecord();
+                    connection.pkg = pkg;
+                    connection.rootHints = rootHints;
+                    connection.callbacks = callbacks;
+
+                    connection.root =
+                            MediaBrowserServiceCompat.this.onGetRoot(pkg, uid, rootHints);
+
+                    // If they didn't return something, don't allow this client.
+                    if (connection.root == null) {
+                        Log.i(TAG, "No root for client " + pkg + " from service "
+                                + getClass().getName());
+                        try {
+                            callbacks.onConnectFailed();
+                        } catch (RemoteException ex) {
+                            Log.w(TAG, "Calling onConnectFailed() failed. Ignoring. "
+                                    + "pkg=" + pkg);
+                        }
+                    } else {
+                        try {
+                            mConnections.put(b, connection);
+                            if (mSession != null) {
+                                callbacks.onConnect(connection.root.getRootId(),
+                                        mSession, connection.root.getExtras());
+                            }
+                        } catch (RemoteException ex) {
+                            Log.w(TAG, "Calling onConnect() failed. Dropping client. "
+                                    + "pkg=" + pkg);
+                            mConnections.remove(b);
+                        }
+                    }
+                }
+            });
+        }
+
+        public void disconnect(final ServiceCallbacks callbacks) {
+            mHandler.postOrRun(new Runnable() {
+                @Override
+                public void run() {
+                    final IBinder b = callbacks.asBinder();
+
+                    // Clear out the old subscriptions. We are getting new ones.
+                    final ConnectionRecord old = mConnections.remove(b);
+                    if (old != null) {
+                        // TODO
+                    }
+                }
+            });
+        }
+
+        public void addSubscription(final String id, final IBinder token, final Bundle options,
+                final ServiceCallbacks callbacks) {
+            mHandler.postOrRun(new Runnable() {
+                @Override
+                public void run() {
+                    final IBinder b = callbacks.asBinder();
+
+                    // Get the record for the connection
+                    final ConnectionRecord connection = mConnections.get(b);
+                    if (connection == null) {
+                        Log.w(TAG, "addSubscription for callback that isn't registered id="
+                                + id);
+                        return;
+                    }
+
+                    MediaBrowserServiceCompat.this.addSubscription(id, connection, token, options);
+                }
+            });
+        }
+
+        public void removeSubscription(final String id, final IBinder token,
+                final ServiceCallbacks callbacks) {
+            mHandler.postOrRun(new Runnable() {
+                @Override
+                public void run() {
+                    final IBinder b = callbacks.asBinder();
+
+                    ConnectionRecord connection = mConnections.get(b);
+                    if (connection == null) {
+                        Log.w(TAG, "removeSubscription for callback that isn't registered id="
+                                + id);
+                        return;
+                    }
+                    if (!MediaBrowserServiceCompat.this.removeSubscription(
+                            id, connection, token)) {
+                        Log.w(TAG, "removeSubscription called for " + id
+                                + " which is not subscribed");
+                    }
+                }
+            });
+        }
+
+        public void getMediaItem(final String mediaId, final ResultReceiver receiver,
+                final ServiceCallbacks callbacks) {
+            if (TextUtils.isEmpty(mediaId) || receiver == null) {
+                return;
+            }
+
+            mHandler.postOrRun(new Runnable() {
+                @Override
+                public void run() {
+                    final IBinder b = callbacks.asBinder();
+
+                    ConnectionRecord connection = mConnections.get(b);
+                    if (connection == null) {
+                        Log.w(TAG, "getMediaItem for callback that isn't registered id=" + mediaId);
+                        return;
+                    }
+                    performLoadItem(mediaId, connection, receiver);
+                }
+            });
+        }
+
+        // Used when {@link MediaBrowserProtocol#EXTRA_MESSENGER_BINDER} is used.
+        public void registerCallbacks(final ServiceCallbacks callbacks, final Bundle rootHints) {
+            mHandler.postOrRun(new Runnable() {
+                @Override
+                public void run() {
+                    final IBinder b = callbacks.asBinder();
+                    // Clear out the old subscriptions. We are getting new ones.
+                    mConnections.remove(b);
+
+                    final ConnectionRecord connection = new ConnectionRecord();
+                    connection.callbacks = callbacks;
+                    connection.rootHints = rootHints;
+                    mConnections.put(b, connection);
+                }
+            });
+        }
+
+        // Used when {@link MediaBrowserProtocol#EXTRA_MESSENGER_BINDER} is used.
+        public void unregisterCallbacks(final ServiceCallbacks callbacks) {
+            mHandler.postOrRun(new Runnable() {
+                @Override
+                public void run() {
+                    final IBinder b = callbacks.asBinder();
+                    mConnections.remove(b);
+                }
+            });
+        }
+    }
+
+    private interface ServiceCallbacks {
+        IBinder asBinder();
+        void onConnect(String root, MediaSessionCompat.Token session, Bundle extras)
+                throws RemoteException;
+        void onConnectFailed() throws RemoteException;
+        void onLoadChildren(String mediaId, List<MediaBrowserCompat.MediaItem> list, Bundle options)
+                throws RemoteException;
+    }
+
+    private class ServiceCallbacksCompat implements ServiceCallbacks {
+        final Messenger mCallbacks;
+
+        ServiceCallbacksCompat(Messenger callbacks) {
+            mCallbacks = callbacks;
+        }
+
+        @Override
+        public IBinder asBinder() {
+            return mCallbacks.getBinder();
+        }
+
+        @Override
+        public void onConnect(String root, MediaSessionCompat.Token session, Bundle extras)
+                throws RemoteException {
+            if (extras == null) {
+                extras = new Bundle();
+            }
+            extras.putInt(EXTRA_SERVICE_VERSION, SERVICE_VERSION_CURRENT);
+            Bundle data = new Bundle();
+            data.putString(DATA_MEDIA_ITEM_ID, root);
+            data.putParcelable(DATA_MEDIA_SESSION_TOKEN, session);
+            data.putBundle(DATA_ROOT_HINTS, extras);
+            sendRequest(SERVICE_MSG_ON_CONNECT, data);
+        }
+
+        @Override
+        public void onConnectFailed() throws RemoteException {
+            sendRequest(SERVICE_MSG_ON_CONNECT_FAILED, null);
+        }
+
+        @Override
+        public void onLoadChildren(String mediaId, List<MediaBrowserCompat.MediaItem> list,
+                Bundle options) throws RemoteException {
+            Bundle data = new Bundle();
+            data.putString(DATA_MEDIA_ITEM_ID, mediaId);
+            data.putBundle(DATA_OPTIONS, options);
+            if (list != null) {
+                data.putParcelableArrayList(DATA_MEDIA_ITEM_LIST,
+                        list instanceof ArrayList ? (ArrayList) list : new ArrayList<>(list));
+            }
+            sendRequest(SERVICE_MSG_ON_LOAD_CHILDREN, data);
+        }
+
+        private void sendRequest(int what, Bundle data) throws RemoteException {
+            Message msg = Message.obtain();
+            msg.what = what;
+            msg.arg1 = SERVICE_VERSION_CURRENT;
+            msg.setData(data);
+            mCallbacks.send(msg);
+        }
+    }
+
+    @Override
+    public void onCreate() {
+        super.onCreate();
+        if (Build.VERSION.SDK_INT >= 24 || BuildCompat.isAtLeastN()) {
+            mImpl = new MediaBrowserServiceImplApi24();
+        } else if (Build.VERSION.SDK_INT >= 23) {
+            mImpl = new MediaBrowserServiceImplApi23();
+        } else if (Build.VERSION.SDK_INT >= 21) {
+            mImpl = new MediaBrowserServiceImplApi21();
+        } else {
+            mImpl = new MediaBrowserServiceImplBase();
+        }
+        mImpl.onCreate();
+    }
+
+    @Override
+    public IBinder onBind(Intent intent) {
+        return mImpl.onBind(intent);
+    }
+
+    @Override
+    public void dump(FileDescriptor fd, PrintWriter writer, String[] args) {
+    }
+
+    /**
+     * Called to get the root information for browsing by a particular client.
+     * <p>
+     * The implementation should verify that the client package has permission
+     * to access browse media information before returning the root id; it
+     * should return null if the client is not allowed to access this
+     * information.
+     * </p>
+     *
+     * @param clientPackageName The package name of the application which is
+     *            requesting access to browse media.
+     * @param clientUid The uid of the application which is requesting access to
+     *            browse media.
+     * @param rootHints An optional bundle of service-specific arguments to send
+     *            to the media browse service when connecting and retrieving the
+     *            root id for browsing, or null if none. The contents of this
+     *            bundle may affect the information returned when browsing.
+     * @return The {@link BrowserRoot} for accessing this app's content or null.
+     * @see BrowserRoot#EXTRA_RECENT
+     * @see BrowserRoot#EXTRA_OFFLINE
+     * @see BrowserRoot#EXTRA_SUGGESTED
+     */
+    public abstract @Nullable BrowserRoot onGetRoot(@NonNull String clientPackageName,
+            int clientUid, @Nullable Bundle rootHints);
+
+    /**
+     * Called to get information about the children of a media item.
+     * <p>
+     * Implementations must call {@link Result#sendResult result.sendResult}
+     * with the list of children. If loading the children will be an expensive
+     * operation that should be performed on another thread,
+     * {@link Result#detach result.detach} may be called before returning from
+     * this function, and then {@link Result#sendResult result.sendResult}
+     * called when the loading is complete.
+     *
+     * @param parentId The id of the parent media item whose children are to be
+     *            queried.
+     * @param result The Result to send the list of children to, or null if the
+     *            id is invalid.
+     */
+    public abstract void onLoadChildren(@NonNull String parentId,
+            @NonNull Result<List<MediaBrowserCompat.MediaItem>> result);
+
+    /**
+     * Called to get information about the children of a media item.
+     * <p>
+     * Implementations must call {@link Result#sendResult result.sendResult}
+     * with the list of children. If loading the children will be an expensive
+     * operation that should be performed on another thread,
+     * {@link Result#detach result.detach} may be called before returning from
+     * this function, and then {@link Result#sendResult result.sendResult}
+     * called when the loading is complete.
+     *
+     * @param parentId The id of the parent media item whose children are to be
+     *            queried.
+     * @param result The Result to send the list of children to, or null if the
+     *            id is invalid.
+     * @param options A bundle of service-specific arguments sent from the media
+     *            browse. The information returned through the result should be
+     *            affected by the contents of this bundle.
+     */
+    public void onLoadChildren(@NonNull String parentId,
+            @NonNull Result<List<MediaBrowserCompat.MediaItem>> result, @NonNull Bundle options) {
+        // To support backward compatibility, when the implementation of MediaBrowserService doesn't
+        // override onLoadChildren() with options, onLoadChildren() without options will be used
+        // instead, and the options will be applied in the implementation of result.onResultSent().
+        result.setFlags(RESULT_FLAG_OPTION_NOT_HANDLED);
+        onLoadChildren(parentId, result);
+    }
+
+    /**
+     * Called to get information about a specific media item.
+     * <p>
+     * Implementations must call {@link Result#sendResult result.sendResult}. If
+     * loading the item will be an expensive operation {@link Result#detach
+     * result.detach} may be called before returning from this function, and
+     * then {@link Result#sendResult result.sendResult} called when the item has
+     * been loaded.
+     * <p>
+     * The default implementation sends a null result.
+     *
+     * @param itemId The id for the specific {@link MediaBrowserCompat.MediaItem}.
+     * @param result The Result to send the item to, or null if the id is
+     *            invalid.
+     */
+    public void onLoadItem(String itemId, Result<MediaBrowserCompat.MediaItem> result) {
+        result.sendResult(null);
+    }
+
+    /**
+     * Call to set the media session.
+     * <p>
+     * This should be called as soon as possible during the service's startup.
+     * It may only be called once.
+     *
+     * @param token The token for the service's {@link MediaSessionCompat}.
+     */
+    public void setSessionToken(MediaSessionCompat.Token token) {
+        if (token == null) {
+            throw new IllegalArgumentException("Session token may not be null.");
+        }
+        if (mSession != null) {
+            throw new IllegalStateException("The session token has already been set.");
+        }
+        mSession = token;
+        mImpl.setSessionToken(token);
+    }
+
+    /**
+     * Gets the session token, or null if it has not yet been created
+     * or if it has been destroyed.
+     */
+    public @Nullable MediaSessionCompat.Token getSessionToken() {
+        return mSession;
+    }
+
+    /**
+     * Gets the root hints sent from the currently connected {@link MediaBrowserCompat}.
+     * The root hints are service-specific arguments included in an optional bundle sent to the
+     * media browser service when connecting and retrieving the root id for browsing, or null if
+     * none. The contents of this bundle may affect the information returned when browsing.
+     * <p>
+     * Note that this will return null when connected to {@link android.media.browse.MediaBrowser}
+     * and running on API 23 or lower.
+     *
+     * @throws IllegalStateException If this method is called outside of {@link #onLoadChildren}
+     *             or {@link #onLoadItem}
+     * @see MediaBrowserServiceCompat.BrowserRoot#EXTRA_RECENT
+     * @see MediaBrowserServiceCompat.BrowserRoot#EXTRA_OFFLINE
+     * @see MediaBrowserServiceCompat.BrowserRoot#EXTRA_SUGGESTED
+     */
+    public final Bundle getBrowserRootHints() {
+        return mImpl.getBrowserRootHints();
+    }
+
+    /**
+     * Notifies all connected media browsers that the children of
+     * the specified parent id have changed in some way.
+     * This will cause browsers to fetch subscribed content again.
+     *
+     * @param parentId The id of the parent media item whose
+     * children changed.
+     */
+    public void notifyChildrenChanged(@NonNull String parentId) {
+        if (parentId == null) {
+            throw new IllegalArgumentException("parentId cannot be null in notifyChildrenChanged");
+        }
+        mImpl.notifyChildrenChanged(parentId, null);
+    }
+
+    /**
+     * Notifies all connected media browsers that the children of
+     * the specified parent id have changed in some way.
+     * This will cause browsers to fetch subscribed content again.
+     *
+     * @param parentId The id of the parent media item whose
+     *            children changed.
+     * @param options A bundle of service-specific arguments to send
+     *            to the media browse. The contents of this bundle may
+     *            contain the information about the change.
+     */
+    public void notifyChildrenChanged(@NonNull String parentId, @NonNull Bundle options) {
+        if (parentId == null) {
+            throw new IllegalArgumentException("parentId cannot be null in notifyChildrenChanged");
+        }
+        if (options == null) {
+            throw new IllegalArgumentException("options cannot be null in notifyChildrenChanged");
+        }
+        mImpl.notifyChildrenChanged(parentId, options);
+    }
+
+    /**
+     * Return whether the given package is one of the ones that is owned by the uid.
+     */
+    private boolean isValidPackage(String pkg, int uid) {
+        if (pkg == null) {
+            return false;
+        }
+        final PackageManager pm = getPackageManager();
+        final String[] packages = pm.getPackagesForUid(uid);
+        final int N = packages.length;
+        for (int i=0; i<N; i++) {
+            if (packages[i].equals(pkg)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Save the subscription and if it is a new subscription send the results.
+     */
+    private void addSubscription(String id, ConnectionRecord connection, IBinder token,
+            Bundle options) {
+        // Save the subscription
+        List<Pair<IBinder, Bundle>> callbackList = connection.subscriptions.get(id);
+        if (callbackList == null) {
+            callbackList = new ArrayList<>();
+        }
+        for (Pair<IBinder, Bundle> callback : callbackList) {
+            if (token == callback.first
+                    && MediaBrowserCompatUtils.areSameOptions(options, callback.second)) {
+                return;
+            }
+        }
+        callbackList.add(new Pair<>(token, options));
+        connection.subscriptions.put(id, callbackList);
+        // send the results
+        performLoadChildren(id, connection, options);
+    }
+
+    /**
+     * Remove the subscription.
+     */
+    private boolean removeSubscription(String id, ConnectionRecord connection, IBinder token) {
+        if (token == null) {
+            return connection.subscriptions.remove(id) != null;
+        }
+        boolean removed = false;
+        List<Pair<IBinder, Bundle>> callbackList = connection.subscriptions.get(id);
+        if (callbackList != null) {
+            for (Pair<IBinder, Bundle> callback : callbackList) {
+                if (token == callback.first) {
+                    removed = true;
+                    callbackList.remove(callback);
+                }
+            }
+            if (callbackList.size() == 0) {
+                connection.subscriptions.remove(id);
+            }
+        }
+        return removed;
+    }
+
+    /**
+     * Call onLoadChildren and then send the results back to the connection.
+     * <p>
+     * Callers must make sure that this connection is still connected.
+     */
+    private void performLoadChildren(final String parentId, final ConnectionRecord connection,
+            final Bundle options) {
+        final Result<List<MediaBrowserCompat.MediaItem>> result
+                = new Result<List<MediaBrowserCompat.MediaItem>>(parentId) {
+            @Override
+            void onResultSent(List<MediaBrowserCompat.MediaItem> list, @ResultFlags int flags) {
+                if (mConnections.get(connection.callbacks.asBinder()) != connection) {
+                    if (DEBUG) {
+                        Log.d(TAG, "Not sending onLoadChildren result for connection that has"
+                                + " been disconnected. pkg=" + connection.pkg + " id=" + parentId);
+                    }
+                    return;
+                }
+
+                List<MediaBrowserCompat.MediaItem> filteredList =
+                        (flags & RESULT_FLAG_OPTION_NOT_HANDLED) != 0
+                                ? applyOptions(list, options) : list;
+                try {
+                    connection.callbacks.onLoadChildren(parentId, filteredList, options);
+                } catch (RemoteException ex) {
+                    // The other side is in the process of crashing.
+                    Log.w(TAG, "Calling onLoadChildren() failed for id=" + parentId
+                            + " package=" + connection.pkg);
+                }
+            }
+        };
+
+        mCurConnection = connection;
+        if (options == null) {
+            onLoadChildren(parentId, result);
+        } else {
+            onLoadChildren(parentId, result, options);
+        }
+        mCurConnection = null;
+
+        if (!result.isDone()) {
+            throw new IllegalStateException("onLoadChildren must call detach() or sendResult()"
+                    + " before returning for package=" + connection.pkg + " id=" + parentId);
+        }
+    }
+
+    private List<MediaBrowserCompat.MediaItem> applyOptions(List<MediaBrowserCompat.MediaItem> list,
+            final Bundle options) {
+        if (list == null) {
+            return null;
+        }
+        int page = options.getInt(MediaBrowserCompat.EXTRA_PAGE, -1);
+        int pageSize = options.getInt(MediaBrowserCompat.EXTRA_PAGE_SIZE, -1);
+        if (page == -1 && pageSize == -1) {
+            return list;
+        }
+        int fromIndex = pageSize * page;
+        int toIndex = fromIndex + pageSize;
+        if (page < 0 || pageSize < 1 || fromIndex >= list.size()) {
+            return Collections.EMPTY_LIST;
+        }
+        if (toIndex > list.size()) {
+            toIndex = list.size();
+        }
+        return list.subList(fromIndex, toIndex);
+    }
+
+    private void performLoadItem(String itemId, ConnectionRecord connection,
+            final ResultReceiver receiver) {
+        final Result<MediaBrowserCompat.MediaItem> result =
+                new Result<MediaBrowserCompat.MediaItem>(itemId) {
+                    @Override
+                    void onResultSent(MediaBrowserCompat.MediaItem item, @ResultFlags int flags) {
+                        Bundle bundle = new Bundle();
+                        bundle.putParcelable(KEY_MEDIA_ITEM, item);
+                        receiver.send(0, bundle);
+                    }
+                };
+
+        mCurConnection = connection;
+        onLoadItem(itemId, result);
+        mCurConnection = null;
+
+        if (!result.isDone()) {
+            throw new IllegalStateException("onLoadItem must call detach() or sendResult()"
+                    + " before returning for id=" + itemId);
+        }
+    }
+
+    /**
+     * Contains information that the browser service needs to send to the client
+     * when first connected.
+     */
+    public static final class BrowserRoot {
+        /**
+         * The lookup key for a boolean that indicates whether the browser service should return a
+         * browser root for recently played media items.
+         *
+         * <p>When creating a media browser for a given media browser service, this key can be
+         * supplied as a root hint for retrieving media items that are recently played.
+         * If the media browser service can provide such media items, the implementation must return
+         * the key in the root hint when {@link #onGetRoot(String, int, Bundle)} is called back.
+         *
+         * <p>The root hint may contain multiple keys.
+         *
+         * @see #EXTRA_OFFLINE
+         * @see #EXTRA_SUGGESTED
+         */
+        public static final String EXTRA_RECENT = "android.service.media.extra.RECENT";
+
+        /**
+         * The lookup key for a boolean that indicates whether the browser service should return a
+         * browser root for offline media items.
+         *
+         * <p>When creating a media browser for a given media browser service, this key can be
+         * supplied as a root hint for retrieving media items that are can be played without an
+         * internet connection.
+         * If the media browser service can provide such media items, the implementation must return
+         * the key in the root hint when {@link #onGetRoot(String, int, Bundle)} is called back.
+         *
+         * <p>The root hint may contain multiple keys.
+         *
+         * @see #EXTRA_RECENT
+         * @see #EXTRA_SUGGESTED
+         */
+        public static final String EXTRA_OFFLINE = "android.service.media.extra.OFFLINE";
+
+        /**
+         * The lookup key for a boolean that indicates whether the browser service should return a
+         * browser root for suggested media items.
+         *
+         * <p>When creating a media browser for a given media browser service, this key can be
+         * supplied as a root hint for retrieving the media items suggested by the media browser
+         * service. The list of media items passed in {@link android.support.v4.media.MediaBrowserCompat.SubscriptionCallback#onChildrenLoaded(String, List)}
+         * is considered ordered by relevance, first being the top suggestion.
+         * If the media browser service can provide such media items, the implementation must return
+         * the key in the root hint when {@link #onGetRoot(String, int, Bundle)} is called back.
+         *
+         * <p>The root hint may contain multiple keys.
+         *
+         * @see #EXTRA_RECENT
+         * @see #EXTRA_OFFLINE
+         */
+        public static final String EXTRA_SUGGESTED = "android.service.media.extra.SUGGESTED";
+
+        final private String mRootId;
+        final private Bundle mExtras;
+
+        /**
+         * Constructs a browser root.
+         * @param rootId The root id for browsing.
+         * @param extras Any extras about the browser service.
+         */
+        public BrowserRoot(@NonNull String rootId, @Nullable Bundle extras) {
+            if (rootId == null) {
+                throw new IllegalArgumentException("The root id in BrowserRoot cannot be null. " +
+                        "Use null for BrowserRoot instead.");
+            }
+            mRootId = rootId;
+            mExtras = extras;
+        }
+
+        /**
+         * Gets the root id for browsing.
+         */
+        public String getRootId() {
+            return mRootId;
+        }
+
+        /**
+         * Gets any extras about the browser service.
+         */
+        public Bundle getExtras() {
+            return mExtras;
+        }
+    }
+}
diff --git a/v4/java/android/support/v4/media/MediaDescriptionCompat.java b/media-compat/java/android/support/v4/media/MediaDescriptionCompat.java
similarity index 100%
rename from v4/java/android/support/v4/media/MediaDescriptionCompat.java
rename to media-compat/java/android/support/v4/media/MediaDescriptionCompat.java
diff --git a/v4/java/android/support/v4/media/MediaMetadataCompat.aidl b/media-compat/java/android/support/v4/media/MediaMetadataCompat.aidl
similarity index 100%
rename from v4/java/android/support/v4/media/MediaMetadataCompat.aidl
rename to media-compat/java/android/support/v4/media/MediaMetadataCompat.aidl
diff --git a/v4/java/android/support/v4/media/MediaMetadataCompat.java b/media-compat/java/android/support/v4/media/MediaMetadataCompat.java
similarity index 100%
rename from v4/java/android/support/v4/media/MediaMetadataCompat.java
rename to media-compat/java/android/support/v4/media/MediaMetadataCompat.java
diff --git a/v4/java/android/support/v4/media/RatingCompat.aidl b/media-compat/java/android/support/v4/media/RatingCompat.aidl
similarity index 100%
rename from v4/java/android/support/v4/media/RatingCompat.aidl
rename to media-compat/java/android/support/v4/media/RatingCompat.aidl
diff --git a/v4/java/android/support/v4/media/RatingCompat.java b/media-compat/java/android/support/v4/media/RatingCompat.java
similarity index 100%
rename from v4/java/android/support/v4/media/RatingCompat.java
rename to media-compat/java/android/support/v4/media/RatingCompat.java
diff --git a/v4/java/android/support/v4/media/TransportController.java b/media-compat/java/android/support/v4/media/TransportController.java
similarity index 100%
rename from v4/java/android/support/v4/media/TransportController.java
rename to media-compat/java/android/support/v4/media/TransportController.java
diff --git a/media-compat/java/android/support/v4/media/TransportMediator.java b/media-compat/java/android/support/v4/media/TransportMediator.java
new file mode 100644
index 0000000..177f6aa
--- /dev/null
+++ b/media-compat/java/android/support/v4/media/TransportMediator.java
@@ -0,0 +1,346 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.support.v4.media;
+
+import android.app.Activity;
+import android.content.Context;
+import android.media.AudioManager;
+import android.os.Build;
+import android.view.KeyEvent;
+import android.view.View;
+
+import java.util.ArrayList;
+
+/**
+ * Helper for implementing a media transport control (with play, pause, skip, and
+ * other media actions).  Takes care of both key events and advanced features
+ * like {@link android.media.RemoteControlClient}.  This class is intended to
+ * serve as an intermediary between transport controls (whether they be on-screen
+ * controls, hardware buttons, remote controls) and the actual player.  The player
+ * is represented by a single {@link TransportPerformer} that must be supplied to
+ * this class.  On-screen controls that want to control and show the state of the
+ * player should do this through calls to the {@link TransportController} interface.
+ *
+ * <p>Here is a simple but fairly complete sample of a video player that is built
+ * around this class.  Note that the MediaController class used here is not the one
+ * included in the standard Android framework, but a custom implementation.  Real
+ * applications often implement their own transport controls, or you can copy the
+ * implementation here out of Support4Demos.</p>
+ *
+ * {@sample frameworks/support/samples/Support4Demos/src/com/example/android/supportv4/media/TransportControllerActivity.java
+ *      complete}
+ */
+public class TransportMediator extends TransportController {
+    final Context mContext;
+    final TransportPerformer mCallbacks;
+    final AudioManager mAudioManager;
+    final View mView;
+    final Object mDispatcherState;
+    final TransportMediatorJellybeanMR2 mController;
+    final ArrayList<TransportStateListener> mListeners
+            = new ArrayList<TransportStateListener>();
+    final TransportMediatorCallback mTransportKeyCallback
+            = new TransportMediatorCallback() {
+        @Override
+        public void handleKey(KeyEvent key) {
+            key.dispatch(mKeyEventCallback);
+        }
+        @Override
+        public void handleAudioFocusChange(int focusChange) {
+            mCallbacks.onAudioFocusChange(focusChange);
+        }
+
+        @Override
+        public long getPlaybackPosition() {
+            return mCallbacks.onGetCurrentPosition();
+        }
+
+        @Override
+        public void playbackPositionUpdate(long newPositionMs) {
+            mCallbacks.onSeekTo(newPositionMs);
+        }
+    };
+
+    /** Synonym for {@link KeyEvent#KEYCODE_MEDIA_PLAY KeyEvent.KEYCODE_MEDIA_PLAY} */
+    public static final int KEYCODE_MEDIA_PLAY = 126;
+    /** Synonym for {@link KeyEvent#KEYCODE_MEDIA_PAUSE KeyEvent.KEYCODE_MEDIA_PAUSE} */
+    public static final int KEYCODE_MEDIA_PAUSE = 127;
+    /** Synonym for {@link KeyEvent#KEYCODE_MEDIA_RECORD KeyEvent.KEYCODE_MEDIA_RECORD} */
+    public static final int KEYCODE_MEDIA_RECORD = 130;
+
+    /** Synonym for {@link android.media.RemoteControlClient#FLAG_KEY_MEDIA_PREVIOUS
+     * RemoteControlClient.FLAG_KEY_MEDIA_PREVIOUS */
+    public final static int FLAG_KEY_MEDIA_PREVIOUS = 1 << 0;
+    /** Synonym for {@link android.media.RemoteControlClient#FLAG_KEY_MEDIA_REWIND
+     * RemoteControlClient.FLAG_KEY_MEDIA_REWIND */
+    public final static int FLAG_KEY_MEDIA_REWIND = 1 << 1;
+    /** Synonym for {@link android.media.RemoteControlClient#FLAG_KEY_MEDIA_PLAY
+     * RemoteControlClient.FLAG_KEY_MEDIA_PLAY */
+    public final static int FLAG_KEY_MEDIA_PLAY = 1 << 2;
+    /** Synonym for {@link android.media.RemoteControlClient#FLAG_KEY_MEDIA_PLAY_PAUSE
+     * RemoteControlClient.FLAG_KEY_MEDIA_PLAY_PAUSE */
+    public final static int FLAG_KEY_MEDIA_PLAY_PAUSE = 1 << 3;
+    /** Synonym for {@link android.media.RemoteControlClient#FLAG_KEY_MEDIA_PAUSE
+     * RemoteControlClient.FLAG_KEY_MEDIA_PAUSE */
+    public final static int FLAG_KEY_MEDIA_PAUSE = 1 << 4;
+    /** Synonym for {@link android.media.RemoteControlClient#FLAG_KEY_MEDIA_STOP
+     * RemoteControlClient.FLAG_KEY_MEDIA_STOP */
+    public final static int FLAG_KEY_MEDIA_STOP = 1 << 5;
+    /** Synonym for {@link android.media.RemoteControlClient#FLAG_KEY_MEDIA_FAST_FORWARD
+     * RemoteControlClient.FLAG_KEY_MEDIA_FAST_FORWARD */
+    public final static int FLAG_KEY_MEDIA_FAST_FORWARD = 1 << 6;
+    /** Synonym for {@link android.media.RemoteControlClient#FLAG_KEY_MEDIA_NEXT
+     * RemoteControlClient.FLAG_KEY_MEDIA_NEXT */
+    public final static int FLAG_KEY_MEDIA_NEXT = 1 << 7;
+
+    static boolean isMediaKey(int keyCode) {
+        switch (keyCode) {
+            case KEYCODE_MEDIA_PLAY:
+            case KEYCODE_MEDIA_PAUSE:
+            case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE:
+            case KeyEvent.KEYCODE_MUTE:
+            case KeyEvent.KEYCODE_HEADSETHOOK:
+            case KeyEvent.KEYCODE_MEDIA_STOP:
+            case KeyEvent.KEYCODE_MEDIA_NEXT:
+            case KeyEvent.KEYCODE_MEDIA_PREVIOUS:
+            case KeyEvent.KEYCODE_MEDIA_REWIND:
+            case KEYCODE_MEDIA_RECORD:
+            case KeyEvent.KEYCODE_MEDIA_FAST_FORWARD: {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    final KeyEvent.Callback mKeyEventCallback = new KeyEvent.Callback() {
+        @Override
+        public boolean onKeyDown(int keyCode, KeyEvent event) {
+            return isMediaKey(keyCode) ? mCallbacks.onMediaButtonDown(keyCode, event) : false;
+        }
+
+        @Override
+        public boolean onKeyLongPress(int keyCode, KeyEvent event) {
+            return false;
+        }
+
+        @Override
+        public boolean onKeyUp(int keyCode, KeyEvent event) {
+            return isMediaKey(keyCode) ? mCallbacks.onMediaButtonUp(keyCode, event) : false;
+        }
+
+        @Override
+        public boolean onKeyMultiple(int keyCode, int count, KeyEvent event) {
+            return false;
+        }
+    };
+
+    public TransportMediator(Activity activity, TransportPerformer callbacks) {
+        this(activity, null, callbacks);
+    }
+
+    public TransportMediator(View view, TransportPerformer callbacks) {
+        this(null, view, callbacks);
+    }
+
+    private TransportMediator(Activity activity, View view, TransportPerformer callbacks) {
+        mContext = activity != null ? activity : view.getContext();
+        mCallbacks = callbacks;
+        mAudioManager = (AudioManager)mContext.getSystemService(Context.AUDIO_SERVICE);
+        mView = activity != null ? activity.getWindow().getDecorView() : view;
+        mDispatcherState = mView.getKeyDispatcherState();
+        if (Build.VERSION.SDK_INT >= 18) { // JellyBean MR2
+            mController = new TransportMediatorJellybeanMR2(mContext, mAudioManager,
+                    mView, mTransportKeyCallback);
+        } else {
+            mController = null;
+        }
+    }
+
+    /**
+     * Return the {@link android.media.RemoteControlClient} associated with this transport.
+     * This returns a generic Object since the RemoteControlClient is not availble before
+     * {@link android.os.Build.VERSION_CODES#ICE_CREAM_SANDWICH}.  Further, this class
+     * will not use RemoteControlClient in its implementation until
+     * {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}.  You should always check for
+     * null here and not do anything with the RemoteControlClient if none is given; this
+     * way you don't need to worry about the current platform API version.
+     *
+     * <p>Note that this class takes possession of the
+     * {@link android.media.RemoteControlClient.OnGetPlaybackPositionListener} and
+     * {@link android.media.RemoteControlClient.OnPlaybackPositionUpdateListener} callbacks;
+     * you will interact with these through
+     * {@link TransportPerformer#onGetCurrentPosition() TransportPerformer.onGetCurrentPosition} and
+     * {@link TransportPerformer#onSeekTo TransportPerformer.onSeekTo}, respectively.</p>
+     */
+    public Object getRemoteControlClient() {
+        return mController != null ? mController.getRemoteControlClient() : null;
+    }
+
+    /**
+     * Must call from {@link Activity#dispatchKeyEvent Activity.dispatchKeyEvent} to give
+     * the transport an opportunity to intercept media keys.  Any such keys will show up
+     * in {@link TransportPerformer}.
+     * @param event
+     */
+    public boolean dispatchKeyEvent(KeyEvent event) {
+        return event.dispatch(mKeyEventCallback, (KeyEvent.DispatcherState) mDispatcherState, this);
+    }
+
+    @Override
+    public void registerStateListener(TransportStateListener listener) {
+        mListeners.add(listener);
+    }
+
+    @Override
+    public void unregisterStateListener(TransportStateListener listener) {
+        mListeners.remove(listener);
+    }
+
+    private TransportStateListener[] getListeners() {
+        if (mListeners.size() <= 0) {
+            return null;
+        }
+        TransportStateListener listeners[] = new TransportStateListener[mListeners.size()];
+        mListeners.toArray(listeners);
+        return listeners;
+    }
+
+    private void reportPlayingChanged() {
+        TransportStateListener[] listeners = getListeners();
+        if (listeners != null) {
+            for (TransportStateListener listener : listeners) {
+                listener.onPlayingChanged(this);
+            }
+        }
+    }
+
+    private void reportTransportControlsChanged() {
+        TransportStateListener[] listeners = getListeners();
+        if (listeners != null) {
+            for (TransportStateListener listener : listeners) {
+                listener.onTransportControlsChanged(this);
+            }
+        }
+    }
+
+    private void pushControllerState() {
+        if (mController != null) {
+            mController.refreshState(mCallbacks.onIsPlaying(),
+                    mCallbacks.onGetCurrentPosition(),
+                    mCallbacks.onGetTransportControlFlags());
+        }
+    }
+
+    public void refreshState() {
+        pushControllerState();
+        reportPlayingChanged();
+        reportTransportControlsChanged();
+    }
+
+    /**
+     * Move the controller into the playing state.  This updates the remote control
+     * client to indicate it is playing, and takes audio focus for the app.
+     */
+    @Override
+    public void startPlaying() {
+        if (mController != null) {
+            mController.startPlaying();
+        }
+        mCallbacks.onStart();
+        pushControllerState();
+        reportPlayingChanged();
+    }
+
+    /**
+     * Move the controller into the paused state.  This updates the remote control
+     * client to indicate it is paused, but keeps audio focus.
+     */
+    @Override
+    public void pausePlaying() {
+        if (mController != null) {
+            mController.pausePlaying();
+        }
+        mCallbacks.onPause();
+        pushControllerState();
+        reportPlayingChanged();
+    }
+
+    /**
+     * Move the controller into the stopped state.  This updates the remote control
+     * client to indicate it is stopped, and removes audio focus from the app.
+     */
+    @Override
+    public void stopPlaying() {
+        if (mController != null) {
+            mController.stopPlaying();
+        }
+        mCallbacks.onStop();
+        pushControllerState();
+        reportPlayingChanged();
+    }
+
+    @Override
+    public long getDuration() {
+        return mCallbacks.onGetDuration();
+    }
+
+    @Override
+    public long getCurrentPosition() {
+        return mCallbacks.onGetCurrentPosition();
+    }
+
+    @Override
+    public void seekTo(long pos) {
+        mCallbacks.onSeekTo(pos);
+    }
+
+    @Override
+    public boolean isPlaying() {
+        return mCallbacks.onIsPlaying();
+    }
+
+    @Override
+    public int getBufferPercentage() {
+        return mCallbacks.onGetBufferPercentage();
+    }
+
+    /**
+     * Retrieves the flags for the media transport control buttons that this transport supports.
+     * Result is a combination of the following flags:
+     *      {@link #FLAG_KEY_MEDIA_PREVIOUS},
+     *      {@link #FLAG_KEY_MEDIA_REWIND},
+     *      {@link #FLAG_KEY_MEDIA_PLAY},
+     *      {@link #FLAG_KEY_MEDIA_PLAY_PAUSE},
+     *      {@link #FLAG_KEY_MEDIA_PAUSE},
+     *      {@link #FLAG_KEY_MEDIA_STOP},
+     *      {@link #FLAG_KEY_MEDIA_FAST_FORWARD},
+     *      {@link #FLAG_KEY_MEDIA_NEXT}
+     */
+    @Override
+    public int getTransportControlFlags() {
+        return mCallbacks.onGetTransportControlFlags();
+    }
+
+    /**
+     * Optionally call when no longer using the TransportController.  Its resources
+     * will also be automatically cleaned up when your activity/view is detached from
+     * its window, so you don't normally need to call this explicitly.
+     */
+    public void destroy() {
+        mController.destroy();
+    }
+}
diff --git a/v4/java/android/support/v4/media/TransportPerformer.java b/media-compat/java/android/support/v4/media/TransportPerformer.java
similarity index 100%
rename from v4/java/android/support/v4/media/TransportPerformer.java
rename to media-compat/java/android/support/v4/media/TransportPerformer.java
diff --git a/v4/java/android/support/v4/media/TransportStateListener.java b/media-compat/java/android/support/v4/media/TransportStateListener.java
similarity index 100%
rename from v4/java/android/support/v4/media/TransportStateListener.java
rename to media-compat/java/android/support/v4/media/TransportStateListener.java
diff --git a/v4/java/android/support/v4/media/VolumeProviderCompat.java b/media-compat/java/android/support/v4/media/VolumeProviderCompat.java
similarity index 100%
rename from v4/java/android/support/v4/media/VolumeProviderCompat.java
rename to media-compat/java/android/support/v4/media/VolumeProviderCompat.java
diff --git a/v4/java/android/support/v4/media/session/IMediaControllerCallback.aidl b/media-compat/java/android/support/v4/media/session/IMediaControllerCallback.aidl
similarity index 100%
rename from v4/java/android/support/v4/media/session/IMediaControllerCallback.aidl
rename to media-compat/java/android/support/v4/media/session/IMediaControllerCallback.aidl
diff --git a/v4/java/android/support/v4/media/session/IMediaSession.aidl b/media-compat/java/android/support/v4/media/session/IMediaSession.aidl
similarity index 100%
rename from v4/java/android/support/v4/media/session/IMediaSession.aidl
rename to media-compat/java/android/support/v4/media/session/IMediaSession.aidl
diff --git a/v4/java/android/support/v4/media/session/MediaButtonReceiver.java b/media-compat/java/android/support/v4/media/session/MediaButtonReceiver.java
similarity index 100%
rename from v4/java/android/support/v4/media/session/MediaButtonReceiver.java
rename to media-compat/java/android/support/v4/media/session/MediaButtonReceiver.java
diff --git a/v4/java/android/support/v4/media/session/MediaControllerCompat.java b/media-compat/java/android/support/v4/media/session/MediaControllerCompat.java
similarity index 100%
rename from v4/java/android/support/v4/media/session/MediaControllerCompat.java
rename to media-compat/java/android/support/v4/media/session/MediaControllerCompat.java
diff --git a/v4/java/android/support/v4/media/session/MediaSessionCompat.aidl b/media-compat/java/android/support/v4/media/session/MediaSessionCompat.aidl
similarity index 100%
rename from v4/java/android/support/v4/media/session/MediaSessionCompat.aidl
rename to media-compat/java/android/support/v4/media/session/MediaSessionCompat.aidl
diff --git a/media-compat/java/android/support/v4/media/session/MediaSessionCompat.java b/media-compat/java/android/support/v4/media/session/MediaSessionCompat.java
new file mode 100644
index 0000000..d184f07
--- /dev/null
+++ b/media-compat/java/android/support/v4/media/session/MediaSessionCompat.java
@@ -0,0 +1,2306 @@
+
+/*
+ * Copyright (C) 2014 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 android.support.v4.media.session;
+
+import android.app.Activity;
+import android.app.PendingIntent;
+import android.content.BroadcastReceiver;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.graphics.Bitmap;
+import android.media.AudioManager;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.IBinder;
+import android.os.Looper;
+import android.os.Message;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.os.RemoteCallbackList;
+import android.os.RemoteException;
+import android.os.ResultReceiver;
+import android.os.SystemClock;
+import android.support.annotation.IntDef;
+import android.support.v4.media.MediaDescriptionCompat;
+import android.support.v4.media.MediaMetadataCompat;
+import android.support.v4.media.RatingCompat;
+import android.support.v4.media.VolumeProviderCompat;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.KeyEvent;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Allows interaction with media controllers, volume keys, media buttons, and
+ * transport controls.
+ * <p>
+ * A MediaSession should be created when an app wants to publish media playback
+ * information or handle media keys. In general an app only needs one session
+ * for all playback, though multiple sessions can be created to provide finer
+ * grain controls of media.
+ * <p>
+ * Once a session is created the owner of the session may pass its
+ * {@link #getSessionToken() session token} to other processes to allow them to
+ * create a {@link MediaControllerCompat} to interact with the session.
+ * <p>
+ * To receive commands, media keys, and other events a {@link Callback} must be
+ * set with {@link #setCallback(Callback)}.
+ * <p>
+ * When an app is finished performing playback it must call {@link #release()}
+ * to clean up the session and notify any controllers.
+ * <p>
+ * MediaSessionCompat objects are not thread safe and all calls should be made
+ * from the same thread.
+ * <p>
+ * This is a helper for accessing features in
+ * {@link android.media.session.MediaSession} introduced after API level 4 in a
+ * backwards compatible fashion.
+ */
+public class MediaSessionCompat {
+    private static final String TAG = "MediaSessionCompat";
+
+    private final MediaSessionImpl mImpl;
+    private final MediaControllerCompat mController;
+    private final ArrayList<OnActiveChangeListener> mActiveListeners = new ArrayList<>();
+
+    /**
+     * @hide
+     */
+    @IntDef(flag=true, value={FLAG_HANDLES_MEDIA_BUTTONS, FLAG_HANDLES_TRANSPORT_CONTROLS})
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface SessionFlags {}
+
+    /**
+     * Set this flag on the session to indicate that it can handle media button
+     * events.
+     */
+    public static final int FLAG_HANDLES_MEDIA_BUTTONS = 1 << 0;
+
+    /**
+     * Set this flag on the session to indicate that it handles transport
+     * control commands through its {@link Callback}.
+     */
+    public static final int FLAG_HANDLES_TRANSPORT_CONTROLS = 1 << 1;
+
+    /**
+     * Custom action to invoke playFromUri() for the forward compatibility.
+     */
+    static final String ACTION_PLAY_FROM_URI =
+            "android.support.v4.media.session.action.PLAY_FROM_URI";
+
+    /**
+     * Custom action to invoke prepare() for the forward compatibility.
+     */
+    static final String ACTION_PREPARE = "android.support.v4.media.session.action.PREPARE";
+
+    /**
+     * Custom action to invoke prepareFromMediaId() for the forward compatibility.
+     */
+    static final String ACTION_PREPARE_FROM_MEDIA_ID =
+            "android.support.v4.media.session.action.PREPARE_FROM_MEDIA_ID";
+
+    /**
+     * Custom action to invoke prepareFromSearch() for the forward compatibility.
+     */
+    static final String ACTION_PREPARE_FROM_SEARCH =
+            "android.support.v4.media.session.action.PREPARE_FROM_SEARCH";
+
+    /**
+     * Custom action to invoke prepareFromUri() for the forward compatibility.
+     */
+    static final String ACTION_PREPARE_FROM_URI =
+            "android.support.v4.media.session.action.PREPARE_FROM_URI";
+
+    /**
+     * Argument for use with {@link #ACTION_PREPARE_FROM_MEDIA_ID} indicating media id to play.
+     */
+    static final String ACTION_ARGUMENT_MEDIA_ID =
+            "android.support.v4.media.session.action.ARGUMENT_MEDIA_ID";
+
+    /**
+     * Argument for use with {@link #ACTION_PREPARE_FROM_SEARCH} indicating search query.
+     */
+    static final String ACTION_ARGUMENT_QUERY =
+            "android.support.v4.media.session.action.ARGUMENT_QUERY";
+
+    /**
+     * Argument for use with {@link #ACTION_PREPARE_FROM_URI} and {@link #ACTION_PLAY_FROM_URI}
+     * indicating URI to play.
+     */
+    static final String ACTION_ARGUMENT_URI =
+            "android.support.v4.media.session.action.ARGUMENT_URI";
+
+    /**
+     * Argument for use with various actions indicating extra bundle.
+     */
+    static final String ACTION_ARGUMENT_EXTRAS =
+            "android.support.v4.media.session.action.ARGUMENT_EXTRAS";
+
+    /**
+     * Creates a new session. You must call {@link #release()} when finished with the session.
+     * <p>
+     * The session will automatically be registered with the system but will not be published
+     * until {@link #setActive(boolean) setActive(true)} is called.
+     * </p><p>
+     * For API 20 or earlier, note that a media button receiver is required for handling
+     * {@link Intent#ACTION_MEDIA_BUTTON}. This constructor will attempt to find an appropriate
+     * {@link BroadcastReceiver} from your manifest. See {@link MediaButtonReceiver} for more
+     * details.
+     * </p>
+     * @param context The context to use to create the session.
+     * @param tag A short name for debugging purposes.
+     */
+    public MediaSessionCompat(Context context, String tag) {
+        this(context, tag, null, null);
+    }
+
+    /**
+     * Creates a new session with a specified media button receiver (a component name and/or
+     * a pending intent). You must call {@link #release()} when finished with the session.
+     * <p>
+     * The session will automatically be registered with the system but will not be published
+     * until {@link #setActive(boolean) setActive(true)} is called. Note that {@code mbrComponent}
+     * and {@code mrbIntent} are only used for API 20 or earlier. If you  want to set a media button
+     * receiver in API 21 or later, call {@link #setMediaButtonReceiver}.
+     * </p><p>
+     * For API 20 or earlier, the new session will use the given {@code mbrComponent}.
+     * If null, this will attempt to find an appropriate {@link BroadcastReceiver} that handles
+     * {@link Intent#ACTION_MEDIA_BUTTON} from your manifest. See {@link MediaButtonReceiver} for
+     * more details.
+     * </p>
+     * @param context The context to use to create the session.
+     * @param tag A short name for debugging purposes.
+     * @param mbrComponent The component name for your media button receiver.
+     * @param mbrIntent The PendingIntent for your receiver component that handles
+     *            media button events. This is optional and will be used on between
+     *            {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2} and
+     *            {@link android.os.Build.VERSION_CODES#KITKAT_WATCH} instead of the
+     *            component name.
+     */
+    public MediaSessionCompat(Context context, String tag, ComponentName mbrComponent,
+            PendingIntent mbrIntent) {
+        if (context == null) {
+            throw new IllegalArgumentException("context must not be null");
+        }
+        if (TextUtils.isEmpty(tag)) {
+            throw new IllegalArgumentException("tag must not be null or empty");
+        }
+
+        if (android.os.Build.VERSION.SDK_INT >= 21) {
+            mImpl = new MediaSessionImplApi21(context, tag);
+        } else {
+            mImpl = new MediaSessionImplBase(context, tag, mbrComponent, mbrIntent);
+        }
+        mController = new MediaControllerCompat(context, this);
+    }
+
+    private MediaSessionCompat(Context context, MediaSessionImpl impl) {
+        mImpl = impl;
+        mController = new MediaControllerCompat(context, this);
+    }
+
+    /**
+     * Add a callback to receive updates on for the MediaSession. This includes
+     * media button and volume events. The caller's thread will be used to post
+     * events.
+     *
+     * @param callback The callback object
+     */
+    public void setCallback(Callback callback) {
+        setCallback(callback, null);
+    }
+
+    /**
+     * Set the callback to receive updates for the MediaSession. This includes
+     * media button and volume events. Set the callback to null to stop
+     * receiving events.
+     *
+     * @param callback The callback to receive updates on.
+     * @param handler The handler that events should be posted on.
+     */
+    public void setCallback(Callback callback, Handler handler) {
+        mImpl.setCallback(callback, handler != null ? handler : new Handler());
+    }
+
+    /**
+     * Set an intent for launching UI for this Session. This can be used as a
+     * quick link to an ongoing media screen. The intent should be for an
+     * activity that may be started using
+     * {@link Activity#startActivity(Intent)}.
+     *
+     * @param pi The intent to launch to show UI for this Session.
+     */
+    public void setSessionActivity(PendingIntent pi) {
+        mImpl.setSessionActivity(pi);
+    }
+
+    /**
+     * Set a pending intent for your media button receiver to allow restarting
+     * playback after the session has been stopped. If your app is started in
+     * this way an {@link Intent#ACTION_MEDIA_BUTTON} intent will be sent via
+     * the pending intent.
+     * <p>
+     * This method will only work on
+     * {@link android.os.Build.VERSION_CODES#LOLLIPOP} and later. Earlier
+     * platform versions must include the media button receiver in the
+     * constructor.
+     *
+     * @param mbr The {@link PendingIntent} to send the media button event to.
+     */
+    public void setMediaButtonReceiver(PendingIntent mbr) {
+        mImpl.setMediaButtonReceiver(mbr);
+    }
+
+    /**
+     * Set any flags for the session.
+     *
+     * @param flags The flags to set for this session.
+     */
+    public void setFlags(@SessionFlags int flags) {
+        mImpl.setFlags(flags);
+    }
+
+    /**
+     * Set the stream this session is playing on. This will affect the system's
+     * volume handling for this session. If {@link #setPlaybackToRemote} was
+     * previously called it will stop receiving volume commands and the system
+     * will begin sending volume changes to the appropriate stream.
+     * <p>
+     * By default sessions are on {@link AudioManager#STREAM_MUSIC}.
+     *
+     * @param stream The {@link AudioManager} stream this session is playing on.
+     */
+    public void setPlaybackToLocal(int stream) {
+        mImpl.setPlaybackToLocal(stream);
+    }
+
+    /**
+     * Configure this session to use remote volume handling. This must be called
+     * to receive volume button events, otherwise the system will adjust the
+     * current stream volume for this session. If {@link #setPlaybackToLocal}
+     * was previously called that stream will stop receiving volume changes for
+     * this session.
+     * <p>
+     * On platforms earlier than {@link android.os.Build.VERSION_CODES#LOLLIPOP}
+     * this will only allow an app to handle volume commands sent directly to
+     * the session by a {@link MediaControllerCompat}. System routing of volume
+     * keys will not use the volume provider.
+     *
+     * @param volumeProvider The provider that will handle volume changes. May
+     *            not be null.
+     */
+    public void setPlaybackToRemote(VolumeProviderCompat volumeProvider) {
+        if (volumeProvider == null) {
+            throw new IllegalArgumentException("volumeProvider may not be null!");
+        }
+        mImpl.setPlaybackToRemote(volumeProvider);
+    }
+
+    /**
+     * Set if this session is currently active and ready to receive commands. If
+     * set to false your session's controller may not be discoverable. You must
+     * set the session to active before it can start receiving media button
+     * events or transport commands.
+     * <p>
+     * On platforms earlier than
+     * {@link android.os.Build.VERSION_CODES#LOLLIPOP},
+     * a media button event receiver should be set via the constructor to
+     * receive media button events.
+     *
+     * @param active Whether this session is active or not.
+     */
+    public void setActive(boolean active) {
+        mImpl.setActive(active);
+        for (OnActiveChangeListener listener : mActiveListeners) {
+            listener.onActiveChanged();
+        }
+    }
+
+    /**
+     * Get the current active state of this session.
+     *
+     * @return True if the session is active, false otherwise.
+     */
+    public boolean isActive() {
+        return mImpl.isActive();
+    }
+
+    /**
+     * Send a proprietary event to all MediaControllers listening to this
+     * Session. It's up to the Controller/Session owner to determine the meaning
+     * of any events.
+     *
+     * @param event The name of the event to send
+     * @param extras Any extras included with the event
+     */
+    public void sendSessionEvent(String event, Bundle extras) {
+        if (TextUtils.isEmpty(event)) {
+            throw new IllegalArgumentException("event cannot be null or empty");
+        }
+        mImpl.sendSessionEvent(event, extras);
+    }
+
+    /**
+     * This must be called when an app has finished performing playback. If
+     * playback is expected to start again shortly the session can be left open,
+     * but it must be released if your activity or service is being destroyed.
+     */
+    public void release() {
+        mImpl.release();
+    }
+
+    /**
+     * Retrieve a token object that can be used by apps to create a
+     * {@link MediaControllerCompat} for interacting with this session. The
+     * owner of the session is responsible for deciding how to distribute these
+     * tokens.
+     * <p>
+     * On platform versions before
+     * {@link android.os.Build.VERSION_CODES#LOLLIPOP} this token may only be
+     * used within your app as there is no way to guarantee other apps are using
+     * the same version of the support library.
+     *
+     * @return A token that can be used to create a media controller for this
+     *         session.
+     */
+    public Token getSessionToken() {
+        return mImpl.getSessionToken();
+    }
+
+    /**
+     * Get a controller for this session. This is a convenience method to avoid
+     * having to cache your own controller in process.
+     *
+     * @return A controller for this session.
+     */
+    public MediaControllerCompat getController() {
+        return mController;
+    }
+
+    /**
+     * Update the current playback state.
+     *
+     * @param state The current state of playback
+     */
+    public void setPlaybackState(PlaybackStateCompat state) {
+        mImpl.setPlaybackState(state);
+    }
+
+    /**
+     * Update the current metadata. New metadata can be created using
+     * {@link android.media.MediaMetadata.Builder}.
+     *
+     * @param metadata The new metadata
+     */
+    public void setMetadata(MediaMetadataCompat metadata) {
+        mImpl.setMetadata(metadata);
+    }
+
+    /**
+     * Update the list of items in the play queue. It is an ordered list and
+     * should contain the current item, and previous or upcoming items if they
+     * exist. Specify null if there is no current play queue.
+     * <p>
+     * The queue should be of reasonable size. If the play queue is unbounded
+     * within your app, it is better to send a reasonable amount in a sliding
+     * window instead.
+     *
+     * @param queue A list of items in the play queue.
+     */
+    public void setQueue(List<QueueItem> queue) {
+        mImpl.setQueue(queue);
+    }
+
+    /**
+     * Set the title of the play queue. The UI should display this title along
+     * with the play queue itself. e.g. "Play Queue", "Now Playing", or an album
+     * name.
+     *
+     * @param title The title of the play queue.
+     */
+    public void setQueueTitle(CharSequence title) {
+        mImpl.setQueueTitle(title);
+    }
+
+    /**
+     * Set the style of rating used by this session. Apps trying to set the
+     * rating should use this style. Must be one of the following:
+     * <ul>
+     * <li>{@link RatingCompat#RATING_NONE}</li>
+     * <li>{@link RatingCompat#RATING_3_STARS}</li>
+     * <li>{@link RatingCompat#RATING_4_STARS}</li>
+     * <li>{@link RatingCompat#RATING_5_STARS}</li>
+     * <li>{@link RatingCompat#RATING_HEART}</li>
+     * <li>{@link RatingCompat#RATING_PERCENTAGE}</li>
+     * <li>{@link RatingCompat#RATING_THUMB_UP_DOWN}</li>
+     * </ul>
+     */
+    public void setRatingType(@RatingCompat.Style int type) {
+        mImpl.setRatingType(type);
+    }
+
+    /**
+     * Set some extras that can be associated with the
+     * {@link MediaSessionCompat}. No assumptions should be made as to how a
+     * {@link MediaControllerCompat} will handle these extras. Keys should be
+     * fully qualified (e.g. com.example.MY_EXTRA) to avoid conflicts.
+     *
+     * @param extras The extras associated with the session.
+     */
+    public void setExtras(Bundle extras) {
+        mImpl.setExtras(extras);
+    }
+
+    /**
+     * Gets the underlying framework {@link android.media.session.MediaSession}
+     * object.
+     * <p>
+     * This method is only supported on API 21+.
+     * </p>
+     *
+     * @return The underlying {@link android.media.session.MediaSession} object,
+     *         or null if none.
+     */
+    public Object getMediaSession() {
+        return mImpl.getMediaSession();
+    }
+
+    /**
+     * Gets the underlying framework {@link android.media.RemoteControlClient}
+     * object.
+     * <p>
+     * This method is only supported on APIs 14-20. On API 21+
+     * {@link #getMediaSession()} should be used instead.
+     *
+     * @return The underlying {@link android.media.RemoteControlClient} object,
+     *         or null if none.
+     */
+    public Object getRemoteControlClient() {
+        return mImpl.getRemoteControlClient();
+    }
+
+    /**
+     * Returns the name of the package that sent the last media button, transport control, or
+     * command from controllers and the system. This is only valid while in a request callback, such
+     * as {@link Callback#onPlay}. This method is not available and returns null on pre-N devices.
+     *
+     * @hide
+     */
+    public String getCallingPackage() {
+        return mImpl.getCallingPackage();
+    }
+
+    /**
+     * Adds a listener to be notified when the active status of this session
+     * changes. This is primarily used by the support library and should not be
+     * needed by apps.
+     *
+     * @param listener The listener to add.
+     */
+    public void addOnActiveChangeListener(OnActiveChangeListener listener) {
+        if (listener == null) {
+            throw new IllegalArgumentException("Listener may not be null");
+        }
+        mActiveListeners.add(listener);
+    }
+
+    /**
+     * Stops the listener from being notified when the active status of this
+     * session changes.
+     *
+     * @param listener The listener to remove.
+     */
+    public void removeOnActiveChangeListener(OnActiveChangeListener listener) {
+        if (listener == null) {
+            throw new IllegalArgumentException("Listener may not be null");
+        }
+        mActiveListeners.remove(listener);
+    }
+
+    /**
+     * Obtain a compat wrapper for an existing MediaSession.
+     *
+     * @param mediaSession The {@link android.media.session.MediaSession} to
+     *            wrap.
+     * @return A compat wrapper for the provided session.
+     */
+    public static MediaSessionCompat obtain(Context context, Object mediaSession) {
+        return new MediaSessionCompat(context, new MediaSessionImplApi21(mediaSession));
+    }
+
+    /**
+     * Receives transport controls, media buttons, and commands from controllers
+     * and the system. The callback may be set using {@link #setCallback}.
+     */
+    public abstract static class Callback {
+        final Object mCallbackObj;
+
+        public Callback() {
+            if (android.os.Build.VERSION.SDK_INT >= 24) {
+                mCallbackObj = MediaSessionCompatApi24.createCallback(new StubApi24());
+            } else if (android.os.Build.VERSION.SDK_INT >= 23) {
+                mCallbackObj = MediaSessionCompatApi23.createCallback(new StubApi23());
+            } else if (android.os.Build.VERSION.SDK_INT >= 21) {
+                mCallbackObj = MediaSessionCompatApi21.createCallback(new StubApi21());
+            } else {
+                mCallbackObj = null;
+            }
+        }
+
+        /**
+         * Called when a controller has sent a custom command to this session.
+         * The owner of the session may handle custom commands but is not
+         * required to.
+         *
+         * @param command The command name.
+         * @param extras Optional parameters for the command, may be null.
+         * @param cb A result receiver to which a result may be sent by the command, may be null.
+         */
+        public void onCommand(String command, Bundle extras, ResultReceiver cb) {
+        }
+
+        /**
+         * Override to handle media button events.
+         *
+         * @param mediaButtonEvent The media button event intent.
+         * @return True if the event was handled, false otherwise.
+         */
+        public boolean onMediaButtonEvent(Intent mediaButtonEvent) {
+            return false;
+        }
+
+        /**
+         * Override to handle requests to prepare playback. During the preparation, a session
+         * should not hold audio focus in order to allow other session play seamlessly.
+         * The state of playback should be updated to {@link PlaybackStateCompat#STATE_PAUSED}
+         * after the preparation is done.
+         */
+        public void onPrepare() {
+        }
+
+        /**
+         * Override to handle requests to prepare for playing a specific mediaId that was provided
+         * by your app. During the preparation, a session should not hold audio focus in order to
+         * allow other session play seamlessly. The state of playback should be updated to
+         * {@link PlaybackStateCompat#STATE_PAUSED} after the preparation is done. The playback
+         * of the prepared content should start in the implementation of {@link #onPlay}. Override
+         * {@link #onPlayFromMediaId} to handle requests for starting playback without preparation.
+         */
+        public void onPrepareFromMediaId(String mediaId, Bundle extras) {
+        }
+
+        /**
+         * Override to handle requests to prepare playback from a search query. An
+         * empty query indicates that the app may prepare any music. The
+         * implementation should attempt to make a smart choice about what to
+         * play. During the preparation, a session should not hold audio focus in order to allow
+         * other session play seamlessly. The state of playback should be updated to
+         * {@link PlaybackStateCompat#STATE_PAUSED} after the preparation is done.
+         * The playback of the prepared content should start in the implementation of
+         * {@link #onPlay}. Override {@link #onPlayFromSearch} to handle requests for
+         * starting playback without preparation.
+         */
+        public void onPrepareFromSearch(String query, Bundle extras) {
+        }
+
+        /**
+         * Override to handle requests to prepare a specific media item represented by a URI.
+         * During the preparation, a session should not hold audio focus in order to allow other
+         * session play seamlessly. The state of playback should be updated to
+         * {@link PlaybackStateCompat#STATE_PAUSED} after the preparation is done. The playback of
+         * the prepared content should start in the implementation of {@link #onPlay}. Override
+         * {@link #onPlayFromUri} to handle requests for starting playback without preparation.
+         */
+        public void onPrepareFromUri(Uri uri, Bundle extras) {
+        }
+
+        /**
+         * Override to handle requests to begin playback.
+         */
+        public void onPlay() {
+        }
+
+        /**
+         * Override to handle requests to play a specific mediaId that was
+         * provided by your app.
+         */
+        public void onPlayFromMediaId(String mediaId, Bundle extras) {
+        }
+
+        /**
+         * Override to handle requests to begin playback from a search query. An
+         * empty query indicates that the app may play any music. The
+         * implementation should attempt to make a smart choice about what to
+         * play.
+         */
+        public void onPlayFromSearch(String query, Bundle extras) {
+        }
+
+        /**
+         * Override to handle requests to play a specific media item represented by a URI.
+         */
+        public void onPlayFromUri(Uri uri, Bundle extras) {
+        }
+
+        /**
+         * Override to handle requests to play an item with a given id from the
+         * play queue.
+         */
+        public void onSkipToQueueItem(long id) {
+        }
+
+        /**
+         * Override to handle requests to pause playback.
+         */
+        public void onPause() {
+        }
+
+        /**
+         * Override to handle requests to skip to the next media item.
+         */
+        public void onSkipToNext() {
+        }
+
+        /**
+         * Override to handle requests to skip to the previous media item.
+         */
+        public void onSkipToPrevious() {
+        }
+
+        /**
+         * Override to handle requests to fast forward.
+         */
+        public void onFastForward() {
+        }
+
+        /**
+         * Override to handle requests to rewind.
+         */
+        public void onRewind() {
+        }
+
+        /**
+         * Override to handle requests to stop playback.
+         */
+        public void onStop() {
+        }
+
+        /**
+         * Override to handle requests to seek to a specific position in ms.
+         *
+         * @param pos New position to move to, in milliseconds.
+         */
+        public void onSeekTo(long pos) {
+        }
+
+        /**
+         * Override to handle the item being rated.
+         *
+         * @param rating
+         */
+        public void onSetRating(RatingCompat rating) {
+        }
+
+        /**
+         * Called when a {@link MediaControllerCompat} wants a
+         * {@link PlaybackStateCompat.CustomAction} to be performed.
+         *
+         * @param action The action that was originally sent in the
+         *            {@link PlaybackStateCompat.CustomAction}.
+         * @param extras Optional extras specified by the
+         *            {@link MediaControllerCompat}.
+         */
+        public void onCustomAction(String action, Bundle extras) {
+        }
+
+        private class StubApi21 implements MediaSessionCompatApi21.Callback {
+
+            @Override
+            public void onCommand(String command, Bundle extras, ResultReceiver cb) {
+                Callback.this.onCommand(command, extras, cb);
+            }
+
+            @Override
+            public boolean onMediaButtonEvent(Intent mediaButtonIntent) {
+                return Callback.this.onMediaButtonEvent(mediaButtonIntent);
+            }
+
+            @Override
+            public void onPlay() {
+                Callback.this.onPlay();
+            }
+
+            @Override
+            public void onPlayFromMediaId(String mediaId, Bundle extras) {
+                Callback.this.onPlayFromMediaId(mediaId, extras);
+            }
+
+            @Override
+            public void onPlayFromSearch(String search, Bundle extras) {
+                Callback.this.onPlayFromSearch(search, extras);
+            }
+
+            @Override
+            public void onSkipToQueueItem(long id) {
+                Callback.this.onSkipToQueueItem(id);
+            }
+
+            @Override
+            public void onPause() {
+                Callback.this.onPause();
+            }
+
+            @Override
+            public void onSkipToNext() {
+                Callback.this.onSkipToNext();
+            }
+
+            @Override
+            public void onSkipToPrevious() {
+                Callback.this.onSkipToPrevious();
+            }
+
+            @Override
+            public void onFastForward() {
+                Callback.this.onFastForward();
+            }
+
+            @Override
+            public void onRewind() {
+                Callback.this.onRewind();
+            }
+
+            @Override
+            public void onStop() {
+                Callback.this.onStop();
+            }
+
+            @Override
+            public void onSeekTo(long pos) {
+                Callback.this.onSeekTo(pos);
+            }
+
+            @Override
+            public void onSetRating(Object ratingObj) {
+                Callback.this.onSetRating(RatingCompat.fromRating(ratingObj));
+            }
+
+            @Override
+            public void onCustomAction(String action, Bundle extras) {
+                if (action.equals(ACTION_PLAY_FROM_URI)) {
+                    Uri uri = extras.getParcelable(ACTION_ARGUMENT_URI);
+                    Bundle bundle = extras.getParcelable(ACTION_ARGUMENT_EXTRAS);
+                    Callback.this.onPlayFromUri(uri, bundle);
+                } else if (action.equals(ACTION_PREPARE)) {
+                    Callback.this.onPrepare();
+                } else if (action.equals(ACTION_PREPARE_FROM_MEDIA_ID)) {
+                    String mediaId = extras.getString(ACTION_ARGUMENT_MEDIA_ID);
+                    Bundle bundle = extras.getBundle(ACTION_ARGUMENT_EXTRAS);
+                    Callback.this.onPrepareFromMediaId(mediaId, bundle);
+                } else if (action.equals(ACTION_PREPARE_FROM_SEARCH)) {
+                    String query = extras.getString(ACTION_ARGUMENT_QUERY);
+                    Bundle bundle = extras.getBundle(ACTION_ARGUMENT_EXTRAS);
+                    Callback.this.onPrepareFromSearch(query, bundle);
+                } else if (action.equals(ACTION_PREPARE_FROM_URI)) {
+                    Uri uri = extras.getParcelable(ACTION_ARGUMENT_URI);
+                    Bundle bundle = extras.getBundle(ACTION_ARGUMENT_EXTRAS);
+                    Callback.this.onPrepareFromUri(uri, bundle);
+                } else {
+                    Callback.this.onCustomAction(action, extras);
+                }
+            }
+        }
+
+        private class StubApi23 extends StubApi21 implements MediaSessionCompatApi23.Callback {
+
+            @Override
+            public void onPlayFromUri(Uri uri, Bundle extras) {
+                Callback.this.onPlayFromUri(uri, extras);
+            }
+        }
+
+        private class StubApi24 extends StubApi23 implements MediaSessionCompatApi24.Callback {
+
+            @Override
+            public void onPrepare() {
+                Callback.this.onPrepare();
+            }
+
+            @Override
+            public void onPrepareFromMediaId(String mediaId, Bundle extras) {
+                Callback.this.onPrepareFromMediaId(mediaId, extras);
+            }
+
+            @Override
+            public void onPrepareFromSearch(String query, Bundle extras) {
+                Callback.this.onPrepareFromSearch(query, extras);
+            }
+
+            @Override
+            public void onPrepareFromUri(Uri uri, Bundle extras) {
+                Callback.this.onPrepareFromUri(uri, extras);
+            }
+        }
+    }
+
+    /**
+     * Represents an ongoing session. This may be passed to apps by the session
+     * owner to allow them to create a {@link MediaControllerCompat} to communicate with
+     * the session.
+     */
+    public static final class Token implements Parcelable {
+        private final Object mInner;
+
+        Token(Object inner) {
+            mInner = inner;
+        }
+
+        /**
+         * Creates a compat Token from a framework
+         * {@link android.media.session.MediaSession.Token} object.
+         * <p>
+         * This method is only supported on
+         * {@link android.os.Build.VERSION_CODES#LOLLIPOP} and later.
+         * </p>
+         *
+         * @param token The framework token object.
+         * @return A compat Token for use with {@link MediaControllerCompat}.
+         */
+        public static Token fromToken(Object token) {
+            if (token == null || android.os.Build.VERSION.SDK_INT < 21) {
+                return null;
+            }
+            return new Token(MediaSessionCompatApi21.verifyToken(token));
+        }
+
+        @Override
+        public int describeContents() {
+            return 0;
+        }
+
+        @Override
+        public void writeToParcel(Parcel dest, int flags) {
+            if (android.os.Build.VERSION.SDK_INT >= 21) {
+                dest.writeParcelable((Parcelable) mInner, flags);
+            } else {
+                dest.writeStrongBinder((IBinder) mInner);
+            }
+        }
+
+        /**
+         * Gets the underlying framework {@link android.media.session.MediaSession.Token} object.
+         * <p>
+         * This method is only supported on API 21+.
+         * </p>
+         *
+         * @return The underlying {@link android.media.session.MediaSession.Token} object,
+         * or null if none.
+         */
+        public Object getToken() {
+            return mInner;
+        }
+
+        public static final Parcelable.Creator<Token> CREATOR
+                = new Parcelable.Creator<Token>() {
+            @Override
+            public Token createFromParcel(Parcel in) {
+                Object inner;
+                if (android.os.Build.VERSION.SDK_INT >= 21) {
+                    inner = in.readParcelable(null);
+                } else {
+                    inner = in.readStrongBinder();
+                }
+                return new Token(inner);
+            }
+
+            @Override
+            public Token[] newArray(int size) {
+                return new Token[size];
+            }
+        };
+    }
+
+    /**
+     * A single item that is part of the play queue. It contains a description
+     * of the item and its id in the queue.
+     */
+    public static final class QueueItem implements Parcelable {
+        /**
+         * This id is reserved. No items can be explicitly asigned this id.
+         */
+        public static final int UNKNOWN_ID = -1;
+
+        private final MediaDescriptionCompat mDescription;
+        private final long mId;
+
+        private Object mItem;
+
+        /**
+         * Create a new {@link MediaSessionCompat.QueueItem}.
+         *
+         * @param description The {@link MediaDescriptionCompat} for this item.
+         * @param id An identifier for this item. It must be unique within the
+         *            play queue and cannot be {@link #UNKNOWN_ID}.
+         */
+        public QueueItem(MediaDescriptionCompat description, long id) {
+            this(null, description, id);
+        }
+
+        private QueueItem(Object queueItem, MediaDescriptionCompat description, long id) {
+            if (description == null) {
+                throw new IllegalArgumentException("Description cannot be null.");
+            }
+            if (id == UNKNOWN_ID) {
+                throw new IllegalArgumentException("Id cannot be QueueItem.UNKNOWN_ID");
+            }
+            mDescription = description;
+            mId = id;
+            mItem = queueItem;
+        }
+
+        private QueueItem(Parcel in) {
+            mDescription = MediaDescriptionCompat.CREATOR.createFromParcel(in);
+            mId = in.readLong();
+        }
+
+        /**
+         * Get the description for this item.
+         */
+        public MediaDescriptionCompat getDescription() {
+            return mDescription;
+        }
+
+        /**
+         * Get the queue id for this item.
+         */
+        public long getQueueId() {
+            return mId;
+        }
+
+        @Override
+        public void writeToParcel(Parcel dest, int flags) {
+            mDescription.writeToParcel(dest, flags);
+            dest.writeLong(mId);
+        }
+
+        @Override
+        public int describeContents() {
+            return 0;
+        }
+
+        /**
+         * Get the underlying
+         * {@link android.media.session.MediaSession.QueueItem}.
+         * <p>
+         * On builds before {@link android.os.Build.VERSION_CODES#LOLLIPOP} null
+         * is returned.
+         *
+         * @return The underlying
+         *         {@link android.media.session.MediaSession.QueueItem} or null.
+         */
+        public Object getQueueItem() {
+            if (mItem != null || android.os.Build.VERSION.SDK_INT < 21) {
+                return mItem;
+            }
+            mItem = MediaSessionCompatApi21.QueueItem.createItem(mDescription.getMediaDescription(),
+                    mId);
+            return mItem;
+        }
+
+        /**
+         * Obtain a compat wrapper for an existing QueueItem.
+         *
+         * @param queueItem The {@link android.media.session.MediaSession.QueueItem} to
+         *            wrap.
+         * @return A compat wrapper for the provided item.
+         */
+        public static QueueItem obtain(Object queueItem) {
+            Object descriptionObj = MediaSessionCompatApi21.QueueItem.getDescription(queueItem);
+            MediaDescriptionCompat description = MediaDescriptionCompat.fromMediaDescription(
+                    descriptionObj);
+            long id = MediaSessionCompatApi21.QueueItem.getQueueId(queueItem);
+            return new QueueItem(queueItem, description, id);
+        }
+
+        public static final Creator<MediaSessionCompat.QueueItem> CREATOR
+                = new Creator<MediaSessionCompat.QueueItem>() {
+
+            @Override
+            public MediaSessionCompat.QueueItem createFromParcel(Parcel p) {
+                return new MediaSessionCompat.QueueItem(p);
+            }
+
+            @Override
+            public MediaSessionCompat.QueueItem[] newArray(int size) {
+                return new MediaSessionCompat.QueueItem[size];
+            }
+        };
+
+        @Override
+        public String toString() {
+            return "MediaSession.QueueItem {" +
+                    "Description=" + mDescription +
+                    ", Id=" + mId + " }";
+        }
+    }
+
+    /**
+     * This is a wrapper for {@link ResultReceiver} for sending over aidl
+     * interfaces. The framework version was not exposed to aidls until
+     * {@link android.os.Build.VERSION_CODES#LOLLIPOP}.
+     */
+    static final class ResultReceiverWrapper implements Parcelable {
+        private ResultReceiver mResultReceiver;
+
+        public ResultReceiverWrapper(ResultReceiver resultReceiver) {
+            mResultReceiver = resultReceiver;
+        }
+
+        ResultReceiverWrapper(Parcel in) {
+            mResultReceiver = ResultReceiver.CREATOR.createFromParcel(in);
+        }
+
+        public static final Creator<ResultReceiverWrapper>
+                CREATOR = new Creator<ResultReceiverWrapper>() {
+            @Override
+            public ResultReceiverWrapper createFromParcel(Parcel p) {
+                return new ResultReceiverWrapper(p);
+            }
+
+            @Override
+            public ResultReceiverWrapper[] newArray(int size) {
+                return new ResultReceiverWrapper[size];
+            }
+        };
+
+        @Override
+        public int describeContents() {
+            return 0;
+        }
+
+        @Override
+        public void writeToParcel(Parcel dest, int flags) {
+            mResultReceiver.writeToParcel(dest, flags);
+        }
+    }
+
+    public interface OnActiveChangeListener {
+        void onActiveChanged();
+    }
+
+    interface MediaSessionImpl {
+        void setCallback(Callback callback, Handler handler);
+        void setFlags(@SessionFlags int flags);
+        void setPlaybackToLocal(int stream);
+        void setPlaybackToRemote(VolumeProviderCompat volumeProvider);
+        void setActive(boolean active);
+        boolean isActive();
+        void sendSessionEvent(String event, Bundle extras);
+        void release();
+        Token getSessionToken();
+        void setPlaybackState(PlaybackStateCompat state);
+        void setMetadata(MediaMetadataCompat metadata);
+
+        void setSessionActivity(PendingIntent pi);
+
+        void setMediaButtonReceiver(PendingIntent mbr);
+        void setQueue(List<QueueItem> queue);
+        void setQueueTitle(CharSequence title);
+
+        void setRatingType(@RatingCompat.Style int type);
+        void setExtras(Bundle extras);
+
+        Object getMediaSession();
+
+        Object getRemoteControlClient();
+
+        String getCallingPackage();
+    }
+
+    static class MediaSessionImplBase implements MediaSessionImpl {
+        private final Context mContext;
+        private final ComponentName mMediaButtonReceiverComponentName;
+        private final PendingIntent mMediaButtonReceiverIntent;
+        private final Object mRccObj;
+        private final MediaSessionStub mStub;
+        private final Token mToken;
+        private final String mPackageName;
+        private final String mTag;
+        private final AudioManager mAudioManager;
+
+        private final Object mLock = new Object();
+        private final RemoteCallbackList<IMediaControllerCallback> mControllerCallbacks
+                = new RemoteCallbackList<>();
+
+        private MessageHandler mHandler;
+        private boolean mDestroyed = false;
+        private boolean mIsActive = false;
+        private boolean mIsRccRegistered = false;
+        private boolean mIsMbrRegistered = false;
+        private volatile Callback mCallback;
+
+        private @SessionFlags int mFlags;
+
+        private MediaMetadataCompat mMetadata;
+        private PlaybackStateCompat mState;
+        private PendingIntent mSessionActivity;
+        private List<QueueItem> mQueue;
+        private CharSequence mQueueTitle;
+        private @RatingCompat.Style int mRatingType;
+        private Bundle mExtras;
+
+        private int mVolumeType;
+        private int mLocalStream;
+        private VolumeProviderCompat mVolumeProvider;
+
+        private VolumeProviderCompat.Callback mVolumeCallback
+                = new VolumeProviderCompat.Callback() {
+            @Override
+            public void onVolumeChanged(VolumeProviderCompat volumeProvider) {
+                if (mVolumeProvider != volumeProvider) {
+                    return;
+                }
+                ParcelableVolumeInfo info = new ParcelableVolumeInfo(mVolumeType, mLocalStream,
+                        volumeProvider.getVolumeControl(), volumeProvider.getMaxVolume(),
+                        volumeProvider.getCurrentVolume());
+                sendVolumeInfoChanged(info);
+            }
+        };
+
+        public MediaSessionImplBase(Context context, String tag, ComponentName mbrComponent,
+                PendingIntent mbrIntent) {
+            if (mbrComponent == null) {
+                Intent queryIntent = new Intent(Intent.ACTION_MEDIA_BUTTON);
+                queryIntent.setPackage(context.getPackageName());
+                PackageManager pm = context.getPackageManager();
+                List<ResolveInfo> resolveInfos = pm.queryBroadcastReceivers(queryIntent, 0);
+                // If none are found, assume we are running on a newer platform version that does
+                // not require a media button receiver ComponentName. Later code will double check
+                // this assumption and throw an error if needed
+                if (resolveInfos.size() == 1) {
+                    ResolveInfo resolveInfo = resolveInfos.get(0);
+                    mbrComponent = new ComponentName(resolveInfo.activityInfo.packageName,
+                            resolveInfo.activityInfo.name);
+                } else if (resolveInfos.size() > 1) {
+                    Log.w(TAG, "More than one BroadcastReceiver that handles "
+                            + Intent.ACTION_MEDIA_BUTTON + " was found, using null. Provide a "
+                            + "specific ComponentName to use as this session's media button "
+                            + "receiver");
+                }
+            }
+            if (mbrComponent != null && mbrIntent == null) {
+                // construct a PendingIntent for the media button
+                Intent mediaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON);
+                // the associated intent will be handled by the component being registered
+                mediaButtonIntent.setComponent(mbrComponent);
+                mbrIntent = PendingIntent.getBroadcast(context,
+                        0/* requestCode, ignored */, mediaButtonIntent, 0/* flags */);
+            }
+            if (mbrComponent == null) {
+                throw new IllegalArgumentException(
+                        "MediaButtonReceiver component may not be null.");
+            }
+            mContext = context;
+            mPackageName = context.getPackageName();
+            mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
+            mTag = tag;
+            mMediaButtonReceiverComponentName = mbrComponent;
+            mMediaButtonReceiverIntent = mbrIntent;
+            mStub = new MediaSessionStub();
+            mToken = new Token(mStub);
+
+            mRatingType = RatingCompat.RATING_NONE;
+            mVolumeType = MediaControllerCompat.PlaybackInfo.PLAYBACK_TYPE_LOCAL;
+            mLocalStream = AudioManager.STREAM_MUSIC;
+            if (android.os.Build.VERSION.SDK_INT >= 14) {
+                mRccObj = MediaSessionCompatApi14.createRemoteControlClient(mbrIntent);
+            } else {
+                mRccObj = null;
+            }
+        }
+
+        @Override
+        public void setCallback(Callback callback, Handler handler) {
+            mCallback = callback;
+            if (callback == null) {
+                // There's nothing to unregister on API < 18 since media buttons
+                // all go through the media button receiver
+                if (android.os.Build.VERSION.SDK_INT >= 18) {
+                    MediaSessionCompatApi18.setOnPlaybackPositionUpdateListener(mRccObj, null);
+                }
+                if (android.os.Build.VERSION.SDK_INT >= 19) {
+                    MediaSessionCompatApi19.setOnMetadataUpdateListener(mRccObj, null);
+                }
+            } else {
+                if (handler == null) {
+                    handler = new Handler();
+                }
+                synchronized (mLock) {
+                    mHandler = new MessageHandler(handler.getLooper());
+                }
+                MediaSessionCompatApi19.Callback cb19 = new MediaSessionCompatApi19.Callback() {
+                    @Override
+                    public void onSetRating(Object ratingObj) {
+                        postToHandler(MessageHandler.MSG_RATE,
+                                RatingCompat.fromRating(ratingObj));
+                    }
+
+                    @Override
+                    public void onSeekTo(long pos) {
+                        postToHandler(MessageHandler.MSG_SEEK_TO, pos);
+                    }
+                };
+                if (android.os.Build.VERSION.SDK_INT >= 18) {
+                    Object onPositionUpdateObj = MediaSessionCompatApi18
+                            .createPlaybackPositionUpdateListener(cb19);
+                    MediaSessionCompatApi18.setOnPlaybackPositionUpdateListener(mRccObj,
+                            onPositionUpdateObj);
+                }
+                if (android.os.Build.VERSION.SDK_INT >= 19) {
+                    Object onMetadataUpdateObj = MediaSessionCompatApi19
+                            .createMetadataUpdateListener(cb19);
+                    MediaSessionCompatApi19.setOnMetadataUpdateListener(mRccObj,
+                            onMetadataUpdateObj);
+                }
+            }
+        }
+
+        private void postToHandler(int what) {
+            postToHandler(what, null);
+        }
+
+        private void postToHandler(int what, Object obj) {
+            postToHandler(what, obj, null);
+        }
+
+        private void postToHandler(int what, Object obj, Bundle extras) {
+            synchronized (mLock) {
+                if (mHandler != null) {
+                    mHandler.post(what, obj, extras);
+                }
+            }
+        }
+
+        @Override
+        public void setFlags(@SessionFlags int flags) {
+            synchronized (mLock) {
+                mFlags = flags;
+            }
+            update();
+        }
+
+        @Override
+        public void setPlaybackToLocal(int stream) {
+            if (mVolumeProvider != null) {
+                mVolumeProvider.setCallback(null);
+            }
+            mVolumeType = MediaControllerCompat.PlaybackInfo.PLAYBACK_TYPE_LOCAL;
+            ParcelableVolumeInfo info = new ParcelableVolumeInfo(mVolumeType, mLocalStream,
+                    VolumeProviderCompat.VOLUME_CONTROL_ABSOLUTE,
+                    mAudioManager.getStreamMaxVolume(mLocalStream),
+                    mAudioManager.getStreamVolume(mLocalStream));
+            sendVolumeInfoChanged(info);
+        }
+
+        @Override
+        public void setPlaybackToRemote(VolumeProviderCompat volumeProvider) {
+            if (volumeProvider == null) {
+                throw new IllegalArgumentException("volumeProvider may not be null");
+            }
+            if (mVolumeProvider != null) {
+                mVolumeProvider.setCallback(null);
+            }
+            mVolumeType = MediaControllerCompat.PlaybackInfo.PLAYBACK_TYPE_REMOTE;
+            mVolumeProvider = volumeProvider;
+            ParcelableVolumeInfo info = new ParcelableVolumeInfo(mVolumeType, mLocalStream,
+                    mVolumeProvider.getVolumeControl(), mVolumeProvider.getMaxVolume(),
+                    mVolumeProvider.getCurrentVolume());
+            sendVolumeInfoChanged(info);
+
+            volumeProvider.setCallback(mVolumeCallback);
+        }
+
+        @Override
+        public void setActive(boolean active) {
+            if (active == mIsActive) {
+                return;
+            }
+            mIsActive = active;
+            if (update()) {
+                setMetadata(mMetadata);
+                setPlaybackState(mState);
+            }
+        }
+
+        @Override
+        public boolean isActive() {
+            return mIsActive;
+        }
+
+        @Override
+        public void sendSessionEvent(String event, Bundle extras) {
+            sendEvent(event, extras);
+        }
+
+        @Override
+        public void release() {
+            mIsActive = false;
+            mDestroyed = true;
+            update();
+            sendSessionDestroyed();
+        }
+
+        @Override
+        public Token getSessionToken() {
+            return mToken;
+        }
+
+        @Override
+        public void setPlaybackState(PlaybackStateCompat state) {
+            synchronized (mLock) {
+                mState = state;
+            }
+            sendState(state);
+            if (!mIsActive) {
+                // Don't set the state until after the RCC is registered
+                return;
+            }
+            if (state == null) {
+                if (android.os.Build.VERSION.SDK_INT >= 14) {
+                    MediaSessionCompatApi14.setState(mRccObj, PlaybackStateCompat.STATE_NONE);
+                    MediaSessionCompatApi14.setTransportControlFlags(mRccObj, 0);
+                }
+            } else {
+                // Set state
+                if (android.os.Build.VERSION.SDK_INT >= 18) {
+                    MediaSessionCompatApi18.setState(mRccObj, state.getState(), state.getPosition(),
+                            state.getPlaybackSpeed(), state.getLastPositionUpdateTime());
+                } else if (android.os.Build.VERSION.SDK_INT >= 14) {
+                    MediaSessionCompatApi14.setState(mRccObj, state.getState());
+                }
+
+                // Set transport control flags
+                if (android.os.Build.VERSION.SDK_INT >= 19) {
+                    MediaSessionCompatApi19.setTransportControlFlags(mRccObj, state.getActions());
+                } else if (android.os.Build.VERSION.SDK_INT >= 18) {
+                    MediaSessionCompatApi18.setTransportControlFlags(mRccObj, state.getActions());
+                } else if (android.os.Build.VERSION.SDK_INT >= 14) {
+                    MediaSessionCompatApi14.setTransportControlFlags(mRccObj, state.getActions());
+                }
+            }
+        }
+
+        /**
+         * Clones the given {@link MediaMetadataCompat}, deep-copying bitmaps in the metadata if
+         * they exist. If there is no bitmap in the metadata, this method just returns the given
+         * metadata.
+         *
+         * @param metadata A {@link MediaMetadataCompat} to be cloned.
+         * @return A newly cloned metadata if it contains bitmaps. Otherwise, the given metadata
+         *         will be returned.
+         */
+        private MediaMetadataCompat cloneMetadataIfNeeded(MediaMetadataCompat metadata) {
+            if (metadata == null) {
+                return null;
+            } else if (!metadata.containsKey(MediaMetadataCompat.METADATA_KEY_ART)
+                    && !metadata.containsKey(MediaMetadataCompat.METADATA_KEY_ALBUM_ART)) {
+                return metadata;
+            }
+            MediaMetadataCompat.Builder builder = new MediaMetadataCompat.Builder(metadata);
+            Bitmap artBitmap = metadata.getBitmap(MediaMetadataCompat.METADATA_KEY_ART);
+            if (artBitmap != null) {
+                builder.putBitmap(MediaMetadataCompat.METADATA_KEY_ART,
+                        artBitmap.copy(artBitmap.getConfig(), false));
+            }
+            Bitmap albumArtBitmap = metadata.getBitmap(MediaMetadataCompat.METADATA_KEY_ALBUM_ART);
+            if (albumArtBitmap != null) {
+                builder.putBitmap(MediaMetadataCompat.METADATA_KEY_ALBUM_ART,
+                        albumArtBitmap.copy(albumArtBitmap.getConfig(), false));
+            }
+            return builder.build();
+        }
+
+        @Override
+        public void setMetadata(MediaMetadataCompat metadata) {
+            if (android.os.Build.VERSION.SDK_INT >= 14 && metadata != null) {
+                // Clone bitmaps in metadata for protecting them to be recycled by RCC.
+                metadata = cloneMetadataIfNeeded(metadata);
+            }
+            synchronized (mLock) {
+                mMetadata = metadata;
+            }
+            sendMetadata(metadata);
+            if (!mIsActive) {
+                // Don't set metadata until after the rcc has been registered
+                return;
+            }
+            if (android.os.Build.VERSION.SDK_INT >= 19) {
+                MediaSessionCompatApi19.setMetadata(mRccObj,
+                        metadata == null ? null : metadata.getBundle(),
+                        mState == null ? 0 : mState.getActions());
+            } else if (android.os.Build.VERSION.SDK_INT >= 14) {
+                MediaSessionCompatApi14.setMetadata(mRccObj,
+                        metadata == null ? null : metadata.getBundle());
+            }
+        }
+
+        @Override
+        public void setSessionActivity(PendingIntent pi) {
+            synchronized (mLock) {
+                mSessionActivity = pi;
+            }
+        }
+
+        @Override
+        public void setMediaButtonReceiver(PendingIntent mbr) {
+            // Do nothing, changing this is not supported before API 21.
+        }
+
+        @Override
+        public void setQueue(List<QueueItem> queue) {
+            mQueue = queue;
+            sendQueue(queue);
+        }
+
+        @Override
+        public void setQueueTitle(CharSequence title) {
+            mQueueTitle = title;
+            sendQueueTitle(title);
+        }
+
+        @Override
+        public Object getMediaSession() {
+            return null;
+        }
+
+        @Override
+        public Object getRemoteControlClient() {
+            return mRccObj;
+        }
+
+        @Override
+        public String getCallingPackage() {
+            return null;
+        }
+
+        @Override
+        public void setRatingType(@RatingCompat.Style int type) {
+            mRatingType = type;
+        }
+
+        @Override
+        public void setExtras(Bundle extras) {
+            mExtras = extras;
+        }
+
+        // Registers/unregisters the RCC and MediaButtonEventReceiver as needed.
+        private boolean update() {
+            boolean registeredRcc = false;
+            if (mIsActive) {
+                // Register a MBR if it's supported, unregister it
+                // if support was removed.
+                if (!mIsMbrRegistered && (mFlags & FLAG_HANDLES_MEDIA_BUTTONS) != 0) {
+                    if (android.os.Build.VERSION.SDK_INT >= 18) {
+                        MediaSessionCompatApi18.registerMediaButtonEventReceiver(mContext,
+                                mMediaButtonReceiverIntent,
+                                mMediaButtonReceiverComponentName);
+                    } else {
+                        AudioManager am = (AudioManager) mContext.getSystemService(
+                                Context.AUDIO_SERVICE);
+                        am.registerMediaButtonEventReceiver(mMediaButtonReceiverComponentName);
+                    }
+                    mIsMbrRegistered = true;
+                } else if (mIsMbrRegistered && (mFlags & FLAG_HANDLES_MEDIA_BUTTONS) == 0) {
+                    if (android.os.Build.VERSION.SDK_INT >= 18) {
+                        MediaSessionCompatApi18.unregisterMediaButtonEventReceiver(mContext,
+                                mMediaButtonReceiverIntent,
+                                mMediaButtonReceiverComponentName);
+                    } else {
+                        AudioManager am = (AudioManager) mContext.getSystemService(
+                                Context.AUDIO_SERVICE);
+                        am.unregisterMediaButtonEventReceiver(mMediaButtonReceiverComponentName);
+                    }
+                    mIsMbrRegistered = false;
+                }
+                // On API 14+ register a RCC if it's supported, unregister it if
+                // not.
+                if (android.os.Build.VERSION.SDK_INT >= 14) {
+                    if (!mIsRccRegistered && (mFlags & FLAG_HANDLES_TRANSPORT_CONTROLS) != 0) {
+                        MediaSessionCompatApi14.registerRemoteControlClient(mContext, mRccObj);
+                        mIsRccRegistered = true;
+                        registeredRcc = true;
+                    } else if (mIsRccRegistered
+                            && (mFlags & FLAG_HANDLES_TRANSPORT_CONTROLS) == 0) {
+                        // RCC keeps the state while the system resets its state internally when
+                        // we register RCC. Reset the state so that the states in RCC and the system
+                        // are in sync when we re-register the RCC.
+                        MediaSessionCompatApi14.setState(mRccObj, PlaybackStateCompat.STATE_NONE);
+                        MediaSessionCompatApi14.unregisterRemoteControlClient(mContext, mRccObj);
+                        mIsRccRegistered = false;
+                    }
+                }
+            } else {
+                // When inactive remove any registered components.
+                if (mIsMbrRegistered) {
+                    if (android.os.Build.VERSION.SDK_INT >= 18) {
+                        MediaSessionCompatApi18.unregisterMediaButtonEventReceiver(mContext,
+                                mMediaButtonReceiverIntent, mMediaButtonReceiverComponentName);
+                    } else {
+                        AudioManager am = (AudioManager) mContext.getSystemService(
+                                Context.AUDIO_SERVICE);
+                        am.unregisterMediaButtonEventReceiver(mMediaButtonReceiverComponentName);
+                    }
+                    mIsMbrRegistered = false;
+                }
+                if (mIsRccRegistered) {
+                    // RCC keeps the state while the system resets its state internally when
+                    // we register RCC. Reset the state so that the states in RCC and the system
+                    // are in sync when we re-register the RCC.
+                    MediaSessionCompatApi14.setState(mRccObj, PlaybackStateCompat.STATE_NONE);
+                    MediaSessionCompatApi14.unregisterRemoteControlClient(mContext, mRccObj);
+                    mIsRccRegistered = false;
+                }
+            }
+            return registeredRcc;
+        }
+
+        private void adjustVolume(int direction, int flags) {
+            if (mVolumeType == MediaControllerCompat.PlaybackInfo.PLAYBACK_TYPE_REMOTE) {
+                if (mVolumeProvider != null) {
+                    mVolumeProvider.onAdjustVolume(direction);
+                }
+            } else {
+                mAudioManager.adjustStreamVolume(mLocalStream, direction, flags);
+            }
+        }
+
+        private void setVolumeTo(int value, int flags) {
+            if (mVolumeType == MediaControllerCompat.PlaybackInfo.PLAYBACK_TYPE_REMOTE) {
+                if (mVolumeProvider != null) {
+                    mVolumeProvider.onSetVolumeTo(value);
+                }
+            } else {
+                mAudioManager.setStreamVolume(mLocalStream, value, flags);
+            }
+        }
+
+        private PlaybackStateCompat getStateWithUpdatedPosition() {
+            PlaybackStateCompat state;
+            long duration = -1;
+            synchronized (mLock) {
+                state = mState;
+                if (mMetadata != null
+                        && mMetadata.containsKey(MediaMetadataCompat.METADATA_KEY_DURATION)) {
+                    duration = mMetadata.getLong(MediaMetadataCompat.METADATA_KEY_DURATION);
+                }
+            }
+
+            PlaybackStateCompat result = null;
+            if (state != null) {
+                if (state.getState() == PlaybackStateCompat.STATE_PLAYING
+                        || state.getState() == PlaybackStateCompat.STATE_FAST_FORWARDING
+                        || state.getState() == PlaybackStateCompat.STATE_REWINDING) {
+                    long updateTime = state.getLastPositionUpdateTime();
+                    long currentTime = SystemClock.elapsedRealtime();
+                    if (updateTime > 0) {
+                        long position = (long) (state.getPlaybackSpeed()
+                                * (currentTime - updateTime)) + state.getPosition();
+                        if (duration >= 0 && position > duration) {
+                            position = duration;
+                        } else if (position < 0) {
+                            position = 0;
+                        }
+                        PlaybackStateCompat.Builder builder = new PlaybackStateCompat.Builder(
+                                state);
+                        builder.setState(state.getState(), position, state.getPlaybackSpeed(),
+                                currentTime);
+                        result = builder.build();
+                    }
+                }
+            }
+            return result == null ? state : result;
+        }
+
+        private void sendVolumeInfoChanged(ParcelableVolumeInfo info) {
+            int size = mControllerCallbacks.beginBroadcast();
+            for (int i = size - 1; i >= 0; i--) {
+                IMediaControllerCallback cb = mControllerCallbacks.getBroadcastItem(i);
+                try {
+                    cb.onVolumeInfoChanged(info);
+                } catch (RemoteException e) {
+                }
+            }
+            mControllerCallbacks.finishBroadcast();
+        }
+
+        private void sendSessionDestroyed() {
+            int size = mControllerCallbacks.beginBroadcast();
+            for (int i = size - 1; i >= 0; i--) {
+                IMediaControllerCallback cb = mControllerCallbacks.getBroadcastItem(i);
+                try {
+                    cb.onSessionDestroyed();
+                } catch (RemoteException e) {
+                }
+            }
+            mControllerCallbacks.finishBroadcast();
+            mControllerCallbacks.kill();
+        }
+
+        private void sendEvent(String event, Bundle extras) {
+            int size = mControllerCallbacks.beginBroadcast();
+            for (int i = size - 1; i >= 0; i--) {
+                IMediaControllerCallback cb = mControllerCallbacks.getBroadcastItem(i);
+                try {
+                    cb.onEvent(event, extras);
+                } catch (RemoteException e) {
+                }
+            }
+            mControllerCallbacks.finishBroadcast();
+        }
+
+        private void sendState(PlaybackStateCompat state) {
+            int size = mControllerCallbacks.beginBroadcast();
+            for (int i = size - 1; i >= 0; i--) {
+                IMediaControllerCallback cb = mControllerCallbacks.getBroadcastItem(i);
+                try {
+                    cb.onPlaybackStateChanged(state);
+                } catch (RemoteException e) {
+                }
+            }
+            mControllerCallbacks.finishBroadcast();
+        }
+
+        private void sendMetadata(MediaMetadataCompat metadata) {
+            int size = mControllerCallbacks.beginBroadcast();
+            for (int i = size - 1; i >= 0; i--) {
+                IMediaControllerCallback cb = mControllerCallbacks.getBroadcastItem(i);
+                try {
+                    cb.onMetadataChanged(metadata);
+                } catch (RemoteException e) {
+                }
+            }
+            mControllerCallbacks.finishBroadcast();
+        }
+
+        private void sendQueue(List<QueueItem> queue) {
+            int size = mControllerCallbacks.beginBroadcast();
+            for (int i = size - 1; i >= 0; i--) {
+                IMediaControllerCallback cb = mControllerCallbacks.getBroadcastItem(i);
+                try {
+                    cb.onQueueChanged(queue);
+                } catch (RemoteException e) {
+                }
+            }
+            mControllerCallbacks.finishBroadcast();
+        }
+
+        private void sendQueueTitle(CharSequence queueTitle) {
+            int size = mControllerCallbacks.beginBroadcast();
+            for (int i = size - 1; i >= 0; i--) {
+                IMediaControllerCallback cb = mControllerCallbacks.getBroadcastItem(i);
+                try {
+                    cb.onQueueTitleChanged(queueTitle);
+                } catch (RemoteException e) {
+                }
+            }
+            mControllerCallbacks.finishBroadcast();
+        }
+
+        class MediaSessionStub extends IMediaSession.Stub {
+            @Override
+            public void sendCommand(String command, Bundle args, ResultReceiverWrapper cb) {
+                postToHandler(MessageHandler.MSG_COMMAND,
+                        new Command(command, args, cb.mResultReceiver));
+            }
+
+            @Override
+            public boolean sendMediaButton(KeyEvent mediaButton) {
+                boolean handlesMediaButtons =
+                        (mFlags & MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS) != 0;
+                if (handlesMediaButtons) {
+                    postToHandler(MessageHandler.MSG_MEDIA_BUTTON, mediaButton);
+                }
+                return handlesMediaButtons;
+            }
+
+            @Override
+            public void registerCallbackListener(IMediaControllerCallback cb) {
+                // If this session is already destroyed tell the caller and
+                // don't add them.
+                if (mDestroyed) {
+                    try {
+                        cb.onSessionDestroyed();
+                    } catch (Exception e) {
+                        // ignored
+                    }
+                    return;
+                }
+                mControllerCallbacks.register(cb);
+            }
+
+            @Override
+            public void unregisterCallbackListener(IMediaControllerCallback cb) {
+                mControllerCallbacks.unregister(cb);
+            }
+
+            @Override
+            public String getPackageName() {
+                // mPackageName is final so doesn't need synchronize block
+                return mPackageName;
+            }
+
+            @Override
+            public String getTag() {
+                // mTag is final so doesn't need synchronize block
+                return mTag;
+            }
+
+            @Override
+            public PendingIntent getLaunchPendingIntent() {
+                synchronized (mLock) {
+                    return mSessionActivity;
+                }
+            }
+
+            @Override
+            @SessionFlags
+            public long getFlags() {
+                synchronized (mLock) {
+                    return mFlags;
+                }
+            }
+
+            @Override
+            public ParcelableVolumeInfo getVolumeAttributes() {
+                int controlType;
+                int max;
+                int current;
+                int stream;
+                int volumeType;
+                synchronized (mLock) {
+                    volumeType = mVolumeType;
+                    stream = mLocalStream;
+                    VolumeProviderCompat vp = mVolumeProvider;
+                    if (volumeType == MediaControllerCompat.PlaybackInfo.PLAYBACK_TYPE_REMOTE) {
+                        controlType = vp.getVolumeControl();
+                        max = vp.getMaxVolume();
+                        current = vp.getCurrentVolume();
+                    } else {
+                        controlType = VolumeProviderCompat.VOLUME_CONTROL_ABSOLUTE;
+                        max = mAudioManager.getStreamMaxVolume(stream);
+                        current = mAudioManager.getStreamVolume(stream);
+                    }
+                }
+                return new ParcelableVolumeInfo(volumeType, stream, controlType, max, current);
+            }
+
+            @Override
+            public void adjustVolume(int direction, int flags, String packageName) {
+                MediaSessionImplBase.this.adjustVolume(direction, flags);
+            }
+
+            @Override
+            public void setVolumeTo(int value, int flags, String packageName) {
+                MediaSessionImplBase.this.setVolumeTo(value, flags);
+            }
+
+            @Override
+            public void prepare() throws RemoteException {
+                postToHandler(MessageHandler.MSG_PREPARE);
+            }
+
+            @Override
+            public void prepareFromMediaId(String mediaId, Bundle extras) throws RemoteException {
+                postToHandler(MessageHandler.MSG_PREPARE_MEDIA_ID, mediaId, extras);
+            }
+
+            @Override
+            public void prepareFromSearch(String query, Bundle extras) throws RemoteException {
+                postToHandler(MessageHandler.MSG_PREPARE_SEARCH, query, extras);
+            }
+
+            @Override
+            public void prepareFromUri(Uri uri, Bundle extras) throws RemoteException {
+                postToHandler(MessageHandler.MSG_PREPARE_URI, uri, extras);
+            }
+
+            @Override
+            public void play() throws RemoteException {
+                postToHandler(MessageHandler.MSG_PLAY);
+            }
+
+            @Override
+            public void playFromMediaId(String mediaId, Bundle extras) throws RemoteException {
+                postToHandler(MessageHandler.MSG_PLAY_MEDIA_ID, mediaId, extras);
+            }
+
+            @Override
+            public void playFromSearch(String query, Bundle extras) throws RemoteException {
+                postToHandler(MessageHandler.MSG_PLAY_SEARCH, query, extras);
+            }
+
+            @Override
+            public void playFromUri(Uri uri, Bundle extras) throws RemoteException {
+                postToHandler(MessageHandler.MSG_PLAY_URI, uri, extras);
+            }
+
+            @Override
+            public void skipToQueueItem(long id) {
+                postToHandler(MessageHandler.MSG_SKIP_TO_ITEM, id);
+            }
+
+            @Override
+            public void pause() throws RemoteException {
+                postToHandler(MessageHandler.MSG_PAUSE);
+            }
+
+            @Override
+            public void stop() throws RemoteException {
+                postToHandler(MessageHandler.MSG_STOP);
+            }
+
+            @Override
+            public void next() throws RemoteException {
+                postToHandler(MessageHandler.MSG_NEXT);
+            }
+
+            @Override
+            public void previous() throws RemoteException {
+                postToHandler(MessageHandler.MSG_PREVIOUS);
+            }
+
+            @Override
+            public void fastForward() throws RemoteException {
+                postToHandler(MessageHandler.MSG_FAST_FORWARD);
+            }
+
+            @Override
+            public void rewind() throws RemoteException {
+                postToHandler(MessageHandler.MSG_REWIND);
+            }
+
+            @Override
+            public void seekTo(long pos) throws RemoteException {
+                postToHandler(MessageHandler.MSG_SEEK_TO, pos);
+            }
+
+            @Override
+            public void rate(RatingCompat rating) throws RemoteException {
+                postToHandler(MessageHandler.MSG_RATE, rating);
+            }
+
+            @Override
+            public void sendCustomAction(String action, Bundle args)
+                    throws RemoteException {
+                postToHandler(MessageHandler.MSG_CUSTOM_ACTION, action, args);
+            }
+
+            @Override
+            public MediaMetadataCompat getMetadata() {
+                return mMetadata;
+            }
+
+            @Override
+            public PlaybackStateCompat getPlaybackState() {
+                return getStateWithUpdatedPosition();
+            }
+
+            @Override
+            public List<QueueItem> getQueue() {
+                synchronized (mLock) {
+                    return mQueue;
+                }
+            }
+
+            @Override
+            public CharSequence getQueueTitle() {
+                return mQueueTitle;
+            }
+
+            @Override
+            public Bundle getExtras() {
+                synchronized (mLock) {
+                    return mExtras;
+                }
+            }
+
+            @Override
+            @RatingCompat.Style
+            public int getRatingType() {
+                return mRatingType;
+            }
+
+            @Override
+            public boolean isTransportControlEnabled() {
+                return (mFlags & FLAG_HANDLES_TRANSPORT_CONTROLS) != 0;
+            }
+        }
+
+        private static final class Command {
+            public final String command;
+            public final Bundle extras;
+            public final ResultReceiver stub;
+
+            public Command(String command, Bundle extras, ResultReceiver stub) {
+                this.command = command;
+                this.extras = extras;
+                this.stub = stub;
+            }
+        }
+
+        private class MessageHandler extends Handler {
+
+            private static final int MSG_COMMAND = 1;
+            private static final int MSG_ADJUST_VOLUME = 2;
+            private static final int MSG_PREPARE = 3;
+            private static final int MSG_PREPARE_MEDIA_ID = 4;
+            private static final int MSG_PREPARE_SEARCH = 5;
+            private static final int MSG_PREPARE_URI = 6;
+            private static final int MSG_PLAY = 7;
+            private static final int MSG_PLAY_MEDIA_ID = 8;
+            private static final int MSG_PLAY_SEARCH = 9;
+            private static final int MSG_PLAY_URI = 10;
+            private static final int MSG_SKIP_TO_ITEM = 11;
+            private static final int MSG_PAUSE = 12;
+            private static final int MSG_STOP = 13;
+            private static final int MSG_NEXT = 14;
+            private static final int MSG_PREVIOUS = 15;
+            private static final int MSG_FAST_FORWARD = 16;
+            private static final int MSG_REWIND = 17;
+            private static final int MSG_SEEK_TO = 18;
+            private static final int MSG_RATE = 19;
+            private static final int MSG_CUSTOM_ACTION = 20;
+            private static final int MSG_MEDIA_BUTTON = 21;
+            private static final int MSG_SET_VOLUME = 22;
+
+            // KeyEvent constants only available on API 11+
+            private static final int KEYCODE_MEDIA_PAUSE = 127;
+            private static final int KEYCODE_MEDIA_PLAY = 126;
+
+            public MessageHandler(Looper looper) {
+                super(looper);
+            }
+
+            public void post(int what, Object obj, Bundle bundle) {
+                Message msg = obtainMessage(what, obj);
+                msg.setData(bundle);
+                msg.sendToTarget();
+            }
+
+            public void post(int what, Object obj) {
+                obtainMessage(what, obj).sendToTarget();
+            }
+
+            public void post(int what) {
+                post(what, null);
+            }
+
+            public void post(int what, Object obj, int arg1) {
+                obtainMessage(what, arg1, 0, obj).sendToTarget();
+            }
+
+            @Override
+            public void handleMessage(Message msg) {
+                MediaSessionCompat.Callback cb = mCallback;
+                if (cb == null) {
+                    return;
+                }
+                switch (msg.what) {
+                    case MSG_COMMAND:
+                        Command cmd = (Command) msg.obj;
+                        cb.onCommand(cmd.command, cmd.extras, cmd.stub);
+                        break;
+                    case MSG_MEDIA_BUTTON:
+                        KeyEvent keyEvent = (KeyEvent) msg.obj;
+                        Intent intent = new Intent(Intent.ACTION_MEDIA_BUTTON);
+                        intent.putExtra(Intent.EXTRA_KEY_EVENT, keyEvent);
+                        // Let the Callback handle events first before using the default behavior
+                        if (!cb.onMediaButtonEvent(intent)) {
+                            onMediaButtonEvent(keyEvent, cb);
+                        }
+                        break;
+                    case MSG_PREPARE:
+                        cb.onPrepare();
+                        break;
+                    case MSG_PREPARE_MEDIA_ID:
+                        cb.onPrepareFromMediaId((String) msg.obj, msg.getData());
+                        break;
+                    case MSG_PREPARE_SEARCH:
+                        cb.onPrepareFromSearch((String) msg.obj, msg.getData());
+                        break;
+                    case MSG_PREPARE_URI:
+                        cb.onPrepareFromUri((Uri) msg.obj, msg.getData());
+                        break;
+                    case MSG_PLAY:
+                        cb.onPlay();
+                        break;
+                    case MSG_PLAY_MEDIA_ID:
+                        cb.onPlayFromMediaId((String) msg.obj, msg.getData());
+                        break;
+                    case MSG_PLAY_SEARCH:
+                        cb.onPlayFromSearch((String) msg.obj, msg.getData());
+                        break;
+                    case MSG_PLAY_URI:
+                        cb.onPlayFromUri((Uri) msg.obj, msg.getData());
+                        break;
+                    case MSG_SKIP_TO_ITEM:
+                        cb.onSkipToQueueItem((Long) msg.obj);
+                        break;
+                    case MSG_PAUSE:
+                        cb.onPause();
+                        break;
+                    case MSG_STOP:
+                        cb.onStop();
+                        break;
+                    case MSG_NEXT:
+                        cb.onSkipToNext();
+                        break;
+                    case MSG_PREVIOUS:
+                        cb.onSkipToPrevious();
+                        break;
+                    case MSG_FAST_FORWARD:
+                        cb.onFastForward();
+                        break;
+                    case MSG_REWIND:
+                        cb.onRewind();
+                        break;
+                    case MSG_SEEK_TO:
+                        cb.onSeekTo((Long) msg.obj);
+                        break;
+                    case MSG_RATE:
+                        cb.onSetRating((RatingCompat) msg.obj);
+                        break;
+                    case MSG_CUSTOM_ACTION:
+                        cb.onCustomAction((String) msg.obj, msg.getData());
+                        break;
+                    case MSG_ADJUST_VOLUME:
+                        adjustVolume((int) msg.obj, 0);
+                        break;
+                    case MSG_SET_VOLUME:
+                        setVolumeTo((int) msg.obj, 0);
+                        break;
+                }
+            }
+
+            private void onMediaButtonEvent(KeyEvent ke, MediaSessionCompat.Callback cb) {
+                if (ke == null || ke.getAction() != KeyEvent.ACTION_DOWN) {
+                    return;
+                }
+                long validActions = mState == null ? 0 : mState.getActions();
+                switch (ke.getKeyCode()) {
+                    // Note KeyEvent.KEYCODE_MEDIA_PLAY is API 11+
+                    case KEYCODE_MEDIA_PLAY:
+                        if ((validActions & PlaybackStateCompat.ACTION_PLAY) != 0) {
+                            cb.onPlay();
+                        }
+                        break;
+                    // Note KeyEvent.KEYCODE_MEDIA_PAUSE is API 11+
+                    case KEYCODE_MEDIA_PAUSE:
+                        if ((validActions & PlaybackStateCompat.ACTION_PAUSE) != 0) {
+                            cb.onPause();
+                        }
+                        break;
+                    case KeyEvent.KEYCODE_MEDIA_NEXT:
+                        if ((validActions & PlaybackStateCompat.ACTION_SKIP_TO_NEXT) != 0) {
+                            cb.onSkipToNext();
+                        }
+                        break;
+                    case KeyEvent.KEYCODE_MEDIA_PREVIOUS:
+                        if ((validActions & PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS) != 0) {
+                            cb.onSkipToPrevious();
+                        }
+                        break;
+                    case KeyEvent.KEYCODE_MEDIA_STOP:
+                        if ((validActions & PlaybackStateCompat.ACTION_STOP) != 0) {
+                            cb.onStop();
+                        }
+                        break;
+                    case KeyEvent.KEYCODE_MEDIA_FAST_FORWARD:
+                        if ((validActions & PlaybackStateCompat.ACTION_FAST_FORWARD) != 0) {
+                            cb.onFastForward();
+                        }
+                        break;
+                    case KeyEvent.KEYCODE_MEDIA_REWIND:
+                        if ((validActions & PlaybackStateCompat.ACTION_REWIND) != 0) {
+                            cb.onRewind();
+                        }
+                        break;
+                    case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE:
+                    case KeyEvent.KEYCODE_HEADSETHOOK:
+                        boolean isPlaying = mState != null
+                                && mState.getState() == PlaybackStateCompat.STATE_PLAYING;
+                        boolean canPlay = (validActions & (PlaybackStateCompat.ACTION_PLAY_PAUSE
+                                | PlaybackStateCompat.ACTION_PLAY)) != 0;
+                        boolean canPause = (validActions & (PlaybackStateCompat.ACTION_PLAY_PAUSE
+                                | PlaybackStateCompat.ACTION_PAUSE)) != 0;
+                        if (isPlaying && canPause) {
+                            cb.onPause();
+                        } else if (!isPlaying && canPlay) {
+                            cb.onPlay();
+                        }
+                        break;
+                }
+            }
+        }
+    }
+
+    static class MediaSessionImplApi21 implements MediaSessionImpl {
+        private final Object mSessionObj;
+        private final Token mToken;
+
+        private PendingIntent mMediaButtonIntent;
+
+        public MediaSessionImplApi21(Context context, String tag) {
+            mSessionObj = MediaSessionCompatApi21.createSession(context, tag);
+            mToken = new Token(MediaSessionCompatApi21.getSessionToken(mSessionObj));
+        }
+
+        public MediaSessionImplApi21(Object mediaSession) {
+            mSessionObj = MediaSessionCompatApi21.verifySession(mediaSession);
+            mToken = new Token(MediaSessionCompatApi21.getSessionToken(mSessionObj));
+        }
+
+        @Override
+        public void setCallback(Callback callback, Handler handler) {
+            MediaSessionCompatApi21.setCallback(mSessionObj,
+                    callback == null ? null : callback.mCallbackObj, handler);
+        }
+
+        @Override
+        public void setFlags(@SessionFlags int flags) {
+            MediaSessionCompatApi21.setFlags(mSessionObj, flags);
+        }
+
+        @Override
+        public void setPlaybackToLocal(int stream) {
+            MediaSessionCompatApi21.setPlaybackToLocal(mSessionObj, stream);
+        }
+
+        @Override
+        public void setPlaybackToRemote(VolumeProviderCompat volumeProvider) {
+            MediaSessionCompatApi21.setPlaybackToRemote(mSessionObj,
+                    volumeProvider.getVolumeProvider());
+        }
+
+        @Override
+        public void setActive(boolean active) {
+            MediaSessionCompatApi21.setActive(mSessionObj, active);
+        }
+
+        @Override
+        public boolean isActive() {
+            return MediaSessionCompatApi21.isActive(mSessionObj);
+        }
+
+        @Override
+        public void sendSessionEvent(String event, Bundle extras) {
+            MediaSessionCompatApi21.sendSessionEvent(mSessionObj, event, extras);
+        }
+
+        @Override
+        public void release() {
+            MediaSessionCompatApi21.release(mSessionObj);
+        }
+
+        @Override
+        public Token getSessionToken() {
+            return mToken;
+        }
+
+        @Override
+        public void setPlaybackState(PlaybackStateCompat state) {
+            MediaSessionCompatApi21.setPlaybackState(mSessionObj,
+                    state == null ? null : state.getPlaybackState());
+        }
+
+        @Override
+        public void setMetadata(MediaMetadataCompat metadata) {
+            MediaSessionCompatApi21.setMetadata(mSessionObj,
+                    metadata == null ? null : metadata.getMediaMetadata());
+        }
+
+        @Override
+        public void setSessionActivity(PendingIntent pi) {
+            MediaSessionCompatApi21.setSessionActivity(mSessionObj, pi);
+        }
+
+        @Override
+        public void setMediaButtonReceiver(PendingIntent mbr) {
+            mMediaButtonIntent = mbr;
+            MediaSessionCompatApi21.setMediaButtonReceiver(mSessionObj, mbr);
+        }
+
+        @Override
+        public void setQueue(List<QueueItem> queue) {
+            List<Object> queueObjs = null;
+            if (queue != null) {
+                queueObjs = new ArrayList<>();
+                for (QueueItem item : queue) {
+                    queueObjs.add(item.getQueueItem());
+                }
+            }
+            MediaSessionCompatApi21.setQueue(mSessionObj, queueObjs);
+        }
+
+        @Override
+        public void setQueueTitle(CharSequence title) {
+            MediaSessionCompatApi21.setQueueTitle(mSessionObj, title);
+        }
+
+        @Override
+        public void setRatingType(@RatingCompat.Style int type) {
+            if (android.os.Build.VERSION.SDK_INT < 22) {
+                // TODO figure out 21 implementation
+            } else {
+                MediaSessionCompatApi22.setRatingType(mSessionObj, type);
+            }
+        }
+
+        @Override
+        public void setExtras(Bundle extras) {
+            MediaSessionCompatApi21.setExtras(mSessionObj, extras);
+        }
+
+        @Override
+        public Object getMediaSession() {
+            return mSessionObj;
+        }
+
+        @Override
+        public Object getRemoteControlClient() {
+            return null;
+        }
+
+        @Override
+        public String getCallingPackage() {
+            if (android.os.Build.VERSION.SDK_INT < 24) {
+                return null;
+            } else {
+                return MediaSessionCompatApi24.getCallingPackage(mSessionObj);
+            }
+        }
+    }
+}
diff --git a/v4/java/android/support/v4/media/session/ParcelableVolumeInfo.aidl b/media-compat/java/android/support/v4/media/session/ParcelableVolumeInfo.aidl
similarity index 100%
rename from v4/java/android/support/v4/media/session/ParcelableVolumeInfo.aidl
rename to media-compat/java/android/support/v4/media/session/ParcelableVolumeInfo.aidl
diff --git a/v4/java/android/support/v4/media/session/ParcelableVolumeInfo.java b/media-compat/java/android/support/v4/media/session/ParcelableVolumeInfo.java
similarity index 100%
rename from v4/java/android/support/v4/media/session/ParcelableVolumeInfo.java
rename to media-compat/java/android/support/v4/media/session/ParcelableVolumeInfo.java
diff --git a/v4/java/android/support/v4/media/session/PlaybackStateCompat.aidl b/media-compat/java/android/support/v4/media/session/PlaybackStateCompat.aidl
similarity index 100%
rename from v4/java/android/support/v4/media/session/PlaybackStateCompat.aidl
rename to media-compat/java/android/support/v4/media/session/PlaybackStateCompat.aidl
diff --git a/v4/java/android/support/v4/media/session/PlaybackStateCompat.java b/media-compat/java/android/support/v4/media/session/PlaybackStateCompat.java
similarity index 100%
rename from v4/java/android/support/v4/media/session/PlaybackStateCompat.java
rename to media-compat/java/android/support/v4/media/session/PlaybackStateCompat.java
diff --git a/v4/jellybean-mr2/android/support/v4/media/TransportMediatorCallback.java b/media-compat/jellybean-mr2/android/support/v4/media/TransportMediatorCallback.java
similarity index 100%
rename from v4/jellybean-mr2/android/support/v4/media/TransportMediatorCallback.java
rename to media-compat/jellybean-mr2/android/support/v4/media/TransportMediatorCallback.java
diff --git a/v4/jellybean-mr2/android/support/v4/media/TransportMediatorJellybeanMR2.java b/media-compat/jellybean-mr2/android/support/v4/media/TransportMediatorJellybeanMR2.java
similarity index 100%
rename from v4/jellybean-mr2/android/support/v4/media/TransportMediatorJellybeanMR2.java
rename to media-compat/jellybean-mr2/android/support/v4/media/TransportMediatorJellybeanMR2.java
diff --git a/v4/jellybean-mr2/android/support/v4/media/session/MediaSessionCompatApi18.java b/media-compat/jellybean-mr2/android/support/v4/media/session/MediaSessionCompatApi18.java
similarity index 100%
rename from v4/jellybean-mr2/android/support/v4/media/session/MediaSessionCompatApi18.java
rename to media-compat/jellybean-mr2/android/support/v4/media/session/MediaSessionCompatApi18.java
diff --git a/v4/kitkat/android/support/v4/media/RatingCompatKitkat.java b/media-compat/kitkat/android/support/v4/media/RatingCompatKitkat.java
similarity index 100%
rename from v4/kitkat/android/support/v4/media/RatingCompatKitkat.java
rename to media-compat/kitkat/android/support/v4/media/RatingCompatKitkat.java
diff --git a/v4/kitkat/android/support/v4/media/session/MediaSessionCompatApi19.java b/media-compat/kitkat/android/support/v4/media/session/MediaSessionCompatApi19.java
similarity index 100%
rename from v4/kitkat/android/support/v4/media/session/MediaSessionCompatApi19.java
rename to media-compat/kitkat/android/support/v4/media/session/MediaSessionCompatApi19.java
diff --git a/percent/Android.mk b/percent/Android.mk
index 59556c0..ecec417 100644
--- a/percent/Android.mk
+++ b/percent/Android.mk
@@ -19,12 +19,12 @@
 #
 #   LOCAL_STATIC_ANDROID_LIBRARIES := \
 #       android-support-percent \
-#       android-support-v4
+#       android-support-compat
 #
 include $(CLEAR_VARS)
 LOCAL_USE_AAPT2 := true
 LOCAL_MODULE := android-support-percent
-LOCAL_SDK_VERSION := 8
+LOCAL_SDK_VERSION := 9
 LOCAL_SDK_RES_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
 LOCAL_SRC_FILES := $(call all-java-files-under, src)
 LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
@@ -33,12 +33,3 @@
 LOCAL_JAVA_LANGUAGE_VERSION := 1.7
 LOCAL_AAPT_FLAGS := --add-javadoc-annotation doconly
 include $(BUILD_STATIC_JAVA_LIBRARY)
-
-# API Check
-# ---------------------------------------------
-support_module := $(LOCAL_MODULE)
-support_module_api_dir := $(LOCAL_PATH)/api
-support_module_src_files := $(LOCAL_SRC_FILES)
-support_module_java_libraries := $(LOCAL_JAVA_LIBRARIES)
-support_module_java_packages := android.support.percent
-include $(SUPPORT_API_CHECK)
diff --git a/percent/AndroidManifest.xml b/percent/AndroidManifest.xml
index 8668424..e979013 100644
--- a/percent/AndroidManifest.xml
+++ b/percent/AndroidManifest.xml
@@ -15,6 +15,6 @@
 -->
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
           package="android.support.percent">
-    <uses-sdk android:minSdkVersion="8"/>
+    <uses-sdk android:minSdkVersion="9"/>
     <application />
 </manifest>
diff --git a/percent/api/23.0.0.txt b/percent/api/23.0.0.txt
deleted file mode 100644
index 34d0302..0000000
--- a/percent/api/23.0.0.txt
+++ /dev/null
@@ -1,64 +0,0 @@
-package android.support.percent {
-
-  public class PercentFrameLayout extends android.widget.FrameLayout {
-    ctor public PercentFrameLayout(android.content.Context);
-    ctor public PercentFrameLayout(android.content.Context, android.util.AttributeSet);
-    ctor public PercentFrameLayout(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public static class PercentFrameLayout.LayoutParams extends android.widget.FrameLayout.LayoutParams implements android.support.percent.PercentLayoutHelper.PercentLayoutParams {
-    ctor public PercentFrameLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public PercentFrameLayout.LayoutParams(int, int);
-    ctor public PercentFrameLayout.LayoutParams(int, int, int);
-    ctor public PercentFrameLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public PercentFrameLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public PercentFrameLayout.LayoutParams(android.widget.FrameLayout.LayoutParams);
-    ctor public PercentFrameLayout.LayoutParams(android.support.percent.PercentFrameLayout.LayoutParams);
-    method public android.support.percent.PercentLayoutHelper.PercentLayoutInfo getPercentLayoutInfo();
-  }
-
-  public class PercentLayoutHelper {
-    ctor public PercentLayoutHelper(android.view.ViewGroup);
-    method public void adjustChildren(int, int);
-    method public static void fetchWidthAndHeight(android.view.ViewGroup.LayoutParams, android.content.res.TypedArray, int, int);
-    method public static android.support.percent.PercentLayoutHelper.PercentLayoutInfo getPercentLayoutInfo(android.content.Context, android.util.AttributeSet);
-    method public boolean handleMeasuredStateTooSmall();
-    method public void restoreOriginalParams();
-  }
-
-  public static class PercentLayoutHelper.PercentLayoutInfo {
-    ctor public PercentLayoutHelper.PercentLayoutInfo();
-    method public void fillLayoutParams(android.view.ViewGroup.LayoutParams, int, int);
-    method public void fillMarginLayoutParams(android.view.ViewGroup.MarginLayoutParams, int, int);
-    method public void restoreLayoutParams(android.view.ViewGroup.LayoutParams);
-    method public void restoreMarginLayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    field public float bottomMarginPercent;
-    field public float endMarginPercent;
-    field public float heightPercent;
-    field public float leftMarginPercent;
-    field public float rightMarginPercent;
-    field public float startMarginPercent;
-    field public float topMarginPercent;
-    field public float widthPercent;
-  }
-
-  public static abstract interface PercentLayoutHelper.PercentLayoutParams {
-    method public abstract android.support.percent.PercentLayoutHelper.PercentLayoutInfo getPercentLayoutInfo();
-  }
-
-  public class PercentRelativeLayout extends android.widget.RelativeLayout {
-    ctor public PercentRelativeLayout(android.content.Context);
-    ctor public PercentRelativeLayout(android.content.Context, android.util.AttributeSet);
-    ctor public PercentRelativeLayout(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public static class PercentRelativeLayout.LayoutParams extends android.widget.RelativeLayout.LayoutParams implements android.support.percent.PercentLayoutHelper.PercentLayoutParams {
-    ctor public PercentRelativeLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public PercentRelativeLayout.LayoutParams(int, int);
-    ctor public PercentRelativeLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public PercentRelativeLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    method public android.support.percent.PercentLayoutHelper.PercentLayoutInfo getPercentLayoutInfo();
-  }
-
-}
-
diff --git a/percent/api/23.1.0.txt b/percent/api/23.1.0.txt
deleted file mode 100644
index eb10df8..0000000
--- a/percent/api/23.1.0.txt
+++ /dev/null
@@ -1,65 +0,0 @@
-package android.support.percent {
-
-  public class PercentFrameLayout extends android.widget.FrameLayout {
-    ctor public PercentFrameLayout(android.content.Context);
-    ctor public PercentFrameLayout(android.content.Context, android.util.AttributeSet);
-    ctor public PercentFrameLayout(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public static class PercentFrameLayout.LayoutParams extends android.widget.FrameLayout.LayoutParams implements android.support.percent.PercentLayoutHelper.PercentLayoutParams {
-    ctor public PercentFrameLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public PercentFrameLayout.LayoutParams(int, int);
-    ctor public PercentFrameLayout.LayoutParams(int, int, int);
-    ctor public PercentFrameLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public PercentFrameLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public PercentFrameLayout.LayoutParams(android.widget.FrameLayout.LayoutParams);
-    ctor public PercentFrameLayout.LayoutParams(android.support.percent.PercentFrameLayout.LayoutParams);
-    method public android.support.percent.PercentLayoutHelper.PercentLayoutInfo getPercentLayoutInfo();
-  }
-
-  public class PercentLayoutHelper {
-    ctor public PercentLayoutHelper(android.view.ViewGroup);
-    method public void adjustChildren(int, int);
-    method public static void fetchWidthAndHeight(android.view.ViewGroup.LayoutParams, android.content.res.TypedArray, int, int);
-    method public static android.support.percent.PercentLayoutHelper.PercentLayoutInfo getPercentLayoutInfo(android.content.Context, android.util.AttributeSet);
-    method public boolean handleMeasuredStateTooSmall();
-    method public void restoreOriginalParams();
-  }
-
-  public static class PercentLayoutHelper.PercentLayoutInfo {
-    ctor public PercentLayoutHelper.PercentLayoutInfo();
-    method public void fillLayoutParams(android.view.ViewGroup.LayoutParams, int, int);
-    method public void fillMarginLayoutParams(android.view.ViewGroup.MarginLayoutParams, int, int);
-    method public void restoreLayoutParams(android.view.ViewGroup.LayoutParams);
-    method public void restoreMarginLayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    field public float aspectRatio;
-    field public float bottomMarginPercent;
-    field public float endMarginPercent;
-    field public float heightPercent;
-    field public float leftMarginPercent;
-    field public float rightMarginPercent;
-    field public float startMarginPercent;
-    field public float topMarginPercent;
-    field public float widthPercent;
-  }
-
-  public static abstract interface PercentLayoutHelper.PercentLayoutParams {
-    method public abstract android.support.percent.PercentLayoutHelper.PercentLayoutInfo getPercentLayoutInfo();
-  }
-
-  public class PercentRelativeLayout extends android.widget.RelativeLayout {
-    ctor public PercentRelativeLayout(android.content.Context);
-    ctor public PercentRelativeLayout(android.content.Context, android.util.AttributeSet);
-    ctor public PercentRelativeLayout(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public static class PercentRelativeLayout.LayoutParams extends android.widget.RelativeLayout.LayoutParams implements android.support.percent.PercentLayoutHelper.PercentLayoutParams {
-    ctor public PercentRelativeLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public PercentRelativeLayout.LayoutParams(int, int);
-    ctor public PercentRelativeLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public PercentRelativeLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    method public android.support.percent.PercentLayoutHelper.PercentLayoutInfo getPercentLayoutInfo();
-  }
-
-}
-
diff --git a/percent/api/23.1.1.txt b/percent/api/23.1.1.txt
deleted file mode 100644
index eb10df8..0000000
--- a/percent/api/23.1.1.txt
+++ /dev/null
@@ -1,65 +0,0 @@
-package android.support.percent {
-
-  public class PercentFrameLayout extends android.widget.FrameLayout {
-    ctor public PercentFrameLayout(android.content.Context);
-    ctor public PercentFrameLayout(android.content.Context, android.util.AttributeSet);
-    ctor public PercentFrameLayout(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public static class PercentFrameLayout.LayoutParams extends android.widget.FrameLayout.LayoutParams implements android.support.percent.PercentLayoutHelper.PercentLayoutParams {
-    ctor public PercentFrameLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public PercentFrameLayout.LayoutParams(int, int);
-    ctor public PercentFrameLayout.LayoutParams(int, int, int);
-    ctor public PercentFrameLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public PercentFrameLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public PercentFrameLayout.LayoutParams(android.widget.FrameLayout.LayoutParams);
-    ctor public PercentFrameLayout.LayoutParams(android.support.percent.PercentFrameLayout.LayoutParams);
-    method public android.support.percent.PercentLayoutHelper.PercentLayoutInfo getPercentLayoutInfo();
-  }
-
-  public class PercentLayoutHelper {
-    ctor public PercentLayoutHelper(android.view.ViewGroup);
-    method public void adjustChildren(int, int);
-    method public static void fetchWidthAndHeight(android.view.ViewGroup.LayoutParams, android.content.res.TypedArray, int, int);
-    method public static android.support.percent.PercentLayoutHelper.PercentLayoutInfo getPercentLayoutInfo(android.content.Context, android.util.AttributeSet);
-    method public boolean handleMeasuredStateTooSmall();
-    method public void restoreOriginalParams();
-  }
-
-  public static class PercentLayoutHelper.PercentLayoutInfo {
-    ctor public PercentLayoutHelper.PercentLayoutInfo();
-    method public void fillLayoutParams(android.view.ViewGroup.LayoutParams, int, int);
-    method public void fillMarginLayoutParams(android.view.ViewGroup.MarginLayoutParams, int, int);
-    method public void restoreLayoutParams(android.view.ViewGroup.LayoutParams);
-    method public void restoreMarginLayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    field public float aspectRatio;
-    field public float bottomMarginPercent;
-    field public float endMarginPercent;
-    field public float heightPercent;
-    field public float leftMarginPercent;
-    field public float rightMarginPercent;
-    field public float startMarginPercent;
-    field public float topMarginPercent;
-    field public float widthPercent;
-  }
-
-  public static abstract interface PercentLayoutHelper.PercentLayoutParams {
-    method public abstract android.support.percent.PercentLayoutHelper.PercentLayoutInfo getPercentLayoutInfo();
-  }
-
-  public class PercentRelativeLayout extends android.widget.RelativeLayout {
-    ctor public PercentRelativeLayout(android.content.Context);
-    ctor public PercentRelativeLayout(android.content.Context, android.util.AttributeSet);
-    ctor public PercentRelativeLayout(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public static class PercentRelativeLayout.LayoutParams extends android.widget.RelativeLayout.LayoutParams implements android.support.percent.PercentLayoutHelper.PercentLayoutParams {
-    ctor public PercentRelativeLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public PercentRelativeLayout.LayoutParams(int, int);
-    ctor public PercentRelativeLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public PercentRelativeLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    method public android.support.percent.PercentLayoutHelper.PercentLayoutInfo getPercentLayoutInfo();
-  }
-
-}
-
diff --git a/percent/api/current.txt b/percent/api/current.txt
deleted file mode 100644
index 8559ddf..0000000
--- a/percent/api/current.txt
+++ /dev/null
@@ -1,66 +0,0 @@
-package android.support.percent {
-
-  public class PercentFrameLayout extends android.widget.FrameLayout {
-    ctor public PercentFrameLayout(android.content.Context);
-    ctor public PercentFrameLayout(android.content.Context, android.util.AttributeSet);
-    ctor public PercentFrameLayout(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public static class PercentFrameLayout.LayoutParams extends android.widget.FrameLayout.LayoutParams implements android.support.percent.PercentLayoutHelper.PercentLayoutParams {
-    ctor public PercentFrameLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public PercentFrameLayout.LayoutParams(int, int);
-    ctor public PercentFrameLayout.LayoutParams(int, int, int);
-    ctor public PercentFrameLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public PercentFrameLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public PercentFrameLayout.LayoutParams(android.widget.FrameLayout.LayoutParams);
-    ctor public PercentFrameLayout.LayoutParams(android.support.percent.PercentFrameLayout.LayoutParams);
-    method public android.support.percent.PercentLayoutHelper.PercentLayoutInfo getPercentLayoutInfo();
-  }
-
-  public class PercentLayoutHelper {
-    ctor public PercentLayoutHelper(android.view.ViewGroup);
-    method public void adjustChildren(int, int);
-    method public static void fetchWidthAndHeight(android.view.ViewGroup.LayoutParams, android.content.res.TypedArray, int, int);
-    method public static android.support.percent.PercentLayoutHelper.PercentLayoutInfo getPercentLayoutInfo(android.content.Context, android.util.AttributeSet);
-    method public boolean handleMeasuredStateTooSmall();
-    method public void restoreOriginalParams();
-  }
-
-  public static class PercentLayoutHelper.PercentLayoutInfo {
-    ctor public PercentLayoutHelper.PercentLayoutInfo();
-    method public void fillLayoutParams(android.view.ViewGroup.LayoutParams, int, int);
-    method public deprecated void fillMarginLayoutParams(android.view.ViewGroup.MarginLayoutParams, int, int);
-    method public void fillMarginLayoutParams(android.view.View, android.view.ViewGroup.MarginLayoutParams, int, int);
-    method public void restoreLayoutParams(android.view.ViewGroup.LayoutParams);
-    method public void restoreMarginLayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    field public float aspectRatio;
-    field public float bottomMarginPercent;
-    field public float endMarginPercent;
-    field public float heightPercent;
-    field public float leftMarginPercent;
-    field public float rightMarginPercent;
-    field public float startMarginPercent;
-    field public float topMarginPercent;
-    field public float widthPercent;
-  }
-
-  public static abstract interface PercentLayoutHelper.PercentLayoutParams {
-    method public abstract android.support.percent.PercentLayoutHelper.PercentLayoutInfo getPercentLayoutInfo();
-  }
-
-  public class PercentRelativeLayout extends android.widget.RelativeLayout {
-    ctor public PercentRelativeLayout(android.content.Context);
-    ctor public PercentRelativeLayout(android.content.Context, android.util.AttributeSet);
-    ctor public PercentRelativeLayout(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public static class PercentRelativeLayout.LayoutParams extends android.widget.RelativeLayout.LayoutParams implements android.support.percent.PercentLayoutHelper.PercentLayoutParams {
-    ctor public PercentRelativeLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public PercentRelativeLayout.LayoutParams(int, int);
-    ctor public PercentRelativeLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public PercentRelativeLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    method public android.support.percent.PercentLayoutHelper.PercentLayoutInfo getPercentLayoutInfo();
-  }
-
-}
-
diff --git a/percent/api/removed.txt b/percent/api/removed.txt
deleted file mode 100644
index e69de29..0000000
--- a/percent/api/removed.txt
+++ /dev/null
diff --git a/percent/build.gradle b/percent/build.gradle
index 0603ad9..b01d22f 100644
--- a/percent/build.gradle
+++ b/percent/build.gradle
@@ -3,7 +3,7 @@
 archivesBaseName = 'percent'
 
 dependencies {
-    compile project(':support-v4')
+    compile project(':support-compat')
 
     androidTestCompile ('com.android.support.test:runner:0.4.1') {
         exclude module: 'support-annotations'
@@ -18,7 +18,7 @@
     compileSdkVersion project.ext.currentSdk
 
     defaultConfig {
-        minSdkVersion 8
+        minSdkVersion 9
 
         testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
     }
diff --git a/percent/src/android/support/percent/PercentFrameLayout.java b/percent/src/android/support/percent/PercentFrameLayout.java
index 2041d70..3763d2f 100644
--- a/percent/src/android/support/percent/PercentFrameLayout.java
+++ b/percent/src/android/support/percent/PercentFrameLayout.java
@@ -40,7 +40,7 @@
  *         app:layout_heightPercent="50%"
  *         app:layout_marginTopPercent="25%"
  *         app:layout_marginLeftPercent="25%"/&gt
- * &lt;/android.support.percent.PercentFrameLayout/&gt
+ * &lt;/android.support.percent.PercentFrameLayout&gt
  * </pre>
  *
  * The attributes that you can use are:
diff --git a/percent/src/android/support/percent/PercentLayoutHelper.java b/percent/src/android/support/percent/PercentLayoutHelper.java
index a390c81..3cb5f47 100644
--- a/percent/src/android/support/percent/PercentLayoutHelper.java
+++ b/percent/src/android/support/percent/PercentLayoutHelper.java
@@ -28,6 +28,8 @@
 
 import android.support.percent.R;
 
+import java.lang.Math;
+
 /**
  * Helper for layouts that want to support percentage based dimensions.
  *
@@ -412,21 +414,21 @@
                             || mPreservedParams.height == 0) && (heightPercent < 0);
 
             if (widthPercent >= 0) {
-                params.width = (int) (widthHint * widthPercent);
+                params.width = Math.round(widthHint * widthPercent);
             }
 
             if (heightPercent >= 0) {
-                params.height = (int) (heightHint * heightPercent);
+                params.height = Math.round(heightHint * heightPercent);
             }
 
             if (aspectRatio >= 0) {
                 if (widthNotSet) {
-                    params.width = (int) (params.height * aspectRatio);
+                    params.width = Math.round(params.height * aspectRatio);
                     // Keep track that we've filled the width based on the height and aspect ratio.
                     mPreservedParams.mIsWidthComputedFromAspectRatio = true;
                 }
                 if (heightNotSet) {
-                    params.height = (int) (params.width / aspectRatio);
+                    params.height = Math.round(params.width / aspectRatio);
                     // Keep track that we've filled the height based on the width and aspect ratio.
                     mPreservedParams.mIsHeightComputedFromAspectRatio = true;
                 }
@@ -468,26 +470,26 @@
                     MarginLayoutParamsCompat.getMarginEnd(params));
 
             if (leftMarginPercent >= 0) {
-                params.leftMargin = (int) (widthHint * leftMarginPercent);
+                params.leftMargin = Math.round(widthHint * leftMarginPercent);
             }
             if (topMarginPercent >= 0) {
-                params.topMargin = (int) (heightHint * topMarginPercent);
+                params.topMargin = Math.round(heightHint * topMarginPercent);
             }
             if (rightMarginPercent >= 0) {
-                params.rightMargin = (int) (widthHint * rightMarginPercent);
+                params.rightMargin = Math.round(widthHint * rightMarginPercent);
             }
             if (bottomMarginPercent >= 0) {
-                params.bottomMargin = (int) (heightHint * bottomMarginPercent);
+                params.bottomMargin = Math.round(heightHint * bottomMarginPercent);
             }
             boolean shouldResolveLayoutDirection = false;
             if (startMarginPercent >= 0) {
                 MarginLayoutParamsCompat.setMarginStart(params,
-                        (int) (widthHint * startMarginPercent));
+                        Math.round(widthHint * startMarginPercent));
                 shouldResolveLayoutDirection = true;
             }
             if (endMarginPercent >= 0) {
                 MarginLayoutParamsCompat.setMarginEnd(params,
-                        (int) (widthHint * endMarginPercent));
+                        Math.round(widthHint * endMarginPercent));
                 shouldResolveLayoutDirection = true;
             }
             if (shouldResolveLayoutDirection && (view != null)) {
diff --git a/percent/src/android/support/percent/PercentRelativeLayout.java b/percent/src/android/support/percent/PercentRelativeLayout.java
index 1c00c4b..f068d6b 100644
--- a/percent/src/android/support/percent/PercentRelativeLayout.java
+++ b/percent/src/android/support/percent/PercentRelativeLayout.java
@@ -40,7 +40,7 @@
  *         app:layout_heightPercent="50%"
  *         app:layout_marginTopPercent="25%"
  *         app:layout_marginLeftPercent="25%"/&gt
- * &lt;/android.support.percent.PercentFrameLayout&gt
+ * &lt;/android.support.percent.PercentRelativeLayout&gt
  * </pre>
  *
  * The attributes that you can use are:
diff --git a/percent/tests/AndroidManifest.xml b/percent/tests/AndroidManifest.xml
index 993e69b..ba3aa19 100644
--- a/percent/tests/AndroidManifest.xml
+++ b/percent/tests/AndroidManifest.xml
@@ -18,7 +18,7 @@
           xmlns:tools="http://schemas.android.com/tools"
           package="android.support.percent.test">
     <uses-sdk
-        android:minSdkVersion="8"
+        android:minSdkVersion="9"
         android:targetSdkVersion="23"
         tools:overrideLibrary="android.support.test, android.app, android.support.test.rule,
               android.support.test.espresso, android.support.test.espresso.idling" />
diff --git a/recommendation/Android.mk b/recommendation/Android.mk
index a46c565..85b0817 100644
--- a/recommendation/Android.mk
+++ b/recommendation/Android.mk
@@ -49,12 +49,3 @@
 
 include $(BUILD_DROIDDOC)
 
-
-# API Check
-# ---------------------------------------------
-support_module := $(LOCAL_MODULE)
-support_module_api_dir := $(LOCAL_PATH)/api
-support_module_src_files := $(recommendation.docs.src_files)
-support_module_java_libraries := $(recommendation.docs.java_libraries)
-support_module_java_packages := android.support.app.recommendation*
-include $(SUPPORT_API_CHECK)
diff --git a/recommendation/api/23.0.0.txt b/recommendation/api/23.0.0.txt
deleted file mode 100644
index ce69b31..0000000
--- a/recommendation/api/23.0.0.txt
+++ /dev/null
@@ -1,132 +0,0 @@
-package android.support.app.recommendation {
-
-  public final class ContentRecommendation {
-    method public java.lang.String getBackgroundImageUri();
-    method public int getBadgeImageResourceId();
-    method public int getColor();
-    method public android.graphics.Bitmap getContentImage();
-    method public android.support.app.recommendation.ContentRecommendation.IntentData getContentIntent();
-    method public java.lang.String[] getContentTypes();
-    method public android.support.app.recommendation.ContentRecommendation.IntentData getDismissIntent();
-    method public java.lang.String[] getGenres();
-    method public java.lang.String getGroup();
-    method public java.lang.String getIdTag();
-    method public java.lang.String getMaturityRating();
-    method public android.app.Notification getNotificationObject(android.content.Context);
-    method public java.lang.String getPricingType();
-    method public java.lang.String getPricingValue();
-    method public java.lang.String getPrimaryContentType();
-    method public int getProgressMax();
-    method public int getProgressValue();
-    method public long getRunningTime();
-    method public java.lang.String getSortKey();
-    method public java.lang.String getSourceName();
-    method public int getStatus();
-    method public java.lang.String getText();
-    method public java.lang.String getTitle();
-    method public boolean hasProgressInfo();
-    method public boolean isAutoDismiss();
-    method public void setAutoDismiss(boolean);
-    method public void setGroup(java.lang.String);
-    method public void setProgress(int, int);
-    method public void setSortKey(java.lang.String);
-    method public void setStatus(int);
-    field public static final java.lang.String CONTENT_MATURITY_ALL = "android.contentMaturity.all";
-    field public static final java.lang.String CONTENT_MATURITY_HIGH = "android.contentMaturity.high";
-    field public static final java.lang.String CONTENT_MATURITY_LOW = "android.contentMaturity.low";
-    field public static final java.lang.String CONTENT_MATURITY_MEDIUM = "android.contentMaturity.medium";
-    field public static final java.lang.String CONTENT_PRICING_FREE = "android.contentPrice.free";
-    field public static final java.lang.String CONTENT_PRICING_PREORDER = "android.contentPrice.preorder";
-    field public static final java.lang.String CONTENT_PRICING_PURCHASE = "android.contentPrice.purchase";
-    field public static final java.lang.String CONTENT_PRICING_RENTAL = "android.contentPrice.rental";
-    field public static final java.lang.String CONTENT_PRICING_SUBSCRIPTION = "android.contentPrice.subscription";
-    field public static final int CONTENT_STATUS_AVAILABLE = 2; // 0x2
-    field public static final int CONTENT_STATUS_PENDING = 1; // 0x1
-    field public static final int CONTENT_STATUS_READY = 0; // 0x0
-    field public static final int CONTENT_STATUS_UNAVAILABLE = 3; // 0x3
-    field public static final java.lang.String CONTENT_TYPE_APP = "android.contentType.app";
-    field public static final java.lang.String CONTENT_TYPE_BOOK = "android.contentType.book";
-    field public static final java.lang.String CONTENT_TYPE_COMIC = "android.contentType.comic";
-    field public static final java.lang.String CONTENT_TYPE_GAME = "android.contentType.game";
-    field public static final java.lang.String CONTENT_TYPE_MAGAZINE = "android.contentType.magazine";
-    field public static final java.lang.String CONTENT_TYPE_MOVIE = "android.contentType.movie";
-    field public static final java.lang.String CONTENT_TYPE_MUSIC = "android.contentType.music";
-    field public static final java.lang.String CONTENT_TYPE_NEWS = "android.contentType.news";
-    field public static final java.lang.String CONTENT_TYPE_PODCAST = "android.contentType.podcast";
-    field public static final java.lang.String CONTENT_TYPE_RADIO = "android.contentType.radio";
-    field public static final java.lang.String CONTENT_TYPE_SERIAL = "android.contentType.serial";
-    field public static final java.lang.String CONTENT_TYPE_SPORTS = "android.contentType.sports";
-    field public static final java.lang.String CONTENT_TYPE_TRAILER = "android.contentType.trailer";
-    field public static final java.lang.String CONTENT_TYPE_VIDEO = "android.contentType.video";
-    field public static final java.lang.String CONTENT_TYPE_WEBSITE = "android.contentType.website";
-    field public static final int INTENT_TYPE_ACTIVITY = 1; // 0x1
-    field public static final int INTENT_TYPE_BROADCAST = 2; // 0x2
-    field public static final int INTENT_TYPE_SERVICE = 3; // 0x3
-  }
-
-  public static final class ContentRecommendation.Builder {
-    ctor public ContentRecommendation.Builder();
-    method public android.support.app.recommendation.ContentRecommendation build();
-    method public android.support.app.recommendation.ContentRecommendation.Builder setAutoDismiss(boolean);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setBackgroundImageUri(java.lang.String);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setBadgeIcon(int);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setColor(int);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setContentImage(android.graphics.Bitmap);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setContentIntentData(int, android.content.Intent, int, android.os.Bundle);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setContentTypes(java.lang.String[]);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setDismissIntentData(int, android.content.Intent, int, android.os.Bundle);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setGenres(java.lang.String[]);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setGroup(java.lang.String);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setIdTag(java.lang.String);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setMaturityRating(java.lang.String);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setPricingInformation(java.lang.String, java.lang.String);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setProgress(int, int);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setRunningTime(long);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setSortKey(java.lang.String);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setSourceName(java.lang.String);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setStatus(int);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setText(java.lang.String);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setTitle(java.lang.String);
-  }
-
-  public static abstract class ContentRecommendation.ContentMaturity implements java.lang.annotation.Annotation {
-  }
-
-  public static abstract class ContentRecommendation.ContentPricing implements java.lang.annotation.Annotation {
-  }
-
-  public static abstract class ContentRecommendation.ContentStatus implements java.lang.annotation.Annotation {
-  }
-
-  public static abstract class ContentRecommendation.ContentType implements java.lang.annotation.Annotation {
-  }
-
-  public static class ContentRecommendation.IntentData {
-    ctor public ContentRecommendation.IntentData();
-  }
-
-  public static abstract class ContentRecommendation.IntentType implements java.lang.annotation.Annotation {
-  }
-
-  public final class RecommendationExtender implements android.app.Notification.Extender {
-    ctor public RecommendationExtender();
-    ctor public RecommendationExtender(android.app.Notification);
-    method public android.app.Notification.Builder extend(android.app.Notification.Builder);
-    method public java.lang.String[] getContentTypes();
-    method public java.lang.String[] getGenres();
-    method public java.lang.String getMaturityRating();
-    method public java.lang.String getPricingType();
-    method public java.lang.String getPricingValue();
-    method public java.lang.String getPrimaryContentType();
-    method public long getRunningTime();
-    method public int getStatus();
-    method public android.support.app.recommendation.RecommendationExtender setContentTypes(java.lang.String[]);
-    method public android.support.app.recommendation.RecommendationExtender setGenres(java.lang.String[]);
-    method public android.support.app.recommendation.RecommendationExtender setMaturityRating(java.lang.String);
-    method public android.support.app.recommendation.RecommendationExtender setPricingInformation(java.lang.String, java.lang.String);
-    method public android.support.app.recommendation.RecommendationExtender setRunningTime(long);
-    method public android.support.app.recommendation.RecommendationExtender setStatus(int);
-  }
-
-}
-
diff --git a/recommendation/api/23.1.0.txt b/recommendation/api/23.1.0.txt
deleted file mode 100644
index ce69b31..0000000
--- a/recommendation/api/23.1.0.txt
+++ /dev/null
@@ -1,132 +0,0 @@
-package android.support.app.recommendation {
-
-  public final class ContentRecommendation {
-    method public java.lang.String getBackgroundImageUri();
-    method public int getBadgeImageResourceId();
-    method public int getColor();
-    method public android.graphics.Bitmap getContentImage();
-    method public android.support.app.recommendation.ContentRecommendation.IntentData getContentIntent();
-    method public java.lang.String[] getContentTypes();
-    method public android.support.app.recommendation.ContentRecommendation.IntentData getDismissIntent();
-    method public java.lang.String[] getGenres();
-    method public java.lang.String getGroup();
-    method public java.lang.String getIdTag();
-    method public java.lang.String getMaturityRating();
-    method public android.app.Notification getNotificationObject(android.content.Context);
-    method public java.lang.String getPricingType();
-    method public java.lang.String getPricingValue();
-    method public java.lang.String getPrimaryContentType();
-    method public int getProgressMax();
-    method public int getProgressValue();
-    method public long getRunningTime();
-    method public java.lang.String getSortKey();
-    method public java.lang.String getSourceName();
-    method public int getStatus();
-    method public java.lang.String getText();
-    method public java.lang.String getTitle();
-    method public boolean hasProgressInfo();
-    method public boolean isAutoDismiss();
-    method public void setAutoDismiss(boolean);
-    method public void setGroup(java.lang.String);
-    method public void setProgress(int, int);
-    method public void setSortKey(java.lang.String);
-    method public void setStatus(int);
-    field public static final java.lang.String CONTENT_MATURITY_ALL = "android.contentMaturity.all";
-    field public static final java.lang.String CONTENT_MATURITY_HIGH = "android.contentMaturity.high";
-    field public static final java.lang.String CONTENT_MATURITY_LOW = "android.contentMaturity.low";
-    field public static final java.lang.String CONTENT_MATURITY_MEDIUM = "android.contentMaturity.medium";
-    field public static final java.lang.String CONTENT_PRICING_FREE = "android.contentPrice.free";
-    field public static final java.lang.String CONTENT_PRICING_PREORDER = "android.contentPrice.preorder";
-    field public static final java.lang.String CONTENT_PRICING_PURCHASE = "android.contentPrice.purchase";
-    field public static final java.lang.String CONTENT_PRICING_RENTAL = "android.contentPrice.rental";
-    field public static final java.lang.String CONTENT_PRICING_SUBSCRIPTION = "android.contentPrice.subscription";
-    field public static final int CONTENT_STATUS_AVAILABLE = 2; // 0x2
-    field public static final int CONTENT_STATUS_PENDING = 1; // 0x1
-    field public static final int CONTENT_STATUS_READY = 0; // 0x0
-    field public static final int CONTENT_STATUS_UNAVAILABLE = 3; // 0x3
-    field public static final java.lang.String CONTENT_TYPE_APP = "android.contentType.app";
-    field public static final java.lang.String CONTENT_TYPE_BOOK = "android.contentType.book";
-    field public static final java.lang.String CONTENT_TYPE_COMIC = "android.contentType.comic";
-    field public static final java.lang.String CONTENT_TYPE_GAME = "android.contentType.game";
-    field public static final java.lang.String CONTENT_TYPE_MAGAZINE = "android.contentType.magazine";
-    field public static final java.lang.String CONTENT_TYPE_MOVIE = "android.contentType.movie";
-    field public static final java.lang.String CONTENT_TYPE_MUSIC = "android.contentType.music";
-    field public static final java.lang.String CONTENT_TYPE_NEWS = "android.contentType.news";
-    field public static final java.lang.String CONTENT_TYPE_PODCAST = "android.contentType.podcast";
-    field public static final java.lang.String CONTENT_TYPE_RADIO = "android.contentType.radio";
-    field public static final java.lang.String CONTENT_TYPE_SERIAL = "android.contentType.serial";
-    field public static final java.lang.String CONTENT_TYPE_SPORTS = "android.contentType.sports";
-    field public static final java.lang.String CONTENT_TYPE_TRAILER = "android.contentType.trailer";
-    field public static final java.lang.String CONTENT_TYPE_VIDEO = "android.contentType.video";
-    field public static final java.lang.String CONTENT_TYPE_WEBSITE = "android.contentType.website";
-    field public static final int INTENT_TYPE_ACTIVITY = 1; // 0x1
-    field public static final int INTENT_TYPE_BROADCAST = 2; // 0x2
-    field public static final int INTENT_TYPE_SERVICE = 3; // 0x3
-  }
-
-  public static final class ContentRecommendation.Builder {
-    ctor public ContentRecommendation.Builder();
-    method public android.support.app.recommendation.ContentRecommendation build();
-    method public android.support.app.recommendation.ContentRecommendation.Builder setAutoDismiss(boolean);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setBackgroundImageUri(java.lang.String);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setBadgeIcon(int);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setColor(int);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setContentImage(android.graphics.Bitmap);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setContentIntentData(int, android.content.Intent, int, android.os.Bundle);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setContentTypes(java.lang.String[]);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setDismissIntentData(int, android.content.Intent, int, android.os.Bundle);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setGenres(java.lang.String[]);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setGroup(java.lang.String);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setIdTag(java.lang.String);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setMaturityRating(java.lang.String);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setPricingInformation(java.lang.String, java.lang.String);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setProgress(int, int);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setRunningTime(long);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setSortKey(java.lang.String);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setSourceName(java.lang.String);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setStatus(int);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setText(java.lang.String);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setTitle(java.lang.String);
-  }
-
-  public static abstract class ContentRecommendation.ContentMaturity implements java.lang.annotation.Annotation {
-  }
-
-  public static abstract class ContentRecommendation.ContentPricing implements java.lang.annotation.Annotation {
-  }
-
-  public static abstract class ContentRecommendation.ContentStatus implements java.lang.annotation.Annotation {
-  }
-
-  public static abstract class ContentRecommendation.ContentType implements java.lang.annotation.Annotation {
-  }
-
-  public static class ContentRecommendation.IntentData {
-    ctor public ContentRecommendation.IntentData();
-  }
-
-  public static abstract class ContentRecommendation.IntentType implements java.lang.annotation.Annotation {
-  }
-
-  public final class RecommendationExtender implements android.app.Notification.Extender {
-    ctor public RecommendationExtender();
-    ctor public RecommendationExtender(android.app.Notification);
-    method public android.app.Notification.Builder extend(android.app.Notification.Builder);
-    method public java.lang.String[] getContentTypes();
-    method public java.lang.String[] getGenres();
-    method public java.lang.String getMaturityRating();
-    method public java.lang.String getPricingType();
-    method public java.lang.String getPricingValue();
-    method public java.lang.String getPrimaryContentType();
-    method public long getRunningTime();
-    method public int getStatus();
-    method public android.support.app.recommendation.RecommendationExtender setContentTypes(java.lang.String[]);
-    method public android.support.app.recommendation.RecommendationExtender setGenres(java.lang.String[]);
-    method public android.support.app.recommendation.RecommendationExtender setMaturityRating(java.lang.String);
-    method public android.support.app.recommendation.RecommendationExtender setPricingInformation(java.lang.String, java.lang.String);
-    method public android.support.app.recommendation.RecommendationExtender setRunningTime(long);
-    method public android.support.app.recommendation.RecommendationExtender setStatus(int);
-  }
-
-}
-
diff --git a/recommendation/api/23.1.1.txt b/recommendation/api/23.1.1.txt
deleted file mode 100644
index ce69b31..0000000
--- a/recommendation/api/23.1.1.txt
+++ /dev/null
@@ -1,132 +0,0 @@
-package android.support.app.recommendation {
-
-  public final class ContentRecommendation {
-    method public java.lang.String getBackgroundImageUri();
-    method public int getBadgeImageResourceId();
-    method public int getColor();
-    method public android.graphics.Bitmap getContentImage();
-    method public android.support.app.recommendation.ContentRecommendation.IntentData getContentIntent();
-    method public java.lang.String[] getContentTypes();
-    method public android.support.app.recommendation.ContentRecommendation.IntentData getDismissIntent();
-    method public java.lang.String[] getGenres();
-    method public java.lang.String getGroup();
-    method public java.lang.String getIdTag();
-    method public java.lang.String getMaturityRating();
-    method public android.app.Notification getNotificationObject(android.content.Context);
-    method public java.lang.String getPricingType();
-    method public java.lang.String getPricingValue();
-    method public java.lang.String getPrimaryContentType();
-    method public int getProgressMax();
-    method public int getProgressValue();
-    method public long getRunningTime();
-    method public java.lang.String getSortKey();
-    method public java.lang.String getSourceName();
-    method public int getStatus();
-    method public java.lang.String getText();
-    method public java.lang.String getTitle();
-    method public boolean hasProgressInfo();
-    method public boolean isAutoDismiss();
-    method public void setAutoDismiss(boolean);
-    method public void setGroup(java.lang.String);
-    method public void setProgress(int, int);
-    method public void setSortKey(java.lang.String);
-    method public void setStatus(int);
-    field public static final java.lang.String CONTENT_MATURITY_ALL = "android.contentMaturity.all";
-    field public static final java.lang.String CONTENT_MATURITY_HIGH = "android.contentMaturity.high";
-    field public static final java.lang.String CONTENT_MATURITY_LOW = "android.contentMaturity.low";
-    field public static final java.lang.String CONTENT_MATURITY_MEDIUM = "android.contentMaturity.medium";
-    field public static final java.lang.String CONTENT_PRICING_FREE = "android.contentPrice.free";
-    field public static final java.lang.String CONTENT_PRICING_PREORDER = "android.contentPrice.preorder";
-    field public static final java.lang.String CONTENT_PRICING_PURCHASE = "android.contentPrice.purchase";
-    field public static final java.lang.String CONTENT_PRICING_RENTAL = "android.contentPrice.rental";
-    field public static final java.lang.String CONTENT_PRICING_SUBSCRIPTION = "android.contentPrice.subscription";
-    field public static final int CONTENT_STATUS_AVAILABLE = 2; // 0x2
-    field public static final int CONTENT_STATUS_PENDING = 1; // 0x1
-    field public static final int CONTENT_STATUS_READY = 0; // 0x0
-    field public static final int CONTENT_STATUS_UNAVAILABLE = 3; // 0x3
-    field public static final java.lang.String CONTENT_TYPE_APP = "android.contentType.app";
-    field public static final java.lang.String CONTENT_TYPE_BOOK = "android.contentType.book";
-    field public static final java.lang.String CONTENT_TYPE_COMIC = "android.contentType.comic";
-    field public static final java.lang.String CONTENT_TYPE_GAME = "android.contentType.game";
-    field public static final java.lang.String CONTENT_TYPE_MAGAZINE = "android.contentType.magazine";
-    field public static final java.lang.String CONTENT_TYPE_MOVIE = "android.contentType.movie";
-    field public static final java.lang.String CONTENT_TYPE_MUSIC = "android.contentType.music";
-    field public static final java.lang.String CONTENT_TYPE_NEWS = "android.contentType.news";
-    field public static final java.lang.String CONTENT_TYPE_PODCAST = "android.contentType.podcast";
-    field public static final java.lang.String CONTENT_TYPE_RADIO = "android.contentType.radio";
-    field public static final java.lang.String CONTENT_TYPE_SERIAL = "android.contentType.serial";
-    field public static final java.lang.String CONTENT_TYPE_SPORTS = "android.contentType.sports";
-    field public static final java.lang.String CONTENT_TYPE_TRAILER = "android.contentType.trailer";
-    field public static final java.lang.String CONTENT_TYPE_VIDEO = "android.contentType.video";
-    field public static final java.lang.String CONTENT_TYPE_WEBSITE = "android.contentType.website";
-    field public static final int INTENT_TYPE_ACTIVITY = 1; // 0x1
-    field public static final int INTENT_TYPE_BROADCAST = 2; // 0x2
-    field public static final int INTENT_TYPE_SERVICE = 3; // 0x3
-  }
-
-  public static final class ContentRecommendation.Builder {
-    ctor public ContentRecommendation.Builder();
-    method public android.support.app.recommendation.ContentRecommendation build();
-    method public android.support.app.recommendation.ContentRecommendation.Builder setAutoDismiss(boolean);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setBackgroundImageUri(java.lang.String);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setBadgeIcon(int);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setColor(int);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setContentImage(android.graphics.Bitmap);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setContentIntentData(int, android.content.Intent, int, android.os.Bundle);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setContentTypes(java.lang.String[]);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setDismissIntentData(int, android.content.Intent, int, android.os.Bundle);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setGenres(java.lang.String[]);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setGroup(java.lang.String);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setIdTag(java.lang.String);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setMaturityRating(java.lang.String);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setPricingInformation(java.lang.String, java.lang.String);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setProgress(int, int);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setRunningTime(long);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setSortKey(java.lang.String);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setSourceName(java.lang.String);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setStatus(int);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setText(java.lang.String);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setTitle(java.lang.String);
-  }
-
-  public static abstract class ContentRecommendation.ContentMaturity implements java.lang.annotation.Annotation {
-  }
-
-  public static abstract class ContentRecommendation.ContentPricing implements java.lang.annotation.Annotation {
-  }
-
-  public static abstract class ContentRecommendation.ContentStatus implements java.lang.annotation.Annotation {
-  }
-
-  public static abstract class ContentRecommendation.ContentType implements java.lang.annotation.Annotation {
-  }
-
-  public static class ContentRecommendation.IntentData {
-    ctor public ContentRecommendation.IntentData();
-  }
-
-  public static abstract class ContentRecommendation.IntentType implements java.lang.annotation.Annotation {
-  }
-
-  public final class RecommendationExtender implements android.app.Notification.Extender {
-    ctor public RecommendationExtender();
-    ctor public RecommendationExtender(android.app.Notification);
-    method public android.app.Notification.Builder extend(android.app.Notification.Builder);
-    method public java.lang.String[] getContentTypes();
-    method public java.lang.String[] getGenres();
-    method public java.lang.String getMaturityRating();
-    method public java.lang.String getPricingType();
-    method public java.lang.String getPricingValue();
-    method public java.lang.String getPrimaryContentType();
-    method public long getRunningTime();
-    method public int getStatus();
-    method public android.support.app.recommendation.RecommendationExtender setContentTypes(java.lang.String[]);
-    method public android.support.app.recommendation.RecommendationExtender setGenres(java.lang.String[]);
-    method public android.support.app.recommendation.RecommendationExtender setMaturityRating(java.lang.String);
-    method public android.support.app.recommendation.RecommendationExtender setPricingInformation(java.lang.String, java.lang.String);
-    method public android.support.app.recommendation.RecommendationExtender setRunningTime(long);
-    method public android.support.app.recommendation.RecommendationExtender setStatus(int);
-  }
-
-}
-
diff --git a/recommendation/api/current.txt b/recommendation/api/current.txt
deleted file mode 100644
index ce69b31..0000000
--- a/recommendation/api/current.txt
+++ /dev/null
@@ -1,132 +0,0 @@
-package android.support.app.recommendation {
-
-  public final class ContentRecommendation {
-    method public java.lang.String getBackgroundImageUri();
-    method public int getBadgeImageResourceId();
-    method public int getColor();
-    method public android.graphics.Bitmap getContentImage();
-    method public android.support.app.recommendation.ContentRecommendation.IntentData getContentIntent();
-    method public java.lang.String[] getContentTypes();
-    method public android.support.app.recommendation.ContentRecommendation.IntentData getDismissIntent();
-    method public java.lang.String[] getGenres();
-    method public java.lang.String getGroup();
-    method public java.lang.String getIdTag();
-    method public java.lang.String getMaturityRating();
-    method public android.app.Notification getNotificationObject(android.content.Context);
-    method public java.lang.String getPricingType();
-    method public java.lang.String getPricingValue();
-    method public java.lang.String getPrimaryContentType();
-    method public int getProgressMax();
-    method public int getProgressValue();
-    method public long getRunningTime();
-    method public java.lang.String getSortKey();
-    method public java.lang.String getSourceName();
-    method public int getStatus();
-    method public java.lang.String getText();
-    method public java.lang.String getTitle();
-    method public boolean hasProgressInfo();
-    method public boolean isAutoDismiss();
-    method public void setAutoDismiss(boolean);
-    method public void setGroup(java.lang.String);
-    method public void setProgress(int, int);
-    method public void setSortKey(java.lang.String);
-    method public void setStatus(int);
-    field public static final java.lang.String CONTENT_MATURITY_ALL = "android.contentMaturity.all";
-    field public static final java.lang.String CONTENT_MATURITY_HIGH = "android.contentMaturity.high";
-    field public static final java.lang.String CONTENT_MATURITY_LOW = "android.contentMaturity.low";
-    field public static final java.lang.String CONTENT_MATURITY_MEDIUM = "android.contentMaturity.medium";
-    field public static final java.lang.String CONTENT_PRICING_FREE = "android.contentPrice.free";
-    field public static final java.lang.String CONTENT_PRICING_PREORDER = "android.contentPrice.preorder";
-    field public static final java.lang.String CONTENT_PRICING_PURCHASE = "android.contentPrice.purchase";
-    field public static final java.lang.String CONTENT_PRICING_RENTAL = "android.contentPrice.rental";
-    field public static final java.lang.String CONTENT_PRICING_SUBSCRIPTION = "android.contentPrice.subscription";
-    field public static final int CONTENT_STATUS_AVAILABLE = 2; // 0x2
-    field public static final int CONTENT_STATUS_PENDING = 1; // 0x1
-    field public static final int CONTENT_STATUS_READY = 0; // 0x0
-    field public static final int CONTENT_STATUS_UNAVAILABLE = 3; // 0x3
-    field public static final java.lang.String CONTENT_TYPE_APP = "android.contentType.app";
-    field public static final java.lang.String CONTENT_TYPE_BOOK = "android.contentType.book";
-    field public static final java.lang.String CONTENT_TYPE_COMIC = "android.contentType.comic";
-    field public static final java.lang.String CONTENT_TYPE_GAME = "android.contentType.game";
-    field public static final java.lang.String CONTENT_TYPE_MAGAZINE = "android.contentType.magazine";
-    field public static final java.lang.String CONTENT_TYPE_MOVIE = "android.contentType.movie";
-    field public static final java.lang.String CONTENT_TYPE_MUSIC = "android.contentType.music";
-    field public static final java.lang.String CONTENT_TYPE_NEWS = "android.contentType.news";
-    field public static final java.lang.String CONTENT_TYPE_PODCAST = "android.contentType.podcast";
-    field public static final java.lang.String CONTENT_TYPE_RADIO = "android.contentType.radio";
-    field public static final java.lang.String CONTENT_TYPE_SERIAL = "android.contentType.serial";
-    field public static final java.lang.String CONTENT_TYPE_SPORTS = "android.contentType.sports";
-    field public static final java.lang.String CONTENT_TYPE_TRAILER = "android.contentType.trailer";
-    field public static final java.lang.String CONTENT_TYPE_VIDEO = "android.contentType.video";
-    field public static final java.lang.String CONTENT_TYPE_WEBSITE = "android.contentType.website";
-    field public static final int INTENT_TYPE_ACTIVITY = 1; // 0x1
-    field public static final int INTENT_TYPE_BROADCAST = 2; // 0x2
-    field public static final int INTENT_TYPE_SERVICE = 3; // 0x3
-  }
-
-  public static final class ContentRecommendation.Builder {
-    ctor public ContentRecommendation.Builder();
-    method public android.support.app.recommendation.ContentRecommendation build();
-    method public android.support.app.recommendation.ContentRecommendation.Builder setAutoDismiss(boolean);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setBackgroundImageUri(java.lang.String);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setBadgeIcon(int);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setColor(int);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setContentImage(android.graphics.Bitmap);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setContentIntentData(int, android.content.Intent, int, android.os.Bundle);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setContentTypes(java.lang.String[]);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setDismissIntentData(int, android.content.Intent, int, android.os.Bundle);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setGenres(java.lang.String[]);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setGroup(java.lang.String);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setIdTag(java.lang.String);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setMaturityRating(java.lang.String);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setPricingInformation(java.lang.String, java.lang.String);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setProgress(int, int);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setRunningTime(long);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setSortKey(java.lang.String);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setSourceName(java.lang.String);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setStatus(int);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setText(java.lang.String);
-    method public android.support.app.recommendation.ContentRecommendation.Builder setTitle(java.lang.String);
-  }
-
-  public static abstract class ContentRecommendation.ContentMaturity implements java.lang.annotation.Annotation {
-  }
-
-  public static abstract class ContentRecommendation.ContentPricing implements java.lang.annotation.Annotation {
-  }
-
-  public static abstract class ContentRecommendation.ContentStatus implements java.lang.annotation.Annotation {
-  }
-
-  public static abstract class ContentRecommendation.ContentType implements java.lang.annotation.Annotation {
-  }
-
-  public static class ContentRecommendation.IntentData {
-    ctor public ContentRecommendation.IntentData();
-  }
-
-  public static abstract class ContentRecommendation.IntentType implements java.lang.annotation.Annotation {
-  }
-
-  public final class RecommendationExtender implements android.app.Notification.Extender {
-    ctor public RecommendationExtender();
-    ctor public RecommendationExtender(android.app.Notification);
-    method public android.app.Notification.Builder extend(android.app.Notification.Builder);
-    method public java.lang.String[] getContentTypes();
-    method public java.lang.String[] getGenres();
-    method public java.lang.String getMaturityRating();
-    method public java.lang.String getPricingType();
-    method public java.lang.String getPricingValue();
-    method public java.lang.String getPrimaryContentType();
-    method public long getRunningTime();
-    method public int getStatus();
-    method public android.support.app.recommendation.RecommendationExtender setContentTypes(java.lang.String[]);
-    method public android.support.app.recommendation.RecommendationExtender setGenres(java.lang.String[]);
-    method public android.support.app.recommendation.RecommendationExtender setMaturityRating(java.lang.String);
-    method public android.support.app.recommendation.RecommendationExtender setPricingInformation(java.lang.String, java.lang.String);
-    method public android.support.app.recommendation.RecommendationExtender setRunningTime(long);
-    method public android.support.app.recommendation.RecommendationExtender setStatus(int);
-  }
-
-}
-
diff --git a/recommendation/api/removed.txt b/recommendation/api/removed.txt
deleted file mode 100644
index e69de29..0000000
--- a/recommendation/api/removed.txt
+++ /dev/null
diff --git a/recommendation/src/android/support/app/recommendation/ContentRecommendation.java b/recommendation/src/android/support/app/recommendation/ContentRecommendation.java
index 11af02d..dadc7ba 100644
--- a/recommendation/src/android/support/app/recommendation/ContentRecommendation.java
+++ b/recommendation/src/android/support/app/recommendation/ContentRecommendation.java
@@ -29,6 +29,8 @@
 import android.support.annotation.StringDef;
 import android.text.TextUtils;
 
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
 import java.util.Arrays;
 
 /**
@@ -54,6 +56,7 @@
         CONTENT_TYPE_MAGAZINE,
         CONTENT_TYPE_WEBSITE,
     })
+    @Retention(RetentionPolicy.SOURCE)
     public @interface ContentType {}
 
     /**
@@ -154,6 +157,7 @@
         CONTENT_PRICING_PREORDER,
         CONTENT_PRICING_SUBSCRIPTION,
     })
+    @Retention(RetentionPolicy.SOURCE)
     public @interface ContentPricing {}
 
     /**
@@ -197,6 +201,7 @@
         CONTENT_STATUS_AVAILABLE,
         CONTENT_STATUS_UNAVAILABLE,
     })
+    @Retention(RetentionPolicy.SOURCE)
     public @interface ContentStatus {}
 
     /**
@@ -232,6 +237,7 @@
         CONTENT_MATURITY_MEDIUM,
         CONTENT_MATURITY_HIGH,
     })
+    @Retention(RetentionPolicy.SOURCE)
     public @interface ContentMaturity {}
 
     /**
@@ -263,6 +269,7 @@
             INTENT_TYPE_BROADCAST,
             INTENT_TYPE_SERVICE,
     })
+    @Retention(RetentionPolicy.SOURCE)
     public @interface IntentType {
     }
 
diff --git a/samples/Android.mk b/samples/Android.mk
new file mode 100644
index 0000000..cc329fe
--- /dev/null
+++ b/samples/Android.mk
@@ -0,0 +1,17 @@
+# Copyright (C) 2016 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.
+
+LOCAL_PATH := $(call my-dir)
+
+include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/samples/Support13Demos/Android.mk b/samples/Support13Demos/Android.mk
new file mode 100644
index 0000000..52646b3
--- /dev/null
+++ b/samples/Support13Demos/Android.mk
@@ -0,0 +1,22 @@
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := samples tests
+
+# Only compile source java files in this apk.
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_STATIC_JAVA_LIBRARIES += android-support-v13
+
+LOCAL_PACKAGE_NAME := Support13Demos
+
+LOCAL_SDK_VERSION := current
+
+LOCAL_MIN_SDK_VERSION := 13
+
+LOCAL_DEX_PREOPT := false
+
+include $(BUILD_PACKAGE)
+
+# Use the folloing include to make our test apk.
+include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/samples/Support13Demos/AndroidManifest.xml b/samples/Support13Demos/AndroidManifest.xml
new file mode 100644
index 0000000..dfa4e64
--- /dev/null
+++ b/samples/Support13Demos/AndroidManifest.xml
@@ -0,0 +1,91 @@
+<?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"
+    package="com.example.android.supportv13">
+
+    <uses-permission android:name="android.permission.READ_CONTACTS" />
+
+    <uses-sdk android:minSdkVersion="13" />
+
+    <!-- The smallest screen this app works on is a phone.  The app will
+         scale its UI to larger screens but doesn't make good use of them
+         so allow the compatibility mode button to be shown (mostly because
+         this is just convenient for testing). -->
+    <supports-screens android:requiresSmallestWidthDp="320"
+            android:compatibleWidthLimitDp="480" />
+
+    <application android:label="@string/activity_sample_code"
+            android:icon="@drawable/app_sample_code"
+            android:hardwareAccelerated="true">
+
+        <activity android:name="Support13Demos">
+            <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>
+
+        <!-- Fragment Support Samples -->
+
+        <activity android:name=".app.FragmentNestingPagerSupport"
+                android:label="@string/fragment_nesting_pager_support">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv13.SUPPORT13_SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".app.FragmentNestingStatePagerSupport"
+                android:label="@string/fragment_nesting_state_pager_support">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv13.SUPPORT13_SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".app.FragmentPagerSupport"
+                android:label="@string/fragment_pager_support">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv13.SUPPORT13_SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".app.FragmentStatePagerSupport"
+                android:label="@string/fragment_state_pager_support">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv13.SUPPORT13_SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".app.ActionBarTabsPager"
+                android:label="@string/action_bar_tabs_pager">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv13.SUPPORT13_SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+    </application>
+</manifest>
diff --git a/samples/Support13Demos/_index.html b/samples/Support13Demos/_index.html
new file mode 100644
index 0000000..f913a99
--- /dev/null
+++ b/samples/Support13Demos/_index.html
@@ -0,0 +1,26 @@
+<p>The Support v13 Demos application contains a variety of small sample
+code showing how to use key features of the Android API 13+ Support Library.
+This library contains code that you can
+build in to your application to access new features and common
+utilities while being able to run down to version 3.2 (API 13)
+of the platform.
+</p>
+
+<script type="text/javascript">
+
+// This is a totally temporary hack to display the following content only
+// when the docs are online. This will be changed once the samples get moved.
+
+if (toRoot == "/") {
+
+document.write(""+
+"<p>You'll notice that all the samples are included in a single Android "+
+"project, so the application code and other resource files for all samples are batched "+
+"together. Current samples are only for the fragment and loader in the "+
+"application part of the support library:</p>"+
+
+"<ul><li><a href='src/com/example/android/supportv13/app/index.html'>App</a></li></ul>");
+
+}
+
+</script>
diff --git a/samples/Support13Demos/build.gradle b/samples/Support13Demos/build.gradle
new file mode 100644
index 0000000..3f78d64
--- /dev/null
+++ b/samples/Support13Demos/build.gradle
@@ -0,0 +1,31 @@
+apply plugin: 'com.android.application'
+
+dependencies {
+    compile project(':support-v13')
+}
+
+android {
+    compileSdkVersion project.ext.currentSdk
+
+    defaultConfig {
+        minSdkVersion 13
+    }
+
+    sourceSets {
+        main.manifest.srcFile 'AndroidManifest.xml'
+        main.java.srcDirs = ['src']
+        main.aidl.srcDirs = ['src']
+        main.res.srcDirs = ['res']
+    }
+
+    lintOptions {
+        // TODO: fix errors and reenable.
+        abortOnError false
+    }
+
+    compileOptions {
+        sourceCompatibility JavaVersion.VERSION_1_7
+        targetCompatibility JavaVersion.VERSION_1_7
+    }
+}
+
diff --git a/samples/Support13Demos/res/drawable-hdpi/alert_dialog_icon.png b/samples/Support13Demos/res/drawable-hdpi/alert_dialog_icon.png
new file mode 100755
index 0000000..fe54477
--- /dev/null
+++ b/samples/Support13Demos/res/drawable-hdpi/alert_dialog_icon.png
Binary files differ
diff --git a/samples/Support13Demos/res/drawable-hdpi/app_sample_code.png b/samples/Support13Demos/res/drawable-hdpi/app_sample_code.png
new file mode 100755
index 0000000..66a1984
--- /dev/null
+++ b/samples/Support13Demos/res/drawable-hdpi/app_sample_code.png
Binary files differ
diff --git a/samples/Support13Demos/res/drawable-mdpi/alert_dialog_icon.png b/samples/Support13Demos/res/drawable-mdpi/alert_dialog_icon.png
new file mode 100644
index 0000000..0a7de04
--- /dev/null
+++ b/samples/Support13Demos/res/drawable-mdpi/alert_dialog_icon.png
Binary files differ
diff --git a/samples/Support13Demos/res/drawable-mdpi/app_sample_code.png b/samples/Support13Demos/res/drawable-mdpi/app_sample_code.png
new file mode 100644
index 0000000..5ae7701
--- /dev/null
+++ b/samples/Support13Demos/res/drawable-mdpi/app_sample_code.png
Binary files differ
diff --git a/samples/Support13Demos/res/layout/counting.xml b/samples/Support13Demos/res/layout/counting.xml
new file mode 100644
index 0000000..7d37c37
--- /dev/null
+++ b/samples/Support13Demos/res/layout/counting.xml
@@ -0,0 +1,37 @@
+<?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. -->
+
+<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"/>
+    <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/retained">
+    </CheckBox>
+</LinearLayout>
diff --git a/samples/Support13Demos/res/layout/fragment_pager.xml b/samples/Support13Demos/res/layout/fragment_pager.xml
new file mode 100644
index 0000000..3fe844d
--- /dev/null
+++ b/samples/Support13Demos/res/layout/fragment_pager.xml
@@ -0,0 +1,46 @@
+<?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. -->
+
+<!-- BEGIN_INCLUDE(complete) -->
+<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>
+<!-- END_INCLUDE(complete) -->
diff --git a/samples/Support13Demos/res/layout/fragment_pager_list.xml b/samples/Support13Demos/res/layout/fragment_pager_list.xml
new file mode 100644
index 0000000..189cfff
--- /dev/null
+++ b/samples/Support13Demos/res/layout/fragment_pager_list.xml
@@ -0,0 +1,54 @@
+<?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.
+-->
+
+<!-- BEGIN_INCLUDE(complete) -->
+<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>
+<!-- END_INCLUDE(complete) -->
diff --git a/samples/Support13Demos/res/layout/simple_list_item_checkable_1.xml b/samples/Support13Demos/res/layout/simple_list_item_checkable_1.xml
new file mode 100644
index 0000000..84017a6
--- /dev/null
+++ b/samples/Support13Demos/res/layout/simple_list_item_checkable_1.xml
@@ -0,0 +1,29 @@
+<?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.example.android.supportv4.view.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.example.android.supportv4.view.CheckableFrameLayout>
diff --git a/samples/Support13Demos/res/values/colors.xml b/samples/Support13Demos/res/values/colors.xml
new file mode 100644
index 0000000..a1daf63
--- /dev/null
+++ b/samples/Support13Demos/res/values/colors.xml
@@ -0,0 +1,22 @@
+<?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/Support13Demos/res/values/strings.xml b/samples/Support13Demos/res/values/strings.xml
new file mode 100644
index 0000000..92316d0
--- /dev/null
+++ b/samples/Support13Demos/res/values/strings.xml
@@ -0,0 +1,39 @@
+<?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="activity_sample_code">Support v13 Demos</string>
+
+    <string name="hello_world"><b>Hello, <i>World!</i></b></string>
+    <string name="retained">Retained state</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="fragment_nesting_pager_support">Fragment/Nesting Pager</string>
+
+    <string name="fragment_nesting_state_pager_support">Fragment/Nesting State Pager</string>
+
+    <string name="fragment_pager_support">Fragment/Pager</string>
+    <string name="first">First</string>
+    <string name="last">Last</string>
+
+    <string name="fragment_state_pager_support">Fragment/State Pager</string>
+
+    <string name="action_bar_tabs_pager">Fragment/Action Bar Tabs Pager</string>
+</resources>
diff --git a/samples/Support13Demos/src/com/example/android/supportv13/Cheeses.java b/samples/Support13Demos/src/com/example/android/supportv13/Cheeses.java
new file mode 100644
index 0000000..d0c58d8
--- /dev/null
+++ b/samples/Support13Demos/src/com/example/android/supportv13/Cheeses.java
@@ -0,0 +1,154 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv13;
+
+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/Support13Demos/src/com/example/android/supportv13/Shakespeare.java b/samples/Support13Demos/src/com/example/android/supportv13/Shakespeare.java
new file mode 100644
index 0000000..01f8dc8
--- /dev/null
+++ b/samples/Support13Demos/src/com/example/android/supportv13/Shakespeare.java
@@ -0,0 +1,223 @@
+package com.example.android.supportv13;
+
+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/Support13Demos/src/com/example/android/supportv13/Support13Demos.java b/samples/Support13Demos/src/com/example/android/supportv13/Support13Demos.java
new file mode 100644
index 0000000..fda4b34
--- /dev/null
+++ b/samples/Support13Demos/src/com/example/android/supportv13/Support13Demos.java
@@ -0,0 +1,149 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv13;
+
+import android.app.ListActivity;
+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 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;
+
+public class Support13Demos extends ListActivity {
+
+    @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);
+    }
+
+    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.example.android.supportv13.SUPPORT13_SAMPLE_CODE");
+
+        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, Support13Demos.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/Support13Demos/src/com/example/android/supportv13/_package.html b/samples/Support13Demos/src/com/example/android/supportv13/_package.html
new file mode 100644
index 0000000..4657c4c
--- /dev/null
+++ b/samples/Support13Demos/src/com/example/android/supportv13/_package.html
@@ -0,0 +1,24 @@
+<html>
+<head>
+<link rel="stylesheet" type="text/css" href="assets/style.css" />
+<script type="text/javascript" src="http://www.corp.google.com/style/prettify.js"></script>
+<script src="http://www.corp.google.com/eng/techpubs/include/navbar.js" type="text/javascript"></script>
+
+
+
+</head>
+
+<body>
+
+<p>
+Examples of how to use support library APIs.  See:
+
+<ol>
+    <li> <a href="com.example.android.supportv4.app">sdk.app</a> for examples
+        of using the application package support APIs.
+</ol>
+</p>
+
+
+</body>
+</html>
diff --git a/samples/Support13Demos/src/com/example/android/supportv13/app/ActionBarTabsPager.java b/samples/Support13Demos/src/com/example/android/supportv13/app/ActionBarTabsPager.java
new file mode 100644
index 0000000..301a2f8
--- /dev/null
+++ b/samples/Support13Demos/src/com/example/android/supportv13/app/ActionBarTabsPager.java
@@ -0,0 +1,161 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.example.android.supportv13.app;
+
+import java.util.ArrayList;
+
+import com.example.android.supportv13.R;
+
+import android.app.ActionBar;
+import android.app.ActionBar.Tab;
+import android.app.Activity;
+import android.app.Fragment;
+import android.app.FragmentTransaction;
+import android.content.Context;
+import android.os.Bundle;
+import android.support.v13.app.FragmentPagerAdapter;
+import android.support.v4.view.ViewPager;
+
+/**
+ * This demonstrates the use of action bar tabs and how they interact
+ * with other action bar features.
+ */
+//BEGIN_INCLUDE(complete)
+public class ActionBarTabsPager extends Activity {
+    ViewPager mViewPager;
+    TabsAdapter mTabsAdapter;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        mViewPager = new ViewPager(this);
+        mViewPager.setId(R.id.pager);
+        setContentView(mViewPager);
+
+        final ActionBar bar = getActionBar();
+        bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
+        bar.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE);
+
+        mTabsAdapter = new TabsAdapter(this, mViewPager);
+        mTabsAdapter.addTab(bar.newTab().setText("Simple"),
+                CountingFragment.class, null);
+        mTabsAdapter.addTab(bar.newTab().setText("List"),
+                FragmentPagerSupport.ArrayListFragment.class, null);
+        mTabsAdapter.addTab(bar.newTab().setText("Cursor"),
+                CursorFragment.class, null);
+
+        if (savedInstanceState != null) {
+            bar.setSelectedNavigationItem(savedInstanceState.getInt("tab", 0));
+        }
+    }
+
+    @Override
+    protected void onSaveInstanceState(Bundle outState) {
+        super.onSaveInstanceState(outState);
+        outState.putInt("tab", getActionBar().getSelectedNavigationIndex());
+    }
+
+    /**
+     * 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 ActionBar.TabListener, ViewPager.OnPageChangeListener {
+        private final Context mContext;
+        private final ActionBar mActionBar;
+        private final ViewPager mViewPager;
+        private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();
+
+        static final class TabInfo {
+            private final Class<?> clss;
+            private final Bundle args;
+
+            TabInfo(Class<?> _class, Bundle _args) {
+                clss = _class;
+                args = _args;
+            }
+        }
+
+        public TabsAdapter(Activity activity, ViewPager pager) {
+            super(activity.getFragmentManager());
+            mContext = activity;
+            mActionBar = activity.getActionBar();
+            mViewPager = pager;
+            mViewPager.setAdapter(this);
+            mViewPager.setOnPageChangeListener(this);
+        }
+
+        public void addTab(ActionBar.Tab tab, Class<?> clss, Bundle args) {
+            TabInfo info = new TabInfo(clss, args);
+            tab.setTag(info);
+            tab.setTabListener(this);
+            mTabs.add(info);
+            mActionBar.addTab(tab);
+            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 onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
+        }
+
+        @Override
+        public void onPageSelected(int position) {
+            mActionBar.setSelectedNavigationItem(position);
+        }
+
+        @Override
+        public void onPageScrollStateChanged(int state) {
+        }
+
+        @Override
+        public void onTabSelected(Tab tab, FragmentTransaction ft) {
+            Object tag = tab.getTag();
+            for (int i=0; i<mTabs.size(); i++) {
+                if (mTabs.get(i) == tag) {
+                    mViewPager.setCurrentItem(i);
+                }
+            }
+        }
+
+        @Override
+        public void onTabUnselected(Tab tab, FragmentTransaction ft) {
+        }
+
+        @Override
+        public void onTabReselected(Tab tab, FragmentTransaction ft) {
+        }
+    }
+}
+//END_INCLUDE(complete)
diff --git a/samples/Support13Demos/src/com/example/android/supportv13/app/CountingFragment.java b/samples/Support13Demos/src/com/example/android/supportv13/app/CountingFragment.java
new file mode 100644
index 0000000..d52955b
--- /dev/null
+++ b/samples/Support13Demos/src/com/example/android/supportv13/app/CountingFragment.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.example.android.supportv13.app;
+
+import com.example.android.supportv13.R;
+
+import android.app.Fragment;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+public class CountingFragment extends Fragment {
+    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.counting, container, false);
+        View tv = v.findViewById(R.id.text);
+        ((TextView)tv).setText("Fragment #" + mNum);
+        return v;
+    }
+}
diff --git a/samples/Support13Demos/src/com/example/android/supportv13/app/CursorFragment.java b/samples/Support13Demos/src/com/example/android/supportv13/app/CursorFragment.java
new file mode 100644
index 0000000..57f0e10
--- /dev/null
+++ b/samples/Support13Demos/src/com/example/android/supportv13/app/CursorFragment.java
@@ -0,0 +1,155 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv13.app;
+
+import android.app.ListFragment;
+import android.app.LoaderManager;
+import android.content.CursorLoader;
+import android.content.Loader;
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.Bundle;
+import android.provider.ContactsContract.Contacts;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+import android.view.View;
+import android.widget.ListView;
+import android.widget.SearchView;
+import android.widget.SimpleCursorAdapter;
+import android.widget.SearchView.OnQueryTextListener;
+
+
+public class CursorFragment extends ListFragment
+        implements OnQueryTextListener, 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_2, null,
+                new String[] { Contacts.DISPLAY_NAME, Contacts.CONTACT_STATUS },
+                new int[] { android.R.id.text1, android.R.id.text2 }, 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_IF_ROOM
+                | MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);
+        SearchView sv = new SearchView(getActivity());
+        sv.setOnQueryTextListener(this);
+        item.setActionView(sv);
+    }
+
+    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, this);
+        return true;
+    }
+
+    @Override public boolean onQueryTextSubmit(String query) {
+        // Don't care about this.
+        return true;
+    }
+
+    @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[] {
+        Contacts._ID,
+        Contacts.DISPLAY_NAME,
+        Contacts.CONTACT_STATUS,
+        Contacts.CONTACT_PRESENCE,
+        Contacts.PHOTO_ID,
+        Contacts.LOOKUP_KEY,
+    };
+
+    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(Contacts.CONTENT_FILTER_URI,
+                    Uri.encode(mCurFilter));
+        } else {
+            baseUri = Contacts.CONTENT_URI;
+        }
+
+        // Now create and return a CursorLoader that will take care of
+        // creating a Cursor for the data being displayed.
+        String select = "((" + Contacts.DISPLAY_NAME + " NOTNULL) AND ("
+                + Contacts.HAS_PHONE_NUMBER + "=1) AND ("
+                + Contacts.DISPLAY_NAME + " != '' ))";
+        return new CursorLoader(getActivity(), baseUri,
+                CONTACTS_SUMMARY_PROJECTION, select, null,
+                Contacts.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/Support13Demos/src/com/example/android/supportv13/app/FragmentNestingPagerSupport.java b/samples/Support13Demos/src/com/example/android/supportv13/app/FragmentNestingPagerSupport.java
new file mode 100644
index 0000000..0a88a05
--- /dev/null
+++ b/samples/Support13Demos/src/com/example/android/supportv13/app/FragmentNestingPagerSupport.java
@@ -0,0 +1,159 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.example.android.supportv13.app;
+
+import java.util.ArrayList;
+
+import com.example.android.supportv13.R;
+
+import android.app.ActionBar;
+import android.app.ActionBar.Tab;
+import android.app.Activity;
+import android.app.Fragment;
+import android.app.FragmentTransaction;
+import android.content.Context;
+import android.os.Bundle;
+import android.support.v13.app.FragmentPagerAdapter;
+import android.support.v4.view.ViewPager;
+
+//BEGIN_INCLUDE(complete)
+public class FragmentNestingPagerSupport extends Activity {
+    ViewPager mViewPager;
+    TabsAdapter mTabsAdapter;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        mViewPager = new ViewPager(this);
+        mViewPager.setId(R.id.pager);
+        setContentView(mViewPager);
+
+        final ActionBar bar = getActionBar();
+        bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
+        bar.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE);
+
+        mTabsAdapter = new TabsAdapter(this, mViewPager);
+        mTabsAdapter.addTab(bar.newTab().setText("Simple"),
+                CountingFragment.class, null);
+        mTabsAdapter.addTab(bar.newTab().setText("List"),
+                FragmentPagerSupport.ArrayListFragment.class, null);
+        mTabsAdapter.addTab(bar.newTab().setText("Cursor"),
+                CursorFragment.class, null);
+        mTabsAdapter.addTab(bar.newTab().setText("Tabs"),
+                FragmentTabsFragment.class, null);
+
+        if (savedInstanceState != null) {
+            bar.setSelectedNavigationItem(savedInstanceState.getInt("tab", 0));
+        }
+    }
+
+    @Override
+    protected void onSaveInstanceState(Bundle outState) {
+        super.onSaveInstanceState(outState);
+        outState.putInt("tab", getActionBar().getSelectedNavigationIndex());
+    }
+
+    /**
+     * 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 ActionBar.TabListener, ViewPager.OnPageChangeListener {
+        private final Context mContext;
+        private final ActionBar mActionBar;
+        private final ViewPager mViewPager;
+        private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();
+
+        static final class TabInfo {
+            private final Class<?> clss;
+            private final Bundle args;
+
+            TabInfo(Class<?> _class, Bundle _args) {
+                clss = _class;
+                args = _args;
+            }
+        }
+
+        public TabsAdapter(Activity activity, ViewPager pager) {
+            super(activity.getFragmentManager());
+            mContext = activity;
+            mActionBar = activity.getActionBar();
+            mViewPager = pager;
+            mViewPager.setAdapter(this);
+            mViewPager.setOnPageChangeListener(this);
+        }
+
+        public void addTab(ActionBar.Tab tab, Class<?> clss, Bundle args) {
+            TabInfo info = new TabInfo(clss, args);
+            tab.setTag(info);
+            tab.setTabListener(this);
+            mTabs.add(info);
+            mActionBar.addTab(tab);
+            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 onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
+        }
+
+        @Override
+        public void onPageSelected(int position) {
+            mActionBar.setSelectedNavigationItem(position);
+        }
+
+        @Override
+        public void onPageScrollStateChanged(int state) {
+        }
+
+        @Override
+        public void onTabSelected(Tab tab, FragmentTransaction ft) {
+            Object tag = tab.getTag();
+            for (int i=0; i<mTabs.size(); i++) {
+                if (mTabs.get(i) == tag) {
+                    mViewPager.setCurrentItem(i);
+                }
+            }
+        }
+
+        @Override
+        public void onTabUnselected(Tab tab, FragmentTransaction ft) {
+        }
+
+        @Override
+        public void onTabReselected(Tab tab, FragmentTransaction ft) {
+        }
+    }
+}
+//END_INCLUDE(complete)
diff --git a/samples/Support13Demos/src/com/example/android/supportv13/app/FragmentNestingStatePagerSupport.java b/samples/Support13Demos/src/com/example/android/supportv13/app/FragmentNestingStatePagerSupport.java
new file mode 100644
index 0000000..5863852
--- /dev/null
+++ b/samples/Support13Demos/src/com/example/android/supportv13/app/FragmentNestingStatePagerSupport.java
@@ -0,0 +1,159 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.example.android.supportv13.app;
+
+import java.util.ArrayList;
+
+import com.example.android.supportv13.R;
+
+import android.app.ActionBar;
+import android.app.ActionBar.Tab;
+import android.app.Activity;
+import android.app.Fragment;
+import android.app.FragmentTransaction;
+import android.content.Context;
+import android.os.Bundle;
+import android.support.v13.app.FragmentStatePagerAdapter;
+import android.support.v4.view.ViewPager;
+
+//BEGIN_INCLUDE(complete)
+public class FragmentNestingStatePagerSupport extends Activity {
+    ViewPager mViewPager;
+    TabsAdapter mTabsAdapter;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        mViewPager = new ViewPager(this);
+        mViewPager.setId(R.id.pager);
+        setContentView(mViewPager);
+
+        final ActionBar bar = getActionBar();
+        bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
+        bar.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE);
+
+        mTabsAdapter = new TabsAdapter(this, mViewPager);
+        mTabsAdapter.addTab(bar.newTab().setText("Simple"),
+                CountingFragment.class, null);
+        mTabsAdapter.addTab(bar.newTab().setText("List"),
+                FragmentPagerSupport.ArrayListFragment.class, null);
+        mTabsAdapter.addTab(bar.newTab().setText("Cursor"),
+                CursorFragment.class, null);
+        mTabsAdapter.addTab(bar.newTab().setText("Tabs"),
+                FragmentTabsFragment.class, null);
+
+        if (savedInstanceState != null) {
+            bar.setSelectedNavigationItem(savedInstanceState.getInt("tab", 0));
+        }
+    }
+
+    @Override
+    protected void onSaveInstanceState(Bundle outState) {
+        super.onSaveInstanceState(outState);
+        outState.putInt("tab", getActionBar().getSelectedNavigationIndex());
+    }
+
+    /**
+     * 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 FragmentStatePagerAdapter
+            implements ActionBar.TabListener, ViewPager.OnPageChangeListener {
+        private final Context mContext;
+        private final ActionBar mActionBar;
+        private final ViewPager mViewPager;
+        private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();
+
+        static final class TabInfo {
+            private final Class<?> clss;
+            private final Bundle args;
+
+            TabInfo(Class<?> _class, Bundle _args) {
+                clss = _class;
+                args = _args;
+            }
+        }
+
+        public TabsAdapter(Activity activity, ViewPager pager) {
+            super(activity.getFragmentManager());
+            mContext = activity;
+            mActionBar = activity.getActionBar();
+            mViewPager = pager;
+            mViewPager.setAdapter(this);
+            mViewPager.setOnPageChangeListener(this);
+        }
+
+        public void addTab(ActionBar.Tab tab, Class<?> clss, Bundle args) {
+            TabInfo info = new TabInfo(clss, args);
+            tab.setTag(info);
+            tab.setTabListener(this);
+            mTabs.add(info);
+            mActionBar.addTab(tab);
+            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 onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
+        }
+
+        @Override
+        public void onPageSelected(int position) {
+            mActionBar.setSelectedNavigationItem(position);
+        }
+
+        @Override
+        public void onPageScrollStateChanged(int state) {
+        }
+
+        @Override
+        public void onTabSelected(Tab tab, FragmentTransaction ft) {
+            Object tag = tab.getTag();
+            for (int i=0; i<mTabs.size(); i++) {
+                if (mTabs.get(i) == tag) {
+                    mViewPager.setCurrentItem(i);
+                }
+            }
+        }
+
+        @Override
+        public void onTabUnselected(Tab tab, FragmentTransaction ft) {
+        }
+
+        @Override
+        public void onTabReselected(Tab tab, FragmentTransaction ft) {
+        }
+    }
+}
+//END_INCLUDE(complete)
diff --git a/samples/Support13Demos/src/com/example/android/supportv13/app/FragmentPagerSupport.java b/samples/Support13Demos/src/com/example/android/supportv13/app/FragmentPagerSupport.java
new file mode 100644
index 0000000..04532b8
--- /dev/null
+++ b/samples/Support13Demos/src/com/example/android/supportv13/app/FragmentPagerSupport.java
@@ -0,0 +1,142 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv13.app;
+
+import com.example.android.supportv13.Cheeses;
+import com.example.android.supportv13.R;
+
+import android.support.v13.app.FragmentPagerAdapter;
+import android.support.v4.view.ViewPager;
+
+import android.os.Bundle;
+import android.app.Activity;
+import android.app.Fragment;
+import android.app.FragmentManager;
+import android.app.ListFragment;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.View.OnClickListener;
+import android.widget.ArrayAdapter;
+import android.widget.Button;
+import android.widget.ListView;
+import android.widget.TextView;
+
+//BEGIN_INCLUDE(complete)
+public class FragmentPagerSupport extends Activity {
+    static final int NUM_ITEMS = 10;
+
+    MyAdapter mAdapter;
+
+    ViewPager mPager;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.fragment_pager);
+
+        mAdapter = new MyAdapter(getFragmentManager());
+
+        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 ListFragment {
+        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);
+        }
+    }
+}
+//END_INCLUDE(complete)
diff --git a/samples/Support13Demos/src/com/example/android/supportv13/app/FragmentStatePagerSupport.java b/samples/Support13Demos/src/com/example/android/supportv13/app/FragmentStatePagerSupport.java
new file mode 100644
index 0000000..e60c268
--- /dev/null
+++ b/samples/Support13Demos/src/com/example/android/supportv13/app/FragmentStatePagerSupport.java
@@ -0,0 +1,142 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv13.app;
+
+import com.example.android.supportv13.Cheeses;
+import com.example.android.supportv13.R;
+
+import android.support.v13.app.FragmentStatePagerAdapter;
+import android.support.v4.view.ViewPager;
+
+import android.os.Bundle;
+import android.app.Activity;
+import android.app.Fragment;
+import android.app.FragmentManager;
+import android.app.ListFragment;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.View.OnClickListener;
+import android.widget.ArrayAdapter;
+import android.widget.Button;
+import android.widget.ListView;
+import android.widget.TextView;
+
+//BEGIN_INCLUDE(complete)
+public class FragmentStatePagerSupport extends Activity {
+    static final int NUM_ITEMS = 10;
+
+    MyAdapter mAdapter;
+
+    ViewPager mPager;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.fragment_pager);
+
+        mAdapter = new MyAdapter(getFragmentManager());
+
+        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 ListFragment {
+        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);
+        }
+    }
+}
+//END_INCLUDE(complete)
diff --git a/samples/Support13Demos/src/com/example/android/supportv13/app/FragmentTabsFragment.java b/samples/Support13Demos/src/com/example/android/supportv13/app/FragmentTabsFragment.java
new file mode 100644
index 0000000..4415851
--- /dev/null
+++ b/samples/Support13Demos/src/com/example/android/supportv13/app/FragmentTabsFragment.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.example.android.supportv13.app;
+
+import com.example.android.supportv13.R;
+
+import android.app.Fragment;
+import android.os.Bundle;
+import android.support.v13.app.FragmentTabHost;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+public class FragmentTabsFragment extends Fragment {
+    private FragmentTabHost mTabHost;
+
+    @Override
+    public View onCreateView(LayoutInflater inflater, ViewGroup container,
+            Bundle savedInstanceState) {
+        mTabHost = new FragmentTabHost(getActivity());
+        mTabHost.setup(getActivity(), getChildFragmentManager(), R.id.pager);
+
+        mTabHost.addTab(mTabHost.newTabSpec("simple").setIndicator("Simple"),
+                CountingFragment.class, null);
+        mTabHost.addTab(mTabHost.newTabSpec("array").setIndicator("Array"),
+                FragmentPagerSupport.ArrayListFragment.class, null);
+        mTabHost.addTab(mTabHost.newTabSpec("cursor").setIndicator("Cursor"),
+                CursorFragment.class, null);
+
+        return mTabHost;
+    }
+
+    @Override
+    public void onDestroyView() {
+        super.onDestroyView();
+        mTabHost = null;
+    }
+}
+//END_INCLUDE(complete)
diff --git a/samples/Support13Demos/src/com/example/android/supportv13/app/_index.html b/samples/Support13Demos/src/com/example/android/supportv13/app/_index.html
new file mode 100644
index 0000000..832d60e
--- /dev/null
+++ b/samples/Support13Demos/src/com/example/android/supportv13/app/_index.html
@@ -0,0 +1,26 @@
+
+<p>This section includes samples showing the use of the application
+package features of the static support library fir API 13 or later.
+<ul>
+  <li><a href="#Fragment">Fragment</a></li>
+</ul>
+
+
+<h3 id="Fragment">Fragment</h3>
+<dl>
+  <dt><a href="ActionBarTabsPager.html">Action Bar Tabs Pager</a></dt>
+  <dd>Demonstrates the use of fragments to implement switching between
+  ActionBar tabs, using a ViewPager to manager the fragments so that
+  the user can also fling left and right to switch tabs.</dd>
+
+  <dt><a href="FragmentPagerSupport.html">Fragment Pager Support</a></dt>
+  <dd>Demonstrates the use of the v4 support class ViewPager with a
+  FragmentPagerAdapter to build a user interface where the user can fling
+  left or right to switch between fragments.</dd>
+
+  <dt><a href="FragmentStatePagerSupport.html">Fragment State Pager Support</a></dt>
+  <dd>Demonstrates the use of the v4 support class ViewPager with a
+  FragmentStatePagerAdapter to build a user interface where the user can fling
+  left or right to switch between fragments.  This versions of the adapter
+  doesn't keep around the fragment instances that ViewPager has destroyed.</dd>
+</dl>
diff --git a/samples/Support13Demos/src/com/example/android/supportv13/view/CheckableFrameLayout.java b/samples/Support13Demos/src/com/example/android/supportv13/view/CheckableFrameLayout.java
new file mode 100644
index 0000000..f642e8e
--- /dev/null
+++ b/samples/Support13Demos/src/com/example/android/supportv13/view/CheckableFrameLayout.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv13.view;
+
+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/Support4Demos/Android.mk b/samples/Support4Demos/Android.mk
new file mode 100644
index 0000000..eefbdab
--- /dev/null
+++ b/samples/Support4Demos/Android.mk
@@ -0,0 +1,21 @@
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := samples tests
+
+# Only compile source java files in this apk.
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_STATIC_JAVA_LIBRARIES += android-support-v4
+
+LOCAL_PACKAGE_NAME := Support4Demos
+
+LOCAL_SDK_VERSION := current
+LOCAL_MIN_SDK_VERSION := 4
+
+LOCAL_DEX_PREOPT := false
+
+include $(BUILD_PACKAGE)
+
+# Use the following include to make our test apk.
+include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/samples/Support4Demos/AndroidManifest.xml b/samples/Support4Demos/AndroidManifest.xml
new file mode 100644
index 0000000..c48e790
--- /dev/null
+++ b/samples/Support4Demos/AndroidManifest.xml
@@ -0,0 +1,463 @@
+<?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"
+    package="com.example.android.supportv4">
+
+    <uses-permission android:name="android.permission.READ_CONTACTS" />
+    <uses-permission android:name="android.permission.INTERNET" />
+    <uses-permission android:name="android.permission.WAKE_LOCK" />
+
+    <uses-sdk android:minSdkVersion="4" android:targetSdkVersion="22" />
+
+    <!-- The smallest screen this app works on is a phone.  The app will
+         scale its UI to larger screens but doesn't make good use of them
+         so allow the compatibility mode button to be shown (mostly because
+         this is just convenient for testing). -->
+    <supports-screens android:requiresSmallestWidthDp="320"
+            android:compatibleWidthLimitDp="480" />
+
+    <application android:label="@string/activity_sample_code"
+            android:icon="@drawable/app_sample_code"
+            android:hardwareAccelerated="true"
+            android:supportsRtl="true">
+
+        <activity android:name="Support4Demos">
+            <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=".app.SendResult"
+                android:theme="@style/ThemeDialogWhenLarge">
+        </activity>
+        
+        <!-- Fragment Support Samples -->
+
+        <activity android:name=".app.FragmentAlertDialogSupport"
+                android:label="@string/fragment_alert_dialog_support">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv4.SUPPORT4_SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".app.FragmentArgumentsSupport"
+                android:label="@string/fragment_arguments_support">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv4.SUPPORT4_SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".app.FragmentCustomAnimationSupport"
+                android:label="@string/fragment_custom_animation_support">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv4.SUPPORT4_SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".app.FragmentHideShowSupport"
+                android:label="@string/fragment_hide_show_support"
+                android:windowSoftInputMode="stateUnchanged">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv4.SUPPORT4_SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".app.FragmentContextMenuSupport"
+                android:label="@string/fragment_context_menu_support">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv4.SUPPORT4_SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".app.FragmentDialogSupport"
+                android:label="@string/fragment_dialog_support">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv4.SUPPORT4_SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".app.FragmentDialogOrActivitySupport"
+                android:label="@string/fragment_dialog_or_activity_support">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv4.SUPPORT4_SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".app.FragmentLayoutSupport"
+                android:label="@string/fragment_layout_support">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv4.SUPPORT4_SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".app.FragmentListArraySupport"
+                android:label="@string/fragment_list_array_support">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv4.SUPPORT4_SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".app.FragmentLayoutSupport$DetailsActivity" />
+
+        <activity android:name=".app.FragmentMenuSupport"
+                android:label="@string/fragment_menu_support">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv4.SUPPORT4_SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".app.FragmentNestingTabsSupport"
+                android:label="@string/fragment_nesting_tabs_support">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv4.SUPPORT4_SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+        
+        <activity android:name=".app.FragmentRetainInstanceSupport"
+                android:label="@string/fragment_retain_instance_support">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv4.SUPPORT4_SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".app.FragmentReceiveResultSupport"
+                android:label="@string/fragment_receive_result_support">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv4.SUPPORT4_SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".app.FragmentStackSupport"
+                android:label="@string/fragment_stack_support">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv4.SUPPORT4_SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".app.FragmentTabs"
+                android:label="@string/fragment_tabs">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv4.SUPPORT4_SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".app.FragmentTabsPager"
+                android:label="@string/fragment_tabs_pager">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv4.SUPPORT4_SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".app.FragmentPagerSupport"
+                android:label="@string/fragment_pager_support">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv4.SUPPORT4_SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".app.FragmentStatePagerSupport"
+                android:label="@string/fragment_state_pager_support">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv4.SUPPORT4_SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".app.LoaderCursorSupport"
+                android:label="@string/loader_cursor_support">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv4.SUPPORT4_SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".app.LoaderRetainedSupport"
+                android:label="@string/loader_retained_support">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv4.SUPPORT4_SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+        
+        <activity android:name=".app.LoaderCustomSupport"
+                android:label="@string/loader_custom_support">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv4.SUPPORT4_SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".app.LoaderThrottleSupport"
+                android:label="@string/loader_throttle_support">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv4.SUPPORT4_SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+        <provider android:name=".app.LoaderThrottleSupport$SimpleProvider"
+                  android:authorities="com.example.android.apis.supportv4.app.LoaderThrottle" />
+
+        <activity android:name=".content.LocalServiceBroadcaster"
+                android:label="@string/local_service_broadcaster">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv4.SUPPORT4_SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+        <service android:name=".content.LocalServiceBroadcaster$LocalService"
+                android:stopWithTask="true" />
+
+        <activity android:name=".content.SimpleWakefulController"
+                  android:label="@string/simple_wakeful_controller">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv4.SUPPORT4_SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <receiver android:name=".content.SimpleWakefulReceiver" />
+        <service android:name=".content.SimpleWakefulService" />
+
+        <activity android:name=".accessibility.AccessibilityManagerSupportActivity"
+                android:label="@string/accessibility_manager_title">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv4.SUPPORT4_SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".accessibility.AccessibilityDelegateSupportActivity"
+                android:label="@string/accessibility_delegate_title">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv4.SUPPORT4_SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".accessibility.AccessibilityRoleDescriptionSupportActivity"
+                android:label="@string/accessibility_roledescription_title">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv4.SUPPORT4_SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".app.SharingSupport"
+                  android:label="@string/sharing_support_title">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv4.SUPPORT4_SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".app.SharingReceiverSupport"
+                  android:label="@string/sharing_receiver_title">
+            <intent-filter>
+                <action android:name="android.intent.action.SEND" />
+                <action android:name="android.intent.action.SEND_MULTIPLE" />
+                <data android:mimeType="text/plain" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".text.BidiFormatterSupport"
+                  android:label="@string/bidiformatter_support_title">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv4.SUPPORT4_SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".view.ViewPagerActivity"
+                  android:label="@string/view_pager_layout_support">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv4.SUPPORT4_SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".widget.SwipeRefreshLayoutActivityList"
+                  android:label="@string/swipe_list"
+                  android:theme="@style/ThemeHoloLight">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv4.SUPPORT4_SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".widget.SwipeRefreshLayoutActivityTextView"
+                  android:label="@string/swipe_text"
+                  android:theme="@style/ThemeHoloLight">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv4.SUPPORT4_SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".widget.SwipeRefreshLayoutActivityNestedScrollView"
+                  android:label="@string/swipe_nested_sv"
+                  android:theme="@style/ThemeHoloLight">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv4.SUPPORT4_SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+
+        <activity android:name=".widget.ContentLoadingProgressBarActivity"
+                  android:label="@string/content_loading_progress_bar">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv4.SUPPORT4_SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".widget.SlidingPaneLayoutActivity"
+                  android:label="@string/sliding_pane_layout_support">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv4.SUPPORT4_SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".widget.ExploreByTouchHelperActivity"
+                  android:label="@string/explore_by_touch_helper_support">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv4.SUPPORT4_SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <provider android:authorities="com.example.supportv4.content.sharingsupportprovider"
+                  android:name=".content.SharingSupportProvider" />
+
+        <!-- FileProvider Example -->
+
+        <activity android:name=".content.FileProviderExample"
+                android:label="@string/file_provider_example">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv4.SUPPORT4_SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".widget.NestedScrollActivity"
+                  android:label="@string/nested_scroll">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv4.SUPPORT4_SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".graphics.RoundedBitmapDrawableActivity"
+            android:label="Graphics/RoundedBitmapDrawable">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv4.SUPPORT4_SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".graphics.DrawableCompatActivity"
+                  android:label="Graphics/DrawableCompat">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv4.SUPPORT4_SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+<!-- BEGIN_INCLUDE(file_provider_declaration) -->
+        <provider
+            android:name="android.support.v4.content.FileProvider"
+            android:authorities="com.example.android.supportv4.my_files"
+            android:grantUriPermissions="true"
+            android:exported="false">
+            <meta-data
+                android:name="android.support.FILE_PROVIDER_PATHS"
+                android:resource="@xml/my_paths" />
+        </provider>
+<!-- END_INCLUDE(file_provider_declaration) -->
+
+        <activity android:name=".media.TransportControllerActivity"
+                android:label="@string/sample_transport_controller_activity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv4.SUPPORT4_SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <!-- MediaBrowserCompat Sample -->
+        <activity android:name=".media.MediaBrowserSupport"
+            android:label="@string/media_browser_support">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv4.SUPPORT4_SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <!-- (OPTIONAL) use this meta data to indicate which icon should be used in media
+            notifications (for example, when the music changes and the user is
+            looking at another app) -->
+        <meta-data android:name="com.google.android.gms.car.notification.SmallIcon"
+            android:resource="@drawable/ic_notification" />
+
+        <!--
+             (OPTIONAL) use this meta data to override the theme from which Android Auto will
+             look for colors. If you don't set this, Android Auto will look
+             for color attributes in your application theme.
+        -->
+        <meta-data android:name="com.google.android.gms.car.application.theme"
+            android:resource="@style/CarTheme" />
+
+        <service android:name=".media.MediaBrowserServiceSupport"
+            android:exported="true" android:process=":service">
+            <intent-filter>
+                <action android:name="android.media.browse.MediaBrowserService" />
+            </intent-filter>
+        </service>
+
+        <receiver android:name="android.support.v4.media.session.MediaButtonReceiver" >
+            <intent-filter>
+                <action android:name="android.intent.action.MEDIA_BUTTON" />
+            </intent-filter>
+        </receiver>
+
+    </application>
+</manifest>
diff --git a/samples/Support4Demos/_index.html b/samples/Support4Demos/_index.html
new file mode 100644
index 0000000..2b03ca4
--- /dev/null
+++ b/samples/Support4Demos/_index.html
@@ -0,0 +1,26 @@
+<p>The Support v4 Demos application contains a variety of small sample
+code showing how to use key features of the Android API 4+ Support Library.
+This library contains code that you can
+build in to your application to access new features and common
+utilities while being able to run down to version 1.6 (API 4)
+of the platform.
+</p>
+
+<script type="text/javascript">
+
+// This is a totally temporary hack to display the following content only
+// when the docs are online. This will be changed once the samples get moved.
+
+if (toRoot == "/") {
+
+document.write(""+
+"<p>You'll notice that all the samples are included in a single Android "+
+"project, so the application code and other resource files for all samples are batched "+
+"together. Current samples are only for the fragment and loader in the "+
+"application part of the support library:</p>"+
+
+"<ul><li><a href='src/com/example/android/supportv4/app/index.html'>App</a></li></ul>");
+
+}
+
+</script>
diff --git a/samples/Support4Demos/build.gradle b/samples/Support4Demos/build.gradle
new file mode 100644
index 0000000..26d8113
--- /dev/null
+++ b/samples/Support4Demos/build.gradle
@@ -0,0 +1,31 @@
+apply plugin: 'com.android.application'
+
+dependencies {
+    compile project(':support-v4')
+}
+
+android {
+    compileSdkVersion project.ext.currentSdk
+
+    defaultConfig {
+        minSdkVersion 9
+    }
+
+    sourceSets {
+        main.manifest.srcFile 'AndroidManifest.xml'
+        main.java.srcDirs = ['src']
+        main.aidl.srcDirs = ['src']
+        main.res.srcDirs = ['res']
+    }
+
+    lintOptions {
+        // TODO: fix errors and reenable.
+        abortOnError false
+    }
+
+    compileOptions {
+        sourceCompatibility JavaVersion.VERSION_1_7
+        targetCompatibility JavaVersion.VERSION_1_7
+    }
+}
+
diff --git a/samples/Support4Demos/res/anim/decelerate_quint.xml b/samples/Support4Demos/res/anim/decelerate_quint.xml
new file mode 100644
index 0000000..ff2d5a9
--- /dev/null
+++ b/samples/Support4Demos/res/anim/decelerate_quint.xml
@@ -0,0 +1,21 @@
+<?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/Support4Demos/res/anim/fragment_slide_left_enter.xml b/samples/Support4Demos/res/anim/fragment_slide_left_enter.xml
new file mode 100644
index 0000000..6bbf6a2
--- /dev/null
+++ b/samples/Support4Demos/res/anim/fragment_slide_left_enter.xml
@@ -0,0 +1,23 @@
+<?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/Support4Demos/res/anim/fragment_slide_left_exit.xml b/samples/Support4Demos/res/anim/fragment_slide_left_exit.xml
new file mode 100644
index 0000000..0affbc7
--- /dev/null
+++ b/samples/Support4Demos/res/anim/fragment_slide_left_exit.xml
@@ -0,0 +1,23 @@
+<?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/Support4Demos/res/anim/fragment_slide_right_enter.xml b/samples/Support4Demos/res/anim/fragment_slide_right_enter.xml
new file mode 100644
index 0000000..e2e1168
--- /dev/null
+++ b/samples/Support4Demos/res/anim/fragment_slide_right_enter.xml
@@ -0,0 +1,23 @@
+<?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/Support4Demos/res/anim/fragment_slide_right_exit.xml b/samples/Support4Demos/res/anim/fragment_slide_right_exit.xml
new file mode 100644
index 0000000..c8e6e7c
--- /dev/null
+++ b/samples/Support4Demos/res/anim/fragment_slide_right_exit.xml
@@ -0,0 +1,23 @@
+<?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/Support4Demos/res/color/tint_state_list.xml b/samples/Support4Demos/res/color/tint_state_list.xml
new file mode 100644
index 0000000..ea37c52
--- /dev/null
+++ b/samples/Support4Demos/res/color/tint_state_list.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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_pressed="true" android:color="#0000FF" />
+    <item android:color="#FF0000" />
+</selector>
\ No newline at end of file
diff --git a/samples/Support4Demos/res/drawable-hdpi/alert_dialog_icon.png b/samples/Support4Demos/res/drawable-hdpi/alert_dialog_icon.png
new file mode 100755
index 0000000..fe54477
--- /dev/null
+++ b/samples/Support4Demos/res/drawable-hdpi/alert_dialog_icon.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable-hdpi/android_robot.png b/samples/Support4Demos/res/drawable-hdpi/android_robot.png
new file mode 100644
index 0000000..e2bdf7d
--- /dev/null
+++ b/samples/Support4Demos/res/drawable-hdpi/android_robot.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable-hdpi/app_sample_code.png b/samples/Support4Demos/res/drawable-hdpi/app_sample_code.png
new file mode 100755
index 0000000..66a1984
--- /dev/null
+++ b/samples/Support4Demos/res/drawable-hdpi/app_sample_code.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable-hdpi/ic_drawer_am.png b/samples/Support4Demos/res/drawable-hdpi/ic_drawer_am.png
new file mode 100644
index 0000000..ff7b1de
--- /dev/null
+++ b/samples/Support4Demos/res/drawable-hdpi/ic_drawer_am.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable-hdpi/ic_favorite.png b/samples/Support4Demos/res/drawable-hdpi/ic_favorite.png
new file mode 100644
index 0000000..1de4e58
--- /dev/null
+++ b/samples/Support4Demos/res/drawable-hdpi/ic_favorite.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable-hdpi/ic_notification.png b/samples/Support4Demos/res/drawable-hdpi/ic_notification.png
new file mode 100644
index 0000000..a8cba40
--- /dev/null
+++ b/samples/Support4Demos/res/drawable-hdpi/ic_notification.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable-hdpi/ic_pause_white_24dp.png b/samples/Support4Demos/res/drawable-hdpi/ic_pause_white_24dp.png
new file mode 100644
index 0000000..b4bdbb5
--- /dev/null
+++ b/samples/Support4Demos/res/drawable-hdpi/ic_pause_white_24dp.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable-hdpi/ic_play_arrow_white_24dp.png b/samples/Support4Demos/res/drawable-hdpi/ic_play_arrow_white_24dp.png
new file mode 100644
index 0000000..164385d
--- /dev/null
+++ b/samples/Support4Demos/res/drawable-hdpi/ic_play_arrow_white_24dp.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable-hdpi/ic_skip_next_white_24dp.png b/samples/Support4Demos/res/drawable-hdpi/ic_skip_next_white_24dp.png
new file mode 100644
index 0000000..4eaf7ca
--- /dev/null
+++ b/samples/Support4Demos/res/drawable-hdpi/ic_skip_next_white_24dp.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable-hdpi/ic_skip_previous_white_24dp.png b/samples/Support4Demos/res/drawable-hdpi/ic_skip_previous_white_24dp.png
new file mode 100644
index 0000000..e59dedb
--- /dev/null
+++ b/samples/Support4Demos/res/drawable-hdpi/ic_skip_previous_white_24dp.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable-hdpi/refresh.png b/samples/Support4Demos/res/drawable-hdpi/refresh.png
new file mode 100644
index 0000000..d65c15f
--- /dev/null
+++ b/samples/Support4Demos/res/drawable-hdpi/refresh.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable-mdpi/alert_dialog_icon.png b/samples/Support4Demos/res/drawable-mdpi/alert_dialog_icon.png
new file mode 100644
index 0000000..0a7de04
--- /dev/null
+++ b/samples/Support4Demos/res/drawable-mdpi/alert_dialog_icon.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable-mdpi/android_robot.png b/samples/Support4Demos/res/drawable-mdpi/android_robot.png
new file mode 100644
index 0000000..62b8e10
--- /dev/null
+++ b/samples/Support4Demos/res/drawable-mdpi/android_robot.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable-mdpi/app_sample_code.png b/samples/Support4Demos/res/drawable-mdpi/app_sample_code.png
new file mode 100644
index 0000000..5ae7701
--- /dev/null
+++ b/samples/Support4Demos/res/drawable-mdpi/app_sample_code.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable-mdpi/ic_drawer_am.png b/samples/Support4Demos/res/drawable-mdpi/ic_drawer_am.png
new file mode 100644
index 0000000..fb681ba
--- /dev/null
+++ b/samples/Support4Demos/res/drawable-mdpi/ic_drawer_am.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable-mdpi/ic_favorite.png b/samples/Support4Demos/res/drawable-mdpi/ic_favorite.png
new file mode 100644
index 0000000..aa5d340
--- /dev/null
+++ b/samples/Support4Demos/res/drawable-mdpi/ic_favorite.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable-mdpi/refresh.png b/samples/Support4Demos/res/drawable-mdpi/refresh.png
new file mode 100644
index 0000000..dc96718
--- /dev/null
+++ b/samples/Support4Demos/res/drawable-mdpi/refresh.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable-xhdpi/android_robot.png b/samples/Support4Demos/res/drawable-xhdpi/android_robot.png
new file mode 100644
index 0000000..88b1113
--- /dev/null
+++ b/samples/Support4Demos/res/drawable-xhdpi/android_robot.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable-xhdpi/ic_drawer_am.png b/samples/Support4Demos/res/drawable-xhdpi/ic_drawer_am.png
new file mode 100644
index 0000000..b9bc3d7
--- /dev/null
+++ b/samples/Support4Demos/res/drawable-xhdpi/ic_drawer_am.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable-xhdpi/ic_equalizer_white_24dp.png b/samples/Support4Demos/res/drawable-xhdpi/ic_equalizer_white_24dp.png
new file mode 100644
index 0000000..dbba844
--- /dev/null
+++ b/samples/Support4Demos/res/drawable-xhdpi/ic_equalizer_white_24dp.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable-xhdpi/ic_favorite.png b/samples/Support4Demos/res/drawable-xhdpi/ic_favorite.png
new file mode 100644
index 0000000..5868c34
--- /dev/null
+++ b/samples/Support4Demos/res/drawable-xhdpi/ic_favorite.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable-xhdpi/ic_pause_white_24dp.png b/samples/Support4Demos/res/drawable-xhdpi/ic_pause_white_24dp.png
new file mode 100644
index 0000000..14b6d17
--- /dev/null
+++ b/samples/Support4Demos/res/drawable-xhdpi/ic_pause_white_24dp.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable-xhdpi/ic_play_arrow_white_24dp.png b/samples/Support4Demos/res/drawable-xhdpi/ic_play_arrow_white_24dp.png
new file mode 100644
index 0000000..a55d199
--- /dev/null
+++ b/samples/Support4Demos/res/drawable-xhdpi/ic_play_arrow_white_24dp.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable-xhdpi/ic_skip_next_white_24dp.png b/samples/Support4Demos/res/drawable-xhdpi/ic_skip_next_white_24dp.png
new file mode 100644
index 0000000..f282b92
--- /dev/null
+++ b/samples/Support4Demos/res/drawable-xhdpi/ic_skip_next_white_24dp.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable-xhdpi/ic_skip_previous_white_24dp.png b/samples/Support4Demos/res/drawable-xhdpi/ic_skip_previous_white_24dp.png
new file mode 100644
index 0000000..2522877
--- /dev/null
+++ b/samples/Support4Demos/res/drawable-xhdpi/ic_skip_previous_white_24dp.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable-xhdpi/refresh.png b/samples/Support4Demos/res/drawable-xhdpi/refresh.png
new file mode 100644
index 0000000..47da13e
--- /dev/null
+++ b/samples/Support4Demos/res/drawable-xhdpi/refresh.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable-xxhdpi/ic_default_art.png b/samples/Support4Demos/res/drawable-xxhdpi/ic_default_art.png
new file mode 100644
index 0000000..dfb9e67
--- /dev/null
+++ b/samples/Support4Demos/res/drawable-xxhdpi/ic_default_art.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable-xxhdpi/ic_equalizer_white_24dp.png b/samples/Support4Demos/res/drawable-xxhdpi/ic_equalizer_white_24dp.png
new file mode 100644
index 0000000..b82a8d9
--- /dev/null
+++ b/samples/Support4Demos/res/drawable-xxhdpi/ic_equalizer_white_24dp.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable-xxhdpi/ic_favorite.png b/samples/Support4Demos/res/drawable-xxhdpi/ic_favorite.png
new file mode 100644
index 0000000..02b46e3
--- /dev/null
+++ b/samples/Support4Demos/res/drawable-xxhdpi/ic_favorite.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable-xxhdpi/ic_pause_white_24dp.png b/samples/Support4Demos/res/drawable-xxhdpi/ic_pause_white_24dp.png
new file mode 100644
index 0000000..72dfa9f
--- /dev/null
+++ b/samples/Support4Demos/res/drawable-xxhdpi/ic_pause_white_24dp.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable-xxhdpi/ic_play_arrow_white_24dp.png b/samples/Support4Demos/res/drawable-xxhdpi/ic_play_arrow_white_24dp.png
new file mode 100644
index 0000000..043acd8
--- /dev/null
+++ b/samples/Support4Demos/res/drawable-xxhdpi/ic_play_arrow_white_24dp.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable-xxhdpi/ic_skip_next_white_24dp.png b/samples/Support4Demos/res/drawable-xxhdpi/ic_skip_next_white_24dp.png
new file mode 100644
index 0000000..4fe6088
--- /dev/null
+++ b/samples/Support4Demos/res/drawable-xxhdpi/ic_skip_next_white_24dp.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable-xxhdpi/ic_skip_previous_white_24dp.png b/samples/Support4Demos/res/drawable-xxhdpi/ic_skip_previous_white_24dp.png
new file mode 100644
index 0000000..2c9310a
--- /dev/null
+++ b/samples/Support4Demos/res/drawable-xxhdpi/ic_skip_previous_white_24dp.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable-xxhdpi/ic_star_off.png b/samples/Support4Demos/res/drawable-xxhdpi/ic_star_off.png
new file mode 100644
index 0000000..fb7afb0
--- /dev/null
+++ b/samples/Support4Demos/res/drawable-xxhdpi/ic_star_off.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable-xxhdpi/ic_star_on.png b/samples/Support4Demos/res/drawable-xxhdpi/ic_star_on.png
new file mode 100644
index 0000000..6f7fc75
--- /dev/null
+++ b/samples/Support4Demos/res/drawable-xxhdpi/ic_star_on.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable-xxxhdpi/ic_favorite.png b/samples/Support4Demos/res/drawable-xxxhdpi/ic_favorite.png
new file mode 100644
index 0000000..d7684c4
--- /dev/null
+++ b/samples/Support4Demos/res/drawable-xxxhdpi/ic_favorite.png
Binary files differ
diff --git a/samples/Support4Demos/res/drawable/gradient.xml b/samples/Support4Demos/res/drawable/gradient.xml
new file mode 100644
index 0000000..8c77d29
--- /dev/null
+++ b/samples/Support4Demos/res/drawable/gradient.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2016 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">
+    <gradient android:startColor="#c8c8ff"
+              android:endColor="#c8ffc8"
+              android:angle="270" />
+</shape>
\ No newline at end of file
diff --git a/samples/Support4Demos/res/drawable/ic_drawer.xml b/samples/Support4Demos/res/drawable/ic_drawer.xml
new file mode 100644
index 0000000..919540f
--- /dev/null
+++ b/samples/Support4Demos/res/drawable/ic_drawer.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright 2013, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+
+<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
+        android:src="@drawable/ic_drawer_am"
+        android:autoMirrored="true">
+</bitmap>
+
diff --git a/samples/Support4Demos/res/layout-land/fragment_arguments_support.xml b/samples/Support4Demos/res/layout-land/fragment_arguments_support.xml
new file mode 100644
index 0000000..b0b89fb
--- /dev/null
+++ b/samples/Support4Demos/res/layout-land/fragment_arguments_support.xml
@@ -0,0 +1,57 @@
+<?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.example.android.supportv4.app.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.example.android.supportv4.app.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/Support4Demos/res/layout-land/fragment_layout_support.xml b/samples/Support4Demos/res/layout-land/fragment_layout_support.xml
new file mode 100644
index 0000000..85de600
--- /dev/null
+++ b/samples/Support4Demos/res/layout-land/fragment_layout_support.xml
@@ -0,0 +1,33 @@
+<?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. -->
+
+<!-- BEGIN_INCLUDE(layout) -->
+<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.example.android.supportv4.app.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>
+<!-- END_INCLUDE(layout) -->
diff --git a/samples/Support4Demos/res/layout/accessibility_delegate.xml b/samples/Support4Demos/res/layout/accessibility_delegate.xml
new file mode 100644
index 0000000..333f90d
--- /dev/null
+++ b/samples/Support4Demos/res/layout/accessibility_delegate.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical">
+
+    <TextView
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="@string/accessibility_delegate_instructions"/>
+
+    <view class="com.example.android.supportv4.accessibility.AccessibilityDelegateSupportActivity$AccessibilityDelegateSupportView"
+        android:layout_width="wrap_content"
+        android:layout_height="50dip"
+        android:layout_marginTop="50dip"
+        android:background="@android:drawable/btn_default"/>
+
+</LinearLayout>
diff --git a/samples/Support4Demos/res/layout/accessibility_manager.xml b/samples/Support4Demos/res/layout/accessibility_manager.xml
new file mode 100644
index 0000000..e8814c4
--- /dev/null
+++ b/samples/Support4Demos/res/layout/accessibility_manager.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <LinearLayout
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:orientation="vertical">
+
+    <TextView
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="@string/accessibility_manager_instructions"/>
+
+        <TextView
+            android:id="@+id/accessibility_state"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="50dip"/>
+
+    </LinearLayout>
+
+</ScrollView>
diff --git a/samples/Support4Demos/res/layout/accessibility_roledescription.xml b/samples/Support4Demos/res/layout/accessibility_roledescription.xml
new file mode 100644
index 0000000..a617e09
--- /dev/null
+++ b/samples/Support4Demos/res/layout/accessibility_roledescription.xml
@@ -0,0 +1,100 @@
+<?xml version="1.0" encoding="utf-8"?>
+<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:orientation="vertical">
+
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="@string/accessibility_roledescription_instructions"/>
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal"
+            android:padding="24dp">
+
+            <TextView
+                android:id="@+id/text_view_1"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:padding="24dp"
+                android:background="#ffffff"
+                android:textColor="#000000"
+                android:text="@string/accessibility_roledescription_item"/>
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="24dp"
+                android:padding="24dp"
+                android:background="#ffffff"
+                android:textColor="#000000"
+                android:text="@string/accessibility_roledescription_item"/>
+
+        </LinearLayout>
+
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="@string/accessibility_roledescription_example"/>
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="vertical"
+            android:padding="24dp">
+
+            <TextView
+                android:id="@+id/text_heading_1"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="0dp"
+                android:textSize="24sp"
+                android:text="@string/accessibility_roledescription_h1_item"/>
+
+            <TextView
+                android:id="@+id/text_heading_2"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="24dp"
+                android:textSize="20sp"
+                android:text="@string/accessibility_roledescription_h2_item"/>
+
+            <TextView
+                android:id="@+id/text_heading_3"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="48dp"
+                android:textSize="16sp"
+                android:text="@string/accessibility_roledescription_h3_item"/>
+
+        </LinearLayout>
+
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="@string/accessibility_roledescription_counterexample"/>
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="vertical"
+            android:padding="24dp">
+
+            <Button
+                android:id="@+id/button"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="@string/accessibility_roledescription_button_item"/>
+
+        </LinearLayout>
+
+    </LinearLayout>
+
+</ScrollView>
diff --git a/samples/Support4Demos/res/layout/activity_player.xml b/samples/Support4Demos/res/layout/activity_player.xml
new file mode 100644
index 0000000..21cdbbd
--- /dev/null
+++ b/samples/Support4Demos/res/layout/activity_player.xml
@@ -0,0 +1,22 @@
+<!--
+  Copyright (C) 2014 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.
+  -->
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+             xmlns:tools="http://schemas.android.com/tools"
+             android:id="@+id/container"
+             android:layout_width="match_parent"
+             android:layout_height="match_parent"
+             tools:context=".MusicPlayerActivity"
+             tools:ignore="MergeRootFrame" />
diff --git a/samples/Support4Demos/res/layout/activity_rounded_bitmap.xml b/samples/Support4Demos/res/layout/activity_rounded_bitmap.xml
new file mode 100644
index 0000000..b40d288
--- /dev/null
+++ b/samples/Support4Demos/res/layout/activity_rounded_bitmap.xml
@@ -0,0 +1,36 @@
+<!--
+  ~ Copyright 2015 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="match_parent"
+    android:layout_height="match_parent"
+    android:gravity="center_horizontal"
+    android:orientation="vertical">
+
+    <ToggleButton
+        android:id="@+id/toggle_round"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:textOff="@string/regular"
+        android:textOn="@string/round"
+        android:layout_marginBottom="16dp"/>
+
+    <ImageView
+        android:id="@+id/image"
+        android:layout_width="200dp"
+        android:layout_height="200dp" />
+
+</LinearLayout>
diff --git a/samples/Support4Demos/res/layout/bidiformater_support.xml b/samples/Support4Demos/res/layout/bidiformater_support.xml
new file mode 100644
index 0000000..92f4ae0
--- /dev/null
+++ b/samples/Support4Demos/res/layout/bidiformater_support.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+              android:orientation="vertical"
+              android:padding="16dp"
+              android:layout_width="match_parent"
+              android:layout_height="match_parent">
+
+    <LinearLayout android:orientation="horizontal"
+                  android:layout_width="match_parent"
+                  android:layout_height="wrap_content">
+
+        <TextView android:layout_width="wrap_content"
+                  android:layout_height="wrap_content"
+                  android:textSize="24dip"
+                  android:text="@string/without_bidiformatter"
+                 />
+
+        <TextView android:id="@+id/textview_without_bidiformatter"
+                  android:layout_width="match_parent"
+                  android:layout_height="wrap_content"
+                  android:textSize="24dip"
+                 />
+
+    </LinearLayout>
+
+    <LinearLayout android:orientation="horizontal"
+                  android:layout_width="match_parent"
+                  android:layout_height="wrap_content">
+
+        <TextView android:layout_width="wrap_content"
+                  android:layout_height="wrap_content"
+                  android:textSize="24dip"
+                  android:text="@string/with_bidiformatter"
+                />
+
+        <TextView android:id="@+id/textview_with_bidiformatter"
+                  android:layout_width="match_parent"
+                  android:layout_height="wrap_content"
+                  android:textSize="24dip"
+                  />
+
+    </LinearLayout>
+
+</LinearLayout>
diff --git a/samples/Support4Demos/res/layout/content_loading_progressbar.xml b/samples/Support4Demos/res/layout/content_loading_progressbar.xml
new file mode 100644
index 0000000..7e7d9e0
--- /dev/null
+++ b/samples/Support4Demos/res/layout/content_loading_progressbar.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content">
+
+    <android.support.v4.widget.ContentLoadingProgressBar
+        android:id="@+id/progressbar"
+        style="?android:attr/progressBarStyleLarge"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:visibility="gone" />
+
+    <Button android:id="@+id/show"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="@string/show" />
+
+    <Button android:id="@+id/hide"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="@string/hide" />
+
+    <TextView android:id="@+id/show_text"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"/>
+
+    <TextView android:id="@+id/show_text_done"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"/>
+
+    <TextView android:id="@+id/hide_text"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"/>
+
+    <TextView android:id="@+id/hide_text_done"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"/>
+
+</LinearLayout>
diff --git a/samples/Support4Demos/res/layout/drawable_compat.xml b/samples/Support4Demos/res/layout/drawable_compat.xml
new file mode 100644
index 0000000..dbf0413
--- /dev/null
+++ b/samples/Support4Demos/res/layout/drawable_compat.xml
@@ -0,0 +1,51 @@
+<!--
+  ~ Copyright 2015 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="match_parent"
+              android:layout_height="match_parent"
+              android:gravity="center_horizontal"
+              android:orientation="vertical">
+
+    <ImageView
+            android:id="@+id/image"
+            android:layout_width="200dp"
+            android:layout_height="200dp"
+            android:clickable="true"/>
+
+    <RadioGroup
+            android:id="@+id/drawable_compat_options"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content">
+
+        <RadioButton android:id="@+id/drawable_compat_no_tint"
+                     android:layout_width="wrap_content"
+                     android:layout_height="wrap_content"
+                     android:text="@string/drawable_compat_no_tint"/>
+
+        <RadioButton android:id="@+id/drawable_compat_color"
+                     android:layout_width="wrap_content"
+                     android:layout_height="wrap_content"
+                     android:text="@string/drawable_compat_color_tint"/>
+
+        <RadioButton android:id="@+id/drawable_compat_state_list"
+                     android:layout_width="wrap_content"
+                     android:layout_height="wrap_content"
+                     android:text="@string/drawable_compat_color_list_tint"/>
+
+    </RadioGroup>
+
+</LinearLayout>
diff --git a/samples/Support4Demos/res/layout/explore_by_touch_helper.xml b/samples/Support4Demos/res/layout/explore_by_touch_helper.xml
new file mode 100644
index 0000000..0b367a4
--- /dev/null
+++ b/samples/Support4Demos/res/layout/explore_by_touch_helper.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical" >
+
+    <view
+        class="com.example.android.supportv4.widget.ExploreByTouchHelperActivity$CustomView"
+        android:id="@+id/custom_view"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent" />
+
+</LinearLayout>
\ No newline at end of file
diff --git a/samples/Support4Demos/res/layout/file_provider_example.xml b/samples/Support4Demos/res/layout/file_provider_example.xml
new file mode 100644
index 0000000..2e53c3b
--- /dev/null
+++ b/samples/Support4Demos/res/layout/file_provider_example.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical"
+    android:padding="16dp"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <Button
+        android:text="@string/share_file"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:onClick="onShareFileClick" />
+
+</LinearLayout>
diff --git a/samples/Support4Demos/res/layout/fragment_arguments_support.xml b/samples/Support4Demos/res/layout/fragment_arguments_support.xml
new file mode 100644
index 0000000..466583e
--- /dev/null
+++ b/samples/Support4Demos/res/layout/fragment_arguments_support.xml
@@ -0,0 +1,54 @@
+<?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">
+
+<!-- BEGIN_INCLUDE(from_attributes) -->
+        <fragment class="com.example.android.supportv4.app.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" />
+<!-- END_INCLUDE(from_attributes) -->
+
+        <FrameLayout
+                android:id="@+id/created"
+                android:layout_width="0px"
+                android:layout_height="wrap_content"
+                android:layout_weight="1" />
+
+    </LinearLayout>
+
+</LinearLayout>
diff --git a/samples/Support4Demos/res/layout/fragment_context_menu.xml b/samples/Support4Demos/res/layout/fragment_context_menu.xml
new file mode 100644
index 0000000..b5dac8e
--- /dev/null
+++ b/samples/Support4Demos/res/layout/fragment_context_menu.xml
@@ -0,0 +1,38 @@
+<?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/Support4Demos/res/layout/fragment_dialog.xml b/samples/Support4Demos/res/layout/fragment_dialog.xml
new file mode 100644
index 0000000..f9dec59
--- /dev/null
+++ b/samples/Support4Demos/res/layout/fragment_dialog.xml
@@ -0,0 +1,40 @@
+<?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/Support4Demos/res/layout/fragment_dialog_or_activity.xml b/samples/Support4Demos/res/layout/fragment_dialog_or_activity.xml
new file mode 100644
index 0000000..295f017
--- /dev/null
+++ b/samples/Support4Demos/res/layout/fragment_dialog_or_activity.xml
@@ -0,0 +1,64 @@
+<?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/Support4Demos/res/layout/fragment_hide_show_support.xml b/samples/Support4Demos/res/layout/fragment_hide_show_support.xml
new file mode 100644
index 0000000..604cf42
--- /dev/null
+++ b/samples/Support4Demos/res/layout/fragment_hide_show_support.xml
@@ -0,0 +1,57 @@
+<?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.example.android.supportv4.app.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.example.android.supportv4.app.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/Support4Demos/res/layout/fragment_layout_support.xml b/samples/Support4Demos/res/layout/fragment_layout_support.xml
new file mode 100644
index 0000000..5910b78
--- /dev/null
+++ b/samples/Support4Demos/res/layout/fragment_layout_support.xml
@@ -0,0 +1,27 @@
+<?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. -->
+
+<!-- BEGIN_INCLUDE(layout) -->
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent" android:layout_height="match_parent">
+    <fragment class="com.example.android.supportv4.app.FragmentLayoutSupport$TitlesFragment"
+            android:id="@+id/titles"
+            android:layout_width="match_parent" android:layout_height="match_parent" />
+</FrameLayout>
+<!-- END_INCLUDE(layout) -->
diff --git a/samples/Support4Demos/res/layout/fragment_list.xml b/samples/Support4Demos/res/layout/fragment_list.xml
new file mode 100644
index 0000000..c169fec
--- /dev/null
+++ b/samples/Support4Demos/res/layout/fragment_list.xml
@@ -0,0 +1,60 @@
+<!--
+  Copyright (C) 2014 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:padding="@dimen/fragment_list_padding">
+
+    <LinearLayout
+        android:id="@+id/controls"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="horizontal">
+
+        <ImageButton
+            android:id="@+id/skip_previous"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_weight="1"
+            android:src="@drawable/ic_skip_previous_white_24dp"
+            android:contentDescription="@string/skip_previous"/>
+
+        <ImageButton
+            android:id="@+id/play_pause"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_weight="1"
+            android:src="@drawable/ic_play_arrow_white_24dp"
+            android:contentDescription="@string/play_pause"/>
+
+        <ImageButton
+            android:id="@+id/skip_next"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_weight="1"
+            android:src="@drawable/ic_skip_next_white_24dp"
+            android:contentDescription="@string/skip_next"/>
+
+    </LinearLayout>
+
+    <ListView
+        android:id="@+id/list_view"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+    </ListView>
+
+</LinearLayout>
diff --git a/samples/Support4Demos/res/layout/fragment_menu.xml b/samples/Support4Demos/res/layout/fragment_menu.xml
new file mode 100644
index 0000000..7f0278c
--- /dev/null
+++ b/samples/Support4Demos/res/layout/fragment_menu.xml
@@ -0,0 +1,46 @@
+<?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/Support4Demos/res/layout/fragment_pager.xml b/samples/Support4Demos/res/layout/fragment_pager.xml
new file mode 100644
index 0000000..3fe844d
--- /dev/null
+++ b/samples/Support4Demos/res/layout/fragment_pager.xml
@@ -0,0 +1,46 @@
+<?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. -->
+
+<!-- BEGIN_INCLUDE(complete) -->
+<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>
+<!-- END_INCLUDE(complete) -->
diff --git a/samples/Support4Demos/res/layout/fragment_pager_list.xml b/samples/Support4Demos/res/layout/fragment_pager_list.xml
new file mode 100644
index 0000000..189cfff
--- /dev/null
+++ b/samples/Support4Demos/res/layout/fragment_pager_list.xml
@@ -0,0 +1,54 @@
+<?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.
+-->
+
+<!-- BEGIN_INCLUDE(complete) -->
+<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>
+<!-- END_INCLUDE(complete) -->
diff --git a/samples/Support4Demos/res/layout/fragment_retain_instance.xml b/samples/Support4Demos/res/layout/fragment_retain_instance.xml
new file mode 100644
index 0000000..0dc3985
--- /dev/null
+++ b/samples/Support4Demos/res/layout/fragment_retain_instance.xml
@@ -0,0 +1,46 @@
+<?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/Support4Demos/res/layout/fragment_stack.xml b/samples/Support4Demos/res/layout/fragment_stack.xml
new file mode 100644
index 0000000..3825516
--- /dev/null
+++ b/samples/Support4Demos/res/layout/fragment_stack.xml
@@ -0,0 +1,49 @@
+<?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>
+
+    <LinearLayout
+        android:layout_width="wrap_content" android:layout_height="wrap_content"
+        android:layout_weight="0" android:orientation="horizontal">
+        <Button android:id="@+id/home"
+            android:layout_width="wrap_content" android:layout_height="wrap_content"
+            android:text="@string/home">
+            <requestFocus />
+        </Button>
+        <Button android:id="@+id/new_fragment"
+            android:layout_width="wrap_content" android:layout_height="wrap_content"
+            android:text="@string/new_fragment">
+        </Button>
+        <Button android:id="@+id/delete_fragment"
+            android:layout_width="wrap_content" android:layout_height="wrap_content"
+            android:text="@string/delete_fragment">
+        </Button>
+        </LinearLayout>
+
+</LinearLayout>
diff --git a/samples/Support4Demos/res/layout/fragment_tabs.xml b/samples/Support4Demos/res/layout/fragment_tabs.xml
new file mode 100644
index 0000000..e443391
--- /dev/null
+++ b/samples/Support4Demos/res/layout/fragment_tabs.xml
@@ -0,0 +1,54 @@
+<?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.
+*/
+-->
+
+<!-- BEGIN_INCLUDE(complete) -->
+<android.support.v4.app.FragmentTabHost
+    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="@+id/realtabcontent"
+            android:layout_width="match_parent"
+            android:layout_height="0dp"
+            android:layout_weight="1"/>
+
+    </LinearLayout>
+</android.support.v4.app.FragmentTabHost>
+<!-- END_INCLUDE(complete) -->
diff --git a/samples/Support4Demos/res/layout/fragment_tabs_pager.xml b/samples/Support4Demos/res/layout/fragment_tabs_pager.xml
new file mode 100644
index 0000000..c36cf3c
--- /dev/null
+++ b/samples/Support4Demos/res/layout/fragment_tabs_pager.xml
@@ -0,0 +1,52 @@
+<?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/Support4Demos/res/layout/hello_world.xml b/samples/Support4Demos/res/layout/hello_world.xml
new file mode 100644
index 0000000..3d90a33
--- /dev/null
+++ b/samples/Support4Demos/res/layout/hello_world.xml
@@ -0,0 +1,26 @@
+<?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/Support4Demos/res/layout/labeled_text_edit.xml b/samples/Support4Demos/res/layout/labeled_text_edit.xml
new file mode 100644
index 0000000..27568af
--- /dev/null
+++ b/samples/Support4Demos/res/layout/labeled_text_edit.xml
@@ -0,0 +1,38 @@
+<?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/Support4Demos/res/layout/list_item_icon_text.xml b/samples/Support4Demos/res/layout/list_item_icon_text.xml
new file mode 100644
index 0000000..c3825b7
--- /dev/null
+++ b/samples/Support4Demos/res/layout/list_item_icon_text.xml
@@ -0,0 +1,32 @@
+<?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/Support4Demos/res/layout/local_service_broadcaster.xml b/samples/Support4Demos/res/layout/local_service_broadcaster.xml
new file mode 100644
index 0000000..f01120d
--- /dev/null
+++ b/samples/Support4Demos/res/layout/local_service_broadcaster.xml
@@ -0,0 +1,46 @@
+<?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.
+-->
+
+<!-- Demonstrates starting and stopping a local service.
+     See corresponding Java code com.android.sdk.app.LocalSerice.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:text="@string/local_service_broadcaster_msg"/>
+
+    <Button android:id="@+id/start"
+        android:layout_width="wrap_content" android:layout_height="wrap_content"
+        android:text="@string/start_service">
+        <requestFocus />
+    </Button>
+
+    <Button android:id="@+id/stop"
+        android:layout_width="wrap_content" android:layout_height="wrap_content"
+        android:text="@string/stop_service">
+    </Button>
+
+    <TextView android:id="@+id/callback"
+        android:layout_width="match_parent" android:layout_height="wrap_content"
+        android:layout_weight="0"
+        android:gravity="center_horizontal" android:paddingTop="4dip"/>
+
+</LinearLayout>
diff --git a/samples/Support4Demos/res/layout/media_controller.xml b/samples/Support4Demos/res/layout/media_controller.xml
new file mode 100644
index 0000000..b5e58b1
--- /dev/null
+++ b/samples/Support4Demos/res/layout/media_controller.xml
@@ -0,0 +1,76 @@
+<?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:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:background="#CC000000"
+    android:orientation="vertical"
+    android:layoutDirection="ltr">
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:gravity="center"
+        android:paddingTop="4dip"
+        android:orientation="horizontal">
+
+        <ImageButton android:id="@+id/prev" style="@android:style/MediaButton.Previous" />
+        <ImageButton android:id="@+id/rew" style="@android:style/MediaButton.Rew" />
+        <ImageButton android:id="@+id/pause" style="@android:style/MediaButton.Play" />
+        <ImageButton android:id="@+id/ffwd" style="@android:style/MediaButton.Ffwd" />
+        <ImageButton android:id="@+id/next" style="@android:style/MediaButton.Next" />
+
+    </LinearLayout>
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="horizontal">
+
+        <TextView android:id="@+id/time_current"
+            android:textSize="14sp"
+            android:textStyle="bold"
+            android:paddingTop="4dip"
+            android:paddingStart="4dip"
+            android:layout_gravity="center_horizontal"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:paddingEnd="4dip"
+            android:textColor="?android:attr/textColorSecondary" />
+
+        <SeekBar
+            android:id="@+id/mediacontroller_progress"
+            style="?android:attr/progressBarStyleHorizontal"
+            android:layout_width="0dip"
+            android:layout_weight="1"
+            android:layout_height="32dip"
+            android:layout_alignParentStart="true"
+            android:layout_alignParentEnd="true" />
+
+        <TextView android:id="@+id/time"
+            android:textSize="14sp"
+            android:textStyle="bold"
+            android:paddingTop="4dip"
+            android:paddingEnd="4dip"
+            android:layout_gravity="center_horizontal"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:paddingStart="4dip"
+            android:textColor="?android:attr/textColorSecondary" />
+    </LinearLayout>
+
+</LinearLayout>
diff --git a/samples/Support4Demos/res/layout/media_list_item.xml b/samples/Support4Demos/res/layout/media_list_item.xml
new file mode 100644
index 0000000..72c0ccf
--- /dev/null
+++ b/samples/Support4Demos/res/layout/media_list_item.xml
@@ -0,0 +1,55 @@
+<!--
+  Copyright (C) 2014 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="match_parent"
+              android:layout_height="wrap_content"
+              android:minHeight="?android:listPreferredItemHeight"
+              android:orientation="horizontal">
+
+    <ImageView
+        android:id="@+id/play_eq"
+        android:layout_width="wrap_content"
+        android:layout_height="match_parent"
+        android:contentDescription="@string/play_item"
+        android:src="@drawable/ic_play_arrow_white_24dp"/>
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:minHeight="?android:attr/listPreferredItemHeight"
+        android:mode="twoLine"
+        android:padding="@dimen/list_item_padding"
+        android:orientation="vertical">
+
+        <TextView
+            android:id="@+id/title"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginStart="@dimen/margin_text_view"
+            android:layout_marginTop="@dimen/margin_text_view"
+            android:textAppearance="?android:attr/textAppearanceMedium"/>
+
+        <TextView
+            android:id="@+id/description"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginStart="@dimen/margin_text_view"
+            android:layout_marginTop="@dimen/margin_text_view"
+            android:textAppearance="?android:attr/textAppearanceSmall"/>
+
+    </LinearLayout>
+
+</LinearLayout>
diff --git a/samples/Support4Demos/res/layout/nested_scroll.xml b/samples/Support4Demos/res/layout/nested_scroll.xml
new file mode 100644
index 0000000..7793535
--- /dev/null
+++ b/samples/Support4Demos/res/layout/nested_scroll.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<!--
+    A NestedScrollView behaves like a ScrollView, but it can be placed into
+    other nested scrolling containers or have other nested scrolling containers
+    placed into it.
+-->
+<android.support.v4.widget.NestedScrollView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:padding="16dp">
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="vertical">
+        <TextView
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:textAppearance="?android:attr/textAppearance"
+            android:text="@string/nested_scroll_long_text" />
+        <android.support.v4.widget.NestedScrollView
+            android:layout_width="match_parent"
+            android:layout_height="200dp"
+            android:padding="16dp">
+            <TextView
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:textAppearance="?android:attr/textAppearance"
+                android:text="@string/nested_scroll_long_text" />
+        </android.support.v4.widget.NestedScrollView>
+        <TextView
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:textAppearance="?android:attr/textAppearance"
+            android:text="@string/nested_scroll_long_text" />
+    </LinearLayout>
+</android.support.v4.widget.NestedScrollView>
\ No newline at end of file
diff --git a/samples/Support4Demos/res/layout/receive_result.xml b/samples/Support4Demos/res/layout/receive_result.xml
new file mode 100644
index 0000000..dbaa29b
--- /dev/null
+++ b/samples/Support4Demos/res/layout/receive_result.xml
@@ -0,0 +1,61 @@
+<?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>
+
+    <Button android:id="@+id/get_intentsender"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_weight="0"
+            android:text="@string/receive_result_intentsender">
+    </Button>
+
+</LinearLayout>
+
diff --git a/samples/Support4Demos/res/layout/send_result.xml b/samples/Support4Demos/res/layout/send_result.xml
new file mode 100644
index 0000000..bdd927c
--- /dev/null
+++ b/samples/Support4Demos/res/layout/send_result.xml
@@ -0,0 +1,45 @@
+<?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/Support4Demos/res/layout/sharing_receiver_support.xml b/samples/Support4Demos/res/layout/sharing_receiver_support.xml
new file mode 100644
index 0000000..a7b4c38
--- /dev/null
+++ b/samples/Support4Demos/res/layout/sharing_receiver_support.xml
@@ -0,0 +1,31 @@
+<?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:padding="16dp"
+              android:layout_width="match_parent"
+              android:layout_height="match_parent">
+    <TextView android:id="@+id/app_info"
+              android:layout_width="match_parent"
+              android:layout_height="wrap_content"
+              android:gravity="center_vertical"/>
+    <ScrollView android:layout_width="match_parent"
+                android:layout_height="match_parent">
+        <TextView android:id="@+id/text"
+                  android:layout_width="match_parent"
+                  android:layout_height="wrap_content" />
+    </ScrollView>
+</LinearLayout>
diff --git a/samples/Support4Demos/res/layout/sharing_support.xml b/samples/Support4Demos/res/layout/sharing_support.xml
new file mode 100644
index 0000000..8b88dca
--- /dev/null
+++ b/samples/Support4Demos/res/layout/sharing_support.xml
@@ -0,0 +1,36 @@
+<?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:padding="16dp"
+              android:layout_width="match_parent"
+              android:layout_height="match_parent">
+    <Button android:id="@+id/share_text"
+            android:text="@string/share_text"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:onClick="onShareTextClick" />
+    <Button android:id="@+id/share_file"
+            android:text="@string/share_file"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:onClick="onShareFileClick" />
+    <Button android:id="@+id/share_multiple_file"
+            android:text="@string/share_multiple_file"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:onClick="onShareMultipleFileClick" />
+</LinearLayout>
diff --git a/samples/Support4Demos/res/layout/simple_list_item_checkable_1.xml b/samples/Support4Demos/res/layout/simple_list_item_checkable_1.xml
new file mode 100644
index 0000000..84017a6
--- /dev/null
+++ b/samples/Support4Demos/res/layout/simple_list_item_checkable_1.xml
@@ -0,0 +1,29 @@
+<?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.example.android.supportv4.view.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.example.android.supportv4.view.CheckableFrameLayout>
diff --git a/samples/Support4Demos/res/layout/sliding_pane_layout.xml b/samples/Support4Demos/res/layout/sliding_pane_layout.xml
new file mode 100644
index 0000000..ea0ff96
--- /dev/null
+++ b/samples/Support4Demos/res/layout/sliding_pane_layout.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<!--
+    A SlidingPaneLayout is indended to be used as the top-level content view
+    using match_parent for both width and height to consume the full space available.
+-->
+<android.support.v4.widget.SlidingPaneLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/sliding_pane_layout"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+    <!-- The first child view becomes the left pane. When the combined
+         desired width (expressed using android:layout_width) would
+         not fit on-screen at once, the right pane is permitted to
+         overlap the left. -->
+    <ListView android:id="@+id/left_pane"
+              android:layout_width="280dp"
+              android:layout_height="match_parent"
+              android:layout_gravity="left"/>
+    <!-- The second child becomes the right (content) pane. In this
+         example, android:layout_weight is used to express that this
+         pane should grow to consume leftover available space when the
+         window is wide enough. This allows the content pane to
+         responsively grow in width on larger screens while still
+         requiring at least the minimum width expressed by
+         android:layout_width. -->
+    <ScrollView
+        android:layout_width="300dp"
+        android:layout_height="match_parent"
+        android:layout_weight="1"
+        android:paddingLeft="16dp"
+        android:paddingRight="16dp"
+        android:scrollbarStyle="outsideOverlay"
+        android:background="#ff333333">
+        <TextView android:id="@+id/content_text"
+                  android:layout_width="match_parent"
+                  android:layout_height="match_parent"
+                  android:text="@string/sliding_pane_layout_summary"
+                  android:textAppearance="?android:attr/textAppearanceMedium"/>
+    </ScrollView>
+</android.support.v4.widget.SlidingPaneLayout>
+
diff --git a/samples/Support4Demos/res/layout/swipe_refresh_widget_listview.xml b/samples/Support4Demos/res/layout/swipe_refresh_widget_listview.xml
new file mode 100644
index 0000000..af27b23
--- /dev/null
+++ b/samples/Support4Demos/res/layout/swipe_refresh_widget_listview.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/swipe_refresh_widget"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <!-- some full screen pullable view that will be the offsetable content -->
+    <ListView
+        android:id="@+id/content"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent" />
+
+</android.support.v4.widget.SwipeRefreshLayout>
\ No newline at end of file
diff --git a/samples/Support4Demos/res/layout/swipe_refresh_widget_nestedscrolling.xml b/samples/Support4Demos/res/layout/swipe_refresh_widget_nestedscrolling.xml
new file mode 100644
index 0000000..5e18dff
--- /dev/null
+++ b/samples/Support4Demos/res/layout/swipe_refresh_widget_nestedscrolling.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2016 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.
+-->
+
+<android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/swipe_refresh_widget"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <android.support.v4.widget.NestedScrollView
+        android:id="@+id/content"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:fillViewport="true">
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:background="@drawable/gradient">
+
+            <TextView
+                android:layout_width="match_parent"
+                android:layout_height="2000dp"
+                android:text="@string/hello_world"
+                android:gravity="center"/>
+
+        </LinearLayout>
+
+    </android.support.v4.widget.NestedScrollView>
+
+</android.support.v4.widget.SwipeRefreshLayout>
\ No newline at end of file
diff --git a/samples/Support4Demos/res/layout/swipe_refresh_widget_textview.xml b/samples/Support4Demos/res/layout/swipe_refresh_widget_textview.xml
new file mode 100644
index 0000000..183e172
--- /dev/null
+++ b/samples/Support4Demos/res/layout/swipe_refresh_widget_textview.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2016 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.
+-->
+
+<android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/swipe_refresh_widget"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <TextView
+        android:id="@+id/content"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:text="@string/hello_world"
+        android:gravity="center"/>
+
+</android.support.v4.widget.SwipeRefreshLayout>
\ No newline at end of file
diff --git a/samples/Support4Demos/res/layout/videoview.xml b/samples/Support4Demos/res/layout/videoview.xml
new file mode 100644
index 0000000..6d562cb
--- /dev/null
+++ b/samples/Support4Demos/res/layout/videoview.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 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.
+-->
+
+<!-- BEGIN_INCLUDE(complete) -->
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent" android:layout_height="match_parent"
+    >
+    <view class="com.example.android.supportv4.media.TransportControllerActivity$Content"
+        android:id="@+id/content"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_gravity="center"
+        />
+    <FrameLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:fitsSystemWindows="true"
+        android:animateLayoutChanges="true"
+        >
+        <com.example.android.supportv4.media.MediaController
+                android:id="@+id/media_controller"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_gravity="bottom">
+        </com.example.android.supportv4.media.MediaController>
+    </FrameLayout>
+</FrameLayout>
+<!-- END_INCLUDE(complete) -->
diff --git a/v4/tests/res/layout/view_pager_with_title_strip.xml b/samples/Support4Demos/res/layout/view_pager_layout.xml
similarity index 100%
copy from v4/tests/res/layout/view_pager_with_title_strip.xml
copy to samples/Support4Demos/res/layout/view_pager_layout.xml
diff --git a/samples/Support4Demos/res/layout/wakeful_alarm_controller.xml b/samples/Support4Demos/res/layout/wakeful_alarm_controller.xml
new file mode 100644
index 0000000..725331d
--- /dev/null
+++ b/samples/Support4Demos/res/layout/wakeful_alarm_controller.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        android:orientation="vertical" android:padding="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/simple_wakeful_controller_msg"/>
+
+    <Button android:id="@+id/schedule"
+        android:layout_width="wrap_content" android:layout_height="wrap_content"
+        android:text="@string/schedule_wakeful_alarm">
+        <requestFocus />
+    </Button>
+
+</LinearLayout>
+
diff --git a/samples/Support4Demos/res/menu/shortcuts.xml b/samples/Support4Demos/res/menu/shortcuts.xml
new file mode 100644
index 0000000..b5e938a
--- /dev/null
+++ b/samples/Support4Demos/res/menu/shortcuts.xml
@@ -0,0 +1,60 @@
+<?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/Support4Demos/res/menu/swipe_refresh_menu.xml b/samples/Support4Demos/res/menu/swipe_refresh_menu.xml
new file mode 100644
index 0000000..214c637
--- /dev/null
+++ b/samples/Support4Demos/res/menu/swipe_refresh_menu.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<menu xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:id="@+id/force_refresh"
+        android:showAsAction="ifRoom"
+        android:icon="@drawable/refresh"
+        android:title="Refresh" />
+</menu>
\ No newline at end of file
diff --git a/samples/Support4Demos/res/raw/videoviewdemo.mp4 b/samples/Support4Demos/res/raw/videoviewdemo.mp4
new file mode 100644
index 0000000..5772810
--- /dev/null
+++ b/samples/Support4Demos/res/raw/videoviewdemo.mp4
Binary files differ
diff --git a/samples/Support4Demos/res/values-v11/styles.xml b/samples/Support4Demos/res/values-v11/styles.xml
new file mode 100644
index 0000000..c21e6d8
--- /dev/null
+++ b/samples/Support4Demos/res/values-v11/styles.xml
@@ -0,0 +1,29 @@
+<?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>
+    <!-- For API level 11 or later, the Holo theme is available and we prefer that. -->
+    <style name="ThemeHolo" parent="android:Theme.Holo">
+    </style>
+
+    <!-- For API level 11 or later, the Holo theme is available and we prefer that. -->
+    <style name="ThemeHoloLight" parent="android:Theme.Holo.Light">
+    </style>
+
+    <!-- For API level 11 or later, we can use the magical DialogWhenLarge theme. -->
+    <style name="ThemeDialogWhenLarge" parent="android:style/Theme.Holo.DialogWhenLarge">
+    </style>
+</resources>
diff --git a/samples/Support4Demos/res/values/attrs.xml b/samples/Support4Demos/res/values/attrs.xml
new file mode 100644
index 0000000..ce7c910
--- /dev/null
+++ b/samples/Support4Demos/res/values/attrs.xml
@@ -0,0 +1,25 @@
+<?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 -->
+<!-- BEGIN_INCLUDE(fragment_arguments) -->
+    <declare-styleable name="FragmentArguments">
+        <attr name="android:label" />
+    </declare-styleable>
+<!-- END_INCLUDE(fragment_arguments) -->
+</resources>
diff --git a/samples/Support4Demos/res/values/colors.xml b/samples/Support4Demos/res/values/colors.xml
new file mode 100644
index 0000000..ce3d633
--- /dev/null
+++ b/samples/Support4Demos/res/values/colors.xml
@@ -0,0 +1,26 @@
+<?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>
+    <color name="color1">#ff0f9d58</color>
+    <color name="color2">#ffdb4437</color>
+    <color name="color3">#ff4285f4</color>
+    <color name="color4">#fff4b400</color>
+</resources>
diff --git a/samples/Support4Demos/res/values/dimens.xml b/samples/Support4Demos/res/values/dimens.xml
new file mode 100644
index 0000000..e57a8c9
--- /dev/null
+++ b/samples/Support4Demos/res/values/dimens.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright (C) 2014 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="fragment_list_padding">16dp</dimen>
+    <dimen name="list_item_padding">4dp</dimen>
+    <dimen name="margin_text_view">6dp</dimen>
+</resources>
diff --git a/samples/Support4Demos/res/values/strings.xml b/samples/Support4Demos/res/values/strings.xml
new file mode 100644
index 0000000..bd6b31b
--- /dev/null
+++ b/samples/Support4Demos/res/values/strings.xml
@@ -0,0 +1,235 @@
+<?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="activity_sample_code">Support v4 Demos</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 buttons below to get an activity or intent sender result, which will be displayed here:</string>
+    <string name="receive_result_result">Get Activity Result</string>
+    <string name="receive_result_intentsender">Get IntentSender Result</string>
+
+    <!-- Fragment API -->
+
+    <string name="fragment_alert_dialog_support">Fragment/Alert Dialog</string>
+
+    <string name="fragment_arguments_support">Fragment/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">Fragment/Custom Animation</string>
+
+    <string name="fragment_hide_show_support">Fragment/Hide and Show</string>
+
+    <string name="fragment_context_menu_support">Fragment/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">Fragment/Dialog</string>
+    <string name="show">Show</string>
+    <string name="hide">Hide</string>
+
+    <string name="fragment_dialog_or_activity_support">Fragment/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">Fragment/Layout</string>
+
+    <string name="fragment_list_array_support">Fragment/List Array</string>
+
+    <string name="fragment_menu_support">Fragment/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_nesting_tabs_support">Fragment/Nesting Tabs</string>
+
+    <string name="fragment_retain_instance_support">Fragment/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">Fragment/Receive Result</string>
+
+    <string name="fragment_stack_support">Fragment/Stack</string>
+    <string name="home">Go home</string>
+    <string name="new_fragment">Add new</string>
+    <string name="delete_fragment">Pop top</string>
+    
+    <string name="fragment_tabs">Fragment/Tabs</string>
+
+    <string name="fragment_tabs_pager">Fragment/Tabs and Pager</string>
+
+    <string name="fragment_pager_support">Fragment/Pager</string>
+    <string name="first">First</string>
+    <string name="last">Last</string>
+
+    <string name="fragment_state_pager_support">Fragment/State Pager</string>
+
+    <string name="loader_cursor_support">Loader/Cursor</string>
+
+    <string name="loader_retained_support">Loader/Retained</string>
+
+    <string name="loader_custom_support">Loader/Custom</string>
+
+    <string name="loader_throttle_support">Loader/Throttle</string>
+
+    <string name="local_service_broadcaster">Content/Local Service Broadcaster</string>
+
+    <string name="local_service_broadcaster_msg">Demonstrates use of LocalBroadcastManager
+        to communicate from a Service to an Activity.</string>
+    <string name="start_service">Start Service</string>
+    <string name="stop_service">Stop Service</string>
+
+    <string name="simple_wakeful_controller">Content/Simple WakefulReceiver</string>
+
+    <string name="simple_wakeful_controller_msg">Demonstrates use of WakefulBroadcastReceiver
+        to keep the device awake while dispatching a broadcast to a service.</string>
+    <string name="schedule_wakeful_alarm">Wakeup in 30 seconds</string>
+    <string name="simple_wakeful_scheduled">Alarm scheduled</string>
+
+    <!-- Accessibility API -->
+
+    <string name="accessibility_manager_title">Accessibility/Accessibility Manager</string>
+    <string name="accessibility_manager_instructions">
+        1. Enable TalkBack from Settings->Accessibility.
+        \n2. Go back to this activity.
+        \n3. Disable TalkBack from Settings->Accessibility.</string>
+    <string name="accessibility_manager_no_enabled_services">No enabled accessibility services or API level lower than ICS.</string>
+    <string name="accessibility_manager_enabled_service">ENABLED ACCESSIBILITY SERVICES:
+        \n\nService: %1$s\nFeedback: %2$s\nDescription: %3$s\nSettings: %4$s\n</string>
+    <string name="accessibility_manager_accessibility_state">Accessibility enabled: %1$s</string>
+
+    <string name="accessibility_delegate_title">Accessibility/Accessibility Delegate</string>
+    <string name="accessibility_delegate_instructions">
+        1. Enable TalkBack from Settings->Accessibility.
+        \n2. Go back to this activity.
+        \n3. Touch the button below.</string>
+    <string name="accessibility_delegate_button">Button</string>
+    <string name="accessibility_delegate_custom_text_added">Custom text added via an accessibility delegate.</string>
+
+    <string name="accessibility_roledescription_title">Accessibility/Role Description</string>
+    <string name="accessibility_roledescription_instructions">
+        1. Make sure that you have TalkBack 4.5 or later from the Play Store.
+        \n2. Enable TalkBack from Settings->Accessibility.
+        \n3. Go back to this activity.
+        \n4. Touch the two items below.
+        \n5. The first item has a role description, but the second item does not.</string>
+    <string name="accessibility_roledescription_item">Android rocks!</string>
+    <string name="accessibility_roledescription_role">Custom role description</string>
+    <string name="accessibility_roledescription_example">
+        One possible use of role description is to notate heading levels in structured text:</string>
+    <string name="accessibility_roledescription_h1_item">Milky Way Galaxy</string>
+    <string name="accessibility_roledescription_h2_item">Solar System</string>
+    <string name="accessibility_roledescription_h3_item">Planet Earth</string>
+    <string name="accessibility_roledescription_h1_role">heading level 1</string>
+    <string name="accessibility_roledescription_h2_role">heading level 2</string>
+    <string name="accessibility_roledescription_h3_role">heading level 3</string>
+    <string name="accessibility_roledescription_counterexample">
+        Do not set the role description for standard widgets.
+        \nThe following button has a role description, which is incorrect.
+        \nYou should let accessibility services determine feedback for standard widgets.</string>
+    <string name="accessibility_roledescription_button_item">Click me</string>
+    <string name="accessibility_roledescription_button_role">Button with incorrect role description</string>
+
+    <string name="share_text">Share some text</string>
+    <string name="share_file">Share a file</string>
+    <string name="share_multiple_file">Share multiple files</string>
+    <string name="sharing_support_title">App/ShareCompat Demo</string>
+    <string name="sharing_receiver_title">ShareCompat Receiver</string>
+
+    <string name="file_provider_example">Content/FileProvider example</string>
+
+    <!-- Text API -->
+
+    <string name="without_bidiformatter">Without BidiFormatter:</string>
+    <string name="with_bidiformatter">With BidiFormatter:</string>
+    <string name="bidiformatter_support_title">Text/BidiFormatter Demo</string>
+
+    <!-- TransportController -->
+
+    <string name="sample_transport_controller_activity">Media/TransportController</string>
+
+    <string name="view_pager_layout_support">View/View pager</string>
+
+    <string name="sliding_pane_layout_support">Widget/Sliding pane layout</string>
+
+    <string name="sliding_pane_layout_summary">This activity illustrates the use of sliding panes. The content pane may be slid to one side on narrow devices to reveal the left pane used to select content. Sliding panes can be used to fit a UI intended for wider screens in a smaller space. Tapping the Action Bar\'s Up button at the left side of the bar will navigate up in the hierarchy, represented by the left pane. If you rotate the device to landscape mode, on most devices you will see that both panes fit together side by side with no sliding necessary.</string>
+
+    <!-- MediaBrowserCompat Sample -->
+
+    <string name="media_browser_support">Media/MediaBrowserCompat Sample</string>
+    <string name="favorite">Favorite</string>
+    <string name="error_no_metadata">Unable to retrieve metadata.</string>
+    <string name="browse_genres">Genres</string>
+    <string name="browse_genre_subtitle">Songs by genre</string>
+    <string name="browse_musics_by_genre_subtitle">%1$s songs</string>
+    <string name="random_queue_title">Random music</string>
+    <string name="error_cannot_skip">Cannot skip</string>
+    <string name="error_loading_media">Error Loading Media</string>
+    <string name="play_item">Play item</string>
+    <string name="skip_previous">Skip to previous</string>
+    <string name="play_pause">play or pause</string>
+    <string name="skip_next">Skip to next</string>
+    <string name="no_search_results">No search results.</string>
+    <string name="label_pause">Pause</string>
+    <string name="label_play">Play</string>
+    <string name="label_previous">Previous</string>
+    <string name="label_next">Next</string>
+    <string name="error_empty_metadata">Empty metadata!</string>
+
+    <!-- ExploreByTouchHelper -->
+
+    <string name="explore_by_touch_helper_support">Widget/Explore by Touch helper</string>
+    <string name="sample_item_a">Sample item A</string>
+    <string name="sample_item_b">Sample item B</string>
+
+    <!-- ContentLoadingProgressBar -->
+    <string name="content_loading_progress_bar">Widget/Content Loading Progress Bar</string>
+
+    <!--  Swipe refresh -->
+    <string name="swipe_list">Widget/SwipeRefreshLayout ListView</string>
+    <string name="swipe_text">Widget/SwipeRefreshLayout TextView</string>
+    <string name="swipe_nested_sv">Widget/SwipeRefreshLayout NestedScrollView</string>
+
+    <string name="nested_scroll">Widget/Nested Scrolling</string>
+
+    <string name="nested_scroll_long_text">This is some long text. It just keeps going. Look at it. Scroll it. Scroll the nested version of it. This is some long text. It just keeps going. Look at it. Scroll it. Scroll the nested version of it. This is some long text. It just keeps going. Look at it. Scroll it. Scroll the nested version of it. This is some long text. It just keeps going. Look at it. Scroll it. Scroll the nested version of it. This is some long text. It just keeps going. Look at it. Scroll it. Scroll the nested version of it. This is some long text. It just keeps going. Look at it. Scroll it. Scroll the nested version of it. This is some long text. It just keeps going. Look at it. Scroll it. Scroll the nested version of it. This is some long text. It just keeps going. Look at it. Scroll it. Scroll the nested version of it. This is some long text. It just keeps going. Look at it. Scroll it. Scroll the nested version of it. This is some long text. It just keeps going. Look at it. Scroll it. Scroll the nested version of it.</string>
+    <string name="regular">regular</string>
+    <string name="round">round</string>
+
+    <string name="drawable_compat_no_tint">Not tint</string>
+    <string name="drawable_compat_color_tint">Color tint</string>
+    <string name="drawable_compat_color_list_tint">Color state list</string>
+</resources>
diff --git a/samples/Support4Demos/res/values/styles.xml b/samples/Support4Demos/res/values/styles.xml
new file mode 100644
index 0000000..d94f9b0
--- /dev/null
+++ b/samples/Support4Demos/res/values/styles.xml
@@ -0,0 +1,62 @@
+<?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>
+    <!-- This is a theme that will adjust itself depending on the API version.
+         The default definition is the safe one, using a theme that has always
+         been defined.  Look at values-11/styles.xml for a variation that is
+         selected when the holographic theme is available. -->
+    <style name="ThemeHolo" parent="android:Theme">
+    </style>
+
+    <!-- This is a theme that will adjust itself depending on the API version.
+         The default definition is the safe one, using a theme that has always
+         been defined.  Look at values-11/styles.xml for a variation that is
+         selected when the holographic theme is available. -->
+    <style name="ThemeHoloLight" parent="android:Theme.Light">
+    </style>
+
+    <!-- Older platforms don't have Theme.Holo.DialogWhenLarge; we will define
+         our own wrapper theme that uses it only when running on the appropriate
+         platform version.  On older platforms, we always use the generic
+         fullscreen theme, because they don't support some feature that help
+         in correctly laying out an activity as a dialog. -->
+    <style name="ThemeDialogWhenLarge" parent="android:style/Theme">
+    </style>
+
+    <style name="AppTheme" parent="android:Theme.Material">
+        <item name="android:colorPrimary">#ffff5722</item>
+        <item name="android:colorPrimaryDark">#ffbf360c</item>
+        <item name="android:colorAccent">#ffff5722</item>
+    </style>
+
+    <style name="CarTheme" parent="AppTheme">
+        <!-- colorPrimaryDark is currently used in Android Auto for:
+             - App background
+             - Drawer right side ("more" custom actions) background
+             - Notification icon badge tinting
+             - Overview “now playing” icon tinting
+         -->
+        <item name="android:colorPrimaryDark">#ffbf360c</item>
+
+        <!-- colorAccent is used in Android Auto for:
+             - Spinner
+             - progress bar
+             - floating action button background (Play/Pause in media apps)
+         -->
+        <item name="android:colorAccent">#ffff5722</item>
+    </style>
+</resources>
diff --git a/samples/Support4Demos/res/xml/allowed_media_browser_callers.xml b/samples/Support4Demos/res/xml/allowed_media_browser_callers.xml
new file mode 100644
index 0000000..5c326cf
--- /dev/null
+++ b/samples/Support4Demos/res/xml/allowed_media_browser_callers.xml
@@ -0,0 +1,174 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright (C) 2014 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.
+-->
+<allowed_callers>
+    <signing_certificate name="Android Auto" release="false"
+                         package="com.google.android.projection.gearhead">
+        MIIEqDCCA5CgAwIBAgIJANWFuGx90071MA0GCSqGSIb3DQEBBAUAMIGUMQswCQYD
+        VQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4g
+        VmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UE
+        AxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTAe
+        Fw0wODA0MTUyMzM2NTZaFw0zNTA5MDEyMzM2NTZaMIGUMQswCQYDVQQGEwJVUzET
+        MBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4G
+        A1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9p
+        ZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTCCASAwDQYJKoZI
+        hvcNAQEBBQADggENADCCAQgCggEBANbOLggKv+IxTdGNs8/TGFy0PTP6DHThvbbR
+        24kT9ixcOd9W+EaBPWW+wPPKQmsHxajtWjmQwWfna8mZuSeJS48LIgAZlKkpFeVy
+        xW0qMBujb8X8ETrWy550NaFtI6t9+u7hZeTfHwqNvacKhp1RbE6dBRGWynwMVX8X
+        W8N1+UjFaq6GCJukT4qmpN2afb8sCjUigq0GuMwYXrFVee74bQgLHWGJwPmvmLHC
+        69EH6kWr22ijx4OKXlSIx2xT1AsSHee70w5iDBiK4aph27yH3TxkXy9V89TDdexA
+        cKk/cVHYNnDBapcavl7y0RiQ4biu8ymM8Ga/nmzhRKya6G0cGw8CAQOjgfwwgfkw
+        HQYDVR0OBBYEFI0cxb6VTEM8YYY6FbBMvAPyT+CyMIHJBgNVHSMEgcEwgb6AFI0c
+        xb6VTEM8YYY6FbBMvAPyT+CyoYGapIGXMIGUMQswCQYDVQQGEwJVUzETMBEGA1UE
+        CBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMH
+        QW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAG
+        CSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbYIJANWFuGx90071MAwGA1Ud
+        EwQFMAMBAf8wDQYJKoZIhvcNAQEEBQADggEBABnTDPEF+3iSP0wNfdIjIz1AlnrP
+        zgAIHVvXxunW7SBrDhEglQZBbKJEk5kT0mtKoOD1JMrSu1xuTKEBahWRbqHsXcla
+        XjoBADb0kkjVEJu/Lh5hgYZnOjvlba8Ld7HCKePCVePoTJBdI4fvugnL8TsgK05a
+        IskyY0hKI9L8KfqfGTl1lzOv2KoWD0KWwtAWPoGChZxmQ+nBli+gwYMzM1vAkP+a
+        ayLe0a1EQimlOalO762r0GXO0ks+UeXde2Z4e+8S/pf7pITEI/tP+MxJTALw9QUW
+        Ev9lKTk+jkbqxbsh8nfBUapfKqYn0eidpwq2AzVp3juYl7//fKnaPhJD9gs=
+    </signing_certificate>
+    <signing_certificate name="Android Auto" release="false"
+                         package="com.google.android.projection.gearhead">
+        MIIDvTCCAqWgAwIBAgIJAOfkBvDXw5bzMA0GCSqGSIb3DQEBBQUAMHUxCzAJBgNV
+        BAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMRYwFAYDVQQHDA1Nb3VudGFpbiBW
+        aWV3MRQwEgYDVQQKDAtHb29nbGUgSW5jLjEQMA4GA1UECwwHQW5kcm9pZDERMA8G
+        A1UEAwwIZ2VhcmhlYWQwHhcNMTQwNTI3MjMwMjUxWhcNNDExMDEyMjMwMjUxWjB1
+        MQswCQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91
+        bnRhaW4gVmlldzEUMBIGA1UECgwLR29vZ2xlIEluYy4xEDAOBgNVBAsMB0FuZHJv
+        aWQxETAPBgNVBAMMCGdlYXJoZWFkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
+        CgKCAQEAou7wwBKFyznqpRretJ3EVp55/Yr049Ag5wlGvrCnjIP8DrMrU+skfKe1
+        DmwpsLNtnhhiNH+J000Lok3hc8jdWKeKOopzKGDNvL/HvnS70Zyk26gj9jtMMHz9
+        2aZdpmwD67FNmTlG2FERr+TwMD5agaPnsFR2zla6ugUvHGzz65YDxpCZsQ/TowyD
+        LnxgMagvhvS+Oex3yh2FN7pJfwS03KdGdkWPbLqf9Fem09s5jjeZW/O3RgnKoRPI
+        J4QLK70efjAZqJyBGcDZyQMwOs+8HIknraf8+cRZJDzqOx7rttl8M3KGB2EFljTp
+        6/FyxJLnAo6QlXn7GrYalTI0yLU9dQIDAQABo1AwTjAdBgNVHQ4EFgQU9QPJ5xJE
+        DA8MDQMrj0hm2/A2BRkwHwYDVR0jBBgwFoAU9QPJ5xJEDA8MDQMrj0hm2/A2BRkw
+        DAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEADcr5h1FR8IpmN4hSsUA9
+        SnCQVyXa1GQhzpQgRbF+npkgOn2Mebp8bd28VpfgooD2OBNQXCUcZkn7pWj++ut9
+        HhObHVaV5FNg0pdDqLna9QZ9Y4oS+ZrijK70XZ/EjlYUHvhu0pIjZAbD8CmCFlow
+        SR55qCSjM5iS37LZB32SMr1BBiYrNAvncKjYQVK8ctTRzhpNQQPBgXBA98Xl+d1D
+        Py00JWQuF0ssmhKcJuvfdEnFF7Hvaxz/gCQ9nzarQI3CJB8dOXVwF8mcyDRBz4JR
+        +YDpXo6BD+fGt15ov+zmqC8xaT9P1/JgoDXiMhy/6rwgdi9WxPf8mb7TnBC+CksX
+        0A==
+    </signing_certificate>
+    <signing_certificate name="Android Auto" release="true"
+                         package="com.google.android.projection.gearhead">
+        MIIDvTCCAqWgAwIBAgIJAMePnkuTQTAGMA0GCSqGSIb3DQEBBQUAMHUxCzAJBgNV
+        BAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMRYwFAYDVQQHDA1Nb3VudGFpbiBW
+        aWV3MRQwEgYDVQQKDAtHb29nbGUgSW5jLjEQMA4GA1UECwwHQW5kcm9pZDERMA8G
+        A1UEAwwIZ2VhcmhlYWQwHhcNMTQwNTI3MjMwNTM0WhcNNDExMDEyMjMwNTM0WjB1
+        MQswCQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91
+        bnRhaW4gVmlldzEUMBIGA1UECgwLR29vZ2xlIEluYy4xEDAOBgNVBAsMB0FuZHJv
+        aWQxETAPBgNVBAMMCGdlYXJoZWFkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
+        CgKCAQEA050XDkNIsVRMX2wTvVplpCu4OtnyNK2v5B7PS+DggmH2yuZiwpTurdKD
+        Q9R9UzxH9U4lsC+mIxXkiBYKIWNVgMtiTgxkEy7cgWvdYHgNYpFu8IxZKYDyXes+
+        02pfvpu63MIBD/PnvVFipo1oUrbfetj+mroEpjnA71gUS0Ok+H6XWWsmb8xFHQVM
+        oZWEIzsUJ2nhm8EcnPkAPfNZAG++XLPROoRQCaswyYsd42JuYAP3CwZuhDcUbMWm
+        k7rBi9BVQ8gmkrbwqo94A7qStLUp3NyCmlKSWHaZ05SspEPwsfctka0oXG5bhgT6
+        67EMCzQ+YsFN1oJRL7Qq+mMQjFJs3wIDAQABo1AwTjAdBgNVHQ4EFgQUGvBfYNeu
+        6JSJUnJZCiaBGsnXztswHwYDVR0jBBgwFoAUGvBfYNeu6JSJUnJZCiaBGsnXztsw
+        DAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAlGsDY0EPu3NBSH5k6iw/
+        wJh9e3xMwS17ErKGlhyWogxJMzLjAN6g0aCPHxB40IQC+8qAl+RL7VQx6oxttf0m
+        31yUGQPcNYbt2CxBTCAr885oLK5t2TAi5tQzhd6ZEYihWSUWUd/X8BQRouxboss9
+        QbBA/iIx0OpDaxiAcq7Cb67TheXZDxGuQ8fmHYbLx84pEvm3DQOB/LIMkkpQSfEC
+        1f+oP1zB3urPU/dSvED/LCgOdrpxZ5di7SwSyue+Vq/TZQy34tPygEzD2d8hFlh/
+        yfhWkMizOeIXcayVAQdNn5zpBkuay1skGOjQQ5kTbDcDzigO2R2rqn6HCd9l5Z0W
+        IQ==
+    </signing_certificate>
+    <signing_certificate name="Media Browser Service Simulator" release="true"
+                         package="com.google.android.mediasimulator">
+        MIIDvTCCAqWgAwIBAgIJAMePnkuTQTAGMA0GCSqGSIb3DQEBBQUAMHUxCzAJBgNV
+        BAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMRYwFAYDVQQHDA1Nb3VudGFpbiBW
+        aWV3MRQwEgYDVQQKDAtHb29nbGUgSW5jLjEQMA4GA1UECwwHQW5kcm9pZDERMA8G
+        A1UEAwwIZ2VhcmhlYWQwHhcNMTQwNTI3MjMwNTM0WhcNNDExMDEyMjMwNTM0WjB1
+        MQswCQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91
+        bnRhaW4gVmlldzEUMBIGA1UECgwLR29vZ2xlIEluYy4xEDAOBgNVBAsMB0FuZHJv
+        aWQxETAPBgNVBAMMCGdlYXJoZWFkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
+        CgKCAQEA050XDkNIsVRMX2wTvVplpCu4OtnyNK2v5B7PS+DggmH2yuZiwpTurdKD
+        Q9R9UzxH9U4lsC+mIxXkiBYKIWNVgMtiTgxkEy7cgWvdYHgNYpFu8IxZKYDyXes+
+        02pfvpu63MIBD/PnvVFipo1oUrbfetj+mroEpjnA71gUS0Ok+H6XWWsmb8xFHQVM
+        oZWEIzsUJ2nhm8EcnPkAPfNZAG++XLPROoRQCaswyYsd42JuYAP3CwZuhDcUbMWm
+        k7rBi9BVQ8gmkrbwqo94A7qStLUp3NyCmlKSWHaZ05SspEPwsfctka0oXG5bhgT6
+        67EMCzQ+YsFN1oJRL7Qq+mMQjFJs3wIDAQABo1AwTjAdBgNVHQ4EFgQUGvBfYNeu
+        6JSJUnJZCiaBGsnXztswHwYDVR0jBBgwFoAUGvBfYNeu6JSJUnJZCiaBGsnXztsw
+        DAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAlGsDY0EPu3NBSH5k6iw/
+        wJh9e3xMwS17ErKGlhyWogxJMzLjAN6g0aCPHxB40IQC+8qAl+RL7VQx6oxttf0m
+        31yUGQPcNYbt2CxBTCAr885oLK5t2TAi5tQzhd6ZEYihWSUWUd/X8BQRouxboss9
+        QbBA/iIx0OpDaxiAcq7Cb67TheXZDxGuQ8fmHYbLx84pEvm3DQOB/LIMkkpQSfEC
+        1f+oP1zB3urPU/dSvED/LCgOdrpxZ5di7SwSyue+Vq/TZQy34tPygEzD2d8hFlh/
+        yfhWkMizOeIXcayVAQdNn5zpBkuay1skGOjQQ5kTbDcDzigO2R2rqn6HCd9l5Z0W
+        IQ==
+    </signing_certificate>
+    <signing_certificate name="Android Auto Simulator" release="true"
+                         package="com.google.android.autosimulator">
+        MIIEqDCCA5CgAwIBAgIJANWFuGx90071MA0GCSqGSIb3DQEBBAUAMIGUMQswCQYD
+        VQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4g
+        VmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UE
+        AxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTAe
+        Fw0wODA0MTUyMzM2NTZaFw0zNTA5MDEyMzM2NTZaMIGUMQswCQYDVQQGEwJVUzET
+        MBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4G
+        A1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9p
+        ZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTCCASAwDQYJKoZI
+        hvcNAQEBBQADggENADCCAQgCggEBANbOLggKv+IxTdGNs8/TGFy0PTP6DHThvbbR
+        24kT9ixcOd9W+EaBPWW+wPPKQmsHxajtWjmQwWfna8mZuSeJS48LIgAZlKkpFeVy
+        xW0qMBujb8X8ETrWy550NaFtI6t9+u7hZeTfHwqNvacKhp1RbE6dBRGWynwMVX8X
+        W8N1+UjFaq6GCJukT4qmpN2afb8sCjUigq0GuMwYXrFVee74bQgLHWGJwPmvmLHC
+        69EH6kWr22ijx4OKXlSIx2xT1AsSHee70w5iDBiK4aph27yH3TxkXy9V89TDdexA
+        cKk/cVHYNnDBapcavl7y0RiQ4biu8ymM8Ga/nmzhRKya6G0cGw8CAQOjgfwwgfkw
+        HQYDVR0OBBYEFI0cxb6VTEM8YYY6FbBMvAPyT+CyMIHJBgNVHSMEgcEwgb6AFI0c
+        xb6VTEM8YYY6FbBMvAPyT+CyoYGapIGXMIGUMQswCQYDVQQGEwJVUzETMBEGA1UE
+        CBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMH
+        QW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAG
+        CSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbYIJANWFuGx90071MAwGA1Ud
+        EwQFMAMBAf8wDQYJKoZIhvcNAQEEBQADggEBABnTDPEF+3iSP0wNfdIjIz1AlnrP
+        zgAIHVvXxunW7SBrDhEglQZBbKJEk5kT0mtKoOD1JMrSu1xuTKEBahWRbqHsXcla
+        XjoBADb0kkjVEJu/Lh5hgYZnOjvlba8Ld7HCKePCVePoTJBdI4fvugnL8TsgK05a
+        IskyY0hKI9L8KfqfGTl1lzOv2KoWD0KWwtAWPoGChZxmQ+nBli+gwYMzM1vAkP+a
+        ayLe0a1EQimlOalO762r0GXO0ks+UeXde2Z4e+8S/pf7pITEI/tP+MxJTALw9QUW
+        Ev9lKTk+jkbqxbsh8nfBUapfKqYn0eidpwq2AzVp3juYl7//fKnaPhJD9gs=
+    </signing_certificate>
+    <signing_certificate name="Media Browser Simulator" release="true"
+                         package="com.google.android.mediasimulator">
+        MIIEqDCCA5CgAwIBAgIJANWFuGx90071MA0GCSqGSIb3DQEBBAUAMIGUMQswCQYD
+        VQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4g
+        VmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UE
+        AxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTAe
+        Fw0wODA0MTUyMzM2NTZaFw0zNTA5MDEyMzM2NTZaMIGUMQswCQYDVQQGEwJVUzET
+        MBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4G
+        A1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9p
+        ZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTCCASAwDQYJKoZI
+        hvcNAQEBBQADggENADCCAQgCggEBANbOLggKv+IxTdGNs8/TGFy0PTP6DHThvbbR
+        24kT9ixcOd9W+EaBPWW+wPPKQmsHxajtWjmQwWfna8mZuSeJS48LIgAZlKkpFeVy
+        xW0qMBujb8X8ETrWy550NaFtI6t9+u7hZeTfHwqNvacKhp1RbE6dBRGWynwMVX8X
+        W8N1+UjFaq6GCJukT4qmpN2afb8sCjUigq0GuMwYXrFVee74bQgLHWGJwPmvmLHC
+        69EH6kWr22ijx4OKXlSIx2xT1AsSHee70w5iDBiK4aph27yH3TxkXy9V89TDdexA
+        cKk/cVHYNnDBapcavl7y0RiQ4biu8ymM8Ga/nmzhRKya6G0cGw8CAQOjgfwwgfkw
+        HQYDVR0OBBYEFI0cxb6VTEM8YYY6FbBMvAPyT+CyMIHJBgNVHSMEgcEwgb6AFI0c
+        xb6VTEM8YYY6FbBMvAPyT+CyoYGapIGXMIGUMQswCQYDVQQGEwJVUzETMBEGA1UE
+        CBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMH
+        QW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAG
+        CSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbYIJANWFuGx90071MAwGA1Ud
+        EwQFMAMBAf8wDQYJKoZIhvcNAQEEBQADggEBABnTDPEF+3iSP0wNfdIjIz1AlnrP
+        zgAIHVvXxunW7SBrDhEglQZBbKJEk5kT0mtKoOD1JMrSu1xuTKEBahWRbqHsXcla
+        XjoBADb0kkjVEJu/Lh5hgYZnOjvlba8Ld7HCKePCVePoTJBdI4fvugnL8TsgK05a
+        IskyY0hKI9L8KfqfGTl1lzOv2KoWD0KWwtAWPoGChZxmQ+nBli+gwYMzM1vAkP+a
+        ayLe0a1EQimlOalO762r0GXO0ks+UeXde2Z4e+8S/pf7pITEI/tP+MxJTALw9QUW
+        Ev9lKTk+jkbqxbsh8nfBUapfKqYn0eidpwq2AzVp3juYl7//fKnaPhJD9gs=
+    </signing_certificate>
+</allowed_callers>
diff --git a/samples/Support4Demos/res/xml/my_paths.xml b/samples/Support4Demos/res/xml/my_paths.xml
new file mode 100644
index 0000000..1407657
--- /dev/null
+++ b/samples/Support4Demos/res/xml/my_paths.xml
@@ -0,0 +1,14 @@
+<!-- BEGIN_INCLUDE(file_provider_paths_declaration) -->
+<paths xmlns:android="http://schemas.android.com/apk/res/android">
+    <!-- Offer access to files under Context.getFilesDir() + "thumbs/"
+         through alias "my_thumbs" -->
+    <files-path name="my_thumbs" path="thumbs/" />
+
+    <!-- Offer access to files under Environment.getExternalStorageDirectory()
+         through alias "my_external" -->
+    <external-path name="my_external" />
+
+    <!-- Offer access to files under Context.getCacheDir() -->
+    <cache-path name="my_cache" />
+</paths>
+<!-- END_INCLUDE(file_provider_paths_declaration) -->
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/Cheeses.java b/samples/Support4Demos/src/com/example/android/supportv4/Cheeses.java
new file mode 100644
index 0000000..11d9143
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/Cheeses.java
@@ -0,0 +1,154 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv4;
+
+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/Support4Demos/src/com/example/android/supportv4/Shakespeare.java b/samples/Support4Demos/src/com/example/android/supportv4/Shakespeare.java
new file mode 100644
index 0000000..d6d4a3c
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/Shakespeare.java
@@ -0,0 +1,238 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.example.android.supportv4;
+
+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/Support4Demos/src/com/example/android/supportv4/Support4Demos.java b/samples/Support4Demos/src/com/example/android/supportv4/Support4Demos.java
new file mode 100644
index 0000000..af445db
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/Support4Demos.java
@@ -0,0 +1,149 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv4;
+
+import android.app.ListActivity;
+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 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;
+
+public class Support4Demos extends ListActivity {
+
+    @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);
+    }
+
+    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.example.android.supportv4.SUPPORT4_SAMPLE_CODE");
+
+        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, Support4Demos.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/Support4Demos/src/com/example/android/supportv4/_package.html b/samples/Support4Demos/src/com/example/android/supportv4/_package.html
new file mode 100644
index 0000000..4657c4c
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/_package.html
@@ -0,0 +1,24 @@
+<html>
+<head>
+<link rel="stylesheet" type="text/css" href="assets/style.css" />
+<script type="text/javascript" src="http://www.corp.google.com/style/prettify.js"></script>
+<script src="http://www.corp.google.com/eng/techpubs/include/navbar.js" type="text/javascript"></script>
+
+
+
+</head>
+
+<body>
+
+<p>
+Examples of how to use support library APIs.  See:
+
+<ol>
+    <li> <a href="com.example.android.supportv4.app">sdk.app</a> for examples
+        of using the application package support APIs.
+</ol>
+</p>
+
+
+</body>
+</html>
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/accessibility/AccessibilityDelegateSupportActivity.java b/samples/Support4Demos/src/com/example/android/supportv4/accessibility/AccessibilityDelegateSupportActivity.java
new file mode 100644
index 0000000..6fcf855
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/accessibility/AccessibilityDelegateSupportActivity.java
@@ -0,0 +1,97 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv4.accessibility;
+
+import android.app.Activity;
+import android.content.Context;
+import android.os.Bundle;
+import android.support.v4.view.AccessibilityDelegateCompat;
+import android.support.v4.view.ViewCompat;
+import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat;
+import android.util.AttributeSet;
+import android.view.View;
+import android.view.accessibility.AccessibilityEvent;
+
+import com.example.android.supportv4.R;
+
+/**
+ * This class demonstrates how to use the support library to register
+ * a View.AccessibilityDelegate that customizes the accessibility
+ * behavior of a View. Aiming to maximize simplicity this example
+ * tweaks the text reported to accessibility services but using
+ * these APIs a client can inject any accessibility functionality into
+ * a View.
+ */
+public class AccessibilityDelegateSupportActivity extends Activity {
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.accessibility_delegate);
+    }
+
+    /**
+     * This class represents a View that is customized via an AccessibilityDelegate
+     * as opposed to inheritance. An accessibility delegate can be used for adding
+     * accessibility to custom Views, i.e. ones that extend classes from android.view,
+     * in a backwards compatible fashion. Note that overriding a method whose return
+     * type or arguments are not part of a target platform APIs makes your application
+     * not backwards compatible with that platform version.
+     */
+    public static class AccessibilityDelegateSupportView extends View {
+
+        public AccessibilityDelegateSupportView(Context context, AttributeSet attrs) {
+            super(context, attrs);
+            installAccessibilityDelegate();
+        }
+
+        private void installAccessibilityDelegate() {
+            // The accessibility delegate enables customizing accessibility behavior
+            // via composition as opposed as inheritance. The main benefit is that
+            // one can write a backwards compatible application by setting the delegate
+            // only if the API level is high enough i.e. the delegate is part of the APIs.
+            // The easiest way to achieve that is by using the support library which
+            // takes the burden of checking API version and knowing which API version
+            // introduced the delegate off the developer.
+            ViewCompat.setAccessibilityDelegate(this, new AccessibilityDelegateCompat() {
+                @Override
+                public void onPopulateAccessibilityEvent(View host, AccessibilityEvent event) {
+                    super.onPopulateAccessibilityEvent(host, event);
+                    // Note that View.onPopulateAccessibilityEvent was introduced in
+                    // ICS and we would like to tweak a bit the text that is reported to
+                    // accessibility services via the AccessibilityEvent.
+                    event.getText().add(getContext().getString(
+                            R.string.accessibility_delegate_custom_text_added));
+                }
+
+                @Override
+                public void onInitializeAccessibilityNodeInfo(View host,
+                        AccessibilityNodeInfoCompat info) {
+                    super.onInitializeAccessibilityNodeInfo(host, info);
+                    // Note that View.onInitializeAccessibilityNodeInfo was introduced in
+                    // ICS and we would like to tweak a bit the text that is reported to
+                    // accessibility services via the AccessibilityNodeInfo.
+                    info.setText(getContext().getString(
+                            R.string.accessibility_delegate_custom_text_added));
+                }
+            });
+        }
+    }
+}
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/accessibility/AccessibilityManagerSupportActivity.java b/samples/Support4Demos/src/com/example/android/supportv4/accessibility/AccessibilityManagerSupportActivity.java
new file mode 100644
index 0000000..4be078b
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/accessibility/AccessibilityManagerSupportActivity.java
@@ -0,0 +1,133 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv4.accessibility;
+
+import android.accessibilityservice.AccessibilityServiceInfo;
+import android.app.Activity;
+import android.app.Service;
+import android.content.pm.ResolveInfo;
+import android.os.Bundle;
+import android.support.v4.accessibilityservice.AccessibilityServiceInfoCompat;
+import android.support.v4.view.accessibility.AccessibilityManagerCompat;
+import android.support.v4.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat;
+import android.view.accessibility.AccessibilityManager;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.example.android.supportv4.R;
+
+import java.util.List;
+
+/**
+ * <p>
+ * This class demonstrates how to use the support library to register
+ * an AccessibilityManager.AccessibilityStateChangeListener introduced
+ * in ICS to watch changes to the global accessibility state on the
+ * device in a backwards compatible manner.
+ * </p>
+ * <p>
+ * This class also demonstrates how to use the support library to query
+ * information about enabled accessibility services via APIs introduced
+ * in ICS in a backwards compatible manner.
+ * </p>
+ */
+public class AccessibilityManagerSupportActivity extends Activity {
+
+    /** Handle to the accessibility manager service. */
+    private AccessibilityManager mAccessibilityManager;
+
+    /** Handle to the View showing accessibility services summary */
+    private TextView mAccessibilityStateView;
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.accessibility_manager);
+        mAccessibilityManager = (AccessibilityManager) getSystemService(
+                Service.ACCESSIBILITY_SERVICE);
+        mAccessibilityStateView = (TextView) findViewById(R.id.accessibility_state);
+        registerAccessibilityStateChangeListener();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void onResume() {
+        super.onResume();
+        updateAccessibilityStateView();
+    }
+
+    /**
+     * Registers an AccessibilityStateChangeListener that show a Toast
+     * when the global accessibility state on the device changes.
+     */
+    private void registerAccessibilityStateChangeListener() {
+        // The AccessibilityStateChange listener APIs were added in ICS. Therefore to be
+        // backwards compatible we use the APIs in the support library. Note that if the
+        // platform API version is lower and the called API is not available no listener
+        // is added and you will not receive a call of onAccessibilityStateChanged.
+        AccessibilityManagerCompat.addAccessibilityStateChangeListener(mAccessibilityManager,
+                new AccessibilityStateChangeListenerCompat() {
+            @Override
+            public void onAccessibilityStateChanged(boolean enabled) {
+                Toast.makeText(AccessibilityManagerSupportActivity.this,
+                        getString(R.string.accessibility_manager_accessibility_state, enabled),
+                        Toast.LENGTH_SHORT).show();
+            }
+        });
+    }
+
+    /**
+     * Updates the content of a TextView with description of the enabled
+     * accessibility services.
+     */
+    private void updateAccessibilityStateView() {
+        // The API for getting the enabled accessibility services based on feedback
+        // type was added in ICS. Therefore to be backwards compatible we use the
+        // APIs in the support library. Note that if the platform API version is lower
+        // and the called API is not available an empty list of services is returned.
+        List<AccessibilityServiceInfo> enabledServices =
+            AccessibilityManagerCompat.getEnabledAccessibilityServiceList(mAccessibilityManager,
+                    AccessibilityServiceInfo.FEEDBACK_SPOKEN);
+        if (!enabledServices.isEmpty()) {
+            StringBuilder builder = new StringBuilder();
+            final int enabledServiceCount = enabledServices.size();
+            for (int i = 0; i < enabledServiceCount; i++) {
+                AccessibilityServiceInfo service = enabledServices.get(i);
+                // Some new APIs were added in ICS for getting more information about
+                // an accessibility service. Again accessed them via the support library.
+                ResolveInfo resolveInfo = AccessibilityServiceInfoCompat.getResolveInfo(service);
+                String serviceDescription = getString(
+                        R.string.accessibility_manager_enabled_service,
+                        resolveInfo.loadLabel(getPackageManager()),
+                        AccessibilityServiceInfoCompat.feedbackTypeToString(service.feedbackType),
+                        AccessibilityServiceInfoCompat.getDescription(service),
+                        AccessibilityServiceInfoCompat.getSettingsActivityName(service));
+                builder.append(serviceDescription);
+            }
+            mAccessibilityStateView.setText(builder);
+        } else {
+            // Either no services or the platform API version is not high enough.
+            mAccessibilityStateView.setText(getString(
+                    R.string.accessibility_manager_no_enabled_services));
+        }
+    }
+}
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/accessibility/AccessibilityRoleDescriptionSupportActivity.java b/samples/Support4Demos/src/com/example/android/supportv4/accessibility/AccessibilityRoleDescriptionSupportActivity.java
new file mode 100644
index 0000000..5715ea4
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/accessibility/AccessibilityRoleDescriptionSupportActivity.java
@@ -0,0 +1,98 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv4.accessibility;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.support.v4.view.AccessibilityDelegateCompat;
+import android.support.v4.view.ViewCompat;
+import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat;
+import android.view.View;
+import android.widget.Button;
+import android.widget.TextView;
+
+import com.example.android.supportv4.R;
+
+/**
+ * This class demonstrates how to use the support library to set custom
+ * role descriptions on your views. This functionality is supported in the
+ * support-v4 library on devices running KitKat (API 19) or later.
+ */
+public class AccessibilityRoleDescriptionSupportActivity extends Activity {
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.accessibility_roledescription);
+
+        TextView firstTextView = (TextView) findViewById(R.id.text_view_1);
+        String roleDescriptionTextView = getString(R.string.accessibility_roledescription_role);
+        ViewCompat.setAccessibilityDelegate(firstTextView,
+            new RoleDescriptionAccessibilityDelegate(roleDescriptionTextView));
+
+        TextView heading1 = (TextView) findViewById(R.id.text_heading_1);
+        String roleDescriptionHeading1 = getString(R.string.accessibility_roledescription_h1_role);
+        ViewCompat.setAccessibilityDelegate(heading1,
+            new RoleDescriptionAccessibilityDelegate(roleDescriptionHeading1));
+
+        TextView heading2 = (TextView) findViewById(R.id.text_heading_2);
+        String roleDescriptionHeading2 = getString(R.string.accessibility_roledescription_h2_role);
+        ViewCompat.setAccessibilityDelegate(heading2,
+            new RoleDescriptionAccessibilityDelegate(roleDescriptionHeading2));
+
+        TextView heading3 = (TextView) findViewById(R.id.text_heading_3);
+        String roleDescriptionHeading3 = getString(R.string.accessibility_roledescription_h3_role);
+        ViewCompat.setAccessibilityDelegate(heading3,
+            new RoleDescriptionAccessibilityDelegate(roleDescriptionHeading3));
+
+        // This is an example of an <strong>incorrect</strong> use of the role description.
+        // You should not set the role description for standard widgets in your own code.
+        Button button = (Button) findViewById(R.id.button);
+        String roleDescriptionButton =
+            getString(R.string.accessibility_roledescription_button_role);
+        ViewCompat.setAccessibilityDelegate(button,
+            new RoleDescriptionAccessibilityDelegate(roleDescriptionButton));
+    }
+
+    /**
+     * This class subclasses AccessibilityDelegateCompat to modify a view's role description.
+     * You can either override View.onPopulateAccessibilityEvent (API 14+)  or use an accessibility
+     * delegate to set the role description. Using an accessibility delegate provides pre-ICS
+     * compatibility, and helps to organize your accessibility-related code.
+     */
+    private static class RoleDescriptionAccessibilityDelegate extends AccessibilityDelegateCompat {
+        private final String mRoleDescription;
+
+        public RoleDescriptionAccessibilityDelegate(String roleDescription) {
+          mRoleDescription = roleDescription;
+        }
+
+        @Override
+        public void onInitializeAccessibilityNodeInfo(View host,
+                AccessibilityNodeInfoCompat info) {
+            super.onInitializeAccessibilityNodeInfo(host, info);
+            // This call will succeed on all platforms, but it will only set the role description
+            // on devices running KitKat (API 19) or later. On older platforms the method call
+            // will succeed but do nothing.
+            info.setRoleDescription(mRoleDescription);
+        }
+    }
+
+}
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/accessibility/_index.html b/samples/Support4Demos/src/com/example/android/supportv4/accessibility/_index.html
new file mode 100644
index 0000000..1b5b4aa
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/accessibility/_index.html
@@ -0,0 +1,28 @@
+
+<p>This section includes samples showing the use of the accessibility
+features of the static support library.</p>
+
+<h3>Accessibility Manager</h3>
+<dl>
+  <dt><a href="AccessibilityManagerSupportActivity.html">Accessibility Manager</a></dt>
+  <dd>This sample demonstrates how to use the support library to register an
+  AccessibilityManager.AccessibilityStateChangeListener to watch changes to
+  the global accessibility state and AccessibilityManager to query information
+  about enabled accessibility services.</dd>
+</dl>
+
+<h3>Accessibility Delegate</h3>
+<dl>
+  <dt><a href="AccessibilityDelegateSupportActivity.html">AccessibilityDelegate</a></dt>
+  <dd>This sample demonstrates how to use the support library to register a
+  View.AccessibilityDelegate that customizes the accessibility behavior of
+  this View.</dd>
+</dl>
+
+<h3>Role Description</h3>
+<dl>
+  <dt><a href="AccessibilityRoleDescriptionSupportActivity.html">Role Description</a></dt>
+  <dd>This sample demonstrates how to use the support library to set a
+  custom role description on your views. It also gives examples of where
+  role descriptions are appropriate and inappropriate.</dd>
+</dl>
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentAlertDialogSupport.java b/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentAlertDialogSupport.java
new file mode 100644
index 0000000..f35e021
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentAlertDialogSupport.java
@@ -0,0 +1,110 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv4.app;
+
+import com.example.android.supportv4.R;
+
+import android.support.v4.app.DialogFragment;
+import android.support.v4.app.FragmentActivity;
+
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.content.DialogInterface;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.widget.Button;
+import android.widget.TextView;
+
+/**
+ * Demonstrates how to show an AlertDialog that is managed by a Fragment.
+ */
+public class FragmentAlertDialogSupport extends FragmentActivity {
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        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();
+            }
+        });
+    }
+
+//BEGIN_INCLUDE(activity)
+    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!");
+    }
+//END_INCLUDE(activity)
+
+//BEGIN_INCLUDE(dialog)
+    public static class MyAlertDialogFragment extends DialogFragment {
+
+        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();
+        }
+    }
+//END_INCLUDE(dialog)
+}
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentArgumentsSupport.java b/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentArgumentsSupport.java
new file mode 100644
index 0000000..8def8af
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentArgumentsSupport.java
@@ -0,0 +1,113 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv4.app;
+
+import com.example.android.supportv4.R;
+
+import android.support.v4.app.FragmentActivity;
+import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentTransaction;
+
+import android.app.Activity;
+import android.content.res.TypedArray;
+import android.os.Bundle;
+import android.util.AttributeSet;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+/**
+ * Demonstrates a fragment that can be configured through both Bundle arguments
+ * and layout attributes.
+ */
+public class FragmentArgumentsSupport extends FragmentActivity {
+//BEGIN_INCLUDE(create)
+    @Override protected void onCreate(Bundle savedInstanceState) {
+        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();
+        }
+    }
+//END_INCLUDE(create)
+
+//BEGIN_INCLUDE(fragment)
+    public static class MyFragment extends Fragment {
+        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;
+        }
+    }
+//END_INCLUDE(fragment)
+}
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentContextMenuSupport.java b/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentContextMenuSupport.java
new file mode 100644
index 0000000..e52e732
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentContextMenuSupport.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv4.app;
+
+import com.example.android.supportv4.R;
+
+import android.os.Bundle;
+import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentActivity;
+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;
+
+/**
+ * Demonstration of displaying a context menu from a fragment.
+ */
+public class FragmentContextMenuSupport extends FragmentActivity {
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        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 Fragment {
+
+        @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/Support4Demos/src/com/example/android/supportv4/app/FragmentCustomAnimationSupport.java b/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentCustomAnimationSupport.java
new file mode 100644
index 0000000..5893521
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentCustomAnimationSupport.java
@@ -0,0 +1,128 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv4.app;
+
+import com.example.android.supportv4.R;
+
+import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentActivity;
+import android.support.v4.app.FragmentTransaction;
+
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.View.OnClickListener;
+import android.widget.Button;
+import android.widget.TextView;
+
+public class FragmentCustomAnimationSupport extends FragmentActivity {
+    int mStackLevel = 1;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        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);
+    }
+
+//BEGIN_INCLUDE(add_stack)
+    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();
+    }
+//END_INCLUDE(add_stack)
+
+//BEGIN_INCLUDE(fragment)
+    public static class CountingFragment extends Fragment {
+        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;
+        }
+    }
+//END_INCLUDE(fragment)
+}
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentDialogOrActivitySupport.java b/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentDialogOrActivitySupport.java
new file mode 100644
index 0000000..06b2730
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentDialogOrActivitySupport.java
@@ -0,0 +1,81 @@
+/*
+ * 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.example.android.supportv4.app;
+
+import com.example.android.supportv4.R;
+
+import android.os.Bundle;
+import android.support.v4.app.DialogFragment;
+import android.support.v4.app.FragmentActivity;
+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;
+
+public class FragmentDialogOrActivitySupport extends FragmentActivity {
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.fragment_dialog_or_activity);
+
+        if (savedInstanceState == null) {
+            // First-time init; create fragment to embed in activity.
+//BEGIN_INCLUDE(embed)
+            FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
+            DialogFragment newFragment = MyDialogFragment.newInstance();
+            ft.add(R.id.embedded, newFragment);
+            ft.commit();
+//END_INCLUDE(embed)
+        }
+
+        // Watch for button clicks.
+        Button button = (Button)findViewById(R.id.show_dialog);
+        button.setOnClickListener(new OnClickListener() {
+            public void onClick(View v) {
+                showDialog();
+            }
+        });
+    }
+
+//BEGIN_INCLUDE(show_dialog)
+    void showDialog() {
+        // Create the fragment and show it as a dialog.
+        DialogFragment newFragment = MyDialogFragment.newInstance();
+        newFragment.show(getSupportFragmentManager(), "dialog");
+    }
+//END_INCLUDE(show_dialog)
+
+//BEGIN_INCLUDE(dialog)
+    public static class MyDialogFragment extends DialogFragment {
+        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;
+        }
+    }
+//END_INCLUDE(dialog)
+}
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentDialogSupport.java b/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentDialogSupport.java
new file mode 100644
index 0000000..b387bfc
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentDialogSupport.java
@@ -0,0 +1,168 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv4.app;
+
+import com.example.android.supportv4.R;
+
+import android.support.v4.app.DialogFragment;
+import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentActivity;
+import android.support.v4.app.FragmentTransaction;
+
+import android.os.Bundle;
+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;
+
+public class FragmentDialogSupport extends FragmentActivity {
+    int mStackLevel = 0;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        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);
+    }
+
+//BEGIN_INCLUDE(add_dialog)
+    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");
+    }
+//END_INCLUDE(add_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";
+    }
+
+//BEGIN_INCLUDE(dialog)
+    public static class MyDialogFragment extends DialogFragment {
+        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;
+        }
+    }
+//END_INCLUDE(dialog)
+}
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentHideShowSupport.java b/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentHideShowSupport.java
new file mode 100644
index 0000000..3441506
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentHideShowSupport.java
@@ -0,0 +1,120 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv4.app;
+
+import com.example.android.supportv4.R;
+
+import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentActivity;
+import android.support.v4.app.FragmentManager;
+import android.support.v4.app.FragmentTransaction;
+
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.View.OnClickListener;
+import android.widget.Button;
+import android.widget.TextView;
+
+/**
+ * Demonstration of hiding and showing fragments.
+ */
+public class FragmentHideShowSupport extends FragmentActivity {
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        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();
+        Fragment fragment1 = fm.findFragmentById(R.id.fragment1);
+        addShowHideListener(R.id.frag1hide, fragment1);
+        final Button button1 = (Button)findViewById(R.id.frag1hide);
+        button1.setText(fragment1.isHidden() ? "Show" : "Hide");
+        Fragment fragment2 = fm.findFragmentById(R.id.fragment2);
+        addShowHideListener(R.id.frag2hide, fragment2);
+        final Button button2 = (Button)findViewById(R.id.frag2hide);
+        button2.setText(fragment2.isHidden() ? "Show" : "Hide");
+    }
+
+    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 Fragment {
+        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/Support4Demos/src/com/example/android/supportv4/app/FragmentLayoutSupport.java b/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentLayoutSupport.java
new file mode 100644
index 0000000..1230dd3
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentLayoutSupport.java
@@ -0,0 +1,223 @@
+/*
+ * 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.example.android.supportv4.app;
+
+import com.example.android.supportv4.Shakespeare;
+import com.example.android.supportv4.R;
+
+import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentActivity;
+import android.support.v4.app.FragmentTransaction;
+import android.support.v4.app.ListFragment;
+
+import android.content.Intent;
+import android.content.res.Configuration;
+import android.os.Bundle;
+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;
+
+/**
+ * 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 FragmentActivity {
+
+//BEGIN_INCLUDE(main)
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        setContentView(R.layout.fragment_layout_support);
+    }
+//END_INCLUDE(main)
+
+    /**
+     * 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.
+     */
+//BEGIN_INCLUDE(details_activity)
+    public static class DetailsActivity extends FragmentActivity {
+
+        @Override
+        protected void onCreate(Bundle savedInstanceState) {
+            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();
+            }
+        }
+    }
+//END_INCLUDE(details_activity)
+
+    /**
+     * 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.
+     */
+//BEGIN_INCLUDE(titles)
+    public static class TitlesFragment extends ListFragment {
+        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.
+                    getFragmentManager().beginTransaction()
+                            .replace(R.id.details, details)
+                            .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE)
+                            .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);
+            }
+        }
+    }
+//END_INCLUDE(titles)
+
+    /**
+     * This is the secondary fragment, displaying the details of a particular
+     * item.
+     */
+//BEGIN_INCLUDE(details)
+    public static class DetailsFragment extends Fragment {
+        /**
+         * 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;
+        }
+    }
+//END_INCLUDE(details)
+}
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentListArraySupport.java b/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentListArraySupport.java
new file mode 100644
index 0000000..7efae2c
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentListArraySupport.java
@@ -0,0 +1,61 @@
+/*
+ * 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.example.android.supportv4.app;
+
+import com.example.android.supportv4.Shakespeare;
+
+import android.support.v4.app.FragmentActivity;
+import android.support.v4.app.ListFragment;
+
+import android.os.Bundle;
+import android.util.Log;
+import android.view.View;
+import android.widget.ArrayAdapter;
+import android.widget.ListView;
+
+/**
+ * Demonstration of using ListFragment to show a list of items
+ * from a canned array.
+ */
+public class FragmentListArraySupport extends FragmentActivity {
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        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 ListFragment {
+
+        @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/Support4Demos/src/com/example/android/supportv4/app/FragmentMenuFragmentSupport.java b/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentMenuFragmentSupport.java
new file mode 100644
index 0000000..fb65a2b
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentMenuFragmentSupport.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv4.app;
+
+import com.example.android.supportv4.R;
+
+import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentManager;
+import android.support.v4.app.FragmentTransaction;
+
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.View.OnClickListener;
+import android.widget.CheckBox;
+
+/**
+ * Demonstrates how fragments can participate in the options menu.
+ */
+public class FragmentMenuFragmentSupport extends Fragment {
+    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
+    public View onCreateView(LayoutInflater inflater, ViewGroup container,
+            Bundle savedInstanceState) {
+        View v = inflater.inflate(R.layout.fragment_menu, container, false);
+
+        // Make sure the two menu fragments are created.
+        FragmentManager fm = getChildFragmentManager();
+        FragmentTransaction ft = fm.beginTransaction();
+        mFragment1 = fm.findFragmentByTag("f1");
+        if (mFragment1 == null) {
+            mFragment1 = new FragmentMenuSupport.MenuFragment();
+            ft.add(mFragment1, "f1");
+        }
+        mFragment2 = fm.findFragmentByTag("f2");
+        if (mFragment2 == null) {
+            mFragment2 = new FragmentMenuSupport.Menu2Fragment();
+            ft.add(mFragment2, "f2");
+        }
+        ft.commit();
+        
+        // Watch check box clicks.
+        mCheckBox1 = (CheckBox)v.findViewById(R.id.menu1);
+        mCheckBox1.setOnClickListener(mClickListener);
+        mCheckBox2 = (CheckBox)v.findViewById(R.id.menu2);
+        mCheckBox2.setOnClickListener(mClickListener);
+        
+        // Make sure fragments start out with correct visibility.
+        updateFragmentVisibility();
+
+        return v;
+    }
+
+    @Override
+    public void onViewStateRestored(Bundle savedInstanceState) {
+        super.onViewStateRestored(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 = getChildFragmentManager().beginTransaction();
+        if (mCheckBox1.isChecked()) ft.show(mFragment1);
+        else ft.hide(mFragment1);
+        if (mCheckBox2.isChecked()) ft.show(mFragment2);
+        else ft.hide(mFragment2);
+        ft.commit();
+    }
+}
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentMenuSupport.java b/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentMenuSupport.java
new file mode 100644
index 0000000..f2f5ec1
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentMenuSupport.java
@@ -0,0 +1,139 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv4.app;
+
+import com.example.android.supportv4.R;
+
+import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentActivity;
+import android.support.v4.app.FragmentManager;
+import android.support.v4.app.FragmentTransaction;
+import android.support.v4.view.MenuItemCompat;
+
+import android.os.Bundle;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.widget.CheckBox;
+
+/**
+ * Demonstrates how fragments can participate in the options menu.
+ */
+public class FragmentMenuSupport extends FragmentActivity {
+    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) {
+        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 Fragment {
+
+        @Override
+        public void onCreate(Bundle savedInstanceState) {
+            super.onCreate(savedInstanceState);
+            setHasOptionsMenu(true);
+        }
+
+        @Override
+        public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
+            MenuItem item;
+            item = menu.add("Menu 1a");
+            MenuItemCompat.setShowAsAction(item, MenuItemCompat.SHOW_AS_ACTION_IF_ROOM);
+            item = menu.add("Menu 1b");
+            MenuItemCompat.setShowAsAction(item, MenuItemCompat.SHOW_AS_ACTION_IF_ROOM);
+        }
+    }
+
+    /**
+     * Second fragment with a menu.
+     */
+    public static class Menu2Fragment extends Fragment {
+
+        @Override
+        public void onCreate(Bundle savedInstanceState) {
+            super.onCreate(savedInstanceState);
+            setHasOptionsMenu(true);
+        }
+
+        @Override
+        public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
+            MenuItem item;
+            item = menu.add("Menu 2");
+            MenuItemCompat.setShowAsAction(item, MenuItemCompat.SHOW_AS_ACTION_IF_ROOM);
+        }
+    }
+}
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentNestingTabsSupport.java b/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentNestingTabsSupport.java
new file mode 100644
index 0000000..dfdbc21
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentNestingTabsSupport.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.example.android.supportv4.app;
+
+//BEGIN_INCLUDE(complete)
+import com.example.android.supportv4.R;
+
+import android.os.Bundle;
+import android.support.v4.app.FragmentActivity;
+import android.support.v4.app.FragmentTabHost;
+
+public class FragmentNestingTabsSupport extends FragmentActivity {
+    private FragmentTabHost mTabHost;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        mTabHost = new FragmentTabHost(this);
+        setContentView(mTabHost);
+        mTabHost.setup(this, getSupportFragmentManager(), R.id.fragment1);
+
+        mTabHost.addTab(mTabHost.newTabSpec("menus").setIndicator("Menus"),
+                FragmentMenuFragmentSupport.class, null);
+        mTabHost.addTab(mTabHost.newTabSpec("contacts").setIndicator("Contacts"),
+                LoaderCursorSupport.CursorLoaderListFragment.class, null);
+        mTabHost.addTab(mTabHost.newTabSpec("stack").setIndicator("Stack"),
+                FragmentStackFragmentSupport.class, null);
+        mTabHost.addTab(mTabHost.newTabSpec("tabs").setIndicator("Tabs"),
+                FragmentTabsFragmentSupport.class, null);
+    }
+}
+//END_INCLUDE(complete)
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentPagerSupport.java b/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentPagerSupport.java
new file mode 100644
index 0000000..f413744
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentPagerSupport.java
@@ -0,0 +1,141 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv4.app;
+
+import com.example.android.supportv4.Cheeses;
+import com.example.android.supportv4.R;
+
+import android.os.Bundle;
+import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentActivity;
+import android.support.v4.app.FragmentManager;
+import android.support.v4.app.FragmentPagerAdapter;
+import android.support.v4.app.ListFragment;
+import android.support.v4.view.ViewPager;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.View.OnClickListener;
+import android.widget.ArrayAdapter;
+import android.widget.Button;
+import android.widget.ListView;
+import android.widget.TextView;
+
+//BEGIN_INCLUDE(complete)
+public class FragmentPagerSupport extends FragmentActivity {
+    static final int NUM_ITEMS = 10;
+
+    MyAdapter mAdapter;
+
+    ViewPager mPager;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        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 ListFragment {
+        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);
+        }
+    }
+}
+//END_INCLUDE(complete)
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentReceiveResultSupport.java b/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentReceiveResultSupport.java
new file mode 100644
index 0000000..9e2effe
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentReceiveResultSupport.java
@@ -0,0 +1,161 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv4.app;
+
+import com.example.android.supportv4.app.SendResult;
+import com.example.android.supportv4.R;
+
+import android.app.PendingIntent;
+import android.content.IntentSender;
+import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentActivity;
+import android.support.v4.app.FragmentTransaction;
+
+import android.content.Intent;
+import android.os.Bundle;
+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;
+
+public class FragmentReceiveResultSupport extends FragmentActivity {
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        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 Fragment {
+        // Definition of the one requestCode we use for receiving results.
+        static final private int GET_CODE = 0;
+        static final private int GET_INTENT_SENDER_CODE = 1;
+
+        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);
+            }
+        };
+
+        private OnClickListener mIntentSenderListener = new OnClickListener() {
+            public void onClick(View v) {
+                // Start the intent sender whose result we want to retrieve.  The
+                // result will come back with request code GET_INTENT_SENDER_CODE.
+                Intent intent = new Intent(getActivity(), SendResult.class);
+                PendingIntent pendingIntent = PendingIntent.getActivity(getContext(),
+                        GET_INTENT_SENDER_CODE, intent, 0);
+                try {
+                    startIntentSenderForResult(pendingIntent.getIntentSender(),
+                            GET_INTENT_SENDER_CODE, null, 0, 0, 0, null);
+                } catch (IntentSender.SendIntentException e) {
+                    // We will be adding to our text.
+                    Editable text = (Editable)mResults.getText();
+                    text.append(e.getMessage());
+                    text.append("\n");
+                }
+            }
+        };
+
+        @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);
+            Button intentSenderButton = (Button) v.findViewById(R.id.get_intentsender);
+            intentSenderButton.setOnClickListener(mIntentSenderListener);
+
+            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 || requestCode == GET_INTENT_SENDER_CODE) {
+
+                // We will be adding to our text.
+                Editable text = (Editable)mResults.getText();
+
+                text.append((requestCode == GET_CODE) ? "Activity " : "IntentSender ");
+
+                // 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/Support4Demos/src/com/example/android/supportv4/app/FragmentRetainInstanceSupport.java b/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentRetainInstanceSupport.java
new file mode 100644
index 0000000..0ff34dd
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentRetainInstanceSupport.java
@@ -0,0 +1,233 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv4.app;
+
+import com.example.android.supportv4.R;
+
+import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentActivity;
+import android.support.v4.app.FragmentManager;
+
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.View.OnClickListener;
+import android.widget.Button;
+import android.widget.ProgressBar;
+
+/**
+ * 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 FragmentActivity {
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        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 Fragment {
+        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 Fragment {
+        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/Support4Demos/src/com/example/android/supportv4/app/FragmentStackFragmentSupport.java b/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentStackFragmentSupport.java
new file mode 100644
index 0000000..d2eb29a
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentStackFragmentSupport.java
@@ -0,0 +1,101 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv4.app;
+
+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.ViewGroup;
+import android.view.View.OnClickListener;
+import android.widget.Button;
+
+import com.example.android.supportv4.R;
+
+public class FragmentStackFragmentSupport extends Fragment {
+    int mStackLevel = 1;
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        if (savedInstanceState == null) {
+            // Do first time initialization -- add initial fragment.
+            Fragment newFragment = FragmentStackSupport.CountingFragment.newInstance(mStackLevel);
+            FragmentTransaction ft = getChildFragmentManager().beginTransaction();
+            ft.add(R.id.simple_fragment, newFragment).commit();
+        } else {
+            mStackLevel = savedInstanceState.getInt("level");
+        }
+    }
+
+    @Override
+    public View onCreateView(LayoutInflater inflater, ViewGroup container,
+            Bundle savedInstanceState) {
+        View v = inflater.inflate(R.layout.fragment_stack, container, false);
+
+        // Watch for button clicks.
+        Button button = (Button)v.findViewById(R.id.new_fragment);
+        button.setOnClickListener(new OnClickListener() {
+            public void onClick(View v) {
+                addFragmentToStack();
+            }
+        });
+        button = (Button)v.findViewById(R.id.delete_fragment);
+        button.setOnClickListener(new OnClickListener() {
+            public void onClick(View v) {
+                getChildFragmentManager().popBackStack();
+            }
+        });
+        button = (Button)v.findViewById(R.id.home);
+        button.setOnClickListener(new OnClickListener() {
+            public void onClick(View v) {
+                // If there is a back stack, pop it all.
+                FragmentManager fm = getChildFragmentManager();
+                if (fm.getBackStackEntryCount() > 0) {
+                    fm.popBackStack(fm.getBackStackEntryAt(0).getId(),
+                            FragmentManager.POP_BACK_STACK_INCLUSIVE);
+                }
+            }
+        });
+
+        return v;
+    }
+
+    @Override
+    public void onSaveInstanceState(Bundle outState) {
+        super.onSaveInstanceState(outState);
+        outState.putInt("level", mStackLevel);
+    }
+
+    void addFragmentToStack() {
+        mStackLevel++;
+
+        // Instantiate a new fragment.
+        Fragment newFragment = FragmentStackSupport.CountingFragment.newInstance(mStackLevel);
+
+        // Add the fragment to the activity, pushing this transaction
+        // on to the back stack.
+        FragmentTransaction ft = getChildFragmentManager().beginTransaction();
+        ft.replace(R.id.simple_fragment, newFragment);
+        ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
+        ft.addToBackStack(null);
+        ft.commit();
+    }
+}
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentStackSupport.java b/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentStackSupport.java
new file mode 100644
index 0000000..337f2c1
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentStackSupport.java
@@ -0,0 +1,137 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv4.app;
+
+import com.example.android.supportv4.R;
+
+import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentActivity;
+import android.support.v4.app.FragmentManager;
+import android.support.v4.app.FragmentTransaction;
+
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.View.OnClickListener;
+import android.widget.Button;
+import android.widget.TextView;
+
+public class FragmentStackSupport extends FragmentActivity {
+    int mStackLevel = 1;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        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();
+            }
+        });
+        button = (Button)findViewById(R.id.home);
+        button.setOnClickListener(new OnClickListener() {
+            public void onClick(View v) {
+                // If there is a back stack, pop it all.
+                FragmentManager fm = getSupportFragmentManager();
+                if (fm.getBackStackEntryCount() > 0) {
+                    fm.popBackStack(fm.getBackStackEntryAt(0).getId(),
+                            FragmentManager.POP_BACK_STACK_INCLUSIVE);
+                }
+            }
+        });
+
+        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);
+    }
+
+//BEGIN_INCLUDE(add_stack)
+    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();
+    }
+//END_INCLUDE(add_stack)
+
+//BEGIN_INCLUDE(fragment)
+    public static class CountingFragment extends Fragment {
+        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;
+        }
+    }
+//END_INCLUDE(fragment)
+}
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentStatePagerSupport.java b/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentStatePagerSupport.java
new file mode 100644
index 0000000..2939b0e
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentStatePagerSupport.java
@@ -0,0 +1,142 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv4.app;
+
+import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentActivity;
+import android.support.v4.app.FragmentManager;
+import android.support.v4.app.FragmentStatePagerAdapter;
+import android.support.v4.app.ListFragment;
+import android.support.v4.view.ViewPager;
+
+import android.os.Bundle;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.View.OnClickListener;
+import android.widget.ArrayAdapter;
+import android.widget.Button;
+import android.widget.ListView;
+import android.widget.TextView;
+
+import com.example.android.supportv4.Cheeses;
+import com.example.android.supportv4.R;
+
+//BEGIN_INCLUDE(complete)
+public class FragmentStatePagerSupport extends FragmentActivity {
+    static final int NUM_ITEMS = 10;
+
+    MyAdapter mAdapter;
+
+    ViewPager mPager;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        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 ListFragment {
+        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);
+        }
+    }
+}
+//END_INCLUDE(complete)
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentTabs.java b/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentTabs.java
new file mode 100644
index 0000000..7a7e2fc
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentTabs.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.example.android.supportv4.app;
+
+//BEGIN_INCLUDE(complete)
+import com.example.android.supportv4.R;
+
+import android.os.Bundle;
+import android.support.v4.app.FragmentActivity;
+import android.support.v4.app.FragmentTabHost;
+
+/**
+ * This demonstrates how you can implement switching between the tabs of a
+ * TabHost through fragments, using FragmentTabHost.
+ */
+public class FragmentTabs extends FragmentActivity {
+    private FragmentTabHost mTabHost;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        setContentView(R.layout.fragment_tabs);
+        mTabHost = (FragmentTabHost)findViewById(android.R.id.tabhost);
+        mTabHost.setup(this, getSupportFragmentManager(), R.id.realtabcontent);
+
+        mTabHost.addTab(mTabHost.newTabSpec("simple").setIndicator("Simple"),
+                FragmentStackSupport.CountingFragment.class, null);
+        mTabHost.addTab(mTabHost.newTabSpec("contacts").setIndicator("Contacts"),
+                LoaderCursorSupport.CursorLoaderListFragment.class, null);
+        mTabHost.addTab(mTabHost.newTabSpec("custom").setIndicator("Custom"),
+                LoaderCustomSupport.AppListFragment.class, null);
+        mTabHost.addTab(mTabHost.newTabSpec("throttle").setIndicator("Throttle"),
+                LoaderThrottleSupport.ThrottledLoaderListFragment.class, null);
+    }
+}
+//END_INCLUDE(complete)
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentTabsFragmentSupport.java b/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentTabsFragmentSupport.java
new file mode 100644
index 0000000..68f06ef
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentTabsFragmentSupport.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.example.android.supportv4.app;
+
+//BEGIN_INCLUDE(complete)
+import com.example.android.supportv4.R;
+
+import android.os.Bundle;
+import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentTabHost;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+public class FragmentTabsFragmentSupport extends Fragment {
+    private FragmentTabHost mTabHost;
+
+    @Override
+    public View onCreateView(LayoutInflater inflater, ViewGroup container,
+            Bundle savedInstanceState) {
+        mTabHost = new FragmentTabHost(getActivity());
+        mTabHost.setup(getActivity(), getChildFragmentManager(), R.id.fragment1);
+
+        mTabHost.addTab(mTabHost.newTabSpec("simple").setIndicator("Simple"),
+                FragmentStackSupport.CountingFragment.class, null);
+        mTabHost.addTab(mTabHost.newTabSpec("contacts").setIndicator("Contacts"),
+                LoaderCursorSupport.CursorLoaderListFragment.class, null);
+        mTabHost.addTab(mTabHost.newTabSpec("custom").setIndicator("Custom"),
+                LoaderCustomSupport.AppListFragment.class, null);
+        mTabHost.addTab(mTabHost.newTabSpec("throttle").setIndicator("Throttle"),
+                LoaderThrottleSupport.ThrottledLoaderListFragment.class, null);
+
+        return mTabHost;
+    }
+
+    @Override
+    public void onDestroyView() {
+        super.onDestroyView();
+        mTabHost = null;
+    }
+}
+//END_INCLUDE(complete)
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentTabsPager.java b/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentTabsPager.java
new file mode 100644
index 0000000..cf734d7
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentTabsPager.java
@@ -0,0 +1,180 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.example.android.supportv4.app;
+
+import com.example.android.supportv4.R;
+
+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 java.util.ArrayList;
+
+/**
+ * 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 FragmentActivity {
+    TabHost mTabHost;
+    ViewPager  mViewPager;
+    TabsAdapter mTabsAdapter;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        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/Support4Demos/src/com/example/android/supportv4/app/LoaderCursorSupport.java b/samples/Support4Demos/src/com/example/android/supportv4/app/LoaderCursorSupport.java
new file mode 100644
index 0000000..f2f9b3c
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/app/LoaderCursorSupport.java
@@ -0,0 +1,196 @@
+/*
+ * 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.example.android.supportv4.app;
+
+import android.support.v4.app.FragmentActivity;
+import android.support.v4.app.FragmentManager;
+import android.support.v4.app.ListFragment;
+import android.support.v4.app.LoaderManager;
+import android.support.v4.content.CursorLoader;
+import android.support.v4.content.Loader;
+import android.support.v4.view.MenuItemCompat;
+import android.support.v4.widget.SearchViewCompat;
+import android.support.v4.widget.SearchViewCompat.OnCloseListenerCompat;
+import android.support.v4.widget.SearchViewCompat.OnQueryTextListenerCompat;
+import android.support.v4.widget.SimpleCursorAdapter;
+
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.Bundle;
+import android.provider.BaseColumns;
+import android.provider.Contacts.People;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+import android.view.View;
+import android.widget.ListView;
+
+/**
+ * Demonstration of the use of a CursorLoader to load and display contacts
+ * data in a fragment.
+ */
+@SuppressWarnings("all")
+public class LoaderCursorSupport extends FragmentActivity {
+
+    @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();
+        }
+    }
+
+//BEGIN_INCLUDE(fragment_cursor)
+    public static class CursorLoaderListFragment extends ListFragment
+            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);
+            MenuItemCompat.setShowAsAction(item, MenuItemCompat.SHOW_AS_ACTION_ALWAYS
+                    | MenuItemCompat.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);
+            final 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.
+                        String newFilter = !TextUtils.isEmpty(newText) ? newText : null;
+                        // Don't do anything if the filter hasn't actually changed.
+                        // Prevents restarting the loader when restoring state.
+                        if (mCurFilter == null && newFilter == null) {
+                            return true;
+                        }
+                        if (mCurFilter != null && mCurFilter.equals(newFilter)) {
+                            return true;
+                        }
+                        mCurFilter = newFilter;
+                        getLoaderManager().restartLoader(0, null, CursorLoaderListFragment.this);
+                        return true;
+                    }
+                });
+                SearchViewCompat.setOnCloseListener(searchView,
+                        new OnCloseListenerCompat() {
+                            @Override
+                            public boolean onClose() {
+                                if (!TextUtils.isEmpty(SearchViewCompat.getQuery(searchView))) {
+                                    SearchViewCompat.setQuery(searchView, null, true);
+                                }
+                                return true;
+                            }
+                    
+                });
+                MenuItemCompat.setActionView(item, 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);
+        }
+    }
+//END_INCLUDE(fragment_cursor)
+}
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/app/LoaderCustomSupport.java b/samples/Support4Demos/src/com/example/android/supportv4/app/LoaderCustomSupport.java
new file mode 100644
index 0000000..312aba4
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/app/LoaderCustomSupport.java
@@ -0,0 +1,501 @@
+/*
+ * 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.example.android.supportv4.app;
+
+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.FragmentActivity;
+import android.support.v4.app.FragmentManager;
+import android.support.v4.app.ListFragment;
+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.view.MenuItemCompat;
+import android.support.v4.widget.SearchViewCompat;
+import android.support.v4.widget.SearchViewCompat.OnCloseListenerCompat;
+import android.support.v4.widget.SearchViewCompat.OnQueryTextListenerCompat;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ArrayAdapter;
+import android.widget.ImageView;
+import android.widget.ListView;
+import android.widget.TextView;
+
+import com.example.android.supportv4.R;
+
+import java.io.File;
+import java.text.Collator;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+/**
+ * Demonstration of the implementation of a custom Loader.
+ */
+public class LoaderCustomSupport extends FragmentActivity {
+
+    @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();
+        }
+    }
+
+//BEGIN_INCLUDE(loader)
+    /**
+     * 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.
+        }
+    }
+//END_INCLUDE(loader)
+
+//BEGIN_INCLUDE(fragment)
+    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 ListFragment
+            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);
+            MenuItemCompat.setShowAsAction(item, MenuItemCompat.SHOW_AS_ACTION_IF_ROOM
+                    | MenuItemCompat.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);
+            final 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;
+                    }
+                });
+                SearchViewCompat.setOnCloseListener(searchView,
+                        new OnCloseListenerCompat() {
+                            @Override
+                            public boolean onClose() {
+                                if (!TextUtils.isEmpty(SearchViewCompat.getQuery(searchView))) {
+                                    SearchViewCompat.setQuery(searchView, null, true);
+                                }
+                                return true;
+                            }
+                    
+                });
+                MenuItemCompat.setActionView(item, 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);
+        }
+    }
+//END_INCLUDE(fragment)
+}
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/app/LoaderRetainedSupport.java b/samples/Support4Demos/src/com/example/android/supportv4/app/LoaderRetainedSupport.java
new file mode 100644
index 0000000..8ea47e3
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/app/LoaderRetainedSupport.java
@@ -0,0 +1,187 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv4.app;
+
+import android.support.v4.app.FragmentActivity;
+import android.support.v4.app.FragmentManager;
+import android.support.v4.app.ListFragment;
+import android.support.v4.app.LoaderManager;
+import android.support.v4.content.CursorLoader;
+import android.support.v4.content.Loader;
+import android.support.v4.view.MenuItemCompat;
+import android.support.v4.widget.SearchViewCompat;
+import android.support.v4.widget.SearchViewCompat.OnQueryTextListenerCompat;
+import android.support.v4.widget.SimpleCursorAdapter;
+
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.Bundle;
+import android.provider.BaseColumns;
+import android.provider.Contacts.People;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+import android.view.View;
+import android.widget.ListView;
+
+/**
+ * Demonstration of the use of a CursorLoader to load and display contacts
+ * data in a fragment.
+ */
+@SuppressWarnings("all")
+public class LoaderRetainedSupport extends FragmentActivity {
+
+    @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();
+        }
+    }
+
+//BEGIN_INCLUDE(fragment_cursor)
+    public static class CursorLoaderListFragment extends ListFragment
+            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);
+
+            // In this sample we are going to use a retained fragment.
+            setRetainInstance(true);
+
+            // 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);
+            MenuItemCompat.setShowAsAction(item, MenuItemCompat.SHOW_AS_ACTION_ALWAYS
+                    | MenuItemCompat.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);
+            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.
+                        String newFilter = !TextUtils.isEmpty(newText) ? newText : null;
+                        // Don't do anything if the filter hasn't actually changed.
+                        // Prevents restarting the loader when restoring state.
+                        if (mCurFilter == null && newFilter == null) {
+                            return true;
+                        }
+                        if (mCurFilter != null && mCurFilter.equals(newFilter)) {
+                            return true;
+                        }
+                        mCurFilter = newFilter;
+                        getLoaderManager().restartLoader(0, null, CursorLoaderListFragment.this);
+                        return true;
+                    }
+                });
+                MenuItemCompat.setActionView(item, 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);
+        }
+    }
+//END_INCLUDE(fragment_cursor)
+}
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/app/LoaderThrottleSupport.java b/samples/Support4Demos/src/com/example/android/supportv4/app/LoaderThrottleSupport.java
new file mode 100644
index 0000000..a1fb2c7
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/app/LoaderThrottleSupport.java
@@ -0,0 +1,512 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv4.app;
+
+//BEGIN_INCLUDE(complete)
+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.FragmentActivity;
+import android.support.v4.app.FragmentManager;
+import android.support.v4.app.ListFragment;
+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.view.MenuItemCompat;
+import android.support.v4.widget.SimpleCursorAdapter;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+import android.view.View;
+import android.widget.ListView;
+
+import java.util.HashMap;
+
+/**
+ * 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 FragmentActivity {
+    // 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 ListFragment
+            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");
+            MenuItemCompat.setShowAsAction(populateItem, MenuItemCompat.SHOW_AS_ACTION_IF_ROOM);
+            MenuItem clearItem = menu.add(Menu.NONE, CLEAR_ID, 0, "Clear");
+            MenuItemCompat.setShowAsAction(clearItem, MenuItemCompat.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);
+        }
+    }
+}
+//END_INCLUDE(complete)
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/app/SendResult.java b/samples/Support4Demos/src/com/example/android/supportv4/app/SendResult.java
new file mode 100644
index 0000000..7179505
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/app/SendResult.java
@@ -0,0 +1,81 @@
+/*
+ * 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.example.android.supportv4.app;
+
+// Need the following import to get access to the app resources, since this
+// class is in a sub-package.
+import com.example.android.supportv4.R;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.widget.Button;
+
+
+/**
+ * Example of receiving a result from another activity.
+ */
+public class SendResult extends Activity
+{
+    /**
+     * 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)
+    {
+        // 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/Support4Demos/src/com/example/android/supportv4/app/SharingReceiverSupport.java b/samples/Support4Demos/src/com/example/android/supportv4/app/SharingReceiverSupport.java
new file mode 100644
index 0000000..d1efa2d
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/app/SharingReceiverSupport.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv4.app;
+
+import com.example.android.supportv4.R;
+
+import android.app.Activity;
+import android.graphics.drawable.Drawable;
+import android.net.Uri;
+import android.os.Bundle;
+import android.support.v4.app.ShareCompat;
+import android.util.Log;
+import android.widget.TextView;
+
+import java.io.BufferedReader;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+/**
+ * This example shows a simple way to handle data shared with your app through the
+ * use of the support library's ShareCompat features. It will display shared text
+ * content as well as the application label and icon of the app that shared the content.
+ */
+public class SharingReceiverSupport extends Activity {
+    private static final String TAG = "SharingReceiverSupport";
+    private static final int ICON_SIZE = 32; // dip
+
+    @Override
+    protected void onCreate(Bundle b) {
+        super.onCreate(b);
+        setContentView(R.layout.sharing_receiver_support);
+
+        final float density = getResources().getDisplayMetrics().density;
+        final int iconSize = (int) (ICON_SIZE * density + 0.5f);
+
+        ShareCompat.IntentReader intentReader = ShareCompat.IntentReader.from(this);
+
+        // The following provides attribution for the app that shared the data with us.
+        TextView info = (TextView) findViewById(R.id.app_info);
+        Drawable d = intentReader.getCallingActivityIcon();
+        d.setBounds(0, 0, iconSize, iconSize);
+        info.setCompoundDrawables(d, null, null, null);
+        info.setText(intentReader.getCallingApplicationLabel());
+
+        TextView tv = (TextView) findViewById(R.id.text);
+        StringBuilder txt = new StringBuilder("Received share!\nText was: ");
+
+        txt.append(intentReader.getText());
+        txt.append("\n");
+
+        txt.append("Streams included:\n");
+        final int N = intentReader.getStreamCount();
+        for (int i = 0; i < N; i++) {
+            Uri uri = intentReader.getStream(i);
+            txt.append("Share included stream " + i + ": " + uri + "\n");
+            try {
+                BufferedReader reader = new BufferedReader(new InputStreamReader(
+                        getContentResolver().openInputStream(uri)));
+                try {
+                    txt.append(reader.readLine() + "\n");
+                } catch (IOException e) {
+                    Log.e(TAG, "Reading stream threw exception", e);
+                } finally {
+                    reader.close();
+                }
+            } catch (FileNotFoundException e) {
+                Log.e(TAG, "File not found from share.", e);
+            } catch (IOException e) {
+                Log.d(TAG, "I/O Error", e);
+            }
+        }
+
+        tv.setText(txt.toString());
+    }
+}
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/app/SharingSupport.java b/samples/Support4Demos/src/com/example/android/supportv4/app/SharingSupport.java
new file mode 100644
index 0000000..ec099a8
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/app/SharingSupport.java
@@ -0,0 +1,113 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv4.app;
+
+import com.example.android.supportv4.R;
+import com.example.android.supportv4.content.SharingSupportProvider;
+
+import android.app.Activity;
+import android.net.Uri;
+import android.os.Bundle;
+import android.support.v4.app.ShareCompat;
+import android.support.v4.view.MenuItemCompat;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.View;
+
+import java.io.FileNotFoundException;
+import java.io.FileWriter;
+import java.io.IOException;
+
+/**
+ * This example illustrates the use of the ShareCompat feature of the support library.
+ * ShareCompat offers several pieces of functionality to assist in sharing content between
+ * apps and is especially suited for sharing content to social apps that the user has installed.
+ *
+ * <p>Two other classes are relevant to this code sample: {@link SharingReceiverSupport} is
+ * an activity that has been configured to receive ACTION_SEND and ACTION_SEND_MULTIPLE
+ * sharing intents with a type of text/plain. It provides an example of writing a sharing
+ * target using ShareCompat features. {@link SharingSupportProvider} is a simple
+ * {@link android.content.ContentProvider} that provides access to two text files
+ * created by this app to share as content streams.</p>
+ */
+public class SharingSupport extends Activity {
+    @Override
+    protected void onCreate(Bundle b) {
+        super.onCreate(b);
+        setContentView(R.layout.sharing_support);
+    }
+
+    @Override
+    public boolean onCreateOptionsMenu(Menu menu) {
+        ShareCompat.IntentBuilder b = ShareCompat.IntentBuilder.from(this);
+        b.setType("text/plain").setText("Share from menu");
+        MenuItem item = menu.add("Share");
+        ShareCompat.configureMenuItem(item, b);
+        MenuItemCompat.setShowAsAction(item, MenuItemCompat.SHOW_AS_ACTION_IF_ROOM);
+        return true;
+    }
+
+    public void onShareTextClick(View v) {
+        ShareCompat.IntentBuilder.from(this)
+                .setType("text/plain")
+                .setText("I'm sharing!")
+                .startChooser();
+    }
+
+    public void onShareFileClick(View v) {
+        try {
+            // This file will be accessed by the target of the share through
+            // the ContentProvider SharingSupportProvider.
+            FileWriter fw = new FileWriter(getFilesDir() + "/foo.txt");
+            fw.write("This is a file share");
+            fw.close();
+
+            ShareCompat.IntentBuilder.from(this)
+                    .setType("text/plain")
+                    .setStream(Uri.parse(SharingSupportProvider.CONTENT_URI + "/foo.txt"))
+                    .startChooser();
+        } catch (FileNotFoundException e) {
+            e.printStackTrace();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    public void onShareMultipleFileClick(View v) {
+        try {
+            // These files will be accessed by the target of the share through
+            // the ContentProvider SharingSupportProvider.
+            FileWriter fw = new FileWriter(getFilesDir() + "/foo.txt");
+            fw.write("This is a file share");
+            fw.close();
+
+            fw = new FileWriter(getFilesDir() + "/bar.txt");
+            fw.write("This is another file share");
+            fw.close();
+
+            ShareCompat.IntentBuilder.from(this)
+                    .setType("text/plain")
+                    .addStream(Uri.parse(SharingSupportProvider.CONTENT_URI + "/foo.txt"))
+                    .addStream(Uri.parse(SharingSupportProvider.CONTENT_URI + "/bar.txt"))
+                    .startChooser();
+        } catch (FileNotFoundException e) {
+            e.printStackTrace();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+}
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/app/_index.html b/samples/Support4Demos/src/com/example/android/supportv4/app/_index.html
new file mode 100644
index 0000000..d203ffb
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/app/_index.html
@@ -0,0 +1,102 @@
+
+<p>This section includes samples showing the use of the application
+package features of the static support library, in particular fragments
+and loaders.</p>
+<ul>
+  <li><a href="#Fragment">Fragment</a></li>
+  <li><a href="#LoaderManager">LoaderManager</a></li>
+</ul>
+
+
+<h3 id="Fragment">Fragment</h3>
+<dl>
+  <dt><a href="FragmentAlertDialogSupport.html">Fragment Alert Dialog</a></dt>
+  <dd>Demonstrates how to use a DialogFragment to show and manage an
+  AlertDialog.</dd>
+  
+  <dt><a href="FragmentArgumentsSupport.html">Fragment Arguments</a></dt>
+  <dd>Demonstrates how a fragment can be initialized with arguments,
+  supplying them either as an argument Bundle at runtime or XML attributes
+  in a &lt;fragment> tag.</dd>
+  
+  <dt><a href="FragmentContextMenuSupport.html">Fragment Context Menu</a></dt>
+  <dd>Demonstrates how to display and respond to a context menu that is
+  display from a fragment's view hierarchy.</dd>
+  
+  <dt><a href="FragmentCustomAnimationSupport.html">Fragment Custom Animation</a></dt>
+  <dd>Demonstrates the use of a custom animation for pushing and popping fragments
+  on the back stack.</dd>
+
+  <dt><a href="FragmentDialogSupport.html">Fragment Dialog</a></dt>
+  <dd>Demonstrates use of DialogFragment to show various types of dialogs.</dd>
+  
+  <dt><a href="FragmentDialogOrActivitySupport.html">Fragment Dialog or Activity</a></dt>
+  <dd>Demonstrates how the same Fragment implementation can be used to provide the UI
+  for either an Activity or Dialog.</dd>
+  
+  <dt><a href="FragmentHideShowSupport.html">Fragment Hide Show</a></dt>
+  <dd>Demonstrates hiding and showing fragments.</dd>
+  
+  <dt><a href="FragmentLayoutSupport.html">Fragment Layout</a></dt>
+  <dd>Demonstrates use of the &lt;fragment&gt; tag to embed a Fragment in
+  an Activity's content view layout, and making the layout change based on
+  configuration to achieve different UI flows.</dd>
+  
+  <dt><a href="FragmentListArraySupport.html">Fragment List Array</a></dt>
+  <dd>Demonstrates use of ListFragment to show the contents of a simple ArrayAdapter.</dd>
+  
+  <dt><a href="FragmentMenuSupport.html">Fragment Menu</a></dt>
+  <dd>Demonstrates populating custom menu items from a Fragment.</dd>
+  
+  <dt><a href="FragmentPagerSupport.html">Fragment Pager Support</a></dt>
+  <dd>Demonstrates the use of the support class ViewPager with a
+  FragmentPagerAdapter to build a user interface where the user can fling
+  left or right to switch between fragments.</dd>
+
+  <dt><a href="FragmentStatePagerSupport.html">Fragment State Pager Support</a></dt>
+  <dd>Demonstrates the use of the support class ViewPager with a
+  FragmentStatePagerAdapter to build a user interface where the user can fling
+  left or right to switch between fragments.  This versions of the adapter
+  doesn't keep around the fragment instances that ViewPager has destroyed.</dd>
+
+  <dt><a href="FragmentReceiveResultSupport.html">Fragment Receive Result</a></dt>
+  <dd>Demonstrates starting a new Activity from a Fragment, and receiving
+  a result back from it.</dd>
+  
+  <dt><a href="FragmentRetainInstanceSupport.html">Fragment Retain Instance</a></dt>
+  <dd>Demonstrates a Fragment can be used to easily retain active state across
+  an Activity's configuration change.</dd>
+  
+  <dt><a href="FragmentStackSupport.html">Fragment Stack</a></dt>
+  <dd>Demonstrates creating a stack of Fragment instances similar to the
+  traditional stack of activities.</dd>
+  
+  <dt><a href="FragmentTabs.html">Fragment Tabs</a></dt>
+  <dd>Demonstrates the use of fragments to implement switching between
+  tabs in a TabHost.</dd>
+
+  <dt><a href="FragmentTabsPager.html">Fragment Tabs Pager</a></dt>
+  <dd>Demonstrates the use of fragments to implement switching between
+  tabs in a TabHost, using a ViewPager to manager the fragments so that
+  the user can also fling left and right to switch tabs.</dd>
+
+</dl>
+
+<h3 id="LoaderManager">LoaderManager</h3>
+<dl>
+  <dt><a href="LoaderCursorSupport.html">Loader Cursor</a></dt>
+  <dd>Demonstrates use of LoaderManager to perform a query for a Cursor that
+  populates a ListFragment.</dd>
+
+  <dt><a href="LoaderCustomSupport.html">Loader Custom</a></dt>
+  <dd>Demonstrates implementation and use of a custom Loader class.  The
+  custom class here "loads" the currently installed applications.</dd>
+  
+  <dt><a href="LoaderThrottleSupport.html">Loader Throttle</a></dt>
+  <dd>Complete end-to-end demonstration of a simple content provider that
+  populates data in a list through a cursor loader.  The UI allows the list
+  to be populated with a series of items, showing how AsyncTaskLoader's
+  throttling facility can be used to control how much a Loader is refreshed
+  in this case.</dd>
+</dl>
+ 
\ No newline at end of file
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/content/FileProviderExample.java b/samples/Support4Demos/src/com/example/android/supportv4/content/FileProviderExample.java
new file mode 100644
index 0000000..926c632
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/content/FileProviderExample.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv4.content;
+import android.app.Activity;
+import android.content.Intent;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.net.Uri;
+import android.os.Bundle;
+import android.support.v4.content.FileProvider;
+import android.view.View;
+
+import com.example.android.supportv4.R;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+
+/**
+ * Sample that shows how private files can be easily shared.
+ */
+public class FileProviderExample extends Activity {
+    private static final String AUTHORITY = "com.example.android.supportv4.my_files";
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.file_provider_example);
+    }
+
+    public void onShareFileClick(View view) {
+        // Save a thumbnail to file
+        final File thumbsDir = new File(getFilesDir(), "thumbs");
+        thumbsDir.mkdirs();
+        final File file = new File(thumbsDir, "private.png");
+        saveThumbnail(view, file);
+
+        // Now share that private file using FileProvider
+        final Uri uri = FileProvider.getUriForFile(this, AUTHORITY, file);
+        final Intent intent = new Intent(Intent.ACTION_SEND);
+        intent.setType("image/png");
+        intent.putExtra(Intent.EXTRA_STREAM, uri);
+        startActivity(intent);
+    }
+
+    /**
+     * Save thumbnail of given {@link View} to {@link File}.
+     */
+    private void saveThumbnail(View view, File file) {
+        final Bitmap bitmap = Bitmap.createBitmap(
+                view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888);
+        final Canvas canvas = new Canvas(bitmap);
+        view.draw(canvas);
+
+        try {
+            final OutputStream os = new FileOutputStream(file);
+            try {
+                bitmap.compress(Bitmap.CompressFormat.PNG, 100, os);
+            } finally {
+                os.close();
+            }
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+    }
+}
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/content/LocalServiceBroadcaster.java b/samples/Support4Demos/src/com/example/android/supportv4/content/LocalServiceBroadcaster.java
new file mode 100644
index 0000000..62a320c
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/content/LocalServiceBroadcaster.java
@@ -0,0 +1,166 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv4.content;
+
+import com.example.android.supportv4.R;
+
+import android.app.Activity;
+import android.app.Service;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.IBinder;
+import android.os.Message;
+import android.support.v4.app.ServiceCompat;
+import android.support.v4.content.LocalBroadcastManager;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.widget.Button;
+import android.widget.TextView;
+
+/**
+ * Demonstrates the use of a LocalBroadcastManager to easily communicate
+ * data from a service to any other interested code.
+ */
+public class LocalServiceBroadcaster extends Activity {
+    static final String ACTION_STARTED = "com.example.android.supportv4.STARTED";
+    static final String ACTION_UPDATE = "com.example.android.supportv4.UPDATE";
+    static final String ACTION_STOPPED = "com.example.android.supportv4.STOPPED";
+
+    LocalBroadcastManager mLocalBroadcastManager;
+    BroadcastReceiver mReceiver;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        setContentView(R.layout.local_service_broadcaster);
+
+        // This is where we print the data we get back.
+        final TextView callbackData = (TextView)findViewById(R.id.callback);
+
+        // Put in some initial text.
+        callbackData.setText("No broadcast received yet");
+
+        // We use this to send broadcasts within our local process.
+        mLocalBroadcastManager = LocalBroadcastManager.getInstance(this);
+
+        // We are going to watch for interesting local broadcasts.
+        IntentFilter filter = new IntentFilter();
+        filter.addAction(ACTION_STARTED);
+        filter.addAction(ACTION_UPDATE);
+        filter.addAction(ACTION_STOPPED);
+        mReceiver = new BroadcastReceiver() {
+            @Override
+            public void onReceive(Context context, Intent intent) {
+                if (intent.getAction().equals(ACTION_STARTED)) {
+                    callbackData.setText("STARTED");
+                } else if (intent.getAction().equals(ACTION_UPDATE)) {
+                    callbackData.setText("Got update: " + intent.getIntExtra("value", 0));
+                } else if (intent.getAction().equals(ACTION_STOPPED)) {
+                    callbackData.setText("STOPPED");
+                }
+            }
+        };
+        mLocalBroadcastManager.registerReceiver(mReceiver, filter);
+
+        // Watch for button clicks.
+        Button button = (Button)findViewById(R.id.start);
+        button.setOnClickListener(mStartListener);
+        button = (Button)findViewById(R.id.stop);
+        button.setOnClickListener(mStopListener);
+    }
+
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();
+        mLocalBroadcastManager.unregisterReceiver(mReceiver);
+    }
+
+    private OnClickListener mStartListener = new OnClickListener() {
+        public void onClick(View v) {
+            startService(new Intent(LocalServiceBroadcaster.this, LocalService.class));
+        }
+    };
+
+    private OnClickListener mStopListener = new OnClickListener() {
+        public void onClick(View v) {
+            stopService(new Intent(LocalServiceBroadcaster.this, LocalService.class));
+        }
+    };
+
+    public static class LocalService extends Service {
+        LocalBroadcastManager mLocalBroadcastManager;
+        int mCurUpdate;
+
+        static final int MSG_UPDATE = 1;
+
+        Handler mHandler = new Handler() {
+            @Override
+            public void handleMessage(Message msg) {
+                switch (msg.what) {
+                    case MSG_UPDATE: {
+                        mCurUpdate++;
+                        Intent intent = new Intent(ACTION_UPDATE);
+                        intent.putExtra("value", mCurUpdate);
+                        mLocalBroadcastManager.sendBroadcast(intent);
+                        Message nmsg = mHandler.obtainMessage(MSG_UPDATE);
+                        mHandler.sendMessageDelayed(nmsg, 1000);
+                    } break;
+                    default:
+                        super.handleMessage(msg);
+                }
+            }
+        };
+
+        @Override
+        public void onCreate() {
+            super.onCreate();
+            mLocalBroadcastManager = LocalBroadcastManager.getInstance(this);
+        }
+
+        public int onStartCommand(Intent intent, int flags, int startId) {
+            // Tell any local interested parties about the start.
+            mLocalBroadcastManager.sendBroadcast(new Intent(ACTION_STARTED));
+
+            // Prepare to do update reports.
+            mHandler.removeMessages(MSG_UPDATE);
+            Message msg = mHandler.obtainMessage(MSG_UPDATE);
+            mHandler.sendMessageDelayed(msg, 1000);
+            return ServiceCompat.START_STICKY;
+        }
+
+        @Override
+        public void onDestroy() {
+            super.onDestroy();
+
+            // Tell any local interested parties about the stop.
+            mLocalBroadcastManager.sendBroadcast(new Intent(ACTION_STOPPED));
+
+            // Stop doing updates.
+            mHandler.removeMessages(MSG_UPDATE);
+        }
+
+        @Override
+        public IBinder onBind(Intent intent) {
+            return null;
+        }
+    }
+}
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/content/SharingSupportProvider.java b/samples/Support4Demos/src/com/example/android/supportv4/content/SharingSupportProvider.java
new file mode 100644
index 0000000..596fd6c
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/content/SharingSupportProvider.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv4.content;
+
+import android.content.ContentProvider;
+import android.content.ContentValues;
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.ParcelFileDescriptor;
+import android.util.Log;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+
+/**
+ * This simple ContentProvider provides access to the two example files shared
+ * by the ShareCompat example {@link com.example.android.supportv4.app.SharingSupport}.
+ */
+public class SharingSupportProvider extends ContentProvider {
+    public static final Uri CONTENT_URI =
+            Uri.parse("content://com.example.supportv4.content.sharingsupportprovider");
+
+    private static final String TAG = "SharingSupportProvider";
+
+    @Override
+    public boolean onCreate() {
+        return true;
+    }
+
+    @Override
+    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
+            String sortOrder) {
+        return null;
+    }
+
+    @Override
+    public String getType(Uri uri) {
+        if (uri.equals(Uri.withAppendedPath(CONTENT_URI, "foo.txt")) ||
+                uri.equals(Uri.withAppendedPath(CONTENT_URI, "bar.txt"))) {
+            return "text/plain";
+        }
+        return null;
+    }
+
+    @Override
+    public Uri insert(Uri uri, ContentValues values) {
+        return null;
+    }
+
+    @Override
+    public int delete(Uri uri, String selection, String[] selectionArgs) {
+        return 0;
+    }
+
+    @Override
+    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
+        return 0;
+    }
+
+    @Override
+    public ParcelFileDescriptor openFile(Uri uri, String mode) {
+        String path = uri.getPath();
+        if (mode.equals("r") &&
+                (path.equals("/foo.txt") || path.equals("/bar.txt"))) {
+            try {
+                return ParcelFileDescriptor.open(
+                        new File(getContext().getFilesDir() + path),
+                        ParcelFileDescriptor.MODE_READ_ONLY);
+            } catch (FileNotFoundException e) {
+                Log.e(TAG, "Bad file " + uri);
+            }
+        }
+        return null;
+    }
+}
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/content/SimpleWakefulController.java b/samples/Support4Demos/src/com/example/android/supportv4/content/SimpleWakefulController.java
new file mode 100644
index 0000000..bf3b2c0
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/content/SimpleWakefulController.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv4.content;
+
+import com.example.android.supportv4.R;
+
+import android.app.Activity;
+import android.app.AlarmManager;
+import android.app.PendingIntent;
+import android.content.Intent;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.Button;
+import android.widget.Toast;
+
+import java.util.Calendar;
+
+public class SimpleWakefulController extends Activity {
+    Toast mToast;
+
+    @Override
+	protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        setContentView(R.layout.wakeful_alarm_controller);
+
+        // Watch for button clicks.
+        Button button = (Button)findViewById(R.id.schedule);
+        button.setOnClickListener(mScheduleListener);
+    }
+
+    private View.OnClickListener mScheduleListener = new View.OnClickListener() {
+        public void onClick(View v) {
+            // When the alarm goes off, we want to broadcast an Intent to our
+            // BroadcastReceiver.  Here we make an Intent with an explicit class
+            // name to have our own receiver (which has been published in
+            // AndroidManifest.xml) instantiated and called, and then create an
+            // IntentSender to have the intent executed as a broadcast.
+            Intent intent = new Intent(SimpleWakefulController.this, SimpleWakefulReceiver.class);
+            PendingIntent sender = PendingIntent.getBroadcast(SimpleWakefulController.this,
+                    0, intent, 0);
+
+            // We want the alarm to go off 30 seconds from now.
+            Calendar calendar = Calendar.getInstance();
+            calendar.setTimeInMillis(System.currentTimeMillis());
+            calendar.add(Calendar.SECOND, 30);
+
+            // Schedule the alarm!
+            AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);
+            am.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), sender);
+
+            // Tell the user about what we did.
+            if (mToast != null) {
+                mToast.cancel();
+            }
+            mToast = Toast.makeText(SimpleWakefulController.this, R.string.simple_wakeful_scheduled,
+                    Toast.LENGTH_LONG);
+            mToast.show();
+        }
+    };
+}
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/content/SimpleWakefulReceiver.java b/samples/Support4Demos/src/com/example/android/supportv4/content/SimpleWakefulReceiver.java
new file mode 100644
index 0000000..d70f432
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/content/SimpleWakefulReceiver.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv4.content;
+
+//BEGIN_INCLUDE(complete)
+import android.content.Context;
+import android.content.Intent;
+import android.os.SystemClock;
+import android.support.v4.content.WakefulBroadcastReceiver;
+import android.util.Log;
+
+public class SimpleWakefulReceiver extends WakefulBroadcastReceiver {
+    @Override
+    public void onReceive(Context context, Intent intent) {
+        // This is the Intent to deliver to our service.
+        Intent service = new Intent(context, SimpleWakefulService.class);
+
+        // Start the service, keeping the device awake while it is launching.
+        Log.i("SimpleWakefulReceiver", "Starting service @ " + SystemClock.elapsedRealtime());
+        startWakefulService(context, service);
+    }
+}
+//END_INCLUDE(complete)
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/content/SimpleWakefulService.java b/samples/Support4Demos/src/com/example/android/supportv4/content/SimpleWakefulService.java
new file mode 100644
index 0000000..b05218f
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/content/SimpleWakefulService.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv4.content;
+
+//BEGIN_INCLUDE(complete)
+import android.app.IntentService;
+import android.content.Intent;
+import android.os.SystemClock;
+import android.util.Log;
+
+public class SimpleWakefulService extends IntentService {
+    public SimpleWakefulService() {
+        super("SimpleWakefulService");
+    }
+
+    @Override
+    protected void onHandleIntent(Intent intent) {
+        // At this point SimpleWakefulReceiver is still holding a wake lock
+        // for us.  We can do whatever we need to here and then tell it that
+        // it can release the wakelock.  This sample just does some slow work,
+        // but more complicated implementations could take their own wake
+        // lock here before releasing the receiver's.
+        //
+        // Note that when using this approach you should be aware that if your
+        // service gets killed and restarted while in the middle of such work
+        // (so the Intent gets re-delivered to perform the work again), it will
+        // at that point no longer be holding a wake lock since we are depending
+        // on SimpleWakefulReceiver to that for us.  If this is a concern, you can
+        // acquire a separate wake lock here.
+        for (int i=0; i<5; i++) {
+            Log.i("SimpleWakefulReceiver", "Running service " + (i+1)
+                    + "/5 @ " + SystemClock.elapsedRealtime());
+            try {
+                Thread.sleep(5000);
+            } catch (InterruptedException e) {
+            }
+        }
+        Log.i("SimpleWakefulReceiver", "Completed service @ " + SystemClock.elapsedRealtime());
+        SimpleWakefulReceiver.completeWakefulIntent(intent);
+    }
+}
+//END_INCLUDE(complete)
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/graphics/DrawableCompatActivity.java b/samples/Support4Demos/src/com/example/android/supportv4/graphics/DrawableCompatActivity.java
new file mode 100644
index 0000000..f679067
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/graphics/DrawableCompatActivity.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv4.graphics;
+
+import com.example.android.supportv4.R;
+
+import android.app.Activity;
+import android.graphics.Color;
+import android.graphics.drawable.Drawable;
+import android.os.Bundle;
+import android.support.v4.content.ContextCompat;
+import android.support.v4.graphics.drawable.DrawableCompat;
+import android.widget.ImageView;
+import android.widget.RadioGroup;
+
+/**
+ * Demonstrates use of a {@link DrawableCompat}'s ability to become circular.
+ */
+public class DrawableCompatActivity extends Activity {
+
+    private static final int IMAGE_RES = R.drawable.ic_favorite;
+
+    private ImageView mImageView;
+    private Drawable mDrawable;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.drawable_compat);
+
+        mImageView = (ImageView) findViewById(R.id.image);
+
+        Drawable d = ContextCompat.getDrawable(this, IMAGE_RES);
+        mDrawable = DrawableCompat.wrap(d.mutate());
+
+        mImageView.setImageDrawable(mDrawable);
+
+        RadioGroup rg = (RadioGroup) findViewById(R.id.drawable_compat_options);
+        rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
+            @Override
+            public void onCheckedChanged(RadioGroup radioGroup, int id) {
+                switch (id) {
+                    case R.id.drawable_compat_no_tint:
+                        clearTint();
+                        break;
+                    case R.id.drawable_compat_color:
+                        setColorTint();
+                        break;
+                    case R.id.drawable_compat_state_list:
+                        setColorStateListTint();
+                        break;
+                }
+            }
+        });
+    }
+
+    private void clearTint() {
+        DrawableCompat.setTintList(mDrawable, null);
+    }
+
+    private void setColorTint() {
+        DrawableCompat.setTint(mDrawable, Color.MAGENTA);
+    }
+
+    private void setColorStateListTint() {
+        DrawableCompat.setTintList(mDrawable,
+                ContextCompat.getColorStateList(this, R.color.tint_state_list));
+    }
+
+}
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/graphics/RoundedBitmapDrawableActivity.java b/samples/Support4Demos/src/com/example/android/supportv4/graphics/RoundedBitmapDrawableActivity.java
new file mode 100644
index 0000000..d89d462
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/graphics/RoundedBitmapDrawableActivity.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv4.graphics;
+
+import android.app.Activity;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.os.Bundle;
+import android.support.v4.graphics.drawable.RoundedBitmapDrawable;
+import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory;
+import android.widget.CompoundButton;
+import android.widget.ImageView;
+import android.widget.ToggleButton;
+
+import com.example.android.supportv4.R;
+
+/**
+ * Demonstrates use of a {@link RoundedBitmapDrawable}'s ability to become circular.
+ */
+public class RoundedBitmapDrawableActivity extends Activity {
+
+    private static final int IMAGE_RES = R.drawable.android_robot;
+    private RoundedBitmapDrawable mRoundedBitmapDrawable;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_rounded_bitmap);
+
+        // Create a bitmap and set it circular.
+        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), IMAGE_RES);
+        mRoundedBitmapDrawable = RoundedBitmapDrawableFactory.create(getResources(), bitmap);
+
+        // Get references to the inflated views.
+        ToggleButton toggle = (ToggleButton) findViewById(R.id.toggle_round);
+        ImageView image = (ImageView) findViewById(R.id.image);
+
+        // Set up initial view state and on checked change listener.
+        image.setImageDrawable(mRoundedBitmapDrawable);
+        toggle.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+            @Override
+            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+                mRoundedBitmapDrawable.setCircular(isChecked);
+            }
+        });
+    }
+
+}
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/media/AlbumArtCache.java b/samples/Support4Demos/src/com/example/android/supportv4/media/AlbumArtCache.java
new file mode 100644
index 0000000..630b5d5
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/media/AlbumArtCache.java
@@ -0,0 +1,129 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv4.media;
+
+import android.graphics.Bitmap;
+import android.os.AsyncTask;
+import android.util.Log;
+import android.util.LruCache;
+
+import com.example.android.supportv4.media.utils.BitmapHelper;
+
+import java.io.IOException;
+
+/**
+ * Implements a basic cache of album arts, with async loading support.
+ */
+public final class AlbumArtCache {
+    private static final String TAG = "AlbumArtCache";
+
+    private static final int MAX_ALBUM_ART_CACHE_SIZE = 12*1024*1024;  // 12 MB
+    private static final int MAX_ART_WIDTH = 800;  // pixels
+    private static final int MAX_ART_HEIGHT = 480;  // pixels
+
+    // Resolution reasonable for carrying around as an icon (generally in
+    // MediaDescription.getIconBitmap). This should not be bigger than necessary, because
+    // the MediaDescription object should be lightweight. If you set it too high and try to
+    // serialize the MediaDescription, you may get FAILED BINDER TRANSACTION errors.
+    private static final int MAX_ART_WIDTH_ICON = 128;  // pixels
+    private static final int MAX_ART_HEIGHT_ICON = 128;  // pixels
+
+    private static final int BIG_BITMAP_INDEX = 0;
+    private static final int ICON_BITMAP_INDEX = 1;
+
+    private final LruCache<String, Bitmap[]> mCache;
+
+    private static final AlbumArtCache sInstance = new AlbumArtCache();
+
+    public static AlbumArtCache getInstance() {
+        return sInstance;
+    }
+
+    private AlbumArtCache() {
+        // Holds no more than MAX_ALBUM_ART_CACHE_SIZE bytes, bounded by maxmemory/4 and
+        // Integer.MAX_VALUE:
+        int maxSize = Math.min(MAX_ALBUM_ART_CACHE_SIZE,
+            (int) (Math.min(Integer.MAX_VALUE, Runtime.getRuntime().maxMemory()/4)));
+        mCache = new LruCache<String, Bitmap[]>(maxSize) {
+            @Override
+            protected int sizeOf(String key, Bitmap[] value) {
+                return value[BIG_BITMAP_INDEX].getByteCount()
+                    + value[ICON_BITMAP_INDEX].getByteCount();
+            }
+        };
+    }
+
+    public Bitmap getBigImage(String artUrl) {
+        Bitmap[] result = mCache.get(artUrl);
+        return result == null ? null : result[BIG_BITMAP_INDEX];
+    }
+
+    public Bitmap getIconImage(String artUrl) {
+        Bitmap[] result = mCache.get(artUrl);
+        return result == null ? null : result[ICON_BITMAP_INDEX];
+    }
+
+    public void fetch(final String artUrl, final FetchListener listener) {
+        // WARNING: for the sake of simplicity, simultaneous multi-thread fetch requests
+        // are not handled properly: they may cause redundant costly operations, like HTTP
+        // requests and bitmap rescales. For production-level apps, we recommend you use
+        // a proper image loading library, like Glide.
+        Bitmap[] bitmap = mCache.get(artUrl);
+        if (bitmap != null) {
+            Log.d(TAG, "getOrFetch: album art is in cache, using it " + artUrl);
+            listener.onFetched(artUrl, bitmap[BIG_BITMAP_INDEX], bitmap[ICON_BITMAP_INDEX]);
+            return;
+        }
+        Log.d(TAG, "getOrFetch: starting asynctask to fetch " + artUrl);
+
+        new AsyncTask<Void, Void, Bitmap[]>() {
+            @Override
+            protected Bitmap[] doInBackground(Void[] objects) {
+                Bitmap[] bitmaps;
+                try {
+                    Bitmap bitmap = BitmapHelper.fetchAndRescaleBitmap(artUrl,
+                        MAX_ART_WIDTH, MAX_ART_HEIGHT);
+                    Bitmap icon = BitmapHelper.scaleBitmap(bitmap,
+                        MAX_ART_WIDTH_ICON, MAX_ART_HEIGHT_ICON);
+                    bitmaps = new Bitmap[] {bitmap, icon};
+                    mCache.put(artUrl, bitmaps);
+                } catch (IOException e) {
+                    return null;
+                }
+                Log.d(TAG, "doInBackground: putting bitmap in cache. cache size=" + mCache.size());
+                return bitmaps;
+            }
+
+            @Override
+            protected void onPostExecute(Bitmap[] bitmaps) {
+                if (bitmaps == null) {
+                    listener.onError(artUrl, new IllegalArgumentException("got null bitmaps"));
+                } else {
+                    listener.onFetched(artUrl,
+                        bitmaps[BIG_BITMAP_INDEX], bitmaps[ICON_BITMAP_INDEX]);
+                }
+            }
+        }.execute();
+    }
+
+    public static abstract class FetchListener {
+        public abstract void onFetched(String artUrl, Bitmap bigImage, Bitmap iconImage);
+        public void onError(String artUrl, Exception e) {
+            Log.e(TAG, "AlbumArtFetchListener: error while downloading " + artUrl, e);
+        }
+    }
+}
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/media/BrowseFragment.java b/samples/Support4Demos/src/com/example/android/supportv4/media/BrowseFragment.java
new file mode 100644
index 0000000..2ee7622
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/media/BrowseFragment.java
@@ -0,0 +1,218 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.example.android.supportv4.media;
+
+import android.app.Fragment;
+import android.content.ComponentName;
+import android.content.Context;
+import android.os.Bundle;
+import android.os.RemoteException;
+import android.support.v4.media.MediaBrowserCompat;
+import android.support.v4.media.session.MediaControllerCompat;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.AdapterView;
+import android.widget.ArrayAdapter;
+import android.widget.ImageView;
+import android.widget.ListView;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.example.android.supportv4.R;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * A Fragment that lists all the various browsable queues available
+ * from a {@link android.service.media.MediaBrowserService}.
+ * <p/>
+ * It uses a {@link MediaBrowserCompat} to connect to the {@link MediaBrowserServiceSupport}.
+ * Once connected, the fragment subscribes to get all the children. All
+ * {@link MediaBrowserCompat.MediaItem}'s that can be browsed are shown in a ListView.
+ */
+public class BrowseFragment extends Fragment {
+
+    private static final String TAG = "BrowseFragment";
+
+    public static final String ARG_MEDIA_ID = "media_id";
+
+    public static interface FragmentDataHelper {
+        void onMediaItemSelected(MediaBrowserCompat.MediaItem item);
+    }
+
+    // The mediaId to be used for subscribing for children using the MediaBrowser.
+    private String mMediaId;
+
+    private MediaBrowserCompat mMediaBrowser;
+    private BrowseAdapter mBrowserAdapter;
+
+    private MediaBrowserCompat.SubscriptionCallback mSubscriptionCallback =
+            new MediaBrowserCompat.SubscriptionCallback() {
+
+        @Override
+        public void onChildrenLoaded(String parentId, List<MediaBrowserCompat.MediaItem> children) {
+            Log.d(TAG, "onChildrenLoaded: " + parentId);
+            mBrowserAdapter.clear();
+            mBrowserAdapter.notifyDataSetInvalidated();
+            for (MediaBrowserCompat.MediaItem item : children) {
+                mBrowserAdapter.add(item);
+            }
+            mBrowserAdapter.notifyDataSetChanged();
+        }
+
+        @Override
+        public void onError(String id) {
+            Toast.makeText(getActivity(), R.string.error_loading_media,
+                    Toast.LENGTH_LONG).show();
+        }
+    };
+
+    private MediaBrowserCompat.ConnectionCallback mConnectionCallback =
+            new MediaBrowserCompat.ConnectionCallback() {
+        @Override
+        public void onConnected() {
+            Log.d(TAG, "onConnected: session token " + mMediaBrowser.getSessionToken());
+
+            if (mMediaId == null) {
+                mMediaId = mMediaBrowser.getRoot();
+            }
+            mMediaBrowser.subscribe(mMediaId, mSubscriptionCallback);
+            if (mMediaBrowser.getSessionToken() == null) {
+                throw new IllegalArgumentException("No Session token");
+            }
+            MediaControllerCompat mediaController = null;
+            try {
+                mediaController = new MediaControllerCompat(getActivity(),
+                        mMediaBrowser.getSessionToken());
+            } catch (RemoteException e) {
+                Log.e(TAG, "Failed to create MediaController.", e);
+            }
+            ((MediaBrowserSupport) getActivity()).setMediaController(mediaController);
+        }
+
+        @Override
+        public void onConnectionFailed() {
+            Log.d(TAG, "onConnectionFailed");
+        }
+
+        @Override
+        public void onConnectionSuspended() {
+            Log.d(TAG, "onConnectionSuspended");
+            getActivity().setMediaController(null);
+        }
+    };
+
+    public static BrowseFragment newInstance(String mediaId) {
+        Bundle args = new Bundle();
+        args.putString(ARG_MEDIA_ID, mediaId);
+        BrowseFragment fragment = new BrowseFragment();
+        fragment.setArguments(args);
+        return fragment;
+    }
+
+    @Override
+    public View onCreateView(LayoutInflater inflater, ViewGroup container,
+                             Bundle savedInstanceState) {
+        View rootView = inflater.inflate(R.layout.fragment_list, container, false);
+
+        mBrowserAdapter = new BrowseAdapter(getActivity());
+
+        View controls = rootView.findViewById(R.id.controls);
+        controls.setVisibility(View.GONE);
+
+        ListView listView = (ListView) rootView.findViewById(R.id.list_view);
+        listView.setAdapter(mBrowserAdapter);
+        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
+            @Override
+            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+                MediaBrowserCompat.MediaItem item = mBrowserAdapter.getItem(position);
+                try {
+                    FragmentDataHelper listener = (FragmentDataHelper) getActivity();
+                    listener.onMediaItemSelected(item);
+                } catch (ClassCastException ex) {
+                    Log.e(TAG, "Exception trying to cast to FragmentDataHelper", ex);
+                }
+            }
+        });
+
+        Bundle args = getArguments();
+        mMediaId = args.getString(ARG_MEDIA_ID, null);
+
+        mMediaBrowser = new MediaBrowserCompat(getActivity(),
+                new ComponentName(getActivity(), MediaBrowserServiceSupport.class),
+                mConnectionCallback, null);
+
+        return rootView;
+    }
+
+    @Override
+    public void onStart() {
+        super.onStart();
+        mMediaBrowser.connect();
+    }
+
+    @Override
+    public void onStop() {
+        super.onStop();
+        mMediaBrowser.disconnect();
+    }
+
+    // An adapter for showing the list of browsed MediaItem's
+    private static class BrowseAdapter extends ArrayAdapter<MediaBrowserCompat.MediaItem> {
+
+        public BrowseAdapter(Context context) {
+            super(context, R.layout.media_list_item, new ArrayList<MediaBrowserCompat.MediaItem>());
+        }
+
+        static class ViewHolder {
+            ImageView mImageView;
+            TextView mTitleView;
+            TextView mDescriptionView;
+        }
+
+        @Override
+        public View getView(int position, View convertView, ViewGroup parent) {
+
+            ViewHolder holder;
+
+            if (convertView == null) {
+                convertView = LayoutInflater.from(getContext())
+                        .inflate(R.layout.media_list_item, parent, false);
+                holder = new ViewHolder();
+                holder.mImageView = (ImageView) convertView.findViewById(R.id.play_eq);
+                holder.mImageView.setVisibility(View.GONE);
+                holder.mTitleView = (TextView) convertView.findViewById(R.id.title);
+                holder.mDescriptionView = (TextView) convertView.findViewById(R.id.description);
+                convertView.setTag(holder);
+            } else {
+                holder = (ViewHolder) convertView.getTag();
+            }
+
+            MediaBrowserCompat.MediaItem item = getItem(position);
+            holder.mTitleView.setText(item.getDescription().getTitle());
+            holder.mDescriptionView.setText(item.getDescription().getDescription());
+            if (item.isPlayable()) {
+                holder.mImageView.setImageDrawable(getContext().getResources()
+                        .getDrawable(R.drawable.ic_play_arrow_white_24dp));
+                holder.mImageView.setVisibility(View.VISIBLE);
+            }
+            return convertView;
+        }
+    }
+}
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/media/MediaBrowserServiceSupport.java b/samples/Support4Demos/src/com/example/android/supportv4/media/MediaBrowserServiceSupport.java
new file mode 100644
index 0000000..74ddd3f
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/media/MediaBrowserServiceSupport.java
@@ -0,0 +1,745 @@
+/*
+* Copyright (C) 2015 The Android Open Source Project
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+*      http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+package com.example.android.supportv4.media;
+
+import android.app.PendingIntent;
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.Bitmap;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.os.SystemClock;
+import android.support.v4.media.MediaDescriptionCompat;
+import android.support.v4.media.MediaMetadataCompat;
+import android.support.v4.media.MediaBrowserCompat.MediaItem;
+import android.support.v4.media.MediaBrowserServiceCompat;
+import android.support.v4.media.session.MediaButtonReceiver;
+import android.support.v4.media.session.MediaSessionCompat;
+import android.support.v4.media.session.PlaybackStateCompat;
+import android.text.TextUtils;
+import android.util.Log;
+
+import com.example.android.supportv4.R;
+import com.example.android.supportv4.media.model.MusicProvider;
+import com.example.android.supportv4.media.utils.CarHelper;
+import com.example.android.supportv4.media.utils.MediaIDHelper;
+import com.example.android.supportv4.media.utils.QueueHelper;
+
+import java.lang.ref.WeakReference;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import static com.example.android.supportv4.media.utils.MediaIDHelper.MEDIA_ID_MUSICS_BY_GENRE;
+import static com.example.android.supportv4.media.utils.MediaIDHelper.MEDIA_ID_ROOT;
+import static com.example.android.supportv4.media.utils.MediaIDHelper.createBrowseCategoryMediaID;
+
+/**
+ * This class provides a MediaBrowser through a service. It exposes the media library to a browsing
+ * client, through the onGetRoot and onLoadChildren methods. It also creates a MediaSession and
+ * exposes it through its MediaSession.Token, which allows the client to create a MediaController
+ * that connects to and send control commands to the MediaSession remotely. This is useful for
+ * user interfaces that need to interact with your media session, like Android Auto. You can
+ * (should) also use the same service from your app's UI, which gives a seamless playback
+ * experience to the user.
+ * <p/>
+ * To implement a MediaBrowserService, you need to:
+ * <p/>
+ * <ul>
+ * <p/>
+ * <li> Extend {@link android.service.media.MediaBrowserService}, implementing the media browsing
+ * related methods {@link android.service.media.MediaBrowserService#onGetRoot} and
+ * {@link android.service.media.MediaBrowserService#onLoadChildren};
+ * <li> In onCreate, start a new {@link android.media.session.MediaSession} and notify its parent
+ * with the session's token {@link android.service.media.MediaBrowserService#setSessionToken};
+ * <p/>
+ * <li> Set a callback on the
+ * {@link android.media.session.MediaSession#setCallback(android.media.session.MediaSession.Callback)}.
+ * The callback will receive all the user's actions, like play, pause, etc;
+ * <p/>
+ * <li> Handle all the actual music playing using any method your app prefers (for example,
+ * {@link android.media.MediaPlayer})
+ * <p/>
+ * <li> Update playbackState, "now playing" metadata and queue, using MediaSession proper methods
+ * {@link android.media.session.MediaSession#setPlaybackState(android.media.session.PlaybackState)}
+ * {@link android.media.session.MediaSession#setMetadata(android.media.MediaMetadata)} and
+ * {@link android.media.session.MediaSession#setQueue(java.util.List)})
+ * <p/>
+ * <li> Declare and export the service in AndroidManifest with an intent receiver for the action
+ * android.media.browse.MediaBrowserService
+ * <p/>
+ * </ul>
+ * <p/>
+ * To make your app compatible with Android Auto, you also need to:
+ * <p/>
+ * <ul>
+ * <p/>
+ * <li> Declare a meta-data tag in AndroidManifest.xml linking to a xml resource
+ * with a &lt;automotiveApp&gt; root element. For a media app, this must include
+ * an &lt;uses name="media"/&gt; element as a child.
+ * For example, in AndroidManifest.xml:
+ * &lt;meta-data android:name="com.google.android.gms.car.application"
+ * android:resource="@xml/automotive_app_desc"/&gt;
+ * And in res/values/automotive_app_desc.xml:
+ * &lt;automotiveApp&gt;
+ * &lt;uses name="media"/&gt;
+ * &lt;/automotiveApp&gt;
+ * <p/>
+ * </ul>
+ *
+ * @see <a href="README.md">README.md</a> for more details.
+ */
+
+public class MediaBrowserServiceSupport extends MediaBrowserServiceCompat
+        implements Playback.Callback {
+
+    // The action of the incoming Intent indicating that it contains a command
+    // to be executed (see {@link #onStartCommand})
+    public static final String ACTION_CMD = "com.example.android.supportv4.media.ACTION_CMD";
+    // The key in the extras of the incoming Intent indicating the command that
+    // should be executed (see {@link #onStartCommand})
+    public static final String CMD_NAME = "CMD_NAME";
+    // A value of a CMD_NAME key in the extras of the incoming Intent that
+    // indicates that the music playback should be paused (see {@link #onStartCommand})
+    public static final String CMD_PAUSE = "CMD_PAUSE";
+
+    private static final String TAG = "SampleMediaBrowserService";
+    // Action to thumbs up a media item
+    private static final String CUSTOM_ACTION_THUMBS_UP =
+            "com.example.android.supportv4.media.THUMBS_UP";
+    // Delay stopSelf by using a handler.
+    private static final int STOP_DELAY = 30000;
+
+    // Music catalog manager
+    private MusicProvider mMusicProvider;
+    private MediaSessionCompat mSession;
+    // "Now playing" queue:
+    private List<MediaSessionCompat.QueueItem> mPlayingQueue;
+    private int mCurrentIndexOnQueue;
+    private MediaNotificationManager mMediaNotificationManager;
+    // Indicates whether the service was started.
+    private boolean mServiceStarted;
+    private DelayedStopHandler mDelayedStopHandler = new DelayedStopHandler(this);
+    private Playback mPlayback;
+    private PackageValidator mPackageValidator;
+
+    /*
+     * (non-Javadoc)
+     * @see android.app.Service#onCreate()
+     */
+    @Override
+    public void onCreate() {
+        super.onCreate();
+        Log.d(TAG, "onCreate");
+
+        mPlayingQueue = new ArrayList<>();
+        mMusicProvider = new MusicProvider();
+        mPackageValidator = new PackageValidator(this);
+
+        // Start a new MediaSession
+        mSession = new MediaSessionCompat(this, "MusicService");
+        setSessionToken(mSession.getSessionToken());
+        mSession.setCallback(new MediaSessionCallback());
+        mSession.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS |
+                MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS);
+
+        mPlayback = new Playback(this, mMusicProvider);
+        mPlayback.setState(PlaybackStateCompat.STATE_NONE);
+        mPlayback.setCallback(this);
+        mPlayback.start();
+
+        Context context = getApplicationContext();
+        Intent intent = new Intent(context, MediaBrowserSupport.class);
+        PendingIntent pi = PendingIntent.getActivity(context, 99 /*request code*/,
+                intent, PendingIntent.FLAG_UPDATE_CURRENT);
+        mSession.setSessionActivity(pi);
+
+        Bundle extras = new Bundle();
+        CarHelper.setSlotReservationFlags(extras, true, true, true);
+        mSession.setExtras(extras);
+
+        updatePlaybackState(null);
+
+        mMediaNotificationManager = new MediaNotificationManager(this);
+    }
+
+    /**
+     * (non-Javadoc)
+     *
+     * @see android.app.Service#onStartCommand(android.content.Intent, int, int)
+     */
+    @Override
+    public int onStartCommand(Intent startIntent, int flags, int startId) {
+        if (startIntent != null) {
+            String action = startIntent.getAction();
+            if (Intent.ACTION_MEDIA_BUTTON.equals(action)) {
+                MediaButtonReceiver.handleIntent(mSession, startIntent);
+            } else if (ACTION_CMD.equals(action)) {
+                if (CMD_PAUSE.equals(startIntent.getStringExtra(CMD_NAME))) {
+                    if (mPlayback != null && mPlayback.isPlaying()) {
+                        handlePauseRequest();
+                    }
+                }
+            }
+        }
+        return START_STICKY;
+    }
+
+    /**
+     * (non-Javadoc)
+     *
+     * @see android.app.Service#onDestroy()
+     */
+    @Override
+    public void onDestroy() {
+        Log.d(TAG, "onDestroy");
+        // Service is being killed, so make sure we release our resources
+        handleStopRequest(null);
+
+        mDelayedStopHandler.removeCallbacksAndMessages(null);
+        // Always release the MediaSession to clean up resources
+        // and notify associated MediaController(s).
+        mSession.release();
+    }
+
+    @Override
+    public BrowserRoot onGetRoot(String clientPackageName, int clientUid, Bundle rootHints) {
+        Log.d(TAG, "OnGetRoot: clientPackageName=" + clientPackageName + "; clientUid="
+                + clientUid + " ; rootHints=" + rootHints);
+        // To ensure you are not allowing any arbitrary app to browse your app's contents, you
+        // need to check the origin:
+        if (!mPackageValidator.isCallerAllowed(this, clientPackageName, clientUid)) {
+            // If the request comes from an untrusted package, return null. No further calls will
+            // be made to other media browsing methods.
+            Log.w(TAG, "OnGetRoot: IGNORING request from untrusted package " + clientPackageName);
+            return null;
+        }
+        //noinspection StatementWithEmptyBody
+        if (CarHelper.isValidCarPackage(clientPackageName)) {
+            // Optional: if your app needs to adapt ads, music library or anything else that
+            // needs to run differently when connected to the car, this is where you should handle
+            // it.
+        }
+        return new BrowserRoot(MEDIA_ID_ROOT, null);
+    }
+
+    @Override
+    public void onLoadChildren(final String parentMediaId, final Result<List<MediaItem>> result) {
+        if (!mMusicProvider.isInitialized()) {
+            // Use result.detach to allow calling result.sendResult from another thread:
+            result.detach();
+
+            mMusicProvider.retrieveMediaAsync(new MusicProvider.Callback() {
+                @Override
+                public void onMusicCatalogReady(boolean success) {
+                    if (success) {
+                        loadChildrenImpl(parentMediaId, result);
+                    } else {
+                        updatePlaybackState(getString(R.string.error_no_metadata));
+                        result.sendResult(Collections.<MediaItem>emptyList());
+                    }
+                }
+            });
+
+        } else {
+            // If our music catalog is already loaded/cached, load them into result immediately
+            loadChildrenImpl(parentMediaId, result);
+        }
+    }
+
+    /**
+     * Actual implementation of onLoadChildren that assumes that MusicProvider is already
+     * initialized.
+     */
+    private void loadChildrenImpl(final String parentMediaId,
+            final Result<List<MediaItem>> result) {
+        Log.d(TAG, "OnLoadChildren: parentMediaId=" + parentMediaId);
+
+        List<MediaItem> mediaItems = new ArrayList<>();
+
+        if (MEDIA_ID_ROOT.equals(parentMediaId)) {
+            Log.d(TAG, "OnLoadChildren.ROOT");
+            mediaItems.add(new MediaItem(
+                    new MediaDescriptionCompat.Builder()
+                            .setMediaId(MEDIA_ID_MUSICS_BY_GENRE)
+                            .setTitle(getString(R.string.browse_genres))
+                            .setIconUri(Uri.parse("android.resource://" +
+                                    "com.example.android.supportv4.media/drawable/ic_by_genre"))
+                            .setSubtitle(getString(R.string.browse_genre_subtitle))
+                            .build(), MediaItem.FLAG_BROWSABLE
+            ));
+
+        } else if (MEDIA_ID_MUSICS_BY_GENRE.equals(parentMediaId)) {
+            Log.d(TAG, "OnLoadChildren.GENRES");
+            for (String genre : mMusicProvider.getGenres()) {
+                MediaItem item = new MediaItem(
+                        new MediaDescriptionCompat.Builder()
+                                .setMediaId(createBrowseCategoryMediaID(MEDIA_ID_MUSICS_BY_GENRE,
+                                        genre))
+                                .setTitle(genre)
+                                .setSubtitle(
+                                        getString(R.string.browse_musics_by_genre_subtitle, genre))
+                                .build(), MediaItem.FLAG_BROWSABLE
+                );
+                mediaItems.add(item);
+            }
+
+        } else if (parentMediaId.startsWith(MEDIA_ID_MUSICS_BY_GENRE)) {
+            String genre = MediaIDHelper.getHierarchy(parentMediaId)[1];
+            Log.d(TAG, "OnLoadChildren.SONGS_BY_GENRE  genre=" + genre);
+            for (MediaMetadataCompat track : mMusicProvider.getMusicsByGenre(genre)) {
+                // Since mediaMetadata fields are immutable, we need to create a copy, so we
+                // can set a hierarchy-aware mediaID. We will need to know the media hierarchy
+                // when we get a onPlayFromMusicID call, so we can create the proper queue based
+                // on where the music was selected from (by artist, by genre, random, etc)
+                String hierarchyAwareMediaID = MediaIDHelper.createMediaID(
+                        track.getDescription().getMediaId(), MEDIA_ID_MUSICS_BY_GENRE, genre);
+                MediaMetadataCompat trackCopy = new MediaMetadataCompat.Builder(track)
+                        .putString(MediaMetadataCompat.METADATA_KEY_MEDIA_ID, hierarchyAwareMediaID)
+                        .build();
+                MediaItem bItem = new MediaItem(
+                        trackCopy.getDescription(), MediaItem.FLAG_PLAYABLE);
+                mediaItems.add(bItem);
+            }
+        } else {
+            Log.w(TAG, "Skipping unmatched parentMediaId: " + parentMediaId);
+        }
+        Log.d(TAG, "OnLoadChildren sending " + mediaItems.size() + " results for "
+                + parentMediaId);
+        result.sendResult(mediaItems);
+    }
+
+    private final class MediaSessionCallback extends MediaSessionCompat.Callback {
+        @Override
+        public void onPlay() {
+            Log.d(TAG, "play");
+
+            if (mPlayingQueue == null || mPlayingQueue.isEmpty()) {
+                mPlayingQueue = QueueHelper.getRandomQueue(mMusicProvider);
+                mSession.setQueue(mPlayingQueue);
+                mSession.setQueueTitle(getString(R.string.random_queue_title));
+                // start playing from the beginning of the queue
+                mCurrentIndexOnQueue = 0;
+            }
+
+            if (mPlayingQueue != null && !mPlayingQueue.isEmpty()) {
+                handlePlayRequest();
+            }
+        }
+
+        @Override
+        public void onSkipToQueueItem(long queueId) {
+            Log.d(TAG, "OnSkipToQueueItem:" + queueId);
+
+            if (mPlayingQueue != null && !mPlayingQueue.isEmpty()) {
+                // set the current index on queue from the music Id:
+                mCurrentIndexOnQueue = QueueHelper.getMusicIndexOnQueue(mPlayingQueue, queueId);
+                // play the music
+                handlePlayRequest();
+            }
+        }
+
+        @Override
+        public void onSeekTo(long position) {
+            Log.d(TAG, "onSeekTo:" + position);
+            mPlayback.seekTo((int) position);
+        }
+
+        @Override
+        public void onPlayFromMediaId(String mediaId, Bundle extras) {
+            Log.d(TAG, "playFromMediaId mediaId:" + mediaId + "  extras=" + extras);
+
+            // The mediaId used here is not the unique musicId. This one comes from the
+            // MediaBrowser, and is actually a "hierarchy-aware mediaID": a concatenation of
+            // the hierarchy in MediaBrowser and the actual unique musicID. This is necessary
+            // so we can build the correct playing queue, based on where the track was
+            // selected from.
+            mPlayingQueue = QueueHelper.getPlayingQueue(mediaId, mMusicProvider);
+            mSession.setQueue(mPlayingQueue);
+            String queueTitle = getString(R.string.browse_musics_by_genre_subtitle,
+                    MediaIDHelper.extractBrowseCategoryValueFromMediaID(mediaId));
+            mSession.setQueueTitle(queueTitle);
+
+            if (mPlayingQueue != null && !mPlayingQueue.isEmpty()) {
+                // set the current index on queue from the media Id:
+                mCurrentIndexOnQueue = QueueHelper.getMusicIndexOnQueue(mPlayingQueue, mediaId);
+
+                if (mCurrentIndexOnQueue < 0) {
+                    Log.e(TAG, "playFromMediaId: media ID " + mediaId
+                            + " could not be found on queue. Ignoring.");
+                } else {
+                    // play the music
+                    handlePlayRequest();
+                }
+            }
+        }
+
+        @Override
+        public void onPause() {
+            Log.d(TAG, "pause. current state=" + mPlayback.getState());
+            handlePauseRequest();
+        }
+
+        @Override
+        public void onStop() {
+            Log.d(TAG, "stop. current state=" + mPlayback.getState());
+            handleStopRequest(null);
+        }
+
+        @Override
+        public void onSkipToNext() {
+            Log.d(TAG, "skipToNext");
+            mCurrentIndexOnQueue++;
+            if (mPlayingQueue != null && mCurrentIndexOnQueue >= mPlayingQueue.size()) {
+                // This sample's behavior: skipping to next when in last song returns to the
+                // first song.
+                mCurrentIndexOnQueue = 0;
+            }
+            if (QueueHelper.isIndexPlayable(mCurrentIndexOnQueue, mPlayingQueue)) {
+                handlePlayRequest();
+            } else {
+                Log.e(TAG, "skipToNext: cannot skip to next. next Index=" +
+                        mCurrentIndexOnQueue + " queue length=" +
+                        (mPlayingQueue == null ? "null" : mPlayingQueue.size()));
+                handleStopRequest("Cannot skip");
+            }
+        }
+
+        @Override
+        public void onSkipToPrevious() {
+            Log.d(TAG, "skipToPrevious");
+            mCurrentIndexOnQueue--;
+            if (mPlayingQueue != null && mCurrentIndexOnQueue < 0) {
+                // This sample's behavior: skipping to previous when in first song restarts the
+                // first song.
+                mCurrentIndexOnQueue = 0;
+            }
+            if (QueueHelper.isIndexPlayable(mCurrentIndexOnQueue, mPlayingQueue)) {
+                handlePlayRequest();
+            } else {
+                Log.e(TAG, "skipToPrevious: cannot skip to previous. previous Index=" +
+                        mCurrentIndexOnQueue + " queue length=" +
+                        (mPlayingQueue == null ? "null" : mPlayingQueue.size()));
+                handleStopRequest("Cannot skip");
+            }
+        }
+
+        @Override
+        public void onCustomAction(String action, Bundle extras) {
+            if (CUSTOM_ACTION_THUMBS_UP.equals(action)) {
+                Log.i(TAG, "onCustomAction: favorite for current track");
+                MediaMetadataCompat track = getCurrentPlayingMusic();
+                if (track != null) {
+                    String musicId = track.getString(MediaMetadataCompat.METADATA_KEY_MEDIA_ID);
+                    mMusicProvider.setFavorite(musicId, !mMusicProvider.isFavorite(musicId));
+                }
+                // playback state needs to be updated because the "Favorite" icon on the
+                // custom action will change to reflect the new favorite state.
+                updatePlaybackState(null);
+            } else {
+                Log.e(TAG, "Unsupported action: " + action);
+            }
+        }
+
+        @Override
+        public void onPlayFromSearch(String query, Bundle extras) {
+            Log.d(TAG, "playFromSearch  query=" + query);
+
+            if (TextUtils.isEmpty(query)) {
+                // A generic search like "Play music" sends an empty query
+                // and it's expected that we start playing something. What will be played depends
+                // on the app: favorite playlist, "I'm feeling lucky", most recent, etc.
+                mPlayingQueue = QueueHelper.getRandomQueue(mMusicProvider);
+            } else {
+                mPlayingQueue = QueueHelper.getPlayingQueueFromSearch(query, mMusicProvider);
+            }
+
+            Log.d(TAG, "playFromSearch  playqueue.length=" + mPlayingQueue.size());
+            mSession.setQueue(mPlayingQueue);
+
+            if (mPlayingQueue != null && !mPlayingQueue.isEmpty()) {
+                // immediately start playing from the beginning of the search results
+                mCurrentIndexOnQueue = 0;
+
+                handlePlayRequest();
+            } else {
+                // if nothing was found, we need to warn the user and stop playing
+                handleStopRequest(getString(R.string.no_search_results));
+            }
+        }
+    }
+
+    /**
+     * Handle a request to play music
+     */
+    private void handlePlayRequest() {
+        Log.d(TAG, "handlePlayRequest: mState=" + mPlayback.getState());
+
+        mDelayedStopHandler.removeCallbacksAndMessages(null);
+        if (!mServiceStarted) {
+            Log.v(TAG, "Starting service");
+            // The MusicService needs to keep running even after the calling MediaBrowser
+            // is disconnected. Call startService(Intent) and then stopSelf(..) when we no longer
+            // need to play media.
+            startService(new Intent(getApplicationContext(), MediaBrowserServiceSupport.class));
+            mServiceStarted = true;
+        }
+
+        if (!mSession.isActive()) {
+            mSession.setActive(true);
+        }
+
+        if (QueueHelper.isIndexPlayable(mCurrentIndexOnQueue, mPlayingQueue)) {
+            updateMetadata();
+            mPlayback.play(mPlayingQueue.get(mCurrentIndexOnQueue));
+        }
+    }
+
+    /**
+     * Handle a request to pause music
+     */
+    private void handlePauseRequest() {
+        Log.d(TAG, "handlePauseRequest: mState=" + mPlayback.getState());
+        mPlayback.pause();
+        // reset the delayed stop handler.
+        mDelayedStopHandler.removeCallbacksAndMessages(null);
+        mDelayedStopHandler.sendEmptyMessageDelayed(0, STOP_DELAY);
+    }
+
+    /**
+     * Handle a request to stop music
+     */
+    private void handleStopRequest(String withError) {
+        Log.d(TAG, "handleStopRequest: mState=" + mPlayback.getState() + " error=" + withError);
+        mPlayback.stop(true);
+        // reset the delayed stop handler.
+        mDelayedStopHandler.removeCallbacksAndMessages(null);
+        mDelayedStopHandler.sendEmptyMessageDelayed(0, STOP_DELAY);
+
+        updatePlaybackState(withError);
+
+        // service is no longer necessary. Will be started again if needed.
+        stopSelf();
+        mServiceStarted = false;
+    }
+
+    private void updateMetadata() {
+        if (!QueueHelper.isIndexPlayable(mCurrentIndexOnQueue, mPlayingQueue)) {
+            Log.e(TAG, "Can't retrieve current metadata.");
+            updatePlaybackState(getResources().getString(R.string.error_no_metadata));
+            return;
+        }
+        MediaSessionCompat.QueueItem queueItem = mPlayingQueue.get(mCurrentIndexOnQueue);
+        String musicId = MediaIDHelper.extractMusicIDFromMediaID(
+                queueItem.getDescription().getMediaId());
+        MediaMetadataCompat track = mMusicProvider.getMusic(musicId);
+        final String trackId = track.getString(MediaMetadataCompat.METADATA_KEY_MEDIA_ID);
+        if (!musicId.equals(trackId)) {
+            IllegalStateException e = new IllegalStateException("track ID should match musicId.");
+            Log.e(TAG, "track ID should match musicId. musicId=" + musicId + " trackId=" + trackId
+                    + " mediaId from queueItem=" + queueItem.getDescription().getMediaId()
+                    + " title from queueItem=" + queueItem.getDescription().getTitle()
+                    + " mediaId from track=" + track.getDescription().getMediaId()
+                    + " title from track=" + track.getDescription().getTitle()
+                    + " source.hashcode from track=" + track.getString(
+                            MusicProvider.CUSTOM_METADATA_TRACK_SOURCE).hashCode(), e);
+            throw e;
+        }
+        Log.d(TAG, "Updating metadata for MusicID= " + musicId);
+        mSession.setMetadata(track);
+
+        // Set the proper album artwork on the media session, so it can be shown in the
+        // locked screen and in other places.
+        if (track.getDescription().getIconBitmap() == null &&
+                track.getDescription().getIconUri() != null) {
+            String albumUri = track.getDescription().getIconUri().toString();
+            AlbumArtCache.getInstance().fetch(albumUri, new AlbumArtCache.FetchListener() {
+                @Override
+                public void onFetched(String artUrl, Bitmap bitmap, Bitmap icon) {
+                    MediaSessionCompat.QueueItem queueItem = mPlayingQueue.get(mCurrentIndexOnQueue);
+                    MediaMetadataCompat track = mMusicProvider.getMusic(trackId);
+                    track = new MediaMetadataCompat.Builder(track)
+                            // set high resolution bitmap in METADATA_KEY_ALBUM_ART. This is used,
+                            // for example, on the lockscreen background when the media session is
+                            // active.
+                            .putBitmap(MediaMetadataCompat.METADATA_KEY_ALBUM_ART, bitmap)
+                            // set small version of the album art in the DISPLAY_ICON. This is used
+                            // on the MediaDescription and thus it should be small to be serialized
+                            // if necessary.
+                            .putBitmap(MediaMetadataCompat.METADATA_KEY_DISPLAY_ICON, icon)
+                            .build();
+
+                    mMusicProvider.updateMusic(trackId, track);
+
+                    // If we are still playing the same music
+                    String currentPlayingId = MediaIDHelper.extractMusicIDFromMediaID(
+                            queueItem.getDescription().getMediaId());
+                    if (trackId.equals(currentPlayingId)) {
+                        mSession.setMetadata(track);
+                    }
+                }
+            });
+        }
+    }
+
+    /**
+     * Update the current media player state, optionally showing an error message.
+     *
+     * @param error if not null, error message to present to the user.
+     */
+    private void updatePlaybackState(String error) {
+        Log.d(TAG, "updatePlaybackState, playback state=" + mPlayback.getState());
+        long position = PlaybackStateCompat.PLAYBACK_POSITION_UNKNOWN;
+        if (mPlayback != null && mPlayback.isConnected()) {
+            position = mPlayback.getCurrentStreamPosition();
+        }
+
+        PlaybackStateCompat.Builder stateBuilder = new PlaybackStateCompat.Builder()
+                .setActions(getAvailableActions());
+
+        setCustomAction(stateBuilder);
+        int state = mPlayback.getState();
+
+        // If there is an error message, send it to the playback state:
+        if (error != null) {
+            // Error states are really only supposed to be used for errors that cause playback to
+            // stop unexpectedly and persist until the user takes action to fix it.
+            stateBuilder.setErrorMessage(error);
+            state = PlaybackStateCompat.STATE_ERROR;
+        }
+        stateBuilder.setState(state, position, 1.0f, SystemClock.elapsedRealtime());
+
+        // Set the activeQueueItemId if the current index is valid.
+        if (QueueHelper.isIndexPlayable(mCurrentIndexOnQueue, mPlayingQueue)) {
+            MediaSessionCompat.QueueItem item = mPlayingQueue.get(mCurrentIndexOnQueue);
+            stateBuilder.setActiveQueueItemId(item.getQueueId());
+        }
+
+        mSession.setPlaybackState(stateBuilder.build());
+
+        if (state == PlaybackStateCompat.STATE_PLAYING
+                || state == PlaybackStateCompat.STATE_PAUSED) {
+            mMediaNotificationManager.startNotification();
+        }
+    }
+
+    private void setCustomAction(PlaybackStateCompat.Builder stateBuilder) {
+        MediaMetadataCompat currentMusic = getCurrentPlayingMusic();
+        if (currentMusic != null) {
+            // Set appropriate "Favorite" icon on Custom action:
+            String musicId = currentMusic.getString(MediaMetadataCompat.METADATA_KEY_MEDIA_ID);
+            int favoriteIcon = R.drawable.ic_star_off;
+            if (mMusicProvider.isFavorite(musicId)) {
+                favoriteIcon = R.drawable.ic_star_on;
+            }
+            Log.d(TAG, "updatePlaybackState, setting Favorite custom action of music "
+                    + musicId + " current favorite=" + mMusicProvider.isFavorite(musicId));
+            stateBuilder.addCustomAction(CUSTOM_ACTION_THUMBS_UP, getString(R.string.favorite),
+                    favoriteIcon);
+        }
+    }
+
+    private long getAvailableActions() {
+        long actions = PlaybackStateCompat.ACTION_PLAY
+                | PlaybackStateCompat.ACTION_PLAY_FROM_MEDIA_ID
+                | PlaybackStateCompat.ACTION_PLAY_FROM_SEARCH;
+        if (mPlayingQueue == null || mPlayingQueue.isEmpty()) {
+            return actions;
+        }
+        if (mPlayback.isPlaying()) {
+            actions |= PlaybackStateCompat.ACTION_PAUSE;
+        }
+        if (mCurrentIndexOnQueue > 0) {
+            actions |= PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS;
+        }
+        if (mCurrentIndexOnQueue < mPlayingQueue.size() - 1) {
+            actions |= PlaybackStateCompat.ACTION_SKIP_TO_NEXT;
+        }
+        return actions;
+    }
+
+    private MediaMetadataCompat getCurrentPlayingMusic() {
+        if (QueueHelper.isIndexPlayable(mCurrentIndexOnQueue, mPlayingQueue)) {
+            MediaSessionCompat.QueueItem item = mPlayingQueue.get(mCurrentIndexOnQueue);
+            if (item != null) {
+                Log.d(TAG, "getCurrentPlayingMusic for musicId="
+                        + item.getDescription().getMediaId());
+                return mMusicProvider.getMusic(
+                        MediaIDHelper
+                                .extractMusicIDFromMediaID(item.getDescription().getMediaId()));
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Implementation of the Playback.Callback interface
+     */
+    @Override
+    public void onCompletion() {
+        // The media player finished playing the current song, so we go ahead
+        // and start the next.
+        if (mPlayingQueue != null && !mPlayingQueue.isEmpty()) {
+            // In this sample, we restart the playing queue when it gets to the end:
+            mCurrentIndexOnQueue++;
+            if (mCurrentIndexOnQueue >= mPlayingQueue.size()) {
+                mCurrentIndexOnQueue = 0;
+            }
+            handlePlayRequest();
+        } else {
+            // If there is nothing to play, we stop and release the resources:
+            handleStopRequest(null);
+        }
+    }
+
+    @Override
+    public void onPlaybackStatusChanged(int state) {
+        updatePlaybackState(null);
+    }
+
+    @Override
+    public void onError(String error) {
+        updatePlaybackState(error);
+    }
+
+    /**
+     * A simple handler that stops the service if playback is not active (playing)
+     */
+    private static class DelayedStopHandler extends Handler {
+        private final WeakReference<MediaBrowserServiceSupport> mWeakReference;
+
+        private DelayedStopHandler(MediaBrowserServiceSupport service) {
+            mWeakReference = new WeakReference<>(service);
+        }
+
+        @Override
+        public void handleMessage(Message msg) {
+            MediaBrowserServiceSupport service = mWeakReference.get();
+            if (service != null && service.mPlayback != null) {
+                if (service.mPlayback.isPlaying()) {
+                    Log.d(TAG, "Ignoring delayed stop since the media player is in use.");
+                    return;
+                }
+                Log.d(TAG, "Stopping service with delay handler.");
+                service.stopSelf();
+                service.mServiceStarted = false;
+            }
+        }
+    }
+}
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/media/MediaBrowserSupport.java b/samples/Support4Demos/src/com/example/android/supportv4/media/MediaBrowserSupport.java
new file mode 100644
index 0000000..6460318
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/media/MediaBrowserSupport.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv4.media;
+
+import com.example.android.supportv4.R;
+import android.app.Activity;
+import android.os.Bundle;
+import android.support.v4.media.MediaBrowserCompat;
+import android.support.v4.media.session.MediaControllerCompat;
+
+/**
+ * Main activity for the music player.
+ */
+public class MediaBrowserSupport extends Activity implements BrowseFragment.FragmentDataHelper {
+    private MediaControllerCompat mMediaController;
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_player);
+        if (savedInstanceState == null) {
+            getFragmentManager().beginTransaction()
+                    .add(R.id.container, BrowseFragment.newInstance(null))
+                    .commit();
+        }
+    }
+
+    @Override
+    public void onMediaItemSelected(MediaBrowserCompat.MediaItem item) {
+        if (item.isPlayable()) {
+            mMediaController.getTransportControls().playFromMediaId(item.getMediaId(), null);
+            QueueFragment queueFragment = QueueFragment.newInstance();
+            getFragmentManager().beginTransaction()
+                    .replace(R.id.container, queueFragment)
+                    .addToBackStack(null)
+                    .commit();
+        } else if (item.isBrowsable()) {
+            getFragmentManager().beginTransaction()
+                    .replace(R.id.container, BrowseFragment.newInstance(item.getMediaId()))
+                    .addToBackStack(null)
+                    .commit();
+        }
+    }
+
+    public void setMediaController(MediaControllerCompat mediaController) {
+        mMediaController = mediaController;
+    }
+}
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/media/MediaController.java b/samples/Support4Demos/src/com/example/android/supportv4/media/MediaController.java
new file mode 100644
index 0000000..b8d99d4
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/media/MediaController.java
@@ -0,0 +1,370 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv4.media;
+
+import android.support.v4.media.TransportController;
+import android.support.v4.media.TransportMediator;
+import android.support.v4.media.TransportStateListener;
+import com.example.android.supportv4.R;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.accessibility.AccessibilityEvent;
+import android.view.accessibility.AccessibilityNodeInfo;
+import android.widget.FrameLayout;
+import android.widget.ImageButton;
+import android.widget.ProgressBar;
+import android.widget.SeekBar;
+import android.widget.TextView;
+
+import java.util.Formatter;
+import java.util.Locale;
+
+/**
+ * Helper for implementing media controls in an application.
+ * Use instead of the very useful android.widget.MediaController.
+ * This version is embedded inside of an application's layout.
+ */
+public class MediaController extends FrameLayout {
+
+    private TransportController mController;
+    private Context mContext;
+    private ProgressBar mProgress;
+    private TextView mEndTime, mCurrentTime;
+    private boolean mDragging;
+    private boolean mUseFastForward;
+    private boolean mListenersSet;
+    private boolean mShowNext, mShowPrev;
+    private View.OnClickListener mNextListener, mPrevListener;
+    StringBuilder mFormatBuilder;
+    Formatter mFormatter;
+    private ImageButton mPauseButton;
+    private ImageButton mFfwdButton;
+    private ImageButton mRewButton;
+    private ImageButton mNextButton;
+    private ImageButton mPrevButton;
+
+    private TransportStateListener mStateListener = new TransportStateListener() {
+        @Override
+        public void onPlayingChanged(TransportController controller) {
+            updatePausePlay();
+        }
+        @Override
+        public void onTransportControlsChanged(TransportController controller) {
+            updateButtons();
+        }
+    };
+
+    public MediaController(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        mContext = context;
+        mUseFastForward = true;
+        LayoutInflater inflate = (LayoutInflater)
+                mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+        inflate.inflate(R.layout.media_controller, this, true);
+        initControllerView();
+    }
+
+    public MediaController(Context context, boolean useFastForward) {
+        super(context);
+        mContext = context;
+        mUseFastForward = useFastForward;
+    }
+
+    public MediaController(Context context) {
+        this(context, true);
+    }
+
+    public void setMediaPlayer(TransportController controller) {
+        if (getWindowToken() != null) {
+            if (mController != null) {
+                mController.unregisterStateListener(mStateListener);
+            }
+            if (controller != null) {
+                controller.registerStateListener(mStateListener);
+            }
+        }
+        mController = controller;
+        updatePausePlay();
+    }
+
+    @Override
+    protected void onAttachedToWindow() {
+        super.onAttachedToWindow();
+        if (mController != null) {
+            mController.registerStateListener(mStateListener);
+        }
+    }
+
+    @Override
+    protected void onDetachedFromWindow() {
+        super.onDetachedFromWindow();
+        if (mController != null) {
+            mController.unregisterStateListener(mStateListener);
+        }
+    }
+
+    private void initControllerView() {
+        mPauseButton = (ImageButton) findViewById(R.id.pause);
+        if (mPauseButton != null) {
+            mPauseButton.requestFocus();
+            mPauseButton.setOnClickListener(mPauseListener);
+        }
+
+        mFfwdButton = (ImageButton) findViewById(R.id.ffwd);
+        if (mFfwdButton != null) {
+            mFfwdButton.setOnClickListener(mFfwdListener);
+            mFfwdButton.setVisibility(mUseFastForward ? View.VISIBLE : View.GONE);
+        }
+
+        mRewButton = (ImageButton) findViewById(R.id.rew);
+        if (mRewButton != null) {
+            mRewButton.setOnClickListener(mRewListener);
+            mRewButton.setVisibility(mUseFastForward ? View.VISIBLE : View.GONE);
+        }
+
+        // By default these are hidden. They will be enabled when setPrevNextListeners() is called
+        mNextButton = (ImageButton) findViewById(R.id.next);
+        if (mNextButton != null && !mListenersSet) {
+            mNextButton.setVisibility(View.GONE);
+        }
+        mPrevButton = (ImageButton) findViewById(R.id.prev);
+        if (mPrevButton != null && !mListenersSet) {
+            mPrevButton.setVisibility(View.GONE);
+        }
+
+        mProgress = (ProgressBar) findViewById(R.id.mediacontroller_progress);
+        if (mProgress != null) {
+            if (mProgress instanceof SeekBar) {
+                SeekBar seeker = (SeekBar) mProgress;
+                seeker.setOnSeekBarChangeListener(mSeekListener);
+            }
+            mProgress.setMax(1000);
+        }
+
+        mEndTime = (TextView) findViewById(R.id.time);
+        mCurrentTime = (TextView) findViewById(R.id.time_current);
+        mFormatBuilder = new StringBuilder();
+        mFormatter = new Formatter(mFormatBuilder, Locale.getDefault());
+
+        installPrevNextListeners();
+    }
+
+    /**
+     * Disable pause or seek buttons if the stream cannot be paused or seeked.
+     * This requires the control interface to be a MediaPlayerControlExt
+     */
+    void updateButtons() {
+        int flags = mController.getTransportControlFlags();
+        boolean enabled = isEnabled();
+        if (mPauseButton != null) {
+            mPauseButton.setEnabled(enabled && (flags&TransportMediator.FLAG_KEY_MEDIA_PAUSE) != 0);
+        }
+        if (mRewButton != null) {
+            mRewButton.setEnabled(enabled && (flags&TransportMediator.FLAG_KEY_MEDIA_REWIND) != 0);
+        }
+        if (mFfwdButton != null) {
+            mFfwdButton.setEnabled(enabled &&
+                    (flags&TransportMediator.FLAG_KEY_MEDIA_FAST_FORWARD) != 0);
+        }
+        if (mPrevButton != null) {
+            mShowPrev = (flags&TransportMediator.FLAG_KEY_MEDIA_PREVIOUS) != 0
+                    || mPrevListener != null;
+            mPrevButton.setEnabled(enabled && mShowPrev);
+        }
+        if (mNextButton != null) {
+            mShowNext = (flags&TransportMediator.FLAG_KEY_MEDIA_NEXT) != 0
+                    || mNextListener != null;
+            mNextButton.setEnabled(enabled && mShowNext);
+        }
+    }
+
+    public void refresh() {
+        updateProgress();
+        updateButtons();
+        updatePausePlay();
+    }
+
+    private String stringForTime(int timeMs) {
+        int totalSeconds = timeMs / 1000;
+
+        int seconds = totalSeconds % 60;
+        int minutes = (totalSeconds / 60) % 60;
+        int hours   = totalSeconds / 3600;
+
+        mFormatBuilder.setLength(0);
+        if (hours > 0) {
+            return mFormatter.format("%d:%02d:%02d", hours, minutes, seconds).toString();
+        } else {
+            return mFormatter.format("%02d:%02d", minutes, seconds).toString();
+        }
+    }
+
+    public long updateProgress() {
+        if (mController == null || mDragging) {
+            return 0;
+        }
+        long position = mController.getCurrentPosition();
+        long duration = mController.getDuration();
+        if (mProgress != null) {
+            if (duration > 0) {
+                // use long to avoid overflow
+                long pos = 1000L * position / duration;
+                mProgress.setProgress( (int) pos);
+            }
+            int percent = mController.getBufferPercentage();
+            mProgress.setSecondaryProgress(percent * 10);
+        }
+
+        if (mEndTime != null)
+            mEndTime.setText(stringForTime((int)duration));
+        if (mCurrentTime != null)
+            mCurrentTime.setText(stringForTime((int)position));
+
+        return position;
+    }
+
+    private View.OnClickListener mPauseListener = new View.OnClickListener() {
+        public void onClick(View v) {
+            doPauseResume();
+        }
+    };
+
+    private void updatePausePlay() {
+        if (mPauseButton == null)
+            return;
+
+        if (mController.isPlaying()) {
+            mPauseButton.setImageResource(android.R.drawable.ic_media_pause);
+        } else {
+            mPauseButton.setImageResource(android.R.drawable.ic_media_play);
+        }
+    }
+
+    private void doPauseResume() {
+        if (mController.isPlaying()) {
+            mController.pausePlaying();
+        } else {
+            mController.startPlaying();
+        }
+        updatePausePlay();
+    }
+
+    // There are two scenarios that can trigger the seekbar listener to trigger:
+    //
+    // The first is the user using the touchpad to adjust the posititon of the
+    // seekbar's thumb. In this case onStartTrackingTouch is called followed by
+    // a number of onProgressChanged notifications, concluded by onStopTrackingTouch.
+    // We're setting the field "mDragging" to true for the duration of the dragging
+    // session to avoid jumps in the position in case of ongoing playback.
+    //
+    // The second scenario involves the user operating the scroll ball, in this
+    // case there WON'T BE onStartTrackingTouch/onStopTrackingTouch notifications,
+    // we will simply apply the updated position without suspending regular updates.
+    private SeekBar.OnSeekBarChangeListener mSeekListener = new SeekBar.OnSeekBarChangeListener() {
+        public void onStartTrackingTouch(SeekBar bar) {
+            mDragging = true;
+        }
+
+        public void onProgressChanged(SeekBar bar, int progress, boolean fromuser) {
+            if (!fromuser) {
+                // We're not interested in programmatically generated changes to
+                // the progress bar's position.
+                return;
+            }
+
+            long duration = mController.getDuration();
+            long newposition = (duration * progress) / 1000L;
+            mController.seekTo((int) newposition);
+            if (mCurrentTime != null)
+                mCurrentTime.setText(stringForTime( (int) newposition));
+        }
+
+        public void onStopTrackingTouch(SeekBar bar) {
+            mDragging = false;
+            updateProgress();
+            updatePausePlay();
+        }
+    };
+
+    @Override
+    public void setEnabled(boolean enabled) {
+        super.setEnabled(enabled);
+        updateButtons();
+    }
+
+    @Override
+    public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
+        super.onInitializeAccessibilityEvent(event);
+        event.setClassName(MediaController.class.getName());
+    }
+
+    @Override
+    public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
+        super.onInitializeAccessibilityNodeInfo(info);
+        info.setClassName(MediaController.class.getName());
+    }
+
+    private View.OnClickListener mRewListener = new View.OnClickListener() {
+        public void onClick(View v) {
+            long pos = mController.getCurrentPosition();
+            pos -= 5000; // milliseconds
+            mController.seekTo(pos);
+            updateProgress();
+        }
+    };
+
+    private View.OnClickListener mFfwdListener = new View.OnClickListener() {
+        public void onClick(View v) {
+            long pos = mController.getCurrentPosition();
+            pos += 15000; // milliseconds
+            mController.seekTo(pos);
+            updateProgress();
+        }
+    };
+
+    private void installPrevNextListeners() {
+        if (mNextButton != null) {
+            mNextButton.setOnClickListener(mNextListener);
+            mNextButton.setEnabled(mShowNext);
+        }
+
+        if (mPrevButton != null) {
+            mPrevButton.setOnClickListener(mPrevListener);
+            mPrevButton.setEnabled(mShowPrev);
+        }
+    }
+
+    public void setPrevNextListeners(View.OnClickListener next, View.OnClickListener prev) {
+        mNextListener = next;
+        mPrevListener = prev;
+        mListenersSet = true;
+
+        installPrevNextListeners();
+
+        if (mNextButton != null) {
+            mNextButton.setVisibility(View.VISIBLE);
+            mShowNext = true;
+        }
+        if (mPrevButton != null) {
+            mPrevButton.setVisibility(View.VISIBLE);
+            mShowPrev = true;
+        }
+    }
+}
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/media/MediaNotificationManager.java b/samples/Support4Demos/src/com/example/android/supportv4/media/MediaNotificationManager.java
new file mode 100644
index 0000000..6226382
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/media/MediaNotificationManager.java
@@ -0,0 +1,350 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv4.media;
+
+import android.app.Notification;
+import android.app.PendingIntent;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.Color;
+import android.os.RemoteException;
+import android.support.v4.app.NotificationCompat;
+import android.support.v4.app.NotificationManagerCompat;
+import android.support.v4.media.MediaDescriptionCompat;
+import android.support.v4.media.MediaMetadataCompat;
+import android.support.v4.media.session.MediaControllerCompat;
+import android.support.v4.media.session.MediaSessionCompat;
+import android.support.v4.media.session.PlaybackStateCompat;
+import android.util.Log;
+
+import com.example.android.supportv4.R;
+import com.example.android.supportv4.media.utils.ResourceHelper;
+
+/**
+ * Keeps track of a notification and updates it automatically for a given
+ * MediaSession. Maintaining a visible notification (usually) guarantees that the music service
+ * won't be killed during playback.
+ */
+public class MediaNotificationManager extends BroadcastReceiver {
+    private static final String TAG = "MediaNotiManager";
+
+    private static final int NOTIFICATION_ID = 412;
+    private static final int REQUEST_CODE = 100;
+
+    public static final String ACTION_PAUSE = "com.example.android.supportv4.media.pause";
+    public static final String ACTION_PLAY = "com.example.android.supportv4.media.play";
+    public static final String ACTION_PREV = "com.example.android.supportv4.media.prev";
+    public static final String ACTION_NEXT = "com.example.android.supportv4.media.next";
+
+    private final MediaBrowserServiceSupport mService;
+    private MediaSessionCompat.Token mSessionToken;
+    private MediaControllerCompat mController;
+    private MediaControllerCompat.TransportControls mTransportControls;
+
+    private PlaybackStateCompat mPlaybackState;
+    private MediaMetadataCompat mMetadata;
+
+    private NotificationManagerCompat mNotificationManager;
+
+    private PendingIntent mPauseIntent;
+    private PendingIntent mPlayIntent;
+    private PendingIntent mPreviousIntent;
+    private PendingIntent mNextIntent;
+
+    private int mNotificationColor;
+
+    private boolean mStarted = false;
+
+    public MediaNotificationManager(MediaBrowserServiceSupport service) {
+        mService = service;
+        updateSessionToken();
+
+        mNotificationColor = ResourceHelper.getThemeColor(mService,
+            android.R.attr.colorPrimary, Color.DKGRAY);
+
+        mNotificationManager = NotificationManagerCompat.from(mService);
+
+        String pkg = mService.getPackageName();
+        mPauseIntent = PendingIntent.getBroadcast(mService, REQUEST_CODE,
+                new Intent(ACTION_PAUSE).setPackage(pkg), PendingIntent.FLAG_CANCEL_CURRENT);
+        mPlayIntent = PendingIntent.getBroadcast(mService, REQUEST_CODE,
+                new Intent(ACTION_PLAY).setPackage(pkg), PendingIntent.FLAG_CANCEL_CURRENT);
+        mPreviousIntent = PendingIntent.getBroadcast(mService, REQUEST_CODE,
+                new Intent(ACTION_PREV).setPackage(pkg), PendingIntent.FLAG_CANCEL_CURRENT);
+        mNextIntent = PendingIntent.getBroadcast(mService, REQUEST_CODE,
+                new Intent(ACTION_NEXT).setPackage(pkg), PendingIntent.FLAG_CANCEL_CURRENT);
+
+        // Cancel all notifications to handle the case where the Service was killed and
+        // restarted by the system.
+        mNotificationManager.cancelAll();
+    }
+
+    /**
+     * Posts the notification and starts tracking the session to keep it
+     * updated. The notification will automatically be removed if the session is
+     * destroyed before {@link #stopNotification} is called.
+     */
+    public void startNotification() {
+        if (!mStarted) {
+            mMetadata = mController.getMetadata();
+            mPlaybackState = mController.getPlaybackState();
+
+            // The notification must be updated after setting started to true
+            Notification notification = createNotification();
+            if (notification != null) {
+                mController.registerCallback(mCb);
+                IntentFilter filter = new IntentFilter();
+                filter.addAction(ACTION_NEXT);
+                filter.addAction(ACTION_PAUSE);
+                filter.addAction(ACTION_PLAY);
+                filter.addAction(ACTION_PREV);
+                mService.registerReceiver(this, filter);
+
+                mService.startForeground(NOTIFICATION_ID, notification);
+                mStarted = true;
+            }
+        }
+    }
+
+    /**
+     * Removes the notification and stops tracking the session. If the session
+     * was destroyed this has no effect.
+     */
+    public void stopNotification() {
+        if (mStarted) {
+            mStarted = false;
+            mController.unregisterCallback(mCb);
+            try {
+                mNotificationManager.cancel(NOTIFICATION_ID);
+                mService.unregisterReceiver(this);
+            } catch (IllegalArgumentException ex) {
+                // ignore if the receiver is not registered.
+            }
+            mService.stopForeground(true);
+        }
+    }
+
+    @Override
+    public void onReceive(Context context, Intent intent) {
+        final String action = intent.getAction();
+        Log.d(TAG, "Received intent with action " + action);
+        switch (action) {
+            case ACTION_PAUSE:
+                mTransportControls.pause();
+                break;
+            case ACTION_PLAY:
+                mTransportControls.play();
+                break;
+            case ACTION_NEXT:
+                mTransportControls.skipToNext();
+                break;
+            case ACTION_PREV:
+                mTransportControls.skipToPrevious();
+                break;
+            default:
+                Log.w(TAG, "Unknown intent ignored. Action=" + action);
+        }
+    }
+
+    /**
+     * Update the state based on a change on the session token. Called either when
+     * we are running for the first time or when the media session owner has destroyed the session
+     * (see {@link android.media.session.MediaController.Callback#onSessionDestroyed()})
+     */
+    private void updateSessionToken() {
+        MediaSessionCompat.Token freshToken = mService.getSessionToken();
+        if (mSessionToken == null || !mSessionToken.equals(freshToken)) {
+            if (mController != null) {
+                mController.unregisterCallback(mCb);
+            }
+            mSessionToken = freshToken;
+            try {
+                mController = new MediaControllerCompat(mService, mSessionToken);
+            } catch (RemoteException e) {
+                Log.e(TAG, "Failed to create MediaControllerCompat.", e);
+            }
+            mTransportControls = mController.getTransportControls();
+            if (mStarted) {
+                mController.registerCallback(mCb);
+            }
+        }
+    }
+
+    private PendingIntent createContentIntent() {
+        Intent openUI = new Intent(mService, MediaBrowserSupport.class);
+        openUI.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
+        return PendingIntent.getActivity(mService, REQUEST_CODE, openUI,
+                PendingIntent.FLAG_CANCEL_CURRENT);
+    }
+
+    private final MediaControllerCompat.Callback mCb = new MediaControllerCompat.Callback() {
+        @Override
+        public void onPlaybackStateChanged(PlaybackStateCompat state) {
+            mPlaybackState = state;
+            Log.d(TAG, "Received new playback state " + state);
+            if (state != null && (state.getState() == PlaybackStateCompat.STATE_STOPPED ||
+                    state.getState() == PlaybackStateCompat.STATE_NONE)) {
+                stopNotification();
+            } else {
+                Notification notification = createNotification();
+                if (notification != null) {
+                    mNotificationManager.notify(NOTIFICATION_ID, notification);
+                }
+            }
+        }
+
+        @Override
+        public void onMetadataChanged(MediaMetadataCompat metadata) {
+            mMetadata = metadata;
+            Log.d(TAG, "Received new metadata " + metadata);
+            Notification notification = createNotification();
+            if (notification != null) {
+                mNotificationManager.notify(NOTIFICATION_ID, notification);
+            }
+        }
+
+        @Override
+        public void onSessionDestroyed() {
+            super.onSessionDestroyed();
+            Log.d(TAG, "Session was destroyed, resetting to the new session token");
+            updateSessionToken();
+        }
+    };
+
+    private Notification createNotification() {
+        Log.d(TAG, "updateNotificationMetadata. mMetadata=" + mMetadata);
+        if (mMetadata == null || mPlaybackState == null) {
+            return null;
+        }
+
+        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(mService);
+
+        // If skip to previous action is enabled
+        if ((mPlaybackState.getActions() & PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS) != 0) {
+            notificationBuilder.addAction(R.drawable.ic_skip_previous_white_24dp,
+                        mService.getString(R.string.label_previous), mPreviousIntent);
+        }
+
+        addPlayPauseAction(notificationBuilder);
+
+        // If skip to next action is enabled
+        if ((mPlaybackState.getActions() & PlaybackStateCompat.ACTION_SKIP_TO_NEXT) != 0) {
+            notificationBuilder.addAction(R.drawable.ic_skip_next_white_24dp,
+                mService.getString(R.string.label_next), mNextIntent);
+        }
+
+        MediaDescriptionCompat description = mMetadata.getDescription();
+
+        String fetchArtUrl = null;
+        Bitmap art = null;
+        if (description.getIconUri() != null) {
+            // This sample assumes the iconUri will be a valid URL formatted String, but
+            // it can actually be any valid Android Uri formatted String.
+            // async fetch the album art icon
+            String artUrl = description.getIconUri().toString();
+            art = AlbumArtCache.getInstance().getBigImage(artUrl);
+            if (art == null) {
+                fetchArtUrl = artUrl;
+                // use a placeholder art while the remote art is being downloaded
+                art = BitmapFactory.decodeResource(mService.getResources(),
+                    R.drawable.ic_default_art);
+            }
+        }
+
+        notificationBuilder
+                .setColor(mNotificationColor)
+                .setSmallIcon(R.drawable.ic_notification)
+                .setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
+                .setUsesChronometer(true)
+                .setContentIntent(createContentIntent())
+                .setContentTitle(description.getTitle())
+                .setContentText(description.getSubtitle())
+                .setLargeIcon(art);
+
+        setNotificationPlaybackState(notificationBuilder);
+        if (fetchArtUrl != null) {
+            fetchBitmapFromURLAsync(fetchArtUrl, notificationBuilder);
+        }
+
+        return notificationBuilder.build();
+    }
+
+    private void addPlayPauseAction(NotificationCompat.Builder builder) {
+        Log.d(TAG, "updatePlayPauseAction");
+        String label;
+        int icon;
+        PendingIntent intent;
+        if (mPlaybackState.getState() == PlaybackStateCompat.STATE_PLAYING) {
+            label = mService.getString(R.string.label_pause);
+            icon = R.drawable.ic_pause_white_24dp;
+            intent = mPauseIntent;
+        } else {
+            label = mService.getString(R.string.label_play);
+            icon = R.drawable.ic_play_arrow_white_24dp;
+            intent = mPlayIntent;
+        }
+        builder.addAction(new NotificationCompat.Action(icon, label, intent));
+    }
+
+    private void setNotificationPlaybackState(NotificationCompat.Builder builder) {
+        Log.d(TAG, "updateNotificationPlaybackState. mPlaybackState=" + mPlaybackState);
+        if (mPlaybackState == null || !mStarted) {
+            Log.d(TAG, "updateNotificationPlaybackState. cancelling notification!");
+            mService.stopForeground(true);
+            return;
+        }
+        if (mPlaybackState.getState() == PlaybackStateCompat.STATE_PLAYING
+                && mPlaybackState.getPosition() >= 0) {
+            Log.d(TAG, "updateNotificationPlaybackState. updating playback position to "
+                    + (System.currentTimeMillis() - mPlaybackState.getPosition()) / 1000
+                    + " seconds");
+            builder
+                .setWhen(System.currentTimeMillis() - mPlaybackState.getPosition())
+                .setShowWhen(true)
+                .setUsesChronometer(true);
+        } else {
+            Log.d(TAG, "updateNotificationPlaybackState. hiding playback position");
+            builder
+                .setWhen(0)
+                .setShowWhen(false)
+                .setUsesChronometer(false);
+        }
+
+        // Make sure that the notification can be dismissed by the user when we are not playing:
+        builder.setOngoing(mPlaybackState.getState() == PlaybackStateCompat.STATE_PLAYING);
+    }
+
+    private void fetchBitmapFromURLAsync(final String bitmapUrl,
+                                         final NotificationCompat.Builder builder) {
+        AlbumArtCache.getInstance().fetch(bitmapUrl, new AlbumArtCache.FetchListener() {
+            @Override
+            public void onFetched(String artUrl, Bitmap bitmap, Bitmap icon) {
+                if (mMetadata != null && mMetadata.getDescription() != null &&
+                    artUrl.equals(mMetadata.getDescription().getIconUri().toString())) {
+                    // If the media is still the same, update the notification:
+                    Log.d(TAG, "fetchBitmapFromURLAsync: set bitmap to " + artUrl);
+                    builder.setLargeIcon(bitmap);
+                    mNotificationManager.notify(NOTIFICATION_ID, builder.build());
+                }
+            }
+        });
+    }
+}
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/media/PackageValidator.java b/samples/Support4Demos/src/com/example/android/supportv4/media/PackageValidator.java
new file mode 100644
index 0000000..bcb7c32
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/media/PackageValidator.java
@@ -0,0 +1,160 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv4.media;
+
+import android.content.Context;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.content.res.XmlResourceParser;
+import android.os.Process;
+import android.util.Base64;
+import android.util.Log;
+
+import com.example.android.supportv4.R;
+
+import org.xmlpull.v1.XmlPullParserException;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Validates that the calling package is authorized to browse a
+ * {@link android.service.media.MediaBrowserService}.
+ *
+ * The list of allowed signing certificates and their corresponding package names is defined in
+ * res/xml/allowed_media_browser_callers.xml.
+ */
+public class PackageValidator {
+    private static final String TAG = "PackageValidator";
+
+    /**
+     * Map allowed callers' certificate keys to the expected caller information.
+     *
+     */
+    private final Map<String, ArrayList<CallerInfo>> mValidCertificates;
+
+    public PackageValidator(Context ctx) {
+        mValidCertificates = readValidCertificates(ctx.getResources().getXml(
+            R.xml.allowed_media_browser_callers));
+    }
+
+    private Map<String, ArrayList<CallerInfo>> readValidCertificates(XmlResourceParser parser) {
+        HashMap<String, ArrayList<CallerInfo>> validCertificates = new HashMap<>();
+        try {
+            int eventType = parser.next();
+            while (eventType != XmlResourceParser.END_DOCUMENT) {
+                if (eventType == XmlResourceParser.START_TAG
+                        && parser.getName().equals("signing_certificate")) {
+
+                    String name = parser.getAttributeValue(null, "name");
+                    String packageName = parser.getAttributeValue(null, "package");
+                    boolean isRelease = parser.getAttributeBooleanValue(null, "release", false);
+                    String certificate = parser.nextText().replaceAll("\\s|\\n", "");
+
+                    CallerInfo info = new CallerInfo(name, packageName, isRelease, certificate);
+
+                    ArrayList<CallerInfo> infos = validCertificates.get(certificate);
+                    if (infos == null) {
+                        infos = new ArrayList<>();
+                        validCertificates.put(certificate, infos);
+                    }
+                    Log.v(TAG, "Adding allowed caller: " + info.name + " package="
+                            + info.packageName + " release=" + info.release + " certificate="
+                            + certificate);
+                    infos.add(info);
+                }
+                eventType = parser.next();
+            }
+        } catch (XmlPullParserException | IOException e) {
+            Log.e(TAG, "Could not read allowed callers from XML.", e);
+        }
+        return validCertificates;
+    }
+
+    /**
+     * @return false if the caller is not authorized to get data from this MediaBrowserService
+     */
+    @SuppressWarnings("BooleanMethodIsAlwaysInverted")
+    public boolean isCallerAllowed(Context context, String callingPackage, int callingUid) {
+        // Always allow calls from the framework, self app or development environment.
+        if (Process.SYSTEM_UID == callingUid || Process.myUid() == callingUid) {
+            return true;
+        }
+        PackageManager packageManager = context.getPackageManager();
+        PackageInfo packageInfo;
+        try {
+            packageInfo = packageManager.getPackageInfo(
+                    callingPackage, PackageManager.GET_SIGNATURES);
+        } catch (PackageManager.NameNotFoundException e) {
+            Log.w(TAG, "Package manager can't find package: " + callingPackage, e);
+            return false;
+        }
+        if (packageInfo.signatures.length != 1) {
+            Log.w(TAG, "Caller has more than one signature certificate!");
+            return false;
+        }
+        String signature = Base64.encodeToString(
+            packageInfo.signatures[0].toByteArray(), Base64.NO_WRAP);
+
+        // Test for known signatures:
+        ArrayList<CallerInfo> validCallers = mValidCertificates.get(signature);
+        if (validCallers == null) {
+            Log.v(TAG, "Signature for caller " + callingPackage + " is not valid: \n" + signature);
+            if (mValidCertificates.isEmpty()) {
+                Log.w(TAG, "The list of valid certificates is empty. Either your file"
+                        + " res/xml/allowed_media_browser_callers.xml is empty or there was an"
+                        + " error while reading it. Check previous log messages.");
+            }
+            return false;
+        }
+
+        // Check if the package name is valid for the certificate:
+        StringBuffer expectedPackages = new StringBuffer();
+        for (CallerInfo info: validCallers) {
+            if (callingPackage.equals(info.packageName)) {
+                Log.v(TAG, "Valid caller: " + info.name + "  package=" + info.packageName
+                    + " release=" + info.release);
+                return true;
+            }
+            expectedPackages.append(info.packageName).append(' ');
+        }
+
+        Log.i(TAG, "Caller has a valid certificate, but its package doesn't match any expected"
+                + "package for the given certificate. Caller's package is " + callingPackage
+                + ". Expected packages as defined in res/xml/allowed_media_browser_callers.xml are"
+                +" (" + expectedPackages + "). This caller's certificate is: \n" + signature);
+
+        return false;
+    }
+
+    private final static class CallerInfo {
+        final String name;
+        final String packageName;
+        final boolean release;
+        final String signingCertificate;
+
+        public CallerInfo(String name, String packageName, boolean release,
+                          String signingCertificate) {
+            this.name = name;
+            this.packageName = packageName;
+            this.release = release;
+            this.signingCertificate = signingCertificate;
+        }
+    }
+}
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/media/Playback.java b/samples/Support4Demos/src/com/example/android/supportv4/media/Playback.java
new file mode 100644
index 0000000..62c236f
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/media/Playback.java
@@ -0,0 +1,490 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv4.media;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.media.AudioManager;
+import android.media.MediaPlayer;
+import android.media.session.PlaybackState;
+import android.net.wifi.WifiManager;
+import android.os.PowerManager;
+import android.support.v4.media.MediaMetadataCompat;
+import android.text.TextUtils;
+import android.util.Log;
+
+import com.example.android.supportv4.media.model.MusicProvider;
+import com.example.android.supportv4.media.utils.MediaIDHelper;
+
+import java.io.IOException;
+
+import static android.media.MediaPlayer.OnCompletionListener;
+import static android.media.MediaPlayer.OnErrorListener;
+import static android.media.MediaPlayer.OnPreparedListener;
+import static android.media.MediaPlayer.OnSeekCompleteListener;
+import static android.support.v4.media.session.MediaSessionCompat.QueueItem;
+
+/**
+ * A class that implements local media playback using {@link android.media.MediaPlayer}
+ */
+public class Playback implements AudioManager.OnAudioFocusChangeListener,
+        OnCompletionListener, OnErrorListener, OnPreparedListener, OnSeekCompleteListener {
+
+    private static final String TAG = "Playback";
+
+    // The volume we set the media player to when we lose audio focus, but are
+    // allowed to reduce the volume instead of stopping playback.
+    public static final float VOLUME_DUCK = 0.2f;
+    // The volume we set the media player when we have audio focus.
+    public static final float VOLUME_NORMAL = 1.0f;
+
+    // we don't have audio focus, and can't duck (play at a low volume)
+    private static final int AUDIO_NO_FOCUS_NO_DUCK = 0;
+    // we don't have focus, but can duck (play at a low volume)
+    private static final int AUDIO_NO_FOCUS_CAN_DUCK = 1;
+    // we have full audio focus
+    private static final int AUDIO_FOCUSED  = 2;
+
+    private final MediaBrowserServiceSupport mService;
+    private final WifiManager.WifiLock mWifiLock;
+    private int mState;
+    private boolean mPlayOnFocusGain;
+    private Callback mCallback;
+    private MusicProvider mMusicProvider;
+    private volatile boolean mAudioNoisyReceiverRegistered;
+    private volatile int mCurrentPosition;
+    private volatile String mCurrentMediaId;
+
+    // Type of audio focus we have:
+    private int mAudioFocus = AUDIO_NO_FOCUS_NO_DUCK;
+    private AudioManager mAudioManager;
+    private MediaPlayer mMediaPlayer;
+
+    private IntentFilter mAudioNoisyIntentFilter =
+            new IntentFilter(AudioManager.ACTION_AUDIO_BECOMING_NOISY);
+
+    private BroadcastReceiver mAudioNoisyReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            if (AudioManager.ACTION_AUDIO_BECOMING_NOISY.equals(intent.getAction())) {
+                Log.d(TAG, "Headphones disconnected.");
+                if (isPlaying()) {
+                    Intent i = new Intent(context, MediaBrowserServiceSupport.class);
+                    i.setAction(MediaBrowserServiceSupport.ACTION_CMD);
+                    i.putExtra(MediaBrowserServiceSupport.CMD_NAME, MediaBrowserServiceSupport.CMD_PAUSE);
+                    mService.startService(i);
+                }
+            }
+        }
+    };
+
+    public Playback(MediaBrowserServiceSupport service, MusicProvider musicProvider) {
+        this.mService = service;
+        this.mMusicProvider = musicProvider;
+        this.mAudioManager = (AudioManager) service.getSystemService(Context.AUDIO_SERVICE);
+        // Create the Wifi lock (this does not acquire the lock, this just creates it)
+        this.mWifiLock = ((WifiManager) service.getSystemService(Context.WIFI_SERVICE))
+                .createWifiLock(WifiManager.WIFI_MODE_FULL, "sample_lock");
+    }
+
+    public void start() {
+    }
+
+    public void stop(boolean notifyListeners) {
+        mState = PlaybackState.STATE_STOPPED;
+        if (notifyListeners && mCallback != null) {
+            mCallback.onPlaybackStatusChanged(mState);
+        }
+        mCurrentPosition = getCurrentStreamPosition();
+        // Give up Audio focus
+        giveUpAudioFocus();
+        unregisterAudioNoisyReceiver();
+        // Relax all resources
+        relaxResources(true);
+        if (mWifiLock.isHeld()) {
+            mWifiLock.release();
+        }
+    }
+
+    public void setState(int state) {
+        this.mState = state;
+    }
+
+    public int getState() {
+        return mState;
+    }
+
+    public boolean isConnected() {
+        return true;
+    }
+
+    public boolean isPlaying() {
+        return mPlayOnFocusGain || (mMediaPlayer != null && mMediaPlayer.isPlaying());
+    }
+
+    public int getCurrentStreamPosition() {
+        return mMediaPlayer != null ?
+                mMediaPlayer.getCurrentPosition() : mCurrentPosition;
+    }
+
+    public void play(QueueItem item) {
+        mPlayOnFocusGain = true;
+        tryToGetAudioFocus();
+        registerAudioNoisyReceiver();
+        String mediaId = item.getDescription().getMediaId();
+        boolean mediaHasChanged = !TextUtils.equals(mediaId, mCurrentMediaId);
+        if (mediaHasChanged) {
+            mCurrentPosition = 0;
+            mCurrentMediaId = mediaId;
+        }
+
+        if (mState == PlaybackState.STATE_PAUSED && !mediaHasChanged && mMediaPlayer != null) {
+            configMediaPlayerState();
+        } else {
+            mState = PlaybackState.STATE_STOPPED;
+            relaxResources(false); // release everything except MediaPlayer
+            MediaMetadataCompat track = mMusicProvider.getMusic(
+                    MediaIDHelper.extractMusicIDFromMediaID(item.getDescription().getMediaId()));
+
+            String source = track.getString(MusicProvider.CUSTOM_METADATA_TRACK_SOURCE);
+
+            try {
+                createMediaPlayerIfNeeded();
+
+                mState = PlaybackState.STATE_BUFFERING;
+
+                mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
+                mMediaPlayer.setDataSource(source);
+
+                // Starts preparing the media player in the background. When
+                // it's done, it will call our OnPreparedListener (that is,
+                // the onPrepared() method on this class, since we set the
+                // listener to 'this'). Until the media player is prepared,
+                // we *cannot* call start() on it!
+                mMediaPlayer.prepareAsync();
+
+                // If we are streaming from the internet, we want to hold a
+                // Wifi lock, which prevents the Wifi radio from going to
+                // sleep while the song is playing.
+                mWifiLock.acquire();
+
+                if (mCallback != null) {
+                    mCallback.onPlaybackStatusChanged(mState);
+                }
+
+            } catch (IOException ex) {
+                Log.e(TAG, "Exception playing song", ex);
+                if (mCallback != null) {
+                    mCallback.onError(ex.getMessage());
+                }
+            }
+        }
+    }
+
+    public void pause() {
+        if (mState == PlaybackState.STATE_PLAYING) {
+            // Pause media player and cancel the 'foreground service' state.
+            if (mMediaPlayer != null && mMediaPlayer.isPlaying()) {
+                mMediaPlayer.pause();
+                mCurrentPosition = mMediaPlayer.getCurrentPosition();
+            }
+            // while paused, retain the MediaPlayer but give up audio focus
+            relaxResources(false);
+            giveUpAudioFocus();
+        }
+        mState = PlaybackState.STATE_PAUSED;
+        if (mCallback != null) {
+            mCallback.onPlaybackStatusChanged(mState);
+        }
+        unregisterAudioNoisyReceiver();
+    }
+
+    public void seekTo(int position) {
+        Log.d(TAG, "seekTo called with " + position);
+
+        if (mMediaPlayer == null) {
+            // If we do not have a current media player, simply update the current position
+            mCurrentPosition = position;
+        } else {
+            if (mMediaPlayer.isPlaying()) {
+                mState = PlaybackState.STATE_BUFFERING;
+            }
+            mMediaPlayer.seekTo(position);
+            if (mCallback != null) {
+                mCallback.onPlaybackStatusChanged(mState);
+            }
+        }
+    }
+
+    public void setCallback(Callback callback) {
+        this.mCallback = callback;
+    }
+
+    /**
+     * Try to get the system audio focus.
+     */
+    private void tryToGetAudioFocus() {
+        Log.d(TAG, "tryToGetAudioFocus");
+        if (mAudioFocus != AUDIO_FOCUSED) {
+            int result = mAudioManager.requestAudioFocus(this, AudioManager.STREAM_MUSIC,
+                    AudioManager.AUDIOFOCUS_GAIN);
+            if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
+                mAudioFocus = AUDIO_FOCUSED;
+            }
+        }
+    }
+
+    /**
+     * Give up the audio focus.
+     */
+    private void giveUpAudioFocus() {
+        Log.d(TAG, "giveUpAudioFocus");
+        if (mAudioFocus == AUDIO_FOCUSED) {
+            if (mAudioManager.abandonAudioFocus(this) == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
+                mAudioFocus = AUDIO_NO_FOCUS_NO_DUCK;
+            }
+        }
+    }
+
+    /**
+     * Reconfigures MediaPlayer according to audio focus settings and
+     * starts/restarts it. This method starts/restarts the MediaPlayer
+     * respecting the current audio focus state. So if we have focus, it will
+     * play normally; if we don't have focus, it will either leave the
+     * MediaPlayer paused or set it to a low volume, depending on what is
+     * allowed by the current focus settings. This method assumes mPlayer !=
+     * null, so if you are calling it, you have to do so from a context where
+     * you are sure this is the case.
+     */
+    private void configMediaPlayerState() {
+        Log.d(TAG, "configMediaPlayerState. mAudioFocus=" + mAudioFocus);
+        if (mAudioFocus == AUDIO_NO_FOCUS_NO_DUCK) {
+            // If we don't have audio focus and can't duck, we have to pause,
+            if (mState == PlaybackState.STATE_PLAYING) {
+                pause();
+            }
+        } else {  // we have audio focus:
+            if (mAudioFocus == AUDIO_NO_FOCUS_CAN_DUCK) {
+                mMediaPlayer.setVolume(VOLUME_DUCK, VOLUME_DUCK); // we'll be relatively quiet
+            } else {
+                if (mMediaPlayer != null) {
+                    mMediaPlayer.setVolume(VOLUME_NORMAL, VOLUME_NORMAL); // we can be loud again
+                } // else do something for remote client.
+            }
+            // If we were playing when we lost focus, we need to resume playing.
+            if (mPlayOnFocusGain) {
+                if (mMediaPlayer != null && !mMediaPlayer.isPlaying()) {
+                    Log.d(TAG,"configMediaPlayerState startMediaPlayer. seeking to "
+                            + mCurrentPosition);
+                    if (mCurrentPosition == mMediaPlayer.getCurrentPosition()) {
+                        mMediaPlayer.start();
+                        mState = PlaybackState.STATE_PLAYING;
+                    } else {
+                        mMediaPlayer.seekTo(mCurrentPosition);
+                        mState = PlaybackState.STATE_BUFFERING;
+                    }
+                }
+                mPlayOnFocusGain = false;
+            }
+        }
+        if (mCallback != null) {
+            mCallback.onPlaybackStatusChanged(mState);
+        }
+    }
+
+    /**
+     * Called by AudioManager on audio focus changes.
+     * Implementation of {@link android.media.AudioManager.OnAudioFocusChangeListener}
+     */
+    @Override
+    public void onAudioFocusChange(int focusChange) {
+        Log.d(TAG, "onAudioFocusChange. focusChange=" + focusChange);
+        if (focusChange == AudioManager.AUDIOFOCUS_GAIN) {
+            // We have gained focus:
+            mAudioFocus = AUDIO_FOCUSED;
+
+        } else if (focusChange == AudioManager.AUDIOFOCUS_LOSS ||
+                focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT ||
+                focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK) {
+            // We have lost focus. If we can duck (low playback volume), we can keep playing.
+            // Otherwise, we need to pause the playback.
+            boolean canDuck = focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK;
+            mAudioFocus = canDuck ? AUDIO_NO_FOCUS_CAN_DUCK : AUDIO_NO_FOCUS_NO_DUCK;
+
+            // If we are playing, we need to reset media player by calling configMediaPlayerState
+            // with mAudioFocus properly set.
+            if (mState == PlaybackState.STATE_PLAYING && !canDuck) {
+                // If we don't have audio focus and can't duck, we save the information that
+                // we were playing, so that we can resume playback once we get the focus back.
+                mPlayOnFocusGain = true;
+            }
+        } else {
+            Log.e(TAG, "onAudioFocusChange: Ignoring unsupported focusChange: " + focusChange);
+        }
+        configMediaPlayerState();
+    }
+
+    /**
+     * Called when MediaPlayer has completed a seek
+     *
+     * @see android.media.MediaPlayer.OnSeekCompleteListener
+     */
+    @Override
+    public void onSeekComplete(MediaPlayer mp) {
+        Log.d(TAG, "onSeekComplete from MediaPlayer:" + mp.getCurrentPosition());
+        mCurrentPosition = mp.getCurrentPosition();
+        if (mState == PlaybackState.STATE_BUFFERING) {
+            mMediaPlayer.start();
+            mState = PlaybackState.STATE_PLAYING;
+        }
+        if (mCallback != null) {
+            mCallback.onPlaybackStatusChanged(mState);
+        }
+    }
+
+    /**
+     * Called when media player is done playing current song.
+     *
+     * @see android.media.MediaPlayer.OnCompletionListener
+     */
+    @Override
+    public void onCompletion(MediaPlayer player) {
+        Log.d(TAG, "onCompletion from MediaPlayer");
+        // The media player finished playing the current song, so we go ahead
+        // and start the next.
+        if (mCallback != null) {
+            mCallback.onCompletion();
+        }
+    }
+
+    /**
+     * Called when media player is done preparing.
+     *
+     * @see android.media.MediaPlayer.OnPreparedListener
+     */
+    @Override
+    public void onPrepared(MediaPlayer player) {
+        Log.d(TAG, "onPrepared from MediaPlayer");
+        // The media player is done preparing. That means we can start playing if we
+        // have audio focus.
+        configMediaPlayerState();
+    }
+
+    /**
+     * Called when there's an error playing media. When this happens, the media
+     * player goes to the Error state. We warn the user about the error and
+     * reset the media player.
+     *
+     * @see android.media.MediaPlayer.OnErrorListener
+     */
+    @Override
+    public boolean onError(MediaPlayer mp, int what, int extra) {
+        Log.e(TAG, "Media player error: what=" + what + ", extra=" + extra);
+        if (mCallback != null) {
+            mCallback.onError("MediaPlayer error " + what + " (" + extra + ")");
+        }
+        return true; // true indicates we handled the error
+    }
+
+    /**
+     * Makes sure the media player exists and has been reset. This will create
+     * the media player if needed, or reset the existing media player if one
+     * already exists.
+     */
+    private void createMediaPlayerIfNeeded() {
+        Log.d(TAG, "createMediaPlayerIfNeeded. needed? " + (mMediaPlayer==null));
+        if (mMediaPlayer == null) {
+            mMediaPlayer = new MediaPlayer();
+
+            // Make sure the media player will acquire a wake-lock while
+            // playing. If we don't do that, the CPU might go to sleep while the
+            // song is playing, causing playback to stop.
+            mMediaPlayer.setWakeMode(mService.getApplicationContext(),
+                    PowerManager.PARTIAL_WAKE_LOCK);
+
+            // we want the media player to notify us when it's ready preparing,
+            // and when it's done playing:
+            mMediaPlayer.setOnPreparedListener(this);
+            mMediaPlayer.setOnCompletionListener(this);
+            mMediaPlayer.setOnErrorListener(this);
+            mMediaPlayer.setOnSeekCompleteListener(this);
+        } else {
+            mMediaPlayer.reset();
+        }
+    }
+
+    /**
+     * Releases resources used by the service for playback. This includes the
+     * "foreground service" status, the wake locks and possibly the MediaPlayer.
+     *
+     * @param releaseMediaPlayer Indicates whether the Media Player should also
+     *            be released or not
+     */
+    private void relaxResources(boolean releaseMediaPlayer) {
+        Log.d(TAG, "relaxResources. releaseMediaPlayer=" + releaseMediaPlayer);
+
+        mService.stopForeground(true);
+
+        // stop and release the Media Player, if it's available
+        if (releaseMediaPlayer && mMediaPlayer != null) {
+            mMediaPlayer.reset();
+            mMediaPlayer.release();
+            mMediaPlayer = null;
+        }
+
+        // we can also release the Wifi lock, if we're holding it
+        if (mWifiLock.isHeld()) {
+            mWifiLock.release();
+        }
+    }
+
+    private void registerAudioNoisyReceiver() {
+        if (!mAudioNoisyReceiverRegistered) {
+            mService.registerReceiver(mAudioNoisyReceiver, mAudioNoisyIntentFilter);
+            mAudioNoisyReceiverRegistered = true;
+        }
+    }
+
+    private void unregisterAudioNoisyReceiver() {
+        if (mAudioNoisyReceiverRegistered) {
+            mService.unregisterReceiver(mAudioNoisyReceiver);
+            mAudioNoisyReceiverRegistered = false;
+        }
+    }
+
+    interface Callback {
+        /**
+         * On current music completed.
+         */
+        void onCompletion();
+        /**
+         * on Playback status changed
+         * Implementations can use this callback to update
+         * playback state on the media sessions.
+         */
+        void onPlaybackStatusChanged(int state);
+
+        /**
+         * @param error to be added to the PlaybackState
+         */
+        void onError(String error);
+
+    }
+
+}
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/media/QueueAdapter.java b/samples/Support4Demos/src/com/example/android/supportv4/media/QueueAdapter.java
new file mode 100644
index 0000000..0702e2b
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/media/QueueAdapter.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv4.media;
+
+import com.example.android.supportv4.R;
+import android.app.Activity;
+import android.support.v4.media.session.MediaSessionCompat;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ArrayAdapter;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import java.util.ArrayList;
+
+/**
+ * A list adapter for items in a queue
+ */
+public class QueueAdapter extends ArrayAdapter<MediaSessionCompat.QueueItem> {
+
+    // The currently selected/active queue item Id.
+    private long mActiveQueueItemId = MediaSessionCompat.QueueItem.UNKNOWN_ID;
+
+    public QueueAdapter(Activity context) {
+        super(context, R.layout.media_list_item, new ArrayList<MediaSessionCompat.QueueItem>());
+    }
+
+    public void setActiveQueueItemId(long id) {
+        this.mActiveQueueItemId = id;
+    }
+
+    private static class ViewHolder {
+        ImageView mImageView;
+        TextView mTitleView;
+        TextView mDescriptionView;
+    }
+
+    public View getView(int position, View convertView, ViewGroup parent) {
+        ViewHolder holder;
+
+        if (convertView == null) {
+            convertView = LayoutInflater.from(getContext())
+                    .inflate(R.layout.media_list_item, parent, false);
+            holder = new ViewHolder();
+            holder.mImageView = (ImageView) convertView.findViewById(R.id.play_eq);
+            holder.mTitleView = (TextView) convertView.findViewById(R.id.title);
+            holder.mDescriptionView = (TextView) convertView.findViewById(R.id.description);
+            convertView.setTag(holder);
+        } else {
+            holder = (ViewHolder) convertView.getTag();
+        }
+
+        MediaSessionCompat.QueueItem item = getItem(position);
+        holder.mTitleView.setText(item.getDescription().getTitle());
+        if (item.getDescription().getDescription() != null) {
+            holder.mDescriptionView.setText(item.getDescription().getDescription());
+        }
+
+        // If the itemId matches the active Id then use a different icon
+        if (mActiveQueueItemId == item.getQueueId()) {
+            holder.mImageView.setImageDrawable(
+                    getContext().getResources().getDrawable(R.drawable.ic_equalizer_white_24dp));
+        } else {
+            holder.mImageView.setImageDrawable(
+                    getContext().getResources().getDrawable(R.drawable.ic_play_arrow_white_24dp));
+        }
+        return convertView;
+    }
+}
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/media/QueueFragment.java b/samples/Support4Demos/src/com/example/android/supportv4/media/QueueFragment.java
new file mode 100644
index 0000000..f66447d
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/media/QueueFragment.java
@@ -0,0 +1,304 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv4.media;
+
+import android.app.Fragment;
+import android.content.ComponentName;
+import android.os.Bundle;
+import android.os.RemoteException;
+import android.support.v4.media.MediaBrowserCompat;
+import android.support.v4.media.session.MediaControllerCompat;
+import android.support.v4.media.session.MediaSessionCompat;
+import android.support.v4.media.session.PlaybackStateCompat;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.AdapterView;
+import android.widget.ImageButton;
+import android.widget.ListView;
+
+import com.example.android.supportv4.R;
+
+import java.util.List;
+
+/**
+ * A class that shows the Media Queue to the user.
+ */
+public class QueueFragment extends Fragment {
+
+    private static final String TAG = "QueueFragment";
+
+    private ImageButton mSkipNext;
+    private ImageButton mSkipPrevious;
+    private ImageButton mPlayPause;
+
+    private MediaBrowserCompat mMediaBrowser;
+    private MediaControllerCompat.TransportControls mTransportControls;
+    private MediaControllerCompat mMediaController;
+    private PlaybackStateCompat mPlaybackState;
+
+    private QueueAdapter mQueueAdapter;
+
+    private MediaBrowserCompat.ConnectionCallback mConnectionCallback =
+            new MediaBrowserCompat.ConnectionCallback() {
+        @Override
+        public void onConnected() {
+            Log.d(TAG, "onConnected: session token " + mMediaBrowser.getSessionToken());
+
+            if (mMediaBrowser.getSessionToken() == null) {
+                throw new IllegalArgumentException("No Session token");
+            }
+
+            try {
+                mMediaController = new MediaControllerCompat(getActivity(),
+                        mMediaBrowser.getSessionToken());
+            } catch (RemoteException e) {
+                Log.e(TAG, "Failed to create MediaControllerCompat.", e);
+            }
+            mTransportControls = mMediaController.getTransportControls();
+            mMediaController.registerCallback(mSessionCallback);
+
+            ((MediaBrowserSupport) getActivity()).setMediaController(mMediaController);
+            mPlaybackState = mMediaController.getPlaybackState();
+
+            List<MediaSessionCompat.QueueItem> queue = mMediaController.getQueue();
+            if (queue != null) {
+                mQueueAdapter.clear();
+                mQueueAdapter.notifyDataSetInvalidated();
+                mQueueAdapter.addAll(queue);
+                mQueueAdapter.notifyDataSetChanged();
+            }
+            onPlaybackStateChanged(mPlaybackState);
+        }
+
+        @Override
+        public void onConnectionFailed() {
+            Log.d(TAG, "onConnectionFailed");
+        }
+
+        @Override
+        public void onConnectionSuspended() {
+            Log.d(TAG, "onConnectionSuspended");
+            mMediaController.unregisterCallback(mSessionCallback);
+            mTransportControls = null;
+            mMediaController = null;
+            getActivity().setMediaController(null);
+        }
+    };
+
+    // Receive callbacks from the MediaController. Here we update our state such as which queue
+    // is being shown, the current title and description and the PlaybackState.
+    private MediaControllerCompat.Callback mSessionCallback = new MediaControllerCompat.Callback() {
+
+        @Override
+        public void onSessionDestroyed() {
+            Log.d(TAG, "Session destroyed. Need to fetch a new Media Session");
+        }
+
+        @Override
+        public void onPlaybackStateChanged(PlaybackStateCompat state) {
+            if (state == null) {
+                return;
+            }
+            Log.d(TAG, "Received playback state change to state " + state.getState());
+            mPlaybackState = state;
+            QueueFragment.this.onPlaybackStateChanged(state);
+        }
+
+        @Override
+        public void onQueueChanged(List<MediaSessionCompat.QueueItem> queue) {
+            Log.d(TAG, "onQueueChanged " + queue);
+            if (queue != null) {
+                mQueueAdapter.clear();
+                mQueueAdapter.notifyDataSetInvalidated();
+                mQueueAdapter.addAll(queue);
+                mQueueAdapter.notifyDataSetChanged();
+            }
+        }
+    };
+
+    public static QueueFragment newInstance() {
+        return new QueueFragment();
+    }
+
+    @Override
+    public View onCreateView(LayoutInflater inflater, ViewGroup container,
+                             Bundle savedInstanceState) {
+        View rootView = inflater.inflate(R.layout.fragment_list, container, false);
+
+        mSkipPrevious = (ImageButton) rootView.findViewById(R.id.skip_previous);
+        mSkipPrevious.setEnabled(false);
+        mSkipPrevious.setOnClickListener(mButtonListener);
+
+        mSkipNext = (ImageButton) rootView.findViewById(R.id.skip_next);
+        mSkipNext.setEnabled(false);
+        mSkipNext.setOnClickListener(mButtonListener);
+
+        mPlayPause = (ImageButton) rootView.findViewById(R.id.play_pause);
+        mPlayPause.setEnabled(true);
+        mPlayPause.setOnClickListener(mButtonListener);
+
+        mQueueAdapter = new QueueAdapter(getActivity());
+
+        ListView mListView = (ListView) rootView.findViewById(R.id.list_view);
+        mListView.setAdapter(mQueueAdapter);
+        mListView.setFocusable(true);
+        mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
+            @Override
+            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+                MediaSessionCompat.QueueItem item = mQueueAdapter.getItem(position);
+                mTransportControls.skipToQueueItem(item.getQueueId());
+            }
+        });
+
+        mMediaBrowser = new MediaBrowserCompat(getActivity(),
+                new ComponentName(getActivity(), MediaBrowserServiceSupport.class),
+                mConnectionCallback, null);
+
+        return rootView;
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+        if (mMediaBrowser != null) {
+            mMediaBrowser.connect();
+        }
+    }
+
+    @Override
+    public void onPause() {
+        super.onPause();
+        if (mMediaController != null) {
+            mMediaController.unregisterCallback(mSessionCallback);
+        }
+        if (mMediaBrowser != null) {
+            mMediaBrowser.disconnect();
+        }
+    }
+
+
+    private void onPlaybackStateChanged(PlaybackStateCompat state) {
+        Log.d(TAG, "onPlaybackStateChanged " + state);
+        if (state == null) {
+            return;
+        }
+        mQueueAdapter.setActiveQueueItemId(state.getActiveQueueItemId());
+        mQueueAdapter.notifyDataSetChanged();
+        boolean enablePlay = false;
+        StringBuilder statusBuilder = new StringBuilder();
+        switch (state.getState()) {
+            case PlaybackStateCompat.STATE_PLAYING:
+                statusBuilder.append("playing");
+                enablePlay = false;
+                break;
+            case PlaybackStateCompat.STATE_PAUSED:
+                statusBuilder.append("paused");
+                enablePlay = true;
+                break;
+            case PlaybackStateCompat.STATE_STOPPED:
+                statusBuilder.append("ended");
+                enablePlay = true;
+                break;
+            case PlaybackStateCompat.STATE_ERROR:
+                statusBuilder.append("error: ").append(state.getErrorMessage());
+                break;
+            case PlaybackStateCompat.STATE_BUFFERING:
+                statusBuilder.append("buffering");
+                break;
+            case PlaybackStateCompat.STATE_NONE:
+                statusBuilder.append("none");
+                enablePlay = false;
+                break;
+            case PlaybackStateCompat.STATE_CONNECTING:
+                statusBuilder.append("connecting");
+                break;
+            default:
+                statusBuilder.append(mPlaybackState);
+        }
+        statusBuilder.append(" -- At position: ").append(state.getPosition());
+        Log.d(TAG, statusBuilder.toString());
+
+        if (enablePlay) {
+            mPlayPause.setImageDrawable(
+                    getActivity().getResources().getDrawable(R.drawable.ic_play_arrow_white_24dp));
+        } else {
+            mPlayPause.setImageDrawable(
+                    getActivity().getResources().getDrawable(R.drawable.ic_pause_white_24dp));
+        }
+
+        mSkipPrevious.setEnabled((state.getActions() & PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS)
+                != 0);
+        mSkipNext.setEnabled((state.getActions() & PlaybackStateCompat.ACTION_SKIP_TO_NEXT) != 0);
+
+        Log.d(TAG, "Queue From MediaController *** Title "
+                + mMediaController.getQueueTitle() + "\n: Queue: " + mMediaController.getQueue()
+                + "\n Metadata " + mMediaController.getMetadata());
+    }
+
+    private View.OnClickListener mButtonListener = new View.OnClickListener() {
+        @Override
+        public void onClick(View v) {
+            final int state = mPlaybackState == null ?
+                    PlaybackStateCompat.STATE_NONE : mPlaybackState.getState();
+            switch (v.getId()) {
+                case R.id.play_pause:
+                    Log.d(TAG, "Play button pressed, in state " + state);
+                    if (state == PlaybackStateCompat.STATE_PAUSED ||
+                            state == PlaybackStateCompat.STATE_STOPPED ||
+                            state == PlaybackStateCompat.STATE_NONE) {
+                        playMedia();
+                    } else if (state == PlaybackStateCompat.STATE_PLAYING) {
+                        pauseMedia();
+                    }
+                    break;
+                case R.id.skip_previous:
+                    Log.d(TAG, "Start button pressed, in state " + state);
+                    skipToPrevious();
+                    break;
+                case R.id.skip_next:
+                    skipToNext();
+                    break;
+            }
+        }
+    };
+
+    private void playMedia() {
+        if (mTransportControls != null) {
+            mTransportControls.play();
+        }
+    }
+
+    private void pauseMedia() {
+        if (mTransportControls != null) {
+            mTransportControls.pause();
+        }
+    }
+
+    private void skipToPrevious() {
+        if (mTransportControls != null) {
+            mTransportControls.skipToPrevious();
+        }
+    }
+
+    private void skipToNext() {
+        if (mTransportControls != null) {
+            mTransportControls.skipToNext();
+        }
+    }
+}
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/media/TransportControllerActivity.java b/samples/Support4Demos/src/com/example/android/supportv4/media/TransportControllerActivity.java
new file mode 100644
index 0000000..abb3c97
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/media/TransportControllerActivity.java
@@ -0,0 +1,307 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv4.media;
+
+//BEGIN_INCLUDE(complete)
+import android.support.v4.media.TransportMediator;
+import android.support.v4.media.TransportPerformer;
+import com.example.android.supportv4.R;
+
+import android.app.ActionBar;
+import android.content.Context;
+import android.media.MediaPlayer;
+import android.os.Handler;
+import android.util.AttributeSet;
+import android.view.KeyEvent;
+import android.view.View;
+
+import android.app.Activity;
+import android.net.Uri;
+import android.os.Bundle;
+import android.widget.VideoView;
+
+public class TransportControllerActivity extends Activity {
+
+    /**
+     * TODO: Set the path variable to a streaming video URL or a local media
+     * file path.
+     */
+    private Content mContent;
+    private TransportMediator mTransportMediator;
+    private MediaController mMediaController;
+
+    /**
+     * Handle actions from on-screen media controls.  Most of these are simple re-directs
+     * to the VideoView; some we need to capture to update our state.
+     */
+    TransportPerformer mTransportPerformer = new TransportPerformer() {
+        @Override public void onStart() {
+            mContent.start();
+        }
+
+        @Override public void onStop() {
+            mContent.pause();
+        }
+
+        @Override public void onPause() {
+            mContent.pause();
+        }
+
+        @Override public long onGetDuration() {
+            return mContent.getDuration();
+        }
+
+        @Override public long onGetCurrentPosition() {
+            return mContent.getCurrentPosition();
+        }
+
+        @Override public void onSeekTo(long pos) {
+            mContent.seekTo((int)pos);
+        }
+
+        @Override public boolean onIsPlaying() {
+            return mContent.isPlaying();
+        }
+
+        @Override public int onGetBufferPercentage() {
+            return mContent.getBufferPercentage();
+        }
+
+        @Override public int onGetTransportControlFlags() {
+            int flags = TransportMediator.FLAG_KEY_MEDIA_PLAY
+                    | TransportMediator.FLAG_KEY_MEDIA_PLAY_PAUSE
+                    | TransportMediator.FLAG_KEY_MEDIA_STOP;
+            if (mContent.canPause()) {
+                flags |= TransportMediator.FLAG_KEY_MEDIA_PAUSE;
+            }
+            if (mContent.canSeekBackward()) {
+                flags |= TransportMediator.FLAG_KEY_MEDIA_REWIND;
+            }
+            if (mContent.canSeekForward()) {
+                flags |= TransportMediator.FLAG_KEY_MEDIA_FAST_FORWARD;
+            }
+            return flags;
+        }
+    };
+
+    /**
+     * This is the actual video player.  It is the top-level content of
+     * the activity's view hierarchy, going under the status bar and nav
+     * bar areas.
+     */
+    public static class Content extends VideoView implements
+            View.OnSystemUiVisibilityChangeListener, View.OnClickListener,
+            ActionBar.OnMenuVisibilityListener, MediaPlayer.OnPreparedListener,
+            MediaPlayer.OnCompletionListener, MediaPlayer.OnErrorListener {
+        Activity mActivity;
+        TransportMediator mTransportMediator;
+        MediaController mMediaController;
+        boolean mAddedMenuListener;
+        boolean mMenusOpen;
+        boolean mPaused;
+        boolean mNavVisible;
+        int mLastSystemUiVis;
+
+        Runnable mNavHider = new Runnable() {
+            @Override public void run() {
+                setNavVisibility(false);
+            }
+        };
+
+        Runnable mProgressUpdater = new Runnable() {
+            @Override public void run() {
+                mMediaController.updateProgress();
+                getHandler().postDelayed(this, 1000);
+            }
+        };
+
+        public Content(Context context, AttributeSet attrs) {
+            super(context, attrs);
+            setOnSystemUiVisibilityChangeListener(this);
+            setOnClickListener(this);
+            setOnPreparedListener(this);
+            setOnCompletionListener(this);
+            setOnErrorListener(this);
+        }
+
+        public void init(Activity activity, TransportMediator transportMediator,
+                MediaController mediaController) {
+            // This called by the containing activity to supply the surrounding
+            // state of the video player that it will interact with.
+            mActivity = activity;
+            mTransportMediator = transportMediator;
+            mMediaController = mediaController;
+            pause();
+        }
+
+        @Override protected void onAttachedToWindow() {
+            super.onAttachedToWindow();
+            if (mActivity != null) {
+                mAddedMenuListener = true;
+                mActivity.getActionBar().addOnMenuVisibilityListener(this);
+            }
+        }
+
+        @Override protected void onDetachedFromWindow() {
+            super.onDetachedFromWindow();
+            if (mAddedMenuListener) {
+                mActivity.getActionBar().removeOnMenuVisibilityListener(this);
+            }
+            mNavVisible = false;
+        }
+
+        @Override public void onSystemUiVisibilityChange(int visibility) {
+            // Detect when we go out of nav-hidden mode, to clear our state
+            // back to having the full UI chrome up.  Only do this when
+            // the state is changing and nav is no longer hidden.
+            int diff = mLastSystemUiVis ^ visibility;
+            mLastSystemUiVis = visibility;
+            if ((diff&SYSTEM_UI_FLAG_HIDE_NAVIGATION) != 0
+                    && (visibility&SYSTEM_UI_FLAG_HIDE_NAVIGATION) == 0) {
+                setNavVisibility(true);
+            }
+        }
+
+        @Override protected void onWindowVisibilityChanged(int visibility) {
+            super.onWindowVisibilityChanged(visibility);
+
+            // When we become visible or invisible, play is paused.
+            pause();
+        }
+
+        @Override public void onClick(View v) {
+            // Clicking anywhere makes the navigation visible.
+            setNavVisibility(true);
+        }
+
+        @Override public void onMenuVisibilityChanged(boolean isVisible) {
+            mMenusOpen = isVisible;
+            setNavVisibility(true);
+        }
+
+        @Override
+        public void onPrepared(MediaPlayer mp) {
+            mMediaController.setEnabled(true);
+        }
+
+        @Override
+        public void onCompletion(MediaPlayer mp) {
+            mTransportMediator.pausePlaying();
+            pause();
+        }
+
+        @Override
+        public boolean onError(MediaPlayer mp, int what, int extra) {
+            mTransportMediator.pausePlaying();
+            pause();
+            return false;
+        }
+
+        @Override public void start() {
+            super.start();
+            mPaused = false;
+            setKeepScreenOn(true);
+            setNavVisibility(true);
+            mMediaController.refresh();
+            scheduleProgressUpdater();
+        }
+
+        @Override public void pause() {
+            super.pause();
+            mPaused = true;
+            setKeepScreenOn(false);
+            setNavVisibility(true);
+            mMediaController.refresh();
+            scheduleProgressUpdater();
+        }
+
+        void scheduleProgressUpdater() {
+            Handler h = getHandler();
+            if (h != null) {
+                if (mNavVisible && !mPaused) {
+                    h.removeCallbacks(mProgressUpdater);
+                    h.post(mProgressUpdater);
+                } else {
+                    h.removeCallbacks(mProgressUpdater);
+                }
+            }
+        }
+
+        void setNavVisibility(boolean visible) {
+            int newVis = SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
+                    | SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
+                    | SYSTEM_UI_FLAG_LAYOUT_STABLE;
+            if (!visible) {
+                newVis |= SYSTEM_UI_FLAG_LOW_PROFILE | SYSTEM_UI_FLAG_FULLSCREEN
+                        | SYSTEM_UI_FLAG_HIDE_NAVIGATION;
+            }
+
+            // If we are now visible, schedule a timer for us to go invisible.
+            if (visible) {
+                Handler h = getHandler();
+                if (h != null) {
+                    h.removeCallbacks(mNavHider);
+                    if (!mMenusOpen && !mPaused) {
+                        // If the menus are open or play is paused, we will not auto-hide.
+                        h.postDelayed(mNavHider, 3000);
+                    }
+                }
+            }
+
+            // Set the new desired visibility.
+            setSystemUiVisibility(newVis);
+            mNavVisible = visible;
+            mMediaController.setVisibility(visible ? VISIBLE : INVISIBLE);
+            scheduleProgressUpdater();
+        }
+    }
+
+    @Override
+    public void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+        setContentView(R.layout.videoview);
+
+        // Find the video player in our UI.
+        mContent = (Content) findViewById(R.id.content);
+
+        // Create transport controller to control video, giving the callback
+        // interface to receive actions from.
+        mTransportMediator = new TransportMediator(this, mTransportPerformer);
+
+        // Create and initialize the media control UI.
+        mMediaController = (MediaController) findViewById(R.id.media_controller);
+        mMediaController.setMediaPlayer(mTransportMediator);
+
+        // We're just playing a built-in demo video.
+        mContent.init(this, mTransportMediator, mMediaController);
+        mContent.setVideoURI(Uri.parse("android.resource://" + getPackageName() +
+                "/" + R.raw.videoviewdemo));
+    }
+
+    @Override
+    public boolean dispatchKeyEvent(KeyEvent event) {
+        // We first dispatch keys to the transport controller -- we want it
+        // to get to consume any media keys rather than letting whoever has focus
+        // in the view hierarchy to potentially eat it.
+        if (mTransportMediator.dispatchKeyEvent(event)) {
+            return true;
+        }
+
+        return super.dispatchKeyEvent(event);
+    }
+}
+//END_INCLUDE(complete)
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/media/model/MusicProvider.java b/samples/Support4Demos/src/com/example/android/supportv4/media/model/MusicProvider.java
new file mode 100644
index 0000000..777ca8d
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/media/model/MusicProvider.java
@@ -0,0 +1,324 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv4.media.model;
+
+import android.os.AsyncTask;
+import android.support.v4.media.MediaMetadataCompat;
+import android.util.Log;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.net.URL;
+import java.net.URLConnection;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+
+/**
+ * Utility class to get a list of MusicTrack's based on a server-side JSON
+ * configuration.
+ */
+public class MusicProvider {
+
+    private static final String TAG = "MusicProvider";
+
+    private static final String CATALOG_URL =
+        "http://storage.googleapis.com/automotive-media/music.json";
+
+    public static final String CUSTOM_METADATA_TRACK_SOURCE = "__SOURCE__";
+
+    private static final String JSON_MUSIC = "music";
+    private static final String JSON_TITLE = "title";
+    private static final String JSON_ALBUM = "album";
+    private static final String JSON_ARTIST = "artist";
+    private static final String JSON_GENRE = "genre";
+    private static final String JSON_SOURCE = "source";
+    private static final String JSON_IMAGE = "image";
+    private static final String JSON_TRACK_NUMBER = "trackNumber";
+    private static final String JSON_TOTAL_TRACK_COUNT = "totalTrackCount";
+    private static final String JSON_DURATION = "duration";
+
+    // Categorized caches for music track data:
+    private ConcurrentMap<String, List<MediaMetadataCompat>> mMusicListByGenre;
+    private final ConcurrentMap<String, MutableMediaMetadata> mMusicListById;
+
+    private final Set<String> mFavoriteTracks;
+
+    enum State {
+        NON_INITIALIZED, INITIALIZING, INITIALIZED
+    }
+
+    private volatile State mCurrentState = State.NON_INITIALIZED;
+
+    public interface Callback {
+        void onMusicCatalogReady(boolean success);
+    }
+
+    public MusicProvider() {
+        mMusicListByGenre = new ConcurrentHashMap<>();
+        mMusicListById = new ConcurrentHashMap<>();
+        mFavoriteTracks = Collections.newSetFromMap(new ConcurrentHashMap<String, Boolean>());
+    }
+
+    /**
+     * Get an iterator over the list of genres
+     *
+     * @return genres
+     */
+    public Iterable<String> getGenres() {
+        if (mCurrentState != State.INITIALIZED) {
+            return Collections.emptyList();
+        }
+        return mMusicListByGenre.keySet();
+    }
+
+    /**
+     * Get music tracks of the given genre
+     *
+     */
+    public Iterable<MediaMetadataCompat> getMusicsByGenre(String genre) {
+        if (mCurrentState != State.INITIALIZED || !mMusicListByGenre.containsKey(genre)) {
+            return Collections.emptyList();
+        }
+        return mMusicListByGenre.get(genre);
+    }
+
+    /**
+     * Very basic implementation of a search that filter music tracks which title containing
+     * the given query.
+     *
+     */
+    public Iterable<MediaMetadataCompat> searchMusic(String titleQuery) {
+        if (mCurrentState != State.INITIALIZED) {
+            return Collections.emptyList();
+        }
+        ArrayList<MediaMetadataCompat> result = new ArrayList<>();
+        titleQuery = titleQuery.toLowerCase();
+        for (MutableMediaMetadata track : mMusicListById.values()) {
+            if (track.metadata.getString(MediaMetadataCompat.METADATA_KEY_TITLE).toLowerCase()
+                    .contains(titleQuery)) {
+                result.add(track.metadata);
+            }
+        }
+        return result;
+    }
+
+    /**
+     * Return the MediaMetadata for the given musicID.
+     *
+     * @param musicId The unique, non-hierarchical music ID.
+     */
+    public MediaMetadataCompat getMusic(String musicId) {
+        return mMusicListById.containsKey(musicId) ? mMusicListById.get(musicId).metadata : null;
+    }
+
+    public synchronized void updateMusic(String musicId, MediaMetadataCompat metadata) {
+        MutableMediaMetadata track = mMusicListById.get(musicId);
+        if (track == null) {
+            return;
+        }
+
+        String oldGenre = track.metadata.getString(MediaMetadataCompat.METADATA_KEY_GENRE);
+        String newGenre = metadata.getString(MediaMetadataCompat.METADATA_KEY_GENRE);
+
+        track.metadata = metadata;
+
+        // if genre has changed, we need to rebuild the list by genre
+        if (!oldGenre.equals(newGenre)) {
+            buildListsByGenre();
+        }
+    }
+
+    public void setFavorite(String musicId, boolean favorite) {
+        if (favorite) {
+            mFavoriteTracks.add(musicId);
+        } else {
+            mFavoriteTracks.remove(musicId);
+        }
+    }
+
+    public boolean isFavorite(String musicId) {
+        return mFavoriteTracks.contains(musicId);
+    }
+
+    public boolean isInitialized() {
+        return mCurrentState == State.INITIALIZED;
+    }
+
+    /**
+     * Get the list of music tracks from a server and caches the track information
+     * for future reference, keying tracks by musicId and grouping by genre.
+     */
+    public void retrieveMediaAsync(final Callback callback) {
+        Log.d(TAG, "retrieveMediaAsync called");
+        if (mCurrentState == State.INITIALIZED) {
+            // Nothing to do, execute callback immediately
+            callback.onMusicCatalogReady(true);
+            return;
+        }
+
+        // Asynchronously load the music catalog in a separate thread
+        new AsyncTask<Void, Void, State>() {
+            @Override
+            protected State doInBackground(Void... params) {
+                retrieveMedia();
+                return mCurrentState;
+            }
+
+            @Override
+            protected void onPostExecute(State current) {
+                if (callback != null) {
+                    callback.onMusicCatalogReady(current == State.INITIALIZED);
+                }
+            }
+        }.execute();
+    }
+
+    private synchronized void buildListsByGenre() {
+        ConcurrentMap<String, List<MediaMetadataCompat>> newMusicListByGenre = new ConcurrentHashMap<>();
+
+        for (MutableMediaMetadata m : mMusicListById.values()) {
+            String genre = m.metadata.getString(MediaMetadataCompat.METADATA_KEY_GENRE);
+            List<MediaMetadataCompat> list = newMusicListByGenre.get(genre);
+            if (list == null) {
+                list = new ArrayList<>();
+                newMusicListByGenre.put(genre, list);
+            }
+            list.add(m.metadata);
+        }
+        mMusicListByGenre = newMusicListByGenre;
+    }
+
+    private synchronized void retrieveMedia() {
+        try {
+            if (mCurrentState == State.NON_INITIALIZED) {
+                mCurrentState = State.INITIALIZING;
+
+                int slashPos = CATALOG_URL.lastIndexOf('/');
+                String path = CATALOG_URL.substring(0, slashPos + 1);
+                JSONObject jsonObj = fetchJSONFromUrl(CATALOG_URL);
+                if (jsonObj == null) {
+                    return;
+                }
+                JSONArray tracks = jsonObj.getJSONArray(JSON_MUSIC);
+                if (tracks != null) {
+                    for (int j = 0; j < tracks.length(); j++) {
+                        MediaMetadataCompat item = buildFromJSON(tracks.getJSONObject(j), path);
+                        String musicId = item.getString(MediaMetadataCompat.METADATA_KEY_MEDIA_ID);
+                        mMusicListById.put(musicId, new MutableMediaMetadata(musicId, item));
+                    }
+                    buildListsByGenre();
+                }
+                mCurrentState = State.INITIALIZED;
+            }
+        } catch (JSONException e) {
+            Log.e(TAG, "Could not retrieve music list", e);
+        } finally {
+            if (mCurrentState != State.INITIALIZED) {
+                // Something bad happened, so we reset state to NON_INITIALIZED to allow
+                // retries (eg if the network connection is temporary unavailable)
+                mCurrentState = State.NON_INITIALIZED;
+            }
+        }
+    }
+
+    private MediaMetadataCompat buildFromJSON(JSONObject json, String basePath) throws JSONException {
+        String title = json.getString(JSON_TITLE);
+        String album = json.getString(JSON_ALBUM);
+        String artist = json.getString(JSON_ARTIST);
+        String genre = json.getString(JSON_GENRE);
+        String source = json.getString(JSON_SOURCE);
+        String iconUrl = json.getString(JSON_IMAGE);
+        int trackNumber = json.getInt(JSON_TRACK_NUMBER);
+        int totalTrackCount = json.getInt(JSON_TOTAL_TRACK_COUNT);
+        int duration = json.getInt(JSON_DURATION) * 1000; // ms
+
+        Log.d(TAG, "Found music track: " + json);
+
+        // Media is stored relative to JSON file
+        if (!source.startsWith("http")) {
+            source = basePath + source;
+        }
+        if (!iconUrl.startsWith("http")) {
+            iconUrl = basePath + iconUrl;
+        }
+        // Since we don't have a unique ID in the server, we fake one using the hashcode of
+        // the music source. In a real world app, this could come from the server.
+        String id = String.valueOf(source.hashCode());
+
+        // Adding the music source to the MediaMetadata (and consequently using it in the
+        // mediaSession.setMetadata) is not a good idea for a real world music app, because
+        // the session metadata can be accessed by notification listeners. This is done in this
+        // sample for convenience only.
+        return new MediaMetadataCompat.Builder()
+                .putString(MediaMetadataCompat.METADATA_KEY_MEDIA_ID, id)
+                .putString(CUSTOM_METADATA_TRACK_SOURCE, source)
+                .putString(MediaMetadataCompat.METADATA_KEY_ALBUM, album)
+                .putString(MediaMetadataCompat.METADATA_KEY_ARTIST, artist)
+                .putLong(MediaMetadataCompat.METADATA_KEY_DURATION, duration)
+                .putString(MediaMetadataCompat.METADATA_KEY_GENRE, genre)
+                .putString(MediaMetadataCompat.METADATA_KEY_ALBUM_ART_URI, iconUrl)
+                .putString(MediaMetadataCompat.METADATA_KEY_TITLE, title)
+                .putLong(MediaMetadataCompat.METADATA_KEY_TRACK_NUMBER, trackNumber)
+                .putLong(MediaMetadataCompat.METADATA_KEY_NUM_TRACKS, totalTrackCount)
+                .build();
+    }
+
+    /**
+     * Download a JSON file from a server, parse the content and return the JSON
+     * object.
+     *
+     * @return result JSONObject containing the parsed representation.
+     */
+    private JSONObject fetchJSONFromUrl(String urlString) {
+        InputStream is = null;
+        try {
+            URL url = new URL(urlString);
+            URLConnection urlConnection = url.openConnection();
+            is = new BufferedInputStream(urlConnection.getInputStream());
+            BufferedReader reader = new BufferedReader(new InputStreamReader(
+                    urlConnection.getInputStream(), "iso-8859-1"));
+            StringBuilder sb = new StringBuilder();
+            String line;
+            while ((line = reader.readLine()) != null) {
+                sb.append(line);
+            }
+            return new JSONObject(sb.toString());
+        } catch (Exception e) {
+            Log.e(TAG, "Failed to parse the json for media list", e);
+            return null;
+        } finally {
+            if (is != null) {
+                try {
+                    is.close();
+                } catch (IOException e) {
+                    // ignore
+                }
+            }
+        }
+    }
+}
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/media/model/MutableMediaMetadata.java b/samples/Support4Demos/src/com/example/android/supportv4/media/model/MutableMediaMetadata.java
new file mode 100644
index 0000000..50ce107
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/media/model/MutableMediaMetadata.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv4.media.model;
+
+import android.support.v4.media.MediaMetadataCompat;
+import android.text.TextUtils;
+
+/**
+ * Holder class that encapsulates a MediaMetadata and allows the actual metadata to be modified
+ * without requiring to rebuild the collections the metadata is in.
+ */
+public class MutableMediaMetadata {
+
+    public MediaMetadataCompat metadata;
+    public final String trackId;
+
+    public MutableMediaMetadata(String trackId, MediaMetadataCompat metadata) {
+        this.metadata = metadata;
+        this.trackId = trackId;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || o.getClass() != MutableMediaMetadata.class) {
+            return false;
+        }
+
+        MutableMediaMetadata that = (MutableMediaMetadata) o;
+
+        return TextUtils.equals(trackId, that.trackId);
+    }
+
+    @Override
+    public int hashCode() {
+        return trackId.hashCode();
+    }
+}
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/media/utils/BitmapHelper.java b/samples/Support4Demos/src/com/example/android/supportv4/media/utils/BitmapHelper.java
new file mode 100644
index 0000000..ededa11
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/media/utils/BitmapHelper.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv4.media.utils;
+
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.util.Log;
+
+import java.io.BufferedInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.HttpURLConnection;
+import java.net.URL;
+
+public class BitmapHelper {
+    private static final String TAG = "BitmapHelper";
+
+    // Max read limit that we allow our input stream to mark/reset.
+    private static final int MAX_READ_LIMIT_PER_IMG = 1024 * 1024;
+
+    public static Bitmap scaleBitmap(Bitmap src, int maxWidth, int maxHeight) {
+       double scaleFactor = Math.min(
+           ((double) maxWidth)/src.getWidth(), ((double) maxHeight)/src.getHeight());
+        return Bitmap.createScaledBitmap(src,
+            (int) (src.getWidth() * scaleFactor), (int) (src.getHeight() * scaleFactor), false);
+    }
+
+    public static Bitmap scaleBitmap(int scaleFactor, InputStream is) {
+        // Get the dimensions of the bitmap
+        BitmapFactory.Options bmOptions = new BitmapFactory.Options();
+
+        // Decode the image file into a Bitmap sized to fill the View
+        bmOptions.inJustDecodeBounds = false;
+        bmOptions.inSampleSize = scaleFactor;
+
+        return BitmapFactory.decodeStream(is, null, bmOptions);
+    }
+
+    public static int findScaleFactor(int targetW, int targetH, InputStream is) {
+        // Get the dimensions of the bitmap
+        BitmapFactory.Options bmOptions = new BitmapFactory.Options();
+        bmOptions.inJustDecodeBounds = true;
+        BitmapFactory.decodeStream(is, null, bmOptions);
+        int actualW = bmOptions.outWidth;
+        int actualH = bmOptions.outHeight;
+
+        // Determine how much to scale down the image
+        return Math.min(actualW/targetW, actualH/targetH);
+    }
+
+    @SuppressWarnings("SameParameterValue")
+    public static Bitmap fetchAndRescaleBitmap(String uri, int width, int height)
+            throws IOException {
+        URL url = new URL(uri);
+        BufferedInputStream is = null;
+        try {
+            HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
+            is = new BufferedInputStream(urlConnection.getInputStream());
+            is.mark(MAX_READ_LIMIT_PER_IMG);
+            int scaleFactor = findScaleFactor(width, height, is);
+            Log.d(TAG, "Scaling bitmap " + uri + " by factor " + scaleFactor + " to support "
+                    + width + "x" + height + "requested dimension");
+            is.reset();
+            return scaleBitmap(scaleFactor, is);
+        } finally {
+            if (is != null) {
+                is.close();
+            }
+        }
+    }
+}
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/media/utils/CarHelper.java b/samples/Support4Demos/src/com/example/android/supportv4/media/utils/CarHelper.java
new file mode 100644
index 0000000..d2b94cd
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/media/utils/CarHelper.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv4.media.utils;
+
+import android.os.Bundle;
+
+public class CarHelper {
+    private static final String AUTO_APP_PACKAGE_NAME = "com.google.android.projection.gearhead";
+
+    // Use these extras to reserve space for the corresponding actions, even when they are disabled
+    // in the playbackstate, so the custom actions don't reflow.
+    private static final String SLOT_RESERVATION_SKIP_TO_NEXT =
+            "com.google.android.gms.car.media.ALWAYS_RESERVE_SPACE_FOR.ACTION_SKIP_TO_NEXT";
+    private static final String SLOT_RESERVATION_SKIP_TO_PREV =
+            "com.google.android.gms.car.media.ALWAYS_RESERVE_SPACE_FOR.ACTION_SKIP_TO_PREVIOUS";
+    private static final String SLOT_RESERVATION_QUEUE =
+            "com.google.android.gms.car.media.ALWAYS_RESERVE_SPACE_FOR.ACTION_QUEUE";
+
+
+    public static boolean isValidCarPackage(String packageName) {
+        return AUTO_APP_PACKAGE_NAME.equals(packageName);
+    }
+
+    public static void setSlotReservationFlags(Bundle extras, boolean reservePlayingQueueSlot,
+          boolean reserveSkipToNextSlot, boolean reserveSkipToPrevSlot) {
+        if (reservePlayingQueueSlot) {
+            extras.putBoolean(SLOT_RESERVATION_QUEUE, true);
+        } else {
+            extras.remove(SLOT_RESERVATION_QUEUE);
+        }
+        if (reserveSkipToPrevSlot) {
+            extras.putBoolean(SLOT_RESERVATION_SKIP_TO_PREV, true);
+        } else {
+            extras.remove(SLOT_RESERVATION_SKIP_TO_PREV);
+        }
+        if (reserveSkipToNextSlot) {
+            extras.putBoolean(SLOT_RESERVATION_SKIP_TO_NEXT, true);
+        } else {
+            extras.remove(SLOT_RESERVATION_SKIP_TO_NEXT);
+        }
+    }
+}
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/media/utils/MediaIDHelper.java b/samples/Support4Demos/src/com/example/android/supportv4/media/utils/MediaIDHelper.java
new file mode 100644
index 0000000..8baaaf2
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/media/utils/MediaIDHelper.java
@@ -0,0 +1,115 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv4.media.utils;
+
+import java.util.Arrays;
+
+/**
+ * Utility class to help on queue related tasks.
+ */
+public class MediaIDHelper {
+
+    private static final String TAG = "MediaIDHelper";
+
+    // Media IDs used on browseable items of MediaBrowser
+    public static final String MEDIA_ID_ROOT = "__ROOT__";
+    public static final String MEDIA_ID_MUSICS_BY_GENRE = "__BY_GENRE__";
+    public static final String MEDIA_ID_MUSICS_BY_SEARCH = "__BY_SEARCH__";
+
+    private static final char CATEGORY_SEPARATOR = '/';
+    private static final char LEAF_SEPARATOR = '|';
+
+    public static String createMediaID(String musicID, String... categories) {
+        // MediaIDs are of the form <categoryType>/<categoryValue>|<musicUniqueId>, to make it easy
+        // to find the category (like genre) that a music was selected from, so we
+        // can correctly build the playing queue. This is specially useful when
+        // one music can appear in more than one list, like "by genre -> genre_1"
+        // and "by artist -> artist_1".
+        StringBuilder sb = new StringBuilder();
+        if (categories != null && categories.length > 0) {
+            sb.append(categories[0]);
+            for (int i=1; i < categories.length; i++) {
+                sb.append(CATEGORY_SEPARATOR).append(categories[i]);
+            }
+        }
+        if (musicID != null) {
+            sb.append(LEAF_SEPARATOR).append(musicID);
+        }
+        return sb.toString();
+    }
+
+    public static String createBrowseCategoryMediaID(String categoryType, String categoryValue) {
+        return categoryType + CATEGORY_SEPARATOR + categoryValue;
+    }
+
+    /**
+     * Extracts unique musicID from the mediaID. mediaID is, by this sample's convention, a
+     * concatenation of category (eg "by_genre"), categoryValue (eg "Classical") and unique
+     * musicID. This is necessary so we know where the user selected the music from, when the music
+     * exists in more than one music list, and thus we are able to correctly build the playing queue.
+     *
+     * @param mediaID that contains the musicID
+     * @return musicID
+     */
+    public static String extractMusicIDFromMediaID(String mediaID) {
+        int pos = mediaID.indexOf(LEAF_SEPARATOR);
+        if (pos >= 0) {
+            return mediaID.substring(pos+1);
+        }
+        return null;
+    }
+
+    /**
+     * Extracts category and categoryValue from the mediaID. mediaID is, by this sample's
+     * convention, a concatenation of category (eg "by_genre"), categoryValue (eg "Classical") and
+     * mediaID. This is necessary so we know where the user selected the music from, when the music
+     * exists in more than one music list, and thus we are able to correctly build the playing queue.
+     *
+     * @param mediaID that contains a category and categoryValue.
+     */
+    public static String[] getHierarchy(String mediaID) {
+        int pos = mediaID.indexOf(LEAF_SEPARATOR);
+        if (pos >= 0) {
+            mediaID = mediaID.substring(0, pos);
+        }
+        return mediaID.split(String.valueOf(CATEGORY_SEPARATOR));
+    }
+
+    public static String extractBrowseCategoryValueFromMediaID(String mediaID) {
+        String[] hierarchy = getHierarchy(mediaID);
+        if (hierarchy != null && hierarchy.length == 2) {
+            return hierarchy[1];
+        }
+        return null;
+    }
+
+    private static boolean isBrowseable(String mediaID) {
+        return mediaID.indexOf(LEAF_SEPARATOR) < 0;
+    }
+
+    public static String getParentMediaID(String mediaID) {
+        String[] hierarchy = getHierarchy(mediaID);
+        if (!isBrowseable(mediaID)) {
+            return createMediaID(null, hierarchy);
+        }
+        if (hierarchy == null || hierarchy.length <= 1) {
+            return MEDIA_ID_ROOT;
+        }
+        String[] parentHierarchy = Arrays.copyOf(hierarchy, hierarchy.length-1);
+        return createMediaID(null, parentHierarchy);
+    }
+}
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/media/utils/QueueHelper.java b/samples/Support4Demos/src/com/example/android/supportv4/media/utils/QueueHelper.java
new file mode 100644
index 0000000..b78a195
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/media/utils/QueueHelper.java
@@ -0,0 +1,150 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv4.media.utils;
+
+import android.support.v4.media.MediaMetadataCompat;
+import android.support.v4.media.session.MediaSessionCompat;
+import android.util.Log;
+
+import com.example.android.supportv4.media.model.MusicProvider;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+
+import static com.example.android.supportv4.media.utils.MediaIDHelper.MEDIA_ID_MUSICS_BY_GENRE;
+import static com.example.android.supportv4.media.utils.MediaIDHelper.MEDIA_ID_MUSICS_BY_SEARCH;
+
+/**
+ * Utility class to help on queue related tasks.
+ */
+public class QueueHelper {
+
+    private static final String TAG = "QueueHelper";
+
+    public static List<MediaSessionCompat.QueueItem> getPlayingQueue(String mediaId,
+            MusicProvider musicProvider) {
+
+        // extract the browsing hierarchy from the media ID:
+        String[] hierarchy = MediaIDHelper.getHierarchy(mediaId);
+
+        if (hierarchy.length != 2) {
+            Log.e(TAG, "Could not build a playing queue for this mediaId: " + mediaId);
+            return null;
+        }
+
+        String categoryType = hierarchy[0];
+        String categoryValue = hierarchy[1];
+        Log.d(TAG, "Creating playing queue for " + categoryType + ",  " + categoryValue);
+
+        Iterable<MediaMetadataCompat> tracks = null;
+        // This sample only supports genre and by_search category types.
+        if (categoryType.equals(MEDIA_ID_MUSICS_BY_GENRE)) {
+            tracks = musicProvider.getMusicsByGenre(categoryValue);
+        } else if (categoryType.equals(MEDIA_ID_MUSICS_BY_SEARCH)) {
+            tracks = musicProvider.searchMusic(categoryValue);
+        }
+
+        if (tracks == null) {
+            Log.e(TAG, "Unrecognized category type: " + categoryType + " for mediaId " + mediaId);
+            return null;
+        }
+
+        return convertToQueue(tracks, hierarchy[0], hierarchy[1]);
+    }
+
+    public static List<MediaSessionCompat.QueueItem> getPlayingQueueFromSearch(String query,
+            MusicProvider musicProvider) {
+
+        Log.d(TAG, "Creating playing queue for musics from search " + query);
+
+        return convertToQueue(musicProvider.searchMusic(query), MEDIA_ID_MUSICS_BY_SEARCH, query);
+    }
+
+
+    public static int getMusicIndexOnQueue(Iterable<MediaSessionCompat.QueueItem> queue,
+             String mediaId) {
+        int index = 0;
+        for (MediaSessionCompat.QueueItem item : queue) {
+            if (mediaId.equals(item.getDescription().getMediaId())) {
+                return index;
+            }
+            index++;
+        }
+        return -1;
+    }
+
+    public static int getMusicIndexOnQueue(Iterable<MediaSessionCompat.QueueItem> queue,
+             long queueId) {
+        int index = 0;
+        for (MediaSessionCompat.QueueItem item : queue) {
+            if (queueId == item.getQueueId()) {
+                return index;
+            }
+            index++;
+        }
+        return -1;
+    }
+
+    private static List<MediaSessionCompat.QueueItem> convertToQueue(
+            Iterable<MediaMetadataCompat> tracks, String... categories) {
+        List<MediaSessionCompat.QueueItem> queue = new ArrayList<>();
+        int count = 0;
+        for (MediaMetadataCompat track : tracks) {
+
+            // We create a hierarchy-aware mediaID, so we know what the queue is about by looking
+            // at the QueueItem media IDs.
+            String hierarchyAwareMediaID = MediaIDHelper.createMediaID(
+                    track.getDescription().getMediaId(), categories);
+
+            MediaMetadataCompat trackCopy = new MediaMetadataCompat.Builder(track)
+                    .putString(MediaMetadataCompat.METADATA_KEY_MEDIA_ID, hierarchyAwareMediaID)
+                    .build();
+
+            // We don't expect queues to change after created, so we use the item index as the
+            // queueId. Any other number unique in the queue would work.
+            MediaSessionCompat.QueueItem item = new MediaSessionCompat.QueueItem(
+                    trackCopy.getDescription(), count++);
+            queue.add(item);
+        }
+        return queue;
+
+    }
+
+    /**
+     * Create a random queue. For simplicity sake, instead of a random queue, we create a
+     * queue using the first genre.
+     *
+     * @param musicProvider the provider used for fetching music.
+     * @return list containing {@link android.media.session.MediaSession.QueueItem}'s
+     */
+    public static List<MediaSessionCompat.QueueItem> getRandomQueue(MusicProvider musicProvider) {
+        Iterator<String> genres = musicProvider.getGenres().iterator();
+        if (!genres.hasNext()) {
+            return Collections.emptyList();
+        }
+        String genre = genres.next();
+        Iterable<MediaMetadataCompat> tracks = musicProvider.getMusicsByGenre(genre);
+
+        return convertToQueue(tracks, MEDIA_ID_MUSICS_BY_GENRE, genre);
+    }
+
+    public static boolean isIndexPlayable(int index, List<MediaSessionCompat.QueueItem> queue) {
+        return (queue != null && index >= 0 && index < queue.size());
+    }
+}
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/media/utils/ResourceHelper.java b/samples/Support4Demos/src/com/example/android/supportv4/media/utils/ResourceHelper.java
new file mode 100644
index 0000000..3546a11
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/media/utils/ResourceHelper.java
@@ -0,0 +1,53 @@
+/*
+* Copyright (C) 2015 The Android Open Source Project
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+*      http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+package com.example.android.supportv4.media.utils;
+
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.content.res.Resources;
+import android.content.res.TypedArray;
+
+/**
+ * Generic reusable methods to handle resources.
+ */
+public class ResourceHelper {
+    /**
+     * Get a color value from a theme attribute.
+     * @param context used for getting the color.
+     * @param attribute theme attribute.
+     * @param defaultColor default to use.
+     * @return color value
+     */
+    public static int getThemeColor(Context context, int attribute, int defaultColor) {
+        int themeColor = 0;
+        String packageName = context.getPackageName();
+        try {
+            Context packageContext = context.createPackageContext(packageName, 0);
+            ApplicationInfo applicationInfo =
+                context.getPackageManager().getApplicationInfo(packageName, 0);
+            packageContext.setTheme(applicationInfo.theme);
+            Resources.Theme theme = packageContext.getTheme();
+            TypedArray ta = theme.obtainStyledAttributes(new int[] {attribute});
+            themeColor = ta.getColor(0, defaultColor);
+            ta.recycle();
+        } catch (PackageManager.NameNotFoundException e) {
+            e.printStackTrace();
+        }
+        return themeColor;
+    }
+}
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/text/BidiFormatterSupport.java b/samples/Support4Demos/src/com/example/android/supportv4/text/BidiFormatterSupport.java
new file mode 100644
index 0000000..168a8b6
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/text/BidiFormatterSupport.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv4.text;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+import android.support.v4.text.BidiFormatter;
+import android.widget.TextView;
+import com.example.android.supportv4.R;
+
+/**
+ * This example illustrates a common usage of the BidiFormatter in the Android support library.
+ */
+public class BidiFormatterSupport extends Activity {
+
+    private static String text = "%s הוא עסוק";
+    private static String phone = "+1 650 253 0000";
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        setContentView(R.layout.bidiformater_support);
+
+        String formattedText = String.format(text, phone);
+
+        TextView tv_sample = (TextView) findViewById(R.id.textview_without_bidiformatter);
+        tv_sample.setText(formattedText);
+
+        TextView tv_bidiformatter = (TextView) findViewById(R.id.textview_with_bidiformatter);
+        String wrappedPhone = BidiFormatter.getInstance(true /* rtlContext */).unicodeWrap(phone);
+        formattedText = String.format(text, wrappedPhone);
+        tv_bidiformatter.setText(formattedText);
+    }
+}
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/view/CheckableFrameLayout.java b/samples/Support4Demos/src/com/example/android/supportv4/view/CheckableFrameLayout.java
new file mode 100644
index 0000000..c559cf6
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/view/CheckableFrameLayout.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv4.view;
+
+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/Support4Demos/src/com/example/android/supportv4/view/ViewPagerActivity.java b/samples/Support4Demos/src/com/example/android/supportv4/view/ViewPagerActivity.java
new file mode 100644
index 0000000..5150363
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/view/ViewPagerActivity.java
@@ -0,0 +1,110 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv4.view;
+
+import com.example.android.supportv4.R;
+
+import android.app.Activity;
+import android.graphics.Color;
+import android.os.Bundle;
+import android.support.v4.view.PagerAdapter;
+import android.support.v4.view.PagerTitleStrip;
+import android.support.v4.view.ViewPager;
+import android.util.Pair;
+import android.view.View;
+import android.view.ViewGroup;
+
+import java.util.ArrayList;
+
+public class ViewPagerActivity extends Activity {
+    private ViewPager mPager;
+    private PagerTitleStrip mTitles;
+    private ColorPagerAdapter mAdapter;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        setContentView(R.layout.view_pager_layout);
+
+        mAdapter = new ColorPagerAdapter();
+        mAdapter.add("Red", Color.RED);
+        mAdapter.add("Green", Color.GREEN);
+        mAdapter.add("Blue", Color.BLUE);
+
+        mPager = (ViewPager) findViewById(R.id.pager);
+        mPager.setAdapter(mAdapter);
+
+        mTitles = (PagerTitleStrip) findViewById(R.id.titles);
+    }
+
+    private static class ColorPagerAdapter extends PagerAdapter {
+        private ArrayList<Pair<String, Integer>> mEntries = new ArrayList<>();
+
+        public void add(String title, int color) {
+            mEntries.add(new Pair(title, color));
+        }
+
+        @Override
+        public int getCount() {
+            return mEntries.size();
+        }
+
+        @Override
+        public Object instantiateItem(ViewGroup container, int position) {
+            final View view = new View(container.getContext());
+            view.setBackgroundColor(mEntries.get(position).second);
+
+            // Unlike ListView adapters, the ViewPager adapter is responsible
+            // for adding the view to the container.
+            container.addView(view);
+
+            return new ViewHolder(view, position);
+        }
+
+        @Override
+        public void destroyItem(ViewGroup container, int position, Object object) {
+            // The adapter is also responsible for removing the view.
+            container.removeView(((ViewHolder) object).view);
+        }
+
+        @Override
+        public int getItemPosition(Object object) {
+            return ((ViewHolder) object).position;
+        }
+
+        @Override
+        public boolean isViewFromObject(View view, Object object) {
+            return ((ViewHolder) object).view == view;
+        }
+
+        @Override
+        public CharSequence getPageTitle(int position) {
+            return mEntries.get(position).first;
+        }
+
+        private static class ViewHolder {
+            final View view;
+            final int position;
+
+            public ViewHolder(View view, int position) {
+                this.view = view;
+                this.position = position;
+            }
+        }
+    }
+}
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/widget/BaseSwipeRefreshLayoutActivity.java b/samples/Support4Demos/src/com/example/android/supportv4/widget/BaseSwipeRefreshLayoutActivity.java
new file mode 100644
index 0000000..1403a94
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/widget/BaseSwipeRefreshLayoutActivity.java
@@ -0,0 +1,135 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv4.widget;
+
+import com.example.android.supportv4.R;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.os.Handler;
+import android.support.annotation.LayoutRes;
+import android.support.v4.widget.SwipeRefreshLayout;
+import android.support.v4.widget.SwipeRefreshLayout.OnRefreshListener;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+import android.view.View;
+import android.widget.ArrayAdapter;
+import android.widget.ListView;
+
+/**
+ * Example of using the SwipeRefreshLayout.
+ */
+abstract class BaseSwipeRefreshLayoutActivity extends Activity implements OnRefreshListener {
+
+    public static final String[] TITLES = {
+            "Henry IV (1)",
+            "Henry V",
+            "Henry VIII",
+            "Richard II",
+            "Richard III",
+            "Merchant of Venice",
+            "Othello",
+            "King Lear",
+            "Henry IV (1)",
+            "Henry V",
+            "Henry VIII",
+            "Richard II",
+            "Richard III",
+            "Merchant of Venice",
+            "Othello",
+            "King Lear",
+            "Henry IV (1)",
+            "Henry V",
+            "Henry VIII",
+            "Richard II",
+            "Richard III",
+            "Merchant of Venice",
+            "Othello",
+            "King Lear",
+            "Henry IV (1)",
+            "Henry V",
+            "Henry VIII",
+            "Richard II",
+            "Richard III",
+            "Merchant of Venice",
+            "Othello",
+            "King Lear"
+    };
+
+    // Try a SUPER quick refresh to make sure we don't get extra refreshes
+    // while the user's finger is still down.
+    private static final boolean SUPER_QUICK_REFRESH = false;
+
+    private SwipeRefreshLayout mSwipeRefreshWidget;
+
+    private final Handler mHandler = new Handler();
+
+    private final Runnable mRefreshDone = new Runnable() {
+        @Override
+        public void run() {
+            mSwipeRefreshWidget.setRefreshing(false);
+        }
+
+    };
+
+    @Override
+    public void onCreate(Bundle bundle) {
+        super.onCreate(bundle);
+        setContentView(getLayoutId());
+
+        mSwipeRefreshWidget = (SwipeRefreshLayout) findViewById(R.id.swipe_refresh_widget);
+        mSwipeRefreshWidget.setColorSchemeResources(R.color.color1, R.color.color2, R.color.color3,
+                R.color.color4);
+        mSwipeRefreshWidget.setOnRefreshListener(this);
+    }
+
+    @LayoutRes
+    protected abstract int getLayoutId();
+
+    @Override
+    public void onRefresh() {
+        refresh();
+    }
+
+    @Override
+    public boolean onCreateOptionsMenu(Menu menu) {
+        MenuInflater inflater = getMenuInflater();
+        inflater.inflate(R.menu.swipe_refresh_menu, menu);
+        return true;
+    }
+
+    /**
+     * Click handler for the menu item to force a refresh.
+     */
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+        final int id = item.getItemId();
+        switch(id) {
+            case R.id.force_refresh:
+                mSwipeRefreshWidget.setRefreshing(true);
+                refresh();
+                return true;
+        }
+        return false;
+    }
+
+    private void refresh() {
+        mHandler.removeCallbacks(mRefreshDone);
+        mHandler.postDelayed(mRefreshDone, 1000);
+    }
+}
\ No newline at end of file
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/widget/ContentLoadingProgressBarActivity.java b/samples/Support4Demos/src/com/example/android/supportv4/widget/ContentLoadingProgressBarActivity.java
new file mode 100644
index 0000000..08c14dc
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/widget/ContentLoadingProgressBarActivity.java
@@ -0,0 +1,109 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv4.widget;
+
+import android.app.Activity;
+import android.widget.Button;
+import android.widget.LinearLayout;
+import android.widget.ProgressBar;
+import android.widget.TextView;
+import android.os.Bundle;
+import android.os.Handler;
+import android.support.v4.widget.ContentLoadingProgressBar;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.view.ViewTreeObserver;
+import android.view.Window;
+
+import com.example.android.supportv4.R;
+
+/**
+ * Demonstrates how to use the ContentLoadingProgressBar. By default, the
+ * developer should start the ContentLoadingProgressBar with visibility of
+ * "gone" or "invisible". The ContentLoadingProgressBar will be shown after the
+ * default delay for at least a minimum time regardless of when the "hide"
+ * button is pressed.
+ */
+public class ContentLoadingProgressBarActivity extends Activity implements
+        OnClickListener, ViewTreeObserver.OnGlobalLayoutListener {
+
+    private Button mShowButton;
+    private Button mHideButton;
+    private ContentLoadingProgressBar mBar;
+    private long mShowTime;
+    private long mHideTime;
+    private TextView mShowText;
+    private TextView mShowTextDone;
+    private TextView mHideText;
+    private TextView mHideTextDone;
+    private int mLastVisibility;
+    private long mVisibilityChangedTime;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.content_loading_progressbar);
+
+        mBar = (ContentLoadingProgressBar)findViewById(R.id.progressbar);
+        mShowButton = (Button)findViewById(R.id.show);
+        mShowButton.setOnClickListener(this);
+        mHideButton = (Button)findViewById(R.id.hide);
+        mHideButton.setOnClickListener(this);
+
+        mShowText = (TextView)findViewById(R.id.show_text);
+        mShowTextDone = (TextView)findViewById(R.id.show_text_done);
+        mHideText = (TextView)findViewById(R.id.hide_text);
+        mHideTextDone = (TextView)findViewById(R.id.hide_text_done);
+
+        mLastVisibility = mBar.getVisibility();
+
+        mBar.getViewTreeObserver().addOnGlobalLayoutListener(this);
+    }
+
+    @Override
+    public void onClick(View v) {
+        switch (v.getId()) {
+            case R.id.show:
+                mBar.show();
+                mShowTime = System.currentTimeMillis();
+                mShowText.setText("Show clicked at " + mShowTime);
+                break;
+            case R.id.hide:
+                mBar.hide();
+                mHideTime = System.currentTimeMillis();
+                mHideText.setText("Hide clicked at " + mHideTime);
+                break;
+        }
+    }
+
+    @Override
+    public void onGlobalLayout() {
+        final int visibility = mBar.getVisibility();
+
+        if (mLastVisibility != visibility) {
+            if (visibility == View.VISIBLE) {
+                mVisibilityChangedTime = System.currentTimeMillis();
+                mShowTextDone.setText("Shown at "
+                    + (mVisibilityChangedTime - mShowTime));
+            } else {
+                mHideTextDone.setText("Hidden after "
+                    + (System.currentTimeMillis() - mVisibilityChangedTime));
+            }
+            mLastVisibility = mBar.getVisibility();
+        }
+    }
+}
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/widget/ExploreByTouchHelperActivity.java b/samples/Support4Demos/src/com/example/android/supportv4/widget/ExploreByTouchHelperActivity.java
new file mode 100644
index 0000000..946de01
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/widget/ExploreByTouchHelperActivity.java
@@ -0,0 +1,326 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv4.widget;
+
+import android.annotation.TargetApi;
+import android.app.Activity;
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.graphics.Paint.Align;
+import android.graphics.Paint.Style;
+import android.graphics.Rect;
+import android.graphics.RectF;
+import android.os.Build;
+import android.os.Bundle;
+import android.support.v4.view.ViewCompat;
+import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat;
+import android.support.v4.view.accessibility.AccessibilityNodeProviderCompat;
+import android.support.v4.widget.ExploreByTouchHelper;
+import android.util.AttributeSet;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.accessibility.AccessibilityEvent;
+import com.example.android.supportv4.R;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * This example shows how to use the {@link ExploreByTouchHelper} class in the
+ * Android support library to add accessibility support to a custom view that
+ * represents multiple logical items.
+ * <p>
+ * The {@link ExploreByTouchHelper} class wraps
+ * {@link AccessibilityNodeProviderCompat} and simplifies exposing information
+ * about a custom view's logical structure to accessibility services.
+ * <p>
+ * The custom view in this example is responsible for:
+ * <ul>
+ * <li>Creating a helper class that extends {@link ExploreByTouchHelper}
+ * <li>Setting the helper as the accessibility delegate using
+ * {@link ViewCompat#setAccessibilityDelegate}
+ * <li>Dispatching hover events to the helper in {@link View#dispatchHoverEvent}
+ * </ul>
+ * <p>
+ * The helper class implementation in this example is responsible for:
+ * <ul>
+ * <li>Mapping hover event coordinates to logical items
+ * <li>Exposing information about logical items to accessibility services
+ * <li>Handling accessibility actions
+ * <ul>
+ */
+public class ExploreByTouchHelperActivity extends Activity {
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        setContentView(R.layout.explore_by_touch_helper);
+
+        final CustomView customView = (CustomView) findViewById(R.id.custom_view);
+
+        // Adds an item at the top-left quarter of the custom view.
+        customView.addItem(getString(R.string.sample_item_a), 0, 0, 0.5f, 0.5f);
+
+        // Adds an item at the bottom-right quarter of the custom view.
+        customView.addItem(getString(R.string.sample_item_b), 0.5f, 0.5f, 1, 1);
+    }
+
+    /**
+     * Simple custom view that draws rectangular items to the screen. Each item
+     * has a checked state that may be toggled by tapping on the item.
+     */
+    public static class CustomView extends View {
+        private static final int NO_ITEM = -1;
+
+        private final Paint mPaint = new Paint();
+        private final Rect mTempBounds = new Rect();
+        private final List<CustomItem> mItems = new ArrayList<CustomItem>();
+        private CustomViewTouchHelper mTouchHelper;
+
+        public CustomView(Context context, AttributeSet attrs) {
+            super(context, attrs);
+
+            // Set up accessibility helper class.
+            mTouchHelper = new CustomViewTouchHelper(this);
+            ViewCompat.setAccessibilityDelegate(this, mTouchHelper);
+        }
+
+        @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
+        @Override
+        public boolean dispatchHoverEvent(MotionEvent event) {
+            // Always attempt to dispatch hover events to accessibility first.
+            if (mTouchHelper.dispatchHoverEvent(event)) {
+                return true;
+            }
+
+            return super.dispatchHoverEvent(event);
+        }
+
+        @Override
+        public boolean onTouchEvent(MotionEvent event) {
+            switch (event.getAction()) {
+                case MotionEvent.ACTION_DOWN:
+                    return true;
+                case MotionEvent.ACTION_UP:
+                    final int itemIndex = getItemIndexUnder(event.getX(), event.getY());
+                    if (itemIndex >= 0) {
+                        onItemClicked(itemIndex);
+                    }
+                    return true;
+            }
+
+            return super.onTouchEvent(event);
+        }
+
+        /**
+         * Adds an item to the custom view. The item is positioned relative to
+         * the custom view bounds and its descriptions is drawn at its center.
+         *
+         * @param description The item's description.
+         * @param top Top coordinate as a fraction of the parent height, range
+         *            is [0,1].
+         * @param left Left coordinate as a fraction of the parent width, range
+         *            is [0,1].
+         * @param bottom Bottom coordinate as a fraction of the parent height,
+         *            range is [0,1].
+         * @param right Right coordinate as a fraction of the parent width,
+         *            range is [0,1].
+         */
+        public void addItem(String description, float top, float left, float bottom, float right) {
+            final CustomItem item = new CustomItem();
+            item.bounds = new RectF(top, left, bottom, right);
+            item.description = description;
+            item.checked = false;
+            mItems.add(item);
+        }
+
+        @Override
+        protected void onDraw(Canvas canvas) {
+            super.onDraw(canvas);
+
+            final Paint paint = mPaint;
+            final Rect bounds = mTempBounds;
+            final int height = getHeight();
+            final int width = getWidth();
+
+            for (CustomItem item : mItems) {
+                paint.setColor(item.checked ? Color.RED : Color.BLUE);
+                paint.setStyle(Style.FILL);
+                scaleRectF(item.bounds, bounds, width, height);
+                canvas.drawRect(bounds, paint);
+                paint.setColor(Color.WHITE);
+                paint.setTextAlign(Align.CENTER);
+                canvas.drawText(item.description, bounds.centerX(), bounds.centerY(), paint);
+            }
+        }
+
+        protected boolean onItemClicked(int index) {
+            final CustomItem item = getItem(index);
+            if (item == null) {
+                return false;
+            }
+
+            item.checked = !item.checked;
+            invalidate();
+
+            // Since the item's checked state is exposed to accessibility
+            // services through its AccessibilityNodeInfo, we need to invalidate
+            // the item's virtual view. At some point in the future, the
+            // framework will obtain an updated version of the virtual view.
+            mTouchHelper.invalidateVirtualView(index);
+
+            // We also need to let the framework know what type of event
+            // happened. Accessibility services may use this event to provide
+            // appropriate feedback to the user.
+            mTouchHelper.sendEventForVirtualView(index, AccessibilityEvent.TYPE_VIEW_CLICKED);
+
+            return true;
+        }
+
+        protected int getItemIndexUnder(float x, float y) {
+            final float scaledX = (x / getWidth());
+            final float scaledY = (y / getHeight());
+            final int n = mItems.size();
+
+            for (int i = 0; i < n; i++) {
+                final CustomItem item = mItems.get(i);
+                if (item.bounds.contains(scaledX, scaledY)) {
+                    return i;
+                }
+            }
+
+            return NO_ITEM;
+        }
+
+        protected CustomItem getItem(int index) {
+            if ((index < 0) || (index >= mItems.size())) {
+                return null;
+            }
+
+            return mItems.get(index);
+        }
+
+        protected static void scaleRectF(RectF in, Rect out, int width, int height) {
+            out.top = (int) (in.top * height);
+            out.bottom = (int) (in.bottom * height);
+            out.left = (int) (in.left * width);
+            out.right = (int) (in.right * width);
+        }
+
+        private class CustomViewTouchHelper extends ExploreByTouchHelper {
+            private final Rect mTempRect = new Rect();
+
+            public CustomViewTouchHelper(View forView) {
+                super(forView);
+            }
+
+            @Override
+            protected int getVirtualViewAt(float x, float y) {
+                // We also perform hit detection in onTouchEvent(), and we can
+                // reuse that logic here. This will ensure consistency whether
+                // accessibility is on or off.
+                final int index = getItemIndexUnder(x, y);
+                if (index == NO_ITEM) {
+                    return ExploreByTouchHelper.INVALID_ID;
+                }
+
+                return index;
+            }
+
+            @Override
+            protected void getVisibleVirtualViews(List<Integer> virtualViewIds) {
+                // Since every item should be visible, and since we're mapping
+                // directly from item index to virtual view id, we can just add
+                // every available index in the item list.
+                final int n = mItems.size();
+                for (int i = 0; i < n; i++) {
+                    virtualViewIds.add(i);
+                }
+            }
+
+            @Override
+            protected void onPopulateEventForVirtualView(
+                    int virtualViewId, AccessibilityEvent event) {
+                final CustomItem item = getItem(virtualViewId);
+                if (item == null) {
+                    throw new IllegalArgumentException("Invalid virtual view id");
+                }
+
+                // The event must be populated with text, either using
+                // getText().add() or setContentDescription(). Since the item's
+                // description is displayed visually, we'll add it to the event
+                // text. If it was only used for accessibility, we would use
+                // setContentDescription().
+                event.getText().add(item.description);
+            }
+
+            @Override
+            protected void onPopulateNodeForVirtualView(
+                    int virtualViewId, AccessibilityNodeInfoCompat node) {
+                final CustomItem item = getItem(virtualViewId);
+                if (item == null) {
+                    throw new IllegalArgumentException("Invalid virtual view id");
+                }
+
+                // Node and event text and content descriptions are usually
+                // identical, so we'll use the exact same string as before.
+                node.setText(item.description);
+
+                // Reported bounds should be consistent with those used to draw
+                // the item in onDraw(). They should also be consistent with the
+                // hit detection performed in getVirtualViewAt() and
+                // onTouchEvent().
+                final Rect bounds = mTempRect;
+                final int height = getHeight();
+                final int width = getWidth();
+                scaleRectF(item.bounds, bounds, width, height);
+                node.setBoundsInParent(bounds);
+
+                // Since the user can tap an item, add the CLICK action. We'll
+                // need to handle this later in onPerformActionForVirtualView.
+                node.addAction(AccessibilityNodeInfoCompat.ACTION_CLICK);
+
+                // This item has a checked state.
+                node.setCheckable(true);
+                node.setChecked(item.checked);
+            }
+
+            @Override
+            protected boolean onPerformActionForVirtualView(
+                    int virtualViewId, int action, Bundle arguments) {
+                switch (action) {
+                    case AccessibilityNodeInfoCompat.ACTION_CLICK:
+                        // Click handling should be consistent with
+                        // onTouchEvent(). This ensures that the view works the
+                        // same whether accessibility is turned on or off.
+                        return onItemClicked(virtualViewId);
+                }
+
+                return false;
+            }
+
+        }
+
+        public static class CustomItem {
+            private String description;
+            private RectF bounds;
+            private boolean checked;
+        }
+    }
+}
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/widget/NestedScrollActivity.java b/samples/Support4Demos/src/com/example/android/supportv4/widget/NestedScrollActivity.java
new file mode 100644
index 0000000..87a31fc
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/widget/NestedScrollActivity.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+package com.example.android.supportv4.widget;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+import com.example.android.supportv4.R;
+
+/**
+ * This activity demonstrates the use of nested scrolling in the v4 support library.
+ * See the associated layout file for details.
+ */
+public class NestedScrollActivity extends Activity {
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.nested_scroll);
+    }
+}
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/widget/SlidingPaneLayoutActivity.java b/samples/Support4Demos/src/com/example/android/supportv4/widget/SlidingPaneLayoutActivity.java
new file mode 100644
index 0000000..f26e038
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/widget/SlidingPaneLayoutActivity.java
@@ -0,0 +1,222 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+package com.example.android.supportv4.widget;
+
+import android.app.ActionBar;
+import android.app.Activity;
+import android.os.Build;
+import android.os.Bundle;
+import android.support.v4.widget.SlidingPaneLayout;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewTreeObserver;
+import android.widget.AdapterView;
+import android.widget.ArrayAdapter;
+import android.widget.ListView;
+import android.widget.TextView;
+import com.example.android.supportv4.Shakespeare;
+import com.example.android.supportv4.R;
+
+/**
+ * This example illustrates a common usage of SlidingPaneLayout in the Android support library.
+ *
+ * <p>A SlidingPaneLayout should be positioned at the top of your view hierarchy, placing it
+ * below the action bar but above your content views. It is ideal as a two-pane layout
+ * for larger screens, used in place of a horizontal LinearLayout.</p>
+ *
+ * <p>What separates SlidingPaneLayout from LinearLayout in this usage is that SlidingPaneLayout
+ * allows these wide, two-pane layouts to overlap when horizontal space is at a premium. The user
+ * can then access both panes by physically sliding the content pane into view or out of the way
+ * or implicitly by moving focus between the two panes. This can greatly simplify development
+ * of Android apps that support multiple form factors and screen sizes.</p>
+ *
+ * <p>When it comes to your navigation hierarchy, the left pane of a SlidingPaneLayout is always
+ * considered to be one level up from the right content pane. As such, your Action Bar's
+ * Up navigation should be enabled if the right pane is obscuring the left pane, and invoking it
+ * should open the panes, revealing the left pane for normal interaction. From this open state
+ * where the left pane is in primary focus, the Action Bar's Up affordance should act as if
+ * both panes were fully visible in the activity window and navigate to the activity one level up
+ * in the app's logical hierarchy. If the activity is the root of the application's task, the up
+ * affordance should be disabled when the sliding pane is open and showing the left pane.
+ * This code example illustrates this root activity case.</p>
+ *
+ * <p>Note that SlidingPaneLayout differs in usage from DrawerLayout. While DrawerLayout offers
+ * sliding utility drawers for extended navigation options and actions, the panes of a
+ * SlidingPaneLayout are firmly part of the content itself. If it would not make sense for
+ * both panes to be visible all the time on a sufficiently wide screen, DrawerLayout and its
+ * associated patterns are likely to be a better choice for your usage.</p>
+ */
+public class SlidingPaneLayoutActivity extends Activity {
+    private SlidingPaneLayout mSlidingLayout;
+    private ListView mList;
+    private TextView mContent;
+
+    private ActionBarHelper mActionBar;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        setContentView(R.layout.sliding_pane_layout);
+
+        mSlidingLayout = (SlidingPaneLayout) findViewById(R.id.sliding_pane_layout);
+        mList = (ListView) findViewById(R.id.left_pane);
+        mContent = (TextView) findViewById(R.id.content_text);
+
+        mSlidingLayout.setPanelSlideListener(new SliderListener());
+        mSlidingLayout.openPane();
+
+        mList.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,
+                Shakespeare.TITLES));
+        mList.setOnItemClickListener(new ListItemClickListener());
+
+        mActionBar = createActionBarHelper();
+        mActionBar.init();
+
+        mSlidingLayout.getViewTreeObserver().addOnGlobalLayoutListener(new FirstLayoutListener());
+    }
+
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+        /*
+         * The action bar up action should open the slider if it is currently closed,
+         * as the left pane contains content one level up in the navigation hierarchy.
+         */
+        if (item.getItemId() == android.R.id.home && !mSlidingLayout.isOpen()) {
+            mSlidingLayout.smoothSlideOpen();
+            return true;
+        }
+        return super.onOptionsItemSelected(item);
+    }
+
+    /**
+     * This list item click listener implements very simple view switching by changing
+     * the primary content text. The slider is closed when a selection is made to fully
+     * reveal the content.
+     */
+    private class ListItemClickListener implements ListView.OnItemClickListener {
+        @Override
+        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+            mContent.setText(Shakespeare.DIALOGUE[position]);
+            mActionBar.setTitle(Shakespeare.TITLES[position]);
+            mSlidingLayout.smoothSlideClosed();
+        }
+    }
+
+    /**
+     * This panel slide listener updates the action bar accordingly for each panel state.
+     */
+    private class SliderListener extends SlidingPaneLayout.SimplePanelSlideListener {
+        @Override
+        public void onPanelOpened(View panel) {
+            mActionBar.onPanelOpened();
+        }
+
+        @Override
+        public void onPanelClosed(View panel) {
+            mActionBar.onPanelClosed();
+        }
+    }
+
+    /**
+     * This global layout listener is used to fire an event after first layout occurs
+     * and then it is removed. This gives us a chance to configure parts of the UI
+     * that adapt based on available space after they have had the opportunity to measure
+     * and layout.
+     */
+    private class FirstLayoutListener implements ViewTreeObserver.OnGlobalLayoutListener {
+        @Override
+        public void onGlobalLayout() {
+            mActionBar.onFirstLayout();
+            mSlidingLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this);
+        }
+    }
+
+    /**
+     * Create a compatible helper that will manipulate the action bar if available.
+     */
+    private ActionBarHelper createActionBarHelper() {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
+            return new ActionBarHelperICS();
+        } else {
+            return new ActionBarHelper();
+        }
+    }
+
+    /**
+     * Stub action bar helper; this does nothing.
+     */
+    private class ActionBarHelper {
+        public void init() {}
+        public void onPanelClosed() {}
+        public void onPanelOpened() {}
+        public void onFirstLayout() {}
+        public void setTitle(CharSequence title) {}
+    }
+
+    /**
+     * Action bar helper for use on ICS and newer devices.
+     */
+    private class ActionBarHelperICS extends ActionBarHelper {
+        private final ActionBar mActionBar;
+        private CharSequence mDrawerTitle;
+        private CharSequence mTitle;
+
+        ActionBarHelperICS() {
+            mActionBar = getActionBar();
+        }
+
+        @Override
+        public void init() {
+            mActionBar.setDisplayHomeAsUpEnabled(true);
+            mActionBar.setHomeButtonEnabled(true);
+            mTitle = mDrawerTitle = getTitle();
+        }
+
+        @Override
+        public void onPanelClosed() {
+            super.onPanelClosed();
+            mActionBar.setDisplayHomeAsUpEnabled(true);
+            mActionBar.setHomeButtonEnabled(true);
+            mActionBar.setTitle(mTitle);
+        }
+
+        @Override
+        public void onPanelOpened() {
+            super.onPanelOpened();
+            mActionBar.setHomeButtonEnabled(false);
+            mActionBar.setDisplayHomeAsUpEnabled(false);
+            mActionBar.setTitle(mDrawerTitle);
+        }
+
+        @Override
+        public void onFirstLayout() {
+            if (mSlidingLayout.canSlide() && !mSlidingLayout.isOpen()) {
+                onPanelClosed();
+            } else {
+                onPanelOpened();
+            }
+        }
+
+        @Override
+        public void setTitle(CharSequence title) {
+            mTitle = title;
+        }
+    }
+
+}
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/widget/SwipeRefreshLayoutActivityList.java b/samples/Support4Demos/src/com/example/android/supportv4/widget/SwipeRefreshLayoutActivityList.java
new file mode 100644
index 0000000..8d6bef3
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/widget/SwipeRefreshLayoutActivityList.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv4.widget;
+
+import com.example.android.supportv4.R;
+
+import android.os.Bundle;
+import android.widget.ArrayAdapter;
+import android.widget.ListView;
+
+
+public class SwipeRefreshLayoutActivityList extends BaseSwipeRefreshLayoutActivity {
+
+    private ListView mList;
+
+    @Override
+    public void onCreate(Bundle bundle) {
+        super.onCreate(bundle);
+
+        mList = (ListView) findViewById(R.id.content);
+        ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>(this,
+                android.R.layout.simple_list_item_1, android.R.id.text1, TITLES);
+        mList.setAdapter(arrayAdapter);
+    }
+
+    @Override
+    protected int getLayoutId() {
+        return R.layout.swipe_refresh_widget_listview;
+    }
+}
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/widget/SwipeRefreshLayoutActivityNestedScrollView.java b/samples/Support4Demos/src/com/example/android/supportv4/widget/SwipeRefreshLayoutActivityNestedScrollView.java
new file mode 100644
index 0000000..bf5ee6f
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/widget/SwipeRefreshLayoutActivityNestedScrollView.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv4.widget;
+
+import com.example.android.supportv4.R;
+
+public class SwipeRefreshLayoutActivityNestedScrollView extends BaseSwipeRefreshLayoutActivity {
+
+    @Override
+    protected int getLayoutId() {
+        return R.layout.swipe_refresh_widget_nestedscrolling;
+    }
+
+}
diff --git a/samples/Support4Demos/src/com/example/android/supportv4/widget/SwipeRefreshLayoutActivityTextView.java b/samples/Support4Demos/src/com/example/android/supportv4/widget/SwipeRefreshLayoutActivityTextView.java
new file mode 100644
index 0000000..83a93d2
--- /dev/null
+++ b/samples/Support4Demos/src/com/example/android/supportv4/widget/SwipeRefreshLayoutActivityTextView.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv4.widget;
+
+import com.example.android.supportv4.R;
+
+public class SwipeRefreshLayoutActivityTextView extends BaseSwipeRefreshLayoutActivity {
+
+    @Override
+    protected int getLayoutId() {
+        return R.layout.swipe_refresh_widget_textview;
+    }
+
+}
diff --git a/samples/Support7Demos/Android.mk b/samples/Support7Demos/Android.mk
new file mode 100644
index 0000000..fbea278
--- /dev/null
+++ b/samples/Support7Demos/Android.mk
@@ -0,0 +1,36 @@
+# Copyright (C) 2013 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+LOCAL_PATH:= $(call my-dir)
+
+# Build the samples.
+include $(CLEAR_VARS)
+LOCAL_USE_AAPT2 := true
+LOCAL_PACKAGE_NAME := Support7Demos
+LOCAL_MODULE_TAGS := samples tests
+LOCAL_SDK_VERSION := current
+LOCAL_MIN_SDK_VERSION := 7
+LOCAL_DEX_PREOPT := false
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+LOCAL_STATIC_ANDROID_LIBRARIES := \
+    android-support-v7-appcompat \
+    android-support-v7-gridlayout \
+    android-support-v7-mediarouter \
+    android-support-v7-cardview \
+    android-support-design \
+    android-support-v7-recyclerview \
+    android-support-v7-palette \
+    android-support-v4
+LOCAL_AAPT_FLAGS := --no-version-vectors
+include $(BUILD_PACKAGE)
diff --git a/samples/Support7Demos/AndroidManifest.xml b/samples/Support7Demos/AndroidManifest.xml
new file mode 100644
index 0000000..a75879e
--- /dev/null
+++ b/samples/Support7Demos/AndroidManifest.xml
@@ -0,0 +1,507 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<!-- 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"
+    package="com.example.android.supportv7">
+    <!-- Permission for INTERNET is required for streaming video content
+         from the web, it's not required otherwise. -->
+    <uses-permission android:name="android.permission.INTERNET" />
+    <!-- Permission for SYSTEM_ALERT_WINDOW is only required for emulating
+         remote display using system alert window. -->
+    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
+    <!-- Permission for READ_EXTERNAL_STORAGE is explicitly required for
+         reading images from the media store from API v19+. -->
+    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
+
+    <!-- Permission for ACCESS_COARSE_LOCATION is required for DayNight themes. -->
+    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
+
+    <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="21" />
+
+    <!-- The smallest screen this app works on is a phone.  The app will
+         scale its UI to larger screens but doesn't make good use of them
+         so allow the compatibility mode button to be shown (mostly because
+         this is just convenient for testing). -->
+    <supports-screens android:requiresSmallestWidthDp="320"
+            android:compatibleWidthLimitDp="480" />
+
+    <application android:label="@string/activity_sample_code"
+            android:supportsRtl="true"
+            android:icon="@drawable/app_sample_code"
+            android:hardwareAccelerated="true">
+
+        <activity android:name="Support7Demos">
+            <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>
+        <receiver android:name="com.example.android.supportv7.media.SampleMediaButtonReceiver">
+            <intent-filter>
+                <action android:name="android.intent.action.MEDIA_BUTTON" />
+            </intent-filter>
+        </receiver>
+        <!-- MediaRouter Support Samples -->
+
+        <activity android:name=".media.SampleMediaRouterActivity"
+                android:configChanges="orientation|screenSize"
+                android:label="@string/sample_media_router_activity_dark"
+                android:theme="@style/Theme.SampleMediaRouter">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".media.SampleMediaRouterActivity$Light"
+                android:configChanges="orientation|screenSize"
+                android:label="@string/sample_media_router_activity_light"
+                android:theme="@style/Theme.SampleMediaRouter.Light">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".media.SampleMediaRouterActivity$LightWithDarkActionBar"
+                android:configChanges="orientation|screenSize"
+                android:label="@string/sample_media_router_activity_light_with_dark_action_bar"
+                android:theme="@style/Theme.SampleMediaRouter.Light.DarkActionBar">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".media.SampleMediaRouteSettingsActivity"
+                android:label="@string/sample_media_route_settings_activity"
+                android:theme="@style/Theme.AppCompat.Light">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+            </intent-filter>
+        </activity>
+
+        <service android:name=".media.SampleMediaRouteProviderService"
+                android:label="@string/sample_media_route_provider_service"
+                android:process=":mrp">
+            <intent-filter>
+                <action android:name="android.media.MediaRouteProviderService" />
+            </intent-filter>
+        </service>
+
+        <!-- GridLayout Support Samples -->
+
+        <activity android:name=".view.GridLayout1"
+                android:label="@string/grid_layout_1">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".view.GridLayout2"
+                android:label="@string/grid_layout_2">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".view.GridLayout3"
+                android:label="@string/grid_layout_3">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <!-- Action Bar Samples -->
+        <activity android:name=".app.ActionBarMechanics"
+                android:label="@string/action_bar_mechanics"
+                android:theme="@style/Theme.AppCompat">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".app.SearchActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.SEARCH" />
+            </intent-filter>
+
+            <meta-data android:name="android.app.searchable"
+                       android:resource="@xml/searchable" />
+
+        </activity>
+
+        <activity android:name=".app.ActionBarUsage"
+                android:label="@string/action_bar_usage"
+                android:theme="@style/Theme.AppCompat">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".app.ActionBarDisplayOptions"
+                android:label="@string/action_bar_display_options"
+                android:logo="@drawable/apidemo_androidlogo"
+                android:theme="@style/Theme.AppCompat">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".app.ActionBarTabs"
+                android:label="@string/action_bar_tabs"
+                android:theme="@style/Theme.Custom">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".app.ActionBarSettingsActionProviderActivity"
+                android:label="@string/action_bar_settings_action_provider"
+                android:theme="@style/Theme.AppCompat.Light.DarkActionBar">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".app.ActionBarShareActionProvider"
+                  android:label="@string/action_bar_share_action_provider"
+                  android:theme="@style/Theme.AppCompat.Light.DarkActionBar">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".app.ActionBarFragmentMenu"
+                android:label="@string/action_bar_fragment_menu"
+                android:theme="@style/Theme.AppCompat">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".app.ActionBarPreferences"
+                  android:label="@string/action_bar_preferences"
+                  android:theme="@style/Theme.AppCompat">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".app.ActionBarActionMode"
+                  android:label="@string/action_bar_action_mode"
+                  android:theme="@style/Theme.Custom">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".app.ActionBarHideOnScroll"
+                  android:label="@string/action_bar_hide_scroll"
+                  android:theme="@style/Theme.AppCompat.Light.DarkActionBar">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".app.AppCompatWidgetsButtons"
+                  android:label="@string/appcompat_widgets_buttons"
+                  android:theme="@style/Theme.AppCompat.Light.DarkActionBar">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".app.AppCompatWidgetsSpinners"
+                  android:label="@string/appcompat_widgets_spinners"
+                  android:theme="@style/Theme.AppCompat.Light.DarkActionBar">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".app.AppCompatWidgetsTextInput"
+                  android:label="@string/appcompat_widgets_text_input"
+                  android:theme="@style/Theme.AppCompat.Light.DarkActionBar">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".app.ToolbarUsage"
+                  android:label="@string/toolbar_usage"
+                  android:theme="@style/Theme.Custom.NoActionBar">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+            </intent-filter>
+
+            <meta-data
+                    android:name="android.app.default_searchable"
+                    android:value=".app.SearchActivity" />
+        </activity>
+
+        <activity android:name=".app.ToolbarDisplayOptions"
+                  android:label="@string/toolbar_display_options"
+                  android:theme="@style/Theme.AppCompat.Light.NoActionBar">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".app.ToolbarFragmentPagerMenu"
+                  android:label="@string/toolbar_fragment_pager"
+                  android:theme="@style/Theme.AppCompat.Light.NoActionBar">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".app.ToolbarActionMode"
+                  android:label="@string/toolbar_action_mode"
+                  android:theme="@style/Theme.AppCompat.Light.NoActionBar">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".app.DialogUsage"
+                  android:label="@string/dialog_usage"
+                  android:theme="@style/Theme.AppCompat.Light">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".app.AlertDialogUsage"
+                  android:label="@string/alert_dialog_usage"
+                  android:theme="@style/Theme.AppCompat.Light">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".app.DialogFragmentUsage"
+                  android:label="@string/dialogfragment_usage"
+                  android:theme="@style/Theme.AppCompat.Light">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".app.AppCompatNightModeActivity"
+                  android:label="@string/mode_night_activity_title"
+                  android:theme="@style/Theme.AppCompat.DayNight">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".app.AppCompatNightModeDialog"
+                  android:label="@string/mode_night_dialog_title"
+                  android:theme="@style/Theme.AppCompat">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".app.AppCompatNightModeAlertDialog"
+                  android:label="@string/mode_night_alertdialog_title"
+                  android:theme="@style/Theme.AppCompat">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".app.AppCompatAnimatedVector"
+                  android:label="@string/appcompat_vector_title"
+                  android:theme="@style/Theme.AppCompat.Light">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <provider android:name=".app.RecentSuggestionsProvider"
+                  android:authorities="com.example.android.supportv7.RecentSuggestionsProvider" />
+
+        <!-- RecyclerView samples -->
+        <activity android:name=".widget.RecyclerViewActivity"
+                  android:label="@string/recycler_view"
+                  android:theme="@style/Theme.AppCompat">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".widget.AnimatedRecyclerView"
+                  android:label="@string/animated_recycler_view"
+                  android:theme="@style/Theme.AppCompat">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".widget.LinearLayoutManagerActivity"
+                  android:label="@string/linear_layout_manager"
+                  android:theme="@style/Theme.AppCompat">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".util.SortedListActivity"
+                  android:label="@string/sorted_list_activity"
+                  android:windowSoftInputMode="adjustResize"
+                  android:theme="@style/Theme.AppCompat">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".widget.GridLayoutManagerActivity"
+                  android:label="@string/grid_layout_manager"
+                  android:theme="@style/Theme.AppCompat">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".widget.StaggeredGridLayoutManagerActivity"
+                  android:label="@string/staggered_grid_layout_manager"
+                  android:theme="@style/Theme.AppCompat">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".widget.AsyncListUtilActivity"
+                  android:label="@string/async_list_util"
+                  android:theme="@style/Theme.AppCompat">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".view.CardViewActivity"
+                  android:label="@string/card_view"
+                  android:theme="@style/Theme.AppCompat.Light.NoActionBar">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".graphics.PaletteActivity"
+                  android:label="@string/palette"
+                  android:theme="@style/Theme.AppCompat">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.supportv7.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".graphics.PaletteDetailActivity"
+                  android:label="@string/palette"
+                  android:theme="@style/Theme.AppCompat" />
+
+        <!-- item touch helper demo activities-->
+        <activity android:name=".widget.touch.SwipeToDismissActivity"
+                  android:label="@string/swipe_to_dismiss_activity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+                <category android:name="com.example.android.supportv7.SAMPLE_CODE"/>
+            </intent-filter>
+        </activity>
+        <activity android:name=".widget.touch.DragAndDropActivity"
+                  android:label="@string/drag_and_drop_activity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+                <category android:name="com.example.android.supportv7.SAMPLE_CODE"/>
+            </intent-filter>
+        </activity>
+
+        <!-- DrawerLayout demo activity -->
+        <activity android:name=".widget.DrawerLayoutActivity"
+                  android:label="@string/drawer_layout_activity"
+                  android:theme="@style/Theme.SampleDrawerLayout">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+                <category android:name="com.example.android.supportv7.SAMPLE_CODE"/>
+            </intent-filter>
+        </activity>
+
+        <!-- ListPopupWindow demo activity -->
+        <activity android:name=".widget.ListPopupWindowActivity"
+                  android:label="@string/list_popup_window_activity"
+                  android:theme="@style/Theme.AppCompat.Light">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+                <category android:name="com.example.android.supportv7.SAMPLE_CODE"/>
+            </intent-filter>
+        </activity>
+
+        <!-- PopupMenu demo activity -->
+        <activity android:name=".widget.PopupMenuActivity"
+                  android:label="@string/popup_menu_activity"
+                  android:theme="@style/Theme.AppCompat.Light">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+                <category android:name="com.example.android.supportv7.SAMPLE_CODE"/>
+            </intent-filter>
+        </activity>
+    </application>
+
+
+</manifest>
diff --git a/samples/Support7Demos/_index.html b/samples/Support7Demos/_index.html
new file mode 100644
index 0000000..0c017ab
--- /dev/null
+++ b/samples/Support7Demos/_index.html
@@ -0,0 +1,30 @@
+<p>The Support v7 Demos application contains a variety of small sample
+code showing how to use key features of the Android API 7+ Support Library.
+This library contains code that you can
+build in to your application to access new features and common
+utilities while being able to run down to version 2.1 (API 7)
+of the platform.
+</p>
+
+<script type="text/javascript">
+
+// This is a totally temporary hack to display the following content only
+// when the docs are online. This will be changed once the samples get moved.
+
+if (toRoot == "/") {
+
+document.write(""+
+"<p>You'll notice that all the samples are included in a single Android "+
+"project, so the application code and other resource files for all samples are batched "+
+"together.  To help you find the code that's relevant to you, here's a directory that "+
+"points to the program code for the different topics included in the project:</p>"+
+
+"<ul>"+
+"<li><a href='src/com/example/android/supportv7/app/index.html'>App</a></li>"+
+"<li><a href='src/com/example/android/supportv7/media/index.html'>Media</a></li>"+
+"<li><a href='src/com/example/android/supportv7/view/index.html'>Views</a></li>"+
+"</ul>");
+
+}
+
+</script>
diff --git a/samples/Support7Demos/build.gradle b/samples/Support7Demos/build.gradle
new file mode 100644
index 0000000..ac8dc3c
--- /dev/null
+++ b/samples/Support7Demos/build.gradle
@@ -0,0 +1,36 @@
+apply plugin: 'com.android.application'
+
+dependencies {
+    compile project(':support-appcompat-v7')
+    compile project(':support-cardview-v7')
+    compile project(':support-gridlayout-v7')
+    compile project(':support-mediarouter-v7')
+    compile project(':support-palette-v7')
+    compile project(':support-recyclerview-v7')
+}
+
+android {
+    compileSdkVersion project.ext.currentSdk
+
+    defaultConfig {
+        minSdkVersion 9
+    }
+
+    sourceSets {
+        main.manifest.srcFile 'AndroidManifest.xml'
+        main.java.srcDirs = ['src']
+        main.aidl.srcDirs = ['src']
+        main.res.srcDirs = ['res']
+    }
+
+    lintOptions {
+        // TODO: fix errors and reenable.
+        abortOnError false
+    }
+
+    compileOptions {
+        sourceCompatibility JavaVersion.VERSION_1_7
+        targetCompatibility JavaVersion.VERSION_1_7
+    }
+}
+
diff --git a/samples/Support7Demos/res/anim/animation_grouping_1_01.xml b/samples/Support7Demos/res/anim/animation_grouping_1_01.xml
new file mode 100644
index 0000000..86f966a
--- /dev/null
+++ b/samples/Support7Demos/res/anim/animation_grouping_1_01.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2016 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">
+
+    <objectAnimator
+            android:duration="2000"
+            android:propertyName="rotation"
+            android:valueFrom="0"
+            android:valueTo="360"
+            android:repeatCount="infinite"
+            android:interpolator="@android:anim/linear_interpolator"/>
+</set>
\ No newline at end of file
diff --git a/samples/Support7Demos/res/color/card_selector.xml b/samples/Support7Demos/res/color/card_selector.xml
new file mode 100644
index 0000000..48b35ee
--- /dev/null
+++ b/samples/Support7Demos/res/color/card_selector.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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="true" android:color="@color/card_tropical"/>
+    <item android:state_pressed="true" android:color="@color/card_tropical"/>
+    <item android:color="@color/card_yellow"/>
+</selector>
\ No newline at end of file
diff --git a/samples/Support7Demos/res/drawable-hdpi/apidemo_androidlogo.png b/samples/Support7Demos/res/drawable-hdpi/apidemo_androidlogo.png
new file mode 100644
index 0000000..088181b
--- /dev/null
+++ b/samples/Support7Demos/res/drawable-hdpi/apidemo_androidlogo.png
Binary files differ
diff --git a/samples/Support7Demos/res/drawable-hdpi/app_sample_code.png b/samples/Support7Demos/res/drawable-hdpi/app_sample_code.png
new file mode 100755
index 0000000..66a1984
--- /dev/null
+++ b/samples/Support7Demos/res/drawable-hdpi/app_sample_code.png
Binary files differ
diff --git a/samples/Support7Demos/res/drawable-hdpi/drawer_shadow.9.png b/samples/Support7Demos/res/drawable-hdpi/drawer_shadow.9.png
new file mode 100644
index 0000000..224cc4f
--- /dev/null
+++ b/samples/Support7Demos/res/drawable-hdpi/drawer_shadow.9.png
Binary files differ
diff --git a/samples/Support7Demos/res/drawable-hdpi/drawer_shadow_end.9.png b/samples/Support7Demos/res/drawable-hdpi/drawer_shadow_end.9.png
new file mode 100644
index 0000000..2b79b04
--- /dev/null
+++ b/samples/Support7Demos/res/drawable-hdpi/drawer_shadow_end.9.png
Binary files differ
diff --git a/samples/Support7Demos/res/drawable-hdpi/ic_android.png b/samples/Support7Demos/res/drawable-hdpi/ic_android.png
new file mode 100755
index 0000000..94b8fb1
--- /dev/null
+++ b/samples/Support7Demos/res/drawable-hdpi/ic_android.png
Binary files differ
diff --git a/samples/Support7Demos/res/drawable-hdpi/ic_launcher_settings.png b/samples/Support7Demos/res/drawable-hdpi/ic_launcher_settings.png
new file mode 100644
index 0000000..c02bd42
--- /dev/null
+++ b/samples/Support7Demos/res/drawable-hdpi/ic_launcher_settings.png
Binary files differ
diff --git a/samples/Support7Demos/res/drawable-hdpi/ic_media_pause.png b/samples/Support7Demos/res/drawable-hdpi/ic_media_pause.png
new file mode 100644
index 0000000..1d465a4
--- /dev/null
+++ b/samples/Support7Demos/res/drawable-hdpi/ic_media_pause.png
Binary files differ
diff --git a/samples/Support7Demos/res/drawable-hdpi/ic_media_play.png b/samples/Support7Demos/res/drawable-hdpi/ic_media_play.png
new file mode 100644
index 0000000..2746d17
--- /dev/null
+++ b/samples/Support7Demos/res/drawable-hdpi/ic_media_play.png
Binary files differ
diff --git a/samples/Support7Demos/res/drawable-hdpi/ic_media_stop.png b/samples/Support7Demos/res/drawable-hdpi/ic_media_stop.png
new file mode 100644
index 0000000..a0ff136
--- /dev/null
+++ b/samples/Support7Demos/res/drawable-hdpi/ic_media_stop.png
Binary files differ
diff --git a/samples/Support7Demos/res/drawable-hdpi/ic_menu_add.png b/samples/Support7Demos/res/drawable-hdpi/ic_menu_add.png
new file mode 100644
index 0000000..444e8a5
--- /dev/null
+++ b/samples/Support7Demos/res/drawable-hdpi/ic_menu_add.png
Binary files differ
diff --git a/samples/Support7Demos/res/drawable-hdpi/ic_menu_delete.png b/samples/Support7Demos/res/drawable-hdpi/ic_menu_delete.png
new file mode 100644
index 0000000..24d8f6a
--- /dev/null
+++ b/samples/Support7Demos/res/drawable-hdpi/ic_menu_delete.png
Binary files differ
diff --git a/samples/Support7Demos/res/drawable-ldrtl-hdpi/drawer_shadow.9.png b/samples/Support7Demos/res/drawable-ldrtl-hdpi/drawer_shadow.9.png
new file mode 100644
index 0000000..2b79b04
--- /dev/null
+++ b/samples/Support7Demos/res/drawable-ldrtl-hdpi/drawer_shadow.9.png
Binary files differ
diff --git a/samples/Support7Demos/res/drawable-ldrtl-hdpi/drawer_shadow_end.9.png b/samples/Support7Demos/res/drawable-ldrtl-hdpi/drawer_shadow_end.9.png
new file mode 100644
index 0000000..224cc4f
--- /dev/null
+++ b/samples/Support7Demos/res/drawable-ldrtl-hdpi/drawer_shadow_end.9.png
Binary files differ
diff --git a/samples/Support7Demos/res/drawable-ldrtl-mdpi/drawer_shadow.9.png b/samples/Support7Demos/res/drawable-ldrtl-mdpi/drawer_shadow.9.png
new file mode 100644
index 0000000..b96daae
--- /dev/null
+++ b/samples/Support7Demos/res/drawable-ldrtl-mdpi/drawer_shadow.9.png
Binary files differ
diff --git a/samples/Support7Demos/res/drawable-ldrtl-mdpi/drawer_shadow_end.9.png b/samples/Support7Demos/res/drawable-ldrtl-mdpi/drawer_shadow_end.9.png
new file mode 100644
index 0000000..3797f99
--- /dev/null
+++ b/samples/Support7Demos/res/drawable-ldrtl-mdpi/drawer_shadow_end.9.png
Binary files differ
diff --git a/samples/Support7Demos/res/drawable-ldrtl-xhdpi/drawer_shadow.9.png b/samples/Support7Demos/res/drawable-ldrtl-xhdpi/drawer_shadow.9.png
new file mode 100644
index 0000000..77de73c
--- /dev/null
+++ b/samples/Support7Demos/res/drawable-ldrtl-xhdpi/drawer_shadow.9.png
Binary files differ
diff --git a/samples/Support7Demos/res/drawable-ldrtl-xhdpi/drawer_shadow_end.9.png b/samples/Support7Demos/res/drawable-ldrtl-xhdpi/drawer_shadow_end.9.png
new file mode 100644
index 0000000..fa3d853
--- /dev/null
+++ b/samples/Support7Demos/res/drawable-ldrtl-xhdpi/drawer_shadow_end.9.png
Binary files differ
diff --git a/samples/Support7Demos/res/drawable-mdpi/apidemo_androidlogo.png b/samples/Support7Demos/res/drawable-mdpi/apidemo_androidlogo.png
new file mode 100644
index 0000000..11cb47b
--- /dev/null
+++ b/samples/Support7Demos/res/drawable-mdpi/apidemo_androidlogo.png
Binary files differ
diff --git a/samples/Support7Demos/res/drawable-mdpi/app_sample_code.png b/samples/Support7Demos/res/drawable-mdpi/app_sample_code.png
new file mode 100644
index 0000000..5ae7701
--- /dev/null
+++ b/samples/Support7Demos/res/drawable-mdpi/app_sample_code.png
Binary files differ
diff --git a/samples/Support7Demos/res/drawable-mdpi/drawer_shadow.9.png b/samples/Support7Demos/res/drawable-mdpi/drawer_shadow.9.png
new file mode 100644
index 0000000..3797f99
--- /dev/null
+++ b/samples/Support7Demos/res/drawable-mdpi/drawer_shadow.9.png
Binary files differ
diff --git a/samples/Support7Demos/res/drawable-mdpi/drawer_shadow_end.9.png b/samples/Support7Demos/res/drawable-mdpi/drawer_shadow_end.9.png
new file mode 100644
index 0000000..b96daae
--- /dev/null
+++ b/samples/Support7Demos/res/drawable-mdpi/drawer_shadow_end.9.png
Binary files differ
diff --git a/samples/Support7Demos/res/drawable-mdpi/ic_android.png b/samples/Support7Demos/res/drawable-mdpi/ic_android.png
new file mode 100755
index 0000000..afc43db
--- /dev/null
+++ b/samples/Support7Demos/res/drawable-mdpi/ic_android.png
Binary files differ
diff --git a/samples/Support7Demos/res/drawable-mdpi/ic_launcher_settings.png b/samples/Support7Demos/res/drawable-mdpi/ic_launcher_settings.png
new file mode 100644
index 0000000..05cdd9a
--- /dev/null
+++ b/samples/Support7Demos/res/drawable-mdpi/ic_launcher_settings.png
Binary files differ
diff --git a/samples/Support7Demos/res/drawable-mdpi/ic_media_pause.png b/samples/Support7Demos/res/drawable-mdpi/ic_media_pause.png
new file mode 100644
index 0000000..3e6b2a1
--- /dev/null
+++ b/samples/Support7Demos/res/drawable-mdpi/ic_media_pause.png
Binary files differ
diff --git a/samples/Support7Demos/res/drawable-mdpi/ic_media_play.png b/samples/Support7Demos/res/drawable-mdpi/ic_media_play.png
new file mode 100644
index 0000000..7966bbc
--- /dev/null
+++ b/samples/Support7Demos/res/drawable-mdpi/ic_media_play.png
Binary files differ
diff --git a/samples/Support7Demos/res/drawable-mdpi/ic_media_stop.png b/samples/Support7Demos/res/drawable-mdpi/ic_media_stop.png
new file mode 100644
index 0000000..8ea7efe
--- /dev/null
+++ b/samples/Support7Demos/res/drawable-mdpi/ic_media_stop.png
Binary files differ
diff --git a/samples/Support7Demos/res/drawable-mdpi/ic_menu_add.png b/samples/Support7Demos/res/drawable-mdpi/ic_menu_add.png
new file mode 100644
index 0000000..361c7c4
--- /dev/null
+++ b/samples/Support7Demos/res/drawable-mdpi/ic_menu_add.png
Binary files differ
diff --git a/samples/Support7Demos/res/drawable-mdpi/ic_menu_delete.png b/samples/Support7Demos/res/drawable-mdpi/ic_menu_delete.png
new file mode 100644
index 0000000..e2c8700
--- /dev/null
+++ b/samples/Support7Demos/res/drawable-mdpi/ic_menu_delete.png
Binary files differ
diff --git a/samples/Support7Demos/res/drawable-xhdpi/drawer_shadow.9.png b/samples/Support7Demos/res/drawable-xhdpi/drawer_shadow.9.png
new file mode 100644
index 0000000..fa3d853
--- /dev/null
+++ b/samples/Support7Demos/res/drawable-xhdpi/drawer_shadow.9.png
Binary files differ
diff --git a/samples/Support7Demos/res/drawable-xhdpi/drawer_shadow_end.9.png b/samples/Support7Demos/res/drawable-xhdpi/drawer_shadow_end.9.png
new file mode 100644
index 0000000..77de73c
--- /dev/null
+++ b/samples/Support7Demos/res/drawable-xhdpi/drawer_shadow_end.9.png
Binary files differ
diff --git a/samples/Support7Demos/res/drawable/animation_vector_drawable_grouping_1.xml b/samples/Support7Demos/res/drawable/animation_vector_drawable_grouping_1.xml
new file mode 100644
index 0000000..dbdf453
--- /dev/null
+++ b/samples/Support7Demos/res/drawable/animation_vector_drawable_grouping_1.xml
@@ -0,0 +1,26 @@
+<!--
+ Copyright (C) 2016 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.
+-->
+<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
+                 android:drawable="@drawable/vector_drawable_grouping_1">
+
+    <target
+            android:name="sun"
+            android:animation="@anim/animation_grouping_1_01"/>
+    <target
+            android:name="earth"
+            android:animation="@anim/animation_grouping_1_01"/>
+
+</animated-vector>
\ No newline at end of file
diff --git a/samples/Support7Demos/res/drawable/gradient.xml b/samples/Support7Demos/res/drawable/gradient.xml
new file mode 100644
index 0000000..1b654a0
--- /dev/null
+++ b/samples/Support7Demos/res/drawable/gradient.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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">
+    <gradient android:startColor="#FF0000"
+              android:endColor="#0000FF"
+              android:angle="270" />
+</shape>
\ No newline at end of file
diff --git a/samples/Support7Demos/res/drawable/ic_search.xml b/samples/Support7Demos/res/drawable/ic_search.xml
new file mode 100644
index 0000000..b4cba34
--- /dev/null
+++ b/samples/Support7Demos/res/drawable/ic_search.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright (C) 2016 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="24dp"
+        android:height="24dp"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0"
+        android:tint="?attr/colorControlNormal">
+    <path
+        android:pathData="M15.5,14l-0.8,0l-0.3,-0.3c1,-1.1 1.6,-2.6 1.6,-4.2C16,5.9 13.1,3 9.5,3C5.9,3 3,5.9 3,9.5S5.9,16 9.5,16c1.6,0 3.1,-0.6 4.2,-1.6l0.3,0.3l0,0.8l5,5l1.5,-1.5L15.5,14zM9.5,14C7,14 5,12 5,9.5S7,5 9.5,5C12,5 14,7 14,9.5S12,14 9.5,14z"
+        android:fillColor="@android:color/white"/>
+</vector>
diff --git a/samples/Support7Demos/res/drawable/vector_drawable_grouping_1.xml b/samples/Support7Demos/res/drawable/vector_drawable_grouping_1.xml
new file mode 100644
index 0000000..543d934
--- /dev/null
+++ b/samples/Support7Demos/res/drawable/vector_drawable_grouping_1.xml
@@ -0,0 +1,52 @@
+<!--
+ Copyright (C) 2016 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="256dp"
+        android:width="256dp"
+        android:viewportHeight="256"
+        android:viewportWidth="256">
+
+    <group
+            android:name="shape_layer_1"
+            android:translateX="128"
+            android:translateY="128">
+        <group android:name="sun">
+            <path
+                    android:name="ellipse_path_1"
+                    android:fillColor="#ffff8000"
+                    android:pathData="m -25 0 a 25,25 0 1,0 50,0 a 25,25 0 1,0 -50,0"/>
+
+            <group
+                    android:name="earth"
+                    android:translateX="75">
+                <path
+                        android:name="ellipse_path_1_1"
+                        android:fillColor="#ff5656ea"
+                        android:pathData="m -10 0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0"/>
+
+                <group
+                        android:name="moon"
+                        android:translateX="25">
+                    <path
+                            android:name="ellipse_path_1_2"
+                            android:fillColor="#ffadadad"
+                            android:pathData="m -5 0 a 5,5 0 1,0 10,0 a 5,5 0 1,0 -10,0"/>
+                </group>
+            </group>
+        </group>
+    </group>
+
+</vector>
\ No newline at end of file
diff --git a/samples/Support7Demos/res/layout-land/grid_layout_2.xml b/samples/Support7Demos/res/layout-land/grid_layout_2.xml
new file mode 100644
index 0000000..49fceaa
--- /dev/null
+++ b/samples/Support7Demos/res/layout-land/grid_layout_2.xml
@@ -0,0 +1,64 @@
+<?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.
+-->
+
+<android.support.v7.widget.GridLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    app:useDefaultMargins="true"
+    app:alignmentMode="alignBounds"
+    app:rowOrderPreserved="false"
+    app:columnCount="4"
+    >
+    <TextView
+        android:text="Email setup"
+        android:textSize="32dip"
+        app:layout_columnSpan="4"
+        app:layout_gravity="center_horizontal"
+    />
+    <TextView
+        android:text="You can configure email in a few simple steps:"
+        android:textSize="16dip"
+        app:layout_columnSpan="4"
+        app:layout_gravity="left"
+    />
+    <TextView
+        android:text="Email address:"
+        app:layout_gravity="right"
+    />
+    <EditText
+        android:ems="10"
+    />
+    <TextView
+        android:text="Password:"
+        app:layout_column="0"
+        app:layout_gravity="right"
+    />
+    <EditText
+        android:ems="8"
+    />
+    <Button
+        android:text="Manual setup"
+        app:layout_row="5"
+        app:layout_column="3"
+    />
+    <Button
+        android:text="Next"
+        app:layout_column="3"
+        app:layout_gravity="fill_horizontal"
+    />
+</android.support.v7.widget.GridLayout>
diff --git a/samples/Support7Demos/res/layout-v11/appcompat_animated_vector.xml b/samples/Support7Demos/res/layout-v11/appcompat_animated_vector.xml
new file mode 100644
index 0000000..d4de491
--- /dev/null
+++ b/samples/Support7Demos/res/layout-v11/appcompat_animated_vector.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2016 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.
+-->
+
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+             android:layout_width="match_parent"
+             android:layout_height="match_parent"
+             xmlns:app="http://schemas.android.com/apk/res-auto">
+
+    <ImageView android:id="@+id/vector_image"
+               android:layout_width="wrap_content"
+               android:layout_height="wrap_content"
+               android:layout_gravity="center"
+               app:srcCompat="@drawable/animation_vector_drawable_grouping_1"/>
+
+</FrameLayout>
\ No newline at end of file
diff --git a/samples/Support7Demos/res/layout/action_bar_action_mode.xml b/samples/Support7Demos/res/layout/action_bar_action_mode.xml
new file mode 100644
index 0000000..d498fda
--- /dev/null
+++ b/samples/Support7Demos/res/layout/action_bar_action_mode.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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.
+-->
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+             android:layout_width="match_parent"
+             android:layout_height="match_parent">
+
+    <Button
+            android:id="@+id/btn_start_action_mode"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center"
+            android:text="@string/start_action_mode"/>
+
+</FrameLayout>
\ No newline at end of file
diff --git a/samples/Support7Demos/res/layout/action_bar_display_options.xml b/samples/Support7Demos/res/layout/action_bar_display_options.xml
new file mode 100644
index 0000000..2efb7c2
--- /dev/null
+++ b/samples/Support7Demos/res/layout/action_bar_display_options.xml
@@ -0,0 +1,55 @@
+<?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.
+-->
+<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+              android:layout_width="match_parent"
+              android:layout_height="match_parent">
+    <LinearLayout android:layout_width="match_parent"
+                  android:layout_height="match_parent"
+                  android:orientation="vertical">
+        <Button android:id="@+id/toggle_home_as_up"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="@string/toggle_home_as_up" />
+        <Button android:id="@+id/toggle_show_home"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="@string/toggle_show_home" />
+        <Button android:id="@+id/toggle_use_logo"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="@string/toggle_use_logo" />
+        <Button android:id="@+id/toggle_show_title"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="@string/toggle_show_title" />
+        <Button android:id="@+id/toggle_show_custom"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="@string/toggle_show_custom" />
+        <Button android:id="@+id/toggle_navigation"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="@string/toggle_navigation" />
+        <Button android:id="@+id/cycle_custom_gravity"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="@string/cycle_custom_gravity" />
+        <Button android:id="@+id/toggle_visibility"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="@string/toggle_visibility" />
+    </LinearLayout>
+</ScrollView>
\ No newline at end of file
diff --git a/samples/Support7Demos/res/layout/action_bar_display_options_custom.xml b/samples/Support7Demos/res/layout/action_bar_display_options_custom.xml
new file mode 100644
index 0000000..b7f5bd9
--- /dev/null
+++ b/samples/Support7Demos/res/layout/action_bar_display_options_custom.xml
@@ -0,0 +1,17 @@
+<?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.
+-->
+<Button xmlns:android="http://schemas.android.com/apk/res/android"
+        android:text="@string/display_options_custom_button" />
diff --git a/samples/Support7Demos/res/layout/action_bar_fragment_menu.xml b/samples/Support7Demos/res/layout/action_bar_fragment_menu.xml
new file mode 100644
index 0000000..d18684d
--- /dev/null
+++ b/samples/Support7Demos/res/layout/action_bar_fragment_menu.xml
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:padding="8dp">
+
+    <TextView
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:textAppearance="?android:attr/textAppearanceMedium"
+        android:text="@string/action_bar_fragment_menu_msg" />
+
+    <CheckBox android:id="@+id/menu1"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:checked="true"
+        android:text="@string/action_bar_fragment_menu1">
+    </CheckBox>
+
+    <CheckBox android:id="@+id/menu2"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:checked="true"
+        android:text="@string/action_bar_fragment_menu2">
+    </CheckBox>
+
+    <CheckBox android:id="@+id/menu3"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:checked="true"
+        android:text="@string/action_bar_fragment_menu3">
+    </CheckBox>
+
+    <CheckBox android:id="@+id/has_options_menu"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:checked="true"
+        android:text="@string/action_bar_fragment_has_options_menu">
+    </CheckBox>
+
+    <CheckBox android:id="@+id/menu_visibility"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:checked="true"
+        android:text="@string/action_bar_fragment_menu_visibility">
+    </CheckBox>
+</LinearLayout>
diff --git a/samples/Support7Demos/res/layout/action_bar_hide_scroll.xml b/samples/Support7Demos/res/layout/action_bar_hide_scroll.xml
new file mode 100644
index 0000000..a80140f
--- /dev/null
+++ b/samples/Support7Demos/res/layout/action_bar_hide_scroll.xml
@@ -0,0 +1,33 @@
+<?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.
+-->
+<android.support.v4.widget.NestedScrollView
+        xmlns:android="http://schemas.android.com/apk/res/android"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+
+    <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="vertical">
+
+        <TextView
+                android:layout_width="match_parent"
+                android:layout_height="2000dp"
+                android:background="@drawable/gradient" />
+
+    </LinearLayout>
+
+</android.support.v4.widget.NestedScrollView>
\ No newline at end of file
diff --git a/samples/Support7Demos/res/layout/action_bar_settings_action_provider.xml b/samples/Support7Demos/res/layout/action_bar_settings_action_provider.xml
new file mode 100644
index 0000000..969332a
--- /dev/null
+++ b/samples/Support7Demos/res/layout/action_bar_settings_action_provider.xml
@@ -0,0 +1,34 @@
+<?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/Support7Demos/res/layout/action_bar_tab_content.xml b/samples/Support7Demos/res/layout/action_bar_tab_content.xml
new file mode 100644
index 0000000..c0aa7fa
--- /dev/null
+++ b/samples/Support7Demos/res/layout/action_bar_tab_content.xml
@@ -0,0 +1,19 @@
+<?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.
+-->
+<TextView xmlns:android="http://schemas.android.com/apk/res/android"
+          android:id="@+id/text"
+          android:layout_width="wrap_content"
+          android:layout_height="wrap_content" />
diff --git a/samples/Support7Demos/res/layout/action_bar_tabs.xml b/samples/Support7Demos/res/layout/action_bar_tabs.xml
new file mode 100644
index 0000000..a51f46e
--- /dev/null
+++ b/samples/Support7Demos/res/layout/action_bar_tabs.xml
@@ -0,0 +1,49 @@
+<?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:layout_width="match_parent"
+              android:layout_height="match_parent"
+              android:orientation="vertical">
+    <FrameLayout android:id="@+id/fragment_content"
+                 android:layout_width="match_parent"
+                 android:layout_height="0dip"
+                 android:layout_weight="1" />
+    <LinearLayout android:layout_width="match_parent"
+                  android:layout_height="0dip"
+                  android:layout_weight="1"
+                  android:orientation="vertical">
+        <Button android:id="@+id/btn_add_tab"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="@string/btn_add_tab"
+                android:onClick="onAddTab" />
+        <Button android:id="@+id/btn_remove_tab"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="@string/btn_remove_tab"
+                android:onClick="onRemoveTab" />
+        <Button android:id="@+id/btn_toggle_tabs"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="@string/btn_toggle_tabs"
+                android:onClick="onToggleTabs" />
+        <Button android:id="@+id/btn_remove_all_tabs"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="@string/btn_remove_all_tabs"
+                android:onClick="onRemoveAllTabs" />
+    </LinearLayout>
+</LinearLayout>
diff --git a/samples/Support7Demos/res/layout/activity_base_layout_manager.xml b/samples/Support7Demos/res/layout/activity_base_layout_manager.xml
new file mode 100644
index 0000000..e56329e
--- /dev/null
+++ b/samples/Support7Demos/res/layout/activity_base_layout_manager.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 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">
+    <LinearLayout
+            android:orientation="horizontal"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content">
+        <CheckBox
+                android:focusable="true"
+                android:focusableInTouchMode="true"
+                android:id="@+id/enable_smooth_scroll"
+                android:text="smooth scroll"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"/>
+        <EditText
+                android:id="@+id/scroll_offset"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:inputType="numberSigned"
+                android:hint="offset"/>
+        <Spinner
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:id="@+id/spinner"/>
+        <Button android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="scroll"
+                android:onClick="onScrollClicked"/>
+    </LinearLayout>
+
+    <android.support.v7.widget.RecyclerView
+            android:layout_width="fill_parent"
+            android:layout_height="60dp"
+            android:scrollbars="horizontal"
+            android:id="@+id/config_recycler_view"/>
+    <android.support.v7.widget.RecyclerView
+            android:background="#ff0099cc"
+            android:scrollbarStyle="insideOverlay"
+            android:scrollbars="horizontal|vertical"
+            android:layout_width="fill_parent"
+            android:layout_height="fill_parent"
+            android:id="@+id/recycler_view"/>
+
+</LinearLayout>
\ No newline at end of file
diff --git a/samples/Support7Demos/res/layout/activity_card_view.xml b/samples/Support7Demos/res/layout/activity_card_view.xml
new file mode 100644
index 0000000..3e1b928
--- /dev/null
+++ b/samples/Support7Demos/res/layout/activity_card_view.xml
@@ -0,0 +1,231 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 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"
+              xmlns:card_view="http://schemas.android.com/apk/res-auto"
+              android:layout_width="match_parent"
+              android:layout_height="match_parent"
+              android:background="#ffffffff"
+              android:orientation="vertical">
+    <RelativeLayout
+            android:layout_marginLeft="10dp"
+            android:layout_marginRight="10dp"
+            android:orientation="vertical"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content">
+        <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:textColor="@android:color/black"
+                android:id="@+id/radius_label"
+                android:layout_marginBottom="5dp"
+                android:text="@string/card_view_radius"/>
+        <SeekBar
+                android:id="@+id/corner_radius_seek_bar"
+                android:max="100"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_toRightOf="@id/radius_label"
+                android:layout_alignTop="@id/radius_label"/>
+        <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginBottom="5dp"
+                android:textColor="@android:color/black"
+                android:id="@+id/width_label"
+                android:text="@string/card_view_width"
+                android:layout_below="@id/radius_label"
+                android:layout_alignRight="@id/radius_label"/>
+        <SeekBar
+                android:id="@+id/width_seek_bar"
+                android:max="600"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_toRightOf="@id/width_label"
+                android:layout_alignTop="@id/width_label"/>
+        <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginBottom="5dp"
+                android:textColor="@android:color/black"
+                android:id="@+id/height_label"
+                android:text="@string/card_view_height"
+                android:layout_below="@id/width_label"
+                android:layout_alignRight="@id/width_label"/>
+        <SeekBar
+                android:id="@+id/height_seek_bar"
+                android:max="600"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_toRightOf="@id/height_label"
+                android:layout_alignTop="@id/height_label"/>
+
+        <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginBottom="5dp"
+                android:id="@+id/elevation_label"
+                android:textColor="@android:color/black"
+                android:text="@string/card_view_elevation"
+                android:layout_below="@id/height_label"
+                android:layout_alignRight="@id/height_label"/>
+        <SeekBar
+                android:id="@+id/elevation_seek_bar"
+                android:max="50"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_toRightOf="@id/elevation_label"
+                android:layout_alignTop="@id/elevation_label"/>
+
+        <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginBottom="5dp"
+                android:id="@+id/max_elevation_label"
+                android:textColor="@android:color/black"
+                android:text="@string/card_view_max_elevation"
+                android:layout_below="@id/elevation_label"
+                android:layout_alignRight="@id/elevation_label"/>
+        <SeekBar
+                android:id="@+id/max_elevation_seek_bar"
+                android:max="60"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_toRightOf="@id/max_elevation_label"
+                android:layout_alignTop="@id/max_elevation_label"/>
+
+        <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginBottom="5dp"
+                android:id="@+id/alpha_label"
+                android:textColor="@android:color/black"
+                android:text="@string/card_view_alpha"
+                android:layout_below="@id/max_elevation_label"
+                android:layout_alignRight="@id/max_elevation_label"/>
+        <SeekBar
+                android:id="@+id/alpha_seek_bar"
+                android:max="255"
+                android:progress="255"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_toRightOf="@id/alpha_label"
+                android:layout_alignTop="@id/alpha_label"/>
+        <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginBottom="5dp"
+                android:id="@+id/color_label"
+                android:textColor="@android:color/black"
+                android:text="@string/card_view_bg_color"
+                android:layout_below="@id/alpha_label"
+                android:layout_alignRight="@id/alpha_label"/>
+
+        <ScrollView
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_below="@id/alpha_seek_bar"
+                android:layout_toRightOf="@id/color_label"
+                android:layout_alignParentRight="true"
+                android:layout_alignTop="@id/color_label">
+
+            <RadioGroup
+                    android:id="@+id/select_bg_color_radio"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:orientation="horizontal">
+                <RadioButton
+                        android:id="@+id/def"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:background="@color/cardview_light_background"
+                        android:checked="true"/>
+                <RadioButton
+                        android:id="@+id/yellow"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:background="@color/card_yellow"/>
+                <RadioButton
+                        android:id="@+id/aquatic"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:background="@color/card_aquatic"/>
+                <RadioButton
+                        android:id="@+id/classic"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:background="@color/card_classic"/>
+                <RadioButton
+                        android:id="@+id/sunbrite"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:background="@color/card_sunbrite"/>
+                <RadioButton
+                        android:id="@+id/tropical"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:background="@color/card_tropical"/>
+                <RadioButton
+                        android:id="@+id/selector"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:text="@string/cardview_background_selector_label"/>
+            </RadioGroup>
+        </ScrollView>
+        <RadioGroup
+                android:id="@+id/select_target_radio"
+                android:layout_width="fill_parent"
+                android:layout_height="wrap_content"
+                android:orientation="horizontal"
+                android:layout_below="@id/color_label">
+            <RadioButton
+                    android:id="@+id/resize_card_view"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:textColor="@android:color/black"
+                    android:text="@string/card_view_resize_card_view"
+                    android:checked="true"/>
+            <RadioButton
+                    android:id="@+id/resize_content"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:textColor="@android:color/black"
+                    android:text="@string/card_view_resize_content"/>
+        </RadioGroup>
+    </RelativeLayout>
+    <RelativeLayout android:layout_width="fill_parent"
+                    android:layout_height="match_parent">
+        <android.support.v7.widget.CardView
+                android:id="@+id/card_view"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                card_view:cardElevation="10dp"
+                android:clickable="true"
+                android:layout_margin="8dp">
+            <TextView
+                    android:id="@+id/info_text"
+                    android:text="@string/card_view"
+                    android:textColor="@android:color/black"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content" />
+        </android.support.v7.widget.CardView>
+        <TextView android:layout_width="wrap_content" android:layout_height="wrap_content"
+                  android:text="@string/card_view_sample_text"
+                  android:textColor="@android:color/black"
+                android:layout_toRightOf="@id/card_view"
+                android:layout_alignTop="@id/card_view"/>
+    </RelativeLayout>
+
+</LinearLayout>
diff --git a/samples/Support7Demos/res/layout/activity_item_touch.xml b/samples/Support7Demos/res/layout/activity_item_touch.xml
new file mode 100644
index 0000000..d809b0e
--- /dev/null
+++ b/samples/Support7Demos/res/layout/activity_item_touch.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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.support.v7.widget.RecyclerView
+            android:layout_width="fill_parent"
+            android:layout_height="60dp"
+            android:scrollbars="horizontal"
+            android:id="@+id/config_recycler_view"/>
+    <android.support.v7.widget.RecyclerView
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:id="@+id/recycler_view"/>
+</LinearLayout>
\ No newline at end of file
diff --git a/samples/Support7Demos/res/layout/alert_dialog_usage.xml b/samples/Support7Demos/res/layout/alert_dialog_usage.xml
new file mode 100644
index 0000000..9c6dee6
--- /dev/null
+++ b/samples/Support7Demos/res/layout/alert_dialog_usage.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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:padding="16dp">
+
+    <Spinner
+            android:id="@+id/spinner_dialogs"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:entries="@array/alert_dialog_types"
+            android:layout_marginBottom="16dp"/>
+
+    <Button
+            android:id="@+id/btn_show_dialog"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="Show selected dialog"
+            android:gravity="center"/>
+
+</LinearLayout>
\ No newline at end of file
diff --git a/samples/Support7Demos/res/layout/animated_recycler_view.xml b/samples/Support7Demos/res/layout/animated_recycler_view.xml
new file mode 100644
index 0000000..e5ff037
--- /dev/null
+++ b/samples/Support7Demos/res/layout/animated_recycler_view.xml
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+              android:orientation="vertical"
+              android:id="@+id/container"
+              android:layout_width="match_parent"
+              android:layout_height="match_parent">
+
+    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+                  android:orientation="horizontal"
+                  android:layout_width="match_parent"
+                  android:layout_height="wrap_content">
+
+        <CheckBox
+                android:id="@+id/enableAnimations"
+                android:checked="true"
+                android:text="@string/enableAnimations"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"/>
+
+        <CheckBox
+                android:id="@+id/enablePredictiveAnimations"
+                android:checked="true"
+                android:text="@string/enablePredictiveAnimations"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"/>
+
+        <CheckBox
+                android:id="@+id/enableInPlaceChange"
+                android:checked="false"
+                android:text="@string/enableInPlaceChange"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"/>
+
+    </LinearLayout>
+
+    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+                  android:orientation="horizontal"
+                  android:layout_width="match_parent"
+                  android:layout_height="wrap_content">
+
+        <Button
+                android:id="@+id/deleteButton"
+                android:layout_weight=".5"
+                android:layout_width="0dip"
+                android:layout_height="wrap_content"
+                android:onClick="deleteSelectedItems"
+                android:text="@string/delete_item"/>
+
+        <Button
+                android:layout_weight=".5"
+                android:layout_width="0dip"
+                android:layout_height="wrap_content"
+                android:onClick="addItem"
+                android:text="@string/add_item"/>
+
+        <Button
+                android:layout_weight=".5"
+                android:layout_width="0dip"
+                android:layout_height="wrap_content"
+                android:onClick="addDeleteItem"
+                android:text="@string/add_delete_item"/>
+
+        <Button
+                android:layout_weight=".5"
+                android:layout_width="0dip"
+                android:layout_height="wrap_content"
+                android:onClick="deleteAddItem"
+                android:text="@string/delete_add_item"/>
+
+        <Button
+                android:layout_weight=".5"
+                android:layout_width="0dip"
+                android:layout_height="wrap_content"
+                android:onClick="d1a2d3"
+                android:text="@string/d1a2d3"/>
+
+    </LinearLayout>
+
+</LinearLayout>
\ No newline at end of file
diff --git a/samples/Support7Demos/res/layout/appcompat_animated_vector.xml b/samples/Support7Demos/res/layout/appcompat_animated_vector.xml
new file mode 100644
index 0000000..4881022
--- /dev/null
+++ b/samples/Support7Demos/res/layout/appcompat_animated_vector.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2016 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.
+-->
+
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+             android:layout_width="match_parent"
+             android:layout_height="match_parent">
+
+    <TextView android:layout_width="wrap_content"
+              android:layout_height="wrap_content"
+              android:layout_gravity="center"
+              android:text="@string/appcompat_vector_disabled"
+              android:layout_margin="16dp"/>
+
+</FrameLayout>
\ No newline at end of file
diff --git a/samples/Support7Demos/res/layout/appcompat_night_mode.xml b/samples/Support7Demos/res/layout/appcompat_night_mode.xml
new file mode 100644
index 0000000..07a742d
--- /dev/null
+++ b/samples/Support7Demos/res/layout/appcompat_night_mode.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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.
+-->
+
+<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent">
+
+    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+                  android:layout_width="match_parent"
+                  android:layout_height="wrap_content"
+                  android:orientation="vertical"
+                  android:padding="16dp">
+
+        <Button android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:text="@string/mode_night_no"
+                android:onClick="setModeNightNo"/>
+
+        <Button android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:text="@string/mode_night_yes"
+                android:onClick="setModeNightYes"/>
+
+        <Button android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:text="@string/mode_night_auto"
+                android:onClick="setModeNightAuto"/>
+
+    </LinearLayout>
+
+</ScrollView>
\ No newline at end of file
diff --git a/samples/Support7Demos/res/layout/appcompat_widgets_buttons.xml b/samples/Support7Demos/res/layout/appcompat_widgets_buttons.xml
new file mode 100644
index 0000000..aa07328
--- /dev/null
+++ b/samples/Support7Demos/res/layout/appcompat_widgets_buttons.xml
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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.
+-->
+
+<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent">
+
+    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+                  android:layout_width="match_parent"
+                  android:layout_height="wrap_content"
+                  android:orientation="vertical"
+                  android:padding="16dp">
+
+        <android.support.v7.widget.SwitchCompat
+                android:layout_height="wrap_content"
+                android:layout_width="wrap_content"
+                android:text="Switch"/>
+
+        <CheckBox
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="CheckBox"/>
+
+        <RadioGroup
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:orientation="horizontal">
+
+            <RadioButton
+                    android:id="@+id/radiobutton_1"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="RadioButton"/>
+
+            <RadioButton
+                    android:id="@+id/radiobutton_2"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="RadioButton"/>
+
+        </RadioGroup>
+
+        <Button
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="Button"/>
+
+        <Button
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="Button (small)"
+                style="@style/Widget.AppCompat.Button.Small"/>
+
+        <Button
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="Button (borderless)"
+                style="@style/Widget.AppCompat.Button.Borderless"/>
+
+        <Button
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="Button (borderless + colored)"
+                style="@style/Widget.AppCompat.Button.Borderless.Colored"/>
+
+        <RatingBar
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"/>
+
+    </LinearLayout>
+
+</ScrollView>
\ No newline at end of file
diff --git a/samples/Support7Demos/res/layout/appcompat_widgets_text_input.xml b/samples/Support7Demos/res/layout/appcompat_widgets_text_input.xml
new file mode 100644
index 0000000..d242735
--- /dev/null
+++ b/samples/Support7Demos/res/layout/appcompat_widgets_text_input.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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="match_parent"
+        android:layout_height="match_parent"
+        android:orientation="vertical"
+        android:padding="16dp">
+
+    <EditText
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:hint="EditText"/>
+
+    <AutoCompleteTextView
+            android:id="@+id/widgets_autocompletetextview"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:hint="AutoCompleteTextView"/>
+
+    <MultiAutoCompleteTextView
+            android:id="@+id/widgets_multiautocompletetextview"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:hint="MultiAutoCompleteTextView"/>
+
+    <CheckedTextView
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="CheckedTextView"
+            android:checked="true"
+            android:checkMark="?android:listChoiceIndicatorMultiple"/>
+
+</LinearLayout>
+
+
diff --git a/samples/Support7Demos/res/layout/appcompat_widgets_text_spinners.xml b/samples/Support7Demos/res/layout/appcompat_widgets_text_spinners.xml
new file mode 100644
index 0000000..0a60632
--- /dev/null
+++ b/samples/Support7Demos/res/layout/appcompat_widgets_text_spinners.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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="match_parent"
+              android:layout_height="match_parent"
+              android:orientation="vertical"
+              android:padding="16dp">
+
+    <Spinner
+            android:id="@+id/widgets_spinner"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"/>
+
+    <Spinner
+            android:id="@+id/widgets_spinner_underlined"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            style="@style/Widget.AppCompat.Spinner.Underlined"/>
+
+</LinearLayout>
+
+
diff --git a/samples/Support7Demos/res/layout/config_view_toggle.xml b/samples/Support7Demos/res/layout/config_view_toggle.xml
new file mode 100644
index 0000000..ac187ff
--- /dev/null
+++ b/samples/Support7Demos/res/layout/config_view_toggle.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<CheckBox xmlns:android="http://schemas.android.com/apk/res/android"
+              android:layout_width="wrap_content"
+              android:layout_height="match_parent">
+
+</CheckBox>
\ No newline at end of file
diff --git a/samples/Support7Demos/res/layout/dialog_content.xml b/samples/Support7Demos/res/layout/dialog_content.xml
new file mode 100644
index 0000000..7734960
--- /dev/null
+++ b/samples/Support7Demos/res/layout/dialog_content.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2014 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">
+
+    <TextView
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="@string/dialog_content"/>
+
+    <ImageView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:src="@drawable/app_sample_code" />
+
+</LinearLayout>
\ No newline at end of file
diff --git a/samples/Support7Demos/res/layout/dialog_content_buttons.xml b/samples/Support7Demos/res/layout/dialog_content_buttons.xml
new file mode 100644
index 0000000..ab69748
--- /dev/null
+++ b/samples/Support7Demos/res/layout/dialog_content_buttons.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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">
+
+    <TextView
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="@string/dialog_content"/>
+
+    <ImageView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:src="@drawable/app_sample_code" />
+
+    <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:gravity="right"
+            style="?attr/buttonBarStyle">
+
+        <Button
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="@android:string/no"
+                style="?attr/buttonBarButtonStyle"/>
+
+        <Button
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="@android:string/ok"
+                style="?attr/buttonBarButtonStyle"/>
+
+    </LinearLayout>
+
+</LinearLayout>
\ No newline at end of file
diff --git a/samples/Support7Demos/res/layout/dialog_usage.xml b/samples/Support7Demos/res/layout/dialog_usage.xml
new file mode 100644
index 0000000..4ef0626
--- /dev/null
+++ b/samples/Support7Demos/res/layout/dialog_usage.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2014 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:padding="16dp">
+
+    <Spinner
+            android:id="@+id/spinner_dialogs"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:entries="@array/dialog_types"
+            android:layout_marginBottom="16dp"/>
+
+    <Button
+            android:id="@+id/btn_show_dialog"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="Show selected dialog"
+            android:gravity="center"/>
+
+</LinearLayout>
\ No newline at end of file
diff --git a/samples/Support7Demos/res/layout/drawer_layout.xml b/samples/Support7Demos/res/layout/drawer_layout.xml
new file mode 100644
index 0000000..e2d0387
--- /dev/null
+++ b/samples/Support7Demos/res/layout/drawer_layout.xml
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<!--
+    A DrawerLayout is indended to be used as the top-level content view
+    using match_parent for both width and height to consume the full space available.
+    See https://www.google.com/design/spec/patterns/navigation-drawer.html#navigation-drawer-specs
+    for the full spec of a drawer in Material design.
+-->
+<android.support.v4.widget.DrawerLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/drawer_layout"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:fitsSystemWindows="true">
+    <!-- As the main content view, the view below consumes the entire
+         space available using match_parent in both dimensions. Note that
+         this child does not specify android:layout_gravity attribute. -->
+    <LinearLayout
+        android:id="@+id/content"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:orientation="vertical">
+        <!-- This will be set as the support action bar of the activity at runtime.
+             It needs to be a dynamic runtime call for correct vertical layering of
+             the drawer and the toolbar. -->
+        <android.support.v7.widget.Toolbar
+            android:id="@+id/toolbar"
+            android:layout_width="match_parent"
+            android:layout_height="?attr/actionBarSize" />
+
+        <ScrollView
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:scrollbarStyle="outsideOverlay">
+            <TextView
+                android:id="@+id/content_text"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:text="@string/drawer_layout_summary"
+                android:textAppearance="?android:attr/textAppearanceMedium"
+                android:padding="16dp"/>
+        </ScrollView>
+    </LinearLayout>
+
+    <!-- android:layout_gravity="start" tells DrawerLayout to treat
+         this as a sliding drawer on the starting side, which is
+         left for left-to-right locales. The drawer is given arbitrary
+         initial width and extends the full height of the container. A
+         solid background is used for contrast with the content view.
+         android:fitsSystemWindows="true" tells the system to have
+         DrawerLayout span the full height of the screen, including the
+         system status bar on Lollipop+ versions of the plaform. The actual
+         width of drawer will be determined at runtime based on the screen
+         size according to the Material spec. -->
+    <ListView
+            android:id="@+id/start_drawer"
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:layout_gravity="start"
+            android:background="#333333"
+            android:fitsSystemWindows="true"/>
+
+    <!-- android:layout_gravity="end" tells DrawerLayout to treat
+         this as a sliding drawer on the ending side, which is
+         right for left-to-right locales. The drawer is given arbitrary
+         initial width and extends the full height of the container. A
+         solid background is used for contrast with the content view.
+         The actual width of drawer will be determined at runtime based on
+         the screen size according to the Material spec. -->
+    <FrameLayout
+            android:id="@+id/end_drawer"
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:layout_gravity="end"
+            android:background="#808080"/>
+</android.support.v4.widget.DrawerLayout>
+
diff --git a/samples/Support7Demos/res/layout/grid_layout_1.xml b/samples/Support7Demos/res/layout/grid_layout_1.xml
new file mode 100644
index 0000000..c3b1537
--- /dev/null
+++ b/samples/Support7Demos/res/layout/grid_layout_1.xml
@@ -0,0 +1,47 @@
+<?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.
+-->
+
+<!--
+    Demonstrates using GridLayout to build the "Simple Form" from the
+    LinearLayout and RelativeLayout demos.
+-->
+
+<android.support.v7.widget.GridLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:background="@drawable/blue"
+    android:padding="10dip"
+    app:columnCount="4"
+    >
+    <TextView
+        android:text="@string/grid_layout_1_instructions"
+    />
+    <EditText
+        app:layout_gravity="fill_horizontal"
+        app:layout_column="0"
+        app:layout_columnSpan="4"
+    />
+    <Button
+        android:text="@string/grid_layout_1_cancel"
+        app:layout_column="2"
+    />
+    <Button
+        android:text="@string/grid_layout_1_ok"
+        android:layout_marginLeft="10dip"
+    />
+</android.support.v7.widget.GridLayout>
diff --git a/samples/Support7Demos/res/layout/grid_layout_2.xml b/samples/Support7Demos/res/layout/grid_layout_2.xml
new file mode 100644
index 0000000..b7ee40c
--- /dev/null
+++ b/samples/Support7Demos/res/layout/grid_layout_2.xml
@@ -0,0 +1,64 @@
+<?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.
+-->
+
+<android.support.v7.widget.GridLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    app:useDefaultMargins="true"
+    app:alignmentMode="alignBounds"
+    app:columnOrderPreserved="false"
+    app:columnCount="4"
+    >
+    <TextView
+        android:text="Email setup"
+        android:textSize="32dip"
+        app:layout_columnSpan="4"
+        app:layout_gravity="center_horizontal"
+    />
+    <TextView
+        android:text="You can configure email in a few simple steps:"
+        android:textSize="16dip"
+        app:layout_columnSpan="4"
+        app:layout_gravity="left"
+    />
+    <TextView
+        android:text="Email address:"
+        app:layout_gravity="right"
+    />
+    <EditText
+        android:ems="10"
+    />
+    <TextView
+        android:text="Password:"
+        app:layout_column="0"
+        app:layout_gravity="right"
+    />
+    <EditText
+        android:ems="8"
+    />
+    <Button
+        android:text="Manual setup"
+        app:layout_row="5"
+        app:layout_column="3"
+    />
+    <Button
+        android:text="Next"
+        app:layout_column="3"
+        app:layout_gravity="fill_horizontal"
+    />
+</android.support.v7.widget.GridLayout>
diff --git a/samples/Support7Demos/res/layout/list_popup_window_activity.xml b/samples/Support7Demos/res/layout/list_popup_window_activity.xml
new file mode 100644
index 0000000..34da5bb
--- /dev/null
+++ b/samples/Support7Demos/res/layout/list_popup_window_activity.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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.
+-->
+
+<RelativeLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/container"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+    <Button
+        android:id="@+id/test_button"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_alignParentTop="true"
+        android:layout_centerHorizontal="true"
+        android:text="@string/list_popup_window_button" />
+
+    <CheckBox
+        android:id="@+id/is_modal"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_alignParentBottom="true"
+        android:layout_centerHorizontal="true"
+        android:text="@string/list_popup_window_is_modal"
+        android:checked="true" />
+
+    <TextView
+        android:id="@+id/log"
+        android:layout_width="match_parent"
+        android:layout_height="150dip"
+        android:layout_above="@id/is_modal"
+        android:padding="8dip"
+        android:background="#E5E5E5" />
+
+    <TextView
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_above="@id/log"
+        android:padding="8dip"
+        android:textStyle="bold"
+        android:text="@string/list_popup_window_summary" />
+</RelativeLayout>
+
diff --git a/samples/Support7Demos/res/layout/media_item.xml b/samples/Support7Demos/res/layout/media_item.xml
new file mode 100644
index 0000000..e5d6d02
--- /dev/null
+++ b/samples/Support7Demos/res/layout/media_item.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 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.
+-->
+
+<!-- Layout for list item in Library or Playlist view. Displays ImageButton
+     instead of radio button to the right of the item. -->
+
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:orientation="horizontal"
+        android:gravity="center_vertical">
+
+    <ImageButton android:id="@+id/item_action"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:minWidth="48dp"
+        android:minHeight="48dp"
+        android:layout_alignParentRight="true"
+        android:layout_centerVertical="true"
+        android:background="@null"/>
+
+    <TextView android:id="@+id/item_text"
+        android:layout_width="fill_parent"
+        android:layout_height="wrap_content"
+        android:textAppearance="?android:attr/textAppearanceSmall"
+        android:layout_centerVertical="true"
+        android:layout_toLeftOf="@id/item_action"
+        android:layout_gravity="left"
+        android:gravity="left"/>
+</RelativeLayout>
diff --git a/samples/Support7Demos/res/layout/overlay_display_window.xml b/samples/Support7Demos/res/layout/overlay_display_window.xml
new file mode 100644
index 0000000..36b4a0d
--- /dev/null
+++ b/samples/Support7Demos/res/layout/overlay_display_window.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 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.
+-->
+
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+      android:layout_width="match_parent"
+      android:layout_height="match_parent"
+      android:background="#000000">
+    <TextureView android:id="@+id/overlay_display_window_texture"
+               android:layout_width="0px"
+               android:layout_height="0px" />
+    <TextView android:id="@+id/overlay_display_window_title"
+               android:layout_width="wrap_content"
+               android:layout_height="wrap_content"
+               android:layout_gravity="top|center_horizontal" />
+</FrameLayout>
diff --git a/samples/Support7Demos/res/layout/palette_activity_detail.xml b/samples/Support7Demos/res/layout/palette_activity_detail.xml
new file mode 100644
index 0000000..e59abce
--- /dev/null
+++ b/samples/Support7Demos/res/layout/palette_activity_detail.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2014 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="match_parent"
+      android:layout_height="match_parent"
+      android:orientation="vertical">
+
+    <include layout="@layout/palette_list_item" />
+
+    <TextView
+          android:layout_width="match_parent"
+          android:layout_height="wrap_content"
+          android:text="@string/palette_all_colors"
+          style="?android:attr/listSeparatorTextViewStyle"/>
+
+    <GridView
+          android:id="@+id/palette"
+          android:layout_width="match_parent"
+          android:layout_height="wrap_content"
+          android:layout_weight="1"
+          android:columnWidth="@dimen/color_palette_size"
+          android:numColumns="auto_fit"/>
+
+</LinearLayout>
diff --git a/samples/Support7Demos/res/layout/palette_grid_item.xml b/samples/Support7Demos/res/layout/palette_grid_item.xml
new file mode 100644
index 0000000..29e11eb
--- /dev/null
+++ b/samples/Support7Demos/res/layout/palette_grid_item.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2014 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.
+-->
+
+<View xmlns:android="http://schemas.android.com/apk/res/android"
+          android:layout_width="match_parent"
+          android:layout_height="@dimen/color_palette_size" />
\ No newline at end of file
diff --git a/samples/Support7Demos/res/layout/palette_list_item.xml b/samples/Support7Demos/res/layout/palette_list_item.xml
new file mode 100644
index 0000000..ea9fa7d
--- /dev/null
+++ b/samples/Support7Demos/res/layout/palette_list_item.xml
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 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="match_parent"
+    android:layout_height="110dp"
+    android:divider="?android:attr/dividerHorizontal"
+    android:orientation="horizontal"
+    android:showDividers="middle">
+
+    <ImageView
+        android:id="@+id/image"
+        android:layout_width="130dp"
+        android:layout_height="match_parent"
+        android:layout_weight="1"
+        android:scaleType="fitCenter" />
+
+    <TextView
+        android:id="@+id/text_light_vibrant"
+        android:layout_width="wrap_content"
+        android:layout_height="match_parent"
+        android:layout_weight="1"
+        android:gravity="center"
+        android:textAppearance="?android:attr/textAppearanceInverse"
+        android:text="LV" />
+
+    <TextView
+        android:id="@+id/text_vibrant"
+        android:layout_width="wrap_content"
+        android:layout_height="match_parent"
+        android:layout_weight="1"
+        android:gravity="center"
+        android:text="V" />
+
+    <TextView
+        android:id="@+id/text_dark_vibrant"
+        android:layout_width="wrap_content"
+        android:layout_height="match_parent"
+        android:layout_weight="1"
+        android:gravity="center"
+        android:text="DV" />
+
+    <TextView
+        android:id="@+id/text_light_muted"
+        android:layout_width="wrap_content"
+        android:layout_height="match_parent"
+        android:layout_weight="1"
+        android:gravity="center"
+        android:textAppearance="?android:attr/textAppearanceInverse"
+        android:text="LM" />
+
+    <TextView
+        android:id="@+id/text_muted"
+        android:layout_width="wrap_content"
+        android:layout_height="match_parent"
+        android:layout_weight="1"
+        android:gravity="center"
+        android:text="M" />
+
+    <TextView
+        android:id="@+id/text_dark_muted"
+        android:layout_width="wrap_content"
+        android:layout_height="match_parent"
+        android:layout_weight="1"
+        android:gravity="center"
+        android:text="DM" />
+
+</LinearLayout>
diff --git a/samples/Support7Demos/res/layout/popup_menu_activity.xml b/samples/Support7Demos/res/layout/popup_menu_activity.xml
new file mode 100644
index 0000000..c3ed4f5
--- /dev/null
+++ b/samples/Support7Demos/res/layout/popup_menu_activity.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2016 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.
+-->
+
+<RelativeLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/container"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+    <Button
+        android:id="@+id/test_button"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_alignParentTop="true"
+        android:layout_centerHorizontal="true"
+        android:text="@string/popup_menu_button" />
+
+    <TextView
+        android:id="@+id/log"
+        android:layout_width="match_parent"
+        android:layout_height="150dip"
+        android:layout_alignParentBottom="true"
+        android:padding="8dip"
+        android:background="#E5E5E5" />
+
+    <TextView
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_above="@id/log"
+        android:padding="8dip"
+        android:textStyle="bold"
+        android:text="@string/popup_menu_summary" />
+</RelativeLayout>
+
diff --git a/samples/Support7Demos/res/layout/sample_media_controller.xml b/samples/Support7Demos/res/layout/sample_media_controller.xml
new file mode 100644
index 0000000..4335b04
--- /dev/null
+++ b/samples/Support7Demos/res/layout/sample_media_controller.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 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.
+-->
+
+<!-- Layout for the customized MediaRouteControllerDialog -->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical">
+    <LinearLayout android:id="@+id/media_route_info"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_weight="1">
+        <ImageView
+            android:id="@+id/snapshot"
+            android:layout_width="100dp"
+            android:layout_height="100dp"
+            android:scaleType="centerCrop"/>
+        <TextView android:id="@+id/track_info"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:padding="4dp"/>
+    </LinearLayout>
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_weight="0"
+        android:gravity="center">
+        <ImageButton android:id="@+id/pause_resume_button"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:minWidth="48dp"
+            android:minHeight="48dp"
+            android:background="@null"
+            android:src="@drawable/ic_media_pause" />
+        <ImageButton android:id="@+id/stop_button"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:minWidth="48dp"
+            android:minHeight="48dp"
+            android:background="@null"
+            android:src="@drawable/ic_media_stop" />
+    </LinearLayout>
+
+</LinearLayout>
diff --git a/samples/Support7Demos/res/layout/sample_media_router.xml b/samples/Support7Demos/res/layout/sample_media_router.xml
new file mode 100644
index 0000000..618a8e4
--- /dev/null
+++ b/samples/Support7Demos/res/layout/sample_media_router.xml
@@ -0,0 +1,143 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<!-- See corresponding Java code SampleMediaRouterActivity.java. -->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:orientation="vertical">
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        android:layout_weight="1"
+        android:orientation="vertical">
+        <!-- Tabs for media library, playlist and statistics -->
+        <TabHost android:id="@+id/tabHost"
+            android:layout_width="fill_parent"
+            android:layout_height="fill_parent"
+            android:layout_weight="1">
+            <LinearLayout
+                android:orientation="vertical"
+                android:layout_width="fill_parent"
+                android:layout_height="fill_parent">
+                <TabWidget android:id="@android:id/tabs"
+                    android:layout_width="fill_parent"
+                    android:layout_height="wrap_content" />
+
+                <FrameLayout android:id="@android:id/tabcontent"
+                    android:layout_width="fill_parent"
+                    android:layout_height="wrap_content">
+                    <LinearLayout android:id="@+id/tab1"
+                        android:layout_width="fill_parent"
+                        android:layout_height="wrap_content"
+                        android:orientation="vertical">
+                        <ListView android:id="@+id/media"
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_weight="1" />
+                    </LinearLayout>
+
+                    <LinearLayout android:id="@+id/tab2"
+                        android:layout_width="fill_parent"
+                        android:layout_height="fill_parent"
+                        android:orientation="vertical">
+                        <ListView android:id="@+id/playlist"
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_weight="1"/>
+                    </LinearLayout>
+
+                    <LinearLayout android:id="@+id/tab3"
+                        android:layout_width="fill_parent"
+                        android:layout_height="fill_parent"
+                        android:orientation="vertical">
+                        <TextView android:id="@+id/info"
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_weight="1"
+                            android:textAppearance="?android:attr/textAppearanceMedium"/>
+                    </LinearLayout>
+                </FrameLayout>
+            </LinearLayout>
+        </TabHost>
+
+        <!-- Control buttons for the currently selected route. -->
+        <CheckBox android:id="@+id/custom_control_view_checkbox"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:text="@string/use_default_media_control"
+                android:checked="true"
+                android:visibility="gone"/>
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_weight="0">
+
+            <SeekBar android:id="@+id/seekbar"
+                 android:layout_width="fill_parent"
+                 android:layout_height="wrap_content"
+                 style="?android:attr/progressBarStyleHorizontal"
+                 android:max="100"
+                 android:progress="0"
+                 android:layout_gravity="center"
+                 android:layout_weight="1"/>
+
+            <ImageButton android:id="@+id/pause_resume_button"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_weight="0"
+                android:layout_gravity="right"
+                android:minWidth="48dp"
+                android:minHeight="48dp"
+                android:background="@null"
+                android:src="@drawable/ic_media_pause" />
+
+            <ImageButton android:id="@+id/stop_button"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_weight="0"
+                android:layout_gravity="right"
+                android:minWidth="48dp"
+                android:minHeight="48dp"
+                android:background="@null"
+                android:src="@drawable/ic_media_stop" />
+        </LinearLayout>
+
+    </LinearLayout>
+
+    <!-- Some content for visual interest in the case where no presentation is showing. -->
+    <FrameLayout android:id="@+id/player"
+        android:background="#ff000000"
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        android:layout_weight="1">
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:gravity="center">
+            <SurfaceView android:id="@+id/surface_view"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"/>
+        </LinearLayout>
+        <TextView
+            android:textColor="#ffaaaaaa"
+            android:text="@string/sample_media_route_activity_local"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="top|center_horizontal" />
+    </FrameLayout>
+</LinearLayout>
diff --git a/samples/Support7Demos/res/layout/sample_media_router_presentation.xml b/samples/Support7Demos/res/layout/sample_media_router_presentation.xml
new file mode 100644
index 0000000..f029627
--- /dev/null
+++ b/samples/Support7Demos/res/layout/sample_media_router_presentation.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<!-- The content that we show on secondary displays.
+     See corresponding Java code PresentationWithMediaRouterActivity.java. -->
+
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="#ff000000">
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:gravity="center">
+        <SurfaceView android:id="@+id/surface_view"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"/>
+    </LinearLayout>
+    <TextView
+        android:textColor="#ffaaaaaa"
+        android:text="@string/sample_media_route_activity_presentation"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_gravity="top|center_horizontal" />
+</FrameLayout>
diff --git a/samples/Support7Demos/res/layout/selectable_item.xml b/samples/Support7Demos/res/layout/selectable_item.xml
new file mode 100644
index 0000000..90aa080
--- /dev/null
+++ b/samples/Support7Demos/res/layout/selectable_item.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+              android:orientation="horizontal"
+              android:onClick="itemClicked"
+              android:layout_width="match_parent"
+              android:layout_height="match_parent">
+    <CheckBox
+            android:id="@+id/selected"
+            android:onClick="checkboxClicked"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"/>
+    <TextView
+            android:id="@+id/text"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"/>
+</LinearLayout>
\ No newline at end of file
diff --git a/samples/Support7Demos/res/layout/sorted_list_activity.xml b/samples/Support7Demos/res/layout/sorted_list_activity.xml
new file mode 100644
index 0000000..e20db0f
--- /dev/null
+++ b/samples/Support7Demos/res/layout/sorted_list_activity.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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">
+    <EditText
+            android:id="@+id/new_item_text_view"
+            style="@style/SortedListItem"
+            android:imeOptions="actionDone"
+            android:singleLine="true"
+            android:hint="@string/add_new_item"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"/>
+
+    <android.support.v7.widget.RecyclerView android:layout_width="match_parent"
+                                            android:layout_height="match_parent"
+                                            android:id="@+id/recycler_view"/>
+</LinearLayout>
\ No newline at end of file
diff --git a/samples/Support7Demos/res/layout/sorted_list_item_view.xml b/samples/Support7Demos/res/layout/sorted_list_item_view.xml
new file mode 100644
index 0000000..cd476ab
--- /dev/null
+++ b/samples/Support7Demos/res/layout/sorted_list_item_view.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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.
+-->
+
+<CheckBox xmlns:android="http://schemas.android.com/apk/res/android"
+          style="@style/SortedListItem"
+          android:layout_width="match_parent"
+          android:layout_height="wrap_content">
+</CheckBox>
\ No newline at end of file
diff --git a/samples/Support7Demos/res/layout/toolbar_action_mode.xml b/samples/Support7Demos/res/layout/toolbar_action_mode.xml
new file mode 100644
index 0000000..e2a1dd8
--- /dev/null
+++ b/samples/Support7Demos/res/layout/toolbar_action_mode.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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="match_parent"
+              android:layout_height="match_parent"
+              android:orientation="vertical">
+
+    <android.support.v7.widget.Toolbar
+            android:id="@+id/toolbar"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:minHeight="?actionBarSize"
+            android:background="?attr/colorPrimaryDark"/>
+
+    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+                 android:layout_width="match_parent"
+                 android:layout_height="0px"
+                 android:layout_weight="1">
+
+        <Button
+                android:id="@+id/btn_start_action_mode"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center"
+                android:text="@string/start_action_mode"/>
+
+    </FrameLayout>
+
+</LinearLayout>
\ No newline at end of file
diff --git a/samples/Support7Demos/res/layout/toolbar_display_options.xml b/samples/Support7Demos/res/layout/toolbar_display_options.xml
new file mode 100644
index 0000000..cc3e66c
--- /dev/null
+++ b/samples/Support7Demos/res/layout/toolbar_display_options.xml
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 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"
+              xmlns:app="http://schemas.android.com/apk/res-auto"
+              android:layout_width="match_parent"
+              android:layout_height="match_parent"
+              android:orientation="vertical">
+
+    <android.support.v7.widget.Toolbar
+            android:id="@+id/toolbar"
+            android:layout_height="wrap_content"
+            android:layout_width="match_parent"
+            android:minHeight="?attr/actionBarSize"
+            android:background="?attr/colorPrimary" />
+
+    <ScrollView
+            android:layout_width="match_parent"
+            android:layout_height="match_parent">
+
+        <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:orientation="vertical">
+
+            <Button
+                    android:id="@+id/toggle_home_as_up"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/toggle_home_as_up"/>
+
+            <Button
+                    android:id="@+id/toggle_show_home"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/toggle_show_home"/>
+
+            <Button
+                    android:id="@+id/toggle_use_logo"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/toggle_use_logo"/>
+
+            <Button
+                    android:id="@+id/toggle_show_title"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/toggle_show_title"/>
+
+            <Button
+                    android:id="@+id/toggle_show_custom"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/toggle_show_custom"/>
+
+            <Button
+                    android:id="@+id/cycle_custom_gravity"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/cycle_custom_gravity"/>
+
+            <Button
+                    android:id="@+id/toggle_visibility"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/toggle_visibility"/>
+
+        </LinearLayout>
+
+    </ScrollView>
+
+</LinearLayout>
\ No newline at end of file
diff --git a/samples/Support7Demos/res/layout/toolbar_fragment_pager.xml b/samples/Support7Demos/res/layout/toolbar_fragment_pager.xml
new file mode 100644
index 0000000..9f56f19
--- /dev/null
+++ b/samples/Support7Demos/res/layout/toolbar_fragment_pager.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 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="match_parent"
+              android:layout_height="match_parent"
+              android:orientation="vertical">
+
+    <android.support.v7.widget.Toolbar
+            android:id="@+id/toolbar"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:minHeight="?actionBarSize"
+            android:background="?attr/colorPrimaryDark" />
+
+    <android.support.v4.view.ViewPager
+            android:id="@+id/viewpager"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"/>
+
+</LinearLayout>
\ No newline at end of file
diff --git a/samples/Support7Demos/res/layout/toolbar_usage.xml b/samples/Support7Demos/res/layout/toolbar_usage.xml
new file mode 100644
index 0000000..76944be
--- /dev/null
+++ b/samples/Support7Demos/res/layout/toolbar_usage.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2014 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"
+              xmlns:app="http://schemas.android.com/apk/res-auto"
+              android:orientation="vertical"
+              android:layout_width="match_parent"
+              android:layout_height="match_parent">
+
+    <android.support.v7.widget.Toolbar
+            android:id="@+id/toolbar"
+            android:layout_height="wrap_content"
+            android:layout_width="match_parent"
+            android:minHeight="?attr/actionBarSize"
+            android:background="?attr/colorPrimaryDark"
+            android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
+            app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
+
+    <TextView
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:text="Your content"
+            android:gravity="center"
+            android:textAppearance="?android:attr/textAppearanceLarge"/>
+
+</LinearLayout>
\ No newline at end of file
diff --git a/samples/Support7Demos/res/layout/touch_item.xml b/samples/Support7Demos/res/layout/touch_item.xml
new file mode 100644
index 0000000..7ff9547
--- /dev/null
+++ b/samples/Support7Demos/res/layout/touch_item.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
+                                    xmlns:card="http://schemas.android.com/apk/res-auto"
+                                    android:layout_width="match_parent"
+                                    card:cardUseCompatPadding="true"
+                                    android:background="@color/card_classic"
+                                    android:layout_height="wrap_content">
+    <TextView android:layout_width="wrap_content"
+              android:textColor="@android:color/black"
+              android:layout_height="@dimen/touch_item_min_height"
+              android:id="@+id/text_view"/>
+    <Button android:layout_width="wrap_content" android:layout_height="wrap_content"
+            android:layout_gravity="end|center_vertical"
+            android:id="@+id/action_button" android:visibility="gone"/>
+    <FrameLayout
+            android:id="@+id/overlay"
+            android:visibility="gone"
+            android:background="@color/card_tropical"
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/touch_item_min_height">
+        <TextView android:layout_width="wrap_content"
+                  android:layout_height="wrap_content"
+                  android:layout_gravity="center"
+                  android:text="@string/swiping"/>
+    </FrameLayout>
+</android.support.v7.widget.CardView>
\ No newline at end of file
diff --git a/samples/Support7Demos/res/menu/action_bar_settings_action_provider.xml b/samples/Support7Demos/res/menu/action_bar_settings_action_provider.xml
new file mode 100644
index 0000000..e9bb931
--- /dev/null
+++ b/samples/Support7Demos/res/menu/action_bar_settings_action_provider.xml
@@ -0,0 +1,27 @@
+<?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"
+        xmlns:app="http://schemas.android.com/apk/res-auto">
+    <item android:id="@+id/menu_item_action_provider_action_bar"
+        android:title="@string/action_bar_settings"
+        app:showAsAction="ifRoom"
+        app:actionProviderClass="com.example.android.supportv7.app.ActionBarSettingsActionProviderActivity$SettingsActionProvider"/>
+
+    <item android:id="@+id/menu_item_action_provider_overflow"
+        android:title="@string/action_bar_settings"
+        app:showAsAction="never"
+        app:actionProviderClass="com.example.android.supportv7.app.ActionBarSettingsActionProviderActivity$SettingsActionProvider"/>
+</menu>
diff --git a/samples/Support7Demos/res/menu/action_bar_share_action_provider.xml b/samples/Support7Demos/res/menu/action_bar_share_action_provider.xml
new file mode 100644
index 0000000..6d73f34
--- /dev/null
+++ b/samples/Support7Demos/res/menu/action_bar_share_action_provider.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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"
+        xmlns:app="http://schemas.android.com/apk/res-auto">
+
+    <item android:id="@+id/menu_item_share_provider_action_bar"
+        android:title="@string/action_bar_share"
+        app:showAsAction="ifRoom"
+        app:actionProviderClass="android.support.v7.widget.ShareActionProvider"/>
+
+</menu>
diff --git a/samples/Support7Demos/res/menu/actions.xml b/samples/Support7Demos/res/menu/actions.xml
new file mode 100644
index 0000000..e3b576e
--- /dev/null
+++ b/samples/Support7Demos/res/menu/actions.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 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"
+        xmlns:app="http://schemas.android.com/apk/res-auto">
+    <item android:id="@+id/action_search"
+          android:title="@string/action_bar_search"
+          android:icon="@drawable/ic_search"
+          app:showAsAction="ifRoom|collapseActionView"
+          app:actionViewClass="android.support.v7.widget.SearchView" />
+    <item android:id="@+id/action_add"
+          android:icon="@android:drawable/ic_menu_add"
+          android:title="@string/action_bar_add" />
+    <item android:id="@+id/action_edit"
+          android:icon="@android:drawable/ic_menu_edit"
+          android:title="@string/action_bar_edit"
+          app:showAsAction="always" />
+    <item android:id="@+id/action_share"
+          android:icon="@android:drawable/ic_menu_share"
+          android:title="@string/action_bar_share"
+          android:enabled="false"
+          app:showAsAction="ifRoom" />
+    <item android:id="@+id/action_sort"
+          android:icon="@android:drawable/ic_menu_sort_by_size"
+          android:title="@string/action_bar_sort"
+          app:showAsAction="ifRoom">
+        <menu>
+            <item android:id="@+id/action_sort_size"
+                  android:icon="@android:drawable/ic_menu_sort_by_size"
+                  android:title="@string/action_bar_sort_size" />
+            <item android:id="@+id/action_sort_alpha"
+                  android:icon="@android:drawable/ic_menu_sort_alphabetically"
+                  android:title="@string/action_bar_sort_alpha" />
+        </menu>
+    </item>
+</menu>
diff --git a/samples/Support7Demos/res/menu/display_options_actions.xml b/samples/Support7Demos/res/menu/display_options_actions.xml
new file mode 100644
index 0000000..344e40d
--- /dev/null
+++ b/samples/Support7Demos/res/menu/display_options_actions.xml
@@ -0,0 +1,21 @@
+<?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.
+-->
+<menu xmlns:android="http://schemas.android.com/apk/res/android"
+        xmlns:app="http://schemas.android.com/apk/res-auto">
+    <item android:id="@+id/simple_item"
+          android:title="@string/display_options_menu_item"
+          app:showAsAction="ifRoom" />
+</menu>
diff --git a/samples/Support7Demos/res/menu/popup_menu.xml b/samples/Support7Demos/res/menu/popup_menu.xml
new file mode 100644
index 0000000..f50efc5
--- /dev/null
+++ b/samples/Support7Demos/res/menu/popup_menu.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2016 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/action_highlight"
+          android:title="@string/popup_menu_highlight" />
+    <item android:id="@+id/action_edit"
+          android:title="@string/popup_menu_edit" />
+    <item android:id="@+id/action_delete"
+          android:title="@string/popup_menu_delete" />
+    <item android:id="@+id/action_ignore"
+          android:title="@string/popup_menu_ignore" />
+    <item android:id="@+id/action_share"
+          android:title="@string/popup_menu_share">
+        <menu>
+            <item android:id="@+id/action_share_email"
+                  android:title="@string/popup_menu_share_email" />
+            <item android:id="@+id/action_share_circles"
+                  android:title="@string/popup_menu_share_circles" />
+        </menu>
+    </item>
+    <item android:id="@+id/action_print"
+          android:title="@string/popup_menu_print" />
+</menu>
diff --git a/samples/Support7Demos/res/menu/sample_media_router_menu.xml b/samples/Support7Demos/res/menu/sample_media_router_menu.xml
new file mode 100644
index 0000000..c93111f
--- /dev/null
+++ b/samples/Support7Demos/res/menu/sample_media_router_menu.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 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"
+        xmlns:app="http://schemas.android.com/apk/res-auto">
+    <item android:id="@+id/media_route_menu_item"
+        android:title="@string/media_route_menu_title"
+        app:showAsAction="always"
+        app:actionProviderClass=
+        "com.example.android.supportv7.media.SampleMediaRouterActivity$MyMediaRouteActionProvider"/>
+</menu>
diff --git a/samples/Support7Demos/res/menu/sample_palette_actions.xml b/samples/Support7Demos/res/menu/sample_palette_actions.xml
new file mode 100644
index 0000000..5f98efd
--- /dev/null
+++ b/samples/Support7Demos/res/menu/sample_palette_actions.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 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"
+      xmlns:app="http://schemas.android.com/apk/res-auto">
+
+    <item
+        android:id="@+id/menu_num_colors"
+        android:title="Num Colors"
+        app:showAsAction="always">
+
+        <menu>
+
+            <group android:checkableBehavior="single">
+
+                <item
+                    android:id="@+id/menu_num_colors_8"
+                    android:title="8" />
+
+                <item
+                      android:id="@+id/menu_num_colors_12"
+                      android:title="12" />
+
+                <item
+                    android:id="@+id/menu_num_colors_16"
+                    android:title="16"
+                    android:checked="true" />
+
+                <item
+                    android:id="@+id/menu_num_colors_24"
+                    android:title="24" />
+
+                <item
+                    android:id="@+id/menu_num_colors_32"
+                    android:title="32" />
+
+            </group>
+
+        </menu>
+
+    </item>
+
+</menu>
\ No newline at end of file
diff --git a/samples/Support7Demos/res/values/arrays.xml b/samples/Support7Demos/res/values/arrays.xml
new file mode 100644
index 0000000..a32c09e
--- /dev/null
+++ b/samples/Support7Demos/res/values/arrays.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<resources>
+    <string-array name="media_names">
+        <item>Big Buck Bunny</item>
+        <item>Elephants Dream</item>
+        <item>Sintel</item>
+        <item>Tears of Steel</item>
+    </string-array>
+
+    <string-array name="media_uris">
+        <item>http://archive.org/download/BigBuckBunny_328/BigBuckBunny_512kb.mp4</item>
+        <item>http://archive.org/download/ElephantsDream_277/elephant_dreams_640_512kb.mp4</item>
+        <item>http://archive.org/download/Sintel/sintel-2048-stereo_512kb.mp4</item>
+        <item>http://archive.org/download/Tears-of-Steel/tears_of_steel_720p.mp4</item>
+    </string-array>
+
+    <string-array name="dialog_types">
+        <item>Simple</item>
+        <item>Button bar</item>
+    </string-array>
+
+    <string-array name="alert_dialog_types">
+        <item>Simple</item>
+        <item>Simple with buttons</item>
+        <item>List (single choice)</item>
+        <item>List (multi choice)</item>
+    </string-array>
+
+</resources>
diff --git a/samples/Support7Demos/res/values/colors.xml b/samples/Support7Demos/res/values/colors.xml
new file mode 100644
index 0000000..8667546
--- /dev/null
+++ b/samples/Support7Demos/res/values/colors.xml
@@ -0,0 +1,26 @@
+<?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="blue">#770000ff</drawable>
+    <color name="card_yellow">#FCF0AD</color>
+    <color name="card_aquatic">#FCF0AD</color>
+    <color name="card_classic">#BAB7A9</color>
+    <color name="card_sunbrite">#F9D6AC</color>
+    <color name="card_tropical">#56C4E8</color>
+
+    <color name="drawer_sample_metal_blue">#FF505080</color>
+</resources>
diff --git a/samples/Support7Demos/res/values/dimens.xml b/samples/Support7Demos/res/values/dimens.xml
new file mode 100644
index 0000000..f2520b9
--- /dev/null
+++ b/samples/Support7Demos/res/values/dimens.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 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="color_palette_size">60dp</dimen>
+    <dimen name="touch_item_min_height">60dp</dimen>
+
+</resources>
diff --git a/samples/Support7Demos/res/values/strings.xml b/samples/Support7Demos/res/values/strings.xml
new file mode 100644
index 0000000..edafbd1
--- /dev/null
+++ b/samples/Support7Demos/res/values/strings.xml
@@ -0,0 +1,220 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="activity_sample_code">Support v7 Demos</string>
+
+    <!-- MediaRouter -->
+
+    <string name="sample_media_router_activity_dark">MediaRouter/Dark Theme</string>
+    <string name="sample_media_router_activity_light">MediaRouter/Light Theme</string>
+    <string name="sample_media_router_activity_light_with_dark_action_bar">MediaRouter/Light Theme, Dark Action Bar</string>
+    <string name="sample_media_router_text">This activity demonstrates how to
+            use MediaRouter from the support library.  Select a route from the action bar.</string>
+    <string name="media_route_menu_title">Play on...</string>
+    <string name="sample_media_route_settings_activity">Sample route settings</string>
+
+    <string name="use_default_media_control">Use default media control</string>
+    <string name="my_media_control_text">My Media Control</string>
+
+    <string name="library_tab_text">Library</string>
+    <string name="playlist_tab_text">Playlist</string>
+    <string name="info_tab_text">Route Info</string>
+
+    <string name="sample_media_route_provider_service">Media Route Provider Service Support Library Sample</string>
+    <string name="fixed_volume_route_name">Fixed Volume Remote Playback Route</string>
+    <string name="variable_volume_basic_route_name">Variable Volume (Basic) Remote Playback Route</string>
+    <string name="variable_volume_queuing_route_name">Variable Volume (Queuing) Remote Playback Route</string>
+    <string name="variable_volume_session_route_name">Variable Volume (Session) Remote Playback Route</string>
+    <string name="variable_volume_route_group_name">Variable Volume Route Group</string>
+    <string name="mixed_volume_route_group_name">Mixed Volume Route Group</string>
+    <string name="sample_route_description">Sample route from Support7Demos</string>
+
+    <!-- GridLayout -->
+
+    <string name="grid_layout_1">GridLayout/1. Simple Form</string>
+    <string name="grid_layout_2">GridLayout/2. Form (XML)</string>
+    <string name="grid_layout_3">GridLayout/3. Form (Java)</string>
+
+    <string name="grid_layout_1_instructions">Type here:</string>
+    <string name="grid_layout_1_ok">Ok</string>
+    <string name="grid_layout_1_cancel">Cancel</string>
+
+    <!-- ActionBar -->
+
+    <string name="action_bar_mechanics">AppCompat/Action Bar/Action Bar Mechanics</string>
+    <string name="action_bar_usage">AppCompat/Action Bar/Action Bar Usage</string>
+    <string name="action_bar_tabs">AppCompat/Action Bar/Action Bar Tabs</string>
+    <string name="action_bar_settings_action_provider">AppCompat/Action Bar/Settings Action Provider</string>
+    <string name="action_bar_share_action_provider">AppCompat/Action Bar/ShareActionProvider</string>
+    <string name="action_bar_settings_action_provider_no_handling">Handling in onOptionsItemSelected avoided</string>
+    <string name="action_bar_with_navigation_drawer">AppCompat/Action Bar/Navigation Drawer Toggle</string>
+    <string name="action_bar_preferences">AppCompat/Action Bar/Preferences</string>
+    <string name="action_bar_action_mode">AppCompat/Action Bar/Action Mode</string>
+    <string name="action_bar_hide_scroll">AppCompat/Action Bar/Hide on Scroll</string>
+    <string name="appcompat_widgets_buttons">AppCompat/Widgets/Buttons</string>
+    <string name="appcompat_widgets_spinners">AppCompat/Widgets/Spinners</string>
+    <string name="appcompat_widgets_text_input">AppCompat/Widgets/Text Input</string>
+
+    <string name="action_bar_search">Search</string>
+    <string name="action_bar_add">Add</string>
+    <string name="action_bar_edit">Edit</string>
+    <string name="action_bar_share">Share</string>
+    <string name="action_bar_sort">Sort</string>
+    <string name="action_bar_sort_alpha">Alphabetically</string>
+    <string name="action_bar_sort_size">By size</string>
+    <string name="action_bar_settings">Settings</string>
+
+    <string name="action_bar_display_options">AppCompat/Action Bar/Display Options</string>
+    <string name="toggle_home_as_up">DISPLAY_HOME_AS_UP</string>
+    <string name="toggle_show_home">DISPLAY_SHOW_HOME</string>
+    <string name="toggle_use_logo">DISPLAY_USE_LOGO</string>
+    <string name="toggle_show_title">DISPLAY_SHOW_TITLE</string>
+    <string name="toggle_show_custom">DISPLAY_SHOW_CUSTOM</string>
+    <string name="toggle_navigation">Navigation</string>
+    <string name="cycle_custom_gravity">Cycle Custom View Gravity</string>
+    <string name="toggle_visibility">Toggle Visibility</string>
+
+    <string name="display_options_custom_button">Custom View!</string>
+    <string name="display_options_menu_item">Menu Item</string>
+
+    <string name="btn_add_tab">Add new tab</string>
+    <string name="btn_remove_tab">Remove last tab</string>
+    <string name="btn_toggle_tabs">Toggle tab mode</string>
+    <string name="btn_remove_all_tabs">Remove all tabs</string>
+
+    <string name="action_bar_fragment_menu">AppCompat/Action Bar/Fragment Menu</string>
+    <string name="action_bar_fragment_menu_msg">Build menus from three fragments, the last one
+        nested, allowing you to hide them to remove them...</string>
+    <string name="action_bar_fragment_menu1">Show fragment 1</string>
+    <string name="action_bar_fragment_menu2">Show fragment 2</string>
+    <string name="action_bar_fragment_menu3">Show nested fragment (within fragment 2)</string>
+    <string name="action_bar_fragment_has_options_menu">Set has options menu to true</string>
+    <string name="action_bar_fragment_menu_visibility">Set menu visibility to true</string>
+
+    <string name="sliding_pane_layout_support">Widget/Sliding pane layout</string>
+
+    <string name="sliding_pane_layout_summary">This activity illustrates the use of sliding panes.
+        The content pane may be slid to one side on narrow devices to reveal the left pane used to
+        select content. Sliding panes can be used to fit a UI intended for wider screens in a
+        smaller space. Tapping the Action Bar\'s Up button at the left side of the bar will navigate
+        up in the hierarchy, represented by the left pane. If you rotate the device to landscape
+        mode, on most devices you will see that both panes fit together side by side with no sliding
+        necessary.
+    </string>
+
+    <string name="toolbar_usage">AppCompat/Toolbar/Toolbar as Action Bar</string>
+    <string name="toolbar_display_options">AppCompat/Toolbar/Toolbar Display Options</string>
+    <string name="toolbar_fragment_pager">AppCompat/Toolbar/Toolbar Fragment ViewPager</string>
+    <string name="toolbar_action_mode">AppCompat/Toolbar/Action Mode</string>
+
+    <string name="dialog_usage">AppCompat/Dialog/Dialog Usage</string>
+    <string name="dialog_title">My great dialog</string>
+    <string name="dialog_content">My great dialog is great</string>
+    <string name="alert_dialog_usage">AppCompat/Dialog/AlertDialog Usage</string>
+    <string name="dialogfragment_usage">AppCompat/Dialog/DialogFragment Usage</string>
+
+    <string name="sample_media_route_provider_remote">Remote Playback (Simulated)</string>
+    <string name="sample_media_route_activity_local">Local Playback</string>
+    <string name="sample_media_route_activity_presentation">Local Playback on Presentation Display</string>
+
+    <string name="recycler_view">RecyclerView/RecyclerViewActivity</string>
+    <string name="animated_recycler_view">RecyclerView/AnimatedRecyclerView</string>
+    <string name="linear_layout_manager">RecyclerView/Linear Layout Manager</string>
+    <string name="grid_layout_manager">RecyclerView/Grid Layout Manager</string>
+    <string name="staggered_grid_layout_manager">RecyclerView/Staggered Grid Layout Manager</string>
+    <string name="async_list_util">RecyclerView/AsyncListUtil</string>
+    <string name="checkbox_orientation">Horz.</string>
+    <string name="checkbox_reverse">Rev.</string>
+    <string name="checkbox_layout_dir">Layout Dir</string>
+    <string name="checkbox_stack_from_end">Stack From End</string>
+    <string name="enableAnimations">Animate</string>
+    <string name="enablePredictiveAnimations">Predictive</string>
+    <string name="enableInPlaceChange">In Place Change</string>
+    <string name="add_item">Add</string>
+    <string name="delete_item">Del</string>
+    <string name="add_delete_item">A+D</string>
+    <string name="delete_add_item">D+A</string>
+    <string name="d1a2d3">d1a2d3</string>
+
+    <string name="card_view">Card View</string>
+    <string name="card_view_radius">Radius</string>
+    <string name="card_view_width">Width</string>
+    <string name="card_view_height">Height</string>
+    <string name="card_view_bg_color">Background</string>
+    <string name="card_view_elevation">Elevation</string>
+    <string name="card_view_max_elevation">Max Elevation</string>
+    <string name="card_view_alpha">Alpha</string>
+    <string name="card_view_sample_text">Sample text on right</string>
+    <string name="card_view_resize_card_view">Resize CardView</string>
+    <string name="card_view_resize_content">Resize Content</string>
+    <string name="cardview_background_selector_label">Selector</string>
+
+    <string name="palette">Palette</string>
+    <string name="palette_all_colors">Full color palette</string>
+    <string name="search_hint">Search...</string>
+    <string name="sorted_list_activity">RecyclerView/Sorted List</string>
+    <string name="add_new_item">Add New Item</string>
+    <string name="start_action_mode">Start Action Mode</string>
+
+    <string name="swipe_to_dismiss_activity">RecyclerView/ItemTouchHelper/Swipe To Dismiss</string>
+    <string name="drag_and_drop_activity">RecyclerView/ItemTouchHelper/Drag and Drop Activity</string>
+    <string name="swipe_start">start</string>
+    <string name="swipe_end">end</string>
+    <string name="pointer_swipe_enabled">pointer swipe</string>
+    <string name="custom_swipe_enabled">custom swipe</string>
+    <string name="drag_up">up</string>
+    <string name="drag_down">down</string>
+    <string name="long_press_drag">long press drag</string>
+    <string name="drag">drag me</string>
+    <string name="swipe">swipe me</string>
+    <string name="swiping">swiping</string>
+    <string name="vertical">vertical</string>
+
+    <string name="drawer_layout_activity">Drawer layout</string>
+    <string name="drawer_layout_summary">This activity illustrates the use of sliding drawers. The drawer may be pulled out from the starting edge, which is left on left-to-right locales, with an edge swipe. You can tap the hamburger (three horizontal lines) icon at the starting side of the action bar to open the drawer as well.</string>
+    <string name="drawer_title">Navigation</string>
+    <string name="drawer_open">Open navigation drawer</string>
+    <string name="drawer_close">Close navigation drawer</string>
+
+    <string name="mode_night_yes">MODE_NIGHT_YES</string>
+    <string name="mode_night_no">MODE_NIGHT_NO</string>
+    <string name="mode_night_auto">MODE_NIGHT_AUTO</string>
+    <string name="mode_night_activity_title">AppCompat/DayNight/Activity Usage</string>
+    <string name="mode_night_dialog_title">AppCompat/DayNight/Dialog Usage</string>
+    <string name="mode_night_alertdialog_title">AppCompat/DayNight/AlertDialog Usage</string>
+
+    <string name="list_popup_window_activity">AppCompat/List popup window</string>
+    <string name="list_popup_window_summary">This activity illustrates the use of list popup windows. The popup window is shown by clicking the button above. The checkbox controls the modality. The text area below logs various events - it should log a tap on itself when a non-modal popup window is dismissed by tapping on the log area.</string>
+    <string name="list_popup_window_button">Show popup!</string>
+    <string name="list_popup_window_is_modal">is modal</string>
+
+    <string name="popup_menu_activity">AppCompat/Popup menu</string>
+    <string name="popup_menu_summary">This activity illustrates the use of popup menus. The popup menu is shown by clicking the button above. The text area below logs various events.</string>
+    <string name="popup_menu_button">Show popup!</string>
+    <string name="popup_menu_highlight">Highlight</string>
+    <string name="popup_menu_edit">Edit</string>
+    <string name="popup_menu_delete">Delete</string>
+    <string name="popup_menu_ignore">Ignore</string>
+    <string name="popup_menu_share">Share</string>
+    <string name="popup_menu_share_email">Via email</string>
+    <string name="popup_menu_share_circles">To my circles</string>
+    <string name="popup_menu_print">Print</string>
+
+    <string name="appcompat_vector_disabled">AnimatedVectorDrawableCompat does not work on devices running API v10 or below</string>
+    <string name="appcompat_vector_title">AppCompat/Integrations/AnimatedVectorDrawable</string>
+</resources>
+
diff --git a/samples/Support7Demos/res/values/styles.xml b/samples/Support7Demos/res/values/styles.xml
new file mode 100644
index 0000000..250b4bf
--- /dev/null
+++ b/samples/Support7Demos/res/values/styles.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2014 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>
+
+    <style name="Theme.Custom" parent="Theme.AppCompat.Light.DarkActionBar">
+        <item name="colorPrimary">#ff00bcd4</item>
+        <item name="colorPrimaryDark">#00838f</item>
+        <item name="colorAccent">#ffff00</item>
+    </style>
+
+    <style name="Theme.Custom.NoActionBar" parent="Theme.AppCompat.Light.NoActionBar">
+        <item name="colorPrimary">#ff00bcd4</item>
+        <item name="colorPrimaryDark">#00838f</item>
+        <item name="colorAccent">#ffff00</item>
+    </style>
+
+    <style name="Theme.SampleMediaRouter" parent="Theme.AppCompat">
+        <item name="colorPrimary">#fff44336</item>
+        <item name="colorPrimaryDark">#d32f2f</item>
+        <item name="alertDialogTheme">@style/Theme.SampleMediaRouter.Dialog.Alert</item>
+    </style>
+
+    <style name="Theme.SampleMediaRouter.Light" parent="Theme.AppCompat.Light">
+        <item name="colorPrimary">#ffff9800</item>
+        <item name="colorPrimaryDark">#f57c00</item>
+        <item name="alertDialogTheme">@style/Theme.SampleMediaRouter.Light.Dialog.Alert</item>
+    </style>
+
+    <style name="Theme.SampleMediaRouter.Light.DarkActionBar" parent="Theme.AppCompat.Light.DarkActionBar">
+        <item name="colorPrimary">#ff2196f3</item>
+        <item name="colorPrimaryDark">#1976d2</item>
+        <item name="alertDialogTheme">@style/Theme.SampleMediaRouter.Light.DarkActionBar.Dialog.Alert</item>
+    </style>
+
+    <style name="Theme.SampleMediaRouter.Dialog.Alert" parent="Theme.AppCompat.Dialog.Alert">
+        <item name="colorPrimary">#fff44336</item>
+        <item name="colorPrimaryDark">#d32f2f</item>
+    </style>
+
+    <style name="Theme.SampleMediaRouter.Light.Dialog.Alert" parent="Theme.AppCompat.Light.Dialog.Alert">
+        <item name="colorPrimary">#ffff9800</item>
+        <item name="colorPrimaryDark">#f57c00</item>
+    </style>
+
+    <style name="Theme.SampleMediaRouter.Light.DarkActionBar.Dialog.Alert" parent="Theme.AppCompat.Light.Dialog.Alert">
+        <item name="colorPrimary">#ff2196f3</item>
+        <item name="colorPrimaryDark">#1976d2</item>
+    </style>
+
+    <style name="SortedListItem" parent="@android:style/TextAppearance.Medium">
+        <item name="android:minHeight">35dp</item>
+    </style>
+
+    <style name="Theme.SampleDrawerLayout" parent="Theme.AppCompat.NoActionBar">
+        <!-- Tell SystemUI that our activity window will draw the background for the status bar. -->
+        <item name="android:windowDrawsSystemBarBackgrounds">true</item>
+        <!-- Set the status bar to be translucent black. -->
+        <item name="android:statusBarColor">#30000000</item>
+        <item name="windowActionModeOverlay">true</item>
+        <item name="android:windowContentOverlay">@null</item>
+    </style>
+</resources>
diff --git a/samples/Support7Demos/res/xml/preferences.xml b/samples/Support7Demos/res/xml/preferences.xml
new file mode 100644
index 0000000..3ec0f25
--- /dev/null
+++ b/samples/Support7Demos/res/xml/preferences.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 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.
+-->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <PreferenceCategory
+            android:title="My category">
+
+        <CheckBoxPreference
+                android:key="check_1"
+                android:summary="Check or not, that is the question"
+                android:title="Checkbox Preference 1"/>
+
+        <EditTextPreference
+                android:key="edit_1"
+                android:summary="Input some text here"
+                android:title="EditText Preference 1"/>
+
+    </PreferenceCategory>
+
+</PreferenceScreen>
\ No newline at end of file
diff --git a/samples/Support7Demos/res/xml/searchable.xml b/samples/Support7Demos/res/xml/searchable.xml
new file mode 100644
index 0000000..7f0fa74
--- /dev/null
+++ b/samples/Support7Demos/res/xml/searchable.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2014 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.
+-->
+
+<searchable xmlns:android="http://schemas.android.com/apk/res/android"
+            android:label="@string/activity_sample_code"
+            android:hint="@string/search_hint"
+            android:searchSuggestAuthority="com.example.android.supportv7.RecentSuggestionsProvider"
+            android:searchSuggestSelection=" ?" />
\ No newline at end of file
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/Cheeses.java b/samples/Support7Demos/src/com/example/android/supportv7/Cheeses.java
new file mode 100644
index 0000000..a66b1d6
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/Cheeses.java
@@ -0,0 +1,154 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv7;
+
+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/Support7Demos/src/com/example/android/supportv7/Shakespeare.java b/samples/Support7Demos/src/com/example/android/supportv7/Shakespeare.java
new file mode 100644
index 0000000..3b67bec
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/Shakespeare.java
@@ -0,0 +1,239 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv7;
+
+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/Support7Demos/src/com/example/android/supportv7/Support7Demos.java b/samples/Support7Demos/src/com/example/android/supportv7/Support7Demos.java
new file mode 100644
index 0000000..a135649
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/Support7Demos.java
@@ -0,0 +1,151 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv7;
+
+import android.app.ListActivity;
+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 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;
+
+public class Support7Demos extends ListActivity {
+
+    @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);
+    }
+
+    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.example.android.supportv7.SAMPLE_CODE");
+
+        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();
+
+        @Override
+        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, Support7Demos.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/Support7Demos/src/com/example/android/supportv7/_package.html b/samples/Support7Demos/src/com/example/android/supportv7/_package.html
new file mode 100644
index 0000000..be85e78
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/_package.html
@@ -0,0 +1,24 @@
+<html>
+<head>
+<link rel="stylesheet" type="text/css" href="assets/style.css" />
+<script type="text/javascript" src="http://www.corp.google.com/style/prettify.js"></script>
+<script src="http://www.corp.google.com/eng/techpubs/include/navbar.js" type="text/javascript"></script>
+
+
+
+</head>
+
+<body>
+
+<p>
+Examples of how to use support library APIs.  See:
+
+<ol>
+    <li> <a href="com.example.android.supportv7.app">sdk.app</a> for examples
+        of using the application package support APIs.
+</ol>
+</p>
+
+
+</body>
+</html>
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarActionMode.java b/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarActionMode.java
new file mode 100644
index 0000000..6edf593
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarActionMode.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv7.app;
+
+import com.example.android.supportv7.R;
+
+import android.graphics.drawable.Drawable;
+import android.os.Bundle;
+import android.support.v4.view.MenuItemCompat;
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.view.ActionMode;
+import android.support.v7.widget.SearchView;
+import android.text.TextUtils;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+import android.view.View;
+import android.widget.TextView;
+import android.widget.Toast;
+
+/**
+ * This demonstrates idiomatic usage of an action mode.
+ */
+public class ActionBarActionMode extends AppCompatActivity {
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.action_bar_action_mode);
+
+        findViewById(R.id.btn_start_action_mode).setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                startActionMode();
+            }
+        });
+    }
+
+    private void startActionMode() {
+        startSupportActionMode(new ActionMode.Callback() {
+            @Override
+            public boolean onCreateActionMode(ActionMode mode, Menu menu) {
+                mode.getMenuInflater().inflate(R.menu.actions, menu);
+                return true;
+            }
+
+            @Override
+            public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
+                return false;
+            }
+
+            @Override
+            public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
+                Toast.makeText(ActionBarActionMode.this,
+                        "Action Mode item clicked:" + item.getTitle(), Toast.LENGTH_SHORT).show();
+                return true;
+            }
+
+            @Override
+            public void onDestroyActionMode(ActionMode mode) {
+            }
+        });
+    }
+
+}
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarDisplayOptions.java b/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarDisplayOptions.java
new file mode 100644
index 0000000..d4eef84
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarDisplayOptions.java
@@ -0,0 +1,170 @@
+/*
+ * 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.example.android.supportv7.app;
+
+import com.example.android.supportv7.R;
+
+import android.os.Bundle;
+import android.support.v4.app.FragmentTransaction;
+import android.support.v7.app.ActionBar;
+import android.support.v7.app.ActionBar.Tab;
+import android.support.v7.app.AppCompatActivity;
+import android.view.Gravity;
+import android.view.Menu;
+import android.view.View;
+import android.view.ViewGroup.LayoutParams;
+import android.widget.ArrayAdapter;
+import android.widget.Toast;
+
+;
+
+/**
+ * This demo shows how various action bar display option flags can be combined and their effects.
+ */
+public class ActionBarDisplayOptions extends AppCompatActivity
+        implements View.OnClickListener, ActionBar.TabListener {
+    private View mCustomView;
+    private ActionBar.LayoutParams mCustomViewLayoutParams;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.action_bar_display_options);
+
+        findViewById(R.id.toggle_home_as_up).setOnClickListener(this);
+        findViewById(R.id.toggle_show_home).setOnClickListener(this);
+        findViewById(R.id.toggle_use_logo).setOnClickListener(this);
+        findViewById(R.id.toggle_show_title).setOnClickListener(this);
+        findViewById(R.id.toggle_show_custom).setOnClickListener(this);
+        findViewById(R.id.toggle_navigation).setOnClickListener(this);
+        findViewById(R.id.cycle_custom_gravity).setOnClickListener(this);
+        findViewById(R.id.toggle_visibility).setOnClickListener(this);
+
+        // Configure several action bar elements that will be toggled by display options.
+        mCustomView = getLayoutInflater().inflate(R.layout.action_bar_display_options_custom, null);
+        mCustomViewLayoutParams = new ActionBar.LayoutParams(
+                LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
+
+        final ActionBar bar = getSupportActionBar();
+        bar.setCustomView(mCustomView, mCustomViewLayoutParams);
+        bar.addTab(bar.newTab().setText("Tab 1").setTabListener(this));
+        bar.addTab(bar.newTab().setText("Tab 2").setTabListener(this));
+        bar.addTab(bar.newTab().setText("Tab 3").setTabListener(this));
+
+        final ArrayAdapter<String> listAdapter = new ArrayAdapter<String>(bar.getThemedContext(),
+                R.layout.support_simple_spinner_dropdown_item,
+                new String[] { "Item 1", "Item 2", "Item 3" });
+        bar.setListNavigationCallbacks(listAdapter, new ActionBar.OnNavigationListener() {
+            @Override
+            public boolean onNavigationItemSelected(int itemPosition, long itemId) {
+                Toast.makeText(ActionBarDisplayOptions.this,
+                        listAdapter.getItem(itemPosition),
+                        Toast.LENGTH_SHORT).show();
+                return true;
+            }
+        });
+
+        bar.setLogo(R.drawable.ic_media_play);
+    }
+
+    @Override
+    public boolean onCreateOptionsMenu(Menu menu) {
+        getMenuInflater().inflate(R.menu.display_options_actions, menu);
+        return true;
+    }
+
+    @Override
+    public boolean onSupportNavigateUp() {
+        finish();
+        return true;
+    }
+
+    @Override
+    public void onClick(View v) {
+        final ActionBar bar = getSupportActionBar();
+        int flags = 0;
+        switch (v.getId()) {
+            case R.id.toggle_home_as_up:
+                flags = ActionBar.DISPLAY_HOME_AS_UP;
+                break;
+            case R.id.toggle_show_home:
+                flags = ActionBar.DISPLAY_SHOW_HOME;
+                break;
+            case R.id.toggle_use_logo:
+                flags = ActionBar.DISPLAY_USE_LOGO;
+                break;
+            case R.id.toggle_show_title:
+                flags = ActionBar.DISPLAY_SHOW_TITLE;
+                break;
+            case R.id.toggle_show_custom:
+                flags = ActionBar.DISPLAY_SHOW_CUSTOM;
+                break;
+            case R.id.toggle_navigation:
+                switch (bar.getNavigationMode()) {
+                    case ActionBar.NAVIGATION_MODE_STANDARD:
+                        bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
+                        break;
+                    case ActionBar.NAVIGATION_MODE_TABS:
+                        bar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
+                        break;
+                    case ActionBar.NAVIGATION_MODE_LIST:
+                        bar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
+                        break;
+                }
+                return;
+            case R.id.cycle_custom_gravity: {
+                ActionBar.LayoutParams lp = mCustomViewLayoutParams;
+                int newGravity = 0;
+                switch (lp.gravity & Gravity.HORIZONTAL_GRAVITY_MASK) {
+                    case Gravity.LEFT:
+                        newGravity = Gravity.CENTER_HORIZONTAL;
+                        break;
+                    case Gravity.CENTER_HORIZONTAL:
+                        newGravity = Gravity.RIGHT;
+                        break;
+                    case Gravity.RIGHT:
+                        newGravity = Gravity.LEFT;
+                        break;
+                }
+                lp.gravity = lp.gravity & ~Gravity.HORIZONTAL_GRAVITY_MASK | newGravity;
+                bar.setCustomView(mCustomView, lp);
+                return;
+            }
+            case R.id.toggle_visibility:
+                if (bar.isShowing()) {
+                    bar.hide();
+                } else {
+                    bar.show();
+                }
+                return;
+        }
+
+        int change = bar.getDisplayOptions() ^ flags;
+        bar.setDisplayOptions(change, flags);
+    }
+
+    @Override
+    public void onTabSelected(Tab tab, FragmentTransaction ft) {
+    }
+
+    @Override
+    public void onTabUnselected(Tab tab, FragmentTransaction ft) {
+    }
+
+    @Override
+    public void onTabReselected(Tab tab, FragmentTransaction ft) {
+    }
+}
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarFragmentMenu.java b/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarFragmentMenu.java
new file mode 100644
index 0000000..e2779d0
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarFragmentMenu.java
@@ -0,0 +1,237 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv7.app;
+
+import com.example.android.supportv7.R;
+
+import android.os.Bundle;
+import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentManager;
+import android.support.v4.app.FragmentTransaction;
+import android.support.v4.view.MenuItemCompat;
+import android.support.v7.app.AppCompatActivity;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.widget.CheckBox;
+import android.widget.Toast;
+
+/**
+ * Demonstrates how fragments can participate in the options menu.
+ */
+public class ActionBarFragmentMenu extends AppCompatActivity {
+    MenuFragment mFragment1;
+    Menu2Fragment mFragment2;
+    CheckBox mCheckBox1;
+    CheckBox mCheckBox2;
+    CheckBox mCheckBox3;
+    CheckBox mHasOptionsMenu;
+    CheckBox mMenuVisibility;
+
+    // Update fragment visibility when check boxes are changed.
+    final OnClickListener mClickListener = new OnClickListener() {
+        @Override
+        public void onClick(View v) {
+            updateFragmentVisibility();
+        }
+    };
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.action_bar_fragment_menu);
+
+        // Make sure the two menu fragments are created.
+        FragmentManager fm = getSupportFragmentManager();
+        FragmentTransaction ft = fm.beginTransaction();
+        mFragment1 = (MenuFragment)fm.findFragmentByTag("f1");
+        if (mFragment1 == null) {
+            mFragment1 = new MenuFragment();
+            ft.add(mFragment1, "f1");
+        }
+        mFragment2 = (Menu2Fragment)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);
+        mCheckBox3 = (CheckBox)findViewById(R.id.menu3);
+        mCheckBox3.setOnClickListener(mClickListener);
+        mHasOptionsMenu = (CheckBox)findViewById(R.id.has_options_menu);
+        mHasOptionsMenu.setOnClickListener(mClickListener);
+        mMenuVisibility = (CheckBox)findViewById(R.id.menu_visibility);
+        mMenuVisibility.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() {
+        // Update top level fragments.
+        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();
+
+        mFragment1.setHasOptionsMenu(mHasOptionsMenu.isChecked());
+        mFragment1.setMenuVisibility(mMenuVisibility.isChecked());
+        mFragment2.setHasOptionsMenu(mHasOptionsMenu.isChecked());
+        mFragment2.setMenuVisibility(mMenuVisibility.isChecked());
+
+        // Update the nested fragment.
+        if (mFragment2.mFragment3 != null) {
+            ft = mFragment2.getFragmentManager().beginTransaction();
+            if (mCheckBox3.isChecked()) ft.show(mFragment2.mFragment3);
+            else ft.hide(mFragment2.mFragment3);
+            ft.commit();
+
+            mFragment2.mFragment3.setHasOptionsMenu(mHasOptionsMenu.isChecked());
+            mFragment2.mFragment3.setMenuVisibility(mMenuVisibility.isChecked());
+        }
+    }
+
+    /**
+     * 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 Fragment {
+        @Override
+        public void onCreate(Bundle savedInstanceState) {
+            super.onCreate(savedInstanceState);
+            setHasOptionsMenu(true);
+        }
+
+        @Override
+        public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
+            MenuItemCompat.setShowAsAction(menu.add("Menu 1a"), MenuItem.SHOW_AS_ACTION_IF_ROOM);
+            MenuItemCompat.setShowAsAction(menu.add("Menu 1b"), MenuItem.SHOW_AS_ACTION_IF_ROOM);
+            super.onCreateOptionsMenu(menu, inflater);
+        }
+
+        @Override
+        public boolean onOptionsItemSelected(MenuItem item) {
+            if (item.getTitle().equals("Menu 1a")) {
+                Toast.makeText(getActivity(), "Selected Menu 1a.", Toast.LENGTH_SHORT).show();
+                return true;
+            }
+            if (item.getTitle().equals("Menu 1b")) {
+                Toast.makeText(getActivity(), "Selected Menu 1b.", Toast.LENGTH_SHORT).show();
+                return true;
+            }
+            return super.onOptionsItemSelected(item);
+        }
+    }
+
+    /**
+     * Second fragment with a menu.
+     */
+    public static class Menu2Fragment extends Fragment {
+        Menu3Fragment mFragment3;
+
+        @Override
+        public void onCreate(Bundle savedInstanceState) {
+            super.onCreate(savedInstanceState);
+            setHasOptionsMenu(true);
+
+            FragmentManager fm = getChildFragmentManager();
+            FragmentTransaction ft = fm.beginTransaction();
+            mFragment3 = (Menu3Fragment)fm.findFragmentByTag("f3");
+            if (mFragment3 == null) {
+                mFragment3 = new Menu3Fragment();
+                ft.add(mFragment3, "f3");
+            }
+            ft.commit();
+        }
+
+        @Override
+        public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
+            MenuItemCompat.setShowAsAction(menu.add("Menu 2"), MenuItem.SHOW_AS_ACTION_IF_ROOM);
+        }
+
+        @Override
+        public boolean onOptionsItemSelected(MenuItem item) {
+            if (item.getTitle().equals("Menu 2")) {
+                Toast.makeText(getActivity(), "Selected Menu 2.", Toast.LENGTH_SHORT).show();
+                return true;
+            }
+            return false;
+        }
+    }
+
+    /**
+     * Third fragment with a menu.
+     * This one is nested within the second.
+     */
+    public static class Menu3Fragment extends Fragment {
+        @Override
+        public void onCreate(Bundle savedInstanceState) {
+            super.onCreate(savedInstanceState);
+            setHasOptionsMenu(true);
+        }
+
+        @Override
+        public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
+            Toast.makeText(getActivity(), "Created nested fragment's menu.",
+                    Toast.LENGTH_SHORT).show();
+            inflater.inflate(R.menu.display_options_actions, menu);
+            super.onCreateOptionsMenu(menu, inflater);
+        }
+
+        @Override
+        public void onDestroyOptionsMenu() {
+            Toast.makeText(getActivity(), "Destroyed nested fragment's menu.",
+                    Toast.LENGTH_SHORT).show();
+            super.onDestroyOptionsMenu();
+        }
+
+        @Override
+        public void onPrepareOptionsMenu(Menu menu) {
+            Toast.makeText(getActivity(), "Prepared nested fragment's menu.",
+                    Toast.LENGTH_SHORT).show();
+            super.onPrepareOptionsMenu(menu);
+        }
+
+        @Override
+        public boolean onOptionsItemSelected(MenuItem item) {
+            if (item.getItemId() == R.id.simple_item) {
+                Toast.makeText(getActivity(), "Selected nested fragment's menu item.",
+                        Toast.LENGTH_SHORT).show();
+                return true;
+            }
+            return super.onOptionsItemSelected(item);
+        }
+    }
+}
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarHideOnScroll.java b/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarHideOnScroll.java
new file mode 100644
index 0000000..61bd90b
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarHideOnScroll.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.example.android.supportv7.app;
+
+import com.example.android.supportv7.R;
+
+import android.os.Bundle;
+import android.support.v4.view.WindowCompat;
+import android.support.v7.app.AppCompatActivity;
+
+/**
+ * This demonstrates usage of the Action Bar's hide on content scroll
+ */
+public class ActionBarHideOnScroll extends AppCompatActivity {
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        // Hide on content scroll requires an overlay action bar, so request one
+        supportRequestWindowFeature(WindowCompat.FEATURE_ACTION_BAR_OVERLAY);
+
+        setContentView(R.layout.action_bar_hide_scroll);
+
+        // Enable hide on scroll
+        getSupportActionBar().setHideOnContentScrollEnabled(true);
+    }
+
+}
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarMechanics.java b/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarMechanics.java
new file mode 100644
index 0000000..568c287
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarMechanics.java
@@ -0,0 +1,73 @@
+/*
+ * 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.example.android.supportv7.app;
+
+import android.os.Bundle;
+import android.support.v4.view.MenuItemCompat;
+import android.support.v4.view.WindowCompat;
+import android.support.v7.app.AppCompatActivity;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.widget.Toast;
+
+/**
+ * This demonstrates the basics of the Action Bar and how it interoperates with the
+ * standard options menu. This demo is for informative purposes only; see ActionBarUsage for
+ * an example of using the Action Bar in a more idiomatic manner.
+ */
+public class ActionBarMechanics extends AppCompatActivity {
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        // The Action Bar is a window feature. The feature must be requested
+        // before setting a content view. Normally this is set automatically
+        // by your Activity's theme in your manifest. The provided system
+        // theme Theme.WithActionBar enables this for you. Use it as you would
+        // use Theme.NoTitleBar. You can add an Action Bar to your own themes
+        // by adding the element <item name="android:windowActionBar">true</item>
+        // to your style definition.
+        supportRequestWindowFeature(WindowCompat.FEATURE_ACTION_BAR);
+    }
+
+    @Override
+    public boolean onCreateOptionsMenu(Menu menu) {
+        // Menu items default to never show in the action bar. On most devices this means
+        // they will show in the standard options menu panel when the menu button is pressed.
+        // On xlarge-screen devices a "More" button will appear in the far right of the
+        // Action Bar that will display remaining items in a cascading menu.
+        menu.add("Normal item");
+
+        MenuItem actionItem = menu.add("Action Button");
+
+        // Items that show as actions should favor the "if room" setting, which will
+        // prevent too many buttons from crowding the bar. Extra items will show in the
+        // overflow area.
+        MenuItemCompat.setShowAsAction(actionItem, MenuItemCompat.SHOW_AS_ACTION_IF_ROOM);
+
+        // Items that show as actions are strongly encouraged to use an icon.
+        // These icons are shown without a text description, and therefore should
+        // be sufficiently descriptive on their own.
+        actionItem.setIcon(android.R.drawable.ic_menu_share);
+        return true;
+    }
+
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+        Toast.makeText(this, "Selected Item: " + item.getTitle(), Toast.LENGTH_SHORT).show();
+        return true;
+    }
+}
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarPreferences.java b/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarPreferences.java
new file mode 100644
index 0000000..810e615
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarPreferences.java
@@ -0,0 +1,50 @@
+/*
+ * 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.example.android.supportv7.app;
+
+import com.example.android.supportv7.R;
+
+import android.os.Bundle;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.widget.Toast;
+
+/**
+ * This demonstrates how to use our custom AppCompat {@link android.preference.PreferenceActivity}.
+ */
+public class ActionBarPreferences extends AppCompatPreferenceActivity {
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        // Load some preferences from resources
+        addPreferencesFromResource(R.xml.preferences);
+    }
+
+    @Override
+    public boolean onCreateOptionsMenu(Menu menu) {
+        getMenuInflater().inflate(R.menu.actions, menu);
+        return true;
+    }
+
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+        Toast.makeText(this, "Selected Item: " + item.getTitle(), Toast.LENGTH_SHORT).show();
+        return true;
+    }
+
+}
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarSettingsActionProviderActivity.java b/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarSettingsActionProviderActivity.java
new file mode 100644
index 0000000..5fb667a
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarSettingsActionProviderActivity.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv7.app;
+
+import com.example.android.supportv7.R;
+
+import android.content.Context;
+import android.content.Intent;
+import android.provider.Settings;
+import android.support.v4.view.ActionProvider;
+import android.support.v7.app.AppCompatActivity;
+import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.View;
+import android.widget.ImageButton;
+import android.widget.Toast;
+
+/**
+ * This activity demonstrates how to implement an {@link android.view.ActionProvider}
+ * for adding functionality to the Action Bar. In particular this demo creates an
+ * ActionProvider for launching the system settings and adds a menu item with that
+ * provider.
+ */
+public class ActionBarSettingsActionProviderActivity extends AppCompatActivity {
+    @Override
+    public boolean onCreateOptionsMenu(Menu menu) {
+        super.onCreateOptionsMenu(menu);
+        getMenuInflater().inflate(R.menu.action_bar_settings_action_provider, menu);
+        return true;
+    }
+
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+        // If this callback does not handle the item click, onPerformDefaultAction
+        // of the ActionProvider is invoked. Hence, the provider encapsulates the
+        // complete functionality of the menu item.
+        Toast.makeText(this, R.string.action_bar_settings_action_provider_no_handling,
+                Toast.LENGTH_SHORT).show();
+        return false;
+    }
+
+    public static class SettingsActionProvider extends ActionProvider {
+        /** An intent for launching the system settings. */
+        private static final Intent sSettingsIntent = new Intent(Settings.ACTION_SETTINGS);
+
+        /**
+         * Creates a new instance.
+         *
+         * @param context Context for accessing resources.
+         */
+        public SettingsActionProvider(Context context) {
+            super(context);
+        }
+
+        @Override
+        public View onCreateActionView() {
+            // Inflate the action view to be shown on the action bar.
+            LayoutInflater layoutInflater = LayoutInflater.from(getContext());
+            View view = layoutInflater.inflate(R.layout.action_bar_settings_action_provider, null);
+            ImageButton button = (ImageButton) view.findViewById(R.id.button);
+            // Attach a click listener for launching the system settings.
+            button.setOnClickListener(new View.OnClickListener() {
+                @Override
+                public void onClick(View v) {
+                    getContext().startActivity(sSettingsIntent);
+                }
+            });
+            return view;
+        }
+
+        @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.
+            getContext().startActivity(sSettingsIntent);
+            return true;
+        }
+    }
+}
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarShareActionProvider.java b/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarShareActionProvider.java
new file mode 100644
index 0000000..7ae96a3
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarShareActionProvider.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv7.app;
+
+import com.example.android.supportv7.R;
+
+import android.content.Intent;
+import android.support.v4.view.MenuItemCompat;
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.widget.ShareActionProvider;
+import android.view.Menu;
+import android.view.View;
+
+/**
+ * This activity demonstrates how to use {@link ShareActionProvider} with the Action Bar.
+ */
+public class ActionBarShareActionProvider extends AppCompatActivity {
+
+    @Override
+    public boolean onCreateOptionsMenu(Menu menu) {
+        getMenuInflater().inflate(R.menu.action_bar_share_action_provider, menu);
+        return true;
+    }
+
+    @Override
+    protected boolean onPrepareOptionsPanel(View view, Menu menu) {
+        final ShareActionProvider sap = (ShareActionProvider) MenuItemCompat.getActionProvider(
+                menu.findItem(R.id.menu_item_share_provider_action_bar));
+
+        final Intent shareIntent = new Intent(Intent.ACTION_SEND);
+        shareIntent.setType("text/plain");
+        shareIntent.putExtra(Intent.EXTRA_TEXT, "Hello!");
+
+        sap.setShareIntent(shareIntent);
+
+        return true;
+    }
+}
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarTabs.java b/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarTabs.java
new file mode 100644
index 0000000..a8c87f4
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarTabs.java
@@ -0,0 +1,132 @@
+/*
+ * 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.example.android.supportv7.app;
+
+import com.example.android.supportv7.R;
+
+import android.os.Bundle;
+import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentTransaction;
+import android.support.v7.app.ActionBar;
+import android.support.v7.app.ActionBar.Tab;
+import android.support.v7.app.AppCompatActivity;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+import android.widget.Toast;
+
+/**
+ * This demonstrates the use of action bar tabs and how they interact
+ * with other action bar features.
+ */
+public class ActionBarTabs extends AppCompatActivity {
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.action_bar_tabs);
+    }
+
+    public void onAddTab(View v) {
+        final ActionBar bar = getSupportActionBar();
+        final int tabCount = bar.getTabCount();
+        final String text = "Tab " + tabCount;
+        bar.addTab(bar.newTab()
+                .setText(text)
+                .setTabListener(new TabListener(new TabContentFragment(text))));
+    }
+
+    public void onRemoveTab(View v) {
+        final ActionBar bar = getSupportActionBar();
+        if (bar.getTabCount() > 0) {
+            bar.removeTabAt(bar.getTabCount() - 1);
+        }
+    }
+
+    public void onToggleTabs(View v) {
+        final ActionBar bar = getSupportActionBar();
+
+        if (bar.getNavigationMode() == ActionBar.NAVIGATION_MODE_TABS) {
+            bar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
+        } else {
+            bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
+        }
+    }
+
+    public void onRemoveAllTabs(View v) {
+        getSupportActionBar().removeAllTabs();
+    }
+
+    /**
+     * A TabListener receives event callbacks from the action bar as tabs
+     * are deselected, selected, and reselected. A FragmentTransaction
+     * is provided to each of these callbacks; if any operations are added
+     * to it, it will be committed at the end of the full tab switch operation.
+     * This lets tab switches be atomic without the app needing to track
+     * the interactions between different tabs.
+     *
+     * NOTE: This is a very simple implementation that does not retain
+     * fragment state of the non-visible tabs across activity instances.
+     * Look at the FragmentTabs example for how to do a more complete
+     * implementation.
+     */
+    private class TabListener implements ActionBar.TabListener {
+        private TabContentFragment mFragment;
+
+        public TabListener(TabContentFragment fragment) {
+            mFragment = fragment;
+        }
+
+        @Override
+        public void onTabSelected(Tab tab, FragmentTransaction ft) {
+            ft.add(R.id.fragment_content, mFragment, mFragment.getText());
+        }
+
+        @Override
+        public void onTabUnselected(Tab tab, FragmentTransaction ft) {
+            ft.remove(mFragment);
+        }
+
+        @Override
+        public void onTabReselected(Tab tab, FragmentTransaction ft) {
+            Toast.makeText(ActionBarTabs.this, "Reselected!", Toast.LENGTH_SHORT).show();
+        }
+
+    }
+
+    private class TabContentFragment extends Fragment {
+        private String mText;
+
+        public TabContentFragment(String text) {
+            mText = text;
+        }
+
+        public String getText() {
+            return mText;
+        }
+
+        @Override
+        public View onCreateView(LayoutInflater inflater, ViewGroup container,
+                Bundle savedInstanceState) {
+            View fragView = inflater.inflate(R.layout.action_bar_tab_content, container, false);
+
+            TextView text = (TextView) fragView.findViewById(R.id.text);
+            text.setText(mText);
+
+            return fragView;
+        }
+    }
+}
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarUsage.java b/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarUsage.java
new file mode 100644
index 0000000..8772601
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/app/ActionBarUsage.java
@@ -0,0 +1,106 @@
+/*
+ * 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.example.android.supportv7.app;
+
+import com.example.android.supportv7.R;
+
+import android.graphics.drawable.Drawable;
+import android.os.Bundle;
+import android.support.v4.view.MenuItemCompat;
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.widget.SearchView;
+import android.text.TextUtils;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+import android.widget.TextView;
+import android.widget.Toast;
+
+/**
+ * This demonstrates idiomatic usage of the Action Bar. The default Honeycomb theme
+ * includes the action bar by default and a menu resource is used to populate the
+ * menu data itself. If you'd like to see how these things work under the hood, see
+ * ActionBarMechanics.
+ */
+public class ActionBarUsage extends AppCompatActivity {
+    TextView mSearchText;
+    int mSortMode = -1;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        mSearchText = new TextView(this);
+        setContentView(mSearchText);
+    }
+
+    @Override
+    public boolean onCreateOptionsMenu(Menu menu) {
+        MenuInflater inflater = getMenuInflater();
+        inflater.inflate(R.menu.actions, menu);
+        SearchView searchView = (SearchView) MenuItemCompat
+                .getActionView(menu.findItem(R.id.action_search));
+        searchView.setOnQueryTextListener(mOnQueryTextListener);
+        return true;
+    }
+
+    @Override
+    public boolean onPrepareOptionsMenu(Menu menu) {
+        if (mSortMode != -1) {
+            Drawable icon = menu.findItem(mSortMode).getIcon();
+            menu.findItem(R.id.action_sort).setIcon(icon);
+        }
+        return super.onPrepareOptionsMenu(menu);
+    }
+
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+        switch (item.getItemId()) {
+            case R.id.action_sort_alpha:
+            case R.id.action_sort_size:
+                onSort(item);
+                break;
+        }
+
+        Toast.makeText(this, "Selected Item: " + item.getTitle(), Toast.LENGTH_SHORT).show();
+
+        return true;
+    }
+
+    private void onSort(MenuItem item) {
+        mSortMode = item.getItemId();
+        // Request a call to onPrepareOptionsMenu so we can change the sort icon
+        supportInvalidateOptionsMenu();
+    }
+
+    // The following callbacks are called for the SearchView.OnQueryChangeListener
+    // For more about using SearchView, see src/.../view/SearchView1.java and SearchView2.java
+    private final SearchView.OnQueryTextListener mOnQueryTextListener =
+            new SearchView.OnQueryTextListener() {
+        @Override
+        public boolean onQueryTextChange(String newText) {
+            newText = TextUtils.isEmpty(newText) ? "" : "Query so far: " + newText;
+            mSearchText.setText(newText);
+            return true;
+        }
+
+        @Override
+        public boolean onQueryTextSubmit(String query) {
+            Toast.makeText(ActionBarUsage.this,
+                    "Searching for: " + query + "...", Toast.LENGTH_SHORT).show();
+            return true;
+        }
+    };
+}
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/AlertDialogUsage.java b/samples/Support7Demos/src/com/example/android/supportv7/app/AlertDialogUsage.java
new file mode 100644
index 0000000..560111b
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/app/AlertDialogUsage.java
@@ -0,0 +1,101 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv7.app;
+
+import com.example.android.supportv7.Cheeses;
+import com.example.android.supportv7.R;
+
+import android.os.Bundle;
+import android.support.v7.app.AlertDialog;
+import android.support.v7.app.AppCompatActivity;
+import android.view.View;
+import android.widget.Spinner;
+
+/**
+ * This demonstrates idiomatic usage of AppCompat's AlertDialog.
+ */
+public class AlertDialogUsage extends AppCompatActivity {
+
+    private Spinner mSpinner;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.alert_dialog_usage);
+
+        mSpinner = (Spinner) findViewById(R.id.spinner_dialogs);
+
+        // Add an OnClickListener to show our selected dialog
+        findViewById(R.id.btn_show_dialog).setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                showSelectedDialog();
+            }
+        });
+    }
+
+    private void showSelectedDialog() {
+        switch (mSpinner.getSelectedItemPosition()) {
+            case 0:
+                showSimpleDialog();
+                break;
+            case 1:
+                showSimpleButtonsDialog();
+                break;
+            case 2:
+                showSingleChoiceDialog();
+                break;
+            case 3:
+                showMultiChoiceDialog();
+                break;
+        }
+    }
+
+    private void showSimpleDialog() {
+        AlertDialog.Builder b = new AlertDialog.Builder(this);
+        b.setTitle(R.string.dialog_title);
+        b.setMessage(R.string.dialog_content);
+        b.show();
+    }
+
+    private void showSimpleButtonsDialog() {
+        AlertDialog.Builder b = new AlertDialog.Builder(this);
+        b.setTitle(R.string.dialog_title);
+        b.setMessage(R.string.dialog_content);
+        b.setNegativeButton("-ve", null);
+        b.setPositiveButton("+ve", null);
+        b.show();
+    }
+
+    private void showSingleChoiceDialog() {
+        AlertDialog.Builder b = new AlertDialog.Builder(this);
+        b.setTitle(R.string.dialog_title);
+        b.setSingleChoiceItems(Cheeses.sCheeseStrings, 0, null);
+        b.setPositiveButton("OK", null);
+        b.show();
+    }
+
+    private void showMultiChoiceDialog() {
+        AlertDialog.Builder b = new AlertDialog.Builder(this);
+        b.setTitle(R.string.dialog_title);
+        b.setMultiChoiceItems(Cheeses.sCheeseStrings, null, null);
+        b.setPositiveButton("OK", null);
+        b.show();
+    }
+
+
+}
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/AppCompatAnimatedVector.java b/samples/Support7Demos/src/com/example/android/supportv7/app/AppCompatAnimatedVector.java
new file mode 100644
index 0000000..888bdc8
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/app/AppCompatAnimatedVector.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv7.app;
+
+import com.example.android.supportv7.R;
+
+import android.graphics.drawable.Animatable;
+import android.graphics.drawable.Drawable;
+import android.os.Bundle;
+import android.support.v7.app.AppCompatActivity;
+import android.widget.ImageView;
+
+
+public class AppCompatAnimatedVector extends AppCompatActivity {
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.appcompat_animated_vector);
+
+        final ImageView imageView = (ImageView) findViewById(R.id.vector_image);
+        if (imageView != null) {
+            final Drawable src = imageView.getDrawable();
+            if (src instanceof Animatable) {
+                ((Animatable) src).start();
+            }
+        }
+    }
+
+}
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/AppCompatNightModeActivity.java b/samples/Support7Demos/src/com/example/android/supportv7/app/AppCompatNightModeActivity.java
new file mode 100644
index 0000000..0aed8bd
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/app/AppCompatNightModeActivity.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv7.app;
+
+
+import com.example.android.supportv7.R;
+
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.app.AppCompatDelegate;
+import android.view.View;
+
+/**
+ * This demonstrates idiomatic usage of AppCompatActivity with Theme.AppCompat.DayNight
+ */
+public class AppCompatNightModeActivity extends AppCompatActivity {
+
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.appcompat_night_mode);
+    }
+
+    public void setModeNightNo(View view) {
+        getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_NO);
+        recreate();
+    }
+
+    public void setModeNightYes(View view) {
+        getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_YES);
+        recreate();
+    }
+
+    public void setModeNightAuto(View view) {
+        getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_AUTO);
+        recreate();
+    }
+}
\ No newline at end of file
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/AppCompatNightModeAlertDialog.java b/samples/Support7Demos/src/com/example/android/supportv7/app/AppCompatNightModeAlertDialog.java
new file mode 100644
index 0000000..276465b
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/app/AppCompatNightModeAlertDialog.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.example.android.supportv7.app;
+
+import com.example.android.supportv7.R;
+
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.support.v7.app.AlertDialog;
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.app.AppCompatDelegate;
+import android.support.v7.app.AppCompatDialog;
+import android.view.View;
+
+/**
+ * This demonstrates idiomatic usage of AlertDialog with Theme.AppCompat.DayNight
+ */
+public class AppCompatNightModeAlertDialog extends AppCompatActivity {
+
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.appcompat_night_mode);
+    }
+
+    public void setModeNightNo(View view) {
+        AlertDialog dialog = createAlertDialog();
+        dialog.getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_NO);
+        dialog.show();
+    }
+
+    public void setModeNightYes(View view) {
+        AlertDialog dialog = createAlertDialog();
+        dialog.getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_YES);
+        dialog.show();
+    }
+
+    public void setModeNightAuto(View view) {
+        AlertDialog dialog = createAlertDialog();
+        dialog.getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_AUTO);
+        dialog.show();
+    }
+
+    private AlertDialog createAlertDialog() {
+        AlertDialog.Builder b = new AlertDialog.Builder(this,
+                R.style.Theme_AppCompat_DayNight_Dialog_Alert);
+        b.setTitle(R.string.dialog_title);
+        b.setMessage(R.string.dialog_content);
+        return b.create();
+    }
+
+}
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/AppCompatNightModeDialog.java b/samples/Support7Demos/src/com/example/android/supportv7/app/AppCompatNightModeDialog.java
new file mode 100644
index 0000000..d923a92
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/app/AppCompatNightModeDialog.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.example.android.supportv7.app;
+
+import com.example.android.supportv7.R;
+
+import android.app.Dialog;
+import android.content.Context;
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.support.v4.view.WindowCompat;
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.app.AppCompatDelegate;
+import android.support.v7.app.AppCompatDialog;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.View;
+import android.widget.Spinner;
+import android.widget.Toast;
+
+/**
+ * This demonstrates idiomatic usage of Dialog with Theme.AppCompat.DayNight
+ */
+public class AppCompatNightModeDialog extends AppCompatActivity {
+
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.appcompat_night_mode);
+    }
+
+    public void setModeNightNo(View view) {
+        AppCompatDialog dialog = new AppCompatDialog(this, R.style.Theme_AppCompat_DayNight_Dialog);
+        dialog.getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_NO);
+        dialog.setTitle(R.string.dialog_title);
+        dialog.setContentView(R.layout.dialog_content);
+        dialog.show();
+    }
+
+    public void setModeNightYes(View view) {
+        AppCompatDialog dialog = new AppCompatDialog(this, R.style.Theme_AppCompat_DayNight_Dialog);
+        dialog.getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_YES);
+        dialog.setTitle(R.string.dialog_title);
+        dialog.setContentView(R.layout.dialog_content);
+        dialog.show();
+    }
+
+    public void setModeNightAuto(View view) {
+        AppCompatDialog dialog = new AppCompatDialog(this, R.style.Theme_AppCompat_DayNight_Dialog);
+        dialog.getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_AUTO);
+        dialog.setTitle(R.string.dialog_title);
+        dialog.setContentView(R.layout.dialog_content);
+        dialog.show();
+    }
+
+
+}
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/AppCompatPreferenceActivity.java b/samples/Support7Demos/src/com/example/android/supportv7/app/AppCompatPreferenceActivity.java
new file mode 100644
index 0000000..e2ae88c
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/app/AppCompatPreferenceActivity.java
@@ -0,0 +1,128 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv7.app;
+
+import android.content.res.Configuration;
+import android.os.Bundle;
+import android.preference.PreferenceActivity;
+import android.support.annotation.LayoutRes;
+import android.support.annotation.Nullable;
+import android.support.v7.app.ActionBar;
+import android.support.v7.app.AppCompatDelegate;
+import android.support.v7.widget.Toolbar;
+import android.view.MenuInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+/**
+ * A {@link android.preference.PreferenceActivity} which implements and proxies the necessary calls
+ * to be used with AppCompat.
+ *
+ * This technique can be used with an {@link android.app.Activity} class, not just
+ * {@link android.preference.PreferenceActivity}.
+ */
+public abstract class AppCompatPreferenceActivity extends PreferenceActivity {
+
+    private AppCompatDelegate mDelegate;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        getDelegate().installViewFactory();
+        getDelegate().onCreate(savedInstanceState);
+        super.onCreate(savedInstanceState);
+    }
+
+    @Override
+    protected void onPostCreate(Bundle savedInstanceState) {
+        super.onPostCreate(savedInstanceState);
+        getDelegate().onPostCreate(savedInstanceState);
+    }
+
+    public ActionBar getSupportActionBar() {
+        return getDelegate().getSupportActionBar();
+    }
+
+    public void setSupportActionBar(@Nullable Toolbar toolbar) {
+        getDelegate().setSupportActionBar(toolbar);
+    }
+
+    @Override
+    public MenuInflater getMenuInflater() {
+        return getDelegate().getMenuInflater();
+    }
+
+    @Override
+    public void setContentView(@LayoutRes int layoutResID) {
+        getDelegate().setContentView(layoutResID);
+    }
+
+    @Override
+    public void setContentView(View view) {
+        getDelegate().setContentView(view);
+    }
+
+    @Override
+    public void setContentView(View view, ViewGroup.LayoutParams params) {
+        getDelegate().setContentView(view, params);
+    }
+
+    @Override
+    public void addContentView(View view, ViewGroup.LayoutParams params) {
+        getDelegate().addContentView(view, params);
+    }
+
+    @Override
+    protected void onPostResume() {
+        super.onPostResume();
+        getDelegate().onPostResume();
+    }
+
+    @Override
+    protected void onTitleChanged(CharSequence title, int color) {
+        super.onTitleChanged(title, color);
+        getDelegate().setTitle(title);
+    }
+
+    @Override
+    public void onConfigurationChanged(Configuration newConfig) {
+        super.onConfigurationChanged(newConfig);
+        getDelegate().onConfigurationChanged(newConfig);
+    }
+
+    @Override
+    protected void onStop() {
+        super.onStop();
+        getDelegate().onStop();
+    }
+
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();
+        getDelegate().onDestroy();
+    }
+
+    public void invalidateOptionsMenu() {
+        getDelegate().invalidateOptionsMenu();
+    }
+
+    private AppCompatDelegate getDelegate() {
+        if (mDelegate == null) {
+            mDelegate = AppCompatDelegate.create(this, null);
+        }
+        return mDelegate;
+    }
+}
\ No newline at end of file
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/AppCompatWidgetsButtons.java b/samples/Support7Demos/src/com/example/android/supportv7/app/AppCompatWidgetsButtons.java
new file mode 100644
index 0000000..d8b2c4f
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/app/AppCompatWidgetsButtons.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv7.app;
+
+import com.example.android.supportv7.R;
+
+import android.os.Bundle;
+import android.support.v7.app.AppCompatActivity;
+
+/**
+ * This demonstrates the styled {@link android.widget.Button} widgets in AppCompat.
+ */
+public class AppCompatWidgetsButtons extends AppCompatActivity {
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.appcompat_widgets_buttons);
+    }
+
+}
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/AppCompatWidgetsSpinners.java b/samples/Support7Demos/src/com/example/android/supportv7/app/AppCompatWidgetsSpinners.java
new file mode 100644
index 0000000..2d22b99
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/app/AppCompatWidgetsSpinners.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv7.app;
+
+import com.example.android.supportv7.Cheeses;
+import com.example.android.supportv7.R;
+
+import android.os.Bundle;
+import android.support.v7.app.AppCompatActivity;
+import android.widget.ArrayAdapter;
+import android.widget.Spinner;
+
+/**
+ * This demonstrates the styled {@link android.widget.Spinner} widgets in AppCompat.
+ */
+public class AppCompatWidgetsSpinners extends AppCompatActivity {
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.appcompat_widgets_text_spinners);
+
+        // Fetch the Spinners and set an adapter
+        Spinner spinner = (Spinner) findViewById(R.id.widgets_spinner);
+        spinner.setAdapter(new ArrayAdapter<>(this,
+                R.layout.support_simple_spinner_dropdown_item, Cheeses.sCheeseStrings));
+
+        spinner = (Spinner) findViewById(R.id.widgets_spinner_underlined);
+        spinner.setAdapter(new ArrayAdapter<>(this,
+                R.layout.support_simple_spinner_dropdown_item, Cheeses.sCheeseStrings));
+    }
+
+}
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/AppCompatWidgetsTextInput.java b/samples/Support7Demos/src/com/example/android/supportv7/app/AppCompatWidgetsTextInput.java
new file mode 100644
index 0000000..c94bd19
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/app/AppCompatWidgetsTextInput.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv7.app;
+
+import com.example.android.supportv7.Cheeses;
+import com.example.android.supportv7.R;
+
+import android.os.Bundle;
+import android.support.v7.app.AppCompatActivity;
+import android.widget.ArrayAdapter;
+import android.widget.AutoCompleteTextView;
+import android.widget.MultiAutoCompleteTextView;
+
+/**
+ * This demonstrates the styled text input widgets in AppCompat, such as
+ * {@link android.widget.EditText}, {@link android.widget.AutoCompleteTextView} and
+ * {@link android.widget.MultiAutoCompleteTextView}.
+ */
+public class AppCompatWidgetsTextInput extends AppCompatActivity {
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.appcompat_widgets_text_input);
+
+        // Fetch the AutoCompleteTextView and set an adapter
+        AutoCompleteTextView actv = (AutoCompleteTextView) findViewById(
+                R.id.widgets_autocompletetextview);
+        actv.setAdapter(new ArrayAdapter<>(this,
+                android.R.layout.simple_dropdown_item_1line, Cheeses.sCheeseStrings));
+
+        // Fetch the MultiAutoCompleteTextView and set an adapter and Tokenizer
+        MultiAutoCompleteTextView mactv = (MultiAutoCompleteTextView) findViewById(
+                R.id.widgets_multiautocompletetextview);
+        mactv.setTokenizer(new MultiAutoCompleteTextView.CommaTokenizer());
+        mactv.setAdapter(new ArrayAdapter<>(this,
+                android.R.layout.simple_dropdown_item_1line, Cheeses.sCheeseStrings));
+    }
+
+}
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/DialogFragmentUsage.java b/samples/Support7Demos/src/com/example/android/supportv7/app/DialogFragmentUsage.java
new file mode 100644
index 0000000..f44a0df
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/app/DialogFragmentUsage.java
@@ -0,0 +1,127 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.example.android.supportv7.app;
+
+import com.example.android.supportv7.R;
+
+import android.app.Dialog;
+import android.content.Context;
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.support.v4.view.WindowCompat;
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.app.AppCompatDialog;
+import android.support.v7.app.AppCompatDialogFragment;
+import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Spinner;
+import android.widget.Toast;
+
+/**
+ * This demonstrates idiomatic usage of AppCompatDialogFragment.
+ */
+public class DialogFragmentUsage extends AppCompatActivity {
+
+    private Spinner mSpinner;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.dialog_usage);
+
+        mSpinner = (Spinner) findViewById(R.id.spinner_dialogs);
+
+        // Add an OnClickListener to show our selected dialog
+        findViewById(R.id.btn_show_dialog).setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                showSelectedDialog();
+            }
+        });
+    }
+
+    private void showSelectedDialog() {
+        switch (mSpinner.getSelectedItemPosition()) {
+            case 0:
+                showSimpleDialog();
+                break;
+            case 1:
+                showButtonBarDialog();
+                break;
+        }
+    }
+
+    private void showSimpleDialog() {
+        MenuDialogFragment fragment = MenuDialogFragment.create(R.layout.dialog_content);
+        fragment.show(getSupportFragmentManager(), null);
+    }
+
+    private void showButtonBarDialog() {
+        MenuDialogFragment fragment = MenuDialogFragment.create(R.layout.dialog_content_buttons);
+        fragment.show(getSupportFragmentManager(), null);
+    }
+
+    /**
+     * A simple {@link AppCompatDialog} implementation which
+     * inflates some items into it's options menu, and shows a toast when one is selected.
+     */
+    public static class MenuDialogFragment extends AppCompatDialogFragment {
+
+        private static final String PARAM_CONTENT_VIEW = "content_view";
+
+        static MenuDialogFragment create(int contentView) {
+            Bundle b = new Bundle();
+            b.putInt(PARAM_CONTENT_VIEW, contentView);
+
+            MenuDialogFragment fragment = new MenuDialogFragment();
+            fragment.setArguments(b);
+
+            return fragment;
+        }
+
+        @Override
+        public void onCreate(@Nullable Bundle savedInstanceState) {
+            super.onCreate(savedInstanceState);
+            setHasOptionsMenu(true);
+        }
+
+        @Nullable
+        @Override
+        public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
+                @Nullable Bundle savedInstanceState) {
+            Bundle args = getArguments();
+            int contentView = args.getInt(PARAM_CONTENT_VIEW);
+            return inflater.inflate(contentView, container, false);
+        }
+
+        @Override
+        public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
+            inflater.inflate(R.menu.actions, menu);
+        }
+
+        @Override
+        public boolean onOptionsItemSelected(MenuItem item) {
+            Toast.makeText(getActivity(), "Dialog action selected: " + item.getTitle(),
+                    Toast.LENGTH_SHORT).show();
+            return true;
+        }
+    }
+
+}
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/DialogUsage.java b/samples/Support7Demos/src/com/example/android/supportv7/app/DialogUsage.java
new file mode 100644
index 0000000..ea1a07d
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/app/DialogUsage.java
@@ -0,0 +1,104 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.example.android.supportv7.app;
+
+import com.example.android.supportv7.R;
+
+import android.app.Dialog;
+import android.content.Context;
+import android.os.Bundle;
+import android.support.v4.view.WindowCompat;
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.app.AppCompatDialog;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.View;
+import android.widget.Spinner;
+import android.widget.Toast;
+
+/**
+ * This demonstrates idiomatic usage of AppCompatDialog.
+ */
+public class DialogUsage extends AppCompatActivity {
+
+    private Spinner mSpinner;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.dialog_usage);
+
+        mSpinner = (Spinner) findViewById(R.id.spinner_dialogs);
+
+        // Add an OnClickListener to show our selected dialog
+        findViewById(R.id.btn_show_dialog).setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                showSelectedDialog();
+            }
+        });
+    }
+
+    private void showSelectedDialog() {
+        switch (mSpinner.getSelectedItemPosition()) {
+            case 0:
+                showSimpleDialog();
+                break;
+            case 1:
+                showButtonBarDialog();
+                break;
+        }
+    }
+
+    private void showSimpleDialog() {
+        Dialog dialog = new AppCompatDialog(this);
+        dialog.setTitle(R.string.dialog_title);
+        dialog.setContentView(R.layout.dialog_content);
+        dialog.show();
+    }
+
+    private void showButtonBarDialog() {
+        Dialog dialog = new AppCompatDialog(this);
+        dialog.setTitle(R.string.dialog_title);
+        dialog.setContentView(R.layout.dialog_content_buttons);
+        dialog.show();
+    }
+
+    /**
+     * A simple {@link android.support.v7.app.AppCompatDialog} implementation which
+     * inflates some items into it's options menu, and shows a toast when one is selected.
+     */
+    private class MenuDialog extends AppCompatDialog {
+
+        public MenuDialog(Context context) {
+            super(context);
+        }
+
+        @Override
+        public boolean onCreateOptionsMenu(Menu menu) {
+            getMenuInflater().inflate(R.menu.actions, menu);
+            return true;
+        }
+
+        @Override
+        public boolean onOptionsItemSelected(MenuItem item) {
+            Toast.makeText(getOwnerActivity(), "Dialog action selected: " + item.getTitle(),
+                    Toast.LENGTH_SHORT).show();
+            return true;
+        }
+    }
+
+}
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/RecentSuggestionsProvider.java b/samples/Support7Demos/src/com/example/android/supportv7/app/RecentSuggestionsProvider.java
new file mode 100644
index 0000000..8d6666d
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/app/RecentSuggestionsProvider.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv7.app;
+
+import android.content.SearchRecentSuggestionsProvider;
+
+public class RecentSuggestionsProvider extends SearchRecentSuggestionsProvider {
+    public final static String AUTHORITY = "com.example.android.supportv7.RecentSuggestionsProvider";
+    public final static int MODE = DATABASE_MODE_QUERIES;
+
+    public RecentSuggestionsProvider() {
+        setupSuggestions(AUTHORITY, MODE);
+    }
+}
\ No newline at end of file
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/SearchActivity.java b/samples/Support7Demos/src/com/example/android/supportv7/app/SearchActivity.java
new file mode 100644
index 0000000..622516f
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/app/SearchActivity.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv7.app;
+
+import android.app.Activity;
+import android.app.SearchManager;
+import android.content.Intent;
+import android.os.Bundle;
+import android.provider.SearchRecentSuggestions;
+
+/**
+ * An Activity which is only used for recieving ACTION_SEARCH intents, saving any queries
+ * to our SearchRecentSuggestions so that SearchView's can display suggestions.
+ */
+public class SearchActivity extends Activity {
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        // Get the intent, verify the action and get the query
+        Intent intent = getIntent();
+        if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
+            String query = intent.getStringExtra(SearchManager.QUERY);
+            SearchRecentSuggestions suggestions = new SearchRecentSuggestions(this,
+                    RecentSuggestionsProvider.AUTHORITY, RecentSuggestionsProvider.MODE);
+            suggestions.saveRecentQuery(query, null);
+            finish();
+        }
+    }
+}
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/ToolbarActionMode.java b/samples/Support7Demos/src/com/example/android/supportv7/app/ToolbarActionMode.java
new file mode 100644
index 0000000..3977048
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/app/ToolbarActionMode.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv7.app;
+
+import com.example.android.supportv7.R;
+
+import android.os.Bundle;
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.view.ActionMode;
+import android.support.v7.widget.Toolbar;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.View;
+import android.widget.Toast;
+
+/**
+ * This demonstrates idiomatic usage of an action mode with a Toolbar.
+ */
+public class ToolbarActionMode extends AppCompatActivity {
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.toolbar_action_mode);
+
+        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
+        setSupportActionBar(toolbar);
+
+        findViewById(R.id.btn_start_action_mode).setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                startActionMode();
+            }
+        });
+    }
+
+    private void startActionMode() {
+        startSupportActionMode(new ActionMode.Callback() {
+            @Override
+            public boolean onCreateActionMode(ActionMode mode, Menu menu) {
+                mode.getMenuInflater().inflate(R.menu.actions, menu);
+                return true;
+            }
+
+            @Override
+            public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
+                return false;
+            }
+
+            @Override
+            public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
+                Toast.makeText(ToolbarActionMode.this,
+                        "Action Mode item clicked:" + item.getTitle(), Toast.LENGTH_SHORT).show();
+                return true;
+            }
+
+            @Override
+            public void onDestroyActionMode(ActionMode mode) {
+            }
+        });
+    }
+
+}
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/ToolbarDisplayOptions.java b/samples/Support7Demos/src/com/example/android/supportv7/app/ToolbarDisplayOptions.java
new file mode 100644
index 0000000..e6d179b
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/app/ToolbarDisplayOptions.java
@@ -0,0 +1,125 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv7.app;
+
+import com.example.android.supportv7.R;
+
+import android.os.Bundle;
+import android.support.v7.app.ActionBar;
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.widget.Toolbar;
+import android.view.Gravity;
+import android.view.Menu;
+import android.view.View;
+import android.view.ViewGroup.LayoutParams;
+
+/**
+ * This demo shows how various action bar display option flags can be combined and their effects
+ * when used on a Toolbar-provided Action Bar
+ */
+public class ToolbarDisplayOptions extends AppCompatActivity
+        implements View.OnClickListener {
+
+    private View mCustomView;
+    private ActionBar.LayoutParams mCustomViewLayoutParams;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.toolbar_display_options);
+
+        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
+        setSupportActionBar(toolbar);
+
+        findViewById(R.id.toggle_home_as_up).setOnClickListener(this);
+        findViewById(R.id.toggle_show_home).setOnClickListener(this);
+        findViewById(R.id.toggle_use_logo).setOnClickListener(this);
+        findViewById(R.id.toggle_show_title).setOnClickListener(this);
+        findViewById(R.id.toggle_show_custom).setOnClickListener(this);
+        findViewById(R.id.cycle_custom_gravity).setOnClickListener(this);
+        findViewById(R.id.toggle_visibility).setOnClickListener(this);
+
+        // Configure several action bar elements that will be toggled by display options.
+        mCustomView = getLayoutInflater().inflate(R.layout.action_bar_display_options_custom, null);
+        mCustomViewLayoutParams = new ActionBar.LayoutParams(
+                LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
+    }
+
+    @Override
+    public boolean onCreateOptionsMenu(Menu menu) {
+        getMenuInflater().inflate(R.menu.display_options_actions, menu);
+        return true;
+    }
+
+    @Override
+    public boolean onSupportNavigateUp() {
+        finish();
+        return true;
+    }
+
+    @Override
+    public void onClick(View v) {
+        final ActionBar bar = getSupportActionBar();
+        int flags = 0;
+        switch (v.getId()) {
+            case R.id.toggle_home_as_up:
+                flags = ActionBar.DISPLAY_HOME_AS_UP;
+                break;
+            case R.id.toggle_show_home:
+                flags = ActionBar.DISPLAY_SHOW_HOME;
+                break;
+            case R.id.toggle_use_logo:
+                flags = ActionBar.DISPLAY_USE_LOGO;
+                getSupportActionBar().setLogo(R.drawable.ic_media_play);
+                break;
+            case R.id.toggle_show_title:
+                flags = ActionBar.DISPLAY_SHOW_TITLE;
+                break;
+            case R.id.toggle_show_custom:
+                flags = ActionBar.DISPLAY_SHOW_CUSTOM;
+                break;
+            case R.id.cycle_custom_gravity: {
+                ActionBar.LayoutParams lp = mCustomViewLayoutParams;
+                int newGravity = 0;
+                switch (lp.gravity & Gravity.HORIZONTAL_GRAVITY_MASK) {
+                    case Gravity.LEFT:
+                        newGravity = Gravity.CENTER_HORIZONTAL;
+                        break;
+                    case Gravity.CENTER_HORIZONTAL:
+                        newGravity = Gravity.RIGHT;
+                        break;
+                    case Gravity.RIGHT:
+                        newGravity = Gravity.LEFT;
+                        break;
+                }
+                lp.gravity = lp.gravity & ~Gravity.HORIZONTAL_GRAVITY_MASK | newGravity;
+                bar.setCustomView(mCustomView, lp);
+                return;
+            }
+            case R.id.toggle_visibility:
+                if (bar.isShowing()) {
+                    bar.hide();
+                } else {
+                    bar.show();
+                }
+                return;
+        }
+
+        int change = bar.getDisplayOptions() ^ flags;
+        bar.setDisplayOptions(change, flags);
+    }
+}
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/ToolbarFragmentPagerMenu.java b/samples/Support7Demos/src/com/example/android/supportv7/app/ToolbarFragmentPagerMenu.java
new file mode 100644
index 0000000..575c7a1
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/app/ToolbarFragmentPagerMenu.java
@@ -0,0 +1,168 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv7.app;
+
+import com.example.android.supportv7.R;
+
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentManager;
+import android.support.v4.app.FragmentPagerAdapter;
+import android.support.v4.view.MenuItemCompat;
+import android.support.v4.view.ViewPager;
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.widget.Toolbar;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Demonstrates how fragments can participate in the options menu from within a {@link ViewPager}.
+ */
+public class ToolbarFragmentPagerMenu extends AppCompatActivity {
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.toolbar_fragment_pager);
+
+        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
+        setSupportActionBar(toolbar);
+
+        ViewPager vp = (ViewPager) findViewById(R.id.viewpager);
+        PagerAdapter adapter = new PagerAdapter(getSupportFragmentManager(),
+                new MenuFragment(), new Menu2Fragment());
+        vp.setAdapter(adapter);
+    }
+
+    private static class PagerAdapter extends FragmentPagerAdapter {
+        private final List<Fragment> mFragments;
+
+        public PagerAdapter(FragmentManager fm, Fragment... fragments) {
+            super(fm);
+
+            mFragments = new ArrayList<Fragment>();
+            for (Fragment fragment : fragments) {
+                mFragments.add(fragment);
+            }
+        }
+
+        @Override
+        public Fragment getItem(int position) {
+            return mFragments.get(position);
+        }
+
+        @Override
+        public int getCount() {
+            return mFragments.size();
+        }
+    }
+
+    /**
+     * 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 Fragment {
+        @Override
+        public void onCreate(Bundle savedInstanceState) {
+            super.onCreate(savedInstanceState);
+            setHasOptionsMenu(true);
+        }
+
+        @Override
+        public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
+            MenuItemCompat.setShowAsAction(menu.add("Menu 1a"), MenuItemCompat.SHOW_AS_ACTION_IF_ROOM);
+            MenuItemCompat.setShowAsAction(menu.add("Menu 1b"), MenuItemCompat.SHOW_AS_ACTION_NEVER);
+            super.onCreateOptionsMenu(menu, inflater);
+        }
+
+        @Override
+        public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
+                @Nullable Bundle savedInstanceState) {
+            TextView textView = new TextView(container.getContext());
+
+            textView.setText(getClass().getSimpleName());
+            textView.setGravity(Gravity.CENTER);
+            textView.setLayoutParams(new ViewGroup.LayoutParams(
+                    ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
+
+            return textView;
+        }
+
+        @Override
+        public boolean onOptionsItemSelected(MenuItem item) {
+            if (item.getTitle().equals("Menu 1a")) {
+                Toast.makeText(getActivity(), "Selected Menu 1a.", Toast.LENGTH_SHORT).show();
+                return true;
+            }
+            if (item.getTitle().equals("Menu 1b")) {
+                Toast.makeText(getActivity(), "Selected Menu 1b.", Toast.LENGTH_SHORT).show();
+                return true;
+            }
+            return super.onOptionsItemSelected(item);
+        }
+    }
+
+    /**
+     * Second fragment with a menu.
+     */
+    public static class Menu2Fragment extends Fragment {
+        @Override
+        public void onCreate(Bundle savedInstanceState) {
+            super.onCreate(savedInstanceState);
+            setHasOptionsMenu(true);
+        }
+
+        @Override
+        public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
+            MenuItemCompat.setShowAsAction(menu.add("Menu 2"), MenuItemCompat.SHOW_AS_ACTION_IF_ROOM);
+        }
+
+        @Override
+        public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
+                @Nullable Bundle savedInstanceState) {
+            TextView textView = new TextView(container.getContext());
+
+            textView.setText(getClass().getSimpleName());
+            textView.setGravity(Gravity.CENTER);
+            textView.setLayoutParams(new ViewGroup.LayoutParams(
+                    ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
+
+            return textView;
+        }
+
+        @Override
+        public boolean onOptionsItemSelected(MenuItem item) {
+            if (item.getTitle().equals("Menu 2")) {
+                Toast.makeText(getActivity(), "Selected Menu 2.", Toast.LENGTH_SHORT).show();
+                return true;
+            }
+            return false;
+        }
+    }
+}
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/ToolbarUsage.java b/samples/Support7Demos/src/com/example/android/supportv7/app/ToolbarUsage.java
new file mode 100644
index 0000000..55e7f14
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/app/ToolbarUsage.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.example.android.supportv7.app;
+
+import com.example.android.supportv7.R;
+
+import android.app.SearchManager;
+import android.os.Bundle;
+import android.support.v4.view.MenuItemCompat;
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.widget.SearchView;
+import android.support.v7.widget.Toolbar;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+import android.widget.Toast;
+
+/**
+ * This demonstrates idiomatic usage of the Toolbar as the action bar.
+ */
+public class ToolbarUsage extends AppCompatActivity {
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.toolbar_usage);
+
+        // Retrieve the Toolbar from our content view, and set it as the action bar
+        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
+        setSupportActionBar(toolbar);
+    }
+
+    @Override
+    public boolean onCreateOptionsMenu(Menu menu) {
+        MenuInflater inflater = getMenuInflater();
+        inflater.inflate(R.menu.actions, menu);
+
+        // Retrieve the SearchView and plug it into SearchManager
+        final SearchView searchView = (SearchView) MenuItemCompat
+                .getActionView(menu.findItem(R.id.action_search));
+
+        SearchManager searchManager = (SearchManager) getSystemService(SEARCH_SERVICE);
+        searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
+
+        return true;
+    }
+
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+        Toast.makeText(this, "Selected Item: " + item.getTitle(), Toast.LENGTH_SHORT).show();
+        return true;
+    }
+
+}
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/app/_index.html b/samples/Support7Demos/src/com/example/android/supportv7/app/_index.html
new file mode 100644
index 0000000..c316d1b
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/app/_index.html
@@ -0,0 +1,33 @@
+
+<p>This section includes samples showing the use of the application
+package features of the static support library.</p>
+<ul>
+  <li><a href="#ActionBar">Action Bar</a></li>
+</ul>
+
+
+<h3 id="ActionBar">Action Bar</h3>
+<dl>
+  <dt><a href="ActionBarMechanics.html">Action Bar Mechanics</a></dt>
+  <dd>Demonstrates the basics of the Action Bar and how it interoperates with the standard options
+menu. This demo is for informative purposes only; see Usage for an example of using the
+Action Bar in a more idiomatic manner.</dd>
+
+  <dt><a href="ActionBarTabs.html">Action Bar Tabs</a></dt>
+  <dd>Demonstrates the use of Action Bar tabs and how they interact with other action bar
+features.  Also see the <a href="FragmentTabs.html">Fragment Tabs</a> for a more
+complete example of how to switch between fragments.</dd>
+
+  <dt><a href="ActionBarUsage.html">Action Bar Usage</a></dt>
+  <dd>Demonstrates simple usage of the Action Bar, including a SearchView as an action item. The
+default Honeycomb theme includes the Action Bar by default and a menu resource is used to populate
+the menu data itself. If you'd like to see how these things work under the hood, see
+Mechanics.</dd>
+
+  <dt><a href="ActionBarActionProviderSettingsActivity.html">Settings Action Provider</a></dt>
+  <dd>Shows how to implement an ActionProvider for launching the system settings that supplies a
+  menu item with a specialized action view and handles standard menu item clicks in one place.</dd>
+
+  <dt><a href="ActionBarDisplayOptions.html">Display Options</a></dt>
+  <dd>Shows how various Action Bar display option flags can be combined and their effects.</dd>
+</dl>
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/graphics/ImageLoader.java b/samples/Support7Demos/src/com/example/android/supportv7/graphics/ImageLoader.java
new file mode 100644
index 0000000..30a0aa2
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/graphics/ImageLoader.java
@@ -0,0 +1,101 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv7.graphics;
+
+import android.graphics.Bitmap;
+import android.os.AsyncTask;
+import android.provider.MediaStore;
+import android.support.v4.graphics.BitmapCompat;
+import android.support.v4.os.AsyncTaskCompat;
+import android.support.v4.util.LruCache;
+import android.widget.ImageView;
+
+/**
+ * A very naive lazily implemented image loader. Do not use this in production code.
+ */
+class ImageLoader {
+
+    /**
+     * A LruCache used to store images which has a maximum size of 10% of the maximum heap size.
+     */
+    private static final BitmapCache CACHE = new BitmapCache(
+            Math.round(Runtime.getRuntime().maxMemory() / 10));
+
+    private ImageLoader() {
+    }
+
+    interface Listener {
+        void onImageLoaded(Bitmap bitmap);
+    }
+
+    static void loadMediaStoreThumbnail(final ImageView imageView,
+            final long id,
+            final Listener listener) {
+
+        final Bitmap cachedValue = CACHE.get(id);
+        if (cachedValue != null) {
+            // If the image is already in the cache, display the image,
+            // call the listener now and return
+            imageView.setImageBitmap(cachedValue);
+            if (listener != null) {
+                listener.onImageLoaded(cachedValue);
+            }
+            return;
+        }
+
+        AsyncTaskCompat.executeParallel(new AsyncTask<Void, Void, Bitmap>() {
+            @Override
+            protected Bitmap doInBackground(Void... params) {
+                return MediaStore.Images.Thumbnails.getThumbnail(
+                        imageView.getContext().getContentResolver(),
+                        id,
+                        MediaStore.Images.Thumbnails.MINI_KIND,
+                        null);
+            }
+
+            @Override
+            protected void onPostExecute(Bitmap bitmap) {
+                imageView.setImageBitmap(bitmap);
+
+                if (bitmap != null) {
+                    // Add the image to the memory cache first
+                    CACHE.put(id, bitmap);
+
+                    if (listener != null) {
+                        listener.onImageLoaded(bitmap);
+                    }
+                }
+            }
+        });
+    }
+
+    /**
+     * A simple cache implementation for {@link android.graphics.Bitmap} instances which uses
+     * {@link android.support.v4.util.LruCache}.
+     */
+    private static class BitmapCache extends LruCache<Long, Bitmap> {
+        BitmapCache(int maxSize) {
+            super(maxSize);
+        }
+
+        @Override
+        protected int sizeOf(Long key, Bitmap value) {
+            return BitmapCompat.getAllocationByteCount(value);
+        }
+    }
+
+}
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/graphics/PaletteActivity.java b/samples/Support7Demos/src/com/example/android/supportv7/graphics/PaletteActivity.java
new file mode 100644
index 0000000..e82aa3a
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/graphics/PaletteActivity.java
@@ -0,0 +1,243 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv7.graphics;
+
+import com.example.android.supportv7.R;
+
+import android.content.Context;
+import android.content.Intent;
+import android.database.Cursor;
+import android.graphics.Bitmap;
+import android.net.Uri;
+import android.os.Bundle;
+import android.provider.MediaStore;
+import android.support.v4.app.ListFragment;
+import android.support.v4.app.LoaderManager;
+import android.support.v4.content.CursorLoader;
+import android.support.v4.content.Loader;
+import android.support.v4.widget.ResourceCursorAdapter;
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.graphics.Palette;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.ListView;
+
+/**
+ * Activity which displays the images from the device's {@link MediaStore}, alongside the generated
+ * {@link android.support.v7.graphics.Palette} results.
+ *
+ * Allows the customization of the number of colors used in the palette generation, to demonstrate
+ * the difference in results for different types of images.
+ */
+public class PaletteActivity extends AppCompatActivity {
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        getSupportFragmentManager()
+                .beginTransaction()
+                .replace(android.R.id.content, new PaletteMediaStoreListFragment())
+                .commit();
+    }
+
+    /**
+     * The {@link android.support.v4.app.ListFragment} which does all of the hard work.
+     */
+    public static class PaletteMediaStoreListFragment extends ListFragment
+            implements LoaderManager.LoaderCallbacks<Cursor> {
+
+        /**
+         * Projection used for querying the {@link android.provider.MediaStore}.
+         */
+        static final String[] PROJECTION = {
+                MediaStore.Images.ImageColumns._ID,
+                MediaStore.Images.ImageColumns.DATE_ADDED
+        };
+
+        private PhotosCursorAdapter mAdapter;
+
+        @Override
+        public void onCreate(Bundle savedInstanceState) {
+            super.onCreate(savedInstanceState);
+            setHasOptionsMenu(true);
+        }
+
+        @Override
+        public void onViewCreated(View view, Bundle savedInstanceState) {
+            super.onViewCreated(view, savedInstanceState);
+
+            // Enable fast scroll to make it easier to navigate large number of images
+            getListView().setFastScrollEnabled(true);
+        }
+
+        @Override
+        public void onActivityCreated(Bundle savedInstanceState) {
+            super.onActivityCreated(savedInstanceState);
+
+            // Create an Adapter and use a new Adapter
+            mAdapter = new PhotosCursorAdapter(getActivity(), null);
+            mAdapter.setNumColors(16);
+            setListAdapter(mAdapter);
+
+            // Start the loader manager to create our CursorLoader
+            getLoaderManager().initLoader(0, null, this);
+        }
+
+        @Override
+        public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
+            inflater.inflate(R.menu.sample_palette_actions, menu);
+        }
+
+        @Override
+        public boolean onOptionsItemSelected(MenuItem item) {
+            switch (item.getItemId()) {
+                case R.id.menu_num_colors_8:
+                    mAdapter.setNumColors(8);
+                    item.setChecked(true);
+                    return true;
+                case R.id.menu_num_colors_12:
+                    mAdapter.setNumColors(12);
+                    item.setChecked(true);
+                    return true;
+                case R.id.menu_num_colors_16:
+                    mAdapter.setNumColors(16);
+                    item.setChecked(true);
+                    return true;
+                case R.id.menu_num_colors_24:
+                    mAdapter.setNumColors(24);
+                    item.setChecked(true);
+                    return true;
+                case R.id.menu_num_colors_32:
+                    mAdapter.setNumColors(32);
+                    item.setChecked(true);
+                    return true;
+            }
+
+            return super.onOptionsItemSelected(item);
+        }
+
+        @Override
+        public void onListItemClick(ListView l, View v, int position, long id) {
+            final Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI.buildUpon()
+                    .appendEncodedPath(String.valueOf(id)).build();
+
+            // Start the Detail Activity
+            Intent intent = new Intent(getActivity(), PaletteDetailActivity.class);
+            intent.setData(uri);
+            startActivity(intent);
+        }
+
+        @Override
+        public Loader<Cursor> onCreateLoader(int id, Bundle bundle) {
+            return new CursorLoader(
+                    getActivity(),
+                    MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
+                    PROJECTION,
+                    null,
+                    null,
+                    MediaStore.Images.ImageColumns.DATE_ADDED + " DESC");
+        }
+
+        @Override
+        public void onLoadFinished(Loader<Cursor> cursorLoader, Cursor cursor) {
+            mAdapter.swapCursor(cursor);
+        }
+
+        @Override
+        public void onLoaderReset(Loader<Cursor> cursorLoader) {
+            mAdapter.swapCursor(null);
+        }
+
+        private static class PhotosCursorAdapter extends ResourceCursorAdapter {
+
+            private int mNumColors;
+
+            public PhotosCursorAdapter(Context context, Cursor c) {
+                super(context, R.layout.palette_list_item, c, false);
+                mContext = context;
+            }
+
+            /**
+             * Set the number of colors used for {@link Palette} generation.
+             */
+            void setNumColors(int numColors) {
+                mNumColors = numColors;
+                notifyDataSetChanged();
+            }
+
+            @Override
+            public void bindView(final View view, Context context, Cursor cursor) {
+                // Let's reset the view, clearing the ImageView and resetting the background colors
+                // of the Palette UI
+                ImageView imageView = (ImageView) view.findViewById(R.id.image);
+                imageView.setImageDrawable(null);
+
+                view.findViewById(R.id.text_vibrant).setBackgroundDrawable(null);
+                view.findViewById(R.id.text_muted).setBackgroundDrawable(null);
+                view.findViewById(R.id.text_light_vibrant).setBackgroundDrawable(null);
+                view.findViewById(R.id.text_light_muted).setBackgroundDrawable(null);
+                view.findViewById(R.id.text_dark_vibrant).setBackgroundDrawable(null);
+                view.findViewById(R.id.text_dark_muted).setBackgroundDrawable(null);
+
+                final long id = cursor.getLong(
+                        cursor.getColumnIndexOrThrow(MediaStore.Images.ImageColumns._ID));
+
+                ImageLoader.loadMediaStoreThumbnail(imageView, id, new ImageLoader.Listener() {
+                    @Override
+                    public void onImageLoaded(Bitmap bitmap) {
+                        Palette.generateAsync(bitmap, mNumColors,
+                                new Palette.PaletteAsyncListener() {
+                                    @Override
+                                    public void onGenerated(Palette palette) {
+                                        setBackgroundColor(
+                                                view.findViewById(R.id.text_vibrant),
+                                                palette.getVibrantSwatch());
+                                        setBackgroundColor(
+                                                view.findViewById(R.id.text_muted),
+                                                palette.getMutedSwatch());
+                                        setBackgroundColor(
+                                                view.findViewById(R.id.text_light_vibrant),
+                                                palette.getLightVibrantSwatch());
+                                        setBackgroundColor(
+                                                view.findViewById(R.id.text_light_muted),
+                                                palette.getLightMutedSwatch());
+                                        setBackgroundColor(
+                                                view.findViewById(R.id.text_dark_vibrant),
+                                                palette.getDarkVibrantSwatch());
+                                        setBackgroundColor(
+                                                view.findViewById(R.id.text_dark_muted),
+                                                palette.getDarkMutedSwatch());
+                                    }
+                                });
+                    }
+                });
+            }
+        }
+
+        static void setBackgroundColor(View view, Palette.Swatch swatch) {
+            if (view != null && swatch != null) {
+                view.setBackgroundColor(swatch.getRgb());
+            }
+        }
+
+    }
+
+}
\ No newline at end of file
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/graphics/PaletteDetailActivity.java b/samples/Support7Demos/src/com/example/android/supportv7/graphics/PaletteDetailActivity.java
new file mode 100644
index 0000000..d7fd47c
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/graphics/PaletteDetailActivity.java
@@ -0,0 +1,190 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv7.graphics;
+
+import com.example.android.supportv7.R;
+
+import android.graphics.Bitmap;
+import android.net.Uri;
+import android.os.Bundle;
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.graphics.Palette;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.AdapterView;
+import android.widget.BaseAdapter;
+import android.widget.GridView;
+import android.widget.ImageView;
+import android.widget.Toast;
+
+import java.util.List;
+
+/**
+ * Activity which displays the more details about a generated {@link Palette} for a specific
+ * {@link android.provider.MediaStore} image.
+ *
+ * Displays the full generated palette of colors in a grid, which allows clicking on an palette item
+ * to display more information in a {@link Toast}.
+ *
+ * Also allows the customization of the number of colors used in the palette generation for
+ * demonstration purposes.
+ */
+public class PaletteDetailActivity extends AppCompatActivity {
+
+    private ImageView mImageView;
+    private GridView mGridView;
+    private SwatchesPalette mSwatchesPalette;
+
+    private Uri mImageUri;
+
+    private Toast mCurrentToast;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.palette_activity_detail);
+
+        mImageUri = getIntent().getData();
+
+        mImageView = (ImageView) findViewById(R.id.image);
+        mGridView = (GridView) findViewById(R.id.palette);
+        mSwatchesPalette = new SwatchesPalette();
+        mGridView.setAdapter(mSwatchesPalette);
+
+        // Set an OnItemClickListener to display a information Toast when a Palette item is clicked
+        mGridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
+            @Override
+            public void onItemClick(AdapterView<?> adapterView, View view, int pos, long l) {
+                // Cancel the current Toast if there is already one being displayed
+                if (mCurrentToast != null) {
+                    mCurrentToast.cancel();
+                }
+
+                final Palette.Swatch item = (Palette.Swatch) adapterView.getItemAtPosition(pos);
+                mCurrentToast = Toast.makeText(PaletteDetailActivity.this,
+                        item.toString(), Toast.LENGTH_LONG);
+                mCurrentToast.show();
+            }
+        });
+
+        // Load the image with a default number of colors
+        loadImage(16);
+    }
+
+    @Override
+    public boolean onCreateOptionsMenu(Menu menu) {
+        getMenuInflater().inflate(R.menu.sample_palette_actions, menu);
+        return true;
+    }
+
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+        switch (item.getItemId()) {
+            case R.id.menu_num_colors_8:
+                loadImage(8);
+                item.setChecked(true);
+                return true;
+            case R.id.menu_num_colors_12:
+                loadImage(12);
+                item.setChecked(true);
+                return true;
+            case R.id.menu_num_colors_16:
+                loadImage(16);
+                item.setChecked(true);
+                return true;
+            case R.id.menu_num_colors_24:
+                loadImage(24);
+                item.setChecked(true);
+                return true;
+            case R.id.menu_num_colors_32:
+                loadImage(32);
+                item.setChecked(true);
+                return true;
+        }
+        return super.onOptionsItemSelected(item);
+    }
+
+    private void loadImage(final int numColors) {
+        final int id = Integer.parseInt(mImageUri.getLastPathSegment());
+
+        ImageLoader.loadMediaStoreThumbnail(mImageView, id, new ImageLoader.Listener() {
+            @Override
+            public void onImageLoaded(Bitmap bitmap) {
+                Palette.generateAsync(bitmap, numColors, new Palette.PaletteAsyncListener() {
+                    @Override
+                    public void onGenerated(Palette palette) {
+                        populatePalette(palette);
+                    }
+                });
+            }
+        });
+    }
+
+    private class SwatchesPalette extends BaseAdapter {
+
+        private List<Palette.Swatch> mSwatches;
+
+        @Override
+        public int getCount() {
+            return mSwatches != null ? mSwatches.size() : 0;
+        }
+
+        @Override
+        public Palette.Swatch getItem(int position) {
+            return mSwatches.get(position);
+        }
+
+        @Override
+        public long getItemId(int position) {
+            return position;
+        }
+
+        void setSwatches(List<Palette.Swatch> palette) {
+            mSwatches = palette;
+            notifyDataSetChanged();
+        }
+
+        @Override
+        public View getView(int position, View view, ViewGroup parent) {
+            if (view == null) {
+                view = getLayoutInflater().inflate(R.layout.palette_grid_item, parent, false);
+            }
+            setBackgroundColor(view, getItem(position));
+            return view;
+        }
+    }
+
+    private void populatePalette(Palette palette) {
+        mSwatchesPalette.setSwatches(palette.getSwatches());
+
+        setBackgroundColor(findViewById(R.id.text_vibrant), palette.getVibrantSwatch());
+        setBackgroundColor(findViewById(R.id.text_muted), palette.getMutedSwatch());
+        setBackgroundColor(findViewById(R.id.text_light_vibrant), palette.getLightVibrantSwatch());
+        setBackgroundColor(findViewById(R.id.text_light_muted), palette.getLightMutedSwatch());
+        setBackgroundColor(findViewById(R.id.text_dark_vibrant), palette.getDarkVibrantSwatch());
+        setBackgroundColor(findViewById(R.id.text_dark_muted), palette.getDarkMutedSwatch());
+    }
+
+    private void setBackgroundColor(View view, Palette.Swatch swatch) {
+        if (view != null && swatch != null) {
+            view.setBackgroundColor(swatch.getRgb());
+        }
+    }
+
+}
\ No newline at end of file
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/media/LocalPlayer.java b/samples/Support7Demos/src/com/example/android/supportv7/media/LocalPlayer.java
new file mode 100644
index 0000000..b62f76e
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/media/LocalPlayer.java
@@ -0,0 +1,649 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv7.media;
+
+import android.app.Activity;
+import android.app.Presentation;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.graphics.Bitmap;
+import android.media.MediaPlayer;
+import android.os.Build;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.SystemClock;
+import android.support.v7.media.MediaRouter.RouteInfo;
+import android.support.v7.media.MediaItemStatus;
+import android.util.Log;
+import android.view.Display;
+import android.view.Gravity;
+import android.view.Surface;
+import android.view.SurfaceHolder;
+import android.view.SurfaceView;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.WindowManager;
+import android.widget.FrameLayout;
+
+import com.example.android.supportv7.R;
+
+import java.io.IOException;
+
+/**
+ * Handles playback of a single media item using MediaPlayer.
+ */
+public abstract class LocalPlayer extends Player implements
+        MediaPlayer.OnPreparedListener,
+        MediaPlayer.OnCompletionListener,
+        MediaPlayer.OnErrorListener,
+        MediaPlayer.OnSeekCompleteListener {
+    private static final String TAG = "LocalPlayer";
+    private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
+
+    private final Context mContext;
+    private final Handler mHandler = new Handler();
+    private final Handler mUpdateSurfaceHandler = new Handler(mHandler.getLooper());
+    private MediaPlayer mMediaPlayer;
+    private int mState = STATE_IDLE;
+    private int mSeekToPos;
+    private int mVideoWidth;
+    private int mVideoHeight;
+    private Surface mSurface;
+    private SurfaceHolder mSurfaceHolder;
+
+    public LocalPlayer(Context context) {
+        mContext = context;
+
+        // reset media player
+        reset();
+    }
+
+    @Override
+    public boolean isRemotePlayback() {
+        return false;
+    }
+
+    @Override
+    public boolean isQueuingSupported() {
+        return false;
+    }
+
+    @Override
+    public void connect(RouteInfo route) {
+        if (DEBUG) {
+            Log.d(TAG, "connecting to: " + route);
+        }
+    }
+
+    @Override
+    public void release() {
+        if (DEBUG) {
+            Log.d(TAG, "releasing");
+        }
+        // release media player
+        if (mMediaPlayer != null) {
+            mMediaPlayer.stop();
+            mMediaPlayer.release();
+            mMediaPlayer = null;
+        }
+    }
+
+    // Player
+    @Override
+    public void play(final PlaylistItem item) {
+        if (DEBUG) {
+            Log.d(TAG, "play: item=" + item);
+        }
+        reset();
+        mSeekToPos = (int)item.getPosition();
+        try {
+            mMediaPlayer.setDataSource(mContext, item.getUri());
+            mMediaPlayer.prepareAsync();
+        } catch (IllegalStateException e) {
+            Log.e(TAG, "MediaPlayer throws IllegalStateException, uri=" + item.getUri());
+        } catch (IOException e) {
+            Log.e(TAG, "MediaPlayer throws IOException, uri=" + item.getUri());
+        } catch (IllegalArgumentException e) {
+            Log.e(TAG, "MediaPlayer throws IllegalArgumentException, uri=" + item.getUri());
+        } catch (SecurityException e) {
+            Log.e(TAG, "MediaPlayer throws SecurityException, uri=" + item.getUri());
+        }
+        if (item.getState() == MediaItemStatus.PLAYBACK_STATE_PLAYING) {
+            resume();
+        } else {
+            pause();
+        }
+    }
+
+    @Override
+    public void seek(final PlaylistItem item) {
+        if (DEBUG) {
+            Log.d(TAG, "seek: item=" + item);
+        }
+        int pos = (int)item.getPosition();
+        if (mState == STATE_PLAYING || mState == STATE_PAUSED) {
+            mMediaPlayer.seekTo(pos);
+            mSeekToPos = pos;
+        } else if (mState == STATE_IDLE || mState == STATE_PREPARING_FOR_PLAY
+                || mState == STATE_PREPARING_FOR_PAUSE) {
+            // Seek before onPrepared() arrives,
+            // need to performed delayed seek in onPrepared()
+            mSeekToPos = pos;
+        }
+    }
+
+    @Override
+    public void getStatus(final PlaylistItem item, final boolean update) {
+        if (mState == STATE_PLAYING || mState == STATE_PAUSED) {
+            // use mSeekToPos if we're currently seeking (mSeekToPos is reset
+            // when seeking is completed)
+            item.setDuration(mMediaPlayer.getDuration());
+            item.setPosition(mSeekToPos > 0 ?
+                    mSeekToPos : mMediaPlayer.getCurrentPosition());
+            item.setTimestamp(SystemClock.elapsedRealtime());
+        }
+        if (update && mCallback != null) {
+            mCallback.onPlaylistReady();
+        }
+    }
+
+    @Override
+    public void pause() {
+        if (DEBUG) {
+            Log.d(TAG, "pause");
+        }
+        if (mState == STATE_PLAYING) {
+            mMediaPlayer.pause();
+            mState = STATE_PAUSED;
+        } else if (mState == STATE_PREPARING_FOR_PLAY) {
+            mState = STATE_PREPARING_FOR_PAUSE;
+        }
+    }
+
+    @Override
+    public void resume() {
+        if (DEBUG) {
+            Log.d(TAG, "resume");
+        }
+        if (mState == STATE_READY || mState == STATE_PAUSED) {
+            mMediaPlayer.start();
+            mState = STATE_PLAYING;
+        } else if (mState == STATE_IDLE || mState == STATE_PREPARING_FOR_PAUSE) {
+            mState = STATE_PREPARING_FOR_PLAY;
+        }
+    }
+
+    @Override
+    public void stop() {
+        if (DEBUG) {
+            Log.d(TAG, "stop");
+        }
+        if (mState == STATE_PLAYING || mState == STATE_PAUSED) {
+            mMediaPlayer.stop();
+            mState = STATE_IDLE;
+        }
+    }
+
+    @Override
+    public void enqueue(final PlaylistItem item) {
+        throw new UnsupportedOperationException("LocalPlayer doesn't support enqueue!");
+    }
+
+    @Override
+    public PlaylistItem remove(String iid) {
+        throw new UnsupportedOperationException("LocalPlayer doesn't support remove!");
+    }
+
+    //MediaPlayer Listeners
+    @Override
+    public void onPrepared(MediaPlayer mp) {
+        if (DEBUG) {
+            Log.d(TAG, "onPrepared");
+        }
+        mHandler.post(new Runnable() {
+            @Override
+            public void run() {
+                if (mState == STATE_IDLE) {
+                    mState = STATE_READY;
+                    updateVideoRect();
+                } else if (mState == STATE_PREPARING_FOR_PLAY
+                        || mState == STATE_PREPARING_FOR_PAUSE) {
+                    int prevState = mState;
+                    mState = mState == STATE_PREPARING_FOR_PLAY ? STATE_PLAYING : STATE_PAUSED;
+                    updateVideoRect();
+                    if (mSeekToPos > 0) {
+                        if (DEBUG) {
+                            Log.d(TAG, "seek to initial pos: " + mSeekToPos);
+                        }
+                        mMediaPlayer.seekTo(mSeekToPos);
+                    }
+                    if (prevState == STATE_PREPARING_FOR_PLAY) {
+                        mMediaPlayer.start();
+                    }
+                }
+                if (mCallback != null) {
+                    mCallback.onPlaylistChanged();
+                }
+            }
+        });
+    }
+
+    @Override
+    public void onCompletion(MediaPlayer mp) {
+        if (DEBUG) {
+            Log.d(TAG, "onCompletion");
+        }
+        mHandler.post(new Runnable() {
+            @Override
+            public void run() {
+                if (mCallback != null) {
+                    mCallback.onCompletion();
+                }
+            }
+        });
+    }
+
+    @Override
+    public boolean onError(MediaPlayer mp, int what, int extra) {
+        if (DEBUG) {
+            Log.d(TAG, "onError");
+        }
+        mHandler.post(new Runnable() {
+            @Override
+            public void run() {
+                if (mCallback != null) {
+                    mCallback.onError();
+                }
+            }
+        });
+        // return true so that onCompletion is not called
+        return true;
+    }
+
+    @Override
+    public void onSeekComplete(MediaPlayer mp) {
+        if (DEBUG) {
+            Log.d(TAG, "onSeekComplete");
+        }
+        mHandler.post(new Runnable() {
+            @Override
+            public void run() {
+                mSeekToPos = 0;
+                if (mCallback != null) {
+                    mCallback.onPlaylistChanged();
+                }
+            }
+        });
+    }
+
+    protected Context getContext() { return mContext; }
+    protected MediaPlayer getMediaPlayer() { return mMediaPlayer; }
+    protected int getVideoWidth() { return mVideoWidth; }
+    protected int getVideoHeight() { return mVideoHeight; }
+    protected int getState() { return mState; }
+    protected void setSurface(Surface surface) {
+        mSurface = surface;
+        mSurfaceHolder = null;
+        updateSurface();
+    }
+
+    protected void setSurface(SurfaceHolder surfaceHolder) {
+        mSurface = null;
+        mSurfaceHolder = surfaceHolder;
+        updateSurface();
+    }
+
+    protected void removeSurface(SurfaceHolder surfaceHolder) {
+        if (surfaceHolder == mSurfaceHolder) {
+            setSurface((SurfaceHolder)null);
+        }
+    }
+
+    protected void updateSurface() {
+        mUpdateSurfaceHandler.removeCallbacksAndMessages(null);
+        mUpdateSurfaceHandler.post(new Runnable() {
+            @Override
+            public void run() {
+                if (mMediaPlayer == null) {
+                    // just return if media player is already gone
+                    return;
+                }
+                if (mSurface != null) {
+                    // The setSurface API does not exist until V14+.
+                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
+                        ICSMediaPlayer.setSurface(mMediaPlayer, mSurface);
+                    } else {
+                        throw new UnsupportedOperationException("MediaPlayer does not support "
+                                + "setSurface() on this version of the platform.");
+                    }
+                } else if (mSurfaceHolder != null) {
+                    mMediaPlayer.setDisplay(mSurfaceHolder);
+                } else {
+                    mMediaPlayer.setDisplay(null);
+                }
+            }
+        });
+    }
+
+    protected abstract void updateSize();
+
+    private void reset() {
+        if (mMediaPlayer != null) {
+            mMediaPlayer.stop();
+            mMediaPlayer.release();
+            mMediaPlayer = null;
+        }
+        mMediaPlayer = new MediaPlayer();
+        mMediaPlayer.setOnPreparedListener(this);
+        mMediaPlayer.setOnCompletionListener(this);
+        mMediaPlayer.setOnErrorListener(this);
+        mMediaPlayer.setOnSeekCompleteListener(this);
+        updateSurface();
+        mState = STATE_IDLE;
+        mSeekToPos = 0;
+    }
+
+    private void updateVideoRect() {
+        if (mState != STATE_IDLE && mState != STATE_PREPARING_FOR_PLAY
+                && mState != STATE_PREPARING_FOR_PAUSE) {
+            int width = mMediaPlayer.getVideoWidth();
+            int height = mMediaPlayer.getVideoHeight();
+            if (width > 0 && height > 0) {
+                mVideoWidth = width;
+                mVideoHeight = height;
+                updateSize();
+            } else {
+                Log.e(TAG, "video rect is 0x0!");
+                mVideoWidth = mVideoHeight = 0;
+            }
+        }
+    }
+
+    private static final class ICSMediaPlayer {
+        public static final void setSurface(MediaPlayer player, Surface surface) {
+            player.setSurface(surface);
+        }
+    }
+
+    /**
+     * Handles playback of a single media item using MediaPlayer in SurfaceView
+     */
+    public static class SurfaceViewPlayer extends LocalPlayer implements
+            SurfaceHolder.Callback {
+        private static final String TAG = "SurfaceViewPlayer";
+        private RouteInfo mRoute;
+        private final SurfaceView mSurfaceView;
+        private final FrameLayout mLayout;
+        private DemoPresentation mPresentation;
+
+        public SurfaceViewPlayer(Context context) {
+            super(context);
+
+            mLayout = (FrameLayout)((Activity)context).findViewById(R.id.player);
+            mSurfaceView = (SurfaceView)((Activity)context).findViewById(R.id.surface_view);
+
+            // add surface holder callback
+            SurfaceHolder holder = mSurfaceView.getHolder();
+            holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
+            holder.addCallback(this);
+        }
+
+        @Override
+        public void connect(RouteInfo route) {
+            super.connect(route);
+            mRoute = route;
+        }
+
+        @Override
+        public void release() {
+            super.release();
+
+            // dismiss presentation display
+            if (mPresentation != null) {
+                Log.i(TAG, "Dismissing presentation because the activity is no longer visible.");
+                mPresentation.dismiss();
+                mPresentation = null;
+            }
+
+            // remove surface holder callback
+            SurfaceHolder holder = mSurfaceView.getHolder();
+            holder.removeCallback(this);
+
+            // hide the surface view when SurfaceViewPlayer is destroyed
+            mSurfaceView.setVisibility(View.GONE);
+            mLayout.setVisibility(View.GONE);
+        }
+
+        @Override
+        public void updatePresentation() {
+            // Get the current route and its presentation display.
+            Display presentationDisplay = mRoute != null ? mRoute.getPresentationDisplay() : null;
+
+            // Dismiss the current presentation if the display has changed.
+            if (mPresentation != null && mPresentation.getDisplay() != presentationDisplay) {
+                Log.i(TAG, "Dismissing presentation because the current route no longer "
+                        + "has a presentation display.");
+                mPresentation.dismiss();
+                mPresentation = null;
+            }
+
+            // Show a new presentation if needed.
+            if (mPresentation == null && presentationDisplay != null) {
+                Log.i(TAG, "Showing presentation on display: " + presentationDisplay);
+                mPresentation = new DemoPresentation(getContext(), presentationDisplay);
+                mPresentation.setOnDismissListener(mOnDismissListener);
+                try {
+                    mPresentation.show();
+                } catch (WindowManager.InvalidDisplayException ex) {
+                    Log.w(TAG, "Couldn't show presentation!  Display was removed in "
+                              + "the meantime.", ex);
+                    mPresentation = null;
+                }
+            }
+
+            updateContents();
+        }
+
+        // SurfaceHolder.Callback
+        @Override
+        public void surfaceChanged(SurfaceHolder holder, int format,
+                int width, int height) {
+            if (DEBUG) {
+                Log.d(TAG, "surfaceChanged: " + width + "x" + height);
+            }
+            setSurface(holder);
+        }
+
+        @Override
+        public void surfaceCreated(SurfaceHolder holder) {
+            if (DEBUG) {
+                Log.d(TAG, "surfaceCreated");
+            }
+            setSurface(holder);
+            updateSize();
+        }
+
+        @Override
+        public void surfaceDestroyed(SurfaceHolder holder) {
+            if (DEBUG) {
+                Log.d(TAG, "surfaceDestroyed");
+            }
+            removeSurface(holder);
+        }
+
+        @Override
+        protected void updateSize() {
+            int width = getVideoWidth();
+            int height = getVideoHeight();
+            if (width > 0 && height > 0) {
+                if (mPresentation == null) {
+                    int surfaceWidth = mLayout.getWidth();
+                    int surfaceHeight = mLayout.getHeight();
+
+                    // Calculate the new size of mSurfaceView, so that video is centered
+                    // inside the framelayout with proper letterboxing/pillarboxing
+                    ViewGroup.LayoutParams lp = mSurfaceView.getLayoutParams();
+                    if (surfaceWidth * height < surfaceHeight * width) {
+                        // Black bars on top&bottom, mSurfaceView has full layout width,
+                        // while height is derived from video's aspect ratio
+                        lp.width = surfaceWidth;
+                        lp.height = surfaceWidth * height / width;
+                    } else {
+                        // Black bars on left&right, mSurfaceView has full layout height,
+                        // while width is derived from video's aspect ratio
+                        lp.width = surfaceHeight * width / height;
+                        lp.height = surfaceHeight;
+                    }
+                    Log.i(TAG, "video rect is " + lp.width + "x" + lp.height);
+                    mSurfaceView.setLayoutParams(lp);
+                } else {
+                    mPresentation.updateSize(width, height);
+                }
+            }
+        }
+
+        private void updateContents() {
+            // Show either the content in the main activity or the content in the presentation
+            if (mPresentation != null) {
+                mLayout.setVisibility(View.GONE);
+                mSurfaceView.setVisibility(View.GONE);
+            } else {
+                mLayout.setVisibility(View.VISIBLE);
+                mSurfaceView.setVisibility(View.VISIBLE);
+            }
+        }
+
+        // Listens for when presentations are dismissed.
+        private final DialogInterface.OnDismissListener mOnDismissListener =
+                new DialogInterface.OnDismissListener() {
+            @Override
+            public void onDismiss(DialogInterface dialog) {
+                if (dialog == mPresentation) {
+                    Log.i(TAG, "Presentation dismissed.");
+                    mPresentation = null;
+                    updateContents();
+                }
+            }
+        };
+
+        // Presentation
+        private final class DemoPresentation extends Presentation {
+            private SurfaceView mPresentationSurfaceView;
+
+            public DemoPresentation(Context context, Display display) {
+                super(context, display);
+            }
+
+            @Override
+            protected void onCreate(Bundle savedInstanceState) {
+                // Be sure to call the super class.
+                super.onCreate(savedInstanceState);
+
+                // Inflate the layout.
+                setContentView(R.layout.sample_media_router_presentation);
+
+                // Set up the surface view.
+                mPresentationSurfaceView = (SurfaceView)findViewById(R.id.surface_view);
+                SurfaceHolder holder = mPresentationSurfaceView.getHolder();
+                holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
+                holder.addCallback(SurfaceViewPlayer.this);
+                Log.i(TAG, "Presentation created");
+            }
+
+            public void updateSize(int width, int height) {
+                int surfaceHeight = getWindow().getDecorView().getHeight();
+                int surfaceWidth = getWindow().getDecorView().getWidth();
+                ViewGroup.LayoutParams lp = mPresentationSurfaceView.getLayoutParams();
+                if (surfaceWidth * height < surfaceHeight * width) {
+                    lp.width = surfaceWidth;
+                    lp.height = surfaceWidth * height / width;
+                } else {
+                    lp.width = surfaceHeight * width / height;
+                    lp.height = surfaceHeight;
+                }
+                Log.i(TAG, "Presentation video rect is " + lp.width + "x" + lp.height);
+                mPresentationSurfaceView.setLayoutParams(lp);
+            }
+        }
+    }
+
+    /**
+     * Handles playback of a single media item using MediaPlayer in
+     * OverlayDisplayWindow.
+     */
+    public static class OverlayPlayer extends LocalPlayer implements
+            OverlayDisplayWindow.OverlayWindowListener {
+        private static final String TAG = "OverlayPlayer";
+        private final OverlayDisplayWindow mOverlay;
+
+        public OverlayPlayer(Context context) {
+            super(context);
+
+            mOverlay = OverlayDisplayWindow.create(getContext(),
+                    getContext().getResources().getString(
+                            R.string.sample_media_route_provider_remote),
+                    1024, 768, Gravity.CENTER);
+
+            mOverlay.setOverlayWindowListener(this);
+        }
+
+        @Override
+        public void connect(RouteInfo route) {
+            super.connect(route);
+            mOverlay.show();
+        }
+
+        @Override
+        public void release() {
+            super.release();
+            mOverlay.dismiss();
+        }
+
+        @Override
+        protected void updateSize() {
+            int width = getVideoWidth();
+            int height = getVideoHeight();
+            if (width > 0 && height > 0) {
+                mOverlay.updateAspectRatio(width, height);
+            }
+        }
+
+        // OverlayDisplayWindow.OverlayWindowListener
+        @Override
+        public void onWindowCreated(Surface surface) {
+            setSurface(surface);
+        }
+
+        @Override
+        public void onWindowCreated(SurfaceHolder surfaceHolder) {
+            setSurface(surfaceHolder);
+        }
+
+        @Override
+        public void onWindowDestroyed() {
+            setSurface((SurfaceHolder)null);
+        }
+
+        @Override
+        public Bitmap getSnapshot() {
+            if (getState() == STATE_PLAYING || getState() == STATE_PAUSED) {
+                return mOverlay.getSnapshot();
+            }
+            return null;
+        }
+    }
+}
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/media/MyMediaRouteControllerDialog.java b/samples/Support7Demos/src/com/example/android/supportv7/media/MyMediaRouteControllerDialog.java
new file mode 100644
index 0000000..3264671
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/media/MyMediaRouteControllerDialog.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv7.media;
+
+import android.graphics.Color;
+import android.os.Bundle;
+import android.support.v7.app.MediaRouteControllerDialog;
+
+import android.content.Context;
+import android.view.View;
+import android.widget.TextView;
+import com.example.android.supportv7.R;
+
+/**
+ * An example MediaRouteControllerDialog for demonstrating
+ * {@link android.support.v7.app.MediaRouteControllerDialog#onCreateMediaControlView}.
+ */
+public class MyMediaRouteControllerDialog extends MediaRouteControllerDialog {
+    public MyMediaRouteControllerDialog(Context context) {
+        super(context);
+    }
+
+    @Override
+    public View onCreateMediaControlView(Bundle savedInstanceState) {
+        TextView view = new TextView(getContext());
+        view.setText(R.string.my_media_control_text);
+        view.setBackgroundColor(Color.GRAY);
+        return view;
+    }
+}
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/media/OverlayDisplayWindow.java b/samples/Support7Demos/src/com/example/android/supportv7/media/OverlayDisplayWindow.java
new file mode 100644
index 0000000..1d4aaa1
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/media/OverlayDisplayWindow.java
@@ -0,0 +1,475 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv7.media;
+import com.example.android.supportv7.R;
+
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.SurfaceTexture;
+import android.hardware.display.DisplayManager;
+import android.os.Build;
+import android.util.Log;
+import android.view.Display;
+import android.util.DisplayMetrics;
+import android.view.GestureDetector;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.MotionEvent;
+import android.view.ScaleGestureDetector;
+import android.view.SurfaceHolder;
+import android.view.SurfaceView;
+import android.view.TextureView;
+import android.view.View;
+import android.view.Surface;
+import android.view.WindowManager;
+import android.view.TextureView.SurfaceTextureListener;
+import android.widget.TextView;
+
+/**
+ * Manages an overlay display window, used for simulating remote playback.
+ */
+public abstract class OverlayDisplayWindow {
+    private static final String TAG = "OverlayDisplayWindow";
+    private static final boolean DEBUG = false;
+
+    private static final float WINDOW_ALPHA = 0.8f;
+    private static final float INITIAL_SCALE = 0.5f;
+    private static final float MIN_SCALE = 0.3f;
+    private static final float MAX_SCALE = 1.0f;
+
+    protected final Context mContext;
+    protected final String mName;
+    protected final int mWidth;
+    protected final int mHeight;
+    protected final int mGravity;
+    protected OverlayWindowListener mListener;
+
+    protected OverlayDisplayWindow(Context context, String name,
+            int width, int height, int gravity) {
+        mContext = context;
+        mName = name;
+        mWidth = width;
+        mHeight = height;
+        mGravity = gravity;
+    }
+
+    public static OverlayDisplayWindow create(Context context, String name,
+            int width, int height, int gravity) {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
+            return new JellybeanMr1Impl(context, name, width, height, gravity);
+        } else {
+            return new LegacyImpl(context, name, width, height, gravity);
+        }
+    }
+
+    public void setOverlayWindowListener(OverlayWindowListener listener) {
+        mListener = listener;
+    }
+
+    public Context getContext() {
+        return mContext;
+    }
+
+    public abstract void show();
+
+    public abstract void dismiss();
+
+    public abstract void updateAspectRatio(int width, int height);
+
+    public abstract Bitmap getSnapshot();
+
+    // Watches for significant changes in the overlay display window lifecycle.
+    public interface OverlayWindowListener {
+        void onWindowCreated(Surface surface);
+        void onWindowCreated(SurfaceHolder surfaceHolder);
+        void onWindowDestroyed();
+    }
+
+    /**
+     * Implementation for older versions.
+     */
+    private static final class LegacyImpl extends OverlayDisplayWindow {
+        private final WindowManager mWindowManager;
+
+        private boolean mWindowVisible;
+        private SurfaceView mSurfaceView;
+
+        public LegacyImpl(Context context, String name,
+                int width, int height, int gravity) {
+            super(context, name, width, height, gravity);
+
+            mWindowManager = (WindowManager)context.getSystemService(
+                    Context.WINDOW_SERVICE);
+        }
+
+        @Override
+        public void show() {
+            if (!mWindowVisible) {
+                mSurfaceView = new SurfaceView(mContext);
+
+                Display display = mWindowManager.getDefaultDisplay();
+
+                WindowManager.LayoutParams params = new WindowManager.LayoutParams(
+                        WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
+                params.flags |= WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
+                        | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
+                        | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
+                        | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
+                        | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;
+                params.alpha = WINDOW_ALPHA;
+                params.gravity = Gravity.LEFT | Gravity.BOTTOM;
+                params.setTitle(mName);
+
+                int width = (int)(display.getWidth() * INITIAL_SCALE);
+                int height = (int)(display.getHeight() * INITIAL_SCALE);
+                if (mWidth > mHeight) {
+                    height = mHeight * width / mWidth;
+                } else {
+                    width = mWidth * height / mHeight;
+                }
+                params.width = width;
+                params.height = height;
+
+                mWindowManager.addView(mSurfaceView, params);
+                mWindowVisible = true;
+
+                SurfaceHolder holder = mSurfaceView.getHolder();
+                holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
+                mListener.onWindowCreated(holder);
+            }
+        }
+
+        @Override
+        public void dismiss() {
+            if (mWindowVisible) {
+                mListener.onWindowDestroyed();
+
+                mWindowManager.removeView(mSurfaceView);
+                mWindowVisible = false;
+            }
+        }
+
+        @Override
+        public void updateAspectRatio(int width, int height) {
+        }
+
+        @Override
+        public Bitmap getSnapshot() {
+            return null;
+        }
+    }
+
+    /**
+     * Implementation for API version 17+.
+     */
+    private static final class JellybeanMr1Impl extends OverlayDisplayWindow {
+        // When true, disables support for moving and resizing the overlay.
+        // The window is made non-touchable, which makes it possible to
+        // directly interact with the content underneath.
+        private static final boolean DISABLE_MOVE_AND_RESIZE = false;
+
+        private final DisplayManager mDisplayManager;
+        private final WindowManager mWindowManager;
+
+        private final Display mDefaultDisplay;
+        private final DisplayMetrics mDefaultDisplayMetrics = new DisplayMetrics();
+
+        private View mWindowContent;
+        private WindowManager.LayoutParams mWindowParams;
+        private TextureView mTextureView;
+        private TextView mNameTextView;
+
+        private GestureDetector mGestureDetector;
+        private ScaleGestureDetector mScaleGestureDetector;
+
+        private boolean mWindowVisible;
+        private int mWindowX;
+        private int mWindowY;
+        private float mWindowScale;
+
+        private float mLiveTranslationX;
+        private float mLiveTranslationY;
+        private float mLiveScale = 1.0f;
+
+        public JellybeanMr1Impl(Context context, String name,
+                int width, int height, int gravity) {
+            super(context, name, width, height, gravity);
+
+            mDisplayManager = (DisplayManager)context.getSystemService(
+                    Context.DISPLAY_SERVICE);
+            mWindowManager = (WindowManager)context.getSystemService(
+                    Context.WINDOW_SERVICE);
+
+            mDefaultDisplay = mWindowManager.getDefaultDisplay();
+            updateDefaultDisplayInfo();
+
+            createWindow();
+        }
+
+        @Override
+        public void show() {
+            if (!mWindowVisible) {
+                mDisplayManager.registerDisplayListener(mDisplayListener, null);
+                if (!updateDefaultDisplayInfo()) {
+                    mDisplayManager.unregisterDisplayListener(mDisplayListener);
+                    return;
+                }
+
+                clearLiveState();
+                updateWindowParams();
+                mWindowManager.addView(mWindowContent, mWindowParams);
+                mWindowVisible = true;
+            }
+        }
+
+        @Override
+        public void dismiss() {
+            if (mWindowVisible) {
+                mDisplayManager.unregisterDisplayListener(mDisplayListener);
+                mWindowManager.removeView(mWindowContent);
+                mWindowVisible = false;
+            }
+        }
+
+        @Override
+        public void updateAspectRatio(int width, int height) {
+            if (mWidth * height < mHeight * width) {
+                mTextureView.getLayoutParams().width = mWidth;
+                mTextureView.getLayoutParams().height = mWidth * height / width;
+            } else {
+                mTextureView.getLayoutParams().width = mHeight * width / height;
+                mTextureView.getLayoutParams().height = mHeight;
+            }
+            relayout();
+        }
+
+        @Override
+        public Bitmap getSnapshot() {
+            return mTextureView.getBitmap();
+        }
+
+        private void relayout() {
+            if (mWindowVisible) {
+                updateWindowParams();
+                mWindowManager.updateViewLayout(mWindowContent, mWindowParams);
+            }
+        }
+
+        private boolean updateDefaultDisplayInfo() {
+            mDefaultDisplay.getMetrics(mDefaultDisplayMetrics);
+            return true;
+        }
+
+        private void createWindow() {
+            LayoutInflater inflater = LayoutInflater.from(mContext);
+
+            mWindowContent = inflater.inflate(
+                    R.layout.overlay_display_window, null);
+            mWindowContent.setOnTouchListener(mOnTouchListener);
+
+            mTextureView = (TextureView)mWindowContent.findViewById(
+                    R.id.overlay_display_window_texture);
+            mTextureView.setPivotX(0);
+            mTextureView.setPivotY(0);
+            mTextureView.getLayoutParams().width = mWidth;
+            mTextureView.getLayoutParams().height = mHeight;
+            mTextureView.setOpaque(false);
+            mTextureView.setSurfaceTextureListener(mSurfaceTextureListener);
+
+            mNameTextView = (TextView)mWindowContent.findViewById(
+                    R.id.overlay_display_window_title);
+            mNameTextView.setText(mName);
+
+            mWindowParams = new WindowManager.LayoutParams(
+                    WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
+            mWindowParams.flags |= WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
+                    | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
+                    | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
+                    | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
+                    | WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED;
+            if (DISABLE_MOVE_AND_RESIZE) {
+                mWindowParams.flags |= WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;
+            }
+            mWindowParams.alpha = WINDOW_ALPHA;
+            mWindowParams.gravity = Gravity.TOP | Gravity.LEFT;
+            mWindowParams.setTitle(mName);
+
+            mGestureDetector = new GestureDetector(mContext, mOnGestureListener);
+            mScaleGestureDetector = new ScaleGestureDetector(mContext, mOnScaleGestureListener);
+
+            // Set the initial position and scale.
+            // The position and scale will be clamped when the display is first shown.
+            mWindowX = (mGravity & Gravity.LEFT) == Gravity.LEFT ?
+                    0 : mDefaultDisplayMetrics.widthPixels;
+            mWindowY = (mGravity & Gravity.TOP) == Gravity.TOP ?
+                    0 : mDefaultDisplayMetrics.heightPixels;
+            Log.d(TAG, mDefaultDisplayMetrics.toString());
+            mWindowScale = INITIAL_SCALE;
+
+            // calculate and save initial settings
+            updateWindowParams();
+            saveWindowParams();
+        }
+
+        private void updateWindowParams() {
+            float scale = mWindowScale * mLiveScale;
+            scale = Math.min(scale, (float)mDefaultDisplayMetrics.widthPixels / mWidth);
+            scale = Math.min(scale, (float)mDefaultDisplayMetrics.heightPixels / mHeight);
+            scale = Math.max(MIN_SCALE, Math.min(MAX_SCALE, scale));
+
+            float offsetScale = (scale / mWindowScale - 1.0f) * 0.5f;
+            int width = (int)(mWidth * scale);
+            int height = (int)(mHeight * scale);
+            int x = (int)(mWindowX + mLiveTranslationX - width * offsetScale);
+            int y = (int)(mWindowY + mLiveTranslationY - height * offsetScale);
+            x = Math.max(0, Math.min(x, mDefaultDisplayMetrics.widthPixels - width));
+            y = Math.max(0, Math.min(y, mDefaultDisplayMetrics.heightPixels - height));
+
+            if (DEBUG) {
+                Log.d(TAG, "updateWindowParams: scale=" + scale
+                        + ", offsetScale=" + offsetScale
+                        + ", x=" + x + ", y=" + y
+                        + ", width=" + width + ", height=" + height);
+            }
+
+            mTextureView.setScaleX(scale);
+            mTextureView.setScaleY(scale);
+
+            mTextureView.setTranslationX(
+                    (mWidth - mTextureView.getLayoutParams().width) * scale / 2);
+            mTextureView.setTranslationY(
+                    (mHeight - mTextureView.getLayoutParams().height) * scale / 2);
+
+            mWindowParams.x = x;
+            mWindowParams.y = y;
+            mWindowParams.width = width;
+            mWindowParams.height = height;
+        }
+
+        private void saveWindowParams() {
+            mWindowX = mWindowParams.x;
+            mWindowY = mWindowParams.y;
+            mWindowScale = mTextureView.getScaleX();
+            clearLiveState();
+        }
+
+        private void clearLiveState() {
+            mLiveTranslationX = 0f;
+            mLiveTranslationY = 0f;
+            mLiveScale = 1.0f;
+        }
+
+        private final DisplayManager.DisplayListener mDisplayListener =
+                new DisplayManager.DisplayListener() {
+            @Override
+            public void onDisplayAdded(int displayId) {
+            }
+
+            @Override
+            public void onDisplayChanged(int displayId) {
+                if (displayId == mDefaultDisplay.getDisplayId()) {
+                    if (updateDefaultDisplayInfo()) {
+                        relayout();
+                    } else {
+                        dismiss();
+                    }
+                }
+            }
+
+            @Override
+            public void onDisplayRemoved(int displayId) {
+                if (displayId == mDefaultDisplay.getDisplayId()) {
+                    dismiss();
+                }
+            }
+        };
+
+        private final SurfaceTextureListener mSurfaceTextureListener =
+                new SurfaceTextureListener() {
+            @Override
+            public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture,
+                    int width, int height) {
+                if (mListener != null) {
+                    mListener.onWindowCreated(new Surface(surfaceTexture));
+                }
+            }
+
+            @Override
+            public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) {
+                if (mListener != null) {
+                    mListener.onWindowDestroyed();
+                }
+                return true;
+            }
+
+            @Override
+            public void onSurfaceTextureSizeChanged(SurfaceTexture surfaceTexture,
+                    int width, int height) {
+            }
+
+            @Override
+            public void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture) {
+            }
+        };
+
+        private final View.OnTouchListener mOnTouchListener = new View.OnTouchListener() {
+            @Override
+            public boolean onTouch(View view, MotionEvent event) {
+                // Work in screen coordinates.
+                final float oldX = event.getX();
+                final float oldY = event.getY();
+                event.setLocation(event.getRawX(), event.getRawY());
+
+                mGestureDetector.onTouchEvent(event);
+                mScaleGestureDetector.onTouchEvent(event);
+
+                switch (event.getActionMasked()) {
+                    case MotionEvent.ACTION_UP:
+                    case MotionEvent.ACTION_CANCEL:
+                        saveWindowParams();
+                        break;
+                }
+
+                // Revert to window coordinates.
+                event.setLocation(oldX, oldY);
+                return true;
+            }
+        };
+
+        private final GestureDetector.OnGestureListener mOnGestureListener =
+                new GestureDetector.SimpleOnGestureListener() {
+            @Override
+            public boolean onScroll(MotionEvent e1, MotionEvent e2,
+                    float distanceX, float distanceY) {
+                mLiveTranslationX -= distanceX;
+                mLiveTranslationY -= distanceY;
+                relayout();
+                return true;
+            }
+        };
+
+        private final ScaleGestureDetector.OnScaleGestureListener mOnScaleGestureListener =
+                new ScaleGestureDetector.SimpleOnScaleGestureListener() {
+            @Override
+            public boolean onScale(ScaleGestureDetector detector) {
+                mLiveScale *= detector.getScaleFactor();
+                relayout();
+                return true;
+            }
+        };
+    }
+}
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/media/Player.java b/samples/Support7Demos/src/com/example/android/supportv7/media/Player.java
new file mode 100644
index 0000000..a5d5897
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/media/Player.java
@@ -0,0 +1,158 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv7.media;
+
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.support.v4.media.MediaMetadataCompat;
+import android.support.v4.media.session.MediaSessionCompat;
+import android.support.v4.media.session.PlaybackStateCompat;
+import android.support.v7.media.MediaControlIntent;
+import android.support.v7.media.MediaRouter.RouteInfo;
+import android.util.Log;
+
+/**
+ * Abstraction of common playback operations of media items, such as play,
+ * seek, etc. Used by PlaybackManager as a backend to handle actual playback
+ * of media items.
+ *
+ * TODO: Introduce prepare() method and refactor subclasses accordingly.
+ */
+public abstract class Player {
+    private static final String TAG = "SampleMediaRoutePlayer";
+    protected static final int STATE_IDLE = 0;
+    protected static final int STATE_PREPARING_FOR_PLAY = 1;
+    protected static final int STATE_PREPARING_FOR_PAUSE = 2;
+    protected static final int STATE_READY = 3;
+    protected static final int STATE_PLAYING = 4;
+    protected static final int STATE_PAUSED = 5;
+
+    private static final long PLAYBACK_ACTIONS = PlaybackStateCompat.ACTION_PAUSE
+            | PlaybackStateCompat.ACTION_PLAY;
+    private static final PlaybackStateCompat INIT_PLAYBACK_STATE = new PlaybackStateCompat.Builder()
+            .setState(PlaybackStateCompat.STATE_NONE, 0, .0f).build();
+
+    protected Callback mCallback;
+    protected MediaSessionCompat mMediaSession;
+
+    public abstract boolean isRemotePlayback();
+    public abstract boolean isQueuingSupported();
+
+    public abstract void connect(RouteInfo route);
+    public abstract void release();
+
+    // basic operations that are always supported
+    public abstract void play(final PlaylistItem item);
+    public abstract void seek(final PlaylistItem item);
+    public abstract void getStatus(final PlaylistItem item, final boolean update);
+    public abstract void pause();
+    public abstract void resume();
+    public abstract void stop();
+
+    // advanced queuing (enqueue & remove) are only supported
+    // if isQueuingSupported() returns true
+    public abstract void enqueue(final PlaylistItem item);
+    public abstract PlaylistItem remove(String iid);
+
+    // track info for current media item
+    public void updateTrackInfo() {}
+    public String getDescription() { return ""; }
+    public Bitmap getSnapshot() { return null; }
+
+    // presentation display
+    public void updatePresentation() {}
+
+    public void setCallback(Callback callback) {
+        mCallback = callback;
+    }
+
+    public static Player create(Context context, RouteInfo route, MediaSessionCompat session) {
+        Player player;
+        if (route != null && route.supportsControlCategory(
+                MediaControlIntent.CATEGORY_REMOTE_PLAYBACK)) {
+            player = new RemotePlayer(context);
+        } else if (route != null) {
+            player = new LocalPlayer.SurfaceViewPlayer(context);
+        } else {
+            player = new LocalPlayer.OverlayPlayer(context);
+        }
+        player.setMediaSession(session);
+        player.initMediaSession();
+        player.connect(route);
+        return player;
+    }
+
+    protected void initMediaSession() {
+        if (mMediaSession == null) {
+            return;
+        }
+        mMediaSession.setMetadata(null);
+        mMediaSession.setPlaybackState(INIT_PLAYBACK_STATE);
+    }
+
+    protected void updateMetadata() {
+        if (mMediaSession == null) {
+            return;
+        }
+        MediaMetadataCompat.Builder bob = new MediaMetadataCompat.Builder();
+        bob.putString(MediaMetadataCompat.METADATA_KEY_DISPLAY_TITLE, getDescription());
+        bob.putString(MediaMetadataCompat.METADATA_KEY_DISPLAY_SUBTITLE, "Subtitle of the thing");
+        bob.putString(MediaMetadataCompat.METADATA_KEY_DISPLAY_DESCRIPTION,
+                "Description of the thing");
+        bob.putBitmap(MediaMetadataCompat.METADATA_KEY_DISPLAY_ICON, getSnapshot());
+        mMediaSession.setMetadata(bob.build());
+    }
+
+    protected void publishState(int state) {
+        if (mMediaSession == null) {
+            return;
+        }
+        PlaybackStateCompat.Builder bob = new PlaybackStateCompat.Builder();
+        bob.setActions(PLAYBACK_ACTIONS);
+        switch (state) {
+            case STATE_PLAYING:
+                bob.setState(PlaybackStateCompat.STATE_PLAYING, -1, 1);
+                break;
+            case STATE_READY:
+            case STATE_PAUSED:
+                bob.setState(PlaybackStateCompat.STATE_PAUSED, -1, 0);
+                break;
+            case STATE_IDLE:
+                bob.setState(PlaybackStateCompat.STATE_STOPPED, -1, 0);
+                break;
+        }
+        PlaybackStateCompat pbState = bob.build();
+        Log.d(TAG, "Setting state to " + pbState);
+        mMediaSession.setPlaybackState(pbState);
+        if (state != STATE_IDLE) {
+            mMediaSession.setActive(true);
+        } else {
+            mMediaSession.setActive(false);
+        }
+    }
+
+    private void setMediaSession(MediaSessionCompat session) {
+        mMediaSession = session;
+    }
+
+    public interface Callback {
+        void onError();
+        void onCompletion();
+        void onPlaylistChanged();
+        void onPlaylistReady();
+    }
+}
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/media/PlaylistItem.java b/samples/Support7Demos/src/com/example/android/supportv7/media/PlaylistItem.java
new file mode 100644
index 0000000..9a12d59
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/media/PlaylistItem.java
@@ -0,0 +1,130 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv7.media;
+
+import android.app.PendingIntent;
+import android.net.Uri;
+import android.os.SystemClock;
+import android.support.v7.media.MediaItemStatus;
+
+/**
+ * PlaylistItem helps keep track of the current status of an media item.
+ */
+final class PlaylistItem {
+    // immutables
+    private final String mSessionId;
+    private final String mItemId;
+    private final Uri mUri;
+    private final String mMime;
+    private final PendingIntent mUpdateReceiver;
+    // changeable states
+    private int mPlaybackState = MediaItemStatus.PLAYBACK_STATE_PENDING;
+    private long mContentPosition;
+    private long mContentDuration;
+    private long mTimestamp;
+    private String mRemoteItemId;
+
+    public PlaylistItem(String qid, String iid, Uri uri, String mime, PendingIntent pi) {
+        mSessionId = qid;
+        mItemId = iid;
+        mUri = uri;
+        mMime = mime;
+        mUpdateReceiver = pi;
+        setTimestamp(SystemClock.elapsedRealtime());
+    }
+
+    public void setRemoteItemId(String riid) {
+        mRemoteItemId = riid;
+    }
+
+    public void setState(int state) {
+        mPlaybackState = state;
+    }
+
+    public void setPosition(long pos) {
+        mContentPosition = pos;
+    }
+
+    public void setTimestamp(long ts) {
+        mTimestamp = ts;
+    }
+
+    public void setDuration(long duration) {
+        mContentDuration = duration;
+    }
+
+    public String getSessionId() {
+        return mSessionId;
+    }
+
+    public String getItemId() {
+        return mItemId;
+    }
+
+    public String getRemoteItemId() {
+        return mRemoteItemId;
+    }
+
+    public Uri getUri() {
+        return mUri;
+    }
+
+    public PendingIntent getUpdateReceiver() {
+        return mUpdateReceiver;
+    }
+
+    public int getState() {
+        return mPlaybackState;
+    }
+
+    public long getPosition() {
+        return mContentPosition;
+    }
+
+    public long getDuration() {
+        return mContentDuration;
+    }
+
+    public long getTimestamp() {
+        return mTimestamp;
+    }
+
+    public MediaItemStatus getStatus() {
+        return new MediaItemStatus.Builder(mPlaybackState)
+            .setContentPosition(mContentPosition)
+            .setContentDuration(mContentDuration)
+            .setTimestamp(mTimestamp)
+            .build();
+    }
+
+    @Override
+    public String toString() {
+        String state[] = {
+            "PENDING",
+            "PLAYING",
+            "PAUSED",
+            "BUFFERING",
+            "FINISHED",
+            "CANCELED",
+            "INVALIDATED",
+            "ERROR"
+        };
+        return "[" + mSessionId + "|" + mItemId + "|"
+            + (mRemoteItemId != null ? mRemoteItemId : "-") + "|"
+            + state[mPlaybackState] + "] " + mUri.toString();
+    }
+}
\ No newline at end of file
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/media/RemotePlayer.java b/samples/Support7Demos/src/com/example/android/supportv7/media/RemotePlayer.java
new file mode 100644
index 0000000..6ad4f75
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/media/RemotePlayer.java
@@ -0,0 +1,493 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv7.media;
+
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.Bitmap;
+import android.os.Bundle;
+import android.support.v7.media.MediaItemStatus;
+import android.support.v7.media.MediaRouter.ControlRequestCallback;
+import android.support.v7.media.MediaRouter.RouteInfo;
+import android.support.v7.media.MediaSessionStatus;
+import android.support.v7.media.RemotePlaybackClient;
+import android.support.v7.media.RemotePlaybackClient.ItemActionCallback;
+import android.support.v7.media.RemotePlaybackClient.SessionActionCallback;
+import android.support.v7.media.RemotePlaybackClient.StatusCallback;
+import android.util.Log;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Handles playback of media items using a remote route.
+ *
+ * This class is used as a backend by PlaybackManager to feed media items to
+ * the remote route. When the remote route doesn't support queuing, media items
+ * are fed one-at-a-time; otherwise media items are enqueued to the remote side.
+ */
+public class RemotePlayer extends Player {
+    private static final String TAG = "RemotePlayer";
+    private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
+    private Context mContext;
+    private RouteInfo mRoute;
+    private boolean mEnqueuePending;
+    private String mTrackInfo = "";
+    private Bitmap mSnapshot;
+    private List<PlaylistItem> mTempQueue = new ArrayList<PlaylistItem>();
+
+    private RemotePlaybackClient mClient;
+    private StatusCallback mStatusCallback = new StatusCallback() {
+        @Override
+        public void onItemStatusChanged(Bundle data,
+                String sessionId, MediaSessionStatus sessionStatus,
+                String itemId, MediaItemStatus itemStatus) {
+            logStatus("onItemStatusChanged", sessionId, sessionStatus, itemId, itemStatus);
+            if (mCallback != null) {
+                if (itemStatus.getPlaybackState() ==
+                        MediaItemStatus.PLAYBACK_STATE_FINISHED) {
+                    mCallback.onCompletion();
+                } else if (itemStatus.getPlaybackState() ==
+                        MediaItemStatus.PLAYBACK_STATE_ERROR) {
+                    mCallback.onError();
+                }
+            }
+        }
+
+        @Override
+        public void onSessionStatusChanged(Bundle data,
+                String sessionId, MediaSessionStatus sessionStatus) {
+            logStatus("onSessionStatusChanged", sessionId, sessionStatus, null, null);
+            if (mCallback != null) {
+                mCallback.onPlaylistChanged();
+            }
+        }
+
+        @Override
+        public void onSessionChanged(String sessionId) {
+            if (DEBUG) {
+                Log.d(TAG, "onSessionChanged: sessionId=" + sessionId);
+            }
+        }
+    };
+
+    public RemotePlayer(Context context) {
+        mContext = context;
+    }
+
+    @Override
+    public boolean isRemotePlayback() {
+        return true;
+    }
+
+    @Override
+    public boolean isQueuingSupported() {
+        return mClient.isQueuingSupported();
+    }
+
+    @Override
+    public void connect(RouteInfo route) {
+        mRoute = route;
+        mClient = new RemotePlaybackClient(mContext, route);
+        mClient.setStatusCallback(mStatusCallback);
+
+        if (DEBUG) {
+            Log.d(TAG, "connected to: " + route
+                    + ", isRemotePlaybackSupported: " + mClient.isRemotePlaybackSupported()
+                    + ", isQueuingSupported: "+ mClient.isQueuingSupported());
+        }
+    }
+
+    @Override
+    public void release() {
+        mClient.release();
+
+        if (DEBUG) {
+            Log.d(TAG, "released.");
+        }
+    }
+
+    // basic playback operations that are always supported
+    @Override
+    public void play(final PlaylistItem item) {
+        if (DEBUG) {
+            Log.d(TAG, "play: item=" + item);
+        }
+        mClient.play(item.getUri(), "video/mp4", null, 0, null, new ItemActionCallback() {
+            @Override
+            public void onResult(Bundle data, String sessionId, MediaSessionStatus sessionStatus,
+                    String itemId, MediaItemStatus itemStatus) {
+                logStatus("play: succeeded", sessionId, sessionStatus, itemId, itemStatus);
+                item.setRemoteItemId(itemId);
+                if (item.getPosition() > 0) {
+                    seekInternal(item);
+                }
+                if (item.getState() == MediaItemStatus.PLAYBACK_STATE_PAUSED) {
+                    pause();
+                } else {
+                    publishState(STATE_PLAYING);
+                }
+                if (mCallback != null) {
+                    mCallback.onPlaylistChanged();
+                }
+            }
+
+            @Override
+            public void onError(String error, int code, Bundle data) {
+                logError("play: failed", error, code);
+            }
+        });
+    }
+
+    @Override
+    public void seek(final PlaylistItem item) {
+        seekInternal(item);
+    }
+
+    @Override
+    public void getStatus(final PlaylistItem item, final boolean update) {
+        if (!mClient.hasSession() || item.getRemoteItemId() == null) {
+            // if session is not valid or item id not assigend yet.
+            // just return, it's not fatal
+            return;
+        }
+
+        if (DEBUG) {
+            Log.d(TAG, "getStatus: item=" + item + ", update=" + update);
+        }
+        mClient.getStatus(item.getRemoteItemId(), null, new ItemActionCallback() {
+            @Override
+            public void onResult(Bundle data, String sessionId, MediaSessionStatus sessionStatus,
+                    String itemId, MediaItemStatus itemStatus) {
+                logStatus("getStatus: succeeded", sessionId, sessionStatus, itemId, itemStatus);
+                int state = itemStatus.getPlaybackState();
+                if (state == MediaItemStatus.PLAYBACK_STATE_PLAYING
+                        || state == MediaItemStatus.PLAYBACK_STATE_PAUSED
+                        || state == MediaItemStatus.PLAYBACK_STATE_PENDING) {
+                    item.setState(state);
+                    item.setPosition(itemStatus.getContentPosition());
+                    item.setDuration(itemStatus.getContentDuration());
+                    item.setTimestamp(itemStatus.getTimestamp());
+                }
+                if (update && mCallback != null) {
+                    mCallback.onPlaylistReady();
+                }
+            }
+
+            @Override
+            public void onError(String error, int code, Bundle data) {
+                logError("getStatus: failed", error, code);
+                if (update && mCallback != null) {
+                    mCallback.onPlaylistReady();
+                }
+            }
+        });
+    }
+
+    @Override
+    public void pause() {
+        if (!mClient.hasSession()) {
+            // ignore if no session
+            return;
+        }
+        if (DEBUG) {
+            Log.d(TAG, "pause");
+        }
+        mClient.pause(null, new SessionActionCallback() {
+            @Override
+            public void onResult(Bundle data, String sessionId, MediaSessionStatus sessionStatus) {
+                logStatus("pause: succeeded", sessionId, sessionStatus, null, null);
+                if (mCallback != null) {
+                    mCallback.onPlaylistChanged();
+                }
+                publishState(STATE_PAUSED);
+            }
+
+            @Override
+            public void onError(String error, int code, Bundle data) {
+                logError("pause: failed", error, code);
+            }
+        });
+    }
+
+    @Override
+    public void resume() {
+        if (!mClient.hasSession()) {
+            // ignore if no session
+            return;
+        }
+        if (DEBUG) {
+            Log.d(TAG, "resume");
+        }
+        mClient.resume(null, new SessionActionCallback() {
+            @Override
+            public void onResult(Bundle data, String sessionId, MediaSessionStatus sessionStatus) {
+                logStatus("resume: succeeded", sessionId, sessionStatus, null, null);
+                if (mCallback != null) {
+                    mCallback.onPlaylistChanged();
+                }
+                publishState(STATE_PLAYING);
+            }
+
+            @Override
+            public void onError(String error, int code, Bundle data) {
+                logError("resume: failed", error, code);
+            }
+        });
+    }
+
+    @Override
+    public void stop() {
+        if (!mClient.hasSession()) {
+            // ignore if no session
+            return;
+        }
+        publishState(STATE_IDLE);
+        if (DEBUG) {
+            Log.d(TAG, "stop");
+        }
+        mClient.stop(null, new SessionActionCallback() {
+            @Override
+            public void onResult(Bundle data, String sessionId, MediaSessionStatus sessionStatus) {
+                logStatus("stop: succeeded", sessionId, sessionStatus, null, null);
+                if (mClient.isSessionManagementSupported()) {
+                    endSession();
+                }
+                if (mCallback != null) {
+                    mCallback.onPlaylistChanged();
+                }
+            }
+
+            @Override
+            public void onError(String error, int code, Bundle data) {
+                logError("stop: failed", error, code);
+            }
+        });
+    }
+
+    // enqueue & remove are only supported if isQueuingSupported() returns true
+    @Override
+    public void enqueue(final PlaylistItem item) {
+        throwIfQueuingUnsupported();
+
+        if (!mClient.hasSession() && !mEnqueuePending) {
+            mEnqueuePending = true;
+            if (mClient.isSessionManagementSupported()) {
+                startSession(item);
+            } else {
+                enqueueInternal(item);
+            }
+        } else if (mEnqueuePending){
+            mTempQueue.add(item);
+        } else {
+            enqueueInternal(item);
+        }
+    }
+
+    @Override
+    public PlaylistItem remove(String itemId) {
+        throwIfNoSession();
+        throwIfQueuingUnsupported();
+
+        if (DEBUG) {
+            Log.d(TAG, "remove: itemId=" + itemId);
+        }
+        mClient.remove(itemId, null, new ItemActionCallback() {
+            @Override
+            public void onResult(Bundle data, String sessionId, MediaSessionStatus sessionStatus,
+                    String itemId, MediaItemStatus itemStatus) {
+                logStatus("remove: succeeded", sessionId, sessionStatus, itemId, itemStatus);
+            }
+
+            @Override
+            public void onError(String error, int code, Bundle data) {
+                logError("remove: failed", error, code);
+            }
+        });
+
+        return null;
+    }
+
+    @Override
+    public void updateTrackInfo() {
+        // clear stats info first
+        mTrackInfo = "";
+        mSnapshot = null;
+
+        Intent intent = new Intent(SampleMediaRouteProvider.ACTION_GET_TRACK_INFO);
+        intent.addCategory(SampleMediaRouteProvider.CATEGORY_SAMPLE_ROUTE);
+
+        if (mRoute != null && mRoute.supportsControlRequest(intent)) {
+            ControlRequestCallback callback = new ControlRequestCallback() {
+                @Override
+                public void onResult(Bundle data) {
+                    if (DEBUG) {
+                        Log.d(TAG, "getStatistics: succeeded: data=" + data);
+                    }
+                    if (data != null) {
+                        mTrackInfo = data.getString(SampleMediaRouteProvider.TRACK_INFO_DESC);
+                        mSnapshot = data.getParcelable(
+                                SampleMediaRouteProvider.TRACK_INFO_SNAPSHOT);
+                    }
+                }
+
+                @Override
+                public void onError(String error, Bundle data) {
+                    Log.d(TAG, "getStatistics: failed: error=" + error + ", data=" + data);
+                }
+            };
+
+            mRoute.sendControlRequest(intent, callback);
+        }
+    }
+
+    @Override
+    public String getDescription() {
+        return mTrackInfo;
+    }
+
+    @Override
+    public Bitmap getSnapshot() {
+        return mSnapshot;
+    }
+
+    private void enqueueInternal(final PlaylistItem item) {
+        throwIfQueuingUnsupported();
+
+        if (DEBUG) {
+            Log.d(TAG, "enqueue: item=" + item);
+        }
+        mClient.enqueue(item.getUri(), "video/mp4", null, 0, null, new ItemActionCallback() {
+            @Override
+            public void onResult(Bundle data, String sessionId, MediaSessionStatus sessionStatus,
+                    String itemId, MediaItemStatus itemStatus) {
+                logStatus("enqueue: succeeded", sessionId, sessionStatus, itemId, itemStatus);
+                item.setRemoteItemId(itemId);
+                if (item.getPosition() > 0) {
+                    seekInternal(item);
+                }
+                if (item.getState() == MediaItemStatus.PLAYBACK_STATE_PAUSED) {
+                    pause();
+                } else if (item.getState() == MediaItemStatus.PLAYBACK_STATE_PLAYING) {
+                    publishState(STATE_PLAYING);
+                }
+                if (mEnqueuePending) {
+                    mEnqueuePending = false;
+                    for (PlaylistItem item : mTempQueue) {
+                        enqueueInternal(item);
+                    }
+                    mTempQueue.clear();
+                }
+                if (mCallback != null) {
+                    mCallback.onPlaylistChanged();
+                }
+            }
+
+            @Override
+            public void onError(String error, int code, Bundle data) {
+                logError("enqueue: failed", error, code);
+                if (mCallback != null) {
+                    mCallback.onPlaylistChanged();
+                }
+            }
+        });
+    }
+
+    private void seekInternal(final PlaylistItem item) {
+        throwIfNoSession();
+
+        if (DEBUG) {
+            Log.d(TAG, "seek: item=" + item);
+        }
+        mClient.seek(item.getRemoteItemId(), item.getPosition(), null, new ItemActionCallback() {
+           @Override
+           public void onResult(Bundle data, String sessionId, MediaSessionStatus sessionStatus,
+                   String itemId, MediaItemStatus itemStatus) {
+               logStatus("seek: succeeded", sessionId, sessionStatus, itemId, itemStatus);
+               if (mCallback != null) {
+                   mCallback.onPlaylistChanged();
+               }
+           }
+
+           @Override
+           public void onError(String error, int code, Bundle data) {
+               logError("seek: failed", error, code);
+           }
+        });
+    }
+
+    private void startSession(final PlaylistItem item) {
+        mClient.startSession(null, new SessionActionCallback() {
+            @Override
+            public void onResult(Bundle data, String sessionId, MediaSessionStatus sessionStatus) {
+                logStatus("startSession: succeeded", sessionId, sessionStatus, null, null);
+                enqueueInternal(item);
+            }
+
+            @Override
+            public void onError(String error, int code, Bundle data) {
+                logError("startSession: failed", error, code);
+            }
+        });
+    }
+
+    private void endSession() {
+        mClient.endSession(null, new SessionActionCallback() {
+            @Override
+            public void onResult(Bundle data, String sessionId, MediaSessionStatus sessionStatus) {
+                logStatus("endSession: succeeded", sessionId, sessionStatus, null, null);
+            }
+
+            @Override
+            public void onError(String error, int code, Bundle data) {
+                logError("endSession: failed", error, code);
+            }
+        });
+    }
+
+    private void logStatus(String message,
+            String sessionId, MediaSessionStatus sessionStatus,
+            String itemId, MediaItemStatus itemStatus) {
+        if (DEBUG) {
+            String result = "";
+            if (sessionId != null && sessionStatus != null) {
+                result += "sessionId=" + sessionId + ", sessionStatus=" + sessionStatus;
+            }
+            if (itemId != null & itemStatus != null) {
+                result += (result.isEmpty() ? "" : ", ")
+                        + "itemId=" + itemId + ", itemStatus=" + itemStatus;
+            }
+            Log.d(TAG, message + ": " + result);
+        }
+    }
+
+    private void logError(String message, String error, int code) {
+        Log.d(TAG, message + ": error=" + error + ", code=" + code);
+    }
+
+    private void throwIfNoSession() {
+        if (!mClient.hasSession()) {
+            throw new IllegalStateException("Session is invalid");
+        }
+    }
+
+    private void throwIfQueuingUnsupported() {
+        if (!isQueuingSupported()) {
+            throw new UnsupportedOperationException("Queuing is unsupported");
+        }
+    }
+}
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/media/SampleMediaButtonReceiver.java b/samples/Support7Demos/src/com/example/android/supportv7/media/SampleMediaButtonReceiver.java
new file mode 100644
index 0000000..d356446
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/media/SampleMediaButtonReceiver.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv7.media;
+
+import android.content.Context;
+import android.content.Intent;
+import android.content.BroadcastReceiver;
+import android.view.KeyEvent;
+
+/**
+ * Broadcast receiver for handling ACTION_MEDIA_BUTTON.
+ *
+ * This is needed to create the RemoteControlClient for controlling
+ * remote route volume in lock screen. It routes media key events back
+ * to main app activity SampleMediaRouterActivity.
+ */
+public class SampleMediaButtonReceiver extends BroadcastReceiver {
+    private static final String TAG = "SampleMediaButtonReceiver";
+    private static SampleMediaRouterActivity mActivity;
+
+    public static void setActivity(SampleMediaRouterActivity activity) {
+        mActivity = activity;
+    }
+
+    @Override
+    public void onReceive(Context context, Intent intent) {
+        if (mActivity != null && Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction())) {
+            mActivity.handleMediaKey(
+                    (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT));
+        }
+    }
+}
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/media/SampleMediaRouteProvider.java b/samples/Support7Demos/src/com/example/android/supportv7/media/SampleMediaRouteProvider.java
new file mode 100644
index 0000000..4208f58
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/media/SampleMediaRouteProvider.java
@@ -0,0 +1,617 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv7.media;
+
+import android.app.PendingIntent;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.IntentFilter.MalformedMimeTypeException;
+import android.content.IntentSender;
+import android.content.res.Resources;
+import android.media.AudioManager;
+import android.media.MediaRouter;
+import android.net.Uri;
+import android.os.Bundle;
+import android.support.v7.media.MediaControlIntent;
+import android.support.v7.media.MediaRouteDescriptor;
+import android.support.v7.media.MediaRouteProvider;
+import android.support.v7.media.MediaRouteProviderDescriptor;
+import android.support.v7.media.MediaRouter.ControlRequestCallback;
+import android.support.v7.media.MediaSessionStatus;
+import android.util.Log;
+
+import com.example.android.supportv7.R;
+
+import java.util.ArrayList;
+
+/**
+ * Demonstrates how to create a custom media route provider.
+ *
+ * @see SampleMediaRouteProviderService
+ */
+final class SampleMediaRouteProvider extends MediaRouteProvider {
+    private static final String TAG = "SampleMediaRouteProvider";
+
+    private static final String FIXED_VOLUME_ROUTE_ID = "fixed";
+    private static final String VARIABLE_VOLUME_BASIC_ROUTE_ID = "variable_basic";
+    private static final String VARIABLE_VOLUME_QUEUING_ROUTE_ID = "variable_queuing";
+    private static final String VARIABLE_VOLUME_SESSION_ROUTE_ID = "variable_session";
+
+    private static final int VOLUME_MAX = 10;
+
+    /**
+     * A custom media control intent category for special requests that are
+     * supported by this provider's routes.
+     */
+    public static final String CATEGORY_SAMPLE_ROUTE =
+            "com.example.android.supportv7.media.CATEGORY_SAMPLE_ROUTE";
+
+    /**
+     * A custom media control intent action for special requests that are
+     * supported by this provider's routes.
+     * </p>
+     *
+     * @see #TRACK_INFO_DESC
+     * @see #TRACK_INFO_SNAPSHOT
+     */
+    public static final String ACTION_GET_TRACK_INFO =
+            "com.example.android.supportv7.media.ACTION_GET_TRACK_INFO";
+
+    /**
+     * {@link #ACTION_GET_TRACK_INFO} result data: a string of information about
+     * the currently playing media item
+     */
+    public static final String TRACK_INFO_DESC =
+            "com.example.android.supportv7.media.EXTRA_TRACK_INFO_DESC";
+
+    /**
+     * {@link #ACTION_GET_TRACK_INFO} result data: a bitmap containing a snapshot
+     * of the currently playing media item
+     */
+    public static final String TRACK_INFO_SNAPSHOT =
+            "com.example.android.supportv7.media.EXTRA_TRACK_INFO_SNAPSHOT";
+
+    private static final ArrayList<IntentFilter> CONTROL_FILTERS_BASIC;
+    private static final ArrayList<IntentFilter> CONTROL_FILTERS_QUEUING;
+    private static final ArrayList<IntentFilter> CONTROL_FILTERS_SESSION;
+
+    static {
+        IntentFilter f1 = new IntentFilter();
+        f1.addCategory(CATEGORY_SAMPLE_ROUTE);
+        f1.addAction(ACTION_GET_TRACK_INFO);
+
+        IntentFilter f2 = new IntentFilter();
+        f2.addCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK);
+        f2.addAction(MediaControlIntent.ACTION_PLAY);
+        f2.addDataScheme("http");
+        f2.addDataScheme("https");
+        f2.addDataScheme("rtsp");
+        f2.addDataScheme("file");
+        addDataTypeUnchecked(f2, "video/*");
+
+        IntentFilter f3 = new IntentFilter();
+        f3.addCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK);
+        f3.addAction(MediaControlIntent.ACTION_SEEK);
+        f3.addAction(MediaControlIntent.ACTION_GET_STATUS);
+        f3.addAction(MediaControlIntent.ACTION_PAUSE);
+        f3.addAction(MediaControlIntent.ACTION_RESUME);
+        f3.addAction(MediaControlIntent.ACTION_STOP);
+
+        IntentFilter f4 = new IntentFilter();
+        f4.addCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK);
+        f4.addAction(MediaControlIntent.ACTION_ENQUEUE);
+        f4.addDataScheme("http");
+        f4.addDataScheme("https");
+        f4.addDataScheme("rtsp");
+        f4.addDataScheme("file");
+        addDataTypeUnchecked(f4, "video/*");
+
+        IntentFilter f5 = new IntentFilter();
+        f5.addCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK);
+        f5.addAction(MediaControlIntent.ACTION_REMOVE);
+
+        IntentFilter f6 = new IntentFilter();
+        f6.addCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK);
+        f6.addAction(MediaControlIntent.ACTION_START_SESSION);
+        f6.addAction(MediaControlIntent.ACTION_GET_SESSION_STATUS);
+        f6.addAction(MediaControlIntent.ACTION_END_SESSION);
+
+        CONTROL_FILTERS_BASIC = new ArrayList<>();
+        CONTROL_FILTERS_BASIC.add(f1);
+        CONTROL_FILTERS_BASIC.add(f2);
+        CONTROL_FILTERS_BASIC.add(f3);
+
+        CONTROL_FILTERS_QUEUING = new ArrayList<>(CONTROL_FILTERS_BASIC);
+        CONTROL_FILTERS_QUEUING.add(f4);
+        CONTROL_FILTERS_QUEUING.add(f5);
+
+        CONTROL_FILTERS_SESSION = new ArrayList<>(CONTROL_FILTERS_QUEUING);
+        CONTROL_FILTERS_SESSION.add(f6);
+    }
+
+    private static void addDataTypeUnchecked(IntentFilter filter, String type) {
+        try {
+            filter.addDataType(type);
+        } catch (MalformedMimeTypeException ex) {
+            throw new RuntimeException(ex);
+        }
+    }
+
+    private int mVolume = 5;
+
+    public SampleMediaRouteProvider(Context context) {
+        super(context);
+
+        publishRoutes();
+    }
+
+    @Override
+    public RouteController onCreateRouteController(String routeId) {
+        return new SampleRouteController(routeId);
+    }
+
+    private void publishRoutes() {
+        Resources r = getContext().getResources();
+        Intent settingsIntent = new Intent(Intent.ACTION_MAIN);
+        settingsIntent.setClass(getContext(), SampleMediaRouteSettingsActivity.class);
+        IntentSender is = PendingIntent.getActivity(getContext(), 99, settingsIntent,
+                Intent.FLAG_ACTIVITY_NEW_TASK).getIntentSender();
+
+        MediaRouteDescriptor routeDescriptor1 = new MediaRouteDescriptor.Builder(
+                FIXED_VOLUME_ROUTE_ID,
+                r.getString(R.string.fixed_volume_route_name))
+                .setDescription(r.getString(R.string.sample_route_description))
+                .addControlFilters(CONTROL_FILTERS_BASIC)
+                .setPlaybackStream(AudioManager.STREAM_MUSIC)
+                .setPlaybackType(MediaRouter.RouteInfo.PLAYBACK_TYPE_REMOTE)
+                .setVolumeHandling(MediaRouter.RouteInfo.PLAYBACK_VOLUME_FIXED)
+                .setVolume(VOLUME_MAX)
+                .setCanDisconnect(true)
+                .setSettingsActivity(is)
+                .build();
+
+        MediaRouteDescriptor routeDescriptor2 = new MediaRouteDescriptor.Builder(
+                VARIABLE_VOLUME_BASIC_ROUTE_ID,
+                r.getString(R.string.variable_volume_basic_route_name))
+                .setDescription(r.getString(R.string.sample_route_description))
+                .addControlFilters(CONTROL_FILTERS_BASIC)
+                .setPlaybackStream(AudioManager.STREAM_MUSIC)
+                .setPlaybackType(MediaRouter.RouteInfo.PLAYBACK_TYPE_REMOTE)
+                .setVolumeHandling(MediaRouter.RouteInfo.PLAYBACK_VOLUME_VARIABLE)
+                .setVolumeMax(VOLUME_MAX)
+                .setVolume(mVolume)
+                .setSettingsActivity(is)
+                .build();
+
+        MediaRouteDescriptor routeDescriptor3 = new MediaRouteDescriptor.Builder(
+                VARIABLE_VOLUME_QUEUING_ROUTE_ID,
+                r.getString(R.string.variable_volume_queuing_route_name))
+                .setDescription(r.getString(R.string.sample_route_description))
+                .addControlFilters(CONTROL_FILTERS_QUEUING)
+                .setPlaybackStream(AudioManager.STREAM_MUSIC)
+                .setPlaybackType(MediaRouter.RouteInfo.PLAYBACK_TYPE_REMOTE)
+                .setVolumeHandling(MediaRouter.RouteInfo.PLAYBACK_VOLUME_VARIABLE)
+                .setVolumeMax(VOLUME_MAX)
+                .setVolume(mVolume)
+                .setCanDisconnect(true)
+                .build();
+
+        Uri iconUri = Uri.parse("android.resource://com.example.android.supportv7/"
+                + R.drawable.ic_android);
+        MediaRouteDescriptor routeDescriptor4 = new MediaRouteDescriptor.Builder(
+                VARIABLE_VOLUME_SESSION_ROUTE_ID,
+                r.getString(R.string.variable_volume_session_route_name))
+                .setDescription(r.getString(R.string.sample_route_description))
+                .addControlFilters(CONTROL_FILTERS_SESSION)
+                .setPlaybackStream(AudioManager.STREAM_MUSIC)
+                .setPlaybackType(MediaRouter.RouteInfo.PLAYBACK_TYPE_REMOTE)
+                .setVolumeHandling(MediaRouter.RouteInfo.PLAYBACK_VOLUME_VARIABLE)
+                .setVolumeMax(VOLUME_MAX)
+                .setVolume(mVolume)
+                .setIconUri(iconUri)
+                .build();
+
+        MediaRouteProviderDescriptor providerDescriptor = new MediaRouteProviderDescriptor.Builder()
+                .addRoute(routeDescriptor1)
+                .addRoute(routeDescriptor2)
+                .addRoute(routeDescriptor3)
+                .addRoute(routeDescriptor4)
+                .build();
+        setDescriptor(providerDescriptor);
+    }
+
+    private final class SampleRouteController extends MediaRouteProvider.RouteController {
+        private final String mRouteId;
+        private final SessionManager mSessionManager = new SessionManager("mrp");
+        private final Player mPlayer;
+        private PendingIntent mSessionReceiver;
+
+        public SampleRouteController(String routeId) {
+            mRouteId = routeId;
+            mPlayer = Player.create(getContext(), null, null);
+            mSessionManager.setPlayer(mPlayer);
+            mSessionManager.setCallback(new SessionManager.Callback() {
+                @Override
+                public void onStatusChanged() {
+                }
+
+                @Override
+                public void onItemChanged(PlaylistItem item) {
+                    handleStatusChange(item);
+                }
+            });
+            setVolumeInternal(mVolume);
+            Log.d(TAG, mRouteId + ": Controller created");
+        }
+
+        @Override
+        public void onRelease() {
+            Log.d(TAG, mRouteId + ": Controller released");
+            mPlayer.release();
+        }
+
+        @Override
+        public void onSelect() {
+            Log.d(TAG, mRouteId + ": Selected");
+            mPlayer.connect(null);
+        }
+
+        @Override
+        public void onUnselect() {
+            Log.d(TAG, mRouteId + ": Unselected");
+            mPlayer.release();
+        }
+
+        @Override
+        public void onSetVolume(int volume) {
+            Log.d(TAG, mRouteId + ": Set volume to " + volume);
+            if (!mRouteId.equals(FIXED_VOLUME_ROUTE_ID)) {
+                setVolumeInternal(volume);
+            }
+        }
+
+        @Override
+        public void onUpdateVolume(int delta) {
+            Log.d(TAG, mRouteId + ": Update volume by " + delta);
+            if (!mRouteId.equals(FIXED_VOLUME_ROUTE_ID)) {
+                setVolumeInternal(mVolume + delta);
+            }
+        }
+
+        @Override
+        public boolean onControlRequest(Intent intent, ControlRequestCallback callback) {
+            Log.d(TAG, mRouteId + ": Received control request " + intent);
+            String action = intent.getAction();
+            if (intent.hasCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK)) {
+                boolean success = false;
+                if (action.equals(MediaControlIntent.ACTION_PLAY)) {
+                    success = handlePlay(intent, callback);
+                } else if (action.equals(MediaControlIntent.ACTION_ENQUEUE)) {
+                    success = handleEnqueue(intent, callback);
+                } else if (action.equals(MediaControlIntent.ACTION_REMOVE)) {
+                    success = handleRemove(intent, callback);
+                } else if (action.equals(MediaControlIntent.ACTION_SEEK)) {
+                    success = handleSeek(intent, callback);
+                } else if (action.equals(MediaControlIntent.ACTION_GET_STATUS)) {
+                    success = handleGetStatus(intent, callback);
+                } else if (action.equals(MediaControlIntent.ACTION_PAUSE)) {
+                    success = handlePause(intent, callback);
+                } else if (action.equals(MediaControlIntent.ACTION_RESUME)) {
+                    success = handleResume(intent, callback);
+                } else if (action.equals(MediaControlIntent.ACTION_STOP)) {
+                    success = handleStop(intent, callback);
+                } else if (action.equals(MediaControlIntent.ACTION_START_SESSION)) {
+                    success = handleStartSession(intent, callback);
+                } else if (action.equals(MediaControlIntent.ACTION_GET_SESSION_STATUS)) {
+                    success = handleGetSessionStatus(intent, callback);
+                } else if (action.equals(MediaControlIntent.ACTION_END_SESSION)) {
+                    success = handleEndSession(intent, callback);
+                }
+                Log.d(TAG, mSessionManager.toString());
+                return success;
+            }
+
+            if (action.equals(ACTION_GET_TRACK_INFO)
+                    && intent.hasCategory(CATEGORY_SAMPLE_ROUTE)) {
+                Bundle data = new Bundle();
+                PlaylistItem item = mSessionManager.getCurrentItem();
+                if (item != null) {
+                    data.putString(TRACK_INFO_DESC, item.toString());
+                    data.putParcelable(TRACK_INFO_SNAPSHOT, mPlayer.getSnapshot());
+                }
+                if (callback != null) {
+                    callback.onResult(data);
+                }
+                return true;
+            }
+            return false;
+        }
+
+        private void setVolumeInternal(int volume) {
+            if (volume >= 0 && volume <= VOLUME_MAX) {
+                mVolume = volume;
+                Log.d(TAG, mRouteId + ": New volume is " + mVolume);
+                AudioManager audioManager =
+                        (AudioManager)getContext().getSystemService(Context.AUDIO_SERVICE);
+                audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, volume, 0);
+                publishRoutes();
+            }
+        }
+
+        private boolean handlePlay(Intent intent, ControlRequestCallback callback) {
+            String sid = intent.getStringExtra(MediaControlIntent.EXTRA_SESSION_ID);
+            if (sid != null && !sid.equals(mSessionManager.getSessionId())) {
+                Log.d(TAG, "handlePlay fails because of bad sid="+sid);
+                return false;
+            }
+            if (mSessionManager.hasSession()) {
+                mSessionManager.stop();
+            }
+            return handleEnqueue(intent, callback);
+        }
+
+        private boolean handleEnqueue(Intent intent, ControlRequestCallback callback) {
+            String sid = intent.getStringExtra(MediaControlIntent.EXTRA_SESSION_ID);
+            if (sid != null && !sid.equals(mSessionManager.getSessionId())) {
+                Log.d(TAG, "handleEnqueue fails because of bad sid="+sid);
+                return false;
+            }
+
+            Uri uri = intent.getData();
+            if (uri == null) {
+                Log.d(TAG, "handleEnqueue fails because of bad uri="+uri);
+                return false;
+            }
+
+            boolean enqueue = intent.getAction().equals(MediaControlIntent.ACTION_ENQUEUE);
+            String mime = intent.getType();
+            long pos = intent.getLongExtra(MediaControlIntent.EXTRA_ITEM_CONTENT_POSITION, 0);
+            Bundle metadata = intent.getBundleExtra(MediaControlIntent.EXTRA_ITEM_METADATA);
+            Bundle headers = intent.getBundleExtra(MediaControlIntent.EXTRA_ITEM_HTTP_HEADERS);
+            PendingIntent receiver = (PendingIntent)intent.getParcelableExtra(
+                    MediaControlIntent.EXTRA_ITEM_STATUS_UPDATE_RECEIVER);
+
+            Log.d(TAG, mRouteId + ": Received " + (enqueue?"enqueue":"play") + " request"
+                    + ", uri=" + uri
+                    + ", mime=" + mime
+                    + ", sid=" + sid
+                    + ", pos=" + pos
+                    + ", metadata=" + metadata
+                    + ", headers=" + headers
+                    + ", receiver=" + receiver);
+            PlaylistItem item = mSessionManager.add(uri, mime, receiver);
+            if (callback != null) {
+                if (item != null) {
+                    Bundle result = new Bundle();
+                    result.putString(MediaControlIntent.EXTRA_SESSION_ID, item.getSessionId());
+                    result.putString(MediaControlIntent.EXTRA_ITEM_ID, item.getItemId());
+                    result.putBundle(MediaControlIntent.EXTRA_ITEM_STATUS,
+                            item.getStatus().asBundle());
+                    callback.onResult(result);
+                } else {
+                    callback.onError("Failed to open " + uri.toString(), null);
+                }
+            }
+            return true;
+        }
+
+        private boolean handleRemove(Intent intent, ControlRequestCallback callback) {
+            String sid = intent.getStringExtra(MediaControlIntent.EXTRA_SESSION_ID);
+            if (sid == null || !sid.equals(mSessionManager.getSessionId())) {
+                return false;
+            }
+
+            String iid = intent.getStringExtra(MediaControlIntent.EXTRA_ITEM_ID);
+            PlaylistItem item = mSessionManager.remove(iid);
+            if (callback != null) {
+                if (item != null) {
+                    Bundle result = new Bundle();
+                    result.putBundle(MediaControlIntent.EXTRA_ITEM_STATUS,
+                            item.getStatus().asBundle());
+                    callback.onResult(result);
+                } else {
+                    callback.onError("Failed to remove" +
+                            ", sid=" + sid + ", iid=" + iid, null);
+                }
+            }
+            return (item != null);
+        }
+
+        private boolean handleSeek(Intent intent, ControlRequestCallback callback) {
+            String sid = intent.getStringExtra(MediaControlIntent.EXTRA_SESSION_ID);
+            if (sid == null || !sid.equals(mSessionManager.getSessionId())) {
+                return false;
+            }
+
+            String iid = intent.getStringExtra(MediaControlIntent.EXTRA_ITEM_ID);
+            long pos = intent.getLongExtra(MediaControlIntent.EXTRA_ITEM_CONTENT_POSITION, 0);
+            Log.d(TAG, mRouteId + ": Received seek request, pos=" + pos);
+            PlaylistItem item = mSessionManager.seek(iid, pos);
+            if (callback != null) {
+                if (item != null) {
+                    Bundle result = new Bundle();
+                    result.putBundle(MediaControlIntent.EXTRA_ITEM_STATUS,
+                            item.getStatus().asBundle());
+                    callback.onResult(result);
+                } else {
+                    callback.onError("Failed to seek" +
+                            ", sid=" + sid + ", iid=" + iid + ", pos=" + pos, null);
+                }
+            }
+            return (item != null);
+        }
+
+        private boolean handleGetStatus(Intent intent, ControlRequestCallback callback) {
+            String sid = intent.getStringExtra(MediaControlIntent.EXTRA_SESSION_ID);
+            String iid = intent.getStringExtra(MediaControlIntent.EXTRA_ITEM_ID);
+            Log.d(TAG, mRouteId + ": Received getStatus request, sid=" + sid + ", iid=" + iid);
+            PlaylistItem item = mSessionManager.getStatus(iid);
+            if (callback != null) {
+                if (item != null) {
+                    Bundle result = new Bundle();
+                    result.putBundle(MediaControlIntent.EXTRA_ITEM_STATUS,
+                            item.getStatus().asBundle());
+                    callback.onResult(result);
+                } else {
+                    callback.onError("Failed to get status" +
+                            ", sid=" + sid + ", iid=" + iid, null);
+                }
+            }
+            return (item != null);
+        }
+
+        private boolean handlePause(Intent intent, ControlRequestCallback callback) {
+            String sid = intent.getStringExtra(MediaControlIntent.EXTRA_SESSION_ID);
+            boolean success = (sid != null) && sid.equals(mSessionManager.getSessionId());
+            mSessionManager.pause();
+            if (callback != null) {
+                if (success) {
+                    callback.onResult(new Bundle());
+                    handleSessionStatusChange(sid);
+                } else {
+                    callback.onError("Failed to pause, sid=" + sid, null);
+                }
+            }
+            return success;
+        }
+
+        private boolean handleResume(Intent intent, ControlRequestCallback callback) {
+            String sid = intent.getStringExtra(MediaControlIntent.EXTRA_SESSION_ID);
+            boolean success = (sid != null) && sid.equals(mSessionManager.getSessionId());
+            mSessionManager.resume();
+            if (callback != null) {
+                if (success) {
+                    callback.onResult(new Bundle());
+                    handleSessionStatusChange(sid);
+                } else {
+                    callback.onError("Failed to resume, sid=" + sid, null);
+                }
+            }
+            return success;
+        }
+
+        private boolean handleStop(Intent intent, ControlRequestCallback callback) {
+            String sid = intent.getStringExtra(MediaControlIntent.EXTRA_SESSION_ID);
+            boolean success = (sid != null) && sid.equals(mSessionManager.getSessionId());
+            mSessionManager.stop();
+            if (callback != null) {
+                if (success) {
+                    callback.onResult(new Bundle());
+                    handleSessionStatusChange(sid);
+                } else {
+                    callback.onError("Failed to stop, sid=" + sid, null);
+                }
+            }
+            return success;
+        }
+
+        private boolean handleStartSession(Intent intent, ControlRequestCallback callback) {
+            String sid = mSessionManager.startSession();
+            Log.d(TAG, "StartSession returns sessionId "+sid);
+            if (callback != null) {
+                if (sid != null) {
+                    Bundle result = new Bundle();
+                    result.putString(MediaControlIntent.EXTRA_SESSION_ID, sid);
+                    result.putBundle(MediaControlIntent.EXTRA_SESSION_STATUS,
+                            mSessionManager.getSessionStatus(sid).asBundle());
+                    callback.onResult(result);
+                    mSessionReceiver = (PendingIntent)intent.getParcelableExtra(
+                            MediaControlIntent.EXTRA_SESSION_STATUS_UPDATE_RECEIVER);
+                    handleSessionStatusChange(sid);
+                } else {
+                    callback.onError("Failed to start session.", null);
+                }
+            }
+            return (sid != null);
+        }
+
+        private boolean handleGetSessionStatus(Intent intent, ControlRequestCallback callback) {
+            String sid = intent.getStringExtra(MediaControlIntent.EXTRA_SESSION_ID);
+
+            MediaSessionStatus sessionStatus = mSessionManager.getSessionStatus(sid);
+            if (callback != null) {
+                if (sessionStatus != null) {
+                    Bundle result = new Bundle();
+                    result.putBundle(MediaControlIntent.EXTRA_SESSION_STATUS,
+                            mSessionManager.getSessionStatus(sid).asBundle());
+                    callback.onResult(result);
+                } else {
+                    callback.onError("Failed to get session status, sid=" + sid, null);
+                }
+            }
+            return (sessionStatus != null);
+        }
+
+        private boolean handleEndSession(Intent intent, ControlRequestCallback callback) {
+            String sid = intent.getStringExtra(MediaControlIntent.EXTRA_SESSION_ID);
+            boolean success = (sid != null) && sid.equals(mSessionManager.getSessionId())
+                    && mSessionManager.endSession();
+            if (callback != null) {
+                if (success) {
+                    Bundle result = new Bundle();
+                    MediaSessionStatus sessionStatus = new MediaSessionStatus.Builder(
+                            MediaSessionStatus.SESSION_STATE_ENDED).build();
+                    result.putBundle(MediaControlIntent.EXTRA_SESSION_STATUS, sessionStatus.asBundle());
+                    callback.onResult(result);
+                    handleSessionStatusChange(sid);
+                    mSessionReceiver = null;
+                } else {
+                    callback.onError("Failed to end session, sid=" + sid, null);
+                }
+            }
+            return success;
+        }
+
+        private void handleStatusChange(PlaylistItem item) {
+            if (item == null) {
+                item = mSessionManager.getCurrentItem();
+            }
+            if (item != null) {
+                PendingIntent receiver = item.getUpdateReceiver();
+                if (receiver != null) {
+                    Intent intent = new Intent();
+                    intent.putExtra(MediaControlIntent.EXTRA_SESSION_ID, item.getSessionId());
+                    intent.putExtra(MediaControlIntent.EXTRA_ITEM_ID, item.getItemId());
+                    intent.putExtra(MediaControlIntent.EXTRA_ITEM_STATUS,
+                            item.getStatus().asBundle());
+                    try {
+                        receiver.send(getContext(), 0, intent);
+                        Log.d(TAG, mRouteId + ": Sending status update from provider");
+                    } catch (PendingIntent.CanceledException e) {
+                        Log.d(TAG, mRouteId + ": Failed to send status update!");
+                    }
+                }
+            }
+        }
+
+        private void handleSessionStatusChange(String sid) {
+            if (mSessionReceiver != null) {
+                Intent intent = new Intent();
+                intent.putExtra(MediaControlIntent.EXTRA_SESSION_ID, sid);
+                intent.putExtra(MediaControlIntent.EXTRA_SESSION_STATUS,
+                        mSessionManager.getSessionStatus(sid).asBundle());
+                try {
+                    mSessionReceiver.send(getContext(), 0, intent);
+                    Log.d(TAG, mRouteId + ": Sending session status update from provider");
+                } catch (PendingIntent.CanceledException e) {
+                    Log.d(TAG, mRouteId + ": Failed to send session status update!");
+                }
+            }
+        }
+    }
+}
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/media/SampleMediaRouteProviderService.java b/samples/Support7Demos/src/com/example/android/supportv7/media/SampleMediaRouteProviderService.java
new file mode 100644
index 0000000..bb0aa07
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/media/SampleMediaRouteProviderService.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv7.media;
+
+import android.support.v7.media.MediaRouteProvider;
+import android.support.v7.media.MediaRouteProviderService;
+
+/**
+ * Demonstrates how to register a custom media route provider service
+ * using the support library.
+ *
+ * @see SampleMediaRouteProvider
+ */
+public class SampleMediaRouteProviderService extends MediaRouteProviderService {
+    @Override
+    public MediaRouteProvider onCreateMediaRouteProvider() {
+        return new SampleMediaRouteProvider(this);
+    }
+}
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/media/SampleMediaRouteSettingsActivity.java b/samples/Support7Demos/src/com/example/android/supportv7/media/SampleMediaRouteSettingsActivity.java
new file mode 100644
index 0000000..5f1cfd6
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/media/SampleMediaRouteSettingsActivity.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv7.media;
+
+import android.support.v7.app.AppCompatActivity;
+
+/**
+ * This activity is a dummy settings activity for the
+ * {@link SampleMediaRouteProvider}.
+ */
+public class SampleMediaRouteSettingsActivity extends AppCompatActivity {
+
+}
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/media/SampleMediaRouterActivity.java b/samples/Support7Demos/src/com/example/android/supportv7/media/SampleMediaRouterActivity.java
new file mode 100644
index 0000000..be66cca
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/media/SampleMediaRouterActivity.java
@@ -0,0 +1,734 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv7.media;
+
+import android.app.PendingIntent;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.media.AudioManager;
+import android.media.AudioManager.OnAudioFocusChangeListener;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.Environment;
+import android.os.Handler;
+import android.os.SystemClock;
+import android.support.v4.media.session.MediaSessionCompat;
+import android.support.v4.view.MenuItemCompat;
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.app.MediaRouteActionProvider;
+import android.support.v7.app.MediaRouteControllerDialog;
+import android.support.v7.app.MediaRouteControllerDialogFragment;
+import android.support.v7.app.MediaRouteDialogFactory;
+import android.support.v7.media.MediaControlIntent;
+import android.support.v7.media.MediaItemStatus;
+import android.support.v7.media.MediaRouteSelector;
+import android.support.v7.media.MediaRouter;
+import android.support.v7.media.MediaRouter.ProviderInfo;
+import android.support.v7.media.MediaRouter.RouteInfo;
+import android.util.Log;
+import android.view.KeyEvent;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.view.ViewGroup;
+import android.widget.AdapterView;
+import android.widget.AdapterView.OnItemClickListener;
+import android.widget.ArrayAdapter;
+import android.widget.CheckBox;
+import android.widget.ImageButton;
+import android.widget.ListView;
+import android.widget.SeekBar;
+import android.widget.SeekBar.OnSeekBarChangeListener;
+import android.widget.TabHost;
+import android.widget.TabHost.OnTabChangeListener;
+import android.widget.TabHost.TabSpec;
+import android.widget.TextView;
+
+import com.example.android.supportv7.R;
+
+import java.io.File;
+
+/**
+ * <h3>Media Router Support Activity</h3>
+ *
+ * <p>
+ * This demonstrates how to use the {@link MediaRouter} API to build an
+ * application that allows the user to send content to various rendering
+ * targets.
+ * </p>
+ */
+public class SampleMediaRouterActivity extends AppCompatActivity {
+    private static final String TAG = "SampleMediaRouterActivity";
+    private static final String DISCOVERY_FRAGMENT_TAG = "DiscoveryFragment";
+    private static final boolean ENABLE_DEFAULT_CONTROL_CHECK_BOX = false;
+
+    private MediaRouter mMediaRouter;
+    private MediaRouteSelector mSelector;
+    private LibraryAdapter mLibraryItems;
+    private PlaylistAdapter mPlayListItems;
+    private TextView mInfoTextView;
+    private ListView mLibraryView;
+    private ListView mPlayListView;
+    private CheckBox mUseDefaultControlCheckBox;
+    private ImageButton mPauseResumeButton;
+    private ImageButton mStopButton;
+    private SeekBar mSeekBar;
+    private boolean mNeedResume;
+    private boolean mSeeking;
+
+    private final Handler mHandler = new Handler();
+    private final Runnable mUpdateSeekRunnable = new Runnable() {
+        @Override
+        public void run() {
+            updateProgress();
+            // update Ui every 1 second
+            mHandler.postDelayed(this, 1000);
+        }
+    };
+
+    private final SessionManager mSessionManager = new SessionManager("app");
+    private Player mPlayer;
+
+    private final MediaRouter.Callback mMediaRouterCB = new MediaRouter.Callback() {
+        // Return a custom callback that will simply log all of the route events
+        // for demonstration purposes.
+        @Override
+        public void onRouteAdded(MediaRouter router, RouteInfo route) {
+            Log.d(TAG, "onRouteAdded: route=" + route);
+        }
+
+        @Override
+        public void onRouteChanged(MediaRouter router, RouteInfo route) {
+            Log.d(TAG, "onRouteChanged: route=" + route);
+        }
+
+        @Override
+        public void onRouteRemoved(MediaRouter router, RouteInfo route) {
+            Log.d(TAG, "onRouteRemoved: route=" + route);
+        }
+
+        @Override
+        public void onRouteSelected(MediaRouter router, RouteInfo route) {
+            Log.d(TAG, "onRouteSelected: route=" + route);
+
+            mPlayer = Player.create(SampleMediaRouterActivity.this, route, mMediaSession);
+            mPlayer.updatePresentation();
+            mSessionManager.setPlayer(mPlayer);
+            mSessionManager.unsuspend();
+
+            updateUi();
+        }
+
+        @Override
+        public void onRouteUnselected(MediaRouter router, RouteInfo route) {
+            Log.d(TAG, "onRouteUnselected: route=" + route);
+            mMediaSession.setActive(false);
+
+            PlaylistItem item = getCheckedPlaylistItem();
+            if (item != null) {
+                long pos = item.getPosition() + (mSessionManager.isPaused() ?
+                        0 : (SystemClock.elapsedRealtime() - item.getTimestamp()));
+                mSessionManager.suspend(pos);
+            }
+            mPlayer.updatePresentation();
+            mPlayer.release();
+        }
+
+        @Override
+        public void onRouteVolumeChanged(MediaRouter router, RouteInfo route) {
+            Log.d(TAG, "onRouteVolumeChanged: route=" + route);
+        }
+
+        @Override
+        public void onRoutePresentationDisplayChanged(
+                MediaRouter router, RouteInfo route) {
+            Log.d(TAG, "onRoutePresentationDisplayChanged: route=" + route);
+            mPlayer.updatePresentation();
+        }
+
+        @Override
+        public void onProviderAdded(MediaRouter router, ProviderInfo provider) {
+            Log.d(TAG, "onRouteProviderAdded: provider=" + provider);
+        }
+
+        @Override
+        public void onProviderRemoved(MediaRouter router, ProviderInfo provider) {
+            Log.d(TAG, "onRouteProviderRemoved: provider=" + provider);
+        }
+
+        @Override
+        public void onProviderChanged(MediaRouter router, ProviderInfo provider) {
+            Log.d(TAG, "onRouteProviderChanged: provider=" + provider);
+        }
+    };
+
+    private MediaSessionCompat mMediaSession;
+    private ComponentName mEventReceiver;
+    private AudioManager mAudioManager;
+    private PendingIntent mMediaPendingIntent;
+    private final OnAudioFocusChangeListener mAfChangeListener =
+            new OnAudioFocusChangeListener() {
+        @Override
+        public void onAudioFocusChange(int focusChange) {
+            if (focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT) {
+                Log.d(TAG, "onAudioFocusChange: LOSS_TRANSIENT");
+            } else if (focusChange == AudioManager.AUDIOFOCUS_GAIN) {
+                Log.d(TAG, "onAudioFocusChange: AUDIOFOCUS_GAIN");
+            } else if (focusChange == AudioManager.AUDIOFOCUS_LOSS) {
+                Log.d(TAG, "onAudioFocusChange: AUDIOFOCUS_LOSS");
+            }
+        }
+    };
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        // Be sure to call the super class.
+        super.onCreate(savedInstanceState);
+
+        // Get the media router service.
+        mMediaRouter = MediaRouter.getInstance(this);
+
+        // Create a route selector for the type of routes that we care about.
+        mSelector = new MediaRouteSelector.Builder()
+                .addControlCategory(MediaControlIntent.CATEGORY_LIVE_AUDIO)
+                .addControlCategory(MediaControlIntent.CATEGORY_LIVE_VIDEO)
+                .addControlCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK)
+                .addControlCategory(SampleMediaRouteProvider.CATEGORY_SAMPLE_ROUTE)
+                .build();
+        mMediaRouter.addCallback(mSelector, mMediaRouterCB);
+
+        // Populate an array adapter with streaming media items.
+        String[] mediaNames = getResources().getStringArray(R.array.media_names);
+        String[] mediaUris = getResources().getStringArray(R.array.media_uris);
+        mLibraryItems = new LibraryAdapter();
+        for (int i = 0; i < mediaNames.length; i++) {
+            mLibraryItems.add(new MediaItem(
+                    "[streaming] "+mediaNames[i], Uri.parse(mediaUris[i]), "video/mp4"));
+        }
+
+        // Scan local external storage directory for media files.
+        File externalDir = Environment.getExternalStorageDirectory();
+        if (externalDir != null) {
+            File list[] = externalDir.listFiles();
+            if (list != null) {
+                for (int i = 0; i < list.length; i++) {
+                    String filename = list[i].getName();
+                    if (filename.matches(".*\\.(m4v|mp4)")) {
+                        mLibraryItems.add(new MediaItem("[local] " + filename,
+                                Uri.fromFile(list[i]), "video/mp4"));
+                    }
+                }
+            }
+        }
+
+        mPlayListItems = new PlaylistAdapter();
+
+        // Initialize the layout.
+        setContentView(R.layout.sample_media_router);
+
+        TabHost tabHost=(TabHost)findViewById(R.id.tabHost);
+        tabHost.setup();
+        String tabName = getResources().getString(R.string.library_tab_text);
+        TabSpec spec1=tabHost.newTabSpec(tabName);
+        spec1.setContent(R.id.tab1);
+        spec1.setIndicator(tabName);
+
+        tabName = getResources().getString(R.string.playlist_tab_text);
+        TabSpec spec2=tabHost.newTabSpec(tabName);
+        spec2.setIndicator(tabName);
+        spec2.setContent(R.id.tab2);
+
+        tabName = getResources().getString(R.string.info_tab_text);
+        TabSpec spec3=tabHost.newTabSpec(tabName);
+        spec3.setIndicator(tabName);
+        spec3.setContent(R.id.tab3);
+
+        tabHost.addTab(spec1);
+        tabHost.addTab(spec2);
+        tabHost.addTab(spec3);
+        tabHost.setOnTabChangedListener(new OnTabChangeListener() {
+            @Override
+            public void onTabChanged(String arg0) {
+                updateUi();
+            }
+        });
+
+        mLibraryView = (ListView) findViewById(R.id.media);
+        mLibraryView.setAdapter(mLibraryItems);
+        mLibraryView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
+        mLibraryView.setOnItemClickListener(new OnItemClickListener() {
+            @Override
+            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+                updateButtons();
+            }
+        });
+
+        mPlayListView = (ListView) findViewById(R.id.playlist);
+        mPlayListView.setAdapter(mPlayListItems);
+        mPlayListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
+        mPlayListView.setOnItemClickListener(new OnItemClickListener() {
+            @Override
+            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+                updateButtons();
+            }
+        });
+
+        mInfoTextView = (TextView) findViewById(R.id.info);
+
+        mUseDefaultControlCheckBox = (CheckBox) findViewById(R.id.custom_control_view_checkbox);
+        if (ENABLE_DEFAULT_CONTROL_CHECK_BOX) {
+            mUseDefaultControlCheckBox.setVisibility(View.VISIBLE);
+        }
+        mPauseResumeButton = (ImageButton)findViewById(R.id.pause_resume_button);
+        mPauseResumeButton.setOnClickListener(new OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                if (mSessionManager.isPaused()) {
+                    mSessionManager.resume();
+                } else {
+                    mSessionManager.pause();
+                }
+            }
+        });
+
+        mStopButton = (ImageButton)findViewById(R.id.stop_button);
+        mStopButton.setOnClickListener(new OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                mSessionManager.stop();
+            }
+        });
+
+        mSeekBar = (SeekBar) findViewById(R.id.seekbar);
+        mSeekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
+            @Override
+            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
+                PlaylistItem item = getCheckedPlaylistItem();
+                if (fromUser && item != null && item.getDuration() > 0) {
+                    long pos = progress * item.getDuration() / 100;
+                    mSessionManager.seek(item.getItemId(), pos);
+                    item.setPosition(pos);
+                    item.setTimestamp(SystemClock.elapsedRealtime());
+                }
+            }
+            @Override
+            public void onStartTrackingTouch(SeekBar seekBar) {
+                mSeeking = true;
+            }
+            @Override
+            public void onStopTrackingTouch(SeekBar seekBar) {
+                mSeeking = false;
+                updateUi();
+            }
+        });
+
+        // Schedule Ui update
+        mHandler.postDelayed(mUpdateSeekRunnable, 1000);
+
+        // Build the PendingIntent for the remote control client
+        mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
+        mEventReceiver = new ComponentName(getPackageName(),
+                SampleMediaButtonReceiver.class.getName());
+        Intent mediaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON);
+        mediaButtonIntent.setComponent(mEventReceiver);
+        mMediaPendingIntent = PendingIntent.getBroadcast(this, 0, mediaButtonIntent, 0);
+
+        // Create and register the remote control client
+        createMediaSession();
+        mMediaRouter.setMediaSessionCompat(mMediaSession);
+
+        // Set up playback manager and player
+        mPlayer = Player.create(SampleMediaRouterActivity.this,
+                mMediaRouter.getSelectedRoute(), mMediaSession);
+
+        mSessionManager.setPlayer(mPlayer);
+        mSessionManager.setCallback(new SessionManager.Callback() {
+            @Override
+            public void onStatusChanged() {
+                updateUi();
+            }
+
+            @Override
+            public void onItemChanged(PlaylistItem item) {
+            }
+        });
+
+        updateUi();
+    }
+
+    private void createMediaSession() {
+        // Create the MediaSession
+        mMediaSession = new MediaSessionCompat(this, "SampleMediaRouter", mEventReceiver,
+                mMediaPendingIntent);
+        mMediaSession.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS
+                | MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS);
+        mMediaSession.setCallback(new MediaSessionCompat.Callback() {
+            @Override
+            public boolean onMediaButtonEvent(Intent mediaButtonEvent) {
+                if (mediaButtonEvent != null) {
+                    return handleMediaKey(
+                            (KeyEvent) mediaButtonEvent.getParcelableExtra(Intent.EXTRA_KEY_EVENT));
+                }
+                return super.onMediaButtonEvent(mediaButtonEvent);
+            }
+
+            @Override
+            public void onPlay() {
+                mSessionManager.resume();
+            }
+
+            @Override
+            public void onPause() {
+                mSessionManager.pause();
+            }
+        });
+
+        SampleMediaButtonReceiver.setActivity(SampleMediaRouterActivity.this);
+    }
+
+    public boolean handleMediaKey(KeyEvent event) {
+        if (event != null && event.getAction() == KeyEvent.ACTION_DOWN
+                && event.getRepeatCount() == 0) {
+            switch (event.getKeyCode()) {
+                case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE:
+                case KeyEvent.KEYCODE_HEADSETHOOK:
+                {
+                    Log.d(TAG, "Received Play/Pause event from RemoteControlClient");
+                    if (mSessionManager.isPaused()) {
+                        mSessionManager.resume();
+                    } else {
+                        mSessionManager.pause();
+                    }
+                    return true;
+                }
+                case KeyEvent.KEYCODE_MEDIA_PLAY:
+                {
+                    Log.d(TAG, "Received Play event from RemoteControlClient");
+                    if (mSessionManager.isPaused()) {
+                        mSessionManager.resume();
+                    }
+                    return true;
+                }
+                case KeyEvent.KEYCODE_MEDIA_PAUSE:
+                {
+                    Log.d(TAG, "Received Pause event from RemoteControlClient");
+                    if (!mSessionManager.isPaused()) {
+                        mSessionManager.pause();
+                    }
+                    return true;
+                }
+                case KeyEvent.KEYCODE_MEDIA_STOP:
+                {
+                    Log.d(TAG, "Received Stop event from RemoteControlClient");
+                    mSessionManager.stop();
+                    return true;
+                }
+                default:
+                    break;
+            }
+        }
+        return false;
+    }
+
+    @Override
+    public boolean onKeyDown(int keyCode, KeyEvent event) {
+        return handleMediaKey(event) || super.onKeyDown(keyCode, event);
+    }
+
+    @Override
+    public boolean onKeyUp(int keyCode, KeyEvent event) {
+        return handleMediaKey(event) || super.onKeyUp(keyCode, event);
+    }
+
+    @Override
+    public void onStart() {
+        // Be sure to call the super class.
+        super.onStart();
+    }
+
+    @Override
+    public void onPause() {
+        // pause media player for local playback case only
+        if (!mPlayer.isRemotePlayback() && !mSessionManager.isPaused()) {
+            mNeedResume = true;
+            mSessionManager.pause();
+        }
+        super.onPause();
+    }
+
+    @Override
+    public void onResume() {
+        // resume media player for local playback case only
+        if (!mPlayer.isRemotePlayback() && mNeedResume) {
+            mSessionManager.resume();
+            mNeedResume = false;
+        }
+        super.onResume();
+    }
+
+    @Override
+    public void onDestroy() {
+        mSessionManager.stop();
+        mPlayer.release();
+        mMediaSession.release();
+        super.onDestroy();
+    }
+
+    @Override
+    public boolean onCreateOptionsMenu(Menu menu) {
+        // Be sure to call the super class.
+        super.onCreateOptionsMenu(menu);
+
+        // Inflate the menu and configure the media router action provider.
+        getMenuInflater().inflate(R.menu.sample_media_router_menu, menu);
+
+        MenuItem mediaRouteMenuItem = menu.findItem(R.id.media_route_menu_item);
+        MyMediaRouteActionProvider mediaRouteActionProvider =
+                (MyMediaRouteActionProvider)MenuItemCompat.getActionProvider(mediaRouteMenuItem);
+        mediaRouteActionProvider.setRouteSelector(mSelector);
+        mediaRouteActionProvider.setDialogFactory(new MediaRouteDialogFactory() {
+            @Override
+            public MediaRouteControllerDialogFragment onCreateControllerDialogFragment() {
+                return new ControllerDialogFragment(mPlayer, mUseDefaultControlCheckBox);
+            }
+        });
+
+        // Return true to show the menu.
+        return true;
+    }
+
+    private void updateProgress() {
+        // Estimate content position from last status time and elapsed time.
+        // (Note this might be slightly out of sync with remote side, however
+        // it avoids frequent polling the MRP.)
+        int progress = 0;
+        PlaylistItem item = getCheckedPlaylistItem();
+        if (item != null) {
+            int state = item.getState();
+            long duration = item.getDuration();
+            if (duration <= 0) {
+                if (state == MediaItemStatus.PLAYBACK_STATE_PLAYING
+                        || state == MediaItemStatus.PLAYBACK_STATE_PAUSED) {
+                    mSessionManager.updateStatus();
+                }
+            } else {
+                long position = item.getPosition();
+                long timeDelta = mSessionManager.isPaused() ? 0 :
+                        (SystemClock.elapsedRealtime() - item.getTimestamp());
+                progress = (int)(100.0 * (position + timeDelta) / duration);
+            }
+        }
+        mSeekBar.setProgress(progress);
+    }
+
+    private void updateUi() {
+        updatePlaylist();
+        updateRouteDescription();
+        updateButtons();
+        if (mPlayer != null) {
+            mPlayer.updateMetadata();
+        }
+    }
+
+    private void updatePlaylist() {
+        mPlayListItems.clear();
+        for (PlaylistItem item : mSessionManager.getPlaylist()) {
+            mPlayListItems.add(item);
+        }
+        mPlayListView.invalidate();
+    }
+
+    private void updateRouteDescription() {
+        RouteInfo route = mMediaRouter.getSelectedRoute();
+        mInfoTextView.setText("Currently selected route:"
+                + "\nName: " + route.getName()
+                + "\nProvider: " + route.getProvider().getPackageName()
+                + "\nDescription: " + route.getDescription());
+    }
+
+    private void updateButtons() {
+        MediaRouter.RouteInfo route = mMediaRouter.getSelectedRoute();
+        // show pause or resume icon depending on current state
+        mPauseResumeButton.setImageResource(mSessionManager.isPaused() ?
+                R.drawable.ic_media_play : R.drawable.ic_media_pause);
+        // only enable seek bar when duration is known
+        PlaylistItem item = getCheckedPlaylistItem();
+        mSeekBar.setEnabled(item != null && item.getDuration() > 0);
+    }
+
+    private PlaylistItem getCheckedPlaylistItem() {
+        int count = mPlayListView.getCount();
+        int index = mPlayListView.getCheckedItemPosition();
+        if (count > 0) {
+            if (index < 0 || index >= count) {
+                index = 0;
+                mPlayListView.setItemChecked(0, true);
+            }
+            return mPlayListItems.getItem(index);
+        }
+        return null;
+    }
+
+    private static final class MediaItem {
+        public final String mName;
+        public final Uri mUri;
+        public final String mMime;
+
+        public MediaItem(String name, Uri uri, String mime) {
+            mName = name;
+            mUri = uri;
+            mMime = mime;
+        }
+
+        @Override
+        public String toString() {
+            return mName;
+        }
+    }
+
+    private final class LibraryAdapter extends ArrayAdapter<MediaItem> {
+        public LibraryAdapter() {
+            super(SampleMediaRouterActivity.this, R.layout.media_item);
+        }
+
+        @Override
+        public View getView(int position, View convertView, ViewGroup parent) {
+            final View v;
+            if (convertView == null) {
+                v = getLayoutInflater().inflate(R.layout.media_item, null);
+            } else {
+                v = convertView;
+            }
+
+            final MediaItem item = getItem(position);
+
+            TextView tv = (TextView)v.findViewById(R.id.item_text);
+            tv.setText(item.mName);
+
+            ImageButton b = (ImageButton)v.findViewById(R.id.item_action);
+            b.setImageResource(R.drawable.ic_menu_add);
+            b.setTag(item);
+            b.setOnClickListener(new OnClickListener() {
+                @Override
+                public void onClick(View v) {
+                    if (item != null) {
+                        mSessionManager.add(item.mUri, item.mMime);
+                    }
+                }
+            });
+
+            return v;
+        }
+    }
+
+    private final class PlaylistAdapter extends ArrayAdapter<PlaylistItem> {
+        public PlaylistAdapter() {
+            super(SampleMediaRouterActivity.this, R.layout.media_item);
+        }
+
+        @Override
+        public View getView(int position, View convertView, ViewGroup parent) {
+            final View v;
+            if (convertView == null) {
+                v = getLayoutInflater().inflate(R.layout.media_item, null);
+            } else {
+                v = convertView;
+            }
+
+            final PlaylistItem item = getItem(position);
+
+            TextView tv = (TextView)v.findViewById(R.id.item_text);
+            tv.setText(item.toString());
+
+            ImageButton b = (ImageButton)v.findViewById(R.id.item_action);
+            b.setImageResource(R.drawable.ic_menu_delete);
+            b.setTag(item);
+            b.setOnClickListener(new OnClickListener() {
+                @Override
+                public void onClick(View v) {
+                    if (item != null) {
+                        mSessionManager.remove(item.getItemId());
+                    }
+                }
+            });
+
+            return v;
+        }
+    }
+
+    /**
+     * Trivial subclass of this activity used to provide another copy of the
+     * same activity using a light theme instead of the dark theme.
+     */
+    public static class Light extends SampleMediaRouterActivity {
+    }
+
+    /**
+     * Trivial subclass of this activity used to provide another copy of the
+     * same activity using a light theme with dark action bar instead of the dark theme.
+     */
+    public static class LightWithDarkActionBar extends SampleMediaRouterActivity {
+    }
+
+    public static class MyMediaRouteActionProvider extends MediaRouteActionProvider {
+        public MyMediaRouteActionProvider(Context context) {
+            super(context);
+        }
+
+        @Override
+        public boolean isVisible() {
+            return true;
+        }
+    }
+
+    public static class ControllerDialogFragment extends MediaRouteControllerDialogFragment {
+        private MediaRouteControllerDialog mControllerDialog;
+        private Player mPlayer;
+        private CheckBox mUseDefaultControlCheckBox;
+
+        public ControllerDialogFragment() {
+            super();
+        }
+
+        public ControllerDialogFragment(Player player, CheckBox customControlViewCheckBox) {
+            mPlayer = player;
+            this.mUseDefaultControlCheckBox = customControlViewCheckBox;
+        }
+
+        @Override
+        public MediaRouteControllerDialog onCreateControllerDialog(
+                Context context, Bundle savedInstanceState) {
+            mControllerDialog = this.mUseDefaultControlCheckBox.isChecked()
+                    ? super.onCreateControllerDialog(context, savedInstanceState)
+                    : new MyMediaRouteControllerDialog(context);
+            mControllerDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
+                @Override
+                public void onDismiss(DialogInterface dialog) {
+                    mControllerDialog = null;
+                }
+            });
+            return mControllerDialog;
+        }
+
+        public void setPlayer(Player player) {
+            mPlayer = player;
+        }
+    }
+}
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/media/SessionManager.java b/samples/Support7Demos/src/com/example/android/supportv7/media/SessionManager.java
new file mode 100644
index 0000000..6fab2eb
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/media/SessionManager.java
@@ -0,0 +1,429 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv7.media;
+
+import android.app.PendingIntent;
+import android.net.Uri;
+import android.support.v7.media.MediaItemStatus;
+import android.support.v7.media.MediaSessionStatus;
+import android.util.Log;
+
+import java.util.List;
+import java.util.ArrayList;
+
+/**
+ * SessionManager manages a media session as a queue. It supports common
+ * queuing behaviors such as enqueue/remove of media items, pause/resume/stop,
+ * etc.
+ *
+ * Actual playback of a single media item is abstracted into a Player interface,
+ * and is handled outside this class.
+ */
+public class SessionManager implements Player.Callback {
+    private static final String TAG = "SessionManager";
+    private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
+
+    private String mName;
+    private int mSessionId;
+    private int mItemId;
+    private boolean mPaused;
+    private boolean mSessionValid;
+    private Player mPlayer;
+    private Callback mCallback;
+    private List<PlaylistItem> mPlaylist = new ArrayList<PlaylistItem>();
+
+    public SessionManager(String name) {
+        mName = name;
+    }
+
+    public boolean isPaused() {
+        return hasSession() && mPaused;
+    }
+
+    public boolean hasSession() {
+        return mSessionValid;
+    }
+
+    public String getSessionId() {
+        return mSessionValid ? Integer.toString(mSessionId) : null;
+    }
+
+    public PlaylistItem getCurrentItem() {
+        return mPlaylist.isEmpty() ? null : mPlaylist.get(0);
+    }
+
+    // Returns the cached playlist (note this is not responsible for updating it)
+    public List<PlaylistItem> getPlaylist() {
+        return mPlaylist;
+    }
+
+    // Updates the playlist asynchronously, calls onPlaylistReady() when finished.
+    public void updateStatus() {
+        if (DEBUG) {
+            log("updateStatus");
+        }
+        checkPlayer();
+        // update the statistics first, so that the stats string is valid when
+        // onPlaylistReady() gets called in the end
+        mPlayer.updateTrackInfo();
+
+        if (mPlaylist.isEmpty()) {
+            // If queue is empty, don't forget to call onPlaylistReady()!
+            onPlaylistReady();
+        } else if (mPlayer.isQueuingSupported()) {
+            // If player supports queuing, get status of each item. Player is
+            // responsible to call onPlaylistReady() after last getStatus().
+            // (update=1 requires player to callback onPlaylistReady())
+            for (int i = 0; i < mPlaylist.size(); i++) {
+                PlaylistItem item = mPlaylist.get(i);
+                mPlayer.getStatus(item, (i == mPlaylist.size() - 1) /* update */);
+            }
+        } else {
+            // Otherwise, only need to get status for current item. Player is
+            // responsible to call onPlaylistReady() when finished.
+            mPlayer.getStatus(getCurrentItem(), true /* update */);
+        }
+    }
+
+    public PlaylistItem add(Uri uri, String mime) {
+        return add(uri, mime, null);
+    }
+
+    public PlaylistItem add(Uri uri, String mime, PendingIntent receiver) {
+        if (DEBUG) {
+            log("add: uri=" + uri + ", receiver=" + receiver);
+        }
+        // create new session if needed
+        startSession();
+        checkPlayerAndSession();
+
+        // append new item with initial status PLAYBACK_STATE_PENDING
+        PlaylistItem item = new PlaylistItem(
+                Integer.toString(mSessionId), Integer.toString(mItemId), uri, mime, receiver);
+        mPlaylist.add(item);
+        mItemId++;
+
+        // if player supports queuing, enqueue the item now
+        if (mPlayer.isQueuingSupported()) {
+            mPlayer.enqueue(item);
+        }
+        updatePlaybackState();
+        return item;
+    }
+
+    public PlaylistItem remove(String iid) {
+        if (DEBUG) {
+            log("remove: iid=" + iid);
+        }
+        checkPlayerAndSession();
+        return removeItem(iid, MediaItemStatus.PLAYBACK_STATE_CANCELED);
+    }
+
+    public PlaylistItem seek(String iid, long pos) {
+        if (DEBUG) {
+            log("seek: iid=" + iid +", pos=" + pos);
+        }
+        checkPlayerAndSession();
+        // seeking on pending items are not yet supported
+        checkItemCurrent(iid);
+
+        PlaylistItem item = getCurrentItem();
+        if (pos != item.getPosition()) {
+            item.setPosition(pos);
+            if (item.getState() == MediaItemStatus.PLAYBACK_STATE_PLAYING
+                    || item.getState() == MediaItemStatus.PLAYBACK_STATE_PAUSED) {
+                mPlayer.seek(item);
+            }
+        }
+        return item;
+    }
+
+    public PlaylistItem getStatus(String iid) {
+        checkPlayerAndSession();
+
+        // This should only be called for local player. Remote player is
+        // asynchronous, need to use updateStatus() instead.
+        if (mPlayer.isRemotePlayback()) {
+            throw new IllegalStateException(
+                    "getStatus should not be called on remote player!");
+        }
+
+        for (PlaylistItem item : mPlaylist) {
+            if (item.getItemId().equals(iid)) {
+                if (item == getCurrentItem()) {
+                    mPlayer.getStatus(item, false);
+                }
+                return item;
+            }
+        }
+        return null;
+    }
+
+    public void pause() {
+        if (DEBUG) {
+            log("pause");
+        }
+        if (!mSessionValid) {
+            return;
+        }
+        checkPlayer();
+        mPaused = true;
+        updatePlaybackState();
+    }
+
+    public void resume() {
+        if (DEBUG) {
+            log("resume");
+        }
+        if (!mSessionValid) {
+            return;
+        }
+        checkPlayer();
+        mPaused = false;
+        updatePlaybackState();
+    }
+
+    public void stop() {
+        if (DEBUG) {
+            log("stop");
+        }
+        if (!mSessionValid) {
+            return;
+        }
+        checkPlayer();
+        mPlayer.stop();
+        mPlaylist.clear();
+        mPaused = false;
+        updateStatus();
+    }
+
+    public String startSession() {
+        if (!mSessionValid) {
+            mSessionId++;
+            mItemId = 0;
+            mPaused = false;
+            mSessionValid = true;
+            return Integer.toString(mSessionId);
+        }
+        return null;
+    }
+
+    public boolean endSession() {
+        if (mSessionValid) {
+            mSessionValid = false;
+            return true;
+        }
+        return false;
+    }
+
+    MediaSessionStatus getSessionStatus(String sid) {
+        int sessionState = (sid != null && sid.equals(mSessionId)) ?
+                MediaSessionStatus.SESSION_STATE_ACTIVE :
+                    MediaSessionStatus.SESSION_STATE_INVALIDATED;
+
+        return new MediaSessionStatus.Builder(sessionState)
+                .setQueuePaused(mPaused)
+                .build();
+    }
+
+    // Suspend the playback manager. Put the current item back into PENDING
+    // state, and remember the current playback position. Called when switching
+    // to a different player (route).
+    public void suspend(long pos) {
+        for (PlaylistItem item : mPlaylist) {
+            item.setRemoteItemId(null);
+            item.setDuration(0);
+        }
+        PlaylistItem item = getCurrentItem();
+        if (DEBUG) {
+            log("suspend: item=" + item + ", pos=" + pos);
+        }
+        if (item != null) {
+            if (item.getState() == MediaItemStatus.PLAYBACK_STATE_PLAYING
+                    || item.getState() == MediaItemStatus.PLAYBACK_STATE_PAUSED) {
+                item.setState(MediaItemStatus.PLAYBACK_STATE_PENDING);
+                item.setPosition(pos);
+            }
+        }
+    }
+
+    // Unsuspend the playback manager. Restart playback on new player (route).
+    // This will resume playback of current item. Furthermore, if the new player
+    // supports queuing, playlist will be re-established on the remote player.
+    public void unsuspend() {
+        if (DEBUG) {
+            log("unsuspend");
+        }
+        if (mPlayer.isQueuingSupported()) {
+            for (PlaylistItem item : mPlaylist) {
+                mPlayer.enqueue(item);
+            }
+        }
+        updatePlaybackState();
+    }
+
+    // Player.Callback
+    @Override
+    public void onError() {
+        finishItem(true);
+    }
+
+    @Override
+    public void onCompletion() {
+        finishItem(false);
+    }
+
+    @Override
+    public void onPlaylistChanged() {
+        // Playlist has changed, update the cached playlist
+        updateStatus();
+    }
+
+    @Override
+    public void onPlaylistReady() {
+        // Notify activity to update Ui
+        if (mCallback != null) {
+            mCallback.onStatusChanged();
+        }
+    }
+
+    private void log(String message) {
+        Log.d(TAG, mName + ": " + message);
+    }
+
+    private void checkPlayer() {
+        if (mPlayer == null) {
+            throw new IllegalStateException("Player not set!");
+        }
+    }
+
+    private void checkSession() {
+        if (!mSessionValid) {
+            throw new IllegalStateException("Session not set!");
+        }
+    }
+
+    private void checkPlayerAndSession() {
+        checkPlayer();
+        checkSession();
+    }
+
+    private void checkItemCurrent(String iid) {
+        PlaylistItem item = getCurrentItem();
+        if (item == null || !item.getItemId().equals(iid)) {
+            throw new IllegalArgumentException("Item is not current!");
+        }
+    }
+
+    private void updatePlaybackState() {
+        PlaylistItem item = getCurrentItem();
+        if (item != null) {
+            if (item.getState() == MediaItemStatus.PLAYBACK_STATE_PENDING) {
+                item.setState(mPaused ? MediaItemStatus.PLAYBACK_STATE_PAUSED
+                        : MediaItemStatus.PLAYBACK_STATE_PLAYING);
+                if (!mPlayer.isQueuingSupported()) {
+                    mPlayer.play(item);
+                }
+            } else if (mPaused && item.getState() == MediaItemStatus.PLAYBACK_STATE_PLAYING) {
+                mPlayer.pause();
+                item.setState(MediaItemStatus.PLAYBACK_STATE_PAUSED);
+            } else if (!mPaused && item.getState() == MediaItemStatus.PLAYBACK_STATE_PAUSED) {
+                mPlayer.resume();
+                item.setState(MediaItemStatus.PLAYBACK_STATE_PLAYING);
+            }
+            // notify client that item playback status has changed
+            if (mCallback != null) {
+                mCallback.onItemChanged(item);
+            }
+        } else {
+            mPlayer.initMediaSession();
+        }
+        updateStatus();
+    }
+
+    private PlaylistItem removeItem(String iid, int state) {
+        checkPlayerAndSession();
+        List<PlaylistItem> queue =
+                new ArrayList<PlaylistItem>(mPlaylist.size());
+        PlaylistItem found = null;
+        for (PlaylistItem item : mPlaylist) {
+            if (iid.equals(item.getItemId())) {
+                if (mPlayer.isQueuingSupported()) {
+                    mPlayer.remove(item.getRemoteItemId());
+                } else if (item.getState() == MediaItemStatus.PLAYBACK_STATE_PLAYING
+                        || item.getState() == MediaItemStatus.PLAYBACK_STATE_PAUSED){
+                    mPlayer.stop();
+                }
+                item.setState(state);
+                found = item;
+                // notify client that item is now removed
+                if (mCallback != null) {
+                    mCallback.onItemChanged(found);
+                }
+            } else {
+                queue.add(item);
+            }
+        }
+        if (found != null) {
+            mPlaylist = queue;
+            updatePlaybackState();
+        } else {
+            log("item not found");
+        }
+        return found;
+    }
+
+    private void finishItem(boolean error) {
+        PlaylistItem item = getCurrentItem();
+        if (item != null) {
+            removeItem(item.getItemId(), error ?
+                    MediaItemStatus.PLAYBACK_STATE_ERROR :
+                        MediaItemStatus.PLAYBACK_STATE_FINISHED);
+            updateStatus();
+        }
+    }
+
+    // set the Player that this playback manager will interact with
+    public void setPlayer(Player player) {
+        mPlayer = player;
+        checkPlayer();
+        mPlayer.setCallback(this);
+    }
+
+    // provide a callback interface to tell the UI when significant state changes occur
+    public void setCallback(Callback callback) {
+        mCallback = callback;
+    }
+
+    @Override
+    public String toString() {
+        String result = "Media Queue: ";
+        if (!mPlaylist.isEmpty()) {
+            for (PlaylistItem item : mPlaylist) {
+                result += "\n" + item.toString();
+            }
+        } else {
+            result += "<empty>";
+        }
+        return result;
+    }
+
+    public interface Callback {
+        void onStatusChanged();
+        void onItemChanged(PlaylistItem item);
+    }
+}
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/media/_index.html b/samples/Support7Demos/src/com/example/android/supportv7/media/_index.html
new file mode 100644
index 0000000..0802cae
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/media/_index.html
@@ -0,0 +1,23 @@
+
+<p>This section includes samples showing the use of the application
+package features of the static support library.</p>
+<ul>
+  <li><a href="#MediaRouter">Media Router</a></li>
+</ul>
+
+
+<h3 id="MediaRouter">Media Router</h3>
+<dl>
+  <dt><a href="SampleMediaRouteProvider.html">Media Route Provider</a></dt>
+  <dd>Demonstrates how to implement a MediaRouteProvider to discover,
+  publish and control custom media routes.</dd>
+
+  <dt><a href="SampleMediaRouteProviderService.html">Media Route Provider Service</a></dt>
+  <dd>Demonstrates how to make a MediaRouteProvider available to all
+  running applications by registering it as a service.</dd>
+
+  <dt><a href="SampleMediaRouterActivity.html">Media Router Activity</a></dt>
+  <dd>Demonstrates how to use MediaRouter within an Activity to support
+  remote media playback.</dd>
+</dl>
+ 
\ No newline at end of file
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/util/SortedListActivity.java b/samples/Support7Demos/src/com/example/android/supportv7/util/SortedListActivity.java
new file mode 100644
index 0000000..8f3871d
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/util/SortedListActivity.java
@@ -0,0 +1,179 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.example.android.supportv7.util;
+
+import com.example.android.supportv7.R;
+import android.os.Bundle;
+import android.support.v7.app.ActionBarActivity;
+import android.support.v7.util.SortedList;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.support.v7.widget.util.SortedListAdapterCallback;
+import android.view.KeyEvent;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.inputmethod.EditorInfo;
+import android.widget.CheckBox;
+import android.widget.CompoundButton;
+import android.widget.EditText;
+import android.widget.TextView;
+
+/**
+ * A sample activity that uses {@link SortedList} in combination with RecyclerView.
+ */
+public class SortedListActivity extends ActionBarActivity {
+    private RecyclerView mRecyclerView;
+    private LinearLayoutManager mLinearLayoutManager;
+    private SortedListAdapter mAdapter;
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.sorted_list_activity);
+        mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
+        mRecyclerView.setHasFixedSize(true);
+        mLinearLayoutManager = new LinearLayoutManager(this);
+        mRecyclerView.setLayoutManager(mLinearLayoutManager);
+        mAdapter = new SortedListAdapter(getLayoutInflater(),
+                new Item("buy milk"), new Item("wash the car"),
+                new Item("wash the dishes"));
+        mRecyclerView.setAdapter(mAdapter);
+        mRecyclerView.setHasFixedSize(true);
+        final EditText newItemTextView = (EditText) findViewById(R.id.new_item_text_view);
+        newItemTextView.setOnEditorActionListener(new TextView.OnEditorActionListener() {
+            @Override
+            public boolean onEditorAction(TextView textView, int id, KeyEvent keyEvent) {
+                if (id == EditorInfo.IME_ACTION_DONE &&
+                        (keyEvent == null || keyEvent.getAction() == KeyEvent.ACTION_DOWN)) {
+                    final String text = textView.getText().toString().trim();
+                    if (text.length() > 0) {
+                        mAdapter.addItem(new Item(text));
+                    }
+                    textView.setText("");
+                    return true;
+                }
+                return false;
+            }
+        });
+    }
+
+    private static class SortedListAdapter extends RecyclerView.Adapter<TodoViewHolder> {
+        SortedList<Item> mData;
+        final LayoutInflater mLayoutInflater;
+        public SortedListAdapter(LayoutInflater layoutInflater, Item... items) {
+            mLayoutInflater = layoutInflater;
+            mData = new SortedList<Item>(Item.class, new SortedListAdapterCallback<Item>(this) {
+                @Override
+                public int compare(Item t0, Item t1) {
+                    if (t0.mIsDone != t1.mIsDone) {
+                        return t0.mIsDone ? 1 : -1;
+                    }
+                    int txtComp = t0.mText.compareTo(t1.mText);
+                    if (txtComp != 0) {
+                        return txtComp;
+                    }
+                    if (t0.id < t1.id) {
+                        return -1;
+                    } else if (t0.id > t1.id) {
+                        return 1;
+                    }
+                    return 0;
+                }
+
+                @Override
+                public boolean areContentsTheSame(Item oldItem,
+                        Item newItem) {
+                    return oldItem.mText.equals(newItem.mText);
+                }
+
+                @Override
+                public boolean areItemsTheSame(Item item1, Item item2) {
+                    return item1.id == item2.id;
+                }
+            });
+            for (Item item : items) {
+                mData.add(item);
+            }
+        }
+
+        public void addItem(Item item) {
+            mData.add(item);
+        }
+
+        @Override
+        public TodoViewHolder onCreateViewHolder(final ViewGroup parent, int viewType) {
+            return new TodoViewHolder (
+                    mLayoutInflater.inflate(R.layout.sorted_list_item_view, parent, false)) {
+                @Override
+                void onDoneChanged(boolean isDone) {
+                    int adapterPosition = getAdapterPosition();
+                    if (adapterPosition == RecyclerView.NO_POSITION) {
+                        return;
+                    }
+                    mBoundItem.mIsDone = isDone;
+                    mData.recalculatePositionOfItemAt(adapterPosition);
+                }
+            };
+        }
+
+        @Override
+        public void onBindViewHolder(TodoViewHolder holder, int position) {
+            holder.bindTo(mData.get(position));
+        }
+
+        @Override
+        public int getItemCount() {
+            return mData.size();
+        }
+    }
+
+    abstract private static class TodoViewHolder extends RecyclerView.ViewHolder {
+        final CheckBox mCheckBox;
+        Item mBoundItem;
+        public TodoViewHolder(View itemView) {
+            super(itemView);
+            mCheckBox = (CheckBox) itemView;
+            mCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+                @Override
+                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+                    if (mBoundItem != null && isChecked != mBoundItem.mIsDone) {
+                        onDoneChanged(isChecked);
+                    }
+                }
+            });
+        }
+
+        public void bindTo(Item item) {
+            mBoundItem = item;
+            mCheckBox.setText(item.mText);
+            mCheckBox.setChecked(item.mIsDone);
+        }
+
+        abstract void onDoneChanged(boolean isChecked);
+    }
+
+    private static class Item {
+        String mText;
+        boolean mIsDone = false;
+        final public int id;
+        private static int idCounter = 0;
+
+        public Item(String text) {
+            id = idCounter ++;
+            this.mText = text;
+        }
+    }
+}
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/view/CardViewActivity.java b/samples/Support7Demos/src/com/example/android/supportv7/view/CardViewActivity.java
new file mode 100644
index 0000000..cc70442
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/view/CardViewActivity.java
@@ -0,0 +1,187 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.example.android.supportv7.view;
+
+import android.os.Bundle;
+import android.os.Handler;
+import android.support.v4.view.ViewCompat;
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.widget.CardView;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.RadioGroup;
+import android.widget.SeekBar;
+import android.widget.TextView;
+
+import com.example.android.supportv7.R;
+
+public class CardViewActivity extends AppCompatActivity {
+
+    CardView mCardView;
+
+    TextView mInfoText;
+
+    SeekBar mCornerRadiusSeekBar;
+
+    SeekBar mWidthSeekBar;
+
+    SeekBar mHeightSeekBar;
+
+    SeekBar mElevationSeekBar;
+
+    SeekBar mMaxElevationSeekBar;
+
+    SeekBar mAlphaSeekBar;
+
+    boolean mResizeCardView = true;
+
+    private SeekBar.OnSeekBarChangeListener mOnSeekBarChangedListener
+            = new SeekBar.OnSeekBarChangeListener() {
+        @Override
+        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
+            update();
+        }
+
+        @Override
+        public void onStartTrackingTouch(SeekBar seekBar) {
+
+        }
+
+        @Override
+        public void onStopTrackingTouch(SeekBar seekBar) {
+
+        }
+    };
+
+    private void update() {
+        mElevationSeekBar.setMax(mMaxElevationSeekBar.getProgress());
+        if (mCornerRadiusSeekBar.getProgress() != mCardView.getRadius()) {
+            mCardView.setRadius(mCornerRadiusSeekBar.getProgress());
+        }
+        if (mElevationSeekBar.getProgress() != mCardView.getCardElevation()) {
+            mCardView.setCardElevation(mElevationSeekBar.getProgress());
+        }
+        if (mMaxElevationSeekBar.getProgress() != mCardView.getMaxCardElevation()) {
+            mCardView.setMaxCardElevation(mMaxElevationSeekBar.getProgress());
+        }
+        ViewCompat.setAlpha(mCardView, mAlphaSeekBar.getProgress() / 255f);
+        ViewGroup.LayoutParams lp;
+        if (mResizeCardView) {
+            lp = setViewBounds(mCardView);
+        } else {
+            lp = setViewBounds(mInfoText);
+        }
+        mInfoText.setText("radius: " + mCornerRadiusSeekBar.getProgress()
+                + ", alpha: " + mAlphaSeekBar.getProgress()
+                + "\n w: " + lp.width + "\nh: " + lp.height
+                + "\nelevation: " + mCardView.getCardElevation() + " of "
+                + mCardView.getMaxCardElevation());
+    }
+
+    private ViewGroup.LayoutParams setViewBounds(View view) {
+        ViewGroup.LayoutParams lp = view.getLayoutParams();
+        boolean changed = lp.width != mWidthSeekBar.getProgress()
+                || lp.height != mHeightSeekBar.getProgress();
+        if (!changed) {
+            return lp;
+        }
+        lp.width = mWidthSeekBar.getProgress();
+        lp.height = mHeightSeekBar.getProgress();
+        view.setLayoutParams(lp);
+        return lp;
+    }
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_card_view);
+        mInfoText = (TextView) findViewById(R.id.info_text);
+        mCardView = (CardView) findViewById(R.id.card_view);
+        mCornerRadiusSeekBar = (SeekBar) findViewById(R.id.corner_radius_seek_bar);
+        mCornerRadiusSeekBar.setProgress((int) mCardView.getRadius());
+        mCornerRadiusSeekBar.setOnSeekBarChangeListener(mOnSeekBarChangedListener);
+
+        mWidthSeekBar = (SeekBar) findViewById(R.id.width_seek_bar);
+        mWidthSeekBar.setProgress(mCardView.getLayoutParams().width);
+
+        mWidthSeekBar.setOnSeekBarChangeListener(mOnSeekBarChangedListener);
+
+        mHeightSeekBar = (SeekBar) findViewById(R.id.height_seek_bar);
+        mHeightSeekBar.setProgress(mCardView.getLayoutParams().height);
+        mHeightSeekBar.setOnSeekBarChangeListener(mOnSeekBarChangedListener);
+
+        mElevationSeekBar = (SeekBar) findViewById(R.id.elevation_seek_bar);
+        mElevationSeekBar.setProgress((int) mCardView.getCardElevation());
+        mElevationSeekBar.setOnSeekBarChangeListener(mOnSeekBarChangedListener);
+
+        mMaxElevationSeekBar = (SeekBar) findViewById(R.id.max_elevation_seek_bar);
+        mMaxElevationSeekBar.setProgress((int) mCardView.getMaxCardElevation());
+        mMaxElevationSeekBar.setOnSeekBarChangeListener(mOnSeekBarChangedListener);
+
+        mAlphaSeekBar = (SeekBar) findViewById(R.id.alpha_seek_bar);
+        mAlphaSeekBar.setProgress((int) ViewCompat.getAlpha(mCardView) * 255);
+        mAlphaSeekBar.setOnSeekBarChangeListener(mOnSeekBarChangedListener);
+
+        RadioGroup rb = (RadioGroup) findViewById(R.id.select_target_radio);
+        rb.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
+            @Override
+            public void onCheckedChanged(RadioGroup group, int checkedId) {
+                mResizeCardView = checkedId == R.id.resize_card_view;
+                update();
+            }
+        });
+
+        new Handler().postDelayed(new Runnable() {
+            @Override
+            public void run() {
+                View content = findViewById(android.R.id.content);
+                mWidthSeekBar.setProgress(mCardView.getWidth());
+                mHeightSeekBar.setProgress(mCardView.getHeight());
+                mWidthSeekBar.setMax(content.getWidth());
+                mHeightSeekBar.setMax(content.getHeight());
+                update();
+            }
+        }, 100);
+
+        ((RadioGroup) findViewById(R.id.select_bg_color_radio))
+                .setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
+                    @Override
+                    public void onCheckedChanged(RadioGroup group, int checkedId) {
+                        mCardView.setCardBackgroundColor(
+                                getResources().getColorStateList(getColorId(checkedId)));
+                    }
+                });
+    }
+
+    private int getColorId(int id) {
+        switch (id) {
+            case R.id.yellow:
+                return R.color.card_yellow;
+            case R.id.aquatic:
+                return R.color.card_aquatic;
+            case R.id.classic:
+                return R.color.card_classic;
+            case R.id.sunbrite:
+                return R.color.card_sunbrite;
+            case R.id.tropical:
+                return R.color.card_tropical;
+            case R.id.selector:
+                return R.color.card_selector;
+            default:
+                return R.color.cardview_light_background;
+        }
+    }
+}
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/view/GridLayout1.java b/samples/Support7Demos/src/com/example/android/supportv7/view/GridLayout1.java
new file mode 100644
index 0000000..6b27a2d
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/view/GridLayout1.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv7.view;
+
+import com.example.android.supportv7.R;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+/**
+ * Demonstrates using GridLayout to build the same "Simple Form" as in the
+ * LinearLayout and RelativeLayout demos.
+ */
+public class GridLayout1 extends Activity {
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.grid_layout_1);
+    }
+}
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/view/GridLayout2.java b/samples/Support7Demos/src/com/example/android/supportv7/view/GridLayout2.java
new file mode 100644
index 0000000..86258aa
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/view/GridLayout2.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv7.view;
+
+import com.example.android.supportv7.R;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+/**
+ * A form, showing use of the GridLayout API from XML.
+ */
+public class GridLayout2 extends Activity {
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.grid_layout_2);
+    }
+}
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/view/GridLayout3.java b/samples/Support7Demos/src/com/example/android/supportv7/view/GridLayout3.java
new file mode 100644
index 0000000..71dffe5
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/view/GridLayout3.java
@@ -0,0 +1,129 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv7.view;
+
+import static android.support.v7.widget.GridLayout.ALIGN_BOUNDS;
+import static android.support.v7.widget.GridLayout.BASELINE;
+import static android.support.v7.widget.GridLayout.CENTER;
+import static android.support.v7.widget.GridLayout.FILL;
+import static android.support.v7.widget.GridLayout.LEFT;
+import static android.support.v7.widget.GridLayout.RIGHT;
+import static android.support.v7.widget.GridLayout.spec;
+import static android.text.InputType.TYPE_CLASS_TEXT;
+import static android.text.InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS;
+import static android.text.InputType.TYPE_TEXT_VARIATION_PASSWORD;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.res.Configuration;
+import android.os.Bundle;
+import android.support.v7.widget.GridLayout;
+import android.support.v7.widget.GridLayout.LayoutParams;
+import android.support.v7.widget.GridLayout.Spec;
+import android.view.View;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.TextView;
+
+/**
+ * A form, showing use of the GridLayout API. Here we demonstrate use of the row/column order
+ * preserved property which allows rows and or columns to pass over each other when needed.
+ * The two buttons in the bottom right corner need to be separated from the other UI elements.
+ * This can either be done by separating rows or separating columns - but we don't need
+ * to do both and may only have enough space to do one or the other.
+ */
+public class GridLayout3 extends Activity {
+    public static View create(Context context) {
+        GridLayout p = new GridLayout(context);
+        p.setUseDefaultMargins(true);
+        p.setAlignmentMode(ALIGN_BOUNDS);
+        Configuration configuration = context.getResources().getConfiguration();
+        if ((configuration.orientation == Configuration.ORIENTATION_PORTRAIT)) {
+            p.setColumnOrderPreserved(false);
+        } else {
+            p.setRowOrderPreserved(false);
+        }
+
+        Spec titleRow              = spec(0);
+        Spec introRow              = spec(1);
+        Spec emailRow              = spec(2, BASELINE);
+        Spec passwordRow           = spec(3, BASELINE);
+        Spec button1Row            = spec(5);
+        Spec button2Row            = spec(6);
+
+        Spec centerInAllColumns    = spec(0, 4, CENTER);
+        Spec leftAlignInAllColumns = spec(0, 4, LEFT);
+        Spec labelColumn           = spec(0, RIGHT);
+        Spec fieldColumn           = spec(1, LEFT);
+        Spec defineLastColumn      = spec(3);
+        Spec fillLastColumn        = spec(3, FILL);
+
+        {
+            TextView c = new TextView(context);
+            c.setTextSize(32);
+            c.setText("Email setup");
+            p.addView(c, new LayoutParams(titleRow, centerInAllColumns));
+        }
+        {
+            TextView c = new TextView(context);
+            c.setTextSize(16);
+            c.setText("You can configure email in a few simple steps:");
+            p.addView(c, new LayoutParams(introRow, leftAlignInAllColumns));
+        }
+        {
+            TextView c = new TextView(context);
+            c.setText("Email address:");
+            p.addView(c, new LayoutParams(emailRow, labelColumn));
+        }
+        {
+            EditText c = new EditText(context);
+            c.setEms(10);
+            c.setInputType(TYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_EMAIL_ADDRESS);
+            p.addView(c, new LayoutParams(emailRow, fieldColumn));
+        }
+        {
+            TextView c = new TextView(context);
+            c.setText("Password:");
+            p.addView(c, new LayoutParams(passwordRow, labelColumn));
+        }
+        {
+            EditText c = new EditText(context);
+            c.setEms(8);
+            c.setInputType(TYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_PASSWORD);
+            p.addView(c, new LayoutParams(passwordRow, fieldColumn));
+        }
+        {
+            Button c = new Button(context);
+            c.setText("Manual setup");
+            p.addView(c, new LayoutParams(button1Row, defineLastColumn));
+        }
+        {
+            Button c = new Button(context);
+            c.setText("Next");
+            p.addView(c, new LayoutParams(button2Row, fillLastColumn));
+        }
+
+        return p;
+    }
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(create(this));
+    }
+
+}
\ No newline at end of file
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/view/_index.html b/samples/Support7Demos/src/com/example/android/supportv7/view/_index.html
new file mode 100644
index 0000000..072967a
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/view/_index.html
@@ -0,0 +1,22 @@
+
+<p>This section includes samples showing the use of the view
+package features of the static support library.</p>
+<ul>
+  <li><a href="#GridLayout">Grid Layout</a></li>
+</ul>
+
+
+<h3 id="GridLayout">Grid Layout</h3>
+<dl>
+  <dt><a href="GridLayout1.html">Grid Layout Simple Form</a></dt>
+  <dd>Demonstrates how to use GridLayout to create a simple data entry form.</dd>
+
+  <dt><a href="GridLayout2.html">Grid Layout Form (XML)</a></dt>
+  <dd>Demonstrates how to use GridLayout to create a more complex
+  data entry form using XML layout resources.</dd>
+
+  <dt><a href="GridLayout3.html">Grid Layout Form (Java)</a></dt>
+  <dd>Demonstrates how to use GridLayout to create a more complex
+  data entry form programmatically.</dd>
+</dl>
+ 
\ No newline at end of file
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/widget/AnimatedRecyclerView.java b/samples/Support7Demos/src/com/example/android/supportv7/widget/AnimatedRecyclerView.java
new file mode 100644
index 0000000..6714f6d
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/widget/AnimatedRecyclerView.java
@@ -0,0 +1,750 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.example.android.supportv7.widget;
+
+import com.example.android.supportv7.R;
+
+import android.animation.Animator;
+import android.animation.ValueAnimator;
+import android.annotation.TargetApi;
+import android.app.Activity;
+import android.content.Context;
+import android.os.Build;
+import android.os.Bundle;
+import android.support.v4.util.ArrayMap;
+import android.support.v4.view.MenuItemCompat;
+import android.support.v4.view.ViewCompat;
+import android.support.v4.view.ViewPropertyAnimatorListener;
+import android.support.v7.widget.DefaultItemAnimator;
+import android.support.v7.widget.RecyclerView;
+import android.util.DisplayMetrics;
+import android.util.TypedValue;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.CheckBox;
+import android.widget.CompoundButton;
+import android.widget.TextView;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class AnimatedRecyclerView extends Activity {
+
+    private static final int SCROLL_DISTANCE = 80; // dp
+
+    private RecyclerView mRecyclerView;
+
+    private int mNumItemsAdded = 0;
+    ArrayList<String> mItems = new ArrayList<String>();
+    MyAdapter mAdapter;
+
+    boolean mAnimationsEnabled = true;
+    boolean mPredictiveAnimationsEnabled = true;
+    RecyclerView.ItemAnimator mCachedAnimator = null;
+    boolean mEnableInPlaceChange = true;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.animated_recycler_view);
+
+        ViewGroup container = (ViewGroup) findViewById(R.id.container);
+        mRecyclerView = new RecyclerView(this);
+        mCachedAnimator = createAnimator();
+        mCachedAnimator.setChangeDuration(2000);
+        mRecyclerView.setItemAnimator(mCachedAnimator);
+        mRecyclerView.setLayoutManager(new MyLayoutManager(this));
+        mRecyclerView.setHasFixedSize(true);
+        mRecyclerView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
+                ViewGroup.LayoutParams.MATCH_PARENT));
+        for (int i = 0; i < 6; ++i) {
+            mItems.add("Item #" + i);
+        }
+        mAdapter = new MyAdapter(mItems);
+        mRecyclerView.setAdapter(mAdapter);
+        container.addView(mRecyclerView);
+
+        CheckBox enableAnimations = (CheckBox) findViewById(R.id.enableAnimations);
+        enableAnimations.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+            @Override
+            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+                if (isChecked && mRecyclerView.getItemAnimator() == null) {
+                    mRecyclerView.setItemAnimator(mCachedAnimator);
+                } else if (!isChecked && mRecyclerView.getItemAnimator() != null) {
+                    mRecyclerView.setItemAnimator(null);
+                }
+                mAnimationsEnabled = isChecked;
+            }
+        });
+
+        CheckBox enablePredictiveAnimations =
+                (CheckBox) findViewById(R.id.enablePredictiveAnimations);
+        enablePredictiveAnimations.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+            @Override
+            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+                mPredictiveAnimationsEnabled = isChecked;
+            }
+        });
+
+        CheckBox enableInPlaceChange = (CheckBox) findViewById(R.id.enableInPlaceChange);
+        enableInPlaceChange.setChecked(mEnableInPlaceChange);
+        enableInPlaceChange.setOnCheckedChangeListener(
+                new CompoundButton.OnCheckedChangeListener() {
+                    @Override
+                    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+                        mEnableInPlaceChange = isChecked;
+                    }
+                });
+    }
+
+    private RecyclerView.ItemAnimator createAnimator() {
+        return new DefaultItemAnimator() {
+            List<ItemChangeAnimator> mPendingChangeAnimations = new ArrayList<>();
+            ArrayMap<RecyclerView.ViewHolder, ItemChangeAnimator> mRunningAnimations
+                    = new ArrayMap<>();
+            ArrayMap<MyViewHolder, Long> mPendingSettleList = new ArrayMap<>();
+
+            @Override
+            public void runPendingAnimations() {
+                super.runPendingAnimations();
+                for (ItemChangeAnimator anim : mPendingChangeAnimations) {
+                    anim.start();
+                    mRunningAnimations.put(anim.mViewHolder, anim);
+                }
+                mPendingChangeAnimations.clear();
+                for (int i = mPendingSettleList.size() - 1; i >=0; i--) {
+                    final MyViewHolder vh = mPendingSettleList.keyAt(i);
+                    final long duration = mPendingSettleList.valueAt(i);
+                    ViewCompat.animate(vh.textView).translationX(0f).alpha(1f)
+                            .setDuration(duration).setListener(
+                            new ViewPropertyAnimatorListener() {
+                                @Override
+                                public void onAnimationStart(View view) {
+                                    dispatchAnimationStarted(vh);
+                                }
+
+                                @Override
+                                public void onAnimationEnd(View view) {
+                                    ViewCompat.setTranslationX(vh.textView, 0f);
+                                    ViewCompat.setAlpha(vh.textView, 1f);
+                                    dispatchAnimationFinished(vh);
+                                }
+
+                                @Override
+                                public void onAnimationCancel(View view) {
+
+                                }
+                            }).start();
+                }
+                mPendingSettleList.clear();
+            }
+
+            @Override
+            public ItemHolderInfo recordPreLayoutInformation(RecyclerView.State state,
+                    RecyclerView.ViewHolder viewHolder,
+                    @AdapterChanges int changeFlags, List<Object> payloads) {
+                MyItemInfo info = (MyItemInfo) super
+                        .recordPreLayoutInformation(state, viewHolder, changeFlags, payloads);
+                info.text = ((MyViewHolder) viewHolder).textView.getText();
+                return info;
+            }
+
+            @Override
+            public ItemHolderInfo recordPostLayoutInformation(RecyclerView.State state,
+                    RecyclerView.ViewHolder viewHolder) {
+                MyItemInfo info = (MyItemInfo) super.recordPostLayoutInformation(state, viewHolder);
+                info.text = ((MyViewHolder) viewHolder).textView.getText();
+                return info;
+            }
+
+
+            @Override
+            public boolean canReuseUpdatedViewHolder(RecyclerView.ViewHolder viewHolder) {
+                return mEnableInPlaceChange;
+            }
+
+            @Override
+            public void endAnimation(RecyclerView.ViewHolder item) {
+                super.endAnimation(item);
+                for (int i = mPendingChangeAnimations.size() - 1; i >= 0; i--) {
+                    ItemChangeAnimator anim = mPendingChangeAnimations.get(i);
+                    if (anim.mViewHolder == item) {
+                        mPendingChangeAnimations.remove(i);
+                        anim.setFraction(1f);
+                        dispatchChangeFinished(item, true);
+                    }
+                }
+                for (int i = mRunningAnimations.size() - 1; i >= 0; i--) {
+                    ItemChangeAnimator animator = mRunningAnimations.get(item);
+                    if (animator != null) {
+                        animator.end();
+                        mRunningAnimations.removeAt(i);
+                    }
+                }
+                for (int  i = mPendingSettleList.size() - 1; i >= 0; i--) {
+                    final MyViewHolder vh = mPendingSettleList.keyAt(i);
+                    if (vh == item) {
+                        mPendingSettleList.removeAt(i);
+                        dispatchChangeFinished(item, true);
+                    }
+                }
+            }
+
+            @Override
+            public boolean animateChange(RecyclerView.ViewHolder oldHolder,
+                    RecyclerView.ViewHolder newHolder, ItemHolderInfo preInfo,
+                    ItemHolderInfo postInfo) {
+                if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB_MR1
+                        || oldHolder != newHolder) {
+                    return super.animateChange(oldHolder, newHolder, preInfo, postInfo);
+                }
+                return animateChangeApiHoneycombMr1(oldHolder, newHolder, preInfo, postInfo);
+            }
+
+            @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR1)
+            private boolean animateChangeApiHoneycombMr1(RecyclerView.ViewHolder oldHolder,
+                    RecyclerView.ViewHolder newHolder,
+                    ItemHolderInfo preInfo, ItemHolderInfo postInfo) {
+                endAnimation(oldHolder);
+                MyItemInfo pre = (MyItemInfo) preInfo;
+                MyItemInfo post = (MyItemInfo) postInfo;
+                MyViewHolder vh = (MyViewHolder) oldHolder;
+
+                CharSequence finalText = post.text;
+
+                if (pre.text.equals(post.text)) {
+                    // same content. Just translate back to 0
+                    final long duration = (long) (getChangeDuration()
+                            * (ViewCompat.getTranslationX(vh.textView) / vh.textView.getWidth()));
+                    mPendingSettleList.put(vh, duration);
+                    // we set it here because previous endAnimation would set it to other value.
+                    vh.textView.setText(finalText);
+                } else {
+                    // different content, get out and come back.
+                    vh.textView.setText(pre.text);
+                    final ItemChangeAnimator anim = new ItemChangeAnimator(vh, finalText,
+                            getChangeDuration()) {
+                        @Override
+                        public void onAnimationEnd(Animator animation) {
+                            setFraction(1f);
+                            dispatchChangeFinished(mViewHolder, true);
+                        }
+
+                        @Override
+                        public void onAnimationStart(Animator animation) {
+                            dispatchChangeStarting(mViewHolder, true);
+                        }
+                    };
+                    mPendingChangeAnimations.add(anim);
+                }
+                return true;
+            }
+
+            @Override
+            public ItemHolderInfo obtainHolderInfo() {
+                return new MyItemInfo();
+            }
+        };
+    }
+
+
+    @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR1)
+    abstract private static class ItemChangeAnimator implements
+            ValueAnimator.AnimatorUpdateListener, Animator.AnimatorListener {
+        CharSequence mFinalText;
+        ValueAnimator mValueAnimator;
+        MyViewHolder mViewHolder;
+        final float mMaxX;
+        final float mStartRatio;
+        public ItemChangeAnimator(MyViewHolder viewHolder, CharSequence finalText, long duration) {
+            mViewHolder = viewHolder;
+            mMaxX = mViewHolder.itemView.getWidth();
+            mStartRatio = ViewCompat.getTranslationX(mViewHolder.textView) / mMaxX;
+            mFinalText = finalText;
+            mValueAnimator = ValueAnimator.ofFloat(0f, 1f);
+            mValueAnimator.addUpdateListener(this);
+            mValueAnimator.addListener(this);
+            mValueAnimator.setDuration(duration);
+            mValueAnimator.setTarget(mViewHolder.itemView);
+        }
+
+        void setFraction(float fraction) {
+            fraction = mStartRatio + (1f - mStartRatio) * fraction;
+            if (fraction < .5f) {
+                ViewCompat.setTranslationX(mViewHolder.textView, fraction * mMaxX);
+                ViewCompat.setAlpha(mViewHolder.textView, 1f - fraction);
+            } else {
+                ViewCompat.setTranslationX(mViewHolder.textView, (1f - fraction) * mMaxX);
+                ViewCompat.setAlpha(mViewHolder.textView, fraction);
+                maybeSetFinalText();
+            }
+        }
+
+        @Override
+        public void onAnimationUpdate(ValueAnimator valueAnimator) {
+            setFraction(valueAnimator.getAnimatedFraction());
+        }
+
+        public void start() {
+            mValueAnimator.start();
+        }
+
+        @Override
+        public void onAnimationEnd(Animator animation) {
+            maybeSetFinalText();
+            ViewCompat.setAlpha(mViewHolder.textView, 1f);
+        }
+
+        public void maybeSetFinalText() {
+            if (mFinalText != null) {
+                mViewHolder.textView.setText(mFinalText);
+                mFinalText = null;
+            }
+        }
+
+        public void end() {
+            mValueAnimator.cancel();
+        }
+
+        @Override
+        public void onAnimationStart(Animator animation) {
+        }
+
+        @Override
+        public void onAnimationCancel(Animator animation) {
+        }
+
+        @Override
+        public void onAnimationRepeat(Animator animation) {
+        }
+    }
+
+    private static class MyItemInfo extends DefaultItemAnimator.ItemHolderInfo {
+        CharSequence text;
+    }
+
+    @Override
+    public boolean onCreateOptionsMenu(Menu menu) {
+        super.onCreateOptionsMenu(menu);
+        MenuItemCompat.setShowAsAction(menu.add("Layout"), MenuItemCompat.SHOW_AS_ACTION_IF_ROOM);
+        return true;
+    }
+
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+        mRecyclerView.requestLayout();
+        return super.onOptionsItemSelected(item);
+    }
+
+    @SuppressWarnings("unused")
+    public void checkboxClicked(View view) {
+        ViewGroup parent = (ViewGroup) view.getParent();
+        boolean selected = ((CheckBox) view).isChecked();
+        MyViewHolder holder = (MyViewHolder) mRecyclerView.getChildViewHolder(parent);
+        mAdapter.selectItem(holder, selected);
+    }
+
+    @SuppressWarnings("unused")
+    public void itemClicked(View view) {
+        ViewGroup parent = (ViewGroup) view;
+        MyViewHolder holder = (MyViewHolder) mRecyclerView.getChildViewHolder(parent);
+        final int position = holder.getAdapterPosition();
+        if (position == RecyclerView.NO_POSITION) {
+            return;
+        }
+        mAdapter.toggleExpanded(holder);
+        mAdapter.notifyItemChanged(position);
+    }
+
+    public void deleteSelectedItems(View view) {
+        int numItems = mItems.size();
+        if (numItems > 0) {
+            for (int i = numItems - 1; i >= 0; --i) {
+                final String itemText = mItems.get(i);
+                boolean selected = mAdapter.mSelected.get(itemText);
+                if (selected) {
+                    removeAtPosition(i);
+                }
+            }
+        }
+    }
+
+    private String generateNewText() {
+        return "Added Item #" + mNumItemsAdded++;
+    }
+
+    public void d1a2d3(View view) {
+        removeAtPosition(1);
+        addAtPosition(2, "Added Item #" + mNumItemsAdded++);
+        removeAtPosition(3);
+    }
+
+    private void removeAtPosition(int position) {
+        if(position < mItems.size()) {
+            mItems.remove(position);
+            mAdapter.notifyItemRemoved(position);
+        }
+    }
+
+    private void addAtPosition(int position, String text) {
+        if (position > mItems.size()) {
+            position = mItems.size();
+        }
+        mItems.add(position, text);
+        mAdapter.mSelected.put(text, Boolean.FALSE);
+        mAdapter.mExpanded.put(text, Boolean.FALSE);
+        mAdapter.notifyItemInserted(position);
+    }
+
+    public void addDeleteItem(View view) {
+        addItem(view);
+        deleteSelectedItems(view);
+    }
+
+    public void deleteAddItem(View view) {
+        deleteSelectedItems(view);
+        addItem(view);
+    }
+
+    public void addItem(View view) {
+        addAtPosition(3, "Added Item #" + mNumItemsAdded++);
+    }
+
+    /**
+     * A basic ListView-style LayoutManager.
+     */
+    class MyLayoutManager extends RecyclerView.LayoutManager {
+        private static final String TAG = "MyLayoutManager";
+        private int mFirstPosition;
+        private final int mScrollDistance;
+
+        public MyLayoutManager(Context c) {
+            final DisplayMetrics dm = c.getResources().getDisplayMetrics();
+            mScrollDistance = (int) (SCROLL_DISTANCE * dm.density + 0.5f);
+        }
+
+        @Override
+        public boolean supportsPredictiveItemAnimations() {
+            return mPredictiveAnimationsEnabled;
+        }
+
+        @Override
+        public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {
+            int parentBottom = getHeight() - getPaddingBottom();
+
+            final View oldTopView = getChildCount() > 0 ? getChildAt(0) : null;
+            int oldTop = getPaddingTop();
+            if (oldTopView != null) {
+                oldTop = Math.min(oldTopView.getTop(), oldTop);
+            }
+
+            // Note that we add everything to the scrap, but we do not clean it up;
+            // that is handled by the RecyclerView after this method returns
+            detachAndScrapAttachedViews(recycler);
+
+            int top = oldTop;
+            int bottom = top;
+            final int left = getPaddingLeft();
+            final int right = getWidth() - getPaddingRight();
+
+            int count = state.getItemCount();
+            for (int i = 0; mFirstPosition + i < count && top < parentBottom; i++, top = bottom) {
+                View v = recycler.getViewForPosition(mFirstPosition + i);
+
+                RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) v.getLayoutParams();
+                addView(v);
+                measureChild(v, 0, 0);
+                bottom = top + v.getMeasuredHeight();
+                v.layout(left, top, right, bottom);
+                if (mPredictiveAnimationsEnabled && params.isItemRemoved()) {
+                    parentBottom += v.getHeight();
+                }
+            }
+
+            if (mAnimationsEnabled && mPredictiveAnimationsEnabled && !state.isPreLayout()) {
+                // Now that we've run a full layout, figure out which views were not used
+                // (cached in previousViews). For each of these views, position it where
+                // it would go, according to its position relative to the visible
+                // positions in the list. This information will be used by RecyclerView to
+                // record post-layout positions of these items for the purposes of animating them
+                // out of view
+
+                View lastVisibleView = getChildAt(getChildCount() - 1);
+                if (lastVisibleView != null) {
+                    RecyclerView.LayoutParams lastParams =
+                            (RecyclerView.LayoutParams) lastVisibleView.getLayoutParams();
+                    int lastPosition = lastParams.getViewLayoutPosition();
+                    final List<RecyclerView.ViewHolder> previousViews = recycler.getScrapList();
+                    count = previousViews.size();
+                    for (int i = 0; i < count; ++i) {
+                        View view = previousViews.get(i).itemView;
+                        RecyclerView.LayoutParams params =
+                                (RecyclerView.LayoutParams) view.getLayoutParams();
+                        if (params.isItemRemoved()) {
+                            continue;
+                        }
+                        int position = params.getViewLayoutPosition();
+                        int newTop;
+                        if (position < mFirstPosition) {
+                            newTop = view.getHeight() * (position - mFirstPosition);
+                        } else {
+                            newTop = lastVisibleView.getTop() + view.getHeight() *
+                                    (position - lastPosition);
+                        }
+                        view.offsetTopAndBottom(newTop - view.getTop());
+                    }
+                }
+            }
+        }
+
+        @Override
+        public RecyclerView.LayoutParams generateDefaultLayoutParams() {
+            return new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
+                    ViewGroup.LayoutParams.WRAP_CONTENT);
+        }
+
+        @Override
+        public boolean canScrollVertically() {
+            return true;
+        }
+
+        @Override
+        public int scrollVerticallyBy(int dy, RecyclerView.Recycler recycler,
+                RecyclerView.State state) {
+            if (getChildCount() == 0) {
+                return 0;
+            }
+
+            int scrolled = 0;
+            final int left = getPaddingLeft();
+            final int right = getWidth() - getPaddingRight();
+            if (dy < 0) {
+                while (scrolled > dy) {
+                    final View topView = getChildAt(0);
+                    final int hangingTop = Math.max(-topView.getTop(), 0);
+                    final int scrollBy = Math.min(scrolled - dy, hangingTop);
+                    scrolled -= scrollBy;
+                    offsetChildrenVertical(scrollBy);
+                    if (mFirstPosition > 0 && scrolled > dy) {
+                        mFirstPosition--;
+                        View v = recycler.getViewForPosition(mFirstPosition);
+                        addView(v, 0);
+                        measureChild(v, 0, 0);
+                        final int bottom = topView.getTop(); // TODO decorated top?
+                        final int top = bottom - v.getMeasuredHeight();
+                        v.layout(left, top, right, bottom);
+                    } else {
+                        break;
+                    }
+                }
+            } else if (dy > 0) {
+                final int parentHeight = getHeight();
+                while (scrolled < dy) {
+                    final View bottomView = getChildAt(getChildCount() - 1);
+                    final int hangingBottom = Math.max(bottomView.getBottom() - parentHeight, 0);
+                    final int scrollBy = -Math.min(dy - scrolled, hangingBottom);
+                    scrolled -= scrollBy;
+                    offsetChildrenVertical(scrollBy);
+                    if (scrolled < dy && state.getItemCount() > mFirstPosition + getChildCount()) {
+                        View v = recycler.getViewForPosition(mFirstPosition + getChildCount());
+                        final int top = getChildAt(getChildCount() - 1).getBottom();
+                        addView(v);
+                        measureChild(v, 0, 0);
+                        final int bottom = top + v.getMeasuredHeight();
+                        v.layout(left, top, right, bottom);
+                    } else {
+                        break;
+                    }
+                }
+            }
+            recycleViewsOutOfBounds(recycler);
+            return scrolled;
+        }
+
+        @Override
+        public View onFocusSearchFailed(View focused, int direction,
+                RecyclerView.Recycler recycler, RecyclerView.State state) {
+            final int oldCount = getChildCount();
+
+            if (oldCount == 0) {
+                return null;
+            }
+
+            final int left = getPaddingLeft();
+            final int right = getWidth() - getPaddingRight();
+
+            View toFocus = null;
+            int newViewsHeight = 0;
+            if (direction == View.FOCUS_UP || direction == View.FOCUS_BACKWARD) {
+                while (mFirstPosition > 0 && newViewsHeight < mScrollDistance) {
+                    mFirstPosition--;
+                    View v = recycler.getViewForPosition(mFirstPosition);
+                    final int bottom = getChildAt(0).getTop(); // TODO decorated top?
+                    addView(v, 0);
+                    measureChild(v, 0, 0);
+                    final int top = bottom - v.getMeasuredHeight();
+                    v.layout(left, top, right, bottom);
+                    if (v.isFocusable()) {
+                        toFocus = v;
+                        break;
+                    }
+                }
+            }
+            if (direction == View.FOCUS_DOWN || direction == View.FOCUS_FORWARD) {
+                while (mFirstPosition + getChildCount() < state.getItemCount() &&
+                        newViewsHeight < mScrollDistance) {
+                    View v = recycler.getViewForPosition(mFirstPosition + getChildCount());
+                    final int top = getChildAt(getChildCount() - 1).getBottom();
+                    addView(v);
+                    measureChild(v, 0, 0);
+                    final int bottom = top + v.getMeasuredHeight();
+                    v.layout(left, top, right, bottom);
+                    if (v.isFocusable()) {
+                        toFocus = v;
+                        break;
+                    }
+                }
+            }
+
+            return toFocus;
+        }
+
+        public void recycleViewsOutOfBounds(RecyclerView.Recycler recycler) {
+            final int childCount = getChildCount();
+            final int parentWidth = getWidth();
+            final int parentHeight = getHeight();
+            boolean foundFirst = false;
+            int first = 0;
+            int last = 0;
+            for (int i = 0; i < childCount; i++) {
+                final View v = getChildAt(i);
+                if (v.hasFocus() || (v.getRight() >= 0 && v.getLeft() <= parentWidth &&
+                        v.getBottom() >= 0 && v.getTop() <= parentHeight)) {
+                    if (!foundFirst) {
+                        first = i;
+                        foundFirst = true;
+                    }
+                    last = i;
+                }
+            }
+            for (int i = childCount - 1; i > last; i--) {
+                removeAndRecycleViewAt(i, recycler);
+            }
+            for (int i = first - 1; i >= 0; i--) {
+                removeAndRecycleViewAt(i, recycler);
+            }
+            if (getChildCount() == 0) {
+                mFirstPosition = 0;
+            } else {
+                mFirstPosition += first;
+            }
+        }
+
+        @Override
+        public void onItemsAdded(RecyclerView recyclerView, int positionStart, int itemCount) {
+            if (positionStart < mFirstPosition) {
+                mFirstPosition += itemCount;
+            }
+        }
+
+        @Override
+        public void onItemsRemoved(RecyclerView recyclerView, int positionStart, int itemCount) {
+            if (positionStart < mFirstPosition) {
+                mFirstPosition -= itemCount;
+            }
+        }
+    }
+
+    class MyAdapter extends RecyclerView.Adapter {
+        private int mBackground;
+        List<String> mData;
+        ArrayMap<String, Boolean> mSelected = new ArrayMap<String, Boolean>();
+        ArrayMap<String, Boolean> mExpanded = new ArrayMap<String, Boolean>();
+
+        public MyAdapter(List<String> data) {
+            TypedValue val = new TypedValue();
+            AnimatedRecyclerView.this.getTheme().resolveAttribute(
+                    R.attr.selectableItemBackground, val, true);
+            mBackground = val.resourceId;
+            mData = data;
+            for (String itemText : mData) {
+                mSelected.put(itemText, Boolean.FALSE);
+                mExpanded.put(itemText, Boolean.FALSE);
+            }
+        }
+
+        @Override
+        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+            MyViewHolder h = new MyViewHolder(getLayoutInflater().inflate(R.layout.selectable_item,
+                    null));
+            h.textView.setMinimumHeight(128);
+            h.textView.setFocusable(true);
+            h.textView.setBackgroundResource(mBackground);
+            return h;
+        }
+
+        @Override
+        public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
+            String itemText = mData.get(position);
+            MyViewHolder myViewHolder = (MyViewHolder) holder;
+            myViewHolder.boundText = itemText;
+            myViewHolder.textView.setText(itemText);
+            boolean selected = false;
+            if (mSelected.get(itemText) != null) {
+                selected = mSelected.get(itemText);
+            }
+            myViewHolder.checkBox.setChecked(selected);
+            Boolean expanded = mExpanded.get(itemText);
+            if (Boolean.TRUE.equals(expanded)) {
+                myViewHolder.textView.setText("More text for the expanded version");
+            } else {
+                myViewHolder.textView.setText(itemText);
+            }
+        }
+
+        @Override
+        public int getItemCount() {
+            return mData.size();
+        }
+
+        public void selectItem(MyViewHolder holder, boolean selected) {
+            mSelected.put(holder.boundText, selected);
+        }
+
+        public void toggleExpanded(MyViewHolder holder) {
+            mExpanded.put(holder.boundText, !mExpanded.get(holder.boundText));
+        }
+    }
+
+    static class MyViewHolder extends RecyclerView.ViewHolder {
+        public TextView textView;
+        public CheckBox checkBox;
+        public String boundText;
+
+        public MyViewHolder(View v) {
+            super(v);
+            textView = (TextView) v.findViewById(R.id.text);
+            checkBox = (CheckBox) v.findViewById(R.id.selected);
+        }
+
+        @Override
+        public String toString() {
+            return super.toString() + " \"" + textView.getText() + "\"";
+        }
+    }
+}
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/widget/AsyncListUtilActivity.java b/samples/Support7Demos/src/com/example/android/supportv7/widget/AsyncListUtilActivity.java
new file mode 100644
index 0000000..8ec3a23
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/widget/AsyncListUtilActivity.java
@@ -0,0 +1,166 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+package com.example.android.supportv7.widget;
+
+import com.example.android.supportv7.Cheeses;
+
+import android.app.Activity;
+import android.content.Context;
+import android.os.Bundle;
+import android.support.v4.view.MenuItemCompat;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.support.v7.util.AsyncListUtil;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+/**
+ * A sample Activity to demonstrate capabilities of {@link AsyncListUtil}.
+ */
+public class AsyncListUtilActivity extends Activity {
+
+    private static final String TAG = "AsyncListUtilActivity";
+
+    private RecyclerView mRecyclerView;
+
+    private LinearLayoutManager mLinearLayoutManager;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        mRecyclerView = new RecyclerView(this);
+        mLinearLayoutManager = new LinearLayoutManager(this);
+        mRecyclerView.setLayoutManager(mLinearLayoutManager);
+        mRecyclerView.setHasFixedSize(true);
+        final ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(
+                ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
+        mRecyclerView.setLayoutParams(layoutParams);
+        mRecyclerView.setAdapter(new AsyncAdapter());
+        setContentView(mRecyclerView);
+    }
+
+    @Override
+    public boolean onCreateOptionsMenu(Menu menu) {
+        super.onCreateOptionsMenu(menu);
+        MenuItemCompat.setShowAsAction(menu.add("Layout"), MenuItemCompat.SHOW_AS_ACTION_IF_ROOM);
+        return true;
+    }
+
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+        mRecyclerView.requestLayout();
+        return super.onOptionsItemSelected(item);
+    }
+
+    private static class TextViewHolder extends RecyclerView.ViewHolder {
+        TextView textView;
+        public TextViewHolder(Context context) {
+            super(new TextView(context));
+            textView = (TextView) itemView;
+        }
+    }
+
+    private class AsyncAdapter extends RecyclerView.Adapter<TextViewHolder> {
+
+        private AsyncListUtil<String> mAsyncListUtil;
+
+        AsyncAdapter() {
+            mAsyncListUtil = new AsyncStringListUtil();
+        }
+
+        @Override
+        public TextViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+            return new TextViewHolder(parent.getContext());
+        }
+
+        @Override
+        public void onBindViewHolder(TextViewHolder holder, int position) {
+            final String itemString = mAsyncListUtil.getItem(position);
+            if (itemString == null) {
+                holder.textView.setText("loading...");
+            } else {
+                holder.textView.setText(itemString);
+            }
+        }
+
+        @Override
+        public int getItemCount() {
+            return mAsyncListUtil.getItemCount();
+        }
+    }
+
+    private class AsyncStringListUtil extends AsyncListUtil<String> {
+
+        private static final int TILE_SIZE = 5;
+
+        private static final long DELAY_MS = 500;
+
+        public AsyncStringListUtil() {
+            super(String.class, TILE_SIZE,
+                    new AsyncListUtil.DataCallback<String>() {
+                        @Override
+                        public int refreshData() {
+                            return Cheeses.sCheeseStrings.length;
+                        }
+
+                        @Override
+                        public void fillData(String[] data, int startPosition, int itemCount) {
+                            sleep();
+                            for (int i = 0; i < itemCount; i++) {
+                                data[i] = Cheeses.sCheeseStrings[startPosition + i];
+                            }
+                        }
+
+                        private void sleep() {
+                            try {
+                                Thread.sleep(DELAY_MS);
+                            } catch (InterruptedException e) {
+                                e.printStackTrace();
+                            }
+                        }
+                    },
+                    new AsyncListUtil.ViewCallback() {
+                        @Override
+                        public void getItemRangeInto(int[] outRange) {
+                            outRange[0] = mLinearLayoutManager.findFirstVisibleItemPosition();
+                            outRange[1] = mLinearLayoutManager.findLastVisibleItemPosition();
+                        }
+
+                        @Override
+                        public void onDataRefresh() {
+                            mRecyclerView.getAdapter().notifyDataSetChanged();
+                        }
+
+                        @Override
+                        public void onItemLoaded(int position) {
+                            mRecyclerView.getAdapter().notifyItemChanged(position);
+                        }
+                    });
+
+            mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
+                @Override
+                public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
+                    onRangeChanged();
+                }
+            });
+        }
+    }
+}
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/widget/BaseLayoutManagerActivity.java b/samples/Support7Demos/src/com/example/android/supportv7/widget/BaseLayoutManagerActivity.java
new file mode 100644
index 0000000..002a574
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/widget/BaseLayoutManagerActivity.java
@@ -0,0 +1,192 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv7.widget;
+
+import com.example.android.supportv7.Cheeses;
+import com.example.android.supportv7.R;
+import com.example.android.supportv7.widget.adapter.SimpleStringAdapter;
+import com.example.android.supportv7.widget.util.ConfigToggle;
+import com.example.android.supportv7.widget.util.ConfigViewHolder;
+
+import android.app.Activity;
+import android.content.Context;
+import android.os.Bundle;
+import android.support.v7.widget.DefaultItemAnimator;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.BaseAdapter;
+import android.widget.CheckBox;
+import android.widget.CompoundButton;
+import android.widget.EditText;
+import android.widget.Spinner;
+import android.widget.TextView;
+
+/**
+ * A simple activity that can be extended to demonstrate LayoutManagers.
+ * <p>
+ * It initializes a sample adapter and a list of configuration options. Extending activities can
+ * define the {@link ConfigToggle} list depending on its functionality.
+ */
+abstract public class BaseLayoutManagerActivity<T extends RecyclerView.LayoutManager>
+        extends Activity {
+
+    protected T mLayoutManager;
+
+    protected RecyclerView mRecyclerView;
+
+    private ConfigToggle[] mConfigToggles;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_base_layout_manager);
+        initToggles();
+        initRecyclerView();
+        initSpinner();
+    }
+
+    abstract protected T createLayoutManager();
+
+    private void initRecyclerView() {
+        mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
+        mRecyclerView.setHasFixedSize(true);
+        mLayoutManager = createLayoutManager();
+        mRecyclerView.setLayoutManager(mLayoutManager);
+        mRecyclerView.setAdapter(createAdapter());
+        ((DefaultItemAnimator)mRecyclerView.getItemAnimator()).setSupportsChangeAnimations(true);
+        onRecyclerViewInit(mRecyclerView);
+    }
+
+    protected void onRecyclerViewInit(RecyclerView recyclerView) {
+
+    }
+
+    protected RecyclerView.Adapter createAdapter() {
+        return new SimpleStringAdapter(this, Cheeses.sCheeseStrings) {
+            @Override
+            public SimpleStringAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
+                    int viewType) {
+                final SimpleStringAdapter.ViewHolder vh = super
+                        .onCreateViewHolder(parent, viewType);
+                vh.itemView.setOnClickListener(new View.OnClickListener() {
+                    @Override
+                    public void onClick(View v) {
+                        final int pos = vh.getAdapterPosition();
+                        if (pos != RecyclerView.NO_POSITION && pos + 1 < getItemCount()) {
+                            swap(pos, pos + 1);
+                        }
+                    }
+                });
+                return vh;
+            }
+        };
+    }
+
+    private void initToggles() {
+        mConfigToggles = createConfigToggles();
+        RecyclerView configView = (RecyclerView) findViewById(R.id.config_recycler_view);
+        configView.setAdapter(mConfigAdapter);
+        configView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL,
+                false));
+        configView.setHasFixedSize(true);
+    }
+
+    public void onScrollClicked(View view) {
+        final EditText scrollOffset = (EditText) findViewById(R.id.scroll_offset);
+        final CheckBox checkBox = (CheckBox) findViewById(R.id.enable_smooth_scroll);
+        final Spinner spinner = (Spinner) findViewById(R.id.spinner);
+
+        Integer offset = null;
+        String offsetString = scrollOffset.getText().toString();
+        try {
+            offset = Integer.parseInt(offsetString);
+        } catch (NumberFormatException ex) {
+
+        }
+        final boolean smooth = checkBox.isChecked();
+        if (offset == null) {
+            scrollToPosition(smooth, spinner.getSelectedItemPosition());
+        } else {
+            scrollToPositionWithOffset(smooth, spinner.getSelectedItemPosition(), offset);
+        }
+    }
+
+    private void initSpinner() {
+        final Spinner spinner = (Spinner) findViewById(R.id.spinner);
+        spinner.setAdapter(new BaseAdapter() {
+            @Override
+            public int getCount() {
+                return mRecyclerView.getAdapter().getItemCount();
+            }
+
+            @Override
+            public Integer getItem(int position) {
+                return position;
+            }
+
+            @Override
+            public long getItemId(int position) {
+                return position;
+            }
+
+            @Override
+            public View getView(int position, View convertView, ViewGroup parent) {
+                if (convertView == null) {
+                    convertView = new TextView(parent.getContext());
+                }
+                ((TextView) convertView).setText(" " + position + " ");
+                return convertView;
+            }
+        });
+    }
+
+    protected void scrollToPosition(boolean smooth, int position) {
+        if (smooth) {
+            mRecyclerView.smoothScrollToPosition(position);
+        } else {
+            mRecyclerView.scrollToPosition(position);
+        }
+    }
+
+    protected void scrollToPositionWithOffset(boolean smooth, int position, int offset) {
+        scrollToPosition(smooth, position);
+    }
+
+    abstract ConfigToggle[] createConfigToggles();
+
+    private RecyclerView.Adapter mConfigAdapter = new RecyclerView.Adapter<ConfigViewHolder>() {
+        @Override
+        public ConfigViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+            return new ConfigViewHolder(LayoutInflater.from(parent.getContext())
+                    .inflate(R.layout.config_view_toggle, parent, false));
+        }
+
+        @Override
+        public void onBindViewHolder(ConfigViewHolder holder, int position) {
+            ConfigToggle toggle = mConfigToggles[position];
+            holder.bind(toggle);
+        }
+
+        @Override
+        public int getItemCount() {
+            return mConfigToggles.length;
+        }
+    };
+}
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/widget/DrawerLayoutActivity.java b/samples/Support7Demos/src/com/example/android/supportv7/widget/DrawerLayoutActivity.java
new file mode 100644
index 0000000..55ad19d
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/widget/DrawerLayoutActivity.java
@@ -0,0 +1,257 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv7.widget;
+
+import android.content.res.Configuration;
+import android.content.res.Resources;
+import android.content.res.TypedArray;
+import android.os.Bundle;
+import android.support.v4.view.GravityCompat;
+import android.support.v4.widget.DrawerLayout;
+import android.support.v7.app.ActionBarDrawerToggle;
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.widget.Toolbar;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewTreeObserver;
+import android.widget.AdapterView;
+import android.widget.ArrayAdapter;
+import android.widget.FrameLayout;
+import android.widget.ListView;
+import android.widget.TextView;
+import com.example.android.supportv7.R;
+import com.example.android.supportv7.Shakespeare;
+
+/**
+ * This example illustrates a common usage of the DrawerLayout widget combined with Toolbar
+ * in the Android support library that respect the
+ * <a href="https://www.google.com/design/spec/patterns/navigation-drawer.html">Material design
+ * guidelines</a> for the drawer component.
+ *
+ *
+ * <p>A DrawerLayout should be positioned at the top of your view hierarchy, placing it
+ * below the action bar but above your content views. The primary content should match_parent
+ * in both dimensions. Each drawer should define a reasonable width and match_parent for height.
+ * Drawer views should be positioned after the content view in your layout to preserve proper
+ * ordering.</p>
+ *
+ * <p>When a navigation (left) drawer is present, the host activity should detect presses of
+ * the action bar's Up affordance as a signal to open and close the navigation drawer.
+ * Items within the drawer should fall into one of two categories.</p>
+ *
+ * <ul>
+ *     <li><strong>View switches</strong>. A view switch follows the same basic policies as
+ *     list or tab navigation in that a view switch does not create navigation history.
+ *     This pattern should only be used at the root activity of a task, leaving some form
+ *     of Up navigation active for activities further down the navigation hierarchy.</li>
+ *     <li><strong>Selective Up</strong>. The drawer allows the user to choose an alternate
+ *     parent for Up navigation. This allows a user to jump across an app's navigation
+ *     hierarchy at will. The application should treat this as it treats Up navigation from
+ *     a different task, replacing the current task stack using TaskStackBuilder or similar.
+ *     This is the only form of navigation drawer that should be used outside of the root
+ *     activity of a task.</li>
+ * </ul>
+ *
+ * <p>Right side drawers should be used for actions, not navigation. This follows the pattern
+ * established by the Action Bar that navigation should be to the left and actions to the right.
+ * An action should be an operation performed on the current contents of the window,
+ * for example enabling or disabling a data overlay on top of the current content.</p>
+ *
+ * <p>When the drawer is open, it is above the application toolbar. On Lollipop versions of the
+ * platform and above the drawer spans the full height of the screen, including behind the system
+ * status bar.</p>
+ */
+public class DrawerLayoutActivity extends AppCompatActivity {
+    private DrawerLayout mDrawerLayout;
+    private ListView mStartDrawer;
+    private FrameLayout mEndDrawer;
+    private TextView mContent;
+
+    private ActionBarDrawerToggle mDrawerToggle;
+    private Toolbar mToolbar;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        setContentView(R.layout.drawer_layout);
+
+        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
+        mStartDrawer = (ListView) findViewById(R.id.start_drawer);
+        mEndDrawer = (FrameLayout) findViewById(R.id.end_drawer);
+        mContent = (TextView) findViewById(R.id.content_text);
+
+        mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
+        mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow_end, GravityCompat.END);
+
+        // The drawer title must be set in order to announce state changes when
+        // accessibility is turned on. This is typically a simple description,
+        // e.g. "Navigation".
+        mDrawerLayout.setDrawerTitle(GravityCompat.START, getString(R.string.drawer_title));
+
+        mStartDrawer.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,
+                Shakespeare.TITLES));
+        mStartDrawer.setOnItemClickListener(new DrawerItemClickListener());
+
+        // Find the toolbar in our layout and set it as the support action bar on the activity.
+        // This is required to have the drawer slide "over" the toolbar.
+        mToolbar = (Toolbar) findViewById(R.id.toolbar);
+        mToolbar.setTitle(R.string.drawer_title);
+        setSupportActionBar(mToolbar);
+
+        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
+        getSupportActionBar().setDisplayShowHomeEnabled(false);
+
+        // ActionBarDrawerToggle provides convenient helpers for tying together the
+        // prescribed interactions between a top-level sliding drawer and the action bar.
+        // Note that, as the Javadocs of ActionBarDrawerToggle constructors say, we are
+        // *not* using a constructor that gets a Toolbar since we're setting our toolbar
+        // dynamically at runtime. Furthermore, as the drawer is sliding over the toolbar,
+        // we are suppressing the morphing animation from hamburger to back arrow by
+        // calling super.onDrawerSlide with slideOffset=0.0f. In case your app only has
+        // top-level pages and doesn't need back arrow visuals at all, you can set up
+        // your activity theme to have attribute named "drawerArrowStyle" that points
+        // to an extension of Widget.AppCompat.DrawerArrowToggle that has its "spinBars"
+        // attribute set to false.
+        mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
+                R.string.drawer_open, R.string.drawer_close) {
+            @Override
+            public void onDrawerOpened(View drawerView) {
+                super.onDrawerOpened(drawerView);
+                super.onDrawerSlide(drawerView, 0.0f);
+            }
+
+            @Override
+            public void onDrawerSlide(View drawerView, float slideOffset) {
+                super.onDrawerSlide(drawerView, 0.0f);
+            }
+        };
+
+        mDrawerLayout.addDrawerListener(mDrawerToggle);
+
+        // Configure the background color fill of the system status bar (on supported platform
+        // versions) and the toolbar itself. We're using the same color, and android:statusBar
+        // from the theme makes the status bar slightly darker.
+        final int metalBlueColor = getResources().getColor(R.color.drawer_sample_metal_blue);
+        mDrawerLayout.setStatusBarBackgroundColor(metalBlueColor);
+        mToolbar.setBackgroundColor(metalBlueColor);
+
+        // Register a pre-draw listener to get the initial width of the DrawerLayout so
+        // that we can determine the width of the drawer based on the Material spec at
+        // https://www.google.com/design/spec/patterns/navigation-drawer.html#navigation-drawer-specs
+        mDrawerLayout.getViewTreeObserver().addOnPreDrawListener(
+                new ViewTreeObserver.OnPreDrawListener() {
+                    @Override
+                    public boolean onPreDraw() {
+                        // What is the width of the entire DrawerLayout?
+                        final int drawerLayoutWidth = mDrawerLayout.getWidth();
+
+                        // What is the action bar size?
+                        final Resources.Theme theme = mDrawerLayout.getContext().getTheme();
+                        final TypedArray a = theme.obtainStyledAttributes(
+                                new int[] { android.support.v7.appcompat.R.attr.actionBarSize });
+                        final int actionBarSize = a.getDimensionPixelSize(0, 0);
+                        if (a != null) {
+                            a.recycle();
+                        }
+
+                        // Compute the width of the drawer and set it on the layout params.
+                        final int idealDrawerWidth = 5 * actionBarSize;
+                        final int maxDrawerWidth = Math.max(0, drawerLayoutWidth - actionBarSize);
+                        final int drawerWidth = Math.min(idealDrawerWidth, maxDrawerWidth);
+
+                        final DrawerLayout.LayoutParams startDrawerLp =
+                                (DrawerLayout.LayoutParams) mStartDrawer.getLayoutParams();
+                        startDrawerLp.width = drawerWidth;
+                        mStartDrawer.setLayoutParams(startDrawerLp);
+
+                        final DrawerLayout.LayoutParams endDrawerLp =
+                                (DrawerLayout.LayoutParams) mEndDrawer.getLayoutParams();
+                        endDrawerLp.width = drawerWidth;
+                        mEndDrawer.setLayoutParams(endDrawerLp);
+
+                        // Remove ourselves as the pre-draw listener since this is a one-time
+                        // configuration.
+                        mDrawerLayout.getViewTreeObserver().removeOnPreDrawListener(this);
+                        return true;
+                    }
+        });
+    }
+
+    @Override
+    protected void onPostCreate(Bundle savedInstanceState) {
+        super.onPostCreate(savedInstanceState);
+
+        // Sync the toggle state after onRestoreInstanceState has occurred.
+        mDrawerToggle.syncState();
+    }
+
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+        /*
+         * The action bar home/up action should open or close the drawer.
+         * The drawer toggle will take care of this.
+         */
+        if (mDrawerToggle.onOptionsItemSelected(item)) {
+            return true;
+        }
+        return super.onOptionsItemSelected(item);
+    }
+
+    @Override
+    public void onBackPressed() {
+        boolean hadOpenDrawer = false;
+        // Is the start drawer open?
+        if (mDrawerLayout.isDrawerOpen(mStartDrawer)) {
+            // Close it
+            mDrawerLayout.closeDrawer(mStartDrawer);
+            hadOpenDrawer = true;
+        }
+        // Is the end drawer open?
+        if (mDrawerLayout.isDrawerOpen(mEndDrawer)) {
+            // Close it
+            mDrawerLayout.closeDrawer(mEndDrawer);
+            hadOpenDrawer = true;
+        }
+
+        if (hadOpenDrawer) {
+            // If we had one or both drawers open, now that we've closed it / them, return.
+            return;
+        }
+
+        super.onBackPressed();
+    }
+
+    @Override
+    public void onConfigurationChanged(Configuration newConfig) {
+        super.onConfigurationChanged(newConfig);
+        mDrawerToggle.onConfigurationChanged(newConfig);
+    }
+
+    /**
+     * This list item click listener implements very simple view switching by changing
+     * the primary content text. The drawer is closed when a selection is made.
+     */
+    private class DrawerItemClickListener implements ListView.OnItemClickListener {
+        @Override
+        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+            mContent.setText(Shakespeare.DIALOGUE[position]);
+            mToolbar.setTitle(Shakespeare.TITLES[position]);
+            mDrawerLayout.closeDrawer(mStartDrawer);
+        }
+    }
+}
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/widget/GridLayoutManagerActivity.java b/samples/Support7Demos/src/com/example/android/supportv7/widget/GridLayoutManagerActivity.java
new file mode 100644
index 0000000..3ce5c60
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/widget/GridLayoutManagerActivity.java
@@ -0,0 +1,137 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.example.android.supportv7.widget;
+
+import com.example.android.supportv7.Cheeses;
+import com.example.android.supportv7.R;
+import com.example.android.supportv7.widget.adapter.SimpleStringAdapter;
+import com.example.android.supportv7.widget.util.ConfigToggle;
+
+import android.support.v4.view.ViewCompat;
+import android.support.v7.widget.GridLayoutManager;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.view.View;
+import android.view.ViewGroup;
+
+/**
+ * A sample Activity to demonstrate capabilities of {@link GridLayoutManager}.
+ */
+public class GridLayoutManagerActivity extends BaseLayoutManagerActivity<GridLayoutManager> {
+    SimpleStringAdapter mAdapter;
+    @Override
+    protected GridLayoutManager createLayoutManager() {
+        GridLayoutManager lm = new GridLayoutManager(this, 3);
+        lm.setReverseLayout(true);
+        lm.setSpanSizeLookup(mSpanSizeLookup);
+        return lm;
+    }
+
+    GridLayoutManager.SpanSizeLookup mSpanSizeLookup = new GridLayoutManager.SpanSizeLookup() {
+        @Override
+        public int getSpanSize(int position) {
+            String item = mAdapter.getValueAt(position);
+            return 1 + (Math.abs(item.hashCode()) % mLayoutManager.getSpanCount());
+        }
+    };
+
+    @Override
+    ConfigToggle[] createConfigToggles() {
+        return new ConfigToggle[]{
+                new ConfigToggle(this, R.string.checkbox_orientation) {
+                    @Override
+                    public boolean isChecked() {
+                        return mLayoutManager.getOrientation() == LinearLayoutManager.HORIZONTAL;
+                    }
+
+                    @Override
+                    public void onChange(boolean newValue) {
+                        mLayoutManager.setOrientation(newValue ? LinearLayoutManager.HORIZONTAL
+                                : LinearLayoutManager.VERTICAL);
+                    }
+                },
+                new ConfigToggle(this, R.string.checkbox_reverse) {
+                    @Override
+                    public boolean isChecked() {
+                        return mLayoutManager.getReverseLayout();
+                    }
+
+                    @Override
+                    public void onChange(boolean newValue) {
+                        mLayoutManager.setReverseLayout(newValue);
+                    }
+                },
+                new ConfigToggle(this, R.string.checkbox_layout_dir) {
+                    @Override
+                    public boolean isChecked() {
+                        return ViewCompat.getLayoutDirection(mRecyclerView) ==
+                                ViewCompat.LAYOUT_DIRECTION_RTL;
+                    }
+
+                    @Override
+                    public void onChange(boolean newValue) {
+                        ViewCompat.setLayoutDirection(mRecyclerView, newValue ?
+                                ViewCompat.LAYOUT_DIRECTION_RTL : ViewCompat.LAYOUT_DIRECTION_LTR);
+                    }
+                },
+                new ConfigToggle(this, R.string.checkbox_stack_from_end) {
+                    @Override
+                    public boolean isChecked() {
+                        return mLayoutManager.getStackFromEnd();
+                    }
+
+                    @Override
+                    public void onChange(boolean newValue) {
+                        mLayoutManager.setStackFromEnd(newValue);
+                    }
+                }
+        };
+    }
+
+    @Override
+    protected void scrollToPositionWithOffset(boolean smooth, int position, int offset) {
+        if (smooth) {
+            super.scrollToPositionWithOffset(smooth, position, offset);
+        } else {
+            mLayoutManager.scrollToPositionWithOffset(position, offset);
+        }
+    }
+
+    protected RecyclerView.Adapter createAdapter() {
+        mAdapter = new SimpleStringAdapter(this, Cheeses.sCheeseStrings) {
+            @Override
+            public SimpleStringAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
+                    int viewType) {
+                final SimpleStringAdapter.ViewHolder vh = super
+                        .onCreateViewHolder(parent, viewType);
+                vh.itemView.setOnClickListener(new View.OnClickListener() {
+                    @Override
+                    public void onClick(View v) {
+                        final int pos = vh.getAdapterPosition();
+                        if (pos == RecyclerView.NO_POSITION) {
+                            return;
+                        }
+                        if (pos + 1 < getItemCount()) {
+                            swap(pos, pos + 1);
+                        }
+                    }
+                });
+                return vh;
+            }
+        };
+        return mAdapter;
+    }
+}
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/widget/LinearLayoutManagerActivity.java b/samples/Support7Demos/src/com/example/android/supportv7/widget/LinearLayoutManagerActivity.java
new file mode 100644
index 0000000..7482e3e
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/widget/LinearLayoutManagerActivity.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv7.widget;
+
+import com.example.android.supportv7.widget.decorator.DividerItemDecoration;
+
+import android.support.v4.view.ViewCompat;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import com.example.android.supportv7.R;
+import com.example.android.supportv7.widget.util.ConfigToggle;
+
+/**
+ * A sample activity that uses {@link LinearLayoutManager}.
+ */
+public class LinearLayoutManagerActivity extends BaseLayoutManagerActivity<LinearLayoutManager> {
+    private DividerItemDecoration mDividerItemDecoration;
+
+    @Override
+    protected LinearLayoutManager createLayoutManager() {
+        return new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
+    }
+
+    @Override
+    protected void onRecyclerViewInit(RecyclerView recyclerView) {
+        mDividerItemDecoration = new DividerItemDecoration(this, mLayoutManager.getOrientation());
+        recyclerView.addItemDecoration(mDividerItemDecoration);
+    }
+
+    @Override
+    ConfigToggle[] createConfigToggles() {
+        return new ConfigToggle[]{
+                new ConfigToggle(this, R.string.checkbox_orientation) {
+                    @Override
+                    public boolean isChecked() {
+                        return mLayoutManager.getOrientation() == LinearLayoutManager.HORIZONTAL;
+                    }
+
+                    @Override
+                    public void onChange(boolean newValue) {
+                        mLayoutManager.setOrientation(newValue ? LinearLayoutManager.HORIZONTAL
+                                : LinearLayoutManager.VERTICAL);
+                        if (mDividerItemDecoration != null) {
+                            mDividerItemDecoration.setOrientation(mLayoutManager.getOrientation());
+                        }
+
+                    }
+                },
+                new ConfigToggle(this, R.string.checkbox_reverse) {
+                    @Override
+                    public boolean isChecked() {
+                        return mLayoutManager.getReverseLayout();
+                    }
+
+                    @Override
+                    public void onChange(boolean newValue) {
+                        mLayoutManager.setReverseLayout(newValue);
+                    }
+                },
+                new ConfigToggle(this, R.string.checkbox_layout_dir) {
+                    @Override
+                    public boolean isChecked() {
+                        return ViewCompat.getLayoutDirection(mRecyclerView) ==
+                                ViewCompat.LAYOUT_DIRECTION_RTL;
+                    }
+
+                    @Override
+                    public void onChange(boolean newValue) {
+                        ViewCompat.setLayoutDirection(mRecyclerView, newValue ?
+                                ViewCompat.LAYOUT_DIRECTION_RTL : ViewCompat.LAYOUT_DIRECTION_LTR);
+                    }
+                },
+                new ConfigToggle(this, R.string.checkbox_stack_from_end) {
+                    @Override
+                    public boolean isChecked() {
+                        return mLayoutManager.getStackFromEnd();
+                    }
+
+                    @Override
+                    public void onChange(boolean newValue) {
+                        mLayoutManager.setStackFromEnd(newValue);
+                    }
+                }
+        };
+    }
+}
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/widget/ListPopupWindowActivity.java b/samples/Support7Demos/src/com/example/android/supportv7/widget/ListPopupWindowActivity.java
new file mode 100644
index 0000000..9e4628e
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/widget/ListPopupWindowActivity.java
@@ -0,0 +1,157 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv7.widget;
+
+import android.os.Bundle;
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.widget.ListPopupWindow;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.AdapterView;
+import android.widget.BaseAdapter;
+import android.widget.Button;
+import android.widget.CheckBox;
+import android.widget.PopupWindow;
+import android.widget.TextView;
+import com.example.android.supportv7.R;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+public class ListPopupWindowActivity extends AppCompatActivity {
+    private ViewGroup mContainer;
+
+    private CheckBox mIsModal;
+
+    private TextView mLog;
+
+    private Button mButton;
+
+    private ListPopupWindow mListPopupWindow;
+
+    private BaseAdapter mListPopupAdapter;
+
+    private SimpleDateFormat mDateFormat;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        setContentView(R.layout.list_popup_window_activity);
+
+        mDateFormat = new SimpleDateFormat("HH:mm:ss.SSS");
+
+        mContainer = (ViewGroup) findViewById(R.id.container);
+        mIsModal = (CheckBox) mContainer.findViewById(R.id.is_modal);
+        mLog = (TextView) mContainer.findViewById(R.id.log);
+        mButton = (Button) mContainer.findViewById(R.id.test_button);
+
+        mButton.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                mListPopupWindow = new ListPopupWindow(mContainer.getContext());
+
+                final String[] POPUP_CONTENT =
+                        new String[] { "Alice", "Bob", "Charlie", "Deirdre", "El" };
+                mListPopupAdapter = new BaseAdapter() {
+                    class ViewHolder {
+                        private TextView title;
+                        private TextView shortcut;
+                    }
+
+                    @Override
+                    public int getCount() {
+                        return POPUP_CONTENT.length;
+                    }
+
+                    @Override
+                    public Object getItem(int position) {
+                        return POPUP_CONTENT[position];
+                    }
+
+                    @Override
+                    public long getItemId(int position) {
+                        return position;
+                    }
+
+                    @Override
+                    public View getView(int position, View convertView, ViewGroup parent) {
+                        if (convertView == null) {
+                            convertView = LayoutInflater.from(parent.getContext()).inflate(
+                                    R.layout.abc_popup_menu_item_layout, parent, false);
+                            ViewHolder viewHolder = new ViewHolder();
+                            viewHolder.title = (TextView) convertView.findViewById(R.id.title);
+                            viewHolder.shortcut =
+                                    (TextView) convertView.findViewById(R.id.shortcut);
+                            convertView.setTag(viewHolder);
+                        }
+
+                        ViewHolder viewHolder = (ViewHolder) convertView.getTag();
+                        viewHolder.title.setText(POPUP_CONTENT[position]);
+                        viewHolder.shortcut.setVisibility(View.GONE);
+                        return convertView;
+                    }
+                };
+
+                mListPopupWindow.setAdapter(mListPopupAdapter);
+                mListPopupWindow.setAnchorView(mButton);
+
+                // Register a listener to be notified when an item in our popup window has
+                // been clicked.
+                mListPopupWindow.setOnItemClickListener(new AdapterView.OnItemClickListener() {
+                    @Override
+                    public void onItemClick(AdapterView<?> parent, View view, int position,
+                            long id) {
+                        addToLog("Item #"+ position + " clicked");
+                        addToLog("Dismissing popup window");
+                        mListPopupWindow.dismiss();
+                    }
+                });
+
+                // Register a listener to be notified when our popup window is dismissed.
+                mListPopupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {
+                    @Override
+                    public void onDismiss() {
+                        addToLog("Popup window dismissed");
+                    }
+                });
+
+                // Set popup window modality based on the current checkbox state.
+                mListPopupWindow.setModal(mIsModal.isChecked());
+
+                // and show it
+                mListPopupWindow.show();
+            }
+        });
+
+        // Set up a click listener on the log text view. When the popup window is in modal
+        // mode and is dismissed by tapping outside of its bounds *and* over the log text
+        // view bounds, we should *not* get this click listener invoked.
+        mLog.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                addToLog("Log view clicked");
+            }
+        });
+    }
+
+    private void addToLog(String toLog) {
+        String toPrepend = mDateFormat.format(new Date()) + " " + toLog + "\n";
+        mLog.setText(toPrepend + mLog.getText());
+    }
+}
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/widget/PopupMenuActivity.java b/samples/Support7Demos/src/com/example/android/supportv7/widget/PopupMenuActivity.java
new file mode 100644
index 0000000..2701c82
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/widget/PopupMenuActivity.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv7.widget;
+
+import android.os.Bundle;
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.widget.PopupMenu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.TextView;
+import com.example.android.supportv7.R;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+public class PopupMenuActivity extends AppCompatActivity {
+    private ViewGroup mContainer;
+
+    private TextView mLog;
+
+    private Button mButton;
+
+    private PopupMenu mPopupMenu;
+
+    private SimpleDateFormat mDateFormat;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        setContentView(R.layout.popup_menu_activity);
+
+        mDateFormat = new SimpleDateFormat("HH:mm:ss.SSS");
+
+        mContainer = (ViewGroup) findViewById(R.id.container);
+        mLog = (TextView) mContainer.findViewById(R.id.log);
+        mButton = (Button) mContainer.findViewById(R.id.test_button);
+
+        mButton.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                mPopupMenu = new PopupMenu(mContainer.getContext(), mButton);
+                final MenuInflater menuInflater = mPopupMenu.getMenuInflater();
+                menuInflater.inflate(R.menu.popup_menu, mPopupMenu.getMenu());
+
+                // Register a listener to be notified when a menu item in our popup menu has
+                // been clicked.
+                mPopupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
+                    @Override
+                    public boolean onMenuItemClick(MenuItem item) {
+                        addToLog("Item '"+ item.getTitle() + "' clicked");
+                        return true;
+                    }
+                });
+
+                // Register a listener to be notified when our popup menu is dismissed.
+                mPopupMenu.setOnDismissListener(new PopupMenu.OnDismissListener() {
+                    @Override
+                    public void onDismiss(PopupMenu menu) {
+                        addToLog("Popup menu dismissed");
+                    }
+                });
+
+                // Show the popup menu
+                mPopupMenu.show();
+            }
+        });
+    }
+
+    private void addToLog(String toLog) {
+        String toPrepend = mDateFormat.format(new Date()) + " " + toLog + "\n";
+        mLog.setText(toPrepend + mLog.getText());
+    }
+}
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/widget/RecyclerViewActivity.java b/samples/Support7Demos/src/com/example/android/supportv7/widget/RecyclerViewActivity.java
new file mode 100644
index 0000000..38b50bd
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/widget/RecyclerViewActivity.java
@@ -0,0 +1,279 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+package com.example.android.supportv7.widget;
+
+import com.example.android.supportv7.Cheeses;
+import com.example.android.supportv7.widget.adapter.SimpleStringAdapter;
+import com.example.android.supportv7.widget.decorator.DividerItemDecoration;
+
+import android.app.Activity;
+import android.content.Context;
+import android.os.Bundle;
+import android.support.v4.view.MenuItemCompat;
+import android.support.v7.widget.RecyclerView;
+import android.util.DisplayMetrics;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewGroup;
+
+public class RecyclerViewActivity extends Activity {
+
+    private static final String TAG = "RecyclerViewActivity";
+
+    private RecyclerView mRecyclerView;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        final RecyclerView rv = new RecyclerView(this);
+        rv.setLayoutManager(new MyLayoutManager(this));
+        rv.setHasFixedSize(true);
+        rv.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
+                ViewGroup.LayoutParams.MATCH_PARENT));
+        rv.setAdapter(new SimpleStringAdapter(this, Cheeses.sCheeseStrings) {
+            @Override
+            public SimpleStringAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
+                    int viewType) {
+                final SimpleStringAdapter.ViewHolder vh = super
+                        .onCreateViewHolder(parent, viewType);
+                vh.itemView.setOnClickListener(new View.OnClickListener() {
+                    @Override
+                    public void onClick(View v) {
+                        final int pos = vh.getAdapterPosition();
+                        if (pos == RecyclerView.NO_POSITION) {
+                            return;
+                        }
+                        if (pos + 1 < getItemCount()) {
+                            swap(pos, pos + 1);
+                        }
+                    }
+                });
+                return vh;
+            }
+        });
+        rv.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL_LIST));
+        setContentView(rv);
+        mRecyclerView = rv;
+    }
+
+    @Override
+    public boolean onCreateOptionsMenu(Menu menu) {
+        super.onCreateOptionsMenu(menu);
+        MenuItemCompat.setShowAsAction(menu.add("Layout"), MenuItemCompat.SHOW_AS_ACTION_IF_ROOM);
+        return true;
+    }
+
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+        mRecyclerView.requestLayout();
+        return super.onOptionsItemSelected(item);
+    }
+
+    private static final int SCROLL_DISTANCE = 80; // dp
+
+    /**
+     * A basic ListView-style LayoutManager.
+     */
+    class MyLayoutManager extends RecyclerView.LayoutManager {
+
+        private static final String TAG = "MyLayoutManager";
+
+        private int mFirstPosition;
+
+        private final int mScrollDistance;
+
+        public MyLayoutManager(Context c) {
+            final DisplayMetrics dm = c.getResources().getDisplayMetrics();
+            mScrollDistance = (int) (SCROLL_DISTANCE * dm.density + 0.5f);
+        }
+
+        @Override
+        public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {
+            final int parentBottom = getHeight() - getPaddingBottom();
+            final View oldTopView = getChildCount() > 0 ? getChildAt(0) : null;
+            int oldTop = getPaddingTop();
+            if (oldTopView != null) {
+                oldTop = oldTopView.getTop();
+            }
+
+            detachAndScrapAttachedViews(recycler);
+
+            int top = oldTop;
+            int bottom;
+            final int left = getPaddingLeft();
+            final int right = getWidth() - getPaddingRight();
+
+            final int count = state.getItemCount();
+            for (int i = 0; mFirstPosition + i < count && top < parentBottom; i++, top = bottom) {
+                View v = recycler.getViewForPosition(mFirstPosition + i);
+                addView(v, i);
+                measureChildWithMargins(v, 0, 0);
+                bottom = top + getDecoratedMeasuredHeight(v);
+                layoutDecorated(v, left, top, right, bottom);
+            }
+        }
+
+        @Override
+        public RecyclerView.LayoutParams generateDefaultLayoutParams() {
+            return new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
+                    ViewGroup.LayoutParams.WRAP_CONTENT);
+        }
+
+        @Override
+        public boolean canScrollVertically() {
+            return true;
+        }
+
+        @Override
+        public int scrollVerticallyBy(int dy, RecyclerView.Recycler recycler,
+                RecyclerView.State state) {
+            if (getChildCount() == 0) {
+                return 0;
+            }
+
+            int scrolled = 0;
+            final int left = getPaddingLeft();
+            final int right = getWidth() - getPaddingRight();
+            if (dy < 0) {
+                while (scrolled > dy) {
+                    final View topView = getChildAt(0);
+                    final int hangingTop = Math.max(-getDecoratedTop(topView), 0);
+                    final int scrollBy = Math.min(scrolled - dy, hangingTop);
+                    scrolled -= scrollBy;
+                    offsetChildrenVertical(scrollBy);
+                    if (mFirstPosition > 0 && scrolled > dy) {
+                        mFirstPosition--;
+                        View v = recycler.getViewForPosition(mFirstPosition);
+                        addView(v, 0);
+                        measureChildWithMargins(v, 0, 0);
+                        final int bottom = getDecoratedTop(topView);
+                        final int top = bottom - getDecoratedMeasuredHeight(v);
+                        layoutDecorated(v, left, top, right, bottom);
+                    } else {
+                        break;
+                    }
+                }
+            } else if (dy > 0) {
+                final int parentHeight = getHeight();
+                while (scrolled < dy) {
+                    final View bottomView = getChildAt(getChildCount() - 1);
+                    final int hangingBottom =
+                            Math.max(getDecoratedBottom(bottomView) - parentHeight, 0);
+                    final int scrollBy = -Math.min(dy - scrolled, hangingBottom);
+                    scrolled -= scrollBy;
+                    offsetChildrenVertical(scrollBy);
+                    if (scrolled < dy && state.getItemCount() > mFirstPosition + getChildCount()) {
+                        View v = recycler.getViewForPosition(mFirstPosition + getChildCount());
+                        final int top = getDecoratedBottom(getChildAt(getChildCount() - 1));
+                        addView(v);
+                        measureChildWithMargins(v, 0, 0);
+                        final int bottom = top + getDecoratedMeasuredHeight(v);
+                        layoutDecorated(v, left, top, right, bottom);
+                    } else {
+                        break;
+                    }
+                }
+            }
+            recycleViewsOutOfBounds(recycler);
+            return scrolled;
+        }
+
+        @Override
+        public View onFocusSearchFailed(View focused, int direction,
+                RecyclerView.Recycler recycler, RecyclerView.State state) {
+            final int oldCount = getChildCount();
+
+            if (oldCount == 0) {
+                return null;
+            }
+
+            final int left = getPaddingLeft();
+            final int right = getWidth() - getPaddingRight();
+
+            View toFocus = null;
+            int newViewsHeight = 0;
+            if (direction == View.FOCUS_UP || direction == View.FOCUS_BACKWARD) {
+                while (mFirstPosition > 0 && newViewsHeight < mScrollDistance) {
+                    mFirstPosition--;
+                    View v = recycler.getViewForPosition(mFirstPosition);
+                    final int bottom = getDecoratedTop(getChildAt(0));
+                    addView(v, 0);
+                    measureChildWithMargins(v, 0, 0);
+                    final int top = bottom - getDecoratedMeasuredHeight(v);
+                    layoutDecorated(v, left, top, right, bottom);
+                    if (v.isFocusable()) {
+                        toFocus = v;
+                        break;
+                    }
+                }
+            }
+            if (direction == View.FOCUS_DOWN || direction == View.FOCUS_FORWARD) {
+                while (mFirstPosition + getChildCount() < state.getItemCount() &&
+                        newViewsHeight < mScrollDistance) {
+                    View v = recycler.getViewForPosition(mFirstPosition + getChildCount());
+                    final int top = getDecoratedBottom(getChildAt(getChildCount() - 1));
+                    addView(v);
+                    measureChildWithMargins(v, 0, 0);
+                    final int bottom = top + getDecoratedMeasuredHeight(v);
+                    layoutDecorated(v, left, top, right, bottom);
+                    if (v.isFocusable()) {
+                        toFocus = v;
+                        break;
+                    }
+                }
+            }
+
+            return toFocus;
+        }
+
+        public void recycleViewsOutOfBounds(RecyclerView.Recycler recycler) {
+            final int childCount = getChildCount();
+            final int parentWidth = getWidth();
+            final int parentHeight = getHeight();
+            boolean foundFirst = false;
+            int first = 0;
+            int last = 0;
+            for (int i = 0; i < childCount; i++) {
+                final View v = getChildAt(i);
+                if (v.hasFocus() || (getDecoratedRight(v) >= 0 &&
+                        getDecoratedLeft(v) <= parentWidth &&
+                        getDecoratedBottom(v) >= 0 &&
+                        getDecoratedTop(v) <= parentHeight)) {
+                    if (!foundFirst) {
+                        first = i;
+                        foundFirst = true;
+                    }
+                    last = i;
+                }
+            }
+            for (int i = childCount - 1; i > last; i--) {
+                removeAndRecycleViewAt(i, recycler);
+            }
+            for (int i = first - 1; i >= 0; i--) {
+                removeAndRecycleViewAt(i, recycler);
+            }
+            if (getChildCount() == 0) {
+                mFirstPosition = 0;
+            } else {
+                mFirstPosition += first;
+            }
+        }
+    }
+}
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/widget/StaggeredGridLayoutManagerActivity.java b/samples/Support7Demos/src/com/example/android/supportv7/widget/StaggeredGridLayoutManagerActivity.java
new file mode 100644
index 0000000..39d8657
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/widget/StaggeredGridLayoutManagerActivity.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv7.widget;
+
+import com.example.android.supportv7.R;
+import com.example.android.supportv7.widget.util.ConfigToggle;
+
+import android.support.v7.widget.StaggeredGridLayoutManager;
+
+public class StaggeredGridLayoutManagerActivity
+        extends BaseLayoutManagerActivity<StaggeredGridLayoutManager> {
+
+    private boolean mVertical = true;
+
+    @Override
+    protected StaggeredGridLayoutManager createLayoutManager() {
+        if (mVertical) {
+            return new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL);
+        } else {
+            return new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.HORIZONTAL);
+        }
+    }
+
+    @Override
+    ConfigToggle[] createConfigToggles() {
+        return new ConfigToggle[] {
+                new ConfigToggle(this, R.string.vertical) {
+                    @Override
+                    public boolean isChecked() {
+                        return mVertical;
+                    }
+
+                    @Override
+                    public void onChange(boolean newValue) {
+                        if (mVertical == newValue) {
+                            return;
+                        }
+                        mVertical = newValue;
+                        mRecyclerView.setLayoutManager(createLayoutManager());
+                    }
+                }
+        };
+    }
+}
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/widget/adapter/SimpleStringAdapter.java b/samples/Support7Demos/src/com/example/android/supportv7/widget/adapter/SimpleStringAdapter.java
new file mode 100644
index 0000000..49f1e19
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/widget/adapter/SimpleStringAdapter.java
@@ -0,0 +1,113 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv7.widget.adapter;
+
+import android.content.Context;
+import android.graphics.Color;
+import android.support.v7.widget.RecyclerView;
+import android.util.TypedValue;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import java.util.ArrayList;
+import java.util.Collections;
+
+public class SimpleStringAdapter extends RecyclerView.Adapter<SimpleStringAdapter.ViewHolder> {
+
+    private int mBackground;
+
+    private ArrayList<String> mValues;
+
+    public static class ViewHolder extends RecyclerView.ViewHolder {
+        public String mBoundString;
+        public TextView mTextView;
+
+        public ViewHolder(TextView v) {
+            super(v);
+            mTextView = v;
+        }
+
+        @Override
+        public String toString() {
+            return super.toString() + " '" + mTextView.getText();
+        }
+    }
+
+    public String getValueAt(int position) {
+        return mValues.get(position);
+    }
+
+    public SimpleStringAdapter(Context context, String[] strings) {
+        TypedValue val = new TypedValue();
+        if (context.getTheme() != null) {
+            context.getTheme().resolveAttribute(
+                    android.R.attr.selectableItemBackground, val, true);
+        }
+        mBackground = val.resourceId;
+        mValues = new ArrayList<String>();
+        Collections.addAll(mValues, strings);
+    }
+
+    public void swap(int pos1, int pos2) {
+        String tmp = mValues.get(pos1);
+        mValues.set(pos1, mValues.get(pos2));
+        mValues.set(pos2, tmp);
+        notifyItemRemoved(pos1);
+        notifyItemInserted(pos2);
+    }
+
+    @Override
+    public SimpleStringAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+        final ViewHolder h = new ViewHolder(new TextView(parent.getContext()));
+        h.mTextView.setMinimumHeight(128);
+        h.mTextView.setPadding(20, 0, 20, 0);
+        h.mTextView.setFocusable(true);
+        h.mTextView.setBackgroundResource(mBackground);
+        RecyclerView.LayoutParams lp = new RecyclerView.LayoutParams(
+                ViewGroup.LayoutParams.WRAP_CONTENT,
+                ViewGroup.LayoutParams.WRAP_CONTENT);
+        lp.leftMargin = 10;
+        lp.rightMargin = 5;
+        lp.topMargin = 20;
+        lp.bottomMargin = 15;
+        h.mTextView.setLayoutParams(lp);
+        return h;
+    }
+
+    @Override
+    public void onBindViewHolder(ViewHolder holder, int position) {
+        holder.mBoundString = mValues.get(position);
+        holder.mTextView.setText(position + ":" + mValues.get(position));
+        holder.mTextView.setMinHeight((200 + mValues.get(position).length() * 10));
+        holder.mTextView.setBackgroundColor(getBackgroundColor(position));
+    }
+
+    private int getBackgroundColor(int position) {
+        switch (position % 4) {
+            case 0: return Color.BLACK;
+            case 1: return Color.RED;
+            case 2: return Color.DKGRAY;
+            case 3: return Color.BLUE;
+        }
+        return Color.TRANSPARENT;
+    }
+
+    @Override
+    public int getItemCount() {
+        return mValues.size();
+    }
+}
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/widget/decorator/DividerItemDecoration.java b/samples/Support7Demos/src/com/example/android/supportv7/widget/decorator/DividerItemDecoration.java
new file mode 100644
index 0000000..4386f4f
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/widget/decorator/DividerItemDecoration.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv7.widget.decorator;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.Canvas;
+import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
+import android.support.v4.view.ViewCompat;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.view.View;
+
+public class DividerItemDecoration extends RecyclerView.ItemDecoration {
+
+    private static final int[] ATTRS = new int[]{
+            android.R.attr.listDivider
+    };
+
+    public static final int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL;
+
+    public static final int VERTICAL_LIST = LinearLayoutManager.VERTICAL;
+
+    private Drawable mDivider;
+
+    private int mOrientation;
+
+    public DividerItemDecoration(Context context, int orientation) {
+        final TypedArray a = context.obtainStyledAttributes(ATTRS);
+        mDivider = a.getDrawable(0);
+        a.recycle();
+        setOrientation(orientation);
+    }
+
+    public void setOrientation(int orientation) {
+        if (orientation != HORIZONTAL_LIST && orientation != VERTICAL_LIST) {
+            throw new IllegalArgumentException("invalid orientation");
+        }
+        mOrientation = orientation;
+    }
+
+    @Override
+    public void onDraw(Canvas c, RecyclerView parent) {
+        if (mOrientation == VERTICAL_LIST) {
+            drawVertical(c, parent);
+        } else {
+            drawHorizontal(c, parent);
+        }
+    }
+
+    public void drawVertical(Canvas c, RecyclerView parent) {
+        final int left = parent.getPaddingLeft();
+        final int right = parent.getWidth() - parent.getPaddingRight();
+
+        final int childCount = parent.getChildCount();
+        for (int i = 0; i < childCount; i++) {
+            final View child = parent.getChildAt(i);
+            final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
+                    .getLayoutParams();
+            final int top = child.getBottom() + params.bottomMargin +
+                    Math.round(ViewCompat.getTranslationY(child));
+            final int bottom = top + mDivider.getIntrinsicHeight();
+            mDivider.setBounds(left, top, right, bottom);
+            mDivider.draw(c);
+        }
+    }
+
+    public void drawHorizontal(Canvas c, RecyclerView parent) {
+        final int top = parent.getPaddingTop();
+        final int bottom = parent.getHeight() - parent.getPaddingBottom();
+
+        final int childCount = parent.getChildCount();
+        for (int i = 0; i < childCount; i++) {
+            final View child = parent.getChildAt(i);
+            final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
+                    .getLayoutParams();
+            final int left = child.getRight() + params.rightMargin +
+                    Math.round(ViewCompat.getTranslationX(child));
+            final int right = left + mDivider.getIntrinsicHeight();
+            mDivider.setBounds(left, top, right, bottom);
+            mDivider.draw(c);
+        }
+    }
+
+    @Override
+    public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent) {
+        if (mOrientation == VERTICAL_LIST) {
+            outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());
+        } else {
+            outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);
+        }
+    }
+}
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/widget/touch/DragAndDropActivity.java b/samples/Support7Demos/src/com/example/android/supportv7/widget/touch/DragAndDropActivity.java
new file mode 100644
index 0000000..7f9f7e5
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/widget/touch/DragAndDropActivity.java
@@ -0,0 +1,127 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv7.widget.touch;
+
+import com.example.android.supportv7.R;
+import com.example.android.supportv7.widget.util.ConfigToggle;
+
+import android.annotation.TargetApi;
+import android.os.Build;
+import android.support.v4.view.MotionEventCompat;
+import android.support.v7.widget.RecyclerView;
+import android.support.v7.widget.helper.ItemTouchHelper;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewGroup;
+
+public class DragAndDropActivity extends ItemTouchHelperActivity {
+
+    boolean mDragUpEnabled = true;
+    boolean mDragDownEnabled = true;
+    boolean mLongPressDragEnabled = true;
+
+    @Override
+    ConfigToggle[] createConfigToggles() {
+        return new ConfigToggle[]{
+                new ConfigToggle(this, R.string.drag_up) {
+                    @Override
+                    public boolean isChecked() {
+                        return mDragUpEnabled;
+                    }
+
+                    @Override
+                    public void onChange(boolean newValue) {
+                        mDragUpEnabled = newValue;
+                    }
+                },
+                new ConfigToggle(this, R.string.drag_down) {
+                    @Override
+                    public boolean isChecked() {
+                        return mDragDownEnabled;
+                    }
+
+                    @Override
+                    public void onChange(boolean newValue) {
+                        mDragDownEnabled = newValue;
+                    }
+                },
+                new ConfigToggle(this, R.string.long_press_drag) {
+                    @Override
+                    public boolean isChecked() {
+                        return mLongPressDragEnabled;
+                    }
+
+                    @Override
+                    public void onChange(boolean newValue) {
+                        mLongPressDragEnabled = newValue;
+                        mAdapter.notifyDataSetChanged();
+                    }
+                }
+        };
+    }
+
+    @Override
+    public boolean isLongPressDragEnabled() {
+        return mLongPressDragEnabled;
+    }
+
+    @Override
+    public void onBind(ItemTouchViewHolder viewHolder) {
+        super.onBind(viewHolder);
+        viewHolder.actionButton.setVisibility(mLongPressDragEnabled ? View.GONE : View.VISIBLE);
+    }
+
+    @Override
+    public void clearView(RecyclerView.ViewHolder viewHolder) {
+        super.clearView(viewHolder);
+        ItemTouchViewHolder touchVH = (ItemTouchViewHolder) viewHolder;
+        touchVH.cardView.setCardBackgroundColor(getResources().getColor(android.R.color.white));
+        touchVH.overlay.setVisibility(View.GONE);
+    }
+
+    @Override
+    public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
+        ItemTouchViewHolder touchVH = (ItemTouchViewHolder) viewHolder;
+        if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
+            touchVH.cardView.setCardBackgroundColor(getResources().getColor(R.color.card_aquatic));
+        }
+        super.onSelectedChanged(viewHolder, actionState);
+    }
+
+    @Override
+    public ItemTouchViewHolder onCreateViewHolder(ViewGroup parent) {
+        final ItemTouchViewHolder vh = super.onCreateViewHolder(parent);
+        vh.actionButton.setText(R.string.drag);
+        vh.actionButton.setOnTouchListener(new View.OnTouchListener() {
+            @Override
+            public boolean onTouch(View v, MotionEvent event) {
+                if (MotionEventCompat.getActionMasked(event) == MotionEvent.ACTION_DOWN) {
+                    mItemTouchHelper.startDrag(vh);
+                }
+                return false;
+            }
+        });
+        return vh;
+    }
+
+    @Override
+    public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
+        return mCallback.makeMovementFlags(
+                (mDragUpEnabled ? ItemTouchHelper.UP : 0) |
+                        (mDragDownEnabled ? ItemTouchHelper.DOWN : 0), 0);
+    }
+}
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/widget/touch/ItemTouchHelperActivity.java b/samples/Support7Demos/src/com/example/android/supportv7/widget/touch/ItemTouchHelperActivity.java
new file mode 100644
index 0000000..54a0bb3
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/widget/touch/ItemTouchHelperActivity.java
@@ -0,0 +1,283 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv7.widget.touch;
+
+import com.example.android.supportv7.Cheeses;
+import com.example.android.supportv7.R;
+import com.example.android.supportv7.widget.util.ConfigToggle;
+import com.example.android.supportv7.widget.util.ConfigViewHolder;
+
+import android.app.Activity;
+import android.graphics.Canvas;
+import android.os.Bundle;
+import android.support.v7.widget.CardView;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.support.v7.widget.helper.ItemTouchHelper;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.TextView;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * Sample activity from which ItemTouchHelper demo activities inherit.
+ */
+abstract public class ItemTouchHelperActivity extends Activity {
+
+    public RecyclerView mRecyclerView;
+
+    public ItemTouchAdapter mAdapter;
+
+    public ItemTouchHelper mItemTouchHelper;
+
+    public ItemTouchHelper.Callback mCallback;
+
+    private ConfigToggle[] mConfigToggles;
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_item_touch);
+        mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
+        mRecyclerView.setHasFixedSize(true);
+        mAdapter = createAdapter();
+        mRecyclerView.setAdapter(mAdapter);
+        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
+        mItemTouchHelper = createItemTouchHelper();
+        mItemTouchHelper.attachToRecyclerView(mRecyclerView);
+        initToggles();
+    }
+
+    private void initToggles() {
+        mConfigToggles = createConfigToggles();
+        RecyclerView configView = (RecyclerView) findViewById(R.id.config_recycler_view);
+        configView.setAdapter(new RecyclerView.Adapter<ConfigViewHolder>() {
+            @Override
+            public ConfigViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+                return new ConfigViewHolder(LayoutInflater.from(parent.getContext())
+                        .inflate(R.layout.config_view_toggle, parent, false));
+            }
+
+            @Override
+            public void onBindViewHolder(ConfigViewHolder holder, int position) {
+                ConfigToggle toggle = mConfigToggles[position];
+                holder.bind(toggle);
+            }
+
+            @Override
+            public int getItemCount() {
+                return mConfigToggles.length;
+            }
+        });
+        configView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL,
+                false));
+        configView.setHasFixedSize(true);
+    }
+
+    abstract ConfigToggle[] createConfigToggles();
+
+    public ItemTouchHelper createItemTouchHelper() {
+        mCallback = createCallback();
+        return new ItemTouchHelper(mCallback);
+    }
+
+    public ItemTouchHelper.Callback createCallback() {
+        return new ItemTouchHelper.Callback() {
+            @Override
+            public int getMovementFlags(RecyclerView recyclerView,
+                    RecyclerView.ViewHolder viewHolder) {
+                return ItemTouchHelperActivity.this.getMovementFlags(recyclerView, viewHolder);
+            }
+
+            @Override
+            public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder,
+                    RecyclerView.ViewHolder target) {
+                mAdapter.move(viewHolder.getAdapterPosition(), target.getAdapterPosition());
+                return true;
+            }
+
+            @Override
+            public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
+                mAdapter.delete(viewHolder.getAdapterPosition());
+            }
+
+            @Override
+            public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
+                super.onSelectedChanged(viewHolder, actionState);
+                ItemTouchHelperActivity.this.onSelectedChanged(viewHolder, actionState);
+            }
+
+            @Override
+            public void onChildDraw(Canvas c, RecyclerView recyclerView,
+                    RecyclerView.ViewHolder viewHolder,
+                    float dX, float dY, int actionState, boolean isCurrentlyActive) {
+                if (ItemTouchHelperActivity.this.onChildDraw(c, recyclerView, viewHolder,
+                        dX, dY, actionState, isCurrentlyActive)) {
+                    return;
+                }
+                super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState,
+                        isCurrentlyActive);
+            }
+
+            @Override
+            public void onChildDrawOver(Canvas c, RecyclerView recyclerView,
+                    RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState,
+                    boolean isCurrentlyActive) {
+                if (ItemTouchHelperActivity.this.onChildDrawOver(c, recyclerView, viewHolder,
+                        dX, dY, actionState, isCurrentlyActive)) {
+                    return;
+                }
+                super.onChildDrawOver(c, recyclerView, viewHolder, dX, dY, actionState,
+                        isCurrentlyActive);
+            }
+
+            @Override
+            public boolean isLongPressDragEnabled() {
+                return ItemTouchHelperActivity.this.isLongPressDragEnabled();
+            }
+
+            @Override
+            public boolean isItemViewSwipeEnabled() {
+                return ItemTouchHelperActivity.this.isPointerSwipeEnabled();
+            }
+
+            @Override
+            public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
+                super.clearView(recyclerView, viewHolder);
+                ItemTouchHelperActivity.this.clearView(viewHolder);
+            }
+        };
+    }
+
+    /**
+     * @return True if we should NOT call parent
+     */
+    public boolean onChildDraw(Canvas c, RecyclerView recyclerView,
+            RecyclerView.ViewHolder viewHolder,
+            float dX, float dY, int actionState, boolean isCurrentlyActive) {
+        return false;
+    }
+
+    /**
+     * @return True if we should NOT call parent
+     */
+    public boolean onChildDrawOver(Canvas c, RecyclerView recyclerView,
+            RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState,
+            boolean isCurrentlyActive) {
+        return false;
+    }
+
+    public void clearView(RecyclerView.ViewHolder viewHolder) {
+
+    }
+
+    public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
+
+    }
+
+    public boolean isLongPressDragEnabled() {
+        return true;
+    }
+
+    public boolean isPointerSwipeEnabled() {
+        return true;
+    }
+
+    public ItemTouchViewHolder onCreateViewHolder(ViewGroup parent) {
+        ItemTouchViewHolder itemTouchViewHolder = new ItemTouchViewHolder(
+                LayoutInflater.from(parent.getContext())
+                        .inflate(R.layout.touch_item, parent, false));
+        return itemTouchViewHolder;
+    }
+
+    abstract public int getMovementFlags(RecyclerView recyclerView,
+            RecyclerView.ViewHolder viewHolder);
+
+    public ItemTouchAdapter createAdapter() {
+        return new ItemTouchAdapter();
+    }
+
+    public void onBind(ItemTouchViewHolder viewHolder) {
+
+    }
+
+    public void onCreateViewHolder(ItemTouchViewHolder viewHolder) {
+
+    }
+
+    public class ItemTouchViewHolder extends RecyclerView.ViewHolder {
+
+        public final TextView textView;
+
+        public final Button actionButton;
+
+        public final CardView cardView;
+
+        public final View overlay;
+
+        public ItemTouchViewHolder(View itemView) {
+            super(itemView);
+            cardView = (CardView) itemView;
+            textView = (TextView) itemView.findViewById(R.id.text_view);
+            actionButton = (Button) itemView.findViewById(R.id.action_button);
+            overlay = itemView.findViewById(R.id.overlay);
+        }
+    }
+
+    public class ItemTouchAdapter extends RecyclerView.Adapter<ItemTouchViewHolder> {
+
+        private List<String> mItems = new ArrayList<String>();
+
+        public ItemTouchAdapter() {
+            mItems.addAll(Arrays.asList(Cheeses.sCheeseStrings));
+        }
+
+        @Override
+        public ItemTouchViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+            return ItemTouchHelperActivity.this.onCreateViewHolder(parent);
+        }
+
+        @Override
+        public void onBindViewHolder(ItemTouchViewHolder holder, int position) {
+            holder.textView.setText(mItems.get(position));
+            onBind(holder);
+        }
+
+        public void delete(int position) {
+            mItems.remove(position);
+            notifyItemRemoved(position);
+        }
+
+        public void move(int from, int to) {
+            String prev = mItems.remove(from);
+            mItems.add(to > from ? to - 1 : to, prev);
+            notifyItemMoved(from, to);
+        }
+
+        @Override
+        public int getItemCount() {
+            return mItems.size();
+        }
+    }
+
+
+}
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/widget/touch/SwipeToDismissActivity.java b/samples/Support7Demos/src/com/example/android/supportv7/widget/touch/SwipeToDismissActivity.java
new file mode 100644
index 0000000..bb7e27e
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/widget/touch/SwipeToDismissActivity.java
@@ -0,0 +1,173 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv7.widget.touch;
+
+import com.example.android.supportv7.R;
+import com.example.android.supportv7.widget.util.ConfigToggle;
+
+import android.annotation.TargetApi;
+import android.graphics.Canvas;
+import android.os.Build;
+import android.support.v4.view.MotionEventCompat;
+import android.support.v7.widget.RecyclerView;
+import android.support.v7.widget.helper.ItemTouchHelper;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewGroup;
+
+public class SwipeToDismissActivity extends ItemTouchHelperActivity {
+    boolean mSwipeStartEnabled = true;
+    boolean mSwipeEndEnabled = true;
+    boolean mPointerSwipeEnabled = true;
+    boolean mCustomSwipeEnabled = false;
+
+    @Override
+    ConfigToggle[] createConfigToggles() {
+        ConfigToggle[] configToggles = {
+                new ConfigToggle(this, R.string.swipe_start) {
+                    @Override
+                    public boolean isChecked() {
+                        return mSwipeStartEnabled;
+                    }
+
+                    @Override
+                    public void onChange(boolean newValue) {
+                        mSwipeStartEnabled = newValue;
+                    }
+                },
+                new ConfigToggle(this, R.string.swipe_end) {
+                    @Override
+                    public boolean isChecked() {
+                        return mSwipeEndEnabled;
+                    }
+
+                    @Override
+                    public void onChange(boolean newValue) {
+                        mSwipeEndEnabled = newValue;
+                    }
+                },
+                new ConfigToggle(this, R.string.pointer_swipe_enabled) {
+                    @Override
+                    public boolean isChecked() {
+                        return mPointerSwipeEnabled;
+                    }
+
+                    @Override
+                    public void onChange(boolean newValue) {
+                        mPointerSwipeEnabled = newValue;
+                        mAdapter.notifyDataSetChanged();
+                    }
+                }
+        };
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
+            ConfigToggle[] copy = new ConfigToggle[configToggles.length + 1];
+            System.arraycopy(configToggles, 0, copy, 0, configToggles.length);
+            copy[copy.length - 1] = new ConfigToggle(this, R.string.custom_swipe_enabled) {
+                @Override
+                public boolean isChecked() {
+                    return mCustomSwipeEnabled;
+                }
+
+                @Override
+                public void onChange(boolean newValue) {
+                    mCustomSwipeEnabled = newValue;
+                }
+            };
+            return copy;
+        } else {
+            return configToggles;
+        }
+    }
+
+    @Override
+    public void onBind(ItemTouchViewHolder viewHolder) {
+        super.onBind(viewHolder);
+        viewHolder.actionButton.setVisibility(mPointerSwipeEnabled ? View.GONE : View.VISIBLE);
+    }
+
+    @Override
+    public void clearView(RecyclerView.ViewHolder viewHolder) {
+        super.clearView(viewHolder);
+        ItemTouchViewHolder touchVH = (ItemTouchViewHolder) viewHolder;
+        touchVH.cardView.setCardBackgroundColor(getResources().getColor(android.R.color.white));
+        touchVH.overlay.setVisibility(View.GONE);
+    }
+
+    @Override
+    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
+    public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
+        ItemTouchViewHolder touchVH = (ItemTouchViewHolder) viewHolder;
+        if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
+            touchVH.cardView.setCardBackgroundColor(getResources().getColor(R.color.card_aquatic));
+            if (mCustomSwipeEnabled) {
+                // hide it
+                touchVH.overlay.setTranslationX(viewHolder.itemView.getWidth());
+                touchVH.overlay.setVisibility(View.VISIBLE);
+            }
+        }
+        super.onSelectedChanged(viewHolder, actionState);
+    }
+
+    @Override
+    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
+    public boolean onChildDraw(Canvas c, RecyclerView recyclerView,
+            RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState,
+            boolean isCurrentlyActive) {
+        if (!mCustomSwipeEnabled) {
+            return false;
+        }
+        ItemTouchViewHolder touchVH = (ItemTouchViewHolder) viewHolder;
+        final float dir = Math.signum(dX);
+        if (dir == 0) {
+            touchVH.overlay.setTranslationX(-touchVH.overlay.getWidth());
+        } else {
+            final float overlayOffset = dX - dir * viewHolder.itemView.getWidth();
+            touchVH.overlay.setTranslationX(overlayOffset);
+        }
+        float alpha = (float) (.2 + .8 * Math.abs(dX) / viewHolder.itemView.getWidth());
+        touchVH.overlay.setAlpha(alpha);
+        return true;
+    }
+
+    @Override
+    public ItemTouchViewHolder onCreateViewHolder(ViewGroup parent) {
+        final ItemTouchViewHolder vh = super.onCreateViewHolder(parent);
+        vh.actionButton.setText(R.string.swipe);
+        vh.actionButton.setOnTouchListener(new View.OnTouchListener() {
+            @Override
+            public boolean onTouch(View v, MotionEvent event) {
+                if (MotionEventCompat.getActionMasked(event) == MotionEvent.ACTION_DOWN) {
+                    mItemTouchHelper.startSwipe(vh);
+                }
+                return false;
+            }
+        });
+        return vh;
+    }
+
+    @Override
+    public boolean isPointerSwipeEnabled() {
+        return mPointerSwipeEnabled;
+    }
+
+    @Override
+    public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
+        return mCallback.makeMovementFlags(0,
+                (mSwipeStartEnabled ? ItemTouchHelper.START : 0) |
+                        (mSwipeEndEnabled ? ItemTouchHelper.END : 0));
+    }
+}
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/widget/util/ConfigToggle.java b/samples/Support7Demos/src/com/example/android/supportv7/widget/util/ConfigToggle.java
new file mode 100644
index 0000000..eae04b0
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/widget/util/ConfigToggle.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv7.widget.util;
+
+import android.content.Context;
+
+abstract public class ConfigToggle {
+    private String mLabel;
+
+    protected ConfigToggle(Context context, int labelId) {
+        mLabel = context.getResources().getString(labelId);
+    }
+
+    public String getText() {
+        return mLabel;
+    }
+
+    abstract public boolean isChecked();
+
+    abstract public void onChange(boolean newValue);
+}
diff --git a/samples/Support7Demos/src/com/example/android/supportv7/widget/util/ConfigViewHolder.java b/samples/Support7Demos/src/com/example/android/supportv7/widget/util/ConfigViewHolder.java
new file mode 100644
index 0000000..1bdf155
--- /dev/null
+++ b/samples/Support7Demos/src/com/example/android/supportv7/widget/util/ConfigViewHolder.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.supportv7.widget.util;
+
+import android.support.v7.widget.RecyclerView;
+import android.view.View;
+import android.widget.CheckBox;
+import android.widget.CompoundButton;
+
+public class ConfigViewHolder extends RecyclerView.ViewHolder
+        implements CompoundButton.OnCheckedChangeListener {
+
+    private CheckBox mCheckBox;
+
+    private ConfigToggle mConfigToggle;
+
+    public ConfigViewHolder(View itemView) {
+        super(itemView);
+        mCheckBox = (CheckBox) itemView;
+        mCheckBox.setOnCheckedChangeListener(this);
+    }
+
+    public void bind(ConfigToggle toggle) {
+        mConfigToggle = toggle;
+        mCheckBox.setText(toggle.getText());
+        mCheckBox.setChecked(toggle.isChecked());
+    }
+
+    @Override
+    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+        if (mConfigToggle != null) {
+            mConfigToggle.onChange(isChecked);
+        }
+    }
+}
diff --git a/samples/SupportAppNavigation/Android.mk b/samples/SupportAppNavigation/Android.mk
new file mode 100644
index 0000000..8e6ec46
--- /dev/null
+++ b/samples/SupportAppNavigation/Android.mk
@@ -0,0 +1,23 @@
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := samples tests
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_PACKAGE_NAME := SupportAppNavigation
+
+LOCAL_STATIC_JAVA_LIBRARIES += android-support-v4
+
+LOCAL_SDK_VERSION := current
+
+LOCAL_MIN_SDK_VERSION := 8
+
+LOCAL_DEX_PREOPT := false
+
+include $(BUILD_PACKAGE)
+
+LOCAL_PROGUARD_FLAG_FILES := proguard.flags
+
+# Use the following include to make our test apk.
+include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/samples/SupportAppNavigation/AndroidManifest.xml b/samples/SupportAppNavigation/AndroidManifest.xml
new file mode 100644
index 0000000..c8e4fa8
--- /dev/null
+++ b/samples/SupportAppNavigation/AndroidManifest.xml
@@ -0,0 +1,116 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<manifest android:versionCode="1"
+        android:versionName="1"
+        xmlns:android="http://schemas.android.com/apk/res/android"
+        package="com.example.android.support.appnavigation">
+
+    <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="15" />
+
+    <application android:label="@string/app_name">
+        <activity android:name=".app.AppNavHomeActivity"
+                android:label="@string/app_nav_home_label">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".app.SimpleUpActivity"
+                  android:label="@string/simple_up_label">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.SAMPLE_CODE" />
+            </intent-filter>
+            <meta-data android:name="android.support.PARENT_ACTIVITY"
+                       android:value=".app.AppNavHomeActivity" />
+        </activity>
+
+        <activity android:name=".app.PeerActivity"
+                  android:label="@string/peer_label">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.SAMPLE_CODE" />
+            </intent-filter>
+            <meta-data android:name="android.support.PARENT_ACTIVITY"
+                       android:value=".app.AppNavHomeActivity" />
+        </activity>
+
+        <activity android:name=".app.ViewFromOtherTaskActivity"
+                  android:label="@string/view_from_other_task_label">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.SAMPLE_CODE" />
+            </intent-filter>
+            <meta-data android:name="android.support.PARENT_ACTIVITY"
+                       android:value=".app.AppNavHomeActivity" />
+        </activity>
+
+        <activity android:name=".app.OutsideTaskActivity"
+                  android:label="@string/outside_task_label"
+                  android:theme="@style/Theme.Light"
+                  android:taskAffinity="com.example.android.appnavigation.outsidetask">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".app.ContentViewActivity"
+                  android:label="@string/content_view_label">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <action android:name="android.intent.action.VIEW" />
+                <data android:mimeType="application/x-example" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
+            <meta-data android:name="android.support.PARENT_ACTIVITY"
+                       android:value=".app.ContentCategoryActivity" />
+        </activity>
+
+        <activity android:name=".app.ContentCategoryActivity"
+                  android:label="@string/content_category_label">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.SAMPLE_CODE" />
+            </intent-filter>
+            <meta-data android:name="android.support.PARENT_ACTIVITY"
+                       android:value=".app.AppNavHomeActivity" />
+        </activity>
+
+        <activity android:name=".app.NotificationsActivity"
+                  android:label="@string/notifications_label">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.SAMPLE_CODE" />
+            </intent-filter>
+            <meta-data android:name="android.support.PARENT_ACTIVITY"
+                       android:value=".app.AppNavHomeActivity" />
+        </activity>
+
+        <activity android:name=".app.InterstitialMessageActivity"
+                  android:label="@string/interstitial_label"
+                  android:theme="@style/Theme.Dialog"
+                  android:launchMode="singleTask"
+                  android:excludeFromRecents="true"
+                  android:taskAffinity="">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+            </intent-filter>
+        </activity>
+    </application>
+</manifest>
diff --git a/samples/SupportAppNavigation/res/layout/content_category.xml b/samples/SupportAppNavigation/res/layout/content_category.xml
new file mode 100644
index 0000000..2727260
--- /dev/null
+++ b/samples/SupportAppNavigation/res/layout/content_category.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 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="match_parent"
+              android:layout_height="match_parent"
+              android:padding="16dp"
+              android:orientation="vertical">
+    <TextView android:layout_width="match_parent"
+              android:layout_height="wrap_content"
+              android:text="@string/intermediate_description" />
+    <Button android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="8dp"
+            android:text="@string/launch_content_view"
+            android:onClick="onViewContent" />
+</LinearLayout>
diff --git a/samples/SupportAppNavigation/res/layout/content_view.xml b/samples/SupportAppNavigation/res/layout/content_view.xml
new file mode 100644
index 0000000..eabd2eb
--- /dev/null
+++ b/samples/SupportAppNavigation/res/layout/content_view.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 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="match_parent"
+              android:layout_height="match_parent"
+              android:padding="16dp"
+              android:orientation="vertical">
+    <TextView android:layout_width="match_parent"
+              android:layout_height="wrap_content"
+              android:text="@string/content_view_description" />
+    <TextView android:id="@+id/status_text"
+              android:layout_width="match_parent"
+              android:layout_height="wrap_content"
+              android:layout_marginTop="8dp"
+              android:text="@string/default_status_text" />
+</LinearLayout>
\ No newline at end of file
diff --git a/samples/SupportAppNavigation/res/layout/interstitial_message.xml b/samples/SupportAppNavigation/res/layout/interstitial_message.xml
new file mode 100644
index 0000000..d957ecd
--- /dev/null
+++ b/samples/SupportAppNavigation/res/layout/interstitial_message.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 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="match_parent"
+              android:layout_height="match_parent"
+              android:orientation="vertical"
+              style="@style/InterstitialDialogLayout">
+    <TextView android:layout_width="match_parent"
+              android:layout_height="wrap_content"
+              android:text="@string/interstitial_description"
+              android:layout_marginTop="16dp"
+              android:layout_marginBottom="16dp"
+              android:layout_marginLeft="16dp"
+              android:layout_marginRight="16dp"/>
+    <LinearLayout android:layout_width="match_parent"
+                  android:layout_height="wrap_content"
+                  style="@style/ButtonBar">
+        <Button android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:text="@string/launch_content_view"
+                android:onClick="onViewContent"
+                style="@style/ButtonBarButton"/>
+    </LinearLayout>
+</LinearLayout>
diff --git a/samples/SupportAppNavigation/res/layout/notifications.xml b/samples/SupportAppNavigation/res/layout/notifications.xml
new file mode 100644
index 0000000..10112f3
--- /dev/null
+++ b/samples/SupportAppNavigation/res/layout/notifications.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 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="match_parent"
+              android:layout_height="match_parent"
+              android:padding="16dp"
+              android:orientation="vertical">
+    <TextView android:layout_width="match_parent"
+              android:layout_height="wrap_content"
+              android:text="@string/notifications_description" />
+    <Button android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="8dp"
+            android:text="@string/post_direct_notification"
+            android:onClick="onPostDirect" />
+    <Button android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="8dp"
+            android:text="@string/post_interstitial_notification"
+            android:onClick="onPostInterstitial" />
+</LinearLayout>
diff --git a/samples/SupportAppNavigation/res/layout/outside_task.xml b/samples/SupportAppNavigation/res/layout/outside_task.xml
new file mode 100644
index 0000000..00c78aa
--- /dev/null
+++ b/samples/SupportAppNavigation/res/layout/outside_task.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 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="match_parent"
+              android:layout_height="match_parent"
+              android:padding="16dp"
+              android:orientation="vertical">
+    <TextView android:layout_width="match_parent"
+              android:layout_height="wrap_content"
+              android:text="@string/outside_task_description" />
+    <Button android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="8dp"
+            android:text="@string/launch_content_view"
+            android:onClick="onViewContent" />
+</LinearLayout>
diff --git a/samples/SupportAppNavigation/res/layout/peer.xml b/samples/SupportAppNavigation/res/layout/peer.xml
new file mode 100644
index 0000000..ee706b3
--- /dev/null
+++ b/samples/SupportAppNavigation/res/layout/peer.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 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="match_parent"
+              android:layout_height="match_parent"
+              android:padding="16dp"
+              android:orientation="vertical">
+    <TextView android:layout_width="match_parent"
+              android:layout_height="wrap_content"
+              android:text="@string/peer_description" />
+    <TextView android:id="@+id/peer_counter"
+              android:layout_width="match_parent"
+              android:layout_height="wrap_content"
+              android:layout_marginTop="8dp"
+              android:text="@string/peer_count" />
+    <Button android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="8dp"
+            android:text="@string/launch_peer"
+            android:onClick="onLaunchPeer" />
+</LinearLayout>
\ No newline at end of file
diff --git a/samples/SupportAppNavigation/res/layout/simple_up.xml b/samples/SupportAppNavigation/res/layout/simple_up.xml
new file mode 100644
index 0000000..2897d84
--- /dev/null
+++ b/samples/SupportAppNavigation/res/layout/simple_up.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<TextView xmlns:android="http://schemas.android.com/apk/res/android"
+          android:layout_width="match_parent"
+          android:layout_height="match_parent"
+          android:text="@string/simple_up_description"
+          android:padding="16dp" />
diff --git a/samples/SupportAppNavigation/res/layout/view_from_other_task.xml b/samples/SupportAppNavigation/res/layout/view_from_other_task.xml
new file mode 100644
index 0000000..941d74c
--- /dev/null
+++ b/samples/SupportAppNavigation/res/layout/view_from_other_task.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 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="match_parent"
+              android:layout_height="match_parent"
+              android:padding="16dp"
+              android:orientation="vertical">
+    <TextView android:layout_width="match_parent"
+              android:layout_height="wrap_content"
+              android:text="@string/view_from_other_task_description" />
+    <Button android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="8dp"
+            android:text="@string/launch_other_task"
+            android:onClick="onLaunchOtherTask" />
+</LinearLayout>
\ No newline at end of file
diff --git a/samples/SupportAppNavigation/res/values-v11/styles.xml b/samples/SupportAppNavigation/res/values-v11/styles.xml
new file mode 100644
index 0000000..e61e9d4
--- /dev/null
+++ b/samples/SupportAppNavigation/res/values-v11/styles.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 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>
+    <style name="InterstitialDialogLayout">
+        <item name="android:divider">?android:attr/dividerHorizontal</item>
+        <item name="android:showDividers">middle</item>
+    </style>
+
+    <style name="ButtonBar" parent="@android:style/Holo.ButtonBar.AlertDialog" />
+    <style name="ButtonBarButton" parent="@android:style/Widget.Holo.Button.Borderless" />
+
+</resources>
diff --git a/samples/SupportAppNavigation/res/values-v11/themes.xml b/samples/SupportAppNavigation/res/values-v11/themes.xml
new file mode 100644
index 0000000..b9f7fdb
--- /dev/null
+++ b/samples/SupportAppNavigation/res/values-v11/themes.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 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>
+    <style name="Theme.Light" parent="@android:style/Theme.Holo.Light" />
+    <style name="Theme.Dialog" parent="@android:style/Theme.Holo.Dialog" />
+</resources>
diff --git a/samples/SupportAppNavigation/res/values-v14/themes.xml b/samples/SupportAppNavigation/res/values-v14/themes.xml
new file mode 100644
index 0000000..79fabda
--- /dev/null
+++ b/samples/SupportAppNavigation/res/values-v14/themes.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 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>
+    <style name="Theme.Light" parent="@android:style/Theme.DeviceDefault.Light" />
+</resources>
diff --git a/samples/SupportAppNavigation/res/values/ids.xml b/samples/SupportAppNavigation/res/values/ids.xml
new file mode 100644
index 0000000..c143cf7
--- /dev/null
+++ b/samples/SupportAppNavigation/res/values/ids.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 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>
+    <item type="id" name="direct_notification" />
+    <item type="id" name="interstitial_notification" />
+</resources>
diff --git a/samples/SupportAppNavigation/res/values/strings.xml b/samples/SupportAppNavigation/res/values/strings.xml
new file mode 100644
index 0000000..e939b3f
--- /dev/null
+++ b/samples/SupportAppNavigation/res/values/strings.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<resources>
+    <string name="app_name">Support App Navigation Sample</string>
+    <string name="app_nav_home_label">Support App Navigation</string>
+
+    <string name="simple_up_label">Simple Up Navigation</string>
+    <string name="simple_up_description">This demo shows the simple case of up navigation that does not ever need to cross across different tasks. Press the up button on the action bar to return to the demo list. For simple drill-down navigation, the application up and system back buttons will navigate to the same location, leaving the task\'s back stack in the same state.</string>
+
+    <string name="peer_label">Peer Activities</string>
+    <string name="peer_description">This is an activity that shows content with many navigation peers. Think of a content browser that offers links to related content items. Pressing back from this activity will return to the previously viewed content item if you reached this point through a related link. If you reached it from the app nav example home activity, back will return there. Navigating up from this activity will always return to the app nav example home activity and clean up the back stack along the way.</string>
+    <string name="launch_peer">Link to another peer activity</string>
+    <string name="peer_count">Peer count: </string>
+
+    <string name="view_from_other_task_label">View from other task</string>
+    <string name="view_from_other_task_description">This combined demo shows how to handle up navigation when another task has launched your app\'s activity on its own task stack. Navigating up in this scenario should synthesize a task stack representing the most common or direct navigation path to the parent activity. The code example shows how to handle this using helper code from the support library. Press the button below to launch a separate task and begin the demo.</string>
+    <string name="launch_other_task">Launch new task</string>
+
+    <string name="outside_task_label">Outside Task</string>
+    <string name="outside_task_description">This activity has been launched in a new task. You can confirm this by pressing the Recents button now and switching back to the app navigation example task. This activity will view content with the fake mimetype \"application/x-example\" which will be received by another code example activity to continue the demo. Press the View button below.</string>
+
+    <string name="content_view_label">Content Viewer</string>
+    <string name="content_view_description">This activity can receive ACTION_VIEW intents with the mimetype \"application/x-example\", sent by the outside task component of this demo. If you launched the activity this way then it will be on the viewing activity\'s task stack. Press the back button to finish this activity and return to the activity that wanted to view the content. Press the up button in the action bar to jump back into the main demo task with a synthesized back stack. This matches the pattern for content viewers such as a photo gallery or video player.</string>
+    <string name="default_status_text">Navigated here from category</string>
+
+    <string name="content_category_label">Content Category</string>
+    <string name="intermediate_description">This activity is a parent for the example content viewer activity. Navigating up from the content viewer will lead here. Navigating up from here will lead back to the app navigation home activity. Note that if you reached this activity by navigating up from the example content viewer activity, you are back on the main app navigation example task. Press the button below to navigate to the content viewer activity.</string>
+    <string name="launch_content_view">Launch content view activity</string>
+
+    <string name="notifications_label">Notifications</string>
+    <string name="notifications_description">There are two classes of notifications: notifications that deep-link into an app directly, (e.g. an incoming SMS) and notifications that present an interstitial/summary of multiple collapsed notifications before linking into the app itself. (e.g. Calendar event notifications.) The buttons below will create notifications of each type.</string>
+    <string name="post_direct_notification">Post direct notification</string>
+    <string name="post_interstitial_notification">Post interstitial notification</string>
+
+    <string name="interstitial_label">Interstitial</string>
+    <string name="interstitial_description">This is an interstitial activity running in response to a notification. It presents a summary of info in a lightweight manner that does not exist as a task in Recents. Tap the button below to jump to the primary content.</string>
+
+</resources>
diff --git a/samples/SupportAppNavigation/res/values/styles.xml b/samples/SupportAppNavigation/res/values/styles.xml
new file mode 100644
index 0000000..d869170
--- /dev/null
+++ b/samples/SupportAppNavigation/res/values/styles.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 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>
+    <style name="InterstitialDialogLayout" />
+
+    <style name="ButtonBar" parent="@android:style/ButtonBar" />
+    <style name="ButtonBarButton" parent="@android:style/Widget.Button" />
+
+</resources>
diff --git a/samples/SupportAppNavigation/res/values/themes.xml b/samples/SupportAppNavigation/res/values/themes.xml
new file mode 100644
index 0000000..beebacf
--- /dev/null
+++ b/samples/SupportAppNavigation/res/values/themes.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 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>
+    <style name="Theme.Light" parent="@android:style/Theme.Light" />
+    <style name="Theme.Dialog" parent="@android:style/Theme.Dialog" />
+</resources>
diff --git a/samples/SupportAppNavigation/src/com/example/android/support/appnavigation/app/ActionBarCompat.java b/samples/SupportAppNavigation/src/com/example/android/support/appnavigation/app/ActionBarCompat.java
new file mode 100644
index 0000000..6f22280
--- /dev/null
+++ b/samples/SupportAppNavigation/src/com/example/android/support/appnavigation/app/ActionBarCompat.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.support.appnavigation.app;
+
+import android.app.Activity;
+import android.os.Build;
+
+/**
+ * Very limited shim for enabling the action bar's up button on devices that support it.
+ */
+public class ActionBarCompat {
+    /**
+     * This class will only ever be loaded if the version check succeeds,
+     * keeping the verifier from rejecting the use of framework classes that
+     * don't exist on older platform versions.
+     */
+    static class ActionBarCompatImpl {
+        static void setDisplayHomeAsUpEnabled(Activity activity, boolean enable) {
+            activity.getActionBar().setDisplayHomeAsUpEnabled(enable);
+        }
+    }
+
+    public static void setDisplayHomeAsUpEnabled(Activity activity, boolean enable) {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
+            ActionBarCompatImpl.setDisplayHomeAsUpEnabled(activity, enable);
+        }
+    }
+}
diff --git a/samples/SupportAppNavigation/src/com/example/android/support/appnavigation/app/AppNavHomeActivity.java b/samples/SupportAppNavigation/src/com/example/android/support/appnavigation/app/AppNavHomeActivity.java
new file mode 100644
index 0000000..17f4d5b
--- /dev/null
+++ b/samples/SupportAppNavigation/src/com/example/android/support/appnavigation/app/AppNavHomeActivity.java
@@ -0,0 +1,121 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.support.appnavigation.app;
+
+import android.app.ListActivity;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.os.Bundle;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.BaseAdapter;
+import android.widget.ListView;
+import android.widget.TextView;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Home activity for app navigation code samples.
+ */
+public class AppNavHomeActivity extends ListActivity {
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        setListAdapter(new SampleAdapter(querySampleActivities()));
+    }
+
+    @Override
+    protected void onListItemClick(ListView lv, View v, int pos, long id) {
+        SampleInfo info = (SampleInfo) getListAdapter().getItem(pos);
+        startActivity(info.intent);
+    }
+
+    protected List<SampleInfo> querySampleActivities() {
+        Intent intent = new Intent(Intent.ACTION_MAIN, null);
+        intent.setPackage(getPackageName());
+        intent.addCategory(Intent.CATEGORY_SAMPLE_CODE);
+
+        PackageManager pm = getPackageManager();
+        List<ResolveInfo> infos = pm.queryIntentActivities(intent, 0);
+
+        ArrayList<SampleInfo> samples = new ArrayList<SampleInfo>();
+
+        final int count = infos.size();
+        for (int i = 0; i < count; i++) {
+            final ResolveInfo info = infos.get(i);
+            final CharSequence labelSeq = info.loadLabel(pm);
+            String label = labelSeq != null ? labelSeq.toString() : info.activityInfo.name;
+
+            Intent target = new Intent();
+            target.setClassName(info.activityInfo.applicationInfo.packageName,
+                    info.activityInfo.name);
+            SampleInfo sample = new SampleInfo(label, target);
+            samples.add(sample);
+        }
+
+        return samples;
+    }
+
+    static class SampleInfo {
+        String name;
+        Intent intent;
+
+        SampleInfo(String name, Intent intent) {
+            this.name = name;
+            this.intent = intent;
+        }
+    }
+
+    class SampleAdapter extends BaseAdapter {
+        private List<SampleInfo> mItems;
+
+        public SampleAdapter(List<SampleInfo> items) {
+            mItems = items;
+        }
+
+        @Override
+        public int getCount() {
+            return mItems.size();
+        }
+
+        @Override
+        public Object getItem(int position) {
+            return mItems.get(position);
+        }
+
+        @Override
+        public long getItemId(int position) {
+            return position;
+        }
+
+        @Override
+        public View getView(int position, View convertView, ViewGroup parent) {
+            if (convertView == null) {
+                convertView = getLayoutInflater().inflate(android.R.layout.simple_list_item_1,
+                        parent, false);
+                convertView.setTag(convertView.findViewById(android.R.id.text1));
+            }
+            TextView tv = (TextView) convertView.getTag();
+            tv.setText(mItems.get(position).name);
+            return convertView;
+        }
+
+    }
+}
diff --git a/samples/SupportAppNavigation/src/com/example/android/support/appnavigation/app/ContentCategoryActivity.java b/samples/SupportAppNavigation/src/com/example/android/support/appnavigation/app/ContentCategoryActivity.java
new file mode 100644
index 0000000..d93482c
--- /dev/null
+++ b/samples/SupportAppNavigation/src/com/example/android/support/appnavigation/app/ContentCategoryActivity.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.support.appnavigation.app;
+
+import com.example.android.support.appnavigation.R;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.support.v4.app.NavUtils;
+import android.view.MenuItem;
+import android.view.View;
+
+public class ContentCategoryActivity extends Activity {
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.content_category);
+
+        ActionBarCompat.setDisplayHomeAsUpEnabled(this, true);
+    }
+
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+        if (item.getItemId() == android.R.id.home) {
+            NavUtils.navigateUpFromSameTask(this);
+            return true;
+        }
+        return super.onOptionsItemSelected(item);
+    }
+
+    public void onViewContent(View v) {
+        Intent target = new Intent(this, ContentViewActivity.class);
+        startActivity(target);
+    }
+}
diff --git a/samples/SupportAppNavigation/src/com/example/android/support/appnavigation/app/ContentViewActivity.java b/samples/SupportAppNavigation/src/com/example/android/support/appnavigation/app/ContentViewActivity.java
new file mode 100644
index 0000000..42e25ea
--- /dev/null
+++ b/samples/SupportAppNavigation/src/com/example/android/support/appnavigation/app/ContentViewActivity.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.support.appnavigation.app;
+
+import com.example.android.support.appnavigation.R;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.support.v4.app.NavUtils;
+import android.support.v4.app.ShareCompat;
+import android.support.v4.app.TaskStackBuilder;
+import android.text.TextUtils;
+import android.view.MenuItem;
+import android.widget.TextView;
+
+public class ContentViewActivity extends Activity {
+    public static final String EXTRA_TEXT = "com.example.android.appnavigation.EXTRA_TEXT";
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.content_view);
+
+        ActionBarCompat.setDisplayHomeAsUpEnabled(this, true);
+
+        Intent intent = getIntent();
+        if (Intent.ACTION_VIEW.equals(intent.getAction())) {
+            TextView tv = (TextView) findViewById(R.id.status_text);
+            tv.setText("Viewing content from ACTION_VIEW");
+        } else if (intent.hasExtra(EXTRA_TEXT)) {
+            TextView tv = (TextView) findViewById(R.id.status_text);
+            tv.setText(intent.getStringExtra(EXTRA_TEXT));
+        }
+    }
+
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+        if (item.getItemId() == android.R.id.home) {
+            Intent upIntent = NavUtils.getParentActivityIntent(this);
+            if (NavUtils.shouldUpRecreateTask(this, upIntent)) {
+                TaskStackBuilder.from(this)
+                        .addParentStack(this)
+                        .startActivities();
+                finish();
+            } else {
+                NavUtils.navigateUpTo(this, upIntent);
+            }
+            return true;
+        }
+        return super.onOptionsItemSelected(item);
+    }
+}
diff --git a/samples/SupportAppNavigation/src/com/example/android/support/appnavigation/app/InterstitialMessageActivity.java b/samples/SupportAppNavigation/src/com/example/android/support/appnavigation/app/InterstitialMessageActivity.java
new file mode 100644
index 0000000..72c3565
--- /dev/null
+++ b/samples/SupportAppNavigation/src/com/example/android/support/appnavigation/app/InterstitialMessageActivity.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.support.appnavigation.app;
+
+import com.example.android.support.appnavigation.R;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.support.v4.app.TaskStackBuilder;
+import android.view.View;
+
+public class InterstitialMessageActivity extends Activity {
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.interstitial_message);
+    }
+
+    public void onViewContent(View v) {
+        TaskStackBuilder.from(this)
+                .addParentStack(ContentViewActivity.class)
+                .addNextIntent(new Intent(this, ContentViewActivity.class)
+                        .putExtra(ContentViewActivity.EXTRA_TEXT, "From Interstitial Notification"))
+                .startActivities();
+        finish();
+    }
+}
diff --git a/samples/SupportAppNavigation/src/com/example/android/support/appnavigation/app/NotificationsActivity.java b/samples/SupportAppNavigation/src/com/example/android/support/appnavigation/app/NotificationsActivity.java
new file mode 100644
index 0000000..0f80938
--- /dev/null
+++ b/samples/SupportAppNavigation/src/com/example/android/support/appnavigation/app/NotificationsActivity.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.support.appnavigation.app;
+
+import com.example.android.support.appnavigation.R;
+
+import android.app.Activity;
+import android.app.NotificationManager;
+import android.app.PendingIntent;
+import android.content.Intent;
+import android.os.Bundle;
+import android.support.v4.app.NavUtils;
+import android.support.v4.app.NotificationCompat;
+import android.support.v4.app.TaskStackBuilder;
+import android.view.MenuItem;
+import android.view.View;
+
+public class NotificationsActivity extends Activity {
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.notifications);
+
+        ActionBarCompat.setDisplayHomeAsUpEnabled(this, true);
+    }
+
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+        if (item.getItemId() == android.R.id.home) {
+            NavUtils.navigateUpFromSameTask(this);
+            return true;
+        }
+        return super.onOptionsItemSelected(item);
+    }
+
+    public void onPostDirect(View v) {
+        NotificationCompat.Builder builder = new NotificationCompat.Builder(this)
+                .setTicker("Direct Notification")
+                .setSmallIcon(android.R.drawable.stat_notify_chat)
+                .setContentTitle("Direct Notification")
+                .setContentText("This will open the content viewer")
+                .setAutoCancel(true)
+                .setContentIntent(TaskStackBuilder.from(this)
+                        .addParentStack(ContentViewActivity.class)
+                        .addNextIntent(new Intent(this, ContentViewActivity.class)
+                                .putExtra(ContentViewActivity.EXTRA_TEXT, "From Notification"))
+                        .getPendingIntent(0, 0));
+        NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
+        nm.notify("direct_tag", R.id.direct_notification, builder.getNotification());
+    }
+
+    public void onPostInterstitial(View v) {
+        NotificationCompat.Builder builder = new NotificationCompat.Builder(this)
+                .setTicker("Interstitial Notification")
+                .setSmallIcon(android.R.drawable.stat_notify_chat)
+                .setContentTitle("Interstitial Notification")
+                .setContentText("This will show a detail page")
+                .setAutoCancel(true)
+                .setContentIntent(PendingIntent.getActivity(this, 0,
+                        new Intent(this, InterstitialMessageActivity.class)
+                                .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
+                                        Intent.FLAG_ACTIVITY_CLEAR_TASK), 0));
+        NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
+        nm.notify("interstitial_tag", R.id.interstitial_notification, builder.getNotification());
+    }
+}
diff --git a/samples/SupportAppNavigation/src/com/example/android/support/appnavigation/app/OutsideTaskActivity.java b/samples/SupportAppNavigation/src/com/example/android/support/appnavigation/app/OutsideTaskActivity.java
new file mode 100644
index 0000000..2f75d6b
--- /dev/null
+++ b/samples/SupportAppNavigation/src/com/example/android/support/appnavigation/app/OutsideTaskActivity.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.example.android.support.appnavigation.app;
+
+import com.example.android.support.appnavigation.R;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.view.View;
+
+public class OutsideTaskActivity extends Activity {
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.outside_task);
+    }
+
+    public void onViewContent(View v) {
+        Intent intent = new Intent(Intent.ACTION_VIEW)
+                .setType("application/x-example")
+                .addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
+        startActivity(intent);
+    }
+}
diff --git a/samples/SupportAppNavigation/src/com/example/android/support/appnavigation/app/PeerActivity.java b/samples/SupportAppNavigation/src/com/example/android/support/appnavigation/app/PeerActivity.java
new file mode 100644
index 0000000..a6dbca4
--- /dev/null
+++ b/samples/SupportAppNavigation/src/com/example/android/support/appnavigation/app/PeerActivity.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.support.appnavigation.app;
+
+import com.example.android.support.appnavigation.R;
+
+import android.app.ActionBar;
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.support.v4.app.NavUtils;
+import android.view.MenuItem;
+import android.view.View;
+import android.widget.TextView;
+
+public class PeerActivity extends Activity {
+    private static final String EXTRA_PEER_COUNT =
+            "com.example.android.appnavigation.EXTRA_PEER_COUNT";
+
+    private int mPeerCount;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.peer);
+
+        ActionBarCompat.setDisplayHomeAsUpEnabled(this, true);
+
+        mPeerCount = getIntent().getIntExtra(EXTRA_PEER_COUNT, 0) + 1;
+        TextView tv = (TextView) findViewById(R.id.peer_counter);
+        tv.setText(getResources().getText(R.string.peer_count).toString() + mPeerCount);
+    }
+
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+        if (item.getItemId() == android.R.id.home) {
+            NavUtils.navigateUpFromSameTask(this);
+            return true;
+        }
+        return super.onOptionsItemSelected(item);
+    }
+
+    public void onLaunchPeer(View v) {
+        Intent target = new Intent(this, PeerActivity.class);
+        target.putExtra(EXTRA_PEER_COUNT, mPeerCount);
+        startActivity(target);
+    }
+}
diff --git a/samples/SupportAppNavigation/src/com/example/android/support/appnavigation/app/SimpleUpActivity.java b/samples/SupportAppNavigation/src/com/example/android/support/appnavigation/app/SimpleUpActivity.java
new file mode 100644
index 0000000..7c09051
--- /dev/null
+++ b/samples/SupportAppNavigation/src/com/example/android/support/appnavigation/app/SimpleUpActivity.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.support.appnavigation.app;
+
+import com.example.android.support.appnavigation.R;
+
+import android.app.ActionBar;
+import android.app.Activity;
+import android.os.Bundle;
+import android.support.v4.app.NavUtils;
+import android.view.MenuItem;
+
+public class SimpleUpActivity extends Activity {
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.simple_up);
+
+        ActionBarCompat.setDisplayHomeAsUpEnabled(this, true);
+    }
+
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+        if (item.getItemId() == android.R.id.home) {
+            NavUtils.navigateUpFromSameTask(this);
+            return true;
+        }
+        return super.onOptionsItemSelected(item);
+    }
+}
diff --git a/samples/SupportAppNavigation/src/com/example/android/support/appnavigation/app/ViewFromOtherTaskActivity.java b/samples/SupportAppNavigation/src/com/example/android/support/appnavigation/app/ViewFromOtherTaskActivity.java
new file mode 100644
index 0000000..46e6349
--- /dev/null
+++ b/samples/SupportAppNavigation/src/com/example/android/support/appnavigation/app/ViewFromOtherTaskActivity.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.support.appnavigation.app;
+
+import com.example.android.support.appnavigation.R;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.support.v4.app.NavUtils;
+import android.view.MenuItem;
+import android.view.View;
+
+public class ViewFromOtherTaskActivity extends Activity {
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.view_from_other_task);
+
+        ActionBarCompat.setDisplayHomeAsUpEnabled(this, true);
+    }
+
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+        if (item.getItemId() == android.R.id.home) {
+            NavUtils.navigateUpFromSameTask(this);
+            return true;
+        }
+        return false;
+    }
+
+    public void onLaunchOtherTask(View v) {
+        Intent target = new Intent(this, OutsideTaskActivity.class)
+                .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
+                        Intent.FLAG_ACTIVITY_TASK_ON_HOME);
+        startActivity(target);
+    }
+}
diff --git a/samples/SupportDesignDemos/Android.mk b/samples/SupportDesignDemos/Android.mk
new file mode 100644
index 0000000..de9e302
--- /dev/null
+++ b/samples/SupportDesignDemos/Android.mk
@@ -0,0 +1,44 @@
+# Copyright (C) 2015 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.
+
+LOCAL_PATH:= $(call my-dir)
+
+# Build the samples.
+# We need to add some special AAPT flags to generate R classes
+# for resources that are included from the libraries.
+include $(CLEAR_VARS)
+LOCAL_PACKAGE_NAME := SupportDesignDemos
+LOCAL_MODULE_TAGS := samples
+LOCAL_SDK_VERSION := current
+LOCAL_MIN_SDK_VERSION := 7
+LOCAL_DEX_PREOPT := false
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+LOCAL_STATIC_JAVA_LIBRARIES := \
+        android-support-v4 \
+        android-support-v7-appcompat \
+        android-support-v7-recyclerview \
+        android-support-design
+LOCAL_RESOURCE_DIR = \
+        $(LOCAL_PATH)/res \
+        frameworks/support/v7/appcompat/res \
+        frameworks/support/v7/recyclerview/res \
+        frameworks/support/design/res
+LOCAL_AAPT_FLAGS := \
+        --auto-add-overlay \
+        --extra-packages android.support.v7.appcompat \
+        --extra-packages android.support.v7.recyclerview \
+        --extra-packages android.support.design \
+        --no-version-vectors
+LOCAL_PROGUARD_FLAG_FILES := proguard.flags
+include $(BUILD_PACKAGE)
diff --git a/samples/SupportDesignDemos/AndroidManifest.xml b/samples/SupportDesignDemos/AndroidManifest.xml
new file mode 100644
index 0000000..4d05bc6
--- /dev/null
+++ b/samples/SupportDesignDemos/AndroidManifest.xml
@@ -0,0 +1,311 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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"
+    package="com.example.android.support.design">
+
+    <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="21" />
+
+    <application android:label="@string/activity_sample_code"
+            android:supportsRtl="true"
+            android:icon="@drawable/app_sample_code"
+            android:theme="@style/Theme.FAB">
+
+        <activity android:name="SupportDesignDemos">
+            <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=".widget.FloatingActionButtonUsage"
+                  android:label="@string/design_fab"
+                  android:theme="@style/Theme.FAB">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.support.design.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".widget.NavigationViewUsage"
+                  android:label="@string/design_navigation"
+                  android:theme="@style/Theme.Navigation">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.support.design.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".widget.NavigationViewWithoutDrawer"
+                  android:label="@string/design_navigation_without_drawer"
+                  android:theme="@style/Theme.Design">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.support.design.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".widget.TabLayoutUsage"
+                  android:label="@string/design_tabs_viewpager"
+                  android:theme="@style/Theme.Design">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.support.design.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".widget.TabLayoutPreselectedUsage"
+                  android:label="@string/design_tabs_preselected_viewpager"
+                  android:theme="@style/Theme.Design">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.support.design.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".widget.TabLayoutLayoutItemsUsage"
+                  android:label="@string/design_tabs_layout_items"
+                  android:theme="@style/Theme.Design">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.support.design.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".widget.TabLayoutCustomItemsUsage"
+                  android:label="@string/design_tabs_custom_items"
+                  android:theme="@style/Theme.Design">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.support.design.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".widget.TextInputLayoutUsage"
+                  android:label="@string/design_text_input"
+                  android:theme="@style/Theme.AppCompat.Light.DarkActionBar">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+                <category android:name="com.example.android.support.design.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".widget.SnackbarUsage"
+                  android:label="@string/design_snackbar_basic"
+                  android:theme="@style/Theme.AppCompat.Light.DarkActionBar">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.support.design.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".widget.SnackbarWithFloatingActionButton"
+                  android:label="@string/design_snackbar_fab"
+                  android:theme="@style/Theme.AppCompat.Light.DarkActionBar">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.support.design.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".widget.SnackbarWithoutCoordinatorLayout"
+                  android:label="@string/design_snackbar_without_col"
+                  android:theme="@style/Theme.AppCompat.Light.DarkActionBar">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.support.design.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".widget.AppBarLayoutToolbarScrollTabsScroll"
+                  android:label="@string/design_appbar_toolbar_scroll_tabs_scroll"
+                  android:theme="@style/Theme.Design">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.support.design.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".widget.AppBarLayoutToolbarScrollTabsScrollSnap"
+                  android:label="@string/design_appbar_toolbar_scroll_tabs_scroll_snap"
+                  android:theme="@style/Theme.Design">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.support.design.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".widget.AppBarLayoutToolbarScrollTabsPin"
+                  android:label="@string/design_appbar_toolbar_scroll_tabs_pin"
+                  android:theme="@style/Theme.Design">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.support.design.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".widget.AppBarLayoutToolbarScrollTabsPinWithSwipeRefresh"
+                  android:label="@string/design_appbar_toolbar_scroll_tabs_pin_with_swiperefresh"
+                  android:theme="@style/Theme.Design">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.support.design.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".widget.AppBarLayoutToolbarCollapseThenPin"
+                  android:label="@string/design_appbar_collapsing_toolbar_pin"
+                  android:theme="@style/Theme.Design">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.support.design.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".widget.AppBarLayoutToolbarCollapseThenPinWithFab"
+                  android:label="@string/design_appbar_collapsing_toolbar_pin_fab"
+                  android:theme="@style/Theme.Design">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.support.design.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".widget.AppBarLayoutToolbarCollapseThenPinNested"
+                  android:label="@string/design_appbar_collapsing_toolbar_pin_nested"
+                  android:theme="@style/Theme.Design">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.support.design.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".widget.AppBarLayoutToolbarCollapseThenScroll"
+                  android:label="@string/design_appbar_collapsing_toolbar_scroll"
+                  android:theme="@style/Theme.Design">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.support.design.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".widget.AppBarLayoutToolbarCollapseThenScrollWithSwipeRefresh"
+                  android:label="@string/design_appbar_collapsing_toolbar_scroll_with_swiperefresh"
+                  android:theme="@style/Theme.Design">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.support.design.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".widget.AppBarLayoutToolbarCollapseWithImage"
+                  android:label="@string/design_appbar_collapsing_toolbar_with_image"
+                  android:theme="@style/Theme.Design">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.support.design.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".widget.AppBarLayoutToolbarCollapseWithImageWithInsets"
+                  android:label="@string/design_appbar_collapsing_toolbar_with_image_insets"
+                  android:theme="@style/Theme.Design.TransparentStatus">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.support.design.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".widget.AppBarLayoutToolbarParallaxOverlapContent"
+                  android:label="@string/design_appbar_parallax_overlap"
+                  android:theme="@style/Theme.Design">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.support.design.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".widget.BottomSheetPersistent"
+                  android:label="@string/design_bottomsheet_persistent"
+                  android:theme="@style/Theme.Design">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.support.design.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".widget.BottomSheetHideable"
+                  android:label="@string/design_bottomsheet_hideable"
+                  android:theme="@style/Theme.Design">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.support.design.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".widget.BottomSheetWithFab"
+                  android:label="@string/design_bottomsheet_with_fab"
+                  android:theme="@style/Theme.Design">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.support.design.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".widget.BottomSheetScrollView"
+                  android:label="@string/design_bottomsheet_scroll"
+                  android:theme="@style/Theme.Design">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.support.design.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".widget.BottomSheetWithFragment"
+                  android:label="@string/design_bottomsheet_with_fragment"
+                  android:theme="@style/Theme.Design">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.support.design.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".widget.BottomSheetModal"
+                  android:label="@string/design_bottomsheet_modal"
+                  android:theme="@style/Theme.BottomSheetModal">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.support.design.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".widget.BottomSheetModalSkipCollapsed"
+                  android:label="@string/design_bottomsheet_modal_skip_collapsed"
+                  android:theme="@style/Theme.BottomSheetModalSkipCollapsed">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.support.design.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+
+    </application>
+</manifest>
diff --git a/samples/SupportDesignDemos/build.gradle b/samples/SupportDesignDemos/build.gradle
new file mode 100644
index 0000000..163bb61
--- /dev/null
+++ b/samples/SupportDesignDemos/build.gradle
@@ -0,0 +1,31 @@
+apply plugin: 'com.android.application'
+
+dependencies {
+    compile project(':support-design')
+}
+
+android {
+    compileSdkVersion project.ext.currentSdk
+
+    defaultConfig {
+        minSdkVersion 9
+    }
+
+    sourceSets {
+        main.manifest.srcFile 'AndroidManifest.xml'
+        main.java.srcDirs = ['src']
+        main.aidl.srcDirs = ['src']
+        main.res.srcDirs = ['res']
+    }
+
+    lintOptions {
+        // TODO: fix errors and reenable.
+        abortOnError false
+    }
+
+    compileOptions {
+        sourceCompatibility JavaVersion.VERSION_1_7
+        targetCompatibility JavaVersion.VERSION_1_7
+    }
+}
+
diff --git a/samples/SupportDesignDemos/proguard.flags b/samples/SupportDesignDemos/proguard.flags
new file mode 100644
index 0000000..9ebd737
--- /dev/null
+++ b/samples/SupportDesignDemos/proguard.flags
@@ -0,0 +1,7 @@
+-keep public class * extends android.support.design.widget.CoordinatorLayout$Behavior {
+    public <init>(android.content.Context, android.util.AttributeSet);
+}
+
+-keep public class * extends android.support.v7.widget.LinearLayoutManager {
+    public <init>(android.content.Context, android.util.AttributeSet, int, int);
+}
diff --git a/samples/SupportDesignDemos/res/drawable-hdpi/app_sample_code.png b/samples/SupportDesignDemos/res/drawable-hdpi/app_sample_code.png
new file mode 100755
index 0000000..66a1984
--- /dev/null
+++ b/samples/SupportDesignDemos/res/drawable-hdpi/app_sample_code.png
Binary files differ
diff --git a/samples/SupportDesignDemos/res/drawable-hdpi/ic_action_navigation_menu.png b/samples/SupportDesignDemos/res/drawable-hdpi/ic_action_navigation_menu.png
new file mode 100644
index 0000000..743fd7d
--- /dev/null
+++ b/samples/SupportDesignDemos/res/drawable-hdpi/ic_action_navigation_menu.png
Binary files differ
diff --git a/samples/SupportDesignDemos/res/drawable-hdpi/ic_android.png b/samples/SupportDesignDemos/res/drawable-hdpi/ic_android.png
new file mode 100644
index 0000000..94b8fb1
--- /dev/null
+++ b/samples/SupportDesignDemos/res/drawable-hdpi/ic_android.png
Binary files differ
diff --git a/samples/SupportDesignDemos/res/drawable-mdpi/app_sample_code.png b/samples/SupportDesignDemos/res/drawable-mdpi/app_sample_code.png
new file mode 100644
index 0000000..5ae7701
--- /dev/null
+++ b/samples/SupportDesignDemos/res/drawable-mdpi/app_sample_code.png
Binary files differ
diff --git a/samples/SupportDesignDemos/res/drawable-mdpi/ic_action_navigation_menu.png b/samples/SupportDesignDemos/res/drawable-mdpi/ic_action_navigation_menu.png
new file mode 100644
index 0000000..4fa2c22
--- /dev/null
+++ b/samples/SupportDesignDemos/res/drawable-mdpi/ic_action_navigation_menu.png
Binary files differ
diff --git a/samples/SupportDesignDemos/res/drawable-mdpi/ic_android.png b/samples/SupportDesignDemos/res/drawable-mdpi/ic_android.png
new file mode 100644
index 0000000..afc43db
--- /dev/null
+++ b/samples/SupportDesignDemos/res/drawable-mdpi/ic_android.png
Binary files differ
diff --git a/samples/SupportDesignDemos/res/drawable-nodpi/photo.jpg b/samples/SupportDesignDemos/res/drawable-nodpi/photo.jpg
new file mode 100644
index 0000000..d5a2ef0
--- /dev/null
+++ b/samples/SupportDesignDemos/res/drawable-nodpi/photo.jpg
Binary files differ
diff --git a/samples/SupportDesignDemos/res/drawable-xhdpi/ic_action_navigation_menu.png b/samples/SupportDesignDemos/res/drawable-xhdpi/ic_action_navigation_menu.png
new file mode 100644
index 0000000..595da84
--- /dev/null
+++ b/samples/SupportDesignDemos/res/drawable-xhdpi/ic_action_navigation_menu.png
Binary files differ
diff --git a/samples/SupportDesignDemos/res/drawable-xhdpi/ic_android.png b/samples/SupportDesignDemos/res/drawable-xhdpi/ic_android.png
new file mode 100644
index 0000000..74c6f68
--- /dev/null
+++ b/samples/SupportDesignDemos/res/drawable-xhdpi/ic_android.png
Binary files differ
diff --git a/samples/SupportDesignDemos/res/drawable-xxhdpi/ic_action_navigation_menu.png b/samples/SupportDesignDemos/res/drawable-xxhdpi/ic_action_navigation_menu.png
new file mode 100644
index 0000000..3ebee24
--- /dev/null
+++ b/samples/SupportDesignDemos/res/drawable-xxhdpi/ic_action_navigation_menu.png
Binary files differ
diff --git a/samples/SupportDesignDemos/res/drawable-xxhdpi/ic_add.png b/samples/SupportDesignDemos/res/drawable-xxhdpi/ic_add.png
new file mode 100644
index 0000000..a84106b
--- /dev/null
+++ b/samples/SupportDesignDemos/res/drawable-xxhdpi/ic_add.png
Binary files differ
diff --git a/samples/SupportDesignDemos/res/drawable-xxhdpi/ic_android.png b/samples/SupportDesignDemos/res/drawable-xxhdpi/ic_android.png
new file mode 100644
index 0000000..5cb6acd
--- /dev/null
+++ b/samples/SupportDesignDemos/res/drawable-xxhdpi/ic_android.png
Binary files differ
diff --git a/samples/SupportDesignDemos/res/drawable-xxxhdpi/ic_android.png b/samples/SupportDesignDemos/res/drawable-xxxhdpi/ic_android.png
new file mode 100644
index 0000000..e302a07
--- /dev/null
+++ b/samples/SupportDesignDemos/res/drawable-xxxhdpi/ic_android.png
Binary files differ
diff --git a/samples/SupportDesignDemos/res/drawable/custom_tab_indicator.xml b/samples/SupportDesignDemos/res/drawable/custom_tab_indicator.xml
new file mode 100644
index 0000000..8a3e2e3
--- /dev/null
+++ b/samples/SupportDesignDemos/res/drawable/custom_tab_indicator.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2016 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_selected="true"
+          android:drawable="@drawable/custom_tab_indicator_selected" />
+    <item
+        android:drawable="@drawable/custom_tab_indicator_default" />
+</selector>
\ No newline at end of file
diff --git a/samples/SupportDesignDemos/res/drawable/custom_tab_indicator_default.xml b/samples/SupportDesignDemos/res/drawable/custom_tab_indicator_default.xml
new file mode 100644
index 0000000..e06b058
--- /dev/null
+++ b/samples/SupportDesignDemos/res/drawable/custom_tab_indicator_default.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2016 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">
+    <size
+        android:width="16dp"
+        android:height="16dp" />
+    <solid
+        android:color="#FF8080" />
+</shape>
\ No newline at end of file
diff --git a/samples/SupportDesignDemos/res/drawable/custom_tab_indicator_selected.xml b/samples/SupportDesignDemos/res/drawable/custom_tab_indicator_selected.xml
new file mode 100644
index 0000000..dfab0ab
--- /dev/null
+++ b/samples/SupportDesignDemos/res/drawable/custom_tab_indicator_selected.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2016 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">
+    <size
+        android:width="16dp"
+        android:height="16dp" />
+    <solid
+        android:color="#600000" />
+</shape>
\ No newline at end of file
diff --git a/samples/SupportDesignDemos/res/drawable/ic_search.xml b/samples/SupportDesignDemos/res/drawable/ic_search.xml
new file mode 100644
index 0000000..b4cba34
--- /dev/null
+++ b/samples/SupportDesignDemos/res/drawable/ic_search.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright (C) 2016 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="24dp"
+        android:height="24dp"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0"
+        android:tint="?attr/colorControlNormal">
+    <path
+        android:pathData="M15.5,14l-0.8,0l-0.3,-0.3c1,-1.1 1.6,-2.6 1.6,-4.2C16,5.9 13.1,3 9.5,3C5.9,3 3,5.9 3,9.5S5.9,16 9.5,16c1.6,0 3.1,-0.6 4.2,-1.6l0.3,0.3l0,0.8l5,5l1.5,-1.5L15.5,14zM9.5,14C7,14 5,12 5,9.5S7,5 9.5,5C12,5 14,7 14,9.5S12,14 9.5,14z"
+        android:fillColor="@android:color/white"/>
+</vector>
diff --git a/samples/SupportDesignDemos/res/layout/action_layout.xml b/samples/SupportDesignDemos/res/layout/action_layout.xml
new file mode 100644
index 0000000..a266d51
--- /dev/null
+++ b/samples/SupportDesignDemos/res/layout/action_layout.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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.
+-->
+<android.support.v7.widget.SwitchCompat
+        xmlns:android="http://schemas.android.com/apk/res/android"
+        android:id="@+id/toggle"
+        android:orientation="vertical"
+        android:layout_width="wrap_content"
+        android:layout_height="match_parent"
+        android:gravity="center_vertical"/>
diff --git a/samples/SupportDesignDemos/res/layout/design_appbar_toolbar_collapse_pin.xml b/samples/SupportDesignDemos/res/layout/design_appbar_toolbar_collapse_pin.xml
new file mode 100644
index 0000000..ee3114d
--- /dev/null
+++ b/samples/SupportDesignDemos/res/layout/design_appbar_toolbar_collapse_pin.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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.
+-->
+
+<android.support.design.widget.CoordinatorLayout
+        xmlns:android="http://schemas.android.com/apk/res/android"
+        xmlns:app="http://schemas.android.com/apk/res-auto"
+        android:id="@+id/col"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+
+    <android.support.design.widget.AppBarLayout
+            android:id="@+id/app_bar"
+            android:layout_height="192dp"
+            android:layout_width="match_parent"
+            android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
+
+        <android.support.design.widget.CollapsingToolbarLayout
+                android:id="@+id/collapsing_app_bar"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                app:layout_scrollFlags="scroll|exitUntilCollapsed">
+
+            <android.support.v7.widget.Toolbar
+                    android:id="@+id/toolbar"
+                    android:layout_height="?attr/actionBarSize"
+                    android:layout_width="match_parent"
+                    app:layout_collapseMode="pin"/>
+
+        </android.support.design.widget.CollapsingToolbarLayout>
+
+    </android.support.design.widget.AppBarLayout>
+
+    <include layout="@layout/include_appbar_recyclerview"/>
+
+</android.support.design.widget.CoordinatorLayout>
diff --git a/samples/SupportDesignDemos/res/layout/design_appbar_toolbar_collapse_pin_nested.xml b/samples/SupportDesignDemos/res/layout/design_appbar_toolbar_collapse_pin_nested.xml
new file mode 100644
index 0000000..baed926
--- /dev/null
+++ b/samples/SupportDesignDemos/res/layout/design_appbar_toolbar_collapse_pin_nested.xml
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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.
+-->
+
+<android.support.design.widget.CoordinatorLayout
+        xmlns:android="http://schemas.android.com/apk/res/android"
+        xmlns:app="http://schemas.android.com/apk/res-auto"
+        android:id="@+id/col"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+
+    <android.support.design.widget.AppBarLayout
+            android:id="@+id/app_bar"
+            android:layout_height="192dp"
+            android:layout_width="match_parent">
+
+        <android.support.design.widget.CollapsingToolbarLayout
+                android:id="@+id/collapsing_app_bar"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                app:layout_scrollFlags="scroll|exitUntilCollapsed"
+                app:toolbarId="@+id/toolbar">
+
+            <FrameLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginTop="8dp"
+                    android:layout_marginBottom="16dp"
+                    android:background="?android:colorBackground"
+                    app:layout_collapseMode="pin">
+
+                <android.support.v7.widget.Toolbar
+                        android:id="@+id/toolbar"
+                        android:layout_height="?attr/actionBarSize"
+                        android:layout_width="match_parent"
+                        android:theme="@style/ThemeOverlay.AppCompat.Light"/>
+
+            </FrameLayout>
+
+        </android.support.design.widget.CollapsingToolbarLayout>
+
+    </android.support.design.widget.AppBarLayout>
+
+    <include layout="@layout/include_appbar_recyclerview"/>
+
+</android.support.design.widget.CoordinatorLayout>
diff --git a/samples/SupportDesignDemos/res/layout/design_appbar_toolbar_collapse_pin_with_fab.xml b/samples/SupportDesignDemos/res/layout/design_appbar_toolbar_collapse_pin_with_fab.xml
new file mode 100644
index 0000000..a960ddb
--- /dev/null
+++ b/samples/SupportDesignDemos/res/layout/design_appbar_toolbar_collapse_pin_with_fab.xml
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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.
+-->
+
+<android.support.design.widget.CoordinatorLayout
+        xmlns:android="http://schemas.android.com/apk/res/android"
+        xmlns:app="http://schemas.android.com/apk/res-auto"
+        android:id="@+id/col"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+
+    <android.support.design.widget.AppBarLayout
+            android:id="@+id/appbar"
+            android:layout_height="192dp"
+            android:layout_width="match_parent"
+            android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
+
+        <android.support.design.widget.CollapsingToolbarLayout
+                android:id="@+id/collapsing_app_bar"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                app:layout_scrollFlags="scroll|exitUntilCollapsed">
+
+            <android.support.v7.widget.Toolbar
+                    android:id="@+id/toolbar"
+                    android:layout_height="?attr/actionBarSize"
+                    android:layout_width="match_parent"
+                    app:layout_collapseMode="pin"/>
+
+        </android.support.design.widget.CollapsingToolbarLayout>
+
+    </android.support.design.widget.AppBarLayout>
+
+    <include layout="@layout/include_appbar_scrollview"/>
+
+    <android.support.design.widget.FloatingActionButton
+            android:layout_height="wrap_content"
+            android:layout_width="wrap_content"
+            app:layout_anchor="@id/appbar"
+            app:layout_anchorGravity="bottom|right|end"
+            android:src="@drawable/ic_add"
+            android:layout_marginRight="16dp"
+            android:clickable="true"
+            app:fabSize="mini"/>
+
+</android.support.design.widget.CoordinatorLayout>
diff --git a/samples/SupportDesignDemos/res/layout/design_appbar_toolbar_collapse_scroll.xml b/samples/SupportDesignDemos/res/layout/design_appbar_toolbar_collapse_scroll.xml
new file mode 100644
index 0000000..fc85db0
--- /dev/null
+++ b/samples/SupportDesignDemos/res/layout/design_appbar_toolbar_collapse_scroll.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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.
+-->
+
+<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        xmlns:app="http://schemas.android.com/apk/res-auto"
+        android:id="@+id/col"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+
+    <android.support.design.widget.AppBarLayout
+            android:id="@+id/app_bar"
+            android:layout_height="192dp"
+            android:layout_width="match_parent"
+            android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
+
+        <android.support.design.widget.CollapsingToolbarLayout
+                android:id="@+id/collapsing_app_bar"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                app:layout_scrollFlags="scroll|enterAlways|enterAlwaysCollapsed">
+
+            <android.support.v7.widget.Toolbar
+                    android:id="@+id/toolbar"
+                    android:layout_height="?attr/actionBarSize"
+                    android:layout_width="match_parent"
+                    app:layout_collapseMode="pin"/>
+
+        </android.support.design.widget.CollapsingToolbarLayout>
+
+    </android.support.design.widget.AppBarLayout>
+
+    <include layout="@layout/include_appbar_scrollview"/>
+
+</android.support.design.widget.CoordinatorLayout>
diff --git a/samples/SupportDesignDemos/res/layout/design_appbar_toolbar_collapse_scroll_with_swiperefresh.xml b/samples/SupportDesignDemos/res/layout/design_appbar_toolbar_collapse_scroll_with_swiperefresh.xml
new file mode 100644
index 0000000..d0572af
--- /dev/null
+++ b/samples/SupportDesignDemos/res/layout/design_appbar_toolbar_collapse_scroll_with_swiperefresh.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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.
+-->
+
+<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        xmlns:app="http://schemas.android.com/apk/res-auto"
+        android:id="@+id/col"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+
+    <android.support.design.widget.AppBarLayout
+            android:id="@+id/app_bar"
+            android:layout_height="192dp"
+            android:layout_width="match_parent"
+            android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
+
+        <android.support.design.widget.CollapsingToolbarLayout
+                android:id="@+id/collapsing_app_bar"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                app:layout_scrollFlags="scroll|enterAlways|enterAlwaysCollapsed">
+
+            <android.support.v7.widget.Toolbar
+                    android:id="@+id/toolbar"
+                    android:layout_height="?attr/actionBarSize"
+                    android:layout_width="match_parent"
+                    app:layout_collapseMode="pin"/>
+
+        </android.support.design.widget.CollapsingToolbarLayout>
+
+    </android.support.design.widget.AppBarLayout>
+
+    <include layout="@layout/include_appbar_recyclerview_swiperefresh"/>
+
+</android.support.design.widget.CoordinatorLayout>
diff --git a/samples/SupportDesignDemos/res/layout/design_appbar_toolbar_collapse_with_image.xml b/samples/SupportDesignDemos/res/layout/design_appbar_toolbar_collapse_with_image.xml
new file mode 100644
index 0000000..930c1a8
--- /dev/null
+++ b/samples/SupportDesignDemos/res/layout/design_appbar_toolbar_collapse_with_image.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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.
+-->
+
+<android.support.design.widget.CoordinatorLayout
+        xmlns:android="http://schemas.android.com/apk/res/android"
+        xmlns:app="http://schemas.android.com/apk/res-auto"
+        android:id="@+id/col"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+
+    <android.support.design.widget.AppBarLayout
+            android:id="@+id/app_bar"
+            android:layout_height="192dp"
+            android:layout_width="match_parent"
+            android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
+
+        <android.support.design.widget.CollapsingToolbarLayout
+                android:id="@+id/collapsing_app_bar"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                app:layout_scrollFlags="scroll|exitUntilCollapsed"
+                app:contentScrim="?attr/colorPrimary">
+
+            <ImageView
+                    android:id="@+id/app_bar_image"
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    app:layout_collapseMode="parallax"
+                    android:src="@drawable/photo"
+                    android:scaleType="centerCrop"/>
+
+            <android.support.v7.widget.Toolbar
+                    android:id="@+id/toolbar"
+                    android:layout_height="?attr/actionBarSize"
+                    android:layout_width="match_parent"
+                    app:layout_collapseMode="pin"/>
+
+        </android.support.design.widget.CollapsingToolbarLayout>
+
+    </android.support.design.widget.AppBarLayout>
+
+    <include layout="@layout/include_appbar_scrollview"/>
+
+</android.support.design.widget.CoordinatorLayout>
diff --git a/samples/SupportDesignDemos/res/layout/design_appbar_toolbar_collapse_with_image_insets.xml b/samples/SupportDesignDemos/res/layout/design_appbar_toolbar_collapse_with_image_insets.xml
new file mode 100644
index 0000000..6e2ba9b
--- /dev/null
+++ b/samples/SupportDesignDemos/res/layout/design_appbar_toolbar_collapse_with_image_insets.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2015 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.
+  -->
+
+<android.support.design.widget.CoordinatorLayout
+        xmlns:android="http://schemas.android.com/apk/res/android"
+        xmlns:app="http://schemas.android.com/apk/res-auto"
+        android:id="@+id/col"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:fitsSystemWindows="true">
+
+    <android.support.design.widget.AppBarLayout
+            android:id="@+id/app_bar"
+            android:layout_height="wrap_content"
+            android:layout_width="match_parent"
+            android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
+            android:fitsSystemWindows="true">
+
+        <android.support.design.widget.CollapsingToolbarLayout
+                android:id="@+id/collapsing_app_bar"
+                android:layout_width="match_parent"
+                android:layout_height="256dp"
+                app:layout_scrollFlags="scroll|exitUntilCollapsed"
+                app:contentScrim="?attr/colorPrimary">
+
+            <ImageView
+                    android:id="@+id/app_bar_image"
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    app:layout_collapseMode="parallax"
+                    android:src="@drawable/photo"
+                    android:scaleType="centerCrop"
+                    android:fitsSystemWindows="true"/>
+
+            <android.support.v7.widget.Toolbar
+                    android:id="@+id/toolbar"
+                    android:layout_height="?attr/actionBarSize"
+                    android:layout_width="match_parent"
+                    app:layout_collapseMode="pin"/>
+
+        </android.support.design.widget.CollapsingToolbarLayout>
+
+    </android.support.design.widget.AppBarLayout>
+
+    <include layout="@layout/include_appbar_scrollview"/>
+
+</android.support.design.widget.CoordinatorLayout>
diff --git a/samples/SupportDesignDemos/res/layout/design_appbar_toolbar_parallax_overlap.xml b/samples/SupportDesignDemos/res/layout/design_appbar_toolbar_parallax_overlap.xml
new file mode 100644
index 0000000..2b12b91
--- /dev/null
+++ b/samples/SupportDesignDemos/res/layout/design_appbar_toolbar_parallax_overlap.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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.
+-->
+
+<android.support.design.widget.CoordinatorLayout
+        xmlns:android="http://schemas.android.com/apk/res/android"
+        xmlns:app="http://schemas.android.com/apk/res-auto"
+        android:id="@+id/col"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+
+    <android.support.design.widget.AppBarLayout
+            android:id="@+id/app_bar"
+            android:layout_height="192dp"
+            android:layout_width="match_parent"
+            android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
+
+        <android.support.design.widget.CollapsingToolbarLayout
+                android:id="@+id/collapsing_app_bar"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                app:layout_scrollFlags="scroll|exitUntilCollapsed"
+                app:layout_scrollInterpolator="@android:anim/decelerate_interpolator"
+                app:contentScrim="?attr/colorPrimary">
+
+            <ImageView
+                    android:id="@+id/app_bar_image"
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:src="@drawable/photo"
+                    android:scaleType="centerCrop"/>
+
+            <android.support.v7.widget.Toolbar
+                    android:id="@+id/toolbar"
+                    android:layout_height="?attr/actionBarSize"
+                    android:layout_width="match_parent"
+                    app:layout_collapseMode="pin"/>
+
+        </android.support.design.widget.CollapsingToolbarLayout>
+
+    </android.support.design.widget.AppBarLayout>
+
+    <include layout="@layout/include_appbar_scrollview_with_image" />
+
+</android.support.design.widget.CoordinatorLayout>
diff --git a/samples/SupportDesignDemos/res/layout/design_appbar_toolbar_scroll_tabs_pinned.xml b/samples/SupportDesignDemos/res/layout/design_appbar_toolbar_scroll_tabs_pinned.xml
new file mode 100644
index 0000000..c7bc615
--- /dev/null
+++ b/samples/SupportDesignDemos/res/layout/design_appbar_toolbar_scroll_tabs_pinned.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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.
+-->
+
+<android.support.design.widget.CoordinatorLayout
+        xmlns:android="http://schemas.android.com/apk/res/android"
+        xmlns:app="http://schemas.android.com/apk/res-auto"
+        android:id="@+id/col"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+
+    <android.support.design.widget.AppBarLayout
+            android:id="@+id/app_bar"
+            android:layout_height="wrap_content"
+            android:layout_width="match_parent"
+            android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
+
+        <android.support.v7.widget.Toolbar
+                android:id="@+id/toolbar"
+                android:layout_height="?attr/actionBarSize"
+                android:layout_width="match_parent"
+                app:layout_scrollFlags="scroll|enterAlways"/>
+
+        <android.support.design.widget.TabLayout
+                android:id="@+id/tabs"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                app:tabMode="scrollable"/>
+
+    </android.support.design.widget.AppBarLayout>
+
+    <include layout="@layout/include_appbar_recyclerview"/>
+
+</android.support.design.widget.CoordinatorLayout>
+
diff --git a/samples/SupportDesignDemos/res/layout/design_appbar_toolbar_scroll_tabs_pinned_with_swiperefres.xml b/samples/SupportDesignDemos/res/layout/design_appbar_toolbar_scroll_tabs_pinned_with_swiperefres.xml
new file mode 100644
index 0000000..b5e0c07
--- /dev/null
+++ b/samples/SupportDesignDemos/res/layout/design_appbar_toolbar_scroll_tabs_pinned_with_swiperefres.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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.
+-->
+
+<android.support.design.widget.CoordinatorLayout
+        xmlns:android="http://schemas.android.com/apk/res/android"
+        xmlns:app="http://schemas.android.com/apk/res-auto"
+        android:id="@+id/col"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+
+    <android.support.design.widget.AppBarLayout
+            android:id="@+id/app_bar"
+            android:layout_height="wrap_content"
+            android:layout_width="match_parent"
+            android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
+
+        <android.support.v7.widget.Toolbar
+                android:id="@+id/toolbar"
+                android:layout_height="?attr/actionBarSize"
+                android:layout_width="match_parent"
+                app:layout_scrollFlags="scroll|enterAlways"/>
+
+        <android.support.design.widget.TabLayout
+                android:id="@+id/tabs"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                app:tabMode="scrollable"/>
+
+    </android.support.design.widget.AppBarLayout>
+
+    <include layout="@layout/include_appbar_recyclerview_swiperefresh" />
+
+</android.support.design.widget.CoordinatorLayout>
+
diff --git a/samples/SupportDesignDemos/res/layout/design_appbar_toolbar_scroll_tabs_scroll.xml b/samples/SupportDesignDemos/res/layout/design_appbar_toolbar_scroll_tabs_scroll.xml
new file mode 100644
index 0000000..239c036
--- /dev/null
+++ b/samples/SupportDesignDemos/res/layout/design_appbar_toolbar_scroll_tabs_scroll.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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.
+-->
+
+<android.support.design.widget.CoordinatorLayout
+        xmlns:android="http://schemas.android.com/apk/res/android"
+        xmlns:app="http://schemas.android.com/apk/res-auto"
+        android:id="@+id/col"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+
+    <android.support.design.widget.AppBarLayout
+            android:id="@+id/app_bar"
+            android:layout_height="wrap_content"
+            android:layout_width="match_parent"
+            android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
+
+        <android.support.v7.widget.Toolbar
+                android:id="@+id/toolbar"
+                android:layout_height="?attr/actionBarSize"
+                android:layout_width="match_parent"
+                app:layout_scrollFlags="scroll|enterAlways"/>
+
+        <android.support.design.widget.TabLayout
+                android:id="@+id/tabs"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                app:layout_scrollFlags="scroll|enterAlways"
+                app:tabMode="scrollable"/>
+
+    </android.support.design.widget.AppBarLayout>
+
+    <include layout="@layout/include_appbar_scrollview"/>
+
+</android.support.design.widget.CoordinatorLayout>
+
diff --git a/samples/SupportDesignDemos/res/layout/design_appbar_toolbar_scroll_tabs_scroll_snap.xml b/samples/SupportDesignDemos/res/layout/design_appbar_toolbar_scroll_tabs_scroll_snap.xml
new file mode 100644
index 0000000..b559ca3
--- /dev/null
+++ b/samples/SupportDesignDemos/res/layout/design_appbar_toolbar_scroll_tabs_scroll_snap.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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.
+-->
+
+<android.support.design.widget.CoordinatorLayout
+        xmlns:android="http://schemas.android.com/apk/res/android"
+        xmlns:app="http://schemas.android.com/apk/res-auto"
+        android:id="@+id/col"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+
+    <android.support.design.widget.AppBarLayout
+            android:id="@+id/app_bar"
+            android:layout_height="wrap_content"
+            android:layout_width="match_parent"
+            android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
+
+        <android.support.v7.widget.Toolbar
+                android:id="@+id/toolbar"
+                android:layout_height="?attr/actionBarSize"
+                android:layout_width="match_parent"
+                app:layout_scrollFlags="scroll|enterAlways|snap"/>
+
+        <android.support.design.widget.TabLayout
+                android:id="@+id/tabs"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                app:layout_scrollFlags="scroll|enterAlways|snap"
+                app:tabMode="scrollable"/>
+
+    </android.support.design.widget.AppBarLayout>
+
+    <include layout="@layout/include_appbar_scrollview"/>
+
+</android.support.design.widget.CoordinatorLayout>
+
diff --git a/samples/SupportDesignDemos/res/layout/design_bottom_sheet_fragment.xml b/samples/SupportDesignDemos/res/layout/design_bottom_sheet_fragment.xml
new file mode 100644
index 0000000..bdaff00
--- /dev/null
+++ b/samples/SupportDesignDemos/res/layout/design_bottom_sheet_fragment.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2016 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="#ccc">
+
+    <TextView
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="@string/bottomsheet_with_fragment"
+            android:padding="16dp"
+            style="@style/TextAppearance.AppCompat.Headline"/>
+
+    <android.support.v7.widget.RecyclerView
+            android:id="@+id/list2"
+            android:layout_width="match_parent"
+            android:layout_height="0dp"
+            android:layout_weight="1"/>
+
+</LinearLayout>
diff --git a/samples/SupportDesignDemos/res/layout/design_bottom_sheet_hideable.xml b/samples/SupportDesignDemos/res/layout/design_bottom_sheet_hideable.xml
new file mode 100644
index 0000000..6afd431
--- /dev/null
+++ b/samples/SupportDesignDemos/res/layout/design_bottom_sheet_hideable.xml
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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.
+-->
+<android.support.design.widget.CoordinatorLayout
+        android:id="@+id/coordinator"
+        xmlns:android="http://schemas.android.com/apk/res/android"
+        xmlns:app="http://schemas.android.com/apk/res-auto"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+
+    <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:orientation="vertical"
+            android:padding="16dp">
+
+        <TextView
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:text="@string/bottomsheet_hideable"
+                style="@style/TextAppearance.AppCompat.Headline"/>
+
+        <Button
+                android:id="@+id/toggle"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="16dp"
+                android:freezesText="true"
+                android:text="@string/bottomsheet_hide"/>
+
+    </LinearLayout>
+
+    <!--
+        This is the bottom sheet. You can use any View as a bottom sheet by marking it with
+        app:layout_behavior as BottomSheetBehavior.
+    -->
+    <LinearLayout
+            android:id="@+id/bottom_sheet"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_marginLeft="@dimen/bottom_sheet_horizontal_margin"
+            android:layout_marginRight="@dimen/bottom_sheet_horizontal_margin"
+            android:background="?android:attr/windowBackground"
+            android:elevation="@dimen/bottom_sheet_elevation"
+            android:minHeight="@dimen/bottom_sheet_peek_height"
+            android:orientation="vertical"
+            app:layout_behavior="@string/bottom_sheet_behavior"
+            app:behavior_peekHeight="@dimen/bottom_sheet_peek_height"
+            app:behavior_hideable="true">
+
+        <include layout="@layout/include_bottom_sheet"/>
+
+    </LinearLayout>
+
+    <TextView
+            android:id="@+id/slide_offset"
+            android:layout_width="128dp"
+            android:layout_height="wrap_content"
+            android:layout_gravity="top|right"
+            android:padding="8dp"
+            android:elevation="24dp"
+            android:clickable="false"
+            style="@style/TextAppearance.AppCompat.Body1"/>
+
+</android.support.design.widget.CoordinatorLayout>
diff --git a/samples/SupportDesignDemos/res/layout/design_bottom_sheet_modal.xml b/samples/SupportDesignDemos/res/layout/design_bottom_sheet_modal.xml
new file mode 100644
index 0000000..cbd3b27
--- /dev/null
+++ b/samples/SupportDesignDemos/res/layout/design_bottom_sheet_modal.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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:padding="16dp">
+
+    <TextView
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="@string/bottomsheet_modal"
+            style="@style/TextAppearance.AppCompat.Headline"/>
+
+    <Button
+            android:id="@+id/show"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="16dp"
+            android:text="@string/bottomsheet_show"/>
+
+</LinearLayout>
diff --git a/samples/SupportDesignDemos/res/layout/design_bottom_sheet_persistent.xml b/samples/SupportDesignDemos/res/layout/design_bottom_sheet_persistent.xml
new file mode 100644
index 0000000..e7943d9
--- /dev/null
+++ b/samples/SupportDesignDemos/res/layout/design_bottom_sheet_persistent.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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.
+-->
+<android.support.design.widget.CoordinatorLayout
+        android:id="@+id/coordinator"
+        xmlns:android="http://schemas.android.com/apk/res/android"
+        xmlns:app="http://schemas.android.com/apk/res-auto"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+
+    <TextView
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="@string/bottomsheet_persistent"
+            android:padding="16dp"
+            style="@style/TextAppearance.AppCompat.Headline"/>
+
+    <!--
+        This is the bottom sheet. You can use any View as a bottom sheet by marking it with
+        app:layout_behavior as BottomSheetBehavior.
+    -->
+    <LinearLayout
+            android:id="@+id/bottom_sheet"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_marginLeft="@dimen/bottom_sheet_horizontal_margin"
+            android:layout_marginRight="@dimen/bottom_sheet_horizontal_margin"
+            android:background="?android:attr/windowBackground"
+            android:elevation="@dimen/bottom_sheet_elevation"
+            android:minHeight="@dimen/bottom_sheet_peek_height"
+            android:orientation="vertical"
+            app:layout_behavior="@string/bottom_sheet_behavior"
+            app:behavior_peekHeight="@dimen/bottom_sheet_peek_height">
+
+        <include layout="@layout/include_bottom_sheet"/>
+
+    </LinearLayout>
+
+</android.support.design.widget.CoordinatorLayout>
diff --git a/samples/SupportDesignDemos/res/layout/design_bottom_sheet_recyclerview.xml b/samples/SupportDesignDemos/res/layout/design_bottom_sheet_recyclerview.xml
new file mode 100644
index 0000000..7126262
--- /dev/null
+++ b/samples/SupportDesignDemos/res/layout/design_bottom_sheet_recyclerview.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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.
+-->
+<android.support.v7.widget.RecyclerView
+        xmlns:android="http://schemas.android.com/apk/res/android"
+        android:id="@+id/bottom_sheet_recyclerview"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:paddingTop="8dp"
+        android:paddingBottom="8dp"
+        android:clipToPadding="false"
+        android:scrollbars="vertical"/>
diff --git a/samples/SupportDesignDemos/res/layout/design_bottom_sheet_scroll.xml b/samples/SupportDesignDemos/res/layout/design_bottom_sheet_scroll.xml
new file mode 100644
index 0000000..6635403
--- /dev/null
+++ b/samples/SupportDesignDemos/res/layout/design_bottom_sheet_scroll.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2016 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.
+-->
+<android.support.design.widget.CoordinatorLayout
+        android:id="@+id/coordinator"
+        xmlns:android="http://schemas.android.com/apk/res/android"
+        xmlns:app="http://schemas.android.com/apk/res-auto"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+
+    <ScrollView
+            android:layout_width="match_parent"
+            android:layout_height="match_parent">
+
+        <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:orientation="vertical"
+                android:padding="16dp">
+
+            <TextView
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:text="@string/bottomsheet_scroll"
+                    style="@style/TextAppearance.AppCompat.Headline"/>
+
+            <TextView
+                    android:id="@+id/dialogue_background"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginTop="16dp"
+                    style="@style/TextAppearance.AppCompat.Body1"/>
+
+        </LinearLayout>
+
+    </ScrollView>
+
+    <!--
+        This is the bottom sheet. You can use any View as a bottom sheet by marking it with
+        app:layout_behavior as BottomSheetBehavior.
+    -->
+    <LinearLayout
+            android:id="@+id/bottom_sheet"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_marginLeft="@dimen/bottom_sheet_horizontal_margin"
+            android:layout_marginRight="@dimen/bottom_sheet_horizontal_margin"
+            android:background="?android:attr/windowBackground"
+            android:elevation="@dimen/bottom_sheet_elevation"
+            android:minHeight="@dimen/bottom_sheet_peek_height"
+            android:orientation="vertical"
+            app:layout_behavior="@string/bottom_sheet_behavior"
+            app:behavior_peekHeight="@dimen/bottom_sheet_peek_height">
+
+        <include layout="@layout/include_bottom_sheet"/>
+
+    </LinearLayout>
+
+</android.support.design.widget.CoordinatorLayout>
diff --git a/samples/SupportDesignDemos/res/layout/design_bottom_sheet_with_fab.xml b/samples/SupportDesignDemos/res/layout/design_bottom_sheet_with_fab.xml
new file mode 100644
index 0000000..343577b
--- /dev/null
+++ b/samples/SupportDesignDemos/res/layout/design_bottom_sheet_with_fab.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2016 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.
+-->
+<android.support.design.widget.CoordinatorLayout
+    android:id="@+id/coordinator"
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:orientation="vertical"
+        android:padding="16dp">
+
+        <TextView
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="@string/bottomsheet_with_fab"
+            style="@style/TextAppearance.AppCompat.Headline"/>
+
+        <Button
+            android:id="@+id/toggle"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="16dp"
+            android:freezesText="true"
+            android:text="@string/bottomsheet_hide"/>
+
+    </LinearLayout>
+
+    <LinearLayout
+        android:id="@+id/bottom_sheet"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_marginLeft="@dimen/bottom_sheet_horizontal_margin"
+        android:layout_marginRight="@dimen/bottom_sheet_horizontal_margin"
+        android:background="?android:attr/windowBackground"
+        android:elevation="8dp"
+        android:minHeight="@dimen/bottom_sheet_peek_height"
+        android:orientation="vertical"
+        app:layout_behavior="@string/bottom_sheet_behavior"
+        app:behavior_peekHeight="@dimen/bottom_sheet_peek_height"
+        app:behavior_hideable="true">
+
+        <include layout="@layout/include_bottom_sheet"/>
+
+    </LinearLayout>
+
+    <android.support.design.widget.FloatingActionButton
+        android:layout_height="wrap_content"
+        android:layout_width="wrap_content"
+        android:src="@drawable/ic_add"
+        android:clickable="true"
+        app:layout_anchor="@id/bottom_sheet"
+        app:layout_anchorGravity="top|end"
+        app:elevation="10dp"
+        app:useCompatPadding="true"/>
+
+</android.support.design.widget.CoordinatorLayout>
diff --git a/samples/SupportDesignDemos/res/layout/design_bottom_sheet_with_fragment.xml b/samples/SupportDesignDemos/res/layout/design_bottom_sheet_with_fragment.xml
new file mode 100644
index 0000000..61d38cf
--- /dev/null
+++ b/samples/SupportDesignDemos/res/layout/design_bottom_sheet_with_fragment.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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.
+-->
+<android.support.design.widget.CoordinatorLayout
+        xmlns:android="http://schemas.android.com/apk/res/android"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        xmlns:app="http://schemas.android.com/apk/res-auto">
+
+    <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_marginBottom="@dimen/bottom_sheet_peek_height"
+            android:orientation="vertical">
+
+        <TextView
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:text="@string/bottomsheet_with_fragment"
+                android:padding="16dp"
+                style="@style/TextAppearance.AppCompat.Headline"/>
+
+        <android.support.v7.widget.RecyclerView
+                android:id="@+id/list1"
+                android:layout_width="match_parent"
+                android:layout_height="0dp"
+                android:layout_weight="1"/>
+
+    </LinearLayout>
+
+    <fragment
+            android:id="@+id/bottom_sheet"
+            class="com.example.android.support.design.widget.BottomSheetWithFragment$BottomSheetFragment"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            app:layout_behavior="@string/bottom_sheet_behavior"
+            app:behavior_peekHeight="@dimen/bottom_sheet_peek_height"/>
+
+</android.support.design.widget.CoordinatorLayout>
diff --git a/samples/SupportDesignDemos/res/layout/design_fab.xml b/samples/SupportDesignDemos/res/layout/design_fab.xml
new file mode 100644
index 0000000..0eedea3
--- /dev/null
+++ b/samples/SupportDesignDemos/res/layout/design_fab.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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.
+-->
+
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+             xmlns:app="http://schemas.android.com/apk/res-auto"
+             android:layout_width="match_parent"
+             android:layout_height="match_parent">
+
+    <android.support.v7.widget.Toolbar
+            android:id="@+id/toolbar"
+            android:layout_height="wrap_content"
+            android:layout_width="match_parent"
+            android:minHeight="?attr/actionBarSize"
+            android:background="?attr/colorPrimaryDark"
+            android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
+            app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>
+
+    <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:orientation="vertical"
+            android:gravity="center_vertical"
+            android:clipToPadding="true">
+
+        <TextView
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:textAppearance="@style/TextAppearance.AppCompat.Title"
+                android:text="@string/fab_size_normal"
+                android:layout_margin="16dp"/>
+
+        <android.support.design.widget.FloatingActionButton
+                android:layout_height="wrap_content"
+                android:layout_width="wrap_content"
+                android:layout_margin="16dp"
+                android:src="@drawable/ic_add"
+                android:clickable="true" />
+
+        <TextView
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_margin="16dp"
+                android:textAppearance="@style/TextAppearance.AppCompat.Title"
+                android:text="@string/fab_size_mini" />
+
+        <android.support.design.widget.FloatingActionButton
+                android:layout_height="wrap_content"
+                android:layout_width="wrap_content"
+                android:layout_margin="16dp"
+                android:src="@drawable/ic_add"
+                android:clickable="true"
+                app:fabSize="mini" />
+
+    </LinearLayout>
+
+</FrameLayout>
\ No newline at end of file
diff --git a/samples/SupportDesignDemos/res/layout/design_navigation.xml b/samples/SupportDesignDemos/res/layout/design_navigation.xml
new file mode 100644
index 0000000..1ed87ae
--- /dev/null
+++ b/samples/SupportDesignDemos/res/layout/design_navigation.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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.
+-->
+<android.support.v4.widget.DrawerLayout
+        xmlns:android="http://schemas.android.com/apk/res/android"
+        xmlns:app="http://schemas.android.com/apk/res-auto"
+        android:id="@+id/drawer_layout"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:fitsSystemWindows="true">
+
+    <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:orientation="vertical">
+
+        <android.support.v7.widget.Toolbar
+                android:id="@+id/toolbar"
+                android:layout_height="wrap_content"
+                android:layout_width="match_parent"
+                android:minHeight="?attr/actionBarSize"
+                android:background="?attr/colorPrimary"
+                android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
+                app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>
+
+        <TextView
+                android:id="@+id/message"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:freezesText="true"
+                android:gravity="center"
+                android:text="@string/navigation_1"
+                android:textAppearance="?android:attr/textAppearanceLarge"/>
+
+    </LinearLayout>
+
+    <android.support.design.widget.NavigationView
+            android:id="@+id/navigation"
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:layout_gravity="start"
+            app:menu="@menu/navigation"/>
+
+</android.support.v4.widget.DrawerLayout>
diff --git a/samples/SupportDesignDemos/res/layout/design_navigation_header.xml b/samples/SupportDesignDemos/res/layout/design_navigation_header.xml
new file mode 100644
index 0000000..a03f0bb
--- /dev/null
+++ b/samples/SupportDesignDemos/res/layout/design_navigation_header.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<TextView xmlns:android="http://schemas.android.com/apk/res/android"
+          android:layout_width="match_parent"
+          android:layout_height="wrap_content"
+          android:minHeight="180dp"
+          android:padding="16dp"
+          android:background="?attr/colorPrimary"
+          android:gravity="bottom|start"
+          android:text="@string/navigation_header"
+          android:textAppearance="?android:attr/textAppearanceLargeInverse"/>
diff --git a/samples/SupportDesignDemos/res/layout/design_navigation_without_drawer.xml b/samples/SupportDesignDemos/res/layout/design_navigation_without_drawer.xml
new file mode 100644
index 0000000..12fd959
--- /dev/null
+++ b/samples/SupportDesignDemos/res/layout/design_navigation_without_drawer.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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"
+              xmlns:app="http://schemas.android.com/apk/res-auto"
+              android:orientation="horizontal"
+              android:layout_width="match_parent"
+              android:layout_height="match_parent">
+
+    <android.support.design.widget.NavigationView
+            android:id="@+id/navigation"
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_weight="1"
+            app:menu="@menu/navigation"/>
+
+    <TextView
+            android:id="@+id/message"
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_weight="1"
+            android:freezesText="true"
+            android:gravity="center"
+            android:text="@string/navigation_1"
+            android:textAppearance="?android:attr/textAppearanceLarge"/>
+
+</LinearLayout>
diff --git a/samples/SupportDesignDemos/res/layout/design_snackbar.xml b/samples/SupportDesignDemos/res/layout/design_snackbar.xml
new file mode 100644
index 0000000..ea5508a
--- /dev/null
+++ b/samples/SupportDesignDemos/res/layout/design_snackbar.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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.
+-->
+
+<android.support.design.widget.CoordinatorLayout
+        xmlns:android="http://schemas.android.com/apk/res/android"
+        android:id="@+id/content_view"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+
+    <LinearLayout android:layout_width="match_parent"
+                  android:layout_height="wrap_content"
+                  android:padding="16dp"
+                  android:orientation="vertical">
+
+        <Button
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:text="@string/snackbar_show_short"
+                android:onClick="showShort"/>
+
+        <Button
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:text="@string/snackbar_show_short_action"
+                android:onClick="showAction"/>
+
+        <Button
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:text="@string/snackbar_show_long"
+                android:onClick="showLong"/>
+
+        <Button
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:text="@string/snackbar_show_long_action"
+                android:onClick="showLongAction"/>
+
+        <Button
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:text="@string/snackbar_show_long_long_action"
+                android:onClick="showLongLongAction"/>
+
+    </LinearLayout>
+
+</android.support.design.widget.CoordinatorLayout>
\ No newline at end of file
diff --git a/samples/SupportDesignDemos/res/layout/design_snackbar_with_fab.xml b/samples/SupportDesignDemos/res/layout/design_snackbar_with_fab.xml
new file mode 100644
index 0000000..2f64d7b
--- /dev/null
+++ b/samples/SupportDesignDemos/res/layout/design_snackbar_with_fab.xml
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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.
+-->
+
+<android.support.design.widget.CoordinatorLayout
+        xmlns:android="http://schemas.android.com/apk/res/android"
+        android:id="@+id/content_view"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+
+    <LinearLayout android:layout_width="match_parent"
+                  android:layout_height="wrap_content"
+                  android:padding="16dp"
+                  android:orientation="vertical">
+
+        <Button
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:text="@string/snackbar_show_short"
+                android:onClick="showShort"/>
+
+        <Button
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:text="@string/snackbar_show_short_action"
+                android:onClick="showAction"/>
+
+        <Button
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:text="@string/snackbar_show_long"
+                android:onClick="showLong"/>
+
+        <Button
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:text="@string/snackbar_show_long_action"
+                android:onClick="showLongAction"/>
+
+        <Button
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:text="@string/snackbar_show_long_long_action"
+                android:onClick="showLongLongAction"/>
+
+    </LinearLayout>
+
+    <android.support.design.widget.FloatingActionButton
+            android:layout_height="wrap_content"
+            android:layout_width="wrap_content"
+            android:layout_gravity="bottom|end"
+            android:layout_margin="16dp"
+            android:src="@drawable/ic_add"
+            android:clickable="true"/>
+
+</android.support.design.widget.CoordinatorLayout>
\ No newline at end of file
diff --git a/samples/SupportDesignDemos/res/layout/design_snackbar_without_col.xml b/samples/SupportDesignDemos/res/layout/design_snackbar_without_col.xml
new file mode 100644
index 0000000..055479a
--- /dev/null
+++ b/samples/SupportDesignDemos/res/layout/design_snackbar_without_col.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2015 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/content_view"
+              android:layout_width="match_parent"
+              android:layout_height="wrap_content"
+              android:padding="16dp"
+              android:orientation="vertical">
+
+    <Button
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="@string/snackbar_show_short"
+            android:onClick="showShort"/>
+
+    <Button
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="@string/snackbar_show_short_action"
+            android:onClick="showAction"/>
+
+    <Button
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="@string/snackbar_show_long"
+            android:onClick="showLong"/>
+
+    <Button
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="@string/snackbar_show_long_action"
+            android:onClick="showLongAction"/>
+
+    <Button
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="@string/snackbar_show_long_long_action"
+            android:onClick="showLongLongAction"/>
+
+</LinearLayout>
diff --git a/samples/SupportDesignDemos/res/layout/design_tab_custom.xml b/samples/SupportDesignDemos/res/layout/design_tab_custom.xml
new file mode 100644
index 0000000..77027ec
--- /dev/null
+++ b/samples/SupportDesignDemos/res/layout/design_tab_custom.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2016 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.
+-->
+
+<RelativeLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <View
+        android:layout_width="16dp"
+        android:layout_height="16dp"
+        android:layout_centerInParent="true"
+        android:background="@drawable/custom_tab_indicator" />
+
+</RelativeLayout>
\ No newline at end of file
diff --git a/samples/SupportDesignDemos/res/layout/design_tabs_custom.xml b/samples/SupportDesignDemos/res/layout/design_tabs_custom.xml
new file mode 100644
index 0000000..e8e3ed9
--- /dev/null
+++ b/samples/SupportDesignDemos/res/layout/design_tabs_custom.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2016 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"
+              xmlns:app="http://schemas.android.com/apk/res-auto"
+              android:layout_width="match_parent"
+              android:layout_height="match_parent"
+              android:orientation="vertical">
+
+    <android.support.v7.widget.Toolbar
+            android:id="@+id/toolbar"
+            android:layout_height="?attr/actionBarSize"
+            android:layout_width="match_parent"
+            android:background="?attr/colorPrimary"
+            android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
+            app:contentInsetStart="72dp"
+            app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>
+
+    <android.support.design.widget.TabLayout
+            android:id="@+id/tabs"
+            android:layout_height="wrap_content"
+            android:layout_width="match_parent"
+            android:background="?attr/colorPrimary"
+            android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" />
+
+</LinearLayout>
diff --git a/samples/SupportDesignDemos/res/layout/design_tabs_item.xml b/samples/SupportDesignDemos/res/layout/design_tabs_item.xml
new file mode 100644
index 0000000..560b165
--- /dev/null
+++ b/samples/SupportDesignDemos/res/layout/design_tabs_item.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2016 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"
+              xmlns:app="http://schemas.android.com/apk/res-auto"
+              android:layout_width="match_parent"
+              android:layout_height="match_parent"
+              android:orientation="vertical">
+
+    <android.support.v7.widget.Toolbar
+            android:id="@+id/toolbar"
+            android:layout_height="?attr/actionBarSize"
+            android:layout_width="match_parent"
+            android:background="?attr/colorPrimary"
+            android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
+            app:contentInsetStart="72dp"
+            app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>
+
+    <android.support.design.widget.TabLayout
+            android:id="@+id/tabs"
+            android:layout_height="wrap_content"
+            android:layout_width="match_parent"
+            android:background="?attr/colorPrimary"
+            android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
+
+        <android.support.design.widget.TabItem
+                android:text="@string/tab_text"/>
+
+        <android.support.design.widget.TabItem
+                android:icon="@drawable/ic_android"/>
+
+    </android.support.design.widget.TabLayout>
+
+</LinearLayout>
diff --git a/samples/SupportDesignDemos/res/layout/design_tabs_viewpager.xml b/samples/SupportDesignDemos/res/layout/design_tabs_viewpager.xml
new file mode 100644
index 0000000..8d78ff9
--- /dev/null
+++ b/samples/SupportDesignDemos/res/layout/design_tabs_viewpager.xml
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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"
+              xmlns:app="http://schemas.android.com/apk/res-auto"
+              android:layout_width="match_parent"
+              android:layout_height="match_parent"
+              android:orientation="vertical">
+
+    <android.support.v7.widget.Toolbar
+            android:id="@+id/toolbar"
+            android:layout_height="?attr/actionBarSize"
+            android:layout_width="match_parent"
+            android:background="?attr/colorPrimary"
+            android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
+            app:contentInsetStart="72dp"
+            app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>
+
+    <android.support.design.widget.TabLayout
+            android:id="@+id/tabs"
+            android:layout_height="wrap_content"
+            android:layout_width="match_parent"
+            android:background="?attr/colorPrimary"
+            android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
+            app:tabMode="scrollable"
+            app:tabContentStart="72dp"/>
+
+    <android.support.v4.view.ViewPager
+            android:id="@+id/tabs_viewpager"
+            android:layout_height="0px"
+            android:layout_width="match_parent"
+            android:layout_weight="1"/>
+
+    <LinearLayout
+            android:id="@+id/buttons"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_margin="16dp">
+
+        <Button
+                android:id="@+id/btn_add_tab"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="@string/add_tab"
+                android:onClick="addTab"/>
+
+        <Button
+                android:id="@+id/btn_remove_tab"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="@string/remove_tab"
+                android:onClick="removeTab"/>
+
+        <Button
+                android:id="@+id/btn_select_first_tab"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="@string/select_first_tab"
+                android:onClick="selectFirstTab"/>
+
+    </LinearLayout>
+
+    <RadioGroup
+            android:id="@+id/radiogroup_tab_mode"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal"
+            android:gravity="center_horizontal"
+            android:padding="8dp">
+
+        <RadioButton
+                android:id="@+id/rb_tab_fixed"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="@string/tabs_fixed"/>
+
+        <RadioButton
+                android:id="@+id/rb_tab_scrollable"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="@string/tabs_scrollable"/>
+    </RadioGroup>
+
+    <RadioGroup
+            android:id="@+id/radiogroup_tab_gravity"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal"
+            android:gravity="center_horizontal"
+            android:padding="8dp">
+
+        <RadioButton
+                android:id="@+id/rb_tab_g_center"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="@string/tabs_gravity_center"/>
+
+        <RadioButton
+                android:id="@+id/rb_tab_g_fill"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="@string/tabs_gravity_fill"/>
+
+    </RadioGroup>
+
+</LinearLayout>
diff --git a/samples/SupportDesignDemos/res/layout/design_text_input.xml b/samples/SupportDesignDemos/res/layout/design_text_input.xml
new file mode 100644
index 0000000..bd5f69b
--- /dev/null
+++ b/samples/SupportDesignDemos/res/layout/design_text_input.xml
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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"
+              xmlns:app="http://schemas.android.com/apk/res-auto"
+              android:layout_width="match_parent"
+              android:layout_height="match_parent"
+              android:orientation="vertical"
+              android:padding="16dp">
+
+    <android.support.design.widget.TextInputLayout
+            android:id="@+id/input_username"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            app:errorEnabled="true">
+
+        <android.support.design.widget.TextInputEditText
+                android:id="@+id/edit_username"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:hint="@string/form_username"/>
+
+    </android.support.design.widget.TextInputLayout>
+
+    <LinearLayout android:layout_width="match_parent"
+                  android:layout_height="wrap_content"
+                  android:orientation="horizontal">
+
+        <Button
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="@string/show_error"
+                android:onClick="showError"/>
+
+        <Button
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="@string/clear_error"
+                android:onClick="clearError"/>
+
+    </LinearLayout>
+
+    <android.support.design.widget.TextInputLayout
+            android:id="@+id/input_email"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="8dp"
+            app:errorEnabled="true">
+
+        <android.support.design.widget.TextInputEditText
+                android:id="@+id/edit_email"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:hint="@string/form_email"/>
+
+    </android.support.design.widget.TextInputLayout>
+
+    <android.support.design.widget.TextInputLayout
+            android:id="@+id/input_description"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="8dp"
+            app:counterEnabled="true"
+            app:counterMaxLength="30">
+
+        <EditText
+                android:id="@+id/edit_description"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:hint="@string/form_description"/>
+
+    </android.support.design.widget.TextInputLayout>
+
+</LinearLayout>
\ No newline at end of file
diff --git a/samples/SupportDesignDemos/res/layout/include_appbar_recyclerview.xml b/samples/SupportDesignDemos/res/layout/include_appbar_recyclerview.xml
new file mode 100644
index 0000000..ab255e4
--- /dev/null
+++ b/samples/SupportDesignDemos/res/layout/include_appbar_recyclerview.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2015 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.
+  -->
+<android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
+        xmlns:app="http://schemas.android.com/apk/res-auto"
+        android:id="@+id/appbar_recyclerview"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        app:layout_behavior="@string/appbar_scrolling_view_behavior" />
\ No newline at end of file
diff --git a/samples/SupportDesignDemos/res/layout/include_appbar_recyclerview_swiperefresh.xml b/samples/SupportDesignDemos/res/layout/include_appbar_recyclerview_swiperefresh.xml
new file mode 100644
index 0000000..6a8d448
--- /dev/null
+++ b/samples/SupportDesignDemos/res/layout/include_appbar_recyclerview_swiperefresh.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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.
+-->
+
+<android.support.v4.widget.SwipeRefreshLayout
+        xmlns:android="http://schemas.android.com/apk/res/android"
+        xmlns:app="http://schemas.android.com/apk/res-auto"
+        android:id="@+id/swiperefresh"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        app:layout_behavior="@string/appbar_scrolling_view_behavior">
+
+    <android.support.v7.widget.RecyclerView
+            android:id="@+id/appbar_recyclerview"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"/>
+
+</android.support.v4.widget.SwipeRefreshLayout>
\ No newline at end of file
diff --git a/samples/SupportDesignDemos/res/layout/include_appbar_scrollview.xml b/samples/SupportDesignDemos/res/layout/include_appbar_scrollview.xml
new file mode 100644
index 0000000..b10752a
--- /dev/null
+++ b/samples/SupportDesignDemos/res/layout/include_appbar_scrollview.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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.
+-->
+<android.support.v4.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+        xmlns:app="http://schemas.android.com/apk/res-auto"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        app:layout_behavior="@string/appbar_scrolling_view_behavior">
+
+    <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="1000dp"
+            android:orientation="vertical">
+
+        <TextView
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:gravity="center_horizontal"
+                android:text="@string/scroll_top" />
+
+        <TextView
+                android:id="@+id/textview_dialogue"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:padding="16dp"/>
+
+        <TextView
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:gravity="center_horizontal"
+                android:text="@string/scroll_bottom" />
+
+    </LinearLayout>
+
+</android.support.v4.widget.NestedScrollView>
\ No newline at end of file
diff --git a/samples/SupportDesignDemos/res/layout/include_appbar_scrollview_with_image.xml b/samples/SupportDesignDemos/res/layout/include_appbar_scrollview_with_image.xml
new file mode 100644
index 0000000..a5392b2
--- /dev/null
+++ b/samples/SupportDesignDemos/res/layout/include_appbar_scrollview_with_image.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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.
+-->
+<android.support.v4.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+        xmlns:app="http://schemas.android.com/apk/res-auto"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        app:layout_behavior="@string/appbar_scrolling_view_behavior"
+        app:behavior_overlapTop="32dp">
+
+    <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="1000dp"
+            android:orientation="vertical">
+
+        <ImageView android:layout_width="72dp"
+                   android:layout_height="72dp"
+                   android:src="@drawable/app_sample_code"
+                   android:layout_marginLeft="16dp"/>
+
+        <TextView
+                android:id="@+id/textview_dialogue"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:padding="16dp"/>
+
+    </LinearLayout>
+
+</android.support.v4.widget.NestedScrollView>
\ No newline at end of file
diff --git a/samples/SupportDesignDemos/res/layout/include_bottom_sheet.xml b/samples/SupportDesignDemos/res/layout/include_bottom_sheet.xml
new file mode 100644
index 0000000..ab00ece
--- /dev/null
+++ b/samples/SupportDesignDemos/res/layout/include_bottom_sheet.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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.
+-->
+<merge xmlns:tools="http://schemas.android.com/tools"
+       xmlns:android="http://schemas.android.com/apk/res/android"
+       tools:showIn="@layout/design_bottom_sheet">
+
+    <TextView
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="@string/bottom_sheet"
+            android:paddingTop="8dp"
+            android:paddingLeft="16dp"
+            android:paddingRight="16dp"
+            android:paddingBottom="8dp"
+            style="@style/TextAppearance.AppCompat.Title"/>
+
+    <View
+            android:layout_width="match_parent"
+            android:layout_height="1dp"
+            android:background="@android:color/darker_gray"/>
+
+    <android.support.v4.widget.NestedScrollView
+            android:id="@+id/scroll"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent">
+
+        <TextView
+                android:id="@+id/dialogue"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:padding="16dp"
+                style="@style/TextAppearance.AppCompat.Body1"/>
+
+    </android.support.v4.widget.NestedScrollView>
+
+</merge>
diff --git a/samples/SupportDesignDemos/res/menu/navigation.xml b/samples/SupportDesignDemos/res/menu/navigation.xml
new file mode 100644
index 0000000..6425b18
--- /dev/null
+++ b/samples/SupportDesignDemos/res/menu/navigation.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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"
+      xmlns:app="http://schemas.android.com/apk/res-auto">
+
+    <!-- Main items -->
+    <group android:checkableBehavior="single">
+        <item
+                android:id="@+id/navigation_item_1"
+                android:checked="true"
+                android:icon="@drawable/ic_android"
+                android:title="@string/navigation_item_1"/>
+        <item
+                android:id="@+id/navigation_item_2"
+                android:icon="@drawable/ic_android"
+                android:title="@string/navigation_item_2"/>
+        <item
+                android:id="@+id/navigation_item_3"
+                android:icon="@drawable/ic_android"
+                android:title="@string/navigation_item_3"
+                app:actionLayout="@layout/action_layout"/>
+        <item
+                android:id="@+id/navigation_item_disabled"
+                android:icon="@drawable/ic_android"
+                android:title="@string/navigation_item_4"
+                android:enabled="false"/>
+        <item
+                android:id="@+id/navigation_invisible"
+                android:icon="@drawable/ic_android"
+                android:title="@string/navigation_invisible"
+                android:visible="false"/>
+    </group>
+
+    <item
+            android:id="@+id/navigation_subheader"
+            android:title="@string/navigation_subheader">
+        <menu>
+            <item
+                    android:id="@+id/navigation_sub_item_1"
+                    android:icon="@drawable/ic_android"
+                    android:title="@string/navigation_sub_item_1"/>
+            <item
+                    android:id="@+id/navigation_sub_item_2"
+                    android:icon="@drawable/ic_android"
+                    android:title="@string/navigation_sub_item_2"/>
+        </menu>
+    </item>
+
+    <group android:id="@+id/aligned_items">
+        <item
+                android:id="@+id/navigation_with_icon"
+                android:icon="@drawable/ic_android"
+                android:title="@string/navigation_item_with_icon"/>
+        <item
+                android:id="@+id/navigation_without_icon"
+                android:title="@string/navigation_item_without_icon"/>
+    </group>
+
+</menu>
diff --git a/samples/SupportDesignDemos/res/menu/sample_actions.xml b/samples/SupportDesignDemos/res/menu/sample_actions.xml
new file mode 100644
index 0000000..7a13649
--- /dev/null
+++ b/samples/SupportDesignDemos/res/menu/sample_actions.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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"
+      xmlns:app="http://schemas.android.com/apk/res-auto">
+    <item android:id="@+id/action_search"
+          android:title="@string/menu_search"
+          android:icon="@drawable/ic_search"
+          app:showAsAction="ifRoom"/>
+    <item android:id="@+id/action_settings"
+          android:title="@string/menu_settings"
+          app:showAsAction="never"/>
+</menu>
diff --git a/samples/SupportDesignDemos/res/values-v21/styles.xml b/samples/SupportDesignDemos/res/values-v21/styles.xml
new file mode 100644
index 0000000..298dcf3
--- /dev/null
+++ b/samples/SupportDesignDemos/res/values-v21/styles.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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>
+
+    <style name="Theme.Design.TransparentStatus">
+        <item name="android:statusBarColor">@android:color/transparent</item>
+        <item name="android:windowDrawsSystemBarBackgrounds">true</item>
+    </style>
+
+    <style name="Theme.Navigation" parent="Theme.Navigation.Base">
+        <item name="android:statusBarColor">@android:color/transparent</item>
+        <item name="android:windowDrawsSystemBarBackgrounds">true</item>
+    </style>
+
+</resources>
diff --git a/samples/SupportDesignDemos/res/values-w540dp/dimens.xml b/samples/SupportDesignDemos/res/values-w540dp/dimens.xml
new file mode 100644
index 0000000..26fecbf
--- /dev/null
+++ b/samples/SupportDesignDemos/res/values-w540dp/dimens.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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="bottom_sheet_horizontal_margin">64dp</dimen>
+</resources>
diff --git a/samples/SupportDesignDemos/res/values/dimens.xml b/samples/SupportDesignDemos/res/values/dimens.xml
new file mode 100644
index 0000000..dc3a5f6
--- /dev/null
+++ b/samples/SupportDesignDemos/res/values/dimens.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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="bottom_sheet_horizontal_margin">0dp</dimen>
+    <dimen name="bottom_sheet_elevation">16dp</dimen>
+    <dimen name="bottom_sheet_peek_height">128dp</dimen>
+</resources>
diff --git a/samples/SupportDesignDemos/res/values/strings.xml b/samples/SupportDesignDemos/res/values/strings.xml
new file mode 100644
index 0000000..8f21310
--- /dev/null
+++ b/samples/SupportDesignDemos/res/values/strings.xml
@@ -0,0 +1,109 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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="activity_sample_code">Support Design Demos</string>
+
+    <string name="design_fab">Floating Action Button/Basic</string>
+    <string name="design_navigation">NavigationView/Usage</string>
+    <string name="design_navigation_without_drawer">NavigationView/Without drawer</string>
+    <string name="design_tabs_viewpager">TabLayout/Items from ViewPager</string>
+    <string name="design_tabs_preselected_viewpager">TabLayout/Items with preselection from ViewPager</string>
+    <string name="design_tabs_layout_items">TabLayout/Items from layout</string>
+    <string name="design_tabs_custom_items">TabLayout/Custom items</string>
+    <string name="design_text_input">Text Input</string>
+    <string name="design_bottomsheet_persistent">BottomSheet/Persistent</string>
+    <string name="design_bottomsheet_hideable">BottomSheet/Hideable</string>
+    <string name="design_bottomsheet_with_fab">BottomSheet/With FAB</string>
+    <string name="design_bottomsheet_scroll">BottomSheet/With ScrollView in background</string>
+    <string name="design_bottomsheet_with_fragment">BottomSheet/With Fragment</string>
+    <string name="design_bottomsheet_modal">BottomSheet/Modal</string>
+    <string name="design_bottomsheet_modal_skip_collapsed">BottomSheet/Modal (Skip collapsed)</string>
+
+    <string name="fab_size_normal">Normal size</string>
+    <string name="fab_size_mini">Mini size</string>
+
+    <string name="navigation_open">Open</string>
+    <string name="navigation_close">Close</string>
+    <string name="navigation_item_with_icon">Item with icon</string>
+    <string name="navigation_item_without_icon">Item without icon</string>
+    <string name="navigation_message">Clicked: \"%s\"</string>
+    <string name="navigation_header">Header</string>
+    <string name="navigation_item_1">Item 1</string>
+    <string name="navigation_item_2">Item 2</string>
+    <string name="navigation_item_3">Item 3</string>
+    <string name="navigation_item_4">Item 4 (disabled)</string>
+    <string name="navigation_1">1</string>
+    <string name="navigation_invisible">Invisible</string>
+    <string name="navigation_subheader">Subheader</string>
+    <string name="navigation_sub_item_1">Subitem 1</string>
+    <string name="navigation_sub_item_2">Subitem 2</string>
+
+    <string name="tabs_fixed">Fixed</string>
+    <string name="tabs_scrollable">Scrollable</string>
+    <string name="tabs_gravity_center">Center</string>
+    <string name="tabs_gravity_fill">Fill</string>
+
+    <string name="add_tab">Add tab</string>
+    <string name="remove_tab">Remove tab</string>
+    <string name="select_first_tab">Select tab #0</string>
+
+    <string name="tab_text">Music</string>
+
+    <string name="form_username">Username</string>
+    <string name="form_email">Email address</string>
+    <string name="form_description">Description</string>
+    <string name="show_error">Show error</string>
+    <string name="clear_error">Clear error</string>
+
+    <string name="design_snackbar_basic">Snackbar/Usage</string>
+    <string name="design_snackbar_fab">Snackbar/Coordinated with FAB</string>
+    <string name="design_snackbar_without_col">Snackbar/Usage without CoordinatorLayout</string>
+    <string name="snackbar_show_short">Snackbar (short message)</string>
+    <string name="snackbar_show_long">Snackbar (long message)</string>
+    <string name="snackbar_show_short_action">Show (short message + action)</string>
+    <string name="snackbar_show_long_action">Show (long message + action)</string>
+    <string name="snackbar_show_long_long_action">Show (long message + long action)</string>
+
+    <string name="design_appbar_toolbar_scroll_tabs_scroll">AppBar/Toolbar Scroll + Tabs Scroll</string>
+    <string name="design_appbar_toolbar_scroll_tabs_scroll_snap">AppBar/Toolbar Scroll + Tabs Scroll + Snap</string>
+    <string name="design_appbar_toolbar_scroll_tabs_pin">AppBar/Toolbar Scroll + Tabs Pin</string>
+    <string name="design_appbar_toolbar_scroll_tabs_pin_with_swiperefresh">AppBar/Toolbar Scroll + Tabs Pin + Swipe Refresh</string>
+    <string name="design_appbar_collapsing_toolbar_pin">AppBar/Collapsing Toolbar (pinned)</string>
+    <string name="design_appbar_collapsing_toolbar_pin_fab">AppBar/Collapsing Toolbar (pinned with FAB)</string>
+    <string name="design_appbar_collapsing_toolbar_pin_nested">AppBar/Collapsing Toolbar (pinned + nested)</string>
+    <string name="design_appbar_collapsing_toolbar_scroll">AppBar/Collapsing Toolbar (scroll off)</string>
+    <string name="design_appbar_collapsing_toolbar_scroll_with_swiperefresh">AppBar/Collapsing Toolbar (scroll off) + Swipe Refresh</string>
+    <string name="design_appbar_collapsing_toolbar_with_image">AppBar/Collapsing Toolbar + Parallax Image</string>
+    <string name="design_appbar_collapsing_toolbar_with_image_insets">AppBar/Collapsing Toolbar + Parallax Image + Insets</string>
+    <string name="design_appbar_parallax_overlap">AppBar/Parallax Overlapping content</string>
+    <string name="scroll_top">Top</string>
+    <string name="scroll_bottom">Bottom</string>
+    <string name="menu_search">Search</string>
+    <string name="menu_settings">Settings</string>
+
+    <string name="bottom_sheet">Bottom sheet</string>
+    <string name="bottomsheet_persistent">Persistent</string>
+    <string name="bottomsheet_hideable">Hideable</string>
+    <string name="bottomsheet_with_fab">With FAB</string>
+    <string name="bottomsheet_scroll">With ScrollView</string>
+    <string name="bottomsheet_with_fragment">With Fragment</string>
+    <string name="bottomsheet_modal">Modal</string>
+    <string name="bottomsheet_hide">Hide</string>
+    <string name="bottomsheet_show">Show</string>
+    <string name="item_n">Item %d</string>
+
+</resources>
diff --git a/samples/SupportDesignDemos/res/values/styles.xml b/samples/SupportDesignDemos/res/values/styles.xml
new file mode 100644
index 0000000..432bc3e
--- /dev/null
+++ b/samples/SupportDesignDemos/res/values/styles.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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>
+
+    <style name="Theme.Design" parent="Theme.AppCompat.Light.NoActionBar">
+        <item name="colorPrimary">#607D8B</item>
+        <item name="colorPrimaryDark">#455A64</item>
+        <item name="colorAccent">#FFAB40</item>
+    </style>
+
+    <style name="Theme.Design.TransparentStatus">
+    </style>
+
+    <style name="Theme.FAB" parent="Theme.AppCompat.Light.NoActionBar">
+        <item name="colorPrimary">#ff00bcd4</item>
+        <item name="colorPrimaryDark">#00838f</item>
+        <item name="colorAccent">#ff0000</item>
+    </style>
+
+    <style name="Theme.Navigation.Base" parent="Theme.AppCompat.Light.NoActionBar">
+        <item name="colorPrimary">#607D8B</item>
+        <item name="colorPrimaryDark">#455A64</item>
+        <item name="colorAccent">#FFAB40</item>
+        <item name="drawerArrowStyle">@style/DrawerArrowStyle</item>
+    </style>
+
+    <style name="DrawerArrowStyle" parent="Widget.AppCompat.DrawerArrowToggle">
+        <item name="spinBars">false</item>
+    </style>
+
+    <style name="Theme.Navigation" parent="Theme.Navigation.Base"/>
+
+    <style name="Theme.BottomSheetModal" parent="Theme.Design">
+        <item name="bottomSheetDialogTheme">@style/Theme.BottomSheetModal.BottomSheetDialog</item>
+    </style>
+
+    <style name="Theme.BottomSheetModal.BottomSheetDialog" parent="Theme.Design.BottomSheetDialog">
+        <item name="android:colorBackground">#37474F</item>
+        <item name="bottomSheetStyle">@style/BottomSheetStyle</item>
+    </style>
+
+    <style name="BottomSheetStyle" parent="Widget.Design.BottomSheet.Modal">
+        <item name="android:layout_marginLeft">@dimen/bottom_sheet_horizontal_margin</item>
+        <item name="android:layout_marginRight">@dimen/bottom_sheet_horizontal_margin</item>
+    </style>
+
+    <style name="Theme.BottomSheetModalSkipCollapsed" parent="Theme.BottomSheetModal">
+        <item name="bottomSheetDialogTheme">@style/Theme.BottomSheetModal.BottomSheetDialogSkipCollapsed</item>
+    </style>
+
+    <style name="Theme.BottomSheetModal.BottomSheetDialogSkipCollapsed" parent="Theme.Design.BottomSheetDialog">
+        <item name="bottomSheetStyle">@style/BottomSheetStyleSkipCollapsed</item>
+    </style>
+
+    <style name="BottomSheetStyleSkipCollapsed" parent="BottomSheetStyle">
+        <item name="behavior_skipCollapsed">true</item>
+    </style>
+
+</resources>
\ No newline at end of file
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/Cheeses.java b/samples/SupportDesignDemos/src/com/example/android/support/design/Cheeses.java
new file mode 100644
index 0000000..86228a2
--- /dev/null
+++ b/samples/SupportDesignDemos/src/com/example/android/support/design/Cheeses.java
@@ -0,0 +1,154 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.support.design;
+
+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/SupportDesignDemos/src/com/example/android/support/design/Shakespeare.java b/samples/SupportDesignDemos/src/com/example/android/support/design/Shakespeare.java
new file mode 100644
index 0000000..b4c7343
--- /dev/null
+++ b/samples/SupportDesignDemos/src/com/example/android/support/design/Shakespeare.java
@@ -0,0 +1,237 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.support.design;
+
+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/SupportDesignDemos/src/com/example/android/support/design/SupportDesignDemos.java b/samples/SupportDesignDemos/src/com/example/android/support/design/SupportDesignDemos.java
new file mode 100644
index 0000000..9c8a51b
--- /dev/null
+++ b/samples/SupportDesignDemos/src/com/example/android/support/design/SupportDesignDemos.java
@@ -0,0 +1,151 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.support.design;
+
+import android.app.ListActivity;
+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 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;
+
+public class SupportDesignDemos extends ListActivity {
+
+    @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);
+    }
+
+    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.example.android.support.design.SAMPLE_CODE");
+
+        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();
+
+        @Override
+        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, SupportDesignDemos.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/SupportDesignDemos/src/com/example/android/support/design/widget/AppBarLayoutToolbarCollapseThenPin.java b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/AppBarLayoutToolbarCollapseThenPin.java
new file mode 100644
index 0000000..2403852
--- /dev/null
+++ b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/AppBarLayoutToolbarCollapseThenPin.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.support.design.widget;
+
+import com.example.android.support.design.R;
+
+public class AppBarLayoutToolbarCollapseThenPin extends AppBarLayoutUsageBase {
+
+    @Override
+    protected int getLayoutId() {
+        return R.layout.design_appbar_toolbar_collapse_pin;
+    }
+}
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/AppBarLayoutToolbarCollapseThenPinNested.java b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/AppBarLayoutToolbarCollapseThenPinNested.java
new file mode 100644
index 0000000..957e248
--- /dev/null
+++ b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/AppBarLayoutToolbarCollapseThenPinNested.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.support.design.widget;
+
+import com.example.android.support.design.R;
+
+public class AppBarLayoutToolbarCollapseThenPinNested extends AppBarLayoutUsageBase {
+
+    @Override
+    protected int getLayoutId() {
+        return R.layout.design_appbar_toolbar_collapse_pin_nested;
+    }
+}
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/AppBarLayoutToolbarCollapseThenPinWithFab.java b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/AppBarLayoutToolbarCollapseThenPinWithFab.java
new file mode 100644
index 0000000..97a7a77
--- /dev/null
+++ b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/AppBarLayoutToolbarCollapseThenPinWithFab.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.support.design.widget;
+
+import com.example.android.support.design.R;
+
+public class AppBarLayoutToolbarCollapseThenPinWithFab extends AppBarLayoutUsageBase {
+
+    @Override
+    protected int getLayoutId() {
+        return R.layout.design_appbar_toolbar_collapse_pin_with_fab;
+    }
+}
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/AppBarLayoutToolbarCollapseThenScroll.java b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/AppBarLayoutToolbarCollapseThenScroll.java
new file mode 100644
index 0000000..2a4cd26
--- /dev/null
+++ b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/AppBarLayoutToolbarCollapseThenScroll.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.support.design.widget;
+
+import com.example.android.support.design.R;
+
+public class AppBarLayoutToolbarCollapseThenScroll extends AppBarLayoutUsageBase {
+
+    @Override
+    protected int getLayoutId() {
+        return R.layout.design_appbar_toolbar_collapse_scroll;
+    }
+}
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/AppBarLayoutToolbarCollapseThenScrollWithSwipeRefresh.java b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/AppBarLayoutToolbarCollapseThenScrollWithSwipeRefresh.java
new file mode 100644
index 0000000..bed269b
--- /dev/null
+++ b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/AppBarLayoutToolbarCollapseThenScrollWithSwipeRefresh.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.support.design.widget;
+
+import com.example.android.support.design.R;
+
+public class AppBarLayoutToolbarCollapseThenScrollWithSwipeRefresh extends AppBarLayoutUsageBase {
+
+    @Override
+    protected int getLayoutId() {
+        return R.layout.design_appbar_toolbar_collapse_scroll_with_swiperefresh;
+    }
+}
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/AppBarLayoutToolbarCollapseWithImage.java b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/AppBarLayoutToolbarCollapseWithImage.java
new file mode 100644
index 0000000..8a11278
--- /dev/null
+++ b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/AppBarLayoutToolbarCollapseWithImage.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.support.design.widget;
+
+import com.example.android.support.design.R;
+
+public class AppBarLayoutToolbarCollapseWithImage extends AppBarLayoutUsageBase {
+
+    @Override
+    protected int getLayoutId() {
+        return R.layout.design_appbar_toolbar_collapse_with_image;
+    }
+}
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/AppBarLayoutToolbarCollapseWithImageWithInsets.java b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/AppBarLayoutToolbarCollapseWithImageWithInsets.java
new file mode 100644
index 0000000..5a16d60
--- /dev/null
+++ b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/AppBarLayoutToolbarCollapseWithImageWithInsets.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.support.design.widget;
+
+import com.example.android.support.design.R;
+
+public class AppBarLayoutToolbarCollapseWithImageWithInsets extends AppBarLayoutUsageBase {
+
+    @Override
+    protected int getLayoutId() {
+        return R.layout.design_appbar_toolbar_collapse_with_image_insets;
+    }
+}
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/AppBarLayoutToolbarParallaxOverlapContent.java b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/AppBarLayoutToolbarParallaxOverlapContent.java
new file mode 100644
index 0000000..8e45a36
--- /dev/null
+++ b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/AppBarLayoutToolbarParallaxOverlapContent.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.support.design.widget;
+
+import com.example.android.support.design.R;
+
+public class AppBarLayoutToolbarParallaxOverlapContent extends AppBarLayoutUsageBase {
+
+    @Override
+    protected int getLayoutId() {
+        return R.layout.design_appbar_toolbar_parallax_overlap;
+    }
+
+    @Override
+    protected boolean displayTitle() {
+        return false;
+    }
+}
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/AppBarLayoutToolbarScrollTabsPin.java b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/AppBarLayoutToolbarScrollTabsPin.java
new file mode 100644
index 0000000..f153d8b
--- /dev/null
+++ b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/AppBarLayoutToolbarScrollTabsPin.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.support.design.widget;
+
+import com.example.android.support.design.R;
+
+public class AppBarLayoutToolbarScrollTabsPin extends AppBarLayoutUsageBase {
+
+    @Override
+    protected int getLayoutId() {
+        return R.layout.design_appbar_toolbar_scroll_tabs_pinned;
+    }
+}
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/AppBarLayoutToolbarScrollTabsPinWithSwipeRefresh.java b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/AppBarLayoutToolbarScrollTabsPinWithSwipeRefresh.java
new file mode 100644
index 0000000..ddba4df
--- /dev/null
+++ b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/AppBarLayoutToolbarScrollTabsPinWithSwipeRefresh.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.support.design.widget;
+
+import com.example.android.support.design.R;
+
+public class AppBarLayoutToolbarScrollTabsPinWithSwipeRefresh extends AppBarLayoutUsageBase {
+
+    @Override
+    protected int getLayoutId() {
+        return R.layout.design_appbar_toolbar_scroll_tabs_pinned_with_swiperefres;
+    }
+}
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/AppBarLayoutToolbarScrollTabsScroll.java b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/AppBarLayoutToolbarScrollTabsScroll.java
new file mode 100644
index 0000000..f48031f
--- /dev/null
+++ b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/AppBarLayoutToolbarScrollTabsScroll.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.support.design.widget;
+
+import com.example.android.support.design.R;
+
+public class AppBarLayoutToolbarScrollTabsScroll extends AppBarLayoutUsageBase {
+
+    @Override
+    protected int getLayoutId() {
+        return R.layout.design_appbar_toolbar_scroll_tabs_scroll;
+    }
+}
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/AppBarLayoutToolbarScrollTabsScrollSnap.java b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/AppBarLayoutToolbarScrollTabsScrollSnap.java
new file mode 100644
index 0000000..710a80a
--- /dev/null
+++ b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/AppBarLayoutToolbarScrollTabsScrollSnap.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.support.design.widget;
+
+import com.example.android.support.design.R;
+
+public class AppBarLayoutToolbarScrollTabsScrollSnap extends AppBarLayoutUsageBase {
+
+    @Override
+    protected int getLayoutId() {
+        return R.layout.design_appbar_toolbar_scroll_tabs_scroll_snap;
+    }
+}
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/AppBarLayoutUsageBase.java b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/AppBarLayoutUsageBase.java
new file mode 100644
index 0000000..e616f23
--- /dev/null
+++ b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/AppBarLayoutUsageBase.java
@@ -0,0 +1,118 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.support.design.widget;
+
+import com.example.android.support.design.Cheeses;
+import com.example.android.support.design.R;
+import com.example.android.support.design.Shakespeare;
+
+import android.os.Bundle;
+import android.os.Handler;
+import android.support.design.widget.CollapsingToolbarLayout;
+import android.support.design.widget.TabLayout;
+import android.support.v4.widget.SwipeRefreshLayout;
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.support.v7.widget.Toolbar;
+import android.text.TextUtils;
+import android.view.Menu;
+import android.widget.TextView;
+
+import java.util.Random;
+
+abstract class AppBarLayoutUsageBase extends AppCompatActivity {
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(getLayoutId());
+
+        // Retrieve the Toolbar from our content view, and set it as the action bar
+        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
+        setSupportActionBar(toolbar);
+
+        CollapsingToolbarLayout appBarLayout = (CollapsingToolbarLayout)
+                findViewById(R.id.collapsing_app_bar);
+        if (appBarLayout != null && displayTitle()) {
+            appBarLayout.setTitle(getTitle());
+        }
+
+        TextView dialog = (TextView) findViewById(R.id.textview_dialogue);
+        if (dialog != null) {
+            dialog.setText(TextUtils.concat(Shakespeare.DIALOGUE));
+        }
+
+        RecyclerView recyclerView = (RecyclerView) findViewById(R.id.appbar_recyclerview);
+        if (recyclerView != null) {
+            setupRecyclerView(recyclerView);
+        }
+
+        TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
+        if (tabLayout != null) {
+            setupTabs(tabLayout);
+        }
+
+        final SwipeRefreshLayout refreshLayout = (SwipeRefreshLayout) findViewById(R.id.swiperefresh);
+        if (refreshLayout != null) {
+            refreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
+                private final Handler mHandler = new Handler();
+
+                @Override
+                public void onRefresh() {
+                    // Post a delayed runnable to reset the refreshing state in 2 seconds
+                    mHandler.postDelayed(new Runnable() {
+                        @Override
+                        public void run() {
+                            refreshLayout.setRefreshing(false);
+                        }
+                    }, 2000);
+                }
+            });
+        }
+    }
+
+    @Override
+    public boolean onCreateOptionsMenu(Menu menu) {
+        getMenuInflater().inflate(R.menu.sample_actions, menu);
+        return true;
+    }
+
+    private void addRandomTab(TabLayout tabLayout) {
+        Random r = new Random();
+        String cheese = Cheeses.sCheeseStrings[r.nextInt(Cheeses.sCheeseStrings.length)];
+        tabLayout.addTab(tabLayout.newTab().setText(cheese));
+    }
+
+    private void setupTabs(TabLayout tabLayout) {
+        for (int i = 0; i < 10; i++) {
+            addRandomTab(tabLayout);
+        }
+    }
+
+    private void setupRecyclerView(RecyclerView recyclerView) {
+        recyclerView.setLayoutManager(new LinearLayoutManager(recyclerView.getContext()));
+        recyclerView.setAdapter(new SimpleStringRecyclerViewAdapter(this, Cheeses.sCheeseStrings));
+    }
+
+    protected boolean displayTitle() {
+        return true;
+    }
+
+    protected abstract int getLayoutId();
+
+}
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/BottomSheetHideable.java b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/BottomSheetHideable.java
new file mode 100644
index 0000000..b649463
--- /dev/null
+++ b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/BottomSheetHideable.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.support.design.widget;
+
+import com.example.android.support.design.R;
+
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.design.widget.BottomSheetBehavior;
+import android.view.View;
+import android.widget.Button;
+import android.widget.TextView;
+
+
+/**
+ * This demonstrates basic usage of hideable {@link BottomSheetBehavior}.
+ */
+public class BottomSheetHideable extends BottomSheetUsageBase {
+
+    private TextView mTextSlideOffset;
+
+    private Button mToggle;
+
+    @Override
+    protected int getLayoutId() {
+        return R.layout.design_bottom_sheet_hideable;
+    }
+
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        mTextSlideOffset = (TextView) findViewById(R.id.slide_offset);
+        mToggle = (Button) findViewById(R.id.toggle);
+        mToggle.setOnClickListener(mOnClickListener);
+        mBehavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
+            @Override
+            public void onStateChanged(@NonNull View bottomSheet,
+                    @BottomSheetBehavior.State int newState) {
+                switch (newState) {
+                    case BottomSheetBehavior.STATE_HIDDEN:
+                        mToggle.setText(R.string.bottomsheet_show);
+                        mToggle.setEnabled(true);
+                        break;
+                    case BottomSheetBehavior.STATE_EXPANDED:
+                    case BottomSheetBehavior.STATE_COLLAPSED:
+                        mToggle.setText(R.string.bottomsheet_hide);
+                        mToggle.setEnabled(true);
+                        break;
+                }
+            }
+
+            @Override
+            public void onSlide(@NonNull View bottomSheet, float slideOffset) {
+                mTextSlideOffset.setText(String.valueOf(slideOffset));
+            }
+        });
+    }
+
+    private View.OnClickListener mOnClickListener = new View.OnClickListener() {
+        @Override
+        public void onClick(View v) {
+            if (v.getId() == R.id.toggle && mBehavior != null) {
+                mToggle.setEnabled(false);
+                if (mBehavior.getState() == BottomSheetBehavior.STATE_HIDDEN) {
+                    mBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
+                } else {
+                    mBehavior.setState(BottomSheetBehavior.STATE_HIDDEN);
+                }
+            }
+        }
+    };
+
+}
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/BottomSheetModal.java b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/BottomSheetModal.java
new file mode 100644
index 0000000..262f390
--- /dev/null
+++ b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/BottomSheetModal.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.support.design.widget;
+
+import android.support.design.widget.BottomSheetDialogFragment;
+
+/**
+ * This demonstrates basic usage of {@link BottomSheetDialogFragment}.
+ */
+public class BottomSheetModal extends BottomSheetModalBase {
+}
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/BottomSheetModalBase.java b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/BottomSheetModalBase.java
new file mode 100644
index 0000000..84c260a
--- /dev/null
+++ b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/BottomSheetModalBase.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.support.design.widget;
+
+import android.content.Context;
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.support.design.widget.BottomSheetDialogFragment;
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.example.android.support.design.Cheeses;
+import com.example.android.support.design.R;
+
+abstract class BottomSheetModalBase extends AppCompatActivity {
+
+    private static final String FRAGMENT_MODAL = "modal";
+
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.design_bottom_sheet_modal);
+        findViewById(R.id.show).setOnClickListener(mOnClickListener);
+    }
+
+    private View.OnClickListener mOnClickListener = new View.OnClickListener() {
+        @Override
+        public void onClick(View v) {
+            switch (v.getId()) {
+                case R.id.show:
+                    new ModalFragment().show(getSupportFragmentManager(), FRAGMENT_MODAL);
+                    break;
+            }
+        }
+    };
+
+    /**
+     * This is the bottom sheet.
+     */
+    public static class ModalFragment extends BottomSheetDialogFragment {
+
+        @Nullable
+        @Override
+        public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
+                @Nullable Bundle savedInstanceState) {
+            return inflater.inflate(R.layout.design_bottom_sheet_recyclerview, container, false);
+        }
+
+        @Override
+        public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
+            // For the scrolling content, you can use RecyclerView, NestedScrollView or any other
+            // View that inherits NestedScrollingChild
+            RecyclerView recyclerView =
+                    (RecyclerView) view.findViewById(R.id.bottom_sheet_recyclerview);
+            Context context = recyclerView.getContext();
+            recyclerView.setLayoutManager(new LinearLayoutManager(context));
+            recyclerView.setAdapter(new SimpleStringRecyclerViewAdapter(context,
+                    Cheeses.sCheeseStrings));
+        }
+
+    }
+
+}
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/BottomSheetModalSkipCollapsed.java b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/BottomSheetModalSkipCollapsed.java
new file mode 100644
index 0000000..509dd7c
--- /dev/null
+++ b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/BottomSheetModalSkipCollapsed.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.support.design.widget;
+
+import android.support.design.widget.BottomSheetDialogFragment;
+
+/**
+ * This demonstrates basic usage of {@link BottomSheetDialogFragment}.
+ *
+ * <p>This version has behavior_skipCollapsed="true" in its theme.</p>
+ */
+public class BottomSheetModalSkipCollapsed extends BottomSheetModalBase {
+}
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/BottomSheetPersistent.java b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/BottomSheetPersistent.java
new file mode 100644
index 0000000..82b6c7d
--- /dev/null
+++ b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/BottomSheetPersistent.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.support.design.widget;
+
+import com.example.android.support.design.R;
+
+import android.support.design.widget.BottomSheetBehavior;
+
+
+/**
+ * This demonstrates basic usage of persistent {@link BottomSheetBehavior}.
+ */
+public class BottomSheetPersistent extends BottomSheetUsageBase {
+
+    @Override
+    protected int getLayoutId() {
+        return R.layout.design_bottom_sheet_persistent;
+    }
+
+}
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/BottomSheetScrollView.java b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/BottomSheetScrollView.java
new file mode 100644
index 0000000..64eb5b5
--- /dev/null
+++ b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/BottomSheetScrollView.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.support.design.widget;
+
+import com.example.android.support.design.R;
+import com.example.android.support.design.Shakespeare;
+
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.text.TextUtils;
+import android.widget.TextView;
+
+public class BottomSheetScrollView extends BottomSheetUsageBase {
+
+    @Override
+    protected int getLayoutId() {
+        return R.layout.design_bottom_sheet_scroll;
+    }
+
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        ((TextView) findViewById(R.id.dialogue_background))
+                .setText(TextUtils.concat(Shakespeare.DIALOGUE));
+    }
+
+}
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/BottomSheetUsageBase.java b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/BottomSheetUsageBase.java
new file mode 100644
index 0000000..3d1e352
--- /dev/null
+++ b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/BottomSheetUsageBase.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.support.design.widget;
+
+import com.example.android.support.design.R;
+import com.example.android.support.design.Shakespeare;
+
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.support.design.widget.BottomSheetBehavior;
+import android.support.v7.app.AppCompatActivity;
+import android.text.TextUtils;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+/**
+ * This demonstrates basic usage of {@link BottomSheetBehavior}.
+ */
+abstract class BottomSheetUsageBase extends AppCompatActivity {
+
+    protected BottomSheetBehavior<LinearLayout> mBehavior;
+
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(getLayoutId());
+        ((TextView) findViewById(R.id.dialogue)).setText(TextUtils.concat(Shakespeare.DIALOGUE));
+        mBehavior = BottomSheetBehavior.from((LinearLayout) findViewById(R.id.bottom_sheet));
+    }
+
+    @Override
+    public void onBackPressed() {
+        if (mBehavior != null) {
+            int state = mBehavior.getState();
+            if (state != BottomSheetBehavior.STATE_COLLAPSED &&
+                    state != BottomSheetBehavior.STATE_HIDDEN) {
+                mBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
+                return;
+            }
+        }
+        super.onBackPressed();
+    }
+
+    protected abstract int getLayoutId();
+
+}
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/BottomSheetWithFab.java b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/BottomSheetWithFab.java
new file mode 100644
index 0000000..f08cd32
--- /dev/null
+++ b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/BottomSheetWithFab.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.support.design.widget;
+
+
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.design.widget.BottomSheetBehavior;
+import android.view.View;
+import android.widget.Button;
+
+import com.example.android.support.design.R;
+
+
+/**
+ * This demonstrates usage of {@link BottomSheetBehavior} with a FAB anchored to it.
+ */
+public class BottomSheetWithFab extends BottomSheetUsageBase {
+
+    private Button mToggle;
+
+    private View.OnClickListener mOnClickListener = new View.OnClickListener() {
+        @Override
+        public void onClick(View v) {
+            if (v.getId() == R.id.toggle && mBehavior != null) {
+                mToggle.setEnabled(false);
+                if (mBehavior.getState() == BottomSheetBehavior.STATE_HIDDEN) {
+                    mBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
+                } else {
+                    mBehavior.setState(BottomSheetBehavior.STATE_HIDDEN);
+                }
+            }
+        }
+    };
+
+    @Override
+    protected int getLayoutId() {
+        return R.layout.design_bottom_sheet_with_fab;
+    }
+
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        mToggle = (Button) findViewById(R.id.toggle);
+        mToggle.setOnClickListener(mOnClickListener);
+        mBehavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
+            @Override
+            public void onStateChanged(@NonNull View bottomSheet,
+                    @BottomSheetBehavior.State int newState) {
+                switch (newState) {
+                    case BottomSheetBehavior.STATE_HIDDEN:
+                        mToggle.setText(R.string.bottomsheet_show);
+                        mToggle.setEnabled(true);
+                        break;
+                    case BottomSheetBehavior.STATE_EXPANDED:
+                    case BottomSheetBehavior.STATE_COLLAPSED:
+                        mToggle.setText(R.string.bottomsheet_hide);
+                        mToggle.setEnabled(true);
+                        break;
+                }
+            }
+
+            @Override
+            public void onSlide(@NonNull View bottomSheet, float slideOffset) {
+            }
+        });
+    }
+
+}
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/BottomSheetWithFragment.java b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/BottomSheetWithFragment.java
new file mode 100644
index 0000000..0b2c7a8
--- /dev/null
+++ b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/BottomSheetWithFragment.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.support.design.widget;
+
+import com.example.android.support.design.R;
+
+import android.content.Context;
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.support.design.widget.BottomSheetBehavior;
+import android.support.v4.app.Fragment;
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+/**
+ * This demonstrates basic usage of {@link BottomSheetBehavior} with Fragment.
+ */
+public class BottomSheetWithFragment extends AppCompatActivity {
+
+    private BottomSheetBehavior mBottomSheetBehavior;
+
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.design_bottom_sheet_with_fragment);
+        setUpRecyclerView((RecyclerView) findViewById(R.id.list1));
+        mBottomSheetBehavior = BottomSheetBehavior.from(findViewById(R.id.bottom_sheet));
+    }
+
+    @Override
+    public void onBackPressed() {
+        if (mBottomSheetBehavior.getState() == BottomSheetBehavior.STATE_EXPANDED) {
+            mBottomSheetBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
+        } else {
+            super.onBackPressed();
+        }
+    }
+
+    private static void setUpRecyclerView(RecyclerView recyclerView) {
+        Context context = recyclerView.getContext();
+        recyclerView.setLayoutManager(new LinearLayoutManager(context));
+        recyclerView.setAdapter(new DummyAdapter(context, 30));
+    }
+
+    public static class BottomSheetFragment extends Fragment {
+
+        @Nullable
+        @Override
+        public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
+                @Nullable Bundle savedInstanceState) {
+            return inflater.inflate(R.layout.design_bottom_sheet_fragment, container, false);
+        }
+
+        @Override
+        public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
+            setUpRecyclerView((RecyclerView) view.findViewById(R.id.list2));
+        }
+    }
+
+    public static class ViewHolder extends RecyclerView.ViewHolder {
+
+        public TextView text;
+
+        public ViewHolder(LayoutInflater inflater, ViewGroup parent) {
+            super(inflater.inflate(android.R.layout.simple_list_item_1, parent, false));
+            text = (TextView) itemView.findViewById(android.R.id.text1);
+        }
+    }
+
+    public static class DummyAdapter extends RecyclerView.Adapter<ViewHolder> {
+
+        private final Context mContext;
+
+        private final int mItemCount;
+
+        public DummyAdapter(Context context, int itemCount) {
+            mContext = context;
+            mItemCount = itemCount;
+        }
+
+        @Override
+        public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+            return new ViewHolder(LayoutInflater.from(mContext), parent);
+        }
+
+        @Override
+        public void onBindViewHolder(ViewHolder holder, int position) {
+            holder.text.setText(mContext.getString(R.string.item_n, position + 1));
+        }
+
+        @Override
+        public int getItemCount() {
+            return mItemCount;
+        }
+    }
+
+}
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/FloatingActionButtonUsage.java b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/FloatingActionButtonUsage.java
new file mode 100644
index 0000000..9193037
--- /dev/null
+++ b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/FloatingActionButtonUsage.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.support.design.widget;
+
+import com.example.android.support.design.R;
+
+import android.os.Bundle;
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.widget.Toolbar;
+
+/**
+ * This demonstrates idiomatic usage of the Floating Action Button
+ */
+public class FloatingActionButtonUsage extends AppCompatActivity {
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.design_fab);
+
+        // Retrieve the Toolbar from our content view, and set it as the action bar
+        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
+        setSupportActionBar(toolbar);
+    }
+
+}
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/NavigationViewUsage.java b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/NavigationViewUsage.java
new file mode 100644
index 0000000..9404cc4
--- /dev/null
+++ b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/NavigationViewUsage.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.support.design.widget;
+
+import com.example.android.support.design.R;
+
+import android.os.Bundle;
+import android.support.design.widget.NavigationView;
+import android.support.v4.view.GravityCompat;
+import android.support.v4.widget.DrawerLayout;
+import android.support.v7.widget.Toolbar;
+import android.util.TypedValue;
+import android.view.MenuItem;
+import android.view.View;
+
+/**
+ * This demonstrates basic usage of NavigationView
+ */
+public class NavigationViewUsage extends NavigationViewUsageBase {
+
+    private DrawerLayout mDrawerLayout;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
+
+        // Set the color of status bar
+        TypedValue value = new TypedValue();
+        getTheme().resolveAttribute(R.attr.colorPrimaryDark, value, true);
+        mDrawerLayout.setStatusBarBackgroundColor(value.data);
+
+        // Retrieve the Toolbar from our content view, and set it as the action bar
+        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
+        setSupportActionBar(toolbar);
+
+        // Toggle icon
+        toolbar.setNavigationIcon(R.drawable.ic_action_navigation_menu);
+        toolbar.setNavigationOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                mDrawerLayout.openDrawer(GravityCompat.START);
+            }
+        });
+    }
+
+    @Override
+    protected int getLayout() {
+        return R.layout.design_navigation;
+    }
+
+    @Override
+    public NavigationView.OnNavigationItemSelectedListener getNavigationItemSelectedListener() {
+        return new NavigationView.OnNavigationItemSelectedListener() {
+            @Override
+            public boolean onNavigationItemSelected(MenuItem item) {
+                if (handleNavigationItemSelected(item)) {
+                    mDrawerLayout.closeDrawers();
+                    return true;
+                }
+                return false;
+            }
+        };
+    }
+
+    @Override
+    public void onBackPressed() {
+        if (mDrawerLayout.isDrawerOpen(GravityCompat.START)) {
+            mDrawerLayout.closeDrawer(GravityCompat.START);
+        } else {
+            super.onBackPressed();
+        }
+    }
+
+}
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/NavigationViewUsageBase.java b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/NavigationViewUsageBase.java
new file mode 100644
index 0000000..49080c0
--- /dev/null
+++ b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/NavigationViewUsageBase.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.support.design.widget;
+
+import com.example.android.support.design.R;
+
+import android.os.Bundle;
+import android.support.annotation.LayoutRes;
+import android.support.design.widget.NavigationView;
+import android.support.v7.app.AppCompatActivity;
+import android.view.MenuItem;
+import android.widget.TextView;
+import android.widget.Toast;
+
+public abstract class NavigationViewUsageBase extends AppCompatActivity {
+
+    private TextView mTextMessage;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(getLayout());
+
+        mTextMessage = (TextView) findViewById(R.id.message);
+
+        // Menu
+        NavigationView navigation = (NavigationView) findViewById(R.id.navigation);
+        navigation.setNavigationItemSelectedListener(getNavigationItemSelectedListener());
+        navigation.inflateHeaderView(R.layout.design_navigation_header);
+    }
+
+    @LayoutRes
+    protected abstract int getLayout();
+
+    protected abstract NavigationView.OnNavigationItemSelectedListener getNavigationItemSelectedListener();
+
+    protected boolean handleNavigationItemSelected(MenuItem item) {
+        switch (item.getItemId()) {
+            case R.id.navigation_item_1:
+                mTextMessage.setText("1");
+                return true;
+            case R.id.navigation_item_2:
+                mTextMessage.setText("2");
+                return true;
+            case R.id.navigation_item_3:
+                mTextMessage.setText("3");
+                return true;
+            case R.id.navigation_sub_item_1:
+                showToast(R.string.navigation_sub_item_1);
+                return true;
+            case R.id.navigation_sub_item_2:
+                showToast(R.string.navigation_sub_item_2);
+                return true;
+            case R.id.navigation_with_icon:
+                showToast(R.string.navigation_item_with_icon);
+                return true;
+            case R.id.navigation_without_icon:
+                showToast(R.string.navigation_item_without_icon);
+                return true;
+            default:
+                return false;
+        }
+    }
+
+    private void showToast(int res) {
+        Toast.makeText(this, getString(R.string.navigation_message, getString(res)),
+                Toast.LENGTH_SHORT).show();
+    }
+
+}
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/NavigationViewWithoutDrawer.java b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/NavigationViewWithoutDrawer.java
new file mode 100644
index 0000000..28e4733
--- /dev/null
+++ b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/NavigationViewWithoutDrawer.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.support.design.widget;
+
+import com.example.android.support.design.R;
+
+import android.support.design.widget.NavigationView;
+import android.view.MenuItem;
+
+/**
+ * This demonstrates basic usage of NavigationView
+ */
+public class NavigationViewWithoutDrawer extends NavigationViewUsageBase {
+
+    @Override
+    protected int getLayout() {
+        return R.layout.design_navigation_without_drawer;
+    }
+
+    @Override
+    protected NavigationView.OnNavigationItemSelectedListener getNavigationItemSelectedListener() {
+        return new NavigationView.OnNavigationItemSelectedListener() {
+            @Override
+            public boolean onNavigationItemSelected(MenuItem item) {
+                return handleNavigationItemSelected(item);
+            }
+        };
+    }
+
+}
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/SimpleStringRecyclerViewAdapter.java b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/SimpleStringRecyclerViewAdapter.java
new file mode 100644
index 0000000..2f9b79f
--- /dev/null
+++ b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/SimpleStringRecyclerViewAdapter.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.support.design.widget;
+
+import com.example.android.support.design.R;
+
+import android.content.Context;
+import android.graphics.Color;
+import android.support.v7.widget.RecyclerView;
+import android.text.Layout;
+import android.util.TypedValue;
+import android.view.LayoutInflater;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import java.util.ArrayList;
+import java.util.Collections;
+
+public class SimpleStringRecyclerViewAdapter
+        extends RecyclerView.Adapter<SimpleStringRecyclerViewAdapter.ViewHolder> {
+
+    private int mBackground;
+
+    private ArrayList<String> mValues;
+
+    public static class ViewHolder extends RecyclerView.ViewHolder {
+        public String mBoundString;
+        public TextView mTextView;
+
+        public ViewHolder(TextView v) {
+            super(v);
+            mTextView = v;
+        }
+
+        @Override
+        public String toString() {
+            return super.toString() + " '" + mTextView.getText();
+        }
+    }
+
+    public String getValueAt(int position) {
+        return mValues.get(position);
+    }
+
+    public SimpleStringRecyclerViewAdapter(Context context, String[] strings) {
+        TypedValue val = new TypedValue();
+        if (context.getTheme() != null) {
+            context.getTheme().resolveAttribute(R.attr.selectableItemBackground, val, true);
+        }
+        mBackground = val.resourceId;
+        mValues = new ArrayList<>();
+        Collections.addAll(mValues, strings);
+    }
+
+    @Override
+    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+        TextView textView = (TextView) LayoutInflater.from(parent.getContext())
+                .inflate(android.R.layout.simple_list_item_1, parent, false);
+        textView.setBackgroundResource(mBackground);
+        return new ViewHolder(textView);
+    }
+
+    @Override
+    public void onBindViewHolder(ViewHolder holder, int position) {
+        holder.mBoundString = mValues.get(position);
+        holder.mTextView.setText(position + ": " + mValues.get(position));
+    }
+
+    @Override
+    public int getItemCount() {
+        return mValues.size();
+    }
+}
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/SnackbarUsage.java b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/SnackbarUsage.java
new file mode 100644
index 0000000..c2ff6c9
--- /dev/null
+++ b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/SnackbarUsage.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.support.design.widget;
+
+import com.example.android.support.design.R;
+
+import android.os.Bundle;
+import android.support.design.widget.Snackbar;
+import android.support.v7.app.AppCompatActivity;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Toast;
+
+/**
+ * This demonstrates idiomatic usage of the Floating Action Button
+ */
+public class SnackbarUsage extends AppCompatActivity {
+
+    private ViewGroup mContentView;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(getLayoutId());
+
+        mContentView = (ViewGroup) findViewById(R.id.content_view);
+    }
+
+    protected int getLayoutId() {
+        return R.layout.design_snackbar;
+    }
+
+    public void showShort(View view) {
+        Snackbar.make(mContentView, "Short snackbar message", Snackbar.LENGTH_SHORT).show();
+    }
+
+    public void showAction(View view) {
+        Snackbar.make(mContentView, "Short snackbar message", Snackbar.LENGTH_SHORT)
+                .setAction("Action", new View.OnClickListener() {
+                    @Override
+                    public void onClick(View view) {
+                        Toast.makeText(SnackbarUsage.this, "Snackbar Action pressed",
+                                Toast.LENGTH_SHORT).show();
+                    }
+                }).show();
+    }
+
+    public void showLong(View view) {
+        Snackbar.make(mContentView, "Long snackbar message which wraps onto another line and"
+                + "makes the Snackbar taller", Snackbar.LENGTH_SHORT).show();
+    }
+
+    public void showLongAction(View view) {
+        Snackbar.make(mContentView, "Long snackbar message which wraps onto another line and"
+                + "makes the Snackbar taller", Snackbar.LENGTH_SHORT)
+                .setAction("Action", new View.OnClickListener() {
+                    @Override
+                    public void onClick(View view) {
+                        Toast.makeText(SnackbarUsage.this, "Snackbar Action pressed",
+                                Toast.LENGTH_SHORT).show();
+                    }
+                }).show();
+    }
+
+    public void showLongLongAction(View view) {
+        Snackbar.make(mContentView, "Long snackbar message which wraps onto another line and"
+                + "makes the Snackbar taller", Snackbar.LENGTH_SHORT)
+                .setAction("Action which wraps", new View.OnClickListener() {
+                    @Override
+                    public void onClick(View view) {
+                        Toast.makeText(SnackbarUsage.this, "Snackbar Action pressed",
+                                Toast.LENGTH_SHORT).show();
+                    }
+                }).show();
+    }
+
+}
\ No newline at end of file
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/SnackbarWithFloatingActionButton.java b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/SnackbarWithFloatingActionButton.java
new file mode 100644
index 0000000..1b79543
--- /dev/null
+++ b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/SnackbarWithFloatingActionButton.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.support.design.widget;
+
+import com.example.android.support.design.R;
+
+import android.os.Bundle;
+import android.support.design.widget.Snackbar;
+import android.support.v7.app.AppCompatActivity;
+import android.view.View;
+import android.view.ViewGroup;
+
+/**
+ * This demonstrates idiomatic usage of Snackbar with a Floating Action Button present
+ */
+public class SnackbarWithFloatingActionButton extends SnackbarUsage {
+
+    @Override
+    protected int getLayoutId() {
+        return R.layout.design_snackbar_with_fab;
+    }
+
+}
\ No newline at end of file
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/SnackbarWithoutCoordinatorLayout.java b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/SnackbarWithoutCoordinatorLayout.java
new file mode 100644
index 0000000..71257b5
--- /dev/null
+++ b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/SnackbarWithoutCoordinatorLayout.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.support.design.widget;
+
+import com.example.android.support.design.R;
+
+/**
+ * This demonstrates idiomatic usage of Snackbar without a CoordinatorLayout
+ */
+public class SnackbarWithoutCoordinatorLayout extends SnackbarUsage {
+
+    @Override
+    protected int getLayoutId() {
+        return R.layout.design_snackbar_without_col;
+    }
+
+}
\ No newline at end of file
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/TabLayoutCustomItemsUsage.java b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/TabLayoutCustomItemsUsage.java
new file mode 100644
index 0000000..31239be
--- /dev/null
+++ b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/TabLayoutCustomItemsUsage.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.support.design.widget;
+
+import android.os.Bundle;
+import android.support.design.widget.TabLayout;
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.widget.Toolbar;
+import com.example.android.support.design.R;
+
+/**
+ * This demonstrates usage of TabLayout with custom items
+ */
+public class TabLayoutCustomItemsUsage extends AppCompatActivity {
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.design_tabs_custom);
+
+        // Retrieve the Toolbar from our content view, and set it as the action bar
+        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
+        setSupportActionBar(toolbar);
+        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
+
+        // Create three tabs with custom views
+        TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
+        for (int i = 0; i < 3; i++) {
+            TabLayout.Tab tab = tabLayout.newTab();
+
+            tabLayout.addTab(tab);
+            tab.setCustomView(R.layout.design_tab_custom);
+        }
+    }
+}
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/TabLayoutLayoutItemsUsage.java b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/TabLayoutLayoutItemsUsage.java
new file mode 100644
index 0000000..7e51de3
--- /dev/null
+++ b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/TabLayoutLayoutItemsUsage.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.support.design.widget;
+
+import com.example.android.support.design.Cheeses;
+import com.example.android.support.design.R;
+
+import android.os.Bundle;
+import android.support.design.widget.TabLayout;
+import android.support.v4.view.PagerAdapter;
+import android.support.v4.view.ViewPager;
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.widget.Toolbar;
+import android.view.Gravity;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.RadioButton;
+import android.widget.RadioGroup;
+import android.widget.TextView;
+
+import java.util.ArrayList;
+import java.util.Random;
+
+/**
+ * This demonstrates idiomatic usage of TabLayout with items inflated from the layout
+ */
+public class TabLayoutLayoutItemsUsage extends AppCompatActivity {
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.design_tabs_item);
+
+        // Retrieve the Toolbar from our content view, and set it as the action bar
+        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
+        setSupportActionBar(toolbar);
+        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
+    }
+
+}
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/TabLayoutPreselectedUsage.java b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/TabLayoutPreselectedUsage.java
new file mode 100644
index 0000000..ea8b4d6
--- /dev/null
+++ b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/TabLayoutPreselectedUsage.java
@@ -0,0 +1,183 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.support.design.widget;
+
+import android.os.Bundle;
+import android.support.design.widget.TabLayout;
+import android.support.v4.view.PagerAdapter;
+import android.support.v4.view.ViewPager;
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.widget.Toolbar;
+import android.view.Gravity;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.RadioButton;
+import android.widget.RadioGroup;
+import android.widget.TextView;
+import com.example.android.support.design.Cheeses;
+import com.example.android.support.design.R;
+
+import java.util.ArrayList;
+import java.util.Random;
+
+/**
+ * This demonstrates idiomatic usage of TabLayout with a ViewPager
+ */
+public class TabLayoutPreselectedUsage extends AppCompatActivity {
+
+    private TabLayout mTabLayout;
+    private ViewPager mViewPager;
+    private CheesePagerAdapter mPagerAdapter;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.design_tabs_viewpager);
+
+        // Retrieve the Toolbar from our content view, and set it as the action bar
+        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
+        setSupportActionBar(toolbar);
+        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
+
+        mTabLayout = (TabLayout) findViewById(R.id.tabs);
+        mViewPager = (ViewPager) findViewById(R.id.tabs_viewpager);
+
+        findViewById(R.id.buttons).setVisibility(View.GONE);
+
+        mPagerAdapter = new CheesePagerAdapter();
+        for (int i = 0; i < 5; i++) {
+            mPagerAdapter.addTab(Cheeses.sCheeseStrings[i]);
+        }
+        mViewPager.setAdapter(mPagerAdapter);
+        mViewPager.setCurrentItem(2, false);
+
+        mTabLayout.setupWithViewPager(mViewPager);
+
+        setupRadioGroup();
+    }
+
+    private void setupRadioGroup() {
+        // Setup the initially checked item
+        switch (mTabLayout.getTabMode()) {
+            case TabLayout.MODE_SCROLLABLE:
+                ((RadioButton) findViewById(R.id.rb_tab_scrollable)).setChecked(true);
+                break;
+            case TabLayout.MODE_FIXED:
+                ((RadioButton) findViewById(R.id.rb_tab_fixed)).setChecked(true);
+                break;
+        }
+
+        RadioGroup rg = (RadioGroup) findViewById(R.id.radiogroup_tab_mode);
+        rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
+            @Override
+            public void onCheckedChanged(RadioGroup radioGroup, int id) {
+                switch (id) {
+                    case R.id.rb_tab_fixed:
+                        mTabLayout.setTabMode(TabLayout.MODE_FIXED);
+                        break;
+                    case R.id.rb_tab_scrollable:
+                        mTabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
+                        break;
+                }
+            }
+        });
+
+        // Setup the initially checked item
+        switch (mTabLayout.getTabGravity()) {
+            case TabLayout.GRAVITY_CENTER:
+                ((RadioButton) findViewById(R.id.rb_tab_g_center)).setChecked(true);
+                break;
+            case TabLayout.GRAVITY_FILL:
+                ((RadioButton) findViewById(R.id.rb_tab_g_fill)).setChecked(true);
+                break;
+        }
+
+        rg = (RadioGroup) findViewById(R.id.radiogroup_tab_gravity);
+        rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
+            @Override
+            public void onCheckedChanged(RadioGroup radioGroup, int id) {
+                switch (id) {
+                    case R.id.rb_tab_g_center:
+                        mTabLayout.setTabGravity(TabLayout.GRAVITY_CENTER);
+                        break;
+                    case R.id.rb_tab_g_fill:
+                        mTabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
+                        break;
+                }
+            }
+        });
+    }
+
+    private static class CheesePagerAdapter extends PagerAdapter {
+        private final ArrayList<CharSequence> mCheeses = new ArrayList<>();
+
+        public void addTab(String title) {
+            mCheeses.add(title);
+            notifyDataSetChanged();
+        }
+
+        @Override
+        public int getCount() {
+            return mCheeses.size();
+        }
+
+        @Override
+        public int getItemPosition(Object object) {
+            final Item item = (Item) object;
+            final int index = mCheeses.indexOf(item.cheese);
+            return index >= 0 ? index : POSITION_NONE;
+        }
+
+        @Override
+        public Object instantiateItem(ViewGroup container, int position) {
+            final TextView tv = new TextView(container.getContext());
+            tv.setText(getPageTitle(position));
+            tv.setGravity(Gravity.CENTER);
+            tv.setTextAppearance(tv.getContext(), R.style.TextAppearance_AppCompat_Title);
+            container.addView(tv, ViewGroup.LayoutParams.MATCH_PARENT,
+                    ViewGroup.LayoutParams.MATCH_PARENT);
+
+            Item item = new Item();
+            item.cheese = mCheeses.get(position);
+            item.view = tv;
+            return item;
+        }
+
+        @Override
+        public boolean isViewFromObject(View view, Object object) {
+            final Item item = (Item) object;
+            return item.view == view;
+        }
+
+        @Override
+         public CharSequence getPageTitle(int position) {
+            return mCheeses.get(position);
+        }
+
+        @Override
+        public void destroyItem(ViewGroup container, int position, Object object) {
+            final Item item = (Item) object;
+            container.removeView(item.view);
+        }
+
+        private static class Item {
+            TextView view;
+            CharSequence cheese;
+        }
+    }
+
+}
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/TabLayoutUsage.java b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/TabLayoutUsage.java
new file mode 100644
index 0000000..26b6108
--- /dev/null
+++ b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/TabLayoutUsage.java
@@ -0,0 +1,202 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.support.design.widget;
+
+import com.example.android.support.design.Cheeses;
+import com.example.android.support.design.R;
+
+import android.os.Bundle;
+import android.support.design.widget.TabLayout;
+import android.support.v4.view.PagerAdapter;
+import android.support.v4.view.ViewPager;
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.widget.Toolbar;
+import android.view.Gravity;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.RadioButton;
+import android.widget.RadioGroup;
+import android.widget.TextView;
+
+import java.util.ArrayList;
+import java.util.Random;
+
+/**
+ * This demonstrates idiomatic usage of TabLayout with a ViewPager
+ */
+public class TabLayoutUsage extends AppCompatActivity {
+
+    private TabLayout mTabLayout;
+    private ViewPager mViewPager;
+    private CheesePagerAdapter mPagerAdapter;
+
+    private final Random mRandom = new Random();
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.design_tabs_viewpager);
+
+        // Retrieve the Toolbar from our content view, and set it as the action bar
+        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
+        setSupportActionBar(toolbar);
+        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
+
+        mTabLayout = (TabLayout) findViewById(R.id.tabs);
+        mViewPager = (ViewPager) findViewById(R.id.tabs_viewpager);
+
+        mPagerAdapter = new CheesePagerAdapter();
+        mViewPager.setAdapter(mPagerAdapter);
+
+        mTabLayout.setupWithViewPager(mViewPager);
+
+        setupRadioGroup();
+    }
+
+    public void addTab(View view) {
+        String cheese = Cheeses.sCheeseStrings[mRandom.nextInt(Cheeses.sCheeseStrings.length)];
+        mPagerAdapter.addTab(cheese);
+    }
+
+    public void selectFirstTab(View view) {
+        if (mTabLayout.getTabCount() > 0) {
+            mViewPager.setCurrentItem(0);
+        }
+    }
+
+    public void removeTab(View view) {
+        mPagerAdapter.removeTab();
+    }
+
+    private void setupRadioGroup() {
+        // Setup the initially checked item
+        switch (mTabLayout.getTabMode()) {
+            case TabLayout.MODE_SCROLLABLE:
+                ((RadioButton) findViewById(R.id.rb_tab_scrollable)).setChecked(true);
+                break;
+            case TabLayout.MODE_FIXED:
+                ((RadioButton) findViewById(R.id.rb_tab_fixed)).setChecked(true);
+                break;
+        }
+
+        RadioGroup rg = (RadioGroup) findViewById(R.id.radiogroup_tab_mode);
+        rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
+            @Override
+            public void onCheckedChanged(RadioGroup radioGroup, int id) {
+                switch (id) {
+                    case R.id.rb_tab_fixed:
+                        mTabLayout.setTabMode(TabLayout.MODE_FIXED);
+                        break;
+                    case R.id.rb_tab_scrollable:
+                        mTabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
+                        break;
+                }
+            }
+        });
+
+        // Setup the initially checked item
+        switch (mTabLayout.getTabGravity()) {
+            case TabLayout.GRAVITY_CENTER:
+                ((RadioButton) findViewById(R.id.rb_tab_g_center)).setChecked(true);
+                break;
+            case TabLayout.GRAVITY_FILL:
+                ((RadioButton) findViewById(R.id.rb_tab_g_fill)).setChecked(true);
+                break;
+        }
+
+        rg = (RadioGroup) findViewById(R.id.radiogroup_tab_gravity);
+        rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
+            @Override
+            public void onCheckedChanged(RadioGroup radioGroup, int id) {
+                switch (id) {
+                    case R.id.rb_tab_g_center:
+                        mTabLayout.setTabGravity(TabLayout.GRAVITY_CENTER);
+                        break;
+                    case R.id.rb_tab_g_fill:
+                        mTabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
+                        break;
+                }
+            }
+        });
+    }
+
+    private static class CheesePagerAdapter extends PagerAdapter {
+        private final ArrayList<CharSequence> mCheeses = new ArrayList<>();
+
+        public void addTab(String title) {
+            mCheeses.add(title);
+            notifyDataSetChanged();
+        }
+
+        public void removeTab() {
+            if (!mCheeses.isEmpty()) {
+                mCheeses.remove(mCheeses.size() - 1);
+                notifyDataSetChanged();
+            }
+        }
+
+        @Override
+        public int getCount() {
+            return mCheeses.size();
+        }
+
+        @Override
+        public int getItemPosition(Object object) {
+            final Item item = (Item) object;
+            final int index = mCheeses.indexOf(item.cheese);
+            return index >= 0 ? index : POSITION_NONE;
+        }
+
+        @Override
+        public Object instantiateItem(ViewGroup container, int position) {
+            final TextView tv = new TextView(container.getContext());
+            tv.setText(getPageTitle(position));
+            tv.setGravity(Gravity.CENTER);
+            tv.setTextAppearance(tv.getContext(), R.style.TextAppearance_AppCompat_Title);
+            container.addView(tv, ViewGroup.LayoutParams.MATCH_PARENT,
+                    ViewGroup.LayoutParams.MATCH_PARENT);
+
+            Item item = new Item();
+            item.cheese = mCheeses.get(position);
+            item.view = tv;
+            return item;
+        }
+
+        @Override
+        public boolean isViewFromObject(View view, Object object) {
+            final Item item = (Item) object;
+            return item.view == view;
+        }
+
+        @Override
+         public CharSequence getPageTitle(int position) {
+            return mCheeses.get(position);
+        }
+
+        @Override
+        public void destroyItem(ViewGroup container, int position, Object object) {
+            final Item item = (Item) object;
+            container.removeView(item.view);
+        }
+
+        private static class Item {
+            TextView view;
+            CharSequence cheese;
+        }
+    }
+
+}
diff --git a/samples/SupportDesignDemos/src/com/example/android/support/design/widget/TextInputLayoutUsage.java b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/TextInputLayoutUsage.java
new file mode 100644
index 0000000..63ac031
--- /dev/null
+++ b/samples/SupportDesignDemos/src/com/example/android/support/design/widget/TextInputLayoutUsage.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.support.design.widget;
+
+import com.example.android.support.design.R;
+
+import android.os.Bundle;
+import android.support.design.widget.TextInputLayout;
+import android.support.v7.app.AppCompatActivity;
+import android.view.View;
+
+/**
+ * This demonstrates idiomatic usage of {@code TextInputLayout}
+ */
+public class TextInputLayoutUsage extends AppCompatActivity {
+
+    private TextInputLayout mUsernameInputLayout;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.design_text_input);
+
+        mUsernameInputLayout = (TextInputLayout) findViewById(R.id.input_username);
+    }
+
+    public void showError(View view) {
+        mUsernameInputLayout.setError("Some unknown error has occurred");
+    }
+
+    public void clearError(View view) {
+        mUsernameInputLayout.setError(null);
+    }
+
+}
diff --git a/samples/SupportLeanbackDemos/Android.mk b/samples/SupportLeanbackDemos/Android.mk
new file mode 100644
index 0000000..53bb778
--- /dev/null
+++ b/samples/SupportLeanbackDemos/Android.mk
@@ -0,0 +1,39 @@
+# Copyright (C) 2014 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.
+
+LOCAL_PATH:= $(call my-dir)
+
+# Build the samples.
+# We need to add some special AAPT flags to generate R classes
+# for resources that are included from the libraries.
+include $(CLEAR_VARS)
+LOCAL_PACKAGE_NAME := SupportLeanbackDemos
+LOCAL_MODULE_TAGS := samples tests
+LOCAL_SDK_VERSION := current
+LOCAL_MIN_SDK_VERSION := 17
+LOCAL_DEX_PREOPT := false
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+LOCAL_STATIC_JAVA_LIBRARIES := \
+        android-support-v4 \
+        android-support-v7-recyclerview \
+        android-support-v17-leanback
+LOCAL_RESOURCE_DIR = \
+        $(LOCAL_PATH)/res \
+        frameworks/support/v17/leanback/res \
+        frameworks/support/v7/recyclerview/res
+LOCAL_AAPT_FLAGS := \
+        --auto-add-overlay \
+        --extra-packages android.support.v17.leanback \
+        --extra-packages android.support.v7.recyclerview
+include $(BUILD_PACKAGE)
diff --git a/samples/SupportLeanbackDemos/AndroidManifest.xml b/samples/SupportLeanbackDemos/AndroidManifest.xml
new file mode 100644
index 0000000..48d638d
--- /dev/null
+++ b/samples/SupportLeanbackDemos/AndroidManifest.xml
@@ -0,0 +1,135 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.example.android.leanback"
+    android:versionCode="1"
+    android:versionName="1.0">
+
+    <uses-sdk android:minSdkVersion="17" android:targetSdkVersion="23" />
+    <uses-permission android:name="android.permission.RECORD_AUDIO" />
+
+    <application
+        android:label="@string/app_name"
+        android:icon="@drawable/ic_launcher"
+        android:banner="@drawable/ic_launcher"
+        android:supportsRtl="true"
+        android:theme="@style/Theme.Example.Leanback">
+
+        <activity android:name="MainActivity"
+            android:label="@string/app_name">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LEANBACK_LAUNCHER" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name="BrowseActivity"
+            android:theme="@style/Theme.Example.Leanback.Browse"
+            android:exported="true" />
+
+        <activity android:name="BrowseSupportActivity"
+            android:theme="@style/Theme.Example.Leanback.Browse"
+            android:exported="true" />
+
+        <activity android:name="BrowseAnimationActivity"
+            android:exported="true" >
+        </activity>
+
+        <activity android:name="DetailsActivity"
+            android:theme="@style/Theme.Example.Leanback.Details"
+            android:exported="true" />
+
+        <activity android:name="DetailsSupportActivity"
+            android:theme="@style/Theme.Example.Leanback.Details"
+            android:exported="true" />
+
+        <activity android:name="SearchDetailsActivity"
+            android:theme="@style/Theme.Example.Leanback.SearchDetails"
+            android:exported="true" />
+
+        <activity android:name="SearchDetailsSupportActivity"
+            android:theme="@style/Theme.Example.Leanback.SearchDetails"
+            android:exported="true" />
+
+        <activity android:name="RowsActivity"
+            android:theme="@style/Theme.Example.Leanback.Rows"
+            android:exported="true" />
+
+        <activity android:name="RowsSupportActivity"
+            android:theme="@style/Theme.Example.Leanback.Rows"
+            android:exported="true" />
+
+        <activity android:name="PlaybackOverlayActivity"
+            android:configChanges=
+                "screenSize|smallestScreenSize|screenLayout|orientation"
+            android:resizeableActivity="true"
+            android:supportsPictureInPicture="true"
+            android:launchMode="singleTask"
+            android:exported="true" />
+
+        <activity android:name="PlaybackOverlaySupportActivity"
+            android:configChanges=
+                "screenSize|smallestScreenSize|screenLayout|orientation"
+            android:resizeableActivity="true"
+            android:supportsPictureInPicture="true"
+            android:launchMode="singleTask"
+            android:exported="true" />
+
+        <activity android:name="VerticalGridActivity"
+            android:theme="@style/Theme.Example.Leanback.VerticalGrid"
+            android:exported="true" />
+
+        <activity android:name="VerticalGridSupportActivity"
+            android:theme="@style/Theme.Example.Leanback.VerticalGrid"
+            android:exported="true" />
+
+        <activity android:name="SearchActivity"
+            android:exported="true" />
+
+        <activity android:name="SearchSupportActivity"
+            android:exported="true" />
+
+        <activity android:name="BrowseErrorActivity"
+            android:theme="@style/Theme.Example.Leanback.Browse"
+            android:exported="true" />
+
+        <activity android:name="BrowseErrorSupportActivity"
+            android:theme="@style/Theme.Example.Leanback.Browse"
+            android:exported="true" />
+
+        <activity android:name="HorizontalGridTestActivity"
+            android:exported="true" />
+
+        <activity android:name="GuidedStepActivity"
+            android:theme="@style/Theme.Example.Leanback.GuidedStep"
+            android:windowSoftInputMode="adjustResize"
+            android:exported="true" />
+
+        <activity android:name="GuidedStepSupportActivity"
+            android:theme="@style/Theme.Example.Leanback.GuidedStep"
+            android:windowSoftInputMode="adjustResize"
+            android:exported="true" />
+
+        <activity android:name="GuidedStepHalfScreenActivity"
+            android:theme="@style/Theme.Example.Leanback.GuidedStep.Half"
+            android:windowSoftInputMode="adjustResize"
+            android:exported="true" />
+
+        <activity android:name="GuidedStepSupportHalfScreenActivity"
+            android:theme="@style/Theme.Example.Leanback.GuidedStep.Half"
+            android:windowSoftInputMode="adjustResize"
+            android:exported="true" />
+
+        <activity android:name="DetailsPresenterSelectionActivity"
+            android:theme="@style/Theme.Example.Leanback.GuidedStep"
+            android:exported="true" />
+
+        <activity android:name=".OnboardingActivity"
+                  android:theme="@style/Theme.Example.Leanback.Onboarding"
+                  android:exported="true" />
+
+        <activity android:name=".OnboardingSupportActivity"
+                  android:theme="@style/Theme.Example.Leanback.Onboarding"
+                  android:exported="true" />
+
+    </application>
+</manifest>
diff --git a/samples/SupportLeanbackDemos/build.gradle b/samples/SupportLeanbackDemos/build.gradle
new file mode 100644
index 0000000..c94d41a
--- /dev/null
+++ b/samples/SupportLeanbackDemos/build.gradle
@@ -0,0 +1,31 @@
+apply plugin: 'com.android.application'
+
+dependencies {
+    compile project(':support-leanback-v17')
+}
+
+android {
+    compileSdkVersion project.ext.currentSdk
+
+    defaultConfig {
+        minSdkVersion 17
+    }
+
+    sourceSets {
+        main.manifest.srcFile 'AndroidManifest.xml'
+        main.java.srcDirs = ['src']
+        main.aidl.srcDirs = ['src']
+        main.res.srcDirs = ['res']
+    }
+
+    lintOptions {
+        // TODO: fix errors and reenable.
+        abortOnError false
+    }
+
+    compileOptions {
+        sourceCompatibility JavaVersion.VERSION_1_7
+        targetCompatibility JavaVersion.VERSION_1_7
+    }
+}
+
diff --git a/samples/SupportLeanbackDemos/generatev4.py b/samples/SupportLeanbackDemos/generatev4.py
new file mode 100755
index 0000000..7c9f0fe
--- /dev/null
+++ b/samples/SupportLeanbackDemos/generatev4.py
@@ -0,0 +1,366 @@
+#!/usr/bin/python
+
+# Copyright (C) 2015 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.
+
+import os
+import sys
+import getopt
+
+def write_java_head(tofile, name):
+    tofile.write("/* This file is auto-generated from {}.java.  DO NOT MODIFY. */\n\n".format(name))
+
+def replace_xml_head(line, name):
+    return line.replace('<?xml version="1.0" encoding="utf-8"?>', '<?xml version="1.0" encoding="utf-8"?>\n<!-- This file is auto-generated from {}.xml.  DO NOT MODIFY. -->\n'.format(name))
+
+file = open('src/com/example/android/leanback/GuidedStepActivity.java', 'r')
+outfile = open('src/com/example/android/leanback/GuidedStepSupportActivity.java', 'w')
+write_java_head(outfile, "GuidedStepActivity")
+for line in file:
+    line = line.replace('android.app.Fragment', 'android.support.v4.app.Fragment')
+    line = line.replace('android.app.Activity', 'android.support.v4.app.FragmentActivity')
+    line = line.replace('GuidedStepFragment', 'GuidedStepSupportFragment')
+    line = line.replace('GuidedStepActivity', 'GuidedStepSupportActivity')
+    line = line.replace('extends Activity', 'extends FragmentActivity')
+    outfile.write(line)
+file.close()
+outfile.close()
+
+file = open('src/com/example/android/leanback/GuidedStepHalfScreenActivity.java', 'r')
+outfile = open('src/com/example/android/leanback/GuidedStepSupportHalfScreenActivity.java', 'w')
+write_java_head(outfile, "GuidedStepHalfScreenActivity")
+for line in file:
+    line = line.replace('android.app.Fragment', 'android.support.v4.app.Fragment')
+    line = line.replace('android.app.Activity', 'android.support.v4.app.FragmentActivity')
+    line = line.replace('GuidedStepFragment', 'GuidedStepSupportFragment')
+    line = line.replace('GuidedStepActivity', 'GuidedStepSupportActivity')
+    line = line.replace('GuidedStepHalfScreenActivity', 'GuidedStepSupportHalfScreenActivity')
+    line = line.replace('extends Activity', 'extends FragmentActivity')
+    outfile.write(line)
+file.close()
+outfile.close()
+
+file = open('src/com/example/android/leanback/BrowseFragment.java', 'r')
+outfile = open('src/com/example/android/leanback/BrowseSupportFragment.java', 'w')
+write_java_head(outfile, "BrowseFragment")
+for line in file:
+    line = line.replace('android.app.Fragment', 'android.support.v4.app.Fragment')
+    line = line.replace('android.app.Activity', 'android.support.v4.app.FragmentActivity')
+    line = line.replace('BrowseFragment', 'BrowseSupportFragment')
+    line = line.replace('GuidedStepFragment', 'GuidedStepSupportFragment')
+    line = line.replace('GuidedStepActivity', 'GuidedStepSupportActivity')
+    line = line.replace('getActivity().getFragmentManager()', 'getActivity().getSupportFragmentManager()')
+    line = line.replace('BrowseActivity', 'BrowseSupportActivity')
+    line = line.replace('DetailsActivity', 'DetailsSupportActivity')
+    line = line.replace('SearchActivity', 'SearchSupportActivity')
+    line = line.replace('RowsActivity', 'RowsSupportActivity')
+    line = line.replace('RowsFragment', 'RowsSupportFragment')
+    line = line.replace('GuidedStepHalfScreenActivity', 'GuidedStepSupportHalfScreenActivity')
+    outfile.write(line)
+file.close()
+outfile.close()
+
+file = open('src/com/example/android/leanback/BrowseActivity.java', 'r')
+outfile = open('src/com/example/android/leanback/BrowseSupportActivity.java', 'w')
+write_java_head(outfile, "BrowseActivity")
+for line in file:
+    line = line.replace('BrowseActivity', 'BrowseSupportActivity')
+    line = line.replace('android.app.Activity', 'android.support.v4.app.FragmentActivity')
+    line = line.replace('extends Activity', 'extends FragmentActivity')
+    line = line.replace('R.layout.browse', 'R.layout.browse_support')
+    outfile.write(line)
+file.close()
+outfile.close()
+
+file = open('res/layout/browse.xml', 'r')
+outfile = open('res/layout/browse_support.xml', 'w')
+for line in file:
+    line = replace_xml_head(line, "browse")
+    line = line.replace('com.example.android.leanback.BrowseFragment', 'com.example.android.leanback.BrowseSupportFragment')
+    outfile.write(line)
+file.close()
+outfile.close()
+
+
+file = open('src/com/example/android/leanback/DetailsFragment.java', 'r')
+outfile = open('src/com/example/android/leanback/DetailsSupportFragment.java', 'w')
+write_java_head(outfile, "DetailsFragment")
+for line in file:
+    line = line.replace('android.app.Fragment', 'android.support.v4.app.Fragment')
+    line = line.replace('android.app.Activity', 'android.support.v4.app.FragmentActivity')
+    line = line.replace('DetailsFragment', 'DetailsSupportFragment')
+    line = line.replace('DetailsActivity', 'DetailsSupportActivity')
+    line = line.replace('PlaybackOverlayActivity', 'PlaybackOverlaySupportActivity')
+    line = line.replace('SearchActivity', 'SearchSupportActivity')
+    outfile.write(line)
+file.close()
+outfile.close()
+
+file = open('src/com/example/android/leanback/NewDetailsFragment.java', 'r')
+outfile = open('src/com/example/android/leanback/NewDetailsSupportFragment.java', 'w')
+write_java_head(outfile, "NewDetailsFragment")
+for line in file:
+    line = line.replace('android.app.Fragment', 'android.support.v4.app.Fragment')
+    line = line.replace('android.app.Activity', 'android.support.v4.app.FragmentActivity')
+    line = line.replace('DetailsFragment', 'DetailsSupportFragment')
+    line = line.replace('DetailsActivity', 'DetailsSupportActivity')
+    line = line.replace('PlaybackOverlayActivity', 'PlaybackOverlaySupportActivity')
+    line = line.replace('SearchActivity', 'SearchSupportActivity')
+    outfile.write(line)
+file.close()
+outfile.close()
+
+file = open('src/com/example/android/leanback/DetailsActivity.java', 'r')
+outfile = open('src/com/example/android/leanback/DetailsSupportActivity.java', 'w')
+write_java_head(outfile, "DetailsActivity")
+for line in file:
+    line = line.replace('DetailsActivity', 'DetailsSupportActivity')
+    line = line.replace('android.app.Activity', 'android.support.v4.app.FragmentActivity')
+    line = line.replace('extends Activity', 'extends FragmentActivity')
+    line = line.replace('R.layout.details', 'R.layout.details_support')
+    line = line.replace('R.layout.legacy_details', 'R.layout.legacy_details_support')
+    line = line.replace('getFragmentManager()', 'getSupportFragmentManager()')
+    line = line.replace('DetailsFragment', 'DetailsSupportFragment')
+    line = line.replace('NewDetailsFragment', 'NewDetailsSupportFragment')
+    outfile.write(line)
+file.close()
+outfile.close()
+
+file = open('res/layout/details.xml', 'r')
+outfile = open('res/layout/details_support.xml', 'w')
+for line in file:
+    line = replace_xml_head(line, "details")
+    line = line.replace('com.example.android.leanback.NewDetailsFragment', 'com.example.android.leanback.NewDetailsSupportFragment')
+    outfile.write(line)
+file.close()
+outfile.close()
+
+
+file = open('res/layout/legacy_details.xml', 'r')
+outfile = open('res/layout/legacy_details_support.xml', 'w')
+for line in file:
+    line = replace_xml_head(line, "legacy_details")
+    line = line.replace('com.example.android.leanback.DetailsFragment', 'com.example.android.leanback.DetailsSupportFragment')
+    outfile.write(line)
+file.close()
+outfile.close()
+
+
+file = open('src/com/example/android/leanback/SearchDetailsActivity.java', 'r')
+outfile = open('src/com/example/android/leanback/SearchDetailsSupportActivity.java', 'w')
+write_java_head(outfile, "SearchDetailsActivity")
+for line in file:
+    line = line.replace('DetailsActivity', 'DetailsSupportActivity')
+    outfile.write(line)
+file.close()
+outfile.close()
+
+
+file = open('src/com/example/android/leanback/SearchFragment.java', 'r')
+outfile = open('src/com/example/android/leanback/SearchSupportFragment.java', 'w')
+write_java_head(outfile, "SearchFragment")
+for line in file:
+    line = line.replace('SearchFragment', 'SearchSupportFragment')
+    line = line.replace('DetailsActivity', 'DetailsSupportActivity')
+    outfile.write(line)
+file.close()
+outfile.close()
+
+file = open('src/com/example/android/leanback/SearchActivity.java', 'r')
+outfile = open('src/com/example/android/leanback/SearchSupportActivity.java', 'w')
+write_java_head(outfile, "SearchActivity")
+for line in file:
+    line = line.replace('SearchActivity', 'SearchSupportActivity')
+    line = line.replace('extends Activity', 'extends FragmentActivity')
+    line = line.replace('R.layout.search', 'R.layout.search_support')
+    line = line.replace('android.app.Activity', 'android.support.v4.app.FragmentActivity')
+    line = line.replace('getFragmentManager()', 'getSupportFragmentManager()')
+    line = line.replace('SearchFragment', 'SearchSupportFragment')
+    outfile.write(line)
+file.close()
+outfile.close()
+
+file = open('res/layout/search.xml', 'r')
+outfile = open('res/layout/search_support.xml', 'w')
+for line in file:
+    line = replace_xml_head(line, "search")
+    line = line.replace('com.example.android.leanback.SearchFragment', 'com.example.android.leanback.SearchSupportFragment')
+    outfile.write(line)
+file.close()
+outfile.close()
+
+file = open('src/com/example/android/leanback/VerticalGridFragment.java', 'r')
+outfile = open('src/com/example/android/leanback/VerticalGridSupportFragment.java', 'w')
+outfile.write("/* This file is auto-generated from VerticalGridFragment.  DO NOT MODIFY. */\n\n")
+for line in file:
+    line = line.replace('VerticalGridFragment', 'VerticalGridSupportFragment')
+    line = line.replace('DetailsActivity', 'DetailsSupportActivity')
+    line = line.replace('SearchActivity', 'SearchSupportActivity')
+    outfile.write(line)
+file.close()
+outfile.close()
+
+file = open('src/com/example/android/leanback/VerticalGridActivity.java', 'r')
+outfile = open('src/com/example/android/leanback/VerticalGridSupportActivity.java', 'w')
+write_java_head(outfile, "VerticalGridActivity")
+for line in file:
+    line = line.replace('VerticalGridActivity', 'VerticalGridSupportActivity')
+    line = line.replace('extends Activity', 'extends FragmentActivity')
+    line = line.replace('R.layout.vertical_grid', 'R.layout.vertical_grid_support')
+    line = line.replace('android.app.Activity', 'android.support.v4.app.FragmentActivity')
+    line = line.replace('getFragmentManager()', 'getSupportFragmentManager()')
+    line = line.replace('VerticalGridFragment', 'VerticalGridSupportFragment')
+    outfile.write(line)
+file.close()
+outfile.close()
+
+file = open('res/layout/vertical_grid.xml', 'r')
+outfile = open('res/layout/vertical_grid_support.xml', 'w')
+for line in file:
+    line = replace_xml_head(line, "vertical_grid")
+    line = line.replace('com.example.android.leanback.VerticalGridFragment', 'com.example.android.leanback.VerticalGridSupportFragment')
+    outfile.write(line)
+file.close()
+outfile.close()
+
+
+file = open('src/com/example/android/leanback/ErrorFragment.java', 'r')
+outfile = open('src/com/example/android/leanback/ErrorSupportFragment.java', 'w')
+write_java_head(outfile, "ErrorFragment")
+for line in file:
+    line = line.replace('ErrorFragment', 'ErrorSupportFragment')
+    outfile.write(line)
+file.close()
+outfile.close()
+
+file = open('src/com/example/android/leanback/BrowseErrorActivity.java', 'r')
+outfile = open('src/com/example/android/leanback/BrowseErrorSupportActivity.java', 'w')
+write_java_head(outfile, "BrowseErrorActivity")
+for line in file:
+    line = line.replace('BrowseErrorActivity', 'BrowseErrorSupportActivity')
+    line = line.replace('extends Activity', 'extends FragmentActivity')
+    line = line.replace('R.layout.browse', 'R.layout.browse_support')
+    line = line.replace('android.app.Activity', 'android.support.v4.app.FragmentActivity')
+    line = line.replace('getFragmentManager()', 'getSupportFragmentManager()')
+    line = line.replace('ErrorFragment', 'ErrorSupportFragment')
+    line = line.replace('SpinnerFragment', 'SpinnerSupportFragment')
+    line = line.replace('android.app.Fragment', 'android.support.v4.app.Fragment')
+    outfile.write(line)
+file.close()
+outfile.close()
+
+file = open('src/com/example/android/leanback/RowsFragment.java', 'r')
+outfile = open('src/com/example/android/leanback/RowsSupportFragment.java', 'w')
+write_java_head(outfile, "RowsFragment")
+for line in file:
+    line = line.replace('RowsFragment', 'RowsSupportFragment')
+    line = line.replace('DetailsActivity', 'DetailsSupportActivity')
+    outfile.write(line)
+file.close()
+outfile.close()
+
+file = open('src/com/example/android/leanback/RowsActivity.java', 'r')
+outfile = open('src/com/example/android/leanback/RowsSupportActivity.java', 'w')
+write_java_head(outfile, "RowsActivity")
+for line in file:
+    line = line.replace('RowsActivity', 'RowsSupportActivity')
+    line = line.replace('extends Activity', 'extends FragmentActivity')
+    line = line.replace('R.layout.rows', 'R.layout.rows_support')
+    line = line.replace('android.app.Activity', 'android.support.v4.app.FragmentActivity')
+    line = line.replace('RowsFragment', 'RowsSupportFragment')
+    line = line.replace('getFragmentManager()', 'getSupportFragmentManager()')
+    line = line.replace('SearchActivity', 'SearchSupportActivity')
+    outfile.write(line)
+file.close()
+outfile.close()
+
+file = open('res/layout/rows.xml', 'r')
+outfile = open('res/layout/rows_support.xml', 'w')
+for line in file:
+    line = replace_xml_head(line, "rows")
+    line = line.replace('com.example.android.leanback.RowsFragment', 'com.example.android.leanback.RowsSupportFragment')
+    outfile.write(line)
+file.close()
+outfile.close()
+
+
+file = open('src/com/example/android/leanback/PlaybackOverlayFragment.java', 'r')
+outfile = open('src/com/example/android/leanback/PlaybackOverlaySupportFragment.java', 'w')
+write_java_head(outfile, "PlaybackOverlayFragment")
+for line in file:
+    line = line.replace('PlaybackOverlayFragment', 'PlaybackOverlaySupportFragment')
+    line = line.replace('PlaybackControlHelper', 'PlaybackControlSupportHelper')
+    line = line.replace('PlaybackOverlayActivity', 'PlaybackOverlaySupportActivity')
+    outfile.write(line)
+file.close()
+outfile.close()
+
+file = open('src/com/example/android/leanback/PlaybackControlHelper.java', 'r')
+outfile = open('src/com/example/android/leanback/PlaybackControlSupportHelper.java', 'w')
+write_java_head(outfile, "PlaybackControlHelper")
+for line in file:
+    line = line.replace('PlaybackControlHelper', 'PlaybackControlSupportHelper')
+    line = line.replace('PlaybackControlGlue', 'PlaybackControlSupportGlue')
+    line = line.replace('PlaybackOverlayFragment', 'PlaybackOverlaySupportFragment')
+    outfile.write(line)
+file.close()
+outfile.close()
+
+file = open('src/com/example/android/leanback/PlaybackOverlayActivity.java', 'r')
+outfile = open('src/com/example/android/leanback/PlaybackOverlaySupportActivity.java', 'w')
+write_java_head(outfile, "PlaybackOverlayActivity")
+for line in file:
+    line = line.replace('PlaybackOverlayActivity', 'PlaybackOverlaySupportActivity')
+    line = line.replace('extends Activity', 'extends FragmentActivity')
+    line = line.replace('R.layout.playback_controls', 'R.layout.playback_controls_support')
+    line = line.replace('android.app.Activity', 'android.support.v4.app.FragmentActivity')
+    outfile.write(line)
+file.close()
+outfile.close()
+
+file = open('res/layout/playback_controls.xml', 'r')
+outfile = open('res/layout/playback_controls_support.xml', 'w')
+for line in file:
+    line = replace_xml_head(line, "playback_controls")
+    line = line.replace('com.example.android.leanback.PlaybackOverlayFragment', 'com.example.android.leanback.PlaybackOverlaySupportFragment')
+    outfile.write(line)
+file.close()
+outfile.close()
+
+file = open('src/com/example/android/leanback/OnboardingActivity.java', 'r')
+outfile = open('src/com/example/android/leanback/OnboardingSupportActivity.java', 'w')
+write_java_head(outfile, "OnboardingActivity")
+for line in file:
+    line = line.replace('android.app.Fragment', 'android.support.v4.app.Fragment')
+    line = line.replace('android.app.Activity', 'android.support.v4.app.FragmentActivity')
+    line = line.replace('OnboardingActivity', 'OnboardingSupportActivity')
+    line = line.replace('OnboardingDemoFragment', 'OnboardingDemoSupportFragment')
+    line = line.replace('extends Activity', 'extends FragmentActivity')
+    line = line.replace('getFragmentManager()', 'getSupportFragmentManager()')
+    outfile.write(line)
+file.close()
+outfile.close()
+
+file = open('src/com/example/android/leanback/OnboardingDemoFragment.java', 'r')
+outfile = open('src/com/example/android/leanback/OnboardingDemoSupportFragment.java', 'w')
+write_java_head(outfile, "OnboardingDemoFragment")
+for line in file:
+    line = line.replace('android.app.Fragment', 'android.support.v4.app.Fragment')
+    line = line.replace('import android.app.Activity', 'import android.support.v4.app.FragmentActivity')
+    line = line.replace('OnboardingDemoFragment', 'OnboardingDemoSupportFragment')
+    line = line.replace('OnboardingFragment', 'OnboardingSupportFragment')
+    line = line.replace('OnboardingActivity', 'OnboardingSupportActivity')
+    outfile.write(line)
+file.close()
+outfile.close()
diff --git a/samples/SupportLeanbackDemos/res/drawable-hdpi/ic_launcher.png b/samples/SupportLeanbackDemos/res/drawable-hdpi/ic_launcher.png
new file mode 100644
index 0000000..96a442e
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable-hdpi/ic_launcher.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-hdpi/ic_main_icon.png b/samples/SupportLeanbackDemos/res/drawable-hdpi/ic_main_icon.png
new file mode 100644
index 0000000..6f0c962
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable-hdpi/ic_main_icon.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-ldpi/ic_launcher.png b/samples/SupportLeanbackDemos/res/drawable-ldpi/ic_launcher.png
new file mode 100644
index 0000000..9923872
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable-ldpi/ic_launcher.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-mdpi/ic_launcher.png b/samples/SupportLeanbackDemos/res/drawable-mdpi/ic_launcher.png
new file mode 100644
index 0000000..359047d
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable-mdpi/ic_launcher.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-mdpi/ic_main_icon.png b/samples/SupportLeanbackDemos/res/drawable-mdpi/ic_main_icon.png
new file mode 100644
index 0000000..e9effc8
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable-mdpi/ic_main_icon.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/bg.png b/samples/SupportLeanbackDemos/res/drawable-xhdpi/bg.png
new file mode 100644
index 0000000..476c698
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable-xhdpi/bg.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/ic_launcher.png b/samples/SupportLeanbackDemos/res/drawable-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..71c6d76
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable-xhdpi/ic_launcher.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/ic_main_icon.png b/samples/SupportLeanbackDemos/res/drawable-xhdpi/ic_main_icon.png
new file mode 100644
index 0000000..2e56516
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable-xhdpi/ic_main_icon.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_bg.png b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_bg.png
new file mode 100644
index 0000000..c3668ea
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_bg.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_1.png b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_1.png
new file mode 100644
index 0000000..93a2212
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_1.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_10.png b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_10.png
new file mode 100644
index 0000000..6ae91d9
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_10.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_11.png b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_11.png
new file mode 100644
index 0000000..556a247
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_11.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_12.png b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_12.png
new file mode 100644
index 0000000..80f8e85
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_12.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_13.png b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_13.png
new file mode 100644
index 0000000..1e080a1
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_13.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_14.png b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_14.png
new file mode 100644
index 0000000..b854bbd
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_14.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_15.png b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_15.png
new file mode 100644
index 0000000..f08383d
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_15.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_16.png b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_16.png
new file mode 100644
index 0000000..ed54ef0
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_16.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_17.png b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_17.png
new file mode 100644
index 0000000..e5c197d
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_17.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_18.png b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_18.png
new file mode 100644
index 0000000..100dd81
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_18.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_19.png b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_19.png
new file mode 100644
index 0000000..cf8909b
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_19.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_2.png b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_2.png
new file mode 100644
index 0000000..386720f
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_2.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_20.png b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_20.png
new file mode 100644
index 0000000..613157b
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_20.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_21.png b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_21.png
new file mode 100644
index 0000000..9bab3a8
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_21.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_22.png b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_22.png
new file mode 100644
index 0000000..956adf4
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_22.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_23.png b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_23.png
new file mode 100644
index 0000000..ac703d3
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_23.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_24.png b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_24.png
new file mode 100644
index 0000000..2522c66
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_24.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_25.png b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_25.png
new file mode 100644
index 0000000..f8d21d2
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_25.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_26.png b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_26.png
new file mode 100644
index 0000000..92d9583
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_26.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_27.png b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_27.png
new file mode 100644
index 0000000..9ccc088
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_27.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_28.png b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_28.png
new file mode 100644
index 0000000..673d449
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_28.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_29.png b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_29.png
new file mode 100644
index 0000000..3d3301f
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_29.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_3.png b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_3.png
new file mode 100644
index 0000000..f51f6b4
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_3.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_30.png b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_30.png
new file mode 100644
index 0000000..f43893d
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_30.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_31.png b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_31.png
new file mode 100644
index 0000000..a3afd81
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_31.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_32.png b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_32.png
new file mode 100644
index 0000000..70a24db
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_32.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_33.png b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_33.png
new file mode 100644
index 0000000..447e5bb
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_33.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_34.png b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_34.png
new file mode 100644
index 0000000..e3dc093
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_34.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_35.png b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_35.png
new file mode 100644
index 0000000..4d7f43a
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_35.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_36.png b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_36.png
new file mode 100644
index 0000000..c2e4a62
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_36.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_37.png b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_37.png
new file mode 100644
index 0000000..1690677
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_37.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_38.png b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_38.png
new file mode 100644
index 0000000..e40c9da
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_38.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_39.png b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_39.png
new file mode 100644
index 0000000..c399e7f
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_39.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_4.png b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_4.png
new file mode 100644
index 0000000..70fdb5a
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_4.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_40.png b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_40.png
new file mode 100644
index 0000000..9361a14
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_40.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_41.png b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_41.png
new file mode 100644
index 0000000..6828440
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_41.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_42.png b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_42.png
new file mode 100644
index 0000000..6bee090
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_42.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_43.png b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_43.png
new file mode 100644
index 0000000..6a76da1
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_43.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_44.png b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_44.png
new file mode 100644
index 0000000..ac86242
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_44.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_5.png b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_5.png
new file mode 100644
index 0000000..08bc451
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_5.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_6.png b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_6.png
new file mode 100644
index 0000000..6939974
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_6.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_7.png b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_7.png
new file mode 100644
index 0000000..01637e4
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_7.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_8.png b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_8.png
new file mode 100644
index 0000000..bedf8fb
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_8.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_9.png b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_9.png
new file mode 100644
index 0000000..33cada1
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable-xhdpi/tv_content_9.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable/details_img.png b/samples/SupportLeanbackDemos/res/drawable/details_img.png
new file mode 100644
index 0000000..7ea688b
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable/details_img.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable/details_img_16x9.png b/samples/SupportLeanbackDemos/res/drawable/details_img_16x9.png
new file mode 100644
index 0000000..daa505d
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable/details_img_16x9.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable/gallery_photo_1.jpg b/samples/SupportLeanbackDemos/res/drawable/gallery_photo_1.jpg
new file mode 100644
index 0000000..a2581fe
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable/gallery_photo_1.jpg
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable/gallery_photo_2.jpg b/samples/SupportLeanbackDemos/res/drawable/gallery_photo_2.jpg
new file mode 100644
index 0000000..82ba3a8
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable/gallery_photo_2.jpg
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable/gallery_photo_3.jpg b/samples/SupportLeanbackDemos/res/drawable/gallery_photo_3.jpg
new file mode 100644
index 0000000..2a83021
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable/gallery_photo_3.jpg
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable/gallery_photo_4.jpg b/samples/SupportLeanbackDemos/res/drawable/gallery_photo_4.jpg
new file mode 100644
index 0000000..70a1c55
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable/gallery_photo_4.jpg
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable/gallery_photo_5.jpg b/samples/SupportLeanbackDemos/res/drawable/gallery_photo_5.jpg
new file mode 100644
index 0000000..dc3f677
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable/gallery_photo_5.jpg
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable/gallery_photo_6.jpg b/samples/SupportLeanbackDemos/res/drawable/gallery_photo_6.jpg
new file mode 100644
index 0000000..2e113a0
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable/gallery_photo_6.jpg
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable/gallery_photo_7.jpg b/samples/SupportLeanbackDemos/res/drawable/gallery_photo_7.jpg
new file mode 100644
index 0000000..bc30297
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable/gallery_photo_7.jpg
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable/gallery_photo_8.jpg b/samples/SupportLeanbackDemos/res/drawable/gallery_photo_8.jpg
new file mode 100644
index 0000000..dc3aa85
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable/gallery_photo_8.jpg
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable/ic_action_a.png b/samples/SupportLeanbackDemos/res/drawable/ic_action_a.png
new file mode 100644
index 0000000..3d555ef
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable/ic_action_a.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable/ic_guidedstep_option_a.png b/samples/SupportLeanbackDemos/res/drawable/ic_guidedstep_option_a.png
new file mode 100644
index 0000000..b1afd78
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable/ic_guidedstep_option_a.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable/ic_guidedstep_option_b.png b/samples/SupportLeanbackDemos/res/drawable/ic_guidedstep_option_b.png
new file mode 100644
index 0000000..3349108
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable/ic_guidedstep_option_b.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable/ic_guidedstep_option_c.png b/samples/SupportLeanbackDemos/res/drawable/ic_guidedstep_option_c.png
new file mode 100644
index 0000000..d92c927
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable/ic_guidedstep_option_c.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable/ic_title.png b/samples/SupportLeanbackDemos/res/drawable/ic_title.png
new file mode 100644
index 0000000..1c62b2e
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable/ic_title.png
Binary files differ
diff --git a/samples/SupportLeanbackDemos/res/drawable/text_bg.xml b/samples/SupportLeanbackDemos/res/drawable/text_bg.xml
new file mode 100644
index 0000000..a26937d
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable/text_bg.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2014 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="#FFFF0000"
+        android:endColor="#FFFF00FF"
+        android:angle="45" />
+    <padding
+        android:left="7dp"
+        android:top="7dp"
+        android:right="7dp"
+        android:bottom="7dp" />
+    <size
+        android:height="160dp"
+        android:width="100dp" />
+</shape>
diff --git a/samples/SupportLeanbackDemos/res/drawable/tv_content.xml b/samples/SupportLeanbackDemos/res/drawable/tv_content.xml
new file mode 100644
index 0000000..5007e87
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/drawable/tv_content.xml
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2016 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.
+-->
+
+<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
+    android:oneshot="true">
+    <item android:drawable="@drawable/tv_content_1" android:duration="33" />
+    <item android:drawable="@drawable/tv_content_2" android:duration="33" />
+    <item android:drawable="@drawable/tv_content_3" android:duration="33" />
+    <item android:drawable="@drawable/tv_content_4" android:duration="33" />
+    <item android:drawable="@drawable/tv_content_5" android:duration="33" />
+    <item android:drawable="@drawable/tv_content_6" android:duration="33" />
+    <item android:drawable="@drawable/tv_content_7" android:duration="33" />
+    <item android:drawable="@drawable/tv_content_8" android:duration="33" />
+    <item android:drawable="@drawable/tv_content_9" android:duration="33" />
+    <item android:drawable="@drawable/tv_content_10" android:duration="33" />
+    <item android:drawable="@drawable/tv_content_11" android:duration="33" />
+    <item android:drawable="@drawable/tv_content_12" android:duration="33" />
+    <item android:drawable="@drawable/tv_content_13" android:duration="33" />
+    <item android:drawable="@drawable/tv_content_14" android:duration="33" />
+    <item android:drawable="@drawable/tv_content_15" android:duration="33" />
+    <item android:drawable="@drawable/tv_content_16" android:duration="33" />
+    <item android:drawable="@drawable/tv_content_17" android:duration="33" />
+    <item android:drawable="@drawable/tv_content_18" android:duration="33" />
+    <item android:drawable="@drawable/tv_content_19" android:duration="33" />
+    <item android:drawable="@drawable/tv_content_20" android:duration="33" />
+    <item android:drawable="@drawable/tv_content_21" android:duration="33" />
+    <item android:drawable="@drawable/tv_content_22" android:duration="33" />
+    <item android:drawable="@drawable/tv_content_23" android:duration="33" />
+    <item android:drawable="@drawable/tv_content_24" android:duration="33" />
+    <item android:drawable="@drawable/tv_content_25" android:duration="33" />
+    <item android:drawable="@drawable/tv_content_26" android:duration="33" />
+    <item android:drawable="@drawable/tv_content_27" android:duration="33" />
+    <item android:drawable="@drawable/tv_content_28" android:duration="33" />
+    <item android:drawable="@drawable/tv_content_29" android:duration="33" />
+    <item android:drawable="@drawable/tv_content_30" android:duration="33" />
+    <item android:drawable="@drawable/tv_content_31" android:duration="33" />
+    <item android:drawable="@drawable/tv_content_32" android:duration="33" />
+    <item android:drawable="@drawable/tv_content_33" android:duration="33" />
+    <item android:drawable="@drawable/tv_content_34" android:duration="33" />
+    <item android:drawable="@drawable/tv_content_35" android:duration="33" />
+    <item android:drawable="@drawable/tv_content_36" android:duration="33" />
+    <item android:drawable="@drawable/tv_content_37" android:duration="33" />
+    <item android:drawable="@drawable/tv_content_38" android:duration="33" />
+    <item android:drawable="@drawable/tv_content_39" android:duration="33" />
+    <item android:drawable="@drawable/tv_content_40" android:duration="33" />
+    <item android:drawable="@drawable/tv_content_41" android:duration="33" />
+    <item android:drawable="@drawable/tv_content_42" android:duration="33" />
+    <item android:drawable="@drawable/tv_content_43" android:duration="33" />
+    <item android:drawable="@drawable/tv_content_44" android:duration="33" />
+</animation-list>
diff --git a/samples/SupportLeanbackDemos/res/layout/browse.xml b/samples/SupportLeanbackDemos/res/layout/browse.xml
new file mode 100644
index 0000000..ca19691
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/layout/browse.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2014 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.
+-->
+
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/main_frame"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+	<fragment
+	    android:name="com.example.android.leanback.BrowseFragment"
+	    android:id="@+id/main_browse_fragment"
+	    android:layout_width="match_parent"
+	    android:layout_height="match_parent"
+	/>
+
+  <!-- container for hosting GuidedStepFragment -->
+  <FrameLayout android:id="@+id/lb_guidedstep_host"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent" />
+
+</FrameLayout>
diff --git a/samples/SupportLeanbackDemos/res/layout/browse_animation.xml b/samples/SupportLeanbackDemos/res/layout/browse_animation.xml
new file mode 100644
index 0000000..7b00345
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/layout/browse_animation.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2014 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.
+-->
+
+<fragment xmlns:android="http://schemas.android.com/apk/res/android"
+    android:name="com.example.android.leanback.BrowseAnimationFragment"
+    android:id="@+id/main_browse_fragment"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+/>
diff --git a/samples/SupportLeanbackDemos/res/layout/browse_support.xml b/samples/SupportLeanbackDemos/res/layout/browse_support.xml
new file mode 100644
index 0000000..23058ad
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/layout/browse_support.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- This file is auto-generated from browse.xml.  DO NOT MODIFY. -->
+
+<!--
+     Copyright (C) 2014 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.
+-->
+
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/main_frame"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+	<fragment
+	    android:name="com.example.android.leanback.BrowseSupportFragment"
+	    android:id="@+id/main_browse_fragment"
+	    android:layout_width="match_parent"
+	    android:layout_height="match_parent"
+	/>
+
+  <!-- container for hosting GuidedStepFragment -->
+  <FrameLayout android:id="@+id/lb_guidedstep_host"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent" />
+
+</FrameLayout>
diff --git a/samples/SupportLeanbackDemos/res/layout/details.xml b/samples/SupportLeanbackDemos/res/layout/details.xml
new file mode 100644
index 0000000..3159f54
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/layout/details.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2014 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.
+-->
+
+<fragment xmlns:android="http://schemas.android.com/apk/res/android"
+    android:name="com.example.android.leanback.NewDetailsFragment"
+    android:id="@+id/details_fragment"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+/>
diff --git a/samples/SupportLeanbackDemos/res/layout/details_support.xml b/samples/SupportLeanbackDemos/res/layout/details_support.xml
new file mode 100644
index 0000000..103dc25
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/layout/details_support.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- This file is auto-generated from details.xml.  DO NOT MODIFY. -->
+
+<!--
+     Copyright (C) 2014 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.
+-->
+
+<fragment xmlns:android="http://schemas.android.com/apk/res/android"
+    android:name="com.example.android.leanback.NewDetailsSupportFragment"
+    android:id="@+id/details_fragment"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+/>
diff --git a/samples/SupportLeanbackDemos/res/layout/guided_step_activity.xml b/samples/SupportLeanbackDemos/res/layout/guided_step_activity.xml
new file mode 100644
index 0000000..a1de213
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/layout/guided_step_activity.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2014 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.
+-->
+
+<!-- container for hosting GuidedStepFragment -->
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+  android:id="@+id/lb_guidedstep_host"
+  android:layout_width="match_parent"
+  android:layout_height="match_parent" />
diff --git a/samples/SupportLeanbackDemos/res/layout/guidedstep_second_guidance.xml b/samples/SupportLeanbackDemos/res/layout/guidedstep_second_guidance.xml
new file mode 100644
index 0000000..09aaef1
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/layout/guidedstep_second_guidance.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2014 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.
+-->
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent" >
+
+    <RelativeLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        style="?attr/guidanceContainerStyle" >
+
+        <ImageView
+            android:id="@+id/guidance_icon"
+            style="@style/Widget.Example.Leanback.SecondStepGuidanceIconStyle"
+            android:layout_width="188dp"
+            tools:ignore="ContentDescription" />
+
+        <TextView
+            android:id="@+id/guidance_title"
+            style="?attr/guidanceTitleStyle" />
+
+        <TextView
+            android:id="@+id/guidance_breadcrumb"
+            style="?attr/guidanceBreadcrumbStyle" />
+
+        <TextView
+            android:id="@+id/guidance_description"
+            style="?attr/guidanceDescriptionStyle" />
+
+    </RelativeLayout>
+
+</FrameLayout>
diff --git a/samples/SupportLeanbackDemos/res/layout/horizontal_grid.xml b/samples/SupportLeanbackDemos/res/layout/horizontal_grid.xml
new file mode 100644
index 0000000..7faea03
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/layout/horizontal_grid.xml
@@ -0,0 +1,23 @@
+<RelativeLayout 
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:lb="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    >
+  <android.support.v17.leanback.widget.HorizontalGridView
+      android:id="@+id/gridview"
+      android:layout_width="match_parent"
+      android:layout_height="match_parent"
+      android:clipToPadding="false"
+      android:focusable="true"
+      android:focusableInTouchMode="true"
+      android:background="#00ffff"
+      lb:horizontalMargin="12dip"
+      lb:verticalMargin="24dip"
+      lb:numberOfRows="3"
+      lb:rowHeight="150dip"
+      android:paddingBottom="12dip"
+      android:paddingLeft="12dip"
+      android:paddingRight="12dip"
+      android:paddingTop="12dip" />
+</RelativeLayout>
diff --git a/samples/SupportLeanbackDemos/res/layout/legacy_details.xml b/samples/SupportLeanbackDemos/res/layout/legacy_details.xml
new file mode 100644
index 0000000..4af4e6a
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/layout/legacy_details.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2014 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.
+-->
+
+<fragment xmlns:android="http://schemas.android.com/apk/res/android"
+    android:name="com.example.android.leanback.DetailsFragment"
+    android:id="@+id/details_fragment"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+/>
diff --git a/samples/SupportLeanbackDemos/res/layout/legacy_details_support.xml b/samples/SupportLeanbackDemos/res/layout/legacy_details_support.xml
new file mode 100644
index 0000000..8146f9b
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/layout/legacy_details_support.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- This file is auto-generated from legacy_details.xml.  DO NOT MODIFY. -->
+
+<!--
+     Copyright (C) 2014 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.
+-->
+
+<fragment xmlns:android="http://schemas.android.com/apk/res/android"
+    android:name="com.example.android.leanback.DetailsSupportFragment"
+    android:id="@+id/details_fragment"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+/>
diff --git a/samples/SupportLeanbackDemos/res/layout/onboarding.xml b/samples/SupportLeanbackDemos/res/layout/onboarding.xml
new file mode 100644
index 0000000..3645422
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/layout/onboarding.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2016 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.
+-->
+
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <fragment
+        android:name="com.example.android.leanback.OnboardingDemoFragment"
+		android:id="@+id/main_onboarding_fragment"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent" />
+
+</FrameLayout>
diff --git a/samples/SupportLeanbackDemos/res/layout/onboarding_content.xml b/samples/SupportLeanbackDemos/res/layout/onboarding_content.xml
new file mode 100644
index 0000000..7a3edf9
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/layout/onboarding_content.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2016 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.
+-->
+
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+    <ImageView
+        android:id="@+id/background_image"
+        android:layout_width="215dp"
+        android:layout_height="128dp"
+        android:layout_gravity="center"
+        android:scaleType="fitCenter"
+        android:contentDescription="@null" />
+    <ImageView
+        android:id="@+id/animation_image"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_gravity="center"
+        android:scaleType="center"
+        android:contentDescription="@null" />
+</FrameLayout>
diff --git a/samples/SupportLeanbackDemos/res/layout/onboarding_image.xml b/samples/SupportLeanbackDemos/res/layout/onboarding_image.xml
new file mode 100644
index 0000000..2962b01
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/layout/onboarding_image.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2016 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/image"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:scaleType="fitCenter"
+    android:src="@drawable/bg"
+    android:contentDescription="@null" />
diff --git a/samples/SupportLeanbackDemos/res/layout/page_fragment.xml b/samples/SupportLeanbackDemos/res/layout/page_fragment.xml
new file mode 100644
index 0000000..9273f6f
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/layout/page_fragment.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        android:id="@+id/container_list"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+
+    <LinearLayout
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:orientation="vertical"
+        android:layout_alignParentRight="true"
+        android:layout_marginRight="128dp"
+        android:layout_centerVertical="true">
+
+        <EditText
+            android:id="@+id/tv1"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="Header 1"
+            android:layout_margin="16dp"
+            android:focusable="true"
+            android:textAppearance="@android:style/TextAppearance.DeviceDefault.Large" />
+
+        <EditText
+            android:id="@+id/tv2"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="Header 2"
+            android:layout_margin="16dp"
+            android:focusable="true"
+            android:textAppearance="@android:style/TextAppearance.DeviceDefault.Medium" />
+
+        <EditText
+            android:id="@+id/tv3"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="Header 3"
+            android:layout_margin="16dp"
+            android:focusable="true"
+            android:textAppearance="@android:style/TextAppearance.DeviceDefault.Small" />
+
+    </LinearLayout>
+</RelativeLayout>
\ No newline at end of file
diff --git a/samples/SupportLeanbackDemos/res/layout/playback_controls.xml b/samples/SupportLeanbackDemos/res/layout/playback_controls.xml
new file mode 100644
index 0000000..0c9f43c
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/layout/playback_controls.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2014 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.
+-->
+
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent" >
+
+    <ImageView
+        android:id="@+id/media_content"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:src="@drawable/bg" />
+
+    <fragment
+        android:id="@+id/playback_controls_fragment"
+        android:name="com.example.android.leanback.PlaybackOverlayFragment"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent" />
+
+</FrameLayout>
\ No newline at end of file
diff --git a/samples/SupportLeanbackDemos/res/layout/playback_controls_support.xml b/samples/SupportLeanbackDemos/res/layout/playback_controls_support.xml
new file mode 100644
index 0000000..4eb293f
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/layout/playback_controls_support.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- This file is auto-generated from playback_controls.xml.  DO NOT MODIFY. -->
+
+<!--
+     Copyright (C) 2014 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.
+-->
+
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent" >
+
+    <ImageView
+        android:id="@+id/media_content"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:src="@drawable/bg" />
+
+    <fragment
+        android:id="@+id/playback_controls_fragment"
+        android:name="com.example.android.leanback.PlaybackOverlaySupportFragment"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent" />
+
+</FrameLayout>
\ No newline at end of file
diff --git a/samples/SupportLeanbackDemos/res/layout/rows.xml b/samples/SupportLeanbackDemos/res/layout/rows.xml
new file mode 100644
index 0000000..664e41b
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/layout/rows.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2014 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.
+-->
+
+<android.support.v17.leanback.widget.BrowseFrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/rows_frame"
+    android:orientation="vertical"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+  <fragment
+      android:name="com.example.android.leanback.RowsFragment"
+      android:id="@+id/main_rows_fragment"
+      android:layout_width="match_parent"
+      android:layout_height="match_parent"
+  />
+
+    <android.support.v17.leanback.widget.TitleView
+        android:id="@+id/title"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content" />
+
+</android.support.v17.leanback.widget.BrowseFrameLayout>
diff --git a/samples/SupportLeanbackDemos/res/layout/rows_support.xml b/samples/SupportLeanbackDemos/res/layout/rows_support.xml
new file mode 100644
index 0000000..2668297
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/layout/rows_support.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- This file is auto-generated from rows.xml.  DO NOT MODIFY. -->
+
+<!--
+     Copyright (C) 2014 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.
+-->
+
+<android.support.v17.leanback.widget.BrowseFrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/rows_frame"
+    android:orientation="vertical"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+  <fragment
+      android:name="com.example.android.leanback.RowsSupportFragment"
+      android:id="@+id/main_rows_fragment"
+      android:layout_width="match_parent"
+      android:layout_height="match_parent"
+  />
+
+    <android.support.v17.leanback.widget.TitleView
+        android:id="@+id/title"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content" />
+
+</android.support.v17.leanback.widget.BrowseFrameLayout>
diff --git a/samples/SupportLeanbackDemos/res/layout/search.xml b/samples/SupportLeanbackDemos/res/layout/search.xml
new file mode 100644
index 0000000..b65600c
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/layout/search.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2014 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.
+-->
+
+<fragment xmlns:android="http://schemas.android.com/apk/res/android"
+          android:name="com.example.android.leanback.SearchFragment"
+          android:id="@+id/search_fragment"
+          android:layout_width="match_parent"
+          android:layout_height="match_parent"
+        />
\ No newline at end of file
diff --git a/samples/SupportLeanbackDemos/res/layout/search_support.xml b/samples/SupportLeanbackDemos/res/layout/search_support.xml
new file mode 100644
index 0000000..1d113cb
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/layout/search_support.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- This file is auto-generated from search.xml.  DO NOT MODIFY. -->
+
+<!--
+     Copyright (C) 2014 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.
+-->
+
+<fragment xmlns:android="http://schemas.android.com/apk/res/android"
+          android:name="com.example.android.leanback.SearchSupportFragment"
+          android:id="@+id/search_fragment"
+          android:layout_width="match_parent"
+          android:layout_height="match_parent"
+        />
\ No newline at end of file
diff --git a/samples/SupportLeanbackDemos/res/layout/vertical_grid.xml b/samples/SupportLeanbackDemos/res/layout/vertical_grid.xml
new file mode 100644
index 0000000..1007042
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/layout/vertical_grid.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2014 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.
+-->
+
+<fragment xmlns:android="http://schemas.android.com/apk/res/android"
+    android:name="com.example.android.leanback.VerticalGridFragment"
+    android:id="@+id/vertical_grid_fragment"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+/>
diff --git a/samples/SupportLeanbackDemos/res/layout/vertical_grid_support.xml b/samples/SupportLeanbackDemos/res/layout/vertical_grid_support.xml
new file mode 100644
index 0000000..3975ecc
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/layout/vertical_grid_support.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- This file is auto-generated from vertical_grid.xml.  DO NOT MODIFY. -->
+
+<!--
+     Copyright (C) 2014 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.
+-->
+
+<fragment xmlns:android="http://schemas.android.com/apk/res/android"
+    android:name="com.example.android.leanback.VerticalGridSupportFragment"
+    android:id="@+id/vertical_grid_fragment"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+/>
diff --git a/samples/SupportLeanbackDemos/res/values/arrays.xml b/samples/SupportLeanbackDemos/res/values/arrays.xml
new file mode 100644
index 0000000..307f49d
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/values/arrays.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2016 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>
+
+    <!-- Titles in the onboarding page. -->
+    <string-array name="onboarding_page_titles">
+        <item>Onboarding</item>
+        <item>Easy to implement</item>
+        <item>Customize your contents</item>
+    </string-array>
+
+    <!-- Descriptions in the onboarding page. -->
+    <string-array name="onboarding_page_descriptions">
+        <item>Announce your new features.</item>
+        <item>Just override OnboardingFragment and provide the messages and images.</item>
+        <item>Customize your own logo image, splash animation and the contents animations.</item>
+    </string-array>
+</resources>
diff --git a/samples/SupportLeanbackDemos/res/values/colors.xml b/samples/SupportLeanbackDemos/res/values/colors.xml
new file mode 100644
index 0000000..1fdeb87
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/values/colors.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 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="icon_background">#4A4F51</color>
+    <color name="icon_alt_background">#2A2F51</color>
+    <color name="page_indicator_dot">#80FFFFFF</color>
+</resources>
diff --git a/samples/SupportLeanbackDemos/res/values/strings.xml b/samples/SupportLeanbackDemos/res/values/strings.xml
new file mode 100644
index 0000000..0a3ead4
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/values/strings.xml
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2014 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<resources>
+    <string name="app_name">MainActivity</string>
+    <string name="main_breadcrumb">Demo</string>
+    <string name="main_title">Activities</string>
+    <string name="browse">Browse</string>
+    <string name="browse_description">BrowseFragment test</string>
+    <string name="browse_support">Browse(support version)</string>
+    <string name="browse_support_description">BrowseSupportFragment test</string>
+    <string name="search">Search</string>
+    <string name="search_description">SearchFragment test</string>
+    <string name="search_support">Search(support version)</string>
+    <string name="search_support_description">SearchSupportFragment test</string>
+    <string name="details">Details</string>
+    <string name="details_description">DetailsFragment test</string>
+    <string name="details_support">Details(support version)</string>
+    <string name="details_support_description">DetailsSupportFragment test</string>
+    <string name="search_details">Search Details</string>
+    <string name="search_details_description">Search style DetailsFragment test</string>
+    <string name="search_details_support">Search Details(support version)</string>
+    <string name="search_details_support_description">Search style DetailsSupportFragment test</string>
+    <string name="playback">Playback</string>
+    <string name="playback_description">PlaybackOverlayFragment test</string>
+    <string name="playback_support">Playback(support version)</string>
+    <string name="playback_support_description">PlaybackOverlaySupportFragment test</string>
+    <string name="hgrid">Horizontal Grid</string>
+    <string name="hgrid_description">HorizontalGridView test</string>
+    <string name="vgrid">Vertical Grid</string>
+    <string name="vgrid_description">VerticalGridFragment test</string>
+    <string name="vgrid_support">Vertical Grid(support version)</string>
+    <string name="vgrid_support_description">VerticalGridSupportFragment test</string>
+    <string name="guidedstep">Guided Step</string>
+    <string name="guidedstephalfscreen">Guided Step Half Screen</string>
+    <string name="guidedstep_description">GuidedStepFragment test</string>
+    <string name="guidedstepsupport">Guided Step(support version)</string>
+    <string name="guidedstepsupporthalfscreen">Guided Step Half Screen(support version)</string>
+    <string name="guidedstepsupport_description">GuidedStepSupportFragment test</string>
+    <string name="browseerror">Browse Error</string>
+    <string name="browseerror_description">BrowseError test</string>
+    <string name="browseerror_support">Browse ErrorFragment(support version)</string>
+    <string name="browseerror_support_description">Browse ErrorSupportFragment test</string>
+    <string name="detail_presenter_options">Choose Presenter for Details</string>
+    <string name="detail_presenter_options_description">Choose Presenter for Details</string>
+    <string name="legacydetails_off">Use New DetailsPresenter</string>
+    <string name="legacydetails_on">Use Legacy DetailsPresenter</string>
+    <string name="onboarding">Onboarding</string>
+    <string name="onboarding_description">Show onboarding activity.</string>
+    <string name="onboarding_support">Onboarding(support version)</string>
+
+    <!-- Strings related to guided sequence activity -->
+    <string name="guidedstep_first_title">First</string>
+    <string name="guidedstep_first_description">First step of guided sequence</string>
+    <string name="guidedstep_first_breadcrumb">Guided Steps</string>
+    <string name="guidedstep_second_title">Second</string>
+    <string name="guidedstep_second_description">Showcasing editable actions and dropdown</string>
+    <string name="guidedstep_second_breadcrumb">Guided Steps</string>
+    <string name="guidedstep_newpayment_title">New payment</string>
+    <string name="guidedstep_newpayment_description">Showcasing editable actions</string>
+    <string name="guidedstep_newpayment_breadcrumb">Guided Steps</string>
+    <string name="guidedstep_third_title">Third</string>
+    <string name="guidedstep_third_description">Showcasing different action configurations</string>
+    <string name="guidedstep_third_breadcrumb">Guided Steps</string>
+    <string name="guidedstep_fourth_title">Fourth</string>
+    <string name="guidedstep_fourth_description">Fourth step of guided sequence</string>
+    <string name="guidedstep_fourth_breadcrumb">Guided Steps</string>
+</resources>
diff --git a/samples/SupportLeanbackDemos/res/values/styles.xml b/samples/SupportLeanbackDemos/res/values/styles.xml
new file mode 100644
index 0000000..af8c5ae
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/values/styles.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2014 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:android="http://schemas.android.com/apk/res/android">
+    <style name="Widget.Example.Leanback.Title.Text" parent="Widget.Leanback.Title.Text" >
+    </style>
+    <style name="Widget.Example.Leanback.Rows.VerticalGridView" parent="Widget.Leanback.Rows.VerticalGridView">
+        <item name="android:paddingTop">96dp</item>
+    </style>
+    <style name="Widget.Example.Leanback.GuidanceIconStyle" parent="Widget.Leanback.GuidanceIconStyle">
+        <item name="android:background">@color/icon_background</item>
+    </style>
+    <style name="Widget.Example.Leanback.FirstStepGuidanceIconStyle" parent="Widget.Leanback.GuidanceIconStyle">
+        <item name="android:background">@color/icon_alt_background</item>
+    </style>
+    <style name="Widget.Example.Leanback.SecondStepGuidanceIconStyle" parent="Widget.Leanback.GuidanceIconStyle">
+        <item name="android:padding">24dp</item>
+    </style>
+
+    <style name="MyImageCardViewStyle" parent="Widget.Leanback.ImageCardViewStyle">
+        <item name="lbImageCardViewType">Title|Content|IconOnRight</item>
+    </style>
+
+    <style name="MyImageCardViewTitleStyleText" parent="TextAppearance.Leanback.ImageCardView.Title">
+        <item name="android:textColor">@android:color/holo_blue_bright</item>
+    </style>
+
+    <style name="MyImageCardViewTitleStyle" parent="Widget.Leanback.ImageCardView.TitleStyle">
+        <item name="android:textAppearance">@style/MyImageCardViewTitleStyleText</item>
+    </style>
+
+    <style name="MyImageCardViewTheme" parent="Theme.Leanback">
+        <item name="imageCardViewStyle">@style/MyImageCardViewStyle</item>
+        <item name="imageCardViewTitleStyle">@style/MyImageCardViewTitleStyle</item>
+    </style>
+
+    <style name="Widget.Example.Leanback.OnboardingLogoStyle" parent="Widget.Leanback.OnboardingLogoStyle">
+        <item name="android:layout_width">192dp</item>
+        <item name="android:layout_height">192dp</item>
+    </style>
+
+    <style name="Widget.Example.Leanback.OnboardingPageIndicatorStyle" parent="Widget.Leanback.OnboardingPageIndicatorStyle">
+        <item name="dotBgColor">@color/page_indicator_dot</item>
+    </style>
+</resources>
\ No newline at end of file
diff --git a/samples/SupportLeanbackDemos/res/values/themes.xml b/samples/SupportLeanbackDemos/res/values/themes.xml
new file mode 100644
index 0000000..db9f4c4
--- /dev/null
+++ b/samples/SupportLeanbackDemos/res/values/themes.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2014 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>
+    <style name="Theme.Example.Leanback" parent="Theme.Leanback">
+    </style>
+    <style name="Theme.Example.Leanback.Browse" parent="Theme.Leanback.Browse">
+    </style>
+    <style name="Theme.Example.Leanback.SearchDetails" parent="Theme.Leanback.Details.NoSharedElementTransition">
+    </style>
+    <style name="Theme.Example.Leanback.Details" parent="Theme.Leanback.Details">
+    </style>
+    <style name="Theme.Example.Leanback.VerticalGrid" parent="Theme.Leanback.VerticalGrid">
+    </style>
+    <style name="Theme.Example.Leanback.Rows" parent="Theme.Leanback">
+        <item name="browseTitleTextStyle">@style/Widget.Example.Leanback.Title.Text</item>
+        <item name="rowsVerticalGridStyle">@style/Widget.Example.Leanback.Rows.VerticalGridView</item>
+    </style>
+    <style name="Theme.Example.Leanback.GuidedStep" parent="Theme.Leanback.GuidedStep">
+        <item name="guidanceIconStyle">@style/Widget.Example.Leanback.GuidanceIconStyle</item>
+    </style>
+    <style name="Theme.Example.Leanback.GuidedStep.First">
+        <item name="guidanceIconStyle">@style/Widget.Example.Leanback.FirstStepGuidanceIconStyle</item>
+    </style>
+    <style name="Theme.Example.Leanback.GuidedStep.Half" parent="Theme.Leanback.GuidedStep.Half">
+    </style>
+    <style name="Theme.Example.Leanback.Onboarding" parent="Theme.Leanback.Onboarding">
+        <item name="onboardingLogoStyle">@style/Widget.Example.Leanback.OnboardingLogoStyle</item>
+        <item name="onboardingPageIndicatorStyle">@style/Widget.Example.Leanback.OnboardingPageIndicatorStyle</item>
+    </style>
+</resources>
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/BackgroundHelper.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/BackgroundHelper.java
new file mode 100644
index 0000000..99943df
--- /dev/null
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/BackgroundHelper.java
@@ -0,0 +1,154 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.example.android.leanback;
+
+import android.app.Activity;
+import android.graphics.Bitmap;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.Drawable;
+import android.os.AsyncTask;
+import android.os.Handler;
+import android.support.v17.leanback.app.BackgroundManager;
+import android.support.v4.content.ContextCompat;
+import android.util.Log;
+
+public class BackgroundHelper {
+
+    private static final String TAG = "BackgroundHelper";
+    private static final boolean DEBUG = false;
+    private static final boolean ENABLED = true;
+
+    // Background delay serves to avoid kicking off expensive bitmap loading
+    // in case multiple backgrounds are set in quick succession.
+    private static final int SET_BACKGROUND_DELAY_MS = 100;
+
+    static class Request {
+        Object mImageToken;
+        Activity mActivity;
+        Bitmap mResult;
+
+        Request(Activity activity, Object imageToken) {
+            mActivity = activity;
+            mImageToken = imageToken;
+        }
+    }
+
+    public BackgroundHelper() {
+        if (DEBUG && !ENABLED) Log.v(TAG, "BackgroundHelper: disabled");
+    }
+
+    class LoadBackgroundRunnable implements Runnable {
+        Request mRequest;
+
+        LoadBackgroundRunnable(Activity activity, Object imageToken) {
+            mRequest = new Request(activity, imageToken);
+        }
+
+        @Override
+        public void run() {
+            if (mTask != null) {
+                if (DEBUG) Log.v(TAG, "Cancelling task");
+                mTask.cancel(true);
+            }
+            if (DEBUG) Log.v(TAG, "Executing task");
+            mTask = new LoadBitmapTask();
+            mTask.execute(mRequest);
+            mRunnable = null;
+        }
+    };
+
+    class LoadBitmapTask extends AsyncTask<Request, Object, Request> {
+        @Override
+        protected Request doInBackground(Request... params) {
+            boolean cancelled = isCancelled();
+            if (DEBUG) Log.v(TAG, "doInBackground cancelled " + cancelled);
+            Request request = params[0];
+            if (!cancelled) {
+                request.mResult = loadBitmap(request.mActivity, request.mImageToken);
+            }
+            return request;
+        }
+
+        @Override
+        protected void onPostExecute(Request request) {
+            if (DEBUG) Log.v(TAG, "onPostExecute");
+            applyBackground(request.mActivity, request.mResult);
+            if (mTask == this) {
+                mTask = null;
+            }
+        }
+
+        @Override
+        protected void onCancelled(Request request) {
+            if (DEBUG) Log.v(TAG, "onCancelled");
+        }
+
+        private Bitmap loadBitmap(Activity activity, Object imageToken) {
+            if (imageToken instanceof Integer) {
+                final int resourceId = (Integer) imageToken;
+                if (DEBUG) Log.v(TAG, "load resourceId " + resourceId);
+                Drawable drawable = ContextCompat.getDrawable(activity, resourceId);
+                if (drawable instanceof BitmapDrawable) {
+                    return ((BitmapDrawable) drawable).getBitmap();
+                }
+            }
+            return null;
+        }
+
+        private void applyBackground(Activity activity, Bitmap bitmap) {
+            BackgroundManager backgroundManager = BackgroundManager.getInstance(activity);
+            if (backgroundManager == null || !backgroundManager.isAttached()) {
+                return;
+            }
+            backgroundManager.setBitmap(bitmap);
+        }
+    }
+
+    private LoadBackgroundRunnable mRunnable;
+    private LoadBitmapTask mTask;
+
+    // Allocate a dedicated handler because there may be no view available
+    // when setBackground is invoked.
+    private Handler mHandler = new Handler();
+
+    public void setBackground(Activity activity, Object imageToken) {
+        if (!ENABLED) {
+            return;
+        }
+        if (mRunnable != null) {
+            mHandler.removeCallbacks(mRunnable);
+        }
+        mRunnable = new LoadBackgroundRunnable(activity, imageToken);
+        mHandler.postDelayed(mRunnable, SET_BACKGROUND_DELAY_MS);
+    }
+
+    static public void attach(Activity activity) {
+        if (!ENABLED) {
+            return;
+        }
+        if (DEBUG) Log.v(TAG, "attach to activity " + activity);
+        BackgroundManager.getInstance(activity).attach(activity.getWindow());
+    }
+
+    static public void release(Activity activity) {
+        if (!ENABLED) {
+            return;
+        }
+        if (DEBUG) Log.v(TAG, "release from activity " + activity);
+        BackgroundManager.getInstance(activity).release();
+    }
+}
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseActivity.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseActivity.java
new file mode 100644
index 0000000..38f2fb8
--- /dev/null
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseActivity.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.example.android.leanback;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+public class BrowseActivity extends Activity {
+    /** Called when the activity is first created. */
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.browse);
+    }
+
+    @Override
+    public void onAttachedToWindow() {
+        super.onAttachedToWindow();
+        BackgroundHelper.attach(this);
+    }
+
+    @Override
+    public void onStop() {
+        BackgroundHelper.release(this);
+        super.onStop();
+    }
+}
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseAnimationActivity.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseAnimationActivity.java
new file mode 100644
index 0000000..42ce8a6
--- /dev/null
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseAnimationActivity.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.example.android.leanback;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+public class BrowseAnimationActivity extends Activity
+{
+    /** Called when the activity is first created. */
+    @Override
+    public void onCreate(Bundle savedInstanceState)
+    {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.browse_animation);
+    }
+}
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseAnimationFragment.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseAnimationFragment.java
new file mode 100644
index 0000000..6892c2c
--- /dev/null
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseAnimationFragment.java
@@ -0,0 +1,311 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.example.android.leanback;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.support.v17.leanback.widget.ArrayObjectAdapter;
+import android.support.v17.leanback.widget.HeaderItem;
+import android.support.v17.leanback.widget.ListRow;
+import android.support.v17.leanback.widget.ListRowPresenter;
+import android.support.v17.leanback.widget.OnItemViewClickedListener;
+import android.support.v17.leanback.widget.Presenter;
+import android.support.v17.leanback.widget.Row;
+import android.support.v17.leanback.widget.RowPresenter;
+import android.util.Log;
+import android.view.View;
+import android.os.Handler;
+
+import java.util.Random;
+
+public class BrowseAnimationFragment extends
+        android.support.v17.leanback.app.BrowseFragment {
+    private static final String TAG = "leanback.BrowseAnimationFragment";
+
+    private static final int NUM_ROWS = 10;
+    private ArrayObjectAdapter mRowsAdapter;
+    private static Random sRand = new Random();
+
+    static class Item {
+        final String mText;
+        final OnItemViewClickedListener mAction;
+
+        Item(String text, OnItemViewClickedListener action) {
+            mText = text;
+            mAction = action;
+        }
+
+        @Override
+        public String toString() {
+            return mText;
+        }
+    }
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        Log.i(TAG, "onCreate");
+        super.onCreate(savedInstanceState);
+
+        setBadgeDrawable(
+                getActivity().getResources().getDrawable(R.drawable.ic_title));
+        setTitle("Leanback Sample App");
+        setHeadersState(HEADERS_ENABLED);
+
+        setOnSearchClickedListener(new View.OnClickListener() {
+                @Override
+            public void onClick(View view) {
+                Intent intent = new Intent(getActivity(), SearchActivity.class);
+                startActivity(intent);
+            }
+        });
+
+        setupRows();
+        setOnItemViewClickedListener(new ItemViewClickedListener());
+    }
+
+    private void setupRows() {
+        ListRowPresenter lrp = new ListRowPresenter();
+        mRowsAdapter = new ArrayObjectAdapter(lrp);
+        for (int i = 0; i < NUM_ROWS; ++i) {
+            mRowsAdapter.add(
+                    createRandomRow(new HeaderItem(i, "Row " + i)));
+        }
+        setAdapter(mRowsAdapter);
+    }
+
+    Item createRandomItem() {
+        switch (sRand.nextInt(15)) {
+        default:
+        case 0:
+            return new Item("Remove Item before", new OnItemViewClickedListener() {
+                    @Override
+                public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
+                        RowPresenter.ViewHolder rowViewHolder, Row row) {
+                    ArrayObjectAdapter adapter = ((ArrayObjectAdapter) ((ListRow) row)
+                            .getAdapter());
+                    int index = adapter.indexOf(item);
+                    if (index >= 0) {
+                        if (index > 0)
+                            index--;
+                        adapter.removeItems(index, 1);
+                    }
+                }
+            });
+        case 1:
+            return new Item("Remove Item after", new OnItemViewClickedListener() {
+                    @Override
+                public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
+                        RowPresenter.ViewHolder rowViewHolder, Row row) {
+                    ArrayObjectAdapter adapter = ((ArrayObjectAdapter) ((ListRow) row)
+                            .getAdapter());
+                    int index = adapter.indexOf(item);
+                    if (index >= 0) {
+                        if (index < adapter.size() - 1)
+                            index++;
+                        adapter.removeItems(index, 1);
+                    }
+                }
+            });
+        case 2:
+            return new Item("Remove Item", new OnItemViewClickedListener() {
+                    @Override
+                public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
+                        RowPresenter.ViewHolder rowViewHolder, Row row) {
+                    ArrayObjectAdapter adapter = ((ArrayObjectAdapter) ((ListRow) row)
+                            .getAdapter());
+                    int index = adapter.indexOf(item);
+                    if (index >= 0) {
+                        adapter.removeItems(index, 1);
+                    }
+                }
+            });
+        case 3:
+            return new Item("Remove all Items", new OnItemViewClickedListener() {
+                    @Override
+                public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
+                        RowPresenter.ViewHolder rowViewHolder, Row row) {
+                    ArrayObjectAdapter adapter = ((ArrayObjectAdapter) ((ListRow) row)
+                            .getAdapter());
+                    adapter.clear();
+                }
+            });
+        case 4:
+            return new Item("add item before", new OnItemViewClickedListener() {
+                    @Override
+                public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
+                        RowPresenter.ViewHolder rowViewHolder, Row row) {
+                    ArrayObjectAdapter adapter = ((ArrayObjectAdapter) ((ListRow) row)
+                            .getAdapter());
+                    int index = adapter.indexOf(item);
+                    if (index >= 0) {
+                        adapter.add(index, createRandomItem());
+                    }
+                }
+            });
+        case 5:
+            return new Item("add item after", new OnItemViewClickedListener() {
+                    @Override
+                public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
+                        RowPresenter.ViewHolder rowViewHolder, Row row) {
+                    ArrayObjectAdapter adapter = ((ArrayObjectAdapter) ((ListRow) row)
+                            .getAdapter());
+                    int index = adapter.indexOf(item);
+                    if (index >= 0) {
+                        adapter.add(index + 1, createRandomItem());
+                    }
+                }
+            });
+        case 6:
+            return new Item("add random items before",
+                    new OnItemViewClickedListener() {
+                            @Override
+                        public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
+                                RowPresenter.ViewHolder rowViewHolder, Row row) {
+                            ArrayObjectAdapter adapter = ((ArrayObjectAdapter) ((ListRow) row)
+                                    .getAdapter());
+                            int index = adapter.indexOf(item);
+                            if (index >= 0) {
+                                int count = sRand.nextInt(4) + 1;
+                                for (int i = 0; i < count; i++) {
+                                    adapter.add(index + i, createRandomItem());
+                                }
+                            }
+                        }
+                    });
+        case 7:
+            return new Item("add random items after",
+                    new OnItemViewClickedListener() {
+                            @Override
+                        public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
+                                RowPresenter.ViewHolder rowViewHolder, Row row) {
+                            ArrayObjectAdapter adapter = ((ArrayObjectAdapter) ((ListRow) row)
+                                    .getAdapter());
+                            int index = adapter.indexOf(item);
+                            if (index >= 0) {
+                                int count = sRand.nextInt(4) + 1;
+                                for (int i = 0; i < count; i++) {
+                                    adapter.add(index + 1 + i,
+                                            createRandomItem());
+                                }
+                            }
+                        }
+                    });
+        case 8:
+            return new Item("add row before", new OnItemViewClickedListener() {
+                    @Override
+                public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
+                        RowPresenter.ViewHolder rowViewHolder, Row row) {
+                    int index = mRowsAdapter.indexOf(row);
+                    if (index >= 0) {
+                        int headerId = sRand.nextInt();
+                        mRowsAdapter.add(index, createRandomRow(new HeaderItem(
+                                headerId, "Row " + headerId)));
+                    }
+                }
+            });
+        case 9:
+            return new Item("add row after", new OnItemViewClickedListener() {
+                    @Override
+                public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
+                        RowPresenter.ViewHolder rowViewHolder, Row row) {
+                    int index = mRowsAdapter.indexOf(row);
+                    if (index >= 0) {
+                        int headerId = sRand.nextInt();
+                        mRowsAdapter.add(
+                                index + 1, createRandomRow(new HeaderItem(
+                                        headerId, "Row " + headerId)));
+                    }
+                }
+            });
+        case 10:
+            return new Item("delete row", new OnItemViewClickedListener() {
+                    @Override
+                public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
+                        RowPresenter.ViewHolder rowViewHolder, Row row) {
+                    mRowsAdapter.remove(row);
+                }
+            });
+        case 11:
+            return new Item("delete row before", new OnItemViewClickedListener() {
+                    @Override
+                public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
+                        RowPresenter.ViewHolder rowViewHolder, Row row) {
+                    int index = mRowsAdapter.indexOf(row);
+                    if (index > 0) {
+                        mRowsAdapter.removeItems(index - 1, 1);
+                    }
+                }
+            });
+        case 12:
+            return new Item("delete row after", new OnItemViewClickedListener() {
+                    @Override
+                public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
+                        RowPresenter.ViewHolder rowViewHolder, Row row) {
+                    int index = mRowsAdapter.indexOf(row);
+                    if (index < mRowsAdapter.size() - 1) {
+                        mRowsAdapter.removeItems(index + 1, 1);
+                    }
+                }
+            });
+        case 13:
+            return new Item("Replace Item before", new OnItemViewClickedListener() {
+                    @Override
+                public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
+                        RowPresenter.ViewHolder rowViewHolder, Row row) {
+                    ArrayObjectAdapter adapter = ((ArrayObjectAdapter) ((ListRow) row)
+                            .getAdapter());
+                    int index = adapter.indexOf(item);
+                    if (index >= 0) {
+                        if (index > 0)
+                            index--;
+                        adapter.replace(index, createRandomItem());
+                    }
+                }
+            });
+        case 14:
+            return new Item("Remove all then re-add", new OnItemViewClickedListener() {
+                    @Override
+                public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
+                        RowPresenter.ViewHolder rowViewHolder, Row row) {
+                    final ArrayObjectAdapter adapter = ((ArrayObjectAdapter) ((ListRow) row)
+                            .getAdapter());
+                   adapter.clear();
+                   new Handler().postDelayed(new Runnable() {
+                       @Override
+                       public void run() {
+                           adapter.add(0, createRandomItem());
+                       }
+                   }, 1000);
+                }
+            });
+        }
+    }
+
+    ListRow createRandomRow(HeaderItem header) {
+        ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(
+                new StringPresenter());
+        for (int i = 0; i < 8; i++) {
+            listRowAdapter.add(createRandomItem());
+        }
+        return new ListRow(header, listRowAdapter);
+    }
+
+    private final class ItemViewClickedListener implements OnItemViewClickedListener {
+        @Override
+        public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
+                RowPresenter.ViewHolder rowViewHolder, Row row) {
+            ((Item) item).mAction.onItemClicked(itemViewHolder, item, rowViewHolder, row);
+        }
+    }
+}
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseErrorActivity.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseErrorActivity.java
new file mode 100644
index 0000000..43f726e
--- /dev/null
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseErrorActivity.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.example.android.leanback;
+
+import android.app.Activity;
+import android.app.Fragment;
+import android.os.Bundle;
+import android.os.Handler;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.FrameLayout;
+import android.widget.ProgressBar;
+
+public class BrowseErrorActivity extends Activity
+{
+    private ErrorFragment mErrorFragment;
+    private SpinnerFragment mSpinnerFragment;
+
+    /** Called when the activity is first created. */
+    @Override
+    public void onCreate(Bundle savedInstanceState)
+    {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.browse);
+
+        testError();
+    }
+
+    @Override
+    public void onAttachedToWindow() {
+        super.onAttachedToWindow();
+        BackgroundHelper.attach(this);
+    }
+
+    @Override
+    public void onStop() {
+        BackgroundHelper.release(this);
+        super.onStop();
+    }
+
+    private void testError() {
+        mErrorFragment = new ErrorFragment();
+        getFragmentManager().beginTransaction().add(R.id.main_frame, mErrorFragment).commit();
+
+        mSpinnerFragment = new SpinnerFragment();
+        getFragmentManager().beginTransaction().add(R.id.main_frame, mSpinnerFragment).commit();
+
+        Handler handler = new Handler();
+        handler.postDelayed(new Runnable() {
+            @Override
+            public void run() {
+                if (getFragmentManager().isDestroyed()) {
+                    return;
+                }
+                getFragmentManager().beginTransaction().remove(mSpinnerFragment).commit();
+                mErrorFragment.setErrorContent(getResources());
+            }
+        }, 3000);
+    }
+
+    static public class SpinnerFragment extends Fragment {
+        @Override
+        public View onCreateView(LayoutInflater inflater, ViewGroup container,
+                    Bundle savedInstanceState) {
+            ProgressBar progressBar = new ProgressBar(container.getContext());
+            if (container instanceof FrameLayout) {
+                FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(100, 100, Gravity.CENTER);
+                progressBar.setLayoutParams(layoutParams);
+            }
+            return progressBar;
+        }
+    }
+}
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseErrorSupportActivity.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseErrorSupportActivity.java
new file mode 100644
index 0000000..f1e7b1e
--- /dev/null
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseErrorSupportActivity.java
@@ -0,0 +1,88 @@
+/* This file is auto-generated from BrowseErrorActivity.java.  DO NOT MODIFY. */
+
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.example.android.leanback;
+
+import android.support.v4.app.FragmentActivity;
+import android.support.v4.app.Fragment;
+import android.os.Bundle;
+import android.os.Handler;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.FrameLayout;
+import android.widget.ProgressBar;
+
+public class BrowseErrorSupportActivity extends FragmentActivity
+{
+    private ErrorSupportFragment mErrorSupportFragment;
+    private SpinnerSupportFragment mSpinnerSupportFragment;
+
+    /** Called when the activity is first created. */
+    @Override
+    public void onCreate(Bundle savedInstanceState)
+    {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.browse_support);
+
+        testError();
+    }
+
+    @Override
+    public void onAttachedToWindow() {
+        super.onAttachedToWindow();
+        BackgroundHelper.attach(this);
+    }
+
+    @Override
+    public void onStop() {
+        BackgroundHelper.release(this);
+        super.onStop();
+    }
+
+    private void testError() {
+        mErrorSupportFragment = new ErrorSupportFragment();
+        getSupportFragmentManager().beginTransaction().add(R.id.main_frame, mErrorSupportFragment).commit();
+
+        mSpinnerSupportFragment = new SpinnerSupportFragment();
+        getSupportFragmentManager().beginTransaction().add(R.id.main_frame, mSpinnerSupportFragment).commit();
+
+        Handler handler = new Handler();
+        handler.postDelayed(new Runnable() {
+            @Override
+            public void run() {
+                if (getSupportFragmentManager().isDestroyed()) {
+                    return;
+                }
+                getSupportFragmentManager().beginTransaction().remove(mSpinnerSupportFragment).commit();
+                mErrorSupportFragment.setErrorContent(getResources());
+            }
+        }, 3000);
+    }
+
+    static public class SpinnerSupportFragment extends Fragment {
+        @Override
+        public View onCreateView(LayoutInflater inflater, ViewGroup container,
+                    Bundle savedInstanceState) {
+            ProgressBar progressBar = new ProgressBar(container.getContext());
+            if (container instanceof FrameLayout) {
+                FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(100, 100, Gravity.CENTER);
+                progressBar.setLayoutParams(layoutParams);
+            }
+            return progressBar;
+        }
+    }
+}
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseFragment.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseFragment.java
new file mode 100644
index 0000000..802c4d3
--- /dev/null
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseFragment.java
@@ -0,0 +1,395 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.example.android.leanback;
+
+import android.app.Fragment;
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.Handler;
+import android.support.v17.leanback.app.GuidedStepFragment;
+import android.support.v17.leanback.app.RowsFragment;
+import android.support.v17.leanback.widget.ArrayObjectAdapter;
+import android.support.v17.leanback.widget.DividerRow;
+import android.support.v17.leanback.widget.HeaderItem;
+import android.support.v17.leanback.widget.ImageCardView;
+import android.support.v17.leanback.widget.ListRow;
+import android.support.v17.leanback.widget.ListRowPresenter;
+import android.support.v17.leanback.widget.OnItemViewClickedListener;
+import android.support.v17.leanback.widget.OnItemViewSelectedListener;
+import android.support.v17.leanback.widget.PageRow;
+import android.support.v17.leanback.widget.Presenter;
+import android.support.v17.leanback.widget.Row;
+import android.support.v17.leanback.widget.RowPresenter;
+import android.support.v17.leanback.widget.SectionRow;
+import android.support.v4.app.ActivityOptionsCompat;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+public class BrowseFragment extends android.support.v17.leanback.app.BrowseFragment {
+    private static final String TAG = "leanback.BrowseFragment";
+
+    private static final boolean TEST_ENTRANCE_TRANSITION = true;
+    private static final int NUM_ROWS = 8;
+    private static final long HEADER_ID1 = 1001;
+    private static final long HEADER_ID2 = 1002;
+    private static final long HEADER_ID3 = 1003;
+
+    private ArrayObjectAdapter mRowsAdapter;
+    private BackgroundHelper mBackgroundHelper = new BackgroundHelper();
+
+    // For good performance, it's important to use a single instance of
+    // a card presenter for all rows using that presenter.
+    final CardPresenter mCardPresenter = new CardPresenter();
+    final CardPresenter mCardPresenter2 = new CardPresenter(R.style.MyImageCardViewTheme);
+
+    public BrowseFragment() {
+        getMainFragmentRegistry().registerFragment(PageRow.class, new PageRowFragmentFactory());
+    }
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        Log.i(TAG, "onCreate");
+        super.onCreate(savedInstanceState);
+
+        setBadgeDrawable(getActivity().getResources().getDrawable(R.drawable.ic_title));
+        setTitle("Leanback Sample App");
+        setHeadersState(HEADERS_ENABLED);
+        setupRows();
+        setOnSearchClickedListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                Intent intent = new Intent(getActivity(), SearchActivity.class);
+                startActivity(intent);
+            }
+        });
+
+        setOnItemViewClickedListener(new ItemViewClickedListener());
+        setOnItemViewSelectedListener(new OnItemViewSelectedListener() {
+            @Override
+            public void onItemSelected(Presenter.ViewHolder itemViewHolder, Object item,
+                    RowPresenter.ViewHolder rowViewHolder, Row row) {
+                Log.i(TAG, "onItemSelected: " + item + " row " + row);
+
+                if (isShowingHeaders()) {
+                    mBackgroundHelper.setBackground(getActivity(), null);
+                } else if (item instanceof PhotoItem) {
+                    mBackgroundHelper.setBackground(
+                            getActivity(), ((PhotoItem) item).getImageResourceId());
+                }
+            }
+        });
+        if (TEST_ENTRANCE_TRANSITION) {
+            // don't run entrance transition if fragment is restored.
+            if (savedInstanceState == null) {
+                prepareEntranceTransition();
+            }
+        }
+
+        // simulates in a real world use case  data being loaded two seconds later
+        new Handler().postDelayed(new Runnable() {
+            public void run() {
+                loadData();
+                startEntranceTransition();
+            }
+        }, 2000);
+    }
+
+    @Override
+    public View onCreateView(
+            LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+        return super.onCreateView(inflater, container, savedInstanceState);
+    }
+
+    private void setupRows() {
+        ListRowPresenter listRowPresenter = new ListRowPresenter();
+        listRowPresenter.setNumRows(2);
+        mRowsAdapter = new ArrayObjectAdapter(listRowPresenter);
+        setAdapter(mRowsAdapter);
+    }
+
+    private void loadData() {
+        int i = 0;
+
+        mRowsAdapter.add(new PageRow(new HeaderItem(HEADER_ID1, "Page Row 0")));
+        mRowsAdapter.add(new DividerRow());
+
+        mRowsAdapter.add(new SectionRow(new HeaderItem("section 0")));
+        for (; i < NUM_ROWS; ++i) {
+            mRowsAdapter.add(new ListRow(new HeaderItem(i, "Row " + i), createListRowAdapter(i)));
+        }
+
+        mRowsAdapter.add(new DividerRow());
+        mRowsAdapter.add(new PageRow(new HeaderItem(HEADER_ID2, "Page Row 1")));
+
+        mRowsAdapter.add(new PageRow(new HeaderItem(HEADER_ID3, "Page Row 2")));
+    }
+
+    private ArrayObjectAdapter createListRowAdapter(int i) {
+        ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter((i & 1) == 0 ?
+                mCardPresenter : mCardPresenter2);
+        listRowAdapter.add(new PhotoItem(
+                "Hello world",
+                R.drawable.gallery_photo_1));
+        listRowAdapter.add(new PhotoItem(
+                "This is a test",
+                "Only a test",
+                R.drawable.gallery_photo_2));
+        listRowAdapter.add(new PhotoItem(
+                "Android TV",
+                "by Google",
+                R.drawable.gallery_photo_3));
+        listRowAdapter.add(new PhotoItem(
+                "Leanback",
+                R.drawable.gallery_photo_4));
+        listRowAdapter.add(new PhotoItem(
+                "GuidedStep (Slide left/right)",
+                R.drawable.gallery_photo_5));
+        listRowAdapter.add(new PhotoItem(
+                "GuidedStep (Slide bottom up)",
+                "Open GuidedStepFragment",
+                R.drawable.gallery_photo_6));
+        listRowAdapter.add(new PhotoItem(
+                "Android TV",
+                "open RowsActivity",
+                R.drawable.gallery_photo_7));
+        listRowAdapter.add(new PhotoItem(
+                "Leanback",
+                "open BrowseActivity",
+                R.drawable.gallery_photo_8));
+        listRowAdapter.add(new PhotoItem(
+                "Hello world",
+                R.drawable.gallery_photo_1));
+        listRowAdapter.add(new PhotoItem(
+                "This is a test",
+                "Only a test",
+                R.drawable.gallery_photo_2));
+        listRowAdapter.add(new PhotoItem(
+                "Android TV",
+                "by Google",
+                R.drawable.gallery_photo_3));
+        listRowAdapter.add(new PhotoItem(
+                "Leanback",
+                R.drawable.gallery_photo_4));
+        return listRowAdapter;
+    }
+
+    private final class ItemViewClickedListener implements OnItemViewClickedListener {
+        @Override
+        public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
+                RowPresenter.ViewHolder rowViewHolder, Row row) {
+
+            Intent intent;
+            Bundle bundle;
+            if (((PhotoItem) item).getImageResourceId() == R.drawable.gallery_photo_6) {
+                GuidedStepFragment.add(getFragmentManager(),
+                        new GuidedStepHalfScreenActivity.FirstStepFragment(),
+                        R.id.lb_guidedstep_host);
+                return;
+            } else if (((PhotoItem) item).getImageResourceId() == R.drawable.gallery_photo_5) {
+                GuidedStepFragment.add(getFragmentManager(),
+                        new GuidedStepActivity.FirstStepFragment(), R.id.lb_guidedstep_host);
+                return;
+            } else if (((PhotoItem) item).getImageResourceId() == R.drawable.gallery_photo_8) {
+                intent = new Intent(getActivity(), BrowseActivity.class);
+                bundle = ActivityOptionsCompat.makeSceneTransitionAnimation(getActivity())
+                        .toBundle();
+            } else if (((PhotoItem) item).getImageResourceId() == R.drawable.gallery_photo_7) {
+                intent = new Intent(getActivity(), RowsActivity.class);
+                bundle = ActivityOptionsCompat.makeSceneTransitionAnimation(getActivity())
+                        .toBundle();
+            } else {
+                intent = new Intent(getActivity(), DetailsActivity.class);
+                intent.putExtra(DetailsActivity.EXTRA_ITEM, (PhotoItem) item);
+                bundle = ActivityOptionsCompat.makeSceneTransitionAnimation(
+                        getActivity(),
+                        ((ImageCardView) itemViewHolder.view).getMainImageView(),
+                        DetailsActivity.SHARED_ELEMENT_NAME).toBundle();
+            }
+            getActivity().startActivity(intent, bundle);
+        }
+    }
+
+    public static class PageRowFragmentFactory extends FragmentFactory {
+
+        @Override
+        public Fragment createFragment(Object rowObj) {
+            Row row = (Row) rowObj;
+            if (row.getHeaderItem().getId() == HEADER_ID1) {
+                return new SampleRowsFragment();
+            } else if (row.getHeaderItem().getId() == HEADER_ID2) {
+                return new SampleRowsFragment();
+            } else if (row.getHeaderItem().getId() == HEADER_ID3) {
+                return new SampleFragment();
+            }
+
+            return null;
+        }
+    }
+
+    public static class SampleRowsFragment extends RowsFragment {
+        final CardPresenter mCardPresenter = new CardPresenter();
+        final CardPresenter mCardPresenter2 = new CardPresenter(R.style.MyImageCardViewTheme);
+
+        void loadFragmentData() {
+            ArrayObjectAdapter adapter = (ArrayObjectAdapter) getAdapter();
+            for (int i = 0; i < 4; i++) {
+                ListRow row = new ListRow(new HeaderItem("Row " + i), createListRowAdapter(i));
+                adapter.add(row);
+            }
+            if (getMainFragmentAdapter() != null) {
+                getMainFragmentAdapter().getFragmentHost()
+                        .notifyDataReady(getMainFragmentAdapter());
+            }
+        }
+
+        public SampleRowsFragment() {
+            ArrayObjectAdapter adapter = new ArrayObjectAdapter(new ListRowPresenter());
+            setAdapter(adapter);
+            // simulates late data loading:
+            new Handler().postDelayed(new Runnable() {
+                public void run() {
+                    loadFragmentData();
+                }
+            }, 500);
+
+            setOnItemViewClickedListener(new OnItemViewClickedListener() {
+                @Override
+                public void onItemClicked(
+                        Presenter.ViewHolder itemViewHolder,
+                        Object item,
+                        RowPresenter.ViewHolder rowViewHolder,
+                        Row row) {
+                    Intent intent;
+                    Bundle bundle;
+                    if (((PhotoItem) item).getImageResourceId() == R.drawable.gallery_photo_6) {
+                        GuidedStepFragment.add(getActivity().getFragmentManager(),
+                                new GuidedStepHalfScreenActivity.FirstStepFragment(),
+                                R.id.lb_guidedstep_host);
+                        return;
+                    } else if (((PhotoItem) item).getImageResourceId() == R.drawable.gallery_photo_5) {
+                        GuidedStepFragment.add(getActivity().getFragmentManager(),
+                                new GuidedStepActivity.FirstStepFragment(), R.id.lb_guidedstep_host);
+                        return;
+                    } else if (((PhotoItem) item).getImageResourceId() == R.drawable.gallery_photo_8) {
+                        intent = new Intent(getActivity(), BrowseActivity.class);
+                        bundle = ActivityOptionsCompat.makeSceneTransitionAnimation(getActivity())
+                                .toBundle();
+                    } else if (((PhotoItem) item).getImageResourceId() == R.drawable.gallery_photo_7) {
+                        intent = new Intent(getActivity(), RowsActivity.class);
+                        bundle = ActivityOptionsCompat.makeSceneTransitionAnimation(getActivity())
+                                .toBundle();
+                    } else {
+                        intent = new Intent(getActivity(), DetailsActivity.class);
+                        intent.putExtra(DetailsActivity.EXTRA_ITEM, (PhotoItem) item);
+                        bundle = ActivityOptionsCompat.makeSceneTransitionAnimation(
+                                getActivity(),
+                                ((ImageCardView) itemViewHolder.view).getMainImageView(),
+                                DetailsActivity.SHARED_ELEMENT_NAME).toBundle();
+                    }
+                    getActivity().startActivity(intent, bundle);
+                }
+            });
+        }
+
+        private ArrayObjectAdapter createListRowAdapter(int i) {
+            ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter((i & 1) == 0 ?
+                    mCardPresenter : mCardPresenter2);
+            listRowAdapter.add(new PhotoItem(
+                    "Hello world",
+                    R.drawable.gallery_photo_1));
+            listRowAdapter.add(new PhotoItem(
+                    "This is a test",
+                    "Only a test",
+                    R.drawable.gallery_photo_2));
+            listRowAdapter.add(new PhotoItem(
+                    "Android TV",
+                    "by Google",
+                    R.drawable.gallery_photo_3));
+            listRowAdapter.add(new PhotoItem(
+                    "Leanback",
+                    R.drawable.gallery_photo_4));
+            listRowAdapter.add(new PhotoItem(
+                    "GuidedStep (Slide left/right)",
+                    R.drawable.gallery_photo_5));
+            listRowAdapter.add(new PhotoItem(
+                    "GuidedStep (Slide bottom up)",
+                    "Open GuidedStepFragment",
+                    R.drawable.gallery_photo_6));
+            listRowAdapter.add(new PhotoItem(
+                    "Android TV",
+                    "open RowsActivity",
+                    R.drawable.gallery_photo_7));
+            listRowAdapter.add(new PhotoItem(
+                    "Leanback",
+                    "open BrowseActivity",
+                    R.drawable.gallery_photo_8));
+            return listRowAdapter;
+        }
+    }
+
+    public static class PageFragmentAdapterImpl extends MainFragmentAdapter<SampleFragment> {
+
+        public PageFragmentAdapterImpl(SampleFragment fragment) {
+            super(fragment);
+            setScalingEnabled(true);
+        }
+
+        @Override
+        public void setEntranceTransitionState(boolean state) {
+            getFragment().setEntranceTransitionState(state);
+        }
+    }
+
+    public static class SampleFragment extends Fragment implements MainFragmentAdapterProvider {
+
+        final PageFragmentAdapterImpl mMainFragmentAdapter = new PageFragmentAdapterImpl(this);
+
+        public void setEntranceTransitionState(boolean state) {
+            final View view = getView();
+            int visibility = state ? View.VISIBLE : View.INVISIBLE;
+            view.findViewById(R.id.tv1).setVisibility(visibility);
+            view.findViewById(R.id.tv2).setVisibility(visibility);
+            view.findViewById(R.id.tv3).setVisibility(visibility);
+        }
+
+        @Override
+        public View onCreateView(
+                final LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+            View view = inflater.inflate(R.layout.page_fragment, container, false);
+            view.findViewById(R.id.tv1).setOnClickListener(new View.OnClickListener() {
+                @Override
+                public void onClick(View view) {
+                    Intent intent = new Intent(inflater.getContext(), GuidedStepActivity.class);
+                    startActivity(intent);
+                }
+            });
+
+            return view;
+        }
+
+        @Override
+        public void onViewCreated(View view, Bundle savedInstanceState) {
+            // static layout has view and data ready immediately
+            mMainFragmentAdapter.getFragmentHost().notifyViewCreated(mMainFragmentAdapter);
+            mMainFragmentAdapter.getFragmentHost().notifyDataReady(mMainFragmentAdapter);
+        }
+
+        @Override
+        public MainFragmentAdapter getMainFragmentAdapter() {
+            return mMainFragmentAdapter;
+        }
+    }
+}
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseSupportActivity.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseSupportActivity.java
new file mode 100644
index 0000000..0bafcc2
--- /dev/null
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseSupportActivity.java
@@ -0,0 +1,40 @@
+/* This file is auto-generated from BrowseActivity.java.  DO NOT MODIFY. */
+
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.example.android.leanback;
+
+import android.support.v4.app.FragmentActivity;
+import android.os.Bundle;
+
+public class BrowseSupportActivity extends FragmentActivity {
+    /** Called when the activity is first created. */
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.browse_support);
+    }
+
+    @Override
+    public void onAttachedToWindow() {
+        super.onAttachedToWindow();
+        BackgroundHelper.attach(this);
+    }
+
+    @Override
+    public void onStop() {
+        BackgroundHelper.release(this);
+        super.onStop();
+    }
+}
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseSupportFragment.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseSupportFragment.java
new file mode 100644
index 0000000..48c1462
--- /dev/null
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/BrowseSupportFragment.java
@@ -0,0 +1,397 @@
+/* This file is auto-generated from BrowseFragment.java.  DO NOT MODIFY. */
+
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.example.android.leanback;
+
+import android.support.v4.app.Fragment;
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.Handler;
+import android.support.v17.leanback.app.GuidedStepSupportFragment;
+import android.support.v17.leanback.app.RowsSupportFragment;
+import android.support.v17.leanback.widget.ArrayObjectAdapter;
+import android.support.v17.leanback.widget.DividerRow;
+import android.support.v17.leanback.widget.HeaderItem;
+import android.support.v17.leanback.widget.ImageCardView;
+import android.support.v17.leanback.widget.ListRow;
+import android.support.v17.leanback.widget.ListRowPresenter;
+import android.support.v17.leanback.widget.OnItemViewClickedListener;
+import android.support.v17.leanback.widget.OnItemViewSelectedListener;
+import android.support.v17.leanback.widget.PageRow;
+import android.support.v17.leanback.widget.Presenter;
+import android.support.v17.leanback.widget.Row;
+import android.support.v17.leanback.widget.RowPresenter;
+import android.support.v17.leanback.widget.SectionRow;
+import android.support.v4.app.ActivityOptionsCompat;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+public class BrowseSupportFragment extends android.support.v17.leanback.app.BrowseSupportFragment {
+    private static final String TAG = "leanback.BrowseSupportFragment";
+
+    private static final boolean TEST_ENTRANCE_TRANSITION = true;
+    private static final int NUM_ROWS = 8;
+    private static final long HEADER_ID1 = 1001;
+    private static final long HEADER_ID2 = 1002;
+    private static final long HEADER_ID3 = 1003;
+
+    private ArrayObjectAdapter mRowsAdapter;
+    private BackgroundHelper mBackgroundHelper = new BackgroundHelper();
+
+    // For good performance, it's important to use a single instance of
+    // a card presenter for all rows using that presenter.
+    final CardPresenter mCardPresenter = new CardPresenter();
+    final CardPresenter mCardPresenter2 = new CardPresenter(R.style.MyImageCardViewTheme);
+
+    public BrowseSupportFragment() {
+        getMainFragmentRegistry().registerFragment(PageRow.class, new PageRowFragmentFactory());
+    }
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        Log.i(TAG, "onCreate");
+        super.onCreate(savedInstanceState);
+
+        setBadgeDrawable(getActivity().getResources().getDrawable(R.drawable.ic_title));
+        setTitle("Leanback Sample App");
+        setHeadersState(HEADERS_ENABLED);
+        setupRows();
+        setOnSearchClickedListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                Intent intent = new Intent(getActivity(), SearchSupportActivity.class);
+                startActivity(intent);
+            }
+        });
+
+        setOnItemViewClickedListener(new ItemViewClickedListener());
+        setOnItemViewSelectedListener(new OnItemViewSelectedListener() {
+            @Override
+            public void onItemSelected(Presenter.ViewHolder itemViewHolder, Object item,
+                    RowPresenter.ViewHolder rowViewHolder, Row row) {
+                Log.i(TAG, "onItemSelected: " + item + " row " + row);
+
+                if (isShowingHeaders()) {
+                    mBackgroundHelper.setBackground(getActivity(), null);
+                } else if (item instanceof PhotoItem) {
+                    mBackgroundHelper.setBackground(
+                            getActivity(), ((PhotoItem) item).getImageResourceId());
+                }
+            }
+        });
+        if (TEST_ENTRANCE_TRANSITION) {
+            // don't run entrance transition if fragment is restored.
+            if (savedInstanceState == null) {
+                prepareEntranceTransition();
+            }
+        }
+
+        // simulates in a real world use case  data being loaded two seconds later
+        new Handler().postDelayed(new Runnable() {
+            public void run() {
+                loadData();
+                startEntranceTransition();
+            }
+        }, 2000);
+    }
+
+    @Override
+    public View onCreateView(
+            LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+        return super.onCreateView(inflater, container, savedInstanceState);
+    }
+
+    private void setupRows() {
+        ListRowPresenter listRowPresenter = new ListRowPresenter();
+        listRowPresenter.setNumRows(2);
+        mRowsAdapter = new ArrayObjectAdapter(listRowPresenter);
+        setAdapter(mRowsAdapter);
+    }
+
+    private void loadData() {
+        int i = 0;
+
+        mRowsAdapter.add(new PageRow(new HeaderItem(HEADER_ID1, "Page Row 0")));
+        mRowsAdapter.add(new DividerRow());
+
+        mRowsAdapter.add(new SectionRow(new HeaderItem("section 0")));
+        for (; i < NUM_ROWS; ++i) {
+            mRowsAdapter.add(new ListRow(new HeaderItem(i, "Row " + i), createListRowAdapter(i)));
+        }
+
+        mRowsAdapter.add(new DividerRow());
+        mRowsAdapter.add(new PageRow(new HeaderItem(HEADER_ID2, "Page Row 1")));
+
+        mRowsAdapter.add(new PageRow(new HeaderItem(HEADER_ID3, "Page Row 2")));
+    }
+
+    private ArrayObjectAdapter createListRowAdapter(int i) {
+        ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter((i & 1) == 0 ?
+                mCardPresenter : mCardPresenter2);
+        listRowAdapter.add(new PhotoItem(
+                "Hello world",
+                R.drawable.gallery_photo_1));
+        listRowAdapter.add(new PhotoItem(
+                "This is a test",
+                "Only a test",
+                R.drawable.gallery_photo_2));
+        listRowAdapter.add(new PhotoItem(
+                "Android TV",
+                "by Google",
+                R.drawable.gallery_photo_3));
+        listRowAdapter.add(new PhotoItem(
+                "Leanback",
+                R.drawable.gallery_photo_4));
+        listRowAdapter.add(new PhotoItem(
+                "GuidedStep (Slide left/right)",
+                R.drawable.gallery_photo_5));
+        listRowAdapter.add(new PhotoItem(
+                "GuidedStep (Slide bottom up)",
+                "Open GuidedStepSupportFragment",
+                R.drawable.gallery_photo_6));
+        listRowAdapter.add(new PhotoItem(
+                "Android TV",
+                "open RowsSupportActivity",
+                R.drawable.gallery_photo_7));
+        listRowAdapter.add(new PhotoItem(
+                "Leanback",
+                "open BrowseSupportActivity",
+                R.drawable.gallery_photo_8));
+        listRowAdapter.add(new PhotoItem(
+                "Hello world",
+                R.drawable.gallery_photo_1));
+        listRowAdapter.add(new PhotoItem(
+                "This is a test",
+                "Only a test",
+                R.drawable.gallery_photo_2));
+        listRowAdapter.add(new PhotoItem(
+                "Android TV",
+                "by Google",
+                R.drawable.gallery_photo_3));
+        listRowAdapter.add(new PhotoItem(
+                "Leanback",
+                R.drawable.gallery_photo_4));
+        return listRowAdapter;
+    }
+
+    private final class ItemViewClickedListener implements OnItemViewClickedListener {
+        @Override
+        public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
+                RowPresenter.ViewHolder rowViewHolder, Row row) {
+
+            Intent intent;
+            Bundle bundle;
+            if (((PhotoItem) item).getImageResourceId() == R.drawable.gallery_photo_6) {
+                GuidedStepSupportFragment.add(getFragmentManager(),
+                        new GuidedStepSupportHalfScreenActivity.FirstStepFragment(),
+                        R.id.lb_guidedstep_host);
+                return;
+            } else if (((PhotoItem) item).getImageResourceId() == R.drawable.gallery_photo_5) {
+                GuidedStepSupportFragment.add(getFragmentManager(),
+                        new GuidedStepSupportActivity.FirstStepFragment(), R.id.lb_guidedstep_host);
+                return;
+            } else if (((PhotoItem) item).getImageResourceId() == R.drawable.gallery_photo_8) {
+                intent = new Intent(getActivity(), BrowseSupportActivity.class);
+                bundle = ActivityOptionsCompat.makeSceneTransitionAnimation(getActivity())
+                        .toBundle();
+            } else if (((PhotoItem) item).getImageResourceId() == R.drawable.gallery_photo_7) {
+                intent = new Intent(getActivity(), RowsSupportActivity.class);
+                bundle = ActivityOptionsCompat.makeSceneTransitionAnimation(getActivity())
+                        .toBundle();
+            } else {
+                intent = new Intent(getActivity(), DetailsSupportActivity.class);
+                intent.putExtra(DetailsSupportActivity.EXTRA_ITEM, (PhotoItem) item);
+                bundle = ActivityOptionsCompat.makeSceneTransitionAnimation(
+                        getActivity(),
+                        ((ImageCardView) itemViewHolder.view).getMainImageView(),
+                        DetailsSupportActivity.SHARED_ELEMENT_NAME).toBundle();
+            }
+            getActivity().startActivity(intent, bundle);
+        }
+    }
+
+    public static class PageRowFragmentFactory extends FragmentFactory {
+
+        @Override
+        public Fragment createFragment(Object rowObj) {
+            Row row = (Row) rowObj;
+            if (row.getHeaderItem().getId() == HEADER_ID1) {
+                return new SampleRowsSupportFragment();
+            } else if (row.getHeaderItem().getId() == HEADER_ID2) {
+                return new SampleRowsSupportFragment();
+            } else if (row.getHeaderItem().getId() == HEADER_ID3) {
+                return new SampleFragment();
+            }
+
+            return null;
+        }
+    }
+
+    public static class SampleRowsSupportFragment extends RowsSupportFragment {
+        final CardPresenter mCardPresenter = new CardPresenter();
+        final CardPresenter mCardPresenter2 = new CardPresenter(R.style.MyImageCardViewTheme);
+
+        void loadFragmentData() {
+            ArrayObjectAdapter adapter = (ArrayObjectAdapter) getAdapter();
+            for (int i = 0; i < 4; i++) {
+                ListRow row = new ListRow(new HeaderItem("Row " + i), createListRowAdapter(i));
+                adapter.add(row);
+            }
+            if (getMainFragmentAdapter() != null) {
+                getMainFragmentAdapter().getFragmentHost()
+                        .notifyDataReady(getMainFragmentAdapter());
+            }
+        }
+
+        public SampleRowsSupportFragment() {
+            ArrayObjectAdapter adapter = new ArrayObjectAdapter(new ListRowPresenter());
+            setAdapter(adapter);
+            // simulates late data loading:
+            new Handler().postDelayed(new Runnable() {
+                public void run() {
+                    loadFragmentData();
+                }
+            }, 500);
+
+            setOnItemViewClickedListener(new OnItemViewClickedListener() {
+                @Override
+                public void onItemClicked(
+                        Presenter.ViewHolder itemViewHolder,
+                        Object item,
+                        RowPresenter.ViewHolder rowViewHolder,
+                        Row row) {
+                    Intent intent;
+                    Bundle bundle;
+                    if (((PhotoItem) item).getImageResourceId() == R.drawable.gallery_photo_6) {
+                        GuidedStepSupportFragment.add(getActivity().getSupportFragmentManager(),
+                                new GuidedStepSupportHalfScreenActivity.FirstStepFragment(),
+                                R.id.lb_guidedstep_host);
+                        return;
+                    } else if (((PhotoItem) item).getImageResourceId() == R.drawable.gallery_photo_5) {
+                        GuidedStepSupportFragment.add(getActivity().getSupportFragmentManager(),
+                                new GuidedStepSupportActivity.FirstStepFragment(), R.id.lb_guidedstep_host);
+                        return;
+                    } else if (((PhotoItem) item).getImageResourceId() == R.drawable.gallery_photo_8) {
+                        intent = new Intent(getActivity(), BrowseSupportActivity.class);
+                        bundle = ActivityOptionsCompat.makeSceneTransitionAnimation(getActivity())
+                                .toBundle();
+                    } else if (((PhotoItem) item).getImageResourceId() == R.drawable.gallery_photo_7) {
+                        intent = new Intent(getActivity(), RowsSupportActivity.class);
+                        bundle = ActivityOptionsCompat.makeSceneTransitionAnimation(getActivity())
+                                .toBundle();
+                    } else {
+                        intent = new Intent(getActivity(), DetailsSupportActivity.class);
+                        intent.putExtra(DetailsSupportActivity.EXTRA_ITEM, (PhotoItem) item);
+                        bundle = ActivityOptionsCompat.makeSceneTransitionAnimation(
+                                getActivity(),
+                                ((ImageCardView) itemViewHolder.view).getMainImageView(),
+                                DetailsSupportActivity.SHARED_ELEMENT_NAME).toBundle();
+                    }
+                    getActivity().startActivity(intent, bundle);
+                }
+            });
+        }
+
+        private ArrayObjectAdapter createListRowAdapter(int i) {
+            ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter((i & 1) == 0 ?
+                    mCardPresenter : mCardPresenter2);
+            listRowAdapter.add(new PhotoItem(
+                    "Hello world",
+                    R.drawable.gallery_photo_1));
+            listRowAdapter.add(new PhotoItem(
+                    "This is a test",
+                    "Only a test",
+                    R.drawable.gallery_photo_2));
+            listRowAdapter.add(new PhotoItem(
+                    "Android TV",
+                    "by Google",
+                    R.drawable.gallery_photo_3));
+            listRowAdapter.add(new PhotoItem(
+                    "Leanback",
+                    R.drawable.gallery_photo_4));
+            listRowAdapter.add(new PhotoItem(
+                    "GuidedStep (Slide left/right)",
+                    R.drawable.gallery_photo_5));
+            listRowAdapter.add(new PhotoItem(
+                    "GuidedStep (Slide bottom up)",
+                    "Open GuidedStepSupportFragment",
+                    R.drawable.gallery_photo_6));
+            listRowAdapter.add(new PhotoItem(
+                    "Android TV",
+                    "open RowsSupportActivity",
+                    R.drawable.gallery_photo_7));
+            listRowAdapter.add(new PhotoItem(
+                    "Leanback",
+                    "open BrowseSupportActivity",
+                    R.drawable.gallery_photo_8));
+            return listRowAdapter;
+        }
+    }
+
+    public static class PageFragmentAdapterImpl extends MainFragmentAdapter<SampleFragment> {
+
+        public PageFragmentAdapterImpl(SampleFragment fragment) {
+            super(fragment);
+            setScalingEnabled(true);
+        }
+
+        @Override
+        public void setEntranceTransitionState(boolean state) {
+            getFragment().setEntranceTransitionState(state);
+        }
+    }
+
+    public static class SampleFragment extends Fragment implements MainFragmentAdapterProvider {
+
+        final PageFragmentAdapterImpl mMainFragmentAdapter = new PageFragmentAdapterImpl(this);
+
+        public void setEntranceTransitionState(boolean state) {
+            final View view = getView();
+            int visibility = state ? View.VISIBLE : View.INVISIBLE;
+            view.findViewById(R.id.tv1).setVisibility(visibility);
+            view.findViewById(R.id.tv2).setVisibility(visibility);
+            view.findViewById(R.id.tv3).setVisibility(visibility);
+        }
+
+        @Override
+        public View onCreateView(
+                final LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+            View view = inflater.inflate(R.layout.page_fragment, container, false);
+            view.findViewById(R.id.tv1).setOnClickListener(new View.OnClickListener() {
+                @Override
+                public void onClick(View view) {
+                    Intent intent = new Intent(inflater.getContext(), GuidedStepSupportActivity.class);
+                    startActivity(intent);
+                }
+            });
+
+            return view;
+        }
+
+        @Override
+        public void onViewCreated(View view, Bundle savedInstanceState) {
+            // static layout has view and data ready immediately
+            mMainFragmentAdapter.getFragmentHost().notifyViewCreated(mMainFragmentAdapter);
+            mMainFragmentAdapter.getFragmentHost().notifyDataReady(mMainFragmentAdapter);
+        }
+
+        @Override
+        public MainFragmentAdapter getMainFragmentAdapter() {
+            return mMainFragmentAdapter;
+        }
+    }
+}
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/CardPresenter.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/CardPresenter.java
new file mode 100644
index 0000000..924975d
--- /dev/null
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/CardPresenter.java
@@ -0,0 +1,120 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.example.android.leanback;
+
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+import com.example.android.leanback.R;
+import android.support.v17.leanback.widget.ImageCardView;
+import android.support.v17.leanback.widget.Presenter;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.ViewGroup;
+import android.view.ContextThemeWrapper;
+import android.view.View.MeasureSpec;
+import android.view.ViewGroup.LayoutParams;
+import android.widget.TextView;
+
+import java.util.Random;
+
+public class CardPresenter extends Presenter {
+    private static final String TAG = "CardPresenter";
+
+    private static final int IMAGE_HEIGHT_DP = 120;
+
+    private static Random sRand = new Random();
+    private int mRowHeight = 0;
+    private int mExpandedRowHeight = 0;
+
+    private int mCardThemeResId;
+    private Context mContextThemeWrapper;
+
+    public CardPresenter(int cardThemeResId) {
+        mCardThemeResId = cardThemeResId;
+    }
+
+    public CardPresenter() {
+        mCardThemeResId = 0;
+    }
+
+    private void setupRowHeights(Context context) {
+        if (mRowHeight == 0) {
+            float density = context.getResources().getDisplayMetrics().density;
+            int height = (int) (IMAGE_HEIGHT_DP * density + 0.5f);
+
+            ImageCardView v = new ImageCardView(context);
+            v.setMainImageDimensions(LayoutParams.WRAP_CONTENT, height);
+            v.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
+            mRowHeight = v.getMeasuredHeight();
+            v.setActivated(true);
+            v.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
+            mExpandedRowHeight = v.getMeasuredHeight();
+        }
+    }
+
+    public int getRowHeight(Context context) {
+        setupRowHeights(context);
+        return mRowHeight;
+    }
+
+    public int getExpandedRowHeight(Context context) {
+        setupRowHeights(context);
+        return mExpandedRowHeight;
+    }
+
+    @Override
+    public ViewHolder onCreateViewHolder(ViewGroup parent) {
+        Log.d(TAG, "onCreateViewHolder");
+        Context context = parent.getContext();
+        if (mCardThemeResId != 0) {
+            if (mContextThemeWrapper == null) {
+                mContextThemeWrapper = new ContextThemeWrapper(context, mCardThemeResId);
+            }
+            context = mContextThemeWrapper;
+        }
+        ImageCardView v = new ImageCardView(context);
+        v.setFocusable(true);
+        v.setFocusableInTouchMode(true);
+        // Randomly makes image view crop as a square or just stretch to original
+        // aspect ratio.
+        if (sRand.nextBoolean()) {
+            v.setMainImageAdjustViewBounds(false);
+            v.setMainImageDimensions(getRowHeight(parent.getContext()),
+                    getRowHeight(parent.getContext()));
+        } else {
+            v.setMainImageAdjustViewBounds(true);
+            v.setMainImageDimensions(LayoutParams.WRAP_CONTENT,
+                    getRowHeight(parent.getContext()));
+        }
+        return new ViewHolder(v);
+    }
+
+    @Override
+    public void onBindViewHolder(ViewHolder viewHolder, Object item) {
+        Log.d(TAG, "onBindViewHolder for " + item.toString());
+        PhotoItem photoItem = (PhotoItem) item;
+        Drawable drawable =  viewHolder.view.getContext().getResources()
+                .getDrawable(photoItem.getImageResourceId());
+        ((ImageCardView) viewHolder.view).setMainImage(drawable);
+        ((ImageCardView) viewHolder.view).setTitleText(photoItem.getTitle());
+        if (!TextUtils.isEmpty(photoItem.getContent())) {
+            ((ImageCardView) viewHolder.view).setContentText(photoItem.getContent());
+        }
+    }
+
+    @Override
+    public void onUnbindViewHolder(ViewHolder viewHolder) {
+        Log.d(TAG, "onUnbindViewHolder");
+    }
+}
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/DetailsActivity.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/DetailsActivity.java
new file mode 100644
index 0000000..1ec1041
--- /dev/null
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/DetailsActivity.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.example.android.leanback;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+public class DetailsActivity extends Activity
+{
+    public static final String EXTRA_ITEM = "item";
+    public static final String SHARED_ELEMENT_NAME = "hero";
+
+    private boolean useLegacyFragment() {
+        return (DetailsPresenterSelectionActivity.USE_LEGACY_PRESENTER
+                && !(this instanceof SearchDetailsActivity));
+    }
+
+    /** Called when the activity is first created. */
+    @Override
+    public void onCreate(Bundle savedInstanceState)
+    {
+        super.onCreate(savedInstanceState);
+        setContentView(useLegacyFragment() ? R.layout.legacy_details : R.layout.details);
+        if (savedInstanceState == null) {
+            // Only pass object to fragment when activity is first time created,
+            // later object is modified and persisted with fragment state.
+            if (useLegacyFragment()) {
+                ((DetailsFragment)getFragmentManager().findFragmentById(R.id.details_fragment))
+                    .setItem((PhotoItem) getIntent().getParcelableExtra(EXTRA_ITEM));
+            } else {
+                ((NewDetailsFragment)getFragmentManager().findFragmentById(R.id.details_fragment))
+                    .setItem((PhotoItem) getIntent().getParcelableExtra(EXTRA_ITEM));
+            }
+        }
+    }
+
+    @Override
+    public void onAttachedToWindow() {
+        super.onAttachedToWindow();
+        BackgroundHelper.attach(this);
+    }
+
+    @Override
+    public void onStop() {
+        BackgroundHelper.release(this);
+        super.onStop();
+    }
+}
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/DetailsDescriptionPresenter.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/DetailsDescriptionPresenter.java
new file mode 100644
index 0000000..6d376f0
--- /dev/null
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/DetailsDescriptionPresenter.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.example.android.leanback;
+
+import android.support.v17.leanback.widget.AbstractDetailsDescriptionPresenter;
+import android.support.v17.leanback.widget.DetailsOverviewRow;
+
+public class DetailsDescriptionPresenter extends AbstractDetailsDescriptionPresenter {
+
+    @Override
+    protected void onBindDescription(ViewHolder vh, Object item) {
+        vh.getTitle().setText(item.toString());
+        vh.getSubtitle().setText("2013 - 2014   Drama   TV-14");
+        vh.getBody().setText("Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do "
+                + "eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim "
+                + "veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo "
+                + "consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse "
+                + "cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non "
+                + "proident, sunt in culpa qui officia deserunt mollit anim id est laborum.");
+    }
+}
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/DetailsFragment.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/DetailsFragment.java
new file mode 100644
index 0000000..9238562
--- /dev/null
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/DetailsFragment.java
@@ -0,0 +1,216 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.example.android.leanback;
+
+import android.content.Intent;
+import android.content.res.Resources;
+import android.os.Bundle;
+import android.os.Handler;
+import android.support.v4.app.ActivityOptionsCompat;
+import android.support.v17.leanback.widget.Action;
+import android.support.v17.leanback.widget.ArrayObjectAdapter;
+import android.support.v17.leanback.widget.ClassPresenterSelector;
+import android.support.v17.leanback.widget.DetailsOverviewRow;
+import android.support.v17.leanback.widget.DetailsOverviewRowPresenter;
+import android.support.v17.leanback.widget.HeaderItem;
+import android.support.v17.leanback.widget.ImageCardView;
+import android.support.v17.leanback.widget.ListRow;
+import android.support.v17.leanback.widget.ListRowPresenter;
+import android.support.v17.leanback.widget.OnActionClickedListener;
+import android.support.v17.leanback.widget.OnItemViewClickedListener;
+import android.support.v17.leanback.widget.OnItemViewSelectedListener;
+import android.support.v17.leanback.widget.Presenter;
+import android.support.v17.leanback.widget.Row;
+import android.support.v17.leanback.widget.RowPresenter;
+import android.support.v17.leanback.widget.SparseArrayObjectAdapter;
+import android.util.Log;
+import android.view.View;
+import android.widget.Toast;
+
+public class DetailsFragment extends android.support.v17.leanback.app.DetailsFragment {
+    private static final String TAG = "leanback.DetailsFragment";
+    private static final String ITEM = "item";
+
+    private static final int NUM_ROWS = 3;
+    private ArrayObjectAdapter mRowsAdapter;
+    private PhotoItem mPhotoItem;
+    final CardPresenter cardPresenter = new CardPresenter();
+    private BackgroundHelper mBackgroundHelper = new BackgroundHelper();
+
+    private static final int ACTION_PLAY = 1;
+    private static final int ACTION_RENT = 2;
+    private static final int ACTION_BUY = 3;
+
+    private static final boolean TEST_SHARED_ELEMENT_TRANSITION = true;
+    private static final boolean TEST_ENTRANCE_TRANSITION = true;
+
+    private static final long TIME_TO_LOAD_OVERVIEW_ROW_MS = 1000;
+    private static final long TIME_TO_LOAD_RELATED_ROWS_MS = 2000;
+
+    private Action mActionPlay;
+    private Action mActionRent;
+    private Action mActionBuy;
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        Log.i(TAG, "onCreate");
+        super.onCreate(savedInstanceState);
+
+        setBadgeDrawable(getActivity().getResources().getDrawable(R.drawable.ic_title));
+        setTitle("Leanback Sample App");
+        setOnSearchClickedListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                Intent intent = new Intent(getActivity(), SearchActivity.class);
+                startActivity(intent);
+            }
+        });
+
+        mActionPlay = new Action(ACTION_PLAY, "Play");
+        mActionRent = new Action(ACTION_RENT, "Rent", "$3.99",
+                getResources().getDrawable(R.drawable.ic_action_a));
+        mActionBuy = new Action(ACTION_BUY, "Buy $9.99");
+
+        ClassPresenterSelector ps = new ClassPresenterSelector();
+        DetailsOverviewRowPresenter dorPresenter =
+                new DetailsOverviewRowPresenter(new DetailsDescriptionPresenter());
+        dorPresenter.setOnActionClickedListener(new OnActionClickedListener() {
+            @Override
+            public void onActionClicked(Action action) {
+                Toast.makeText(getActivity(), action.toString(), Toast.LENGTH_SHORT).show();
+                DetailsOverviewRow dor = (DetailsOverviewRow) mRowsAdapter.get(0);
+                if (action.getId() == ACTION_BUY) {
+                    // on the UI thread, we can modify actions adapter directly
+                    SparseArrayObjectAdapter actions = (SparseArrayObjectAdapter)
+                            dor.getActionsAdapter();
+                    actions.set(ACTION_PLAY, mActionPlay);
+                    actions.clear(ACTION_RENT);
+                    actions.clear(ACTION_BUY);
+                    dor.setItem(mPhotoItem.getTitle() + "(Owned)");
+                    dor.setImageDrawable(getResources().getDrawable(R.drawable.details_img_16x9));
+                } else if (action.getId() == ACTION_RENT) {
+                    // on the UI thread, we can modify actions adapter directly
+                    SparseArrayObjectAdapter actions = (SparseArrayObjectAdapter)
+                            dor.getActionsAdapter();
+                    actions.set(ACTION_PLAY, mActionPlay);
+                    actions.clear(ACTION_RENT);
+                    dor.setItem(mPhotoItem.getTitle() + "(Rented)");
+                } else if (action.getId() == ACTION_PLAY) {
+                    Intent intent = new Intent(getActivity(), PlaybackOverlayActivity.class);
+                    getActivity().startActivity(intent);
+                }
+            }
+        });
+
+        ps.addClassPresenter(DetailsOverviewRow.class, dorPresenter);
+        ps.addClassPresenter(ListRow.class, new ListRowPresenter());
+
+        mRowsAdapter = new ArrayObjectAdapter(ps);
+
+        PhotoItem item = (PhotoItem) (savedInstanceState != null ?
+                savedInstanceState.getParcelable(ITEM) : null);
+        if (item != null) {
+            setItem(item);
+        }
+
+        setOnItemViewClickedListener(new OnItemViewClickedListener() {
+            @Override
+            public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
+                    RowPresenter.ViewHolder rowViewHolder, Row row) {
+                Log.i(TAG, "onItemClicked: " + item + " row " + row);
+                if (item instanceof PhotoItem){
+                    Intent intent = new Intent(getActivity(), DetailsActivity.class);
+                    intent.putExtra(DetailsActivity.EXTRA_ITEM, (PhotoItem) item);
+
+                    Bundle bundle = ActivityOptionsCompat.makeSceneTransitionAnimation(
+                            getActivity(),
+                            ((ImageCardView)itemViewHolder.view).getMainImageView(),
+                            DetailsActivity.SHARED_ELEMENT_NAME).toBundle();
+                    getActivity().startActivity(intent, bundle);
+                }
+            }
+        });
+        setOnItemViewSelectedListener(new OnItemViewSelectedListener() {
+            @Override
+            public void onItemSelected(Presenter.ViewHolder itemViewHolder, Object item,
+                    RowPresenter.ViewHolder rowViewHolder, Row row) {
+                Log.i(TAG, "onItemSelected: " + item + " row " + row);
+            }
+        });
+
+        if (TEST_SHARED_ELEMENT_TRANSITION) {
+            dorPresenter.setSharedElementEnterTransition(getActivity(),
+                    DetailsActivity.SHARED_ELEMENT_NAME);
+        }
+        if (TEST_ENTRANCE_TRANSITION) {
+            // don't run entrance transition if Activity is restored.
+            if (savedInstanceState == null) {
+                prepareEntranceTransition();
+            }
+        }
+    }
+
+    @Override
+    public void onSaveInstanceState(Bundle outState) {
+        super.onSaveInstanceState(outState);
+        outState.putParcelable(ITEM, mPhotoItem);
+    }
+
+    public void setItem(PhotoItem photoItem) {
+        mPhotoItem = photoItem;
+
+        mRowsAdapter.clear();
+        new Handler().postDelayed(new Runnable() {
+            public void run() {
+                Resources res = getActivity().getResources();
+                DetailsOverviewRow dor = new DetailsOverviewRow(mPhotoItem.getTitle());
+                dor.setImageDrawable(res.getDrawable(mPhotoItem.getImageResourceId()));
+                SparseArrayObjectAdapter adapter = new SparseArrayObjectAdapter();
+                adapter.set(ACTION_RENT, mActionRent);
+                adapter.set(ACTION_BUY, mActionBuy);
+                dor.setActionsAdapter(adapter);
+                mRowsAdapter.add(0, dor);
+                setSelectedPosition(0, false);
+            }
+        }, TIME_TO_LOAD_OVERVIEW_ROW_MS);
+
+        new Handler().postDelayed(new Runnable() {
+            public void run() {
+                for (int i = 0; i < NUM_ROWS; ++i) {
+                    ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(cardPresenter);
+                    listRowAdapter.add(new PhotoItem("Hello world", R.drawable.gallery_photo_1));
+                    listRowAdapter.add(new PhotoItem("This is a test", R.drawable.gallery_photo_2));
+                    listRowAdapter.add(new PhotoItem("Android TV", R.drawable.gallery_photo_3));
+                    listRowAdapter.add(new PhotoItem("Leanback", R.drawable.gallery_photo_4));
+                    HeaderItem header = new HeaderItem(i, "Row " + i);
+                    mRowsAdapter.add(new ListRow(header, listRowAdapter));
+                }
+                if (TEST_ENTRANCE_TRANSITION) {
+                    startEntranceTransition();
+                }
+            }
+        }, TIME_TO_LOAD_RELATED_ROWS_MS);
+        setAdapter(mRowsAdapter);
+    }
+
+    @Override
+    public void onStart() {
+        super.onStart();
+        if (mPhotoItem != null) {
+            mBackgroundHelper.setBackground(
+                    getActivity(), mPhotoItem.getImageResourceId());
+        }
+    }
+
+}
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/DetailsPresenterSelectionActivity.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/DetailsPresenterSelectionActivity.java
new file mode 100644
index 0000000..9fe7fd3
--- /dev/null
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/DetailsPresenterSelectionActivity.java
@@ -0,0 +1,126 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.leanback;
+
+import android.app.Activity;
+import android.app.FragmentManager;
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.drawable.Drawable;
+import android.os.Bundle;
+import android.support.v17.leanback.app.GuidedStepFragment;
+import android.support.v17.leanback.widget.GuidedAction;
+import android.support.v17.leanback.widget.GuidanceStylist;
+import android.support.v17.leanback.widget.GuidanceStylist.Guidance;
+
+import java.util.List;
+import java.util.ArrayList;
+
+/**
+ * Activity that showcases different aspects of GuidedStepFragments.
+ */
+public class DetailsPresenterSelectionActivity extends Activity {
+
+    private static final int OPTION_CHECK_SET_ID = 10;
+
+    private static final long ACTION_ID_SWITCH_LEGACY_ON = 10000;
+    private static final long ACTION_ID_SWITCH_LEGACY_OFF = 10001;
+
+    public static boolean USE_LEGACY_PRESENTER = false;
+
+    private static final String[] OPTION_NAMES = { "Use new details presenter", "Use legacy details presenter" };
+    private static final String[] OPTION_DESCRIPTIONS = { "Use new details presenter",
+            "Use legacy details presenter"};
+    private static final long[] OPTION_IDS = {ACTION_ID_SWITCH_LEGACY_OFF, ACTION_ID_SWITCH_LEGACY_ON};
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        GuidedStepFragment.addAsRoot(this, new SetupFragment(), android.R.id.content);
+    }
+
+    private static void addAction(List<GuidedAction> actions, long id, String title, String desc) {
+        actions.add(new GuidedAction.Builder()
+                .id(id)
+                .title(title)
+                .description(desc)
+                .build());
+    }
+
+    private static void addCheckedAction(List<GuidedAction> actions, Context context,
+            long id, String title, String desc, boolean checked) {
+        actions.add(new GuidedAction.Builder()
+                .title(title)
+                .description(desc)
+                .id(id)
+                .checkSetId(OPTION_CHECK_SET_ID)
+                .checked(checked)
+                .build());
+    }
+
+    private static class SetupFragment extends GuidedStepFragment {
+
+        @Override
+        public Guidance onCreateGuidance(Bundle savedInstanceState) {
+            String title = getString(R.string.guidedstep_second_title);
+            String breadcrumb = getString(R.string.guidedstep_second_breadcrumb);
+            String description = getString(R.string.guidedstep_second_description);
+            Drawable icon = getActivity().getDrawable(R.drawable.ic_main_icon);
+            return new Guidance(title, description, breadcrumb, icon);
+        }
+
+        @Override
+        public GuidanceStylist onCreateGuidanceStylist() {
+            return new GuidanceStylist() {
+                @Override
+                public int onProvideLayoutId() {
+                    return R.layout.guidedstep_second_guidance;
+                }
+            };
+        }
+
+        @Override
+        public void onCreateActions(List<GuidedAction> actions, Bundle savedInstanceState) {
+            for (int i = 0; i < OPTION_NAMES.length; i++) {
+                boolean checked = false;
+                if (OPTION_IDS[i] == ACTION_ID_SWITCH_LEGACY_ON) {
+                    if (USE_LEGACY_PRESENTER) {
+                        checked = true;
+                    }
+                } else if (OPTION_IDS[i] == ACTION_ID_SWITCH_LEGACY_OFF) {
+                    if (!USE_LEGACY_PRESENTER) {
+                        checked = true;
+                    }
+                }
+                addCheckedAction(actions, getActivity(), OPTION_IDS[i], OPTION_NAMES[i],
+                        OPTION_DESCRIPTIONS[i], checked);
+            }
+        }
+
+        @Override
+        public void onGuidedActionClicked(GuidedAction action) {
+            if (action.getId() == ACTION_ID_SWITCH_LEGACY_ON) {
+                USE_LEGACY_PRESENTER = action.isChecked();
+            } else if (action.getId() == ACTION_ID_SWITCH_LEGACY_OFF) {
+                USE_LEGACY_PRESENTER = !action.isChecked();
+            }
+            getActivity().finish();
+        }
+
+    }
+
+}
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/DetailsSupportActivity.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/DetailsSupportActivity.java
new file mode 100644
index 0000000..40c2109
--- /dev/null
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/DetailsSupportActivity.java
@@ -0,0 +1,61 @@
+/* This file is auto-generated from DetailsActivity.java.  DO NOT MODIFY. */
+
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.example.android.leanback;
+
+import android.support.v4.app.FragmentActivity;
+import android.os.Bundle;
+
+public class DetailsSupportActivity extends FragmentActivity
+{
+    public static final String EXTRA_ITEM = "item";
+    public static final String SHARED_ELEMENT_NAME = "hero";
+
+    private boolean useLegacyFragment() {
+        return (DetailsPresenterSelectionActivity.USE_LEGACY_PRESENTER
+                && !(this instanceof SearchDetailsSupportActivity));
+    }
+
+    /** Called when the activity is first created. */
+    @Override
+    public void onCreate(Bundle savedInstanceState)
+    {
+        super.onCreate(savedInstanceState);
+        setContentView(useLegacyFragment() ? R.layout.legacy_details_support : R.layout.details_support);
+        if (savedInstanceState == null) {
+            // Only pass object to fragment when activity is first time created,
+            // later object is modified and persisted with fragment state.
+            if (useLegacyFragment()) {
+                ((DetailsSupportFragment)getSupportFragmentManager().findFragmentById(R.id.details_fragment))
+                    .setItem((PhotoItem) getIntent().getParcelableExtra(EXTRA_ITEM));
+            } else {
+                ((NewDetailsSupportFragment)getSupportFragmentManager().findFragmentById(R.id.details_fragment))
+                    .setItem((PhotoItem) getIntent().getParcelableExtra(EXTRA_ITEM));
+            }
+        }
+    }
+
+    @Override
+    public void onAttachedToWindow() {
+        super.onAttachedToWindow();
+        BackgroundHelper.attach(this);
+    }
+
+    @Override
+    public void onStop() {
+        BackgroundHelper.release(this);
+        super.onStop();
+    }
+}
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/DetailsSupportFragment.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/DetailsSupportFragment.java
new file mode 100644
index 0000000..143a37d
--- /dev/null
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/DetailsSupportFragment.java
@@ -0,0 +1,218 @@
+/* This file is auto-generated from DetailsFragment.java.  DO NOT MODIFY. */
+
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.example.android.leanback;
+
+import android.content.Intent;
+import android.content.res.Resources;
+import android.os.Bundle;
+import android.os.Handler;
+import android.support.v4.app.ActivityOptionsCompat;
+import android.support.v17.leanback.widget.Action;
+import android.support.v17.leanback.widget.ArrayObjectAdapter;
+import android.support.v17.leanback.widget.ClassPresenterSelector;
+import android.support.v17.leanback.widget.DetailsOverviewRow;
+import android.support.v17.leanback.widget.DetailsOverviewRowPresenter;
+import android.support.v17.leanback.widget.HeaderItem;
+import android.support.v17.leanback.widget.ImageCardView;
+import android.support.v17.leanback.widget.ListRow;
+import android.support.v17.leanback.widget.ListRowPresenter;
+import android.support.v17.leanback.widget.OnActionClickedListener;
+import android.support.v17.leanback.widget.OnItemViewClickedListener;
+import android.support.v17.leanback.widget.OnItemViewSelectedListener;
+import android.support.v17.leanback.widget.Presenter;
+import android.support.v17.leanback.widget.Row;
+import android.support.v17.leanback.widget.RowPresenter;
+import android.support.v17.leanback.widget.SparseArrayObjectAdapter;
+import android.util.Log;
+import android.view.View;
+import android.widget.Toast;
+
+public class DetailsSupportFragment extends android.support.v17.leanback.app.DetailsSupportFragment {
+    private static final String TAG = "leanback.DetailsSupportFragment";
+    private static final String ITEM = "item";
+
+    private static final int NUM_ROWS = 3;
+    private ArrayObjectAdapter mRowsAdapter;
+    private PhotoItem mPhotoItem;
+    final CardPresenter cardPresenter = new CardPresenter();
+    private BackgroundHelper mBackgroundHelper = new BackgroundHelper();
+
+    private static final int ACTION_PLAY = 1;
+    private static final int ACTION_RENT = 2;
+    private static final int ACTION_BUY = 3;
+
+    private static final boolean TEST_SHARED_ELEMENT_TRANSITION = true;
+    private static final boolean TEST_ENTRANCE_TRANSITION = true;
+
+    private static final long TIME_TO_LOAD_OVERVIEW_ROW_MS = 1000;
+    private static final long TIME_TO_LOAD_RELATED_ROWS_MS = 2000;
+
+    private Action mActionPlay;
+    private Action mActionRent;
+    private Action mActionBuy;
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        Log.i(TAG, "onCreate");
+        super.onCreate(savedInstanceState);
+
+        setBadgeDrawable(getActivity().getResources().getDrawable(R.drawable.ic_title));
+        setTitle("Leanback Sample App");
+        setOnSearchClickedListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                Intent intent = new Intent(getActivity(), SearchSupportActivity.class);
+                startActivity(intent);
+            }
+        });
+
+        mActionPlay = new Action(ACTION_PLAY, "Play");
+        mActionRent = new Action(ACTION_RENT, "Rent", "$3.99",
+                getResources().getDrawable(R.drawable.ic_action_a));
+        mActionBuy = new Action(ACTION_BUY, "Buy $9.99");
+
+        ClassPresenterSelector ps = new ClassPresenterSelector();
+        DetailsOverviewRowPresenter dorPresenter =
+                new DetailsOverviewRowPresenter(new DetailsDescriptionPresenter());
+        dorPresenter.setOnActionClickedListener(new OnActionClickedListener() {
+            @Override
+            public void onActionClicked(Action action) {
+                Toast.makeText(getActivity(), action.toString(), Toast.LENGTH_SHORT).show();
+                DetailsOverviewRow dor = (DetailsOverviewRow) mRowsAdapter.get(0);
+                if (action.getId() == ACTION_BUY) {
+                    // on the UI thread, we can modify actions adapter directly
+                    SparseArrayObjectAdapter actions = (SparseArrayObjectAdapter)
+                            dor.getActionsAdapter();
+                    actions.set(ACTION_PLAY, mActionPlay);
+                    actions.clear(ACTION_RENT);
+                    actions.clear(ACTION_BUY);
+                    dor.setItem(mPhotoItem.getTitle() + "(Owned)");
+                    dor.setImageDrawable(getResources().getDrawable(R.drawable.details_img_16x9));
+                } else if (action.getId() == ACTION_RENT) {
+                    // on the UI thread, we can modify actions adapter directly
+                    SparseArrayObjectAdapter actions = (SparseArrayObjectAdapter)
+                            dor.getActionsAdapter();
+                    actions.set(ACTION_PLAY, mActionPlay);
+                    actions.clear(ACTION_RENT);
+                    dor.setItem(mPhotoItem.getTitle() + "(Rented)");
+                } else if (action.getId() == ACTION_PLAY) {
+                    Intent intent = new Intent(getActivity(), PlaybackOverlaySupportActivity.class);
+                    getActivity().startActivity(intent);
+                }
+            }
+        });
+
+        ps.addClassPresenter(DetailsOverviewRow.class, dorPresenter);
+        ps.addClassPresenter(ListRow.class, new ListRowPresenter());
+
+        mRowsAdapter = new ArrayObjectAdapter(ps);
+
+        PhotoItem item = (PhotoItem) (savedInstanceState != null ?
+                savedInstanceState.getParcelable(ITEM) : null);
+        if (item != null) {
+            setItem(item);
+        }
+
+        setOnItemViewClickedListener(new OnItemViewClickedListener() {
+            @Override
+            public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
+                    RowPresenter.ViewHolder rowViewHolder, Row row) {
+                Log.i(TAG, "onItemClicked: " + item + " row " + row);
+                if (item instanceof PhotoItem){
+                    Intent intent = new Intent(getActivity(), DetailsSupportActivity.class);
+                    intent.putExtra(DetailsSupportActivity.EXTRA_ITEM, (PhotoItem) item);
+
+                    Bundle bundle = ActivityOptionsCompat.makeSceneTransitionAnimation(
+                            getActivity(),
+                            ((ImageCardView)itemViewHolder.view).getMainImageView(),
+                            DetailsSupportActivity.SHARED_ELEMENT_NAME).toBundle();
+                    getActivity().startActivity(intent, bundle);
+                }
+            }
+        });
+        setOnItemViewSelectedListener(new OnItemViewSelectedListener() {
+            @Override
+            public void onItemSelected(Presenter.ViewHolder itemViewHolder, Object item,
+                    RowPresenter.ViewHolder rowViewHolder, Row row) {
+                Log.i(TAG, "onItemSelected: " + item + " row " + row);
+            }
+        });
+
+        if (TEST_SHARED_ELEMENT_TRANSITION) {
+            dorPresenter.setSharedElementEnterTransition(getActivity(),
+                    DetailsSupportActivity.SHARED_ELEMENT_NAME);
+        }
+        if (TEST_ENTRANCE_TRANSITION) {
+            // don't run entrance transition if Activity is restored.
+            if (savedInstanceState == null) {
+                prepareEntranceTransition();
+            }
+        }
+    }
+
+    @Override
+    public void onSaveInstanceState(Bundle outState) {
+        super.onSaveInstanceState(outState);
+        outState.putParcelable(ITEM, mPhotoItem);
+    }
+
+    public void setItem(PhotoItem photoItem) {
+        mPhotoItem = photoItem;
+
+        mRowsAdapter.clear();
+        new Handler().postDelayed(new Runnable() {
+            public void run() {
+                Resources res = getActivity().getResources();
+                DetailsOverviewRow dor = new DetailsOverviewRow(mPhotoItem.getTitle());
+                dor.setImageDrawable(res.getDrawable(mPhotoItem.getImageResourceId()));
+                SparseArrayObjectAdapter adapter = new SparseArrayObjectAdapter();
+                adapter.set(ACTION_RENT, mActionRent);
+                adapter.set(ACTION_BUY, mActionBuy);
+                dor.setActionsAdapter(adapter);
+                mRowsAdapter.add(0, dor);
+                setSelectedPosition(0, false);
+            }
+        }, TIME_TO_LOAD_OVERVIEW_ROW_MS);
+
+        new Handler().postDelayed(new Runnable() {
+            public void run() {
+                for (int i = 0; i < NUM_ROWS; ++i) {
+                    ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(cardPresenter);
+                    listRowAdapter.add(new PhotoItem("Hello world", R.drawable.gallery_photo_1));
+                    listRowAdapter.add(new PhotoItem("This is a test", R.drawable.gallery_photo_2));
+                    listRowAdapter.add(new PhotoItem("Android TV", R.drawable.gallery_photo_3));
+                    listRowAdapter.add(new PhotoItem("Leanback", R.drawable.gallery_photo_4));
+                    HeaderItem header = new HeaderItem(i, "Row " + i);
+                    mRowsAdapter.add(new ListRow(header, listRowAdapter));
+                }
+                if (TEST_ENTRANCE_TRANSITION) {
+                    startEntranceTransition();
+                }
+            }
+        }, TIME_TO_LOAD_RELATED_ROWS_MS);
+        setAdapter(mRowsAdapter);
+    }
+
+    @Override
+    public void onStart() {
+        super.onStart();
+        if (mPhotoItem != null) {
+            mBackgroundHelper.setBackground(
+                    getActivity(), mPhotoItem.getImageResourceId());
+        }
+    }
+
+}
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/ErrorFragment.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/ErrorFragment.java
new file mode 100644
index 0000000..7a88c91
--- /dev/null
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/ErrorFragment.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.example.android.leanback;
+
+import android.content.Intent;
+import android.content.res.Resources;
+import android.os.Bundle;
+import android.support.v17.leanback.widget.ArrayObjectAdapter;
+import android.support.v17.leanback.widget.HeaderItem;
+import android.support.v17.leanback.widget.ListRow;
+import android.support.v17.leanback.widget.ListRowPresenter;
+import android.support.v17.leanback.widget.Row;
+import android.support.v17.leanback.widget.SearchOrbView;
+import android.util.Log;
+import android.view.View;
+
+public class ErrorFragment extends android.support.v17.leanback.app.ErrorFragment {
+    private static final String TAG = "leanback.ErrorFragment";
+    private static final boolean TRANSLUCENT = true;
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        Log.i(TAG, "onCreate");
+        super.onCreate(savedInstanceState);
+
+        setTitle("Leanback Sample App");
+    }
+
+    void setErrorContent(Resources resources) {
+        setImageDrawable(resources.getDrawable(R.drawable.lb_ic_sad_cloud));
+        setMessage("An error occurred.");
+        setDefaultBackground(TRANSLUCENT);
+
+        setButtonText("Dismiss");
+        setButtonClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View arg0) {
+                Log.i(TAG, "button clicked");
+                getFragmentManager().beginTransaction().remove(ErrorFragment.this).commit();
+            }
+        });
+    }
+}
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/ErrorSupportFragment.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/ErrorSupportFragment.java
new file mode 100644
index 0000000..ea3e17c
--- /dev/null
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/ErrorSupportFragment.java
@@ -0,0 +1,56 @@
+/* This file is auto-generated from ErrorFragment.java.  DO NOT MODIFY. */
+
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.example.android.leanback;
+
+import android.content.Intent;
+import android.content.res.Resources;
+import android.os.Bundle;
+import android.support.v17.leanback.widget.ArrayObjectAdapter;
+import android.support.v17.leanback.widget.HeaderItem;
+import android.support.v17.leanback.widget.ListRow;
+import android.support.v17.leanback.widget.ListRowPresenter;
+import android.support.v17.leanback.widget.Row;
+import android.support.v17.leanback.widget.SearchOrbView;
+import android.util.Log;
+import android.view.View;
+
+public class ErrorSupportFragment extends android.support.v17.leanback.app.ErrorSupportFragment {
+    private static final String TAG = "leanback.ErrorSupportFragment";
+    private static final boolean TRANSLUCENT = true;
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        Log.i(TAG, "onCreate");
+        super.onCreate(savedInstanceState);
+
+        setTitle("Leanback Sample App");
+    }
+
+    void setErrorContent(Resources resources) {
+        setImageDrawable(resources.getDrawable(R.drawable.lb_ic_sad_cloud));
+        setMessage("An error occurred.");
+        setDefaultBackground(TRANSLUCENT);
+
+        setButtonText("Dismiss");
+        setButtonClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View arg0) {
+                Log.i(TAG, "button clicked");
+                getFragmentManager().beginTransaction().remove(ErrorSupportFragment.this).commit();
+            }
+        });
+    }
+}
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/GuidedStepActivity.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/GuidedStepActivity.java
new file mode 100644
index 0000000..15af18f
--- /dev/null
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/GuidedStepActivity.java
@@ -0,0 +1,560 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.leanback;
+
+import android.app.Activity;
+import android.app.FragmentManager;
+import android.content.Context;
+import android.content.Intent;
+import android.content.res.Configuration;
+import android.graphics.drawable.Drawable;
+import android.os.Bundle;
+import android.support.v17.leanback.app.GuidedStepFragment;
+import android.support.v17.leanback.widget.GuidanceStylist;
+import android.support.v17.leanback.widget.GuidanceStylist.Guidance;
+import android.support.v17.leanback.widget.GuidedAction;
+import android.support.v17.leanback.widget.GuidedActionsStylist;
+import android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder;
+import android.support.v17.leanback.widget.GuidedDatePickerAction;
+import android.text.InputType;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.ViewGroup;
+import android.view.ViewTreeObserver.OnGlobalLayoutListener;
+import android.view.inputmethod.EditorInfo;
+
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.List;
+
+/**
+ * Activity that showcases different aspects of GuidedStepFragments.
+ */
+public class GuidedStepActivity extends Activity {
+
+    private static final int BACK = 2;
+
+    private static final int FIRST_NAME = 3;
+    private static final int LAST_NAME = 4;
+    private static final int PASSWORD = 5;
+    private static final int PAYMENT = 6;
+    private static final int NEW_PAYMENT = 7;
+    private static final int PAYMENT_EXPIRE = 8;
+
+    private static final long RADIO_ID_BASE = 0;
+    private static final long CHECKBOX_ID_BASE = 100;
+
+    private static final long DEFAULT_OPTION = RADIO_ID_BASE;
+
+    private static final String[] OPTION_NAMES = { "Option A", "Option B", "Option C" };
+    private static final String[] OPTION_DESCRIPTIONS = { "Here's one thing you can do",
+            "Here's another thing you can do", "Here's one more thing you can do" };
+
+    private static final String TAG = GuidedStepActivity.class.getSimpleName();
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        Log.v(TAG, "onCreate");
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.guided_step_activity);
+        if (savedInstanceState == null) {
+            GuidedStepFragment.addAsRoot(this, new FirstStepFragment(), R.id.lb_guidedstep_host);
+        }
+    }
+
+    @Override
+    public void onConfigurationChanged(Configuration newConfig) {
+        Log.v(TAG, "onConfigurationChanged");
+        super.onConfigurationChanged(newConfig);
+    }
+
+    @Override
+    protected void onSaveInstanceState(Bundle outState) {
+        Log.v(TAG, "onSaveInstanceState");
+        super.onSaveInstanceState(outState);
+    }
+
+    @Override
+    protected void onRestoreInstanceState(Bundle savedInstanceState) {
+        Log.v(TAG, "onRestoreInstanceState");
+        super.onRestoreInstanceState(savedInstanceState);
+    }
+
+    private static void addAction(List<GuidedAction> actions, long id, String title, String desc) {
+        actions.add(new GuidedAction.Builder()
+                .id(id)
+                .title(title)
+                .description(desc)
+                .build());
+    }
+
+    private static void addAction(List<GuidedAction> actions, long id, String title, String desc,
+            List<GuidedAction> subActions) {
+        actions.add(new GuidedAction.Builder()
+                .id(id)
+                .title(title)
+                .description(desc)
+                .subActions(subActions)
+                .build());
+    }
+
+    private static void addEditableAction(Context context, List<GuidedAction> actions,
+            long id, String title, String desc) {
+        actions.add(new GuidedAction.Builder(context)
+                .id(id)
+                .title(title)
+                .description(desc)
+                .editable(true)
+                .icon(R.drawable.lb_ic_search_mic)
+                .build());
+    }
+
+    private static void addEditableAction(List<GuidedAction> actions, long id, String title,
+            String editTitle, String desc) {
+        actions.add(new GuidedAction.Builder()
+                .id(id)
+                .title(title)
+                .editTitle(editTitle)
+                .description(desc)
+                .editable(true)
+                .build());
+    }
+
+    private static void addEditableAction(List<GuidedAction> actions, long id, String title,
+            String editTitle, int editInputType, String desc, String editDesc) {
+        actions.add(new GuidedAction.Builder()
+                .id(id)
+                .title(title)
+                .editTitle(editTitle)
+                .editInputType(editInputType)
+                .description(desc)
+                .editDescription(editDesc)
+                .editable(true)
+                .build());
+    }
+
+    private static void addDatePickerAction(List<GuidedAction> actions, long id, String title) {
+        actions.add(new GuidedDatePickerAction.Builder(null)
+                .id(id)
+                .title(title)
+                .datePickerFormat("MY")
+                .build());
+    }
+
+    private static void addEditableDescriptionAction(List<GuidedAction> actions, long id,
+            String title, String desc, String editDescription, int descriptionEditInputType) {
+        actions.add(new GuidedAction.Builder()
+                .id(id)
+                .title(title)
+                .description(desc)
+                .editDescription(editDescription)
+                .descriptionEditInputType(descriptionEditInputType)
+                .descriptionEditable(true)
+                .build());
+    }
+
+    private static void addCheckedAction(List<GuidedAction> actions, long id, Context context,
+            String title, String desc, int checkSetId) {
+        actions.add(new GuidedAction.Builder()
+                .id(id)
+                .title(title)
+                .description(desc)
+                .checkSetId(checkSetId)
+                .build());
+    }
+
+    public static class FirstStepFragment extends GuidedStepFragment {
+
+        @Override
+        public int onProvideTheme() {
+            return R.style.Theme_Example_Leanback_GuidedStep_First;
+        }
+
+        @Override
+        public Guidance onCreateGuidance(Bundle savedInstanceState) {
+            String title = getString(R.string.guidedstep_first_title);
+            String breadcrumb = getString(R.string.guidedstep_first_breadcrumb);
+            String description = getString(R.string.guidedstep_first_description);
+            Drawable icon = getActivity().getResources().getDrawable(R.drawable.ic_main_icon);
+            return new Guidance(title, description, breadcrumb, icon);
+        }
+
+        @Override
+        public void onCreateActions(List<GuidedAction> actions, Bundle savedInstanceState) {
+            Context context = getActivity();
+            actions.add(new GuidedAction.Builder(context)
+                    .clickAction(GuidedAction.ACTION_ID_CONTINUE)
+                    .description("Let's do it")
+                    .build());
+            actions.add(new GuidedAction.Builder(context)
+                    .clickAction(GuidedAction.ACTION_ID_CANCEL)
+                    .description("Never mind")
+                    .build());
+        }
+
+        @Override
+        public void onGuidedActionClicked(GuidedAction action) {
+            FragmentManager fm = getFragmentManager();
+            if (action.getId() == GuidedAction.ACTION_ID_CONTINUE) {
+                GuidedStepFragment.add(fm, new SecondStepFragment(), R.id.lb_guidedstep_host);
+            } else if (action.getId() == GuidedAction.ACTION_ID_CANCEL){
+                finishGuidedStepFragments();
+            }
+        }
+    }
+
+    static ArrayList<String> sCards = new ArrayList<String>();
+    static int sSelectedCard = -1;
+    static {
+        sCards.add("Visa-1234");
+        sCards.add("Master-4321");
+    }
+
+    public static class NewPaymentStepFragment extends GuidedStepFragment {
+
+        @Override
+        public Guidance onCreateGuidance(Bundle savedInstanceState) {
+            String title = getString(R.string.guidedstep_newpayment_title);
+            String breadcrumb = getString(R.string.guidedstep_newpayment_breadcrumb);
+            String description = getString(R.string.guidedstep_newpayment_description);
+            Drawable icon = getActivity().getResources().getDrawable(R.drawable.ic_main_icon);
+            return new Guidance(title, description, breadcrumb, icon);
+        }
+
+        @Override
+        public void onCreateActions(List<GuidedAction> actions, Bundle savedInstanceState) {
+            addEditableAction(actions, NEW_PAYMENT, "Input credit card number", "",
+                    InputType.TYPE_CLASS_NUMBER,
+                    "Input credit card number", "Input credit card number");
+            addDatePickerAction(actions, PAYMENT_EXPIRE, "Exp:");
+        }
+
+        @Override
+        public void onCreateButtonActions(List<GuidedAction> actions, Bundle savedInstanceState) {
+            Context context = getActivity();
+            actions.add(new GuidedAction.Builder(context).clickAction(GuidedAction.ACTION_ID_OK)
+                    .build());
+            actions.get(actions.size() - 1).setEnabled(false);
+        }
+
+        @Override
+        public void onGuidedActionClicked(GuidedAction action) {
+            if (action.getId() == GuidedAction.ACTION_ID_OK) {
+                CharSequence desc = findActionById(NEW_PAYMENT).getDescription();
+                String cardNumber = desc.subSequence(desc.length() - 4, desc.length()).toString();
+                String card;
+                if ((Integer.parseInt(cardNumber) & 1) == 0) {
+                    card = "Visa "+cardNumber;
+                } else {
+                    card = "Master "+cardNumber;
+                }
+                sSelectedCard = sCards.size();
+                sCards.add(card);
+                popBackStackToGuidedStepFragment(NewPaymentStepFragment.class,
+                        FragmentManager.POP_BACK_STACK_INCLUSIVE);
+            }
+        }
+
+        @Override
+        public long onGuidedActionEditedAndProceed(GuidedAction action) {
+            if (action.getId() == NEW_PAYMENT) {
+                CharSequence editTitle = action.getEditTitle();
+                if (isCardNumberValid(editTitle)) {
+                    editTitle = editTitle.subSequence(editTitle.length() - 4, editTitle.length());
+                    action.setDescription("Visa XXXX-XXXX-XXXX-" + editTitle);
+                    updateOkButton(isExpDateValid(findActionById(PAYMENT_EXPIRE)));
+                    return GuidedAction.ACTION_ID_NEXT;
+                } else if (editTitle.length() == 0) {
+                    action.setDescription("Input credit card number");
+                    updateOkButton(false);
+                    return GuidedAction.ACTION_ID_CURRENT;
+                } else {
+                    action.setDescription("Error credit card number");
+                    updateOkButton(false);
+                    return GuidedAction.ACTION_ID_CURRENT;
+                }
+            } else if (action.getId() == PAYMENT_EXPIRE) {
+                updateOkButton(isExpDateValid(action) &&
+                        isCardNumberValid(findActionById(NEW_PAYMENT).getEditTitle()));
+            }
+            return GuidedAction.ACTION_ID_NEXT;
+        }
+
+        boolean isCardNumberValid(CharSequence number) {
+            return TextUtils.isDigitsOnly(number) && number.length() == 16;
+        }
+
+        boolean isExpDateValid(GuidedAction action) {
+            long date = ((GuidedDatePickerAction) action).getDate();
+            Calendar c = Calendar.getInstance();
+            c.setTimeInMillis(date);
+            return Calendar.getInstance().before(c);
+        }
+
+        void updateOkButton(boolean enabled) {
+            findButtonActionById(GuidedAction.ACTION_ID_OK).setEnabled(enabled);
+            notifyButtonActionChanged(findButtonActionPositionById(GuidedAction.ACTION_ID_OK));
+        }
+    }
+
+    public static class SecondStepFragment extends GuidedStepFragment {
+
+        public GuidedActionsStylist onCreateActionsStylist() {
+            return new GuidedActionsStylist() {
+                protected void setupImeOptions(GuidedActionsStylist.ViewHolder vh,
+                        GuidedAction action) {
+                    if (action.getId() == PASSWORD) {
+                        vh.getEditableDescriptionView().setImeActionLabel("Confirm!",
+                                EditorInfo.IME_ACTION_DONE);
+                    } else {
+                        super.setupImeOptions(vh, action);
+                    }
+                }
+            };
+        }
+
+        @Override
+        public Guidance onCreateGuidance(Bundle savedInstanceState) {
+            String title = getString(R.string.guidedstep_second_title);
+            String breadcrumb = getString(R.string.guidedstep_second_breadcrumb);
+            String description = getString(R.string.guidedstep_second_description);
+            Drawable icon = getActivity().getResources().getDrawable(R.drawable.ic_main_icon);
+            return new Guidance(title, description, breadcrumb, icon);
+        }
+
+        @Override
+        public void onCreateActions(List<GuidedAction> actions, Bundle savedInstanceState) {
+            addEditableAction(getContext(), actions, FIRST_NAME, "Pat", "Your first name");
+            addEditableAction(getContext(), actions, LAST_NAME, "Smith", "Your last name");
+            List<GuidedAction> subActions = new ArrayList<GuidedAction>();
+            addAction(actions, PAYMENT, "Select Payment", "", subActions);
+            addEditableDescriptionAction(actions, PASSWORD, "Password", "", "",
+                    InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
+        }
+
+        @Override
+        public void onCreateButtonActions(List<GuidedAction> actions, Bundle savedInstanceState) {
+            actions.add(new GuidedAction.Builder(getActivity())
+                    .clickAction(GuidedAction.ACTION_ID_CONTINUE)
+                    .description("Continue")
+                    .build());
+        }
+
+        @Override
+        public void onGuidedActionClicked(GuidedAction action) {
+            if (action.getId() == GuidedAction.ACTION_ID_CONTINUE) {
+                FragmentManager fm = getFragmentManager();
+                GuidedStepFragment.add(fm, new ThirdStepFragment(), R.id.lb_guidedstep_host);
+            }
+        }
+
+        @Override
+        public long onGuidedActionEditedAndProceed(GuidedAction action) {
+            if (action.getId() == PASSWORD) {
+                CharSequence password = action.getEditDescription();
+                if (password.length() > 0) {
+                    if (isPaymentValid()) {
+                        updateContinue(true);
+                        return GuidedAction.ACTION_ID_NEXT;
+                    } else {
+                        updateContinue(false);
+                        return GuidedAction.ACTION_ID_CURRENT;
+                    }
+                } else {
+                    updateContinue(false);
+                    return GuidedAction.ACTION_ID_CURRENT;
+                }
+            }
+            return GuidedAction.ACTION_ID_NEXT;
+        }
+
+        @Override
+        public boolean onSubGuidedActionClicked(GuidedAction action) {
+            if (action.isChecked()) {
+                String payment = action.getTitle().toString();
+                for (int i = 0; i < sCards.size(); i++) {
+                    if (payment.equals(sCards.get(i))) {
+                        sSelectedCard = i;
+                        findActionById(PAYMENT).setDescription(payment);
+                        notifyActionChanged(findActionPositionById(PAYMENT));
+                        updateContinue(isPasswordValid());
+                        break;
+                    }
+                }
+                return true;
+            } else {
+                FragmentManager fm = getFragmentManager();
+                GuidedStepFragment.add(fm, new NewPaymentStepFragment(), R.id.lb_guidedstep_host);
+                return false;
+            }
+        }
+
+        @Override
+        public void onResume() {
+            super.onResume();
+            // when resumed, update sub actions list and selected index from data model.
+            GuidedAction payments = findActionById(PAYMENT);
+            payments.getSubActions().clear();
+            for (int i = 0; i < sCards.size(); i++) {
+                addCheckedAction(payments.getSubActions(), -1, getActivity(), sCards.get(i), "",
+                        GuidedAction.DEFAULT_CHECK_SET_ID);
+                if (i == sSelectedCard) {
+                    payments.getSubActions().get(i).setChecked(true);
+                }
+            }
+            addAction(payments.getSubActions(), NEW_PAYMENT, "Add New Card", "");
+            if (sSelectedCard != -1) {
+                payments.setDescription(sCards.get(sSelectedCard));
+            }
+            notifyActionChanged(findActionPositionById(PAYMENT));
+            updateContinue(isPasswordValid() && isPaymentValid());
+        }
+
+        boolean isPaymentValid() {
+            CharSequence paymentType = findActionById(PAYMENT).getDescription();
+            return (paymentType.length() >= 4 &&
+                    paymentType.subSequence(0, 4).toString().equals("Visa")) ||
+                    (paymentType.length() >= 6 &&
+                    paymentType.subSequence(0, 6).toString().equals("Master"));
+        }
+
+        boolean isPasswordValid() {
+            return findActionById(PASSWORD).getEditDescription().length() > 0;
+        }
+
+        void updateContinue(boolean enabled) {
+            findButtonActionById(GuidedAction.ACTION_ID_CONTINUE).setEnabled(enabled);
+            notifyButtonActionChanged(findButtonActionPositionById(
+                    GuidedAction.ACTION_ID_CONTINUE));
+        }
+    }
+
+    public static class ThirdStepFragment extends GuidedStepFragment {
+
+        private long mSelectedOption = DEFAULT_OPTION;
+
+        @Override
+        public Guidance onCreateGuidance(Bundle savedInstanceState) {
+            String title = getString(R.string.guidedstep_third_title);
+            String breadcrumb = getString(R.string.guidedstep_third_breadcrumb);
+            String description = getString(R.string.guidedstep_third_description);
+            Drawable icon = getActivity().getResources().getDrawable(R.drawable.ic_main_icon);
+            return new Guidance(title, description, breadcrumb, icon);
+        }
+
+        @Override
+        public GuidanceStylist onCreateGuidanceStylist() {
+            return new GuidanceStylist() {
+                @Override
+                public int onProvideLayoutId() {
+                    return R.layout.guidedstep_second_guidance;
+                }
+            };
+        }
+
+        @Override
+        public void onCreateActions(List<GuidedAction> actions, Bundle savedInstanceState) {
+            String desc = "The description can be quite long as well.  " +
+                    "Just be sure to set multilineDescription to true in the GuidedAction.";
+            actions.add(new GuidedAction.Builder()
+                    .title("Note that Guided Actions can have titles that are quite long.")
+                    .description(desc)
+                    .multilineDescription(true)
+                    .infoOnly(true)
+                    .enabled(true)
+                    .focusable(false)
+                    .build());
+            for (int i = 0; i < OPTION_NAMES.length; i++) {
+                addCheckedAction(actions, RADIO_ID_BASE + i, getActivity(), OPTION_NAMES[i],
+                        OPTION_DESCRIPTIONS[i], GuidedAction.DEFAULT_CHECK_SET_ID);
+                if (i == DEFAULT_OPTION) {
+                    actions.get(actions.size() -1).setChecked(true);
+                }
+            }
+            for (int i = 0; i < OPTION_NAMES.length; i++) {
+                addCheckedAction(actions, CHECKBOX_ID_BASE + i, getActivity(), OPTION_NAMES[i],
+                        OPTION_DESCRIPTIONS[i], GuidedAction.CHECKBOX_CHECK_SET_ID);
+            }
+        }
+
+        @Override
+        public void onCreateButtonActions(List<GuidedAction> actions, Bundle savedInstanceState) {
+            actions.add(new GuidedAction.Builder(getActivity())
+                    .clickAction(GuidedAction.ACTION_ID_CONTINUE)
+                    .build());
+        }
+
+        @Override
+        public void onGuidedActionClicked(GuidedAction action) {
+            if (action.getId() == GuidedAction.ACTION_ID_CONTINUE) {
+                FragmentManager fm = getFragmentManager();
+                FourthStepFragment f = new FourthStepFragment();
+                Bundle arguments = new Bundle();
+                arguments.putLong(FourthStepFragment.EXTRA_OPTION, mSelectedOption);
+                f.setArguments(arguments);
+                GuidedStepFragment.add(fm, f, R.id.lb_guidedstep_host);
+            } else if (action.getCheckSetId() == GuidedAction.DEFAULT_CHECK_SET_ID) {
+                mSelectedOption = action.getId();
+            }
+        }
+
+    }
+
+    public static class FourthStepFragment extends GuidedStepFragment {
+        public static final String EXTRA_OPTION = "extra_option";
+
+        public FourthStepFragment() {
+        }
+
+        public long getOption() {
+            Bundle b = getArguments();
+            if (b == null) return 0;
+            return b.getLong(EXTRA_OPTION, 0);
+        }
+
+        @Override
+        public Guidance onCreateGuidance(Bundle savedInstanceState) {
+            String title = getString(R.string.guidedstep_fourth_title);
+            String breadcrumb = getString(R.string.guidedstep_fourth_breadcrumb);
+            String description = "You chose: " + OPTION_NAMES[(int) getOption()];
+            Drawable icon = getActivity().getResources().getDrawable(R.drawable.ic_main_icon);
+            return new Guidance(title, description, breadcrumb, icon);
+        }
+
+        @Override
+        public void onCreateActions(List<GuidedAction> actions, Bundle savedInstanceState) {
+            actions.add(new GuidedAction.Builder(getActivity())
+                    .clickAction(GuidedAction.ACTION_ID_FINISH)
+                    .description("All Done...")
+                    .build());
+            addAction(actions, BACK, "Start Over", "Let's try this again...");
+        }
+
+        @Override
+        public void onGuidedActionClicked(GuidedAction action) {
+            if (action.getId() == GuidedAction.ACTION_ID_FINISH) {
+                finishGuidedStepFragments();
+            } else if (action.getId() == BACK) {
+                // pop 4, 3, 2
+                popBackStackToGuidedStepFragment(SecondStepFragment.class,
+                        FragmentManager.POP_BACK_STACK_INCLUSIVE);
+            }
+        }
+
+    }
+
+}
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/GuidedStepHalfScreenActivity.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/GuidedStepHalfScreenActivity.java
new file mode 100644
index 0000000..4e8b33f
--- /dev/null
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/GuidedStepHalfScreenActivity.java
@@ -0,0 +1,141 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.leanback;
+
+import android.app.Activity;
+import android.app.FragmentManager;
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+import android.os.Bundle;
+import android.support.v17.leanback.app.GuidedStepFragment;
+import android.support.v17.leanback.widget.GuidanceStylist;
+import android.support.v17.leanback.widget.GuidanceStylist.Guidance;
+import android.support.v17.leanback.widget.GuidedAction;
+import android.util.Log;
+
+import java.util.List;
+
+/**
+ * Activity that showcases different aspects of GuidedStepFragments in half
+ * screen mode. This is achieved by setting the theme for this activity
+ * to {@code Theme.Example.Leanback.GuidedStep.Half}.
+ */
+public class GuidedStepHalfScreenActivity extends Activity {
+    private static final String TAG = "leanback.GuidedStepSupportHalfScreenActivity";
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        Log.v(TAG, "onCreate");
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.guided_step_activity);
+        GuidedStepFragment.addAsRoot(this, new FirstStepFragment(), R.id.lb_guidedstep_host);
+    }
+
+    public static class FirstStepFragment extends GuidedStepFragment {
+
+       @Override
+        public Guidance onCreateGuidance(Bundle savedInstanceState) {
+            String title = getString(R.string.guidedstep_first_title);
+            String breadcrumb = getString(R.string.guidedstep_first_breadcrumb);
+            String description = getString(R.string.guidedstep_first_description);
+            Drawable icon = getActivity().getResources().getDrawable(R.drawable.ic_main_icon);
+            return new Guidance(title, description, breadcrumb, icon);
+        }
+
+        @Override
+        public void onCreateActions(List<GuidedAction> actions, Bundle savedInstanceState) {
+            Context context = getActivity();
+            actions.add(new GuidedAction.Builder(context)
+                    .clickAction(GuidedAction.ACTION_ID_CONTINUE)
+                    .description("Just do it")
+                    .build());
+            actions.add(new GuidedAction.Builder(context)
+                    .clickAction(GuidedAction.ACTION_ID_CANCEL)
+                    .description("Never mind")
+                    .build());
+        }
+
+        public FirstStepFragment() {
+            setEntranceTransitionType(GuidedStepFragment.SLIDE_FROM_BOTTOM);
+        }
+
+        /**
+         * This fragment could be used by an activity using theme
+         * {@code Theme.Leanback.GuidedStep.Half} or something else (BrowseActivity).
+         * In order to provide a consistent half screen experience under
+         * both scenarios, we override onProvideTheme method.
+         */
+        @Override
+        public int onProvideTheme() {
+            return R.style.Theme_Example_Leanback_GuidedStep_Half;
+        }
+
+        @Override
+        public void onGuidedActionClicked(GuidedAction action) {
+            FragmentManager fm = getFragmentManager();
+            if (action.getId() == GuidedAction.ACTION_ID_CONTINUE) {
+                GuidedStepFragment.add(fm, new SecondStepFragment(), R.id.lb_guidedstep_host);
+            } else if (action.getId() == GuidedAction.ACTION_ID_CANCEL){
+                finishGuidedStepFragments();
+            }
+        }
+    }
+
+    public static class SecondStepFragment extends GuidedStepFragment {
+
+        @Override
+        public int onProvideTheme() {
+            return R.style.Theme_Example_Leanback_GuidedStep_Half;
+        }
+
+        @Override
+        public Guidance onCreateGuidance(Bundle savedInstanceState) {
+            String title = getString(R.string.guidedstep_second_title);
+            String breadcrumb = getString(R.string.guidedstep_second_breadcrumb);
+            String description = getString(R.string.guidedstep_second_description);
+            Drawable icon = getActivity().getResources().getDrawable(R.drawable.ic_main_icon);
+            return new Guidance(title, description, breadcrumb, icon);
+        }
+
+        @Override
+        public void onCreateActions(List<GuidedAction> actions, Bundle savedInstanceState) {
+            Context context = getActivity();
+            actions.add(new GuidedAction.Builder(context)
+                    .clickAction(GuidedAction.ACTION_ID_FINISH)
+                    .description("Done")
+                    .build());
+            actions.add(new GuidedAction.Builder(context)
+                    .clickAction(GuidedAction.ACTION_ID_CANCEL)
+                    .description("Never mind")
+                    .build());
+        }
+
+        @Override
+        public void onCreateButtonActions(List<GuidedAction> actions, Bundle savedInstanceState) {
+            actions.add(new GuidedAction.Builder(getActivity())
+                    .clickAction(GuidedAction.ACTION_ID_CANCEL)
+                    .description("Cancel")
+                    .build());
+        }
+
+        @Override
+        public void onGuidedActionClicked(GuidedAction action) {
+            FragmentManager fm = getFragmentManager();
+            fm.popBackStack();
+        }
+    }
+}
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/GuidedStepSupportActivity.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/GuidedStepSupportActivity.java
new file mode 100644
index 0000000..6aaaa69
--- /dev/null
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/GuidedStepSupportActivity.java
@@ -0,0 +1,562 @@
+/* This file is auto-generated from GuidedStepActivity.java.  DO NOT MODIFY. */
+
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.leanback;
+
+import android.support.v4.app.FragmentActivity;
+import android.support.v4.app.FragmentManager;
+import android.content.Context;
+import android.content.Intent;
+import android.content.res.Configuration;
+import android.graphics.drawable.Drawable;
+import android.os.Bundle;
+import android.support.v17.leanback.app.GuidedStepSupportFragment;
+import android.support.v17.leanback.widget.GuidanceStylist;
+import android.support.v17.leanback.widget.GuidanceStylist.Guidance;
+import android.support.v17.leanback.widget.GuidedAction;
+import android.support.v17.leanback.widget.GuidedActionsStylist;
+import android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder;
+import android.support.v17.leanback.widget.GuidedDatePickerAction;
+import android.text.InputType;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.ViewGroup;
+import android.view.ViewTreeObserver.OnGlobalLayoutListener;
+import android.view.inputmethod.EditorInfo;
+
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.List;
+
+/**
+ * Activity that showcases different aspects of GuidedStepSupportFragments.
+ */
+public class GuidedStepSupportActivity extends FragmentActivity {
+
+    private static final int BACK = 2;
+
+    private static final int FIRST_NAME = 3;
+    private static final int LAST_NAME = 4;
+    private static final int PASSWORD = 5;
+    private static final int PAYMENT = 6;
+    private static final int NEW_PAYMENT = 7;
+    private static final int PAYMENT_EXPIRE = 8;
+
+    private static final long RADIO_ID_BASE = 0;
+    private static final long CHECKBOX_ID_BASE = 100;
+
+    private static final long DEFAULT_OPTION = RADIO_ID_BASE;
+
+    private static final String[] OPTION_NAMES = { "Option A", "Option B", "Option C" };
+    private static final String[] OPTION_DESCRIPTIONS = { "Here's one thing you can do",
+            "Here's another thing you can do", "Here's one more thing you can do" };
+
+    private static final String TAG = GuidedStepSupportActivity.class.getSimpleName();
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        Log.v(TAG, "onCreate");
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.guided_step_activity);
+        if (savedInstanceState == null) {
+            GuidedStepSupportFragment.addAsRoot(this, new FirstStepFragment(), R.id.lb_guidedstep_host);
+        }
+    }
+
+    @Override
+    public void onConfigurationChanged(Configuration newConfig) {
+        Log.v(TAG, "onConfigurationChanged");
+        super.onConfigurationChanged(newConfig);
+    }
+
+    @Override
+    protected void onSaveInstanceState(Bundle outState) {
+        Log.v(TAG, "onSaveInstanceState");
+        super.onSaveInstanceState(outState);
+    }
+
+    @Override
+    protected void onRestoreInstanceState(Bundle savedInstanceState) {
+        Log.v(TAG, "onRestoreInstanceState");
+        super.onRestoreInstanceState(savedInstanceState);
+    }
+
+    private static void addAction(List<GuidedAction> actions, long id, String title, String desc) {
+        actions.add(new GuidedAction.Builder()
+                .id(id)
+                .title(title)
+                .description(desc)
+                .build());
+    }
+
+    private static void addAction(List<GuidedAction> actions, long id, String title, String desc,
+            List<GuidedAction> subActions) {
+        actions.add(new GuidedAction.Builder()
+                .id(id)
+                .title(title)
+                .description(desc)
+                .subActions(subActions)
+                .build());
+    }
+
+    private static void addEditableAction(Context context, List<GuidedAction> actions,
+            long id, String title, String desc) {
+        actions.add(new GuidedAction.Builder(context)
+                .id(id)
+                .title(title)
+                .description(desc)
+                .editable(true)
+                .icon(R.drawable.lb_ic_search_mic)
+                .build());
+    }
+
+    private static void addEditableAction(List<GuidedAction> actions, long id, String title,
+            String editTitle, String desc) {
+        actions.add(new GuidedAction.Builder()
+                .id(id)
+                .title(title)
+                .editTitle(editTitle)
+                .description(desc)
+                .editable(true)
+                .build());
+    }
+
+    private static void addEditableAction(List<GuidedAction> actions, long id, String title,
+            String editTitle, int editInputType, String desc, String editDesc) {
+        actions.add(new GuidedAction.Builder()
+                .id(id)
+                .title(title)
+                .editTitle(editTitle)
+                .editInputType(editInputType)
+                .description(desc)
+                .editDescription(editDesc)
+                .editable(true)
+                .build());
+    }
+
+    private static void addDatePickerAction(List<GuidedAction> actions, long id, String title) {
+        actions.add(new GuidedDatePickerAction.Builder(null)
+                .id(id)
+                .title(title)
+                .datePickerFormat("MY")
+                .build());
+    }
+
+    private static void addEditableDescriptionAction(List<GuidedAction> actions, long id,
+            String title, String desc, String editDescription, int descriptionEditInputType) {
+        actions.add(new GuidedAction.Builder()
+                .id(id)
+                .title(title)
+                .description(desc)
+                .editDescription(editDescription)
+                .descriptionEditInputType(descriptionEditInputType)
+                .descriptionEditable(true)
+                .build());
+    }
+
+    private static void addCheckedAction(List<GuidedAction> actions, long id, Context context,
+            String title, String desc, int checkSetId) {
+        actions.add(new GuidedAction.Builder()
+                .id(id)
+                .title(title)
+                .description(desc)
+                .checkSetId(checkSetId)
+                .build());
+    }
+
+    public static class FirstStepFragment extends GuidedStepSupportFragment {
+
+        @Override
+        public int onProvideTheme() {
+            return R.style.Theme_Example_Leanback_GuidedStep_First;
+        }
+
+        @Override
+        public Guidance onCreateGuidance(Bundle savedInstanceState) {
+            String title = getString(R.string.guidedstep_first_title);
+            String breadcrumb = getString(R.string.guidedstep_first_breadcrumb);
+            String description = getString(R.string.guidedstep_first_description);
+            Drawable icon = getActivity().getResources().getDrawable(R.drawable.ic_main_icon);
+            return new Guidance(title, description, breadcrumb, icon);
+        }
+
+        @Override
+        public void onCreateActions(List<GuidedAction> actions, Bundle savedInstanceState) {
+            Context context = getActivity();
+            actions.add(new GuidedAction.Builder(context)
+                    .clickAction(GuidedAction.ACTION_ID_CONTINUE)
+                    .description("Let's do it")
+                    .build());
+            actions.add(new GuidedAction.Builder(context)
+                    .clickAction(GuidedAction.ACTION_ID_CANCEL)
+                    .description("Never mind")
+                    .build());
+        }
+
+        @Override
+        public void onGuidedActionClicked(GuidedAction action) {
+            FragmentManager fm = getFragmentManager();
+            if (action.getId() == GuidedAction.ACTION_ID_CONTINUE) {
+                GuidedStepSupportFragment.add(fm, new SecondStepFragment(), R.id.lb_guidedstep_host);
+            } else if (action.getId() == GuidedAction.ACTION_ID_CANCEL){
+                finishGuidedStepSupportFragments();
+            }
+        }
+    }
+
+    static ArrayList<String> sCards = new ArrayList<String>();
+    static int sSelectedCard = -1;
+    static {
+        sCards.add("Visa-1234");
+        sCards.add("Master-4321");
+    }
+
+    public static class NewPaymentStepFragment extends GuidedStepSupportFragment {
+
+        @Override
+        public Guidance onCreateGuidance(Bundle savedInstanceState) {
+            String title = getString(R.string.guidedstep_newpayment_title);
+            String breadcrumb = getString(R.string.guidedstep_newpayment_breadcrumb);
+            String description = getString(R.string.guidedstep_newpayment_description);
+            Drawable icon = getActivity().getResources().getDrawable(R.drawable.ic_main_icon);
+            return new Guidance(title, description, breadcrumb, icon);
+        }
+
+        @Override
+        public void onCreateActions(List<GuidedAction> actions, Bundle savedInstanceState) {
+            addEditableAction(actions, NEW_PAYMENT, "Input credit card number", "",
+                    InputType.TYPE_CLASS_NUMBER,
+                    "Input credit card number", "Input credit card number");
+            addDatePickerAction(actions, PAYMENT_EXPIRE, "Exp:");
+        }
+
+        @Override
+        public void onCreateButtonActions(List<GuidedAction> actions, Bundle savedInstanceState) {
+            Context context = getActivity();
+            actions.add(new GuidedAction.Builder(context).clickAction(GuidedAction.ACTION_ID_OK)
+                    .build());
+            actions.get(actions.size() - 1).setEnabled(false);
+        }
+
+        @Override
+        public void onGuidedActionClicked(GuidedAction action) {
+            if (action.getId() == GuidedAction.ACTION_ID_OK) {
+                CharSequence desc = findActionById(NEW_PAYMENT).getDescription();
+                String cardNumber = desc.subSequence(desc.length() - 4, desc.length()).toString();
+                String card;
+                if ((Integer.parseInt(cardNumber) & 1) == 0) {
+                    card = "Visa "+cardNumber;
+                } else {
+                    card = "Master "+cardNumber;
+                }
+                sSelectedCard = sCards.size();
+                sCards.add(card);
+                popBackStackToGuidedStepSupportFragment(NewPaymentStepFragment.class,
+                        FragmentManager.POP_BACK_STACK_INCLUSIVE);
+            }
+        }
+
+        @Override
+        public long onGuidedActionEditedAndProceed(GuidedAction action) {
+            if (action.getId() == NEW_PAYMENT) {
+                CharSequence editTitle = action.getEditTitle();
+                if (isCardNumberValid(editTitle)) {
+                    editTitle = editTitle.subSequence(editTitle.length() - 4, editTitle.length());
+                    action.setDescription("Visa XXXX-XXXX-XXXX-" + editTitle);
+                    updateOkButton(isExpDateValid(findActionById(PAYMENT_EXPIRE)));
+                    return GuidedAction.ACTION_ID_NEXT;
+                } else if (editTitle.length() == 0) {
+                    action.setDescription("Input credit card number");
+                    updateOkButton(false);
+                    return GuidedAction.ACTION_ID_CURRENT;
+                } else {
+                    action.setDescription("Error credit card number");
+                    updateOkButton(false);
+                    return GuidedAction.ACTION_ID_CURRENT;
+                }
+            } else if (action.getId() == PAYMENT_EXPIRE) {
+                updateOkButton(isExpDateValid(action) &&
+                        isCardNumberValid(findActionById(NEW_PAYMENT).getEditTitle()));
+            }
+            return GuidedAction.ACTION_ID_NEXT;
+        }
+
+        boolean isCardNumberValid(CharSequence number) {
+            return TextUtils.isDigitsOnly(number) && number.length() == 16;
+        }
+
+        boolean isExpDateValid(GuidedAction action) {
+            long date = ((GuidedDatePickerAction) action).getDate();
+            Calendar c = Calendar.getInstance();
+            c.setTimeInMillis(date);
+            return Calendar.getInstance().before(c);
+        }
+
+        void updateOkButton(boolean enabled) {
+            findButtonActionById(GuidedAction.ACTION_ID_OK).setEnabled(enabled);
+            notifyButtonActionChanged(findButtonActionPositionById(GuidedAction.ACTION_ID_OK));
+        }
+    }
+
+    public static class SecondStepFragment extends GuidedStepSupportFragment {
+
+        public GuidedActionsStylist onCreateActionsStylist() {
+            return new GuidedActionsStylist() {
+                protected void setupImeOptions(GuidedActionsStylist.ViewHolder vh,
+                        GuidedAction action) {
+                    if (action.getId() == PASSWORD) {
+                        vh.getEditableDescriptionView().setImeActionLabel("Confirm!",
+                                EditorInfo.IME_ACTION_DONE);
+                    } else {
+                        super.setupImeOptions(vh, action);
+                    }
+                }
+            };
+        }
+
+        @Override
+        public Guidance onCreateGuidance(Bundle savedInstanceState) {
+            String title = getString(R.string.guidedstep_second_title);
+            String breadcrumb = getString(R.string.guidedstep_second_breadcrumb);
+            String description = getString(R.string.guidedstep_second_description);
+            Drawable icon = getActivity().getResources().getDrawable(R.drawable.ic_main_icon);
+            return new Guidance(title, description, breadcrumb, icon);
+        }
+
+        @Override
+        public void onCreateActions(List<GuidedAction> actions, Bundle savedInstanceState) {
+            addEditableAction(getContext(), actions, FIRST_NAME, "Pat", "Your first name");
+            addEditableAction(getContext(), actions, LAST_NAME, "Smith", "Your last name");
+            List<GuidedAction> subActions = new ArrayList<GuidedAction>();
+            addAction(actions, PAYMENT, "Select Payment", "", subActions);
+            addEditableDescriptionAction(actions, PASSWORD, "Password", "", "",
+                    InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
+        }
+
+        @Override
+        public void onCreateButtonActions(List<GuidedAction> actions, Bundle savedInstanceState) {
+            actions.add(new GuidedAction.Builder(getActivity())
+                    .clickAction(GuidedAction.ACTION_ID_CONTINUE)
+                    .description("Continue")
+                    .build());
+        }
+
+        @Override
+        public void onGuidedActionClicked(GuidedAction action) {
+            if (action.getId() == GuidedAction.ACTION_ID_CONTINUE) {
+                FragmentManager fm = getFragmentManager();
+                GuidedStepSupportFragment.add(fm, new ThirdStepFragment(), R.id.lb_guidedstep_host);
+            }
+        }
+
+        @Override
+        public long onGuidedActionEditedAndProceed(GuidedAction action) {
+            if (action.getId() == PASSWORD) {
+                CharSequence password = action.getEditDescription();
+                if (password.length() > 0) {
+                    if (isPaymentValid()) {
+                        updateContinue(true);
+                        return GuidedAction.ACTION_ID_NEXT;
+                    } else {
+                        updateContinue(false);
+                        return GuidedAction.ACTION_ID_CURRENT;
+                    }
+                } else {
+                    updateContinue(false);
+                    return GuidedAction.ACTION_ID_CURRENT;
+                }
+            }
+            return GuidedAction.ACTION_ID_NEXT;
+        }
+
+        @Override
+        public boolean onSubGuidedActionClicked(GuidedAction action) {
+            if (action.isChecked()) {
+                String payment = action.getTitle().toString();
+                for (int i = 0; i < sCards.size(); i++) {
+                    if (payment.equals(sCards.get(i))) {
+                        sSelectedCard = i;
+                        findActionById(PAYMENT).setDescription(payment);
+                        notifyActionChanged(findActionPositionById(PAYMENT));
+                        updateContinue(isPasswordValid());
+                        break;
+                    }
+                }
+                return true;
+            } else {
+                FragmentManager fm = getFragmentManager();
+                GuidedStepSupportFragment.add(fm, new NewPaymentStepFragment(), R.id.lb_guidedstep_host);
+                return false;
+            }
+        }
+
+        @Override
+        public void onResume() {
+            super.onResume();
+            // when resumed, update sub actions list and selected index from data model.
+            GuidedAction payments = findActionById(PAYMENT);
+            payments.getSubActions().clear();
+            for (int i = 0; i < sCards.size(); i++) {
+                addCheckedAction(payments.getSubActions(), -1, getActivity(), sCards.get(i), "",
+                        GuidedAction.DEFAULT_CHECK_SET_ID);
+                if (i == sSelectedCard) {
+                    payments.getSubActions().get(i).setChecked(true);
+                }
+            }
+            addAction(payments.getSubActions(), NEW_PAYMENT, "Add New Card", "");
+            if (sSelectedCard != -1) {
+                payments.setDescription(sCards.get(sSelectedCard));
+            }
+            notifyActionChanged(findActionPositionById(PAYMENT));
+            updateContinue(isPasswordValid() && isPaymentValid());
+        }
+
+        boolean isPaymentValid() {
+            CharSequence paymentType = findActionById(PAYMENT).getDescription();
+            return (paymentType.length() >= 4 &&
+                    paymentType.subSequence(0, 4).toString().equals("Visa")) ||
+                    (paymentType.length() >= 6 &&
+                    paymentType.subSequence(0, 6).toString().equals("Master"));
+        }
+
+        boolean isPasswordValid() {
+            return findActionById(PASSWORD).getEditDescription().length() > 0;
+        }
+
+        void updateContinue(boolean enabled) {
+            findButtonActionById(GuidedAction.ACTION_ID_CONTINUE).setEnabled(enabled);
+            notifyButtonActionChanged(findButtonActionPositionById(
+                    GuidedAction.ACTION_ID_CONTINUE));
+        }
+    }
+
+    public static class ThirdStepFragment extends GuidedStepSupportFragment {
+
+        private long mSelectedOption = DEFAULT_OPTION;
+
+        @Override
+        public Guidance onCreateGuidance(Bundle savedInstanceState) {
+            String title = getString(R.string.guidedstep_third_title);
+            String breadcrumb = getString(R.string.guidedstep_third_breadcrumb);
+            String description = getString(R.string.guidedstep_third_description);
+            Drawable icon = getActivity().getResources().getDrawable(R.drawable.ic_main_icon);
+            return new Guidance(title, description, breadcrumb, icon);
+        }
+
+        @Override
+        public GuidanceStylist onCreateGuidanceStylist() {
+            return new GuidanceStylist() {
+                @Override
+                public int onProvideLayoutId() {
+                    return R.layout.guidedstep_second_guidance;
+                }
+            };
+        }
+
+        @Override
+        public void onCreateActions(List<GuidedAction> actions, Bundle savedInstanceState) {
+            String desc = "The description can be quite long as well.  " +
+                    "Just be sure to set multilineDescription to true in the GuidedAction.";
+            actions.add(new GuidedAction.Builder()
+                    .title("Note that Guided Actions can have titles that are quite long.")
+                    .description(desc)
+                    .multilineDescription(true)
+                    .infoOnly(true)
+                    .enabled(true)
+                    .focusable(false)
+                    .build());
+            for (int i = 0; i < OPTION_NAMES.length; i++) {
+                addCheckedAction(actions, RADIO_ID_BASE + i, getActivity(), OPTION_NAMES[i],
+                        OPTION_DESCRIPTIONS[i], GuidedAction.DEFAULT_CHECK_SET_ID);
+                if (i == DEFAULT_OPTION) {
+                    actions.get(actions.size() -1).setChecked(true);
+                }
+            }
+            for (int i = 0; i < OPTION_NAMES.length; i++) {
+                addCheckedAction(actions, CHECKBOX_ID_BASE + i, getActivity(), OPTION_NAMES[i],
+                        OPTION_DESCRIPTIONS[i], GuidedAction.CHECKBOX_CHECK_SET_ID);
+            }
+        }
+
+        @Override
+        public void onCreateButtonActions(List<GuidedAction> actions, Bundle savedInstanceState) {
+            actions.add(new GuidedAction.Builder(getActivity())
+                    .clickAction(GuidedAction.ACTION_ID_CONTINUE)
+                    .build());
+        }
+
+        @Override
+        public void onGuidedActionClicked(GuidedAction action) {
+            if (action.getId() == GuidedAction.ACTION_ID_CONTINUE) {
+                FragmentManager fm = getFragmentManager();
+                FourthStepFragment f = new FourthStepFragment();
+                Bundle arguments = new Bundle();
+                arguments.putLong(FourthStepFragment.EXTRA_OPTION, mSelectedOption);
+                f.setArguments(arguments);
+                GuidedStepSupportFragment.add(fm, f, R.id.lb_guidedstep_host);
+            } else if (action.getCheckSetId() == GuidedAction.DEFAULT_CHECK_SET_ID) {
+                mSelectedOption = action.getId();
+            }
+        }
+
+    }
+
+    public static class FourthStepFragment extends GuidedStepSupportFragment {
+        public static final String EXTRA_OPTION = "extra_option";
+
+        public FourthStepFragment() {
+        }
+
+        public long getOption() {
+            Bundle b = getArguments();
+            if (b == null) return 0;
+            return b.getLong(EXTRA_OPTION, 0);
+        }
+
+        @Override
+        public Guidance onCreateGuidance(Bundle savedInstanceState) {
+            String title = getString(R.string.guidedstep_fourth_title);
+            String breadcrumb = getString(R.string.guidedstep_fourth_breadcrumb);
+            String description = "You chose: " + OPTION_NAMES[(int) getOption()];
+            Drawable icon = getActivity().getResources().getDrawable(R.drawable.ic_main_icon);
+            return new Guidance(title, description, breadcrumb, icon);
+        }
+
+        @Override
+        public void onCreateActions(List<GuidedAction> actions, Bundle savedInstanceState) {
+            actions.add(new GuidedAction.Builder(getActivity())
+                    .clickAction(GuidedAction.ACTION_ID_FINISH)
+                    .description("All Done...")
+                    .build());
+            addAction(actions, BACK, "Start Over", "Let's try this again...");
+        }
+
+        @Override
+        public void onGuidedActionClicked(GuidedAction action) {
+            if (action.getId() == GuidedAction.ACTION_ID_FINISH) {
+                finishGuidedStepSupportFragments();
+            } else if (action.getId() == BACK) {
+                // pop 4, 3, 2
+                popBackStackToGuidedStepSupportFragment(SecondStepFragment.class,
+                        FragmentManager.POP_BACK_STACK_INCLUSIVE);
+            }
+        }
+
+    }
+
+}
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/GuidedStepSupportHalfScreenActivity.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/GuidedStepSupportHalfScreenActivity.java
new file mode 100644
index 0000000..388a559
--- /dev/null
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/GuidedStepSupportHalfScreenActivity.java
@@ -0,0 +1,143 @@
+/* This file is auto-generated from GuidedStepHalfScreenActivity.java.  DO NOT MODIFY. */
+
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.leanback;
+
+import android.support.v4.app.FragmentActivity;
+import android.support.v4.app.FragmentManager;
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+import android.os.Bundle;
+import android.support.v17.leanback.app.GuidedStepSupportFragment;
+import android.support.v17.leanback.widget.GuidanceStylist;
+import android.support.v17.leanback.widget.GuidanceStylist.Guidance;
+import android.support.v17.leanback.widget.GuidedAction;
+import android.util.Log;
+
+import java.util.List;
+
+/**
+ * Activity that showcases different aspects of GuidedStepSupportFragments in half
+ * screen mode. This is achieved by setting the theme for this activity
+ * to {@code Theme.Example.Leanback.GuidedStep.Half}.
+ */
+public class GuidedStepSupportHalfScreenActivity extends FragmentActivity {
+    private static final String TAG = "leanback.GuidedStepSupportHalfScreenActivity";
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        Log.v(TAG, "onCreate");
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.guided_step_activity);
+        GuidedStepSupportFragment.addAsRoot(this, new FirstStepFragment(), R.id.lb_guidedstep_host);
+    }
+
+    public static class FirstStepFragment extends GuidedStepSupportFragment {
+
+       @Override
+        public Guidance onCreateGuidance(Bundle savedInstanceState) {
+            String title = getString(R.string.guidedstep_first_title);
+            String breadcrumb = getString(R.string.guidedstep_first_breadcrumb);
+            String description = getString(R.string.guidedstep_first_description);
+            Drawable icon = getActivity().getResources().getDrawable(R.drawable.ic_main_icon);
+            return new Guidance(title, description, breadcrumb, icon);
+        }
+
+        @Override
+        public void onCreateActions(List<GuidedAction> actions, Bundle savedInstanceState) {
+            Context context = getActivity();
+            actions.add(new GuidedAction.Builder(context)
+                    .clickAction(GuidedAction.ACTION_ID_CONTINUE)
+                    .description("Just do it")
+                    .build());
+            actions.add(new GuidedAction.Builder(context)
+                    .clickAction(GuidedAction.ACTION_ID_CANCEL)
+                    .description("Never mind")
+                    .build());
+        }
+
+        public FirstStepFragment() {
+            setEntranceTransitionType(GuidedStepSupportFragment.SLIDE_FROM_BOTTOM);
+        }
+
+        /**
+         * This fragment could be used by an activity using theme
+         * {@code Theme.Leanback.GuidedStep.Half} or something else (BrowseActivity).
+         * In order to provide a consistent half screen experience under
+         * both scenarios, we override onProvideTheme method.
+         */
+        @Override
+        public int onProvideTheme() {
+            return R.style.Theme_Example_Leanback_GuidedStep_Half;
+        }
+
+        @Override
+        public void onGuidedActionClicked(GuidedAction action) {
+            FragmentManager fm = getFragmentManager();
+            if (action.getId() == GuidedAction.ACTION_ID_CONTINUE) {
+                GuidedStepSupportFragment.add(fm, new SecondStepFragment(), R.id.lb_guidedstep_host);
+            } else if (action.getId() == GuidedAction.ACTION_ID_CANCEL){
+                finishGuidedStepSupportFragments();
+            }
+        }
+    }
+
+    public static class SecondStepFragment extends GuidedStepSupportFragment {
+
+        @Override
+        public int onProvideTheme() {
+            return R.style.Theme_Example_Leanback_GuidedStep_Half;
+        }
+
+        @Override
+        public Guidance onCreateGuidance(Bundle savedInstanceState) {
+            String title = getString(R.string.guidedstep_second_title);
+            String breadcrumb = getString(R.string.guidedstep_second_breadcrumb);
+            String description = getString(R.string.guidedstep_second_description);
+            Drawable icon = getActivity().getResources().getDrawable(R.drawable.ic_main_icon);
+            return new Guidance(title, description, breadcrumb, icon);
+        }
+
+        @Override
+        public void onCreateActions(List<GuidedAction> actions, Bundle savedInstanceState) {
+            Context context = getActivity();
+            actions.add(new GuidedAction.Builder(context)
+                    .clickAction(GuidedAction.ACTION_ID_FINISH)
+                    .description("Done")
+                    .build());
+            actions.add(new GuidedAction.Builder(context)
+                    .clickAction(GuidedAction.ACTION_ID_CANCEL)
+                    .description("Never mind")
+                    .build());
+        }
+
+        @Override
+        public void onCreateButtonActions(List<GuidedAction> actions, Bundle savedInstanceState) {
+            actions.add(new GuidedAction.Builder(getActivity())
+                    .clickAction(GuidedAction.ACTION_ID_CANCEL)
+                    .description("Cancel")
+                    .build());
+        }
+
+        @Override
+        public void onGuidedActionClicked(GuidedAction action) {
+            FragmentManager fm = getFragmentManager();
+            fm.popBackStack();
+        }
+    }
+}
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/HorizontalGridTestActivity.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/HorizontalGridTestActivity.java
new file mode 100644
index 0000000..59155af
--- /dev/null
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/HorizontalGridTestActivity.java
@@ -0,0 +1,172 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.leanback;
+
+import android.support.v7.widget.RecyclerView;
+import android.support.v17.leanback.widget.HorizontalGridView;
+import android.support.v17.leanback.widget.OnChildSelectedListener;
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.BitmapFactory;
+import android.graphics.Color;
+import android.graphics.drawable.ColorDrawable;
+import android.graphics.drawable.Drawable;
+import android.net.Uri;
+import android.os.Bundle;
+import android.util.Log;
+import android.util.SparseArray;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.view.View.OnFocusChangeListener;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import java.io.File;
+
+public class HorizontalGridTestActivity extends Activity {
+    private static final String TAG = "HorizontalGridTestActivity";
+    private static final boolean DEBUG = true;
+    private static final String SELECT_ACTION = "android.test.leanback.widget.SELECT";
+    private static final int NUM_ITEMS = 100;
+    private static final boolean STAGGERED = true;
+
+    private HorizontalGridView mHorizontalGridView;
+    private int mScrollState = RecyclerView.SCROLL_STATE_IDLE;
+
+    private RecyclerView.OnScrollListener mScrollListener = new RecyclerView.OnScrollListener() {
+        @Override
+        public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
+            if (DEBUG) {
+                final String[] stateNames = { "IDLE", "DRAGGING", "SETTLING" };
+                Log.v(TAG, "onScrollStateChanged "
+                        + (newState < stateNames.length ? stateNames[newState] : newState));
+            }
+            mScrollState = newState;
+        }
+    };
+
+    private View createView() {
+        View view = getLayoutInflater().inflate(R.layout.horizontal_grid, null, false);
+        mHorizontalGridView = (HorizontalGridView) view.findViewById(R.id.gridview);
+
+        mHorizontalGridView.setWindowAlignment(HorizontalGridView.WINDOW_ALIGN_BOTH_EDGE);
+        mHorizontalGridView.setWindowAlignmentOffsetPercent(35);
+        mHorizontalGridView.setOnChildSelectedListener(new OnChildSelectedListener() {
+            @Override
+            public void onChildSelected(ViewGroup parent, View view, int position, long id) {
+                if (DEBUG) Log.d(TAG, "onChildSelected position=" + position +  " id="+id);
+            }
+        });
+        return view;
+    }
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        if (DEBUG) Log.v(TAG, "onCreate");
+
+        RecyclerView.Adapter adapter = new MyAdapter();
+
+        View view = createView();
+
+        mHorizontalGridView.setAdapter(new MyAdapter());
+        setContentView(view);
+
+        mHorizontalGridView.setOnScrollListener(mScrollListener);
+    }
+
+    @Override
+    protected void onNewIntent(Intent intent) {
+        if (DEBUG) Log.v(TAG, "onNewIntent " + intent);
+        if (intent.getAction().equals(SELECT_ACTION)) {
+            int position = intent.getIntExtra("SELECT_POSITION", -1);
+            if (position >= 0) {
+                mHorizontalGridView.setSelectedPosition(position);
+            }
+        }
+        super.onNewIntent(intent);
+    }
+
+    private OnFocusChangeListener mItemFocusChangeListener = new OnFocusChangeListener() {
+
+        @Override
+        public void onFocusChange(View v, boolean hasFocus) {
+            if (hasFocus) {
+                v.setBackgroundColor(Color.YELLOW);
+            } else {
+                v.setBackgroundColor(Color.LTGRAY);
+            }
+        }
+    };
+
+    private OnClickListener mItemClickListener = new OnClickListener() {
+        @Override
+        public void onClick(View v) {
+            mHorizontalGridView.getAdapter().notifyDataSetChanged();
+        }
+    };
+
+    class MyAdapter extends RecyclerView.Adapter {
+
+        private int[] mItemLengths;
+
+        MyAdapter() {
+            mItemLengths = new int[NUM_ITEMS];
+            for (int i = 0; i < mItemLengths.length; i++) {
+                mItemLengths[i] = STAGGERED ? (int)(Math.random() * 180) + 180 : 240;
+            }
+        }
+
+        @Override
+        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+            if (DEBUG) Log.v(TAG, "createViewHolder " + viewType);
+            TextView textView = new TextView(parent.getContext());
+            textView.setTextColor(Color.BLACK);
+            textView.setFocusable(true);
+            textView.setFocusableInTouchMode(true);
+            textView.setOnFocusChangeListener(mItemFocusChangeListener);
+            textView.setOnClickListener(mItemClickListener);
+            return new ViewHolder(textView);
+        }
+
+        @Override
+        public void onBindViewHolder(RecyclerView.ViewHolder baseHolder, int position) {
+            if (DEBUG) Log.v(TAG, "bindViewHolder " + position + " " + baseHolder);
+            ViewHolder holder = (ViewHolder) baseHolder;
+            ((TextView) holder.itemView).setText("Item "+position);
+            holder.itemView.setBackgroundColor(Color.LTGRAY);
+            holder.itemView.setLayoutParams(new ViewGroup.MarginLayoutParams(mItemLengths[position],
+                    80));
+        }
+
+        @Override
+        public int getItemCount() {
+            return mItemLengths.length;
+        }
+    }
+
+    static class ViewHolder extends RecyclerView.ViewHolder {
+
+        public ViewHolder(View v) {
+            super(v);
+        }
+    }
+}
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/MainActivity.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/MainActivity.java
new file mode 100644
index 0000000..298ef70
--- /dev/null
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/MainActivity.java
@@ -0,0 +1,134 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.leanback;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.graphics.drawable.Drawable;
+import android.os.Bundle;
+import android.support.v17.leanback.app.GuidedStepFragment;
+import android.support.v17.leanback.widget.GuidanceStylist.Guidance;
+import android.support.v17.leanback.widget.GuidedAction;
+import android.support.v4.app.ActivityOptionsCompat;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Activity that allows navigation among the demo activities.
+ */
+public class MainActivity extends Activity {
+
+    private GuidedStepFragment mGuidedStepFragment;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        mGuidedStepFragment = new StepFragment();
+        GuidedStepFragment.addAsRoot(this, mGuidedStepFragment, android.R.id.content);
+    }
+
+    public static class StepFragment extends GuidedStepFragment {
+
+        @Override
+        public Guidance onCreateGuidance(Bundle savedInstanceState) {
+            String title = getString(R.string.main_title);
+            String breadcrumb = getString(R.string.main_breadcrumb);
+            String description = "";
+            Drawable icon = getActivity().getResources().getDrawable(R.drawable.ic_main_icon);
+            return new Guidance(title, description, breadcrumb, icon);
+        }
+
+        @Override
+        public void onCreateActions(List<GuidedAction> actions, Bundle savedInstanceState) {
+            addAction(actions, BrowseActivity.class, R.string.browse, R.string.browse_description);
+            addAction(actions, BrowseSupportActivity.class, R.string.browse_support,
+                    R.string.browse_support_description);
+            addAction(actions, SearchActivity.class, R.string.search, R.string.search_description);
+            addAction(actions, SearchSupportActivity.class, R.string.search_support, R.string.search_support_description);
+            addAction(actions, DetailsActivity.class, R.string.details, R.string.details_description);
+            actions.get(actions.size()-1).getIntent().putExtra(DetailsActivity.EXTRA_ITEM,
+                    new PhotoItem("Hello world", R.drawable.gallery_photo_1));
+            addAction(actions, DetailsSupportActivity.class, R.string.details_support, R.string.details_support_description);
+            actions.get(actions.size()-1).getIntent().putExtra(DetailsSupportActivity.EXTRA_ITEM,
+                    new PhotoItem("Hello world", R.drawable.gallery_photo_1));
+            addAction(actions, SearchDetailsActivity.class, R.string.search_details,
+                    R.string.search_details_description);
+            actions.get(actions.size()-1).getIntent().putExtra(SearchDetailsActivity.EXTRA_ITEM,
+                    new PhotoItem("Hello world", R.drawable.gallery_photo_1));
+            addAction(actions, SearchDetailsSupportActivity.class, R.string.search_details_support,
+                    R.string.search_details_support_description);
+            actions.get(actions.size()-1).getIntent().putExtra(SearchDetailsSupportActivity.EXTRA_ITEM,
+                    new PhotoItem("Hello world", R.drawable.gallery_photo_1));
+            addAction(actions, VerticalGridActivity.class, R.string.vgrid,
+                    R.string.vgrid_description);
+            addAction(actions, VerticalGridSupportActivity.class, R.string.vgrid_support,
+                    R.string.vgrid_support_description);
+            addAction(actions, GuidedStepActivity.class, R.string.guidedstep,
+                    R.string.guidedstep_description);
+            addAction(actions, GuidedStepSupportActivity.class, R.string.guidedstepsupport,
+                    R.string.guidedstepsupport_description);
+            addAction(actions, GuidedStepHalfScreenActivity.class, R.string.guidedstephalfscreen,
+                    R.string.guidedstep_description);
+            addAction(actions, GuidedStepSupportHalfScreenActivity.class,
+                R.string.guidedstepsupporthalfscreen,
+                R.string.guidedstep_description);
+            addAction(actions, BrowseErrorActivity.class, R.string.browseerror,
+                    R.string.browseerror_description);
+            addAction(actions, BrowseErrorSupportActivity.class, R.string.browseerror_support,
+                    R.string.browseerror_support_description);
+            addAction(actions, PlaybackOverlayActivity.class, R.string.playback,
+                    R.string.playback_description);
+            addAction(actions, PlaybackOverlaySupportActivity.class, R.string.playback_support,
+                    R.string.playback_support_description);
+            addAction(actions, HorizontalGridTestActivity.class, R.string.hgrid,
+                    R.string.hgrid_description);
+            addAction(actions, DetailsPresenterSelectionActivity.class,
+                    R.string.detail_presenter_options,
+                    R.string.detail_presenter_options_description);
+            addAction(actions, OnboardingActivity.class,
+                    R.string.onboarding,
+                    R.string.onboarding_description);
+            addAction(actions, OnboardingSupportActivity.class,
+                    R.string.onboarding_support,
+                    R.string.onboarding_description);
+        }
+
+        private void addAction(List<GuidedAction> actions, Class cls, int titleRes, int descRes) {
+            actions.add(new GuidedAction.Builder()
+                    .intent(new Intent(getActivity(), cls))
+                    .title(getString(titleRes))
+                    .description(getString(descRes))
+                    .build());
+        }
+
+        @Override
+        public void onGuidedActionClicked(GuidedAction action) {
+            Intent intent = action.getIntent();
+            if (intent != null) {
+                Bundle bundle = ActivityOptionsCompat.makeSceneTransitionAnimation(getActivity())
+                        .toBundle();
+                startActivity(intent, bundle);
+            }
+        }
+
+    }
+}
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/NewDetailsFragment.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/NewDetailsFragment.java
new file mode 100644
index 0000000..4d04502
--- /dev/null
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/NewDetailsFragment.java
@@ -0,0 +1,253 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.example.android.leanback;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.content.res.Resources;
+import android.os.Bundle;
+import android.os.Handler;
+import android.support.v4.app.ActivityOptionsCompat;
+import android.support.v17.leanback.widget.Action;
+import android.support.v17.leanback.widget.ArrayObjectAdapter;
+import android.support.v17.leanback.widget.ClassPresenterSelector;
+import android.support.v17.leanback.widget.DetailsOverviewRow;
+import android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter;
+import android.support.v17.leanback.widget.FullWidthDetailsOverviewSharedElementHelper;
+import android.support.v17.leanback.widget.HeaderItem;
+import android.support.v17.leanback.widget.ImageCardView;
+import android.support.v17.leanback.widget.ListRow;
+import android.support.v17.leanback.widget.ListRowPresenter;
+import android.support.v17.leanback.widget.OnActionClickedListener;
+import android.support.v17.leanback.widget.OnItemViewClickedListener;
+import android.support.v17.leanback.widget.OnItemViewSelectedListener;
+import android.support.v17.leanback.widget.Presenter;
+import android.support.v17.leanback.widget.Row;
+import android.support.v17.leanback.widget.RowPresenter;
+import android.support.v17.leanback.widget.SparseArrayObjectAdapter;
+import android.util.Log;
+import android.view.View;
+import android.widget.Toast;
+
+public class NewDetailsFragment extends android.support.v17.leanback.app.DetailsFragment {
+    private static final String TAG = "leanback.DetailsFragment";
+    private static final String ITEM = "item";
+
+    private static final int NUM_ROWS = 3;
+    private ArrayObjectAdapter mRowsAdapter;
+    private PhotoItem mPhotoItem;
+    final CardPresenter cardPresenter = new CardPresenter();
+    private BackgroundHelper mBackgroundHelper = new BackgroundHelper();
+
+    private static final int ACTION_PLAY = 1;
+    private static final int ACTION_RENT = 2;
+    private static final int ACTION_BUY = 3;
+
+    private boolean TEST_OVERVIEW_ROW_ON_SECOND;
+    private boolean TEST_SHARED_ELEMENT_TRANSITION;
+    private boolean TEST_ENTRANCE_TRANSITION;
+
+    private static final long TIME_TO_LOAD_OVERVIEW_ROW_MS = 1000;
+    private static final long TIME_TO_LOAD_RELATED_ROWS_MS = 2000;
+
+    private Action mActionPlay;
+    private Action mActionRent;
+    private Action mActionBuy;
+
+    private FullWidthDetailsOverviewSharedElementHelper mHelper;
+
+    private void initializeTest() {
+        TEST_SHARED_ELEMENT_TRANSITION = null != getActivity().getWindow().getSharedElementEnterTransition();
+        TEST_OVERVIEW_ROW_ON_SECOND = !TEST_SHARED_ELEMENT_TRANSITION;
+        TEST_ENTRANCE_TRANSITION = true;
+    }
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        Log.i(TAG, "onCreate");
+        super.onCreate(savedInstanceState);
+        initializeTest();
+
+        setBadgeDrawable(getActivity().getResources().getDrawable(R.drawable.ic_title));
+        setTitle("Leanback Sample App");
+        setOnSearchClickedListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                Intent intent = new Intent(getActivity(), SearchActivity.class);
+                startActivity(intent);
+            }
+        });
+
+        mActionPlay = new Action(ACTION_PLAY, "Play");
+        mActionRent = new Action(ACTION_RENT, "Rent", "$3.99",
+                getResources().getDrawable(R.drawable.ic_action_a));
+        mActionBuy = new Action(ACTION_BUY, "Buy $9.99");
+
+        ClassPresenterSelector ps = new ClassPresenterSelector();
+        FullWidthDetailsOverviewRowPresenter dorPresenter =
+                new FullWidthDetailsOverviewRowPresenter(new DetailsDescriptionPresenter());
+        dorPresenter.setOnActionClickedListener(new OnActionClickedListener() {
+            @Override
+            public void onActionClicked(Action action) {
+                Toast.makeText(getActivity(), action.toString(), Toast.LENGTH_SHORT).show();
+                int indexOfOverviewRow = TEST_OVERVIEW_ROW_ON_SECOND ? 1 : 0;
+                DetailsOverviewRow dor = (DetailsOverviewRow) mRowsAdapter.get(indexOfOverviewRow);
+                if (action.getId() == ACTION_BUY) {
+                    // on the UI thread, we can modify actions adapter directly
+                    SparseArrayObjectAdapter actions = (SparseArrayObjectAdapter)
+                            dor.getActionsAdapter();
+                    actions.set(ACTION_PLAY, mActionPlay);
+                    actions.clear(ACTION_RENT);
+                    actions.clear(ACTION_BUY);
+                    dor.setItem(mPhotoItem.getTitle() + "(Owned)");
+                    dor.setImageDrawable(getResources().getDrawable(R.drawable.details_img_16x9));
+                } else if (action.getId() == ACTION_RENT) {
+                    // on the UI thread, we can modify actions adapter directly
+                    SparseArrayObjectAdapter actions = (SparseArrayObjectAdapter)
+                            dor.getActionsAdapter();
+                    actions.set(ACTION_PLAY, mActionPlay);
+                    actions.clear(ACTION_RENT);
+                    dor.setItem(mPhotoItem.getTitle() + "(Rented)");
+                } else if (action.getId() == ACTION_PLAY) {
+                    Intent intent = new Intent(getActivity(), PlaybackOverlayActivity.class);
+                    getActivity().startActivity(intent);
+                }
+            }
+        });
+        if (TEST_OVERVIEW_ROW_ON_SECOND) {
+            dorPresenter.setInitialState(FullWidthDetailsOverviewRowPresenter.STATE_SMALL);
+        }
+
+        ps.addClassPresenter(DetailsOverviewRow.class, dorPresenter);
+        ps.addClassPresenter(ListRow.class, new ListRowPresenter());
+
+        mRowsAdapter = new ArrayObjectAdapter(ps);
+
+        PhotoItem item = (PhotoItem) (savedInstanceState != null ?
+                savedInstanceState.getParcelable(ITEM) : null);
+        if (item != null) {
+            setItem(item);
+        }
+
+        setOnItemViewClickedListener(new OnItemViewClickedListener() {
+            @Override
+            public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
+                    RowPresenter.ViewHolder rowViewHolder, Row row) {
+                Log.i(TAG, "onItemClicked: " + item + " row " + row);
+                if (item instanceof PhotoItem){
+                    Intent intent = new Intent(getActivity(), DetailsActivity.class);
+                    intent.putExtra(DetailsActivity.EXTRA_ITEM, (PhotoItem) item);
+
+                    Bundle bundle = ActivityOptionsCompat.makeSceneTransitionAnimation(
+                            getActivity(),
+                            ((ImageCardView)itemViewHolder.view).getMainImageView(),
+                            DetailsActivity.SHARED_ELEMENT_NAME).toBundle();
+                    getActivity().startActivity(intent, bundle);
+                }
+            }
+        });
+        setOnItemViewSelectedListener(new OnItemViewSelectedListener() {
+            @Override
+            public void onItemSelected(Presenter.ViewHolder itemViewHolder, Object item,
+                    RowPresenter.ViewHolder rowViewHolder, Row row) {
+                Log.i(TAG, "onItemSelected: " + item + " row " + row);
+            }
+        });
+
+        if (TEST_SHARED_ELEMENT_TRANSITION) {
+            mHelper = new FullWidthDetailsOverviewSharedElementHelper();
+            mHelper.setSharedElementEnterTransition(getActivity(),
+                    DetailsActivity.SHARED_ELEMENT_NAME);
+            dorPresenter.setListener(mHelper);
+            dorPresenter.setParticipatingEntranceTransition(false);
+        } else {
+            dorPresenter.setParticipatingEntranceTransition(true);
+        }
+        if (TEST_ENTRANCE_TRANSITION) {
+            // don't run entrance transition if Activity is restored.
+            if (savedInstanceState == null) {
+                prepareEntranceTransition();
+            }
+        }
+    }
+
+    @Override
+    public void onSaveInstanceState(Bundle outState) {
+        super.onSaveInstanceState(outState);
+        outState.putParcelable(ITEM, mPhotoItem);
+    }
+
+    public void setItem(PhotoItem photoItem) {
+        mPhotoItem = photoItem;
+
+        mRowsAdapter.clear();
+        new Handler().postDelayed(new Runnable() {
+            public void run() {
+                if (TEST_OVERVIEW_ROW_ON_SECOND) {
+                    ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(cardPresenter);
+                    listRowAdapter.add(new PhotoItem("Hello world", R.drawable.gallery_photo_1));
+                    listRowAdapter.add(new PhotoItem("This is a test", R.drawable.gallery_photo_2));
+                    listRowAdapter.add(new PhotoItem("Android TV", R.drawable.gallery_photo_3));
+                    listRowAdapter.add(new PhotoItem("Leanback", R.drawable.gallery_photo_4));
+                    HeaderItem header = new HeaderItem(0, "Search Result");
+                    mRowsAdapter.add(0, new ListRow(header, listRowAdapter));
+                }
+
+                Resources res = getActivity().getResources();
+                DetailsOverviewRow dor = new DetailsOverviewRow(mPhotoItem.getTitle());
+                dor.setImageDrawable(res.getDrawable(mPhotoItem.getImageResourceId()));
+                SparseArrayObjectAdapter adapter = new SparseArrayObjectAdapter();
+                adapter.set(ACTION_RENT, mActionRent);
+                adapter.set(ACTION_BUY, mActionBuy);
+                dor.setActionsAdapter(adapter);
+                int indexOfOverviewRow = TEST_OVERVIEW_ROW_ON_SECOND ? 1 : 0;
+                mRowsAdapter.add(indexOfOverviewRow, dor);
+                setSelectedPosition(0, true);
+                if (TEST_SHARED_ELEMENT_TRANSITION) {
+                    if (mHelper != null && !mHelper.getAutoStartSharedElementTransition()) {
+                        mHelper.startPostponedEnterTransition();
+                    }
+                }
+            }
+        }, TIME_TO_LOAD_OVERVIEW_ROW_MS);
+
+        new Handler().postDelayed(new Runnable() {
+            public void run() {
+                for (int i = 0; i < NUM_ROWS; ++i) {
+                    ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(cardPresenter);
+                    listRowAdapter.add(new PhotoItem("Hello world", R.drawable.gallery_photo_1));
+                    listRowAdapter.add(new PhotoItem("This is a test", R.drawable.gallery_photo_2));
+                    listRowAdapter.add(new PhotoItem("Android TV", R.drawable.gallery_photo_3));
+                    listRowAdapter.add(new PhotoItem("Leanback", R.drawable.gallery_photo_4));
+                    HeaderItem header = new HeaderItem(i, "Row " + i);
+                    mRowsAdapter.add(new ListRow(header, listRowAdapter));
+                }
+                if (TEST_ENTRANCE_TRANSITION) {
+                    startEntranceTransition();
+                }
+            }
+        }, TIME_TO_LOAD_RELATED_ROWS_MS);
+        setAdapter(mRowsAdapter);
+    }
+
+    @Override
+    public void onStart() {
+        super.onStart();
+        if (mPhotoItem != null) {
+            mBackgroundHelper.setBackground(
+                    getActivity(), mPhotoItem.getImageResourceId());
+        }
+    }
+
+}
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/NewDetailsSupportFragment.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/NewDetailsSupportFragment.java
new file mode 100644
index 0000000..8a43d8b
--- /dev/null
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/NewDetailsSupportFragment.java
@@ -0,0 +1,255 @@
+/* This file is auto-generated from NewDetailsFragment.java.  DO NOT MODIFY. */
+
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.example.android.leanback;
+
+import android.support.v4.app.FragmentActivity;
+import android.content.Intent;
+import android.content.res.Resources;
+import android.os.Bundle;
+import android.os.Handler;
+import android.support.v4.app.ActivityOptionsCompat;
+import android.support.v17.leanback.widget.Action;
+import android.support.v17.leanback.widget.ArrayObjectAdapter;
+import android.support.v17.leanback.widget.ClassPresenterSelector;
+import android.support.v17.leanback.widget.DetailsOverviewRow;
+import android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter;
+import android.support.v17.leanback.widget.FullWidthDetailsOverviewSharedElementHelper;
+import android.support.v17.leanback.widget.HeaderItem;
+import android.support.v17.leanback.widget.ImageCardView;
+import android.support.v17.leanback.widget.ListRow;
+import android.support.v17.leanback.widget.ListRowPresenter;
+import android.support.v17.leanback.widget.OnActionClickedListener;
+import android.support.v17.leanback.widget.OnItemViewClickedListener;
+import android.support.v17.leanback.widget.OnItemViewSelectedListener;
+import android.support.v17.leanback.widget.Presenter;
+import android.support.v17.leanback.widget.Row;
+import android.support.v17.leanback.widget.RowPresenter;
+import android.support.v17.leanback.widget.SparseArrayObjectAdapter;
+import android.util.Log;
+import android.view.View;
+import android.widget.Toast;
+
+public class NewDetailsSupportFragment extends android.support.v17.leanback.app.DetailsSupportFragment {
+    private static final String TAG = "leanback.DetailsSupportFragment";
+    private static final String ITEM = "item";
+
+    private static final int NUM_ROWS = 3;
+    private ArrayObjectAdapter mRowsAdapter;
+    private PhotoItem mPhotoItem;
+    final CardPresenter cardPresenter = new CardPresenter();
+    private BackgroundHelper mBackgroundHelper = new BackgroundHelper();
+
+    private static final int ACTION_PLAY = 1;
+    private static final int ACTION_RENT = 2;
+    private static final int ACTION_BUY = 3;
+
+    private boolean TEST_OVERVIEW_ROW_ON_SECOND;
+    private boolean TEST_SHARED_ELEMENT_TRANSITION;
+    private boolean TEST_ENTRANCE_TRANSITION;
+
+    private static final long TIME_TO_LOAD_OVERVIEW_ROW_MS = 1000;
+    private static final long TIME_TO_LOAD_RELATED_ROWS_MS = 2000;
+
+    private Action mActionPlay;
+    private Action mActionRent;
+    private Action mActionBuy;
+
+    private FullWidthDetailsOverviewSharedElementHelper mHelper;
+
+    private void initializeTest() {
+        TEST_SHARED_ELEMENT_TRANSITION = null != getActivity().getWindow().getSharedElementEnterTransition();
+        TEST_OVERVIEW_ROW_ON_SECOND = !TEST_SHARED_ELEMENT_TRANSITION;
+        TEST_ENTRANCE_TRANSITION = true;
+    }
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        Log.i(TAG, "onCreate");
+        super.onCreate(savedInstanceState);
+        initializeTest();
+
+        setBadgeDrawable(getActivity().getResources().getDrawable(R.drawable.ic_title));
+        setTitle("Leanback Sample App");
+        setOnSearchClickedListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                Intent intent = new Intent(getActivity(), SearchSupportActivity.class);
+                startActivity(intent);
+            }
+        });
+
+        mActionPlay = new Action(ACTION_PLAY, "Play");
+        mActionRent = new Action(ACTION_RENT, "Rent", "$3.99",
+                getResources().getDrawable(R.drawable.ic_action_a));
+        mActionBuy = new Action(ACTION_BUY, "Buy $9.99");
+
+        ClassPresenterSelector ps = new ClassPresenterSelector();
+        FullWidthDetailsOverviewRowPresenter dorPresenter =
+                new FullWidthDetailsOverviewRowPresenter(new DetailsDescriptionPresenter());
+        dorPresenter.setOnActionClickedListener(new OnActionClickedListener() {
+            @Override
+            public void onActionClicked(Action action) {
+                Toast.makeText(getActivity(), action.toString(), Toast.LENGTH_SHORT).show();
+                int indexOfOverviewRow = TEST_OVERVIEW_ROW_ON_SECOND ? 1 : 0;
+                DetailsOverviewRow dor = (DetailsOverviewRow) mRowsAdapter.get(indexOfOverviewRow);
+                if (action.getId() == ACTION_BUY) {
+                    // on the UI thread, we can modify actions adapter directly
+                    SparseArrayObjectAdapter actions = (SparseArrayObjectAdapter)
+                            dor.getActionsAdapter();
+                    actions.set(ACTION_PLAY, mActionPlay);
+                    actions.clear(ACTION_RENT);
+                    actions.clear(ACTION_BUY);
+                    dor.setItem(mPhotoItem.getTitle() + "(Owned)");
+                    dor.setImageDrawable(getResources().getDrawable(R.drawable.details_img_16x9));
+                } else if (action.getId() == ACTION_RENT) {
+                    // on the UI thread, we can modify actions adapter directly
+                    SparseArrayObjectAdapter actions = (SparseArrayObjectAdapter)
+                            dor.getActionsAdapter();
+                    actions.set(ACTION_PLAY, mActionPlay);
+                    actions.clear(ACTION_RENT);
+                    dor.setItem(mPhotoItem.getTitle() + "(Rented)");
+                } else if (action.getId() == ACTION_PLAY) {
+                    Intent intent = new Intent(getActivity(), PlaybackOverlaySupportActivity.class);
+                    getActivity().startActivity(intent);
+                }
+            }
+        });
+        if (TEST_OVERVIEW_ROW_ON_SECOND) {
+            dorPresenter.setInitialState(FullWidthDetailsOverviewRowPresenter.STATE_SMALL);
+        }
+
+        ps.addClassPresenter(DetailsOverviewRow.class, dorPresenter);
+        ps.addClassPresenter(ListRow.class, new ListRowPresenter());
+
+        mRowsAdapter = new ArrayObjectAdapter(ps);
+
+        PhotoItem item = (PhotoItem) (savedInstanceState != null ?
+                savedInstanceState.getParcelable(ITEM) : null);
+        if (item != null) {
+            setItem(item);
+        }
+
+        setOnItemViewClickedListener(new OnItemViewClickedListener() {
+            @Override
+            public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
+                    RowPresenter.ViewHolder rowViewHolder, Row row) {
+                Log.i(TAG, "onItemClicked: " + item + " row " + row);
+                if (item instanceof PhotoItem){
+                    Intent intent = new Intent(getActivity(), DetailsSupportActivity.class);
+                    intent.putExtra(DetailsSupportActivity.EXTRA_ITEM, (PhotoItem) item);
+
+                    Bundle bundle = ActivityOptionsCompat.makeSceneTransitionAnimation(
+                            getActivity(),
+                            ((ImageCardView)itemViewHolder.view).getMainImageView(),
+                            DetailsSupportActivity.SHARED_ELEMENT_NAME).toBundle();
+                    getActivity().startActivity(intent, bundle);
+                }
+            }
+        });
+        setOnItemViewSelectedListener(new OnItemViewSelectedListener() {
+            @Override
+            public void onItemSelected(Presenter.ViewHolder itemViewHolder, Object item,
+                    RowPresenter.ViewHolder rowViewHolder, Row row) {
+                Log.i(TAG, "onItemSelected: " + item + " row " + row);
+            }
+        });
+
+        if (TEST_SHARED_ELEMENT_TRANSITION) {
+            mHelper = new FullWidthDetailsOverviewSharedElementHelper();
+            mHelper.setSharedElementEnterTransition(getActivity(),
+                    DetailsSupportActivity.SHARED_ELEMENT_NAME);
+            dorPresenter.setListener(mHelper);
+            dorPresenter.setParticipatingEntranceTransition(false);
+        } else {
+            dorPresenter.setParticipatingEntranceTransition(true);
+        }
+        if (TEST_ENTRANCE_TRANSITION) {
+            // don't run entrance transition if Activity is restored.
+            if (savedInstanceState == null) {
+                prepareEntranceTransition();
+            }
+        }
+    }
+
+    @Override
+    public void onSaveInstanceState(Bundle outState) {
+        super.onSaveInstanceState(outState);
+        outState.putParcelable(ITEM, mPhotoItem);
+    }
+
+    public void setItem(PhotoItem photoItem) {
+        mPhotoItem = photoItem;
+
+        mRowsAdapter.clear();
+        new Handler().postDelayed(new Runnable() {
+            public void run() {
+                if (TEST_OVERVIEW_ROW_ON_SECOND) {
+                    ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(cardPresenter);
+                    listRowAdapter.add(new PhotoItem("Hello world", R.drawable.gallery_photo_1));
+                    listRowAdapter.add(new PhotoItem("This is a test", R.drawable.gallery_photo_2));
+                    listRowAdapter.add(new PhotoItem("Android TV", R.drawable.gallery_photo_3));
+                    listRowAdapter.add(new PhotoItem("Leanback", R.drawable.gallery_photo_4));
+                    HeaderItem header = new HeaderItem(0, "Search Result");
+                    mRowsAdapter.add(0, new ListRow(header, listRowAdapter));
+                }
+
+                Resources res = getActivity().getResources();
+                DetailsOverviewRow dor = new DetailsOverviewRow(mPhotoItem.getTitle());
+                dor.setImageDrawable(res.getDrawable(mPhotoItem.getImageResourceId()));
+                SparseArrayObjectAdapter adapter = new SparseArrayObjectAdapter();
+                adapter.set(ACTION_RENT, mActionRent);
+                adapter.set(ACTION_BUY, mActionBuy);
+                dor.setActionsAdapter(adapter);
+                int indexOfOverviewRow = TEST_OVERVIEW_ROW_ON_SECOND ? 1 : 0;
+                mRowsAdapter.add(indexOfOverviewRow, dor);
+                setSelectedPosition(0, true);
+                if (TEST_SHARED_ELEMENT_TRANSITION) {
+                    if (mHelper != null && !mHelper.getAutoStartSharedElementTransition()) {
+                        mHelper.startPostponedEnterTransition();
+                    }
+                }
+            }
+        }, TIME_TO_LOAD_OVERVIEW_ROW_MS);
+
+        new Handler().postDelayed(new Runnable() {
+            public void run() {
+                for (int i = 0; i < NUM_ROWS; ++i) {
+                    ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(cardPresenter);
+                    listRowAdapter.add(new PhotoItem("Hello world", R.drawable.gallery_photo_1));
+                    listRowAdapter.add(new PhotoItem("This is a test", R.drawable.gallery_photo_2));
+                    listRowAdapter.add(new PhotoItem("Android TV", R.drawable.gallery_photo_3));
+                    listRowAdapter.add(new PhotoItem("Leanback", R.drawable.gallery_photo_4));
+                    HeaderItem header = new HeaderItem(i, "Row " + i);
+                    mRowsAdapter.add(new ListRow(header, listRowAdapter));
+                }
+                if (TEST_ENTRANCE_TRANSITION) {
+                    startEntranceTransition();
+                }
+            }
+        }, TIME_TO_LOAD_RELATED_ROWS_MS);
+        setAdapter(mRowsAdapter);
+    }
+
+    @Override
+    public void onStart() {
+        super.onStart();
+        if (mPhotoItem != null) {
+            mBackgroundHelper.setBackground(
+                    getActivity(), mPhotoItem.getImageResourceId());
+        }
+    }
+
+}
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/OnboardingActivity.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/OnboardingActivity.java
new file mode 100644
index 0000000..2fe9bb9
--- /dev/null
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/OnboardingActivity.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.example.android.leanback;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.view.ViewTreeObserver;
+
+public class OnboardingActivity extends Activity {
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.onboarding);
+    }
+}
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/OnboardingDemoFragment.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/OnboardingDemoFragment.java
new file mode 100644
index 0000000..5868c26
--- /dev/null
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/OnboardingDemoFragment.java
@@ -0,0 +1,155 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.example.android.leanback;
+
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.AnimatorSet;
+import android.animation.ObjectAnimator;
+import android.graphics.drawable.AnimationDrawable;
+import android.support.v17.leanback.app.OnboardingFragment;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+
+import java.util.ArrayList;
+
+public class OnboardingDemoFragment extends OnboardingFragment {
+    private static final long ANIMATION_DURATION = 1000;
+
+    private static final int[] CONTENT_BACKGROUNDS = {
+            R.drawable.tv_bg,
+            R.drawable.gallery_photo_6,
+            R.drawable.gallery_photo_8
+    };
+
+    private static final int[] CONTENT_ANIMATIONS = {
+            R.drawable.tv_content,
+            android.R.drawable.stat_sys_download,
+            android.R.drawable.ic_popup_sync
+    };
+
+    private String[] mTitles;
+    private String[] mDescriptions;
+
+    private View mBackgroundView;
+    private View mContentView;
+    private ImageView mContentBackgroundView;
+    private ImageView mContentAnimationView;
+
+    private Animator mContentAnimator;
+
+    @Override
+    public void onAttach(android.app.Activity activity) {
+        super.onAttach(activity);
+        mTitles = getResources().getStringArray(R.array.onboarding_page_titles);
+        mDescriptions = getResources().getStringArray(R.array.onboarding_page_descriptions);
+        setLogoResourceId(R.drawable.ic_launcher);
+    }
+
+    @Override
+    protected int getPageCount() {
+        return mTitles.length;
+    }
+
+    @Override
+    protected CharSequence getPageTitle(int i) {
+        return mTitles[i];
+    }
+
+    @Override
+    protected CharSequence getPageDescription(int i) {
+        return mDescriptions[i];
+    }
+
+    @Override
+    protected View onCreateBackgroundView(LayoutInflater layoutInflater, ViewGroup viewGroup) {
+        mBackgroundView = layoutInflater.inflate(R.layout.onboarding_image, viewGroup, false);
+        return mBackgroundView;
+    }
+
+    @Override
+    protected View onCreateContentView(LayoutInflater layoutInflater, ViewGroup viewGroup) {
+        mContentView = layoutInflater.inflate(R.layout.onboarding_content, viewGroup, false);
+        mContentBackgroundView = (ImageView) mContentView.findViewById(R.id.background_image);
+        mContentAnimationView = (ImageView) mContentView.findViewById(R.id.animation_image);
+        return mContentView;
+    }
+
+    @Override
+    protected View onCreateForegroundView(LayoutInflater layoutInflater, ViewGroup viewGroup) {
+        return null;
+    }
+
+    @Override
+    protected Animator onCreateEnterAnimation() {
+        ArrayList<Animator> animators = new ArrayList<>();
+        animators.add(createFadeInAnimator(mBackgroundView));
+        mContentBackgroundView.setImageResource(CONTENT_BACKGROUNDS[0]);
+        mContentAnimationView.setImageResource(CONTENT_ANIMATIONS[0]);
+        mContentAnimator = createFadeInAnimator(mContentView);
+        animators.add(mContentAnimator);
+        AnimatorSet set = new AnimatorSet();
+        set.playTogether(animators);
+        set.addListener(new AnimatorListenerAdapter() {
+            @Override
+            public void onAnimationEnd(Animator animation) {
+                ((AnimationDrawable) mContentAnimationView.getDrawable()).start();
+            }
+        });
+        return set;
+    }
+
+    @Override
+    protected void onPageChanged(final int newPage, int previousPage) {
+        if (mContentAnimator != null) {
+            mContentAnimator.cancel();
+        }
+        ((AnimationDrawable) mContentAnimationView.getDrawable()).stop();
+        ArrayList<Animator> animators = new ArrayList<>();
+        Animator fadeOut = createFadeOutAnimator(mContentView);
+        fadeOut.addListener(new AnimatorListenerAdapter() {
+            @Override
+            public void onAnimationEnd(Animator animation) {
+                mContentBackgroundView.setImageResource(CONTENT_BACKGROUNDS[newPage]);
+                mContentAnimationView.setImageResource(CONTENT_ANIMATIONS[newPage]);
+            }
+        });
+        Animator fadeIn = createFadeInAnimator(mContentView);
+        fadeIn.addListener(new AnimatorListenerAdapter() {
+            @Override
+            public void onAnimationEnd(Animator animation) {
+                ((AnimationDrawable) mContentAnimationView.getDrawable()).start();
+            }
+        });
+        AnimatorSet set = new AnimatorSet();
+        set.playSequentially(fadeOut, fadeIn);
+        set.start();
+        mContentAnimator = set;
+    }
+
+    private Animator createFadeInAnimator(View view) {
+        return ObjectAnimator.ofFloat(view, View.ALPHA, 0.0f, 1.0f).setDuration(ANIMATION_DURATION);
+    }
+
+    private Animator createFadeOutAnimator(View view) {
+        return ObjectAnimator.ofFloat(view, View.ALPHA, 1.0f, 0.0f).setDuration(ANIMATION_DURATION);
+    }
+
+    @Override
+    protected void onFinishFragment() {
+        getActivity().finish();
+    }
+}
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/OnboardingDemoSupportFragment.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/OnboardingDemoSupportFragment.java
new file mode 100644
index 0000000..32f38f3
--- /dev/null
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/OnboardingDemoSupportFragment.java
@@ -0,0 +1,157 @@
+/* This file is auto-generated from OnboardingDemoFragment.java.  DO NOT MODIFY. */
+
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.example.android.leanback;
+
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.AnimatorSet;
+import android.animation.ObjectAnimator;
+import android.graphics.drawable.AnimationDrawable;
+import android.support.v17.leanback.app.OnboardingSupportFragment;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+
+import java.util.ArrayList;
+
+public class OnboardingDemoSupportFragment extends OnboardingSupportFragment {
+    private static final long ANIMATION_DURATION = 1000;
+
+    private static final int[] CONTENT_BACKGROUNDS = {
+            R.drawable.tv_bg,
+            R.drawable.gallery_photo_6,
+            R.drawable.gallery_photo_8
+    };
+
+    private static final int[] CONTENT_ANIMATIONS = {
+            R.drawable.tv_content,
+            android.R.drawable.stat_sys_download,
+            android.R.drawable.ic_popup_sync
+    };
+
+    private String[] mTitles;
+    private String[] mDescriptions;
+
+    private View mBackgroundView;
+    private View mContentView;
+    private ImageView mContentBackgroundView;
+    private ImageView mContentAnimationView;
+
+    private Animator mContentAnimator;
+
+    @Override
+    public void onAttach(android.app.Activity activity) {
+        super.onAttach(activity);
+        mTitles = getResources().getStringArray(R.array.onboarding_page_titles);
+        mDescriptions = getResources().getStringArray(R.array.onboarding_page_descriptions);
+        setLogoResourceId(R.drawable.ic_launcher);
+    }
+
+    @Override
+    protected int getPageCount() {
+        return mTitles.length;
+    }
+
+    @Override
+    protected CharSequence getPageTitle(int i) {
+        return mTitles[i];
+    }
+
+    @Override
+    protected CharSequence getPageDescription(int i) {
+        return mDescriptions[i];
+    }
+
+    @Override
+    protected View onCreateBackgroundView(LayoutInflater layoutInflater, ViewGroup viewGroup) {
+        mBackgroundView = layoutInflater.inflate(R.layout.onboarding_image, viewGroup, false);
+        return mBackgroundView;
+    }
+
+    @Override
+    protected View onCreateContentView(LayoutInflater layoutInflater, ViewGroup viewGroup) {
+        mContentView = layoutInflater.inflate(R.layout.onboarding_content, viewGroup, false);
+        mContentBackgroundView = (ImageView) mContentView.findViewById(R.id.background_image);
+        mContentAnimationView = (ImageView) mContentView.findViewById(R.id.animation_image);
+        return mContentView;
+    }
+
+    @Override
+    protected View onCreateForegroundView(LayoutInflater layoutInflater, ViewGroup viewGroup) {
+        return null;
+    }
+
+    @Override
+    protected Animator onCreateEnterAnimation() {
+        ArrayList<Animator> animators = new ArrayList<>();
+        animators.add(createFadeInAnimator(mBackgroundView));
+        mContentBackgroundView.setImageResource(CONTENT_BACKGROUNDS[0]);
+        mContentAnimationView.setImageResource(CONTENT_ANIMATIONS[0]);
+        mContentAnimator = createFadeInAnimator(mContentView);
+        animators.add(mContentAnimator);
+        AnimatorSet set = new AnimatorSet();
+        set.playTogether(animators);
+        set.addListener(new AnimatorListenerAdapter() {
+            @Override
+            public void onAnimationEnd(Animator animation) {
+                ((AnimationDrawable) mContentAnimationView.getDrawable()).start();
+            }
+        });
+        return set;
+    }
+
+    @Override
+    protected void onPageChanged(final int newPage, int previousPage) {
+        if (mContentAnimator != null) {
+            mContentAnimator.cancel();
+        }
+        ((AnimationDrawable) mContentAnimationView.getDrawable()).stop();
+        ArrayList<Animator> animators = new ArrayList<>();
+        Animator fadeOut = createFadeOutAnimator(mContentView);
+        fadeOut.addListener(new AnimatorListenerAdapter() {
+            @Override
+            public void onAnimationEnd(Animator animation) {
+                mContentBackgroundView.setImageResource(CONTENT_BACKGROUNDS[newPage]);
+                mContentAnimationView.setImageResource(CONTENT_ANIMATIONS[newPage]);
+            }
+        });
+        Animator fadeIn = createFadeInAnimator(mContentView);
+        fadeIn.addListener(new AnimatorListenerAdapter() {
+            @Override
+            public void onAnimationEnd(Animator animation) {
+                ((AnimationDrawable) mContentAnimationView.getDrawable()).start();
+            }
+        });
+        AnimatorSet set = new AnimatorSet();
+        set.playSequentially(fadeOut, fadeIn);
+        set.start();
+        mContentAnimator = set;
+    }
+
+    private Animator createFadeInAnimator(View view) {
+        return ObjectAnimator.ofFloat(view, View.ALPHA, 0.0f, 1.0f).setDuration(ANIMATION_DURATION);
+    }
+
+    private Animator createFadeOutAnimator(View view) {
+        return ObjectAnimator.ofFloat(view, View.ALPHA, 1.0f, 0.0f).setDuration(ANIMATION_DURATION);
+    }
+
+    @Override
+    protected void onFinishFragment() {
+        getActivity().finish();
+    }
+}
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/OnboardingSupportActivity.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/OnboardingSupportActivity.java
new file mode 100644
index 0000000..e23a7e6
--- /dev/null
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/OnboardingSupportActivity.java
@@ -0,0 +1,28 @@
+/* This file is auto-generated from OnboardingActivity.java.  DO NOT MODIFY. */
+
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.example.android.leanback;
+
+import android.support.v4.app.FragmentActivity;
+import android.os.Bundle;
+import android.view.ViewTreeObserver;
+
+public class OnboardingSupportActivity extends FragmentActivity {
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.onboarding);
+    }
+}
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/PhotoItem.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/PhotoItem.java
new file mode 100644
index 0000000..adde7d3
--- /dev/null
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/PhotoItem.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.example.android.leanback;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+public class PhotoItem implements Parcelable {
+
+    private String mTitle;
+    private String mContent;
+    private int mImageResourceId;
+
+    public PhotoItem(String title, int imageResourceId) {
+        this(title, null, imageResourceId);
+    }
+
+    public PhotoItem(String title, String content, int imageResourceId) {
+        mTitle = title;
+        mContent = content;
+        mImageResourceId = imageResourceId;
+    }
+
+    public int getImageResourceId() {
+        return mImageResourceId;
+    }
+
+    public String getTitle() {
+        return mTitle;
+    }
+
+    public String getContent() {
+        return mContent;
+    }
+
+    @Override
+    public String toString() {
+        return mTitle;
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeString(mTitle);
+        dest.writeInt(mImageResourceId);
+    }
+
+    public static final Parcelable.Creator<PhotoItem> CREATOR
+            = new Parcelable.Creator<PhotoItem>() {
+        @Override
+        public PhotoItem createFromParcel(Parcel in) {
+            return new PhotoItem(in);
+        }
+
+        @Override
+        public PhotoItem[] newArray(int size) {
+            return new PhotoItem[size];
+        }
+    };
+
+    private PhotoItem(Parcel in) {
+        mTitle = in.readString();
+        mImageResourceId = in.readInt();
+    }
+}
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/PlaybackControlHelper.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/PlaybackControlHelper.java
new file mode 100644
index 0000000..e282f83
--- /dev/null
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/PlaybackControlHelper.java
@@ -0,0 +1,283 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.example.android.leanback;
+
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+import android.os.Handler;
+import android.support.v17.leanback.app.PlaybackControlGlue;
+import android.support.v17.leanback.widget.Action;
+import android.support.v17.leanback.widget.ArrayObjectAdapter;
+import android.support.v17.leanback.widget.ControlButtonPresenterSelector;
+import android.support.v17.leanback.widget.PlaybackControlsRow;
+import android.support.v17.leanback.widget.PlaybackControlsRowPresenter;
+import android.support.v17.leanback.widget.PresenterSelector;
+import android.support.v17.leanback.widget.SparseArrayObjectAdapter;
+import android.view.KeyEvent;
+import android.view.View;
+import android.widget.Toast;
+
+abstract class PlaybackControlHelper extends PlaybackControlGlue {
+    /**
+     * Change the location of the thumbs up/down controls
+     */
+    private static final boolean THUMBS_PRIMARY = true;
+
+    private static final String FAUX_TITLE = "A short song of silence";
+    private static final String FAUX_SUBTITLE = "2014";
+    private static final int FAUX_DURATION = 33 * 1000;
+
+    // These should match the playback service FF behavior
+    private static int[] sFastForwardSpeeds = { 2, 3, 4, 5 };
+
+    private boolean mIsPlaying;
+    private int mSpeed = PlaybackControlGlue.PLAYBACK_SPEED_PAUSED;
+    private long mStartTime;
+    private long mStartPosition = 0;
+
+    private PlaybackControlsRow.RepeatAction mRepeatAction;
+    private PlaybackControlsRow.ThumbsUpAction mThumbsUpAction;
+    private PlaybackControlsRow.ThumbsDownAction mThumbsDownAction;
+    private PlaybackControlsRow.PictureInPictureAction mPipAction;
+
+    private Handler mHandler = new Handler();
+    private final Runnable mUpdateProgressRunnable = new Runnable() {
+        @Override
+        public void run() {
+            updateProgress();
+            mHandler.postDelayed(this, getUpdatePeriod());
+        }
+    };
+
+    public PlaybackControlHelper(Context context, PlaybackOverlayFragment fragment) {
+        super(context, fragment, sFastForwardSpeeds);
+        mThumbsUpAction = new PlaybackControlsRow.ThumbsUpAction(context);
+        mThumbsUpAction.setIndex(PlaybackControlsRow.ThumbsUpAction.OUTLINE);
+        mThumbsDownAction = new PlaybackControlsRow.ThumbsDownAction(context);
+        mThumbsDownAction.setIndex(PlaybackControlsRow.ThumbsDownAction.OUTLINE);
+        mRepeatAction = new PlaybackControlsRow.RepeatAction(context);
+        mPipAction = new PlaybackControlsRow.PictureInPictureAction(context);
+    }
+
+    @Override
+    public PlaybackControlsRowPresenter createControlsRowAndPresenter() {
+        PlaybackControlsRowPresenter presenter = super.createControlsRowAndPresenter();
+
+        ArrayObjectAdapter adapter = new ArrayObjectAdapter(new ControlButtonPresenterSelector());
+        getControlsRow().setSecondaryActionsAdapter(adapter);
+        if (!THUMBS_PRIMARY) {
+            adapter.add(mThumbsDownAction);
+        }
+        if (android.os.Build.VERSION.SDK_INT > 23) {
+            adapter.add(mPipAction);
+        }
+        adapter.add(mRepeatAction);
+        if (!THUMBS_PRIMARY) {
+            adapter.add(mThumbsUpAction);
+        }
+
+        return presenter;
+    }
+
+    @Override
+    protected SparseArrayObjectAdapter createPrimaryActionsAdapter(
+            PresenterSelector presenterSelector) {
+        SparseArrayObjectAdapter adapter = new SparseArrayObjectAdapter(presenterSelector);
+        if (THUMBS_PRIMARY) {
+            adapter.set(PlaybackControlGlue.ACTION_CUSTOM_LEFT_FIRST, mThumbsUpAction);
+            adapter.set(PlaybackControlGlue.ACTION_CUSTOM_RIGHT_FIRST, mThumbsDownAction);
+        }
+        return adapter;
+    }
+
+    @Override
+    public void onActionClicked(Action action) {
+        if (shouldDispatchAction(action)) {
+            dispatchAction(action);
+            return;
+        }
+        super.onActionClicked(action);
+    }
+
+    @Override
+    public boolean onKey(View view, int keyCode, KeyEvent keyEvent) {
+        if (keyEvent.getAction() == KeyEvent.ACTION_DOWN) {
+            Action action = getControlsRow().getActionForKeyCode(keyEvent.getKeyCode());
+            if (shouldDispatchAction(action)) {
+                dispatchAction(action);
+                return true;
+            }
+        }
+        return super.onKey(view, keyCode, keyEvent);
+    }
+
+    private boolean shouldDispatchAction(Action action) {
+        return action == mRepeatAction || action == mThumbsUpAction || action == mThumbsDownAction;
+    }
+
+    private void dispatchAction(Action action) {
+        Toast.makeText(getContext(), action.toString(), Toast.LENGTH_SHORT).show();
+        PlaybackControlsRow.MultiAction multiAction = (PlaybackControlsRow.MultiAction) action;
+        multiAction.nextIndex();
+        notifyActionChanged(multiAction);
+    }
+
+    private void notifyActionChanged(PlaybackControlsRow.MultiAction action) {
+        int index;
+        index = getPrimaryActionsAdapter().indexOf(action);
+        if (index >= 0) {
+            getPrimaryActionsAdapter().notifyArrayItemRangeChanged(index, 1);
+        } else {
+            index = getSecondaryActionsAdapter().indexOf(action);
+            if (index >= 0) {
+                getSecondaryActionsAdapter().notifyArrayItemRangeChanged(index, 1);
+            }
+        }
+    }
+
+    private SparseArrayObjectAdapter getPrimaryActionsAdapter() {
+        return (SparseArrayObjectAdapter) getControlsRow().getPrimaryActionsAdapter();
+    }
+
+    private ArrayObjectAdapter getSecondaryActionsAdapter() {
+        return (ArrayObjectAdapter) getControlsRow().getSecondaryActionsAdapter();
+    }
+
+    @Override
+    public boolean hasValidMedia() {
+        return true;
+    }
+
+    @Override
+    public boolean isMediaPlaying() {
+        return mIsPlaying;
+    }
+
+    @Override
+    public CharSequence getMediaTitle() {
+        return FAUX_TITLE;
+    }
+
+    @Override
+    public CharSequence getMediaSubtitle() {
+        return FAUX_SUBTITLE;
+    }
+
+    @Override
+    public int getMediaDuration() {
+        return FAUX_DURATION;
+    }
+
+    @Override
+    public Drawable getMediaArt() {
+        return null;
+    }
+
+    @Override
+    public long getSupportedActions() {
+        return PlaybackControlGlue.ACTION_PLAY_PAUSE |
+                PlaybackControlGlue.ACTION_FAST_FORWARD |
+                PlaybackControlGlue.ACTION_REWIND;
+    }
+
+    @Override
+    public int getCurrentSpeedId() {
+        return mSpeed;
+    }
+
+    @Override
+    public int getCurrentPosition() {
+        int speed;
+        if (mSpeed == PlaybackControlGlue.PLAYBACK_SPEED_PAUSED) {
+            speed = 0;
+        } else if (mSpeed == PlaybackControlGlue.PLAYBACK_SPEED_NORMAL) {
+            speed = 1;
+        } else if (mSpeed >= PlaybackControlGlue.PLAYBACK_SPEED_FAST_L0) {
+            int index = mSpeed - PlaybackControlGlue.PLAYBACK_SPEED_FAST_L0;
+            speed = getFastForwardSpeeds()[index];
+        } else if (mSpeed <= -PlaybackControlGlue.PLAYBACK_SPEED_FAST_L0) {
+            int index = -mSpeed - PlaybackControlGlue.PLAYBACK_SPEED_FAST_L0;
+            speed = -getRewindSpeeds()[index];
+        } else {
+            return -1;
+        }
+        long position = mStartPosition +
+                (System.currentTimeMillis() - mStartTime) * speed;
+        if (position > getMediaDuration()) {
+            position = getMediaDuration();
+            onPlaybackComplete(true);
+        } else if (position < 0) {
+            position = 0;
+            onPlaybackComplete(false);
+        }
+        return (int) position;
+    }
+
+    void onPlaybackComplete(final boolean ended) {
+        mHandler.post(new Runnable() {
+            @Override
+            public void run() {
+                if (mRepeatAction.getIndex() == PlaybackControlsRow.RepeatAction.NONE) {
+                    pausePlayback();
+                } else {
+                    startPlayback(PlaybackControlGlue.PLAYBACK_SPEED_NORMAL);
+                }
+                mStartPosition = 0;
+                onStateChanged();
+            }
+        });
+    }
+
+    @Override
+    protected void startPlayback(int speed) {
+        if (speed == mSpeed) {
+            return;
+        }
+        mStartPosition = getCurrentPosition();
+        mSpeed = speed;
+        mIsPlaying = true;
+        mStartTime = System.currentTimeMillis();
+    }
+
+    @Override
+    protected void pausePlayback() {
+        if (mSpeed == PlaybackControlGlue.PLAYBACK_SPEED_PAUSED) {
+            return;
+        }
+        mStartPosition = getCurrentPosition();
+        mSpeed = PlaybackControlGlue.PLAYBACK_SPEED_PAUSED;
+        mIsPlaying = false;
+    }
+
+    @Override
+    protected void skipToNext() {
+        // Not supported
+    }
+
+    @Override
+    protected void skipToPrevious() {
+        // Not supported
+    }
+
+    @Override
+    public void enableProgressUpdating(boolean enable) {
+        mHandler.removeCallbacks(mUpdateProgressRunnable);
+        if (enable) {
+            mUpdateProgressRunnable.run();
+        }
+    }
+};
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/PlaybackControlSupportHelper.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/PlaybackControlSupportHelper.java
new file mode 100644
index 0000000..a538a44
--- /dev/null
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/PlaybackControlSupportHelper.java
@@ -0,0 +1,285 @@
+/* This file is auto-generated from PlaybackControlHelper.java.  DO NOT MODIFY. */
+
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.example.android.leanback;
+
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+import android.os.Handler;
+import android.support.v17.leanback.app.PlaybackControlSupportGlue;
+import android.support.v17.leanback.widget.Action;
+import android.support.v17.leanback.widget.ArrayObjectAdapter;
+import android.support.v17.leanback.widget.ControlButtonPresenterSelector;
+import android.support.v17.leanback.widget.PlaybackControlsRow;
+import android.support.v17.leanback.widget.PlaybackControlsRowPresenter;
+import android.support.v17.leanback.widget.PresenterSelector;
+import android.support.v17.leanback.widget.SparseArrayObjectAdapter;
+import android.view.KeyEvent;
+import android.view.View;
+import android.widget.Toast;
+
+abstract class PlaybackControlSupportHelper extends PlaybackControlSupportGlue {
+    /**
+     * Change the location of the thumbs up/down controls
+     */
+    private static final boolean THUMBS_PRIMARY = true;
+
+    private static final String FAUX_TITLE = "A short song of silence";
+    private static final String FAUX_SUBTITLE = "2014";
+    private static final int FAUX_DURATION = 33 * 1000;
+
+    // These should match the playback service FF behavior
+    private static int[] sFastForwardSpeeds = { 2, 3, 4, 5 };
+
+    private boolean mIsPlaying;
+    private int mSpeed = PlaybackControlSupportGlue.PLAYBACK_SPEED_PAUSED;
+    private long mStartTime;
+    private long mStartPosition = 0;
+
+    private PlaybackControlsRow.RepeatAction mRepeatAction;
+    private PlaybackControlsRow.ThumbsUpAction mThumbsUpAction;
+    private PlaybackControlsRow.ThumbsDownAction mThumbsDownAction;
+    private PlaybackControlsRow.PictureInPictureAction mPipAction;
+
+    private Handler mHandler = new Handler();
+    private final Runnable mUpdateProgressRunnable = new Runnable() {
+        @Override
+        public void run() {
+            updateProgress();
+            mHandler.postDelayed(this, getUpdatePeriod());
+        }
+    };
+
+    public PlaybackControlSupportHelper(Context context, PlaybackOverlaySupportFragment fragment) {
+        super(context, fragment, sFastForwardSpeeds);
+        mThumbsUpAction = new PlaybackControlsRow.ThumbsUpAction(context);
+        mThumbsUpAction.setIndex(PlaybackControlsRow.ThumbsUpAction.OUTLINE);
+        mThumbsDownAction = new PlaybackControlsRow.ThumbsDownAction(context);
+        mThumbsDownAction.setIndex(PlaybackControlsRow.ThumbsDownAction.OUTLINE);
+        mRepeatAction = new PlaybackControlsRow.RepeatAction(context);
+        mPipAction = new PlaybackControlsRow.PictureInPictureAction(context);
+    }
+
+    @Override
+    public PlaybackControlsRowPresenter createControlsRowAndPresenter() {
+        PlaybackControlsRowPresenter presenter = super.createControlsRowAndPresenter();
+
+        ArrayObjectAdapter adapter = new ArrayObjectAdapter(new ControlButtonPresenterSelector());
+        getControlsRow().setSecondaryActionsAdapter(adapter);
+        if (!THUMBS_PRIMARY) {
+            adapter.add(mThumbsDownAction);
+        }
+        if (android.os.Build.VERSION.SDK_INT > 23) {
+            adapter.add(mPipAction);
+        }
+        adapter.add(mRepeatAction);
+        if (!THUMBS_PRIMARY) {
+            adapter.add(mThumbsUpAction);
+        }
+
+        return presenter;
+    }
+
+    @Override
+    protected SparseArrayObjectAdapter createPrimaryActionsAdapter(
+            PresenterSelector presenterSelector) {
+        SparseArrayObjectAdapter adapter = new SparseArrayObjectAdapter(presenterSelector);
+        if (THUMBS_PRIMARY) {
+            adapter.set(PlaybackControlSupportGlue.ACTION_CUSTOM_LEFT_FIRST, mThumbsUpAction);
+            adapter.set(PlaybackControlSupportGlue.ACTION_CUSTOM_RIGHT_FIRST, mThumbsDownAction);
+        }
+        return adapter;
+    }
+
+    @Override
+    public void onActionClicked(Action action) {
+        if (shouldDispatchAction(action)) {
+            dispatchAction(action);
+            return;
+        }
+        super.onActionClicked(action);
+    }
+
+    @Override
+    public boolean onKey(View view, int keyCode, KeyEvent keyEvent) {
+        if (keyEvent.getAction() == KeyEvent.ACTION_DOWN) {
+            Action action = getControlsRow().getActionForKeyCode(keyEvent.getKeyCode());
+            if (shouldDispatchAction(action)) {
+                dispatchAction(action);
+                return true;
+            }
+        }
+        return super.onKey(view, keyCode, keyEvent);
+    }
+
+    private boolean shouldDispatchAction(Action action) {
+        return action == mRepeatAction || action == mThumbsUpAction || action == mThumbsDownAction;
+    }
+
+    private void dispatchAction(Action action) {
+        Toast.makeText(getContext(), action.toString(), Toast.LENGTH_SHORT).show();
+        PlaybackControlsRow.MultiAction multiAction = (PlaybackControlsRow.MultiAction) action;
+        multiAction.nextIndex();
+        notifyActionChanged(multiAction);
+    }
+
+    private void notifyActionChanged(PlaybackControlsRow.MultiAction action) {
+        int index;
+        index = getPrimaryActionsAdapter().indexOf(action);
+        if (index >= 0) {
+            getPrimaryActionsAdapter().notifyArrayItemRangeChanged(index, 1);
+        } else {
+            index = getSecondaryActionsAdapter().indexOf(action);
+            if (index >= 0) {
+                getSecondaryActionsAdapter().notifyArrayItemRangeChanged(index, 1);
+            }
+        }
+    }
+
+    private SparseArrayObjectAdapter getPrimaryActionsAdapter() {
+        return (SparseArrayObjectAdapter) getControlsRow().getPrimaryActionsAdapter();
+    }
+
+    private ArrayObjectAdapter getSecondaryActionsAdapter() {
+        return (ArrayObjectAdapter) getControlsRow().getSecondaryActionsAdapter();
+    }
+
+    @Override
+    public boolean hasValidMedia() {
+        return true;
+    }
+
+    @Override
+    public boolean isMediaPlaying() {
+        return mIsPlaying;
+    }
+
+    @Override
+    public CharSequence getMediaTitle() {
+        return FAUX_TITLE;
+    }
+
+    @Override
+    public CharSequence getMediaSubtitle() {
+        return FAUX_SUBTITLE;
+    }
+
+    @Override
+    public int getMediaDuration() {
+        return FAUX_DURATION;
+    }
+
+    @Override
+    public Drawable getMediaArt() {
+        return null;
+    }
+
+    @Override
+    public long getSupportedActions() {
+        return PlaybackControlSupportGlue.ACTION_PLAY_PAUSE |
+                PlaybackControlSupportGlue.ACTION_FAST_FORWARD |
+                PlaybackControlSupportGlue.ACTION_REWIND;
+    }
+
+    @Override
+    public int getCurrentSpeedId() {
+        return mSpeed;
+    }
+
+    @Override
+    public int getCurrentPosition() {
+        int speed;
+        if (mSpeed == PlaybackControlSupportGlue.PLAYBACK_SPEED_PAUSED) {
+            speed = 0;
+        } else if (mSpeed == PlaybackControlSupportGlue.PLAYBACK_SPEED_NORMAL) {
+            speed = 1;
+        } else if (mSpeed >= PlaybackControlSupportGlue.PLAYBACK_SPEED_FAST_L0) {
+            int index = mSpeed - PlaybackControlSupportGlue.PLAYBACK_SPEED_FAST_L0;
+            speed = getFastForwardSpeeds()[index];
+        } else if (mSpeed <= -PlaybackControlSupportGlue.PLAYBACK_SPEED_FAST_L0) {
+            int index = -mSpeed - PlaybackControlSupportGlue.PLAYBACK_SPEED_FAST_L0;
+            speed = -getRewindSpeeds()[index];
+        } else {
+            return -1;
+        }
+        long position = mStartPosition +
+                (System.currentTimeMillis() - mStartTime) * speed;
+        if (position > getMediaDuration()) {
+            position = getMediaDuration();
+            onPlaybackComplete(true);
+        } else if (position < 0) {
+            position = 0;
+            onPlaybackComplete(false);
+        }
+        return (int) position;
+    }
+
+    void onPlaybackComplete(final boolean ended) {
+        mHandler.post(new Runnable() {
+            @Override
+            public void run() {
+                if (mRepeatAction.getIndex() == PlaybackControlsRow.RepeatAction.NONE) {
+                    pausePlayback();
+                } else {
+                    startPlayback(PlaybackControlSupportGlue.PLAYBACK_SPEED_NORMAL);
+                }
+                mStartPosition = 0;
+                onStateChanged();
+            }
+        });
+    }
+
+    @Override
+    protected void startPlayback(int speed) {
+        if (speed == mSpeed) {
+            return;
+        }
+        mStartPosition = getCurrentPosition();
+        mSpeed = speed;
+        mIsPlaying = true;
+        mStartTime = System.currentTimeMillis();
+    }
+
+    @Override
+    protected void pausePlayback() {
+        if (mSpeed == PlaybackControlSupportGlue.PLAYBACK_SPEED_PAUSED) {
+            return;
+        }
+        mStartPosition = getCurrentPosition();
+        mSpeed = PlaybackControlSupportGlue.PLAYBACK_SPEED_PAUSED;
+        mIsPlaying = false;
+    }
+
+    @Override
+    protected void skipToNext() {
+        // Not supported
+    }
+
+    @Override
+    protected void skipToPrevious() {
+        // Not supported
+    }
+
+    @Override
+    public void enableProgressUpdating(boolean enable) {
+        mHandler.removeCallbacks(mUpdateProgressRunnable);
+        if (enable) {
+            mUpdateProgressRunnable.run();
+        }
+    }
+};
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/PlaybackOverlayActivity.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/PlaybackOverlayActivity.java
new file mode 100644
index 0000000..764b169
--- /dev/null
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/PlaybackOverlayActivity.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.example.android.leanback;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class PlaybackOverlayActivity extends Activity {
+    private List<PictureInPictureListener> mListeners = new ArrayList<>();
+
+    /** Called when the activity is first created. */
+    @Override
+    public void onCreate(Bundle savedInstanceState)
+    {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.playback_controls);
+    }
+
+    @Override
+    public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode) {
+        for (PictureInPictureListener listener : mListeners) {
+            listener.onPictureInPictureModeChanged(isInPictureInPictureMode);
+        }
+    }
+
+    public void registerPictureInPictureListener(PictureInPictureListener listener) {
+        mListeners.add(listener);
+    }
+
+    public void unregisterPictureInPictureListener(PictureInPictureListener listener) {
+        mListeners.remove(listener);
+    }
+
+    public interface PictureInPictureListener {
+        void onPictureInPictureModeChanged(boolean isInPictureInPictureMode);
+    }
+}
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/PlaybackOverlayFragment.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/PlaybackOverlayFragment.java
new file mode 100644
index 0000000..c918774
--- /dev/null
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/PlaybackOverlayFragment.java
@@ -0,0 +1,194 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.example.android.leanback;
+
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+import android.os.Bundle;
+import android.os.Handler;
+import android.support.v17.leanback.app.PlaybackControlGlue;
+import android.support.v17.leanback.widget.Action;
+import android.support.v17.leanback.widget.ArrayObjectAdapter;
+import android.support.v17.leanback.widget.PlaybackControlsRow;
+import android.support.v17.leanback.widget.PlaybackControlsRow.RepeatAction;
+import android.support.v17.leanback.widget.PlaybackControlsRow.ThumbsUpAction;
+import android.support.v17.leanback.widget.PlaybackControlsRow.ThumbsDownAction;
+import android.support.v17.leanback.widget.PlaybackControlsRowPresenter;
+import android.support.v17.leanback.widget.HeaderItem;
+import android.support.v17.leanback.widget.PresenterSelector;
+import android.support.v17.leanback.widget.Row;
+import android.support.v17.leanback.widget.ListRow;
+import android.support.v17.leanback.widget.Presenter;
+import android.support.v17.leanback.widget.RowPresenter;
+import android.support.v17.leanback.widget.ListRowPresenter;
+import android.support.v17.leanback.widget.OnItemViewSelectedListener;
+import android.support.v17.leanback.widget.OnItemViewClickedListener;
+import android.support.v17.leanback.widget.ControlButtonPresenterSelector;
+import android.support.v17.leanback.widget.SparseArrayObjectAdapter;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Toast;
+
+public class PlaybackOverlayFragment
+        extends android.support.v17.leanback.app.PlaybackOverlayFragment
+        implements PlaybackOverlayActivity.PictureInPictureListener {
+    private static final String TAG = "leanback.PlaybackControlsFragment";
+
+    /**
+     * Change this to choose a different overlay background.
+     */
+    private static final int BACKGROUND_TYPE = PlaybackOverlayFragment.BG_LIGHT;
+
+    /**
+     * Change the number of related content rows.
+     */
+    private static final int RELATED_CONTENT_ROWS = 3;
+
+    /**
+     * Change this to select hidden
+     */
+    private static final boolean SECONDARY_HIDDEN = false;
+
+    private static final int ROW_CONTROLS = 0;
+
+    private PlaybackControlHelper mGlue;
+    private PlaybackControlsRowPresenter mPlaybackControlsRowPresenter;
+    private ListRowPresenter mListRowPresenter;
+
+    private OnItemViewClickedListener mOnItemViewClickedListener = new OnItemViewClickedListener() {
+        @Override
+        public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
+                                  RowPresenter.ViewHolder rowViewHolder, Row row) {
+            Log.i(TAG, "onItemClicked: " + item + " row " + row);
+            if (item instanceof Action) {
+                mGlue.onActionClicked((Action) item);
+            }
+        }
+    };
+
+    private OnItemViewSelectedListener mOnItemViewSelectedListener = new OnItemViewSelectedListener() {
+        @Override
+        public void onItemSelected(Presenter.ViewHolder itemViewHolder, Object item,
+                                   RowPresenter.ViewHolder rowViewHolder, Row row) {
+            Log.i(TAG, "onItemSelected: " + item + " row " + row);
+        }
+    };
+
+    public SparseArrayObjectAdapter getAdapter() {
+        return (SparseArrayObjectAdapter) super.getAdapter();
+    }
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        Log.i(TAG, "onCreate");
+        super.onCreate(savedInstanceState);
+
+        setBackgroundType(BACKGROUND_TYPE);
+        setOnItemViewSelectedListener(mOnItemViewSelectedListener);
+
+        createComponents(getActivity());
+    }
+
+    private void createComponents(Context context) {
+        mGlue = new PlaybackControlHelper(context, this) {
+            @Override
+            public int getUpdatePeriod() {
+                int totalTime = getControlsRow().getTotalTime();
+                if (getView() == null || getView().getWidth() == 0 || totalTime <= 0) {
+                    return 1000;
+                }
+                return Math.max(16, totalTime / getView().getWidth());
+            }
+
+            @Override
+            protected void onRowChanged(PlaybackControlsRow row) {
+                if (getAdapter() == null) {
+                    return;
+                }
+                int index = getAdapter().indexOf(row);
+                if (index >= 0) {
+                    getAdapter().notifyArrayItemRangeChanged(index, 1);
+                }
+            }
+
+            @Override
+            public void onActionClicked(Action action) {
+                if (action.getId() == R.id.lb_control_picture_in_picture) {
+                    getActivity().enterPictureInPictureMode();
+                    return;
+                }
+                super.onActionClicked(action);
+            }
+        };
+
+        mGlue.setOnItemViewClickedListener(mOnItemViewClickedListener);
+
+        mPlaybackControlsRowPresenter = mGlue.createControlsRowAndPresenter();
+        mPlaybackControlsRowPresenter.setSecondaryActionsHidden(SECONDARY_HIDDEN);
+        mListRowPresenter = new ListRowPresenter();
+
+        setAdapter(new SparseArrayObjectAdapter(new PresenterSelector() {
+            @Override
+            public Presenter getPresenter(Object object) {
+                if (object instanceof PlaybackControlsRow) {
+                    return mPlaybackControlsRowPresenter;
+                } else if (object instanceof ListRow) {
+                    return mListRowPresenter;
+                }
+                throw new IllegalArgumentException("Unhandled object: " + object);
+            }
+        }));
+
+        // Add the controls row
+        getAdapter().set(ROW_CONTROLS, mGlue.getControlsRow());
+
+        // Add related content rows
+        for (int i = 0; i < RELATED_CONTENT_ROWS; ++i) {
+            ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(new StringPresenter());
+            listRowAdapter.add("Some related content");
+            listRowAdapter.add("Other related content");
+            HeaderItem header = new HeaderItem(i, "Row " + i);
+            getAdapter().set(ROW_CONTROLS + 1 + i, new ListRow(header, listRowAdapter));
+        }
+
+    }
+
+    @Override
+    public void onStart() {
+        super.onStart();
+        mGlue.setFadingEnabled(true);
+        mGlue.enableProgressUpdating(mGlue.hasValidMedia() && mGlue.isMediaPlaying());
+        ((PlaybackOverlayActivity) getActivity()).registerPictureInPictureListener(this);
+    }
+
+    @Override
+    public void onStop() {
+        mGlue.enableProgressUpdating(false);
+        ((PlaybackOverlayActivity) getActivity()).unregisterPictureInPictureListener(this);
+        super.onStop();
+    }
+
+    @Override
+    public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode) {
+        if (isInPictureInPictureMode) {
+            // Hide the controls in picture-in-picture mode.
+            setFadingEnabled(true);
+            fadeOut();
+        } else {
+            setFadingEnabled(mGlue.isMediaPlaying());
+        }
+    }
+}
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/PlaybackOverlaySupportActivity.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/PlaybackOverlaySupportActivity.java
new file mode 100644
index 0000000..e1b01e1
--- /dev/null
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/PlaybackOverlaySupportActivity.java
@@ -0,0 +1,53 @@
+/* This file is auto-generated from PlaybackOverlayActivity.java.  DO NOT MODIFY. */
+
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.example.android.leanback;
+
+import android.support.v4.app.FragmentActivity;
+import android.os.Bundle;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class PlaybackOverlaySupportActivity extends FragmentActivity {
+    private List<PictureInPictureListener> mListeners = new ArrayList<>();
+
+    /** Called when the activity is first created. */
+    @Override
+    public void onCreate(Bundle savedInstanceState)
+    {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.playback_controls_support);
+    }
+
+    @Override
+    public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode) {
+        for (PictureInPictureListener listener : mListeners) {
+            listener.onPictureInPictureModeChanged(isInPictureInPictureMode);
+        }
+    }
+
+    public void registerPictureInPictureListener(PictureInPictureListener listener) {
+        mListeners.add(listener);
+    }
+
+    public void unregisterPictureInPictureListener(PictureInPictureListener listener) {
+        mListeners.remove(listener);
+    }
+
+    public interface PictureInPictureListener {
+        void onPictureInPictureModeChanged(boolean isInPictureInPictureMode);
+    }
+}
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/PlaybackOverlaySupportFragment.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/PlaybackOverlaySupportFragment.java
new file mode 100644
index 0000000..e8ea8f5
--- /dev/null
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/PlaybackOverlaySupportFragment.java
@@ -0,0 +1,196 @@
+/* This file is auto-generated from PlaybackOverlayFragment.java.  DO NOT MODIFY. */
+
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.example.android.leanback;
+
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+import android.os.Bundle;
+import android.os.Handler;
+import android.support.v17.leanback.app.PlaybackControlGlue;
+import android.support.v17.leanback.widget.Action;
+import android.support.v17.leanback.widget.ArrayObjectAdapter;
+import android.support.v17.leanback.widget.PlaybackControlsRow;
+import android.support.v17.leanback.widget.PlaybackControlsRow.RepeatAction;
+import android.support.v17.leanback.widget.PlaybackControlsRow.ThumbsUpAction;
+import android.support.v17.leanback.widget.PlaybackControlsRow.ThumbsDownAction;
+import android.support.v17.leanback.widget.PlaybackControlsRowPresenter;
+import android.support.v17.leanback.widget.HeaderItem;
+import android.support.v17.leanback.widget.PresenterSelector;
+import android.support.v17.leanback.widget.Row;
+import android.support.v17.leanback.widget.ListRow;
+import android.support.v17.leanback.widget.Presenter;
+import android.support.v17.leanback.widget.RowPresenter;
+import android.support.v17.leanback.widget.ListRowPresenter;
+import android.support.v17.leanback.widget.OnItemViewSelectedListener;
+import android.support.v17.leanback.widget.OnItemViewClickedListener;
+import android.support.v17.leanback.widget.ControlButtonPresenterSelector;
+import android.support.v17.leanback.widget.SparseArrayObjectAdapter;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Toast;
+
+public class PlaybackOverlaySupportFragment
+        extends android.support.v17.leanback.app.PlaybackOverlaySupportFragment
+        implements PlaybackOverlaySupportActivity.PictureInPictureListener {
+    private static final String TAG = "leanback.PlaybackControlsFragment";
+
+    /**
+     * Change this to choose a different overlay background.
+     */
+    private static final int BACKGROUND_TYPE = PlaybackOverlaySupportFragment.BG_LIGHT;
+
+    /**
+     * Change the number of related content rows.
+     */
+    private static final int RELATED_CONTENT_ROWS = 3;
+
+    /**
+     * Change this to select hidden
+     */
+    private static final boolean SECONDARY_HIDDEN = false;
+
+    private static final int ROW_CONTROLS = 0;
+
+    private PlaybackControlSupportHelper mGlue;
+    private PlaybackControlsRowPresenter mPlaybackControlsRowPresenter;
+    private ListRowPresenter mListRowPresenter;
+
+    private OnItemViewClickedListener mOnItemViewClickedListener = new OnItemViewClickedListener() {
+        @Override
+        public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
+                                  RowPresenter.ViewHolder rowViewHolder, Row row) {
+            Log.i(TAG, "onItemClicked: " + item + " row " + row);
+            if (item instanceof Action) {
+                mGlue.onActionClicked((Action) item);
+            }
+        }
+    };
+
+    private OnItemViewSelectedListener mOnItemViewSelectedListener = new OnItemViewSelectedListener() {
+        @Override
+        public void onItemSelected(Presenter.ViewHolder itemViewHolder, Object item,
+                                   RowPresenter.ViewHolder rowViewHolder, Row row) {
+            Log.i(TAG, "onItemSelected: " + item + " row " + row);
+        }
+    };
+
+    public SparseArrayObjectAdapter getAdapter() {
+        return (SparseArrayObjectAdapter) super.getAdapter();
+    }
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        Log.i(TAG, "onCreate");
+        super.onCreate(savedInstanceState);
+
+        setBackgroundType(BACKGROUND_TYPE);
+        setOnItemViewSelectedListener(mOnItemViewSelectedListener);
+
+        createComponents(getActivity());
+    }
+
+    private void createComponents(Context context) {
+        mGlue = new PlaybackControlSupportHelper(context, this) {
+            @Override
+            public int getUpdatePeriod() {
+                int totalTime = getControlsRow().getTotalTime();
+                if (getView() == null || getView().getWidth() == 0 || totalTime <= 0) {
+                    return 1000;
+                }
+                return Math.max(16, totalTime / getView().getWidth());
+            }
+
+            @Override
+            protected void onRowChanged(PlaybackControlsRow row) {
+                if (getAdapter() == null) {
+                    return;
+                }
+                int index = getAdapter().indexOf(row);
+                if (index >= 0) {
+                    getAdapter().notifyArrayItemRangeChanged(index, 1);
+                }
+            }
+
+            @Override
+            public void onActionClicked(Action action) {
+                if (action.getId() == R.id.lb_control_picture_in_picture) {
+                    getActivity().enterPictureInPictureMode();
+                    return;
+                }
+                super.onActionClicked(action);
+            }
+        };
+
+        mGlue.setOnItemViewClickedListener(mOnItemViewClickedListener);
+
+        mPlaybackControlsRowPresenter = mGlue.createControlsRowAndPresenter();
+        mPlaybackControlsRowPresenter.setSecondaryActionsHidden(SECONDARY_HIDDEN);
+        mListRowPresenter = new ListRowPresenter();
+
+        setAdapter(new SparseArrayObjectAdapter(new PresenterSelector() {
+            @Override
+            public Presenter getPresenter(Object object) {
+                if (object instanceof PlaybackControlsRow) {
+                    return mPlaybackControlsRowPresenter;
+                } else if (object instanceof ListRow) {
+                    return mListRowPresenter;
+                }
+                throw new IllegalArgumentException("Unhandled object: " + object);
+            }
+        }));
+
+        // Add the controls row
+        getAdapter().set(ROW_CONTROLS, mGlue.getControlsRow());
+
+        // Add related content rows
+        for (int i = 0; i < RELATED_CONTENT_ROWS; ++i) {
+            ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(new StringPresenter());
+            listRowAdapter.add("Some related content");
+            listRowAdapter.add("Other related content");
+            HeaderItem header = new HeaderItem(i, "Row " + i);
+            getAdapter().set(ROW_CONTROLS + 1 + i, new ListRow(header, listRowAdapter));
+        }
+
+    }
+
+    @Override
+    public void onStart() {
+        super.onStart();
+        mGlue.setFadingEnabled(true);
+        mGlue.enableProgressUpdating(mGlue.hasValidMedia() && mGlue.isMediaPlaying());
+        ((PlaybackOverlaySupportActivity) getActivity()).registerPictureInPictureListener(this);
+    }
+
+    @Override
+    public void onStop() {
+        mGlue.enableProgressUpdating(false);
+        ((PlaybackOverlaySupportActivity) getActivity()).unregisterPictureInPictureListener(this);
+        super.onStop();
+    }
+
+    @Override
+    public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode) {
+        if (isInPictureInPictureMode) {
+            // Hide the controls in picture-in-picture mode.
+            setFadingEnabled(true);
+            fadeOut();
+        } else {
+            setFadingEnabled(mGlue.isMediaPlaying());
+        }
+    }
+}
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/RowsActivity.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/RowsActivity.java
new file mode 100644
index 0000000..c44557d
--- /dev/null
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/RowsActivity.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.example.android.leanback;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.support.v17.leanback.widget.BrowseFrameLayout;
+import android.support.v17.leanback.widget.TitleHelper;
+import android.support.v17.leanback.widget.TitleView;
+import android.view.View;
+
+public class RowsActivity extends Activity
+{
+    private RowsFragment mRowsFragment;
+    private TitleHelper mTitleHelper;
+
+    /** Called when the activity is first created. */
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.rows);
+
+        mRowsFragment = (RowsFragment) getFragmentManager().findFragmentById(
+                R.id.main_rows_fragment);
+
+        setupTitleFragment();
+    }
+
+    private void setupTitleFragment() {
+        TitleView titleView = (TitleView) findViewById(R.id.title);
+        titleView.setTitle("RowsFragment");
+        titleView.setOnSearchClickedListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                Intent intent = new Intent(RowsActivity.this, SearchActivity.class);
+                startActivity(intent);
+            }
+        });
+
+        BrowseFrameLayout frameLayout = (BrowseFrameLayout) findViewById(R.id.rows_frame);
+        mTitleHelper = new TitleHelper(frameLayout, titleView);
+        frameLayout.setOnFocusSearchListener(mTitleHelper.getOnFocusSearchListener());
+        mRowsFragment.setTitleHelper(mTitleHelper);
+    }
+}
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/RowsFragment.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/RowsFragment.java
new file mode 100644
index 0000000..ea524f0
--- /dev/null
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/RowsFragment.java
@@ -0,0 +1,112 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.example.android.leanback;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.support.v17.leanback.widget.ArrayObjectAdapter;
+import android.support.v17.leanback.widget.HeaderItem;
+import android.support.v17.leanback.widget.ImageCardView;
+import android.support.v17.leanback.widget.ListRow;
+import android.support.v17.leanback.widget.ListRowPresenter;
+import android.support.v17.leanback.widget.OnItemViewClickedListener;
+import android.support.v17.leanback.widget.OnItemViewSelectedListener;
+import android.support.v17.leanback.widget.Presenter;
+import android.support.v17.leanback.widget.Row;
+import android.support.v17.leanback.widget.RowPresenter;
+import android.support.v17.leanback.widget.TitleHelper;
+import android.support.v4.app.ActivityOptionsCompat;
+import android.util.Log;
+
+public class RowsFragment extends android.support.v17.leanback.app.RowsFragment {
+
+    private static final String TAG = "leanback.RowsFragment";
+
+    private static final int NUM_ROWS = 10;
+    // Row heights default to wrap content
+    private static final boolean USE_FIXED_ROW_HEIGHT = false;
+
+    private ArrayObjectAdapter mRowsAdapter;
+    private TitleHelper mTitleHelper;
+
+    public void setTitleHelper(TitleHelper titleHelper) {
+        mTitleHelper = titleHelper;
+    }
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        Log.i(TAG, "onCreate");
+        super.onCreate(savedInstanceState);
+
+        setupRows();
+        setOnItemViewClickedListener(new ItemViewClickedListener());
+        setOnItemViewSelectedListener(new OnItemViewSelectedListener() {
+            @Override
+            public void onItemSelected(Presenter.ViewHolder itemViewHolder, Object item,
+                    RowPresenter.ViewHolder rowViewHolder, Row row) {
+                Log.i(TAG, "onItemSelected: " + item + " row " + row);
+                if (mTitleHelper != null) {
+                    mTitleHelper.showTitle(getAdapter() == null || getAdapter().size() == 0 ||
+                            getAdapter().get(0) == row);
+                }
+            }
+        });
+    }
+
+    private void setupRows() {
+        ListRowPresenter lrp = new ListRowPresenter();
+
+        // For good performance, it's important to use a single instance of
+        // a card presenter for all rows using that presenter.
+        final CardPresenter cardPresenter = new CardPresenter();
+
+        if (USE_FIXED_ROW_HEIGHT) {
+            lrp.setRowHeight(cardPresenter.getRowHeight(getActivity()));
+            lrp.setExpandedRowHeight(cardPresenter.getExpandedRowHeight(getActivity()));
+        }
+
+        mRowsAdapter = new ArrayObjectAdapter(lrp);
+
+        for (int i = 0; i < NUM_ROWS; ++i) {
+            ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(cardPresenter);
+            listRowAdapter.add(new PhotoItem("Hello world", R.drawable.gallery_photo_1));
+            listRowAdapter.add(new PhotoItem("This is a test", R.drawable.gallery_photo_2));
+            listRowAdapter.add(new PhotoItem("Android TV", R.drawable.gallery_photo_3));
+            listRowAdapter.add(new PhotoItem("Leanback", R.drawable.gallery_photo_4));
+            listRowAdapter.add(new PhotoItem("Hello world", R.drawable.gallery_photo_5));
+            listRowAdapter.add(new PhotoItem("This is a test", R.drawable.gallery_photo_6));
+            listRowAdapter.add(new PhotoItem("Android TV", R.drawable.gallery_photo_7));
+            listRowAdapter.add(new PhotoItem("Leanback", R.drawable.gallery_photo_8));
+            HeaderItem header = new HeaderItem(i, "Row " + i);
+            mRowsAdapter.add(new ListRow(header, listRowAdapter));
+        }
+
+        setAdapter(mRowsAdapter);
+    }
+
+    private final class ItemViewClickedListener implements OnItemViewClickedListener {
+        @Override
+        public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
+                RowPresenter.ViewHolder rowViewHolder, Row row) {
+            Intent intent = new Intent(getActivity(), DetailsActivity.class);
+            intent.putExtra(DetailsActivity.EXTRA_ITEM, (PhotoItem) item);
+
+            Bundle bundle = ActivityOptionsCompat.makeSceneTransitionAnimation(
+                    getActivity(),
+                    ((ImageCardView)itemViewHolder.view).getMainImageView(),
+                    DetailsActivity.SHARED_ELEMENT_NAME).toBundle();
+            getActivity().startActivity(intent, bundle);
+        }
+    }
+}
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/RowsSupportActivity.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/RowsSupportActivity.java
new file mode 100644
index 0000000..2035806
--- /dev/null
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/RowsSupportActivity.java
@@ -0,0 +1,59 @@
+/* This file is auto-generated from RowsActivity.java.  DO NOT MODIFY. */
+
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.example.android.leanback;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.support.v17.leanback.widget.BrowseFrameLayout;
+import android.support.v17.leanback.widget.TitleHelper;
+import android.support.v17.leanback.widget.TitleView;
+import android.support.v4.app.FragmentActivity;
+import android.view.View;
+
+public class RowsSupportActivity extends FragmentActivity
+{
+    private RowsSupportFragment mRowsSupportFragment;
+    private TitleHelper mTitleHelper;
+
+    /** Called when the activity is first created. */
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.rows_support);
+
+        mRowsSupportFragment = (RowsSupportFragment) getSupportFragmentManager().findFragmentById(
+                R.id.main_rows_fragment);
+
+        setupTitleFragment();
+    }
+
+    private void setupTitleFragment() {
+        TitleView titleView = (TitleView) findViewById(R.id.title);
+        titleView.setTitle("RowsSupportFragment");
+        titleView.setOnSearchClickedListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                Intent intent = new Intent(RowsSupportActivity.this, SearchSupportActivity.class);
+                startActivity(intent);
+            }
+        });
+
+        BrowseFrameLayout frameLayout = (BrowseFrameLayout) findViewById(R.id.rows_frame);
+        mTitleHelper = new TitleHelper(frameLayout, titleView);
+        frameLayout.setOnFocusSearchListener(mTitleHelper.getOnFocusSearchListener());
+        mRowsSupportFragment.setTitleHelper(mTitleHelper);
+    }
+}
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/RowsSupportFragment.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/RowsSupportFragment.java
new file mode 100644
index 0000000..6d66f77
--- /dev/null
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/RowsSupportFragment.java
@@ -0,0 +1,114 @@
+/* This file is auto-generated from RowsFragment.java.  DO NOT MODIFY. */
+
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.example.android.leanback;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.support.v17.leanback.widget.ArrayObjectAdapter;
+import android.support.v17.leanback.widget.HeaderItem;
+import android.support.v17.leanback.widget.ImageCardView;
+import android.support.v17.leanback.widget.ListRow;
+import android.support.v17.leanback.widget.ListRowPresenter;
+import android.support.v17.leanback.widget.OnItemViewClickedListener;
+import android.support.v17.leanback.widget.OnItemViewSelectedListener;
+import android.support.v17.leanback.widget.Presenter;
+import android.support.v17.leanback.widget.Row;
+import android.support.v17.leanback.widget.RowPresenter;
+import android.support.v17.leanback.widget.TitleHelper;
+import android.support.v4.app.ActivityOptionsCompat;
+import android.util.Log;
+
+public class RowsSupportFragment extends android.support.v17.leanback.app.RowsSupportFragment {
+
+    private static final String TAG = "leanback.RowsSupportFragment";
+
+    private static final int NUM_ROWS = 10;
+    // Row heights default to wrap content
+    private static final boolean USE_FIXED_ROW_HEIGHT = false;
+
+    private ArrayObjectAdapter mRowsAdapter;
+    private TitleHelper mTitleHelper;
+
+    public void setTitleHelper(TitleHelper titleHelper) {
+        mTitleHelper = titleHelper;
+    }
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        Log.i(TAG, "onCreate");
+        super.onCreate(savedInstanceState);
+
+        setupRows();
+        setOnItemViewClickedListener(new ItemViewClickedListener());
+        setOnItemViewSelectedListener(new OnItemViewSelectedListener() {
+            @Override
+            public void onItemSelected(Presenter.ViewHolder itemViewHolder, Object item,
+                    RowPresenter.ViewHolder rowViewHolder, Row row) {
+                Log.i(TAG, "onItemSelected: " + item + " row " + row);
+                if (mTitleHelper != null) {
+                    mTitleHelper.showTitle(getAdapter() == null || getAdapter().size() == 0 ||
+                            getAdapter().get(0) == row);
+                }
+            }
+        });
+    }
+
+    private void setupRows() {
+        ListRowPresenter lrp = new ListRowPresenter();
+
+        // For good performance, it's important to use a single instance of
+        // a card presenter for all rows using that presenter.
+        final CardPresenter cardPresenter = new CardPresenter();
+
+        if (USE_FIXED_ROW_HEIGHT) {
+            lrp.setRowHeight(cardPresenter.getRowHeight(getActivity()));
+            lrp.setExpandedRowHeight(cardPresenter.getExpandedRowHeight(getActivity()));
+        }
+
+        mRowsAdapter = new ArrayObjectAdapter(lrp);
+
+        for (int i = 0; i < NUM_ROWS; ++i) {
+            ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(cardPresenter);
+            listRowAdapter.add(new PhotoItem("Hello world", R.drawable.gallery_photo_1));
+            listRowAdapter.add(new PhotoItem("This is a test", R.drawable.gallery_photo_2));
+            listRowAdapter.add(new PhotoItem("Android TV", R.drawable.gallery_photo_3));
+            listRowAdapter.add(new PhotoItem("Leanback", R.drawable.gallery_photo_4));
+            listRowAdapter.add(new PhotoItem("Hello world", R.drawable.gallery_photo_5));
+            listRowAdapter.add(new PhotoItem("This is a test", R.drawable.gallery_photo_6));
+            listRowAdapter.add(new PhotoItem("Android TV", R.drawable.gallery_photo_7));
+            listRowAdapter.add(new PhotoItem("Leanback", R.drawable.gallery_photo_8));
+            HeaderItem header = new HeaderItem(i, "Row " + i);
+            mRowsAdapter.add(new ListRow(header, listRowAdapter));
+        }
+
+        setAdapter(mRowsAdapter);
+    }
+
+    private final class ItemViewClickedListener implements OnItemViewClickedListener {
+        @Override
+        public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
+                RowPresenter.ViewHolder rowViewHolder, Row row) {
+            Intent intent = new Intent(getActivity(), DetailsSupportActivity.class);
+            intent.putExtra(DetailsSupportActivity.EXTRA_ITEM, (PhotoItem) item);
+
+            Bundle bundle = ActivityOptionsCompat.makeSceneTransitionAnimation(
+                    getActivity(),
+                    ((ImageCardView)itemViewHolder.view).getMainImageView(),
+                    DetailsSupportActivity.SHARED_ELEMENT_NAME).toBundle();
+            getActivity().startActivity(intent, bundle);
+        }
+    }
+}
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/SearchActivity.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/SearchActivity.java
new file mode 100644
index 0000000..374382b
--- /dev/null
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/SearchActivity.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.example.android.leanback;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.support.v17.leanback.app.SearchFragment;
+import android.support.v17.leanback.widget.SpeechRecognitionCallback;
+import android.util.Log;
+
+public class SearchActivity extends Activity
+{
+    private static final String TAG = "SearchActivity";
+    private static boolean DEBUG = true;
+
+    /** If using internal speech recognizer, you must have RECORD_AUDIO permission */
+    private static boolean USE_INTERNAL_SPEECH_RECOGNIZER = true;
+    private static final int REQUEST_SPEECH = 1;
+
+    private SearchFragment mFragment;
+    private SpeechRecognitionCallback mSpeechRecognitionCallback;
+
+    /** Called when the activity is first created. */
+    @Override
+    public void onCreate(Bundle savedInstanceState)
+    {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.search);
+
+        mFragment = (SearchFragment) getFragmentManager().findFragmentById(R.id.search_fragment);
+
+        if (!USE_INTERNAL_SPEECH_RECOGNIZER) {
+            mSpeechRecognitionCallback = new SpeechRecognitionCallback() {
+                @Override
+                public void recognizeSpeech() {
+                    if (DEBUG) Log.v(TAG, "recognizeSpeech");
+                    startActivityForResult(mFragment.getRecognizerIntent(), REQUEST_SPEECH);
+                }
+            };
+            mFragment.setSpeechRecognitionCallback(mSpeechRecognitionCallback);
+        }
+    }
+
+    @Override
+    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+        if (DEBUG) Log.v(TAG, "onActivityResult requestCode=" + requestCode +
+                " resultCode=" + resultCode +
+                " data=" + data);
+        if (requestCode == REQUEST_SPEECH && resultCode == RESULT_OK) {
+            mFragment.setSearchQuery(data, true);
+        }
+    }
+
+}
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/SearchDetailsActivity.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/SearchDetailsActivity.java
new file mode 100644
index 0000000..da9e08e
--- /dev/null
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/SearchDetailsActivity.java
@@ -0,0 +1,21 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.example.android.leanback;
+
+/**
+ * Same implementation as DetailsActivity for different entries in AndroidManifest.
+ */
+public class SearchDetailsActivity extends DetailsActivity
+{
+}
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/SearchDetailsSupportActivity.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/SearchDetailsSupportActivity.java
new file mode 100644
index 0000000..c1d59b2
--- /dev/null
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/SearchDetailsSupportActivity.java
@@ -0,0 +1,23 @@
+/* This file is auto-generated from SearchDetailsActivity.java.  DO NOT MODIFY. */
+
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.example.android.leanback;
+
+/**
+ * Same implementation as DetailsSupportActivity for different entries in AndroidManifest.
+ */
+public class SearchDetailsSupportActivity extends DetailsSupportActivity
+{
+}
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/SearchFragment.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/SearchFragment.java
new file mode 100644
index 0000000..b55b82f
--- /dev/null
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/SearchFragment.java
@@ -0,0 +1,102 @@
+package com.example.android.leanback;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.Handler;
+import android.support.v4.app.ActivityOptionsCompat;
+import android.support.v17.leanback.widget.ArrayObjectAdapter;
+import android.support.v17.leanback.widget.HeaderItem;
+import android.support.v17.leanback.widget.ImageCardView;
+import android.support.v17.leanback.widget.ListRow;
+import android.support.v17.leanback.widget.ListRowPresenter;
+import android.support.v17.leanback.widget.ObjectAdapter;
+import android.support.v17.leanback.widget.OnItemViewClickedListener;
+import android.support.v17.leanback.widget.Presenter;
+import android.support.v17.leanback.widget.Row;
+import android.support.v17.leanback.widget.RowPresenter;
+import android.text.TextUtils;
+import android.util.Log;
+
+public class SearchFragment extends android.support.v17.leanback.app.SearchFragment
+    implements android.support.v17.leanback.app.SearchFragment.SearchResultProvider {
+    private static final String TAG = "leanback.SearchFragment";
+    private static final int NUM_ROWS = 3;
+    private static final int SEARCH_DELAY_MS = 1000;
+
+    private ArrayObjectAdapter mRowsAdapter;
+    private Handler mHandler = new Handler();
+    private String mQuery;
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        mRowsAdapter = new ArrayObjectAdapter(new ListRowPresenter());
+
+        setBadgeDrawable(getActivity().getResources().getDrawable(R.drawable.ic_title));
+        setTitle("Leanback Sample App");
+        setSearchResultProvider(this);
+        setOnItemViewClickedListener(new ItemViewClickedListener());
+    }
+
+    @Override
+    public ObjectAdapter getResultsAdapter() {
+        return mRowsAdapter;
+    }
+
+    @Override
+    public boolean onQueryTextChange(String newQuery) {
+        Log.i(TAG, String.format("Search Query Text Change %s", newQuery));
+        mRowsAdapter.clear();
+        loadQuery(newQuery);
+        return true;
+    }
+
+    @Override
+    public boolean onQueryTextSubmit(String query) {
+        Log.i(TAG, String.format("Search Query Text Submit %s", query));
+        mRowsAdapter.clear();
+        loadQuery(query);
+        return true;
+    }
+
+    private void loadQuery(String query) {
+        mQuery = query;
+        mHandler.removeCallbacks(mDelayedLoad);
+        if (!TextUtils.isEmpty(query) && !query.equals("nil")) {
+            mHandler.postDelayed(mDelayedLoad, SEARCH_DELAY_MS);
+        }
+    }
+
+    private void loadRows() {
+        for (int i = 0; i < NUM_ROWS; ++i) {
+            ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(new CardPresenter());
+            listRowAdapter.add(new PhotoItem("Hello world", R.drawable.gallery_photo_1));
+            listRowAdapter.add(new PhotoItem("This is a test", R.drawable.gallery_photo_2));
+            HeaderItem header = new HeaderItem(i, mQuery + " results row " + i);
+            mRowsAdapter.add(new ListRow(header, listRowAdapter));
+        }
+    }
+
+    private Runnable mDelayedLoad = new Runnable() {
+        @Override
+        public void run() {
+            loadRows();
+        }
+    };
+
+    private final class ItemViewClickedListener implements OnItemViewClickedListener {
+        @Override
+        public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
+                RowPresenter.ViewHolder rowViewHolder, Row row) {
+            Intent intent = new Intent(getActivity(), DetailsActivity.class);
+            intent.putExtra(DetailsActivity.EXTRA_ITEM, (PhotoItem) item);
+
+            Bundle bundle = ActivityOptionsCompat.makeSceneTransitionAnimation(
+                    getActivity(),
+                    ((ImageCardView)itemViewHolder.view).getMainImageView(),
+                    DetailsActivity.SHARED_ELEMENT_NAME).toBundle();
+            getActivity().startActivity(intent, bundle);
+        }
+    }
+}
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/SearchSupportActivity.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/SearchSupportActivity.java
new file mode 100644
index 0000000..25e5cbf
--- /dev/null
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/SearchSupportActivity.java
@@ -0,0 +1,68 @@
+/* This file is auto-generated from SearchActivity.java.  DO NOT MODIFY. */
+
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.example.android.leanback;
+
+import android.support.v4.app.FragmentActivity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.support.v17.leanback.app.SearchSupportFragment;
+import android.support.v17.leanback.widget.SpeechRecognitionCallback;
+import android.util.Log;
+
+public class SearchSupportActivity extends FragmentActivity
+{
+    private static final String TAG = "SearchSupportActivity";
+    private static boolean DEBUG = true;
+
+    /** If using internal speech recognizer, you must have RECORD_AUDIO permission */
+    private static boolean USE_INTERNAL_SPEECH_RECOGNIZER = true;
+    private static final int REQUEST_SPEECH = 1;
+
+    private SearchSupportFragment mFragment;
+    private SpeechRecognitionCallback mSpeechRecognitionCallback;
+
+    /** Called when the activity is first created. */
+    @Override
+    public void onCreate(Bundle savedInstanceState)
+    {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.search_support);
+
+        mFragment = (SearchSupportFragment) getSupportFragmentManager().findFragmentById(R.id.search_fragment);
+
+        if (!USE_INTERNAL_SPEECH_RECOGNIZER) {
+            mSpeechRecognitionCallback = new SpeechRecognitionCallback() {
+                @Override
+                public void recognizeSpeech() {
+                    if (DEBUG) Log.v(TAG, "recognizeSpeech");
+                    startActivityForResult(mFragment.getRecognizerIntent(), REQUEST_SPEECH);
+                }
+            };
+            mFragment.setSpeechRecognitionCallback(mSpeechRecognitionCallback);
+        }
+    }
+
+    @Override
+    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+        if (DEBUG) Log.v(TAG, "onActivityResult requestCode=" + requestCode +
+                " resultCode=" + resultCode +
+                " data=" + data);
+        if (requestCode == REQUEST_SPEECH && resultCode == RESULT_OK) {
+            mFragment.setSearchQuery(data, true);
+        }
+    }
+
+}
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/SearchSupportFragment.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/SearchSupportFragment.java
new file mode 100644
index 0000000..35c5eb2
--- /dev/null
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/SearchSupportFragment.java
@@ -0,0 +1,104 @@
+/* This file is auto-generated from SearchFragment.java.  DO NOT MODIFY. */
+
+package com.example.android.leanback;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.Handler;
+import android.support.v4.app.ActivityOptionsCompat;
+import android.support.v17.leanback.widget.ArrayObjectAdapter;
+import android.support.v17.leanback.widget.HeaderItem;
+import android.support.v17.leanback.widget.ImageCardView;
+import android.support.v17.leanback.widget.ListRow;
+import android.support.v17.leanback.widget.ListRowPresenter;
+import android.support.v17.leanback.widget.ObjectAdapter;
+import android.support.v17.leanback.widget.OnItemViewClickedListener;
+import android.support.v17.leanback.widget.Presenter;
+import android.support.v17.leanback.widget.Row;
+import android.support.v17.leanback.widget.RowPresenter;
+import android.text.TextUtils;
+import android.util.Log;
+
+public class SearchSupportFragment extends android.support.v17.leanback.app.SearchSupportFragment
+    implements android.support.v17.leanback.app.SearchSupportFragment.SearchResultProvider {
+    private static final String TAG = "leanback.SearchSupportFragment";
+    private static final int NUM_ROWS = 3;
+    private static final int SEARCH_DELAY_MS = 1000;
+
+    private ArrayObjectAdapter mRowsAdapter;
+    private Handler mHandler = new Handler();
+    private String mQuery;
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        mRowsAdapter = new ArrayObjectAdapter(new ListRowPresenter());
+
+        setBadgeDrawable(getActivity().getResources().getDrawable(R.drawable.ic_title));
+        setTitle("Leanback Sample App");
+        setSearchResultProvider(this);
+        setOnItemViewClickedListener(new ItemViewClickedListener());
+    }
+
+    @Override
+    public ObjectAdapter getResultsAdapter() {
+        return mRowsAdapter;
+    }
+
+    @Override
+    public boolean onQueryTextChange(String newQuery) {
+        Log.i(TAG, String.format("Search Query Text Change %s", newQuery));
+        mRowsAdapter.clear();
+        loadQuery(newQuery);
+        return true;
+    }
+
+    @Override
+    public boolean onQueryTextSubmit(String query) {
+        Log.i(TAG, String.format("Search Query Text Submit %s", query));
+        mRowsAdapter.clear();
+        loadQuery(query);
+        return true;
+    }
+
+    private void loadQuery(String query) {
+        mQuery = query;
+        mHandler.removeCallbacks(mDelayedLoad);
+        if (!TextUtils.isEmpty(query) && !query.equals("nil")) {
+            mHandler.postDelayed(mDelayedLoad, SEARCH_DELAY_MS);
+        }
+    }
+
+    private void loadRows() {
+        for (int i = 0; i < NUM_ROWS; ++i) {
+            ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(new CardPresenter());
+            listRowAdapter.add(new PhotoItem("Hello world", R.drawable.gallery_photo_1));
+            listRowAdapter.add(new PhotoItem("This is a test", R.drawable.gallery_photo_2));
+            HeaderItem header = new HeaderItem(i, mQuery + " results row " + i);
+            mRowsAdapter.add(new ListRow(header, listRowAdapter));
+        }
+    }
+
+    private Runnable mDelayedLoad = new Runnable() {
+        @Override
+        public void run() {
+            loadRows();
+        }
+    };
+
+    private final class ItemViewClickedListener implements OnItemViewClickedListener {
+        @Override
+        public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
+                RowPresenter.ViewHolder rowViewHolder, Row row) {
+            Intent intent = new Intent(getActivity(), DetailsSupportActivity.class);
+            intent.putExtra(DetailsSupportActivity.EXTRA_ITEM, (PhotoItem) item);
+
+            Bundle bundle = ActivityOptionsCompat.makeSceneTransitionAnimation(
+                    getActivity(),
+                    ((ImageCardView)itemViewHolder.view).getMainImageView(),
+                    DetailsSupportActivity.SHARED_ELEMENT_NAME).toBundle();
+            getActivity().startActivity(intent, bundle);
+        }
+    }
+}
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/StringPresenter.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/StringPresenter.java
new file mode 100644
index 0000000..5c80e0b
--- /dev/null
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/StringPresenter.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.example.android.leanback;
+
+import android.support.v17.leanback.widget.Presenter;
+import android.util.Log;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+public class StringPresenter extends Presenter {
+    private static final String TAG = "StringPresenter";
+
+    public ViewHolder onCreateViewHolder(ViewGroup parent) {
+        Log.d(TAG, "onCreateViewHolder");
+        TextView tv = new TextView(parent.getContext());
+        tv.setFocusable(true);
+        tv.setFocusableInTouchMode(true);
+        tv.setBackground(
+                parent.getContext().getResources().getDrawable(R.drawable.text_bg));
+        return new ViewHolder(tv);
+    }
+
+    public void onBindViewHolder(ViewHolder viewHolder, Object item) {
+        Log.d(TAG, "onBindViewHolder for " + item.toString());
+        ((TextView) viewHolder.view).setText(item.toString());
+    }
+
+    public void onUnbindViewHolder(ViewHolder viewHolder) {
+        Log.d(TAG, "onUnbindViewHolder"); 
+    }
+}
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/VerticalGridActivity.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/VerticalGridActivity.java
new file mode 100644
index 0000000..5107be5
--- /dev/null
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/VerticalGridActivity.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.example.android.leanback;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+public class VerticalGridActivity extends Activity
+{
+    /** Called when the activity is first created. */
+    @Override
+    public void onCreate(Bundle savedInstanceState)
+    {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.vertical_grid);
+        // TODO: use BackgroundManager here
+        getWindow().setBackgroundDrawableResource(R.drawable.bg);
+    }
+}
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/VerticalGridFragment.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/VerticalGridFragment.java
new file mode 100644
index 0000000..fe664dd
--- /dev/null
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/VerticalGridFragment.java
@@ -0,0 +1,112 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.example.android.leanback;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.Handler;
+import android.support.v17.leanback.widget.ArrayObjectAdapter;
+import android.support.v17.leanback.widget.Presenter;
+import android.support.v17.leanback.widget.RowPresenter;
+import android.support.v17.leanback.widget.VerticalGridPresenter;
+import android.support.v17.leanback.widget.Row;
+import android.support.v17.leanback.widget.OnItemViewClickedListener;
+import android.support.v17.leanback.widget.OnItemViewSelectedListener;
+import android.util.Log;
+import android.view.Gravity;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+public class VerticalGridFragment extends android.support.v17.leanback.app.VerticalGridFragment {
+    private static final String TAG = "leanback.VerticalGridFragment";
+
+    private static final int NUM_COLUMNS = 3;
+    private static final int NUM_ITEMS = 50;
+    private static final int HEIGHT = 200;
+    private static final boolean TEST_ENTRANCE_TRANSITION = true;
+
+    private static class Adapter extends ArrayObjectAdapter {
+        public Adapter(StringPresenter presenter) {
+            super(presenter);
+        }
+        public void callNotifyChanged() {
+            super.notifyChanged();
+        }
+    }
+    private Adapter mAdapter;
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        Log.i(TAG, "onCreate");
+        super.onCreate(savedInstanceState);
+
+        setBadgeDrawable(getActivity().getResources().getDrawable(R.drawable.ic_title));
+        setTitle("Leanback Vertical Grid Demo");
+
+        setupFragment();
+        if (TEST_ENTRANCE_TRANSITION) {
+            // don't run entrance transition if fragment is restored.
+            if (savedInstanceState == null) {
+                prepareEntranceTransition();
+            }
+        }
+        // simulates in a real world use case  data being loaded two seconds later
+        new Handler().postDelayed(new Runnable() {
+            public void run() {
+                loadData();
+                startEntranceTransition();
+            }
+        }, 2000);
+    }
+
+    private void loadData() {
+        for (int i = 0; i < NUM_ITEMS; i++) {
+            mAdapter.add(Integer.toString(i));
+        }
+    }
+
+    private void setupFragment() {
+        VerticalGridPresenter gridPresenter = new VerticalGridPresenter();
+        gridPresenter.setNumberOfColumns(NUM_COLUMNS);
+        setGridPresenter(gridPresenter);
+
+        mAdapter = new Adapter(new StringPresenter());
+        setAdapter(mAdapter);
+
+        setOnItemViewSelectedListener(new OnItemViewSelectedListener() {
+            @Override
+            public void onItemSelected(Presenter.ViewHolder itemViewHolder, Object item,
+                    RowPresenter.ViewHolder rowViewHolder, Row row) {
+                Log.i(TAG, "onItemSelected: " + item + " row " + row);
+            }
+        });
+
+        setOnItemViewClickedListener(new OnItemViewClickedListener() {
+            @Override
+            public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
+                    RowPresenter.ViewHolder rowViewHolder, Row row) {
+                Log.i(TAG, "onItemClicked: " + item + " row " + row);
+                mAdapter.callNotifyChanged();
+            }
+        });
+        setOnSearchClickedListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                Intent intent = new Intent(getActivity(), SearchActivity.class);
+                startActivity(intent);
+            }
+        });
+    }
+}
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/VerticalGridSupportActivity.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/VerticalGridSupportActivity.java
new file mode 100644
index 0000000..0754fb8
--- /dev/null
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/VerticalGridSupportActivity.java
@@ -0,0 +1,32 @@
+/* This file is auto-generated from VerticalGridActivity.java.  DO NOT MODIFY. */
+
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.example.android.leanback;
+
+import android.support.v4.app.FragmentActivity;
+import android.os.Bundle;
+
+public class VerticalGridSupportActivity extends FragmentActivity
+{
+    /** Called when the activity is first created. */
+    @Override
+    public void onCreate(Bundle savedInstanceState)
+    {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.vertical_grid_support);
+        // TODO: use BackgroundManager here
+        getWindow().setBackgroundDrawableResource(R.drawable.bg);
+    }
+}
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/VerticalGridSupportFragment.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/VerticalGridSupportFragment.java
new file mode 100644
index 0000000..cd88f5a
--- /dev/null
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/VerticalGridSupportFragment.java
@@ -0,0 +1,114 @@
+/* This file is auto-generated from VerticalGridFragment.  DO NOT MODIFY. */
+
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.example.android.leanback;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.Handler;
+import android.support.v17.leanback.widget.ArrayObjectAdapter;
+import android.support.v17.leanback.widget.Presenter;
+import android.support.v17.leanback.widget.RowPresenter;
+import android.support.v17.leanback.widget.VerticalGridPresenter;
+import android.support.v17.leanback.widget.Row;
+import android.support.v17.leanback.widget.OnItemViewClickedListener;
+import android.support.v17.leanback.widget.OnItemViewSelectedListener;
+import android.util.Log;
+import android.view.Gravity;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+public class VerticalGridSupportFragment extends android.support.v17.leanback.app.VerticalGridSupportFragment {
+    private static final String TAG = "leanback.VerticalGridSupportFragment";
+
+    private static final int NUM_COLUMNS = 3;
+    private static final int NUM_ITEMS = 50;
+    private static final int HEIGHT = 200;
+    private static final boolean TEST_ENTRANCE_TRANSITION = true;
+
+    private static class Adapter extends ArrayObjectAdapter {
+        public Adapter(StringPresenter presenter) {
+            super(presenter);
+        }
+        public void callNotifyChanged() {
+            super.notifyChanged();
+        }
+    }
+    private Adapter mAdapter;
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        Log.i(TAG, "onCreate");
+        super.onCreate(savedInstanceState);
+
+        setBadgeDrawable(getActivity().getResources().getDrawable(R.drawable.ic_title));
+        setTitle("Leanback Vertical Grid Demo");
+
+        setupFragment();
+        if (TEST_ENTRANCE_TRANSITION) {
+            // don't run entrance transition if fragment is restored.
+            if (savedInstanceState == null) {
+                prepareEntranceTransition();
+            }
+        }
+        // simulates in a real world use case  data being loaded two seconds later
+        new Handler().postDelayed(new Runnable() {
+            public void run() {
+                loadData();
+                startEntranceTransition();
+            }
+        }, 2000);
+    }
+
+    private void loadData() {
+        for (int i = 0; i < NUM_ITEMS; i++) {
+            mAdapter.add(Integer.toString(i));
+        }
+    }
+
+    private void setupFragment() {
+        VerticalGridPresenter gridPresenter = new VerticalGridPresenter();
+        gridPresenter.setNumberOfColumns(NUM_COLUMNS);
+        setGridPresenter(gridPresenter);
+
+        mAdapter = new Adapter(new StringPresenter());
+        setAdapter(mAdapter);
+
+        setOnItemViewSelectedListener(new OnItemViewSelectedListener() {
+            @Override
+            public void onItemSelected(Presenter.ViewHolder itemViewHolder, Object item,
+                    RowPresenter.ViewHolder rowViewHolder, Row row) {
+                Log.i(TAG, "onItemSelected: " + item + " row " + row);
+            }
+        });
+
+        setOnItemViewClickedListener(new OnItemViewClickedListener() {
+            @Override
+            public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
+                    RowPresenter.ViewHolder rowViewHolder, Row row) {
+                Log.i(TAG, "onItemClicked: " + item + " row " + row);
+                mAdapter.callNotifyChanged();
+            }
+        });
+        setOnSearchClickedListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                Intent intent = new Intent(getActivity(), SearchSupportActivity.class);
+                startActivity(intent);
+            }
+        });
+    }
+}
diff --git a/samples/SupportLeanbackShowcase/app/.gitignore b/samples/SupportLeanbackShowcase/app/.gitignore
new file mode 100644
index 0000000..796b96d
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/.gitignore
@@ -0,0 +1 @@
+/build
diff --git a/samples/SupportLeanbackShowcase/app/build.gradle b/samples/SupportLeanbackShowcase/app/build.gradle
new file mode 100644
index 0000000..2b817d3
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/build.gradle
@@ -0,0 +1,36 @@
+apply plugin: 'com.android.application'
+
+android {
+    compileSdkVersion 'android-N'
+    buildToolsVersion "24.0.0 rc3"
+
+    defaultConfig {
+        applicationId "android.support.v17.leanback.supportleanbackshowcase"
+        minSdkVersion '17'
+        targetSdkVersion 'N'
+        versionCode 1
+        versionName "1.0"
+        multiDexEnabled true
+    }
+    buildTypes {
+        release {
+            minifyEnabled false
+            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+        }
+    }
+}
+
+dependencies {
+    compile fileTree(dir: 'libs', include: ['*.jar'])
+    compile "com.android.support:recyclerview-v7:${supportLibVersion}"
+    compile "com.android.support:leanback-v17:${supportLibVersion}"
+    compile "com.android.support:appcompat-v7:${supportLibVersion}"
+
+    compile "com.android.support:preference-v7:${supportLibVersion}"
+    compile "com.android.support:preference-leanback-v17:${supportLibVersion}"
+    compile "com.android.support:preference-v14:${supportLibVersion}"
+
+    compile "com.google.code.gson:gson:1.7.2"
+    compile "com.squareup.picasso:picasso:2.5.2"
+    compile "com.android.support:palette-v7:${supportLibVersion}"
+}
diff --git a/samples/SupportLeanbackShowcase/app/proguard-rules.pro b/samples/SupportLeanbackShowcase/app/proguard-rules.pro
new file mode 100644
index 0000000..cf489a5
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/proguard-rules.pro
@@ -0,0 +1,17 @@
+# Add project specific ProGuard rules here.
+# By default, the flags in this file are appended to flags specified
+# in /Users/hahnr/Library/Android/sdk/tools/proguard/proguard-android.txt
+# You can edit the include path and order by changing the proguardFiles
+# directive in build.gradle.
+#
+# For more details, see
+#   http://developer.android.com/guide/developing/tools/proguard.html
+
+# Add any project specific keep options here:
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+#   public *;
+#}
diff --git a/samples/SupportLeanbackShowcase/app/src/androidTest/java/android/support/v17/leanback/supportleanbackshowcase/ApplicationTest.java b/samples/SupportLeanbackShowcase/app/src/androidTest/java/android/support/v17/leanback/supportleanbackshowcase/ApplicationTest.java
new file mode 100644
index 0000000..4d13a4b
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/androidTest/java/android/support/v17/leanback/supportleanbackshowcase/ApplicationTest.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2015 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 android.support.v17.leanback.supportleanbackshowcase;
+
+import android.app.Application;
+import android.test.ApplicationTestCase;
+
+/**
+ * <a href="http://d.android.com/tools/testing/testing_android.html">Testing Fundamentals</a>
+ */
+public class ApplicationTest extends ApplicationTestCase<Application> {
+    public ApplicationTest() {
+        super(Application.class);
+    }
+}
\ No newline at end of file
diff --git a/samples/SupportLeanbackShowcase/app/src/main/Android.mk b/samples/SupportLeanbackShowcase/app/src/main/Android.mk
new file mode 100644
index 0000000..76c933e
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/Android.mk
@@ -0,0 +1,63 @@
+# Copyright (C) 2014 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.
+
+LOCAL_PATH:= $(call my-dir)
+
+#LOCAL_JACK_FLAGS := -D jack.import.jar.debug-info=false
+
+# Build the samples.
+# We need to add some special AAPT flags to generate R classes
+# for resources that are included from the libraries.
+include $(CLEAR_VARS)
+LOCAL_PACKAGE_NAME := SupportLeanbackShowcase
+LOCAL_MODULE_TAGS := samples tests
+LOCAL_SDK_VERSION := current
+LOCAL_MIN_SDK_VERSION := 17
+LOCAL_SRC_FILES := $(call all-java-files-under, java)
+LOCAL_STATIC_JAVA_LIBRARIES := \
+        android-support-v4 \
+        android-support-v7-recyclerview \
+        android-support-v7-preference \
+        android-support-v7-appcompat \
+        android-support-v14-preference \
+        android-support-v17-preference-leanback \
+        android-support-v17-leanback \
+	gson-x \
+	picasso-x
+LOCAL_RESOURCE_DIR = \
+        $(LOCAL_PATH)/res \
+        frameworks/support/v17/preference-leanback/res \
+        frameworks/support/v7/preference/res \
+        frameworks/support/v7/appcompat/res \
+        frameworks/support/v14/preference/res \
+        frameworks/support/v17/leanback/res \
+        frameworks/support/v7/recyclerview/res
+LOCAL_AAPT_FLAGS := \
+        --auto-add-overlay \
+        --extra-packages android.support.v17.leanback \
+        --extra-packages android.support.v17.preference \
+        --extra-packages android.support.v7.preference \
+        --extra-packages android.support.v14.preference \
+        --extra-packages android.support.v7.appcompat \
+        --extra-packages android.support.v7.recyclerview
+include $(BUILD_PACKAGE)
+
+
+include $(CLEAR_VARS)
+
+LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := \
+	gson-x:../../../libs/gson-1.7.2.jar \
+	picasso-x:../../../libs/picasso-2.5.2.jar \
+
+include $(BUILD_MULTI_PREBUILT)
diff --git a/samples/SupportLeanbackShowcase/app/src/main/AndroidManifest.xml b/samples/SupportLeanbackShowcase/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..4e71c40
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/AndroidManifest.xml
@@ -0,0 +1,74 @@
+<manifest
+    package="android.support.v17.leanback.supportleanbackshowcase"
+    xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <uses-sdk android:minSdkVersion="17" android:targetSdkVersion="23" />
+    <uses-permission android:name="android.permission.INTERNET"/>
+    <uses-permission android:name="android.permission.RECORD_AUDIO"/>
+
+    <uses-feature
+        android:name="android.hardware.touchscreen"
+        android:required="false"/>
+    <uses-feature
+        android:name="android.software.leanback"
+        android:required="true"/>
+
+    <application
+        android:allowBackup="true"
+        android:icon="@mipmap/app_banner_sample_app"
+        android:label="@string/app_name"
+        android:supportsRtl="true"
+        android:largeHeap="true"
+        android:theme="@style/Theme.Example.LeanbackLauncher">
+        <activity
+            android:name=".app.MainActivity"
+            android:exported="true"
+            android:icon="@mipmap/app_banner_sample_app"
+            android:label="@string/app_name"
+            android:logo="@mipmap/app_banner_sample_app"
+            android:screenOrientation="landscape">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+
+                <category android:name="android.intent.category.LEANBACK_LAUNCHER"/>
+            </intent-filter>
+        </activity>
+        <activity
+                android:name=".app.page.PageAndListRowActivity"
+                android:exported="true"
+                android:theme="@style/Theme.Example.Leanback.CustomTitle"/>
+        <activity
+            android:name=".app.wizard.WizardExampleActivity"
+            android:exported="true"
+            android:theme="@style/Theme.Example.LeanbackWizard"></activity>
+        <activity
+            android:name=".app.settings.SettingsExampleActivity"
+            android:exported="true"
+            android:theme="@style/Theme.Example.LeanbackPreferences"></activity>
+        <activity
+            android:name=".app.dialog.DialogExampleActivity"
+            android:exported="true"
+            android:theme="@style/Theme.Example.LeanbackDialog"></activity>
+        <activity
+            android:name=".app.details.DetailViewExampleActivity"
+            android:exported="true"
+            android:theme="@style/Theme.Example.LeanbackDetails"></activity>
+        <activity
+            android:name=".app.cards.CardExampleActivity"
+            android:exported="true"
+            android:theme="@style/Theme.Example.LeanbackBrowse"></activity>
+        <activity
+            android:name=".app.grid.GridExampleActivity"
+            android:exported="true"
+            android:theme="@style/Theme.Example.LeanbackVerticalGrid"></activity>
+        <activity
+            android:name=".app.media.VideoExampleActivity"
+            android:exported="true"
+            android:theme="@style/Theme.Example.Leanback"></activity>
+        <activity
+            android:name=".app.media.MusicExampleActivity"
+            android:exported="true"
+            android:theme="@style/Theme.Example.LeanbackMusic"></activity>
+    </application>
+
+</manifest>
diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/MainActivity.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/MainActivity.java
new file mode 100644
index 0000000..e84c8cc
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/MainActivity.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2014 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 android.support.v17.leanback.supportleanbackshowcase.app;
+
+import android.app.Activity;
+import android.app.Fragment;
+import android.os.Bundle;
+import android.support.v17.leanback.supportleanbackshowcase.R;
+
+/*
+ * MainActivity class that loads MainFragment
+ */
+public class MainActivity extends Activity {
+
+    /**
+     * Called when the activity is first created.
+     */
+    @Override public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_main);
+        if (savedInstanceState == null) {
+            Fragment fragment = new MainFragment();
+            getFragmentManager().beginTransaction().replace(R.id.fragmentContainer, fragment)
+                                .commit();
+        }
+    }
+}
diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/MainFragment.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/MainFragment.java
new file mode 100644
index 0000000..6918539
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/MainFragment.java
@@ -0,0 +1,186 @@
+/*
+ * Copyright (C) 2015 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 android.support.v17.leanback.supportleanbackshowcase.app;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.support.v17.leanback.app.BrowseFragment;
+import android.support.v17.leanback.supportleanbackshowcase.R;
+import android.support.v17.leanback.supportleanbackshowcase.app.cards.CardExampleActivity;
+import android.support.v17.leanback.supportleanbackshowcase.app.details.DetailViewExampleActivity;
+import android.support.v17.leanback.supportleanbackshowcase.app.dialog.DialogExampleActivity;
+import android.support.v17.leanback.supportleanbackshowcase.app.grid.GridExampleActivity;
+import android.support.v17.leanback.supportleanbackshowcase.app.media.MusicExampleActivity;
+import android.support.v17.leanback.supportleanbackshowcase.app.media.VideoExampleActivity;
+import android.support.v17.leanback.supportleanbackshowcase.app.page.PageAndListRowActivity;
+import android.support.v17.leanback.supportleanbackshowcase.app.settings.SettingsExampleActivity;
+import android.support.v17.leanback.supportleanbackshowcase.app.wizard.WizardExampleActivity;
+import android.support.v17.leanback.supportleanbackshowcase.cards.presenters.CardPresenterSelector;
+import android.support.v17.leanback.supportleanbackshowcase.models.Card;
+import android.support.v17.leanback.supportleanbackshowcase.models.CardRow;
+import android.support.v17.leanback.supportleanbackshowcase.models.Movie;
+import android.support.v17.leanback.supportleanbackshowcase.utils.Utils;
+import android.support.v17.leanback.widget.ArrayObjectAdapter;
+import android.support.v17.leanback.widget.ImageCardView;
+import android.support.v17.leanback.widget.ListRow;
+import android.support.v17.leanback.widget.ListRowPresenter;
+import android.support.v17.leanback.widget.OnItemViewClickedListener;
+import android.support.v17.leanback.widget.OnItemViewSelectedListener;
+import android.support.v17.leanback.widget.Presenter;
+import android.support.v17.leanback.widget.PresenterSelector;
+import android.support.v17.leanback.widget.Row;
+import android.support.v17.leanback.widget.RowPresenter;
+import android.support.v4.app.ActivityOptionsCompat;
+
+import com.google.gson.Gson;
+
+
+public class MainFragment extends BrowseFragment {
+
+    private ArrayObjectAdapter mRowsAdapter;
+
+    @Override
+    public void onActivityCreated(Bundle savedInstanceState) {
+        super.onActivityCreated(savedInstanceState);
+
+        setupUIElements();
+        setupRowAdapter();
+        setupEventListeners();
+    }
+
+    private void setupRowAdapter() {
+        mRowsAdapter = new ArrayObjectAdapter(new ListRowPresenter());
+        createRows();
+        setAdapter(mRowsAdapter);
+    }
+
+    private void createRows() {
+        String json = Utils
+                .inputStreamToString(getResources().openRawResource(R.raw.launcher_cards));
+        CardRow[] rows = new Gson().fromJson(json, CardRow[].class);
+        for (CardRow row : rows) {
+            mRowsAdapter.add(createCardRow(row));
+        }
+    }
+
+    private ListRow createCardRow(CardRow cardRow) {
+        PresenterSelector presenterSelector = new CardPresenterSelector(getActivity());
+        ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(presenterSelector);
+        for (Card card : cardRow.getCards()) {
+            listRowAdapter.add(card);
+        }
+        return new ListRow(listRowAdapter);
+    }
+
+    private void setupUIElements() {
+        setTitle(getString(R.string.browse_title));
+        setBadgeDrawable(getResources().getDrawable(R.drawable.title_android_tv, null));
+        setHeadersState(HEADERS_DISABLED);
+        setHeadersTransitionOnBackEnabled(false);
+        setBrandColor(getResources().getColor(R.color.fastlane_background));
+    }
+
+    private void setupEventListeners() {
+        setOnItemViewClickedListener(new ItemViewClickedListener());
+        setOnItemViewSelectedListener(new ItemViewSelectedListener());
+    }
+
+    private final class ItemViewClickedListener implements OnItemViewClickedListener {
+
+        @Override
+        public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
+                                  RowPresenter.ViewHolder rowViewHolder, Row row) {
+            Intent intent = null;
+            Card card = (Card) item;
+            int id = card.getId();
+            switch (id) {
+                case 0: {
+                    intent = new Intent(getActivity().getBaseContext(),
+                            CardExampleActivity.class);
+                    break;
+                }
+                case 1:
+                    intent = new Intent(getActivity().getBaseContext(),
+                            PageAndListRowActivity.class);
+                    break;
+                case 2: {
+                    intent = new Intent(getActivity().getBaseContext(),
+                            GridExampleActivity.class);
+                    break;
+                }
+                case 3: {
+                    intent = new Intent(getActivity().getBaseContext(),
+                            DetailViewExampleActivity.class);
+                    break;
+                }
+                case 4: {
+                    intent = new Intent(getActivity().getBaseContext(),
+                            VideoExampleActivity.class);
+                    break;
+                }
+                case 5: {
+                    intent = new Intent(getActivity().getBaseContext(),
+                            MusicExampleActivity.class);
+                    break;
+                }
+                case 6: {
+                    // Let's create a new Wizard for a given Movie. The movie can come from any sort
+                    // of data source. To simplify this example we decode it from a JSON source
+                    // which might be loaded from a server in a real world example.
+                    intent = new Intent(getActivity().getBaseContext(),
+                            WizardExampleActivity.class);
+
+                    // Prepare extras which contains the Movie and will be passed to the Activity
+                    // which is started through the Intent/.
+                    Bundle extras = new Bundle();
+                    String json = Utils.inputStreamToString(
+                            getResources().openRawResource(R.raw.wizard_example));
+                    Movie movie = new Gson().fromJson(json, Movie.class);
+                    extras.putSerializable("movie", movie);
+                    intent.putExtras(extras);
+
+                    // Finally, start the wizard Activity.
+                    break;
+                }
+                case 7: {
+                    intent = new Intent(getActivity().getBaseContext(),
+                            SettingsExampleActivity.class);
+                    startActivity(intent);
+                    return;
+                }
+                case 8: {
+                    intent = new Intent(getActivity().getBaseContext(),
+                            DialogExampleActivity.class);
+                    break;
+                }
+                default:
+                    break;
+            }
+            if (intent != null) {
+                Bundle bundle = ActivityOptionsCompat.makeSceneTransitionAnimation(getActivity())
+                        .toBundle();
+                startActivity(intent, bundle);
+            }
+        }
+    }
+
+    private final class ItemViewSelectedListener implements OnItemViewSelectedListener {
+
+        @Override
+        public void onItemSelected(Presenter.ViewHolder itemViewHolder, Object item,
+                                   RowPresenter.ViewHolder rowViewHolder, Row row) {
+        }
+    }
+}
diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/cards/CardExampleActivity.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/cards/CardExampleActivity.java
new file mode 100644
index 0000000..ecb0c7a
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/cards/CardExampleActivity.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2014 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 android.support.v17.leanback.supportleanbackshowcase.app.cards;
+
+import android.app.Activity;
+import android.graphics.Color;
+import android.graphics.drawable.ColorDrawable;
+import android.os.Bundle;
+import android.support.v17.leanback.app.GuidedStepFragment;
+import android.support.v17.leanback.supportleanbackshowcase.app.dialog.DialogExampleFragment;
+import android.support.v17.leanback.supportleanbackshowcase.R;
+
+/**
+ * TODO: Javadoc
+ */
+public class CardExampleActivity extends Activity {
+
+    @Override public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_cards_example);
+    }
+}
diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/cards/CardExampleFragment.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/cards/CardExampleFragment.java
new file mode 100644
index 0000000..ab683d0
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/cards/CardExampleFragment.java
@@ -0,0 +1,136 @@
+/*
+ * Copyright (C) 2015 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 android.support.v17.leanback.supportleanbackshowcase.app.cards;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.Handler;
+import android.support.v17.leanback.app.BrowseFragment;
+import android.support.v17.leanback.supportleanbackshowcase.R;
+import android.support.v17.leanback.supportleanbackshowcase.app.details.DetailViewExampleActivity;
+import android.support.v17.leanback.supportleanbackshowcase.app.details.DetailViewExampleFragment;
+import android.support.v17.leanback.supportleanbackshowcase.app.details.ShadowRowPresenterSelector;
+import android.support.v17.leanback.supportleanbackshowcase.cards.presenters.CardPresenterSelector;
+import android.support.v17.leanback.supportleanbackshowcase.models.Card;
+import android.support.v17.leanback.supportleanbackshowcase.models.CardRow;
+import android.support.v17.leanback.supportleanbackshowcase.utils.CardListRow;
+import android.support.v17.leanback.supportleanbackshowcase.utils.Utils;
+import android.support.v17.leanback.widget.ArrayObjectAdapter;
+import android.support.v17.leanback.widget.HeaderItem;
+import android.support.v17.leanback.widget.ImageCardView;
+import android.support.v17.leanback.widget.DividerRow;
+import android.support.v17.leanback.widget.SectionRow;
+import android.support.v17.leanback.widget.ListRow;
+import android.support.v17.leanback.widget.OnItemViewClickedListener;
+import android.support.v17.leanback.widget.Presenter;
+import android.support.v17.leanback.widget.PresenterSelector;
+import android.support.v17.leanback.widget.Row;
+import android.support.v17.leanback.widget.RowPresenter;
+import android.support.v17.leanback.widget.SearchOrbView;
+import android.support.v4.app.ActivityOptionsCompat;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.Toast;
+
+import com.google.gson.Gson;
+
+/**
+ * This fragment will be shown when the "Card Examples" card is selected at the home menu. It will
+ * display multiple card types.
+ */
+public class CardExampleFragment extends BrowseFragment {
+
+    private ArrayObjectAdapter mRowsAdapter;
+
+    @Override public void onActivityCreated(Bundle savedInstanceState) {
+        super.onActivityCreated(savedInstanceState);
+        setupUi();
+        setupRowAdapter();
+    }
+
+    private void setupUi() {
+        setHeadersState(HEADERS_ENABLED);
+        setHeadersTransitionOnBackEnabled(true);
+        setTitle(getString(R.string.card_examples_title));
+        setOnSearchClickedListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                Toast.makeText(getActivity(), getString(R.string.implement_search),
+                        Toast.LENGTH_LONG).show();
+            }
+        });
+        setOnItemViewClickedListener(new OnItemViewClickedListener() {
+
+            @Override
+            public void onItemClicked(Presenter.ViewHolder viewHolder, Object item, RowPresenter.ViewHolder viewHolder1, Row row) {
+                if (!(item instanceof Card)) return;
+                if (!(viewHolder.view instanceof ImageCardView)) return;
+
+                ImageView imageView = ((ImageCardView) viewHolder.view).getMainImageView();
+                Bundle bundle = ActivityOptionsCompat.makeSceneTransitionAnimation(getActivity(),
+                        imageView, DetailViewExampleFragment.TRANSITION_NAME).toBundle();
+                Intent intent = new Intent(getActivity().getBaseContext(),
+                        DetailViewExampleActivity.class);
+                Card card = (Card) item;
+                int imageResId = card.getLocalImageResourceId(getContext());
+                intent.putExtra(DetailViewExampleFragment.EXTRA_CARD, imageResId);
+                startActivity(intent, bundle);
+            }
+
+        });
+
+        prepareEntranceTransition();
+    }
+
+    private void setupRowAdapter() {
+        mRowsAdapter = new ArrayObjectAdapter(new ShadowRowPresenterSelector());
+        setAdapter(mRowsAdapter);
+        new Handler().postDelayed(new Runnable() {
+            @Override
+            public void run() {
+                createRows();
+                startEntranceTransition();
+            }
+        }, 500);
+    }
+
+    private void createRows() {
+        String json = Utils
+                .inputStreamToString(getResources().openRawResource(R.raw.cards_example));
+        CardRow[] rows = new Gson().fromJson(json, CardRow[].class);
+        for (CardRow row : rows) {
+            mRowsAdapter.add(createCardRow(row));
+        }
+    }
+
+    private Row createCardRow(final CardRow cardRow) {
+        switch (cardRow.getType()) {
+            case CardRow.TYPE_SECTION_HEADER:
+                return new SectionRow(new HeaderItem(cardRow.getTitle()));
+            case CardRow.TYPE_DIVIDER:
+                return new DividerRow();
+            case CardRow.TYPE_DEFAULT:
+            default:
+                // Build main row using the ImageCardViewPresenter.
+                PresenterSelector presenterSelector = new CardPresenterSelector(getActivity());
+                ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(presenterSelector);
+                for (Card card : cardRow.getCards()) {
+                    listRowAdapter.add(card);
+                }
+                return new CardListRow(new HeaderItem(cardRow.getTitle()), listRowAdapter, cardRow);
+        }
+    }
+
+}
diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/details/DetailViewExampleActivity.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/details/DetailViewExampleActivity.java
new file mode 100644
index 0000000..6b9c143
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/details/DetailViewExampleActivity.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2015 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 android.support.v17.leanback.supportleanbackshowcase.app.details;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.support.v17.leanback.app.DetailsFragment;
+import android.support.v17.leanback.supportleanbackshowcase.R;
+
+/**
+ * Contains a {@link DetailsFragment} in order to display more details for a given card.
+ */
+public class DetailViewExampleActivity extends Activity {
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_detail_example);
+    }
+}
diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/details/DetailViewExampleFragment.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/details/DetailViewExampleFragment.java
new file mode 100644
index 0000000..eed800f
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/details/DetailViewExampleFragment.java
@@ -0,0 +1,179 @@
+/*
+ * Copyright (C) 2015 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 android.support.v17.leanback.supportleanbackshowcase.app.details;
+
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.os.Bundle;
+import android.os.Handler;
+import android.support.v17.leanback.app.DetailsFragment;
+import android.support.v17.leanback.supportleanbackshowcase.models.DetailedCard;
+import android.support.v17.leanback.supportleanbackshowcase.R;
+import android.support.v17.leanback.supportleanbackshowcase.utils.CardListRow;
+import android.support.v17.leanback.supportleanbackshowcase.utils.Utils;
+import android.support.v17.leanback.supportleanbackshowcase.cards.presenters.CardPresenterSelector;
+import android.support.v17.leanback.supportleanbackshowcase.models.Card;
+import android.support.v17.leanback.widget.Action;
+import android.support.v17.leanback.widget.ArrayObjectAdapter;
+import android.support.v17.leanback.widget.ClassPresenterSelector;
+import android.support.v17.leanback.widget.DetailsOverviewRow;
+import android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter;
+import android.support.v17.leanback.widget.FullWidthDetailsOverviewSharedElementHelper;
+import android.support.v17.leanback.widget.HeaderItem;
+import android.support.v17.leanback.widget.ListRow;
+import android.support.v17.leanback.widget.ListRowPresenter;
+import android.support.v17.leanback.widget.OnItemViewClickedListener;
+import android.support.v17.leanback.widget.OnItemViewSelectedListener;
+import android.support.v17.leanback.widget.Presenter;
+import android.support.v17.leanback.widget.Row;
+import android.support.v17.leanback.widget.RowPresenter;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Toast;
+
+import com.google.gson.Gson;
+
+/**
+ * Displays a card with more details using a {@link DetailsFragment}.
+ */
+public class DetailViewExampleFragment extends DetailsFragment implements OnItemViewClickedListener,
+        OnItemViewSelectedListener {
+
+    public static final String TRANSITION_NAME = "t_for_transition";
+    public static final String EXTRA_CARD = "card";
+
+    private ArrayObjectAdapter mRowsAdapter;
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setupUi();
+        setupEventListeners();
+    }
+
+    private void setupUi() {
+        // Load the card we want to display from a JSON resource. This JSON data could come from
+        // anywhere in a real world app, e.g. a server.
+        String json = Utils
+                .inputStreamToString(getResources().openRawResource(R.raw.detail_example));
+        DetailedCard data = new Gson().fromJson(json, DetailedCard.class);
+
+        // Setup fragment
+        setTitle(getString(R.string.detail_view_title));
+
+        FullWidthDetailsOverviewRowPresenter rowPresenter = new FullWidthDetailsOverviewRowPresenter(
+                new DetailsDescriptionPresenter(getActivity())) {
+
+            @Override
+            protected RowPresenter.ViewHolder createRowViewHolder(ViewGroup parent) {
+                // Customize Actionbar and Content by using custom colors.
+                RowPresenter.ViewHolder viewHolder = super.createRowViewHolder(parent);
+
+                View actionsView = viewHolder.view.
+                        findViewById(R.id.details_overview_actions_background);
+                actionsView.setBackgroundColor(getActivity().getResources().
+                        getColor(R.color.detail_view_actionbar_background, null));
+
+                View detailsView = viewHolder.view.findViewById(R.id.details_frame);
+                detailsView.setBackgroundColor(
+                        getResources().getColor(R.color.detail_view_background, null));
+                return viewHolder;
+            }
+        };
+
+        FullWidthDetailsOverviewSharedElementHelper mHelper = new FullWidthDetailsOverviewSharedElementHelper();
+        mHelper.setSharedElementEnterTransition(getActivity(), TRANSITION_NAME);
+        rowPresenter.setListener(mHelper);
+        rowPresenter.setParticipatingEntranceTransition(false);
+        prepareEntranceTransition();
+
+        ListRowPresenter shadowDisabledRowPresenter = new ListRowPresenter();
+        shadowDisabledRowPresenter.setShadowEnabled(false);
+
+        // Setup PresenterSelector to distinguish between the different rows.
+        ClassPresenterSelector rowPresenterSelector = new ClassPresenterSelector();
+        rowPresenterSelector.addClassPresenter(DetailsOverviewRow.class, rowPresenter);
+        rowPresenterSelector.addClassPresenter(CardListRow.class, shadowDisabledRowPresenter);
+        rowPresenterSelector.addClassPresenter(ListRow.class, new ListRowPresenter());
+        mRowsAdapter = new ArrayObjectAdapter(rowPresenterSelector);
+
+        // Setup action and detail row.
+        DetailsOverviewRow detailsOverview = new DetailsOverviewRow(data);
+        int imageResId = data.getLocalImageResourceId(getActivity());
+
+        Bundle extras = getActivity().getIntent().getExtras();
+        if (extras != null && extras.containsKey(EXTRA_CARD)) {
+            imageResId = extras.getInt(EXTRA_CARD, imageResId);
+        }
+        detailsOverview.setImageDrawable(getResources().getDrawable(imageResId, null));
+        ArrayObjectAdapter actionAdapter = new ArrayObjectAdapter();
+        actionAdapter.add(new Action(1, getString(R.string.action_buy) + data.getPrice()));
+        actionAdapter.add(new Action(2, getString(R.string.action_wishlist)));
+        actionAdapter.add(new Action(3, getString(R.string.action_related)));
+        detailsOverview.setActionsAdapter(actionAdapter);
+        mRowsAdapter.add(detailsOverview);
+
+        // Setup related row.
+        ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(
+                new CardPresenterSelector(getActivity()));
+        for (Card characterCard : data.getCharacters()) listRowAdapter.add(characterCard);
+        HeaderItem header = new HeaderItem(0, getString(R.string.header_related));
+        mRowsAdapter.add(new CardListRow(header, listRowAdapter, null));
+
+        // Setup recommended row.
+        listRowAdapter = new ArrayObjectAdapter(new CardPresenterSelector(getActivity()));
+        for (Card card : data.getRecommended()) listRowAdapter.add(card);
+        header = new HeaderItem(1, getString(R.string.header_recommended));
+        mRowsAdapter.add(new ListRow(header, listRowAdapter));
+
+        setAdapter(mRowsAdapter);
+        new Handler().postDelayed(new Runnable() {
+            @Override
+            public void run() {
+                startEntranceTransition();
+            }
+        }, 500);
+    }
+
+    private void setupEventListeners() {
+        setOnItemViewSelectedListener(this);
+        setOnItemViewClickedListener(this);
+    }
+
+    @Override
+    public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
+                              RowPresenter.ViewHolder rowViewHolder, Row row) {
+        if (!(item instanceof Action)) return;
+        Action action = (Action) item;
+        if (action.getId() == 3) {
+            setSelectedPosition(1);
+        } else {
+            Toast.makeText(getActivity(), getString(R.string.action_cicked), Toast.LENGTH_LONG)
+                    .show();
+        }
+    }
+
+    @Override
+    public void onItemSelected(Presenter.ViewHolder itemViewHolder, Object item,
+                               RowPresenter.ViewHolder rowViewHolder, Row row) {
+        if (mRowsAdapter.indexOf(row) > 0) {
+            int backgroundColor = getResources().getColor(R.color.detail_view_related_background,
+                    null);
+            getView().setBackgroundColor(backgroundColor);
+        } else {
+            getView().setBackground(null);
+        }
+    }
+}
diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/details/DetailsDescriptionPresenter.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/details/DetailsDescriptionPresenter.java
new file mode 100644
index 0000000..b8488a1
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/details/DetailsDescriptionPresenter.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2015 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 android.support.v17.leanback.supportleanbackshowcase.app.details;
+
+import android.content.Context;
+import android.support.v17.leanback.supportleanbackshowcase.R;
+import android.support.v17.leanback.supportleanbackshowcase.models.DetailedCard;
+import android.support.v17.leanback.supportleanbackshowcase.utils.ResourceCache;
+import android.support.v17.leanback.widget.Presenter;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+/**
+ * This presenter is used to render a {@link DetailedCard} in the {@link
+ * DetailViewExampleFragment}.
+ */
+public class DetailsDescriptionPresenter extends Presenter {
+
+    private ResourceCache mResourceCache = new ResourceCache();
+    private Context mContext;
+
+    public DetailsDescriptionPresenter(Context context) {
+        mContext = context;
+    }
+
+    @Override public ViewHolder onCreateViewHolder(ViewGroup parent) {
+        View view = LayoutInflater.from(mContext).inflate(R.layout.detail_view_content, null);
+        return new ViewHolder(view);
+    }
+
+    @Override public void onBindViewHolder(ViewHolder viewHolder, Object item) {
+        TextView primaryText = mResourceCache.getViewById(viewHolder.view, R.id.primary_text);
+        TextView sndText1 = mResourceCache.getViewById(viewHolder.view, R.id.secondary_text_first);
+        TextView sndText2 = mResourceCache.getViewById(viewHolder.view, R.id.secondary_text_second);
+        TextView extraText = mResourceCache.getViewById(viewHolder.view, R.id.extra_text);
+
+        DetailedCard card = (DetailedCard) item;
+        primaryText.setText(card.getTitle());
+        sndText1.setText(card.getDescription());
+        sndText2.setText(card.getYear() + "");
+        extraText.setText(card.getText());
+    }
+
+    @Override public void onUnbindViewHolder(ViewHolder viewHolder) {
+        // Nothing to do here.
+    }
+}
diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/details/ShadowRowPresenterSelector.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/details/ShadowRowPresenterSelector.java
new file mode 100644
index 0000000..7df3bf8
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/details/ShadowRowPresenterSelector.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2015 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 android.support.v17.leanback.supportleanbackshowcase.app.details;
+
+import android.support.v17.leanback.supportleanbackshowcase.models.CardRow;
+import android.support.v17.leanback.supportleanbackshowcase.utils.CardListRow;
+import android.support.v17.leanback.widget.ListRowPresenter;
+import android.support.v17.leanback.widget.Presenter;
+import android.support.v17.leanback.widget.PresenterSelector;
+
+/**
+ * This {@link PresenterSelector} will return a {@link ListRowPresenter} which has shadow support
+ * enabled or not depending on {@link CardRow#useShadow()} for a given row.
+ */
+public class ShadowRowPresenterSelector extends PresenterSelector {
+
+    private ListRowPresenter mShadowEnabledRowPresenter = new ListRowPresenter();
+    private ListRowPresenter mShadowDisabledRowPresenter = new ListRowPresenter();
+
+    public ShadowRowPresenterSelector() {
+        mShadowDisabledRowPresenter.setShadowEnabled(false);
+    }
+
+    @Override public Presenter getPresenter(Object item) {
+        if (!(item instanceof CardListRow)) return mShadowDisabledRowPresenter;
+        CardListRow listRow = (CardListRow) item;
+        CardRow row = listRow.getCardRow();
+        if (row.useShadow()) return mShadowEnabledRowPresenter;
+        return mShadowDisabledRowPresenter;
+    }
+
+    @Override
+    public Presenter[] getPresenters() {
+        return new Presenter [] {
+                mShadowDisabledRowPresenter,
+                mShadowEnabledRowPresenter
+        };
+    }
+}
diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/dialog/DialogExampleActivity.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/dialog/DialogExampleActivity.java
new file mode 100644
index 0000000..0c71739
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/dialog/DialogExampleActivity.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2014 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 android.support.v17.leanback.supportleanbackshowcase.app.dialog;
+
+import android.app.Activity;
+import android.graphics.Color;
+import android.graphics.drawable.ColorDrawable;
+import android.os.Bundle;
+import android.support.v17.leanback.app.GuidedStepFragment;
+
+/**
+ * TODO: Javadoc
+ */
+public class DialogExampleActivity extends Activity {
+
+    @Override public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        getWindow().setBackgroundDrawable(new ColorDrawable(Color.parseColor("#21272A")));
+
+        if (savedInstanceState == null) {
+            GuidedStepFragment fragment = new DialogExampleFragment();
+            GuidedStepFragment.addAsRoot(this, fragment, android.R.id.content);
+        }
+    }
+}
diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/dialog/DialogExampleFragment.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/dialog/DialogExampleFragment.java
new file mode 100644
index 0000000..80b22a9
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/dialog/DialogExampleFragment.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2015 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 android.support.v17.leanback.supportleanbackshowcase.app.dialog;
+
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.v17.leanback.app.GuidedStepFragment;
+import android.support.v17.leanback.supportleanbackshowcase.R;
+import android.support.v17.leanback.widget.GuidanceStylist.Guidance;
+import android.support.v17.leanback.widget.GuidedAction;
+import android.widget.Toast;
+
+import java.util.List;
+
+/**
+ * TODO: Javadoc
+ */
+public class DialogExampleFragment extends GuidedStepFragment {
+
+    private static final int ACTION_ID_POSITIVE = 1;
+    private static final int ACTION_ID_NEGATIVE = ACTION_ID_POSITIVE + 1;
+
+    @NonNull
+    @Override
+    public Guidance onCreateGuidance(Bundle savedInstanceState) {
+        Guidance guidance = new Guidance(getString(R.string.dialog_example_title),
+                getString(R.string.dialog_example_description),
+                "", null);
+        return guidance;
+    }
+
+    @Override
+    public void onCreateActions(@NonNull List<GuidedAction> actions, Bundle savedInstanceState) {
+        GuidedAction action = new GuidedAction.Builder()
+                .id(ACTION_ID_POSITIVE)
+                .title(getString(R.string.dialog_example_button_positive)).build();
+        actions.add(action);
+        action = new GuidedAction.Builder()
+                .id(ACTION_ID_NEGATIVE)
+                .title(getString(R.string.dialog_example_button_negative)).build();
+        actions.add(action);
+    }
+
+    @Override
+    public void onGuidedActionClicked(GuidedAction action) {
+        if (ACTION_ID_POSITIVE == action.getId()) {
+            Toast.makeText(getActivity(), R.string.dialog_example_button_toast_positive_clicked,
+                    Toast.LENGTH_SHORT).show();
+        } else {
+            Toast.makeText(getActivity(), R.string.dialog_example_button_toast_negative_clicked,
+                    Toast.LENGTH_SHORT).show();
+        }
+        getActivity().finish();
+    }
+}
diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/grid/GridExampleActivity.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/grid/GridExampleActivity.java
new file mode 100644
index 0000000..e2d0887
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/grid/GridExampleActivity.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2014 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 android.support.v17.leanback.supportleanbackshowcase.app.grid;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.support.v17.leanback.supportleanbackshowcase.R;
+
+/**
+ * TODO: Javadoc
+ */
+public class GridExampleActivity extends Activity {
+
+    @Override public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_grid_example);
+    }
+}
diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/grid/GridExampleFragment.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/grid/GridExampleFragment.java
new file mode 100644
index 0000000..6640b51
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/grid/GridExampleFragment.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2015 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 android.support.v17.leanback.supportleanbackshowcase.app.grid;
+
+import android.os.Bundle;
+import android.os.Handler;
+import android.support.v17.leanback.app.VerticalGridFragment;
+import android.support.v17.leanback.supportleanbackshowcase.R;
+import android.support.v17.leanback.supportleanbackshowcase.utils.Utils;
+import android.support.v17.leanback.supportleanbackshowcase.models.CardRow;
+import android.support.v17.leanback.supportleanbackshowcase.cards.presenters.CardPresenterSelector;
+import android.support.v17.leanback.widget.ArrayObjectAdapter;
+import android.support.v17.leanback.widget.FocusHighlight;
+import android.support.v17.leanback.widget.PresenterSelector;
+import android.support.v17.leanback.widget.VerticalGridPresenter;
+
+import com.google.gson.Gson;
+
+/**
+ * An example how to use leanback's {@link VerticalGridFragment}.
+ */
+public class GridExampleFragment extends VerticalGridFragment {
+
+    private static final int COLUMNS = 4;
+    private static final int ZOOM_FACTOR = FocusHighlight.ZOOM_FACTOR_MEDIUM;
+
+    private ArrayObjectAdapter mAdapter;
+
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setTitle(getString(R.string.grid_example_title));
+        setupRowAdapter();
+    }
+
+    private void setupRowAdapter() {
+        VerticalGridPresenter gridPresenter = new VerticalGridPresenter(ZOOM_FACTOR);
+        gridPresenter.setNumberOfColumns(COLUMNS);
+        setGridPresenter(gridPresenter);
+
+        PresenterSelector cardPresenterSelector = new CardPresenterSelector(getActivity());
+        mAdapter = new ArrayObjectAdapter(cardPresenterSelector);
+        setAdapter(mAdapter);
+
+        prepareEntranceTransition();
+        new Handler().postDelayed(new Runnable() {
+            @Override
+            public void run() {
+                createRows();
+                startEntranceTransition();
+            }
+        }, 1000);
+    }
+
+    private void createRows() {
+        String json = Utils.inputStreamToString(getResources()
+                .openRawResource(R.raw.grid_example));
+        CardRow row = new Gson().fromJson(json, CardRow.class);
+        mAdapter.addAll(0, row.getCards());
+    }
+}
diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/media/MediaPlayerGlue.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/media/MediaPlayerGlue.java
new file mode 100644
index 0000000..f64899e
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/media/MediaPlayerGlue.java
@@ -0,0 +1,456 @@
+/*
+ * Copyright (C) 2015 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 android.support.v17.leanback.supportleanbackshowcase.app.media;
+
+import android.content.Context;
+import android.graphics.Color;
+import android.graphics.drawable.Drawable;
+import android.media.AudioManager;
+import android.media.MediaPlayer;
+import android.net.Uri;
+import android.os.Handler;
+import android.support.v17.leanback.app.PlaybackControlGlue;
+import android.support.v17.leanback.app.PlaybackOverlayFragment;
+import android.support.v17.leanback.supportleanbackshowcase.R;
+import android.support.v17.leanback.widget.Action;
+import android.support.v17.leanback.widget.ArrayObjectAdapter;
+import android.support.v17.leanback.widget.ControlButtonPresenterSelector;
+import android.support.v17.leanback.widget.OnItemViewSelectedListener;
+import android.support.v17.leanback.widget.PlaybackControlsRow;
+import android.support.v17.leanback.widget.PlaybackControlsRowPresenter;
+import android.support.v17.leanback.widget.Presenter;
+import android.support.v17.leanback.widget.Row;
+import android.support.v17.leanback.widget.RowPresenter;
+import android.util.Log;
+import android.view.KeyEvent;
+import android.view.SurfaceHolder;
+import android.view.View;
+
+import java.io.IOException;
+
+/**
+ * This glue extends the {@link PlaybackControlGlue} with a {@link MediaPlayer} synchronization. It
+ * supports 7 actions: <ul> <li>{@link android.support.v17.leanback.widget.PlaybackControlsRow.FastForwardAction}</li>
+ * <li>{@link android.support.v17.leanback.widget.PlaybackControlsRow.RewindAction}</li> <li>{@link
+ * android.support.v17.leanback.widget.PlaybackControlsRow.PlayPauseAction}</li> <li>{@link
+ * android.support.v17.leanback.widget.PlaybackControlsRow.ShuffleAction}</li> <li>{@link
+ * android.support.v17.leanback.widget.PlaybackControlsRow.RepeatAction}</li> <li>{@link
+ * android.support.v17.leanback.widget.PlaybackControlsRow.ThumbsDownAction}</li> <li>{@link
+ * android.support.v17.leanback.widget.PlaybackControlsRow.ThumbsUpAction}</li> </ul>
+ * <p/>
+ */
+public abstract class MediaPlayerGlue extends PlaybackControlGlue implements
+        OnItemViewSelectedListener {
+
+    public static final int FAST_FORWARD_REWIND_STEP = 10 * 1000; // in milliseconds
+    public static final int FAST_FORWARD_REWIND_REPEAT_DELAY = 200; // in milliseconds
+    private static final String TAG = "MediaPlayerGlue";
+    protected final PlaybackControlsRow.ThumbsDownAction mThumbsDownAction;
+    protected final PlaybackControlsRow.ThumbsUpAction mThumbsUpAction;
+    private final Context mContext;
+    private final MediaPlayer mPlayer = new MediaPlayer();
+    private final PlaybackControlsRow.RepeatAction mRepeatAction;
+    private final PlaybackControlsRow.ShuffleAction mShuffleAction;
+    private PlaybackControlsRow mControlsRow;
+    private Runnable mRunnable;
+    private Handler mHandler = new Handler();
+    private boolean mInitialized = false; // true when the MediaPlayer is prepared/initialized
+    private OnMediaFileFinishedPlayingListener mMediaFileFinishedPlayingListener;
+    private Action mSelectedAction; // the action which is currently selected by the user
+    private long mLastKeyDownEvent = 0L; // timestamp when the last DPAD_CENTER KEY_DOWN occurred
+    private MetaData mMetaData;
+    private Uri mMediaSourceUri = null;
+    private String mMediaSourcePath = null;
+
+    public MediaPlayerGlue(Context context, PlaybackOverlayFragment fragment) {
+        super(context, fragment, new int[]{1});
+        mContext = context;
+
+        // Instantiate secondary actions
+        mShuffleAction = new PlaybackControlsRow.ShuffleAction(mContext);
+        mRepeatAction = new PlaybackControlsRow.RepeatAction(mContext);
+        mThumbsDownAction = new PlaybackControlsRow.ThumbsDownAction(mContext);
+        mThumbsUpAction = new PlaybackControlsRow.ThumbsUpAction(mContext);
+        mThumbsDownAction.setIndex(PlaybackControlsRow.ThumbsAction.OUTLINE);
+        mThumbsUpAction.setIndex(PlaybackControlsRow.ThumbsAction.OUTLINE);
+
+        // Register selected listener such that we know what action the user currently has focused.
+        fragment.setOnItemViewSelectedListener(this);
+    }
+
+    /**
+     * Will reset the {@link MediaPlayer} and the glue such that a new file can be played. You are
+     * not required to call this method before playing the first file. However you have to call it
+     * before playing a second one.
+     */
+    void reset() {
+        mInitialized = false;
+        mPlayer.reset();
+    }
+
+    public void setOnMediaFileFinishedPlayingListener(OnMediaFileFinishedPlayingListener listener) {
+        mMediaFileFinishedPlayingListener = listener;
+    }
+
+    /**
+     * Override this method in case you need to add different secondary actions.
+     *
+     * @param secondaryActionsAdapter The adapter you need to add the {@link Action}s to.
+     */
+    protected void addSecondaryActions(ArrayObjectAdapter secondaryActionsAdapter) {
+        secondaryActionsAdapter.add(mShuffleAction);
+        secondaryActionsAdapter.add(mRepeatAction);
+        secondaryActionsAdapter.add(mThumbsDownAction);
+        secondaryActionsAdapter.add(mThumbsUpAction);
+    }
+
+    /**
+     * @see MediaPlayer#setDisplay(SurfaceHolder)
+     */
+    public void setDisplay(SurfaceHolder surfaceHolder) {
+        mPlayer.setDisplay(surfaceHolder);
+    }
+
+    /**
+     * Use this method to setup the {@link PlaybackControlsRowPresenter}. It'll be called
+     * <u>after</u> the {@link PlaybackControlsRowPresenter} has been created and the primary and
+     * secondary actions have been added.
+     *
+     * @param presenter The PlaybackControlsRowPresenter used to display the controls.
+     */
+    public void setupControlsRowPresenter(PlaybackControlsRowPresenter presenter) {
+        // TODO: hahnr@ move into resources
+        presenter.setProgressColor(getContext().getResources().getColor(
+                R.color.player_progress_color));
+        presenter.setBackgroundColor(getContext().getResources().getColor(
+                R.color.player_background_color));
+    }
+
+    @Override public PlaybackControlsRowPresenter createControlsRowAndPresenter() {
+        PlaybackControlsRowPresenter presenter = super.createControlsRowAndPresenter();
+        mControlsRow = getControlsRow();
+
+        // Add secondary actions and change the control row color.
+        ArrayObjectAdapter secondaryActions = new ArrayObjectAdapter(
+                new ControlButtonPresenterSelector());
+        mControlsRow.setSecondaryActionsAdapter(secondaryActions);
+        addSecondaryActions(secondaryActions);
+        setupControlsRowPresenter(presenter);
+        return presenter;
+    }
+
+    @Override public void enableProgressUpdating(final boolean enabled) {
+        if (!enabled) {
+            if (mRunnable != null) mHandler.removeCallbacks(mRunnable);
+            return;
+        }
+        mRunnable = new Runnable() {
+            @Override public void run() {
+                updateProgress();
+                Log.d(TAG, "enableProgressUpdating(boolean)");
+                mHandler.postDelayed(this, getUpdatePeriod());
+            }
+        };
+        mHandler.postDelayed(mRunnable, getUpdatePeriod());
+    }
+
+    @Override public void onActionClicked(Action action) {
+        // If either 'Shuffle' or 'Repeat' has been clicked we need to make sure the acitons index
+        // is incremented and the UI updated such that we can display the new state.
+        super.onActionClicked(action);
+        if (action instanceof PlaybackControlsRow.ShuffleAction) {
+            mShuffleAction.nextIndex();
+        } else if (action instanceof PlaybackControlsRow.RepeatAction) {
+            mRepeatAction.nextIndex();
+        } else if (action instanceof PlaybackControlsRow.ThumbsUpAction) {
+            if (mThumbsUpAction.getIndex() == PlaybackControlsRow.ThumbsAction.SOLID) {
+                mThumbsUpAction.setIndex(PlaybackControlsRow.ThumbsAction.OUTLINE);
+            } else {
+                mThumbsUpAction.setIndex(PlaybackControlsRow.ThumbsAction.SOLID);
+                mThumbsDownAction.setIndex(PlaybackControlsRow.ThumbsAction.OUTLINE);
+            }
+        } else if (action instanceof PlaybackControlsRow.ThumbsDownAction) {
+            if (mThumbsDownAction.getIndex() == PlaybackControlsRow.ThumbsAction.SOLID) {
+                mThumbsDownAction.setIndex(PlaybackControlsRow.ThumbsAction.OUTLINE);
+            } else {
+                mThumbsDownAction.setIndex(PlaybackControlsRow.ThumbsAction.SOLID);
+                mThumbsUpAction.setIndex(PlaybackControlsRow.ThumbsAction.OUTLINE);
+            }
+        }
+        onMetadataChanged();
+    }
+
+    @Override public boolean onKey(View v, int keyCode, KeyEvent event) {
+        // This method is overridden in order to make implement fast forwarding and rewinding when
+        // the user keeps the corresponding action pressed.
+        // We only consume DPAD_CENTER Action_DOWN events on the Fast-Forward and Rewind action and
+        // only if it has not been pressed in the last X milliseconds.
+        boolean consume = mSelectedAction instanceof PlaybackControlsRow.RewindAction;
+        consume = consume || mSelectedAction instanceof PlaybackControlsRow.FastForwardAction;
+        consume = consume && mInitialized;
+        consume = consume && event.getKeyCode() == KeyEvent.KEYCODE_DPAD_CENTER;
+        consume = consume && event.getAction() == KeyEvent.ACTION_DOWN;
+        consume = consume && System
+                .currentTimeMillis() - mLastKeyDownEvent > FAST_FORWARD_REWIND_REPEAT_DELAY;
+        if (consume) {
+            mLastKeyDownEvent = System.currentTimeMillis();
+            int newPosition = getCurrentPosition() + FAST_FORWARD_REWIND_STEP;
+            if (mSelectedAction instanceof PlaybackControlsRow.RewindAction) {
+                newPosition = getCurrentPosition() - FAST_FORWARD_REWIND_STEP;
+            }
+            // Make sure the new calculated duration is in the range 0 >= X >= MediaDuration
+            if (newPosition < 0) newPosition = 0;
+            if (newPosition > getMediaDuration()) newPosition = getMediaDuration();
+            seekTo(newPosition);
+            return true;
+        }
+        return super.onKey(v, keyCode, event);
+    }
+
+    @Override public boolean hasValidMedia() {
+        return mMetaData != null;
+    }
+
+    @Override public boolean isMediaPlaying() {
+        return mPlayer.isPlaying();
+    }
+
+    @Override public CharSequence getMediaTitle() {
+        return hasValidMedia() ? mMetaData.getTitle() : "N/a";
+    }
+
+    @Override public CharSequence getMediaSubtitle() {
+        return hasValidMedia() ? mMetaData.getArtist() : "N/a";
+    }
+
+    @Override public int getMediaDuration() {
+        return mInitialized ? mPlayer.getDuration() : 0;
+    }
+
+    @Override public Drawable getMediaArt() {
+        return hasValidMedia() ? mMetaData.getCover() : null;
+    }
+
+    @Override public long getSupportedActions() {
+        return PlaybackControlGlue.ACTION_PLAY_PAUSE | PlaybackControlGlue.ACTION_FAST_FORWARD | PlaybackControlGlue.ACTION_REWIND;
+    }
+
+    @Override public int getCurrentSpeedId() {
+        // 0 = Pause, 1 = Normal Playback Speed
+        return mPlayer.isPlaying() ? 1 : 0;
+    }
+
+    @Override public int getCurrentPosition() {
+        return mInitialized ? mPlayer.getCurrentPosition() : 0;
+    }
+
+    @Override protected void startPlayback(int speed) throws IllegalStateException {
+        mPlayer.start();
+    }
+
+    @Override protected void pausePlayback() {
+        if (mPlayer.isPlaying()) {
+            mPlayer.pause();
+        }
+    }
+
+    @Override protected void skipToNext() {
+        // Not supported.
+    }
+
+    @Override protected void skipToPrevious() {
+        // Not supported.
+    }
+
+    /**
+     * Called whenever the user presses fast-forward/rewind or when the user keeps the corresponding
+     * action pressed.
+     *
+     * @param newPosition The new position of the media track in milliseconds.
+     */
+    protected void seekTo(int newPosition) {
+        mPlayer.seekTo(newPosition);
+    }
+
+    /**
+     * Sets the media source of the player witha given URI.
+     * @see MediaPlayer#setDataSource(String)
+     * @return Returns <code>true</code> if uri represents a new media; <code>false</code>
+     * otherwise.
+     */
+    public boolean setMediaSource(Uri uri) {
+        if (mMediaSourceUri != null && mMediaSourceUri.equals(uri)) {
+            return false;
+        }
+        mMediaSourceUri = uri;
+        return true;
+    }
+
+    /**
+     * Sets the media source of the player with a String path URL.
+     * @see MediaPlayer#setDataSource(String)
+     * @return Returns <code>true</code> if path represents a new media; <code>false</code>
+     * otherwise.
+     */
+    public boolean setMediaSource(String path) {
+        if (mMediaSourcePath != null && mMediaSourcePath.equals(mMediaSourcePath)) {
+            return false;
+        }
+        mMediaSourcePath = path;
+        return true;
+    }
+
+    public void prepareMediaForPlaying() {
+        reset();
+        try {
+            if (mMediaSourceUri != null) mPlayer.setDataSource(getContext(), mMediaSourceUri);
+            else mPlayer.setDataSource(mMediaSourcePath);
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
+        mPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
+            @Override public void onPrepared(MediaPlayer mp) {
+                mInitialized = true;
+                mPlayer.start();
+                onMetadataChanged();
+                onStateChanged();
+                updateProgress();
+            }
+        });
+        mPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
+            @Override public void onCompletion(MediaPlayer mp) {
+                if (mInitialized && mMediaFileFinishedPlayingListener != null)
+                    mMediaFileFinishedPlayingListener.onMediaFileFinishedPlaying(mMetaData);
+            }
+        });
+        mPlayer.setOnBufferingUpdateListener(new MediaPlayer.OnBufferingUpdateListener() {
+            @Override public void onBufferingUpdate(MediaPlayer mp, int percent) {
+                mControlsRow.setBufferedProgress((int) (mp.getDuration() * (percent / 100f)));
+            }
+        });
+        mPlayer.prepareAsync();
+        onStateChanged();
+    }
+
+    /**
+     * Call to <code>startPlayback(1)</code>.
+     *
+     * @throws IllegalStateException See {@link MediaPlayer} for further information about it's
+     * different states when setting a data source and preparing it to be played.
+     */
+    public void startPlayback() throws IllegalStateException {
+        startPlayback(1);
+    }
+
+    /**
+     * @return Returns <code>true</code> iff 'Shuffle' is <code>ON</code>.
+     */
+    public boolean useShuffle() {
+        return mShuffleAction.getIndex() == PlaybackControlsRow.ShuffleAction.ON;
+    }
+
+    /**
+     * @return Returns <code>true</code> iff 'Repeat-One' is <code>ON</code>.
+     */
+    public boolean repeatOne() {
+        return mRepeatAction.getIndex() == PlaybackControlsRow.RepeatAction.ONE;
+    }
+
+    /**
+     * @return Returns <code>true</code> iff 'Repeat-All' is <code>ON</code>.
+     */
+    public boolean repeatAll() {
+        return mRepeatAction.getIndex() == PlaybackControlsRow.RepeatAction.ALL;
+    }
+
+    public void setMetaData(MetaData metaData) {
+        mMetaData = metaData;
+        onMetadataChanged();
+    }
+
+    /**
+     * This is a listener implementation for the {@link OnItemViewSelectedListener} of the {@link
+     * PlaybackOverlayFragment}. This implementation is required in order to detect KEY_DOWN events
+     * on the {@link android.support.v17.leanback.widget.PlaybackControlsRow.FastForwardAction} and
+     * {@link android.support.v17.leanback.widget.PlaybackControlsRow.RewindAction}. Thus you should
+     * <u>NOT</u> set another {@link OnItemViewSelectedListener} on your {@link
+     * PlaybackOverlayFragment}. Instead, override this method and call its super (this)
+     * implementation.
+     *
+     * @see OnItemViewSelectedListener#onItemSelected(Presenter.ViewHolder, Object,
+     * RowPresenter.ViewHolder, Row)
+     */
+    @Override public void onItemSelected(Presenter.ViewHolder itemViewHolder, Object item,
+                                         RowPresenter.ViewHolder rowViewHolder, Row row) {
+        if (item instanceof Action) {
+            mSelectedAction = (Action) item;
+        } else {
+            mSelectedAction = null;
+        }
+    }
+
+    /**
+     * A listener which will be called whenever a track is finished playing.
+     */
+    public interface OnMediaFileFinishedPlayingListener {
+
+        /**
+         * Called when a track is finished playing.
+         *
+         * @param metaData The track's {@link MetaData} which just finished playing.
+         */
+        void onMediaFileFinishedPlaying(MetaData metaData);
+
+    }
+
+    /**
+     * Holds the meta data such as track title, artist and cover art. It'll be used by the {@link
+     * MediaPlayerGlue}.
+     */
+    public static class MetaData {
+
+        private String mTitle;
+        private String mArtist;
+        private Drawable mCover;
+
+        public String getTitle() {
+            return mTitle;
+        }
+
+        public void setTitle(String title) {
+            this.mTitle = title;
+        }
+
+        public String getArtist() {
+            return mArtist;
+        }
+
+        public void setArtist(String artist) {
+            this.mArtist = artist;
+        }
+
+        public Drawable getCover() {
+            return mCover;
+        }
+
+        public void setCover(Drawable cover) {
+            this.mCover = cover;
+        }
+
+    }
+
+}
diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/media/MusicConsumptionExampleFragment.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/media/MusicConsumptionExampleFragment.java
new file mode 100644
index 0000000..0650cfc
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/media/MusicConsumptionExampleFragment.java
@@ -0,0 +1,313 @@
+/*
+ * Copyright (C) 2015 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 android.support.v17.leanback.supportleanbackshowcase.app.media;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.drawable.Drawable;
+import android.net.Uri;
+import android.os.Bundle;
+import android.support.v17.leanback.app.PlaybackOverlayFragment;
+import android.support.v17.leanback.supportleanbackshowcase.utils.Constants;
+import android.support.v17.leanback.supportleanbackshowcase.R;
+import android.support.v17.leanback.supportleanbackshowcase.utils.Utils;
+import android.support.v17.leanback.supportleanbackshowcase.models.Song;
+import android.support.v17.leanback.supportleanbackshowcase.models.SongList;
+import android.support.v17.leanback.widget.*;
+import android.support.v17.leanback.widget.AbstractMediaItemPresenter;
+import android.util.Log;
+
+import com.google.gson.Gson;
+
+import java.util.List;
+
+/**
+ * This example shows how to play music files and build a simple track list.
+ */
+public class MusicConsumptionExampleFragment extends PlaybackOverlayFragment implements
+        BaseOnItemViewClickedListener, BaseOnItemViewSelectedListener,
+        MediaPlayerGlue.OnMediaFileFinishedPlayingListener {
+
+    private static final String TAG = "MusicConsumptionExampleFragment";
+    private static final int PLAYLIST_ACTION_ID = 0;
+    private static final int FAVORITE_ACTION_ID = 1;
+    private ArrayObjectAdapter mRowsAdapter;
+    private MediaPlayerGlue mGlue;
+    private int mCurrentSongIndex = 0;
+    private List<Song> mSongList;
+    private boolean mAdapterNotified = false;
+
+    @Override public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        if (Constants.LOCAL_LOGD) Log.d(TAG, "onCreate");
+
+        mGlue = new MediaPlayerGlue(getActivity(), this) {
+
+            @Override protected void onRowChanged(PlaybackControlsRow row) {
+                if (mRowsAdapter == null || mAdapterNotified) return;
+                //mAdapterNotified = true;
+                mRowsAdapter.notifyArrayItemRangeChanged(0, 1);
+            }
+        };
+        mGlue.setOnMediaFileFinishedPlayingListener(this);
+
+        String json = Utils.inputStreamToString(
+                getResources().openRawResource(R.raw.music_consumption_example));
+
+
+        mSongList = new Gson().fromJson(json, SongList.class).getSongs();
+
+        Resources res = getActivity().getResources();
+
+        // For each song add a playlist and favorite actions.
+        for(Song song : mSongList) {
+            MultiActionsProvider.MultiAction[] mediaRowActions = new
+                    MultiActionsProvider.MultiAction[2];
+            MultiActionsProvider.MultiAction playlistAction = new
+                    MultiActionsProvider.MultiAction(PLAYLIST_ACTION_ID);
+            Drawable[] playlistActionDrawables = new Drawable[] {
+                    res.getDrawable(R.drawable.ic_playlist_add_white_24dp,
+                            getActivity().getTheme()),
+                    res.getDrawable(R.drawable.ic_playlist_add_filled_24dp,
+                            getActivity().getTheme())};
+            playlistAction.setDrawables(playlistActionDrawables);
+            mediaRowActions[0] = playlistAction;
+
+            MultiActionsProvider.MultiAction favoriteAction = new
+                    MultiActionsProvider.MultiAction(FAVORITE_ACTION_ID);
+            Drawable[] favoriteActionDrawables = new Drawable[] {
+                    res.getDrawable(R.drawable.ic_favorite_border_white_24dp,
+                            getActivity().getTheme()),
+                    res.getDrawable(R.drawable.ic_favorite_filled_24dp,
+                            getActivity().getTheme())};
+            favoriteAction.setDrawables(favoriteActionDrawables);
+            mediaRowActions[1] = favoriteAction;
+            song.setMediaRowActions(mediaRowActions);
+        }
+
+        Song song = mSongList.get(mCurrentSongIndex);
+        MediaPlayerGlue.MetaData metaData = new MediaPlayerGlue.MetaData();
+        metaData.setArtist(song.getDescription());
+        metaData.setTitle(song.getTitle());
+        metaData.setCover(getResources().getDrawable(song.getImageResource(getActivity()), null));
+        Uri uri = Utils.getResourceUri(getActivity(), song.getFileResource(getActivity()));
+        mGlue.setMetaData(metaData);
+        mGlue.setMediaSource(uri);
+        mGlue.prepareMediaForPlaying();
+
+        addPlaybackControlsRow();
+    }
+
+    @Override public void onStart() {
+        super.onStart();
+        mGlue.enableProgressUpdating(mGlue.hasValidMedia() && mGlue.isMediaPlaying());
+    }
+
+    @Override public void onStop() {
+        super.onStop();
+        mGlue.enableProgressUpdating(false);
+        mGlue.reset();
+    }
+
+    static class SongPresenter extends AbstractMediaItemPresenter {
+
+        SongPresenter() {
+            super();
+        }
+
+        SongPresenter(Context context, int themeResId) {
+            super(themeResId);
+            setHasMediaRowSeparator(true);
+        }
+
+        @Override
+        protected void onBindMediaDetails(ViewHolder vh, Object item) {
+
+            int favoriteTextColor =  vh.view.getContext().getResources().getColor(
+                    R.color.song_row_favorite_color);
+            Song song = (Song) item;
+            vh.getMediaItemNumberView().setText("" + song.getNumber());
+
+            String songTitle = song.getTitle() + " / " + song.getDescription();
+            vh.getMediaItemNameView().setText(songTitle);
+
+            vh.getMediaItemDurationView().setText("" + song.getDuration());
+
+            if (song.isFavorite()) {
+                vh.getMediaItemNumberView().setTextColor(favoriteTextColor);
+                vh.getMediaItemNameView().setTextColor(favoriteTextColor);
+                vh.getMediaItemDurationView().setTextColor(favoriteTextColor);
+            } else {
+                Context context = vh.getMediaItemNumberView().getContext();
+                vh.getMediaItemNumberView().setTextAppearance(context,
+                        R.style.TextAppearance_Leanback_PlaybackMediaItemNumber);
+                vh.getMediaItemNameView().setTextAppearance(context,
+                        R.style.TextAppearance_Leanback_PlaybackMediaItemName);
+                vh.getMediaItemDurationView().setTextAppearance(context,
+                        R.style.TextAppearance_Leanback_PlaybackMediaItemDuration);
+            }
+        }
+    };
+
+    static class SongPresenterSelector extends PresenterSelector {
+        Presenter mRegularPresenter;
+        Presenter mFavoritePresenter;
+
+        /**
+         * Adds a presenter to be used for the given class.
+         */
+        public SongPresenterSelector setSongPresenterRegular(Presenter presenter) {
+            mRegularPresenter = presenter;
+            return this;
+        }
+
+        /**
+         * Adds a presenter to be used for the given class.
+         */
+        public SongPresenterSelector setSongPresenterFavorite(Presenter presenter) {
+            mFavoritePresenter = presenter;
+            return this;
+        }
+
+        @Override
+        public Presenter[] getPresenters() {
+            return new Presenter[]{mRegularPresenter, mFavoritePresenter};
+        }
+
+        @Override
+        public Presenter getPresenter(Object item) {
+            return ( (Song) item).isFavorite() ? mFavoritePresenter : mRegularPresenter;
+        }
+
+    }
+
+    static class TrackListHeaderPresenter extends AbstractMediaListHeaderPresenter {
+
+        TrackListHeaderPresenter() {
+            super();
+        }
+
+        @Override
+        protected void onBindMediaListHeaderViewHolder(ViewHolder vh, Object item) {
+            vh.getHeaderView().setText("Tracklist");
+        }
+    };
+
+    private void addPlaybackControlsRow() {
+        mRowsAdapter = new ArrayObjectAdapter(new ClassPresenterSelector()
+                .addClassPresenterSelector(Song.class, new SongPresenterSelector()
+                        .setSongPresenterRegular(new SongPresenter(getActivity(),
+                                R.style.Theme_Example_LeanbackMusic_RegularSongNumbers))
+                        .setSongPresenterFavorite(new SongPresenter(getActivity(),
+                                R.style.Theme_Example_LeanbackMusic_FavoriteSongNumbers)))
+                .addClassPresenter(TrackListHeader.class, new TrackListHeaderPresenter())
+                .addClassPresenter(PlaybackControlsRow.class,
+                        mGlue.createControlsRowAndPresenter()));
+        mRowsAdapter.add(mGlue.getControlsRow());
+        mRowsAdapter.add(new TrackListHeader());
+        mRowsAdapter.addAll(2, mSongList);
+        setAdapter(mRowsAdapter);
+        setOnItemViewClickedListener(this);
+        setOnItemViewSelectedListener(this);
+    }
+
+    public MusicConsumptionExampleFragment() {
+        super();
+    }
+
+
+
+    @Override public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
+                                        RowPresenter.ViewHolder rowViewHolder, Object row) {
+
+        if (item instanceof  Action) {
+            // if the clicked item is a primary or secondary action in the playback controller
+            mGlue.onActionClicked((Action) item);
+        } else if (row instanceof  Song) {
+            // if a media item row is clicked
+            Song clickedSong = (Song) row;
+            AbstractMediaItemPresenter.ViewHolder songRowVh =
+                    (AbstractMediaItemPresenter.ViewHolder) rowViewHolder;
+
+            // if an action within a media item row is clicked
+            if (item instanceof MultiActionsProvider.MultiAction) {
+                if ( ((MultiActionsProvider.MultiAction) item).getId() == FAVORITE_ACTION_ID) {
+                    MultiActionsProvider.MultiAction favoriteAction =
+                            (MultiActionsProvider.MultiAction) item;
+                    MultiActionsProvider.MultiAction playlistAction =
+                            songRowVh.getMediaItemRowActions()[0];
+                    favoriteAction.incrementIndex();
+                    playlistAction.incrementIndex();;
+
+                    clickedSong.setFavorite(!clickedSong.isFavorite());
+                    songRowVh.notifyDetailsChanged();
+                    songRowVh.notifyActionChanged(playlistAction);
+                    songRowVh.notifyActionChanged(favoriteAction);
+                }
+            } else if (item == null){
+                // if a media item details is clicked, start playing that media item
+                onSongDetailsClicked(clickedSong);
+            }
+
+        }
+
+
+    }
+
+    @Override
+    public void onItemSelected(Presenter.ViewHolder itemViewHolder, Object item,
+                               RowPresenter.ViewHolder rowViewHolder, Object row) {
+    }
+
+
+    public void onSongDetailsClicked(Song song) {
+        int nextSongIndex = mSongList.indexOf(song);
+        mCurrentSongIndex = nextSongIndex;
+        startPlayback();
+    }
+
+
+    @Override public void onMediaFileFinishedPlaying(MediaPlayerGlue.MetaData song) {
+        if (mGlue.repeatOne()) {
+        } else if (mGlue.useShuffle()) {
+            mCurrentSongIndex = (int) (Math.random() * mSongList.size());
+        } else {
+            mCurrentSongIndex++;
+            if (mCurrentSongIndex >= mSongList.size()) {
+                mCurrentSongIndex = 0;
+                if (!mGlue.repeatAll()) {
+                    return;
+                }
+            }
+        }
+        startPlayback();
+    }
+
+    private void startPlayback() {
+        Song song = mSongList.get(mCurrentSongIndex);
+        MediaPlayerGlue.MetaData metaData = new MediaPlayerGlue.MetaData();
+        metaData.setArtist(song.getDescription());
+        metaData.setTitle(song.getTitle());
+        metaData.setCover(getResources().getDrawable(song.getImageResource(getActivity()), null));
+
+        Uri uri = Utils.getResourceUri(getActivity(), song.getFileResource(getActivity()));
+        mGlue.setMetaData(metaData);
+
+        if (mGlue.setMediaSource(uri)) {
+            mGlue.prepareMediaForPlaying();
+        }
+        mGlue.startPlayback();
+    }
+}
diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/media/MusicExampleActivity.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/media/MusicExampleActivity.java
new file mode 100644
index 0000000..3107ed6
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/media/MusicExampleActivity.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2014 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 android.support.v17.leanback.supportleanbackshowcase.app.media;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.support.v17.leanback.supportleanbackshowcase.R;
+
+/**
+ * TODO: Javadoc
+ */
+public class MusicExampleActivity extends Activity {
+
+    @Override public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_music_example);
+    }
+}
diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/media/SongListRow.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/media/SongListRow.java
new file mode 100644
index 0000000..4096132
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/media/SongListRow.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright (C) 2015 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 android.support.v17.leanback.supportleanbackshowcase.app.media;
+
+import android.support.v17.leanback.widget.Row;
+
+public class SongListRow extends Row {}
diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/media/TrackListHeader.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/media/TrackListHeader.java
new file mode 100644
index 0000000..0206748
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/media/TrackListHeader.java
@@ -0,0 +1,21 @@
+/*
+ * Copyright (C) 2015 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 android.support.v17.leanback.supportleanbackshowcase.app.media;
+
+import android.support.v17.leanback.widget.Row;
+
+public class TrackListHeader extends Row {
+}
diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/media/VideoConsumptionExampleFragment.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/media/VideoConsumptionExampleFragment.java
new file mode 100644
index 0000000..ca33b42
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/media/VideoConsumptionExampleFragment.java
@@ -0,0 +1,120 @@
+/*
+ * Copyright (C) 2015 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 android.support.v17.leanback.supportleanbackshowcase.app.media;
+
+import android.app.Fragment;
+import android.os.Bundle;
+import android.support.v17.leanback.app.PlaybackOverlayFragment;
+import android.support.v17.leanback.widget.Action;
+import android.support.v17.leanback.widget.ArrayObjectAdapter;
+import android.support.v17.leanback.widget.OnItemViewClickedListener;
+import android.support.v17.leanback.widget.PlaybackControlsRow;
+import android.support.v17.leanback.widget.PlaybackControlsRowPresenter;
+import android.support.v17.leanback.widget.Presenter;
+import android.support.v17.leanback.widget.Row;
+import android.support.v17.leanback.widget.RowPresenter;
+import android.view.SurfaceHolder;
+import android.view.SurfaceView;
+
+
+public class VideoConsumptionExampleFragment extends PlaybackOverlayFragment implements
+        OnItemViewClickedListener, MediaPlayerGlue.OnMediaFileFinishedPlayingListener {
+
+    private static final String URL = "http://techslides.com/demos/sample-videos/small.mp4";
+    public static final String TAG = "VideoConsumptionExampleFragment";
+    private ArrayObjectAdapter mRowsAdapter;
+    private MediaPlayerGlue mGlue;
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        mGlue = new VideoMediaPlayerGlue(getActivity(), this) {
+
+            @Override
+            protected void onRowChanged(PlaybackControlsRow row) {
+                if (mRowsAdapter == null) return;
+                mRowsAdapter.notifyArrayItemRangeChanged(0, 1);
+            }
+        };
+        mGlue.setOnMediaFileFinishedPlayingListener(this);
+        MediaPlayerGlue.MetaData metaData = new MediaPlayerGlue.MetaData();
+        metaData.setArtist("A Googler");
+        metaData.setTitle("Diving with Sharks");
+        mGlue.setMetaData(metaData);
+        mGlue.setMediaSource(URL);
+        mGlue.prepareMediaForPlaying();
+
+
+        Fragment videoSurfaceFragment = getFragmentManager()
+                .findFragmentByTag(VideoSurfaceFragment.TAG);
+
+        SurfaceView surface = (SurfaceView) videoSurfaceFragment.getView();
+        surface.getHolder().addCallback(new SurfaceHolder.Callback() {
+            @Override
+            public void surfaceCreated(SurfaceHolder holder) {
+                mGlue.setDisplay(holder);
+            }
+
+            @Override
+            public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
+                // Nothing to do
+            }
+
+            @Override
+            public void surfaceDestroyed(SurfaceHolder holder) {
+            }
+        });
+
+        setBackgroundType(PlaybackOverlayFragment.BG_LIGHT);
+        addPlaybackControlsRow();
+    }
+
+    @Override
+    public void onStart() {
+        super.onStart();
+        mGlue.enableProgressUpdating(mGlue.hasValidMedia() && mGlue.isMediaPlaying());
+    }
+
+    @Override
+    public void onStop() {
+        super.onStop();
+        mGlue.enableProgressUpdating(false);
+        mGlue.reset();
+    }
+
+    private void addPlaybackControlsRow() {
+        final PlaybackControlsRowPresenter controlsPresenter = mGlue
+                .createControlsRowAndPresenter();
+        mRowsAdapter = new ArrayObjectAdapter(controlsPresenter);
+        mRowsAdapter.add(mGlue.getControlsRow());
+        setAdapter(mRowsAdapter);
+        setOnItemViewClickedListener(this);
+    }
+
+    @Override
+    public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
+                              RowPresenter.ViewHolder rowViewHolder, Row row) {
+        if (!(item instanceof Action)) return;
+        mGlue.onActionClicked((Action) item);
+    }
+
+
+    @Override
+    public void onMediaFileFinishedPlaying(MediaPlayerGlue.MetaData metaData) {
+        mGlue.startPlayback();
+    }
+
+}
diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/media/VideoExampleActivity.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/media/VideoExampleActivity.java
new file mode 100644
index 0000000..2e87654
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/media/VideoExampleActivity.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2014 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 android.support.v17.leanback.supportleanbackshowcase.app.media;
+
+import android.app.Activity;
+import android.app.FragmentTransaction;
+import android.os.Bundle;
+import android.support.v17.leanback.supportleanbackshowcase.R;
+
+/**
+ * TODO: Javadoc
+ */
+public class VideoExampleActivity extends Activity {
+
+    public static final String TAG = "VideoExampleActivity";
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_video_example);
+
+        FragmentTransaction ft1 = getFragmentManager().beginTransaction();
+        ft1.replace(R.id.videoFragment, new VideoSurfaceFragment(), VideoSurfaceFragment.TAG);
+        ft1.commit();
+
+        FragmentTransaction ft2 = getFragmentManager().beginTransaction();
+        ft2.add(R.id.videoFragment, new VideoConsumptionExampleFragment(), VideoConsumptionExampleFragment.TAG);
+        ft2.commit();
+    }
+
+}
diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/media/VideoMediaPlayerGlue.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/media/VideoMediaPlayerGlue.java
new file mode 100644
index 0000000..52ab09f
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/media/VideoMediaPlayerGlue.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2015 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 android.support.v17.leanback.supportleanbackshowcase.app.media;
+
+import android.content.Context;
+import android.graphics.Color;
+import android.support.v17.leanback.app.PlaybackOverlayFragment;
+import android.support.v17.leanback.supportleanbackshowcase.app.media.MediaPlayerGlue;
+import android.support.v17.leanback.widget.Action;
+import android.support.v17.leanback.widget.ArrayObjectAdapter;
+import android.support.v17.leanback.widget.PlaybackControlsRow;
+import android.support.v17.leanback.widget.PlaybackControlsRowPresenter;
+
+public abstract class VideoMediaPlayerGlue extends MediaPlayerGlue {
+
+    private final PlaybackControlsRow.ClosedCaptioningAction mClosedCaptioningAction;
+
+    public VideoMediaPlayerGlue(Context context, PlaybackOverlayFragment fragment) {
+        super(context, fragment);
+
+        // Instantiate secondary actions
+        mClosedCaptioningAction = new PlaybackControlsRow.ClosedCaptioningAction(context);
+        setFadingEnabled(true);
+    }
+
+    @Override protected void addSecondaryActions(ArrayObjectAdapter secondaryActionsAdapter) {
+        secondaryActionsAdapter.add(mClosedCaptioningAction);
+        secondaryActionsAdapter.add(mThumbsDownAction);
+        secondaryActionsAdapter.add(mThumbsUpAction);
+    }
+
+    @Override public void onActionClicked(Action action) {
+        super.onActionClicked(action);
+        if (action == mClosedCaptioningAction) {
+            mClosedCaptioningAction.nextIndex();
+        }
+    }
+
+    public void setupControlsRowPresenter(PlaybackControlsRowPresenter presenter) {
+        // TODO: hahnr@ move into resources
+        presenter.setProgressColor(Color.parseColor("#EEFF41"));
+        presenter.setBackgroundColor(Color.parseColor("#007236"));
+    }
+}
diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/media/VideoSurfaceFragment.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/media/VideoSurfaceFragment.java
new file mode 100644
index 0000000..569309d
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/media/VideoSurfaceFragment.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2015 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 android.support.v17.leanback.supportleanbackshowcase.app.media;
+
+import android.app.Fragment;
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.support.v17.leanback.supportleanbackshowcase.R;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+
+public class VideoSurfaceFragment extends Fragment {
+
+    public static final String TAG = "VideoSurfaceFragment";
+
+    @Override public void onCreate(Bundle savedInstanceState) {
+        Log.d(TAG, "onCreate started");
+        super.onCreate(savedInstanceState);
+
+    }
+
+    @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container,
+                                                 Bundle savedInstanceState) {
+        return inflater.inflate(R.layout.video_surface_fragment, null);
+    }
+}
diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/page/CustomTitleView.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/page/CustomTitleView.java
new file mode 100644
index 0000000..10ca3e9
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/page/CustomTitleView.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2015 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 android.support.v17.leanback.supportleanbackshowcase.app.page;
+
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+import android.support.v17.leanback.supportleanbackshowcase.R;
+import android.support.v17.leanback.widget.TitleViewAdapter;
+import android.util.AttributeSet;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
+
+/**
+ * Custom title view to be used in {@link android.support.v17.leanback.app.BrowseFragment}.
+ */
+public class CustomTitleView extends RelativeLayout implements TitleViewAdapter.Provider {
+    private final TextView mTitleView;
+    private final ImageView mBadgeView;
+
+    private final TitleViewAdapter mTitleViewAdapter = new TitleViewAdapter() {
+        @Override
+        public View getSearchAffordanceView() {
+            return null;
+        }
+
+        @Override
+        public void setTitle(CharSequence titleText) {
+            CustomTitleView.this.setTitle(titleText);
+        }
+
+        @Override
+        public void setBadgeDrawable(Drawable drawable) {
+            CustomTitleView.this.setBadgeDrawable(drawable);
+        }
+    };
+
+    public CustomTitleView(Context context) {
+        this(context, null);
+    }
+
+    public CustomTitleView(Context context, AttributeSet attrs) {
+        this(context, attrs, 0);
+    }
+
+    public CustomTitleView(Context context, AttributeSet attrs, int defStyle) {
+        super(context, attrs, defStyle);
+        View root  = LayoutInflater.from(context).inflate(R.layout.custom_titleview, this);
+        mTitleView = (TextView) root.findViewById(R.id.title_tv);
+        mBadgeView = (ImageView)root.findViewById(R.id.title_badge_iv);
+    }
+
+    public void setTitle(CharSequence title) {
+        if (title != null) {
+            mTitleView.setText(title);
+            mTitleView.setVisibility(View.VISIBLE);
+            mBadgeView.setVisibility(View.GONE);
+        }
+    }
+
+
+    public void setBadgeDrawable(Drawable drawable) {
+        if (drawable != null) {
+            mTitleView.setVisibility(View.GONE);
+            mBadgeView.setImageDrawable(drawable);
+            mBadgeView.setVisibility(View.VISIBLE);
+        }
+    }
+
+    @Override
+    public TitleViewAdapter getTitleViewAdapter() {
+        return mTitleViewAdapter;
+    }
+}
diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/page/GridFragment.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/page/GridFragment.java
new file mode 100644
index 0000000..a1a25a5
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/page/GridFragment.java
@@ -0,0 +1,219 @@
+/*
+ * Copyright (C) 2015 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 android.support.v17.leanback.supportleanbackshowcase.app.page;
+
+import android.app.Fragment;
+import android.os.Bundle;
+import android.support.v17.leanback.app.BrowseFragment;
+import android.support.v17.leanback.supportleanbackshowcase.R;
+import android.support.v17.leanback.transition.TransitionHelper;
+import android.support.v17.leanback.widget.ObjectAdapter;
+import android.support.v17.leanback.widget.OnChildLaidOutListener;
+import android.support.v17.leanback.widget.OnItemViewClickedListener;
+import android.support.v17.leanback.widget.OnItemViewSelectedListener;
+import android.support.v17.leanback.widget.Presenter;
+import android.support.v17.leanback.widget.Row;
+import android.support.v17.leanback.widget.RowPresenter;
+import android.support.v17.leanback.widget.VerticalGridPresenter;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+/**
+ * A fragment for rendering items in a vertical grids.
+ */
+public class GridFragment extends Fragment implements BrowseFragment.MainFragmentAdapterProvider {
+    private static final String TAG = "VerticalGridFragment";
+    private static boolean DEBUG = false;
+
+    private ObjectAdapter mAdapter;
+    private VerticalGridPresenter mGridPresenter;
+    private VerticalGridPresenter.ViewHolder mGridViewHolder;
+    private OnItemViewSelectedListener mOnItemViewSelectedListener;
+    private OnItemViewClickedListener mOnItemViewClickedListener;
+    private Object mSceneAfterEntranceTransition;
+    private int mSelectedPosition = -1;
+    private BrowseFragment.MainFragmentAdapter mMainFragmentAdapter =
+            new BrowseFragment.MainFragmentAdapter(this) {
+                @Override
+                public void setEntranceTransitionState(boolean state) {
+                    GridFragment.this.setEntranceTransitionState(state);
+                }
+            };
+    /**
+     * Sets the grid presenter.
+     */
+    public void setGridPresenter(VerticalGridPresenter gridPresenter) {
+        if (gridPresenter == null) {
+            throw new IllegalArgumentException("Grid presenter may not be null");
+        }
+        mGridPresenter = gridPresenter;
+        mGridPresenter.setOnItemViewSelectedListener(mViewSelectedListener);
+        if (mOnItemViewClickedListener != null) {
+            mGridPresenter.setOnItemViewClickedListener(mOnItemViewClickedListener);
+        }
+    }
+
+    /**
+     * Returns the grid presenter.
+     */
+    public VerticalGridPresenter getGridPresenter() {
+        return mGridPresenter;
+    }
+
+    /**
+     * Sets the object adapter for the fragment.
+     */
+    public void setAdapter(ObjectAdapter adapter) {
+        mAdapter = adapter;
+        updateAdapter();
+    }
+
+    /**
+     * Returns the object adapter.
+     */
+    public ObjectAdapter getAdapter() {
+        return mAdapter;
+    }
+
+    final private OnItemViewSelectedListener mViewSelectedListener =
+            new OnItemViewSelectedListener() {
+                @Override
+                public void onItemSelected(Presenter.ViewHolder itemViewHolder, Object item,
+                                           RowPresenter.ViewHolder rowViewHolder, Row row) {
+                    int position = mGridViewHolder.getGridView().getSelectedPosition();
+                    if (DEBUG) Log.v(TAG, "grid selected position " + position);
+                    gridOnItemSelected(position);
+                    if (mOnItemViewSelectedListener != null) {
+                        mOnItemViewSelectedListener.onItemSelected(itemViewHolder, item,
+                                rowViewHolder, row);
+                    }
+                }
+            };
+
+    final private OnChildLaidOutListener mChildLaidOutListener =
+            new OnChildLaidOutListener() {
+                @Override
+                public void onChildLaidOut(ViewGroup parent, View view, int position, long id) {
+                    if (position == 0) {
+                        showOrHideTitle();
+                    }
+                }
+            };
+
+    /**
+     * Sets an item selection listener.
+     */
+    public void setOnItemViewSelectedListener(OnItemViewSelectedListener listener) {
+        mOnItemViewSelectedListener = listener;
+    }
+
+    private void gridOnItemSelected(int position) {
+        if (position != mSelectedPosition) {
+            mSelectedPosition = position;
+            showOrHideTitle();
+        }
+    }
+
+    private void showOrHideTitle() {
+        if (mGridViewHolder.getGridView().findViewHolderForAdapterPosition(mSelectedPosition)
+                == null) {
+            return;
+        }
+        if (!mGridViewHolder.getGridView().hasPreviousViewInSameRow(mSelectedPosition)) {
+            mMainFragmentAdapter.getFragmentHost().showTitleView(true);
+        } else {
+            mMainFragmentAdapter.getFragmentHost().showTitleView(false);
+        }
+    }
+
+    /**
+     * Sets an item clicked listener.
+     */
+    public void setOnItemViewClickedListener(OnItemViewClickedListener listener) {
+        mOnItemViewClickedListener = listener;
+        if (mGridPresenter != null) {
+            mGridPresenter.setOnItemViewClickedListener(mOnItemViewClickedListener);
+        }
+    }
+
+    /**
+     * Returns the item clicked listener.
+     */
+    public OnItemViewClickedListener getOnItemViewClickedListener() {
+        return mOnItemViewClickedListener;
+    }
+
+    @Override
+    public View onCreateView(LayoutInflater inflater, ViewGroup container,
+                             Bundle savedInstanceState) {
+        return inflater.inflate(R.layout.grid_fragment, container, false);
+    }
+
+    @Override
+    public void onViewCreated(View view, Bundle savedInstanceState) {
+        super.onViewCreated(view, savedInstanceState);
+        ViewGroup gridDock = (ViewGroup) view.findViewById(R.id.browse_grid_dock);
+        mGridViewHolder = mGridPresenter.onCreateViewHolder(gridDock);
+        gridDock.addView(mGridViewHolder.view);
+        mGridViewHolder.getGridView().setOnChildLaidOutListener(mChildLaidOutListener);
+
+        mSceneAfterEntranceTransition = TransitionHelper.createScene(gridDock, new Runnable() {
+            @Override
+            public void run() {
+                setEntranceTransitionState(true);
+            }
+        });
+
+        getMainFragmentAdapter().getFragmentHost().notifyViewCreated(mMainFragmentAdapter);
+        updateAdapter();
+
+    }
+
+    @Override
+    public void onDestroyView() {
+        super.onDestroyView();
+        mGridViewHolder = null;
+    }
+
+    @Override
+    public BrowseFragment.MainFragmentAdapter getMainFragmentAdapter() {
+        return mMainFragmentAdapter;
+    }
+
+    /**
+     * Sets the selected item position.
+     */
+    public void setSelectedPosition(int position) {
+        mSelectedPosition = position;
+        if(mGridViewHolder != null && mGridViewHolder.getGridView().getAdapter() != null) {
+            mGridViewHolder.getGridView().setSelectedPositionSmooth(position);
+        }
+    }
+
+    private void updateAdapter() {
+        if (mGridViewHolder != null) {
+            mGridPresenter.onBindViewHolder(mGridViewHolder, mAdapter);
+            if (mSelectedPosition != -1) {
+                mGridViewHolder.getGridView().setSelectedPosition(mSelectedPosition);
+            }
+        }
+    }
+
+    void setEntranceTransitionState(boolean afterTransition) {
+        mGridPresenter.setEntranceTransitionState(mGridViewHolder, afterTransition);
+    }
+}
diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/page/PageAndListRowActivity.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/page/PageAndListRowActivity.java
new file mode 100644
index 0000000..4d5b309
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/page/PageAndListRowActivity.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2015 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 android.support.v17.leanback.supportleanbackshowcase.app.page;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.support.v17.leanback.supportleanbackshowcase.R;
+
+/**
+ * Activity showcasing the use of {@link android.support.v17.leanback.widget.PageRow} and
+ * {@link android.support.v17.leanback.widget.ListRow}.
+ */
+public class PageAndListRowActivity extends Activity {
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.page_list_row);
+    }
+}
diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/page/PageAndListRowFragment.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/page/PageAndListRowFragment.java
new file mode 100644
index 0000000..3f08a59
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/page/PageAndListRowFragment.java
@@ -0,0 +1,338 @@
+/*
+ * Copyright (C) 2015 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 android.support.v17.leanback.supportleanbackshowcase.app.page;
+
+import android.app.Activity;
+import android.app.Fragment;
+import android.os.Bundle;
+import android.os.Handler;
+import android.support.v17.leanback.app.BackgroundManager;
+import android.support.v17.leanback.app.BrowseFragment;
+import android.support.v17.leanback.app.RowsFragment;
+import android.support.v17.leanback.supportleanbackshowcase.R;
+import android.support.v17.leanback.supportleanbackshowcase.app.details.ShadowRowPresenterSelector;
+import android.support.v17.leanback.supportleanbackshowcase.cards.presenters.CardPresenterSelector;
+import android.support.v17.leanback.supportleanbackshowcase.models.Card;
+import android.support.v17.leanback.supportleanbackshowcase.models.CardRow;
+import android.support.v17.leanback.supportleanbackshowcase.utils.CardListRow;
+import android.support.v17.leanback.supportleanbackshowcase.utils.Utils;
+import android.support.v17.leanback.widget.ArrayObjectAdapter;
+import android.support.v17.leanback.widget.FocusHighlight;
+import android.support.v17.leanback.widget.HeaderItem;
+import android.support.v17.leanback.widget.ListRow;
+import android.support.v17.leanback.widget.ListRowPresenter;
+import android.support.v17.leanback.widget.OnItemViewClickedListener;
+import android.support.v17.leanback.widget.PageRow;
+import android.support.v17.leanback.widget.Presenter;
+import android.support.v17.leanback.widget.PresenterSelector;
+import android.support.v17.leanback.widget.Row;
+import android.support.v17.leanback.widget.RowPresenter;
+import android.support.v17.leanback.widget.VerticalGridPresenter;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.webkit.WebView;
+import android.webkit.WebViewClient;
+import android.widget.FrameLayout;
+import android.widget.Toast;
+import com.google.gson.Gson;
+
+/**
+ * Sample {@link BrowseFragment} implementation showcasing the use of {@link PageRow} and
+ * {@link ListRow}.
+ */
+public class PageAndListRowFragment extends BrowseFragment {
+    private static final long HEADER_ID_1 = 1;
+    private static final String HEADER_NAME_1 = "Page Fragment";
+    private static final long HEADER_ID_2 = 2;
+    private static final String HEADER_NAME_2 = "Rows Fragment";
+    private static final long HEADER_ID_3 = 3;
+    private static final String HEADER_NAME_3 = "Settings Fragment";
+    private static final long HEADER_ID_4 = 4;
+    private static final String HEADER_NAME_4 = "User agreement Fragment";
+    private BackgroundManager mBackgroundManager;
+
+    private ArrayObjectAdapter mRowsAdapter;
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setupUi();
+        loadData();
+        mBackgroundManager = BackgroundManager.getInstance(getActivity());
+        mBackgroundManager.attach(getActivity().getWindow());
+        getMainFragmentRegistry().registerFragment(PageRow.class,
+                new PageRowFragmentFactory(mBackgroundManager));
+    }
+
+    private void setupUi() {
+        setHeadersState(HEADERS_ENABLED);
+        setHeadersTransitionOnBackEnabled(true);
+        setBrandColor(getResources().getColor(R.color.fastlane_background));
+        setTitle("Title goes here");
+        setOnSearchClickedListener(new View.OnClickListener() {
+
+            @Override
+            public void onClick(View view) {
+                Toast.makeText(
+                        getActivity(), getString(R.string.implement_search), Toast.LENGTH_SHORT)
+                        .show();
+            }
+        });
+
+        prepareEntranceTransition();
+    }
+
+    private void loadData() {
+        mRowsAdapter = new ArrayObjectAdapter(new ListRowPresenter());
+        setAdapter(mRowsAdapter);
+
+        new Handler().postDelayed(new Runnable() {
+            @Override
+            public void run() {
+                createRows();
+                startEntranceTransition();
+            }
+        }, 2000);
+    }
+
+    private void createRows() {
+        HeaderItem headerItem1 = new HeaderItem(HEADER_ID_1, HEADER_NAME_1);
+        PageRow pageRow1 = new PageRow(headerItem1);
+        mRowsAdapter.add(pageRow1);
+
+        HeaderItem headerItem2 = new HeaderItem(HEADER_ID_2, HEADER_NAME_2);
+        PageRow pageRow2 = new PageRow(headerItem2);
+        mRowsAdapter.add(pageRow2);
+
+        HeaderItem headerItem3 = new HeaderItem(HEADER_ID_3, HEADER_NAME_3);
+        PageRow pageRow3 = new PageRow(headerItem3);
+        mRowsAdapter.add(pageRow3);
+
+        HeaderItem headerItem4 = new HeaderItem(HEADER_ID_4, HEADER_NAME_4);
+        PageRow pageRow4 = new PageRow(headerItem4);
+        mRowsAdapter.add(pageRow4);
+    }
+
+    private static class PageRowFragmentFactory extends BrowseFragment.FragmentFactory {
+        private final BackgroundManager mBackgroundManager;
+
+        PageRowFragmentFactory(BackgroundManager backgroundManager) {
+            this.mBackgroundManager = backgroundManager;
+        }
+
+        @Override
+        public Fragment createFragment(Object rowObj) {
+            Row row = (Row)rowObj;
+            mBackgroundManager.setDrawable(null);
+            if (row.getHeaderItem().getId() == HEADER_ID_1) {
+                return new SampleFragmentA();
+            } else if (row.getHeaderItem().getId() == HEADER_ID_2) {
+                return new SampleFragmentB();
+            } else if (row.getHeaderItem().getId() == HEADER_ID_3) {
+                return new SettingsFragment();
+            } else if (row.getHeaderItem().getId() == HEADER_ID_4) {
+                return new WebViewFragment();
+            }
+
+            throw new IllegalArgumentException(String.format("Invalid row %s", rowObj));
+        }
+    }
+
+    public static class PageFragmentAdapterImpl extends MainFragmentAdapter<SampleFragmentA> {
+
+        public PageFragmentAdapterImpl(SampleFragmentA fragment) {
+            super(fragment);
+        }
+    }
+
+    /**
+     * Simple page fragment implementation.
+     */
+    public static class SampleFragmentA extends GridFragment {
+        private static final int COLUMNS = 4;
+        private final int ZOOM_FACTOR = FocusHighlight.ZOOM_FACTOR_SMALL;
+        private ArrayObjectAdapter mAdapter;
+
+        @Override
+        public void onCreate(Bundle savedInstanceState) {
+            super.onCreate(savedInstanceState);
+            setupAdapter();
+            loadData();
+            getMainFragmentAdapter().getFragmentHost().notifyDataReady(getMainFragmentAdapter());
+        }
+
+
+        private void setupAdapter() {
+            VerticalGridPresenter presenter = new VerticalGridPresenter(ZOOM_FACTOR);
+            presenter.setNumberOfColumns(COLUMNS);
+            setGridPresenter(presenter);
+
+            CardPresenterSelector cardPresenter = new CardPresenterSelector(getActivity());
+            mAdapter = new ArrayObjectAdapter(cardPresenter);
+            setAdapter(mAdapter);
+
+            setOnItemViewClickedListener(new OnItemViewClickedListener() {
+                @Override
+                public void onItemClicked(
+                        Presenter.ViewHolder itemViewHolder,
+                        Object item,
+                        RowPresenter.ViewHolder rowViewHolder,
+                        Row row) {
+                    Card card = (Card)item;
+                    Toast.makeText(getActivity(),
+                            "Clicked on "+card.getTitle(),
+                            Toast.LENGTH_SHORT).show();
+                }
+            });
+        }
+
+        private void loadData() {
+            String json = Utils.inputStreamToString(getResources().openRawResource(
+                    R.raw.grid_example));
+            CardRow cardRow = new Gson().fromJson(json, CardRow.class);
+            mAdapter.addAll(0, cardRow.getCards());
+        }
+    }
+
+    /**
+     * Page fragment embeds a rows fragment.
+     */
+    public static class SampleFragmentB extends RowsFragment {
+        private final ArrayObjectAdapter mRowsAdapter;
+
+        public SampleFragmentB() {
+            mRowsAdapter = new ArrayObjectAdapter(new ShadowRowPresenterSelector());
+
+            setAdapter(mRowsAdapter);
+            setOnItemViewClickedListener(new OnItemViewClickedListener() {
+                @Override
+                public void onItemClicked(
+                        Presenter.ViewHolder itemViewHolder,
+                        Object item,
+                        RowPresenter.ViewHolder rowViewHolder,
+                        Row row) {
+                    Toast.makeText(getActivity(), "Implement click handler", Toast.LENGTH_SHORT)
+                            .show();
+                }
+            });
+        }
+
+        @Override
+        public void onCreate(Bundle savedInstanceState) {
+            super.onCreate(savedInstanceState);
+            createRows();
+            getMainFragmentAdapter().getFragmentHost().notifyDataReady(getMainFragmentAdapter());
+        }
+
+        private void createRows() {
+                String json = Utils.inputStreamToString(getResources().openRawResource(
+                        R.raw.page_row_example));
+                CardRow[] rows = new Gson().fromJson(json, CardRow[].class);
+                for (CardRow row : rows) {
+                    if (row.getType() == CardRow.TYPE_DEFAULT) {
+                        mRowsAdapter.add(createCardRow(row));
+                    }
+                }
+        }
+
+        private Row createCardRow(CardRow cardRow) {
+            PresenterSelector presenterSelector = new CardPresenterSelector(getActivity());
+            ArrayObjectAdapter adapter = new ArrayObjectAdapter(presenterSelector);
+            for (Card card : cardRow.getCards()) {
+                adapter.add(card);
+            }
+
+            HeaderItem headerItem = new HeaderItem(cardRow.getTitle());
+            return new CardListRow(headerItem, adapter, cardRow);
+        }
+    }
+
+    public static class SettingsFragment extends RowsFragment {
+        private final ArrayObjectAdapter mRowsAdapter;
+
+        public SettingsFragment() {
+            ListRowPresenter selector = new ListRowPresenter();
+            selector.setNumRows(2);
+            mRowsAdapter = new ArrayObjectAdapter(selector);
+            setAdapter(mRowsAdapter);
+        }
+
+        @Override
+        public void onAttach(Activity activity) {
+            super.onAttach(activity);
+            new Handler().postDelayed(new Runnable() {
+                @Override
+                public void run() {
+                    loadData();
+                }
+            }, 200);
+        }
+
+        private void loadData() {
+            if (isAdded()) {
+                String json = Utils.inputStreamToString(getResources().openRawResource(
+                        R.raw.icon_example));
+                CardRow cardRow = new Gson().fromJson(json, CardRow.class);
+                mRowsAdapter.add(createCardRow(cardRow));
+                getMainFragmentAdapter().getFragmentHost().notifyDataReady(
+                        getMainFragmentAdapter());
+            }
+        }
+
+        private ListRow createCardRow(CardRow cardRow) {
+            SettingsIconPresenter iconCardPresenter = new SettingsIconPresenter(getActivity());
+            ArrayObjectAdapter adapter = new ArrayObjectAdapter(iconCardPresenter);
+            for(Card card : cardRow.getCards()) {
+                adapter.add(card);
+            }
+
+            HeaderItem headerItem = new HeaderItem(cardRow.getTitle());
+            return new CardListRow(headerItem, adapter, cardRow);
+        }
+    }
+
+    public static class WebViewFragment extends Fragment implements MainFragmentAdapterProvider {
+        private MainFragmentAdapter mMainFragmentAdapter = new MainFragmentAdapter(this);
+        private WebView mWebview;
+
+        @Override
+        public MainFragmentAdapter getMainFragmentAdapter() {
+            return mMainFragmentAdapter;
+        }
+
+        @Override
+        public View onCreateView(
+                LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+            FrameLayout root = new FrameLayout(getActivity());
+            FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(
+                    FrameLayout.LayoutParams.MATCH_PARENT,
+                    FrameLayout.LayoutParams.MATCH_PARENT);
+            lp.setMarginStart(32);
+            mWebview = new WebView(getActivity());
+            mWebview.setWebViewClient(new WebViewClient());
+            mWebview.getSettings().setJavaScriptEnabled(true);
+            root.addView(mWebview, lp);
+            return root;
+        }
+
+        @Override
+        public void onResume() {
+            super.onResume();
+            mWebview.loadUrl("https://www.google.com/policies/terms");
+            getMainFragmentAdapter().getFragmentHost().notifyDataReady(getMainFragmentAdapter());
+        }
+    }
+}
diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/page/SettingsIconPresenter.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/page/SettingsIconPresenter.java
new file mode 100644
index 0000000..cdc8447
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/page/SettingsIconPresenter.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2015 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 android.support.v17.leanback.supportleanbackshowcase.app.page;
+
+import android.content.Context;
+import android.support.v17.leanback.supportleanbackshowcase.R;
+import android.support.v17.leanback.supportleanbackshowcase.cards.presenters.ImageCardViewPresenter;
+import android.support.v17.leanback.widget.ImageCardView;
+import android.view.View;
+import android.widget.ImageView;
+
+/**
+ * Simple presenter implementation to represent settings icon as cards.
+ */
+public class SettingsIconPresenter extends ImageCardViewPresenter {
+
+    public SettingsIconPresenter(Context context) {
+        super(context, R.style.IconCardTheme);
+    }
+
+    @Override
+    protected ImageCardView onCreateView() {
+        final ImageCardView imageCardView = super.onCreateView();
+        imageCardView.setOnFocusChangeListener(new View.OnFocusChangeListener() {
+            @Override
+            public void onFocusChange(View v, boolean hasFocus) {
+                if (hasFocus) {
+                    setImageBackground(imageCardView, R.color.settings_card_background_focussed);
+                } else {
+                    setImageBackground(imageCardView, R.color.settings_card_background);
+                }
+            }
+        });
+        setImageBackground(imageCardView, R.color.settings_card_background);
+        return imageCardView;
+    }
+
+    private void setImageBackground(ImageCardView imageCardView, int colorId) {
+        imageCardView.setBackgroundColor(getContext().getResources().getColor(colorId));
+    }
+}
diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/settings/SettingsExampleActivity.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/settings/SettingsExampleActivity.java
new file mode 100644
index 0000000..01963ca
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/settings/SettingsExampleActivity.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2015 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 android.support.v17.leanback.supportleanbackshowcase.app.settings;
+
+import android.app.Activity;
+import android.app.Fragment;
+import android.os.Bundle;
+import android.support.v17.leanback.supportleanbackshowcase.R;
+
+/*
+ * TODO: Javadoc
+ */
+public class SettingsExampleActivity extends Activity {
+
+    @Override public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_settings_example);
+    }
+}
diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/settings/SettingsExampleFragment.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/settings/SettingsExampleFragment.java
new file mode 100644
index 0000000..0276d53
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/settings/SettingsExampleFragment.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2015 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 android.support.v17.leanback.supportleanbackshowcase.app.settings;
+
+import android.app.Fragment;
+import android.content.Context;
+import android.os.Bundle;
+import android.support.v14.preference.PreferenceFragment;
+import android.support.v17.leanback.supportleanbackshowcase.R;
+import android.support.v17.preference.LeanbackPreferenceFragment;
+import android.support.v17.preference.LeanbackSettingsFragment;
+import android.support.v7.preference.DialogPreference;
+import android.support.v7.preference.ListPreference;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceScreen;
+import android.widget.Toast;
+
+import java.util.Arrays;
+import java.util.Stack;
+
+public class SettingsExampleFragment extends LeanbackSettingsFragment {
+
+    @Override
+    public void onPreferenceStartInitialScreen() {
+        startPreferenceFragment(buildPreferenceFragment(R.xml.prefs, null));
+    }
+
+    @Override
+    public boolean onPreferenceStartFragment(PreferenceFragment preferenceFragment,
+                                             Preference preference) {
+        return false;
+    }
+
+    @Override
+    public boolean onPreferenceStartScreen(PreferenceFragment preferenceFragment,
+                                           PreferenceScreen preferenceScreen) {
+        PreferenceFragment frag = buildPreferenceFragment(R.xml.prefs, preferenceScreen.getKey());
+        startPreferenceFragment(frag);
+        return true;
+    }
+
+    private PreferenceFragment buildPreferenceFragment(int preferenceResId, String root) {
+        PreferenceFragment fragment = new PrefFragment();
+        Bundle args = new Bundle();
+        args.putInt("preferenceResource", preferenceResId);
+        args.putString("root", root);
+        fragment.setArguments(args);
+        return fragment;
+    }
+
+    public static class PrefFragment extends LeanbackPreferenceFragment {
+
+        @Override
+        public void onCreatePreferences(Bundle bundle, String s) {
+            String root = getArguments().getString("root", null);
+            int prefResId = getArguments().getInt("preferenceResource");
+            if (root == null) {
+                addPreferencesFromResource(prefResId);
+            } else {
+                setPreferencesFromResource(prefResId, root);
+            }
+        }
+
+        @Override
+        public boolean onPreferenceTreeClick(Preference preference) {
+            final String[] keys = {"prefs_wifi_connect_wps", "prefs_date", "prefs_time",
+                    "prefs_date_time_use_timezone", "app_banner_sample_app", "pref_force_stop",
+                    "pref_uninstall", "pref_more_info"};
+            if (Arrays.asList(keys).contains(preference.getKey())) {
+                Toast.makeText(getActivity(), "Implement your own action handler.", Toast.LENGTH_SHORT).show();
+                return true;
+            }
+            return super.onPreferenceTreeClick(preference);
+        }
+
+    }
+}
diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/wizard/WizardExample1stStepFragment.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/wizard/WizardExample1stStepFragment.java
new file mode 100644
index 0000000..cbfa868
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/wizard/WizardExample1stStepFragment.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2015 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 android.support.v17.leanback.supportleanbackshowcase.app.wizard;
+
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.v17.leanback.app.GuidedStepFragment;
+import android.support.v17.leanback.supportleanbackshowcase.R;
+import android.support.v17.leanback.widget.GuidanceStylist;
+import android.support.v17.leanback.widget.GuidedAction;
+
+import java.util.List;
+
+/**
+ * The first screen of the rental wizard. Gives the user the choice between renting the movie in SD
+ * or HD quality.
+ */
+public class WizardExample1stStepFragment extends WizardExampleBaseStepFragment {
+
+    private static final int ACTION_ID_BUY_HD = 1;
+    private static final int ACTION_ID_BUY_SD = ACTION_ID_BUY_HD + 1;
+
+    @NonNull
+    @Override
+    public GuidanceStylist.Guidance onCreateGuidance(Bundle savedInstanceState) {
+        GuidanceStylist.Guidance guidance = new GuidanceStylist.Guidance(mMovie.getTitle(),
+                getString(R.string.wizard_example_choose_rent_options),
+                mMovie.getBreadcrump(), null);
+        return guidance;
+    }
+
+    @Override
+    public void onCreateActions(@NonNull List<GuidedAction> actions, Bundle savedInstanceState) {
+        GuidedAction action = new GuidedAction.Builder(getActivity())
+                .id(ACTION_ID_BUY_HD)
+                .title(R.string.wizard_example_rent_hd)
+                .editable(false)
+                .description(mMovie.getPriceHd() + " " +
+                        getString(R.string.wizard_example_watch_hd))
+                .build();
+        actions.add(action);
+        action = new GuidedAction.Builder(getActivity())
+                .id(ACTION_ID_BUY_SD)
+                .title(getString(R.string.wizard_example_rent_sd))
+                .editable(false)
+                .description(mMovie.getPriceSd() + " " +
+                        getString(R.string.wizard_example_watch_sd))
+                .build();
+        actions.add(action);
+    }
+
+    @Override
+    public void onGuidedActionClicked(GuidedAction action) {
+        boolean rentHd = ACTION_ID_BUY_HD == action.getId();
+        GuidedStepFragment fragment = WizardExample2ndStepFragment.build(rentHd, this);
+        add(getFragmentManager(), fragment);
+    }
+}
diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/wizard/WizardExample2ndStepFragment.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/wizard/WizardExample2ndStepFragment.java
new file mode 100644
index 0000000..f630d59
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/wizard/WizardExample2ndStepFragment.java
@@ -0,0 +1,152 @@
+/*
+ * Copyright (C) 2015 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 android.support.v17.leanback.supportleanbackshowcase.app.wizard;
+
+import android.app.FragmentManager;
+import android.graphics.Color;
+import android.graphics.drawable.Drawable;
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.v17.leanback.app.GuidedStepFragment;
+import android.support.v17.leanback.supportleanbackshowcase.R;
+import android.support.v17.leanback.widget.GuidanceStylist;
+import android.support.v17.leanback.widget.GuidedAction;
+import android.support.v17.leanback.widget.GuidedActionsStylist;
+import android.widget.Toast;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Displays the second screen of the rental wizard which requires the user to confirm his purchase.
+ */
+public class WizardExample2ndStepFragment extends WizardExampleBaseStepFragment {
+
+    private static final String ARG_HD = "hd";
+    private static final int ACTION_ID_CONFIRM = 1;
+    private static final int ACTION_ID_PAYMENT_METHOD = ACTION_ID_CONFIRM + 1;
+    private static final int ACTION_ID_NEW_PAYMENT = ACTION_ID_PAYMENT_METHOD + 1;
+
+    protected static ArrayList<String> sCards = new ArrayList();
+    protected static int sSelectedCard = -1;
+
+    static {
+        sCards.add("Visa-1234");
+        sCards.add("Master-4321");
+    }
+
+
+    public static GuidedStepFragment build(boolean hd, WizardExampleBaseStepFragment previousFragment) {
+        GuidedStepFragment fragment = new WizardExample2ndStepFragment();
+        // Reuse the same arguments this fragment was given.
+        Bundle args = previousFragment.getArguments();
+        args.putBoolean(ARG_HD, hd);
+        fragment.setArguments(args);
+        return fragment;
+    }
+
+    @NonNull
+    @Override
+    public GuidanceStylist.Guidance onCreateGuidance(Bundle savedInstanceState) {
+        GuidanceStylist.Guidance guidance = new GuidanceStylist.Guidance(mMovie.getTitle(),
+                getString(R.string.wizard_example_rental_period),
+                mMovie.getBreadcrump(), null);
+        return guidance;
+
+    }
+
+    @Override
+    public void onCreateActions(@NonNull List<GuidedAction> actions, Bundle savedInstanceState) {
+        boolean rentHighDefinition = getArguments().getBoolean(ARG_HD);
+
+        GuidedAction action = new GuidedAction.Builder(getActivity())
+                .id(ACTION_ID_CONFIRM)
+                .title(R.string.wizard_example_rent)
+                .description(rentHighDefinition ? mMovie.getPriceHd() : mMovie.getPriceSd())
+                .editable(false)
+                .build();
+        action.setEnabled(false);
+        actions.add(action);
+        List<GuidedAction> subActions = new ArrayList();
+        action = new GuidedAction.Builder(getActivity())
+                .id(ACTION_ID_PAYMENT_METHOD)
+                .title(R.string.wizard_example_payment_method)
+                .editTitle("")
+                .description(R.string.wizard_example_input_credit)
+                .subActions(subActions)
+                .build();
+        actions.add(action);
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+        GuidedAction payment = findActionById(ACTION_ID_PAYMENT_METHOD);
+
+        List<GuidedAction> paymentSubActions = payment.getSubActions();
+        paymentSubActions.clear();
+        for (int i = 0; i < sCards.size(); i++) {
+            paymentSubActions.add(new GuidedAction.Builder(getActivity())
+                            .title(sCards.get(i))
+                            .description("")
+                            .checkSetId(GuidedAction.DEFAULT_CHECK_SET_ID)
+                            .build()
+            );
+        }
+        paymentSubActions.add(new GuidedAction.Builder(getActivity())
+                .id(ACTION_ID_NEW_PAYMENT)
+                .title("Add New Card")
+                .description("")
+                .editable(false)
+                .build()
+        );
+        if ( sSelectedCard >= 0 && sSelectedCard < sCards.size() ) {
+            payment.setDescription(sCards.get(sSelectedCard));
+            findActionById(ACTION_ID_CONFIRM).setEnabled(true);
+        } else
+            findActionById(ACTION_ID_CONFIRM).setEnabled(false);
+        notifyActionChanged(findActionPositionById(ACTION_ID_CONFIRM));
+    }
+
+    @Override
+    public boolean onSubGuidedActionClicked(GuidedAction action) {
+
+        if (action.isChecked()) {
+            String payment = action.getTitle().toString();
+            if ( (sSelectedCard = sCards.indexOf(payment)) != -1 ) {
+                findActionById(ACTION_ID_PAYMENT_METHOD).setDescription(payment);
+                notifyActionChanged(findActionPositionById(ACTION_ID_PAYMENT_METHOD));
+                findActionById(ACTION_ID_CONFIRM).setEnabled(true);
+                notifyActionChanged(findActionPositionById(ACTION_ID_CONFIRM));
+            }
+            return true;
+        } else {
+            FragmentManager fm = getFragmentManager();
+            GuidedStepFragment fragment = new WizardNewPaymentStepFragment();
+            fragment.setArguments(getArguments());
+            add(fm, fragment);
+            return false;
+        }
+    }
+
+    @Override
+    public void onGuidedActionClicked(GuidedAction action) {
+        if (ACTION_ID_CONFIRM == action.getId()) {
+            GuidedStepFragment fragment = new WizardExample3rdStepFragment();
+            fragment.setArguments(getArguments());
+            add(getFragmentManager(), fragment);
+        }
+    }
+}
diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/wizard/WizardExample3rdStepFragment.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/wizard/WizardExample3rdStepFragment.java
new file mode 100644
index 0000000..9a2ec39
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/wizard/WizardExample3rdStepFragment.java
@@ -0,0 +1,99 @@
+/*
+ * Copyright (C) 2015 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 android.support.v17.leanback.supportleanbackshowcase.app.wizard;
+
+import android.os.Bundle;
+import android.os.Handler;
+import android.support.annotation.NonNull;
+import android.support.v17.leanback.app.GuidedStepFragment;
+import android.support.v17.leanback.supportleanbackshowcase.R;
+import android.support.v17.leanback.widget.GuidanceStylist;
+import android.support.v17.leanback.widget.GuidedAction;
+import android.support.v17.leanback.widget.GuidedActionsStylist;
+
+import java.util.List;
+
+/**
+ * This is the third screen of the rental wizard which will display a progressbar while waiting for
+ * the server to process the rental. The server communication is faked for the sake of this example
+ * by waiting four seconds until continuing.
+ */
+public class WizardExample3rdStepFragment extends WizardExampleBaseStepFragment {
+
+    private static final int ACTION_ID_PROCESSING = 1;
+    private final Handler mFakeHttpHandler = new Handler();
+
+    @Override
+    public void onStart() {
+        super.onStart();
+
+        // Fake Http call by creating some sort of delay.
+        mFakeHttpHandler.postDelayed(fakeHttpRequestRunnable, 4000L);
+    }
+
+    @Override
+    public GuidedActionsStylist onCreateActionsStylist() {
+        GuidedActionsStylist stylist = new GuidedActionsStylist() {
+            @Override
+            public int onProvideItemLayoutId() {
+                return R.layout.wizard_progress_action_item;
+            }
+
+        };
+        return stylist;
+    }
+
+    @Override
+    public int onProvideTheme() {
+        return R.style.Theme_Example_LeanbackWizard_NoSelector;
+    }
+
+    @Override
+    public void onStop() {
+        super.onStop();
+
+        // Make sure to cancel the execution of the Runnable in case the fragment is stopped.
+        mFakeHttpHandler.removeCallbacks(fakeHttpRequestRunnable);
+    }
+
+    @NonNull
+    @Override
+    public GuidanceStylist.Guidance onCreateGuidance(Bundle savedInstanceState) {
+        GuidanceStylist.Guidance guidance = new GuidanceStylist.Guidance(mMovie.getTitle(),
+                getString(R.string.wizard_example_just_a_second),
+                mMovie.getBreadcrump(), null);
+        return guidance;
+    }
+
+    @Override
+    public void onCreateActions(@NonNull List<GuidedAction> actions, Bundle savedInstanceState) {
+        GuidedAction action = new GuidedAction.Builder(getActivity())
+                .id(ACTION_ID_PROCESSING)
+                .title(R.string.wizard_example_processing)
+                .infoOnly(true)
+                .build();
+        actions.add(action);
+    }
+
+    private final Runnable fakeHttpRequestRunnable = new Runnable() {
+        @Override
+        public void run() {
+            GuidedStepFragment fragment = new WizardExample4thStepFragment();
+            fragment.setArguments(getArguments());
+            add(getFragmentManager(), fragment);
+        }
+    };
+
+}
diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/wizard/WizardExample4thStepFragment.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/wizard/WizardExample4thStepFragment.java
new file mode 100644
index 0000000..b0cb9aa
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/wizard/WizardExample4thStepFragment.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2015 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 android.support.v17.leanback.supportleanbackshowcase.app.wizard;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.v17.leanback.supportleanbackshowcase.R;
+import android.support.v17.leanback.supportleanbackshowcase.app.media.VideoExampleActivity;
+import android.support.v17.leanback.widget.GuidanceStylist;
+import android.support.v17.leanback.widget.GuidedAction;
+import android.support.v4.app.ActivityOptionsCompat;
+import android.widget.Toast;
+
+import java.util.List;
+
+/**
+ * The last screen of the Wizard gives to options to either watch the rented movie now or later. Due
+ * to keep this example simple and focused on the usage of the GuidedStepFragment, clicking on
+ * either action will end the wizard. You might however start a new Activity playing the movie.
+ */
+public class WizardExample4thStepFragment extends WizardExampleBaseStepFragment {
+
+    private static final int ACTION_ID_WATCH = 1;
+    private static final int ACTION_ID_LATER = ACTION_ID_WATCH + 1;
+
+    @NonNull
+    @Override
+    public GuidanceStylist.Guidance onCreateGuidance(Bundle savedInstanceState) {
+        GuidanceStylist.Guidance guidance = new GuidanceStylist.Guidance(mMovie.getTitle(),
+                getString(R.string.wizard_example_rental_period),
+                mMovie.getBreadcrump(), null);
+        return guidance;
+    }
+
+    @Override
+    public void onCreateActions(@NonNull List<GuidedAction> actions, Bundle savedInstanceState) {
+        GuidedAction action = new GuidedAction.Builder(getActivity())
+                .id(ACTION_ID_WATCH)
+                .editable(false)
+                .title(R.string.wizard_example_watch_now)
+                .build();
+        actions.add(action);
+        action = new GuidedAction.Builder(getActivity())
+                .id(ACTION_ID_LATER)
+                .editable(false)
+                .title(R.string.wizard_example_later)
+                .build();
+        actions.add(action);
+    }
+
+    @Override
+    public void onGuidedActionClicked(GuidedAction action) {
+        if (action.getId() == ACTION_ID_WATCH) {
+            finishGuidedStepFragments();
+            Intent intent = new Intent(getActivity().getBaseContext(),
+                    VideoExampleActivity.class);
+            startActivity(intent);
+        } else if (action.getId() == ACTION_ID_LATER) {
+            Toast.makeText(getActivity(), getString(R.string.wizard_example_later_clicked),
+                    Toast.LENGTH_SHORT).show();
+            finishGuidedStepFragments();
+        }
+    }
+}
diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/wizard/WizardExampleActivity.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/wizard/WizardExampleActivity.java
new file mode 100644
index 0000000..96f71f8
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/wizard/WizardExampleActivity.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2014 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 android.support.v17.leanback.supportleanbackshowcase.app.wizard;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.os.PersistableBundle;
+import android.support.v17.leanback.app.GuidedStepFragment;
+import android.support.v17.leanback.supportleanbackshowcase.R;
+
+/**
+ * An Activity displaying a wizard for renting a movie.
+ */
+public class WizardExampleActivity extends Activity {
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        getWindow().setBackgroundDrawableResource(R.drawable.wizard_background_blackned);
+
+        GuidedStepFragment fragment = new WizardExample1stStepFragment();
+        fragment.setArguments(getIntent().getExtras()); // Delegate Movie to first step.
+        GuidedStepFragment.addAsRoot(this, fragment, android.R.id.content);
+    }
+
+    @Override
+    public void onBackPressed() {
+        if (GuidedStepFragment.getCurrentGuidedStepFragment(getFragmentManager())
+                instanceof WizardExample4thStepFragment) {
+            // The user 'bought' the product. When he presses 'Back' the Wizard will be closed and
+            // he will not be send back to 'Processing Payment...'-Screen.
+            finish();
+        } else super.onBackPressed();
+    }
+
+}
diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/wizard/WizardExampleBaseStepFragment.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/wizard/WizardExampleBaseStepFragment.java
new file mode 100644
index 0000000..8fd5981
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/wizard/WizardExampleBaseStepFragment.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2015 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 android.support.v17.leanback.supportleanbackshowcase.app.wizard;
+
+import android.os.Bundle;
+import android.support.v17.leanback.app.GuidedStepFragment;
+import android.support.v17.leanback.supportleanbackshowcase.models.Movie;
+import android.support.v17.leanback.supportleanbackshowcase.R;
+
+/**
+ * A base class which provides all it's implementations with a method #getWizardActivity(). It also
+ * makes sure that the wizard is using the correct theme.
+ */
+public abstract class WizardExampleBaseStepFragment extends GuidedStepFragment {
+
+    protected Movie mMovie;
+
+    @Override
+    public int onProvideTheme() {
+        return R.style.Theme_Example_LeanbackWizard;
+    }
+
+    WizardExampleActivity getWizardActivity() {
+        if (!(getActivity() instanceof WizardExampleActivity)) {
+            throw new IllegalStateException(WizardExampleActivity.class.getName() + " expected.");
+        }
+        return (WizardExampleActivity) getActivity();
+    }
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        mMovie = (Movie) getArguments().getSerializable("movie");
+        super.onCreate(savedInstanceState);
+    }
+}
diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/wizard/WizardNewPaymentStepFragment.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/wizard/WizardNewPaymentStepFragment.java
new file mode 100644
index 0000000..a42ab9e
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/wizard/WizardNewPaymentStepFragment.java
@@ -0,0 +1,149 @@
+/*
+ * Copyright (C) 2015 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 android.support.v17.leanback.supportleanbackshowcase.app.wizard;
+
+import android.app.FragmentManager;
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.v17.leanback.supportleanbackshowcase.R;
+import android.support.v17.leanback.widget.GuidanceStylist;
+import android.support.v17.leanback.widget.GuidedAction;
+import android.support.v17.leanback.widget.GuidedDatePickerAction;
+import android.text.TextUtils;
+
+import java.util.Calendar;
+import java.util.List;
+
+/**
+ * A fragment for allowing users to enter a new payment information.
+ */
+public class WizardNewPaymentStepFragment extends WizardExampleBaseStepFragment {
+
+    private static final int ACTION_ID_CARD_NUMBER = 1;
+    private static final int ACTION_ID_PAYMENT_EXP = ACTION_ID_CARD_NUMBER + 1;
+
+    @NonNull
+    @Override
+    public GuidanceStylist.Guidance onCreateGuidance(Bundle savedInstanceState) {
+        String title = getString(R.string.wizard_example_new_payment_guidance_title);
+        String description = getString(R.string.wizard_example_new_payment_guidance_description);
+        String breadcrumb = mMovie.getBreadcrump();
+
+        GuidanceStylist.Guidance guidance = new GuidanceStylist.Guidance(title, description,
+                breadcrumb, null);
+        return guidance;
+    }
+
+    @Override
+    public void onCreateActions(List<GuidedAction> actions, Bundle savedInstanceState) {
+        actions.add(new GuidedAction.Builder(getActivity())
+                        .id(ACTION_ID_CARD_NUMBER)
+                        .title(R.string.wizard_example_input_card)
+                        .editTitle("")
+                        .description(R.string.wizard_example_input_card)
+                        .editDescription("Card number")
+                        .editable(true)
+                        .build()
+        );
+
+        actions.add(new GuidedDatePickerAction.Builder(getActivity())
+                        .id(ACTION_ID_PAYMENT_EXP)
+                        .title(R.string.wizard_example_expiration_date)
+                        .datePickerFormat("MY")
+                        .build()
+        );
+    }
+
+    @Override
+    public void onCreateButtonActions(@NonNull List<GuidedAction> actions,
+                                      Bundle savedInstanceState) {
+        actions.add(new GuidedAction.Builder(getActivity())
+                        .clickAction(GuidedAction.ACTION_ID_OK)
+                        .build()
+        );
+        actions.get(actions.size() - 1).setEnabled(false);
+    }
+
+    @Override
+    public void onGuidedActionClicked(GuidedAction action) {
+        if (action.getId() == GuidedAction.ACTION_ID_OK) {
+            CharSequence cardNumber = findActionById(ACTION_ID_CARD_NUMBER).getDescription();
+            WizardExample2ndStepFragment.sSelectedCard = WizardExample2ndStepFragment.sCards.size();
+            WizardExample2ndStepFragment.sCards.add(cardNumber.toString());
+            popBackStackToGuidedStepFragment(WizardNewPaymentStepFragment.class,
+                    FragmentManager.POP_BACK_STACK_INCLUSIVE);
+        }
+    }
+
+    @Override
+    public long onGuidedActionEditedAndProceed(GuidedAction action) {
+
+        boolean cardNumberCheck = false;
+        boolean expDateCheck = false;
+
+        if (action.getId() == ACTION_ID_CARD_NUMBER) {
+            CharSequence cardNumber = action.getEditTitle();
+            cardNumberCheck = isCardNumberValid(cardNumber);
+            expDateCheck = isExpDateValid(findActionById(ACTION_ID_PAYMENT_EXP));
+            updateOkButton(cardNumberCheck && expDateCheck);
+
+            if (cardNumberCheck) {
+                String last4Digits = cardNumber.subSequence(cardNumber.length() - 4,
+                        cardNumber.length()).toString();
+
+                if ( (Integer.parseInt(last4Digits) & 1) == 0 )
+                    action.setDescription(getString(R.string.wizard_example_visa,
+                            last4Digits));
+                else
+                    action.setDescription(getString(R.string.wizard_example_master,
+                            last4Digits));
+
+                return GuidedAction.ACTION_ID_NEXT;
+            } else if (cardNumber.length() == 0) {
+                action.setDescription(getString(R.string.wizard_example_input_card));
+                return GuidedAction.ACTION_ID_CURRENT;
+            } else {
+                action.setDescription(getString(R.string.wizard_example_input_credit_wrong));
+                return GuidedAction.ACTION_ID_CURRENT;
+            }
+
+        } else if (action.getId() == ACTION_ID_PAYMENT_EXP) {
+            expDateCheck = isExpDateValid(action);
+            cardNumberCheck = isCardNumberValid(findActionById(ACTION_ID_CARD_NUMBER)
+                    .getEditTitle());
+            updateOkButton(cardNumberCheck && expDateCheck);
+            if (expDateCheck) {
+                return GuidedAction.ACTION_ID_NEXT;
+            }
+        }
+        return GuidedAction.ACTION_ID_CURRENT;
+    }
+
+    private void updateOkButton(boolean enabled) {
+        findButtonActionById(GuidedAction.ACTION_ID_OK).setEnabled(enabled);
+        notifyButtonActionChanged(findButtonActionPositionById(GuidedAction.ACTION_ID_OK));
+    }
+
+    private static boolean isCardNumberValid(CharSequence number) {
+        return (TextUtils.isDigitsOnly(number) && number.length() == 16);
+    }
+
+    private static boolean isExpDateValid(GuidedAction dateAction) {
+        long date = ((GuidedDatePickerAction) dateAction).getDate();
+        Calendar c = Calendar.getInstance();
+        c.setTimeInMillis(date);
+        return Calendar.getInstance().before(c);
+    }
+}
diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/CharacterCardView.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/CharacterCardView.java
new file mode 100644
index 0000000..962adb0
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/CharacterCardView.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2015 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 android.support.v17.leanback.supportleanbackshowcase.cards;
+
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.support.v17.leanback.supportleanbackshowcase.R;
+import android.support.v17.leanback.supportleanbackshowcase.models.Card;
+import android.support.v17.leanback.widget.BaseCardView;
+import android.support.v4.graphics.drawable.RoundedBitmapDrawable;
+import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+public class CharacterCardView extends BaseCardView {
+
+    public CharacterCardView(Context context) {
+        super(context, null, R.style.CharacterCardStyle);
+        LayoutInflater.from(getContext()).inflate(R.layout.character_card, this);
+        setOnFocusChangeListener(new View.OnFocusChangeListener() {
+            @Override
+            public void onFocusChange(View v, boolean hasFocus) {
+                ImageView mainImage = (ImageView) findViewById(R.id.main_image);
+                View container = findViewById(R.id.container);
+                if (hasFocus) {
+                    container.setBackgroundResource(R.drawable.character_focused);
+                    mainImage.setBackgroundResource(R.drawable.character_focused);
+                } else {
+                    container.setBackgroundResource(R.drawable.character_not_focused_padding);
+                    mainImage.setBackgroundResource(R.drawable.character_not_focused);
+                }
+            }
+        });
+        setFocusable(true);
+    }
+
+    public void updateUi(Card card) {
+        TextView primaryText = (TextView) findViewById(R.id.primary_text);
+        final ImageView imageView = (ImageView) findViewById(R.id.main_image);
+
+        primaryText.setText(card.getTitle());
+        if (card.getLocalImageResourceName() != null) {
+            int resourceId = card.getLocalImageResourceId(getContext());
+            Bitmap bitmap = BitmapFactory
+                    .decodeResource(getContext().getResources(), resourceId);
+            RoundedBitmapDrawable drawable = RoundedBitmapDrawableFactory.create(getContext().getResources(), bitmap);
+            drawable.setAntiAlias(true);
+            drawable.setCornerRadius(Math.max(bitmap.getWidth(), bitmap.getHeight()) / 2.0f);
+            imageView.setImageDrawable(drawable);
+        }
+    }
+
+
+}
diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/TextCardView.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/TextCardView.java
new file mode 100644
index 0000000..830b474
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/TextCardView.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2015 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 android.support.v17.leanback.supportleanbackshowcase.cards;
+
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.support.v17.leanback.supportleanbackshowcase.R;
+import android.support.v17.leanback.supportleanbackshowcase.models.Card;
+import android.support.v17.leanback.widget.BaseCardView;
+import android.support.v4.graphics.drawable.RoundedBitmapDrawable;
+import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory;
+import android.view.LayoutInflater;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+public class TextCardView extends BaseCardView {
+
+    public TextCardView(Context context) {
+        super(context, null, R.style.TextCardStyle);
+        LayoutInflater.from(getContext()).inflate(R.layout.text_icon_card, this);
+        setFocusable(true);
+    }
+
+    public void updateUi(Card card) {
+        TextView extraText = (TextView) findViewById(R.id.extra_text);
+        TextView primaryText = (TextView) findViewById(R.id.primary_text);
+        final ImageView imageView = (ImageView) findViewById(R.id.main_image);
+
+        extraText.setText(card.getExtraText());
+        primaryText.setText(card.getTitle());
+
+        // Create a rounded drawable.
+        int resourceId = card.getLocalImageResourceId(getContext());
+        Bitmap bitmap = BitmapFactory
+                .decodeResource(getContext().getResources(), resourceId);
+        RoundedBitmapDrawable drawable = RoundedBitmapDrawableFactory.create(getContext().getResources(), bitmap);
+        drawable.setAntiAlias(true);
+        drawable.setCornerRadius(
+                Math.max(bitmap.getWidth(), bitmap.getHeight()) / 2.0f);
+        imageView.setImageDrawable(drawable);
+    }
+
+}
diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/presenters/AbstractCardPresenter.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/presenters/AbstractCardPresenter.java
new file mode 100644
index 0000000..fe7541b
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/presenters/AbstractCardPresenter.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2015 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 android.support.v17.leanback.supportleanbackshowcase.cards.presenters;
+
+import android.content.Context;
+import android.support.v17.leanback.supportleanbackshowcase.models.Card;
+import android.support.v17.leanback.widget.BaseCardView;
+import android.support.v17.leanback.widget.Presenter;
+import android.view.ViewGroup;
+
+/**
+ * This abstract, generic class will create and manage the
+ * ViewHolder and will provide typed Presenter callbacks such that you do not have to perform casts
+ * on your own.
+ *
+ * @param <T> View type for the card.
+ */
+public abstract class AbstractCardPresenter<T extends BaseCardView> extends Presenter {
+
+    private static final String TAG = "AbstractCardPresenter";
+    private final Context mContext;
+
+    /**
+     * @param context The current context.
+     */
+    public AbstractCardPresenter(Context context) {
+        mContext = context;
+    }
+
+    public Context getContext() {
+        return mContext;
+    }
+
+    @Override public final ViewHolder onCreateViewHolder(ViewGroup parent) {
+        T cardView = onCreateView();
+        return new ViewHolder(cardView);
+    }
+
+    @Override public final void onBindViewHolder(ViewHolder viewHolder, Object item) {
+        Card card = (Card) item;
+        onBindViewHolder(card, (T) viewHolder.view);
+    }
+
+    @Override public final void onUnbindViewHolder(ViewHolder viewHolder) {
+        onUnbindViewHolder((T) viewHolder.view);
+    }
+
+    public void onUnbindViewHolder(T cardView) {
+        // Nothing to clean up. Override if necessary.
+    }
+
+    /**
+     * Invoked when a new view is created.
+     *
+     * @return Returns the newly created view.
+     */
+    protected abstract T onCreateView();
+
+    /**
+     * Implement this method to update your card's view with the data bound to it.
+     *
+     * @param card The model containing the data for the card.
+     * @param cardView The view the card is bound to.
+     * @see Presenter#onBindViewHolder(Presenter.ViewHolder, Object)
+     */
+    public abstract void onBindViewHolder(Card card, T cardView);
+
+}
diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/presenters/CardPresenterSelector.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/presenters/CardPresenterSelector.java
new file mode 100644
index 0000000..d4e8283
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/presenters/CardPresenterSelector.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright (C) 2015 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 android.support.v17.leanback.supportleanbackshowcase.cards.presenters;
+
+import android.content.Context;
+import android.support.v17.leanback.supportleanbackshowcase.R;
+import android.support.v17.leanback.supportleanbackshowcase.models.Card;
+import android.support.v17.leanback.widget.Presenter;
+import android.support.v17.leanback.widget.PresenterSelector;
+
+import java.util.HashMap;
+
+/**
+ * This PresenterSelector will decide what Presenter to use depending on a given card's type.
+ */
+public class CardPresenterSelector extends PresenterSelector {
+
+    private final Context mContext;
+    private final HashMap<Card.Type, Presenter> presenters = new HashMap<Card.Type, Presenter>();
+
+    public CardPresenterSelector(Context context) {
+        mContext = context;
+    }
+
+    @Override
+    public Presenter getPresenter(Object item) {
+        if (!(item instanceof Card)) throw new RuntimeException(
+                String.format("The PresenterSelector only supports data items of type '%s'",
+                        Card.class.getName()));
+        Card card = (Card) item;
+        Presenter presenter = presenters.get(card.getType());
+        if (presenter == null) {
+            switch (card.getType()) {
+                case SINGLE_LINE:
+                    presenter = new SingleLineCardPresenter(mContext);
+                    break;
+                case MOVIE:
+                case MOVIE_BASE:
+                case MOVIE_COMPLETE:
+                case SQUARE_BIG:
+                case GRID_SQUARE:
+                case GAME: {
+                    int themeResId = R.style.MovieCardSimpleTheme;
+                    if (card.getType() == Card.Type.MOVIE_BASE) {
+                        themeResId = R.style.MovieCardBasicTheme;
+                    } else if (card.getType() == Card.Type.MOVIE_COMPLETE) {
+                        themeResId = R.style.MovieCardCompleteTheme;
+                    } else if (card.getType() == Card.Type.SQUARE_BIG) {
+                        themeResId = R.style.SquareBigCardTheme;
+                    } else if (card.getType() == Card.Type.GRID_SQUARE) {
+                        themeResId = R.style.GridCardTheme;
+                    } else if (card.getType() == Card.Type.GAME) {
+                        themeResId = R.style.GameCardTheme;
+                    }
+                    presenter = new ImageCardViewPresenter(mContext, themeResId);
+                    break;
+                }
+                case SIDE_INFO:
+                    presenter = new SideInfoCardPresenter(mContext);
+                    break;
+                case TEXT:
+                    presenter = new TextCardPresenter(mContext);
+                    break;
+                case ICON:
+                    presenter = new IconCardPresenter(mContext);
+                    break;
+                case CHARACTER:
+                    presenter = new CharacterCardPresenter(mContext);
+                    break;
+                default:
+                    presenter = new ImageCardViewPresenter(mContext);
+                    break;
+            }
+        }
+        presenters.put(card.getType(), presenter);
+        return presenter;
+    }
+
+}
diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/presenters/CharacterCardPresenter.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/presenters/CharacterCardPresenter.java
new file mode 100644
index 0000000..35a42a9
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/presenters/CharacterCardPresenter.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2015 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 android.support.v17.leanback.supportleanbackshowcase.cards.presenters;
+
+import android.content.Context;
+import android.support.v17.leanback.supportleanbackshowcase.cards.CharacterCardView;
+import android.support.v17.leanback.supportleanbackshowcase.models.Card;
+
+/**
+ * This Presenter is used to display the characters card row in the DetailView examples.
+ */
+public class CharacterCardPresenter extends AbstractCardPresenter<CharacterCardView> {
+
+    public CharacterCardPresenter(Context context) {
+        super(context);
+    }
+
+    @Override
+    protected CharacterCardView onCreateView() {
+        return new CharacterCardView(getContext());
+    }
+
+    @Override
+    public void onBindViewHolder(Card card, CharacterCardView cardView) {
+        cardView.updateUi(card);
+    }
+
+}
diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/presenters/IconCardPresenter.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/presenters/IconCardPresenter.java
new file mode 100644
index 0000000..c628988
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/presenters/IconCardPresenter.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2015 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 android.support.v17.leanback.supportleanbackshowcase.cards.presenters;
+
+import android.animation.ObjectAnimator;
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+import android.support.v17.leanback.supportleanbackshowcase.R;
+import android.support.v17.leanback.widget.ImageCardView;
+import android.view.View;
+import android.widget.ImageView;
+
+/**
+ * This Presenter will display cards which consists of a single icon which will be highlighted by a
+ * surrounding circle when the card is focused. AndroidTV uses these cards for entering settings
+ * menu.
+ */
+public class IconCardPresenter extends ImageCardViewPresenter {
+    private static final int ANIMATION_DURATION = 200;
+
+    public IconCardPresenter(Context context) {
+        super(context, R.style.IconCardTheme);
+    }
+
+    @Override
+    protected ImageCardView onCreateView() {
+        final ImageCardView imageCardView = super.onCreateView();
+        final ImageView image = imageCardView.getMainImageView();
+        image.setBackgroundResource(R.drawable.icon_focused);
+        image.getBackground().setAlpha(0);
+        imageCardView.setOnFocusChangeListener(new View.OnFocusChangeListener() {
+            @Override
+            public void onFocusChange(View v, boolean hasFocus) {
+                animateIconBackground(image.getBackground(), hasFocus);
+            }
+        });
+        return imageCardView;
+    }
+
+    private void animateIconBackground(Drawable drawable, boolean hasFocus) {
+        if (hasFocus) {
+            ObjectAnimator.ofInt(drawable, "alpha", 0, 255).setDuration(ANIMATION_DURATION).start();
+        } else {
+            ObjectAnimator.ofInt(drawable, "alpha", 255, 0).setDuration(ANIMATION_DURATION).start();
+        }
+    }
+}
diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/presenters/ImageCardViewPresenter.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/presenters/ImageCardViewPresenter.java
new file mode 100644
index 0000000..f0b75f1
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/presenters/ImageCardViewPresenter.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2015 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 android.support.v17.leanback.supportleanbackshowcase.cards.presenters;
+
+import android.content.Context;
+import android.support.v17.leanback.supportleanbackshowcase.R;
+import android.support.v17.leanback.supportleanbackshowcase.models.Card;
+import android.support.v17.leanback.widget.ImageCardView;
+import android.view.ContextThemeWrapper;
+
+import android.view.View;
+import android.widget.Toast;
+import com.squareup.picasso.Picasso;
+
+/**
+ * A very basic {@link ImageCardView} {@link android.support.v17.leanback.widget.Presenter}.You can
+ * pass a custom style for the ImageCardView in the constructor. Use the default constructor to
+ * create a Presenter with a default ImageCardView style.
+ */
+public class ImageCardViewPresenter extends AbstractCardPresenter<ImageCardView> {
+
+    public ImageCardViewPresenter(Context context, int cardThemeResId) {
+        super(new ContextThemeWrapper(context, cardThemeResId));
+    }
+
+    public ImageCardViewPresenter(Context context) {
+        this(context, R.style.DefaultCardTheme);
+    }
+
+    @Override
+    protected ImageCardView onCreateView() {
+        ImageCardView imageCardView = new ImageCardView(getContext());
+        imageCardView.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                Toast.makeText(getContext(), "Clicked on ImageCardView", Toast.LENGTH_SHORT).show();
+            }
+        });
+        return imageCardView;
+    }
+
+    @Override
+    public void onBindViewHolder(Card card, final ImageCardView cardView) {
+        cardView.setTag(card);
+        cardView.setTitleText(card.getTitle());
+        cardView.setContentText(card.getDescription());
+        if (card.getLocalImageResourceName() != null) {
+            int resourceId = getContext().getResources()
+                    .getIdentifier(card.getLocalImageResourceName(),
+                            "drawable", getContext().getPackageName());
+            Picasso.with(getContext()).load(resourceId).into(cardView.getMainImageView());
+        }
+    }
+
+}
diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/presenters/SideInfoCardPresenter.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/presenters/SideInfoCardPresenter.java
new file mode 100644
index 0000000..b9f44fc
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/presenters/SideInfoCardPresenter.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2015 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 android.support.v17.leanback.supportleanbackshowcase.cards.presenters;
+
+import android.content.Context;
+import android.support.v17.leanback.supportleanbackshowcase.R;
+import android.support.v17.leanback.supportleanbackshowcase.models.Card;
+import android.support.v17.leanback.widget.BaseCardView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.squareup.picasso.Picasso;
+
+/**
+ * This Presenter will display a card consisting of an image on the left side of the card followed
+ * by text on the right side. The image and text have equal width. The text will work like a info
+ * box, thus it will be hidden if the parent row is inactive. This behavior is unique to this card
+ * and requires a special focus handler.
+ */
+public class SideInfoCardPresenter extends AbstractCardPresenter<BaseCardView> {
+
+    public SideInfoCardPresenter(Context context) {
+        super(context);
+    }
+
+    @Override
+    protected BaseCardView onCreateView() {
+        final BaseCardView cardView = new BaseCardView(getContext(), null,
+                R.style.SideInfoCardStyle);
+        cardView.setFocusable(true);
+        cardView.addView(LayoutInflater.from(getContext()).inflate(R.layout.side_info_card, null));
+        return cardView;
+    }
+
+    @Override
+    public void onBindViewHolder(Card card, BaseCardView cardView) {
+        ImageView imageView = (ImageView) cardView.findViewById(R.id.main_image);
+        if (card.getLocalImageResourceName() != null) {
+            int width = (int) getContext().getResources()
+                    .getDimension(R.dimen.sidetext_image_card_width);
+            int height = (int) getContext().getResources()
+                    .getDimension(R.dimen.sidetext_image_card_height);
+            int resourceId = getContext().getResources()
+                    .getIdentifier(card.getLocalImageResourceName(),
+                            "drawable", getContext().getPackageName());
+            Picasso.with(getContext()).load(resourceId).resize(width, height).centerCrop()
+                    .into(imageView);
+        }
+
+        TextView primaryText = (TextView) cardView.findViewById(R.id.primary_text);
+        primaryText.setText(card.getTitle());
+
+        TextView secondaryText = (TextView) cardView.findViewById(R.id.secondary_text);
+        secondaryText.setText(card.getDescription());
+
+        TextView extraText = (TextView) cardView.findViewById(R.id.extra_text);
+        extraText.setText(card.getExtraText());
+    }
+
+}
diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/presenters/SingleLineCardPresenter.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/presenters/SingleLineCardPresenter.java
new file mode 100644
index 0000000..a823993
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/presenters/SingleLineCardPresenter.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2015 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 android.support.v17.leanback.supportleanbackshowcase.cards.presenters;
+
+import android.content.Context;
+import android.support.v17.leanback.supportleanbackshowcase.R;
+import android.support.v17.leanback.supportleanbackshowcase.models.Card;
+import android.support.v17.leanback.widget.ImageCardView;
+
+/**
+ * This Presenter will display a card which consists of a big image followed by a colored footer.
+ * Not only the colored footer is unique to this card, but also it's footer (info) will be visible
+ * even when its parent row is inactive.
+ */
+public class SingleLineCardPresenter extends ImageCardViewPresenter {
+
+    public SingleLineCardPresenter(Context context) {
+        super(context, R.style.SingleLineCardTheme);
+    }
+
+    @Override public void onBindViewHolder(Card card, ImageCardView cardView) {
+        super.onBindViewHolder(card, cardView);
+        cardView.setInfoAreaBackgroundColor(card.getFooterColor());
+    }
+
+}
diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/presenters/TextCardPresenter.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/presenters/TextCardPresenter.java
new file mode 100644
index 0000000..7e65f0f
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/cards/presenters/TextCardPresenter.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2015 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 android.support.v17.leanback.supportleanbackshowcase.cards.presenters;
+
+import android.content.Context;
+import android.support.v17.leanback.supportleanbackshowcase.cards.TextCardView;
+import android.support.v17.leanback.supportleanbackshowcase.models.Card;
+
+/**
+ * The Presenter displays a card consisting of text as a replacement for a big image. The footer is
+ * also quite unique since it does contain two images rather than one or non.
+ */
+public class TextCardPresenter extends AbstractCardPresenter<TextCardView> {
+
+    public TextCardPresenter(Context context) {
+        super(context);
+    }
+
+    @Override
+    protected TextCardView onCreateView() {
+        return new TextCardView(getContext());
+    }
+
+    @Override
+    public void onBindViewHolder(Card card, TextCardView cardView) {
+        cardView.updateUi(card);
+    }
+
+}
diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/models/Card.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/models/Card.java
new file mode 100644
index 0000000..ccaaf72
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/models/Card.java
@@ -0,0 +1,129 @@
+/*
+ * Copyright (C) 2014 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 android.support.v17.leanback.supportleanbackshowcase.models;
+
+import android.content.Context;
+import android.graphics.Color;
+import android.util.Log;
+
+import com.google.gson.annotations.SerializedName;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+
+/**
+ * This is a generic example of a custom data object, containing info we might want to keep with
+ * each card on the home screen
+ */
+public class Card {
+
+    @SerializedName("title") private String mTitle = "";
+    @SerializedName("description") private String mDescription = "";
+    @SerializedName("extraText") private String mExtraText = "";
+    @SerializedName("imageUrl") private String mImageUrl;
+    @SerializedName("footerColor") private String mFooterColor = null;
+    @SerializedName("selectedColor") private String mSelectedColor = null;
+    @SerializedName("localImageResource") private String mLocalImageResource = null;
+    @SerializedName("footerIconLocalImageResource") private String mFooterResource = null;
+    @SerializedName("type") private Card.Type mType;
+    @SerializedName("id") private int mId;
+    @SerializedName("width") private int mWidth;
+    @SerializedName("height") private int mHeight;
+
+    public String getTitle() {
+        return mTitle;
+    }
+
+    public int getWidth() {
+        return mWidth;
+    }
+
+    public int getHeight() {
+        return mHeight;
+    }
+
+    public int getId() {
+        return mId;
+    }
+
+    public Card.Type getType() {
+        return mType;
+    }
+
+    public String getDescription() {
+        return mDescription;
+    }
+
+    public String getExtraText() {
+        return mExtraText;
+    }
+
+    public int getFooterColor() {
+        if (mFooterColor == null) return -1;
+        return Color.parseColor(mFooterColor);
+    }
+
+    public int getSelectedColor() {
+        if (mSelectedColor == null) return -1;
+        return Color.parseColor(mSelectedColor);
+    }
+
+    public String getImageUrl() {
+        return mImageUrl;
+    }
+
+    public URI getImageURI() {
+        if (getImageUrl() == null) return null;
+        try {
+            return new URI(getImageUrl());
+        } catch (URISyntaxException e) {
+            Log.d("URI exception: ", getImageUrl());
+            return null;
+        }
+    }
+
+    public int getLocalImageResourceId(Context context) {
+        return context.getResources().getIdentifier(getLocalImageResourceName(), "drawable",
+                                                    context.getPackageName());
+    }
+
+    public String getLocalImageResourceName() {
+        return mLocalImageResource;
+    }
+
+    public String getFooterLocalImageResourceName() {
+        return mFooterResource;
+    }
+
+    public enum Type {
+
+        MOVIE_COMPLETE,
+        MOVIE,
+        MOVIE_BASE,
+        ICON,
+        SQUARE_BIG,
+        SINGLE_LINE,
+        GAME,
+        SQUARE_SMALL,
+        DEFAULT,
+        SIDE_INFO,
+        SIDE_INFO_TEST_1,
+        TEXT,
+        CHARACTER,
+        GRID_SQUARE
+
+    }
+
+}
diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/models/CardRow.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/models/CardRow.java
new file mode 100644
index 0000000..ffc5001
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/models/CardRow.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 2015 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 android.support.v17.leanback.supportleanbackshowcase.models;
+
+import com.google.gson.annotations.SerializedName;
+
+import java.util.List;
+
+/**
+ * This class represents a row of cards. In a real world application you might want to store more
+ * data than in this example.
+ */
+public class CardRow {
+
+    // default is a list of cards
+    public static final int TYPE_DEFAULT = 0;
+    // section header
+    public static final int TYPE_SECTION_HEADER = 1;
+    // divider
+    public static final int TYPE_DIVIDER = 2;
+
+    @SerializedName("type") private int mType = TYPE_DEFAULT;
+    // Used to determine whether the row shall use shadows when displaying its cards or not.
+    @SerializedName("shadow") private boolean mShadow = true;
+    @SerializedName("title") private String mTitle;
+    @SerializedName("cards") private List<Card> mCards;
+
+    public int getType() {
+        return mType;
+    }
+
+    public String getTitle() {
+        return mTitle;
+    }
+
+    public boolean useShadow() {
+        return mShadow;
+    }
+
+    public List<Card> getCards() {
+        return mCards;
+    }
+
+}
diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/models/DetailedCard.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/models/DetailedCard.java
new file mode 100644
index 0000000..8727a40
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/models/DetailedCard.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2015 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 android.support.v17.leanback.supportleanbackshowcase.models;
+
+import android.content.Context;
+import android.support.v17.leanback.supportleanbackshowcase.models.Card;
+
+import com.google.gson.annotations.SerializedName;
+
+public class DetailedCard {
+
+    @SerializedName("title") private String mTitle = "";
+    @SerializedName("description") private String mDescription = "";
+    @SerializedName("text") private String mText = "";
+    @SerializedName("localImageResource") private String mLocalImageResource = null;
+    @SerializedName("price") private String mPrice = null;
+    @SerializedName("characters") private Card[] mCharacters = null;
+    @SerializedName("recommended") private Card[] mRecommended = null;
+    @SerializedName("year") private int mYear = 0;
+
+
+    public String getPrice() {
+        return mPrice;
+    }
+
+    public int getYear() {
+        return mYear;
+    }
+
+    public String getLocalImageResource() {
+        return mLocalImageResource;
+    }
+
+    public String getText() {
+        return mText;
+    }
+
+    public String getDescription() {
+        return mDescription;
+    }
+
+    public String getTitle() {
+        return mTitle;
+    }
+
+    public Card[] getCharacters() {
+        return mCharacters;
+    }
+
+    public Card[] getRecommended() {
+        return mRecommended;
+    }
+
+    public int getLocalImageResourceId(Context context) {
+        return context.getResources()
+                      .getIdentifier(getLocalImageResource(), "drawable", context.getPackageName());
+    }
+}
diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/models/Movie.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/models/Movie.java
new file mode 100644
index 0000000..83912b3
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/models/Movie.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2015 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 android.support.v17.leanback.supportleanbackshowcase.models;
+
+import com.google.gson.annotations.SerializedName;
+
+import java.io.Serializable;
+
+public class Movie implements Serializable {
+
+    private static final long serialVersionUID = 133742L;
+
+    @SerializedName("title")
+    private String mTitle = "";
+    @SerializedName("price_hd")
+    private String mPriceHd = "n/a";
+    @SerializedName("price_sd")
+    private String mPriceSd = "n/a";
+    @SerializedName("breadcrump")
+    private String mBreadcrump = "";
+
+    public String getTitle() {
+        return mTitle;
+    }
+
+    public String getBreadcrump() {
+        return mBreadcrump;
+    }
+
+    public String getPriceHd() {
+        return mPriceHd;
+    }
+
+    public String getPriceSd() {
+        return mPriceSd;
+    }
+
+}
diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/models/Song.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/models/Song.java
new file mode 100644
index 0000000..1ba29ca
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/models/Song.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright (C) 2015 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 android.support.v17.leanback.supportleanbackshowcase.models;
+
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+import android.support.v17.leanback.supportleanbackshowcase.R;
+import android.support.v17.leanback.widget.BaseOnItemViewSelectedListener;
+import android.support.v17.leanback.widget.MultiActionsProvider;
+import android.support.v17.leanback.widget.Row;
+import android.support.v17.leanback.widget.RowPresenter;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import com.google.gson.Gson;
+import com.google.gson.annotations.SerializedName;
+
+public class Song implements MultiActionsProvider {
+
+    @SerializedName("title") private String mTitle = "";
+    @SerializedName("description") private String mDescription = "";
+    @SerializedName("text") private String mText = "";
+    @SerializedName("image") private String mImage = null;
+    @SerializedName("file") private String mFile = null;
+    @SerializedName("duration") private String mDuration = null;
+    @SerializedName("number") private int mNumber = 0;
+    @SerializedName("favorite") private boolean mFavorite = false;
+
+    private MultiAction[] mMediaRowActions;
+
+
+    public void setMediaRowActions(MultiAction[] mediaRowActions) {
+        mMediaRowActions = mediaRowActions;
+    }
+
+    public MultiAction[] getMediaRowActions() {
+        return mMediaRowActions;
+    }
+
+    public String getDuration() {
+        return mDuration;
+    }
+
+    public void setDuration(String duration) {
+        mDuration = duration;
+    }
+
+    public int getNumber() {
+        return mNumber;
+    }
+
+    public String getText() {
+        return mText;
+    }
+
+    public String getDescription() {
+        return mDescription;
+    }
+
+    public void setDescription(String description) {
+        mDescription = description;
+    }
+
+    public String getTitle() {
+        return mTitle;
+    }
+
+    public void setTitle(String title) {
+        mTitle = title;
+    }
+
+    public boolean isFavorite() {
+        return mFavorite;
+    }
+
+    public void setFavorite(boolean favorite) {
+        mFavorite = favorite;
+    }
+
+    public int getFileResource(Context context) {
+        return context.getResources()
+                      .getIdentifier(mFile, "raw", context.getPackageName());
+    }
+
+    public int getImageResource(Context context) {
+        return context.getResources()
+                      .getIdentifier(mImage, "drawable", context.getPackageName());
+    }
+
+    @Override
+    public MultiAction[] getActions() {
+        return mMediaRowActions;
+    }
+
+}
diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/models/SongList.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/models/SongList.java
new file mode 100644
index 0000000..034ae19
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/models/SongList.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2015 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 android.support.v17.leanback.supportleanbackshowcase.models;
+
+import com.google.gson.annotations.SerializedName;
+
+import java.util.List;
+
+/**
+ */
+public class SongList {
+
+    @SerializedName("songs") private List<Song> mSongs;
+
+    public List<Song> getSongs() {
+        return mSongs;
+    }
+
+}
diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/utils/CardListRow.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/utils/CardListRow.java
new file mode 100644
index 0000000..19f2437
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/utils/CardListRow.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2015 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 android.support.v17.leanback.supportleanbackshowcase.utils;
+
+import android.support.v17.leanback.supportleanbackshowcase.app.details.ShadowRowPresenterSelector;
+import android.support.v17.leanback.supportleanbackshowcase.models.CardRow;
+import android.support.v17.leanback.widget.HeaderItem;
+import android.support.v17.leanback.widget.ListRow;
+import android.support.v17.leanback.widget.ObjectAdapter;
+
+/**
+ * The {@link CardListRow} allows the {@link ShadowRowPresenterSelector} to access the {@link CardRow}
+ * held by the row and determine whether to use a {@link android.support.v17.leanback.widget.Presenter}
+ * with or without a shadow.
+ */
+public class CardListRow extends ListRow {
+
+    private CardRow mCardRow;
+
+    public CardListRow(HeaderItem header, ObjectAdapter adapter, CardRow cardRow) {
+        super(header, adapter);
+        setCardRow(cardRow);
+    }
+
+    public CardRow getCardRow() {
+        return mCardRow;
+    }
+
+    public void setCardRow(CardRow cardRow) {
+        this.mCardRow = cardRow;
+    }
+}
diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/utils/Constants.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/utils/Constants.java
new file mode 100644
index 0000000..1c9dd9c
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/utils/Constants.java
@@ -0,0 +1,17 @@
+/*
+ * Copyright (c) 2015 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 android.support.v17.leanback.supportleanbackshowcase.utils;
+
+public class Constants {
+
+    public static final boolean LOCAL_LOGD = true;
+
+}
diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/utils/PicassoBackgroundManagerTarget.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/utils/PicassoBackgroundManagerTarget.java
new file mode 100644
index 0000000..2723d0b
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/utils/PicassoBackgroundManagerTarget.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2014 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 android.support.v17.leanback.supportleanbackshowcase.utils;
+
+import android.graphics.Bitmap;
+import android.graphics.drawable.Drawable;
+import android.support.v17.leanback.app.BackgroundManager;
+
+import com.squareup.picasso.Picasso;
+import com.squareup.picasso.Target;
+
+/**
+ * Picasso target for updating default_background images
+ */
+public class PicassoBackgroundManagerTarget implements Target {
+
+    private BackgroundManager mBackgroundManager;
+
+    public PicassoBackgroundManagerTarget(BackgroundManager backgroundManager) {
+        this.mBackgroundManager = backgroundManager;
+    }
+
+    @Override public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom loadedFrom) {
+        this.mBackgroundManager.setBitmap(bitmap);
+    }
+
+    @Override public void onBitmapFailed(Drawable drawable) {
+        this.mBackgroundManager.setDrawable(drawable);
+    }
+
+    @Override public void onPrepareLoad(Drawable drawable) {
+        // Do nothing, default_background manager has its own transitions
+    }
+
+    @Override public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+
+        PicassoBackgroundManagerTarget that = (PicassoBackgroundManagerTarget) o;
+
+        if (!mBackgroundManager.equals(that.mBackgroundManager)) return false;
+
+        return true;
+    }
+
+    @Override public int hashCode() {
+        return mBackgroundManager.hashCode();
+    }
+}
diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/utils/ResourceCache.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/utils/ResourceCache.java
new file mode 100644
index 0000000..09a1965
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/utils/ResourceCache.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2015 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 android.support.v17.leanback.supportleanbackshowcase.utils;
+
+import android.util.SparseArray;
+import android.view.View;
+
+/**
+ * ResourceCache allows retrieving children from a given view and caches the resulting views in
+ * order to prevent future lookups.
+ */
+public class ResourceCache {
+
+    private final SparseArray<View> mCachedViews = new SparseArray<View>();
+
+    public <ViewType extends View> ViewType getViewById(View view, int resId) {
+        View child = mCachedViews.get(resId, null);
+        if (child == null) {
+            child = view.findViewById(resId);
+            mCachedViews.put(resId, child);
+        }
+        return (ViewType) child;
+    }
+}
diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/utils/Utils.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/utils/Utils.java
new file mode 100644
index 0000000..4416cbe
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/utils/Utils.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2014 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 android.support.v17.leanback.supportleanbackshowcase.utils;
+
+import android.content.ContentResolver;
+import android.content.Context;
+import android.net.Uri;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+/**
+ * A collection of utility methods, all static.
+ */
+public class Utils {
+
+    public static int convertDpToPixel(Context ctx, int dp) {
+        float density = ctx.getResources().getDisplayMetrics().density;
+        return Math.round((float) dp * density);
+    }
+
+    /**
+     * Will read the content from a given {@link InputStream} and return it as a {@link String}.
+     *
+     * @param inputStream The {@link InputStream} which should be read.
+     * @return Returns <code>null</code> if the the {@link InputStream} could not be read. Else
+     * returns the content of the {@link InputStream} as {@link String}.
+     */
+    public static String inputStreamToString(InputStream inputStream) {
+        try {
+            byte[] bytes = new byte[inputStream.available()];
+            inputStream.read(bytes, 0, bytes.length);
+            String json = new String(bytes);
+            return json;
+        } catch (IOException e) {
+            return null;
+        }
+    }
+
+    public static Uri getResourceUri(Context context, int resID) {
+        return Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + "://" +
+                                 context.getResources().getResourcePackageName(resID) + '/' +
+                                 context.getResources().getResourceTypeName(resID) + '/' +
+                                 context.getResources().getResourceEntryName(resID));
+    }
+}
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-v21/song_row_background_focused.xml b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-v21/song_row_background_focused.xml
new file mode 100644
index 0000000..34e2bd7
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-v21/song_row_background_focused.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <item>
+        <color android:color="#384248"></color>
+    </item>
+    <item>
+        <ripple xmlns:android="http://schemas.android.com/apk/res/android"
+                android:color="?android:attr/colorControlHighlight">
+            <item android:id="@android:id/mask">
+                <shape android:shape="rectangle">
+                    <corners android:radius="2dp"/>
+                    <solid android:color="#FFFFFF"/>
+                </shape>
+            </item>
+
+        </ripple>
+    </item>
+
+</layer-list>
\ No newline at end of file
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/background_canyon.jpg b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/background_canyon.jpg
new file mode 100644
index 0000000..0f77261
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/background_canyon.jpg
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/background_food.jpg b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/background_food.jpg
new file mode 100644
index 0000000..cbe05f8
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/background_food.jpg
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/background_sax.jpg b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/background_sax.jpg
new file mode 100644
index 0000000..20fec8c
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/background_sax.jpg
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/card_image_dummy_16_9_l.png b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/card_image_dummy_16_9_l.png
new file mode 100644
index 0000000..6088150
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/card_image_dummy_16_9_l.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/card_image_movie_01.jpg b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/card_image_movie_01.jpg
new file mode 100644
index 0000000..df42850
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/card_image_movie_01.jpg
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/card_image_movie_02.jpg b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/card_image_movie_02.jpg
new file mode 100644
index 0000000..f633b04
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/card_image_movie_02.jpg
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/card_image_movie_03.jpg b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/card_image_movie_03.jpg
new file mode 100644
index 0000000..52a6b01
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/card_image_movie_03.jpg
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/card_image_movie_04.jpg b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/card_image_movie_04.jpg
new file mode 100644
index 0000000..428e6bf
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/card_image_movie_04.jpg
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/card_image_movie_05.jpg b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/card_image_movie_05.jpg
new file mode 100644
index 0000000..a816fe8
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/card_image_movie_05.jpg
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/card_image_movie_06.jpg b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/card_image_movie_06.jpg
new file mode 100644
index 0000000..8746fd9
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/card_image_movie_06.jpg
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/card_image_movie_07.jpg b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/card_image_movie_07.jpg
new file mode 100644
index 0000000..770f22e
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/card_image_movie_07.jpg
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/card_image_movie_08.jpg b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/card_image_movie_08.jpg
new file mode 100644
index 0000000..cf83f9f
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/card_image_movie_08.jpg
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/card_image_movie_09.jpg b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/card_image_movie_09.jpg
new file mode 100644
index 0000000..2622893
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/card_image_movie_09.jpg
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/card_image_music_01.jpg b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/card_image_music_01.jpg
new file mode 100644
index 0000000..d604a50
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/card_image_music_01.jpg
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/card_image_music_02.jpg b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/card_image_music_02.jpg
new file mode 100644
index 0000000..cdcee88
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/card_image_music_02.jpg
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/card_image_music_03.jpg b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/card_image_music_03.jpg
new file mode 100644
index 0000000..229f0c4
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/card_image_music_03.jpg
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/card_image_music_04.jpg b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/card_image_music_04.jpg
new file mode 100644
index 0000000..b7bbe9c
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/card_image_music_04.jpg
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/card_image_music_05.jpg b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/card_image_music_05.jpg
new file mode 100644
index 0000000..bfa1389
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/card_image_music_05.jpg
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/card_image_music_06.jpg b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/card_image_music_06.jpg
new file mode 100644
index 0000000..033d60e
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/card_image_music_06.jpg
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/card_image_music_07.jpg b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/card_image_music_07.jpg
new file mode 100644
index 0000000..784d0e9
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/card_image_music_07.jpg
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/card_image_music_08.jpg b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/card_image_music_08.jpg
new file mode 100644
index 0000000..040e222
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/card_image_music_08.jpg
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/card_image_music_09.jpg b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/card_image_music_09.jpg
new file mode 100644
index 0000000..2a9f136
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/card_image_music_09.jpg
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/category_action.png b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/category_action.png
new file mode 100755
index 0000000..f3cb7af
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/category_action.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/category_animation.png b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/category_animation.png
new file mode 100755
index 0000000..a1d9f40
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/category_animation.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/category_classics.png b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/category_classics.png
new file mode 100755
index 0000000..17c1580
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/category_classics.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/category_comedy.png b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/category_comedy.png
new file mode 100755
index 0000000..5a23e6e
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/category_comedy.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/category_crime.png b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/category_crime.png
new file mode 100755
index 0000000..52450a6
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/category_crime.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/category_documentary.png b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/category_documentary.png
new file mode 100755
index 0000000..afb2b61
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/category_documentary.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/category_drama.png b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/category_drama.png
new file mode 100755
index 0000000..79e1b57
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/category_drama.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/coffee_and_tea_01.png b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/coffee_and_tea_01.png
new file mode 100755
index 0000000..9fb73f7
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/coffee_and_tea_01.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/coffee_and_tea_02.png b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/coffee_and_tea_02.png
new file mode 100755
index 0000000..9e0abfe
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/coffee_and_tea_02.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/coffee_and_tea_03.png b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/coffee_and_tea_03.png
new file mode 100755
index 0000000..cd78b71
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/coffee_and_tea_03.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/coffee_and_tea_04.png b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/coffee_and_tea_04.png
new file mode 100755
index 0000000..bf7561c
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/coffee_and_tea_04.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/coffee_and_tea_05.png b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/coffee_and_tea_05.png
new file mode 100755
index 0000000..eae5338
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/coffee_and_tea_05.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/coffee_and_tea_06.png b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/coffee_and_tea_06.png
new file mode 100755
index 0000000..b1feda0
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/coffee_and_tea_06.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/coffee_and_tea_07.png b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/coffee_and_tea_07.png
new file mode 100755
index 0000000..0f7dd21
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/coffee_and_tea_07.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/coffee_and_tea_08.png b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/coffee_and_tea_08.png
new file mode 100755
index 0000000..b904137
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/coffee_and_tea_08.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/food_01.png b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/food_01.png
new file mode 100755
index 0000000..b4757a8
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/food_01.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/food_02.png b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/food_02.png
new file mode 100755
index 0000000..0d746d3
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/food_02.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/food_03.png b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/food_03.png
new file mode 100755
index 0000000..ddde1ef
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/food_03.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/food_04.png b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/food_04.png
new file mode 100755
index 0000000..ca09156
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/food_04.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/food_05.png b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/food_05.png
new file mode 100755
index 0000000..8c4d7e6
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/food_05.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/food_06.png b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/food_06.png
new file mode 100755
index 0000000..d81ad8c
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/food_06.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/food_07.png b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/food_07.png
new file mode 100755
index 0000000..a0f381d
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/food_07.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/food_08.png b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/food_08.png
new file mode 100755
index 0000000..c377d27
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/food_08.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/food_09.png b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/food_09.png
new file mode 100755
index 0000000..de5a207
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/food_09.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/food_10.png b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/food_10.png
new file mode 100755
index 0000000..958f47e
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/food_10.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/food_11.png b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/food_11.png
new file mode 100755
index 0000000..36a8007
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/food_11.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/food_12.png b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/food_12.png
new file mode 100755
index 0000000..4d60e8e
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/food_12.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/food_13.png b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/food_13.png
new file mode 100755
index 0000000..b4a8837
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/food_13.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/food_14.png b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/food_14.png
new file mode 100755
index 0000000..ae3d40b
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/food_14.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/game_crazy_one.jpg b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/game_crazy_one.jpg
new file mode 100644
index 0000000..9bb47c1
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/game_crazy_one.jpg
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/game_cursed.jpg b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/game_cursed.jpg
new file mode 100644
index 0000000..7d4b45a
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/game_cursed.jpg
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/game_fairy.jpg b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/game_fairy.jpg
new file mode 100644
index 0000000..c1658e9
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/game_fairy.jpg
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/game_hear_the_roar.jpg b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/game_hear_the_roar.jpg
new file mode 100644
index 0000000..78003b2
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/game_hear_the_roar.jpg
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/game_silence.jpg b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/game_silence.jpg
new file mode 100644
index 0000000..1672536
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/game_silence.jpg
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/ic_cc.png b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/ic_cc.png
new file mode 100644
index 0000000..4615394
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/ic_cc.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/ic_installed.png b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/ic_installed.png
new file mode 100644
index 0000000..190f6ba
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/ic_installed.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/ic_settings_apps.png b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/ic_settings_apps.png
new file mode 100755
index 0000000..ed92603
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/ic_settings_apps.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/ic_settings_more.png b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/ic_settings_more.png
new file mode 100755
index 0000000..5307576
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/ic_settings_more.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/ic_settings_parental_control.png b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/ic_settings_parental_control.png
new file mode 100755
index 0000000..d541c6a
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/ic_settings_parental_control.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/ic_settings_settings.png b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/ic_settings_settings.png
new file mode 100755
index 0000000..f2eaa45
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/ic_settings_settings.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/ic_settings_time.png b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/ic_settings_time.png
new file mode 100755
index 0000000..72899ae
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/ic_settings_time.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/ic_settings_wifi_3_bar.png b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/ic_settings_wifi_3_bar.png
new file mode 100755
index 0000000..f9abb6c
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/ic_settings_wifi_3_bar.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/ic_settings_wifi_4_bar.png b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/ic_settings_wifi_4_bar.png
new file mode 100755
index 0000000..dcd2088
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/ic_settings_wifi_4_bar.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/ic_star_off.png b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/ic_star_off.png
new file mode 100644
index 0000000..cbee75a
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/ic_star_off.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/ic_star_on_yellow.png b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/ic_star_on_yellow.png
new file mode 100644
index 0000000..28cd07a
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/ic_star_on_yellow.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/movie_poster_01.png b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/movie_poster_01.png
new file mode 100644
index 0000000..e09af32
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/movie_poster_01.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/stars_red.png b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/stars_red.png
new file mode 100644
index 0000000..e4c6056
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/stars_red.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/stars_white.png b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/stars_white.png
new file mode 100644
index 0000000..83e7c8b
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/stars_white.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/thumbnail_example_browse.png b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/thumbnail_example_browse.png
new file mode 100755
index 0000000..374f357
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/thumbnail_example_browse.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/thumbnail_example_cards.png b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/thumbnail_example_cards.png
new file mode 100755
index 0000000..1ddadfa
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/thumbnail_example_cards.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/thumbnail_example_custom_01.png b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/thumbnail_example_custom_01.png
new file mode 100755
index 0000000..f73b9b7
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/thumbnail_example_custom_01.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/thumbnail_example_detail.png b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/thumbnail_example_detail.png
new file mode 100755
index 0000000..aa881b8
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/thumbnail_example_detail.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/thumbnail_example_dialog.png b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/thumbnail_example_dialog.png
new file mode 100755
index 0000000..6508d08
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/thumbnail_example_dialog.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/thumbnail_example_grid.png b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/thumbnail_example_grid.png
new file mode 100755
index 0000000..686566f
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/thumbnail_example_grid.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/thumbnail_example_music_consumption.png b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/thumbnail_example_music_consumption.png
new file mode 100755
index 0000000..ffc653d
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/thumbnail_example_music_consumption.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/thumbnail_example_settings.png b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/thumbnail_example_settings.png
new file mode 100755
index 0000000..8337b92
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/thumbnail_example_settings.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/thumbnail_example_video_consumption.png b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/thumbnail_example_video_consumption.png
new file mode 100755
index 0000000..a0a9d95
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/thumbnail_example_video_consumption.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/thumbnail_example_wizard.png b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/thumbnail_example_wizard.png
new file mode 100755
index 0000000..4338d30
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/thumbnail_example_wizard.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/title_android_tv.png b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/title_android_tv.png
new file mode 100644
index 0000000..8d1e241
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable-xhdpi/title_android_tv.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable/app_icon_your_company.png b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/app_icon_your_company.png
new file mode 100644
index 0000000..0a47b01
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/app_icon_your_company.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable/bg_living_room.jpg b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/bg_living_room.jpg
new file mode 100644
index 0000000..47e8851
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/bg_living_room.jpg
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable/bg_living_room_wide.jpg b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/bg_living_room_wide.jpg
new file mode 100644
index 0000000..156d55c
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/bg_living_room_wide.jpg
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable/character_focused.xml b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/character_focused.xml
new file mode 100644
index 0000000..5c2570d
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/character_focused.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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="oval">
+    <padding
+        android:bottom="4dp"
+        android:left="4dp"
+        android:right="4dp"
+        android:top="4dp"></padding>
+    <solid android:color="#FFEEEEEE"></solid>
+</shape>
\ No newline at end of file
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable/character_not_focused.xml b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/character_not_focused.xml
new file mode 100644
index 0000000..db4cf9c
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/character_not_focused.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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="oval">
+    <padding
+        android:bottom="4dp"
+        android:left="4dp"
+        android:right="4dp"
+        android:top="4dp"></padding>
+    <solid android:color="#FFCCCCCC"></solid>
+</shape>
\ No newline at end of file
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable/character_not_focused_padding.xml b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/character_not_focused_padding.xml
new file mode 100644
index 0000000..8da3812
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/character_not_focused_padding.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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="oval">
+    <padding
+        android:bottom="4dp"
+        android:left="4dp"
+        android:right="4dp"
+        android:top="4dp"></padding>
+    <solid android:color="#00CCCCCC"></solid>
+</shape>
\ No newline at end of file
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable/default_background.xml b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/default_background.xml
new file mode 100644
index 0000000..d9fa80b
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/default_background.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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:angle="-270"
+        android:endColor="@color/background_gradient_end"
+        android:startColor="@color/background_gradient_start"/>
+</shape>
\ No newline at end of file
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable/face_01.png b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/face_01.png
new file mode 100755
index 0000000..d5b2900
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/face_01.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable/face_02.png b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/face_02.png
new file mode 100755
index 0000000..ced0a7c
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/face_02.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable/face_03.png b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/face_03.png
new file mode 100755
index 0000000..276cacf
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/face_03.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable/face_04.png b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/face_04.png
new file mode 100755
index 0000000..e90487d
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/face_04.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable/face_05.png b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/face_05.png
new file mode 100755
index 0000000..f048ecb
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/face_05.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable/face_06.png b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/face_06.png
new file mode 100755
index 0000000..f4d15eb
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/face_06.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable/face_07.png b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/face_07.png
new file mode 100755
index 0000000..7ac0af3
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/face_07.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable/face_08.png b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/face_08.png
new file mode 100755
index 0000000..e6fc51e
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/face_08.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable/ic_favorite_border_white_24dp.xml b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/ic_favorite_border_white_24dp.xml
new file mode 100644
index 0000000..03e16ad
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/ic_favorite_border_white_24dp.xml
@@ -0,0 +1,9 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="24dp"
+        android:height="24dp"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0">
+    <path
+        android:pathData="M16.5,3c-1.74,0 -3.41,0.81 -4.5,2.09C10.91,3.81 9.24,3 7.5,3 4.42,3 2,5.42 2,8.5c0,3.78 3.4,6.86 8.55,11.54L12,21.35l1.45,-1.32C18.6,15.36 22,12.28 22,8.5 22,5.42 19.58,3 16.5,3zM12.1,18.55l-0.1,0.1 -0.1,-0.1C7.14,14.24 4,11.39 4,8.5 4,6.5 5.5,5 7.5,5c1.54,0 3.04,0.99 3.57,2.36h1.87C13.46,5.99 14.96,5 16.5,5c2,0 3.5,1.5 3.5,3.5 0,2.89 -3.14,5.74 -7.9,10.05z"
+        android:fillColor="#FFFFFF"/>
+</vector>
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable/ic_favorite_filled_24dp.xml b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/ic_favorite_filled_24dp.xml
new file mode 100644
index 0000000..bce1999
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/ic_favorite_filled_24dp.xml
@@ -0,0 +1,9 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="24dp"
+        android:height="24dp"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0">
+    <path
+        android:pathData="M12,21.35l-1.45,-1.32C5.4,15.36 2,12.28 2,8.5 2,5.42 4.42,3 7.5,3c1.74,0 3.41,0.81 4.5,2.09C13.09,3.81 14.76,3 16.5,3 19.58,3 22,5.42 22,8.5c0,3.78 -3.4,6.86 -8.55,11.54L12,21.35z"
+        android:fillColor="@color/song_row_favorite_color"/>
+</vector>
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable/ic_playlist_add_filled_24dp.xml b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/ic_playlist_add_filled_24dp.xml
new file mode 100644
index 0000000..ac5d3f3
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/ic_playlist_add_filled_24dp.xml
@@ -0,0 +1,9 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="24dp"
+        android:height="24dp"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0">
+    <path
+        android:pathData="M14,10L2,10v2h12v-2zM14,6L2,6v2h12L14,6zM18,14v-4h-2v4h-4v2h4v4h2v-4h4v-2h-4zM2,16h8v-2L2,14v2z"
+        android:fillColor="@color/song_row_favorite_color"/>
+</vector>
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable/ic_playlist_add_white_24dp.xml b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/ic_playlist_add_white_24dp.xml
new file mode 100644
index 0000000..4147e81
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/ic_playlist_add_white_24dp.xml
@@ -0,0 +1,9 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="24dp"
+        android:height="24dp"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0">
+    <path
+        android:pathData="M14,10L2,10v2h12v-2zM14,6L2,6v2h12L14,6zM18,14v-4h-2v4h-4v2h4v4h2v-4h4v-2h-4zM2,16h8v-2L2,14v2z"
+        android:fillColor="#FFFFFF"/>
+</vector>
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable/icon_01.png b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/icon_01.png
new file mode 100644
index 0000000..6fdb583
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/icon_01.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable/icon_02.png b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/icon_02.png
new file mode 100644
index 0000000..8728c6f
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/icon_02.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable/icon_03.png b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/icon_03.png
new file mode 100644
index 0000000..2364de9
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/icon_03.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable/icon_04.png b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/icon_04.png
new file mode 100644
index 0000000..9c4fa52
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/icon_04.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable/icon_05.png b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/icon_05.png
new file mode 100644
index 0000000..c56828c
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/icon_05.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable/icon_06.png b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/icon_06.png
new file mode 100644
index 0000000..b9f34f4
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/icon_06.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable/icon_07.png b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/icon_07.png
new file mode 100644
index 0000000..76ea4f6
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/icon_07.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable/icon_08.png b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/icon_08.png
new file mode 100644
index 0000000..4b1ddb9
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/icon_08.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable/icon_focused.xml b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/icon_focused.xml
new file mode 100644
index 0000000..bab1cc6
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/icon_focused.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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="oval">
+    <solid android:color="#4DEEEEEE"></solid>
+    <size
+        android:width="96dp"
+        android:height="96dp"/>
+</shape>
\ No newline at end of file
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable/overlay_black.xml b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/overlay_black.xml
new file mode 100644
index 0000000..9fccc24
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/overlay_black.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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">
+    <solid android:color="#E6000000"></solid>
+</shape>
\ No newline at end of file
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable/song_row_background.xml b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/song_row_background.xml
new file mode 100644
index 0000000..0329874e
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/song_row_background.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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:drawable="@drawable/song_row_background_focused" android:state_focused="true"></item>
+    <item>
+        <color android:color="#384248"></color>
+    </item>
+</selector>
\ No newline at end of file
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable/song_row_background_focused.xml b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/song_row_background_focused.xml
new file mode 100644
index 0000000..152e7e6
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/song_row_background_focused.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2014 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.
+-->
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+    <item>
+        <color android:color="#384248"></color>
+    </item>
+    <item>
+        <color android:color="#1AFFFFFF"></color>
+    </item>
+</layer-list>
\ No newline at end of file
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable/wizard_background_blackned.xml b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/wizard_background_blackned.xml
new file mode 100644
index 0000000..bea8d66
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/wizard_background_blackned.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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.
+-->
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+     <item android:drawable="@drawable/background_canyon"></item>
+     <item android:drawable="@drawable/overlay_black"></item>
+</layer-list>
\ No newline at end of file
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable/wizard_important_action_item_background.xml b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/wizard_important_action_item_background.xml
new file mode 100644
index 0000000..b4fd39e
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/wizard_important_action_item_background.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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:drawable="@drawable/wizard_important_action_item_background_focused" android:state_focused="true"></item>
+    <item android:drawable="@drawable/wizard_important_action_item_background_not_focused"></item>
+</selector>
\ No newline at end of file
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable/wizard_important_action_item_background_focused.xml b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/wizard_important_action_item_background_focused.xml
new file mode 100644
index 0000000..d6a1023
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/wizard_important_action_item_background_focused.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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="#FFFFFF"></solid>
+</shape>
\ No newline at end of file
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable/wizard_important_action_item_background_not_focused.xml b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/wizard_important_action_item_background_not_focused.xml
new file mode 100644
index 0000000..74cccd0
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/wizard_important_action_item_background_not_focused.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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="#B2FFFFFF"></solid>
+</shape>
\ No newline at end of file
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/layout/activity_cards_example.xml b/samples/SupportLeanbackShowcase/app/src/main/res/layout/activity_cards_example.xml
new file mode 100644
index 0000000..45b5505
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/layout/activity_cards_example.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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.
+-->
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent">
+
+    <fragment
+        android:id="@+id/cardsFragment"
+        android:name="android.support.v17.leanback.supportleanbackshowcase.app.cards.CardExampleFragment"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"></fragment>
+</RelativeLayout>
\ No newline at end of file
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/layout/activity_detail_example.xml b/samples/SupportLeanbackShowcase/app/src/main/res/layout/activity_detail_example.xml
new file mode 100644
index 0000000..1dd92d8
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/layout/activity_detail_example.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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.
+-->
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent">
+    <fragment
+        android:id="@+id/detailsFragment"
+        android:name="android.support.v17.leanback.supportleanbackshowcase.app.details.DetailViewExampleFragment"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"></fragment>
+</RelativeLayout>
\ No newline at end of file
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/layout/activity_grid_example.xml b/samples/SupportLeanbackShowcase/app/src/main/res/layout/activity_grid_example.xml
new file mode 100644
index 0000000..f3fcdea
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/layout/activity_grid_example.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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.
+-->
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent">
+
+    <fragment
+        android:id="@+id/cardsFragment"
+        android:name="android.support.v17.leanback.supportleanbackshowcase.app.grid.GridExampleFragment"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"></fragment>
+</RelativeLayout>
\ No newline at end of file
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/layout/activity_main.xml b/samples/SupportLeanbackShowcase/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..9d2eda6
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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.
+-->
+<RelativeLayout
+    android:id="@+id/fragmentContainer"
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:deviceIds="tv"
+    tools:ignore="MergeRootFrame">
+</RelativeLayout>
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/layout/activity_music_example.xml b/samples/SupportLeanbackShowcase/app/src/main/res/layout/activity_music_example.xml
new file mode 100644
index 0000000..9eef61a
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/layout/activity_music_example.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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.
+-->
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent">
+
+    <fragment
+        android:id="@+id/musicFragment"
+        android:name="android.support.v17.leanback.supportleanbackshowcase.app.media.MusicConsumptionExampleFragment"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"></fragment>
+</RelativeLayout>
\ No newline at end of file
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/layout/activity_settings_example.xml b/samples/SupportLeanbackShowcase/app/src/main/res/layout/activity_settings_example.xml
new file mode 100644
index 0000000..c6c81a3
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/layout/activity_settings_example.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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.
+-->
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent">
+    <fragment
+        android:id="@+id/settingsFragment"
+        android:name="android.support.v17.leanback.supportleanbackshowcase.app.settings.SettingsExampleFragment"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"></fragment>
+</RelativeLayout>
\ No newline at end of file
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/layout/activity_video_example.xml b/samples/SupportLeanbackShowcase/app/src/main/res/layout/activity_video_example.xml
new file mode 100644
index 0000000..45b12b5
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/layout/activity_video_example.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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.
+-->
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:id="@+id/videoFragment">
+
+</RelativeLayout>
\ No newline at end of file
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/layout/character_card.xml b/samples/SupportLeanbackShowcase/app/src/main/res/layout/character_card.xml
new file mode 100644
index 0000000..dee09a8
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/layout/character_card.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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.
+-->
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+             xmlns:lb="http://schemas.android.com/apk/res-auto"
+             android:layout_width="match_parent"
+             android:layout_height="match_parent"
+             lb:cardBackground="@null"
+             lb:layout_viewType="main">
+
+    <LinearLayout
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:orientation="vertical">
+
+        <FrameLayout
+            android:id="@+id/container"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:background="@drawable/character_not_focused_padding">
+
+            <ImageView
+                android:id="@+id/main_image"
+                android:layout_width="@dimen/character_image_card_width"
+                android:layout_height="@dimen/character_image_card_height"
+                android:background="@drawable/character_not_focused"
+                android:src="@drawable/face_08"/>
+        </FrameLayout>
+
+        <TextView
+            android:id="@+id/primary_text"
+            style="@style/Widget.Leanback.ImageCardView.TitleStyle"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="7dp"
+            android:fontFamily="sans-serif-condensed"
+            android:gravity="center"/>
+    </LinearLayout>
+</FrameLayout>
\ No newline at end of file
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/layout/custom_titleview.xml b/samples/SupportLeanbackShowcase/app/src/main/res/layout/custom_titleview.xml
new file mode 100644
index 0000000..f3ac0df
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/layout/custom_titleview.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<merge xmlns:android="http://schemas.android.com/apk/res/android"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content">
+
+    <!--<android.support.v17.leanback.widget.SearchOrbView-->
+        <!--android:id="@+id/search_orb"-->
+        <!--android:layout_height="wrap_content"-->
+        <!--android:layout_width="wrap_content"-->
+        <!--android:transitionGroup="true"-->
+        <!--android:layout_gravity="center_vertical|start"-->
+        <!--android:layout_marginStart="56dp" />-->
+
+    <AnalogClock
+            android:id="@+id/clock"
+            android:layout_width="80dp"
+            android:layout_height="80dp"
+            android:padding="6dp"
+            android:layout_alignParentEnd="true"
+            android:layout_centerVertical="true"
+            android:layout_marginEnd="24dp" />
+
+    <ImageView
+            android:id="@+id/title_badge_iv"
+            android:layout_width="wrap_content"
+            android:layout_height="224dp"
+            android:adjustViewBounds="true"
+            android:layout_gravity="center_vertical|end"
+            android:layout_toStartOf="@id/clock"
+            android:src="@null"
+            android:layout_centerVertical="true"
+            android:visibility="gone" />
+
+    <TextView
+            android:id="@+id/title_tv"
+            android:textAppearance="@android:style/TextAppearance.Large"
+            android:visibility="gone"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginEnd="24dp"
+            android:layout_centerVertical="true"
+            android:layout_toStartOf="@id/clock" />
+
+</merge>
\ No newline at end of file
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/layout/detail_view_content.xml b/samples/SupportLeanbackShowcase/app/src/main/res/layout/detail_view_content.xml
new file mode 100644
index 0000000..5140ed7
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/layout/detail_view_content.xml
@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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="match_parent"
+              android:layout_height="match_parent"
+              android:orientation="vertical">
+
+    <TextView
+        android:id="@+id/primary_text"
+        style="@style/Widget.Leanback.DetailsDescriptionTitleStyle"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginBottom="3dp"
+        android:layout_marginTop="15dp"
+        android:fontFamily="sans-serif-light"
+        android:text="Title Text"/>
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginBottom="14dp"
+        android:gravity="center_vertical"
+        android:orientation="horizontal">
+
+        <TextView
+            android:id="@+id/secondary_text_first"
+            style="@style/Widget.Leanback.DetailsDescriptionSubtitleStyle"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginRight="16dp"
+            android:fontFamily="sans-serif-condensed"
+            android:text="Secondary Text Area"/>
+
+        <TextView
+            android:id="@+id/secondary_text_second"
+            style="@style/Widget.Leanback.DetailsDescriptionSubtitleStyle"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginRight="16dp"
+            android:fontFamily="sans-serif-condensed"
+            android:text="With Icons"/>
+
+        <ImageView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginRight="16dp"
+            android:src="@drawable/ic_cc"/>
+
+        <ImageView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:src="@drawable/ic_star_on_yellow"/>
+
+        <ImageView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:src="@drawable/ic_star_on_yellow"/>
+
+        <ImageView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:src="@drawable/ic_star_on_yellow"/>
+
+        <ImageView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:src="@drawable/ic_star_off"/>
+
+        <ImageView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:src="@drawable/ic_star_off"/>
+    </LinearLayout>
+
+    <TextView
+        android:id="@+id/extra_text"
+        style="@style/Widget.Leanback.DetailsDescriptionBodyStyle"
+        android:layout_width="match_parent"
+        android:fontFamily="sans-serif-regular"
+        android:layout_height="wrap_content"
+        android:text="Filmmaker Guillermo del Toro teas up with Legendary Pictures to bring audiences a unique take on the monster film with this sci/fi production."/>
+</LinearLayout>
\ No newline at end of file
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/layout/grid_fragment.xml b/samples/SupportLeanbackShowcase/app/src/main/res/layout/grid_fragment.xml
new file mode 100644
index 0000000..4e67908
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/layout/grid_fragment.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+             android:id="@+id/browse_dummy"
+             android:layout_width="match_parent"
+             android:layout_height="match_parent" >
+
+    <android.support.v17.leanback.widget.BrowseFrameLayout
+            android:id="@+id/grid_frame"
+            android:focusable="true"
+            android:focusableInTouchMode="true"
+            android:descendantFocusability="afterDescendants"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent" >
+
+        <FrameLayout
+                android:id="@+id/browse_grid_dock"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent" />
+
+    </android.support.v17.leanback.widget.BrowseFrameLayout>
+</FrameLayout>
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/layout/page_fragment.xml b/samples/SupportLeanbackShowcase/app/src/main/res/layout/page_fragment.xml
new file mode 100644
index 0000000..3419b66
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/layout/page_fragment.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+                android:id="@+id/container_list"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent">
+
+    <LinearLayout
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:orientation="vertical"
+            android:layout_alignParentRight="true"
+            android:layout_marginRight="128dp"
+            android:layout_centerVertical="true">
+
+        <EditText
+                android:id="@+id/tv1"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="Header 1"
+                android:layout_margin="16dp"
+                android:focusable="true"
+                android:textAppearance="@android:style/TextAppearance.DeviceDefault.Large" />
+
+        <EditText
+                android:id="@+id/tv2"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="Header 2"
+                android:layout_margin="16dp"
+                android:focusable="true"
+                android:textAppearance="@android:style/TextAppearance.DeviceDefault.Medium" />
+
+        <EditText
+                android:id="@+id/tv3"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="Header 3"
+                android:layout_margin="16dp"
+                android:focusable="true"
+                android:textAppearance="@android:style/TextAppearance.DeviceDefault.Small" />
+
+    </LinearLayout>
+</RelativeLayout>
\ No newline at end of file
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/layout/page_list_row.xml b/samples/SupportLeanbackShowcase/app/src/main/res/layout/page_list_row.xml
new file mode 100644
index 0000000..6b3cb6b
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/layout/page_list_row.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+              android:layout_width="match_parent"
+              android:layout_height="match_parent">
+
+    <fragment
+        android:id="@+id/page_list_fragment"
+        android:name="android.support.v17.leanback.supportleanbackshowcase.app.page.PageAndListRowFragment"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent" />
+
+</FrameLayout>
\ No newline at end of file
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/layout/side_info_card.xml b/samples/SupportLeanbackShowcase/app/src/main/res/layout/side_info_card.xml
new file mode 100644
index 0000000..725af09
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/layout/side_info_card.xml
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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"
+    xmlns:lb="http://schemas.android.com/apk/res-auto"
+    android:id="@+id/container"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:orientation="horizontal">
+
+    <ImageView
+        android:id="@+id/main_image"
+        android:layout_width="144dp"
+        android:layout_height="144dp"
+        lb:layout_viewType="main"
+        />
+
+    <LinearLayout
+        android:id="@+id/info"
+        android:layout_width="144dp"
+        android:layout_height="match_parent"
+        android:orientation="vertical"
+        android:paddingLeft="11dp"
+        android:paddingRight="11dp"
+        android:paddingTop="7dp"
+        android:background="@color/default_card_footer_background_color">
+
+        <TextView
+            android:id="@+id/primary_text"
+            style="@style/Widget.Leanback.ImageCardView.TitleStyle"
+            android:fontFamily="sans-serif-condensed"
+            android:maxLines="2"
+            android:textSize="16sp"/>
+
+        <TextView
+            android:id="@+id/secondary_text"
+            style="@style/Widget.Leanback.ImageCardView.ContentStyle"
+            android:layout_marginTop="4dp"
+            android:fontFamily="sans-serif-condensed"
+            android:maxLines="1"
+            android:textColor="#EEEEEE"/>
+
+        <TextView
+            android:id="@+id/extra_text"
+            style="@style/Widget.Leanback.ImageCardView.ContentStyle"
+            android:layout_marginTop="6dp"
+            android:fontFamily="sans-serif-condensed"
+            android:maxLines="5"/>
+    </LinearLayout>
+</LinearLayout>
\ No newline at end of file
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/layout/text_icon_card.xml b/samples/SupportLeanbackShowcase/app/src/main/res/layout/text_icon_card.xml
new file mode 100644
index 0000000..339549a
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/layout/text_icon_card.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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.
+-->
+<merge xmlns:android="http://schemas.android.com/apk/res/android"
+       xmlns:lb="http://schemas.android.com/apk/res-auto"
+       android:layout_width="wrap_content"
+       android:layout_height="wrap_content">
+
+    <TextView
+        android:id="@+id/extra_text"
+        style="@style/Widget.Leanback.ImageCardView.ContentStyle"
+        android:layout_width="256dp"
+        android:layout_height="wrap_content"
+        android:background="@color/default_card_background_color"
+        android:fontFamily="sans-serif-condensed"
+        android:lines="7"
+        android:maxLines="7"
+        android:paddingBottom="14dp"
+        android:paddingLeft="15dp"
+        android:paddingRight="15dp"
+        android:paddingTop="12dp"
+        lb:layout_viewType="main"/>
+
+    <android.support.v17.leanback.widget.NonOverlappingRelativeLayout
+        android:layout_width="256dp"
+        android:layout_height="36dp"
+        android:background="@color/default_card_footer_background_color"
+        android:gravity="left"
+        android:orientation="horizontal"
+        android:paddingBottom="7dp"
+        android:paddingLeft="12dp"
+        android:paddingRight="12dp"
+        android:paddingTop="7dp">
+
+        <ImageView
+            android:id="@+id/main_image"
+            android:layout_width="36dp"
+            android:layout_height="36dp"
+            android:layout_centerVertical="true"
+            android:layout_gravity="center_vertical"
+            android:layout_marginRight="8dp"
+            android:adjustViewBounds="true"/>
+
+        <TextView
+            android:id="@+id/primary_text"
+            style="@style/Widget.Leanback.ImageCardView.TitleStyle"
+            android:layout_width="match_parent"
+            android:layout_centerVertical="true"
+            android:layout_gravity="left"
+            android:layout_toRightOf="@+id/main_image"
+            android:fontFamily="sans-serif-condensed"
+            android:maxLines="1"
+            />
+
+        <ImageView
+            android:id="@+id/footer_icon"
+            android:layout_width="wrap_content"
+            android:layout_height="32dp"
+            android:layout_alignParentEnd="true"
+            android:layout_centerVertical="true"
+            android:layout_gravity="center_vertical"
+            android:adjustViewBounds="true"
+            android:src="@drawable/stars_white"/>
+
+    </android.support.v17.leanback.widget.NonOverlappingRelativeLayout>
+</merge>
\ No newline at end of file
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/layout/titleview.xml b/samples/SupportLeanbackShowcase/app/src/main/res/layout/titleview.xml
new file mode 100644
index 0000000..a5de787
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/layout/titleview.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<android.support.v17.leanback.supportleanbackshowcase.app.page.CustomTitleView
+        xmlns:android="http://schemas.android.com/apk/res/android"
+        android:id="@+id/browse_title_group"
+        android:padding="16dp"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content" />
\ No newline at end of file
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/layout/video_surface_fragment.xml b/samples/SupportLeanbackShowcase/app/src/main/res/layout/video_surface_fragment.xml
new file mode 100644
index 0000000..ff5be69
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/layout/video_surface_fragment.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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.
+-->
+<SurfaceView xmlns:android="http://schemas.android.com/apk/res/android"
+           android:layout_width="match_parent"
+           android:layout_height="match_parent">
+</SurfaceView>
\ No newline at end of file
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/layout/wizard_progress_action_item.xml b/samples/SupportLeanbackShowcase/app/src/main/res/layout/wizard_progress_action_item.xml
new file mode 100644
index 0000000..9051f38
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/layout/wizard_progress_action_item.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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.
+-->
+<android.support.v17.leanback.widget.NonOverlappingLinearLayout
+    style="?attr/guidedActionItemContainerStyle"
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <ProgressBar
+        android:id="@+id/progressBar"
+        style="?android:attr/progressBarStyle"
+        android:indeterminateTintMode="src_in"
+        android:indeterminateTint="#FFAB91"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginRight="10dp"
+        android:indeterminate="false"/>
+
+    <android.support.v17.leanback.widget.NonOverlappingLinearLayout
+        android:id="@+id/guidedactions_item_content"
+        style="?attr/guidedActionItemContentStyle"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content">
+
+        <TextView
+            android:id="@+id/guidedactions_item_title"
+            style="?attr/guidedActionItemTitleStyle"
+            android:text="Processing..."
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content" />
+
+    </android.support.v17.leanback.widget.NonOverlappingLinearLayout>
+
+</android.support.v17.leanback.widget.NonOverlappingLinearLayout>
\ No newline at end of file
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/mipmap-hdpi/ic_launcher.png b/samples/SupportLeanbackShowcase/app/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000..cde69bc
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/mipmap-hdpi/ic_launcher.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/mipmap-mdpi/ic_launcher.png b/samples/SupportLeanbackShowcase/app/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000..c133a0c
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/mipmap-mdpi/ic_launcher.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/mipmap-xhdpi/app_banner_sample_app.png b/samples/SupportLeanbackShowcase/app/src/main/res/mipmap-xhdpi/app_banner_sample_app.png
new file mode 100644
index 0000000..222c1e5
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/mipmap-xhdpi/app_banner_sample_app.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/samples/SupportLeanbackShowcase/app/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..bfa42f0
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/mipmap-xhdpi/ic_launcher.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/samples/SupportLeanbackShowcase/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000..324e72c
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/raw/cards_example.json b/samples/SupportLeanbackShowcase/app/src/main/res/raw/cards_example.json
new file mode 100644
index 0000000..4fc4672
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/raw/cards_example.json
@@ -0,0 +1,517 @@
+[
+  {
+    "type" : 1,
+    "title": "ImageCardView Examples"
+  },
+  {
+    "title": "One Line Title",
+    "cards": [
+      {
+        "type": "MOVIE",
+        "title": "Deep Into The Deep Sleep",
+        "description": "$3.99",
+        "localImageResource": "card_image_movie_01"
+      },
+      {
+        "type": "MOVIE",
+        "title": "We",
+        "description": "$3.99",
+        "localImageResource": "card_image_movie_02"
+      },
+      {
+        "type": "MOVIE",
+        "title": "The Fairy Story Of A Legend",
+        "description": "$3.99",
+        "localImageResource": "card_image_movie_03"
+      },
+      {
+        "type": "MOVIE",
+        "title": "Cursed",
+        "description": "$3.99",
+        "localImageResource": "card_image_movie_04"
+      },
+      {
+        "type": "MOVIE",
+        "title": "My Crazy One",
+        "description": "$3.99",
+        "localImageResource": "card_image_movie_05"
+      },
+      {
+        "type": "MOVIE",
+        "title": "Gone",
+        "description": "$3.99",
+        "localImageResource": "card_image_movie_06"
+      },
+      {
+        "type": "MOVIE",
+        "title": "A Cold Night To Stay",
+        "description": "$3.99",
+        "localImageResource": "card_image_movie_07"
+      },
+      {
+        "type": "MOVIE",
+        "title": "The Silence",
+        "description": "$3.99",
+        "localImageResource": "card_image_movie_08"
+      },
+      {
+        "type": "MOVIE",
+        "title": "Hear The Roar",
+        "description": "$3.99",
+        "localImageResource": "card_image_movie_09"
+      }
+    ]
+  },
+  {
+    "title": "Two Line Title + Icon",
+    "cards": [
+      {
+        "type": "MOVIE_BASE",
+        "title": "Deep Into The Deep Sleep",
+        "localImageResource": "card_image_movie_01"
+      },
+      {
+        "type": "MOVIE_BASE",
+        "title": "We",
+        "localImageResource": "card_image_movie_02"
+      },
+      {
+        "type": "MOVIE_BASE",
+        "title": "The Fairy Story Of A Legend",
+        "localImageResource": "card_image_movie_03"
+      },
+      {
+        "type": "MOVIE_BASE",
+        "title": "Cursed",
+        "localImageResource": "card_image_movie_04"
+      },
+      {
+        "type": "MOVIE_BASE",
+        "title": "My Crazy One",
+        "localImageResource": "card_image_movie_05"
+      },
+      {
+        "type": "MOVIE_BASE",
+        "title": "Gone",
+        "localImageResource": "card_image_movie_06"
+      },
+      {
+        "type": "MOVIE_BASE",
+        "title": "A Cold Night To Stay",
+        "localImageResource": "card_image_movie_07"
+      },
+      {
+        "type": "MOVIE_BASE",
+        "title": "The Silence",
+        "localImageResource": "card_image_movie_08"
+      },
+      {
+        "type": "MOVIE_BASE",
+        "title": "Hear The Roar",
+        "localImageResource": "card_image_movie_09"
+      }
+    ]
+  },
+  {
+    "title": "Two Line Title + Description + Icon",
+    "cards": [
+      {
+        "type": "MOVIE_COMPLETE",
+        "description": "$3.99",
+        "title": "Deep Into The Deep Sleep",
+        "footerIconLocalImageResource": "stars_red",
+        "localImageResource": "card_image_movie_01"
+      },
+      {
+        "type": "MOVIE_COMPLETE",
+        "title": "We",
+        "description": "$3.99",
+        "footerIconLocalImageResource": "stars_red",
+        "localImageResource": "card_image_movie_02"
+      },
+      {
+        "type": "MOVIE_COMPLETE",
+        "title": "The Fairy",
+        "description": "$3.99",
+        "footerIconLocalImageResource": "stars_red",
+        "localImageResource": "card_image_movie_03"
+      },
+      {
+        "type": "MOVIE_COMPLETE",
+        "title": "Cursed",
+        "description": "$3.99",
+        "footerIconLocalImageResource": "stars_red",
+        "localImageResource": "card_image_movie_04"
+      },
+      {
+        "type": "MOVIE_COMPLETE",
+        "title": "My Crazy One",
+        "description": "$3.99",
+        "footerIconLocalImageResource": "stars_red",
+        "localImageResource": "card_image_movie_05"
+      },
+      {
+        "type": "MOVIE_COMPLETE",
+        "title": "Gone",
+        "description": "$3.99",
+        "footerIconLocalImageResource": "stars_red",
+        "localImageResource": "card_image_movie_06"
+      },
+      {
+        "type": "MOVIE_COMPLETE",
+        "title": "A Cold Night To Stay",
+        "description": "$3.99",
+        "footerIconLocalImageResource": "stars_red",
+        "localImageResource": "card_image_movie_07"
+      },
+      {
+        "type": "MOVIE_COMPLETE",
+        "description": "$3.99",
+        "title": "The Silence",
+        "footerIconLocalImageResource": "stars_red",
+        "localImageResource": "card_image_movie_08"
+      },
+      {
+        "type": "MOVIE_COMPLETE",
+        "title": "Hear The Roar",
+        "description": "$3.99",
+        "footerIconLocalImageResource": "stars_red",
+        "localImageResource": "card_image_movie_09"
+      }
+    ]
+  },
+  {
+    "title": "Title + Description",
+    "cards": [
+      {
+        "type": "SQUARE_BIG",
+        "title": "Blue in Green",
+        "description": "Miles Davis",
+        "footerColor": "#bf360C",
+        "localImageResource": "card_image_music_02"
+      },
+      {
+        "type": "SQUARE_BIG",
+        "title": "Blue in Green",
+        "description": "Miles Davis",
+        "footerColor": "#b93221",
+        "localImageResource": "card_image_music_03"
+      },
+      {
+        "type": "SQUARE_BIG",
+        "title": "Blue in Green",
+        "description": "Miles Davis",
+        "footerColor": "#311b92",
+        "localImageResource": "card_image_music_04"
+      },
+      {
+        "type": "SQUARE_BIG",
+        "title": "Blue in Green",
+        "description": "Miles Davis",
+        "footerColor": "#33691e",
+        "localImageResource": "card_image_music_05"
+      },
+      {
+        "type": "SQUARE_BIG",
+        "title": "Blue in Green",
+        "description": "Miles Davis",
+        "footerColor": "#37474f",
+        "localImageResource": "card_image_music_06"
+      },
+      {
+        "type": "SQUARE_BIG",
+        "title": "Blue in Green",
+        "description": "Miles Davis",
+        "footerColor": "#3e2723",
+        "localImageResource": "card_image_music_08"
+      },
+      {
+        "type": "SQUARE_BIG",
+        "title": "Blue in Green",
+        "description": "Miles Davis",
+        "footerColor": "#01579B",
+        "localImageResource": "card_image_music_09"
+      }
+    ]
+  },
+  {
+    "title": "Title + Description + Icon",
+    "cards": [
+      {
+        "type": "GAME",
+        "title": "Crazy One",
+        "description": "Purchased",
+        "localImageResource": "game_crazy_one",
+        "footerIconLocalImageResource": "ic_installed"
+      },
+      {
+        "type": "GAME",
+        "title": "Cursed",
+        "description": "Purchased",
+        "localImageResource": "game_cursed",
+        "footerIconLocalImageResource": "ic_installed"
+      },
+      {
+        "type": "GAME",
+        "title": "fairy",
+        "description": "Purchased",
+        "localImageResource": "game_fairy",
+        "footerIconLocalImageResource": "ic_installed"
+      },
+      {
+        "type": "GAME",
+        "title": "Hear The Roar",
+        "description": "Purchased",
+        "localImageResource": "game_hear_the_roar",
+        "footerIconLocalImageResource": "ic_installed"
+      },
+      {
+        "type": "GAME",
+        "title": "Silence",
+        "description": "Purchased",
+        "localImageResource": "game_silence",
+        "footerIconLocalImageResource": "ic_installed"
+      }
+    ]
+  },
+  {
+    "title": "Title + Description (Wide)",
+    "cards": [
+      {
+        "type": "DEFAULT",
+        "title": "Marseille sea food tour",
+        "description": "9,089 views   3 years ago   by ADELAIDE",
+        "localImageResource": "coffee_and_tea_01"
+      },
+      {
+        "type": "DEFAULT",
+        "title": "Marseille sea food tour",
+        "description": "9,089 views   3 years ago   by ADELAIDE",
+        "localImageResource": "coffee_and_tea_02"
+      },
+      {
+        "type": "DEFAULT",
+        "title": "Marseille sea food tour",
+        "description": "9,089 views   3 years ago   by ADELAIDE",
+        "localImageResource": "coffee_and_tea_03"
+      },
+      {
+        "type": "DEFAULT",
+        "title": "Marseille sea food tour",
+        "description": "9,089 views   3 years ago   by ADELAIDE",
+        "localImageResource": "coffee_and_tea_04"
+      },
+      {
+        "type": "DEFAULT",
+        "title": "Marseille sea food tour",
+        "description": "9,089 views   3 years ago   by ADELAIDE",
+        "localImageResource": "coffee_and_tea_05"
+      },
+      {
+        "type": "DEFAULT",
+        "title": "Marseille sea food tour",
+        "description": "9,089 views   3 years ago   by ADELAIDE",
+        "localImageResource": "coffee_and_tea_06"
+      },
+      {
+        "type": "DEFAULT",
+        "title": "Marseille sea food tour",
+        "description": "9,089 views   3 years ago   by ADELAIDE",
+        "localImageResource": "coffee_and_tea_07"
+      },
+      {
+        "type": "DEFAULT",
+        "title": "Marseille sea food tour",
+        "description": "9,089 views   3 years ago   by ADELAIDE",
+        "localImageResource": "coffee_and_tea_08"
+      }
+    ]
+  },
+  {
+    "type" : 2
+  },
+  {
+    "type" : 1,
+    "title": "Advanced Examples"
+  },
+  {
+    "title": "BaseCardView Info On The Right",
+    "cards": [
+      {
+        "type": "SIDE_INFO",
+        "title": "The Life Aquatic",
+        "description": "Seu Jorge",
+        "extraText": "Bacon ipsum dolor amet bresaola kevin tenderloin swine shoulder strip steak t-bone picanha turducken beef. Ribeye turkey t-bone pastrami meatball corned beef. Pork belly landjaeger short ribs ground round cupim, brisket ham tri-tip. Pig pork loin hamburger picanha ribeye, pork belly meatball chicken ham boudin sirloin corned beef frankfurter ham hock.",
+        "localImageResource": "card_image_music_02"
+      },
+      {
+        "type": "SIDE_INFO",
+        "title": "The Life Aquatic",
+        "description": "Seu Jorge",
+        "extraText": "Bacon ipsum dolor amet bresaola kevin tenderloin swine shoulder strip steak t-bone picanha turducken beef. Ribeye turkey t-bone pastrami meatball corned beef. Pork belly landjaeger short ribs ground round cupim, brisket ham tri-tip. Pig pork loin hamburger picanha ribeye, pork belly meatball chicken ham boudin sirloin corned beef frankfurter ham hock.",
+        "localImageResource": "card_image_music_03"
+      },
+      {
+        "type": "SIDE_INFO",
+        "title": "The Life Aquatic",
+        "description": "Seu Jorge",
+        "extraText": "Bacon ipsum dolor amet bresaola kevin tenderloin swine shoulder strip steak t-bone picanha turducken beef. Ribeye turkey t-bone pastrami meatball corned beef. Pork belly landjaeger short ribs ground round cupim, brisket ham tri-tip. Pig pork loin hamburger picanha ribeye, pork belly meatball chicken ham boudin sirloin corned beef frankfurter ham hock.",
+        "localImageResource": "card_image_music_04"
+      },
+      {
+        "type": "SIDE_INFO",
+        "title": "The Life Aquatic",
+        "description": "Seu Jorge",
+        "extraText": "Bacon ipsum dolor amet bresaola kevin tenderloin swine shoulder strip steak t-bone picanha turducken beef. Ribeye turkey t-bone pastrami meatball corned beef. Pork belly landjaeger short ribs ground round cupim, brisket ham tri-tip. Pig pork loin hamburger picanha ribeye, pork belly meatball chicken ham boudin sirloin corned beef frankfurter ham hock.",
+        "localImageResource": "card_image_music_05"
+      },
+      {
+        "type": "SIDE_INFO",
+        "title": "The Life Aquatic",
+        "description": "Seu Jorge",
+        "extraText": "Bacon ipsum dolor amet bresaola kevin tenderloin swine shoulder strip steak t-bone picanha turducken beef. Ribeye turkey t-bone pastrami meatball corned beef. Pork belly landjaeger short ribs ground round cupim, brisket ham tri-tip. Pig pork loin hamburger picanha ribeye, pork belly meatball chicken ham boudin sirloin corned beef frankfurter ham hock.",
+        "localImageResource": "card_image_music_06"
+      },
+      {
+        "type": "SIDE_INFO",
+        "title": "The Life Aquatic",
+        "description": "Seu Jorge",
+        "extraText": "Bacon ipsum dolor amet bresaola kevin tenderloin swine shoulder strip steak t-bone picanha turducken beef. Ribeye turkey t-bone pastrami meatball corned beef. Pork belly landjaeger short ribs ground round cupim, brisket ham tri-tip. Pig pork loin hamburger picanha ribeye, pork belly meatball chicken ham boudin sirloin corned beef frankfurter ham hock.",
+        "localImageResource": "card_image_music_07"
+      },
+      {
+        "type": "SIDE_INFO",
+        "title": "The Life Aquatic",
+        "description": "Seu Jorge",
+        "extraText": "Bacon ipsum dolor amet bresaola kevin tenderloin swine shoulder strip steak t-bone picanha turducken beef. Ribeye turkey t-bone pastrami meatball corned beef. Pork belly landjaeger short ribs ground round cupim, brisket ham tri-tip. Pig pork loin hamburger picanha ribeye, pork belly meatball chicken ham boudin sirloin corned beef frankfurter ham hock.",
+        "localImageResource": "card_image_music_08"
+      }
+    ]
+  },
+  {
+    "title": "BaseCardView using TextView",
+    "cards": [
+      {
+        "type": "TEXT",
+        "title": "Jonathan Max",
+        "extraText": "Bacon ipsum dolor amet bresaola kevin tenderloin swine shoulder strip steak t-bone picanha turducken beef. Ribeye turkey t-bone pastrami meatball corned beef. Pork belly landjaeger short ribs ground round cupim, brisket ham tri-tip. Pig pork loin hamburger picanha ribeye, pork belly meatball chicken ham boudin sirloin corned beef frankfurter ham hock.",
+        "localImageResource": "face_01"
+      },
+      {
+        "type": "TEXT",
+        "title": "Jonathan Max",
+        "extraText": "Bacon ipsum dolor amet bresaola kevin tenderloin swine shoulder strip steak t-bone picanha turducken beef. Ribeye turkey t-bone pastrami meatball corned beef. Pork belly landjaeger short ribs ground round cupim, brisket ham tri-tip. Pig pork loin hamburger picanha ribeye, pork belly meatball chicken ham boudin sirloin corned beef frankfurter ham hock.",
+        "localImageResource": "face_02"
+      },
+      {
+        "type": "TEXT",
+        "title": "Jonathan Max",
+        "extraText": "Bacon ipsum dolor amet bresaola kevin tenderloin swine shoulder strip steak t-bone picanha turducken beef. Ribeye turkey t-bone pastrami meatball corned beef. Pork belly landjaeger short ribs ground round cupim, brisket ham tri-tip. Pig pork loin hamburger picanha ribeye, pork belly meatball chicken ham boudin sirloin corned beef frankfurter ham hock.",
+        "localImageResource": "face_03"
+      },
+      {
+        "type": "TEXT",
+        "title": "Jonathan Max",
+        "extraText": "Bacon ipsum dolor amet bresaola kevin tenderloin swine shoulder strip steak t-bone picanha turducken beef. Ribeye turkey t-bone pastrami meatball corned beef. Pork belly landjaeger short ribs ground round cupim, brisket ham tri-tip. Pig pork loin hamburger picanha ribeye, pork belly meatball chicken ham boudin sirloin corned beef frankfurter ham hock.",
+        "localImageResource": "face_04"
+      },
+      {
+        "type": "TEXT",
+        "title": "Jonathan Max",
+        "extraText": "Bacon ipsum dolor amet bresaola kevin tenderloin swine shoulder strip steak t-bone picanha turducken beef. Ribeye turkey t-bone pastrami meatball corned beef. Pork belly landjaeger short ribs ground round cupim, brisket ham tri-tip. Pig pork loin hamburger picanha ribeye, pork belly meatball chicken ham boudin sirloin corned beef frankfurter ham hock.",
+        "localImageResource": "face_05"
+      },
+      {
+        "type": "TEXT",
+        "title": "Jonathan Max",
+        "extraText": "Bacon ipsum dolor amet bresaola kevin tenderloin swine shoulder strip steak t-bone picanha turducken beef. Ribeye turkey t-bone pastrami meatball corned beef. Pork belly landjaeger short ribs ground round cupim, brisket ham tri-tip. Pig pork loin hamburger picanha ribeye, pork belly meatball chicken ham boudin sirloin corned beef frankfurter ham hock.",
+        "localImageResource": "face_06"
+      },
+      {
+        "type": "TEXT",
+        "title": "Jonathan Max",
+        "extraText": "Bacon ipsum dolor amet bresaola kevin tenderloin swine shoulder strip steak t-bone picanha turducken beef. Ribeye turkey t-bone pastrami meatball corned beef. Pork belly landjaeger short ribs ground round cupim, brisket ham tri-tip. Pig pork loin hamburger picanha ribeye, pork belly meatball chicken ham boudin sirloin corned beef frankfurter ham hock.",
+        "localImageResource": "face_07"
+      },
+      {
+        "type": "TEXT",
+        "title": "Jonathan Max",
+        "extraText": "Bacon ipsum dolor amet bresaola kevin tenderloin swine shoulder strip steak t-bone picanha turducken beef. Ribeye turkey t-bone pastrami meatball corned beef. Pork belly landjaeger short ribs ground round cupim, brisket ham tri-tip. Pig pork loin hamburger picanha ribeye, pork belly meatball chicken ham boudin sirloin corned beef frankfurter ham hock.",
+        "localImageResource": "face_08"
+      }
+    ]
+  },
+  {
+    "title": "ImageCardView Customize Style",
+    "cards": [
+      {
+        "type": "SINGLE_LINE",
+        "title": "Action & Adventure",
+        "footerColor": "#dd004e",
+        "localImageResource": "category_action"
+      },
+      {
+        "type": "SINGLE_LINE",
+        "title": "Animation",
+        "footerColor": "#c51162",
+        "localImageResource": "category_animation"
+      },
+      {
+        "type": "SINGLE_LINE",
+        "title": "Classics",
+        "footerColor": "#9c27b0",
+        "localImageResource": "category_classics"
+      },
+      {
+        "type": "SINGLE_LINE",
+        "title": "Comedy",
+        "footerColor": "#cf4900",
+        "localImageResource": "category_comedy"
+      },
+      {
+        "type": "SINGLE_LINE",
+        "title": "Crime",
+        "footerColor": "#3f51b5",
+        "localImageResource": "category_crime"
+      },
+      {
+        "type": "SINGLE_LINE",
+        "title": "Documentary",
+        "footerColor": "#02639b",
+        "localImageResource": "category_documentary"
+      },
+      {
+        "type": "SINGLE_LINE",
+        "title": "Drama",
+        "footerColor": "#2a56c6",
+        "localImageResource": "category_drama"
+      }
+    ]
+  },
+  {
+    "title": "ImageCardView with onFocusChange listener",
+    "shadow": false,
+    "cards": [
+      {
+        "type": "ICON",
+        "title": "Settings",
+        "localImageResource": "ic_settings_settings"
+      },
+      {
+        "type": "ICON",
+        "title": "WiFi",
+        "localImageResource": "ic_settings_wifi_3_bar"
+      },
+      {
+        "type": "ICON",
+        "title": "Parental Control",
+        "localImageResource": "ic_settings_parental_control"
+      },
+      {
+        "type": "ICON",
+        "title": "Time",
+        "localImageResource": "ic_settings_time"
+      }
+    ]
+  }
+]
\ No newline at end of file
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/raw/detail_example.json b/samples/SupportLeanbackShowcase/app/src/main/res/raw/detail_example.json
new file mode 100644
index 0000000..b6d06e2
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/raw/detail_example.json
@@ -0,0 +1,106 @@
+{
+  "title": "A Summer in a Canyon",
+  "description": "Kate Douglas Smith Wiggin",
+  "year": 1914,
+  "text": "It was nine o’clock one sunny California morning, and Geoffrey Strong stood under the live-oak trees in Las Flores Cañon, with a pot of black paint in one hand and a huge brush in the other.  He could have handled these implements to better purpose and with better grace had not his arms been firmly held by three laughing girls, who pulled not wisely, but too well.  He was further incommoded by the presence of a small urchin who lay on the dusty ground beneath his feet, fastening an upward clutch on the legs of his trousers.\n\nThere were three large canvas tents directly in front of them, yet no one of these seemed to be the object of dissension, but rather a redwood board, some three feet in length, which was nailed on a tree near by. twitch of her cousin’s sleeve.",
+  "localImageResource": "movie_poster_01",
+  "price": "$9.99",
+  "characters": [
+    {
+      "type": "CHARACTER",
+      "title": "Leonardo Di Caprio",
+      "localImageResource": "face_01"
+    },
+    {
+      "type": "CHARACTER",
+      "title": "Gerald Butler",
+      "localImageResource": "face_08"
+    },
+    {
+      "type": "CHARACTER",
+      "title": "Russle Crow",
+      "localImageResource": "face_02"
+    },
+    {
+      "type": "CHARACTER",
+      "title": "Emma Stone",
+      "localImageResource": "face_03"
+    },
+    {
+      "type": "CHARACTER",
+      "title": "Natalie Portman",
+      "localImageResource": "face_04"
+    },
+    {
+      "type": "CHARACTER",
+      "title": "Jack Gyllanhall",
+      "localImageResource": "face_05"
+    },
+    {
+      "type": "CHARACTER",
+      "title": "Ryan Gossling",
+      "localImageResource": "face_06"
+    },
+    {
+      "type": "CHARACTER",
+      "title": "Olivia Wilde",
+      "localImageResource": "face_07"
+    }
+  ],
+  "recommended": [
+    {
+      "type": "MOVIE",
+      "title": "The Amazing Spuder-Man",
+      "description": "$3.99",
+      "localImageResource": "card_image_movie_01"
+    },
+    {
+      "type": "MOVIE",
+      "title": "American Psycho",
+      "description": "$3.99",
+      "localImageResource": "card_image_movie_02"
+    },
+    {
+      "type": "MOVIE",
+      "title": "Big Hero 6",
+      "description": "$3.99",
+      "localImageResource": "card_image_movie_03"
+    },
+    {
+      "type": "MOVIE",
+      "title": "Edge of Tomorrow",
+      "description": "$3.99",
+      "localImageResource": "card_image_movie_04"
+    },
+    {
+      "type": "MOVIE",
+      "title": "The Hobbit: The Desolation of Smaug",
+      "description": "$3.99",
+      "localImageResource": "card_image_movie_05"
+    },
+    {
+      "type": "MOVIE",
+      "title": "Interstellar",
+      "description": "$3.99",
+      "localImageResource": "card_image_movie_06"
+    },
+    {
+      "type": "MOVIE",
+      "title": "Jurassic Park",
+      "description": "$3.99",
+      "localImageResource": "card_image_movie_07"
+    },
+    {
+      "type": "MOVIE",
+      "title": "The Hunger Games: Mockingjay Part I",
+      "description": "$3.99",
+      "localImageResource": "card_image_movie_08"
+    },
+    {
+      "type": "MOVIE",
+      "title": "Planes",
+      "description": "$3.99",
+      "localImageResource": "card_image_movie_09"
+    }
+  ]
+}
\ No newline at end of file
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/raw/grid_example.json b/samples/SupportLeanbackShowcase/app/src/main/res/raw/grid_example.json
new file mode 100644
index 0000000..56da5db
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/raw/grid_example.json
@@ -0,0 +1,88 @@
+{
+  "cards": [
+    {
+      "type": "GRID_SQUARE",
+      "title": "Nüsse",
+      "description": "$3.99/lb",
+      "localImageResource": "food_01"
+    },
+    {
+      "type": "GRID_SQUARE",
+      "title": "Undefinierbar",
+      "description": "$3.99/lb",
+      "localImageResource": "food_02"
+    },
+    {
+      "type": "GRID_SQUARE",
+      "title": "Brocoli",
+      "description": "$3.99/lb",
+      "localImageResource": "food_03"
+    },
+    {
+      "type": "GRID_SQUARE",
+      "title": "Salat",
+      "description": "$3.99/lb",
+      "localImageResource": "food_04"
+    },
+    {
+      "type": "GRID_SQUARE",
+      "title": "Große Radischen",
+      "description": "$3.99/lb",
+      "localImageResource": "food_05"
+    },
+    {
+      "type": "GRID_SQUARE",
+      "title": "Rote Zwiebeln",
+      "description": "$3.99/lb",
+      "localImageResource": "food_06"
+    },
+    {
+      "type": "GRID_SQUARE",
+      "title": "Lauch",
+      "description": "$3.99/lb",
+      "localImageResource": "food_07"
+    },
+    {
+      "type": "GRID_SQUARE",
+      "title": "Exotisches Zeugs",
+      "description": "$3.99/lb",
+      "localImageResource": "food_08"
+    },
+    {
+      "type": "GRID_SQUARE",
+      "title": "Zitronen",
+      "description": "$3.99/lb",
+      "localImageResource": "food_09"
+    },
+    {
+      "type": "GRID_SQUARE",
+      "title": "Meerirgendwas",
+      "description": "$3.99/lb",
+      "localImageResource": "food_10"
+    },
+    {
+      "type": "GRID_SQUARE",
+      "title": "Irgendein Kohl",
+      "description": "$3.99/lb",
+      "localImageResource": "food_11"
+    },
+    {
+      "type": "GRID_SQUARE",
+      "title": "Apfel",
+      "description": "$3.99/lb",
+      "localImageResource": "food_12"
+    },
+    {
+      "type": "GRID_SQUARE",
+      "title": "Mehr Äpfel",
+      "description": "$3.99/lb",
+      "localImageResource": "food_13"
+    },
+    {
+      "type": "GRID_SQUARE",
+      "title": "Tomaten",
+      "description": "$3.99/lb",
+      "localImageResource": "food_14"
+    }
+  ]
+}
\ No newline at end of file
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/raw/icon_example.json b/samples/SupportLeanbackShowcase/app/src/main/res/raw/icon_example.json
new file mode 100644
index 0000000..2fdfef5
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/raw/icon_example.json
@@ -0,0 +1,65 @@
+{
+  "title": "Icon",
+  "cards": [
+      {
+        "type": "ICON",
+        "title": "Settings",
+        "localImageResource": "ic_settings_settings"
+      },
+      {
+        "type": "ICON",
+        "title": "WiFi",
+        "localImageResource": "ic_settings_wifi_3_bar"
+      },
+      {
+        "type": "ICON",
+        "title": "Parental Control",
+        "localImageResource": "ic_settings_parental_control"
+      },
+      {
+        "type": "ICON",
+        "title": "Time",
+        "localImageResource": "ic_settings_time"
+      },
+      {
+        "type": "ICON",
+        "title": "Input connection",
+        "localImageResource": "icon_01"
+      },
+      {
+        "type": "ICON",
+        "title": "Hdmi",
+        "localImageResource": "icon_02"
+      },
+      {
+        "type": "ICON",
+        "title": "Overscan",
+        "localImageResource": "icon_03"
+      },
+      {
+        "type": "ICON",
+        "title": "Remote",
+        "localImageResource": "icon_04"
+      },
+      {
+        "type": "ICON",
+        "title": "Ethernet",
+        "localImageResource": "icon_05"
+      },
+      {
+        "type": "ICON",
+        "title": "Voice",
+        "localImageResource": "icon_06"
+      },
+      {
+        "type": "ICON",
+        "title": "Brightness",
+        "localImageResource": "icon_07"
+      },
+      {
+        "type": "ICON",
+        "title": "Antenna",
+        "localImageResource": "icon_08"
+      }
+    ]
+}
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/raw/launcher_cards.json b/samples/SupportLeanbackShowcase/app/src/main/res/raw/launcher_cards.json
new file mode 100644
index 0000000..7508d97
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/raw/launcher_cards.json
@@ -0,0 +1,70 @@
+[
+  {
+    "title": "",
+    "cards": [
+      {
+        "id": 0,
+        "type": "DEFAULT",
+        "title": "Card Examples",
+        "localImageResource": "thumbnail_example_cards",
+        "description": "Showcase of various card design and layouts"
+      },
+      {
+        "id": 1,
+        "type": "DEFAULT",
+        "title": "Page/Row fragment Examples",
+        "localImageResource": "thumbnail_example_browse",
+        "description": "Showcase usage of page/rows fragment"
+      },
+      {
+        "id": 2,
+        "type": "DEFAULT",
+        "title": "Grid Examples",
+        "localImageResource": "thumbnail_example_grid",
+        "description": "Showcase of various card design and layouts"
+      },
+      {
+        "id": 3,
+        "type": "DEFAULT",
+        "title": "Detail Examples",
+        "localImageResource": "thumbnail_example_detail",
+        "description": "Showcase of various card design and layouts"
+      },
+      {
+        "id": 4,
+        "type": "DEFAULT",
+        "title": "Video consumption Examples",
+        "localImageResource": "thumbnail_example_video_consumption",
+        "description": "Showcase of various card design and layouts"
+      },
+      {
+        "id": 5,
+        "type": "DEFAULT",
+        "title": "Music consumption Examples",
+        "localImageResource": "thumbnail_example_music_consumption",
+        "description": "Showcase of various card design and layouts"
+      },
+      {
+        "id": 6,
+        "type": "DEFAULT",
+        "title": "Wizard Examples",
+        "localImageResource": "thumbnail_example_wizard",
+        "description": "Showcase of various card design and layouts"
+      },
+      {
+        "id": 7,
+        "type": "DEFAULT",
+        "title": "Settings Examples",
+        "localImageResource": "thumbnail_example_settings",
+        "description": "Showcase of various card design and layouts"
+      },
+      {
+        "id": 8,
+        "type": "DEFAULT",
+        "title": "Dialog Examples",
+        "localImageResource": "thumbnail_example_dialog",
+        "description": "Showcase of various card design and layouts"
+      }
+    ]
+  }
+]
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/raw/music_consumption_example.json b/samples/SupportLeanbackShowcase/app/src/main/res/raw/music_consumption_example.json
new file mode 100644
index 0000000..23eb239
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/raw/music_consumption_example.json
@@ -0,0 +1,76 @@
+{
+  "songs": [
+    {
+      "number": 1,
+      "duration": "1:38",
+      "title": "Thump and Jump",
+      "description": "Jimmy Fontanez/Media Right Production",
+      "image": "card_image_music_01",
+      "file": "track_01"
+    },
+    {
+      "number": 2,
+      "duration": "1:42",
+      "title": "Give",
+      "description": "Silent Partner",
+      "image": "card_image_music_02",
+      "file": "track_02"
+    },
+    {
+      "number": 3,
+      "duration": "1:21",
+      "title": "Dusty Road",
+      "description": "Jingle Punks",
+      "image": "card_image_music_03",
+      "file": "track_03"
+    },
+    {
+      "number": 4,
+      "duration": "2:06",
+      "title": "Light The Torch",
+      "description": "Silent Partner",
+      "image": "card_image_music_04",
+      "file": "track_04"
+    },
+    {
+      "number": 5,
+      "duration": "2:43",
+      "title": "Blue Skies",
+      "description": "Silent Partner",
+      "image": "card_image_music_05",
+      "file": "track_05"
+    },
+    {
+      "number": 6,
+      "duration": "0:05",
+      "title": "In the Land of Rhinoplasty(Sting)",
+      "description": "Jingle Punks",
+      "image": "card_image_music_06",
+      "file": "track_06"
+    },
+    {
+      "number": 7,
+      "duration": "2:54",
+      "title": "Ice Crystals",
+      "description": "Everet Almond",
+      "image": "card_image_music_07",
+      "file": "track_07"
+    },
+    {
+      "number": 8,
+      "duration": "2:38",
+      "title": "Shoulder Closures",
+      "description": "Gunnar Olsen",
+      "image": "card_image_music_08",
+      "file": "track_08"
+    },
+    {
+      "number": 9,
+      "duration": "2:40",
+      "title": "The Coldest Shoulder",
+      "description": "The 126ers",
+      "image": "card_image_music_09",
+      "file": "track_09"
+    }
+  ]
+}
\ No newline at end of file
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/raw/music_example.json b/samples/SupportLeanbackShowcase/app/src/main/res/raw/music_example.json
new file mode 100644
index 0000000..b01a2d4
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/raw/music_example.json
@@ -0,0 +1,106 @@
+{
+  "title": "A Summer in a Canyon",
+  "description": "Kate Douglas Smith Wiggin",
+  "year": 1914,
+  "text": "It was nine o’clock one sunny California morning, and Geoffrey Strong stood under the live-oak trees in Las Flores Cañon, with a pot of black paint in one hand and a huge brush in the other.  He could have handled these implements to better purpose and with better grace had not his arms been firmly held by three laughing girls, who pulled not wisely, but too well.  He was further incommoded by the presence of a small urchin who lay on the dusty ground beneath his feet, fastening an upward clutch on the legs of his trousers.\n\nThere were three large canvas tents directly in front of them, yet no one of these seemed to be the object of dissension, but rather a redwood board, some three feet in length, which was nailed on a tree near by. twitch of her cousin’s sleeve.",
+  "localImageResource": "movie_poster_01",
+  "price": "$9.99",
+  "characters": [
+    {
+      "type": "CHARACTER",
+      "title": "Leonardo Di Caprio",
+      "localImageResource": "face_01"
+    },
+    {
+      "type": "CHARACTER",
+      "title": "Gerald Butler",
+      "localImageResource": "face_08"
+    },
+    {
+      "type": "CHARACTER",
+      "title": "Russle Crow",
+      "localImageResource": "face_02"
+    },
+    {
+      "type": "CHARACTER",
+      "title": "Emma Stone",
+      "localImageResource": "face_03"
+    },
+    {
+      "type": "CHARACTER",
+      "title": "Natalie Portman",
+      "localImageResource": "face_04"
+    },
+    {
+      "type": "CHARACTER",
+      "title": "Jack Gyllanhall",
+      "localImageResource": "face_05"
+    },
+    {
+      "type": "CHARACTER",
+      "title": "Ryan Gossling",
+      "localImageResource": "face_06"
+    },
+    {
+      "type": "CHARACTER",
+      "title": "Olivia Wilde",
+      "localImageResource": "face_07"
+    }
+  ],
+  "recommended": [
+    {
+      "type": "THIN",
+      "title": "The Amazing Spuder-Man",
+      "description": "$3.99",
+      "localImageResource": "card_image_movie_01"
+    },
+    {
+      "type": "THIN",
+      "title": "American Psycho",
+      "description": "$3.99",
+      "localImageResource": "card_image_movie_02"
+    },
+    {
+      "type": "THIN",
+      "title": "Big Hero 6",
+      "description": "$3.99",
+      "localImageResource": "card_image_movie_03"
+    },
+    {
+      "type": "THIN",
+      "title": "Edge of Tomorrow",
+      "description": "$3.99",
+      "localImageResource": "card_image_movie_04"
+    },
+    {
+      "type": "THIN",
+      "title": "The Hobbit: The Desolation of Smaug",
+      "description": "$3.99",
+      "localImageResource": "card_image_movie_05"
+    },
+    {
+      "type": "THIN",
+      "title": "Interstellar",
+      "description": "$3.99",
+      "localImageResource": "card_image_movie_06"
+    },
+    {
+      "type": "THIN",
+      "title": "Jurassic Park",
+      "description": "$3.99",
+      "localImageResource": "card_image_movie_07"
+    },
+    {
+      "type": "THIN",
+      "title": "The Hunger Games: Mockingjay Part I",
+      "description": "$3.99",
+      "localImageResource": "card_image_movie_08"
+    },
+    {
+      "type": "THIN",
+      "title": "Planes",
+      "description": "$3.99",
+      "localImageResource": "card_image_movie_09"
+    }
+  ]
+}
\ No newline at end of file
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/raw/page_row_example.json b/samples/SupportLeanbackShowcase/app/src/main/res/raw/page_row_example.json
new file mode 100644
index 0000000..5e686d7
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/raw/page_row_example.json
@@ -0,0 +1,515 @@
+[
+  {
+    "title": "One Line Title",
+    "cards": [
+      {
+        "type": "MOVIE",
+        "title": "Deep Into The Deep Sleep",
+        "description": "$3.99",
+        "localImageResource": "card_image_movie_01"
+      },
+      {
+        "type": "MOVIE",
+        "title": "We",
+        "description": "$3.99",
+        "localImageResource": "card_image_movie_02"
+      },
+      {
+        "type": "MOVIE",
+        "title": "The Fairy Story Of A Legend",
+        "description": "$3.99",
+        "localImageResource": "card_image_movie_03"
+      },
+      {
+        "type": "MOVIE",
+        "title": "Cursed",
+        "description": "$3.99",
+        "localImageResource": "card_image_movie_04"
+      },
+      {
+        "type": "MOVIE",
+        "title": "My Crazy One",
+        "description": "$3.99",
+        "localImageResource": "card_image_movie_05"
+      },
+      {
+        "type": "MOVIE",
+        "title": "Gone",
+        "description": "$3.99",
+        "localImageResource": "card_image_movie_06"
+      },
+      {
+        "type": "MOVIE",
+        "title": "A Cold Night To Stay",
+        "description": "$3.99",
+        "localImageResource": "card_image_movie_07"
+      },
+      {
+        "type": "MOVIE",
+        "title": "The Silence",
+        "description": "$3.99",
+        "localImageResource": "card_image_movie_08"
+      },
+      {
+        "type": "MOVIE",
+        "title": "Hear The Roar",
+        "description": "$3.99",
+        "localImageResource": "card_image_movie_09"
+      }
+    ]
+  },
+  {
+    "title": "Two Line Title",
+    "cards": [
+      {
+        "type": "MOVIE_BASE",
+        "title": "Deep Into The Deep Sleep",
+        "description": "$3.99",
+        "localImageResource": "card_image_movie_01"
+      },
+      {
+        "type": "MOVIE_BASE",
+        "title": "We",
+        "description": "$3.99",
+        "localImageResource": "card_image_movie_02"
+      },
+      {
+        "type": "MOVIE_BASE",
+        "title": "The Fairy Story Of A Legend",
+        "description": "$3.99",
+        "localImageResource": "card_image_movie_03"
+      },
+      {
+        "type": "MOVIE_BASE",
+        "title": "Cursed",
+        "description": "$3.99",
+        "localImageResource": "card_image_movie_04"
+      },
+      {
+        "type": "MOVIE_BASE",
+        "title": "My Crazy One",
+        "description": "$3.99",
+        "localImageResource": "card_image_movie_05"
+      },
+      {
+        "type": "MOVIE_BASE",
+        "title": "Gone",
+        "description": "$3.99",
+        "localImageResource": "card_image_movie_06"
+      },
+      {
+        "type": "MOVIE_BASE",
+        "title": "A Cold Night To Stay",
+        "description": "$3.99",
+        "localImageResource": "card_image_movie_07"
+      },
+      {
+        "type": "MOVIE_BASE",
+        "title": "The Silence",
+        "description": "$3.99",
+        "localImageResource": "card_image_movie_08"
+      },
+      {
+        "type": "MOVIE_BASE",
+        "title": "Hear The Roar",
+        "description": "$3.99",
+        "localImageResource": "card_image_movie_09"
+      }
+    ]
+  },
+  {
+    "title": "Two Line Title + Icon",
+    "cards": [
+      {
+        "type": "MOVIE_COMPLETE",
+        "description": "$3.99",
+        "title": "Deep Into The Deep Sleep",
+        "footerIconLocalImageResource": "stars_red",
+        "localImageResource": "card_image_movie_01"
+      },
+      {
+        "type": "MOVIE_COMPLETE",
+        "title": "We",
+        "description": "$3.99",
+        "footerIconLocalImageResource": "stars_red",
+        "localImageResource": "card_image_movie_02"
+      },
+      {
+        "type": "MOVIE_COMPLETE",
+        "title": "The Fairy",
+        "description": "$3.99",
+        "footerIconLocalImageResource": "stars_red",
+        "localImageResource": "card_image_movie_03"
+      },
+      {
+        "type": "MOVIE_COMPLETE",
+        "title": "Cursed",
+        "description": "$3.99",
+        "footerIconLocalImageResource": "stars_red",
+        "localImageResource": "card_image_movie_04"
+      },
+      {
+        "type": "MOVIE_COMPLETE",
+        "title": "My Crazy One",
+        "description": "$3.99",
+        "footerIconLocalImageResource": "stars_red",
+        "localImageResource": "card_image_movie_05"
+      },
+      {
+        "type": "MOVIE_COMPLETE",
+        "title": "Gone",
+        "description": "$3.99",
+        "footerIconLocalImageResource": "stars_red",
+        "localImageResource": "card_image_movie_06"
+      },
+      {
+        "type": "MOVIE_COMPLETE",
+        "title": "A Cold Night To Stay",
+        "description": "$3.99",
+        "footerIconLocalImageResource": "stars_red",
+        "localImageResource": "card_image_movie_07"
+      },
+      {
+        "type": "MOVIE_COMPLETE",
+        "description": "$3.99",
+        "title": "The Silence",
+        "footerIconLocalImageResource": "stars_red",
+        "localImageResource": "card_image_movie_08"
+      },
+      {
+        "type": "MOVIE_COMPLETE",
+        "title": "Hear The Roar",
+        "description": "$3.99",
+        "footerIconLocalImageResource": "stars_red",
+        "localImageResource": "card_image_movie_09"
+      }
+    ]
+  },
+  {
+    "title": "Title + Description",
+    "cards": [
+      {
+        "type": "SQUARE_BIG",
+        "title": "Blue in Green",
+        "description": "Miles Davis",
+        "footerColor": "#bf360C",
+        "localImageResource": "card_image_music_02"
+      },
+      {
+        "type": "SQUARE_BIG",
+        "title": "Blue in Green",
+        "description": "Miles Davis",
+        "footerColor": "#b93221",
+        "localImageResource": "card_image_music_03"
+      },
+      {
+        "type": "SQUARE_BIG",
+        "title": "Blue in Green",
+        "description": "Miles Davis",
+        "footerColor": "#311b92",
+        "localImageResource": "card_image_music_04"
+      },
+      {
+        "type": "SQUARE_BIG",
+        "title": "Blue in Green",
+        "description": "Miles Davis",
+        "footerColor": "#33691e",
+        "localImageResource": "card_image_music_05"
+      },
+      {
+        "type": "SQUARE_BIG",
+        "title": "Blue in Green",
+        "description": "Miles Davis",
+        "footerColor": "#37474f",
+        "localImageResource": "card_image_music_06"
+      },
+      {
+        "type": "SQUARE_BIG",
+        "title": "Blue in Green",
+        "description": "Miles Davis",
+        "footerColor": "#3e2723",
+        "localImageResource": "card_image_music_08"
+      },
+      {
+        "type": "SQUARE_BIG",
+        "title": "Blue in Green",
+        "description": "Miles Davis",
+        "footerColor": "#01579B",
+        "localImageResource": "card_image_music_09"
+      }
+    ]
+  },
+  {
+    "title": "Title + Description + Icon",
+    "cards": [
+      {
+        "type": "GAME",
+        "title": "Crazy One",
+        "description": "Purchased",
+        "localImageResource": "game_crazy_one",
+        "footerIconLocalImageResource": "ic_installed"
+      },
+      {
+        "type": "GAME",
+        "title": "Cursed",
+        "description": "Purchased",
+        "localImageResource": "game_cursed",
+        "footerIconLocalImageResource": "ic_installed"
+      },
+      {
+        "type": "GAME",
+        "title": "fairy",
+        "description": "Purchased",
+        "localImageResource": "game_fairy",
+        "footerIconLocalImageResource": "ic_installed"
+      },
+      {
+        "type": "GAME",
+        "title": "Hear The Roar",
+        "description": "Purchased",
+        "localImageResource": "game_hear_the_roar",
+        "footerIconLocalImageResource": "ic_installed"
+      },
+      {
+        "type": "GAME",
+        "title": "Silence",
+        "description": "Purchased",
+        "localImageResource": "game_silence",
+        "footerIconLocalImageResource": "ic_installed"
+      }
+    ]
+  },
+  {
+    "title": "Title + Description (Wide)",
+    "cards": [
+      {
+        "type": "DEFAULT",
+        "title": "Marseille sea food tour",
+        "description": "9,089 views   3 years ago   by ADELAIDE",
+        "localImageResource": "coffee_and_tea_01"
+      },
+      {
+        "type": "DEFAULT",
+        "title": "Marseille sea food tour",
+        "description": "9,089 views   3 years ago   by ADELAIDE",
+        "localImageResource": "coffee_and_tea_02"
+      },
+      {
+        "type": "DEFAULT",
+        "title": "Marseille sea food tour",
+        "description": "9,089 views   3 years ago   by ADELAIDE",
+        "localImageResource": "coffee_and_tea_03"
+      },
+      {
+        "type": "DEFAULT",
+        "title": "Marseille sea food tour",
+        "description": "9,089 views   3 years ago   by ADELAIDE",
+        "localImageResource": "coffee_and_tea_04"
+      },
+      {
+        "type": "DEFAULT",
+        "title": "Marseille sea food tour",
+        "description": "9,089 views   3 years ago   by ADELAIDE",
+        "localImageResource": "coffee_and_tea_05"
+      },
+      {
+        "type": "DEFAULT",
+        "title": "Marseille sea food tour",
+        "description": "9,089 views   3 years ago   by ADELAIDE",
+        "localImageResource": "coffee_and_tea_06"
+      },
+      {
+        "type": "DEFAULT",
+        "title": "Marseille sea food tour",
+        "description": "9,089 views   3 years ago   by ADELAIDE",
+        "localImageResource": "coffee_and_tea_07"
+      },
+      {
+        "type": "DEFAULT",
+        "title": "Marseille sea food tour",
+        "description": "9,089 views   3 years ago   by ADELAIDE",
+        "localImageResource": "coffee_and_tea_08"
+      }
+    ]
+  },
+  {
+    "title": "BaseCardView Info On The Right",
+    "cards": [
+      {
+        "type": "SIDE_INFO",
+        "title": "The Life Aquatic",
+        "description": "Seu Jorge",
+        "extraText": "Bacon ipsum dolor amet bresaola kevin tenderloin swine shoulder strip steak t-bone picanha turducken beef. Ribeye turkey t-bone pastrami meatball corned beef. Pork belly landjaeger short ribs ground round cupim, brisket ham tri-tip. Pig pork loin hamburger picanha ribeye, pork belly meatball chicken ham boudin sirloin corned beef frankfurter ham hock.",
+        "localImageResource": "card_image_music_02"
+      },
+      {
+        "type": "SIDE_INFO",
+        "title": "The Life Aquatic",
+        "description": "Seu Jorge",
+        "extraText": "Bacon ipsum dolor amet bresaola kevin tenderloin swine shoulder strip steak t-bone picanha turducken beef. Ribeye turkey t-bone pastrami meatball corned beef. Pork belly landjaeger short ribs ground round cupim, brisket ham tri-tip. Pig pork loin hamburger picanha ribeye, pork belly meatball chicken ham boudin sirloin corned beef frankfurter ham hock.",
+        "localImageResource": "card_image_music_03"
+      },
+      {
+        "type": "SIDE_INFO",
+        "title": "The Life Aquatic",
+        "description": "Seu Jorge",
+        "extraText": "Bacon ipsum dolor amet bresaola kevin tenderloin swine shoulder strip steak t-bone picanha turducken beef. Ribeye turkey t-bone pastrami meatball corned beef. Pork belly landjaeger short ribs ground round cupim, brisket ham tri-tip. Pig pork loin hamburger picanha ribeye, pork belly meatball chicken ham boudin sirloin corned beef frankfurter ham hock.",
+        "localImageResource": "card_image_music_04"
+      },
+      {
+        "type": "SIDE_INFO",
+        "title": "The Life Aquatic",
+        "description": "Seu Jorge",
+        "extraText": "Bacon ipsum dolor amet bresaola kevin tenderloin swine shoulder strip steak t-bone picanha turducken beef. Ribeye turkey t-bone pastrami meatball corned beef. Pork belly landjaeger short ribs ground round cupim, brisket ham tri-tip. Pig pork loin hamburger picanha ribeye, pork belly meatball chicken ham boudin sirloin corned beef frankfurter ham hock.",
+        "localImageResource": "card_image_music_05"
+      },
+      {
+        "type": "SIDE_INFO",
+        "title": "The Life Aquatic",
+        "description": "Seu Jorge",
+        "extraText": "Bacon ipsum dolor amet bresaola kevin tenderloin swine shoulder strip steak t-bone picanha turducken beef. Ribeye turkey t-bone pastrami meatball corned beef. Pork belly landjaeger short ribs ground round cupim, brisket ham tri-tip. Pig pork loin hamburger picanha ribeye, pork belly meatball chicken ham boudin sirloin corned beef frankfurter ham hock.",
+        "localImageResource": "card_image_music_06"
+      },
+      {
+        "type": "SIDE_INFO",
+        "title": "The Life Aquatic",
+        "description": "Seu Jorge",
+        "extraText": "Bacon ipsum dolor amet bresaola kevin tenderloin swine shoulder strip steak t-bone picanha turducken beef. Ribeye turkey t-bone pastrami meatball corned beef. Pork belly landjaeger short ribs ground round cupim, brisket ham tri-tip. Pig pork loin hamburger picanha ribeye, pork belly meatball chicken ham boudin sirloin corned beef frankfurter ham hock.",
+        "localImageResource": "card_image_music_07"
+      },
+      {
+        "type": "SIDE_INFO",
+        "title": "The Life Aquatic",
+        "description": "Seu Jorge",
+        "extraText": "Bacon ipsum dolor amet bresaola kevin tenderloin swine shoulder strip steak t-bone picanha turducken beef. Ribeye turkey t-bone pastrami meatball corned beef. Pork belly landjaeger short ribs ground round cupim, brisket ham tri-tip. Pig pork loin hamburger picanha ribeye, pork belly meatball chicken ham boudin sirloin corned beef frankfurter ham hock.",
+        "localImageResource": "card_image_music_08"
+      }
+    ]
+  },
+  {
+    "title": "BaseCardView using TextView",
+    "cards": [
+      {
+        "type": "TEXT",
+        "title": "Jonathan Max",
+        "extraText": "Bacon ipsum dolor amet bresaola kevin tenderloin swine shoulder strip steak t-bone picanha turducken beef. Ribeye turkey t-bone pastrami meatball corned beef. Pork belly landjaeger short ribs ground round cupim, brisket ham tri-tip. Pig pork loin hamburger picanha ribeye, pork belly meatball chicken ham boudin sirloin corned beef frankfurter ham hock.",
+        "localImageResource": "face_01"
+      },
+      {
+        "type": "TEXT",
+        "title": "Jonathan Max",
+        "extraText": "Bacon ipsum dolor amet bresaola kevin tenderloin swine shoulder strip steak t-bone picanha turducken beef. Ribeye turkey t-bone pastrami meatball corned beef. Pork belly landjaeger short ribs ground round cupim, brisket ham tri-tip. Pig pork loin hamburger picanha ribeye, pork belly meatball chicken ham boudin sirloin corned beef frankfurter ham hock.",
+        "localImageResource": "face_02"
+      },
+      {
+        "type": "TEXT",
+        "title": "Jonathan Max",
+        "extraText": "Bacon ipsum dolor amet bresaola kevin tenderloin swine shoulder strip steak t-bone picanha turducken beef. Ribeye turkey t-bone pastrami meatball corned beef. Pork belly landjaeger short ribs ground round cupim, brisket ham tri-tip. Pig pork loin hamburger picanha ribeye, pork belly meatball chicken ham boudin sirloin corned beef frankfurter ham hock.",
+        "localImageResource": "face_03"
+      },
+      {
+        "type": "TEXT",
+        "title": "Jonathan Max",
+        "extraText": "Bacon ipsum dolor amet bresaola kevin tenderloin swine shoulder strip steak t-bone picanha turducken beef. Ribeye turkey t-bone pastrami meatball corned beef. Pork belly landjaeger short ribs ground round cupim, brisket ham tri-tip. Pig pork loin hamburger picanha ribeye, pork belly meatball chicken ham boudin sirloin corned beef frankfurter ham hock.",
+        "localImageResource": "face_04"
+      },
+      {
+        "type": "TEXT",
+        "title": "Jonathan Max",
+        "extraText": "Bacon ipsum dolor amet bresaola kevin tenderloin swine shoulder strip steak t-bone picanha turducken beef. Ribeye turkey t-bone pastrami meatball corned beef. Pork belly landjaeger short ribs ground round cupim, brisket ham tri-tip. Pig pork loin hamburger picanha ribeye, pork belly meatball chicken ham boudin sirloin corned beef frankfurter ham hock.",
+        "localImageResource": "face_05"
+      },
+      {
+        "type": "TEXT",
+        "title": "Jonathan Max",
+        "extraText": "Bacon ipsum dolor amet bresaola kevin tenderloin swine shoulder strip steak t-bone picanha turducken beef. Ribeye turkey t-bone pastrami meatball corned beef. Pork belly landjaeger short ribs ground round cupim, brisket ham tri-tip. Pig pork loin hamburger picanha ribeye, pork belly meatball chicken ham boudin sirloin corned beef frankfurter ham hock.",
+        "localImageResource": "face_06"
+      },
+      {
+        "type": "TEXT",
+        "title": "Jonathan Max",
+        "extraText": "Bacon ipsum dolor amet bresaola kevin tenderloin swine shoulder strip steak t-bone picanha turducken beef. Ribeye turkey t-bone pastrami meatball corned beef. Pork belly landjaeger short ribs ground round cupim, brisket ham tri-tip. Pig pork loin hamburger picanha ribeye, pork belly meatball chicken ham boudin sirloin corned beef frankfurter ham hock.",
+        "localImageResource": "face_07"
+      },
+      {
+        "type": "TEXT",
+        "title": "Jonathan Max",
+        "extraText": "Bacon ipsum dolor amet bresaola kevin tenderloin swine shoulder strip steak t-bone picanha turducken beef. Ribeye turkey t-bone pastrami meatball corned beef. Pork belly landjaeger short ribs ground round cupim, brisket ham tri-tip. Pig pork loin hamburger picanha ribeye, pork belly meatball chicken ham boudin sirloin corned beef frankfurter ham hock.",
+        "localImageResource": "face_08"
+      }
+    ]
+  },
+  {
+    "title": "ImageCardView Customize Style",
+    "cards": [
+      {
+        "type": "SINGLE_LINE",
+        "title": "Action & Adventure",
+        "footerColor": "#dd004e",
+        "localImageResource": "category_action"
+      },
+      {
+        "type": "SINGLE_LINE",
+        "title": "Animation",
+        "footerColor": "#c51162",
+        "localImageResource": "category_animation"
+      },
+      {
+        "type": "SINGLE_LINE",
+        "title": "Classics",
+        "footerColor": "#9c27b0",
+        "localImageResource": "category_classics"
+      },
+      {
+        "type": "SINGLE_LINE",
+        "title": "Comedy",
+        "footerColor": "#cf4900",
+        "localImageResource": "category_comedy"
+      },
+      {
+        "type": "SINGLE_LINE",
+        "title": "Crime",
+        "footerColor": "#3f51b5",
+        "localImageResource": "category_crime"
+      },
+      {
+        "type": "SINGLE_LINE",
+        "title": "Documentary",
+        "footerColor": "#02639b",
+        "localImageResource": "category_documentary"
+      },
+      {
+        "type": "SINGLE_LINE",
+        "title": "Drama",
+        "footerColor": "#2a56c6",
+        "localImageResource": "category_drama"
+      }
+    ]
+  },
+  {
+    "title": "ImageCardView with onFocusChange listener",
+    "shadow": false,
+    "cards": [
+      {
+        "type": "ICON",
+        "title": "Settings",
+        "localImageResource": "ic_settings_settings"
+      },
+      {
+        "type": "ICON",
+        "title": "WiFi",
+        "localImageResource": "ic_settings_wifi_3_bar"
+      },
+      {
+        "type": "ICON",
+        "title": "Parental Control",
+        "localImageResource": "ic_settings_parental_control"
+      },
+      {
+        "type": "ICON",
+        "title": "Time",
+        "localImageResource": "ic_settings_time"
+      }
+    ]
+  }
+]
\ No newline at end of file
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/raw/track_01.mp3 b/samples/SupportLeanbackShowcase/app/src/main/res/raw/track_01.mp3
new file mode 100755
index 0000000..9762383
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/raw/track_01.mp3
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/raw/track_02.mp3 b/samples/SupportLeanbackShowcase/app/src/main/res/raw/track_02.mp3
new file mode 100755
index 0000000..82f4c8a
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/raw/track_02.mp3
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/raw/track_03.mp3 b/samples/SupportLeanbackShowcase/app/src/main/res/raw/track_03.mp3
new file mode 100755
index 0000000..7faaeea
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/raw/track_03.mp3
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/raw/track_04.mp3 b/samples/SupportLeanbackShowcase/app/src/main/res/raw/track_04.mp3
new file mode 100755
index 0000000..90a5310
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/raw/track_04.mp3
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/raw/track_05.mp3 b/samples/SupportLeanbackShowcase/app/src/main/res/raw/track_05.mp3
new file mode 100755
index 0000000..ec65400
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/raw/track_05.mp3
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/raw/track_06.mp3 b/samples/SupportLeanbackShowcase/app/src/main/res/raw/track_06.mp3
new file mode 100755
index 0000000..fe84974
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/raw/track_06.mp3
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/raw/track_07.mp3 b/samples/SupportLeanbackShowcase/app/src/main/res/raw/track_07.mp3
new file mode 100755
index 0000000..9f876c0
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/raw/track_07.mp3
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/raw/track_08.mp3 b/samples/SupportLeanbackShowcase/app/src/main/res/raw/track_08.mp3
new file mode 100755
index 0000000..33c8af8
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/raw/track_08.mp3
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/raw/track_09.mp3 b/samples/SupportLeanbackShowcase/app/src/main/res/raw/track_09.mp3
new file mode 100755
index 0000000..aaed617
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/raw/track_09.mp3
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/raw/wizard_example.json b/samples/SupportLeanbackShowcase/app/src/main/res/raw/wizard_example.json
new file mode 100644
index 0000000..f46b856
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/raw/wizard_example.json
@@ -0,0 +1,6 @@
+{
+  "title": "Androidify! The Movie",
+  "breadcrump": "Android TV",
+  "price_hd": "$4.99",
+  "price_sd": "$2.99"
+}
\ No newline at end of file
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/values/arrays.xml b/samples/SupportLeanbackShowcase/app/src/main/res/values/arrays.xml
new file mode 100644
index 0000000..9933ba7
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/values/arrays.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2015 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>
+    <array name="pref_parent_control_entries">
+        <item>Everyone</item>
+        <item>Low maturity</item>
+        <item>Medium maturity</item>
+        <item>High maturity</item>
+    </array>
+    <array name="pref_parent_control_entries_values">
+        <item>everyone</item>
+        <item>low</item>
+        <item>medium</item>
+        <item>high</item>
+    </array>
+    <array name="pref_parent_control_entries_summaries">
+        <item>This description becomes visible only on focus.</item>
+        <item>This description becomes visible only on focus.</item>
+        <item>This description becomes visible only on focus.</item>
+        <item>This description becomes visible only on focus.</item>
+    </array>
+    <array name="pref_wifi_networks">
+        <item>Wi-Fi network 1</item>
+        <item>Wi-Fi network 2</item>
+        <item>Wi-Fi network 3</item>
+        <item>Wi-Fi network 4</item>
+        <item>Wi-Fi network 5</item>
+        <item>Wi-Fi network 6</item>
+    </array>
+</resources>
\ No newline at end of file
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/values/colors.xml b/samples/SupportLeanbackShowcase/app/src/main/res/values/colors.xml
new file mode 100644
index 0000000..8526c76
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/values/colors.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2015 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="background_gradient_start">#FFFFFF</color>
+    <color name="background_gradient_end">#DDDDDD</color>
+    <color name="fastlane_background">#06838f</color>
+    <color name="fastlane_teal_background">#00796B</color>
+    <color name="search_opaque">#ffaa3f</color>
+    <color name="search_color">#FFEB3B</color>
+    <color name="search_bright_color">#FFEB3B</color>
+    <color name="search_icon_color">#222222</color>
+    <color name="accent">#80D3FB</color>
+    <color name="settings_background">#00695C</color>
+
+    <color name="default_background">#3d3d3d</color>
+
+    <color name="default_card_background_color">#263238</color>
+    <color name="default_card_footer_background_color">#37474F</color>
+    <color name="selected_card_footer_background_color">#F0F</color>
+
+    <color name="lb_default_brand_color">#FF455A64</color>
+    <color name="card_primary_text">#EEEEEE</color>
+    <color name="card_secondary_text">#99EEEEEE</color>
+
+    <color name="loading_error_card_background">#86c739</color>
+
+    <color name="card_examples_background">#222222</color>
+
+    <color name="detail_view_actionbar_background">#04549D</color>
+    <color name="detail_view_background">#0374BF</color>
+    <color name="detail_view_related_background">#022A4E</color>
+    <color name="song_row_favorite_color">#FF6E40</color>
+
+    <color name="app_guidedstep_actions_background">#C03800</color>
+    <color name="app_guidedstep_subactions_background">#732200</color>
+    <color name="app_guidedstep_dialog_actions_background">#263238</color>
+    <color name="settings_card_background">#0277BD</color>
+    <color name="settings_card_background_focussed">#01579B</color>
+
+    <color name="player_progress_color">#feab91</color>
+    <color name="player_background_color">#db2a0f</color>
+
+</resources>
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/values/dims.xml b/samples/SupportLeanbackShowcase/app/src/main/res/values/dims.xml
new file mode 100644
index 0000000..07c8027
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/values/dims.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2015 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="default_image_card_width">224dp</dimen>
+    <dimen name="default_image_card_height">126dp</dimen>
+
+    <dimen name="movie_image_card_width">120dp</dimen>
+    <dimen name="movie_image_card_height">172dp</dimen>
+
+    <dimen name="icon_image_card_width">224dp</dimen>
+    <dimen name="icon_image_card_height">109dp</dimen>
+
+    <dimen name="big_square_image_card_width">144dp</dimen>
+    <dimen name="big_square_image_card_height">144dp</dimen>
+
+    <dimen name="square_image_card_width">128dp</dimen>
+    <dimen name="square_image_card_height">128dp</dimen>
+
+    <dimen name="small_square_image_card_width">96dp</dimen>
+    <dimen name="small_square_image_card_height">96dp</dimen>
+
+    <dimen name="sidetext_image_card_width">144dp</dimen>
+    <dimen name="sidetext_image_card_height">144dp</dimen>
+
+    <dimen name="wide_short_image_card_width">224dp</dimen>
+    <dimen name="wide_short_image_card_height">109dp</dimen>
+
+    <dimen name="character_image_card_width">120dp</dimen>
+    <dimen name="character_image_card_height">120dp</dimen>
+
+    <dimen name="grid_card_width">200dp</dimen>
+    <dimen name="grid_card_height">200dp</dimen>
+</resources>
\ No newline at end of file
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/values/strings.xml b/samples/SupportLeanbackShowcase/app/src/main/res/values/strings.xml
new file mode 100644
index 0000000..0921d66
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/values/strings.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2015 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+  ~ in compliance with the License. You may obtain a copy of the License at
+  ~
+  ~ http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software distributed under the License
+  ~ is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+  ~ or implied. See the License for the specific language governing permissions and limitations under
+  ~ the License.
+  ~
+  -->
+<resources>
+    <string name="app_name">ShowcaseApp</string>
+    <string name="browse_title"><![CDATA[androidTV]]></string>
+
+    <!-- Error messages -->
+    <string name="implement_search">Implement your own in-app search.</string>
+    <string name="card_examples_title">Card Examples</string>
+    <string name="detail_view_title">DetailView Example</string>
+    <string name="action_cicked">Action clicked. Implement your own handler.</string>
+    <string name="grid_example_title">Grid Example</string>
+    <string name="action_buy">Buy </string>
+    <string name="action_wishlist">Add to wishlist</string>
+    <string name="action_related">Related</string>
+    <string name="header_related">Related Items</string>
+    <string name="header_recommended">Recommended</string>
+
+    <!-- Page/List Row -->
+    <string name="page_list_row_title">Page and List Row</string>
+
+    <!-- Dialog example -->
+    <string name="dialog_example_title">Use Google\'s location service?</string>
+    <string name="dialog_example_description">Let Google help apps determine location. This means sending anonymous location data to Google, even when no apps are running.</string>
+    <string name="dialog_example_button_positive">Agree</string>
+    <string name="dialog_example_button_negative">Disagree</string>
+    <string name="dialog_example_button_toast_positive_clicked">\'Agree\' clicked.</string>
+    <string name="dialog_example_button_toast_negative_clicked">\'Disagree\' clicked.</string>
+
+    <!-- Wizard example -->
+    <string name="wizard_example_choose_rent_options">Choose rent options</string>
+    <string name="wizard_example_watch_hd">Watch in HD on supported devices</string>
+    <string name="wizard_example_watch_sd">Watch in standard definition on the web and supported devices</string>
+    <string name="wizard_example_rental_period">Rental period: start within 30 days,\nfinish within 24 hours</string>
+    <string name="wizard_example_input_card">Enter credit card number</string>
+    <string name="wizard_example_expiration_date">Exp Date</string>
+    <string name="wizard_example_payment_method">Payment Method</string>
+    <string name="wizard_example_toast_payment_method_clicked">\'Payment Method\' clicked.</string>
+    <string name="wizard_example_rent">Rent</string>
+    <string name="wizard_example_rent_hd">Rent HD</string>
+    <string name="wizard_example_rent_sd">Rent SD</string>
+    <string name="wizard_example_processing">Processinig...</string>
+    <string name="wizard_example_watch_now">Watch now</string>
+    <string name="wizard_example_later">Later</string>
+    <string name="wizard_example_watch_now_clicked">\'Watch now\' clicked.</string>
+    <string name="wizard_example_later_clicked">\'Later\' clicked.</string>
+    <string name="wizard_example_new_payment_guidance_title">New credit card</string>
+    <string name="wizard_example_new_payment_guidance_description">Enter new credit card information here</string>
+    <string name="wizard_example_input_credit">Input Payment Type</string>
+    <string name="wizard_example_visa">Visa-%s</string>
+    <string name="wizard_example_master">Master-%s</string>
+    <string name="wizard_example_input_credit_wrong">Error: invalid credit card number</string>
+    <string name="wizard_example_just_a_second">Just a second...</string>
+</resources>
\ No newline at end of file
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/values/styles.xml b/samples/SupportLeanbackShowcase/app/src/main/res/values/styles.xml
new file mode 100644
index 0000000..4f624d8
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/values/styles.xml
@@ -0,0 +1,271 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2015 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>
+
+    <style name="AppTheme" parent="@style/Theme.Leanback">
+    </style>
+
+    <!-- Various movie card styles. Used in cards example. -->
+    <style name="MovieCardBadgeStyle" parent="Widget.Leanback.ImageCardView.BadgeStyle">
+        <item name="android:src">@drawable/stars_red</item>
+        <item name="android:layout_width">wrap_content</item>
+        <item name="android:scaleType">center</item>
+    </style>
+
+    <style name="MovieCardTitleTwoLineStyle" parent="Widget.Leanback.ImageCardView.TitleStyle">
+        <item name="android:maxLines">2</item>
+        <item name="android:minLines">2</item>
+    </style>
+
+    <style name="MovieCardContentGoneStyle" parent="Widget.Leanback.ImageCardView.ContentStyle">
+        <item name="android:visibility">invisible</item>
+    </style>
+
+    <style name="MovieCardContentStyle" parent="Widget.Leanback.ImageCardView.ContentStyle">
+        <item name="android:gravity">right</item>
+    </style>
+
+    <style name="MovieCardImageStyle" parent="Widget.Leanback.ImageCardView.ImageStyle">
+        <item name="android:layout_width">@dimen/movie_image_card_width</item>
+        <item name="android:layout_height">@dimen/movie_image_card_height</item>
+    </style>
+
+
+    <style name="MovieCardTitleOnlyStyle" parent="Widget.Leanback.ImageCardViewStyle">
+        <item name="lbImageCardViewType">Title</item>
+        <item name="cardBackground">@null</item>
+    </style>
+
+    <!-- Theme corresponding to the MovieCardSimpleStyle -->
+    <style name="MovieCardSimpleTheme" parent="Theme.Leanback">
+        <item name="imageCardViewStyle"> @style/MovieCardTitleOnlyStyle </item>
+        <item name="imageCardViewImageStyle">@style/MovieCardImageStyle</item>
+    </style>
+
+    <style name="MovieCardCompleteStyle" parent="MovieCardTitleOnlyStyle">
+        <item name="lbImageCardViewType">Title|Content|IconOnLeft</item>
+    </style>
+
+    <!-- Theme corresponding to the MovieCardCompleteStyle -->
+    <style name="MovieCardCompleteTheme" parent="Theme.Leanback">
+        <item name="imageCardViewStyle"> @style/MovieCardCompleteStyle </item>
+        <item name="imageCardViewImageStyle">@style/MovieCardImageStyle</item>
+        <item name="imageCardViewTitleStyle">@style/MovieCardTitleTwoLineStyle</item>
+        <item name="imageCardViewBadgeStyle">@style/MovieCardBadgeStyle</item>
+        <item name="imageCardViewContentStyle">@style/MovieCardContentStyle</item>
+    </style>
+
+    <!-- Theme corresponding to the MovieCardBasicStyle -->
+    <style name="MovieCardBasicTheme" parent="MovieCardCompleteTheme">
+        <item name="imageCardViewContentStyle">@style/MovieCardContentGoneStyle</item>
+    </style>
+
+    <!-- Squared Title/Content card style. Used in cards example. -->
+    <style name="SquareBigCardImageStyle" parent="Widget.Leanback.ImageCardView.ImageStyle">
+        <item name="android:layout_width">@dimen/big_square_image_card_width</item>
+        <item name="android:layout_height">@dimen/big_square_image_card_height</item>
+    </style>
+
+    <style name="SquareBigCard" parent="Widget.Leanback.ImageCardViewStyle">
+        <item name="cardBackground">@null</item>
+    </style>
+
+    <!-- Theme corresponding to the SquareBigCard -->
+    <style name="SquareBigCardTheme" parent="Theme.Leanback">
+        <item name="imageCardViewStyle"> @style/SquareBigCard </item>
+        <item name="imageCardViewImageStyle">@style/SquareBigCardImageStyle</item>
+    </style>
+
+    <!-- SideInfo. used in cards example -->
+    <style name="SideInfoCardStyle" parent="Widget.Leanback.BaseCardViewStyle">
+        <item name="cardType">mainOnly</item>
+        <item name="cardBackground">@null</item>
+    </style>
+
+    <!-- TextCardView. used in cards example -->
+    <style name="TextCardStyle" parent="Widget.Leanback.BaseCardViewStyle">
+        <item name="cardBackground">@null</item>
+    </style>
+
+    <!-- CharacterCardView. used in details example -->
+    <style name="CharacterCardStyle" parent="Widget.Leanback.BaseCardViewStyle">
+        <item name="cardBackground">@null</item>
+    </style>
+
+    <!-- Grid card style. Used by Grid example. -->
+    <style name="GridCardImageStyle" parent="Widget.Leanback.ImageCardView.ImageStyle">
+        <item name="android:layout_width">@dimen/grid_card_width</item>
+        <item name="android:layout_height">@dimen/grid_card_height</item>
+    </style>
+
+    <style name="GridCardStyle" parent="Widget.Leanback.ImageCardViewStyle">
+        <item name="cardBackground">@null</item>
+    </style>
+
+    <!-- Theme corresponding to the GridCardTheme -->
+    <style name="GridCardTheme" parent="Theme.Leanback">
+        <item name="imageCardViewStyle"> @style/GridCardStyle </item>
+        <item name="imageCardViewImageStyle">@style/GridCardImageStyle</item>
+    </style>
+
+    <!-- A default card style. Used in cards example. -->
+    <style name="DefaultCardImageStyle" parent="Widget.Leanback.ImageCardView.ImageStyle">
+        <item name="android:layout_width">@dimen/default_image_card_width</item>
+        <item name="android:layout_height">@dimen/default_image_card_height</item>
+    </style>
+
+    <style name="DefaultCardStyle" parent="Widget.Leanback.ImageCardViewStyle">
+        <item name="cardBackground">@null</item>
+    </style>
+
+    <style name="DefaultCardTheme" parent="Theme.Leanback">
+        <item name="imageCardViewStyle"> @style/DefaultCardStyle </item>
+        <item name="imageCardViewImageStyle">@style/DefaultCardImageStyle</item>
+    </style>
+
+    <!-- Game card styles with custom Badge icon. Used in cards example. -->
+    <style name="GameCardContentStyle" parent="Widget.Leanback.ImageCardView.ContentStyle">
+        <item name="android:textColor">#80c349</item>
+    </style>
+
+    <style name="GameCardBadgeStyle" parent="Widget.Leanback.ImageCardView.BadgeStyle">
+        <item name="android:src">@drawable/ic_installed</item>
+    </style>
+
+    <style name="GameCardStyle" parent="DefaultCardStyle">
+        <item name="lbImageCardViewType">Title|Content|IconOnRight</item>
+    </style>
+
+    <!-- Theme corresponding to the GameCardStyle -->
+    <style name="GameCardTheme" parent="Theme.Leanback">
+        <item name="imageCardViewStyle"> @style/GameCardStyle </item>
+        <item name="imageCardViewContentStyle">@style/GameCardContentStyle</item>
+        <item name="imageCardViewBadgeStyle">@style/GameCardBadgeStyle</item>
+        <item name="imageCardViewImageStyle">@style/DefaultCardImageStyle</item>
+    </style>
+
+    <!-- Squared single line card with colored footer style. Used in cards example. -->
+    <style name="SingleLineCardTitleStyle" parent="Widget.Leanback.ImageCardView.TitleStyle">
+        <item name="android:textAlignment">center</item>
+        <item name="android:gravity">center</item>
+    </style>
+
+    <style name="SingleLineCardInfoAreaStyle" parent="Widget.Leanback.ImageCardView.InfoAreaStyle">
+        <item name="android:layout_width">@dimen/square_image_card_width</item>
+        <item name="layout_viewType">main</item>
+    </style>
+
+    <style name="SingleLineCardImageStyle" parent="Widget.Leanback.ImageCardView.ImageStyle">
+        <item name="android:layout_width">@dimen/square_image_card_width</item>
+        <item name="android:layout_height">@dimen/square_image_card_height</item>
+    </style>
+
+    <style name="SingleLineCardStyle" parent="DefaultCardStyle">
+        <item name="lbImageCardViewType">Title</item>
+    </style>
+
+    <!-- Theme corresponding to the SingleLineCardStyle -->
+    <style name="SingleLineCardTheme" parent="Theme.Leanback">
+        <item name="imageCardViewStyle"> @style/SingleLineCardStyle </item>
+        <item name="imageCardViewTitleStyle">@style/SingleLineCardTitleStyle</item>
+        <item name="imageCardViewImageStyle">@style/SingleLineCardImageStyle</item>
+        <item name="imageCardViewInfoAreaStyle">@style/SingleLineCardInfoAreaStyle</item>
+    </style>
+
+
+    <!-- Icon card style with custom focus handler. Used in cards example. -->
+    <style name="IconCardViewStyle" parent="DefaultCardStyle">
+        <item name="lbImageCardViewType">Title</item>
+    </style>
+
+    <style name="IconCardImageStyle" parent="Widget.Leanback.ImageCardView.ImageStyle">
+        <item name="android:layout_width">96dp</item>
+        <item name="android:layout_height">96dp</item>
+        <item name="android:padding">16dp</item>
+    </style>
+
+    <style name="IconCardTitleStyle" parent="Widget.Leanback.ImageCardView.TitleStyle">
+        <item name="android:maxLines">2</item>
+        <item name="android:minLines">2</item>
+        <item name="android:gravity">center</item>
+    </style>
+
+    <style name="IconCardInfoAreaStyle" parent="Widget.Leanback.ImageCardView.InfoAreaStyle">
+        <item name="android:layout_width">96dp</item>
+        <item name="android:background">@null</item>
+        <item name="layout_viewType">main</item>
+    </style>
+
+    <!-- Theme corresponding to the IconCardStyle -->
+    <style name="IconCardTheme" parent="Theme.Leanback">
+        <item name="imageCardViewStyle"> @style/IconCardViewStyle </item>
+        <item name="imageCardViewTitleStyle">@style/IconCardTitleStyle</item>
+        <item name="imageCardViewImageStyle">@style/IconCardImageStyle</item>
+        <item name="imageCardViewInfoAreaStyle">@style/IconCardInfoAreaStyle</item>
+    </style>
+
+
+    <style name="MediaListHeaderStyle" parent="Widget.Leanback.PlaybackMediaListHeaderStyle">
+        <item name="android:background">#282248</item>
+    </style>
+
+    <style name="SharedMediaItemRowStyle" parent="Widget.Leanback.PlaybackMediaItemRowStyle">
+        <item name="android:background">#282248</item>
+    </style>
+
+    <style name="RegularMediaItemTextStyle" parent="TextAppearance.Leanback.PlaybackMediaItemNumber">
+        <item name="android:textColor">#FF6255</item>
+        <item name="android:textSize">18sp</item>
+        <item name="android:fontFamily">sans-serif-light</item>
+    </style>
+
+
+    <style name="RegularMediaItemNumberStyle" parent="Widget.Leanback.PlaybackMediaItemNumberStyle">
+        <item name="android:visibility">visible</item>
+        <!--<item name="android:textAppearance">@style/OddMediaItemNumberTextStyle</item>-->
+    </style>
+
+    <style name="RegularMediaItemNameStyle" parent="Widget.Leanback.PlaybackMediaItemNameStyle">
+        <!--<item name="android:textAppearance">@style/OddMediaItemNumberTextStyle</item>-->
+    </style>
+
+    <style name="RegularMediaItemDurationStyle" parent="Widget.Leanback.PlaybackMediaItemDurationStyle">
+        <item name="android:visibility">visible</item>
+        <!--<item name="android:textAppearance">@style/OddMediaItemNumberTextStyle</item>-->
+    </style>
+
+
+    <style name="FavoriteMediaItemTextStyle" parent="TextAppearance.Leanback.PlaybackMediaItemNumber">
+        <item name="android:textColor">#FF6E40</item>
+        <item name="android:textSize">18sp</item>
+        <item name="android:fontFamily">sans-serif-medium</item>
+    </style>
+
+    <style name="FavoriteMediaItemNumberStyle" parent="Widget.Leanback.PlaybackMediaItemNumberStyle">
+        <item name="android:visibility">visible</item>
+        <item name="android:textAppearance">@style/FavoriteMediaItemTextStyle</item>
+    </style>
+
+    <style name="FavoriteMediaItemNameStyle" parent="Widget.Leanback.PlaybackMediaItemNameStyle">
+        <item name="android:textAppearance">@style/FavoriteMediaItemTextStyle</item>
+    </style>
+
+    <style name="FavoriteMediaItemDurationStyle" parent="Widget.Leanback.PlaybackMediaItemDurationStyle">
+        <item name="android:visibility">visible</item>
+        <item name="android:textAppearance">@style/FavoriteMediaItemTextStyle</item>
+    </style>
+
+</resources>
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/values/themes.xml b/samples/SupportLeanbackShowcase/app/src/main/res/values/themes.xml
new file mode 100644
index 0000000..4aa06f6
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/values/themes.xml
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2015 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>
+
+    <style name="Theme.Example.Leanback" parent="Theme.Leanback">
+        <item name="android:colorPrimary">#00A2B8</item>
+        <item name="android:colorAccent">@color/accent</item>
+        <item name="preferenceTheme">@style/PreferenceThemeOverlay.v14</item>
+    </style>
+
+    <style name="Theme.Example.LeanbackLauncher" parent="Theme.Example.Leanback">
+        <item name="android:windowBackground">@drawable/bg_living_room_wide</item>
+        <item name="browseRowsMarginTop">275dp</item>
+    </style>
+
+    <style name="Theme.Example.LeanbackBrowse" parent="Theme.Leanback.Browse">
+        <item name="android:windowBackground">@color/card_examples_background</item>
+        <item name="defaultBrandColor">@color/fastlane_background</item>
+        <item name="defaultSearchColor">@color/search_color</item>
+        <item name="defaultSearchIconColor">@color/search_icon_color</item>
+        <item name="defaultSearchBrightColor">@color/search_bright_color</item>
+    </style>
+
+    <style name="Theme.Example.Leanback.CustomTitle" parent="Theme.Example.LeanbackBrowse">
+        <item name="browseTitleViewLayout">@layout/titleview</item>
+        <item name="browseRowsMarginTop">120dp</item>
+    </style>
+
+    <style name="Theme.Example.LeanbackVerticalGrid" parent="Theme.Leanback.VerticalGrid">
+        <item name="android:windowBackground">@drawable/background_food</item>
+    </style>
+
+    <style name="Theme.Example.LeanbackWizard" parent="Theme.Leanback.GuidedStep">
+        <item name="guidedActionsBackground">@color/app_guidedstep_actions_background</item>
+        <item name="guidedActionsBackgroundDark">@color/app_guidedstep_subactions_background</item>
+    </style>
+
+    <style name="Theme.Example.LeanbackWizard.NoSelector">
+        <item name="guidedActionsSelectorDrawable">@null</item>
+    </style>
+
+    <style name="Theme.Example.LeanbackDialog" parent="Theme.Leanback.GuidedStep">
+        <item name="guidedActionsBackground">@color/app_guidedstep_dialog_actions_background</item>
+    </style>
+
+    <style name="Theme.Example.LeanbackPreferences" parent="Theme.Leanback">
+        <item name="preferenceTheme">@style/PreferenceThemeOverlay.v14.Leanback</item>
+        <item name="android:windowIsTranslucent">true</item>
+        <item name="android:windowBackground">@android:color/transparent</item>
+        <item name="android:backgroundDimEnabled">true</item>
+        <item name="android:colorPrimary">@color/settings_background</item>
+    </style>
+
+    <style name="Theme.Example.LeanbackDetails" parent="Theme.Leanback.Details">
+        <item name="android:colorPrimary">@color/detail_view_actionbar_background</item>
+        <item name="android:windowBackground">@drawable/background_canyon</item>
+     </style>
+
+    <style name="Theme.Example.LeanbackMusic" parent="Theme.Example.Leanback">
+        <item name="android:windowBackground">@drawable/background_sax</item>
+     </style>
+
+    <style name="Theme.Example.LeanbackMusic.RegularSongNumbers">
+        <!--<item name="playbackMediaItemRowStyle">@style/SharedMediaItemRowStyle</item>-->
+        <item name="playbackMediaItemNumberStyle">@style/RegularMediaItemNumberStyle</item>
+        <item name="playbackMediaItemNameStyle">@style/RegularMediaItemNameStyle</item>
+        <item name="playbackMediaItemDurationStyle">@style/RegularMediaItemDurationStyle</item>
+    </style>
+
+    <style name="Theme.Example.LeanbackMusic.FavoriteSongNumbers">
+        <!--<item name="playbackMediaItemRowStyle">@style/SharedMediaItemRowStyle</item>-->
+        <item name="playbackMediaItemNumberStyle">@style/FavoriteMediaItemNumberStyle</item>
+        <item name="playbackMediaItemNameStyle">@style/FavoriteMediaItemNameStyle</item>
+        <item name="playbackMediaItemDurationStyle">@style/FavoriteMediaItemDurationStyle</item>
+    </style>
+
+    <style name="Theme.Example.LeanbackMusic.TrackListHeader">
+        <item name="playbackMediaListHeaderStyle">@style/MediaListHeaderStyle</item>
+    </style>
+
+</resources>
diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/xml/prefs.xml b/samples/SupportLeanbackShowcase/app/src/main/res/xml/prefs.xml
new file mode 100644
index 0000000..f0edd0e
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/app/src/main/res/xml/prefs.xml
@@ -0,0 +1,113 @@
+<?xml version="1.0" encoding="utf-8"?>
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+                  xmlns:app="http://schemas.android.com/apk/res-auto"
+                  android:summary="This is a dummy activitiy only to show case how to build a settings in an application. Changing configurations in this example doesn't affect anything."
+                  android:title="Settings Example">
+    <PreferenceScreen
+        android:icon="@drawable/ic_settings_wifi_4_bar"
+        android:key="prefs_wifi_screen_key"
+        android:title="Wi-Fi">
+        <PreferenceCategory
+            android:key="prefs_wifi_networks_key"
+            android:title="Available Wi-Fi networks">
+            <ListPreference
+                android:defaultValue="-1"
+                android:entries="@array/pref_wifi_networks"
+                android:entryValues="@array/pref_wifi_networks"
+                android:title="Available Wi-Fi networks"
+                android:key="prefs_wifi_key">
+            </ListPreference>
+        </PreferenceCategory>
+        <PreferenceCategory
+            android:key="prefs_wifi_others_key"
+            android:title="Other options">
+            <Preference
+                android:title="Connect via WPS"
+                android:key="prefs_wifi_connect_wps"><!-- You can use Intents here -->
+            </Preference>
+        </PreferenceCategory>
+    </PreferenceScreen>
+    <PreferenceScreen
+        android:icon="@drawable/ic_settings_time"
+        android:key="prefs_date_time_screen_key"
+        android:title="Date &amp; time">
+        <CheckBoxPreference
+            android:defaultValue="true"
+            android:disableDependentsState="true"
+            android:key="prefs_date_time_automatic"
+            android:summaryOff="On"
+            android:summaryOn="Off"
+            android:title="Automatic date  &amp; time"></CheckBoxPreference>
+        <Preference
+            android:dependency="prefs_date_time_automatic"
+            android:key="prefs_date"
+            android:summary="01/01/1970"
+            android:title="Date"></Preference>
+        <Preference
+            android:dependency="prefs_date_time_automatic"
+            android:key="prefs_time"
+            android:summary="00:43 PM"
+            android:title="Time"></Preference>
+        <CheckBoxPreference
+            android:defaultValue="true"
+            android:disableDependentsState="true"
+            android:key="prefs_date_time_use_timezone"
+            android:summary="Use network provided time zone"
+            android:title="Automatic time zone"></CheckBoxPreference>
+        <Preference
+            android:dependency="prefs_date_time_use_timezone"
+            android:summary="GMT 07:00 Pacific Daylight Time"
+            android:title="Time zone"></Preference>
+    </PreferenceScreen>
+    <ListPreference
+        android:defaultValue="everyone"
+        android:icon="@drawable/ic_settings_parental_control"
+        android:entries="@array/pref_parent_control_entries"
+        android:entryValues="@array/pref_parent_control_entries_values"
+        android:key="prefs_parental_control_level_key"
+        android:dialogMessage="Allow contents rated for"
+        android:title="Parental Control">
+    </ListPreference>
+    <PreferenceScreen
+        android:icon="@drawable/ic_settings_apps"
+        android:key="prefs_apps_screen_key"
+        android:title="Apps">
+        <PreferenceCategory
+            android:key="prefs_app_settings_category"
+            android:title="Apps settings">
+            <PreferenceScreen
+                android:key="prefs_app_settings_screen_key"
+                android:summary="Lorem ipsum dolor sit amet consectur adipiscing."
+                android:title="App permissions">
+                <Preference
+                    android:icon="@mipmap/app_banner_sample_app"
+                    android:summary="45.5 MB"
+                    android:selectable="false"
+                    android:title="Application A"></Preference>
+                <Preference
+                    android:selectable="false"
+                    android:summary="Hier steht ein voelligst sinnfreier Text den ja sowieso niemandhier lesen kann. Deshalb macht es auch keinen Unterschied ob hier sinnvolles und nicht so sinnvolles Zeug steht. Hm... Sasha, du kannst das vielleicht lesen und denkst dir jetzt auch, dass ich voll haengen geblieben bin, oder?... ^_^"></Preference>
+                <SwitchPreference
+                    android:title="Notifications"
+                    android:key="pref_force_stop"><!-- Start an Intent --></SwitchPreference>
+                <Preference
+                    android:title="Uninstall"
+                    android:key="pref_uninstall"><!-- Start an Intent --></Preference>
+                <Preference
+                    android:title="More Information"
+                    android:key="pref_more_info"></Preference>
+            </PreferenceScreen>
+        </PreferenceCategory>
+        <PreferenceCategory
+            android:key="prefs_app_downloaded_apps_category"
+            android:title="Downloaded Apps">
+            <ListPreference
+                android:defaultValue="everyone"
+                android:entries="@array/pref_parent_control_entries"
+                android:entryValues="@array/pref_parent_control_entries_values"
+                android:key="prefs_parental_control_level_key"
+                android:title="Downloaded Apps">
+            </ListPreference>
+        </PreferenceCategory>
+    </PreferenceScreen>
+</PreferenceScreen>
diff --git a/samples/SupportLeanbackShowcase/build-local.py b/samples/SupportLeanbackShowcase/build-local.py
new file mode 100644
index 0000000..fce46a1
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/build-local.py
@@ -0,0 +1,65 @@
+# BUILDING SupportLeanbackShowcase app using local library.
+import sys
+import subprocess
+import os
+import fileinput
+import re
+
+# Does an inplace substitution of the pattern with newVal in inputFile
+def replace(inputFile, pattern, newVal, ):
+  print 'About to replace repo path to {0} in {1}'.format(newVal, inputFile)
+  replaced = False
+  try:
+    for line in fileinput.input(inputFile, inplace = 1):
+      if re.match(pattern, line, re.I|re.M):
+        line = re.sub(pattern, newVal, line)
+        replaced = True
+      print line,
+  except IOError as e:
+    print "Failed to open file ", e
+
+  if not replaced:
+    file = open(inputFile, "a")
+    file.write(newVal + "\n")
+
+# Finds the local leanback library version based on leanback-v17/maven-metadata.xml
+def lookup_local_library_version(repo_path):
+  leanback_maven_metadata_path = repo_path + "/out/host/gradle/frameworks/support/build/support_repo/com/android/support/leanback-v17/maven-metadata.xml"
+  if not os.path.exists(leanback_maven_metadata_path):
+    print "ERROR: Missing leanback-v17 library {} in local repo".format(leanback_maven_metadata_path)
+
+  file = open(leanback_maven_metadata_path, "r")
+  for line in file:
+    matchObj = re.match(r'\s*<version>(.*)</version>', line)
+    if matchObj:
+      return matchObj.group(1).strip(' \t\n\r')
+
+# Get repo path
+current_path = os.getcwd()
+index = current_path.find("development/samples/SupportLeanbackShowcase")
+if index < 0:
+  print "ERROR: Invalid repo {0}".format(current_path)
+  exit(0)
+
+repo_path = current_path[:index]
+support_frameworks_path = repo_path + "/frameworks/support"
+if not (os.path.isdir(repo_path) or os.path.isdir(support_frameworks_path)):
+  print 'ERROR : Repo "{0}" does not exist'.format(repo_path)
+  print 'Please run gradlew uploadArchives inside frameworks/support'
+  exit(0)
+
+# Substitute LIBRARY_VERSION/LOCAL_REPO in local.properties
+library_version = lookup_local_library_version(repo_path)
+replace(os.getcwd()+"/local.properties", r'(.*)LOCAL_REPO(.*)', 'LOCAL_REPO='+repo_path)
+replace(os.getcwd()+"/local.properties", r'(.*)LIBRARY_VERSION(.*)', 'LIBRARY_VERSION='+library_version)
+
+# Build
+print "Building SupportLeanbackShowcase app..."
+subprocess.call(["./gradlew", "assembleDebug"])
+
+#Install apk
+print "Installing SupportLeanbackShowcase..."
+subprocess.call(["adb", "install", "-r", "./app/build/outputs/apk/app-debug.apk"])
+
+print "Finished installing SupportLeanbackShowcase app."
+
diff --git a/samples/SupportLeanbackShowcase/build-release.py b/samples/SupportLeanbackShowcase/build-release.py
new file mode 100644
index 0000000..a70e283
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/build-release.py
@@ -0,0 +1,39 @@
+# BUILDING SupportLeanbackShowcase app using local library.
+import sys
+import subprocess
+import os
+import fileinput
+import re
+
+# Does an inplace substitution of the pattern with newVal in inputFile
+def replace(inputFile, pattern, newVal, ):
+  print 'About to replace repo path to {0} in {1}'.format(newVal, inputFile)
+  replaced = False
+  try:
+    for line in fileinput.input(inputFile, inplace = 1):
+      if re.match(pattern, line, re.I|re.M):
+        line = re.sub(pattern, newVal, line)
+        replaced = True
+      print line,
+  except IOError as e:
+    print "Failed to open file ", e
+
+  if not replaced:
+    file = open(inputFile, "a")
+    file.write(newVal + "\n")
+
+# Substitute LIBRARY_VERSION/LOCAL_REPO in local.properties
+# It will use default values in build.gradle
+replace(os.getcwd()+"/local.properties", r'(.*)LOCAL_REPO(.*)', 'LOCAL_REPO=')
+replace(os.getcwd()+"/local.properties", r'(.*)LIBRARY_VERSION(.*)', 'LIBRARY_VERSION=')
+
+# Build
+print "Building SupportLeanbackShowcase app..."
+subprocess.call(["./gradlew", "assembleDebug"])
+
+#Install apk
+print "Installing SupportLeanbackShowcase..."
+subprocess.call(["adb", "install", "-r", "./app/build/outputs/apk/app-debug.apk"])
+
+print "Finished installing SupportLeanbackShowcase app."
+
diff --git a/samples/SupportLeanbackShowcase/build.gradle b/samples/SupportLeanbackShowcase/build.gradle
new file mode 100644
index 0000000..b8ec678
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/build.gradle
@@ -0,0 +1,33 @@
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+ext {
+  // This will be set by local.properties file. By default it
+  // will use the public release version (23.2.1). You can run
+  // python build-local.py to build the local verison. That script will
+  // figure out the local library version based on maven metadata for leanback
+  // library and update local.properties file. Gradle build file in turn
+  // will pick up the settings from local.properties.
+  Properties properties = new Properties()
+  properties.load(project.rootProject.file('local.properties').newDataInputStream())
+  supportLibVersion = properties.getProperty('LIBRARY_VERSION')
+  supportLibVersion = supportLibVersion ? supportLibVersion : "23.2.1"
+  localRepo = properties.getProperty('LOCAL_REPO')
+}
+
+buildscript {
+    repositories {
+        jcenter()
+    }
+    dependencies {
+        classpath 'com.android.tools.build:gradle:2.1.0'
+
+        // NOTE: Do not place your application dependencies here; they belong
+        // in the individual module build.gradle files
+    }
+}
+
+allprojects {
+    repositories {
+        maven { url "${localRepo}/out/host/gradle/frameworks/support/build/support_repo/"}
+        jcenter()
+    }
+}
diff --git a/samples/SupportLeanbackShowcase/gradle.properties b/samples/SupportLeanbackShowcase/gradle.properties
new file mode 100644
index 0000000..1d3591c
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/gradle.properties
@@ -0,0 +1,18 @@
+# Project-wide Gradle settings.
+
+# IDE (e.g. Android Studio) users:
+# Gradle settings configured through the IDE *will override*
+# any settings specified in this file.
+
+# For more details on how to configure your build environment visit
+# http://www.gradle.org/docs/current/userguide/build_environment.html
+
+# Specifies the JVM arguments used for the daemon process.
+# The setting is particularly useful for tweaking memory settings.
+# Default value: -Xmx10248m -XX:MaxPermSize=256m
+# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
+
+# When configured, Gradle will run in incubating parallel mode.
+# This option should only be used with decoupled projects. More details, visit
+# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
+# org.gradle.parallel=true
\ No newline at end of file
diff --git a/samples/SupportLeanbackShowcase/gradle/wrapper/gradle-wrapper.jar b/samples/SupportLeanbackShowcase/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..8c0fb64
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/gradle/wrapper/gradle-wrapper.jar
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/gradle/wrapper/gradle-wrapper.properties b/samples/SupportLeanbackShowcase/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..fdb8024
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Wed Apr 10 15:27:10 PDT 2013
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-bin.zip
diff --git a/samples/SupportLeanbackShowcase/gradlew b/samples/SupportLeanbackShowcase/gradlew
new file mode 100755
index 0000000..91a7e26
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/gradlew
@@ -0,0 +1,164 @@
+#!/usr/bin/env bash
+
+##############################################################################
+##
+##  Gradle start up script for UN*X
+##
+##############################################################################
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn ( ) {
+    echo "$*"
+}
+
+die ( ) {
+    echo
+    echo "$*"
+    echo
+    exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+case "`uname`" in
+  CYGWIN* )
+    cygwin=true
+    ;;
+  Darwin* )
+    darwin=true
+    ;;
+  MINGW* )
+    msys=true
+    ;;
+esac
+
+# For Cygwin, ensure paths are in UNIX format before anything is touched.
+if $cygwin ; then
+    [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
+fi
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+    ls=`ls -ld "$PRG"`
+    link=`expr "$ls" : '.*-> \(.*\)$'`
+    if expr "$link" : '/.*' > /dev/null; then
+        PRG="$link"
+    else
+        PRG=`dirname "$PRG"`"/$link"
+    fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >&-
+APP_HOME="`pwd -P`"
+cd "$SAVED" >&-
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+        # IBM's JDK on AIX uses strange locations for the executables
+        JAVACMD="$JAVA_HOME/jre/sh/java"
+    else
+        JAVACMD="$JAVA_HOME/bin/java"
+    fi
+    if [ ! -x "$JAVACMD" ] ; then
+        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+    fi
+else
+    JAVACMD="java"
+    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
+    MAX_FD_LIMIT=`ulimit -H -n`
+    if [ $? -eq 0 ] ; then
+        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+            MAX_FD="$MAX_FD_LIMIT"
+        fi
+        ulimit -n $MAX_FD
+        if [ $? -ne 0 ] ; then
+            warn "Could not set maximum file descriptor limit: $MAX_FD"
+        fi
+    else
+        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+    fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+
+    # We build the pattern for arguments to be converted via cygpath
+    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+    SEP=""
+    for dir in $ROOTDIRSRAW ; do
+        ROOTDIRS="$ROOTDIRS$SEP$dir"
+        SEP="|"
+    done
+    OURCYGPATTERN="(^($ROOTDIRS))"
+    # Add a user-defined pattern to the cygpath arguments
+    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+    fi
+    # Now convert the arguments - kludge to limit ourselves to /bin/sh
+    i=0
+    for arg in "$@" ; do
+        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option
+
+        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
+            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+        else
+            eval `echo args$i`="\"$arg\""
+        fi
+        i=$((i+1))
+    done
+    case $i in
+        (0) set -- ;;
+        (1) set -- "$args0" ;;
+        (2) set -- "$args0" "$args1" ;;
+        (3) set -- "$args0" "$args1" "$args2" ;;
+        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+    esac
+fi
+
+# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
+function splitJvmOpts() {
+    JVM_OPTS=("$@")
+}
+eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
+JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
+
+exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
diff --git a/samples/SupportLeanbackShowcase/gradlew.bat b/samples/SupportLeanbackShowcase/gradlew.bat
new file mode 100644
index 0000000..aec9973
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/gradlew.bat
@@ -0,0 +1,90 @@
+@if "%DEBUG%" == "" @echo off

+@rem ##########################################################################

+@rem

+@rem  Gradle startup script for Windows

+@rem

+@rem ##########################################################################

+

+@rem Set local scope for the variables with windows NT shell

+if "%OS%"=="Windows_NT" setlocal

+

+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.

+set DEFAULT_JVM_OPTS=

+

+set DIRNAME=%~dp0

+if "%DIRNAME%" == "" set DIRNAME=.

+set APP_BASE_NAME=%~n0

+set APP_HOME=%DIRNAME%

+

+@rem Find java.exe

+if defined JAVA_HOME goto findJavaFromJavaHome

+

+set JAVA_EXE=java.exe

+%JAVA_EXE% -version >NUL 2>&1

+if "%ERRORLEVEL%" == "0" goto init

+

+echo.

+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.

+echo.

+echo Please set the JAVA_HOME variable in your environment to match the

+echo location of your Java installation.

+

+goto fail

+

+:findJavaFromJavaHome

+set JAVA_HOME=%JAVA_HOME:"=%

+set JAVA_EXE=%JAVA_HOME%/bin/java.exe

+

+if exist "%JAVA_EXE%" goto init

+

+echo.

+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%

+echo.

+echo Please set the JAVA_HOME variable in your environment to match the

+echo location of your Java installation.

+

+goto fail

+

+:init

+@rem Get command-line arguments, handling Windowz variants

+

+if not "%OS%" == "Windows_NT" goto win9xME_args

+if "%@eval[2+2]" == "4" goto 4NT_args

+

+:win9xME_args

+@rem Slurp the command line arguments.

+set CMD_LINE_ARGS=

+set _SKIP=2

+

+:win9xME_args_slurp

+if "x%~1" == "x" goto execute

+

+set CMD_LINE_ARGS=%*

+goto execute

+

+:4NT_args

+@rem Get arguments from the 4NT Shell from JP Software

+set CMD_LINE_ARGS=%$

+

+:execute

+@rem Setup the command line

+

+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar

+

+@rem Execute Gradle

+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%

+

+:end

+@rem End local scope for the variables with windows NT shell

+if "%ERRORLEVEL%"=="0" goto mainEnd

+

+:fail

+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of

+rem the _cmd.exe /c_ return code!

+if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1

+exit /b 1

+

+:mainEnd

+if "%OS%"=="Windows_NT" endlocal

+

+:omega

diff --git a/samples/SupportLeanbackShowcase/libs/gson-1.7.2.jar b/samples/SupportLeanbackShowcase/libs/gson-1.7.2.jar
new file mode 100644
index 0000000..99e7afc
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/libs/gson-1.7.2.jar
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/libs/picasso-2.5.2.jar b/samples/SupportLeanbackShowcase/libs/picasso-2.5.2.jar
new file mode 100644
index 0000000..6acbaa1
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/libs/picasso-2.5.2.jar
Binary files differ
diff --git a/samples/SupportLeanbackShowcase/settings.gradle b/samples/SupportLeanbackShowcase/settings.gradle
new file mode 100644
index 0000000..e7b4def
--- /dev/null
+++ b/samples/SupportLeanbackShowcase/settings.gradle
@@ -0,0 +1 @@
+include ':app'
diff --git a/samples/SupportPercentDemos/Android.mk b/samples/SupportPercentDemos/Android.mk
new file mode 100644
index 0000000..e2d4e4a7
--- /dev/null
+++ b/samples/SupportPercentDemos/Android.mk
@@ -0,0 +1,37 @@
+# Copyright (C) 2015 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.
+
+LOCAL_PATH:= $(call my-dir)
+
+# Build the samples.
+# We need to add some special AAPT flags to generate R classes
+# for resources that are included from the libraries.
+include $(CLEAR_VARS)
+LOCAL_PACKAGE_NAME := SupportPercentDemos
+LOCAL_MODULE_TAGS := samples
+LOCAL_SDK_VERSION := current
+LOCAL_MIN_SDK_VERSION := 7
+LOCAL_DEX_PREOPT := false
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+LOCAL_STATIC_JAVA_LIBRARIES := \
+        android-support-percent \
+        android-support-v4 \
+        android-support-v13
+LOCAL_RESOURCE_DIR = \
+        $(LOCAL_PATH)/res \
+        frameworks/support/percent/res
+LOCAL_AAPT_FLAGS := \
+        --auto-add-overlay \
+        --extra-packages android.support.percent
+include $(BUILD_PACKAGE)
diff --git a/samples/SupportPercentDemos/AndroidManifest.xml b/samples/SupportPercentDemos/AndroidManifest.xml
new file mode 100644
index 0000000..71fea32
--- /dev/null
+++ b/samples/SupportPercentDemos/AndroidManifest.xml
@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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"
+    package="com.example.android.support.percent">
+
+    <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="21" />
+
+    <application android:label="@string/activity_sample_code"
+            android:supportsRtl="true"
+            android:icon="@drawable/app_sample_code">
+
+        <activity android:name="SupportPercentDemos">
+            <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=".SimplePercentFrameLayoutActivity"
+                  android:label="@string/simple_percent_frame_demo">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+                <category android:name="com.example.android.supportpercent.SAMPLE_CODE"/>
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".IncludePercentFrameLayoutActivity"
+                  android:label="@string/include_percent_frame_demo">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+                <category android:name="com.example.android.supportpercent.SAMPLE_CODE"/>
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".PercentFrameLayoutActivityHPaddings"
+                  android:label="@string/percent_frame_hpaddings_demo">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+                <category android:name="com.example.android.supportpercent.SAMPLE_CODE"/>
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".PercentFrameLayoutActivityVPaddings"
+                  android:label="@string/percent_frame_vpaddings_demo">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+                <category android:name="com.example.android.supportpercent.SAMPLE_CODE"/>
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".SimplePercentRelativeLayoutActivity"
+                  android:label="@string/simple_percent_relative_demo">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+                <category android:name="com.example.android.supportpercent.SAMPLE_CODE"/>
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".PercentRelativeLayoutActivityHPaddings"
+                  android:label="@string/percent_relative_hpaddings_demo">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+                <category android:name="com.example.android.supportpercent.SAMPLE_CODE"/>
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".PercentRelativeLayoutActivityVPaddings"
+                  android:label="@string/percent_relative_vpaddings_demo">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+                <category android:name="com.example.android.supportpercent.SAMPLE_CODE"/>
+            </intent-filter>
+        </activity>
+
+    </application>
+</manifest>
diff --git a/samples/SupportPercentDemos/build.gradle b/samples/SupportPercentDemos/build.gradle
new file mode 100644
index 0000000..a31b343
--- /dev/null
+++ b/samples/SupportPercentDemos/build.gradle
@@ -0,0 +1,31 @@
+apply plugin: 'com.android.application'
+
+dependencies {
+    compile project(':support-percent')
+}
+
+android {
+    compileSdkVersion project.ext.currentSdk
+
+    defaultConfig {
+        minSdkVersion 11
+    }
+
+    sourceSets {
+        main.manifest.srcFile 'AndroidManifest.xml'
+        main.java.srcDirs = ['src']
+        main.aidl.srcDirs = ['src']
+        main.res.srcDirs = ['res']
+    }
+
+    lintOptions {
+        // TODO: fix errors and reenable.
+        abortOnError false
+    }
+
+    compileOptions {
+        sourceCompatibility JavaVersion.VERSION_1_7
+        targetCompatibility JavaVersion.VERSION_1_7
+    }
+}
+
diff --git a/samples/SupportPercentDemos/res/drawable-hdpi/app_sample_code.png b/samples/SupportPercentDemos/res/drawable-hdpi/app_sample_code.png
new file mode 100755
index 0000000..66a1984
--- /dev/null
+++ b/samples/SupportPercentDemos/res/drawable-hdpi/app_sample_code.png
Binary files differ
diff --git a/samples/SupportPercentDemos/res/drawable-mdpi/app_sample_code.png b/samples/SupportPercentDemos/res/drawable-mdpi/app_sample_code.png
new file mode 100644
index 0000000..5ae7701
--- /dev/null
+++ b/samples/SupportPercentDemos/res/drawable-mdpi/app_sample_code.png
Binary files differ
diff --git a/samples/SupportPercentDemos/res/layout/include_percent_frame_layout_activity.xml b/samples/SupportPercentDemos/res/layout/include_percent_frame_layout_activity.xml
new file mode 100644
index 0000000..cf509cb
--- /dev/null
+++ b/samples/SupportPercentDemos/res/layout/include_percent_frame_layout_activity.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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.
+-->
+<android.support.percent.PercentFrameLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+    <include layout="@layout/include_percent_frame_layout_content" />
+</android.support.percent.PercentFrameLayout>
diff --git a/samples/SupportPercentDemos/res/layout/include_percent_frame_layout_content.xml b/samples/SupportPercentDemos/res/layout/include_percent_frame_layout_content.xml
new file mode 100644
index 0000000..2e5a659
--- /dev/null
+++ b/samples/SupportPercentDemos/res/layout/include_percent_frame_layout_content.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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.
+-->
+<merge
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto">
+    <View
+        app:layout_widthPercent="60%"
+        app:layout_heightPercent="60%"
+        app:layout_marginTopPercent="20%"
+        app:layout_marginLeftPercent="20%"
+        android:background="#FF0000" />
+    <View
+        android:layout_gravity="bottom|right"
+        app:layout_widthPercent="20%"
+        app:layout_heightPercent="20%"
+        app:layout_marginRightPercent="40%"
+        app:layout_marginBottomPercent="40%"
+        android:background="#0000FF" />
+</merge>
diff --git a/samples/SupportPercentDemos/res/layout/percent_frame_layout_activity_hpaddings.xml b/samples/SupportPercentDemos/res/layout/percent_frame_layout_activity_hpaddings.xml
new file mode 100644
index 0000000..5cc476d
--- /dev/null
+++ b/samples/SupportPercentDemos/res/layout/percent_frame_layout_activity_hpaddings.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2016 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.
+-->
+<android.support.percent.PercentFrameLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:paddingLeft="48dip"
+    android:paddingRight="64dip">
+    <View
+        android:id="@+id/child1"
+        app:layout_widthPercent="50%"
+        android:layout_height="match_parent"
+        android:layout_gravity="left"
+        android:background="#80FF0000" />
+    <View
+        android:id="@+id/child2"
+        app:layout_widthPercent="50%"
+        android:layout_height="match_parent"
+        android:layout_gravity="right"
+        android:background="#800000FF" />
+</android.support.percent.PercentFrameLayout>
diff --git a/samples/SupportPercentDemos/res/layout/percent_frame_layout_activity_vpaddings.xml b/samples/SupportPercentDemos/res/layout/percent_frame_layout_activity_vpaddings.xml
new file mode 100644
index 0000000..d71c368
--- /dev/null
+++ b/samples/SupportPercentDemos/res/layout/percent_frame_layout_activity_vpaddings.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2016 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.
+-->
+<android.support.percent.PercentFrameLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:paddingTop="48dip"
+    android:paddingBottom="64dip">
+    <View
+        android:id="@+id/child1"
+        android:layout_width="match_parent"
+        app:layout_heightPercent="50%"
+        android:layout_gravity="top"
+        android:background="#80FF0000" />
+    <View
+        android:id="@+id/child2"
+        android:layout_width="match_parent"
+        app:layout_heightPercent="50%"
+        android:layout_gravity="bottom"
+        android:background="#800000FF" />
+</android.support.percent.PercentFrameLayout>
diff --git a/samples/SupportPercentDemos/res/layout/percent_relative_layout_activity_hpaddings.xml b/samples/SupportPercentDemos/res/layout/percent_relative_layout_activity_hpaddings.xml
new file mode 100644
index 0000000..2d6f1e0
--- /dev/null
+++ b/samples/SupportPercentDemos/res/layout/percent_relative_layout_activity_hpaddings.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2016 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.
+-->
+<android.support.percent.PercentRelativeLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:paddingLeft="48dip"
+    android:paddingRight="64dip">
+    <View
+        android:id="@+id/child1"
+        app:layout_widthPercent="50%"
+        android:layout_height="match_parent"
+        android:layout_alignParentLeft="true"
+        android:background="#80FF0000" />
+    <View
+        android:id="@+id/child2"
+        app:layout_widthPercent="50%"
+        android:layout_height="match_parent"
+        android:layout_toRightOf="@id/child1"
+        android:background="#800000FF" />
+</android.support.percent.PercentRelativeLayout>
diff --git a/samples/SupportPercentDemos/res/layout/percent_relative_layout_activity_vpaddings.xml b/samples/SupportPercentDemos/res/layout/percent_relative_layout_activity_vpaddings.xml
new file mode 100644
index 0000000..33defde
--- /dev/null
+++ b/samples/SupportPercentDemos/res/layout/percent_relative_layout_activity_vpaddings.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2016 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.
+-->
+<android.support.percent.PercentRelativeLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:paddingTop="48dip"
+    android:paddingBottom="64dip">
+    <View
+        android:id="@+id/child1"
+        android:layout_width="match_parent"
+        app:layout_heightPercent="50%"
+        android:layout_alignParentTop="true"
+        android:background="#80FF0000" />
+    <View
+        android:id="@+id/child2"
+        android:layout_width="match_parent"
+        app:layout_heightPercent="50%"
+        android:layout_below="@id/child1"
+        android:background="#800000FF" />
+</android.support.percent.PercentRelativeLayout>
diff --git a/samples/SupportPercentDemos/res/layout/simple_percent_frame_layout_activity.xml b/samples/SupportPercentDemos/res/layout/simple_percent_frame_layout_activity.xml
new file mode 100644
index 0000000..d662b36
--- /dev/null
+++ b/samples/SupportPercentDemos/res/layout/simple_percent_frame_layout_activity.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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.
+-->
+<android.support.percent.PercentFrameLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+    <View
+        app:layout_widthPercent="50%"
+        app:layout_heightPercent="50%"
+        app:layout_marginTopPercent="25%"
+        app:layout_marginLeftPercent="25%"
+        android:background="#FF0000" />
+    <View
+        android:layout_gravity="bottom|right"
+        app:layout_widthPercent="33.33%"
+        app:layout_heightPercent="33.33%"
+        app:layout_marginRightPercent="33.33%"
+        app:layout_marginBottomPercent="33.33%"
+        android:background="#0000FF" />
+</android.support.percent.PercentFrameLayout>
diff --git a/samples/SupportPercentDemos/res/layout/simple_percent_relative_layout_activity.xml b/samples/SupportPercentDemos/res/layout/simple_percent_relative_layout_activity.xml
new file mode 100644
index 0000000..40904c1
--- /dev/null
+++ b/samples/SupportPercentDemos/res/layout/simple_percent_relative_layout_activity.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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.
+-->
+<android.support.percent.PercentRelativeLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+    <View
+        android:id="@+id/left"
+        app:layout_widthPercent="25%"
+        app:layout_heightPercent="50%"
+        app:layout_marginLeftPercent="25%"
+        app:layout_marginTopPercent="25%"
+        android:background="#FF0000" />
+    <View
+        app:layout_widthPercent="25%"
+        app:layout_heightPercent="50%"
+        app:layout_marginTopPercent="25%"
+        android:layout_toRightOf="@id/left"
+        android:background="#0000FF" />
+</android.support.percent.PercentRelativeLayout>
diff --git a/samples/SupportPercentDemos/res/values/strings.xml b/samples/SupportPercentDemos/res/values/strings.xml
new file mode 100644
index 0000000..782532e
--- /dev/null
+++ b/samples/SupportPercentDemos/res/values/strings.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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="activity_sample_code">Support Percent Demos</string>
+
+    <string name="simple_percent_frame_demo">PercentFrameLayout / Basic</string>
+    <string name="include_percent_frame_demo">PercentFrameLayout / With include</string>
+    <string name="percent_frame_vpaddings_demo">PercentFrameLayout / With vertical paddings</string>
+    <string name="percent_frame_hpaddings_demo">PercentFrameLayout / With horizontal paddings</string>
+    <string name="simple_percent_relative_demo">PercentRelativeLayout / Basic</string>
+    <string name="percent_relative_vpaddings_demo">PercentRelativeLayout / With vertical paddings</string>
+    <string name="percent_relative_hpaddings_demo">PercentRelativeLayout / With horizontal paddings</string>
+</resources>
diff --git a/samples/SupportPercentDemos/src/com/example/android/support/percent/IncludePercentFrameLayoutActivity.java b/samples/SupportPercentDemos/src/com/example/android/support/percent/IncludePercentFrameLayoutActivity.java
new file mode 100644
index 0000000..1d9dad9
--- /dev/null
+++ b/samples/SupportPercentDemos/src/com/example/android/support/percent/IncludePercentFrameLayoutActivity.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.support.percent;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+public class IncludePercentFrameLayoutActivity extends Activity {
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.include_percent_frame_layout_activity);
+    }
+}
diff --git a/samples/SupportPercentDemos/src/com/example/android/support/percent/PercentFrameLayoutActivityHPaddings.java b/samples/SupportPercentDemos/src/com/example/android/support/percent/PercentFrameLayoutActivityHPaddings.java
new file mode 100644
index 0000000..bf5e5ea
--- /dev/null
+++ b/samples/SupportPercentDemos/src/com/example/android/support/percent/PercentFrameLayoutActivityHPaddings.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.support.percent;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+public class PercentFrameLayoutActivityHPaddings extends Activity {
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.percent_frame_layout_activity_hpaddings);
+    }
+}
diff --git a/samples/SupportPercentDemos/src/com/example/android/support/percent/PercentFrameLayoutActivityVPaddings.java b/samples/SupportPercentDemos/src/com/example/android/support/percent/PercentFrameLayoutActivityVPaddings.java
new file mode 100644
index 0000000..34f9ea7
--- /dev/null
+++ b/samples/SupportPercentDemos/src/com/example/android/support/percent/PercentFrameLayoutActivityVPaddings.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.support.percent;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+public class PercentFrameLayoutActivityVPaddings extends Activity {
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.percent_frame_layout_activity_vpaddings);
+    }
+}
diff --git a/samples/SupportPercentDemos/src/com/example/android/support/percent/PercentRelativeLayoutActivityHPaddings.java b/samples/SupportPercentDemos/src/com/example/android/support/percent/PercentRelativeLayoutActivityHPaddings.java
new file mode 100644
index 0000000..232fdbe
--- /dev/null
+++ b/samples/SupportPercentDemos/src/com/example/android/support/percent/PercentRelativeLayoutActivityHPaddings.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.support.percent;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+public class PercentRelativeLayoutActivityHPaddings extends Activity {
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.percent_relative_layout_activity_hpaddings);
+    }
+}
diff --git a/samples/SupportPercentDemos/src/com/example/android/support/percent/PercentRelativeLayoutActivityVPaddings.java b/samples/SupportPercentDemos/src/com/example/android/support/percent/PercentRelativeLayoutActivityVPaddings.java
new file mode 100644
index 0000000..928a511
--- /dev/null
+++ b/samples/SupportPercentDemos/src/com/example/android/support/percent/PercentRelativeLayoutActivityVPaddings.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.support.percent;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+public class PercentRelativeLayoutActivityVPaddings extends Activity {
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.percent_relative_layout_activity_vpaddings);
+    }
+}
diff --git a/samples/SupportPercentDemos/src/com/example/android/support/percent/SimplePercentFrameLayoutActivity.java b/samples/SupportPercentDemos/src/com/example/android/support/percent/SimplePercentFrameLayoutActivity.java
new file mode 100644
index 0000000..b556692
--- /dev/null
+++ b/samples/SupportPercentDemos/src/com/example/android/support/percent/SimplePercentFrameLayoutActivity.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.support.percent;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+public class SimplePercentFrameLayoutActivity extends Activity {
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.simple_percent_frame_layout_activity);
+    }
+}
diff --git a/samples/SupportPercentDemos/src/com/example/android/support/percent/SimplePercentRelativeLayoutActivity.java b/samples/SupportPercentDemos/src/com/example/android/support/percent/SimplePercentRelativeLayoutActivity.java
new file mode 100644
index 0000000..2b7ffb7
--- /dev/null
+++ b/samples/SupportPercentDemos/src/com/example/android/support/percent/SimplePercentRelativeLayoutActivity.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.support.percent;
+
+import android.app.Activity;
+import android.os.Bundle;
+
+public class SimplePercentRelativeLayoutActivity extends Activity {
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.simple_percent_relative_layout_activity);
+    }
+}
diff --git a/samples/SupportPercentDemos/src/com/example/android/support/percent/SupportPercentDemos.java b/samples/SupportPercentDemos/src/com/example/android/support/percent/SupportPercentDemos.java
new file mode 100644
index 0000000..eb2af5e
--- /dev/null
+++ b/samples/SupportPercentDemos/src/com/example/android/support/percent/SupportPercentDemos.java
@@ -0,0 +1,151 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.support.percent;
+
+import android.app.ListActivity;
+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 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;
+
+public class SupportPercentDemos extends ListActivity {
+
+    @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);
+    }
+
+    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.example.android.supportpercent.SAMPLE_CODE");
+
+        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();
+
+                @Override
+                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, SupportPercentDemos.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/SupportPreferenceDemos/AndroidManifest.xml b/samples/SupportPreferenceDemos/AndroidManifest.xml
new file mode 100644
index 0000000..e43cb44
--- /dev/null
+++ b/samples/SupportPreferenceDemos/AndroidManifest.xml
@@ -0,0 +1,71 @@
+<!--
+  ~ Copyright (C) 2016 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License
+  -->
+
+<manifest
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    package="com.example.android.supportpreference">
+
+    <uses-sdk android:targetSdkVersion="24"
+        tools:overrideLibrary="android.support.v17.preference, android.support.v17.leanback" />
+
+    <uses-feature android:name="android.software.Leanback" android:required="false" />
+
+    <application android:label="pref demo"
+        android:icon="@drawable/app_sample_code"
+        android:allowBackup="false"
+        android:theme="@style/DemoTheme">
+
+        <activity android:name=".SupportPreferenceDemos">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.DEFAULT" />
+                <category android:name="android.intent.category.LAUNCHER" />
+                <category android:name="android.intent.category.LEANBACK_LAUNCHER" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".FragmentSupportPreferences"
+            android:label="@string/fragment_support_preferences_demo"
+            android:theme="@style/SupportPreference">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+                <category android:name="com.example.android.supportpreference.SAMPLE_CODE"/>
+            </intent-filter>
+        </activity>
+
+        <activity android:name=".FragmentSupportPreferencesCompat"
+            android:label="@string/fragment_support_preferences_compat_demo"
+            android:theme="@style/SupportPreferenceCompat">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+                <category android:name="com.example.android.supportpreference.SAMPLE_CODE"/>
+            </intent-filter>
+        </activity>
+
+        <!-- Nothing technically wrong with showing this on a non-TV platform -->
+        <activity android:name=".FragmentSupportPreferencesLeanback"
+            android:label="@string/fragment_support_preferences_leanback_demo"
+            android:theme="@style/SupportPreferenceLeanback"
+            android:enabled="@bool/atLeastJellyBeanMR2">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+                <category android:name="com.example.android.supportpreference.SAMPLE_CODE"/>
+            </intent-filter>
+        </activity>
+
+    </application>
+</manifest>
diff --git a/samples/SupportPreferenceDemos/build.gradle b/samples/SupportPreferenceDemos/build.gradle
new file mode 100644
index 0000000..8db2a01
--- /dev/null
+++ b/samples/SupportPreferenceDemos/build.gradle
@@ -0,0 +1,30 @@
+apply plugin: 'com.android.application'
+
+dependencies {
+    compile project(':support-appcompat-v7')
+    compile project(':support-recyclerview-v7')
+    compile project(':support-preference-v7')
+    compile project(':support-preference-v14')
+    compile project(':support-leanback-v17')
+    compile project(':support-preference-leanback-v17')
+}
+
+android {
+    compileSdkVersion project.ext.currentSdk
+
+    defaultConfig {
+        minSdkVersion 14
+    }
+
+    sourceSets {
+        main.manifest.srcFile 'AndroidManifest.xml'
+        main.java.srcDirs = ['src']
+        main.aidl.srcDirs = ['src']
+        main.res.srcDirs = ['res']
+    }
+
+    compileOptions {
+        sourceCompatibility JavaVersion.VERSION_1_7
+        targetCompatibility JavaVersion.VERSION_1_7
+    }
+}
diff --git a/samples/SupportPreferenceDemos/res/drawable-hdpi/app_sample_code.png b/samples/SupportPreferenceDemos/res/drawable-hdpi/app_sample_code.png
new file mode 100755
index 0000000..66a1984
--- /dev/null
+++ b/samples/SupportPreferenceDemos/res/drawable-hdpi/app_sample_code.png
Binary files differ
diff --git a/samples/SupportPreferenceDemos/res/drawable-mdpi/app_sample_code.png b/samples/SupportPreferenceDemos/res/drawable-mdpi/app_sample_code.png
new file mode 100644
index 0000000..5ae7701
--- /dev/null
+++ b/samples/SupportPreferenceDemos/res/drawable-mdpi/app_sample_code.png
Binary files differ
diff --git a/samples/SupportPreferenceDemos/res/values-v17/bools.xml b/samples/SupportPreferenceDemos/res/values-v17/bools.xml
new file mode 100644
index 0000000..135ce3f
--- /dev/null
+++ b/samples/SupportPreferenceDemos/res/values-v17/bools.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2016 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>
+    <!-- This resource is true if running under at least JellyBean MR2
+    API level.  The default value is false; an alternative value
+    for JellyBean MR 2 is true. -->
+    <bool name="atLeastJellyBeanMR2">true</bool>
+</resources>
diff --git a/samples/SupportPreferenceDemos/res/values-v21/styles.xml b/samples/SupportPreferenceDemos/res/values-v21/styles.xml
new file mode 100644
index 0000000..16de590
--- /dev/null
+++ b/samples/SupportPreferenceDemos/res/values-v21/styles.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2016 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>
+
+    <style name="DemoTheme" parent="android:Theme.Material.Light.DarkActionBar" />
+
+</resources>
diff --git a/samples/SupportPreferenceDemos/res/values/arrays.xml b/samples/SupportPreferenceDemos/res/values/arrays.xml
new file mode 100644
index 0000000..6ab7e36
--- /dev/null
+++ b/samples/SupportPreferenceDemos/res/values/arrays.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2016 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="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>
+</resources>
diff --git a/samples/SupportPreferenceDemos/res/values/bools.xml b/samples/SupportPreferenceDemos/res/values/bools.xml
new file mode 100644
index 0000000..60a5a88
--- /dev/null
+++ b/samples/SupportPreferenceDemos/res/values/bools.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2016 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>
+    <!-- This resource is true if running under at least JellyBean MR2
+    API level.  The default value is false; an alternative value
+    for JellyBean MR 2 is true. -->
+    <bool name="atLeastJellyBeanMR2">false</bool>
+</resources>
diff --git a/samples/SupportPreferenceDemos/res/values/strings.xml b/samples/SupportPreferenceDemos/res/values/strings.xml
new file mode 100644
index 0000000..219808d
--- /dev/null
+++ b/samples/SupportPreferenceDemos/res/values/strings.xml
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2016 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="fragment_support_preferences_demo">Support PreferenceFragment</string>
+    <string name="fragment_support_preferences_compat_demo">Support PreferenceFragmentCompat</string>
+    <string name="fragment_support_preferences_leanback_demo">Support LeanbackPreferenceFragment</string>
+
+    <string name="root_title">Demo Preferences</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_switch_preference">Switch preference</string>
+    <string name="summary_switch_preference">This is a switch</string>
+    <string name="summary_switch_preference_yes_no">This is a switch with custom text</string>
+
+    <string name="title_yesno_preference">Yes or no preference</string>
+    <string name="summary_yesno_preference">An example that uses a yes/no dialog</string>
+    <string name="dialog_title_yesno_preference">Do you like bananas?</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_screen_preference">Screen preference</string>
+    <string name="summary_screen_preference">Shows another screen of preferences</string>
+
+    <string name="title_fragment_preference">Fragment preference</string>
+    <string name="summary_fragment_preference">Shows another fragment of preferences</string>
+
+    <string name="title_next_screen_toggle_preference">Toggle preference</string>
+    <string name="summary_next_screen_toggle_preference">Preference that is on the next screen but same hierarchy</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/SupportPreferenceDemos/res/values/styles.xml b/samples/SupportPreferenceDemos/res/values/styles.xml
new file mode 100644
index 0000000..5194c9f
--- /dev/null
+++ b/samples/SupportPreferenceDemos/res/values/styles.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2016 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>
+
+    <style name="DemoTheme" parent="android:Theme.Holo.Light.DarkActionBar" />
+
+    <style name="SupportPreference" parent="DemoTheme">
+        <item name="preferenceTheme">@style/PreferenceThemeOverlay.v14.Material</item>
+    </style>
+
+    <style name="SupportPreferenceCompat" parent="Theme.AppCompat.Light.DarkActionBar">
+        <item name="preferenceTheme">@style/PreferenceThemeOverlay</item>
+    </style>
+
+    <style name="SupportPreferenceLeanback" parent="Theme.Leanback">
+        <item name="preferenceTheme">@style/PreferenceThemeOverlay.v14.Leanback</item>
+    </style>
+
+</resources>
diff --git a/samples/SupportPreferenceDemos/res/xml/preferences.xml b/samples/SupportPreferenceDemos/res/xml/preferences.xml
new file mode 100644
index 0000000..5aa72d3
--- /dev/null
+++ b/samples/SupportPreferenceDemos/res/xml/preferences.xml
@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2016 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. -->
+<!-- BEGIN_INCLUDE(preferences) -->
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:title="@string/root_title">
+
+    <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">
+
+        <!-- This PreferenceScreen tag serves as a screen break (similar to page break
+             in word processing). Like for other preference types, we assign a key
+             here so it is able to save and restore its instance state. -->
+        <PreferenceScreen
+            android:key="screen_preference"
+            android:title="@string/title_screen_preference"
+            android:summary="@string/summary_screen_preference">
+
+            <!-- You can place more preferences here that will be shown on the next screen. -->
+
+            <CheckBoxPreference
+                android:key="next_screen_checkbox_preference"
+                android:title="@string/title_next_screen_toggle_preference"
+                android:summary="@string/summary_next_screen_toggle_preference" />
+
+        </PreferenceScreen>
+
+        <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>
+<!-- END_INCLUDE(preferences) -->
diff --git a/samples/SupportPreferenceDemos/src/com/example/android/supportpreference/FragmentSupportPreferences.java b/samples/SupportPreferenceDemos/src/com/example/android/supportpreference/FragmentSupportPreferences.java
new file mode 100644
index 0000000..298d0e5
--- /dev/null
+++ b/samples/SupportPreferenceDemos/src/com/example/android/supportpreference/FragmentSupportPreferences.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.example.android.supportpreference;
+
+import android.app.Activity;
+import android.app.Fragment;
+import android.os.Bundle;
+import android.support.v14.preference.PreferenceFragment;
+import android.support.v7.preference.PreferenceScreen;
+
+/**
+ * Demonstration of PreferenceFragment, showing a single fragment in an
+ * activity.
+ */
+public class FragmentSupportPreferences extends Activity
+        implements PreferenceFragment.OnPreferenceStartScreenCallback {
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        // Display the fragment as the main content.
+        getFragmentManager().beginTransaction().replace(android.R.id.content,
+                new PrefsFragment()).commit();
+    }
+
+    @Override
+    public boolean onPreferenceStartScreen(PreferenceFragment caller, PreferenceScreen pref) {
+        final Fragment f = new PrefsFragment();
+        final Bundle args = new Bundle(1);
+        args.putString(PreferenceFragment.ARG_PREFERENCE_ROOT, pref.getKey());
+        f.setArguments(args);
+        getFragmentManager().beginTransaction().replace(android.R.id.content, f)
+                .addToBackStack(null)
+                .commit();
+        return true;
+    }
+
+    //BEGIN_INCLUDE(support_fragment)
+    public static class PrefsFragment extends PreferenceFragment {
+
+        @Override
+        public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+            // Load the preferences from an XML resource
+            setPreferencesFromResource(R.xml.preferences, rootKey);
+        }
+    }
+//END_INCLUDE(support_fragment)
+}
diff --git a/samples/SupportPreferenceDemos/src/com/example/android/supportpreference/FragmentSupportPreferencesCompat.java b/samples/SupportPreferenceDemos/src/com/example/android/supportpreference/FragmentSupportPreferencesCompat.java
new file mode 100644
index 0000000..c716bed
--- /dev/null
+++ b/samples/SupportPreferenceDemos/src/com/example/android/supportpreference/FragmentSupportPreferencesCompat.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.example.android.supportpreference;
+
+import android.os.Bundle;
+import android.support.v4.app.Fragment;
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.preference.PreferenceFragmentCompat;
+import android.support.v7.preference.PreferenceScreen;
+
+/**
+ * Demonstration of PreferenceFragment, showing a single fragment in an
+ * activity.
+ */
+public class FragmentSupportPreferencesCompat extends AppCompatActivity
+        implements PreferenceFragmentCompat.OnPreferenceStartScreenCallback {
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        // Display the fragment as the main content.
+        getSupportFragmentManager().beginTransaction().replace(android.R.id.content,
+                new PrefsFragment()).commit();
+    }
+
+    @Override
+    public boolean onPreferenceStartScreen(PreferenceFragmentCompat caller, PreferenceScreen pref) {
+        final Fragment f = new PrefsFragment();
+        final Bundle args = new Bundle(1);
+        args.putString(PreferenceFragmentCompat.ARG_PREFERENCE_ROOT, pref.getKey());
+        f.setArguments(args);
+        getSupportFragmentManager().beginTransaction()
+                .replace(android.R.id.content, f)
+                .addToBackStack(null)
+                .commit();
+        return true;
+    }
+
+    //BEGIN_INCLUDE(support_fragment_compat)
+    public static class PrefsFragment extends PreferenceFragmentCompat {
+
+        @Override
+        public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+            // Load the preferences from an XML resource
+            setPreferencesFromResource(R.xml.preferences, rootKey);
+        }
+    }
+//END_INCLUDE(support_fragment_compat)
+}
diff --git a/samples/SupportPreferenceDemos/src/com/example/android/supportpreference/FragmentSupportPreferencesLeanback.java b/samples/SupportPreferenceDemos/src/com/example/android/supportpreference/FragmentSupportPreferencesLeanback.java
new file mode 100644
index 0000000..35591dc
--- /dev/null
+++ b/samples/SupportPreferenceDemos/src/com/example/android/supportpreference/FragmentSupportPreferencesLeanback.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.example.android.supportpreference;
+
+import android.app.Activity;
+import android.app.Fragment;
+import android.os.Bundle;
+import android.support.v14.preference.PreferenceDialogFragment;
+import android.support.v14.preference.PreferenceFragment;
+import android.support.v17.preference.LeanbackPreferenceFragment;
+import android.support.v17.preference.LeanbackSettingsFragment;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceScreen;
+
+public class FragmentSupportPreferencesLeanback extends Activity {
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        // Display the fragment as the main content.
+        getFragmentManager().beginTransaction().replace(android.R.id.content,
+                new SettingsFragment()).commit();
+    }
+
+//BEGIN_INCLUDE(support_fragment_leanback)
+    public static class SettingsFragment extends LeanbackSettingsFragment {
+        @Override
+        public void onPreferenceStartInitialScreen() {
+            startPreferenceFragment(new PrefsFragment());
+        }
+
+        @Override
+        public boolean onPreferenceStartFragment(PreferenceFragment caller, Preference pref) {
+            final Fragment f =
+                    Fragment.instantiate(getActivity(), pref.getFragment(), pref.getExtras());
+            f.setTargetFragment(caller, 0);
+            if (f instanceof PreferenceFragment || f instanceof PreferenceDialogFragment) {
+                startPreferenceFragment(f);
+            } else {
+                startImmersiveFragment(f);
+            }
+            return true;
+        }
+
+        @Override
+        public boolean onPreferenceStartScreen(PreferenceFragment caller, PreferenceScreen pref) {
+            final Fragment f = new PrefsFragment();
+            final Bundle args = new Bundle(1);
+            args.putString(PreferenceFragment.ARG_PREFERENCE_ROOT, pref.getKey());
+            f.setArguments(args);
+            startPreferenceFragment(f);
+            return true;
+        }
+    }
+
+    public static class PrefsFragment extends LeanbackPreferenceFragment {
+
+        @Override
+        public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+            // Load the preferences from an XML resource
+            setPreferencesFromResource(R.xml.preferences, rootKey);
+        }
+    }
+//END_INCLUDE(support_fragment_leanback)
+
+}
diff --git a/samples/SupportPreferenceDemos/src/com/example/android/supportpreference/SupportPreferenceDemos.java b/samples/SupportPreferenceDemos/src/com/example/android/supportpreference/SupportPreferenceDemos.java
new file mode 100644
index 0000000..f7d9f18
--- /dev/null
+++ b/samples/SupportPreferenceDemos/src/com/example/android/supportpreference/SupportPreferenceDemos.java
@@ -0,0 +1,150 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.example.android.supportpreference;
+
+import android.app.ListActivity;
+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 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;
+
+public class SupportPreferenceDemos extends ListActivity {
+    @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);
+    }
+
+    protected List<Map<String, Object>> getData(String prefix) {
+        List<Map<String, Object>> myData = new ArrayList<>();
+
+        Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
+        mainIntent.addCategory("com.example.android.supportpreference.SAMPLE_CODE");
+
+        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<>();
+
+        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();
+
+                @Override
+                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, SupportPreferenceDemos.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<>();
+        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/SupportTransitionDemos/Android.mk b/samples/SupportTransitionDemos/Android.mk
new file mode 100644
index 0000000..1d077a2
--- /dev/null
+++ b/samples/SupportTransitionDemos/Android.mk
@@ -0,0 +1,40 @@
+# Copyright (C) 2016 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.
+
+LOCAL_PATH:= $(call my-dir)
+
+# Build the samples.
+# We need to add some special AAPT flags to generate R classes
+# for resources that are included from the libraries.
+include $(CLEAR_VARS)
+LOCAL_PACKAGE_NAME := SupportTransitionDemos
+LOCAL_MODULE_TAGS := samples
+LOCAL_SDK_VERSION := current
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+LOCAL_STATIC_JAVA_LIBRARIES := \
+        android-support-v4 \
+        android-support-v7-appcompat \
+        android-support-transition
+LOCAL_RESOURCE_DIR = \
+        $(LOCAL_PATH)/res \
+        frameworks/support/v7/appcompat/res \
+        frameworks/support/transition/res
+LOCAL_AAPT_FLAGS := \
+        --auto-add-overlay \
+        --extra-packages android.support.v7.appcompat \
+        --extra-packages android.support.v7.recyclerview \
+        --extra-packages android.support.transition \
+        --no-version-vectors
+LOCAL_PROGUARD_FLAG_FILES := proguard.flags
+include $(BUILD_PACKAGE)
diff --git a/samples/SupportTransitionDemos/AndroidManifest.xml b/samples/SupportTransitionDemos/AndroidManifest.xml
new file mode 100644
index 0000000..2d6469c
--- /dev/null
+++ b/samples/SupportTransitionDemos/AndroidManifest.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2016 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"
+    package="com.example.android.support.transition">
+
+    <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="23" />
+
+    <application android:label="@string/activity_sample_code"
+            android:supportsRtl="true"
+            android:icon="@drawable/app_sample_code"
+            android:theme="@style/Theme.Transition">
+
+        <activity android:name=".SupportTransitionDemos">
+            <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=".widget.BasicUsage"
+                  android:label="@string/basic"
+                  android:theme="@style/Theme.Transition">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="com.example.android.support.transition.SAMPLE_CODE" />
+            </intent-filter>
+        </activity>
+    </application>
+</manifest>
diff --git a/samples/SupportTransitionDemos/build.gradle b/samples/SupportTransitionDemos/build.gradle
new file mode 100644
index 0000000..c3131ff
--- /dev/null
+++ b/samples/SupportTransitionDemos/build.gradle
@@ -0,0 +1,32 @@
+apply plugin: 'com.android.application'
+
+dependencies {
+    compile project(':support-transition')
+    compile project(':support-appcompat-v7')
+}
+
+android {
+    compileSdkVersion project.ext.currentSdk
+
+    defaultConfig {
+        minSdkVersion 14
+    }
+
+    sourceSets {
+        main.manifest.srcFile 'AndroidManifest.xml'
+        main.java.srcDirs = ['src']
+        main.aidl.srcDirs = ['src']
+        main.res.srcDirs = ['res']
+    }
+
+    lintOptions {
+        // TODO: fix errors and reenable.
+        abortOnError false
+    }
+
+    compileOptions {
+        sourceCompatibility JavaVersion.VERSION_1_7
+        targetCompatibility JavaVersion.VERSION_1_7
+    }
+}
+
diff --git a/customtabs/api/removed.txt b/samples/SupportTransitionDemos/proguard.flags
similarity index 100%
rename from customtabs/api/removed.txt
rename to samples/SupportTransitionDemos/proguard.flags
diff --git a/samples/SupportTransitionDemos/res/drawable-hdpi/app_sample_code.png b/samples/SupportTransitionDemos/res/drawable-hdpi/app_sample_code.png
new file mode 100755
index 0000000..66a1984
--- /dev/null
+++ b/samples/SupportTransitionDemos/res/drawable-hdpi/app_sample_code.png
Binary files differ
diff --git a/samples/SupportTransitionDemos/res/drawable-hdpi/ic_action_navigation_menu.png b/samples/SupportTransitionDemos/res/drawable-hdpi/ic_action_navigation_menu.png
new file mode 100644
index 0000000..743fd7d
--- /dev/null
+++ b/samples/SupportTransitionDemos/res/drawable-hdpi/ic_action_navigation_menu.png
Binary files differ
diff --git a/samples/SupportTransitionDemos/res/drawable-hdpi/ic_android.png b/samples/SupportTransitionDemos/res/drawable-hdpi/ic_android.png
new file mode 100644
index 0000000..94b8fb1
--- /dev/null
+++ b/samples/SupportTransitionDemos/res/drawable-hdpi/ic_android.png
Binary files differ
diff --git a/samples/SupportTransitionDemos/res/drawable-mdpi/app_sample_code.png b/samples/SupportTransitionDemos/res/drawable-mdpi/app_sample_code.png
new file mode 100644
index 0000000..5ae7701
--- /dev/null
+++ b/samples/SupportTransitionDemos/res/drawable-mdpi/app_sample_code.png
Binary files differ
diff --git a/samples/SupportTransitionDemos/res/drawable-mdpi/ic_action_navigation_menu.png b/samples/SupportTransitionDemos/res/drawable-mdpi/ic_action_navigation_menu.png
new file mode 100644
index 0000000..4fa2c22
--- /dev/null
+++ b/samples/SupportTransitionDemos/res/drawable-mdpi/ic_action_navigation_menu.png
Binary files differ
diff --git a/samples/SupportTransitionDemos/res/drawable-mdpi/ic_android.png b/samples/SupportTransitionDemos/res/drawable-mdpi/ic_android.png
new file mode 100644
index 0000000..afc43db
--- /dev/null
+++ b/samples/SupportTransitionDemos/res/drawable-mdpi/ic_android.png
Binary files differ
diff --git a/samples/SupportTransitionDemos/res/drawable-nodpi/photo.jpg b/samples/SupportTransitionDemos/res/drawable-nodpi/photo.jpg
new file mode 100644
index 0000000..d5a2ef0
--- /dev/null
+++ b/samples/SupportTransitionDemos/res/drawable-nodpi/photo.jpg
Binary files differ
diff --git a/samples/SupportTransitionDemos/res/drawable-xhdpi/ic_action_navigation_menu.png b/samples/SupportTransitionDemos/res/drawable-xhdpi/ic_action_navigation_menu.png
new file mode 100644
index 0000000..595da84
--- /dev/null
+++ b/samples/SupportTransitionDemos/res/drawable-xhdpi/ic_action_navigation_menu.png
Binary files differ
diff --git a/samples/SupportTransitionDemos/res/drawable-xhdpi/ic_android.png b/samples/SupportTransitionDemos/res/drawable-xhdpi/ic_android.png
new file mode 100644
index 0000000..74c6f68
--- /dev/null
+++ b/samples/SupportTransitionDemos/res/drawable-xhdpi/ic_android.png
Binary files differ
diff --git a/samples/SupportTransitionDemos/res/drawable-xxhdpi/ic_action_navigation_menu.png b/samples/SupportTransitionDemos/res/drawable-xxhdpi/ic_action_navigation_menu.png
new file mode 100644
index 0000000..3ebee24
--- /dev/null
+++ b/samples/SupportTransitionDemos/res/drawable-xxhdpi/ic_action_navigation_menu.png
Binary files differ
diff --git a/samples/SupportTransitionDemos/res/drawable-xxhdpi/ic_add.png b/samples/SupportTransitionDemos/res/drawable-xxhdpi/ic_add.png
new file mode 100644
index 0000000..a84106b
--- /dev/null
+++ b/samples/SupportTransitionDemos/res/drawable-xxhdpi/ic_add.png
Binary files differ
diff --git a/samples/SupportTransitionDemos/res/drawable-xxhdpi/ic_android.png b/samples/SupportTransitionDemos/res/drawable-xxhdpi/ic_android.png
new file mode 100644
index 0000000..5cb6acd
--- /dev/null
+++ b/samples/SupportTransitionDemos/res/drawable-xxhdpi/ic_android.png
Binary files differ
diff --git a/samples/SupportTransitionDemos/res/drawable-xxxhdpi/ic_android.png b/samples/SupportTransitionDemos/res/drawable-xxxhdpi/ic_android.png
new file mode 100644
index 0000000..e302a07
--- /dev/null
+++ b/samples/SupportTransitionDemos/res/drawable-xxxhdpi/ic_android.png
Binary files differ
diff --git a/samples/SupportTransitionDemos/res/layout/basic_usage.xml b/samples/SupportTransitionDemos/res/layout/basic_usage.xml
new file mode 100644
index 0000000..52a3e47
--- /dev/null
+++ b/samples/SupportTransitionDemos/res/layout/basic_usage.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2016 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"
+              xmlns:app="http://schemas.android.com/apk/res-auto"
+              android:layout_width="match_parent"
+              android:layout_height="match_parent"
+              android:orientation="vertical">
+
+    <android.support.v7.widget.Toolbar
+            android:id="@+id/toolbar"
+            android:layout_height="wrap_content"
+            android:layout_width="match_parent"
+            android:minHeight="?attr/actionBarSize"
+            android:background="?attr/colorPrimary"
+            android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
+            app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
+            android:elevation="4dp"/>
+
+    <FrameLayout
+            android:id="@+id/root"
+            android:layout_width="match_parent"
+            android:layout_height="0dp"
+            android:layout_weight="1">
+
+        <include layout="@layout/scene0"/>
+
+    </FrameLayout>
+
+</LinearLayout>
diff --git a/samples/SupportTransitionDemos/res/layout/scene0.xml b/samples/SupportTransitionDemos/res/layout/scene0.xml
new file mode 100644
index 0000000..77283e2
--- /dev/null
+++ b/samples/SupportTransitionDemos/res/layout/scene0.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2016 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.
+-->
+<FrameLayout
+        xmlns:android="http://schemas.android.com/apk/res/android"
+        android:id="@+id/container"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:padding="42dp">
+
+    <View
+            android:id="@+id/box1"
+            android:layout_width="40dp"
+            android:layout_height="40dp"
+            android:background="#f00"
+            android:layout_gravity="start|top"/>
+
+    <View
+            android:id="@+id/box2"
+            android:layout_width="40dp"
+            android:layout_height="40dp"
+            android:background="#0f0"
+            android:layout_gravity="center"/>
+
+</FrameLayout>
diff --git a/samples/SupportTransitionDemos/res/layout/scene1.xml b/samples/SupportTransitionDemos/res/layout/scene1.xml
new file mode 100644
index 0000000..4855797
--- /dev/null
+++ b/samples/SupportTransitionDemos/res/layout/scene1.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2016 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.
+-->
+<FrameLayout
+        xmlns:android="http://schemas.android.com/apk/res/android"
+        android:id="@+id/container"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:padding="42dp">
+
+    <View
+            android:id="@+id/box1"
+            android:layout_width="80dp"
+            android:layout_height="80dp"
+            android:background="#f00"
+            android:layout_gravity="end|top"/>
+
+    <View
+            android:id="@+id/box2"
+            android:layout_width="40dp"
+            android:layout_height="40dp"
+            android:background="#0f0"/>
+
+    <View
+            android:id="@+id/box3"
+            android:layout_width="40dp"
+            android:layout_height="40dp"
+            android:background="#00f"
+            android:layout_gravity="start|bottom"/>
+
+</FrameLayout>
diff --git a/samples/SupportTransitionDemos/res/menu/basic_usage.xml b/samples/SupportTransitionDemos/res/menu/basic_usage.xml
new file mode 100644
index 0000000..4b74026
--- /dev/null
+++ b/samples/SupportTransitionDemos/res/menu/basic_usage.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2016 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"
+      xmlns:app="http://schemas.android.com/apk/res-auto">
+
+    <item
+            android:id="@+id/action_toggle"
+            android:title="@string/toggle"
+            app:showAsAction="ifRoom"/>
+
+</menu>
diff --git a/samples/SupportTransitionDemos/res/values-w540dp/dimens.xml b/samples/SupportTransitionDemos/res/values-w540dp/dimens.xml
new file mode 100644
index 0000000..ad7744b
--- /dev/null
+++ b/samples/SupportTransitionDemos/res/values-w540dp/dimens.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2016 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="bottom_sheet_horizontal_margin">64dp</dimen>
+</resources>
diff --git a/samples/SupportTransitionDemos/res/values/dimens.xml b/samples/SupportTransitionDemos/res/values/dimens.xml
new file mode 100644
index 0000000..d9f7ab3
--- /dev/null
+++ b/samples/SupportTransitionDemos/res/values/dimens.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2016 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="bottom_sheet_horizontal_margin">0dp</dimen>
+    <dimen name="bottom_sheet_elevation">16dp</dimen>
+    <dimen name="bottom_sheet_peek_height">128dp</dimen>
+</resources>
diff --git a/samples/SupportTransitionDemos/res/values/strings.xml b/samples/SupportTransitionDemos/res/values/strings.xml
new file mode 100644
index 0000000..7f106f1
--- /dev/null
+++ b/samples/SupportTransitionDemos/res/values/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2016 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="activity_sample_code">Support Transition Demos</string>
+    <string name="basic">Basic</string>
+    <string name="toggle">Toggle</string>
+</resources>
diff --git a/samples/SupportTransitionDemos/res/values/styles.xml b/samples/SupportTransitionDemos/res/values/styles.xml
new file mode 100644
index 0000000..8b94948
--- /dev/null
+++ b/samples/SupportTransitionDemos/res/values/styles.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2016 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>
+
+    <style name="Theme.Transition" parent="Theme.AppCompat.Light.NoActionBar">
+        <item name="colorPrimary">#607D8B</item>
+        <item name="colorPrimaryDark">#455A64</item>
+        <item name="colorAccent">#FFAB40</item>
+    </style>
+
+</resources>
diff --git a/samples/SupportTransitionDemos/src/com/example/android/support/transition/SupportTransitionDemos.java b/samples/SupportTransitionDemos/src/com/example/android/support/transition/SupportTransitionDemos.java
new file mode 100644
index 0000000..934f110
--- /dev/null
+++ b/samples/SupportTransitionDemos/src/com/example/android/support/transition/SupportTransitionDemos.java
@@ -0,0 +1,149 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.support.transition;
+
+import android.app.ListActivity;
+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 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;
+
+public class SupportTransitionDemos extends ListActivity {
+
+    @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);
+    }
+
+    protected List<Map<String, Object>> getData(String prefix) {
+        List<Map<String, Object>> myData = new ArrayList<>();
+
+        Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
+        mainIntent.addCategory("com.example.android.support.transition.SAMPLE_CODE");
+
+        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 + "/";
+        }
+
+        Map<String, Boolean> entries = new HashMap<>();
+
+        for (ResolveInfo info : list) {
+            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();
+
+        @Override
+        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, SupportTransitionDemos.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<>();
+        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/SupportTransitionDemos/src/com/example/android/support/transition/widget/BasicUsage.java b/samples/SupportTransitionDemos/src/com/example/android/support/transition/widget/BasicUsage.java
new file mode 100644
index 0000000..709ed4c
--- /dev/null
+++ b/samples/SupportTransitionDemos/src/com/example/android/support/transition/widget/BasicUsage.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.support.transition.widget;
+
+import android.os.Bundle;
+import android.support.transition.Scene;
+import android.support.transition.TransitionManager;
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.widget.Toolbar;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.widget.FrameLayout;
+
+import com.example.android.support.transition.R;
+
+/**
+ * This demonstrates basic usage of the Transition API.
+ */
+public class BasicUsage extends AppCompatActivity {
+
+    private final Scene[] mScenes = new Scene[2];
+    private int mCurrentScene;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.basic_usage);
+
+        // Retrieve the Toolbar from our content view, and set it as the action bar
+        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
+        setSupportActionBar(toolbar);
+
+        FrameLayout root = (FrameLayout) findViewById(R.id.root);
+        mScenes[0] = Scene.getSceneForLayout(root, R.layout.scene0, this);
+        mScenes[1] = Scene.getSceneForLayout(root, R.layout.scene1, this);
+    }
+
+    @Override
+    public boolean onCreateOptionsMenu(Menu menu) {
+        getMenuInflater().inflate(R.menu.basic_usage, menu);
+        return true;
+    }
+
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+        switch (item.getItemId()) {
+            case R.id.action_toggle:
+                if (mCurrentScene == 0) {
+                    mCurrentScene = 1;
+                } else {
+                    mCurrentScene = 0;
+                }
+                TransitionManager.go(mScenes[mCurrentScene]);
+                return true;
+        }
+        return false;
+    }
+
+}
diff --git a/samples/SupportVectorDrawable/animated/Android.mk b/samples/SupportVectorDrawable/animated/Android.mk
new file mode 100644
index 0000000..1a34f53
--- /dev/null
+++ b/samples/SupportVectorDrawable/animated/Android.mk
@@ -0,0 +1,42 @@
+# Copyright (C) 2015 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.
+
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := tests
+
+LOCAL_SDK_VERSION := current
+
+LOCAL_MIN_SDK_VERSION := 11
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_PACKAGE_NAME := SupportAnimatedVectorDrawable
+
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-animatedvectordrawable \
+        android-support-vectordrawable \
+        android-support-v4
+
+LOCAL_AAPT_FLAGS += --auto-add-overlay \
+        --extra-packages android.support.graphics.drawable \
+        --no-version-vectors
+
+include $(BUILD_PACKAGE)
+
+LOCAL_PROGUARD_FLAG_FILES := proguard.flags
+
+# Use the following include to make our test apk.
+include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/samples/SupportVectorDrawable/animated/AndroidManifest.xml b/samples/SupportVectorDrawable/animated/AndroidManifest.xml
new file mode 100644
index 0000000..55d6bc6
--- /dev/null
+++ b/samples/SupportVectorDrawable/animated/AndroidManifest.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.example.android.support.vectordrawable" >
+
+    <uses-sdk android:minSdkVersion="11" android:targetSdkVersion="23"/>
+
+    <application android:icon="@drawable/app_sample_code" android:label="AnimatedVectorDrawableCompatTest" >
+        <activity android:name="com.example.android.support.vectordrawable.app.AnimatedButtonBackground" />
+        <intent-filter>
+            <action android:name="android.intent.action.MAIN" />
+
+            <category android:name="android.intent.category.LAUNCHER" />
+        </intent-filter>
+    </application>
+
+</manifest>
\ No newline at end of file
diff --git a/samples/SupportVectorDrawable/animated/res/anim/alpha_animation_progress_bar.xml b/samples/SupportVectorDrawable/animated/res/anim/alpha_animation_progress_bar.xml
new file mode 100644
index 0000000..2463a89
--- /dev/null
+++ b/samples/SupportVectorDrawable/animated/res/anim/alpha_animation_progress_bar.xml
@@ -0,0 +1,24 @@
+<!-- Copyright (C) 2015 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" >
+
+    <objectAnimator
+        android:duration="3350"
+        android:propertyName="alpha"
+        android:valueFrom="1"
+        android:valueTo="0.2" />
+
+</set>
\ No newline at end of file
diff --git a/samples/SupportVectorDrawable/animated/res/anim/animation_grouping_1_01.xml b/samples/SupportVectorDrawable/animated/res/anim/animation_grouping_1_01.xml
new file mode 100644
index 0000000..36c297f
--- /dev/null
+++ b/samples/SupportVectorDrawable/animated/res/anim/animation_grouping_1_01.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2015 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.
+-->
+
+<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
+    android:duration="3300"
+    android:propertyName="rotation"
+    android:valueFrom="0"
+    android:valueTo="450" />
diff --git a/samples/SupportVectorDrawable/animated/res/anim/trim_path_animation_progress_bar.xml b/samples/SupportVectorDrawable/animated/res/anim/trim_path_animation_progress_bar.xml
new file mode 100644
index 0000000..388c759
--- /dev/null
+++ b/samples/SupportVectorDrawable/animated/res/anim/trim_path_animation_progress_bar.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2015 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" >
+
+    <objectAnimator
+        android:duration="1300"
+        android:interpolator="@android:anim/linear_interpolator"
+        android:propertyName="trimPathStart"
+        android:repeatCount="-1"
+        android:valueFrom="0"
+        android:valueTo="0.75"
+        android:valueType="floatType" />
+    <objectAnimator
+        android:duration="1300"
+        android:interpolator="@android:anim/linear_interpolator"
+        android:propertyName="trimPathEnd"
+        android:repeatCount="-1"
+        android:valueFrom="0.25"
+        android:valueTo="1.0"
+        android:valueType="floatType" />
+    <objectAnimator
+        android:duration="1300"
+        android:interpolator="@android:anim/linear_interpolator"
+        android:propertyName="trimPathOffset"
+        android:repeatCount="-1"
+        android:valueFrom="0"
+        android:valueTo="0.25"
+        android:valueType="floatType" />
+
+</set>
\ No newline at end of file
diff --git a/samples/SupportVectorDrawable/animated/res/drawable/animation_vector_drawable_grouping_1.xml b/samples/SupportVectorDrawable/animated/res/drawable/animation_vector_drawable_grouping_1.xml
new file mode 100644
index 0000000..dac981b
--- /dev/null
+++ b/samples/SupportVectorDrawable/animated/res/drawable/animation_vector_drawable_grouping_1.xml
@@ -0,0 +1,26 @@
+<!--
+ Copyright (C) 2015 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.
+-->
+<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:drawable="@drawable/vector_drawable_grouping_1" >
+
+    <target
+        android:name="sun"
+        android:animation="@anim/animation_grouping_1_01" />
+    <target
+        android:name="earth"
+        android:animation="@anim/animation_grouping_1_01" />
+
+</animated-vector>
\ No newline at end of file
diff --git a/samples/SupportVectorDrawable/animated/res/drawable/animation_vector_progress_bar.xml b/samples/SupportVectorDrawable/animated/res/drawable/animation_vector_progress_bar.xml
new file mode 100644
index 0000000..2944dc2
--- /dev/null
+++ b/samples/SupportVectorDrawable/animated/res/drawable/animation_vector_progress_bar.xml
@@ -0,0 +1,25 @@
+<!--
+ Copyright (C) 2015 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.
+-->
+<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:drawable="@drawable/vector_drawable_progress_bar" >
+
+    <target
+        android:name="pie1"
+        android:animation="@anim/trim_path_animation_progress_bar" />
+    <target
+        android:name="root_bar"
+        android:animation="@anim/alpha_animation_progress_bar" />
+</animated-vector>
\ No newline at end of file
diff --git a/samples/SupportVectorDrawable/animated/res/drawable/app_sample_code.png b/samples/SupportVectorDrawable/animated/res/drawable/app_sample_code.png
new file mode 100755
index 0000000..66a1984
--- /dev/null
+++ b/samples/SupportVectorDrawable/animated/res/drawable/app_sample_code.png
Binary files differ
diff --git a/samples/SupportVectorDrawable/animated/res/drawable/btn_radio_on_to_off_bundle.xml b/samples/SupportVectorDrawable/animated/res/drawable/btn_radio_on_to_off_bundle.xml
new file mode 100644
index 0000000..f00d888
--- /dev/null
+++ b/samples/SupportVectorDrawable/animated/res/drawable/btn_radio_on_to_off_bundle.xml
@@ -0,0 +1,187 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2016 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.
+-->
+<animated-vector xmlns:aapt="http://schemas.android.com/aapt"
+                 xmlns:android="http://schemas.android.com/apk/res/android">
+    <aapt:attr name="android:drawable">
+        <vector
+                android:width="32dp"
+                android:viewportWidth="32"
+                android:height="32dp"
+                android:viewportHeight="32">
+            <group
+                    android:name="btn_radio_to_off_mtrl_0"
+                    android:translateX="16"
+                    android:translateY="16">
+                <group
+                        android:name="ring_outer">
+                    <path
+                            android:name="ring_outer_path"
+                            android:strokeColor="#FF000000"
+                            android:strokeWidth="2"
+                            android:pathData="M 0.0,-9.0 c 4.9705627482,0.0 9.0,4.0294372518 9.0,9.0 c 0.0,4.9705627482 -4.0294372518,9.0 -9.0,9.0 c -4.9705627482,0.0 -9.0,-4.0294372518 -9.0,-9.0 c 0.0,-4.9705627482 4.0294372518,-9.0 9.0,-9.0 Z"/>
+                </group>
+                <group
+                        android:name="dot_group">
+                    <path
+                            android:name="dot_path"
+                            android:pathData="M 0.0,-5.0 c -2.7619934082,0.0 -5.0,2.2380065918 -5.0,5.0 c 0.0,2.7619934082 2.2380065918,5.0 5.0,5.0 c 2.7619934082,0.0 5.0,-2.2380065918 5.0,-5.0 c 0.0,-2.7619934082 -2.2380065918,-5.0 -5.0,-5.0 Z"
+                            android:fillColor="#FF000000"/>
+                </group>
+            </group>
+        </vector>
+    </aapt:attr>
+    <target android:name="ring_outer">
+        <aapt:attr name="android:animation">
+            <set>
+                <set
+                        android:ordering="sequentially" >
+                    <objectAnimator
+                            android:duration="183"
+                            android:propertyName="scaleX"
+                            android:valueFrom="1.0"
+                            android:valueTo="0.9"
+                            android:valueType="floatType"
+                            android:interpolator="@android:interpolator/accelerate_decelerate" />
+                    <objectAnimator
+                            android:duration="16"
+                            android:propertyName="scaleX"
+                            android:valueFrom="0.9"
+                            android:valueTo="0.5"
+                            android:valueType="floatType"
+                            android:interpolator="@android:interpolator/accelerate_decelerate" />
+                    <objectAnimator
+                            android:duration="300"
+                            android:propertyName="scaleX"
+                            android:valueFrom="0.5"
+                            android:valueTo="1.0"
+                            android:valueType="floatType"
+                            android:interpolator="@android:interpolator/accelerate_decelerate" />
+                </set>
+                <set
+                        android:ordering="sequentially" >
+                    <objectAnimator
+                            android:duration="183"
+                            android:propertyName="scaleY"
+                            android:valueFrom="1.0"
+                            android:valueTo="0.9"
+                            android:valueType="floatType"
+                            android:interpolator="@android:interpolator/accelerate_decelerate" />
+                    <objectAnimator
+                            android:duration="16"
+                            android:propertyName="scaleY"
+                            android:valueFrom="0.9"
+                            android:valueTo="0.5"
+                            android:valueType="floatType"
+                            android:interpolator="@android:interpolator/accelerate_decelerate" />
+                    <objectAnimator
+                            android:duration="300"
+                            android:propertyName="scaleY"
+                            android:valueFrom="0.5"
+                            android:valueTo="1.0"
+                            android:valueType="floatType"
+                            android:interpolator="@android:interpolator/accelerate_decelerate" />
+                </set>
+            </set>
+        </aapt:attr>
+    </target>
+
+    <target android:name="ring_outer_path">
+        <aapt:attr name="android:animation">
+            <set>
+                <set
+                        android:ordering="sequentially">
+                    <objectAnimator
+                            android:duration="183"
+                            android:propertyName="strokeWidth"
+                            android:valueFrom="2.0"
+                            android:valueTo="2.0"
+                            android:valueType="floatType"
+                            android:interpolator="@android:interpolator/accelerate_decelerate"/>
+                    <objectAnimator
+                            android:duration="16"
+                            android:propertyName="strokeWidth"
+                            android:valueFrom="2.0"
+                            android:valueTo="18.0"
+                            android:valueType="floatType"
+                            android:interpolator="@android:interpolator/accelerate_decelerate"/>
+                    <objectAnimator
+                            android:duration="300"
+                            android:propertyName="strokeWidth"
+                            android:valueFrom="18.0"
+                            android:valueTo="2.0"
+                            android:valueType="floatType"
+                            android:interpolator="@android:interpolator/accelerate_decelerate"/>
+                </set>
+
+            </set>
+        </aapt:attr>
+    </target>
+    <target
+            android:name="dot_group">
+        <aapt:attr name="android:animation">
+            <set>
+                <set
+                        android:ordering="sequentially">
+                    <objectAnimator
+                            android:duration="183"
+                            android:propertyName="scaleX"
+                            android:valueFrom="1.0"
+                            android:valueTo="1.4"
+                            android:valueType="floatType"
+                            android:interpolator="@android:interpolator/accelerate_decelerate"/>
+                    <objectAnimator
+                            android:duration="16"
+                            android:propertyName="scaleX"
+                            android:valueFrom="1.4"
+                            android:valueTo="0.0"
+                            android:valueType="floatType"
+                            android:interpolator="@android:interpolator/accelerate_decelerate"/>
+                    <objectAnimator
+                            android:duration="300"
+                            android:propertyName="scaleX"
+                            android:valueFrom="0.0"
+                            android:valueTo="0.0"
+                            android:valueType="floatType"
+                            android:interpolator="@android:interpolator/accelerate_decelerate"/>
+                </set>
+                <set
+                        android:ordering="sequentially">
+                    <objectAnimator
+                            android:duration="183"
+                            android:propertyName="scaleY"
+                            android:valueFrom="1.0"
+                            android:valueTo="1.4"
+                            android:valueType="floatType"
+                            android:interpolator="@android:interpolator/accelerate_decelerate"/>
+                    <objectAnimator
+                            android:duration="16"
+                            android:propertyName="scaleY"
+                            android:valueFrom="1.4"
+                            android:valueTo="0.0"
+                            android:valueType="floatType"
+                            android:interpolator="@android:interpolator/accelerate_decelerate"/>
+                    <objectAnimator
+                            android:duration="300"
+                            android:propertyName="scaleY"
+                            android:valueFrom="0.0"
+                            android:valueTo="0.0"
+                            android:valueType="floatType"
+                            android:interpolator="@android:interpolator/accelerate_decelerate"/>
+                </set>
+            </set>
+        </aapt:attr>
+    </target>
+</animated-vector>
\ No newline at end of file
diff --git a/samples/SupportVectorDrawable/animated/res/drawable/vector_drawable_grouping_1.xml b/samples/SupportVectorDrawable/animated/res/drawable/vector_drawable_grouping_1.xml
new file mode 100644
index 0000000..06f098e
--- /dev/null
+++ b/samples/SupportVectorDrawable/animated/res/drawable/vector_drawable_grouping_1.xml
@@ -0,0 +1,52 @@
+<!--
+ Copyright (C) 2015 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="64dp"
+        android:width="64dp"
+        android:viewportHeight="256"
+        android:viewportWidth="256" >
+
+    <group
+        android:name="shape_layer_1"
+        android:translateX="128"
+        android:translateY="128" >
+        <group android:name="sun" >
+            <path
+                android:name="ellipse_path_1"
+                android:fillColor="#ffff8000"
+                android:pathData="m -25 0 a 25,25 0 1,0 50,0 a 25,25 0 1,0 -50,0" />
+
+            <group
+                android:name="earth"
+                android:translateX="75" >
+                <path
+                    android:name="ellipse_path_1_1"
+                    android:fillColor="#ff5656ea"
+                    android:pathData="m -10 0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0" />
+
+                <group
+                    android:name="moon"
+                    android:translateX="25" >
+                    <path
+                        android:name="ellipse_path_1_2"
+                        android:fillColor="#ffadadad"
+                        android:pathData="m -5 0 a 5,5 0 1,0 10,0 a 5,5 0 1,0 -10,0" />
+                </group>
+            </group>
+        </group>
+    </group>
+
+</vector>
\ No newline at end of file
diff --git a/samples/SupportVectorDrawable/animated/res/drawable/vector_drawable_progress_bar.xml b/samples/SupportVectorDrawable/animated/res/drawable/vector_drawable_progress_bar.xml
new file mode 100644
index 0000000..535265e
--- /dev/null
+++ b/samples/SupportVectorDrawable/animated/res/drawable/vector_drawable_progress_bar.xml
@@ -0,0 +1,49 @@
+<!--
+ Copyright (C) 2015 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="64dp"
+        android:width="64dp"
+        android:viewportHeight="64"
+        android:viewportWidth="64"
+        android:name="root_bar" >
+
+    <group
+        android:name="root"
+        android:pivotX="0.0"
+        android:pivotY="0.0"
+        android:rotation="0"
+        android:translateX="32.0"
+        android:translateY="32.0" >
+        <group
+            android:name="rotationGroup"
+            android:pivotX="0.0"
+            android:pivotY="0.0"
+            android:rotation="0" >
+            <path
+                android:name="pie1"
+                android:fillColor="#00000000"
+                android:pathData="M0, 0 m 0, -9.5 a 9.5,9.5 0 1,1 0,19 a 9.5,9.5 0 1,1 0,-19"
+                android:strokeColor="#FF00FFFF"
+                android:strokeLineCap="round"
+                android:strokeLineJoin="miter"
+                android:strokeWidth="2"
+                android:trimPathEnd="0.1"
+                android:trimPathOffset="0"
+                android:trimPathStart="0" />
+        </group>
+    </group>
+
+</vector>
\ No newline at end of file
diff --git a/samples/SupportVectorDrawable/animated/res/values/strings.xml b/samples/SupportVectorDrawable/animated/res/values/strings.xml
new file mode 100644
index 0000000..c5451c8
--- /dev/null
+++ b/samples/SupportVectorDrawable/animated/res/values/strings.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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="twoLinePathData">"M 0,0 v 100 M 0,0 h 100"</string>
+    <string name="triangle"> "M300,70 l 0,-70 70,70 0,0   -70,70z"</string>
+    <string name="rectangle">"M300,70 l 0,-70 70,0  0,140 -70,0 z"</string>
+    <string name="rectangle2">"M300,70 l 0,-70 70,0  0,70z M300,70  l 70,0 0,70 -70,0z"</string>
+    <string name="equal2">    "M300,35 l 0,-35 70,0  0,35z M300,105 l 70,0 0,35 -70,0z"</string>
+    <string name="round_box">"m2.10001,-6c-1.9551,0 -0.5,0.02499 -2.10001,0.02499c-1.575,0 0.0031,-0.02499 -1.95,-0.02499c-2.543,0 -4,2.2816 -4,4.85001c0,3.52929 0.25,6.25 5.95,6.25c5.7,0 6,-2.72071 6,-6.25c0,-2.56841 -1.35699,-4.85001 -3.89999,-4.85001"</string>
+    <string name="heart">    "m4.5,-7c-1.95509,0 -3.83009,1.26759 -4.5,3c-0.66991,-1.73241 -2.54691,-3 -4.5,-3c-2.543,0 -4.5,1.93159 -4.5,4.5c0,3.5293 3.793,6.2578 9,11.5c5.207,-5.2422 9,-7.9707 9,-11.5c0,-2.56841 -1.957,-4.5 -4.5,-4.5"</string>
+    <string name="rectangle200">"M 0,0 l 200,0 l 0, 200 l -200, 0 z"</string>
+</resources>
\ No newline at end of file
diff --git a/samples/SupportVectorDrawable/animated/rundemo.sh b/samples/SupportVectorDrawable/animated/rundemo.sh
new file mode 100755
index 0000000..e5972f7
--- /dev/null
+++ b/samples/SupportVectorDrawable/animated/rundemo.sh
@@ -0,0 +1,6 @@
+. $ANDROID_BUILD_TOP/build/envsetup.sh && \
+mmm -j20 . && \
+adb install -r $OUT/data/app/SupportAnimatedVectorDrawable/SupportAnimatedVectorDrawable.apk && \
+adb shell am start -n com.example.android.support.vectordrawable/com.example.android.support.vectordrawable.app.AnimatedButtonBackground
+
+
diff --git a/samples/SupportVectorDrawable/animated/src/com/example/android/support/vectordrawable/app/AnimatedButtonBackground.java b/samples/SupportVectorDrawable/animated/src/com/example/android/support/vectordrawable/app/AnimatedButtonBackground.java
new file mode 100644
index 0000000..d8381d1
--- /dev/null
+++ b/samples/SupportVectorDrawable/animated/src/com/example/android/support/vectordrawable/app/AnimatedButtonBackground.java
@@ -0,0 +1,101 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.support.vectordrawable.app;
+
+import android.animation.ObjectAnimator;
+import android.app.Activity;
+import android.content.res.Resources;
+import android.os.Bundle;
+import android.support.graphics.drawable.AnimatedVectorDrawableCompat;
+import android.view.View;
+import android.widget.Button;
+import android.widget.LinearLayout;
+import android.widget.ScrollView;
+import android.widget.TextView;
+import com.example.android.support.vectordrawable.R;
+
+import java.text.DecimalFormat;
+
+public class AnimatedButtonBackground extends Activity implements View.OnClickListener{
+    private static final String LOG_TAG = "TestActivity";
+
+    private static final String LOGCAT = "VectorDrawable1";
+    protected int[] icon = {
+        R.drawable.animation_vector_drawable_grouping_1,
+        R.drawable.animation_vector_progress_bar,
+        R.drawable.btn_radio_on_to_off_bundle,
+    };
+
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        ObjectAnimator oa = new ObjectAnimator();
+        super.onCreate(savedInstanceState);
+        ScrollView scrollView = new ScrollView(this);
+        LinearLayout container = new LinearLayout(this);
+        scrollView.addView(container);
+        container.setOrientation(LinearLayout.VERTICAL);
+        Resources res = this.getResources();
+        container.setBackgroundColor(0xFF888888);
+        AnimatedVectorDrawableCompat []d = new AnimatedVectorDrawableCompat[icon.length];
+        long time =  android.os.SystemClock.currentThreadTimeMillis();
+        for (int i = 0; i < icon.length; i++) {
+             d[i] = AnimatedVectorDrawableCompat.create(this, icon[i]);
+        }
+        time =  android.os.SystemClock.currentThreadTimeMillis()-time;
+        TextView t = new TextView(this);
+        DecimalFormat df = new DecimalFormat("#.##");
+        t.setText("avgL=" + df.format(time / (icon.length)) + " ms");
+        container.addView(t);
+
+        addDrawableButtons(container, d);
+
+        // Now test constant state and mutate a bit.
+        if (d[0].getConstantState() != null) {
+            AnimatedVectorDrawableCompat[] copies = new AnimatedVectorDrawableCompat[3];
+            copies[0] = (AnimatedVectorDrawableCompat) d[0].getConstantState().newDrawable();
+            copies[1] = (AnimatedVectorDrawableCompat) d[0].getConstantState().newDrawable();
+            copies[2] = (AnimatedVectorDrawableCompat) d[0].getConstantState().newDrawable();
+            copies[0].setAlpha(128);
+
+            // Expect to see the copies[0, 1] are showing alpha 128, and [2] are showing 255.
+            copies[2].mutate();
+            copies[2].setAlpha(255);
+
+            addDrawableButtons(container, copies);
+        }
+
+        setContentView(scrollView);
+    }
+
+    private void addDrawableButtons(LinearLayout container, AnimatedVectorDrawableCompat[] d) {
+        for (int i = 0; i < d.length; i++) {
+            Button button = new Button(this);
+            button.setWidth(200);
+            button.setHeight(200);
+            button.setBackgroundDrawable(d[i]);
+            container.addView(button);
+            button.setOnClickListener(this);
+        }
+    }
+
+    @Override
+    public void onClick(View v) {
+        AnimatedVectorDrawableCompat d = (AnimatedVectorDrawableCompat) v.getBackground();
+        d.start();
+    }
+}
diff --git a/samples/SupportVectorDrawable/static/Android.mk b/samples/SupportVectorDrawable/static/Android.mk
new file mode 100644
index 0000000..88d76c5
--- /dev/null
+++ b/samples/SupportVectorDrawable/static/Android.mk
@@ -0,0 +1,25 @@
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := samples tests
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_PACKAGE_NAME := SupportVectorDrawable
+
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-vectordrawable android-support-v4
+
+LOCAL_SDK_VERSION := current
+
+LOCAL_MIN_SDK_VERSION := 7
+
+LOCAL_AAPT_FLAGS += --auto-add-overlay \
+        --extra-packages android.support.graphics.drawable \
+        --no-version-vectors
+
+include $(BUILD_PACKAGE)
+
+LOCAL_PROGUARD_FLAG_FILES := proguard.flags
+
+# Use the following include to make our test apk.
+include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/samples/SupportVectorDrawable/static/AndroidManifest.xml b/samples/SupportVectorDrawable/static/AndroidManifest.xml
new file mode 100644
index 0000000..53fc9c2
--- /dev/null
+++ b/samples/SupportVectorDrawable/static/AndroidManifest.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.example.android.support.vectordrawable" >
+
+    <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="23"/>
+
+    <application android:icon="@drawable/app_sample_code" android:label="VectorDrawableCompatTest" >
+        <activity android:name=".app.SimpleButtonBackground" />
+
+        <intent-filter>
+            <action android:name="android.intent.action.MAIN" />
+
+            <category android:name="android.intent.category.LAUNCHER" />
+        </intent-filter>
+    </application>
+
+</manifest>
diff --git a/samples/SupportVectorDrawable/static/res/drawable/app_sample_code.png b/samples/SupportVectorDrawable/static/res/drawable/app_sample_code.png
new file mode 100755
index 0000000..66a1984
--- /dev/null
+++ b/samples/SupportVectorDrawable/static/res/drawable/app_sample_code.png
Binary files differ
diff --git a/samples/SupportVectorDrawable/static/res/drawable/vector_drawable01.xml b/samples/SupportVectorDrawable/static/res/drawable/vector_drawable01.xml
new file mode 100644
index 0000000..286b487
--- /dev/null
+++ b/samples/SupportVectorDrawable/static/res/drawable/vector_drawable01.xml
@@ -0,0 +1,29 @@
+<!--
+ Copyright (C) 2015 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="48dp"
+        android:width="48dp"
+        android:viewportHeight="480"
+        android:viewportWidth="480" >
+
+    <group>
+        <path
+            android:name="box1"
+            android:pathData="m20,200l100,90l180-180l-35-35l-145,145l-60-60l-40,40z"
+            android:strokeLineCap="round"
+            android:strokeLineJoin="round" />
+    </group>
+</vector>
diff --git a/samples/SupportVectorDrawable/static/res/drawable/vector_drawable02.xml b/samples/SupportVectorDrawable/static/res/drawable/vector_drawable02.xml
new file mode 100644
index 0000000..7567887
--- /dev/null
+++ b/samples/SupportVectorDrawable/static/res/drawable/vector_drawable02.xml
@@ -0,0 +1,32 @@
+<!-- Copyright (C) 2015 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="64dp"
+        android:height="64dp" android:viewportWidth="320"
+          android:viewportHeight="320">
+    <group
+        android:rotation="180"
+        android:pivotX="70"
+        android:pivotY="120">
+        <path
+            android:name="house"
+            android:pathData="M 130,225 L 130,115 L 130,115 L 70,15 L 10,115 L 10,115 L 10,225 z"
+            android:fillColor="#ff440000"
+            android:strokeColor="#FF00FF00"
+            android:strokeWidth="10"
+            android:trimPathStart=".1"
+            android:trimPathEnd=".9"/>
+    </group>
+</vector>
diff --git a/samples/SupportVectorDrawable/static/res/drawable/vector_drawable03.xml b/samples/SupportVectorDrawable/static/res/drawable/vector_drawable03.xml
new file mode 100644
index 0000000..454468a
--- /dev/null
+++ b/samples/SupportVectorDrawable/static/res/drawable/vector_drawable03.xml
@@ -0,0 +1,79 @@
+<!--
+ Copyright (C) 2015 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:height="64dp"
+    android:viewportHeight="12.25"
+    android:viewportWidth="7.30625"
+    android:width="64dp" >
+
+    <group
+        android:pivotX="3.65"
+        android:pivotY="6.125"
+        android:rotation="-30" >
+        <clip-path
+            android:name="clip1"
+            android:pathData="
+                M 0, 6.125
+                l 7.3, 0
+                l 0, 12.25
+                l-7.3, 0
+                z" />
+
+        <group
+            android:pivotX="3.65"
+            android:pivotY="6.125"
+            android:rotation="30" >
+            <path
+                android:name="one"
+                android:fillColor="#ff88ff"
+                android:pathData="M 1.215625,9.5l 1.9375,0.0 0.0-6.671875-2.109375,0.421875 0.0-1.078125
+                l 2.09375-0.421875 1.1874998,0.0 0.0,7.75 1.9375,0.0 0.0,1.0
+                l-5.046875,0.0 0.0-1.0Z" />
+        </group>
+    </group>
+    <group
+        android:pivotX="3.65"
+        android:pivotY="6.125"
+        android:rotation="-30" >
+        <clip-path
+            android:name="clip2"
+            android:pathData="
+                M 0, 0
+                l 7.3, 0
+                l 0, 6.125
+                l-7.3, 0
+                z" />
+
+        <group
+            android:pivotX="3.65"
+            android:pivotY="6.125"
+            android:rotation="30" >
+            <path
+                android:name="two"
+                android:fillColor="#ff88ff"
+                android:pathData="M 2.534375,9.6875l 4.140625,0.0 0.0,1.0-5.5625,0.0 0.0-1.0q 0.671875-0.6875 1.828125-1.859375
+                        q 1.1718752-1.1875 1.4687502-1.53125 0.578125-0.625 0.796875-1.0625
+                        q 0.234375-0.453125 0.234375-0.875 0.0-0.703125-0.5-1.140625
+                        q-0.484375-0.4375-1.2656252-0.4375-0.5625,0.0-1.1875,0.1875
+                        q-0.609375,0.1875-1.3125,0.59375l 0.0-1.203125q 0.71875-0.28125 1.328125-0.421875
+                        q 0.625-0.15625 1.140625-0.15625 1.3593752,0.0 2.1718752,0.6875
+                        q 0.8125,0.671875 0.8125,1.8125 0.0,0.53125-0.203125,1.015625
+                        q-0.203125,0.484375-0.734375,1.140625-0.15625,0.171875-0.9375,0.984375
+                        q-0.78125024,0.8125-2.2187502,2.265625Z" />
+        </group>
+    </group>
+
+</vector>
\ No newline at end of file
diff --git a/samples/SupportVectorDrawable/static/res/drawable/vector_drawable04.xml b/samples/SupportVectorDrawable/static/res/drawable/vector_drawable04.xml
new file mode 100644
index 0000000..e6658a6
--- /dev/null
+++ b/samples/SupportVectorDrawable/static/res/drawable/vector_drawable04.xml
@@ -0,0 +1,61 @@
+<!-- Copyright (C) 2015 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:autoMirrored="true"
+    android:height="64dp"
+    android:viewportHeight="12.25"
+    android:viewportWidth="7.30625"
+    android:width="64dp" >
+
+    <group>
+        <clip-path
+            android:name="clip1"
+            android:pathData="
+                M 3.65, 6.125
+                m-.001, 0
+                a .001,.001 0 1,0 .002,0
+                a .001,.001 0 1,0-.002,0z" />
+
+        <path
+            android:name="one"
+            android:fillColor="#ff88ff"
+            android:pathData="M 1.215625,9.5l 1.9375,0.0 0.0-6.671875-2.109375,0.421875 0.0-1.078125
+                l 2.09375-0.421875 1.1874998,0.0 0.0,7.75 1.9375,0.0 0.0,1.0
+                l-5.046875,0.0 0.0-1.0Z" />
+    </group>
+    <group>
+        <clip-path
+            android:name="clip2"
+            android:pathData="
+                M 3.65, 6.125
+                m-6, 0
+                a 6,6 0 1,0 12,0
+                a 6,6 0 1,0-12,0z" />
+
+        <path
+            android:name="two"
+            android:fillColor="#ff88ff"
+            android:pathData="M 2.534375,9.6875l 4.140625,0.0 0.0,1.0-5.5625,0.0 0.0-1.0q 0.671875-0.6875 1.828125-1.859375
+                        q 1.1718752-1.1875 1.4687502-1.53125 0.578125-0.625 0.796875-1.0625
+                        q 0.234375-0.453125 0.234375-0.875 0.0-0.703125-0.5-1.140625
+                        q-0.484375-0.4375-1.2656252-0.4375-0.5625,0.0-1.1875,0.1875
+                        q-0.609375,0.1875-1.3125,0.59375l 0.0-1.203125q 0.71875-0.28125 1.328125-0.421875
+                        q 0.625-0.15625 1.140625-0.15625 1.3593752,0.0 2.1718752,0.6875
+                        q 0.8125,0.671875 0.8125,1.8125 0.0,0.53125-0.203125,1.015625
+                        q-0.203125,0.484375-0.734375,1.140625-0.15625,0.171875-0.9375,0.984375
+                        q-0.78125024,0.8125-2.2187502,2.265625Z" />
+    </group>
+
+</vector>
\ No newline at end of file
diff --git a/samples/SupportVectorDrawable/static/res/drawable/vector_drawable05.xml b/samples/SupportVectorDrawable/static/res/drawable/vector_drawable05.xml
new file mode 100644
index 0000000..d1723dc
--- /dev/null
+++ b/samples/SupportVectorDrawable/static/res/drawable/vector_drawable05.xml
@@ -0,0 +1,43 @@
+<!--
+ Copyright (C) 2015 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="64dp"
+        android:width="64dp"
+        android:viewportHeight="12.25"
+        android:viewportWidth="7.30625" >
+
+    <group>
+        <path
+            android:name="one"
+            android:fillColor="#ffff00"
+            android:pathData="M 1.215625,9.5l 1.9375,0.0 0.0-6.671875-2.109375,0.421875 0.0-1.078125
+                l 2.09375-0.421875 1.1874998,0.0 0.0,7.75 1.9375,0.0 0.0,1.0
+                l-5.046875,0.0 0.0-1.0Z" />
+        <path
+            android:name="two"
+            android:fillColor="#ffff00"
+            android:fillAlpha="0"
+            android:pathData="M 2.534375,9.6875l 4.140625,0.0 0.0,1.0-5.5625,0.0 0.0-1.0q 0.671875-0.6875 1.828125-1.859375
+                        q 1.1718752-1.1875 1.4687502-1.53125 0.578125-0.625 0.796875-1.0625
+                        q 0.234375-0.453125 0.234375-0.875 0.0-0.703125-0.5-1.140625
+                        q-0.484375-0.4375-1.2656252-0.4375-0.5625,0.0-1.1875,0.1875
+                        q-0.609375,0.1875-1.3125,0.59375l 0.0-1.203125q 0.71875-0.28125 1.328125-0.421875
+                        q 0.625-0.15625 1.140625-0.15625 1.3593752,0.0 2.1718752,0.6875
+                        q 0.8125,0.671875 0.8125,1.8125 0.0,0.53125-0.203125,1.015625
+                        q-0.203125,0.484375-0.734375,1.140625-0.15625,0.171875-0.9375,0.984375
+                        q-0.78125024,0.8125-2.2187502,2.265625Z" />
+    </group>
+</vector>
\ No newline at end of file
diff --git a/samples/SupportVectorDrawable/static/res/drawable/vector_drawable06.xml b/samples/SupportVectorDrawable/static/res/drawable/vector_drawable06.xml
new file mode 100644
index 0000000..4b530fd
--- /dev/null
+++ b/samples/SupportVectorDrawable/static/res/drawable/vector_drawable06.xml
@@ -0,0 +1,48 @@
+<!-- Copyright (C) 2015 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+            android:width="64dp"
+            android:height="64dp"
+            android:viewportWidth="700"
+            android:viewportHeight="700">
+
+    <group>
+        <path android:pathData="M 569.374 461.472L 569.374 160.658L 160.658 160.658L 160.658 461.472L 569.374 461.472z"
+              android:name="path2451"
+              android:fillColor="#00000000"
+              android:strokeColor="#FF000000"
+              android:strokeWidth="30.65500000000000"/>
+        <path android:pathData="M 365.015 311.066"
+              android:name="path2453"
+              android:fillColor="#00000000"
+              android:strokeColor="#FF000000"
+              android:strokeWidth="30.655000000000001"/>
+        <path android:pathData="M 164.46 164.49L 340.78 343.158C 353.849 356.328 377.63 356.172 390.423 343.278L 566.622 165.928"
+              android:name="path2455"
+              android:strokeColor="#FF000000"
+              android:fillColor="#FFFFFFFF"
+              android:strokeWidth="30.655000000000001"/>
+        <path android:pathData="M 170.515 451.566L 305.61 313.46"
+              android:name="path2457"
+              android:fillColor="#00000000"
+              android:strokeColor="#000000"
+              android:strokeWidth="30.655000000000001"/>
+        <path android:pathData="M 557.968 449.974L 426.515 315.375"
+              android:name="path2459"
+              android:fillColor="#00000000"
+              android:strokeColor="#000000"
+              android:strokeWidth="30.655000000000001"/>
+    </group>
+</vector>
diff --git a/samples/SupportVectorDrawable/static/res/drawable/vector_drawable07.xml b/samples/SupportVectorDrawable/static/res/drawable/vector_drawable07.xml
new file mode 100644
index 0000000..bbf2451
--- /dev/null
+++ b/samples/SupportVectorDrawable/static/res/drawable/vector_drawable07.xml
@@ -0,0 +1,29 @@
+<!-- Copyright (C) 2015 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+            android:width="64dp"
+            android:height="64dp" android:viewportWidth="140"
+          android:viewportHeight="110">
+
+    <group>
+        <path
+                android:name="back"
+                android:pathData="M 20,55 l 35.3-35.3 7.07,7.07-35.3,35.3 z
+              M 27,50 l 97,0 0,10-97,0 z
+              M 20,55 l 7.07-7.07 35.3,35.3-7.07,7.07 z"
+                android:fillColor="#ffffffff"
+                />
+    </group>
+</vector>
diff --git a/samples/SupportVectorDrawable/static/res/drawable/vector_drawable08.xml b/samples/SupportVectorDrawable/static/res/drawable/vector_drawable08.xml
new file mode 100644
index 0000000..e5b59df
--- /dev/null
+++ b/samples/SupportVectorDrawable/static/res/drawable/vector_drawable08.xml
@@ -0,0 +1,29 @@
+<!-- Copyright (C) 2015 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+            android:width="64dp"
+            android:height="64dp" android:viewportWidth="600"
+          android:viewportHeight="600">
+
+    <group>
+        <path
+                android:name="pie1"
+                android:pathData="M535.441,412.339A280.868,280.868 0 1,1 536.186,161.733L284.493,286.29Z"
+                android:fillColor="#ffffcc00"
+                android:strokeColor="#FF00FF00"
+                android:strokeWidth="1"/>
+    </group>
+
+</vector>
diff --git a/samples/SupportVectorDrawable/static/res/drawable/vector_drawable09.xml b/samples/SupportVectorDrawable/static/res/drawable/vector_drawable09.xml
new file mode 100644
index 0000000..ce2441d
--- /dev/null
+++ b/samples/SupportVectorDrawable/static/res/drawable/vector_drawable09.xml
@@ -0,0 +1,32 @@
+<!--
+ Copyright (C) 2015 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="64dp"
+        android:width="64dp"
+        android:viewportHeight="200"
+        android:viewportWidth="200" >
+
+    <group
+        android:pivotX="100"
+        android:pivotY="100"
+        android:rotation="90">
+        <path
+            android:name="house"
+            android:fillColor="#ffffffff"
+            android:pathData="M 100,20 l 0,0 0,140-80,0 z M 100,20 l 0,0 80,140-80,0 z"/>
+    </group>
+
+</vector>
\ No newline at end of file
diff --git a/samples/SupportVectorDrawable/static/res/drawable/vector_drawable10.xml b/samples/SupportVectorDrawable/static/res/drawable/vector_drawable10.xml
new file mode 100644
index 0000000..935d4a5
--- /dev/null
+++ b/samples/SupportVectorDrawable/static/res/drawable/vector_drawable10.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="64dp"
+        android:width="64dp"
+        android:viewportWidth="200"
+        android:viewportHeight="200">
+
+    <group>
+        <path
+            android:name="bar3"
+            android:fillColor="#FFFFFFFF"
+            android:pathData="M49.001,60c-5.466,0-9.899,4.478-9.899,10s4.434,10,9.899,10c5.468,0,9.899-4.478,9.899-10S54.469,60,49.001,60z" />
+        <path
+            android:name="bar2"
+            android:fillColor="#FFFFFFFF"
+            android:pathData="M28.001,48.787l7,7.07c7.731-7.811,20.269-7.81,28.001,0l6.999-7.07C58.403,37.071,39.599,37.071,28.001,48.787z" />
+        <path
+            android:name="bar1"
+            android:fillColor="#FF555555"
+            android:pathData="M14.001,34.645   L21,41.716c15.464-15.621,40.536-15.621,56,0l7.001-7.071C64.672,15.119,33.33,15.119,14.001,34.645z" />
+        <path
+            android:name="bar0"
+            android:fillColor="#FF555555"
+            android:pathData="M0,20.502l6.999,7.071   c23.196-23.431,60.806-23.431,84.002,0L98,20.503C70.938-6.834,27.063-6.834,0,20.502z" />
+    </group>
+
+</vector>
\ No newline at end of file
diff --git a/samples/SupportVectorDrawable/static/res/drawable/vector_drawable11.xml b/samples/SupportVectorDrawable/static/res/drawable/vector_drawable11.xml
new file mode 100644
index 0000000..05f481b
--- /dev/null
+++ b/samples/SupportVectorDrawable/static/res/drawable/vector_drawable11.xml
@@ -0,0 +1,35 @@
+<!--
+ Copyright (C) 2015 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="64dp"
+        android:width="64dp"
+        android:viewportHeight="80"
+        android:viewportWidth="40" >
+
+    <group>
+        <path
+            android:name="battery"
+            android:fillColor="#3388ff"
+            android:pathData="M 20.28125,2.0000002 C 17.352748,2.0000002 15,4.3527485 15,7.2812502 L 15,8.0000002 L 13.15625,8.0000002 C 9.7507553,8.0000002 7,10.750759 7,14.15625 L 7,39.84375 C 7,43.24924 9.7507558,46 13.15625,46 L 33.84375,46 C 37.249245,46 39.999999,43.24924 40,39.84375 L 40,14.15625 C 40,10.75076 37.249243,8.0000002 33.84375,8.0000002 L 32,8.0000002 L 32,7.2812502 C 32,4.3527485 29.647252,2.0000002 26.71875,2.0000002 L 20.28125,2.0000002 z"
+            android:strokeColor="#ff8833"
+            android:strokeWidth="1" />
+        <path
+            android:name="spark"
+            android:fillColor="#FFFF0000"
+            android:pathData="M 30,18.031528 L 25.579581,23.421071 L 29.370621,26.765348 L 20.096792,37 L 21.156922,28.014053 L 17,24.902844 L 20.880632,18 L 30,18.031528 z" />
+    </group>
+
+</vector>
\ No newline at end of file
diff --git a/samples/SupportVectorDrawable/static/res/drawable/vector_drawable12.xml b/samples/SupportVectorDrawable/static/res/drawable/vector_drawable12.xml
new file mode 100644
index 0000000..94338a7
--- /dev/null
+++ b/samples/SupportVectorDrawable/static/res/drawable/vector_drawable12.xml
@@ -0,0 +1,97 @@
+<!--
+ Copyright (C) 2015 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:name="rootGroup"
+        android:height="64dp"
+        android:width="64dp"
+        android:viewportHeight="600"
+        android:viewportWidth="600"
+        android:alpha="0.5" >
+
+    <group
+        android:name="rotationGroup"
+        android:pivotX="300.0"
+        android:pivotY="300.0"
+        android:rotation="45.0" >
+        <path
+            android:name="pie1"
+            android:fillColor="#00000000"
+            android:pathData="M300,70 a230,230 0 1,0 1,0 z"
+            android:strokeColor="#FF777777"
+            android:strokeWidth="70"
+            android:trimPathEnd=".75"
+            android:trimPathOffset="0"
+            android:trimPathStart="0" />
+        <path
+            android:name="v"
+            android:fillColor="#000000"
+            android:pathData="M300,70 l 0,-70 70,70 0,0 -70,70z" />
+
+        <group
+            android:name="translateToCenterGroup"
+            android:rotation="0.0"
+            android:translateX="200.0"
+            android:translateY="200.0" >
+            <group
+                android:name="rotationGroup2"
+                android:pivotX="0.0"
+                android:pivotY="0.0"
+                android:rotation="-45.0" >
+                <path
+                    android:name="twoLines1"
+                    android:pathData="@string/twoLinePathData"
+                    android:strokeColor="#FFFF0000"
+                    android:strokeWidth="20" />
+
+                <group
+                    android:name="translateGroupHalf"
+                    android:translateX="65.0"
+                    android:translateY="80.0" >
+                    <group
+                        android:name="rotationGroup3"
+                        android:pivotX="-65.0"
+                        android:pivotY="-80.0"
+                        android:rotation="-45.0" >
+                        <path
+                            android:name="twoLines2"
+                            android:fillColor="#FF00FF00"
+                            android:pathData="@string/twoLinePathData"
+                            android:strokeColor="#FF00FF00"
+                            android:strokeWidth="20" />
+
+                        <group
+                            android:name="translateGroup"
+                            android:translateX="65.0"
+                            android:translateY="80.0" >
+                            <group
+                                android:name="rotationGroupBlue"
+                                android:pivotX="-65.0"
+                                android:pivotY="-80.0"
+                                android:rotation="-45.0" >
+                                <path
+                                    android:name="twoLines3"
+                                    android:pathData="@string/twoLinePathData"
+                                    android:strokeColor="#FF0000FF"
+                                    android:strokeWidth="20" />
+                            </group>
+                        </group>
+                    </group>
+                </group>
+            </group>
+        </group>
+    </group>
+
+</vector>
\ No newline at end of file
diff --git a/samples/SupportVectorDrawable/static/res/drawable/vector_drawable13.xml b/samples/SupportVectorDrawable/static/res/drawable/vector_drawable13.xml
new file mode 100644
index 0000000..097e028
--- /dev/null
+++ b/samples/SupportVectorDrawable/static/res/drawable/vector_drawable13.xml
@@ -0,0 +1,37 @@
+<!--
+ Copyright (C) 2015 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="64dp"
+        android:width="64dp"
+        android:viewportHeight="400"
+        android:viewportWidth="600" >
+
+    <group>
+        <path
+            android:name="pie1"
+            android:fillColor="#ffffffff"
+            android:pathData="M300,200 h-150 a150,150 0 1,0 150,-150 z"
+            android:strokeColor="#FF00FF00"
+            android:strokeWidth="1" />
+        <path
+            android:name="half"
+            android:fillColor="#FFFF0000"
+            android:pathData="M275,175 v-150 a150,150 0 0,0 -150,150 z"
+            android:strokeColor="#FF0000FF"
+            android:strokeWidth="5" />
+    </group>
+
+</vector>
\ No newline at end of file
diff --git a/samples/SupportVectorDrawable/static/res/drawable/vector_drawable14.xml b/samples/SupportVectorDrawable/static/res/drawable/vector_drawable14.xml
new file mode 100644
index 0000000..102ae7a
--- /dev/null
+++ b/samples/SupportVectorDrawable/static/res/drawable/vector_drawable14.xml
@@ -0,0 +1,38 @@
+<!--
+ Copyright (C) 2015 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="64dp"
+        android:width="64dp"
+        android:viewportHeight="500"
+        android:viewportWidth="800" >
+
+    <group
+        android:pivotX="90"
+        android:pivotY="100"
+        android:rotation="20">
+        <path
+            android:name="pie2"
+            android:pathData="M200,350 l 50,-25
+           a25,12 -30 0,1 100,-50 l 50,-25
+           a25,25 -30 0,1 100,-50 l 50,-25
+           a25,37 -30 0,1 100,-50 l 50,-25
+           a25,50 -30 0,1 100,-50 l 50,-25"
+            android:fillColor="#00000000"
+            android:strokeColor="#FF00FF00"
+            android:strokeWidth="10" />
+    </group>
+
+</vector>
\ No newline at end of file
diff --git a/samples/SupportVectorDrawable/static/res/drawable/vector_drawable15.xml b/samples/SupportVectorDrawable/static/res/drawable/vector_drawable15.xml
new file mode 100644
index 0000000..bdfcf81
--- /dev/null
+++ b/samples/SupportVectorDrawable/static/res/drawable/vector_drawable15.xml
@@ -0,0 +1,34 @@
+<!--
+ Copyright (C) 2015 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="64dp"
+        android:width="64dp"
+        android:viewportHeight="400"
+        android:viewportWidth="500" >
+
+    <group
+        android:pivotX="250"
+        android:pivotY="200"
+        android:rotation="180">
+        <path
+            android:name="house"
+            android:fillColor="#ff440000"
+            android:pathData="M100,200 C100,100 250,100 250,200 S400,300 400,200"
+            android:strokeColor="#FFFF0000"
+            android:strokeWidth="10" />
+    </group>
+
+</vector>
\ No newline at end of file
diff --git a/samples/SupportVectorDrawable/static/res/drawable/vector_drawable16.xml b/samples/SupportVectorDrawable/static/res/drawable/vector_drawable16.xml
new file mode 100644
index 0000000..ed1efa0
--- /dev/null
+++ b/samples/SupportVectorDrawable/static/res/drawable/vector_drawable16.xml
@@ -0,0 +1,47 @@
+<!--
+ Copyright (C) 2015 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="64dp"
+        android:width="64dp"
+        android:viewportHeight="200"
+        android:viewportWidth="200" >
+
+    <group>
+        <path
+            android:name="background1"
+            android:pathData="M 0,0 l 100,0 l 0, 100 l -100, 0 z"
+            android:fillColor="#FF000000"/>
+        <path
+            android:name="background2"
+            android:pathData="M 100,100 l 100,0 l 0, 100 l -100, 0 z"
+            android:fillColor="#FF000000"/>
+    </group>
+    <group
+        android:pivotX="100"
+        android:pivotY="100"
+        android:rotation="90"
+        android:scaleX="0.75"
+        android:scaleY="0.5"
+        android:translateX="0.0"
+        android:translateY="100.0">
+        <path
+            android:name="twoLines"
+            android:pathData="M 100,10 v 90 M 10,100 h 90"
+            android:strokeColor="#FF00FF00"
+            android:strokeWidth="10" />
+    </group>
+
+</vector>
\ No newline at end of file
diff --git a/samples/SupportVectorDrawable/static/res/drawable/vector_drawable17.xml b/samples/SupportVectorDrawable/static/res/drawable/vector_drawable17.xml
new file mode 100644
index 0000000..ba15f41
--- /dev/null
+++ b/samples/SupportVectorDrawable/static/res/drawable/vector_drawable17.xml
@@ -0,0 +1,29 @@
+<!-- Copyright (C) 2015 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+            android:width="64dp"
+            android:height="64dp" android:viewportWidth="1200"
+          android:viewportHeight="600">
+
+    <group>
+        <path
+                android:name="house"
+                android:pathData="M200,300 Q400,50 600,300 T1000,300"
+                android:fillColor="#00000000"
+                android:strokeColor="#FFFF0000"
+                android:strokeWidth="10"/>
+    </group>
+
+</vector>
diff --git a/samples/SupportVectorDrawable/static/res/drawable/vector_drawable18.xml b/samples/SupportVectorDrawable/static/res/drawable/vector_drawable18.xml
new file mode 100644
index 0000000..ee2122a
--- /dev/null
+++ b/samples/SupportVectorDrawable/static/res/drawable/vector_drawable18.xml
@@ -0,0 +1,31 @@
+<!--
+ Copyright (C) 2015 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="64dp"
+        android:width="64dp"
+        android:viewportHeight="400"
+        android:viewportWidth="500" >
+
+    <group>
+        <path
+            android:name="house"
+            android:pathData="M100,200 C100,100 250,100 250,200 S400,300 400,200"
+            android:fillColor="#00000000"
+            android:strokeColor="#FFFFFF00"
+            android:strokeWidth="10" />
+    </group>
+
+</vector>
\ No newline at end of file
diff --git a/samples/SupportVectorDrawable/static/res/drawable/vector_drawable19.xml b/samples/SupportVectorDrawable/static/res/drawable/vector_drawable19.xml
new file mode 100644
index 0000000..b98e1de
--- /dev/null
+++ b/samples/SupportVectorDrawable/static/res/drawable/vector_drawable19.xml
@@ -0,0 +1,33 @@
+<!--
+ Copyright (C) 2015 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="64dp"
+        android:width="64dp"
+        android:viewportHeight="800"
+        android:viewportWidth="1000" >
+
+    <group>
+        <path
+            android:name="house"
+            android:pathData="M10,300 Q400,550 600,300 T1000,300"
+            android:pivotX="90"
+            android:pivotY="100"
+            android:fillColor="#00000000"
+            android:strokeColor="#FFFF0000"
+            android:strokeWidth="60" />
+    </group>
+
+</vector>
\ No newline at end of file
diff --git a/samples/SupportVectorDrawable/static/res/drawable/vector_drawable20.xml b/samples/SupportVectorDrawable/static/res/drawable/vector_drawable20.xml
new file mode 100644
index 0000000..1c86818
--- /dev/null
+++ b/samples/SupportVectorDrawable/static/res/drawable/vector_drawable20.xml
@@ -0,0 +1,34 @@
+<!--
+ Copyright (C) 2015 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="64dp"
+        android:width="64dp"
+        android:viewportHeight="480"
+        android:viewportWidth="480" >
+
+    <group>
+        <path
+            android:name="edit"
+            android:fillColor="#FF00FFFF"
+            android:pathData="M406.667,180c0,0 -100 -100 -113.334 -113.333
+    c-13.333 -13.334 -33.333,0 -33.333,0l-160,160c0,0 -40,153.333 -40,173.333c0,13.333,13.333,13.333,13.333,13.333l173.334 -40
+    c0,0,146.666 -146.666,160 -160C420,200,406.667,180,406.667,180z M226.399,356.823L131.95,378.62l-38.516 -38.522
+    c7.848 -34.675,20.152 -82.52,23.538 -95.593l3.027,2.162l106.667,106.666L226.399,356.823z"
+            android:strokeColor="#FF000000"
+            android:strokeWidth="10" />
+    </group>
+
+</vector>
\ No newline at end of file
diff --git a/samples/SupportVectorDrawable/static/res/drawable/vector_drawable21.xml b/samples/SupportVectorDrawable/static/res/drawable/vector_drawable21.xml
new file mode 100644
index 0000000..247f6bc
--- /dev/null
+++ b/samples/SupportVectorDrawable/static/res/drawable/vector_drawable21.xml
@@ -0,0 +1,47 @@
+<!--
+ Copyright (C) 2015 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="64dp"
+        android:width="64dp"
+        android:viewportHeight="200"
+        android:viewportWidth="200" >
+
+    <group>
+        <path
+            android:name="background1"
+            android:pathData="M 0,0 l 100,0 l 0, 100 l -100, 0 z"
+            android:fillColor="#FF000000"/>
+        <path
+            android:name="background2"
+            android:pathData="M 100,100 l 100,0 l 0, 100 l -100, 0 z"
+            android:fillColor="#FF000000"/>
+    </group>
+    <group
+        android:pivotX="0"
+        android:pivotY="0"
+        android:rotation="90"
+        android:scaleX="0.75"
+        android:scaleY="0.5"
+        android:translateX="100.0"
+        android:translateY="100.0">
+        <path
+            android:name="twoLines"
+            android:pathData="M 100,10 v 90 M 10,100 h 90"
+            android:strokeColor="#FF00FF00"
+            android:strokeWidth="10" />
+    </group>
+
+</vector>
\ No newline at end of file
diff --git a/samples/SupportVectorDrawable/static/res/drawable/vector_drawable22.xml b/samples/SupportVectorDrawable/static/res/drawable/vector_drawable22.xml
new file mode 100644
index 0000000..39d891f
--- /dev/null
+++ b/samples/SupportVectorDrawable/static/res/drawable/vector_drawable22.xml
@@ -0,0 +1,68 @@
+<!--
+ Copyright (C) 2015 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="64dp"
+        android:width="64dp"
+        android:viewportHeight="400"
+        android:viewportWidth="400" >
+
+    <group android:name="backgroundGroup" >
+        <path
+            android:name="background1"
+            android:fillColor="#80000000"
+            android:pathData="M 0,0 l 200,0 l 0, 200 l -200, 0 z" />
+        <path
+            android:name="background2"
+            android:fillColor="#80000000"
+            android:pathData="M 200,200 l 200,0 l 0, 200 l -200, 0 z" />
+    </group>
+    <group
+        android:name="translateToCenterGroup"
+        android:translateX="50.0"
+        android:translateY="90.0" >
+        <path
+            android:name="twoLines"
+            android:pathData="M 0,0 v 100 M 0,0 h 100"
+            android:strokeColor="#FFFF0000"
+            android:strokeWidth="20" />
+
+        <group
+            android:name="rotationGroup"
+            android:pivotX="0.0"
+            android:pivotY="0.0"
+            android:rotation="-45.0" >
+            <path
+                android:name="twoLines1"
+                android:pathData="M 0,0 v 100 M 0,0 h 100"
+                android:strokeColor="#FF00FF00"
+                android:strokeWidth="20" />
+
+            <group
+                android:name="translateGroup"
+                android:translateX="130.0"
+                android:translateY="160.0" >
+                <group android:name="scaleGroup" >
+                    <path
+                        android:name="twoLines2"
+                        android:pathData="M 0,0 v 100 M 0,0 h 100"
+                        android:strokeColor="#FF0000FF"
+                        android:strokeWidth="20" />
+                </group>
+            </group>
+        </group>
+    </group>
+
+</vector>
\ No newline at end of file
diff --git a/samples/SupportVectorDrawable/static/res/drawable/vector_drawable23.xml b/samples/SupportVectorDrawable/static/res/drawable/vector_drawable23.xml
new file mode 100644
index 0000000..4a1c062
--- /dev/null
+++ b/samples/SupportVectorDrawable/static/res/drawable/vector_drawable23.xml
@@ -0,0 +1,82 @@
+<!--
+ Copyright (C) 2015 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="64dp"
+        android:width="64dp"
+        android:viewportHeight="400"
+        android:viewportWidth="400" >
+
+    <group android:name="backgroundGroup" >
+        <path
+            android:name="background1"
+            android:fillColor="#80000000"
+            android:pathData="M 0,0 l 200,0 l 0, 200 l -200, 0 z" />
+        <path
+            android:name="background2"
+            android:fillColor="#80000000"
+            android:pathData="M 200,200 l 200,0 l 0, 200 l -200, 0 z" />
+    </group>
+    <group
+        android:name="translateToCenterGroup"
+        android:translateX="50.0"
+        android:translateY="90.0" >
+        <path
+            android:name="twoLines"
+            android:pathData="@string/twoLinePathData"
+            android:strokeColor="#FFFF0000"
+            android:strokeWidth="20" />
+
+        <group
+            android:name="rotationGroup"
+            android:pivotX="0.0"
+            android:pivotY="0.0"
+            android:rotation="-45.0" >
+            <path
+                android:name="twoLines1"
+                android:pathData="@string/twoLinePathData"
+                android:strokeColor="#FF00FF00"
+                android:strokeWidth="20" />
+
+            <group
+                android:name="translateGroup"
+                android:translateX="130.0"
+                android:translateY="160.0" >
+                <group android:name="scaleGroup" >
+                    <path
+                        android:name="twoLines3"
+                        android:pathData="@string/twoLinePathData"
+                        android:strokeColor="#FF0000FF"
+                        android:strokeWidth="20" />
+                </group>
+            </group>
+
+            <group
+                android:name="translateGroupHalf"
+                android:translateX="65.0"
+                android:translateY="80.0" >
+                <group android:name="scaleGroup" >
+                    <path
+                        android:name="twoLines2"
+                        android:pathData="@string/twoLinePathData"
+                        android:fillColor="?android:attr/colorForeground"
+                        android:strokeColor="?android:attr/colorForeground"
+                        android:strokeWidth="20" />
+                </group>
+            </group>
+        </group>
+    </group>
+
+</vector>
\ No newline at end of file
diff --git a/samples/SupportVectorDrawable/static/res/drawable/vector_drawable24.xml b/samples/SupportVectorDrawable/static/res/drawable/vector_drawable24.xml
new file mode 100644
index 0000000..a7a8bd3
--- /dev/null
+++ b/samples/SupportVectorDrawable/static/res/drawable/vector_drawable24.xml
@@ -0,0 +1,82 @@
+<!--
+ Copyright (C) 2015 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="64dp"
+        android:width="64dp"
+        android:viewportHeight="400"
+        android:viewportWidth="400" >
+
+    <group android:name="backgroundGroup">
+        <path
+            android:name="background1"
+            android:fillColor="#FF000000"
+            android:pathData="M 0,0 l 200,0 l 0, 200 l -200, 0 z" />
+        <path
+            android:name="background2"
+            android:fillColor="#FF000000"
+            android:pathData="M 200,200 l 200,0 l 0, 200 l -200, 0 z" />
+    </group>
+    <group
+        android:name="translateToCenterGroup"
+        android:translateX="50.0"
+        android:translateY="90.0" >
+        <path
+            android:name="twoLines"
+            android:pathData="@string/twoLinePathData"
+            android:strokeColor="#FFFF0000"
+            android:strokeWidth="20" />
+
+        <group
+            android:name="rotationGroup"
+            android:pivotX="0.0"
+            android:pivotY="0.0"
+            android:rotation="-45.0">
+            <path
+                android:name="twoLines1"
+                android:pathData="@string/twoLinePathData"
+                android:strokeColor="#FF00FF00"
+                android:strokeWidth="20" />
+
+            <group
+                android:name="translateGroup"
+                android:translateX="130.0"
+                android:translateY="160.0">
+                <group android:name="scaleGroup" >
+                    <path
+                        android:name="twoLines3"
+                        android:pathData="@string/twoLinePathData"
+                        android:strokeColor="#FF0000FF"
+                        android:strokeWidth="20" />
+                </group>
+            </group>
+
+            <group
+                android:name="translateGroupHalf"
+                android:translateX="65.0"
+                android:translateY="80.0">
+                <group android:name="scaleGroup" >
+                    <path
+                        android:name="twoLines2"
+                        android:pathData="@string/twoLinePathData"
+                        android:fillColor="?android:attr/colorForeground"
+                        android:strokeColor="?android:attr/colorForeground"
+                        android:strokeWidth="20" />
+                </group>
+            </group>
+        </group>
+    </group>
+
+</vector>
\ No newline at end of file
diff --git a/samples/SupportVectorDrawable/static/res/drawable/vector_drawable25.xml b/samples/SupportVectorDrawable/static/res/drawable/vector_drawable25.xml
new file mode 100644
index 0000000..7c9e771
--- /dev/null
+++ b/samples/SupportVectorDrawable/static/res/drawable/vector_drawable25.xml
@@ -0,0 +1,82 @@
+<!--
+ Copyright (C) 2015 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="64dp"
+        android:width="64dp"
+        android:viewportHeight="400"
+        android:viewportWidth="400" >
+
+    <group
+        android:name="FirstLevelGroup"
+        android:translateX="100.0"
+        android:translateY="0.0" >
+        <group
+            android:name="SecondLevelGroup1"
+            android:translateX="-100.0"
+            android:translateY="50.0" >
+            <path
+                android:fillColor="#FF00FF00"
+                android:pathData="@string/rectangle200" />
+
+            <group
+                android:name="ThridLevelGroup1"
+                android:translateX="-100.0"
+                android:translateY="50.0" >
+                <path
+                    android:fillColor="#FF0000FF"
+                    android:pathData="@string/rectangle200" />
+            </group>
+            <group
+                android:name="ThridLevelGroup2"
+                android:translateX="100.0"
+                android:translateY="50.0" >
+                <path
+                    android:fillColor="#FF000000"
+                    android:pathData="@string/rectangle200" />
+            </group>
+        </group>
+        <group
+            android:name="SecondLevelGroup2"
+            android:translateX="100.0"
+            android:translateY="50.0" >
+            <path
+                android:fillColor="#FF0000FF"
+                android:pathData="@string/rectangle200" />
+
+            <group
+                android:name="ThridLevelGroup3"
+                android:translateX="-100.0"
+                android:translateY="50.0" >
+                <path
+                    android:fillColor="#FFFF0000"
+                    android:pathData="@string/rectangle200" />
+            </group>
+            <group
+                android:name="ThridLevelGroup4"
+                android:translateX="100.0"
+                android:translateY="50.0" >
+                <path
+                    android:fillColor="#FF00FF00"
+                    android:pathData="@string/rectangle200" />
+            </group>
+        </group>
+
+        <path
+            android:fillColor="#FFFF0000"
+            android:pathData="@string/rectangle200" />
+    </group>
+
+</vector>
\ No newline at end of file
diff --git a/samples/SupportVectorDrawable/static/res/drawable/vector_drawable26.xml b/samples/SupportVectorDrawable/static/res/drawable/vector_drawable26.xml
new file mode 100644
index 0000000..eda06d8
--- /dev/null
+++ b/samples/SupportVectorDrawable/static/res/drawable/vector_drawable26.xml
@@ -0,0 +1,45 @@
+<!--
+ Copyright (C) 2015 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:height="64dp"
+    android:viewportHeight="200"
+    android:viewportWidth="200"
+    android:width="64dp" >
+
+    <group>
+        <path
+            android:name="background1"
+            android:fillColor="#FF000000"
+            android:pathData="M 0,0 l 100,0 l 0, 100 l -100, 0 z" />
+        <path
+            android:name="background2"
+            android:fillColor="#FF000000"
+            android:pathData="M 100,100 l 100,0 l 0, 100 l -100, 0 z" />
+    </group>
+    <group
+        android:translateX="50"
+        android:translateY="50" >
+        <path
+            android:name="twoLines"
+            android:pathData="M 100,20 l 0 80 l -30 -80"
+            android:strokeColor="#FF00FF00"
+            android:strokeLineCap="butt"
+            android:strokeLineJoin="miter"
+            android:strokeMiterLimit="5"
+            android:strokeWidth="20" />
+    </group>
+
+</vector>
\ No newline at end of file
diff --git a/samples/SupportVectorDrawable/static/res/drawable/vector_drawable27.xml b/samples/SupportVectorDrawable/static/res/drawable/vector_drawable27.xml
new file mode 100644
index 0000000..cd46dd9
--- /dev/null
+++ b/samples/SupportVectorDrawable/static/res/drawable/vector_drawable27.xml
@@ -0,0 +1,45 @@
+<!--
+ Copyright (C) 2015 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:height="64dp"
+    android:viewportHeight="200"
+    android:viewportWidth="200"
+    android:width="64dp" >
+
+    <group>
+        <path
+            android:name="background1"
+            android:fillColor="#FF000000"
+            android:pathData="M 0,0 l 100,0 l 0, 100 l -100, 0 z" />
+        <path
+            android:name="background2"
+            android:fillColor="#FF000000"
+            android:pathData="M 100,100 l 100,0 l 0, 100 l -100, 0 z" />
+    </group>
+    <group
+        android:translateX="50"
+        android:translateY="50" >
+        <path
+            android:name="twoLines"
+            android:pathData="M 100,20 l 0 80 l -30 -80"
+            android:strokeColor="#FF00FF00"
+            android:strokeLineCap="round"
+            android:strokeLineJoin="round"
+            android:strokeMiterLimit="10"
+            android:strokeWidth="20" />
+    </group>
+
+</vector>
\ No newline at end of file
diff --git a/samples/SupportVectorDrawable/static/res/drawable/vector_drawable28.xml b/samples/SupportVectorDrawable/static/res/drawable/vector_drawable28.xml
new file mode 100644
index 0000000..812af6b
--- /dev/null
+++ b/samples/SupportVectorDrawable/static/res/drawable/vector_drawable28.xml
@@ -0,0 +1,46 @@
+<!--
+ Copyright (C) 2015 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:height="64dp"
+    android:viewportHeight="200"
+    android:viewportWidth="200"
+    android:width="64dp"
+    android:autoMirrored="true" >
+
+    <group>
+        <path
+            android:name="background1"
+            android:fillColor="#FF000000"
+            android:pathData="M 0,0 l 100,0 l 0, 100 l -100, 0 z" />
+        <path
+            android:name="background2"
+            android:fillColor="#FF000000"
+            android:pathData="M 100,100 l 100,0 l 0, 100 l -100, 0 z" />
+    </group>
+    <group
+        android:translateX="50"
+        android:translateY="50" >
+        <path
+            android:name="twoLines"
+            android:pathData="M 100,20 l 0 80 l -30 -80"
+            android:strokeColor="#FF00FF00"
+            android:strokeLineCap="square"
+            android:strokeLineJoin="bevel"
+            android:strokeMiterLimit="10"
+            android:strokeWidth="20" />
+    </group>
+
+</vector>
\ No newline at end of file
diff --git a/samples/SupportVectorDrawable/static/res/drawable/vector_drawable29.xml b/samples/SupportVectorDrawable/static/res/drawable/vector_drawable29.xml
new file mode 100644
index 0000000..b24d31c
--- /dev/null
+++ b/samples/SupportVectorDrawable/static/res/drawable/vector_drawable29.xml
@@ -0,0 +1,28 @@
+<!--
+ Copyright (C) 2015 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="48dp"
+        android:width="48dp"
+        android:viewportHeight="1"
+        android:viewportWidth="1" >
+
+    <group>
+        <path
+            android:name="box1"
+            android:pathData="l0.0.0.5.0.0.5-0.5.0.0-.5z"
+            android:fillColor="#ff00ff00"/>
+    </group>
+</vector>
diff --git a/samples/SupportVectorDrawable/static/res/drawable/vector_drawable30.xml b/samples/SupportVectorDrawable/static/res/drawable/vector_drawable30.xml
new file mode 100644
index 0000000..24f7372
--- /dev/null
+++ b/samples/SupportVectorDrawable/static/res/drawable/vector_drawable30.xml
@@ -0,0 +1,28 @@
+<!--
+ Copyright (C) 2015 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="48dp"
+        android:width="48dp"
+        android:viewportHeight="48"
+        android:viewportWidth="48" >
+
+    <group>
+        <path
+            android:name="plus1"
+            android:pathData="M20 16h-4v8h-8v4h8v8h4v-8h8v-4h-8zm9-3.84v3.64l5-1v21.2h4v-26z"
+            android:fillColor="#ff00ff00"/>
+    </group>
+</vector>
diff --git a/samples/SupportVectorDrawable/static/res/drawable/vector_drawable_scale0.xml b/samples/SupportVectorDrawable/static/res/drawable/vector_drawable_scale0.xml
new file mode 100644
index 0000000..828f0d9
--- /dev/null
+++ b/samples/SupportVectorDrawable/static/res/drawable/vector_drawable_scale0.xml
@@ -0,0 +1,57 @@
+<!--
+ Copyright (C) 2015 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:height="64dp"
+    android:viewportHeight="200"
+    android:viewportWidth="200"
+    android:width="64dp" >
+
+    <group>
+        <path
+            android:name="background1"
+            android:fillColor="@color/color0"
+            android:pathData="M 0,0 l 100,0 l 0, 100 l -100, 0 z" />
+        <path
+            android:name="background2"
+            android:fillColor="@color/color2"
+            android:pathData="M 100,100 l 100,0 l 0, 100 l -100, 0 z" />
+    </group>
+    <group
+        android:pivotX="0"
+        android:pivotY="0"
+        android:rotation="90" >
+        <group
+            android:scaleX="1.5"
+            android:scaleY="1" >
+            <group
+                android:pivotX="0"
+                android:pivotY="0"
+                android:rotation="-90" >
+                <group
+                    android:scaleX="1.5"
+                    android:scaleY="1" >
+                    <path
+                        android:name="twoLines"
+                        android:fillColor="#FFFF0000"
+                        android:pathData="@string/triangle100"
+                        android:strokeColor="#FF00FF00"
+                        android:strokeWidth="10" />
+                </group>
+            </group>
+        </group>
+    </group>
+
+</vector>
\ No newline at end of file
diff --git a/samples/SupportVectorDrawable/static/res/drawable/vector_drawable_scale1.xml b/samples/SupportVectorDrawable/static/res/drawable/vector_drawable_scale1.xml
new file mode 100644
index 0000000..530c73b
--- /dev/null
+++ b/samples/SupportVectorDrawable/static/res/drawable/vector_drawable_scale1.xml
@@ -0,0 +1,52 @@
+<!--
+ Copyright (C) 2015 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:height="64dp"
+    android:viewportHeight="200"
+    android:viewportWidth="200"
+    android:width="64dp" >
+
+    <group>
+        <path
+            android:name="background1"
+            android:fillColor="#FF000000"
+            android:pathData="M 0,0 l 100,0 l 0, 100 l -100, 0 z" />
+        <path
+            android:name="background2"
+            android:fillColor="#FF000000"
+            android:pathData="M 100,100 l 100,0 l 0, 100 l -100, 0 z" />
+    </group>
+    <group
+        android:scaleX="-1"
+        android:scaleY="-1" >
+        <group
+            android:scaleX="-1"
+            android:scaleY="-1" >
+            <group
+                android:pivotX="100"
+                android:pivotY="100"
+                android:rotation="45" >
+                <path
+                    android:name="twoLines"
+                    android:fillColor="#FFFF0000"
+                    android:pathData="M 100, 0 l 0, 100, -100, 0 z"
+                    android:strokeColor="#FF00FF00"
+                    android:strokeWidth="10" />
+            </group>
+        </group>
+    </group>
+
+</vector>
\ No newline at end of file
diff --git a/samples/SupportVectorDrawable/static/res/drawable/vector_drawable_scale2.xml b/samples/SupportVectorDrawable/static/res/drawable/vector_drawable_scale2.xml
new file mode 100644
index 0000000..200eb61
--- /dev/null
+++ b/samples/SupportVectorDrawable/static/res/drawable/vector_drawable_scale2.xml
@@ -0,0 +1,48 @@
+<!--
+ Copyright (C) 2015 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:height="64dp"
+    android:viewportHeight="200"
+    android:viewportWidth="200"
+    android:width="64dp" >
+
+    <group>
+        <path
+            android:name="background1"
+            android:fillColor="#FF000000"
+            android:pathData="M 0,0 l 100,0 l 0, 100 l -100, 0 z" />
+        <path
+            android:name="background2"
+            android:fillColor="#FF000000"
+            android:pathData="M 100,100 l 100,0 l 0, 100 l -100, 0 z" />
+    </group>
+    <group
+        android:scaleX="2"
+        android:scaleY="0.5" >
+        <group
+            android:pivotX="100"
+            android:pivotY="100"
+            android:rotation="45" >
+            <path
+                android:name="twoLines"
+                android:fillColor="#FFFF0000"
+                android:pathData="M 100, 0 l 0, 100, -100, 0 z"
+                android:strokeColor="#FF00FF00"
+                android:strokeWidth="10" />
+        </group>
+    </group>
+
+</vector>
\ No newline at end of file
diff --git a/samples/SupportVectorDrawable/static/res/drawable/vector_drawable_scale3.xml b/samples/SupportVectorDrawable/static/res/drawable/vector_drawable_scale3.xml
new file mode 100644
index 0000000..a40fc9c
--- /dev/null
+++ b/samples/SupportVectorDrawable/static/res/drawable/vector_drawable_scale3.xml
@@ -0,0 +1,62 @@
+<!--
+ Copyright (C) 2015 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:height="64dp"
+    android:viewportHeight="200"
+    android:viewportWidth="200"
+    android:width="64dp" >
+
+    <group>
+        <path
+            android:name="background1"
+            android:fillColor="#FF000000"
+            android:pathData="M 0,0 l 100,0 l 0, 100 l -100, 0 z" />
+        <path
+            android:name="background2"
+            android:fillColor="#FF000000"
+            android:pathData="M 100,100 l 100,0 l 0, 100 l -100, 0 z" />
+    </group>
+    <group
+        android:pivotX="0"
+        android:pivotY="0"
+        android:rotation="45" >
+        <group
+            android:pivotX="0"
+            android:pivotY="0"
+            android:rotation="90" >
+            <group
+                android:scaleX="1.5"
+                android:scaleY="1" >
+                <group
+                    android:pivotX="0"
+                    android:pivotY="0"
+                    android:rotation="-90" >
+                    <group
+                        android:scaleX="1.5"
+                        android:scaleY="1" >
+                        <path
+                            android:name="twoLines"
+                            android:fillColor="#FFFF0000"
+                            android:pathData="M 100, 0 l 0, 100, -100, 0 z"
+                            android:strokeColor="#FF00FF00"
+                            android:strokeWidth="10" />
+                    </group>
+                </group>
+            </group>
+        </group>
+    </group>
+
+</vector>
\ No newline at end of file
diff --git a/samples/SupportVectorDrawable/static/res/drawable/vector_test01.xml b/samples/SupportVectorDrawable/static/res/drawable/vector_test01.xml
new file mode 100644
index 0000000..8b891d6
--- /dev/null
+++ b/samples/SupportVectorDrawable/static/res/drawable/vector_test01.xml
@@ -0,0 +1,31 @@
+<!--
+ Copyright (C) 2015 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="128dp"
+        android:width="128dp"
+        android:viewportHeight="512"
+        android:viewportWidth="512" >
+
+    <group>
+        <path
+            android:name="002b"
+            android:pathData="M100,200c0,-100 150,-100 150,0s150,100 150,0t-200,299"
+            android:strokeColor="#FF0000FF"
+            android:strokeWidth="4"
+            android:fillColor="#00000000" />
+    </group>
+
+</vector>
\ No newline at end of file
diff --git a/samples/SupportVectorDrawable/static/res/drawable/vector_test02.xml b/samples/SupportVectorDrawable/static/res/drawable/vector_test02.xml
new file mode 100644
index 0000000..e0af323
--- /dev/null
+++ b/samples/SupportVectorDrawable/static/res/drawable/vector_test02.xml
@@ -0,0 +1,31 @@
+<!--
+ Copyright (C) 2015 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:height="128dp"
+        android:width="128dp"
+        android:viewportHeight="512"
+        android:viewportWidth="512" >
+
+    <group>
+        <path
+            android:name="002b"
+            android:pathData="M100,200c0,-100 150,-100 150,0s150,100 150,0T-200,299"
+            android:strokeColor="#FF0000FF"
+            android:strokeWidth="4"
+            android:fillColor="#00000000" />
+    </group>
+
+</vector>
\ No newline at end of file
diff --git a/samples/SupportVectorDrawable/static/res/raw/vector_drawable01.xml b/samples/SupportVectorDrawable/static/res/raw/vector_drawable01.xml
new file mode 100644
index 0000000..baa3fc7
--- /dev/null
+++ b/samples/SupportVectorDrawable/static/res/raw/vector_drawable01.xml
@@ -0,0 +1,32 @@
+<!--
+ Copyright (C) 2015 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        xmlns:auto="http://schemas.android.com/apk/res-auto"
+        android:height="48dp"
+        android:width="48dp"
+        android:viewportHeight="480"
+        android:viewportWidth="480" >
+
+    <group>
+        <path
+            android:name="box1"
+            android:pathData="m20,200l100,90l180-180l-35-35l-145,145l-60-60l-40,40z"
+            android:fillColor="?android:attr/colorControlActivated"
+            android:strokeColor="?android:attr/colorControlActivated"
+            android:strokeLineCap="round"
+            android:strokeLineJoin="round" />
+    </group>
+</vector>
diff --git a/samples/SupportVectorDrawable/static/res/values/colors.xml b/samples/SupportVectorDrawable/static/res/values/colors.xml
new file mode 100644
index 0000000..6eb3036
--- /dev/null
+++ b/samples/SupportVectorDrawable/static/res/values/colors.xml
@@ -0,0 +1,20 @@
+<!-- Copyright (C) 2015 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="color0">#a6e4ea</color>
+    <color name="color1">#ff3838</color>
+    <color name="color2">#ffff51</color>
+    <color name="color3">#0ed300</color>
+</resources>
diff --git a/samples/SupportVectorDrawable/static/res/values/strings.xml b/samples/SupportVectorDrawable/static/res/values/strings.xml
new file mode 100644
index 0000000..065e7d9
--- /dev/null
+++ b/samples/SupportVectorDrawable/static/res/values/strings.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2015 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="twoLinePathData">"M 0,0 v 100 M 0,0 h 100"</string>
+    <string name="triangle"> "M300,70 l 0,-70 70,70 0,0   -70,70z"</string>
+    <string name="rectangle">"M300,70 l 0,-70 70,0  0,140 -70,0 z"</string>
+    <string name="rectangle2">"M300,70 l 0,-70 70,0  0,70z M300,70  l 70,0 0,70 -70,0z"</string>
+    <string name="equal2">    "M300,35 l 0,-35 70,0  0,35z M300,105 l 70,0 0,35 -70,0z"</string>
+    <string name="round_box">"m2.10001,-6c-1.9551,0 -0.5,0.02499 -2.10001,0.02499c-1.575,0 0.0031,-0.02499 -1.95,-0.02499c-2.543,0 -4,2.2816 -4,4.85001c0,3.52929 0.25,6.25 5.95,6.25c5.7,0 6,-2.72071 6,-6.25c0,-2.56841 -1.35699,-4.85001 -3.89999,-4.85001"</string>
+    <string name="heart">    "m4.5,-7c-1.95509,0 -3.83009,1.26759 -4.5,3c-0.66991,-1.73241 -2.54691,-3 -4.5,-3c-2.543,0 -4.5,1.93159 -4.5,4.5c0,3.5293 3.793,6.2578 9,11.5c5.207,-5.2422 9,-7.9707 9,-11.5c0,-2.56841 -1.957,-4.5 -4.5,-4.5"</string>
+    <string name="rectangle200">"M 0,0 l 200,0 l 0, 200 l -200, 0 z"</string>
+    <string name="triangle100">"M 100, 0 l 0, 100, -100, 0 z"</string>
+</resources>
diff --git a/samples/SupportVectorDrawable/static/rundemo.sh b/samples/SupportVectorDrawable/static/rundemo.sh
new file mode 100755
index 0000000..2695b53
--- /dev/null
+++ b/samples/SupportVectorDrawable/static/rundemo.sh
@@ -0,0 +1,6 @@
+. $ANDROID_BUILD_TOP/build/envsetup.sh && \
+mmm -j20 . && \
+adb install -r $OUT/data/app/SupportVectorDrawable/SupportVectorDrawable.apk && \
+adb shell am start -n com.example.android.support.vectordrawable/com.example.android.support.vectordrawable.app.SimpleButtonBackground
+
+
diff --git a/samples/SupportVectorDrawable/static/src/com/example/android/support/vectordrawable/app/SimpleButtonBackground.java b/samples/SupportVectorDrawable/static/src/com/example/android/support/vectordrawable/app/SimpleButtonBackground.java
new file mode 100644
index 0000000..79a51ac
--- /dev/null
+++ b/samples/SupportVectorDrawable/static/src/com/example/android/support/vectordrawable/app/SimpleButtonBackground.java
@@ -0,0 +1,137 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.example.android.support.vectordrawable.app;
+
+import android.app.Activity;
+import android.content.res.Resources;
+import android.graphics.PorterDuff.Mode;
+import android.graphics.drawable.Drawable.ConstantState;
+import android.os.Bundle;
+import android.support.graphics.drawable.VectorDrawableCompat;
+import android.widget.Button;
+import android.widget.LinearLayout;
+import android.widget.ScrollView;
+import android.widget.TextView;
+import com.example.android.support.vectordrawable.R;
+
+import java.text.DecimalFormat;
+
+public class SimpleButtonBackground extends Activity {
+    private static final String LOG_TAG = "SimpleButtonBackground";
+
+    private static final String LOGCAT = "VectorDrawable1";
+    protected int[] icon = {
+            R.drawable.vector_drawable_scale0,
+            R.drawable.vector_drawable_scale1,
+            R.drawable.vector_drawable_scale2,
+            R.drawable.vector_drawable_scale3,
+            R.drawable.vector_drawable01,
+            R.drawable.vector_drawable02,
+            R.drawable.vector_drawable03,
+            R.drawable.vector_drawable04,
+            R.drawable.vector_drawable05,
+            R.drawable.vector_drawable06,
+            R.drawable.vector_drawable07,
+            R.drawable.vector_drawable08,
+            R.drawable.vector_drawable09,
+            R.drawable.vector_drawable10,
+            R.drawable.vector_drawable11,
+            R.drawable.vector_drawable12,
+            R.drawable.vector_drawable13,
+            R.drawable.vector_drawable14,
+            R.drawable.vector_drawable15,
+            R.drawable.vector_drawable16,
+            R.drawable.vector_drawable17,
+            R.drawable.vector_drawable18,
+            R.drawable.vector_drawable19,
+            R.drawable.vector_drawable20,
+            R.drawable.vector_drawable21,
+            R.drawable.vector_drawable22,
+            R.drawable.vector_drawable23,
+            R.drawable.vector_drawable24,
+            R.drawable.vector_drawable25,
+            R.drawable.vector_drawable26,
+            R.drawable.vector_drawable27,
+            R.drawable.vector_drawable28,
+            R.drawable.vector_drawable29,
+            R.drawable.vector_drawable30,
+            R.drawable.vector_test01,
+            R.drawable.vector_test02
+    };
+
+    private static final int EXTRA_TESTS = 2;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        ScrollView scrollView = new ScrollView(this);
+        LinearLayout container = new LinearLayout(this);
+        scrollView.addView(container);
+        container.setOrientation(LinearLayout.VERTICAL);
+        Resources res = this.getResources();
+        container.setBackgroundColor(0xFF888888);
+        VectorDrawableCompat []d = new VectorDrawableCompat[icon.length];
+        long time =  android.os.SystemClock.currentThreadTimeMillis();
+        for (int i = 0; i < icon.length; i++) {
+             d[i] = VectorDrawableCompat.create(res, icon[i], getTheme());
+        }
+        time =  android.os.SystemClock.currentThreadTimeMillis()-time;
+
+        // Testing Tint on one particular case.
+        if (d.length > 3) {
+            d[3].setTint(0x8000FF00);
+            d[3].setTintMode(Mode.MULTIPLY);
+        }
+
+        // Testing Constant State like operation by creating the first 2 icons
+        // from the 3rd one's constant state.
+        VectorDrawableCompat []extras = new VectorDrawableCompat[EXTRA_TESTS];
+        ConstantState state = d[0].getConstantState();
+        extras[0] = (VectorDrawableCompat) state.newDrawable();
+        extras[1] = (VectorDrawableCompat) state.newDrawable();
+
+        // This alpha change is expected to affect both extra 0, 1, and d0.
+        extras[0].setAlpha(128);
+
+        d[0].mutate();
+        d[0].setAlpha(255);
+
+        // Just show the average create time as the first view.
+        TextView t = new TextView(this);
+        DecimalFormat df = new DecimalFormat("#.##");
+        t.setText("avgL=" + df.format(time / (icon.length)) + " ms");
+        container.addView(t);
+
+        addDrawableButtons(container, extras);
+
+        addDrawableButtons(container, d);
+
+        setContentView(scrollView);
+    }
+
+    private void addDrawableButtons(LinearLayout container, VectorDrawableCompat[] d) {
+        // Add the VD into consequent views.
+        for (int i = 0; i < d.length; i++) {
+            Button button = new Button(this);
+            button.setWidth(200);
+            // Note that setBackgroundResource() will fail b/c createFromXmlInner() failed
+            // to recognize <vector> pre-L.
+            button.setBackgroundDrawable(d[i]);
+            container.addView(button);
+        }
+    }
+}
diff --git a/settings.gradle b/settings.gradle
index 0e5c223..f29434a 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -1,9 +1,31 @@
 apply from:'buildSrc/studioCompat.gradle'
+
+/////////////////////////////
+//
+// Libraries
+//
+/////////////////////////////
+
 include ':support-annotations'
 project(':support-annotations').projectDir = new File(rootDir, 'annotations')
 
+include ':support-compat'
+project(':support-compat').projectDir = new File(rootDir, 'compat')
+
+include ':support-media-compat'
+project(':support-media-compat').projectDir = new File(rootDir, 'media-compat')
+
+include ':support-core-ui'
+project(':support-core-ui').projectDir = new File(rootDir, 'core-ui')
+
+include ':support-fragment'
+project(':support-fragment').projectDir = new File(rootDir, 'fragment')
+
+include ':support-core-utils'
+project(':support-core-utils').projectDir = new File(rootDir, 'v4')
+
 include ':support-v4'
-project(':support-v4').projectDir = new File(rootDir, 'v4')
+project(':support-v4').projectDir = new File(rootDir, 'core-combined')
 
 include ':support-appcompat-v7'
 project(':support-appcompat-v7').projectDir = new File(rootDir, 'v7/appcompat')
@@ -59,3 +81,49 @@
 include ':support-animated-vector-drawable'
 project(':support-animated-vector-drawable').projectDir = new File(rootDir, 'graphics/drawable/animated')
 
+include ':support-transition'
+project(':support-transition').projectDir = new File(rootDir, 'transition')
+
+
+/////////////////////////////
+//
+// Samples
+//
+/////////////////////////////
+
+File samplesRoot = new File(rootDir, 'samples')
+
+include ':support-design-demos'
+project(':support-design-demos').projectDir = new File(samplesRoot, 'SupportDesignDemos')
+
+include ':support-leanback-demos'
+project(':support-leanback-demos').projectDir = new File(samplesRoot, 'SupportLeanbackDemos')
+
+include ':support-percent-demos'
+project(':support-percent-demos').projectDir = new File(samplesRoot, 'SupportPercentDemos')
+
+include ':support-preference-demos'
+project(':support-preference-demos').projectDir = new File(samplesRoot, 'SupportPreferenceDemos')
+
+include ':support-transition-demos'
+project(':support-transition-demos').projectDir = new File(samplesRoot, 'SupportTransitionDemos')
+
+include ':support-v4-demos'
+project(':support-v4-demos').projectDir = new File(samplesRoot, 'Support4Demos')
+
+include ':support-v7-demos'
+project(':support-v7-demos').projectDir = new File(samplesRoot, 'Support7Demos')
+
+include ':support-v13-demos'
+project(':support-v13-demos').projectDir = new File(samplesRoot, 'Support13Demos')
+
+/////////////////////////////
+//
+// External
+//
+/////////////////////////////
+
+File externalRoot = new File(rootDir, '../../external')
+
+include ':doclava'
+project(':doclava').projectDir = new File(externalRoot, 'doclava')
diff --git a/transition/Android.mk b/transition/Android.mk
new file mode 100644
index 0000000..140c632
--- /dev/null
+++ b/transition/Android.mk
@@ -0,0 +1,72 @@
+# Copyright (C) 2016 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.
+
+LOCAL_PATH := $(call my-dir)
+
+# Build the resources using the latest applicable SDK version.
+# We do this here because the final static library must be compiled with an older
+# SDK version than the resources.  The resources library and the R class that it
+# contains will not be linked into the final static library.
+include $(CLEAR_VARS)
+LOCAL_MODULE := android-support-transition-res
+LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
+LOCAL_SRC_FILES := $(call all-java-files-under, dummy)
+LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
+LOCAL_JAR_EXCLUDE_FILES := none
+LOCAL_JAVA_LANGUAGE_VERSION := 1.7
+include $(BUILD_STATIC_JAVA_LIBRARY)
+
+# A helper sub-library to resolve cyclic dependencies between Transition and platform dependent
+# implementations
+include $(CLEAR_VARS)
+LOCAL_MODULE := android-support-transition-base
+LOCAL_SDK_VERSION := 14
+LOCAL_SRC_FILES := $(call all-java-files-under, base)
+LOCAL_JAVA_LANGUAGE_VERSION := 1.7
+LOCAL_JAVA_LIBRARIES := android-support-transition-res \
+    android-support-v4
+include $(BUILD_STATIC_JAVA_LIBRARY)
+
+# A helper sub-library that makes direct use of Ice Cream Sandwich APIs
+include $(CLEAR_VARS)
+LOCAL_MODULE := android-support-transition-ics
+LOCAL_SDK_VERSION := 14
+LOCAL_SRC_FILES := $(call all-java-files-under, ics)
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-transition-base
+LOCAL_JAVA_LIBRARIES := android-support-transition-res \
+    android-support-v4
+include $(BUILD_STATIC_JAVA_LIBRARY)
+
+# A helper sub-library that makes direct use of KitKat APIs
+include $(CLEAR_VARS)
+LOCAL_MODULE := android-support-transition-kitkat
+LOCAL_SDK_VERSION := 19
+LOCAL_SRC_FILES := $(call all-java-files-under, kitkat)
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-transition-ics
+LOCAL_JAVA_LIBRARIES := android-support-transition-res \
+    android-support-v4
+include $(BUILD_STATIC_JAVA_LIBRARY)
+
+# Here is the final static library that apps can link against.
+# The R class is automatically excluded from the generated library.
+# Applications that use this library must specify LOCAL_RESOURCE_DIR
+# in their makefiles to include the resources in their package.
+include $(CLEAR_VARS)
+LOCAL_MODULE := android-support-transition
+LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-transition-kitkat
+LOCAL_JAVA_LIBRARIES := android-support-transition-res \
+    android-support-v4
+include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/transition/AndroidManifest.xml b/transition/AndroidManifest.xml
new file mode 100644
index 0000000..672e1b1
--- /dev/null
+++ b/transition/AndroidManifest.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2016 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+          package="android.support.transition">
+    <uses-sdk android:minSdkVersion="14"/>
+    <application />
+</manifest>
diff --git a/transition/base/android/support/transition/SceneImpl.java b/transition/base/android/support/transition/SceneImpl.java
new file mode 100644
index 0000000..0ee9461
--- /dev/null
+++ b/transition/base/android/support/transition/SceneImpl.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2016 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 android.support.transition;
+
+import android.view.View;
+import android.view.ViewGroup;
+
+/**
+ * Base class for platform specific Scene implementations.
+ */
+abstract class SceneImpl {
+
+    public abstract void init(ViewGroup sceneRoot);
+
+    public abstract void init(ViewGroup sceneRoot, View layout);
+
+    public abstract ViewGroup getSceneRoot();
+
+    public abstract void exit();
+
+    public abstract void enter();
+
+    public abstract void setEnterAction(Runnable action);
+
+    public abstract void setExitAction(Runnable action);
+
+}
diff --git a/transition/base/android/support/transition/SceneStaticsImpl.java b/transition/base/android/support/transition/SceneStaticsImpl.java
new file mode 100644
index 0000000..2d8a138
--- /dev/null
+++ b/transition/base/android/support/transition/SceneStaticsImpl.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2016 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 android.support.transition;
+
+import android.content.Context;
+import android.view.ViewGroup;
+
+abstract class SceneStaticsImpl {
+
+    public abstract SceneImpl getSceneForLayout(ViewGroup sceneRoot, int layoutId, Context context);
+
+}
diff --git a/transition/base/android/support/transition/TransitionImpl.java b/transition/base/android/support/transition/TransitionImpl.java
new file mode 100644
index 0000000..ab482b8
--- /dev/null
+++ b/transition/base/android/support/transition/TransitionImpl.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2016 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 android.support.transition;
+
+import android.animation.Animator;
+import android.animation.TimeInterpolator;
+import android.view.View;
+import android.view.ViewGroup;
+
+import java.util.List;
+
+/**
+ * Base class for platform specific Transition implementations.
+ */
+abstract class TransitionImpl {
+
+    public abstract void init(TransitionInterface external, Object internal);
+
+    public void init(TransitionInterface external) {
+        init(external, null);
+    }
+
+    public abstract TransitionImpl addListener(TransitionInterfaceListener listener);
+
+    public abstract TransitionImpl removeListener(TransitionInterfaceListener listener);
+
+    public abstract TransitionImpl addTarget(View target);
+
+    public abstract TransitionImpl addTarget(int targetId);
+
+    public abstract void captureEndValues(TransitionValues transitionValues);
+
+    public abstract void captureStartValues(TransitionValues transitionValues);
+
+    public abstract Animator createAnimator(ViewGroup sceneRoot,
+            TransitionValues startValues, TransitionValues endValues);
+
+    public abstract TransitionImpl excludeChildren(View target, boolean exclude);
+
+    public abstract TransitionImpl excludeChildren(int targetId, boolean exclude);
+
+    public abstract TransitionImpl excludeChildren(Class type, boolean exclude);
+
+    public abstract TransitionImpl excludeTarget(View target, boolean exclude);
+
+    public abstract TransitionImpl excludeTarget(int targetId, boolean exclude);
+
+    public abstract TransitionImpl excludeTarget(Class type, boolean exclude);
+
+    public abstract long getDuration();
+
+    public abstract TransitionImpl setDuration(long duration);
+
+    public abstract TimeInterpolator getInterpolator();
+
+    public abstract TransitionImpl setInterpolator(TimeInterpolator interpolator);
+
+    public abstract String getName();
+
+    public abstract long getStartDelay();
+
+    public abstract TransitionImpl setStartDelay(long startDelay);
+
+    public abstract List<Integer> getTargetIds();
+
+    public abstract List<View> getTargets();
+
+    public abstract String[] getTransitionProperties();
+
+    public abstract TransitionValues getTransitionValues(View view, boolean start);
+
+    public abstract TransitionImpl removeTarget(View target);
+
+    public abstract TransitionImpl removeTarget(int targetId);
+
+}
diff --git a/transition/base/android/support/transition/TransitionInterface.java b/transition/base/android/support/transition/TransitionInterface.java
new file mode 100644
index 0000000..c498bd0
--- /dev/null
+++ b/transition/base/android/support/transition/TransitionInterface.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2016 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 android.support.transition;
+
+import android.animation.Animator;
+import android.view.ViewGroup;
+
+/**
+ * Used to reference android.support.transition.Transition in a backward compatible manner.
+ */
+interface TransitionInterface {
+
+    void captureEndValues(TransitionValues transitionValues);
+
+    void captureStartValues(TransitionValues transitionValues);
+
+    Animator createAnimator(ViewGroup sceneRoot,
+            TransitionValues startValues, TransitionValues endValues);
+
+}
diff --git a/transition/base/android/support/transition/TransitionInterfaceListener.java b/transition/base/android/support/transition/TransitionInterfaceListener.java
new file mode 100644
index 0000000..9d27759
--- /dev/null
+++ b/transition/base/android/support/transition/TransitionInterfaceListener.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2016 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 android.support.transition;
+
+interface TransitionInterfaceListener<TransitionT extends TransitionInterface> {
+
+    void onTransitionStart(TransitionT transition);
+
+    void onTransitionEnd(TransitionT transition);
+
+    void onTransitionCancel(TransitionT transition);
+
+    void onTransitionPause(TransitionT transition);
+
+    void onTransitionResume(TransitionT transition);
+
+}
diff --git a/transition/base/android/support/transition/TransitionManagerImpl.java b/transition/base/android/support/transition/TransitionManagerImpl.java
new file mode 100644
index 0000000..861e875
--- /dev/null
+++ b/transition/base/android/support/transition/TransitionManagerImpl.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2016 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 android.support.transition;
+
+/**
+ * Base class for platform specific TransitionManager implementations.
+ */
+abstract class TransitionManagerImpl {
+
+    public abstract void setTransition(SceneImpl scene, TransitionImpl transition);
+
+    public abstract void setTransition(SceneImpl fromScene, SceneImpl toScene,
+            TransitionImpl transition);
+
+    public abstract void transitionTo(SceneImpl scene);
+
+}
diff --git a/transition/base/android/support/transition/TransitionManagerStaticsImpl.java b/transition/base/android/support/transition/TransitionManagerStaticsImpl.java
new file mode 100644
index 0000000..5171ba9
--- /dev/null
+++ b/transition/base/android/support/transition/TransitionManagerStaticsImpl.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2016 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 android.support.transition;
+
+import android.view.ViewGroup;
+
+/**
+ * Base class for platform specific TransitionManager implementations.
+ */
+abstract class TransitionManagerStaticsImpl {
+
+    public abstract void go(SceneImpl scene);
+
+    public abstract void go(SceneImpl scene, TransitionImpl transition);
+
+    public abstract void beginDelayedTransition(final ViewGroup sceneRoot);
+
+    public abstract void beginDelayedTransition(final ViewGroup sceneRoot,
+            TransitionImpl transition);
+
+}
diff --git a/transition/base/android/support/transition/TransitionSetImpl.java b/transition/base/android/support/transition/TransitionSetImpl.java
new file mode 100644
index 0000000..5c5e8a6
--- /dev/null
+++ b/transition/base/android/support/transition/TransitionSetImpl.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2016 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 android.support.transition;
+
+interface TransitionSetImpl {
+
+    int getOrdering();
+
+    TransitionSetImpl setOrdering(int ordering);
+
+    TransitionSetImpl addTransition(TransitionImpl transition);
+
+    TransitionSetImpl removeTransition(TransitionImpl transition);
+
+}
diff --git a/transition/base/android/support/transition/TransitionValues.java b/transition/base/android/support/transition/TransitionValues.java
new file mode 100644
index 0000000..8181ad4
--- /dev/null
+++ b/transition/base/android/support/transition/TransitionValues.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2016 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 android.support.transition;
+
+import android.view.View;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Data structure which holds cached values for the transition.
+ * The view field is the target which all of the values pertain to.
+ * The values field is a map which holds information for fields
+ * according to names selected by the transitions. These names should
+ * be unique to avoid clobbering values stored by other transitions,
+ * such as the convention project:transition_name:property_name. For
+ * example, the platform might store a property "alpha" in a transition
+ * "Fader" as "android:fader:alpha".
+ *
+ * <p>These values are cached during the
+ * {@link android.support.transition.Transition#captureStartValues(TransitionValues)}
+ * capture} phases of a scene change, once when the start values are captured
+ * and again when the end values are captured. These start/end values are then
+ * passed into the transitions via the
+ * for {@link android.support.transition.Transition#createAnimator(android.view.ViewGroup,
+ * TransitionValues, TransitionValues)} method.</p>
+ */
+public class TransitionValues {
+
+    /**
+     * The set of values tracked by transitions for this scene
+     */
+    public final Map<String, Object> values = new HashMap<>();
+
+    /**
+     * The View with these values
+     */
+    public View view;
+
+    @Override
+    public boolean equals(Object other) {
+        if (other instanceof TransitionValues) {
+            if (view == ((TransitionValues) other).view) {
+                if (values.equals(((TransitionValues) other).values)) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    @Override
+    public int hashCode() {
+        return 31 * view.hashCode() + values.hashCode();
+    }
+
+    @Override
+    public String toString() {
+        String returnValue = "TransitionValues@" + Integer.toHexString(hashCode()) + ":\n";
+        returnValue += "    view = " + view + "\n";
+        returnValue += "    values:";
+        for (String s : values.keySet()) {
+            returnValue += "    " + s + ": " + values.get(s) + "\n";
+        }
+        return returnValue;
+    }
+
+}
diff --git a/transition/build.gradle b/transition/build.gradle
new file mode 100644
index 0000000..4afc572
--- /dev/null
+++ b/transition/build.gradle
@@ -0,0 +1,118 @@
+apply plugin: 'com.android.library'
+
+archivesBaseName = 'transition'
+
+dependencies {
+    compile project(':support-v4')
+
+    androidTestCompile ('com.android.support.test:runner:0.4.1') {
+        exclude module: 'support-annotations'
+    }
+    androidTestCompile ('com.android.support.test.espresso:espresso-core:2.2.1') {
+        exclude module: 'support-annotations'
+    }
+    androidTestCompile 'org.mockito:mockito-core:1.9.5'
+    androidTestCompile 'com.google.dexmaker:dexmaker:1.2'
+    androidTestCompile 'com.google.dexmaker:dexmaker-mockito:1.2'
+    testCompile 'junit:junit:4.12'
+}
+
+android {
+    compileSdkVersion project.ext.currentSdk
+
+    defaultConfig {
+        minSdkVersion 14
+        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
+    }
+
+    sourceSets {
+        main.manifest.srcFile 'AndroidManifest.xml'
+        main.java.srcDirs = ['base', 'ics', 'kitkat', 'src']
+        main.res.srcDirs 'res', 'res-public'
+        main.assets.srcDir 'assets'
+        main.resources.srcDir 'src'
+
+        androidTest.setRoot('tests')
+        androidTest.java.srcDir 'tests/src'
+        androidTest.res.srcDir 'tests/res'
+        androidTest.manifest.srcFile 'tests/AndroidManifest.xml'
+    }
+
+    compileOptions {
+        sourceCompatibility JavaVersion.VERSION_1_7
+        targetCompatibility JavaVersion.VERSION_1_7
+    }
+
+    lintOptions {
+        // TODO: fix errors and reenable.
+        abortOnError false
+    }
+}
+
+android.libraryVariants.all { variant ->
+    def name = variant.buildType.name
+
+    if (name.equals(com.android.builder.core.BuilderConstants.DEBUG)) {
+        return; // Skip debug builds.
+    }
+    def suffix = name.capitalize()
+
+    def jarTask = project.tasks.create(name: "jar${suffix}", type: Jar){
+        dependsOn variant.javaCompile
+        from variant.javaCompile.destinationDir
+        from 'LICENSE.txt'
+    }
+    def javadocTask = project.tasks.create(name: "javadoc${suffix}", type: Javadoc) {
+        source android.sourceSets.main.java
+        classpath = files(variant.javaCompile.classpath.files) + files(
+                "${android.sdkDirectory}/platforms/${android.compileSdkVersion}/android.jar")
+    }
+
+    def javadocJarTask = project.tasks.create(name: "javadocJar${suffix}", type: Jar) {
+        classifier = 'javadoc'
+        from 'build/docs/javadoc'
+    }
+
+    def sourcesJarTask = project.tasks.create(name: "sourceJar${suffix}", type: Jar) {
+        classifier = 'sources'
+        from android.sourceSets.main.java.srcDirs
+    }
+
+    artifacts.add('archives', javadocJarTask);
+    artifacts.add('archives', sourcesJarTask);
+}
+
+uploadArchives {
+    repositories {
+        mavenDeployer {
+            repository(url: uri(rootProject.ext.supportRepoOut)) {
+            }
+
+            pom.project {
+                name 'Android Transition Support Library'
+                description "The Support Library is a static library that you can add to your Android application in order to use APIs that are either not available for older platform versions or utility APIs that aren't a part of the framework APIs. Compatible on devices running API 4 or later."
+                url 'http://developer.android.com/tools/extras/support-library.html'
+                inceptionYear '2011'
+
+                licenses {
+                    license {
+                        name 'The Apache Software License, Version 2.0'
+                        url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
+                        distribution 'repo'
+                    }
+                }
+
+                scm {
+                    url "http://source.android.com"
+                    connection "scm:git:https://android.googlesource.com/platform/frameworks/support"
+                }
+                developers {
+                    developer {
+                        name 'The Android Open Source Project'
+                    }
+                }
+            }
+        }
+    }
+}
+
diff --git a/transition/ics/android/support/transition/AutoTransitionPort.java b/transition/ics/android/support/transition/AutoTransitionPort.java
new file mode 100644
index 0000000..071813f
--- /dev/null
+++ b/transition/ics/android/support/transition/AutoTransitionPort.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2016 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 android.support.transition;
+
+/**
+ * Utility class for creating a default transition that automatically fades,
+ * moves, and resizes views during a scene change.
+ *
+ * <p>An AutoTransition can be described in a resource file by using the
+ * tag <code>autoTransition</code>, along with the other standard
+ * attributes of {@link android.R.styleable#Transition}.</p>
+ */
+class AutoTransitionPort extends TransitionSetPort {
+
+    /**
+     * Constructs an AutoTransition object, which is a TransitionSet which
+     * first fades out disappearing targets, then moves and resizes existing
+     * targets, and finally fades in appearing targets.
+     */
+    public AutoTransitionPort() {
+        setOrdering(ORDERING_SEQUENTIAL);
+        addTransition(new FadePort(FadePort.OUT)).
+                addTransition(new ChangeBoundsPort()).
+                addTransition(new FadePort(FadePort.IN));
+    }
+}
diff --git a/transition/ics/android/support/transition/ChangeBoundsIcs.java b/transition/ics/android/support/transition/ChangeBoundsIcs.java
new file mode 100644
index 0000000..9b070fe
--- /dev/null
+++ b/transition/ics/android/support/transition/ChangeBoundsIcs.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2016 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 android.support.transition;
+
+class ChangeBoundsIcs extends TransitionIcs {
+
+    public ChangeBoundsIcs(TransitionInterface transition) {
+        init(transition, new ChangeBoundsPort());
+    }
+
+}
diff --git a/transition/ics/android/support/transition/ChangeBoundsPort.java b/transition/ics/android/support/transition/ChangeBoundsPort.java
new file mode 100644
index 0000000..6151018
--- /dev/null
+++ b/transition/ics/android/support/transition/ChangeBoundsPort.java
@@ -0,0 +1,348 @@
+/*
+ * Copyright (C) 2016 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 android.support.transition;
+
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.ObjectAnimator;
+import android.animation.PropertyValuesHolder;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Rect;
+import android.graphics.drawable.BitmapDrawable;
+import android.view.View;
+import android.view.ViewGroup;
+
+import java.util.Map;
+
+/**
+ * This transition captures the layout bounds of target views before and after
+ * the scene change and animates those changes during the transition.
+ *
+ * <p>A ChangeBounds transition can be described in a resource file by using the
+ * tag <code>changeBounds</code>, along with the other standard
+ * attributes of {@link android.R.styleable#Transition}.</p>
+ */
+class ChangeBoundsPort extends TransitionPort {
+
+    private static final String PROPNAME_BOUNDS = "android:changeBounds:bounds";
+
+    private static final String PROPNAME_PARENT = "android:changeBounds:parent";
+
+    private static final String PROPNAME_WINDOW_X = "android:changeBounds:windowX";
+
+    private static final String PROPNAME_WINDOW_Y = "android:changeBounds:windowY";
+
+    private static final String[] sTransitionProperties = {
+            PROPNAME_BOUNDS,
+            PROPNAME_PARENT,
+            PROPNAME_WINDOW_X,
+            PROPNAME_WINDOW_Y
+    };
+
+    private static final String LOG_TAG = "ChangeBounds";
+
+    private static RectEvaluator sRectEvaluator = new RectEvaluator();
+
+    int[] tempLocation = new int[2];
+
+    boolean mResizeClip = false;
+
+    boolean mReparent = false;
+
+    @Override
+    public String[] getTransitionProperties() {
+        return sTransitionProperties;
+    }
+
+    public void setResizeClip(boolean resizeClip) {
+        mResizeClip = resizeClip;
+    }
+
+    /**
+     * Setting this flag tells ChangeBounds to track the before/after parent
+     * of every view using this transition. The flag is not enabled by
+     * default because it requires the parent instances to be the same
+     * in the two scenes or else all parents must use ids to allow
+     * the transition to determine which parents are the same.
+     *
+     * @param reparent true if the transition should track the parent
+     *                 container of target views and animate parent changes.
+     */
+    public void setReparent(boolean reparent) {
+        mReparent = reparent;
+    }
+
+    private void captureValues(TransitionValues values) {
+        View view = values.view;
+        values.values.put(PROPNAME_BOUNDS, new Rect(view.getLeft(), view.getTop(),
+                view.getRight(), view.getBottom()));
+        values.values.put(PROPNAME_PARENT, values.view.getParent());
+        values.view.getLocationInWindow(tempLocation);
+        values.values.put(PROPNAME_WINDOW_X, tempLocation[0]);
+        values.values.put(PROPNAME_WINDOW_Y, tempLocation[1]);
+    }
+
+    @Override
+    public void captureStartValues(TransitionValues transitionValues) {
+        captureValues(transitionValues);
+    }
+
+    @Override
+    public void captureEndValues(TransitionValues transitionValues) {
+        captureValues(transitionValues);
+    }
+
+    @Override
+    public Animator createAnimator(final ViewGroup sceneRoot, TransitionValues startValues,
+            TransitionValues endValues) {
+        if (startValues == null || endValues == null) {
+            return null;
+        }
+        Map<String, Object> startParentVals = startValues.values;
+        Map<String, Object> endParentVals = endValues.values;
+        ViewGroup startParent = (ViewGroup) startParentVals.get(PROPNAME_PARENT);
+        ViewGroup endParent = (ViewGroup) endParentVals.get(PROPNAME_PARENT);
+        if (startParent == null || endParent == null) {
+            return null;
+        }
+        final View view = endValues.view;
+        boolean parentsEqual = (startParent == endParent) ||
+                (startParent.getId() == endParent.getId());
+        // TODO: Might want reparenting to be separate/subclass transition, or at least
+        // triggered by a property on ChangeBounds. Otherwise, we're forcing the requirement that
+        // all parents in layouts have IDs to avoid layout-inflation resulting in a side-effect
+        // of reparenting the views.
+        if (!mReparent || parentsEqual) {
+            Rect startBounds = (Rect) startValues.values.get(PROPNAME_BOUNDS);
+            Rect endBounds = (Rect) endValues.values.get(PROPNAME_BOUNDS);
+            int startLeft = startBounds.left;
+            int endLeft = endBounds.left;
+            int startTop = startBounds.top;
+            int endTop = endBounds.top;
+            int startRight = startBounds.right;
+            int endRight = endBounds.right;
+            int startBottom = startBounds.bottom;
+            int endBottom = endBounds.bottom;
+            int startWidth = startRight - startLeft;
+            int startHeight = startBottom - startTop;
+            int endWidth = endRight - endLeft;
+            int endHeight = endBottom - endTop;
+            int numChanges = 0;
+            if (startWidth != 0 && startHeight != 0 && endWidth != 0 && endHeight != 0) {
+                if (startLeft != endLeft) {
+                    ++numChanges;
+                }
+                if (startTop != endTop) {
+                    ++numChanges;
+                }
+                if (startRight != endRight) {
+                    ++numChanges;
+                }
+                if (startBottom != endBottom) {
+                    ++numChanges;
+                }
+            }
+            if (numChanges > 0) {
+                if (!mResizeClip) {
+                    PropertyValuesHolder pvh[] = new PropertyValuesHolder[numChanges];
+                    int pvhIndex = 0;
+                    if (startLeft != endLeft) {
+                        view.setLeft(startLeft);
+                    }
+                    if (startTop != endTop) {
+                        view.setTop(startTop);
+                    }
+                    if (startRight != endRight) {
+                        view.setRight(startRight);
+                    }
+                    if (startBottom != endBottom) {
+                        view.setBottom(startBottom);
+                    }
+                    if (startLeft != endLeft) {
+                        pvh[pvhIndex++] = PropertyValuesHolder.ofInt("left", startLeft, endLeft);
+                    }
+                    if (startTop != endTop) {
+                        pvh[pvhIndex++] = PropertyValuesHolder.ofInt("top", startTop, endTop);
+                    }
+                    if (startRight != endRight) {
+                        pvh[pvhIndex++] = PropertyValuesHolder.ofInt("right",
+                                startRight, endRight);
+                    }
+                    if (startBottom != endBottom) {
+                        pvh[pvhIndex++] = PropertyValuesHolder.ofInt("bottom",
+                                startBottom, endBottom);
+                    }
+                    ObjectAnimator anim = ObjectAnimator.ofPropertyValuesHolder(view, pvh);
+                    if (view.getParent() instanceof ViewGroup) {
+                        final ViewGroup parent = (ViewGroup) view.getParent();
+//                        parent.suppressLayout(true);
+                        TransitionListener transitionListener = new TransitionListenerAdapter() {
+                            boolean mCanceled = false;
+
+                            @Override
+                            public void onTransitionCancel(TransitionPort transition) {
+//                                parent.suppressLayout(false);
+                                mCanceled = true;
+                            }
+
+                            @Override
+                            public void onTransitionEnd(TransitionPort transition) {
+                                if (!mCanceled) {
+//                                    parent.suppressLayout(false);
+                                }
+                            }
+
+                            @Override
+                            public void onTransitionPause(TransitionPort transition) {
+//                                parent.suppressLayout(false);
+                            }
+
+                            @Override
+                            public void onTransitionResume(TransitionPort transition) {
+//                                parent.suppressLayout(true);
+                            }
+                        };
+                        addListener(transitionListener);
+                    }
+                    return anim;
+                } else {
+                    if (startWidth != endWidth) {
+                        view.setRight(endLeft +
+                                Math.max(startWidth, endWidth));
+                    }
+                    if (startHeight != endHeight) {
+                        view.setBottom(endTop +
+                                Math.max(startHeight, endHeight));
+                    }
+                    // TODO: don't clobber TX/TY
+                    if (startLeft != endLeft) {
+                        view.setTranslationX(startLeft - endLeft);
+                    }
+                    if (startTop != endTop) {
+                        view.setTranslationY(startTop - endTop);
+                    }
+                    // Animate location with translationX/Y and size with clip bounds
+                    float transXDelta = endLeft - startLeft;
+                    float transYDelta = endTop - startTop;
+                    int widthDelta = endWidth - startWidth;
+                    int heightDelta = endHeight - startHeight;
+                    numChanges = 0;
+                    if (transXDelta != 0) {
+                        numChanges++;
+                    }
+                    if (transYDelta != 0) {
+                        numChanges++;
+                    }
+                    if (widthDelta != 0 || heightDelta != 0) {
+                        numChanges++;
+                    }
+                    PropertyValuesHolder pvh[] = new PropertyValuesHolder[numChanges];
+                    int pvhIndex = 0;
+                    if (transXDelta != 0) {
+                        pvh[pvhIndex++] = PropertyValuesHolder.ofFloat("translationX",
+                                view.getTranslationX(), 0);
+                    }
+                    if (transYDelta != 0) {
+                        pvh[pvhIndex++] = PropertyValuesHolder.ofFloat("translationY",
+                                view.getTranslationY(), 0);
+                    }
+                    if (widthDelta != 0 || heightDelta != 0) {
+                        Rect tempStartBounds = new Rect(0, 0, startWidth, startHeight);
+                        Rect tempEndBounds = new Rect(0, 0, endWidth, endHeight);
+//                        pvh[pvhIndex++] = PropertyValuesHolder.ofObject("clipBounds",
+//                                sRectEvaluator, tempStartBounds, tempEndBounds);
+                    }
+                    ObjectAnimator anim = ObjectAnimator.ofPropertyValuesHolder(view, pvh);
+                    if (view.getParent() instanceof ViewGroup) {
+                        final ViewGroup parent = (ViewGroup) view.getParent();
+//                        parent.suppressLayout(true);
+                        TransitionListener transitionListener = new TransitionListenerAdapter() {
+                            boolean mCanceled = false;
+
+                            @Override
+                            public void onTransitionCancel(TransitionPort transition) {
+//                                parent.suppressLayout(false);
+                                mCanceled = true;
+                            }
+
+                            @Override
+                            public void onTransitionEnd(TransitionPort transition) {
+                                if (!mCanceled) {
+//                                    parent.suppressLayout(false);
+                                }
+                            }
+
+                            @Override
+                            public void onTransitionPause(TransitionPort transition) {
+//                                parent.suppressLayout(false);
+                            }
+
+                            @Override
+                            public void onTransitionResume(TransitionPort transition) {
+//                                parent.suppressLayout(true);
+                            }
+                        };
+                        addListener(transitionListener);
+                    }
+                    anim.addListener(new AnimatorListenerAdapter() {
+                        @Override
+                        public void onAnimationEnd(Animator animation) {
+//                            view.setClipBounds(null);
+                        }
+                    });
+                    return anim;
+                }
+            }
+        } else {
+            int startX = (Integer) startValues.values.get(PROPNAME_WINDOW_X);
+            int startY = (Integer) startValues.values.get(PROPNAME_WINDOW_Y);
+            int endX = (Integer) endValues.values.get(PROPNAME_WINDOW_X);
+            int endY = (Integer) endValues.values.get(PROPNAME_WINDOW_Y);
+            // TODO: also handle size changes: check bounds and animate size changes
+            if (startX != endX || startY != endY) {
+                sceneRoot.getLocationInWindow(tempLocation);
+                Bitmap bitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(),
+                        Bitmap.Config.ARGB_8888);
+                Canvas canvas = new Canvas(bitmap);
+                view.draw(canvas);
+                final BitmapDrawable drawable = new BitmapDrawable(bitmap);
+                view.setVisibility(View.INVISIBLE);
+                ViewOverlay.createFrom(sceneRoot).add(drawable);
+//                sceneRoot.getOverlay().add(drawable);
+                Rect startBounds1 = new Rect(startX - tempLocation[0], startY - tempLocation[1],
+                        startX - tempLocation[0] + view.getWidth(),
+                        startY - tempLocation[1] + view.getHeight());
+                Rect endBounds1 = new Rect(endX - tempLocation[0], endY - tempLocation[1],
+                        endX - tempLocation[0] + view.getWidth(),
+                        endY - tempLocation[1] + view.getHeight());
+                ObjectAnimator anim = ObjectAnimator.ofObject(drawable, "bounds",
+                        sRectEvaluator, startBounds1, endBounds1);
+                anim.addListener(new AnimatorListenerAdapter() {
+                    @Override
+                    public void onAnimationEnd(Animator animation) {
+                        ViewOverlay.createFrom(sceneRoot).remove(drawable);
+//                        sceneRoot.getOverlay().remove(drawable);
+                        view.setVisibility(View.VISIBLE);
+                    }
+                });
+                return anim;
+            }
+        }
+        return null;
+    }
+}
diff --git a/transition/ics/android/support/transition/FadeIcs.java b/transition/ics/android/support/transition/FadeIcs.java
new file mode 100644
index 0000000..e72a28f
--- /dev/null
+++ b/transition/ics/android/support/transition/FadeIcs.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2016 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 android.support.transition;
+
+class FadeIcs extends TransitionIcs {
+
+    public FadeIcs(TransitionInterface transition) {
+        init(transition, new FadePort());
+    }
+
+    public FadeIcs(TransitionInterface transition, int fadingMode) {
+        init(transition, new FadePort(fadingMode));
+    }
+
+}
diff --git a/transition/ics/android/support/transition/FadePort.java b/transition/ics/android/support/transition/FadePort.java
new file mode 100644
index 0000000..027a907
--- /dev/null
+++ b/transition/ics/android/support/transition/FadePort.java
@@ -0,0 +1,356 @@
+/*
+ * Copyright (C) 2016 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 android.support.transition;
+
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.ObjectAnimator;
+import android.animation.ValueAnimator;
+import android.util.Log;
+import android.view.View;
+import android.view.ViewGroup;
+
+/**
+ * This transition tracks changes to the visibility of target views in the
+ * start and end scenes and fades views in or out when they become visible
+ * or non-visible. Visibility is determined by both the
+ * {@link View#setVisibility(int)} state of the view as well as whether it
+ * is parented in the current view hierarchy.
+ *
+ * <p>The ability of this transition to fade out a particular view, and the
+ * way that that fading operation takes place, is based on
+ * the situation of the view in the view hierarchy. For example, if a view was
+ * simply removed from its parent, then the view will be added into a {@link
+ * android.view.ViewGroupOverlay} while fading. If a visible view is
+ * changed to be {@link View#GONE} or {@link View#INVISIBLE}, then the
+ * visibility will be changed to {@link View#VISIBLE} for the duration of
+ * the animation. However, if a view is in a hierarchy which is also altering
+ * its visibility, the situation can be more complicated. In general, if a
+ * view that is no longer in the hierarchy in the end scene still has a
+ * parent (so its parent hierarchy was removed, but it was not removed from
+ * its parent), then it will be left alone to avoid side-effects from
+ * improperly removing it from its parent. The only exception to this is if
+ * the previous {@link android.transition.Scene} was
+ * {@link ScenePort#getSceneForLayout(ViewGroup, int, android.content.Context)
+ * created from a layout resource file}, then it is considered safe to un-parent
+ * the starting scene view in order to fade it out.</p>
+ *
+ * <p>A Fade transition can be described in a resource file by using the
+ * tag <code>fade</code>, along with the standard
+ * attributes of {@link android.R.styleable#Fade} and
+ * {@link android.R.styleable#Transition}.</p>
+ */
+class FadePort extends VisibilityPort {
+
+    /**
+     * Fading mode used in {@link #FadePort(int)} to make the transition
+     * operate on targets that are appearing. Maybe be combined with
+     * {@link #OUT} to fade both in and out.
+     */
+    public static final int IN = 0x1;
+
+    /**
+     * Fading mode used in {@link #FadePort(int)} to make the transition
+     * operate on targets that are disappearing. Maybe be combined with
+     * {@link #IN} to fade both in and out.
+     */
+    public static final int OUT = 0x2;
+
+    private static final String LOG_TAG = "Fade";
+
+    private static final String PROPNAME_SCREEN_X = "android:fade:screenX";
+
+    private static final String PROPNAME_SCREEN_Y = "android:fade:screenY";
+
+    private static boolean DBG = TransitionPort.DBG && false;
+
+    private int mFadingMode;
+
+    /**
+     * Constructs a Fade transition that will fade targets in and out.
+     */
+    public FadePort() {
+        this(IN | OUT);
+    }
+
+    /**
+     * Constructs a Fade transition that will fade targets in
+     * and/or out, according to the value of fadingMode.
+     *
+     * @param fadingMode The behavior of this transition, a combination of
+     *                   {@link #IN} and {@link #OUT}.
+     */
+    public FadePort(int fadingMode) {
+        mFadingMode = fadingMode;
+    }
+
+    /**
+     * Utility method to handle creating and running the Animator.
+     */
+    private Animator createAnimation(View view, float startAlpha, float endAlpha,
+            AnimatorListenerAdapter listener) {
+        if (startAlpha == endAlpha) {
+            // run listener if we're noop'ing the animation, to get the end-state results now
+            if (listener != null) {
+                listener.onAnimationEnd(null);
+            }
+            return null;
+        }
+        final ObjectAnimator anim = ObjectAnimator.ofFloat(view, "alpha", startAlpha,
+                endAlpha);
+        if (DBG) {
+            Log.d(LOG_TAG, "Created animator " + anim);
+        }
+        if (listener != null) {
+            anim.addListener(listener);
+//            anim.addPauseListener(listener);
+        }
+        anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+            @Override
+            public void onAnimationUpdate(ValueAnimator animation) {
+                System.out.println("animation value now " + animation.getAnimatedValue());
+            }
+        });
+        return anim;
+    }
+
+    private void captureValues(TransitionValues transitionValues) {
+        int[] loc = new int[2];
+        transitionValues.view.getLocationOnScreen(loc);
+        transitionValues.values.put(PROPNAME_SCREEN_X, loc[0]);
+        transitionValues.values.put(PROPNAME_SCREEN_Y, loc[1]);
+    }
+
+    @Override
+    public void captureStartValues(TransitionValues transitionValues) {
+        super.captureStartValues(transitionValues);
+        captureValues(transitionValues);
+    }
+
+    @Override
+    public Animator onAppear(ViewGroup sceneRoot,
+            TransitionValues startValues, int startVisibility,
+            TransitionValues endValues, int endVisibility) {
+        if ((mFadingMode & IN) != IN || endValues == null) {
+            return null;
+        }
+        final View endView = endValues.view;
+        if (DBG) {
+            View startView = (startValues != null) ? startValues.view : null;
+            Log.d(LOG_TAG, "Fade.onAppear: startView, startVis, endView, endVis = " +
+                    startView + ", " + startVisibility + ", " + endView + ", " + endVisibility);
+        }
+        endView.setAlpha(0);
+        TransitionListener transitionListener = new TransitionListenerAdapter() {
+            boolean mCanceled = false;
+
+            float mPausedAlpha;
+
+            @Override
+            public void onTransitionCancel(TransitionPort transition) {
+                endView.setAlpha(1);
+                mCanceled = true;
+            }
+
+            @Override
+            public void onTransitionEnd(TransitionPort transition) {
+                if (!mCanceled) {
+                    endView.setAlpha(1);
+                }
+            }
+
+            @Override
+            public void onTransitionPause(TransitionPort transition) {
+                mPausedAlpha = endView.getAlpha();
+                endView.setAlpha(1);
+            }
+
+            @Override
+            public void onTransitionResume(TransitionPort transition) {
+                endView.setAlpha(mPausedAlpha);
+            }
+        };
+        addListener(transitionListener);
+        return createAnimation(endView, 0, 1, null);
+    }
+
+    @Override
+    public Animator onDisappear(ViewGroup sceneRoot,
+            TransitionValues startValues, int startVisibility,
+            TransitionValues endValues, int endVisibility) {
+        if ((mFadingMode & OUT) != OUT) {
+            return null;
+        }
+        View view = null;
+        View startView = (startValues != null) ? startValues.view : null;
+        View endView = (endValues != null) ? endValues.view : null;
+        if (DBG) {
+            Log.d(LOG_TAG, "Fade.onDisappear: startView, startVis, endView, endVis = " +
+                    startView + ", " + startVisibility + ", " + endView + ", " + endVisibility);
+        }
+        View overlayView = null;
+        View viewToKeep = null;
+        if (endView == null || endView.getParent() == null) {
+            if (endView != null) {
+                // endView was removed from its parent - add it to the overlay
+                view = overlayView = endView;
+            } else if (startView != null) {
+                // endView does not exist. Use startView only under certain
+                // conditions, because placing a view in an overlay necessitates
+                // it being removed from its current parent
+                if (startView.getParent() == null) {
+                    // no parent - safe to use
+                    view = overlayView = startView;
+                } else if (startView.getParent() instanceof View &&
+                        startView.getParent().getParent() == null) {
+                    View startParent = (View) startView.getParent();
+                    int id = startParent.getId();
+                    if (id != View.NO_ID && sceneRoot.findViewById(id) != null && mCanRemoveViews) {
+                        // no parent, but its parent is unparented  but the parent
+                        // hierarchy has been replaced by a new hierarchy with the same id
+                        // and it is safe to un-parent startView
+                        view = overlayView = startView;
+                    }
+                }
+            }
+        } else {
+            // visibility change
+            if (endVisibility == View.INVISIBLE) {
+                view = endView;
+                viewToKeep = view;
+            } else {
+                // Becoming GONE
+                if (startView == endView) {
+                    view = endView;
+                    viewToKeep = view;
+                } else {
+                    view = startView;
+                    overlayView = view;
+                }
+            }
+        }
+        final int finalVisibility = endVisibility;
+        // TODO: add automatic facility to Visibility superclass for keeping views around
+        if (overlayView != null) {
+            // TODO: Need to do this for general case of adding to overlay
+            int screenX = (Integer) startValues.values.get(PROPNAME_SCREEN_X);
+            int screenY = (Integer) startValues.values.get(PROPNAME_SCREEN_Y);
+            int[] loc = new int[2];
+            sceneRoot.getLocationOnScreen(loc);
+            overlayView.offsetLeftAndRight((screenX - loc[0]) - overlayView.getLeft());
+            overlayView.offsetTopAndBottom((screenY - loc[1]) - overlayView.getTop());
+            ViewGroupOverlay.createFrom(sceneRoot).add(overlayView);
+//            sceneRoot.getOverlay().add(overlayView);
+            // TODO: add automatic facility to Visibility superclass for keeping views around
+            final float startAlpha = 1;
+            float endAlpha = 0;
+            final View finalView = view;
+            final View finalOverlayView = overlayView;
+            final View finalViewToKeep = viewToKeep;
+            final ViewGroup finalSceneRoot = sceneRoot;
+            final AnimatorListenerAdapter endListener = new AnimatorListenerAdapter() {
+                @Override
+                public void onAnimationEnd(Animator animation) {
+                    finalView.setAlpha(startAlpha);
+                    // TODO: restore view offset from overlay repositioning
+                    if (finalViewToKeep != null) {
+                        finalViewToKeep.setVisibility(finalVisibility);
+                    }
+                    if (finalOverlayView != null) {
+                        ViewGroupOverlay.createFrom(finalSceneRoot).remove(finalOverlayView);
+//                        finalSceneRoot.getOverlay().remove(finalOverlayView);
+                    }
+                }
+//
+//                @Override
+//                public void onAnimationPause(Animator animation) {
+//                    if (finalOverlayView != null) {
+//                        finalSceneRoot.getOverlay().remove(finalOverlayView);
+//                    }
+//                }
+//
+//                @Override
+//                public void onAnimationResume(Animator animation) {
+//                    if (finalOverlayView != null) {
+//                        finalSceneRoot.getOverlay().add(finalOverlayView);
+//                    }
+//                }
+            };
+            return createAnimation(view, startAlpha, endAlpha, endListener);
+        }
+        if (viewToKeep != null) {
+            // TODO: find a different way to do this, like just changing the view to be
+            // VISIBLE for the duration of the transition
+            viewToKeep.setVisibility((View.VISIBLE));
+            // TODO: add automatic facility to Visibility superclass for keeping views around
+            final float startAlpha = 1;
+            float endAlpha = 0;
+            final View finalView = view;
+            final View finalOverlayView = overlayView;
+            final View finalViewToKeep = viewToKeep;
+            final ViewGroup finalSceneRoot = sceneRoot;
+            final AnimatorListenerAdapter endListener = new AnimatorListenerAdapter() {
+                boolean mCanceled = false;
+
+                float mPausedAlpha = -1;
+
+//                @Override
+//                public void onAnimationPause(Animator animation) {
+//                    if (finalViewToKeep != null && !mCanceled) {
+//                        finalViewToKeep.setVisibility(finalVisibility);
+//                    }
+//                    mPausedAlpha = finalView.getAlpha();
+//                    finalView.setAlpha(startAlpha);
+//                }
+//
+//                @Override
+//                public void onAnimationResume(Animator animation) {
+//                    if (finalViewToKeep != null && !mCanceled) {
+//                        finalViewToKeep.setVisibility(View.VISIBLE);
+//                    }
+//                    finalView.setAlpha(mPausedAlpha);
+//                }
+
+                @Override
+                public void onAnimationCancel(Animator animation) {
+                    mCanceled = true;
+                    if (mPausedAlpha >= 0) {
+                        finalView.setAlpha(mPausedAlpha);
+                    }
+                }
+
+                @Override
+                public void onAnimationEnd(Animator animation) {
+                    if (!mCanceled) {
+                        finalView.setAlpha(startAlpha);
+                    }
+                    // TODO: restore view offset from overlay repositioning
+                    if (finalViewToKeep != null && !mCanceled) {
+                        finalViewToKeep.setVisibility(finalVisibility);
+                    }
+                    if (finalOverlayView != null) {
+                        ViewGroupOverlay.createFrom(finalSceneRoot).add(finalOverlayView);
+//                        finalSceneRoot.getOverlay().remove(finalOverlayView);
+                    }
+                }
+            };
+            return createAnimation(view, startAlpha, endAlpha, endListener);
+        }
+        return null;
+    }
+
+}
\ No newline at end of file
diff --git a/transition/ics/android/support/transition/RectEvaluator.java b/transition/ics/android/support/transition/RectEvaluator.java
new file mode 100644
index 0000000..e0892e5
--- /dev/null
+++ b/transition/ics/android/support/transition/RectEvaluator.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2016 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 android.support.transition;
+
+import android.animation.TypeEvaluator;
+import android.graphics.Rect;
+
+/**
+ * This evaluator can be used to perform type interpolation between <code>Rect</code> values.
+ */
+class RectEvaluator implements TypeEvaluator<Rect> {
+
+    /**
+     * When null, a new Rect is returned on every evaluate call. When non-null,
+     * mRect will be modified and returned on every evaluate.
+     */
+    private Rect mRect;
+
+    /**
+     * Construct a RectEvaluator that returns a new Rect on every evaluate call.
+     * To avoid creating an object for each evaluate call,
+     * {@link RectEvaluator#RectEvaluator(android.graphics.Rect)} should be used
+     * whenever possible.
+     */
+    public RectEvaluator() {
+    }
+
+    /**
+     * Constructs a RectEvaluator that modifies and returns <code>reuseRect</code>
+     * in {@link #evaluate(float, android.graphics.Rect, android.graphics.Rect)} calls.
+     * The value returned from
+     * {@link #evaluate(float, android.graphics.Rect, android.graphics.Rect)} should
+     * not be cached because it will change over time as the object is reused on each
+     * call.
+     *
+     * @param reuseRect A Rect to be modified and returned by evaluate.
+     */
+    public RectEvaluator(Rect reuseRect) {
+        mRect = reuseRect;
+    }
+
+    /**
+     * This function returns the result of linearly interpolating the start and
+     * end Rect values, with <code>fraction</code> representing the proportion
+     * between the start and end values. The calculation is a simple parametric
+     * calculation on each of the separate components in the Rect objects
+     * (left, top, right, and bottom).
+     *
+     * <p>If {@link #RectEvaluator(android.graphics.Rect)} was used to construct
+     * this RectEvaluator, the object returned will be the <code>reuseRect</code>
+     * passed into the constructor.</p>
+     *
+     * @param fraction   The fraction from the starting to the ending values
+     * @param startValue The start Rect
+     * @param endValue   The end Rect
+     * @return A linear interpolation between the start and end values, given the
+     * <code>fraction</code> parameter.
+     */
+    @Override
+    public Rect evaluate(float fraction, Rect startValue, Rect endValue) {
+        int left = startValue.left + (int) ((endValue.left - startValue.left) * fraction);
+        int top = startValue.top + (int) ((endValue.top - startValue.top) * fraction);
+        int right = startValue.right + (int) ((endValue.right - startValue.right) * fraction);
+        int bottom = startValue.bottom + (int) ((endValue.bottom - startValue.bottom) * fraction);
+        if (mRect == null) {
+            return new Rect(left, top, right, bottom);
+        } else {
+            mRect.set(left, top, right, bottom);
+            return mRect;
+        }
+    }
+}
diff --git a/transition/ics/android/support/transition/SceneIcs.java b/transition/ics/android/support/transition/SceneIcs.java
new file mode 100644
index 0000000..0d0d84e
--- /dev/null
+++ b/transition/ics/android/support/transition/SceneIcs.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2016 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 android.support.transition;
+
+import android.view.View;
+import android.view.ViewGroup;
+
+class SceneIcs extends SceneImpl {
+
+    /* package */ ScenePort mScene;
+
+    @Override
+    public void init(ViewGroup sceneRoot) {
+        mScene = new ScenePort(sceneRoot);
+    }
+
+    @Override
+    public void init(ViewGroup sceneRoot, View layout) {
+        mScene = new ScenePort(sceneRoot, layout);
+    }
+
+    @Override
+    public void enter() {
+        mScene.enter();
+    }
+
+    @Override
+    public void exit() {
+        mScene.exit();
+    }
+
+
+    @Override
+    public ViewGroup getSceneRoot() {
+        return mScene.getSceneRoot();
+    }
+
+    @Override
+    public void setEnterAction(Runnable action) {
+        mScene.setEnterAction(action);
+    }
+
+    @Override
+    public void setExitAction(Runnable action) {
+        mScene.setExitAction(action);
+    }
+
+}
diff --git a/transition/ics/android/support/transition/ScenePort.java b/transition/ics/android/support/transition/ScenePort.java
new file mode 100644
index 0000000..6fc5c25
--- /dev/null
+++ b/transition/ics/android/support/transition/ScenePort.java
@@ -0,0 +1,242 @@
+/*
+ * Copyright (C) 2016 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 android.support.transition;
+
+import android.content.Context;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+/**
+ * A scene represents the collection of values that various properties in the
+ * View hierarchy will have when the scene is applied. A Scene can be
+ * configured to automatically run a Transition when it is applied, which will
+ * animate the various property changes that take place during the
+ * scene change.
+ */
+final class ScenePort {
+
+    Runnable mEnterAction, mExitAction;
+
+    private Context mContext;
+
+    private int mLayoutId = -1;
+
+    private ViewGroup mSceneRoot;
+
+    private View mLayout; // alternative to layoutId
+
+    /**
+     * Constructs a Scene with no information about how values will change
+     * when this scene is applied. This constructor might be used when
+     * a Scene is created with the intention of being dynamically configured,
+     * through setting {@link #setEnterAction(Runnable)} and possibly
+     * {@link #setExitAction(Runnable)}.
+     *
+     * @param sceneRoot The root of the hierarchy in which scene changes
+     *                  and transitions will take place.
+     */
+    public ScenePort(ViewGroup sceneRoot) {
+        mSceneRoot = sceneRoot;
+    }
+
+    /**
+     * Constructs a Scene which, when entered, will remove any
+     * children from the sceneRoot container and will inflate and add
+     * the hierarchy specified by the layoutId resource file.
+     *
+     * <p>This method is hidden because layoutId-based scenes should be
+     * created by the caching factory method {@link ScenePort#getCurrentScene(View)}.</p>
+     *
+     * @param sceneRoot The root of the hierarchy in which scene changes
+     *                  and transitions will take place.
+     * @param layoutId  The id of a resource file that defines the view
+     *                  hierarchy of this scene.
+     * @param context   The context used in the process of inflating
+     *                  the layout resource.
+     */
+    private ScenePort(ViewGroup sceneRoot, int layoutId, Context context) {
+        mContext = context;
+        mSceneRoot = sceneRoot;
+        mLayoutId = layoutId;
+    }
+
+    /**
+     * Constructs a Scene which, when entered, will remove any
+     * children from the sceneRoot container and add the layout
+     * object as a new child of that container.
+     *
+     * @param sceneRoot The root of the hierarchy in which scene changes
+     *                  and transitions will take place.
+     * @param layout    The view hierarchy of this scene, added as a child
+     *                  of sceneRoot when this scene is entered.
+     */
+    public ScenePort(ViewGroup sceneRoot, View layout) {
+        mSceneRoot = sceneRoot;
+        mLayout = layout;
+    }
+
+    /**
+     * Returns a Scene described by the resource file associated with the given
+     * <code>layoutId</code> parameter.
+     *
+     * @param sceneRoot The root of the hierarchy in which scene changes
+     *                  and transitions will take place.
+     * @param layoutId  The id of a standard layout resource file.
+     * @param context   The context used in the process of inflating
+     *                  the layout resource.
+     * @return The scene for the given root and layout id
+     */
+    public static ScenePort getSceneForLayout(ViewGroup sceneRoot, int layoutId, Context context) {
+        // We don't cache ScenePort, but android.support.transition.Scene.
+        return new ScenePort(sceneRoot, layoutId, context);
+    }
+
+    /**
+     * Set the scene that the given view is in. The current scene is set only
+     * on the root view of a scene, not for every view in that hierarchy. This
+     * information is used by Scene to determine whether there is a previous
+     * scene which should be exited before the new scene is entered.
+     *
+     * @param view The view on which the current scene is being set
+     */
+    static void setCurrentScene(View view, ScenePort scene) {
+        view.setTag(R.id.transition_current_scene, scene);
+    }
+
+    /**
+     * Gets the current {@link ScenePort} set on the given view. A scene is set on a view
+     * only if that view is the scene root.
+     *
+     * @return The current Scene set on this view. A value of null indicates that
+     * no Scene is currently set.
+     */
+    static ScenePort getCurrentScene(View view) {
+        return (ScenePort) view.getTag(R.id.transition_current_scene);
+    }
+
+    /**
+     * Gets the root of the scene, which is the root of the view hierarchy
+     * affected by changes due to this scene, and which will be animated
+     * when this scene is entered.
+     *
+     * @return The root of the view hierarchy affected by this scene.
+     */
+    public ViewGroup getSceneRoot() {
+        return mSceneRoot;
+    }
+
+    /**
+     * Exits this scene, if it is the current scene
+     * on the scene's {@link #getSceneRoot() scene root}. The current scene is
+     * set when {@link #enter() entering} a scene.
+     * Exiting a scene runs the {@link #setExitAction(Runnable) exit action}
+     * if there is one.
+     */
+    public void exit() {
+        if (getCurrentScene(mSceneRoot) == this) {
+            if (mExitAction != null) {
+                mExitAction.run();
+            }
+        }
+    }
+
+    /**
+     * Enters this scene, which entails changing all values that
+     * are specified by this scene. These may be values associated
+     * with a layout view group or layout resource file which will
+     * now be added to the scene root, or it may be values changed by
+     * an {@link #setEnterAction(Runnable)} enter action}, or a
+     * combination of the these. No transition will be run when the
+     * scene is entered. To get transition behavior in scene changes,
+     * use one of the methods in {@link TransitionManagerPort} instead.
+     */
+    public void enter() {
+
+        // Apply layout change, if any
+        if (mLayoutId > 0 || mLayout != null) {
+            // empty out parent container before adding to it
+            getSceneRoot().removeAllViews();
+
+            if (mLayoutId > 0) {
+                LayoutInflater.from(mContext).inflate(mLayoutId, mSceneRoot);
+            } else {
+                mSceneRoot.addView(mLayout);
+            }
+        }
+
+        // Notify next scene that it is entering. Subclasses may override to configure scene.
+        if (mEnterAction != null) {
+            mEnterAction.run();
+        }
+
+        setCurrentScene(mSceneRoot, this);
+    }
+
+    /**
+     * Scenes that are not defined with layout resources or
+     * hierarchies, or which need to perform additional steps
+     * after those hierarchies are changed to, should set an enter
+     * action, and possibly an exit action as well. An enter action
+     * will cause Scene to call back into application code to do
+     * anything else the application needs after transitions have
+     * captured pre-change values and after any other scene changes
+     * have been applied, such as the layout (if any) being added to
+     * the view hierarchy. After this method is called, Transitions will
+     * be played.
+     *
+     * @param action The runnable whose {@link Runnable#run() run()} method will
+     *               be called when this scene is entered
+     * @see #setExitAction(Runnable)
+     * @see ScenePort#ScenePort(ViewGroup, int, Context)
+     * @see ScenePort#ScenePort(ViewGroup, ViewGroup)
+     */
+    public void setEnterAction(Runnable action) {
+        mEnterAction = action;
+    }
+
+    /**
+     * Scenes that are not defined with layout resources or
+     * hierarchies, or which need to perform additional steps
+     * after those hierarchies are changed to, should set an enter
+     * action, and possibly an exit action as well. An exit action
+     * will cause Scene to call back into application code to do
+     * anything the application needs to do after applicable transitions have
+     * captured pre-change values, but before any other scene changes
+     * have been applied, such as the new layout (if any) being added to
+     * the view hierarchy. After this method is called, the next scene
+     * will be entered, including a call to {@link #setEnterAction(Runnable)}
+     * if an enter action is set.
+     *
+     * @see #setEnterAction(Runnable)
+     * @see ScenePort#ScenePort(ViewGroup, int, Context)
+     * @see ScenePort#ScenePort(ViewGroup, ViewGroup)
+     */
+    public void setExitAction(Runnable action) {
+        mExitAction = action;
+    }
+
+
+    /**
+     * Returns whether this Scene was created by a layout resource file, determined
+     * by the layoutId passed into
+     * {@link #getSceneForLayout(ViewGroup, int, Context)}.
+     */
+    boolean isCreatedFromLayoutResource() {
+        return (mLayoutId > 0);
+    }
+}
\ No newline at end of file
diff --git a/transition/ics/android/support/transition/SceneStaticsIcs.java b/transition/ics/android/support/transition/SceneStaticsIcs.java
new file mode 100644
index 0000000..87f39e2
--- /dev/null
+++ b/transition/ics/android/support/transition/SceneStaticsIcs.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2016 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 android.support.transition;
+
+import android.content.Context;
+import android.view.ViewGroup;
+
+class SceneStaticsIcs extends SceneStaticsImpl {
+
+    @Override
+    public SceneImpl getSceneForLayout(ViewGroup sceneRoot, int layoutId, Context context) {
+        SceneIcs scene = new SceneIcs();
+        scene.mScene = ScenePort.getSceneForLayout(sceneRoot, layoutId, context);
+        return scene;
+    }
+
+}
diff --git a/transition/ics/android/support/transition/TransitionIcs.java b/transition/ics/android/support/transition/TransitionIcs.java
new file mode 100644
index 0000000..f5215df
--- /dev/null
+++ b/transition/ics/android/support/transition/TransitionIcs.java
@@ -0,0 +1,283 @@
+/*
+ * Copyright (C) 2016 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 android.support.transition;
+
+import android.animation.Animator;
+import android.animation.TimeInterpolator;
+import android.view.View;
+import android.view.ViewGroup;
+
+import java.util.ArrayList;
+import java.util.List;
+
+class TransitionIcs extends TransitionImpl {
+
+    /* package */ TransitionPort mTransition;
+    private TransitionInterface mExternalTransition;
+    private CompatListener mCompatListener;
+
+    @Override
+    public void init(TransitionInterface external, Object internal) {
+        mExternalTransition = external;
+        if (internal == null) {
+            mTransition = new TransitionWrapper(external);
+        } else {
+            mTransition = (TransitionPort) internal;
+        }
+    }
+
+    @Override
+    public TransitionImpl addListener(final TransitionInterfaceListener listener) {
+        if (mCompatListener == null) {
+            mCompatListener = new CompatListener();
+            mTransition.addListener(mCompatListener);
+        }
+        mCompatListener.addListener(listener);
+        return this;
+    }
+
+    @Override
+    public TransitionImpl removeListener(TransitionInterfaceListener listener) {
+        if (mCompatListener == null) {
+            return this;
+        }
+        mCompatListener.removeListener(listener);
+        if (mCompatListener.isEmpty()) {
+            mTransition.removeListener(mCompatListener);
+            mCompatListener = null;
+        }
+        return this;
+    }
+
+    @Override
+    public TransitionImpl addTarget(View target) {
+        mTransition.addTarget(target);
+        return this;
+    }
+
+    @Override
+    public TransitionImpl addTarget(int targetId) {
+        mTransition.addTarget(targetId);
+        return this;
+    }
+
+    @Override
+    public void captureEndValues(TransitionValues transitionValues) {
+        mTransition.captureEndValues(transitionValues);
+    }
+
+    @Override
+    public void captureStartValues(TransitionValues transitionValues) {
+        mTransition.captureStartValues(transitionValues);
+    }
+
+    @Override
+    public Animator createAnimator(ViewGroup sceneRoot, TransitionValues startValues,
+            TransitionValues endValues) {
+        return mTransition.createAnimator(sceneRoot, startValues, endValues);
+    }
+
+    @Override
+    public TransitionImpl excludeChildren(View target, boolean exclude) {
+        mTransition.excludeChildren(target, exclude);
+        return this;
+    }
+
+    @Override
+    public TransitionImpl excludeChildren(int targetId, boolean exclude) {
+        mTransition.excludeChildren(targetId, exclude);
+        return this;
+    }
+
+    @Override
+    public TransitionImpl excludeChildren(Class type, boolean exclude) {
+        mTransition.excludeChildren(type, exclude);
+        return this;
+    }
+
+    @Override
+    public TransitionImpl excludeTarget(View target, boolean exclude) {
+        mTransition.excludeTarget(target, exclude);
+        return this;
+    }
+
+    @Override
+    public TransitionImpl excludeTarget(int targetId, boolean exclude) {
+        mTransition.excludeTarget(targetId, exclude);
+        return this;
+    }
+
+    @Override
+    public TransitionImpl excludeTarget(Class type, boolean exclude) {
+        mTransition.excludeTarget(type, exclude);
+        return this;
+    }
+
+    @Override
+    public long getDuration() {
+        return mTransition.getDuration();
+    }
+
+    @Override
+    public TransitionImpl setDuration(long duration) {
+        mTransition.setDuration(duration);
+        return this;
+    }
+
+    @Override
+    public TimeInterpolator getInterpolator() {
+        return mTransition.getInterpolator();
+    }
+
+    @Override
+    public TransitionImpl setInterpolator(TimeInterpolator interpolator) {
+        mTransition.setInterpolator(interpolator);
+        return this;
+    }
+
+    @Override
+    public String getName() {
+        return mTransition.getName();
+    }
+
+    @Override
+    public long getStartDelay() {
+        return mTransition.getStartDelay();
+    }
+
+    @Override
+    public TransitionImpl setStartDelay(long startDelay) {
+        mTransition.setStartDelay(startDelay);
+        return this;
+    }
+
+    @Override
+    public List<Integer> getTargetIds() {
+        return mTransition.getTargetIds();
+    }
+
+    @Override
+    public List<View> getTargets() {
+        return mTransition.getTargets();
+    }
+
+    @Override
+    public String[] getTransitionProperties() {
+        return mTransition.getTransitionProperties();
+    }
+
+    @Override
+    public TransitionValues getTransitionValues(View view, boolean start) {
+        return mTransition.getTransitionValues(view, start);
+    }
+
+    @Override
+    public TransitionImpl removeTarget(View target) {
+        mTransition.removeTarget(target);
+        return this;
+    }
+
+    @Override
+    public TransitionImpl removeTarget(int targetId) {
+        mTransition.removeTarget(targetId);
+        return this;
+    }
+
+    @Override
+    public String toString() {
+        return mTransition.toString();
+    }
+
+    private static class TransitionWrapper extends TransitionPort {
+
+        private TransitionInterface mTransition;
+
+        public TransitionWrapper(TransitionInterface transition) {
+            mTransition = transition;
+        }
+
+        @Override
+        public void captureStartValues(TransitionValues transitionValues) {
+            mTransition.captureStartValues(transitionValues);
+        }
+
+        @Override
+        public void captureEndValues(TransitionValues transitionValues) {
+            mTransition.captureEndValues(transitionValues);
+        }
+
+        @Override
+        public Animator createAnimator(ViewGroup sceneRoot,
+                TransitionValues startValues, TransitionValues endValues) {
+            return mTransition.createAnimator(sceneRoot, startValues, endValues);
+        }
+    }
+
+    @SuppressWarnings("unchecked")
+    private class CompatListener implements TransitionPort.TransitionListener {
+
+        private final ArrayList<TransitionInterfaceListener> mListeners = new ArrayList<>();
+
+        public void addListener(TransitionInterfaceListener listener) {
+            mListeners.add(listener);
+        }
+
+        public void removeListener(TransitionInterfaceListener listener) {
+            mListeners.remove(listener);
+        }
+
+        public boolean isEmpty() {
+            return mListeners.isEmpty();
+        }
+
+        @Override
+        public void onTransitionStart(TransitionPort transition) {
+            for (TransitionInterfaceListener listener : mListeners) {
+                listener.onTransitionStart(mExternalTransition);
+            }
+        }
+
+        @Override
+        public void onTransitionEnd(TransitionPort transition) {
+            for (TransitionInterfaceListener listener : mListeners) {
+                listener.onTransitionEnd(mExternalTransition);
+            }
+        }
+
+        @Override
+        public void onTransitionCancel(TransitionPort transition) {
+            for (TransitionInterfaceListener listener : mListeners) {
+                listener.onTransitionCancel(mExternalTransition);
+            }
+        }
+
+        @Override
+        public void onTransitionPause(TransitionPort transition) {
+            for (TransitionInterfaceListener listener : mListeners) {
+                listener.onTransitionPause(mExternalTransition);
+            }
+        }
+
+        @Override
+        public void onTransitionResume(TransitionPort transition) {
+            for (TransitionInterfaceListener listener : mListeners) {
+                listener.onTransitionResume(mExternalTransition);
+            }
+        }
+    }
+
+}
diff --git a/transition/ics/android/support/transition/TransitionManagerIcs.java b/transition/ics/android/support/transition/TransitionManagerIcs.java
new file mode 100644
index 0000000..19b0175
--- /dev/null
+++ b/transition/ics/android/support/transition/TransitionManagerIcs.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2016 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 android.support.transition;
+
+class TransitionManagerIcs extends TransitionManagerImpl {
+
+    private final TransitionManagerPort mTransitionManager = new TransitionManagerPort();
+
+    @Override
+    public void setTransition(SceneImpl scene, TransitionImpl transition) {
+        mTransitionManager.setTransition(((SceneIcs) scene).mScene,
+                transition == null ? null : ((TransitionIcs) transition).mTransition);
+    }
+
+    @Override
+    public void setTransition(SceneImpl fromScene, SceneImpl toScene, TransitionImpl transition) {
+        mTransitionManager.setTransition(((SceneIcs) fromScene).mScene, ((SceneIcs) toScene).mScene,
+                transition == null ? null : ((TransitionIcs) transition).mTransition);
+    }
+
+    @Override
+    public void transitionTo(SceneImpl scene) {
+        mTransitionManager.transitionTo(((SceneIcs) scene).mScene);
+    }
+
+}
diff --git a/transition/ics/android/support/transition/TransitionManagerPort.java b/transition/ics/android/support/transition/TransitionManagerPort.java
new file mode 100644
index 0000000..7857f57
--- /dev/null
+++ b/transition/ics/android/support/transition/TransitionManagerPort.java
@@ -0,0 +1,441 @@
+/*
+ * Copyright (C) 2016 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 android.support.transition;
+
+import android.support.v4.util.ArrayMap;
+import android.support.v4.view.ViewCompat;
+import android.util.Log;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.ViewTreeObserver;
+
+import java.lang.ref.WeakReference;
+import java.util.ArrayList;
+
+class TransitionManagerPort {
+    // TODO: how to handle enter/exit?
+
+    private static final String[] EMPTY_STRINGS = new String[0];
+
+    private static String LOG_TAG = "TransitionManager";
+
+    private static TransitionPort sDefaultTransition = new AutoTransitionPort();
+
+    private static ThreadLocal<WeakReference<ArrayMap<ViewGroup, ArrayList<TransitionPort>>>>
+            sRunningTransitions = new ThreadLocal<>();
+
+    private static ArrayList<ViewGroup> sPendingTransitions = new ArrayList<>();
+
+    ArrayMap<ScenePort, TransitionPort> mSceneTransitions = new ArrayMap<>();
+
+    ArrayMap<ScenePort, ArrayMap<ScenePort, TransitionPort>> mScenePairTransitions =
+            new ArrayMap<>();
+
+    ArrayMap<ScenePort, ArrayMap<String, TransitionPort>> mSceneNameTransitions = new ArrayMap<>();
+
+    ArrayMap<String, ArrayMap<ScenePort, TransitionPort>> mNameSceneTransitions = new ArrayMap<>();
+
+    /**
+     * Gets the current default transition. The initial value is an {@link
+     * AutoTransition} instance.
+     *
+     * @return The current default transition.
+     * @hide pending later changes
+     * @see #setDefaultTransition(TransitionPort)
+     */
+    public static TransitionPort getDefaultTransition() {
+        return sDefaultTransition;
+    }
+
+    /**
+     * Sets the transition to be used for any scene change for which no
+     * other transition is explicitly set. The initial value is
+     * an {@link AutoTransition} instance.
+     *
+     * @param transition The default transition to be used for scene changes.
+     * @hide pending later changes
+     */
+    public void setDefaultTransition(TransitionPort transition) {
+        sDefaultTransition = transition;
+    }
+
+    /**
+     * This is where all of the work of a transition/scene-change is
+     * orchestrated. This method captures the start values for the given
+     * transition, exits the current Scene, enters the new scene, captures
+     * the end values for the transition, and finally plays the
+     * resulting values-populated transition.
+     *
+     * @param scene      The scene being entered
+     * @param transition The transition to play for this scene change
+     */
+    private static void changeScene(ScenePort scene, TransitionPort transition) {
+
+        final ViewGroup sceneRoot = scene.getSceneRoot();
+
+        TransitionPort transitionClone = null;
+        if (transition != null) {
+            transitionClone = transition.clone();
+            transitionClone.setSceneRoot(sceneRoot);
+        }
+
+        ScenePort oldScene = ScenePort.getCurrentScene(sceneRoot);
+        if (oldScene != null && oldScene.isCreatedFromLayoutResource()) {
+            transitionClone.setCanRemoveViews(true);
+        }
+
+        sceneChangeSetup(sceneRoot, transitionClone);
+
+        scene.enter();
+
+        sceneChangeRunTransition(sceneRoot, transitionClone);
+    }
+
+    private static ArrayMap<ViewGroup, ArrayList<TransitionPort>> getRunningTransitions() {
+        WeakReference<ArrayMap<ViewGroup, ArrayList<TransitionPort>>> runningTransitions =
+                sRunningTransitions.get();
+        if (runningTransitions == null || runningTransitions.get() == null) {
+            ArrayMap<ViewGroup, ArrayList<TransitionPort>> transitions = new ArrayMap<>();
+            runningTransitions = new WeakReference<>(transitions);
+            sRunningTransitions.set(runningTransitions);
+        }
+        return runningTransitions.get();
+    }
+
+    private static void sceneChangeRunTransition(final ViewGroup sceneRoot,
+            final TransitionPort transition) {
+        if (transition != null && sceneRoot != null) {
+            MultiListener listener = new MultiListener(transition, sceneRoot);
+            sceneRoot.addOnAttachStateChangeListener(listener);
+            sceneRoot.getViewTreeObserver().addOnPreDrawListener(listener);
+        }
+    }
+
+    private static void sceneChangeSetup(ViewGroup sceneRoot, TransitionPort transition) {
+
+        // Capture current values
+        ArrayList<TransitionPort> runningTransitions = getRunningTransitions().get(sceneRoot);
+
+        if (runningTransitions != null && runningTransitions.size() > 0) {
+            for (TransitionPort runningTransition : runningTransitions) {
+                runningTransition.pause();
+            }
+        }
+
+        if (transition != null) {
+            transition.captureValues(sceneRoot, true);
+        }
+
+        // Notify previous scene that it is being exited
+        ScenePort previousScene = ScenePort.getCurrentScene(sceneRoot);
+        if (previousScene != null) {
+            previousScene.exit();
+        }
+    }
+
+    public static void go(ScenePort scene) {
+        changeScene(scene, sDefaultTransition);
+    }
+
+    public static void go(ScenePort scene, TransitionPort transition) {
+        changeScene(scene, transition);
+    }
+
+    public static void beginDelayedTransition(final ViewGroup sceneRoot) {
+        beginDelayedTransition(sceneRoot, null);
+    }
+
+    public static void beginDelayedTransition(final ViewGroup sceneRoot,
+            TransitionPort transition) {
+        if (!sPendingTransitions.contains(sceneRoot) && ViewCompat.isLaidOut(sceneRoot)) {
+            if (TransitionPort.DBG) {
+                Log.d(LOG_TAG, "beginDelayedTransition: root, transition = " +
+                        sceneRoot + ", " + transition);
+            }
+            sPendingTransitions.add(sceneRoot);
+            if (transition == null) {
+                transition = sDefaultTransition;
+            }
+            final TransitionPort transitionClone = transition.clone();
+            sceneChangeSetup(sceneRoot, transitionClone);
+            ScenePort.setCurrentScene(sceneRoot, null);
+            sceneChangeRunTransition(sceneRoot, transitionClone);
+        }
+    }
+
+    public void setTransition(ScenePort scene, TransitionPort transition) {
+        mSceneTransitions.put(scene, transition);
+    }
+
+    public void setTransition(ScenePort fromScene, ScenePort toScene, TransitionPort transition) {
+        ArrayMap<ScenePort, TransitionPort> sceneTransitionMap = mScenePairTransitions.get(toScene);
+        if (sceneTransitionMap == null) {
+            sceneTransitionMap = new ArrayMap<>();
+            mScenePairTransitions.put(toScene, sceneTransitionMap);
+        }
+        sceneTransitionMap.put(fromScene, transition);
+    }
+
+    /**
+     * Returns the Transition for the given scene being entered. The result
+     * depends not only on the given scene, but also the scene which the
+     * {@link ScenePort#getSceneRoot() sceneRoot} of the Scene is currently in.
+     *
+     * @param scene The scene being entered
+     * @return The Transition to be used for the given scene change. If no
+     * Transition was specified for this scene change, the default transition
+     * will be used instead.
+     */
+    private TransitionPort getTransition(ScenePort scene) {
+        TransitionPort transition;
+        ViewGroup sceneRoot = scene.getSceneRoot();
+        if (sceneRoot != null) {
+            // TODO: cached in Scene instead? long-term, cache in View itself
+            ScenePort currScene = ScenePort.getCurrentScene(sceneRoot);
+            if (currScene != null) {
+                ArrayMap<ScenePort, TransitionPort> sceneTransitionMap = mScenePairTransitions
+                        .get(scene);
+                if (sceneTransitionMap != null) {
+                    transition = sceneTransitionMap.get(currScene);
+                    if (transition != null) {
+                        return transition;
+                    }
+                }
+            }
+        }
+        transition = mSceneTransitions.get(scene);
+        return (transition != null) ? transition : sDefaultTransition;
+    }
+
+    /**
+     * Retrieve the transition from a named scene to a target defined scene if one has been
+     * associated with this TransitionManager.
+     *
+     * <p>A named scene is an indirect link for a transition. Fundamentally a named
+     * scene represents a potentially arbitrary intersection point of two otherwise independent
+     * transitions. Activity A may define a transition from scene X to "com.example.scene.FOO"
+     * while activity B may define a transition from scene "com.example.scene.FOO" to scene Y.
+     * In this way applications may define an API for more sophisticated transitions between
+     * caller and called activities very similar to the way that <code>Intent</code> extras
+     * define APIs for arguments and data propagation between activities.</p>
+     *
+     * @param fromName Named scene that this transition corresponds to
+     * @param toScene  Target scene that this transition will move to
+     * @return Transition corresponding to the given fromName and toScene or null
+     * if no association exists in this TransitionManager
+     * @see #setTransition(String, ScenePort, TransitionPort)
+     */
+    public TransitionPort getNamedTransition(String fromName, ScenePort toScene) {
+        ArrayMap<ScenePort, TransitionPort> m = mNameSceneTransitions.get(fromName);
+        if (m != null) {
+            return m.get(toScene);
+        }
+        return null;
+    }
+
+    ;
+
+    /**
+     * Retrieve the transition from a defined scene to a target named scene if one has been
+     * associated with this TransitionManager.
+     *
+     * <p>A named scene is an indirect link for a transition. Fundamentally a named
+     * scene represents a potentially arbitrary intersection point of two otherwise independent
+     * transitions. Activity A may define a transition from scene X to "com.example.scene.FOO"
+     * while activity B may define a transition from scene "com.example.scene.FOO" to scene Y.
+     * In this way applications may define an API for more sophisticated transitions between
+     * caller and called activities very similar to the way that <code>Intent</code> extras
+     * define APIs for arguments and data propagation between activities.</p>
+     *
+     * @param fromScene Scene that this transition starts from
+     * @param toName    Name of the target scene
+     * @return Transition corresponding to the given fromScene and toName or null
+     * if no association exists in this TransitionManager
+     */
+    public TransitionPort getNamedTransition(ScenePort fromScene, String toName) {
+        ArrayMap<String, TransitionPort> m = mSceneNameTransitions.get(fromScene);
+        if (m != null) {
+            return m.get(toName);
+        }
+        return null;
+    }
+
+    /**
+     * Retrieve the supported target named scenes when transitioning away from the given scene.
+     *
+     * <p>A named scene is an indirect link for a transition. Fundamentally a named
+     * scene represents a potentially arbitrary intersection point of two otherwise independent
+     * transitions. Activity A may define a transition from scene X to "com.example.scene.FOO"
+     * while activity B may define a transition from scene "com.example.scene.FOO" to scene Y.
+     * In this way applications may define an API for more sophisticated transitions between
+     * caller and called activities very similar to the way that <code>Intent</code> extras
+     * define APIs for arguments and data propagation between activities.</p>
+     *
+     * @param fromScene Scene to transition from
+     * @return An array of Strings naming each supported transition starting from
+     * <code>fromScene</code>. If no transitions to a named scene from the given
+     * scene are supported this function will return a String[] of length 0.
+     * @see #setTransition(ScenePort, String, TransitionPort)
+     */
+    public String[] getTargetSceneNames(ScenePort fromScene) {
+        final ArrayMap<String, TransitionPort> m = mSceneNameTransitions.get(fromScene);
+        if (m == null) {
+            return EMPTY_STRINGS;
+        }
+        final int count = m.size();
+        final String[] result = new String[count];
+        for (int i = 0; i < count; i++) {
+            result[i] = m.keyAt(i);
+        }
+        return result;
+    }
+
+    /**
+     * Set a transition from a specific scene to a named scene.
+     *
+     * <p>A named scene is an indirect link for a transition. Fundamentally a named
+     * scene represents a potentially arbitrary intersection point of two otherwise independent
+     * transitions. Activity A may define a transition from scene X to "com.example.scene.FOO"
+     * while activity B may define a transition from scene "com.example.scene.FOO" to scene Y.
+     * In this way applications may define an API for more sophisticated transitions between
+     * caller and called activities very similar to the way that <code>Intent</code> extras
+     * define APIs for arguments and data propagation between activities.</p>
+     *
+     * @param fromScene  Scene to transition from
+     * @param toName     Named scene to transition to
+     * @param transition Transition to use
+     * @see #getTargetSceneNames(ScenePort)
+     */
+    public void setTransition(ScenePort fromScene, String toName, TransitionPort transition) {
+        ArrayMap<String, TransitionPort> m = mSceneNameTransitions.get(fromScene);
+        if (m == null) {
+            m = new ArrayMap<>();
+            mSceneNameTransitions.put(fromScene, m);
+        }
+        m.put(toName, transition);
+    }
+
+    /**
+     * Set a transition from a named scene to a concrete scene.
+     *
+     * <p>A named scene is an indirect link for a transition. Fundamentally a named
+     * scene represents a potentially arbitrary intersection point of two otherwise independent
+     * transitions. Activity A may define a transition from scene X to "com.example.scene.FOO"
+     * while activity B may define a transition from scene "com.example.scene.FOO" to scene Y.
+     * In this way applications may define an API for more sophisticated transitions between
+     * caller and called activities very similar to the way that <code>Intent</code> extras
+     * define APIs for arguments and data propagation between activities.</p>
+     *
+     * @param fromName   Named scene to transition from
+     * @param toScene    Scene to transition to
+     * @param transition Transition to use
+     * @see #getNamedTransition(String, ScenePort)
+     */
+    public void setTransition(String fromName, ScenePort toScene, TransitionPort transition) {
+        ArrayMap<ScenePort, TransitionPort> m = mNameSceneTransitions.get(fromName);
+        if (m == null) {
+            m = new ArrayMap<>();
+            mNameSceneTransitions.put(fromName, m);
+        }
+        m.put(toScene, transition);
+    }
+
+    public void transitionTo(ScenePort scene) {
+        // Auto transition if there is no transition declared for the Scene, but there is
+        // a root or parent view
+        changeScene(scene, getTransition(scene));
+    }
+
+    /**
+     * This private utility class is used to listen for both OnPreDraw and
+     * OnAttachStateChange events. OnPreDraw events are the main ones we care
+     * about since that's what triggers the transition to take place.
+     * OnAttachStateChange events are also important in case the view is removed
+     * from the hierarchy before the OnPreDraw event takes place; it's used to
+     * clean up things since the OnPreDraw listener didn't get called in time.
+     */
+    private static class MultiListener implements ViewTreeObserver.OnPreDrawListener,
+            View.OnAttachStateChangeListener {
+
+        TransitionPort mTransition;
+
+        ViewGroup mSceneRoot;
+
+        MultiListener(TransitionPort transition, ViewGroup sceneRoot) {
+            mTransition = transition;
+            mSceneRoot = sceneRoot;
+        }
+
+        private void removeListeners() {
+            mSceneRoot.getViewTreeObserver().removeOnPreDrawListener(this);
+            mSceneRoot.removeOnAttachStateChangeListener(this);
+        }
+
+        @Override
+        public void onViewAttachedToWindow(View v) {
+        }
+
+        @Override
+        public void onViewDetachedFromWindow(View v) {
+            removeListeners();
+
+            sPendingTransitions.remove(mSceneRoot);
+            ArrayList<TransitionPort> runningTransitions = getRunningTransitions().get(mSceneRoot);
+            if (runningTransitions != null && runningTransitions.size() > 0) {
+                for (TransitionPort runningTransition : runningTransitions) {
+                    runningTransition.resume();
+                }
+            }
+            mTransition.clearValues(true);
+        }
+
+        @Override
+        public boolean onPreDraw() {
+            removeListeners();
+            sPendingTransitions.remove(mSceneRoot);
+            // Add to running list, handle end to remove it
+            final ArrayMap<ViewGroup, ArrayList<TransitionPort>> runningTransitions =
+                    getRunningTransitions();
+            ArrayList<TransitionPort> currentTransitions = runningTransitions.get(mSceneRoot);
+            ArrayList<TransitionPort> previousRunningTransitions = null;
+            if (currentTransitions == null) {
+                currentTransitions = new ArrayList<>();
+                runningTransitions.put(mSceneRoot, currentTransitions);
+            } else if (currentTransitions.size() > 0) {
+                previousRunningTransitions = new ArrayList<>(currentTransitions);
+            }
+            currentTransitions.add(mTransition);
+            mTransition.addListener(new TransitionPort.TransitionListenerAdapter() {
+                @Override
+                public void onTransitionEnd(TransitionPort transition) {
+                    ArrayList<TransitionPort> currentTransitions =
+                            runningTransitions.get(mSceneRoot);
+                    currentTransitions.remove(transition);
+                }
+            });
+            mTransition.captureValues(mSceneRoot, false);
+            if (previousRunningTransitions != null) {
+                for (TransitionPort runningTransition : previousRunningTransitions) {
+                    runningTransition.resume();
+                }
+            }
+            mTransition.playTransition(mSceneRoot);
+
+            return true;
+        }
+    }
+}
diff --git a/transition/ics/android/support/transition/TransitionManagerStaticsIcs.java b/transition/ics/android/support/transition/TransitionManagerStaticsIcs.java
new file mode 100644
index 0000000..656ff47
--- /dev/null
+++ b/transition/ics/android/support/transition/TransitionManagerStaticsIcs.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2016 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 android.support.transition;
+
+import android.view.ViewGroup;
+
+class TransitionManagerStaticsIcs extends TransitionManagerStaticsImpl {
+
+    @Override
+    public void go(SceneImpl scene) {
+        TransitionManagerPort.go(((SceneIcs) scene).mScene);
+    }
+
+    @Override
+    public void go(SceneImpl scene, TransitionImpl transition) {
+        TransitionManagerPort.go(((SceneIcs) scene).mScene,
+                transition == null ? null : ((TransitionIcs) transition).mTransition);
+    }
+
+    @Override
+    public void beginDelayedTransition(ViewGroup sceneRoot) {
+        TransitionManagerPort.beginDelayedTransition(sceneRoot);
+    }
+
+    @Override
+    public void beginDelayedTransition(ViewGroup sceneRoot, TransitionImpl transition) {
+        TransitionManagerPort.beginDelayedTransition(sceneRoot,
+                transition == null ? null : ((TransitionIcs) transition).mTransition);
+    }
+
+}
diff --git a/transition/ics/android/support/transition/TransitionPort.java b/transition/ics/android/support/transition/TransitionPort.java
new file mode 100644
index 0000000..d9c2e10
--- /dev/null
+++ b/transition/ics/android/support/transition/TransitionPort.java
@@ -0,0 +1,1268 @@
+/*
+ * Copyright (C) 2016 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 android.support.transition;
+
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.TimeInterpolator;
+import android.support.v4.util.ArrayMap;
+import android.support.v4.util.LongSparseArray;
+import android.util.Log;
+import android.util.SparseArray;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ListView;
+
+import java.util.ArrayList;
+import java.util.List;
+
+abstract class TransitionPort implements Cloneable {
+
+    static final boolean DBG = false;
+
+    private static final String LOG_TAG = "Transition";
+
+    // Per-animator information used for later canceling when future transitions overlap
+    private static ThreadLocal<ArrayMap<Animator, AnimationInfo>> sRunningAnimators =
+            new ThreadLocal<>();
+
+    long mStartDelay = -1;
+
+    long mDuration = -1;
+
+    TimeInterpolator mInterpolator = null;
+
+    ArrayList<Integer> mTargetIds = new ArrayList<>();
+
+    ArrayList<View> mTargets = new ArrayList<>();
+
+    ArrayList<Integer> mTargetIdExcludes = null;
+
+    ArrayList<View> mTargetExcludes = null;
+
+    ArrayList<Class> mTargetTypeExcludes = null;
+
+    ArrayList<Integer> mTargetIdChildExcludes = null;
+
+    ArrayList<View> mTargetChildExcludes = null;
+
+    ArrayList<Class> mTargetTypeChildExcludes = null;
+
+    TransitionSetPort mParent = null;
+
+    // Scene Root is set at createAnimator() time in the cloned Transition
+    ViewGroup mSceneRoot = null;
+
+    // Whether removing views from their parent is possible. This is only for views
+    // in the start scene, which are no longer in the view hierarchy. This property
+    // is determined by whether the previous Scene was created from a layout
+    // resource, and thus the views from the exited scene are going away anyway
+    // and can be removed as necessary to achieve a particular effect, such as
+    // removing them from parents to add them to overlays.
+    boolean mCanRemoveViews = false;
+
+    // Number of per-target instances of this Transition currently running. This count is
+    // determined by calls to start() and end()
+    int mNumInstances = 0;
+
+    // Whether this transition is currently paused, due to a call to pause()
+    boolean mPaused = false;
+
+    // The set of listeners to be sent transition lifecycle events.
+    ArrayList<TransitionListener> mListeners = null;
+
+    // The set of animators collected from calls to createAnimator(),
+    // to be run in runAnimators()
+    ArrayList<Animator> mAnimators = new ArrayList<>();
+
+    private String mName = getClass().getName();
+
+    private android.support.transition.TransitionValuesMaps mStartValues
+            = new android.support.transition.TransitionValuesMaps();
+
+    private android.support.transition.TransitionValuesMaps mEndValues
+            = new android.support.transition.TransitionValuesMaps();
+
+    // Track all animators in use in case the transition gets canceled and needs to
+    // cancel running animators
+    private ArrayList<Animator> mCurrentAnimators = new ArrayList<>();
+
+    // Whether this transition has ended. Used to avoid pause/resume on transitions
+    // that have completed
+    private boolean mEnded = false;
+
+    /**
+     * Constructs a Transition object with no target objects. A transition with
+     * no targets defaults to running on all target objects in the scene hierarchy
+     * (if the transition is not contained in a TransitionSet), or all target
+     * objects passed down from its parent (if it is in a TransitionSet).
+     */
+    public TransitionPort() {
+    }
+
+    private static ArrayMap<Animator, AnimationInfo> getRunningAnimators() {
+        ArrayMap<Animator, AnimationInfo> runningAnimators = sRunningAnimators.get();
+        if (runningAnimators == null) {
+            runningAnimators = new ArrayMap<>();
+            sRunningAnimators.set(runningAnimators);
+        }
+        return runningAnimators;
+    }
+
+    public long getDuration() {
+        return mDuration;
+    }
+
+    public TransitionPort setDuration(long duration) {
+        mDuration = duration;
+        return this;
+    }
+
+    public long getStartDelay() {
+        return mStartDelay;
+    }
+
+    public TransitionPort setStartDelay(long startDelay) {
+        mStartDelay = startDelay;
+        return this;
+    }
+
+    public TimeInterpolator getInterpolator() {
+        return mInterpolator;
+    }
+
+    public TransitionPort setInterpolator(TimeInterpolator interpolator) {
+        mInterpolator = interpolator;
+        return this;
+    }
+
+    public String[] getTransitionProperties() {
+        return null;
+    }
+
+
+    public Animator createAnimator(ViewGroup sceneRoot, TransitionValues startValues,
+            TransitionValues endValues) {
+        return null;
+    }
+
+    /**
+     * This method, essentially a wrapper around all calls to createAnimator for all
+     * possible target views, is called with the entire set of start/end
+     * values. The implementation in Transition iterates through these lists
+     * and calls {@link #createAnimator(ViewGroup, TransitionValues, TransitionValues)}
+     * with each set of start/end values on this transition. The
+     * TransitionSet subclass overrides this method and delegates it to
+     * each of its children in succession.
+     *
+     * @hide
+     */
+    protected void createAnimators(ViewGroup sceneRoot, TransitionValuesMaps startValues,
+            TransitionValuesMaps endValues) {
+        if (DBG) {
+            Log.d(LOG_TAG, "createAnimators() for " + this);
+        }
+        ArrayMap<View, TransitionValues> endCopy =
+                new ArrayMap<>(endValues.viewValues);
+        SparseArray<TransitionValues> endIdCopy =
+                new SparseArray<>(endValues.idValues.size());
+        for (int i = 0; i < endValues.idValues.size(); ++i) {
+            int id = endValues.idValues.keyAt(i);
+            endIdCopy.put(id, endValues.idValues.valueAt(i));
+        }
+        LongSparseArray<TransitionValues> endItemIdCopy =
+                new LongSparseArray<>(endValues.itemIdValues.size());
+        for (int i = 0; i < endValues.itemIdValues.size(); ++i) {
+            long id = endValues.itemIdValues.keyAt(i);
+            endItemIdCopy.put(id, endValues.itemIdValues.valueAt(i));
+        }
+        // Walk through the start values, playing everything we find
+        // Remove from the end set as we go
+        ArrayList<TransitionValues> startValuesList = new ArrayList<>();
+        ArrayList<TransitionValues> endValuesList = new ArrayList<>();
+        for (View view : startValues.viewValues.keySet()) {
+            TransitionValues start;
+            TransitionValues end = null;
+            boolean isInListView = false;
+            if (view.getParent() instanceof ListView) {
+                isInListView = true;
+            }
+            if (!isInListView) {
+                int id = view.getId();
+                start = startValues.viewValues.get(view) != null ?
+                        startValues.viewValues.get(view) : startValues.idValues.get(id);
+                if (endValues.viewValues.get(view) != null) {
+                    end = endValues.viewValues.get(view);
+                    endCopy.remove(view);
+                } else if (id != View.NO_ID) {
+                    end = endValues.idValues.get(id);
+                    View removeView = null;
+                    for (View viewToRemove : endCopy.keySet()) {
+                        if (viewToRemove.getId() == id) {
+                            removeView = viewToRemove;
+                        }
+                    }
+                    if (removeView != null) {
+                        endCopy.remove(removeView);
+                    }
+                }
+                endIdCopy.remove(id);
+                if (isValidTarget(view, id)) {
+                    startValuesList.add(start);
+                    endValuesList.add(end);
+                }
+            } else {
+                ListView parent = (ListView) view.getParent();
+                if (parent.getAdapter().hasStableIds()) {
+                    int position = parent.getPositionForView(view);
+                    long itemId = parent.getItemIdAtPosition(position);
+                    start = startValues.itemIdValues.get(itemId);
+                    endItemIdCopy.remove(itemId);
+                    // TODO: deal with targetIDs for itemIDs for ListView items
+                    startValuesList.add(start);
+                    endValuesList.add(end);
+                }
+            }
+        }
+        int startItemIdCopySize = startValues.itemIdValues.size();
+        for (int i = 0; i < startItemIdCopySize; ++i) {
+            long id = startValues.itemIdValues.keyAt(i);
+            if (isValidTarget(null, id)) {
+                TransitionValues start = startValues.itemIdValues.get(id);
+                TransitionValues end = endValues.itemIdValues.get(id);
+                endItemIdCopy.remove(id);
+                startValuesList.add(start);
+                endValuesList.add(end);
+            }
+        }
+        // Now walk through the remains of the end set
+        for (View view : endCopy.keySet()) {
+            int id = view.getId();
+            if (isValidTarget(view, id)) {
+                TransitionValues start = startValues.viewValues.get(view) != null ?
+                        startValues.viewValues.get(view) : startValues.idValues.get(id);
+                TransitionValues end = endCopy.get(view);
+                endIdCopy.remove(id);
+                startValuesList.add(start);
+                endValuesList.add(end);
+            }
+        }
+        int endIdCopySize = endIdCopy.size();
+        for (int i = 0; i < endIdCopySize; ++i) {
+            int id = endIdCopy.keyAt(i);
+            if (isValidTarget(null, id)) {
+                TransitionValues start = startValues.idValues.get(id);
+                TransitionValues end = endIdCopy.get(id);
+                startValuesList.add(start);
+                endValuesList.add(end);
+            }
+        }
+        int endItemIdCopySize = endItemIdCopy.size();
+        for (int i = 0; i < endItemIdCopySize; ++i) {
+            long id = endItemIdCopy.keyAt(i);
+            // TODO: Deal with targetIDs and itemIDs
+            TransitionValues start = startValues.itemIdValues.get(id);
+            TransitionValues end = endItemIdCopy.get(id);
+            startValuesList.add(start);
+            endValuesList.add(end);
+        }
+        ArrayMap<Animator, AnimationInfo> runningAnimators = getRunningAnimators();
+        for (int i = 0; i < startValuesList.size(); ++i) {
+            TransitionValues start = startValuesList.get(i);
+            TransitionValues end = endValuesList.get(i);
+            // Only bother trying to animate with values that differ between start/end
+            if (start != null || end != null) {
+                if (start == null || !start.equals(end)) {
+                    if (DBG) {
+                        View view = (end != null) ? end.view : start.view;
+                        Log.d(LOG_TAG, "  differing start/end values for view " +
+                                view);
+                        if (start == null || end == null) {
+                            Log.d(LOG_TAG, "    " + ((start == null) ?
+                                    "start null, end non-null" : "start non-null, end null"));
+                        } else {
+                            for (String key : start.values.keySet()) {
+                                Object startValue = start.values.get(key);
+                                Object endValue = end.values.get(key);
+                                if (startValue != endValue && !startValue.equals(endValue)) {
+                                    Log.d(LOG_TAG, "    " + key + ": start(" + startValue +
+                                            "), end(" + endValue + ")");
+                                }
+                            }
+                        }
+                    }
+                    // TODO: what to do about targetIds and itemIds?
+                    Animator animator = createAnimator(sceneRoot, start, end);
+                    if (animator != null) {
+                        // Save animation info for future cancellation purposes
+                        View view;
+                        TransitionValues infoValues = null;
+                        if (end != null) {
+                            view = end.view;
+                            String[] properties = getTransitionProperties();
+                            if (view != null && properties != null && properties.length > 0) {
+                                infoValues = new TransitionValues();
+                                infoValues.view = view;
+                                TransitionValues newValues = endValues.viewValues.get(view);
+                                if (newValues != null) {
+                                    for (int j = 0; j < properties.length; ++j) {
+                                        infoValues.values.put(properties[j],
+                                                newValues.values.get(properties[j]));
+                                    }
+                                }
+                                int numExistingAnims = runningAnimators.size();
+                                for (int j = 0; j < numExistingAnims; ++j) {
+                                    Animator anim = runningAnimators.keyAt(j);
+                                    AnimationInfo info = runningAnimators.get(anim);
+                                    if (info.values != null && info.view == view &&
+                                            ((info.name == null && getName() == null) ||
+                                                    info.name.equals(getName()))) {
+                                        if (info.values.equals(infoValues)) {
+                                            // Favor the old animator
+                                            animator = null;
+                                            break;
+                                        }
+                                    }
+                                }
+                            }
+                        } else {
+                            view = start.view;
+                        }
+                        if (animator != null) {
+                            AnimationInfo info = new AnimationInfo(view, getName(), infoValues);
+                            runningAnimators.put(animator, info);
+                            mAnimators.add(animator);
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * Internal utility method for checking whether a given view/id
+     * is valid for this transition, where "valid" means that either
+     * the Transition has no target/targetId list (the default, in which
+     * cause the transition should act on all views in the hiearchy), or
+     * the given view is in the target list or the view id is in the
+     * targetId list. If the target parameter is null, then the target list
+     * is not checked (this is in the case of ListView items, where the
+     * views are ignored and only the ids are used).
+     */
+    boolean isValidTarget(View target, long targetId) {
+        if (mTargetIdExcludes != null && mTargetIdExcludes.contains((int)targetId)) {
+            return false;
+        }
+        if (mTargetExcludes != null && mTargetExcludes.contains(target)) {
+            return false;
+        }
+        if (mTargetTypeExcludes != null && target != null) {
+            int numTypes = mTargetTypeExcludes.size();
+            for (int i = 0; i < numTypes; ++i) {
+                Class type = mTargetTypeExcludes.get(i);
+                if (type.isInstance(target)) {
+                    return false;
+                }
+            }
+        }
+        if (mTargetIds.size() == 0 && mTargets.size() == 0) {
+            return true;
+        }
+        if (mTargetIds.size() > 0) {
+            for (int i = 0; i < mTargetIds.size(); ++i) {
+                if (mTargetIds.get(i) == targetId) {
+                    return true;
+                }
+            }
+        }
+        if (target != null && mTargets.size() > 0) {
+            for (int i = 0; i < mTargets.size(); ++i) {
+                if (mTargets.get(i) == target) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    /**
+     * This is called internally once all animations have been set up by the
+     * transition hierarchy. \
+     *
+     * @hide
+     */
+    protected void runAnimators() {
+        if (DBG) {
+            Log.d(LOG_TAG, "runAnimators() on " + this);
+        }
+        start();
+        ArrayMap<Animator, AnimationInfo> runningAnimators = getRunningAnimators();
+        // Now start every Animator that was previously created for this transition
+        for (Animator anim : mAnimators) {
+            if (DBG) {
+                Log.d(LOG_TAG, "  anim: " + anim);
+            }
+            if (runningAnimators.containsKey(anim)) {
+                start();
+                runAnimator(anim, runningAnimators);
+            }
+        }
+        mAnimators.clear();
+        end();
+    }
+
+    private void runAnimator(Animator animator,
+            final ArrayMap<Animator, AnimationInfo> runningAnimators) {
+        if (animator != null) {
+            // TODO: could be a single listener instance for all of them since it uses the param
+            animator.addListener(new AnimatorListenerAdapter() {
+                @Override
+                public void onAnimationStart(Animator animation) {
+                    mCurrentAnimators.add(animation);
+                }
+
+                @Override
+                public void onAnimationEnd(Animator animation) {
+                    runningAnimators.remove(animation);
+                    mCurrentAnimators.remove(animation);
+                }
+            });
+            animate(animator);
+        }
+    }
+
+    public abstract void captureStartValues(TransitionValues transitionValues);
+
+    public abstract void captureEndValues(TransitionValues transitionValues);
+
+    public TransitionPort addTarget(int targetId) {
+        if (targetId > 0) {
+            mTargetIds.add(targetId);
+        }
+        return this;
+    }
+
+    public TransitionPort removeTarget(int targetId) {
+        if (targetId > 0) {
+            // TODO: This implementation needs to be applied to K and L for b/22043875
+            mTargetIds.remove((Integer) targetId);
+        }
+        return this;
+    }
+
+    public TransitionPort excludeTarget(int targetId, boolean exclude) {
+        mTargetIdExcludes = excludeId(mTargetIdExcludes, targetId, exclude);
+        return this;
+    }
+
+
+    public TransitionPort excludeChildren(int targetId, boolean exclude) {
+        mTargetIdChildExcludes = excludeId(mTargetIdChildExcludes, targetId, exclude);
+        return this;
+    }
+
+    /**
+     * Utility method to manage the boilerplate code that is the same whether we
+     * are excluding targets or their children.
+     */
+    private ArrayList<Integer> excludeId(ArrayList<Integer> list, int targetId, boolean exclude) {
+        if (targetId > 0) {
+            if (exclude) {
+                list = ArrayListManager.add(list, targetId);
+            } else {
+                list = ArrayListManager.remove(list, targetId);
+            }
+        }
+        return list;
+    }
+
+    public TransitionPort excludeTarget(View target, boolean exclude) {
+        mTargetExcludes = excludeView(mTargetExcludes, target, exclude);
+        return this;
+    }
+
+    public TransitionPort excludeChildren(View target, boolean exclude) {
+        mTargetChildExcludes = excludeView(mTargetChildExcludes, target, exclude);
+        return this;
+    }
+
+    /**
+     * Utility method to manage the boilerplate code that is the same whether we
+     * are excluding targets or their children.
+     */
+    private ArrayList<View> excludeView(ArrayList<View> list, View target, boolean exclude) {
+        if (target != null) {
+            if (exclude) {
+                list = ArrayListManager.add(list, target);
+            } else {
+                list = ArrayListManager.remove(list, target);
+            }
+        }
+        return list;
+    }
+
+    public TransitionPort excludeTarget(Class type, boolean exclude) {
+        mTargetTypeExcludes = excludeType(mTargetTypeExcludes, type, exclude);
+        return this;
+    }
+
+    public TransitionPort excludeChildren(Class type, boolean exclude) {
+        mTargetTypeChildExcludes = excludeType(mTargetTypeChildExcludes, type, exclude);
+        return this;
+    }
+
+    /**
+     * Utility method to manage the boilerplate code that is the same whether we
+     * are excluding targets or their children.
+     */
+    private ArrayList<Class> excludeType(ArrayList<Class> list, Class type, boolean exclude) {
+        if (type != null) {
+            if (exclude) {
+                list = ArrayListManager.add(list, type);
+            } else {
+                list = ArrayListManager.remove(list, type);
+            }
+        }
+        return list;
+    }
+
+    /**
+     * Sets the target view instances that this Transition is interested in
+     * animating. By default, there are no targets, and a Transition will
+     * listen for changes on every view in the hierarchy below the sceneRoot
+     * of the Scene being transitioned into. Setting targets constrains
+     * the Transition to only listen for, and act on, these views.
+     * All other views will be ignored.
+     *
+     * <p>The target list is like the {@link #addTarget(int) targetId}
+     * list except this list specifies the actual View instances, not the ids
+     * of the views. This is an important distinction when scene changes involve
+     * view hierarchies which have been inflated separately; different views may
+     * share the same id but not actually be the same instance. If the transition
+     * should treat those views as the same, then {@link #addTarget(int)} should be used
+     * instead of {@link #addTarget(View)}. If, on the other hand, scene changes involve
+     * changes all within the same view hierarchy, among views which do not
+     * necessarily have ids set on them, then the target list of views may be more
+     * convenient.</p>
+     *
+     * @param target A View on which the Transition will act, must be non-null.
+     * @return The Transition to which the target is added.
+     * Returning the same object makes it easier to chain calls during
+     * construction, such as
+     * <code>transitionSet.addTransitions(new Fade()).addTarget(someView);</code>
+     * @see #addTarget(int)
+     */
+    public TransitionPort addTarget(View target) {
+        mTargets.add(target);
+        return this;
+    }
+
+    public TransitionPort removeTarget(View target) {
+        if (target != null) {
+            mTargets.remove(target);
+        }
+        return this;
+    }
+
+    public List<Integer> getTargetIds() {
+        return mTargetIds;
+    }
+
+    public List<View> getTargets() {
+        return mTargets;
+    }
+
+    /**
+     * Recursive method that captures values for the given view and the
+     * hierarchy underneath it.
+     *
+     * @param sceneRoot The root of the view hierarchy being captured
+     * @param start     true if this capture is happening before the scene change,
+     *                  false otherwise
+     */
+    void captureValues(ViewGroup sceneRoot, boolean start) {
+        clearValues(start);
+        if (mTargetIds.size() > 0 || mTargets.size() > 0) {
+            if (mTargetIds.size() > 0) {
+                for (int i = 0; i < mTargetIds.size(); ++i) {
+                    int id = mTargetIds.get(i);
+                    View view = sceneRoot.findViewById(id);
+                    if (view != null) {
+                        TransitionValues values = new TransitionValues();
+                        values.view = view;
+                        if (start) {
+                            captureStartValues(values);
+                        } else {
+                            captureEndValues(values);
+                        }
+                        if (start) {
+                            mStartValues.viewValues.put(view, values);
+                            if (id >= 0) {
+                                mStartValues.idValues.put(id, values);
+                            }
+                        } else {
+                            mEndValues.viewValues.put(view, values);
+                            if (id >= 0) {
+                                mEndValues.idValues.put(id, values);
+                            }
+                        }
+                    }
+                }
+            }
+            if (mTargets.size() > 0) {
+                for (int i = 0; i < mTargets.size(); ++i) {
+                    View view = mTargets.get(i);
+                    if (view != null) {
+                        TransitionValues values = new TransitionValues();
+                        values.view = view;
+                        if (start) {
+                            captureStartValues(values);
+                        } else {
+                            captureEndValues(values);
+                        }
+                        if (start) {
+                            mStartValues.viewValues.put(view, values);
+                        } else {
+                            mEndValues.viewValues.put(view, values);
+                        }
+                    }
+                }
+            }
+        } else {
+            captureHierarchy(sceneRoot, start);
+        }
+    }
+
+    /**
+     * Clear valuesMaps for specified start/end state
+     *
+     * @param start true if the start values should be cleared, false otherwise
+     */
+    void clearValues(boolean start) {
+        if (start) {
+            mStartValues.viewValues.clear();
+            mStartValues.idValues.clear();
+            mStartValues.itemIdValues.clear();
+        } else {
+            mEndValues.viewValues.clear();
+            mEndValues.idValues.clear();
+            mEndValues.itemIdValues.clear();
+        }
+    }
+
+    /**
+     * Recursive method which captures values for an entire view hierarchy,
+     * starting at some root view. Transitions without targetIDs will use this
+     * method to capture values for all possible views.
+     *
+     * @param view  The view for which to capture values. Children of this View
+     *              will also be captured, recursively down to the leaf nodes.
+     * @param start true if values are being captured in the start scene, false
+     *              otherwise.
+     */
+    private void captureHierarchy(View view, boolean start) {
+        if (view == null) {
+            return;
+        }
+        boolean isListViewItem = false;
+        if (view.getParent() instanceof ListView) {
+            isListViewItem = true;
+        }
+        if (isListViewItem && !((ListView) view.getParent()).getAdapter().hasStableIds()) {
+            // ignore listview children unless we can track them with stable IDs
+            return;
+        }
+        int id = View.NO_ID;
+        long itemId = View.NO_ID;
+        if (!isListViewItem) {
+            id = view.getId();
+        } else {
+            ListView listview = (ListView) view.getParent();
+            int position = listview.getPositionForView(view);
+            itemId = listview.getItemIdAtPosition(position);
+//            view.setHasTransientState(true);
+        }
+        if (mTargetIdExcludes != null && mTargetIdExcludes.contains(id)) {
+            return;
+        }
+        if (mTargetExcludes != null && mTargetExcludes.contains(view)) {
+            return;
+        }
+        if (mTargetTypeExcludes != null && view != null) {
+            int numTypes = mTargetTypeExcludes.size();
+            for (int i = 0; i < numTypes; ++i) {
+                if (mTargetTypeExcludes.get(i).isInstance(view)) {
+                    return;
+                }
+            }
+        }
+        TransitionValues values = new TransitionValues();
+        values.view = view;
+        if (start) {
+            captureStartValues(values);
+        } else {
+            captureEndValues(values);
+        }
+        if (start) {
+            if (!isListViewItem) {
+                mStartValues.viewValues.put(view, values);
+                if (id >= 0) {
+                    mStartValues.idValues.put((int) id, values);
+                }
+            } else {
+                mStartValues.itemIdValues.put(itemId, values);
+            }
+        } else {
+            if (!isListViewItem) {
+                mEndValues.viewValues.put(view, values);
+                if (id >= 0) {
+                    mEndValues.idValues.put((int) id, values);
+                }
+            } else {
+                mEndValues.itemIdValues.put(itemId, values);
+            }
+        }
+        if (view instanceof ViewGroup) {
+            // Don't traverse child hierarchy if there are any child-excludes on this view
+            if (mTargetIdChildExcludes != null && mTargetIdChildExcludes.contains(id)) {
+                return;
+            }
+            if (mTargetChildExcludes != null && mTargetChildExcludes.contains(view)) {
+                return;
+            }
+            if (mTargetTypeChildExcludes != null && view != null) {
+                int numTypes = mTargetTypeChildExcludes.size();
+                for (int i = 0; i < numTypes; ++i) {
+                    if (mTargetTypeChildExcludes.get(i).isInstance(view)) {
+                        return;
+                    }
+                }
+            }
+            ViewGroup parent = (ViewGroup) view;
+            for (int i = 0; i < parent.getChildCount(); ++i) {
+                captureHierarchy(parent.getChildAt(i), start);
+            }
+        }
+    }
+
+    public TransitionValues getTransitionValues(View view, boolean start) {
+        if (mParent != null) {
+            return mParent.getTransitionValues(view, start);
+        }
+        TransitionValuesMaps valuesMaps = start ? mStartValues : mEndValues;
+        TransitionValues values = valuesMaps.viewValues.get(view);
+        if (values == null) {
+            int id = view.getId();
+            if (id >= 0) {
+                values = valuesMaps.idValues.get(id);
+            }
+            if (values == null && view.getParent() instanceof ListView) {
+                ListView listview = (ListView) view.getParent();
+                int position = listview.getPositionForView(view);
+                long itemId = listview.getItemIdAtPosition(position);
+                values = valuesMaps.itemIdValues.get(itemId);
+            }
+            // TODO: Doesn't handle the case where a view was parented to a
+            // ListView (with an itemId), but no longer is
+        }
+        return values;
+    }
+
+    /**
+     * Pauses this transition, sending out calls to {@link
+     * TransitionListener#onTransitionPause(TransitionPort)} to all listeners
+     * and pausing all running animators started by this transition.
+     *
+     * @hide
+     */
+    public void pause() {
+        if (!mEnded) {
+            ArrayMap<Animator, AnimationInfo> runningAnimators = getRunningAnimators();
+            int numOldAnims = runningAnimators.size();
+            for (int i = numOldAnims - 1; i >= 0; i--) {
+                Animator anim = runningAnimators.keyAt(i);
+//                anim.pause();
+            }
+            if (mListeners != null && mListeners.size() > 0) {
+                ArrayList<TransitionListener> tmpListeners =
+                        (ArrayList<TransitionListener>) mListeners.clone();
+                int numListeners = tmpListeners.size();
+                for (int i = 0; i < numListeners; ++i) {
+                    tmpListeners.get(i).onTransitionPause(this);
+                }
+            }
+            mPaused = true;
+        }
+    }
+
+    /**
+     * Resumes this transition, sending out calls to {@link
+     * TransitionListener#onTransitionPause(TransitionPort)} to all listeners
+     * and pausing all running animators started by this transition.
+     *
+     * @hide
+     */
+    public void resume() {
+        if (mPaused) {
+            if (!mEnded) {
+                ArrayMap<Animator, AnimationInfo> runningAnimators = getRunningAnimators();
+                int numOldAnims = runningAnimators.size();
+                for (int i = numOldAnims - 1; i >= 0; i--) {
+                    Animator anim = runningAnimators.keyAt(i);
+//                    anim.resume();
+                }
+                if (mListeners != null && mListeners.size() > 0) {
+                    ArrayList<TransitionListener> tmpListeners =
+                            (ArrayList<TransitionListener>) mListeners.clone();
+                    int numListeners = tmpListeners.size();
+                    for (int i = 0; i < numListeners; ++i) {
+                        tmpListeners.get(i).onTransitionResume(this);
+                    }
+                }
+            }
+            mPaused = false;
+        }
+    }
+
+    /**
+     * Called by TransitionManager to play the transition. This calls
+     * createAnimators() to set things up and create all of the animations and then
+     * runAnimations() to actually start the animations.
+     */
+    void playTransition(ViewGroup sceneRoot) {
+        ArrayMap<Animator, AnimationInfo> runningAnimators = getRunningAnimators();
+        int numOldAnims = runningAnimators.size();
+        for (int i = numOldAnims - 1; i >= 0; i--) {
+            Animator anim = runningAnimators.keyAt(i);
+            if (anim != null) {
+                AnimationInfo oldInfo = runningAnimators.get(anim);
+                if (oldInfo != null && oldInfo.view != null &&
+                        oldInfo.view.getContext() == sceneRoot.getContext()) {
+                    boolean cancel = false;
+                    TransitionValues oldValues = oldInfo.values;
+                    View oldView = oldInfo.view;
+                    TransitionValues newValues = mEndValues.viewValues != null ?
+                            mEndValues.viewValues.get(oldView) : null;
+                    if (newValues == null) {
+                        newValues = mEndValues.idValues.get(oldView.getId());
+                    }
+                    if (oldValues != null) {
+                        // if oldValues null, then transition didn't care to stash values,
+                        // and won't get canceled
+                        if (newValues != null) {
+                            for (String key : oldValues.values.keySet()) {
+                                Object oldValue = oldValues.values.get(key);
+                                Object newValue = newValues.values.get(key);
+                                if (oldValue != null && newValue != null &&
+                                        !oldValue.equals(newValue)) {
+                                    cancel = true;
+                                    if (DBG) {
+                                        Log.d(LOG_TAG, "Transition.playTransition: " +
+                                                "oldValue != newValue for " + key +
+                                                ": old, new = " + oldValue + ", " + newValue);
+                                    }
+                                    break;
+                                }
+                            }
+                        }
+                    }
+                    if (cancel) {
+                        if (anim.isRunning() || anim.isStarted()) {
+                            if (DBG) {
+                                Log.d(LOG_TAG, "Canceling anim " + anim);
+                            }
+                            anim.cancel();
+                        } else {
+                            if (DBG) {
+                                Log.d(LOG_TAG, "removing anim from info list: " + anim);
+                            }
+                            runningAnimators.remove(anim);
+                        }
+                    }
+                }
+            }
+        }
+
+        createAnimators(sceneRoot, mStartValues, mEndValues);
+        runAnimators();
+    }
+
+    /**
+     * This is a utility method used by subclasses to handle standard parts of
+     * setting up and running an Animator: it sets the {@link #getDuration()
+     * duration} and the {@link #getStartDelay() startDelay}, starts the
+     * animation, and, when the animator ends, calls {@link #end()}.
+     *
+     * @param animator The Animator to be run during this transition.
+     * @hide
+     */
+    protected void animate(Animator animator) {
+        // TODO: maybe pass auto-end as a boolean parameter?
+        if (animator == null) {
+            end();
+        } else {
+            if (getDuration() >= 0) {
+                animator.setDuration(getDuration());
+            }
+            if (getStartDelay() >= 0) {
+                animator.setStartDelay(getStartDelay());
+            }
+            if (getInterpolator() != null) {
+                animator.setInterpolator(getInterpolator());
+            }
+            animator.addListener(new AnimatorListenerAdapter() {
+                @Override
+                public void onAnimationEnd(Animator animation) {
+                    end();
+                    animation.removeListener(this);
+                }
+            });
+            animator.start();
+        }
+    }
+
+    /**
+     * This method is called automatically by the transition and
+     * TransitionSet classes prior to a Transition subclass starting;
+     * subclasses should not need to call it directly.
+     *
+     * @hide
+     */
+    protected void start() {
+        if (mNumInstances == 0) {
+            if (mListeners != null && mListeners.size() > 0) {
+                ArrayList<TransitionListener> tmpListeners =
+                        (ArrayList<TransitionListener>) mListeners.clone();
+                int numListeners = tmpListeners.size();
+                for (int i = 0; i < numListeners; ++i) {
+                    tmpListeners.get(i).onTransitionStart(this);
+                }
+            }
+            mEnded = false;
+        }
+        mNumInstances++;
+    }
+
+    /**
+     * This method is called automatically by the Transition and
+     * TransitionSet classes when a transition finishes, either because
+     * a transition did nothing (returned a null Animator from
+     * {@link TransitionPort#createAnimator(ViewGroup, TransitionValues,
+     * TransitionValues)}) or because the transition returned a valid
+     * Animator and end() was called in the onAnimationEnd()
+     * callback of the AnimatorListener.
+     *
+     * @hide
+     */
+    protected void end() {
+        --mNumInstances;
+        if (mNumInstances == 0) {
+            if (mListeners != null && mListeners.size() > 0) {
+                ArrayList<TransitionListener> tmpListeners =
+                        (ArrayList<TransitionListener>) mListeners.clone();
+                int numListeners = tmpListeners.size();
+                for (int i = 0; i < numListeners; ++i) {
+                    tmpListeners.get(i).onTransitionEnd(this);
+                }
+            }
+            for (int i = 0; i < mStartValues.itemIdValues.size(); ++i) {
+                TransitionValues tv = mStartValues.itemIdValues.valueAt(i);
+                View v = tv.view;
+//                if (v.hasTransientState()) {
+//                    v.setHasTransientState(false);
+//                }
+            }
+            for (int i = 0; i < mEndValues.itemIdValues.size(); ++i) {
+                TransitionValues tv = mEndValues.itemIdValues.valueAt(i);
+                View v = tv.view;
+//                if (v.hasTransientState()) {
+//                    v.setHasTransientState(false);
+//                }
+            }
+            mEnded = true;
+        }
+    }
+
+    /**
+     * This method cancels a transition that is currently running.
+     *
+     * @hide
+     */
+    protected void cancel() {
+        int numAnimators = mCurrentAnimators.size();
+        for (int i = numAnimators - 1; i >= 0; i--) {
+            Animator animator = mCurrentAnimators.get(i);
+            animator.cancel();
+        }
+        if (mListeners != null && mListeners.size() > 0) {
+            ArrayList<TransitionListener> tmpListeners =
+                    (ArrayList<TransitionListener>) mListeners.clone();
+            int numListeners = tmpListeners.size();
+            for (int i = 0; i < numListeners; ++i) {
+                tmpListeners.get(i).onTransitionCancel(this);
+            }
+        }
+    }
+
+    /**
+     * Adds a listener to the set of listeners that are sent events through the
+     * life of an animation, such as start, repeat, and end.
+     *
+     * @param listener the listener to be added to the current set of listeners
+     *                 for this animation.
+     * @return This transition object.
+     */
+    public TransitionPort addListener(TransitionListener listener) {
+        if (mListeners == null) {
+            mListeners = new ArrayList<>();
+        }
+        mListeners.add(listener);
+        return this;
+    }
+
+    public TransitionPort removeListener(TransitionListener listener) {
+        if (mListeners == null) {
+            return this;
+        }
+        mListeners.remove(listener);
+        if (mListeners.size() == 0) {
+            mListeners = null;
+        }
+        return this;
+    }
+
+    TransitionPort setSceneRoot(ViewGroup sceneRoot) {
+        mSceneRoot = sceneRoot;
+        return this;
+    }
+
+    void setCanRemoveViews(boolean canRemoveViews) {
+        mCanRemoveViews = canRemoveViews;
+    }
+
+    @Override
+    public String toString() {
+        return toString("");
+    }
+
+    @Override
+    public TransitionPort clone() {
+        TransitionPort clone = null;
+        try {
+            clone = (TransitionPort) super.clone();
+            clone.mAnimators = new ArrayList<Animator>();
+            clone.mStartValues = new TransitionValuesMaps();
+            clone.mEndValues = new TransitionValuesMaps();
+        } catch (CloneNotSupportedException e) {
+        }
+
+        return clone;
+    }
+
+    public String getName() {
+        return mName;
+    }
+
+    String toString(String indent) {
+        String result = indent + getClass().getSimpleName() + "@" +
+                Integer.toHexString(hashCode()) + ": ";
+        if (mDuration != -1) {
+            result += "dur(" + mDuration + ") ";
+        }
+        if (mStartDelay != -1) {
+            result += "dly(" + mStartDelay + ") ";
+        }
+        if (mInterpolator != null) {
+            result += "interp(" + mInterpolator + ") ";
+        }
+        if (mTargetIds.size() > 0 || mTargets.size() > 0) {
+            result += "tgts(";
+            if (mTargetIds.size() > 0) {
+                for (int i = 0; i < mTargetIds.size(); ++i) {
+                    if (i > 0) {
+                        result += ", ";
+                    }
+                    result += mTargetIds.get(i);
+                }
+            }
+            if (mTargets.size() > 0) {
+                for (int i = 0; i < mTargets.size(); ++i) {
+                    if (i > 0) {
+                        result += ", ";
+                    }
+                    result += mTargets.get(i);
+                }
+            }
+            result += ")";
+        }
+        return result;
+    }
+
+    public interface TransitionListener {
+
+        /**
+         * Notification about the start of the transition.
+         *
+         * @param transition The started transition.
+         */
+        void onTransitionStart(TransitionPort transition);
+
+        /**
+         * Notification about the end of the transition. Canceled transitions
+         * will always notify listeners of both the cancellation and end
+         * events. That is, {@link #onTransitionEnd(TransitionPort)} is always called,
+         * regardless of whether the transition was canceled or played
+         * through to completion.
+         *
+         * @param transition The transition which reached its end.
+         */
+        void onTransitionEnd(TransitionPort transition);
+
+        /**
+         * Notification about the cancellation of the transition.
+         * Note that cancel may be called by a parent {@link TransitionSetPort} on
+         * a child transition which has not yet started. This allows the child
+         * transition to restore state on target objects which was set at
+         * {@link #createAnimator(ViewGroup, TransitionValues, TransitionValues)
+         * createAnimator()} time.
+         *
+         * @param transition The transition which was canceled.
+         */
+        void onTransitionCancel(TransitionPort transition);
+
+        /**
+         * Notification when a transition is paused.
+         * Note that createAnimator() may be called by a parent {@link TransitionSetPort} on
+         * a child transition which has not yet started. This allows the child
+         * transition to restore state on target objects which was set at
+         * {@link #createAnimator(ViewGroup, TransitionValues, TransitionValues)
+         * createAnimator()} time.
+         *
+         * @param transition The transition which was paused.
+         */
+        void onTransitionPause(TransitionPort transition);
+
+        /**
+         * Notification when a transition is resumed.
+         * Note that resume() may be called by a parent {@link TransitionSetPort} on
+         * a child transition which has not yet started. This allows the child
+         * transition to restore state which may have changed in an earlier call
+         * to {@link #onTransitionPause(TransitionPort)}.
+         *
+         * @param transition The transition which was resumed.
+         */
+        void onTransitionResume(TransitionPort transition);
+    }
+
+    /**
+     * Utility adapter class to avoid having to override all three methods
+     * whenever someone just wants to listen for a single event.
+     *
+     * @hide
+     */
+    public static class TransitionListenerAdapter implements TransitionListener {
+
+        @Override
+        public void onTransitionStart(TransitionPort transition) {
+        }
+
+        @Override
+        public void onTransitionEnd(TransitionPort transition) {
+        }
+
+        @Override
+        public void onTransitionCancel(TransitionPort transition) {
+        }
+
+        @Override
+        public void onTransitionPause(TransitionPort transition) {
+        }
+
+        @Override
+        public void onTransitionResume(TransitionPort transition) {
+        }
+    }
+
+    /**
+     * Holds information about each animator used when a new transition starts
+     * while other transitions are still running to determine whether a running
+     * animation should be canceled or a new animation noop'd. The structure holds
+     * information about the state that an animation is going to, to be compared to
+     * end state of a new animation.
+     */
+    private static class AnimationInfo {
+
+        View view;
+
+        String name;
+
+        TransitionValues values;
+
+        AnimationInfo(View view, String name, TransitionValues values) {
+            this.view = view;
+            this.name = name;
+            this.values = values;
+        }
+    }
+
+    /**
+     * Utility class for managing typed ArrayLists efficiently. In particular, this
+     * can be useful for lists that we don't expect to be used often (eg, the exclude
+     * lists), so we'd like to keep them nulled out by default. This causes the code to
+     * become tedious, with constant null checks, code to allocate when necessary,
+     * and code to null out the reference when the list is empty. This class encapsulates
+     * all of that functionality into simple add()/remove() methods which perform the
+     * necessary checks, allocation/null-out as appropriate, and return the
+     * resulting list.
+     */
+    private static class ArrayListManager {
+
+        /**
+         * Add the specified item to the list, returning the resulting list.
+         * The returned list can either the be same list passed in or, if that
+         * list was null, the new list that was created.
+         *
+         * Note that the list holds unique items; if the item already exists in the
+         * list, the list is not modified.
+         */
+        static <T> ArrayList<T> add(ArrayList<T> list, T item) {
+            if (list == null) {
+                list = new ArrayList<T>();
+            }
+            if (!list.contains(item)) {
+                list.add(item);
+            }
+            return list;
+        }
+
+        /**
+         * Remove the specified item from the list, returning the resulting list.
+         * The returned list can either the be same list passed in or, if that
+         * list becomes empty as a result of the remove(), the new list was created.
+         */
+        static <T> ArrayList<T> remove(ArrayList<T> list, T item) {
+            if (list != null) {
+                list.remove(item);
+                if (list.isEmpty()) {
+                    list = null;
+                }
+            }
+            return list;
+        }
+    }
+
+}
diff --git a/transition/ics/android/support/transition/TransitionSetIcs.java b/transition/ics/android/support/transition/TransitionSetIcs.java
new file mode 100644
index 0000000..744033e
--- /dev/null
+++ b/transition/ics/android/support/transition/TransitionSetIcs.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2016 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 android.support.transition;
+
+class TransitionSetIcs extends TransitionIcs implements TransitionSetImpl {
+
+    private TransitionSetPort mTransitionSet;
+
+    public TransitionSetIcs(TransitionInterface transition) {
+        mTransitionSet = new TransitionSetPort();
+        init(transition, mTransitionSet);
+    }
+
+    @Override
+    public int getOrdering() {
+        return mTransitionSet.getOrdering();
+    }
+
+    @Override
+    public TransitionSetIcs setOrdering(int ordering) {
+        mTransitionSet.setOrdering(ordering);
+        return this;
+    }
+
+    @Override
+    public TransitionSetIcs addTransition(TransitionImpl transition) {
+        mTransitionSet.addTransition(((TransitionIcs) transition).mTransition);
+        return this;
+    }
+
+    @Override
+    public TransitionSetIcs removeTransition(TransitionImpl transition) {
+        mTransitionSet.removeTransition(((TransitionIcs) transition).mTransition);
+        return this;
+    }
+
+}
diff --git a/transition/ics/android/support/transition/TransitionSetPort.java b/transition/ics/android/support/transition/TransitionSetPort.java
new file mode 100644
index 0000000..eab84c9
--- /dev/null
+++ b/transition/ics/android/support/transition/TransitionSetPort.java
@@ -0,0 +1,334 @@
+/*
+ * Copyright (C) 2016 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 android.support.transition;
+
+import android.animation.TimeInterpolator;
+import android.util.AndroidRuntimeException;
+import android.view.View;
+import android.view.ViewGroup;
+
+import java.util.ArrayList;
+
+class TransitionSetPort extends TransitionPort {
+
+    /**
+     * A flag used to indicate that the child transitions of this set
+     * should all start at the same time.
+     */
+    public static final int ORDERING_TOGETHER = 0;
+
+    /**
+     * A flag used to indicate that the child transitions of this set should
+     * play in sequence; when one child transition ends, the next child
+     * transition begins. Note that a transition does not end until all
+     * instances of it (which are playing on all applicable targets of the
+     * transition) end.
+     */
+    public static final int ORDERING_SEQUENTIAL = 1;
+
+    ArrayList<TransitionPort> mTransitions = new ArrayList<TransitionPort>();
+
+    int mCurrentListeners;
+
+    boolean mStarted = false;
+
+    private boolean mPlayTogether = true;
+
+    public TransitionSetPort() {
+    }
+
+    public int getOrdering() {
+        return mPlayTogether ? ORDERING_TOGETHER : ORDERING_SEQUENTIAL;
+    }
+
+    public TransitionSetPort setOrdering(int ordering) {
+        switch (ordering) {
+            case ORDERING_SEQUENTIAL:
+                mPlayTogether = false;
+                break;
+            case ORDERING_TOGETHER:
+                mPlayTogether = true;
+                break;
+            default:
+                throw new AndroidRuntimeException("Invalid parameter for TransitionSet " +
+                        "ordering: " + ordering);
+        }
+        return this;
+    }
+
+    public TransitionSetPort addTransition(TransitionPort transition) {
+        if (transition != null) {
+            mTransitions.add(transition);
+            transition.mParent = this;
+            if (mDuration >= 0) {
+                transition.setDuration(mDuration);
+            }
+        }
+        return this;
+    }
+
+    /**
+     * Setting a non-negative duration on a TransitionSet causes all of the child
+     * transitions (current and future) to inherit this duration.
+     *
+     * @param duration The length of the animation, in milliseconds.
+     * @return This transitionSet object.
+     */
+    @Override
+    public TransitionSetPort setDuration(long duration) {
+        super.setDuration(duration);
+        if (mDuration >= 0) {
+            int numTransitions = mTransitions.size();
+            for (int i = 0; i < numTransitions; ++i) {
+                mTransitions.get(i).setDuration(duration);
+            }
+        }
+        return this;
+    }
+
+    @Override
+    public TransitionSetPort setStartDelay(long startDelay) {
+        return (TransitionSetPort) super.setStartDelay(startDelay);
+    }
+
+    @Override
+    public TransitionSetPort setInterpolator(TimeInterpolator interpolator) {
+        return (TransitionSetPort) super.setInterpolator(interpolator);
+    }
+
+    @Override
+    public TransitionSetPort addTarget(View target) {
+        return (TransitionSetPort) super.addTarget(target);
+    }
+
+    @Override
+    public TransitionSetPort addTarget(int targetId) {
+        return (TransitionSetPort) super.addTarget(targetId);
+    }
+
+    @Override
+    public TransitionSetPort addListener(TransitionListener listener) {
+        return (TransitionSetPort) super.addListener(listener);
+    }
+
+    @Override
+    public TransitionSetPort removeTarget(int targetId) {
+        return (TransitionSetPort) super.removeTarget(targetId);
+    }
+
+    @Override
+    public TransitionSetPort removeTarget(View target) {
+        return (TransitionSetPort) super.removeTarget(target);
+    }
+
+    @Override
+    public TransitionSetPort removeListener(TransitionListener listener) {
+        return (TransitionSetPort) super.removeListener(listener);
+    }
+
+    public TransitionSetPort removeTransition(TransitionPort transition) {
+        mTransitions.remove(transition);
+        transition.mParent = null;
+        return this;
+    }
+
+    /**
+     * Sets up listeners for each of the child transitions. This is used to
+     * determine when this transition set is finished (all child transitions
+     * must finish first).
+     */
+    private void setupStartEndListeners() {
+        TransitionSetListener listener = new TransitionSetListener(this);
+        for (TransitionPort childTransition : mTransitions) {
+            childTransition.addListener(listener);
+        }
+        mCurrentListeners = mTransitions.size();
+    }
+
+    /**
+     * @hide
+     */
+    @Override
+    protected void createAnimators(ViewGroup sceneRoot, TransitionValuesMaps startValues,
+            TransitionValuesMaps endValues) {
+        for (TransitionPort childTransition : mTransitions) {
+            childTransition.createAnimators(sceneRoot, startValues, endValues);
+        }
+    }
+
+    /**
+     * @hide
+     */
+    @Override
+    protected void runAnimators() {
+        if (mTransitions.isEmpty()) {
+            start();
+            end();
+            return;
+        }
+        setupStartEndListeners();
+        if (!mPlayTogether) {
+            // Setup sequence with listeners
+            // TODO: Need to add listeners in such a way that we can remove them later if canceled
+            for (int i = 1; i < mTransitions.size(); ++i) {
+                TransitionPort previousTransition = mTransitions.get(i - 1);
+                final TransitionPort nextTransition = mTransitions.get(i);
+                previousTransition.addListener(new TransitionListenerAdapter() {
+                    @Override
+                    public void onTransitionEnd(TransitionPort transition) {
+                        nextTransition.runAnimators();
+                        transition.removeListener(this);
+                    }
+                });
+            }
+            TransitionPort firstTransition = mTransitions.get(0);
+            if (firstTransition != null) {
+                firstTransition.runAnimators();
+            }
+        } else {
+            for (TransitionPort childTransition : mTransitions) {
+                childTransition.runAnimators();
+            }
+        }
+    }
+
+    @Override
+    public void captureStartValues(TransitionValues transitionValues) {
+        int targetId = transitionValues.view.getId();
+        if (isValidTarget(transitionValues.view, targetId)) {
+            for (TransitionPort childTransition : mTransitions) {
+                if (childTransition.isValidTarget(transitionValues.view, targetId)) {
+                    childTransition.captureStartValues(transitionValues);
+                }
+            }
+        }
+    }
+
+    @Override
+    public void captureEndValues(TransitionValues transitionValues) {
+        int targetId = transitionValues.view.getId();
+        if (isValidTarget(transitionValues.view, targetId)) {
+            for (TransitionPort childTransition : mTransitions) {
+                if (childTransition.isValidTarget(transitionValues.view, targetId)) {
+                    childTransition.captureEndValues(transitionValues);
+                }
+            }
+        }
+    }
+
+    /** @hide */
+    @Override
+    public void pause() {
+        super.pause();
+        int numTransitions = mTransitions.size();
+        for (int i = 0; i < numTransitions; ++i) {
+            mTransitions.get(i).pause();
+        }
+    }
+
+    /** @hide */
+    @Override
+    public void resume() {
+        super.resume();
+        int numTransitions = mTransitions.size();
+        for (int i = 0; i < numTransitions; ++i) {
+            mTransitions.get(i).resume();
+        }
+    }
+
+    /** @hide */
+    @Override
+    protected void cancel() {
+        super.cancel();
+        int numTransitions = mTransitions.size();
+        for (int i = 0; i < numTransitions; ++i) {
+            mTransitions.get(i).cancel();
+        }
+    }
+
+    @Override
+    TransitionSetPort setSceneRoot(ViewGroup sceneRoot) {
+        super.setSceneRoot(sceneRoot);
+        int numTransitions = mTransitions.size();
+        for (int i = 0; i < numTransitions; ++i) {
+            mTransitions.get(i).setSceneRoot(sceneRoot);
+        }
+        return (TransitionSetPort) this;
+    }
+
+    @Override
+    void setCanRemoveViews(boolean canRemoveViews) {
+        super.setCanRemoveViews(canRemoveViews);
+        int numTransitions = mTransitions.size();
+        for (int i = 0; i < numTransitions; ++i) {
+            mTransitions.get(i).setCanRemoveViews(canRemoveViews);
+        }
+    }
+
+    @Override
+    String toString(String indent) {
+        String result = super.toString(indent);
+        for (int i = 0; i < mTransitions.size(); ++i) {
+            result += "\n" + mTransitions.get(i).toString(indent + "  ");
+        }
+        return result;
+    }
+
+    @Override
+    public TransitionSetPort clone() {
+        TransitionSetPort clone = (TransitionSetPort) super.clone();
+        clone.mTransitions = new ArrayList<TransitionPort>();
+        int numTransitions = mTransitions.size();
+        for (int i = 0; i < numTransitions; ++i) {
+            clone.addTransition((TransitionPort) mTransitions.get(i).clone());
+        }
+        return clone;
+    }
+
+    /**
+     * This listener is used to detect when all child transitions are done, at
+     * which point this transition set is also done.
+     */
+    static class TransitionSetListener extends TransitionListenerAdapter {
+
+        TransitionSetPort mTransitionSet;
+
+        TransitionSetListener(TransitionSetPort transitionSet) {
+            mTransitionSet = transitionSet;
+        }
+
+        @Override
+        public void onTransitionStart(TransitionPort transition) {
+            if (!mTransitionSet.mStarted) {
+                mTransitionSet.start();
+                mTransitionSet.mStarted = true;
+            }
+        }
+
+        @Override
+        public void onTransitionEnd(TransitionPort transition) {
+            --mTransitionSet.mCurrentListeners;
+            if (mTransitionSet.mCurrentListeners == 0) {
+                // All child trans
+                mTransitionSet.mStarted = false;
+                mTransitionSet.end();
+            }
+            transition.removeListener(this);
+        }
+    }
+
+}
diff --git a/transition/ics/android/support/transition/TransitionValuesMaps.java b/transition/ics/android/support/transition/TransitionValuesMaps.java
new file mode 100644
index 0000000..e1274ec
--- /dev/null
+++ b/transition/ics/android/support/transition/TransitionValuesMaps.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2016 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 android.support.transition;
+
+import android.support.v4.util.ArrayMap;
+import android.support.v4.util.LongSparseArray;
+import android.util.SparseArray;
+import android.view.View;
+
+class TransitionValuesMaps {
+
+    public ArrayMap<View, TransitionValues> viewValues = new ArrayMap<>();
+
+    public SparseArray<TransitionValues> idValues = new SparseArray<>();
+
+    public LongSparseArray<TransitionValues> itemIdValues = new LongSparseArray<>();
+
+}
diff --git a/transition/ics/android/support/transition/ViewGroupOverlay.java b/transition/ics/android/support/transition/ViewGroupOverlay.java
new file mode 100644
index 0000000..07c9853
--- /dev/null
+++ b/transition/ics/android/support/transition/ViewGroupOverlay.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2016 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 android.support.transition;
+
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+import android.view.View;
+import android.view.ViewGroup;
+
+class ViewGroupOverlay extends ViewOverlay {
+
+    ViewGroupOverlay(Context context, ViewGroup hostView, View requestingView) {
+        super(context, hostView, requestingView);
+    }
+
+    public static ViewGroupOverlay createFrom(ViewGroup viewGroup) {
+        return (ViewGroupOverlay) ViewOverlay.createFrom(viewGroup);
+    }
+
+    /**
+     * Adds a View to the overlay. The bounds of the added view should be
+     * relative to the host view. Any view added to the overlay should be
+     * removed when it is no longer needed or no longer visible.
+     *
+     * <p>Views in the overlay are visual-only; they do not receive input
+     * events and do not participate in focus traversal. Overlay views
+     * are intended to be transient, such as might be needed by a temporary
+     * animation effect.</p>
+     *
+     * <p>If the view has a parent, the view will be removed from that parent
+     * before being added to the overlay. Also, if that parent is attached
+     * in the current view hierarchy, the view will be repositioned
+     * such that it is in the same relative location inside the activity. For
+     * example, if the view's current parent lies 100 pixels to the right
+     * and 200 pixels down from the origin of the overlay's
+     * host view, then the view will be offset by (100, 200).</p>
+     *
+     * @param view The View to be added to the overlay. The added view will be
+     *             drawn when the overlay is drawn.
+     * @see #remove(View)
+     * @see android.view.ViewOverlay#add(Drawable)
+     */
+    public void add(View view) {
+        mOverlayViewGroup.add(view);
+    }
+
+    /**
+     * Removes the specified View from the overlay.
+     *
+     * @param view The View to be removed from the overlay.
+     * @see #add(View)
+     * @see android.view.ViewOverlay#remove(Drawable)
+     */
+    public void remove(View view) {
+        mOverlayViewGroup.remove(view);
+    }
+}
diff --git a/transition/ics/android/support/transition/ViewOverlay.java b/transition/ics/android/support/transition/ViewOverlay.java
new file mode 100644
index 0000000..995479f
--- /dev/null
+++ b/transition/ics/android/support/transition/ViewOverlay.java
@@ -0,0 +1,366 @@
+/*
+ * Copyright (C) 2016 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 android.support.transition;
+
+import android.R;
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.ViewParent;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+
+class ViewOverlay {
+
+    /**
+     * The actual container for the drawables (and views, if it's a ViewGroupOverlay).
+     * All of the management and rendering details for the overlay are handled in
+     * OverlayViewGroup.
+     */
+    protected OverlayViewGroup mOverlayViewGroup;
+
+    ViewOverlay(Context context, ViewGroup hostView, View requestingView) {
+        mOverlayViewGroup = new OverlayViewGroup(context, hostView, requestingView, this);
+    }
+
+    static ViewGroup getContentView(View view) {
+        View parent = view;
+        while (parent != null) {
+            if (parent.getId() == R.id.content && parent instanceof ViewGroup) {
+                return (ViewGroup) parent;
+            }
+            if (parent.getParent() instanceof ViewGroup) {
+                parent = (ViewGroup) parent.getParent();
+            }
+        }
+        return null;
+    }
+
+    public static ViewOverlay createFrom(View view) {
+        ViewGroup contentView = getContentView(view);
+        if (contentView != null) {
+            final int numChildren = contentView.getChildCount();
+            for (int i = 0; i < numChildren; ++i) {
+                View child = contentView.getChildAt(i);
+                if (child instanceof OverlayViewGroup) {
+                    return ((OverlayViewGroup) child).mViewOverlay;
+                }
+            }
+            return new ViewGroupOverlay(contentView.getContext(), contentView, view);
+        }
+        return null;
+    }
+
+    /**
+     * Used internally by View and ViewGroup to handle drawing and invalidation
+     * of the overlay
+     */
+    ViewGroup getOverlayView() {
+        return mOverlayViewGroup;
+    }
+
+    /**
+     * Adds a Drawable to the overlay. The bounds of the drawable should be relative to
+     * the host view. Any drawable added to the overlay should be removed when it is no longer
+     * needed or no longer visible.
+     *
+     * @param drawable The Drawable to be added to the overlay. This drawable will be
+     *                 drawn when the view redraws its overlay.
+     * @see #remove(Drawable)
+     */
+    public void add(Drawable drawable) {
+        mOverlayViewGroup.add(drawable);
+    }
+
+    /**
+     * Removes the specified Drawable from the overlay.
+     *
+     * @param drawable The Drawable to be removed from the overlay.
+     * @see #add(Drawable)
+     */
+    public void remove(Drawable drawable) {
+        mOverlayViewGroup.remove(drawable);
+    }
+
+    /**
+     * Removes all content from the overlay.
+     */
+    public void clear() {
+        mOverlayViewGroup.clear();
+    }
+
+    boolean isEmpty() {
+        return mOverlayViewGroup.isEmpty();
+    }
+
+    /**
+     * OverlayViewGroup is a container that View and ViewGroup use to host
+     * drawables and views added to their overlays  ({@link ViewOverlay} and
+     * {@link ViewGroupOverlay}, respectively). Drawables are added to the overlay
+     * via the add/remove methods in ViewOverlay, Views are added/removed via
+     * ViewGroupOverlay. These drawable and view objects are
+     * drawn whenever the view itself is drawn; first the view draws its own
+     * content (and children, if it is a ViewGroup), then it draws its overlay
+     * (if it has one).
+     *
+     * <p>Besides managing and drawing the list of drawables, this class serves
+     * two purposes:
+     * (1) it noops layout calls because children are absolutely positioned and
+     * (2) it forwards all invalidation calls to its host view. The invalidation
+     * redirect is necessary because the overlay is not a child of the host view
+     * and invalidation cannot therefore follow the normal path up through the
+     * parent hierarchy.</p>
+     *
+     * @see View#getOverlay()
+     * @see ViewGroup#getOverlay()
+     */
+    static class OverlayViewGroup extends ViewGroup {
+
+        static Method sInvalidateChildInParentFastMethod;
+
+        static {
+            try {
+                sInvalidateChildInParentFastMethod = ViewGroup.class.getDeclaredMethod(
+                        "invalidateChildInParentFast", int.class, int.class, Rect.class);
+            } catch (NoSuchMethodException e) {
+            }
+
+        }
+
+        /**
+         * The View for which this is an overlay. Invalidations of the overlay are redirected to
+         * this host view.
+         */
+        ViewGroup mHostView;
+        View mRequestingView;
+        /**
+         * The set of drawables to draw when the overlay is rendered.
+         */
+        ArrayList<Drawable> mDrawables = null;
+        /**
+         * Reference to the hosting overlay object
+         */
+        ViewOverlay mViewOverlay;
+
+        OverlayViewGroup(Context context, ViewGroup hostView, View requestingView,
+                ViewOverlay viewOverlay) {
+            super(context);
+            mHostView = hostView;
+            mRequestingView = requestingView;
+            setRight(hostView.getWidth());
+            setBottom(hostView.getHeight());
+            ((ViewGroup) hostView).addView(this);
+            mViewOverlay = viewOverlay;
+        }
+
+        @Override
+        public boolean dispatchTouchEvent(MotionEvent ev) {
+            // Intercept and noop all touch events - overlays do not allow touch events
+            return false;
+        }
+
+        public void add(Drawable drawable) {
+            if (mDrawables == null) {
+
+                mDrawables = new ArrayList<Drawable>();
+            }
+            if (!mDrawables.contains(drawable)) {
+                // Make each drawable unique in the overlay; can't add it more than once
+                mDrawables.add(drawable);
+                invalidate(drawable.getBounds());
+                drawable.setCallback(this);
+            }
+        }
+
+        public void remove(Drawable drawable) {
+            if (mDrawables != null) {
+                mDrawables.remove(drawable);
+                invalidate(drawable.getBounds());
+                drawable.setCallback(null);
+            }
+        }
+
+        @Override
+        protected boolean verifyDrawable(Drawable who) {
+            return super.verifyDrawable(who) || (mDrawables != null && mDrawables.contains(who));
+        }
+
+        public void add(View child) {
+            if (child.getParent() instanceof ViewGroup) {
+                ViewGroup parent = (ViewGroup) child.getParent();
+                if (parent != mHostView && parent.getParent() != null) {// &&
+//                        parent.isAttachedToWindow()) {
+                    // Moving to different container; figure out how to position child such that
+                    // it is in the same location on the screen
+                    int[] parentLocation = new int[2];
+                    int[] hostViewLocation = new int[2];
+                    parent.getLocationOnScreen(parentLocation);
+                    mHostView.getLocationOnScreen(hostViewLocation);
+                    child.offsetLeftAndRight(parentLocation[0] - hostViewLocation[0]);
+                    child.offsetTopAndBottom(parentLocation[1] - hostViewLocation[1]);
+                }
+                parent.removeView(child);
+//                if (parent.getLayoutTransition() != null) {
+//                    // LayoutTransition will cause the child to delay removal - cancel it
+//                    parent.getLayoutTransition().cancel(LayoutTransition.DISAPPEARING);
+//                }
+                // fail-safe if view is still attached for any reason
+                if (child.getParent() != null) {
+                    parent.removeView(child);
+                }
+            }
+            super.addView(child, getChildCount() - 1);
+        }
+
+        public void remove(View view) {
+            super.removeView(view);
+            if (isEmpty()) {
+                mHostView.removeView(this);
+            }
+        }
+
+        public void clear() {
+            removeAllViews();
+            if (mDrawables != null) {
+                mDrawables.clear();
+            }
+        }
+
+        boolean isEmpty() {
+            if (getChildCount() == 0 &&
+                    (mDrawables == null || mDrawables.size() == 0)) {
+                return true;
+            }
+            return false;
+        }
+
+        @Override
+        public void invalidateDrawable(Drawable drawable) {
+            invalidate(drawable.getBounds());
+        }
+
+        @Override
+        protected void dispatchDraw(Canvas canvas) {
+            int[] contentViewLocation = new int[2];
+            int[] hostViewLocation = new int[2];
+            ViewGroup parent = (ViewGroup) getParent();
+            mHostView.getLocationOnScreen(contentViewLocation);
+            mRequestingView.getLocationOnScreen(hostViewLocation);
+            canvas.translate(hostViewLocation[0] - contentViewLocation[0],
+                    hostViewLocation[1] - contentViewLocation[1]);
+            canvas.clipRect(
+                    new Rect(0, 0, mRequestingView.getWidth(), mRequestingView.getHeight()));
+            super.dispatchDraw(canvas);
+            final int numDrawables = (mDrawables == null) ? 0 : mDrawables.size();
+            for (int i = 0; i < numDrawables; ++i) {
+                mDrawables.get(i).draw(canvas);
+            }
+        }
+
+        @Override
+        protected void onLayout(boolean changed, int l, int t, int r, int b) {
+            // Noop: children are positioned absolutely
+        }
+
+        /*
+         The following invalidation overrides exist for the purpose of redirecting invalidation to
+         the host view. The overlay is not parented to the host view (since a View cannot be a
+         parent), so the invalidation cannot proceed through the normal parent hierarchy.
+         There is a built-in assumption that the overlay exactly covers the host view, therefore
+         the invalidation rectangles received do not need to be adjusted when forwarded to
+         the host view.
+         */
+
+        private void getOffset(int[] offset) {
+            int[] contentViewLocation = new int[2];
+            int[] hostViewLocation = new int[2];
+            ViewGroup parent = (ViewGroup) getParent();
+            mHostView.getLocationOnScreen(contentViewLocation);
+            mRequestingView.getLocationOnScreen(hostViewLocation);
+            offset[0] = hostViewLocation[0] - contentViewLocation[0];
+            offset[1] = hostViewLocation[1] - contentViewLocation[1];
+        }
+
+        public void invalidateChildFast(View child, final Rect dirty) {
+            if (mHostView != null) {
+                // Note: This is not a "fast" invalidation. Would be nice to instead invalidate
+                // using DisplayList properties and a dirty rect instead of causing a real
+                // invalidation of the host view
+                int left = child.getLeft();
+                int top = child.getTop();
+                int[] offset = new int[2];
+                getOffset(offset);
+                // TODO: implement transforms
+//                if (!child.getMatrix().isIdentity()) {
+//                    child.transformRect(dirty);
+//                }
+                dirty.offset(left + offset[0], top + offset[1]);
+                mHostView.invalidate(dirty);
+            }
+        }
+
+        /**
+         * @hide
+         */
+        protected ViewParent invalidateChildInParentFast(int left, int top, Rect dirty) {
+            if (mHostView instanceof ViewGroup && sInvalidateChildInParentFastMethod != null) {
+                try {
+                    int[] offset = new int[2];
+                    getOffset(offset);
+                    sInvalidateChildInParentFastMethod.invoke(mHostView, left, top, dirty);
+                } catch (IllegalAccessException e) {
+                    e.printStackTrace();
+                } catch (InvocationTargetException e) {
+                    e.printStackTrace();
+                }
+            }
+            return null;
+        }
+
+        @Override
+        public ViewParent invalidateChildInParent(int[] location, Rect dirty) {
+            if (mHostView != null) {
+                dirty.offset(location[0], location[1]);
+                if (mHostView instanceof ViewGroup) {
+                    location[0] = 0;
+                    location[1] = 0;
+                    int[] offset = new int[2];
+                    getOffset(offset);
+                    dirty.offset(offset[0], offset[1]);
+                    return super.invalidateChildInParent(location, dirty);
+//                    return ((ViewGroup) mHostView).invalidateChildInParent(location, dirty);
+                } else {
+                    invalidate(dirty);
+                }
+            }
+            return null;
+        }
+
+        static class TouchInterceptor extends View {
+            TouchInterceptor(Context context) {
+                super(context);
+            }
+        }
+    }
+
+}
diff --git a/transition/ics/android/support/transition/VisibilityPort.java b/transition/ics/android/support/transition/VisibilityPort.java
new file mode 100644
index 0000000..afbf6fe
--- /dev/null
+++ b/transition/ics/android/support/transition/VisibilityPort.java
@@ -0,0 +1,230 @@
+/*
+ * Copyright (C) 2016 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 android.support.transition;
+
+import android.animation.Animator;
+import android.view.View;
+import android.view.ViewGroup;
+
+/**
+ * This transition tracks changes to the visibility of target views in the
+ * start and end scenes. Visibility is determined not just by the
+ * {@link View#setVisibility(int)} state of views, but also whether
+ * views exist in the current view hierarchy. The class is intended to be a
+ * utility for subclasses such as {@link FadePort}, which use this visibility
+ * information to determine the specific animations to run when visibility
+ * changes occur. Subclasses should implement one or both of the methods
+ * {@link #onAppear(ViewGroup, TransitionValues, int, TransitionValues, int)},
+ * {@link #onDisappear(ViewGroup, TransitionValues, int, TransitionValues, int)},
+ */
+abstract class VisibilityPort extends TransitionPort {
+
+    private static final String PROPNAME_VISIBILITY = "android:visibility:visibility";
+
+    private static final String PROPNAME_PARENT = "android:visibility:parent";
+
+    private static final String[] sTransitionProperties = {
+            PROPNAME_VISIBILITY,
+            PROPNAME_PARENT,
+    };
+
+    @Override
+    public String[] getTransitionProperties() {
+        return sTransitionProperties;
+    }
+
+    private void captureValues(TransitionValues transitionValues) {
+        int visibility = transitionValues.view.getVisibility();
+        transitionValues.values.put(PROPNAME_VISIBILITY, visibility);
+        transitionValues.values.put(PROPNAME_PARENT, transitionValues.view.getParent());
+    }
+
+    @Override
+    public void captureStartValues(TransitionValues transitionValues) {
+        captureValues(transitionValues);
+    }
+
+    @Override
+    public void captureEndValues(TransitionValues transitionValues) {
+        captureValues(transitionValues);
+    }
+
+    /**
+     * Returns whether the view is 'visible' according to the given values
+     * object. This is determined by testing the same properties in the values
+     * object that are used to determine whether the object is appearing or
+     * disappearing in the {@link
+     * TransitionPort#createAnimator(ViewGroup, TransitionValues, TransitionValues)}
+     * method. This method can be called by, for example, subclasses that want
+     * to know whether the object is visible in the same way that Visibility
+     * determines it for the actual animation.
+     *
+     * @param values The TransitionValues object that holds the information by
+     *               which visibility is determined.
+     * @return True if the view reference by <code>values</code> is visible,
+     * false otherwise.
+     */
+    public boolean isVisible(TransitionValues values) {
+        if (values == null) {
+            return false;
+        }
+        int visibility = (Integer) values.values.get(PROPNAME_VISIBILITY);
+        View parent = (View) values.values.get(PROPNAME_PARENT);
+
+        return visibility == View.VISIBLE && parent != null;
+    }
+
+    private VisibilityInfo getVisibilityChangeInfo(TransitionValues startValues,
+            TransitionValues endValues) {
+        final VisibilityInfo visInfo = new VisibilityInfo();
+        visInfo.visibilityChange = false;
+        visInfo.fadeIn = false;
+        if (startValues != null) {
+            visInfo.startVisibility = (Integer) startValues.values.get(PROPNAME_VISIBILITY);
+            visInfo.startParent = (ViewGroup) startValues.values.get(PROPNAME_PARENT);
+        } else {
+            visInfo.startVisibility = -1;
+            visInfo.startParent = null;
+        }
+        if (endValues != null) {
+            visInfo.endVisibility = (Integer) endValues.values.get(PROPNAME_VISIBILITY);
+            visInfo.endParent = (ViewGroup) endValues.values.get(PROPNAME_PARENT);
+        } else {
+            visInfo.endVisibility = -1;
+            visInfo.endParent = null;
+        }
+        if (startValues != null && endValues != null) {
+            if (visInfo.startVisibility == visInfo.endVisibility &&
+                    visInfo.startParent == visInfo.endParent) {
+                return visInfo;
+            } else {
+                if (visInfo.startVisibility != visInfo.endVisibility) {
+                    if (visInfo.startVisibility == View.VISIBLE) {
+                        visInfo.fadeIn = false;
+                        visInfo.visibilityChange = true;
+                    } else if (visInfo.endVisibility == View.VISIBLE) {
+                        visInfo.fadeIn = true;
+                        visInfo.visibilityChange = true;
+                    }
+                    // no visibilityChange if going between INVISIBLE and GONE
+                } else if (visInfo.startParent != visInfo.endParent) {
+                    if (visInfo.endParent == null) {
+                        visInfo.fadeIn = false;
+                        visInfo.visibilityChange = true;
+                    } else if (visInfo.startParent == null) {
+                        visInfo.fadeIn = true;
+                        visInfo.visibilityChange = true;
+                    }
+                }
+            }
+        }
+        if (startValues == null) {
+            visInfo.fadeIn = true;
+            visInfo.visibilityChange = true;
+        } else if (endValues == null) {
+            visInfo.fadeIn = false;
+            visInfo.visibilityChange = true;
+        }
+        return visInfo;
+    }
+
+    @Override
+    public Animator createAnimator(ViewGroup sceneRoot, TransitionValues startValues,
+            TransitionValues endValues) {
+        VisibilityInfo visInfo = getVisibilityChangeInfo(startValues, endValues);
+        if (visInfo.visibilityChange) {
+            // Only transition views that are either targets of this transition
+            // or whose parent hierarchies remain stable between scenes
+            boolean isTarget = false;
+            if (mTargets.size() > 0 || mTargetIds.size() > 0) {
+                View startView = startValues != null ? startValues.view : null;
+                View endView = endValues != null ? endValues.view : null;
+                int startId = startView != null ? startView.getId() : -1;
+                int endId = endView != null ? endView.getId() : -1;
+                isTarget = isValidTarget(startView, startId) || isValidTarget(endView, endId);
+            }
+            if (isTarget || ((visInfo.startParent != null || visInfo.endParent != null))) {
+                if (visInfo.fadeIn) {
+                    return onAppear(sceneRoot, startValues, visInfo.startVisibility,
+                            endValues, visInfo.endVisibility);
+                } else {
+                    return onDisappear(sceneRoot, startValues, visInfo.startVisibility,
+                            endValues, visInfo.endVisibility
+                    );
+                }
+            }
+        }
+        return null;
+    }
+
+    /**
+     * The default implementation of this method does nothing. Subclasses
+     * should override if they need to create an Animator when targets appear.
+     * The method should only be called by the Visibility class; it is
+     * not intended to be called from external classes.
+     *
+     * @param sceneRoot       The root of the transition hierarchy
+     * @param startValues     The target values in the start scene
+     * @param startVisibility The target visibility in the start scene
+     * @param endValues       The target values in the end scene
+     * @param endVisibility   The target visibility in the end scene
+     * @return An Animator to be started at the appropriate time in the
+     * overall transition for this scene change. A null value means no animation
+     * should be run.
+     */
+    public Animator onAppear(ViewGroup sceneRoot,
+            TransitionValues startValues, int startVisibility,
+            TransitionValues endValues, int endVisibility) {
+        return null;
+    }
+
+    /**
+     * The default implementation of this method does nothing. Subclasses
+     * should override if they need to create an Animator when targets disappear.
+     * The method should only be called by the Visibility class; it is
+     * not intended to be called from external classes.
+     *
+     * @param sceneRoot       The root of the transition hierarchy
+     * @param startValues     The target values in the start scene
+     * @param startVisibility The target visibility in the start scene
+     * @param endValues       The target values in the end scene
+     * @param endVisibility   The target visibility in the end scene
+     * @return An Animator to be started at the appropriate time in the
+     * overall transition for this scene change. A null value means no animation
+     * should be run.
+     */
+    public Animator onDisappear(ViewGroup sceneRoot,
+            TransitionValues startValues, int startVisibility,
+            TransitionValues endValues, int endVisibility) {
+        return null;
+    }
+
+    private static class VisibilityInfo {
+
+        boolean visibilityChange;
+
+        boolean fadeIn;
+
+        int startVisibility;
+
+        int endVisibility;
+
+        ViewGroup startParent;
+
+        ViewGroup endParent;
+    }
+}
diff --git a/transition/kitkat/android/support/transition/ChangeBoundsKitKat.java b/transition/kitkat/android/support/transition/ChangeBoundsKitKat.java
new file mode 100644
index 0000000..3f453ab
--- /dev/null
+++ b/transition/kitkat/android/support/transition/ChangeBoundsKitKat.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2016 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 android.support.transition;
+
+class ChangeBoundsKitKat extends TransitionKitKat {
+
+    public ChangeBoundsKitKat(TransitionInterface transition) {
+        init(transition, new android.transition.ChangeBounds());
+    }
+
+}
diff --git a/transition/kitkat/android/support/transition/FadeKitKat.java b/transition/kitkat/android/support/transition/FadeKitKat.java
new file mode 100644
index 0000000..0e378fd
--- /dev/null
+++ b/transition/kitkat/android/support/transition/FadeKitKat.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2016 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 android.support.transition;
+
+class FadeKitKat extends TransitionKitKat {
+
+    public FadeKitKat(TransitionInterface transition) {
+        init(transition, new android.transition.Fade());
+    }
+
+    public FadeKitKat(TransitionInterface transition, int fadingMode) {
+        init(transition, new android.transition.Fade(fadingMode));
+    }
+
+}
diff --git a/transition/kitkat/android/support/transition/SceneKitKat.java b/transition/kitkat/android/support/transition/SceneKitKat.java
new file mode 100644
index 0000000..7f7eeaf
--- /dev/null
+++ b/transition/kitkat/android/support/transition/SceneKitKat.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2016 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 android.support.transition;
+
+import android.view.View;
+import android.view.ViewGroup;
+
+class SceneKitKat extends SceneImpl {
+
+    /* package */ android.transition.Scene mScene;
+
+    @Override
+    public void init(ViewGroup sceneRoot) {
+        mScene = new android.transition.Scene(sceneRoot);
+    }
+
+    @Override
+    public void init(ViewGroup sceneRoot, View layout) {
+        // TODO: The passed View might not be a ViewGroup
+        // TODO: Override this and remove cast on Lollipop and later
+        mScene = new android.transition.Scene(sceneRoot, (ViewGroup) layout);
+    }
+
+    @Override
+    public void enter() {
+        mScene.enter();
+    }
+
+    @Override
+    public void exit() {
+        mScene.exit();
+    }
+
+    @Override
+    public ViewGroup getSceneRoot() {
+        return mScene.getSceneRoot();
+    }
+
+    @Override
+    public void setEnterAction(Runnable action) {
+        mScene.setEnterAction(action);
+    }
+
+    @Override
+    public void setExitAction(Runnable action) {
+        mScene.setExitAction(action);
+    }
+
+}
diff --git a/transition/kitkat/android/support/transition/SceneStaticsKitKat.java b/transition/kitkat/android/support/transition/SceneStaticsKitKat.java
new file mode 100644
index 0000000..b6e3659
--- /dev/null
+++ b/transition/kitkat/android/support/transition/SceneStaticsKitKat.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2016 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 android.support.transition;
+
+import android.content.Context;
+import android.view.ViewGroup;
+
+class SceneStaticsKitKat extends SceneStaticsImpl {
+
+    @Override
+    public SceneImpl getSceneForLayout(ViewGroup sceneRoot, int layoutId, Context context) {
+        SceneKitKat scene = new SceneKitKat();
+        scene.mScene = android.transition.Scene.getSceneForLayout(sceneRoot, layoutId, context);
+        return scene;
+    }
+
+}
diff --git a/transition/kitkat/android/support/transition/TransitionKitKat.java b/transition/kitkat/android/support/transition/TransitionKitKat.java
new file mode 100644
index 0000000..da31d53
--- /dev/null
+++ b/transition/kitkat/android/support/transition/TransitionKitKat.java
@@ -0,0 +1,358 @@
+/*
+ * Copyright (C) 2016 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 android.support.transition;
+
+import android.animation.Animator;
+import android.animation.TimeInterpolator;
+import android.transition.Transition;
+import android.view.View;
+import android.view.ViewGroup;
+
+import java.util.ArrayList;
+import java.util.List;
+
+class TransitionKitKat extends TransitionImpl {
+
+    /* package */ android.transition.Transition mTransition;
+
+    private TransitionInterface mExternalTransition;
+
+    private CompatListener mCompatListener;
+
+    private static void copyValues(android.transition.TransitionValues source,
+            android.support.transition.TransitionValues dest) {
+        if (source == null) {
+            return;
+        }
+        dest.view = source.view;
+        if (source.values.size() > 0) {
+            dest.values.putAll(source.values);
+        }
+    }
+
+    private static void copyValues(android.support.transition.TransitionValues source,
+            android.transition.TransitionValues dest) {
+        if (source == null) {
+            return;
+        }
+        dest.view = source.view;
+        if (source.values.size() > 0) {
+            dest.values.putAll(source.values);
+        }
+    }
+
+    @Override
+    public void init(TransitionInterface external, Object internal) {
+        mExternalTransition = external;
+        if (internal == null) {
+            mTransition = new TransitionWrapper(external);
+        } else {
+            mTransition = (android.transition.Transition) internal;
+        }
+    }
+
+    @Override
+    public TransitionImpl addListener(TransitionInterfaceListener listener) {
+        if (mCompatListener == null) {
+            mCompatListener = new CompatListener();
+            mTransition.addListener(mCompatListener);
+        }
+        mCompatListener.addListener(listener);
+        return this;
+    }
+
+    @Override
+    public TransitionImpl removeListener(TransitionInterfaceListener listener) {
+        if (mCompatListener == null) {
+            return this;
+        }
+        mCompatListener.removeListener(listener);
+        if (mCompatListener.isEmpty()) {
+            mTransition.removeListener(mCompatListener);
+            mCompatListener = null;
+        }
+        return this;
+    }
+
+    @Override
+    public TransitionImpl addTarget(View target) {
+        mTransition.addTarget(target);
+        return this;
+    }
+
+    @Override
+    public TransitionImpl addTarget(int targetId) {
+        mTransition.addTarget(targetId);
+        return this;
+    }
+
+    @Override
+    public void captureEndValues(TransitionValues transitionValues) {
+        android.transition.TransitionValues internalValues =
+                new android.transition.TransitionValues();
+        copyValues(transitionValues, internalValues);
+        mTransition.captureEndValues(internalValues);
+        copyValues(internalValues, transitionValues);
+    }
+
+    @Override
+    public void captureStartValues(TransitionValues transitionValues) {
+        android.transition.TransitionValues internalValues =
+                new android.transition.TransitionValues();
+        copyValues(transitionValues, internalValues);
+        mTransition.captureStartValues(internalValues);
+        copyValues(internalValues, transitionValues);
+    }
+
+    @Override
+    public Animator createAnimator(ViewGroup sceneRoot, TransitionValues startValues,
+            TransitionValues endValues) {
+        android.transition.TransitionValues internalStartValues;
+        android.transition.TransitionValues internalEndValues;
+        if (startValues != null) {
+            internalStartValues = new android.transition.TransitionValues();
+            copyValues(startValues, internalStartValues);
+        } else {
+            internalStartValues = null;
+        }
+        if (endValues != null) {
+            internalEndValues = new android.transition.TransitionValues();
+            copyValues(endValues, internalEndValues);
+        } else {
+            internalEndValues = null;
+        }
+        return mTransition.createAnimator(sceneRoot, internalStartValues, internalEndValues);
+    }
+
+    @Override
+    public TransitionImpl excludeChildren(View target, boolean exclude) {
+        mTransition.excludeChildren(target, exclude);
+        return this;
+    }
+
+    @Override
+    public TransitionImpl excludeChildren(int targetId, boolean exclude) {
+        mTransition.excludeChildren(targetId, exclude);
+        return this;
+    }
+
+    @Override
+    public TransitionImpl excludeChildren(Class type, boolean exclude) {
+        mTransition.excludeChildren(type, exclude);
+        return this;
+    }
+
+    @Override
+    public TransitionImpl excludeTarget(View target, boolean exclude) {
+        mTransition.excludeTarget(target, exclude);
+        return this;
+    }
+
+    @Override
+    public TransitionImpl excludeTarget(int targetId, boolean exclude) {
+        mTransition.excludeTarget(targetId, exclude);
+        return this;
+    }
+
+    @Override
+    public TransitionImpl excludeTarget(Class type, boolean exclude) {
+        mTransition.excludeTarget(type, exclude);
+        return this;
+    }
+
+    @Override
+    public long getDuration() {
+        return mTransition.getDuration();
+    }
+
+    @Override
+    public TransitionImpl setDuration(long duration) {
+        mTransition.setDuration(duration);
+        return this;
+    }
+
+    @Override
+    public TimeInterpolator getInterpolator() {
+        return mTransition.getInterpolator();
+    }
+
+    @Override
+    public TransitionImpl setInterpolator(TimeInterpolator interpolator) {
+        mTransition.setInterpolator(interpolator);
+        return this;
+    }
+
+    @Override
+    public String getName() {
+        return mTransition.getName();
+    }
+
+    @Override
+    public long getStartDelay() {
+        return mTransition.getStartDelay();
+    }
+
+    @Override
+    public TransitionImpl setStartDelay(long startDelay) {
+        mTransition.setStartDelay(startDelay);
+        return this;
+    }
+
+    @Override
+    public List<Integer> getTargetIds() {
+        return mTransition.getTargetIds();
+    }
+
+    @Override
+    public List<View> getTargets() {
+        return mTransition.getTargets();
+    }
+
+    @Override
+    public String[] getTransitionProperties() {
+        return mTransition.getTransitionProperties();
+    }
+
+    @Override
+    public TransitionValues getTransitionValues(View view, boolean start) {
+        TransitionValues values = new TransitionValues();
+        copyValues(mTransition.getTransitionValues(view, start), values);
+        return values;
+    }
+
+    @Override
+    public TransitionImpl removeTarget(View target) {
+        mTransition.removeTarget(target);
+        return this;
+    }
+
+    @Override
+    public TransitionImpl removeTarget(int targetId) {
+        mTransition.removeTarget(targetId);
+        return this;
+    }
+
+    @Override
+    public String toString() {
+        return mTransition.toString();
+    }
+
+    private static class TransitionWrapper extends android.transition.Transition {
+
+        private TransitionInterface mTransition;
+
+        public TransitionWrapper(TransitionInterface transition) {
+            mTransition = transition;
+        }
+
+        @Override
+        public void captureStartValues(android.transition.TransitionValues transitionValues) {
+            android.support.transition.TransitionValues externalValues =
+                    new android.support.transition.TransitionValues();
+            copyValues(transitionValues, externalValues);
+            mTransition.captureStartValues(externalValues);
+            copyValues(externalValues, transitionValues);
+        }
+
+        @Override
+        public void captureEndValues(android.transition.TransitionValues transitionValues) {
+            android.support.transition.TransitionValues externalValues =
+                    new android.support.transition.TransitionValues();
+            copyValues(transitionValues, externalValues);
+            mTransition.captureEndValues(externalValues);
+            copyValues(externalValues, transitionValues);
+        }
+
+        @Override
+        public Animator createAnimator(ViewGroup sceneRoot,
+                android.transition.TransitionValues startValues,
+                android.transition.TransitionValues endValues) {
+            android.support.transition.TransitionValues externalStartValues;
+            android.support.transition.TransitionValues externalEndValues;
+            if (startValues != null) {
+                externalStartValues = new android.support.transition.TransitionValues();
+                copyValues(startValues, externalStartValues);
+            } else {
+                externalStartValues = null;
+            }
+            if (endValues != null) {
+                externalEndValues = new android.support.transition.TransitionValues();
+                copyValues(endValues, externalEndValues);
+            } else {
+                externalEndValues = null;
+            }
+            return mTransition.createAnimator(sceneRoot, externalStartValues,
+                    externalEndValues);
+        }
+
+    }
+
+    @SuppressWarnings("unchecked")
+    private class CompatListener implements android.transition.Transition.TransitionListener {
+
+        private final ArrayList<TransitionInterfaceListener> mListeners = new ArrayList<>();
+
+        private void addListener(TransitionInterfaceListener listener) {
+            mListeners.add(listener);
+        }
+
+        private void removeListener(TransitionInterfaceListener listener) {
+            mListeners.remove(listener);
+        }
+
+        private boolean isEmpty() {
+            return mListeners.isEmpty();
+        }
+
+        @Override
+        public void onTransitionStart(Transition transition) {
+            for (TransitionInterfaceListener listener : mListeners) {
+                listener.onTransitionStart(mExternalTransition);
+            }
+        }
+
+        @Override
+        public void onTransitionEnd(Transition transition) {
+            for (TransitionInterfaceListener listener : mListeners) {
+                listener.onTransitionEnd(mExternalTransition);
+            }
+        }
+
+        @Override
+        public void onTransitionCancel(Transition transition) {
+            for (TransitionInterfaceListener listener : mListeners) {
+                listener.onTransitionCancel(mExternalTransition);
+            }
+        }
+
+        @Override
+        public void onTransitionPause(Transition transition) {
+            for (TransitionInterfaceListener listener : mListeners) {
+                listener.onTransitionPause(mExternalTransition);
+            }
+        }
+
+        @Override
+        public void onTransitionResume(Transition transition) {
+            for (TransitionInterfaceListener listener : mListeners) {
+                listener.onTransitionResume(mExternalTransition);
+            }
+        }
+
+    }
+
+}
diff --git a/transition/kitkat/android/support/transition/TransitionManagerKitKat.java b/transition/kitkat/android/support/transition/TransitionManagerKitKat.java
new file mode 100644
index 0000000..a885901
--- /dev/null
+++ b/transition/kitkat/android/support/transition/TransitionManagerKitKat.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2016 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 android.support.transition;
+
+import android.transition.TransitionManager;
+
+class TransitionManagerKitKat extends TransitionManagerImpl {
+
+    private final android.transition.TransitionManager mTransitionManager = new TransitionManager();
+
+    @Override
+    public void setTransition(SceneImpl scene, TransitionImpl transition) {
+        mTransitionManager.setTransition(((SceneKitKat) scene).mScene,
+                transition == null ? null : ((TransitionKitKat) transition).mTransition);
+    }
+
+    @Override
+    public void setTransition(SceneImpl fromScene, SceneImpl toScene, TransitionImpl transition) {
+        mTransitionManager.setTransition(((SceneKitKat) fromScene).mScene,
+                ((SceneKitKat) toScene).mScene,
+                transition == null ? null : ((TransitionKitKat) transition).mTransition);
+    }
+
+    @Override
+    public void transitionTo(SceneImpl scene) {
+        mTransitionManager.transitionTo(((SceneKitKat) scene).mScene);
+    }
+
+}
diff --git a/transition/kitkat/android/support/transition/TransitionManagerStaticsKitKat.java b/transition/kitkat/android/support/transition/TransitionManagerStaticsKitKat.java
new file mode 100644
index 0000000..084a4a7
--- /dev/null
+++ b/transition/kitkat/android/support/transition/TransitionManagerStaticsKitKat.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2016 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 android.support.transition;
+
+import android.view.ViewGroup;
+
+class TransitionManagerStaticsKitKat extends TransitionManagerStaticsImpl {
+
+    @Override
+    public void go(SceneImpl scene) {
+        android.transition.TransitionManager.go(((SceneKitKat) scene).mScene);
+    }
+
+    @Override
+    public void go(SceneImpl scene, TransitionImpl transition) {
+        android.transition.TransitionManager.go(((SceneKitKat) scene).mScene,
+                transition == null ? null : ((TransitionKitKat) transition).mTransition);
+    }
+
+    @Override
+    public void beginDelayedTransition(ViewGroup sceneRoot) {
+        android.transition.TransitionManager.beginDelayedTransition(sceneRoot);
+    }
+
+    @Override
+    public void beginDelayedTransition(ViewGroup sceneRoot, TransitionImpl transition) {
+        android.transition.TransitionManager.beginDelayedTransition(sceneRoot,
+                transition == null ? null : ((TransitionKitKat) transition).mTransition);
+    }
+
+}
diff --git a/transition/kitkat/android/support/transition/TransitionSetKitKat.java b/transition/kitkat/android/support/transition/TransitionSetKitKat.java
new file mode 100644
index 0000000..591df63
--- /dev/null
+++ b/transition/kitkat/android/support/transition/TransitionSetKitKat.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2016 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 android.support.transition;
+
+class TransitionSetKitKat extends TransitionKitKat implements TransitionSetImpl {
+
+    private android.transition.TransitionSet mTransitionSet;
+
+    public TransitionSetKitKat(TransitionInterface transition) {
+        mTransitionSet = new android.transition.TransitionSet();
+        init(transition, mTransitionSet);
+    }
+
+    @Override
+    public int getOrdering() {
+        return mTransitionSet.getOrdering();
+    }
+
+    @Override
+    public TransitionSetKitKat setOrdering(int ordering) {
+        mTransitionSet.setOrdering(ordering);
+        return this;
+    }
+
+    @Override
+    public TransitionSetKitKat addTransition(TransitionImpl transition) {
+        mTransitionSet.addTransition(((TransitionKitKat) transition).mTransition);
+        return this;
+    }
+
+    @Override
+    public TransitionSetKitKat removeTransition(TransitionImpl transition) {
+        mTransitionSet.removeTransition(((TransitionKitKat) transition).mTransition);
+        return this;
+    }
+
+}
diff --git a/transition/res/values/ids.xml b/transition/res/values/ids.xml
new file mode 100644
index 0000000..9a6846b
--- /dev/null
+++ b/transition/res/values/ids.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2016 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>
+    <item name="transition_scene_layoutid_cache" type="id"/>
+    <item name="transition_current_scene" type="id"/>
+</resources>
diff --git a/transition/src/android/support/transition/AutoTransition.java b/transition/src/android/support/transition/AutoTransition.java
new file mode 100644
index 0000000..ec0d404
--- /dev/null
+++ b/transition/src/android/support/transition/AutoTransition.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2016 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 android.support.transition;
+
+/**
+ * Utility class for creating a default transition that automatically fades,
+ * moves, and resizes views during a scene change.
+ *
+ * <p>Unlike the platform version, this does not support use in XML resources.</p>
+ */
+public class AutoTransition extends TransitionSet {
+
+    /**
+     * Constructs an AutoTransition object, which is a TransitionSet which
+     * first fades out disappearing targets, then moves and resizes existing
+     * targets, and finally fades in appearing targets.
+     */
+    public AutoTransition() {
+        setOrdering(ORDERING_SEQUENTIAL);
+        addTransition(new Fade(Fade.OUT)).
+                addTransition(new ChangeBounds()).
+                addTransition(new Fade(Fade.IN));
+    }
+
+}
diff --git a/transition/src/android/support/transition/ChangeBounds.java b/transition/src/android/support/transition/ChangeBounds.java
new file mode 100644
index 0000000..abed1c1
--- /dev/null
+++ b/transition/src/android/support/transition/ChangeBounds.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2016 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 android.support.transition;
+
+import android.animation.Animator;
+import android.os.Build;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.view.ViewGroup;
+
+/**
+ * This transition captures the layout bounds of target views before and after
+ * the scene change and animates those changes during the transition.
+ *
+ * <p>Unlike the platform version, this does not support use in XML resources.</p>
+ */
+public class ChangeBounds extends Transition {
+
+    public ChangeBounds() {
+        super(true);
+        if (Build.VERSION.SDK_INT < 19) {
+            mImpl = new ChangeBoundsIcs(this);
+        } else {
+            mImpl = new ChangeBoundsKitKat(this);
+        }
+    }
+
+    @Override
+    public void captureEndValues(@NonNull TransitionValues transitionValues) {
+        mImpl.captureEndValues(transitionValues);
+    }
+
+    @Override
+    public void captureStartValues(@NonNull TransitionValues transitionValues) {
+        mImpl.captureStartValues(transitionValues);
+    }
+
+    @Override
+    @Nullable
+    public Animator createAnimator(@NonNull ViewGroup sceneRoot,
+            @NonNull TransitionValues startValues, @NonNull TransitionValues endValues) {
+        return mImpl.createAnimator(sceneRoot, startValues, endValues);
+    }
+
+}
diff --git a/transition/src/android/support/transition/Fade.java b/transition/src/android/support/transition/Fade.java
new file mode 100644
index 0000000..efc71ea
--- /dev/null
+++ b/transition/src/android/support/transition/Fade.java
@@ -0,0 +1,117 @@
+/*
+ * Copyright (C) 2016 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 android.support.transition;
+
+import android.animation.Animator;
+import android.os.Build;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.view.View;
+import android.view.ViewGroup;
+
+/**
+ * This transition tracks changes to the visibility of target views in the
+ * start and end scenes and fades views in or out when they become visible
+ * or non-visible. Visibility is determined by both the
+ * {@link View#setVisibility(int)} state of the view as well as whether it
+ * is parented in the current view hierarchy.
+ *
+ * <p>The ability of this transition to fade out a particular view, and the
+ * way that that fading operation takes place, is based on
+ * the situation of the view in the view hierarchy. For example, if a view was
+ * simply removed from its parent, then the view will be added into a {@link
+ * android.view.ViewGroupOverlay} while fading. If a visible view is
+ * changed to be {@link View#GONE} or {@link View#INVISIBLE}, then the
+ * visibility will be changed to {@link View#VISIBLE} for the duration of
+ * the animation. However, if a view is in a hierarchy which is also altering
+ * its visibility, the situation can be more complicated. In general, if a
+ * view that is no longer in the hierarchy in the end scene still has a
+ * parent (so its parent hierarchy was removed, but it was not removed from
+ * its parent), then it will be left alone to avoid side-effects from
+ * improperly removing it from its parent. The only exception to this is if
+ * the previous {@link Scene} was
+ * {@link Scene#getSceneForLayout(android.view.ViewGroup, int, android.content.Context)
+ * created from a layout resource file}, then it is considered safe to un-parent
+ * the starting scene view in order to fade it out.</p>
+ *
+ * <p>Unlike the platform version, this does not support use in XML resources.</p>
+ */
+public class Fade extends Transition {
+
+    /**
+     * Fading mode used in {@link #Fade(int)} to make the transition
+     * operate on targets that are appearing. Maybe be combined with
+     * {@link #OUT} to fade both in and out.
+     */
+    public static final int IN = 0x1;
+
+    /**
+     * Fading mode used in {@link #Fade(int)} to make the transition
+     * operate on targets that are disappearing. Maybe be combined with
+     * {@link #IN} to fade both in and out.
+     */
+    public static final int OUT = 0x2;
+
+    /**
+     * Constructs a Fade transition that will fade targets in
+     * and/or out, according to the value of fadingMode.
+     *
+     * @param fadingMode The behavior of this transition, a combination of
+     *                   {@link #IN} and {@link #OUT}.
+     */
+    public Fade(int fadingMode) {
+        super(true);
+        if (Build.VERSION.SDK_INT < 19) {
+            if (fadingMode < 0) {
+                mImpl = new FadeIcs(this, fadingMode);
+            } else {
+                mImpl = new FadeIcs(this);
+            }
+        } else {
+            if (fadingMode < 0) {
+                mImpl = new FadeKitKat(this, fadingMode);
+            } else {
+                mImpl = new FadeKitKat(this);
+            }
+        }
+    }
+
+    /**
+     * Constructs a Fade transition that will fade targets in and out.
+     */
+    public Fade() {
+        this(-1);
+    }
+
+    @Override
+    public void captureEndValues(@NonNull TransitionValues transitionValues) {
+        mImpl.captureEndValues(transitionValues);
+    }
+
+    @Override
+    public void captureStartValues(@NonNull TransitionValues transitionValues) {
+        mImpl.captureStartValues(transitionValues);
+    }
+
+    @Override
+    @Nullable
+    public Animator createAnimator(@NonNull ViewGroup sceneRoot,
+            @NonNull TransitionValues startValues, @NonNull TransitionValues endValues) {
+        return mImpl.createAnimator(sceneRoot, startValues, endValues);
+    }
+
+}
diff --git a/transition/src/android/support/transition/Scene.java b/transition/src/android/support/transition/Scene.java
new file mode 100644
index 0000000..1fbff9e
--- /dev/null
+++ b/transition/src/android/support/transition/Scene.java
@@ -0,0 +1,204 @@
+/*
+ * Copyright (C) 2016 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 android.support.transition;
+
+import android.content.Context;
+import android.os.Build;
+import android.support.annotation.LayoutRes;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.util.SparseArray;
+import android.view.View;
+import android.view.ViewGroup;
+
+/**
+ * A scene represents the collection of values that various properties in the
+ * View hierarchy will have when the scene is applied. A Scene can be
+ * configured to automatically run a Transition when it is applied, which will
+ * animate the various property changes that take place during the
+ * scene change.
+ */
+public class Scene {
+
+    private static SceneStaticsImpl sImpl;
+
+    static {
+        if (Build.VERSION.SDK_INT < 19) {
+            sImpl = new SceneStaticsIcs();
+        } else {
+            sImpl = new SceneStaticsKitKat();
+        }
+    }
+
+    /* package */ SceneImpl mImpl;
+
+    /**
+     * Constructs a Scene with no information about how values will change
+     * when this scene is applied. This constructor might be used when
+     * a Scene is created with the intention of being dynamically configured,
+     * through setting {@link #setEnterAction(Runnable)} and possibly
+     * {@link #setExitAction(Runnable)}.
+     *
+     * @param sceneRoot The root of the hierarchy in which scene changes
+     *                  and transitions will take place.
+     */
+    public Scene(@NonNull ViewGroup sceneRoot) {
+        mImpl = createSceneImpl();
+        mImpl.init(sceneRoot);
+    }
+
+    /**
+     * Constructs a Scene which, when entered, will remove any
+     * children from the sceneRoot container and add the layout
+     * object as a new child of that container.
+     *
+     * @param sceneRoot The root of the hierarchy in which scene changes
+     *                  and transitions will take place.
+     * @param layout    The view hierarchy of this scene, added as a child
+     *                  of sceneRoot when this scene is entered.
+     */
+    public Scene(@NonNull ViewGroup sceneRoot, @NonNull View layout) {
+        mImpl = createSceneImpl();
+        mImpl.init(sceneRoot, layout);
+    }
+
+    private Scene(SceneImpl scene) {
+        mImpl = scene;
+    }
+
+    /**
+     * Returns a Scene described by the resource file associated with the given
+     * <code>layoutId</code> parameter. If such a Scene has already been created for
+     * the given <code>sceneRoot</code>, that same Scene will be returned.
+     * This caching of layoutId-based scenes enables sharing of common scenes
+     * between those created in code and those referenced by {@link TransitionManager}
+     * XML resource files.
+     *
+     * @param sceneRoot The root of the hierarchy in which scene changes
+     *                  and transitions will take place.
+     * @param layoutId  The id of a standard layout resource file.
+     * @param context   The context used in the process of inflating
+     *                  the layout resource.
+     * @return The scene for the given root and layout id
+     */
+    @NonNull
+    public static Scene getSceneForLayout(@NonNull ViewGroup sceneRoot, @LayoutRes int layoutId,
+            @NonNull Context context) {
+        @SuppressWarnings("unchecked")
+        SparseArray<Scene> scenes =
+                (SparseArray<Scene>) sceneRoot.getTag(R.id.transition_scene_layoutid_cache);
+        if (scenes == null) {
+            scenes = new SparseArray<>();
+            sceneRoot.setTag(R.id.transition_scene_layoutid_cache, scenes);
+        }
+        Scene scene = scenes.get(layoutId);
+        if (scene != null) {
+            return scene;
+        } else {
+            scene = new Scene(sImpl.getSceneForLayout(sceneRoot, layoutId, context));
+            scenes.put(layoutId, scene);
+            return scene;
+        }
+    }
+
+    private SceneImpl createSceneImpl() {
+        if (Build.VERSION.SDK_INT < 19) {
+            return new SceneIcs();
+        } else {
+            return new SceneKitKat();
+        }
+    }
+
+    /**
+     * Gets the root of the scene, which is the root of the view hierarchy
+     * affected by changes due to this scene, and which will be animated
+     * when this scene is entered.
+     *
+     * @return The root of the view hierarchy affected by this scene.
+     */
+    @NonNull
+    public ViewGroup getSceneRoot() {
+        return mImpl.getSceneRoot();
+    }
+
+    /**
+     * Exits this scene, if it is the current scene
+     * on the scene's {@link #getSceneRoot() scene root}. The current scene is
+     * set when {@link #enter() entering} a scene.
+     * Exiting a scene runs the {@link #setExitAction(Runnable) exit action}
+     * if there is one.
+     */
+    public void exit() {
+        mImpl.exit();
+    }
+
+    /**
+     * Enters this scene, which entails changing all values that
+     * are specified by this scene. These may be values associated
+     * with a layout view group or layout resource file which will
+     * now be added to the scene root, or it may be values changed by
+     * an {@link #setEnterAction(Runnable)} enter action}, or a
+     * combination of the these. No transition will be run when the
+     * scene is entered. To get transition behavior in scene changes,
+     * use one of the methods in {@link android.support.transition.TransitionManager} instead.
+     */
+    public void enter() {
+        mImpl.enter();
+    }
+
+    /**
+     * Scenes that are not defined with layout resources or
+     * hierarchies, or which need to perform additional steps
+     * after those hierarchies are changed to, should set an enter
+     * action, and possibly an exit action as well. An enter action
+     * will cause Scene to call back into application code to do
+     * anything else the application needs after transitions have
+     * captured pre-change values and after any other scene changes
+     * have been applied, such as the layout (if any) being added to
+     * the view hierarchy. After this method is called, Transitions will
+     * be played.
+     *
+     * @param action The runnable whose {@link Runnable#run() run()} method will
+     *               be called when this scene is entered
+     * @see #setExitAction(Runnable)
+     * @see android.support.transition.Scene(android.view.ViewGroup, android.view.ViewGroup)
+     */
+    public void setEnterAction(@Nullable Runnable action) {
+        mImpl.setEnterAction(action);
+    }
+
+    /**
+     * Scenes that are not defined with layout resources or
+     * hierarchies, or which need to perform additional steps
+     * after those hierarchies are changed to, should set an enter
+     * action, and possibly an exit action as well. An exit action
+     * will cause Scene to call back into application code to do
+     * anything the application needs to do after applicable transitions have
+     * captured pre-change values, but before any other scene changes
+     * have been applied, such as the new layout (if any) being added to
+     * the view hierarchy. After this method is called, the next scene
+     * will be entered, including a call to {@link #setEnterAction(Runnable)}
+     * if an enter action is set.
+     *
+     * @see #setEnterAction(Runnable)
+     * @see android.support.transition.Scene(android.view.ViewGroup, android.view.ViewGroup)
+     */
+    public void setExitAction(@Nullable Runnable action) {
+        mImpl.setExitAction(action);
+    }
+
+}
diff --git a/transition/src/android/support/transition/Transition.java b/transition/src/android/support/transition/Transition.java
new file mode 100644
index 0000000..dffc9c0
--- /dev/null
+++ b/transition/src/android/support/transition/Transition.java
@@ -0,0 +1,702 @@
+/*
+ * Copyright (C) 2016 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 android.support.transition;
+
+import android.animation.Animator;
+import android.animation.TimeInterpolator;
+import android.os.Build;
+import android.support.annotation.IdRes;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.view.SurfaceView;
+import android.view.TextureView;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Spinner;
+
+import java.util.List;
+
+/**
+ * A Transition holds information about animations that will be run on its
+ * targets during a scene change. Subclasses of this abstract class may
+ * choreograph several child transitions ({@link TransitionSet} or they may
+ * perform custom animations themselves. Any Transition has two main jobs:
+ * (1) capture property values, and (2) play animations based on changes to
+ * captured property values. A custom transition knows what property values
+ * on View objects are of interest to it, and also knows how to animate
+ * changes to those values. For example, the {@link Fade} transition tracks
+ * changes to visibility-related properties and is able to construct and run
+ * animations that fade items in or out based on changes to those properties.
+ *
+ * <p>Note: Transitions may not work correctly with either {@link SurfaceView}
+ * or {@link TextureView}, due to the way that these views are displayed
+ * on the screen. For SurfaceView, the problem is that the view is updated from
+ * a non-UI thread, so changes to the view due to transitions (such as moving
+ * and resizing the view) may be out of sync with the display inside those bounds.
+ * TextureView is more compatible with transitions in general, but some
+ * specific transitions (such as {@link Fade}) may not be compatible
+ * with TextureView because they rely on {@link ViewOverlay} functionality,
+ * which does not currently work with TextureView.</p>
+ *
+ * <p>Unlike the platform version, this does not support declaration by XML resources.</p>
+ */
+public abstract class Transition implements TransitionInterface {
+
+    /* package */ TransitionImpl mImpl;
+
+    /**
+     * Constructs a Transition object with no target objects. A transition with
+     * no targets defaults to running on all target objects in the scene hierarchy
+     * (if the transition is not contained in a TransitionSet), or all target
+     * objects passed down from its parent (if it is in a TransitionSet).
+     */
+    public Transition() {
+        this(false);
+    }
+
+    // Hidden constructor for built-in transitions
+    protected Transition(boolean deferred) {
+        if (!deferred) {
+            mImpl = Build.VERSION.SDK_INT < 19 ? new TransitionIcs() : new TransitionKitKat();
+            mImpl.init(this);
+        }
+    }
+
+    /**
+     * Adds a listener to the set of listeners that are sent events through the
+     * life of an animation, such as start, repeat, and end.
+     *
+     * @param listener the listener to be added to the current set of listeners
+     *                 for this animation.
+     * @return This transition object.
+     */
+    @NonNull
+    public Transition addListener(@NonNull TransitionListener listener) {
+        mImpl.addListener(listener);
+        return this;
+    }
+
+    /**
+     * Sets the target view instances that this Transition is interested in
+     * animating. By default, there are no targets, and a Transition will
+     * listen for changes on every view in the hierarchy below the sceneRoot
+     * of the Scene being transitioned into. Setting targets constrains
+     * the Transition to only listen for, and act on, these views.
+     * All other views will be ignored.
+     *
+     * <p>The target list is like the {@link #addTarget(int) targetId}
+     * list except this list specifies the actual View instances, not the ids
+     * of the views. This is an important distinction when scene changes involve
+     * view hierarchies which have been inflated separately; different views may
+     * share the same id but not actually be the same instance. If the transition
+     * should treat those views as the same, then {@link #addTarget(int)} should be used
+     * instead of {@link #addTarget(View)}. If, on the other hand, scene changes involve
+     * changes all within the same view hierarchy, among views which do not
+     * necessarily have ids set on them, then the target list of views may be more
+     * convenient.</p>
+     *
+     * @param target A View on which the Transition will act, must be non-null.
+     * @return The Transition to which the target is added.
+     * Returning the same object makes it easier to chain calls during
+     * construction, such as
+     * <code>transitionSet.addTransitions(new Fade()).addTarget(someView);</code>
+     * @see #addTarget(int)
+     */
+    @NonNull
+    public Transition addTarget(@NonNull View target) {
+        mImpl.addTarget(target);
+        return this;
+    }
+
+    /**
+     * Adds the id of a target view that this Transition is interested in
+     * animating. By default, there are no targetIds, and a Transition will
+     * listen for changes on every view in the hierarchy below the sceneRoot
+     * of the Scene being transitioned into. Setting targetIds constrains
+     * the Transition to only listen for, and act on, views with these IDs.
+     * Views with different IDs, or no IDs whatsoever, will be ignored.
+     *
+     * <p>Note that using ids to specify targets implies that ids should be unique
+     * within the view hierarchy underneat the scene root.</p>
+     *
+     * @param targetId The id of a target view, must be a positive number.
+     * @return The Transition to which the targetId is added.
+     * Returning the same object makes it easier to chain calls during
+     * construction, such as
+     * <code>transitionSet.addTransitions(new Fade()).addTarget(someId);</code>
+     * @see View#getId()
+     */
+    @NonNull
+    public Transition addTarget(@IdRes int targetId) {
+        mImpl.addTarget(targetId);
+        return this;
+    }
+
+    /**
+     * Captures the values in the end scene for the properties that this
+     * transition monitors. These values are then passed as the endValues
+     * structure in a later call to
+     * {@link #createAnimator(ViewGroup, TransitionValues, TransitionValues)}.
+     * The main concern for an implementation is what the
+     * properties are that the transition cares about and what the values are
+     * for all of those properties. The start and end values will be compared
+     * later during the
+     * {@link #createAnimator(ViewGroup, TransitionValues, TransitionValues)}
+     * method to determine what, if any, animations, should be run.
+     *
+     * <p>Subclasses must implement this method. The method should only be called by the
+     * transition system; it is not intended to be called from external classes.</p>
+     *
+     * @param transitionValues The holder for any values that the Transition
+     *                         wishes to store. Values are stored in the <code>values</code> field
+     *                         of this TransitionValues object and are keyed from
+     *                         a String value. For example, to store a view's rotation value,
+     *                         a transition might call
+     *                         <code>transitionValues.values.put("appname:transitionname:rotation",
+     *                         view.getRotation())</code>. The target view will already be stored
+     *                         in
+     *                         the transitionValues structure when this method is called.
+     * @see #captureStartValues(TransitionValues)
+     * @see #createAnimator(ViewGroup, TransitionValues, TransitionValues)
+     */
+    @Override
+    public abstract void captureEndValues(@NonNull TransitionValues transitionValues);
+
+    /**
+     * Captures the values in the start scene for the properties that this
+     * transition monitors. These values are then passed as the startValues
+     * structure in a later call to
+     * {@link #createAnimator(ViewGroup, TransitionValues, TransitionValues)}.
+     * The main concern for an implementation is what the
+     * properties are that the transition cares about and what the values are
+     * for all of those properties. The start and end values will be compared
+     * later during the
+     * {@link #createAnimator(ViewGroup, TransitionValues, TransitionValues)}
+     * method to determine what, if any, animations, should be run.
+     *
+     * <p>Subclasses must implement this method. The method should only be called by the
+     * transition system; it is not intended to be called from external classes.</p>
+     *
+     * @param transitionValues The holder for any values that the Transition
+     *                         wishes to store. Values are stored in the <code>values</code> field
+     *                         of this TransitionValues object and are keyed from
+     *                         a String value. For example, to store a view's rotation value,
+     *                         a transition might call
+     *                         <code>transitionValues.values.put("appname:transitionname:rotation",
+     *                         view.getRotation())</code>. The target view will already be stored
+     *                         in
+     *                         the transitionValues structure when this method is called.
+     * @see #captureEndValues(TransitionValues)
+     * @see #createAnimator(ViewGroup, TransitionValues, TransitionValues)
+     */
+    @Override
+    public abstract void captureStartValues(@NonNull TransitionValues transitionValues);
+
+    /**
+     * This method creates an animation that will be run for this transition
+     * given the information in the startValues and endValues structures captured
+     * earlier for the start and end scenes. Subclasses of Transition should override
+     * this method. The method should only be called by the transition system; it is
+     * not intended to be called from external classes.
+     *
+     * <p>This method is called by the transition's parent (all the way up to the
+     * topmost Transition in the hierarchy) with the sceneRoot and start/end
+     * values that the transition may need to set up initial target values
+     * and construct an appropriate animation. For example, if an overall
+     * Transition is a {@link TransitionSet} consisting of several
+     * child transitions in sequence, then some of the child transitions may
+     * want to set initial values on target views prior to the overall
+     * Transition commencing, to put them in an appropriate state for the
+     * delay between that start and the child Transition start time. For
+     * example, a transition that fades an item in may wish to set the starting
+     * alpha value to 0, to avoid it blinking in prior to the transition
+     * actually starting the animation. This is necessary because the scene
+     * change that triggers the Transition will automatically set the end-scene
+     * on all target views, so a Transition that wants to animate from a
+     * different value should set that value prior to returning from this method.</p>
+     *
+     * <p>Additionally, a Transition can perform logic to determine whether
+     * the transition needs to run on the given target and start/end values.
+     * For example, a transition that resizes objects on the screen may wish
+     * to avoid running for views which are not present in either the start
+     * or end scenes.</p>
+     *
+     * <p>If there is an animator created and returned from this method, the
+     * transition mechanism will apply any applicable duration, startDelay,
+     * and interpolator to that animation and start it. A return value of
+     * <code>null</code> indicates that no animation should run. The default
+     * implementation returns null.</p>
+     *
+     * <p>The method is called for every applicable target object, which is
+     * stored in the {@link TransitionValues#view} field.</p>
+     *
+     * @param sceneRoot   The root of the transition hierarchy.
+     * @param startValues The values for a specific target in the start scene.
+     * @param endValues   The values for the target in the end scene.
+     * @return A Animator to be started at the appropriate time in the
+     * overall transition for this scene change. A null value means no animation
+     * should be run.
+     */
+    @Override
+    @Nullable
+    public abstract Animator createAnimator(@NonNull ViewGroup sceneRoot,
+            @NonNull TransitionValues startValues, @NonNull TransitionValues endValues);
+
+    /**
+     * Whether to add the children of given target to the list of target children
+     * to exclude from this transition. The <code>exclude</code> parameter specifies
+     * whether the target should be added to or removed from the excluded list.
+     *
+     * <p>Excluding targets is a general mechanism for allowing transitions to run on
+     * a view hierarchy while skipping target views that should not be part of
+     * the transition. For example, you may want to avoid animating children
+     * of a specific ListView or Spinner. Views can be excluded either by their
+     * id, or by their instance reference, or by the Class of that view
+     * (eg, {@link Spinner}).</p>
+     *
+     * @param target  The target to ignore when running this transition.
+     * @param exclude Whether to add the target to or remove the target from the
+     *                current list of excluded targets.
+     * @return This transition object.
+     * @see #excludeTarget(View, boolean)
+     * @see #excludeChildren(int, boolean)
+     * @see #excludeChildren(Class, boolean)
+     */
+    @NonNull
+    public Transition excludeChildren(@NonNull View target, boolean exclude) {
+        mImpl.excludeChildren(target, exclude);
+        return this;
+    }
+
+    /**
+     * Whether to add the children of the given id to the list of targets to exclude
+     * from this transition. The <code>exclude</code> parameter specifies whether
+     * the children of the target should be added to or removed from the excluded list.
+     * Excluding children in this way provides a simple mechanism for excluding all
+     * children of specific targets, rather than individually excluding each
+     * child individually.
+     *
+     * <p>Excluding targets is a general mechanism for allowing transitions to run on
+     * a view hierarchy while skipping target views that should not be part of
+     * the transition. For example, you may want to avoid animating children
+     * of a specific ListView or Spinner. Views can be excluded either by their
+     * id, or by their instance reference, or by the Class of that view
+     * (eg, {@link Spinner}).</p>
+     *
+     * @param targetId The id of a target whose children should be ignored when running
+     *                 this transition.
+     * @param exclude  Whether to add the target to or remove the target from the
+     *                 current list of excluded-child targets.
+     * @return This transition object.
+     * @see #excludeTarget(int, boolean)
+     * @see #excludeChildren(View, boolean)
+     * @see #excludeChildren(Class, boolean)
+     */
+    @NonNull
+    public Transition excludeChildren(@IdRes int targetId, boolean exclude) {
+        mImpl.excludeChildren(targetId, exclude);
+        return this;
+    }
+
+    /**
+     * Whether to add the given type to the list of types whose children should
+     * be excluded from this transition. The <code>exclude</code> parameter
+     * specifies whether the target type should be added to or removed from
+     * the excluded list.
+     *
+     * <p>Excluding targets is a general mechanism for allowing transitions to run on
+     * a view hierarchy while skipping target views that should not be part of
+     * the transition. For example, you may want to avoid animating children
+     * of a specific ListView or Spinner. Views can be excluded either by their
+     * id, or by their instance reference, or by the Class of that view
+     * (eg, {@link Spinner}).</p>
+     *
+     * @param type    The type to ignore when running this transition.
+     * @param exclude Whether to add the target type to or remove it from the
+     *                current list of excluded target types.
+     * @return This transition object.
+     * @see #excludeTarget(Class, boolean)
+     * @see #excludeChildren(int, boolean)
+     * @see #excludeChildren(View, boolean)
+     */
+    @NonNull
+    public Transition excludeChildren(@NonNull Class type, boolean exclude) {
+        mImpl.excludeChildren(type, exclude);
+        return this;
+    }
+
+    /**
+     * Whether to add the given target to the list of targets to exclude from this
+     * transition. The <code>exclude</code> parameter specifies whether the target
+     * should be added to or removed from the excluded list.
+     *
+     * <p>Excluding targets is a general mechanism for allowing transitions to run on
+     * a view hierarchy while skipping target views that should not be part of
+     * the transition. For example, you may want to avoid animating children
+     * of a specific ListView or Spinner. Views can be excluded either by their
+     * id, or by their instance reference, or by the Class of that view
+     * (eg, {@link Spinner}).</p>
+     *
+     * @param target  The target to ignore when running this transition.
+     * @param exclude Whether to add the target to or remove the target from the
+     *                current list of excluded targets.
+     * @return This transition object.
+     * @see #excludeChildren(View, boolean)
+     * @see #excludeTarget(int, boolean)
+     * @see #excludeTarget(Class, boolean)
+     */
+    @NonNull
+    public Transition excludeTarget(@NonNull View target, boolean exclude) {
+        mImpl.excludeTarget(target, exclude);
+        return this;
+    }
+
+    /**
+     * Whether to add the given id to the list of target ids to exclude from this
+     * transition. The <code>exclude</code> parameter specifies whether the target
+     * should be added to or removed from the excluded list.
+     *
+     * <p>Excluding targets is a general mechanism for allowing transitions to run on
+     * a view hierarchy while skipping target views that should not be part of
+     * the transition. For example, you may want to avoid animating children
+     * of a specific ListView or Spinner. Views can be excluded either by their
+     * id, or by their instance reference, or by the Class of that view
+     * (eg, {@link Spinner}).</p>
+     *
+     * @param targetId The id of a target to ignore when running this transition.
+     * @param exclude  Whether to add the target to or remove the target from the
+     *                 current list of excluded targets.
+     * @return This transition object.
+     * @see #excludeChildren(int, boolean)
+     * @see #excludeTarget(View, boolean)
+     * @see #excludeTarget(Class, boolean)
+     */
+    @NonNull
+    public Transition excludeTarget(@IdRes int targetId, boolean exclude) {
+        mImpl.excludeTarget(targetId, exclude);
+        return this;
+    }
+
+    /**
+     * Whether to add the given type to the list of types to exclude from this
+     * transition. The <code>exclude</code> parameter specifies whether the target
+     * type should be added to or removed from the excluded list.
+     *
+     * <p>Excluding targets is a general mechanism for allowing transitions to run on
+     * a view hierarchy while skipping target views that should not be part of
+     * the transition. For example, you may want to avoid animating children
+     * of a specific ListView or Spinner. Views can be excluded either by their
+     * id, or by their instance reference, or by the Class of that view
+     * (eg, {@link Spinner}).</p>
+     *
+     * @param type    The type to ignore when running this transition.
+     * @param exclude Whether to add the target type to or remove it from the
+     *                current list of excluded target types.
+     * @return This transition object.
+     * @see #excludeChildren(Class, boolean)
+     * @see #excludeTarget(int, boolean)
+     * @see #excludeTarget(View, boolean)
+     */
+    @NonNull
+    public Transition excludeTarget(@NonNull Class type, boolean exclude) {
+        mImpl.excludeTarget(type, exclude);
+        return this;
+    }
+
+    /**
+     * Returns the duration set on this transition. If no duration has been set,
+     * the returned value will be negative, indicating that resulting animators will
+     * retain their own durations.
+     *
+     * @return The duration set on this transition, in milliseconds, if one has been
+     * set, otherwise returns a negative number.
+     */
+    public long getDuration() {
+        return mImpl.getDuration();
+    }
+
+    /**
+     * Sets the duration of this transition. By default, there is no duration
+     * (indicated by a negative number), which means that the Animator created by
+     * the transition will have its own specified duration. If the duration of a
+     * Transition is set, that duration will override the Animator duration.
+     *
+     * @param duration The length of the animation, in milliseconds.
+     * @return This transition object.
+     * @attr ref android.R.styleable#Transition_duration
+     */
+    @NonNull
+    public Transition setDuration(long duration) {
+        mImpl.setDuration(duration);
+        return this;
+    }
+
+    /**
+     * Returns the interpolator set on this transition. If no interpolator has been set,
+     * the returned value will be null, indicating that resulting animators will
+     * retain their own interpolators.
+     *
+     * @return The interpolator set on this transition, if one has been set, otherwise
+     * returns null.
+     */
+    @Nullable
+    public TimeInterpolator getInterpolator() {
+        return mImpl.getInterpolator();
+    }
+
+    /**
+     * Sets the interpolator of this transition. By default, the interpolator
+     * is null, which means that the Animator created by the transition
+     * will have its own specified interpolator. If the interpolator of a
+     * Transition is set, that interpolator will override the Animator interpolator.
+     *
+     * @param interpolator The time interpolator used by the transition
+     * @return This transition object.
+     * @attr ref android.R.styleable#Transition_interpolator
+     */
+    @NonNull
+    public Transition setInterpolator(@Nullable TimeInterpolator interpolator) {
+        mImpl.setInterpolator(interpolator);
+        return this;
+    }
+
+    /**
+     * Returns the name of this Transition. This name is used internally to distinguish
+     * between different transitions to determine when interrupting transitions overlap.
+     * For example, a ChangeBounds running on the same target view as another ChangeBounds
+     * should determine whether the old transition is animating to different end values
+     * and should be canceled in favor of the new transition.
+     *
+     * <p>By default, a Transition's name is simply the value of {@link Class#getName()},
+     * but subclasses are free to override and return something different.</p>
+     *
+     * @return The name of this transition.
+     */
+    @NonNull
+    public String getName() {
+        return mImpl.getName();
+    }
+
+    /**
+     * Returns the startDelay set on this transition. If no startDelay has been set,
+     * the returned value will be negative, indicating that resulting animators will
+     * retain their own startDelays.
+     *
+     * @return The startDelay set on this transition, in milliseconds, if one has
+     * been set, otherwise returns a negative number.
+     */
+    public long getStartDelay() {
+        return mImpl.getStartDelay();
+    }
+
+    /**
+     * Sets the startDelay of this transition. By default, there is no delay
+     * (indicated by a negative number), which means that the Animator created by
+     * the transition will have its own specified startDelay. If the delay of a
+     * Transition is set, that delay will override the Animator delay.
+     *
+     * @param startDelay The length of the delay, in milliseconds.
+     * @return This transition object.
+     * @attr ref android.R.styleable#Transition_startDelay
+     */
+    @NonNull
+    public Transition setStartDelay(long startDelay) {
+        mImpl.setStartDelay(startDelay);
+        return this;
+    }
+
+    /**
+     * Returns the array of target IDs that this transition limits itself to
+     * tracking and animating. If the array is null for both this method and
+     * {@link #getTargets()}, then this transition is
+     * not limited to specific views, and will handle changes to any views
+     * in the hierarchy of a scene change.
+     *
+     * @return the list of target IDs
+     */
+    @NonNull
+    public List<Integer> getTargetIds() {
+        return mImpl.getTargetIds();
+    }
+
+    /**
+     * Returns the array of target views that this transition limits itself to
+     * tracking and animating. If the array is null for both this method and
+     * {@link #getTargetIds()}, then this transition is
+     * not limited to specific views, and will handle changes to any views
+     * in the hierarchy of a scene change.
+     *
+     * @return the list of target views
+     */
+    @NonNull
+    public List<View> getTargets() {
+        return mImpl.getTargets();
+    }
+
+    /**
+     * Returns the set of property names used stored in the {@link TransitionValues}
+     * object passed into {@link #captureStartValues(TransitionValues)} that
+     * this transition cares about for the purposes of canceling overlapping animations.
+     * When any transition is started on a given scene root, all transitions
+     * currently running on that same scene root are checked to see whether the
+     * properties on which they based their animations agree with the end values of
+     * the same properties in the new transition. If the end values are not equal,
+     * then the old animation is canceled since the new transition will start a new
+     * animation to these new values. If the values are equal, the old animation is
+     * allowed to continue and no new animation is started for that transition.
+     *
+     * <p>A transition does not need to override this method. However, not doing so
+     * will mean that the cancellation logic outlined in the previous paragraph
+     * will be skipped for that transition, possibly leading to artifacts as
+     * old transitions and new transitions on the same targets run in parallel,
+     * animating views toward potentially different end values.</p>
+     *
+     * @return An array of property names as described in the class documentation for
+     * {@link TransitionValues}. The default implementation returns <code>null</code>.
+     */
+    @Nullable
+    public String[] getTransitionProperties() {
+        return mImpl.getTransitionProperties();
+    }
+
+    /**
+     * This method can be called by transitions to get the TransitionValues for
+     * any particular view during the transition-playing process. This might be
+     * necessary, for example, to query the before/after state of related views
+     * for a given transition.
+     */
+    @NonNull
+    public TransitionValues getTransitionValues(@NonNull View view, boolean start) {
+        return mImpl.getTransitionValues(view, start);
+    }
+
+    /**
+     * Removes a listener from the set listening to this animation.
+     *
+     * @param listener the listener to be removed from the current set of
+     *                 listeners for this transition.
+     * @return This transition object.
+     */
+    @NonNull
+    public Transition removeListener(@NonNull TransitionListener listener) {
+        mImpl.removeListener(listener);
+        return this;
+    }
+
+    /**
+     * Removes the given target from the list of targets that this Transition
+     * is interested in animating.
+     *
+     * @param target The target view, must be non-null.
+     * @return Transition The Transition from which the target is removed.
+     * Returning the same object makes it easier to chain calls during
+     * construction, such as
+     * <code>transitionSet.addTransitions(new Fade()).removeTarget(someView);</code>
+     */
+    @NonNull
+    public Transition removeTarget(@NonNull View target) {
+        mImpl.removeTarget(target);
+        return this;
+    }
+
+    /**
+     * Removes the given targetId from the list of ids that this Transition
+     * is interested in animating.
+     *
+     * @param targetId The id of a target view, must be a positive number.
+     * @return The Transition from which the targetId is removed.
+     * Returning the same object makes it easier to chain calls during
+     * construction, such as
+     * <code>transitionSet.addTransitions(new Fade()).removeTargetId(someId);</code>
+     */
+    @NonNull
+    public Transition removeTarget(@IdRes int targetId) {
+        mImpl.removeTarget(targetId);
+        return this;
+    }
+
+    @Override
+    public String toString() {
+        return mImpl.toString();
+    }
+
+    /**
+     * A transition listener receives notifications from a transition.
+     * Notifications indicate transition lifecycle events.
+     */
+    public interface TransitionListener extends TransitionInterfaceListener<Transition> {
+
+        /**
+         * Notification about the start of the transition.
+         *
+         * @param transition The started transition.
+         */
+        @Override
+        void onTransitionStart(@NonNull Transition transition);
+
+        /**
+         * Notification about the end of the transition. Canceled transitions
+         * will always notify listeners of both the cancellation and end
+         * events. That is, {@link #onTransitionEnd(Transition)} is always called,
+         * regardless of whether the transition was canceled or played
+         * through to completion.
+         *
+         * @param transition The transition which reached its end.
+         */
+        @Override
+        void onTransitionEnd(@NonNull Transition transition);
+
+        /**
+         * Notification about the cancellation of the transition.
+         * Note that cancel may be called by a parent {@link TransitionSet} on
+         * a child transition which has not yet started. This allows the child
+         * transition to restore state on target objects which was set at
+         * {@link #createAnimator(android.view.ViewGroup, TransitionValues, TransitionValues)
+         * createAnimator()} time.
+         *
+         * @param transition The transition which was canceled.
+         */
+        @Override
+        void onTransitionCancel(@NonNull Transition transition);
+
+        /**
+         * Notification when a transition is paused.
+         * Note that createAnimator() may be called by a parent {@link TransitionSet} on
+         * a child transition which has not yet started. This allows the child
+         * transition to restore state on target objects which was set at
+         * {@link #createAnimator(android.view.ViewGroup, TransitionValues, TransitionValues)
+         * createAnimator()} time.
+         *
+         * @param transition The transition which was paused.
+         */
+        @Override
+        void onTransitionPause(@NonNull Transition transition);
+
+        /**
+         * Notification when a transition is resumed.
+         * Note that resume() may be called by a parent {@link TransitionSet} on
+         * a child transition which has not yet started. This allows the child
+         * transition to restore state which may have changed in an earlier call
+         * to {@link #onTransitionPause(Transition)}.
+         *
+         * @param transition The transition which was resumed.
+         */
+        @Override
+        void onTransitionResume(@NonNull Transition transition);
+    }
+
+}
diff --git a/transition/src/android/support/transition/TransitionManager.java b/transition/src/android/support/transition/TransitionManager.java
new file mode 100644
index 0000000..da9ac08
--- /dev/null
+++ b/transition/src/android/support/transition/TransitionManager.java
@@ -0,0 +1,171 @@
+/*
+ * Copyright (C) 2016 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 android.support.transition;
+
+import android.os.Build;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.view.ViewGroup;
+
+/**
+ * This class manages the set of transitions that fire when there is a
+ * change of {@link Scene}. To use the manager, add scenes along with
+ * transition objects with calls to {@link #setTransition(Scene, Transition)}
+ * or {@link #setTransition(Scene, Scene, Transition)}. Setting specific
+ * transitions for scene changes is not required; by default, a Scene change
+ * will use {@link AutoTransition} to do something reasonable for most
+ * situations. Specifying other transitions for particular scene changes is
+ * only necessary if the application wants different transition behavior
+ * in these situations.
+ *
+ * <p>Unlike the platform version, this does not support declaration by XML resources.</p>
+ */
+public class TransitionManager {
+
+    private static TransitionManagerStaticsImpl sImpl;
+
+    static {
+        if (Build.VERSION.SDK_INT < 19) {
+            sImpl = new TransitionManagerStaticsIcs();
+        } else {
+            sImpl = new TransitionManagerStaticsKitKat();
+        }
+    }
+
+    private TransitionManagerImpl mImpl;
+
+    public TransitionManager() {
+        if (Build.VERSION.SDK_INT < 19) {
+            mImpl = new TransitionManagerIcs();
+        } else {
+            mImpl = new TransitionManagerKitKat();
+        }
+    }
+
+    /**
+     * Convenience method to simply change to the given scene using
+     * the default transition for TransitionManager.
+     *
+     * @param scene The Scene to change to
+     */
+    public static void go(@NonNull Scene scene) {
+        sImpl.go(scene.mImpl);
+    }
+
+    /**
+     * Convenience method to simply change to the given scene using
+     * the given transition.
+     *
+     * <p>Passing in <code>null</code> for the transition parameter will
+     * result in the scene changing without any transition running, and is
+     * equivalent to calling {@link Scene#exit()} on the scene root's
+     * current scene, followed by {@link Scene#enter()} on the scene
+     * specified by the <code>scene</code> parameter.</p>
+     *
+     * @param scene      The Scene to change to
+     * @param transition The transition to use for this scene change. A
+     *                   value of null causes the scene change to happen with no transition.
+     */
+    public static void go(@NonNull Scene scene, @Nullable Transition transition) {
+        sImpl.go(scene.mImpl, transition == null ? null : transition.mImpl);
+    }
+
+    /**
+     * Convenience method to animate, using the default transition,
+     * to a new scene defined by all changes within the given scene root between
+     * calling this method and the next rendering frame.
+     * Equivalent to calling {@link #beginDelayedTransition(ViewGroup, Transition)}
+     * with a value of <code>null</code> for the <code>transition</code> parameter.
+     *
+     * @param sceneRoot The root of the View hierarchy to run the transition on.
+     */
+    public static void beginDelayedTransition(@NonNull final ViewGroup sceneRoot) {
+        sImpl.beginDelayedTransition(sceneRoot);
+    }
+
+    /**
+     * Convenience method to animate to a new scene defined by all changes within
+     * the given scene root between calling this method and the next rendering frame.
+     * Calling this method causes TransitionManager to capture current values in the
+     * scene root and then post a request to run a transition on the next frame.
+     * At that time, the new values in the scene root will be captured and changes
+     * will be animated. There is no need to create a Scene; it is implied by
+     * changes which take place between calling this method and the next frame when
+     * the transition begins.
+     *
+     * <p>Calling this method several times before the next frame (for example, if
+     * unrelated code also wants to make dynamic changes and run a transition on
+     * the same scene root), only the first call will trigger capturing values
+     * and exiting the current scene. Subsequent calls to the method with the
+     * same scene root during the same frame will be ignored.</p>
+     *
+     * <p>Passing in <code>null</code> for the transition parameter will
+     * cause the TransitionManager to use its default transition.</p>
+     *
+     * @param sceneRoot  The root of the View hierarchy to run the transition on.
+     * @param transition The transition to use for this change. A
+     *                   value of null causes the TransitionManager to use the default transition.
+     */
+    public static void beginDelayedTransition(@NonNull final ViewGroup sceneRoot,
+            @Nullable Transition transition) {
+        sImpl.beginDelayedTransition(sceneRoot, transition == null ? null : transition.mImpl);
+    }
+
+    /**
+     * Sets a specific transition to occur when the given scene is entered.
+     *
+     * @param scene      The scene which, when applied, will cause the given
+     *                   transition to run.
+     * @param transition The transition that will play when the given scene is
+     *                   entered. A value of null will result in the default behavior of
+     *                   using the default transition instead.
+     */
+    public void setTransition(@NonNull Scene scene, @Nullable Transition transition) {
+        mImpl.setTransition(scene.mImpl, transition == null ? null : transition.mImpl);
+    }
+
+    /**
+     * Sets a specific transition to occur when the given pair of scenes is
+     * exited/entered.
+     *
+     * @param fromScene  The scene being exited when the given transition will
+     *                   be run
+     * @param toScene    The scene being entered when the given transition will
+     *                   be run
+     * @param transition The transition that will play when the given scene is
+     *                   entered. A value of null will result in the default behavior of
+     *                   using the default transition instead.
+     */
+    public void setTransition(@NonNull Scene fromScene, @NonNull Scene toScene,
+            @Nullable Transition transition) {
+        mImpl.setTransition(fromScene.mImpl, toScene.mImpl,
+                transition == null ? null : transition.mImpl);
+    }
+
+    /**
+     * Change to the given scene, using the
+     * appropriate transition for this particular scene change
+     * (as specified to the TransitionManager, or the default
+     * if no such transition exists).
+     *
+     * @param scene The Scene to change to
+     */
+    public void transitionTo(@NonNull Scene scene) {
+        mImpl.transitionTo(scene.mImpl);
+    }
+
+}
diff --git a/transition/src/android/support/transition/TransitionSet.java b/transition/src/android/support/transition/TransitionSet.java
new file mode 100644
index 0000000..f43eeb1
--- /dev/null
+++ b/transition/src/android/support/transition/TransitionSet.java
@@ -0,0 +1,140 @@
+/*
+ * Copyright (C) 2016 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 android.support.transition;
+
+import android.animation.Animator;
+import android.os.Build;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.view.ViewGroup;
+
+/**
+ * A TransitionSet is a parent of child transitions (including other
+ * TransitionSets). Using TransitionSets enables more complex
+ * choreography of transitions, where some sets play {@link #ORDERING_TOGETHER} and
+ * others play {@link #ORDERING_SEQUENTIAL}. For example, {@link AutoTransition}
+ * uses a TransitionSet to sequentially play a Fade(Fade.OUT), followed by
+ * a {@link ChangeBounds}, followed by a Fade(Fade.OUT) transition.
+ *
+ * <p>Unlike the platform version, this does not support declaration by XML resources.</p>
+ */
+public class TransitionSet extends Transition {
+
+    /**
+     * A flag used to indicate that the child transitions of this set
+     * should all start at the same time.
+     */
+    public static final int ORDERING_TOGETHER = 0;
+
+    /**
+     * A flag used to indicate that the child transitions of this set should
+     * play in sequence; when one child transition ends, the next child
+     * transition begins. Note that a transition does not end until all
+     * instances of it (which are playing on all applicable targets of the
+     * transition) end.
+     */
+    public static final int ORDERING_SEQUENTIAL = 1;
+
+    /**
+     * Constructs an empty transition set. Add child transitions to the
+     * set by calling {@link #addTransition(Transition)} )}. By default,
+     * child transitions will play {@link #ORDERING_TOGETHER together}.
+     */
+    public TransitionSet() {
+        super(true);
+        if (Build.VERSION.SDK_INT < 19) {
+            mImpl = new TransitionSetIcs(this);
+        } else {
+            mImpl = new TransitionSetKitKat(this);
+        }
+    }
+
+    /**
+     * Returns the ordering of this TransitionSet. By default, the value is
+     * {@link #ORDERING_TOGETHER}.
+     *
+     * @return {@link #ORDERING_TOGETHER} if child transitions will play at the same
+     * time, {@link #ORDERING_SEQUENTIAL} if they will play in sequence.
+     * @see #setOrdering(int)
+     */
+    public int getOrdering() {
+        return ((TransitionSetImpl) mImpl).getOrdering();
+    }
+
+    /**
+     * Sets the play order of this set's child transitions.
+     *
+     * @param ordering {@link #ORDERING_TOGETHER} to play this set's child
+     *                 transitions together, {@link #ORDERING_SEQUENTIAL} to play the child
+     *                 transitions in sequence.
+     * @return This transitionSet object.
+     */
+    @NonNull
+    public TransitionSet setOrdering(int ordering) {
+        ((TransitionSetImpl) mImpl).setOrdering(ordering);
+        return this;
+    }
+
+    /**
+     * Adds child transition to this set. The order in which this child transition
+     * is added relative to other child transitions that are added, in addition to
+     * the {@link #getOrdering() ordering} property, determines the
+     * order in which the transitions are started.
+     *
+     * <p>If this transitionSet has a {@link #getDuration() duration} set on it, the
+     * child transition will inherit that duration. Transitions are assumed to have
+     * a maximum of one transitionSet parent.</p>
+     *
+     * @param transition A non-null child transition to be added to this set.
+     * @return This transitionSet object.
+     */
+    @NonNull
+    public TransitionSet addTransition(@NonNull Transition transition) {
+        ((TransitionSetImpl) mImpl).addTransition(transition.mImpl);
+        return this;
+    }
+
+    /**
+     * Removes the specified child transition from this set.
+     *
+     * @param transition The transition to be removed.
+     * @return This transitionSet object.
+     */
+    @NonNull
+    public TransitionSet removeTransition(@NonNull Transition transition) {
+        ((TransitionSetImpl) mImpl).removeTransition(transition.mImpl);
+        return this;
+    }
+
+    @Override
+    public void captureEndValues(@NonNull TransitionValues transitionValues) {
+        mImpl.captureEndValues(transitionValues);
+    }
+
+    @Override
+    public void captureStartValues(@NonNull TransitionValues transitionValues) {
+        mImpl.captureStartValues(transitionValues);
+    }
+
+    @Override
+    @Nullable
+    public Animator createAnimator(@NonNull ViewGroup sceneRoot,
+            @NonNull TransitionValues startValues, @NonNull TransitionValues endValues) {
+        return mImpl.createAnimator(sceneRoot, startValues, endValues);
+    }
+
+}
diff --git a/transition/tests/AndroidManifest.xml b/transition/tests/AndroidManifest.xml
new file mode 100755
index 0000000..695d1c9
--- /dev/null
+++ b/transition/tests/AndroidManifest.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright (C) 2016 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+        http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+          xmlns:tools="http://schemas.android.com/tools"
+          package="android.support.transition.test">
+
+    <uses-sdk
+        android:minSdkVersion="14"
+        android:targetSdkVersion="23"
+        tools:overrideLibrary="android.support.test, android.app, android.support.test.rule,
+                      android.support.test.espresso, android.support.test.espresso.idling"/>
+
+    <application
+        android:supportsRtl="true">
+        <uses-library android:name="android.test.runner"/>
+
+        <activity
+            android:name="android.support.transition.TransitionActivity"/>
+    </application>
+
+    <instrumentation
+        android:name="android.test.InstrumentationTestRunner"
+        android:targetPackage="android.support.transition.test"/>
+
+</manifest>
diff --git a/transition/tests/NO_DOCS b/transition/tests/NO_DOCS
new file mode 100644
index 0000000..092a39c
--- /dev/null
+++ b/transition/tests/NO_DOCS
@@ -0,0 +1,17 @@
+# Copyright (C) 2016 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.
+
+Having this file, named NO_DOCS, in a directory will prevent
+Android javadocs from being generated for java files under
+the directory. This is especially useful for test projects.
diff --git a/transition/tests/res/layout/activity_transition.xml b/transition/tests/res/layout/activity_transition.xml
new file mode 100644
index 0000000..9ba9ddc
--- /dev/null
+++ b/transition/tests/res/layout/activity_transition.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2016 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.
+-->
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+             android:id="@+id/root"
+             android:orientation="vertical"
+             android:layout_width="match_parent"
+             android:layout_height="match_parent"/>
diff --git a/transition/tests/res/layout/scene0.xml b/transition/tests/res/layout/scene0.xml
new file mode 100644
index 0000000..491eb01
--- /dev/null
+++ b/transition/tests/res/layout/scene0.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2016 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.
+-->
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+             android:layout_width="match_parent"
+             android:layout_height="match_parent"
+             android:id="@+id/container">
+
+    <View
+        android:id="@+id/view0"
+        android:layout_width="64dp"
+        android:layout_height="64dp"
+        android:layout_gravity="start|top"
+        android:background="#f00"/>
+
+    <View
+        android:id="@+id/view1"
+        android:layout_width="64dp"
+        android:layout_height="64dp"
+        android:layout_gravity="end|top"
+        android:background="#0f0"/>
+
+    <View
+        android:id="@+id/view2"
+        android:layout_width="64dp"
+        android:layout_height="64dp"
+        android:layout_gravity="start|bottom"
+        android:background="#00f"/>
+
+</FrameLayout>
diff --git a/transition/tests/res/layout/scene1.xml b/transition/tests/res/layout/scene1.xml
new file mode 100644
index 0000000..4d83ebd
--- /dev/null
+++ b/transition/tests/res/layout/scene1.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2016 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.
+-->
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+             android:layout_width="match_parent"
+             android:layout_height="match_parent"
+             android:id="@+id/container">
+
+    <View
+        android:id="@+id/view0"
+        android:layout_width="64dp"
+        android:layout_height="64dp"
+        android:layout_gravity="end|top"
+        android:background="#f00"/>
+
+    <View
+        android:id="@+id/view1"
+        android:layout_width="64dp"
+        android:layout_height="64dp"
+        android:layout_gravity="center"
+        android:background="#0f0"/>
+
+    <View
+        android:id="@+id/view2"
+        android:layout_width="64dp"
+        android:layout_height="64dp"
+        android:layout_gravity="end|bottom"
+        android:background="#00f"/>
+
+</FrameLayout>
diff --git a/transition/tests/src/android/support/transition/BaseTest.java b/transition/tests/src/android/support/transition/BaseTest.java
new file mode 100644
index 0000000..ddf43c3
--- /dev/null
+++ b/transition/tests/src/android/support/transition/BaseTest.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2016 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 android.support.transition;
+
+import android.support.test.rule.ActivityTestRule;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Rule;
+import org.junit.runner.RunWith;
+
+@SuppressWarnings("unchecked")
+@RunWith(AndroidJUnit4.class)
+public abstract class BaseTest {
+
+    @Rule
+    public final ActivityTestRule<TransitionActivity> rule;
+
+    BaseTest() {
+        rule = new ActivityTestRule(TransitionActivity.class);
+    }
+
+}
diff --git a/transition/tests/src/android/support/transition/CheckCalledRunnable.java b/transition/tests/src/android/support/transition/CheckCalledRunnable.java
new file mode 100644
index 0000000..9eea608
--- /dev/null
+++ b/transition/tests/src/android/support/transition/CheckCalledRunnable.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2016 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 android.support.transition;
+
+class CheckCalledRunnable implements Runnable {
+
+    private boolean mWasCalled = false;
+
+    @Override
+    public void run() {
+        mWasCalled = true;
+    }
+
+    /**
+     * @return {@code true} if {@link #run()} was called at least once.
+     */
+    boolean wasCalled() {
+        return mWasCalled;
+    }
+
+}
diff --git a/transition/tests/src/android/support/transition/SceneTest.java b/transition/tests/src/android/support/transition/SceneTest.java
new file mode 100644
index 0000000..746c20d
--- /dev/null
+++ b/transition/tests/src/android/support/transition/SceneTest.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2016 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 android.support.transition;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.sameInstance;
+
+import android.support.transition.test.R;
+import android.test.suitebuilder.annotation.SmallTest;
+import android.view.ViewGroup;
+
+import org.junit.Test;
+
+public class SceneTest extends BaseTest {
+
+    @Test
+    public void testGetSceneRoot() {
+        TransitionActivity activity = rule.getActivity();
+        ViewGroup root = activity.getRoot();
+        Scene scene = new Scene(root);
+        assertThat(scene.getSceneRoot(), is(sameInstance(root)));
+    }
+
+    @Test
+    public void testEnterAction() {
+        TransitionActivity activity = rule.getActivity();
+        ViewGroup root = activity.getRoot();
+        Scene scene = new Scene(root);
+        CheckCalledRunnable runnable = new CheckCalledRunnable();
+        scene.setEnterAction(runnable);
+        scene.enter();
+        assertThat(runnable.wasCalled(), is(true));
+    }
+
+    @Test
+    public void testExitAction() {
+        TransitionActivity activity = rule.getActivity();
+        ViewGroup root = activity.getRoot();
+        Scene scene = new Scene(root);
+        scene.enter();
+        CheckCalledRunnable runnable = new CheckCalledRunnable();
+        scene.setExitAction(runnable);
+        scene.exit();
+        assertThat(runnable.wasCalled(), is(true));
+    }
+
+    @Test
+    public void testExitAction_withoutEnter() {
+        TransitionActivity activity = rule.getActivity();
+        ViewGroup root = activity.getRoot();
+        Scene scene = new Scene(root);
+        CheckCalledRunnable runnable = new CheckCalledRunnable();
+        scene.setExitAction(runnable);
+        scene.exit();
+        assertThat(runnable.wasCalled(), is(false));
+    }
+
+    @Test
+    public void testGetSceneForLayout_cache() {
+        TransitionActivity activity = rule.getActivity();
+        ViewGroup root = activity.getRoot();
+        Scene scene = Scene.getSceneForLayout(root, R.layout.scene0, activity);
+        assertThat("getSceneForLayout should return the same instance for subsequent calls",
+                Scene.getSceneForLayout(root, R.layout.scene0, activity), is(sameInstance(scene)));
+    }
+
+}
diff --git a/transition/tests/src/android/support/transition/TransitionActivity.java b/transition/tests/src/android/support/transition/TransitionActivity.java
new file mode 100644
index 0000000..253e11a
--- /dev/null
+++ b/transition/tests/src/android/support/transition/TransitionActivity.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2016 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 android.support.transition;
+
+import android.os.Bundle;
+import android.support.transition.test.R;
+import android.support.v4.app.FragmentActivity;
+import android.view.ViewGroup;
+import android.widget.FrameLayout;
+
+public class TransitionActivity extends FragmentActivity {
+
+    private FrameLayout mRoot;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_transition);
+        mRoot = (FrameLayout) findViewById(R.id.root);
+    }
+
+    ViewGroup getRoot() {
+        return mRoot;
+    }
+
+}
diff --git a/transition/tests/src/android/support/transition/TransitionManagerTest.java b/transition/tests/src/android/support/transition/TransitionManagerTest.java
new file mode 100644
index 0000000..3978463
--- /dev/null
+++ b/transition/tests/src/android/support/transition/TransitionManagerTest.java
@@ -0,0 +1,171 @@
+/*
+ * Copyright (C) 2016 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 android.support.transition;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.sameInstance;
+
+import android.support.test.InstrumentationRegistry;
+import android.support.test.annotation.UiThreadTest;
+import android.support.transition.test.R;
+import android.view.ViewGroup;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+public class TransitionManagerTest extends BaseTest {
+
+    private Scene[] mScenes = new Scene[2];
+
+    @Before
+    public void prepareScenes() {
+        TransitionActivity activity = rule.getActivity();
+        ViewGroup root = activity.getRoot();
+        mScenes[0] = Scene.getSceneForLayout(root, R.layout.scene0, activity);
+        mScenes[1] = Scene.getSceneForLayout(root, R.layout.scene1, activity);
+    }
+
+    @Test
+    public void testSetup() {
+        assertThat(mScenes[0], is(notNullValue()));
+        assertThat(mScenes[1], is(notNullValue()));
+    }
+
+    @Test
+    @UiThreadTest
+    public void testGo_enterAction() {
+        CheckCalledRunnable runnable = new CheckCalledRunnable();
+        mScenes[0].setEnterAction(runnable);
+        assertThat(runnable.wasCalled(), is(false));
+        TransitionManager.go(mScenes[0]);
+        assertThat(runnable.wasCalled(), is(true));
+    }
+
+    @Test
+    @UiThreadTest
+    public void testGo_exitAction() {
+        CheckCalledRunnable runnable = new CheckCalledRunnable();
+        mScenes[0].setExitAction(runnable);
+        assertThat(runnable.wasCalled(), is(false));
+        TransitionManager.go(mScenes[0]);
+        assertThat(runnable.wasCalled(), is(false));
+        TransitionManager.go(mScenes[1]);
+        assertThat(runnable.wasCalled(), is(true));
+    }
+
+    @Test
+    public void testGo_transitionListenerStart() {
+        final SyncTransitionListener listener
+                = new SyncTransitionListener(SyncTransitionListener.EVENT_START);
+        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
+            @Override
+            public void run() {
+                Transition transition = new AutoTransition();
+                transition.setDuration(0);
+                assertThat(transition.addListener(listener), is(sameInstance(transition)));
+                TransitionManager.go(mScenes[0], transition);
+            }
+        });
+        assertThat("Timed out waiting for the TransitionListener",
+                listener.await(), is(true));
+    }
+
+    @Test
+    public void testGo_transitionListenerEnd() {
+        final SyncTransitionListener listener
+                = new SyncTransitionListener(SyncTransitionListener.EVENT_END);
+        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
+            @Override
+            public void run() {
+                Transition transition = new AutoTransition();
+                transition.setDuration(0);
+                assertThat(transition.addListener(listener), is(sameInstance(transition)));
+                TransitionManager.go(mScenes[0], transition);
+            }
+        });
+        assertThat("Timed out waiting for the TransitionListener",
+                listener.await(), is(true));
+    }
+
+    /**
+     * This {@link Transition.TransitionListener} synchronously waits for the specified callback.
+     */
+    private static class SyncTransitionListener implements Transition.TransitionListener {
+
+        static final int EVENT_START = 1;
+        static final int EVENT_END = 2;
+        static final int EVENT_CANCEL = 3;
+        static final int EVENT_PAUSE = 4;
+        static final int EVENT_RESUME = 5;
+
+        private final int mTargetEvent;
+        private final CountDownLatch mLatch = new CountDownLatch(1);
+
+        SyncTransitionListener(int event) {
+            mTargetEvent = event;
+        }
+
+        boolean await() {
+            try {
+                return mLatch.await(3000, TimeUnit.MILLISECONDS);
+            } catch (InterruptedException e) {
+                return false;
+            }
+        }
+
+        @Override
+        public void onTransitionStart(Transition transition) {
+            if (mTargetEvent == EVENT_START) {
+                mLatch.countDown();
+            }
+        }
+
+        @Override
+        public void onTransitionEnd(Transition transition) {
+            if (mTargetEvent == EVENT_END) {
+                mLatch.countDown();
+            }
+        }
+
+        @Override
+        public void onTransitionCancel(Transition transition) {
+            if (mTargetEvent == EVENT_CANCEL) {
+                mLatch.countDown();
+            }
+        }
+
+        @Override
+        public void onTransitionPause(Transition transition) {
+            if (mTargetEvent == EVENT_PAUSE) {
+                mLatch.countDown();
+            }
+        }
+
+        @Override
+        public void onTransitionResume(Transition transition) {
+            if (mTargetEvent == EVENT_RESUME) {
+                mLatch.countDown();
+            }
+        }
+    }
+
+}
diff --git a/transition/tests/src/android/support/transition/TransitionTest.java b/transition/tests/src/android/support/transition/TransitionTest.java
new file mode 100644
index 0000000..9620837
--- /dev/null
+++ b/transition/tests/src/android/support/transition/TransitionTest.java
@@ -0,0 +1,147 @@
+/*
+ * Copyright (C) 2016 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 android.support.transition;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.not;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.hasItem;
+import static org.hamcrest.Matchers.sameInstance;
+
+import android.animation.Animator;
+import android.animation.TimeInterpolator;
+import android.support.test.annotation.UiThreadTest;
+import android.support.transition.test.R;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.animation.LinearInterpolator;
+
+import org.junit.Test;
+
+import java.util.List;
+
+public class TransitionTest extends BaseTest {
+
+    @Test
+    public void testDuration() {
+        Transition transition = new EmptyTransition();
+        long duration = 12345;
+        assertThat(transition.setDuration(duration), is(sameInstance(transition)));
+        assertThat(transition.getDuration(), is(duration));
+    }
+
+    @Test
+    public void testInterpolator() {
+        Transition transition = new EmptyTransition();
+        TimeInterpolator interpolator = new LinearInterpolator();
+        assertThat(transition.setInterpolator(interpolator), is(sameInstance(transition)));
+        assertThat(transition.getInterpolator(), is(interpolator));
+    }
+
+    @Test
+    public void testStartDelay() {
+        Transition transition = new EmptyTransition();
+        long startDelay = 12345;
+        assertThat(transition.setStartDelay(startDelay), is(sameInstance(transition)));
+        assertThat(transition.getStartDelay(), is(startDelay));
+    }
+
+    @Test
+    public void testTargetIds() {
+        Transition transition = new EmptyTransition();
+        assertThat(transition.addTarget(R.id.view0), is(sameInstance(transition)));
+        assertThat(transition.addTarget(R.id.view1), is(sameInstance(transition)));
+        List<Integer> targetIds = transition.getTargetIds();
+        assertThat(targetIds.size(), is(2));
+        assertThat(targetIds, hasItem(R.id.view0));
+        assertThat(targetIds, hasItem(R.id.view1));
+        assertThat(transition.removeTarget(R.id.view0), is(sameInstance(transition)));
+        targetIds = transition.getTargetIds();
+        assertThat(targetIds.size(), is(1));
+        assertThat(targetIds, not(hasItem(R.id.view0)));
+        assertThat(targetIds, hasItem(R.id.view1));
+    }
+
+    @Test
+    @UiThreadTest
+    public void testTargets() {
+        // Set up views
+        TransitionActivity activity = rule.getActivity();
+        ViewGroup root = activity.getRoot();
+        View container = LayoutInflater.from(activity).inflate(R.layout.scene0, root, false);
+        root.addView(container);
+        View view0 = container.findViewById(R.id.view0);
+        View view1 = container.findViewById(R.id.view1);
+        // Test transition targets
+        Transition transition = new EmptyTransition();
+        assertThat(transition.addTarget(view0), is(sameInstance(transition)));
+        assertThat(transition.addTarget(view1), is(sameInstance(transition)));
+        List<View> targets = transition.getTargets();
+        assertThat(targets.size(), is(2));
+        assertThat(targets, hasItem(sameInstance(view0)));
+        assertThat(targets, hasItem(sameInstance(view1)));
+        assertThat(transition.removeTarget(view0), is(sameInstance(transition)));
+        targets = transition.getTargets();
+        assertThat(targets.size(), is(1));
+        assertThat(targets, not(hasItem(sameInstance(view0))));
+        assertThat(targets, hasItem(sameInstance(view1)));
+    }
+
+    @Test
+    public void testListener() {
+        Transition transition = new EmptyTransition();
+        Transition.TransitionListener listener = new EmptyTransitionListener();
+        assertThat(transition.addListener(listener), is(sameInstance(transition)));
+        assertThat(transition.removeListener(listener), is(sameInstance(transition)));
+    }
+
+    public static class EmptyTransition extends Transition {
+
+        public void captureEndValues(TransitionValues transitionValues) {
+        }
+
+        public void captureStartValues(TransitionValues transitionValues) {
+        }
+
+        public Animator createAnimator(ViewGroup sceneRoot, TransitionValues startValues,
+                TransitionValues endValues) {
+            return null;
+        }
+
+    }
+
+    public static class EmptyTransitionListener implements Transition.TransitionListener {
+
+        public void onTransitionStart(Transition transition) {
+        }
+
+        public void onTransitionEnd(Transition transition) {
+        }
+
+        public void onTransitionCancel(Transition transition) {
+        }
+
+        public void onTransitionPause(Transition transition) {
+        }
+
+        public void onTransitionResume(Transition transition) {
+        }
+
+    }
+
+}
diff --git a/v13/Android.mk b/v13/Android.mk
index 4feb7ff..b7f0667 100644
--- a/v13/Android.mk
+++ b/v13/Android.mk
@@ -63,12 +63,3 @@
 LOCAL_JAVA_LANGUAGE_VERSION := 1.7
 include $(BUILD_STATIC_JAVA_LIBRARY)
 
-
-# API Check
-# ---------------------------------------------
-support_module := $(LOCAL_MODULE)
-support_module_api_dir := $(LOCAL_PATH)/api
-support_module_src_files := $(LOCAL_SRC_FILES)
-support_module_java_libraries := $(LOCAL_JAVA_LIBRARIES) android-support-v13
-support_module_java_packages := android.support.v13.*
-include $(SUPPORT_API_CHECK)
diff --git a/v13/api/22.0.0.txt b/v13/api/22.0.0.txt
deleted file mode 100644
index 6b070c5..0000000
--- a/v13/api/22.0.0.txt
+++ /dev/null
@@ -1,32 +0,0 @@
-package android.support.v13.app {
-
-  public class FragmentCompat {
-    ctor public FragmentCompat();
-    method public static void setMenuVisibility(android.app.Fragment, boolean);
-    method public static void setUserVisibleHint(android.app.Fragment, boolean);
-  }
-
-  public abstract class FragmentPagerAdapter extends android.support.v4.view.PagerAdapter {
-    ctor public FragmentPagerAdapter(android.app.FragmentManager);
-    method public abstract android.app.Fragment getItem(int);
-    method public long getItemId(int);
-    method public boolean isViewFromObject(android.view.View, java.lang.Object);
-  }
-
-  public abstract class FragmentStatePagerAdapter extends android.support.v4.view.PagerAdapter {
-    ctor public FragmentStatePagerAdapter(android.app.FragmentManager);
-    method public abstract android.app.Fragment getItem(int);
-    method public boolean isViewFromObject(android.view.View, java.lang.Object);
-  }
-
-  public class FragmentTabHost extends android.widget.TabHost implements android.widget.TabHost.OnTabChangeListener {
-    ctor public FragmentTabHost(android.content.Context);
-    ctor public FragmentTabHost(android.content.Context, android.util.AttributeSet);
-    method public void addTab(android.widget.TabHost.TabSpec, java.lang.Class<?>, android.os.Bundle);
-    method public void onTabChanged(java.lang.String);
-    method public void setup(android.content.Context, android.app.FragmentManager);
-    method public void setup(android.content.Context, android.app.FragmentManager, int);
-  }
-
-}
-
diff --git a/v13/api/22.1.0.txt b/v13/api/22.1.0.txt
deleted file mode 100644
index 6b070c5..0000000
--- a/v13/api/22.1.0.txt
+++ /dev/null
@@ -1,32 +0,0 @@
-package android.support.v13.app {
-
-  public class FragmentCompat {
-    ctor public FragmentCompat();
-    method public static void setMenuVisibility(android.app.Fragment, boolean);
-    method public static void setUserVisibleHint(android.app.Fragment, boolean);
-  }
-
-  public abstract class FragmentPagerAdapter extends android.support.v4.view.PagerAdapter {
-    ctor public FragmentPagerAdapter(android.app.FragmentManager);
-    method public abstract android.app.Fragment getItem(int);
-    method public long getItemId(int);
-    method public boolean isViewFromObject(android.view.View, java.lang.Object);
-  }
-
-  public abstract class FragmentStatePagerAdapter extends android.support.v4.view.PagerAdapter {
-    ctor public FragmentStatePagerAdapter(android.app.FragmentManager);
-    method public abstract android.app.Fragment getItem(int);
-    method public boolean isViewFromObject(android.view.View, java.lang.Object);
-  }
-
-  public class FragmentTabHost extends android.widget.TabHost implements android.widget.TabHost.OnTabChangeListener {
-    ctor public FragmentTabHost(android.content.Context);
-    ctor public FragmentTabHost(android.content.Context, android.util.AttributeSet);
-    method public void addTab(android.widget.TabHost.TabSpec, java.lang.Class<?>, android.os.Bundle);
-    method public void onTabChanged(java.lang.String);
-    method public void setup(android.content.Context, android.app.FragmentManager);
-    method public void setup(android.content.Context, android.app.FragmentManager, int);
-  }
-
-}
-
diff --git a/v13/api/22.2.0.txt b/v13/api/22.2.0.txt
deleted file mode 100644
index 6b070c5..0000000
--- a/v13/api/22.2.0.txt
+++ /dev/null
@@ -1,32 +0,0 @@
-package android.support.v13.app {
-
-  public class FragmentCompat {
-    ctor public FragmentCompat();
-    method public static void setMenuVisibility(android.app.Fragment, boolean);
-    method public static void setUserVisibleHint(android.app.Fragment, boolean);
-  }
-
-  public abstract class FragmentPagerAdapter extends android.support.v4.view.PagerAdapter {
-    ctor public FragmentPagerAdapter(android.app.FragmentManager);
-    method public abstract android.app.Fragment getItem(int);
-    method public long getItemId(int);
-    method public boolean isViewFromObject(android.view.View, java.lang.Object);
-  }
-
-  public abstract class FragmentStatePagerAdapter extends android.support.v4.view.PagerAdapter {
-    ctor public FragmentStatePagerAdapter(android.app.FragmentManager);
-    method public abstract android.app.Fragment getItem(int);
-    method public boolean isViewFromObject(android.view.View, java.lang.Object);
-  }
-
-  public class FragmentTabHost extends android.widget.TabHost implements android.widget.TabHost.OnTabChangeListener {
-    ctor public FragmentTabHost(android.content.Context);
-    ctor public FragmentTabHost(android.content.Context, android.util.AttributeSet);
-    method public void addTab(android.widget.TabHost.TabSpec, java.lang.Class<?>, android.os.Bundle);
-    method public void onTabChanged(java.lang.String);
-    method public void setup(android.content.Context, android.app.FragmentManager);
-    method public void setup(android.content.Context, android.app.FragmentManager, int);
-  }
-
-}
-
diff --git a/v13/api/22.2.1.txt b/v13/api/22.2.1.txt
deleted file mode 100644
index 6b070c5..0000000
--- a/v13/api/22.2.1.txt
+++ /dev/null
@@ -1,32 +0,0 @@
-package android.support.v13.app {
-
-  public class FragmentCompat {
-    ctor public FragmentCompat();
-    method public static void setMenuVisibility(android.app.Fragment, boolean);
-    method public static void setUserVisibleHint(android.app.Fragment, boolean);
-  }
-
-  public abstract class FragmentPagerAdapter extends android.support.v4.view.PagerAdapter {
-    ctor public FragmentPagerAdapter(android.app.FragmentManager);
-    method public abstract android.app.Fragment getItem(int);
-    method public long getItemId(int);
-    method public boolean isViewFromObject(android.view.View, java.lang.Object);
-  }
-
-  public abstract class FragmentStatePagerAdapter extends android.support.v4.view.PagerAdapter {
-    ctor public FragmentStatePagerAdapter(android.app.FragmentManager);
-    method public abstract android.app.Fragment getItem(int);
-    method public boolean isViewFromObject(android.view.View, java.lang.Object);
-  }
-
-  public class FragmentTabHost extends android.widget.TabHost implements android.widget.TabHost.OnTabChangeListener {
-    ctor public FragmentTabHost(android.content.Context);
-    ctor public FragmentTabHost(android.content.Context, android.util.AttributeSet);
-    method public void addTab(android.widget.TabHost.TabSpec, java.lang.Class<?>, android.os.Bundle);
-    method public void onTabChanged(java.lang.String);
-    method public void setup(android.content.Context, android.app.FragmentManager);
-    method public void setup(android.content.Context, android.app.FragmentManager, int);
-  }
-
-}
-
diff --git a/v13/api/23.0.0.txt b/v13/api/23.0.0.txt
deleted file mode 100644
index 36ea6c0..0000000
--- a/v13/api/23.0.0.txt
+++ /dev/null
@@ -1,38 +0,0 @@
-package android.support.v13.app {
-
-  public class FragmentCompat {
-    ctor public FragmentCompat();
-    method public static void requestPermissions(android.app.Fragment, java.lang.String[], int);
-    method public static void setMenuVisibility(android.app.Fragment, boolean);
-    method public static void setUserVisibleHint(android.app.Fragment, boolean);
-    method public static boolean shouldShowRequestPermissionRationale(android.app.Fragment, java.lang.String);
-  }
-
-  public static abstract interface FragmentCompat.OnRequestPermissionsResultCallback {
-    method public abstract void onRequestPermissionsResult(int, java.lang.String[], int[]);
-  }
-
-  public abstract class FragmentPagerAdapter extends android.support.v4.view.PagerAdapter {
-    ctor public FragmentPagerAdapter(android.app.FragmentManager);
-    method public abstract android.app.Fragment getItem(int);
-    method public long getItemId(int);
-    method public boolean isViewFromObject(android.view.View, java.lang.Object);
-  }
-
-  public abstract class FragmentStatePagerAdapter extends android.support.v4.view.PagerAdapter {
-    ctor public FragmentStatePagerAdapter(android.app.FragmentManager);
-    method public abstract android.app.Fragment getItem(int);
-    method public boolean isViewFromObject(android.view.View, java.lang.Object);
-  }
-
-  public class FragmentTabHost extends android.widget.TabHost implements android.widget.TabHost.OnTabChangeListener {
-    ctor public FragmentTabHost(android.content.Context);
-    ctor public FragmentTabHost(android.content.Context, android.util.AttributeSet);
-    method public void addTab(android.widget.TabHost.TabSpec, java.lang.Class<?>, android.os.Bundle);
-    method public void onTabChanged(java.lang.String);
-    method public void setup(android.content.Context, android.app.FragmentManager);
-    method public void setup(android.content.Context, android.app.FragmentManager, int);
-  }
-
-}
-
diff --git a/v13/api/23.1.0.txt b/v13/api/23.1.0.txt
deleted file mode 100644
index 36ea6c0..0000000
--- a/v13/api/23.1.0.txt
+++ /dev/null
@@ -1,38 +0,0 @@
-package android.support.v13.app {
-
-  public class FragmentCompat {
-    ctor public FragmentCompat();
-    method public static void requestPermissions(android.app.Fragment, java.lang.String[], int);
-    method public static void setMenuVisibility(android.app.Fragment, boolean);
-    method public static void setUserVisibleHint(android.app.Fragment, boolean);
-    method public static boolean shouldShowRequestPermissionRationale(android.app.Fragment, java.lang.String);
-  }
-
-  public static abstract interface FragmentCompat.OnRequestPermissionsResultCallback {
-    method public abstract void onRequestPermissionsResult(int, java.lang.String[], int[]);
-  }
-
-  public abstract class FragmentPagerAdapter extends android.support.v4.view.PagerAdapter {
-    ctor public FragmentPagerAdapter(android.app.FragmentManager);
-    method public abstract android.app.Fragment getItem(int);
-    method public long getItemId(int);
-    method public boolean isViewFromObject(android.view.View, java.lang.Object);
-  }
-
-  public abstract class FragmentStatePagerAdapter extends android.support.v4.view.PagerAdapter {
-    ctor public FragmentStatePagerAdapter(android.app.FragmentManager);
-    method public abstract android.app.Fragment getItem(int);
-    method public boolean isViewFromObject(android.view.View, java.lang.Object);
-  }
-
-  public class FragmentTabHost extends android.widget.TabHost implements android.widget.TabHost.OnTabChangeListener {
-    ctor public FragmentTabHost(android.content.Context);
-    ctor public FragmentTabHost(android.content.Context, android.util.AttributeSet);
-    method public void addTab(android.widget.TabHost.TabSpec, java.lang.Class<?>, android.os.Bundle);
-    method public void onTabChanged(java.lang.String);
-    method public void setup(android.content.Context, android.app.FragmentManager);
-    method public void setup(android.content.Context, android.app.FragmentManager, int);
-  }
-
-}
-
diff --git a/v13/api/23.1.1.txt b/v13/api/23.1.1.txt
deleted file mode 100644
index 36ea6c0..0000000
--- a/v13/api/23.1.1.txt
+++ /dev/null
@@ -1,38 +0,0 @@
-package android.support.v13.app {
-
-  public class FragmentCompat {
-    ctor public FragmentCompat();
-    method public static void requestPermissions(android.app.Fragment, java.lang.String[], int);
-    method public static void setMenuVisibility(android.app.Fragment, boolean);
-    method public static void setUserVisibleHint(android.app.Fragment, boolean);
-    method public static boolean shouldShowRequestPermissionRationale(android.app.Fragment, java.lang.String);
-  }
-
-  public static abstract interface FragmentCompat.OnRequestPermissionsResultCallback {
-    method public abstract void onRequestPermissionsResult(int, java.lang.String[], int[]);
-  }
-
-  public abstract class FragmentPagerAdapter extends android.support.v4.view.PagerAdapter {
-    ctor public FragmentPagerAdapter(android.app.FragmentManager);
-    method public abstract android.app.Fragment getItem(int);
-    method public long getItemId(int);
-    method public boolean isViewFromObject(android.view.View, java.lang.Object);
-  }
-
-  public abstract class FragmentStatePagerAdapter extends android.support.v4.view.PagerAdapter {
-    ctor public FragmentStatePagerAdapter(android.app.FragmentManager);
-    method public abstract android.app.Fragment getItem(int);
-    method public boolean isViewFromObject(android.view.View, java.lang.Object);
-  }
-
-  public class FragmentTabHost extends android.widget.TabHost implements android.widget.TabHost.OnTabChangeListener {
-    ctor public FragmentTabHost(android.content.Context);
-    ctor public FragmentTabHost(android.content.Context, android.util.AttributeSet);
-    method public void addTab(android.widget.TabHost.TabSpec, java.lang.Class<?>, android.os.Bundle);
-    method public void onTabChanged(java.lang.String);
-    method public void setup(android.content.Context, android.app.FragmentManager);
-    method public void setup(android.content.Context, android.app.FragmentManager, int);
-  }
-
-}
-
diff --git a/v13/api/current.txt b/v13/api/current.txt
deleted file mode 100644
index e141fe4..0000000
--- a/v13/api/current.txt
+++ /dev/null
@@ -1,69 +0,0 @@
-package android.support.v13.app {
-
-  public class ActivityCompat extends android.support.v4.app.ActivityCompat {
-    method public static android.support.v13.view.DragAndDropPermissionsCompat requestDragAndDropPermissions(android.app.Activity, android.view.DragEvent);
-  }
-
-  public class FragmentCompat {
-    ctor public FragmentCompat();
-    method public static void requestPermissions(android.app.Fragment, java.lang.String[], int);
-    method public static void setMenuVisibility(android.app.Fragment, boolean);
-    method public static void setUserVisibleHint(android.app.Fragment, boolean);
-    method public static boolean shouldShowRequestPermissionRationale(android.app.Fragment, java.lang.String);
-  }
-
-  public static abstract interface FragmentCompat.OnRequestPermissionsResultCallback {
-    method public abstract void onRequestPermissionsResult(int, java.lang.String[], int[]);
-  }
-
-  public abstract class FragmentPagerAdapter extends android.support.v4.view.PagerAdapter {
-    ctor public FragmentPagerAdapter(android.app.FragmentManager);
-    method public abstract android.app.Fragment getItem(int);
-    method public long getItemId(int);
-    method public boolean isViewFromObject(android.view.View, java.lang.Object);
-  }
-
-  public abstract class FragmentStatePagerAdapter extends android.support.v4.view.PagerAdapter {
-    ctor public FragmentStatePagerAdapter(android.app.FragmentManager);
-    method public abstract android.app.Fragment getItem(int);
-    method public boolean isViewFromObject(android.view.View, java.lang.Object);
-  }
-
-  public class FragmentTabHost extends android.widget.TabHost implements android.widget.TabHost.OnTabChangeListener {
-    ctor public FragmentTabHost(android.content.Context);
-    ctor public FragmentTabHost(android.content.Context, android.util.AttributeSet);
-    method public void addTab(android.widget.TabHost.TabSpec, java.lang.Class<?>, android.os.Bundle);
-    method public void onTabChanged(java.lang.String);
-    method public void setup(android.content.Context, android.app.FragmentManager);
-    method public void setup(android.content.Context, android.app.FragmentManager, int);
-  }
-
-}
-
-package android.support.v13.view {
-
-  public final class DragAndDropPermissionsCompat {
-    method public void release();
-  }
-
-  public class DragStartHelper {
-    ctor public DragStartHelper(android.view.View, android.support.v13.view.DragStartHelper.OnDragStartListener);
-    method public void attach();
-    method public void detach();
-    method public void getTouchPosition(android.graphics.Point);
-    method public boolean onLongClick(android.view.View);
-    method public boolean onTouch(android.view.View, android.view.MotionEvent);
-  }
-
-  public static abstract interface DragStartHelper.OnDragStartListener {
-    method public abstract boolean onDragStart(android.view.View, android.support.v13.view.DragStartHelper);
-  }
-
-  public class ViewCompat extends android.support.v4.view.ViewCompat {
-    method public static void cancelDragAndDrop(android.view.View);
-    method public static boolean startDragAndDrop(android.view.View, android.content.ClipData, android.view.View.DragShadowBuilder, java.lang.Object, int);
-    method public static void updateDragShadow(android.view.View, android.view.View.DragShadowBuilder);
-  }
-
-}
-
diff --git a/v13/api/removed.txt b/v13/api/removed.txt
deleted file mode 100644
index e69de29..0000000
--- a/v13/api/removed.txt
+++ /dev/null
diff --git a/v13/java/android/support/v13/app/FragmentCompat.java b/v13/java/android/support/v13/app/FragmentCompat.java
index 3812a97..38e4a48 100644
--- a/v13/java/android/support/v13/app/FragmentCompat.java
+++ b/v13/java/android/support/v13/app/FragmentCompat.java
@@ -40,10 +40,13 @@
     }
 
     static class BaseFragmentCompatImpl implements FragmentCompatImpl {
+        @Override
         public void setMenuVisibility(Fragment f, boolean visible) {
         }
+        @Override
         public void setUserVisibleHint(Fragment f, boolean deferStart) {
         }
+        @Override
         public void requestPermissions(final Fragment fragment, final String[] permissions,
                 final int requestCode) {
             Handler handler = new Handler(Looper.getMainLooper());
@@ -71,6 +74,7 @@
                 }
             });
         }
+        @Override
         public boolean shouldShowRequestPermissionRationale(Fragment fragment, String permission) {
             return false;
         }
diff --git a/v13/java/android/support/v13/app/FragmentPagerAdapter.java b/v13/java/android/support/v13/app/FragmentPagerAdapter.java
index adc08c2..4ea48ab 100644
--- a/v13/java/android/support/v13/app/FragmentPagerAdapter.java
+++ b/v13/java/android/support/v13/app/FragmentPagerAdapter.java
@@ -48,18 +48,18 @@
  * <p>Here is an example implementation of a pager containing fragments of
  * lists:
  *
- * {@sample development/samples/Support13Demos/src/com/example/android/supportv13/app/FragmentPagerSupport.java
+ * {@sample frameworks/support/samples/Support13Demos/src/com/example/android/supportv13/app/FragmentPagerSupport.java
  *      complete}
  *
  * <p>The <code>R.layout.fragment_pager</code> resource of the top-level fragment is:
  *
- * {@sample development/samples/Support13Demos/res/layout/fragment_pager.xml
+ * {@sample frameworks/support/samples/Support13Demos/res/layout/fragment_pager.xml
  *      complete}
  *
  * <p>The <code>R.layout.fragment_pager_list</code> resource containing each
  * individual fragment's layout is:
  *
- * {@sample development/samples/Support13Demos/res/layout/fragment_pager_list.xml
+ * {@sample frameworks/support/samples/Support13Demos/res/layout/fragment_pager_list.xml
  *      complete}
  */
 public abstract class FragmentPagerAdapter extends PagerAdapter {
diff --git a/v13/java/android/support/v13/app/FragmentStatePagerAdapter.java b/v13/java/android/support/v13/app/FragmentStatePagerAdapter.java
index a28f6e8..ca316c9 100644
--- a/v13/java/android/support/v13/app/FragmentStatePagerAdapter.java
+++ b/v13/java/android/support/v13/app/FragmentStatePagerAdapter.java
@@ -51,18 +51,18 @@
  * <p>Here is an example implementation of a pager containing fragments of
  * lists:
  *
- * {@sample development/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentStatePagerSupport.java
+ * {@sample frameworks/support/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentStatePagerSupport.java
  *      complete}
  *
  * <p>The <code>R.layout.fragment_pager</code> resource of the top-level fragment is:
  *
- * {@sample development/samples/Support4Demos/res/layout/fragment_pager.xml
+ * {@sample frameworks/support/samples/Support4Demos/res/layout/fragment_pager.xml
  *      complete}
  *
  * <p>The <code>R.layout.fragment_pager_list</code> resource containing each
  * individual fragment's layout is:
  *
- * {@sample development/samples/Support4Demos/res/layout/fragment_pager_list.xml
+ * {@sample frameworks/support/samples/Support4Demos/res/layout/fragment_pager_list.xml
  *      complete}
  */
 public abstract class FragmentStatePagerAdapter extends PagerAdapter {
diff --git a/v13/java/android/support/v13/app/FragmentTabHost.java b/v13/java/android/support/v13/app/FragmentTabHost.java
index fa1aad2..e4578b4 100644
--- a/v13/java/android/support/v13/app/FragmentTabHost.java
+++ b/v13/java/android/support/v13/app/FragmentTabHost.java
@@ -106,10 +106,12 @@
 
         public static final Parcelable.Creator<SavedState> CREATOR
                 = new Parcelable.Creator<SavedState>() {
+            @Override
             public SavedState createFromParcel(Parcel in) {
                 return new SavedState(in);
             }
 
+            @Override
             public SavedState[] newArray(int size) {
                 return new SavedState[size];
             }
@@ -194,7 +196,7 @@
         mRealTabContent.setId(containerId);
 
         // We must have an ID to be able to save/restore our state.  If
-        // the owner hasn't set one at this point, we will set it ourself.
+        // the owner hasn't set one at this point, we will set it ourselves.
         if (getId() == View.NO_ID) {
             setId(android.R.id.tabhost);
         }
diff --git a/v14/preference/Android.mk b/v14/preference/Android.mk
index a9ff72c..f359486 100644
--- a/v14/preference/Android.mk
+++ b/v14/preference/Android.mk
@@ -43,12 +43,3 @@
 LOCAL_JAVA_LANGUAGE_VERSION := 1.7
 LOCAL_AAPT_FLAGS := --add-javadoc-annotation doconly
 include $(BUILD_STATIC_JAVA_LIBRARY)
-
-# API Check
-# ---------------------------------------------
-support_module := $(LOCAL_MODULE)
-support_module_api_dir := $(LOCAL_PATH)/api
-support_module_src_files := $(LOCAL_SRC_FILES)
-support_module_java_libraries := $(LOCAL_JAVA_LIBRARIES)
-support_module_java_packages := android.support.v14.preference
-include $(SUPPORT_API_CHECK)
diff --git a/v14/preference/api/23.0.0.txt b/v14/preference/api/23.0.0.txt
deleted file mode 100644
index cbf8fe5..0000000
--- a/v14/preference/api/23.0.0.txt
+++ /dev/null
@@ -1,95 +0,0 @@
-package android.support.v14.preference {
-
-  public class EditTextPreferenceDialogFragment extends android.support.v14.preference.PreferenceDialogFragment {
-    ctor public EditTextPreferenceDialogFragment();
-    method public static android.support.v14.preference.EditTextPreferenceDialogFragment newInstance(java.lang.String);
-    method protected void onAddEditTextToDialogView(android.view.View, android.widget.EditText);
-    method public void onDialogClosed(boolean);
-  }
-
-  public class ListPreferenceDialogFragment extends android.support.v14.preference.PreferenceDialogFragment {
-    ctor public ListPreferenceDialogFragment();
-    method public static android.support.v14.preference.ListPreferenceDialogFragment newInstance(java.lang.String);
-    method public void onDialogClosed(boolean);
-  }
-
-  public class MultiSelectListPreference extends android.support.v7.preference.DialogPreference {
-    ctor public MultiSelectListPreference(android.content.Context, android.util.AttributeSet, int, int);
-    ctor public MultiSelectListPreference(android.content.Context, android.util.AttributeSet, int);
-    ctor public MultiSelectListPreference(android.content.Context, android.util.AttributeSet);
-    ctor public MultiSelectListPreference(android.content.Context);
-    method public int findIndexOfValue(java.lang.String);
-    method public java.lang.CharSequence[] getEntries();
-    method public java.lang.CharSequence[] getEntryValues();
-    method protected boolean[] getSelectedItems();
-    method public java.util.Set<java.lang.String> getValues();
-    method public void setEntries(java.lang.CharSequence[]);
-    method public void setEntries(int);
-    method public void setEntryValues(java.lang.CharSequence[]);
-    method public void setEntryValues(int);
-    method public void setValues(java.util.Set<java.lang.String>);
-  }
-
-  public class MultiSelectListPreferenceDialogFragment extends android.support.v14.preference.PreferenceDialogFragment {
-    ctor public MultiSelectListPreferenceDialogFragment();
-    method public static android.support.v14.preference.MultiSelectListPreferenceDialogFragment newInstance(java.lang.String);
-    method public void onDialogClosed(boolean);
-  }
-
-  public abstract class PreferenceDialogFragment extends android.app.DialogFragment implements android.content.DialogInterface.OnClickListener {
-    ctor public PreferenceDialogFragment();
-    method public android.support.v7.preference.DialogPreference getPreference();
-    method protected void onBindDialogView(android.view.View);
-    method public void onClick(android.content.DialogInterface, int);
-    method protected android.view.View onCreateDialogView(android.content.Context);
-    method public abstract void onDialogClosed(boolean);
-    method protected void onPrepareDialogBuilder(android.app.AlertDialog.Builder);
-    field protected static final java.lang.String ARG_KEY = "key";
-  }
-
-  public abstract class PreferenceFragment extends android.app.Fragment implements android.support.v7.preference.PreferenceManager.OnDisplayPreferenceDialogListener android.support.v7.preference.PreferenceManager.OnNavigateToScreenListener android.support.v7.preference.PreferenceManager.OnPreferenceTreeClickListener {
-    ctor public PreferenceFragment();
-    method public void addPreferencesFromResource(int);
-    method public android.support.v7.preference.Preference findPreference(java.lang.CharSequence);
-    method public final android.support.v7.widget.RecyclerView getListView();
-    method public android.support.v7.preference.PreferenceManager getPreferenceManager();
-    method public android.support.v7.preference.PreferenceScreen getPreferenceScreen();
-    method protected android.support.v7.widget.RecyclerView.Adapter onCreateAdapter(android.support.v7.preference.PreferenceScreen);
-    method public android.support.v7.widget.RecyclerView.LayoutManager onCreateLayoutManager();
-    method public abstract void onCreatePreferences(android.os.Bundle, java.lang.String);
-    method public android.support.v7.widget.RecyclerView onCreateRecyclerView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
-    method public void onDisplayPreferenceDialog(android.support.v7.preference.Preference);
-    method public void onNavigateToScreen(android.support.v7.preference.PreferenceScreen);
-    method public boolean onPreferenceTreeClick(android.support.v7.preference.Preference);
-    method public void setPreferenceScreen(android.support.v7.preference.PreferenceScreen);
-    method public void setPreferencesFromResource(int, java.lang.String);
-    field public static final java.lang.String ARG_PREFERENCE_ROOT = "android.support.v7.preference.PreferenceFragmentCompat.PREFERENCE_ROOT";
-  }
-
-  public static abstract interface PreferenceFragment.OnPreferenceDisplayDialogCallback {
-    method public abstract boolean onPreferenceDisplayDialog(android.support.v14.preference.PreferenceFragment, android.support.v7.preference.Preference);
-  }
-
-  public static abstract interface PreferenceFragment.OnPreferenceStartFragmentCallback {
-    method public abstract boolean onPreferenceStartFragment(android.support.v14.preference.PreferenceFragment, android.support.v7.preference.Preference);
-  }
-
-  public static abstract interface PreferenceFragment.OnPreferenceStartScreenCallback {
-    method public abstract boolean onPreferenceStartScreen(android.support.v14.preference.PreferenceFragment, android.support.v7.preference.PreferenceScreen);
-  }
-
-  public class SwitchPreference extends android.support.v7.preference.TwoStatePreference {
-    ctor public SwitchPreference(android.content.Context, android.util.AttributeSet, int, int);
-    ctor public SwitchPreference(android.content.Context, android.util.AttributeSet, int);
-    ctor public SwitchPreference(android.content.Context, android.util.AttributeSet);
-    ctor public SwitchPreference(android.content.Context);
-    method public java.lang.CharSequence getSwitchTextOff();
-    method public java.lang.CharSequence getSwitchTextOn();
-    method public void setSwitchTextOff(java.lang.CharSequence);
-    method public void setSwitchTextOff(int);
-    method public void setSwitchTextOn(java.lang.CharSequence);
-    method public void setSwitchTextOn(int);
-  }
-
-}
-
diff --git a/v14/preference/api/23.1.0.txt b/v14/preference/api/23.1.0.txt
deleted file mode 100644
index fed4623..0000000
--- a/v14/preference/api/23.1.0.txt
+++ /dev/null
@@ -1,94 +0,0 @@
-package android.support.v14.preference {
-
-  public class EditTextPreferenceDialogFragment extends android.support.v14.preference.PreferenceDialogFragment {
-    ctor public EditTextPreferenceDialogFragment();
-    method public static android.support.v14.preference.EditTextPreferenceDialogFragment newInstance(java.lang.String);
-    method public void onDialogClosed(boolean);
-  }
-
-  public class ListPreferenceDialogFragment extends android.support.v14.preference.PreferenceDialogFragment {
-    ctor public ListPreferenceDialogFragment();
-    method public static android.support.v14.preference.ListPreferenceDialogFragment newInstance(java.lang.String);
-    method public void onDialogClosed(boolean);
-  }
-
-  public class MultiSelectListPreference extends android.support.v7.preference.DialogPreference {
-    ctor public MultiSelectListPreference(android.content.Context, android.util.AttributeSet, int, int);
-    ctor public MultiSelectListPreference(android.content.Context, android.util.AttributeSet, int);
-    ctor public MultiSelectListPreference(android.content.Context, android.util.AttributeSet);
-    ctor public MultiSelectListPreference(android.content.Context);
-    method public int findIndexOfValue(java.lang.String);
-    method public java.lang.CharSequence[] getEntries();
-    method public java.lang.CharSequence[] getEntryValues();
-    method protected boolean[] getSelectedItems();
-    method public java.util.Set<java.lang.String> getValues();
-    method public void setEntries(java.lang.CharSequence[]);
-    method public void setEntries(int);
-    method public void setEntryValues(java.lang.CharSequence[]);
-    method public void setEntryValues(int);
-    method public void setValues(java.util.Set<java.lang.String>);
-  }
-
-  public class MultiSelectListPreferenceDialogFragment extends android.support.v14.preference.PreferenceDialogFragment {
-    ctor public MultiSelectListPreferenceDialogFragment();
-    method public static android.support.v14.preference.MultiSelectListPreferenceDialogFragment newInstance(java.lang.String);
-    method public void onDialogClosed(boolean);
-  }
-
-  public abstract class PreferenceDialogFragment extends android.app.DialogFragment implements android.content.DialogInterface.OnClickListener {
-    ctor public PreferenceDialogFragment();
-    method public android.support.v7.preference.DialogPreference getPreference();
-    method protected void onBindDialogView(android.view.View);
-    method public void onClick(android.content.DialogInterface, int);
-    method protected android.view.View onCreateDialogView(android.content.Context);
-    method public abstract void onDialogClosed(boolean);
-    method protected void onPrepareDialogBuilder(android.app.AlertDialog.Builder);
-    field protected static final java.lang.String ARG_KEY = "key";
-  }
-
-  public abstract class PreferenceFragment extends android.app.Fragment implements android.support.v7.preference.PreferenceManager.OnDisplayPreferenceDialogListener android.support.v7.preference.PreferenceManager.OnNavigateToScreenListener android.support.v7.preference.PreferenceManager.OnPreferenceTreeClickListener {
-    ctor public PreferenceFragment();
-    method public void addPreferencesFromResource(int);
-    method public android.support.v7.preference.Preference findPreference(java.lang.CharSequence);
-    method public final android.support.v7.widget.RecyclerView getListView();
-    method public android.support.v7.preference.PreferenceManager getPreferenceManager();
-    method public android.support.v7.preference.PreferenceScreen getPreferenceScreen();
-    method protected android.support.v7.widget.RecyclerView.Adapter onCreateAdapter(android.support.v7.preference.PreferenceScreen);
-    method public android.support.v7.widget.RecyclerView.LayoutManager onCreateLayoutManager();
-    method public abstract void onCreatePreferences(android.os.Bundle, java.lang.String);
-    method public android.support.v7.widget.RecyclerView onCreateRecyclerView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
-    method public void onDisplayPreferenceDialog(android.support.v7.preference.Preference);
-    method public void onNavigateToScreen(android.support.v7.preference.PreferenceScreen);
-    method public boolean onPreferenceTreeClick(android.support.v7.preference.Preference);
-    method public void setPreferenceScreen(android.support.v7.preference.PreferenceScreen);
-    method public void setPreferencesFromResource(int, java.lang.String);
-    field public static final java.lang.String ARG_PREFERENCE_ROOT = "android.support.v7.preference.PreferenceFragmentCompat.PREFERENCE_ROOT";
-  }
-
-  public static abstract interface PreferenceFragment.OnPreferenceDisplayDialogCallback {
-    method public abstract boolean onPreferenceDisplayDialog(android.support.v14.preference.PreferenceFragment, android.support.v7.preference.Preference);
-  }
-
-  public static abstract interface PreferenceFragment.OnPreferenceStartFragmentCallback {
-    method public abstract boolean onPreferenceStartFragment(android.support.v14.preference.PreferenceFragment, android.support.v7.preference.Preference);
-  }
-
-  public static abstract interface PreferenceFragment.OnPreferenceStartScreenCallback {
-    method public abstract boolean onPreferenceStartScreen(android.support.v14.preference.PreferenceFragment, android.support.v7.preference.PreferenceScreen);
-  }
-
-  public class SwitchPreference extends android.support.v7.preference.TwoStatePreference {
-    ctor public SwitchPreference(android.content.Context, android.util.AttributeSet, int, int);
-    ctor public SwitchPreference(android.content.Context, android.util.AttributeSet, int);
-    ctor public SwitchPreference(android.content.Context, android.util.AttributeSet);
-    ctor public SwitchPreference(android.content.Context);
-    method public java.lang.CharSequence getSwitchTextOff();
-    method public java.lang.CharSequence getSwitchTextOn();
-    method public void setSwitchTextOff(java.lang.CharSequence);
-    method public void setSwitchTextOff(int);
-    method public void setSwitchTextOn(java.lang.CharSequence);
-    method public void setSwitchTextOn(int);
-  }
-
-}
-
diff --git a/v14/preference/api/23.1.1.txt b/v14/preference/api/23.1.1.txt
deleted file mode 100644
index fed4623..0000000
--- a/v14/preference/api/23.1.1.txt
+++ /dev/null
@@ -1,94 +0,0 @@
-package android.support.v14.preference {
-
-  public class EditTextPreferenceDialogFragment extends android.support.v14.preference.PreferenceDialogFragment {
-    ctor public EditTextPreferenceDialogFragment();
-    method public static android.support.v14.preference.EditTextPreferenceDialogFragment newInstance(java.lang.String);
-    method public void onDialogClosed(boolean);
-  }
-
-  public class ListPreferenceDialogFragment extends android.support.v14.preference.PreferenceDialogFragment {
-    ctor public ListPreferenceDialogFragment();
-    method public static android.support.v14.preference.ListPreferenceDialogFragment newInstance(java.lang.String);
-    method public void onDialogClosed(boolean);
-  }
-
-  public class MultiSelectListPreference extends android.support.v7.preference.DialogPreference {
-    ctor public MultiSelectListPreference(android.content.Context, android.util.AttributeSet, int, int);
-    ctor public MultiSelectListPreference(android.content.Context, android.util.AttributeSet, int);
-    ctor public MultiSelectListPreference(android.content.Context, android.util.AttributeSet);
-    ctor public MultiSelectListPreference(android.content.Context);
-    method public int findIndexOfValue(java.lang.String);
-    method public java.lang.CharSequence[] getEntries();
-    method public java.lang.CharSequence[] getEntryValues();
-    method protected boolean[] getSelectedItems();
-    method public java.util.Set<java.lang.String> getValues();
-    method public void setEntries(java.lang.CharSequence[]);
-    method public void setEntries(int);
-    method public void setEntryValues(java.lang.CharSequence[]);
-    method public void setEntryValues(int);
-    method public void setValues(java.util.Set<java.lang.String>);
-  }
-
-  public class MultiSelectListPreferenceDialogFragment extends android.support.v14.preference.PreferenceDialogFragment {
-    ctor public MultiSelectListPreferenceDialogFragment();
-    method public static android.support.v14.preference.MultiSelectListPreferenceDialogFragment newInstance(java.lang.String);
-    method public void onDialogClosed(boolean);
-  }
-
-  public abstract class PreferenceDialogFragment extends android.app.DialogFragment implements android.content.DialogInterface.OnClickListener {
-    ctor public PreferenceDialogFragment();
-    method public android.support.v7.preference.DialogPreference getPreference();
-    method protected void onBindDialogView(android.view.View);
-    method public void onClick(android.content.DialogInterface, int);
-    method protected android.view.View onCreateDialogView(android.content.Context);
-    method public abstract void onDialogClosed(boolean);
-    method protected void onPrepareDialogBuilder(android.app.AlertDialog.Builder);
-    field protected static final java.lang.String ARG_KEY = "key";
-  }
-
-  public abstract class PreferenceFragment extends android.app.Fragment implements android.support.v7.preference.PreferenceManager.OnDisplayPreferenceDialogListener android.support.v7.preference.PreferenceManager.OnNavigateToScreenListener android.support.v7.preference.PreferenceManager.OnPreferenceTreeClickListener {
-    ctor public PreferenceFragment();
-    method public void addPreferencesFromResource(int);
-    method public android.support.v7.preference.Preference findPreference(java.lang.CharSequence);
-    method public final android.support.v7.widget.RecyclerView getListView();
-    method public android.support.v7.preference.PreferenceManager getPreferenceManager();
-    method public android.support.v7.preference.PreferenceScreen getPreferenceScreen();
-    method protected android.support.v7.widget.RecyclerView.Adapter onCreateAdapter(android.support.v7.preference.PreferenceScreen);
-    method public android.support.v7.widget.RecyclerView.LayoutManager onCreateLayoutManager();
-    method public abstract void onCreatePreferences(android.os.Bundle, java.lang.String);
-    method public android.support.v7.widget.RecyclerView onCreateRecyclerView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
-    method public void onDisplayPreferenceDialog(android.support.v7.preference.Preference);
-    method public void onNavigateToScreen(android.support.v7.preference.PreferenceScreen);
-    method public boolean onPreferenceTreeClick(android.support.v7.preference.Preference);
-    method public void setPreferenceScreen(android.support.v7.preference.PreferenceScreen);
-    method public void setPreferencesFromResource(int, java.lang.String);
-    field public static final java.lang.String ARG_PREFERENCE_ROOT = "android.support.v7.preference.PreferenceFragmentCompat.PREFERENCE_ROOT";
-  }
-
-  public static abstract interface PreferenceFragment.OnPreferenceDisplayDialogCallback {
-    method public abstract boolean onPreferenceDisplayDialog(android.support.v14.preference.PreferenceFragment, android.support.v7.preference.Preference);
-  }
-
-  public static abstract interface PreferenceFragment.OnPreferenceStartFragmentCallback {
-    method public abstract boolean onPreferenceStartFragment(android.support.v14.preference.PreferenceFragment, android.support.v7.preference.Preference);
-  }
-
-  public static abstract interface PreferenceFragment.OnPreferenceStartScreenCallback {
-    method public abstract boolean onPreferenceStartScreen(android.support.v14.preference.PreferenceFragment, android.support.v7.preference.PreferenceScreen);
-  }
-
-  public class SwitchPreference extends android.support.v7.preference.TwoStatePreference {
-    ctor public SwitchPreference(android.content.Context, android.util.AttributeSet, int, int);
-    ctor public SwitchPreference(android.content.Context, android.util.AttributeSet, int);
-    ctor public SwitchPreference(android.content.Context, android.util.AttributeSet);
-    ctor public SwitchPreference(android.content.Context);
-    method public java.lang.CharSequence getSwitchTextOff();
-    method public java.lang.CharSequence getSwitchTextOn();
-    method public void setSwitchTextOff(java.lang.CharSequence);
-    method public void setSwitchTextOff(int);
-    method public void setSwitchTextOn(java.lang.CharSequence);
-    method public void setSwitchTextOn(int);
-  }
-
-}
-
diff --git a/v14/preference/api/current.txt b/v14/preference/api/current.txt
deleted file mode 100644
index deb017d..0000000
--- a/v14/preference/api/current.txt
+++ /dev/null
@@ -1,98 +0,0 @@
-package android.support.v14.preference {
-
-  public class EditTextPreferenceDialogFragment extends android.support.v14.preference.PreferenceDialogFragment {
-    ctor public EditTextPreferenceDialogFragment();
-    method public static android.support.v14.preference.EditTextPreferenceDialogFragment newInstance(java.lang.String);
-    method public void onDialogClosed(boolean);
-  }
-
-  public class ListPreferenceDialogFragment extends android.support.v14.preference.PreferenceDialogFragment {
-    ctor public ListPreferenceDialogFragment();
-    method public static android.support.v14.preference.ListPreferenceDialogFragment newInstance(java.lang.String);
-    method public void onDialogClosed(boolean);
-  }
-
-  public class MultiSelectListPreference extends android.support.v7.preference.DialogPreference {
-    ctor public MultiSelectListPreference(android.content.Context, android.util.AttributeSet, int, int);
-    ctor public MultiSelectListPreference(android.content.Context, android.util.AttributeSet, int);
-    ctor public MultiSelectListPreference(android.content.Context, android.util.AttributeSet);
-    ctor public MultiSelectListPreference(android.content.Context);
-    method public int findIndexOfValue(java.lang.String);
-    method public java.lang.CharSequence[] getEntries();
-    method public java.lang.CharSequence[] getEntryValues();
-    method protected boolean[] getSelectedItems();
-    method public java.util.Set<java.lang.String> getValues();
-    method public void setEntries(java.lang.CharSequence[]);
-    method public void setEntries(int);
-    method public void setEntryValues(java.lang.CharSequence[]);
-    method public void setEntryValues(int);
-    method public void setValues(java.util.Set<java.lang.String>);
-  }
-
-  public class MultiSelectListPreferenceDialogFragment extends android.support.v14.preference.PreferenceDialogFragment {
-    ctor public MultiSelectListPreferenceDialogFragment();
-    method public static android.support.v14.preference.MultiSelectListPreferenceDialogFragment newInstance(java.lang.String);
-    method public void onDialogClosed(boolean);
-  }
-
-  public abstract class PreferenceDialogFragment extends android.app.DialogFragment implements android.content.DialogInterface.OnClickListener {
-    ctor public PreferenceDialogFragment();
-    method public android.support.v7.preference.DialogPreference getPreference();
-    method protected void onBindDialogView(android.view.View);
-    method public void onClick(android.content.DialogInterface, int);
-    method protected android.view.View onCreateDialogView(android.content.Context);
-    method public abstract void onDialogClosed(boolean);
-    method protected void onPrepareDialogBuilder(android.app.AlertDialog.Builder);
-    field protected static final java.lang.String ARG_KEY = "key";
-  }
-
-  public abstract class PreferenceFragment extends android.app.Fragment implements android.support.v7.preference.PreferenceManager.OnDisplayPreferenceDialogListener android.support.v7.preference.PreferenceManager.OnNavigateToScreenListener android.support.v7.preference.PreferenceManager.OnPreferenceTreeClickListener {
-    ctor public PreferenceFragment();
-    method public void addPreferencesFromResource(int);
-    method public android.support.v7.preference.Preference findPreference(java.lang.CharSequence);
-    method public final android.support.v7.widget.RecyclerView getListView();
-    method public android.support.v7.preference.PreferenceManager getPreferenceManager();
-    method public android.support.v7.preference.PreferenceScreen getPreferenceScreen();
-    method protected android.support.v7.widget.RecyclerView.Adapter onCreateAdapter(android.support.v7.preference.PreferenceScreen);
-    method public android.support.v7.widget.RecyclerView.LayoutManager onCreateLayoutManager();
-    method public abstract void onCreatePreferences(android.os.Bundle, java.lang.String);
-    method public android.support.v7.widget.RecyclerView onCreateRecyclerView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
-    method public void onDisplayPreferenceDialog(android.support.v7.preference.Preference);
-    method public void onNavigateToScreen(android.support.v7.preference.PreferenceScreen);
-    method public boolean onPreferenceTreeClick(android.support.v7.preference.Preference);
-    method public void scrollToPreference(java.lang.String);
-    method public void scrollToPreference(android.support.v7.preference.Preference);
-    method public void setDivider(android.graphics.drawable.Drawable);
-    method public void setDividerHeight(int);
-    method public void setPreferenceScreen(android.support.v7.preference.PreferenceScreen);
-    method public void setPreferencesFromResource(int, java.lang.String);
-    field public static final java.lang.String ARG_PREFERENCE_ROOT = "android.support.v7.preference.PreferenceFragmentCompat.PREFERENCE_ROOT";
-  }
-
-  public static abstract interface PreferenceFragment.OnPreferenceDisplayDialogCallback {
-    method public abstract boolean onPreferenceDisplayDialog(android.support.v14.preference.PreferenceFragment, android.support.v7.preference.Preference);
-  }
-
-  public static abstract interface PreferenceFragment.OnPreferenceStartFragmentCallback {
-    method public abstract boolean onPreferenceStartFragment(android.support.v14.preference.PreferenceFragment, android.support.v7.preference.Preference);
-  }
-
-  public static abstract interface PreferenceFragment.OnPreferenceStartScreenCallback {
-    method public abstract boolean onPreferenceStartScreen(android.support.v14.preference.PreferenceFragment, android.support.v7.preference.PreferenceScreen);
-  }
-
-  public class SwitchPreference extends android.support.v7.preference.TwoStatePreference {
-    ctor public SwitchPreference(android.content.Context, android.util.AttributeSet, int, int);
-    ctor public SwitchPreference(android.content.Context, android.util.AttributeSet, int);
-    ctor public SwitchPreference(android.content.Context, android.util.AttributeSet);
-    ctor public SwitchPreference(android.content.Context);
-    method public java.lang.CharSequence getSwitchTextOff();
-    method public java.lang.CharSequence getSwitchTextOn();
-    method public void setSwitchTextOff(java.lang.CharSequence);
-    method public void setSwitchTextOff(int);
-    method public void setSwitchTextOn(java.lang.CharSequence);
-    method public void setSwitchTextOn(int);
-  }
-
-}
-
diff --git a/v14/preference/api/removed.txt b/v14/preference/api/removed.txt
deleted file mode 100644
index e69de29..0000000
--- a/v14/preference/api/removed.txt
+++ /dev/null
diff --git a/v14/preference/src/android/support/v14/preference/PreferenceFragment.java b/v14/preference/src/android/support/v14/preference/PreferenceFragment.java
index ab4125d..2d090b2 100644
--- a/v14/preference/src/android/support/v14/preference/PreferenceFragment.java
+++ b/v14/preference/src/android/support/v14/preference/PreferenceFragment.java
@@ -100,14 +100,14 @@
  * <p>The following sample code shows a simple preference fragment that is
  * populated from a resource.  The resource it loads is:</p>
  *
- * {@sample development/samples/ApiDemos/res/xml/preferences.xml preferences}
+ * {@sample frameworks/support/samples/SupportPreferenceDemos/res/xml/preferences.xml preferences}
  *
  * <p>The fragment implementation itself simply populates the preferences
  * when created.  Note that the preferences framework takes care of loading
  * the current values out of the app preferences and writing them when changed:</p>
  *
- * {@sample development/samples/ApiDemos/src/com/example/android/apis/preference/FragmentPreferences.java
- *      fragment}
+ * {@sample frameworks/support/samples/SupportPreferenceDemos/src/com/example/android/supportpreference/FragmentSupportPreferences.java
+ *      support_fragment}
  *
  * @see Preference
  * @see PreferenceScreen
diff --git a/v17/leanback/Android.mk b/v17/leanback/Android.mk
index 459d54e..fa19612 100644
--- a/v17/leanback/Android.mk
+++ b/v17/leanback/Android.mk
@@ -28,8 +28,6 @@
 LOCAL_JAVA_LANGUAGE_VERSION := 1.7
 include $(BUILD_STATIC_JAVA_LIBRARY)
 
-support_module_src_files := $(LOCAL_SRC_FILES)
-
 # -----------------------------------------------------------------------
 
 #  Base sub-library contains classes both needed by api-level specific libraries
@@ -41,8 +39,6 @@
 LOCAL_JAVA_LANGUAGE_VERSION := 1.7
 include $(BUILD_STATIC_JAVA_LIBRARY)
 
-support_module_src_files += $(LOCAL_SRC_FILES)
-
 # -----------------------------------------------------------------------
 
 #  A helper sub-library that makes direct use of API 23.
@@ -54,8 +50,6 @@
 LOCAL_JAVA_LANGUAGE_VERSION := 1.7
 include $(BUILD_STATIC_JAVA_LIBRARY)
 
-support_module_src_files += $(LOCAL_SRC_FILES)
-
 # -----------------------------------------------------------------------
 
 #  A helper sub-library that makes direct use of API 21.
@@ -67,8 +61,6 @@
 LOCAL_JAVA_LANGUAGE_VERSION := 1.7
 include $(BUILD_STATIC_JAVA_LIBRARY)
 
-support_module_src_files += $(LOCAL_SRC_FILES)
-
 # -----------------------------------------------------------------------
 
 #  A helper sub-library that makes direct use of KitKat APIs.
@@ -80,8 +72,6 @@
 LOCAL_JAVA_LANGUAGE_VERSION := 1.7
 include $(BUILD_STATIC_JAVA_LIBRARY)
 
-support_module_src_files += $(LOCAL_SRC_FILES)
-
 # -----------------------------------------------------------------------
 
 #  A helper sub-library that makes direct use of JBMR2 APIs.
@@ -93,8 +83,6 @@
 LOCAL_JAVA_LANGUAGE_VERSION := 1.7
 include $(BUILD_STATIC_JAVA_LIBRARY)
 
-support_module_src_files += $(LOCAL_SRC_FILES)
-
 # -----------------------------------------------------------------------
 
 # Here is the final static library that apps can link against.
@@ -128,8 +116,6 @@
 LOCAL_AAPT_FLAGS := --add-javadoc-annotation doconly
 include $(BUILD_STATIC_JAVA_LIBRARY)
 
-support_module_src_files += $(LOCAL_SRC_FILES)
-
 # ===========================================================
 # Common Droiddoc vars
 leanback.docs.src_files := \
@@ -169,14 +155,6 @@
 
 include $(BUILD_DROIDDOC)
 
-# API Check
-# ---------------------------------------------
-support_module := $(LOCAL_MODULE)
-support_module_api_dir := $(LOCAL_PATH)/api
-support_module_java_libraries := $(leanback.docs.java_libraries)
-support_module_java_packages := android.support.v17.leanback*
-include $(SUPPORT_API_CHECK)
-
 # Cleanup temp vars
 # ===========================================================
 leanback.docs.src_files :=
diff --git a/v17/leanback/api/22.0.0.txt b/v17/leanback/api/22.0.0.txt
deleted file mode 100644
index 375f481..0000000
--- a/v17/leanback/api/22.0.0.txt
+++ /dev/null
@@ -1,1410 +0,0 @@
-package android.support.v17.leanback.app {
-
-  public final class BackgroundManager {
-    method public void attach(android.view.Window);
-    method public final int getColor();
-    method public android.graphics.drawable.Drawable getDrawable();
-    method public static android.support.v17.leanback.app.BackgroundManager getInstance(android.app.Activity);
-    method public void release();
-    method public void setBitmap(android.graphics.Bitmap);
-    method public void setColor(int);
-    method public void setDrawable(android.graphics.drawable.Drawable);
-  }
-
-   abstract class BaseRowFragment extends android.app.Fragment {
-    method public final android.support.v17.leanback.widget.ObjectAdapter getAdapter();
-    method public final android.support.v17.leanback.widget.PresenterSelector getPresenterSelector();
-    method public final void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public final void setPresenterSelector(android.support.v17.leanback.widget.PresenterSelector);
-    method public void setSelectedPosition(int);
-    method public void setSelectedPosition(int, boolean);
-  }
-
-   abstract class BaseRowSupportFragment extends android.support.v4.app.Fragment {
-    method public final android.support.v17.leanback.widget.ObjectAdapter getAdapter();
-    method public final android.support.v17.leanback.widget.PresenterSelector getPresenterSelector();
-    method public final void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public final void setPresenterSelector(android.support.v17.leanback.widget.PresenterSelector);
-    method public void setSelectedPosition(int);
-    method public void setSelectedPosition(int, boolean);
-  }
-
-  public class BrowseFragment extends android.app.Fragment {
-    ctor public BrowseFragment();
-    method public static android.os.Bundle createArgs(android.os.Bundle, java.lang.String, int);
-    method public void enableRowScaling(boolean);
-    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
-    method public android.graphics.drawable.Drawable getBadgeDrawable();
-    method public int getBrandColor();
-    method public int getHeadersState();
-    method public deprecated android.support.v17.leanback.widget.OnItemClickedListener getOnItemClickedListener();
-    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public android.support.v17.leanback.widget.OnItemViewSelectedListener getOnItemViewSelectedListener();
-    method public int getSearchAffordanceColor();
-    method public android.support.v17.leanback.widget.SearchOrbView.Colors getSearchAffordanceColors();
-    method public java.lang.String getTitle();
-    method public final boolean isHeadersTransitionOnBackEnabled();
-    method public boolean isInHeadersTransition();
-    method public boolean isShowingHeaders();
-    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
-    method public void setBrandColor(int);
-    method public void setBrowseTransitionListener(android.support.v17.leanback.app.BrowseFragment.BrowseTransitionListener);
-    method public void setHeaderPresenterSelector(android.support.v17.leanback.widget.PresenterSelector);
-    method public void setHeadersState(int);
-    method public final void setHeadersTransitionOnBackEnabled(boolean);
-    method public deprecated void setOnItemClickedListener(android.support.v17.leanback.widget.OnItemClickedListener);
-    method public deprecated void setOnItemSelectedListener(android.support.v17.leanback.widget.OnItemSelectedListener);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public void setOnSearchClickedListener(android.view.View.OnClickListener);
-    method public void setSearchAffordanceColor(int);
-    method public void setSearchAffordanceColors(android.support.v17.leanback.widget.SearchOrbView.Colors);
-    method public void setSelectedPosition(int);
-    method public void setSelectedPosition(int, boolean);
-    method public void setTitle(java.lang.String);
-    method public void startHeadersTransition(boolean);
-    field public static final int HEADERS_DISABLED = 3; // 0x3
-    field public static final int HEADERS_ENABLED = 1; // 0x1
-    field public static final int HEADERS_HIDDEN = 2; // 0x2
-  }
-
-  public static class BrowseFragment.BrowseTransitionListener {
-    ctor public BrowseFragment.BrowseTransitionListener();
-    method public void onHeadersTransitionStart(boolean);
-    method public void onHeadersTransitionStop(boolean);
-  }
-
-  public class BrowseSupportFragment extends android.support.v4.app.Fragment {
-    ctor public BrowseSupportFragment();
-    method public static android.os.Bundle createArgs(android.os.Bundle, java.lang.String, int);
-    method public void enableRowScaling(boolean);
-    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
-    method public android.graphics.drawable.Drawable getBadgeDrawable();
-    method public int getBrandColor();
-    method public int getHeadersState();
-    method public deprecated android.support.v17.leanback.widget.OnItemClickedListener getOnItemClickedListener();
-    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public android.support.v17.leanback.widget.OnItemViewSelectedListener getOnItemViewSelectedListener();
-    method public int getSearchAffordanceColor();
-    method public android.support.v17.leanback.widget.SearchOrbView.Colors getSearchAffordanceColors();
-    method public java.lang.String getTitle();
-    method public final boolean isHeadersTransitionOnBackEnabled();
-    method public boolean isInHeadersTransition();
-    method public boolean isShowingHeaders();
-    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
-    method public void setBrandColor(int);
-    method public void setBrowseTransitionListener(android.support.v17.leanback.app.BrowseSupportFragment.BrowseTransitionListener);
-    method public void setHeaderPresenterSelector(android.support.v17.leanback.widget.PresenterSelector);
-    method public void setHeadersState(int);
-    method public final void setHeadersTransitionOnBackEnabled(boolean);
-    method public deprecated void setOnItemClickedListener(android.support.v17.leanback.widget.OnItemClickedListener);
-    method public deprecated void setOnItemSelectedListener(android.support.v17.leanback.widget.OnItemSelectedListener);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public void setOnSearchClickedListener(android.view.View.OnClickListener);
-    method public void setSearchAffordanceColor(int);
-    method public void setSearchAffordanceColors(android.support.v17.leanback.widget.SearchOrbView.Colors);
-    method public void setSelectedPosition(int);
-    method public void setSelectedPosition(int, boolean);
-    method public void setTitle(java.lang.String);
-    method public void startHeadersTransition(boolean);
-    field public static final int HEADERS_DISABLED = 3; // 0x3
-    field public static final int HEADERS_ENABLED = 1; // 0x1
-    field public static final int HEADERS_HIDDEN = 2; // 0x2
-  }
-
-  public static class BrowseSupportFragment.BrowseTransitionListener {
-    ctor public BrowseSupportFragment.BrowseTransitionListener();
-    method public void onHeadersTransitionStart(boolean);
-    method public void onHeadersTransitionStop(boolean);
-  }
-
-  public class DetailsFragment extends android.app.Fragment {
-    ctor public DetailsFragment();
-    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
-    method public deprecated android.support.v17.leanback.widget.OnItemClickedListener getOnItemClickedListener();
-    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public deprecated void setOnItemClickedListener(android.support.v17.leanback.widget.OnItemClickedListener);
-    method public deprecated void setOnItemSelectedListener(android.support.v17.leanback.widget.OnItemSelectedListener);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public void setSelectedPosition(int);
-    method public void setSelectedPosition(int, boolean);
-  }
-
-  public class DetailsSupportFragment extends android.support.v4.app.Fragment {
-    ctor public DetailsSupportFragment();
-    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
-    method public deprecated android.support.v17.leanback.widget.OnItemClickedListener getOnItemClickedListener();
-    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public deprecated void setOnItemClickedListener(android.support.v17.leanback.widget.OnItemClickedListener);
-    method public deprecated void setOnItemSelectedListener(android.support.v17.leanback.widget.OnItemSelectedListener);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public void setSelectedPosition(int);
-    method public void setSelectedPosition(int, boolean);
-  }
-
-  public class ErrorFragment extends android.app.Fragment {
-    ctor public ErrorFragment();
-    method public android.graphics.drawable.Drawable getBackgroundDrawable();
-    method public android.graphics.drawable.Drawable getBadgeDrawable();
-    method public android.view.View.OnClickListener getButtonClickListener();
-    method public java.lang.String getButtonText();
-    method public android.graphics.drawable.Drawable getImageDrawable();
-    method public java.lang.CharSequence getMessage();
-    method public java.lang.String getTitle();
-    method public boolean isBackgroundTranslucent();
-    method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
-    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
-    method public void setButtonClickListener(android.view.View.OnClickListener);
-    method public void setButtonText(java.lang.String);
-    method public void setDefaultBackground(boolean);
-    method public void setImageDrawable(android.graphics.drawable.Drawable);
-    method public void setMessage(java.lang.CharSequence);
-    method public void setTitle(java.lang.String);
-  }
-
-  public class ErrorSupportFragment extends android.support.v4.app.Fragment {
-    ctor public ErrorSupportFragment();
-    method public android.graphics.drawable.Drawable getBackgroundDrawable();
-    method public android.graphics.drawable.Drawable getBadgeDrawable();
-    method public android.view.View.OnClickListener getButtonClickListener();
-    method public java.lang.String getButtonText();
-    method public android.graphics.drawable.Drawable getImageDrawable();
-    method public java.lang.CharSequence getMessage();
-    method public java.lang.String getTitle();
-    method public boolean isBackgroundTranslucent();
-    method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
-    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
-    method public void setButtonClickListener(android.view.View.OnClickListener);
-    method public void setButtonText(java.lang.String);
-    method public void setDefaultBackground(boolean);
-    method public void setImageDrawable(android.graphics.drawable.Drawable);
-    method public void setMessage(java.lang.CharSequence);
-    method public void setTitle(java.lang.String);
-  }
-
-  public class HeadersFragment extends android.support.v17.leanback.app.BaseRowFragment {
-    ctor public HeadersFragment();
-    method public void setOnHeaderClickedListener(android.support.v17.leanback.app.HeadersFragment.OnHeaderClickedListener);
-    method public void setOnItemSelectedListener(android.support.v17.leanback.widget.OnItemSelectedListener);
-  }
-
-   static abstract interface HeadersFragment.OnHeaderClickedListener {
-    method public abstract void onHeaderClicked();
-  }
-
-  public class HeadersSupportFragment extends android.support.v17.leanback.app.BaseRowSupportFragment {
-    ctor public HeadersSupportFragment();
-    method public void setOnHeaderClickedListener(android.support.v17.leanback.app.HeadersSupportFragment.OnHeaderClickedListener);
-    method public void setOnItemSelectedListener(android.support.v17.leanback.widget.OnItemSelectedListener);
-  }
-
-   static abstract interface HeadersSupportFragment.OnHeaderClickedListener {
-    method public abstract void onHeaderClicked();
-  }
-
-  public abstract class MediaControllerGlue extends android.support.v17.leanback.app.PlaybackControlGlue {
-    ctor public MediaControllerGlue(android.content.Context, android.support.v17.leanback.app.PlaybackOverlayFragment, int[]);
-    ctor public MediaControllerGlue(android.content.Context, android.support.v17.leanback.app.PlaybackOverlayFragment, int[], int[]);
-    method public void attachToMediaController(android.support.v4.media.session.MediaControllerCompat);
-    method public void detach();
-    method public int getCurrentPosition();
-    method public int getCurrentSpeedId();
-    method public android.graphics.drawable.Drawable getMediaArt();
-    method public final android.support.v4.media.session.MediaControllerCompat getMediaController();
-    method public int getMediaDuration();
-    method public java.lang.CharSequence getMediaSubtitle();
-    method public java.lang.CharSequence getMediaTitle();
-    method public long getSupportedActions();
-    method public boolean hasValidMedia();
-    method public boolean isMediaPlaying();
-    method protected void pausePlayback();
-    method protected void skipToNext();
-    method protected void skipToPrevious();
-    method protected void startPlayback(int);
-  }
-
-  public abstract class PlaybackControlGlue {
-    ctor public PlaybackControlGlue(android.content.Context, android.support.v17.leanback.app.PlaybackOverlayFragment, int[]);
-    ctor public PlaybackControlGlue(android.content.Context, android.support.v17.leanback.app.PlaybackOverlayFragment, int[], int[]);
-    method public android.support.v17.leanback.widget.PlaybackControlsRowPresenter createControlsRowAndPresenter();
-    method protected android.support.v17.leanback.widget.SparseArrayObjectAdapter createPrimaryActionsAdapter(android.support.v17.leanback.widget.PresenterSelector);
-    method public void enableProgressUpdating(boolean);
-    method public android.content.Context getContext();
-    method public android.support.v17.leanback.widget.PlaybackControlsRow getControlsRow();
-    method public abstract int getCurrentPosition();
-    method public abstract int getCurrentSpeedId();
-    method public int[] getFastForwardSpeeds();
-    method public android.support.v17.leanback.app.PlaybackOverlayFragment getFragment();
-    method public abstract android.graphics.drawable.Drawable getMediaArt();
-    method public abstract int getMediaDuration();
-    method public abstract java.lang.CharSequence getMediaSubtitle();
-    method public abstract java.lang.CharSequence getMediaTitle();
-    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public int[] getRewindSpeeds();
-    method public abstract long getSupportedActions();
-    method public int getUpdatePeriod();
-    method public abstract boolean hasValidMedia();
-    method public boolean isFadingEnabled();
-    method public abstract boolean isMediaPlaying();
-    method protected void onMetadataChanged();
-    method protected abstract void onRowChanged(android.support.v17.leanback.widget.PlaybackControlsRow);
-    method protected void onStateChanged();
-    method protected abstract void pausePlayback();
-    method public void setControlsRow(android.support.v17.leanback.widget.PlaybackControlsRow);
-    method public void setFadingEnabled(boolean);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method protected abstract void skipToNext();
-    method protected abstract void skipToPrevious();
-    method protected abstract void startPlayback(int);
-    method public void updateProgress();
-    field public static final int ACTION_CUSTOM_LEFT_FIRST = 1; // 0x1
-    field public static final int ACTION_CUSTOM_RIGHT_FIRST = 4096; // 0x1000
-    field public static final int ACTION_FAST_FORWARD = 128; // 0x80
-    field public static final int ACTION_PLAY_PAUSE = 64; // 0x40
-    field public static final int ACTION_REWIND = 32; // 0x20
-    field public static final int ACTION_SKIP_TO_NEXT = 256; // 0x100
-    field public static final int ACTION_SKIP_TO_PREVIOUS = 16; // 0x10
-    field public static final int PLAYBACK_SPEED_FAST_L0 = 10; // 0xa
-    field public static final int PLAYBACK_SPEED_FAST_L1 = 11; // 0xb
-    field public static final int PLAYBACK_SPEED_FAST_L2 = 12; // 0xc
-    field public static final int PLAYBACK_SPEED_FAST_L3 = 13; // 0xd
-    field public static final int PLAYBACK_SPEED_FAST_L4 = 14; // 0xe
-    field public static final int PLAYBACK_SPEED_INVALID = -1; // 0xffffffff
-    field public static final int PLAYBACK_SPEED_NORMAL = 1; // 0x1
-    field public static final int PLAYBACK_SPEED_PAUSED = 0; // 0x0
-  }
-
-  public class PlaybackOverlayFragment extends android.support.v17.leanback.app.DetailsFragment {
-    ctor public PlaybackOverlayFragment();
-    method public int getBackgroundType();
-    method public android.support.v17.leanback.app.PlaybackOverlayFragment.OnFadeCompleteListener getFadeCompleteListener();
-    method public final android.support.v17.leanback.app.PlaybackOverlayFragment.InputEventHandler getInputEventHandler();
-    method public boolean isFadingEnabled();
-    method public void setBackgroundType(int);
-    method public void setFadeCompleteListener(android.support.v17.leanback.app.PlaybackOverlayFragment.OnFadeCompleteListener);
-    method public void setFadingEnabled(boolean);
-    method public final void setInputEventHandler(android.support.v17.leanback.app.PlaybackOverlayFragment.InputEventHandler);
-    method public void tickle();
-    field public static final int BG_DARK = 1; // 0x1
-    field public static final int BG_LIGHT = 2; // 0x2
-    field public static final int BG_NONE = 0; // 0x0
-  }
-
-  public static abstract interface PlaybackOverlayFragment.InputEventHandler {
-    method public abstract boolean handleInputEvent(android.view.InputEvent);
-  }
-
-  public static class PlaybackOverlayFragment.OnFadeCompleteListener {
-    ctor public PlaybackOverlayFragment.OnFadeCompleteListener();
-    method public void onFadeInComplete();
-    method public void onFadeOutComplete();
-  }
-
-  public class PlaybackOverlaySupportFragment extends android.support.v17.leanback.app.DetailsSupportFragment {
-    ctor public PlaybackOverlaySupportFragment();
-    method public int getBackgroundType();
-    method public android.support.v17.leanback.app.PlaybackOverlaySupportFragment.OnFadeCompleteListener getFadeCompleteListener();
-    method public final android.support.v17.leanback.app.PlaybackOverlaySupportFragment.InputEventHandler getInputEventHandler();
-    method public boolean isFadingEnabled();
-    method public void setBackgroundType(int);
-    method public void setFadeCompleteListener(android.support.v17.leanback.app.PlaybackOverlaySupportFragment.OnFadeCompleteListener);
-    method public void setFadingEnabled(boolean);
-    method public final void setInputEventHandler(android.support.v17.leanback.app.PlaybackOverlaySupportFragment.InputEventHandler);
-    method public void tickle();
-    field public static final int BG_DARK = 1; // 0x1
-    field public static final int BG_LIGHT = 2; // 0x2
-    field public static final int BG_NONE = 0; // 0x0
-  }
-
-  public static abstract interface PlaybackOverlaySupportFragment.InputEventHandler {
-    method public abstract boolean handleInputEvent(android.view.InputEvent);
-  }
-
-  public static class PlaybackOverlaySupportFragment.OnFadeCompleteListener {
-    ctor public PlaybackOverlaySupportFragment.OnFadeCompleteListener();
-    method public void onFadeInComplete();
-    method public void onFadeOutComplete();
-  }
-
-  public class RowsFragment extends android.support.v17.leanback.app.BaseRowFragment {
-    ctor public RowsFragment();
-    method public void enableRowScaling(boolean);
-    method protected android.support.v17.leanback.widget.VerticalGridView findGridViewFromRoot(android.view.View);
-    method public deprecated android.support.v17.leanback.widget.OnItemClickedListener getOnItemClickedListener();
-    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public android.support.v17.leanback.widget.OnItemViewSelectedListener getOnItemViewSelectedListener();
-    method public void setExpand(boolean);
-    method public deprecated void setOnItemClickedListener(android.support.v17.leanback.widget.OnItemClickedListener);
-    method public deprecated void setOnItemSelectedListener(android.support.v17.leanback.widget.OnItemSelectedListener);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-  }
-
-  public class RowsSupportFragment extends android.support.v17.leanback.app.BaseRowSupportFragment {
-    ctor public RowsSupportFragment();
-    method public void enableRowScaling(boolean);
-    method protected android.support.v17.leanback.widget.VerticalGridView findGridViewFromRoot(android.view.View);
-    method public deprecated android.support.v17.leanback.widget.OnItemClickedListener getOnItemClickedListener();
-    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public android.support.v17.leanback.widget.OnItemViewSelectedListener getOnItemViewSelectedListener();
-    method public void setExpand(boolean);
-    method public deprecated void setOnItemClickedListener(android.support.v17.leanback.widget.OnItemClickedListener);
-    method public deprecated void setOnItemSelectedListener(android.support.v17.leanback.widget.OnItemSelectedListener);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-  }
-
-  public class SearchFragment extends android.app.Fragment {
-    ctor public SearchFragment();
-    method public static android.os.Bundle createArgs(android.os.Bundle, java.lang.String);
-    method public static android.os.Bundle createArgs(android.os.Bundle, java.lang.String, java.lang.String);
-    method public void displayCompletions(java.util.List<java.lang.String>);
-    method public android.graphics.drawable.Drawable getBadgeDrawable();
-    method public android.content.Intent getRecognizerIntent();
-    method public java.lang.String getTitle();
-    method public static android.support.v17.leanback.app.SearchFragment newInstance(java.lang.String);
-    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
-    method public deprecated void setOnItemClickedListener(android.support.v17.leanback.widget.OnItemClickedListener);
-    method public deprecated void setOnItemSelectedListener(android.support.v17.leanback.widget.OnItemSelectedListener);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public void setSearchQuery(java.lang.String, boolean);
-    method public void setSearchQuery(android.content.Intent, boolean);
-    method public void setSearchResultProvider(android.support.v17.leanback.app.SearchFragment.SearchResultProvider);
-    method public void setSpeechRecognitionCallback(android.support.v17.leanback.widget.SpeechRecognitionCallback);
-    method public void setTitle(java.lang.String);
-    method public void startRecognition();
-  }
-
-  public static abstract interface SearchFragment.SearchResultProvider {
-    method public abstract android.support.v17.leanback.widget.ObjectAdapter getResultsAdapter();
-    method public abstract boolean onQueryTextChange(java.lang.String);
-    method public abstract boolean onQueryTextSubmit(java.lang.String);
-  }
-
-  public class SearchSupportFragment extends android.support.v4.app.Fragment {
-    ctor public SearchSupportFragment();
-    method public static android.os.Bundle createArgs(android.os.Bundle, java.lang.String);
-    method public static android.os.Bundle createArgs(android.os.Bundle, java.lang.String, java.lang.String);
-    method public void displayCompletions(java.util.List<java.lang.String>);
-    method public android.graphics.drawable.Drawable getBadgeDrawable();
-    method public android.content.Intent getRecognizerIntent();
-    method public java.lang.String getTitle();
-    method public static android.support.v17.leanback.app.SearchSupportFragment newInstance(java.lang.String);
-    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
-    method public deprecated void setOnItemClickedListener(android.support.v17.leanback.widget.OnItemClickedListener);
-    method public deprecated void setOnItemSelectedListener(android.support.v17.leanback.widget.OnItemSelectedListener);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public void setSearchQuery(java.lang.String, boolean);
-    method public void setSearchQuery(android.content.Intent, boolean);
-    method public void setSearchResultProvider(android.support.v17.leanback.app.SearchSupportFragment.SearchResultProvider);
-    method public void setSpeechRecognitionCallback(android.support.v17.leanback.widget.SpeechRecognitionCallback);
-    method public void setTitle(java.lang.String);
-    method public void startRecognition();
-  }
-
-  public static abstract interface SearchSupportFragment.SearchResultProvider {
-    method public abstract android.support.v17.leanback.widget.ObjectAdapter getResultsAdapter();
-    method public abstract boolean onQueryTextChange(java.lang.String);
-    method public abstract boolean onQueryTextSubmit(java.lang.String);
-  }
-
-  public class VerticalGridFragment extends android.app.Fragment {
-    ctor public VerticalGridFragment();
-    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
-    method public android.graphics.drawable.Drawable getBadgeDrawable();
-    method public android.support.v17.leanback.widget.VerticalGridPresenter getGridPresenter();
-    method public deprecated android.support.v17.leanback.widget.OnItemClickedListener getOnItemClickedListener();
-    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public int getSearchAffordanceColor();
-    method public android.support.v17.leanback.widget.SearchOrbView.Colors getSearchAffordanceColors();
-    method public java.lang.String getTitle();
-    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
-    method public void setGridPresenter(android.support.v17.leanback.widget.VerticalGridPresenter);
-    method public deprecated void setOnItemClickedListener(android.support.v17.leanback.widget.OnItemClickedListener);
-    method public deprecated void setOnItemSelectedListener(android.support.v17.leanback.widget.OnItemSelectedListener);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public void setOnSearchClickedListener(android.view.View.OnClickListener);
-    method public void setSearchAffordanceColor(int);
-    method public void setSearchAffordanceColors(android.support.v17.leanback.widget.SearchOrbView.Colors);
-    method public void setSelectedPosition(int);
-    method public void setTitle(java.lang.String);
-  }
-
-  public class VerticalGridSupportFragment extends android.support.v4.app.Fragment {
-    ctor public VerticalGridSupportFragment();
-    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
-    method public android.graphics.drawable.Drawable getBadgeDrawable();
-    method public android.support.v17.leanback.widget.VerticalGridPresenter getGridPresenter();
-    method public deprecated android.support.v17.leanback.widget.OnItemClickedListener getOnItemClickedListener();
-    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public int getSearchAffordanceColor();
-    method public android.support.v17.leanback.widget.SearchOrbView.Colors getSearchAffordanceColors();
-    method public java.lang.String getTitle();
-    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
-    method public void setGridPresenter(android.support.v17.leanback.widget.VerticalGridPresenter);
-    method public deprecated void setOnItemClickedListener(android.support.v17.leanback.widget.OnItemClickedListener);
-    method public deprecated void setOnItemSelectedListener(android.support.v17.leanback.widget.OnItemSelectedListener);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public void setOnSearchClickedListener(android.view.View.OnClickListener);
-    method public void setSearchAffordanceColor(int);
-    method public void setSearchAffordanceColors(android.support.v17.leanback.widget.SearchOrbView.Colors);
-    method public void setSelectedPosition(int);
-    method public void setTitle(java.lang.String);
-  }
-
-}
-
-package android.support.v17.leanback.database {
-
-  public abstract class CursorMapper {
-    ctor public CursorMapper();
-    method protected abstract java.lang.Object bind(android.database.Cursor);
-    method protected abstract void bindColumns(android.database.Cursor);
-    method public java.lang.Object convert(android.database.Cursor);
-  }
-
-}
-
-package android.support.v17.leanback.graphics {
-
-  public final class ColorFilterCache {
-    method public static android.support.v17.leanback.graphics.ColorFilterCache getColorFilterCache(int);
-    method public android.graphics.ColorFilter getFilterForLevel(float);
-  }
-
-  public final class ColorFilterDimmer {
-    method public void applyFilterToView(android.view.View);
-    method public static android.support.v17.leanback.graphics.ColorFilterDimmer create(android.support.v17.leanback.graphics.ColorFilterCache, float, float);
-    method public static android.support.v17.leanback.graphics.ColorFilterDimmer createDefault(android.content.Context);
-    method public android.graphics.ColorFilter getColorFilter();
-    method public android.graphics.Paint getPaint();
-    method public void setActiveLevel(float);
-  }
-
-  public final class ColorOverlayDimmer {
-    method public int applyToColor(int);
-    method public static android.support.v17.leanback.graphics.ColorOverlayDimmer createColorOverlayDimmer(int, float, float);
-    method public static android.support.v17.leanback.graphics.ColorOverlayDimmer createDefault(android.content.Context);
-    method public void drawColorOverlay(android.graphics.Canvas, android.view.View, boolean);
-    method public int getAlpha();
-    method public float getAlphaFloat();
-    method public android.graphics.Paint getPaint();
-    method public boolean needsDraw();
-    method public void setActiveLevel(float);
-  }
-
-}
-
-package android.support.v17.leanback.widget {
-
-  public abstract class AbstractDetailsDescriptionPresenter extends android.support.v17.leanback.widget.Presenter {
-    ctor public AbstractDetailsDescriptionPresenter();
-    method protected abstract void onBindDescription(android.support.v17.leanback.widget.AbstractDetailsDescriptionPresenter.ViewHolder, java.lang.Object);
-    method public final void onBindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object);
-    method public final android.support.v17.leanback.widget.AbstractDetailsDescriptionPresenter.ViewHolder onCreateViewHolder(android.view.ViewGroup);
-    method public void onUnbindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
-  }
-
-  public static class AbstractDetailsDescriptionPresenter.ViewHolder extends android.support.v17.leanback.widget.Presenter.ViewHolder {
-    ctor public AbstractDetailsDescriptionPresenter.ViewHolder(android.view.View);
-    method public android.widget.TextView getBody();
-    method public android.widget.TextView getSubtitle();
-    method public android.widget.TextView getTitle();
-  }
-
-  public class Action {
-    ctor public Action(long);
-    ctor public Action(long, java.lang.CharSequence);
-    ctor public Action(long, java.lang.CharSequence, java.lang.CharSequence);
-    ctor public Action(long, java.lang.CharSequence, java.lang.CharSequence, android.graphics.drawable.Drawable);
-    method public final android.graphics.drawable.Drawable getIcon();
-    method public final long getId();
-    method public final java.lang.CharSequence getLabel1();
-    method public final java.lang.CharSequence getLabel2();
-    method public final void setIcon(android.graphics.drawable.Drawable);
-    method public final void setId(long);
-    method public final void setLabel1(java.lang.CharSequence);
-    method public final void setLabel2(java.lang.CharSequence);
-  }
-
-  public class ArrayObjectAdapter extends android.support.v17.leanback.widget.ObjectAdapter {
-    ctor public ArrayObjectAdapter(android.support.v17.leanback.widget.PresenterSelector);
-    ctor public ArrayObjectAdapter(android.support.v17.leanback.widget.Presenter);
-    ctor public ArrayObjectAdapter();
-    method public void add(java.lang.Object);
-    method public void add(int, java.lang.Object);
-    method public void addAll(int, java.util.Collection);
-    method public void clear();
-    method public java.lang.Object get(int);
-    method public int indexOf(java.lang.Object);
-    method public void notifyArrayItemRangeChanged(int, int);
-    method public boolean remove(java.lang.Object);
-    method public int removeItems(int, int);
-    method public void replace(int, java.lang.Object);
-    method public int size();
-  }
-
-  public class BaseCardView extends android.widget.FrameLayout {
-    ctor public BaseCardView(android.content.Context);
-    ctor public BaseCardView(android.content.Context, android.util.AttributeSet);
-    ctor public BaseCardView(android.content.Context, android.util.AttributeSet, int);
-    method public int getCardType();
-    method public int getExtraVisibility();
-    method public int getInfoVisibility();
-    method public boolean isSelectedAnimationDelayed();
-    method public void setCardType(int);
-    method public void setExtraVisibility(int);
-    method public void setInfoVisibility(int);
-    method public void setSelectedAnimationDelayed(boolean);
-    field public static final int CARD_REGION_VISIBLE_ACTIVATED = 1; // 0x1
-    field public static final int CARD_REGION_VISIBLE_ALWAYS = 0; // 0x0
-    field public static final int CARD_REGION_VISIBLE_SELECTED = 2; // 0x2
-    field public static final int CARD_TYPE_INFO_OVER = 1; // 0x1
-    field public static final int CARD_TYPE_INFO_UNDER = 2; // 0x2
-    field public static final int CARD_TYPE_INFO_UNDER_WITH_EXTRA = 3; // 0x3
-    field public static final int CARD_TYPE_MAIN_ONLY = 0; // 0x0
-  }
-
-  public static class BaseCardView.LayoutParams extends android.widget.FrameLayout.LayoutParams {
-    ctor public BaseCardView.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public BaseCardView.LayoutParams(int, int);
-    ctor public BaseCardView.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public BaseCardView.LayoutParams(android.support.v17.leanback.widget.BaseCardView.LayoutParams);
-    field public static final int VIEW_TYPE_EXTRA = 2; // 0x2
-    field public static final int VIEW_TYPE_INFO = 1; // 0x1
-    field public static final int VIEW_TYPE_MAIN = 0; // 0x0
-    field public int viewType;
-  }
-
-   abstract class BaseGridView extends android.support.v7.widget.RecyclerView {
-    ctor public BaseGridView(android.content.Context, android.util.AttributeSet, int);
-    method public boolean dispatchGenericFocusedEvent(android.view.MotionEvent);
-    method public int getChildDrawingOrder(int, int);
-    method public int getFocusScrollStrategy();
-    method public int getHorizontalMargin();
-    method public int getItemAlignmentOffset();
-    method public float getItemAlignmentOffsetPercent();
-    method public int getItemAlignmentViewId();
-    method public final int getSaveChildrenLimitNumber();
-    method public final int getSaveChildrenPolicy();
-    method public int getSelectedPosition();
-    method public int getVerticalMargin();
-    method public void getViewSelectedOffsets(android.view.View, int[]);
-    method public int getWindowAlignment();
-    method public int getWindowAlignmentOffset();
-    method public float getWindowAlignmentOffsetPercent();
-    method public boolean hasPreviousViewInSameRow(int);
-    method protected void initBaseGridViewAttributes(android.content.Context, android.util.AttributeSet);
-    method public boolean isChildLayoutAnimated();
-    method public boolean isFocusDrawingOrderEnabled();
-    method public final boolean isFocusSearchDisabled();
-    method public boolean isItemAlignmentOffsetWithPadding();
-    method public boolean isScrollEnabled();
-    method public boolean onRequestFocusInDescendants(int, android.graphics.Rect);
-    method public void setAnimateChildLayout(boolean);
-    method public void setChildrenVisibility(int);
-    method public void setFocusDrawingOrderEnabled(boolean);
-    method public void setFocusScrollStrategy(int);
-    method public final void setFocusSearchDisabled(boolean);
-    method public void setGravity(int);
-    method public void setHasOverlappingRendering(boolean);
-    method public void setHorizontalMargin(int);
-    method public void setItemAlignmentOffset(int);
-    method public void setItemAlignmentOffsetPercent(float);
-    method public void setItemAlignmentOffsetWithPadding(boolean);
-    method public void setItemAlignmentViewId(int);
-    method public void setItemMargin(int);
-    method public void setLayoutEnabled(boolean);
-    method public void setOnChildSelectedListener(android.support.v17.leanback.widget.OnChildSelectedListener);
-    method public void setOnKeyInterceptListener(android.support.v17.leanback.widget.BaseGridView.OnKeyInterceptListener);
-    method public void setOnMotionInterceptListener(android.support.v17.leanback.widget.BaseGridView.OnMotionInterceptListener);
-    method public void setOnTouchInterceptListener(android.support.v17.leanback.widget.BaseGridView.OnTouchInterceptListener);
-    method public void setPruneChild(boolean);
-    method public final void setSaveChildrenLimitNumber(int);
-    method public final void setSaveChildrenPolicy(int);
-    method public void setScrollEnabled(boolean);
-    method public void setSelectedPosition(int);
-    method public void setSelectedPositionSmooth(int);
-    method public void setVerticalMargin(int);
-    method public void setWindowAlignment(int);
-    method public void setWindowAlignmentOffset(int);
-    method public void setWindowAlignmentOffsetPercent(float);
-    field public static final int FOCUS_SCROLL_ALIGNED = 0; // 0x0
-    field public static final int FOCUS_SCROLL_ITEM = 1; // 0x1
-    field public static final int FOCUS_SCROLL_PAGE = 2; // 0x2
-    field public static final float ITEM_ALIGN_OFFSET_PERCENT_DISABLED = -1.0f;
-    field public static final int SAVE_ALL_CHILD = 3; // 0x3
-    field public static final int SAVE_LIMITED_CHILD = 2; // 0x2
-    field public static final int SAVE_NO_CHILD = 0; // 0x0
-    field public static final int SAVE_ON_SCREEN_CHILD = 1; // 0x1
-    field public static final int WINDOW_ALIGN_BOTH_EDGE = 3; // 0x3
-    field public static final int WINDOW_ALIGN_HIGH_EDGE = 2; // 0x2
-    field public static final int WINDOW_ALIGN_LOW_EDGE = 1; // 0x1
-    field public static final int WINDOW_ALIGN_NO_EDGE = 0; // 0x0
-    field public static final float WINDOW_ALIGN_OFFSET_PERCENT_DISABLED = -1.0f;
-    field protected final android.support.v17.leanback.widget.GridLayoutManager mLayoutManager;
-  }
-
-  public static abstract interface BaseGridView.OnKeyInterceptListener {
-    method public abstract boolean onInterceptKeyEvent(android.view.KeyEvent);
-  }
-
-  public static abstract interface BaseGridView.OnMotionInterceptListener {
-    method public abstract boolean onInterceptMotionEvent(android.view.MotionEvent);
-  }
-
-  public static abstract interface BaseGridView.OnTouchInterceptListener {
-    method public abstract boolean onInterceptTouchEvent(android.view.MotionEvent);
-  }
-
-  public final class ClassPresenterSelector extends android.support.v17.leanback.widget.PresenterSelector {
-    ctor public ClassPresenterSelector();
-    method public void addClassPresenter(java.lang.Class<?>, android.support.v17.leanback.widget.Presenter);
-    method public android.support.v17.leanback.widget.Presenter getPresenter(java.lang.Object);
-  }
-
-  public class ControlButtonPresenterSelector extends android.support.v17.leanback.widget.PresenterSelector {
-    ctor public ControlButtonPresenterSelector();
-    method public android.support.v17.leanback.widget.Presenter getPresenter(java.lang.Object);
-    method public android.support.v17.leanback.widget.Presenter getPrimaryPresenter();
-    method public android.support.v17.leanback.widget.Presenter getSecondaryPresenter();
-  }
-
-  public class CursorObjectAdapter extends android.support.v17.leanback.widget.ObjectAdapter {
-    ctor public CursorObjectAdapter(android.support.v17.leanback.widget.PresenterSelector);
-    ctor public CursorObjectAdapter(android.support.v17.leanback.widget.Presenter);
-    ctor public CursorObjectAdapter();
-    method public void changeCursor(android.database.Cursor);
-    method public void close();
-    method public java.lang.Object get(int);
-    method public final android.database.Cursor getCursor();
-    method public final android.support.v17.leanback.database.CursorMapper getMapper();
-    method protected final void invalidateCache(int);
-    method protected final void invalidateCache(int, int);
-    method public boolean isClosed();
-    method protected void onCursorChanged();
-    method protected void onMapperChanged();
-    method public final void setMapper(android.support.v17.leanback.database.CursorMapper);
-    method public int size();
-    method public android.database.Cursor swapCursor(android.database.Cursor);
-  }
-
-  public class DetailsOverviewRow extends android.support.v17.leanback.widget.Row {
-    ctor public DetailsOverviewRow(java.lang.Object);
-    method public final void addAction(android.support.v17.leanback.widget.Action);
-    method public final void addAction(int, android.support.v17.leanback.widget.Action);
-    method public final java.util.List<android.support.v17.leanback.widget.Action> getActions();
-    method public final android.graphics.drawable.Drawable getImageDrawable();
-    method public final java.lang.Object getItem();
-    method public boolean isImageScaleUpAllowed();
-    method public final boolean removeAction(android.support.v17.leanback.widget.Action);
-    method public final void setImageBitmap(android.content.Context, android.graphics.Bitmap);
-    method public final void setImageDrawable(android.graphics.drawable.Drawable);
-    method public void setImageScaleUpAllowed(boolean);
-  }
-
-  public class DetailsOverviewRowPresenter extends android.support.v17.leanback.widget.RowPresenter {
-    ctor public DetailsOverviewRowPresenter(android.support.v17.leanback.widget.Presenter);
-    method protected android.support.v17.leanback.widget.RowPresenter.ViewHolder createRowViewHolder(android.view.ViewGroup);
-    method public int getBackgroundColor();
-    method public android.support.v17.leanback.widget.OnActionClickedListener getOnActionClickedListener();
-    method public boolean isStyleLarge();
-    method public final boolean isUsingDefaultSelectEffect();
-    method public void setBackgroundColor(int);
-    method public void setOnActionClickedListener(android.support.v17.leanback.widget.OnActionClickedListener);
-    method public final void setSharedElementEnterTransition(android.app.Activity, java.lang.String, long);
-    method public final void setSharedElementEnterTransition(android.app.Activity, java.lang.String);
-    method public void setStyleLarge(boolean);
-  }
-
-  public final class DetailsOverviewRowPresenter.ViewHolder extends android.support.v17.leanback.widget.RowPresenter.ViewHolder {
-    ctor public DetailsOverviewRowPresenter.ViewHolder(android.view.View, android.support.v17.leanback.widget.Presenter);
-    field public final android.support.v17.leanback.widget.Presenter.ViewHolder mDetailsDescriptionViewHolder;
-  }
-
-  public abstract interface FocusHighlight {
-    field public static final int ZOOM_FACTOR_LARGE = 3; // 0x3
-    field public static final int ZOOM_FACTOR_MEDIUM = 2; // 0x2
-    field public static final int ZOOM_FACTOR_NONE = 0; // 0x0
-    field public static final int ZOOM_FACTOR_SMALL = 1; // 0x1
-  }
-
-  public class FocusHighlightHelper {
-    ctor public FocusHighlightHelper();
-    method public static void setupBrowseItemFocusHighlight(android.support.v17.leanback.widget.ItemBridgeAdapter, int, boolean);
-    method public static void setupHeaderItemFocusHighlight(android.support.v17.leanback.widget.VerticalGridView);
-  }
-
-   final class GridLayoutManager extends android.support.v7.widget.RecyclerView.LayoutManager {
-    ctor public GridLayoutManager(android.support.v17.leanback.widget.BaseGridView);
-    method protected void fastRelayout(boolean);
-    method public android.support.v7.widget.RecyclerView.LayoutParams generateDefaultLayoutParams();
-    method public int getFocusScrollStrategy();
-    method public int getHorizontalMargin();
-    method public int getItemAlignmentOffset();
-    method public float getItemAlignmentOffsetPercent();
-    method public int getItemAlignmentViewId();
-    method public boolean getPruneChild();
-    method public int getSelection();
-    method public int getVerticalMargin();
-    method protected android.view.View getViewForPosition(int);
-    method public void getViewSelectedOffsets(android.view.View, int[]);
-    method public int getWindowAlignment();
-    method public int getWindowAlignmentOffset();
-    method public float getWindowAlignmentOffsetPercent();
-    method protected boolean hasDoneFirstLayout();
-    method public boolean isItemAlignmentOffsetWithPadding();
-    method public boolean isScrollEnabled();
-    method public void onRtlPropertiesChanged(int);
-    method public void setFocusOutAllowed(boolean, boolean);
-    method public void setFocusScrollStrategy(int);
-    method public void setGravity(int);
-    method public void setHorizontalMargin(int);
-    method public void setItemAlignmentOffset(int);
-    method public void setItemAlignmentOffsetPercent(float);
-    method public void setItemAlignmentOffsetWithPadding(boolean);
-    method public void setItemAlignmentViewId(int);
-    method public void setItemMargin(int);
-    method public void setLayoutEnabled(boolean);
-    method public void setNumRows(int);
-    method public void setOnChildSelectedListener(android.support.v17.leanback.widget.OnChildSelectedListener);
-    method public void setOrientation(int);
-    method public void setPruneChild(boolean);
-    method public void setRowHeight(int);
-    method public void setScrollEnabled(boolean);
-    method public void setSelection(android.support.v7.widget.RecyclerView, int);
-    method public void setSelection(android.support.v7.widget.RecyclerView, int, boolean);
-    method public void setSelectionSmooth(android.support.v7.widget.RecyclerView, int);
-    method public void setVerticalMargin(int);
-    method public void setWindowAlignment(int);
-    method public void setWindowAlignmentOffset(int);
-    method public void setWindowAlignmentOffsetPercent(float);
-  }
-
-  public class HeaderItem {
-    ctor public HeaderItem(long, java.lang.String);
-    ctor public HeaderItem(java.lang.String);
-    method public final long getId();
-    method public final java.lang.String getName();
-  }
-
-  public class HorizontalGridView extends android.support.v7.widget.RecyclerView {
-    ctor public HorizontalGridView(android.content.Context);
-    ctor public HorizontalGridView(android.content.Context, android.util.AttributeSet);
-    ctor public HorizontalGridView(android.content.Context, android.util.AttributeSet, int);
-    method public final boolean getFadingLeftEdge();
-    method public final int getFadingLeftEdgeLength();
-    method public final int getFadingLeftEdgeOffset();
-    method public final boolean getFadingRightEdge();
-    method public final int getFadingRightEdgeLength();
-    method public final int getFadingRightEdgeOffset();
-    method protected void initAttributes(android.content.Context, android.util.AttributeSet);
-    method public final void setFadingLeftEdge(boolean);
-    method public final void setFadingLeftEdgeLength(int);
-    method public final void setFadingLeftEdgeOffset(int);
-    method public final void setFadingRightEdge(boolean);
-    method public final void setFadingRightEdgeLength(int);
-    method public final void setFadingRightEdgeOffset(int);
-    method public void setNumRows(int);
-    method public void setRowHeight(int);
-  }
-
-  public final class HorizontalHoverCardSwitcher extends android.support.v17.leanback.widget.PresenterSwitcher {
-    ctor public HorizontalHoverCardSwitcher();
-    method protected void insertView(android.view.View);
-    method public void select(android.support.v17.leanback.widget.HorizontalGridView, android.view.View, java.lang.Object);
-  }
-
-  public class ImageCardView extends android.support.v17.leanback.widget.BaseCardView {
-    ctor public ImageCardView(android.content.Context);
-    ctor public ImageCardView(android.content.Context, android.util.AttributeSet);
-    ctor public ImageCardView(android.content.Context, android.util.AttributeSet, int);
-    method public android.graphics.drawable.Drawable getBadgeImage();
-    method public java.lang.CharSequence getContentText();
-    method public android.graphics.drawable.Drawable getInfoAreaBackground();
-    method public android.graphics.drawable.Drawable getMainImage();
-    method public final android.widget.ImageView getMainImageView();
-    method public java.lang.CharSequence getTitleText();
-    method public void setBadgeImage(android.graphics.drawable.Drawable);
-    method public void setContentText(java.lang.CharSequence);
-    method public void setInfoAreaBackground(android.graphics.drawable.Drawable);
-    method public void setInfoAreaBackgroundColor(int);
-    method public void setMainImage(android.graphics.drawable.Drawable);
-    method public void setMainImage(android.graphics.drawable.Drawable, boolean);
-    method public void setMainImageAdjustViewBounds(boolean);
-    method public void setMainImageDimensions(int, int);
-    method public void setMainImageScaleType(android.widget.ImageView.ScaleType);
-    method public void setTitleText(java.lang.CharSequence);
-  }
-
-  public class ItemBridgeAdapter extends android.support.v7.widget.RecyclerView.Adapter {
-    ctor public ItemBridgeAdapter(android.support.v17.leanback.widget.ObjectAdapter, android.support.v17.leanback.widget.PresenterSelector);
-    ctor public ItemBridgeAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    ctor public ItemBridgeAdapter();
-    method public void clear();
-    method public int getItemCount();
-    method public java.util.ArrayList<android.support.v17.leanback.widget.Presenter> getPresenterMapper();
-    method public android.support.v17.leanback.widget.ItemBridgeAdapter.Wrapper getWrapper();
-    method public void onBindViewHolder(android.support.v7.widget.RecyclerView.ViewHolder, int);
-    method public android.support.v7.widget.RecyclerView.ViewHolder onCreateViewHolder(android.view.ViewGroup, int);
-    method public void onViewAttachedToWindow(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void onViewDetachedFromWindow(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void onViewRecycled(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public void setAdapterListener(android.support.v17.leanback.widget.ItemBridgeAdapter.AdapterListener);
-    method public void setPresenterMapper(java.util.ArrayList<android.support.v17.leanback.widget.Presenter>);
-    method public void setWrapper(android.support.v17.leanback.widget.ItemBridgeAdapter.Wrapper);
-  }
-
-  public static class ItemBridgeAdapter.AdapterListener {
-    ctor public ItemBridgeAdapter.AdapterListener();
-    method public void onAddPresenter(android.support.v17.leanback.widget.Presenter, int);
-    method public void onAttachedToWindow(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
-    method public void onBind(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
-    method public void onCreate(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
-    method public void onDetachedFromWindow(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
-    method public void onUnbind(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
-  }
-
-  public class ItemBridgeAdapter.ViewHolder extends android.support.v7.widget.RecyclerView.ViewHolder {
-    method public final java.lang.Object getExtraObject();
-    method public final java.lang.Object getItem();
-    method public final android.support.v17.leanback.widget.Presenter getPresenter();
-    method public final android.support.v17.leanback.widget.Presenter.ViewHolder getViewHolder();
-    method public void setExtraObject(java.lang.Object);
-  }
-
-  public static abstract class ItemBridgeAdapter.Wrapper {
-    ctor public ItemBridgeAdapter.Wrapper();
-    method public abstract android.view.View createWrapper(android.view.View);
-    method public abstract void wrap(android.view.View, android.view.View);
-  }
-
-  public class ListRow extends android.support.v17.leanback.widget.Row {
-    ctor public ListRow(android.support.v17.leanback.widget.HeaderItem, android.support.v17.leanback.widget.ObjectAdapter);
-    ctor public ListRow(long, android.support.v17.leanback.widget.HeaderItem, android.support.v17.leanback.widget.ObjectAdapter);
-    ctor public ListRow(android.support.v17.leanback.widget.ObjectAdapter);
-    method public final android.support.v17.leanback.widget.ObjectAdapter getAdapter();
-  }
-
-  public final class ListRowHoverCardView extends android.widget.LinearLayout {
-    ctor public ListRowHoverCardView(android.content.Context);
-    ctor public ListRowHoverCardView(android.content.Context, android.util.AttributeSet);
-    ctor public ListRowHoverCardView(android.content.Context, android.util.AttributeSet, int);
-    method public final java.lang.CharSequence getDescription();
-    method public final java.lang.CharSequence getTitle();
-    method public final void setDescription(java.lang.CharSequence);
-    method public final void setTitle(java.lang.CharSequence);
-  }
-
-  public class ListRowPresenter extends android.support.v17.leanback.widget.RowPresenter {
-    ctor public ListRowPresenter();
-    ctor public ListRowPresenter(int);
-    method public final boolean areChildRoundedCornersEnabled();
-    method protected android.support.v17.leanback.widget.RowPresenter.ViewHolder createRowViewHolder(android.view.ViewGroup);
-    method public final void enableChildRoundedCorners(boolean);
-    method public int getExpandedRowHeight();
-    method public final android.support.v17.leanback.widget.PresenterSelector getHoverCardPresenterSelector();
-    method public int getRecycledPoolSize(android.support.v17.leanback.widget.Presenter);
-    method public int getRowHeight();
-    method public final boolean getShadowEnabled();
-    method public final int getZoomFactor();
-    method public boolean isUsingDefaultListSelectEffect();
-    method public final boolean isUsingDefaultSelectEffect();
-    method public boolean isUsingDefaultShadow();
-    method public boolean isUsingZOrder();
-    method public void setExpandedRowHeight(int);
-    method public final void setHoverCardPresenterSelector(android.support.v17.leanback.widget.PresenterSelector);
-    method public void setRecycledPoolSize(android.support.v17.leanback.widget.Presenter, int);
-    method public void setRowHeight(int);
-    method public final void setShadowEnabled(boolean);
-  }
-
-  public static class ListRowPresenter.ViewHolder extends android.support.v17.leanback.widget.RowPresenter.ViewHolder {
-    ctor public ListRowPresenter.ViewHolder(android.view.View, android.support.v17.leanback.widget.HorizontalGridView, android.support.v17.leanback.widget.ListRowPresenter);
-    method public final android.support.v17.leanback.widget.ItemBridgeAdapter getBridgeAdapter();
-    method public final android.support.v17.leanback.widget.HorizontalGridView getGridView();
-    method public final android.support.v17.leanback.widget.ListRowPresenter getListRowPresenter();
-  }
-
-  public final class ListRowView extends android.widget.LinearLayout {
-    ctor public ListRowView(android.content.Context);
-    ctor public ListRowView(android.content.Context, android.util.AttributeSet);
-    ctor public ListRowView(android.content.Context, android.util.AttributeSet, int);
-    method public android.support.v17.leanback.widget.HorizontalGridView getGridView();
-  }
-
-  public abstract class ObjectAdapter {
-    ctor public ObjectAdapter(android.support.v17.leanback.widget.PresenterSelector);
-    ctor public ObjectAdapter(android.support.v17.leanback.widget.Presenter);
-    ctor public ObjectAdapter();
-    method public abstract java.lang.Object get(int);
-    method public long getId(int);
-    method public final android.support.v17.leanback.widget.Presenter getPresenter(java.lang.Object);
-    method public final android.support.v17.leanback.widget.PresenterSelector getPresenterSelector();
-    method public final boolean hasStableIds();
-    method protected final void notifyChanged();
-    method protected final void notifyItemRangeChanged(int, int);
-    method protected final void notifyItemRangeInserted(int, int);
-    method protected final void notifyItemRangeRemoved(int, int);
-    method protected void onHasStableIdsChanged();
-    method protected void onPresenterSelectorChanged();
-    method public final void registerObserver(android.support.v17.leanback.widget.ObjectAdapter.DataObserver);
-    method public final void setHasStableIds(boolean);
-    method public final void setPresenterSelector(android.support.v17.leanback.widget.PresenterSelector);
-    method public abstract int size();
-    method public final void unregisterAllObservers();
-    method public final void unregisterObserver(android.support.v17.leanback.widget.ObjectAdapter.DataObserver);
-    field public static final int NO_ID = -1; // 0xffffffff
-  }
-
-  public static abstract class ObjectAdapter.DataObserver {
-    ctor public ObjectAdapter.DataObserver();
-    method public void onChanged();
-    method public void onItemRangeChanged(int, int);
-    method public void onItemRangeInserted(int, int);
-    method public void onItemRangeRemoved(int, int);
-  }
-
-  public abstract interface OnActionClickedListener {
-    method public abstract void onActionClicked(android.support.v17.leanback.widget.Action);
-  }
-
-  public abstract interface OnChildSelectedListener {
-    method public abstract void onChildSelected(android.view.ViewGroup, android.view.View, int, long);
-  }
-
-  public abstract deprecated interface OnItemClickedListener {
-    method public abstract void onItemClicked(java.lang.Object, android.support.v17.leanback.widget.Row);
-  }
-
-  public abstract deprecated interface OnItemSelectedListener {
-    method public abstract void onItemSelected(java.lang.Object, android.support.v17.leanback.widget.Row);
-  }
-
-  public abstract interface OnItemViewClickedListener {
-    method public abstract void onItemClicked(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object, android.support.v17.leanback.widget.RowPresenter.ViewHolder, android.support.v17.leanback.widget.Row);
-  }
-
-  public abstract interface OnItemViewSelectedListener {
-    method public abstract void onItemSelected(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object, android.support.v17.leanback.widget.RowPresenter.ViewHolder, android.support.v17.leanback.widget.Row);
-  }
-
-  public class PlaybackControlsRow extends android.support.v17.leanback.widget.Row {
-    ctor public PlaybackControlsRow(java.lang.Object);
-    ctor public PlaybackControlsRow();
-    method public int getBufferedProgress();
-    method public int getCurrentTime();
-    method public final android.graphics.drawable.Drawable getImageDrawable();
-    method public final java.lang.Object getItem();
-    method public android.support.v17.leanback.widget.PlaybackControlsRow.OnPlaybackStateChangedListener getOnPlaybackStateChangedListener();
-    method public final android.support.v17.leanback.widget.ObjectAdapter getPrimaryActionsAdapter();
-    method public final android.support.v17.leanback.widget.ObjectAdapter getSecondaryActionsAdapter();
-    method public int getTotalTime();
-    method public void setBufferedProgress(int);
-    method public void setCurrentTime(int);
-    method public final void setImageBitmap(android.content.Context, android.graphics.Bitmap);
-    method public final void setImageDrawable(android.graphics.drawable.Drawable);
-    method public void setOnPlaybackStateChangedListener(android.support.v17.leanback.widget.PlaybackControlsRow.OnPlaybackStateChangedListener);
-    method public final void setPrimaryActionsAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public final void setSecondaryActionsAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public void setTotalTime(int);
-  }
-
-  public static class PlaybackControlsRow.ClosedCaptioningAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
-    ctor public PlaybackControlsRow.ClosedCaptioningAction(android.content.Context);
-    ctor public PlaybackControlsRow.ClosedCaptioningAction(android.content.Context, int);
-    field public static int OFF;
-    field public static int ON;
-  }
-
-  public static class PlaybackControlsRow.FastForwardAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
-    ctor public PlaybackControlsRow.FastForwardAction(android.content.Context);
-    ctor public PlaybackControlsRow.FastForwardAction(android.content.Context, int);
-  }
-
-  public static class PlaybackControlsRow.HighQualityAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
-    ctor public PlaybackControlsRow.HighQualityAction(android.content.Context);
-    ctor public PlaybackControlsRow.HighQualityAction(android.content.Context, int);
-    field public static int OFF;
-    field public static int ON;
-  }
-
-  public static class PlaybackControlsRow.MoreActions extends android.support.v17.leanback.widget.Action {
-    ctor public PlaybackControlsRow.MoreActions(android.content.Context);
-  }
-
-  public static abstract class PlaybackControlsRow.MultiAction extends android.support.v17.leanback.widget.Action {
-    ctor public PlaybackControlsRow.MultiAction(int);
-    method public int getActionCount();
-    method public android.graphics.drawable.Drawable getDrawable(int);
-    method public int getIndex();
-    method public java.lang.String getLabel(int);
-    method public java.lang.String getSecondaryLabel(int);
-    method public void nextIndex();
-    method public void setDrawables(android.graphics.drawable.Drawable[]);
-    method public void setIndex(int);
-    method public void setLabels(java.lang.String[]);
-    method public void setSecondaryLabels(java.lang.String[]);
-  }
-
-   static abstract interface PlaybackControlsRow.OnPlaybackStateChangedListener {
-    method public abstract void onBufferedProgressChanged(int);
-    method public abstract void onCurrentTimeChanged(int);
-  }
-
-  public static class PlaybackControlsRow.PlayPauseAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
-    ctor public PlaybackControlsRow.PlayPauseAction(android.content.Context);
-    field public static int PAUSE;
-    field public static int PLAY;
-  }
-
-  public static class PlaybackControlsRow.RepeatAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
-    ctor public PlaybackControlsRow.RepeatAction(android.content.Context);
-    ctor public PlaybackControlsRow.RepeatAction(android.content.Context, int);
-    ctor public PlaybackControlsRow.RepeatAction(android.content.Context, int, int);
-    field public static int ALL;
-    field public static int NONE;
-    field public static int ONE;
-  }
-
-  public static class PlaybackControlsRow.RewindAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
-    ctor public PlaybackControlsRow.RewindAction(android.content.Context);
-    ctor public PlaybackControlsRow.RewindAction(android.content.Context, int);
-  }
-
-  public static class PlaybackControlsRow.ShuffleAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
-    ctor public PlaybackControlsRow.ShuffleAction(android.content.Context);
-    ctor public PlaybackControlsRow.ShuffleAction(android.content.Context, int);
-    field public static int OFF;
-    field public static int ON;
-  }
-
-  public static class PlaybackControlsRow.SkipNextAction extends android.support.v17.leanback.widget.Action {
-    ctor public PlaybackControlsRow.SkipNextAction(android.content.Context);
-  }
-
-  public static class PlaybackControlsRow.SkipPreviousAction extends android.support.v17.leanback.widget.Action {
-    ctor public PlaybackControlsRow.SkipPreviousAction(android.content.Context);
-  }
-
-  public static abstract class PlaybackControlsRow.ThumbsAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
-    ctor public PlaybackControlsRow.ThumbsAction(int, android.content.Context, int, int);
-    field public static int OUTLINE;
-    field public static int SOLID;
-  }
-
-  public static class PlaybackControlsRow.ThumbsDownAction extends android.support.v17.leanback.widget.PlaybackControlsRow.ThumbsAction {
-    ctor public PlaybackControlsRow.ThumbsDownAction(android.content.Context);
-  }
-
-  public static class PlaybackControlsRow.ThumbsUpAction extends android.support.v17.leanback.widget.PlaybackControlsRow.ThumbsAction {
-    ctor public PlaybackControlsRow.ThumbsUpAction(android.content.Context);
-  }
-
-  public class PlaybackControlsRowPresenter extends android.support.v17.leanback.widget.RowPresenter {
-    ctor public PlaybackControlsRowPresenter(android.support.v17.leanback.widget.Presenter);
-    ctor public PlaybackControlsRowPresenter();
-    method public boolean areSecondaryActionsHidden();
-    method protected android.support.v17.leanback.widget.RowPresenter.ViewHolder createRowViewHolder(android.view.ViewGroup);
-    method public int getBackgroundColor();
-    method public android.support.v17.leanback.widget.OnActionClickedListener getOnActionClickedListener();
-    method public int getProgressColor();
-    method public void setBackgroundColor(int);
-    method public void setOnActionClickedListener(android.support.v17.leanback.widget.OnActionClickedListener);
-    method public void setProgressColor(int);
-    method public void setSecondaryActionsHidden(boolean);
-    method public void showBottomSpace(android.support.v17.leanback.widget.PlaybackControlsRowPresenter.ViewHolder, boolean);
-    method public void showPrimaryActions(android.support.v17.leanback.widget.PlaybackControlsRowPresenter.ViewHolder);
-  }
-
-  public class PlaybackControlsRowPresenter.ViewHolder extends android.support.v17.leanback.widget.RowPresenter.ViewHolder {
-    field public final android.support.v17.leanback.widget.Presenter.ViewHolder mDescriptionViewHolder;
-  }
-
-  public abstract class Presenter {
-    ctor public Presenter();
-    method protected static void cancelAnimationsRecursive(android.view.View);
-    method public abstract void onBindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object);
-    method public abstract android.support.v17.leanback.widget.Presenter.ViewHolder onCreateViewHolder(android.view.ViewGroup);
-    method public abstract void onUnbindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public void onViewAttachedToWindow(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public void onViewDetachedFromWindow(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public void setOnClickListener(android.support.v17.leanback.widget.Presenter.ViewHolder, android.view.View.OnClickListener);
-  }
-
-  public static class Presenter.ViewHolder {
-    ctor public Presenter.ViewHolder(android.view.View);
-    field public final android.view.View view;
-  }
-
-  public abstract class PresenterSelector {
-    ctor public PresenterSelector();
-    method public abstract android.support.v17.leanback.widget.Presenter getPresenter(java.lang.Object);
-  }
-
-  public abstract class PresenterSwitcher {
-    ctor public PresenterSwitcher();
-    method public void clear();
-    method public final android.view.ViewGroup getParentViewGroup();
-    method public void init(android.view.ViewGroup, android.support.v17.leanback.widget.PresenterSelector);
-    method protected abstract void insertView(android.view.View);
-    method protected void onViewSelected(android.view.View);
-    method public void select(java.lang.Object);
-    method protected void showView(android.view.View, boolean);
-    method public void unselect();
-  }
-
-  public class Row {
-    ctor public Row(long, android.support.v17.leanback.widget.HeaderItem);
-    ctor public Row(android.support.v17.leanback.widget.HeaderItem);
-    ctor public Row();
-    method public final android.support.v17.leanback.widget.HeaderItem getHeaderItem();
-    method public final long getId();
-    method public final void setHeaderItem(android.support.v17.leanback.widget.HeaderItem);
-    method public final void setId(long);
-  }
-
-  public class RowHeaderPresenter extends android.support.v17.leanback.widget.Presenter {
-    ctor public RowHeaderPresenter();
-    method protected static float getFontDescent(android.widget.TextView, android.graphics.Paint);
-    method public int getSpaceUnderBaseline(android.support.v17.leanback.widget.RowHeaderPresenter.ViewHolder);
-    method public void onBindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object);
-    method public android.support.v17.leanback.widget.Presenter.ViewHolder onCreateViewHolder(android.view.ViewGroup);
-    method protected void onSelectLevelChanged(android.support.v17.leanback.widget.RowHeaderPresenter.ViewHolder);
-    method public void onUnbindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public final void setSelectLevel(android.support.v17.leanback.widget.RowHeaderPresenter.ViewHolder, float);
-  }
-
-  public static class RowHeaderPresenter.ViewHolder extends android.support.v17.leanback.widget.Presenter.ViewHolder {
-    ctor public RowHeaderPresenter.ViewHolder(android.view.View);
-    method public final float getSelectLevel();
-  }
-
-  public final class RowHeaderView extends android.widget.TextView {
-    ctor public RowHeaderView(android.content.Context);
-    ctor public RowHeaderView(android.content.Context, android.util.AttributeSet);
-    ctor public RowHeaderView(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public abstract class RowPresenter extends android.support.v17.leanback.widget.Presenter {
-    ctor public RowPresenter();
-    method public boolean canDrawOutOfBounds();
-    method protected abstract android.support.v17.leanback.widget.RowPresenter.ViewHolder createRowViewHolder(android.view.ViewGroup);
-    method public void freeze(android.support.v17.leanback.widget.RowPresenter.ViewHolder, boolean);
-    method public final android.support.v17.leanback.widget.RowHeaderPresenter getHeaderPresenter();
-    method public final android.support.v17.leanback.widget.OnItemClickedListener getOnItemClickedListener();
-    method public final android.support.v17.leanback.widget.OnItemSelectedListener getOnItemSelectedListener();
-    method public final android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public final android.support.v17.leanback.widget.OnItemViewSelectedListener getOnItemViewSelectedListener();
-    method public final android.support.v17.leanback.widget.RowPresenter.ViewHolder getRowViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public final boolean getSelectEffectEnabled();
-    method public final float getSelectLevel(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method protected void initializeRowViewHolder(android.support.v17.leanback.widget.RowPresenter.ViewHolder);
-    method public boolean isUsingDefaultSelectEffect();
-    method protected void onBindRowViewHolder(android.support.v17.leanback.widget.RowPresenter.ViewHolder, java.lang.Object);
-    method public final void onBindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object);
-    method public final android.support.v17.leanback.widget.Presenter.ViewHolder onCreateViewHolder(android.view.ViewGroup);
-    method protected void onRowViewAttachedToWindow(android.support.v17.leanback.widget.RowPresenter.ViewHolder);
-    method protected void onRowViewDetachedFromWindow(android.support.v17.leanback.widget.RowPresenter.ViewHolder);
-    method protected void onRowViewExpanded(android.support.v17.leanback.widget.RowPresenter.ViewHolder, boolean);
-    method protected void onRowViewSelected(android.support.v17.leanback.widget.RowPresenter.ViewHolder, boolean);
-    method protected void onSelectLevelChanged(android.support.v17.leanback.widget.RowPresenter.ViewHolder);
-    method protected void onUnbindRowViewHolder(android.support.v17.leanback.widget.RowPresenter.ViewHolder);
-    method public final void onUnbindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public final void onViewAttachedToWindow(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public final void onViewDetachedFromWindow(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public void setEntranceTransitionState(android.support.v17.leanback.widget.RowPresenter.ViewHolder, boolean);
-    method public final void setHeaderPresenter(android.support.v17.leanback.widget.RowHeaderPresenter);
-    method public final void setOnItemClickedListener(android.support.v17.leanback.widget.OnItemClickedListener);
-    method public final void setOnItemSelectedListener(android.support.v17.leanback.widget.OnItemSelectedListener);
-    method public final void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public final void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public final void setRowViewExpanded(android.support.v17.leanback.widget.Presenter.ViewHolder, boolean);
-    method public final void setRowViewSelected(android.support.v17.leanback.widget.Presenter.ViewHolder, boolean);
-    method public final void setSelectEffectEnabled(boolean);
-    method public final void setSelectLevel(android.support.v17.leanback.widget.Presenter.ViewHolder, float);
-  }
-
-  public static class RowPresenter.ViewHolder extends android.support.v17.leanback.widget.Presenter.ViewHolder {
-    ctor public RowPresenter.ViewHolder(android.view.View);
-    method public final android.support.v17.leanback.widget.RowHeaderPresenter.ViewHolder getHeaderViewHolder();
-    method public final android.support.v17.leanback.widget.Row getRow();
-    method public final float getSelectLevel();
-    method public final boolean isExpanded();
-    method public final boolean isSelected();
-    field protected final android.support.v17.leanback.graphics.ColorOverlayDimmer mColorDimmer;
-  }
-
-  public class SearchBar extends android.widget.RelativeLayout {
-    ctor public SearchBar(android.content.Context);
-    ctor public SearchBar(android.content.Context, android.util.AttributeSet);
-    ctor public SearchBar(android.content.Context, android.util.AttributeSet, int);
-    method public void displayCompletions(java.util.List<java.lang.String>);
-    method public android.graphics.drawable.Drawable getBadgeDrawable();
-    method public java.lang.CharSequence getHint();
-    method public java.lang.String getTitle();
-    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
-    method public void setSearchBarListener(android.support.v17.leanback.widget.SearchBar.SearchBarListener);
-    method public void setSearchQuery(java.lang.String);
-    method public void setSpeechRecognitionCallback(android.support.v17.leanback.widget.SpeechRecognitionCallback);
-    method public void setSpeechRecognizer(android.speech.SpeechRecognizer);
-    method public void setTitle(java.lang.String);
-    method public void startRecognition();
-    method public void stopRecognition();
-  }
-
-  public static abstract interface SearchBar.SearchBarListener {
-    method public abstract void onKeyboardDismiss(java.lang.String);
-    method public abstract void onSearchQueryChange(java.lang.String);
-    method public abstract void onSearchQuerySubmit(java.lang.String);
-  }
-
-  public class SearchEditText extends android.support.v17.leanback.widget.StreamingTextView {
-    ctor public SearchEditText(android.content.Context);
-    ctor public SearchEditText(android.content.Context, android.util.AttributeSet);
-    ctor public SearchEditText(android.content.Context, android.util.AttributeSet, int);
-    method public void setOnKeyboardDismissListener(android.support.v17.leanback.widget.SearchEditText.OnKeyboardDismissListener);
-  }
-
-  public static abstract interface SearchEditText.OnKeyboardDismissListener {
-    method public abstract void onKeyboardDismiss();
-  }
-
-  public class SearchOrbView extends android.widget.FrameLayout implements android.view.View.OnClickListener {
-    ctor public SearchOrbView(android.content.Context);
-    ctor public SearchOrbView(android.content.Context, android.util.AttributeSet);
-    ctor public SearchOrbView(android.content.Context, android.util.AttributeSet, int);
-    method public void enableOrbColorAnimation(boolean);
-    method public int getOrbColor();
-    method public android.support.v17.leanback.widget.SearchOrbView.Colors getOrbColors();
-    method public android.graphics.drawable.Drawable getOrbIcon();
-    method public void onClick(android.view.View);
-    method public void setOnOrbClickedListener(android.view.View.OnClickListener);
-    method public void setOrbColor(int);
-    method public deprecated void setOrbColor(int, int);
-    method public void setOrbColors(android.support.v17.leanback.widget.SearchOrbView.Colors);
-    method public void setOrbIcon(android.graphics.drawable.Drawable);
-  }
-
-  public static class SearchOrbView.Colors {
-    ctor public SearchOrbView.Colors(int);
-    ctor public SearchOrbView.Colors(int, int);
-    ctor public SearchOrbView.Colors(int, int, int);
-    method public static int getBrightColor(int);
-    field public int brightColor;
-    field public int color;
-    field public int iconColor;
-  }
-
-  public class ShadowOverlayContainer extends android.view.ViewGroup {
-    ctor public ShadowOverlayContainer(android.content.Context);
-    ctor public ShadowOverlayContainer(android.content.Context, android.util.AttributeSet);
-    ctor public ShadowOverlayContainer(android.content.Context, android.util.AttributeSet, int);
-    method public deprecated void initialize(boolean, boolean);
-    method public void initialize(boolean, boolean, boolean);
-    method protected void onLayout(boolean, int, int, int, int);
-    method public static void prepareParentForShadow(android.view.ViewGroup);
-    method public void setOverlayColor(int);
-    method public void setShadowFocusLevel(float);
-    method public static boolean supportsShadow();
-    method public void wrap(android.view.View);
-  }
-
-  public final class SinglePresenterSelector extends android.support.v17.leanback.widget.PresenterSelector {
-    ctor public SinglePresenterSelector(android.support.v17.leanback.widget.Presenter);
-    method public android.support.v17.leanback.widget.Presenter getPresenter(java.lang.Object);
-  }
-
-  public class SparseArrayObjectAdapter extends android.support.v17.leanback.widget.ObjectAdapter {
-    ctor public SparseArrayObjectAdapter(android.support.v17.leanback.widget.PresenterSelector);
-    ctor public SparseArrayObjectAdapter(android.support.v17.leanback.widget.Presenter);
-    ctor public SparseArrayObjectAdapter();
-    method public void clear(int);
-    method public void clear();
-    method public java.lang.Object get(int);
-    method public int indexOf(java.lang.Object);
-    method public int indexOf(int);
-    method public java.lang.Object lookup(int);
-    method public void notifyArrayItemRangeChanged(int, int);
-    method public void set(int, java.lang.Object);
-    method public int size();
-  }
-
-  public class SpeechOrbView extends android.support.v17.leanback.widget.SearchOrbView {
-    ctor public SpeechOrbView(android.content.Context);
-    ctor public SpeechOrbView(android.content.Context, android.util.AttributeSet);
-    ctor public SpeechOrbView(android.content.Context, android.util.AttributeSet, int);
-    method public void setSoundLevel(int);
-    method public void showListening();
-    method public void showNotListening();
-  }
-
-  public abstract interface SpeechRecognitionCallback {
-    method public abstract void recognizeSpeech();
-  }
-
-   class StreamingTextView extends android.widget.EditText {
-    ctor public StreamingTextView(android.content.Context, android.util.AttributeSet);
-    ctor public StreamingTextView(android.content.Context, android.util.AttributeSet, int);
-    method public static boolean isLayoutRtl(android.view.View);
-    method public void reset();
-    method public void setFinalRecognizedText(java.lang.CharSequence);
-    method public void updateRecognizedText(java.lang.String, java.lang.String);
-    method public void updateRecognizedText(java.lang.String, java.util.List<java.lang.Float>);
-  }
-
-  public class VerticalGridPresenter extends android.support.v17.leanback.widget.Presenter {
-    ctor public VerticalGridPresenter();
-    ctor public VerticalGridPresenter(int);
-    method public final boolean areChildRoundedCornersEnabled();
-    method protected android.support.v17.leanback.widget.VerticalGridPresenter.ViewHolder createGridViewHolder(android.view.ViewGroup);
-    method public final void enableChildRoundedCorners(boolean);
-    method public int getNumberOfColumns();
-    method public final deprecated android.support.v17.leanback.widget.OnItemClickedListener getOnItemClickedListener();
-    method public final deprecated android.support.v17.leanback.widget.OnItemSelectedListener getOnItemSelectedListener();
-    method public final android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public final android.support.v17.leanback.widget.OnItemViewSelectedListener getOnItemViewSelectedListener();
-    method public final boolean getShadowEnabled();
-    method protected void initializeGridViewHolder(android.support.v17.leanback.widget.VerticalGridPresenter.ViewHolder);
-    method public boolean isUsingDefaultShadow();
-    method public boolean isUsingZOrder();
-    method public void onBindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object);
-    method public final android.support.v17.leanback.widget.VerticalGridPresenter.ViewHolder onCreateViewHolder(android.view.ViewGroup);
-    method public void onUnbindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public void setNumberOfColumns(int);
-    method public final deprecated void setOnItemClickedListener(android.support.v17.leanback.widget.OnItemClickedListener);
-    method public final deprecated void setOnItemSelectedListener(android.support.v17.leanback.widget.OnItemSelectedListener);
-    method public final void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public final void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public final void setShadowEnabled(boolean);
-  }
-
-  public static class VerticalGridPresenter.ViewHolder extends android.support.v17.leanback.widget.Presenter.ViewHolder {
-    ctor public VerticalGridPresenter.ViewHolder(android.support.v17.leanback.widget.VerticalGridView);
-    method public android.support.v17.leanback.widget.VerticalGridView getGridView();
-  }
-
-  public class VerticalGridView extends android.support.v7.widget.RecyclerView {
-    ctor public VerticalGridView(android.content.Context);
-    ctor public VerticalGridView(android.content.Context, android.util.AttributeSet);
-    ctor public VerticalGridView(android.content.Context, android.util.AttributeSet, int);
-    method protected void initAttributes(android.content.Context, android.util.AttributeSet);
-    method public void setColumnWidth(int);
-    method public void setNumColumns(int);
-  }
-
-}
diff --git a/v17/leanback/api/22.1.0.txt b/v17/leanback/api/22.1.0.txt
deleted file mode 100644
index 5301d5e..0000000
--- a/v17/leanback/api/22.1.0.txt
+++ /dev/null
@@ -1,1552 +0,0 @@
-package android.support.v17.leanback.app {
-
-  public final class BackgroundManager {
-    method public void attach(android.view.Window);
-    method public final int getColor();
-    method public android.graphics.drawable.Drawable getDefaultDimLayer();
-    method public android.graphics.drawable.Drawable getDimLayer();
-    method public android.graphics.drawable.Drawable getDrawable();
-    method public static android.support.v17.leanback.app.BackgroundManager getInstance(android.app.Activity);
-    method public boolean isAttached();
-    method public void release();
-    method public void setBitmap(android.graphics.Bitmap);
-    method public void setColor(int);
-    method public void setDimLayer(android.graphics.drawable.Drawable);
-    method public void setDrawable(android.graphics.drawable.Drawable);
-    method public void setThemeDrawableResourceId(int);
-  }
-
-   abstract class BaseRowFragment extends android.app.Fragment {
-    method public final android.support.v17.leanback.widget.ObjectAdapter getAdapter();
-    method public final android.support.v17.leanback.widget.PresenterSelector getPresenterSelector();
-    method public final void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public final void setPresenterSelector(android.support.v17.leanback.widget.PresenterSelector);
-    method public void setSelectedPosition(int);
-    method public void setSelectedPosition(int, boolean);
-  }
-
-   abstract class BaseRowSupportFragment extends android.support.v4.app.Fragment {
-    method public final android.support.v17.leanback.widget.ObjectAdapter getAdapter();
-    method public final android.support.v17.leanback.widget.PresenterSelector getPresenterSelector();
-    method public final void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public final void setPresenterSelector(android.support.v17.leanback.widget.PresenterSelector);
-    method public void setSelectedPosition(int);
-    method public void setSelectedPosition(int, boolean);
-  }
-
-  public class BrowseFragment extends android.support.v17.leanback.app.BrandedFragment {
-    ctor public BrowseFragment();
-    method public static android.os.Bundle createArgs(android.os.Bundle, java.lang.String, int);
-    method public void enableRowScaling(boolean);
-    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
-    method public int getBrandColor();
-    method public int getHeadersState();
-    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public android.support.v17.leanback.widget.OnItemViewSelectedListener getOnItemViewSelectedListener();
-    method public final boolean isHeadersTransitionOnBackEnabled();
-    method public boolean isInHeadersTransition();
-    method public boolean isShowingHeaders();
-    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public void setBrandColor(int);
-    method public void setBrowseTransitionListener(android.support.v17.leanback.app.BrowseFragment.BrowseTransitionListener);
-    method public void setHeaderPresenterSelector(android.support.v17.leanback.widget.PresenterSelector);
-    method public void setHeadersState(int);
-    method public final void setHeadersTransitionOnBackEnabled(boolean);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public void setSelectedPosition(int);
-    method public void setSelectedPosition(int, boolean);
-    method public void startHeadersTransition(boolean);
-    field public static final int HEADERS_DISABLED = 3; // 0x3
-    field public static final int HEADERS_ENABLED = 1; // 0x1
-    field public static final int HEADERS_HIDDEN = 2; // 0x2
-  }
-
-  public static class BrowseFragment.BrowseTransitionListener {
-    ctor public BrowseFragment.BrowseTransitionListener();
-    method public void onHeadersTransitionStart(boolean);
-    method public void onHeadersTransitionStop(boolean);
-  }
-
-  public class BrowseSupportFragment extends android.support.v17.leanback.app.BrandedSupportFragment {
-    ctor public BrowseSupportFragment();
-    method public static android.os.Bundle createArgs(android.os.Bundle, java.lang.String, int);
-    method public void enableRowScaling(boolean);
-    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
-    method public int getBrandColor();
-    method public int getHeadersState();
-    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public android.support.v17.leanback.widget.OnItemViewSelectedListener getOnItemViewSelectedListener();
-    method public final boolean isHeadersTransitionOnBackEnabled();
-    method public boolean isInHeadersTransition();
-    method public boolean isShowingHeaders();
-    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public void setBrandColor(int);
-    method public void setBrowseTransitionListener(android.support.v17.leanback.app.BrowseSupportFragment.BrowseTransitionListener);
-    method public void setHeaderPresenterSelector(android.support.v17.leanback.widget.PresenterSelector);
-    method public void setHeadersState(int);
-    method public final void setHeadersTransitionOnBackEnabled(boolean);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public void setSelectedPosition(int);
-    method public void setSelectedPosition(int, boolean);
-    method public void startHeadersTransition(boolean);
-    field public static final int HEADERS_DISABLED = 3; // 0x3
-    field public static final int HEADERS_ENABLED = 1; // 0x1
-    field public static final int HEADERS_HIDDEN = 2; // 0x2
-  }
-
-  public static class BrowseSupportFragment.BrowseTransitionListener {
-    ctor public BrowseSupportFragment.BrowseTransitionListener();
-    method public void onHeadersTransitionStart(boolean);
-    method public void onHeadersTransitionStop(boolean);
-  }
-
-  public class DetailsFragment extends android.support.v17.leanback.app.BrandedFragment {
-    ctor public DetailsFragment();
-    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
-    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public void setSelectedPosition(int);
-    method public void setSelectedPosition(int, boolean);
-  }
-
-  public class DetailsSupportFragment extends android.support.v17.leanback.app.BrandedSupportFragment {
-    ctor public DetailsSupportFragment();
-    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
-    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public void setSelectedPosition(int);
-    method public void setSelectedPosition(int, boolean);
-  }
-
-  public class ErrorFragment extends android.app.Fragment {
-    ctor public ErrorFragment();
-    method public android.graphics.drawable.Drawable getBackgroundDrawable();
-    method public android.graphics.drawable.Drawable getBadgeDrawable();
-    method public android.view.View.OnClickListener getButtonClickListener();
-    method public java.lang.String getButtonText();
-    method public android.graphics.drawable.Drawable getImageDrawable();
-    method public java.lang.CharSequence getMessage();
-    method public java.lang.String getTitle();
-    method public boolean isBackgroundTranslucent();
-    method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
-    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
-    method public void setButtonClickListener(android.view.View.OnClickListener);
-    method public void setButtonText(java.lang.String);
-    method public void setDefaultBackground(boolean);
-    method public void setImageDrawable(android.graphics.drawable.Drawable);
-    method public void setMessage(java.lang.CharSequence);
-    method public void setTitle(java.lang.String);
-  }
-
-  public class ErrorSupportFragment extends android.support.v4.app.Fragment {
-    ctor public ErrorSupportFragment();
-    method public android.graphics.drawable.Drawable getBackgroundDrawable();
-    method public android.graphics.drawable.Drawable getBadgeDrawable();
-    method public android.view.View.OnClickListener getButtonClickListener();
-    method public java.lang.String getButtonText();
-    method public android.graphics.drawable.Drawable getImageDrawable();
-    method public java.lang.CharSequence getMessage();
-    method public java.lang.String getTitle();
-    method public boolean isBackgroundTranslucent();
-    method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
-    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
-    method public void setButtonClickListener(android.view.View.OnClickListener);
-    method public void setButtonText(java.lang.String);
-    method public void setDefaultBackground(boolean);
-    method public void setImageDrawable(android.graphics.drawable.Drawable);
-    method public void setMessage(java.lang.CharSequence);
-    method public void setTitle(java.lang.String);
-  }
-
-  public class GuidedStepFragment extends android.app.Fragment {
-    ctor public GuidedStepFragment();
-    method public static int add(android.app.FragmentManager, android.support.v17.leanback.app.GuidedStepFragment);
-    method public android.view.View getActionItemView(int);
-    method public java.util.List<android.support.v17.leanback.widget.GuidedAction> getActions();
-    method public static android.support.v17.leanback.app.GuidedStepFragment getCurrentGuidedStepFragment(android.app.FragmentManager);
-    method public android.support.v17.leanback.widget.GuidanceStylist getGuidanceStylist();
-    method public android.support.v17.leanback.widget.GuidedActionsStylist getGuidedActionsStylist();
-    method public int getSelectedActionPosition();
-    method protected boolean isEntryTransitionEnabled();
-    method public void onCreateActions(java.util.List<android.support.v17.leanback.widget.GuidedAction>, android.os.Bundle);
-    method public android.support.v17.leanback.widget.GuidedActionsStylist onCreateActionsStylist();
-    method public android.support.v17.leanback.widget.GuidanceStylist.Guidance onCreateGuidance(android.os.Bundle);
-    method public android.support.v17.leanback.widget.GuidanceStylist onCreateGuidanceStylist();
-    method public void onGuidedActionClicked(android.support.v17.leanback.widget.GuidedAction);
-    method public void onGuidedActionFocused(android.support.v17.leanback.widget.GuidedAction);
-    method public int onProvideTheme();
-    method public void setActions(java.util.List<android.support.v17.leanback.widget.GuidedAction>);
-    method protected void setEntryTransitionEnabled(boolean);
-    method public void setSelectedActionPosition(int);
-  }
-
-  public class HeadersFragment extends android.support.v17.leanback.app.BaseRowFragment {
-    ctor public HeadersFragment();
-    method public void setOnHeaderClickedListener(android.support.v17.leanback.app.HeadersFragment.OnHeaderClickedListener);
-    method public void setOnHeaderViewSelectedListener(android.support.v17.leanback.app.HeadersFragment.OnHeaderViewSelectedListener);
-  }
-
-   static abstract interface HeadersFragment.OnHeaderClickedListener {
-    method public abstract void onHeaderClicked();
-  }
-
-   static abstract interface HeadersFragment.OnHeaderViewSelectedListener {
-    method public abstract void onHeaderSelected(android.support.v17.leanback.widget.RowHeaderPresenter.ViewHolder, android.support.v17.leanback.widget.Row);
-  }
-
-  public class HeadersSupportFragment extends android.support.v17.leanback.app.BaseRowSupportFragment {
-    ctor public HeadersSupportFragment();
-    method public void setOnHeaderClickedListener(android.support.v17.leanback.app.HeadersSupportFragment.OnHeaderClickedListener);
-    method public void setOnHeaderViewSelectedListener(android.support.v17.leanback.app.HeadersSupportFragment.OnHeaderViewSelectedListener);
-  }
-
-   static abstract interface HeadersSupportFragment.OnHeaderClickedListener {
-    method public abstract void onHeaderClicked();
-  }
-
-   static abstract interface HeadersSupportFragment.OnHeaderViewSelectedListener {
-    method public abstract void onHeaderSelected(android.support.v17.leanback.widget.RowHeaderPresenter.ViewHolder, android.support.v17.leanback.widget.Row);
-  }
-
-  public abstract class MediaControllerGlue extends android.support.v17.leanback.app.PlaybackControlGlue {
-    ctor public MediaControllerGlue(android.content.Context, android.support.v17.leanback.app.PlaybackOverlayFragment, int[]);
-    ctor public MediaControllerGlue(android.content.Context, android.support.v17.leanback.app.PlaybackOverlayFragment, int[], int[]);
-    method public void attachToMediaController(android.support.v4.media.session.MediaControllerCompat);
-    method public void detach();
-    method public int getCurrentPosition();
-    method public int getCurrentSpeedId();
-    method public android.graphics.drawable.Drawable getMediaArt();
-    method public final android.support.v4.media.session.MediaControllerCompat getMediaController();
-    method public int getMediaDuration();
-    method public java.lang.CharSequence getMediaSubtitle();
-    method public java.lang.CharSequence getMediaTitle();
-    method public long getSupportedActions();
-    method public boolean hasValidMedia();
-    method public boolean isMediaPlaying();
-    method protected void pausePlayback();
-    method protected void skipToNext();
-    method protected void skipToPrevious();
-    method protected void startPlayback(int);
-  }
-
-  public abstract class PlaybackControlGlue implements android.support.v17.leanback.widget.OnActionClickedListener android.view.View.OnKeyListener {
-    ctor public PlaybackControlGlue(android.content.Context, int[]);
-    ctor public PlaybackControlGlue(android.content.Context, int[], int[]);
-    ctor public PlaybackControlGlue(android.content.Context, android.support.v17.leanback.app.PlaybackOverlayFragment, int[]);
-    ctor public PlaybackControlGlue(android.content.Context, android.support.v17.leanback.app.PlaybackOverlayFragment, int[], int[]);
-    method public android.support.v17.leanback.widget.PlaybackControlsRowPresenter createControlsRowAndPresenter();
-    method protected android.support.v17.leanback.widget.SparseArrayObjectAdapter createPrimaryActionsAdapter(android.support.v17.leanback.widget.PresenterSelector);
-    method public void enableProgressUpdating(boolean);
-    method public android.content.Context getContext();
-    method public android.support.v17.leanback.widget.PlaybackControlsRow getControlsRow();
-    method public abstract int getCurrentPosition();
-    method public abstract int getCurrentSpeedId();
-    method public int[] getFastForwardSpeeds();
-    method public android.support.v17.leanback.app.PlaybackOverlayFragment getFragment();
-    method public abstract android.graphics.drawable.Drawable getMediaArt();
-    method public abstract int getMediaDuration();
-    method public abstract java.lang.CharSequence getMediaSubtitle();
-    method public abstract java.lang.CharSequence getMediaTitle();
-    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public int[] getRewindSpeeds();
-    method public abstract long getSupportedActions();
-    method public int getUpdatePeriod();
-    method public abstract boolean hasValidMedia();
-    method public boolean isFadingEnabled();
-    method public abstract boolean isMediaPlaying();
-    method public void onActionClicked(android.support.v17.leanback.widget.Action);
-    method public boolean onKey(android.view.View, int, android.view.KeyEvent);
-    method protected void onMetadataChanged();
-    method protected abstract void onRowChanged(android.support.v17.leanback.widget.PlaybackControlsRow);
-    method protected void onStateChanged();
-    method protected abstract void pausePlayback();
-    method public void setControlsRow(android.support.v17.leanback.widget.PlaybackControlsRow);
-    method public void setFadingEnabled(boolean);
-    method public deprecated void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method protected abstract void skipToNext();
-    method protected abstract void skipToPrevious();
-    method protected abstract void startPlayback(int);
-    method public void updateProgress();
-    field public static final int ACTION_CUSTOM_LEFT_FIRST = 1; // 0x1
-    field public static final int ACTION_CUSTOM_RIGHT_FIRST = 4096; // 0x1000
-    field public static final int ACTION_FAST_FORWARD = 128; // 0x80
-    field public static final int ACTION_PLAY_PAUSE = 64; // 0x40
-    field public static final int ACTION_REWIND = 32; // 0x20
-    field public static final int ACTION_SKIP_TO_NEXT = 256; // 0x100
-    field public static final int ACTION_SKIP_TO_PREVIOUS = 16; // 0x10
-    field public static final int PLAYBACK_SPEED_FAST_L0 = 10; // 0xa
-    field public static final int PLAYBACK_SPEED_FAST_L1 = 11; // 0xb
-    field public static final int PLAYBACK_SPEED_FAST_L2 = 12; // 0xc
-    field public static final int PLAYBACK_SPEED_FAST_L3 = 13; // 0xd
-    field public static final int PLAYBACK_SPEED_FAST_L4 = 14; // 0xe
-    field public static final int PLAYBACK_SPEED_INVALID = -1; // 0xffffffff
-    field public static final int PLAYBACK_SPEED_NORMAL = 1; // 0x1
-    field public static final int PLAYBACK_SPEED_PAUSED = 0; // 0x0
-  }
-
-  public class PlaybackOverlayFragment extends android.support.v17.leanback.app.DetailsFragment {
-    ctor public PlaybackOverlayFragment();
-    method public int getBackgroundType();
-    method public android.support.v17.leanback.app.PlaybackOverlayFragment.OnFadeCompleteListener getFadeCompleteListener();
-    method public final android.support.v17.leanback.app.PlaybackOverlayFragment.InputEventHandler getInputEventHandler();
-    method public boolean isFadingEnabled();
-    method public void setBackgroundType(int);
-    method public void setFadeCompleteListener(android.support.v17.leanback.app.PlaybackOverlayFragment.OnFadeCompleteListener);
-    method public void setFadingEnabled(boolean);
-    method public final void setInputEventHandler(android.support.v17.leanback.app.PlaybackOverlayFragment.InputEventHandler);
-    method public void tickle();
-    field public static final int BG_DARK = 1; // 0x1
-    field public static final int BG_LIGHT = 2; // 0x2
-    field public static final int BG_NONE = 0; // 0x0
-  }
-
-  public static abstract interface PlaybackOverlayFragment.InputEventHandler {
-    method public abstract boolean handleInputEvent(android.view.InputEvent);
-  }
-
-  public static class PlaybackOverlayFragment.OnFadeCompleteListener {
-    ctor public PlaybackOverlayFragment.OnFadeCompleteListener();
-    method public void onFadeInComplete();
-    method public void onFadeOutComplete();
-  }
-
-  public class PlaybackOverlaySupportFragment extends android.support.v17.leanback.app.DetailsSupportFragment {
-    ctor public PlaybackOverlaySupportFragment();
-    method public int getBackgroundType();
-    method public android.support.v17.leanback.app.PlaybackOverlaySupportFragment.OnFadeCompleteListener getFadeCompleteListener();
-    method public final android.support.v17.leanback.app.PlaybackOverlaySupportFragment.InputEventHandler getInputEventHandler();
-    method public boolean isFadingEnabled();
-    method public void setBackgroundType(int);
-    method public void setFadeCompleteListener(android.support.v17.leanback.app.PlaybackOverlaySupportFragment.OnFadeCompleteListener);
-    method public void setFadingEnabled(boolean);
-    method public final void setInputEventHandler(android.support.v17.leanback.app.PlaybackOverlaySupportFragment.InputEventHandler);
-    method public void tickle();
-    field public static final int BG_DARK = 1; // 0x1
-    field public static final int BG_LIGHT = 2; // 0x2
-    field public static final int BG_NONE = 0; // 0x0
-  }
-
-  public static abstract interface PlaybackOverlaySupportFragment.InputEventHandler {
-    method public abstract boolean handleInputEvent(android.view.InputEvent);
-  }
-
-  public static class PlaybackOverlaySupportFragment.OnFadeCompleteListener {
-    ctor public PlaybackOverlaySupportFragment.OnFadeCompleteListener();
-    method public void onFadeInComplete();
-    method public void onFadeOutComplete();
-  }
-
-  public class RowsFragment extends android.support.v17.leanback.app.BaseRowFragment {
-    ctor public RowsFragment();
-    method public void enableRowScaling(boolean);
-    method protected android.support.v17.leanback.widget.VerticalGridView findGridViewFromRoot(android.view.View);
-    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public android.support.v17.leanback.widget.OnItemViewSelectedListener getOnItemViewSelectedListener();
-    method public void setExpand(boolean);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-  }
-
-  public class RowsSupportFragment extends android.support.v17.leanback.app.BaseRowSupportFragment {
-    ctor public RowsSupportFragment();
-    method public void enableRowScaling(boolean);
-    method protected android.support.v17.leanback.widget.VerticalGridView findGridViewFromRoot(android.view.View);
-    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public android.support.v17.leanback.widget.OnItemViewSelectedListener getOnItemViewSelectedListener();
-    method public void setExpand(boolean);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-  }
-
-  public class SearchFragment extends android.app.Fragment {
-    ctor public SearchFragment();
-    method public static android.os.Bundle createArgs(android.os.Bundle, java.lang.String);
-    method public static android.os.Bundle createArgs(android.os.Bundle, java.lang.String, java.lang.String);
-    method public void displayCompletions(java.util.List<java.lang.String>);
-    method public android.graphics.drawable.Drawable getBadgeDrawable();
-    method public android.content.Intent getRecognizerIntent();
-    method public java.lang.String getTitle();
-    method public static android.support.v17.leanback.app.SearchFragment newInstance(java.lang.String);
-    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public void setSearchQuery(java.lang.String, boolean);
-    method public void setSearchQuery(android.content.Intent, boolean);
-    method public void setSearchResultProvider(android.support.v17.leanback.app.SearchFragment.SearchResultProvider);
-    method public void setSpeechRecognitionCallback(android.support.v17.leanback.widget.SpeechRecognitionCallback);
-    method public void setTitle(java.lang.String);
-    method public void startRecognition();
-  }
-
-  public static abstract interface SearchFragment.SearchResultProvider {
-    method public abstract android.support.v17.leanback.widget.ObjectAdapter getResultsAdapter();
-    method public abstract boolean onQueryTextChange(java.lang.String);
-    method public abstract boolean onQueryTextSubmit(java.lang.String);
-  }
-
-  public class SearchSupportFragment extends android.support.v4.app.Fragment {
-    ctor public SearchSupportFragment();
-    method public static android.os.Bundle createArgs(android.os.Bundle, java.lang.String);
-    method public static android.os.Bundle createArgs(android.os.Bundle, java.lang.String, java.lang.String);
-    method public void displayCompletions(java.util.List<java.lang.String>);
-    method public android.graphics.drawable.Drawable getBadgeDrawable();
-    method public android.content.Intent getRecognizerIntent();
-    method public java.lang.String getTitle();
-    method public static android.support.v17.leanback.app.SearchSupportFragment newInstance(java.lang.String);
-    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public void setSearchQuery(java.lang.String, boolean);
-    method public void setSearchQuery(android.content.Intent, boolean);
-    method public void setSearchResultProvider(android.support.v17.leanback.app.SearchSupportFragment.SearchResultProvider);
-    method public void setSpeechRecognitionCallback(android.support.v17.leanback.widget.SpeechRecognitionCallback);
-    method public void setTitle(java.lang.String);
-    method public void startRecognition();
-  }
-
-  public static abstract interface SearchSupportFragment.SearchResultProvider {
-    method public abstract android.support.v17.leanback.widget.ObjectAdapter getResultsAdapter();
-    method public abstract boolean onQueryTextChange(java.lang.String);
-    method public abstract boolean onQueryTextSubmit(java.lang.String);
-  }
-
-  public class VerticalGridFragment extends android.app.Fragment {
-    ctor public VerticalGridFragment();
-    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
-    method public android.support.v17.leanback.widget.VerticalGridPresenter getGridPresenter();
-    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public void setGridPresenter(android.support.v17.leanback.widget.VerticalGridPresenter);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public void setSelectedPosition(int);
-  }
-
-  public class VerticalGridSupportFragment extends android.support.v4.app.Fragment {
-    ctor public VerticalGridSupportFragment();
-    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
-    method public android.support.v17.leanback.widget.VerticalGridPresenter getGridPresenter();
-    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public void setGridPresenter(android.support.v17.leanback.widget.VerticalGridPresenter);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public void setSelectedPosition(int);
-  }
-
-}
-
-package android.support.v17.leanback.database {
-
-  public abstract class CursorMapper {
-    ctor public CursorMapper();
-    method protected abstract java.lang.Object bind(android.database.Cursor);
-    method protected abstract void bindColumns(android.database.Cursor);
-    method public java.lang.Object convert(android.database.Cursor);
-  }
-
-}
-
-package android.support.v17.leanback.graphics {
-
-  public final class ColorFilterCache {
-    method public static android.support.v17.leanback.graphics.ColorFilterCache getColorFilterCache(int);
-    method public android.graphics.ColorFilter getFilterForLevel(float);
-  }
-
-  public final class ColorFilterDimmer {
-    method public void applyFilterToView(android.view.View);
-    method public static android.support.v17.leanback.graphics.ColorFilterDimmer create(android.support.v17.leanback.graphics.ColorFilterCache, float, float);
-    method public static android.support.v17.leanback.graphics.ColorFilterDimmer createDefault(android.content.Context);
-    method public android.graphics.ColorFilter getColorFilter();
-    method public android.graphics.Paint getPaint();
-    method public void setActiveLevel(float);
-  }
-
-  public final class ColorOverlayDimmer {
-    method public int applyToColor(int);
-    method public static android.support.v17.leanback.graphics.ColorOverlayDimmer createColorOverlayDimmer(int, float, float);
-    method public static android.support.v17.leanback.graphics.ColorOverlayDimmer createDefault(android.content.Context);
-    method public void drawColorOverlay(android.graphics.Canvas, android.view.View, boolean);
-    method public int getAlpha();
-    method public float getAlphaFloat();
-    method public android.graphics.Paint getPaint();
-    method public boolean needsDraw();
-    method public void setActiveLevel(float);
-  }
-
-}
-
-package android.support.v17.leanback.widget {
-
-  public abstract class AbstractDetailsDescriptionPresenter extends android.support.v17.leanback.widget.Presenter {
-    ctor public AbstractDetailsDescriptionPresenter();
-    method protected abstract void onBindDescription(android.support.v17.leanback.widget.AbstractDetailsDescriptionPresenter.ViewHolder, java.lang.Object);
-    method public final void onBindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object);
-    method public final android.support.v17.leanback.widget.AbstractDetailsDescriptionPresenter.ViewHolder onCreateViewHolder(android.view.ViewGroup);
-    method public void onUnbindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
-  }
-
-  public static class AbstractDetailsDescriptionPresenter.ViewHolder extends android.support.v17.leanback.widget.Presenter.ViewHolder {
-    ctor public AbstractDetailsDescriptionPresenter.ViewHolder(android.view.View);
-    method public android.widget.TextView getBody();
-    method public android.widget.TextView getSubtitle();
-    method public android.widget.TextView getTitle();
-  }
-
-  public class Action {
-    ctor public Action(long);
-    ctor public Action(long, java.lang.CharSequence);
-    ctor public Action(long, java.lang.CharSequence, java.lang.CharSequence);
-    ctor public Action(long, java.lang.CharSequence, java.lang.CharSequence, android.graphics.drawable.Drawable);
-    method public final void addKeyCode(int);
-    method public final android.graphics.drawable.Drawable getIcon();
-    method public final long getId();
-    method public final java.lang.CharSequence getLabel1();
-    method public final java.lang.CharSequence getLabel2();
-    method public final void removeKeyCode(int);
-    method public final boolean respondsToKeyCode(int);
-    method public final void setIcon(android.graphics.drawable.Drawable);
-    method public final void setId(long);
-    method public final void setLabel1(java.lang.CharSequence);
-    method public final void setLabel2(java.lang.CharSequence);
-  }
-
-  public class ArrayObjectAdapter extends android.support.v17.leanback.widget.ObjectAdapter {
-    ctor public ArrayObjectAdapter(android.support.v17.leanback.widget.PresenterSelector);
-    ctor public ArrayObjectAdapter(android.support.v17.leanback.widget.Presenter);
-    ctor public ArrayObjectAdapter();
-    method public void add(java.lang.Object);
-    method public void add(int, java.lang.Object);
-    method public void addAll(int, java.util.Collection);
-    method public void clear();
-    method public java.lang.Object get(int);
-    method public int indexOf(java.lang.Object);
-    method public void notifyArrayItemRangeChanged(int, int);
-    method public boolean remove(java.lang.Object);
-    method public int removeItems(int, int);
-    method public void replace(int, java.lang.Object);
-    method public int size();
-    method public java.util.List<E> unmodifiableList();
-  }
-
-  public class BaseCardView extends android.widget.FrameLayout {
-    ctor public BaseCardView(android.content.Context);
-    ctor public BaseCardView(android.content.Context, android.util.AttributeSet);
-    ctor public BaseCardView(android.content.Context, android.util.AttributeSet, int);
-    method public int getCardType();
-    method public int getExtraVisibility();
-    method public int getInfoVisibility();
-    method public boolean isSelectedAnimationDelayed();
-    method public void setCardType(int);
-    method public void setExtraVisibility(int);
-    method public void setInfoVisibility(int);
-    method public void setSelectedAnimationDelayed(boolean);
-    field public static final int CARD_REGION_VISIBLE_ACTIVATED = 1; // 0x1
-    field public static final int CARD_REGION_VISIBLE_ALWAYS = 0; // 0x0
-    field public static final int CARD_REGION_VISIBLE_SELECTED = 2; // 0x2
-    field public static final int CARD_TYPE_INFO_OVER = 1; // 0x1
-    field public static final int CARD_TYPE_INFO_UNDER = 2; // 0x2
-    field public static final int CARD_TYPE_INFO_UNDER_WITH_EXTRA = 3; // 0x3
-    field public static final int CARD_TYPE_MAIN_ONLY = 0; // 0x0
-  }
-
-  public static class BaseCardView.LayoutParams extends android.widget.FrameLayout.LayoutParams {
-    ctor public BaseCardView.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public BaseCardView.LayoutParams(int, int);
-    ctor public BaseCardView.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public BaseCardView.LayoutParams(android.support.v17.leanback.widget.BaseCardView.LayoutParams);
-    field public static final int VIEW_TYPE_EXTRA = 2; // 0x2
-    field public static final int VIEW_TYPE_INFO = 1; // 0x1
-    field public static final int VIEW_TYPE_MAIN = 0; // 0x0
-    field public int viewType;
-  }
-
-   abstract class BaseGridView extends android.support.v7.widget.RecyclerView {
-    ctor public BaseGridView(android.content.Context, android.util.AttributeSet, int);
-    method public boolean dispatchGenericFocusedEvent(android.view.MotionEvent);
-    method public int getChildDrawingOrder(int, int);
-    method public int getFocusScrollStrategy();
-    method public int getHorizontalMargin();
-    method public int getItemAlignmentOffset();
-    method public float getItemAlignmentOffsetPercent();
-    method public int getItemAlignmentViewId();
-    method public android.support.v17.leanback.widget.BaseGridView.OnUnhandledKeyListener getOnUnhandledKeyListener();
-    method public final int getSaveChildrenLimitNumber();
-    method public final int getSaveChildrenPolicy();
-    method public int getSelectedPosition();
-    method public int getVerticalMargin();
-    method public void getViewSelectedOffsets(android.view.View, int[]);
-    method public int getWindowAlignment();
-    method public int getWindowAlignmentOffset();
-    method public float getWindowAlignmentOffsetPercent();
-    method public boolean hasPreviousViewInSameRow(int);
-    method protected void initBaseGridViewAttributes(android.content.Context, android.util.AttributeSet);
-    method public boolean isChildLayoutAnimated();
-    method public boolean isFocusDrawingOrderEnabled();
-    method public final boolean isFocusSearchDisabled();
-    method public boolean isItemAlignmentOffsetWithPadding();
-    method public boolean isScrollEnabled();
-    method public boolean onRequestFocusInDescendants(int, android.graphics.Rect);
-    method public void setAnimateChildLayout(boolean);
-    method public void setChildrenVisibility(int);
-    method public void setFocusDrawingOrderEnabled(boolean);
-    method public void setFocusScrollStrategy(int);
-    method public final void setFocusSearchDisabled(boolean);
-    method public void setGravity(int);
-    method public void setHasOverlappingRendering(boolean);
-    method public void setHorizontalMargin(int);
-    method public void setItemAlignmentOffset(int);
-    method public void setItemAlignmentOffsetPercent(float);
-    method public void setItemAlignmentOffsetWithPadding(boolean);
-    method public void setItemAlignmentViewId(int);
-    method public void setItemMargin(int);
-    method public void setLayoutEnabled(boolean);
-    method public void setOnChildLaidOutListener(android.support.v17.leanback.widget.OnChildLaidOutListener);
-    method public void setOnChildSelectedListener(android.support.v17.leanback.widget.OnChildSelectedListener);
-    method public void setOnKeyInterceptListener(android.support.v17.leanback.widget.BaseGridView.OnKeyInterceptListener);
-    method public void setOnMotionInterceptListener(android.support.v17.leanback.widget.BaseGridView.OnMotionInterceptListener);
-    method public void setOnTouchInterceptListener(android.support.v17.leanback.widget.BaseGridView.OnTouchInterceptListener);
-    method public void setOnUnhandledKeyListener(android.support.v17.leanback.widget.BaseGridView.OnUnhandledKeyListener);
-    method public void setPruneChild(boolean);
-    method public final void setSaveChildrenLimitNumber(int);
-    method public final void setSaveChildrenPolicy(int);
-    method public void setScrollEnabled(boolean);
-    method public void setSelectedPosition(int);
-    method public void setSelectedPosition(int, int);
-    method public void setSelectedPositionSmooth(int);
-    method public void setVerticalMargin(int);
-    method public void setWindowAlignment(int);
-    method public void setWindowAlignmentOffset(int);
-    method public void setWindowAlignmentOffsetPercent(float);
-    field public static final int FOCUS_SCROLL_ALIGNED = 0; // 0x0
-    field public static final int FOCUS_SCROLL_ITEM = 1; // 0x1
-    field public static final int FOCUS_SCROLL_PAGE = 2; // 0x2
-    field public static final float ITEM_ALIGN_OFFSET_PERCENT_DISABLED = -1.0f;
-    field public static final int SAVE_ALL_CHILD = 3; // 0x3
-    field public static final int SAVE_LIMITED_CHILD = 2; // 0x2
-    field public static final int SAVE_NO_CHILD = 0; // 0x0
-    field public static final int SAVE_ON_SCREEN_CHILD = 1; // 0x1
-    field public static final int WINDOW_ALIGN_BOTH_EDGE = 3; // 0x3
-    field public static final int WINDOW_ALIGN_HIGH_EDGE = 2; // 0x2
-    field public static final int WINDOW_ALIGN_LOW_EDGE = 1; // 0x1
-    field public static final int WINDOW_ALIGN_NO_EDGE = 0; // 0x0
-    field public static final float WINDOW_ALIGN_OFFSET_PERCENT_DISABLED = -1.0f;
-    field protected final android.support.v17.leanback.widget.GridLayoutManager mLayoutManager;
-  }
-
-  public static abstract interface BaseGridView.OnKeyInterceptListener {
-    method public abstract boolean onInterceptKeyEvent(android.view.KeyEvent);
-  }
-
-  public static abstract interface BaseGridView.OnMotionInterceptListener {
-    method public abstract boolean onInterceptMotionEvent(android.view.MotionEvent);
-  }
-
-  public static abstract interface BaseGridView.OnTouchInterceptListener {
-    method public abstract boolean onInterceptTouchEvent(android.view.MotionEvent);
-  }
-
-  public static abstract interface BaseGridView.OnUnhandledKeyListener {
-    method public abstract boolean onUnhandledKey(android.view.KeyEvent);
-  }
-
-  public class BrowseFrameLayout extends android.widget.FrameLayout {
-    ctor public BrowseFrameLayout(android.content.Context);
-    ctor public BrowseFrameLayout(android.content.Context, android.util.AttributeSet);
-    ctor public BrowseFrameLayout(android.content.Context, android.util.AttributeSet, int);
-    method public android.support.v17.leanback.widget.BrowseFrameLayout.OnChildFocusListener getOnChildFocusListener();
-    method public android.support.v17.leanback.widget.BrowseFrameLayout.OnFocusSearchListener getOnFocusSearchListener();
-    method public void setOnChildFocusListener(android.support.v17.leanback.widget.BrowseFrameLayout.OnChildFocusListener);
-    method public void setOnFocusSearchListener(android.support.v17.leanback.widget.BrowseFrameLayout.OnFocusSearchListener);
-  }
-
-  public static abstract interface BrowseFrameLayout.OnChildFocusListener {
-    method public abstract void onRequestChildFocus(android.view.View, android.view.View);
-    method public abstract boolean onRequestFocusInDescendants(int, android.graphics.Rect);
-  }
-
-  public static abstract interface BrowseFrameLayout.OnFocusSearchListener {
-    method public abstract android.view.View onFocusSearch(android.view.View, int);
-  }
-
-  public final class ClassPresenterSelector extends android.support.v17.leanback.widget.PresenterSelector {
-    ctor public ClassPresenterSelector();
-    method public void addClassPresenter(java.lang.Class<?>, android.support.v17.leanback.widget.Presenter);
-    method public android.support.v17.leanback.widget.Presenter getPresenter(java.lang.Object);
-  }
-
-  public class ControlButtonPresenterSelector extends android.support.v17.leanback.widget.PresenterSelector {
-    ctor public ControlButtonPresenterSelector();
-    method public android.support.v17.leanback.widget.Presenter getPresenter(java.lang.Object);
-    method public android.support.v17.leanback.widget.Presenter getPrimaryPresenter();
-    method public android.support.v17.leanback.widget.Presenter getSecondaryPresenter();
-  }
-
-  public class CursorObjectAdapter extends android.support.v17.leanback.widget.ObjectAdapter {
-    ctor public CursorObjectAdapter(android.support.v17.leanback.widget.PresenterSelector);
-    ctor public CursorObjectAdapter(android.support.v17.leanback.widget.Presenter);
-    ctor public CursorObjectAdapter();
-    method public void changeCursor(android.database.Cursor);
-    method public void close();
-    method public java.lang.Object get(int);
-    method public final android.database.Cursor getCursor();
-    method public final android.support.v17.leanback.database.CursorMapper getMapper();
-    method protected final void invalidateCache(int);
-    method protected final void invalidateCache(int, int);
-    method public boolean isClosed();
-    method protected void onCursorChanged();
-    method protected void onMapperChanged();
-    method public final void setMapper(android.support.v17.leanback.database.CursorMapper);
-    method public int size();
-    method public android.database.Cursor swapCursor(android.database.Cursor);
-  }
-
-  public class DetailsOverviewRow extends android.support.v17.leanback.widget.Row {
-    ctor public DetailsOverviewRow(java.lang.Object);
-    method public final deprecated void addAction(android.support.v17.leanback.widget.Action);
-    method public final deprecated void addAction(int, android.support.v17.leanback.widget.Action);
-    method public android.support.v17.leanback.widget.Action getActionForKeyCode(int);
-    method public final deprecated java.util.List<android.support.v17.leanback.widget.Action> getActions();
-    method public final android.support.v17.leanback.widget.ObjectAdapter getActionsAdapter();
-    method public final android.graphics.drawable.Drawable getImageDrawable();
-    method public final java.lang.Object getItem();
-    method public boolean isImageScaleUpAllowed();
-    method public final deprecated boolean removeAction(android.support.v17.leanback.widget.Action);
-    method public final void setActionsAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public final void setImageBitmap(android.content.Context, android.graphics.Bitmap);
-    method public final void setImageDrawable(android.graphics.drawable.Drawable);
-    method public void setImageScaleUpAllowed(boolean);
-    method public final void setItem(java.lang.Object);
-  }
-
-  public class DetailsOverviewRowPresenter extends android.support.v17.leanback.widget.RowPresenter {
-    ctor public DetailsOverviewRowPresenter(android.support.v17.leanback.widget.Presenter);
-    method protected android.support.v17.leanback.widget.RowPresenter.ViewHolder createRowViewHolder(android.view.ViewGroup);
-    method public int getBackgroundColor();
-    method public android.support.v17.leanback.widget.OnActionClickedListener getOnActionClickedListener();
-    method public boolean isStyleLarge();
-    method public final boolean isUsingDefaultSelectEffect();
-    method public void setBackgroundColor(int);
-    method public void setOnActionClickedListener(android.support.v17.leanback.widget.OnActionClickedListener);
-    method public final void setSharedElementEnterTransition(android.app.Activity, java.lang.String, long);
-    method public final void setSharedElementEnterTransition(android.app.Activity, java.lang.String);
-    method public void setStyleLarge(boolean);
-  }
-
-  public final class DetailsOverviewRowPresenter.ViewHolder extends android.support.v17.leanback.widget.RowPresenter.ViewHolder {
-    ctor public DetailsOverviewRowPresenter.ViewHolder(android.view.View, android.support.v17.leanback.widget.Presenter);
-    field public final android.support.v17.leanback.widget.Presenter.ViewHolder mDetailsDescriptionViewHolder;
-  }
-
-  public abstract interface FocusHighlight {
-    field public static final int ZOOM_FACTOR_LARGE = 3; // 0x3
-    field public static final int ZOOM_FACTOR_MEDIUM = 2; // 0x2
-    field public static final int ZOOM_FACTOR_NONE = 0; // 0x0
-    field public static final int ZOOM_FACTOR_SMALL = 1; // 0x1
-    field public static final int ZOOM_FACTOR_XSMALL = 4; // 0x4
-  }
-
-  public class FocusHighlightHelper {
-    ctor public FocusHighlightHelper();
-    method public static void setupBrowseItemFocusHighlight(android.support.v17.leanback.widget.ItemBridgeAdapter, int, boolean);
-    method public static void setupHeaderItemFocusHighlight(android.support.v17.leanback.widget.VerticalGridView);
-  }
-
-  public abstract interface FragmentAnimationProvider {
-    method public abstract void onActivityEnter(java.util.List<android.animation.Animator>);
-    method public abstract void onActivityExit(java.util.List<android.animation.Animator>);
-    method public abstract void onFragmentEnter(java.util.List<android.animation.Animator>);
-    method public abstract void onFragmentExit(java.util.List<android.animation.Animator>);
-    method public abstract void onFragmentReenter(java.util.List<android.animation.Animator>);
-    method public abstract void onFragmentReturn(java.util.List<android.animation.Animator>);
-  }
-
-   final class GridLayoutManager extends android.support.v7.widget.RecyclerView.LayoutManager {
-    ctor public GridLayoutManager(android.support.v17.leanback.widget.BaseGridView);
-    method public android.support.v7.widget.RecyclerView.LayoutParams generateDefaultLayoutParams();
-    method public int getFocusScrollStrategy();
-    method public int getHorizontalMargin();
-    method public int getItemAlignmentOffset();
-    method public float getItemAlignmentOffsetPercent();
-    method public int getItemAlignmentViewId();
-    method public boolean getPruneChild();
-    method public int getSelection();
-    method public int getVerticalMargin();
-    method protected android.view.View getViewForPosition(int);
-    method public void getViewSelectedOffsets(android.view.View, int[]);
-    method public int getWindowAlignment();
-    method public int getWindowAlignmentOffset();
-    method public float getWindowAlignmentOffsetPercent();
-    method protected boolean hasDoneFirstLayout();
-    method public boolean isItemAlignmentOffsetWithPadding();
-    method public boolean isScrollEnabled();
-    method public void onRtlPropertiesChanged(int);
-    method public void setFocusOutAllowed(boolean, boolean);
-    method public void setFocusScrollStrategy(int);
-    method public void setGravity(int);
-    method public void setHorizontalMargin(int);
-    method public void setItemAlignmentOffset(int);
-    method public void setItemAlignmentOffsetPercent(float);
-    method public void setItemAlignmentOffsetWithPadding(boolean);
-    method public void setItemAlignmentViewId(int);
-    method public void setItemMargin(int);
-    method public void setLayoutEnabled(boolean);
-    method public void setNumRows(int);
-    method public void setOnChildSelectedListener(android.support.v17.leanback.widget.OnChildSelectedListener);
-    method public void setOrientation(int);
-    method public void setPruneChild(boolean);
-    method public void setRowHeight(int);
-    method public void setScrollEnabled(boolean);
-    method public void setSelection(android.support.v7.widget.RecyclerView, int, int);
-    method public void setSelection(android.support.v7.widget.RecyclerView, int, boolean, int);
-    method public void setSelectionSmooth(android.support.v7.widget.RecyclerView, int);
-    method public void setVerticalMargin(int);
-    method public void setWindowAlignment(int);
-    method public void setWindowAlignmentOffset(int);
-    method public void setWindowAlignmentOffsetPercent(float);
-  }
-
-  public class GuidanceStylist implements android.support.v17.leanback.widget.FragmentAnimationProvider {
-    ctor public GuidanceStylist();
-    method public android.widget.TextView getBreadcrumbView();
-    method public android.widget.TextView getDescriptionView();
-    method public android.widget.ImageView getIconView();
-    method public android.widget.TextView getTitleView();
-    method public void onActivityEnter(java.util.List<android.animation.Animator>);
-    method public void onActivityExit(java.util.List<android.animation.Animator>);
-    method public android.view.View onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.support.v17.leanback.widget.GuidanceStylist.Guidance);
-    method public void onFragmentEnter(java.util.List<android.animation.Animator>);
-    method public void onFragmentExit(java.util.List<android.animation.Animator>);
-    method public void onFragmentReenter(java.util.List<android.animation.Animator>);
-    method public void onFragmentReturn(java.util.List<android.animation.Animator>);
-    method public int onProvideLayoutId();
-  }
-
-  public static class GuidanceStylist.Guidance {
-    ctor public GuidanceStylist.Guidance(java.lang.String, java.lang.String, java.lang.String, android.graphics.drawable.Drawable);
-    method public java.lang.String getBreadcrumb();
-    method public java.lang.String getDescription();
-    method public android.graphics.drawable.Drawable getIconDrawable();
-    method public java.lang.String getTitle();
-  }
-
-  public class GuidedAction extends android.support.v17.leanback.widget.Action {
-    method public int getCheckSetId();
-    method public java.lang.CharSequence getDescription();
-    method public android.content.Intent getIntent();
-    method public java.lang.CharSequence getTitle();
-    method public boolean hasMultilineDescription();
-    method public boolean hasNext();
-    method public boolean infoOnly();
-    method public boolean isChecked();
-    method public boolean isEnabled();
-    method public void setChecked(boolean);
-    method public void setEnabled(boolean);
-    field public static final int DEFAULT_CHECK_SET_ID = 1; // 0x1
-    field public static final int NO_CHECK_SET = 0; // 0x0
-    field public static final int NO_DRAWABLE = 0; // 0x0
-  }
-
-  public static class GuidedAction.Builder {
-    ctor public GuidedAction.Builder();
-    method public android.support.v17.leanback.widget.GuidedAction build();
-    method public android.support.v17.leanback.widget.GuidedAction.Builder checkSetId(int);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder checked(boolean);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder description(java.lang.String);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder enabled(boolean);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder hasNext(boolean);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder icon(android.graphics.drawable.Drawable);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder iconResourceId(int, android.content.Context);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder id(long);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder infoOnly(boolean);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder intent(android.content.Intent);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder multilineDescription(boolean);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder title(java.lang.String);
-  }
-
-  public class GuidedActionsStylist implements android.support.v17.leanback.widget.FragmentAnimationProvider {
-    ctor public GuidedActionsStylist();
-    method public android.support.v17.leanback.widget.VerticalGridView getActionsGridView();
-    method public void onActivityEnter(java.util.List<android.animation.Animator>);
-    method public void onActivityExit(java.util.List<android.animation.Animator>);
-    method public void onAnimateItemChecked(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, boolean);
-    method public void onAnimateItemFocused(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, boolean);
-    method public void onAnimateItemPressed(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, boolean);
-    method public void onBindViewHolder(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, android.support.v17.leanback.widget.GuidedAction);
-    method public android.view.View onCreateView(android.view.LayoutInflater, android.view.ViewGroup);
-    method public android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder onCreateViewHolder(android.view.ViewGroup);
-    method public void onFragmentEnter(java.util.List<android.animation.Animator>);
-    method public void onFragmentExit(java.util.List<android.animation.Animator>);
-    method public void onFragmentReenter(java.util.List<android.animation.Animator>);
-    method public void onFragmentReturn(java.util.List<android.animation.Animator>);
-    method public int onProvideItemLayoutId();
-    method public int onProvideLayoutId();
-    field protected android.support.v17.leanback.widget.VerticalGridView mActionsGridView;
-    field protected android.view.View mMainView;
-    field protected android.view.View mSelectorView;
-  }
-
-  public static class GuidedActionsStylist.ViewHolder {
-    ctor public GuidedActionsStylist.ViewHolder(android.view.View);
-    method public android.widget.ImageView getCheckmarkView();
-    method public android.widget.ImageView getChevronView();
-    method public android.view.View getContentView();
-    method public android.widget.TextView getDescriptionView();
-    method public android.widget.ImageView getIconView();
-    method public android.widget.TextView getTitleView();
-    field public final android.view.View view;
-  }
-
-  public class HeaderItem {
-    ctor public HeaderItem(long, java.lang.String);
-    ctor public HeaderItem(java.lang.String);
-    method public final long getId();
-    method public final java.lang.String getName();
-  }
-
-  public class HorizontalGridView extends android.support.v7.widget.RecyclerView {
-    ctor public HorizontalGridView(android.content.Context);
-    ctor public HorizontalGridView(android.content.Context, android.util.AttributeSet);
-    ctor public HorizontalGridView(android.content.Context, android.util.AttributeSet, int);
-    method public final boolean getFadingLeftEdge();
-    method public final int getFadingLeftEdgeLength();
-    method public final int getFadingLeftEdgeOffset();
-    method public final boolean getFadingRightEdge();
-    method public final int getFadingRightEdgeLength();
-    method public final int getFadingRightEdgeOffset();
-    method protected void initAttributes(android.content.Context, android.util.AttributeSet);
-    method public final void setFadingLeftEdge(boolean);
-    method public final void setFadingLeftEdgeLength(int);
-    method public final void setFadingLeftEdgeOffset(int);
-    method public final void setFadingRightEdge(boolean);
-    method public final void setFadingRightEdgeLength(int);
-    method public final void setFadingRightEdgeOffset(int);
-    method public void setNumRows(int);
-    method public void setRowHeight(int);
-  }
-
-  public final class HorizontalHoverCardSwitcher extends android.support.v17.leanback.widget.PresenterSwitcher {
-    ctor public HorizontalHoverCardSwitcher();
-    method protected void insertView(android.view.View);
-    method public void select(android.support.v17.leanback.widget.HorizontalGridView, android.view.View, java.lang.Object);
-  }
-
-  public class ImageCardView extends android.support.v17.leanback.widget.BaseCardView {
-    ctor public ImageCardView(android.content.Context);
-    ctor public ImageCardView(android.content.Context, android.util.AttributeSet);
-    ctor public ImageCardView(android.content.Context, android.util.AttributeSet, int);
-    method public android.graphics.drawable.Drawable getBadgeImage();
-    method public java.lang.CharSequence getContentText();
-    method public android.graphics.drawable.Drawable getInfoAreaBackground();
-    method public android.graphics.drawable.Drawable getMainImage();
-    method public final android.widget.ImageView getMainImageView();
-    method public java.lang.CharSequence getTitleText();
-    method public void setBadgeImage(android.graphics.drawable.Drawable);
-    method public void setContentText(java.lang.CharSequence);
-    method public void setInfoAreaBackground(android.graphics.drawable.Drawable);
-    method public void setInfoAreaBackgroundColor(int);
-    method public void setMainImage(android.graphics.drawable.Drawable);
-    method public void setMainImage(android.graphics.drawable.Drawable, boolean);
-    method public void setMainImageAdjustViewBounds(boolean);
-    method public void setMainImageDimensions(int, int);
-    method public void setMainImageScaleType(android.widget.ImageView.ScaleType);
-    method public void setTitleText(java.lang.CharSequence);
-  }
-
-  public class ItemBridgeAdapter extends android.support.v7.widget.RecyclerView.Adapter {
-    ctor public ItemBridgeAdapter(android.support.v17.leanback.widget.ObjectAdapter, android.support.v17.leanback.widget.PresenterSelector);
-    ctor public ItemBridgeAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    ctor public ItemBridgeAdapter();
-    method public void clear();
-    method public int getItemCount();
-    method public java.util.ArrayList<android.support.v17.leanback.widget.Presenter> getPresenterMapper();
-    method public android.support.v17.leanback.widget.ItemBridgeAdapter.Wrapper getWrapper();
-    method protected void onAddPresenter(android.support.v17.leanback.widget.Presenter, int);
-    method protected void onAttachedToWindow(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
-    method protected void onBind(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
-    method public final void onBindViewHolder(android.support.v7.widget.RecyclerView.ViewHolder, int);
-    method protected void onCreate(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
-    method public final android.support.v7.widget.RecyclerView.ViewHolder onCreateViewHolder(android.view.ViewGroup, int);
-    method protected void onDetachedFromWindow(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
-    method protected void onUnbind(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
-    method public final void onViewAttachedToWindow(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public final void onViewDetachedFromWindow(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public final void onViewRecycled(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public void setAdapterListener(android.support.v17.leanback.widget.ItemBridgeAdapter.AdapterListener);
-    method public void setPresenterMapper(java.util.ArrayList<android.support.v17.leanback.widget.Presenter>);
-    method public void setWrapper(android.support.v17.leanback.widget.ItemBridgeAdapter.Wrapper);
-  }
-
-  public static class ItemBridgeAdapter.AdapterListener {
-    ctor public ItemBridgeAdapter.AdapterListener();
-    method public void onAddPresenter(android.support.v17.leanback.widget.Presenter, int);
-    method public void onAttachedToWindow(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
-    method public void onBind(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
-    method public void onCreate(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
-    method public void onDetachedFromWindow(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
-    method public void onUnbind(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
-  }
-
-  public class ItemBridgeAdapter.ViewHolder extends android.support.v7.widget.RecyclerView.ViewHolder {
-    method public final java.lang.Object getExtraObject();
-    method public final java.lang.Object getItem();
-    method public final android.support.v17.leanback.widget.Presenter getPresenter();
-    method public final android.support.v17.leanback.widget.Presenter.ViewHolder getViewHolder();
-    method public void setExtraObject(java.lang.Object);
-  }
-
-  public static abstract class ItemBridgeAdapter.Wrapper {
-    ctor public ItemBridgeAdapter.Wrapper();
-    method public abstract android.view.View createWrapper(android.view.View);
-    method public abstract void wrap(android.view.View, android.view.View);
-  }
-
-  public class ListRow extends android.support.v17.leanback.widget.Row {
-    ctor public ListRow(android.support.v17.leanback.widget.HeaderItem, android.support.v17.leanback.widget.ObjectAdapter);
-    ctor public ListRow(long, android.support.v17.leanback.widget.HeaderItem, android.support.v17.leanback.widget.ObjectAdapter);
-    ctor public ListRow(android.support.v17.leanback.widget.ObjectAdapter);
-    method public final android.support.v17.leanback.widget.ObjectAdapter getAdapter();
-  }
-
-  public final class ListRowHoverCardView extends android.widget.LinearLayout {
-    ctor public ListRowHoverCardView(android.content.Context);
-    ctor public ListRowHoverCardView(android.content.Context, android.util.AttributeSet);
-    ctor public ListRowHoverCardView(android.content.Context, android.util.AttributeSet, int);
-    method public final java.lang.CharSequence getDescription();
-    method public final java.lang.CharSequence getTitle();
-    method public final void setDescription(java.lang.CharSequence);
-    method public final void setTitle(java.lang.CharSequence);
-  }
-
-  public class ListRowPresenter extends android.support.v17.leanback.widget.RowPresenter {
-    ctor public ListRowPresenter();
-    ctor public ListRowPresenter(int);
-    ctor public ListRowPresenter(int, boolean);
-    method public final boolean areChildRoundedCornersEnabled();
-    method protected android.support.v17.leanback.widget.RowPresenter.ViewHolder createRowViewHolder(android.view.ViewGroup);
-    method public final void enableChildRoundedCorners(boolean);
-    method public int getExpandedRowHeight();
-    method public final int getFocusZoomFactor();
-    method public final android.support.v17.leanback.widget.PresenterSelector getHoverCardPresenterSelector();
-    method public int getRecycledPoolSize(android.support.v17.leanback.widget.Presenter);
-    method public int getRowHeight();
-    method public final boolean getShadowEnabled();
-    method public final deprecated int getZoomFactor();
-    method public final boolean isFocusDimmerUsed();
-    method public boolean isUsingDefaultListSelectEffect();
-    method public final boolean isUsingDefaultSelectEffect();
-    method public boolean isUsingDefaultShadow();
-    method public boolean isUsingZOrder();
-    method public void setExpandedRowHeight(int);
-    method public final void setHoverCardPresenterSelector(android.support.v17.leanback.widget.PresenterSelector);
-    method public void setRecycledPoolSize(android.support.v17.leanback.widget.Presenter, int);
-    method public void setRowHeight(int);
-    method public final void setShadowEnabled(boolean);
-  }
-
-  public static class ListRowPresenter.ViewHolder extends android.support.v17.leanback.widget.RowPresenter.ViewHolder {
-    ctor public ListRowPresenter.ViewHolder(android.view.View, android.support.v17.leanback.widget.HorizontalGridView, android.support.v17.leanback.widget.ListRowPresenter);
-    method public final android.support.v17.leanback.widget.ItemBridgeAdapter getBridgeAdapter();
-    method public final android.support.v17.leanback.widget.HorizontalGridView getGridView();
-    method public final android.support.v17.leanback.widget.ListRowPresenter getListRowPresenter();
-  }
-
-  public final class ListRowView extends android.widget.LinearLayout {
-    ctor public ListRowView(android.content.Context);
-    ctor public ListRowView(android.content.Context, android.util.AttributeSet);
-    ctor public ListRowView(android.content.Context, android.util.AttributeSet, int);
-    method public android.support.v17.leanback.widget.HorizontalGridView getGridView();
-  }
-
-  public abstract class ObjectAdapter {
-    ctor public ObjectAdapter(android.support.v17.leanback.widget.PresenterSelector);
-    ctor public ObjectAdapter(android.support.v17.leanback.widget.Presenter);
-    ctor public ObjectAdapter();
-    method public abstract java.lang.Object get(int);
-    method public long getId(int);
-    method public final android.support.v17.leanback.widget.Presenter getPresenter(java.lang.Object);
-    method public final android.support.v17.leanback.widget.PresenterSelector getPresenterSelector();
-    method public final boolean hasStableIds();
-    method protected final void notifyChanged();
-    method protected final void notifyItemRangeChanged(int, int);
-    method protected final void notifyItemRangeInserted(int, int);
-    method protected final void notifyItemRangeRemoved(int, int);
-    method protected void onHasStableIdsChanged();
-    method protected void onPresenterSelectorChanged();
-    method public final void registerObserver(android.support.v17.leanback.widget.ObjectAdapter.DataObserver);
-    method public final void setHasStableIds(boolean);
-    method public final void setPresenterSelector(android.support.v17.leanback.widget.PresenterSelector);
-    method public abstract int size();
-    method public final void unregisterAllObservers();
-    method public final void unregisterObserver(android.support.v17.leanback.widget.ObjectAdapter.DataObserver);
-    field public static final int NO_ID = -1; // 0xffffffff
-  }
-
-  public static abstract class ObjectAdapter.DataObserver {
-    ctor public ObjectAdapter.DataObserver();
-    method public void onChanged();
-    method public void onItemRangeChanged(int, int);
-    method public void onItemRangeInserted(int, int);
-    method public void onItemRangeRemoved(int, int);
-  }
-
-  public abstract interface OnActionClickedListener {
-    method public abstract void onActionClicked(android.support.v17.leanback.widget.Action);
-  }
-
-  public abstract interface OnChildLaidOutListener {
-    method public abstract void onChildLaidOut(android.view.ViewGroup, android.view.View, int, long);
-  }
-
-  public abstract interface OnChildSelectedListener {
-    method public abstract void onChildSelected(android.view.ViewGroup, android.view.View, int, long);
-  }
-
-  public abstract interface OnItemViewClickedListener {
-    method public abstract void onItemClicked(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object, android.support.v17.leanback.widget.RowPresenter.ViewHolder, android.support.v17.leanback.widget.Row);
-  }
-
-  public abstract interface OnItemViewSelectedListener {
-    method public abstract void onItemSelected(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object, android.support.v17.leanback.widget.RowPresenter.ViewHolder, android.support.v17.leanback.widget.Row);
-  }
-
-  public class PlaybackControlsRow extends android.support.v17.leanback.widget.Row {
-    ctor public PlaybackControlsRow(java.lang.Object);
-    ctor public PlaybackControlsRow();
-    method public android.support.v17.leanback.widget.Action getActionForKeyCode(int);
-    method public android.support.v17.leanback.widget.Action getActionForKeyCode(android.support.v17.leanback.widget.ObjectAdapter, int);
-    method public int getBufferedProgress();
-    method public int getCurrentTime();
-    method public final android.graphics.drawable.Drawable getImageDrawable();
-    method public final java.lang.Object getItem();
-    method public final android.support.v17.leanback.widget.ObjectAdapter getPrimaryActionsAdapter();
-    method public final android.support.v17.leanback.widget.ObjectAdapter getSecondaryActionsAdapter();
-    method public int getTotalTime();
-    method public void setBufferedProgress(int);
-    method public void setCurrentTime(int);
-    method public final void setImageBitmap(android.content.Context, android.graphics.Bitmap);
-    method public final void setImageDrawable(android.graphics.drawable.Drawable);
-    method public final void setPrimaryActionsAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public final void setSecondaryActionsAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public void setTotalTime(int);
-  }
-
-  public static class PlaybackControlsRow.ClosedCaptioningAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
-    ctor public PlaybackControlsRow.ClosedCaptioningAction(android.content.Context);
-    ctor public PlaybackControlsRow.ClosedCaptioningAction(android.content.Context, int);
-    field public static int OFF;
-    field public static int ON;
-  }
-
-  public static class PlaybackControlsRow.FastForwardAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
-    ctor public PlaybackControlsRow.FastForwardAction(android.content.Context);
-    ctor public PlaybackControlsRow.FastForwardAction(android.content.Context, int);
-  }
-
-  public static class PlaybackControlsRow.HighQualityAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
-    ctor public PlaybackControlsRow.HighQualityAction(android.content.Context);
-    ctor public PlaybackControlsRow.HighQualityAction(android.content.Context, int);
-    field public static int OFF;
-    field public static int ON;
-  }
-
-  public static class PlaybackControlsRow.MoreActions extends android.support.v17.leanback.widget.Action {
-    ctor public PlaybackControlsRow.MoreActions(android.content.Context);
-  }
-
-  public static abstract class PlaybackControlsRow.MultiAction extends android.support.v17.leanback.widget.Action {
-    ctor public PlaybackControlsRow.MultiAction(int);
-    method public int getActionCount();
-    method public android.graphics.drawable.Drawable getDrawable(int);
-    method public int getIndex();
-    method public java.lang.String getLabel(int);
-    method public java.lang.String getSecondaryLabel(int);
-    method public void nextIndex();
-    method public void setDrawables(android.graphics.drawable.Drawable[]);
-    method public void setIndex(int);
-    method public void setLabels(java.lang.String[]);
-    method public void setSecondaryLabels(java.lang.String[]);
-  }
-
-  public static class PlaybackControlsRow.PlayPauseAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
-    ctor public PlaybackControlsRow.PlayPauseAction(android.content.Context);
-    field public static int PAUSE;
-    field public static int PLAY;
-  }
-
-  public static class PlaybackControlsRow.RepeatAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
-    ctor public PlaybackControlsRow.RepeatAction(android.content.Context);
-    ctor public PlaybackControlsRow.RepeatAction(android.content.Context, int);
-    ctor public PlaybackControlsRow.RepeatAction(android.content.Context, int, int);
-    field public static int ALL;
-    field public static int NONE;
-    field public static int ONE;
-  }
-
-  public static class PlaybackControlsRow.RewindAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
-    ctor public PlaybackControlsRow.RewindAction(android.content.Context);
-    ctor public PlaybackControlsRow.RewindAction(android.content.Context, int);
-  }
-
-  public static class PlaybackControlsRow.ShuffleAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
-    ctor public PlaybackControlsRow.ShuffleAction(android.content.Context);
-    ctor public PlaybackControlsRow.ShuffleAction(android.content.Context, int);
-    field public static int OFF;
-    field public static int ON;
-  }
-
-  public static class PlaybackControlsRow.SkipNextAction extends android.support.v17.leanback.widget.Action {
-    ctor public PlaybackControlsRow.SkipNextAction(android.content.Context);
-  }
-
-  public static class PlaybackControlsRow.SkipPreviousAction extends android.support.v17.leanback.widget.Action {
-    ctor public PlaybackControlsRow.SkipPreviousAction(android.content.Context);
-  }
-
-  public static abstract class PlaybackControlsRow.ThumbsAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
-    ctor public PlaybackControlsRow.ThumbsAction(int, android.content.Context, int, int);
-    field public static int OUTLINE;
-    field public static int SOLID;
-  }
-
-  public static class PlaybackControlsRow.ThumbsDownAction extends android.support.v17.leanback.widget.PlaybackControlsRow.ThumbsAction {
-    ctor public PlaybackControlsRow.ThumbsDownAction(android.content.Context);
-  }
-
-  public static class PlaybackControlsRow.ThumbsUpAction extends android.support.v17.leanback.widget.PlaybackControlsRow.ThumbsAction {
-    ctor public PlaybackControlsRow.ThumbsUpAction(android.content.Context);
-  }
-
-  public class PlaybackControlsRowPresenter extends android.support.v17.leanback.widget.RowPresenter {
-    ctor public PlaybackControlsRowPresenter(android.support.v17.leanback.widget.Presenter);
-    ctor public PlaybackControlsRowPresenter();
-    method public boolean areSecondaryActionsHidden();
-    method protected android.support.v17.leanback.widget.RowPresenter.ViewHolder createRowViewHolder(android.view.ViewGroup);
-    method public int getBackgroundColor();
-    method public android.support.v17.leanback.widget.OnActionClickedListener getOnActionClickedListener();
-    method public int getProgressColor();
-    method public void setBackgroundColor(int);
-    method public void setOnActionClickedListener(android.support.v17.leanback.widget.OnActionClickedListener);
-    method public void setProgressColor(int);
-    method public void setSecondaryActionsHidden(boolean);
-    method public void showBottomSpace(android.support.v17.leanback.widget.PlaybackControlsRowPresenter.ViewHolder, boolean);
-    method public void showPrimaryActions(android.support.v17.leanback.widget.PlaybackControlsRowPresenter.ViewHolder);
-  }
-
-  public class PlaybackControlsRowPresenter.ViewHolder extends android.support.v17.leanback.widget.RowPresenter.ViewHolder {
-    field public final android.support.v17.leanback.widget.Presenter.ViewHolder mDescriptionViewHolder;
-  }
-
-  public abstract class Presenter {
-    ctor public Presenter();
-    method protected static void cancelAnimationsRecursive(android.view.View);
-    method public abstract void onBindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object);
-    method public abstract android.support.v17.leanback.widget.Presenter.ViewHolder onCreateViewHolder(android.view.ViewGroup);
-    method public abstract void onUnbindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public void onViewAttachedToWindow(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public void onViewDetachedFromWindow(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public void setOnClickListener(android.support.v17.leanback.widget.Presenter.ViewHolder, android.view.View.OnClickListener);
-  }
-
-  public static class Presenter.ViewHolder {
-    ctor public Presenter.ViewHolder(android.view.View);
-    field public final android.view.View view;
-  }
-
-  public abstract class PresenterSelector {
-    ctor public PresenterSelector();
-    method public abstract android.support.v17.leanback.widget.Presenter getPresenter(java.lang.Object);
-  }
-
-  public abstract class PresenterSwitcher {
-    ctor public PresenterSwitcher();
-    method public void clear();
-    method public final android.view.ViewGroup getParentViewGroup();
-    method public void init(android.view.ViewGroup, android.support.v17.leanback.widget.PresenterSelector);
-    method protected abstract void insertView(android.view.View);
-    method protected void onViewSelected(android.view.View);
-    method public void select(java.lang.Object);
-    method protected void showView(android.view.View, boolean);
-    method public void unselect();
-  }
-
-  public class Row {
-    ctor public Row(long, android.support.v17.leanback.widget.HeaderItem);
-    ctor public Row(android.support.v17.leanback.widget.HeaderItem);
-    ctor public Row();
-    method public final android.support.v17.leanback.widget.HeaderItem getHeaderItem();
-    method public final long getId();
-    method public final void setHeaderItem(android.support.v17.leanback.widget.HeaderItem);
-    method public final void setId(long);
-  }
-
-  public class RowHeaderPresenter extends android.support.v17.leanback.widget.Presenter {
-    ctor public RowHeaderPresenter();
-    method protected static float getFontDescent(android.widget.TextView, android.graphics.Paint);
-    method public int getSpaceUnderBaseline(android.support.v17.leanback.widget.RowHeaderPresenter.ViewHolder);
-    method public boolean isNullItemVisibilityGone();
-    method public void onBindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object);
-    method public android.support.v17.leanback.widget.Presenter.ViewHolder onCreateViewHolder(android.view.ViewGroup);
-    method protected void onSelectLevelChanged(android.support.v17.leanback.widget.RowHeaderPresenter.ViewHolder);
-    method public void onUnbindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public void setNullItemVisibilityGone(boolean);
-    method public final void setSelectLevel(android.support.v17.leanback.widget.RowHeaderPresenter.ViewHolder, float);
-  }
-
-  public static class RowHeaderPresenter.ViewHolder extends android.support.v17.leanback.widget.Presenter.ViewHolder {
-    ctor public RowHeaderPresenter.ViewHolder(android.view.View);
-    method public final float getSelectLevel();
-  }
-
-  public final class RowHeaderView extends android.widget.TextView {
-    ctor public RowHeaderView(android.content.Context);
-    ctor public RowHeaderView(android.content.Context, android.util.AttributeSet);
-    ctor public RowHeaderView(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public abstract class RowPresenter extends android.support.v17.leanback.widget.Presenter {
-    ctor public RowPresenter();
-    method public boolean canDrawOutOfBounds();
-    method protected abstract android.support.v17.leanback.widget.RowPresenter.ViewHolder createRowViewHolder(android.view.ViewGroup);
-    method protected void dispatchItemSelectedListener(android.support.v17.leanback.widget.RowPresenter.ViewHolder, boolean);
-    method public void freeze(android.support.v17.leanback.widget.RowPresenter.ViewHolder, boolean);
-    method public final android.support.v17.leanback.widget.RowHeaderPresenter getHeaderPresenter();
-    method public final android.support.v17.leanback.widget.RowPresenter.ViewHolder getRowViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public final boolean getSelectEffectEnabled();
-    method public final float getSelectLevel(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public final int getSyncActivatePolicy();
-    method protected void initializeRowViewHolder(android.support.v17.leanback.widget.RowPresenter.ViewHolder);
-    method public boolean isUsingDefaultSelectEffect();
-    method protected void onBindRowViewHolder(android.support.v17.leanback.widget.RowPresenter.ViewHolder, java.lang.Object);
-    method public final void onBindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object);
-    method public final android.support.v17.leanback.widget.Presenter.ViewHolder onCreateViewHolder(android.view.ViewGroup);
-    method protected void onRowViewAttachedToWindow(android.support.v17.leanback.widget.RowPresenter.ViewHolder);
-    method protected void onRowViewDetachedFromWindow(android.support.v17.leanback.widget.RowPresenter.ViewHolder);
-    method protected void onRowViewExpanded(android.support.v17.leanback.widget.RowPresenter.ViewHolder, boolean);
-    method protected void onRowViewSelected(android.support.v17.leanback.widget.RowPresenter.ViewHolder, boolean);
-    method protected void onSelectLevelChanged(android.support.v17.leanback.widget.RowPresenter.ViewHolder);
-    method protected void onUnbindRowViewHolder(android.support.v17.leanback.widget.RowPresenter.ViewHolder);
-    method public final void onUnbindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public final void onViewAttachedToWindow(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public final void onViewDetachedFromWindow(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public void setEntranceTransitionState(android.support.v17.leanback.widget.RowPresenter.ViewHolder, boolean);
-    method public final void setHeaderPresenter(android.support.v17.leanback.widget.RowHeaderPresenter);
-    method public final void setRowViewExpanded(android.support.v17.leanback.widget.Presenter.ViewHolder, boolean);
-    method public final void setRowViewSelected(android.support.v17.leanback.widget.Presenter.ViewHolder, boolean);
-    method public final void setSelectEffectEnabled(boolean);
-    method public final void setSelectLevel(android.support.v17.leanback.widget.Presenter.ViewHolder, float);
-    method public final void setSyncActivatePolicy(int);
-    field public static final int SYNC_ACTIVATED_CUSTOM = 0; // 0x0
-    field public static final int SYNC_ACTIVATED_TO_EXPANDED = 1; // 0x1
-    field public static final int SYNC_ACTIVATED_TO_EXPANDED_AND_SELECTED = 3; // 0x3
-    field public static final int SYNC_ACTIVATED_TO_SELECTED = 2; // 0x2
-  }
-
-  public static class RowPresenter.ViewHolder extends android.support.v17.leanback.widget.Presenter.ViewHolder {
-    ctor public RowPresenter.ViewHolder(android.view.View);
-    method public final android.support.v17.leanback.widget.RowHeaderPresenter.ViewHolder getHeaderViewHolder();
-    method public final android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public final android.support.v17.leanback.widget.OnItemViewSelectedListener getOnItemViewSelectedListener();
-    method public android.view.View.OnKeyListener getOnKeyListener();
-    method public final android.support.v17.leanback.widget.Row getRow();
-    method public final float getSelectLevel();
-    method public final boolean isExpanded();
-    method public final boolean isSelected();
-    method public final void setActivated(boolean);
-    method public final void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public final void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public void setOnKeyListener(android.view.View.OnKeyListener);
-    method public final void syncActivatedStatus(android.view.View);
-    field protected final android.support.v17.leanback.graphics.ColorOverlayDimmer mColorDimmer;
-  }
-
-  public class SearchBar extends android.widget.RelativeLayout {
-    ctor public SearchBar(android.content.Context);
-    ctor public SearchBar(android.content.Context, android.util.AttributeSet);
-    ctor public SearchBar(android.content.Context, android.util.AttributeSet, int);
-    method public void displayCompletions(java.util.List<java.lang.String>);
-    method public android.graphics.drawable.Drawable getBadgeDrawable();
-    method public java.lang.CharSequence getHint();
-    method public java.lang.String getTitle();
-    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
-    method public void setSearchBarListener(android.support.v17.leanback.widget.SearchBar.SearchBarListener);
-    method public void setSearchQuery(java.lang.String);
-    method public void setSpeechRecognitionCallback(android.support.v17.leanback.widget.SpeechRecognitionCallback);
-    method public void setSpeechRecognizer(android.speech.SpeechRecognizer);
-    method public void setTitle(java.lang.String);
-    method public void startRecognition();
-    method public void stopRecognition();
-  }
-
-  public static abstract interface SearchBar.SearchBarListener {
-    method public abstract void onKeyboardDismiss(java.lang.String);
-    method public abstract void onSearchQueryChange(java.lang.String);
-    method public abstract void onSearchQuerySubmit(java.lang.String);
-  }
-
-  public class SearchEditText extends android.support.v17.leanback.widget.StreamingTextView {
-    ctor public SearchEditText(android.content.Context);
-    ctor public SearchEditText(android.content.Context, android.util.AttributeSet);
-    ctor public SearchEditText(android.content.Context, android.util.AttributeSet, int);
-    method public void setOnKeyboardDismissListener(android.support.v17.leanback.widget.SearchEditText.OnKeyboardDismissListener);
-  }
-
-  public static abstract interface SearchEditText.OnKeyboardDismissListener {
-    method public abstract void onKeyboardDismiss();
-  }
-
-  public class SearchOrbView extends android.widget.FrameLayout implements android.view.View.OnClickListener {
-    ctor public SearchOrbView(android.content.Context);
-    ctor public SearchOrbView(android.content.Context, android.util.AttributeSet);
-    ctor public SearchOrbView(android.content.Context, android.util.AttributeSet, int);
-    method public void enableOrbColorAnimation(boolean);
-    method public int getOrbColor();
-    method public android.support.v17.leanback.widget.SearchOrbView.Colors getOrbColors();
-    method public android.graphics.drawable.Drawable getOrbIcon();
-    method public void onClick(android.view.View);
-    method public void setOnOrbClickedListener(android.view.View.OnClickListener);
-    method public void setOrbColor(int);
-    method public deprecated void setOrbColor(int, int);
-    method public void setOrbColors(android.support.v17.leanback.widget.SearchOrbView.Colors);
-    method public void setOrbIcon(android.graphics.drawable.Drawable);
-  }
-
-  public static class SearchOrbView.Colors {
-    ctor public SearchOrbView.Colors(int);
-    ctor public SearchOrbView.Colors(int, int);
-    ctor public SearchOrbView.Colors(int, int, int);
-    method public static int getBrightColor(int);
-    field public int brightColor;
-    field public int color;
-    field public int iconColor;
-  }
-
-  public class ShadowOverlayContainer extends android.view.ViewGroup {
-    ctor public ShadowOverlayContainer(android.content.Context);
-    ctor public ShadowOverlayContainer(android.content.Context, android.util.AttributeSet);
-    ctor public ShadowOverlayContainer(android.content.Context, android.util.AttributeSet, int);
-    method public deprecated void initialize(boolean, boolean);
-    method public void initialize(boolean, boolean, boolean);
-    method protected void onLayout(boolean, int, int, int, int);
-    method public static void prepareParentForShadow(android.view.ViewGroup);
-    method public void setOverlayColor(int);
-    method public void setShadowFocusLevel(float);
-    method public static boolean supportsShadow();
-    method public void wrap(android.view.View);
-  }
-
-  public final class SinglePresenterSelector extends android.support.v17.leanback.widget.PresenterSelector {
-    ctor public SinglePresenterSelector(android.support.v17.leanback.widget.Presenter);
-    method public android.support.v17.leanback.widget.Presenter getPresenter(java.lang.Object);
-  }
-
-  public class SparseArrayObjectAdapter extends android.support.v17.leanback.widget.ObjectAdapter {
-    ctor public SparseArrayObjectAdapter(android.support.v17.leanback.widget.PresenterSelector);
-    ctor public SparseArrayObjectAdapter(android.support.v17.leanback.widget.Presenter);
-    ctor public SparseArrayObjectAdapter();
-    method public void clear(int);
-    method public void clear();
-    method public java.lang.Object get(int);
-    method public int indexOf(java.lang.Object);
-    method public int indexOf(int);
-    method public java.lang.Object lookup(int);
-    method public void notifyArrayItemRangeChanged(int, int);
-    method public void set(int, java.lang.Object);
-    method public int size();
-  }
-
-  public class SpeechOrbView extends android.support.v17.leanback.widget.SearchOrbView {
-    ctor public SpeechOrbView(android.content.Context);
-    ctor public SpeechOrbView(android.content.Context, android.util.AttributeSet);
-    ctor public SpeechOrbView(android.content.Context, android.util.AttributeSet, int);
-    method public void setSoundLevel(int);
-    method public void showListening();
-    method public void showNotListening();
-  }
-
-  public abstract interface SpeechRecognitionCallback {
-    method public abstract void recognizeSpeech();
-  }
-
-   class StreamingTextView extends android.widget.EditText {
-    ctor public StreamingTextView(android.content.Context, android.util.AttributeSet);
-    ctor public StreamingTextView(android.content.Context, android.util.AttributeSet, int);
-    method public static boolean isLayoutRtl(android.view.View);
-    method public void reset();
-    method public void setFinalRecognizedText(java.lang.CharSequence);
-    method public void updateRecognizedText(java.lang.String, java.lang.String);
-    method public void updateRecognizedText(java.lang.String, java.util.List<java.lang.Float>);
-  }
-
-  public class TitleHelper {
-    ctor public TitleHelper(android.view.ViewGroup, android.support.v17.leanback.widget.TitleView);
-    method public android.support.v17.leanback.widget.BrowseFrameLayout.OnFocusSearchListener getOnFocusSearchListener();
-    method public android.view.ViewGroup getSceneRoot();
-    method public android.support.v17.leanback.widget.TitleView getTitleView();
-    method public void showTitle(boolean);
-  }
-
-  public class TitleView extends android.widget.FrameLayout {
-    ctor public TitleView(android.content.Context);
-    ctor public TitleView(android.content.Context, android.util.AttributeSet);
-    ctor public TitleView(android.content.Context, android.util.AttributeSet, int);
-    method public void enableAnimation(boolean);
-    method public android.graphics.drawable.Drawable getBadgeDrawable();
-    method public android.support.v17.leanback.widget.SearchOrbView.Colors getSearchAffordanceColors();
-    method public android.view.View getSearchAffordanceView();
-    method public java.lang.CharSequence getTitle();
-    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
-    method public void setOnSearchClickedListener(android.view.View.OnClickListener);
-    method public void setSearchAffordanceColors(android.support.v17.leanback.widget.SearchOrbView.Colors);
-    method public void setTitle(java.lang.String);
-  }
-
-  public class VerticalGridPresenter extends android.support.v17.leanback.widget.Presenter {
-    ctor public VerticalGridPresenter();
-    ctor public VerticalGridPresenter(int);
-    ctor public VerticalGridPresenter(int, boolean);
-    method public final boolean areChildRoundedCornersEnabled();
-    method protected android.support.v17.leanback.widget.VerticalGridPresenter.ViewHolder createGridViewHolder(android.view.ViewGroup);
-    method public final void enableChildRoundedCorners(boolean);
-    method public final int getFocusZoomFactor();
-    method public int getNumberOfColumns();
-    method public final android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public final android.support.v17.leanback.widget.OnItemViewSelectedListener getOnItemViewSelectedListener();
-    method public final boolean getShadowEnabled();
-    method protected void initializeGridViewHolder(android.support.v17.leanback.widget.VerticalGridPresenter.ViewHolder);
-    method public final boolean isFocusDimmerUsed();
-    method public boolean isUsingDefaultShadow();
-    method public boolean isUsingZOrder();
-    method public void onBindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object);
-    method public final android.support.v17.leanback.widget.VerticalGridPresenter.ViewHolder onCreateViewHolder(android.view.ViewGroup);
-    method public void onUnbindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public void setNumberOfColumns(int);
-    method public final void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public final void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public final void setShadowEnabled(boolean);
-  }
-
-  public static class VerticalGridPresenter.ViewHolder extends android.support.v17.leanback.widget.Presenter.ViewHolder {
-    ctor public VerticalGridPresenter.ViewHolder(android.support.v17.leanback.widget.VerticalGridView);
-    method public android.support.v17.leanback.widget.VerticalGridView getGridView();
-  }
-
-  public class VerticalGridView extends android.support.v7.widget.RecyclerView {
-    ctor public VerticalGridView(android.content.Context);
-    ctor public VerticalGridView(android.content.Context, android.util.AttributeSet);
-    ctor public VerticalGridView(android.content.Context, android.util.AttributeSet, int);
-    method protected void initAttributes(android.content.Context, android.util.AttributeSet);
-    method public void setColumnWidth(int);
-    method public void setNumColumns(int);
-  }
-
-}
-
diff --git a/v17/leanback/api/22.2.0.txt b/v17/leanback/api/22.2.0.txt
deleted file mode 100644
index 5301d5e..0000000
--- a/v17/leanback/api/22.2.0.txt
+++ /dev/null
@@ -1,1552 +0,0 @@
-package android.support.v17.leanback.app {
-
-  public final class BackgroundManager {
-    method public void attach(android.view.Window);
-    method public final int getColor();
-    method public android.graphics.drawable.Drawable getDefaultDimLayer();
-    method public android.graphics.drawable.Drawable getDimLayer();
-    method public android.graphics.drawable.Drawable getDrawable();
-    method public static android.support.v17.leanback.app.BackgroundManager getInstance(android.app.Activity);
-    method public boolean isAttached();
-    method public void release();
-    method public void setBitmap(android.graphics.Bitmap);
-    method public void setColor(int);
-    method public void setDimLayer(android.graphics.drawable.Drawable);
-    method public void setDrawable(android.graphics.drawable.Drawable);
-    method public void setThemeDrawableResourceId(int);
-  }
-
-   abstract class BaseRowFragment extends android.app.Fragment {
-    method public final android.support.v17.leanback.widget.ObjectAdapter getAdapter();
-    method public final android.support.v17.leanback.widget.PresenterSelector getPresenterSelector();
-    method public final void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public final void setPresenterSelector(android.support.v17.leanback.widget.PresenterSelector);
-    method public void setSelectedPosition(int);
-    method public void setSelectedPosition(int, boolean);
-  }
-
-   abstract class BaseRowSupportFragment extends android.support.v4.app.Fragment {
-    method public final android.support.v17.leanback.widget.ObjectAdapter getAdapter();
-    method public final android.support.v17.leanback.widget.PresenterSelector getPresenterSelector();
-    method public final void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public final void setPresenterSelector(android.support.v17.leanback.widget.PresenterSelector);
-    method public void setSelectedPosition(int);
-    method public void setSelectedPosition(int, boolean);
-  }
-
-  public class BrowseFragment extends android.support.v17.leanback.app.BrandedFragment {
-    ctor public BrowseFragment();
-    method public static android.os.Bundle createArgs(android.os.Bundle, java.lang.String, int);
-    method public void enableRowScaling(boolean);
-    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
-    method public int getBrandColor();
-    method public int getHeadersState();
-    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public android.support.v17.leanback.widget.OnItemViewSelectedListener getOnItemViewSelectedListener();
-    method public final boolean isHeadersTransitionOnBackEnabled();
-    method public boolean isInHeadersTransition();
-    method public boolean isShowingHeaders();
-    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public void setBrandColor(int);
-    method public void setBrowseTransitionListener(android.support.v17.leanback.app.BrowseFragment.BrowseTransitionListener);
-    method public void setHeaderPresenterSelector(android.support.v17.leanback.widget.PresenterSelector);
-    method public void setHeadersState(int);
-    method public final void setHeadersTransitionOnBackEnabled(boolean);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public void setSelectedPosition(int);
-    method public void setSelectedPosition(int, boolean);
-    method public void startHeadersTransition(boolean);
-    field public static final int HEADERS_DISABLED = 3; // 0x3
-    field public static final int HEADERS_ENABLED = 1; // 0x1
-    field public static final int HEADERS_HIDDEN = 2; // 0x2
-  }
-
-  public static class BrowseFragment.BrowseTransitionListener {
-    ctor public BrowseFragment.BrowseTransitionListener();
-    method public void onHeadersTransitionStart(boolean);
-    method public void onHeadersTransitionStop(boolean);
-  }
-
-  public class BrowseSupportFragment extends android.support.v17.leanback.app.BrandedSupportFragment {
-    ctor public BrowseSupportFragment();
-    method public static android.os.Bundle createArgs(android.os.Bundle, java.lang.String, int);
-    method public void enableRowScaling(boolean);
-    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
-    method public int getBrandColor();
-    method public int getHeadersState();
-    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public android.support.v17.leanback.widget.OnItemViewSelectedListener getOnItemViewSelectedListener();
-    method public final boolean isHeadersTransitionOnBackEnabled();
-    method public boolean isInHeadersTransition();
-    method public boolean isShowingHeaders();
-    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public void setBrandColor(int);
-    method public void setBrowseTransitionListener(android.support.v17.leanback.app.BrowseSupportFragment.BrowseTransitionListener);
-    method public void setHeaderPresenterSelector(android.support.v17.leanback.widget.PresenterSelector);
-    method public void setHeadersState(int);
-    method public final void setHeadersTransitionOnBackEnabled(boolean);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public void setSelectedPosition(int);
-    method public void setSelectedPosition(int, boolean);
-    method public void startHeadersTransition(boolean);
-    field public static final int HEADERS_DISABLED = 3; // 0x3
-    field public static final int HEADERS_ENABLED = 1; // 0x1
-    field public static final int HEADERS_HIDDEN = 2; // 0x2
-  }
-
-  public static class BrowseSupportFragment.BrowseTransitionListener {
-    ctor public BrowseSupportFragment.BrowseTransitionListener();
-    method public void onHeadersTransitionStart(boolean);
-    method public void onHeadersTransitionStop(boolean);
-  }
-
-  public class DetailsFragment extends android.support.v17.leanback.app.BrandedFragment {
-    ctor public DetailsFragment();
-    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
-    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public void setSelectedPosition(int);
-    method public void setSelectedPosition(int, boolean);
-  }
-
-  public class DetailsSupportFragment extends android.support.v17.leanback.app.BrandedSupportFragment {
-    ctor public DetailsSupportFragment();
-    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
-    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public void setSelectedPosition(int);
-    method public void setSelectedPosition(int, boolean);
-  }
-
-  public class ErrorFragment extends android.app.Fragment {
-    ctor public ErrorFragment();
-    method public android.graphics.drawable.Drawable getBackgroundDrawable();
-    method public android.graphics.drawable.Drawable getBadgeDrawable();
-    method public android.view.View.OnClickListener getButtonClickListener();
-    method public java.lang.String getButtonText();
-    method public android.graphics.drawable.Drawable getImageDrawable();
-    method public java.lang.CharSequence getMessage();
-    method public java.lang.String getTitle();
-    method public boolean isBackgroundTranslucent();
-    method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
-    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
-    method public void setButtonClickListener(android.view.View.OnClickListener);
-    method public void setButtonText(java.lang.String);
-    method public void setDefaultBackground(boolean);
-    method public void setImageDrawable(android.graphics.drawable.Drawable);
-    method public void setMessage(java.lang.CharSequence);
-    method public void setTitle(java.lang.String);
-  }
-
-  public class ErrorSupportFragment extends android.support.v4.app.Fragment {
-    ctor public ErrorSupportFragment();
-    method public android.graphics.drawable.Drawable getBackgroundDrawable();
-    method public android.graphics.drawable.Drawable getBadgeDrawable();
-    method public android.view.View.OnClickListener getButtonClickListener();
-    method public java.lang.String getButtonText();
-    method public android.graphics.drawable.Drawable getImageDrawable();
-    method public java.lang.CharSequence getMessage();
-    method public java.lang.String getTitle();
-    method public boolean isBackgroundTranslucent();
-    method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
-    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
-    method public void setButtonClickListener(android.view.View.OnClickListener);
-    method public void setButtonText(java.lang.String);
-    method public void setDefaultBackground(boolean);
-    method public void setImageDrawable(android.graphics.drawable.Drawable);
-    method public void setMessage(java.lang.CharSequence);
-    method public void setTitle(java.lang.String);
-  }
-
-  public class GuidedStepFragment extends android.app.Fragment {
-    ctor public GuidedStepFragment();
-    method public static int add(android.app.FragmentManager, android.support.v17.leanback.app.GuidedStepFragment);
-    method public android.view.View getActionItemView(int);
-    method public java.util.List<android.support.v17.leanback.widget.GuidedAction> getActions();
-    method public static android.support.v17.leanback.app.GuidedStepFragment getCurrentGuidedStepFragment(android.app.FragmentManager);
-    method public android.support.v17.leanback.widget.GuidanceStylist getGuidanceStylist();
-    method public android.support.v17.leanback.widget.GuidedActionsStylist getGuidedActionsStylist();
-    method public int getSelectedActionPosition();
-    method protected boolean isEntryTransitionEnabled();
-    method public void onCreateActions(java.util.List<android.support.v17.leanback.widget.GuidedAction>, android.os.Bundle);
-    method public android.support.v17.leanback.widget.GuidedActionsStylist onCreateActionsStylist();
-    method public android.support.v17.leanback.widget.GuidanceStylist.Guidance onCreateGuidance(android.os.Bundle);
-    method public android.support.v17.leanback.widget.GuidanceStylist onCreateGuidanceStylist();
-    method public void onGuidedActionClicked(android.support.v17.leanback.widget.GuidedAction);
-    method public void onGuidedActionFocused(android.support.v17.leanback.widget.GuidedAction);
-    method public int onProvideTheme();
-    method public void setActions(java.util.List<android.support.v17.leanback.widget.GuidedAction>);
-    method protected void setEntryTransitionEnabled(boolean);
-    method public void setSelectedActionPosition(int);
-  }
-
-  public class HeadersFragment extends android.support.v17.leanback.app.BaseRowFragment {
-    ctor public HeadersFragment();
-    method public void setOnHeaderClickedListener(android.support.v17.leanback.app.HeadersFragment.OnHeaderClickedListener);
-    method public void setOnHeaderViewSelectedListener(android.support.v17.leanback.app.HeadersFragment.OnHeaderViewSelectedListener);
-  }
-
-   static abstract interface HeadersFragment.OnHeaderClickedListener {
-    method public abstract void onHeaderClicked();
-  }
-
-   static abstract interface HeadersFragment.OnHeaderViewSelectedListener {
-    method public abstract void onHeaderSelected(android.support.v17.leanback.widget.RowHeaderPresenter.ViewHolder, android.support.v17.leanback.widget.Row);
-  }
-
-  public class HeadersSupportFragment extends android.support.v17.leanback.app.BaseRowSupportFragment {
-    ctor public HeadersSupportFragment();
-    method public void setOnHeaderClickedListener(android.support.v17.leanback.app.HeadersSupportFragment.OnHeaderClickedListener);
-    method public void setOnHeaderViewSelectedListener(android.support.v17.leanback.app.HeadersSupportFragment.OnHeaderViewSelectedListener);
-  }
-
-   static abstract interface HeadersSupportFragment.OnHeaderClickedListener {
-    method public abstract void onHeaderClicked();
-  }
-
-   static abstract interface HeadersSupportFragment.OnHeaderViewSelectedListener {
-    method public abstract void onHeaderSelected(android.support.v17.leanback.widget.RowHeaderPresenter.ViewHolder, android.support.v17.leanback.widget.Row);
-  }
-
-  public abstract class MediaControllerGlue extends android.support.v17.leanback.app.PlaybackControlGlue {
-    ctor public MediaControllerGlue(android.content.Context, android.support.v17.leanback.app.PlaybackOverlayFragment, int[]);
-    ctor public MediaControllerGlue(android.content.Context, android.support.v17.leanback.app.PlaybackOverlayFragment, int[], int[]);
-    method public void attachToMediaController(android.support.v4.media.session.MediaControllerCompat);
-    method public void detach();
-    method public int getCurrentPosition();
-    method public int getCurrentSpeedId();
-    method public android.graphics.drawable.Drawable getMediaArt();
-    method public final android.support.v4.media.session.MediaControllerCompat getMediaController();
-    method public int getMediaDuration();
-    method public java.lang.CharSequence getMediaSubtitle();
-    method public java.lang.CharSequence getMediaTitle();
-    method public long getSupportedActions();
-    method public boolean hasValidMedia();
-    method public boolean isMediaPlaying();
-    method protected void pausePlayback();
-    method protected void skipToNext();
-    method protected void skipToPrevious();
-    method protected void startPlayback(int);
-  }
-
-  public abstract class PlaybackControlGlue implements android.support.v17.leanback.widget.OnActionClickedListener android.view.View.OnKeyListener {
-    ctor public PlaybackControlGlue(android.content.Context, int[]);
-    ctor public PlaybackControlGlue(android.content.Context, int[], int[]);
-    ctor public PlaybackControlGlue(android.content.Context, android.support.v17.leanback.app.PlaybackOverlayFragment, int[]);
-    ctor public PlaybackControlGlue(android.content.Context, android.support.v17.leanback.app.PlaybackOverlayFragment, int[], int[]);
-    method public android.support.v17.leanback.widget.PlaybackControlsRowPresenter createControlsRowAndPresenter();
-    method protected android.support.v17.leanback.widget.SparseArrayObjectAdapter createPrimaryActionsAdapter(android.support.v17.leanback.widget.PresenterSelector);
-    method public void enableProgressUpdating(boolean);
-    method public android.content.Context getContext();
-    method public android.support.v17.leanback.widget.PlaybackControlsRow getControlsRow();
-    method public abstract int getCurrentPosition();
-    method public abstract int getCurrentSpeedId();
-    method public int[] getFastForwardSpeeds();
-    method public android.support.v17.leanback.app.PlaybackOverlayFragment getFragment();
-    method public abstract android.graphics.drawable.Drawable getMediaArt();
-    method public abstract int getMediaDuration();
-    method public abstract java.lang.CharSequence getMediaSubtitle();
-    method public abstract java.lang.CharSequence getMediaTitle();
-    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public int[] getRewindSpeeds();
-    method public abstract long getSupportedActions();
-    method public int getUpdatePeriod();
-    method public abstract boolean hasValidMedia();
-    method public boolean isFadingEnabled();
-    method public abstract boolean isMediaPlaying();
-    method public void onActionClicked(android.support.v17.leanback.widget.Action);
-    method public boolean onKey(android.view.View, int, android.view.KeyEvent);
-    method protected void onMetadataChanged();
-    method protected abstract void onRowChanged(android.support.v17.leanback.widget.PlaybackControlsRow);
-    method protected void onStateChanged();
-    method protected abstract void pausePlayback();
-    method public void setControlsRow(android.support.v17.leanback.widget.PlaybackControlsRow);
-    method public void setFadingEnabled(boolean);
-    method public deprecated void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method protected abstract void skipToNext();
-    method protected abstract void skipToPrevious();
-    method protected abstract void startPlayback(int);
-    method public void updateProgress();
-    field public static final int ACTION_CUSTOM_LEFT_FIRST = 1; // 0x1
-    field public static final int ACTION_CUSTOM_RIGHT_FIRST = 4096; // 0x1000
-    field public static final int ACTION_FAST_FORWARD = 128; // 0x80
-    field public static final int ACTION_PLAY_PAUSE = 64; // 0x40
-    field public static final int ACTION_REWIND = 32; // 0x20
-    field public static final int ACTION_SKIP_TO_NEXT = 256; // 0x100
-    field public static final int ACTION_SKIP_TO_PREVIOUS = 16; // 0x10
-    field public static final int PLAYBACK_SPEED_FAST_L0 = 10; // 0xa
-    field public static final int PLAYBACK_SPEED_FAST_L1 = 11; // 0xb
-    field public static final int PLAYBACK_SPEED_FAST_L2 = 12; // 0xc
-    field public static final int PLAYBACK_SPEED_FAST_L3 = 13; // 0xd
-    field public static final int PLAYBACK_SPEED_FAST_L4 = 14; // 0xe
-    field public static final int PLAYBACK_SPEED_INVALID = -1; // 0xffffffff
-    field public static final int PLAYBACK_SPEED_NORMAL = 1; // 0x1
-    field public static final int PLAYBACK_SPEED_PAUSED = 0; // 0x0
-  }
-
-  public class PlaybackOverlayFragment extends android.support.v17.leanback.app.DetailsFragment {
-    ctor public PlaybackOverlayFragment();
-    method public int getBackgroundType();
-    method public android.support.v17.leanback.app.PlaybackOverlayFragment.OnFadeCompleteListener getFadeCompleteListener();
-    method public final android.support.v17.leanback.app.PlaybackOverlayFragment.InputEventHandler getInputEventHandler();
-    method public boolean isFadingEnabled();
-    method public void setBackgroundType(int);
-    method public void setFadeCompleteListener(android.support.v17.leanback.app.PlaybackOverlayFragment.OnFadeCompleteListener);
-    method public void setFadingEnabled(boolean);
-    method public final void setInputEventHandler(android.support.v17.leanback.app.PlaybackOverlayFragment.InputEventHandler);
-    method public void tickle();
-    field public static final int BG_DARK = 1; // 0x1
-    field public static final int BG_LIGHT = 2; // 0x2
-    field public static final int BG_NONE = 0; // 0x0
-  }
-
-  public static abstract interface PlaybackOverlayFragment.InputEventHandler {
-    method public abstract boolean handleInputEvent(android.view.InputEvent);
-  }
-
-  public static class PlaybackOverlayFragment.OnFadeCompleteListener {
-    ctor public PlaybackOverlayFragment.OnFadeCompleteListener();
-    method public void onFadeInComplete();
-    method public void onFadeOutComplete();
-  }
-
-  public class PlaybackOverlaySupportFragment extends android.support.v17.leanback.app.DetailsSupportFragment {
-    ctor public PlaybackOverlaySupportFragment();
-    method public int getBackgroundType();
-    method public android.support.v17.leanback.app.PlaybackOverlaySupportFragment.OnFadeCompleteListener getFadeCompleteListener();
-    method public final android.support.v17.leanback.app.PlaybackOverlaySupportFragment.InputEventHandler getInputEventHandler();
-    method public boolean isFadingEnabled();
-    method public void setBackgroundType(int);
-    method public void setFadeCompleteListener(android.support.v17.leanback.app.PlaybackOverlaySupportFragment.OnFadeCompleteListener);
-    method public void setFadingEnabled(boolean);
-    method public final void setInputEventHandler(android.support.v17.leanback.app.PlaybackOverlaySupportFragment.InputEventHandler);
-    method public void tickle();
-    field public static final int BG_DARK = 1; // 0x1
-    field public static final int BG_LIGHT = 2; // 0x2
-    field public static final int BG_NONE = 0; // 0x0
-  }
-
-  public static abstract interface PlaybackOverlaySupportFragment.InputEventHandler {
-    method public abstract boolean handleInputEvent(android.view.InputEvent);
-  }
-
-  public static class PlaybackOverlaySupportFragment.OnFadeCompleteListener {
-    ctor public PlaybackOverlaySupportFragment.OnFadeCompleteListener();
-    method public void onFadeInComplete();
-    method public void onFadeOutComplete();
-  }
-
-  public class RowsFragment extends android.support.v17.leanback.app.BaseRowFragment {
-    ctor public RowsFragment();
-    method public void enableRowScaling(boolean);
-    method protected android.support.v17.leanback.widget.VerticalGridView findGridViewFromRoot(android.view.View);
-    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public android.support.v17.leanback.widget.OnItemViewSelectedListener getOnItemViewSelectedListener();
-    method public void setExpand(boolean);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-  }
-
-  public class RowsSupportFragment extends android.support.v17.leanback.app.BaseRowSupportFragment {
-    ctor public RowsSupportFragment();
-    method public void enableRowScaling(boolean);
-    method protected android.support.v17.leanback.widget.VerticalGridView findGridViewFromRoot(android.view.View);
-    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public android.support.v17.leanback.widget.OnItemViewSelectedListener getOnItemViewSelectedListener();
-    method public void setExpand(boolean);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-  }
-
-  public class SearchFragment extends android.app.Fragment {
-    ctor public SearchFragment();
-    method public static android.os.Bundle createArgs(android.os.Bundle, java.lang.String);
-    method public static android.os.Bundle createArgs(android.os.Bundle, java.lang.String, java.lang.String);
-    method public void displayCompletions(java.util.List<java.lang.String>);
-    method public android.graphics.drawable.Drawable getBadgeDrawable();
-    method public android.content.Intent getRecognizerIntent();
-    method public java.lang.String getTitle();
-    method public static android.support.v17.leanback.app.SearchFragment newInstance(java.lang.String);
-    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public void setSearchQuery(java.lang.String, boolean);
-    method public void setSearchQuery(android.content.Intent, boolean);
-    method public void setSearchResultProvider(android.support.v17.leanback.app.SearchFragment.SearchResultProvider);
-    method public void setSpeechRecognitionCallback(android.support.v17.leanback.widget.SpeechRecognitionCallback);
-    method public void setTitle(java.lang.String);
-    method public void startRecognition();
-  }
-
-  public static abstract interface SearchFragment.SearchResultProvider {
-    method public abstract android.support.v17.leanback.widget.ObjectAdapter getResultsAdapter();
-    method public abstract boolean onQueryTextChange(java.lang.String);
-    method public abstract boolean onQueryTextSubmit(java.lang.String);
-  }
-
-  public class SearchSupportFragment extends android.support.v4.app.Fragment {
-    ctor public SearchSupportFragment();
-    method public static android.os.Bundle createArgs(android.os.Bundle, java.lang.String);
-    method public static android.os.Bundle createArgs(android.os.Bundle, java.lang.String, java.lang.String);
-    method public void displayCompletions(java.util.List<java.lang.String>);
-    method public android.graphics.drawable.Drawable getBadgeDrawable();
-    method public android.content.Intent getRecognizerIntent();
-    method public java.lang.String getTitle();
-    method public static android.support.v17.leanback.app.SearchSupportFragment newInstance(java.lang.String);
-    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public void setSearchQuery(java.lang.String, boolean);
-    method public void setSearchQuery(android.content.Intent, boolean);
-    method public void setSearchResultProvider(android.support.v17.leanback.app.SearchSupportFragment.SearchResultProvider);
-    method public void setSpeechRecognitionCallback(android.support.v17.leanback.widget.SpeechRecognitionCallback);
-    method public void setTitle(java.lang.String);
-    method public void startRecognition();
-  }
-
-  public static abstract interface SearchSupportFragment.SearchResultProvider {
-    method public abstract android.support.v17.leanback.widget.ObjectAdapter getResultsAdapter();
-    method public abstract boolean onQueryTextChange(java.lang.String);
-    method public abstract boolean onQueryTextSubmit(java.lang.String);
-  }
-
-  public class VerticalGridFragment extends android.app.Fragment {
-    ctor public VerticalGridFragment();
-    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
-    method public android.support.v17.leanback.widget.VerticalGridPresenter getGridPresenter();
-    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public void setGridPresenter(android.support.v17.leanback.widget.VerticalGridPresenter);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public void setSelectedPosition(int);
-  }
-
-  public class VerticalGridSupportFragment extends android.support.v4.app.Fragment {
-    ctor public VerticalGridSupportFragment();
-    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
-    method public android.support.v17.leanback.widget.VerticalGridPresenter getGridPresenter();
-    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public void setGridPresenter(android.support.v17.leanback.widget.VerticalGridPresenter);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public void setSelectedPosition(int);
-  }
-
-}
-
-package android.support.v17.leanback.database {
-
-  public abstract class CursorMapper {
-    ctor public CursorMapper();
-    method protected abstract java.lang.Object bind(android.database.Cursor);
-    method protected abstract void bindColumns(android.database.Cursor);
-    method public java.lang.Object convert(android.database.Cursor);
-  }
-
-}
-
-package android.support.v17.leanback.graphics {
-
-  public final class ColorFilterCache {
-    method public static android.support.v17.leanback.graphics.ColorFilterCache getColorFilterCache(int);
-    method public android.graphics.ColorFilter getFilterForLevel(float);
-  }
-
-  public final class ColorFilterDimmer {
-    method public void applyFilterToView(android.view.View);
-    method public static android.support.v17.leanback.graphics.ColorFilterDimmer create(android.support.v17.leanback.graphics.ColorFilterCache, float, float);
-    method public static android.support.v17.leanback.graphics.ColorFilterDimmer createDefault(android.content.Context);
-    method public android.graphics.ColorFilter getColorFilter();
-    method public android.graphics.Paint getPaint();
-    method public void setActiveLevel(float);
-  }
-
-  public final class ColorOverlayDimmer {
-    method public int applyToColor(int);
-    method public static android.support.v17.leanback.graphics.ColorOverlayDimmer createColorOverlayDimmer(int, float, float);
-    method public static android.support.v17.leanback.graphics.ColorOverlayDimmer createDefault(android.content.Context);
-    method public void drawColorOverlay(android.graphics.Canvas, android.view.View, boolean);
-    method public int getAlpha();
-    method public float getAlphaFloat();
-    method public android.graphics.Paint getPaint();
-    method public boolean needsDraw();
-    method public void setActiveLevel(float);
-  }
-
-}
-
-package android.support.v17.leanback.widget {
-
-  public abstract class AbstractDetailsDescriptionPresenter extends android.support.v17.leanback.widget.Presenter {
-    ctor public AbstractDetailsDescriptionPresenter();
-    method protected abstract void onBindDescription(android.support.v17.leanback.widget.AbstractDetailsDescriptionPresenter.ViewHolder, java.lang.Object);
-    method public final void onBindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object);
-    method public final android.support.v17.leanback.widget.AbstractDetailsDescriptionPresenter.ViewHolder onCreateViewHolder(android.view.ViewGroup);
-    method public void onUnbindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
-  }
-
-  public static class AbstractDetailsDescriptionPresenter.ViewHolder extends android.support.v17.leanback.widget.Presenter.ViewHolder {
-    ctor public AbstractDetailsDescriptionPresenter.ViewHolder(android.view.View);
-    method public android.widget.TextView getBody();
-    method public android.widget.TextView getSubtitle();
-    method public android.widget.TextView getTitle();
-  }
-
-  public class Action {
-    ctor public Action(long);
-    ctor public Action(long, java.lang.CharSequence);
-    ctor public Action(long, java.lang.CharSequence, java.lang.CharSequence);
-    ctor public Action(long, java.lang.CharSequence, java.lang.CharSequence, android.graphics.drawable.Drawable);
-    method public final void addKeyCode(int);
-    method public final android.graphics.drawable.Drawable getIcon();
-    method public final long getId();
-    method public final java.lang.CharSequence getLabel1();
-    method public final java.lang.CharSequence getLabel2();
-    method public final void removeKeyCode(int);
-    method public final boolean respondsToKeyCode(int);
-    method public final void setIcon(android.graphics.drawable.Drawable);
-    method public final void setId(long);
-    method public final void setLabel1(java.lang.CharSequence);
-    method public final void setLabel2(java.lang.CharSequence);
-  }
-
-  public class ArrayObjectAdapter extends android.support.v17.leanback.widget.ObjectAdapter {
-    ctor public ArrayObjectAdapter(android.support.v17.leanback.widget.PresenterSelector);
-    ctor public ArrayObjectAdapter(android.support.v17.leanback.widget.Presenter);
-    ctor public ArrayObjectAdapter();
-    method public void add(java.lang.Object);
-    method public void add(int, java.lang.Object);
-    method public void addAll(int, java.util.Collection);
-    method public void clear();
-    method public java.lang.Object get(int);
-    method public int indexOf(java.lang.Object);
-    method public void notifyArrayItemRangeChanged(int, int);
-    method public boolean remove(java.lang.Object);
-    method public int removeItems(int, int);
-    method public void replace(int, java.lang.Object);
-    method public int size();
-    method public java.util.List<E> unmodifiableList();
-  }
-
-  public class BaseCardView extends android.widget.FrameLayout {
-    ctor public BaseCardView(android.content.Context);
-    ctor public BaseCardView(android.content.Context, android.util.AttributeSet);
-    ctor public BaseCardView(android.content.Context, android.util.AttributeSet, int);
-    method public int getCardType();
-    method public int getExtraVisibility();
-    method public int getInfoVisibility();
-    method public boolean isSelectedAnimationDelayed();
-    method public void setCardType(int);
-    method public void setExtraVisibility(int);
-    method public void setInfoVisibility(int);
-    method public void setSelectedAnimationDelayed(boolean);
-    field public static final int CARD_REGION_VISIBLE_ACTIVATED = 1; // 0x1
-    field public static final int CARD_REGION_VISIBLE_ALWAYS = 0; // 0x0
-    field public static final int CARD_REGION_VISIBLE_SELECTED = 2; // 0x2
-    field public static final int CARD_TYPE_INFO_OVER = 1; // 0x1
-    field public static final int CARD_TYPE_INFO_UNDER = 2; // 0x2
-    field public static final int CARD_TYPE_INFO_UNDER_WITH_EXTRA = 3; // 0x3
-    field public static final int CARD_TYPE_MAIN_ONLY = 0; // 0x0
-  }
-
-  public static class BaseCardView.LayoutParams extends android.widget.FrameLayout.LayoutParams {
-    ctor public BaseCardView.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public BaseCardView.LayoutParams(int, int);
-    ctor public BaseCardView.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public BaseCardView.LayoutParams(android.support.v17.leanback.widget.BaseCardView.LayoutParams);
-    field public static final int VIEW_TYPE_EXTRA = 2; // 0x2
-    field public static final int VIEW_TYPE_INFO = 1; // 0x1
-    field public static final int VIEW_TYPE_MAIN = 0; // 0x0
-    field public int viewType;
-  }
-
-   abstract class BaseGridView extends android.support.v7.widget.RecyclerView {
-    ctor public BaseGridView(android.content.Context, android.util.AttributeSet, int);
-    method public boolean dispatchGenericFocusedEvent(android.view.MotionEvent);
-    method public int getChildDrawingOrder(int, int);
-    method public int getFocusScrollStrategy();
-    method public int getHorizontalMargin();
-    method public int getItemAlignmentOffset();
-    method public float getItemAlignmentOffsetPercent();
-    method public int getItemAlignmentViewId();
-    method public android.support.v17.leanback.widget.BaseGridView.OnUnhandledKeyListener getOnUnhandledKeyListener();
-    method public final int getSaveChildrenLimitNumber();
-    method public final int getSaveChildrenPolicy();
-    method public int getSelectedPosition();
-    method public int getVerticalMargin();
-    method public void getViewSelectedOffsets(android.view.View, int[]);
-    method public int getWindowAlignment();
-    method public int getWindowAlignmentOffset();
-    method public float getWindowAlignmentOffsetPercent();
-    method public boolean hasPreviousViewInSameRow(int);
-    method protected void initBaseGridViewAttributes(android.content.Context, android.util.AttributeSet);
-    method public boolean isChildLayoutAnimated();
-    method public boolean isFocusDrawingOrderEnabled();
-    method public final boolean isFocusSearchDisabled();
-    method public boolean isItemAlignmentOffsetWithPadding();
-    method public boolean isScrollEnabled();
-    method public boolean onRequestFocusInDescendants(int, android.graphics.Rect);
-    method public void setAnimateChildLayout(boolean);
-    method public void setChildrenVisibility(int);
-    method public void setFocusDrawingOrderEnabled(boolean);
-    method public void setFocusScrollStrategy(int);
-    method public final void setFocusSearchDisabled(boolean);
-    method public void setGravity(int);
-    method public void setHasOverlappingRendering(boolean);
-    method public void setHorizontalMargin(int);
-    method public void setItemAlignmentOffset(int);
-    method public void setItemAlignmentOffsetPercent(float);
-    method public void setItemAlignmentOffsetWithPadding(boolean);
-    method public void setItemAlignmentViewId(int);
-    method public void setItemMargin(int);
-    method public void setLayoutEnabled(boolean);
-    method public void setOnChildLaidOutListener(android.support.v17.leanback.widget.OnChildLaidOutListener);
-    method public void setOnChildSelectedListener(android.support.v17.leanback.widget.OnChildSelectedListener);
-    method public void setOnKeyInterceptListener(android.support.v17.leanback.widget.BaseGridView.OnKeyInterceptListener);
-    method public void setOnMotionInterceptListener(android.support.v17.leanback.widget.BaseGridView.OnMotionInterceptListener);
-    method public void setOnTouchInterceptListener(android.support.v17.leanback.widget.BaseGridView.OnTouchInterceptListener);
-    method public void setOnUnhandledKeyListener(android.support.v17.leanback.widget.BaseGridView.OnUnhandledKeyListener);
-    method public void setPruneChild(boolean);
-    method public final void setSaveChildrenLimitNumber(int);
-    method public final void setSaveChildrenPolicy(int);
-    method public void setScrollEnabled(boolean);
-    method public void setSelectedPosition(int);
-    method public void setSelectedPosition(int, int);
-    method public void setSelectedPositionSmooth(int);
-    method public void setVerticalMargin(int);
-    method public void setWindowAlignment(int);
-    method public void setWindowAlignmentOffset(int);
-    method public void setWindowAlignmentOffsetPercent(float);
-    field public static final int FOCUS_SCROLL_ALIGNED = 0; // 0x0
-    field public static final int FOCUS_SCROLL_ITEM = 1; // 0x1
-    field public static final int FOCUS_SCROLL_PAGE = 2; // 0x2
-    field public static final float ITEM_ALIGN_OFFSET_PERCENT_DISABLED = -1.0f;
-    field public static final int SAVE_ALL_CHILD = 3; // 0x3
-    field public static final int SAVE_LIMITED_CHILD = 2; // 0x2
-    field public static final int SAVE_NO_CHILD = 0; // 0x0
-    field public static final int SAVE_ON_SCREEN_CHILD = 1; // 0x1
-    field public static final int WINDOW_ALIGN_BOTH_EDGE = 3; // 0x3
-    field public static final int WINDOW_ALIGN_HIGH_EDGE = 2; // 0x2
-    field public static final int WINDOW_ALIGN_LOW_EDGE = 1; // 0x1
-    field public static final int WINDOW_ALIGN_NO_EDGE = 0; // 0x0
-    field public static final float WINDOW_ALIGN_OFFSET_PERCENT_DISABLED = -1.0f;
-    field protected final android.support.v17.leanback.widget.GridLayoutManager mLayoutManager;
-  }
-
-  public static abstract interface BaseGridView.OnKeyInterceptListener {
-    method public abstract boolean onInterceptKeyEvent(android.view.KeyEvent);
-  }
-
-  public static abstract interface BaseGridView.OnMotionInterceptListener {
-    method public abstract boolean onInterceptMotionEvent(android.view.MotionEvent);
-  }
-
-  public static abstract interface BaseGridView.OnTouchInterceptListener {
-    method public abstract boolean onInterceptTouchEvent(android.view.MotionEvent);
-  }
-
-  public static abstract interface BaseGridView.OnUnhandledKeyListener {
-    method public abstract boolean onUnhandledKey(android.view.KeyEvent);
-  }
-
-  public class BrowseFrameLayout extends android.widget.FrameLayout {
-    ctor public BrowseFrameLayout(android.content.Context);
-    ctor public BrowseFrameLayout(android.content.Context, android.util.AttributeSet);
-    ctor public BrowseFrameLayout(android.content.Context, android.util.AttributeSet, int);
-    method public android.support.v17.leanback.widget.BrowseFrameLayout.OnChildFocusListener getOnChildFocusListener();
-    method public android.support.v17.leanback.widget.BrowseFrameLayout.OnFocusSearchListener getOnFocusSearchListener();
-    method public void setOnChildFocusListener(android.support.v17.leanback.widget.BrowseFrameLayout.OnChildFocusListener);
-    method public void setOnFocusSearchListener(android.support.v17.leanback.widget.BrowseFrameLayout.OnFocusSearchListener);
-  }
-
-  public static abstract interface BrowseFrameLayout.OnChildFocusListener {
-    method public abstract void onRequestChildFocus(android.view.View, android.view.View);
-    method public abstract boolean onRequestFocusInDescendants(int, android.graphics.Rect);
-  }
-
-  public static abstract interface BrowseFrameLayout.OnFocusSearchListener {
-    method public abstract android.view.View onFocusSearch(android.view.View, int);
-  }
-
-  public final class ClassPresenterSelector extends android.support.v17.leanback.widget.PresenterSelector {
-    ctor public ClassPresenterSelector();
-    method public void addClassPresenter(java.lang.Class<?>, android.support.v17.leanback.widget.Presenter);
-    method public android.support.v17.leanback.widget.Presenter getPresenter(java.lang.Object);
-  }
-
-  public class ControlButtonPresenterSelector extends android.support.v17.leanback.widget.PresenterSelector {
-    ctor public ControlButtonPresenterSelector();
-    method public android.support.v17.leanback.widget.Presenter getPresenter(java.lang.Object);
-    method public android.support.v17.leanback.widget.Presenter getPrimaryPresenter();
-    method public android.support.v17.leanback.widget.Presenter getSecondaryPresenter();
-  }
-
-  public class CursorObjectAdapter extends android.support.v17.leanback.widget.ObjectAdapter {
-    ctor public CursorObjectAdapter(android.support.v17.leanback.widget.PresenterSelector);
-    ctor public CursorObjectAdapter(android.support.v17.leanback.widget.Presenter);
-    ctor public CursorObjectAdapter();
-    method public void changeCursor(android.database.Cursor);
-    method public void close();
-    method public java.lang.Object get(int);
-    method public final android.database.Cursor getCursor();
-    method public final android.support.v17.leanback.database.CursorMapper getMapper();
-    method protected final void invalidateCache(int);
-    method protected final void invalidateCache(int, int);
-    method public boolean isClosed();
-    method protected void onCursorChanged();
-    method protected void onMapperChanged();
-    method public final void setMapper(android.support.v17.leanback.database.CursorMapper);
-    method public int size();
-    method public android.database.Cursor swapCursor(android.database.Cursor);
-  }
-
-  public class DetailsOverviewRow extends android.support.v17.leanback.widget.Row {
-    ctor public DetailsOverviewRow(java.lang.Object);
-    method public final deprecated void addAction(android.support.v17.leanback.widget.Action);
-    method public final deprecated void addAction(int, android.support.v17.leanback.widget.Action);
-    method public android.support.v17.leanback.widget.Action getActionForKeyCode(int);
-    method public final deprecated java.util.List<android.support.v17.leanback.widget.Action> getActions();
-    method public final android.support.v17.leanback.widget.ObjectAdapter getActionsAdapter();
-    method public final android.graphics.drawable.Drawable getImageDrawable();
-    method public final java.lang.Object getItem();
-    method public boolean isImageScaleUpAllowed();
-    method public final deprecated boolean removeAction(android.support.v17.leanback.widget.Action);
-    method public final void setActionsAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public final void setImageBitmap(android.content.Context, android.graphics.Bitmap);
-    method public final void setImageDrawable(android.graphics.drawable.Drawable);
-    method public void setImageScaleUpAllowed(boolean);
-    method public final void setItem(java.lang.Object);
-  }
-
-  public class DetailsOverviewRowPresenter extends android.support.v17.leanback.widget.RowPresenter {
-    ctor public DetailsOverviewRowPresenter(android.support.v17.leanback.widget.Presenter);
-    method protected android.support.v17.leanback.widget.RowPresenter.ViewHolder createRowViewHolder(android.view.ViewGroup);
-    method public int getBackgroundColor();
-    method public android.support.v17.leanback.widget.OnActionClickedListener getOnActionClickedListener();
-    method public boolean isStyleLarge();
-    method public final boolean isUsingDefaultSelectEffect();
-    method public void setBackgroundColor(int);
-    method public void setOnActionClickedListener(android.support.v17.leanback.widget.OnActionClickedListener);
-    method public final void setSharedElementEnterTransition(android.app.Activity, java.lang.String, long);
-    method public final void setSharedElementEnterTransition(android.app.Activity, java.lang.String);
-    method public void setStyleLarge(boolean);
-  }
-
-  public final class DetailsOverviewRowPresenter.ViewHolder extends android.support.v17.leanback.widget.RowPresenter.ViewHolder {
-    ctor public DetailsOverviewRowPresenter.ViewHolder(android.view.View, android.support.v17.leanback.widget.Presenter);
-    field public final android.support.v17.leanback.widget.Presenter.ViewHolder mDetailsDescriptionViewHolder;
-  }
-
-  public abstract interface FocusHighlight {
-    field public static final int ZOOM_FACTOR_LARGE = 3; // 0x3
-    field public static final int ZOOM_FACTOR_MEDIUM = 2; // 0x2
-    field public static final int ZOOM_FACTOR_NONE = 0; // 0x0
-    field public static final int ZOOM_FACTOR_SMALL = 1; // 0x1
-    field public static final int ZOOM_FACTOR_XSMALL = 4; // 0x4
-  }
-
-  public class FocusHighlightHelper {
-    ctor public FocusHighlightHelper();
-    method public static void setupBrowseItemFocusHighlight(android.support.v17.leanback.widget.ItemBridgeAdapter, int, boolean);
-    method public static void setupHeaderItemFocusHighlight(android.support.v17.leanback.widget.VerticalGridView);
-  }
-
-  public abstract interface FragmentAnimationProvider {
-    method public abstract void onActivityEnter(java.util.List<android.animation.Animator>);
-    method public abstract void onActivityExit(java.util.List<android.animation.Animator>);
-    method public abstract void onFragmentEnter(java.util.List<android.animation.Animator>);
-    method public abstract void onFragmentExit(java.util.List<android.animation.Animator>);
-    method public abstract void onFragmentReenter(java.util.List<android.animation.Animator>);
-    method public abstract void onFragmentReturn(java.util.List<android.animation.Animator>);
-  }
-
-   final class GridLayoutManager extends android.support.v7.widget.RecyclerView.LayoutManager {
-    ctor public GridLayoutManager(android.support.v17.leanback.widget.BaseGridView);
-    method public android.support.v7.widget.RecyclerView.LayoutParams generateDefaultLayoutParams();
-    method public int getFocusScrollStrategy();
-    method public int getHorizontalMargin();
-    method public int getItemAlignmentOffset();
-    method public float getItemAlignmentOffsetPercent();
-    method public int getItemAlignmentViewId();
-    method public boolean getPruneChild();
-    method public int getSelection();
-    method public int getVerticalMargin();
-    method protected android.view.View getViewForPosition(int);
-    method public void getViewSelectedOffsets(android.view.View, int[]);
-    method public int getWindowAlignment();
-    method public int getWindowAlignmentOffset();
-    method public float getWindowAlignmentOffsetPercent();
-    method protected boolean hasDoneFirstLayout();
-    method public boolean isItemAlignmentOffsetWithPadding();
-    method public boolean isScrollEnabled();
-    method public void onRtlPropertiesChanged(int);
-    method public void setFocusOutAllowed(boolean, boolean);
-    method public void setFocusScrollStrategy(int);
-    method public void setGravity(int);
-    method public void setHorizontalMargin(int);
-    method public void setItemAlignmentOffset(int);
-    method public void setItemAlignmentOffsetPercent(float);
-    method public void setItemAlignmentOffsetWithPadding(boolean);
-    method public void setItemAlignmentViewId(int);
-    method public void setItemMargin(int);
-    method public void setLayoutEnabled(boolean);
-    method public void setNumRows(int);
-    method public void setOnChildSelectedListener(android.support.v17.leanback.widget.OnChildSelectedListener);
-    method public void setOrientation(int);
-    method public void setPruneChild(boolean);
-    method public void setRowHeight(int);
-    method public void setScrollEnabled(boolean);
-    method public void setSelection(android.support.v7.widget.RecyclerView, int, int);
-    method public void setSelection(android.support.v7.widget.RecyclerView, int, boolean, int);
-    method public void setSelectionSmooth(android.support.v7.widget.RecyclerView, int);
-    method public void setVerticalMargin(int);
-    method public void setWindowAlignment(int);
-    method public void setWindowAlignmentOffset(int);
-    method public void setWindowAlignmentOffsetPercent(float);
-  }
-
-  public class GuidanceStylist implements android.support.v17.leanback.widget.FragmentAnimationProvider {
-    ctor public GuidanceStylist();
-    method public android.widget.TextView getBreadcrumbView();
-    method public android.widget.TextView getDescriptionView();
-    method public android.widget.ImageView getIconView();
-    method public android.widget.TextView getTitleView();
-    method public void onActivityEnter(java.util.List<android.animation.Animator>);
-    method public void onActivityExit(java.util.List<android.animation.Animator>);
-    method public android.view.View onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.support.v17.leanback.widget.GuidanceStylist.Guidance);
-    method public void onFragmentEnter(java.util.List<android.animation.Animator>);
-    method public void onFragmentExit(java.util.List<android.animation.Animator>);
-    method public void onFragmentReenter(java.util.List<android.animation.Animator>);
-    method public void onFragmentReturn(java.util.List<android.animation.Animator>);
-    method public int onProvideLayoutId();
-  }
-
-  public static class GuidanceStylist.Guidance {
-    ctor public GuidanceStylist.Guidance(java.lang.String, java.lang.String, java.lang.String, android.graphics.drawable.Drawable);
-    method public java.lang.String getBreadcrumb();
-    method public java.lang.String getDescription();
-    method public android.graphics.drawable.Drawable getIconDrawable();
-    method public java.lang.String getTitle();
-  }
-
-  public class GuidedAction extends android.support.v17.leanback.widget.Action {
-    method public int getCheckSetId();
-    method public java.lang.CharSequence getDescription();
-    method public android.content.Intent getIntent();
-    method public java.lang.CharSequence getTitle();
-    method public boolean hasMultilineDescription();
-    method public boolean hasNext();
-    method public boolean infoOnly();
-    method public boolean isChecked();
-    method public boolean isEnabled();
-    method public void setChecked(boolean);
-    method public void setEnabled(boolean);
-    field public static final int DEFAULT_CHECK_SET_ID = 1; // 0x1
-    field public static final int NO_CHECK_SET = 0; // 0x0
-    field public static final int NO_DRAWABLE = 0; // 0x0
-  }
-
-  public static class GuidedAction.Builder {
-    ctor public GuidedAction.Builder();
-    method public android.support.v17.leanback.widget.GuidedAction build();
-    method public android.support.v17.leanback.widget.GuidedAction.Builder checkSetId(int);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder checked(boolean);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder description(java.lang.String);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder enabled(boolean);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder hasNext(boolean);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder icon(android.graphics.drawable.Drawable);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder iconResourceId(int, android.content.Context);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder id(long);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder infoOnly(boolean);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder intent(android.content.Intent);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder multilineDescription(boolean);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder title(java.lang.String);
-  }
-
-  public class GuidedActionsStylist implements android.support.v17.leanback.widget.FragmentAnimationProvider {
-    ctor public GuidedActionsStylist();
-    method public android.support.v17.leanback.widget.VerticalGridView getActionsGridView();
-    method public void onActivityEnter(java.util.List<android.animation.Animator>);
-    method public void onActivityExit(java.util.List<android.animation.Animator>);
-    method public void onAnimateItemChecked(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, boolean);
-    method public void onAnimateItemFocused(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, boolean);
-    method public void onAnimateItemPressed(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, boolean);
-    method public void onBindViewHolder(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, android.support.v17.leanback.widget.GuidedAction);
-    method public android.view.View onCreateView(android.view.LayoutInflater, android.view.ViewGroup);
-    method public android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder onCreateViewHolder(android.view.ViewGroup);
-    method public void onFragmentEnter(java.util.List<android.animation.Animator>);
-    method public void onFragmentExit(java.util.List<android.animation.Animator>);
-    method public void onFragmentReenter(java.util.List<android.animation.Animator>);
-    method public void onFragmentReturn(java.util.List<android.animation.Animator>);
-    method public int onProvideItemLayoutId();
-    method public int onProvideLayoutId();
-    field protected android.support.v17.leanback.widget.VerticalGridView mActionsGridView;
-    field protected android.view.View mMainView;
-    field protected android.view.View mSelectorView;
-  }
-
-  public static class GuidedActionsStylist.ViewHolder {
-    ctor public GuidedActionsStylist.ViewHolder(android.view.View);
-    method public android.widget.ImageView getCheckmarkView();
-    method public android.widget.ImageView getChevronView();
-    method public android.view.View getContentView();
-    method public android.widget.TextView getDescriptionView();
-    method public android.widget.ImageView getIconView();
-    method public android.widget.TextView getTitleView();
-    field public final android.view.View view;
-  }
-
-  public class HeaderItem {
-    ctor public HeaderItem(long, java.lang.String);
-    ctor public HeaderItem(java.lang.String);
-    method public final long getId();
-    method public final java.lang.String getName();
-  }
-
-  public class HorizontalGridView extends android.support.v7.widget.RecyclerView {
-    ctor public HorizontalGridView(android.content.Context);
-    ctor public HorizontalGridView(android.content.Context, android.util.AttributeSet);
-    ctor public HorizontalGridView(android.content.Context, android.util.AttributeSet, int);
-    method public final boolean getFadingLeftEdge();
-    method public final int getFadingLeftEdgeLength();
-    method public final int getFadingLeftEdgeOffset();
-    method public final boolean getFadingRightEdge();
-    method public final int getFadingRightEdgeLength();
-    method public final int getFadingRightEdgeOffset();
-    method protected void initAttributes(android.content.Context, android.util.AttributeSet);
-    method public final void setFadingLeftEdge(boolean);
-    method public final void setFadingLeftEdgeLength(int);
-    method public final void setFadingLeftEdgeOffset(int);
-    method public final void setFadingRightEdge(boolean);
-    method public final void setFadingRightEdgeLength(int);
-    method public final void setFadingRightEdgeOffset(int);
-    method public void setNumRows(int);
-    method public void setRowHeight(int);
-  }
-
-  public final class HorizontalHoverCardSwitcher extends android.support.v17.leanback.widget.PresenterSwitcher {
-    ctor public HorizontalHoverCardSwitcher();
-    method protected void insertView(android.view.View);
-    method public void select(android.support.v17.leanback.widget.HorizontalGridView, android.view.View, java.lang.Object);
-  }
-
-  public class ImageCardView extends android.support.v17.leanback.widget.BaseCardView {
-    ctor public ImageCardView(android.content.Context);
-    ctor public ImageCardView(android.content.Context, android.util.AttributeSet);
-    ctor public ImageCardView(android.content.Context, android.util.AttributeSet, int);
-    method public android.graphics.drawable.Drawable getBadgeImage();
-    method public java.lang.CharSequence getContentText();
-    method public android.graphics.drawable.Drawable getInfoAreaBackground();
-    method public android.graphics.drawable.Drawable getMainImage();
-    method public final android.widget.ImageView getMainImageView();
-    method public java.lang.CharSequence getTitleText();
-    method public void setBadgeImage(android.graphics.drawable.Drawable);
-    method public void setContentText(java.lang.CharSequence);
-    method public void setInfoAreaBackground(android.graphics.drawable.Drawable);
-    method public void setInfoAreaBackgroundColor(int);
-    method public void setMainImage(android.graphics.drawable.Drawable);
-    method public void setMainImage(android.graphics.drawable.Drawable, boolean);
-    method public void setMainImageAdjustViewBounds(boolean);
-    method public void setMainImageDimensions(int, int);
-    method public void setMainImageScaleType(android.widget.ImageView.ScaleType);
-    method public void setTitleText(java.lang.CharSequence);
-  }
-
-  public class ItemBridgeAdapter extends android.support.v7.widget.RecyclerView.Adapter {
-    ctor public ItemBridgeAdapter(android.support.v17.leanback.widget.ObjectAdapter, android.support.v17.leanback.widget.PresenterSelector);
-    ctor public ItemBridgeAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    ctor public ItemBridgeAdapter();
-    method public void clear();
-    method public int getItemCount();
-    method public java.util.ArrayList<android.support.v17.leanback.widget.Presenter> getPresenterMapper();
-    method public android.support.v17.leanback.widget.ItemBridgeAdapter.Wrapper getWrapper();
-    method protected void onAddPresenter(android.support.v17.leanback.widget.Presenter, int);
-    method protected void onAttachedToWindow(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
-    method protected void onBind(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
-    method public final void onBindViewHolder(android.support.v7.widget.RecyclerView.ViewHolder, int);
-    method protected void onCreate(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
-    method public final android.support.v7.widget.RecyclerView.ViewHolder onCreateViewHolder(android.view.ViewGroup, int);
-    method protected void onDetachedFromWindow(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
-    method protected void onUnbind(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
-    method public final void onViewAttachedToWindow(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public final void onViewDetachedFromWindow(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public final void onViewRecycled(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public void setAdapterListener(android.support.v17.leanback.widget.ItemBridgeAdapter.AdapterListener);
-    method public void setPresenterMapper(java.util.ArrayList<android.support.v17.leanback.widget.Presenter>);
-    method public void setWrapper(android.support.v17.leanback.widget.ItemBridgeAdapter.Wrapper);
-  }
-
-  public static class ItemBridgeAdapter.AdapterListener {
-    ctor public ItemBridgeAdapter.AdapterListener();
-    method public void onAddPresenter(android.support.v17.leanback.widget.Presenter, int);
-    method public void onAttachedToWindow(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
-    method public void onBind(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
-    method public void onCreate(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
-    method public void onDetachedFromWindow(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
-    method public void onUnbind(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
-  }
-
-  public class ItemBridgeAdapter.ViewHolder extends android.support.v7.widget.RecyclerView.ViewHolder {
-    method public final java.lang.Object getExtraObject();
-    method public final java.lang.Object getItem();
-    method public final android.support.v17.leanback.widget.Presenter getPresenter();
-    method public final android.support.v17.leanback.widget.Presenter.ViewHolder getViewHolder();
-    method public void setExtraObject(java.lang.Object);
-  }
-
-  public static abstract class ItemBridgeAdapter.Wrapper {
-    ctor public ItemBridgeAdapter.Wrapper();
-    method public abstract android.view.View createWrapper(android.view.View);
-    method public abstract void wrap(android.view.View, android.view.View);
-  }
-
-  public class ListRow extends android.support.v17.leanback.widget.Row {
-    ctor public ListRow(android.support.v17.leanback.widget.HeaderItem, android.support.v17.leanback.widget.ObjectAdapter);
-    ctor public ListRow(long, android.support.v17.leanback.widget.HeaderItem, android.support.v17.leanback.widget.ObjectAdapter);
-    ctor public ListRow(android.support.v17.leanback.widget.ObjectAdapter);
-    method public final android.support.v17.leanback.widget.ObjectAdapter getAdapter();
-  }
-
-  public final class ListRowHoverCardView extends android.widget.LinearLayout {
-    ctor public ListRowHoverCardView(android.content.Context);
-    ctor public ListRowHoverCardView(android.content.Context, android.util.AttributeSet);
-    ctor public ListRowHoverCardView(android.content.Context, android.util.AttributeSet, int);
-    method public final java.lang.CharSequence getDescription();
-    method public final java.lang.CharSequence getTitle();
-    method public final void setDescription(java.lang.CharSequence);
-    method public final void setTitle(java.lang.CharSequence);
-  }
-
-  public class ListRowPresenter extends android.support.v17.leanback.widget.RowPresenter {
-    ctor public ListRowPresenter();
-    ctor public ListRowPresenter(int);
-    ctor public ListRowPresenter(int, boolean);
-    method public final boolean areChildRoundedCornersEnabled();
-    method protected android.support.v17.leanback.widget.RowPresenter.ViewHolder createRowViewHolder(android.view.ViewGroup);
-    method public final void enableChildRoundedCorners(boolean);
-    method public int getExpandedRowHeight();
-    method public final int getFocusZoomFactor();
-    method public final android.support.v17.leanback.widget.PresenterSelector getHoverCardPresenterSelector();
-    method public int getRecycledPoolSize(android.support.v17.leanback.widget.Presenter);
-    method public int getRowHeight();
-    method public final boolean getShadowEnabled();
-    method public final deprecated int getZoomFactor();
-    method public final boolean isFocusDimmerUsed();
-    method public boolean isUsingDefaultListSelectEffect();
-    method public final boolean isUsingDefaultSelectEffect();
-    method public boolean isUsingDefaultShadow();
-    method public boolean isUsingZOrder();
-    method public void setExpandedRowHeight(int);
-    method public final void setHoverCardPresenterSelector(android.support.v17.leanback.widget.PresenterSelector);
-    method public void setRecycledPoolSize(android.support.v17.leanback.widget.Presenter, int);
-    method public void setRowHeight(int);
-    method public final void setShadowEnabled(boolean);
-  }
-
-  public static class ListRowPresenter.ViewHolder extends android.support.v17.leanback.widget.RowPresenter.ViewHolder {
-    ctor public ListRowPresenter.ViewHolder(android.view.View, android.support.v17.leanback.widget.HorizontalGridView, android.support.v17.leanback.widget.ListRowPresenter);
-    method public final android.support.v17.leanback.widget.ItemBridgeAdapter getBridgeAdapter();
-    method public final android.support.v17.leanback.widget.HorizontalGridView getGridView();
-    method public final android.support.v17.leanback.widget.ListRowPresenter getListRowPresenter();
-  }
-
-  public final class ListRowView extends android.widget.LinearLayout {
-    ctor public ListRowView(android.content.Context);
-    ctor public ListRowView(android.content.Context, android.util.AttributeSet);
-    ctor public ListRowView(android.content.Context, android.util.AttributeSet, int);
-    method public android.support.v17.leanback.widget.HorizontalGridView getGridView();
-  }
-
-  public abstract class ObjectAdapter {
-    ctor public ObjectAdapter(android.support.v17.leanback.widget.PresenterSelector);
-    ctor public ObjectAdapter(android.support.v17.leanback.widget.Presenter);
-    ctor public ObjectAdapter();
-    method public abstract java.lang.Object get(int);
-    method public long getId(int);
-    method public final android.support.v17.leanback.widget.Presenter getPresenter(java.lang.Object);
-    method public final android.support.v17.leanback.widget.PresenterSelector getPresenterSelector();
-    method public final boolean hasStableIds();
-    method protected final void notifyChanged();
-    method protected final void notifyItemRangeChanged(int, int);
-    method protected final void notifyItemRangeInserted(int, int);
-    method protected final void notifyItemRangeRemoved(int, int);
-    method protected void onHasStableIdsChanged();
-    method protected void onPresenterSelectorChanged();
-    method public final void registerObserver(android.support.v17.leanback.widget.ObjectAdapter.DataObserver);
-    method public final void setHasStableIds(boolean);
-    method public final void setPresenterSelector(android.support.v17.leanback.widget.PresenterSelector);
-    method public abstract int size();
-    method public final void unregisterAllObservers();
-    method public final void unregisterObserver(android.support.v17.leanback.widget.ObjectAdapter.DataObserver);
-    field public static final int NO_ID = -1; // 0xffffffff
-  }
-
-  public static abstract class ObjectAdapter.DataObserver {
-    ctor public ObjectAdapter.DataObserver();
-    method public void onChanged();
-    method public void onItemRangeChanged(int, int);
-    method public void onItemRangeInserted(int, int);
-    method public void onItemRangeRemoved(int, int);
-  }
-
-  public abstract interface OnActionClickedListener {
-    method public abstract void onActionClicked(android.support.v17.leanback.widget.Action);
-  }
-
-  public abstract interface OnChildLaidOutListener {
-    method public abstract void onChildLaidOut(android.view.ViewGroup, android.view.View, int, long);
-  }
-
-  public abstract interface OnChildSelectedListener {
-    method public abstract void onChildSelected(android.view.ViewGroup, android.view.View, int, long);
-  }
-
-  public abstract interface OnItemViewClickedListener {
-    method public abstract void onItemClicked(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object, android.support.v17.leanback.widget.RowPresenter.ViewHolder, android.support.v17.leanback.widget.Row);
-  }
-
-  public abstract interface OnItemViewSelectedListener {
-    method public abstract void onItemSelected(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object, android.support.v17.leanback.widget.RowPresenter.ViewHolder, android.support.v17.leanback.widget.Row);
-  }
-
-  public class PlaybackControlsRow extends android.support.v17.leanback.widget.Row {
-    ctor public PlaybackControlsRow(java.lang.Object);
-    ctor public PlaybackControlsRow();
-    method public android.support.v17.leanback.widget.Action getActionForKeyCode(int);
-    method public android.support.v17.leanback.widget.Action getActionForKeyCode(android.support.v17.leanback.widget.ObjectAdapter, int);
-    method public int getBufferedProgress();
-    method public int getCurrentTime();
-    method public final android.graphics.drawable.Drawable getImageDrawable();
-    method public final java.lang.Object getItem();
-    method public final android.support.v17.leanback.widget.ObjectAdapter getPrimaryActionsAdapter();
-    method public final android.support.v17.leanback.widget.ObjectAdapter getSecondaryActionsAdapter();
-    method public int getTotalTime();
-    method public void setBufferedProgress(int);
-    method public void setCurrentTime(int);
-    method public final void setImageBitmap(android.content.Context, android.graphics.Bitmap);
-    method public final void setImageDrawable(android.graphics.drawable.Drawable);
-    method public final void setPrimaryActionsAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public final void setSecondaryActionsAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public void setTotalTime(int);
-  }
-
-  public static class PlaybackControlsRow.ClosedCaptioningAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
-    ctor public PlaybackControlsRow.ClosedCaptioningAction(android.content.Context);
-    ctor public PlaybackControlsRow.ClosedCaptioningAction(android.content.Context, int);
-    field public static int OFF;
-    field public static int ON;
-  }
-
-  public static class PlaybackControlsRow.FastForwardAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
-    ctor public PlaybackControlsRow.FastForwardAction(android.content.Context);
-    ctor public PlaybackControlsRow.FastForwardAction(android.content.Context, int);
-  }
-
-  public static class PlaybackControlsRow.HighQualityAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
-    ctor public PlaybackControlsRow.HighQualityAction(android.content.Context);
-    ctor public PlaybackControlsRow.HighQualityAction(android.content.Context, int);
-    field public static int OFF;
-    field public static int ON;
-  }
-
-  public static class PlaybackControlsRow.MoreActions extends android.support.v17.leanback.widget.Action {
-    ctor public PlaybackControlsRow.MoreActions(android.content.Context);
-  }
-
-  public static abstract class PlaybackControlsRow.MultiAction extends android.support.v17.leanback.widget.Action {
-    ctor public PlaybackControlsRow.MultiAction(int);
-    method public int getActionCount();
-    method public android.graphics.drawable.Drawable getDrawable(int);
-    method public int getIndex();
-    method public java.lang.String getLabel(int);
-    method public java.lang.String getSecondaryLabel(int);
-    method public void nextIndex();
-    method public void setDrawables(android.graphics.drawable.Drawable[]);
-    method public void setIndex(int);
-    method public void setLabels(java.lang.String[]);
-    method public void setSecondaryLabels(java.lang.String[]);
-  }
-
-  public static class PlaybackControlsRow.PlayPauseAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
-    ctor public PlaybackControlsRow.PlayPauseAction(android.content.Context);
-    field public static int PAUSE;
-    field public static int PLAY;
-  }
-
-  public static class PlaybackControlsRow.RepeatAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
-    ctor public PlaybackControlsRow.RepeatAction(android.content.Context);
-    ctor public PlaybackControlsRow.RepeatAction(android.content.Context, int);
-    ctor public PlaybackControlsRow.RepeatAction(android.content.Context, int, int);
-    field public static int ALL;
-    field public static int NONE;
-    field public static int ONE;
-  }
-
-  public static class PlaybackControlsRow.RewindAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
-    ctor public PlaybackControlsRow.RewindAction(android.content.Context);
-    ctor public PlaybackControlsRow.RewindAction(android.content.Context, int);
-  }
-
-  public static class PlaybackControlsRow.ShuffleAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
-    ctor public PlaybackControlsRow.ShuffleAction(android.content.Context);
-    ctor public PlaybackControlsRow.ShuffleAction(android.content.Context, int);
-    field public static int OFF;
-    field public static int ON;
-  }
-
-  public static class PlaybackControlsRow.SkipNextAction extends android.support.v17.leanback.widget.Action {
-    ctor public PlaybackControlsRow.SkipNextAction(android.content.Context);
-  }
-
-  public static class PlaybackControlsRow.SkipPreviousAction extends android.support.v17.leanback.widget.Action {
-    ctor public PlaybackControlsRow.SkipPreviousAction(android.content.Context);
-  }
-
-  public static abstract class PlaybackControlsRow.ThumbsAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
-    ctor public PlaybackControlsRow.ThumbsAction(int, android.content.Context, int, int);
-    field public static int OUTLINE;
-    field public static int SOLID;
-  }
-
-  public static class PlaybackControlsRow.ThumbsDownAction extends android.support.v17.leanback.widget.PlaybackControlsRow.ThumbsAction {
-    ctor public PlaybackControlsRow.ThumbsDownAction(android.content.Context);
-  }
-
-  public static class PlaybackControlsRow.ThumbsUpAction extends android.support.v17.leanback.widget.PlaybackControlsRow.ThumbsAction {
-    ctor public PlaybackControlsRow.ThumbsUpAction(android.content.Context);
-  }
-
-  public class PlaybackControlsRowPresenter extends android.support.v17.leanback.widget.RowPresenter {
-    ctor public PlaybackControlsRowPresenter(android.support.v17.leanback.widget.Presenter);
-    ctor public PlaybackControlsRowPresenter();
-    method public boolean areSecondaryActionsHidden();
-    method protected android.support.v17.leanback.widget.RowPresenter.ViewHolder createRowViewHolder(android.view.ViewGroup);
-    method public int getBackgroundColor();
-    method public android.support.v17.leanback.widget.OnActionClickedListener getOnActionClickedListener();
-    method public int getProgressColor();
-    method public void setBackgroundColor(int);
-    method public void setOnActionClickedListener(android.support.v17.leanback.widget.OnActionClickedListener);
-    method public void setProgressColor(int);
-    method public void setSecondaryActionsHidden(boolean);
-    method public void showBottomSpace(android.support.v17.leanback.widget.PlaybackControlsRowPresenter.ViewHolder, boolean);
-    method public void showPrimaryActions(android.support.v17.leanback.widget.PlaybackControlsRowPresenter.ViewHolder);
-  }
-
-  public class PlaybackControlsRowPresenter.ViewHolder extends android.support.v17.leanback.widget.RowPresenter.ViewHolder {
-    field public final android.support.v17.leanback.widget.Presenter.ViewHolder mDescriptionViewHolder;
-  }
-
-  public abstract class Presenter {
-    ctor public Presenter();
-    method protected static void cancelAnimationsRecursive(android.view.View);
-    method public abstract void onBindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object);
-    method public abstract android.support.v17.leanback.widget.Presenter.ViewHolder onCreateViewHolder(android.view.ViewGroup);
-    method public abstract void onUnbindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public void onViewAttachedToWindow(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public void onViewDetachedFromWindow(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public void setOnClickListener(android.support.v17.leanback.widget.Presenter.ViewHolder, android.view.View.OnClickListener);
-  }
-
-  public static class Presenter.ViewHolder {
-    ctor public Presenter.ViewHolder(android.view.View);
-    field public final android.view.View view;
-  }
-
-  public abstract class PresenterSelector {
-    ctor public PresenterSelector();
-    method public abstract android.support.v17.leanback.widget.Presenter getPresenter(java.lang.Object);
-  }
-
-  public abstract class PresenterSwitcher {
-    ctor public PresenterSwitcher();
-    method public void clear();
-    method public final android.view.ViewGroup getParentViewGroup();
-    method public void init(android.view.ViewGroup, android.support.v17.leanback.widget.PresenterSelector);
-    method protected abstract void insertView(android.view.View);
-    method protected void onViewSelected(android.view.View);
-    method public void select(java.lang.Object);
-    method protected void showView(android.view.View, boolean);
-    method public void unselect();
-  }
-
-  public class Row {
-    ctor public Row(long, android.support.v17.leanback.widget.HeaderItem);
-    ctor public Row(android.support.v17.leanback.widget.HeaderItem);
-    ctor public Row();
-    method public final android.support.v17.leanback.widget.HeaderItem getHeaderItem();
-    method public final long getId();
-    method public final void setHeaderItem(android.support.v17.leanback.widget.HeaderItem);
-    method public final void setId(long);
-  }
-
-  public class RowHeaderPresenter extends android.support.v17.leanback.widget.Presenter {
-    ctor public RowHeaderPresenter();
-    method protected static float getFontDescent(android.widget.TextView, android.graphics.Paint);
-    method public int getSpaceUnderBaseline(android.support.v17.leanback.widget.RowHeaderPresenter.ViewHolder);
-    method public boolean isNullItemVisibilityGone();
-    method public void onBindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object);
-    method public android.support.v17.leanback.widget.Presenter.ViewHolder onCreateViewHolder(android.view.ViewGroup);
-    method protected void onSelectLevelChanged(android.support.v17.leanback.widget.RowHeaderPresenter.ViewHolder);
-    method public void onUnbindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public void setNullItemVisibilityGone(boolean);
-    method public final void setSelectLevel(android.support.v17.leanback.widget.RowHeaderPresenter.ViewHolder, float);
-  }
-
-  public static class RowHeaderPresenter.ViewHolder extends android.support.v17.leanback.widget.Presenter.ViewHolder {
-    ctor public RowHeaderPresenter.ViewHolder(android.view.View);
-    method public final float getSelectLevel();
-  }
-
-  public final class RowHeaderView extends android.widget.TextView {
-    ctor public RowHeaderView(android.content.Context);
-    ctor public RowHeaderView(android.content.Context, android.util.AttributeSet);
-    ctor public RowHeaderView(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public abstract class RowPresenter extends android.support.v17.leanback.widget.Presenter {
-    ctor public RowPresenter();
-    method public boolean canDrawOutOfBounds();
-    method protected abstract android.support.v17.leanback.widget.RowPresenter.ViewHolder createRowViewHolder(android.view.ViewGroup);
-    method protected void dispatchItemSelectedListener(android.support.v17.leanback.widget.RowPresenter.ViewHolder, boolean);
-    method public void freeze(android.support.v17.leanback.widget.RowPresenter.ViewHolder, boolean);
-    method public final android.support.v17.leanback.widget.RowHeaderPresenter getHeaderPresenter();
-    method public final android.support.v17.leanback.widget.RowPresenter.ViewHolder getRowViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public final boolean getSelectEffectEnabled();
-    method public final float getSelectLevel(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public final int getSyncActivatePolicy();
-    method protected void initializeRowViewHolder(android.support.v17.leanback.widget.RowPresenter.ViewHolder);
-    method public boolean isUsingDefaultSelectEffect();
-    method protected void onBindRowViewHolder(android.support.v17.leanback.widget.RowPresenter.ViewHolder, java.lang.Object);
-    method public final void onBindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object);
-    method public final android.support.v17.leanback.widget.Presenter.ViewHolder onCreateViewHolder(android.view.ViewGroup);
-    method protected void onRowViewAttachedToWindow(android.support.v17.leanback.widget.RowPresenter.ViewHolder);
-    method protected void onRowViewDetachedFromWindow(android.support.v17.leanback.widget.RowPresenter.ViewHolder);
-    method protected void onRowViewExpanded(android.support.v17.leanback.widget.RowPresenter.ViewHolder, boolean);
-    method protected void onRowViewSelected(android.support.v17.leanback.widget.RowPresenter.ViewHolder, boolean);
-    method protected void onSelectLevelChanged(android.support.v17.leanback.widget.RowPresenter.ViewHolder);
-    method protected void onUnbindRowViewHolder(android.support.v17.leanback.widget.RowPresenter.ViewHolder);
-    method public final void onUnbindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public final void onViewAttachedToWindow(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public final void onViewDetachedFromWindow(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public void setEntranceTransitionState(android.support.v17.leanback.widget.RowPresenter.ViewHolder, boolean);
-    method public final void setHeaderPresenter(android.support.v17.leanback.widget.RowHeaderPresenter);
-    method public final void setRowViewExpanded(android.support.v17.leanback.widget.Presenter.ViewHolder, boolean);
-    method public final void setRowViewSelected(android.support.v17.leanback.widget.Presenter.ViewHolder, boolean);
-    method public final void setSelectEffectEnabled(boolean);
-    method public final void setSelectLevel(android.support.v17.leanback.widget.Presenter.ViewHolder, float);
-    method public final void setSyncActivatePolicy(int);
-    field public static final int SYNC_ACTIVATED_CUSTOM = 0; // 0x0
-    field public static final int SYNC_ACTIVATED_TO_EXPANDED = 1; // 0x1
-    field public static final int SYNC_ACTIVATED_TO_EXPANDED_AND_SELECTED = 3; // 0x3
-    field public static final int SYNC_ACTIVATED_TO_SELECTED = 2; // 0x2
-  }
-
-  public static class RowPresenter.ViewHolder extends android.support.v17.leanback.widget.Presenter.ViewHolder {
-    ctor public RowPresenter.ViewHolder(android.view.View);
-    method public final android.support.v17.leanback.widget.RowHeaderPresenter.ViewHolder getHeaderViewHolder();
-    method public final android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public final android.support.v17.leanback.widget.OnItemViewSelectedListener getOnItemViewSelectedListener();
-    method public android.view.View.OnKeyListener getOnKeyListener();
-    method public final android.support.v17.leanback.widget.Row getRow();
-    method public final float getSelectLevel();
-    method public final boolean isExpanded();
-    method public final boolean isSelected();
-    method public final void setActivated(boolean);
-    method public final void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public final void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public void setOnKeyListener(android.view.View.OnKeyListener);
-    method public final void syncActivatedStatus(android.view.View);
-    field protected final android.support.v17.leanback.graphics.ColorOverlayDimmer mColorDimmer;
-  }
-
-  public class SearchBar extends android.widget.RelativeLayout {
-    ctor public SearchBar(android.content.Context);
-    ctor public SearchBar(android.content.Context, android.util.AttributeSet);
-    ctor public SearchBar(android.content.Context, android.util.AttributeSet, int);
-    method public void displayCompletions(java.util.List<java.lang.String>);
-    method public android.graphics.drawable.Drawable getBadgeDrawable();
-    method public java.lang.CharSequence getHint();
-    method public java.lang.String getTitle();
-    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
-    method public void setSearchBarListener(android.support.v17.leanback.widget.SearchBar.SearchBarListener);
-    method public void setSearchQuery(java.lang.String);
-    method public void setSpeechRecognitionCallback(android.support.v17.leanback.widget.SpeechRecognitionCallback);
-    method public void setSpeechRecognizer(android.speech.SpeechRecognizer);
-    method public void setTitle(java.lang.String);
-    method public void startRecognition();
-    method public void stopRecognition();
-  }
-
-  public static abstract interface SearchBar.SearchBarListener {
-    method public abstract void onKeyboardDismiss(java.lang.String);
-    method public abstract void onSearchQueryChange(java.lang.String);
-    method public abstract void onSearchQuerySubmit(java.lang.String);
-  }
-
-  public class SearchEditText extends android.support.v17.leanback.widget.StreamingTextView {
-    ctor public SearchEditText(android.content.Context);
-    ctor public SearchEditText(android.content.Context, android.util.AttributeSet);
-    ctor public SearchEditText(android.content.Context, android.util.AttributeSet, int);
-    method public void setOnKeyboardDismissListener(android.support.v17.leanback.widget.SearchEditText.OnKeyboardDismissListener);
-  }
-
-  public static abstract interface SearchEditText.OnKeyboardDismissListener {
-    method public abstract void onKeyboardDismiss();
-  }
-
-  public class SearchOrbView extends android.widget.FrameLayout implements android.view.View.OnClickListener {
-    ctor public SearchOrbView(android.content.Context);
-    ctor public SearchOrbView(android.content.Context, android.util.AttributeSet);
-    ctor public SearchOrbView(android.content.Context, android.util.AttributeSet, int);
-    method public void enableOrbColorAnimation(boolean);
-    method public int getOrbColor();
-    method public android.support.v17.leanback.widget.SearchOrbView.Colors getOrbColors();
-    method public android.graphics.drawable.Drawable getOrbIcon();
-    method public void onClick(android.view.View);
-    method public void setOnOrbClickedListener(android.view.View.OnClickListener);
-    method public void setOrbColor(int);
-    method public deprecated void setOrbColor(int, int);
-    method public void setOrbColors(android.support.v17.leanback.widget.SearchOrbView.Colors);
-    method public void setOrbIcon(android.graphics.drawable.Drawable);
-  }
-
-  public static class SearchOrbView.Colors {
-    ctor public SearchOrbView.Colors(int);
-    ctor public SearchOrbView.Colors(int, int);
-    ctor public SearchOrbView.Colors(int, int, int);
-    method public static int getBrightColor(int);
-    field public int brightColor;
-    field public int color;
-    field public int iconColor;
-  }
-
-  public class ShadowOverlayContainer extends android.view.ViewGroup {
-    ctor public ShadowOverlayContainer(android.content.Context);
-    ctor public ShadowOverlayContainer(android.content.Context, android.util.AttributeSet);
-    ctor public ShadowOverlayContainer(android.content.Context, android.util.AttributeSet, int);
-    method public deprecated void initialize(boolean, boolean);
-    method public void initialize(boolean, boolean, boolean);
-    method protected void onLayout(boolean, int, int, int, int);
-    method public static void prepareParentForShadow(android.view.ViewGroup);
-    method public void setOverlayColor(int);
-    method public void setShadowFocusLevel(float);
-    method public static boolean supportsShadow();
-    method public void wrap(android.view.View);
-  }
-
-  public final class SinglePresenterSelector extends android.support.v17.leanback.widget.PresenterSelector {
-    ctor public SinglePresenterSelector(android.support.v17.leanback.widget.Presenter);
-    method public android.support.v17.leanback.widget.Presenter getPresenter(java.lang.Object);
-  }
-
-  public class SparseArrayObjectAdapter extends android.support.v17.leanback.widget.ObjectAdapter {
-    ctor public SparseArrayObjectAdapter(android.support.v17.leanback.widget.PresenterSelector);
-    ctor public SparseArrayObjectAdapter(android.support.v17.leanback.widget.Presenter);
-    ctor public SparseArrayObjectAdapter();
-    method public void clear(int);
-    method public void clear();
-    method public java.lang.Object get(int);
-    method public int indexOf(java.lang.Object);
-    method public int indexOf(int);
-    method public java.lang.Object lookup(int);
-    method public void notifyArrayItemRangeChanged(int, int);
-    method public void set(int, java.lang.Object);
-    method public int size();
-  }
-
-  public class SpeechOrbView extends android.support.v17.leanback.widget.SearchOrbView {
-    ctor public SpeechOrbView(android.content.Context);
-    ctor public SpeechOrbView(android.content.Context, android.util.AttributeSet);
-    ctor public SpeechOrbView(android.content.Context, android.util.AttributeSet, int);
-    method public void setSoundLevel(int);
-    method public void showListening();
-    method public void showNotListening();
-  }
-
-  public abstract interface SpeechRecognitionCallback {
-    method public abstract void recognizeSpeech();
-  }
-
-   class StreamingTextView extends android.widget.EditText {
-    ctor public StreamingTextView(android.content.Context, android.util.AttributeSet);
-    ctor public StreamingTextView(android.content.Context, android.util.AttributeSet, int);
-    method public static boolean isLayoutRtl(android.view.View);
-    method public void reset();
-    method public void setFinalRecognizedText(java.lang.CharSequence);
-    method public void updateRecognizedText(java.lang.String, java.lang.String);
-    method public void updateRecognizedText(java.lang.String, java.util.List<java.lang.Float>);
-  }
-
-  public class TitleHelper {
-    ctor public TitleHelper(android.view.ViewGroup, android.support.v17.leanback.widget.TitleView);
-    method public android.support.v17.leanback.widget.BrowseFrameLayout.OnFocusSearchListener getOnFocusSearchListener();
-    method public android.view.ViewGroup getSceneRoot();
-    method public android.support.v17.leanback.widget.TitleView getTitleView();
-    method public void showTitle(boolean);
-  }
-
-  public class TitleView extends android.widget.FrameLayout {
-    ctor public TitleView(android.content.Context);
-    ctor public TitleView(android.content.Context, android.util.AttributeSet);
-    ctor public TitleView(android.content.Context, android.util.AttributeSet, int);
-    method public void enableAnimation(boolean);
-    method public android.graphics.drawable.Drawable getBadgeDrawable();
-    method public android.support.v17.leanback.widget.SearchOrbView.Colors getSearchAffordanceColors();
-    method public android.view.View getSearchAffordanceView();
-    method public java.lang.CharSequence getTitle();
-    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
-    method public void setOnSearchClickedListener(android.view.View.OnClickListener);
-    method public void setSearchAffordanceColors(android.support.v17.leanback.widget.SearchOrbView.Colors);
-    method public void setTitle(java.lang.String);
-  }
-
-  public class VerticalGridPresenter extends android.support.v17.leanback.widget.Presenter {
-    ctor public VerticalGridPresenter();
-    ctor public VerticalGridPresenter(int);
-    ctor public VerticalGridPresenter(int, boolean);
-    method public final boolean areChildRoundedCornersEnabled();
-    method protected android.support.v17.leanback.widget.VerticalGridPresenter.ViewHolder createGridViewHolder(android.view.ViewGroup);
-    method public final void enableChildRoundedCorners(boolean);
-    method public final int getFocusZoomFactor();
-    method public int getNumberOfColumns();
-    method public final android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public final android.support.v17.leanback.widget.OnItemViewSelectedListener getOnItemViewSelectedListener();
-    method public final boolean getShadowEnabled();
-    method protected void initializeGridViewHolder(android.support.v17.leanback.widget.VerticalGridPresenter.ViewHolder);
-    method public final boolean isFocusDimmerUsed();
-    method public boolean isUsingDefaultShadow();
-    method public boolean isUsingZOrder();
-    method public void onBindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object);
-    method public final android.support.v17.leanback.widget.VerticalGridPresenter.ViewHolder onCreateViewHolder(android.view.ViewGroup);
-    method public void onUnbindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public void setNumberOfColumns(int);
-    method public final void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public final void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public final void setShadowEnabled(boolean);
-  }
-
-  public static class VerticalGridPresenter.ViewHolder extends android.support.v17.leanback.widget.Presenter.ViewHolder {
-    ctor public VerticalGridPresenter.ViewHolder(android.support.v17.leanback.widget.VerticalGridView);
-    method public android.support.v17.leanback.widget.VerticalGridView getGridView();
-  }
-
-  public class VerticalGridView extends android.support.v7.widget.RecyclerView {
-    ctor public VerticalGridView(android.content.Context);
-    ctor public VerticalGridView(android.content.Context, android.util.AttributeSet);
-    ctor public VerticalGridView(android.content.Context, android.util.AttributeSet, int);
-    method protected void initAttributes(android.content.Context, android.util.AttributeSet);
-    method public void setColumnWidth(int);
-    method public void setNumColumns(int);
-  }
-
-}
-
diff --git a/v17/leanback/api/22.2.1.txt b/v17/leanback/api/22.2.1.txt
deleted file mode 100644
index 336a422..0000000
--- a/v17/leanback/api/22.2.1.txt
+++ /dev/null
@@ -1,1570 +0,0 @@
-package android.support.v17.leanback.app {
-
-  public final class BackgroundManager {
-    method public void attach(android.view.Window);
-    method public final int getColor();
-    method public android.graphics.drawable.Drawable getDefaultDimLayer();
-    method public android.graphics.drawable.Drawable getDimLayer();
-    method public android.graphics.drawable.Drawable getDrawable();
-    method public static android.support.v17.leanback.app.BackgroundManager getInstance(android.app.Activity);
-    method public boolean isAttached();
-    method public void release();
-    method public void setBitmap(android.graphics.Bitmap);
-    method public void setColor(int);
-    method public void setDimLayer(android.graphics.drawable.Drawable);
-    method public void setDrawable(android.graphics.drawable.Drawable);
-    method public void setThemeDrawableResourceId(int);
-  }
-
-   abstract class BaseRowFragment extends android.app.Fragment {
-    method public final android.support.v17.leanback.widget.ObjectAdapter getAdapter();
-    method public final android.support.v17.leanback.widget.PresenterSelector getPresenterSelector();
-    method public final void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public final void setPresenterSelector(android.support.v17.leanback.widget.PresenterSelector);
-    method public void setSelectedPosition(int);
-    method public void setSelectedPosition(int, boolean);
-  }
-
-   abstract class BaseRowSupportFragment extends android.support.v4.app.Fragment {
-    method public final android.support.v17.leanback.widget.ObjectAdapter getAdapter();
-    method public final android.support.v17.leanback.widget.PresenterSelector getPresenterSelector();
-    method public final void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public final void setPresenterSelector(android.support.v17.leanback.widget.PresenterSelector);
-    method public void setSelectedPosition(int);
-    method public void setSelectedPosition(int, boolean);
-  }
-
-  public class BrowseFragment extends android.support.v17.leanback.app.BrandedFragment {
-    ctor public BrowseFragment();
-    method public static android.os.Bundle createArgs(android.os.Bundle, java.lang.String, int);
-    method public void enableRowScaling(boolean);
-    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
-    method public int getBrandColor();
-    method public int getHeadersState();
-    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public android.support.v17.leanback.widget.OnItemViewSelectedListener getOnItemViewSelectedListener();
-    method public final boolean isHeadersTransitionOnBackEnabled();
-    method public boolean isInHeadersTransition();
-    method public boolean isShowingHeaders();
-    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public void setBrandColor(int);
-    method public void setBrowseTransitionListener(android.support.v17.leanback.app.BrowseFragment.BrowseTransitionListener);
-    method public void setHeaderPresenterSelector(android.support.v17.leanback.widget.PresenterSelector);
-    method public void setHeadersState(int);
-    method public final void setHeadersTransitionOnBackEnabled(boolean);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public void setSelectedPosition(int);
-    method public void setSelectedPosition(int, boolean);
-    method public void startHeadersTransition(boolean);
-    field public static final int HEADERS_DISABLED = 3; // 0x3
-    field public static final int HEADERS_ENABLED = 1; // 0x1
-    field public static final int HEADERS_HIDDEN = 2; // 0x2
-  }
-
-  public static class BrowseFragment.BrowseTransitionListener {
-    ctor public BrowseFragment.BrowseTransitionListener();
-    method public void onHeadersTransitionStart(boolean);
-    method public void onHeadersTransitionStop(boolean);
-  }
-
-  public class BrowseSupportFragment extends android.support.v17.leanback.app.BrandedSupportFragment {
-    ctor public BrowseSupportFragment();
-    method public static android.os.Bundle createArgs(android.os.Bundle, java.lang.String, int);
-    method public void enableRowScaling(boolean);
-    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
-    method public int getBrandColor();
-    method public int getHeadersState();
-    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public android.support.v17.leanback.widget.OnItemViewSelectedListener getOnItemViewSelectedListener();
-    method public final boolean isHeadersTransitionOnBackEnabled();
-    method public boolean isInHeadersTransition();
-    method public boolean isShowingHeaders();
-    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public void setBrandColor(int);
-    method public void setBrowseTransitionListener(android.support.v17.leanback.app.BrowseSupportFragment.BrowseTransitionListener);
-    method public void setHeaderPresenterSelector(android.support.v17.leanback.widget.PresenterSelector);
-    method public void setHeadersState(int);
-    method public final void setHeadersTransitionOnBackEnabled(boolean);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public void setSelectedPosition(int);
-    method public void setSelectedPosition(int, boolean);
-    method public void startHeadersTransition(boolean);
-    field public static final int HEADERS_DISABLED = 3; // 0x3
-    field public static final int HEADERS_ENABLED = 1; // 0x1
-    field public static final int HEADERS_HIDDEN = 2; // 0x2
-  }
-
-  public static class BrowseSupportFragment.BrowseTransitionListener {
-    ctor public BrowseSupportFragment.BrowseTransitionListener();
-    method public void onHeadersTransitionStart(boolean);
-    method public void onHeadersTransitionStop(boolean);
-  }
-
-  public class DetailsFragment extends android.support.v17.leanback.app.BrandedFragment {
-    ctor public DetailsFragment();
-    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
-    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method protected android.view.View inflateTitle(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
-    method protected void onSetDetailsOverviewRowStatus(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter, android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder, int, int, int);
-    method protected void onSetRowStatus(android.support.v17.leanback.widget.RowPresenter, android.support.v17.leanback.widget.RowPresenter.ViewHolder, int, int, int);
-    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public void setSelectedPosition(int);
-    method public void setSelectedPosition(int, boolean);
-    method protected void setupDetailsOverviewRowPresenter(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter);
-    method protected void setupPresenter(android.support.v17.leanback.widget.Presenter);
-  }
-
-  public class DetailsSupportFragment extends android.support.v17.leanback.app.BrandedSupportFragment {
-    ctor public DetailsSupportFragment();
-    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
-    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method protected android.view.View inflateTitle(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
-    method protected void onSetDetailsOverviewRowStatus(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter, android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder, int, int, int);
-    method protected void onSetRowStatus(android.support.v17.leanback.widget.RowPresenter, android.support.v17.leanback.widget.RowPresenter.ViewHolder, int, int, int);
-    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public void setSelectedPosition(int);
-    method public void setSelectedPosition(int, boolean);
-    method protected void setupDetailsOverviewRowPresenter(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter);
-    method protected void setupPresenter(android.support.v17.leanback.widget.Presenter);
-  }
-
-  public class ErrorFragment extends android.app.Fragment {
-    ctor public ErrorFragment();
-    method public android.graphics.drawable.Drawable getBackgroundDrawable();
-    method public android.graphics.drawable.Drawable getBadgeDrawable();
-    method public android.view.View.OnClickListener getButtonClickListener();
-    method public java.lang.String getButtonText();
-    method public android.graphics.drawable.Drawable getImageDrawable();
-    method public java.lang.CharSequence getMessage();
-    method public java.lang.String getTitle();
-    method public boolean isBackgroundTranslucent();
-    method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
-    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
-    method public void setButtonClickListener(android.view.View.OnClickListener);
-    method public void setButtonText(java.lang.String);
-    method public void setDefaultBackground(boolean);
-    method public void setImageDrawable(android.graphics.drawable.Drawable);
-    method public void setMessage(java.lang.CharSequence);
-    method public void setTitle(java.lang.String);
-  }
-
-  public class ErrorSupportFragment extends android.support.v4.app.Fragment {
-    ctor public ErrorSupportFragment();
-    method public android.graphics.drawable.Drawable getBackgroundDrawable();
-    method public android.graphics.drawable.Drawable getBadgeDrawable();
-    method public android.view.View.OnClickListener getButtonClickListener();
-    method public java.lang.String getButtonText();
-    method public android.graphics.drawable.Drawable getImageDrawable();
-    method public java.lang.CharSequence getMessage();
-    method public java.lang.String getTitle();
-    method public boolean isBackgroundTranslucent();
-    method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
-    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
-    method public void setButtonClickListener(android.view.View.OnClickListener);
-    method public void setButtonText(java.lang.String);
-    method public void setDefaultBackground(boolean);
-    method public void setImageDrawable(android.graphics.drawable.Drawable);
-    method public void setMessage(java.lang.CharSequence);
-    method public void setTitle(java.lang.String);
-  }
-
-  public class GuidedStepFragment extends android.app.Fragment {
-    ctor public GuidedStepFragment();
-    method public static int add(android.app.FragmentManager, android.support.v17.leanback.app.GuidedStepFragment);
-    method public android.view.View getActionItemView(int);
-    method public java.util.List<android.support.v17.leanback.widget.GuidedAction> getActions();
-    method public static android.support.v17.leanback.app.GuidedStepFragment getCurrentGuidedStepFragment(android.app.FragmentManager);
-    method public android.support.v17.leanback.widget.GuidanceStylist getGuidanceStylist();
-    method public android.support.v17.leanback.widget.GuidedActionsStylist getGuidedActionsStylist();
-    method public int getSelectedActionPosition();
-    method protected boolean isEntryTransitionEnabled();
-    method public void onCreateActions(java.util.List<android.support.v17.leanback.widget.GuidedAction>, android.os.Bundle);
-    method public android.support.v17.leanback.widget.GuidedActionsStylist onCreateActionsStylist();
-    method public android.support.v17.leanback.widget.GuidanceStylist.Guidance onCreateGuidance(android.os.Bundle);
-    method public android.support.v17.leanback.widget.GuidanceStylist onCreateGuidanceStylist();
-    method public void onGuidedActionClicked(android.support.v17.leanback.widget.GuidedAction);
-    method public void onGuidedActionFocused(android.support.v17.leanback.widget.GuidedAction);
-    method public int onProvideTheme();
-    method public void setActions(java.util.List<android.support.v17.leanback.widget.GuidedAction>);
-    method protected void setEntryTransitionEnabled(boolean);
-    method public void setSelectedActionPosition(int);
-  }
-
-  public class HeadersFragment extends android.support.v17.leanback.app.BaseRowFragment {
-    ctor public HeadersFragment();
-    method public void setOnHeaderClickedListener(android.support.v17.leanback.app.HeadersFragment.OnHeaderClickedListener);
-    method public void setOnHeaderViewSelectedListener(android.support.v17.leanback.app.HeadersFragment.OnHeaderViewSelectedListener);
-  }
-
-   static abstract interface HeadersFragment.OnHeaderClickedListener {
-    method public abstract void onHeaderClicked();
-  }
-
-   static abstract interface HeadersFragment.OnHeaderViewSelectedListener {
-    method public abstract void onHeaderSelected(android.support.v17.leanback.widget.RowHeaderPresenter.ViewHolder, android.support.v17.leanback.widget.Row);
-  }
-
-  public class HeadersSupportFragment extends android.support.v17.leanback.app.BaseRowSupportFragment {
-    ctor public HeadersSupportFragment();
-    method public void setOnHeaderClickedListener(android.support.v17.leanback.app.HeadersSupportFragment.OnHeaderClickedListener);
-    method public void setOnHeaderViewSelectedListener(android.support.v17.leanback.app.HeadersSupportFragment.OnHeaderViewSelectedListener);
-  }
-
-   static abstract interface HeadersSupportFragment.OnHeaderClickedListener {
-    method public abstract void onHeaderClicked();
-  }
-
-   static abstract interface HeadersSupportFragment.OnHeaderViewSelectedListener {
-    method public abstract void onHeaderSelected(android.support.v17.leanback.widget.RowHeaderPresenter.ViewHolder, android.support.v17.leanback.widget.Row);
-  }
-
-  public abstract class MediaControllerGlue extends android.support.v17.leanback.app.PlaybackControlGlue {
-    ctor public MediaControllerGlue(android.content.Context, android.support.v17.leanback.app.PlaybackOverlayFragment, int[]);
-    ctor public MediaControllerGlue(android.content.Context, android.support.v17.leanback.app.PlaybackOverlayFragment, int[], int[]);
-    method public void attachToMediaController(android.support.v4.media.session.MediaControllerCompat);
-    method public void detach();
-    method public int getCurrentPosition();
-    method public int getCurrentSpeedId();
-    method public android.graphics.drawable.Drawable getMediaArt();
-    method public final android.support.v4.media.session.MediaControllerCompat getMediaController();
-    method public int getMediaDuration();
-    method public java.lang.CharSequence getMediaSubtitle();
-    method public java.lang.CharSequence getMediaTitle();
-    method public long getSupportedActions();
-    method public boolean hasValidMedia();
-    method public boolean isMediaPlaying();
-    method protected void pausePlayback();
-    method protected void skipToNext();
-    method protected void skipToPrevious();
-    method protected void startPlayback(int);
-  }
-
-  public abstract class PlaybackControlGlue implements android.support.v17.leanback.widget.OnActionClickedListener android.view.View.OnKeyListener {
-    ctor public PlaybackControlGlue(android.content.Context, int[]);
-    ctor public PlaybackControlGlue(android.content.Context, int[], int[]);
-    ctor public PlaybackControlGlue(android.content.Context, android.support.v17.leanback.app.PlaybackOverlayFragment, int[]);
-    ctor public PlaybackControlGlue(android.content.Context, android.support.v17.leanback.app.PlaybackOverlayFragment, int[], int[]);
-    method public android.support.v17.leanback.widget.PlaybackControlsRowPresenter createControlsRowAndPresenter();
-    method protected android.support.v17.leanback.widget.SparseArrayObjectAdapter createPrimaryActionsAdapter(android.support.v17.leanback.widget.PresenterSelector);
-    method public void enableProgressUpdating(boolean);
-    method public android.content.Context getContext();
-    method public android.support.v17.leanback.widget.PlaybackControlsRow getControlsRow();
-    method public abstract int getCurrentPosition();
-    method public abstract int getCurrentSpeedId();
-    method public int[] getFastForwardSpeeds();
-    method public android.support.v17.leanback.app.PlaybackOverlayFragment getFragment();
-    method public abstract android.graphics.drawable.Drawable getMediaArt();
-    method public abstract int getMediaDuration();
-    method public abstract java.lang.CharSequence getMediaSubtitle();
-    method public abstract java.lang.CharSequence getMediaTitle();
-    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public int[] getRewindSpeeds();
-    method public abstract long getSupportedActions();
-    method public int getUpdatePeriod();
-    method public abstract boolean hasValidMedia();
-    method public boolean isFadingEnabled();
-    method public abstract boolean isMediaPlaying();
-    method public void onActionClicked(android.support.v17.leanback.widget.Action);
-    method public boolean onKey(android.view.View, int, android.view.KeyEvent);
-    method protected void onMetadataChanged();
-    method protected abstract void onRowChanged(android.support.v17.leanback.widget.PlaybackControlsRow);
-    method protected void onStateChanged();
-    method protected abstract void pausePlayback();
-    method public void setControlsRow(android.support.v17.leanback.widget.PlaybackControlsRow);
-    method public void setFadingEnabled(boolean);
-    method public deprecated void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method protected abstract void skipToNext();
-    method protected abstract void skipToPrevious();
-    method protected abstract void startPlayback(int);
-    method public void updateProgress();
-    field public static final int ACTION_CUSTOM_LEFT_FIRST = 1; // 0x1
-    field public static final int ACTION_CUSTOM_RIGHT_FIRST = 4096; // 0x1000
-    field public static final int ACTION_FAST_FORWARD = 128; // 0x80
-    field public static final int ACTION_PLAY_PAUSE = 64; // 0x40
-    field public static final int ACTION_REWIND = 32; // 0x20
-    field public static final int ACTION_SKIP_TO_NEXT = 256; // 0x100
-    field public static final int ACTION_SKIP_TO_PREVIOUS = 16; // 0x10
-    field public static final int PLAYBACK_SPEED_FAST_L0 = 10; // 0xa
-    field public static final int PLAYBACK_SPEED_FAST_L1 = 11; // 0xb
-    field public static final int PLAYBACK_SPEED_FAST_L2 = 12; // 0xc
-    field public static final int PLAYBACK_SPEED_FAST_L3 = 13; // 0xd
-    field public static final int PLAYBACK_SPEED_FAST_L4 = 14; // 0xe
-    field public static final int PLAYBACK_SPEED_INVALID = -1; // 0xffffffff
-    field public static final int PLAYBACK_SPEED_NORMAL = 1; // 0x1
-    field public static final int PLAYBACK_SPEED_PAUSED = 0; // 0x0
-  }
-
-  public class PlaybackOverlayFragment extends android.support.v17.leanback.app.DetailsFragment {
-    ctor public PlaybackOverlayFragment();
-    method public int getBackgroundType();
-    method public android.support.v17.leanback.app.PlaybackOverlayFragment.OnFadeCompleteListener getFadeCompleteListener();
-    method public final android.support.v17.leanback.app.PlaybackOverlayFragment.InputEventHandler getInputEventHandler();
-    method public boolean isFadingEnabled();
-    method public void setBackgroundType(int);
-    method public void setFadeCompleteListener(android.support.v17.leanback.app.PlaybackOverlayFragment.OnFadeCompleteListener);
-    method public void setFadingEnabled(boolean);
-    method public final void setInputEventHandler(android.support.v17.leanback.app.PlaybackOverlayFragment.InputEventHandler);
-    method public void tickle();
-    field public static final int BG_DARK = 1; // 0x1
-    field public static final int BG_LIGHT = 2; // 0x2
-    field public static final int BG_NONE = 0; // 0x0
-  }
-
-  public static abstract interface PlaybackOverlayFragment.InputEventHandler {
-    method public abstract boolean handleInputEvent(android.view.InputEvent);
-  }
-
-  public static class PlaybackOverlayFragment.OnFadeCompleteListener {
-    ctor public PlaybackOverlayFragment.OnFadeCompleteListener();
-    method public void onFadeInComplete();
-    method public void onFadeOutComplete();
-  }
-
-  public class PlaybackOverlaySupportFragment extends android.support.v17.leanback.app.DetailsSupportFragment {
-    ctor public PlaybackOverlaySupportFragment();
-    method public int getBackgroundType();
-    method public android.support.v17.leanback.app.PlaybackOverlaySupportFragment.OnFadeCompleteListener getFadeCompleteListener();
-    method public final android.support.v17.leanback.app.PlaybackOverlaySupportFragment.InputEventHandler getInputEventHandler();
-    method public boolean isFadingEnabled();
-    method public void setBackgroundType(int);
-    method public void setFadeCompleteListener(android.support.v17.leanback.app.PlaybackOverlaySupportFragment.OnFadeCompleteListener);
-    method public void setFadingEnabled(boolean);
-    method public final void setInputEventHandler(android.support.v17.leanback.app.PlaybackOverlaySupportFragment.InputEventHandler);
-    method public void tickle();
-    field public static final int BG_DARK = 1; // 0x1
-    field public static final int BG_LIGHT = 2; // 0x2
-    field public static final int BG_NONE = 0; // 0x0
-  }
-
-  public static abstract interface PlaybackOverlaySupportFragment.InputEventHandler {
-    method public abstract boolean handleInputEvent(android.view.InputEvent);
-  }
-
-  public static class PlaybackOverlaySupportFragment.OnFadeCompleteListener {
-    ctor public PlaybackOverlaySupportFragment.OnFadeCompleteListener();
-    method public void onFadeInComplete();
-    method public void onFadeOutComplete();
-  }
-
-  public class RowsFragment extends android.support.v17.leanback.app.BaseRowFragment {
-    ctor public RowsFragment();
-    method public void enableRowScaling(boolean);
-    method protected android.support.v17.leanback.widget.VerticalGridView findGridViewFromRoot(android.view.View);
-    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public android.support.v17.leanback.widget.OnItemViewSelectedListener getOnItemViewSelectedListener();
-    method public void setExpand(boolean);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-  }
-
-  public class RowsSupportFragment extends android.support.v17.leanback.app.BaseRowSupportFragment {
-    ctor public RowsSupportFragment();
-    method public void enableRowScaling(boolean);
-    method protected android.support.v17.leanback.widget.VerticalGridView findGridViewFromRoot(android.view.View);
-    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public android.support.v17.leanback.widget.OnItemViewSelectedListener getOnItemViewSelectedListener();
-    method public void setExpand(boolean);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-  }
-
-  public class SearchFragment extends android.app.Fragment {
-    ctor public SearchFragment();
-    method public static android.os.Bundle createArgs(android.os.Bundle, java.lang.String);
-    method public static android.os.Bundle createArgs(android.os.Bundle, java.lang.String, java.lang.String);
-    method public void displayCompletions(java.util.List<java.lang.String>);
-    method public android.graphics.drawable.Drawable getBadgeDrawable();
-    method public android.content.Intent getRecognizerIntent();
-    method public java.lang.String getTitle();
-    method public static android.support.v17.leanback.app.SearchFragment newInstance(java.lang.String);
-    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public void setSearchQuery(java.lang.String, boolean);
-    method public void setSearchQuery(android.content.Intent, boolean);
-    method public void setSearchResultProvider(android.support.v17.leanback.app.SearchFragment.SearchResultProvider);
-    method public void setSpeechRecognitionCallback(android.support.v17.leanback.widget.SpeechRecognitionCallback);
-    method public void setTitle(java.lang.String);
-    method public void startRecognition();
-  }
-
-  public static abstract interface SearchFragment.SearchResultProvider {
-    method public abstract android.support.v17.leanback.widget.ObjectAdapter getResultsAdapter();
-    method public abstract boolean onQueryTextChange(java.lang.String);
-    method public abstract boolean onQueryTextSubmit(java.lang.String);
-  }
-
-  public class SearchSupportFragment extends android.support.v4.app.Fragment {
-    ctor public SearchSupportFragment();
-    method public static android.os.Bundle createArgs(android.os.Bundle, java.lang.String);
-    method public static android.os.Bundle createArgs(android.os.Bundle, java.lang.String, java.lang.String);
-    method public void displayCompletions(java.util.List<java.lang.String>);
-    method public android.graphics.drawable.Drawable getBadgeDrawable();
-    method public android.content.Intent getRecognizerIntent();
-    method public java.lang.String getTitle();
-    method public static android.support.v17.leanback.app.SearchSupportFragment newInstance(java.lang.String);
-    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public void setSearchQuery(java.lang.String, boolean);
-    method public void setSearchQuery(android.content.Intent, boolean);
-    method public void setSearchResultProvider(android.support.v17.leanback.app.SearchSupportFragment.SearchResultProvider);
-    method public void setSpeechRecognitionCallback(android.support.v17.leanback.widget.SpeechRecognitionCallback);
-    method public void setTitle(java.lang.String);
-    method public void startRecognition();
-  }
-
-  public static abstract interface SearchSupportFragment.SearchResultProvider {
-    method public abstract android.support.v17.leanback.widget.ObjectAdapter getResultsAdapter();
-    method public abstract boolean onQueryTextChange(java.lang.String);
-    method public abstract boolean onQueryTextSubmit(java.lang.String);
-  }
-
-  public class VerticalGridFragment extends android.app.Fragment {
-    ctor public VerticalGridFragment();
-    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
-    method public android.support.v17.leanback.widget.VerticalGridPresenter getGridPresenter();
-    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public void setGridPresenter(android.support.v17.leanback.widget.VerticalGridPresenter);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public void setSelectedPosition(int);
-  }
-
-  public class VerticalGridSupportFragment extends android.support.v4.app.Fragment {
-    ctor public VerticalGridSupportFragment();
-    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
-    method public android.support.v17.leanback.widget.VerticalGridPresenter getGridPresenter();
-    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public void setGridPresenter(android.support.v17.leanback.widget.VerticalGridPresenter);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public void setSelectedPosition(int);
-  }
-
-}
-
-package android.support.v17.leanback.database {
-
-  public abstract class CursorMapper {
-    ctor public CursorMapper();
-    method protected abstract java.lang.Object bind(android.database.Cursor);
-    method protected abstract void bindColumns(android.database.Cursor);
-    method public java.lang.Object convert(android.database.Cursor);
-  }
-
-}
-
-package android.support.v17.leanback.graphics {
-
-  public final class ColorFilterCache {
-    method public static android.support.v17.leanback.graphics.ColorFilterCache getColorFilterCache(int);
-    method public android.graphics.ColorFilter getFilterForLevel(float);
-  }
-
-  public final class ColorFilterDimmer {
-    method public void applyFilterToView(android.view.View);
-    method public static android.support.v17.leanback.graphics.ColorFilterDimmer create(android.support.v17.leanback.graphics.ColorFilterCache, float, float);
-    method public static android.support.v17.leanback.graphics.ColorFilterDimmer createDefault(android.content.Context);
-    method public android.graphics.ColorFilter getColorFilter();
-    method public android.graphics.Paint getPaint();
-    method public void setActiveLevel(float);
-  }
-
-  public final class ColorOverlayDimmer {
-    method public int applyToColor(int);
-    method public static android.support.v17.leanback.graphics.ColorOverlayDimmer createColorOverlayDimmer(int, float, float);
-    method public static android.support.v17.leanback.graphics.ColorOverlayDimmer createDefault(android.content.Context);
-    method public void drawColorOverlay(android.graphics.Canvas, android.view.View, boolean);
-    method public int getAlpha();
-    method public float getAlphaFloat();
-    method public android.graphics.Paint getPaint();
-    method public boolean needsDraw();
-    method public void setActiveLevel(float);
-  }
-
-}
-
-package android.support.v17.leanback.system {
-
-  public class Settings {
-    method public boolean getBoolean(java.lang.String);
-    method public static android.support.v17.leanback.system.Settings getInstance(android.content.Context);
-    method public void setBoolean(java.lang.String, boolean);
-    field public static final java.lang.String PREFER_STATIC_SHADOWS = "PREFER_STATIC_SHADOWS";
-  }
-
-}
-
-package android.support.v17.leanback.widget {
-
-  public abstract class AbstractDetailsDescriptionPresenter extends android.support.v17.leanback.widget.Presenter {
-    ctor public AbstractDetailsDescriptionPresenter();
-    method protected abstract void onBindDescription(android.support.v17.leanback.widget.AbstractDetailsDescriptionPresenter.ViewHolder, java.lang.Object);
-    method public final void onBindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object);
-    method public final android.support.v17.leanback.widget.AbstractDetailsDescriptionPresenter.ViewHolder onCreateViewHolder(android.view.ViewGroup);
-    method public void onUnbindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
-  }
-
-  public static class AbstractDetailsDescriptionPresenter.ViewHolder extends android.support.v17.leanback.widget.Presenter.ViewHolder {
-    ctor public AbstractDetailsDescriptionPresenter.ViewHolder(android.view.View);
-    method public android.widget.TextView getBody();
-    method public android.widget.TextView getSubtitle();
-    method public android.widget.TextView getTitle();
-  }
-
-  public class Action {
-    ctor public Action(long);
-    ctor public Action(long, java.lang.CharSequence);
-    ctor public Action(long, java.lang.CharSequence, java.lang.CharSequence);
-    ctor public Action(long, java.lang.CharSequence, java.lang.CharSequence, android.graphics.drawable.Drawable);
-    method public final void addKeyCode(int);
-    method public final android.graphics.drawable.Drawable getIcon();
-    method public final long getId();
-    method public final java.lang.CharSequence getLabel1();
-    method public final java.lang.CharSequence getLabel2();
-    method public final void removeKeyCode(int);
-    method public final boolean respondsToKeyCode(int);
-    method public final void setIcon(android.graphics.drawable.Drawable);
-    method public final void setId(long);
-    method public final void setLabel1(java.lang.CharSequence);
-    method public final void setLabel2(java.lang.CharSequence);
-  }
-
-  public class ArrayObjectAdapter extends android.support.v17.leanback.widget.ObjectAdapter {
-    ctor public ArrayObjectAdapter(android.support.v17.leanback.widget.PresenterSelector);
-    ctor public ArrayObjectAdapter(android.support.v17.leanback.widget.Presenter);
-    ctor public ArrayObjectAdapter();
-    method public void add(java.lang.Object);
-    method public void add(int, java.lang.Object);
-    method public void addAll(int, java.util.Collection);
-    method public void clear();
-    method public java.lang.Object get(int);
-    method public int indexOf(java.lang.Object);
-    method public void notifyArrayItemRangeChanged(int, int);
-    method public boolean remove(java.lang.Object);
-    method public int removeItems(int, int);
-    method public void replace(int, java.lang.Object);
-    method public int size();
-    method public java.util.List<E> unmodifiableList();
-  }
-
-  public class BaseCardView extends android.widget.FrameLayout {
-    ctor public BaseCardView(android.content.Context);
-    ctor public BaseCardView(android.content.Context, android.util.AttributeSet);
-    ctor public BaseCardView(android.content.Context, android.util.AttributeSet, int);
-    method public int getCardType();
-    method public int getExtraVisibility();
-    method public int getInfoVisibility();
-    method public boolean isSelectedAnimationDelayed();
-    method public void setCardType(int);
-    method public void setExtraVisibility(int);
-    method public void setInfoVisibility(int);
-    method public void setSelectedAnimationDelayed(boolean);
-    field public static final int CARD_REGION_VISIBLE_ACTIVATED = 1; // 0x1
-    field public static final int CARD_REGION_VISIBLE_ALWAYS = 0; // 0x0
-    field public static final int CARD_REGION_VISIBLE_SELECTED = 2; // 0x2
-    field public static final int CARD_TYPE_INFO_OVER = 1; // 0x1
-    field public static final int CARD_TYPE_INFO_UNDER = 2; // 0x2
-    field public static final int CARD_TYPE_INFO_UNDER_WITH_EXTRA = 3; // 0x3
-    field public static final int CARD_TYPE_MAIN_ONLY = 0; // 0x0
-  }
-
-  public static class BaseCardView.LayoutParams extends android.widget.FrameLayout.LayoutParams {
-    ctor public BaseCardView.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public BaseCardView.LayoutParams(int, int);
-    ctor public BaseCardView.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public BaseCardView.LayoutParams(android.support.v17.leanback.widget.BaseCardView.LayoutParams);
-    field public static final int VIEW_TYPE_EXTRA = 2; // 0x2
-    field public static final int VIEW_TYPE_INFO = 1; // 0x1
-    field public static final int VIEW_TYPE_MAIN = 0; // 0x0
-    field public int viewType;
-  }
-
-  public class BrowseFrameLayout extends android.widget.FrameLayout {
-    ctor public BrowseFrameLayout(android.content.Context);
-    ctor public BrowseFrameLayout(android.content.Context, android.util.AttributeSet);
-    ctor public BrowseFrameLayout(android.content.Context, android.util.AttributeSet, int);
-    method public android.support.v17.leanback.widget.BrowseFrameLayout.OnChildFocusListener getOnChildFocusListener();
-    method public android.support.v17.leanback.widget.BrowseFrameLayout.OnFocusSearchListener getOnFocusSearchListener();
-    method public void setOnChildFocusListener(android.support.v17.leanback.widget.BrowseFrameLayout.OnChildFocusListener);
-    method public void setOnFocusSearchListener(android.support.v17.leanback.widget.BrowseFrameLayout.OnFocusSearchListener);
-  }
-
-  public static abstract interface BrowseFrameLayout.OnChildFocusListener {
-    method public abstract void onRequestChildFocus(android.view.View, android.view.View);
-    method public abstract boolean onRequestFocusInDescendants(int, android.graphics.Rect);
-  }
-
-  public static abstract interface BrowseFrameLayout.OnFocusSearchListener {
-    method public abstract android.view.View onFocusSearch(android.view.View, int);
-  }
-
-  public final class ClassPresenterSelector extends android.support.v17.leanback.widget.PresenterSelector {
-    ctor public ClassPresenterSelector();
-    method public void addClassPresenter(java.lang.Class<?>, android.support.v17.leanback.widget.Presenter);
-    method public android.support.v17.leanback.widget.Presenter getPresenter(java.lang.Object);
-  }
-
-  public class ControlButtonPresenterSelector extends android.support.v17.leanback.widget.PresenterSelector {
-    ctor public ControlButtonPresenterSelector();
-    method public android.support.v17.leanback.widget.Presenter getPresenter(java.lang.Object);
-    method public android.support.v17.leanback.widget.Presenter getPrimaryPresenter();
-    method public android.support.v17.leanback.widget.Presenter getSecondaryPresenter();
-  }
-
-  public class CursorObjectAdapter extends android.support.v17.leanback.widget.ObjectAdapter {
-    ctor public CursorObjectAdapter(android.support.v17.leanback.widget.PresenterSelector);
-    ctor public CursorObjectAdapter(android.support.v17.leanback.widget.Presenter);
-    ctor public CursorObjectAdapter();
-    method public void changeCursor(android.database.Cursor);
-    method public void close();
-    method public java.lang.Object get(int);
-    method public final android.database.Cursor getCursor();
-    method public final android.support.v17.leanback.database.CursorMapper getMapper();
-    method protected final void invalidateCache(int);
-    method protected final void invalidateCache(int, int);
-    method public boolean isClosed();
-    method protected void onCursorChanged();
-    method protected void onMapperChanged();
-    method public final void setMapper(android.support.v17.leanback.database.CursorMapper);
-    method public int size();
-    method public android.database.Cursor swapCursor(android.database.Cursor);
-  }
-
-  public class DetailsOverviewLogoPresenter extends android.support.v17.leanback.widget.Presenter {
-    ctor public DetailsOverviewLogoPresenter();
-    method public boolean isBoundToImage(android.support.v17.leanback.widget.DetailsOverviewLogoPresenter.ViewHolder, android.support.v17.leanback.widget.DetailsOverviewRow);
-    method public void onBindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object);
-    method public android.support.v17.leanback.widget.Presenter.ViewHolder onCreateViewHolder(android.view.ViewGroup);
-    method public void onUnbindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public void setContext(android.support.v17.leanback.widget.DetailsOverviewLogoPresenter.ViewHolder, android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder, android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter);
-  }
-
-  public static class DetailsOverviewLogoPresenter.ViewHolder extends android.support.v17.leanback.widget.Presenter.ViewHolder {
-    ctor public DetailsOverviewLogoPresenter.ViewHolder(android.view.View);
-    field protected android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter mParentPresenter;
-    field protected android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder mParentViewHolder;
-  }
-
-  public class DetailsOverviewRow extends android.support.v17.leanback.widget.Row {
-    ctor public DetailsOverviewRow(java.lang.Object);
-    method public final deprecated void addAction(android.support.v17.leanback.widget.Action);
-    method public final deprecated void addAction(int, android.support.v17.leanback.widget.Action);
-    method public android.support.v17.leanback.widget.Action getActionForKeyCode(int);
-    method public final deprecated java.util.List<android.support.v17.leanback.widget.Action> getActions();
-    method public final android.support.v17.leanback.widget.ObjectAdapter getActionsAdapter();
-    method public final android.graphics.drawable.Drawable getImageDrawable();
-    method public final java.lang.Object getItem();
-    method public boolean isImageScaleUpAllowed();
-    method public final deprecated boolean removeAction(android.support.v17.leanback.widget.Action);
-    method public final void setActionsAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public final void setImageBitmap(android.content.Context, android.graphics.Bitmap);
-    method public final void setImageDrawable(android.graphics.drawable.Drawable);
-    method public void setImageScaleUpAllowed(boolean);
-    method public final void setItem(java.lang.Object);
-  }
-
-  public static class DetailsOverviewRow.Listener {
-    ctor public DetailsOverviewRow.Listener();
-    method public void onActionsAdapterChanged(android.support.v17.leanback.widget.DetailsOverviewRow);
-    method public void onImageDrawableChanged(android.support.v17.leanback.widget.DetailsOverviewRow);
-    method public void onItemChanged(android.support.v17.leanback.widget.DetailsOverviewRow);
-  }
-
-  public deprecated class DetailsOverviewRowPresenter extends android.support.v17.leanback.widget.RowPresenter {
-    ctor public DetailsOverviewRowPresenter(android.support.v17.leanback.widget.Presenter);
-    method protected android.support.v17.leanback.widget.RowPresenter.ViewHolder createRowViewHolder(android.view.ViewGroup);
-    method public int getBackgroundColor();
-    method public android.support.v17.leanback.widget.OnActionClickedListener getOnActionClickedListener();
-    method public boolean isStyleLarge();
-    method public final boolean isUsingDefaultSelectEffect();
-    method public void setBackgroundColor(int);
-    method public void setOnActionClickedListener(android.support.v17.leanback.widget.OnActionClickedListener);
-    method public final void setSharedElementEnterTransition(android.app.Activity, java.lang.String, long);
-    method public final void setSharedElementEnterTransition(android.app.Activity, java.lang.String);
-    method public void setStyleLarge(boolean);
-  }
-
-  public final class DetailsOverviewRowPresenter.ViewHolder extends android.support.v17.leanback.widget.RowPresenter.ViewHolder {
-    ctor public DetailsOverviewRowPresenter.ViewHolder(android.view.View, android.support.v17.leanback.widget.Presenter);
-    field public final android.support.v17.leanback.widget.Presenter.ViewHolder mDetailsDescriptionViewHolder;
-  }
-
-  public abstract interface FacetProvider {
-    method public abstract java.lang.Object getFacet(java.lang.Class<?>);
-  }
-
-  public abstract interface FacetProviderAdapter {
-    method public abstract android.support.v17.leanback.widget.FacetProvider getFacetProvider(int);
-  }
-
-  public abstract interface FocusHighlight {
-    field public static final int ZOOM_FACTOR_LARGE = 3; // 0x3
-    field public static final int ZOOM_FACTOR_MEDIUM = 2; // 0x2
-    field public static final int ZOOM_FACTOR_NONE = 0; // 0x0
-    field public static final int ZOOM_FACTOR_SMALL = 1; // 0x1
-    field public static final int ZOOM_FACTOR_XSMALL = 4; // 0x4
-  }
-
-  public class FocusHighlightHelper {
-    ctor public FocusHighlightHelper();
-    method public static void setupBrowseItemFocusHighlight(android.support.v17.leanback.widget.ItemBridgeAdapter, int, boolean);
-    method public static void setupHeaderItemFocusHighlight(android.support.v17.leanback.widget.VerticalGridView);
-  }
-
-  public abstract interface FragmentAnimationProvider {
-    method public abstract void onActivityEnter(java.util.List<android.animation.Animator>);
-    method public abstract void onActivityExit(java.util.List<android.animation.Animator>);
-    method public abstract void onFragmentEnter(java.util.List<android.animation.Animator>);
-    method public abstract void onFragmentExit(java.util.List<android.animation.Animator>);
-    method public abstract void onFragmentReenter(java.util.List<android.animation.Animator>);
-    method public abstract void onFragmentReturn(java.util.List<android.animation.Animator>);
-  }
-
-  public class FullWidthDetailsOverviewRowPresenter extends android.support.v17.leanback.widget.RowPresenter {
-    ctor public FullWidthDetailsOverviewRowPresenter(android.support.v17.leanback.widget.Presenter);
-    ctor public FullWidthDetailsOverviewRowPresenter(android.support.v17.leanback.widget.Presenter, android.support.v17.leanback.widget.DetailsOverviewLogoPresenter);
-    method protected android.support.v17.leanback.widget.RowPresenter.ViewHolder createRowViewHolder(android.view.ViewGroup);
-    method public int getBackgroundColor();
-    method public final int getInitialState();
-    method protected int getLayoutResourceId();
-    method public android.support.v17.leanback.widget.OnActionClickedListener getOnActionClickedListener();
-    method public final boolean isParticipatingEntranceTransition();
-    method public final boolean isUsingDefaultSelectEffect();
-    method public final void notifyOnBindLogo(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder);
-    method protected void onLayoutLogo(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder, int, boolean);
-    method protected void onLayoutOverviewFrame(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder, int, boolean);
-    method protected void onStateChanged(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder, int);
-    method public void setBackgroundColor(int);
-    method public final void setInitialState(int);
-    method public final void setListener(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.Listener);
-    method public void setOnActionClickedListener(android.support.v17.leanback.widget.OnActionClickedListener);
-    method public final void setParticipatingEntranceTransition(boolean);
-    method public final void setState(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder, int);
-    field public static final int STATE_FULL = 1; // 0x1
-    field public static final int STATE_HALF = 0; // 0x0
-    field public static final int STATE_SMALL = 2; // 0x2
-    field protected int mInitialState;
-  }
-
-  public static abstract class FullWidthDetailsOverviewRowPresenter.Listener {
-    ctor public FullWidthDetailsOverviewRowPresenter.Listener();
-    method public void onBindLogo(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder);
-  }
-
-  public class FullWidthDetailsOverviewRowPresenter.ViewHolder extends android.support.v17.leanback.widget.RowPresenter.ViewHolder {
-    ctor public FullWidthDetailsOverviewRowPresenter.ViewHolder(android.view.View, android.support.v17.leanback.widget.Presenter, android.support.v17.leanback.widget.DetailsOverviewLogoPresenter);
-    method protected android.support.v17.leanback.widget.DetailsOverviewRow.Listener createRowListener();
-    method public final android.view.ViewGroup getActionsRow();
-    method public final android.view.ViewGroup getDetailsDescriptionFrame();
-    method public final android.support.v17.leanback.widget.Presenter.ViewHolder getDetailsDescriptionViewHolder();
-    method public final android.support.v17.leanback.widget.DetailsOverviewLogoPresenter.ViewHolder getLogoViewHolder();
-    method public final android.view.ViewGroup getOverviewView();
-    method public final int getState();
-    field protected final android.os.Handler mHandler;
-    field protected final android.support.v17.leanback.widget.DetailsOverviewRow.Listener mRowListener;
-  }
-
-  public class FullWidthDetailsOverviewRowPresenter.ViewHolder.DetailsOverviewRowListener extends android.support.v17.leanback.widget.DetailsOverviewRow.Listener {
-    ctor public FullWidthDetailsOverviewRowPresenter.ViewHolder.DetailsOverviewRowListener();
-  }
-
-  public class FullWidthDetailsOverviewSharedElementHelper extends android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.Listener {
-    ctor public FullWidthDetailsOverviewSharedElementHelper();
-    method public boolean getAutoStartSharedElementTransition();
-    method public void setAutoStartSharedElementTransition(boolean);
-    method public void setSharedElementEnterTransition(android.app.Activity, java.lang.String);
-    method public void setSharedElementEnterTransition(android.app.Activity, java.lang.String, long);
-    method public void startPostponedEnterTransition();
-  }
-
-  public class GuidanceStylist implements android.support.v17.leanback.widget.FragmentAnimationProvider {
-    ctor public GuidanceStylist();
-    method public android.widget.TextView getBreadcrumbView();
-    method public android.widget.TextView getDescriptionView();
-    method public android.widget.ImageView getIconView();
-    method public android.widget.TextView getTitleView();
-    method public void onActivityEnter(java.util.List<android.animation.Animator>);
-    method public void onActivityExit(java.util.List<android.animation.Animator>);
-    method public android.view.View onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.support.v17.leanback.widget.GuidanceStylist.Guidance);
-    method public void onFragmentEnter(java.util.List<android.animation.Animator>);
-    method public void onFragmentExit(java.util.List<android.animation.Animator>);
-    method public void onFragmentReenter(java.util.List<android.animation.Animator>);
-    method public void onFragmentReturn(java.util.List<android.animation.Animator>);
-    method public int onProvideLayoutId();
-  }
-
-  public static class GuidanceStylist.Guidance {
-    ctor public GuidanceStylist.Guidance(java.lang.String, java.lang.String, java.lang.String, android.graphics.drawable.Drawable);
-    method public java.lang.String getBreadcrumb();
-    method public java.lang.String getDescription();
-    method public android.graphics.drawable.Drawable getIconDrawable();
-    method public java.lang.String getTitle();
-  }
-
-  public class GuidedAction extends android.support.v17.leanback.widget.Action {
-    method public int getCheckSetId();
-    method public java.lang.CharSequence getDescription();
-    method public android.content.Intent getIntent();
-    method public java.lang.CharSequence getTitle();
-    method public boolean hasMultilineDescription();
-    method public boolean hasNext();
-    method public boolean infoOnly();
-    method public boolean isChecked();
-    method public boolean isEnabled();
-    method public void setChecked(boolean);
-    method public void setEnabled(boolean);
-    field public static final int DEFAULT_CHECK_SET_ID = 1; // 0x1
-    field public static final int NO_CHECK_SET = 0; // 0x0
-    field public static final int NO_DRAWABLE = 0; // 0x0
-  }
-
-  public static class GuidedAction.Builder {
-    ctor public GuidedAction.Builder();
-    method public android.support.v17.leanback.widget.GuidedAction build();
-    method public android.support.v17.leanback.widget.GuidedAction.Builder checkSetId(int);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder checked(boolean);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder description(java.lang.String);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder enabled(boolean);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder hasNext(boolean);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder icon(android.graphics.drawable.Drawable);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder iconResourceId(int, android.content.Context);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder id(long);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder infoOnly(boolean);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder intent(android.content.Intent);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder multilineDescription(boolean);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder title(java.lang.String);
-  }
-
-  public class GuidedActionsStylist implements android.support.v17.leanback.widget.FragmentAnimationProvider {
-    ctor public GuidedActionsStylist();
-    method public android.support.v17.leanback.widget.VerticalGridView getActionsGridView();
-    method public void onActivityEnter(java.util.List<android.animation.Animator>);
-    method public void onActivityExit(java.util.List<android.animation.Animator>);
-    method public void onAnimateItemChecked(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, boolean);
-    method public void onAnimateItemFocused(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, boolean);
-    method public void onAnimateItemPressed(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, boolean);
-    method public void onBindViewHolder(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, android.support.v17.leanback.widget.GuidedAction);
-    method public android.view.View onCreateView(android.view.LayoutInflater, android.view.ViewGroup);
-    method public android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder onCreateViewHolder(android.view.ViewGroup);
-    method public void onFragmentEnter(java.util.List<android.animation.Animator>);
-    method public void onFragmentExit(java.util.List<android.animation.Animator>);
-    method public void onFragmentReenter(java.util.List<android.animation.Animator>);
-    method public void onFragmentReturn(java.util.List<android.animation.Animator>);
-    method public int onProvideItemLayoutId();
-    method public int onProvideLayoutId();
-    field protected android.support.v17.leanback.widget.VerticalGridView mActionsGridView;
-    field protected android.view.View mMainView;
-    field protected android.view.View mSelectorView;
-  }
-
-  public static class GuidedActionsStylist.ViewHolder {
-    ctor public GuidedActionsStylist.ViewHolder(android.view.View);
-    method public android.widget.ImageView getCheckmarkView();
-    method public android.widget.ImageView getChevronView();
-    method public android.view.View getContentView();
-    method public android.widget.TextView getDescriptionView();
-    method public android.widget.ImageView getIconView();
-    method public android.widget.TextView getTitleView();
-    field public final android.view.View view;
-  }
-
-  public class HeaderItem {
-    ctor public HeaderItem(long, java.lang.String);
-    ctor public HeaderItem(java.lang.String);
-    method public final long getId();
-    method public final java.lang.String getName();
-  }
-
-  public class HorizontalGridView extends android.support.v7.widget.RecyclerView {
-    ctor public HorizontalGridView(android.content.Context);
-    ctor public HorizontalGridView(android.content.Context, android.util.AttributeSet);
-    ctor public HorizontalGridView(android.content.Context, android.util.AttributeSet, int);
-    method public final boolean getFadingLeftEdge();
-    method public final int getFadingLeftEdgeLength();
-    method public final int getFadingLeftEdgeOffset();
-    method public final boolean getFadingRightEdge();
-    method public final int getFadingRightEdgeLength();
-    method public final int getFadingRightEdgeOffset();
-    method protected void initAttributes(android.content.Context, android.util.AttributeSet);
-    method public final void setFadingLeftEdge(boolean);
-    method public final void setFadingLeftEdgeLength(int);
-    method public final void setFadingLeftEdgeOffset(int);
-    method public final void setFadingRightEdge(boolean);
-    method public final void setFadingRightEdgeLength(int);
-    method public final void setFadingRightEdgeOffset(int);
-    method public void setNumRows(int);
-    method public void setRowHeight(int);
-  }
-
-  public final class HorizontalHoverCardSwitcher extends android.support.v17.leanback.widget.PresenterSwitcher {
-    ctor public HorizontalHoverCardSwitcher();
-    method protected void insertView(android.view.View);
-    method public void select(android.support.v17.leanback.widget.HorizontalGridView, android.view.View, java.lang.Object);
-  }
-
-  public class ImageCardView extends android.support.v17.leanback.widget.BaseCardView {
-    ctor public ImageCardView(android.content.Context);
-    ctor public ImageCardView(android.content.Context, android.util.AttributeSet);
-    ctor public ImageCardView(android.content.Context, android.util.AttributeSet, int);
-    method public android.graphics.drawable.Drawable getBadgeImage();
-    method public java.lang.CharSequence getContentText();
-    method public android.graphics.drawable.Drawable getInfoAreaBackground();
-    method public android.graphics.drawable.Drawable getMainImage();
-    method public final android.widget.ImageView getMainImageView();
-    method public java.lang.CharSequence getTitleText();
-    method public void setBadgeImage(android.graphics.drawable.Drawable);
-    method public void setContentText(java.lang.CharSequence);
-    method public void setInfoAreaBackground(android.graphics.drawable.Drawable);
-    method public void setInfoAreaBackgroundColor(int);
-    method public void setMainImage(android.graphics.drawable.Drawable);
-    method public void setMainImage(android.graphics.drawable.Drawable, boolean);
-    method public void setMainImageAdjustViewBounds(boolean);
-    method public void setMainImageDimensions(int, int);
-    method public void setMainImageScaleType(android.widget.ImageView.ScaleType);
-    method public void setTitleText(java.lang.CharSequence);
-  }
-
-  public final class ItemAlignmentFacet {
-    ctor public ItemAlignmentFacet();
-    method public android.support.v17.leanback.widget.ItemAlignmentFacet.ItemAlignmentDef[] getAlignmentDefs();
-    method public boolean isMultiAlignment();
-    method public void setAlignmentDefs(android.support.v17.leanback.widget.ItemAlignmentFacet.ItemAlignmentDef[]);
-    field public static final float ITEM_ALIGN_OFFSET_PERCENT_DISABLED = -1.0f;
-  }
-
-  public static class ItemAlignmentFacet.ItemAlignmentDef {
-    ctor public ItemAlignmentFacet.ItemAlignmentDef();
-    method public final int getItemAlignmentFocusViewId();
-    method public final int getItemAlignmentOffset();
-    method public final float getItemAlignmentOffsetPercent();
-    method public final int getItemAlignmentViewId();
-    method public final boolean isItemAlignmentOffsetWithPadding();
-    method public final void setItemAlignmentFocusViewId(int);
-    method public final void setItemAlignmentOffset(int);
-    method public final void setItemAlignmentOffsetPercent(float);
-    method public final void setItemAlignmentOffsetWithPadding(boolean);
-    method public final void setItemAlignmentViewId(int);
-  }
-
-  public class ItemBridgeAdapter extends android.support.v7.widget.RecyclerView.Adapter implements android.support.v17.leanback.widget.FacetProviderAdapter {
-    ctor public ItemBridgeAdapter(android.support.v17.leanback.widget.ObjectAdapter, android.support.v17.leanback.widget.PresenterSelector);
-    ctor public ItemBridgeAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    ctor public ItemBridgeAdapter();
-    method public void clear();
-    method public android.support.v17.leanback.widget.FacetProvider getFacetProvider(int);
-    method public int getItemCount();
-    method public java.util.ArrayList<android.support.v17.leanback.widget.Presenter> getPresenterMapper();
-    method public android.support.v17.leanback.widget.ItemBridgeAdapter.Wrapper getWrapper();
-    method protected void onAddPresenter(android.support.v17.leanback.widget.Presenter, int);
-    method protected void onAttachedToWindow(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
-    method protected void onBind(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
-    method public final void onBindViewHolder(android.support.v7.widget.RecyclerView.ViewHolder, int);
-    method protected void onCreate(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
-    method public final android.support.v7.widget.RecyclerView.ViewHolder onCreateViewHolder(android.view.ViewGroup, int);
-    method protected void onDetachedFromWindow(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
-    method protected void onUnbind(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
-    method public final void onViewAttachedToWindow(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public final void onViewDetachedFromWindow(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public final void onViewRecycled(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public void setAdapterListener(android.support.v17.leanback.widget.ItemBridgeAdapter.AdapterListener);
-    method public void setPresenterMapper(java.util.ArrayList<android.support.v17.leanback.widget.Presenter>);
-    method public void setWrapper(android.support.v17.leanback.widget.ItemBridgeAdapter.Wrapper);
-  }
-
-  public static class ItemBridgeAdapter.AdapterListener {
-    ctor public ItemBridgeAdapter.AdapterListener();
-    method public void onAddPresenter(android.support.v17.leanback.widget.Presenter, int);
-    method public void onAttachedToWindow(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
-    method public void onBind(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
-    method public void onCreate(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
-    method public void onDetachedFromWindow(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
-    method public void onUnbind(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
-  }
-
-  public class ItemBridgeAdapter.ViewHolder extends android.support.v7.widget.RecyclerView.ViewHolder implements android.support.v17.leanback.widget.FacetProvider {
-    method public final java.lang.Object getExtraObject();
-    method public java.lang.Object getFacet(java.lang.Class<?>);
-    method public final java.lang.Object getItem();
-    method public final android.support.v17.leanback.widget.Presenter getPresenter();
-    method public final android.support.v17.leanback.widget.Presenter.ViewHolder getViewHolder();
-    method public void setExtraObject(java.lang.Object);
-  }
-
-  public static abstract class ItemBridgeAdapter.Wrapper {
-    ctor public ItemBridgeAdapter.Wrapper();
-    method public abstract android.view.View createWrapper(android.view.View);
-    method public abstract void wrap(android.view.View, android.view.View);
-  }
-
-  public class ListRow extends android.support.v17.leanback.widget.Row {
-    ctor public ListRow(android.support.v17.leanback.widget.HeaderItem, android.support.v17.leanback.widget.ObjectAdapter);
-    ctor public ListRow(long, android.support.v17.leanback.widget.HeaderItem, android.support.v17.leanback.widget.ObjectAdapter);
-    ctor public ListRow(android.support.v17.leanback.widget.ObjectAdapter);
-    method public final android.support.v17.leanback.widget.ObjectAdapter getAdapter();
-  }
-
-  public final class ListRowHoverCardView extends android.widget.LinearLayout {
-    ctor public ListRowHoverCardView(android.content.Context);
-    ctor public ListRowHoverCardView(android.content.Context, android.util.AttributeSet);
-    ctor public ListRowHoverCardView(android.content.Context, android.util.AttributeSet, int);
-    method public final java.lang.CharSequence getDescription();
-    method public final java.lang.CharSequence getTitle();
-    method public final void setDescription(java.lang.CharSequence);
-    method public final void setTitle(java.lang.CharSequence);
-  }
-
-  public class ListRowPresenter extends android.support.v17.leanback.widget.RowPresenter {
-    ctor public ListRowPresenter();
-    ctor public ListRowPresenter(int);
-    ctor public ListRowPresenter(int, boolean);
-    method public final boolean areChildRoundedCornersEnabled();
-    method protected android.support.v17.leanback.widget.RowPresenter.ViewHolder createRowViewHolder(android.view.ViewGroup);
-    method public final void enableChildRoundedCorners(boolean);
-    method public int getExpandedRowHeight();
-    method public final int getFocusZoomFactor();
-    method public final android.support.v17.leanback.widget.PresenterSelector getHoverCardPresenterSelector();
-    method public int getRecycledPoolSize(android.support.v17.leanback.widget.Presenter);
-    method public int getRowHeight();
-    method public final boolean getShadowEnabled();
-    method public final deprecated int getZoomFactor();
-    method public final boolean isFocusDimmerUsed();
-    method public boolean isUsingDefaultListSelectEffect();
-    method public final boolean isUsingDefaultSelectEffect();
-    method public boolean isUsingDefaultShadow();
-    method public boolean isUsingZOrder(android.content.Context);
-    method public void setExpandedRowHeight(int);
-    method public final void setHoverCardPresenterSelector(android.support.v17.leanback.widget.PresenterSelector);
-    method public void setRecycledPoolSize(android.support.v17.leanback.widget.Presenter, int);
-    method public void setRowHeight(int);
-    method public final void setShadowEnabled(boolean);
-  }
-
-  public static class ListRowPresenter.ViewHolder extends android.support.v17.leanback.widget.RowPresenter.ViewHolder {
-    ctor public ListRowPresenter.ViewHolder(android.view.View, android.support.v17.leanback.widget.HorizontalGridView, android.support.v17.leanback.widget.ListRowPresenter);
-    method public final android.support.v17.leanback.widget.ItemBridgeAdapter getBridgeAdapter();
-    method public final android.support.v17.leanback.widget.HorizontalGridView getGridView();
-    method public final android.support.v17.leanback.widget.ListRowPresenter getListRowPresenter();
-  }
-
-  public final class ListRowView extends android.widget.LinearLayout {
-    ctor public ListRowView(android.content.Context);
-    ctor public ListRowView(android.content.Context, android.util.AttributeSet);
-    ctor public ListRowView(android.content.Context, android.util.AttributeSet, int);
-    method public android.support.v17.leanback.widget.HorizontalGridView getGridView();
-  }
-
-  public abstract class ObjectAdapter {
-    ctor public ObjectAdapter(android.support.v17.leanback.widget.PresenterSelector);
-    ctor public ObjectAdapter(android.support.v17.leanback.widget.Presenter);
-    ctor public ObjectAdapter();
-    method public abstract java.lang.Object get(int);
-    method public long getId(int);
-    method public final android.support.v17.leanback.widget.Presenter getPresenter(java.lang.Object);
-    method public final android.support.v17.leanback.widget.PresenterSelector getPresenterSelector();
-    method public final boolean hasStableIds();
-    method protected final void notifyChanged();
-    method protected final void notifyItemRangeChanged(int, int);
-    method protected final void notifyItemRangeInserted(int, int);
-    method protected final void notifyItemRangeRemoved(int, int);
-    method protected void onHasStableIdsChanged();
-    method protected void onPresenterSelectorChanged();
-    method public final void registerObserver(android.support.v17.leanback.widget.ObjectAdapter.DataObserver);
-    method public final void setHasStableIds(boolean);
-    method public final void setPresenterSelector(android.support.v17.leanback.widget.PresenterSelector);
-    method public abstract int size();
-    method public final void unregisterAllObservers();
-    method public final void unregisterObserver(android.support.v17.leanback.widget.ObjectAdapter.DataObserver);
-    field public static final int NO_ID = -1; // 0xffffffff
-  }
-
-  public static abstract class ObjectAdapter.DataObserver {
-    ctor public ObjectAdapter.DataObserver();
-    method public void onChanged();
-    method public void onItemRangeChanged(int, int);
-    method public void onItemRangeInserted(int, int);
-    method public void onItemRangeRemoved(int, int);
-  }
-
-  public abstract interface OnActionClickedListener {
-    method public abstract void onActionClicked(android.support.v17.leanback.widget.Action);
-  }
-
-  public abstract interface OnChildLaidOutListener {
-    method public abstract void onChildLaidOut(android.view.ViewGroup, android.view.View, int, long);
-  }
-
-  public abstract deprecated interface OnChildSelectedListener {
-    method public abstract void onChildSelected(android.view.ViewGroup, android.view.View, int, long);
-  }
-
-  public abstract class OnChildViewHolderSelectedListener {
-    ctor public OnChildViewHolderSelectedListener();
-    method public void onChildViewHolderSelected(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder, int, int);
-  }
-
-  public abstract interface OnItemViewClickedListener {
-    method public abstract void onItemClicked(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object, android.support.v17.leanback.widget.RowPresenter.ViewHolder, android.support.v17.leanback.widget.Row);
-  }
-
-  public abstract interface OnItemViewSelectedListener {
-    method public abstract void onItemSelected(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object, android.support.v17.leanback.widget.RowPresenter.ViewHolder, android.support.v17.leanback.widget.Row);
-  }
-
-  public class PlaybackControlsRow extends android.support.v17.leanback.widget.Row {
-    ctor public PlaybackControlsRow(java.lang.Object);
-    ctor public PlaybackControlsRow();
-    method public android.support.v17.leanback.widget.Action getActionForKeyCode(int);
-    method public android.support.v17.leanback.widget.Action getActionForKeyCode(android.support.v17.leanback.widget.ObjectAdapter, int);
-    method public int getBufferedProgress();
-    method public int getCurrentTime();
-    method public final android.graphics.drawable.Drawable getImageDrawable();
-    method public final java.lang.Object getItem();
-    method public final android.support.v17.leanback.widget.ObjectAdapter getPrimaryActionsAdapter();
-    method public final android.support.v17.leanback.widget.ObjectAdapter getSecondaryActionsAdapter();
-    method public int getTotalTime();
-    method public void setBufferedProgress(int);
-    method public void setCurrentTime(int);
-    method public final void setImageBitmap(android.content.Context, android.graphics.Bitmap);
-    method public final void setImageDrawable(android.graphics.drawable.Drawable);
-    method public final void setPrimaryActionsAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public final void setSecondaryActionsAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public void setTotalTime(int);
-  }
-
-  public static class PlaybackControlsRow.ClosedCaptioningAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
-    ctor public PlaybackControlsRow.ClosedCaptioningAction(android.content.Context);
-    ctor public PlaybackControlsRow.ClosedCaptioningAction(android.content.Context, int);
-    field public static int OFF;
-    field public static int ON;
-  }
-
-  public static class PlaybackControlsRow.FastForwardAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
-    ctor public PlaybackControlsRow.FastForwardAction(android.content.Context);
-    ctor public PlaybackControlsRow.FastForwardAction(android.content.Context, int);
-  }
-
-  public static class PlaybackControlsRow.HighQualityAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
-    ctor public PlaybackControlsRow.HighQualityAction(android.content.Context);
-    ctor public PlaybackControlsRow.HighQualityAction(android.content.Context, int);
-    field public static int OFF;
-    field public static int ON;
-  }
-
-  public static class PlaybackControlsRow.MoreActions extends android.support.v17.leanback.widget.Action {
-    ctor public PlaybackControlsRow.MoreActions(android.content.Context);
-  }
-
-  public static abstract class PlaybackControlsRow.MultiAction extends android.support.v17.leanback.widget.Action {
-    ctor public PlaybackControlsRow.MultiAction(int);
-    method public int getActionCount();
-    method public android.graphics.drawable.Drawable getDrawable(int);
-    method public int getIndex();
-    method public java.lang.String getLabel(int);
-    method public java.lang.String getSecondaryLabel(int);
-    method public void nextIndex();
-    method public void setDrawables(android.graphics.drawable.Drawable[]);
-    method public void setIndex(int);
-    method public void setLabels(java.lang.String[]);
-    method public void setSecondaryLabels(java.lang.String[]);
-  }
-
-  public static class PlaybackControlsRow.PlayPauseAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
-    ctor public PlaybackControlsRow.PlayPauseAction(android.content.Context);
-    field public static int PAUSE;
-    field public static int PLAY;
-  }
-
-  public static class PlaybackControlsRow.RepeatAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
-    ctor public PlaybackControlsRow.RepeatAction(android.content.Context);
-    ctor public PlaybackControlsRow.RepeatAction(android.content.Context, int);
-    ctor public PlaybackControlsRow.RepeatAction(android.content.Context, int, int);
-    field public static int ALL;
-    field public static int NONE;
-    field public static int ONE;
-  }
-
-  public static class PlaybackControlsRow.RewindAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
-    ctor public PlaybackControlsRow.RewindAction(android.content.Context);
-    ctor public PlaybackControlsRow.RewindAction(android.content.Context, int);
-  }
-
-  public static class PlaybackControlsRow.ShuffleAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
-    ctor public PlaybackControlsRow.ShuffleAction(android.content.Context);
-    ctor public PlaybackControlsRow.ShuffleAction(android.content.Context, int);
-    field public static int OFF;
-    field public static int ON;
-  }
-
-  public static class PlaybackControlsRow.SkipNextAction extends android.support.v17.leanback.widget.Action {
-    ctor public PlaybackControlsRow.SkipNextAction(android.content.Context);
-  }
-
-  public static class PlaybackControlsRow.SkipPreviousAction extends android.support.v17.leanback.widget.Action {
-    ctor public PlaybackControlsRow.SkipPreviousAction(android.content.Context);
-  }
-
-  public static abstract class PlaybackControlsRow.ThumbsAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
-    ctor public PlaybackControlsRow.ThumbsAction(int, android.content.Context, int, int);
-    field public static int OUTLINE;
-    field public static int SOLID;
-  }
-
-  public static class PlaybackControlsRow.ThumbsDownAction extends android.support.v17.leanback.widget.PlaybackControlsRow.ThumbsAction {
-    ctor public PlaybackControlsRow.ThumbsDownAction(android.content.Context);
-  }
-
-  public static class PlaybackControlsRow.ThumbsUpAction extends android.support.v17.leanback.widget.PlaybackControlsRow.ThumbsAction {
-    ctor public PlaybackControlsRow.ThumbsUpAction(android.content.Context);
-  }
-
-  public class PlaybackControlsRowPresenter extends android.support.v17.leanback.widget.RowPresenter {
-    ctor public PlaybackControlsRowPresenter(android.support.v17.leanback.widget.Presenter);
-    ctor public PlaybackControlsRowPresenter();
-    method public boolean areSecondaryActionsHidden();
-    method protected android.support.v17.leanback.widget.RowPresenter.ViewHolder createRowViewHolder(android.view.ViewGroup);
-    method public int getBackgroundColor();
-    method public android.support.v17.leanback.widget.OnActionClickedListener getOnActionClickedListener();
-    method public int getProgressColor();
-    method public void setBackgroundColor(int);
-    method public void setOnActionClickedListener(android.support.v17.leanback.widget.OnActionClickedListener);
-    method public void setProgressColor(int);
-    method public void setSecondaryActionsHidden(boolean);
-    method public void showBottomSpace(android.support.v17.leanback.widget.PlaybackControlsRowPresenter.ViewHolder, boolean);
-    method public void showPrimaryActions(android.support.v17.leanback.widget.PlaybackControlsRowPresenter.ViewHolder);
-  }
-
-  public class PlaybackControlsRowPresenter.ViewHolder extends android.support.v17.leanback.widget.RowPresenter.ViewHolder {
-    field public final android.support.v17.leanback.widget.Presenter.ViewHolder mDescriptionViewHolder;
-  }
-
-  public abstract class Presenter implements android.support.v17.leanback.widget.FacetProvider {
-    ctor public Presenter();
-    method protected static void cancelAnimationsRecursive(android.view.View);
-    method public final java.lang.Object getFacet(java.lang.Class<?>);
-    method public abstract void onBindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object);
-    method public abstract android.support.v17.leanback.widget.Presenter.ViewHolder onCreateViewHolder(android.view.ViewGroup);
-    method public abstract void onUnbindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public void onViewAttachedToWindow(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public void onViewDetachedFromWindow(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public final void setFacet(java.lang.Class<?>, java.lang.Object);
-    method public void setOnClickListener(android.support.v17.leanback.widget.Presenter.ViewHolder, android.view.View.OnClickListener);
-  }
-
-  public static class Presenter.ViewHolder implements android.support.v17.leanback.widget.FacetProvider {
-    ctor public Presenter.ViewHolder(android.view.View);
-    method public final java.lang.Object getFacet(java.lang.Class<?>);
-    method public final void setFacet(java.lang.Class<?>, java.lang.Object);
-    field public final android.view.View view;
-  }
-
-  public abstract class PresenterSelector {
-    ctor public PresenterSelector();
-    method public abstract android.support.v17.leanback.widget.Presenter getPresenter(java.lang.Object);
-    method public android.support.v17.leanback.widget.Presenter[] getPresenters();
-  }
-
-  public abstract class PresenterSwitcher {
-    ctor public PresenterSwitcher();
-    method public void clear();
-    method public final android.view.ViewGroup getParentViewGroup();
-    method public void init(android.view.ViewGroup, android.support.v17.leanback.widget.PresenterSelector);
-    method protected abstract void insertView(android.view.View);
-    method protected void onViewSelected(android.view.View);
-    method public void select(java.lang.Object);
-    method protected void showView(android.view.View, boolean);
-    method public void unselect();
-  }
-
-  public class Row {
-    ctor public Row(long, android.support.v17.leanback.widget.HeaderItem);
-    ctor public Row(android.support.v17.leanback.widget.HeaderItem);
-    ctor public Row();
-    method public final android.support.v17.leanback.widget.HeaderItem getHeaderItem();
-    method public final long getId();
-    method public final void setHeaderItem(android.support.v17.leanback.widget.HeaderItem);
-    method public final void setId(long);
-  }
-
-  public class RowHeaderPresenter extends android.support.v17.leanback.widget.Presenter {
-    ctor public RowHeaderPresenter();
-    method protected static float getFontDescent(android.widget.TextView, android.graphics.Paint);
-    method public int getSpaceUnderBaseline(android.support.v17.leanback.widget.RowHeaderPresenter.ViewHolder);
-    method public boolean isNullItemVisibilityGone();
-    method public void onBindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object);
-    method public android.support.v17.leanback.widget.Presenter.ViewHolder onCreateViewHolder(android.view.ViewGroup);
-    method protected void onSelectLevelChanged(android.support.v17.leanback.widget.RowHeaderPresenter.ViewHolder);
-    method public void onUnbindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public void setNullItemVisibilityGone(boolean);
-    method public final void setSelectLevel(android.support.v17.leanback.widget.RowHeaderPresenter.ViewHolder, float);
-  }
-
-  public static class RowHeaderPresenter.ViewHolder extends android.support.v17.leanback.widget.Presenter.ViewHolder {
-    ctor public RowHeaderPresenter.ViewHolder(android.view.View);
-    method public final float getSelectLevel();
-  }
-
-  public final class RowHeaderView extends android.widget.TextView {
-    ctor public RowHeaderView(android.content.Context);
-    ctor public RowHeaderView(android.content.Context, android.util.AttributeSet);
-    ctor public RowHeaderView(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public abstract class RowPresenter extends android.support.v17.leanback.widget.Presenter {
-    ctor public RowPresenter();
-    method public boolean canDrawOutOfBounds();
-    method protected abstract android.support.v17.leanback.widget.RowPresenter.ViewHolder createRowViewHolder(android.view.ViewGroup);
-    method protected void dispatchItemSelectedListener(android.support.v17.leanback.widget.RowPresenter.ViewHolder, boolean);
-    method public void freeze(android.support.v17.leanback.widget.RowPresenter.ViewHolder, boolean);
-    method public final android.support.v17.leanback.widget.RowHeaderPresenter getHeaderPresenter();
-    method public final android.support.v17.leanback.widget.RowPresenter.ViewHolder getRowViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public final boolean getSelectEffectEnabled();
-    method public final float getSelectLevel(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public final int getSyncActivatePolicy();
-    method protected void initializeRowViewHolder(android.support.v17.leanback.widget.RowPresenter.ViewHolder);
-    method protected boolean isClippingChildren();
-    method public boolean isUsingDefaultSelectEffect();
-    method protected void onBindRowViewHolder(android.support.v17.leanback.widget.RowPresenter.ViewHolder, java.lang.Object);
-    method public final void onBindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object);
-    method public final android.support.v17.leanback.widget.Presenter.ViewHolder onCreateViewHolder(android.view.ViewGroup);
-    method protected void onRowViewAttachedToWindow(android.support.v17.leanback.widget.RowPresenter.ViewHolder);
-    method protected void onRowViewDetachedFromWindow(android.support.v17.leanback.widget.RowPresenter.ViewHolder);
-    method protected void onRowViewExpanded(android.support.v17.leanback.widget.RowPresenter.ViewHolder, boolean);
-    method protected void onRowViewSelected(android.support.v17.leanback.widget.RowPresenter.ViewHolder, boolean);
-    method protected void onSelectLevelChanged(android.support.v17.leanback.widget.RowPresenter.ViewHolder);
-    method protected void onUnbindRowViewHolder(android.support.v17.leanback.widget.RowPresenter.ViewHolder);
-    method public final void onUnbindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public final void onViewAttachedToWindow(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public final void onViewDetachedFromWindow(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public void setEntranceTransitionState(android.support.v17.leanback.widget.RowPresenter.ViewHolder, boolean);
-    method public final void setHeaderPresenter(android.support.v17.leanback.widget.RowHeaderPresenter);
-    method public final void setRowViewExpanded(android.support.v17.leanback.widget.Presenter.ViewHolder, boolean);
-    method public final void setRowViewSelected(android.support.v17.leanback.widget.Presenter.ViewHolder, boolean);
-    method public final void setSelectEffectEnabled(boolean);
-    method public final void setSelectLevel(android.support.v17.leanback.widget.Presenter.ViewHolder, float);
-    method public final void setSyncActivatePolicy(int);
-    field public static final int SYNC_ACTIVATED_CUSTOM = 0; // 0x0
-    field public static final int SYNC_ACTIVATED_TO_EXPANDED = 1; // 0x1
-    field public static final int SYNC_ACTIVATED_TO_EXPANDED_AND_SELECTED = 3; // 0x3
-    field public static final int SYNC_ACTIVATED_TO_SELECTED = 2; // 0x2
-  }
-
-  public static class RowPresenter.ViewHolder extends android.support.v17.leanback.widget.Presenter.ViewHolder {
-    ctor public RowPresenter.ViewHolder(android.view.View);
-    method public final android.support.v17.leanback.widget.RowHeaderPresenter.ViewHolder getHeaderViewHolder();
-    method public final android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public final android.support.v17.leanback.widget.OnItemViewSelectedListener getOnItemViewSelectedListener();
-    method public android.view.View.OnKeyListener getOnKeyListener();
-    method public final android.support.v17.leanback.widget.Row getRow();
-    method public final float getSelectLevel();
-    method public final boolean isExpanded();
-    method public final boolean isSelected();
-    method public final void setActivated(boolean);
-    method public final void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public final void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public void setOnKeyListener(android.view.View.OnKeyListener);
-    method public final void syncActivatedStatus(android.view.View);
-    field protected final android.support.v17.leanback.graphics.ColorOverlayDimmer mColorDimmer;
-  }
-
-  public class SearchBar extends android.widget.RelativeLayout {
-    ctor public SearchBar(android.content.Context);
-    ctor public SearchBar(android.content.Context, android.util.AttributeSet);
-    ctor public SearchBar(android.content.Context, android.util.AttributeSet, int);
-    method public void displayCompletions(java.util.List<java.lang.String>);
-    method public android.graphics.drawable.Drawable getBadgeDrawable();
-    method public java.lang.CharSequence getHint();
-    method public java.lang.String getTitle();
-    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
-    method public void setSearchBarListener(android.support.v17.leanback.widget.SearchBar.SearchBarListener);
-    method public void setSearchQuery(java.lang.String);
-    method public void setSpeechRecognitionCallback(android.support.v17.leanback.widget.SpeechRecognitionCallback);
-    method public void setSpeechRecognizer(android.speech.SpeechRecognizer);
-    method public void setTitle(java.lang.String);
-    method public void startRecognition();
-    method public void stopRecognition();
-  }
-
-  public static abstract interface SearchBar.SearchBarListener {
-    method public abstract void onKeyboardDismiss(java.lang.String);
-    method public abstract void onSearchQueryChange(java.lang.String);
-    method public abstract void onSearchQuerySubmit(java.lang.String);
-  }
-
-  public class SearchEditText extends android.support.v17.leanback.widget.StreamingTextView {
-    ctor public SearchEditText(android.content.Context);
-    ctor public SearchEditText(android.content.Context, android.util.AttributeSet);
-    ctor public SearchEditText(android.content.Context, android.util.AttributeSet, int);
-    method public void setOnKeyboardDismissListener(android.support.v17.leanback.widget.SearchEditText.OnKeyboardDismissListener);
-  }
-
-  public static abstract interface SearchEditText.OnKeyboardDismissListener {
-    method public abstract void onKeyboardDismiss();
-  }
-
-  public class SearchOrbView extends android.widget.FrameLayout implements android.view.View.OnClickListener {
-    ctor public SearchOrbView(android.content.Context);
-    ctor public SearchOrbView(android.content.Context, android.util.AttributeSet);
-    ctor public SearchOrbView(android.content.Context, android.util.AttributeSet, int);
-    method public void enableOrbColorAnimation(boolean);
-    method public int getOrbColor();
-    method public android.support.v17.leanback.widget.SearchOrbView.Colors getOrbColors();
-    method public android.graphics.drawable.Drawable getOrbIcon();
-    method public void onClick(android.view.View);
-    method public void setOnOrbClickedListener(android.view.View.OnClickListener);
-    method public void setOrbColor(int);
-    method public deprecated void setOrbColor(int, int);
-    method public void setOrbColors(android.support.v17.leanback.widget.SearchOrbView.Colors);
-    method public void setOrbIcon(android.graphics.drawable.Drawable);
-  }
-
-  public static class SearchOrbView.Colors {
-    ctor public SearchOrbView.Colors(int);
-    ctor public SearchOrbView.Colors(int, int);
-    ctor public SearchOrbView.Colors(int, int, int);
-    method public static int getBrightColor(int);
-    field public int brightColor;
-    field public int color;
-    field public int iconColor;
-  }
-
-  public class ShadowOverlayContainer extends android.view.ViewGroup {
-    ctor public ShadowOverlayContainer(android.content.Context);
-    ctor public ShadowOverlayContainer(android.content.Context, android.util.AttributeSet);
-    ctor public ShadowOverlayContainer(android.content.Context, android.util.AttributeSet, int);
-    method public int getShadowType();
-    method public android.view.View getWrappedView();
-    method public deprecated void initialize(boolean, boolean);
-    method public void initialize(boolean, boolean, boolean);
-    method protected void onLayout(boolean, int, int, int, int);
-    method public static void prepareParentForShadow(android.view.ViewGroup);
-    method public void setOverlayColor(int);
-    method public void setShadowFocusLevel(float);
-    method public static boolean supportsDynamicShadow();
-    method public static boolean supportsShadow();
-    method public void useDynamicShadow();
-    method public void useDynamicShadow(float, float);
-    method public void useStaticShadow();
-    method public void wrap(android.view.View);
-    field public static final int SHADOW_DYNAMIC = 3; // 0x3
-    field public static final int SHADOW_NONE = 1; // 0x1
-    field public static final int SHADOW_STATIC = 2; // 0x2
-  }
-
-  public final class SinglePresenterSelector extends android.support.v17.leanback.widget.PresenterSelector {
-    ctor public SinglePresenterSelector(android.support.v17.leanback.widget.Presenter);
-    method public android.support.v17.leanback.widget.Presenter getPresenter(java.lang.Object);
-  }
-
-  public class SparseArrayObjectAdapter extends android.support.v17.leanback.widget.ObjectAdapter {
-    ctor public SparseArrayObjectAdapter(android.support.v17.leanback.widget.PresenterSelector);
-    ctor public SparseArrayObjectAdapter(android.support.v17.leanback.widget.Presenter);
-    ctor public SparseArrayObjectAdapter();
-    method public void clear(int);
-    method public void clear();
-    method public java.lang.Object get(int);
-    method public int indexOf(java.lang.Object);
-    method public int indexOf(int);
-    method public java.lang.Object lookup(int);
-    method public void notifyArrayItemRangeChanged(int, int);
-    method public void set(int, java.lang.Object);
-    method public int size();
-  }
-
-  public class SpeechOrbView extends android.support.v17.leanback.widget.SearchOrbView {
-    ctor public SpeechOrbView(android.content.Context);
-    ctor public SpeechOrbView(android.content.Context, android.util.AttributeSet);
-    ctor public SpeechOrbView(android.content.Context, android.util.AttributeSet, int);
-    method public void setSoundLevel(int);
-    method public void showListening();
-    method public void showNotListening();
-  }
-
-  public abstract interface SpeechRecognitionCallback {
-    method public abstract void recognizeSpeech();
-  }
-
-   class StreamingTextView extends android.widget.EditText {
-    ctor public StreamingTextView(android.content.Context, android.util.AttributeSet);
-    ctor public StreamingTextView(android.content.Context, android.util.AttributeSet, int);
-    method public static boolean isLayoutRtl(android.view.View);
-    method public void reset();
-    method public void setFinalRecognizedText(java.lang.CharSequence);
-    method public void updateRecognizedText(java.lang.String, java.lang.String);
-    method public void updateRecognizedText(java.lang.String, java.util.List<java.lang.Float>);
-  }
-
-  public class TitleHelper {
-    ctor public TitleHelper(android.view.ViewGroup, android.support.v17.leanback.widget.TitleView);
-    method public android.support.v17.leanback.widget.BrowseFrameLayout.OnFocusSearchListener getOnFocusSearchListener();
-    method public android.view.ViewGroup getSceneRoot();
-    method public android.support.v17.leanback.widget.TitleView getTitleView();
-    method public void showTitle(boolean);
-  }
-
-  public class TitleView extends android.widget.FrameLayout {
-    ctor public TitleView(android.content.Context);
-    ctor public TitleView(android.content.Context, android.util.AttributeSet);
-    ctor public TitleView(android.content.Context, android.util.AttributeSet, int);
-    method public void enableAnimation(boolean);
-    method public android.graphics.drawable.Drawable getBadgeDrawable();
-    method public android.support.v17.leanback.widget.SearchOrbView.Colors getSearchAffordanceColors();
-    method public android.view.View getSearchAffordanceView();
-    method public java.lang.CharSequence getTitle();
-    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
-    method public void setOnSearchClickedListener(android.view.View.OnClickListener);
-    method public void setSearchAffordanceColors(android.support.v17.leanback.widget.SearchOrbView.Colors);
-    method public void setTitle(java.lang.String);
-  }
-
-  public class VerticalGridPresenter extends android.support.v17.leanback.widget.Presenter {
-    ctor public VerticalGridPresenter();
-    ctor public VerticalGridPresenter(int);
-    ctor public VerticalGridPresenter(int, boolean);
-    method public final boolean areChildRoundedCornersEnabled();
-    method protected android.support.v17.leanback.widget.VerticalGridPresenter.ViewHolder createGridViewHolder(android.view.ViewGroup);
-    method public final void enableChildRoundedCorners(boolean);
-    method public final int getFocusZoomFactor();
-    method public int getNumberOfColumns();
-    method public final android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public final android.support.v17.leanback.widget.OnItemViewSelectedListener getOnItemViewSelectedListener();
-    method public final boolean getShadowEnabled();
-    method protected void initializeGridViewHolder(android.support.v17.leanback.widget.VerticalGridPresenter.ViewHolder);
-    method public final boolean isFocusDimmerUsed();
-    method public boolean isUsingDefaultShadow();
-    method public boolean isUsingZOrder(android.content.Context);
-    method public void onBindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object);
-    method public final android.support.v17.leanback.widget.VerticalGridPresenter.ViewHolder onCreateViewHolder(android.view.ViewGroup);
-    method public void onUnbindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public void setNumberOfColumns(int);
-    method public final void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public final void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public final void setShadowEnabled(boolean);
-  }
-
-  public static class VerticalGridPresenter.ViewHolder extends android.support.v17.leanback.widget.Presenter.ViewHolder {
-    ctor public VerticalGridPresenter.ViewHolder(android.support.v17.leanback.widget.VerticalGridView);
-    method public android.support.v17.leanback.widget.VerticalGridView getGridView();
-  }
-
-  public class VerticalGridView extends android.support.v7.widget.RecyclerView {
-    ctor public VerticalGridView(android.content.Context);
-    ctor public VerticalGridView(android.content.Context, android.util.AttributeSet);
-    ctor public VerticalGridView(android.content.Context, android.util.AttributeSet, int);
-    method protected void initAttributes(android.content.Context, android.util.AttributeSet);
-    method public void setColumnWidth(int);
-    method public void setNumColumns(int);
-  }
-
-}
-
diff --git a/v17/leanback/api/23.0.0.txt b/v17/leanback/api/23.0.0.txt
deleted file mode 100644
index fb2832d..0000000
--- a/v17/leanback/api/23.0.0.txt
+++ /dev/null
@@ -1,1575 +0,0 @@
-package android.support.v17.leanback.app {
-
-  public final class BackgroundManager {
-    method public void attach(android.view.Window);
-    method public final int getColor();
-    method public android.graphics.drawable.Drawable getDefaultDimLayer();
-    method public android.graphics.drawable.Drawable getDimLayer();
-    method public android.graphics.drawable.Drawable getDrawable();
-    method public static android.support.v17.leanback.app.BackgroundManager getInstance(android.app.Activity);
-    method public boolean isAttached();
-    method public void release();
-    method public void setBitmap(android.graphics.Bitmap);
-    method public void setColor(int);
-    method public void setDimLayer(android.graphics.drawable.Drawable);
-    method public void setDrawable(android.graphics.drawable.Drawable);
-    method public void setThemeDrawableResourceId(int);
-  }
-
-   abstract class BaseRowFragment extends android.app.Fragment {
-    method public final android.support.v17.leanback.widget.ObjectAdapter getAdapter();
-    method public final android.support.v17.leanback.widget.PresenterSelector getPresenterSelector();
-    method public final void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public final void setPresenterSelector(android.support.v17.leanback.widget.PresenterSelector);
-    method public void setSelectedPosition(int);
-    method public void setSelectedPosition(int, boolean);
-  }
-
-   abstract class BaseRowSupportFragment extends android.support.v4.app.Fragment {
-    method public final android.support.v17.leanback.widget.ObjectAdapter getAdapter();
-    method public final android.support.v17.leanback.widget.PresenterSelector getPresenterSelector();
-    method public final void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public final void setPresenterSelector(android.support.v17.leanback.widget.PresenterSelector);
-    method public void setSelectedPosition(int);
-    method public void setSelectedPosition(int, boolean);
-  }
-
-  public class BrowseFragment extends android.support.v17.leanback.app.BrandedFragment {
-    ctor public BrowseFragment();
-    method public static android.os.Bundle createArgs(android.os.Bundle, java.lang.String, int);
-    method public void enableRowScaling(boolean);
-    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
-    method public int getBrandColor();
-    method public int getHeadersState();
-    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public android.support.v17.leanback.widget.OnItemViewSelectedListener getOnItemViewSelectedListener();
-    method public final boolean isHeadersTransitionOnBackEnabled();
-    method public boolean isInHeadersTransition();
-    method public boolean isShowingHeaders();
-    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public void setBrandColor(int);
-    method public void setBrowseTransitionListener(android.support.v17.leanback.app.BrowseFragment.BrowseTransitionListener);
-    method public void setHeaderPresenterSelector(android.support.v17.leanback.widget.PresenterSelector);
-    method public void setHeadersState(int);
-    method public final void setHeadersTransitionOnBackEnabled(boolean);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public void setSelectedPosition(int);
-    method public void setSelectedPosition(int, boolean);
-    method public void startHeadersTransition(boolean);
-    field public static final int HEADERS_DISABLED = 3; // 0x3
-    field public static final int HEADERS_ENABLED = 1; // 0x1
-    field public static final int HEADERS_HIDDEN = 2; // 0x2
-  }
-
-  public static class BrowseFragment.BrowseTransitionListener {
-    ctor public BrowseFragment.BrowseTransitionListener();
-    method public void onHeadersTransitionStart(boolean);
-    method public void onHeadersTransitionStop(boolean);
-  }
-
-  public class BrowseSupportFragment extends android.support.v17.leanback.app.BrandedSupportFragment {
-    ctor public BrowseSupportFragment();
-    method public static android.os.Bundle createArgs(android.os.Bundle, java.lang.String, int);
-    method public void enableRowScaling(boolean);
-    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
-    method public int getBrandColor();
-    method public int getHeadersState();
-    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public android.support.v17.leanback.widget.OnItemViewSelectedListener getOnItemViewSelectedListener();
-    method public final boolean isHeadersTransitionOnBackEnabled();
-    method public boolean isInHeadersTransition();
-    method public boolean isShowingHeaders();
-    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public void setBrandColor(int);
-    method public void setBrowseTransitionListener(android.support.v17.leanback.app.BrowseSupportFragment.BrowseTransitionListener);
-    method public void setHeaderPresenterSelector(android.support.v17.leanback.widget.PresenterSelector);
-    method public void setHeadersState(int);
-    method public final void setHeadersTransitionOnBackEnabled(boolean);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public void setSelectedPosition(int);
-    method public void setSelectedPosition(int, boolean);
-    method public void startHeadersTransition(boolean);
-    field public static final int HEADERS_DISABLED = 3; // 0x3
-    field public static final int HEADERS_ENABLED = 1; // 0x1
-    field public static final int HEADERS_HIDDEN = 2; // 0x2
-  }
-
-  public static class BrowseSupportFragment.BrowseTransitionListener {
-    ctor public BrowseSupportFragment.BrowseTransitionListener();
-    method public void onHeadersTransitionStart(boolean);
-    method public void onHeadersTransitionStop(boolean);
-  }
-
-  public class DetailsFragment extends android.support.v17.leanback.app.BrandedFragment {
-    ctor public DetailsFragment();
-    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
-    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method protected android.view.View inflateTitle(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
-    method protected void onSetDetailsOverviewRowStatus(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter, android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder, int, int, int);
-    method protected void onSetRowStatus(android.support.v17.leanback.widget.RowPresenter, android.support.v17.leanback.widget.RowPresenter.ViewHolder, int, int, int);
-    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public void setSelectedPosition(int);
-    method public void setSelectedPosition(int, boolean);
-    method protected void setupDetailsOverviewRowPresenter(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter);
-    method protected void setupPresenter(android.support.v17.leanback.widget.Presenter);
-  }
-
-  public class DetailsSupportFragment extends android.support.v17.leanback.app.BrandedSupportFragment {
-    ctor public DetailsSupportFragment();
-    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
-    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method protected android.view.View inflateTitle(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
-    method protected void onSetDetailsOverviewRowStatus(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter, android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder, int, int, int);
-    method protected void onSetRowStatus(android.support.v17.leanback.widget.RowPresenter, android.support.v17.leanback.widget.RowPresenter.ViewHolder, int, int, int);
-    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public void setSelectedPosition(int);
-    method public void setSelectedPosition(int, boolean);
-    method protected void setupDetailsOverviewRowPresenter(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter);
-    method protected void setupPresenter(android.support.v17.leanback.widget.Presenter);
-  }
-
-  public class ErrorFragment extends android.app.Fragment {
-    ctor public ErrorFragment();
-    method public android.graphics.drawable.Drawable getBackgroundDrawable();
-    method public android.graphics.drawable.Drawable getBadgeDrawable();
-    method public android.view.View.OnClickListener getButtonClickListener();
-    method public java.lang.String getButtonText();
-    method public android.graphics.drawable.Drawable getImageDrawable();
-    method public java.lang.CharSequence getMessage();
-    method public java.lang.String getTitle();
-    method public boolean isBackgroundTranslucent();
-    method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
-    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
-    method public void setButtonClickListener(android.view.View.OnClickListener);
-    method public void setButtonText(java.lang.String);
-    method public void setDefaultBackground(boolean);
-    method public void setImageDrawable(android.graphics.drawable.Drawable);
-    method public void setMessage(java.lang.CharSequence);
-    method public void setTitle(java.lang.String);
-  }
-
-  public class ErrorSupportFragment extends android.support.v4.app.Fragment {
-    ctor public ErrorSupportFragment();
-    method public android.graphics.drawable.Drawable getBackgroundDrawable();
-    method public android.graphics.drawable.Drawable getBadgeDrawable();
-    method public android.view.View.OnClickListener getButtonClickListener();
-    method public java.lang.String getButtonText();
-    method public android.graphics.drawable.Drawable getImageDrawable();
-    method public java.lang.CharSequence getMessage();
-    method public java.lang.String getTitle();
-    method public boolean isBackgroundTranslucent();
-    method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
-    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
-    method public void setButtonClickListener(android.view.View.OnClickListener);
-    method public void setButtonText(java.lang.String);
-    method public void setDefaultBackground(boolean);
-    method public void setImageDrawable(android.graphics.drawable.Drawable);
-    method public void setMessage(java.lang.CharSequence);
-    method public void setTitle(java.lang.String);
-  }
-
-  public class GuidedStepFragment extends android.app.Fragment {
-    ctor public GuidedStepFragment();
-    method public static int add(android.app.FragmentManager, android.support.v17.leanback.app.GuidedStepFragment);
-    method public android.view.View getActionItemView(int);
-    method public java.util.List<android.support.v17.leanback.widget.GuidedAction> getActions();
-    method public static android.support.v17.leanback.app.GuidedStepFragment getCurrentGuidedStepFragment(android.app.FragmentManager);
-    method public android.support.v17.leanback.widget.GuidanceStylist getGuidanceStylist();
-    method public android.support.v17.leanback.widget.GuidedActionsStylist getGuidedActionsStylist();
-    method public int getSelectedActionPosition();
-    method protected boolean isEntryTransitionEnabled();
-    method public void onCreateActions(java.util.List<android.support.v17.leanback.widget.GuidedAction>, android.os.Bundle);
-    method public android.support.v17.leanback.widget.GuidedActionsStylist onCreateActionsStylist();
-    method public android.support.v17.leanback.widget.GuidanceStylist.Guidance onCreateGuidance(android.os.Bundle);
-    method public android.support.v17.leanback.widget.GuidanceStylist onCreateGuidanceStylist();
-    method public void onGuidedActionClicked(android.support.v17.leanback.widget.GuidedAction);
-    method public void onGuidedActionFocused(android.support.v17.leanback.widget.GuidedAction);
-    method public int onProvideTheme();
-    method public void setActions(java.util.List<android.support.v17.leanback.widget.GuidedAction>);
-    method protected void setEntryTransitionEnabled(boolean);
-    method public void setSelectedActionPosition(int);
-  }
-
-  public class HeadersFragment extends android.support.v17.leanback.app.BaseRowFragment {
-    ctor public HeadersFragment();
-    method public void setOnHeaderClickedListener(android.support.v17.leanback.app.HeadersFragment.OnHeaderClickedListener);
-    method public void setOnHeaderViewSelectedListener(android.support.v17.leanback.app.HeadersFragment.OnHeaderViewSelectedListener);
-  }
-
-   static abstract interface HeadersFragment.OnHeaderClickedListener {
-    method public abstract void onHeaderClicked();
-  }
-
-   static abstract interface HeadersFragment.OnHeaderViewSelectedListener {
-    method public abstract void onHeaderSelected(android.support.v17.leanback.widget.RowHeaderPresenter.ViewHolder, android.support.v17.leanback.widget.Row);
-  }
-
-  public class HeadersSupportFragment extends android.support.v17.leanback.app.BaseRowSupportFragment {
-    ctor public HeadersSupportFragment();
-    method public void setOnHeaderClickedListener(android.support.v17.leanback.app.HeadersSupportFragment.OnHeaderClickedListener);
-    method public void setOnHeaderViewSelectedListener(android.support.v17.leanback.app.HeadersSupportFragment.OnHeaderViewSelectedListener);
-  }
-
-   static abstract interface HeadersSupportFragment.OnHeaderClickedListener {
-    method public abstract void onHeaderClicked();
-  }
-
-   static abstract interface HeadersSupportFragment.OnHeaderViewSelectedListener {
-    method public abstract void onHeaderSelected(android.support.v17.leanback.widget.RowHeaderPresenter.ViewHolder, android.support.v17.leanback.widget.Row);
-  }
-
-  public abstract class MediaControllerGlue extends android.support.v17.leanback.app.PlaybackControlGlue {
-    ctor public MediaControllerGlue(android.content.Context, android.support.v17.leanback.app.PlaybackOverlayFragment, int[]);
-    ctor public MediaControllerGlue(android.content.Context, android.support.v17.leanback.app.PlaybackOverlayFragment, int[], int[]);
-    method public void attachToMediaController(android.support.v4.media.session.MediaControllerCompat);
-    method public void detach();
-    method public int getCurrentPosition();
-    method public int getCurrentSpeedId();
-    method public android.graphics.drawable.Drawable getMediaArt();
-    method public final android.support.v4.media.session.MediaControllerCompat getMediaController();
-    method public int getMediaDuration();
-    method public java.lang.CharSequence getMediaSubtitle();
-    method public java.lang.CharSequence getMediaTitle();
-    method public long getSupportedActions();
-    method public boolean hasValidMedia();
-    method public boolean isMediaPlaying();
-    method protected void pausePlayback();
-    method protected void skipToNext();
-    method protected void skipToPrevious();
-    method protected void startPlayback(int);
-  }
-
-  public abstract class PlaybackControlGlue implements android.support.v17.leanback.widget.OnActionClickedListener android.view.View.OnKeyListener {
-    ctor public PlaybackControlGlue(android.content.Context, int[]);
-    ctor public PlaybackControlGlue(android.content.Context, int[], int[]);
-    ctor public PlaybackControlGlue(android.content.Context, android.support.v17.leanback.app.PlaybackOverlayFragment, int[]);
-    ctor public PlaybackControlGlue(android.content.Context, android.support.v17.leanback.app.PlaybackOverlayFragment, int[], int[]);
-    method public android.support.v17.leanback.widget.PlaybackControlsRowPresenter createControlsRowAndPresenter();
-    method protected android.support.v17.leanback.widget.SparseArrayObjectAdapter createPrimaryActionsAdapter(android.support.v17.leanback.widget.PresenterSelector);
-    method public void enableProgressUpdating(boolean);
-    method public android.content.Context getContext();
-    method public android.support.v17.leanback.widget.PlaybackControlsRow getControlsRow();
-    method public abstract int getCurrentPosition();
-    method public abstract int getCurrentSpeedId();
-    method public int[] getFastForwardSpeeds();
-    method public android.support.v17.leanback.app.PlaybackOverlayFragment getFragment();
-    method public abstract android.graphics.drawable.Drawable getMediaArt();
-    method public abstract int getMediaDuration();
-    method public abstract java.lang.CharSequence getMediaSubtitle();
-    method public abstract java.lang.CharSequence getMediaTitle();
-    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public int[] getRewindSpeeds();
-    method public abstract long getSupportedActions();
-    method public int getUpdatePeriod();
-    method public abstract boolean hasValidMedia();
-    method public boolean isFadingEnabled();
-    method public abstract boolean isMediaPlaying();
-    method public void onActionClicked(android.support.v17.leanback.widget.Action);
-    method public boolean onKey(android.view.View, int, android.view.KeyEvent);
-    method protected void onMetadataChanged();
-    method protected abstract void onRowChanged(android.support.v17.leanback.widget.PlaybackControlsRow);
-    method protected void onStateChanged();
-    method protected abstract void pausePlayback();
-    method public void setControlsRow(android.support.v17.leanback.widget.PlaybackControlsRow);
-    method public void setFadingEnabled(boolean);
-    method public deprecated void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method protected abstract void skipToNext();
-    method protected abstract void skipToPrevious();
-    method protected abstract void startPlayback(int);
-    method public void updateProgress();
-    field public static final int ACTION_CUSTOM_LEFT_FIRST = 1; // 0x1
-    field public static final int ACTION_CUSTOM_RIGHT_FIRST = 4096; // 0x1000
-    field public static final int ACTION_FAST_FORWARD = 128; // 0x80
-    field public static final int ACTION_PLAY_PAUSE = 64; // 0x40
-    field public static final int ACTION_REWIND = 32; // 0x20
-    field public static final int ACTION_SKIP_TO_NEXT = 256; // 0x100
-    field public static final int ACTION_SKIP_TO_PREVIOUS = 16; // 0x10
-    field public static final int PLAYBACK_SPEED_FAST_L0 = 10; // 0xa
-    field public static final int PLAYBACK_SPEED_FAST_L1 = 11; // 0xb
-    field public static final int PLAYBACK_SPEED_FAST_L2 = 12; // 0xc
-    field public static final int PLAYBACK_SPEED_FAST_L3 = 13; // 0xd
-    field public static final int PLAYBACK_SPEED_FAST_L4 = 14; // 0xe
-    field public static final int PLAYBACK_SPEED_INVALID = -1; // 0xffffffff
-    field public static final int PLAYBACK_SPEED_NORMAL = 1; // 0x1
-    field public static final int PLAYBACK_SPEED_PAUSED = 0; // 0x0
-  }
-
-  public class PlaybackOverlayFragment extends android.support.v17.leanback.app.DetailsFragment {
-    ctor public PlaybackOverlayFragment();
-    method public int getBackgroundType();
-    method public android.support.v17.leanback.app.PlaybackOverlayFragment.OnFadeCompleteListener getFadeCompleteListener();
-    method public final android.support.v17.leanback.app.PlaybackOverlayFragment.InputEventHandler getInputEventHandler();
-    method public boolean isFadingEnabled();
-    method public void setBackgroundType(int);
-    method public void setFadeCompleteListener(android.support.v17.leanback.app.PlaybackOverlayFragment.OnFadeCompleteListener);
-    method public void setFadingEnabled(boolean);
-    method public final void setInputEventHandler(android.support.v17.leanback.app.PlaybackOverlayFragment.InputEventHandler);
-    method public void tickle();
-    field public static final int BG_DARK = 1; // 0x1
-    field public static final int BG_LIGHT = 2; // 0x2
-    field public static final int BG_NONE = 0; // 0x0
-  }
-
-  public static abstract interface PlaybackOverlayFragment.InputEventHandler {
-    method public abstract boolean handleInputEvent(android.view.InputEvent);
-  }
-
-  public static class PlaybackOverlayFragment.OnFadeCompleteListener {
-    ctor public PlaybackOverlayFragment.OnFadeCompleteListener();
-    method public void onFadeInComplete();
-    method public void onFadeOutComplete();
-  }
-
-  public class PlaybackOverlaySupportFragment extends android.support.v17.leanback.app.DetailsSupportFragment {
-    ctor public PlaybackOverlaySupportFragment();
-    method public int getBackgroundType();
-    method public android.support.v17.leanback.app.PlaybackOverlaySupportFragment.OnFadeCompleteListener getFadeCompleteListener();
-    method public final android.support.v17.leanback.app.PlaybackOverlaySupportFragment.InputEventHandler getInputEventHandler();
-    method public boolean isFadingEnabled();
-    method public void setBackgroundType(int);
-    method public void setFadeCompleteListener(android.support.v17.leanback.app.PlaybackOverlaySupportFragment.OnFadeCompleteListener);
-    method public void setFadingEnabled(boolean);
-    method public final void setInputEventHandler(android.support.v17.leanback.app.PlaybackOverlaySupportFragment.InputEventHandler);
-    method public void tickle();
-    field public static final int BG_DARK = 1; // 0x1
-    field public static final int BG_LIGHT = 2; // 0x2
-    field public static final int BG_NONE = 0; // 0x0
-  }
-
-  public static abstract interface PlaybackOverlaySupportFragment.InputEventHandler {
-    method public abstract boolean handleInputEvent(android.view.InputEvent);
-  }
-
-  public static class PlaybackOverlaySupportFragment.OnFadeCompleteListener {
-    ctor public PlaybackOverlaySupportFragment.OnFadeCompleteListener();
-    method public void onFadeInComplete();
-    method public void onFadeOutComplete();
-  }
-
-  public class RowsFragment extends android.support.v17.leanback.app.BaseRowFragment {
-    ctor public RowsFragment();
-    method public void enableRowScaling(boolean);
-    method protected android.support.v17.leanback.widget.VerticalGridView findGridViewFromRoot(android.view.View);
-    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public android.support.v17.leanback.widget.OnItemViewSelectedListener getOnItemViewSelectedListener();
-    method public void setExpand(boolean);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-  }
-
-  public class RowsSupportFragment extends android.support.v17.leanback.app.BaseRowSupportFragment {
-    ctor public RowsSupportFragment();
-    method public void enableRowScaling(boolean);
-    method protected android.support.v17.leanback.widget.VerticalGridView findGridViewFromRoot(android.view.View);
-    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public android.support.v17.leanback.widget.OnItemViewSelectedListener getOnItemViewSelectedListener();
-    method public void setExpand(boolean);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-  }
-
-  public class SearchFragment extends android.app.Fragment {
-    ctor public SearchFragment();
-    method public static android.os.Bundle createArgs(android.os.Bundle, java.lang.String);
-    method public static android.os.Bundle createArgs(android.os.Bundle, java.lang.String, java.lang.String);
-    method public void displayCompletions(java.util.List<java.lang.String>);
-    method public android.graphics.drawable.Drawable getBadgeDrawable();
-    method public android.content.Intent getRecognizerIntent();
-    method public java.lang.String getTitle();
-    method public static android.support.v17.leanback.app.SearchFragment newInstance(java.lang.String);
-    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public void setSearchQuery(java.lang.String, boolean);
-    method public void setSearchQuery(android.content.Intent, boolean);
-    method public void setSearchResultProvider(android.support.v17.leanback.app.SearchFragment.SearchResultProvider);
-    method public void setSpeechRecognitionCallback(android.support.v17.leanback.widget.SpeechRecognitionCallback);
-    method public void setTitle(java.lang.String);
-    method public void startRecognition();
-  }
-
-  public static abstract interface SearchFragment.SearchResultProvider {
-    method public abstract android.support.v17.leanback.widget.ObjectAdapter getResultsAdapter();
-    method public abstract boolean onQueryTextChange(java.lang.String);
-    method public abstract boolean onQueryTextSubmit(java.lang.String);
-  }
-
-  public class SearchSupportFragment extends android.support.v4.app.Fragment {
-    ctor public SearchSupportFragment();
-    method public static android.os.Bundle createArgs(android.os.Bundle, java.lang.String);
-    method public static android.os.Bundle createArgs(android.os.Bundle, java.lang.String, java.lang.String);
-    method public void displayCompletions(java.util.List<java.lang.String>);
-    method public android.graphics.drawable.Drawable getBadgeDrawable();
-    method public android.content.Intent getRecognizerIntent();
-    method public java.lang.String getTitle();
-    method public static android.support.v17.leanback.app.SearchSupportFragment newInstance(java.lang.String);
-    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public void setSearchQuery(java.lang.String, boolean);
-    method public void setSearchQuery(android.content.Intent, boolean);
-    method public void setSearchResultProvider(android.support.v17.leanback.app.SearchSupportFragment.SearchResultProvider);
-    method public void setSpeechRecognitionCallback(android.support.v17.leanback.widget.SpeechRecognitionCallback);
-    method public void setTitle(java.lang.String);
-    method public void startRecognition();
-  }
-
-  public static abstract interface SearchSupportFragment.SearchResultProvider {
-    method public abstract android.support.v17.leanback.widget.ObjectAdapter getResultsAdapter();
-    method public abstract boolean onQueryTextChange(java.lang.String);
-    method public abstract boolean onQueryTextSubmit(java.lang.String);
-  }
-
-  public class VerticalGridFragment extends android.app.Fragment {
-    ctor public VerticalGridFragment();
-    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
-    method public android.support.v17.leanback.widget.VerticalGridPresenter getGridPresenter();
-    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public void setGridPresenter(android.support.v17.leanback.widget.VerticalGridPresenter);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public void setSelectedPosition(int);
-  }
-
-  public class VerticalGridSupportFragment extends android.support.v4.app.Fragment {
-    ctor public VerticalGridSupportFragment();
-    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
-    method public android.support.v17.leanback.widget.VerticalGridPresenter getGridPresenter();
-    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public void setGridPresenter(android.support.v17.leanback.widget.VerticalGridPresenter);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public void setSelectedPosition(int);
-  }
-
-}
-
-package android.support.v17.leanback.database {
-
-  public abstract class CursorMapper {
-    ctor public CursorMapper();
-    method protected abstract java.lang.Object bind(android.database.Cursor);
-    method protected abstract void bindColumns(android.database.Cursor);
-    method public java.lang.Object convert(android.database.Cursor);
-  }
-
-}
-
-package android.support.v17.leanback.graphics {
-
-  public final class ColorFilterCache {
-    method public static android.support.v17.leanback.graphics.ColorFilterCache getColorFilterCache(int);
-    method public android.graphics.ColorFilter getFilterForLevel(float);
-  }
-
-  public final class ColorFilterDimmer {
-    method public void applyFilterToView(android.view.View);
-    method public static android.support.v17.leanback.graphics.ColorFilterDimmer create(android.support.v17.leanback.graphics.ColorFilterCache, float, float);
-    method public static android.support.v17.leanback.graphics.ColorFilterDimmer createDefault(android.content.Context);
-    method public android.graphics.ColorFilter getColorFilter();
-    method public android.graphics.Paint getPaint();
-    method public void setActiveLevel(float);
-  }
-
-  public final class ColorOverlayDimmer {
-    method public int applyToColor(int);
-    method public static android.support.v17.leanback.graphics.ColorOverlayDimmer createColorOverlayDimmer(int, float, float);
-    method public static android.support.v17.leanback.graphics.ColorOverlayDimmer createDefault(android.content.Context);
-    method public void drawColorOverlay(android.graphics.Canvas, android.view.View, boolean);
-    method public int getAlpha();
-    method public float getAlphaFloat();
-    method public android.graphics.Paint getPaint();
-    method public boolean needsDraw();
-    method public void setActiveLevel(float);
-  }
-
-}
-
-package android.support.v17.leanback.system {
-
-  public class Settings {
-    method public boolean getBoolean(java.lang.String);
-    method public static android.support.v17.leanback.system.Settings getInstance(android.content.Context);
-    method public void setBoolean(java.lang.String, boolean);
-    field public static final java.lang.String PREFER_STATIC_SHADOWS = "PREFER_STATIC_SHADOWS";
-  }
-
-}
-
-package android.support.v17.leanback.widget {
-
-  public abstract class AbstractDetailsDescriptionPresenter extends android.support.v17.leanback.widget.Presenter {
-    ctor public AbstractDetailsDescriptionPresenter();
-    method protected abstract void onBindDescription(android.support.v17.leanback.widget.AbstractDetailsDescriptionPresenter.ViewHolder, java.lang.Object);
-    method public final void onBindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object);
-    method public final android.support.v17.leanback.widget.AbstractDetailsDescriptionPresenter.ViewHolder onCreateViewHolder(android.view.ViewGroup);
-    method public void onUnbindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
-  }
-
-  public static class AbstractDetailsDescriptionPresenter.ViewHolder extends android.support.v17.leanback.widget.Presenter.ViewHolder {
-    ctor public AbstractDetailsDescriptionPresenter.ViewHolder(android.view.View);
-    method public android.widget.TextView getBody();
-    method public android.widget.TextView getSubtitle();
-    method public android.widget.TextView getTitle();
-  }
-
-  public class Action {
-    ctor public Action(long);
-    ctor public Action(long, java.lang.CharSequence);
-    ctor public Action(long, java.lang.CharSequence, java.lang.CharSequence);
-    ctor public Action(long, java.lang.CharSequence, java.lang.CharSequence, android.graphics.drawable.Drawable);
-    method public final void addKeyCode(int);
-    method public final android.graphics.drawable.Drawable getIcon();
-    method public final long getId();
-    method public final java.lang.CharSequence getLabel1();
-    method public final java.lang.CharSequence getLabel2();
-    method public final void removeKeyCode(int);
-    method public final boolean respondsToKeyCode(int);
-    method public final void setIcon(android.graphics.drawable.Drawable);
-    method public final void setId(long);
-    method public final void setLabel1(java.lang.CharSequence);
-    method public final void setLabel2(java.lang.CharSequence);
-  }
-
-  public class ArrayObjectAdapter extends android.support.v17.leanback.widget.ObjectAdapter {
-    ctor public ArrayObjectAdapter(android.support.v17.leanback.widget.PresenterSelector);
-    ctor public ArrayObjectAdapter(android.support.v17.leanback.widget.Presenter);
-    ctor public ArrayObjectAdapter();
-    method public void add(java.lang.Object);
-    method public void add(int, java.lang.Object);
-    method public void addAll(int, java.util.Collection);
-    method public void clear();
-    method public java.lang.Object get(int);
-    method public int indexOf(java.lang.Object);
-    method public void notifyArrayItemRangeChanged(int, int);
-    method public boolean remove(java.lang.Object);
-    method public int removeItems(int, int);
-    method public void replace(int, java.lang.Object);
-    method public int size();
-    method public java.util.List<E> unmodifiableList();
-  }
-
-  public class BaseCardView extends android.widget.FrameLayout {
-    ctor public BaseCardView(android.content.Context);
-    ctor public BaseCardView(android.content.Context, android.util.AttributeSet);
-    ctor public BaseCardView(android.content.Context, android.util.AttributeSet, int);
-    method public int getCardType();
-    method public int getExtraVisibility();
-    method public int getInfoVisibility();
-    method public boolean isSelectedAnimationDelayed();
-    method public void setCardType(int);
-    method public void setExtraVisibility(int);
-    method public void setInfoVisibility(int);
-    method public void setSelectedAnimationDelayed(boolean);
-    field public static final int CARD_REGION_VISIBLE_ACTIVATED = 1; // 0x1
-    field public static final int CARD_REGION_VISIBLE_ALWAYS = 0; // 0x0
-    field public static final int CARD_REGION_VISIBLE_SELECTED = 2; // 0x2
-    field public static final int CARD_TYPE_INFO_OVER = 1; // 0x1
-    field public static final int CARD_TYPE_INFO_UNDER = 2; // 0x2
-    field public static final int CARD_TYPE_INFO_UNDER_WITH_EXTRA = 3; // 0x3
-    field public static final int CARD_TYPE_MAIN_ONLY = 0; // 0x0
-  }
-
-  public static class BaseCardView.LayoutParams extends android.widget.FrameLayout.LayoutParams {
-    ctor public BaseCardView.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public BaseCardView.LayoutParams(int, int);
-    ctor public BaseCardView.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public BaseCardView.LayoutParams(android.support.v17.leanback.widget.BaseCardView.LayoutParams);
-    field public static final int VIEW_TYPE_EXTRA = 2; // 0x2
-    field public static final int VIEW_TYPE_INFO = 1; // 0x1
-    field public static final int VIEW_TYPE_MAIN = 0; // 0x0
-    field public int viewType;
-  }
-
-  public class BrowseFrameLayout extends android.widget.FrameLayout {
-    ctor public BrowseFrameLayout(android.content.Context);
-    ctor public BrowseFrameLayout(android.content.Context, android.util.AttributeSet);
-    ctor public BrowseFrameLayout(android.content.Context, android.util.AttributeSet, int);
-    method public android.support.v17.leanback.widget.BrowseFrameLayout.OnChildFocusListener getOnChildFocusListener();
-    method public android.support.v17.leanback.widget.BrowseFrameLayout.OnFocusSearchListener getOnFocusSearchListener();
-    method public void setOnChildFocusListener(android.support.v17.leanback.widget.BrowseFrameLayout.OnChildFocusListener);
-    method public void setOnFocusSearchListener(android.support.v17.leanback.widget.BrowseFrameLayout.OnFocusSearchListener);
-  }
-
-  public static abstract interface BrowseFrameLayout.OnChildFocusListener {
-    method public abstract void onRequestChildFocus(android.view.View, android.view.View);
-    method public abstract boolean onRequestFocusInDescendants(int, android.graphics.Rect);
-  }
-
-  public static abstract interface BrowseFrameLayout.OnFocusSearchListener {
-    method public abstract android.view.View onFocusSearch(android.view.View, int);
-  }
-
-  public final class ClassPresenterSelector extends android.support.v17.leanback.widget.PresenterSelector {
-    ctor public ClassPresenterSelector();
-    method public void addClassPresenter(java.lang.Class<?>, android.support.v17.leanback.widget.Presenter);
-    method public android.support.v17.leanback.widget.Presenter getPresenter(java.lang.Object);
-  }
-
-  public class ControlButtonPresenterSelector extends android.support.v17.leanback.widget.PresenterSelector {
-    ctor public ControlButtonPresenterSelector();
-    method public android.support.v17.leanback.widget.Presenter getPresenter(java.lang.Object);
-    method public android.support.v17.leanback.widget.Presenter getPrimaryPresenter();
-    method public android.support.v17.leanback.widget.Presenter getSecondaryPresenter();
-  }
-
-  public class CursorObjectAdapter extends android.support.v17.leanback.widget.ObjectAdapter {
-    ctor public CursorObjectAdapter(android.support.v17.leanback.widget.PresenterSelector);
-    ctor public CursorObjectAdapter(android.support.v17.leanback.widget.Presenter);
-    ctor public CursorObjectAdapter();
-    method public void changeCursor(android.database.Cursor);
-    method public void close();
-    method public java.lang.Object get(int);
-    method public final android.database.Cursor getCursor();
-    method public final android.support.v17.leanback.database.CursorMapper getMapper();
-    method protected final void invalidateCache(int);
-    method protected final void invalidateCache(int, int);
-    method public boolean isClosed();
-    method protected void onCursorChanged();
-    method protected void onMapperChanged();
-    method public final void setMapper(android.support.v17.leanback.database.CursorMapper);
-    method public int size();
-    method public android.database.Cursor swapCursor(android.database.Cursor);
-  }
-
-  public class DetailsOverviewLogoPresenter extends android.support.v17.leanback.widget.Presenter {
-    ctor public DetailsOverviewLogoPresenter();
-    method public boolean isBoundToImage(android.support.v17.leanback.widget.DetailsOverviewLogoPresenter.ViewHolder, android.support.v17.leanback.widget.DetailsOverviewRow);
-    method public void onBindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object);
-    method public android.support.v17.leanback.widget.Presenter.ViewHolder onCreateViewHolder(android.view.ViewGroup);
-    method public void onUnbindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public void setContext(android.support.v17.leanback.widget.DetailsOverviewLogoPresenter.ViewHolder, android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder, android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter);
-  }
-
-  public static class DetailsOverviewLogoPresenter.ViewHolder extends android.support.v17.leanback.widget.Presenter.ViewHolder {
-    ctor public DetailsOverviewLogoPresenter.ViewHolder(android.view.View);
-    field protected android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter mParentPresenter;
-    field protected android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder mParentViewHolder;
-  }
-
-  public class DetailsOverviewRow extends android.support.v17.leanback.widget.Row {
-    ctor public DetailsOverviewRow(java.lang.Object);
-    method public final deprecated void addAction(android.support.v17.leanback.widget.Action);
-    method public final deprecated void addAction(int, android.support.v17.leanback.widget.Action);
-    method public android.support.v17.leanback.widget.Action getActionForKeyCode(int);
-    method public final deprecated java.util.List<android.support.v17.leanback.widget.Action> getActions();
-    method public final android.support.v17.leanback.widget.ObjectAdapter getActionsAdapter();
-    method public final android.graphics.drawable.Drawable getImageDrawable();
-    method public final java.lang.Object getItem();
-    method public boolean isImageScaleUpAllowed();
-    method public final deprecated boolean removeAction(android.support.v17.leanback.widget.Action);
-    method public final void setActionsAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public final void setImageBitmap(android.content.Context, android.graphics.Bitmap);
-    method public final void setImageDrawable(android.graphics.drawable.Drawable);
-    method public void setImageScaleUpAllowed(boolean);
-    method public final void setItem(java.lang.Object);
-  }
-
-  public static class DetailsOverviewRow.Listener {
-    ctor public DetailsOverviewRow.Listener();
-    method public void onActionsAdapterChanged(android.support.v17.leanback.widget.DetailsOverviewRow);
-    method public void onImageDrawableChanged(android.support.v17.leanback.widget.DetailsOverviewRow);
-    method public void onItemChanged(android.support.v17.leanback.widget.DetailsOverviewRow);
-  }
-
-  public deprecated class DetailsOverviewRowPresenter extends android.support.v17.leanback.widget.RowPresenter {
-    ctor public DetailsOverviewRowPresenter(android.support.v17.leanback.widget.Presenter);
-    method protected android.support.v17.leanback.widget.RowPresenter.ViewHolder createRowViewHolder(android.view.ViewGroup);
-    method public int getBackgroundColor();
-    method public android.support.v17.leanback.widget.OnActionClickedListener getOnActionClickedListener();
-    method public boolean isStyleLarge();
-    method public final boolean isUsingDefaultSelectEffect();
-    method public void setBackgroundColor(int);
-    method public void setOnActionClickedListener(android.support.v17.leanback.widget.OnActionClickedListener);
-    method public final void setSharedElementEnterTransition(android.app.Activity, java.lang.String, long);
-    method public final void setSharedElementEnterTransition(android.app.Activity, java.lang.String);
-    method public void setStyleLarge(boolean);
-  }
-
-  public final class DetailsOverviewRowPresenter.ViewHolder extends android.support.v17.leanback.widget.RowPresenter.ViewHolder {
-    ctor public DetailsOverviewRowPresenter.ViewHolder(android.view.View, android.support.v17.leanback.widget.Presenter);
-    field public final android.support.v17.leanback.widget.Presenter.ViewHolder mDetailsDescriptionViewHolder;
-  }
-
-  public abstract interface FacetProvider {
-    method public abstract java.lang.Object getFacet(java.lang.Class<?>);
-  }
-
-  public abstract interface FacetProviderAdapter {
-    method public abstract android.support.v17.leanback.widget.FacetProvider getFacetProvider(int);
-  }
-
-  public abstract interface FocusHighlight {
-    field public static final int ZOOM_FACTOR_LARGE = 3; // 0x3
-    field public static final int ZOOM_FACTOR_MEDIUM = 2; // 0x2
-    field public static final int ZOOM_FACTOR_NONE = 0; // 0x0
-    field public static final int ZOOM_FACTOR_SMALL = 1; // 0x1
-    field public static final int ZOOM_FACTOR_XSMALL = 4; // 0x4
-  }
-
-  public class FocusHighlightHelper {
-    ctor public FocusHighlightHelper();
-    method public static void setupBrowseItemFocusHighlight(android.support.v17.leanback.widget.ItemBridgeAdapter, int, boolean);
-    method public static void setupHeaderItemFocusHighlight(android.support.v17.leanback.widget.VerticalGridView);
-  }
-
-  public abstract interface FragmentAnimationProvider {
-    method public abstract void onActivityEnter(java.util.List<android.animation.Animator>);
-    method public abstract void onActivityExit(java.util.List<android.animation.Animator>);
-    method public abstract void onFragmentEnter(java.util.List<android.animation.Animator>);
-    method public abstract void onFragmentExit(java.util.List<android.animation.Animator>);
-    method public abstract void onFragmentReenter(java.util.List<android.animation.Animator>);
-    method public abstract void onFragmentReturn(java.util.List<android.animation.Animator>);
-  }
-
-  public class FullWidthDetailsOverviewRowPresenter extends android.support.v17.leanback.widget.RowPresenter {
-    ctor public FullWidthDetailsOverviewRowPresenter(android.support.v17.leanback.widget.Presenter);
-    ctor public FullWidthDetailsOverviewRowPresenter(android.support.v17.leanback.widget.Presenter, android.support.v17.leanback.widget.DetailsOverviewLogoPresenter);
-    method protected android.support.v17.leanback.widget.RowPresenter.ViewHolder createRowViewHolder(android.view.ViewGroup);
-    method public final int getActionsBackgroundColor();
-    method public final int getAlignmentMode();
-    method public final int getBackgroundColor();
-    method public final int getInitialState();
-    method protected int getLayoutResourceId();
-    method public android.support.v17.leanback.widget.OnActionClickedListener getOnActionClickedListener();
-    method public final boolean isParticipatingEntranceTransition();
-    method public final boolean isUsingDefaultSelectEffect();
-    method public final void notifyOnBindLogo(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder);
-    method protected void onLayoutLogo(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder, int, boolean);
-    method protected void onLayoutOverviewFrame(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder, int, boolean);
-    method protected void onStateChanged(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder, int);
-    method public final void setActionsBackgroundColor(int);
-    method public final void setAlignmentMode(int);
-    method public final void setBackgroundColor(int);
-    method public final void setInitialState(int);
-    method public final void setListener(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.Listener);
-    method public void setOnActionClickedListener(android.support.v17.leanback.widget.OnActionClickedListener);
-    method public final void setParticipatingEntranceTransition(boolean);
-    method public final void setState(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder, int);
-    field public static final int ALIGN_MODE_MIDDLE = 1; // 0x1
-    field public static final int ALIGN_MODE_START = 0; // 0x0
-    field public static final int STATE_FULL = 1; // 0x1
-    field public static final int STATE_HALF = 0; // 0x0
-    field public static final int STATE_SMALL = 2; // 0x2
-    field protected int mInitialState;
-  }
-
-  public static abstract class FullWidthDetailsOverviewRowPresenter.Listener {
-    ctor public FullWidthDetailsOverviewRowPresenter.Listener();
-    method public void onBindLogo(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder);
-  }
-
-  public class FullWidthDetailsOverviewRowPresenter.ViewHolder extends android.support.v17.leanback.widget.RowPresenter.ViewHolder {
-    ctor public FullWidthDetailsOverviewRowPresenter.ViewHolder(android.view.View, android.support.v17.leanback.widget.Presenter, android.support.v17.leanback.widget.DetailsOverviewLogoPresenter);
-    method protected android.support.v17.leanback.widget.DetailsOverviewRow.Listener createRowListener();
-    method public final android.view.ViewGroup getActionsRow();
-    method public final android.view.ViewGroup getDetailsDescriptionFrame();
-    method public final android.support.v17.leanback.widget.Presenter.ViewHolder getDetailsDescriptionViewHolder();
-    method public final android.support.v17.leanback.widget.DetailsOverviewLogoPresenter.ViewHolder getLogoViewHolder();
-    method public final android.view.ViewGroup getOverviewView();
-    method public final int getState();
-    field protected final android.support.v17.leanback.widget.DetailsOverviewRow.Listener mRowListener;
-  }
-
-  public class FullWidthDetailsOverviewRowPresenter.ViewHolder.DetailsOverviewRowListener extends android.support.v17.leanback.widget.DetailsOverviewRow.Listener {
-    ctor public FullWidthDetailsOverviewRowPresenter.ViewHolder.DetailsOverviewRowListener();
-  }
-
-  public class FullWidthDetailsOverviewSharedElementHelper extends android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.Listener {
-    ctor public FullWidthDetailsOverviewSharedElementHelper();
-    method public boolean getAutoStartSharedElementTransition();
-    method public void setAutoStartSharedElementTransition(boolean);
-    method public void setSharedElementEnterTransition(android.app.Activity, java.lang.String);
-    method public void setSharedElementEnterTransition(android.app.Activity, java.lang.String, long);
-    method public void startPostponedEnterTransition();
-  }
-
-  public class GuidanceStylist implements android.support.v17.leanback.widget.FragmentAnimationProvider {
-    ctor public GuidanceStylist();
-    method public android.widget.TextView getBreadcrumbView();
-    method public android.widget.TextView getDescriptionView();
-    method public android.widget.ImageView getIconView();
-    method public android.widget.TextView getTitleView();
-    method public void onActivityEnter(java.util.List<android.animation.Animator>);
-    method public void onActivityExit(java.util.List<android.animation.Animator>);
-    method public android.view.View onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.support.v17.leanback.widget.GuidanceStylist.Guidance);
-    method public void onFragmentEnter(java.util.List<android.animation.Animator>);
-    method public void onFragmentExit(java.util.List<android.animation.Animator>);
-    method public void onFragmentReenter(java.util.List<android.animation.Animator>);
-    method public void onFragmentReturn(java.util.List<android.animation.Animator>);
-    method public int onProvideLayoutId();
-  }
-
-  public static class GuidanceStylist.Guidance {
-    ctor public GuidanceStylist.Guidance(java.lang.String, java.lang.String, java.lang.String, android.graphics.drawable.Drawable);
-    method public java.lang.String getBreadcrumb();
-    method public java.lang.String getDescription();
-    method public android.graphics.drawable.Drawable getIconDrawable();
-    method public java.lang.String getTitle();
-  }
-
-  public class GuidedAction extends android.support.v17.leanback.widget.Action {
-    method public int getCheckSetId();
-    method public java.lang.CharSequence getDescription();
-    method public android.content.Intent getIntent();
-    method public java.lang.CharSequence getTitle();
-    method public boolean hasMultilineDescription();
-    method public boolean hasNext();
-    method public boolean infoOnly();
-    method public boolean isChecked();
-    method public boolean isEnabled();
-    method public void setChecked(boolean);
-    method public void setEnabled(boolean);
-    field public static final int DEFAULT_CHECK_SET_ID = 1; // 0x1
-    field public static final int NO_CHECK_SET = 0; // 0x0
-    field public static final int NO_DRAWABLE = 0; // 0x0
-  }
-
-  public static class GuidedAction.Builder {
-    ctor public GuidedAction.Builder();
-    method public android.support.v17.leanback.widget.GuidedAction build();
-    method public android.support.v17.leanback.widget.GuidedAction.Builder checkSetId(int);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder checked(boolean);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder description(java.lang.String);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder enabled(boolean);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder hasNext(boolean);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder icon(android.graphics.drawable.Drawable);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder iconResourceId(int, android.content.Context);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder id(long);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder infoOnly(boolean);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder intent(android.content.Intent);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder multilineDescription(boolean);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder title(java.lang.String);
-  }
-
-  public class GuidedActionsStylist implements android.support.v17.leanback.widget.FragmentAnimationProvider {
-    ctor public GuidedActionsStylist();
-    method public android.support.v17.leanback.widget.VerticalGridView getActionsGridView();
-    method public void onActivityEnter(java.util.List<android.animation.Animator>);
-    method public void onActivityExit(java.util.List<android.animation.Animator>);
-    method public void onAnimateItemChecked(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, boolean);
-    method public void onAnimateItemFocused(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, boolean);
-    method public void onAnimateItemPressed(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, boolean);
-    method public void onBindViewHolder(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, android.support.v17.leanback.widget.GuidedAction);
-    method public android.view.View onCreateView(android.view.LayoutInflater, android.view.ViewGroup);
-    method public android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder onCreateViewHolder(android.view.ViewGroup);
-    method public void onFragmentEnter(java.util.List<android.animation.Animator>);
-    method public void onFragmentExit(java.util.List<android.animation.Animator>);
-    method public void onFragmentReenter(java.util.List<android.animation.Animator>);
-    method public void onFragmentReturn(java.util.List<android.animation.Animator>);
-    method public int onProvideItemLayoutId();
-    method public int onProvideLayoutId();
-    field protected android.support.v17.leanback.widget.VerticalGridView mActionsGridView;
-    field protected android.view.View mMainView;
-    field protected android.view.View mSelectorView;
-  }
-
-  public static class GuidedActionsStylist.ViewHolder {
-    ctor public GuidedActionsStylist.ViewHolder(android.view.View);
-    method public android.widget.ImageView getCheckmarkView();
-    method public android.widget.ImageView getChevronView();
-    method public android.view.View getContentView();
-    method public android.widget.TextView getDescriptionView();
-    method public android.widget.ImageView getIconView();
-    method public android.widget.TextView getTitleView();
-    field public final android.view.View view;
-  }
-
-  public class HeaderItem {
-    ctor public HeaderItem(long, java.lang.String);
-    ctor public HeaderItem(java.lang.String);
-    method public final long getId();
-    method public final java.lang.String getName();
-  }
-
-  public class HorizontalGridView extends android.support.v7.widget.RecyclerView {
-    ctor public HorizontalGridView(android.content.Context);
-    ctor public HorizontalGridView(android.content.Context, android.util.AttributeSet);
-    ctor public HorizontalGridView(android.content.Context, android.util.AttributeSet, int);
-    method public final boolean getFadingLeftEdge();
-    method public final int getFadingLeftEdgeLength();
-    method public final int getFadingLeftEdgeOffset();
-    method public final boolean getFadingRightEdge();
-    method public final int getFadingRightEdgeLength();
-    method public final int getFadingRightEdgeOffset();
-    method protected void initAttributes(android.content.Context, android.util.AttributeSet);
-    method public final void setFadingLeftEdge(boolean);
-    method public final void setFadingLeftEdgeLength(int);
-    method public final void setFadingLeftEdgeOffset(int);
-    method public final void setFadingRightEdge(boolean);
-    method public final void setFadingRightEdgeLength(int);
-    method public final void setFadingRightEdgeOffset(int);
-    method public void setNumRows(int);
-    method public void setRowHeight(int);
-  }
-
-  public final class HorizontalHoverCardSwitcher extends android.support.v17.leanback.widget.PresenterSwitcher {
-    ctor public HorizontalHoverCardSwitcher();
-    method protected void insertView(android.view.View);
-    method public void select(android.support.v17.leanback.widget.HorizontalGridView, android.view.View, java.lang.Object);
-  }
-
-  public class ImageCardView extends android.support.v17.leanback.widget.BaseCardView {
-    ctor public ImageCardView(android.content.Context);
-    ctor public ImageCardView(android.content.Context, android.util.AttributeSet);
-    ctor public ImageCardView(android.content.Context, android.util.AttributeSet, int);
-    method public android.graphics.drawable.Drawable getBadgeImage();
-    method public java.lang.CharSequence getContentText();
-    method public android.graphics.drawable.Drawable getInfoAreaBackground();
-    method public android.graphics.drawable.Drawable getMainImage();
-    method public final android.widget.ImageView getMainImageView();
-    method public java.lang.CharSequence getTitleText();
-    method public void setBadgeImage(android.graphics.drawable.Drawable);
-    method public void setContentText(java.lang.CharSequence);
-    method public void setInfoAreaBackground(android.graphics.drawable.Drawable);
-    method public void setInfoAreaBackgroundColor(int);
-    method public void setMainImage(android.graphics.drawable.Drawable);
-    method public void setMainImage(android.graphics.drawable.Drawable, boolean);
-    method public void setMainImageAdjustViewBounds(boolean);
-    method public void setMainImageDimensions(int, int);
-    method public void setMainImageScaleType(android.widget.ImageView.ScaleType);
-    method public void setTitleText(java.lang.CharSequence);
-  }
-
-  public final class ItemAlignmentFacet {
-    ctor public ItemAlignmentFacet();
-    method public android.support.v17.leanback.widget.ItemAlignmentFacet.ItemAlignmentDef[] getAlignmentDefs();
-    method public boolean isMultiAlignment();
-    method public void setAlignmentDefs(android.support.v17.leanback.widget.ItemAlignmentFacet.ItemAlignmentDef[]);
-    field public static final float ITEM_ALIGN_OFFSET_PERCENT_DISABLED = -1.0f;
-  }
-
-  public static class ItemAlignmentFacet.ItemAlignmentDef {
-    ctor public ItemAlignmentFacet.ItemAlignmentDef();
-    method public final int getItemAlignmentFocusViewId();
-    method public final int getItemAlignmentOffset();
-    method public final float getItemAlignmentOffsetPercent();
-    method public final int getItemAlignmentViewId();
-    method public final boolean isItemAlignmentOffsetWithPadding();
-    method public final void setItemAlignmentFocusViewId(int);
-    method public final void setItemAlignmentOffset(int);
-    method public final void setItemAlignmentOffsetPercent(float);
-    method public final void setItemAlignmentOffsetWithPadding(boolean);
-    method public final void setItemAlignmentViewId(int);
-  }
-
-  public class ItemBridgeAdapter extends android.support.v7.widget.RecyclerView.Adapter implements android.support.v17.leanback.widget.FacetProviderAdapter {
-    ctor public ItemBridgeAdapter(android.support.v17.leanback.widget.ObjectAdapter, android.support.v17.leanback.widget.PresenterSelector);
-    ctor public ItemBridgeAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    ctor public ItemBridgeAdapter();
-    method public void clear();
-    method public android.support.v17.leanback.widget.FacetProvider getFacetProvider(int);
-    method public int getItemCount();
-    method public java.util.ArrayList<android.support.v17.leanback.widget.Presenter> getPresenterMapper();
-    method public android.support.v17.leanback.widget.ItemBridgeAdapter.Wrapper getWrapper();
-    method protected void onAddPresenter(android.support.v17.leanback.widget.Presenter, int);
-    method protected void onAttachedToWindow(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
-    method protected void onBind(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
-    method public final void onBindViewHolder(android.support.v7.widget.RecyclerView.ViewHolder, int);
-    method protected void onCreate(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
-    method public final android.support.v7.widget.RecyclerView.ViewHolder onCreateViewHolder(android.view.ViewGroup, int);
-    method protected void onDetachedFromWindow(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
-    method protected void onUnbind(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
-    method public final void onViewAttachedToWindow(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public final void onViewDetachedFromWindow(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public final void onViewRecycled(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public void setAdapterListener(android.support.v17.leanback.widget.ItemBridgeAdapter.AdapterListener);
-    method public void setPresenterMapper(java.util.ArrayList<android.support.v17.leanback.widget.Presenter>);
-    method public void setWrapper(android.support.v17.leanback.widget.ItemBridgeAdapter.Wrapper);
-  }
-
-  public static class ItemBridgeAdapter.AdapterListener {
-    ctor public ItemBridgeAdapter.AdapterListener();
-    method public void onAddPresenter(android.support.v17.leanback.widget.Presenter, int);
-    method public void onAttachedToWindow(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
-    method public void onBind(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
-    method public void onCreate(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
-    method public void onDetachedFromWindow(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
-    method public void onUnbind(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
-  }
-
-  public class ItemBridgeAdapter.ViewHolder extends android.support.v7.widget.RecyclerView.ViewHolder implements android.support.v17.leanback.widget.FacetProvider {
-    method public final java.lang.Object getExtraObject();
-    method public java.lang.Object getFacet(java.lang.Class<?>);
-    method public final java.lang.Object getItem();
-    method public final android.support.v17.leanback.widget.Presenter getPresenter();
-    method public final android.support.v17.leanback.widget.Presenter.ViewHolder getViewHolder();
-    method public void setExtraObject(java.lang.Object);
-  }
-
-  public static abstract class ItemBridgeAdapter.Wrapper {
-    ctor public ItemBridgeAdapter.Wrapper();
-    method public abstract android.view.View createWrapper(android.view.View);
-    method public abstract void wrap(android.view.View, android.view.View);
-  }
-
-  public class ListRow extends android.support.v17.leanback.widget.Row {
-    ctor public ListRow(android.support.v17.leanback.widget.HeaderItem, android.support.v17.leanback.widget.ObjectAdapter);
-    ctor public ListRow(long, android.support.v17.leanback.widget.HeaderItem, android.support.v17.leanback.widget.ObjectAdapter);
-    ctor public ListRow(android.support.v17.leanback.widget.ObjectAdapter);
-    method public final android.support.v17.leanback.widget.ObjectAdapter getAdapter();
-  }
-
-  public final class ListRowHoverCardView extends android.widget.LinearLayout {
-    ctor public ListRowHoverCardView(android.content.Context);
-    ctor public ListRowHoverCardView(android.content.Context, android.util.AttributeSet);
-    ctor public ListRowHoverCardView(android.content.Context, android.util.AttributeSet, int);
-    method public final java.lang.CharSequence getDescription();
-    method public final java.lang.CharSequence getTitle();
-    method public final void setDescription(java.lang.CharSequence);
-    method public final void setTitle(java.lang.CharSequence);
-  }
-
-  public class ListRowPresenter extends android.support.v17.leanback.widget.RowPresenter {
-    ctor public ListRowPresenter();
-    ctor public ListRowPresenter(int);
-    ctor public ListRowPresenter(int, boolean);
-    method public final boolean areChildRoundedCornersEnabled();
-    method protected android.support.v17.leanback.widget.RowPresenter.ViewHolder createRowViewHolder(android.view.ViewGroup);
-    method public final void enableChildRoundedCorners(boolean);
-    method public int getExpandedRowHeight();
-    method public final int getFocusZoomFactor();
-    method public final android.support.v17.leanback.widget.PresenterSelector getHoverCardPresenterSelector();
-    method public int getRecycledPoolSize(android.support.v17.leanback.widget.Presenter);
-    method public int getRowHeight();
-    method public final boolean getShadowEnabled();
-    method public final deprecated int getZoomFactor();
-    method public final boolean isFocusDimmerUsed();
-    method public boolean isUsingDefaultListSelectEffect();
-    method public final boolean isUsingDefaultSelectEffect();
-    method public boolean isUsingDefaultShadow();
-    method public boolean isUsingZOrder(android.content.Context);
-    method public void setExpandedRowHeight(int);
-    method public final void setHoverCardPresenterSelector(android.support.v17.leanback.widget.PresenterSelector);
-    method public void setRecycledPoolSize(android.support.v17.leanback.widget.Presenter, int);
-    method public void setRowHeight(int);
-    method public final void setShadowEnabled(boolean);
-  }
-
-  public static class ListRowPresenter.ViewHolder extends android.support.v17.leanback.widget.RowPresenter.ViewHolder {
-    ctor public ListRowPresenter.ViewHolder(android.view.View, android.support.v17.leanback.widget.HorizontalGridView, android.support.v17.leanback.widget.ListRowPresenter);
-    method public final android.support.v17.leanback.widget.ItemBridgeAdapter getBridgeAdapter();
-    method public final android.support.v17.leanback.widget.HorizontalGridView getGridView();
-    method public final android.support.v17.leanback.widget.ListRowPresenter getListRowPresenter();
-  }
-
-  public final class ListRowView extends android.widget.LinearLayout {
-    ctor public ListRowView(android.content.Context);
-    ctor public ListRowView(android.content.Context, android.util.AttributeSet);
-    ctor public ListRowView(android.content.Context, android.util.AttributeSet, int);
-    method public android.support.v17.leanback.widget.HorizontalGridView getGridView();
-  }
-
-  public abstract class ObjectAdapter {
-    ctor public ObjectAdapter(android.support.v17.leanback.widget.PresenterSelector);
-    ctor public ObjectAdapter(android.support.v17.leanback.widget.Presenter);
-    ctor public ObjectAdapter();
-    method public abstract java.lang.Object get(int);
-    method public long getId(int);
-    method public final android.support.v17.leanback.widget.Presenter getPresenter(java.lang.Object);
-    method public final android.support.v17.leanback.widget.PresenterSelector getPresenterSelector();
-    method public final boolean hasStableIds();
-    method protected final void notifyChanged();
-    method protected final void notifyItemRangeChanged(int, int);
-    method protected final void notifyItemRangeInserted(int, int);
-    method protected final void notifyItemRangeRemoved(int, int);
-    method protected void onHasStableIdsChanged();
-    method protected void onPresenterSelectorChanged();
-    method public final void registerObserver(android.support.v17.leanback.widget.ObjectAdapter.DataObserver);
-    method public final void setHasStableIds(boolean);
-    method public final void setPresenterSelector(android.support.v17.leanback.widget.PresenterSelector);
-    method public abstract int size();
-    method public final void unregisterAllObservers();
-    method public final void unregisterObserver(android.support.v17.leanback.widget.ObjectAdapter.DataObserver);
-    field public static final int NO_ID = -1; // 0xffffffff
-  }
-
-  public static abstract class ObjectAdapter.DataObserver {
-    ctor public ObjectAdapter.DataObserver();
-    method public void onChanged();
-    method public void onItemRangeChanged(int, int);
-    method public void onItemRangeInserted(int, int);
-    method public void onItemRangeRemoved(int, int);
-  }
-
-  public abstract interface OnActionClickedListener {
-    method public abstract void onActionClicked(android.support.v17.leanback.widget.Action);
-  }
-
-  public abstract interface OnChildLaidOutListener {
-    method public abstract void onChildLaidOut(android.view.ViewGroup, android.view.View, int, long);
-  }
-
-  public abstract deprecated interface OnChildSelectedListener {
-    method public abstract void onChildSelected(android.view.ViewGroup, android.view.View, int, long);
-  }
-
-  public abstract class OnChildViewHolderSelectedListener {
-    ctor public OnChildViewHolderSelectedListener();
-    method public void onChildViewHolderSelected(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder, int, int);
-  }
-
-  public abstract interface OnItemViewClickedListener {
-    method public abstract void onItemClicked(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object, android.support.v17.leanback.widget.RowPresenter.ViewHolder, android.support.v17.leanback.widget.Row);
-  }
-
-  public abstract interface OnItemViewSelectedListener {
-    method public abstract void onItemSelected(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object, android.support.v17.leanback.widget.RowPresenter.ViewHolder, android.support.v17.leanback.widget.Row);
-  }
-
-  public class PlaybackControlsRow extends android.support.v17.leanback.widget.Row {
-    ctor public PlaybackControlsRow(java.lang.Object);
-    ctor public PlaybackControlsRow();
-    method public android.support.v17.leanback.widget.Action getActionForKeyCode(int);
-    method public android.support.v17.leanback.widget.Action getActionForKeyCode(android.support.v17.leanback.widget.ObjectAdapter, int);
-    method public int getBufferedProgress();
-    method public int getCurrentTime();
-    method public final android.graphics.drawable.Drawable getImageDrawable();
-    method public final java.lang.Object getItem();
-    method public final android.support.v17.leanback.widget.ObjectAdapter getPrimaryActionsAdapter();
-    method public final android.support.v17.leanback.widget.ObjectAdapter getSecondaryActionsAdapter();
-    method public int getTotalTime();
-    method public void setBufferedProgress(int);
-    method public void setCurrentTime(int);
-    method public final void setImageBitmap(android.content.Context, android.graphics.Bitmap);
-    method public final void setImageDrawable(android.graphics.drawable.Drawable);
-    method public final void setPrimaryActionsAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public final void setSecondaryActionsAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public void setTotalTime(int);
-  }
-
-  public static class PlaybackControlsRow.ClosedCaptioningAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
-    ctor public PlaybackControlsRow.ClosedCaptioningAction(android.content.Context);
-    ctor public PlaybackControlsRow.ClosedCaptioningAction(android.content.Context, int);
-    field public static int OFF;
-    field public static int ON;
-  }
-
-  public static class PlaybackControlsRow.FastForwardAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
-    ctor public PlaybackControlsRow.FastForwardAction(android.content.Context);
-    ctor public PlaybackControlsRow.FastForwardAction(android.content.Context, int);
-  }
-
-  public static class PlaybackControlsRow.HighQualityAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
-    ctor public PlaybackControlsRow.HighQualityAction(android.content.Context);
-    ctor public PlaybackControlsRow.HighQualityAction(android.content.Context, int);
-    field public static int OFF;
-    field public static int ON;
-  }
-
-  public static class PlaybackControlsRow.MoreActions extends android.support.v17.leanback.widget.Action {
-    ctor public PlaybackControlsRow.MoreActions(android.content.Context);
-  }
-
-  public static abstract class PlaybackControlsRow.MultiAction extends android.support.v17.leanback.widget.Action {
-    ctor public PlaybackControlsRow.MultiAction(int);
-    method public int getActionCount();
-    method public android.graphics.drawable.Drawable getDrawable(int);
-    method public int getIndex();
-    method public java.lang.String getLabel(int);
-    method public java.lang.String getSecondaryLabel(int);
-    method public void nextIndex();
-    method public void setDrawables(android.graphics.drawable.Drawable[]);
-    method public void setIndex(int);
-    method public void setLabels(java.lang.String[]);
-    method public void setSecondaryLabels(java.lang.String[]);
-  }
-
-  public static class PlaybackControlsRow.PlayPauseAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
-    ctor public PlaybackControlsRow.PlayPauseAction(android.content.Context);
-    field public static int PAUSE;
-    field public static int PLAY;
-  }
-
-  public static class PlaybackControlsRow.RepeatAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
-    ctor public PlaybackControlsRow.RepeatAction(android.content.Context);
-    ctor public PlaybackControlsRow.RepeatAction(android.content.Context, int);
-    ctor public PlaybackControlsRow.RepeatAction(android.content.Context, int, int);
-    field public static int ALL;
-    field public static int NONE;
-    field public static int ONE;
-  }
-
-  public static class PlaybackControlsRow.RewindAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
-    ctor public PlaybackControlsRow.RewindAction(android.content.Context);
-    ctor public PlaybackControlsRow.RewindAction(android.content.Context, int);
-  }
-
-  public static class PlaybackControlsRow.ShuffleAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
-    ctor public PlaybackControlsRow.ShuffleAction(android.content.Context);
-    ctor public PlaybackControlsRow.ShuffleAction(android.content.Context, int);
-    field public static int OFF;
-    field public static int ON;
-  }
-
-  public static class PlaybackControlsRow.SkipNextAction extends android.support.v17.leanback.widget.Action {
-    ctor public PlaybackControlsRow.SkipNextAction(android.content.Context);
-  }
-
-  public static class PlaybackControlsRow.SkipPreviousAction extends android.support.v17.leanback.widget.Action {
-    ctor public PlaybackControlsRow.SkipPreviousAction(android.content.Context);
-  }
-
-  public static abstract class PlaybackControlsRow.ThumbsAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
-    ctor public PlaybackControlsRow.ThumbsAction(int, android.content.Context, int, int);
-    field public static int OUTLINE;
-    field public static int SOLID;
-  }
-
-  public static class PlaybackControlsRow.ThumbsDownAction extends android.support.v17.leanback.widget.PlaybackControlsRow.ThumbsAction {
-    ctor public PlaybackControlsRow.ThumbsDownAction(android.content.Context);
-  }
-
-  public static class PlaybackControlsRow.ThumbsUpAction extends android.support.v17.leanback.widget.PlaybackControlsRow.ThumbsAction {
-    ctor public PlaybackControlsRow.ThumbsUpAction(android.content.Context);
-  }
-
-  public class PlaybackControlsRowPresenter extends android.support.v17.leanback.widget.RowPresenter {
-    ctor public PlaybackControlsRowPresenter(android.support.v17.leanback.widget.Presenter);
-    ctor public PlaybackControlsRowPresenter();
-    method public boolean areSecondaryActionsHidden();
-    method protected android.support.v17.leanback.widget.RowPresenter.ViewHolder createRowViewHolder(android.view.ViewGroup);
-    method public int getBackgroundColor();
-    method public android.support.v17.leanback.widget.OnActionClickedListener getOnActionClickedListener();
-    method public int getProgressColor();
-    method public void setBackgroundColor(int);
-    method public void setOnActionClickedListener(android.support.v17.leanback.widget.OnActionClickedListener);
-    method public void setProgressColor(int);
-    method public void setSecondaryActionsHidden(boolean);
-    method public void showBottomSpace(android.support.v17.leanback.widget.PlaybackControlsRowPresenter.ViewHolder, boolean);
-    method public void showPrimaryActions(android.support.v17.leanback.widget.PlaybackControlsRowPresenter.ViewHolder);
-  }
-
-  public class PlaybackControlsRowPresenter.ViewHolder extends android.support.v17.leanback.widget.RowPresenter.ViewHolder {
-    field public final android.support.v17.leanback.widget.Presenter.ViewHolder mDescriptionViewHolder;
-  }
-
-  public abstract class Presenter implements android.support.v17.leanback.widget.FacetProvider {
-    ctor public Presenter();
-    method protected static void cancelAnimationsRecursive(android.view.View);
-    method public final java.lang.Object getFacet(java.lang.Class<?>);
-    method public abstract void onBindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object);
-    method public abstract android.support.v17.leanback.widget.Presenter.ViewHolder onCreateViewHolder(android.view.ViewGroup);
-    method public abstract void onUnbindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public void onViewAttachedToWindow(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public void onViewDetachedFromWindow(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public final void setFacet(java.lang.Class<?>, java.lang.Object);
-    method public void setOnClickListener(android.support.v17.leanback.widget.Presenter.ViewHolder, android.view.View.OnClickListener);
-  }
-
-  public static class Presenter.ViewHolder implements android.support.v17.leanback.widget.FacetProvider {
-    ctor public Presenter.ViewHolder(android.view.View);
-    method public final java.lang.Object getFacet(java.lang.Class<?>);
-    method public final void setFacet(java.lang.Class<?>, java.lang.Object);
-    field public final android.view.View view;
-  }
-
-  public abstract class PresenterSelector {
-    ctor public PresenterSelector();
-    method public abstract android.support.v17.leanback.widget.Presenter getPresenter(java.lang.Object);
-    method public android.support.v17.leanback.widget.Presenter[] getPresenters();
-  }
-
-  public abstract class PresenterSwitcher {
-    ctor public PresenterSwitcher();
-    method public void clear();
-    method public final android.view.ViewGroup getParentViewGroup();
-    method public void init(android.view.ViewGroup, android.support.v17.leanback.widget.PresenterSelector);
-    method protected abstract void insertView(android.view.View);
-    method protected void onViewSelected(android.view.View);
-    method public void select(java.lang.Object);
-    method protected void showView(android.view.View, boolean);
-    method public void unselect();
-  }
-
-  public class Row {
-    ctor public Row(long, android.support.v17.leanback.widget.HeaderItem);
-    ctor public Row(android.support.v17.leanback.widget.HeaderItem);
-    ctor public Row();
-    method public final android.support.v17.leanback.widget.HeaderItem getHeaderItem();
-    method public final long getId();
-    method public final void setHeaderItem(android.support.v17.leanback.widget.HeaderItem);
-    method public final void setId(long);
-  }
-
-  public class RowHeaderPresenter extends android.support.v17.leanback.widget.Presenter {
-    ctor public RowHeaderPresenter();
-    method protected static float getFontDescent(android.widget.TextView, android.graphics.Paint);
-    method public int getSpaceUnderBaseline(android.support.v17.leanback.widget.RowHeaderPresenter.ViewHolder);
-    method public boolean isNullItemVisibilityGone();
-    method public void onBindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object);
-    method public android.support.v17.leanback.widget.Presenter.ViewHolder onCreateViewHolder(android.view.ViewGroup);
-    method protected void onSelectLevelChanged(android.support.v17.leanback.widget.RowHeaderPresenter.ViewHolder);
-    method public void onUnbindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public void setNullItemVisibilityGone(boolean);
-    method public final void setSelectLevel(android.support.v17.leanback.widget.RowHeaderPresenter.ViewHolder, float);
-  }
-
-  public static class RowHeaderPresenter.ViewHolder extends android.support.v17.leanback.widget.Presenter.ViewHolder {
-    ctor public RowHeaderPresenter.ViewHolder(android.view.View);
-    method public final float getSelectLevel();
-  }
-
-  public final class RowHeaderView extends android.widget.TextView {
-    ctor public RowHeaderView(android.content.Context);
-    ctor public RowHeaderView(android.content.Context, android.util.AttributeSet);
-    ctor public RowHeaderView(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public abstract class RowPresenter extends android.support.v17.leanback.widget.Presenter {
-    ctor public RowPresenter();
-    method public boolean canDrawOutOfBounds();
-    method protected abstract android.support.v17.leanback.widget.RowPresenter.ViewHolder createRowViewHolder(android.view.ViewGroup);
-    method protected void dispatchItemSelectedListener(android.support.v17.leanback.widget.RowPresenter.ViewHolder, boolean);
-    method public void freeze(android.support.v17.leanback.widget.RowPresenter.ViewHolder, boolean);
-    method public final android.support.v17.leanback.widget.RowHeaderPresenter getHeaderPresenter();
-    method public final android.support.v17.leanback.widget.RowPresenter.ViewHolder getRowViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public final boolean getSelectEffectEnabled();
-    method public final float getSelectLevel(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public final int getSyncActivatePolicy();
-    method protected void initializeRowViewHolder(android.support.v17.leanback.widget.RowPresenter.ViewHolder);
-    method protected boolean isClippingChildren();
-    method public boolean isUsingDefaultSelectEffect();
-    method protected void onBindRowViewHolder(android.support.v17.leanback.widget.RowPresenter.ViewHolder, java.lang.Object);
-    method public final void onBindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object);
-    method public final android.support.v17.leanback.widget.Presenter.ViewHolder onCreateViewHolder(android.view.ViewGroup);
-    method protected void onRowViewAttachedToWindow(android.support.v17.leanback.widget.RowPresenter.ViewHolder);
-    method protected void onRowViewDetachedFromWindow(android.support.v17.leanback.widget.RowPresenter.ViewHolder);
-    method protected void onRowViewExpanded(android.support.v17.leanback.widget.RowPresenter.ViewHolder, boolean);
-    method protected void onRowViewSelected(android.support.v17.leanback.widget.RowPresenter.ViewHolder, boolean);
-    method protected void onSelectLevelChanged(android.support.v17.leanback.widget.RowPresenter.ViewHolder);
-    method protected void onUnbindRowViewHolder(android.support.v17.leanback.widget.RowPresenter.ViewHolder);
-    method public final void onUnbindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public final void onViewAttachedToWindow(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public final void onViewDetachedFromWindow(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public void setEntranceTransitionState(android.support.v17.leanback.widget.RowPresenter.ViewHolder, boolean);
-    method public final void setHeaderPresenter(android.support.v17.leanback.widget.RowHeaderPresenter);
-    method public final void setRowViewExpanded(android.support.v17.leanback.widget.Presenter.ViewHolder, boolean);
-    method public final void setRowViewSelected(android.support.v17.leanback.widget.Presenter.ViewHolder, boolean);
-    method public final void setSelectEffectEnabled(boolean);
-    method public final void setSelectLevel(android.support.v17.leanback.widget.Presenter.ViewHolder, float);
-    method public final void setSyncActivatePolicy(int);
-    field public static final int SYNC_ACTIVATED_CUSTOM = 0; // 0x0
-    field public static final int SYNC_ACTIVATED_TO_EXPANDED = 1; // 0x1
-    field public static final int SYNC_ACTIVATED_TO_EXPANDED_AND_SELECTED = 3; // 0x3
-    field public static final int SYNC_ACTIVATED_TO_SELECTED = 2; // 0x2
-  }
-
-  public static class RowPresenter.ViewHolder extends android.support.v17.leanback.widget.Presenter.ViewHolder {
-    ctor public RowPresenter.ViewHolder(android.view.View);
-    method public final android.support.v17.leanback.widget.RowHeaderPresenter.ViewHolder getHeaderViewHolder();
-    method public final android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public final android.support.v17.leanback.widget.OnItemViewSelectedListener getOnItemViewSelectedListener();
-    method public android.view.View.OnKeyListener getOnKeyListener();
-    method public final android.support.v17.leanback.widget.Row getRow();
-    method public final float getSelectLevel();
-    method public final boolean isExpanded();
-    method public final boolean isSelected();
-    method public final void setActivated(boolean);
-    method public final void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public final void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public void setOnKeyListener(android.view.View.OnKeyListener);
-    method public final void syncActivatedStatus(android.view.View);
-    field protected final android.support.v17.leanback.graphics.ColorOverlayDimmer mColorDimmer;
-  }
-
-  public class SearchBar extends android.widget.RelativeLayout {
-    ctor public SearchBar(android.content.Context);
-    ctor public SearchBar(android.content.Context, android.util.AttributeSet);
-    ctor public SearchBar(android.content.Context, android.util.AttributeSet, int);
-    method public void displayCompletions(java.util.List<java.lang.String>);
-    method public android.graphics.drawable.Drawable getBadgeDrawable();
-    method public java.lang.CharSequence getHint();
-    method public java.lang.String getTitle();
-    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
-    method public void setSearchBarListener(android.support.v17.leanback.widget.SearchBar.SearchBarListener);
-    method public void setSearchQuery(java.lang.String);
-    method public void setSpeechRecognitionCallback(android.support.v17.leanback.widget.SpeechRecognitionCallback);
-    method public void setSpeechRecognizer(android.speech.SpeechRecognizer);
-    method public void setTitle(java.lang.String);
-    method public void startRecognition();
-    method public void stopRecognition();
-  }
-
-  public static abstract interface SearchBar.SearchBarListener {
-    method public abstract void onKeyboardDismiss(java.lang.String);
-    method public abstract void onSearchQueryChange(java.lang.String);
-    method public abstract void onSearchQuerySubmit(java.lang.String);
-  }
-
-  public class SearchEditText extends android.support.v17.leanback.widget.StreamingTextView {
-    ctor public SearchEditText(android.content.Context);
-    ctor public SearchEditText(android.content.Context, android.util.AttributeSet);
-    ctor public SearchEditText(android.content.Context, android.util.AttributeSet, int);
-    method public void setOnKeyboardDismissListener(android.support.v17.leanback.widget.SearchEditText.OnKeyboardDismissListener);
-  }
-
-  public static abstract interface SearchEditText.OnKeyboardDismissListener {
-    method public abstract void onKeyboardDismiss();
-  }
-
-  public class SearchOrbView extends android.widget.FrameLayout implements android.view.View.OnClickListener {
-    ctor public SearchOrbView(android.content.Context);
-    ctor public SearchOrbView(android.content.Context, android.util.AttributeSet);
-    ctor public SearchOrbView(android.content.Context, android.util.AttributeSet, int);
-    method public void enableOrbColorAnimation(boolean);
-    method public int getOrbColor();
-    method public android.support.v17.leanback.widget.SearchOrbView.Colors getOrbColors();
-    method public android.graphics.drawable.Drawable getOrbIcon();
-    method public void onClick(android.view.View);
-    method public void setOnOrbClickedListener(android.view.View.OnClickListener);
-    method public void setOrbColor(int);
-    method public deprecated void setOrbColor(int, int);
-    method public void setOrbColors(android.support.v17.leanback.widget.SearchOrbView.Colors);
-    method public void setOrbIcon(android.graphics.drawable.Drawable);
-  }
-
-  public static class SearchOrbView.Colors {
-    ctor public SearchOrbView.Colors(int);
-    ctor public SearchOrbView.Colors(int, int);
-    ctor public SearchOrbView.Colors(int, int, int);
-    method public static int getBrightColor(int);
-    field public int brightColor;
-    field public int color;
-    field public int iconColor;
-  }
-
-  public class ShadowOverlayContainer extends android.view.ViewGroup {
-    ctor public ShadowOverlayContainer(android.content.Context);
-    ctor public ShadowOverlayContainer(android.content.Context, android.util.AttributeSet);
-    ctor public ShadowOverlayContainer(android.content.Context, android.util.AttributeSet, int);
-    method public int getShadowType();
-    method public android.view.View getWrappedView();
-    method public deprecated void initialize(boolean, boolean);
-    method public void initialize(boolean, boolean, boolean);
-    method protected void onLayout(boolean, int, int, int, int);
-    method public static void prepareParentForShadow(android.view.ViewGroup);
-    method public void setOverlayColor(int);
-    method public void setShadowFocusLevel(float);
-    method public static boolean supportsDynamicShadow();
-    method public static boolean supportsShadow();
-    method public void useDynamicShadow();
-    method public void useDynamicShadow(float, float);
-    method public void useStaticShadow();
-    method public void wrap(android.view.View);
-    field public static final int SHADOW_DYNAMIC = 3; // 0x3
-    field public static final int SHADOW_NONE = 1; // 0x1
-    field public static final int SHADOW_STATIC = 2; // 0x2
-  }
-
-  public final class SinglePresenterSelector extends android.support.v17.leanback.widget.PresenterSelector {
-    ctor public SinglePresenterSelector(android.support.v17.leanback.widget.Presenter);
-    method public android.support.v17.leanback.widget.Presenter getPresenter(java.lang.Object);
-  }
-
-  public class SparseArrayObjectAdapter extends android.support.v17.leanback.widget.ObjectAdapter {
-    ctor public SparseArrayObjectAdapter(android.support.v17.leanback.widget.PresenterSelector);
-    ctor public SparseArrayObjectAdapter(android.support.v17.leanback.widget.Presenter);
-    ctor public SparseArrayObjectAdapter();
-    method public void clear(int);
-    method public void clear();
-    method public java.lang.Object get(int);
-    method public int indexOf(java.lang.Object);
-    method public int indexOf(int);
-    method public java.lang.Object lookup(int);
-    method public void notifyArrayItemRangeChanged(int, int);
-    method public void set(int, java.lang.Object);
-    method public int size();
-  }
-
-  public class SpeechOrbView extends android.support.v17.leanback.widget.SearchOrbView {
-    ctor public SpeechOrbView(android.content.Context);
-    ctor public SpeechOrbView(android.content.Context, android.util.AttributeSet);
-    ctor public SpeechOrbView(android.content.Context, android.util.AttributeSet, int);
-    method public void setSoundLevel(int);
-    method public void showListening();
-    method public void showNotListening();
-  }
-
-  public abstract interface SpeechRecognitionCallback {
-    method public abstract void recognizeSpeech();
-  }
-
-   class StreamingTextView extends android.widget.EditText {
-    ctor public StreamingTextView(android.content.Context, android.util.AttributeSet);
-    ctor public StreamingTextView(android.content.Context, android.util.AttributeSet, int);
-    method public static boolean isLayoutRtl(android.view.View);
-    method public void reset();
-    method public void setFinalRecognizedText(java.lang.CharSequence);
-    method public void updateRecognizedText(java.lang.String, java.lang.String);
-    method public void updateRecognizedText(java.lang.String, java.util.List<java.lang.Float>);
-  }
-
-  public class TitleHelper {
-    ctor public TitleHelper(android.view.ViewGroup, android.support.v17.leanback.widget.TitleView);
-    method public android.support.v17.leanback.widget.BrowseFrameLayout.OnFocusSearchListener getOnFocusSearchListener();
-    method public android.view.ViewGroup getSceneRoot();
-    method public android.support.v17.leanback.widget.TitleView getTitleView();
-    method public void showTitle(boolean);
-  }
-
-  public class TitleView extends android.widget.FrameLayout {
-    ctor public TitleView(android.content.Context);
-    ctor public TitleView(android.content.Context, android.util.AttributeSet);
-    ctor public TitleView(android.content.Context, android.util.AttributeSet, int);
-    method public void enableAnimation(boolean);
-    method public android.graphics.drawable.Drawable getBadgeDrawable();
-    method public android.support.v17.leanback.widget.SearchOrbView.Colors getSearchAffordanceColors();
-    method public android.view.View getSearchAffordanceView();
-    method public java.lang.CharSequence getTitle();
-    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
-    method public void setOnSearchClickedListener(android.view.View.OnClickListener);
-    method public void setSearchAffordanceColors(android.support.v17.leanback.widget.SearchOrbView.Colors);
-    method public void setTitle(java.lang.String);
-  }
-
-  public class VerticalGridPresenter extends android.support.v17.leanback.widget.Presenter {
-    ctor public VerticalGridPresenter();
-    ctor public VerticalGridPresenter(int);
-    ctor public VerticalGridPresenter(int, boolean);
-    method public final boolean areChildRoundedCornersEnabled();
-    method protected android.support.v17.leanback.widget.VerticalGridPresenter.ViewHolder createGridViewHolder(android.view.ViewGroup);
-    method public final void enableChildRoundedCorners(boolean);
-    method public final int getFocusZoomFactor();
-    method public int getNumberOfColumns();
-    method public final android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public final android.support.v17.leanback.widget.OnItemViewSelectedListener getOnItemViewSelectedListener();
-    method public final boolean getShadowEnabled();
-    method protected void initializeGridViewHolder(android.support.v17.leanback.widget.VerticalGridPresenter.ViewHolder);
-    method public final boolean isFocusDimmerUsed();
-    method public boolean isUsingDefaultShadow();
-    method public boolean isUsingZOrder(android.content.Context);
-    method public void onBindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object);
-    method public final android.support.v17.leanback.widget.VerticalGridPresenter.ViewHolder onCreateViewHolder(android.view.ViewGroup);
-    method public void onUnbindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public void setNumberOfColumns(int);
-    method public final void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public final void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public final void setShadowEnabled(boolean);
-  }
-
-  public static class VerticalGridPresenter.ViewHolder extends android.support.v17.leanback.widget.Presenter.ViewHolder {
-    ctor public VerticalGridPresenter.ViewHolder(android.support.v17.leanback.widget.VerticalGridView);
-    method public android.support.v17.leanback.widget.VerticalGridView getGridView();
-  }
-
-  public class VerticalGridView extends android.support.v7.widget.RecyclerView {
-    ctor public VerticalGridView(android.content.Context);
-    ctor public VerticalGridView(android.content.Context, android.util.AttributeSet);
-    ctor public VerticalGridView(android.content.Context, android.util.AttributeSet, int);
-    method protected void initAttributes(android.content.Context, android.util.AttributeSet);
-    method public void setColumnWidth(int);
-    method public void setNumColumns(int);
-  }
-
-}
-
diff --git a/v17/leanback/api/23.1.0.txt b/v17/leanback/api/23.1.0.txt
deleted file mode 100644
index 962367d..0000000
--- a/v17/leanback/api/23.1.0.txt
+++ /dev/null
@@ -1,1796 +0,0 @@
-package android.support.v17.leanback.app {
-
-  public final class BackgroundManager {
-    method public void attach(android.view.Window);
-    method public final int getColor();
-    method public android.graphics.drawable.Drawable getDefaultDimLayer();
-    method public android.graphics.drawable.Drawable getDimLayer();
-    method public android.graphics.drawable.Drawable getDrawable();
-    method public static android.support.v17.leanback.app.BackgroundManager getInstance(android.app.Activity);
-    method public boolean isAttached();
-    method public void release();
-    method public void setBitmap(android.graphics.Bitmap);
-    method public void setColor(int);
-    method public void setDimLayer(android.graphics.drawable.Drawable);
-    method public void setDrawable(android.graphics.drawable.Drawable);
-    method public void setThemeDrawableResourceId(int);
-  }
-
-   abstract class BaseRowFragment extends android.app.Fragment {
-    method public final android.support.v17.leanback.widget.ObjectAdapter getAdapter();
-    method public final android.support.v17.leanback.widget.PresenterSelector getPresenterSelector();
-    method public final void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public final void setPresenterSelector(android.support.v17.leanback.widget.PresenterSelector);
-    method public void setSelectedPosition(int);
-    method public void setSelectedPosition(int, boolean);
-  }
-
-   abstract class BaseRowSupportFragment extends android.support.v4.app.Fragment {
-    method public final android.support.v17.leanback.widget.ObjectAdapter getAdapter();
-    method public final android.support.v17.leanback.widget.PresenterSelector getPresenterSelector();
-    method public final void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public final void setPresenterSelector(android.support.v17.leanback.widget.PresenterSelector);
-    method public void setSelectedPosition(int);
-    method public void setSelectedPosition(int, boolean);
-  }
-
-  public class BrowseFragment extends android.support.v17.leanback.app.BrandedFragment {
-    ctor public BrowseFragment();
-    method public static android.os.Bundle createArgs(android.os.Bundle, java.lang.String, int);
-    method protected java.lang.Object createEntranceTransition();
-    method public void enableRowScaling(boolean);
-    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
-    method public int getBrandColor();
-    method public int getHeadersState();
-    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public android.support.v17.leanback.widget.OnItemViewSelectedListener getOnItemViewSelectedListener();
-    method public final boolean isHeadersTransitionOnBackEnabled();
-    method public boolean isInHeadersTransition();
-    method public boolean isShowingHeaders();
-    method protected void onEntranceTransitionEnd();
-    method protected void onEntranceTransitionPrepare();
-    method protected void onEntranceTransitionStart();
-    method public void onSaveInstanceState(android.os.Bundle);
-    method public void onStart();
-    method protected void runEntranceTransition(java.lang.Object);
-    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public void setBrandColor(int);
-    method public void setBrowseTransitionListener(android.support.v17.leanback.app.BrowseFragment.BrowseTransitionListener);
-    method public void setHeaderPresenterSelector(android.support.v17.leanback.widget.PresenterSelector);
-    method public void setHeadersState(int);
-    method public final void setHeadersTransitionOnBackEnabled(boolean);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public void setSelectedPosition(int);
-    method public void setSelectedPosition(int, boolean);
-    method public void startHeadersTransition(boolean);
-    field public static final int HEADERS_DISABLED = 3; // 0x3
-    field public static final int HEADERS_ENABLED = 1; // 0x1
-    field public static final int HEADERS_HIDDEN = 2; // 0x2
-  }
-
-  public static class BrowseFragment.BrowseTransitionListener {
-    ctor public BrowseFragment.BrowseTransitionListener();
-    method public void onHeadersTransitionStart(boolean);
-    method public void onHeadersTransitionStop(boolean);
-  }
-
-  public class BrowseSupportFragment extends android.support.v17.leanback.app.BrandedSupportFragment {
-    ctor public BrowseSupportFragment();
-    method public static android.os.Bundle createArgs(android.os.Bundle, java.lang.String, int);
-    method protected java.lang.Object createEntranceTransition();
-    method public void enableRowScaling(boolean);
-    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
-    method public int getBrandColor();
-    method public int getHeadersState();
-    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public android.support.v17.leanback.widget.OnItemViewSelectedListener getOnItemViewSelectedListener();
-    method public final boolean isHeadersTransitionOnBackEnabled();
-    method public boolean isInHeadersTransition();
-    method public boolean isShowingHeaders();
-    method protected void onEntranceTransitionEnd();
-    method protected void onEntranceTransitionPrepare();
-    method protected void onEntranceTransitionStart();
-    method public void onSaveInstanceState(android.os.Bundle);
-    method public void onStart();
-    method protected void runEntranceTransition(java.lang.Object);
-    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public void setBrandColor(int);
-    method public void setBrowseTransitionListener(android.support.v17.leanback.app.BrowseSupportFragment.BrowseTransitionListener);
-    method public void setHeaderPresenterSelector(android.support.v17.leanback.widget.PresenterSelector);
-    method public void setHeadersState(int);
-    method public final void setHeadersTransitionOnBackEnabled(boolean);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public void setSelectedPosition(int);
-    method public void setSelectedPosition(int, boolean);
-    method public void startHeadersTransition(boolean);
-    field public static final int HEADERS_DISABLED = 3; // 0x3
-    field public static final int HEADERS_ENABLED = 1; // 0x1
-    field public static final int HEADERS_HIDDEN = 2; // 0x2
-  }
-
-  public static class BrowseSupportFragment.BrowseTransitionListener {
-    ctor public BrowseSupportFragment.BrowseTransitionListener();
-    method public void onHeadersTransitionStart(boolean);
-    method public void onHeadersTransitionStop(boolean);
-  }
-
-  public class DetailsFragment extends android.support.v17.leanback.app.BrandedFragment {
-    ctor public DetailsFragment();
-    method protected java.lang.Object createEntranceTransition();
-    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
-    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method protected android.view.View inflateTitle(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
-    method protected void onEntranceTransitionEnd();
-    method protected void onEntranceTransitionPrepare();
-    method protected void onEntranceTransitionStart();
-    method protected void onSetDetailsOverviewRowStatus(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter, android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder, int, int, int);
-    method protected void onSetRowStatus(android.support.v17.leanback.widget.RowPresenter, android.support.v17.leanback.widget.RowPresenter.ViewHolder, int, int, int);
-    method public void onStart();
-    method protected void runEntranceTransition(java.lang.Object);
-    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public void setSelectedPosition(int);
-    method public void setSelectedPosition(int, boolean);
-    method protected void setupDetailsOverviewRowPresenter(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter);
-    method protected void setupPresenter(android.support.v17.leanback.widget.Presenter);
-  }
-
-  public class DetailsSupportFragment extends android.support.v17.leanback.app.BrandedSupportFragment {
-    ctor public DetailsSupportFragment();
-    method protected java.lang.Object createEntranceTransition();
-    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
-    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method protected android.view.View inflateTitle(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
-    method protected void onEntranceTransitionEnd();
-    method protected void onEntranceTransitionPrepare();
-    method protected void onEntranceTransitionStart();
-    method protected void onSetDetailsOverviewRowStatus(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter, android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder, int, int, int);
-    method protected void onSetRowStatus(android.support.v17.leanback.widget.RowPresenter, android.support.v17.leanback.widget.RowPresenter.ViewHolder, int, int, int);
-    method public void onStart();
-    method protected void runEntranceTransition(java.lang.Object);
-    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public void setSelectedPosition(int);
-    method public void setSelectedPosition(int, boolean);
-    method protected void setupDetailsOverviewRowPresenter(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter);
-    method protected void setupPresenter(android.support.v17.leanback.widget.Presenter);
-  }
-
-  public class ErrorFragment extends android.app.Fragment {
-    ctor public ErrorFragment();
-    method public android.graphics.drawable.Drawable getBackgroundDrawable();
-    method public android.graphics.drawable.Drawable getBadgeDrawable();
-    method public android.view.View.OnClickListener getButtonClickListener();
-    method public java.lang.String getButtonText();
-    method public android.graphics.drawable.Drawable getImageDrawable();
-    method public java.lang.CharSequence getMessage();
-    method public java.lang.String getTitle();
-    method public boolean isBackgroundTranslucent();
-    method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
-    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
-    method public void setButtonClickListener(android.view.View.OnClickListener);
-    method public void setButtonText(java.lang.String);
-    method public void setDefaultBackground(boolean);
-    method public void setImageDrawable(android.graphics.drawable.Drawable);
-    method public void setMessage(java.lang.CharSequence);
-    method public void setTitle(java.lang.String);
-  }
-
-  public class ErrorSupportFragment extends android.support.v4.app.Fragment {
-    ctor public ErrorSupportFragment();
-    method public android.graphics.drawable.Drawable getBackgroundDrawable();
-    method public android.graphics.drawable.Drawable getBadgeDrawable();
-    method public android.view.View.OnClickListener getButtonClickListener();
-    method public java.lang.String getButtonText();
-    method public android.graphics.drawable.Drawable getImageDrawable();
-    method public java.lang.CharSequence getMessage();
-    method public java.lang.String getTitle();
-    method public boolean isBackgroundTranslucent();
-    method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
-    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
-    method public void setButtonClickListener(android.view.View.OnClickListener);
-    method public void setButtonText(java.lang.String);
-    method public void setDefaultBackground(boolean);
-    method public void setImageDrawable(android.graphics.drawable.Drawable);
-    method public void setMessage(java.lang.CharSequence);
-    method public void setTitle(java.lang.String);
-  }
-
-  public class GuidedStepFragment extends android.app.Fragment {
-    ctor public GuidedStepFragment();
-    method public static int add(android.app.FragmentManager, android.support.v17.leanback.app.GuidedStepFragment);
-    method public static int add(android.app.FragmentManager, android.support.v17.leanback.app.GuidedStepFragment, int);
-    method public static int addAsRoot(android.app.Activity, android.support.v17.leanback.app.GuidedStepFragment, int);
-    method public android.view.View getActionItemView(int);
-    method public java.util.List<android.support.v17.leanback.widget.GuidedAction> getActions();
-    method protected int getContainerIdForBackground();
-    method public static android.support.v17.leanback.app.GuidedStepFragment getCurrentGuidedStepFragment(android.app.FragmentManager);
-    method public android.support.v17.leanback.widget.GuidanceStylist getGuidanceStylist();
-    method public android.support.v17.leanback.widget.GuidedActionsStylist getGuidedActionsStylist();
-    method public int getSelectedActionPosition();
-    method public int getUiStyle();
-    method public void onCreateActions(java.util.List<android.support.v17.leanback.widget.GuidedAction>, android.os.Bundle);
-    method public android.support.v17.leanback.widget.GuidedActionsStylist onCreateActionsStylist();
-    method public android.support.v17.leanback.widget.GuidanceStylist.Guidance onCreateGuidance(android.os.Bundle);
-    method public android.support.v17.leanback.widget.GuidanceStylist onCreateGuidanceStylist();
-    method public void onGuidedActionClicked(android.support.v17.leanback.widget.GuidedAction);
-    method public void onGuidedActionEdited(android.support.v17.leanback.widget.GuidedAction);
-    method public void onGuidedActionFocused(android.support.v17.leanback.widget.GuidedAction);
-    method protected android.app.Fragment onProvideBackgroundFragment();
-    method protected void onProvideFragmentTransitions();
-    method public int onProvideTheme();
-    method public void setActions(java.util.List<android.support.v17.leanback.widget.GuidedAction>);
-    method public void setSelectedActionPosition(int);
-    method public void setUiStyle(int);
-    field public static final java.lang.String EXTRA_UI_STYLE = "uiStyle";
-    field public static final int UI_STYLE_ACTIVITY_ROOT = 2; // 0x2
-    field public static final int UI_STYLE_DEFAULT = 0; // 0x0
-    field public static final int UI_STYLE_ENTRANCE = 1; // 0x1
-  }
-
-  public static class GuidedStepFragment.GuidedStepBackgroundFragment extends android.app.Fragment {
-    ctor public GuidedStepFragment.GuidedStepBackgroundFragment();
-    method protected void onProvideFragmentTransitions();
-  }
-
-  public class GuidedStepSupportFragment extends android.support.v4.app.Fragment {
-    ctor public GuidedStepSupportFragment();
-    method public static int add(android.support.v4.app.FragmentManager, android.support.v17.leanback.app.GuidedStepSupportFragment);
-    method public static int add(android.support.v4.app.FragmentManager, android.support.v17.leanback.app.GuidedStepSupportFragment, int);
-    method public static int addAsRoot(android.support.v4.app.FragmentActivity, android.support.v17.leanback.app.GuidedStepSupportFragment, int);
-    method public android.view.View getActionItemView(int);
-    method public java.util.List<android.support.v17.leanback.widget.GuidedAction> getActions();
-    method protected int getContainerIdForBackground();
-    method public static android.support.v17.leanback.app.GuidedStepSupportFragment getCurrentGuidedStepSupportFragment(android.support.v4.app.FragmentManager);
-    method public android.support.v17.leanback.widget.GuidanceStylist getGuidanceStylist();
-    method public android.support.v17.leanback.widget.GuidedActionsStylist getGuidedActionsStylist();
-    method public int getSelectedActionPosition();
-    method public int getUiStyle();
-    method public void onCreateActions(java.util.List<android.support.v17.leanback.widget.GuidedAction>, android.os.Bundle);
-    method public android.support.v17.leanback.widget.GuidedActionsStylist onCreateActionsStylist();
-    method public android.support.v17.leanback.widget.GuidanceStylist.Guidance onCreateGuidance(android.os.Bundle);
-    method public android.support.v17.leanback.widget.GuidanceStylist onCreateGuidanceStylist();
-    method public void onGuidedActionClicked(android.support.v17.leanback.widget.GuidedAction);
-    method public void onGuidedActionEdited(android.support.v17.leanback.widget.GuidedAction);
-    method public void onGuidedActionFocused(android.support.v17.leanback.widget.GuidedAction);
-    method protected android.support.v4.app.Fragment onProvideBackgroundSupportFragment();
-    method protected void onProvideFragmentTransitions();
-    method public int onProvideTheme();
-    method public void setActions(java.util.List<android.support.v17.leanback.widget.GuidedAction>);
-    method public void setSelectedActionPosition(int);
-    method public void setUiStyle(int);
-    field public static final java.lang.String EXTRA_UI_STYLE = "uiStyle";
-    field public static final int UI_STYLE_ACTIVITY_ROOT = 2; // 0x2
-    field public static final int UI_STYLE_DEFAULT = 0; // 0x0
-    field public static final int UI_STYLE_ENTRANCE = 1; // 0x1
-  }
-
-  public static class GuidedStepSupportFragment.GuidedStepBackgroundSupportFragment extends android.support.v4.app.Fragment {
-    ctor public GuidedStepSupportFragment.GuidedStepBackgroundSupportFragment();
-    method protected void onProvideFragmentTransitions();
-  }
-
-  public class HeadersFragment extends android.support.v17.leanback.app.BaseRowFragment {
-    ctor public HeadersFragment();
-    method public void setOnHeaderClickedListener(android.support.v17.leanback.app.HeadersFragment.OnHeaderClickedListener);
-    method public void setOnHeaderViewSelectedListener(android.support.v17.leanback.app.HeadersFragment.OnHeaderViewSelectedListener);
-  }
-
-   static abstract interface HeadersFragment.OnHeaderClickedListener {
-    method public abstract void onHeaderClicked();
-  }
-
-   static abstract interface HeadersFragment.OnHeaderViewSelectedListener {
-    method public abstract void onHeaderSelected(android.support.v17.leanback.widget.RowHeaderPresenter.ViewHolder, android.support.v17.leanback.widget.Row);
-  }
-
-  public class HeadersSupportFragment extends android.support.v17.leanback.app.BaseRowSupportFragment {
-    ctor public HeadersSupportFragment();
-    method public void setOnHeaderClickedListener(android.support.v17.leanback.app.HeadersSupportFragment.OnHeaderClickedListener);
-    method public void setOnHeaderViewSelectedListener(android.support.v17.leanback.app.HeadersSupportFragment.OnHeaderViewSelectedListener);
-  }
-
-   static abstract interface HeadersSupportFragment.OnHeaderClickedListener {
-    method public abstract void onHeaderClicked();
-  }
-
-   static abstract interface HeadersSupportFragment.OnHeaderViewSelectedListener {
-    method public abstract void onHeaderSelected(android.support.v17.leanback.widget.RowHeaderPresenter.ViewHolder, android.support.v17.leanback.widget.Row);
-  }
-
-  public abstract class MediaControllerGlue extends android.support.v17.leanback.app.PlaybackControlGlue {
-    ctor public MediaControllerGlue(android.content.Context, android.support.v17.leanback.app.PlaybackOverlayFragment, int[]);
-    ctor public MediaControllerGlue(android.content.Context, android.support.v17.leanback.app.PlaybackOverlayFragment, int[], int[]);
-    method public void attachToMediaController(android.support.v4.media.session.MediaControllerCompat);
-    method public void detach();
-    method public int getCurrentPosition();
-    method public int getCurrentSpeedId();
-    method public android.graphics.drawable.Drawable getMediaArt();
-    method public final android.support.v4.media.session.MediaControllerCompat getMediaController();
-    method public int getMediaDuration();
-    method public java.lang.CharSequence getMediaSubtitle();
-    method public java.lang.CharSequence getMediaTitle();
-    method public long getSupportedActions();
-    method public boolean hasValidMedia();
-    method public boolean isMediaPlaying();
-    method protected void pausePlayback();
-    method protected void skipToNext();
-    method protected void skipToPrevious();
-    method protected void startPlayback(int);
-  }
-
-  public abstract class PlaybackControlGlue implements android.support.v17.leanback.widget.OnActionClickedListener android.view.View.OnKeyListener {
-    ctor public PlaybackControlGlue(android.content.Context, int[]);
-    ctor public PlaybackControlGlue(android.content.Context, int[], int[]);
-    ctor public PlaybackControlGlue(android.content.Context, android.support.v17.leanback.app.PlaybackOverlayFragment, int[]);
-    ctor public PlaybackControlGlue(android.content.Context, android.support.v17.leanback.app.PlaybackOverlayFragment, int[], int[]);
-    method public android.support.v17.leanback.widget.PlaybackControlsRowPresenter createControlsRowAndPresenter();
-    method protected android.support.v17.leanback.widget.SparseArrayObjectAdapter createPrimaryActionsAdapter(android.support.v17.leanback.widget.PresenterSelector);
-    method public void enableProgressUpdating(boolean);
-    method public android.content.Context getContext();
-    method public android.support.v17.leanback.widget.PlaybackControlsRow getControlsRow();
-    method public abstract int getCurrentPosition();
-    method public abstract int getCurrentSpeedId();
-    method public int[] getFastForwardSpeeds();
-    method public android.support.v17.leanback.app.PlaybackOverlayFragment getFragment();
-    method public abstract android.graphics.drawable.Drawable getMediaArt();
-    method public abstract int getMediaDuration();
-    method public abstract java.lang.CharSequence getMediaSubtitle();
-    method public abstract java.lang.CharSequence getMediaTitle();
-    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public int[] getRewindSpeeds();
-    method public abstract long getSupportedActions();
-    method public int getUpdatePeriod();
-    method public abstract boolean hasValidMedia();
-    method public boolean isFadingEnabled();
-    method public abstract boolean isMediaPlaying();
-    method public void onActionClicked(android.support.v17.leanback.widget.Action);
-    method public boolean onKey(android.view.View, int, android.view.KeyEvent);
-    method protected void onMetadataChanged();
-    method protected abstract void onRowChanged(android.support.v17.leanback.widget.PlaybackControlsRow);
-    method protected void onStateChanged();
-    method protected abstract void pausePlayback();
-    method public void setControlsRow(android.support.v17.leanback.widget.PlaybackControlsRow);
-    method public void setFadingEnabled(boolean);
-    method public deprecated void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method protected abstract void skipToNext();
-    method protected abstract void skipToPrevious();
-    method protected abstract void startPlayback(int);
-    method public void updateProgress();
-    field public static final int ACTION_CUSTOM_LEFT_FIRST = 1; // 0x1
-    field public static final int ACTION_CUSTOM_RIGHT_FIRST = 4096; // 0x1000
-    field public static final int ACTION_FAST_FORWARD = 128; // 0x80
-    field public static final int ACTION_PLAY_PAUSE = 64; // 0x40
-    field public static final int ACTION_REWIND = 32; // 0x20
-    field public static final int ACTION_SKIP_TO_NEXT = 256; // 0x100
-    field public static final int ACTION_SKIP_TO_PREVIOUS = 16; // 0x10
-    field public static final int PLAYBACK_SPEED_FAST_L0 = 10; // 0xa
-    field public static final int PLAYBACK_SPEED_FAST_L1 = 11; // 0xb
-    field public static final int PLAYBACK_SPEED_FAST_L2 = 12; // 0xc
-    field public static final int PLAYBACK_SPEED_FAST_L3 = 13; // 0xd
-    field public static final int PLAYBACK_SPEED_FAST_L4 = 14; // 0xe
-    field public static final int PLAYBACK_SPEED_INVALID = -1; // 0xffffffff
-    field public static final int PLAYBACK_SPEED_NORMAL = 1; // 0x1
-    field public static final int PLAYBACK_SPEED_PAUSED = 0; // 0x0
-  }
-
-  public abstract class PlaybackControlSupportGlue implements android.support.v17.leanback.widget.OnActionClickedListener android.view.View.OnKeyListener {
-    ctor public PlaybackControlSupportGlue(android.content.Context, int[]);
-    ctor public PlaybackControlSupportGlue(android.content.Context, int[], int[]);
-    ctor public PlaybackControlSupportGlue(android.content.Context, android.support.v17.leanback.app.PlaybackOverlaySupportFragment, int[]);
-    ctor public PlaybackControlSupportGlue(android.content.Context, android.support.v17.leanback.app.PlaybackOverlaySupportFragment, int[], int[]);
-    method public android.support.v17.leanback.widget.PlaybackControlsRowPresenter createControlsRowAndPresenter();
-    method protected android.support.v17.leanback.widget.SparseArrayObjectAdapter createPrimaryActionsAdapter(android.support.v17.leanback.widget.PresenterSelector);
-    method public void enableProgressUpdating(boolean);
-    method public android.content.Context getContext();
-    method public android.support.v17.leanback.widget.PlaybackControlsRow getControlsRow();
-    method public abstract int getCurrentPosition();
-    method public abstract int getCurrentSpeedId();
-    method public int[] getFastForwardSpeeds();
-    method public android.support.v17.leanback.app.PlaybackOverlaySupportFragment getFragment();
-    method public abstract android.graphics.drawable.Drawable getMediaArt();
-    method public abstract int getMediaDuration();
-    method public abstract java.lang.CharSequence getMediaSubtitle();
-    method public abstract java.lang.CharSequence getMediaTitle();
-    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public int[] getRewindSpeeds();
-    method public abstract long getSupportedActions();
-    method public int getUpdatePeriod();
-    method public abstract boolean hasValidMedia();
-    method public boolean isFadingEnabled();
-    method public abstract boolean isMediaPlaying();
-    method public void onActionClicked(android.support.v17.leanback.widget.Action);
-    method public boolean onKey(android.view.View, int, android.view.KeyEvent);
-    method protected void onMetadataChanged();
-    method protected abstract void onRowChanged(android.support.v17.leanback.widget.PlaybackControlsRow);
-    method protected void onStateChanged();
-    method protected abstract void pausePlayback();
-    method public void setControlsRow(android.support.v17.leanback.widget.PlaybackControlsRow);
-    method public void setFadingEnabled(boolean);
-    method public deprecated void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method protected abstract void skipToNext();
-    method protected abstract void skipToPrevious();
-    method protected abstract void startPlayback(int);
-    method public void updateProgress();
-    field public static final int ACTION_CUSTOM_LEFT_FIRST = 1; // 0x1
-    field public static final int ACTION_CUSTOM_RIGHT_FIRST = 4096; // 0x1000
-    field public static final int ACTION_FAST_FORWARD = 128; // 0x80
-    field public static final int ACTION_PLAY_PAUSE = 64; // 0x40
-    field public static final int ACTION_REWIND = 32; // 0x20
-    field public static final int ACTION_SKIP_TO_NEXT = 256; // 0x100
-    field public static final int ACTION_SKIP_TO_PREVIOUS = 16; // 0x10
-    field public static final int PLAYBACK_SPEED_FAST_L0 = 10; // 0xa
-    field public static final int PLAYBACK_SPEED_FAST_L1 = 11; // 0xb
-    field public static final int PLAYBACK_SPEED_FAST_L2 = 12; // 0xc
-    field public static final int PLAYBACK_SPEED_FAST_L3 = 13; // 0xd
-    field public static final int PLAYBACK_SPEED_FAST_L4 = 14; // 0xe
-    field public static final int PLAYBACK_SPEED_INVALID = -1; // 0xffffffff
-    field public static final int PLAYBACK_SPEED_NORMAL = 1; // 0x1
-    field public static final int PLAYBACK_SPEED_PAUSED = 0; // 0x0
-  }
-
-  public class PlaybackOverlayFragment extends android.support.v17.leanback.app.DetailsFragment {
-    ctor public PlaybackOverlayFragment();
-    method public int getBackgroundType();
-    method public android.support.v17.leanback.app.PlaybackOverlayFragment.OnFadeCompleteListener getFadeCompleteListener();
-    method public final android.support.v17.leanback.app.PlaybackOverlayFragment.InputEventHandler getInputEventHandler();
-    method public boolean isFadingEnabled();
-    method public void onDestroyView();
-    method public void onResume();
-    method public void setBackgroundType(int);
-    method public void setFadeCompleteListener(android.support.v17.leanback.app.PlaybackOverlayFragment.OnFadeCompleteListener);
-    method public void setFadingEnabled(boolean);
-    method public final void setInputEventHandler(android.support.v17.leanback.app.PlaybackOverlayFragment.InputEventHandler);
-    method public void tickle();
-    field public static final int BG_DARK = 1; // 0x1
-    field public static final int BG_LIGHT = 2; // 0x2
-    field public static final int BG_NONE = 0; // 0x0
-  }
-
-  public static abstract interface PlaybackOverlayFragment.InputEventHandler {
-    method public abstract boolean handleInputEvent(android.view.InputEvent);
-  }
-
-  public static class PlaybackOverlayFragment.OnFadeCompleteListener {
-    ctor public PlaybackOverlayFragment.OnFadeCompleteListener();
-    method public void onFadeInComplete();
-    method public void onFadeOutComplete();
-  }
-
-  public class PlaybackOverlaySupportFragment extends android.support.v17.leanback.app.DetailsSupportFragment {
-    ctor public PlaybackOverlaySupportFragment();
-    method public int getBackgroundType();
-    method public android.support.v17.leanback.app.PlaybackOverlaySupportFragment.OnFadeCompleteListener getFadeCompleteListener();
-    method public final android.support.v17.leanback.app.PlaybackOverlaySupportFragment.InputEventHandler getInputEventHandler();
-    method public boolean isFadingEnabled();
-    method public void onDestroyView();
-    method public void onResume();
-    method public void setBackgroundType(int);
-    method public void setFadeCompleteListener(android.support.v17.leanback.app.PlaybackOverlaySupportFragment.OnFadeCompleteListener);
-    method public void setFadingEnabled(boolean);
-    method public final void setInputEventHandler(android.support.v17.leanback.app.PlaybackOverlaySupportFragment.InputEventHandler);
-    method public void tickle();
-    field public static final int BG_DARK = 1; // 0x1
-    field public static final int BG_LIGHT = 2; // 0x2
-    field public static final int BG_NONE = 0; // 0x0
-  }
-
-  public static abstract interface PlaybackOverlaySupportFragment.InputEventHandler {
-    method public abstract boolean handleInputEvent(android.view.InputEvent);
-  }
-
-  public static class PlaybackOverlaySupportFragment.OnFadeCompleteListener {
-    ctor public PlaybackOverlaySupportFragment.OnFadeCompleteListener();
-    method public void onFadeInComplete();
-    method public void onFadeOutComplete();
-  }
-
-  public class RowsFragment extends android.support.v17.leanback.app.BaseRowFragment {
-    ctor public RowsFragment();
-    method public void enableRowScaling(boolean);
-    method protected android.support.v17.leanback.widget.VerticalGridView findGridViewFromRoot(android.view.View);
-    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public android.support.v17.leanback.widget.OnItemViewSelectedListener getOnItemViewSelectedListener();
-    method public void setExpand(boolean);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-  }
-
-  public class RowsSupportFragment extends android.support.v17.leanback.app.BaseRowSupportFragment {
-    ctor public RowsSupportFragment();
-    method public void enableRowScaling(boolean);
-    method protected android.support.v17.leanback.widget.VerticalGridView findGridViewFromRoot(android.view.View);
-    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public android.support.v17.leanback.widget.OnItemViewSelectedListener getOnItemViewSelectedListener();
-    method public void setExpand(boolean);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-  }
-
-  public class SearchFragment extends android.app.Fragment {
-    ctor public SearchFragment();
-    method public static android.os.Bundle createArgs(android.os.Bundle, java.lang.String);
-    method public static android.os.Bundle createArgs(android.os.Bundle, java.lang.String, java.lang.String);
-    method public void displayCompletions(java.util.List<java.lang.String>);
-    method public void displayCompletions(android.view.inputmethod.CompletionInfo[]);
-    method public android.graphics.drawable.Drawable getBadgeDrawable();
-    method public android.content.Intent getRecognizerIntent();
-    method public java.lang.String getTitle();
-    method public static android.support.v17.leanback.app.SearchFragment newInstance(java.lang.String);
-    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public void setSearchQuery(java.lang.String, boolean);
-    method public void setSearchQuery(android.content.Intent, boolean);
-    method public void setSearchResultProvider(android.support.v17.leanback.app.SearchFragment.SearchResultProvider);
-    method public void setSpeechRecognitionCallback(android.support.v17.leanback.widget.SpeechRecognitionCallback);
-    method public void setTitle(java.lang.String);
-    method public void startRecognition();
-  }
-
-  public static abstract interface SearchFragment.SearchResultProvider {
-    method public abstract android.support.v17.leanback.widget.ObjectAdapter getResultsAdapter();
-    method public abstract boolean onQueryTextChange(java.lang.String);
-    method public abstract boolean onQueryTextSubmit(java.lang.String);
-  }
-
-  public class SearchSupportFragment extends android.support.v4.app.Fragment {
-    ctor public SearchSupportFragment();
-    method public static android.os.Bundle createArgs(android.os.Bundle, java.lang.String);
-    method public static android.os.Bundle createArgs(android.os.Bundle, java.lang.String, java.lang.String);
-    method public void displayCompletions(java.util.List<java.lang.String>);
-    method public void displayCompletions(android.view.inputmethod.CompletionInfo[]);
-    method public android.graphics.drawable.Drawable getBadgeDrawable();
-    method public android.content.Intent getRecognizerIntent();
-    method public java.lang.String getTitle();
-    method public static android.support.v17.leanback.app.SearchSupportFragment newInstance(java.lang.String);
-    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public void setSearchQuery(java.lang.String, boolean);
-    method public void setSearchQuery(android.content.Intent, boolean);
-    method public void setSearchResultProvider(android.support.v17.leanback.app.SearchSupportFragment.SearchResultProvider);
-    method public void setSpeechRecognitionCallback(android.support.v17.leanback.widget.SpeechRecognitionCallback);
-    method public void setTitle(java.lang.String);
-    method public void startRecognition();
-  }
-
-  public static abstract interface SearchSupportFragment.SearchResultProvider {
-    method public abstract android.support.v17.leanback.widget.ObjectAdapter getResultsAdapter();
-    method public abstract boolean onQueryTextChange(java.lang.String);
-    method public abstract boolean onQueryTextSubmit(java.lang.String);
-  }
-
-  public class VerticalGridFragment extends android.support.v17.leanback.app.BrandedFragment {
-    ctor public VerticalGridFragment();
-    method protected java.lang.Object createEntranceTransition();
-    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
-    method public android.support.v17.leanback.widget.VerticalGridPresenter getGridPresenter();
-    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public void onDestroyView();
-    method public void onStart();
-    method public void onViewCreated(android.view.View, android.os.Bundle);
-    method protected void runEntranceTransition(java.lang.Object);
-    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public void setGridPresenter(android.support.v17.leanback.widget.VerticalGridPresenter);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public void setSelectedPosition(int);
-  }
-
-  public class VerticalGridSupportFragment extends android.support.v17.leanback.app.BrandedSupportFragment {
-    ctor public VerticalGridSupportFragment();
-    method protected java.lang.Object createEntranceTransition();
-    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
-    method public android.support.v17.leanback.widget.VerticalGridPresenter getGridPresenter();
-    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public void onDestroyView();
-    method public void onStart();
-    method public void onViewCreated(android.view.View, android.os.Bundle);
-    method protected void runEntranceTransition(java.lang.Object);
-    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public void setGridPresenter(android.support.v17.leanback.widget.VerticalGridPresenter);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public void setSelectedPosition(int);
-  }
-
-}
-
-package android.support.v17.leanback.database {
-
-  public abstract class CursorMapper {
-    ctor public CursorMapper();
-    method protected abstract java.lang.Object bind(android.database.Cursor);
-    method protected abstract void bindColumns(android.database.Cursor);
-    method public java.lang.Object convert(android.database.Cursor);
-  }
-
-}
-
-package android.support.v17.leanback.graphics {
-
-  public final class ColorFilterCache {
-    method public static android.support.v17.leanback.graphics.ColorFilterCache getColorFilterCache(int);
-    method public android.graphics.ColorFilter getFilterForLevel(float);
-  }
-
-  public final class ColorFilterDimmer {
-    method public void applyFilterToView(android.view.View);
-    method public static android.support.v17.leanback.graphics.ColorFilterDimmer create(android.support.v17.leanback.graphics.ColorFilterCache, float, float);
-    method public static android.support.v17.leanback.graphics.ColorFilterDimmer createDefault(android.content.Context);
-    method public android.graphics.ColorFilter getColorFilter();
-    method public android.graphics.Paint getPaint();
-    method public void setActiveLevel(float);
-  }
-
-  public final class ColorOverlayDimmer {
-    method public int applyToColor(int);
-    method public static android.support.v17.leanback.graphics.ColorOverlayDimmer createColorOverlayDimmer(int, float, float);
-    method public static android.support.v17.leanback.graphics.ColorOverlayDimmer createDefault(android.content.Context);
-    method public void drawColorOverlay(android.graphics.Canvas, android.view.View, boolean);
-    method public int getAlpha();
-    method public float getAlphaFloat();
-    method public android.graphics.Paint getPaint();
-    method public boolean needsDraw();
-    method public void setActiveLevel(float);
-  }
-
-}
-
-package android.support.v17.leanback.system {
-
-  public class Settings {
-    method public boolean getBoolean(java.lang.String);
-    method public static android.support.v17.leanback.system.Settings getInstance(android.content.Context);
-    method public void setBoolean(java.lang.String, boolean);
-    field public static final java.lang.String PREFER_STATIC_SHADOWS = "PREFER_STATIC_SHADOWS";
-  }
-
-}
-
-package android.support.v17.leanback.widget {
-
-  public abstract class AbstractDetailsDescriptionPresenter extends android.support.v17.leanback.widget.Presenter {
-    ctor public AbstractDetailsDescriptionPresenter();
-    method protected abstract void onBindDescription(android.support.v17.leanback.widget.AbstractDetailsDescriptionPresenter.ViewHolder, java.lang.Object);
-    method public final void onBindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object);
-    method public final android.support.v17.leanback.widget.AbstractDetailsDescriptionPresenter.ViewHolder onCreateViewHolder(android.view.ViewGroup);
-    method public void onUnbindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
-  }
-
-  public static class AbstractDetailsDescriptionPresenter.ViewHolder extends android.support.v17.leanback.widget.Presenter.ViewHolder {
-    ctor public AbstractDetailsDescriptionPresenter.ViewHolder(android.view.View);
-    method public android.widget.TextView getBody();
-    method public android.widget.TextView getSubtitle();
-    method public android.widget.TextView getTitle();
-  }
-
-  public class Action {
-    ctor public Action(long);
-    ctor public Action(long, java.lang.CharSequence);
-    ctor public Action(long, java.lang.CharSequence, java.lang.CharSequence);
-    ctor public Action(long, java.lang.CharSequence, java.lang.CharSequence, android.graphics.drawable.Drawable);
-    method public final void addKeyCode(int);
-    method public final android.graphics.drawable.Drawable getIcon();
-    method public final long getId();
-    method public final java.lang.CharSequence getLabel1();
-    method public final java.lang.CharSequence getLabel2();
-    method public final void removeKeyCode(int);
-    method public final boolean respondsToKeyCode(int);
-    method public final void setIcon(android.graphics.drawable.Drawable);
-    method public final void setId(long);
-    method public final void setLabel1(java.lang.CharSequence);
-    method public final void setLabel2(java.lang.CharSequence);
-  }
-
-  public class ArrayObjectAdapter extends android.support.v17.leanback.widget.ObjectAdapter {
-    ctor public ArrayObjectAdapter(android.support.v17.leanback.widget.PresenterSelector);
-    ctor public ArrayObjectAdapter(android.support.v17.leanback.widget.Presenter);
-    ctor public ArrayObjectAdapter();
-    method public void add(java.lang.Object);
-    method public void add(int, java.lang.Object);
-    method public void addAll(int, java.util.Collection);
-    method public void clear();
-    method public java.lang.Object get(int);
-    method public int indexOf(java.lang.Object);
-    method public void notifyArrayItemRangeChanged(int, int);
-    method public boolean remove(java.lang.Object);
-    method public int removeItems(int, int);
-    method public void replace(int, java.lang.Object);
-    method public int size();
-    method public java.util.List<E> unmodifiableList();
-  }
-
-  public class BaseCardView extends android.widget.FrameLayout {
-    ctor public BaseCardView(android.content.Context);
-    ctor public BaseCardView(android.content.Context, android.util.AttributeSet);
-    ctor public BaseCardView(android.content.Context, android.util.AttributeSet, int);
-    method public int getCardType();
-    method public int getExtraVisibility();
-    method public int getInfoVisibility();
-    method public boolean isSelectedAnimationDelayed();
-    method public void setCardType(int);
-    method public void setExtraVisibility(int);
-    method public void setInfoVisibility(int);
-    method public void setSelectedAnimationDelayed(boolean);
-    field public static final int CARD_REGION_VISIBLE_ACTIVATED = 1; // 0x1
-    field public static final int CARD_REGION_VISIBLE_ALWAYS = 0; // 0x0
-    field public static final int CARD_REGION_VISIBLE_SELECTED = 2; // 0x2
-    field public static final int CARD_TYPE_INFO_OVER = 1; // 0x1
-    field public static final int CARD_TYPE_INFO_UNDER = 2; // 0x2
-    field public static final int CARD_TYPE_INFO_UNDER_WITH_EXTRA = 3; // 0x3
-    field public static final int CARD_TYPE_MAIN_ONLY = 0; // 0x0
-  }
-
-  public static class BaseCardView.LayoutParams extends android.widget.FrameLayout.LayoutParams {
-    ctor public BaseCardView.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public BaseCardView.LayoutParams(int, int);
-    ctor public BaseCardView.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public BaseCardView.LayoutParams(android.support.v17.leanback.widget.BaseCardView.LayoutParams);
-    field public static final int VIEW_TYPE_EXTRA = 2; // 0x2
-    field public static final int VIEW_TYPE_INFO = 1; // 0x1
-    field public static final int VIEW_TYPE_MAIN = 0; // 0x0
-    field public int viewType;
-  }
-
-  public class BrowseFrameLayout extends android.widget.FrameLayout {
-    ctor public BrowseFrameLayout(android.content.Context);
-    ctor public BrowseFrameLayout(android.content.Context, android.util.AttributeSet);
-    ctor public BrowseFrameLayout(android.content.Context, android.util.AttributeSet, int);
-    method public android.support.v17.leanback.widget.BrowseFrameLayout.OnChildFocusListener getOnChildFocusListener();
-    method public android.support.v17.leanback.widget.BrowseFrameLayout.OnFocusSearchListener getOnFocusSearchListener();
-    method public void setOnChildFocusListener(android.support.v17.leanback.widget.BrowseFrameLayout.OnChildFocusListener);
-    method public void setOnFocusSearchListener(android.support.v17.leanback.widget.BrowseFrameLayout.OnFocusSearchListener);
-  }
-
-  public static abstract interface BrowseFrameLayout.OnChildFocusListener {
-    method public abstract void onRequestChildFocus(android.view.View, android.view.View);
-    method public abstract boolean onRequestFocusInDescendants(int, android.graphics.Rect);
-  }
-
-  public static abstract interface BrowseFrameLayout.OnFocusSearchListener {
-    method public abstract android.view.View onFocusSearch(android.view.View, int);
-  }
-
-  public final class ClassPresenterSelector extends android.support.v17.leanback.widget.PresenterSelector {
-    ctor public ClassPresenterSelector();
-    method public void addClassPresenter(java.lang.Class<?>, android.support.v17.leanback.widget.Presenter);
-    method public android.support.v17.leanback.widget.Presenter getPresenter(java.lang.Object);
-  }
-
-  public class ControlButtonPresenterSelector extends android.support.v17.leanback.widget.PresenterSelector {
-    ctor public ControlButtonPresenterSelector();
-    method public android.support.v17.leanback.widget.Presenter getPresenter(java.lang.Object);
-    method public android.support.v17.leanback.widget.Presenter getPrimaryPresenter();
-    method public android.support.v17.leanback.widget.Presenter getSecondaryPresenter();
-  }
-
-  public class CursorObjectAdapter extends android.support.v17.leanback.widget.ObjectAdapter {
-    ctor public CursorObjectAdapter(android.support.v17.leanback.widget.PresenterSelector);
-    ctor public CursorObjectAdapter(android.support.v17.leanback.widget.Presenter);
-    ctor public CursorObjectAdapter();
-    method public void changeCursor(android.database.Cursor);
-    method public void close();
-    method public java.lang.Object get(int);
-    method public final android.database.Cursor getCursor();
-    method public final android.support.v17.leanback.database.CursorMapper getMapper();
-    method protected final void invalidateCache(int);
-    method protected final void invalidateCache(int, int);
-    method public boolean isClosed();
-    method protected void onCursorChanged();
-    method protected void onMapperChanged();
-    method public final void setMapper(android.support.v17.leanback.database.CursorMapper);
-    method public int size();
-    method public android.database.Cursor swapCursor(android.database.Cursor);
-  }
-
-  public class DetailsOverviewLogoPresenter extends android.support.v17.leanback.widget.Presenter {
-    ctor public DetailsOverviewLogoPresenter();
-    method public boolean isBoundToImage(android.support.v17.leanback.widget.DetailsOverviewLogoPresenter.ViewHolder, android.support.v17.leanback.widget.DetailsOverviewRow);
-    method public void onBindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object);
-    method public android.support.v17.leanback.widget.Presenter.ViewHolder onCreateViewHolder(android.view.ViewGroup);
-    method public void onUnbindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public void setContext(android.support.v17.leanback.widget.DetailsOverviewLogoPresenter.ViewHolder, android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder, android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter);
-  }
-
-  public static class DetailsOverviewLogoPresenter.ViewHolder extends android.support.v17.leanback.widget.Presenter.ViewHolder {
-    ctor public DetailsOverviewLogoPresenter.ViewHolder(android.view.View);
-    field protected android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter mParentPresenter;
-    field protected android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder mParentViewHolder;
-  }
-
-  public class DetailsOverviewRow extends android.support.v17.leanback.widget.Row {
-    ctor public DetailsOverviewRow(java.lang.Object);
-    method public final deprecated void addAction(android.support.v17.leanback.widget.Action);
-    method public final deprecated void addAction(int, android.support.v17.leanback.widget.Action);
-    method public android.support.v17.leanback.widget.Action getActionForKeyCode(int);
-    method public final deprecated java.util.List<android.support.v17.leanback.widget.Action> getActions();
-    method public final android.support.v17.leanback.widget.ObjectAdapter getActionsAdapter();
-    method public final android.graphics.drawable.Drawable getImageDrawable();
-    method public final java.lang.Object getItem();
-    method public boolean isImageScaleUpAllowed();
-    method public final deprecated boolean removeAction(android.support.v17.leanback.widget.Action);
-    method public final void setActionsAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public final void setImageBitmap(android.content.Context, android.graphics.Bitmap);
-    method public final void setImageDrawable(android.graphics.drawable.Drawable);
-    method public void setImageScaleUpAllowed(boolean);
-    method public final void setItem(java.lang.Object);
-  }
-
-  public static class DetailsOverviewRow.Listener {
-    ctor public DetailsOverviewRow.Listener();
-    method public void onActionsAdapterChanged(android.support.v17.leanback.widget.DetailsOverviewRow);
-    method public void onImageDrawableChanged(android.support.v17.leanback.widget.DetailsOverviewRow);
-    method public void onItemChanged(android.support.v17.leanback.widget.DetailsOverviewRow);
-  }
-
-  public deprecated class DetailsOverviewRowPresenter extends android.support.v17.leanback.widget.RowPresenter {
-    ctor public DetailsOverviewRowPresenter(android.support.v17.leanback.widget.Presenter);
-    method protected android.support.v17.leanback.widget.RowPresenter.ViewHolder createRowViewHolder(android.view.ViewGroup);
-    method public int getBackgroundColor();
-    method public android.support.v17.leanback.widget.OnActionClickedListener getOnActionClickedListener();
-    method public boolean isStyleLarge();
-    method public final boolean isUsingDefaultSelectEffect();
-    method public void setBackgroundColor(int);
-    method public void setOnActionClickedListener(android.support.v17.leanback.widget.OnActionClickedListener);
-    method public final void setSharedElementEnterTransition(android.app.Activity, java.lang.String, long);
-    method public final void setSharedElementEnterTransition(android.app.Activity, java.lang.String);
-    method public void setStyleLarge(boolean);
-  }
-
-  public final class DetailsOverviewRowPresenter.ViewHolder extends android.support.v17.leanback.widget.RowPresenter.ViewHolder {
-    ctor public DetailsOverviewRowPresenter.ViewHolder(android.view.View, android.support.v17.leanback.widget.Presenter);
-    field public final android.support.v17.leanback.widget.Presenter.ViewHolder mDetailsDescriptionViewHolder;
-  }
-
-  public abstract interface FacetProvider {
-    method public abstract java.lang.Object getFacet(java.lang.Class<?>);
-  }
-
-  public abstract interface FacetProviderAdapter {
-    method public abstract android.support.v17.leanback.widget.FacetProvider getFacetProvider(int);
-  }
-
-  public abstract interface FocusHighlight {
-    field public static final int ZOOM_FACTOR_LARGE = 3; // 0x3
-    field public static final int ZOOM_FACTOR_MEDIUM = 2; // 0x2
-    field public static final int ZOOM_FACTOR_NONE = 0; // 0x0
-    field public static final int ZOOM_FACTOR_SMALL = 1; // 0x1
-    field public static final int ZOOM_FACTOR_XSMALL = 4; // 0x4
-  }
-
-  public class FocusHighlightHelper {
-    ctor public FocusHighlightHelper();
-    method public static void setupBrowseItemFocusHighlight(android.support.v17.leanback.widget.ItemBridgeAdapter, int, boolean);
-    method public static void setupHeaderItemFocusHighlight(android.support.v17.leanback.widget.VerticalGridView);
-  }
-
-  public abstract interface FragmentAnimationProvider {
-    method public abstract void onImeAppearing(java.util.List<android.animation.Animator>);
-    method public abstract void onImeDisappearing(java.util.List<android.animation.Animator>);
-  }
-
-  public class FullWidthDetailsOverviewRowPresenter extends android.support.v17.leanback.widget.RowPresenter {
-    ctor public FullWidthDetailsOverviewRowPresenter(android.support.v17.leanback.widget.Presenter);
-    ctor public FullWidthDetailsOverviewRowPresenter(android.support.v17.leanback.widget.Presenter, android.support.v17.leanback.widget.DetailsOverviewLogoPresenter);
-    method protected android.support.v17.leanback.widget.RowPresenter.ViewHolder createRowViewHolder(android.view.ViewGroup);
-    method public final int getActionsBackgroundColor();
-    method public final int getAlignmentMode();
-    method public final int getBackgroundColor();
-    method public final int getInitialState();
-    method protected int getLayoutResourceId();
-    method public android.support.v17.leanback.widget.OnActionClickedListener getOnActionClickedListener();
-    method public final boolean isParticipatingEntranceTransition();
-    method public final boolean isUsingDefaultSelectEffect();
-    method public final void notifyOnBindLogo(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder);
-    method protected void onLayoutLogo(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder, int, boolean);
-    method protected void onLayoutOverviewFrame(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder, int, boolean);
-    method protected void onStateChanged(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder, int);
-    method public final void setActionsBackgroundColor(int);
-    method public final void setAlignmentMode(int);
-    method public final void setBackgroundColor(int);
-    method public final void setInitialState(int);
-    method public final void setListener(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.Listener);
-    method public void setOnActionClickedListener(android.support.v17.leanback.widget.OnActionClickedListener);
-    method public final void setParticipatingEntranceTransition(boolean);
-    method public final void setState(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder, int);
-    field public static final int ALIGN_MODE_MIDDLE = 1; // 0x1
-    field public static final int ALIGN_MODE_START = 0; // 0x0
-    field public static final int STATE_FULL = 1; // 0x1
-    field public static final int STATE_HALF = 0; // 0x0
-    field public static final int STATE_SMALL = 2; // 0x2
-    field protected int mInitialState;
-  }
-
-  public static abstract class FullWidthDetailsOverviewRowPresenter.Listener {
-    ctor public FullWidthDetailsOverviewRowPresenter.Listener();
-    method public void onBindLogo(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder);
-  }
-
-  public class FullWidthDetailsOverviewRowPresenter.ViewHolder extends android.support.v17.leanback.widget.RowPresenter.ViewHolder {
-    ctor public FullWidthDetailsOverviewRowPresenter.ViewHolder(android.view.View, android.support.v17.leanback.widget.Presenter, android.support.v17.leanback.widget.DetailsOverviewLogoPresenter);
-    method protected android.support.v17.leanback.widget.DetailsOverviewRow.Listener createRowListener();
-    method public final android.view.ViewGroup getActionsRow();
-    method public final android.view.ViewGroup getDetailsDescriptionFrame();
-    method public final android.support.v17.leanback.widget.Presenter.ViewHolder getDetailsDescriptionViewHolder();
-    method public final android.support.v17.leanback.widget.DetailsOverviewLogoPresenter.ViewHolder getLogoViewHolder();
-    method public final android.view.ViewGroup getOverviewView();
-    method public final int getState();
-    field protected final android.support.v17.leanback.widget.DetailsOverviewRow.Listener mRowListener;
-  }
-
-  public class FullWidthDetailsOverviewRowPresenter.ViewHolder.DetailsOverviewRowListener extends android.support.v17.leanback.widget.DetailsOverviewRow.Listener {
-    ctor public FullWidthDetailsOverviewRowPresenter.ViewHolder.DetailsOverviewRowListener();
-  }
-
-  public class FullWidthDetailsOverviewSharedElementHelper extends android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.Listener {
-    ctor public FullWidthDetailsOverviewSharedElementHelper();
-    method public boolean getAutoStartSharedElementTransition();
-    method public void setAutoStartSharedElementTransition(boolean);
-    method public void setSharedElementEnterTransition(android.app.Activity, java.lang.String);
-    method public void setSharedElementEnterTransition(android.app.Activity, java.lang.String, long);
-    method public void startPostponedEnterTransition();
-  }
-
-  public class GuidanceStylist implements android.support.v17.leanback.widget.FragmentAnimationProvider {
-    ctor public GuidanceStylist();
-    method public android.widget.TextView getBreadcrumbView();
-    method public android.widget.TextView getDescriptionView();
-    method public android.widget.ImageView getIconView();
-    method public android.widget.TextView getTitleView();
-    method public android.view.View onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.support.v17.leanback.widget.GuidanceStylist.Guidance);
-    method public void onImeAppearing(java.util.List<android.animation.Animator>);
-    method public void onImeDisappearing(java.util.List<android.animation.Animator>);
-    method public int onProvideLayoutId();
-  }
-
-  public static class GuidanceStylist.Guidance {
-    ctor public GuidanceStylist.Guidance(java.lang.String, java.lang.String, java.lang.String, android.graphics.drawable.Drawable);
-    method public java.lang.String getBreadcrumb();
-    method public java.lang.String getDescription();
-    method public android.graphics.drawable.Drawable getIconDrawable();
-    method public java.lang.String getTitle();
-  }
-
-  public class GuidedAction extends android.support.v17.leanback.widget.Action {
-    method public int getCheckSetId();
-    method public java.lang.CharSequence getDescription();
-    method public java.lang.CharSequence getEditTitle();
-    method public android.content.Intent getIntent();
-    method public java.lang.CharSequence getTitle();
-    method public boolean hasMultilineDescription();
-    method public boolean hasNext();
-    method public boolean infoOnly();
-    method public boolean isChecked();
-    method public boolean isEditTitleUsed();
-    method public boolean isEditable();
-    method public boolean isEnabled();
-    method public void setChecked(boolean);
-    method public void setDescription(java.lang.CharSequence);
-    method public void setEditTitle(java.lang.CharSequence);
-    method public void setEnabled(boolean);
-    method public void setTitle(java.lang.CharSequence);
-    field public static final int DEFAULT_CHECK_SET_ID = 1; // 0x1
-    field public static final int NO_CHECK_SET = 0; // 0x0
-    field public static final int NO_DRAWABLE = 0; // 0x0
-  }
-
-  public static class GuidedAction.Builder {
-    ctor public GuidedAction.Builder();
-    method public android.support.v17.leanback.widget.GuidedAction build();
-    method public android.support.v17.leanback.widget.GuidedAction.Builder checkSetId(int);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder checked(boolean);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder description(java.lang.String);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder editTitle(java.lang.String);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder editable(boolean);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder enabled(boolean);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder hasNext(boolean);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder icon(android.graphics.drawable.Drawable);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder iconResourceId(int, android.content.Context);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder id(long);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder infoOnly(boolean);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder intent(android.content.Intent);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder multilineDescription(boolean);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder title(java.lang.String);
-  }
-
-  public class GuidedActionEditText extends android.widget.EditText implements android.support.v17.leanback.widget.ImeKeyMonitor {
-    ctor public GuidedActionEditText(android.content.Context);
-    ctor public GuidedActionEditText(android.content.Context, android.util.AttributeSet);
-    ctor public GuidedActionEditText(android.content.Context, android.util.AttributeSet, int);
-    method public void setImeKeyListener(android.support.v17.leanback.widget.ImeKeyMonitor.ImeKeyListener);
-  }
-
-  public class GuidedActionsStylist implements android.support.v17.leanback.widget.FragmentAnimationProvider {
-    ctor public GuidedActionsStylist();
-    method public android.support.v17.leanback.widget.VerticalGridView getActionsGridView();
-    method public void onAnimateItemChecked(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, boolean);
-    method public void onAnimateItemFocused(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, boolean);
-    method public void onAnimateItemPressed(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, boolean);
-    method public void onBindViewHolder(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, android.support.v17.leanback.widget.GuidedAction);
-    method public android.view.View onCreateView(android.view.LayoutInflater, android.view.ViewGroup);
-    method public android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder onCreateViewHolder(android.view.ViewGroup);
-    method public void onImeAppearing(java.util.List<android.animation.Animator>);
-    method public void onImeDisappearing(java.util.List<android.animation.Animator>);
-    method public int onProvideItemLayoutId();
-    method public int onProvideLayoutId();
-    field protected android.support.v17.leanback.widget.VerticalGridView mActionsGridView;
-    field protected android.view.View mMainView;
-    field protected android.view.View mSelectorView;
-  }
-
-  public static class GuidedActionsStylist.ViewHolder {
-    ctor public GuidedActionsStylist.ViewHolder(android.view.View);
-    method public android.widget.ImageView getCheckmarkView();
-    method public android.widget.ImageView getChevronView();
-    method public android.view.View getContentView();
-    method public android.widget.TextView getDescriptionView();
-    method public android.widget.EditText getEditableTitleView();
-    method public android.widget.ImageView getIconView();
-    method public android.widget.TextView getTitleView();
-    field public final android.view.View view;
-  }
-
-  public class HeaderItem {
-    ctor public HeaderItem(long, java.lang.String);
-    ctor public HeaderItem(java.lang.String);
-    method public final long getId();
-    method public final java.lang.String getName();
-  }
-
-  public class HorizontalGridView extends android.support.v7.widget.RecyclerView {
-    ctor public HorizontalGridView(android.content.Context);
-    ctor public HorizontalGridView(android.content.Context, android.util.AttributeSet);
-    ctor public HorizontalGridView(android.content.Context, android.util.AttributeSet, int);
-    method public final boolean getFadingLeftEdge();
-    method public final int getFadingLeftEdgeLength();
-    method public final int getFadingLeftEdgeOffset();
-    method public final boolean getFadingRightEdge();
-    method public final int getFadingRightEdgeLength();
-    method public final int getFadingRightEdgeOffset();
-    method protected void initAttributes(android.content.Context, android.util.AttributeSet);
-    method public final void setFadingLeftEdge(boolean);
-    method public final void setFadingLeftEdgeLength(int);
-    method public final void setFadingLeftEdgeOffset(int);
-    method public final void setFadingRightEdge(boolean);
-    method public final void setFadingRightEdgeLength(int);
-    method public final void setFadingRightEdgeOffset(int);
-    method public void setNumRows(int);
-    method public void setRowHeight(int);
-  }
-
-  public final class HorizontalHoverCardSwitcher extends android.support.v17.leanback.widget.PresenterSwitcher {
-    ctor public HorizontalHoverCardSwitcher();
-    method protected void insertView(android.view.View);
-    method public void select(android.support.v17.leanback.widget.HorizontalGridView, android.view.View, java.lang.Object);
-  }
-
-  public class ImageCardView extends android.support.v17.leanback.widget.BaseCardView {
-    ctor public ImageCardView(android.content.Context, int);
-    ctor public ImageCardView(android.content.Context, android.util.AttributeSet, int);
-    ctor public ImageCardView(android.content.Context);
-    ctor public ImageCardView(android.content.Context, android.util.AttributeSet);
-    method public android.graphics.drawable.Drawable getBadgeImage();
-    method public java.lang.CharSequence getContentText();
-    method public android.graphics.drawable.Drawable getInfoAreaBackground();
-    method public android.graphics.drawable.Drawable getMainImage();
-    method public final android.widget.ImageView getMainImageView();
-    method public java.lang.CharSequence getTitleText();
-    method public void setBadgeImage(android.graphics.drawable.Drawable);
-    method public void setContentText(java.lang.CharSequence);
-    method public void setInfoAreaBackground(android.graphics.drawable.Drawable);
-    method public void setInfoAreaBackgroundColor(int);
-    method public void setMainImage(android.graphics.drawable.Drawable);
-    method public void setMainImage(android.graphics.drawable.Drawable, boolean);
-    method public void setMainImageAdjustViewBounds(boolean);
-    method public void setMainImageDimensions(int, int);
-    method public void setMainImageScaleType(android.widget.ImageView.ScaleType);
-    method public void setTitleText(java.lang.CharSequence);
-    field public static final int CARD_TYPE_FLAG_CONTENT = 2; // 0x2
-    field public static final int CARD_TYPE_FLAG_ICON_LEFT = 8; // 0x8
-    field public static final int CARD_TYPE_FLAG_ICON_RIGHT = 4; // 0x4
-    field public static final int CARD_TYPE_FLAG_IMAGE_ONLY = 0; // 0x0
-    field public static final int CARD_TYPE_FLAG_TITLE = 1; // 0x1
-  }
-
-  public abstract interface ImeKeyMonitor {
-    method public abstract void setImeKeyListener(android.support.v17.leanback.widget.ImeKeyMonitor.ImeKeyListener);
-  }
-
-  public static abstract interface ImeKeyMonitor.ImeKeyListener {
-    method public abstract boolean onKeyPreIme(android.widget.EditText, int, android.view.KeyEvent);
-  }
-
-  public final class ItemAlignmentFacet {
-    ctor public ItemAlignmentFacet();
-    method public android.support.v17.leanback.widget.ItemAlignmentFacet.ItemAlignmentDef[] getAlignmentDefs();
-    method public boolean isMultiAlignment();
-    method public void setAlignmentDefs(android.support.v17.leanback.widget.ItemAlignmentFacet.ItemAlignmentDef[]);
-    field public static final float ITEM_ALIGN_OFFSET_PERCENT_DISABLED = -1.0f;
-  }
-
-  public static class ItemAlignmentFacet.ItemAlignmentDef {
-    ctor public ItemAlignmentFacet.ItemAlignmentDef();
-    method public final int getItemAlignmentFocusViewId();
-    method public final int getItemAlignmentOffset();
-    method public final float getItemAlignmentOffsetPercent();
-    method public final int getItemAlignmentViewId();
-    method public final boolean isItemAlignmentOffsetWithPadding();
-    method public final void setItemAlignmentFocusViewId(int);
-    method public final void setItemAlignmentOffset(int);
-    method public final void setItemAlignmentOffsetPercent(float);
-    method public final void setItemAlignmentOffsetWithPadding(boolean);
-    method public final void setItemAlignmentViewId(int);
-  }
-
-  public class ItemBridgeAdapter extends android.support.v7.widget.RecyclerView.Adapter implements android.support.v17.leanback.widget.FacetProviderAdapter {
-    ctor public ItemBridgeAdapter(android.support.v17.leanback.widget.ObjectAdapter, android.support.v17.leanback.widget.PresenterSelector);
-    ctor public ItemBridgeAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    ctor public ItemBridgeAdapter();
-    method public void clear();
-    method public android.support.v17.leanback.widget.FacetProvider getFacetProvider(int);
-    method public int getItemCount();
-    method public java.util.ArrayList<android.support.v17.leanback.widget.Presenter> getPresenterMapper();
-    method public android.support.v17.leanback.widget.ItemBridgeAdapter.Wrapper getWrapper();
-    method protected void onAddPresenter(android.support.v17.leanback.widget.Presenter, int);
-    method protected void onAttachedToWindow(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
-    method protected void onBind(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
-    method public final void onBindViewHolder(android.support.v7.widget.RecyclerView.ViewHolder, int);
-    method protected void onCreate(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
-    method public final android.support.v7.widget.RecyclerView.ViewHolder onCreateViewHolder(android.view.ViewGroup, int);
-    method protected void onDetachedFromWindow(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
-    method protected void onUnbind(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
-    method public final void onViewAttachedToWindow(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public final void onViewDetachedFromWindow(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public final void onViewRecycled(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public void setAdapterListener(android.support.v17.leanback.widget.ItemBridgeAdapter.AdapterListener);
-    method public void setPresenterMapper(java.util.ArrayList<android.support.v17.leanback.widget.Presenter>);
-    method public void setWrapper(android.support.v17.leanback.widget.ItemBridgeAdapter.Wrapper);
-  }
-
-  public static class ItemBridgeAdapter.AdapterListener {
-    ctor public ItemBridgeAdapter.AdapterListener();
-    method public void onAddPresenter(android.support.v17.leanback.widget.Presenter, int);
-    method public void onAttachedToWindow(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
-    method public void onBind(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
-    method public void onCreate(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
-    method public void onDetachedFromWindow(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
-    method public void onUnbind(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
-  }
-
-  public class ItemBridgeAdapter.ViewHolder extends android.support.v7.widget.RecyclerView.ViewHolder implements android.support.v17.leanback.widget.FacetProvider {
-    method public final java.lang.Object getExtraObject();
-    method public java.lang.Object getFacet(java.lang.Class<?>);
-    method public final java.lang.Object getItem();
-    method public final android.support.v17.leanback.widget.Presenter getPresenter();
-    method public final android.support.v17.leanback.widget.Presenter.ViewHolder getViewHolder();
-    method public void setExtraObject(java.lang.Object);
-  }
-
-  public static abstract class ItemBridgeAdapter.Wrapper {
-    ctor public ItemBridgeAdapter.Wrapper();
-    method public abstract android.view.View createWrapper(android.view.View);
-    method public abstract void wrap(android.view.View, android.view.View);
-  }
-
-  public class ItemBridgeAdapterShadowOverlayWrapper extends android.support.v17.leanback.widget.ItemBridgeAdapter.Wrapper {
-    ctor public ItemBridgeAdapterShadowOverlayWrapper(android.support.v17.leanback.widget.ShadowOverlayHelper);
-    method public android.view.View createWrapper(android.view.View);
-    method public void wrap(android.view.View, android.view.View);
-  }
-
-  public class ListRow extends android.support.v17.leanback.widget.Row {
-    ctor public ListRow(android.support.v17.leanback.widget.HeaderItem, android.support.v17.leanback.widget.ObjectAdapter);
-    ctor public ListRow(long, android.support.v17.leanback.widget.HeaderItem, android.support.v17.leanback.widget.ObjectAdapter);
-    ctor public ListRow(android.support.v17.leanback.widget.ObjectAdapter);
-    method public final android.support.v17.leanback.widget.ObjectAdapter getAdapter();
-  }
-
-  public final class ListRowHoverCardView extends android.widget.LinearLayout {
-    ctor public ListRowHoverCardView(android.content.Context);
-    ctor public ListRowHoverCardView(android.content.Context, android.util.AttributeSet);
-    ctor public ListRowHoverCardView(android.content.Context, android.util.AttributeSet, int);
-    method public final java.lang.CharSequence getDescription();
-    method public final java.lang.CharSequence getTitle();
-    method public final void setDescription(java.lang.CharSequence);
-    method public final void setTitle(java.lang.CharSequence);
-  }
-
-  public class ListRowPresenter extends android.support.v17.leanback.widget.RowPresenter {
-    ctor public ListRowPresenter();
-    ctor public ListRowPresenter(int);
-    ctor public ListRowPresenter(int, boolean);
-    method public final boolean areChildRoundedCornersEnabled();
-    method protected android.support.v17.leanback.widget.RowPresenter.ViewHolder createRowViewHolder(android.view.ViewGroup);
-    method protected android.support.v17.leanback.widget.ShadowOverlayHelper.Options createShadowOverlayOptions();
-    method public final void enableChildRoundedCorners(boolean);
-    method public int getExpandedRowHeight();
-    method public final int getFocusZoomFactor();
-    method public final android.support.v17.leanback.widget.PresenterSelector getHoverCardPresenterSelector();
-    method public int getRecycledPoolSize(android.support.v17.leanback.widget.Presenter);
-    method public int getRowHeight();
-    method public final boolean getShadowEnabled();
-    method public final deprecated int getZoomFactor();
-    method public final boolean isFocusDimmerUsed();
-    method public final boolean isKeepChildForeground();
-    method public boolean isUsingDefaultListSelectEffect();
-    method public final boolean isUsingDefaultSelectEffect();
-    method public boolean isUsingDefaultShadow();
-    method public boolean isUsingZOrder(android.content.Context);
-    method public void setExpandedRowHeight(int);
-    method public final void setHoverCardPresenterSelector(android.support.v17.leanback.widget.PresenterSelector);
-    method public final void setKeepChildForeground(boolean);
-    method public void setRecycledPoolSize(android.support.v17.leanback.widget.Presenter, int);
-    method public void setRowHeight(int);
-    method public final void setShadowEnabled(boolean);
-  }
-
-  public static class ListRowPresenter.ViewHolder extends android.support.v17.leanback.widget.RowPresenter.ViewHolder {
-    ctor public ListRowPresenter.ViewHolder(android.view.View, android.support.v17.leanback.widget.HorizontalGridView, android.support.v17.leanback.widget.ListRowPresenter);
-    method public final android.support.v17.leanback.widget.ItemBridgeAdapter getBridgeAdapter();
-    method public final android.support.v17.leanback.widget.HorizontalGridView getGridView();
-    method public final android.support.v17.leanback.widget.ListRowPresenter getListRowPresenter();
-  }
-
-  public final class ListRowView extends android.widget.LinearLayout {
-    ctor public ListRowView(android.content.Context);
-    ctor public ListRowView(android.content.Context, android.util.AttributeSet);
-    ctor public ListRowView(android.content.Context, android.util.AttributeSet, int);
-    method public android.support.v17.leanback.widget.HorizontalGridView getGridView();
-  }
-
-  public abstract class ObjectAdapter {
-    ctor public ObjectAdapter(android.support.v17.leanback.widget.PresenterSelector);
-    ctor public ObjectAdapter(android.support.v17.leanback.widget.Presenter);
-    ctor public ObjectAdapter();
-    method public abstract java.lang.Object get(int);
-    method public long getId(int);
-    method public final android.support.v17.leanback.widget.Presenter getPresenter(java.lang.Object);
-    method public final android.support.v17.leanback.widget.PresenterSelector getPresenterSelector();
-    method public final boolean hasStableIds();
-    method protected final void notifyChanged();
-    method protected final void notifyItemRangeChanged(int, int);
-    method protected final void notifyItemRangeInserted(int, int);
-    method protected final void notifyItemRangeRemoved(int, int);
-    method protected void onHasStableIdsChanged();
-    method protected void onPresenterSelectorChanged();
-    method public final void registerObserver(android.support.v17.leanback.widget.ObjectAdapter.DataObserver);
-    method public final void setHasStableIds(boolean);
-    method public final void setPresenterSelector(android.support.v17.leanback.widget.PresenterSelector);
-    method public abstract int size();
-    method public final void unregisterAllObservers();
-    method public final void unregisterObserver(android.support.v17.leanback.widget.ObjectAdapter.DataObserver);
-    field public static final int NO_ID = -1; // 0xffffffff
-  }
-
-  public static abstract class ObjectAdapter.DataObserver {
-    ctor public ObjectAdapter.DataObserver();
-    method public void onChanged();
-    method public void onItemRangeChanged(int, int);
-    method public void onItemRangeInserted(int, int);
-    method public void onItemRangeRemoved(int, int);
-  }
-
-  public abstract interface OnActionClickedListener {
-    method public abstract void onActionClicked(android.support.v17.leanback.widget.Action);
-  }
-
-  public abstract interface OnChildLaidOutListener {
-    method public abstract void onChildLaidOut(android.view.ViewGroup, android.view.View, int, long);
-  }
-
-  public abstract deprecated interface OnChildSelectedListener {
-    method public abstract void onChildSelected(android.view.ViewGroup, android.view.View, int, long);
-  }
-
-  public abstract class OnChildViewHolderSelectedListener {
-    ctor public OnChildViewHolderSelectedListener();
-    method public void onChildViewHolderSelected(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder, int, int);
-  }
-
-  public abstract interface OnItemViewClickedListener {
-    method public abstract void onItemClicked(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object, android.support.v17.leanback.widget.RowPresenter.ViewHolder, android.support.v17.leanback.widget.Row);
-  }
-
-  public abstract interface OnItemViewSelectedListener {
-    method public abstract void onItemSelected(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object, android.support.v17.leanback.widget.RowPresenter.ViewHolder, android.support.v17.leanback.widget.Row);
-  }
-
-  public class PlaybackControlsRow extends android.support.v17.leanback.widget.Row {
-    ctor public PlaybackControlsRow(java.lang.Object);
-    ctor public PlaybackControlsRow();
-    method public android.support.v17.leanback.widget.Action getActionForKeyCode(int);
-    method public android.support.v17.leanback.widget.Action getActionForKeyCode(android.support.v17.leanback.widget.ObjectAdapter, int);
-    method public int getBufferedProgress();
-    method public int getCurrentTime();
-    method public final android.graphics.drawable.Drawable getImageDrawable();
-    method public final java.lang.Object getItem();
-    method public final android.support.v17.leanback.widget.ObjectAdapter getPrimaryActionsAdapter();
-    method public final android.support.v17.leanback.widget.ObjectAdapter getSecondaryActionsAdapter();
-    method public int getTotalTime();
-    method public void setBufferedProgress(int);
-    method public void setCurrentTime(int);
-    method public final void setImageBitmap(android.content.Context, android.graphics.Bitmap);
-    method public final void setImageDrawable(android.graphics.drawable.Drawable);
-    method public final void setPrimaryActionsAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public final void setSecondaryActionsAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public void setTotalTime(int);
-  }
-
-  public static class PlaybackControlsRow.ClosedCaptioningAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
-    ctor public PlaybackControlsRow.ClosedCaptioningAction(android.content.Context);
-    ctor public PlaybackControlsRow.ClosedCaptioningAction(android.content.Context, int);
-    field public static int OFF;
-    field public static int ON;
-  }
-
-  public static class PlaybackControlsRow.FastForwardAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
-    ctor public PlaybackControlsRow.FastForwardAction(android.content.Context);
-    ctor public PlaybackControlsRow.FastForwardAction(android.content.Context, int);
-  }
-
-  public static class PlaybackControlsRow.HighQualityAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
-    ctor public PlaybackControlsRow.HighQualityAction(android.content.Context);
-    ctor public PlaybackControlsRow.HighQualityAction(android.content.Context, int);
-    field public static int OFF;
-    field public static int ON;
-  }
-
-  public static class PlaybackControlsRow.MoreActions extends android.support.v17.leanback.widget.Action {
-    ctor public PlaybackControlsRow.MoreActions(android.content.Context);
-  }
-
-  public static abstract class PlaybackControlsRow.MultiAction extends android.support.v17.leanback.widget.Action {
-    ctor public PlaybackControlsRow.MultiAction(int);
-    method public int getActionCount();
-    method public android.graphics.drawable.Drawable getDrawable(int);
-    method public int getIndex();
-    method public java.lang.String getLabel(int);
-    method public java.lang.String getSecondaryLabel(int);
-    method public void nextIndex();
-    method public void setDrawables(android.graphics.drawable.Drawable[]);
-    method public void setIndex(int);
-    method public void setLabels(java.lang.String[]);
-    method public void setSecondaryLabels(java.lang.String[]);
-  }
-
-  public static class PlaybackControlsRow.PlayPauseAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
-    ctor public PlaybackControlsRow.PlayPauseAction(android.content.Context);
-    field public static int PAUSE;
-    field public static int PLAY;
-  }
-
-  public static class PlaybackControlsRow.RepeatAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
-    ctor public PlaybackControlsRow.RepeatAction(android.content.Context);
-    ctor public PlaybackControlsRow.RepeatAction(android.content.Context, int);
-    ctor public PlaybackControlsRow.RepeatAction(android.content.Context, int, int);
-    field public static int ALL;
-    field public static int NONE;
-    field public static int ONE;
-  }
-
-  public static class PlaybackControlsRow.RewindAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
-    ctor public PlaybackControlsRow.RewindAction(android.content.Context);
-    ctor public PlaybackControlsRow.RewindAction(android.content.Context, int);
-  }
-
-  public static class PlaybackControlsRow.ShuffleAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
-    ctor public PlaybackControlsRow.ShuffleAction(android.content.Context);
-    ctor public PlaybackControlsRow.ShuffleAction(android.content.Context, int);
-    field public static int OFF;
-    field public static int ON;
-  }
-
-  public static class PlaybackControlsRow.SkipNextAction extends android.support.v17.leanback.widget.Action {
-    ctor public PlaybackControlsRow.SkipNextAction(android.content.Context);
-  }
-
-  public static class PlaybackControlsRow.SkipPreviousAction extends android.support.v17.leanback.widget.Action {
-    ctor public PlaybackControlsRow.SkipPreviousAction(android.content.Context);
-  }
-
-  public static abstract class PlaybackControlsRow.ThumbsAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
-    ctor public PlaybackControlsRow.ThumbsAction(int, android.content.Context, int, int);
-    field public static int OUTLINE;
-    field public static int SOLID;
-  }
-
-  public static class PlaybackControlsRow.ThumbsDownAction extends android.support.v17.leanback.widget.PlaybackControlsRow.ThumbsAction {
-    ctor public PlaybackControlsRow.ThumbsDownAction(android.content.Context);
-  }
-
-  public static class PlaybackControlsRow.ThumbsUpAction extends android.support.v17.leanback.widget.PlaybackControlsRow.ThumbsAction {
-    ctor public PlaybackControlsRow.ThumbsUpAction(android.content.Context);
-  }
-
-  public class PlaybackControlsRowPresenter extends android.support.v17.leanback.widget.RowPresenter {
-    ctor public PlaybackControlsRowPresenter(android.support.v17.leanback.widget.Presenter);
-    ctor public PlaybackControlsRowPresenter();
-    method public boolean areSecondaryActionsHidden();
-    method protected android.support.v17.leanback.widget.RowPresenter.ViewHolder createRowViewHolder(android.view.ViewGroup);
-    method public int getBackgroundColor();
-    method public android.support.v17.leanback.widget.OnActionClickedListener getOnActionClickedListener();
-    method public int getProgressColor();
-    method public void setBackgroundColor(int);
-    method public void setOnActionClickedListener(android.support.v17.leanback.widget.OnActionClickedListener);
-    method public void setProgressColor(int);
-    method public void setSecondaryActionsHidden(boolean);
-    method public void showBottomSpace(android.support.v17.leanback.widget.PlaybackControlsRowPresenter.ViewHolder, boolean);
-    method public void showPrimaryActions(android.support.v17.leanback.widget.PlaybackControlsRowPresenter.ViewHolder);
-  }
-
-  public class PlaybackControlsRowPresenter.ViewHolder extends android.support.v17.leanback.widget.RowPresenter.ViewHolder {
-    field public final android.support.v17.leanback.widget.Presenter.ViewHolder mDescriptionViewHolder;
-  }
-
-  public abstract class Presenter implements android.support.v17.leanback.widget.FacetProvider {
-    ctor public Presenter();
-    method protected static void cancelAnimationsRecursive(android.view.View);
-    method public final java.lang.Object getFacet(java.lang.Class<?>);
-    method public abstract void onBindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object);
-    method public abstract android.support.v17.leanback.widget.Presenter.ViewHolder onCreateViewHolder(android.view.ViewGroup);
-    method public abstract void onUnbindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public void onViewAttachedToWindow(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public void onViewDetachedFromWindow(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public final void setFacet(java.lang.Class<?>, java.lang.Object);
-    method public void setOnClickListener(android.support.v17.leanback.widget.Presenter.ViewHolder, android.view.View.OnClickListener);
-  }
-
-  public static class Presenter.ViewHolder implements android.support.v17.leanback.widget.FacetProvider {
-    ctor public Presenter.ViewHolder(android.view.View);
-    method public final java.lang.Object getFacet(java.lang.Class<?>);
-    method public final void setFacet(java.lang.Class<?>, java.lang.Object);
-    field public final android.view.View view;
-  }
-
-  public abstract class PresenterSelector {
-    ctor public PresenterSelector();
-    method public abstract android.support.v17.leanback.widget.Presenter getPresenter(java.lang.Object);
-    method public android.support.v17.leanback.widget.Presenter[] getPresenters();
-  }
-
-  public abstract class PresenterSwitcher {
-    ctor public PresenterSwitcher();
-    method public void clear();
-    method public final android.view.ViewGroup getParentViewGroup();
-    method public void init(android.view.ViewGroup, android.support.v17.leanback.widget.PresenterSelector);
-    method protected abstract void insertView(android.view.View);
-    method protected void onViewSelected(android.view.View);
-    method public void select(java.lang.Object);
-    method protected void showView(android.view.View, boolean);
-    method public void unselect();
-  }
-
-  public class Row {
-    ctor public Row(long, android.support.v17.leanback.widget.HeaderItem);
-    ctor public Row(android.support.v17.leanback.widget.HeaderItem);
-    ctor public Row();
-    method public final android.support.v17.leanback.widget.HeaderItem getHeaderItem();
-    method public final long getId();
-    method public final void setHeaderItem(android.support.v17.leanback.widget.HeaderItem);
-    method public final void setId(long);
-  }
-
-  public class RowHeaderPresenter extends android.support.v17.leanback.widget.Presenter {
-    ctor public RowHeaderPresenter();
-    method protected static float getFontDescent(android.widget.TextView, android.graphics.Paint);
-    method public int getSpaceUnderBaseline(android.support.v17.leanback.widget.RowHeaderPresenter.ViewHolder);
-    method public boolean isNullItemVisibilityGone();
-    method public void onBindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object);
-    method public android.support.v17.leanback.widget.Presenter.ViewHolder onCreateViewHolder(android.view.ViewGroup);
-    method protected void onSelectLevelChanged(android.support.v17.leanback.widget.RowHeaderPresenter.ViewHolder);
-    method public void onUnbindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public void setNullItemVisibilityGone(boolean);
-    method public final void setSelectLevel(android.support.v17.leanback.widget.RowHeaderPresenter.ViewHolder, float);
-  }
-
-  public static class RowHeaderPresenter.ViewHolder extends android.support.v17.leanback.widget.Presenter.ViewHolder {
-    ctor public RowHeaderPresenter.ViewHolder(android.view.View);
-    method public final float getSelectLevel();
-  }
-
-  public final class RowHeaderView extends android.widget.TextView {
-    ctor public RowHeaderView(android.content.Context);
-    ctor public RowHeaderView(android.content.Context, android.util.AttributeSet);
-    ctor public RowHeaderView(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public abstract class RowPresenter extends android.support.v17.leanback.widget.Presenter {
-    ctor public RowPresenter();
-    method protected abstract android.support.v17.leanback.widget.RowPresenter.ViewHolder createRowViewHolder(android.view.ViewGroup);
-    method protected void dispatchItemSelectedListener(android.support.v17.leanback.widget.RowPresenter.ViewHolder, boolean);
-    method public void freeze(android.support.v17.leanback.widget.RowPresenter.ViewHolder, boolean);
-    method public final android.support.v17.leanback.widget.RowHeaderPresenter getHeaderPresenter();
-    method public final android.support.v17.leanback.widget.RowPresenter.ViewHolder getRowViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public final boolean getSelectEffectEnabled();
-    method public final float getSelectLevel(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public final int getSyncActivatePolicy();
-    method protected void initializeRowViewHolder(android.support.v17.leanback.widget.RowPresenter.ViewHolder);
-    method protected boolean isClippingChildren();
-    method public boolean isUsingDefaultSelectEffect();
-    method protected void onBindRowViewHolder(android.support.v17.leanback.widget.RowPresenter.ViewHolder, java.lang.Object);
-    method public final void onBindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object);
-    method public final android.support.v17.leanback.widget.Presenter.ViewHolder onCreateViewHolder(android.view.ViewGroup);
-    method protected void onRowViewAttachedToWindow(android.support.v17.leanback.widget.RowPresenter.ViewHolder);
-    method protected void onRowViewDetachedFromWindow(android.support.v17.leanback.widget.RowPresenter.ViewHolder);
-    method protected void onRowViewExpanded(android.support.v17.leanback.widget.RowPresenter.ViewHolder, boolean);
-    method protected void onRowViewSelected(android.support.v17.leanback.widget.RowPresenter.ViewHolder, boolean);
-    method protected void onSelectLevelChanged(android.support.v17.leanback.widget.RowPresenter.ViewHolder);
-    method protected void onUnbindRowViewHolder(android.support.v17.leanback.widget.RowPresenter.ViewHolder);
-    method public final void onUnbindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public final void onViewAttachedToWindow(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public final void onViewDetachedFromWindow(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public void setEntranceTransitionState(android.support.v17.leanback.widget.RowPresenter.ViewHolder, boolean);
-    method public final void setHeaderPresenter(android.support.v17.leanback.widget.RowHeaderPresenter);
-    method public final void setRowViewExpanded(android.support.v17.leanback.widget.Presenter.ViewHolder, boolean);
-    method public final void setRowViewSelected(android.support.v17.leanback.widget.Presenter.ViewHolder, boolean);
-    method public final void setSelectEffectEnabled(boolean);
-    method public final void setSelectLevel(android.support.v17.leanback.widget.Presenter.ViewHolder, float);
-    method public final void setSyncActivatePolicy(int);
-    field public static final int SYNC_ACTIVATED_CUSTOM = 0; // 0x0
-    field public static final int SYNC_ACTIVATED_TO_EXPANDED = 1; // 0x1
-    field public static final int SYNC_ACTIVATED_TO_EXPANDED_AND_SELECTED = 3; // 0x3
-    field public static final int SYNC_ACTIVATED_TO_SELECTED = 2; // 0x2
-  }
-
-  public static class RowPresenter.ViewHolder extends android.support.v17.leanback.widget.Presenter.ViewHolder {
-    ctor public RowPresenter.ViewHolder(android.view.View);
-    method public final android.support.v17.leanback.widget.RowHeaderPresenter.ViewHolder getHeaderViewHolder();
-    method public final android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public final android.support.v17.leanback.widget.OnItemViewSelectedListener getOnItemViewSelectedListener();
-    method public android.view.View.OnKeyListener getOnKeyListener();
-    method public final android.support.v17.leanback.widget.Row getRow();
-    method public final float getSelectLevel();
-    method public final boolean isExpanded();
-    method public final boolean isSelected();
-    method public final void setActivated(boolean);
-    method public final void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public final void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public void setOnKeyListener(android.view.View.OnKeyListener);
-    method public final void syncActivatedStatus(android.view.View);
-    field protected final android.support.v17.leanback.graphics.ColorOverlayDimmer mColorDimmer;
-  }
-
-  public class SearchBar extends android.widget.RelativeLayout {
-    ctor public SearchBar(android.content.Context);
-    ctor public SearchBar(android.content.Context, android.util.AttributeSet);
-    ctor public SearchBar(android.content.Context, android.util.AttributeSet, int);
-    method public void displayCompletions(java.util.List<java.lang.String>);
-    method public void displayCompletions(android.view.inputmethod.CompletionInfo[]);
-    method public android.graphics.drawable.Drawable getBadgeDrawable();
-    method public java.lang.CharSequence getHint();
-    method public java.lang.String getTitle();
-    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
-    method public void setSearchBarListener(android.support.v17.leanback.widget.SearchBar.SearchBarListener);
-    method public void setSearchQuery(java.lang.String);
-    method public void setSpeechRecognitionCallback(android.support.v17.leanback.widget.SpeechRecognitionCallback);
-    method public void setSpeechRecognizer(android.speech.SpeechRecognizer);
-    method public void setTitle(java.lang.String);
-    method public void startRecognition();
-    method public void stopRecognition();
-  }
-
-  public static abstract interface SearchBar.SearchBarListener {
-    method public abstract void onKeyboardDismiss(java.lang.String);
-    method public abstract void onSearchQueryChange(java.lang.String);
-    method public abstract void onSearchQuerySubmit(java.lang.String);
-  }
-
-  public class SearchEditText extends android.support.v17.leanback.widget.StreamingTextView {
-    ctor public SearchEditText(android.content.Context);
-    ctor public SearchEditText(android.content.Context, android.util.AttributeSet);
-    ctor public SearchEditText(android.content.Context, android.util.AttributeSet, int);
-    method public void setOnKeyboardDismissListener(android.support.v17.leanback.widget.SearchEditText.OnKeyboardDismissListener);
-  }
-
-  public static abstract interface SearchEditText.OnKeyboardDismissListener {
-    method public abstract void onKeyboardDismiss();
-  }
-
-  public class SearchOrbView extends android.widget.FrameLayout implements android.view.View.OnClickListener {
-    ctor public SearchOrbView(android.content.Context);
-    ctor public SearchOrbView(android.content.Context, android.util.AttributeSet);
-    ctor public SearchOrbView(android.content.Context, android.util.AttributeSet, int);
-    method public void enableOrbColorAnimation(boolean);
-    method public int getOrbColor();
-    method public android.support.v17.leanback.widget.SearchOrbView.Colors getOrbColors();
-    method public android.graphics.drawable.Drawable getOrbIcon();
-    method public void onClick(android.view.View);
-    method public void setOnOrbClickedListener(android.view.View.OnClickListener);
-    method public void setOrbColor(int);
-    method public deprecated void setOrbColor(int, int);
-    method public void setOrbColors(android.support.v17.leanback.widget.SearchOrbView.Colors);
-    method public void setOrbIcon(android.graphics.drawable.Drawable);
-  }
-
-  public static class SearchOrbView.Colors {
-    ctor public SearchOrbView.Colors(int);
-    ctor public SearchOrbView.Colors(int, int);
-    ctor public SearchOrbView.Colors(int, int, int);
-    method public static int getBrightColor(int);
-    field public int brightColor;
-    field public int color;
-    field public int iconColor;
-  }
-
-  public class ShadowOverlayContainer extends android.widget.FrameLayout {
-    ctor public ShadowOverlayContainer(android.content.Context);
-    ctor public ShadowOverlayContainer(android.content.Context, android.util.AttributeSet);
-    ctor public ShadowOverlayContainer(android.content.Context, android.util.AttributeSet, int);
-    method public int getShadowType();
-    method public android.view.View getWrappedView();
-    method public deprecated void initialize(boolean, boolean);
-    method public deprecated void initialize(boolean, boolean, boolean);
-    method public static void prepareParentForShadow(android.view.ViewGroup);
-    method public void setOverlayColor(int);
-    method public void setShadowFocusLevel(float);
-    method public static boolean supportsDynamicShadow();
-    method public static boolean supportsShadow();
-    method public void useDynamicShadow();
-    method public void useDynamicShadow(float, float);
-    method public void useStaticShadow();
-    method public void wrap(android.view.View);
-    field public static final int SHADOW_DYNAMIC = 3; // 0x3
-    field public static final int SHADOW_NONE = 1; // 0x1
-    field public static final int SHADOW_STATIC = 2; // 0x2
-  }
-
-  public final class ShadowOverlayHelper {
-    method public android.support.v17.leanback.widget.ShadowOverlayContainer createShadowOverlayContainer(android.content.Context);
-    method public int getShadowType();
-    method public boolean needsOverlay();
-    method public boolean needsRoundedCorner();
-    method public boolean needsWrapper();
-    method public void onViewCreated(android.view.View);
-    method public void prepareParentForShadow(android.view.ViewGroup);
-    method public static void setNoneWrapperOverlayColor(android.view.View, int);
-    method public static void setNoneWrapperShadowFocusLevel(android.view.View, float);
-    method public void setOverlayColor(android.view.View, int);
-    method public void setShadowFocusLevel(android.view.View, float);
-    method public static boolean supportsDynamicShadow();
-    method public static boolean supportsForeground();
-    method public static boolean supportsRoundedCorner();
-    method public static boolean supportsShadow();
-    field public static final int SHADOW_DYNAMIC = 3; // 0x3
-    field public static final int SHADOW_NONE = 1; // 0x1
-    field public static final int SHADOW_STATIC = 2; // 0x2
-  }
-
-  public static final class ShadowOverlayHelper.Builder {
-    ctor public ShadowOverlayHelper.Builder();
-    method public android.support.v17.leanback.widget.ShadowOverlayHelper build(android.content.Context);
-    method public android.support.v17.leanback.widget.ShadowOverlayHelper.Builder keepForegroundDrawable(boolean);
-    method public android.support.v17.leanback.widget.ShadowOverlayHelper.Builder needsOverlay(boolean);
-    method public android.support.v17.leanback.widget.ShadowOverlayHelper.Builder needsRoundedCorner(boolean);
-    method public android.support.v17.leanback.widget.ShadowOverlayHelper.Builder needsShadow(boolean);
-    method public android.support.v17.leanback.widget.ShadowOverlayHelper.Builder options(android.support.v17.leanback.widget.ShadowOverlayHelper.Options);
-    method public android.support.v17.leanback.widget.ShadowOverlayHelper.Builder preferZOrder(boolean);
-  }
-
-  public static final class ShadowOverlayHelper.Options {
-    ctor public ShadowOverlayHelper.Options();
-    method public android.support.v17.leanback.widget.ShadowOverlayHelper.Options dynamicShadowZ(float, float);
-    method public final float getDynamicShadowFocusedZ();
-    method public final float getDynamicShadowUnfocusedZ();
-    method public final int getRoundedCornerRadius();
-    method public android.support.v17.leanback.widget.ShadowOverlayHelper.Options roundedCornerRadius(int);
-    field public static final android.support.v17.leanback.widget.ShadowOverlayHelper.Options DEFAULT;
-  }
-
-  public final class SinglePresenterSelector extends android.support.v17.leanback.widget.PresenterSelector {
-    ctor public SinglePresenterSelector(android.support.v17.leanback.widget.Presenter);
-    method public android.support.v17.leanback.widget.Presenter getPresenter(java.lang.Object);
-  }
-
-  public class SparseArrayObjectAdapter extends android.support.v17.leanback.widget.ObjectAdapter {
-    ctor public SparseArrayObjectAdapter(android.support.v17.leanback.widget.PresenterSelector);
-    ctor public SparseArrayObjectAdapter(android.support.v17.leanback.widget.Presenter);
-    ctor public SparseArrayObjectAdapter();
-    method public void clear(int);
-    method public void clear();
-    method public java.lang.Object get(int);
-    method public int indexOf(java.lang.Object);
-    method public int indexOf(int);
-    method public java.lang.Object lookup(int);
-    method public void notifyArrayItemRangeChanged(int, int);
-    method public void set(int, java.lang.Object);
-    method public int size();
-  }
-
-  public class SpeechOrbView extends android.support.v17.leanback.widget.SearchOrbView {
-    ctor public SpeechOrbView(android.content.Context);
-    ctor public SpeechOrbView(android.content.Context, android.util.AttributeSet);
-    ctor public SpeechOrbView(android.content.Context, android.util.AttributeSet, int);
-    method public void setSoundLevel(int);
-    method public void showListening();
-    method public void showNotListening();
-  }
-
-  public abstract interface SpeechRecognitionCallback {
-    method public abstract void recognizeSpeech();
-  }
-
-   class StreamingTextView extends android.widget.EditText {
-    ctor public StreamingTextView(android.content.Context, android.util.AttributeSet);
-    ctor public StreamingTextView(android.content.Context, android.util.AttributeSet, int);
-    method public static boolean isLayoutRtl(android.view.View);
-    method public void reset();
-    method public void setFinalRecognizedText(java.lang.CharSequence);
-    method public void updateRecognizedText(java.lang.String, java.lang.String);
-    method public void updateRecognizedText(java.lang.String, java.util.List<java.lang.Float>);
-  }
-
-  public class TitleHelper {
-    ctor public TitleHelper(android.view.ViewGroup, android.support.v17.leanback.widget.TitleView);
-    method public android.support.v17.leanback.widget.BrowseFrameLayout.OnFocusSearchListener getOnFocusSearchListener();
-    method public android.view.ViewGroup getSceneRoot();
-    method public android.support.v17.leanback.widget.TitleView getTitleView();
-    method public void showTitle(boolean);
-  }
-
-  public class TitleView extends android.widget.FrameLayout {
-    ctor public TitleView(android.content.Context);
-    ctor public TitleView(android.content.Context, android.util.AttributeSet);
-    ctor public TitleView(android.content.Context, android.util.AttributeSet, int);
-    method public void enableAnimation(boolean);
-    method public android.graphics.drawable.Drawable getBadgeDrawable();
-    method public android.support.v17.leanback.widget.SearchOrbView.Colors getSearchAffordanceColors();
-    method public android.view.View getSearchAffordanceView();
-    method public java.lang.CharSequence getTitle();
-    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
-    method public void setOnSearchClickedListener(android.view.View.OnClickListener);
-    method public void setSearchAffordanceColors(android.support.v17.leanback.widget.SearchOrbView.Colors);
-    method public void setTitle(java.lang.String);
-  }
-
-  public class VerticalGridPresenter extends android.support.v17.leanback.widget.Presenter {
-    ctor public VerticalGridPresenter();
-    ctor public VerticalGridPresenter(int);
-    ctor public VerticalGridPresenter(int, boolean);
-    method public final boolean areChildRoundedCornersEnabled();
-    method protected android.support.v17.leanback.widget.VerticalGridPresenter.ViewHolder createGridViewHolder(android.view.ViewGroup);
-    method protected android.support.v17.leanback.widget.ShadowOverlayHelper.Options createShadowOverlayOptions();
-    method public final void enableChildRoundedCorners(boolean);
-    method public final int getFocusZoomFactor();
-    method public final boolean getKeepChildForeground();
-    method public int getNumberOfColumns();
-    method public final android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public final android.support.v17.leanback.widget.OnItemViewSelectedListener getOnItemViewSelectedListener();
-    method public final boolean getShadowEnabled();
-    method protected void initializeGridViewHolder(android.support.v17.leanback.widget.VerticalGridPresenter.ViewHolder);
-    method public final boolean isFocusDimmerUsed();
-    method public boolean isUsingDefaultShadow();
-    method public boolean isUsingZOrder(android.content.Context);
-    method public void onBindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object);
-    method public final android.support.v17.leanback.widget.VerticalGridPresenter.ViewHolder onCreateViewHolder(android.view.ViewGroup);
-    method public void onUnbindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public void setEntranceTransitionState(android.support.v17.leanback.widget.VerticalGridPresenter.ViewHolder, boolean);
-    method public final void setKeepChildForeground(boolean);
-    method public void setNumberOfColumns(int);
-    method public final void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public final void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public final void setShadowEnabled(boolean);
-  }
-
-  public static class VerticalGridPresenter.ViewHolder extends android.support.v17.leanback.widget.Presenter.ViewHolder {
-    ctor public VerticalGridPresenter.ViewHolder(android.support.v17.leanback.widget.VerticalGridView);
-    method public android.support.v17.leanback.widget.VerticalGridView getGridView();
-  }
-
-  public class VerticalGridView extends android.support.v7.widget.RecyclerView {
-    ctor public VerticalGridView(android.content.Context);
-    ctor public VerticalGridView(android.content.Context, android.util.AttributeSet);
-    ctor public VerticalGridView(android.content.Context, android.util.AttributeSet, int);
-    method protected void initAttributes(android.content.Context, android.util.AttributeSet);
-    method public void setColumnWidth(int);
-    method public void setNumColumns(int);
-  }
-
-}
-
diff --git a/v17/leanback/api/23.1.1.txt b/v17/leanback/api/23.1.1.txt
deleted file mode 100644
index 962367d..0000000
--- a/v17/leanback/api/23.1.1.txt
+++ /dev/null
@@ -1,1796 +0,0 @@
-package android.support.v17.leanback.app {
-
-  public final class BackgroundManager {
-    method public void attach(android.view.Window);
-    method public final int getColor();
-    method public android.graphics.drawable.Drawable getDefaultDimLayer();
-    method public android.graphics.drawable.Drawable getDimLayer();
-    method public android.graphics.drawable.Drawable getDrawable();
-    method public static android.support.v17.leanback.app.BackgroundManager getInstance(android.app.Activity);
-    method public boolean isAttached();
-    method public void release();
-    method public void setBitmap(android.graphics.Bitmap);
-    method public void setColor(int);
-    method public void setDimLayer(android.graphics.drawable.Drawable);
-    method public void setDrawable(android.graphics.drawable.Drawable);
-    method public void setThemeDrawableResourceId(int);
-  }
-
-   abstract class BaseRowFragment extends android.app.Fragment {
-    method public final android.support.v17.leanback.widget.ObjectAdapter getAdapter();
-    method public final android.support.v17.leanback.widget.PresenterSelector getPresenterSelector();
-    method public final void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public final void setPresenterSelector(android.support.v17.leanback.widget.PresenterSelector);
-    method public void setSelectedPosition(int);
-    method public void setSelectedPosition(int, boolean);
-  }
-
-   abstract class BaseRowSupportFragment extends android.support.v4.app.Fragment {
-    method public final android.support.v17.leanback.widget.ObjectAdapter getAdapter();
-    method public final android.support.v17.leanback.widget.PresenterSelector getPresenterSelector();
-    method public final void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public final void setPresenterSelector(android.support.v17.leanback.widget.PresenterSelector);
-    method public void setSelectedPosition(int);
-    method public void setSelectedPosition(int, boolean);
-  }
-
-  public class BrowseFragment extends android.support.v17.leanback.app.BrandedFragment {
-    ctor public BrowseFragment();
-    method public static android.os.Bundle createArgs(android.os.Bundle, java.lang.String, int);
-    method protected java.lang.Object createEntranceTransition();
-    method public void enableRowScaling(boolean);
-    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
-    method public int getBrandColor();
-    method public int getHeadersState();
-    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public android.support.v17.leanback.widget.OnItemViewSelectedListener getOnItemViewSelectedListener();
-    method public final boolean isHeadersTransitionOnBackEnabled();
-    method public boolean isInHeadersTransition();
-    method public boolean isShowingHeaders();
-    method protected void onEntranceTransitionEnd();
-    method protected void onEntranceTransitionPrepare();
-    method protected void onEntranceTransitionStart();
-    method public void onSaveInstanceState(android.os.Bundle);
-    method public void onStart();
-    method protected void runEntranceTransition(java.lang.Object);
-    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public void setBrandColor(int);
-    method public void setBrowseTransitionListener(android.support.v17.leanback.app.BrowseFragment.BrowseTransitionListener);
-    method public void setHeaderPresenterSelector(android.support.v17.leanback.widget.PresenterSelector);
-    method public void setHeadersState(int);
-    method public final void setHeadersTransitionOnBackEnabled(boolean);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public void setSelectedPosition(int);
-    method public void setSelectedPosition(int, boolean);
-    method public void startHeadersTransition(boolean);
-    field public static final int HEADERS_DISABLED = 3; // 0x3
-    field public static final int HEADERS_ENABLED = 1; // 0x1
-    field public static final int HEADERS_HIDDEN = 2; // 0x2
-  }
-
-  public static class BrowseFragment.BrowseTransitionListener {
-    ctor public BrowseFragment.BrowseTransitionListener();
-    method public void onHeadersTransitionStart(boolean);
-    method public void onHeadersTransitionStop(boolean);
-  }
-
-  public class BrowseSupportFragment extends android.support.v17.leanback.app.BrandedSupportFragment {
-    ctor public BrowseSupportFragment();
-    method public static android.os.Bundle createArgs(android.os.Bundle, java.lang.String, int);
-    method protected java.lang.Object createEntranceTransition();
-    method public void enableRowScaling(boolean);
-    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
-    method public int getBrandColor();
-    method public int getHeadersState();
-    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public android.support.v17.leanback.widget.OnItemViewSelectedListener getOnItemViewSelectedListener();
-    method public final boolean isHeadersTransitionOnBackEnabled();
-    method public boolean isInHeadersTransition();
-    method public boolean isShowingHeaders();
-    method protected void onEntranceTransitionEnd();
-    method protected void onEntranceTransitionPrepare();
-    method protected void onEntranceTransitionStart();
-    method public void onSaveInstanceState(android.os.Bundle);
-    method public void onStart();
-    method protected void runEntranceTransition(java.lang.Object);
-    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public void setBrandColor(int);
-    method public void setBrowseTransitionListener(android.support.v17.leanback.app.BrowseSupportFragment.BrowseTransitionListener);
-    method public void setHeaderPresenterSelector(android.support.v17.leanback.widget.PresenterSelector);
-    method public void setHeadersState(int);
-    method public final void setHeadersTransitionOnBackEnabled(boolean);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public void setSelectedPosition(int);
-    method public void setSelectedPosition(int, boolean);
-    method public void startHeadersTransition(boolean);
-    field public static final int HEADERS_DISABLED = 3; // 0x3
-    field public static final int HEADERS_ENABLED = 1; // 0x1
-    field public static final int HEADERS_HIDDEN = 2; // 0x2
-  }
-
-  public static class BrowseSupportFragment.BrowseTransitionListener {
-    ctor public BrowseSupportFragment.BrowseTransitionListener();
-    method public void onHeadersTransitionStart(boolean);
-    method public void onHeadersTransitionStop(boolean);
-  }
-
-  public class DetailsFragment extends android.support.v17.leanback.app.BrandedFragment {
-    ctor public DetailsFragment();
-    method protected java.lang.Object createEntranceTransition();
-    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
-    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method protected android.view.View inflateTitle(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
-    method protected void onEntranceTransitionEnd();
-    method protected void onEntranceTransitionPrepare();
-    method protected void onEntranceTransitionStart();
-    method protected void onSetDetailsOverviewRowStatus(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter, android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder, int, int, int);
-    method protected void onSetRowStatus(android.support.v17.leanback.widget.RowPresenter, android.support.v17.leanback.widget.RowPresenter.ViewHolder, int, int, int);
-    method public void onStart();
-    method protected void runEntranceTransition(java.lang.Object);
-    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public void setSelectedPosition(int);
-    method public void setSelectedPosition(int, boolean);
-    method protected void setupDetailsOverviewRowPresenter(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter);
-    method protected void setupPresenter(android.support.v17.leanback.widget.Presenter);
-  }
-
-  public class DetailsSupportFragment extends android.support.v17.leanback.app.BrandedSupportFragment {
-    ctor public DetailsSupportFragment();
-    method protected java.lang.Object createEntranceTransition();
-    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
-    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method protected android.view.View inflateTitle(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
-    method protected void onEntranceTransitionEnd();
-    method protected void onEntranceTransitionPrepare();
-    method protected void onEntranceTransitionStart();
-    method protected void onSetDetailsOverviewRowStatus(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter, android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder, int, int, int);
-    method protected void onSetRowStatus(android.support.v17.leanback.widget.RowPresenter, android.support.v17.leanback.widget.RowPresenter.ViewHolder, int, int, int);
-    method public void onStart();
-    method protected void runEntranceTransition(java.lang.Object);
-    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public void setSelectedPosition(int);
-    method public void setSelectedPosition(int, boolean);
-    method protected void setupDetailsOverviewRowPresenter(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter);
-    method protected void setupPresenter(android.support.v17.leanback.widget.Presenter);
-  }
-
-  public class ErrorFragment extends android.app.Fragment {
-    ctor public ErrorFragment();
-    method public android.graphics.drawable.Drawable getBackgroundDrawable();
-    method public android.graphics.drawable.Drawable getBadgeDrawable();
-    method public android.view.View.OnClickListener getButtonClickListener();
-    method public java.lang.String getButtonText();
-    method public android.graphics.drawable.Drawable getImageDrawable();
-    method public java.lang.CharSequence getMessage();
-    method public java.lang.String getTitle();
-    method public boolean isBackgroundTranslucent();
-    method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
-    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
-    method public void setButtonClickListener(android.view.View.OnClickListener);
-    method public void setButtonText(java.lang.String);
-    method public void setDefaultBackground(boolean);
-    method public void setImageDrawable(android.graphics.drawable.Drawable);
-    method public void setMessage(java.lang.CharSequence);
-    method public void setTitle(java.lang.String);
-  }
-
-  public class ErrorSupportFragment extends android.support.v4.app.Fragment {
-    ctor public ErrorSupportFragment();
-    method public android.graphics.drawable.Drawable getBackgroundDrawable();
-    method public android.graphics.drawable.Drawable getBadgeDrawable();
-    method public android.view.View.OnClickListener getButtonClickListener();
-    method public java.lang.String getButtonText();
-    method public android.graphics.drawable.Drawable getImageDrawable();
-    method public java.lang.CharSequence getMessage();
-    method public java.lang.String getTitle();
-    method public boolean isBackgroundTranslucent();
-    method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
-    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
-    method public void setButtonClickListener(android.view.View.OnClickListener);
-    method public void setButtonText(java.lang.String);
-    method public void setDefaultBackground(boolean);
-    method public void setImageDrawable(android.graphics.drawable.Drawable);
-    method public void setMessage(java.lang.CharSequence);
-    method public void setTitle(java.lang.String);
-  }
-
-  public class GuidedStepFragment extends android.app.Fragment {
-    ctor public GuidedStepFragment();
-    method public static int add(android.app.FragmentManager, android.support.v17.leanback.app.GuidedStepFragment);
-    method public static int add(android.app.FragmentManager, android.support.v17.leanback.app.GuidedStepFragment, int);
-    method public static int addAsRoot(android.app.Activity, android.support.v17.leanback.app.GuidedStepFragment, int);
-    method public android.view.View getActionItemView(int);
-    method public java.util.List<android.support.v17.leanback.widget.GuidedAction> getActions();
-    method protected int getContainerIdForBackground();
-    method public static android.support.v17.leanback.app.GuidedStepFragment getCurrentGuidedStepFragment(android.app.FragmentManager);
-    method public android.support.v17.leanback.widget.GuidanceStylist getGuidanceStylist();
-    method public android.support.v17.leanback.widget.GuidedActionsStylist getGuidedActionsStylist();
-    method public int getSelectedActionPosition();
-    method public int getUiStyle();
-    method public void onCreateActions(java.util.List<android.support.v17.leanback.widget.GuidedAction>, android.os.Bundle);
-    method public android.support.v17.leanback.widget.GuidedActionsStylist onCreateActionsStylist();
-    method public android.support.v17.leanback.widget.GuidanceStylist.Guidance onCreateGuidance(android.os.Bundle);
-    method public android.support.v17.leanback.widget.GuidanceStylist onCreateGuidanceStylist();
-    method public void onGuidedActionClicked(android.support.v17.leanback.widget.GuidedAction);
-    method public void onGuidedActionEdited(android.support.v17.leanback.widget.GuidedAction);
-    method public void onGuidedActionFocused(android.support.v17.leanback.widget.GuidedAction);
-    method protected android.app.Fragment onProvideBackgroundFragment();
-    method protected void onProvideFragmentTransitions();
-    method public int onProvideTheme();
-    method public void setActions(java.util.List<android.support.v17.leanback.widget.GuidedAction>);
-    method public void setSelectedActionPosition(int);
-    method public void setUiStyle(int);
-    field public static final java.lang.String EXTRA_UI_STYLE = "uiStyle";
-    field public static final int UI_STYLE_ACTIVITY_ROOT = 2; // 0x2
-    field public static final int UI_STYLE_DEFAULT = 0; // 0x0
-    field public static final int UI_STYLE_ENTRANCE = 1; // 0x1
-  }
-
-  public static class GuidedStepFragment.GuidedStepBackgroundFragment extends android.app.Fragment {
-    ctor public GuidedStepFragment.GuidedStepBackgroundFragment();
-    method protected void onProvideFragmentTransitions();
-  }
-
-  public class GuidedStepSupportFragment extends android.support.v4.app.Fragment {
-    ctor public GuidedStepSupportFragment();
-    method public static int add(android.support.v4.app.FragmentManager, android.support.v17.leanback.app.GuidedStepSupportFragment);
-    method public static int add(android.support.v4.app.FragmentManager, android.support.v17.leanback.app.GuidedStepSupportFragment, int);
-    method public static int addAsRoot(android.support.v4.app.FragmentActivity, android.support.v17.leanback.app.GuidedStepSupportFragment, int);
-    method public android.view.View getActionItemView(int);
-    method public java.util.List<android.support.v17.leanback.widget.GuidedAction> getActions();
-    method protected int getContainerIdForBackground();
-    method public static android.support.v17.leanback.app.GuidedStepSupportFragment getCurrentGuidedStepSupportFragment(android.support.v4.app.FragmentManager);
-    method public android.support.v17.leanback.widget.GuidanceStylist getGuidanceStylist();
-    method public android.support.v17.leanback.widget.GuidedActionsStylist getGuidedActionsStylist();
-    method public int getSelectedActionPosition();
-    method public int getUiStyle();
-    method public void onCreateActions(java.util.List<android.support.v17.leanback.widget.GuidedAction>, android.os.Bundle);
-    method public android.support.v17.leanback.widget.GuidedActionsStylist onCreateActionsStylist();
-    method public android.support.v17.leanback.widget.GuidanceStylist.Guidance onCreateGuidance(android.os.Bundle);
-    method public android.support.v17.leanback.widget.GuidanceStylist onCreateGuidanceStylist();
-    method public void onGuidedActionClicked(android.support.v17.leanback.widget.GuidedAction);
-    method public void onGuidedActionEdited(android.support.v17.leanback.widget.GuidedAction);
-    method public void onGuidedActionFocused(android.support.v17.leanback.widget.GuidedAction);
-    method protected android.support.v4.app.Fragment onProvideBackgroundSupportFragment();
-    method protected void onProvideFragmentTransitions();
-    method public int onProvideTheme();
-    method public void setActions(java.util.List<android.support.v17.leanback.widget.GuidedAction>);
-    method public void setSelectedActionPosition(int);
-    method public void setUiStyle(int);
-    field public static final java.lang.String EXTRA_UI_STYLE = "uiStyle";
-    field public static final int UI_STYLE_ACTIVITY_ROOT = 2; // 0x2
-    field public static final int UI_STYLE_DEFAULT = 0; // 0x0
-    field public static final int UI_STYLE_ENTRANCE = 1; // 0x1
-  }
-
-  public static class GuidedStepSupportFragment.GuidedStepBackgroundSupportFragment extends android.support.v4.app.Fragment {
-    ctor public GuidedStepSupportFragment.GuidedStepBackgroundSupportFragment();
-    method protected void onProvideFragmentTransitions();
-  }
-
-  public class HeadersFragment extends android.support.v17.leanback.app.BaseRowFragment {
-    ctor public HeadersFragment();
-    method public void setOnHeaderClickedListener(android.support.v17.leanback.app.HeadersFragment.OnHeaderClickedListener);
-    method public void setOnHeaderViewSelectedListener(android.support.v17.leanback.app.HeadersFragment.OnHeaderViewSelectedListener);
-  }
-
-   static abstract interface HeadersFragment.OnHeaderClickedListener {
-    method public abstract void onHeaderClicked();
-  }
-
-   static abstract interface HeadersFragment.OnHeaderViewSelectedListener {
-    method public abstract void onHeaderSelected(android.support.v17.leanback.widget.RowHeaderPresenter.ViewHolder, android.support.v17.leanback.widget.Row);
-  }
-
-  public class HeadersSupportFragment extends android.support.v17.leanback.app.BaseRowSupportFragment {
-    ctor public HeadersSupportFragment();
-    method public void setOnHeaderClickedListener(android.support.v17.leanback.app.HeadersSupportFragment.OnHeaderClickedListener);
-    method public void setOnHeaderViewSelectedListener(android.support.v17.leanback.app.HeadersSupportFragment.OnHeaderViewSelectedListener);
-  }
-
-   static abstract interface HeadersSupportFragment.OnHeaderClickedListener {
-    method public abstract void onHeaderClicked();
-  }
-
-   static abstract interface HeadersSupportFragment.OnHeaderViewSelectedListener {
-    method public abstract void onHeaderSelected(android.support.v17.leanback.widget.RowHeaderPresenter.ViewHolder, android.support.v17.leanback.widget.Row);
-  }
-
-  public abstract class MediaControllerGlue extends android.support.v17.leanback.app.PlaybackControlGlue {
-    ctor public MediaControllerGlue(android.content.Context, android.support.v17.leanback.app.PlaybackOverlayFragment, int[]);
-    ctor public MediaControllerGlue(android.content.Context, android.support.v17.leanback.app.PlaybackOverlayFragment, int[], int[]);
-    method public void attachToMediaController(android.support.v4.media.session.MediaControllerCompat);
-    method public void detach();
-    method public int getCurrentPosition();
-    method public int getCurrentSpeedId();
-    method public android.graphics.drawable.Drawable getMediaArt();
-    method public final android.support.v4.media.session.MediaControllerCompat getMediaController();
-    method public int getMediaDuration();
-    method public java.lang.CharSequence getMediaSubtitle();
-    method public java.lang.CharSequence getMediaTitle();
-    method public long getSupportedActions();
-    method public boolean hasValidMedia();
-    method public boolean isMediaPlaying();
-    method protected void pausePlayback();
-    method protected void skipToNext();
-    method protected void skipToPrevious();
-    method protected void startPlayback(int);
-  }
-
-  public abstract class PlaybackControlGlue implements android.support.v17.leanback.widget.OnActionClickedListener android.view.View.OnKeyListener {
-    ctor public PlaybackControlGlue(android.content.Context, int[]);
-    ctor public PlaybackControlGlue(android.content.Context, int[], int[]);
-    ctor public PlaybackControlGlue(android.content.Context, android.support.v17.leanback.app.PlaybackOverlayFragment, int[]);
-    ctor public PlaybackControlGlue(android.content.Context, android.support.v17.leanback.app.PlaybackOverlayFragment, int[], int[]);
-    method public android.support.v17.leanback.widget.PlaybackControlsRowPresenter createControlsRowAndPresenter();
-    method protected android.support.v17.leanback.widget.SparseArrayObjectAdapter createPrimaryActionsAdapter(android.support.v17.leanback.widget.PresenterSelector);
-    method public void enableProgressUpdating(boolean);
-    method public android.content.Context getContext();
-    method public android.support.v17.leanback.widget.PlaybackControlsRow getControlsRow();
-    method public abstract int getCurrentPosition();
-    method public abstract int getCurrentSpeedId();
-    method public int[] getFastForwardSpeeds();
-    method public android.support.v17.leanback.app.PlaybackOverlayFragment getFragment();
-    method public abstract android.graphics.drawable.Drawable getMediaArt();
-    method public abstract int getMediaDuration();
-    method public abstract java.lang.CharSequence getMediaSubtitle();
-    method public abstract java.lang.CharSequence getMediaTitle();
-    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public int[] getRewindSpeeds();
-    method public abstract long getSupportedActions();
-    method public int getUpdatePeriod();
-    method public abstract boolean hasValidMedia();
-    method public boolean isFadingEnabled();
-    method public abstract boolean isMediaPlaying();
-    method public void onActionClicked(android.support.v17.leanback.widget.Action);
-    method public boolean onKey(android.view.View, int, android.view.KeyEvent);
-    method protected void onMetadataChanged();
-    method protected abstract void onRowChanged(android.support.v17.leanback.widget.PlaybackControlsRow);
-    method protected void onStateChanged();
-    method protected abstract void pausePlayback();
-    method public void setControlsRow(android.support.v17.leanback.widget.PlaybackControlsRow);
-    method public void setFadingEnabled(boolean);
-    method public deprecated void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method protected abstract void skipToNext();
-    method protected abstract void skipToPrevious();
-    method protected abstract void startPlayback(int);
-    method public void updateProgress();
-    field public static final int ACTION_CUSTOM_LEFT_FIRST = 1; // 0x1
-    field public static final int ACTION_CUSTOM_RIGHT_FIRST = 4096; // 0x1000
-    field public static final int ACTION_FAST_FORWARD = 128; // 0x80
-    field public static final int ACTION_PLAY_PAUSE = 64; // 0x40
-    field public static final int ACTION_REWIND = 32; // 0x20
-    field public static final int ACTION_SKIP_TO_NEXT = 256; // 0x100
-    field public static final int ACTION_SKIP_TO_PREVIOUS = 16; // 0x10
-    field public static final int PLAYBACK_SPEED_FAST_L0 = 10; // 0xa
-    field public static final int PLAYBACK_SPEED_FAST_L1 = 11; // 0xb
-    field public static final int PLAYBACK_SPEED_FAST_L2 = 12; // 0xc
-    field public static final int PLAYBACK_SPEED_FAST_L3 = 13; // 0xd
-    field public static final int PLAYBACK_SPEED_FAST_L4 = 14; // 0xe
-    field public static final int PLAYBACK_SPEED_INVALID = -1; // 0xffffffff
-    field public static final int PLAYBACK_SPEED_NORMAL = 1; // 0x1
-    field public static final int PLAYBACK_SPEED_PAUSED = 0; // 0x0
-  }
-
-  public abstract class PlaybackControlSupportGlue implements android.support.v17.leanback.widget.OnActionClickedListener android.view.View.OnKeyListener {
-    ctor public PlaybackControlSupportGlue(android.content.Context, int[]);
-    ctor public PlaybackControlSupportGlue(android.content.Context, int[], int[]);
-    ctor public PlaybackControlSupportGlue(android.content.Context, android.support.v17.leanback.app.PlaybackOverlaySupportFragment, int[]);
-    ctor public PlaybackControlSupportGlue(android.content.Context, android.support.v17.leanback.app.PlaybackOverlaySupportFragment, int[], int[]);
-    method public android.support.v17.leanback.widget.PlaybackControlsRowPresenter createControlsRowAndPresenter();
-    method protected android.support.v17.leanback.widget.SparseArrayObjectAdapter createPrimaryActionsAdapter(android.support.v17.leanback.widget.PresenterSelector);
-    method public void enableProgressUpdating(boolean);
-    method public android.content.Context getContext();
-    method public android.support.v17.leanback.widget.PlaybackControlsRow getControlsRow();
-    method public abstract int getCurrentPosition();
-    method public abstract int getCurrentSpeedId();
-    method public int[] getFastForwardSpeeds();
-    method public android.support.v17.leanback.app.PlaybackOverlaySupportFragment getFragment();
-    method public abstract android.graphics.drawable.Drawable getMediaArt();
-    method public abstract int getMediaDuration();
-    method public abstract java.lang.CharSequence getMediaSubtitle();
-    method public abstract java.lang.CharSequence getMediaTitle();
-    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public int[] getRewindSpeeds();
-    method public abstract long getSupportedActions();
-    method public int getUpdatePeriod();
-    method public abstract boolean hasValidMedia();
-    method public boolean isFadingEnabled();
-    method public abstract boolean isMediaPlaying();
-    method public void onActionClicked(android.support.v17.leanback.widget.Action);
-    method public boolean onKey(android.view.View, int, android.view.KeyEvent);
-    method protected void onMetadataChanged();
-    method protected abstract void onRowChanged(android.support.v17.leanback.widget.PlaybackControlsRow);
-    method protected void onStateChanged();
-    method protected abstract void pausePlayback();
-    method public void setControlsRow(android.support.v17.leanback.widget.PlaybackControlsRow);
-    method public void setFadingEnabled(boolean);
-    method public deprecated void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method protected abstract void skipToNext();
-    method protected abstract void skipToPrevious();
-    method protected abstract void startPlayback(int);
-    method public void updateProgress();
-    field public static final int ACTION_CUSTOM_LEFT_FIRST = 1; // 0x1
-    field public static final int ACTION_CUSTOM_RIGHT_FIRST = 4096; // 0x1000
-    field public static final int ACTION_FAST_FORWARD = 128; // 0x80
-    field public static final int ACTION_PLAY_PAUSE = 64; // 0x40
-    field public static final int ACTION_REWIND = 32; // 0x20
-    field public static final int ACTION_SKIP_TO_NEXT = 256; // 0x100
-    field public static final int ACTION_SKIP_TO_PREVIOUS = 16; // 0x10
-    field public static final int PLAYBACK_SPEED_FAST_L0 = 10; // 0xa
-    field public static final int PLAYBACK_SPEED_FAST_L1 = 11; // 0xb
-    field public static final int PLAYBACK_SPEED_FAST_L2 = 12; // 0xc
-    field public static final int PLAYBACK_SPEED_FAST_L3 = 13; // 0xd
-    field public static final int PLAYBACK_SPEED_FAST_L4 = 14; // 0xe
-    field public static final int PLAYBACK_SPEED_INVALID = -1; // 0xffffffff
-    field public static final int PLAYBACK_SPEED_NORMAL = 1; // 0x1
-    field public static final int PLAYBACK_SPEED_PAUSED = 0; // 0x0
-  }
-
-  public class PlaybackOverlayFragment extends android.support.v17.leanback.app.DetailsFragment {
-    ctor public PlaybackOverlayFragment();
-    method public int getBackgroundType();
-    method public android.support.v17.leanback.app.PlaybackOverlayFragment.OnFadeCompleteListener getFadeCompleteListener();
-    method public final android.support.v17.leanback.app.PlaybackOverlayFragment.InputEventHandler getInputEventHandler();
-    method public boolean isFadingEnabled();
-    method public void onDestroyView();
-    method public void onResume();
-    method public void setBackgroundType(int);
-    method public void setFadeCompleteListener(android.support.v17.leanback.app.PlaybackOverlayFragment.OnFadeCompleteListener);
-    method public void setFadingEnabled(boolean);
-    method public final void setInputEventHandler(android.support.v17.leanback.app.PlaybackOverlayFragment.InputEventHandler);
-    method public void tickle();
-    field public static final int BG_DARK = 1; // 0x1
-    field public static final int BG_LIGHT = 2; // 0x2
-    field public static final int BG_NONE = 0; // 0x0
-  }
-
-  public static abstract interface PlaybackOverlayFragment.InputEventHandler {
-    method public abstract boolean handleInputEvent(android.view.InputEvent);
-  }
-
-  public static class PlaybackOverlayFragment.OnFadeCompleteListener {
-    ctor public PlaybackOverlayFragment.OnFadeCompleteListener();
-    method public void onFadeInComplete();
-    method public void onFadeOutComplete();
-  }
-
-  public class PlaybackOverlaySupportFragment extends android.support.v17.leanback.app.DetailsSupportFragment {
-    ctor public PlaybackOverlaySupportFragment();
-    method public int getBackgroundType();
-    method public android.support.v17.leanback.app.PlaybackOverlaySupportFragment.OnFadeCompleteListener getFadeCompleteListener();
-    method public final android.support.v17.leanback.app.PlaybackOverlaySupportFragment.InputEventHandler getInputEventHandler();
-    method public boolean isFadingEnabled();
-    method public void onDestroyView();
-    method public void onResume();
-    method public void setBackgroundType(int);
-    method public void setFadeCompleteListener(android.support.v17.leanback.app.PlaybackOverlaySupportFragment.OnFadeCompleteListener);
-    method public void setFadingEnabled(boolean);
-    method public final void setInputEventHandler(android.support.v17.leanback.app.PlaybackOverlaySupportFragment.InputEventHandler);
-    method public void tickle();
-    field public static final int BG_DARK = 1; // 0x1
-    field public static final int BG_LIGHT = 2; // 0x2
-    field public static final int BG_NONE = 0; // 0x0
-  }
-
-  public static abstract interface PlaybackOverlaySupportFragment.InputEventHandler {
-    method public abstract boolean handleInputEvent(android.view.InputEvent);
-  }
-
-  public static class PlaybackOverlaySupportFragment.OnFadeCompleteListener {
-    ctor public PlaybackOverlaySupportFragment.OnFadeCompleteListener();
-    method public void onFadeInComplete();
-    method public void onFadeOutComplete();
-  }
-
-  public class RowsFragment extends android.support.v17.leanback.app.BaseRowFragment {
-    ctor public RowsFragment();
-    method public void enableRowScaling(boolean);
-    method protected android.support.v17.leanback.widget.VerticalGridView findGridViewFromRoot(android.view.View);
-    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public android.support.v17.leanback.widget.OnItemViewSelectedListener getOnItemViewSelectedListener();
-    method public void setExpand(boolean);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-  }
-
-  public class RowsSupportFragment extends android.support.v17.leanback.app.BaseRowSupportFragment {
-    ctor public RowsSupportFragment();
-    method public void enableRowScaling(boolean);
-    method protected android.support.v17.leanback.widget.VerticalGridView findGridViewFromRoot(android.view.View);
-    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public android.support.v17.leanback.widget.OnItemViewSelectedListener getOnItemViewSelectedListener();
-    method public void setExpand(boolean);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-  }
-
-  public class SearchFragment extends android.app.Fragment {
-    ctor public SearchFragment();
-    method public static android.os.Bundle createArgs(android.os.Bundle, java.lang.String);
-    method public static android.os.Bundle createArgs(android.os.Bundle, java.lang.String, java.lang.String);
-    method public void displayCompletions(java.util.List<java.lang.String>);
-    method public void displayCompletions(android.view.inputmethod.CompletionInfo[]);
-    method public android.graphics.drawable.Drawable getBadgeDrawable();
-    method public android.content.Intent getRecognizerIntent();
-    method public java.lang.String getTitle();
-    method public static android.support.v17.leanback.app.SearchFragment newInstance(java.lang.String);
-    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public void setSearchQuery(java.lang.String, boolean);
-    method public void setSearchQuery(android.content.Intent, boolean);
-    method public void setSearchResultProvider(android.support.v17.leanback.app.SearchFragment.SearchResultProvider);
-    method public void setSpeechRecognitionCallback(android.support.v17.leanback.widget.SpeechRecognitionCallback);
-    method public void setTitle(java.lang.String);
-    method public void startRecognition();
-  }
-
-  public static abstract interface SearchFragment.SearchResultProvider {
-    method public abstract android.support.v17.leanback.widget.ObjectAdapter getResultsAdapter();
-    method public abstract boolean onQueryTextChange(java.lang.String);
-    method public abstract boolean onQueryTextSubmit(java.lang.String);
-  }
-
-  public class SearchSupportFragment extends android.support.v4.app.Fragment {
-    ctor public SearchSupportFragment();
-    method public static android.os.Bundle createArgs(android.os.Bundle, java.lang.String);
-    method public static android.os.Bundle createArgs(android.os.Bundle, java.lang.String, java.lang.String);
-    method public void displayCompletions(java.util.List<java.lang.String>);
-    method public void displayCompletions(android.view.inputmethod.CompletionInfo[]);
-    method public android.graphics.drawable.Drawable getBadgeDrawable();
-    method public android.content.Intent getRecognizerIntent();
-    method public java.lang.String getTitle();
-    method public static android.support.v17.leanback.app.SearchSupportFragment newInstance(java.lang.String);
-    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public void setSearchQuery(java.lang.String, boolean);
-    method public void setSearchQuery(android.content.Intent, boolean);
-    method public void setSearchResultProvider(android.support.v17.leanback.app.SearchSupportFragment.SearchResultProvider);
-    method public void setSpeechRecognitionCallback(android.support.v17.leanback.widget.SpeechRecognitionCallback);
-    method public void setTitle(java.lang.String);
-    method public void startRecognition();
-  }
-
-  public static abstract interface SearchSupportFragment.SearchResultProvider {
-    method public abstract android.support.v17.leanback.widget.ObjectAdapter getResultsAdapter();
-    method public abstract boolean onQueryTextChange(java.lang.String);
-    method public abstract boolean onQueryTextSubmit(java.lang.String);
-  }
-
-  public class VerticalGridFragment extends android.support.v17.leanback.app.BrandedFragment {
-    ctor public VerticalGridFragment();
-    method protected java.lang.Object createEntranceTransition();
-    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
-    method public android.support.v17.leanback.widget.VerticalGridPresenter getGridPresenter();
-    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public void onDestroyView();
-    method public void onStart();
-    method public void onViewCreated(android.view.View, android.os.Bundle);
-    method protected void runEntranceTransition(java.lang.Object);
-    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public void setGridPresenter(android.support.v17.leanback.widget.VerticalGridPresenter);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public void setSelectedPosition(int);
-  }
-
-  public class VerticalGridSupportFragment extends android.support.v17.leanback.app.BrandedSupportFragment {
-    ctor public VerticalGridSupportFragment();
-    method protected java.lang.Object createEntranceTransition();
-    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
-    method public android.support.v17.leanback.widget.VerticalGridPresenter getGridPresenter();
-    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public void onDestroyView();
-    method public void onStart();
-    method public void onViewCreated(android.view.View, android.os.Bundle);
-    method protected void runEntranceTransition(java.lang.Object);
-    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public void setGridPresenter(android.support.v17.leanback.widget.VerticalGridPresenter);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public void setSelectedPosition(int);
-  }
-
-}
-
-package android.support.v17.leanback.database {
-
-  public abstract class CursorMapper {
-    ctor public CursorMapper();
-    method protected abstract java.lang.Object bind(android.database.Cursor);
-    method protected abstract void bindColumns(android.database.Cursor);
-    method public java.lang.Object convert(android.database.Cursor);
-  }
-
-}
-
-package android.support.v17.leanback.graphics {
-
-  public final class ColorFilterCache {
-    method public static android.support.v17.leanback.graphics.ColorFilterCache getColorFilterCache(int);
-    method public android.graphics.ColorFilter getFilterForLevel(float);
-  }
-
-  public final class ColorFilterDimmer {
-    method public void applyFilterToView(android.view.View);
-    method public static android.support.v17.leanback.graphics.ColorFilterDimmer create(android.support.v17.leanback.graphics.ColorFilterCache, float, float);
-    method public static android.support.v17.leanback.graphics.ColorFilterDimmer createDefault(android.content.Context);
-    method public android.graphics.ColorFilter getColorFilter();
-    method public android.graphics.Paint getPaint();
-    method public void setActiveLevel(float);
-  }
-
-  public final class ColorOverlayDimmer {
-    method public int applyToColor(int);
-    method public static android.support.v17.leanback.graphics.ColorOverlayDimmer createColorOverlayDimmer(int, float, float);
-    method public static android.support.v17.leanback.graphics.ColorOverlayDimmer createDefault(android.content.Context);
-    method public void drawColorOverlay(android.graphics.Canvas, android.view.View, boolean);
-    method public int getAlpha();
-    method public float getAlphaFloat();
-    method public android.graphics.Paint getPaint();
-    method public boolean needsDraw();
-    method public void setActiveLevel(float);
-  }
-
-}
-
-package android.support.v17.leanback.system {
-
-  public class Settings {
-    method public boolean getBoolean(java.lang.String);
-    method public static android.support.v17.leanback.system.Settings getInstance(android.content.Context);
-    method public void setBoolean(java.lang.String, boolean);
-    field public static final java.lang.String PREFER_STATIC_SHADOWS = "PREFER_STATIC_SHADOWS";
-  }
-
-}
-
-package android.support.v17.leanback.widget {
-
-  public abstract class AbstractDetailsDescriptionPresenter extends android.support.v17.leanback.widget.Presenter {
-    ctor public AbstractDetailsDescriptionPresenter();
-    method protected abstract void onBindDescription(android.support.v17.leanback.widget.AbstractDetailsDescriptionPresenter.ViewHolder, java.lang.Object);
-    method public final void onBindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object);
-    method public final android.support.v17.leanback.widget.AbstractDetailsDescriptionPresenter.ViewHolder onCreateViewHolder(android.view.ViewGroup);
-    method public void onUnbindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
-  }
-
-  public static class AbstractDetailsDescriptionPresenter.ViewHolder extends android.support.v17.leanback.widget.Presenter.ViewHolder {
-    ctor public AbstractDetailsDescriptionPresenter.ViewHolder(android.view.View);
-    method public android.widget.TextView getBody();
-    method public android.widget.TextView getSubtitle();
-    method public android.widget.TextView getTitle();
-  }
-
-  public class Action {
-    ctor public Action(long);
-    ctor public Action(long, java.lang.CharSequence);
-    ctor public Action(long, java.lang.CharSequence, java.lang.CharSequence);
-    ctor public Action(long, java.lang.CharSequence, java.lang.CharSequence, android.graphics.drawable.Drawable);
-    method public final void addKeyCode(int);
-    method public final android.graphics.drawable.Drawable getIcon();
-    method public final long getId();
-    method public final java.lang.CharSequence getLabel1();
-    method public final java.lang.CharSequence getLabel2();
-    method public final void removeKeyCode(int);
-    method public final boolean respondsToKeyCode(int);
-    method public final void setIcon(android.graphics.drawable.Drawable);
-    method public final void setId(long);
-    method public final void setLabel1(java.lang.CharSequence);
-    method public final void setLabel2(java.lang.CharSequence);
-  }
-
-  public class ArrayObjectAdapter extends android.support.v17.leanback.widget.ObjectAdapter {
-    ctor public ArrayObjectAdapter(android.support.v17.leanback.widget.PresenterSelector);
-    ctor public ArrayObjectAdapter(android.support.v17.leanback.widget.Presenter);
-    ctor public ArrayObjectAdapter();
-    method public void add(java.lang.Object);
-    method public void add(int, java.lang.Object);
-    method public void addAll(int, java.util.Collection);
-    method public void clear();
-    method public java.lang.Object get(int);
-    method public int indexOf(java.lang.Object);
-    method public void notifyArrayItemRangeChanged(int, int);
-    method public boolean remove(java.lang.Object);
-    method public int removeItems(int, int);
-    method public void replace(int, java.lang.Object);
-    method public int size();
-    method public java.util.List<E> unmodifiableList();
-  }
-
-  public class BaseCardView extends android.widget.FrameLayout {
-    ctor public BaseCardView(android.content.Context);
-    ctor public BaseCardView(android.content.Context, android.util.AttributeSet);
-    ctor public BaseCardView(android.content.Context, android.util.AttributeSet, int);
-    method public int getCardType();
-    method public int getExtraVisibility();
-    method public int getInfoVisibility();
-    method public boolean isSelectedAnimationDelayed();
-    method public void setCardType(int);
-    method public void setExtraVisibility(int);
-    method public void setInfoVisibility(int);
-    method public void setSelectedAnimationDelayed(boolean);
-    field public static final int CARD_REGION_VISIBLE_ACTIVATED = 1; // 0x1
-    field public static final int CARD_REGION_VISIBLE_ALWAYS = 0; // 0x0
-    field public static final int CARD_REGION_VISIBLE_SELECTED = 2; // 0x2
-    field public static final int CARD_TYPE_INFO_OVER = 1; // 0x1
-    field public static final int CARD_TYPE_INFO_UNDER = 2; // 0x2
-    field public static final int CARD_TYPE_INFO_UNDER_WITH_EXTRA = 3; // 0x3
-    field public static final int CARD_TYPE_MAIN_ONLY = 0; // 0x0
-  }
-
-  public static class BaseCardView.LayoutParams extends android.widget.FrameLayout.LayoutParams {
-    ctor public BaseCardView.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public BaseCardView.LayoutParams(int, int);
-    ctor public BaseCardView.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public BaseCardView.LayoutParams(android.support.v17.leanback.widget.BaseCardView.LayoutParams);
-    field public static final int VIEW_TYPE_EXTRA = 2; // 0x2
-    field public static final int VIEW_TYPE_INFO = 1; // 0x1
-    field public static final int VIEW_TYPE_MAIN = 0; // 0x0
-    field public int viewType;
-  }
-
-  public class BrowseFrameLayout extends android.widget.FrameLayout {
-    ctor public BrowseFrameLayout(android.content.Context);
-    ctor public BrowseFrameLayout(android.content.Context, android.util.AttributeSet);
-    ctor public BrowseFrameLayout(android.content.Context, android.util.AttributeSet, int);
-    method public android.support.v17.leanback.widget.BrowseFrameLayout.OnChildFocusListener getOnChildFocusListener();
-    method public android.support.v17.leanback.widget.BrowseFrameLayout.OnFocusSearchListener getOnFocusSearchListener();
-    method public void setOnChildFocusListener(android.support.v17.leanback.widget.BrowseFrameLayout.OnChildFocusListener);
-    method public void setOnFocusSearchListener(android.support.v17.leanback.widget.BrowseFrameLayout.OnFocusSearchListener);
-  }
-
-  public static abstract interface BrowseFrameLayout.OnChildFocusListener {
-    method public abstract void onRequestChildFocus(android.view.View, android.view.View);
-    method public abstract boolean onRequestFocusInDescendants(int, android.graphics.Rect);
-  }
-
-  public static abstract interface BrowseFrameLayout.OnFocusSearchListener {
-    method public abstract android.view.View onFocusSearch(android.view.View, int);
-  }
-
-  public final class ClassPresenterSelector extends android.support.v17.leanback.widget.PresenterSelector {
-    ctor public ClassPresenterSelector();
-    method public void addClassPresenter(java.lang.Class<?>, android.support.v17.leanback.widget.Presenter);
-    method public android.support.v17.leanback.widget.Presenter getPresenter(java.lang.Object);
-  }
-
-  public class ControlButtonPresenterSelector extends android.support.v17.leanback.widget.PresenterSelector {
-    ctor public ControlButtonPresenterSelector();
-    method public android.support.v17.leanback.widget.Presenter getPresenter(java.lang.Object);
-    method public android.support.v17.leanback.widget.Presenter getPrimaryPresenter();
-    method public android.support.v17.leanback.widget.Presenter getSecondaryPresenter();
-  }
-
-  public class CursorObjectAdapter extends android.support.v17.leanback.widget.ObjectAdapter {
-    ctor public CursorObjectAdapter(android.support.v17.leanback.widget.PresenterSelector);
-    ctor public CursorObjectAdapter(android.support.v17.leanback.widget.Presenter);
-    ctor public CursorObjectAdapter();
-    method public void changeCursor(android.database.Cursor);
-    method public void close();
-    method public java.lang.Object get(int);
-    method public final android.database.Cursor getCursor();
-    method public final android.support.v17.leanback.database.CursorMapper getMapper();
-    method protected final void invalidateCache(int);
-    method protected final void invalidateCache(int, int);
-    method public boolean isClosed();
-    method protected void onCursorChanged();
-    method protected void onMapperChanged();
-    method public final void setMapper(android.support.v17.leanback.database.CursorMapper);
-    method public int size();
-    method public android.database.Cursor swapCursor(android.database.Cursor);
-  }
-
-  public class DetailsOverviewLogoPresenter extends android.support.v17.leanback.widget.Presenter {
-    ctor public DetailsOverviewLogoPresenter();
-    method public boolean isBoundToImage(android.support.v17.leanback.widget.DetailsOverviewLogoPresenter.ViewHolder, android.support.v17.leanback.widget.DetailsOverviewRow);
-    method public void onBindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object);
-    method public android.support.v17.leanback.widget.Presenter.ViewHolder onCreateViewHolder(android.view.ViewGroup);
-    method public void onUnbindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public void setContext(android.support.v17.leanback.widget.DetailsOverviewLogoPresenter.ViewHolder, android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder, android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter);
-  }
-
-  public static class DetailsOverviewLogoPresenter.ViewHolder extends android.support.v17.leanback.widget.Presenter.ViewHolder {
-    ctor public DetailsOverviewLogoPresenter.ViewHolder(android.view.View);
-    field protected android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter mParentPresenter;
-    field protected android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder mParentViewHolder;
-  }
-
-  public class DetailsOverviewRow extends android.support.v17.leanback.widget.Row {
-    ctor public DetailsOverviewRow(java.lang.Object);
-    method public final deprecated void addAction(android.support.v17.leanback.widget.Action);
-    method public final deprecated void addAction(int, android.support.v17.leanback.widget.Action);
-    method public android.support.v17.leanback.widget.Action getActionForKeyCode(int);
-    method public final deprecated java.util.List<android.support.v17.leanback.widget.Action> getActions();
-    method public final android.support.v17.leanback.widget.ObjectAdapter getActionsAdapter();
-    method public final android.graphics.drawable.Drawable getImageDrawable();
-    method public final java.lang.Object getItem();
-    method public boolean isImageScaleUpAllowed();
-    method public final deprecated boolean removeAction(android.support.v17.leanback.widget.Action);
-    method public final void setActionsAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public final void setImageBitmap(android.content.Context, android.graphics.Bitmap);
-    method public final void setImageDrawable(android.graphics.drawable.Drawable);
-    method public void setImageScaleUpAllowed(boolean);
-    method public final void setItem(java.lang.Object);
-  }
-
-  public static class DetailsOverviewRow.Listener {
-    ctor public DetailsOverviewRow.Listener();
-    method public void onActionsAdapterChanged(android.support.v17.leanback.widget.DetailsOverviewRow);
-    method public void onImageDrawableChanged(android.support.v17.leanback.widget.DetailsOverviewRow);
-    method public void onItemChanged(android.support.v17.leanback.widget.DetailsOverviewRow);
-  }
-
-  public deprecated class DetailsOverviewRowPresenter extends android.support.v17.leanback.widget.RowPresenter {
-    ctor public DetailsOverviewRowPresenter(android.support.v17.leanback.widget.Presenter);
-    method protected android.support.v17.leanback.widget.RowPresenter.ViewHolder createRowViewHolder(android.view.ViewGroup);
-    method public int getBackgroundColor();
-    method public android.support.v17.leanback.widget.OnActionClickedListener getOnActionClickedListener();
-    method public boolean isStyleLarge();
-    method public final boolean isUsingDefaultSelectEffect();
-    method public void setBackgroundColor(int);
-    method public void setOnActionClickedListener(android.support.v17.leanback.widget.OnActionClickedListener);
-    method public final void setSharedElementEnterTransition(android.app.Activity, java.lang.String, long);
-    method public final void setSharedElementEnterTransition(android.app.Activity, java.lang.String);
-    method public void setStyleLarge(boolean);
-  }
-
-  public final class DetailsOverviewRowPresenter.ViewHolder extends android.support.v17.leanback.widget.RowPresenter.ViewHolder {
-    ctor public DetailsOverviewRowPresenter.ViewHolder(android.view.View, android.support.v17.leanback.widget.Presenter);
-    field public final android.support.v17.leanback.widget.Presenter.ViewHolder mDetailsDescriptionViewHolder;
-  }
-
-  public abstract interface FacetProvider {
-    method public abstract java.lang.Object getFacet(java.lang.Class<?>);
-  }
-
-  public abstract interface FacetProviderAdapter {
-    method public abstract android.support.v17.leanback.widget.FacetProvider getFacetProvider(int);
-  }
-
-  public abstract interface FocusHighlight {
-    field public static final int ZOOM_FACTOR_LARGE = 3; // 0x3
-    field public static final int ZOOM_FACTOR_MEDIUM = 2; // 0x2
-    field public static final int ZOOM_FACTOR_NONE = 0; // 0x0
-    field public static final int ZOOM_FACTOR_SMALL = 1; // 0x1
-    field public static final int ZOOM_FACTOR_XSMALL = 4; // 0x4
-  }
-
-  public class FocusHighlightHelper {
-    ctor public FocusHighlightHelper();
-    method public static void setupBrowseItemFocusHighlight(android.support.v17.leanback.widget.ItemBridgeAdapter, int, boolean);
-    method public static void setupHeaderItemFocusHighlight(android.support.v17.leanback.widget.VerticalGridView);
-  }
-
-  public abstract interface FragmentAnimationProvider {
-    method public abstract void onImeAppearing(java.util.List<android.animation.Animator>);
-    method public abstract void onImeDisappearing(java.util.List<android.animation.Animator>);
-  }
-
-  public class FullWidthDetailsOverviewRowPresenter extends android.support.v17.leanback.widget.RowPresenter {
-    ctor public FullWidthDetailsOverviewRowPresenter(android.support.v17.leanback.widget.Presenter);
-    ctor public FullWidthDetailsOverviewRowPresenter(android.support.v17.leanback.widget.Presenter, android.support.v17.leanback.widget.DetailsOverviewLogoPresenter);
-    method protected android.support.v17.leanback.widget.RowPresenter.ViewHolder createRowViewHolder(android.view.ViewGroup);
-    method public final int getActionsBackgroundColor();
-    method public final int getAlignmentMode();
-    method public final int getBackgroundColor();
-    method public final int getInitialState();
-    method protected int getLayoutResourceId();
-    method public android.support.v17.leanback.widget.OnActionClickedListener getOnActionClickedListener();
-    method public final boolean isParticipatingEntranceTransition();
-    method public final boolean isUsingDefaultSelectEffect();
-    method public final void notifyOnBindLogo(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder);
-    method protected void onLayoutLogo(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder, int, boolean);
-    method protected void onLayoutOverviewFrame(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder, int, boolean);
-    method protected void onStateChanged(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder, int);
-    method public final void setActionsBackgroundColor(int);
-    method public final void setAlignmentMode(int);
-    method public final void setBackgroundColor(int);
-    method public final void setInitialState(int);
-    method public final void setListener(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.Listener);
-    method public void setOnActionClickedListener(android.support.v17.leanback.widget.OnActionClickedListener);
-    method public final void setParticipatingEntranceTransition(boolean);
-    method public final void setState(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder, int);
-    field public static final int ALIGN_MODE_MIDDLE = 1; // 0x1
-    field public static final int ALIGN_MODE_START = 0; // 0x0
-    field public static final int STATE_FULL = 1; // 0x1
-    field public static final int STATE_HALF = 0; // 0x0
-    field public static final int STATE_SMALL = 2; // 0x2
-    field protected int mInitialState;
-  }
-
-  public static abstract class FullWidthDetailsOverviewRowPresenter.Listener {
-    ctor public FullWidthDetailsOverviewRowPresenter.Listener();
-    method public void onBindLogo(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder);
-  }
-
-  public class FullWidthDetailsOverviewRowPresenter.ViewHolder extends android.support.v17.leanback.widget.RowPresenter.ViewHolder {
-    ctor public FullWidthDetailsOverviewRowPresenter.ViewHolder(android.view.View, android.support.v17.leanback.widget.Presenter, android.support.v17.leanback.widget.DetailsOverviewLogoPresenter);
-    method protected android.support.v17.leanback.widget.DetailsOverviewRow.Listener createRowListener();
-    method public final android.view.ViewGroup getActionsRow();
-    method public final android.view.ViewGroup getDetailsDescriptionFrame();
-    method public final android.support.v17.leanback.widget.Presenter.ViewHolder getDetailsDescriptionViewHolder();
-    method public final android.support.v17.leanback.widget.DetailsOverviewLogoPresenter.ViewHolder getLogoViewHolder();
-    method public final android.view.ViewGroup getOverviewView();
-    method public final int getState();
-    field protected final android.support.v17.leanback.widget.DetailsOverviewRow.Listener mRowListener;
-  }
-
-  public class FullWidthDetailsOverviewRowPresenter.ViewHolder.DetailsOverviewRowListener extends android.support.v17.leanback.widget.DetailsOverviewRow.Listener {
-    ctor public FullWidthDetailsOverviewRowPresenter.ViewHolder.DetailsOverviewRowListener();
-  }
-
-  public class FullWidthDetailsOverviewSharedElementHelper extends android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.Listener {
-    ctor public FullWidthDetailsOverviewSharedElementHelper();
-    method public boolean getAutoStartSharedElementTransition();
-    method public void setAutoStartSharedElementTransition(boolean);
-    method public void setSharedElementEnterTransition(android.app.Activity, java.lang.String);
-    method public void setSharedElementEnterTransition(android.app.Activity, java.lang.String, long);
-    method public void startPostponedEnterTransition();
-  }
-
-  public class GuidanceStylist implements android.support.v17.leanback.widget.FragmentAnimationProvider {
-    ctor public GuidanceStylist();
-    method public android.widget.TextView getBreadcrumbView();
-    method public android.widget.TextView getDescriptionView();
-    method public android.widget.ImageView getIconView();
-    method public android.widget.TextView getTitleView();
-    method public android.view.View onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.support.v17.leanback.widget.GuidanceStylist.Guidance);
-    method public void onImeAppearing(java.util.List<android.animation.Animator>);
-    method public void onImeDisappearing(java.util.List<android.animation.Animator>);
-    method public int onProvideLayoutId();
-  }
-
-  public static class GuidanceStylist.Guidance {
-    ctor public GuidanceStylist.Guidance(java.lang.String, java.lang.String, java.lang.String, android.graphics.drawable.Drawable);
-    method public java.lang.String getBreadcrumb();
-    method public java.lang.String getDescription();
-    method public android.graphics.drawable.Drawable getIconDrawable();
-    method public java.lang.String getTitle();
-  }
-
-  public class GuidedAction extends android.support.v17.leanback.widget.Action {
-    method public int getCheckSetId();
-    method public java.lang.CharSequence getDescription();
-    method public java.lang.CharSequence getEditTitle();
-    method public android.content.Intent getIntent();
-    method public java.lang.CharSequence getTitle();
-    method public boolean hasMultilineDescription();
-    method public boolean hasNext();
-    method public boolean infoOnly();
-    method public boolean isChecked();
-    method public boolean isEditTitleUsed();
-    method public boolean isEditable();
-    method public boolean isEnabled();
-    method public void setChecked(boolean);
-    method public void setDescription(java.lang.CharSequence);
-    method public void setEditTitle(java.lang.CharSequence);
-    method public void setEnabled(boolean);
-    method public void setTitle(java.lang.CharSequence);
-    field public static final int DEFAULT_CHECK_SET_ID = 1; // 0x1
-    field public static final int NO_CHECK_SET = 0; // 0x0
-    field public static final int NO_DRAWABLE = 0; // 0x0
-  }
-
-  public static class GuidedAction.Builder {
-    ctor public GuidedAction.Builder();
-    method public android.support.v17.leanback.widget.GuidedAction build();
-    method public android.support.v17.leanback.widget.GuidedAction.Builder checkSetId(int);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder checked(boolean);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder description(java.lang.String);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder editTitle(java.lang.String);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder editable(boolean);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder enabled(boolean);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder hasNext(boolean);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder icon(android.graphics.drawable.Drawable);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder iconResourceId(int, android.content.Context);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder id(long);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder infoOnly(boolean);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder intent(android.content.Intent);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder multilineDescription(boolean);
-    method public android.support.v17.leanback.widget.GuidedAction.Builder title(java.lang.String);
-  }
-
-  public class GuidedActionEditText extends android.widget.EditText implements android.support.v17.leanback.widget.ImeKeyMonitor {
-    ctor public GuidedActionEditText(android.content.Context);
-    ctor public GuidedActionEditText(android.content.Context, android.util.AttributeSet);
-    ctor public GuidedActionEditText(android.content.Context, android.util.AttributeSet, int);
-    method public void setImeKeyListener(android.support.v17.leanback.widget.ImeKeyMonitor.ImeKeyListener);
-  }
-
-  public class GuidedActionsStylist implements android.support.v17.leanback.widget.FragmentAnimationProvider {
-    ctor public GuidedActionsStylist();
-    method public android.support.v17.leanback.widget.VerticalGridView getActionsGridView();
-    method public void onAnimateItemChecked(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, boolean);
-    method public void onAnimateItemFocused(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, boolean);
-    method public void onAnimateItemPressed(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, boolean);
-    method public void onBindViewHolder(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, android.support.v17.leanback.widget.GuidedAction);
-    method public android.view.View onCreateView(android.view.LayoutInflater, android.view.ViewGroup);
-    method public android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder onCreateViewHolder(android.view.ViewGroup);
-    method public void onImeAppearing(java.util.List<android.animation.Animator>);
-    method public void onImeDisappearing(java.util.List<android.animation.Animator>);
-    method public int onProvideItemLayoutId();
-    method public int onProvideLayoutId();
-    field protected android.support.v17.leanback.widget.VerticalGridView mActionsGridView;
-    field protected android.view.View mMainView;
-    field protected android.view.View mSelectorView;
-  }
-
-  public static class GuidedActionsStylist.ViewHolder {
-    ctor public GuidedActionsStylist.ViewHolder(android.view.View);
-    method public android.widget.ImageView getCheckmarkView();
-    method public android.widget.ImageView getChevronView();
-    method public android.view.View getContentView();
-    method public android.widget.TextView getDescriptionView();
-    method public android.widget.EditText getEditableTitleView();
-    method public android.widget.ImageView getIconView();
-    method public android.widget.TextView getTitleView();
-    field public final android.view.View view;
-  }
-
-  public class HeaderItem {
-    ctor public HeaderItem(long, java.lang.String);
-    ctor public HeaderItem(java.lang.String);
-    method public final long getId();
-    method public final java.lang.String getName();
-  }
-
-  public class HorizontalGridView extends android.support.v7.widget.RecyclerView {
-    ctor public HorizontalGridView(android.content.Context);
-    ctor public HorizontalGridView(android.content.Context, android.util.AttributeSet);
-    ctor public HorizontalGridView(android.content.Context, android.util.AttributeSet, int);
-    method public final boolean getFadingLeftEdge();
-    method public final int getFadingLeftEdgeLength();
-    method public final int getFadingLeftEdgeOffset();
-    method public final boolean getFadingRightEdge();
-    method public final int getFadingRightEdgeLength();
-    method public final int getFadingRightEdgeOffset();
-    method protected void initAttributes(android.content.Context, android.util.AttributeSet);
-    method public final void setFadingLeftEdge(boolean);
-    method public final void setFadingLeftEdgeLength(int);
-    method public final void setFadingLeftEdgeOffset(int);
-    method public final void setFadingRightEdge(boolean);
-    method public final void setFadingRightEdgeLength(int);
-    method public final void setFadingRightEdgeOffset(int);
-    method public void setNumRows(int);
-    method public void setRowHeight(int);
-  }
-
-  public final class HorizontalHoverCardSwitcher extends android.support.v17.leanback.widget.PresenterSwitcher {
-    ctor public HorizontalHoverCardSwitcher();
-    method protected void insertView(android.view.View);
-    method public void select(android.support.v17.leanback.widget.HorizontalGridView, android.view.View, java.lang.Object);
-  }
-
-  public class ImageCardView extends android.support.v17.leanback.widget.BaseCardView {
-    ctor public ImageCardView(android.content.Context, int);
-    ctor public ImageCardView(android.content.Context, android.util.AttributeSet, int);
-    ctor public ImageCardView(android.content.Context);
-    ctor public ImageCardView(android.content.Context, android.util.AttributeSet);
-    method public android.graphics.drawable.Drawable getBadgeImage();
-    method public java.lang.CharSequence getContentText();
-    method public android.graphics.drawable.Drawable getInfoAreaBackground();
-    method public android.graphics.drawable.Drawable getMainImage();
-    method public final android.widget.ImageView getMainImageView();
-    method public java.lang.CharSequence getTitleText();
-    method public void setBadgeImage(android.graphics.drawable.Drawable);
-    method public void setContentText(java.lang.CharSequence);
-    method public void setInfoAreaBackground(android.graphics.drawable.Drawable);
-    method public void setInfoAreaBackgroundColor(int);
-    method public void setMainImage(android.graphics.drawable.Drawable);
-    method public void setMainImage(android.graphics.drawable.Drawable, boolean);
-    method public void setMainImageAdjustViewBounds(boolean);
-    method public void setMainImageDimensions(int, int);
-    method public void setMainImageScaleType(android.widget.ImageView.ScaleType);
-    method public void setTitleText(java.lang.CharSequence);
-    field public static final int CARD_TYPE_FLAG_CONTENT = 2; // 0x2
-    field public static final int CARD_TYPE_FLAG_ICON_LEFT = 8; // 0x8
-    field public static final int CARD_TYPE_FLAG_ICON_RIGHT = 4; // 0x4
-    field public static final int CARD_TYPE_FLAG_IMAGE_ONLY = 0; // 0x0
-    field public static final int CARD_TYPE_FLAG_TITLE = 1; // 0x1
-  }
-
-  public abstract interface ImeKeyMonitor {
-    method public abstract void setImeKeyListener(android.support.v17.leanback.widget.ImeKeyMonitor.ImeKeyListener);
-  }
-
-  public static abstract interface ImeKeyMonitor.ImeKeyListener {
-    method public abstract boolean onKeyPreIme(android.widget.EditText, int, android.view.KeyEvent);
-  }
-
-  public final class ItemAlignmentFacet {
-    ctor public ItemAlignmentFacet();
-    method public android.support.v17.leanback.widget.ItemAlignmentFacet.ItemAlignmentDef[] getAlignmentDefs();
-    method public boolean isMultiAlignment();
-    method public void setAlignmentDefs(android.support.v17.leanback.widget.ItemAlignmentFacet.ItemAlignmentDef[]);
-    field public static final float ITEM_ALIGN_OFFSET_PERCENT_DISABLED = -1.0f;
-  }
-
-  public static class ItemAlignmentFacet.ItemAlignmentDef {
-    ctor public ItemAlignmentFacet.ItemAlignmentDef();
-    method public final int getItemAlignmentFocusViewId();
-    method public final int getItemAlignmentOffset();
-    method public final float getItemAlignmentOffsetPercent();
-    method public final int getItemAlignmentViewId();
-    method public final boolean isItemAlignmentOffsetWithPadding();
-    method public final void setItemAlignmentFocusViewId(int);
-    method public final void setItemAlignmentOffset(int);
-    method public final void setItemAlignmentOffsetPercent(float);
-    method public final void setItemAlignmentOffsetWithPadding(boolean);
-    method public final void setItemAlignmentViewId(int);
-  }
-
-  public class ItemBridgeAdapter extends android.support.v7.widget.RecyclerView.Adapter implements android.support.v17.leanback.widget.FacetProviderAdapter {
-    ctor public ItemBridgeAdapter(android.support.v17.leanback.widget.ObjectAdapter, android.support.v17.leanback.widget.PresenterSelector);
-    ctor public ItemBridgeAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    ctor public ItemBridgeAdapter();
-    method public void clear();
-    method public android.support.v17.leanback.widget.FacetProvider getFacetProvider(int);
-    method public int getItemCount();
-    method public java.util.ArrayList<android.support.v17.leanback.widget.Presenter> getPresenterMapper();
-    method public android.support.v17.leanback.widget.ItemBridgeAdapter.Wrapper getWrapper();
-    method protected void onAddPresenter(android.support.v17.leanback.widget.Presenter, int);
-    method protected void onAttachedToWindow(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
-    method protected void onBind(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
-    method public final void onBindViewHolder(android.support.v7.widget.RecyclerView.ViewHolder, int);
-    method protected void onCreate(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
-    method public final android.support.v7.widget.RecyclerView.ViewHolder onCreateViewHolder(android.view.ViewGroup, int);
-    method protected void onDetachedFromWindow(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
-    method protected void onUnbind(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
-    method public final void onViewAttachedToWindow(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public final void onViewDetachedFromWindow(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public final void onViewRecycled(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public void setAdapterListener(android.support.v17.leanback.widget.ItemBridgeAdapter.AdapterListener);
-    method public void setPresenterMapper(java.util.ArrayList<android.support.v17.leanback.widget.Presenter>);
-    method public void setWrapper(android.support.v17.leanback.widget.ItemBridgeAdapter.Wrapper);
-  }
-
-  public static class ItemBridgeAdapter.AdapterListener {
-    ctor public ItemBridgeAdapter.AdapterListener();
-    method public void onAddPresenter(android.support.v17.leanback.widget.Presenter, int);
-    method public void onAttachedToWindow(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
-    method public void onBind(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
-    method public void onCreate(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
-    method public void onDetachedFromWindow(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
-    method public void onUnbind(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
-  }
-
-  public class ItemBridgeAdapter.ViewHolder extends android.support.v7.widget.RecyclerView.ViewHolder implements android.support.v17.leanback.widget.FacetProvider {
-    method public final java.lang.Object getExtraObject();
-    method public java.lang.Object getFacet(java.lang.Class<?>);
-    method public final java.lang.Object getItem();
-    method public final android.support.v17.leanback.widget.Presenter getPresenter();
-    method public final android.support.v17.leanback.widget.Presenter.ViewHolder getViewHolder();
-    method public void setExtraObject(java.lang.Object);
-  }
-
-  public static abstract class ItemBridgeAdapter.Wrapper {
-    ctor public ItemBridgeAdapter.Wrapper();
-    method public abstract android.view.View createWrapper(android.view.View);
-    method public abstract void wrap(android.view.View, android.view.View);
-  }
-
-  public class ItemBridgeAdapterShadowOverlayWrapper extends android.support.v17.leanback.widget.ItemBridgeAdapter.Wrapper {
-    ctor public ItemBridgeAdapterShadowOverlayWrapper(android.support.v17.leanback.widget.ShadowOverlayHelper);
-    method public android.view.View createWrapper(android.view.View);
-    method public void wrap(android.view.View, android.view.View);
-  }
-
-  public class ListRow extends android.support.v17.leanback.widget.Row {
-    ctor public ListRow(android.support.v17.leanback.widget.HeaderItem, android.support.v17.leanback.widget.ObjectAdapter);
-    ctor public ListRow(long, android.support.v17.leanback.widget.HeaderItem, android.support.v17.leanback.widget.ObjectAdapter);
-    ctor public ListRow(android.support.v17.leanback.widget.ObjectAdapter);
-    method public final android.support.v17.leanback.widget.ObjectAdapter getAdapter();
-  }
-
-  public final class ListRowHoverCardView extends android.widget.LinearLayout {
-    ctor public ListRowHoverCardView(android.content.Context);
-    ctor public ListRowHoverCardView(android.content.Context, android.util.AttributeSet);
-    ctor public ListRowHoverCardView(android.content.Context, android.util.AttributeSet, int);
-    method public final java.lang.CharSequence getDescription();
-    method public final java.lang.CharSequence getTitle();
-    method public final void setDescription(java.lang.CharSequence);
-    method public final void setTitle(java.lang.CharSequence);
-  }
-
-  public class ListRowPresenter extends android.support.v17.leanback.widget.RowPresenter {
-    ctor public ListRowPresenter();
-    ctor public ListRowPresenter(int);
-    ctor public ListRowPresenter(int, boolean);
-    method public final boolean areChildRoundedCornersEnabled();
-    method protected android.support.v17.leanback.widget.RowPresenter.ViewHolder createRowViewHolder(android.view.ViewGroup);
-    method protected android.support.v17.leanback.widget.ShadowOverlayHelper.Options createShadowOverlayOptions();
-    method public final void enableChildRoundedCorners(boolean);
-    method public int getExpandedRowHeight();
-    method public final int getFocusZoomFactor();
-    method public final android.support.v17.leanback.widget.PresenterSelector getHoverCardPresenterSelector();
-    method public int getRecycledPoolSize(android.support.v17.leanback.widget.Presenter);
-    method public int getRowHeight();
-    method public final boolean getShadowEnabled();
-    method public final deprecated int getZoomFactor();
-    method public final boolean isFocusDimmerUsed();
-    method public final boolean isKeepChildForeground();
-    method public boolean isUsingDefaultListSelectEffect();
-    method public final boolean isUsingDefaultSelectEffect();
-    method public boolean isUsingDefaultShadow();
-    method public boolean isUsingZOrder(android.content.Context);
-    method public void setExpandedRowHeight(int);
-    method public final void setHoverCardPresenterSelector(android.support.v17.leanback.widget.PresenterSelector);
-    method public final void setKeepChildForeground(boolean);
-    method public void setRecycledPoolSize(android.support.v17.leanback.widget.Presenter, int);
-    method public void setRowHeight(int);
-    method public final void setShadowEnabled(boolean);
-  }
-
-  public static class ListRowPresenter.ViewHolder extends android.support.v17.leanback.widget.RowPresenter.ViewHolder {
-    ctor public ListRowPresenter.ViewHolder(android.view.View, android.support.v17.leanback.widget.HorizontalGridView, android.support.v17.leanback.widget.ListRowPresenter);
-    method public final android.support.v17.leanback.widget.ItemBridgeAdapter getBridgeAdapter();
-    method public final android.support.v17.leanback.widget.HorizontalGridView getGridView();
-    method public final android.support.v17.leanback.widget.ListRowPresenter getListRowPresenter();
-  }
-
-  public final class ListRowView extends android.widget.LinearLayout {
-    ctor public ListRowView(android.content.Context);
-    ctor public ListRowView(android.content.Context, android.util.AttributeSet);
-    ctor public ListRowView(android.content.Context, android.util.AttributeSet, int);
-    method public android.support.v17.leanback.widget.HorizontalGridView getGridView();
-  }
-
-  public abstract class ObjectAdapter {
-    ctor public ObjectAdapter(android.support.v17.leanback.widget.PresenterSelector);
-    ctor public ObjectAdapter(android.support.v17.leanback.widget.Presenter);
-    ctor public ObjectAdapter();
-    method public abstract java.lang.Object get(int);
-    method public long getId(int);
-    method public final android.support.v17.leanback.widget.Presenter getPresenter(java.lang.Object);
-    method public final android.support.v17.leanback.widget.PresenterSelector getPresenterSelector();
-    method public final boolean hasStableIds();
-    method protected final void notifyChanged();
-    method protected final void notifyItemRangeChanged(int, int);
-    method protected final void notifyItemRangeInserted(int, int);
-    method protected final void notifyItemRangeRemoved(int, int);
-    method protected void onHasStableIdsChanged();
-    method protected void onPresenterSelectorChanged();
-    method public final void registerObserver(android.support.v17.leanback.widget.ObjectAdapter.DataObserver);
-    method public final void setHasStableIds(boolean);
-    method public final void setPresenterSelector(android.support.v17.leanback.widget.PresenterSelector);
-    method public abstract int size();
-    method public final void unregisterAllObservers();
-    method public final void unregisterObserver(android.support.v17.leanback.widget.ObjectAdapter.DataObserver);
-    field public static final int NO_ID = -1; // 0xffffffff
-  }
-
-  public static abstract class ObjectAdapter.DataObserver {
-    ctor public ObjectAdapter.DataObserver();
-    method public void onChanged();
-    method public void onItemRangeChanged(int, int);
-    method public void onItemRangeInserted(int, int);
-    method public void onItemRangeRemoved(int, int);
-  }
-
-  public abstract interface OnActionClickedListener {
-    method public abstract void onActionClicked(android.support.v17.leanback.widget.Action);
-  }
-
-  public abstract interface OnChildLaidOutListener {
-    method public abstract void onChildLaidOut(android.view.ViewGroup, android.view.View, int, long);
-  }
-
-  public abstract deprecated interface OnChildSelectedListener {
-    method public abstract void onChildSelected(android.view.ViewGroup, android.view.View, int, long);
-  }
-
-  public abstract class OnChildViewHolderSelectedListener {
-    ctor public OnChildViewHolderSelectedListener();
-    method public void onChildViewHolderSelected(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder, int, int);
-  }
-
-  public abstract interface OnItemViewClickedListener {
-    method public abstract void onItemClicked(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object, android.support.v17.leanback.widget.RowPresenter.ViewHolder, android.support.v17.leanback.widget.Row);
-  }
-
-  public abstract interface OnItemViewSelectedListener {
-    method public abstract void onItemSelected(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object, android.support.v17.leanback.widget.RowPresenter.ViewHolder, android.support.v17.leanback.widget.Row);
-  }
-
-  public class PlaybackControlsRow extends android.support.v17.leanback.widget.Row {
-    ctor public PlaybackControlsRow(java.lang.Object);
-    ctor public PlaybackControlsRow();
-    method public android.support.v17.leanback.widget.Action getActionForKeyCode(int);
-    method public android.support.v17.leanback.widget.Action getActionForKeyCode(android.support.v17.leanback.widget.ObjectAdapter, int);
-    method public int getBufferedProgress();
-    method public int getCurrentTime();
-    method public final android.graphics.drawable.Drawable getImageDrawable();
-    method public final java.lang.Object getItem();
-    method public final android.support.v17.leanback.widget.ObjectAdapter getPrimaryActionsAdapter();
-    method public final android.support.v17.leanback.widget.ObjectAdapter getSecondaryActionsAdapter();
-    method public int getTotalTime();
-    method public void setBufferedProgress(int);
-    method public void setCurrentTime(int);
-    method public final void setImageBitmap(android.content.Context, android.graphics.Bitmap);
-    method public final void setImageDrawable(android.graphics.drawable.Drawable);
-    method public final void setPrimaryActionsAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public final void setSecondaryActionsAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public void setTotalTime(int);
-  }
-
-  public static class PlaybackControlsRow.ClosedCaptioningAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
-    ctor public PlaybackControlsRow.ClosedCaptioningAction(android.content.Context);
-    ctor public PlaybackControlsRow.ClosedCaptioningAction(android.content.Context, int);
-    field public static int OFF;
-    field public static int ON;
-  }
-
-  public static class PlaybackControlsRow.FastForwardAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
-    ctor public PlaybackControlsRow.FastForwardAction(android.content.Context);
-    ctor public PlaybackControlsRow.FastForwardAction(android.content.Context, int);
-  }
-
-  public static class PlaybackControlsRow.HighQualityAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
-    ctor public PlaybackControlsRow.HighQualityAction(android.content.Context);
-    ctor public PlaybackControlsRow.HighQualityAction(android.content.Context, int);
-    field public static int OFF;
-    field public static int ON;
-  }
-
-  public static class PlaybackControlsRow.MoreActions extends android.support.v17.leanback.widget.Action {
-    ctor public PlaybackControlsRow.MoreActions(android.content.Context);
-  }
-
-  public static abstract class PlaybackControlsRow.MultiAction extends android.support.v17.leanback.widget.Action {
-    ctor public PlaybackControlsRow.MultiAction(int);
-    method public int getActionCount();
-    method public android.graphics.drawable.Drawable getDrawable(int);
-    method public int getIndex();
-    method public java.lang.String getLabel(int);
-    method public java.lang.String getSecondaryLabel(int);
-    method public void nextIndex();
-    method public void setDrawables(android.graphics.drawable.Drawable[]);
-    method public void setIndex(int);
-    method public void setLabels(java.lang.String[]);
-    method public void setSecondaryLabels(java.lang.String[]);
-  }
-
-  public static class PlaybackControlsRow.PlayPauseAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
-    ctor public PlaybackControlsRow.PlayPauseAction(android.content.Context);
-    field public static int PAUSE;
-    field public static int PLAY;
-  }
-
-  public static class PlaybackControlsRow.RepeatAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
-    ctor public PlaybackControlsRow.RepeatAction(android.content.Context);
-    ctor public PlaybackControlsRow.RepeatAction(android.content.Context, int);
-    ctor public PlaybackControlsRow.RepeatAction(android.content.Context, int, int);
-    field public static int ALL;
-    field public static int NONE;
-    field public static int ONE;
-  }
-
-  public static class PlaybackControlsRow.RewindAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
-    ctor public PlaybackControlsRow.RewindAction(android.content.Context);
-    ctor public PlaybackControlsRow.RewindAction(android.content.Context, int);
-  }
-
-  public static class PlaybackControlsRow.ShuffleAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
-    ctor public PlaybackControlsRow.ShuffleAction(android.content.Context);
-    ctor public PlaybackControlsRow.ShuffleAction(android.content.Context, int);
-    field public static int OFF;
-    field public static int ON;
-  }
-
-  public static class PlaybackControlsRow.SkipNextAction extends android.support.v17.leanback.widget.Action {
-    ctor public PlaybackControlsRow.SkipNextAction(android.content.Context);
-  }
-
-  public static class PlaybackControlsRow.SkipPreviousAction extends android.support.v17.leanback.widget.Action {
-    ctor public PlaybackControlsRow.SkipPreviousAction(android.content.Context);
-  }
-
-  public static abstract class PlaybackControlsRow.ThumbsAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
-    ctor public PlaybackControlsRow.ThumbsAction(int, android.content.Context, int, int);
-    field public static int OUTLINE;
-    field public static int SOLID;
-  }
-
-  public static class PlaybackControlsRow.ThumbsDownAction extends android.support.v17.leanback.widget.PlaybackControlsRow.ThumbsAction {
-    ctor public PlaybackControlsRow.ThumbsDownAction(android.content.Context);
-  }
-
-  public static class PlaybackControlsRow.ThumbsUpAction extends android.support.v17.leanback.widget.PlaybackControlsRow.ThumbsAction {
-    ctor public PlaybackControlsRow.ThumbsUpAction(android.content.Context);
-  }
-
-  public class PlaybackControlsRowPresenter extends android.support.v17.leanback.widget.RowPresenter {
-    ctor public PlaybackControlsRowPresenter(android.support.v17.leanback.widget.Presenter);
-    ctor public PlaybackControlsRowPresenter();
-    method public boolean areSecondaryActionsHidden();
-    method protected android.support.v17.leanback.widget.RowPresenter.ViewHolder createRowViewHolder(android.view.ViewGroup);
-    method public int getBackgroundColor();
-    method public android.support.v17.leanback.widget.OnActionClickedListener getOnActionClickedListener();
-    method public int getProgressColor();
-    method public void setBackgroundColor(int);
-    method public void setOnActionClickedListener(android.support.v17.leanback.widget.OnActionClickedListener);
-    method public void setProgressColor(int);
-    method public void setSecondaryActionsHidden(boolean);
-    method public void showBottomSpace(android.support.v17.leanback.widget.PlaybackControlsRowPresenter.ViewHolder, boolean);
-    method public void showPrimaryActions(android.support.v17.leanback.widget.PlaybackControlsRowPresenter.ViewHolder);
-  }
-
-  public class PlaybackControlsRowPresenter.ViewHolder extends android.support.v17.leanback.widget.RowPresenter.ViewHolder {
-    field public final android.support.v17.leanback.widget.Presenter.ViewHolder mDescriptionViewHolder;
-  }
-
-  public abstract class Presenter implements android.support.v17.leanback.widget.FacetProvider {
-    ctor public Presenter();
-    method protected static void cancelAnimationsRecursive(android.view.View);
-    method public final java.lang.Object getFacet(java.lang.Class<?>);
-    method public abstract void onBindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object);
-    method public abstract android.support.v17.leanback.widget.Presenter.ViewHolder onCreateViewHolder(android.view.ViewGroup);
-    method public abstract void onUnbindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public void onViewAttachedToWindow(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public void onViewDetachedFromWindow(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public final void setFacet(java.lang.Class<?>, java.lang.Object);
-    method public void setOnClickListener(android.support.v17.leanback.widget.Presenter.ViewHolder, android.view.View.OnClickListener);
-  }
-
-  public static class Presenter.ViewHolder implements android.support.v17.leanback.widget.FacetProvider {
-    ctor public Presenter.ViewHolder(android.view.View);
-    method public final java.lang.Object getFacet(java.lang.Class<?>);
-    method public final void setFacet(java.lang.Class<?>, java.lang.Object);
-    field public final android.view.View view;
-  }
-
-  public abstract class PresenterSelector {
-    ctor public PresenterSelector();
-    method public abstract android.support.v17.leanback.widget.Presenter getPresenter(java.lang.Object);
-    method public android.support.v17.leanback.widget.Presenter[] getPresenters();
-  }
-
-  public abstract class PresenterSwitcher {
-    ctor public PresenterSwitcher();
-    method public void clear();
-    method public final android.view.ViewGroup getParentViewGroup();
-    method public void init(android.view.ViewGroup, android.support.v17.leanback.widget.PresenterSelector);
-    method protected abstract void insertView(android.view.View);
-    method protected void onViewSelected(android.view.View);
-    method public void select(java.lang.Object);
-    method protected void showView(android.view.View, boolean);
-    method public void unselect();
-  }
-
-  public class Row {
-    ctor public Row(long, android.support.v17.leanback.widget.HeaderItem);
-    ctor public Row(android.support.v17.leanback.widget.HeaderItem);
-    ctor public Row();
-    method public final android.support.v17.leanback.widget.HeaderItem getHeaderItem();
-    method public final long getId();
-    method public final void setHeaderItem(android.support.v17.leanback.widget.HeaderItem);
-    method public final void setId(long);
-  }
-
-  public class RowHeaderPresenter extends android.support.v17.leanback.widget.Presenter {
-    ctor public RowHeaderPresenter();
-    method protected static float getFontDescent(android.widget.TextView, android.graphics.Paint);
-    method public int getSpaceUnderBaseline(android.support.v17.leanback.widget.RowHeaderPresenter.ViewHolder);
-    method public boolean isNullItemVisibilityGone();
-    method public void onBindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object);
-    method public android.support.v17.leanback.widget.Presenter.ViewHolder onCreateViewHolder(android.view.ViewGroup);
-    method protected void onSelectLevelChanged(android.support.v17.leanback.widget.RowHeaderPresenter.ViewHolder);
-    method public void onUnbindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public void setNullItemVisibilityGone(boolean);
-    method public final void setSelectLevel(android.support.v17.leanback.widget.RowHeaderPresenter.ViewHolder, float);
-  }
-
-  public static class RowHeaderPresenter.ViewHolder extends android.support.v17.leanback.widget.Presenter.ViewHolder {
-    ctor public RowHeaderPresenter.ViewHolder(android.view.View);
-    method public final float getSelectLevel();
-  }
-
-  public final class RowHeaderView extends android.widget.TextView {
-    ctor public RowHeaderView(android.content.Context);
-    ctor public RowHeaderView(android.content.Context, android.util.AttributeSet);
-    ctor public RowHeaderView(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public abstract class RowPresenter extends android.support.v17.leanback.widget.Presenter {
-    ctor public RowPresenter();
-    method protected abstract android.support.v17.leanback.widget.RowPresenter.ViewHolder createRowViewHolder(android.view.ViewGroup);
-    method protected void dispatchItemSelectedListener(android.support.v17.leanback.widget.RowPresenter.ViewHolder, boolean);
-    method public void freeze(android.support.v17.leanback.widget.RowPresenter.ViewHolder, boolean);
-    method public final android.support.v17.leanback.widget.RowHeaderPresenter getHeaderPresenter();
-    method public final android.support.v17.leanback.widget.RowPresenter.ViewHolder getRowViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public final boolean getSelectEffectEnabled();
-    method public final float getSelectLevel(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public final int getSyncActivatePolicy();
-    method protected void initializeRowViewHolder(android.support.v17.leanback.widget.RowPresenter.ViewHolder);
-    method protected boolean isClippingChildren();
-    method public boolean isUsingDefaultSelectEffect();
-    method protected void onBindRowViewHolder(android.support.v17.leanback.widget.RowPresenter.ViewHolder, java.lang.Object);
-    method public final void onBindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object);
-    method public final android.support.v17.leanback.widget.Presenter.ViewHolder onCreateViewHolder(android.view.ViewGroup);
-    method protected void onRowViewAttachedToWindow(android.support.v17.leanback.widget.RowPresenter.ViewHolder);
-    method protected void onRowViewDetachedFromWindow(android.support.v17.leanback.widget.RowPresenter.ViewHolder);
-    method protected void onRowViewExpanded(android.support.v17.leanback.widget.RowPresenter.ViewHolder, boolean);
-    method protected void onRowViewSelected(android.support.v17.leanback.widget.RowPresenter.ViewHolder, boolean);
-    method protected void onSelectLevelChanged(android.support.v17.leanback.widget.RowPresenter.ViewHolder);
-    method protected void onUnbindRowViewHolder(android.support.v17.leanback.widget.RowPresenter.ViewHolder);
-    method public final void onUnbindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public final void onViewAttachedToWindow(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public final void onViewDetachedFromWindow(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public void setEntranceTransitionState(android.support.v17.leanback.widget.RowPresenter.ViewHolder, boolean);
-    method public final void setHeaderPresenter(android.support.v17.leanback.widget.RowHeaderPresenter);
-    method public final void setRowViewExpanded(android.support.v17.leanback.widget.Presenter.ViewHolder, boolean);
-    method public final void setRowViewSelected(android.support.v17.leanback.widget.Presenter.ViewHolder, boolean);
-    method public final void setSelectEffectEnabled(boolean);
-    method public final void setSelectLevel(android.support.v17.leanback.widget.Presenter.ViewHolder, float);
-    method public final void setSyncActivatePolicy(int);
-    field public static final int SYNC_ACTIVATED_CUSTOM = 0; // 0x0
-    field public static final int SYNC_ACTIVATED_TO_EXPANDED = 1; // 0x1
-    field public static final int SYNC_ACTIVATED_TO_EXPANDED_AND_SELECTED = 3; // 0x3
-    field public static final int SYNC_ACTIVATED_TO_SELECTED = 2; // 0x2
-  }
-
-  public static class RowPresenter.ViewHolder extends android.support.v17.leanback.widget.Presenter.ViewHolder {
-    ctor public RowPresenter.ViewHolder(android.view.View);
-    method public final android.support.v17.leanback.widget.RowHeaderPresenter.ViewHolder getHeaderViewHolder();
-    method public final android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public final android.support.v17.leanback.widget.OnItemViewSelectedListener getOnItemViewSelectedListener();
-    method public android.view.View.OnKeyListener getOnKeyListener();
-    method public final android.support.v17.leanback.widget.Row getRow();
-    method public final float getSelectLevel();
-    method public final boolean isExpanded();
-    method public final boolean isSelected();
-    method public final void setActivated(boolean);
-    method public final void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public final void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public void setOnKeyListener(android.view.View.OnKeyListener);
-    method public final void syncActivatedStatus(android.view.View);
-    field protected final android.support.v17.leanback.graphics.ColorOverlayDimmer mColorDimmer;
-  }
-
-  public class SearchBar extends android.widget.RelativeLayout {
-    ctor public SearchBar(android.content.Context);
-    ctor public SearchBar(android.content.Context, android.util.AttributeSet);
-    ctor public SearchBar(android.content.Context, android.util.AttributeSet, int);
-    method public void displayCompletions(java.util.List<java.lang.String>);
-    method public void displayCompletions(android.view.inputmethod.CompletionInfo[]);
-    method public android.graphics.drawable.Drawable getBadgeDrawable();
-    method public java.lang.CharSequence getHint();
-    method public java.lang.String getTitle();
-    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
-    method public void setSearchBarListener(android.support.v17.leanback.widget.SearchBar.SearchBarListener);
-    method public void setSearchQuery(java.lang.String);
-    method public void setSpeechRecognitionCallback(android.support.v17.leanback.widget.SpeechRecognitionCallback);
-    method public void setSpeechRecognizer(android.speech.SpeechRecognizer);
-    method public void setTitle(java.lang.String);
-    method public void startRecognition();
-    method public void stopRecognition();
-  }
-
-  public static abstract interface SearchBar.SearchBarListener {
-    method public abstract void onKeyboardDismiss(java.lang.String);
-    method public abstract void onSearchQueryChange(java.lang.String);
-    method public abstract void onSearchQuerySubmit(java.lang.String);
-  }
-
-  public class SearchEditText extends android.support.v17.leanback.widget.StreamingTextView {
-    ctor public SearchEditText(android.content.Context);
-    ctor public SearchEditText(android.content.Context, android.util.AttributeSet);
-    ctor public SearchEditText(android.content.Context, android.util.AttributeSet, int);
-    method public void setOnKeyboardDismissListener(android.support.v17.leanback.widget.SearchEditText.OnKeyboardDismissListener);
-  }
-
-  public static abstract interface SearchEditText.OnKeyboardDismissListener {
-    method public abstract void onKeyboardDismiss();
-  }
-
-  public class SearchOrbView extends android.widget.FrameLayout implements android.view.View.OnClickListener {
-    ctor public SearchOrbView(android.content.Context);
-    ctor public SearchOrbView(android.content.Context, android.util.AttributeSet);
-    ctor public SearchOrbView(android.content.Context, android.util.AttributeSet, int);
-    method public void enableOrbColorAnimation(boolean);
-    method public int getOrbColor();
-    method public android.support.v17.leanback.widget.SearchOrbView.Colors getOrbColors();
-    method public android.graphics.drawable.Drawable getOrbIcon();
-    method public void onClick(android.view.View);
-    method public void setOnOrbClickedListener(android.view.View.OnClickListener);
-    method public void setOrbColor(int);
-    method public deprecated void setOrbColor(int, int);
-    method public void setOrbColors(android.support.v17.leanback.widget.SearchOrbView.Colors);
-    method public void setOrbIcon(android.graphics.drawable.Drawable);
-  }
-
-  public static class SearchOrbView.Colors {
-    ctor public SearchOrbView.Colors(int);
-    ctor public SearchOrbView.Colors(int, int);
-    ctor public SearchOrbView.Colors(int, int, int);
-    method public static int getBrightColor(int);
-    field public int brightColor;
-    field public int color;
-    field public int iconColor;
-  }
-
-  public class ShadowOverlayContainer extends android.widget.FrameLayout {
-    ctor public ShadowOverlayContainer(android.content.Context);
-    ctor public ShadowOverlayContainer(android.content.Context, android.util.AttributeSet);
-    ctor public ShadowOverlayContainer(android.content.Context, android.util.AttributeSet, int);
-    method public int getShadowType();
-    method public android.view.View getWrappedView();
-    method public deprecated void initialize(boolean, boolean);
-    method public deprecated void initialize(boolean, boolean, boolean);
-    method public static void prepareParentForShadow(android.view.ViewGroup);
-    method public void setOverlayColor(int);
-    method public void setShadowFocusLevel(float);
-    method public static boolean supportsDynamicShadow();
-    method public static boolean supportsShadow();
-    method public void useDynamicShadow();
-    method public void useDynamicShadow(float, float);
-    method public void useStaticShadow();
-    method public void wrap(android.view.View);
-    field public static final int SHADOW_DYNAMIC = 3; // 0x3
-    field public static final int SHADOW_NONE = 1; // 0x1
-    field public static final int SHADOW_STATIC = 2; // 0x2
-  }
-
-  public final class ShadowOverlayHelper {
-    method public android.support.v17.leanback.widget.ShadowOverlayContainer createShadowOverlayContainer(android.content.Context);
-    method public int getShadowType();
-    method public boolean needsOverlay();
-    method public boolean needsRoundedCorner();
-    method public boolean needsWrapper();
-    method public void onViewCreated(android.view.View);
-    method public void prepareParentForShadow(android.view.ViewGroup);
-    method public static void setNoneWrapperOverlayColor(android.view.View, int);
-    method public static void setNoneWrapperShadowFocusLevel(android.view.View, float);
-    method public void setOverlayColor(android.view.View, int);
-    method public void setShadowFocusLevel(android.view.View, float);
-    method public static boolean supportsDynamicShadow();
-    method public static boolean supportsForeground();
-    method public static boolean supportsRoundedCorner();
-    method public static boolean supportsShadow();
-    field public static final int SHADOW_DYNAMIC = 3; // 0x3
-    field public static final int SHADOW_NONE = 1; // 0x1
-    field public static final int SHADOW_STATIC = 2; // 0x2
-  }
-
-  public static final class ShadowOverlayHelper.Builder {
-    ctor public ShadowOverlayHelper.Builder();
-    method public android.support.v17.leanback.widget.ShadowOverlayHelper build(android.content.Context);
-    method public android.support.v17.leanback.widget.ShadowOverlayHelper.Builder keepForegroundDrawable(boolean);
-    method public android.support.v17.leanback.widget.ShadowOverlayHelper.Builder needsOverlay(boolean);
-    method public android.support.v17.leanback.widget.ShadowOverlayHelper.Builder needsRoundedCorner(boolean);
-    method public android.support.v17.leanback.widget.ShadowOverlayHelper.Builder needsShadow(boolean);
-    method public android.support.v17.leanback.widget.ShadowOverlayHelper.Builder options(android.support.v17.leanback.widget.ShadowOverlayHelper.Options);
-    method public android.support.v17.leanback.widget.ShadowOverlayHelper.Builder preferZOrder(boolean);
-  }
-
-  public static final class ShadowOverlayHelper.Options {
-    ctor public ShadowOverlayHelper.Options();
-    method public android.support.v17.leanback.widget.ShadowOverlayHelper.Options dynamicShadowZ(float, float);
-    method public final float getDynamicShadowFocusedZ();
-    method public final float getDynamicShadowUnfocusedZ();
-    method public final int getRoundedCornerRadius();
-    method public android.support.v17.leanback.widget.ShadowOverlayHelper.Options roundedCornerRadius(int);
-    field public static final android.support.v17.leanback.widget.ShadowOverlayHelper.Options DEFAULT;
-  }
-
-  public final class SinglePresenterSelector extends android.support.v17.leanback.widget.PresenterSelector {
-    ctor public SinglePresenterSelector(android.support.v17.leanback.widget.Presenter);
-    method public android.support.v17.leanback.widget.Presenter getPresenter(java.lang.Object);
-  }
-
-  public class SparseArrayObjectAdapter extends android.support.v17.leanback.widget.ObjectAdapter {
-    ctor public SparseArrayObjectAdapter(android.support.v17.leanback.widget.PresenterSelector);
-    ctor public SparseArrayObjectAdapter(android.support.v17.leanback.widget.Presenter);
-    ctor public SparseArrayObjectAdapter();
-    method public void clear(int);
-    method public void clear();
-    method public java.lang.Object get(int);
-    method public int indexOf(java.lang.Object);
-    method public int indexOf(int);
-    method public java.lang.Object lookup(int);
-    method public void notifyArrayItemRangeChanged(int, int);
-    method public void set(int, java.lang.Object);
-    method public int size();
-  }
-
-  public class SpeechOrbView extends android.support.v17.leanback.widget.SearchOrbView {
-    ctor public SpeechOrbView(android.content.Context);
-    ctor public SpeechOrbView(android.content.Context, android.util.AttributeSet);
-    ctor public SpeechOrbView(android.content.Context, android.util.AttributeSet, int);
-    method public void setSoundLevel(int);
-    method public void showListening();
-    method public void showNotListening();
-  }
-
-  public abstract interface SpeechRecognitionCallback {
-    method public abstract void recognizeSpeech();
-  }
-
-   class StreamingTextView extends android.widget.EditText {
-    ctor public StreamingTextView(android.content.Context, android.util.AttributeSet);
-    ctor public StreamingTextView(android.content.Context, android.util.AttributeSet, int);
-    method public static boolean isLayoutRtl(android.view.View);
-    method public void reset();
-    method public void setFinalRecognizedText(java.lang.CharSequence);
-    method public void updateRecognizedText(java.lang.String, java.lang.String);
-    method public void updateRecognizedText(java.lang.String, java.util.List<java.lang.Float>);
-  }
-
-  public class TitleHelper {
-    ctor public TitleHelper(android.view.ViewGroup, android.support.v17.leanback.widget.TitleView);
-    method public android.support.v17.leanback.widget.BrowseFrameLayout.OnFocusSearchListener getOnFocusSearchListener();
-    method public android.view.ViewGroup getSceneRoot();
-    method public android.support.v17.leanback.widget.TitleView getTitleView();
-    method public void showTitle(boolean);
-  }
-
-  public class TitleView extends android.widget.FrameLayout {
-    ctor public TitleView(android.content.Context);
-    ctor public TitleView(android.content.Context, android.util.AttributeSet);
-    ctor public TitleView(android.content.Context, android.util.AttributeSet, int);
-    method public void enableAnimation(boolean);
-    method public android.graphics.drawable.Drawable getBadgeDrawable();
-    method public android.support.v17.leanback.widget.SearchOrbView.Colors getSearchAffordanceColors();
-    method public android.view.View getSearchAffordanceView();
-    method public java.lang.CharSequence getTitle();
-    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
-    method public void setOnSearchClickedListener(android.view.View.OnClickListener);
-    method public void setSearchAffordanceColors(android.support.v17.leanback.widget.SearchOrbView.Colors);
-    method public void setTitle(java.lang.String);
-  }
-
-  public class VerticalGridPresenter extends android.support.v17.leanback.widget.Presenter {
-    ctor public VerticalGridPresenter();
-    ctor public VerticalGridPresenter(int);
-    ctor public VerticalGridPresenter(int, boolean);
-    method public final boolean areChildRoundedCornersEnabled();
-    method protected android.support.v17.leanback.widget.VerticalGridPresenter.ViewHolder createGridViewHolder(android.view.ViewGroup);
-    method protected android.support.v17.leanback.widget.ShadowOverlayHelper.Options createShadowOverlayOptions();
-    method public final void enableChildRoundedCorners(boolean);
-    method public final int getFocusZoomFactor();
-    method public final boolean getKeepChildForeground();
-    method public int getNumberOfColumns();
-    method public final android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public final android.support.v17.leanback.widget.OnItemViewSelectedListener getOnItemViewSelectedListener();
-    method public final boolean getShadowEnabled();
-    method protected void initializeGridViewHolder(android.support.v17.leanback.widget.VerticalGridPresenter.ViewHolder);
-    method public final boolean isFocusDimmerUsed();
-    method public boolean isUsingDefaultShadow();
-    method public boolean isUsingZOrder(android.content.Context);
-    method public void onBindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object);
-    method public final android.support.v17.leanback.widget.VerticalGridPresenter.ViewHolder onCreateViewHolder(android.view.ViewGroup);
-    method public void onUnbindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public void setEntranceTransitionState(android.support.v17.leanback.widget.VerticalGridPresenter.ViewHolder, boolean);
-    method public final void setKeepChildForeground(boolean);
-    method public void setNumberOfColumns(int);
-    method public final void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public final void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public final void setShadowEnabled(boolean);
-  }
-
-  public static class VerticalGridPresenter.ViewHolder extends android.support.v17.leanback.widget.Presenter.ViewHolder {
-    ctor public VerticalGridPresenter.ViewHolder(android.support.v17.leanback.widget.VerticalGridView);
-    method public android.support.v17.leanback.widget.VerticalGridView getGridView();
-  }
-
-  public class VerticalGridView extends android.support.v7.widget.RecyclerView {
-    ctor public VerticalGridView(android.content.Context);
-    ctor public VerticalGridView(android.content.Context, android.util.AttributeSet);
-    ctor public VerticalGridView(android.content.Context, android.util.AttributeSet, int);
-    method protected void initAttributes(android.content.Context, android.util.AttributeSet);
-    method public void setColumnWidth(int);
-    method public void setNumColumns(int);
-  }
-
-}
-
diff --git a/v17/leanback/api/current.txt b/v17/leanback/api/current.txt
deleted file mode 100644
index a7e2851..0000000
--- a/v17/leanback/api/current.txt
+++ /dev/null
@@ -1,2382 +0,0 @@
-package android.support.v17.leanback.app {
-
-  public final class BackgroundManager {
-    method public void attach(android.view.Window);
-    method public final int getColor();
-    method public android.graphics.drawable.Drawable getDefaultDimLayer();
-    method public android.graphics.drawable.Drawable getDimLayer();
-    method public android.graphics.drawable.Drawable getDrawable();
-    method public static android.support.v17.leanback.app.BackgroundManager getInstance(android.app.Activity);
-    method public boolean isAttached();
-    method public void release();
-    method public void setBitmap(android.graphics.Bitmap);
-    method public void setColor(int);
-    method public void setDimLayer(android.graphics.drawable.Drawable);
-    method public void setDrawable(android.graphics.drawable.Drawable);
-    method public void setThemeDrawableResourceId(int);
-  }
-
-   abstract class BaseRowFragment extends android.app.Fragment {
-    method public final android.support.v17.leanback.widget.ObjectAdapter getAdapter();
-    method public final android.support.v17.leanback.widget.PresenterSelector getPresenterSelector();
-    method public int getSelectedPosition();
-    method public void onTransitionEnd();
-    method public boolean onTransitionPrepare();
-    method public void onTransitionStart();
-    method public final void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public void setAlignment(int);
-    method public final void setPresenterSelector(android.support.v17.leanback.widget.PresenterSelector);
-    method public void setSelectedPosition(int);
-    method public void setSelectedPosition(int, boolean);
-  }
-
-   abstract class BaseRowSupportFragment extends android.support.v4.app.Fragment {
-    method public final android.support.v17.leanback.widget.ObjectAdapter getAdapter();
-    method public final android.support.v17.leanback.widget.PresenterSelector getPresenterSelector();
-    method public int getSelectedPosition();
-    method public void onTransitionEnd();
-    method public boolean onTransitionPrepare();
-    method public void onTransitionStart();
-    method public final void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public void setAlignment(int);
-    method public final void setPresenterSelector(android.support.v17.leanback.widget.PresenterSelector);
-    method public void setSelectedPosition(int);
-    method public void setSelectedPosition(int, boolean);
-  }
-
-  public class BrandedFragment extends android.app.Fragment {
-    ctor public BrandedFragment();
-    method public android.graphics.drawable.Drawable getBadgeDrawable();
-    method public int getSearchAffordanceColor();
-    method public android.support.v17.leanback.widget.SearchOrbView.Colors getSearchAffordanceColors();
-    method public java.lang.CharSequence getTitle();
-    method public android.view.View getTitleView();
-    method public android.support.v17.leanback.widget.TitleViewAdapter getTitleViewAdapter();
-    method public void installTitleView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
-    method public final boolean isShowingTitle();
-    method public android.view.View onInflateTitleView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
-    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
-    method public void setOnSearchClickedListener(android.view.View.OnClickListener);
-    method public void setSearchAffordanceColor(int);
-    method public void setSearchAffordanceColors(android.support.v17.leanback.widget.SearchOrbView.Colors);
-    method public void setTitle(java.lang.CharSequence);
-    method public void setTitleView(android.view.View);
-    method public void showTitle(boolean);
-    method public void showTitle(int);
-  }
-
-  public class BrandedSupportFragment extends android.support.v4.app.Fragment {
-    ctor public BrandedSupportFragment();
-    method public android.graphics.drawable.Drawable getBadgeDrawable();
-    method public int getSearchAffordanceColor();
-    method public android.support.v17.leanback.widget.SearchOrbView.Colors getSearchAffordanceColors();
-    method public java.lang.CharSequence getTitle();
-    method public android.view.View getTitleView();
-    method public android.support.v17.leanback.widget.TitleViewAdapter getTitleViewAdapter();
-    method public void installTitleView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
-    method public final boolean isShowingTitle();
-    method public android.view.View onInflateTitleView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
-    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
-    method public void setOnSearchClickedListener(android.view.View.OnClickListener);
-    method public void setSearchAffordanceColor(int);
-    method public void setSearchAffordanceColors(android.support.v17.leanback.widget.SearchOrbView.Colors);
-    method public void setTitle(java.lang.CharSequence);
-    method public void setTitleView(android.view.View);
-    method public void showTitle(boolean);
-    method public void showTitle(int);
-  }
-
-  public class BrowseFragment extends android.support.v17.leanback.app.BrandedFragment {
-    ctor public BrowseFragment();
-    method public static android.os.Bundle createArgs(android.os.Bundle, java.lang.String, int);
-    method protected java.lang.Object createEntranceTransition();
-    method public void enableMainFragmentScaling(boolean);
-    method public deprecated void enableRowScaling(boolean);
-    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
-    method public int getBrandColor();
-    method public android.support.v17.leanback.app.HeadersFragment getHeadersFragment();
-    method public int getHeadersState();
-    method public final android.support.v17.leanback.app.BrowseFragment.MainFragmentAdapterRegistry getMainFragmentRegistry();
-    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public android.support.v17.leanback.widget.OnItemViewSelectedListener getOnItemViewSelectedListener();
-    method public android.support.v17.leanback.app.RowsFragment getRowsFragment();
-    method public int getSelectedPosition();
-    method public final boolean isHeadersTransitionOnBackEnabled();
-    method public boolean isInHeadersTransition();
-    method public boolean isShowingHeaders();
-    method protected void onEntranceTransitionEnd();
-    method protected void onEntranceTransitionPrepare();
-    method protected void onEntranceTransitionStart();
-    method protected void runEntranceTransition(java.lang.Object);
-    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public void setBrandColor(int);
-    method public void setBrowseTransitionListener(android.support.v17.leanback.app.BrowseFragment.BrowseTransitionListener);
-    method public void setHeaderPresenterSelector(android.support.v17.leanback.widget.PresenterSelector);
-    method public void setHeadersState(int);
-    method public final void setHeadersTransitionOnBackEnabled(boolean);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public void setSelectedPosition(int);
-    method public void setSelectedPosition(int, boolean);
-    method public void setSelectedPosition(int, boolean, android.support.v17.leanback.widget.Presenter.ViewHolderTask);
-    method public void startHeadersTransition(boolean);
-    field public static final int HEADERS_DISABLED = 3; // 0x3
-    field public static final int HEADERS_ENABLED = 1; // 0x1
-    field public static final int HEADERS_HIDDEN = 2; // 0x2
-  }
-
-  public static class BrowseFragment.BrowseTransitionListener {
-    ctor public BrowseFragment.BrowseTransitionListener();
-    method public void onHeadersTransitionStart(boolean);
-    method public void onHeadersTransitionStop(boolean);
-  }
-
-  public static abstract class BrowseFragment.FragmentFactory {
-    ctor public BrowseFragment.FragmentFactory();
-    method public abstract T createFragment(java.lang.Object);
-  }
-
-  public static abstract interface BrowseFragment.FragmentHost {
-    method public abstract void notifyDataReady(android.support.v17.leanback.app.BrowseFragment.MainFragmentAdapter);
-    method public abstract void notifyViewCreated(android.support.v17.leanback.app.BrowseFragment.MainFragmentAdapter);
-    method public abstract void showTitleView(boolean);
-  }
-
-  public static class BrowseFragment.ListRowFragmentFactory extends android.support.v17.leanback.app.BrowseFragment.FragmentFactory {
-    ctor public BrowseFragment.ListRowFragmentFactory();
-    method public android.support.v17.leanback.app.RowsFragment createFragment(java.lang.Object);
-  }
-
-  public static class BrowseFragment.MainFragmentAdapter {
-    ctor public BrowseFragment.MainFragmentAdapter(T);
-    method public final T getFragment();
-    method public final android.support.v17.leanback.app.BrowseFragment.FragmentHost getFragmentHost();
-    method public boolean isScalingEnabled();
-    method public boolean isScrolling();
-    method public void onTransitionEnd();
-    method public boolean onTransitionPrepare();
-    method public void onTransitionStart();
-    method public void setAlignment(int);
-    method public void setEntranceTransitionState(boolean);
-    method public void setExpand(boolean);
-    method public void setScalingEnabled(boolean);
-  }
-
-  public static abstract interface BrowseFragment.MainFragmentAdapterProvider {
-    method public abstract android.support.v17.leanback.app.BrowseFragment.MainFragmentAdapter getMainFragmentAdapter();
-  }
-
-  public static final class BrowseFragment.MainFragmentAdapterRegistry {
-    ctor public BrowseFragment.MainFragmentAdapterRegistry();
-    method public android.app.Fragment createFragment(java.lang.Object);
-    method public void registerFragment(java.lang.Class, android.support.v17.leanback.app.BrowseFragment.FragmentFactory);
-  }
-
-  public static class BrowseFragment.MainFragmentRowsAdapter {
-    ctor public BrowseFragment.MainFragmentRowsAdapter(T);
-    method public final T getFragment();
-    method public int getSelectedPosition();
-    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public void setSelectedPosition(int, boolean, android.support.v17.leanback.widget.Presenter.ViewHolderTask);
-    method public void setSelectedPosition(int, boolean);
-  }
-
-  public static abstract interface BrowseFragment.MainFragmentRowsAdapterProvider {
-    method public abstract android.support.v17.leanback.app.BrowseFragment.MainFragmentRowsAdapter getMainFragmentRowsAdapter();
-  }
-
-  public class BrowseSupportFragment extends android.support.v17.leanback.app.BrandedSupportFragment {
-    ctor public BrowseSupportFragment();
-    method public static android.os.Bundle createArgs(android.os.Bundle, java.lang.String, int);
-    method protected java.lang.Object createEntranceTransition();
-    method public void enableMainFragmentScaling(boolean);
-    method public deprecated void enableRowScaling(boolean);
-    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
-    method public int getBrandColor();
-    method public int getHeadersState();
-    method public android.support.v17.leanback.app.HeadersSupportFragment getHeadersSupportFragment();
-    method public final android.support.v17.leanback.app.BrowseSupportFragment.MainFragmentAdapterRegistry getMainFragmentRegistry();
-    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public android.support.v17.leanback.widget.OnItemViewSelectedListener getOnItemViewSelectedListener();
-    method public android.support.v17.leanback.app.RowsSupportFragment getRowsSupportFragment();
-    method public int getSelectedPosition();
-    method public final boolean isHeadersTransitionOnBackEnabled();
-    method public boolean isInHeadersTransition();
-    method public boolean isShowingHeaders();
-    method protected void onEntranceTransitionEnd();
-    method protected void onEntranceTransitionPrepare();
-    method protected void onEntranceTransitionStart();
-    method protected void runEntranceTransition(java.lang.Object);
-    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public void setBrandColor(int);
-    method public void setBrowseTransitionListener(android.support.v17.leanback.app.BrowseSupportFragment.BrowseTransitionListener);
-    method public void setHeaderPresenterSelector(android.support.v17.leanback.widget.PresenterSelector);
-    method public void setHeadersState(int);
-    method public final void setHeadersTransitionOnBackEnabled(boolean);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public void setSelectedPosition(int);
-    method public void setSelectedPosition(int, boolean);
-    method public void setSelectedPosition(int, boolean, android.support.v17.leanback.widget.Presenter.ViewHolderTask);
-    method public void startHeadersTransition(boolean);
-    field public static final int HEADERS_DISABLED = 3; // 0x3
-    field public static final int HEADERS_ENABLED = 1; // 0x1
-    field public static final int HEADERS_HIDDEN = 2; // 0x2
-  }
-
-  public static class BrowseSupportFragment.BrowseTransitionListener {
-    ctor public BrowseSupportFragment.BrowseTransitionListener();
-    method public void onHeadersTransitionStart(boolean);
-    method public void onHeadersTransitionStop(boolean);
-  }
-
-  public static abstract class BrowseSupportFragment.FragmentFactory {
-    ctor public BrowseSupportFragment.FragmentFactory();
-    method public abstract T createFragment(java.lang.Object);
-  }
-
-  public static abstract interface BrowseSupportFragment.FragmentHost {
-    method public abstract void notifyDataReady(android.support.v17.leanback.app.BrowseSupportFragment.MainFragmentAdapter);
-    method public abstract void notifyViewCreated(android.support.v17.leanback.app.BrowseSupportFragment.MainFragmentAdapter);
-    method public abstract void showTitleView(boolean);
-  }
-
-  public static class BrowseSupportFragment.ListRowFragmentFactory extends android.support.v17.leanback.app.BrowseSupportFragment.FragmentFactory {
-    ctor public BrowseSupportFragment.ListRowFragmentFactory();
-    method public android.support.v17.leanback.app.RowsSupportFragment createFragment(java.lang.Object);
-  }
-
-  public static class BrowseSupportFragment.MainFragmentAdapter {
-    ctor public BrowseSupportFragment.MainFragmentAdapter(T);
-    method public final T getFragment();
-    method public final android.support.v17.leanback.app.BrowseSupportFragment.FragmentHost getFragmentHost();
-    method public boolean isScalingEnabled();
-    method public boolean isScrolling();
-    method public void onTransitionEnd();
-    method public boolean onTransitionPrepare();
-    method public void onTransitionStart();
-    method public void setAlignment(int);
-    method public void setEntranceTransitionState(boolean);
-    method public void setExpand(boolean);
-    method public void setScalingEnabled(boolean);
-  }
-
-  public static abstract interface BrowseSupportFragment.MainFragmentAdapterProvider {
-    method public abstract android.support.v17.leanback.app.BrowseSupportFragment.MainFragmentAdapter getMainFragmentAdapter();
-  }
-
-  public static final class BrowseSupportFragment.MainFragmentAdapterRegistry {
-    ctor public BrowseSupportFragment.MainFragmentAdapterRegistry();
-    method public android.support.v4.app.Fragment createFragment(java.lang.Object);
-    method public void registerFragment(java.lang.Class, android.support.v17.leanback.app.BrowseSupportFragment.FragmentFactory);
-  }
-
-  public static class BrowseSupportFragment.MainFragmentRowsAdapter {
-    ctor public BrowseSupportFragment.MainFragmentRowsAdapter(T);
-    method public final T getFragment();
-    method public int getSelectedPosition();
-    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public void setSelectedPosition(int, boolean, android.support.v17.leanback.widget.Presenter.ViewHolderTask);
-    method public void setSelectedPosition(int, boolean);
-  }
-
-  public static abstract interface BrowseSupportFragment.MainFragmentRowsAdapterProvider {
-    method public abstract android.support.v17.leanback.app.BrowseSupportFragment.MainFragmentRowsAdapter getMainFragmentRowsAdapter();
-  }
-
-  public class DetailsFragment extends android.support.v17.leanback.app.BrandedFragment {
-    ctor public DetailsFragment();
-    method protected java.lang.Object createEntranceTransition();
-    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
-    method public android.support.v17.leanback.widget.BaseOnItemViewClickedListener getOnItemViewClickedListener();
-    method public android.support.v17.leanback.app.RowsFragment getRowsFragment();
-    method protected deprecated android.view.View inflateTitle(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
-    method protected void onEntranceTransitionEnd();
-    method protected void onEntranceTransitionPrepare();
-    method protected void onEntranceTransitionStart();
-    method protected void onSetDetailsOverviewRowStatus(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter, android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder, int, int, int);
-    method protected void onSetRowStatus(android.support.v17.leanback.widget.RowPresenter, android.support.v17.leanback.widget.RowPresenter.ViewHolder, int, int, int);
-    method protected void runEntranceTransition(java.lang.Object);
-    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.BaseOnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.BaseOnItemViewSelectedListener);
-    method public void setSelectedPosition(int);
-    method public void setSelectedPosition(int, boolean);
-    method protected void setupDetailsOverviewRowPresenter(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter);
-    method protected void setupPresenter(android.support.v17.leanback.widget.Presenter);
-  }
-
-  public class DetailsSupportFragment extends android.support.v17.leanback.app.BrandedSupportFragment {
-    ctor public DetailsSupportFragment();
-    method protected java.lang.Object createEntranceTransition();
-    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
-    method public android.support.v17.leanback.widget.BaseOnItemViewClickedListener getOnItemViewClickedListener();
-    method public android.support.v17.leanback.app.RowsSupportFragment getRowsSupportFragment();
-    method protected deprecated android.view.View inflateTitle(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
-    method protected void onEntranceTransitionEnd();
-    method protected void onEntranceTransitionPrepare();
-    method protected void onEntranceTransitionStart();
-    method protected void onSetDetailsOverviewRowStatus(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter, android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder, int, int, int);
-    method protected void onSetRowStatus(android.support.v17.leanback.widget.RowPresenter, android.support.v17.leanback.widget.RowPresenter.ViewHolder, int, int, int);
-    method protected void runEntranceTransition(java.lang.Object);
-    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.BaseOnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.BaseOnItemViewSelectedListener);
-    method public void setSelectedPosition(int);
-    method public void setSelectedPosition(int, boolean);
-    method protected void setupDetailsOverviewRowPresenter(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter);
-    method protected void setupPresenter(android.support.v17.leanback.widget.Presenter);
-  }
-
-  public class ErrorFragment extends android.support.v17.leanback.app.BrandedFragment {
-    ctor public ErrorFragment();
-    method public android.graphics.drawable.Drawable getBackgroundDrawable();
-    method public android.view.View.OnClickListener getButtonClickListener();
-    method public java.lang.String getButtonText();
-    method public android.graphics.drawable.Drawable getImageDrawable();
-    method public java.lang.CharSequence getMessage();
-    method public boolean isBackgroundTranslucent();
-    method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
-    method public void setButtonClickListener(android.view.View.OnClickListener);
-    method public void setButtonText(java.lang.String);
-    method public void setDefaultBackground(boolean);
-    method public void setImageDrawable(android.graphics.drawable.Drawable);
-    method public void setMessage(java.lang.CharSequence);
-  }
-
-  public class ErrorSupportFragment extends android.support.v17.leanback.app.BrandedSupportFragment {
-    ctor public ErrorSupportFragment();
-    method public android.graphics.drawable.Drawable getBackgroundDrawable();
-    method public android.view.View.OnClickListener getButtonClickListener();
-    method public java.lang.String getButtonText();
-    method public android.graphics.drawable.Drawable getImageDrawable();
-    method public java.lang.CharSequence getMessage();
-    method public boolean isBackgroundTranslucent();
-    method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
-    method public void setButtonClickListener(android.view.View.OnClickListener);
-    method public void setButtonText(java.lang.String);
-    method public void setDefaultBackground(boolean);
-    method public void setImageDrawable(android.graphics.drawable.Drawable);
-    method public void setMessage(java.lang.CharSequence);
-  }
-
-  public class GuidedStepFragment extends android.app.Fragment {
-    ctor public GuidedStepFragment();
-    method public static int add(android.app.FragmentManager, android.support.v17.leanback.app.GuidedStepFragment);
-    method public static int add(android.app.FragmentManager, android.support.v17.leanback.app.GuidedStepFragment, int);
-    method public static int addAsRoot(android.app.Activity, android.support.v17.leanback.app.GuidedStepFragment, int);
-    method public void collapseSubActions();
-    method public void expandSubActions(android.support.v17.leanback.widget.GuidedAction);
-    method public android.support.v17.leanback.widget.GuidedAction findActionById(long);
-    method public int findActionPositionById(long);
-    method public android.support.v17.leanback.widget.GuidedAction findButtonActionById(long);
-    method public int findButtonActionPositionById(long);
-    method public void finishGuidedStepFragments();
-    method public android.view.View getActionItemView(int);
-    method public java.util.List<android.support.v17.leanback.widget.GuidedAction> getActions();
-    method public android.view.View getButtonActionItemView(int);
-    method public java.util.List<android.support.v17.leanback.widget.GuidedAction> getButtonActions();
-    method public static android.support.v17.leanback.app.GuidedStepFragment getCurrentGuidedStepFragment(android.app.FragmentManager);
-    method public android.support.v17.leanback.widget.GuidanceStylist getGuidanceStylist();
-    method public android.support.v17.leanback.widget.GuidedActionsStylist getGuidedActionsStylist();
-    method public android.support.v17.leanback.widget.GuidedActionsStylist getGuidedButtonActionsStylist();
-    method public int getSelectedActionPosition();
-    method public int getSelectedButtonActionPosition();
-    method public int getUiStyle();
-    method public boolean isFocusOutEndAllowed();
-    method public boolean isFocusOutStartAllowed();
-    method public boolean isSubActionsExpanded();
-    method public void notifyActionChanged(int);
-    method public void notifyButtonActionChanged(int);
-    method protected void onAddSharedElementTransition(android.app.FragmentTransaction, android.support.v17.leanback.app.GuidedStepFragment);
-    method public void onCreateActions(java.util.List<android.support.v17.leanback.widget.GuidedAction>, android.os.Bundle);
-    method public android.support.v17.leanback.widget.GuidedActionsStylist onCreateActionsStylist();
-    method public android.view.View onCreateBackgroundView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
-    method public void onCreateButtonActions(java.util.List<android.support.v17.leanback.widget.GuidedAction>, android.os.Bundle);
-    method public android.support.v17.leanback.widget.GuidedActionsStylist onCreateButtonActionsStylist();
-    method public android.support.v17.leanback.widget.GuidanceStylist.Guidance onCreateGuidance(android.os.Bundle);
-    method public android.support.v17.leanback.widget.GuidanceStylist onCreateGuidanceStylist();
-    method public void onGuidedActionClicked(android.support.v17.leanback.widget.GuidedAction);
-    method public void onGuidedActionEditCanceled(android.support.v17.leanback.widget.GuidedAction);
-    method public deprecated void onGuidedActionEdited(android.support.v17.leanback.widget.GuidedAction);
-    method public long onGuidedActionEditedAndProceed(android.support.v17.leanback.widget.GuidedAction);
-    method public void onGuidedActionFocused(android.support.v17.leanback.widget.GuidedAction);
-    method protected void onProvideFragmentTransitions();
-    method public int onProvideTheme();
-    method public boolean onSubGuidedActionClicked(android.support.v17.leanback.widget.GuidedAction);
-    method public void popBackStackToGuidedStepFragment(java.lang.Class, int);
-    method public void setActions(java.util.List<android.support.v17.leanback.widget.GuidedAction>);
-    method public void setButtonActions(java.util.List<android.support.v17.leanback.widget.GuidedAction>);
-    method public void setSelectedActionPosition(int);
-    method public void setSelectedButtonActionPosition(int);
-    method public void setUiStyle(int);
-    field public static final java.lang.String EXTRA_UI_STYLE = "uiStyle";
-    field public static final int UI_STYLE_ACTIVITY_ROOT = 2; // 0x2
-    field public static final deprecated int UI_STYLE_DEFAULT = 0; // 0x0
-    field public static final int UI_STYLE_ENTRANCE = 1; // 0x1
-    field public static final int UI_STYLE_REPLACE = 0; // 0x0
-  }
-
-  public class GuidedStepSupportFragment extends android.support.v4.app.Fragment {
-    ctor public GuidedStepSupportFragment();
-    method public static int add(android.support.v4.app.FragmentManager, android.support.v17.leanback.app.GuidedStepSupportFragment);
-    method public static int add(android.support.v4.app.FragmentManager, android.support.v17.leanback.app.GuidedStepSupportFragment, int);
-    method public static int addAsRoot(android.support.v4.app.FragmentActivity, android.support.v17.leanback.app.GuidedStepSupportFragment, int);
-    method public void collapseSubActions();
-    method public void expandSubActions(android.support.v17.leanback.widget.GuidedAction);
-    method public android.support.v17.leanback.widget.GuidedAction findActionById(long);
-    method public int findActionPositionById(long);
-    method public android.support.v17.leanback.widget.GuidedAction findButtonActionById(long);
-    method public int findButtonActionPositionById(long);
-    method public void finishGuidedStepSupportFragments();
-    method public android.view.View getActionItemView(int);
-    method public java.util.List<android.support.v17.leanback.widget.GuidedAction> getActions();
-    method public android.view.View getButtonActionItemView(int);
-    method public java.util.List<android.support.v17.leanback.widget.GuidedAction> getButtonActions();
-    method public static android.support.v17.leanback.app.GuidedStepSupportFragment getCurrentGuidedStepSupportFragment(android.support.v4.app.FragmentManager);
-    method public android.support.v17.leanback.widget.GuidanceStylist getGuidanceStylist();
-    method public android.support.v17.leanback.widget.GuidedActionsStylist getGuidedActionsStylist();
-    method public android.support.v17.leanback.widget.GuidedActionsStylist getGuidedButtonActionsStylist();
-    method public int getSelectedActionPosition();
-    method public int getSelectedButtonActionPosition();
-    method public int getUiStyle();
-    method public boolean isFocusOutEndAllowed();
-    method public boolean isFocusOutStartAllowed();
-    method public boolean isSubActionsExpanded();
-    method public void notifyActionChanged(int);
-    method public void notifyButtonActionChanged(int);
-    method protected void onAddSharedElementTransition(android.support.v4.app.FragmentTransaction, android.support.v17.leanback.app.GuidedStepSupportFragment);
-    method public void onCreateActions(java.util.List<android.support.v17.leanback.widget.GuidedAction>, android.os.Bundle);
-    method public android.support.v17.leanback.widget.GuidedActionsStylist onCreateActionsStylist();
-    method public android.view.View onCreateBackgroundView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
-    method public void onCreateButtonActions(java.util.List<android.support.v17.leanback.widget.GuidedAction>, android.os.Bundle);
-    method public android.support.v17.leanback.widget.GuidedActionsStylist onCreateButtonActionsStylist();
-    method public android.support.v17.leanback.widget.GuidanceStylist.Guidance onCreateGuidance(android.os.Bundle);
-    method public android.support.v17.leanback.widget.GuidanceStylist onCreateGuidanceStylist();
-    method public void onGuidedActionClicked(android.support.v17.leanback.widget.GuidedAction);
-    method public void onGuidedActionEditCanceled(android.support.v17.leanback.widget.GuidedAction);
-    method public deprecated void onGuidedActionEdited(android.support.v17.leanback.widget.GuidedAction);
-    method public long onGuidedActionEditedAndProceed(android.support.v17.leanback.widget.GuidedAction);
-    method public void onGuidedActionFocused(android.support.v17.leanback.widget.GuidedAction);
-    method protected void onProvideFragmentTransitions();
-    method public int onProvideTheme();
-    method public boolean onSubGuidedActionClicked(android.support.v17.leanback.widget.GuidedAction);
-    method public void popBackStackToGuidedStepSupportFragment(java.lang.Class, int);
-    method public void setActions(java.util.List<android.support.v17.leanback.widget.GuidedAction>);
-    method public void setButtonActions(java.util.List<android.support.v17.leanback.widget.GuidedAction>);
-    method public void setSelectedActionPosition(int);
-    method public void setSelectedButtonActionPosition(int);
-    method public void setUiStyle(int);
-    field public static final java.lang.String EXTRA_UI_STYLE = "uiStyle";
-    field public static final int UI_STYLE_ACTIVITY_ROOT = 2; // 0x2
-    field public static final deprecated int UI_STYLE_DEFAULT = 0; // 0x0
-    field public static final int UI_STYLE_ENTRANCE = 1; // 0x1
-    field public static final int UI_STYLE_REPLACE = 0; // 0x0
-  }
-
-  public class HeadersFragment extends android.support.v17.leanback.app.BaseRowFragment {
-    ctor public HeadersFragment();
-    method public boolean isScrolling();
-    method public void setOnHeaderClickedListener(android.support.v17.leanback.app.HeadersFragment.OnHeaderClickedListener);
-    method public void setOnHeaderViewSelectedListener(android.support.v17.leanback.app.HeadersFragment.OnHeaderViewSelectedListener);
-  }
-
-  public static abstract interface HeadersFragment.OnHeaderClickedListener {
-    method public abstract void onHeaderClicked(android.support.v17.leanback.widget.RowHeaderPresenter.ViewHolder, android.support.v17.leanback.widget.Row);
-  }
-
-  public static abstract interface HeadersFragment.OnHeaderViewSelectedListener {
-    method public abstract void onHeaderSelected(android.support.v17.leanback.widget.RowHeaderPresenter.ViewHolder, android.support.v17.leanback.widget.Row);
-  }
-
-  public class HeadersSupportFragment extends android.support.v17.leanback.app.BaseRowSupportFragment {
-    ctor public HeadersSupportFragment();
-    method public boolean isScrolling();
-    method public void setOnHeaderClickedListener(android.support.v17.leanback.app.HeadersSupportFragment.OnHeaderClickedListener);
-    method public void setOnHeaderViewSelectedListener(android.support.v17.leanback.app.HeadersSupportFragment.OnHeaderViewSelectedListener);
-  }
-
-  public static abstract interface HeadersSupportFragment.OnHeaderClickedListener {
-    method public abstract void onHeaderClicked(android.support.v17.leanback.widget.RowHeaderPresenter.ViewHolder, android.support.v17.leanback.widget.Row);
-  }
-
-  public static abstract interface HeadersSupportFragment.OnHeaderViewSelectedListener {
-    method public abstract void onHeaderSelected(android.support.v17.leanback.widget.RowHeaderPresenter.ViewHolder, android.support.v17.leanback.widget.Row);
-  }
-
-  public abstract class MediaControllerGlue extends android.support.v17.leanback.app.PlaybackControlGlue {
-    ctor public MediaControllerGlue(android.content.Context, android.support.v17.leanback.app.PlaybackOverlayFragment, int[]);
-    ctor public MediaControllerGlue(android.content.Context, android.support.v17.leanback.app.PlaybackOverlayFragment, int[], int[]);
-    method public void attachToMediaController(android.support.v4.media.session.MediaControllerCompat);
-    method public void detach();
-    method public int getCurrentPosition();
-    method public int getCurrentSpeedId();
-    method public android.graphics.drawable.Drawable getMediaArt();
-    method public final android.support.v4.media.session.MediaControllerCompat getMediaController();
-    method public int getMediaDuration();
-    method public java.lang.CharSequence getMediaSubtitle();
-    method public java.lang.CharSequence getMediaTitle();
-    method public long getSupportedActions();
-    method public boolean hasValidMedia();
-    method public boolean isMediaPlaying();
-    method protected void pausePlayback();
-    method protected void skipToNext();
-    method protected void skipToPrevious();
-    method protected void startPlayback(int);
-  }
-
-  public abstract class OnboardingFragment extends android.app.Fragment {
-    ctor public OnboardingFragment();
-    method protected final int getCurrentPageIndex();
-    method public final int getLogoResourceId();
-    method protected abstract int getPageCount();
-    method protected abstract java.lang.CharSequence getPageDescription(int);
-    method protected abstract java.lang.CharSequence getPageTitle(int);
-    method protected abstract android.view.View onCreateBackgroundView(android.view.LayoutInflater, android.view.ViewGroup);
-    method protected abstract android.view.View onCreateContentView(android.view.LayoutInflater, android.view.ViewGroup);
-    method protected android.animation.Animator onCreateEnterAnimation();
-    method protected abstract android.view.View onCreateForegroundView(android.view.LayoutInflater, android.view.ViewGroup);
-    method protected android.animation.Animator onCreateLogoAnimation();
-    method protected void onFinishFragment();
-    method protected void onPageChanged(int, int);
-    method public int onProvideTheme();
-    method public final void setLogoResourceId(int);
-  }
-
-  public abstract class OnboardingSupportFragment extends android.support.v4.app.Fragment {
-    ctor public OnboardingSupportFragment();
-    method protected final int getCurrentPageIndex();
-    method public final int getLogoResourceId();
-    method protected abstract int getPageCount();
-    method protected abstract java.lang.CharSequence getPageDescription(int);
-    method protected abstract java.lang.CharSequence getPageTitle(int);
-    method protected abstract android.view.View onCreateBackgroundView(android.view.LayoutInflater, android.view.ViewGroup);
-    method protected abstract android.view.View onCreateContentView(android.view.LayoutInflater, android.view.ViewGroup);
-    method protected android.animation.Animator onCreateEnterAnimation();
-    method protected abstract android.view.View onCreateForegroundView(android.view.LayoutInflater, android.view.ViewGroup);
-    method protected android.animation.Animator onCreateLogoAnimation();
-    method protected void onFinishFragment();
-    method protected void onPageChanged(int, int);
-    method public int onProvideTheme();
-    method public final void setLogoResourceId(int);
-  }
-
-  public abstract class PlaybackControlGlue implements android.support.v17.leanback.widget.OnActionClickedListener android.view.View.OnKeyListener {
-    ctor public PlaybackControlGlue(android.content.Context, int[]);
-    ctor public PlaybackControlGlue(android.content.Context, int[], int[]);
-    ctor public PlaybackControlGlue(android.content.Context, android.support.v17.leanback.app.PlaybackOverlayFragment, int[]);
-    ctor public PlaybackControlGlue(android.content.Context, android.support.v17.leanback.app.PlaybackOverlayFragment, int[], int[]);
-    method public android.support.v17.leanback.widget.PlaybackControlsRowPresenter createControlsRowAndPresenter();
-    method protected android.support.v17.leanback.widget.SparseArrayObjectAdapter createPrimaryActionsAdapter(android.support.v17.leanback.widget.PresenterSelector);
-    method public void enableProgressUpdating(boolean);
-    method public android.content.Context getContext();
-    method public android.support.v17.leanback.widget.PlaybackControlsRow getControlsRow();
-    method public abstract int getCurrentPosition();
-    method public abstract int getCurrentSpeedId();
-    method public int[] getFastForwardSpeeds();
-    method public android.support.v17.leanback.app.PlaybackOverlayFragment getFragment();
-    method public abstract android.graphics.drawable.Drawable getMediaArt();
-    method public abstract int getMediaDuration();
-    method public abstract java.lang.CharSequence getMediaSubtitle();
-    method public abstract java.lang.CharSequence getMediaTitle();
-    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public int[] getRewindSpeeds();
-    method public abstract long getSupportedActions();
-    method public int getUpdatePeriod();
-    method public abstract boolean hasValidMedia();
-    method public boolean isFadingEnabled();
-    method public abstract boolean isMediaPlaying();
-    method public void onActionClicked(android.support.v17.leanback.widget.Action);
-    method public boolean onKey(android.view.View, int, android.view.KeyEvent);
-    method protected void onMetadataChanged();
-    method protected abstract void onRowChanged(android.support.v17.leanback.widget.PlaybackControlsRow);
-    method protected void onStateChanged();
-    method protected abstract void pausePlayback();
-    method public void setControlsRow(android.support.v17.leanback.widget.PlaybackControlsRow);
-    method public void setFadingEnabled(boolean);
-    method public deprecated void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method protected abstract void skipToNext();
-    method protected abstract void skipToPrevious();
-    method protected abstract void startPlayback(int);
-    method public void updateProgress();
-    field public static final int ACTION_CUSTOM_LEFT_FIRST = 1; // 0x1
-    field public static final int ACTION_CUSTOM_RIGHT_FIRST = 4096; // 0x1000
-    field public static final int ACTION_FAST_FORWARD = 128; // 0x80
-    field public static final int ACTION_PLAY_PAUSE = 64; // 0x40
-    field public static final int ACTION_REWIND = 32; // 0x20
-    field public static final int ACTION_SKIP_TO_NEXT = 256; // 0x100
-    field public static final int ACTION_SKIP_TO_PREVIOUS = 16; // 0x10
-    field public static final int PLAYBACK_SPEED_FAST_L0 = 10; // 0xa
-    field public static final int PLAYBACK_SPEED_FAST_L1 = 11; // 0xb
-    field public static final int PLAYBACK_SPEED_FAST_L2 = 12; // 0xc
-    field public static final int PLAYBACK_SPEED_FAST_L3 = 13; // 0xd
-    field public static final int PLAYBACK_SPEED_FAST_L4 = 14; // 0xe
-    field public static final int PLAYBACK_SPEED_INVALID = -1; // 0xffffffff
-    field public static final int PLAYBACK_SPEED_NORMAL = 1; // 0x1
-    field public static final int PLAYBACK_SPEED_PAUSED = 0; // 0x0
-  }
-
-  public abstract class PlaybackControlSupportGlue implements android.support.v17.leanback.widget.OnActionClickedListener android.view.View.OnKeyListener {
-    ctor public PlaybackControlSupportGlue(android.content.Context, int[]);
-    ctor public PlaybackControlSupportGlue(android.content.Context, int[], int[]);
-    ctor public PlaybackControlSupportGlue(android.content.Context, android.support.v17.leanback.app.PlaybackOverlaySupportFragment, int[]);
-    ctor public PlaybackControlSupportGlue(android.content.Context, android.support.v17.leanback.app.PlaybackOverlaySupportFragment, int[], int[]);
-    method public android.support.v17.leanback.widget.PlaybackControlsRowPresenter createControlsRowAndPresenter();
-    method protected android.support.v17.leanback.widget.SparseArrayObjectAdapter createPrimaryActionsAdapter(android.support.v17.leanback.widget.PresenterSelector);
-    method public void enableProgressUpdating(boolean);
-    method public android.content.Context getContext();
-    method public android.support.v17.leanback.widget.PlaybackControlsRow getControlsRow();
-    method public abstract int getCurrentPosition();
-    method public abstract int getCurrentSpeedId();
-    method public int[] getFastForwardSpeeds();
-    method public android.support.v17.leanback.app.PlaybackOverlaySupportFragment getFragment();
-    method public abstract android.graphics.drawable.Drawable getMediaArt();
-    method public abstract int getMediaDuration();
-    method public abstract java.lang.CharSequence getMediaSubtitle();
-    method public abstract java.lang.CharSequence getMediaTitle();
-    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public int[] getRewindSpeeds();
-    method public abstract long getSupportedActions();
-    method public int getUpdatePeriod();
-    method public abstract boolean hasValidMedia();
-    method public boolean isFadingEnabled();
-    method public abstract boolean isMediaPlaying();
-    method public void onActionClicked(android.support.v17.leanback.widget.Action);
-    method public boolean onKey(android.view.View, int, android.view.KeyEvent);
-    method protected void onMetadataChanged();
-    method protected abstract void onRowChanged(android.support.v17.leanback.widget.PlaybackControlsRow);
-    method protected void onStateChanged();
-    method protected abstract void pausePlayback();
-    method public void setControlsRow(android.support.v17.leanback.widget.PlaybackControlsRow);
-    method public void setFadingEnabled(boolean);
-    method public deprecated void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method protected abstract void skipToNext();
-    method protected abstract void skipToPrevious();
-    method protected abstract void startPlayback(int);
-    method public void updateProgress();
-    field public static final int ACTION_CUSTOM_LEFT_FIRST = 1; // 0x1
-    field public static final int ACTION_CUSTOM_RIGHT_FIRST = 4096; // 0x1000
-    field public static final int ACTION_FAST_FORWARD = 128; // 0x80
-    field public static final int ACTION_PLAY_PAUSE = 64; // 0x40
-    field public static final int ACTION_REWIND = 32; // 0x20
-    field public static final int ACTION_SKIP_TO_NEXT = 256; // 0x100
-    field public static final int ACTION_SKIP_TO_PREVIOUS = 16; // 0x10
-    field public static final int PLAYBACK_SPEED_FAST_L0 = 10; // 0xa
-    field public static final int PLAYBACK_SPEED_FAST_L1 = 11; // 0xb
-    field public static final int PLAYBACK_SPEED_FAST_L2 = 12; // 0xc
-    field public static final int PLAYBACK_SPEED_FAST_L3 = 13; // 0xd
-    field public static final int PLAYBACK_SPEED_FAST_L4 = 14; // 0xe
-    field public static final int PLAYBACK_SPEED_INVALID = -1; // 0xffffffff
-    field public static final int PLAYBACK_SPEED_NORMAL = 1; // 0x1
-    field public static final int PLAYBACK_SPEED_PAUSED = 0; // 0x0
-  }
-
-  public class PlaybackOverlayFragment extends android.support.v17.leanback.app.DetailsFragment {
-    ctor public PlaybackOverlayFragment();
-    method public void fadeOut();
-    method public int getBackgroundType();
-    method public android.support.v17.leanback.app.PlaybackOverlayFragment.OnFadeCompleteListener getFadeCompleteListener();
-    method public final android.support.v17.leanback.app.PlaybackOverlayFragment.InputEventHandler getInputEventHandler();
-    method public boolean isFadingEnabled();
-    method public void setBackgroundType(int);
-    method public void setFadeCompleteListener(android.support.v17.leanback.app.PlaybackOverlayFragment.OnFadeCompleteListener);
-    method public void setFadingEnabled(boolean);
-    method public final void setInputEventHandler(android.support.v17.leanback.app.PlaybackOverlayFragment.InputEventHandler);
-    method public void tickle();
-    field public static final int BG_DARK = 1; // 0x1
-    field public static final int BG_LIGHT = 2; // 0x2
-    field public static final int BG_NONE = 0; // 0x0
-  }
-
-  public static abstract interface PlaybackOverlayFragment.InputEventHandler {
-    method public abstract boolean handleInputEvent(android.view.InputEvent);
-  }
-
-  public static class PlaybackOverlayFragment.OnFadeCompleteListener {
-    ctor public PlaybackOverlayFragment.OnFadeCompleteListener();
-    method public void onFadeInComplete();
-    method public void onFadeOutComplete();
-  }
-
-  public class PlaybackOverlaySupportFragment extends android.support.v17.leanback.app.DetailsSupportFragment {
-    ctor public PlaybackOverlaySupportFragment();
-    method public void fadeOut();
-    method public int getBackgroundType();
-    method public android.support.v17.leanback.app.PlaybackOverlaySupportFragment.OnFadeCompleteListener getFadeCompleteListener();
-    method public final android.support.v17.leanback.app.PlaybackOverlaySupportFragment.InputEventHandler getInputEventHandler();
-    method public boolean isFadingEnabled();
-    method public void setBackgroundType(int);
-    method public void setFadeCompleteListener(android.support.v17.leanback.app.PlaybackOverlaySupportFragment.OnFadeCompleteListener);
-    method public void setFadingEnabled(boolean);
-    method public final void setInputEventHandler(android.support.v17.leanback.app.PlaybackOverlaySupportFragment.InputEventHandler);
-    method public void tickle();
-    field public static final int BG_DARK = 1; // 0x1
-    field public static final int BG_LIGHT = 2; // 0x2
-    field public static final int BG_NONE = 0; // 0x0
-  }
-
-  public static abstract interface PlaybackOverlaySupportFragment.InputEventHandler {
-    method public abstract boolean handleInputEvent(android.view.InputEvent);
-  }
-
-  public static class PlaybackOverlaySupportFragment.OnFadeCompleteListener {
-    ctor public PlaybackOverlaySupportFragment.OnFadeCompleteListener();
-    method public void onFadeInComplete();
-    method public void onFadeOutComplete();
-  }
-
-  public final class ProgressBarManager {
-    ctor public ProgressBarManager();
-    method public void disableProgressBar();
-    method public void enableProgressBar();
-    method public long getInitialDelay();
-    method public void hide();
-    method public void setInitialDelay(long);
-    method public void setProgressBarView(android.view.View);
-    method public void setRootView(android.view.ViewGroup);
-    method public void show();
-  }
-
-  public class RowsFragment extends android.support.v17.leanback.app.BaseRowFragment implements android.support.v17.leanback.app.BrowseFragment.MainFragmentAdapterProvider android.support.v17.leanback.app.BrowseFragment.MainFragmentRowsAdapterProvider {
-    ctor public RowsFragment();
-    method public deprecated void enableRowScaling(boolean);
-    method protected android.support.v17.leanback.widget.VerticalGridView findGridViewFromRoot(android.view.View);
-    method public android.support.v17.leanback.app.BrowseFragment.MainFragmentAdapter getMainFragmentAdapter();
-    method public android.support.v17.leanback.app.BrowseFragment.MainFragmentRowsAdapter getMainFragmentRowsAdapter();
-    method public android.support.v17.leanback.widget.BaseOnItemViewClickedListener getOnItemViewClickedListener();
-    method public android.support.v17.leanback.widget.BaseOnItemViewSelectedListener getOnItemViewSelectedListener();
-    method public android.support.v17.leanback.widget.RowPresenter.ViewHolder getRowViewHolder(int);
-    method public boolean isScrolling();
-    method public void setEntranceTransitionState(boolean);
-    method public void setExpand(boolean);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.BaseOnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.BaseOnItemViewSelectedListener);
-    method public void setSelectedPosition(int, boolean, android.support.v17.leanback.widget.Presenter.ViewHolderTask);
-  }
-
-  public static class RowsFragment.MainFragmentAdapter extends android.support.v17.leanback.app.BrowseFragment.MainFragmentAdapter {
-    ctor public RowsFragment.MainFragmentAdapter(android.support.v17.leanback.app.RowsFragment);
-  }
-
-  public static class RowsFragment.MainFragmentRowsAdapter extends android.support.v17.leanback.app.BrowseFragment.MainFragmentRowsAdapter {
-    ctor public RowsFragment.MainFragmentRowsAdapter(android.support.v17.leanback.app.RowsFragment);
-  }
-
-  public class RowsSupportFragment extends android.support.v17.leanback.app.BaseRowSupportFragment implements android.support.v17.leanback.app.BrowseSupportFragment.MainFragmentAdapterProvider android.support.v17.leanback.app.BrowseSupportFragment.MainFragmentRowsAdapterProvider {
-    ctor public RowsSupportFragment();
-    method public deprecated void enableRowScaling(boolean);
-    method protected android.support.v17.leanback.widget.VerticalGridView findGridViewFromRoot(android.view.View);
-    method public android.support.v17.leanback.app.BrowseSupportFragment.MainFragmentAdapter getMainFragmentAdapter();
-    method public android.support.v17.leanback.app.BrowseSupportFragment.MainFragmentRowsAdapter getMainFragmentRowsAdapter();
-    method public android.support.v17.leanback.widget.BaseOnItemViewClickedListener getOnItemViewClickedListener();
-    method public android.support.v17.leanback.widget.BaseOnItemViewSelectedListener getOnItemViewSelectedListener();
-    method public android.support.v17.leanback.widget.RowPresenter.ViewHolder getRowViewHolder(int);
-    method public boolean isScrolling();
-    method public void setEntranceTransitionState(boolean);
-    method public void setExpand(boolean);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.BaseOnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.BaseOnItemViewSelectedListener);
-    method public void setSelectedPosition(int, boolean, android.support.v17.leanback.widget.Presenter.ViewHolderTask);
-  }
-
-  public static class RowsSupportFragment.MainFragmentAdapter extends android.support.v17.leanback.app.BrowseSupportFragment.MainFragmentAdapter {
-    ctor public RowsSupportFragment.MainFragmentAdapter(android.support.v17.leanback.app.RowsSupportFragment);
-  }
-
-  public static class RowsSupportFragment.MainFragmentRowsAdapter extends android.support.v17.leanback.app.BrowseSupportFragment.MainFragmentRowsAdapter {
-    ctor public RowsSupportFragment.MainFragmentRowsAdapter(android.support.v17.leanback.app.RowsSupportFragment);
-  }
-
-  public class SearchFragment extends android.app.Fragment {
-    ctor public SearchFragment();
-    method public static android.os.Bundle createArgs(android.os.Bundle, java.lang.String);
-    method public static android.os.Bundle createArgs(android.os.Bundle, java.lang.String, java.lang.String);
-    method public void displayCompletions(java.util.List<java.lang.String>);
-    method public void displayCompletions(android.view.inputmethod.CompletionInfo[]);
-    method public android.graphics.drawable.Drawable getBadgeDrawable();
-    method public android.content.Intent getRecognizerIntent();
-    method public java.lang.String getTitle();
-    method public static android.support.v17.leanback.app.SearchFragment newInstance(java.lang.String);
-    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public void setSearchQuery(java.lang.String, boolean);
-    method public void setSearchQuery(android.content.Intent, boolean);
-    method public void setSearchResultProvider(android.support.v17.leanback.app.SearchFragment.SearchResultProvider);
-    method public void setSpeechRecognitionCallback(android.support.v17.leanback.widget.SpeechRecognitionCallback);
-    method public void setTitle(java.lang.String);
-    method public void startRecognition();
-  }
-
-  public static abstract interface SearchFragment.SearchResultProvider {
-    method public abstract android.support.v17.leanback.widget.ObjectAdapter getResultsAdapter();
-    method public abstract boolean onQueryTextChange(java.lang.String);
-    method public abstract boolean onQueryTextSubmit(java.lang.String);
-  }
-
-  public class SearchSupportFragment extends android.support.v4.app.Fragment {
-    ctor public SearchSupportFragment();
-    method public static android.os.Bundle createArgs(android.os.Bundle, java.lang.String);
-    method public static android.os.Bundle createArgs(android.os.Bundle, java.lang.String, java.lang.String);
-    method public void displayCompletions(java.util.List<java.lang.String>);
-    method public void displayCompletions(android.view.inputmethod.CompletionInfo[]);
-    method public android.graphics.drawable.Drawable getBadgeDrawable();
-    method public android.content.Intent getRecognizerIntent();
-    method public java.lang.String getTitle();
-    method public static android.support.v17.leanback.app.SearchSupportFragment newInstance(java.lang.String);
-    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public void setSearchQuery(java.lang.String, boolean);
-    method public void setSearchQuery(android.content.Intent, boolean);
-    method public void setSearchResultProvider(android.support.v17.leanback.app.SearchSupportFragment.SearchResultProvider);
-    method public void setSpeechRecognitionCallback(android.support.v17.leanback.widget.SpeechRecognitionCallback);
-    method public void setTitle(java.lang.String);
-    method public void startRecognition();
-  }
-
-  public static abstract interface SearchSupportFragment.SearchResultProvider {
-    method public abstract android.support.v17.leanback.widget.ObjectAdapter getResultsAdapter();
-    method public abstract boolean onQueryTextChange(java.lang.String);
-    method public abstract boolean onQueryTextSubmit(java.lang.String);
-  }
-
-  public class VerticalGridFragment extends android.support.v17.leanback.app.BrandedFragment {
-    ctor public VerticalGridFragment();
-    method protected java.lang.Object createEntranceTransition();
-    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
-    method public android.support.v17.leanback.widget.VerticalGridPresenter getGridPresenter();
-    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method protected void runEntranceTransition(java.lang.Object);
-    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public void setGridPresenter(android.support.v17.leanback.widget.VerticalGridPresenter);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public void setSelectedPosition(int);
-  }
-
-  public class VerticalGridSupportFragment extends android.support.v17.leanback.app.BrandedSupportFragment {
-    ctor public VerticalGridSupportFragment();
-    method protected java.lang.Object createEntranceTransition();
-    method public android.support.v17.leanback.widget.ObjectAdapter getAdapter();
-    method public android.support.v17.leanback.widget.VerticalGridPresenter getGridPresenter();
-    method public android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method protected void runEntranceTransition(java.lang.Object);
-    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public void setGridPresenter(android.support.v17.leanback.widget.VerticalGridPresenter);
-    method public void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public void setSelectedPosition(int);
-  }
-
-}
-
-package android.support.v17.leanback.database {
-
-  public abstract class CursorMapper {
-    ctor public CursorMapper();
-    method protected abstract java.lang.Object bind(android.database.Cursor);
-    method protected abstract void bindColumns(android.database.Cursor);
-    method public java.lang.Object convert(android.database.Cursor);
-  }
-
-}
-
-package android.support.v17.leanback.graphics {
-
-  public final class ColorFilterCache {
-    method public static android.support.v17.leanback.graphics.ColorFilterCache getColorFilterCache(int);
-    method public android.graphics.ColorFilter getFilterForLevel(float);
-  }
-
-  public final class ColorFilterDimmer {
-    method public void applyFilterToView(android.view.View);
-    method public static android.support.v17.leanback.graphics.ColorFilterDimmer create(android.support.v17.leanback.graphics.ColorFilterCache, float, float);
-    method public static android.support.v17.leanback.graphics.ColorFilterDimmer createDefault(android.content.Context);
-    method public android.graphics.ColorFilter getColorFilter();
-    method public android.graphics.Paint getPaint();
-    method public void setActiveLevel(float);
-  }
-
-  public final class ColorOverlayDimmer {
-    method public int applyToColor(int);
-    method public static android.support.v17.leanback.graphics.ColorOverlayDimmer createColorOverlayDimmer(int, float, float);
-    method public static android.support.v17.leanback.graphics.ColorOverlayDimmer createDefault(android.content.Context);
-    method public void drawColorOverlay(android.graphics.Canvas, android.view.View, boolean);
-    method public int getAlpha();
-    method public float getAlphaFloat();
-    method public android.graphics.Paint getPaint();
-    method public boolean needsDraw();
-    method public void setActiveLevel(float);
-  }
-
-}
-
-package android.support.v17.leanback.system {
-
-  public class Settings {
-    method public boolean getBoolean(java.lang.String);
-    method public static android.support.v17.leanback.system.Settings getInstance(android.content.Context);
-    method public void setBoolean(java.lang.String, boolean);
-    field public static final java.lang.String PREFER_STATIC_SHADOWS = "PREFER_STATIC_SHADOWS";
-  }
-
-}
-
-package android.support.v17.leanback.widget {
-
-  public abstract class AbstractDetailsDescriptionPresenter extends android.support.v17.leanback.widget.Presenter {
-    ctor public AbstractDetailsDescriptionPresenter();
-    method protected abstract void onBindDescription(android.support.v17.leanback.widget.AbstractDetailsDescriptionPresenter.ViewHolder, java.lang.Object);
-    method public final void onBindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object);
-    method public final android.support.v17.leanback.widget.AbstractDetailsDescriptionPresenter.ViewHolder onCreateViewHolder(android.view.ViewGroup);
-    method public void onUnbindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
-  }
-
-  public static class AbstractDetailsDescriptionPresenter.ViewHolder extends android.support.v17.leanback.widget.Presenter.ViewHolder {
-    ctor public AbstractDetailsDescriptionPresenter.ViewHolder(android.view.View);
-    method public android.widget.TextView getBody();
-    method public android.widget.TextView getSubtitle();
-    method public android.widget.TextView getTitle();
-  }
-
-  public abstract class AbstractMediaItemPresenter extends android.support.v17.leanback.widget.RowPresenter {
-    ctor public AbstractMediaItemPresenter();
-    ctor public AbstractMediaItemPresenter(int);
-    method protected android.support.v17.leanback.widget.RowPresenter.ViewHolder createRowViewHolder(android.view.ViewGroup);
-    method public android.support.v17.leanback.widget.Presenter getActionPresenter();
-    method public int getThemeId();
-    method public boolean hasMediaRowSeparator();
-    method protected abstract void onBindMediaDetails(android.support.v17.leanback.widget.AbstractMediaItemPresenter.ViewHolder, java.lang.Object);
-    method protected void onBindRowActions(android.support.v17.leanback.widget.AbstractMediaItemPresenter.ViewHolder);
-    method protected void onUnbindMediaDetails(android.support.v17.leanback.widget.AbstractMediaItemPresenter.ViewHolder);
-    method public void setActionPresenter(android.support.v17.leanback.widget.Presenter);
-    method public void setBackgroundColor(int);
-    method public void setHasMediaRowSeparator(boolean);
-    method public void setThemeId(int);
-  }
-
-  public static class AbstractMediaItemPresenter.ViewHolder extends android.support.v17.leanback.widget.RowPresenter.ViewHolder {
-    ctor public AbstractMediaItemPresenter.ViewHolder(android.view.View);
-    method public android.view.ViewGroup getMediaItemActionsContainer();
-    method public android.view.View getMediaItemDetailsView();
-    method public android.widget.TextView getMediaItemDurationView();
-    method public android.widget.TextView getMediaItemNameView();
-    method public android.widget.TextView getMediaItemNumberView();
-    method public android.support.v17.leanback.widget.MultiActionsProvider.MultiAction[] getMediaItemRowActions();
-    method public android.view.View getMediaItemRowSeparator();
-    method public android.view.View getSelectorView();
-    method public void notifyActionChanged(android.support.v17.leanback.widget.MultiActionsProvider.MultiAction);
-    method public void notifyDetailsChanged();
-    method public void onBindRowActions();
-  }
-
-  public abstract class AbstractMediaListHeaderPresenter extends android.support.v17.leanback.widget.RowPresenter {
-    ctor public AbstractMediaListHeaderPresenter(android.content.Context, int);
-    ctor public AbstractMediaListHeaderPresenter();
-    method protected android.support.v17.leanback.widget.RowPresenter.ViewHolder createRowViewHolder(android.view.ViewGroup);
-    method protected abstract void onBindMediaListHeaderViewHolder(android.support.v17.leanback.widget.AbstractMediaListHeaderPresenter.ViewHolder, java.lang.Object);
-    method public void setBackgroundColor(int);
-  }
-
-  public static class AbstractMediaListHeaderPresenter.ViewHolder extends android.support.v17.leanback.widget.RowPresenter.ViewHolder {
-    ctor public AbstractMediaListHeaderPresenter.ViewHolder(android.view.View);
-    method public android.widget.TextView getHeaderView();
-  }
-
-  public class Action {
-    ctor public Action(long);
-    ctor public Action(long, java.lang.CharSequence);
-    ctor public Action(long, java.lang.CharSequence, java.lang.CharSequence);
-    ctor public Action(long, java.lang.CharSequence, java.lang.CharSequence, android.graphics.drawable.Drawable);
-    method public final void addKeyCode(int);
-    method public final android.graphics.drawable.Drawable getIcon();
-    method public final long getId();
-    method public final java.lang.CharSequence getLabel1();
-    method public final java.lang.CharSequence getLabel2();
-    method public final void removeKeyCode(int);
-    method public final boolean respondsToKeyCode(int);
-    method public final void setIcon(android.graphics.drawable.Drawable);
-    method public final void setId(long);
-    method public final void setLabel1(java.lang.CharSequence);
-    method public final void setLabel2(java.lang.CharSequence);
-    field public static final long NO_ID = -1L; // 0xffffffffffffffffL
-  }
-
-  public class ArrayObjectAdapter extends android.support.v17.leanback.widget.ObjectAdapter {
-    ctor public ArrayObjectAdapter(android.support.v17.leanback.widget.PresenterSelector);
-    ctor public ArrayObjectAdapter(android.support.v17.leanback.widget.Presenter);
-    ctor public ArrayObjectAdapter();
-    method public void add(java.lang.Object);
-    method public void add(int, java.lang.Object);
-    method public void addAll(int, java.util.Collection);
-    method public void clear();
-    method public java.lang.Object get(int);
-    method public int indexOf(java.lang.Object);
-    method public void notifyArrayItemRangeChanged(int, int);
-    method public boolean remove(java.lang.Object);
-    method public int removeItems(int, int);
-    method public void replace(int, java.lang.Object);
-    method public int size();
-    method public java.util.List<E> unmodifiableList();
-  }
-
-  public class BaseCardView extends android.widget.FrameLayout {
-    ctor public BaseCardView(android.content.Context);
-    ctor public BaseCardView(android.content.Context, android.util.AttributeSet);
-    ctor public BaseCardView(android.content.Context, android.util.AttributeSet, int);
-    method public int getCardType();
-    method public int getExtraVisibility();
-    method public int getInfoVisibility();
-    method public boolean isSelectedAnimationDelayed();
-    method public void setCardType(int);
-    method public void setExtraVisibility(int);
-    method public void setInfoVisibility(int);
-    method public void setSelectedAnimationDelayed(boolean);
-    field public static final int CARD_REGION_VISIBLE_ACTIVATED = 1; // 0x1
-    field public static final int CARD_REGION_VISIBLE_ALWAYS = 0; // 0x0
-    field public static final int CARD_REGION_VISIBLE_SELECTED = 2; // 0x2
-    field public static final int CARD_TYPE_INFO_OVER = 1; // 0x1
-    field public static final int CARD_TYPE_INFO_UNDER = 2; // 0x2
-    field public static final int CARD_TYPE_INFO_UNDER_WITH_EXTRA = 3; // 0x3
-    field public static final int CARD_TYPE_MAIN_ONLY = 0; // 0x0
-  }
-
-  public static class BaseCardView.LayoutParams extends android.widget.FrameLayout.LayoutParams {
-    ctor public BaseCardView.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public BaseCardView.LayoutParams(int, int);
-    ctor public BaseCardView.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public BaseCardView.LayoutParams(android.support.v17.leanback.widget.BaseCardView.LayoutParams);
-    field public static final int VIEW_TYPE_EXTRA = 2; // 0x2
-    field public static final int VIEW_TYPE_INFO = 1; // 0x1
-    field public static final int VIEW_TYPE_MAIN = 0; // 0x0
-    field public int viewType;
-  }
-
-  public abstract interface BaseOnItemViewClickedListener {
-    method public abstract void onItemClicked(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object, android.support.v17.leanback.widget.RowPresenter.ViewHolder, T);
-  }
-
-  public abstract interface BaseOnItemViewSelectedListener {
-    method public abstract void onItemSelected(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object, android.support.v17.leanback.widget.RowPresenter.ViewHolder, T);
-  }
-
-  public class BrowseFrameLayout extends android.widget.FrameLayout {
-    ctor public BrowseFrameLayout(android.content.Context);
-    ctor public BrowseFrameLayout(android.content.Context, android.util.AttributeSet);
-    ctor public BrowseFrameLayout(android.content.Context, android.util.AttributeSet, int);
-    method public android.support.v17.leanback.widget.BrowseFrameLayout.OnChildFocusListener getOnChildFocusListener();
-    method public android.support.v17.leanback.widget.BrowseFrameLayout.OnFocusSearchListener getOnFocusSearchListener();
-    method public void setOnChildFocusListener(android.support.v17.leanback.widget.BrowseFrameLayout.OnChildFocusListener);
-    method public void setOnFocusSearchListener(android.support.v17.leanback.widget.BrowseFrameLayout.OnFocusSearchListener);
-  }
-
-  public static abstract interface BrowseFrameLayout.OnChildFocusListener {
-    method public abstract void onRequestChildFocus(android.view.View, android.view.View);
-    method public abstract boolean onRequestFocusInDescendants(int, android.graphics.Rect);
-  }
-
-  public static abstract interface BrowseFrameLayout.OnFocusSearchListener {
-    method public abstract android.view.View onFocusSearch(android.view.View, int);
-  }
-
-  public final class ClassPresenterSelector extends android.support.v17.leanback.widget.PresenterSelector {
-    ctor public ClassPresenterSelector();
-    method public android.support.v17.leanback.widget.ClassPresenterSelector addClassPresenter(java.lang.Class<?>, android.support.v17.leanback.widget.Presenter);
-    method public android.support.v17.leanback.widget.ClassPresenterSelector addClassPresenterSelector(java.lang.Class<?>, android.support.v17.leanback.widget.PresenterSelector);
-    method public android.support.v17.leanback.widget.Presenter getPresenter(java.lang.Object);
-  }
-
-  public class ControlButtonPresenterSelector extends android.support.v17.leanback.widget.PresenterSelector {
-    ctor public ControlButtonPresenterSelector();
-    method public android.support.v17.leanback.widget.Presenter getPresenter(java.lang.Object);
-    method public android.support.v17.leanback.widget.Presenter getPrimaryPresenter();
-    method public android.support.v17.leanback.widget.Presenter getSecondaryPresenter();
-  }
-
-  public class CursorObjectAdapter extends android.support.v17.leanback.widget.ObjectAdapter {
-    ctor public CursorObjectAdapter(android.support.v17.leanback.widget.PresenterSelector);
-    ctor public CursorObjectAdapter(android.support.v17.leanback.widget.Presenter);
-    ctor public CursorObjectAdapter();
-    method public void changeCursor(android.database.Cursor);
-    method public void close();
-    method public java.lang.Object get(int);
-    method public final android.database.Cursor getCursor();
-    method public final android.support.v17.leanback.database.CursorMapper getMapper();
-    method protected final void invalidateCache(int);
-    method protected final void invalidateCache(int, int);
-    method public boolean isClosed();
-    method protected void onCursorChanged();
-    method protected void onMapperChanged();
-    method public final void setMapper(android.support.v17.leanback.database.CursorMapper);
-    method public int size();
-    method public android.database.Cursor swapCursor(android.database.Cursor);
-  }
-
-  public class DetailsOverviewLogoPresenter extends android.support.v17.leanback.widget.Presenter {
-    ctor public DetailsOverviewLogoPresenter();
-    method public boolean isBoundToImage(android.support.v17.leanback.widget.DetailsOverviewLogoPresenter.ViewHolder, android.support.v17.leanback.widget.DetailsOverviewRow);
-    method public void onBindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object);
-    method public android.view.View onCreateView(android.view.ViewGroup);
-    method public android.support.v17.leanback.widget.Presenter.ViewHolder onCreateViewHolder(android.view.ViewGroup);
-    method public void onUnbindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public void setContext(android.support.v17.leanback.widget.DetailsOverviewLogoPresenter.ViewHolder, android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder, android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter);
-  }
-
-  public static class DetailsOverviewLogoPresenter.ViewHolder extends android.support.v17.leanback.widget.Presenter.ViewHolder {
-    ctor public DetailsOverviewLogoPresenter.ViewHolder(android.view.View);
-    method public android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter getParentPresenter();
-    method public android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder getParentViewHolder();
-    method public boolean isSizeFromDrawableIntrinsic();
-    method public void setSizeFromDrawableIntrinsic(boolean);
-    field protected android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter mParentPresenter;
-    field protected android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder mParentViewHolder;
-  }
-
-  public class DetailsOverviewRow extends android.support.v17.leanback.widget.Row {
-    ctor public DetailsOverviewRow(java.lang.Object);
-    method public final deprecated void addAction(android.support.v17.leanback.widget.Action);
-    method public final deprecated void addAction(int, android.support.v17.leanback.widget.Action);
-    method public android.support.v17.leanback.widget.Action getActionForKeyCode(int);
-    method public final deprecated java.util.List<android.support.v17.leanback.widget.Action> getActions();
-    method public final android.support.v17.leanback.widget.ObjectAdapter getActionsAdapter();
-    method public final android.graphics.drawable.Drawable getImageDrawable();
-    method public final java.lang.Object getItem();
-    method public boolean isImageScaleUpAllowed();
-    method public final deprecated boolean removeAction(android.support.v17.leanback.widget.Action);
-    method public final void setActionsAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public final void setImageBitmap(android.content.Context, android.graphics.Bitmap);
-    method public final void setImageDrawable(android.graphics.drawable.Drawable);
-    method public void setImageScaleUpAllowed(boolean);
-    method public final void setItem(java.lang.Object);
-  }
-
-  public static class DetailsOverviewRow.Listener {
-    ctor public DetailsOverviewRow.Listener();
-    method public void onActionsAdapterChanged(android.support.v17.leanback.widget.DetailsOverviewRow);
-    method public void onImageDrawableChanged(android.support.v17.leanback.widget.DetailsOverviewRow);
-    method public void onItemChanged(android.support.v17.leanback.widget.DetailsOverviewRow);
-  }
-
-  public deprecated class DetailsOverviewRowPresenter extends android.support.v17.leanback.widget.RowPresenter {
-    ctor public DetailsOverviewRowPresenter(android.support.v17.leanback.widget.Presenter);
-    method protected android.support.v17.leanback.widget.RowPresenter.ViewHolder createRowViewHolder(android.view.ViewGroup);
-    method public int getBackgroundColor();
-    method public android.support.v17.leanback.widget.OnActionClickedListener getOnActionClickedListener();
-    method public boolean isStyleLarge();
-    method public final boolean isUsingDefaultSelectEffect();
-    method public void setBackgroundColor(int);
-    method public void setOnActionClickedListener(android.support.v17.leanback.widget.OnActionClickedListener);
-    method public final void setSharedElementEnterTransition(android.app.Activity, java.lang.String, long);
-    method public final void setSharedElementEnterTransition(android.app.Activity, java.lang.String);
-    method public void setStyleLarge(boolean);
-  }
-
-  public final class DetailsOverviewRowPresenter.ViewHolder extends android.support.v17.leanback.widget.RowPresenter.ViewHolder {
-    ctor public DetailsOverviewRowPresenter.ViewHolder(android.view.View, android.support.v17.leanback.widget.Presenter);
-    field public final android.support.v17.leanback.widget.Presenter.ViewHolder mDetailsDescriptionViewHolder;
-  }
-
-  public class DividerPresenter extends android.support.v17.leanback.widget.Presenter {
-    ctor public DividerPresenter();
-    method public void onBindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object);
-    method public android.support.v17.leanback.widget.Presenter.ViewHolder onCreateViewHolder(android.view.ViewGroup);
-    method public void onUnbindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
-  }
-
-  public class DividerRow extends android.support.v17.leanback.widget.Row {
-    ctor public DividerRow();
-    method public final boolean isRenderedAsRowView();
-  }
-
-  public abstract interface FacetProvider {
-    method public abstract java.lang.Object getFacet(java.lang.Class<?>);
-  }
-
-  public abstract interface FacetProviderAdapter {
-    method public abstract android.support.v17.leanback.widget.FacetProvider getFacetProvider(int);
-  }
-
-  public abstract interface FocusHighlight {
-    field public static final int ZOOM_FACTOR_LARGE = 3; // 0x3
-    field public static final int ZOOM_FACTOR_MEDIUM = 2; // 0x2
-    field public static final int ZOOM_FACTOR_NONE = 0; // 0x0
-    field public static final int ZOOM_FACTOR_SMALL = 1; // 0x1
-    field public static final int ZOOM_FACTOR_XSMALL = 4; // 0x4
-  }
-
-  public class FocusHighlightHelper {
-    ctor public FocusHighlightHelper();
-    method public static void setupBrowseItemFocusHighlight(android.support.v17.leanback.widget.ItemBridgeAdapter, int, boolean);
-    method public static void setupHeaderItemFocusHighlight(android.support.v17.leanback.widget.VerticalGridView);
-  }
-
-  public abstract interface FragmentAnimationProvider {
-    method public abstract void onImeAppearing(java.util.List<android.animation.Animator>);
-    method public abstract void onImeDisappearing(java.util.List<android.animation.Animator>);
-  }
-
-  public class FullWidthDetailsOverviewRowPresenter extends android.support.v17.leanback.widget.RowPresenter {
-    ctor public FullWidthDetailsOverviewRowPresenter(android.support.v17.leanback.widget.Presenter);
-    ctor public FullWidthDetailsOverviewRowPresenter(android.support.v17.leanback.widget.Presenter, android.support.v17.leanback.widget.DetailsOverviewLogoPresenter);
-    method protected android.support.v17.leanback.widget.RowPresenter.ViewHolder createRowViewHolder(android.view.ViewGroup);
-    method public final int getActionsBackgroundColor();
-    method public final int getAlignmentMode();
-    method public final int getBackgroundColor();
-    method public final int getInitialState();
-    method protected int getLayoutResourceId();
-    method public android.support.v17.leanback.widget.OnActionClickedListener getOnActionClickedListener();
-    method public final boolean isParticipatingEntranceTransition();
-    method public final boolean isUsingDefaultSelectEffect();
-    method public final void notifyOnBindLogo(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder);
-    method protected void onLayoutLogo(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder, int, boolean);
-    method protected void onLayoutOverviewFrame(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder, int, boolean);
-    method protected void onStateChanged(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder, int);
-    method public final void setActionsBackgroundColor(int);
-    method public final void setAlignmentMode(int);
-    method public final void setBackgroundColor(int);
-    method public final void setInitialState(int);
-    method public final void setListener(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.Listener);
-    method public void setOnActionClickedListener(android.support.v17.leanback.widget.OnActionClickedListener);
-    method public final void setParticipatingEntranceTransition(boolean);
-    method public final void setState(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder, int);
-    field public static final int ALIGN_MODE_MIDDLE = 1; // 0x1
-    field public static final int ALIGN_MODE_START = 0; // 0x0
-    field public static final int STATE_FULL = 1; // 0x1
-    field public static final int STATE_HALF = 0; // 0x0
-    field public static final int STATE_SMALL = 2; // 0x2
-    field protected int mInitialState;
-  }
-
-  public static abstract class FullWidthDetailsOverviewRowPresenter.Listener {
-    ctor public FullWidthDetailsOverviewRowPresenter.Listener();
-    method public void onBindLogo(android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.ViewHolder);
-  }
-
-  public class FullWidthDetailsOverviewRowPresenter.ViewHolder extends android.support.v17.leanback.widget.RowPresenter.ViewHolder {
-    ctor public FullWidthDetailsOverviewRowPresenter.ViewHolder(android.view.View, android.support.v17.leanback.widget.Presenter, android.support.v17.leanback.widget.DetailsOverviewLogoPresenter);
-    method protected android.support.v17.leanback.widget.DetailsOverviewRow.Listener createRowListener();
-    method public final android.view.ViewGroup getActionsRow();
-    method public final android.view.ViewGroup getDetailsDescriptionFrame();
-    method public final android.support.v17.leanback.widget.Presenter.ViewHolder getDetailsDescriptionViewHolder();
-    method public final android.support.v17.leanback.widget.DetailsOverviewLogoPresenter.ViewHolder getLogoViewHolder();
-    method public final android.view.ViewGroup getOverviewView();
-    method public final int getState();
-    field protected final android.support.v17.leanback.widget.DetailsOverviewRow.Listener mRowListener;
-  }
-
-  public class FullWidthDetailsOverviewRowPresenter.ViewHolder.DetailsOverviewRowListener extends android.support.v17.leanback.widget.DetailsOverviewRow.Listener {
-    ctor public FullWidthDetailsOverviewRowPresenter.ViewHolder.DetailsOverviewRowListener();
-  }
-
-  public class FullWidthDetailsOverviewSharedElementHelper extends android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter.Listener {
-    ctor public FullWidthDetailsOverviewSharedElementHelper();
-    method public boolean getAutoStartSharedElementTransition();
-    method public void setAutoStartSharedElementTransition(boolean);
-    method public void setSharedElementEnterTransition(android.app.Activity, java.lang.String);
-    method public void setSharedElementEnterTransition(android.app.Activity, java.lang.String, long);
-    method public void startPostponedEnterTransition();
-  }
-
-  public class GuidanceStylist implements android.support.v17.leanback.widget.FragmentAnimationProvider {
-    ctor public GuidanceStylist();
-    method public android.widget.TextView getBreadcrumbView();
-    method public android.widget.TextView getDescriptionView();
-    method public android.widget.ImageView getIconView();
-    method public android.widget.TextView getTitleView();
-    method public android.view.View onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.support.v17.leanback.widget.GuidanceStylist.Guidance);
-    method public void onDestroyView();
-    method public void onImeAppearing(java.util.List<android.animation.Animator>);
-    method public void onImeDisappearing(java.util.List<android.animation.Animator>);
-    method public int onProvideLayoutId();
-  }
-
-  public static class GuidanceStylist.Guidance {
-    ctor public GuidanceStylist.Guidance(java.lang.String, java.lang.String, java.lang.String, android.graphics.drawable.Drawable);
-    method public java.lang.String getBreadcrumb();
-    method public java.lang.String getDescription();
-    method public android.graphics.drawable.Drawable getIconDrawable();
-    method public java.lang.String getTitle();
-  }
-
-  public class GuidedAction extends android.support.v17.leanback.widget.Action {
-    ctor protected GuidedAction();
-    method public int getCheckSetId();
-    method public java.lang.CharSequence getDescription();
-    method public int getDescriptionEditInputType();
-    method public int getDescriptionInputType();
-    method public java.lang.CharSequence getEditDescription();
-    method public int getEditInputType();
-    method public java.lang.CharSequence getEditTitle();
-    method public int getInputType();
-    method public android.content.Intent getIntent();
-    method public java.util.List<android.support.v17.leanback.widget.GuidedAction> getSubActions();
-    method public java.lang.CharSequence getTitle();
-    method public boolean hasEditableActivatorView();
-    method public boolean hasMultilineDescription();
-    method public boolean hasNext();
-    method public boolean hasSubActions();
-    method public boolean hasTextEditable();
-    method public boolean infoOnly();
-    method public final boolean isAutoSaveRestoreEnabled();
-    method public boolean isChecked();
-    method public boolean isDescriptionEditable();
-    method public boolean isEditTitleUsed();
-    method public boolean isEditable();
-    method public boolean isEnabled();
-    method public boolean isFocusable();
-    method public void onRestoreInstanceState(android.os.Bundle, java.lang.String);
-    method public void onSaveInstanceState(android.os.Bundle, java.lang.String);
-    method public void setChecked(boolean);
-    method public void setDescription(java.lang.CharSequence);
-    method public void setEditDescription(java.lang.CharSequence);
-    method public void setEditTitle(java.lang.CharSequence);
-    method public void setEnabled(boolean);
-    method public void setFocusable(boolean);
-    method public void setIntent(android.content.Intent);
-    method public void setSubActions(java.util.List<android.support.v17.leanback.widget.GuidedAction>);
-    method public void setTitle(java.lang.CharSequence);
-    field public static final long ACTION_ID_CANCEL = -5L; // 0xfffffffffffffffbL
-    field public static final long ACTION_ID_CONTINUE = -7L; // 0xfffffffffffffff9L
-    field public static final long ACTION_ID_CURRENT = -3L; // 0xfffffffffffffffdL
-    field public static final long ACTION_ID_FINISH = -6L; // 0xfffffffffffffffaL
-    field public static final long ACTION_ID_NEXT = -2L; // 0xfffffffffffffffeL
-    field public static final long ACTION_ID_NO = -9L; // 0xfffffffffffffff7L
-    field public static final long ACTION_ID_OK = -4L; // 0xfffffffffffffffcL
-    field public static final long ACTION_ID_YES = -8L; // 0xfffffffffffffff8L
-    field public static final int CHECKBOX_CHECK_SET_ID = -1; // 0xffffffff
-    field public static final int DEFAULT_CHECK_SET_ID = 1; // 0x1
-    field public static final int NO_CHECK_SET = 0; // 0x0
-  }
-
-  public static class GuidedAction.Builder extends android.support.v17.leanback.widget.GuidedAction.BuilderBase {
-    ctor public deprecated GuidedAction.Builder();
-    ctor public GuidedAction.Builder(android.content.Context);
-    method public android.support.v17.leanback.widget.GuidedAction build();
-  }
-
-  public static abstract class GuidedAction.BuilderBase {
-    ctor public GuidedAction.BuilderBase(android.content.Context);
-    method protected final void applyValues(android.support.v17.leanback.widget.GuidedAction);
-    method public B autoSaveRestoreEnabled(boolean);
-    method public B checkSetId(int);
-    method public B checked(boolean);
-    method public B clickAction(long);
-    method public B description(java.lang.CharSequence);
-    method public B description(int);
-    method public B descriptionEditInputType(int);
-    method public B descriptionEditable(boolean);
-    method public B descriptionInputType(int);
-    method public B editDescription(java.lang.CharSequence);
-    method public B editDescription(int);
-    method public B editInputType(int);
-    method public B editTitle(java.lang.CharSequence);
-    method public B editTitle(int);
-    method public B editable(boolean);
-    method public B enabled(boolean);
-    method public B focusable(boolean);
-    method public android.content.Context getContext();
-    method public B hasEditableActivatorView(boolean);
-    method public B hasNext(boolean);
-    method public B icon(android.graphics.drawable.Drawable);
-    method public B icon(int);
-    method public deprecated B iconResourceId(int, android.content.Context);
-    method public B id(long);
-    method public B infoOnly(boolean);
-    method public B inputType(int);
-    method public B intent(android.content.Intent);
-    method public B multilineDescription(boolean);
-    method public B subActions(java.util.List<android.support.v17.leanback.widget.GuidedAction>);
-    method public B title(java.lang.CharSequence);
-    method public B title(int);
-  }
-
-  public class GuidedActionEditText extends android.widget.EditText implements android.support.v17.leanback.widget.ImeKeyMonitor {
-    ctor public GuidedActionEditText(android.content.Context);
-    ctor public GuidedActionEditText(android.content.Context, android.util.AttributeSet);
-    ctor public GuidedActionEditText(android.content.Context, android.util.AttributeSet, int);
-    method public void setImeKeyListener(android.support.v17.leanback.widget.ImeKeyMonitor.ImeKeyListener);
-  }
-
-  public class GuidedActionsStylist implements android.support.v17.leanback.widget.FragmentAnimationProvider {
-    ctor public GuidedActionsStylist();
-    method public android.support.v17.leanback.widget.VerticalGridView getActionsGridView();
-    method public android.support.v17.leanback.widget.GuidedAction getExpandedAction();
-    method public int getItemViewType(android.support.v17.leanback.widget.GuidedAction);
-    method public android.support.v17.leanback.widget.VerticalGridView getSubActionsGridView();
-    method public boolean isButtonActions();
-    method public boolean isExpandTransitionSupported();
-    method public boolean isInExpandTransition();
-    method public boolean isSubActionsExpanded();
-    method public void onAnimateItemChecked(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, boolean);
-    method public void onAnimateItemFocused(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, boolean);
-    method public void onAnimateItemPressed(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, boolean);
-    method public void onAnimateItemPressedCancelled(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder);
-    method public void onBindActivatorView(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, android.support.v17.leanback.widget.GuidedAction);
-    method public void onBindCheckMarkView(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, android.support.v17.leanback.widget.GuidedAction);
-    method public void onBindChevronView(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, android.support.v17.leanback.widget.GuidedAction);
-    method public void onBindViewHolder(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, android.support.v17.leanback.widget.GuidedAction);
-    method public android.view.View onCreateView(android.view.LayoutInflater, android.view.ViewGroup);
-    method public android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder onCreateViewHolder(android.view.ViewGroup);
-    method public android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder onCreateViewHolder(android.view.ViewGroup, int);
-    method public void onDestroyView();
-    method protected void onEditingModeChange(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, android.support.v17.leanback.widget.GuidedAction, boolean);
-    method public void onImeAppearing(java.util.List<android.animation.Animator>);
-    method public void onImeDisappearing(java.util.List<android.animation.Animator>);
-    method public int onProvideItemLayoutId();
-    method public int onProvideItemLayoutId(int);
-    method public int onProvideLayoutId();
-    method public boolean onUpdateActivatorView(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, android.support.v17.leanback.widget.GuidedAction);
-    method public void onUpdateExpandedViewHolder(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder);
-    method public void setAsButtonActions();
-    method public void setEditingMode(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, android.support.v17.leanback.widget.GuidedAction, boolean);
-    method public void setExpandedViewHolder(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder);
-    method protected void setupImeOptions(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, android.support.v17.leanback.widget.GuidedAction);
-    method public void startExpandedTransition(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder);
-    field public static final int VIEW_TYPE_DATE_PICKER = 1; // 0x1
-    field public static final int VIEW_TYPE_DEFAULT = 0; // 0x0
-  }
-
-  public static class GuidedActionsStylist.ViewHolder extends android.support.v7.widget.RecyclerView.ViewHolder implements android.support.v17.leanback.widget.FacetProvider {
-    ctor public GuidedActionsStylist.ViewHolder(android.view.View);
-    ctor public GuidedActionsStylist.ViewHolder(android.view.View, boolean);
-    method public android.support.v17.leanback.widget.GuidedAction getAction();
-    method public android.widget.ImageView getCheckmarkView();
-    method public android.widget.ImageView getChevronView();
-    method public android.view.View getContentView();
-    method public android.widget.TextView getDescriptionView();
-    method public android.widget.EditText getEditableDescriptionView();
-    method public android.widget.EditText getEditableTitleView();
-    method public android.view.View getEditingView();
-    method public java.lang.Object getFacet(java.lang.Class<?>);
-    method public android.widget.ImageView getIconView();
-    method public android.widget.TextView getTitleView();
-    method public boolean isInEditing();
-    method public boolean isInEditingActivatorView();
-    method public boolean isInEditingDescription();
-    method public boolean isInEditingText();
-    method public boolean isInEditingTitle();
-    method public boolean isSubAction();
-  }
-
-  public class GuidedDatePickerAction extends android.support.v17.leanback.widget.GuidedAction {
-    ctor public GuidedDatePickerAction();
-    method public long getDate();
-    method public java.lang.String getDatePickerFormat();
-    method public long getMaxDate();
-    method public long getMinDate();
-    method public void setDate(long);
-  }
-
-  public static final class GuidedDatePickerAction.Builder extends android.support.v17.leanback.widget.GuidedDatePickerAction.BuilderBase {
-    ctor public GuidedDatePickerAction.Builder(android.content.Context);
-    method public android.support.v17.leanback.widget.GuidedDatePickerAction build();
-  }
-
-  public static abstract class GuidedDatePickerAction.BuilderBase extends android.support.v17.leanback.widget.GuidedAction.BuilderBase {
-    ctor public GuidedDatePickerAction.BuilderBase(android.content.Context);
-    method protected final void applyDatePickerValues(android.support.v17.leanback.widget.GuidedDatePickerAction);
-    method public B date(long);
-    method public B datePickerFormat(java.lang.String);
-    method public B maxDate(long);
-    method public B minDate(long);
-  }
-
-  public class HeaderItem {
-    ctor public HeaderItem(long, java.lang.String);
-    ctor public HeaderItem(java.lang.String);
-    method public java.lang.CharSequence getContentDescription();
-    method public final long getId();
-    method public final java.lang.String getName();
-    method public void setContentDescription(java.lang.CharSequence);
-  }
-
-  public class HorizontalGridView extends android.support.v7.widget.RecyclerView {
-    ctor public HorizontalGridView(android.content.Context);
-    ctor public HorizontalGridView(android.content.Context, android.util.AttributeSet);
-    ctor public HorizontalGridView(android.content.Context, android.util.AttributeSet, int);
-    method public final boolean getFadingLeftEdge();
-    method public final int getFadingLeftEdgeLength();
-    method public final int getFadingLeftEdgeOffset();
-    method public final boolean getFadingRightEdge();
-    method public final int getFadingRightEdgeLength();
-    method public final int getFadingRightEdgeOffset();
-    method protected void initAttributes(android.content.Context, android.util.AttributeSet);
-    method public final void setFadingLeftEdge(boolean);
-    method public final void setFadingLeftEdgeLength(int);
-    method public final void setFadingLeftEdgeOffset(int);
-    method public final void setFadingRightEdge(boolean);
-    method public final void setFadingRightEdgeLength(int);
-    method public final void setFadingRightEdgeOffset(int);
-    method public void setNumRows(int);
-    method public void setRowHeight(int);
-  }
-
-  public final class HorizontalHoverCardSwitcher extends android.support.v17.leanback.widget.PresenterSwitcher {
-    ctor public HorizontalHoverCardSwitcher();
-    method protected void insertView(android.view.View);
-    method public void select(android.support.v17.leanback.widget.HorizontalGridView, android.view.View, java.lang.Object);
-  }
-
-  public class ImageCardView extends android.support.v17.leanback.widget.BaseCardView {
-    ctor public deprecated ImageCardView(android.content.Context, int);
-    ctor public ImageCardView(android.content.Context, android.util.AttributeSet, int);
-    ctor public ImageCardView(android.content.Context);
-    ctor public ImageCardView(android.content.Context, android.util.AttributeSet);
-    method public android.graphics.drawable.Drawable getBadgeImage();
-    method public java.lang.CharSequence getContentText();
-    method public android.graphics.drawable.Drawable getInfoAreaBackground();
-    method public android.graphics.drawable.Drawable getMainImage();
-    method public final android.widget.ImageView getMainImageView();
-    method public java.lang.CharSequence getTitleText();
-    method public void setBadgeImage(android.graphics.drawable.Drawable);
-    method public void setContentText(java.lang.CharSequence);
-    method public void setInfoAreaBackground(android.graphics.drawable.Drawable);
-    method public void setInfoAreaBackgroundColor(int);
-    method public void setMainImage(android.graphics.drawable.Drawable);
-    method public void setMainImage(android.graphics.drawable.Drawable, boolean);
-    method public void setMainImageAdjustViewBounds(boolean);
-    method public void setMainImageDimensions(int, int);
-    method public void setMainImageScaleType(android.widget.ImageView.ScaleType);
-    method public void setTitleText(java.lang.CharSequence);
-    field public static final int CARD_TYPE_FLAG_CONTENT = 2; // 0x2
-    field public static final int CARD_TYPE_FLAG_ICON_LEFT = 8; // 0x8
-    field public static final int CARD_TYPE_FLAG_ICON_RIGHT = 4; // 0x4
-    field public static final int CARD_TYPE_FLAG_IMAGE_ONLY = 0; // 0x0
-    field public static final int CARD_TYPE_FLAG_TITLE = 1; // 0x1
-  }
-
-  public abstract interface ImeKeyMonitor {
-    method public abstract void setImeKeyListener(android.support.v17.leanback.widget.ImeKeyMonitor.ImeKeyListener);
-  }
-
-  public static abstract interface ImeKeyMonitor.ImeKeyListener {
-    method public abstract boolean onKeyPreIme(android.widget.EditText, int, android.view.KeyEvent);
-  }
-
-  public final class ItemAlignmentFacet {
-    ctor public ItemAlignmentFacet();
-    method public android.support.v17.leanback.widget.ItemAlignmentFacet.ItemAlignmentDef[] getAlignmentDefs();
-    method public boolean isMultiAlignment();
-    method public void setAlignmentDefs(android.support.v17.leanback.widget.ItemAlignmentFacet.ItemAlignmentDef[]);
-    field public static final float ITEM_ALIGN_OFFSET_PERCENT_DISABLED = -1.0f;
-  }
-
-  public static class ItemAlignmentFacet.ItemAlignmentDef {
-    ctor public ItemAlignmentFacet.ItemAlignmentDef();
-    method public final int getItemAlignmentFocusViewId();
-    method public final int getItemAlignmentOffset();
-    method public final float getItemAlignmentOffsetPercent();
-    method public final int getItemAlignmentViewId();
-    method public boolean isAlignedToTextViewBaseLine();
-    method public final boolean isItemAlignmentOffsetWithPadding();
-    method public final void setAlignedToTextViewBaseline(boolean);
-    method public final void setItemAlignmentFocusViewId(int);
-    method public final void setItemAlignmentOffset(int);
-    method public final void setItemAlignmentOffsetPercent(float);
-    method public final void setItemAlignmentOffsetWithPadding(boolean);
-    method public final void setItemAlignmentViewId(int);
-  }
-
-  public class ItemBridgeAdapter extends android.support.v7.widget.RecyclerView.Adapter implements android.support.v17.leanback.widget.FacetProviderAdapter {
-    ctor public ItemBridgeAdapter(android.support.v17.leanback.widget.ObjectAdapter, android.support.v17.leanback.widget.PresenterSelector);
-    ctor public ItemBridgeAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    ctor public ItemBridgeAdapter();
-    method public void clear();
-    method public android.support.v17.leanback.widget.FacetProvider getFacetProvider(int);
-    method public int getItemCount();
-    method public java.util.ArrayList<android.support.v17.leanback.widget.Presenter> getPresenterMapper();
-    method public android.support.v17.leanback.widget.ItemBridgeAdapter.Wrapper getWrapper();
-    method protected void onAddPresenter(android.support.v17.leanback.widget.Presenter, int);
-    method protected void onAttachedToWindow(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
-    method protected void onBind(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
-    method public final void onBindViewHolder(android.support.v7.widget.RecyclerView.ViewHolder, int);
-    method protected void onCreate(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
-    method public final android.support.v7.widget.RecyclerView.ViewHolder onCreateViewHolder(android.view.ViewGroup, int);
-    method protected void onDetachedFromWindow(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
-    method protected void onUnbind(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
-    method public final void onViewAttachedToWindow(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public final void onViewDetachedFromWindow(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public final void onViewRecycled(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void setAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public void setAdapterListener(android.support.v17.leanback.widget.ItemBridgeAdapter.AdapterListener);
-    method public void setPresenterMapper(java.util.ArrayList<android.support.v17.leanback.widget.Presenter>);
-    method public void setWrapper(android.support.v17.leanback.widget.ItemBridgeAdapter.Wrapper);
-  }
-
-  public static class ItemBridgeAdapter.AdapterListener {
-    ctor public ItemBridgeAdapter.AdapterListener();
-    method public void onAddPresenter(android.support.v17.leanback.widget.Presenter, int);
-    method public void onAttachedToWindow(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
-    method public void onBind(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
-    method public void onCreate(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
-    method public void onDetachedFromWindow(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
-    method public void onUnbind(android.support.v17.leanback.widget.ItemBridgeAdapter.ViewHolder);
-  }
-
-  public class ItemBridgeAdapter.ViewHolder extends android.support.v7.widget.RecyclerView.ViewHolder implements android.support.v17.leanback.widget.FacetProvider {
-    method public final java.lang.Object getExtraObject();
-    method public java.lang.Object getFacet(java.lang.Class<?>);
-    method public final java.lang.Object getItem();
-    method public final android.support.v17.leanback.widget.Presenter getPresenter();
-    method public final android.support.v17.leanback.widget.Presenter.ViewHolder getViewHolder();
-    method public void setExtraObject(java.lang.Object);
-  }
-
-  public static abstract class ItemBridgeAdapter.Wrapper {
-    ctor public ItemBridgeAdapter.Wrapper();
-    method public abstract android.view.View createWrapper(android.view.View);
-    method public abstract void wrap(android.view.View, android.view.View);
-  }
-
-  public class ItemBridgeAdapterShadowOverlayWrapper extends android.support.v17.leanback.widget.ItemBridgeAdapter.Wrapper {
-    ctor public ItemBridgeAdapterShadowOverlayWrapper(android.support.v17.leanback.widget.ShadowOverlayHelper);
-    method public android.view.View createWrapper(android.view.View);
-    method public void wrap(android.view.View, android.view.View);
-  }
-
-  public class ListRow extends android.support.v17.leanback.widget.Row {
-    ctor public ListRow(android.support.v17.leanback.widget.HeaderItem, android.support.v17.leanback.widget.ObjectAdapter);
-    ctor public ListRow(long, android.support.v17.leanback.widget.HeaderItem, android.support.v17.leanback.widget.ObjectAdapter);
-    ctor public ListRow(android.support.v17.leanback.widget.ObjectAdapter);
-    method public final android.support.v17.leanback.widget.ObjectAdapter getAdapter();
-    method public java.lang.CharSequence getContentDescription();
-    method public void setContentDescription(java.lang.CharSequence);
-  }
-
-  public final class ListRowHoverCardView extends android.widget.LinearLayout {
-    ctor public ListRowHoverCardView(android.content.Context);
-    ctor public ListRowHoverCardView(android.content.Context, android.util.AttributeSet);
-    ctor public ListRowHoverCardView(android.content.Context, android.util.AttributeSet, int);
-    method public final java.lang.CharSequence getDescription();
-    method public final java.lang.CharSequence getTitle();
-    method public final void setDescription(java.lang.CharSequence);
-    method public final void setTitle(java.lang.CharSequence);
-  }
-
-  public class ListRowPresenter extends android.support.v17.leanback.widget.RowPresenter {
-    ctor public ListRowPresenter();
-    ctor public ListRowPresenter(int);
-    ctor public ListRowPresenter(int, boolean);
-    method public final boolean areChildRoundedCornersEnabled();
-    method protected android.support.v17.leanback.widget.RowPresenter.ViewHolder createRowViewHolder(android.view.ViewGroup);
-    method protected android.support.v17.leanback.widget.ShadowOverlayHelper.Options createShadowOverlayOptions();
-    method public final void enableChildRoundedCorners(boolean);
-    method public int getExpandedRowHeight();
-    method public final int getFocusZoomFactor();
-    method public final android.support.v17.leanback.widget.PresenterSelector getHoverCardPresenterSelector();
-    method public int getRecycledPoolSize(android.support.v17.leanback.widget.Presenter);
-    method public int getRowHeight();
-    method public final boolean getShadowEnabled();
-    method public final deprecated int getZoomFactor();
-    method public final boolean isFocusDimmerUsed();
-    method public final boolean isKeepChildForeground();
-    method public boolean isUsingDefaultListSelectEffect();
-    method public final boolean isUsingDefaultSelectEffect();
-    method public boolean isUsingDefaultShadow();
-    method public boolean isUsingZOrder(android.content.Context);
-    method public void setExpandedRowHeight(int);
-    method public final void setHoverCardPresenterSelector(android.support.v17.leanback.widget.PresenterSelector);
-    method public final void setKeepChildForeground(boolean);
-    method public void setNumRows(int);
-    method public void setRecycledPoolSize(android.support.v17.leanback.widget.Presenter, int);
-    method public void setRowHeight(int);
-    method public final void setShadowEnabled(boolean);
-  }
-
-  public static class ListRowPresenter.SelectItemViewHolderTask extends android.support.v17.leanback.widget.Presenter.ViewHolderTask {
-    ctor public ListRowPresenter.SelectItemViewHolderTask(int);
-    method public int getItemPosition();
-    method public android.support.v17.leanback.widget.Presenter.ViewHolderTask getItemTask();
-    method public boolean isSmoothScroll();
-    method public void setItemPosition(int);
-    method public void setItemTask(android.support.v17.leanback.widget.Presenter.ViewHolderTask);
-    method public void setSmoothScroll(boolean);
-  }
-
-  public static class ListRowPresenter.ViewHolder extends android.support.v17.leanback.widget.RowPresenter.ViewHolder {
-    ctor public ListRowPresenter.ViewHolder(android.view.View, android.support.v17.leanback.widget.HorizontalGridView, android.support.v17.leanback.widget.ListRowPresenter);
-    method public final android.support.v17.leanback.widget.ItemBridgeAdapter getBridgeAdapter();
-    method public final android.support.v17.leanback.widget.HorizontalGridView getGridView();
-    method public android.support.v17.leanback.widget.Presenter.ViewHolder getItemViewHolder(int);
-    method public final android.support.v17.leanback.widget.ListRowPresenter getListRowPresenter();
-    method public int getSelectedPosition();
-  }
-
-  public final class ListRowView extends android.widget.LinearLayout {
-    ctor public ListRowView(android.content.Context);
-    ctor public ListRowView(android.content.Context, android.util.AttributeSet);
-    ctor public ListRowView(android.content.Context, android.util.AttributeSet, int);
-    method public android.support.v17.leanback.widget.HorizontalGridView getGridView();
-  }
-
-  public abstract interface MultiActionsProvider {
-    method public abstract android.support.v17.leanback.widget.MultiActionsProvider.MultiAction[] getActions();
-  }
-
-  public static class MultiActionsProvider.MultiAction {
-    ctor public MultiActionsProvider.MultiAction(long);
-    method public android.graphics.drawable.Drawable getCurrentDrawable();
-    method public android.graphics.drawable.Drawable[] getDrawables();
-    method public long getId();
-    method public int getIndex();
-    method public void incrementIndex();
-    method public void setDrawables(android.graphics.drawable.Drawable[]);
-    method public void setIndex(int);
-  }
-
-  public abstract class ObjectAdapter {
-    ctor public ObjectAdapter(android.support.v17.leanback.widget.PresenterSelector);
-    ctor public ObjectAdapter(android.support.v17.leanback.widget.Presenter);
-    ctor public ObjectAdapter();
-    method public abstract java.lang.Object get(int);
-    method public long getId(int);
-    method public final android.support.v17.leanback.widget.Presenter getPresenter(java.lang.Object);
-    method public final android.support.v17.leanback.widget.PresenterSelector getPresenterSelector();
-    method public final boolean hasStableIds();
-    method protected final void notifyChanged();
-    method protected final void notifyItemRangeChanged(int, int);
-    method protected final void notifyItemRangeInserted(int, int);
-    method protected final void notifyItemRangeRemoved(int, int);
-    method protected void onHasStableIdsChanged();
-    method protected void onPresenterSelectorChanged();
-    method public final void registerObserver(android.support.v17.leanback.widget.ObjectAdapter.DataObserver);
-    method public final void setHasStableIds(boolean);
-    method public final void setPresenterSelector(android.support.v17.leanback.widget.PresenterSelector);
-    method public abstract int size();
-    method public final void unregisterAllObservers();
-    method public final void unregisterObserver(android.support.v17.leanback.widget.ObjectAdapter.DataObserver);
-    field public static final int NO_ID = -1; // 0xffffffff
-  }
-
-  public static abstract class ObjectAdapter.DataObserver {
-    ctor public ObjectAdapter.DataObserver();
-    method public void onChanged();
-    method public void onItemRangeChanged(int, int);
-    method public void onItemRangeInserted(int, int);
-    method public void onItemRangeRemoved(int, int);
-  }
-
-  public abstract interface OnActionClickedListener {
-    method public abstract void onActionClicked(android.support.v17.leanback.widget.Action);
-  }
-
-  public abstract interface OnChildLaidOutListener {
-    method public abstract void onChildLaidOut(android.view.ViewGroup, android.view.View, int, long);
-  }
-
-  public abstract deprecated interface OnChildSelectedListener {
-    method public abstract void onChildSelected(android.view.ViewGroup, android.view.View, int, long);
-  }
-
-  public abstract class OnChildViewHolderSelectedListener {
-    ctor public OnChildViewHolderSelectedListener();
-    method public void onChildViewHolderSelected(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder, int, int);
-  }
-
-  public abstract interface OnItemViewClickedListener implements android.support.v17.leanback.widget.BaseOnItemViewClickedListener {
-  }
-
-  public abstract interface OnItemViewSelectedListener implements android.support.v17.leanback.widget.BaseOnItemViewSelectedListener {
-  }
-
-  public class PageRow extends android.support.v17.leanback.widget.Row {
-    ctor public PageRow(android.support.v17.leanback.widget.HeaderItem);
-    method public final boolean isRenderedAsRowView();
-  }
-
-  public class PlaybackControlsRow extends android.support.v17.leanback.widget.Row {
-    ctor public PlaybackControlsRow(java.lang.Object);
-    ctor public PlaybackControlsRow();
-    method public android.support.v17.leanback.widget.Action getActionForKeyCode(int);
-    method public android.support.v17.leanback.widget.Action getActionForKeyCode(android.support.v17.leanback.widget.ObjectAdapter, int);
-    method public int getBufferedProgress();
-    method public int getCurrentTime();
-    method public final android.graphics.drawable.Drawable getImageDrawable();
-    method public final java.lang.Object getItem();
-    method public final android.support.v17.leanback.widget.ObjectAdapter getPrimaryActionsAdapter();
-    method public final android.support.v17.leanback.widget.ObjectAdapter getSecondaryActionsAdapter();
-    method public int getTotalTime();
-    method public void setBufferedProgress(int);
-    method public void setCurrentTime(int);
-    method public final void setImageBitmap(android.content.Context, android.graphics.Bitmap);
-    method public final void setImageDrawable(android.graphics.drawable.Drawable);
-    method public final void setPrimaryActionsAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public final void setSecondaryActionsAdapter(android.support.v17.leanback.widget.ObjectAdapter);
-    method public void setTotalTime(int);
-  }
-
-  public static class PlaybackControlsRow.ClosedCaptioningAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
-    ctor public PlaybackControlsRow.ClosedCaptioningAction(android.content.Context);
-    ctor public PlaybackControlsRow.ClosedCaptioningAction(android.content.Context, int);
-    field public static int OFF;
-    field public static int ON;
-  }
-
-  public static class PlaybackControlsRow.FastForwardAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
-    ctor public PlaybackControlsRow.FastForwardAction(android.content.Context);
-    ctor public PlaybackControlsRow.FastForwardAction(android.content.Context, int);
-  }
-
-  public static class PlaybackControlsRow.HighQualityAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
-    ctor public PlaybackControlsRow.HighQualityAction(android.content.Context);
-    ctor public PlaybackControlsRow.HighQualityAction(android.content.Context, int);
-    field public static int OFF;
-    field public static int ON;
-  }
-
-  public static class PlaybackControlsRow.MoreActions extends android.support.v17.leanback.widget.Action {
-    ctor public PlaybackControlsRow.MoreActions(android.content.Context);
-  }
-
-  public static abstract class PlaybackControlsRow.MultiAction extends android.support.v17.leanback.widget.Action {
-    ctor public PlaybackControlsRow.MultiAction(int);
-    method public int getActionCount();
-    method public android.graphics.drawable.Drawable getDrawable(int);
-    method public int getIndex();
-    method public java.lang.String getLabel(int);
-    method public java.lang.String getSecondaryLabel(int);
-    method public void nextIndex();
-    method public void setDrawables(android.graphics.drawable.Drawable[]);
-    method public void setIndex(int);
-    method public void setLabels(java.lang.String[]);
-    method public void setSecondaryLabels(java.lang.String[]);
-  }
-
-  public static class PlaybackControlsRow.PictureInPictureAction extends android.support.v17.leanback.widget.Action {
-    ctor public PlaybackControlsRow.PictureInPictureAction(android.content.Context);
-  }
-
-  public static class PlaybackControlsRow.PlayPauseAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
-    ctor public PlaybackControlsRow.PlayPauseAction(android.content.Context);
-    field public static int PAUSE;
-    field public static int PLAY;
-  }
-
-  public static class PlaybackControlsRow.RepeatAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
-    ctor public PlaybackControlsRow.RepeatAction(android.content.Context);
-    ctor public PlaybackControlsRow.RepeatAction(android.content.Context, int);
-    ctor public PlaybackControlsRow.RepeatAction(android.content.Context, int, int);
-    field public static int ALL;
-    field public static int NONE;
-    field public static int ONE;
-  }
-
-  public static class PlaybackControlsRow.RewindAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
-    ctor public PlaybackControlsRow.RewindAction(android.content.Context);
-    ctor public PlaybackControlsRow.RewindAction(android.content.Context, int);
-  }
-
-  public static class PlaybackControlsRow.ShuffleAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
-    ctor public PlaybackControlsRow.ShuffleAction(android.content.Context);
-    ctor public PlaybackControlsRow.ShuffleAction(android.content.Context, int);
-    field public static int OFF;
-    field public static int ON;
-  }
-
-  public static class PlaybackControlsRow.SkipNextAction extends android.support.v17.leanback.widget.Action {
-    ctor public PlaybackControlsRow.SkipNextAction(android.content.Context);
-  }
-
-  public static class PlaybackControlsRow.SkipPreviousAction extends android.support.v17.leanback.widget.Action {
-    ctor public PlaybackControlsRow.SkipPreviousAction(android.content.Context);
-  }
-
-  public static abstract class PlaybackControlsRow.ThumbsAction extends android.support.v17.leanback.widget.PlaybackControlsRow.MultiAction {
-    ctor public PlaybackControlsRow.ThumbsAction(int, android.content.Context, int, int);
-    field public static int OUTLINE;
-    field public static int SOLID;
-  }
-
-  public static class PlaybackControlsRow.ThumbsDownAction extends android.support.v17.leanback.widget.PlaybackControlsRow.ThumbsAction {
-    ctor public PlaybackControlsRow.ThumbsDownAction(android.content.Context);
-  }
-
-  public static class PlaybackControlsRow.ThumbsUpAction extends android.support.v17.leanback.widget.PlaybackControlsRow.ThumbsAction {
-    ctor public PlaybackControlsRow.ThumbsUpAction(android.content.Context);
-  }
-
-  public class PlaybackControlsRowPresenter extends android.support.v17.leanback.widget.RowPresenter {
-    ctor public PlaybackControlsRowPresenter(android.support.v17.leanback.widget.Presenter);
-    ctor public PlaybackControlsRowPresenter();
-    method public boolean areSecondaryActionsHidden();
-    method protected android.support.v17.leanback.widget.RowPresenter.ViewHolder createRowViewHolder(android.view.ViewGroup);
-    method public int getBackgroundColor();
-    method public android.support.v17.leanback.widget.OnActionClickedListener getOnActionClickedListener();
-    method public int getProgressColor();
-    method public void setBackgroundColor(int);
-    method public void setOnActionClickedListener(android.support.v17.leanback.widget.OnActionClickedListener);
-    method public void setProgressColor(int);
-    method public void setSecondaryActionsHidden(boolean);
-    method public void showBottomSpace(android.support.v17.leanback.widget.PlaybackControlsRowPresenter.ViewHolder, boolean);
-    method public void showPrimaryActions(android.support.v17.leanback.widget.PlaybackControlsRowPresenter.ViewHolder);
-  }
-
-  public class PlaybackControlsRowPresenter.ViewHolder extends android.support.v17.leanback.widget.RowPresenter.ViewHolder {
-    field public final android.support.v17.leanback.widget.Presenter.ViewHolder mDescriptionViewHolder;
-  }
-
-  public abstract class Presenter implements android.support.v17.leanback.widget.FacetProvider {
-    ctor public Presenter();
-    method protected static void cancelAnimationsRecursive(android.view.View);
-    method public final java.lang.Object getFacet(java.lang.Class<?>);
-    method public abstract void onBindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object);
-    method public abstract android.support.v17.leanback.widget.Presenter.ViewHolder onCreateViewHolder(android.view.ViewGroup);
-    method public abstract void onUnbindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public void onViewAttachedToWindow(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public void onViewDetachedFromWindow(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public final void setFacet(java.lang.Class<?>, java.lang.Object);
-    method public void setOnClickListener(android.support.v17.leanback.widget.Presenter.ViewHolder, android.view.View.OnClickListener);
-  }
-
-  public static class Presenter.ViewHolder implements android.support.v17.leanback.widget.FacetProvider {
-    ctor public Presenter.ViewHolder(android.view.View);
-    method public final java.lang.Object getFacet(java.lang.Class<?>);
-    method public final void setFacet(java.lang.Class<?>, java.lang.Object);
-    field public final android.view.View view;
-  }
-
-  public static abstract class Presenter.ViewHolderTask {
-    ctor public Presenter.ViewHolderTask();
-    method public void run(android.support.v17.leanback.widget.Presenter.ViewHolder);
-  }
-
-  public abstract class PresenterSelector {
-    ctor public PresenterSelector();
-    method public abstract android.support.v17.leanback.widget.Presenter getPresenter(java.lang.Object);
-    method public android.support.v17.leanback.widget.Presenter[] getPresenters();
-  }
-
-  public abstract class PresenterSwitcher {
-    ctor public PresenterSwitcher();
-    method public void clear();
-    method public final android.view.ViewGroup getParentViewGroup();
-    method public void init(android.view.ViewGroup, android.support.v17.leanback.widget.PresenterSelector);
-    method protected abstract void insertView(android.view.View);
-    method protected void onViewSelected(android.view.View);
-    method public void select(java.lang.Object);
-    method protected void showView(android.view.View, boolean);
-    method public void unselect();
-  }
-
-  public class Row {
-    ctor public Row(long, android.support.v17.leanback.widget.HeaderItem);
-    ctor public Row(android.support.v17.leanback.widget.HeaderItem);
-    ctor public Row();
-    method public final android.support.v17.leanback.widget.HeaderItem getHeaderItem();
-    method public final long getId();
-    method public boolean isRenderedAsRowView();
-    method public final void setHeaderItem(android.support.v17.leanback.widget.HeaderItem);
-    method public final void setId(long);
-  }
-
-  public class RowHeaderPresenter extends android.support.v17.leanback.widget.Presenter {
-    ctor public RowHeaderPresenter();
-    method protected static float getFontDescent(android.widget.TextView, android.graphics.Paint);
-    method public int getSpaceUnderBaseline(android.support.v17.leanback.widget.RowHeaderPresenter.ViewHolder);
-    method public boolean isNullItemVisibilityGone();
-    method public void onBindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object);
-    method public android.support.v17.leanback.widget.Presenter.ViewHolder onCreateViewHolder(android.view.ViewGroup);
-    method protected void onSelectLevelChanged(android.support.v17.leanback.widget.RowHeaderPresenter.ViewHolder);
-    method public void onUnbindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public void setNullItemVisibilityGone(boolean);
-    method public final void setSelectLevel(android.support.v17.leanback.widget.RowHeaderPresenter.ViewHolder, float);
-  }
-
-  public static class RowHeaderPresenter.ViewHolder extends android.support.v17.leanback.widget.Presenter.ViewHolder {
-    ctor public RowHeaderPresenter.ViewHolder(android.view.View);
-    method public final float getSelectLevel();
-  }
-
-  public final class RowHeaderView extends android.widget.TextView {
-    ctor public RowHeaderView(android.content.Context);
-    ctor public RowHeaderView(android.content.Context, android.util.AttributeSet);
-    ctor public RowHeaderView(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public abstract class RowPresenter extends android.support.v17.leanback.widget.Presenter {
-    ctor public RowPresenter();
-    method protected abstract android.support.v17.leanback.widget.RowPresenter.ViewHolder createRowViewHolder(android.view.ViewGroup);
-    method protected void dispatchItemSelectedListener(android.support.v17.leanback.widget.RowPresenter.ViewHolder, boolean);
-    method public void freeze(android.support.v17.leanback.widget.RowPresenter.ViewHolder, boolean);
-    method public final android.support.v17.leanback.widget.RowHeaderPresenter getHeaderPresenter();
-    method public final android.support.v17.leanback.widget.RowPresenter.ViewHolder getRowViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public final boolean getSelectEffectEnabled();
-    method public final float getSelectLevel(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public final int getSyncActivatePolicy();
-    method protected void initializeRowViewHolder(android.support.v17.leanback.widget.RowPresenter.ViewHolder);
-    method protected boolean isClippingChildren();
-    method public boolean isUsingDefaultSelectEffect();
-    method protected void onBindRowViewHolder(android.support.v17.leanback.widget.RowPresenter.ViewHolder, java.lang.Object);
-    method public final void onBindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object);
-    method public final android.support.v17.leanback.widget.Presenter.ViewHolder onCreateViewHolder(android.view.ViewGroup);
-    method protected void onRowViewAttachedToWindow(android.support.v17.leanback.widget.RowPresenter.ViewHolder);
-    method protected void onRowViewDetachedFromWindow(android.support.v17.leanback.widget.RowPresenter.ViewHolder);
-    method protected void onRowViewExpanded(android.support.v17.leanback.widget.RowPresenter.ViewHolder, boolean);
-    method protected void onRowViewSelected(android.support.v17.leanback.widget.RowPresenter.ViewHolder, boolean);
-    method protected void onSelectLevelChanged(android.support.v17.leanback.widget.RowPresenter.ViewHolder);
-    method protected void onUnbindRowViewHolder(android.support.v17.leanback.widget.RowPresenter.ViewHolder);
-    method public final void onUnbindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public final void onViewAttachedToWindow(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public final void onViewDetachedFromWindow(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public void setEntranceTransitionState(android.support.v17.leanback.widget.RowPresenter.ViewHolder, boolean);
-    method public final void setHeaderPresenter(android.support.v17.leanback.widget.RowHeaderPresenter);
-    method public final void setRowViewExpanded(android.support.v17.leanback.widget.Presenter.ViewHolder, boolean);
-    method public final void setRowViewSelected(android.support.v17.leanback.widget.Presenter.ViewHolder, boolean);
-    method public final void setSelectEffectEnabled(boolean);
-    method public final void setSelectLevel(android.support.v17.leanback.widget.Presenter.ViewHolder, float);
-    method public final void setSyncActivatePolicy(int);
-    field public static final int SYNC_ACTIVATED_CUSTOM = 0; // 0x0
-    field public static final int SYNC_ACTIVATED_TO_EXPANDED = 1; // 0x1
-    field public static final int SYNC_ACTIVATED_TO_EXPANDED_AND_SELECTED = 3; // 0x3
-    field public static final int SYNC_ACTIVATED_TO_SELECTED = 2; // 0x2
-  }
-
-  public static class RowPresenter.ViewHolder extends android.support.v17.leanback.widget.Presenter.ViewHolder {
-    ctor public RowPresenter.ViewHolder(android.view.View);
-    method public final android.support.v17.leanback.widget.RowHeaderPresenter.ViewHolder getHeaderViewHolder();
-    method public final android.support.v17.leanback.widget.BaseOnItemViewClickedListener getOnItemViewClickedListener();
-    method public final android.support.v17.leanback.widget.BaseOnItemViewSelectedListener getOnItemViewSelectedListener();
-    method public android.view.View.OnKeyListener getOnKeyListener();
-    method public final android.support.v17.leanback.widget.Row getRow();
-    method public final java.lang.Object getRowObject();
-    method public final float getSelectLevel();
-    method public final boolean isExpanded();
-    method public final boolean isSelected();
-    method public final void setActivated(boolean);
-    method public final void setOnItemViewClickedListener(android.support.v17.leanback.widget.BaseOnItemViewClickedListener);
-    method public final void setOnItemViewSelectedListener(android.support.v17.leanback.widget.BaseOnItemViewSelectedListener);
-    method public void setOnKeyListener(android.view.View.OnKeyListener);
-    method public final void syncActivatedStatus(android.view.View);
-    field protected final android.support.v17.leanback.graphics.ColorOverlayDimmer mColorDimmer;
-  }
-
-  public class SearchBar extends android.widget.RelativeLayout {
-    ctor public SearchBar(android.content.Context);
-    ctor public SearchBar(android.content.Context, android.util.AttributeSet);
-    ctor public SearchBar(android.content.Context, android.util.AttributeSet, int);
-    method public void displayCompletions(java.util.List<java.lang.String>);
-    method public void displayCompletions(android.view.inputmethod.CompletionInfo[]);
-    method public android.graphics.drawable.Drawable getBadgeDrawable();
-    method public java.lang.CharSequence getHint();
-    method public java.lang.String getTitle();
-    method public boolean isRecognizing();
-    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
-    method public void setPermissionListener(android.support.v17.leanback.widget.SearchBar.SearchBarPermissionListener);
-    method public void setSearchBarListener(android.support.v17.leanback.widget.SearchBar.SearchBarListener);
-    method public void setSearchQuery(java.lang.String);
-    method public void setSpeechRecognitionCallback(android.support.v17.leanback.widget.SpeechRecognitionCallback);
-    method public void setSpeechRecognizer(android.speech.SpeechRecognizer);
-    method public void setTitle(java.lang.String);
-    method public void startRecognition();
-    method public void stopRecognition();
-  }
-
-  public static abstract interface SearchBar.SearchBarListener {
-    method public abstract void onKeyboardDismiss(java.lang.String);
-    method public abstract void onSearchQueryChange(java.lang.String);
-    method public abstract void onSearchQuerySubmit(java.lang.String);
-  }
-
-  public static abstract interface SearchBar.SearchBarPermissionListener {
-    method public abstract void requestAudioPermission();
-  }
-
-  public class SearchEditText extends android.support.v17.leanback.widget.StreamingTextView {
-    ctor public SearchEditText(android.content.Context);
-    ctor public SearchEditText(android.content.Context, android.util.AttributeSet);
-    ctor public SearchEditText(android.content.Context, android.util.AttributeSet, int);
-    method public void setOnKeyboardDismissListener(android.support.v17.leanback.widget.SearchEditText.OnKeyboardDismissListener);
-  }
-
-  public static abstract interface SearchEditText.OnKeyboardDismissListener {
-    method public abstract void onKeyboardDismiss();
-  }
-
-  public class SearchOrbView extends android.widget.FrameLayout implements android.view.View.OnClickListener {
-    ctor public SearchOrbView(android.content.Context);
-    ctor public SearchOrbView(android.content.Context, android.util.AttributeSet);
-    ctor public SearchOrbView(android.content.Context, android.util.AttributeSet, int);
-    method public void enableOrbColorAnimation(boolean);
-    method public int getOrbColor();
-    method public android.support.v17.leanback.widget.SearchOrbView.Colors getOrbColors();
-    method public android.graphics.drawable.Drawable getOrbIcon();
-    method public void onClick(android.view.View);
-    method public void setOnOrbClickedListener(android.view.View.OnClickListener);
-    method public void setOrbColor(int);
-    method public deprecated void setOrbColor(int, int);
-    method public void setOrbColors(android.support.v17.leanback.widget.SearchOrbView.Colors);
-    method public void setOrbIcon(android.graphics.drawable.Drawable);
-  }
-
-  public static class SearchOrbView.Colors {
-    ctor public SearchOrbView.Colors(int);
-    ctor public SearchOrbView.Colors(int, int);
-    ctor public SearchOrbView.Colors(int, int, int);
-    method public static int getBrightColor(int);
-    field public int brightColor;
-    field public int color;
-    field public int iconColor;
-  }
-
-  public class SectionRow extends android.support.v17.leanback.widget.Row {
-    ctor public SectionRow(android.support.v17.leanback.widget.HeaderItem);
-    ctor public SectionRow(long, java.lang.String);
-    ctor public SectionRow(java.lang.String);
-    method public final boolean isRenderedAsRowView();
-  }
-
-  public class ShadowOverlayContainer extends android.widget.FrameLayout {
-    ctor public ShadowOverlayContainer(android.content.Context);
-    ctor public ShadowOverlayContainer(android.content.Context, android.util.AttributeSet);
-    ctor public ShadowOverlayContainer(android.content.Context, android.util.AttributeSet, int);
-    method public int getShadowType();
-    method public android.view.View getWrappedView();
-    method public deprecated void initialize(boolean, boolean);
-    method public deprecated void initialize(boolean, boolean, boolean);
-    method public static void prepareParentForShadow(android.view.ViewGroup);
-    method public void setOverlayColor(int);
-    method public void setShadowFocusLevel(float);
-    method public static boolean supportsDynamicShadow();
-    method public static boolean supportsShadow();
-    method public void useDynamicShadow();
-    method public void useDynamicShadow(float, float);
-    method public void useStaticShadow();
-    method public void wrap(android.view.View);
-    field public static final int SHADOW_DYNAMIC = 3; // 0x3
-    field public static final int SHADOW_NONE = 1; // 0x1
-    field public static final int SHADOW_STATIC = 2; // 0x2
-  }
-
-  public final class ShadowOverlayHelper {
-    method public android.support.v17.leanback.widget.ShadowOverlayContainer createShadowOverlayContainer(android.content.Context);
-    method public int getShadowType();
-    method public boolean needsOverlay();
-    method public boolean needsRoundedCorner();
-    method public boolean needsWrapper();
-    method public void onViewCreated(android.view.View);
-    method public void prepareParentForShadow(android.view.ViewGroup);
-    method public static void setNoneWrapperOverlayColor(android.view.View, int);
-    method public static void setNoneWrapperShadowFocusLevel(android.view.View, float);
-    method public void setOverlayColor(android.view.View, int);
-    method public void setShadowFocusLevel(android.view.View, float);
-    method public static boolean supportsDynamicShadow();
-    method public static boolean supportsForeground();
-    method public static boolean supportsRoundedCorner();
-    method public static boolean supportsShadow();
-    field public static final int SHADOW_DYNAMIC = 3; // 0x3
-    field public static final int SHADOW_NONE = 1; // 0x1
-    field public static final int SHADOW_STATIC = 2; // 0x2
-  }
-
-  public static final class ShadowOverlayHelper.Builder {
-    ctor public ShadowOverlayHelper.Builder();
-    method public android.support.v17.leanback.widget.ShadowOverlayHelper build(android.content.Context);
-    method public android.support.v17.leanback.widget.ShadowOverlayHelper.Builder keepForegroundDrawable(boolean);
-    method public android.support.v17.leanback.widget.ShadowOverlayHelper.Builder needsOverlay(boolean);
-    method public android.support.v17.leanback.widget.ShadowOverlayHelper.Builder needsRoundedCorner(boolean);
-    method public android.support.v17.leanback.widget.ShadowOverlayHelper.Builder needsShadow(boolean);
-    method public android.support.v17.leanback.widget.ShadowOverlayHelper.Builder options(android.support.v17.leanback.widget.ShadowOverlayHelper.Options);
-    method public android.support.v17.leanback.widget.ShadowOverlayHelper.Builder preferZOrder(boolean);
-  }
-
-  public static final class ShadowOverlayHelper.Options {
-    ctor public ShadowOverlayHelper.Options();
-    method public android.support.v17.leanback.widget.ShadowOverlayHelper.Options dynamicShadowZ(float, float);
-    method public final float getDynamicShadowFocusedZ();
-    method public final float getDynamicShadowUnfocusedZ();
-    method public final int getRoundedCornerRadius();
-    method public android.support.v17.leanback.widget.ShadowOverlayHelper.Options roundedCornerRadius(int);
-    field public static final android.support.v17.leanback.widget.ShadowOverlayHelper.Options DEFAULT;
-  }
-
-  public final class SinglePresenterSelector extends android.support.v17.leanback.widget.PresenterSelector {
-    ctor public SinglePresenterSelector(android.support.v17.leanback.widget.Presenter);
-    method public android.support.v17.leanback.widget.Presenter getPresenter(java.lang.Object);
-  }
-
-  public class SparseArrayObjectAdapter extends android.support.v17.leanback.widget.ObjectAdapter {
-    ctor public SparseArrayObjectAdapter(android.support.v17.leanback.widget.PresenterSelector);
-    ctor public SparseArrayObjectAdapter(android.support.v17.leanback.widget.Presenter);
-    ctor public SparseArrayObjectAdapter();
-    method public void clear(int);
-    method public void clear();
-    method public java.lang.Object get(int);
-    method public int indexOf(java.lang.Object);
-    method public int indexOf(int);
-    method public java.lang.Object lookup(int);
-    method public void notifyArrayItemRangeChanged(int, int);
-    method public void set(int, java.lang.Object);
-    method public int size();
-  }
-
-  public class SpeechOrbView extends android.support.v17.leanback.widget.SearchOrbView {
-    ctor public SpeechOrbView(android.content.Context);
-    ctor public SpeechOrbView(android.content.Context, android.util.AttributeSet);
-    ctor public SpeechOrbView(android.content.Context, android.util.AttributeSet, int);
-    method public void setSoundLevel(int);
-    method public void showListening();
-    method public void showNotListening();
-  }
-
-  public abstract interface SpeechRecognitionCallback {
-    method public abstract void recognizeSpeech();
-  }
-
-   class StreamingTextView extends android.widget.EditText {
-    ctor public StreamingTextView(android.content.Context, android.util.AttributeSet);
-    ctor public StreamingTextView(android.content.Context, android.util.AttributeSet, int);
-    method public static boolean isLayoutRtl(android.view.View);
-    method public void reset();
-    method public void setFinalRecognizedText(java.lang.CharSequence);
-    method public void updateRecognizedText(java.lang.String, java.lang.String);
-    method public void updateRecognizedText(java.lang.String, java.util.List<java.lang.Float>);
-  }
-
-  public class TitleHelper {
-    ctor public TitleHelper(android.view.ViewGroup, android.view.View);
-    method public android.support.v17.leanback.widget.BrowseFrameLayout.OnFocusSearchListener getOnFocusSearchListener();
-    method public android.view.ViewGroup getSceneRoot();
-    method public android.view.View getTitleView();
-    method public void showTitle(boolean);
-  }
-
-  public class TitleView extends android.widget.FrameLayout implements android.support.v17.leanback.widget.TitleViewAdapter.Provider {
-    ctor public TitleView(android.content.Context);
-    ctor public TitleView(android.content.Context, android.util.AttributeSet);
-    ctor public TitleView(android.content.Context, android.util.AttributeSet, int);
-    method public void enableAnimation(boolean);
-    method public android.graphics.drawable.Drawable getBadgeDrawable();
-    method public android.support.v17.leanback.widget.SearchOrbView.Colors getSearchAffordanceColors();
-    method public android.view.View getSearchAffordanceView();
-    method public java.lang.CharSequence getTitle();
-    method public android.support.v17.leanback.widget.TitleViewAdapter getTitleViewAdapter();
-    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
-    method public void setOnSearchClickedListener(android.view.View.OnClickListener);
-    method public void setSearchAffordanceColors(android.support.v17.leanback.widget.SearchOrbView.Colors);
-    method public void setTitle(java.lang.CharSequence);
-    method public void updateComponentsVisibility(int);
-  }
-
-  public abstract class TitleViewAdapter {
-    ctor public TitleViewAdapter();
-    method public android.graphics.drawable.Drawable getBadgeDrawable();
-    method public android.support.v17.leanback.widget.SearchOrbView.Colors getSearchAffordanceColors();
-    method public abstract android.view.View getSearchAffordanceView();
-    method public java.lang.CharSequence getTitle();
-    method public void setAnimationEnabled(boolean);
-    method public void setBadgeDrawable(android.graphics.drawable.Drawable);
-    method public void setOnSearchClickedListener(android.view.View.OnClickListener);
-    method public void setSearchAffordanceColors(android.support.v17.leanback.widget.SearchOrbView.Colors);
-    method public void setTitle(java.lang.CharSequence);
-    method public void updateComponentsVisibility(int);
-    field public static final int BRANDING_VIEW_VISIBLE = 2; // 0x2
-    field public static final int FULL_VIEW_VISIBLE = 6; // 0x6
-    field public static final int SEARCH_VIEW_VISIBLE = 4; // 0x4
-  }
-
-  public static abstract interface TitleViewAdapter.Provider {
-    method public abstract android.support.v17.leanback.widget.TitleViewAdapter getTitleViewAdapter();
-  }
-
-  public class VerticalGridPresenter extends android.support.v17.leanback.widget.Presenter {
-    ctor public VerticalGridPresenter();
-    ctor public VerticalGridPresenter(int);
-    ctor public VerticalGridPresenter(int, boolean);
-    method public final boolean areChildRoundedCornersEnabled();
-    method protected android.support.v17.leanback.widget.VerticalGridPresenter.ViewHolder createGridViewHolder(android.view.ViewGroup);
-    method protected android.support.v17.leanback.widget.ShadowOverlayHelper.Options createShadowOverlayOptions();
-    method public final void enableChildRoundedCorners(boolean);
-    method public final int getFocusZoomFactor();
-    method public final boolean getKeepChildForeground();
-    method public int getNumberOfColumns();
-    method public final android.support.v17.leanback.widget.OnItemViewClickedListener getOnItemViewClickedListener();
-    method public final android.support.v17.leanback.widget.OnItemViewSelectedListener getOnItemViewSelectedListener();
-    method public final boolean getShadowEnabled();
-    method protected void initializeGridViewHolder(android.support.v17.leanback.widget.VerticalGridPresenter.ViewHolder);
-    method public final boolean isFocusDimmerUsed();
-    method public boolean isUsingDefaultShadow();
-    method public boolean isUsingZOrder(android.content.Context);
-    method public void onBindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder, java.lang.Object);
-    method public final android.support.v17.leanback.widget.VerticalGridPresenter.ViewHolder onCreateViewHolder(android.view.ViewGroup);
-    method public void onUnbindViewHolder(android.support.v17.leanback.widget.Presenter.ViewHolder);
-    method public void setEntranceTransitionState(android.support.v17.leanback.widget.VerticalGridPresenter.ViewHolder, boolean);
-    method public final void setKeepChildForeground(boolean);
-    method public void setNumberOfColumns(int);
-    method public final void setOnItemViewClickedListener(android.support.v17.leanback.widget.OnItemViewClickedListener);
-    method public final void setOnItemViewSelectedListener(android.support.v17.leanback.widget.OnItemViewSelectedListener);
-    method public final void setShadowEnabled(boolean);
-  }
-
-  public static class VerticalGridPresenter.ViewHolder extends android.support.v17.leanback.widget.Presenter.ViewHolder {
-    ctor public VerticalGridPresenter.ViewHolder(android.support.v17.leanback.widget.VerticalGridView);
-    method public android.support.v17.leanback.widget.VerticalGridView getGridView();
-  }
-
-  public class VerticalGridView extends android.support.v7.widget.RecyclerView {
-    ctor public VerticalGridView(android.content.Context);
-    ctor public VerticalGridView(android.content.Context, android.util.AttributeSet);
-    ctor public VerticalGridView(android.content.Context, android.util.AttributeSet, int);
-    method protected void initAttributes(android.content.Context, android.util.AttributeSet);
-    method public void setColumnWidth(int);
-    method public void setNumColumns(int);
-  }
-
-  public abstract interface ViewHolderTask {
-    method public abstract void run(android.support.v7.widget.RecyclerView.ViewHolder);
-  }
-
-}
-
-package android.support.v17.leanback.widget.picker {
-
-  public class Picker extends android.widget.FrameLayout {
-    ctor public Picker(android.content.Context, android.util.AttributeSet, int);
-    method public void addOnValueChangedListener(android.support.v17.leanback.widget.picker.Picker.PickerValueListener);
-    method public float getActivatedVisibleItemCount();
-    method public android.support.v17.leanback.widget.picker.PickerColumn getColumnAt(int);
-    method public int getColumnsCount();
-    method protected int getPickerItemHeightPixels();
-    method public final int getPickerItemLayoutId();
-    method public final int getPickerItemTextViewId();
-    method public int getSelectedColumn();
-    method public final java.lang.CharSequence getSeparator();
-    method public float getVisibleItemCount();
-    method public void onColumnValueChanged(int, int);
-    method public void removeOnValueChangedListener(android.support.v17.leanback.widget.picker.Picker.PickerValueListener);
-    method public void setActivatedVisibleItemCount(float);
-    method public void setColumnAt(int, android.support.v17.leanback.widget.picker.PickerColumn);
-    method public void setColumnValue(int, int, boolean);
-    method public void setColumns(java.util.List<android.support.v17.leanback.widget.picker.PickerColumn>);
-    method public final void setPickerItemTextViewId(int);
-    method public void setSelectedColumn(int);
-    method public final void setSeparator(java.lang.CharSequence);
-    method public void setVisibleItemCount(float);
-  }
-
-  public static abstract interface Picker.PickerValueListener {
-    method public abstract void onValueChanged(android.support.v17.leanback.widget.picker.Picker, int);
-  }
-
-  public class PickerColumn {
-    ctor public PickerColumn();
-    method public int getCount();
-    method public int getCurrentValue();
-    method public java.lang.CharSequence getLabelFor(int);
-    method public java.lang.String getLabelFormat();
-    method public int getMaxValue();
-    method public int getMinValue();
-    method public java.lang.CharSequence[] getStaticLabels();
-    method public void setCurrentValue(int);
-    method public void setLabelFormat(java.lang.String);
-    method public void setMaxValue(int);
-    method public void setMinValue(int);
-    method public void setStaticLabels(java.lang.CharSequence[]);
-  }
-
-}
-
diff --git a/v17/leanback/api/removed.txt b/v17/leanback/api/removed.txt
deleted file mode 100644
index e69de29..0000000
--- a/v17/leanback/api/removed.txt
+++ /dev/null
diff --git a/v17/leanback/build.gradle b/v17/leanback/build.gradle
index eed7d6b..ce30e5c 100644
--- a/v17/leanback/build.gradle
+++ b/v17/leanback/build.gradle
@@ -5,6 +5,16 @@
 dependencies {
     compile project(':support-v4')
     compile project(':support-recyclerview-v7')
+    androidTestCompile ('com.android.support.test:runner:0.4.1') {
+        exclude module: 'support-annotations'
+    }
+    androidTestCompile ('com.android.support.test.espresso:espresso-core:2.2.1') {
+        exclude module: 'support-annotations'
+    }
+    testCompile 'junit:junit:4.12'
+    androidTestCompile "org.mockito:mockito-core:1.9.5"
+    androidTestCompile "com.google.dexmaker:dexmaker:1.2"
+    androidTestCompile "com.google.dexmaker:dexmaker-mockito:1.2"
 }
 
 android {
@@ -15,6 +25,8 @@
         minSdkVersion 17
         // TODO: get target from branch
         //targetSdkVersion 19
+
+        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
     }
 
     sourceSets {
@@ -25,6 +37,8 @@
 
         androidTest.setRoot('tests')
         androidTest.java.srcDir 'tests/java'
+        androidTest.res.srcDir 'tests/res'
+        androidTest.manifest.srcFile 'tests/AndroidManifest.xml'
     }
 
     compileOptions {
diff --git a/v17/leanback/res/values-af/strings.xml b/v17/leanback/res/values-af/strings.xml
index d591f07..2f2ca18 100644
--- a/v17/leanback/res/values-af/strings.xml
+++ b/v17/leanback/res/values-af/strings.xml
@@ -17,6 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"Navigasiekieslys"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"Soekhandeling"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"Soek"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Praat om te soek"</string>
@@ -52,6 +53,5 @@
     <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
     <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"BEGIN HIER"</string>
-    <!-- no translation found for lb_onboarding_accessibility_next (2918313444257732434) -->
-    <skip />
+    <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Volgende"</string>
 </resources>
diff --git a/v17/leanback/res/values-am/strings.xml b/v17/leanback/res/values-am/strings.xml
index 9fe6963..c4b461a 100644
--- a/v17/leanback/res/values-am/strings.xml
+++ b/v17/leanback/res/values-am/strings.xml
@@ -17,6 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"የዳሰሳ ምናሌ"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"እርምጃ ይፈልጉ"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"ይፈልጉ"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"ለመፈለግ ይናገሩ"</string>
@@ -52,6 +53,5 @@
     <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
     <string name="lb_time_separator" msgid="2763247350845477227">"፦"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"ይጀምሩ"</string>
-    <!-- no translation found for lb_onboarding_accessibility_next (2918313444257732434) -->
-    <skip />
+    <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"ቀጣይ"</string>
 </resources>
diff --git a/v17/leanback/res/values-ar/strings.xml b/v17/leanback/res/values-ar/strings.xml
index f3ac0ed..cda830c 100644
--- a/v17/leanback/res/values-ar/strings.xml
+++ b/v17/leanback/res/values-ar/strings.xml
@@ -17,6 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"قائمة التنقل"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"إجراء البحث"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"بحث"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"التحدث  للبحث"</string>
@@ -52,6 +53,5 @@
     <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
     <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"البدء"</string>
-    <!-- no translation found for lb_onboarding_accessibility_next (2918313444257732434) -->
-    <skip />
+    <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"التالية"</string>
 </resources>
diff --git a/v17/leanback/res/values-az-rAZ/strings.xml b/v17/leanback/res/values-az-rAZ/strings.xml
index 15ddc65..f9f0277 100644
--- a/v17/leanback/res/values-az-rAZ/strings.xml
+++ b/v17/leanback/res/values-az-rAZ/strings.xml
@@ -17,6 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"Naviqasiya menyusu"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"Axtarış Fəaliyyəti"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"Axtarış"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Axtarış üçün danışın"</string>
diff --git a/v17/leanback/res/values-b+sr+Latn/strings.xml b/v17/leanback/res/values-b+sr+Latn/strings.xml
index 9406bb6..5c466fb 100644
--- a/v17/leanback/res/values-b+sr+Latn/strings.xml
+++ b/v17/leanback/res/values-b+sr+Latn/strings.xml
@@ -17,6 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"Meni za navigaciju"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"Radnja pretrage"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"Pretražite"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Govorite da biste pretraživali"</string>
@@ -52,6 +53,5 @@
     <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
     <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"ZAPOČNITE"</string>
-    <!-- no translation found for lb_onboarding_accessibility_next (2918313444257732434) -->
-    <skip />
+    <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Dalje"</string>
 </resources>
diff --git a/v17/leanback/res/values-be-rBY/strings.xml b/v17/leanback/res/values-be-rBY/strings.xml
new file mode 100644
index 0000000..b9e72bb
--- /dev/null
+++ b/v17/leanback/res/values-be-rBY/strings.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+Copyright (C) 2014 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:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"Меню навігацыі"</string>
+    <string name="orb_search_action" msgid="5651268540267663887">"Аперацыя пошуку"</string>
+    <string name="lb_search_bar_hint" msgid="8325490927970116252">"Шукаць"</string>
+    <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Пачніце гаварыць, каб пачаць пошук"</string>
+    <string name="lb_search_bar_hint_with_title" msgid="1627103380996590035">"Шукаць у <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
+    <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Пачніце гаварыць, каб пачаць пошук у <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
+    <string name="lb_control_display_fast_forward_multiplier" msgid="4541442045214207774">"%1$dX"</string>
+    <string name="lb_control_display_rewind_multiplier" msgid="3097220783222910245">"%1$dX"</string>
+    <string name="lb_playback_controls_play" msgid="731953341987346903">"Прайграць"</string>
+    <string name="lb_playback_controls_pause" msgid="6189521112079849518">"Прыпыніць"</string>
+    <string name="lb_playback_controls_fast_forward" msgid="8569951318244687220">"Перамотка ўперад"</string>
+    <string name="lb_playback_controls_fast_forward_multiplier" msgid="1058753672110224526">"Перамотка ўперад %1$dX"</string>
+    <string name="lb_playback_controls_rewind" msgid="2227196334132350684">"Перамотка назад"</string>
+    <string name="lb_playback_controls_rewind_multiplier" msgid="1640629531440849942">"Перамотка назад %1$dX"</string>
+    <string name="lb_playback_controls_skip_next" msgid="2946499493161095772">"Перайсці да наступнага элемента"</string>
+    <string name="lb_playback_controls_skip_previous" msgid="2326801832933178348">"Перайсці да папярэдняга элемента"</string>
+    <string name="lb_playback_controls_more_actions" msgid="2330770008796987655">"Дадатковыя дзеянні"</string>
+    <string name="lb_playback_controls_thumb_up" msgid="6530420347129222601">"Зняць адзнаку «Падабаецца»"</string>
+    <string name="lb_playback_controls_thumb_up_outline" msgid="1577637924003500946">"Паставіць адзнаку «Падабаецца»"</string>
+    <string name="lb_playback_controls_thumb_down" msgid="4498041193172964797">"Зняць адзнаку «Не падабаецца»"</string>
+    <string name="lb_playback_controls_thumb_down_outline" msgid="2936020280629424365">"Паставіць адзнаку «Не падабаецца»"</string>
+    <string name="lb_playback_controls_repeat_none" msgid="87476947476529036">"Не паўтараць нічога"</string>
+    <string name="lb_playback_controls_repeat_all" msgid="6730354406289599000">"Паўтарыць усё"</string>
+    <string name="lb_playback_controls_repeat_one" msgid="3285202316452203619">"Паўтарыць адзін элемент"</string>
+    <string name="lb_playback_controls_shuffle_enable" msgid="1099874107835264529">"Уключыць выпадковы парадак"</string>
+    <string name="lb_playback_controls_shuffle_disable" msgid="8388150597335115226">"Адключыць выпадковы парадак"</string>
+    <string name="lb_playback_controls_high_quality_enable" msgid="202415780019335254">"Уключыць высокую якасць"</string>
+    <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Адключыць высокую якасць"</string>
+    <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Уключыць схаваныя цітры"</string>
+    <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Адключыць схаваныя цітры"</string>
+    <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Калі ласка, увядзіце выяву ў рэжыме Выяў"</string>
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Завяршыць"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Далей"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
+    <string name="lb_onboarding_get_started" msgid="6961440391306351139">"ПАЧАЦЬ"</string>
+    <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Далей"</string>
+</resources>
diff --git a/v17/leanback/res/values-bg/strings.xml b/v17/leanback/res/values-bg/strings.xml
index a697946..642abc5 100644
--- a/v17/leanback/res/values-bg/strings.xml
+++ b/v17/leanback/res/values-bg/strings.xml
@@ -17,6 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"Меню за навигация"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"Действие за търсене"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"Търсете"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Говорете, за да търсите"</string>
@@ -52,6 +53,5 @@
     <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
     <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"ПЪРВИ СТЪПКИ"</string>
-    <!-- no translation found for lb_onboarding_accessibility_next (2918313444257732434) -->
-    <skip />
+    <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Напред"</string>
 </resources>
diff --git a/v17/leanback/res/values-bn-rBD/strings.xml b/v17/leanback/res/values-bn-rBD/strings.xml
index 47d6e4d..be98f58 100644
--- a/v17/leanback/res/values-bn-rBD/strings.xml
+++ b/v17/leanback/res/values-bn-rBD/strings.xml
@@ -17,6 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"নেভিগেশান মেনু"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"অনুসন্ধান অ্যাকশন"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"অনুসন্ধান"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"অনুসন্ধান করতে বলুন"</string>
@@ -52,6 +53,5 @@
     <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
     <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"শুরু করা যাক"</string>
-    <!-- no translation found for lb_onboarding_accessibility_next (2918313444257732434) -->
-    <skip />
+    <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"পরবর্তী"</string>
 </resources>
diff --git a/v17/leanback/res/values-bs-rBA/strings.xml b/v17/leanback/res/values-bs-rBA/strings.xml
index ae7df6d..cdfe434 100644
--- a/v17/leanback/res/values-bs-rBA/strings.xml
+++ b/v17/leanback/res/values-bs-rBA/strings.xml
@@ -17,74 +17,41 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- no translation found for orb_search_action (5651268540267663887) -->
-    <skip />
-    <!-- no translation found for lb_search_bar_hint (8325490927970116252) -->
-    <skip />
-    <!-- no translation found for lb_search_bar_hint_speech (5511270823320183816) -->
-    <skip />
-    <!-- no translation found for lb_search_bar_hint_with_title (1627103380996590035) -->
-    <skip />
-    <!-- no translation found for lb_search_bar_hint_with_title_speech (2712734639766312034) -->
-    <skip />
-    <!-- no translation found for lb_control_display_fast_forward_multiplier (4541442045214207774) -->
-    <skip />
-    <!-- no translation found for lb_control_display_rewind_multiplier (3097220783222910245) -->
-    <skip />
-    <!-- no translation found for lb_playback_controls_play (731953341987346903) -->
-    <skip />
-    <!-- no translation found for lb_playback_controls_pause (6189521112079849518) -->
-    <skip />
-    <!-- no translation found for lb_playback_controls_fast_forward (8569951318244687220) -->
-    <skip />
-    <!-- no translation found for lb_playback_controls_fast_forward_multiplier (1058753672110224526) -->
-    <skip />
-    <!-- no translation found for lb_playback_controls_rewind (2227196334132350684) -->
-    <skip />
-    <!-- no translation found for lb_playback_controls_rewind_multiplier (1640629531440849942) -->
-    <skip />
-    <!-- no translation found for lb_playback_controls_skip_next (2946499493161095772) -->
-    <skip />
-    <!-- no translation found for lb_playback_controls_skip_previous (2326801832933178348) -->
-    <skip />
-    <!-- no translation found for lb_playback_controls_more_actions (2330770008796987655) -->
-    <skip />
-    <!-- no translation found for lb_playback_controls_thumb_up (6530420347129222601) -->
-    <skip />
-    <!-- no translation found for lb_playback_controls_thumb_up_outline (1577637924003500946) -->
-    <skip />
-    <!-- no translation found for lb_playback_controls_thumb_down (4498041193172964797) -->
-    <skip />
-    <!-- no translation found for lb_playback_controls_thumb_down_outline (2936020280629424365) -->
-    <skip />
-    <!-- no translation found for lb_playback_controls_repeat_none (87476947476529036) -->
-    <skip />
-    <!-- no translation found for lb_playback_controls_repeat_all (6730354406289599000) -->
-    <skip />
-    <!-- no translation found for lb_playback_controls_repeat_one (3285202316452203619) -->
-    <skip />
-    <!-- no translation found for lb_playback_controls_shuffle_enable (1099874107835264529) -->
-    <skip />
-    <!-- no translation found for lb_playback_controls_shuffle_disable (8388150597335115226) -->
-    <skip />
-    <!-- no translation found for lb_playback_controls_high_quality_enable (202415780019335254) -->
-    <skip />
-    <!-- no translation found for lb_playback_controls_high_quality_disable (8637371582779057866) -->
-    <skip />
-    <!-- no translation found for lb_playback_controls_closed_captioning_enable (2429655367176440226) -->
-    <skip />
-    <!-- no translation found for lb_playback_controls_closed_captioning_disable (6133362019475930048) -->
-    <skip />
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"Meni za navigaciju"</string>
+    <string name="orb_search_action" msgid="5651268540267663887">"Pretraživanje"</string>
+    <string name="lb_search_bar_hint" msgid="8325490927970116252">"Pretraga"</string>
+    <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Kažite nešto da pokrenete pretragu"</string>
+    <string name="lb_search_bar_hint_with_title" msgid="1627103380996590035">"Pretraži <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
+    <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Kažite nešto da pokrenete pretragu <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
+    <string name="lb_control_display_fast_forward_multiplier" msgid="4541442045214207774">"%1$dX"</string>
+    <string name="lb_control_display_rewind_multiplier" msgid="3097220783222910245">"%1$dX"</string>
+    <string name="lb_playback_controls_play" msgid="731953341987346903">"Reproduciraj"</string>
+    <string name="lb_playback_controls_pause" msgid="6189521112079849518">"Pauziraj"</string>
+    <string name="lb_playback_controls_fast_forward" msgid="8569951318244687220">"Ubrzaj"</string>
+    <string name="lb_playback_controls_fast_forward_multiplier" msgid="1058753672110224526">"Ubrzaj %1$dX"</string>
+    <string name="lb_playback_controls_rewind" msgid="2227196334132350684">"Premotaj"</string>
+    <string name="lb_playback_controls_rewind_multiplier" msgid="1640629531440849942">"Premotaj %1$dX"</string>
+    <string name="lb_playback_controls_skip_next" msgid="2946499493161095772">"Preskoči sljedeće"</string>
+    <string name="lb_playback_controls_skip_previous" msgid="2326801832933178348">"Preskoči prethodno"</string>
+    <string name="lb_playback_controls_more_actions" msgid="2330770008796987655">"Više radnji"</string>
+    <string name="lb_playback_controls_thumb_up" msgid="6530420347129222601">"Poništi pozitivnu ocjenu"</string>
+    <string name="lb_playback_controls_thumb_up_outline" msgid="1577637924003500946">"Odaberi pozitivnu ocjenu"</string>
+    <string name="lb_playback_controls_thumb_down" msgid="4498041193172964797">"Poništi negativnu ocjenu"</string>
+    <string name="lb_playback_controls_thumb_down_outline" msgid="2936020280629424365">"Odaberi negativnu ocjenu"</string>
+    <string name="lb_playback_controls_repeat_none" msgid="87476947476529036">"Ne ponavljaj"</string>
+    <string name="lb_playback_controls_repeat_all" msgid="6730354406289599000">"Ponovi sve"</string>
+    <string name="lb_playback_controls_repeat_one" msgid="3285202316452203619">"Ponovi jedno"</string>
+    <string name="lb_playback_controls_shuffle_enable" msgid="1099874107835264529">"Uključi izmiješani redoslijed"</string>
+    <string name="lb_playback_controls_shuffle_disable" msgid="8388150597335115226">"Isključi izmiješani redoslijed"</string>
+    <string name="lb_playback_controls_high_quality_enable" msgid="202415780019335254">"Uključi visoki kvalitet"</string>
+    <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Isključi visoki kvalitet"</string>
+    <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Uključi titlove"</string>
+    <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Isključi titlove"</string>
     <string name="lb_playback_controls_picture_in_picture" msgid="3040035547765350690">"Uđi u način rada Slika u slici"</string>
-    <!-- no translation found for lb_guidedaction_finish_title (4015190340667946245) -->
-    <skip />
-    <!-- no translation found for lb_guidedaction_continue_title (8842094924543063706) -->
-    <skip />
-    <!-- no translation found for lb_date_separator (2440386660906697298) -->
-    <skip />
-    <!-- no translation found for lb_time_separator (2763247350845477227) -->
-    <skip />
+    <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Završiti"</string>
+    <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Nastaviti"</string>
+    <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
+    <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"ZAPOČNITE"</string>
-    <!-- no translation found for lb_onboarding_accessibility_next (2918313444257732434) -->
-    <skip />
+    <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Sljedeća"</string>
 </resources>
diff --git a/v17/leanback/res/values-ca/strings.xml b/v17/leanback/res/values-ca/strings.xml
index 3a25704..5567e23 100644
--- a/v17/leanback/res/values-ca/strings.xml
+++ b/v17/leanback/res/values-ca/strings.xml
@@ -17,6 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"Menú de navegació"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"Acció de cerca"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"Cerca."</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Parla per fer una cerca."</string>
@@ -52,6 +53,5 @@
     <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
     <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"COMENÇA"</string>
-    <!-- no translation found for lb_onboarding_accessibility_next (2918313444257732434) -->
-    <skip />
+    <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Següent"</string>
 </resources>
diff --git a/v17/leanback/res/values-cs/strings.xml b/v17/leanback/res/values-cs/strings.xml
index 32d38d3..a5fbfb5 100644
--- a/v17/leanback/res/values-cs/strings.xml
+++ b/v17/leanback/res/values-cs/strings.xml
@@ -17,6 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"Navigační nabídka"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"Vyhledávání akce"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"Vyhledávání"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Vyhledávejte hlasem"</string>
@@ -52,6 +53,5 @@
     <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
     <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"ZAČÍNÁME"</string>
-    <!-- no translation found for lb_onboarding_accessibility_next (2918313444257732434) -->
-    <skip />
+    <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Další"</string>
 </resources>
diff --git a/v17/leanback/res/values-da/strings.xml b/v17/leanback/res/values-da/strings.xml
index fb08631..76062f5 100644
--- a/v17/leanback/res/values-da/strings.xml
+++ b/v17/leanback/res/values-da/strings.xml
@@ -17,6 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"Navigationsmenu"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"Søg handling"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"Søg"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Tal for at søge"</string>
@@ -52,6 +53,5 @@
     <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
     <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"KOM GODT I GANG"</string>
-    <!-- no translation found for lb_onboarding_accessibility_next (2918313444257732434) -->
-    <skip />
+    <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Næste"</string>
 </resources>
diff --git a/v17/leanback/res/values-de/strings.xml b/v17/leanback/res/values-de/strings.xml
index 4284210..53ad13a 100644
--- a/v17/leanback/res/values-de/strings.xml
+++ b/v17/leanback/res/values-de/strings.xml
@@ -17,6 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"Navigationsmenü"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"Suchvorgang"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"Suchen"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Zum Suchen sprechen"</string>
@@ -52,6 +53,5 @@
     <string name="lb_date_separator" msgid="2440386660906697298">"."</string>
     <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"JETZT STARTEN"</string>
-    <!-- no translation found for lb_onboarding_accessibility_next (2918313444257732434) -->
-    <skip />
+    <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Weiter"</string>
 </resources>
diff --git a/v17/leanback/res/values-el/strings.xml b/v17/leanback/res/values-el/strings.xml
index f153fe8..6dc20ef 100644
--- a/v17/leanback/res/values-el/strings.xml
+++ b/v17/leanback/res/values-el/strings.xml
@@ -17,6 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"Μενού πλοήγησης"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"Ενέργεια αναζήτησης"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"Αναζήτηση"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Μιλήστε για να κάνετε αναζήτηση"</string>
@@ -52,6 +53,5 @@
     <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
     <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"ΕΝΑΡΞΗ"</string>
-    <!-- no translation found for lb_onboarding_accessibility_next (2918313444257732434) -->
-    <skip />
+    <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Επόμενο"</string>
 </resources>
diff --git a/v17/leanback/res/values-en-rAU/strings.xml b/v17/leanback/res/values-en-rAU/strings.xml
index 52b4857..8032f7d 100644
--- a/v17/leanback/res/values-en-rAU/strings.xml
+++ b/v17/leanback/res/values-en-rAU/strings.xml
@@ -17,6 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"Navigation menu"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"Search Action"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"Search"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Speak to search"</string>
@@ -52,6 +53,5 @@
     <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
     <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"GET STARTED"</string>
-    <!-- no translation found for lb_onboarding_accessibility_next (2918313444257732434) -->
-    <skip />
+    <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Next"</string>
 </resources>
diff --git a/v17/leanback/res/values-en-rGB/strings.xml b/v17/leanback/res/values-en-rGB/strings.xml
index 52b4857..8032f7d 100644
--- a/v17/leanback/res/values-en-rGB/strings.xml
+++ b/v17/leanback/res/values-en-rGB/strings.xml
@@ -17,6 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"Navigation menu"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"Search Action"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"Search"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Speak to search"</string>
@@ -52,6 +53,5 @@
     <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
     <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"GET STARTED"</string>
-    <!-- no translation found for lb_onboarding_accessibility_next (2918313444257732434) -->
-    <skip />
+    <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Next"</string>
 </resources>
diff --git a/v17/leanback/res/values-en-rIN/strings.xml b/v17/leanback/res/values-en-rIN/strings.xml
index 52b4857..8032f7d 100644
--- a/v17/leanback/res/values-en-rIN/strings.xml
+++ b/v17/leanback/res/values-en-rIN/strings.xml
@@ -17,6 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"Navigation menu"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"Search Action"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"Search"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Speak to search"</string>
@@ -52,6 +53,5 @@
     <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
     <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"GET STARTED"</string>
-    <!-- no translation found for lb_onboarding_accessibility_next (2918313444257732434) -->
-    <skip />
+    <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Next"</string>
 </resources>
diff --git a/v17/leanback/res/values-es-rUS/strings.xml b/v17/leanback/res/values-es-rUS/strings.xml
index 76f7d0f..8a81040 100644
--- a/v17/leanback/res/values-es-rUS/strings.xml
+++ b/v17/leanback/res/values-es-rUS/strings.xml
@@ -17,6 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"Menú de navegación"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"Acción de búsqueda"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"Búsqueda"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Habla para buscar"</string>
@@ -52,6 +53,5 @@
     <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
     <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"COMENZAR"</string>
-    <!-- no translation found for lb_onboarding_accessibility_next (2918313444257732434) -->
-    <skip />
+    <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Siguiente"</string>
 </resources>
diff --git a/v17/leanback/res/values-es/strings.xml b/v17/leanback/res/values-es/strings.xml
index 09d10f2..59f707b 100644
--- a/v17/leanback/res/values-es/strings.xml
+++ b/v17/leanback/res/values-es/strings.xml
@@ -17,6 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"Menú de navegación"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"Buscar..."</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"Buscar"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Habla para buscar"</string>
diff --git a/v17/leanback/res/values-et-rEE/strings.xml b/v17/leanback/res/values-et-rEE/strings.xml
index 3e08c60..6d6bac8 100644
--- a/v17/leanback/res/values-et-rEE/strings.xml
+++ b/v17/leanback/res/values-et-rEE/strings.xml
@@ -17,6 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"Navigeerimismenüü"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"Otsimistoiming"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"Otsing"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Öelge otsimiseks"</string>
@@ -52,6 +53,5 @@
     <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
     <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"ALUSTAGE"</string>
-    <!-- no translation found for lb_onboarding_accessibility_next (2918313444257732434) -->
-    <skip />
+    <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Järgmine"</string>
 </resources>
diff --git a/v17/leanback/res/values-eu-rES/strings.xml b/v17/leanback/res/values-eu-rES/strings.xml
index 5e89882..98787d4 100644
--- a/v17/leanback/res/values-eu-rES/strings.xml
+++ b/v17/leanback/res/values-eu-rES/strings.xml
@@ -17,6 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"Nabigazio-menua"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"Bilaketa"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"Bilatu"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Esan bilatu nahi duzuna"</string>
@@ -52,6 +53,5 @@
     <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
     <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"LEHEN URRATSAK"</string>
-    <!-- no translation found for lb_onboarding_accessibility_next (2918313444257732434) -->
-    <skip />
+    <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Hurrengoa"</string>
 </resources>
diff --git a/v17/leanback/res/values-fa/strings.xml b/v17/leanback/res/values-fa/strings.xml
index a33c148..3774bd2 100644
--- a/v17/leanback/res/values-fa/strings.xml
+++ b/v17/leanback/res/values-fa/strings.xml
@@ -17,6 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"منوی پیمایش"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"عملکرد جستجو"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"جستجو"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"برای جستجو صحبت کنید"</string>
@@ -52,6 +53,5 @@
     <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
     <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"شروع به‌ کار"</string>
-    <!-- no translation found for lb_onboarding_accessibility_next (2918313444257732434) -->
-    <skip />
+    <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"بعدی"</string>
 </resources>
diff --git a/v17/leanback/res/values-fi/strings.xml b/v17/leanback/res/values-fi/strings.xml
index d0aa555..3444642 100644
--- a/v17/leanback/res/values-fi/strings.xml
+++ b/v17/leanback/res/values-fi/strings.xml
@@ -17,6 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"Navigointivalikko"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"Hakutoiminto"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"Haku"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Tee haku puhumalla"</string>
@@ -52,6 +53,5 @@
     <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
     <string name="lb_time_separator" msgid="2763247350845477227">"."</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"ALOITA"</string>
-    <!-- no translation found for lb_onboarding_accessibility_next (2918313444257732434) -->
-    <skip />
+    <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Seuraava"</string>
 </resources>
diff --git a/v17/leanback/res/values-fr-rCA/strings.xml b/v17/leanback/res/values-fr-rCA/strings.xml
index b39925f..4c8cc19 100644
--- a/v17/leanback/res/values-fr-rCA/strings.xml
+++ b/v17/leanback/res/values-fr-rCA/strings.xml
@@ -17,6 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"Menu de navigation"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"Action de recherche"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"Rechercher"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Énoncez votre recherche"</string>
@@ -52,6 +53,5 @@
     <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
     <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"COMMENCER"</string>
-    <!-- no translation found for lb_onboarding_accessibility_next (2918313444257732434) -->
-    <skip />
+    <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Suivant"</string>
 </resources>
diff --git a/v17/leanback/res/values-fr/strings.xml b/v17/leanback/res/values-fr/strings.xml
index 3cdbf14..9086fa1 100644
--- a/v17/leanback/res/values-fr/strings.xml
+++ b/v17/leanback/res/values-fr/strings.xml
@@ -17,6 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"Menu de navigation"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"Commande de recherche"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"Rechercher"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Énoncer la recherche"</string>
@@ -52,6 +53,5 @@
     <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
     <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"COMMENCER"</string>
-    <!-- no translation found for lb_onboarding_accessibility_next (2918313444257732434) -->
-    <skip />
+    <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Suivant"</string>
 </resources>
diff --git a/v17/leanback/res/values-gl-rES/strings.xml b/v17/leanback/res/values-gl-rES/strings.xml
index 063f909..2d2579b 100644
--- a/v17/leanback/res/values-gl-rES/strings.xml
+++ b/v17/leanback/res/values-gl-rES/strings.xml
@@ -17,6 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"Menú de navegación"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"Acción de busca"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"Buscar"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Fala para efectuar a busca"</string>
@@ -52,6 +53,5 @@
     <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
     <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"INTRODUCIÓN"</string>
-    <!-- no translation found for lb_onboarding_accessibility_next (2918313444257732434) -->
-    <skip />
+    <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Seguinte"</string>
 </resources>
diff --git a/v17/leanback/res/values-gu-rIN/strings.xml b/v17/leanback/res/values-gu-rIN/strings.xml
index c1ba30b..569da29 100644
--- a/v17/leanback/res/values-gu-rIN/strings.xml
+++ b/v17/leanback/res/values-gu-rIN/strings.xml
@@ -17,6 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"નૅવિગેશન મેનૂ"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"શોધ ક્રિયા"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"શોધો"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"શોધવા માટે બોલો"</string>
@@ -52,6 +53,5 @@
     <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
     <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"પ્રારંભ કરો"</string>
-    <!-- no translation found for lb_onboarding_accessibility_next (2918313444257732434) -->
-    <skip />
+    <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"આગલું"</string>
 </resources>
diff --git a/v17/leanback/res/values-hi/strings.xml b/v17/leanback/res/values-hi/strings.xml
index 9432182..1b73165 100644
--- a/v17/leanback/res/values-hi/strings.xml
+++ b/v17/leanback/res/values-hi/strings.xml
@@ -17,6 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"मार्गदर्शक मेनू"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"खोज कार्रवाई"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"खोजें"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"खोजने के लिए बोलें"</string>
diff --git a/v17/leanback/res/values-hr/strings.xml b/v17/leanback/res/values-hr/strings.xml
index d34efc7..73c8dc6 100644
--- a/v17/leanback/res/values-hr/strings.xml
+++ b/v17/leanback/res/values-hr/strings.xml
@@ -17,11 +17,12 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"Navigacijski izbornik"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"Radnja pretraživanja"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"Pretražite"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Izgovorite upit za pretraživanje"</string>
     <string name="lb_search_bar_hint_with_title" msgid="1627103380996590035">"Tražite <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
-    <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Izgovorite upit da pretražite <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
+    <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Izgovorite upit da pretražite uslugu <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
     <string name="lb_control_display_fast_forward_multiplier" msgid="4541442045214207774">"%1$dX"</string>
     <string name="lb_control_display_rewind_multiplier" msgid="3097220783222910245">"%1$dX"</string>
     <string name="lb_playback_controls_play" msgid="731953341987346903">"Reproduciraj"</string>
@@ -52,6 +53,5 @@
     <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
     <string name="lb_time_separator" msgid="2763247350845477227">"."</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"POČETAK"</string>
-    <!-- no translation found for lb_onboarding_accessibility_next (2918313444257732434) -->
-    <skip />
+    <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Dalje"</string>
 </resources>
diff --git a/v17/leanback/res/values-hu/strings.xml b/v17/leanback/res/values-hu/strings.xml
index 7b8d566..f30c4f6 100644
--- a/v17/leanback/res/values-hu/strings.xml
+++ b/v17/leanback/res/values-hu/strings.xml
@@ -17,6 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"Navigációs menü"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"Keresési művelet"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"Keresés"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Beszéljen a keresés indításához"</string>
@@ -52,6 +53,5 @@
     <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
     <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"KEZDŐ LÉPÉSEK"</string>
-    <!-- no translation found for lb_onboarding_accessibility_next (2918313444257732434) -->
-    <skip />
+    <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Következő"</string>
 </resources>
diff --git a/v17/leanback/res/values-hy-rAM/strings.xml b/v17/leanback/res/values-hy-rAM/strings.xml
index e7c4201..edc1f47 100644
--- a/v17/leanback/res/values-hy-rAM/strings.xml
+++ b/v17/leanback/res/values-hy-rAM/strings.xml
@@ -17,6 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"Նավարկման ընտրացանկ"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"Որոնման հրամանը"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"Որոնում"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Խոսեք՝ որոնելու համար"</string>
@@ -52,6 +53,5 @@
     <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
     <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"ՍԿՍԵԼ"</string>
-    <!-- no translation found for lb_onboarding_accessibility_next (2918313444257732434) -->
-    <skip />
+    <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Հաջորդը"</string>
 </resources>
diff --git a/v17/leanback/res/values-in/strings.xml b/v17/leanback/res/values-in/strings.xml
index 14c2438..05e9dc9 100644
--- a/v17/leanback/res/values-in/strings.xml
+++ b/v17/leanback/res/values-in/strings.xml
@@ -17,6 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"Menu navigasi"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"Tindakan Penelusuran"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"Telusuri"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Ucapkan untuk menelusuri"</string>
diff --git a/v17/leanback/res/values-is-rIS/strings.xml b/v17/leanback/res/values-is-rIS/strings.xml
index 33aa91d..84b6430 100644
--- a/v17/leanback/res/values-is-rIS/strings.xml
+++ b/v17/leanback/res/values-is-rIS/strings.xml
@@ -17,8 +17,9 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"Yfirlitsvalmynd"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"Leitaraðgerð"</string>
-    <string name="lb_search_bar_hint" msgid="8325490927970116252">"Leitaðu"</string>
+    <string name="lb_search_bar_hint" msgid="8325490927970116252">"Leita"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Talaðu til að leita"</string>
     <string name="lb_search_bar_hint_with_title" msgid="1627103380996590035">"Leita í <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
     <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Talaðu til að leita í <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
@@ -52,6 +53,5 @@
     <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
     <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"HEFJAST HANDA"</string>
-    <!-- no translation found for lb_onboarding_accessibility_next (2918313444257732434) -->
-    <skip />
+    <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Áfram"</string>
 </resources>
diff --git a/v17/leanback/res/values-it/strings.xml b/v17/leanback/res/values-it/strings.xml
index 72f5644..b0814d0 100644
--- a/v17/leanback/res/values-it/strings.xml
+++ b/v17/leanback/res/values-it/strings.xml
@@ -17,6 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"Menu di navigazione"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"Azione di ricerca"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"Ricerca"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Parla per cercare"</string>
@@ -52,6 +53,5 @@
     <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
     <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"INIZIA"</string>
-    <!-- no translation found for lb_onboarding_accessibility_next (2918313444257732434) -->
-    <skip />
+    <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Avanti"</string>
 </resources>
diff --git a/v17/leanback/res/values-iw/strings.xml b/v17/leanback/res/values-iw/strings.xml
index bbc2fbf..b94c431 100644
--- a/v17/leanback/res/values-iw/strings.xml
+++ b/v17/leanback/res/values-iw/strings.xml
@@ -17,11 +17,12 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"תפריט ניווט"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"פעולת חיפוש"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"חפש"</string>
-    <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"דבר כדי לחפש"</string>
+    <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"דבר בקול כדי לחפש"</string>
     <string name="lb_search_bar_hint_with_title" msgid="1627103380996590035">"חפש את <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
-    <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"דבר כדי לחפש את <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
+    <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"דבר בקול כדי לחפש ב-<xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
     <string name="lb_control_display_fast_forward_multiplier" msgid="4541442045214207774">"‎%1$dX‎‎"</string>
     <string name="lb_control_display_rewind_multiplier" msgid="3097220783222910245">"‎%1$dX‎‎"</string>
     <string name="lb_playback_controls_play" msgid="731953341987346903">"הפעל"</string>
@@ -52,6 +53,5 @@
     <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
     <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"התחל"</string>
-    <!-- no translation found for lb_onboarding_accessibility_next (2918313444257732434) -->
-    <skip />
+    <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"הבא"</string>
 </resources>
diff --git a/v17/leanback/res/values-ja/strings.xml b/v17/leanback/res/values-ja/strings.xml
index 20f7b7b..650f4fd 100644
--- a/v17/leanback/res/values-ja/strings.xml
+++ b/v17/leanback/res/values-ja/strings.xml
@@ -17,6 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"ナビゲーション メニュー"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"検索操作"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"検索"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"音声検索"</string>
@@ -52,6 +53,5 @@
     <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
     <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"使ってみる"</string>
-    <!-- no translation found for lb_onboarding_accessibility_next (2918313444257732434) -->
-    <skip />
+    <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"次へ"</string>
 </resources>
diff --git a/v17/leanback/res/values-ka-rGE/strings.xml b/v17/leanback/res/values-ka-rGE/strings.xml
index 2cbae9d..9962645 100644
--- a/v17/leanback/res/values-ka-rGE/strings.xml
+++ b/v17/leanback/res/values-ka-rGE/strings.xml
@@ -17,6 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"ნავიგაციის მენიუ"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"ძიების მოქმედება"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"ძიება"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"თქვით საძიებო ფრაზა"</string>
@@ -56,6 +57,5 @@
     <string name="lb_date_separator" msgid="2440386660906697298">"."</string>
     <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"დაწყება"</string>
-    <!-- no translation found for lb_onboarding_accessibility_next (2918313444257732434) -->
-    <skip />
+    <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"შემდეგი"</string>
 </resources>
diff --git a/v17/leanback/res/values-kk-rKZ/strings.xml b/v17/leanback/res/values-kk-rKZ/strings.xml
index bb1ad63..6f7faf2 100644
--- a/v17/leanback/res/values-kk-rKZ/strings.xml
+++ b/v17/leanback/res/values-kk-rKZ/strings.xml
@@ -17,6 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"Навигация мәзірі"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"Іздеу әрекеті"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"Іздеу"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Іздеу үшін сөйлеу"</string>
@@ -52,6 +53,5 @@
     <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
     <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"ІСКЕ КІРІСУ"</string>
-    <!-- no translation found for lb_onboarding_accessibility_next (2918313444257732434) -->
-    <skip />
+    <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Келесі"</string>
 </resources>
diff --git a/v17/leanback/res/values-km-rKH/strings.xml b/v17/leanback/res/values-km-rKH/strings.xml
index b1cf179..25abb45 100644
--- a/v17/leanback/res/values-km-rKH/strings.xml
+++ b/v17/leanback/res/values-km-rKH/strings.xml
@@ -17,6 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"ម៉ឺនុយរុករក"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"​ស្វែងរក​សកម្មភាព"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"ស្វែងរក"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"និយាយ​​ដើម្បី​ស្វែងរក"</string>
@@ -52,6 +53,5 @@
     <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
     <string name="lb_time_separator" msgid="2763247350845477227">"៖"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"ចាប់ផ្ដើម"</string>
-    <!-- no translation found for lb_onboarding_accessibility_next (2918313444257732434) -->
-    <skip />
+    <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"បន្ទាប់"</string>
 </resources>
diff --git a/v17/leanback/res/values-kn-rIN/strings.xml b/v17/leanback/res/values-kn-rIN/strings.xml
index 372da16..92fdddd 100644
--- a/v17/leanback/res/values-kn-rIN/strings.xml
+++ b/v17/leanback/res/values-kn-rIN/strings.xml
@@ -17,6 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"ನ್ಯಾವಿಗೇಶನ್‌ ಮೆನು"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"ಹುಡುಕಾಟ ಕ್ರಿಯೆ"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"ಹುಡುಕಿ"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"ಹುಡುಕಲು ಮಾತನಾಡಿ"</string>
@@ -52,6 +53,5 @@
     <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
     <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"ಪ್ರಾರಂಭಿಸಿ"</string>
-    <!-- no translation found for lb_onboarding_accessibility_next (2918313444257732434) -->
-    <skip />
+    <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"ಮುಂದೆ"</string>
 </resources>
diff --git a/v17/leanback/res/values-ko/strings.xml b/v17/leanback/res/values-ko/strings.xml
index b1a6c30..1696bca 100644
--- a/v17/leanback/res/values-ko/strings.xml
+++ b/v17/leanback/res/values-ko/strings.xml
@@ -17,6 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"탐색 메뉴"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"검색 작업"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"검색"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"음성 검색"</string>
@@ -52,6 +53,5 @@
     <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
     <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"시작하기"</string>
-    <!-- no translation found for lb_onboarding_accessibility_next (2918313444257732434) -->
-    <skip />
+    <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"다음"</string>
 </resources>
diff --git a/v17/leanback/res/values-ky-rKG/strings.xml b/v17/leanback/res/values-ky-rKG/strings.xml
index 4eed80c..e2dc200 100644
--- a/v17/leanback/res/values-ky-rKG/strings.xml
+++ b/v17/leanback/res/values-ky-rKG/strings.xml
@@ -17,6 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"Чабыттоо менюсу"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"Издөө аракети"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"Издөө"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Издөө үчүн сүйлөңүз"</string>
@@ -52,6 +53,5 @@
     <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
     <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"БАШТАДЫК"</string>
-    <!-- no translation found for lb_onboarding_accessibility_next (2918313444257732434) -->
-    <skip />
+    <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Кийинки"</string>
 </resources>
diff --git a/v17/leanback/res/values-lo-rLA/strings.xml b/v17/leanback/res/values-lo-rLA/strings.xml
index 28f5289..389b1d0 100644
--- a/v17/leanback/res/values-lo-rLA/strings.xml
+++ b/v17/leanback/res/values-lo-rLA/strings.xml
@@ -17,6 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"ເມນູນຳທາງ"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"ຊອກ​ຫາ​ຄຳ​ສັ່ງ"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"ຊອກຫາ"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"ເວົ້າ​ເພື່ອ​ຊອກ​ຫາ"</string>
@@ -52,6 +53,5 @@
     <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
     <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"ເລີ່ມຕົ້ນນຳໃຊ້"</string>
-    <!-- no translation found for lb_onboarding_accessibility_next (2918313444257732434) -->
-    <skip />
+    <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"ຕໍ່ໄປ"</string>
 </resources>
diff --git a/v17/leanback/res/values-lt/strings.xml b/v17/leanback/res/values-lt/strings.xml
index c78a523..43eebb8 100644
--- a/v17/leanback/res/values-lt/strings.xml
+++ b/v17/leanback/res/values-lt/strings.xml
@@ -17,6 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"Naršymo meniu"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"Paieškos veiksmas"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"Paieška"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Pasakykite, kad ieškotumėte"</string>
@@ -52,6 +53,5 @@
     <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
     <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"PRADĖTI"</string>
-    <!-- no translation found for lb_onboarding_accessibility_next (2918313444257732434) -->
-    <skip />
+    <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Kitas"</string>
 </resources>
diff --git a/v17/leanback/res/values-lv/strings.xml b/v17/leanback/res/values-lv/strings.xml
index 3de144b..644d990 100644
--- a/v17/leanback/res/values-lv/strings.xml
+++ b/v17/leanback/res/values-lv/strings.xml
@@ -17,6 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"Navigācijas izvēlne"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"Meklēšanas darbība"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"Meklēt"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Runāt, lai meklētu"</string>
@@ -52,6 +53,5 @@
     <string name="lb_date_separator" msgid="2440386660906697298">"."</string>
     <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"SĀKT DARBU"</string>
-    <!-- no translation found for lb_onboarding_accessibility_next (2918313444257732434) -->
-    <skip />
+    <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Nākamā"</string>
 </resources>
diff --git a/v17/leanback/res/values-mk-rMK/strings.xml b/v17/leanback/res/values-mk-rMK/strings.xml
index 38dda40..6e506fe 100644
--- a/v17/leanback/res/values-mk-rMK/strings.xml
+++ b/v17/leanback/res/values-mk-rMK/strings.xml
@@ -17,6 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"Мени за навигација"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"Акција на пребарување"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"Пребарување"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Зборувајте за да пребарувате"</string>
@@ -52,6 +53,5 @@
     <string name="lb_date_separator" msgid="2440386660906697298">"."</string>
     <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"ЗАПОЧНИ"</string>
-    <!-- no translation found for lb_onboarding_accessibility_next (2918313444257732434) -->
-    <skip />
+    <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Следно"</string>
 </resources>
diff --git a/v17/leanback/res/values-ml-rIN/strings.xml b/v17/leanback/res/values-ml-rIN/strings.xml
index 788707d..0306a6a 100644
--- a/v17/leanback/res/values-ml-rIN/strings.xml
+++ b/v17/leanback/res/values-ml-rIN/strings.xml
@@ -17,6 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"നാവിഗേഷൻ മെനു"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"തിരയൽ പ്രവർത്തനം"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"തിരയുക"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"ശബ്‌ദം ഉപയോഗിച്ച് തിരയുക"</string>
@@ -52,6 +53,5 @@
     <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
     <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"ആരംഭിക്കുക"</string>
-    <!-- no translation found for lb_onboarding_accessibility_next (2918313444257732434) -->
-    <skip />
+    <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"അടുത്തത്"</string>
 </resources>
diff --git a/v17/leanback/res/values-mn-rMN/strings.xml b/v17/leanback/res/values-mn-rMN/strings.xml
index facb2a2..f21b649 100644
--- a/v17/leanback/res/values-mn-rMN/strings.xml
+++ b/v17/leanback/res/values-mn-rMN/strings.xml
@@ -17,6 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"Шилжүүлэх цэс"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"Хайлтын үйлдэл"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"Хайлт"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Ярьж хайх"</string>
@@ -52,6 +53,5 @@
     <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
     <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"ЭХЭЛЦГЭЭЕ"</string>
-    <!-- no translation found for lb_onboarding_accessibility_next (2918313444257732434) -->
-    <skip />
+    <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Дараах"</string>
 </resources>
diff --git a/v17/leanback/res/values-mr-rIN/strings.xml b/v17/leanback/res/values-mr-rIN/strings.xml
index 03160f4..ef6a6a6 100644
--- a/v17/leanback/res/values-mr-rIN/strings.xml
+++ b/v17/leanback/res/values-mr-rIN/strings.xml
@@ -17,6 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"नेव्हिगेशन मेनू"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"शोध क्रिया"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"शोधा"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"शोधण्यासाठी बोला"</string>
diff --git a/v17/leanback/res/values-ms-rMY/strings.xml b/v17/leanback/res/values-ms-rMY/strings.xml
index 467a5ab..1764e52 100644
--- a/v17/leanback/res/values-ms-rMY/strings.xml
+++ b/v17/leanback/res/values-ms-rMY/strings.xml
@@ -17,6 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"Menu navigasi"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"Tindakan Carian"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"Carian"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Tutur untuk membuat carian"</string>
@@ -52,6 +53,5 @@
     <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
     <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"MULAKAN"</string>
-    <!-- no translation found for lb_onboarding_accessibility_next (2918313444257732434) -->
-    <skip />
+    <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Seterusnya"</string>
 </resources>
diff --git a/v17/leanback/res/values-my-rMM/strings.xml b/v17/leanback/res/values-my-rMM/strings.xml
index c816927..645f169 100644
--- a/v17/leanback/res/values-my-rMM/strings.xml
+++ b/v17/leanback/res/values-my-rMM/strings.xml
@@ -17,6 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"လမ်းညွှန် မီနူး"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"ရှာဖွေရန် လုပ်ဆောင်ချက်"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"ရှာဖွေရန်"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"ရှာဖွေရန် ပြောပါ"</string>
@@ -52,6 +53,5 @@
     <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
     <string name="lb_time_separator" msgid="2763247350845477227">"−"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"စတင်ပါ"</string>
-    <!-- no translation found for lb_onboarding_accessibility_next (2918313444257732434) -->
-    <skip />
+    <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"ရှေ့သို့"</string>
 </resources>
diff --git a/v17/leanback/res/values-nb/strings.xml b/v17/leanback/res/values-nb/strings.xml
index 379fc58..ae3394b 100644
--- a/v17/leanback/res/values-nb/strings.xml
+++ b/v17/leanback/res/values-nb/strings.xml
@@ -17,6 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"Navigasjonsmeny"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"Søkehandling"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"Søk"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Snakk for å søke"</string>
@@ -52,6 +53,5 @@
     <string name="lb_date_separator" msgid="2440386660906697298">"."</string>
     <string name="lb_time_separator" msgid="2763247350845477227">"."</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"KOM I GANG"</string>
-    <!-- no translation found for lb_onboarding_accessibility_next (2918313444257732434) -->
-    <skip />
+    <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Neste"</string>
 </resources>
diff --git a/v17/leanback/res/values-ne-rNP/strings.xml b/v17/leanback/res/values-ne-rNP/strings.xml
index 055f8d0..e8baffb 100644
--- a/v17/leanback/res/values-ne-rNP/strings.xml
+++ b/v17/leanback/res/values-ne-rNP/strings.xml
@@ -17,6 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"नेभिगेसन मेनु"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"कार्य खोजी गर्नुहोस्"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"खोजी गर्नुहोस्"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"खोजी गर्न बोल्नुहोस्"</string>
@@ -54,6 +55,5 @@
     <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
     <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"सुरु गरौँ"</string>
-    <!-- no translation found for lb_onboarding_accessibility_next (2918313444257732434) -->
-    <skip />
+    <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"अर्को"</string>
 </resources>
diff --git a/v17/leanback/res/values-nl/strings.xml b/v17/leanback/res/values-nl/strings.xml
index 2379624..0a5bdce 100644
--- a/v17/leanback/res/values-nl/strings.xml
+++ b/v17/leanback/res/values-nl/strings.xml
@@ -17,6 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"Navigatiemenu"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"Actie zoeken"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"Zoeken"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Spreek om te zoeken"</string>
diff --git a/v17/leanback/res/values-pa-rIN/strings.xml b/v17/leanback/res/values-pa-rIN/strings.xml
index 80677a2..b8c7591 100644
--- a/v17/leanback/res/values-pa-rIN/strings.xml
+++ b/v17/leanback/res/values-pa-rIN/strings.xml
@@ -17,6 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"ਆਵਾਗੌਣ ਮੀਨੂ"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"ਖੋਜ ਕਿਰਿਆ"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"ਖੋਜੋ"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"ਖੋਜਣ ਲਈ ਬੋਲੋ"</string>
diff --git a/v17/leanback/res/values-pl/strings.xml b/v17/leanback/res/values-pl/strings.xml
index 916d95b..15de203 100644
--- a/v17/leanback/res/values-pl/strings.xml
+++ b/v17/leanback/res/values-pl/strings.xml
@@ -17,11 +17,12 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"Menu nawigacyjne"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"Wyszukaj czynność"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"Szukaj"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Powiedz, aby wyszukać"</string>
     <string name="lb_search_bar_hint_with_title" msgid="1627103380996590035">"Szukaj <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
-    <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Powiedz, by wyszukać <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
+    <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Powiedz, co chcesz wyszukać w usłudze <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
     <string name="lb_control_display_fast_forward_multiplier" msgid="4541442045214207774">"%1$dX"</string>
     <string name="lb_control_display_rewind_multiplier" msgid="3097220783222910245">"%1$dX"</string>
     <string name="lb_playback_controls_play" msgid="731953341987346903">"Odtwórz"</string>
@@ -52,6 +53,5 @@
     <string name="lb_date_separator" msgid="2440386660906697298">"."</string>
     <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"ROZPOCZNIJ"</string>
-    <!-- no translation found for lb_onboarding_accessibility_next (2918313444257732434) -->
-    <skip />
+    <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Dalej"</string>
 </resources>
diff --git a/v17/leanback/res/values-pt-rBR/strings.xml b/v17/leanback/res/values-pt-rBR/strings.xml
index d3eb364..4621809 100644
--- a/v17/leanback/res/values-pt-rBR/strings.xml
+++ b/v17/leanback/res/values-pt-rBR/strings.xml
@@ -17,6 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"Menu de navegação"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"Ação de pesquisa"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"Pesquisar"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Fale para pesquisar"</string>
@@ -52,6 +53,5 @@
     <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
     <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"PRIMEIROS PASSOS"</string>
-    <!-- no translation found for lb_onboarding_accessibility_next (2918313444257732434) -->
-    <skip />
+    <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Próximo"</string>
 </resources>
diff --git a/v17/leanback/res/values-pt-rPT/strings.xml b/v17/leanback/res/values-pt-rPT/strings.xml
index 7ddbd7e..0df9c00 100644
--- a/v17/leanback/res/values-pt-rPT/strings.xml
+++ b/v17/leanback/res/values-pt-rPT/strings.xml
@@ -17,6 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"Menu de navegação"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"Ação de pesquisa"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"Pesquisar"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Fale para pesquisar"</string>
diff --git a/v17/leanback/res/values-pt/strings.xml b/v17/leanback/res/values-pt/strings.xml
index d3eb364..4621809 100644
--- a/v17/leanback/res/values-pt/strings.xml
+++ b/v17/leanback/res/values-pt/strings.xml
@@ -17,6 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"Menu de navegação"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"Ação de pesquisa"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"Pesquisar"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Fale para pesquisar"</string>
@@ -52,6 +53,5 @@
     <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
     <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"PRIMEIROS PASSOS"</string>
-    <!-- no translation found for lb_onboarding_accessibility_next (2918313444257732434) -->
-    <skip />
+    <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Próximo"</string>
 </resources>
diff --git a/v17/leanback/res/values-ro/strings.xml b/v17/leanback/res/values-ro/strings.xml
index 57945e7..5fa64ef 100644
--- a/v17/leanback/res/values-ro/strings.xml
+++ b/v17/leanback/res/values-ro/strings.xml
@@ -17,6 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"Meniu de navigare"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"Acțiunea de căutare"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"Căutați"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Rostiți pentru a căuta"</string>
@@ -32,7 +33,7 @@
     <string name="lb_playback_controls_rewind_multiplier" msgid="1640629531440849942">"Derulați înapoi cu %1$dX"</string>
     <string name="lb_playback_controls_skip_next" msgid="2946499493161095772">"Ignoră articolul următor"</string>
     <string name="lb_playback_controls_skip_previous" msgid="2326801832933178348">"Ignoră articolul anterior"</string>
-    <string name="lb_playback_controls_more_actions" msgid="2330770008796987655">"Mai multe acţiuni"</string>
+    <string name="lb_playback_controls_more_actions" msgid="2330770008796987655">"Mai multe acțiuni"</string>
     <string name="lb_playback_controls_thumb_up" msgid="6530420347129222601">"Deselectează „Îmi place”"</string>
     <string name="lb_playback_controls_thumb_up_outline" msgid="1577637924003500946">"Selectează „Îmi place”"</string>
     <string name="lb_playback_controls_thumb_down" msgid="4498041193172964797">"Deselectează „Nu-mi place”"</string>
@@ -52,6 +53,5 @@
     <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
     <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"ÎNCEPEȚI"</string>
-    <!-- no translation found for lb_onboarding_accessibility_next (2918313444257732434) -->
-    <skip />
+    <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Înainte"</string>
 </resources>
diff --git a/v17/leanback/res/values-ru/strings.xml b/v17/leanback/res/values-ru/strings.xml
index ec64bb7..c7a146f 100644
--- a/v17/leanback/res/values-ru/strings.xml
+++ b/v17/leanback/res/values-ru/strings.xml
@@ -17,6 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"Меню навигации"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"Поиск"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"Поиск"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Произнесите запрос"</string>
@@ -52,6 +53,5 @@
     <string name="lb_date_separator" msgid="2440386660906697298">"."</string>
     <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"НАЧАТЬ"</string>
-    <!-- no translation found for lb_onboarding_accessibility_next (2918313444257732434) -->
-    <skip />
+    <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Далее"</string>
 </resources>
diff --git a/v17/leanback/res/values-si-rLK/strings.xml b/v17/leanback/res/values-si-rLK/strings.xml
index 7e62853..44e4f31 100644
--- a/v17/leanback/res/values-si-rLK/strings.xml
+++ b/v17/leanback/res/values-si-rLK/strings.xml
@@ -17,6 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"සංචාලන මෙනුව"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"සෙවීමේ ක්‍රියාව"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"සොයන්න"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"සෙවීමට කථා කරන්න"</string>
@@ -52,6 +53,5 @@
     <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
     <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"ආරම්භ කරන්න"</string>
-    <!-- no translation found for lb_onboarding_accessibility_next (2918313444257732434) -->
-    <skip />
+    <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"ඊළඟ"</string>
 </resources>
diff --git a/v17/leanback/res/values-sk/strings.xml b/v17/leanback/res/values-sk/strings.xml
index 03af0d0..bfd972a 100644
--- a/v17/leanback/res/values-sk/strings.xml
+++ b/v17/leanback/res/values-sk/strings.xml
@@ -17,6 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"Navigačná ponuka"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"Akcia vyhľadávania"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"Hľadať"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Hovorením spustíte vyhľadávanie"</string>
@@ -52,6 +53,5 @@
     <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
     <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"ZAČÍNAME"</string>
-    <!-- no translation found for lb_onboarding_accessibility_next (2918313444257732434) -->
-    <skip />
+    <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Ďalej"</string>
 </resources>
diff --git a/v17/leanback/res/values-sl/strings.xml b/v17/leanback/res/values-sl/strings.xml
index 038f8d7..1919b29 100644
--- a/v17/leanback/res/values-sl/strings.xml
+++ b/v17/leanback/res/values-sl/strings.xml
@@ -17,11 +17,12 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"Meni za krmarjenje"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"Dejanje iskanja"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"Iskanje"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Izgovorite iskalno poizvedbo"</string>
     <string name="lb_search_bar_hint_with_title" msgid="1627103380996590035">"Iskanje: <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
-    <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Izgovorite poizvedbo za iskanje v <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
+    <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Izgovorite poizvedbo za iskanje v storitvi <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
     <string name="lb_control_display_fast_forward_multiplier" msgid="4541442045214207774">"%1$d-kratno"</string>
     <string name="lb_control_display_rewind_multiplier" msgid="3097220783222910245">"%1$d-kratno"</string>
     <string name="lb_playback_controls_play" msgid="731953341987346903">"Predvajaj"</string>
@@ -52,6 +53,5 @@
     <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
     <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"ZAČNITE"</string>
-    <!-- no translation found for lb_onboarding_accessibility_next (2918313444257732434) -->
-    <skip />
+    <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Naprej"</string>
 </resources>
diff --git a/v17/leanback/res/values-sq-rAL/strings.xml b/v17/leanback/res/values-sq-rAL/strings.xml
index d2caa54..36cfdf3 100644
--- a/v17/leanback/res/values-sq-rAL/strings.xml
+++ b/v17/leanback/res/values-sq-rAL/strings.xml
@@ -17,6 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"Menyja e navigimit"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"Veprim i kërkimit"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"Kërko"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Fol për të kërkuar"</string>
@@ -52,6 +53,5 @@
     <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
     <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"FILLO"</string>
-    <!-- no translation found for lb_onboarding_accessibility_next (2918313444257732434) -->
-    <skip />
+    <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Përpara"</string>
 </resources>
diff --git a/v17/leanback/res/values-sr/strings.xml b/v17/leanback/res/values-sr/strings.xml
index 119af27..1a9a0c4 100644
--- a/v17/leanback/res/values-sr/strings.xml
+++ b/v17/leanback/res/values-sr/strings.xml
@@ -17,6 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"Мени за навигацију"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"Радња претраге"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"Претражите"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Говорите да бисте претраживали"</string>
@@ -52,6 +53,5 @@
     <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
     <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"ЗАПОЧНИТЕ"</string>
-    <!-- no translation found for lb_onboarding_accessibility_next (2918313444257732434) -->
-    <skip />
+    <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Даље"</string>
 </resources>
diff --git a/v17/leanback/res/values-sv/strings.xml b/v17/leanback/res/values-sv/strings.xml
index 76c9fc9..5bdd293 100644
--- a/v17/leanback/res/values-sv/strings.xml
+++ b/v17/leanback/res/values-sv/strings.xml
@@ -17,6 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"Navigationsmeny"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"Sökåtgärd"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"Sök"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Säg det du söker efter"</string>
@@ -52,6 +53,5 @@
     <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
     <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"KOM IGÅNG"</string>
-    <!-- no translation found for lb_onboarding_accessibility_next (2918313444257732434) -->
-    <skip />
+    <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Nästa"</string>
 </resources>
diff --git a/v17/leanback/res/values-sw/strings.xml b/v17/leanback/res/values-sw/strings.xml
index 731aecc..6683e46 100644
--- a/v17/leanback/res/values-sw/strings.xml
+++ b/v17/leanback/res/values-sw/strings.xml
@@ -17,6 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"Menyu ya kusogeza"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"Kitendo cha Kutafuta"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"Utafutaji"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Tamka ili utafute"</string>
@@ -52,6 +53,5 @@
     <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
     <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"ANZA KUTUMIA"</string>
-    <!-- no translation found for lb_onboarding_accessibility_next (2918313444257732434) -->
-    <skip />
+    <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Inayofuata"</string>
 </resources>
diff --git a/v17/leanback/res/values-ta-rIN/strings.xml b/v17/leanback/res/values-ta-rIN/strings.xml
index 721432f..5afde83 100644
--- a/v17/leanback/res/values-ta-rIN/strings.xml
+++ b/v17/leanback/res/values-ta-rIN/strings.xml
@@ -17,6 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"வழிசெலுத்தல் மெனு"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"செயலைத் தேடுக"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"தேடு"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"தேட, பேசவும்"</string>
@@ -52,6 +53,5 @@
     <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
     <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"தொடங்குக"</string>
-    <!-- no translation found for lb_onboarding_accessibility_next (2918313444257732434) -->
-    <skip />
+    <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"அடுத்து"</string>
 </resources>
diff --git a/v17/leanback/res/values-te-rIN/strings.xml b/v17/leanback/res/values-te-rIN/strings.xml
index 13856be..f74c525 100644
--- a/v17/leanback/res/values-te-rIN/strings.xml
+++ b/v17/leanback/res/values-te-rIN/strings.xml
@@ -17,6 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"నావిగేషన్ మెను"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"శోధన చర్య"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"శోధించండి"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"శోధించడానికి చదివి వినిపించండి"</string>
diff --git a/v17/leanback/res/values-th/strings.xml b/v17/leanback/res/values-th/strings.xml
index 5cb2b0f..8440dd9 100644
--- a/v17/leanback/res/values-th/strings.xml
+++ b/v17/leanback/res/values-th/strings.xml
@@ -17,6 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"เมนูการนำทาง"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"การดำเนินการค้นหา"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"ค้นหา"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"พูดเพื่อค้นหา"</string>
@@ -52,6 +53,5 @@
     <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
     <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"เริ่มต้นใช้งาน"</string>
-    <!-- no translation found for lb_onboarding_accessibility_next (2918313444257732434) -->
-    <skip />
+    <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"ถัดไป"</string>
 </resources>
diff --git a/v17/leanback/res/values-tl/strings.xml b/v17/leanback/res/values-tl/strings.xml
index 070d9d1..c2f52a4 100644
--- a/v17/leanback/res/values-tl/strings.xml
+++ b/v17/leanback/res/values-tl/strings.xml
@@ -17,6 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"Menu ng navigation"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"Pagkilos sa Paghahanap"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"Maghanap"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Magsalita upang maghanap"</string>
@@ -52,6 +53,5 @@
     <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
     <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"MAGSIMULA"</string>
-    <!-- no translation found for lb_onboarding_accessibility_next (2918313444257732434) -->
-    <skip />
+    <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Susunod"</string>
 </resources>
diff --git a/v17/leanback/res/values-tr/strings.xml b/v17/leanback/res/values-tr/strings.xml
index 0f5fc72..0c6431e 100644
--- a/v17/leanback/res/values-tr/strings.xml
+++ b/v17/leanback/res/values-tr/strings.xml
@@ -17,6 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"Gezinme menüsü"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"Arama İşlemi"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"Ara"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Arama yapmak için konuşun"</string>
@@ -52,6 +53,5 @@
     <string name="lb_date_separator" msgid="2440386660906697298">"."</string>
     <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"BAŞLA"</string>
-    <!-- no translation found for lb_onboarding_accessibility_next (2918313444257732434) -->
-    <skip />
+    <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Sonraki"</string>
 </resources>
diff --git a/v17/leanback/res/values-uk/strings.xml b/v17/leanback/res/values-uk/strings.xml
index c1078f5..bb6bde7 100644
--- a/v17/leanback/res/values-uk/strings.xml
+++ b/v17/leanback/res/values-uk/strings.xml
@@ -17,6 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"Навігаційне меню"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"Команда пошуку"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"Пошук"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Продиктуйте пошуковий запит"</string>
@@ -52,6 +53,5 @@
     <string name="lb_date_separator" msgid="2440386660906697298">"."</string>
     <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"ПОЧАТИ"</string>
-    <!-- no translation found for lb_onboarding_accessibility_next (2918313444257732434) -->
-    <skip />
+    <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Далі"</string>
 </resources>
diff --git a/v17/leanback/res/values-ur-rPK/strings.xml b/v17/leanback/res/values-ur-rPK/strings.xml
index 0499390..f387aa3 100644
--- a/v17/leanback/res/values-ur-rPK/strings.xml
+++ b/v17/leanback/res/values-ur-rPK/strings.xml
@@ -17,6 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"نیویگیشن مینو"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"تلاش کی کارروائی"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"تلاش کریں"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"تلاش کرنے کیلئے بولیں"</string>
@@ -52,6 +53,5 @@
     <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
     <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"شروع کریں"</string>
-    <!-- no translation found for lb_onboarding_accessibility_next (2918313444257732434) -->
-    <skip />
+    <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"اگلا"</string>
 </resources>
diff --git a/v17/leanback/res/values-uz-rUZ/strings.xml b/v17/leanback/res/values-uz-rUZ/strings.xml
index d622eb8..48dc067 100644
--- a/v17/leanback/res/values-uz-rUZ/strings.xml
+++ b/v17/leanback/res/values-uz-rUZ/strings.xml
@@ -17,6 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"Navigatsiya menyusi"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"Qidiruv amali"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"Qidirish"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Qidirish uchun gapiring"</string>
@@ -52,6 +53,5 @@
     <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
     <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"BOSHLADIK"</string>
-    <!-- no translation found for lb_onboarding_accessibility_next (2918313444257732434) -->
-    <skip />
+    <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Keyingisi"</string>
 </resources>
diff --git a/v17/leanback/res/values-vi/strings.xml b/v17/leanback/res/values-vi/strings.xml
index 2aed131..8d8c282 100644
--- a/v17/leanback/res/values-vi/strings.xml
+++ b/v17/leanback/res/values-vi/strings.xml
@@ -17,6 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"Menu điều hướng"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"Tác vụ tìm kiếm"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"Tìm kiếm"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Nói để tìm kiếm"</string>
@@ -52,6 +53,5 @@
     <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
     <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"BẮT ĐẦU"</string>
-    <!-- no translation found for lb_onboarding_accessibility_next (2918313444257732434) -->
-    <skip />
+    <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"Tiếp theo"</string>
 </resources>
diff --git a/v17/leanback/res/values-zh-rCN/strings.xml b/v17/leanback/res/values-zh-rCN/strings.xml
index 8b178fa..611bff1 100644
--- a/v17/leanback/res/values-zh-rCN/strings.xml
+++ b/v17/leanback/res/values-zh-rCN/strings.xml
@@ -17,6 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"导航菜单"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"搜索操作"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"搜索"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"说话即可开始搜索"</string>
@@ -52,6 +53,5 @@
     <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
     <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"开始使用"</string>
-    <!-- no translation found for lb_onboarding_accessibility_next (2918313444257732434) -->
-    <skip />
+    <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"下一页"</string>
 </resources>
diff --git a/v17/leanback/res/values-zh-rHK/strings.xml b/v17/leanback/res/values-zh-rHK/strings.xml
index 1c9efa5..c18032e 100644
--- a/v17/leanback/res/values-zh-rHK/strings.xml
+++ b/v17/leanback/res/values-zh-rHK/strings.xml
@@ -17,6 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"導覽選單"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"搜尋動作"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"搜尋"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"使用語音搜尋"</string>
@@ -52,6 +53,5 @@
     <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
     <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"開始使用"</string>
-    <!-- no translation found for lb_onboarding_accessibility_next (2918313444257732434) -->
-    <skip />
+    <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"下一頁"</string>
 </resources>
diff --git a/v17/leanback/res/values-zh-rTW/strings.xml b/v17/leanback/res/values-zh-rTW/strings.xml
index c2975fb..1e14d0a 100644
--- a/v17/leanback/res/values-zh-rTW/strings.xml
+++ b/v17/leanback/res/values-zh-rTW/strings.xml
@@ -17,6 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"導覽選單"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"搜尋動作"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"搜尋"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"使用語音搜尋"</string>
@@ -52,6 +53,5 @@
     <string name="lb_date_separator" msgid="2440386660906697298">"/"</string>
     <string name="lb_time_separator" msgid="2763247350845477227">":"</string>
     <string name="lb_onboarding_get_started" msgid="6961440391306351139">"開始使用"</string>
-    <!-- no translation found for lb_onboarding_accessibility_next (2918313444257732434) -->
-    <skip />
+    <string name="lb_onboarding_accessibility_next" msgid="2918313444257732434">"繼續"</string>
 </resources>
diff --git a/v17/leanback/res/values-zu/strings.xml b/v17/leanback/res/values-zu/strings.xml
index 6590d69..7fb290f 100644
--- a/v17/leanback/res/values-zu/strings.xml
+++ b/v17/leanback/res/values-zu/strings.xml
@@ -17,6 +17,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="lb_navigation_menu_contentDescription" msgid="6215811486591629025">"Imenyu yokuzulazula"</string>
     <string name="orb_search_action" msgid="5651268540267663887">"Isenzo sokusesha"</string>
     <string name="lb_search_bar_hint" msgid="8325490927970116252">"Sesha"</string>
     <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Khuluma ukuze useshe"</string>
diff --git a/v17/leanback/src/android/support/v17/leanback/app/BaseRowFragment.java b/v17/leanback/src/android/support/v17/leanback/app/BaseRowFragment.java
index 8a65b0d..2ddea53 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/BaseRowFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/BaseRowFragment.java
@@ -90,10 +90,12 @@
     private class LateSelectionObserver extends RecyclerView.AdapterDataObserver {
         boolean mIsLateSelection = false;
 
+        @Override
         public void onChanged() {
             performLateSelection();
         }
 
+        @Override
         public void onItemRangeInserted(int positionStart, int itemCount) {
             performLateSelection();
         }
diff --git a/v17/leanback/src/android/support/v17/leanback/app/BaseRowSupportFragment.java b/v17/leanback/src/android/support/v17/leanback/app/BaseRowSupportFragment.java
index a202fb2..847eb57 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/BaseRowSupportFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/BaseRowSupportFragment.java
@@ -92,10 +92,12 @@
     private class LateSelectionObserver extends RecyclerView.AdapterDataObserver {
         boolean mIsLateSelection = false;
 
+        @Override
         public void onChanged() {
             performLateSelection();
         }
 
+        @Override
         public void onItemRangeInserted(int positionStart, int itemCount) {
             performLateSelection();
         }
diff --git a/v17/leanback/src/android/support/v17/leanback/app/BrowseFragment.java b/v17/leanback/src/android/support/v17/leanback/app/BrowseFragment.java
index 913a6b3..6e8659b 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/BrowseFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/BrowseFragment.java
@@ -13,8 +13,6 @@
  */
 package android.support.v17.leanback.app;
 
-import static android.support.v7.widget.RecyclerView.NO_POSITION;
-
 import android.app.Fragment;
 import android.app.FragmentManager;
 import android.app.FragmentManager.BackStackEntry;
@@ -54,6 +52,8 @@
 import java.util.HashMap;
 import java.util.Map;
 
+import static android.support.v7.widget.RecyclerView.NO_POSITION;
+
 /**
  * A fragment for creating Leanback browse screens. It is composed of a
  * RowsFragment and a HeadersFragment.
@@ -129,8 +129,8 @@
                 // if popped "headers" backstack, initiate the show header transition if needed
                 if (mIndexOfHeadersBackStack >= count) {
                     if (!isHeadersDataReady()) {
-                        // if main fragment was restored first before BrowseFragment's adapater gets
-                        // restored: dont start header transition, but add the entry back.
+                        // if main fragment was restored first before BrowseFragment's adapter gets
+                        // restored: don't start header transition, but add the entry back.
                         getFragmentManager().beginTransaction()
                                 .addToBackStack(mWithHeadersBackStackName).commit();
                         return;
@@ -754,7 +754,7 @@
 
         if (adapter != null) {
             if (mMainFragmentRowsAdapter != null) {
-                mMainFragmentRowsAdapter.setAdapter(adapter);
+                mMainFragmentRowsAdapter.setAdapter(new ListRowDataAdapter(adapter));
             }
             mHeadersFragment.setAdapter(adapter);
         }
@@ -1185,7 +1185,7 @@
 
     private void setupMainFragment() {
         if (mMainFragmentRowsAdapter != null) {
-            mMainFragmentRowsAdapter.setAdapter(mAdapter);
+            mMainFragmentRowsAdapter.setAdapter(new ListRowDataAdapter(mAdapter));
             mMainFragmentRowsAdapter.setOnItemViewSelectedListener(
                     new MainFragmentItemViewSelectedListener(mMainFragmentRowsAdapter));
             mMainFragmentRowsAdapter.setOnItemViewClickedListener(mOnItemViewClickedListener);
@@ -1507,8 +1507,7 @@
 
         if (mCanShowHeaders && mShowingHeaders && mHeadersFragment.getView() != null) {
             mHeadersFragment.getView().requestFocus();
-        } else if ((!mCanShowHeaders || !mShowingHeaders)
-                && mMainFragment.getView() != null) {
+        } else if ((!mCanShowHeaders || !mShowingHeaders) && mMainFragment.getView() != null) {
             mMainFragment.getView().requestFocus();
         }
 
diff --git a/v17/leanback/src/android/support/v17/leanback/app/BrowseSupportFragment.java b/v17/leanback/src/android/support/v17/leanback/app/BrowseSupportFragment.java
index bfea088..f685469 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/BrowseSupportFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/BrowseSupportFragment.java
@@ -15,8 +15,6 @@
  */
 package android.support.v17.leanback.app;
 
-import static android.support.v7.widget.RecyclerView.NO_POSITION;
-
 import android.support.v4.app.Fragment;
 import android.support.v4.app.FragmentManager;
 import android.support.v4.app.FragmentManager.BackStackEntry;
@@ -56,6 +54,8 @@
 import java.util.HashMap;
 import java.util.Map;
 
+import static android.support.v7.widget.RecyclerView.NO_POSITION;
+
 /**
  * A fragment for creating Leanback browse screens. It is composed of a
  * RowsSupportFragment and a HeadersSupportFragment.
@@ -131,8 +131,8 @@
                 // if popped "headers" backstack, initiate the show header transition if needed
                 if (mIndexOfHeadersBackStack >= count) {
                     if (!isHeadersDataReady()) {
-                        // if main fragment was restored first before BrowseSupportFragment's adapater gets
-                        // restored: dont start header transition, but add the entry back.
+                        // if main fragment was restored first before BrowseSupportFragment's adapter gets
+                        // restored: don't start header transition, but add the entry back.
                         getFragmentManager().beginTransaction()
                                 .addToBackStack(mWithHeadersBackStackName).commit();
                         return;
@@ -756,7 +756,7 @@
 
         if (adapter != null) {
             if (mMainFragmentRowsAdapter != null) {
-                mMainFragmentRowsAdapter.setAdapter(adapter);
+                mMainFragmentRowsAdapter.setAdapter(new ListRowDataAdapter(adapter));
             }
             mHeadersSupportFragment.setAdapter(adapter);
         }
@@ -1187,7 +1187,7 @@
 
     private void setupMainFragment() {
         if (mMainFragmentRowsAdapter != null) {
-            mMainFragmentRowsAdapter.setAdapter(mAdapter);
+            mMainFragmentRowsAdapter.setAdapter(new ListRowDataAdapter(mAdapter));
             mMainFragmentRowsAdapter.setOnItemViewSelectedListener(
                     new MainFragmentItemViewSelectedListener(mMainFragmentRowsAdapter));
             mMainFragmentRowsAdapter.setOnItemViewClickedListener(mOnItemViewClickedListener);
@@ -1509,8 +1509,7 @@
 
         if (mCanShowHeaders && mShowingHeaders && mHeadersSupportFragment.getView() != null) {
             mHeadersSupportFragment.getView().requestFocus();
-        } else if ((!mCanShowHeaders || !mShowingHeaders)
-                && mMainFragment.getView() != null) {
+        } else if ((!mCanShowHeaders || !mShowingHeaders) && mMainFragment.getView() != null) {
             mMainFragment.getView().requestFocus();
         }
 
diff --git a/v17/leanback/src/android/support/v17/leanback/app/DetailsFragment.java b/v17/leanback/src/android/support/v17/leanback/app/DetailsFragment.java
index a19eccc..1875683 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/DetailsFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/DetailsFragment.java
@@ -238,7 +238,7 @@
 
     /**
      * Called to setup {@link FullWidthDetailsOverviewRowPresenter}.  The default implementation
-     * adds two aligment positions({@link ItemAlignmentFacet}) for ViewHolder of
+     * adds two alignment positions({@link ItemAlignmentFacet}) for ViewHolder of
      * FullWidthDetailsOverviewRowPresenter to align in fragment.
      */
     protected void setupDetailsOverviewRowPresenter(FullWidthDetailsOverviewRowPresenter presenter) {
diff --git a/v17/leanback/src/android/support/v17/leanback/app/DetailsSupportFragment.java b/v17/leanback/src/android/support/v17/leanback/app/DetailsSupportFragment.java
index c4f9bc3..8f69db2 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/DetailsSupportFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/DetailsSupportFragment.java
@@ -240,7 +240,7 @@
 
     /**
      * Called to setup {@link FullWidthDetailsOverviewRowPresenter}.  The default implementation
-     * adds two aligment positions({@link ItemAlignmentFacet}) for ViewHolder of
+     * adds two alignment positions({@link ItemAlignmentFacet}) for ViewHolder of
      * FullWidthDetailsOverviewRowPresenter to align in fragment.
      */
     protected void setupDetailsOverviewRowPresenter(FullWidthDetailsOverviewRowPresenter presenter) {
diff --git a/v17/leanback/src/android/support/v17/leanback/app/GuidedStepFragment.java b/v17/leanback/src/android/support/v17/leanback/app/GuidedStepFragment.java
index 0706be5..e00b9f6 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/GuidedStepFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/GuidedStepFragment.java
@@ -103,7 +103,7 @@
  * </ul>
  * <p>
  * If the theme is provided in multiple ways, the onProvideTheme override has priority, followed by
- * the Activty's theme.  (Themes whose parent theme is already set to the guided step theme do not
+ * the Activity's theme.  (Themes whose parent theme is already set to the guided step theme do not
  * need to set the guidedStepTheme attribute; if set, it will be ignored.)
  * <p>
  * If themes do not provide enough customizability, the stylists themselves may be subclassed and
@@ -885,7 +885,7 @@
                 // No shared element transition
                 TransitionHelper.setSharedElementEnterTransition(this, null);
             } else if (uiStyle == UI_STYLE_ACTIVITY_ROOT) {
-                // for Activity root, we dont need enter transition, use activity transition
+                // for Activity root, we don't need enter transition, use activity transition
                 TransitionHelper.setEnterTransition(this, null);
                 // No shared element transition
                 TransitionHelper.setSharedElementEnterTransition(this, null);
@@ -1094,7 +1094,7 @@
         }
         mButtonActionsStylist.getActionsGridView().setAdapter(mButtonAdapter);
         if (mButtonActions.size() == 0) {
-            // when there is no button actions, we dont need show the second panel, but keep
+            // when there is no button actions, we don't need show the second panel, but keep
             // the width zero to run ChangeBounds transition.
             LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams)
                     buttonActionsView.getLayoutParams();
@@ -1293,12 +1293,12 @@
      * Currently we provide 2 different variations for animation - slide in from
      * side (default) or bottom.
      *
-     * Ideally we can retireve the screen mode settings from the theme attribute
+     * Ideally we can retrieve the screen mode settings from the theme attribute
      * {@code Theme.Leanback.GuidedStep#guidedStepHeightWeight} and use that to
      * determine the transition. But the fragment context to retrieve the theme
      * isn't available on platform v23 or earlier.
      *
-     * For now clients(subclasses) can call this method inside the contructor.
+     * For now clients(subclasses) can call this method inside the constructor.
      * @hide
      */
     public void setEntranceTransitionType(int transitionType) {
diff --git a/v17/leanback/src/android/support/v17/leanback/app/GuidedStepSupportFragment.java b/v17/leanback/src/android/support/v17/leanback/app/GuidedStepSupportFragment.java
index b20dfbb..d3d7939 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/GuidedStepSupportFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/GuidedStepSupportFragment.java
@@ -105,7 +105,7 @@
  * </ul>
  * <p>
  * If the theme is provided in multiple ways, the onProvideTheme override has priority, followed by
- * the Activty's theme.  (Themes whose parent theme is already set to the guided step theme do not
+ * the Activity's theme.  (Themes whose parent theme is already set to the guided step theme do not
  * need to set the guidedStepTheme attribute; if set, it will be ignored.)
  * <p>
  * If themes do not provide enough customizability, the stylists themselves may be subclassed and
@@ -887,7 +887,7 @@
                 // No shared element transition
                 TransitionHelper.setSharedElementEnterTransition(this, null);
             } else if (uiStyle == UI_STYLE_ACTIVITY_ROOT) {
-                // for Activity root, we dont need enter transition, use activity transition
+                // for Activity root, we don't need enter transition, use activity transition
                 TransitionHelper.setEnterTransition(this, null);
                 // No shared element transition
                 TransitionHelper.setSharedElementEnterTransition(this, null);
@@ -1096,7 +1096,7 @@
         }
         mButtonActionsStylist.getActionsGridView().setAdapter(mButtonAdapter);
         if (mButtonActions.size() == 0) {
-            // when there is no button actions, we dont need show the second panel, but keep
+            // when there is no button actions, we don't need show the second panel, but keep
             // the width zero to run ChangeBounds transition.
             LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams)
                     buttonActionsView.getLayoutParams();
@@ -1295,12 +1295,12 @@
      * Currently we provide 2 different variations for animation - slide in from
      * side (default) or bottom.
      *
-     * Ideally we can retireve the screen mode settings from the theme attribute
+     * Ideally we can retrieve the screen mode settings from the theme attribute
      * {@code Theme.Leanback.GuidedStep#guidedStepHeightWeight} and use that to
      * determine the transition. But the fragment context to retrieve the theme
      * isn't available on platform v23 or earlier.
      *
-     * For now clients(subclasses) can call this method inside the contructor.
+     * For now clients(subclasses) can call this method inside the constructor.
      * @hide
      */
     public void setEntranceTransitionType(int transitionType) {
diff --git a/v17/leanback/src/android/support/v17/leanback/app/HeadersFragment.java b/v17/leanback/src/android/support/v17/leanback/app/HeadersFragment.java
index d09fc01..d3e76a5 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/HeadersFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/HeadersFragment.java
@@ -213,7 +213,7 @@
     }
 
     // Wrapper needed because of conflict between RecyclerView's use of alpha
-    // for ADD animations, and RowHeaderPresnter's use of alpha for selected level.
+    // for ADD animations, and RowHeaderPresenter's use of alpha for selected level.
     private final ItemBridgeAdapter.Wrapper mWrapper = new ItemBridgeAdapter.Wrapper() {
         @Override
         public void wrap(View wrapper, View wrapped) {
@@ -263,7 +263,7 @@
         super.onTransitionStart();
         if (!mHeadersEnabled) {
             // When enabling headers fragment,  the RowHeaderView gets a focus but
-            // isShown() is still false because its parent is INVSIBILE, accessibility
+            // isShown() is still false because its parent is INVISIBLE, accessibility
             // event is not sent.
             // Workaround is: prevent focus to a child view during transition and put
             // focus on it after transition is done.
diff --git a/v17/leanback/src/android/support/v17/leanback/app/HeadersSupportFragment.java b/v17/leanback/src/android/support/v17/leanback/app/HeadersSupportFragment.java
index a6d598b..9e01e70 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/HeadersSupportFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/HeadersSupportFragment.java
@@ -215,7 +215,7 @@
     }
 
     // Wrapper needed because of conflict between RecyclerView's use of alpha
-    // for ADD animations, and RowHeaderPresnter's use of alpha for selected level.
+    // for ADD animations, and RowHeaderPresenter's use of alpha for selected level.
     private final ItemBridgeAdapter.Wrapper mWrapper = new ItemBridgeAdapter.Wrapper() {
         @Override
         public void wrap(View wrapper, View wrapped) {
@@ -265,7 +265,7 @@
         super.onTransitionStart();
         if (!mHeadersEnabled) {
             // When enabling headers fragment,  the RowHeaderView gets a focus but
-            // isShown() is still false because its parent is INVSIBILE, accessibility
+            // isShown() is still false because its parent is INVISIBLE, accessibility
             // event is not sent.
             // Workaround is: prevent focus to a child view during transition and put
             // focus on it after transition is done.
diff --git a/v17/leanback/src/android/support/v17/leanback/app/ListRowDataAdapter.java b/v17/leanback/src/android/support/v17/leanback/app/ListRowDataAdapter.java
new file mode 100644
index 0000000..cb3b9a3
--- /dev/null
+++ b/v17/leanback/src/android/support/v17/leanback/app/ListRowDataAdapter.java
@@ -0,0 +1,111 @@
+package android.support.v17.leanback.app;
+
+import android.support.v17.leanback.widget.DividerRow;
+import android.support.v17.leanback.widget.ListRow;
+import android.support.v17.leanback.widget.ObjectAdapter;
+import android.support.v17.leanback.widget.Row;
+
+/**
+ * Wrapper class for {@link ObjectAdapter} used by {@link BrowseFragment} to initialize
+ * {@link RowsFragment}. We use invisible rows to represent
+ * {@link android.support.v17.leanback.widget.DividerRow},
+ * {@link android.support.v17.leanback.widget.SectionRow} and
+ * {@link android.support.v17.leanback.widget.PageRow} in RowsFragment. In case we have an
+ * invisible row at the end of a RowsFragment, it creates a jumping effect as the layout manager
+ * thinks there are items even though they're invisible. This class takes care of filtering out
+ * the invisible rows at the end. In case the data inside the adapter changes, it adjusts the
+ * bounds to reflect the latest data.
+ */
+class ListRowDataAdapter extends ObjectAdapter {
+    private final ObjectAdapter mAdapter;
+    private int mLastVisibleRowIndex;
+
+    public ListRowDataAdapter(ObjectAdapter adapter) {
+        super(adapter.getPresenterSelector());
+        this.mAdapter = adapter;
+        initialize();
+        mAdapter.registerObserver(new DataObserver() {
+
+            @Override
+            public void onItemRangeChanged(int positionStart, int itemCount) {
+                initialize();
+                notifyItemRangeChanged(positionStart, itemCount);
+            }
+
+            @Override
+            public void onItemRangeInserted(int positionStart, int itemCount) {
+                Row item = (Row) mAdapter.get(mLastVisibleRowIndex);
+                boolean isLastRowNonVisible = (item instanceof DividerRow);
+                initialize();
+
+                boolean hasVisibleRow = hasVisibleRow(positionStart);
+                if (positionStart >= mLastVisibleRowIndex
+                        && isLastRowNonVisible
+                        && hasVisibleRow) {
+                    positionStart--;
+                    itemCount++;
+                }
+                notifyItemRangeInserted(positionStart, itemCount);
+            }
+
+            @Override
+            public void onItemRangeRemoved(int positionStart, int itemCount) {
+                Row item = (Row) mAdapter.get(mLastVisibleRowIndex);
+                boolean isLastRowNonVisible = (item instanceof DividerRow);
+                initialize();
+
+                if (positionStart + itemCount >= mLastVisibleRowIndex && isLastRowNonVisible) {
+                    itemCount--;
+                }
+                notifyItemRangeRemoved(positionStart, itemCount);
+            }
+
+            @Override
+            public void onChanged() {
+                initialize();
+                notifyChanged();
+            }
+        });
+    }
+
+    private boolean hasVisibleRow(int startIndex) {
+        for (int i = startIndex; i < Math.min(mLastVisibleRowIndex, mAdapter.size()); i++) {
+            Row item = (Row) mAdapter.get(i);
+            if (item instanceof ListRow) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private void initialize() {
+        int i = 0;
+        while (i < mAdapter.size()) {
+            Row item = (Row) mAdapter.get(i);
+            if (item.isRenderedAsRowView()) {
+                break;
+            }
+            i++;
+        }
+
+        i = mAdapter.size() - 1;
+        while (i >= 0) {
+            Row item = (Row) mAdapter.get(i);
+            if (item.isRenderedAsRowView()) {
+                mLastVisibleRowIndex = i;
+                break;
+            }
+            i--;
+        }
+    }
+
+    @Override
+    public int size() {
+        return mLastVisibleRowIndex + 1;
+    }
+
+    @Override
+    public Object get(int index) {
+        return mAdapter.get(index);
+    }
+}
\ No newline at end of file
diff --git a/v17/leanback/src/android/support/v17/leanback/app/PlaybackOverlayFragment.java b/v17/leanback/src/android/support/v17/leanback/app/PlaybackOverlayFragment.java
index 64029cd..eaabd72 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/PlaybackOverlayFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/PlaybackOverlayFragment.java
@@ -181,6 +181,7 @@
 
     private final VerticalGridView.OnTouchInterceptListener mOnTouchInterceptListener =
             new VerticalGridView.OnTouchInterceptListener() {
+        @Override
         public boolean onInterceptTouchEvent(MotionEvent event) {
             return onInterceptInputEvent(event);
         }
@@ -188,6 +189,7 @@
 
     private final VerticalGridView.OnKeyInterceptListener mOnKeyInterceptListener =
             new VerticalGridView.OnKeyInterceptListener() {
+        @Override
         public boolean onInterceptKeyEvent(KeyEvent event) {
             return onInterceptInputEvent(event);
         }
@@ -743,6 +745,7 @@
     }
 
     private final DataObserver mObserver = new DataObserver() {
+        @Override
         public void onChanged() {
             updateControlsBottomSpace(null);
         }
@@ -752,10 +755,13 @@
         ArrayList<View> mViews = new ArrayList<View>();
         ArrayList<Integer> mLayerType = new ArrayList<Integer>();
 
+        @Override
         public void onAnimationCancel(Animator animation) {
         }
+        @Override
         public void onAnimationRepeat(Animator animation) {
         }
+        @Override
         public void onAnimationStart(Animator animation) {
             getViews(mViews);
             for (View view : mViews) {
@@ -763,6 +769,7 @@
                 view.setLayerType(View.LAYER_TYPE_HARDWARE, null);
             }
         }
+        @Override
         public void onAnimationEnd(Animator animation) {
             for (int i = 0; i < mViews.size(); i++) {
                 mViews.get(i).setLayerType(mLayerType.get(i), null);
diff --git a/v17/leanback/src/android/support/v17/leanback/app/PlaybackOverlaySupportFragment.java b/v17/leanback/src/android/support/v17/leanback/app/PlaybackOverlaySupportFragment.java
index a4e3f24..d35614c 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/PlaybackOverlaySupportFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/PlaybackOverlaySupportFragment.java
@@ -183,6 +183,7 @@
 
     private final VerticalGridView.OnTouchInterceptListener mOnTouchInterceptListener =
             new VerticalGridView.OnTouchInterceptListener() {
+        @Override
         public boolean onInterceptTouchEvent(MotionEvent event) {
             return onInterceptInputEvent(event);
         }
@@ -190,6 +191,7 @@
 
     private final VerticalGridView.OnKeyInterceptListener mOnKeyInterceptListener =
             new VerticalGridView.OnKeyInterceptListener() {
+        @Override
         public boolean onInterceptKeyEvent(KeyEvent event) {
             return onInterceptInputEvent(event);
         }
@@ -745,6 +747,7 @@
     }
 
     private final DataObserver mObserver = new DataObserver() {
+        @Override
         public void onChanged() {
             updateControlsBottomSpace(null);
         }
@@ -754,10 +757,13 @@
         ArrayList<View> mViews = new ArrayList<View>();
         ArrayList<Integer> mLayerType = new ArrayList<Integer>();
 
+        @Override
         public void onAnimationCancel(Animator animation) {
         }
+        @Override
         public void onAnimationRepeat(Animator animation) {
         }
+        @Override
         public void onAnimationStart(Animator animation) {
             getViews(mViews);
             for (View view : mViews) {
@@ -765,6 +771,7 @@
                 view.setLayerType(View.LAYER_TYPE_HARDWARE, null);
             }
         }
+        @Override
         public void onAnimationEnd(Animator animation) {
             for (int i = 0; i < mViews.size(); i++) {
                 mViews.get(i).setLayerType(mLayerType.get(i), null);
diff --git a/v17/leanback/src/android/support/v17/leanback/app/SearchFragment.java b/v17/leanback/src/android/support/v17/leanback/app/SearchFragment.java
index ea9e138..01ba0bf 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/SearchFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/SearchFragment.java
@@ -142,7 +142,7 @@
                     mRowsFragment.setSelectedPosition(0);
                 }
             }
-            updateSearchBarVisiblity();
+            updateSearchBarVisibility();
             mStatus |= RESULTS_CHANGED;
             if ((mStatus & QUERY_COMPLETE) != 0) {
                 updateFocus();
@@ -225,6 +225,7 @@
     private boolean mPendingStartRecognitionWhenPaused;
     private SearchBar.SearchBarPermissionListener mPermissionListener
             = new SearchBar.SearchBarPermissionListener() {
+        @Override
         public void requestAudioPermission() {
             PermissionHelper.requestPermissions(SearchFragment.this,
                     new String[]{Manifest.permission.RECORD_AUDIO}, AUDIO_PERMISSION_REQUEST_CODE);
@@ -341,7 +342,7 @@
                     int position = mRowsFragment.getSelectedPosition();
                     Log.v(TAG, String.format("onItemSelected %d", position));
                 }
-                updateSearchBarVisiblity();
+                updateSearchBarVisibility();
                 if (null != mOnItemViewSelectedListener) {
                     mOnItemViewSelectedListener.onItemSelected(itemViewHolder, item,
                             rowViewHolder, row);
@@ -632,7 +633,7 @@
         focusOnResults();
     }
 
-    private void updateSearchBarVisiblity() {
+    private void updateSearchBarVisibility() {
         int position = mRowsFragment != null ? mRowsFragment.getSelectedPosition() : -1;
         mSearchBar.setVisibility(position <=0 || mResultAdapter == null
                 || mResultAdapter.size() == 0 ? View.VISIBLE : View.GONE);
diff --git a/v17/leanback/src/android/support/v17/leanback/app/SearchSupportFragment.java b/v17/leanback/src/android/support/v17/leanback/app/SearchSupportFragment.java
index 0368339..af2c1b6 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/SearchSupportFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/SearchSupportFragment.java
@@ -144,7 +144,7 @@
                     mRowsSupportFragment.setSelectedPosition(0);
                 }
             }
-            updateSearchBarVisiblity();
+            updateSearchBarVisibility();
             mStatus |= RESULTS_CHANGED;
             if ((mStatus & QUERY_COMPLETE) != 0) {
                 updateFocus();
@@ -227,12 +227,14 @@
     private boolean mPendingStartRecognitionWhenPaused;
     private SearchBar.SearchBarPermissionListener mPermissionListener
             = new SearchBar.SearchBarPermissionListener() {
+        @Override
         public void requestAudioPermission() {
             PermissionHelper.requestPermissions(SearchSupportFragment.this,
                     new String[]{Manifest.permission.RECORD_AUDIO}, AUDIO_PERMISSION_REQUEST_CODE);
         }
     };
 
+    @Override
     public void onRequestPermissionsResult(int requestCode, String[] permissions,
                                            int[] grantResults) {
         if (requestCode == AUDIO_PERMISSION_REQUEST_CODE && permissions.length > 0) {
@@ -343,7 +345,7 @@
                     int position = mRowsSupportFragment.getSelectedPosition();
                     Log.v(TAG, String.format("onItemSelected %d", position));
                 }
-                updateSearchBarVisiblity();
+                updateSearchBarVisibility();
                 if (null != mOnItemViewSelectedListener) {
                     mOnItemViewSelectedListener.onItemSelected(itemViewHolder, item,
                             rowViewHolder, row);
@@ -634,7 +636,7 @@
         focusOnResults();
     }
 
-    private void updateSearchBarVisiblity() {
+    private void updateSearchBarVisibility() {
         int position = mRowsSupportFragment != null ? mRowsSupportFragment.getSelectedPosition() : -1;
         mSearchBar.setVisibility(position <=0 || mResultAdapter == null
                 || mResultAdapter.size() == 0 ? View.VISIBLE : View.GONE);
diff --git a/v17/leanback/src/android/support/v17/leanback/transition/TransitionHelper.java b/v17/leanback/src/android/support/v17/leanback/transition/TransitionHelper.java
index 198c914..7437227 100644
--- a/v17/leanback/src/android/support/v17/leanback/transition/TransitionHelper.java
+++ b/v17/leanback/src/android/support/v17/leanback/transition/TransitionHelper.java
@@ -164,16 +164,20 @@
             ArrayList<TransitionListener> mTransitionListeners;
         }
 
+        @Override
         public void setEnterTransition(android.app.Fragment fragment, Object transition) {
         }
 
+        @Override
         public void setExitTransition(android.app.Fragment fragment, Object transition) {
         }
 
+        @Override
         public void setSharedElementEnterTransition(android.app.Fragment fragment,
                 Object transition) {
         }
 
+        @Override
         public void addSharedElement(android.app.FragmentTransaction ft,
                 View view, String transitionName) {
         }
@@ -528,19 +532,23 @@
 
     static final class TransitionHelperApi21Impl extends TransitionHelperKitkatImpl {
 
+        @Override
         public void setEnterTransition(android.app.Fragment fragment, Object transition) {
             TransitionHelperApi21.setEnterTransition(fragment, transition);
         }
 
+        @Override
         public void setExitTransition(android.app.Fragment fragment, Object transition) {
             TransitionHelperApi21.setExitTransition(fragment, transition);
         }
 
+        @Override
         public void setSharedElementEnterTransition(android.app.Fragment fragment,
                 Object transition) {
             TransitionHelperApi21.setSharedElementEnterTransition(fragment, transition);
         }
 
+        @Override
         public void addSharedElement(android.app.FragmentTransaction ft,
                 View view, String transitionName) {
             TransitionHelperApi21.addSharedElement(ft, view, transitionName);
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/BaseGridView.java b/v17/leanback/src/android/support/v17/leanback/widget/BaseGridView.java
index e8b55dc..df457b1 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/BaseGridView.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/BaseGridView.java
@@ -579,6 +579,7 @@
             RecyclerView.ViewHolder vh = findViewHolderForPosition(position);
             if (vh == null) {
                 addOnChildViewHolderSelectedListener(new OnChildViewHolderSelectedListener() {
+                    @Override
                     public void onChildViewHolderSelected(RecyclerView parent,
                             RecyclerView.ViewHolder child, int selectedPosition, int subposition) {
                         if (selectedPosition == position) {
@@ -604,6 +605,7 @@
             RecyclerView.ViewHolder vh = findViewHolderForPosition(position);
             if (vh == null) {
                 addOnChildViewHolderSelectedListener(new OnChildViewHolderSelectedListener() {
+                    @Override
                     public void onChildViewHolderSelected(RecyclerView parent,
                             RecyclerView.ViewHolder child, int selectedPosition, int subposition) {
                         if (selectedPosition == position) {
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/DetailsOverviewLogoPresenter.java b/v17/leanback/src/android/support/v17/leanback/widget/DetailsOverviewLogoPresenter.java
index a9e0d7a..6ae9995 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/DetailsOverviewLogoPresenter.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/DetailsOverviewLogoPresenter.java
@@ -128,7 +128,7 @@
     }
 
     /**
-     * Bind logo View to drawble of DetailsOverviewRow and call notifyOnBindLogo().  The
+     * Bind logo View to drawable of DetailsOverviewRow and call notifyOnBindLogo().  The
      * default implementation assumes the Logo View is an ImageView and change layout size to
      * intrinsic size of ImageDrawable if {@link ViewHolder#isSizeFromDrawableIntrinsic()} is true.
      * @param viewHolder ViewHolder to bind.
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/Grid.java b/v17/leanback/src/android/support/v17/leanback/widget/Grid.java
index ff09d7c..d84adcd 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/Grid.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/Grid.java
@@ -14,7 +14,6 @@
 package android.support.v17.leanback.widget;
 
 import android.support.v4.util.CircularIntArray;
-import android.util.Log;
 
 import java.io.PrintWriter;
 
@@ -238,7 +237,7 @@
             mProvider.removeItem(mLastVisibleIndex);
             mLastVisibleIndex--;
         }
-        resetVisbileIndexIfEmpty();
+        resetVisibleIndexIfEmpty();
         if (getFirstVisibleIndex() < 0) {
             setStart(index);
         }
@@ -395,7 +394,7 @@
                 break;
             }
         }
-        resetVisbileIndexIfEmpty();
+        resetVisibleIndexIfEmpty();
     }
 
     /**
@@ -414,10 +413,10 @@
                 break;
             }
         }
-        resetVisbileIndexIfEmpty();
+        resetVisibleIndexIfEmpty();
     }
 
-    private void resetVisbileIndexIfEmpty() {
+    private void resetVisibleIndexIfEmpty() {
         if (mLastVisibleIndex < mFirstVisibleIndex) {
             resetVisibleIndex();
         }
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/GridLayoutManager.java b/v17/leanback/src/android/support/v17/leanback/widget/GridLayoutManager.java
index 7de13f2..1c6c4b0 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/GridLayoutManager.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/GridLayoutManager.java
@@ -440,7 +440,7 @@
     private int mFocusPosition = NO_POSITION;
 
     /**
-     * A view can have mutliple alignment position,  this is the index of which
+     * A view can have multiple alignment position,  this is the index of which
      * alignment is used,  by default is 0.
      */
     private int mSubFocusPosition = 0;
@@ -1299,27 +1299,6 @@
         }
      };
 
-    private final Runnable mAskFocusRunnable = new Runnable() {
-        @Override
-        public void run() {
-            if (hasFocus()) {
-                return;
-            }
-            View view = findViewByPosition(mFocusPosition);
-            if (view != null && view.hasFocusable()) {
-                mBaseGridView.focusableViewAvailable(view);
-                return;
-            }
-            for (int i = 0, count = getChildCount(); i < count; i++) {
-                view = getChildAt(i);
-                if (view != null && view.hasFocusable()) {
-                    mBaseGridView.focusableViewAvailable(view);
-                    break;
-                }
-            }
-        }
-    };
-
     @Override
     public void onMeasure(Recycler recycler, State state, int widthSpec, int heightSpec) {
         saveContext(recycler, state);
@@ -1801,6 +1780,7 @@
         updateScrollSecondAxis();
     }
 
+    @Override
     public void removeAndRecycleAllViews(RecyclerView.Recycler recycler) {
         if (TRACE) TraceHelper.beginSection("removeAndRecycleAllViews");
         if (DEBUG) Log.v(TAG, "removeAndRecycleAllViews " + getChildCount());
@@ -1810,6 +1790,34 @@
         if (TRACE) TraceHelper.endSection();
     }
 
+    // called by onLayoutChildren, either focus to FocusPosition or declare focusViewAvailable
+    // and scroll to the view if framework focus on it.
+    private void scrollToFocusViewInLayout(boolean hadFocus, boolean alignToView) {
+        View focusView = findViewByPosition(mFocusPosition);
+        if (focusView != null && alignToView) {
+            scrollToView(focusView, false);
+        }
+        if (focusView != null && hadFocus && !focusView.hasFocus()) {
+            focusView.requestFocus();
+        } else if (!hadFocus && !mBaseGridView.hasFocus()) {
+            if (focusView != null && focusView.hasFocusable()) {
+                mBaseGridView.focusableViewAvailable(focusView);
+            } else {
+                for (int i = 0, count = getChildCount(); i < count; i++) {
+                    focusView = getChildAt(i);
+                    if (focusView != null && focusView.hasFocusable()) {
+                        mBaseGridView.focusableViewAvailable(focusView);
+                        break;
+                    }
+                }
+                // focusViewAvailable() might focus to the view, scroll to it if that is the case.
+                if (alignToView && focusView != null && focusView.hasFocus()) {
+                    scrollToView(focusView, false);
+                }
+            }
+        }
+    }
+
     // Lays out items based on the current scroll position
     @Override
     public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {
@@ -1880,15 +1888,7 @@
             fastRelayout();
             // appends items till focus position.
             if (mFocusPosition != NO_POSITION) {
-                View focusView = findViewByPosition(mFocusPosition);
-                if (focusView != null) {
-                    if (scrollToFocus) {
-                        scrollToView(focusView, false);
-                    }
-                    if (hadFocus && !focusView.hasFocus()) {
-                        focusView.requestFocus();
-                    }
-                }
+                scrollToFocusViewInLayout(hadFocus, scrollToFocus);
             }
         } else {
             mInLayoutSearchFocus = hadFocus;
@@ -1906,12 +1906,7 @@
                 updateScrollMax();
                 oldFirstVisible = mGrid.getFirstVisibleIndex();
                 oldLastVisible = mGrid.getLastVisibleIndex();
-                View focusView = findViewByPosition(mFocusPosition);
-                // we need force to initialize the child view's position
-                scrollToView(focusView, false);
-                if (focusView != null && hadFocus && !focusView.hasFocus()) {
-                    focusView.requestFocus();
-                }
+                scrollToFocusViewInLayout(hadFocus, true);
                 appendVisibleItems();
                 prependVisibleItems();
                 removeInvisibleViewsAtFront();
@@ -1954,9 +1949,6 @@
 
         mInLayout = false;
         leaveContext();
-        if (!hadFocus && !mInFastRelayout && mBaseGridView.hasFocusable()) {
-            ViewCompat.postOnAnimation(mBaseGridView, mAskFocusRunnable);
-        }
         if (DEBUG) Log.v(getTag(), "layoutChildren end");
     }
 
@@ -3138,8 +3130,8 @@
         }
     }
 
-    void setChildrenVisibility(int visiblity) {
-        mChildVisibility = visiblity;
+    void setChildrenVisibility(int visibility) {
+        mChildVisibility = visibility;
         if (mChildVisibility != -1) {
             int count = getChildCount();
             for (int i= 0; i < count; i++) {
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/GuidedAction.java b/v17/leanback/src/android/support/v17/leanback/widget/GuidedAction.java
index 2a39323..22ac504 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/GuidedAction.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/GuidedAction.java
@@ -530,13 +530,13 @@
 
         /**
          * Explicitly sets auto restore feature on the GuidedAction.  It's by default true.
-         * @param autoSaveRestoreEnanbled True if turn on auto save/restore of GuidedAction content,
+         * @param autoSaveRestoreEnabled True if turn on auto save/restore of GuidedAction content,
          *                                false otherwise.
          * @return The same BuilderBase object.
          * @see GuidedAction#isAutoSaveRestoreEnabled()
          */
-        public B autoSaveRestoreEnabled(boolean autoSaveRestoreEnanbled) {
-            setFlags(autoSaveRestoreEnanbled ? PF_AUTORESTORE : 0, PF_AUTORESTORE);
+        public B autoSaveRestoreEnabled(boolean autoSaveRestoreEnabled) {
+            setFlags(autoSaveRestoreEnabled ? PF_AUTORESTORE : 0, PF_AUTORESTORE);
             return (B) this;
         }
 
@@ -938,10 +938,10 @@
     }
 
     final static boolean isPasswordVariant(int inputType) {
-        final int variantion = inputType & InputType.TYPE_MASK_VARIATION;
-        return variantion == InputType.TYPE_TEXT_VARIATION_PASSWORD
-                || variantion == InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD
-                || variantion == InputType.TYPE_TEXT_VARIATION_WEB_PASSWORD;
+        final int variation = inputType & InputType.TYPE_MASK_VARIATION;
+        return variation == InputType.TYPE_TEXT_VARIATION_PASSWORD
+                || variation == InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD
+                || variation == InputType.TYPE_TEXT_VARIATION_WEB_PASSWORD;
     }
 
     final boolean needAutoSaveTitle() {
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/GuidedActionsStylist.java b/v17/leanback/src/android/support/v17/leanback/widget/GuidedActionsStylist.java
index 74b02ab..90df9de 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/GuidedActionsStylist.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/GuidedActionsStylist.java
@@ -1073,6 +1073,7 @@
                     }
                     mSubActionsGridView.removeOnLayoutChangeListener(this);
                     mMainView.post(new Runnable() {
+                        @Override
                         public void run() {
                             if (mMainView == null) {
                                 return;
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/HorizontalGridView.java b/v17/leanback/src/android/support/v17/leanback/widget/HorizontalGridView.java
index e989ca4..6bdae61 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/HorizontalGridView.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/HorizontalGridView.java
@@ -37,7 +37,7 @@
  * {@link RecyclerView.Adapter} can optionally implement {@link FacetProviderAdapter} which
  * provides {@link FacetProvider} for a given view type;  {@link RecyclerView.ViewHolder}
  * can also implement {@link FacetProvider}.  Facet from ViewHolder
- * has a higher priority than the one from FacetProiderAdapter associated with viewType.
+ * has a higher priority than the one from FacetProviderAdapter associated with viewType.
  * Supported optional facets are:
  * <ol>
  * <li> {@link ItemAlignmentFacet}
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/ListRowPresenter.java b/v17/leanback/src/android/support/v17/leanback/widget/ListRowPresenter.java
index 39b4863..94acd99 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/ListRowPresenter.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/ListRowPresenter.java
@@ -762,7 +762,7 @@
      * return new ShadowOverlayHelper.Options().roundedCornerRadius(10);
      * </code>
      *
-     * @return The options to be used for shadow, overlay and rouded corner.
+     * @return The options to be used for shadow, overlay and rounded corner.
      */
     protected ShadowOverlayHelper.Options createShadowOverlayOptions() {
         return ShadowOverlayHelper.Options.DEFAULT;
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/NonOverlappingLinearLayoutWithForeground.java b/v17/leanback/src/android/support/v17/leanback/widget/NonOverlappingLinearLayoutWithForeground.java
index 52832e9..a486fc1 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/NonOverlappingLinearLayoutWithForeground.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/NonOverlappingLinearLayoutWithForeground.java
@@ -47,7 +47,7 @@
         super(context, attrs, defStyle);
         if (context.getApplicationInfo().targetSdkVersion >= VERSION_M
                 && VERSION.SDK_INT >= VERSION_M) {
-            // dont need do anything, base View constructor >=M already reads the foreground if
+            // don't need do anything, base View constructor >=M already reads the foreground if
             // targetSDK is >= M.
         } else {
             // in other cases, including M but targetSDK is less than M, we need setForeground in
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/SearchBar.java b/v17/leanback/src/android/support/v17/leanback/widget/SearchBar.java
index ef2c094..d9d44d2 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/SearchBar.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/SearchBar.java
@@ -545,7 +545,7 @@
 
         if (!mRecognizing) return;
 
-        // Edit text content was cleared when starting recogition; ensure the content is restored
+        // Edit text content was cleared when starting recognition; ensure the content is restored
         // in error cases
         mSearchTextEditor.setText(mSearchQuery);
         mSearchTextEditor.setHint(mHint);
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/ShadowOverlayContainer.java b/v17/leanback/src/android/support/v17/leanback/widget/ShadowOverlayContainer.java
index fdb7c71..3e9f320 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/ShadowOverlayContainer.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/ShadowOverlayContainer.java
@@ -148,7 +148,7 @@
 
     /**
      * Sets the shadow type to {@link #SHADOW_DYNAMIC} if supported and sets the elevation/Z
-     * values to the given parameteres.
+     * values to the given parameters.
      */
     public void useDynamicShadow(float unfocusedZ, float focusedZ) {
         if (mInitialized) {
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/ShadowOverlayHelper.java b/v17/leanback/src/android/support/v17/leanback/widget/ShadowOverlayHelper.java
index 5f942c6..75063db 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/ShadowOverlayHelper.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/ShadowOverlayHelper.java
@@ -17,12 +17,9 @@
 import android.content.res.Resources;
 import android.graphics.drawable.ColorDrawable;
 import android.graphics.drawable.Drawable;
-import android.os.Build;
 import android.support.v17.leanback.R;
 import android.support.v17.leanback.system.Settings;
-import android.util.AttributeSet;
 import android.view.ViewGroup;
-import android.view.ViewGroup.LayoutParams;
 import android.view.View;
 
 
@@ -163,7 +160,7 @@
 
             // figure out shadow type and if we need use wrapper:
             if (helper.mNeedsShadow) {
-                // if static shadow is prefered or dynamic shadow is not supported,
+                // if static shadow is preferred or dynamic shadow is not supported,
                 // use static shadow,  otherwise use dynamic shadow.
                 if (!preferZOrder || !supportsDynamicShadow()) {
                     helper.mShadowType = SHADOW_STATIC;
@@ -216,7 +213,7 @@
          * Set value of focused and unfocused Z value for shadow.
          *
          * @param unfocusedZ   Number of pixels for unfocused Z value.
-         * @param focusedZ     Number of pixels for foucsed Z value.
+         * @param focusedZ     Number of pixels for focused Z value.
          * @return  The Options object itself.
          */
         public Options dynamicShadowZ(float unfocusedZ, float focusedZ){
@@ -408,7 +405,7 @@
      * See also {@link ShadowOverlayContainer#setShadowFocusLevel(float)}.
      */
     public static void setNoneWrapperShadowFocusLevel(View view, float level) {
-        setShadowFocusLevel(getNoneWrapperDyamicShadowImpl(view), SHADOW_DYNAMIC, level);
+        setShadowFocusLevel(getNoneWrapperDynamicShadowImpl(view), SHADOW_DYNAMIC, level);
     }
 
     /**
@@ -418,7 +415,7 @@
         if (needsWrapper()) {
             ((ShadowOverlayContainer) view).setShadowFocusLevel(level);
         } else {
-            setShadowFocusLevel(getNoneWrapperDyamicShadowImpl(view), SHADOW_DYNAMIC, level);
+            setShadowFocusLevel(getNoneWrapperDynamicShadowImpl(view), SHADOW_DYNAMIC, level);
         }
     }
 
@@ -443,7 +440,7 @@
         }
     }
 
-    static Object getNoneWrapperDyamicShadowImpl(View view) {
+    static Object getNoneWrapperDynamicShadowImpl(View view) {
         return view.getTag(R.id.lb_shadow_impl);
     }
 
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/StaggeredGridDefault.java b/v17/leanback/src/android/support/v17/leanback/widget/StaggeredGridDefault.java
index 54e03e6..975c43c 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/StaggeredGridDefault.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/StaggeredGridDefault.java
@@ -240,7 +240,7 @@
             // find start item index of "previous column"
             int edgeLimitSearchIndex = findRowEdgeLimitSearchIndex(true);
             if (edgeLimitSearchIndex < 0) {
-                // if "previous colummn" is not found, using edgeLimit of
+                // if "previous column" is not found, using edgeLimit of
                 // first row currently in grid
                 edgeLimit = Integer.MIN_VALUE;
                 for (int i = 0; i < mNumRows; i++) {
@@ -340,7 +340,7 @@
             // find start item index of "previous column"
             int edgeLimitSearchIndex = findRowEdgeLimitSearchIndex(false);
             if (edgeLimitSearchIndex < 0) {
-                // if "previous colummn" is not found, using edgeLimit of
+                // if "previous column" is not found, using edgeLimit of
                 // last row currently in grid and fill from upper row
                 rowIndex = rowIndex - 1;
                 edgeLimit = Integer.MAX_VALUE;
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/StreamingTextView.java b/v17/leanback/src/android/support/v17/leanback/widget/StreamingTextView.java
index 41bec11..b4b4b8f 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/StreamingTextView.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/StreamingTextView.java
@@ -146,7 +146,7 @@
 
         // Copy the text and spans to a SpannedString, since editable text
         // doesn't redraw in invalidate() when hardware accelerated
-        // if the text or spans havent't changed. (probably a framework bug)
+        // if the text or spans haven't changed. (probably a framework bug)
         updateText(new SpannedString(displayText));
 
         if (ANIMATE_DOTS_FOR_PENDING) {
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/VerticalGridPresenter.java b/v17/leanback/src/android/support/v17/leanback/widget/VerticalGridPresenter.java
index 7af5ea0..261cadc 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/VerticalGridPresenter.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/VerticalGridPresenter.java
@@ -44,7 +44,7 @@
 
         @Override
         public void onBind(final ItemBridgeAdapter.ViewHolder itemViewHolder) {
-            // Only when having an OnItemClickListner, we attach the OnClickListener.
+            // Only when having an OnItemClickListener, we attach the OnClickListener.
             if (getOnItemViewClickedListener() != null) {
                 final View itemView = itemViewHolder.mHolder.view;
                 itemView.setOnClickListener(new View.OnClickListener() {
@@ -324,7 +324,7 @@
      * return new ShadowOverlayHelper.Options().roundedCornerRadius(10);
      * </code>
      *
-     * @return   The options to be used for shadow, overlay and rouded corner.
+     * @return   The options to be used for shadow, overlay and rounded corner.
      */
     protected ShadowOverlayHelper.Options createShadowOverlayOptions() {
         return ShadowOverlayHelper.Options.DEFAULT;
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/VerticalGridView.java b/v17/leanback/src/android/support/v17/leanback/widget/VerticalGridView.java
index 849063f..5cb2ec8 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/VerticalGridView.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/VerticalGridView.java
@@ -27,7 +27,7 @@
  * {@link RecyclerView.Adapter} can optionally implement {@link FacetProviderAdapter} which
  * provides {@link FacetProvider} for a given view type;  {@link RecyclerView.ViewHolder}
  * can also implement {@link FacetProvider}.  Facet from ViewHolder
- * has a higher priority than the one from FacetProiderAdapter associated with viewType.
+ * has a higher priority than the one from FacetProviderAdapter associated with viewType.
  * Supported optional facets are:
  * <ol>
  * <li> {@link ItemAlignmentFacet}
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/picker/DatePicker.java b/v17/leanback/src/android/support/v17/leanback/widget/picker/DatePicker.java
index 06aa4fe..542634b 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/picker/DatePicker.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/picker/DatePicker.java
@@ -399,6 +399,7 @@
         // in scroll pass.  UpdateSpinner can be called in a scroll pass, UpdateSpinner() may
         // notifyDataSetChange to update the range.
         post(new Runnable() {
+            @Override
             public void run() {
                 updateSpinnersImpl(animation);
             }
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/picker/Picker.java b/v17/leanback/src/android/support/v17/leanback/widget/picker/Picker.java
index 1f35aae..c2048f6 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/picker/Picker.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/picker/Picker.java
@@ -87,10 +87,10 @@
 
     /**
      * Sets separator String between Picker columns.
-     * @param seperator Separator String between Picker columns.
+     * @param separator Separator String between Picker columns.
      */
-    public final void setSeparator(CharSequence seperator) {
-        mSeparator = seperator;
+    public final void setSeparator(CharSequence separator) {
+        mSeparator = separator;
     }
 
     /**
@@ -190,7 +190,7 @@
             final int colIndex = i;
             final VerticalGridView columnView = (VerticalGridView) inflater.inflate(
                     R.layout.lb_picker_column, mPickerView, false);
-            // we dont want VerticalGridView to receive focus.
+            // we don't want VerticalGridView to receive focus.
             updateColumnSize(columnView);
             // always center aligned, not aligning selected item on top/bottom edge.
             columnView.setWindowAlignment(VerticalGridView.WINDOW_ALIGN_NO_EDGE);
diff --git a/v17/leanback/tests/Android.mk b/v17/leanback/tests/Android.mk
new file mode 100644
index 0000000..db64d88
--- /dev/null
+++ b/v17/leanback/tests/Android.mk
@@ -0,0 +1,43 @@
+# Copyright (C) 2015 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.
+
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := tests
+
+LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_RESOURCE_DIR = \
+        $(LOCAL_PATH)/res \
+        $(LOCAL_PATH)/../res \
+        $(LOCAL_PATH)/../../v7/recyclerview/res
+LOCAL_AAPT_FLAGS := \
+        --auto-add-overlay \
+        --extra-packages android.support.v17.leanback \
+        --extra-packages android.support.v7.recyclerview
+
+LOCAL_STATIC_JAVA_LIBRARIES := \
+        android-support-v4 \
+        android-support-v7-recyclerview \
+        android-support-v17-leanback \
+        android-support-test \
+        mockito-target
+
+LOCAL_PACKAGE_NAME := AndroidLeanbackTests
+
+include $(BUILD_PACKAGE)
diff --git a/v17/leanback/tests/AndroidManifest.xml b/v17/leanback/tests/AndroidManifest.xml
new file mode 100644
index 0000000..5c421e3
--- /dev/null
+++ b/v17/leanback/tests/AndroidManifest.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+          package="android.support.v17.leanback.test">
+    <uses-sdk android:minSdkVersion="17"  android:targetSdkVersion="23"/>
+
+    <!--
+        This declares that this application uses the instrumentation test runner targeting
+        the package of android.support.v17.leanback.test. To run the tests use the command:
+        "adb shell am instrument -w android.support.v17.leanback.test/android.test.InstrumentationTestRunner"
+    -->
+    <instrumentation
+            android:targetPackage="android.support.v17.leanback.test"
+            android:name="android.test.InstrumentationTestRunner" />
+
+    <application
+            android:supportsRtl="true">
+        <uses-library android:name="android.test.runner" />
+
+        <activity android:name="android.support.v17.leanback.widget.GridActivity"
+                  android:exported="true" />
+
+        <activity
+                android:name="android.support.v17.leanback.app.wizard.GuidedStepAttributesTestActivity"
+                android:theme="@style/Theme.Leanback.GuidedStep"
+                android:exported="true" />
+
+        <activity android:name="android.support.v17.leanback.app.BrowseFragmentTestActivity"
+                  android:theme="@style/Theme.Leanback.Browse"
+                  android:exported="true" />
+
+        <activity android:name="android.support.v17.leanback.app.BrowseSupportFragmentTestActivity"
+                  android:theme="@style/Theme.Leanback.Browse"
+                  android:exported="true" />
+
+    </application>
+
+</manifest>
diff --git a/v17/tests/NO_DOCS b/v17/leanback/tests/NO_DOCS
similarity index 100%
rename from v17/tests/NO_DOCS
rename to v17/leanback/tests/NO_DOCS
diff --git a/v17/leanback/tests/README.txt b/v17/leanback/tests/README.txt
new file mode 100644
index 0000000..cf64349
--- /dev/null
+++ b/v17/leanback/tests/README.txt
@@ -0,0 +1,9 @@
+Test project for support leanback.
+
+RUN TESTS
+Using gradle
+1. cd frameworks/support
+2. ./gradlew support-leanback-v17:connectedCheck --info
+
+Using adb
+adb shell am instrument -w android.support.v17.leanback.tests/android.test.InstrumentationTestRunner
diff --git a/v17/tests/generatev4.py b/v17/leanback/tests/generatev4.py
similarity index 100%
rename from v17/tests/generatev4.py
rename to v17/leanback/tests/generatev4.py
diff --git a/v17/leanback/tests/java/android/support/v17/leanback/app/BrowseFragmentTest.java b/v17/leanback/tests/java/android/support/v17/leanback/app/BrowseFragmentTest.java
new file mode 100644
index 0000000..dfeb12e
--- /dev/null
+++ b/v17/leanback/tests/java/android/support/v17/leanback/app/BrowseFragmentTest.java
@@ -0,0 +1,150 @@
+/*
+ * Copyright (C) 2015 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 android.support.v17.leanback.app;
+
+import android.support.v17.leanback.test.R;
+import android.test.ActivityInstrumentationTestCase2;
+import android.text.Selection;
+import android.text.Spannable;
+import android.util.Log;
+import android.util.SparseArray;
+import android.view.KeyEvent;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import android.support.v17.leanback.widget.Presenter;
+import android.support.v17.leanback.widget.ListRowPresenter;
+import android.app.Instrumentation;
+import android.content.Intent;
+import android.os.Parcelable;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Iterator;
+
+/**
+ * @hide from javadoc
+ */
+public class BrowseFragmentTest extends
+        ActivityInstrumentationTestCase2<BrowseFragmentTestActivity> {
+
+    static final long TRANSITION_LENGTH = 1000;
+    static final long HORIZONTAL_SCROLL_WAIT = 2000;
+    static final long TIMEOUT = 10000;
+
+    Instrumentation mInstrumentation;
+    BrowseFragmentTestActivity mActivity;
+
+    static class WaitLock {
+        final boolean[] finished = new boolean[1];
+        String message;
+        long timeout;
+        public WaitLock(long timeout, String message) {
+            this.message = message;
+            this.timeout = timeout;
+        }
+        public void waitForFinish() {
+            long totalSleep = 0;
+            try {
+            while (!finished[0]) {
+                if ((totalSleep += 100) >= timeout) {
+                    assertTrue(message, false);
+                }
+                Thread.sleep(100);
+            }
+            } catch (InterruptedException ex) {
+                assertTrue("Interrupted during wait", false);
+            }
+        }
+        public void signalFinish() {
+            finished[0] = true;
+        }
+    }
+
+    public BrowseFragmentTest() {
+        super(BrowseFragmentTestActivity.class);
+    }
+
+    private void initActivity(Intent intent) {
+        setActivityIntent(intent);
+        mActivity = getActivity();
+        try {
+        Thread.sleep(intent.getLongExtra(BrowseFragmentTestActivity.EXTRA_LOAD_DATA_DELAY,
+                BrowseTestFragment.DEFAULT_LOAD_DATA_DELAY) + TRANSITION_LENGTH);
+        } catch (InterruptedException ex) {
+        }
+    }
+
+    public void testTwoBackKeysWithBackStack() throws Throwable {
+        mInstrumentation = getInstrumentation();
+        Intent intent = new Intent(mInstrumentation.getContext(), BrowseFragmentTestActivity.class);
+        intent.putExtra(BrowseFragmentTestActivity.EXTRA_LOAD_DATA_DELAY, (long) 1000);
+        intent.putExtra(BrowseFragmentTestActivity.EXTRA_ADD_TO_BACKSTACK , true);
+        initActivity(intent);
+
+        sendKeys(KeyEvent.KEYCODE_DPAD_RIGHT);
+        Thread.sleep(TRANSITION_LENGTH);
+
+        sendKeys(KeyEvent.KEYCODE_BACK, KeyEvent.KEYCODE_BACK);
+    }
+
+    public void testTwoBackKeysWithoutBackStack() throws Throwable {
+        mInstrumentation = getInstrumentation();
+        Intent intent = new Intent(mInstrumentation.getContext(), BrowseFragmentTestActivity.class);
+        intent.putExtra(BrowseFragmentTestActivity.EXTRA_LOAD_DATA_DELAY, (long) 1000);
+        intent.putExtra(BrowseFragmentTestActivity.EXTRA_ADD_TO_BACKSTACK , false);
+        initActivity(intent);
+
+        sendKeys(KeyEvent.KEYCODE_DPAD_RIGHT);
+        Thread.sleep(TRANSITION_LENGTH);
+
+        sendKeys(KeyEvent.KEYCODE_BACK, KeyEvent.KEYCODE_BACK);
+    }
+
+    public void testSelectCardOnARow() throws Throwable {
+        mInstrumentation = getInstrumentation();
+        Intent intent = new Intent(mInstrumentation.getContext(), BrowseFragmentTestActivity.class);
+        intent.putExtra(BrowseFragmentTestActivity.EXTRA_LOAD_DATA_DELAY, (long) 1000);
+        intent.putExtra(BrowseFragmentTestActivity.EXTRA_ADD_TO_BACKSTACK , true);
+        initActivity(intent);
+
+        final WaitLock waitLock = new WaitLock(TIMEOUT, "Timeout while waiting scroll to the row");
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mActivity.getBrowseTestFragment().setSelectedPosition(10, true,
+                        new ListRowPresenter.SelectItemViewHolderTask(20) {
+                    @Override
+                    public void run(Presenter.ViewHolder holder) {
+                        super.run(holder);
+                        waitLock.signalFinish();
+                    }
+                });
+            }
+        });
+        waitLock.waitForFinish();
+
+        // wait for scrolling to the item.
+        Thread.sleep(HORIZONTAL_SCROLL_WAIT);
+        ListRowPresenter.ViewHolder row = (ListRowPresenter.ViewHolder) mActivity
+                .getBrowseTestFragment().getRowsFragment().getRowViewHolder(mActivity
+                        .getBrowseTestFragment().getSelectedPosition());
+        assertEquals(20, row.getGridView().getSelectedPosition());
+    }
+}
diff --git a/v17/leanback/tests/java/android/support/v17/leanback/app/BrowseFragmentTestActivity.java b/v17/leanback/tests/java/android/support/v17/leanback/app/BrowseFragmentTestActivity.java
new file mode 100644
index 0000000..d867c9d
--- /dev/null
+++ b/v17/leanback/tests/java/android/support/v17/leanback/app/BrowseFragmentTestActivity.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2015 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 android.support.v17.leanback.app;
+
+import android.app.Activity;
+import android.app.FragmentTransaction;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.support.v17.leanback.test.R;
+
+/**
+ * @hide from javadoc
+ */
+public class BrowseFragmentTestActivity extends Activity {
+
+    public static final String EXTRA_ADD_TO_BACKSTACK = "addToBackStack";
+    public static final String EXTRA_NUM_ROWS = "numRows";
+    public static final String EXTRA_REPEAT_PER_ROW = "repeatPerRow";
+    public static final String EXTRA_LOAD_DATA_DELAY = "loadDataDelay";
+    public static final String EXTRA_TEST_ENTRANCE_TRANSITION = "testEntranceTransition";
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        Intent intent = getIntent();
+
+        BrowseTestFragment.NUM_ROWS = intent.getIntExtra(EXTRA_NUM_ROWS,
+                BrowseTestFragment.DEFAULT_NUM_ROWS);
+        BrowseTestFragment.REPEAT_PER_ROW = intent.getIntExtra(EXTRA_REPEAT_PER_ROW,
+                BrowseTestFragment.DEFAULT_REPEAT_PER_ROW);
+        BrowseTestFragment.LOAD_DATA_DELAY = intent.getLongExtra(EXTRA_LOAD_DATA_DELAY,
+                BrowseTestFragment.DEFAULT_LOAD_DATA_DELAY);
+        BrowseTestFragment.TEST_ENTRANCE_TRANSITION = intent.getBooleanExtra(
+                EXTRA_TEST_ENTRANCE_TRANSITION,
+                BrowseTestFragment.DEFAULT_TEST_ENTRANCE_TRANSITION);
+        setContentView(R.layout.browse);
+        FragmentTransaction ft = getFragmentManager().beginTransaction();
+        ft.replace(R.id.main_frame, new BrowseTestFragment());
+        if (intent.getBooleanExtra(EXTRA_ADD_TO_BACKSTACK, false)) {
+            ft.addToBackStack(null);
+        }
+        ft.commit();
+    }
+
+    public BrowseTestFragment getBrowseTestFragment() {
+        return (BrowseTestFragment) getFragmentManager().findFragmentById(R.id.main_frame);
+    }
+}
diff --git a/v17/leanback/tests/java/android/support/v17/leanback/app/BrowseSupportFragmentTest.java b/v17/leanback/tests/java/android/support/v17/leanback/app/BrowseSupportFragmentTest.java
new file mode 100644
index 0000000..d8ca7d6
--- /dev/null
+++ b/v17/leanback/tests/java/android/support/v17/leanback/app/BrowseSupportFragmentTest.java
@@ -0,0 +1,153 @@
+/* This file is auto-generated from BrowseFrgamentTest.java.  DO NOT MODIFY. */
+
+/*
+ * Copyright (C) 2015 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 android.support.v17.leanback.app;
+
+import android.support.v17.leanback.test.R;
+import android.test.ActivityInstrumentationTestCase2;
+import android.text.Selection;
+import android.text.Spannable;
+import android.util.Log;
+import android.util.SparseArray;
+import android.view.KeyEvent;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import android.support.v17.leanback.widget.Presenter;
+import android.support.v17.leanback.widget.ListRowPresenter;
+import android.app.Instrumentation;
+import android.content.Intent;
+import android.os.Parcelable;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Iterator;
+
+/**
+ * @hide from javadoc
+ */
+public class BrowseSupportFragmentTest extends
+        ActivityInstrumentationTestCase2<BrowseSupportFragmentTestActivity> {
+
+    static final long TRANSITION_LENGTH = 1000;
+    static final long HORIZONTAL_SCROLL_WAIT = 2000;
+    static final long TIMEOUT = 10000;
+
+    Instrumentation mInstrumentation;
+    BrowseSupportFragmentTestActivity mActivity;
+
+    static class WaitLock {
+        final boolean[] finished = new boolean[1];
+        String message;
+        long timeout;
+        public WaitLock(long timeout, String message) {
+            this.message = message;
+            this.timeout = timeout;
+        }
+        public void waitForFinish() {
+            long totalSleep = 0;
+            try {
+            while (!finished[0]) {
+                if ((totalSleep += 100) >= timeout) {
+                    assertTrue(message, false);
+                }
+                Thread.sleep(100);
+            }
+            } catch (InterruptedException ex) {
+                assertTrue("Interrupted during wait", false);
+            }
+        }
+        public void signalFinish() {
+            finished[0] = true;
+        }
+    }
+
+    public BrowseSupportFragmentTest() {
+        super(BrowseSupportFragmentTestActivity.class);
+    }
+
+    private void initActivity(Intent intent) {
+        setActivityIntent(intent);
+        mActivity = getActivity();
+        try {
+        Thread.sleep(intent.getLongExtra(BrowseSupportFragmentTestActivity.EXTRA_LOAD_DATA_DELAY,
+                BrowseTestSupportFragment.DEFAULT_LOAD_DATA_DELAY) + TRANSITION_LENGTH);
+        } catch (InterruptedException ex) {
+        }
+    }
+
+    public void testTwoBackKeysWithBackStack() throws Throwable {
+        mInstrumentation = getInstrumentation();
+        Intent intent = new Intent(mInstrumentation.getContext(), BrowseSupportFragmentTestActivity.class);
+        intent.putExtra(BrowseSupportFragmentTestActivity.EXTRA_LOAD_DATA_DELAY, (long) 1000);
+        intent.putExtra(BrowseSupportFragmentTestActivity.EXTRA_ADD_TO_BACKSTACK , true);
+        initActivity(intent);
+
+        sendKeys(KeyEvent.KEYCODE_DPAD_RIGHT);
+        Thread.sleep(TRANSITION_LENGTH);
+
+        sendKeys(KeyEvent.KEYCODE_BACK, KeyEvent.KEYCODE_BACK);
+    }
+
+    public void testTwoBackKeysWithoutBackStack() throws Throwable {
+        mInstrumentation = getInstrumentation();
+        Intent intent = new Intent(mInstrumentation.getContext(), BrowseSupportFragmentTestActivity.class);
+        intent.putExtra(BrowseSupportFragmentTestActivity.EXTRA_LOAD_DATA_DELAY, (long) 1000);
+        intent.putExtra(BrowseSupportFragmentTestActivity.EXTRA_ADD_TO_BACKSTACK , false);
+        initActivity(intent);
+
+        sendKeys(KeyEvent.KEYCODE_DPAD_RIGHT);
+        Thread.sleep(TRANSITION_LENGTH);
+
+        sendKeys(KeyEvent.KEYCODE_BACK, KeyEvent.KEYCODE_BACK);
+    }
+
+    public void testSelectCardOnARow() throws Throwable {
+        mInstrumentation = getInstrumentation();
+        Intent intent = new Intent(mInstrumentation.getContext(), BrowseSupportFragmentTestActivity.class);
+        intent.putExtra(BrowseSupportFragmentTestActivity.EXTRA_LOAD_DATA_DELAY, (long) 1000);
+        intent.putExtra(BrowseSupportFragmentTestActivity.EXTRA_ADD_TO_BACKSTACK , true);
+        initActivity(intent);
+
+        final WaitLock waitLock = new WaitLock(TIMEOUT, "Timeout while waiting scroll to the row");
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mActivity.getBrowseTestSupportFragment().setSelectedPosition(10, true,
+                        new ListRowPresenter.SelectItemViewHolderTask(20) {
+                    @Override
+                    public void run(Presenter.ViewHolder holder) {
+                        super.run(holder);
+                        waitLock.signalFinish();
+                    }
+                });
+            }
+        });
+        waitLock.waitForFinish();
+
+        // wait for scrolling to the item.
+        Thread.sleep(HORIZONTAL_SCROLL_WAIT);
+        ListRowPresenter.ViewHolder row = (ListRowPresenter.ViewHolder) mActivity
+                .getBrowseTestSupportFragment().getRowsSupportFragment().getRowViewHolder(mActivity
+                        .getBrowseTestSupportFragment().getSelectedPosition());
+        assertEquals(20, row.getGridView().getSelectedPosition());
+    }
+
+}
diff --git a/v17/leanback/tests/java/android/support/v17/leanback/app/BrowseSupportFragmentTestActivity.java b/v17/leanback/tests/java/android/support/v17/leanback/app/BrowseSupportFragmentTestActivity.java
new file mode 100644
index 0000000..349e2bd
--- /dev/null
+++ b/v17/leanback/tests/java/android/support/v17/leanback/app/BrowseSupportFragmentTestActivity.java
@@ -0,0 +1,64 @@
+/* This file is auto-generated from BrowseFragmentTestActivity.java.  DO NOT MODIFY. */
+
+/*
+ * Copyright (C) 2015 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 android.support.v17.leanback.app;
+
+import android.support.v4.app.FragmentActivity;
+import android.support.v4.app.FragmentTransaction;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.support.v17.leanback.test.R;
+
+/**
+ * @hide from javadoc
+ */
+public class BrowseSupportFragmentTestActivity extends FragmentActivity {
+
+    public static final String EXTRA_ADD_TO_BACKSTACK = "addToBackStack";
+    public static final String EXTRA_NUM_ROWS = "numRows";
+    public static final String EXTRA_REPEAT_PER_ROW = "repeatPerRow";
+    public static final String EXTRA_LOAD_DATA_DELAY = "loadDataDelay";
+    public static final String EXTRA_TEST_ENTRANCE_TRANSITION = "testEntranceTransition";
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        Intent intent = getIntent();
+
+        BrowseTestSupportFragment.NUM_ROWS = intent.getIntExtra(EXTRA_NUM_ROWS,
+                BrowseTestSupportFragment.DEFAULT_NUM_ROWS);
+        BrowseTestSupportFragment.REPEAT_PER_ROW = intent.getIntExtra(EXTRA_REPEAT_PER_ROW,
+                BrowseTestSupportFragment.DEFAULT_REPEAT_PER_ROW);
+        BrowseTestSupportFragment.LOAD_DATA_DELAY = intent.getLongExtra(EXTRA_LOAD_DATA_DELAY,
+                BrowseTestSupportFragment.DEFAULT_LOAD_DATA_DELAY);
+        BrowseTestSupportFragment.TEST_ENTRANCE_TRANSITION = intent.getBooleanExtra(
+                EXTRA_TEST_ENTRANCE_TRANSITION,
+                BrowseTestSupportFragment.DEFAULT_TEST_ENTRANCE_TRANSITION);
+        setContentView(R.layout.browse);
+        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
+        ft.replace(R.id.main_frame, new BrowseTestSupportFragment());
+        if (intent.getBooleanExtra(EXTRA_ADD_TO_BACKSTACK, false)) {
+            ft.addToBackStack(null);
+        }
+        ft.commit();
+    }
+
+    public BrowseTestSupportFragment getBrowseTestSupportFragment() {
+        return (BrowseTestSupportFragment) getSupportFragmentManager().findFragmentById(R.id.main_frame);
+    }
+}
diff --git a/v17/tests/src/android/support/v17/leanback/app/BrowseTestFragment.java b/v17/leanback/tests/java/android/support/v17/leanback/app/BrowseTestFragment.java
similarity index 100%
rename from v17/tests/src/android/support/v17/leanback/app/BrowseTestFragment.java
rename to v17/leanback/tests/java/android/support/v17/leanback/app/BrowseTestFragment.java
diff --git a/v17/tests/src/android/support/v17/leanback/app/BrowseTestSupportFragment.java b/v17/leanback/tests/java/android/support/v17/leanback/app/BrowseTestSupportFragment.java
similarity index 100%
rename from v17/tests/src/android/support/v17/leanback/app/BrowseTestSupportFragment.java
rename to v17/leanback/tests/java/android/support/v17/leanback/app/BrowseTestSupportFragment.java
diff --git a/v17/leanback/tests/java/android/support/v17/leanback/app/ListRowDataAdapterTest.java b/v17/leanback/tests/java/android/support/v17/leanback/app/ListRowDataAdapterTest.java
new file mode 100644
index 0000000..212871a
--- /dev/null
+++ b/v17/leanback/tests/java/android/support/v17/leanback/app/ListRowDataAdapterTest.java
@@ -0,0 +1,107 @@
+package android.support.v17.leanback.app;
+
+import android.support.v17.leanback.widget.ArrayObjectAdapter;
+import android.support.v17.leanback.widget.DividerRow;
+import android.support.v17.leanback.widget.HeaderItem;
+import android.support.v17.leanback.widget.ListRow;
+import android.support.v17.leanback.widget.PresenterSelector;
+import android.support.v17.leanback.widget.SectionRow;
+import android.test.suitebuilder.annotation.SmallTest;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Unit test for {@link ListRowDataAdapter} class.
+ */
+@RunWith(JUnit4.class)
+@SmallTest
+public class ListRowDataAdapterTest {
+    public static final int ITEM_COUNT = 4;
+
+    @Mock
+    private PresenterSelector presenterSelector;
+
+    @Before
+    public void setUp() throws Exception {
+        MockitoAnnotations.initMocks(this);
+    }
+
+    @Test
+    public void adapterSize_nonVisibleRowPresent() {
+        ArrayObjectAdapter adapter = new ArrayObjectAdapter(presenterSelector);
+        adapter.add(new SectionRow("section 1"));
+        for (int i = 0; i < ITEM_COUNT; i++) {
+            HeaderItem headerItem = new HeaderItem(i, "header "+i);
+            adapter.add(new ListRow(headerItem, createListRowAdapter()));
+        }
+
+        ListRowDataAdapter listRowDataAdapter = new ListRowDataAdapter(adapter);
+        assertEquals(5, listRowDataAdapter.size());
+
+        adapter.add(new DividerRow());
+        assertEquals(5, listRowDataAdapter.size());
+
+        adapter.add(new DividerRow());
+        assertEquals(5, listRowDataAdapter.size());
+    }
+
+    @Test
+    public void adapterSize_nonVisibleRowInserted() {
+        ArrayObjectAdapter adapter = new ArrayObjectAdapter(presenterSelector);
+        adapter.add(new SectionRow("section 1"));
+        for (int i = 0; i < ITEM_COUNT; i++) {
+            HeaderItem headerItem = new HeaderItem(i, "header "+i);
+            adapter.add(new ListRow(headerItem, createListRowAdapter()));
+        }
+
+        ListRowDataAdapter listRowDataAdapter = new ListRowDataAdapter(adapter);
+        assertEquals(5, listRowDataAdapter.size());
+
+        adapter.add(new DividerRow());
+        assertEquals(5, listRowDataAdapter.size());
+
+        adapter.add(new ListRow(new HeaderItem(5, "header 5"), createListRowAdapter()));
+        assertEquals(7, listRowDataAdapter.size());
+
+        adapter.add(new DividerRow());
+        assertEquals(7, listRowDataAdapter.size());
+
+        adapter.add(5, new ListRow(new HeaderItem(5, "header 5"), createListRowAdapter()));
+        assertEquals(8, listRowDataAdapter.size());
+    }
+
+    @Test
+    public void adapterSize_nonVisibleRowRemoved() {
+        ArrayObjectAdapter adapter = new ArrayObjectAdapter(presenterSelector);
+        adapter.add(new SectionRow("section 1"));
+        for (int i = 0; i < ITEM_COUNT; i++) {
+            HeaderItem headerItem = new HeaderItem(i, "header "+i);
+            adapter.add(new ListRow(headerItem, createListRowAdapter()));
+        }
+
+        ListRowDataAdapter listRowDataAdapter = new ListRowDataAdapter(adapter);
+        assertEquals(5, listRowDataAdapter.size());
+
+        adapter.add(new DividerRow());
+        assertEquals(5, listRowDataAdapter.size());
+
+        adapter.removeItems(4, 1);
+        assertEquals(4, listRowDataAdapter.size());
+
+        adapter.removeItems(5, 1);
+        assertEquals(4, listRowDataAdapter.size());
+    }
+
+    private ArrayObjectAdapter createListRowAdapter() {
+        ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(presenterSelector);
+        listRowAdapter.add(new Integer(1));
+        listRowAdapter.add(new Integer(2));
+        return listRowAdapter;
+    }
+}
diff --git a/v17/tests/src/android/support/v17/leanback/app/StringPresenter.java b/v17/leanback/tests/java/android/support/v17/leanback/app/StringPresenter.java
similarity index 100%
rename from v17/tests/src/android/support/v17/leanback/app/StringPresenter.java
rename to v17/leanback/tests/java/android/support/v17/leanback/app/StringPresenter.java
diff --git a/v17/leanback/tests/java/android/support/v17/leanback/app/wizard/GuidedDatePickerTest.java b/v17/leanback/tests/java/android/support/v17/leanback/app/wizard/GuidedDatePickerTest.java
new file mode 100644
index 0000000..72f4f44
--- /dev/null
+++ b/v17/leanback/tests/java/android/support/v17/leanback/app/wizard/GuidedDatePickerTest.java
@@ -0,0 +1,517 @@
+/*
+ * Copyright (C) 2016 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 android.support.v17.leanback.app.wizard;
+
+import android.app.Instrumentation;
+import android.content.Intent;
+import android.content.res.Resources;
+import android.support.v17.leanback.app.GuidedStepFragment;
+import android.support.v17.leanback.test.R;
+import android.support.v17.leanback.widget.GuidanceStylist;
+import android.support.v17.leanback.widget.GuidedAction;
+import android.support.v17.leanback.widget.GuidedDatePickerAction;
+import android.support.v17.leanback.widget.VerticalGridView;
+import android.support.v17.leanback.widget.picker.DatePicker;
+import android.test.ActivityInstrumentationTestCase2;
+import android.util.Log;
+import android.view.KeyEvent;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.LinearLayout;
+
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+
+public class GuidedDatePickerTest extends
+        ActivityInstrumentationTestCase2<GuidedStepAttributesTestActivity> {
+
+    static final long TRANSITION_LENGTH = 1000;
+    static long VERTICAL_SCROLL_WAIT = 500;
+    static long HORIZONTAL_SCROLL_WAIT = 500;
+    static final long FINAL_WAIT = 3000;
+
+    static final String TAG = "GuidedDatePickerTest";
+
+    private static final int DAY_INDEX = 0;
+    private static final int MONTH_INDEX = 1;
+    private static final int YEAR_INDEX = 2;
+    Instrumentation mInstrumentation;
+    GuidedStepAttributesTestActivity mActivity;
+
+    public GuidedDatePickerTest() {
+        super(GuidedStepAttributesTestActivity.class);
+    }
+
+    private void initActivity(Intent intent) {
+
+        setActivityIntent(intent);
+        mActivity = getActivity();
+        try {
+            Thread.sleep(2000);
+        } catch(InterruptedException e) {
+            e.printStackTrace();
+        }
+    }
+
+    private void scrollOnField(int field, int[] columnIndices, DatePicker mPickerView,
+                               int SCROLL_DIR) throws Throwable {
+
+        final GuidedStepFragment mFragment = (GuidedStepFragment)
+                mActivity.getGuidedStepTestFragment();
+
+        int mColDayIndex = columnIndices[0];
+        int mColMonthIndex = columnIndices[1];
+        int mColYearIndex = columnIndices[2];
+        int columnIndex = -1;
+        switch (field) {
+            case Calendar.DAY_OF_MONTH:
+                columnIndex = mColDayIndex;
+                break;
+            case Calendar.MONTH:
+                columnIndex = mColMonthIndex;
+                break;
+            case Calendar.YEAR:
+                columnIndex = mColYearIndex;
+        }
+
+
+        LinearLayout columnsLayout = (LinearLayout) mPickerView.getChildAt(0);
+
+        int focusedFieldPos = columnsLayout.indexOfChild(columnsLayout.getFocusedChild());
+        if (focusedFieldPos == -1) {
+            sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);
+            Thread.sleep(TRANSITION_LENGTH);
+        }
+        focusedFieldPos = columnsLayout.indexOfChild(columnsLayout.getFocusedChild());
+        assertTrue("Date field could not be focused!", (focusedFieldPos != -1));
+
+        // following is to skip the separator fields "/" which are unfocusable but counted as
+        // children of columnsLayout
+        switch (focusedFieldPos) {
+            case 0:
+                focusedFieldPos = 0;
+                break;
+            case 2:
+                focusedFieldPos = 1;
+                break;
+            case 4:
+                focusedFieldPos = 2;
+        }
+
+        // now scroll right or left to the corresponding date field as indicated by the input field
+        int horizontalScrollOffset = columnIndex - focusedFieldPos;
+
+        int horizontalScrollDir = KeyEvent.KEYCODE_DPAD_RIGHT;
+        if (horizontalScrollOffset < 0) {
+            horizontalScrollOffset = -horizontalScrollOffset;
+            horizontalScrollDir = KeyEvent.KEYCODE_DPAD_LEFT;
+        }
+        for(int i = 0; i < horizontalScrollOffset; i++) {
+            sendKeys(horizontalScrollDir);
+            Thread.sleep(HORIZONTAL_SCROLL_WAIT);
+        }
+
+
+        Calendar currentActionCal = Calendar.getInstance();
+        currentActionCal.setTimeInMillis(mPickerView.getDate());
+
+        Calendar minCal = Calendar.getInstance();
+        minCal.setTimeInMillis(mPickerView.getMinDate());
+
+        Calendar maxCal = Calendar.getInstance();
+        maxCal.setTimeInMillis(mPickerView.getMaxDate());
+
+
+        int prevColumnVal = -1;
+        int currentColumnVal = mPickerView.getColumnAt(columnIndex).getCurrentValue();
+        while( currentColumnVal != prevColumnVal ){
+            assertTrue(getActivity().getString(R.string.datepicker_test_wrong_day_value),
+                    mPickerView.getColumnAt(mColDayIndex).getCurrentValue() ==
+                            currentActionCal.get(Calendar.DAY_OF_MONTH)
+            );
+            assertTrue(getActivity().getString(R.string.datepicker_test_wrong_month_value),
+                    mPickerView.getColumnAt(mColMonthIndex).getCurrentValue() ==
+                            currentActionCal.get(Calendar.MONTH)
+            );
+            assertTrue(getActivity().getString(R.string.datepicker_test_wrong_year_value),
+                    mPickerView.getColumnAt(mColYearIndex).getCurrentValue() ==
+                            currentActionCal.get(Calendar.YEAR)
+            );
+
+            int offset = SCROLL_DIR == KeyEvent.KEYCODE_DPAD_DOWN ? 1 : -1;
+            addDate(currentActionCal, field, offset, minCal, maxCal);
+
+            sendKeys(SCROLL_DIR);
+            Thread.sleep(VERTICAL_SCROLL_WAIT);
+
+            prevColumnVal = currentColumnVal;
+            currentColumnVal = mPickerView.getColumnAt(columnIndex).getCurrentValue();
+        }
+    }
+
+    private void addDate(Calendar mCurrentDate, int field, int offset,
+                         Calendar mMinDate, Calendar mMaxDate) {
+        int maxOffset = -1;
+        int actualMinFieldValue, actualMaxFieldValue;
+
+        if ( field == Calendar.YEAR ) {
+            actualMinFieldValue = mMinDate.get(Calendar.YEAR);
+            actualMaxFieldValue = mMaxDate.get(Calendar.YEAR);
+        } else {
+            actualMinFieldValue = mCurrentDate.getActualMinimum(field);
+            actualMaxFieldValue = mCurrentDate.getActualMaximum(field);
+        }
+
+        if ( offset > 0 ) {
+            maxOffset = Math.min(
+                    actualMaxFieldValue - mCurrentDate.get(field), offset);
+            mCurrentDate.add(field, maxOffset);
+            if (mCurrentDate.after(mMaxDate)) {
+                mCurrentDate.setTimeInMillis(mMaxDate.getTimeInMillis());
+            }
+        } else {
+            maxOffset = Math.max(
+                    actualMinFieldValue - mCurrentDate.get(field), offset);
+            mCurrentDate.add(field, Math.max(offset, maxOffset));
+            if (mCurrentDate.before(mMinDate)) {
+                mCurrentDate.setTimeInMillis(mMinDate.getTimeInMillis());
+            }
+        }
+    }
+
+    public void testDifferentMonthLengths() throws Throwable {
+
+        mInstrumentation = getInstrumentation();
+        Intent intent = new Intent(mInstrumentation.getContext(),
+                GuidedStepAttributesTestActivity.class);
+        Resources res = mInstrumentation.getContext().getResources();
+
+        final int NUM_DATE_ACTIONS = 1;
+
+        String title = "Date Picker Transition Test";
+        String breadcrumb = "Month Transition Test Demo";
+        String description = "Testing the transition between longer to shorter months";
+        GuidanceStylist.Guidance guidance = new GuidanceStylist.Guidance(title, description,
+                breadcrumb, null);
+
+        List<GuidedAction> actionList = new ArrayList<>();
+
+        Calendar cal = Calendar.getInstance();
+
+        cal.set(Calendar.YEAR, 2016);
+        cal.set(Calendar.MONTH, Calendar.JANUARY);
+        cal.set(Calendar.DAY_OF_MONTH, 30);
+        Date initialDate = cal.getTime();
+
+        GuidedDatePickerAction action = new GuidedDatePickerAction.Builder(
+                mInstrumentation.getContext())
+                .id(0)
+                .title("Date")
+                .date(initialDate.getTime())
+                .datePickerFormat("DMY")
+                .build();
+
+        actionList.add(action);
+
+        GuidedStepAttributesTestFragment.clear();
+        GuidedStepAttributesTestFragment.GUIDANCE = guidance;
+        GuidedStepAttributesTestFragment.ACTION_LIST = actionList;
+
+        initActivity(intent);
+
+        DatePicker mPickerView = (DatePicker) mActivity.findViewById(
+                R.id.guidedactions_activator_item);
+
+        final GuidedStepFragment mFragment = (GuidedStepFragment) mActivity.
+                getGuidedStepTestFragment();
+        traverseMonths(mPickerView, (GuidedDatePickerAction) actionList.get(0));
+        Thread.sleep(FINAL_WAIT);
+    }
+
+    private void traverseMonths(DatePicker mPickerView, GuidedDatePickerAction dateAction)
+            throws Throwable{
+
+        final GuidedStepFragment mFragment = (GuidedStepFragment)
+                mActivity.getGuidedStepTestFragment();
+
+        Calendar currentActionCal = Calendar.getInstance();
+        currentActionCal.setTimeInMillis(dateAction.getDate());
+
+        sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);
+        Thread.sleep(TRANSITION_LENGTH);
+
+        int prevMonth = -1;
+        int currentMonth = mPickerView.getColumnAt(MONTH_INDEX).getCurrentValue();
+        while (currentMonth != prevMonth) {
+            int prevDayOfMonth = -1;
+            int currentDayOfMonth = mPickerView.getColumnAt(DAY_INDEX).getCurrentValue();
+            // scroll down the days till reaching the last day of month
+            while (currentDayOfMonth != prevDayOfMonth) {
+                sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);
+                Thread.sleep(VERTICAL_SCROLL_WAIT);
+                prevDayOfMonth = currentDayOfMonth;
+                currentDayOfMonth = mPickerView.getColumnAt(DAY_INDEX).getCurrentValue();
+            }
+            int oldDayValue = mPickerView.getColumnAt(DAY_INDEX).getCurrentValue();
+            int oldMonthValue = mPickerView.getColumnAt(MONTH_INDEX).getCurrentValue();
+            // increment the month
+            sendKeys(KeyEvent.KEYCODE_DPAD_RIGHT);
+            Thread.sleep(VERTICAL_SCROLL_WAIT);
+
+            sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);
+            Thread.sleep(TRANSITION_LENGTH);
+
+            int newDayValue = mPickerView.getColumnAt(DAY_INDEX).getCurrentValue();
+            int newMonthValue = mPickerView.getColumnAt(MONTH_INDEX).getCurrentValue();
+            verifyMonthTransition(currentActionCal,
+                    oldDayValue, oldMonthValue, newDayValue, newMonthValue);
+
+            sendKeys(KeyEvent.KEYCODE_DPAD_LEFT);
+            Thread.sleep(TRANSITION_LENGTH);
+            prevMonth = currentMonth;
+            currentMonth = newMonthValue;
+        }
+
+    }
+
+    private void verifyMonthTransition(Calendar currentCal, int oldDayValue, int oldMonthValue,
+                                       int newDayValue, int newMonthValue) {
+
+        if (oldMonthValue == newMonthValue)
+            return;
+
+        currentCal.set(Calendar.DAY_OF_MONTH, 1);
+        currentCal.set(Calendar.MONTH, oldMonthValue);
+        int expectedOldDayValue = currentCal.getActualMaximum(Calendar.DAY_OF_MONTH);
+        currentCal.set(Calendar.MONTH, newMonthValue);
+        int numDaysInNewMonth = currentCal.getActualMaximum(Calendar.DAY_OF_MONTH);
+        int expectedNewDayValue = (expectedOldDayValue <= numDaysInNewMonth) ?
+                expectedOldDayValue : numDaysInNewMonth;
+
+        assertTrue(getActivity().getString(
+                R.string.datepicker_test_transition_error1, oldMonthValue),
+                oldDayValue == expectedOldDayValue
+        );
+        assertTrue(getActivity().getString(
+                R.string.datepicker_test_transition_error2, newDayValue, newMonthValue),
+                newDayValue == expectedNewDayValue
+        );
+    }
+
+    public void testDateRanges() throws Throwable {
+
+        mInstrumentation = getInstrumentation();
+        Intent intent = new Intent(mInstrumentation.getContext(),
+                GuidedStepAttributesTestActivity.class);
+        Resources res = mInstrumentation.getContext().getResources();
+
+        SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
+
+        Calendar currCal = Calendar.getInstance();
+        currCal.set(Calendar.YEAR, 2016);
+        currCal.set(Calendar.MONTH, Calendar.JULY);
+        currCal.set(Calendar.DAY_OF_MONTH, 15);
+
+        Calendar minCal = Calendar.getInstance();
+        minCal.set(Calendar.YEAR, 2014);
+        minCal.set(Calendar.MONTH, Calendar.OCTOBER);
+        minCal.set(Calendar.DAY_OF_MONTH, 20);
+
+        Calendar maxCal = Calendar.getInstance();
+        maxCal.set(Calendar.YEAR, 2018);
+        maxCal.set(Calendar.MONTH, Calendar.FEBRUARY);
+        maxCal.set(Calendar.DAY_OF_MONTH, 10);
+
+        String title = "Date Picker Range Test";
+        String breadcrumb = "Date Picker Range Test Demo";
+        String description = "";
+        GuidanceStylist.Guidance guidance = new GuidanceStylist.Guidance(title, description,
+                breadcrumb, null);
+
+        List<GuidedAction> actionList = new ArrayList<>();
+
+        // testing different date formats and the correctness of range changes as we scroll
+        GuidedDatePickerAction dateAction1 = new GuidedDatePickerAction.Builder(
+                mInstrumentation.getContext())
+                .id(0)
+                .title(res.getString(R.string.datepicker_with_range_title,
+                        dateFormat.format(minCal.getTime()),
+                        dateFormat.format(maxCal.getTime())))
+                .multilineDescription(true)
+                .date(currCal.getTimeInMillis())
+                .datePickerFormat("MDY")
+                .minDate(minCal.getTimeInMillis())
+                .maxDate(maxCal.getTimeInMillis())
+                .build();
+
+        GuidedDatePickerAction dateAction2 = new GuidedDatePickerAction.Builder(
+                mInstrumentation.getContext())
+                .id(1)
+                .title(res.getString(R.string.datepicker_with_range_title,
+                        dateFormat.format(minCal.getTimeInMillis()),
+                        dateFormat.format(maxCal.getTimeInMillis())))
+                .multilineDescription(true)
+                .date(currCal.getTimeInMillis())
+                .datePickerFormat("DMY")
+                .minDate(minCal.getTimeInMillis())
+                .maxDate(maxCal.getTimeInMillis())
+                .build();
+
+        // testing date ranges when Year is equal
+        minCal.set(Calendar.YEAR, maxCal.get(Calendar.YEAR));
+        int minMonth = Math.min(minCal.get(Calendar.MONTH), maxCal.get(Calendar.MONTH));
+        int maxMonth = Math.max(minCal.get(Calendar.MONTH), maxCal.get(Calendar.MONTH));
+        minCal.set(Calendar.MONTH, minMonth);
+        maxCal.set(Calendar.MONTH, maxMonth);
+
+        GuidedDatePickerAction dateAction3 = new GuidedDatePickerAction.Builder(
+                mInstrumentation.getContext())
+                .id(2)
+                .title(res.getString(R.string.datepicker_with_range_title,
+                        dateFormat.format(minCal.getTimeInMillis()),
+                        dateFormat.format(maxCal.getTimeInMillis())))
+                .multilineDescription(true)
+                .date(currCal.getTimeInMillis())
+                .datePickerFormat("DMY")
+                .minDate(minCal.getTimeInMillis())
+                .maxDate(maxCal.getTimeInMillis())
+                .build();
+
+
+        // testing date ranges when both Month and Year are equal
+        minCal.set(Calendar.MONTH, maxCal.get(Calendar.MONTH));
+        int minDay = Math.min(minCal.get(Calendar.DAY_OF_MONTH), maxCal.get(Calendar.DAY_OF_MONTH));
+        int maxDay = Math.max(minCal.get(Calendar.DAY_OF_MONTH), maxCal.get(Calendar.DAY_OF_MONTH));
+        minCal.set(Calendar.DAY_OF_MONTH, minDay);
+        maxCal.set(Calendar.DAY_OF_MONTH, maxDay);
+
+        GuidedDatePickerAction dateAction4 = new GuidedDatePickerAction.Builder(
+                mInstrumentation.getContext())
+                .id(3)
+                .title(res.getString(R.string.datepicker_with_range_title,
+                        dateFormat.format(minCal.getTimeInMillis()),
+                        dateFormat.format(maxCal.getTimeInMillis())))
+                .multilineDescription(true)
+                .date(currCal.getTimeInMillis())
+                .datePickerFormat("DMY")
+                .minDate(minCal.getTimeInMillis())
+                .maxDate(maxCal.getTimeInMillis())
+                .build();
+
+
+        // testing date ranges when all fields are equal
+        minCal.set(Calendar.DAY_OF_MONTH, maxCal.get(Calendar.DAY_OF_MONTH));
+
+        GuidedDatePickerAction dateAction5 = new GuidedDatePickerAction.Builder(
+                mInstrumentation.getContext())
+                .id(4)
+                .title(res.getString(R.string.datepicker_with_range_title,
+                        dateFormat.format(minCal.getTimeInMillis()),
+                        dateFormat.format(maxCal.getTimeInMillis())))
+                .multilineDescription(true)
+                .date(currCal.getTimeInMillis())
+                .datePickerFormat("DMY")
+                .minDate(minCal.getTimeInMillis())
+                .maxDate(maxCal.getTimeInMillis())
+                .build();
+
+        actionList.add(dateAction1);
+        actionList.add(dateAction2);
+        actionList.add(dateAction3);
+        actionList.add(dateAction4);
+        actionList.add(dateAction5);
+
+        GuidedStepAttributesTestFragment.clear();
+        GuidedStepAttributesTestFragment.GUIDANCE = guidance;
+        GuidedStepAttributesTestFragment.ACTION_LIST = actionList;
+
+        initActivity(intent);
+
+        final GuidedStepFragment mFragment = (GuidedStepFragment) mActivity.
+                getGuidedStepTestFragment();
+
+        scrollToMinAndMaxDates(new int[] {1, 0, 2}, dateAction1);
+        scrollToMinAndMaxDates(new int[] {0, 1, 2}, dateAction2);
+        scrollToMinAndMaxDates(new int[] {0, 1, 2}, dateAction3);
+        scrollToMinAndMaxDates(new int[] {0, 1, 2}, dateAction4);
+        scrollToMinAndMaxDates(new int[] {0, 1, 2}, dateAction5);
+
+        Thread.sleep(FINAL_WAIT);
+    }
+
+    private void scrollToMinAndMaxDates(int[] columnIndices, GuidedDatePickerAction dateAction)
+            throws Throwable{
+
+        final GuidedStepFragment mFragment = (GuidedStepFragment)
+                mActivity.getGuidedStepTestFragment();
+
+        VerticalGridView guidedActionsList = (VerticalGridView)
+                mActivity.findViewById(R.id.guidedactions_list);
+
+        int currSelectedAction = mFragment.getSelectedActionPosition();
+        // scroll up/down to the requested action
+        long verticalScrollOffset = dateAction.getId() - currSelectedAction;
+
+        int verticalScrollDir = KeyEvent.KEYCODE_DPAD_DOWN;
+        if (verticalScrollOffset < 0) {
+            verticalScrollOffset= -verticalScrollOffset;
+            verticalScrollDir = KeyEvent.KEYCODE_DPAD_UP;
+        }
+        for(int i = 0; i < verticalScrollOffset; i++) {
+            sendKeys(verticalScrollDir);
+            Thread.sleep(TRANSITION_LENGTH);
+        }
+
+        assertTrue("The wrong action was selected!", mFragment.getSelectedActionPosition() ==
+                dateAction.getId());
+        DatePicker mPickerView = (DatePicker) mFragment.getActionItemView((int) dateAction.getId())
+                .findViewById(R.id.guidedactions_activator_item);
+
+        Calendar currentActionCal = Calendar.getInstance();
+        currentActionCal.setTimeInMillis(dateAction.getDate());
+
+
+        // scrolling to the minimum date
+
+        scrollOnField(Calendar.YEAR, columnIndices, mPickerView, KeyEvent.KEYCODE_DPAD_UP);
+        dateAction.setDate(mPickerView.getDate());
+
+        scrollOnField(Calendar.MONTH, columnIndices, mPickerView, KeyEvent.KEYCODE_DPAD_UP);
+        dateAction.setDate(mPickerView.getDate());
+
+        scrollOnField(Calendar.DAY_OF_MONTH, columnIndices, mPickerView, KeyEvent.KEYCODE_DPAD_UP);
+        dateAction.setDate(mPickerView.getDate());
+
+        Thread.sleep(VERTICAL_SCROLL_WAIT);
+
+        // now scrolling to the maximum date
+
+        scrollOnField(Calendar.YEAR, columnIndices, mPickerView, KeyEvent.KEYCODE_DPAD_DOWN);
+        dateAction.setDate(mPickerView.getDate());
+
+        scrollOnField(Calendar.MONTH, columnIndices, mPickerView, KeyEvent.KEYCODE_DPAD_DOWN);
+        dateAction.setDate(mPickerView.getDate());
+
+        scrollOnField(Calendar.DAY_OF_MONTH, columnIndices, mPickerView, KeyEvent.KEYCODE_DPAD_DOWN);
+        dateAction.setDate(mPickerView.getDate());
+
+        sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);
+        Thread.sleep(TRANSITION_LENGTH);
+    }
+
+}
diff --git a/v17/leanback/tests/java/android/support/v17/leanback/app/wizard/GuidedStepAttributesTest.java b/v17/leanback/tests/java/android/support/v17/leanback/app/wizard/GuidedStepAttributesTest.java
new file mode 100644
index 0000000..72391d1
--- /dev/null
+++ b/v17/leanback/tests/java/android/support/v17/leanback/app/wizard/GuidedStepAttributesTest.java
@@ -0,0 +1,623 @@
+/*
+ * Copyright (C) 2016 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 android.support.v17.leanback.app.wizard;
+
+import android.app.Instrumentation;
+import android.content.Intent;
+import android.content.res.Resources;
+import android.support.v17.leanback.app.GuidedStepFragment;
+import android.support.v17.leanback.test.R;
+import android.support.v17.leanback.widget.GuidanceStylist;
+import android.support.v17.leanback.widget.GuidedAction;
+import android.test.ActivityInstrumentationTestCase2;
+import android.util.Log;
+import android.view.KeyEvent;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+public class GuidedStepAttributesTest extends
+        ActivityInstrumentationTestCase2<GuidedStepAttributesTestActivity>
+{
+    static final long TRANSITION_LENGTH = 1000;
+
+    static final String TAG = "GuidedStepAttributesTest";
+
+    Instrumentation mInstrumentation;
+    GuidedStepAttributesTestActivity mActivity;
+
+    public GuidedStepAttributesTest() {
+        super(GuidedStepAttributesTestActivity.class);
+    }
+
+    private void initActivity(Intent intent) {
+
+        setActivityIntent(intent);
+        mActivity = getActivity();
+        try {
+            Thread.sleep(2000);
+        } catch(InterruptedException e) {
+            e.printStackTrace();
+        }
+    }
+
+    public void testFocusDisabledOnActions() throws Throwable {
+
+        mInstrumentation = getInstrumentation();
+        Intent intent = new Intent(mInstrumentation.getContext(),
+                GuidedStepAttributesTestActivity.class);
+        Resources res = mInstrumentation.getContext().getResources();
+
+        final int NUM_SEARCH_ACTIONS = 10;
+        final List<Integer> ACTIONS_WITH_DISABLED_FOCUS = new ArrayList<>(
+                Arrays.asList(1, 3, 4, 5, 8));
+        final int ACTION_ID_SEARCH = 1;
+        List<Integer> EXPECTED_ACTIONS_ID_AFTER_EACH_SELECT = new ArrayList<>();
+
+        // we will traverse actions from top to bottom and then back to the top
+        for(int i = 0; i < NUM_SEARCH_ACTIONS; i++) {
+            if (!ACTIONS_WITH_DISABLED_FOCUS.contains(i))
+                EXPECTED_ACTIONS_ID_AFTER_EACH_SELECT.add(i);
+        }
+        for(int i = EXPECTED_ACTIONS_ID_AFTER_EACH_SELECT.size(); i-- != 0;) {
+            EXPECTED_ACTIONS_ID_AFTER_EACH_SELECT.add(EXPECTED_ACTIONS_ID_AFTER_EACH_SELECT.get(i));
+        }
+
+
+        String title = "Guided Actions Focusable Test";
+        String breadcrumb = "Focusable Test Demo";
+        String description = "";
+        GuidanceStylist.Guidance guidance = new GuidanceStylist.Guidance(title, description,
+                breadcrumb, null);
+
+        List<GuidedAction> actionList = new ArrayList<>();
+        for (int i = 0; i < NUM_SEARCH_ACTIONS; i++ ) {
+            actionList.add(new GuidedAction.Builder(mInstrumentation.getContext())
+                    .id(ACTION_ID_SEARCH)
+                    .title(res.getString(R.string.search) + "" + i)
+                    .description(res.getString(R.string.search_description) + i)
+                    .build()
+            );
+        }
+        for(int action_id : ACTIONS_WITH_DISABLED_FOCUS )
+            actionList.get(action_id).setFocusable(false);
+
+        GuidedStepAttributesTestFragment.GUIDANCE = guidance;
+        GuidedStepAttributesTestFragment.ACTION_LIST = actionList;
+
+        initActivity(intent);
+
+        int lastSelectedActionId = -1;
+        int selectIndex = 0;
+        GuidedStepFragment mFragment = (GuidedStepFragment) mActivity.getGuidedStepTestFragment();
+        int prevSelectedActionPosition = -1;
+        int nextSelectedActionPosition = mFragment.getSelectedActionPosition();
+        while ( nextSelectedActionPosition != prevSelectedActionPosition ) {
+            lastSelectedActionId = mFragment.getSelectedActionPosition();
+            assertTrue(res.getString(R.string.focusable_test_error_message,
+                    actionList.get(lastSelectedActionId).getTitle()),
+                    lastSelectedActionId == EXPECTED_ACTIONS_ID_AFTER_EACH_SELECT.get(selectIndex));
+            selectIndex++;
+            sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);
+            prevSelectedActionPosition = nextSelectedActionPosition;
+            nextSelectedActionPosition = mFragment.getSelectedActionPosition();
+            Thread.sleep(TRANSITION_LENGTH);
+        }
+
+        prevSelectedActionPosition = -1;
+        while ( nextSelectedActionPosition != prevSelectedActionPosition ) {
+            lastSelectedActionId = mFragment.getSelectedActionPosition();
+            assertTrue(res.getString(R.string.focusable_test_error_message,
+                    actionList.get(lastSelectedActionId).getTitle()),
+                    lastSelectedActionId == EXPECTED_ACTIONS_ID_AFTER_EACH_SELECT.get(selectIndex));
+            selectIndex++;
+            sendKeys(KeyEvent.KEYCODE_DPAD_UP);
+            prevSelectedActionPosition = nextSelectedActionPosition;
+            nextSelectedActionPosition = mFragment.getSelectedActionPosition();
+            Thread.sleep(TRANSITION_LENGTH);
+        }
+
+    }
+
+    // Note: do not remove final or sRevertCallback gets null from 2nd test on!
+     static final GuidedStepAttributesTestFragment.Callback sRevertCallback = new
+            GuidedStepAttributesTestFragment.Callback() {
+        @Override
+        public void onActionClicked(GuidedStepFragment fragment, long id) {
+            List<GuidedAction> allActions = fragment.getActions();
+            for(int i = 1; i < allActions.size(); i++) {
+                GuidedAction action = allActions.get(i);
+                action.setEnabled(!action.isEnabled());
+                fragment.notifyActionChanged(fragment.findActionPositionById(action.getId()));
+            }
+        }
+    };
+
+    public void testDisabledActions() throws Throwable {
+
+        mInstrumentation = getInstrumentation();
+        Intent intent = new Intent(mInstrumentation.getContext(),
+                GuidedStepAttributesTestActivity.class);
+        Resources res = mInstrumentation.getContext().getResources();
+
+        final int NUM_SEARCH_ACTIONS = 10;
+        final List<Integer> DISABLED_ACTIONS = new ArrayList<>(
+                Arrays.asList(1, 3, 5, 7));
+        final int ACTION_ID_REVERT_BUTTON = 0;
+        final int ACTION_ID_SEARCH_BEGIN = ACTION_ID_REVERT_BUTTON + 1;
+        int ACTION_ID_SEARCH_END = ACTION_ID_SEARCH_BEGIN;
+
+        // sequence of clicked actions simulated in the test
+        List<Integer> CLICK_SEQUENCE = new ArrayList<>();
+
+        // Expected Clicked sequence can be different from focused ones since some of the actions
+        // are disabled hence not clickable
+        List<Integer> EXPECTED_FOCUSED_SEQUENCE = new ArrayList<>();
+        List<Integer> EXPECTED_CLICKED_SEQUENCE = new ArrayList<>();
+        // Expected actions state according to list of DISABLED_ACTIONS: false for disabled actions
+        List<Boolean> EXPECTED_ACTIONS_STATE = new ArrayList<>(
+                Arrays.asList(new Boolean[NUM_SEARCH_ACTIONS])
+        );
+        Collections.fill(EXPECTED_ACTIONS_STATE, Boolean.TRUE);
+
+        for(int i = 0; i < NUM_SEARCH_ACTIONS; i++) {
+            CLICK_SEQUENCE.add(i + 1);
+        }
+        for(int clickedActionId : CLICK_SEQUENCE) {
+            EXPECTED_FOCUSED_SEQUENCE.add(clickedActionId);
+            if (!DISABLED_ACTIONS.contains(clickedActionId - 1))
+                EXPECTED_CLICKED_SEQUENCE.add(clickedActionId);
+            else
+                EXPECTED_CLICKED_SEQUENCE.add(-1);
+        }
+
+        String title = "Guided Actions Enabled Test";
+        String breadcrumb = "Enabled Test Demo";
+        String description = "";
+        GuidanceStylist.Guidance guidance = new GuidanceStylist.Guidance(title, description,
+                breadcrumb, null);
+
+        List<GuidedAction> actionList = new ArrayList<>();
+        actionList.add(new GuidedAction.Builder(mInstrumentation.getContext())
+                .id(ACTION_ID_REVERT_BUTTON)
+                .title(res.getString(R.string.invert_title))
+                .description(res.getString(R.string.revert_description))
+                .build()
+        );
+
+        for (int i = 0; i < NUM_SEARCH_ACTIONS; i++ ) {
+            actionList.add(new GuidedAction.Builder(mInstrumentation.getContext())
+                    .id(ACTION_ID_SEARCH_END++)
+                    .title(res.getString(R.string.search) + "" + i)
+                    .description(res.getString(R.string.search_description) + i)
+                    .build()
+            );
+        }
+        for(int action_id : DISABLED_ACTIONS ) {
+            if ( action_id >= 0 && action_id < NUM_SEARCH_ACTIONS ) {
+                actionList.get(action_id + 1).setEnabled(false);
+                EXPECTED_ACTIONS_STATE.set(action_id, Boolean.FALSE);
+            }
+        }
+
+        GuidedStepAttributesTestFragment.clear();
+        GuidedStepAttributesTestFragment.GUIDANCE = guidance;
+        GuidedStepAttributesTestFragment.ACTION_LIST = actionList;
+        GuidedStepAttributesTestFragment.setActionClickCallback(ACTION_ID_REVERT_BUTTON,
+                sRevertCallback);
+
+        initActivity(intent);
+
+        final GuidedStepFragment mFragment = (GuidedStepFragment)
+                mActivity.getGuidedStepTestFragment();
+
+        examineEnabledAndDisabledActions(actionList, CLICK_SEQUENCE, EXPECTED_FOCUSED_SEQUENCE,
+                EXPECTED_CLICKED_SEQUENCE);
+        // now toggling all enabled/disabled actions to disabled/enabled and running the test again
+        Log.d(TAG, "Toggling actions...");
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mFragment.setSelectedActionPosition(0);
+            }
+        });
+        Thread.sleep(TRANSITION_LENGTH);
+        sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);
+        Thread.sleep(TRANSITION_LENGTH);
+        for(int i = 0; i < EXPECTED_CLICKED_SEQUENCE.size(); i++) {
+            if (EXPECTED_CLICKED_SEQUENCE.get(i) == -1)
+                EXPECTED_CLICKED_SEQUENCE.set(i, CLICK_SEQUENCE.get(i));
+            else
+                EXPECTED_CLICKED_SEQUENCE.set(i, -1);
+        }
+
+        examineEnabledAndDisabledActions(actionList, CLICK_SEQUENCE, EXPECTED_FOCUSED_SEQUENCE,
+                EXPECTED_CLICKED_SEQUENCE);
+
+    }
+
+    private void examineEnabledAndDisabledActions(
+            List<GuidedAction> actionList, List<Integer> CLICK_SEQUENCE,
+                                List<Integer> EXPECTED_FOCUSED_SEQUENCE,
+                                List<Integer> EXPECTED_CLICKED_SEQUENCE)
+            throws Throwable {
+
+        final GuidedStepFragment mFragment = (GuidedStepFragment)
+                mActivity.getGuidedStepTestFragment();
+
+        for(int i = 0; i < CLICK_SEQUENCE.size(); i++) {
+            GuidedStepAttributesTestFragment.LAST_SELECTED_ACTION_ID =
+                    GuidedStepAttributesTestFragment.LAST_CLICKED_ACTION_ID = -1;
+            final int id = CLICK_SEQUENCE.get(i);
+            runTestOnUiThread(new Runnable() {
+                @Override
+                public void run() {
+                    mFragment.setSelectedActionPosition(id);
+                }
+            });
+            Thread.sleep(TRANSITION_LENGTH);
+
+            sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);
+            Thread.sleep(TRANSITION_LENGTH);
+
+            assertTrue(mInstrumentation.getContext().getResources().getString(
+                    R.string.enabled_test_wrong_focus_error_message),
+                    GuidedStepAttributesTestFragment.LAST_SELECTED_ACTION_ID ==
+                            EXPECTED_FOCUSED_SEQUENCE.get(i)
+            );
+            assertTrue(mInstrumentation.getContext().getResources().getString(
+                    R.string.enabled_test_wrong_click_error_message),
+                    GuidedStepAttributesTestFragment.LAST_CLICKED_ACTION_ID ==
+                            EXPECTED_CLICKED_SEQUENCE.get(i)
+            );
+            assertTrue(mInstrumentation.getContext().getResources().getString(
+                    R.string.enabled_test_wrong_flag_error_message),
+                    (GuidedStepAttributesTestFragment.LAST_CLICKED_ACTION_ID == -1) ?
+                            !actionList.get(id).isEnabled() :
+                            actionList.get(id).isEnabled()
+            );
+        }
+    }
+
+    public void testCheckedActions() throws Throwable {
+
+        mInstrumentation = getInstrumentation();
+        Intent intent = new Intent(mInstrumentation.getContext(),
+                GuidedStepAttributesTestActivity.class);
+        Resources res = mInstrumentation.getContext().getResources();
+
+        final int NUM_RADIO_ACTIONS = 3;
+        final int NUM_CHECK_BOX_ACTIONS = 3;
+        final int INITIALLY_CHECKED_RADIO_ACTION = 0;
+        final List<Integer> INITIALLY_CHECKED_CHECKBOX_ACTIONS = new ArrayList<>(
+                Arrays.asList(1, 2)
+        );
+
+        List<Integer> CLICK_SEQUENCE = new ArrayList<>();
+        for(int i = 0; i < NUM_RADIO_ACTIONS + NUM_CHECK_BOX_ACTIONS; i++) {
+            CLICK_SEQUENCE.add(i);
+        }
+
+        List<Boolean> EXPECTED_ACTIONS_STATE_AFTER_EACH_CLICK = new ArrayList<>(
+                Arrays.asList(new Boolean[CLICK_SEQUENCE.size()])
+        );
+        Collections.fill(EXPECTED_ACTIONS_STATE_AFTER_EACH_CLICK, Boolean.FALSE);
+
+        // initial state of actions before any clicks happen
+        EXPECTED_ACTIONS_STATE_AFTER_EACH_CLICK.set(INITIALLY_CHECKED_RADIO_ACTION, true);
+        for(int checkedCheckBox : INITIALLY_CHECKED_CHECKBOX_ACTIONS) {
+            EXPECTED_ACTIONS_STATE_AFTER_EACH_CLICK.set(NUM_RADIO_ACTIONS + checkedCheckBox, true);
+        }
+
+        String title = "Guided Actions Checked Test";
+        String breadcrumb = "Checked Test Demo";
+        String description = "";
+        GuidanceStylist.Guidance guidance = new GuidanceStylist.Guidance(title, description,
+                breadcrumb, null);
+
+        List<GuidedAction> actionList = new ArrayList<>();
+        actionList.add(new GuidedAction.Builder(mInstrumentation.getContext())
+                .title(res.getString(R.string.radio_actions_info_title))
+                .description(res.getString(R.string.radio_actions_info_desc))
+                .infoOnly(true)
+                .enabled(true)
+                .focusable(false)
+                .build()
+        );
+
+        int firstRadioActionIndex = actionList.size();
+        for(int i = 0; i < NUM_RADIO_ACTIONS; i++) {
+            actionList.add(new GuidedAction.Builder(mInstrumentation.getContext())
+                    .title(res.getString(R.string.checkbox_title) + i)
+                    .description(res.getString(R.string.checkbox_desc) + i)
+                    .checkSetId(GuidedAction.DEFAULT_CHECK_SET_ID)
+                    .build()
+            );
+            if (i == INITIALLY_CHECKED_RADIO_ACTION)
+                actionList.get(firstRadioActionIndex + i).setChecked(true);
+        }
+
+        actionList.add(new GuidedAction.Builder(mInstrumentation.getContext())
+                .title(res.getString(R.string.checkbox_actions_info_title))
+                .description(res.getString(R.string.checkbox_actions_info_desc))
+                .infoOnly(true)
+                .enabled(true)
+                .focusable(false)
+                .build()
+        );
+        int firstCheckBoxActionIndex = actionList.size();
+        for(int i = 0; i < NUM_CHECK_BOX_ACTIONS; i++) {
+            actionList.add(new GuidedAction.Builder(mInstrumentation.getContext())
+                    .title(res.getString(R.string.checkbox_title) + i)
+                    .description(res.getString(R.string.checkbox_desc) + i)
+                    .checkSetId(GuidedAction.CHECKBOX_CHECK_SET_ID)
+                    .build()
+            );
+        }
+        for(int i = 0; i < INITIALLY_CHECKED_CHECKBOX_ACTIONS.size(); i++ ) {
+            actionList.get(firstCheckBoxActionIndex + INITIALLY_CHECKED_CHECKBOX_ACTIONS.get(i))
+                    .setChecked(true);
+        }
+
+        GuidedStepAttributesTestFragment.GUIDANCE = guidance;
+        GuidedStepAttributesTestFragment.ACTION_LIST = actionList;
+        initActivity(intent);
+
+        examineCheckedAndUncheckedActions(actionList, EXPECTED_ACTIONS_STATE_AFTER_EACH_CLICK,
+                NUM_RADIO_ACTIONS, NUM_CHECK_BOX_ACTIONS);
+    }
+
+    private void updateExpectedActionsStateAfterClick(
+            List<Boolean> EXPECTED_ACTIONS_STATE_AFTER_EACH_CLICK, int NUM_RADIO_ACTIONS,
+            int NUM_CHECK_BOX_ACTIONS, int clickedActionIndex) {
+
+        if (clickedActionIndex < NUM_RADIO_ACTIONS) {
+            for(int i = 0; i < NUM_RADIO_ACTIONS; i++)
+                EXPECTED_ACTIONS_STATE_AFTER_EACH_CLICK.set(i, false);
+            EXPECTED_ACTIONS_STATE_AFTER_EACH_CLICK.set(clickedActionIndex, true);
+        }
+        else if (clickedActionIndex < NUM_RADIO_ACTIONS + NUM_CHECK_BOX_ACTIONS) {
+            EXPECTED_ACTIONS_STATE_AFTER_EACH_CLICK.set(clickedActionIndex,
+                    !EXPECTED_ACTIONS_STATE_AFTER_EACH_CLICK.get(clickedActionIndex));
+        }
+    }
+
+    private void verifyIfActionsStateIsCorrect(List<GuidedAction> actionList,
+            List<Boolean> EXPECTED_ACTIONS_STATE_AFTER_EACH_CLICK) {
+
+        int actionIndex = 0;
+        for(GuidedAction checkAction : actionList) {
+            if (checkAction.infoOnly())
+                continue;
+            assertTrue("Action " + actionIndex + " is " +
+                            (!checkAction.isChecked() ? "un-" : "") +
+                    "checked while it shouldn't be!",
+                    checkAction.isChecked() ==
+                            EXPECTED_ACTIONS_STATE_AFTER_EACH_CLICK.get(actionIndex));
+            actionIndex++;
+        }
+    }
+
+    private void examineCheckedAndUncheckedActions(List<GuidedAction> actionList,
+                                List<Boolean> EXPECTED_ACTIONS_STATE_AFTER_EACH_CLICK,
+                                int NUM_RADIO_ACTIONS,
+                                int NUM_CHECK_BOX_ACTIONS) throws Throwable {
+
+        final GuidedStepFragment guidedStepCheckedFragment = (GuidedStepFragment)
+                mActivity.getGuidedStepTestFragment();
+        final int firstRadioActionIndex = 1;
+        final int firstCheckBoxActionIndex = firstRadioActionIndex + NUM_RADIO_ACTIONS + 1;
+        for(int actionId = 0; actionId < NUM_RADIO_ACTIONS; actionId++) {
+            final int id = actionId;
+            runTestOnUiThread(new Runnable() {
+                @Override
+                public void run() {
+                    guidedStepCheckedFragment
+                            .setSelectedActionPosition(firstRadioActionIndex + id);
+                }
+            });
+            Thread.sleep(TRANSITION_LENGTH);
+
+            sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);
+            Thread.sleep(TRANSITION_LENGTH);
+            updateExpectedActionsStateAfterClick(EXPECTED_ACTIONS_STATE_AFTER_EACH_CLICK,
+                    NUM_RADIO_ACTIONS, NUM_CHECK_BOX_ACTIONS, actionId);
+            verifyIfActionsStateIsCorrect(actionList, EXPECTED_ACTIONS_STATE_AFTER_EACH_CLICK);
+        }
+
+        for(int actionId = 0; actionId < NUM_CHECK_BOX_ACTIONS; actionId++) {
+            final int id = actionId;
+            runTestOnUiThread(new Runnable() {
+                @Override
+                public void run() {
+                    guidedStepCheckedFragment
+                            .setSelectedActionPosition(firstCheckBoxActionIndex + id);
+                }
+            });
+            Thread.sleep(TRANSITION_LENGTH);
+
+            sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);
+            Thread.sleep(TRANSITION_LENGTH);
+            updateExpectedActionsStateAfterClick(EXPECTED_ACTIONS_STATE_AFTER_EACH_CLICK,
+                    NUM_RADIO_ACTIONS, NUM_CHECK_BOX_ACTIONS, NUM_RADIO_ACTIONS + actionId);
+            verifyIfActionsStateIsCorrect(actionList, EXPECTED_ACTIONS_STATE_AFTER_EACH_CLICK);
+        }
+    }
+
+    public void testSubActions() throws Throwable {
+
+        mInstrumentation = getInstrumentation();
+        Intent intent = new Intent(mInstrumentation.getContext(),
+                GuidedStepAttributesTestActivity.class);
+        Resources res = mInstrumentation.getContext().getResources();
+
+        String TAG = "testSubActions";
+        final int NUM_REGULAR_ACTIONS = 4;
+        final int[] NUM_SUBACTIONS_PER_ACTION = {2, 1, 0, 3};
+        final int[] REGULAR_ACTIONS_INDEX =  new int[NUM_REGULAR_ACTIONS];
+        final int[] BEGIN_SUBACTION_INDEX_PER_ACTION = new int[NUM_REGULAR_ACTIONS];
+        final int[] END_SUBACTION_INDEX_PER_ACTION = new int[NUM_REGULAR_ACTIONS];
+        // Actions and Subactions are assigned unique sequential IDs
+        int lastIndex = 0;
+        for(int i = 0; i < NUM_REGULAR_ACTIONS; i++) {
+            REGULAR_ACTIONS_INDEX[i] = lastIndex;
+            lastIndex++;
+            BEGIN_SUBACTION_INDEX_PER_ACTION[i] = lastIndex;
+            END_SUBACTION_INDEX_PER_ACTION[i] = (lastIndex += NUM_SUBACTIONS_PER_ACTION[i]);
+        }
+
+        // Sample click sequence for the main action list (not subactions)
+        List<Integer> ACTION_CLICK_SEQUENCE = new ArrayList<>(Arrays.asList(
+                3, 2, 1, 0
+        ));
+        List<Integer> EXPECTED_FOCUSED_SEQUENCE = new ArrayList<>();
+        List<Integer> EXPECTED_CLICKED_SEQUENCE = new ArrayList<>();
+
+        for(int clickedActionId : ACTION_CLICK_SEQUENCE) {
+            EXPECTED_FOCUSED_SEQUENCE.add(REGULAR_ACTIONS_INDEX[clickedActionId]);
+            if (NUM_SUBACTIONS_PER_ACTION[clickedActionId] > 0) {
+                for (int i = BEGIN_SUBACTION_INDEX_PER_ACTION[clickedActionId]; i <
+                        END_SUBACTION_INDEX_PER_ACTION[clickedActionId]; i++) {
+                    EXPECTED_CLICKED_SEQUENCE.add(REGULAR_ACTIONS_INDEX[clickedActionId]);
+                    for (int j = BEGIN_SUBACTION_INDEX_PER_ACTION[clickedActionId]; j <= i; j++) {
+                        EXPECTED_FOCUSED_SEQUENCE.add(j);
+                    }
+                    EXPECTED_CLICKED_SEQUENCE.add(i);
+                    EXPECTED_FOCUSED_SEQUENCE.add(REGULAR_ACTIONS_INDEX[clickedActionId]);
+                }
+            } else {
+                EXPECTED_CLICKED_SEQUENCE.add(REGULAR_ACTIONS_INDEX[clickedActionId]);
+                EXPECTED_FOCUSED_SEQUENCE.add(REGULAR_ACTIONS_INDEX[clickedActionId]);
+            }
+        }
+
+        String title = "Guided SubActions Test";
+        String breadcrumb = "SubActions Test Demo";
+        String description = "";
+        GuidanceStylist.Guidance guidance = new GuidanceStylist.Guidance(title, description,
+                breadcrumb, null);
+
+        List<GuidedAction> actionList = new ArrayList<>();
+
+        lastIndex = 0;
+        for (int i = 0; i < NUM_REGULAR_ACTIONS; i++ ) {
+            GuidedAction action = new GuidedAction.Builder(mInstrumentation.getContext())
+                    .id(lastIndex++)
+                    .title(res.getString(R.string.dropdown_action_title, i))
+                    .description(res.getString(R.string.dropdown_action_desc, i))
+                    .build();
+            if (NUM_SUBACTIONS_PER_ACTION[i] > 0) {
+                List<GuidedAction> subActions = new ArrayList<>();
+                action.setSubActions(subActions);
+                for(int j = 0; j < NUM_SUBACTIONS_PER_ACTION[i]; j++) {
+                    subActions.add(new GuidedAction.Builder(mInstrumentation.getContext())
+                            .id(lastIndex++)
+                            .title(res.getString(R.string.subaction_title, j))
+                            .description("")
+                            .build()
+                    );
+                }
+            }
+            actionList.add(action);
+        }
+
+        GuidedStepAttributesTestFragment.clear();
+        GuidedStepAttributesTestFragment.GUIDANCE = guidance;
+        GuidedStepAttributesTestFragment.ACTION_LIST = actionList;
+
+        initActivity(intent);
+
+        final GuidedStepFragment mFragment = (GuidedStepFragment) mActivity.
+                getGuidedStepTestFragment();
+
+        int focusStep = 0, clickStep = 0;
+        for(int i = 0; i < ACTION_CLICK_SEQUENCE.size(); i++) {
+            GuidedStepAttributesTestFragment.LAST_SELECTED_ACTION_ID =
+                    GuidedStepAttributesTestFragment.LAST_CLICKED_ACTION_ID = -1;
+            final int id = ACTION_CLICK_SEQUENCE.get(i);
+            final GuidedAction selectedAction = actionList.get(id);
+            runTestOnUiThread(new Runnable() {
+                @Override
+                public void run() {
+                    mFragment.setSelectedActionPosition(id);
+                }
+            });
+            Thread.sleep(TRANSITION_LENGTH);
+
+            assertTrue(mInstrumentation.getContext().getResources().getString(
+                    R.string.subaction_test_wrong_focus_error_message),
+                    GuidedStepAttributesTestFragment.LAST_SELECTED_ACTION_ID ==
+                            EXPECTED_FOCUSED_SEQUENCE.get(focusStep++)
+            );
+
+            if (selectedAction.hasSubActions()) {
+                // Following for loop clicks on a specific action and scrolls & clicks through
+                // all its subactions
+                for (int j = 0; j < selectedAction.getSubActions().size(); j++) {
+                    sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);
+                    Thread.sleep(TRANSITION_LENGTH);
+                    assertTrue(mInstrumentation.getContext().getResources().getString(
+                            R.string.subaction_test_wrong_focus_error_message),
+                            GuidedStepAttributesTestFragment.LAST_SELECTED_ACTION_ID ==
+                                    EXPECTED_FOCUSED_SEQUENCE.get(focusStep++)
+                    );
+                    assertTrue(mInstrumentation.getContext().getResources().getString(
+                            R.string.subaction_test_wrong_click_error_message),
+                            GuidedStepAttributesTestFragment.LAST_CLICKED_ACTION_ID ==
+                                    EXPECTED_CLICKED_SEQUENCE.get(clickStep++)
+                    );
+                    for (int k = 0; k < j; k++) {
+                        sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);
+                        Thread.sleep(TRANSITION_LENGTH);
+                        assertTrue(mInstrumentation.getContext().getResources().getString(
+                                R.string.subaction_test_wrong_focus_error_message),
+                                GuidedStepAttributesTestFragment.LAST_SELECTED_ACTION_ID ==
+                                        EXPECTED_FOCUSED_SEQUENCE.get(focusStep++)
+                        );
+                    }
+                    sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);
+                    Thread.sleep(TRANSITION_LENGTH);
+
+                    assertTrue(mInstrumentation.getContext().getResources().getString(
+                            R.string.subaction_test_wrong_focus_error_message),
+                            GuidedStepAttributesTestFragment.LAST_SELECTED_ACTION_ID ==
+                                    EXPECTED_FOCUSED_SEQUENCE.get(focusStep++)
+                    );
+                    assertTrue(mInstrumentation.getContext().getResources().getString(
+                            R.string.subaction_test_wrong_click_error_message),
+                            GuidedStepAttributesTestFragment.LAST_CLICKED_ACTION_ID ==
+                                    EXPECTED_CLICKED_SEQUENCE.get(clickStep++)
+                    );
+                }
+            } else {
+                sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);
+                Thread.sleep(TRANSITION_LENGTH);
+                assertTrue(mInstrumentation.getContext().getResources().getString(
+                        R.string.subaction_test_wrong_focus_error_message),
+                        GuidedStepAttributesTestFragment.LAST_SELECTED_ACTION_ID ==
+                                EXPECTED_FOCUSED_SEQUENCE.get(focusStep++)
+                );
+                assertTrue(mInstrumentation.getContext().getResources().getString(
+                        R.string.subaction_test_wrong_click_error_message),
+                        GuidedStepAttributesTestFragment.LAST_CLICKED_ACTION_ID ==
+                                EXPECTED_CLICKED_SEQUENCE.get(clickStep++)
+                );
+            }
+        }
+
+    }
+}
diff --git a/v17/tests/src/android/support/v17/leanback/app/wizard/GuidedStepAttributesTestActivity.java b/v17/leanback/tests/java/android/support/v17/leanback/app/wizard/GuidedStepAttributesTestActivity.java
similarity index 100%
rename from v17/tests/src/android/support/v17/leanback/app/wizard/GuidedStepAttributesTestActivity.java
rename to v17/leanback/tests/java/android/support/v17/leanback/app/wizard/GuidedStepAttributesTestActivity.java
diff --git a/v17/tests/src/android/support/v17/leanback/app/wizard/GuidedStepAttributesTestFragment.java b/v17/leanback/tests/java/android/support/v17/leanback/app/wizard/GuidedStepAttributesTestFragment.java
similarity index 100%
rename from v17/tests/src/android/support/v17/leanback/app/wizard/GuidedStepAttributesTestFragment.java
rename to v17/leanback/tests/java/android/support/v17/leanback/app/wizard/GuidedStepAttributesTestFragment.java
diff --git a/v17/tests/src/android/support/v17/leanback/widget/AssertHelper.java b/v17/leanback/tests/java/android/support/v17/leanback/widget/AssertHelper.java
similarity index 100%
rename from v17/tests/src/android/support/v17/leanback/widget/AssertHelper.java
rename to v17/leanback/tests/java/android/support/v17/leanback/widget/AssertHelper.java
diff --git a/v17/leanback/tests/java/android/support/v17/leanback/widget/GridActivity.java b/v17/leanback/tests/java/android/support/v17/leanback/widget/GridActivity.java
new file mode 100644
index 0000000..aaf652b
--- /dev/null
+++ b/v17/leanback/tests/java/android/support/v17/leanback/widget/GridActivity.java
@@ -0,0 +1,476 @@
+/*
+ * Copyright (C) 2015 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 android.support.v17.leanback.widget;
+
+import android.support.v17.leanback.test.R;
+import android.support.v7.widget.RecyclerView;
+import android.support.v17.leanback.widget.BaseGridView;
+import android.support.v17.leanback.widget.OnChildSelectedListener;
+import android.app.Activity;
+import android.content.Intent;
+import android.graphics.Color;
+import android.os.Bundle;
+import android.util.Log;
+import android.util.SparseArray;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.view.View.OnFocusChangeListener;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import java.util.ArrayList;
+
+/**
+ * @hide from javadoc
+ */
+public class GridActivity extends Activity {
+
+    private static final String TAG = "GridActivity";
+
+    interface AdapterListener {
+        void onBind(RecyclerView.ViewHolder vh, int position);
+    }
+
+    public static final String EXTRA_LAYOUT_RESOURCE_ID = "layoutResourceId";
+    public static final String EXTRA_NUM_ITEMS = "numItems";
+    public static final String EXTRA_ITEMS = "items";
+    public static final String EXTRA_ITEMS_FOCUSABLE = "itemsFocusable";
+    public static final String EXTRA_STAGGERED = "staggered";
+    public static final String EXTRA_REQUEST_LAYOUT_ONFOCUS = "requestLayoutOnFocus";
+    public static final String EXTRA_REQUEST_FOCUS_ONLAYOUT = "requstFocusOnLayout";
+    public static final String EXTRA_CHILD_LAYOUT_ID = "childLayoutId";
+    public static final String EXTRA_SECONDARY_SIZE_ZERO = "secondarySizeZero";
+    public static final String EXTRA_UPDATE_SIZE = "updateSize";
+    public static final String EXTRA_LAYOUT_MARGINS = "layoutMargins";
+    public static final String EXTRA_NINEPATCH_SHADOW = "NINEPATCH_SHADOW";
+
+    /**
+     * Class that implements GridWidgetTest.ViewTypeProvider for creating different
+     * view types for each position.
+     */
+    public static final String EXTRA_VIEWTYPEPROVIDER_CLASS = "viewtype_class";
+    /**
+     * Class that implements GridWidgetTest.ItemAlignmentFacetProvider for creating different
+     * ItemAlignmentFacet for each ViewHolder.
+     */
+    public static final String EXTRA_ITEMALIGNMENTPROVIDER_CLASS = "itemalignment_class";
+    /**
+     * Class that implements GridWidgetTest.ItemAlignmentFacetProvider for creating different
+     * ItemAlignmentFacet for a given viewType.
+     */
+    public static final String EXTRA_ITEMALIGNMENTPROVIDER_VIEWTYPE_CLASS =
+            "itemalignment_viewtype_class";
+    public static final String SELECT_ACTION = "android.test.leanback.widget.SELECT";
+
+    static final int DEFAULT_NUM_ITEMS = 100;
+    static final boolean DEFAULT_STAGGERED = true;
+    static final boolean DEFAULT_REQUEST_LAYOUT_ONFOCUS = false;
+    static final boolean DEFAULT_REQUEST_FOCUS_ONLAYOUT = false;
+
+    private static final boolean DEBUG = false;
+
+    int mLayoutId;
+    int mOrientation;
+    int mNumItems;
+    int mChildLayout;
+    boolean mStaggered;
+    boolean mRequestLayoutOnFocus;
+    boolean mRequestFocusOnLayout;
+    boolean mSecondarySizeZero;
+    GridWidgetTest.ViewTypeProvider mViewTypeProvider;
+    GridWidgetTest.ItemAlignmentFacetProvider mAlignmentProvider;
+    GridWidgetTest.ItemAlignmentFacetProvider mAlignmentViewTypeProvider;
+    AdapterListener mAdapterListener;
+    boolean mUpdateSize = true;
+
+    int[] mGridViewLayoutSize;
+    BaseGridView mGridView;
+    int[] mItemLengths;
+    boolean[] mItemFocusables;
+    int[] mLayoutMargins;
+    int mNinePatchShadow;
+
+    private int mBoundCount;
+
+    private View createView() {
+
+        View view = getLayoutInflater().inflate(mLayoutId, null, false);
+        mGridView = (BaseGridView) view.findViewById(R.id.gridview);
+        mOrientation = mGridView instanceof HorizontalGridView ? BaseGridView.HORIZONTAL :
+                BaseGridView.VERTICAL;
+        mGridView.setWindowAlignment(BaseGridView.WINDOW_ALIGN_BOTH_EDGE);
+        mGridView.setWindowAlignmentOffsetPercent(35);
+        mGridView.setOnChildSelectedListener(new OnChildSelectedListener() {
+            @Override
+            public void onChildSelected(ViewGroup parent, View view, int position, long id) {
+                if (DEBUG) Log.d(TAG, "onChildSelected position=" + position +  " id="+id);
+            }
+        });
+        if (mNinePatchShadow != 0) {
+            mGridView.setLayoutMode(ViewGroup.LAYOUT_MODE_OPTICAL_BOUNDS);
+        }
+        return view;
+    }
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        Intent intent = getIntent();
+
+        mLayoutId = intent.getIntExtra(EXTRA_LAYOUT_RESOURCE_ID, R.layout.horizontal_grid);
+        mChildLayout = intent.getIntExtra(EXTRA_CHILD_LAYOUT_ID, -1);
+        mStaggered = intent.getBooleanExtra(EXTRA_STAGGERED, DEFAULT_STAGGERED);
+        mRequestLayoutOnFocus = intent.getBooleanExtra(EXTRA_REQUEST_LAYOUT_ONFOCUS,
+                DEFAULT_REQUEST_LAYOUT_ONFOCUS);
+        mRequestFocusOnLayout = intent.getBooleanExtra(EXTRA_REQUEST_FOCUS_ONLAYOUT,
+                DEFAULT_REQUEST_FOCUS_ONLAYOUT);
+        mUpdateSize = intent.getBooleanExtra(EXTRA_UPDATE_SIZE, true);
+        mSecondarySizeZero = intent.getBooleanExtra(EXTRA_SECONDARY_SIZE_ZERO, false);
+        mItemLengths = intent.getIntArrayExtra(EXTRA_ITEMS);
+        mItemFocusables = intent.getBooleanArrayExtra(EXTRA_ITEMS_FOCUSABLE);
+        mLayoutMargins = intent.getIntArrayExtra(EXTRA_LAYOUT_MARGINS);
+        String alignmentClass = intent.getStringExtra(EXTRA_ITEMALIGNMENTPROVIDER_CLASS);
+        String alignmentViewTypeClass =
+                intent.getStringExtra(EXTRA_ITEMALIGNMENTPROVIDER_VIEWTYPE_CLASS);
+        String viewTypeClass = intent.getStringExtra(EXTRA_VIEWTYPEPROVIDER_CLASS);
+        mNinePatchShadow = intent.getIntExtra(EXTRA_NINEPATCH_SHADOW, 0);
+        try {
+            if (alignmentClass != null) {
+                mAlignmentProvider = (GridWidgetTest.ItemAlignmentFacetProvider)
+                        Class.forName(alignmentClass).newInstance();
+            }
+            if (alignmentViewTypeClass != null) {
+                mAlignmentViewTypeProvider = (GridWidgetTest.ItemAlignmentFacetProvider)
+                        Class.forName(alignmentViewTypeClass).newInstance();
+            }
+            if (viewTypeClass != null) {
+                mViewTypeProvider = (GridWidgetTest.ViewTypeProvider)
+                        Class.forName(viewTypeClass).newInstance();
+            }
+        } catch (ClassNotFoundException ex) {
+            throw new RuntimeException(ex);
+        } catch (InstantiationException ex) {
+            throw new RuntimeException(ex);
+        } catch (IllegalAccessException ex) {
+            throw new RuntimeException(ex);
+        }
+
+        super.onCreate(savedInstanceState);
+
+        if (DEBUG) Log.v(TAG, "onCreate " + this);
+
+        RecyclerView.Adapter adapter = new MyAdapter();
+
+        View view = createView();
+        if (mItemLengths == null) {
+            mNumItems = intent.getIntExtra(EXTRA_NUM_ITEMS, DEFAULT_NUM_ITEMS);
+            mItemLengths = new int[mNumItems];
+            for (int i = 0; i < mItemLengths.length; i++) {
+                if (mOrientation == BaseGridView.HORIZONTAL) {
+                    mItemLengths[i] = mStaggered ? (int)(Math.random() * 180) + 180 : 240;
+                } else {
+                    mItemLengths[i] = mStaggered ? (int)(Math.random() * 120) + 120 : 160;
+                }
+            }
+        } else {
+            mNumItems = mItemLengths.length;
+        }
+
+        mGridView.setAdapter(adapter);
+        setContentView(view);
+    }
+
+    void rebindToNewAdapter() {
+        mGridView.setAdapter(new MyAdapter());
+    }
+
+    @Override
+    protected void onNewIntent(Intent intent) {
+        if (DEBUG) Log.v(TAG, "onNewIntent " + intent+ " "+this);
+        if (intent.getAction().equals(SELECT_ACTION)) {
+            int position = intent.getIntExtra("SELECT_POSITION", -1);
+            if (position >= 0) {
+                mGridView.setSelectedPosition(position);
+            }
+        }
+        super.onNewIntent(intent);
+    }
+
+    private OnFocusChangeListener mItemFocusChangeListener = new OnFocusChangeListener() {
+
+        @Override
+        public void onFocusChange(View v, boolean hasFocus) {
+            if (hasFocus) {
+                v.setBackgroundColor(Color.YELLOW);
+            } else {
+                v.setBackgroundColor(Color.LTGRAY);
+            }
+            if (mRequestLayoutOnFocus) {
+                RecyclerView.ViewHolder vh = mGridView.getChildViewHolder(v);
+                int position = vh.getAdapterPosition();
+                updateSize(v, position);
+            }
+        }
+    };
+
+    private OnFocusChangeListener mSubItemFocusChangeListener = new OnFocusChangeListener() {
+
+        @Override
+        public void onFocusChange(View v, boolean hasFocus) {
+            if (hasFocus) {
+                v.setBackgroundColor(Color.YELLOW);
+            } else {
+                v.setBackgroundColor(Color.LTGRAY);
+            }
+        }
+    };
+
+    void resetBoundCount() {
+        mBoundCount = 0;
+    }
+
+    int getBoundCount() {
+       return mBoundCount;
+    }
+
+    void swap(int index1, int index2) {
+        if (index1 == index2) {
+            return;
+        } else if (index1 > index2) {
+            int index = index1;
+            index1 = index2;
+            index2 = index;
+        }
+        int value = mItemLengths[index1];
+        mItemLengths[index1] = mItemLengths[index2];
+        mItemLengths[index2] = value;
+        mGridView.getAdapter().notifyItemMoved(index1, index2);
+        mGridView.getAdapter().notifyItemMoved(index2 - 1, index1);
+    }
+
+    void changeArraySize(int length) {
+        mNumItems = length;
+        mGridView.getAdapter().notifyDataSetChanged();
+    }
+
+    int[] removeItems(int index, int length) {
+        int[] removed = new int[length];
+        System.arraycopy(mItemLengths, index, removed, 0, length);
+        System.arraycopy(mItemLengths, index + length, mItemLengths, index,
+                mNumItems - index - length);
+        mNumItems -= length;
+        if (mGridView.getAdapter() != null) {
+            mGridView.getAdapter().notifyItemRangeRemoved(index, length);
+        }
+        return removed;
+    }
+
+    void attachToNewAdapter(int[] items) {
+        mItemLengths = items;
+        mNumItems = items.length;
+        mGridView.setAdapter(new MyAdapter());
+    }
+
+
+    void addItems(int index, int[] items) {
+        int length = items.length;
+        if (mItemLengths.length < mNumItems + length) {
+            int[] array = new int[mNumItems + length];
+            System.arraycopy(mItemLengths, 0, array, 0, mNumItems);
+            mItemLengths = array;
+        }
+        System.arraycopy(mItemLengths, index, mItemLengths, index + length, mNumItems - index);
+        System.arraycopy(items, 0, mItemLengths, index, length);
+        mNumItems += length;
+        if (mGridView.getAdapter() != null) {
+            mGridView.getAdapter().notifyItemRangeInserted(index, length);
+        }
+    }
+
+    class MyAdapter extends RecyclerView.Adapter implements FacetProviderAdapter {
+
+        @Override
+        public int getItemViewType(int position) {
+            if (mViewTypeProvider != null) {
+                return mViewTypeProvider.getViewType(position);
+            }
+            return 0;
+        }
+
+        @Override
+        public FacetProvider getFacetProvider(int viewType) {
+            final Object alignmentFacet = mAlignmentViewTypeProvider != null?
+                mAlignmentViewTypeProvider.getItemAlignmentFacet(viewType) : null;
+            if (alignmentFacet != null) {
+                return new FacetProvider() {
+                    @Override
+                    public Object getFacet(Class facetClass) {
+                        if (facetClass.equals(ItemAlignmentFacet.class)) {
+                            return alignmentFacet;
+                        }
+                        return null;
+                    }
+                };
+            }
+            return null;
+        }
+
+        @Override
+        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+            if (DEBUG) Log.v(TAG, "createViewHolder " + viewType);
+            View itemView;
+            if (mChildLayout != -1) {
+                final View view = getLayoutInflater().inflate(mChildLayout, parent, false);
+                ArrayList<View> focusables = new ArrayList<View>();
+                view.addFocusables(focusables, View.FOCUS_UP);
+                for (int i = 0; i < focusables.size(); i++) {
+                    View f = focusables.get(i);
+                    f.setBackgroundColor(Color.LTGRAY);
+                    f.setOnFocusChangeListener(new OnFocusChangeListener() {
+                        @Override
+                        public void onFocusChange(View v, boolean hasFocus) {
+                            if (hasFocus) {
+                                v.setBackgroundColor(Color.YELLOW);
+                            } else {
+                                v.setBackgroundColor(Color.LTGRAY);
+                            }
+                            if (mRequestLayoutOnFocus) {
+                                if (v == view) {
+                                    RecyclerView.ViewHolder vh = mGridView.getChildViewHolder(v);
+                                    int position = vh.getAdapterPosition();
+                                    updateSize(v, position);
+                                }
+                                view.requestLayout();
+                            }
+                        }
+                    });
+                }
+                itemView = view;
+            } else {
+                TextView textView = new TextView(parent.getContext()) {
+                    @Override
+                    protected void onLayout(boolean change, int left, int top, int right,
+                            int bottom) {
+                        super.onLayout(change, left, top, right, bottom);
+                        if (mRequestFocusOnLayout) {
+                            if (hasFocus()) {
+                                clearFocus();
+                                requestFocus();
+                            }
+                        }
+                    }
+                };
+                textView.setTextColor(Color.BLACK);
+                textView.setOnFocusChangeListener(mItemFocusChangeListener);
+                itemView = textView;
+            }
+            if (mLayoutMargins != null) {
+                ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams)
+                        itemView.getLayoutParams();
+                if (lp == null) {
+                    lp = new ViewGroup.MarginLayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
+                            ViewGroup.LayoutParams.WRAP_CONTENT);
+                }
+                lp.leftMargin = mLayoutMargins[0];
+                lp.topMargin = mLayoutMargins[1];
+                lp.rightMargin = mLayoutMargins[2];
+                lp.bottomMargin = mLayoutMargins[3];
+                itemView.setLayoutParams(lp);
+            }
+            if (mNinePatchShadow != 0) {
+                ViewGroup viewGroup = (ViewGroup) itemView;
+                View shadow = new View(viewGroup.getContext());
+                shadow.setBackgroundResource(mNinePatchShadow);
+                viewGroup.addView(shadow);
+                viewGroup.setLayoutMode(ViewGroup.LAYOUT_MODE_OPTICAL_BOUNDS);
+            }
+            return new ViewHolder(itemView);
+        }
+
+        @Override
+        public void onBindViewHolder(RecyclerView.ViewHolder baseHolder, int position) {
+            if (DEBUG) Log.v(TAG, "bindViewHolder " + position + " " + baseHolder);
+            mBoundCount++;
+            ViewHolder holder = (ViewHolder) baseHolder;
+            if (mAlignmentProvider != null) {
+                holder.mItemAlignment = mAlignmentProvider.getItemAlignmentFacet(position);
+            } else {
+                holder.mItemAlignment = null;
+            }
+            if (mChildLayout == -1) {
+                ((TextView) holder.itemView).setText("Item "+mItemLengths[position]
+                        + " type=" + getItemViewType(position));
+                boolean focusable = true;
+                if (mItemFocusables != null) {
+                    focusable = mItemFocusables[position];
+                }
+                ((TextView) holder.itemView).setFocusable(focusable);
+                ((TextView) holder.itemView).setFocusableInTouchMode(focusable);
+                holder.itemView.setBackgroundColor(Color.LTGRAY);
+            } else {
+                if (holder.itemView instanceof TextView) {
+                    ((TextView) holder.itemView).setText("Item "+mItemLengths[position]
+                            + " type=" + getItemViewType(position));
+                }
+            }
+            updateSize(holder.itemView, position);
+            if (mAdapterListener != null) {
+                mAdapterListener.onBind(baseHolder, position);
+            }
+        }
+
+        @Override
+        public int getItemCount() {
+            return mNumItems;
+        }
+
+    }
+
+    void updateSize(View view, int position) {
+        if (!mUpdateSize) {
+            return;
+        }
+        ViewGroup.LayoutParams p = view.getLayoutParams();
+        if (p == null) {
+            p = new ViewGroup.LayoutParams(0, 0);
+        }
+        if (mOrientation == BaseGridView.HORIZONTAL) {
+            p.width = mItemLengths[position] + (mRequestLayoutOnFocus && view.hasFocus() ? 1 : 0);
+            p.height = mSecondarySizeZero ? 0 : 80;
+        } else {
+            p.width = mSecondarySizeZero ? 0 : 240;
+            p.height = mItemLengths[position] + (mRequestLayoutOnFocus && view.hasFocus() ? 1 : 0);
+        }
+        view.setLayoutParams(p);
+    }
+
+    static class ViewHolder extends RecyclerView.ViewHolder implements FacetProvider {
+
+        ItemAlignmentFacet mItemAlignment;
+        public ViewHolder(View v) {
+            super(v);
+        }
+
+        @Override
+        public Object getFacet(Class facetClass) {
+            if (facetClass.equals(ItemAlignmentFacet.class)) {
+                return mItemAlignment;
+            }
+            return null;
+        }
+    }
+}
diff --git a/v17/tests/src/android/support/v17/leanback/widget/GridTest.java b/v17/leanback/tests/java/android/support/v17/leanback/widget/GridTest.java
similarity index 100%
rename from v17/tests/src/android/support/v17/leanback/widget/GridTest.java
rename to v17/leanback/tests/java/android/support/v17/leanback/widget/GridTest.java
diff --git a/v17/leanback/tests/java/android/support/v17/leanback/widget/GridWidgetTest.java b/v17/leanback/tests/java/android/support/v17/leanback/widget/GridWidgetTest.java
new file mode 100644
index 0000000..d602ad4
--- /dev/null
+++ b/v17/leanback/tests/java/android/support/v17/leanback/widget/GridWidgetTest.java
@@ -0,0 +1,2785 @@
+/*
+ * Copyright (C) 2015 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 android.support.v17.leanback.widget;
+
+import android.app.Instrumentation;
+import android.content.Intent;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Rect;
+import android.graphics.drawable.ColorDrawable;
+import android.os.Parcelable;
+import android.support.v17.leanback.test.R;
+import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat;
+import android.support.v7.widget.RecyclerView;
+import android.support.v7.widget.RecyclerViewAccessibilityDelegate;
+import android.test.ActivityInstrumentationTestCase2;
+import android.text.Selection;
+import android.text.Spannable;
+import android.util.SparseArray;
+import android.util.SparseIntArray;
+import android.view.KeyEvent;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.HashMap;
+
+/**
+ * @hide from javadoc
+ */
+public class GridWidgetTest extends ActivityInstrumentationTestCase2<GridActivity> {
+
+    private static final boolean HUMAN_DELAY = false;
+    private static final long WAIT_FOR_SCROLL_IDLE_TIMEOUT_MS = 60000;
+
+    protected GridActivity mActivity;
+    protected Instrumentation mInstrumentation;
+    protected BaseGridView mGridView;
+    protected GridLayoutManager mLayoutManager;
+    protected int mOrientation;
+    protected int mNumRows;
+
+    private final Comparator<View> mRowSortComparator = new Comparator<View>() {
+        public int compare(View lhs, View rhs) {
+            if (mOrientation == BaseGridView.HORIZONTAL) {
+                return lhs.getLeft() - rhs.getLeft();
+            } else {
+                return lhs.getTop() - rhs.getTop();
+            }
+        };
+    };
+
+    /**
+     * Verify margins between items on same row are same.
+     */
+    private final Runnable mVerifyLayout = new Runnable() {
+        @Override
+        public void run() {
+            verifyMargin();
+        }
+    };
+
+    public GridWidgetTest() {
+        super("android.support.v17.leanback.test", GridActivity.class);
+    }
+
+    private void humanDelay(int delay) throws InterruptedException {
+        if (HUMAN_DELAY) Thread.sleep(delay);
+    }
+    /**
+     * Change size of the Adapter and notifyDataSetChanged.
+     */
+    private void changeArraySize(final int size) throws Throwable {
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mActivity.changeArraySize(size);
+            }
+        });
+        Thread.sleep(500);
+    }
+
+    /**
+     * Change selected position.
+     */
+    private void setSelectedPosition(final int position, final int scrollExtra) throws Throwable {
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mGridView.setSelectedPosition(position, scrollExtra);
+            }
+        });
+        Thread.sleep(500);
+    }
+
+    protected void waitForScrollIdleAndItemAnimation(Runnable verify) throws Throwable {
+        waitForScrollIdle();
+        waitForItemAnimation();
+        verify.run();
+    }
+
+    protected void waitForItemAnimation() throws Throwable {
+        Thread.sleep(100);
+        while (mGridView.getItemAnimator() != null && mGridView.getItemAnimator().isRunning()) {
+            try {
+                Thread.sleep(100);
+            } catch (InterruptedException ex) {
+                break;
+            }
+        }
+    }
+
+    /**
+     * Wait for grid view stop scroll and optionally verify state of grid view.
+     */
+    protected void waitForScrollIdle(Runnable verify) throws Throwable {
+        Thread.sleep(100);
+        int total = 0;
+        while (mGridView.getLayoutManager().isSmoothScrolling() ||
+                mGridView.getScrollState() != BaseGridView.SCROLL_STATE_IDLE) {
+            if ((total += 100) >= WAIT_FOR_SCROLL_IDLE_TIMEOUT_MS) {
+                throw new RuntimeException("waitForScrollIdle Timeout");
+            }
+            try {
+                Thread.sleep(100);
+            } catch (InterruptedException ex) {
+                break;
+            }
+            if (verify != null) {
+                runTestOnUiThread(verify);
+            }
+        }
+    }
+
+    /**
+     * Wait for grid view stop animation and optionally verify state of grid view.
+     */
+    protected void waitForTransientStateGone(Runnable verify) throws Throwable {
+        do {
+            try {
+                Thread.sleep(100);
+            } catch (InterruptedException ex) {
+                break;
+            }
+            if (verify != null) {
+                runTestOnUiThread(verify);
+            }
+        } while (mGridView.hasTransientState());
+    }
+
+    /**
+     * Wait for grid view stop scroll.
+     */
+    protected void waitForScrollIdle() throws Throwable {
+        waitForScrollIdle(null);
+    }
+
+    /**
+     * Scrolls using given key.
+     */
+    protected void scroll(int key, Runnable verify) throws Throwable {
+        do {
+            if (verify != null) {
+                runTestOnUiThread(verify);
+            }
+            sendRepeatedKeys(10, key);
+            try {
+                Thread.sleep(300);
+            } catch (InterruptedException ex) {
+                break;
+            }
+        } while (mGridView.getLayoutManager().isSmoothScrolling() ||
+                mGridView.getScrollState() != BaseGridView.SCROLL_STATE_IDLE);
+    }
+
+    protected void scrollToBegin(Runnable verify) throws Throwable {
+        int key;
+        if (mOrientation == BaseGridView.HORIZONTAL) {
+            if (mGridView.getLayoutDirection() == ViewGroup.LAYOUT_DIRECTION_RTL) {
+                key = KeyEvent.KEYCODE_DPAD_RIGHT;
+            } else {
+                key = KeyEvent.KEYCODE_DPAD_LEFT;
+            }
+        } else {
+            key = KeyEvent.KEYCODE_DPAD_UP;
+        }
+        scroll(key, verify);
+    }
+
+    protected void scrollToEnd(Runnable verify) throws Throwable {
+        int key;
+        if (mOrientation == BaseGridView.HORIZONTAL) {
+            if (mGridView.getLayoutDirection() == ViewGroup.LAYOUT_DIRECTION_RTL) {
+                key = KeyEvent.KEYCODE_DPAD_LEFT;
+            } else {
+                key = KeyEvent.KEYCODE_DPAD_RIGHT;
+            }
+        } else {
+            key = KeyEvent.KEYCODE_DPAD_DOWN;
+        }
+        scroll(key, verify);
+    }
+
+    /**
+     * Group and sort children by their position on each row (HORIZONTAL) or column(VERTICAL).
+     */
+    protected View[][] sortByRows() {
+        final HashMap<Integer, ArrayList<View>> rows = new HashMap<Integer, ArrayList<View>>();
+        ArrayList<Integer> rowLocations = new ArrayList();
+        for (int i = 0; i < mGridView.getChildCount(); i++) {
+            View v = mGridView.getChildAt(i);
+            int rowLocation;
+            if (mOrientation == BaseGridView.HORIZONTAL) {
+                rowLocation = v.getTop();
+            } else {
+                rowLocation = mGridView.getLayoutDirection() == ViewGroup.LAYOUT_DIRECTION_RTL ?
+                    v.getRight() : v.getLeft();
+            }
+            ArrayList<View> views = rows.get(rowLocation);
+            if (views == null) {
+                views = new ArrayList<View>();
+                rows.put(rowLocation, views);
+                rowLocations.add(rowLocation);
+            }
+            views.add(v);
+        }
+        Object[] sortedLocations = rowLocations.toArray();
+        Arrays.sort(sortedLocations);
+        if (mNumRows != rows.size()) {
+            assertEquals("Dump Views by rows "+rows, mNumRows, rows.size());
+        }
+        View[][] sorted = new View[rows.size()][];
+        for (int i = 0; i < rowLocations.size(); i++) {
+            Integer rowLocation = rowLocations.get(i);
+            ArrayList<View> arr = rows.get(rowLocation);
+            View[] views = arr.toArray(new View[arr.size()]);
+            Arrays.sort(views, mRowSortComparator);
+            sorted[i] = views;
+        }
+        return sorted;
+    }
+
+    protected void verifyMargin() {
+        View[][] sorted = sortByRows();
+        for (int row = 0; row < sorted.length; row++) {
+            View[] views = sorted[row];
+            int margin = -1;
+            for (int i = 1; i < views.length; i++) {
+                if (mOrientation == BaseGridView.HORIZONTAL) {
+                    assertEquals(mGridView.getHorizontalMargin(),
+                            views[i].getLeft() - views[i - 1].getRight());
+                } else {
+                    assertEquals(mGridView.getVerticalMargin(),
+                            views[i].getTop() - views[i - 1].getBottom());
+                }
+            }
+        }
+    }
+
+    protected void verifyBeginAligned() {
+        View[][] sorted = sortByRows();
+        int alignedLocation = 0;
+        if (mOrientation == BaseGridView.HORIZONTAL) {
+            if (mGridView.getLayoutDirection() == ViewGroup.LAYOUT_DIRECTION_RTL) {
+                for (int i = 0; i < sorted.length; i++) {
+                    if (i == 0) {
+                        alignedLocation = sorted[i][sorted[i].length - 1].getRight();
+                    } else {
+                        assertEquals(alignedLocation, sorted[i][sorted[i].length - 1].getRight());
+                    }
+                }
+            } else {
+                for (int i = 0; i < sorted.length; i++) {
+                    if (i == 0) {
+                        alignedLocation = sorted[i][0].getLeft();
+                    } else {
+                        assertEquals(alignedLocation, sorted[i][0].getLeft());
+                    }
+                }
+            }
+        } else {
+            for (int i = 0; i < sorted.length; i++) {
+                if (i == 0) {
+                    alignedLocation = sorted[i][0].getTop();
+                } else {
+                    assertEquals(alignedLocation, sorted[i][0].getTop());
+                }
+            }
+        }
+    }
+
+    protected int[] getEndEdges() {
+        View[][] sorted = sortByRows();
+        int[] edges = new int[sorted.length];
+        if (mOrientation == BaseGridView.HORIZONTAL) {
+            if (mGridView.getLayoutDirection() == ViewGroup.LAYOUT_DIRECTION_RTL) {
+                for (int i = 0; i < sorted.length; i++) {
+                    edges[i] = sorted[i][0].getLeft();
+                }
+            } else {
+                for (int i = 0; i < sorted.length; i++) {
+                    edges[i] = sorted[i][sorted[i].length - 1].getRight();
+                }
+            }
+        } else {
+            for (int i = 0; i < sorted.length; i++) {
+                edges[i] = sorted[i][sorted[i].length - 1].getBottom();
+            }
+        }
+        return edges;
+    }
+
+    protected void verifyEdgesSame(int[] edges, int[] edges2) {
+        assertEquals(edges.length, edges2.length);
+        for (int i = 0; i < edges.length; i++) {
+            assertEquals(edges[i], edges2[i]);
+        }
+    }
+
+    protected void verifyBoundCount(int count) {
+        if (mActivity.getBoundCount() != count) {
+            StringBuffer b = new StringBuffer();
+            b.append("ItemsLength: ");
+            for (int i = 0; i < mActivity.mItemLengths.length; i++) {
+                b.append(mActivity.mItemLengths[i]).append(",");
+            }
+            assertEquals("Bound count does not match, ItemsLengths: "+ b,
+                    count, mActivity.getBoundCount());
+        }
+    }
+
+    private static int getCenterY(View v) {
+        return (v.getTop() + v.getBottom())/2;
+    }
+
+    private static int getCenterX(View v) {
+        return (v.getLeft() + v.getRight())/2;
+    }
+
+    private void initActivity(Intent intent) {
+        setActivityIntent(intent);
+        mActivity = getActivity();
+        final String testName = getName();
+        try {
+            runTestOnUiThread(new Runnable() {
+                public void run() {
+                    mActivity.setTitle(testName);
+                }
+            });
+            Thread.sleep(1000);
+        } catch (Throwable t) {
+            t.printStackTrace();
+        }
+        mGridView = mActivity.mGridView;
+    }
+
+    public void testThreeRowHorizontalBasic() throws Throwable {
+        mInstrumentation = getInstrumentation();
+        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
+        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID, R.layout.horizontal_grid);
+        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 100);
+        initActivity(intent);
+        mOrientation = BaseGridView.HORIZONTAL;
+        mNumRows = 3;
+
+        scrollToEnd(mVerifyLayout);
+        verifyBoundCount(100);
+
+        scrollToBegin(mVerifyLayout);
+
+        verifyBeginAligned();
+    }
+
+    static class DividerDecoration extends RecyclerView.ItemDecoration {
+
+        private ColorDrawable mTopDivider;
+        private ColorDrawable mBottomDivider;
+        private int mLeftOffset;
+        private int mRightOffset;
+        private int mTopOffset;
+        private int mBottomOffset;
+
+        DividerDecoration(int leftOffset, int topOffset, int rightOffset, int bottomOffset) {
+            mLeftOffset = leftOffset;
+            mTopOffset = topOffset;
+            mRightOffset = rightOffset;
+            mBottomOffset = bottomOffset;
+        }
+
+        @Override
+        public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
+            if (mTopDivider == null) {
+                mTopDivider = new ColorDrawable(Color.RED);
+            }
+            if (mBottomDivider == null) {
+                mBottomDivider = new ColorDrawable(Color.BLUE);
+            }
+            final int childCount = parent.getChildCount();
+            final int width = parent.getWidth();
+            for (int childViewIndex = 0; childViewIndex < childCount; childViewIndex++) {
+                final View view = parent.getChildAt(childViewIndex);
+                mTopDivider.setBounds(0, (int) view.getY() - mTopOffset, width, (int) view.getY());
+                mTopDivider.draw(c);
+                mBottomDivider.setBounds(0, (int) view.getY() + view.getHeight(), width,
+                        (int) view.getY() + view.getHeight() + mBottomOffset);
+                mBottomDivider.draw(c);
+            }
+        }
+
+        @Override
+        public void getItemOffsets(Rect outRect, View view, RecyclerView parent,
+                                   RecyclerView.State state) {
+            outRect.left = mLeftOffset;
+            outRect.top = mTopOffset;
+            outRect.right = mRightOffset;
+            outRect.bottom = mBottomOffset;
+        }
+    }
+
+    public void testItemDecorationAndMargins() throws Throwable {
+
+        final int leftMargin = 3;
+        final int topMargin = 4;
+        final int rightMargin = 7;
+        final int bottomMargin = 8;
+        final int itemHeight = 100;
+
+        mInstrumentation = getInstrumentation();
+        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
+        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID, R.layout.vertical_linear);
+        intent.putExtra(GridActivity.EXTRA_ITEMS, new int[]{itemHeight, itemHeight, itemHeight});
+        intent.putExtra(GridActivity.EXTRA_LAYOUT_MARGINS,
+                new int[]{leftMargin, topMargin, rightMargin, bottomMargin});
+        initActivity(intent);
+        mOrientation = BaseGridView.VERTICAL;
+        mNumRows = 1;
+
+        final int paddingLeft = mGridView.getPaddingLeft();
+        final int paddingTop = mGridView.getPaddingTop();
+        final int verticalSpace = mGridView.getVerticalMargin();
+        final int decorationLeft = 17;
+        final int decorationTop = 1;
+        final int decorationRight = 19;
+        final int decorationBottom = 2;
+
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mGridView.addItemDecoration(new DividerDecoration(decorationLeft, decorationTop,
+                        decorationRight, decorationBottom));
+            }
+        });
+        waitForScrollIdle();
+
+        View child0 = mGridView.getChildAt(0);
+        View child1 = mGridView.getChildAt(1);
+        View child2 = mGridView.getChildAt(2);
+
+        assertEquals(itemHeight, child0.getBottom() - child0.getTop());
+
+        // verify left margins
+        assertEquals(paddingLeft + leftMargin + decorationLeft, child0.getLeft());
+        assertEquals(paddingLeft + leftMargin + decorationLeft, child1.getLeft());
+        assertEquals(paddingLeft + leftMargin + decorationLeft, child2.getLeft());
+        // verify top bottom margins and decoration offset
+        assertEquals(paddingTop + topMargin + decorationTop, child0.getTop());
+        assertEquals(bottomMargin + decorationBottom + verticalSpace + decorationTop + topMargin,
+                child1.getTop() - child0.getBottom());
+        assertEquals(bottomMargin + decorationBottom + verticalSpace + decorationTop + topMargin,
+                child2.getTop() - child1.getBottom());
+
+    }
+
+    public void testItemDecorationAndMarginsAndOpticalBounds() throws Throwable {
+        final int leftMargin = 3;
+        final int topMargin = 4;
+        final int rightMargin = 7;
+        final int bottomMargin = 8;
+        final int itemHeight = 100;
+        final int ninePatchDrawableResourceId = R.drawable.lb_card_shadow_focused;
+
+        mInstrumentation = getInstrumentation();
+        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
+        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID, R.layout.vertical_linear);
+        intent.putExtra(GridActivity.EXTRA_ITEMS, new int[]{itemHeight, itemHeight, itemHeight});
+        intent.putExtra(GridActivity.EXTRA_CHILD_LAYOUT_ID, R.layout.relative_layout);
+        intent.putExtra(GridActivity.EXTRA_LAYOUT_MARGINS,
+                new int[]{leftMargin, topMargin, rightMargin, bottomMargin});
+        intent.putExtra(GridActivity.EXTRA_NINEPATCH_SHADOW, ninePatchDrawableResourceId);
+        initActivity(intent);
+        mOrientation = BaseGridView.VERTICAL;
+        mNumRows = 1;
+
+        final int paddingLeft = mGridView.getPaddingLeft();
+        final int paddingTop = mGridView.getPaddingTop();
+        final int verticalSpace = mGridView.getVerticalMargin();
+        final int decorationLeft = 17;
+        final int decorationTop = 1;
+        final int decorationRight = 19;
+        final int decorationBottom = 2;
+
+        final Rect opticalPaddings = new Rect();
+        mGridView.getContext().getDrawable(ninePatchDrawableResourceId).getPadding(opticalPaddings);
+        final int opticalInsetsLeft = opticalPaddings.left;
+        final int opticalInsetsTop = opticalPaddings.top;
+        final int opticalInsetsRight = opticalPaddings.right;
+        final int opticalInsetsBottom = opticalPaddings.bottom;
+        assertTrue(opticalInsetsLeft > 0);
+        assertTrue(opticalInsetsTop > 0);
+        assertTrue(opticalInsetsRight > 0);
+        assertTrue(opticalInsetsBottom > 0);
+
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mGridView.addItemDecoration(new DividerDecoration(decorationLeft, decorationTop,
+                        decorationRight, decorationBottom));
+            }
+        });
+        waitForScrollIdle();
+
+        View child0 = mGridView.getChildAt(0);
+        View child1 = mGridView.getChildAt(1);
+        View child2 = mGridView.getChildAt(2);
+
+        assertEquals(itemHeight + opticalInsetsTop + opticalInsetsBottom,
+                child0.getBottom() - child0.getTop());
+
+        // verify left margins decoration and optical insets
+        assertEquals(paddingLeft + leftMargin + decorationLeft - opticalInsetsLeft,
+                child0.getLeft());
+        assertEquals(paddingLeft + leftMargin + decorationLeft - opticalInsetsLeft,
+                child1.getLeft());
+        assertEquals(paddingLeft + leftMargin + decorationLeft - opticalInsetsLeft,
+                child2.getLeft());
+        // verify top bottom margins decoration offset and optical insets
+        assertEquals(paddingTop + topMargin + decorationTop, child0.getTop() + opticalInsetsTop);
+        assertEquals(bottomMargin + decorationBottom + verticalSpace + decorationTop + topMargin,
+                (child1.getTop() + opticalInsetsTop) - (child0.getBottom() - opticalInsetsBottom));
+        assertEquals(bottomMargin + decorationBottom + verticalSpace + decorationTop + topMargin,
+                (child2.getTop() + opticalInsetsTop) - (child1.getBottom() - opticalInsetsBottom));
+
+    }
+
+    public void testThreeColumnVerticalBasic() throws Throwable {
+
+        mInstrumentation = getInstrumentation();
+        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
+        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID, R.layout.vertical_grid);
+        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 200);
+        initActivity(intent);
+        mOrientation = BaseGridView.VERTICAL;
+        mNumRows = 3;
+
+        scrollToEnd(mVerifyLayout);
+        verifyBoundCount(200);
+
+        scrollToBegin(mVerifyLayout);
+
+        verifyBeginAligned();
+    }
+
+    public void testRedundantAppendRemove() throws Throwable {
+        mInstrumentation = getInstrumentation();
+        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
+        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
+                R.layout.vertical_grid_testredundantappendremove);
+        intent.putExtra(GridActivity.EXTRA_ITEMS, new int[]{
+                149,177,128,234,227,187,163,223,146,210,228,148,227,193,182,197,177,142,225,207,
+                157,171,209,204,187,184,123,221,197,153,202,179,193,214,226,173,225,143,188,159,
+                139,193,233,143,227,203,222,124,228,223,164,131,228,126,211,160,165,152,235,184,
+                155,224,149,181,171,229,200,234,177,130,164,172,188,139,132,203,179,220,147,131,
+                226,127,230,239,183,203,206,227,123,170,239,234,200,149,237,204,160,133,202,234,
+                173,122,139,149,151,153,216,231,121,145,227,153,186,174,223,180,123,215,206,216,
+                239,222,219,207,193,218,140,133,171,153,183,132,233,138,159,174,189,171,143,128,
+                152,222,141,202,224,190,134,120,181,231,230,136,132,224,136,210,207,150,128,183,
+                221,194,179,220,126,221,137,205,223,193,172,132,226,209,133,191,227,127,159,171,
+                180,149,237,177,194,207,170,202,161,144,147,199,205,186,164,140,193,203,224,129});
+        initActivity(intent);
+        mOrientation = BaseGridView.VERTICAL;
+        mNumRows = 3;
+
+        scrollToEnd(mVerifyLayout);
+
+        verifyBoundCount(200);
+
+        scrollToBegin(mVerifyLayout);
+
+        verifyBeginAligned();
+    }
+
+    public void testRedundantAppendRemove2() throws Throwable {
+        mInstrumentation = getInstrumentation();
+        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
+        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
+                R.layout.horizontal_grid_testredundantappendremove2);
+        intent.putExtra(GridActivity.EXTRA_ITEMS, new int[]{
+                318,333,199,224,246,273,269,289,340,313,265,306,349,269,185,282,257,354,316,252,
+                237,290,283,343,196,313,290,343,191,262,342,228,343,349,251,203,226,305,265,213,
+                216,333,295,188,187,281,288,311,244,232,224,332,290,181,267,276,226,261,335,355,
+                225,217,219,183,234,285,257,304,182,250,244,223,257,219,342,185,347,205,302,315,
+                299,309,292,237,192,309,228,250,347,227,337,298,299,185,185,331,223,284,265,351});
+        initActivity(intent);
+        mOrientation = BaseGridView.HORIZONTAL;
+        mNumRows = 3;
+        mLayoutManager = (GridLayoutManager) mGridView.getLayoutManager();
+
+        // test append without staggered result cache
+        scrollToEnd(mVerifyLayout);
+
+        verifyBoundCount(100);
+        int[] endEdges = getEndEdges();
+
+        scrollToBegin(mVerifyLayout);
+
+        verifyBeginAligned();
+
+        // now test append with staggered result cache
+        changeArraySize(3);
+        assertEquals("Staggerd cache should be kept as is when no item size change",
+                100, ((StaggeredGrid) mLayoutManager.mGrid).mLocations.size());
+
+        mActivity.resetBoundCount();
+        changeArraySize(100);
+
+        scrollToEnd(mVerifyLayout);
+        verifyBoundCount(100);
+
+        // we should get same aligned end edges
+        int[] endEdges2 = getEndEdges();
+        verifyEdgesSame(endEdges, endEdges2);
+    }
+
+    public void testItemMovedHorizontal() throws Throwable {
+
+        mInstrumentation = getInstrumentation();
+        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
+        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
+                R.layout.horizontal_grid);
+        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 200);
+        initActivity(intent);
+        mOrientation = BaseGridView.HORIZONTAL;
+        mNumRows = 3;
+
+        mGridView.setSelectedPositionSmooth(150);
+        waitForScrollIdle(mVerifyLayout);
+        mActivity.swap(150, 152);
+        waitForTransientStateGone(null);
+
+        runTestOnUiThread(mVerifyLayout);
+
+        scrollToBegin(mVerifyLayout);
+
+        verifyBeginAligned();
+    }
+
+    public void testItemMovedVertical() throws Throwable {
+
+        mInstrumentation = getInstrumentation();
+        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
+        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
+                R.layout.vertical_grid);
+        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 200);
+        initActivity(intent);
+        mOrientation = BaseGridView.VERTICAL;
+        mNumRows = 3;
+
+        mGridView.setSelectedPositionSmooth(150);
+        waitForScrollIdle(mVerifyLayout);
+        mActivity.swap(150, 152);
+        waitForTransientStateGone(null);
+
+        runTestOnUiThread(mVerifyLayout);
+
+        scrollToEnd(mVerifyLayout);
+        scrollToBegin(mVerifyLayout);
+
+        verifyBeginAligned();
+    }
+
+    public void testItemAddRemoveHorizontal() throws Throwable {
+
+        mInstrumentation = getInstrumentation();
+        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
+        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
+                R.layout.horizontal_grid);
+        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 200);
+        initActivity(intent);
+        mOrientation = BaseGridView.HORIZONTAL;
+        mNumRows = 3;
+
+        scrollToEnd(mVerifyLayout);
+        int[] endEdges = getEndEdges();
+
+        mGridView.setSelectedPositionSmooth(150);
+        waitForScrollIdle(mVerifyLayout);
+        int[] removedItems = mActivity.removeItems(151, 4);
+        waitForTransientStateGone(null);
+
+        scrollToEnd(mVerifyLayout);
+        mGridView.setSelectedPositionSmooth(150);
+        waitForScrollIdle(mVerifyLayout);
+
+        mActivity.addItems(151, removedItems);
+        waitForTransientStateGone(null);
+        scrollToEnd(mVerifyLayout);
+
+        // we should get same aligned end edges
+        int[] endEdges2 = getEndEdges();
+        verifyEdgesSame(endEdges, endEdges2);
+
+        scrollToBegin(mVerifyLayout);
+        verifyBeginAligned();
+    }
+
+    public void testSetSelectedPositionDetached() throws Throwable {
+
+        mInstrumentation = getInstrumentation();
+        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
+        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
+                R.layout.horizontal_linear);
+        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 50);
+        initActivity(intent);
+        mOrientation = BaseGridView.HORIZONTAL;
+        mNumRows = 1;
+
+        final int focusToIndex = 49;
+        final ViewGroup parent = (ViewGroup) mGridView.getParent();
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                parent.removeView(mGridView);
+            }
+        });
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mGridView.setSelectedPositionSmooth(focusToIndex);
+            }
+        });
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                parent.addView(mGridView);
+                mGridView.requestFocus();
+            }
+        });
+        waitForTransientStateGone(null);
+        waitForScrollIdle();
+        assertEquals(mGridView.getSelectedPosition(), focusToIndex);
+        assertTrue(mGridView.getLayoutManager().findViewByPosition(focusToIndex).hasFocus());
+
+        final int focusToIndex2 = 0;
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                parent.removeView(mGridView);
+            }
+        });
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mGridView.setSelectedPosition(focusToIndex2);
+            }
+        });
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                parent.addView(mGridView);
+                mGridView.requestFocus();
+            }
+        });
+        assertEquals(mGridView.getSelectedPosition(), focusToIndex2);
+        waitForTransientStateGone(null);
+        waitForScrollIdle();
+        assertTrue(mGridView.getLayoutManager().findViewByPosition(focusToIndex2).hasFocus());
+    }
+
+    public void testBug22209986() throws Throwable {
+
+        mInstrumentation = getInstrumentation();
+        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
+        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
+                R.layout.horizontal_linear);
+        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 50);
+        initActivity(intent);
+        mOrientation = BaseGridView.HORIZONTAL;
+        mNumRows = 1;
+
+        final int focusToIndex = mGridView.getChildCount() - 1;
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mGridView.setSelectedPositionSmooth(focusToIndex);
+            }
+        });
+
+        waitForTransientStateGone(null);
+        waitForScrollIdle();
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mGridView.setSelectedPositionSmooth(focusToIndex + 1);
+            }
+        });
+        // let the scroll running for a while and requestLayout during scroll
+        Thread.sleep(80);
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                assertEquals(mGridView.getScrollState(), BaseGridView.SCROLL_STATE_SETTLING);
+                mGridView.requestLayout();
+            }
+        });
+        waitForTransientStateGone(null);
+        waitForScrollIdle();
+
+        int leftEdge = mGridView.getLayoutManager().findViewByPosition(focusToIndex).getLeft();
+
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mGridView.requestLayout();
+            }
+        });
+        waitForTransientStateGone(null);
+        waitForScrollIdle();
+        assertEquals(leftEdge,
+                mGridView.getLayoutManager().findViewByPosition(focusToIndex).getLeft());
+    }
+
+    public void testScrollAndRemove() throws Throwable {
+
+        mInstrumentation = getInstrumentation();
+        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
+        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
+                R.layout.horizontal_linear);
+        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 50);
+        initActivity(intent);
+        mOrientation = BaseGridView.HORIZONTAL;
+        mNumRows = 1;
+
+        final int focusToIndex = mGridView.getChildCount() - 1;
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mGridView.setSelectedPositionSmooth(focusToIndex);
+            }
+        });
+
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mActivity.removeItems(focusToIndex, 1);
+            }
+        });
+
+        waitForTransientStateGone(null);
+        waitForScrollIdle();
+        int leftEdge = mGridView.getLayoutManager().findViewByPosition(focusToIndex).getLeft();
+
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mGridView.requestLayout();
+            }
+        });
+        waitForTransientStateGone(null);
+        waitForScrollIdle();
+        assertEquals(leftEdge,
+                mGridView.getLayoutManager().findViewByPosition(focusToIndex).getLeft());
+    }
+
+    public void testScrollAndInsert() throws Throwable {
+
+        mInstrumentation = getInstrumentation();
+        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
+        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
+                R.layout.vertical_grid);
+        int[] items = new int[1000];
+        for (int i = 0; i < items.length; i++) {
+            items[i] = 300 + (int)(Math.random() * 100);
+        }
+        intent.putExtra(GridActivity.EXTRA_ITEMS, items);
+        intent.putExtra(GridActivity.EXTRA_STAGGERED, true);
+        mOrientation = BaseGridView.VERTICAL;
+        mNumRows = 3;
+
+        initActivity(intent);
+
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mGridView.setSelectedPositionSmooth(150);
+            }
+        });
+        waitForScrollIdle(mVerifyLayout);
+
+        View view =  mGridView.getChildAt(mGridView.getChildCount() - 1);
+        final int focusToIndex = mGridView.getChildAdapterPosition(view);
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mGridView.setSelectedPositionSmooth(focusToIndex);
+            }
+        });
+
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                int[] newItems = new int[]{300, 300, 300};
+                mActivity.addItems(0, newItems);
+            }
+        });
+
+        waitForTransientStateGone(null);
+        waitForScrollIdle();
+    }
+
+    public void testScrollAndInsertBeforeVisibleItem() throws Throwable {
+
+        mInstrumentation = getInstrumentation();
+        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
+        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
+                R.layout.vertical_grid);
+        int[] items = new int[1000];
+        for (int i = 0; i < items.length; i++) {
+            items[i] = 300 + (int)(Math.random() * 100);
+        }
+        intent.putExtra(GridActivity.EXTRA_ITEMS, items);
+        intent.putExtra(GridActivity.EXTRA_STAGGERED, true);
+        mOrientation = BaseGridView.VERTICAL;
+        mNumRows = 3;
+
+        initActivity(intent);
+
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mGridView.setSelectedPositionSmooth(150);
+            }
+        });
+        waitForScrollIdle(mVerifyLayout);
+
+        View view =  mGridView.getChildAt(mGridView.getChildCount() - 1);
+        final int focusToIndex = mGridView.getChildAdapterPosition(view);
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mGridView.setSelectedPositionSmooth(focusToIndex);
+            }
+        });
+
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                int[] newItems = new int[]{300, 300, 300};
+                mActivity.addItems(focusToIndex, newItems);
+            }
+        });
+
+        waitForTransientStateGone(null);
+        waitForScrollIdle();
+    }
+
+    public void testSmoothScrollAndRemove() throws Throwable {
+
+        mInstrumentation = getInstrumentation();
+        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
+        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
+                R.layout.horizontal_linear);
+        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 50);
+        initActivity(intent);
+        mOrientation = BaseGridView.HORIZONTAL;
+        mNumRows = 1;
+
+        final int focusToIndex = 40;
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mGridView.setSelectedPositionSmooth(focusToIndex);
+            }
+        });
+
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mActivity.removeItems(focusToIndex, 1);
+            }
+        });
+
+        Thread.sleep(20); // wait for layout
+        assertTrue("removing the index of not attached child should not affect smooth scroller",
+                mGridView.getLayoutManager().isSmoothScrolling());
+        waitForTransientStateGone(null);
+        waitForScrollIdle();
+        int leftEdge = mGridView.getLayoutManager().findViewByPosition(focusToIndex).getLeft();
+
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mGridView.requestLayout();
+            }
+        });
+        waitForTransientStateGone(null);
+        waitForScrollIdle();
+        assertEquals(leftEdge,
+                mGridView.getLayoutManager().findViewByPosition(focusToIndex).getLeft());
+    }
+
+    public void testSmoothScrollAndRemove2() throws Throwable {
+
+        mInstrumentation = getInstrumentation();
+        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
+        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
+                R.layout.horizontal_linear);
+        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 50);
+        initActivity(intent);
+        mOrientation = BaseGridView.HORIZONTAL;
+        mNumRows = 1;
+
+        final int focusToIndex = 40;
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mGridView.setSelectedPositionSmooth(focusToIndex);
+            }
+        });
+
+        final int removeIndex = mGridView.getChildCount() - 1;
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mActivity.removeItems(removeIndex, 1);
+            }
+        });
+
+        Thread.sleep(20); // wait for layout
+        assertFalse("removing the index of attached child should kill smooth scroller",
+                mGridView.getLayoutManager().isSmoothScrolling());
+        waitForTransientStateGone(null);
+        waitForScrollIdle();
+        int leftEdge = mGridView.getLayoutManager().findViewByPosition(focusToIndex).getLeft();
+
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mGridView.requestLayout();
+            }
+        });
+        waitForTransientStateGone(null);
+        waitForScrollIdle();
+        assertEquals(leftEdge,
+                mGridView.getLayoutManager().findViewByPosition(focusToIndex).getLeft());
+    }
+
+    public void testPendingSmoothScrollAndRemove() throws Throwable {
+        mInstrumentation = getInstrumentation();
+        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
+        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
+                R.layout.vertical_linear);
+        intent.putExtra(GridActivity.EXTRA_REQUEST_FOCUS_ONLAYOUT, true);
+        int[] items = new int[100];
+        for (int i = 0; i < items.length; i++) {
+            items[i] = 630 + (int)(Math.random() * 100);
+        }
+        intent.putExtra(GridActivity.EXTRA_ITEMS, items);
+        intent.putExtra(GridActivity.EXTRA_STAGGERED, true);
+        mOrientation = BaseGridView.VERTICAL;
+        mNumRows = 1;
+
+        initActivity(intent);
+
+        mGridView.setSelectedPositionSmooth(0);
+        waitForScrollIdle(mVerifyLayout);
+        assertTrue(mGridView.getChildAt(0).hasFocus());
+
+        // Pressing lots of key to make sure smooth scroller is running
+        for (int i = 0; i < 20; i++) {
+            sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);
+        }
+        Thread.sleep(100);
+
+        assertTrue(mGridView.getLayoutManager().isSmoothScrolling());
+        final int removeIndex = mGridView.getChildCount() - 1;
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mActivity.removeItems(removeIndex, 1);
+            }
+        });
+
+        Thread.sleep(20); // wait for layout
+        assertFalse("removing the index of attached child should kill smooth scroller",
+                mGridView.getLayoutManager().isSmoothScrolling());
+
+        waitForTransientStateGone(null);
+        waitForScrollIdle();
+        int focusIndex = mGridView.getSelectedPosition();
+        int leftEdge = mGridView.getLayoutManager().findViewByPosition(focusIndex).getLeft();
+
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mGridView.requestLayout();
+            }
+        });
+        waitForTransientStateGone(null);
+        waitForScrollIdle();
+        assertEquals(leftEdge,
+                mGridView.getLayoutManager().findViewByPosition(focusIndex).getLeft());
+    }
+
+    public void testFocusToFirstItem() throws Throwable {
+
+        mInstrumentation = getInstrumentation();
+        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
+        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
+                R.layout.horizontal_grid);
+        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 200);
+        initActivity(intent);
+        mOrientation = BaseGridView.HORIZONTAL;
+        mNumRows = 3;
+
+        int[] removedItems = mActivity.removeItems(0, 200);
+
+        waitForTransientStateGone(null);
+        humanDelay(500);
+        mActivity.addItems(0, removedItems);
+
+        waitForTransientStateGone(null);
+        humanDelay(500);
+        assertTrue(mGridView.getLayoutManager().findViewByPosition(0).hasFocus());
+
+        changeArraySize(0);
+
+        changeArraySize(200);
+        assertTrue(mGridView.getLayoutManager().findViewByPosition(0).hasFocus());
+    }
+
+    public void testNonFocusableHorizontal() throws Throwable {
+        final int numItems = 200;
+        final int startPos = 45;
+        final int skips = 20;
+        final int numColumns = 3;
+        final int endPos = startPos + numColumns * (skips + 1);
+
+        mInstrumentation = getInstrumentation();
+        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
+        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
+                R.layout.horizontal_grid);
+        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, numItems);
+        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
+        mOrientation = BaseGridView.HORIZONTAL;
+        mNumRows = numColumns;
+        boolean[] focusable = new boolean[numItems];
+        for (int i = 0; i < focusable.length; i++) {
+            focusable[i] = true;
+        }
+        for (int i = startPos + mNumRows, j = 0; j < skips; i += mNumRows, j++) {
+            focusable[i] = false;
+        }
+        intent.putExtra(GridActivity.EXTRA_ITEMS_FOCUSABLE, focusable);
+        initActivity(intent);
+
+        mGridView.setSelectedPositionSmooth(startPos);
+        waitForScrollIdle(mVerifyLayout);
+
+        if (mGridView.getLayoutDirection() == ViewGroup.LAYOUT_DIRECTION_RTL) {
+            sendKeys(KeyEvent.KEYCODE_DPAD_LEFT);
+        } else {
+            sendKeys(KeyEvent.KEYCODE_DPAD_RIGHT);
+        }
+        waitForScrollIdle(mVerifyLayout);
+        assertEquals(endPos, mGridView.getSelectedPosition());
+
+        if (mGridView.getLayoutDirection() == ViewGroup.LAYOUT_DIRECTION_RTL) {
+            sendKeys(KeyEvent.KEYCODE_DPAD_RIGHT);
+        } else {
+            sendKeys(KeyEvent.KEYCODE_DPAD_LEFT);
+        }
+        waitForScrollIdle(mVerifyLayout);
+        assertEquals(startPos, mGridView.getSelectedPosition());
+
+    }
+
+    public void testNoInitialFocusable() throws Throwable {
+
+        mInstrumentation = getInstrumentation();
+        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
+        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
+                R.layout.horizontal_linear);
+        final int numItems = 100;
+        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, numItems);
+        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
+        mOrientation = BaseGridView.HORIZONTAL;
+        mNumRows = 1;
+        boolean[] focusable = new boolean[numItems];
+        final int firstFocusableIndex = 10;
+        for (int i = 0; i < firstFocusableIndex; i++) {
+            focusable[i] = false;
+        }
+        for (int i = firstFocusableIndex; i < focusable.length; i++) {
+            focusable[i] = true;
+        }
+        intent.putExtra(GridActivity.EXTRA_ITEMS_FOCUSABLE, focusable);
+        initActivity(intent);
+        assertTrue(mGridView.isFocused());
+
+        if (mGridView.getLayoutDirection() == ViewGroup.LAYOUT_DIRECTION_RTL) {
+            sendKeys(KeyEvent.KEYCODE_DPAD_LEFT);
+        } else {
+            sendKeys(KeyEvent.KEYCODE_DPAD_RIGHT);
+        }
+        waitForScrollIdle(mVerifyLayout);
+        assertEquals(firstFocusableIndex, mGridView.getSelectedPosition());
+        assertTrue(mGridView.getLayoutManager().findViewByPosition(firstFocusableIndex).hasFocus());
+    }
+
+    public void testFocusOutOfEmptyListView() throws Throwable {
+
+        mInstrumentation = getInstrumentation();
+        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
+        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
+                R.layout.horizontal_linear);
+        final int numItems = 100;
+        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, numItems);
+        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
+        mOrientation = BaseGridView.HORIZONTAL;
+        mNumRows = 1;
+        initActivity(intent);
+
+        final View horizontalGridView = new HorizontalGridViewEx(mGridView.getContext());
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                horizontalGridView.setFocusable(true);
+                horizontalGridView.setFocusableInTouchMode(true);
+                horizontalGridView.setLayoutParams(new ViewGroup.LayoutParams(100, 100));
+                ((ViewGroup) mGridView.getParent()).addView(horizontalGridView, 0);
+                horizontalGridView.requestFocus();
+            }
+        });
+
+        assertTrue(horizontalGridView.isFocused());
+
+        sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);
+
+        assertTrue(mGridView.hasFocus());
+    }
+
+    public void testTransferFocusToChildWhenGainFocus() throws Throwable {
+
+        mInstrumentation = getInstrumentation();
+        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
+        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
+                R.layout.horizontal_linear);
+        final int numItems = 100;
+        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, numItems);
+        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
+        mOrientation = BaseGridView.HORIZONTAL;
+        mNumRows = 1;
+        boolean[] focusable = new boolean[numItems];
+        final int firstFocusableIndex = 1;
+        for (int i = 0; i < firstFocusableIndex; i++) {
+            focusable[i] = false;
+        }
+        for (int i = firstFocusableIndex; i < focusable.length; i++) {
+            focusable[i] = true;
+        }
+        intent.putExtra(GridActivity.EXTRA_ITEMS_FOCUSABLE, focusable);
+        initActivity(intent);
+
+        assertEquals(firstFocusableIndex, mGridView.getSelectedPosition());
+        assertTrue(mGridView.getLayoutManager().findViewByPosition(firstFocusableIndex).hasFocus());
+    }
+
+    public void testFocusFromSecondChild() throws Throwable {
+
+        mInstrumentation = getInstrumentation();
+        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
+        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
+                R.layout.horizontal_linear);
+        final int numItems = 100;
+        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, numItems);
+        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
+        mOrientation = BaseGridView.HORIZONTAL;
+        mNumRows = 1;
+        boolean[] focusable = new boolean[numItems];
+        for (int i = 0; i < focusable.length; i++) {
+            focusable[i] = false;
+        }
+        intent.putExtra(GridActivity.EXTRA_ITEMS_FOCUSABLE, focusable);
+        initActivity(intent);
+
+        // switching Adapter to cause a full rebind,  test if it will focus to second item.
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mActivity.mNumItems = numItems;
+                mActivity.mItemFocusables[1] = true;
+                mActivity.rebindToNewAdapter();
+            }
+        });
+    }
+
+    public void testNonFocusableVertical() throws Throwable {
+        final int numItems = 200;
+        final int startPos = 44;
+        final int skips = 20;
+        final int numColumns = 3;
+        final int endPos = startPos + numColumns * (skips + 1);
+
+        mInstrumentation = getInstrumentation();
+        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
+        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
+                R.layout.vertical_grid);
+        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, numItems);
+        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
+        mOrientation = BaseGridView.VERTICAL;
+        mNumRows = numColumns;
+        boolean[] focusable = new boolean[numItems];
+        for (int i = 0; i < focusable.length; i++) {
+            focusable[i] = true;
+        }
+        for (int i = startPos + mNumRows, j = 0; j < skips; i += mNumRows, j++) {
+            focusable[i] = false;
+        }
+        intent.putExtra(GridActivity.EXTRA_ITEMS_FOCUSABLE, focusable);
+        initActivity(intent);
+
+        mGridView.setSelectedPositionSmooth(startPos);
+        waitForScrollIdle(mVerifyLayout);
+
+        sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);
+        waitForScrollIdle(mVerifyLayout);
+        assertEquals(endPos, mGridView.getSelectedPosition());
+
+        sendKeys(KeyEvent.KEYCODE_DPAD_UP);
+        waitForScrollIdle(mVerifyLayout);
+        assertEquals(startPos, mGridView.getSelectedPosition());
+
+    }
+
+    public void testLtrFocusOutStartDisabled() throws Throwable {
+        final int numItems = 200;
+
+        mInstrumentation = getInstrumentation();
+        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
+        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID, R.layout.vertical_grid_ltr);
+        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, numItems);
+        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
+        mOrientation = BaseGridView.VERTICAL;
+        mNumRows = 1;
+        initActivity(intent);
+
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mGridView.requestFocus();
+                mGridView.setSelectedPositionSmooth(0);
+            }
+        });
+        waitForScrollIdle(mVerifyLayout);
+
+        sendKeys(KeyEvent.KEYCODE_DPAD_LEFT);
+        waitForScrollIdle(mVerifyLayout);
+        assertTrue(mGridView.hasFocus());
+    }
+
+    public void testRtlFocusOutStartDisabled() throws Throwable {
+        final int numItems = 200;
+
+        mInstrumentation = getInstrumentation();
+        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
+        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID, R.layout.vertical_grid_rtl);
+        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, numItems);
+        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
+        mOrientation = BaseGridView.VERTICAL;
+        mNumRows = 1;
+        initActivity(intent);
+
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mGridView.requestFocus();
+                mGridView.setSelectedPositionSmooth(0);
+            }
+        });
+        waitForScrollIdle(mVerifyLayout);
+
+        sendKeys(KeyEvent.KEYCODE_DPAD_RIGHT);
+        waitForScrollIdle(mVerifyLayout);
+        assertTrue(mGridView.hasFocus());
+    }
+
+    public void testTransferFocusable() throws Throwable {
+        final int numItems = 200;
+        final int numColumns = 3;
+        final int startPos = 1;
+
+        mInstrumentation = getInstrumentation();
+        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
+        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
+                R.layout.horizontal_grid);
+        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, numItems);
+        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
+        mOrientation = BaseGridView.HORIZONTAL;
+        mNumRows = numColumns;
+        boolean[] focusable = new boolean[numItems];
+        for (int i = 0; i < focusable.length; i++) {
+            focusable[i] = true;
+        }
+        for (int i = 0; i < startPos; i++) {
+            focusable[i] = false;
+        }
+        intent.putExtra(GridActivity.EXTRA_ITEMS_FOCUSABLE, focusable);
+        initActivity(intent);
+
+        changeArraySize(0);
+        assertTrue(mGridView.isFocused());
+
+        changeArraySize(numItems);
+        assertTrue(mGridView.getLayoutManager().findViewByPosition(startPos).hasFocus());
+    }
+
+    public void testTransferFocusable2() throws Throwable {
+        final int numItems = 200;
+        final int numColumns = 3;
+        final int startPos = 10;
+
+        mInstrumentation = getInstrumentation();
+        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
+        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
+                R.layout.horizontal_grid);
+        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, numItems);
+        intent.putExtra(GridActivity.EXTRA_STAGGERED, true);
+        mOrientation = BaseGridView.HORIZONTAL;
+        mNumRows = numColumns;
+        boolean[] focusable = new boolean[numItems];
+        for (int i = 0; i < focusable.length; i++) {
+            focusable[i] = true;
+        }
+        for (int i = 0; i < startPos; i++) {
+            focusable[i] = false;
+        }
+        intent.putExtra(GridActivity.EXTRA_ITEMS_FOCUSABLE, focusable);
+        initActivity(intent);
+
+        changeArraySize(0);
+        assertTrue(mGridView.isFocused());
+
+        changeArraySize(numItems);
+        assertTrue(mGridView.getLayoutManager().findViewByPosition(startPos).hasFocus());
+    }
+
+    public void testNonFocusableLoseInFastLayout() throws Throwable {
+        mInstrumentation = getInstrumentation();
+        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
+        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
+                R.layout.vertical_linear);
+        int[] items = new int[300];
+        for (int i = 0; i < items.length; i++) {
+            items[i] = 480;
+        }
+        intent.putExtra(GridActivity.EXTRA_ITEMS, items);
+        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
+        intent.putExtra(GridActivity.EXTRA_REQUEST_LAYOUT_ONFOCUS, true);
+        mOrientation = BaseGridView.VERTICAL;
+        mNumRows = 1;
+        int pressDown = 15;
+
+        initActivity(intent);
+
+        mGridView.setSelectedPositionSmooth(0);
+        waitForScrollIdleAndItemAnimation(mVerifyLayout);
+
+        for (int i = 0; i < pressDown; i++) {
+            sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);
+        }
+        waitForScrollIdleAndItemAnimation(mVerifyLayout);
+        assertFalse(mGridView.isFocused());
+
+    }
+
+    public void testFocusableViewAvailable() throws Throwable {
+        mInstrumentation = getInstrumentation();
+        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
+        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
+                R.layout.vertical_linear);
+        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 0);
+        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
+        intent.putExtra(GridActivity.EXTRA_ITEMS_FOCUSABLE,
+                new boolean[]{false, false, true, false, false});
+        mOrientation = BaseGridView.VERTICAL;
+        mNumRows = 1;
+
+        initActivity(intent);
+
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                // RecyclerView does not respect focusable and focusableInTouchMode flag, so
+                // set flags in code.
+                mGridView.setFocusableInTouchMode(false);
+                mGridView.setFocusable(false);
+            }
+        });
+
+        assertFalse(mGridView.isFocused());
+
+        final boolean[] scrolled = new boolean[]{false};
+        mGridView.addOnScrollListener(new RecyclerView.OnScrollListener() {
+            public void onScrolled(RecyclerView recyclerView, int dx, int dy){
+                if (dy > 0) {
+                    scrolled[0] = true;
+                }
+            }
+        });
+        mActivity.addItems(0, new int[]{200, 300, 500, 500, 200});
+        waitForScrollIdleAndItemAnimation(mVerifyLayout);
+
+        assertFalse("GridView should not be scrolled", scrolled[0]);
+        assertTrue(mGridView.getChildAt(1).hasFocus());
+
+    }
+
+    public void testSetSelectionWithDelta() throws Throwable {
+        mInstrumentation = getInstrumentation();
+        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
+        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
+                R.layout.vertical_linear);
+        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 300);
+        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
+        mOrientation = BaseGridView.VERTICAL;
+        mNumRows = 1;
+
+        initActivity(intent);
+
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mGridView.setSelectedPositionSmooth(3);
+            }
+        });
+        waitForScrollIdle(mVerifyLayout);
+        int top1 = mGridView.getLayoutManager().findViewByPosition(3).getTop();
+
+        humanDelay(1000);
+
+        // scroll to position with delta
+        setSelectedPosition(3, 100);
+        int top2 = mGridView.getLayoutManager().findViewByPosition(3).getTop();
+        assertEquals(top1 - 100, top2);
+
+        // scroll to same position without delta, it will be reset
+        setSelectedPosition(3, 0);
+        int top3 = mGridView.getLayoutManager().findViewByPosition(3).getTop();
+        assertEquals(top1, top3);
+
+        // scroll invisible item after last visible item
+        final int lastVisiblePos = ((GridLayoutManager)mGridView.getLayoutManager())
+                .mGrid.getLastVisibleIndex();
+        setSelectedPosition(lastVisiblePos + 1, 100);
+        int top4 = mGridView.getLayoutManager().findViewByPosition(lastVisiblePos + 1).getTop();
+        assertEquals(top1 - 100, top4);
+
+        // scroll invisible item before first visible item
+        final int firstVisiblePos = ((GridLayoutManager)mGridView.getLayoutManager())
+                .mGrid.getFirstVisibleIndex();
+        setSelectedPosition(firstVisiblePos - 1, 100);
+        int top5 = mGridView.getLayoutManager().findViewByPosition(firstVisiblePos - 1).getTop();
+        assertEquals(top1 - 100, top5);
+
+        // scroll to invisible item that is far away.
+        setSelectedPosition(50, 100);
+        int top6 = mGridView.getLayoutManager().findViewByPosition(50).getTop();
+        assertEquals(top1 - 100, top6);
+
+        // scroll to invisible item that is far away.
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mGridView.setSelectedPositionSmooth(100);
+            }
+        });
+        waitForScrollIdle(mVerifyLayout);
+        int top7 = mGridView.getLayoutManager().findViewByPosition(100).getTop();
+        assertEquals(top1, top7);
+
+        // scroll to invisible item that is far away.
+        setSelectedPosition(10, 50);
+        int top8 = mGridView.getLayoutManager().findViewByPosition(10).getTop();
+        assertEquals(top1 - 50, top8);
+    }
+
+    public void testSetSelectionWithDeltaInGrid() throws Throwable {
+        mInstrumentation = getInstrumentation();
+        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
+        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
+                R.layout.vertical_grid);
+        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 500);
+        intent.putExtra(GridActivity.EXTRA_STAGGERED, true);
+        mOrientation = BaseGridView.VERTICAL;
+        mNumRows = 3;
+
+        initActivity(intent);
+
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mGridView.setSelectedPositionSmooth(10);
+            }
+        });
+        waitForScrollIdle(mVerifyLayout);
+        int top1 = getCenterY(mGridView.getLayoutManager().findViewByPosition(10));
+
+        humanDelay(500);
+
+        // scroll to position with delta
+        setSelectedPosition(20, 100);
+        int top2 = getCenterY(mGridView.getLayoutManager().findViewByPosition(20));
+        assertEquals(top1 - 100, top2);
+
+        // scroll to same position without delta, it will be reset
+        setSelectedPosition(20, 0);
+        int top3 = getCenterY(mGridView.getLayoutManager().findViewByPosition(20));
+        assertEquals(top1, top3);
+
+        // scroll invisible item after last visible item
+        final int lastVisiblePos = ((GridLayoutManager)mGridView.getLayoutManager())
+                .mGrid.getLastVisibleIndex();
+        setSelectedPosition(lastVisiblePos + 1, 100);
+        int top4 = getCenterY(mGridView.getLayoutManager().findViewByPosition(lastVisiblePos + 1));
+        verifyMargin();
+        assertEquals(top1 - 100, top4);
+
+        // scroll invisible item before first visible item
+        final int firstVisiblePos = ((GridLayoutManager)mGridView.getLayoutManager())
+                .mGrid.getFirstVisibleIndex();
+        setSelectedPosition(firstVisiblePos - 1, 100);
+        int top5 = getCenterY(mGridView.getLayoutManager().findViewByPosition(firstVisiblePos - 1));
+        assertEquals(top1 - 100, top5);
+
+        // scroll to invisible item that is far away.
+        setSelectedPosition(100, 100);
+        int top6 = getCenterY(mGridView.getLayoutManager().findViewByPosition(100));
+        assertEquals(top1 - 100, top6);
+
+        // scroll to invisible item that is far away.
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mGridView.setSelectedPositionSmooth(200);
+            }
+        });
+        waitForScrollIdle(mVerifyLayout);
+        Thread.sleep(500);
+        int top7 = getCenterY(mGridView.getLayoutManager().findViewByPosition(200));
+        assertEquals(top1, top7);
+
+        // scroll to invisible item that is far away.
+        setSelectedPosition(10, 50);
+        int top8 = getCenterY(mGridView.getLayoutManager().findViewByPosition(10));
+        assertEquals(top1 - 50, top8);
+    }
+
+
+    public void testSetSelectionWithDeltaInGrid1() throws Throwable {
+        mInstrumentation = getInstrumentation();
+        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
+        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
+                R.layout.vertical_grid);
+        intent.putExtra(GridActivity.EXTRA_ITEMS, new int[]{
+                193,176,153,141,203,184,232,139,177,206,222,136,132,237,172,137,
+                188,172,163,213,158,219,209,147,133,229,170,197,138,215,188,205,
+                223,192,225,170,195,127,229,229,210,195,134,142,160,139,130,222,
+                150,163,180,176,157,137,234,169,159,167,182,150,224,231,202,236,
+                123,140,181,223,120,185,183,221,123,210,134,158,166,208,149,128,
+                192,214,212,198,133,140,158,133,229,173,226,141,180,128,127,218,
+                192,235,183,213,216,150,143,193,125,141,219,210,195,195,192,191,
+                212,236,157,189,160,220,147,158,220,199,233,231,201,180,168,141,
+                156,204,191,183,190,153,123,210,238,151,139,221,223,200,175,191,
+                132,184,197,204,236,157,230,151,195,219,212,143,172,149,219,184,
+                164,211,132,187,172,142,174,146,127,147,206,238,188,129,199,226,
+                132,220,210,159,235,153,208,182,196,123,180,159,131,135,175,226,
+                127,134,237,211,133,225,132,124,160,226,224,200,173,137,217,169,
+                182,183,176,185,122,168,195,159,172,129,126,129,166,136,149,220,
+                178,191,192,238,180,208,234,154,222,206,239,228,129,140,203,125,
+                214,175,125,169,196,132,234,138,192,142,234,190,215,232,239,122,
+                188,158,128,221,159,237,207,157,232,138,132,214,122,199,121,191,
+                199,209,126,164,175,187,173,186,194,224,191,196,146,208,213,210,
+                164,176,202,213,123,157,179,138,217,129,186,166,237,211,157,130,
+                137,132,171,232,216,239,180,151,137,132,190,133,218,155,171,227,
+                193,147,197,164,120,218,193,154,170,196,138,222,161,235,143,154,
+                192,178,228,195,178,133,203,178,173,206,178,212,136,157,169,124,
+                172,121,128,223,238,125,217,187,184,156,169,215,231,124,210,174,
+                146,226,185,134,223,228,183,182,136,133,199,146,180,233,226,225,
+                174,233,145,235,216,170,192,171,132,132,134,223,233,148,154,162,
+                192,179,197,203,139,197,174,187,135,132,180,136,192,195,124,221,
+                120,189,233,233,146,225,234,163,215,143,132,198,156,205,151,190,
+                204,239,221,229,123,138,134,217,219,136,218,215,167,139,195,125,
+                202,225,178,226,145,208,130,194,228,197,157,215,124,147,174,123,
+                237,140,172,181,161,151,229,216,199,199,179,213,146,122,222,162,
+                139,173,165,150,160,217,207,137,165,175,129,158,134,133,178,199,
+                215,213,122,197
+        });
+        intent.putExtra(GridActivity.EXTRA_STAGGERED, true);
+        mOrientation = BaseGridView.VERTICAL;
+        mNumRows = 3;
+
+        initActivity(intent);
+
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mGridView.setSelectedPositionSmooth(10);
+            }
+        });
+        waitForScrollIdle(mVerifyLayout);
+        int top1 = getCenterY(mGridView.getLayoutManager().findViewByPosition(10));
+
+        humanDelay(500);
+
+        // scroll to position with delta
+        setSelectedPosition(20, 100);
+        int top2 = getCenterY(mGridView.getLayoutManager().findViewByPosition(20));
+        assertEquals(top1 - 100, top2);
+
+        // scroll to same position without delta, it will be reset
+        setSelectedPosition(20, 0);
+        int top3 = getCenterY(mGridView.getLayoutManager().findViewByPosition(20));
+        assertEquals(top1, top3);
+
+        // scroll invisible item after last visible item
+        final int lastVisiblePos = ((GridLayoutManager)mGridView.getLayoutManager())
+                .mGrid.getLastVisibleIndex();
+        setSelectedPosition(lastVisiblePos + 1, 100);
+        int top4 = getCenterY(mGridView.getLayoutManager().findViewByPosition(lastVisiblePos + 1));
+        verifyMargin();
+        assertEquals(top1 - 100, top4);
+
+        // scroll invisible item before first visible item
+        final int firstVisiblePos = ((GridLayoutManager)mGridView.getLayoutManager())
+                .mGrid.getFirstVisibleIndex();
+        setSelectedPosition(firstVisiblePos - 1, 100);
+        int top5 = getCenterY(mGridView.getLayoutManager().findViewByPosition(firstVisiblePos - 1));
+        assertEquals(top1 - 100, top5);
+
+        // scroll to invisible item that is far away.
+        setSelectedPosition(100, 100);
+        int top6 = getCenterY(mGridView.getLayoutManager().findViewByPosition(100));
+        assertEquals(top1 - 100, top6);
+
+        // scroll to invisible item that is far away.
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mGridView.setSelectedPositionSmooth(200);
+            }
+        });
+        waitForScrollIdle(mVerifyLayout);
+        Thread.sleep(500);
+        int top7 = getCenterY(mGridView.getLayoutManager().findViewByPosition(200));
+        assertEquals(top1, top7);
+
+        // scroll to invisible item that is far away.
+        setSelectedPosition(10, 50);
+        int top8 = getCenterY(mGridView.getLayoutManager().findViewByPosition(10));
+        assertEquals(top1 - 50, top8);
+    }
+
+    public void testSmoothScrollSelectionEvents() throws Throwable {
+        mInstrumentation = getInstrumentation();
+        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
+        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
+                R.layout.vertical_grid);
+        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 500);
+        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
+        mOrientation = BaseGridView.VERTICAL;
+        mNumRows = 3;
+        initActivity(intent);
+
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mGridView.setSelectedPositionSmooth(30);
+            }
+        });
+        waitForScrollIdle(mVerifyLayout);
+        humanDelay(500);
+
+        final ArrayList<Integer> selectedPositions = new ArrayList<Integer>();
+        mGridView.setOnChildSelectedListener(new OnChildSelectedListener() {
+            @Override
+            public void onChildSelected(ViewGroup parent, View view, int position, long id) {
+                selectedPositions.add(position);
+            }
+        });
+
+        sendRepeatedKeys(10, KeyEvent.KEYCODE_DPAD_UP);
+        humanDelay(500);
+        waitForScrollIdle(mVerifyLayout);
+        // should only get childselected event for item 0 once
+        assertTrue(selectedPositions.size() > 0);
+        assertEquals(0, selectedPositions.get(selectedPositions.size() - 1).intValue());
+        for (int i = selectedPositions.size() - 2; i >= 0; i--) {
+            assertFalse(0 == selectedPositions.get(i).intValue());
+        }
+
+    }
+
+    public void testSmoothScrollSelectionEventsLinear() throws Throwable {
+        mInstrumentation = getInstrumentation();
+        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
+        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
+                R.layout.vertical_linear);
+        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 500);
+        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
+        mOrientation = BaseGridView.VERTICAL;
+        mNumRows = 1;
+        initActivity(intent);
+
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mGridView.setSelectedPositionSmooth(10);
+            }
+        });
+        waitForScrollIdle(mVerifyLayout);
+        humanDelay(500);
+
+        final ArrayList<Integer> selectedPositions = new ArrayList<Integer>();
+        mGridView.setOnChildSelectedListener(new OnChildSelectedListener() {
+            @Override
+            public void onChildSelected(ViewGroup parent, View view, int position, long id) {
+                selectedPositions.add(position);
+            }
+        });
+
+        sendRepeatedKeys(10, KeyEvent.KEYCODE_DPAD_UP);
+        humanDelay(500);
+        waitForScrollIdle(mVerifyLayout);
+        // should only get childselected event for item 0 once
+        assertTrue(selectedPositions.size() > 0);
+        assertEquals(0, selectedPositions.get(selectedPositions.size() - 1).intValue());
+        for (int i = selectedPositions.size() - 2; i >= 0; i--) {
+            assertFalse(0 == selectedPositions.get(i).intValue());
+        }
+
+    }
+
+    public void testScrollToNoneExisting() throws Throwable {
+        mInstrumentation = getInstrumentation();
+        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
+        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
+                R.layout.vertical_grid);
+        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 100);
+        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
+        mOrientation = BaseGridView.VERTICAL;
+        mNumRows = 3;
+        initActivity(intent);
+
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mGridView.setSelectedPositionSmooth(99);
+            }
+        });
+        waitForScrollIdle(mVerifyLayout);
+        humanDelay(500);
+
+
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mGridView.setSelectedPositionSmooth(50);
+            }
+        });
+        Thread.sleep(100);
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mGridView.requestLayout();
+                mGridView.setSelectedPositionSmooth(0);
+            }
+        });
+        waitForScrollIdle(mVerifyLayout);
+        humanDelay(500);
+
+    }
+
+    public void testSmoothscrollerInterrupted() throws Throwable {
+        mInstrumentation = getInstrumentation();
+        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
+        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
+                R.layout.vertical_linear);
+        intent.putExtra(GridActivity.EXTRA_REQUEST_FOCUS_ONLAYOUT, true);
+        int[] items = new int[100];
+        for (int i = 0; i < items.length; i++) {
+            items[i] = 680;
+        }
+        intent.putExtra(GridActivity.EXTRA_ITEMS, items);
+        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
+        mOrientation = BaseGridView.VERTICAL;
+        mNumRows = 1;
+
+        initActivity(intent);
+
+        mGridView.setSelectedPositionSmooth(0);
+        waitForScrollIdle(mVerifyLayout);
+        assertTrue(mGridView.getChildAt(0).hasFocus());
+
+        // Pressing lots of key to make sure smooth scroller is running
+        for (int i = 0; i < 20; i++) {
+            sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);
+        }
+        Thread.sleep(100);
+        int total = 0;
+        while (mGridView.getLayoutManager().isSmoothScrolling() ||
+                mGridView.getScrollState() != BaseGridView.SCROLL_STATE_IDLE) {
+            if ((total += 10) >= WAIT_FOR_SCROLL_IDLE_TIMEOUT_MS) {
+                throw new RuntimeException("waitForScrollIdle Timeout");
+            }
+            try {
+                // Repeatedly pressing to make sure pending keys does not drop to zero.
+                Thread.sleep(10);
+                sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);
+            } catch (InterruptedException ex) {
+                break;
+            }
+        }
+
+        assertTrue("LinearSmoothScroller would not use many RV.smoothScrollBy() calls",
+                ((VerticalGridViewEx) mGridView).mSmoothScrollByCalled < 10);
+    }
+
+    public void testSmoothscrollerCancelled() throws Throwable {
+        mInstrumentation = getInstrumentation();
+        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
+        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
+                R.layout.vertical_linear);
+        intent.putExtra(GridActivity.EXTRA_REQUEST_FOCUS_ONLAYOUT, true);
+        int[] items = new int[100];
+        for (int i = 0; i < items.length; i++) {
+            items[i] = 680;
+        }
+        intent.putExtra(GridActivity.EXTRA_ITEMS, items);
+        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
+        mOrientation = BaseGridView.VERTICAL;
+        mNumRows = 1;
+
+        initActivity(intent);
+
+        mGridView.setSelectedPositionSmooth(0);
+        waitForScrollIdle(mVerifyLayout);
+        assertTrue(mGridView.getChildAt(0).hasFocus());
+
+        int targetPosition = items.length - 1;
+        mGridView.setSelectedPositionSmooth(targetPosition);
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mGridView.stopScroll();
+            }
+        });
+        Thread.sleep(100);
+        assertEquals(mGridView.getSelectedPosition(), targetPosition);
+        assertSame(mGridView.getLayoutManager().findViewByPosition(targetPosition),
+                mGridView.findFocus());
+    }
+
+    public void testSetNumRowsAndAddItem() throws Throwable {
+        mInstrumentation = getInstrumentation();
+        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
+        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
+                R.layout.vertical_linear);
+        intent.putExtra(GridActivity.EXTRA_REQUEST_FOCUS_ONLAYOUT, true);
+        int[] items = new int[2];
+        for (int i = 0; i < items.length; i++) {
+            items[i] = 300;
+        }
+        intent.putExtra(GridActivity.EXTRA_ITEMS, items);
+        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
+        mOrientation = BaseGridView.VERTICAL;
+        mNumRows = 1;
+
+        initActivity(intent);
+
+        mGridView.setSelectedPositionSmooth(0);
+        waitForScrollIdle(mVerifyLayout);
+
+        mActivity.addItems(items.length, new int[]{300});
+
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                ((VerticalGridView) mGridView).setNumColumns(2);
+            }
+        });
+        Thread.sleep(1000);
+        assertTrue(mGridView.getChildAt(2).getLeft() != mGridView.getChildAt(1).getLeft());
+    }
+
+
+    public void testRequestLayoutBugInLayout() throws Throwable {
+        mInstrumentation = getInstrumentation();
+        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
+        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
+                R.layout.vertical_linear);
+        intent.putExtra(GridActivity.EXTRA_CHILD_LAYOUT_ID, R.layout.relative_layout);
+        intent.putExtra(GridActivity.EXTRA_REQUEST_FOCUS_ONLAYOUT, true);
+        int[] items = new int[100];
+        for (int i = 0; i < items.length; i++) {
+            items[i] = 300;
+        }
+        intent.putExtra(GridActivity.EXTRA_ITEMS, items);
+        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
+        mOrientation = BaseGridView.VERTICAL;
+        mNumRows = 1;
+
+        initActivity(intent);
+
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mGridView.setSelectedPositionSmooth(1);
+            }
+        });
+        waitForScrollIdle(mVerifyLayout);
+
+        sendKeys(KeyEvent.KEYCODE_DPAD_UP);
+        waitForScrollIdle(mVerifyLayout);
+
+        assertEquals("Line 2", ((TextView) mGridView.findFocus()).getText().toString());
+    }
+
+
+    public void testChangeLayoutInChild() throws Throwable {
+        mInstrumentation = getInstrumentation();
+        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
+        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
+                R.layout.vertical_linear_wrap_content);
+        intent.putExtra(GridActivity.EXTRA_REQUEST_LAYOUT_ONFOCUS, true);
+        int[] items = new int[2];
+        for (int i = 0; i < items.length; i++) {
+            items[i] = 300;
+        }
+        intent.putExtra(GridActivity.EXTRA_ITEMS, items);
+        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
+        mOrientation = BaseGridView.VERTICAL;
+        mNumRows = 1;
+
+        initActivity(intent);
+
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mGridView.setSelectedPositionSmooth(0);
+            }
+        });
+        waitForScrollIdleAndItemAnimation(mVerifyLayout);
+        verifyMargin();
+
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mGridView.setSelectedPositionSmooth(1);
+            }
+        });
+        waitForScrollIdleAndItemAnimation(mVerifyLayout);
+        verifyMargin();
+    }
+
+    public void testWrapContent() throws Throwable {
+        mInstrumentation = getInstrumentation();
+        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
+        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
+                R.layout.horizontal_grid_wrap);
+        int[] items = new int[200];
+        for (int i = 0; i < items.length; i++) {
+            items[i] = 300;
+        }
+        intent.putExtra(GridActivity.EXTRA_ITEMS, items);
+        mOrientation = BaseGridView.HORIZONTAL;
+        mNumRows = 1;
+
+        initActivity(intent);
+
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mActivity.attachToNewAdapter(new int[0]);
+            }
+        });
+
+    }
+
+
+    public void testZeroFixedSecondarySize() throws Throwable {
+        mInstrumentation = getInstrumentation();
+        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
+        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
+                R.layout.vertical_linear_measured_with_zero);
+        intent.putExtra(GridActivity.EXTRA_SECONDARY_SIZE_ZERO, true);
+        int[] items = new int[2];
+        for (int i = 0; i < items.length; i++) {
+            items[i] = 0;
+        }
+        intent.putExtra(GridActivity.EXTRA_ITEMS, items);
+        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
+        mOrientation = BaseGridView.VERTICAL;
+        mNumRows = 1;
+
+        initActivity(intent);
+
+    }
+
+    public void testChildStates() throws Throwable {
+        mInstrumentation = getInstrumentation();
+        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
+        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID, R.layout.vertical_linear);
+        int[] items = new int[100];
+        for (int i = 0; i < items.length; i++) {
+            items[i] = 200;
+        }
+        intent.putExtra(GridActivity.EXTRA_ITEMS, items);
+        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
+        intent.putExtra(GridActivity.EXTRA_REQUEST_LAYOUT_ONFOCUS, true);
+        intent.putExtra(GridActivity.EXTRA_CHILD_LAYOUT_ID, R.layout.selectable_text_view);
+        mOrientation = BaseGridView.VERTICAL;
+        mNumRows = 1;
+
+        initActivity(intent);
+        mGridView.setSaveChildrenPolicy(VerticalGridView.SAVE_ALL_CHILD);
+
+        final SparseArray<Parcelable> container = new SparseArray<Parcelable>();
+
+        // 1 Save view states
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                Selection.setSelection((Spannable)(((TextView) mGridView.getChildAt(0))
+                        .getText()), 0, 1);
+                Selection.setSelection((Spannable)(((TextView) mGridView.getChildAt(1))
+                        .getText()), 0, 1);
+                mGridView.saveHierarchyState(container);
+            }
+        });
+
+        // 2 Change view states
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                Selection.setSelection((Spannable)(((TextView) mGridView.getChildAt(0))
+                        .getText()), 1, 2);
+                Selection.setSelection((Spannable)(((TextView) mGridView.getChildAt(1))
+                        .getText()), 1, 2);
+            }
+        });
+
+        // 3 Detached and re-attached,  should still maintain state of (2)
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mGridView.setSelectedPositionSmooth(1);
+            }
+        });
+        waitForScrollIdleAndItemAnimation(mVerifyLayout);
+        assertEquals(((TextView) mGridView.getChildAt(0)).getSelectionStart(), 1);
+        assertEquals(((TextView) mGridView.getChildAt(0)).getSelectionEnd(), 2);
+        assertEquals(((TextView) mGridView.getChildAt(1)).getSelectionStart(), 1);
+        assertEquals(((TextView) mGridView.getChildAt(1)).getSelectionEnd(), 2);
+
+        // 4 Recycled and rebound, should load state from (2)
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mGridView.setSelectedPositionSmooth(20);
+            }
+        });
+        waitForScrollIdle(mVerifyLayout);
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mGridView.setSelectedPositionSmooth(0);
+            }
+        });
+        waitForScrollIdleAndItemAnimation(mVerifyLayout);
+        assertEquals(((TextView) mGridView.getChildAt(0)).getSelectionStart(), 1);
+        assertEquals(((TextView) mGridView.getChildAt(0)).getSelectionEnd(), 2);
+        assertEquals(((TextView) mGridView.getChildAt(1)).getSelectionStart(), 1);
+        assertEquals(((TextView) mGridView.getChildAt(1)).getSelectionEnd(), 2);
+    }
+
+
+    public void testNoDispatchSaveChildState() throws Throwable {
+        mInstrumentation = getInstrumentation();
+        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
+        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID, R.layout.vertical_linear);
+        int[] items = new int[100];
+        for (int i = 0; i < items.length; i++) {
+            items[i] = 200;
+        }
+        intent.putExtra(GridActivity.EXTRA_ITEMS, items);
+        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
+        intent.putExtra(GridActivity.EXTRA_CHILD_LAYOUT_ID, R.layout.selectable_text_view);
+        mOrientation = BaseGridView.VERTICAL;
+        mNumRows = 1;
+
+        initActivity(intent);
+        mGridView.setSaveChildrenPolicy(VerticalGridView.SAVE_NO_CHILD);
+
+        final SparseArray<Parcelable> container = new SparseArray<Parcelable>();
+
+        // 1. Set text selection, save view states should do nothing on child
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                for (int i = 0; i < mGridView.getChildCount(); i++) {
+                    Selection.setSelection((Spannable)(((TextView) mGridView.getChildAt(i))
+                            .getText()), 0, 1);
+                }
+                mGridView.saveHierarchyState(container);
+            }
+        });
+
+        // 2. clear the text selection
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                for (int i = 0; i < mGridView.getChildCount(); i++) {
+                    Selection.removeSelection((Spannable)(((TextView) mGridView.getChildAt(i))
+                            .getText()));
+                }
+            }
+        });
+
+        // 3. Restore view states should be a no-op for child
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mGridView.restoreHierarchyState(container);
+                for (int i = 0; i < mGridView.getChildCount(); i++) {
+                    assertEquals(-1, ((TextView) mGridView.getChildAt(i)).getSelectionStart());
+                    assertEquals(-1, ((TextView) mGridView.getChildAt(i)).getSelectionEnd());
+                }
+            }
+        });
+    }
+
+
+    static interface ViewTypeProvider {
+        public int getViewType(int position);
+    }
+
+    static interface ItemAlignmentFacetProvider {
+        public ItemAlignmentFacet getItemAlignmentFacet(int viewType);
+    }
+
+    static class TwoViewTypesProvider implements ViewTypeProvider {
+        static int VIEW_TYPE_FIRST = 1;
+        static int VIEW_TYPE_DEFAULT = 0;
+        @Override
+        public int getViewType(int position) {
+            if (position == 0) {
+                return VIEW_TYPE_FIRST;
+            } else {
+                return VIEW_TYPE_DEFAULT;
+            }
+        }
+    }
+
+    static class ChangeableViewTypesProvider implements ViewTypeProvider {
+        static SparseIntArray sViewTypes = new SparseIntArray();
+        @Override
+        public int getViewType(int position) {
+            return sViewTypes.get(position);
+        }
+        public static void clear() {
+            sViewTypes.clear();
+        }
+        public static void setViewType(int position, int type) {
+            sViewTypes.put(position, type);
+        }
+    }
+
+    static class PositionItemAlignmentFacetProviderForRelativeLayout1
+            implements ItemAlignmentFacetProvider {
+        ItemAlignmentFacet mMultipleFacet;
+
+        PositionItemAlignmentFacetProviderForRelativeLayout1() {
+            mMultipleFacet = new ItemAlignmentFacet();
+            ItemAlignmentFacet.ItemAlignmentDef[] defs =
+                    new ItemAlignmentFacet.ItemAlignmentDef[2];
+            defs[0] = new ItemAlignmentFacet.ItemAlignmentDef();
+            defs[0].setItemAlignmentViewId(R.id.t1);
+            defs[1] = new ItemAlignmentFacet.ItemAlignmentDef();
+            defs[1].setItemAlignmentViewId(R.id.t2);
+            defs[1].setItemAlignmentOffsetPercent(100);
+            defs[1].setItemAlignmentOffset(-10);
+            mMultipleFacet.setAlignmentDefs(defs);
+        }
+
+        @Override
+        public ItemAlignmentFacet getItemAlignmentFacet(int position) {
+            if (position == 0) {
+                return mMultipleFacet;
+            } else {
+                return null;
+            }
+        }
+    }
+
+    public void testMultipleScrollPosition1() throws Throwable {
+        mInstrumentation = getInstrumentation();
+        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
+        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
+                R.layout.vertical_linear);
+        intent.putExtra(GridActivity.EXTRA_CHILD_LAYOUT_ID, R.layout.relative_layout);
+        intent.putExtra(GridActivity.EXTRA_REQUEST_FOCUS_ONLAYOUT, true);
+        int[] items = new int[100];
+        for (int i = 0; i < items.length; i++) {
+            items[i] = 300;
+        }
+        intent.putExtra(GridActivity.EXTRA_ITEMS, items);
+        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
+        intent.putExtra(GridActivity.EXTRA_VIEWTYPEPROVIDER_CLASS,
+                TwoViewTypesProvider.class.getName());
+        // Set ItemAlignment for each ViewHolder and view type,  ViewHolder should
+        // override the view type settings.
+        intent.putExtra(GridActivity.EXTRA_ITEMALIGNMENTPROVIDER_CLASS,
+                PositionItemAlignmentFacetProviderForRelativeLayout1.class.getName());
+        intent.putExtra(GridActivity.EXTRA_ITEMALIGNMENTPROVIDER_VIEWTYPE_CLASS,
+                ViewTypePositionItemAlignmentFacetProviderForRelativeLayout2.class.getName());
+        mOrientation = BaseGridView.VERTICAL;
+        mNumRows = 1;
+
+        initActivity(intent);
+
+        assertEquals("First view is aligned with padding top",
+                mGridView.getPaddingTop(), mGridView.getChildAt(0).getTop());
+
+        sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);
+        waitForScrollIdle(mVerifyLayout);
+
+        final View v = mGridView.getChildAt(0);
+        View t1 = v.findViewById(R.id.t1);
+        int t1align = (t1.getTop() + t1.getBottom()) / 2;
+        View t2 = v.findViewById(R.id.t2);
+        int t2align = t2.getBottom() - 10;
+        assertEquals("Expected alignment for 2nd textview",
+                mGridView.getPaddingTop() - (t2align - t1align),
+                v.getTop());
+    }
+
+    static class PositionItemAlignmentFacetProviderForRelativeLayout2 implements
+            ItemAlignmentFacetProvider {
+        ItemAlignmentFacet mMultipleFacet;
+
+        PositionItemAlignmentFacetProviderForRelativeLayout2() {
+            mMultipleFacet = new ItemAlignmentFacet();
+            ItemAlignmentFacet.ItemAlignmentDef[] defs = new ItemAlignmentFacet.ItemAlignmentDef[2];
+            defs[0] = new ItemAlignmentFacet.ItemAlignmentDef();
+            defs[0].setItemAlignmentViewId(R.id.t1);
+            defs[0].setItemAlignmentOffsetPercent(0);
+            defs[1] = new ItemAlignmentFacet.ItemAlignmentDef();
+            defs[1].setItemAlignmentViewId(R.id.t2);
+            defs[1].setItemAlignmentOffsetPercent(ItemAlignmentFacet.ITEM_ALIGN_OFFSET_PERCENT_DISABLED);
+            defs[1].setItemAlignmentOffset(-10);
+            mMultipleFacet.setAlignmentDefs(defs);
+        }
+
+        @Override
+        public ItemAlignmentFacet getItemAlignmentFacet(int position) {
+            if (position == 0) {
+                return mMultipleFacet;
+            } else {
+                return null;
+            }
+        }
+    }
+
+    public void testMultipleScrollPosition2() throws Throwable {
+        mInstrumentation = getInstrumentation();
+        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
+        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID, R.layout.vertical_linear);
+        intent.putExtra(GridActivity.EXTRA_CHILD_LAYOUT_ID, R.layout.relative_layout);
+        intent.putExtra(GridActivity.EXTRA_REQUEST_FOCUS_ONLAYOUT, true);
+        int[] items = new int[100];
+        for (int i = 0; i < items.length; i++) {
+            items[i] = 300;
+        }
+        intent.putExtra(GridActivity.EXTRA_ITEMS, items);
+        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
+        intent.putExtra(GridActivity.EXTRA_VIEWTYPEPROVIDER_CLASS,
+                TwoViewTypesProvider.class.getName());
+        intent.putExtra(GridActivity.EXTRA_ITEMALIGNMENTPROVIDER_CLASS,
+                PositionItemAlignmentFacetProviderForRelativeLayout2.class.getName());
+        mOrientation = BaseGridView.VERTICAL;
+        mNumRows = 1;
+
+        initActivity(intent);
+
+        assertEquals("First view is aligned with padding top", mGridView.getPaddingTop(),
+                mGridView.getChildAt(0).getTop());
+
+        sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);
+        waitForScrollIdle(mVerifyLayout);
+
+        final View v = mGridView.getChildAt(0);
+        View t1 = v.findViewById(R.id.t1);
+        int t1align = t1.getTop();
+        View t2 = v.findViewById(R.id.t2);
+        int t2align = t2.getTop() - 10;
+        assertEquals("Expected alignment for 2nd textview",
+                mGridView.getPaddingTop() - (t2align - t1align), v.getTop());
+    }
+
+    static class ViewTypePositionItemAlignmentFacetProviderForRelativeLayout2 implements
+            ItemAlignmentFacetProvider {
+        ItemAlignmentFacet mMultipleFacet;
+
+        ViewTypePositionItemAlignmentFacetProviderForRelativeLayout2() {
+            mMultipleFacet = new ItemAlignmentFacet();
+            ItemAlignmentFacet.ItemAlignmentDef[] defs = new ItemAlignmentFacet.ItemAlignmentDef[2];
+            defs[0] = new ItemAlignmentFacet.ItemAlignmentDef();
+            defs[0].setItemAlignmentViewId(R.id.t1);
+            defs[0].setItemAlignmentOffsetPercent(0);
+            defs[1] = new ItemAlignmentFacet.ItemAlignmentDef();
+            defs[1].setItemAlignmentViewId(R.id.t2);
+            defs[1].setItemAlignmentOffsetPercent(100);
+            defs[1].setItemAlignmentOffset(-10);
+            mMultipleFacet.setAlignmentDefs(defs);
+        }
+
+        @Override
+        public ItemAlignmentFacet getItemAlignmentFacet(int viewType) {
+            if (viewType == TwoViewTypesProvider.VIEW_TYPE_FIRST) {
+                return mMultipleFacet;
+            } else {
+                return null;
+            }
+        }
+    }
+
+    public void testMultipleScrollPosition3() throws Throwable {
+        mInstrumentation = getInstrumentation();
+        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
+        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID, R.layout.vertical_linear);
+        intent.putExtra(GridActivity.EXTRA_CHILD_LAYOUT_ID, R.layout.relative_layout);
+        intent.putExtra(GridActivity.EXTRA_REQUEST_FOCUS_ONLAYOUT, true);
+        int[] items = new int[100];
+        for (int i = 0; i < items.length; i++) {
+            items[i] = 300;
+        }
+        intent.putExtra(GridActivity.EXTRA_ITEMS, items);
+        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
+        intent.putExtra(GridActivity.EXTRA_VIEWTYPEPROVIDER_CLASS,
+                TwoViewTypesProvider.class.getName());
+        intent.putExtra(GridActivity.EXTRA_ITEMALIGNMENTPROVIDER_VIEWTYPE_CLASS,
+                ViewTypePositionItemAlignmentFacetProviderForRelativeLayout2.class.getName());
+        mOrientation = BaseGridView.VERTICAL;
+        mNumRows = 1;
+
+        initActivity(intent);
+
+        assertEquals("First view is aligned with padding top", mGridView.getPaddingTop(),
+                mGridView.getChildAt(0).getTop());
+
+        sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);
+        waitForScrollIdle(mVerifyLayout);
+
+        final View v = mGridView.getChildAt(0);
+        View t1 = v.findViewById(R.id.t1);
+        int t1align = t1.getTop();
+        View t2 = v.findViewById(R.id.t2);
+        int t2align = t2.getBottom() - 10;
+        assertEquals("Expected alignment for 2nd textview",
+                mGridView.getPaddingTop() - (t2align - t1align), v.getTop());
+    }
+
+    public void testSelectionAndAddItemInOneCycle() throws Throwable {
+        mInstrumentation = getInstrumentation();
+        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
+        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
+                R.layout.vertical_linear);
+        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 0);
+        initActivity(intent);
+        mOrientation = BaseGridView.HORIZONTAL;
+        mNumRows = 1;
+
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mActivity.addItems(0, new int[]{300, 300});
+                mGridView.setSelectedPosition(0);
+            }
+        });
+        waitForTransientStateGone(null);
+        assertEquals(0, mGridView.getSelectedPosition());
+    }
+
+    public void testNotifyItemTypeChangedSelectionEvent() throws Throwable {
+        mInstrumentation = getInstrumentation();
+        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
+        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
+                R.layout.vertical_linear);
+        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 10);
+        intent.putExtra(GridActivity.EXTRA_VIEWTYPEPROVIDER_CLASS,
+                ChangeableViewTypesProvider.class.getName());
+        ChangeableViewTypesProvider.clear();
+        initActivity(intent);
+        mOrientation = BaseGridView.HORIZONTAL;
+        mNumRows = 1;
+
+        final ArrayList<Integer> selectedLog = new ArrayList<Integer>();
+        mGridView.setOnChildSelectedListener(new OnChildSelectedListener() {
+            public void onChildSelected(ViewGroup parent, View view, int position, long id) {
+                selectedLog.add(position);
+            }
+        });
+
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                ChangeableViewTypesProvider.setViewType(0, 1);
+                mGridView.getAdapter().notifyItemChanged(0, 1);
+            }
+        });
+        waitForTransientStateGone(null);
+        assertEquals(0, mGridView.getSelectedPosition());
+        assertEquals(selectedLog.size(), 1);
+        assertEquals((int) selectedLog.get(0), 0);
+    }
+
+    public void testSelectionSmoothAndAddItemInOneCycle() throws Throwable {
+        mInstrumentation = getInstrumentation();
+        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
+        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
+                R.layout.vertical_linear);
+        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 0);
+        initActivity(intent);
+        mOrientation = BaseGridView.HORIZONTAL;
+        mNumRows = 1;
+
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mActivity.addItems(0, new int[]{300, 300});
+                mGridView.setSelectedPositionSmooth(0);
+            }
+        });
+        waitForTransientStateGone(null);
+        assertEquals(0, mGridView.getSelectedPosition());
+    }
+
+    public void testExtraLayoutSpace() throws Throwable {
+        mInstrumentation = getInstrumentation();
+        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
+        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
+                R.layout.vertical_linear);
+        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 1000);
+        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
+        initActivity(intent);
+
+        final int windowSize = mGridView.getHeight();
+        final int extraLayoutSize = windowSize;
+        int itemLength = mActivity.mItemLengths[0];
+        mOrientation = BaseGridView.VERTICAL;
+        mNumRows = 1;
+
+        // add extra layout space
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mGridView.setExtraLayoutSpace(extraLayoutSize);
+            }
+        });
+        Thread.sleep(50);
+        View v;
+        v = mGridView.getChildAt(mGridView.getChildCount() - 1);
+        assertTrue(v.getTop() < windowSize + extraLayoutSize);
+        assertTrue(v.getBottom() >= windowSize + extraLayoutSize -
+                mGridView.getVerticalMargin());
+
+        mGridView.setSelectedPositionSmooth(150);
+        waitForScrollIdle(mVerifyLayout);
+        v = mGridView.getChildAt(0);
+        assertTrue(v.getBottom() > - extraLayoutSize);
+        assertTrue(v.getTop() <= -extraLayoutSize + mGridView.getVerticalMargin());
+
+        // clear extra layout space
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                mGridView.setExtraLayoutSpace(0);
+                verifyMargin();
+            }
+        });
+        Thread.sleep(50);
+        v = mGridView.getChildAt(mGridView.getChildCount() - 1);
+        assertTrue(v.getTop() < windowSize);
+        assertTrue(v.getBottom() >= windowSize - mGridView.getVerticalMargin());
+    }
+
+    public void testFocusFinder() throws Throwable {
+        mInstrumentation = getInstrumentation();
+        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
+        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
+                R.layout.vertical_linear_with_button);
+        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 3);
+        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
+        initActivity(intent);
+        mOrientation = BaseGridView.VERTICAL;
+        mNumRows = 1;
+
+        // test focus from button to vertical grid view
+        final View button = mActivity.findViewById(R.id.button);
+        assertTrue(button.isFocused());
+        sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);
+        assertFalse(mGridView.isFocused());
+        assertTrue(mGridView.hasFocus());
+
+        // FocusFinder should find last focused(2nd) item on DPAD_DOWN
+        final View secondChild = mGridView.getChildAt(1);
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                secondChild.requestFocus();
+                button.requestFocus();
+            }
+        });
+        assertTrue(button.isFocused());
+        sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);
+        assertTrue(secondChild.isFocused());
+
+        // Bug 26918143 Even VerticalGridView is not focusable, FocusFinder should find last focused
+        // (2nd) item on DPAD_DOWN.
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                button.requestFocus();
+            }
+        });
+        mGridView.setFocusable(false);
+        mGridView.setFocusableInTouchMode(false);
+        assertTrue(button.isFocused());
+        sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);
+        assertTrue(secondChild.isFocused());
+    }
+
+    public void testRestoreIndexAndAddItems() throws Throwable {
+        mInstrumentation = getInstrumentation();
+        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
+        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
+                R.layout.vertical_linear);
+        intent.putExtra(GridActivity.EXTRA_CHILD_LAYOUT_ID, R.layout.horizontal_item);
+        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 4);
+        initActivity(intent);
+        mOrientation = BaseGridView.VERTICAL;
+        mNumRows = 1;
+
+        assertEquals(mGridView.getSelectedPosition(), 0);
+        final SparseArray states = new SparseArray();
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mGridView.saveHierarchyState(states);
+                mGridView.setAdapter(null);
+            }
+
+        });
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mGridView.restoreHierarchyState(states);
+                mActivity.attachToNewAdapter(new int[0]);
+                mActivity.addItems(0, new int[]{100, 100, 100, 100});
+            }
+
+        });
+        waitForTransientStateGone(null);
+        assertEquals(mGridView.getSelectedPosition(), 0);
+    }
+
+    public void test27766012() throws Throwable {
+        mInstrumentation = getInstrumentation();
+        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
+        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
+                R.layout.vertical_linear_with_button_onleft);
+        intent.putExtra(GridActivity.EXTRA_CHILD_LAYOUT_ID, R.layout.horizontal_item);
+        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 2);
+        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
+        intent.putExtra(GridActivity.EXTRA_UPDATE_SIZE, false);
+        initActivity(intent);
+        mOrientation = BaseGridView.VERTICAL;
+        mNumRows = 1;
+
+        // set remove animator two seconds
+        mGridView.getItemAnimator().setRemoveDuration(2000);
+        final View view = mGridView.getChildAt(1);
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                view.requestFocus();
+            }
+        });
+        assertTrue(view.hasFocus());
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mActivity.removeItems(0, 2);
+            }
+
+        });
+        // wait one second, removing second view is still attached to parent
+        Thread.sleep(1000);
+        assertSame(view.getParent(), mGridView);
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                // refocus to the removed item and do a focus search.
+                view.requestFocus();
+                view.focusSearch(View.FOCUS_UP);
+            }
+
+        });
+    }
+
+    public void testBug27258366() throws Throwable {
+        mInstrumentation = getInstrumentation();
+        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
+        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
+                R.layout.vertical_linear_with_button_onleft);
+        intent.putExtra(GridActivity.EXTRA_CHILD_LAYOUT_ID, R.layout.horizontal_item);
+        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 10);
+        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
+        intent.putExtra(GridActivity.EXTRA_UPDATE_SIZE, false);
+        initActivity(intent);
+        mOrientation = BaseGridView.VERTICAL;
+        mNumRows = 1;
+
+        // move item1 500 pixels right, when focus is on item1, default focus finder will pick
+        // item0 and item2 for the best match of focusSearch(FOCUS_LEFT).  The grid widget
+        // must override default addFocusables(), not to add item0 or item2.
+        mActivity.mAdapterListener = new GridActivity.AdapterListener() {
+            public void onBind(RecyclerView.ViewHolder vh, int position) {
+                if (position == 1) {
+                    vh.itemView.setPaddingRelative(500, 0, 0, 0);
+                } else {
+                    vh.itemView.setPaddingRelative(0, 0, 0, 0);
+                }
+            }
+        };
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mGridView.getAdapter().notifyDataSetChanged();
+            }
+        });
+        Thread.sleep(100);
+
+        final ViewGroup secondChild = (ViewGroup) mGridView.getChildAt(1);
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                secondChild.requestFocus();
+            }
+        });
+        sendKeys(KeyEvent.KEYCODE_DPAD_LEFT);
+        Thread.sleep(100);
+        final View button = mActivity.findViewById(R.id.button);
+        assertTrue(button.isFocused());
+    }
+
+    public void testAccessibility() throws Throwable {
+        mInstrumentation = getInstrumentation();
+        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
+        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
+                R.layout.vertical_linear);
+        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 1000);
+        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
+        initActivity(intent);
+        mOrientation = BaseGridView.VERTICAL;
+        mNumRows = 1;
+
+        assertTrue(0 == mGridView.getSelectedPosition());
+
+        final RecyclerViewAccessibilityDelegate delegateCompat = mGridView
+                .getCompatAccessibilityDelegate();
+        final AccessibilityNodeInfoCompat info = AccessibilityNodeInfoCompat.obtain();
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                delegateCompat.onInitializeAccessibilityNodeInfo(mGridView, info);
+            }
+        });
+        assertTrue("test sanity", info.isScrollable());
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                delegateCompat.performAccessibilityAction(mGridView,
+                        AccessibilityNodeInfoCompat.ACTION_SCROLL_FORWARD, null);
+            }
+        });
+        waitForScrollIdle(mVerifyLayout);
+        int selectedPosition1 = mGridView.getSelectedPosition();
+        assertTrue(0 < selectedPosition1);
+
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                delegateCompat.onInitializeAccessibilityNodeInfo(mGridView, info);
+            }
+        });
+        assertTrue("test sanity", info.isScrollable());
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                delegateCompat.performAccessibilityAction(mGridView,
+                        AccessibilityNodeInfoCompat.ACTION_SCROLL_BACKWARD, null);
+            }
+        });
+        waitForScrollIdle(mVerifyLayout);
+        int selectedPosition2 = mGridView.getSelectedPosition();
+        assertTrue(selectedPosition2 < selectedPosition1);
+    }
+
+}
diff --git a/v17/tests/src/android/support/v17/leanback/widget/HorizontalGridViewEx.java b/v17/leanback/tests/java/android/support/v17/leanback/widget/HorizontalGridViewEx.java
similarity index 100%
rename from v17/tests/src/android/support/v17/leanback/widget/HorizontalGridViewEx.java
rename to v17/leanback/tests/java/android/support/v17/leanback/widget/HorizontalGridViewEx.java
diff --git a/v17/tests/src/android/support/v17/leanback/widget/PagingIndicatorTest.java b/v17/leanback/tests/java/android/support/v17/leanback/widget/PagingIndicatorTest.java
similarity index 100%
rename from v17/tests/src/android/support/v17/leanback/widget/PagingIndicatorTest.java
rename to v17/leanback/tests/java/android/support/v17/leanback/widget/PagingIndicatorTest.java
diff --git a/v17/leanback/tests/java/android/support/v17/leanback/widget/PresenterTest.java b/v17/leanback/tests/java/android/support/v17/leanback/widget/PresenterTest.java
new file mode 100644
index 0000000..ba5ddda
--- /dev/null
+++ b/v17/leanback/tests/java/android/support/v17/leanback/widget/PresenterTest.java
@@ -0,0 +1,126 @@
+/*
+ * Copyright (C) 2015 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 android.support.v17.leanback.widget;
+
+import android.graphics.Bitmap;
+import android.support.v17.leanback.app.HeadersFragment;
+import android.support.v17.leanback.R;
+import android.test.AndroidTestCase;
+import android.view.ContextThemeWrapper;
+import android.widget.FrameLayout;
+import android.view.View;
+import android.view.ViewGroup.LayoutParams;
+import android.support.v17.leanback.widget.DividerRow;
+import android.support.v17.leanback.widget.Row;
+import android.support.v17.leanback.widget.DividerPresenter;
+import android.view.ContextThemeWrapper;
+
+public class PresenterTest extends AndroidTestCase {
+
+    public void testZoomFactors() throws Throwable {
+        new ListRowPresenter(FocusHighlight.ZOOM_FACTOR_SMALL);
+        new ListRowPresenter(FocusHighlight.ZOOM_FACTOR_MEDIUM);
+        new ListRowPresenter(FocusHighlight.ZOOM_FACTOR_LARGE);
+        new ListRowPresenter(FocusHighlight.ZOOM_FACTOR_XSMALL);
+        try {
+            new ListRowPresenter(100);
+            fail("Should have thrown exception");
+        } catch (IllegalArgumentException exception) {
+        }
+    }
+
+    private void testHeaderPresenter(RowHeaderPresenter p) {
+        int expectedVisibility;
+        Presenter.ViewHolder vh = p.onCreateViewHolder(new FrameLayout(getContext()));
+        p.onBindViewHolder(vh, null);
+        expectedVisibility = p.isNullItemVisibilityGone() ? View.GONE : View.VISIBLE;
+        assertTrue("Header visibility",
+                vh.view.getVisibility() == expectedVisibility);
+        p.onBindViewHolder(vh, new Row(null));
+        assertTrue("Header visibility",
+                vh.view.getVisibility() == expectedVisibility);
+        p.onBindViewHolder(vh, new Row(new HeaderItem("")));
+        assertTrue("Header visibility",
+                vh.view.getVisibility() == View.VISIBLE);
+    }
+
+    public void testHeaderPresenter() throws Throwable {
+        HeadersFragment hf = new HeadersFragment();
+        PresenterSelector ps = hf.getPresenterSelector();
+
+        Presenter p = ps.getPresenter(new Row());
+        assertTrue("Row header instance",
+                p instanceof RowHeaderPresenter);
+        assertFalse("isNullItemVisibilityGone",
+                ((RowHeaderPresenter) p).isNullItemVisibilityGone());
+        testHeaderPresenter((RowHeaderPresenter) p);
+
+        p = ps.getPresenter(new SectionRow("Section Name"));
+        assertTrue("Row header instance",
+                p instanceof RowHeaderPresenter);
+        assertFalse("isNullItemVisibilityGone",
+                ((RowHeaderPresenter) p).isNullItemVisibilityGone());
+        testHeaderPresenter((RowHeaderPresenter) p);
+
+        p = ps.getPresenter(new DividerRow());
+        assertTrue("Row header instance",
+                p instanceof DividerPresenter);
+
+        ListRowPresenter lrp = new ListRowPresenter();
+        assertTrue("Row header instance",
+                lrp.getHeaderPresenter() instanceof RowHeaderPresenter);
+        RowHeaderPresenter rhp = (RowHeaderPresenter) lrp.getHeaderPresenter();
+        assertTrue("isNullItemVisibilityGone",
+                rhp.isNullItemVisibilityGone());
+        testHeaderPresenter(rhp);
+    }
+
+    public void testPlaybackControlsRowPresenter() {
+        setContext(new ContextThemeWrapper(getContext(), R.style.Theme_Leanback));
+        Presenter detailsPresenter = new AbstractDetailsDescriptionPresenter() {
+            @Override
+            protected void onBindDescription(ViewHolder vh, Object item) {
+                vh.getTitle().setText("The quick brown fox jumped over the lazy dog");
+                vh.getSubtitle().setText("Subtitle");
+            }
+        };
+        PlaybackControlsRowPresenter controlsRowPresenter = new PlaybackControlsRowPresenter(
+                detailsPresenter);
+        PlaybackControlsRowPresenter.ViewHolder vh = (PlaybackControlsRowPresenter.ViewHolder)
+                controlsRowPresenter.onCreateViewHolder(new FrameLayout(getContext()));
+
+        Object item = new Object();
+        PlaybackControlsRow controlsRow = new PlaybackControlsRow(item);
+
+        controlsRowPresenter.onBindRowViewHolder(vh, controlsRow);
+        assertEquals("Controls card right panel layout height",
+                vh.view.findViewById(R.id.controls_card_right_panel).getLayoutParams().height,
+                LayoutParams.WRAP_CONTENT);
+        assertEquals("Description dock layout height",
+                vh.view.findViewById(R.id.description_dock).getLayoutParams().height,
+                LayoutParams.WRAP_CONTENT);
+        controlsRowPresenter.onUnbindRowViewHolder(vh);
+
+        controlsRow.setImageBitmap(
+                getContext(), Bitmap.createBitmap(10, 10, Bitmap.Config.ARGB_8888));
+        controlsRowPresenter.onBindRowViewHolder(vh, controlsRow);
+        AssertHelper.assertGreaterThan("Controls card right panel layout height",
+                vh.view.findViewById(R.id.controls_card_right_panel).getLayoutParams().height, 0);
+        assertEquals("Description dock layout height",
+                vh.view.findViewById(R.id.description_dock).getLayoutParams().height, 0);
+        controlsRowPresenter.onUnbindRowViewHolder(vh);
+    }
+}
diff --git a/v17/tests/src/android/support/v17/leanback/widget/ShadowOverlayContainerTest.java b/v17/leanback/tests/java/android/support/v17/leanback/widget/ShadowOverlayContainerTest.java
similarity index 100%
rename from v17/tests/src/android/support/v17/leanback/widget/ShadowOverlayContainerTest.java
rename to v17/leanback/tests/java/android/support/v17/leanback/widget/ShadowOverlayContainerTest.java
diff --git a/v17/tests/src/android/support/v17/leanback/widget/SingleRowTest.java b/v17/leanback/tests/java/android/support/v17/leanback/widget/SingleRowTest.java
similarity index 100%
rename from v17/tests/src/android/support/v17/leanback/widget/SingleRowTest.java
rename to v17/leanback/tests/java/android/support/v17/leanback/widget/SingleRowTest.java
diff --git a/v17/tests/src/android/support/v17/leanback/widget/StaggeredGridDefaultTest.java b/v17/leanback/tests/java/android/support/v17/leanback/widget/StaggeredGridDefaultTest.java
similarity index 100%
rename from v17/tests/src/android/support/v17/leanback/widget/StaggeredGridDefaultTest.java
rename to v17/leanback/tests/java/android/support/v17/leanback/widget/StaggeredGridDefaultTest.java
diff --git a/v17/tests/src/android/support/v17/leanback/widget/VerticalGridViewEx.java b/v17/leanback/tests/java/android/support/v17/leanback/widget/VerticalGridViewEx.java
similarity index 100%
rename from v17/tests/src/android/support/v17/leanback/widget/VerticalGridViewEx.java
rename to v17/leanback/tests/java/android/support/v17/leanback/widget/VerticalGridViewEx.java
diff --git a/v17/tests/res/layout/browse.xml b/v17/leanback/tests/res/layout/browse.xml
similarity index 100%
rename from v17/tests/res/layout/browse.xml
rename to v17/leanback/tests/res/layout/browse.xml
diff --git a/v17/tests/res/layout/horizontal_grid.xml b/v17/leanback/tests/res/layout/horizontal_grid.xml
similarity index 100%
rename from v17/tests/res/layout/horizontal_grid.xml
rename to v17/leanback/tests/res/layout/horizontal_grid.xml
diff --git a/v17/tests/res/layout/horizontal_grid_testredundantappendremove2.xml b/v17/leanback/tests/res/layout/horizontal_grid_testredundantappendremove2.xml
similarity index 100%
rename from v17/tests/res/layout/horizontal_grid_testredundantappendremove2.xml
rename to v17/leanback/tests/res/layout/horizontal_grid_testredundantappendremove2.xml
diff --git a/v17/tests/res/layout/horizontal_grid_wrap.xml b/v17/leanback/tests/res/layout/horizontal_grid_wrap.xml
similarity index 100%
rename from v17/tests/res/layout/horizontal_grid_wrap.xml
rename to v17/leanback/tests/res/layout/horizontal_grid_wrap.xml
diff --git a/v17/tests/res/layout/horizontal_item.xml b/v17/leanback/tests/res/layout/horizontal_item.xml
similarity index 100%
rename from v17/tests/res/layout/horizontal_item.xml
rename to v17/leanback/tests/res/layout/horizontal_item.xml
diff --git a/v17/tests/res/layout/horizontal_linear.xml b/v17/leanback/tests/res/layout/horizontal_linear.xml
similarity index 100%
rename from v17/tests/res/layout/horizontal_linear.xml
rename to v17/leanback/tests/res/layout/horizontal_linear.xml
diff --git a/v17/tests/res/layout/relative_layout.xml b/v17/leanback/tests/res/layout/relative_layout.xml
similarity index 100%
rename from v17/tests/res/layout/relative_layout.xml
rename to v17/leanback/tests/res/layout/relative_layout.xml
diff --git a/v17/tests/res/layout/selectable_text_view.xml b/v17/leanback/tests/res/layout/selectable_text_view.xml
similarity index 100%
rename from v17/tests/res/layout/selectable_text_view.xml
rename to v17/leanback/tests/res/layout/selectable_text_view.xml
diff --git a/v17/tests/res/layout/vertical_grid.xml b/v17/leanback/tests/res/layout/vertical_grid.xml
similarity index 100%
rename from v17/tests/res/layout/vertical_grid.xml
rename to v17/leanback/tests/res/layout/vertical_grid.xml
diff --git a/v17/tests/res/layout/vertical_grid_ltr.xml b/v17/leanback/tests/res/layout/vertical_grid_ltr.xml
similarity index 100%
rename from v17/tests/res/layout/vertical_grid_ltr.xml
rename to v17/leanback/tests/res/layout/vertical_grid_ltr.xml
diff --git a/v17/tests/res/layout/vertical_grid_rtl.xml b/v17/leanback/tests/res/layout/vertical_grid_rtl.xml
similarity index 100%
rename from v17/tests/res/layout/vertical_grid_rtl.xml
rename to v17/leanback/tests/res/layout/vertical_grid_rtl.xml
diff --git a/v17/tests/res/layout/vertical_grid_testredundantappendremove.xml b/v17/leanback/tests/res/layout/vertical_grid_testredundantappendremove.xml
similarity index 100%
rename from v17/tests/res/layout/vertical_grid_testredundantappendremove.xml
rename to v17/leanback/tests/res/layout/vertical_grid_testredundantappendremove.xml
diff --git a/v17/tests/res/layout/vertical_linear.xml b/v17/leanback/tests/res/layout/vertical_linear.xml
similarity index 100%
rename from v17/tests/res/layout/vertical_linear.xml
rename to v17/leanback/tests/res/layout/vertical_linear.xml
diff --git a/v17/tests/res/layout/vertical_linear_measured_with_zero.xml b/v17/leanback/tests/res/layout/vertical_linear_measured_with_zero.xml
similarity index 100%
rename from v17/tests/res/layout/vertical_linear_measured_with_zero.xml
rename to v17/leanback/tests/res/layout/vertical_linear_measured_with_zero.xml
diff --git a/v17/tests/res/layout/vertical_linear_with_button.xml b/v17/leanback/tests/res/layout/vertical_linear_with_button.xml
similarity index 100%
rename from v17/tests/res/layout/vertical_linear_with_button.xml
rename to v17/leanback/tests/res/layout/vertical_linear_with_button.xml
diff --git a/v17/tests/res/layout/vertical_linear_with_button_onleft.xml b/v17/leanback/tests/res/layout/vertical_linear_with_button_onleft.xml
similarity index 100%
rename from v17/tests/res/layout/vertical_linear_with_button_onleft.xml
rename to v17/leanback/tests/res/layout/vertical_linear_with_button_onleft.xml
diff --git a/v17/tests/res/layout/vertical_linear_wrap_content.xml b/v17/leanback/tests/res/layout/vertical_linear_wrap_content.xml
similarity index 100%
rename from v17/tests/res/layout/vertical_linear_wrap_content.xml
rename to v17/leanback/tests/res/layout/vertical_linear_wrap_content.xml
diff --git a/v17/tests/res/values/strings.xml b/v17/leanback/tests/res/values/strings.xml
similarity index 100%
rename from v17/tests/res/values/strings.xml
rename to v17/leanback/tests/res/values/strings.xml
diff --git a/v17/preference-leanback/Android.mk b/v17/preference-leanback/Android.mk
index bd36e32..7d3eb27 100644
--- a/v17/preference-leanback/Android.mk
+++ b/v17/preference-leanback/Android.mk
@@ -37,8 +37,6 @@
 LOCAL_JAR_EXCLUDE_FILES := none
 include $(BUILD_STATIC_JAVA_LIBRARY)
 
-support_module_src_files := $(LOCAL_SRC_FILES)
-
 # -----------------------------------------------------------------------
 
 #  A helper sub-library that makes direct use of API 21.
@@ -52,8 +50,6 @@
 LOCAL_JAVA_LANGUAGE_VERSION := 1.7
 include $(BUILD_STATIC_JAVA_LIBRARY)
 
-support_module_src_files += $(LOCAL_SRC_FILES)
-
 # Here is the final static library that apps can link against.
 # Applications that use this library must specify
 #
@@ -86,13 +82,3 @@
 LOCAL_JAVA_LANGUAGE_VERSION := 1.7
 LOCAL_AAPT_FLAGS := --add-javadoc-annotation doconly
 include $(BUILD_STATIC_JAVA_LIBRARY)
-
-support_module_src_files += $(LOCAL_SRC_FILES)
-
-# API Check
-# ---------------------------------------------
-support_module := $(LOCAL_MODULE)
-support_module_api_dir := $(LOCAL_PATH)/api
-support_module_java_libraries := $(LOCAL_JAVA_LIBRARIES)
-support_module_java_packages := android.support.v17.preference
-include $(SUPPORT_API_CHECK)
diff --git a/v17/preference-leanback/api/23.0.0.txt b/v17/preference-leanback/api/23.0.0.txt
deleted file mode 100644
index 06316ab..0000000
--- a/v17/preference-leanback/api/23.0.0.txt
+++ /dev/null
@@ -1,61 +0,0 @@
-package android.support.v17.preference {
-
-  public abstract class BaseLeanbackPreferenceFragment extends android.support.v14.preference.PreferenceFragment {
-    ctor public BaseLeanbackPreferenceFragment();
-  }
-
-  public class LeanbackListPreferenceDialogFragment extends android.support.v17.preference.LeanbackPreferenceDialogFragment {
-    ctor public LeanbackListPreferenceDialogFragment();
-    method public static android.support.v17.preference.LeanbackListPreferenceDialogFragment newInstanceMulti(java.lang.String);
-    method public static android.support.v17.preference.LeanbackListPreferenceDialogFragment newInstanceSingle(java.lang.String);
-    method public android.support.v7.widget.RecyclerView.Adapter onCreateAdapter();
-  }
-
-  public class LeanbackListPreferenceDialogFragment.AdapterMulti extends android.support.v7.widget.RecyclerView.Adapter implements android.support.v17.preference.LeanbackListPreferenceDialogFragment.ViewHolder.OnItemClickListener {
-    ctor public LeanbackListPreferenceDialogFragment.AdapterMulti(java.lang.CharSequence[], java.lang.CharSequence[], java.util.Set<java.lang.String>);
-    method public int getItemCount();
-    method public void onBindViewHolder(android.support.v17.preference.LeanbackListPreferenceDialogFragment.ViewHolder, int);
-    method public android.support.v17.preference.LeanbackListPreferenceDialogFragment.ViewHolder onCreateViewHolder(android.view.ViewGroup, int);
-    method public void onItemClick(android.support.v17.preference.LeanbackListPreferenceDialogFragment.ViewHolder);
-  }
-
-  public class LeanbackListPreferenceDialogFragment.AdapterSingle extends android.support.v7.widget.RecyclerView.Adapter implements android.support.v17.preference.LeanbackListPreferenceDialogFragment.ViewHolder.OnItemClickListener {
-    ctor public LeanbackListPreferenceDialogFragment.AdapterSingle(java.lang.CharSequence[], java.lang.CharSequence[], java.lang.CharSequence);
-    method public int getItemCount();
-    method public void onBindViewHolder(android.support.v17.preference.LeanbackListPreferenceDialogFragment.ViewHolder, int);
-    method public android.support.v17.preference.LeanbackListPreferenceDialogFragment.ViewHolder onCreateViewHolder(android.view.ViewGroup, int);
-    method public void onItemClick(android.support.v17.preference.LeanbackListPreferenceDialogFragment.ViewHolder);
-  }
-
-  public static class LeanbackListPreferenceDialogFragment.ViewHolder extends android.support.v7.widget.RecyclerView.ViewHolder implements android.view.View.OnClickListener {
-    ctor public LeanbackListPreferenceDialogFragment.ViewHolder(android.view.View, android.support.v17.preference.LeanbackListPreferenceDialogFragment.ViewHolder.OnItemClickListener);
-    method public android.view.ViewGroup getContainer();
-    method public android.widget.TextView getTitleView();
-    method public android.widget.Checkable getWidgetView();
-    method public void onClick(android.view.View);
-  }
-
-  public static abstract interface LeanbackListPreferenceDialogFragment.ViewHolder.OnItemClickListener {
-    method public abstract void onItemClick(android.support.v17.preference.LeanbackListPreferenceDialogFragment.ViewHolder);
-  }
-
-  public class LeanbackPreferenceDialogFragment extends android.app.Fragment {
-    ctor public LeanbackPreferenceDialogFragment();
-    method public android.support.v7.preference.DialogPreference getPreference();
-    field public static final java.lang.String ARG_KEY = "key";
-  }
-
-  public abstract class LeanbackPreferenceFragment extends android.support.v17.preference.BaseLeanbackPreferenceFragment {
-    ctor public LeanbackPreferenceFragment();
-  }
-
-  public abstract class LeanbackSettingsFragment extends android.app.Fragment {
-    ctor public LeanbackSettingsFragment();
-    method public boolean onPreferenceDisplayDialog(android.support.v14.preference.PreferenceFragment, android.support.v7.preference.Preference);
-    method public abstract void onPreferenceStartInitialScreen();
-    method public void startImmersiveFragment(android.app.Fragment);
-    method public void startPreferenceFragment(android.app.Fragment);
-  }
-
-}
-
diff --git a/v17/preference-leanback/api/23.1.0.txt b/v17/preference-leanback/api/23.1.0.txt
deleted file mode 100644
index 06316ab..0000000
--- a/v17/preference-leanback/api/23.1.0.txt
+++ /dev/null
@@ -1,61 +0,0 @@
-package android.support.v17.preference {
-
-  public abstract class BaseLeanbackPreferenceFragment extends android.support.v14.preference.PreferenceFragment {
-    ctor public BaseLeanbackPreferenceFragment();
-  }
-
-  public class LeanbackListPreferenceDialogFragment extends android.support.v17.preference.LeanbackPreferenceDialogFragment {
-    ctor public LeanbackListPreferenceDialogFragment();
-    method public static android.support.v17.preference.LeanbackListPreferenceDialogFragment newInstanceMulti(java.lang.String);
-    method public static android.support.v17.preference.LeanbackListPreferenceDialogFragment newInstanceSingle(java.lang.String);
-    method public android.support.v7.widget.RecyclerView.Adapter onCreateAdapter();
-  }
-
-  public class LeanbackListPreferenceDialogFragment.AdapterMulti extends android.support.v7.widget.RecyclerView.Adapter implements android.support.v17.preference.LeanbackListPreferenceDialogFragment.ViewHolder.OnItemClickListener {
-    ctor public LeanbackListPreferenceDialogFragment.AdapterMulti(java.lang.CharSequence[], java.lang.CharSequence[], java.util.Set<java.lang.String>);
-    method public int getItemCount();
-    method public void onBindViewHolder(android.support.v17.preference.LeanbackListPreferenceDialogFragment.ViewHolder, int);
-    method public android.support.v17.preference.LeanbackListPreferenceDialogFragment.ViewHolder onCreateViewHolder(android.view.ViewGroup, int);
-    method public void onItemClick(android.support.v17.preference.LeanbackListPreferenceDialogFragment.ViewHolder);
-  }
-
-  public class LeanbackListPreferenceDialogFragment.AdapterSingle extends android.support.v7.widget.RecyclerView.Adapter implements android.support.v17.preference.LeanbackListPreferenceDialogFragment.ViewHolder.OnItemClickListener {
-    ctor public LeanbackListPreferenceDialogFragment.AdapterSingle(java.lang.CharSequence[], java.lang.CharSequence[], java.lang.CharSequence);
-    method public int getItemCount();
-    method public void onBindViewHolder(android.support.v17.preference.LeanbackListPreferenceDialogFragment.ViewHolder, int);
-    method public android.support.v17.preference.LeanbackListPreferenceDialogFragment.ViewHolder onCreateViewHolder(android.view.ViewGroup, int);
-    method public void onItemClick(android.support.v17.preference.LeanbackListPreferenceDialogFragment.ViewHolder);
-  }
-
-  public static class LeanbackListPreferenceDialogFragment.ViewHolder extends android.support.v7.widget.RecyclerView.ViewHolder implements android.view.View.OnClickListener {
-    ctor public LeanbackListPreferenceDialogFragment.ViewHolder(android.view.View, android.support.v17.preference.LeanbackListPreferenceDialogFragment.ViewHolder.OnItemClickListener);
-    method public android.view.ViewGroup getContainer();
-    method public android.widget.TextView getTitleView();
-    method public android.widget.Checkable getWidgetView();
-    method public void onClick(android.view.View);
-  }
-
-  public static abstract interface LeanbackListPreferenceDialogFragment.ViewHolder.OnItemClickListener {
-    method public abstract void onItemClick(android.support.v17.preference.LeanbackListPreferenceDialogFragment.ViewHolder);
-  }
-
-  public class LeanbackPreferenceDialogFragment extends android.app.Fragment {
-    ctor public LeanbackPreferenceDialogFragment();
-    method public android.support.v7.preference.DialogPreference getPreference();
-    field public static final java.lang.String ARG_KEY = "key";
-  }
-
-  public abstract class LeanbackPreferenceFragment extends android.support.v17.preference.BaseLeanbackPreferenceFragment {
-    ctor public LeanbackPreferenceFragment();
-  }
-
-  public abstract class LeanbackSettingsFragment extends android.app.Fragment {
-    ctor public LeanbackSettingsFragment();
-    method public boolean onPreferenceDisplayDialog(android.support.v14.preference.PreferenceFragment, android.support.v7.preference.Preference);
-    method public abstract void onPreferenceStartInitialScreen();
-    method public void startImmersiveFragment(android.app.Fragment);
-    method public void startPreferenceFragment(android.app.Fragment);
-  }
-
-}
-
diff --git a/v17/preference-leanback/api/23.1.1.txt b/v17/preference-leanback/api/23.1.1.txt
deleted file mode 100644
index 06316ab..0000000
--- a/v17/preference-leanback/api/23.1.1.txt
+++ /dev/null
@@ -1,61 +0,0 @@
-package android.support.v17.preference {
-
-  public abstract class BaseLeanbackPreferenceFragment extends android.support.v14.preference.PreferenceFragment {
-    ctor public BaseLeanbackPreferenceFragment();
-  }
-
-  public class LeanbackListPreferenceDialogFragment extends android.support.v17.preference.LeanbackPreferenceDialogFragment {
-    ctor public LeanbackListPreferenceDialogFragment();
-    method public static android.support.v17.preference.LeanbackListPreferenceDialogFragment newInstanceMulti(java.lang.String);
-    method public static android.support.v17.preference.LeanbackListPreferenceDialogFragment newInstanceSingle(java.lang.String);
-    method public android.support.v7.widget.RecyclerView.Adapter onCreateAdapter();
-  }
-
-  public class LeanbackListPreferenceDialogFragment.AdapterMulti extends android.support.v7.widget.RecyclerView.Adapter implements android.support.v17.preference.LeanbackListPreferenceDialogFragment.ViewHolder.OnItemClickListener {
-    ctor public LeanbackListPreferenceDialogFragment.AdapterMulti(java.lang.CharSequence[], java.lang.CharSequence[], java.util.Set<java.lang.String>);
-    method public int getItemCount();
-    method public void onBindViewHolder(android.support.v17.preference.LeanbackListPreferenceDialogFragment.ViewHolder, int);
-    method public android.support.v17.preference.LeanbackListPreferenceDialogFragment.ViewHolder onCreateViewHolder(android.view.ViewGroup, int);
-    method public void onItemClick(android.support.v17.preference.LeanbackListPreferenceDialogFragment.ViewHolder);
-  }
-
-  public class LeanbackListPreferenceDialogFragment.AdapterSingle extends android.support.v7.widget.RecyclerView.Adapter implements android.support.v17.preference.LeanbackListPreferenceDialogFragment.ViewHolder.OnItemClickListener {
-    ctor public LeanbackListPreferenceDialogFragment.AdapterSingle(java.lang.CharSequence[], java.lang.CharSequence[], java.lang.CharSequence);
-    method public int getItemCount();
-    method public void onBindViewHolder(android.support.v17.preference.LeanbackListPreferenceDialogFragment.ViewHolder, int);
-    method public android.support.v17.preference.LeanbackListPreferenceDialogFragment.ViewHolder onCreateViewHolder(android.view.ViewGroup, int);
-    method public void onItemClick(android.support.v17.preference.LeanbackListPreferenceDialogFragment.ViewHolder);
-  }
-
-  public static class LeanbackListPreferenceDialogFragment.ViewHolder extends android.support.v7.widget.RecyclerView.ViewHolder implements android.view.View.OnClickListener {
-    ctor public LeanbackListPreferenceDialogFragment.ViewHolder(android.view.View, android.support.v17.preference.LeanbackListPreferenceDialogFragment.ViewHolder.OnItemClickListener);
-    method public android.view.ViewGroup getContainer();
-    method public android.widget.TextView getTitleView();
-    method public android.widget.Checkable getWidgetView();
-    method public void onClick(android.view.View);
-  }
-
-  public static abstract interface LeanbackListPreferenceDialogFragment.ViewHolder.OnItemClickListener {
-    method public abstract void onItemClick(android.support.v17.preference.LeanbackListPreferenceDialogFragment.ViewHolder);
-  }
-
-  public class LeanbackPreferenceDialogFragment extends android.app.Fragment {
-    ctor public LeanbackPreferenceDialogFragment();
-    method public android.support.v7.preference.DialogPreference getPreference();
-    field public static final java.lang.String ARG_KEY = "key";
-  }
-
-  public abstract class LeanbackPreferenceFragment extends android.support.v17.preference.BaseLeanbackPreferenceFragment {
-    ctor public LeanbackPreferenceFragment();
-  }
-
-  public abstract class LeanbackSettingsFragment extends android.app.Fragment {
-    ctor public LeanbackSettingsFragment();
-    method public boolean onPreferenceDisplayDialog(android.support.v14.preference.PreferenceFragment, android.support.v7.preference.Preference);
-    method public abstract void onPreferenceStartInitialScreen();
-    method public void startImmersiveFragment(android.app.Fragment);
-    method public void startPreferenceFragment(android.app.Fragment);
-  }
-
-}
-
diff --git a/v17/preference-leanback/api/current.txt b/v17/preference-leanback/api/current.txt
deleted file mode 100644
index 06316ab..0000000
--- a/v17/preference-leanback/api/current.txt
+++ /dev/null
@@ -1,61 +0,0 @@
-package android.support.v17.preference {
-
-  public abstract class BaseLeanbackPreferenceFragment extends android.support.v14.preference.PreferenceFragment {
-    ctor public BaseLeanbackPreferenceFragment();
-  }
-
-  public class LeanbackListPreferenceDialogFragment extends android.support.v17.preference.LeanbackPreferenceDialogFragment {
-    ctor public LeanbackListPreferenceDialogFragment();
-    method public static android.support.v17.preference.LeanbackListPreferenceDialogFragment newInstanceMulti(java.lang.String);
-    method public static android.support.v17.preference.LeanbackListPreferenceDialogFragment newInstanceSingle(java.lang.String);
-    method public android.support.v7.widget.RecyclerView.Adapter onCreateAdapter();
-  }
-
-  public class LeanbackListPreferenceDialogFragment.AdapterMulti extends android.support.v7.widget.RecyclerView.Adapter implements android.support.v17.preference.LeanbackListPreferenceDialogFragment.ViewHolder.OnItemClickListener {
-    ctor public LeanbackListPreferenceDialogFragment.AdapterMulti(java.lang.CharSequence[], java.lang.CharSequence[], java.util.Set<java.lang.String>);
-    method public int getItemCount();
-    method public void onBindViewHolder(android.support.v17.preference.LeanbackListPreferenceDialogFragment.ViewHolder, int);
-    method public android.support.v17.preference.LeanbackListPreferenceDialogFragment.ViewHolder onCreateViewHolder(android.view.ViewGroup, int);
-    method public void onItemClick(android.support.v17.preference.LeanbackListPreferenceDialogFragment.ViewHolder);
-  }
-
-  public class LeanbackListPreferenceDialogFragment.AdapterSingle extends android.support.v7.widget.RecyclerView.Adapter implements android.support.v17.preference.LeanbackListPreferenceDialogFragment.ViewHolder.OnItemClickListener {
-    ctor public LeanbackListPreferenceDialogFragment.AdapterSingle(java.lang.CharSequence[], java.lang.CharSequence[], java.lang.CharSequence);
-    method public int getItemCount();
-    method public void onBindViewHolder(android.support.v17.preference.LeanbackListPreferenceDialogFragment.ViewHolder, int);
-    method public android.support.v17.preference.LeanbackListPreferenceDialogFragment.ViewHolder onCreateViewHolder(android.view.ViewGroup, int);
-    method public void onItemClick(android.support.v17.preference.LeanbackListPreferenceDialogFragment.ViewHolder);
-  }
-
-  public static class LeanbackListPreferenceDialogFragment.ViewHolder extends android.support.v7.widget.RecyclerView.ViewHolder implements android.view.View.OnClickListener {
-    ctor public LeanbackListPreferenceDialogFragment.ViewHolder(android.view.View, android.support.v17.preference.LeanbackListPreferenceDialogFragment.ViewHolder.OnItemClickListener);
-    method public android.view.ViewGroup getContainer();
-    method public android.widget.TextView getTitleView();
-    method public android.widget.Checkable getWidgetView();
-    method public void onClick(android.view.View);
-  }
-
-  public static abstract interface LeanbackListPreferenceDialogFragment.ViewHolder.OnItemClickListener {
-    method public abstract void onItemClick(android.support.v17.preference.LeanbackListPreferenceDialogFragment.ViewHolder);
-  }
-
-  public class LeanbackPreferenceDialogFragment extends android.app.Fragment {
-    ctor public LeanbackPreferenceDialogFragment();
-    method public android.support.v7.preference.DialogPreference getPreference();
-    field public static final java.lang.String ARG_KEY = "key";
-  }
-
-  public abstract class LeanbackPreferenceFragment extends android.support.v17.preference.BaseLeanbackPreferenceFragment {
-    ctor public LeanbackPreferenceFragment();
-  }
-
-  public abstract class LeanbackSettingsFragment extends android.app.Fragment {
-    ctor public LeanbackSettingsFragment();
-    method public boolean onPreferenceDisplayDialog(android.support.v14.preference.PreferenceFragment, android.support.v7.preference.Preference);
-    method public abstract void onPreferenceStartInitialScreen();
-    method public void startImmersiveFragment(android.app.Fragment);
-    method public void startPreferenceFragment(android.app.Fragment);
-  }
-
-}
-
diff --git a/v17/preference-leanback/api/removed.txt b/v17/preference-leanback/api/removed.txt
deleted file mode 100644
index e69de29..0000000
--- a/v17/preference-leanback/api/removed.txt
+++ /dev/null
diff --git a/v17/preference-leanback/src/android/support/v17/preference/LeanbackPreferenceFragment.java b/v17/preference-leanback/src/android/support/v17/preference/LeanbackPreferenceFragment.java
index 9d744ec..4d5df85 100644
--- a/v17/preference-leanback/src/android/support/v17/preference/LeanbackPreferenceFragment.java
+++ b/v17/preference-leanback/src/android/support/v17/preference/LeanbackPreferenceFragment.java
@@ -26,6 +26,17 @@
 /**
  * This fragment provides a fully decorated leanback-style preference fragment, including a
  * list background and header.
+ *
+ * <p>The following sample code shows a simple leanback preference fragment that is
+ * populated from a resource.  The resource it loads is:</p>
+ *
+ * {@sample frameworks/support/samples/SupportPreferenceDemos/res/xml/preferences.xml preferences}
+ *
+ * <p>The fragment needs only to implement {@link #onCreatePreferences(Bundle, String)} to populate
+ * the list of preference objects:</p>
+ *
+ * {@sample frameworks/support/samples/SupportPreferenceDemos/src/com/example/android/supportpreference/FragmentSupportPreferencesLeanback.java
+ *      support_fragment_leanback}
  */
 public abstract class LeanbackPreferenceFragment extends BaseLeanbackPreferenceFragment {
 
diff --git a/v17/preference-leanback/src/android/support/v17/preference/LeanbackSettingsFragment.java b/v17/preference-leanback/src/android/support/v17/preference/LeanbackSettingsFragment.java
index 546ae18..685ce03 100644
--- a/v17/preference-leanback/src/android/support/v17/preference/LeanbackSettingsFragment.java
+++ b/v17/preference-leanback/src/android/support/v17/preference/LeanbackSettingsFragment.java
@@ -26,12 +26,29 @@
 import android.support.v14.preference.PreferenceFragment;
 import android.support.v7.preference.ListPreference;
 import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceScreen;
 import android.view.KeyEvent;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.Space;
 
+/**
+ * This fragment provides a container for displaying a {@link LeanbackPreferenceFragment}
+ *
+ * <p>The following sample code shows a simple leanback preference fragment that is
+ * populated from a resource.  The resource it loads is:</p>
+ *
+ * {@sample frameworks/support/samples/SupportPreferenceDemos/res/xml/preferences.xml preferences}
+ *
+ * <p>The sample implements
+ * {@link PreferenceFragment.OnPreferenceStartFragmentCallback#onPreferenceStartFragment(PreferenceFragment, Preference)},
+ * {@link PreferenceFragment.OnPreferenceStartScreenCallback#onPreferenceStartScreen(PreferenceFragment, PreferenceScreen)},
+ * and {@link #onPreferenceStartInitialScreen()}:</p>
+ *
+ * {@sample frameworks/support/samples/SupportPreferenceDemos/src/com/example/android/supportpreference/FragmentSupportPreferencesLeanback.java
+ *      support_fragment_leanback}
+ */
 public abstract class LeanbackSettingsFragment extends Fragment
         implements PreferenceFragment.OnPreferenceStartFragmentCallback,
         PreferenceFragment.OnPreferenceStartScreenCallback,
diff --git a/v17/tests/Android.mk b/v17/tests/Android.mk
deleted file mode 100644
index eb08a62..0000000
--- a/v17/tests/Android.mk
+++ /dev/null
@@ -1,42 +0,0 @@
-# Copyright (C) 2015 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.
-
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_MODULE_TAGS := tests
-
-LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
-
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-
-LOCAL_RESOURCE_DIR = \
-        $(LOCAL_PATH)/res \
-        $(LOCAL_PATH)/../leanback/res \
-        $(LOCAL_PATH)/../../v7/recyclerview/res
-LOCAL_AAPT_FLAGS := \
-        --auto-add-overlay \
-        --extra-packages android.support.v17.leanback \
-        --extra-packages android.support.v7.recyclerview
-
-LOCAL_STATIC_JAVA_LIBRARIES := \
-        android-support-v4 \
-        android-support-v7-recyclerview \
-        android-support-v17-leanback \
-        android-support-test
-
-LOCAL_PACKAGE_NAME := AndroidLeanbackTests
-
-include $(BUILD_PACKAGE)
diff --git a/v17/tests/AndroidManifest.xml b/v17/tests/AndroidManifest.xml
deleted file mode 100644
index d9d2909..0000000
--- a/v17/tests/AndroidManifest.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2015 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-          package="android.support.v17.leanback.tests">
-    <uses-sdk android:minSdkVersion="17"  android:targetSdkVersion="23"/>
-
-    <!--
-        This declares that this application uses the instrumentation test runner targeting
-        the package of android.support.v17.leanback.tests.  To run the tests use the command:
-        "adb shell am instrument -w android.support.v17.leanback.tests/android.test.InstrumentationTestRunner"
-    -->
-    <instrumentation
-        android:targetPackage="android.support.v17.leanback.tests"
-        android:name="android.test.InstrumentationTestRunner" />
-
-    <application
-        android:supportsRtl="true">
-        <uses-library android:name="android.test.runner" />
-
-        <activity android:name="android.support.v17.leanback.widget.GridActivity"
-            android:exported="true" />
-
-        <activity android:name=
-                          "android.support.v17.leanback.app.wizard.GuidedStepAttributesTestActivity"
-                  android:theme="@style/Theme.Leanback.GuidedStep"
-                  android:exported="true" />
-
-        <activity android:name="android.support.v17.leanback.app.BrowseFragmentTestActivity"
-                  android:theme="@style/Theme.Leanback.Browse"
-                  android:exported="true" />
-
-        <activity android:name="android.support.v17.leanback.app.BrowseSupportFragmentTestActivity"
-                  android:theme="@style/Theme.Leanback.Browse"
-                  android:exported="true" />
-
-        </application>
-
-</manifest>
diff --git a/v17/tests/README.txt b/v17/tests/README.txt
deleted file mode 100644
index fd1fb56..0000000
--- a/v17/tests/README.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-Test project for support leanback.
-
-INSTALLATION
-adb install -r AndroidLeanbackTests.apk
-
-RUN TESTS
-adb shell am instrument -w android.support.v17.leanback.tests/android.test.InstrumentationTestRunner
\ No newline at end of file
diff --git a/v17/tests/src/android/support/v17/leanback/app/BrowseFragmentTest.java b/v17/tests/src/android/support/v17/leanback/app/BrowseFragmentTest.java
deleted file mode 100644
index 37fc107..0000000
--- a/v17/tests/src/android/support/v17/leanback/app/BrowseFragmentTest.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.v17.leanback.app;
-
-import android.support.v17.leanback.tests.R;
-import android.test.ActivityInstrumentationTestCase2;
-import android.text.Selection;
-import android.text.Spannable;
-import android.util.Log;
-import android.util.SparseArray;
-import android.view.KeyEvent;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.TextView;
-
-import android.support.v17.leanback.widget.Presenter;
-import android.support.v17.leanback.widget.ListRowPresenter;
-import android.app.Instrumentation;
-import android.content.Intent;
-import android.os.Parcelable;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.Iterator;
-
-/**
- * @hide from javadoc
- */
-public class BrowseFragmentTest extends
-        ActivityInstrumentationTestCase2<BrowseFragmentTestActivity> {
-
-    static final long TRANSITION_LENGTH = 1000;
-    static final long HORIZONTAL_SCROLL_WAIT = 2000;
-    static final long TIMEOUT = 10000;
-
-    Instrumentation mInstrumentation;
-    BrowseFragmentTestActivity mActivity;
-
-    static class WaitLock {
-        final boolean[] finished = new boolean[1];
-        String message;
-        long timeout;
-        public WaitLock(long timeout, String message) {
-            this.message = message;
-            this.timeout = timeout;
-        }
-        public void waitForFinish() {
-            long totalSleep = 0;
-            try {
-            while (!finished[0]) {
-                if ((totalSleep += 100) >= timeout) {
-                    assertTrue(message, false);
-                }
-                Thread.sleep(100);
-            }
-            } catch (InterruptedException ex) {
-                assertTrue("Interrupted during wait", false);
-            }
-        }
-        public void signalFinish() {
-            finished[0] = true;
-        }
-    }
-
-    public BrowseFragmentTest() {
-        super(BrowseFragmentTestActivity.class);
-    }
-
-    private void initActivity(Intent intent) {
-        setActivityIntent(intent);
-        mActivity = getActivity();
-        try {
-        Thread.sleep(intent.getLongExtra(BrowseFragmentTestActivity.EXTRA_LOAD_DATA_DELAY,
-                BrowseTestFragment.DEFAULT_LOAD_DATA_DELAY) + TRANSITION_LENGTH);
-        } catch (InterruptedException ex) {
-        }
-    }
-
-    public void testTwoBackKeysWithBackStack() throws Throwable {
-        mInstrumentation = getInstrumentation();
-        Intent intent = new Intent(mInstrumentation.getContext(), BrowseFragmentTestActivity.class);
-        intent.putExtra(BrowseFragmentTestActivity.EXTRA_LOAD_DATA_DELAY, (long) 1000);
-        intent.putExtra(BrowseFragmentTestActivity.EXTRA_ADD_TO_BACKSTACK , true);
-        initActivity(intent);
-
-        sendKeys(KeyEvent.KEYCODE_DPAD_RIGHT);
-        Thread.sleep(TRANSITION_LENGTH);
-
-        sendKeys(KeyEvent.KEYCODE_BACK, KeyEvent.KEYCODE_BACK);
-    }
-
-    public void testTwoBackKeysWithoutBackStack() throws Throwable {
-        mInstrumentation = getInstrumentation();
-        Intent intent = new Intent(mInstrumentation.getContext(), BrowseFragmentTestActivity.class);
-        intent.putExtra(BrowseFragmentTestActivity.EXTRA_LOAD_DATA_DELAY, (long) 1000);
-        intent.putExtra(BrowseFragmentTestActivity.EXTRA_ADD_TO_BACKSTACK , false);
-        initActivity(intent);
-
-        sendKeys(KeyEvent.KEYCODE_DPAD_RIGHT);
-        Thread.sleep(TRANSITION_LENGTH);
-
-        sendKeys(KeyEvent.KEYCODE_BACK, KeyEvent.KEYCODE_BACK);
-    }
-
-    public void testSelectCardOnARow() throws Throwable {
-        mInstrumentation = getInstrumentation();
-        Intent intent = new Intent(mInstrumentation.getContext(), BrowseFragmentTestActivity.class);
-        intent.putExtra(BrowseFragmentTestActivity.EXTRA_LOAD_DATA_DELAY, (long) 1000);
-        intent.putExtra(BrowseFragmentTestActivity.EXTRA_ADD_TO_BACKSTACK , true);
-        initActivity(intent);
-
-        final WaitLock waitLock = new WaitLock(TIMEOUT, "Timeout while waiting scroll to the row");
-        runTestOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                mActivity.getBrowseTestFragment().setSelectedPosition(10, true,
-                        new ListRowPresenter.SelectItemViewHolderTask(20) {
-                    @Override
-                    public void run(Presenter.ViewHolder holder) {
-                        super.run(holder);
-                        waitLock.signalFinish();
-                    }
-                });
-            }
-        });
-        waitLock.waitForFinish();
-
-        // wait for scrolling to the item.
-        Thread.sleep(HORIZONTAL_SCROLL_WAIT);
-        ListRowPresenter.ViewHolder row = (ListRowPresenter.ViewHolder) mActivity
-                .getBrowseTestFragment().getRowsFragment().getRowViewHolder(mActivity
-                        .getBrowseTestFragment().getSelectedPosition());
-        assertEquals(20, row.getGridView().getSelectedPosition());
-    }
-
-}
diff --git a/v17/tests/src/android/support/v17/leanback/app/BrowseFragmentTestActivity.java b/v17/tests/src/android/support/v17/leanback/app/BrowseFragmentTestActivity.java
deleted file mode 100644
index 5f6316f..0000000
--- a/v17/tests/src/android/support/v17/leanback/app/BrowseFragmentTestActivity.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.v17.leanback.app;
-
-import android.app.Activity;
-import android.app.FragmentTransaction;
-
-import android.content.Intent;
-import android.os.Bundle;
-import android.support.v17.leanback.tests.R;
-
-/**
- * @hide from javadoc
- */
-public class BrowseFragmentTestActivity extends Activity {
-
-    public static final String EXTRA_ADD_TO_BACKSTACK = "addToBackStack";
-    public static final String EXTRA_NUM_ROWS = "numRows";
-    public static final String EXTRA_REPEAT_PER_ROW = "repeatPerRow";
-    public static final String EXTRA_LOAD_DATA_DELAY = "loadDataDelay";
-    public static final String EXTRA_TEST_ENTRANCE_TRANSITION = "testEntranceTransition";
-
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        Intent intent = getIntent();
-
-        BrowseTestFragment.NUM_ROWS = intent.getIntExtra(EXTRA_NUM_ROWS,
-                BrowseTestFragment.DEFAULT_NUM_ROWS);
-        BrowseTestFragment.REPEAT_PER_ROW = intent.getIntExtra(EXTRA_REPEAT_PER_ROW,
-                BrowseTestFragment.DEFAULT_REPEAT_PER_ROW);
-        BrowseTestFragment.LOAD_DATA_DELAY = intent.getLongExtra(EXTRA_LOAD_DATA_DELAY,
-                BrowseTestFragment.DEFAULT_LOAD_DATA_DELAY);
-        BrowseTestFragment.TEST_ENTRANCE_TRANSITION = intent.getBooleanExtra(
-                EXTRA_TEST_ENTRANCE_TRANSITION,
-                BrowseTestFragment.DEFAULT_TEST_ENTRANCE_TRANSITION);
-        setContentView(R.layout.browse);
-        FragmentTransaction ft = getFragmentManager().beginTransaction();
-        ft.replace(R.id.main_frame, new BrowseTestFragment());
-        if (intent.getBooleanExtra(EXTRA_ADD_TO_BACKSTACK, false)) {
-            ft.addToBackStack(null);
-        }
-        ft.commit();
-    }
-
-    public BrowseTestFragment getBrowseTestFragment() {
-        return (BrowseTestFragment) getFragmentManager().findFragmentById(R.id.main_frame);
-    }
-}
diff --git a/v17/tests/src/android/support/v17/leanback/app/BrowseSupportFragmentTest.java b/v17/tests/src/android/support/v17/leanback/app/BrowseSupportFragmentTest.java
deleted file mode 100644
index e41569e..0000000
--- a/v17/tests/src/android/support/v17/leanback/app/BrowseSupportFragmentTest.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/* This file is auto-generated from BrowseFrgamentTest.java.  DO NOT MODIFY. */
-
-/*
- * Copyright (C) 2015 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 android.support.v17.leanback.app;
-
-import android.support.v17.leanback.tests.R;
-import android.test.ActivityInstrumentationTestCase2;
-import android.text.Selection;
-import android.text.Spannable;
-import android.util.Log;
-import android.util.SparseArray;
-import android.view.KeyEvent;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.TextView;
-
-import android.support.v17.leanback.widget.Presenter;
-import android.support.v17.leanback.widget.ListRowPresenter;
-import android.app.Instrumentation;
-import android.content.Intent;
-import android.os.Parcelable;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.Iterator;
-
-/**
- * @hide from javadoc
- */
-public class BrowseSupportFragmentTest extends
-        ActivityInstrumentationTestCase2<BrowseSupportFragmentTestActivity> {
-
-    static final long TRANSITION_LENGTH = 1000;
-    static final long HORIZONTAL_SCROLL_WAIT = 2000;
-    static final long TIMEOUT = 10000;
-
-    Instrumentation mInstrumentation;
-    BrowseSupportFragmentTestActivity mActivity;
-
-    static class WaitLock {
-        final boolean[] finished = new boolean[1];
-        String message;
-        long timeout;
-        public WaitLock(long timeout, String message) {
-            this.message = message;
-            this.timeout = timeout;
-        }
-        public void waitForFinish() {
-            long totalSleep = 0;
-            try {
-            while (!finished[0]) {
-                if ((totalSleep += 100) >= timeout) {
-                    assertTrue(message, false);
-                }
-                Thread.sleep(100);
-            }
-            } catch (InterruptedException ex) {
-                assertTrue("Interrupted during wait", false);
-            }
-        }
-        public void signalFinish() {
-            finished[0] = true;
-        }
-    }
-
-    public BrowseSupportFragmentTest() {
-        super(BrowseSupportFragmentTestActivity.class);
-    }
-
-    private void initActivity(Intent intent) {
-        setActivityIntent(intent);
-        mActivity = getActivity();
-        try {
-        Thread.sleep(intent.getLongExtra(BrowseSupportFragmentTestActivity.EXTRA_LOAD_DATA_DELAY,
-                BrowseTestSupportFragment.DEFAULT_LOAD_DATA_DELAY) + TRANSITION_LENGTH);
-        } catch (InterruptedException ex) {
-        }
-    }
-
-    public void testTwoBackKeysWithBackStack() throws Throwable {
-        mInstrumentation = getInstrumentation();
-        Intent intent = new Intent(mInstrumentation.getContext(), BrowseSupportFragmentTestActivity.class);
-        intent.putExtra(BrowseSupportFragmentTestActivity.EXTRA_LOAD_DATA_DELAY, (long) 1000);
-        intent.putExtra(BrowseSupportFragmentTestActivity.EXTRA_ADD_TO_BACKSTACK , true);
-        initActivity(intent);
-
-        sendKeys(KeyEvent.KEYCODE_DPAD_RIGHT);
-        Thread.sleep(TRANSITION_LENGTH);
-
-        sendKeys(KeyEvent.KEYCODE_BACK, KeyEvent.KEYCODE_BACK);
-    }
-
-    public void testTwoBackKeysWithoutBackStack() throws Throwable {
-        mInstrumentation = getInstrumentation();
-        Intent intent = new Intent(mInstrumentation.getContext(), BrowseSupportFragmentTestActivity.class);
-        intent.putExtra(BrowseSupportFragmentTestActivity.EXTRA_LOAD_DATA_DELAY, (long) 1000);
-        intent.putExtra(BrowseSupportFragmentTestActivity.EXTRA_ADD_TO_BACKSTACK , false);
-        initActivity(intent);
-
-        sendKeys(KeyEvent.KEYCODE_DPAD_RIGHT);
-        Thread.sleep(TRANSITION_LENGTH);
-
-        sendKeys(KeyEvent.KEYCODE_BACK, KeyEvent.KEYCODE_BACK);
-    }
-
-    public void testSelectCardOnARow() throws Throwable {
-        mInstrumentation = getInstrumentation();
-        Intent intent = new Intent(mInstrumentation.getContext(), BrowseSupportFragmentTestActivity.class);
-        intent.putExtra(BrowseSupportFragmentTestActivity.EXTRA_LOAD_DATA_DELAY, (long) 1000);
-        intent.putExtra(BrowseSupportFragmentTestActivity.EXTRA_ADD_TO_BACKSTACK , true);
-        initActivity(intent);
-
-        final WaitLock waitLock = new WaitLock(TIMEOUT, "Timeout while waiting scroll to the row");
-        runTestOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                mActivity.getBrowseTestSupportFragment().setSelectedPosition(10, true,
-                        new ListRowPresenter.SelectItemViewHolderTask(20) {
-                    @Override
-                    public void run(Presenter.ViewHolder holder) {
-                        super.run(holder);
-                        waitLock.signalFinish();
-                    }
-                });
-            }
-        });
-        waitLock.waitForFinish();
-
-        // wait for scrolling to the item.
-        Thread.sleep(HORIZONTAL_SCROLL_WAIT);
-        ListRowPresenter.ViewHolder row = (ListRowPresenter.ViewHolder) mActivity
-                .getBrowseTestSupportFragment().getRowsSupportFragment().getRowViewHolder(mActivity
-                        .getBrowseTestSupportFragment().getSelectedPosition());
-        assertEquals(20, row.getGridView().getSelectedPosition());
-    }
-
-}
diff --git a/v17/tests/src/android/support/v17/leanback/app/BrowseSupportFragmentTestActivity.java b/v17/tests/src/android/support/v17/leanback/app/BrowseSupportFragmentTestActivity.java
deleted file mode 100644
index 10c27d1..0000000
--- a/v17/tests/src/android/support/v17/leanback/app/BrowseSupportFragmentTestActivity.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/* This file is auto-generated from BrowseFragmentTestActivity.java.  DO NOT MODIFY. */
-
-/*
- * Copyright (C) 2015 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 android.support.v17.leanback.app;
-
-import android.support.v4.app.FragmentActivity;
-import android.support.v4.app.FragmentTransaction;
-
-import android.content.Intent;
-import android.os.Bundle;
-import android.support.v17.leanback.tests.R;
-
-/**
- * @hide from javadoc
- */
-public class BrowseSupportFragmentTestActivity extends FragmentActivity {
-
-    public static final String EXTRA_ADD_TO_BACKSTACK = "addToBackStack";
-    public static final String EXTRA_NUM_ROWS = "numRows";
-    public static final String EXTRA_REPEAT_PER_ROW = "repeatPerRow";
-    public static final String EXTRA_LOAD_DATA_DELAY = "loadDataDelay";
-    public static final String EXTRA_TEST_ENTRANCE_TRANSITION = "testEntranceTransition";
-
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        Intent intent = getIntent();
-
-        BrowseTestSupportFragment.NUM_ROWS = intent.getIntExtra(EXTRA_NUM_ROWS,
-                BrowseTestSupportFragment.DEFAULT_NUM_ROWS);
-        BrowseTestSupportFragment.REPEAT_PER_ROW = intent.getIntExtra(EXTRA_REPEAT_PER_ROW,
-                BrowseTestSupportFragment.DEFAULT_REPEAT_PER_ROW);
-        BrowseTestSupportFragment.LOAD_DATA_DELAY = intent.getLongExtra(EXTRA_LOAD_DATA_DELAY,
-                BrowseTestSupportFragment.DEFAULT_LOAD_DATA_DELAY);
-        BrowseTestSupportFragment.TEST_ENTRANCE_TRANSITION = intent.getBooleanExtra(
-                EXTRA_TEST_ENTRANCE_TRANSITION,
-                BrowseTestSupportFragment.DEFAULT_TEST_ENTRANCE_TRANSITION);
-        setContentView(R.layout.browse);
-        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
-        ft.replace(R.id.main_frame, new BrowseTestSupportFragment());
-        if (intent.getBooleanExtra(EXTRA_ADD_TO_BACKSTACK, false)) {
-            ft.addToBackStack(null);
-        }
-        ft.commit();
-    }
-
-    public BrowseTestSupportFragment getBrowseTestSupportFragment() {
-        return (BrowseTestSupportFragment) getSupportFragmentManager().findFragmentById(R.id.main_frame);
-    }
-}
diff --git a/v17/tests/src/android/support/v17/leanback/app/wizard/GuidedDatePickerTest.java b/v17/tests/src/android/support/v17/leanback/app/wizard/GuidedDatePickerTest.java
deleted file mode 100644
index 40c1e70..0000000
--- a/v17/tests/src/android/support/v17/leanback/app/wizard/GuidedDatePickerTest.java
+++ /dev/null
@@ -1,517 +0,0 @@
-/*
- * Copyright (C) 2016 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 android.support.v17.leanback.app.wizard;
-
-import android.app.Instrumentation;
-import android.content.Intent;
-import android.content.res.Resources;
-import android.support.v17.leanback.app.GuidedStepFragment;
-import android.support.v17.leanback.tests.R;
-import android.support.v17.leanback.widget.GuidanceStylist;
-import android.support.v17.leanback.widget.GuidedAction;
-import android.support.v17.leanback.widget.GuidedDatePickerAction;
-import android.support.v17.leanback.widget.VerticalGridView;
-import android.support.v17.leanback.widget.picker.DatePicker;
-import android.test.ActivityInstrumentationTestCase2;
-import android.util.Log;
-import android.view.KeyEvent;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.LinearLayout;
-
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.List;
-
-public class GuidedDatePickerTest extends
-        ActivityInstrumentationTestCase2<GuidedStepAttributesTestActivity> {
-
-    static final long TRANSITION_LENGTH = 1000;
-    static long VERTICAL_SCROLL_WAIT = 500;
-    static long HORIZONTAL_SCROLL_WAIT = 500;
-    static final long FINAL_WAIT = 3000;
-
-    static final String TAG = "GuidedDatePickerTest";
-
-    private static final int DAY_INDEX = 0;
-    private static final int MONTH_INDEX = 1;
-    private static final int YEAR_INDEX = 2;
-    Instrumentation mInstrumentation;
-    GuidedStepAttributesTestActivity mActivity;
-
-    public GuidedDatePickerTest() {
-        super(GuidedStepAttributesTestActivity.class);
-    }
-
-    private void initActivity(Intent intent) {
-
-        setActivityIntent(intent);
-        mActivity = getActivity();
-        try {
-            Thread.sleep(2000);
-        } catch(InterruptedException e) {
-            e.printStackTrace();
-        }
-    }
-
-    private void scrollOnField(int field, int[] columnIndices, DatePicker mPickerView,
-                               int SCROLL_DIR) throws Throwable {
-
-        final GuidedStepFragment mFragment = (GuidedStepFragment)
-                mActivity.getGuidedStepTestFragment();
-
-        int mColDayIndex = columnIndices[0];
-        int mColMonthIndex = columnIndices[1];
-        int mColYearIndex = columnIndices[2];
-        int columnIndex = -1;
-        switch (field) {
-            case Calendar.DAY_OF_MONTH:
-                columnIndex = mColDayIndex;
-                break;
-            case Calendar.MONTH:
-                columnIndex = mColMonthIndex;
-                break;
-            case Calendar.YEAR:
-                columnIndex = mColYearIndex;
-        }
-
-
-        LinearLayout columnsLayout = (LinearLayout) mPickerView.getChildAt(0);
-
-        int focusedFieldPos = columnsLayout.indexOfChild(columnsLayout.getFocusedChild());
-        if (focusedFieldPos == -1) {
-            sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);
-            Thread.sleep(TRANSITION_LENGTH);
-        }
-        focusedFieldPos = columnsLayout.indexOfChild(columnsLayout.getFocusedChild());
-        assertTrue("Date field could not be focused!", (focusedFieldPos != -1));
-
-        // following is to skip the separator fields "/" which are unfocusable but counted as
-        // children of columnsLayout
-        switch (focusedFieldPos) {
-            case 0:
-                focusedFieldPos = 0;
-                break;
-            case 2:
-                focusedFieldPos = 1;
-                break;
-            case 4:
-                focusedFieldPos = 2;
-        }
-
-        // now scroll right or left to the corresponding date field as indicated by the input field
-        int horizontalScrollOffset = columnIndex - focusedFieldPos;
-
-        int horizontalScrollDir = KeyEvent.KEYCODE_DPAD_RIGHT;
-        if (horizontalScrollOffset < 0) {
-            horizontalScrollOffset = -horizontalScrollOffset;
-            horizontalScrollDir = KeyEvent.KEYCODE_DPAD_LEFT;
-        }
-        for(int i = 0; i < horizontalScrollOffset; i++) {
-            sendKeys(horizontalScrollDir);
-            Thread.sleep(HORIZONTAL_SCROLL_WAIT);
-        }
-
-
-        Calendar currentActionCal = Calendar.getInstance();
-        currentActionCal.setTimeInMillis(mPickerView.getDate());
-
-        Calendar minCal = Calendar.getInstance();
-        minCal.setTimeInMillis(mPickerView.getMinDate());
-
-        Calendar maxCal = Calendar.getInstance();
-        maxCal.setTimeInMillis(mPickerView.getMaxDate());
-
-
-        int prevColumnVal = -1;
-        int currentColumnVal = mPickerView.getColumnAt(columnIndex).getCurrentValue();
-        while( currentColumnVal != prevColumnVal ){
-            assertTrue(getActivity().getString(R.string.datepicker_test_wrong_day_value),
-                    mPickerView.getColumnAt(mColDayIndex).getCurrentValue() ==
-                            currentActionCal.get(Calendar.DAY_OF_MONTH)
-            );
-            assertTrue(getActivity().getString(R.string.datepicker_test_wrong_month_value),
-                    mPickerView.getColumnAt(mColMonthIndex).getCurrentValue() ==
-                            currentActionCal.get(Calendar.MONTH)
-            );
-            assertTrue(getActivity().getString(R.string.datepicker_test_wrong_year_value),
-                    mPickerView.getColumnAt(mColYearIndex).getCurrentValue() ==
-                            currentActionCal.get(Calendar.YEAR)
-            );
-
-            int offset = SCROLL_DIR == KeyEvent.KEYCODE_DPAD_DOWN ? 1 : -1;
-            addDate(currentActionCal, field, offset, minCal, maxCal);
-
-            sendKeys(SCROLL_DIR);
-            Thread.sleep(VERTICAL_SCROLL_WAIT);
-
-            prevColumnVal = currentColumnVal;
-            currentColumnVal = mPickerView.getColumnAt(columnIndex).getCurrentValue();
-        }
-    }
-
-    private void addDate(Calendar mCurrentDate, int field, int offset,
-                         Calendar mMinDate, Calendar mMaxDate) {
-        int maxOffset = -1;
-        int actualMinFieldValue, actualMaxFieldValue;
-
-        if ( field == Calendar.YEAR ) {
-            actualMinFieldValue = mMinDate.get(Calendar.YEAR);
-            actualMaxFieldValue = mMaxDate.get(Calendar.YEAR);
-        } else {
-            actualMinFieldValue = mCurrentDate.getActualMinimum(field);
-            actualMaxFieldValue = mCurrentDate.getActualMaximum(field);
-        }
-
-        if ( offset > 0 ) {
-            maxOffset = Math.min(
-                    actualMaxFieldValue - mCurrentDate.get(field), offset);
-            mCurrentDate.add(field, maxOffset);
-            if (mCurrentDate.after(mMaxDate)) {
-                mCurrentDate.setTimeInMillis(mMaxDate.getTimeInMillis());
-            }
-        } else {
-            maxOffset = Math.max(
-                    actualMinFieldValue - mCurrentDate.get(field), offset);
-            mCurrentDate.add(field, Math.max(offset, maxOffset));
-            if (mCurrentDate.before(mMinDate)) {
-                mCurrentDate.setTimeInMillis(mMinDate.getTimeInMillis());
-            }
-        }
-    }
-
-    public void testDifferentMonthLengths() throws Throwable {
-
-        mInstrumentation = getInstrumentation();
-        Intent intent = new Intent(mInstrumentation.getContext(),
-                GuidedStepAttributesTestActivity.class);
-        Resources res = mInstrumentation.getContext().getResources();
-
-        final int NUM_DATE_ACTIONS = 1;
-
-        String title = "Date Picker Transition Test";
-        String breadcrumb = "Month Transition Test Demo";
-        String description = "Testing the transition between longer to shorter months";
-        GuidanceStylist.Guidance guidance = new GuidanceStylist.Guidance(title, description,
-                breadcrumb, null);
-
-        List<GuidedAction> actionList = new ArrayList<>();
-
-        Calendar cal = Calendar.getInstance();
-
-        cal.set(Calendar.YEAR, 2016);
-        cal.set(Calendar.MONTH, Calendar.JANUARY);
-        cal.set(Calendar.DAY_OF_MONTH, 30);
-        Date initialDate = cal.getTime();
-
-        GuidedDatePickerAction action = new GuidedDatePickerAction.Builder(
-                mInstrumentation.getContext())
-                .id(0)
-                .title("Date")
-                .date(initialDate.getTime())
-                .datePickerFormat("DMY")
-                .build();
-
-        actionList.add(action);
-
-        GuidedStepAttributesTestFragment.clear();
-        GuidedStepAttributesTestFragment.GUIDANCE = guidance;
-        GuidedStepAttributesTestFragment.ACTION_LIST = actionList;
-
-        initActivity(intent);
-
-        DatePicker mPickerView = (DatePicker) mActivity.findViewById(
-                R.id.guidedactions_activator_item);
-
-        final GuidedStepFragment mFragment = (GuidedStepFragment) mActivity.
-                getGuidedStepTestFragment();
-        traverseMonths(mPickerView, (GuidedDatePickerAction) actionList.get(0));
-        Thread.sleep(FINAL_WAIT);
-    }
-
-    private void traverseMonths(DatePicker mPickerView, GuidedDatePickerAction dateAction)
-            throws Throwable{
-
-        final GuidedStepFragment mFragment = (GuidedStepFragment)
-                mActivity.getGuidedStepTestFragment();
-
-        Calendar currentActionCal = Calendar.getInstance();
-        currentActionCal.setTimeInMillis(dateAction.getDate());
-
-        sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);
-        Thread.sleep(TRANSITION_LENGTH);
-
-        int prevMonth = -1;
-        int currentMonth = mPickerView.getColumnAt(MONTH_INDEX).getCurrentValue();
-        while (currentMonth != prevMonth) {
-            int prevDayOfMonth = -1;
-            int currentDayOfMonth = mPickerView.getColumnAt(DAY_INDEX).getCurrentValue();
-            // scroll down the days till reaching the last day of month
-            while (currentDayOfMonth != prevDayOfMonth) {
-                sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);
-                Thread.sleep(VERTICAL_SCROLL_WAIT);
-                prevDayOfMonth = currentDayOfMonth;
-                currentDayOfMonth = mPickerView.getColumnAt(DAY_INDEX).getCurrentValue();
-            }
-            int oldDayValue = mPickerView.getColumnAt(DAY_INDEX).getCurrentValue();
-            int oldMonthValue = mPickerView.getColumnAt(MONTH_INDEX).getCurrentValue();
-            // increment the month
-            sendKeys(KeyEvent.KEYCODE_DPAD_RIGHT);
-            Thread.sleep(VERTICAL_SCROLL_WAIT);
-
-            sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);
-            Thread.sleep(TRANSITION_LENGTH);
-
-            int newDayValue = mPickerView.getColumnAt(DAY_INDEX).getCurrentValue();
-            int newMonthValue = mPickerView.getColumnAt(MONTH_INDEX).getCurrentValue();
-            verifyMonthTransition(currentActionCal,
-                    oldDayValue, oldMonthValue, newDayValue, newMonthValue);
-
-            sendKeys(KeyEvent.KEYCODE_DPAD_LEFT);
-            Thread.sleep(TRANSITION_LENGTH);
-            prevMonth = currentMonth;
-            currentMonth = newMonthValue;
-        }
-
-    }
-
-    private void verifyMonthTransition(Calendar currentCal, int oldDayValue, int oldMonthValue,
-                                       int newDayValue, int newMonthValue) {
-
-        if (oldMonthValue == newMonthValue)
-            return;
-
-        currentCal.set(Calendar.DAY_OF_MONTH, 1);
-        currentCal.set(Calendar.MONTH, oldMonthValue);
-        int expectedOldDayValue = currentCal.getActualMaximum(Calendar.DAY_OF_MONTH);
-        currentCal.set(Calendar.MONTH, newMonthValue);
-        int numDaysInNewMonth = currentCal.getActualMaximum(Calendar.DAY_OF_MONTH);
-        int expectedNewDayValue = (expectedOldDayValue <= numDaysInNewMonth) ?
-                expectedOldDayValue : numDaysInNewMonth;
-
-        assertTrue(getActivity().getString(
-                R.string.datepicker_test_transition_error1, oldMonthValue),
-                oldDayValue == expectedOldDayValue
-        );
-        assertTrue(getActivity().getString(
-                R.string.datepicker_test_transition_error2, newDayValue, newMonthValue),
-                newDayValue == expectedNewDayValue
-        );
-    }
-
-    public void testDateRanges() throws Throwable {
-
-        mInstrumentation = getInstrumentation();
-        Intent intent = new Intent(mInstrumentation.getContext(),
-                GuidedStepAttributesTestActivity.class);
-        Resources res = mInstrumentation.getContext().getResources();
-
-        SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
-
-        Calendar currCal = Calendar.getInstance();
-        currCal.set(Calendar.YEAR, 2016);
-        currCal.set(Calendar.MONTH, Calendar.JULY);
-        currCal.set(Calendar.DAY_OF_MONTH, 15);
-
-        Calendar minCal = Calendar.getInstance();
-        minCal.set(Calendar.YEAR, 2014);
-        minCal.set(Calendar.MONTH, Calendar.OCTOBER);
-        minCal.set(Calendar.DAY_OF_MONTH, 20);
-
-        Calendar maxCal = Calendar.getInstance();
-        maxCal.set(Calendar.YEAR, 2018);
-        maxCal.set(Calendar.MONTH, Calendar.FEBRUARY);
-        maxCal.set(Calendar.DAY_OF_MONTH, 10);
-
-        String title = "Date Picker Range Test";
-        String breadcrumb = "Date Picker Range Test Demo";
-        String description = "";
-        GuidanceStylist.Guidance guidance = new GuidanceStylist.Guidance(title, description,
-                breadcrumb, null);
-
-        List<GuidedAction> actionList = new ArrayList<>();
-
-        // testing different date formats and the correctness of range changes as we scroll
-        GuidedDatePickerAction dateAction1 = new GuidedDatePickerAction.Builder(
-                mInstrumentation.getContext())
-                .id(0)
-                .title(res.getString(R.string.datepicker_with_range_title,
-                        dateFormat.format(minCal.getTime()),
-                        dateFormat.format(maxCal.getTime())))
-                .multilineDescription(true)
-                .date(currCal.getTimeInMillis())
-                .datePickerFormat("MDY")
-                .minDate(minCal.getTimeInMillis())
-                .maxDate(maxCal.getTimeInMillis())
-                .build();
-
-        GuidedDatePickerAction dateAction2 = new GuidedDatePickerAction.Builder(
-                mInstrumentation.getContext())
-                .id(1)
-                .title(res.getString(R.string.datepicker_with_range_title,
-                        dateFormat.format(minCal.getTimeInMillis()),
-                        dateFormat.format(maxCal.getTimeInMillis())))
-                .multilineDescription(true)
-                .date(currCal.getTimeInMillis())
-                .datePickerFormat("DMY")
-                .minDate(minCal.getTimeInMillis())
-                .maxDate(maxCal.getTimeInMillis())
-                .build();
-
-        // testing date ranges when Year is equal
-        minCal.set(Calendar.YEAR, maxCal.get(Calendar.YEAR));
-        int minMonth = Math.min(minCal.get(Calendar.MONTH), maxCal.get(Calendar.MONTH));
-        int maxMonth = Math.max(minCal.get(Calendar.MONTH), maxCal.get(Calendar.MONTH));
-        minCal.set(Calendar.MONTH, minMonth);
-        maxCal.set(Calendar.MONTH, maxMonth);
-
-        GuidedDatePickerAction dateAction3 = new GuidedDatePickerAction.Builder(
-                mInstrumentation.getContext())
-                .id(2)
-                .title(res.getString(R.string.datepicker_with_range_title,
-                        dateFormat.format(minCal.getTimeInMillis()),
-                        dateFormat.format(maxCal.getTimeInMillis())))
-                .multilineDescription(true)
-                .date(currCal.getTimeInMillis())
-                .datePickerFormat("DMY")
-                .minDate(minCal.getTimeInMillis())
-                .maxDate(maxCal.getTimeInMillis())
-                .build();
-
-
-        // testing date ranges when both Month and Year are equal
-        minCal.set(Calendar.MONTH, maxCal.get(Calendar.MONTH));
-        int minDay = Math.min(minCal.get(Calendar.DAY_OF_MONTH), maxCal.get(Calendar.DAY_OF_MONTH));
-        int maxDay = Math.max(minCal.get(Calendar.DAY_OF_MONTH), maxCal.get(Calendar.DAY_OF_MONTH));
-        minCal.set(Calendar.DAY_OF_MONTH, minDay);
-        maxCal.set(Calendar.DAY_OF_MONTH, maxDay);
-
-        GuidedDatePickerAction dateAction4 = new GuidedDatePickerAction.Builder(
-                mInstrumentation.getContext())
-                .id(3)
-                .title(res.getString(R.string.datepicker_with_range_title,
-                        dateFormat.format(minCal.getTimeInMillis()),
-                        dateFormat.format(maxCal.getTimeInMillis())))
-                .multilineDescription(true)
-                .date(currCal.getTimeInMillis())
-                .datePickerFormat("DMY")
-                .minDate(minCal.getTimeInMillis())
-                .maxDate(maxCal.getTimeInMillis())
-                .build();
-
-
-        // testing date ranges when all fields are equal
-        minCal.set(Calendar.DAY_OF_MONTH, maxCal.get(Calendar.DAY_OF_MONTH));
-
-        GuidedDatePickerAction dateAction5 = new GuidedDatePickerAction.Builder(
-                mInstrumentation.getContext())
-                .id(4)
-                .title(res.getString(R.string.datepicker_with_range_title,
-                        dateFormat.format(minCal.getTimeInMillis()),
-                        dateFormat.format(maxCal.getTimeInMillis())))
-                .multilineDescription(true)
-                .date(currCal.getTimeInMillis())
-                .datePickerFormat("DMY")
-                .minDate(minCal.getTimeInMillis())
-                .maxDate(maxCal.getTimeInMillis())
-                .build();
-
-        actionList.add(dateAction1);
-        actionList.add(dateAction2);
-        actionList.add(dateAction3);
-        actionList.add(dateAction4);
-        actionList.add(dateAction5);
-
-        GuidedStepAttributesTestFragment.clear();
-        GuidedStepAttributesTestFragment.GUIDANCE = guidance;
-        GuidedStepAttributesTestFragment.ACTION_LIST = actionList;
-
-        initActivity(intent);
-
-        final GuidedStepFragment mFragment = (GuidedStepFragment) mActivity.
-                getGuidedStepTestFragment();
-
-        scrollToMinAndMaxDates(new int[] {1, 0, 2}, dateAction1);
-        scrollToMinAndMaxDates(new int[] {0, 1, 2}, dateAction2);
-        scrollToMinAndMaxDates(new int[] {0, 1, 2}, dateAction3);
-        scrollToMinAndMaxDates(new int[] {0, 1, 2}, dateAction4);
-        scrollToMinAndMaxDates(new int[] {0, 1, 2}, dateAction5);
-
-        Thread.sleep(FINAL_WAIT);
-    }
-
-    private void scrollToMinAndMaxDates(int[] columnIndices, GuidedDatePickerAction dateAction)
-            throws Throwable{
-
-        final GuidedStepFragment mFragment = (GuidedStepFragment)
-                mActivity.getGuidedStepTestFragment();
-
-        VerticalGridView guidedActionsList = (VerticalGridView)
-                mActivity.findViewById(R.id.guidedactions_list);
-
-        int currSelectedAction = mFragment.getSelectedActionPosition();
-        // scroll up/down to the requested action
-        long verticalScrollOffset = dateAction.getId() - currSelectedAction;
-
-        int verticalScrollDir = KeyEvent.KEYCODE_DPAD_DOWN;
-        if (verticalScrollOffset < 0) {
-            verticalScrollOffset= -verticalScrollOffset;
-            verticalScrollDir = KeyEvent.KEYCODE_DPAD_UP;
-        }
-        for(int i = 0; i < verticalScrollOffset; i++) {
-            sendKeys(verticalScrollDir);
-            Thread.sleep(TRANSITION_LENGTH);
-        }
-
-        assertTrue("The wrong action was selected!", mFragment.getSelectedActionPosition() ==
-                dateAction.getId());
-        DatePicker mPickerView = (DatePicker) mFragment.getActionItemView((int) dateAction.getId())
-                .findViewById(R.id.guidedactions_activator_item);
-
-        Calendar currentActionCal = Calendar.getInstance();
-        currentActionCal.setTimeInMillis(dateAction.getDate());
-
-
-        // scrolling to the minimum date
-
-        scrollOnField(Calendar.YEAR, columnIndices, mPickerView, KeyEvent.KEYCODE_DPAD_UP);
-        dateAction.setDate(mPickerView.getDate());
-
-        scrollOnField(Calendar.MONTH, columnIndices, mPickerView, KeyEvent.KEYCODE_DPAD_UP);
-        dateAction.setDate(mPickerView.getDate());
-
-        scrollOnField(Calendar.DAY_OF_MONTH, columnIndices, mPickerView, KeyEvent.KEYCODE_DPAD_UP);
-        dateAction.setDate(mPickerView.getDate());
-
-        Thread.sleep(VERTICAL_SCROLL_WAIT);
-
-        // now scrolling to the maximum date
-
-        scrollOnField(Calendar.YEAR, columnIndices, mPickerView, KeyEvent.KEYCODE_DPAD_DOWN);
-        dateAction.setDate(mPickerView.getDate());
-
-        scrollOnField(Calendar.MONTH, columnIndices, mPickerView, KeyEvent.KEYCODE_DPAD_DOWN);
-        dateAction.setDate(mPickerView.getDate());
-
-        scrollOnField(Calendar.DAY_OF_MONTH, columnIndices, mPickerView, KeyEvent.KEYCODE_DPAD_DOWN);
-        dateAction.setDate(mPickerView.getDate());
-
-        sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);
-        Thread.sleep(TRANSITION_LENGTH);
-    }
-
-}
diff --git a/v17/tests/src/android/support/v17/leanback/app/wizard/GuidedStepAttributesTest.java b/v17/tests/src/android/support/v17/leanback/app/wizard/GuidedStepAttributesTest.java
deleted file mode 100644
index d702515..0000000
--- a/v17/tests/src/android/support/v17/leanback/app/wizard/GuidedStepAttributesTest.java
+++ /dev/null
@@ -1,623 +0,0 @@
-/*
- * Copyright (C) 2016 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 android.support.v17.leanback.app.wizard;
-
-import android.app.Instrumentation;
-import android.content.Intent;
-import android.content.res.Resources;
-import android.support.v17.leanback.app.GuidedStepFragment;
-import android.support.v17.leanback.tests.R;
-import android.support.v17.leanback.widget.GuidanceStylist;
-import android.support.v17.leanback.widget.GuidedAction;
-import android.test.ActivityInstrumentationTestCase2;
-import android.util.Log;
-import android.view.KeyEvent;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-public class GuidedStepAttributesTest extends
-        ActivityInstrumentationTestCase2<GuidedStepAttributesTestActivity>
-{
-    static final long TRANSITION_LENGTH = 1000;
-
-    static final String TAG = "GuidedStepAttributesTest";
-
-    Instrumentation mInstrumentation;
-    GuidedStepAttributesTestActivity mActivity;
-
-    public GuidedStepAttributesTest() {
-        super(GuidedStepAttributesTestActivity.class);
-    }
-
-    private void initActivity(Intent intent) {
-
-        setActivityIntent(intent);
-        mActivity = getActivity();
-        try {
-            Thread.sleep(2000);
-        } catch(InterruptedException e) {
-            e.printStackTrace();
-        }
-    }
-
-    public void testFocusDisabledOnActions() throws Throwable {
-
-        mInstrumentation = getInstrumentation();
-        Intent intent = new Intent(mInstrumentation.getContext(),
-                GuidedStepAttributesTestActivity.class);
-        Resources res = mInstrumentation.getContext().getResources();
-
-        final int NUM_SEARCH_ACTIONS = 10;
-        final List<Integer> ACTIONS_WITH_DISABLED_FOCUS = new ArrayList<>(
-                Arrays.asList(1, 3, 4, 5, 8));
-        final int ACTION_ID_SEARCH = 1;
-        List<Integer> EXPECTED_ACTIONS_ID_AFTER_EACH_SELECT = new ArrayList<>();
-
-        // we will traverse actions from top to bottom and then back to the top
-        for(int i = 0; i < NUM_SEARCH_ACTIONS; i++) {
-            if (!ACTIONS_WITH_DISABLED_FOCUS.contains(i))
-                EXPECTED_ACTIONS_ID_AFTER_EACH_SELECT.add(i);
-        }
-        for(int i = EXPECTED_ACTIONS_ID_AFTER_EACH_SELECT.size(); i-- != 0;) {
-            EXPECTED_ACTIONS_ID_AFTER_EACH_SELECT.add(EXPECTED_ACTIONS_ID_AFTER_EACH_SELECT.get(i));
-        }
-
-
-        String title = "Guided Actions Focusable Test";
-        String breadcrumb = "Focusable Test Demo";
-        String description = "";
-        GuidanceStylist.Guidance guidance = new GuidanceStylist.Guidance(title, description,
-                breadcrumb, null);
-
-        List<GuidedAction> actionList = new ArrayList<>();
-        for (int i = 0; i < NUM_SEARCH_ACTIONS; i++ ) {
-            actionList.add(new GuidedAction.Builder(mInstrumentation.getContext())
-                    .id(ACTION_ID_SEARCH)
-                    .title(res.getString(R.string.search) + "" + i)
-                    .description(res.getString(R.string.search_description) + i)
-                    .build()
-            );
-        }
-        for(int action_id : ACTIONS_WITH_DISABLED_FOCUS )
-            actionList.get(action_id).setFocusable(false);
-
-        GuidedStepAttributesTestFragment.GUIDANCE = guidance;
-        GuidedStepAttributesTestFragment.ACTION_LIST = actionList;
-
-        initActivity(intent);
-
-        int lastSelectedActionId = -1;
-        int selectIndex = 0;
-        GuidedStepFragment mFragment = (GuidedStepFragment) mActivity.getGuidedStepTestFragment();
-        int prevSelectedActionPosition = -1;
-        int nextSelectedActionPosition = mFragment.getSelectedActionPosition();
-        while ( nextSelectedActionPosition != prevSelectedActionPosition ) {
-            lastSelectedActionId = mFragment.getSelectedActionPosition();
-            assertTrue(res.getString(R.string.focusable_test_error_message,
-                    actionList.get(lastSelectedActionId).getTitle()),
-                    lastSelectedActionId == EXPECTED_ACTIONS_ID_AFTER_EACH_SELECT.get(selectIndex));
-            selectIndex++;
-            sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);
-            prevSelectedActionPosition = nextSelectedActionPosition;
-            nextSelectedActionPosition = mFragment.getSelectedActionPosition();
-            Thread.sleep(TRANSITION_LENGTH);
-        }
-
-        prevSelectedActionPosition = -1;
-        while ( nextSelectedActionPosition != prevSelectedActionPosition ) {
-            lastSelectedActionId = mFragment.getSelectedActionPosition();
-            assertTrue(res.getString(R.string.focusable_test_error_message,
-                    actionList.get(lastSelectedActionId).getTitle()),
-                    lastSelectedActionId == EXPECTED_ACTIONS_ID_AFTER_EACH_SELECT.get(selectIndex));
-            selectIndex++;
-            sendKeys(KeyEvent.KEYCODE_DPAD_UP);
-            prevSelectedActionPosition = nextSelectedActionPosition;
-            nextSelectedActionPosition = mFragment.getSelectedActionPosition();
-            Thread.sleep(TRANSITION_LENGTH);
-        }
-
-    }
-
-    // Note: do not remove final or sRevertCallback gets null from 2nd test on!
-     static final GuidedStepAttributesTestFragment.Callback sRevertCallback = new
-            GuidedStepAttributesTestFragment.Callback() {
-        @Override
-        public void onActionClicked(GuidedStepFragment fragment, long id) {
-            List<GuidedAction> allActions = fragment.getActions();
-            for(int i = 1; i < allActions.size(); i++) {
-                GuidedAction action = allActions.get(i);
-                action.setEnabled(!action.isEnabled());
-                fragment.notifyActionChanged(fragment.findActionPositionById(action.getId()));
-            }
-        }
-    };
-
-    public void testDisabledActions() throws Throwable {
-
-        mInstrumentation = getInstrumentation();
-        Intent intent = new Intent(mInstrumentation.getContext(),
-                GuidedStepAttributesTestActivity.class);
-        Resources res = mInstrumentation.getContext().getResources();
-
-        final int NUM_SEARCH_ACTIONS = 10;
-        final List<Integer> DISABLED_ACTIONS = new ArrayList<>(
-                Arrays.asList(1, 3, 5, 7));
-        final int ACTION_ID_REVERT_BUTTON = 0;
-        final int ACTION_ID_SEARCH_BEGIN = ACTION_ID_REVERT_BUTTON + 1;
-        int ACTION_ID_SEARCH_END = ACTION_ID_SEARCH_BEGIN;
-
-        // sequence of clicked actions simulated in the test
-        List<Integer> CLICK_SEQUENCE = new ArrayList<>();
-
-        // Expected Clicked sequence can be different from focused ones since some of the actions
-        // are disabled hence not clickable
-        List<Integer> EXPECTED_FOCUSED_SEQUENCE = new ArrayList<>();
-        List<Integer> EXPECTED_CLICKED_SEQUENCE = new ArrayList<>();
-        // Expected actions state according to list of DISABLED_ACTIONS: false for disabled actions
-        List<Boolean> EXPECTED_ACTIONS_STATE = new ArrayList<>(
-                Arrays.asList(new Boolean[NUM_SEARCH_ACTIONS])
-        );
-        Collections.fill(EXPECTED_ACTIONS_STATE, Boolean.TRUE);
-
-        for(int i = 0; i < NUM_SEARCH_ACTIONS; i++) {
-            CLICK_SEQUENCE.add(i + 1);
-        }
-        for(int clickedActionId : CLICK_SEQUENCE) {
-            EXPECTED_FOCUSED_SEQUENCE.add(clickedActionId);
-            if (!DISABLED_ACTIONS.contains(clickedActionId - 1))
-                EXPECTED_CLICKED_SEQUENCE.add(clickedActionId);
-            else
-                EXPECTED_CLICKED_SEQUENCE.add(-1);
-        }
-
-        String title = "Guided Actions Enabled Test";
-        String breadcrumb = "Enabled Test Demo";
-        String description = "";
-        GuidanceStylist.Guidance guidance = new GuidanceStylist.Guidance(title, description,
-                breadcrumb, null);
-
-        List<GuidedAction> actionList = new ArrayList<>();
-        actionList.add(new GuidedAction.Builder(mInstrumentation.getContext())
-                .id(ACTION_ID_REVERT_BUTTON)
-                .title(res.getString(R.string.invert_title))
-                .description(res.getString(R.string.revert_description))
-                .build()
-        );
-
-        for (int i = 0; i < NUM_SEARCH_ACTIONS; i++ ) {
-            actionList.add(new GuidedAction.Builder(mInstrumentation.getContext())
-                    .id(ACTION_ID_SEARCH_END++)
-                    .title(res.getString(R.string.search) + "" + i)
-                    .description(res.getString(R.string.search_description) + i)
-                    .build()
-            );
-        }
-        for(int action_id : DISABLED_ACTIONS ) {
-            if ( action_id >= 0 && action_id < NUM_SEARCH_ACTIONS ) {
-                actionList.get(action_id + 1).setEnabled(false);
-                EXPECTED_ACTIONS_STATE.set(action_id, Boolean.FALSE);
-            }
-        }
-
-        GuidedStepAttributesTestFragment.clear();
-        GuidedStepAttributesTestFragment.GUIDANCE = guidance;
-        GuidedStepAttributesTestFragment.ACTION_LIST = actionList;
-        GuidedStepAttributesTestFragment.setActionClickCallback(ACTION_ID_REVERT_BUTTON,
-                sRevertCallback);
-
-        initActivity(intent);
-
-        final GuidedStepFragment mFragment = (GuidedStepFragment)
-                mActivity.getGuidedStepTestFragment();
-
-        examineEnabledAndDisabledActions(actionList, CLICK_SEQUENCE, EXPECTED_FOCUSED_SEQUENCE,
-                EXPECTED_CLICKED_SEQUENCE);
-        // now toggling all enabled/disabled actions to disabled/enabled and running the test again
-        Log.d(TAG, "Toggling actions...");
-        runTestOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                mFragment.setSelectedActionPosition(0);
-            }
-        });
-        Thread.sleep(TRANSITION_LENGTH);
-        sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);
-        Thread.sleep(TRANSITION_LENGTH);
-        for(int i = 0; i < EXPECTED_CLICKED_SEQUENCE.size(); i++) {
-            if (EXPECTED_CLICKED_SEQUENCE.get(i) == -1)
-                EXPECTED_CLICKED_SEQUENCE.set(i, CLICK_SEQUENCE.get(i));
-            else
-                EXPECTED_CLICKED_SEQUENCE.set(i, -1);
-        }
-
-        examineEnabledAndDisabledActions(actionList, CLICK_SEQUENCE, EXPECTED_FOCUSED_SEQUENCE,
-                EXPECTED_CLICKED_SEQUENCE);
-
-    }
-
-    private void examineEnabledAndDisabledActions(
-            List<GuidedAction> actionList, List<Integer> CLICK_SEQUENCE,
-                                List<Integer> EXPECTED_FOCUSED_SEQUENCE,
-                                List<Integer> EXPECTED_CLICKED_SEQUENCE)
-            throws Throwable {
-
-        final GuidedStepFragment mFragment = (GuidedStepFragment)
-                mActivity.getGuidedStepTestFragment();
-
-        for(int i = 0; i < CLICK_SEQUENCE.size(); i++) {
-            GuidedStepAttributesTestFragment.LAST_SELECTED_ACTION_ID =
-                    GuidedStepAttributesTestFragment.LAST_CLICKED_ACTION_ID = -1;
-            final int id = CLICK_SEQUENCE.get(i);
-            runTestOnUiThread(new Runnable() {
-                @Override
-                public void run() {
-                    mFragment.setSelectedActionPosition(id);
-                }
-            });
-            Thread.sleep(TRANSITION_LENGTH);
-
-            sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);
-            Thread.sleep(TRANSITION_LENGTH);
-
-            assertTrue(mInstrumentation.getContext().getResources().getString(
-                    R.string.enabled_test_wrong_focus_error_message),
-                    GuidedStepAttributesTestFragment.LAST_SELECTED_ACTION_ID ==
-                            EXPECTED_FOCUSED_SEQUENCE.get(i)
-            );
-            assertTrue(mInstrumentation.getContext().getResources().getString(
-                    R.string.enabled_test_wrong_click_error_message),
-                    GuidedStepAttributesTestFragment.LAST_CLICKED_ACTION_ID ==
-                            EXPECTED_CLICKED_SEQUENCE.get(i)
-            );
-            assertTrue(mInstrumentation.getContext().getResources().getString(
-                    R.string.enabled_test_wrong_flag_error_message),
-                    (GuidedStepAttributesTestFragment.LAST_CLICKED_ACTION_ID == -1) ?
-                            !actionList.get(id).isEnabled() :
-                            actionList.get(id).isEnabled()
-            );
-        }
-    }
-
-    public void testCheckedActions() throws Throwable {
-
-        mInstrumentation = getInstrumentation();
-        Intent intent = new Intent(mInstrumentation.getContext(),
-                GuidedStepAttributesTestActivity.class);
-        Resources res = mInstrumentation.getContext().getResources();
-
-        final int NUM_RADIO_ACTIONS = 3;
-        final int NUM_CHECK_BOX_ACTIONS = 3;
-        final int INITIALLY_CHECKED_RADIO_ACTION = 0;
-        final List<Integer> INITIALLY_CHECKED_CHECKBOX_ACTIONS = new ArrayList<>(
-                Arrays.asList(1, 2)
-        );
-
-        List<Integer> CLICK_SEQUENCE = new ArrayList<>();
-        for(int i = 0; i < NUM_RADIO_ACTIONS + NUM_CHECK_BOX_ACTIONS; i++) {
-            CLICK_SEQUENCE.add(i);
-        }
-
-        List<Boolean> EXPECTED_ACTIONS_STATE_AFTER_EACH_CLICK = new ArrayList<>(
-                Arrays.asList(new Boolean[CLICK_SEQUENCE.size()])
-        );
-        Collections.fill(EXPECTED_ACTIONS_STATE_AFTER_EACH_CLICK, Boolean.FALSE);
-
-        // initial state of actions before any clicks happen
-        EXPECTED_ACTIONS_STATE_AFTER_EACH_CLICK.set(INITIALLY_CHECKED_RADIO_ACTION, true);
-        for(int checkedCheckBox : INITIALLY_CHECKED_CHECKBOX_ACTIONS) {
-            EXPECTED_ACTIONS_STATE_AFTER_EACH_CLICK.set(NUM_RADIO_ACTIONS + checkedCheckBox, true);
-        }
-
-        String title = "Guided Actions Checked Test";
-        String breadcrumb = "Checked Test Demo";
-        String description = "";
-        GuidanceStylist.Guidance guidance = new GuidanceStylist.Guidance(title, description,
-                breadcrumb, null);
-
-        List<GuidedAction> actionList = new ArrayList<>();
-        actionList.add(new GuidedAction.Builder(mInstrumentation.getContext())
-                .title(res.getString(R.string.radio_actions_info_title))
-                .description(res.getString(R.string.radio_actions_info_desc))
-                .infoOnly(true)
-                .enabled(true)
-                .focusable(false)
-                .build()
-        );
-
-        int firstRadioActionIndex = actionList.size();
-        for(int i = 0; i < NUM_RADIO_ACTIONS; i++) {
-            actionList.add(new GuidedAction.Builder(mInstrumentation.getContext())
-                    .title(res.getString(R.string.checkbox_title) + i)
-                    .description(res.getString(R.string.checkbox_desc) + i)
-                    .checkSetId(GuidedAction.DEFAULT_CHECK_SET_ID)
-                    .build()
-            );
-            if (i == INITIALLY_CHECKED_RADIO_ACTION)
-                actionList.get(firstRadioActionIndex + i).setChecked(true);
-        }
-
-        actionList.add(new GuidedAction.Builder(mInstrumentation.getContext())
-                .title(res.getString(R.string.checkbox_actions_info_title))
-                .description(res.getString(R.string.checkbox_actions_info_desc))
-                .infoOnly(true)
-                .enabled(true)
-                .focusable(false)
-                .build()
-        );
-        int firstCheckBoxActionIndex = actionList.size();
-        for(int i = 0; i < NUM_CHECK_BOX_ACTIONS; i++) {
-            actionList.add(new GuidedAction.Builder(mInstrumentation.getContext())
-                    .title(res.getString(R.string.checkbox_title) + i)
-                    .description(res.getString(R.string.checkbox_desc) + i)
-                    .checkSetId(GuidedAction.CHECKBOX_CHECK_SET_ID)
-                    .build()
-            );
-        }
-        for(int i = 0; i < INITIALLY_CHECKED_CHECKBOX_ACTIONS.size(); i++ ) {
-            actionList.get(firstCheckBoxActionIndex + INITIALLY_CHECKED_CHECKBOX_ACTIONS.get(i))
-                    .setChecked(true);
-        }
-
-        GuidedStepAttributesTestFragment.GUIDANCE = guidance;
-        GuidedStepAttributesTestFragment.ACTION_LIST = actionList;
-        initActivity(intent);
-
-        examineCheckedAndUncheckedActions(actionList, EXPECTED_ACTIONS_STATE_AFTER_EACH_CLICK,
-                NUM_RADIO_ACTIONS, NUM_CHECK_BOX_ACTIONS);
-    }
-
-    private void updateExpectedActionsStateAfterClick(
-            List<Boolean> EXPECTED_ACTIONS_STATE_AFTER_EACH_CLICK, int NUM_RADIO_ACTIONS,
-            int NUM_CHECK_BOX_ACTIONS, int clickedActionIndex) {
-
-        if (clickedActionIndex < NUM_RADIO_ACTIONS) {
-            for(int i = 0; i < NUM_RADIO_ACTIONS; i++)
-                EXPECTED_ACTIONS_STATE_AFTER_EACH_CLICK.set(i, false);
-            EXPECTED_ACTIONS_STATE_AFTER_EACH_CLICK.set(clickedActionIndex, true);
-        }
-        else if (clickedActionIndex < NUM_RADIO_ACTIONS + NUM_CHECK_BOX_ACTIONS) {
-            EXPECTED_ACTIONS_STATE_AFTER_EACH_CLICK.set(clickedActionIndex,
-                    !EXPECTED_ACTIONS_STATE_AFTER_EACH_CLICK.get(clickedActionIndex));
-        }
-    }
-
-    private void verifyIfActionsStateIsCorrect(List<GuidedAction> actionList,
-            List<Boolean> EXPECTED_ACTIONS_STATE_AFTER_EACH_CLICK) {
-
-        int actionIndex = 0;
-        for(GuidedAction checkAction : actionList) {
-            if (checkAction.infoOnly())
-                continue;
-            assertTrue("Action " + actionIndex + " is " +
-                            (!checkAction.isChecked() ? "un-" : "") +
-                    "checked while it shouldn't be!",
-                    checkAction.isChecked() ==
-                            EXPECTED_ACTIONS_STATE_AFTER_EACH_CLICK.get(actionIndex));
-            actionIndex++;
-        }
-    }
-
-    private void examineCheckedAndUncheckedActions(List<GuidedAction> actionList,
-                                List<Boolean> EXPECTED_ACTIONS_STATE_AFTER_EACH_CLICK,
-                                int NUM_RADIO_ACTIONS,
-                                int NUM_CHECK_BOX_ACTIONS) throws Throwable {
-
-        final GuidedStepFragment guidedStepCheckedFragment = (GuidedStepFragment)
-                mActivity.getGuidedStepTestFragment();
-        final int firstRadioActionIndex = 1;
-        final int firstCheckBoxActionIndex = firstRadioActionIndex + NUM_RADIO_ACTIONS + 1;
-        for(int actionId = 0; actionId < NUM_RADIO_ACTIONS; actionId++) {
-            final int id = actionId;
-            runTestOnUiThread(new Runnable() {
-                @Override
-                public void run() {
-                    guidedStepCheckedFragment
-                            .setSelectedActionPosition(firstRadioActionIndex + id);
-                }
-            });
-            Thread.sleep(TRANSITION_LENGTH);
-
-            sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);
-            Thread.sleep(TRANSITION_LENGTH);
-            updateExpectedActionsStateAfterClick(EXPECTED_ACTIONS_STATE_AFTER_EACH_CLICK,
-                    NUM_RADIO_ACTIONS, NUM_CHECK_BOX_ACTIONS, actionId);
-            verifyIfActionsStateIsCorrect(actionList, EXPECTED_ACTIONS_STATE_AFTER_EACH_CLICK);
-        }
-
-        for(int actionId = 0; actionId < NUM_CHECK_BOX_ACTIONS; actionId++) {
-            final int id = actionId;
-            runTestOnUiThread(new Runnable() {
-                @Override
-                public void run() {
-                    guidedStepCheckedFragment
-                            .setSelectedActionPosition(firstCheckBoxActionIndex + id);
-                }
-            });
-            Thread.sleep(TRANSITION_LENGTH);
-
-            sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);
-            Thread.sleep(TRANSITION_LENGTH);
-            updateExpectedActionsStateAfterClick(EXPECTED_ACTIONS_STATE_AFTER_EACH_CLICK,
-                    NUM_RADIO_ACTIONS, NUM_CHECK_BOX_ACTIONS, NUM_RADIO_ACTIONS + actionId);
-            verifyIfActionsStateIsCorrect(actionList, EXPECTED_ACTIONS_STATE_AFTER_EACH_CLICK);
-        }
-    }
-
-    public void testSubActions() throws Throwable {
-
-        mInstrumentation = getInstrumentation();
-        Intent intent = new Intent(mInstrumentation.getContext(),
-                GuidedStepAttributesTestActivity.class);
-        Resources res = mInstrumentation.getContext().getResources();
-
-        String TAG = "testSubActions";
-        final int NUM_REGULAR_ACTIONS = 4;
-        final int[] NUM_SUBACTIONS_PER_ACTION = {2, 1, 0, 3};
-        final int[] REGULAR_ACTIONS_INDEX =  new int[NUM_REGULAR_ACTIONS];
-        final int[] BEGIN_SUBACTION_INDEX_PER_ACTION = new int[NUM_REGULAR_ACTIONS];
-        final int[] END_SUBACTION_INDEX_PER_ACTION = new int[NUM_REGULAR_ACTIONS];
-        // Actions and Subactions are assigned unique sequential IDs
-        int lastIndex = 0;
-        for(int i = 0; i < NUM_REGULAR_ACTIONS; i++) {
-            REGULAR_ACTIONS_INDEX[i] = lastIndex;
-            lastIndex++;
-            BEGIN_SUBACTION_INDEX_PER_ACTION[i] = lastIndex;
-            END_SUBACTION_INDEX_PER_ACTION[i] = (lastIndex += NUM_SUBACTIONS_PER_ACTION[i]);
-        }
-
-        // Sample click sequence for the main action list (not subactions)
-        List<Integer> ACTION_CLICK_SEQUENCE = new ArrayList<>(Arrays.asList(
-                3, 2, 1, 0
-        ));
-        List<Integer> EXPECTED_FOCUSED_SEQUENCE = new ArrayList<>();
-        List<Integer> EXPECTED_CLICKED_SEQUENCE = new ArrayList<>();
-
-        for(int clickedActionId : ACTION_CLICK_SEQUENCE) {
-            EXPECTED_FOCUSED_SEQUENCE.add(REGULAR_ACTIONS_INDEX[clickedActionId]);
-            if (NUM_SUBACTIONS_PER_ACTION[clickedActionId] > 0) {
-                for (int i = BEGIN_SUBACTION_INDEX_PER_ACTION[clickedActionId]; i <
-                        END_SUBACTION_INDEX_PER_ACTION[clickedActionId]; i++) {
-                    EXPECTED_CLICKED_SEQUENCE.add(REGULAR_ACTIONS_INDEX[clickedActionId]);
-                    for (int j = BEGIN_SUBACTION_INDEX_PER_ACTION[clickedActionId]; j <= i; j++) {
-                        EXPECTED_FOCUSED_SEQUENCE.add(j);
-                    }
-                    EXPECTED_CLICKED_SEQUENCE.add(i);
-                    EXPECTED_FOCUSED_SEQUENCE.add(REGULAR_ACTIONS_INDEX[clickedActionId]);
-                }
-            } else {
-                EXPECTED_CLICKED_SEQUENCE.add(REGULAR_ACTIONS_INDEX[clickedActionId]);
-                EXPECTED_FOCUSED_SEQUENCE.add(REGULAR_ACTIONS_INDEX[clickedActionId]);
-            }
-        }
-
-        String title = "Guided SubActions Test";
-        String breadcrumb = "SubActions Test Demo";
-        String description = "";
-        GuidanceStylist.Guidance guidance = new GuidanceStylist.Guidance(title, description,
-                breadcrumb, null);
-
-        List<GuidedAction> actionList = new ArrayList<>();
-
-        lastIndex = 0;
-        for (int i = 0; i < NUM_REGULAR_ACTIONS; i++ ) {
-            GuidedAction action = new GuidedAction.Builder(mInstrumentation.getContext())
-                    .id(lastIndex++)
-                    .title(res.getString(R.string.dropdown_action_title, i))
-                    .description(res.getString(R.string.dropdown_action_desc, i))
-                    .build();
-            if (NUM_SUBACTIONS_PER_ACTION[i] > 0) {
-                List<GuidedAction> subActions = new ArrayList<>();
-                action.setSubActions(subActions);
-                for(int j = 0; j < NUM_SUBACTIONS_PER_ACTION[i]; j++) {
-                    subActions.add(new GuidedAction.Builder(mInstrumentation.getContext())
-                            .id(lastIndex++)
-                            .title(res.getString(R.string.subaction_title, j))
-                            .description("")
-                            .build()
-                    );
-                }
-            }
-            actionList.add(action);
-        }
-
-        GuidedStepAttributesTestFragment.clear();
-        GuidedStepAttributesTestFragment.GUIDANCE = guidance;
-        GuidedStepAttributesTestFragment.ACTION_LIST = actionList;
-
-        initActivity(intent);
-
-        final GuidedStepFragment mFragment = (GuidedStepFragment) mActivity.
-                getGuidedStepTestFragment();
-
-        int focusStep = 0, clickStep = 0;
-        for(int i = 0; i < ACTION_CLICK_SEQUENCE.size(); i++) {
-            GuidedStepAttributesTestFragment.LAST_SELECTED_ACTION_ID =
-                    GuidedStepAttributesTestFragment.LAST_CLICKED_ACTION_ID = -1;
-            final int id = ACTION_CLICK_SEQUENCE.get(i);
-            final GuidedAction selectedAction = actionList.get(id);
-            runTestOnUiThread(new Runnable() {
-                @Override
-                public void run() {
-                    mFragment.setSelectedActionPosition(id);
-                }
-            });
-            Thread.sleep(TRANSITION_LENGTH);
-
-            assertTrue(mInstrumentation.getContext().getResources().getString(
-                    R.string.subaction_test_wrong_focus_error_message),
-                    GuidedStepAttributesTestFragment.LAST_SELECTED_ACTION_ID ==
-                            EXPECTED_FOCUSED_SEQUENCE.get(focusStep++)
-            );
-
-            if (selectedAction.hasSubActions()) {
-                // Following for loop clicks on a specific action and scrolls & clicks through
-                // all its subactions
-                for (int j = 0; j < selectedAction.getSubActions().size(); j++) {
-                    sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);
-                    Thread.sleep(TRANSITION_LENGTH);
-                    assertTrue(mInstrumentation.getContext().getResources().getString(
-                            R.string.subaction_test_wrong_focus_error_message),
-                            GuidedStepAttributesTestFragment.LAST_SELECTED_ACTION_ID ==
-                                    EXPECTED_FOCUSED_SEQUENCE.get(focusStep++)
-                    );
-                    assertTrue(mInstrumentation.getContext().getResources().getString(
-                            R.string.subaction_test_wrong_click_error_message),
-                            GuidedStepAttributesTestFragment.LAST_CLICKED_ACTION_ID ==
-                                    EXPECTED_CLICKED_SEQUENCE.get(clickStep++)
-                    );
-                    for (int k = 0; k < j; k++) {
-                        sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);
-                        Thread.sleep(TRANSITION_LENGTH);
-                        assertTrue(mInstrumentation.getContext().getResources().getString(
-                                R.string.subaction_test_wrong_focus_error_message),
-                                GuidedStepAttributesTestFragment.LAST_SELECTED_ACTION_ID ==
-                                        EXPECTED_FOCUSED_SEQUENCE.get(focusStep++)
-                        );
-                    }
-                    sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);
-                    Thread.sleep(TRANSITION_LENGTH);
-
-                    assertTrue(mInstrumentation.getContext().getResources().getString(
-                            R.string.subaction_test_wrong_focus_error_message),
-                            GuidedStepAttributesTestFragment.LAST_SELECTED_ACTION_ID ==
-                                    EXPECTED_FOCUSED_SEQUENCE.get(focusStep++)
-                    );
-                    assertTrue(mInstrumentation.getContext().getResources().getString(
-                            R.string.subaction_test_wrong_click_error_message),
-                            GuidedStepAttributesTestFragment.LAST_CLICKED_ACTION_ID ==
-                                    EXPECTED_CLICKED_SEQUENCE.get(clickStep++)
-                    );
-                }
-            } else {
-                sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);
-                Thread.sleep(TRANSITION_LENGTH);
-                assertTrue(mInstrumentation.getContext().getResources().getString(
-                        R.string.subaction_test_wrong_focus_error_message),
-                        GuidedStepAttributesTestFragment.LAST_SELECTED_ACTION_ID ==
-                                EXPECTED_FOCUSED_SEQUENCE.get(focusStep++)
-                );
-                assertTrue(mInstrumentation.getContext().getResources().getString(
-                        R.string.subaction_test_wrong_click_error_message),
-                        GuidedStepAttributesTestFragment.LAST_CLICKED_ACTION_ID ==
-                                EXPECTED_CLICKED_SEQUENCE.get(clickStep++)
-                );
-            }
-        }
-
-    }
-}
diff --git a/v17/tests/src/android/support/v17/leanback/widget/GridActivity.java b/v17/tests/src/android/support/v17/leanback/widget/GridActivity.java
deleted file mode 100644
index 27c5ad7..0000000
--- a/v17/tests/src/android/support/v17/leanback/widget/GridActivity.java
+++ /dev/null
@@ -1,476 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.v17.leanback.widget;
-
-import android.support.v17.leanback.tests.R;
-import android.support.v7.widget.RecyclerView;
-import android.support.v17.leanback.widget.BaseGridView;
-import android.support.v17.leanback.widget.OnChildSelectedListener;
-import android.app.Activity;
-import android.content.Intent;
-import android.graphics.Color;
-import android.os.Bundle;
-import android.util.Log;
-import android.util.SparseArray;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.view.View.OnFocusChangeListener;
-import android.view.ViewGroup;
-import android.widget.ImageView;
-import android.widget.TextView;
-
-import java.util.ArrayList;
-
-/**
- * @hide from javadoc
- */
-public class GridActivity extends Activity {
-
-    private static final String TAG = "GridActivity";
-
-    interface AdapterListener {
-        void onBind(RecyclerView.ViewHolder vh, int position);
-    }
-
-    public static final String EXTRA_LAYOUT_RESOURCE_ID = "layoutResourceId";
-    public static final String EXTRA_NUM_ITEMS = "numItems";
-    public static final String EXTRA_ITEMS = "items";
-    public static final String EXTRA_ITEMS_FOCUSABLE = "itemsFocusable";
-    public static final String EXTRA_STAGGERED = "staggered";
-    public static final String EXTRA_REQUEST_LAYOUT_ONFOCUS = "requestLayoutOnFocus";
-    public static final String EXTRA_REQUEST_FOCUS_ONLAYOUT = "requstFocusOnLayout";
-    public static final String EXTRA_CHILD_LAYOUT_ID = "childLayoutId";
-    public static final String EXTRA_SECONDARY_SIZE_ZERO = "secondarySizeZero";
-    public static final String EXTRA_UPDATE_SIZE = "updateSize";
-    public static final String EXTRA_LAYOUT_MARGINS = "layoutMargins";
-    public static final String EXTRA_NINEPATCH_SHADOW = "NINEPATCH_SHADOW";
-
-    /**
-     * Class that implements GridWidgetTest.ViewTypeProvider for creating different
-     * view types for each position.
-     */
-    public static final String EXTRA_VIEWTYPEPROVIDER_CLASS = "viewtype_class";
-    /**
-     * Class that implements GridWidgetTest.ItemAlignmentFacetProvider for creating different
-     * ItemAlignmentFacet for each ViewHolder.
-     */
-    public static final String EXTRA_ITEMALIGNMENTPROVIDER_CLASS = "itemalignment_class";
-    /**
-     * Class that implements GridWidgetTest.ItemAlignmentFacetProvider for creating different
-     * ItemAlignmentFacet for a given viewType.
-     */
-    public static final String EXTRA_ITEMALIGNMENTPROVIDER_VIEWTYPE_CLASS =
-            "itemalignment_viewtype_class";
-    public static final String SELECT_ACTION = "android.test.leanback.widget.SELECT";
-
-    static final int DEFAULT_NUM_ITEMS = 100;
-    static final boolean DEFAULT_STAGGERED = true;
-    static final boolean DEFAULT_REQUEST_LAYOUT_ONFOCUS = false;
-    static final boolean DEFAULT_REQUEST_FOCUS_ONLAYOUT = false;
-
-    private static final boolean DEBUG = false;
-
-    int mLayoutId;
-    int mOrientation;
-    int mNumItems;
-    int mChildLayout;
-    boolean mStaggered;
-    boolean mRequestLayoutOnFocus;
-    boolean mRequestFocusOnLayout;
-    boolean mSecondarySizeZero;
-    GridWidgetTest.ViewTypeProvider mViewTypeProvider;
-    GridWidgetTest.ItemAlignmentFacetProvider mAlignmentProvider;
-    GridWidgetTest.ItemAlignmentFacetProvider mAlignmentViewTypeProvider;
-    AdapterListener mAdapterListener;
-    boolean mUpdateSize = true;
-
-    int[] mGridViewLayoutSize;
-    BaseGridView mGridView;
-    int[] mItemLengths;
-    boolean[] mItemFocusables;
-    int[] mLayoutMargins;
-    int mNinePatchShadow;
-
-    private int mBoundCount;
-
-    private View createView() {
-
-        View view = getLayoutInflater().inflate(mLayoutId, null, false);
-        mGridView = (BaseGridView) view.findViewById(R.id.gridview);
-        mOrientation = mGridView instanceof HorizontalGridView ? BaseGridView.HORIZONTAL :
-                BaseGridView.VERTICAL;
-        mGridView.setWindowAlignment(BaseGridView.WINDOW_ALIGN_BOTH_EDGE);
-        mGridView.setWindowAlignmentOffsetPercent(35);
-        mGridView.setOnChildSelectedListener(new OnChildSelectedListener() {
-            @Override
-            public void onChildSelected(ViewGroup parent, View view, int position, long id) {
-                if (DEBUG) Log.d(TAG, "onChildSelected position=" + position +  " id="+id);
-            }
-        });
-        if (mNinePatchShadow != 0) {
-            mGridView.setLayoutMode(ViewGroup.LAYOUT_MODE_OPTICAL_BOUNDS);
-        }
-        return view;
-    }
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        Intent intent = getIntent();
-
-        mLayoutId = intent.getIntExtra(EXTRA_LAYOUT_RESOURCE_ID, R.layout.horizontal_grid);
-        mChildLayout = intent.getIntExtra(EXTRA_CHILD_LAYOUT_ID, -1);
-        mStaggered = intent.getBooleanExtra(EXTRA_STAGGERED, DEFAULT_STAGGERED);
-        mRequestLayoutOnFocus = intent.getBooleanExtra(EXTRA_REQUEST_LAYOUT_ONFOCUS,
-                DEFAULT_REQUEST_LAYOUT_ONFOCUS);
-        mRequestFocusOnLayout = intent.getBooleanExtra(EXTRA_REQUEST_FOCUS_ONLAYOUT,
-                DEFAULT_REQUEST_FOCUS_ONLAYOUT);
-        mUpdateSize = intent.getBooleanExtra(EXTRA_UPDATE_SIZE, true);
-        mSecondarySizeZero = intent.getBooleanExtra(EXTRA_SECONDARY_SIZE_ZERO, false);
-        mItemLengths = intent.getIntArrayExtra(EXTRA_ITEMS);
-        mItemFocusables = intent.getBooleanArrayExtra(EXTRA_ITEMS_FOCUSABLE);
-        mLayoutMargins = intent.getIntArrayExtra(EXTRA_LAYOUT_MARGINS);
-        String alignmentClass = intent.getStringExtra(EXTRA_ITEMALIGNMENTPROVIDER_CLASS);
-        String alignmentViewTypeClass =
-                intent.getStringExtra(EXTRA_ITEMALIGNMENTPROVIDER_VIEWTYPE_CLASS);
-        String viewTypeClass = intent.getStringExtra(EXTRA_VIEWTYPEPROVIDER_CLASS);
-        mNinePatchShadow = intent.getIntExtra(EXTRA_NINEPATCH_SHADOW, 0);
-        try {
-            if (alignmentClass != null) {
-                mAlignmentProvider = (GridWidgetTest.ItemAlignmentFacetProvider)
-                        Class.forName(alignmentClass).newInstance();
-            }
-            if (alignmentViewTypeClass != null) {
-                mAlignmentViewTypeProvider = (GridWidgetTest.ItemAlignmentFacetProvider)
-                        Class.forName(alignmentViewTypeClass).newInstance();
-            }
-            if (viewTypeClass != null) {
-                mViewTypeProvider = (GridWidgetTest.ViewTypeProvider)
-                        Class.forName(viewTypeClass).newInstance();
-            }
-        } catch (ClassNotFoundException ex) {
-            throw new RuntimeException(ex);
-        } catch (InstantiationException ex) {
-            throw new RuntimeException(ex);
-        } catch (IllegalAccessException ex) {
-            throw new RuntimeException(ex);
-        }
-
-        super.onCreate(savedInstanceState);
-
-        if (DEBUG) Log.v(TAG, "onCreate " + this);
-
-        RecyclerView.Adapter adapter = new MyAdapter();
-
-        View view = createView();
-        if (mItemLengths == null) {
-            mNumItems = intent.getIntExtra(EXTRA_NUM_ITEMS, DEFAULT_NUM_ITEMS);
-            mItemLengths = new int[mNumItems];
-            for (int i = 0; i < mItemLengths.length; i++) {
-                if (mOrientation == BaseGridView.HORIZONTAL) {
-                    mItemLengths[i] = mStaggered ? (int)(Math.random() * 180) + 180 : 240;
-                } else {
-                    mItemLengths[i] = mStaggered ? (int)(Math.random() * 120) + 120 : 160;
-                }
-            }
-        } else {
-            mNumItems = mItemLengths.length;
-        }
-
-        mGridView.setAdapter(adapter);
-        setContentView(view);
-    }
-
-    void rebindToNewAdapter() {
-        mGridView.setAdapter(new MyAdapter());
-    }
-
-    @Override
-    protected void onNewIntent(Intent intent) {
-        if (DEBUG) Log.v(TAG, "onNewIntent " + intent+ " "+this);
-        if (intent.getAction().equals(SELECT_ACTION)) {
-            int position = intent.getIntExtra("SELECT_POSITION", -1);
-            if (position >= 0) {
-                mGridView.setSelectedPosition(position);
-            }
-        }
-        super.onNewIntent(intent);
-    }
-
-    private OnFocusChangeListener mItemFocusChangeListener = new OnFocusChangeListener() {
-
-        @Override
-        public void onFocusChange(View v, boolean hasFocus) {
-            if (hasFocus) {
-                v.setBackgroundColor(Color.YELLOW);
-            } else {
-                v.setBackgroundColor(Color.LTGRAY);
-            }
-            if (mRequestLayoutOnFocus) {
-                RecyclerView.ViewHolder vh = mGridView.getChildViewHolder(v);
-                int position = vh.getAdapterPosition();
-                updateSize(v, position);
-            }
-        }
-    };
-
-    private OnFocusChangeListener mSubItemFocusChangeListener = new OnFocusChangeListener() {
-
-        @Override
-        public void onFocusChange(View v, boolean hasFocus) {
-            if (hasFocus) {
-                v.setBackgroundColor(Color.YELLOW);
-            } else {
-                v.setBackgroundColor(Color.LTGRAY);
-            }
-        }
-    };
-
-    void resetBoundCount() {
-        mBoundCount = 0;
-    }
-
-    int getBoundCount() {
-       return mBoundCount;
-    }
-
-    void swap(int index1, int index2) {
-        if (index1 == index2) {
-            return;
-        } else if (index1 > index2) {
-            int index = index1;
-            index1 = index2;
-            index2 = index;
-        }
-        int value = mItemLengths[index1];
-        mItemLengths[index1] = mItemLengths[index2];
-        mItemLengths[index2] = value;
-        mGridView.getAdapter().notifyItemMoved(index1, index2);
-        mGridView.getAdapter().notifyItemMoved(index2 - 1, index1);
-    }
-
-    void changeArraySize(int length) {
-        mNumItems = length;
-        mGridView.getAdapter().notifyDataSetChanged();
-    }
-
-    int[] removeItems(int index, int length) {
-        int[] removed = new int[length];
-        System.arraycopy(mItemLengths, index, removed, 0, length);
-        System.arraycopy(mItemLengths, index + length, mItemLengths, index,
-                mNumItems - index - length);
-        mNumItems -= length;
-        if (mGridView.getAdapter() != null) {
-            mGridView.getAdapter().notifyItemRangeRemoved(index, length);
-        }
-        return removed;
-    }
-
-    void attachToNewAdapter(int[] items) {
-        mItemLengths = items;
-        mNumItems = items.length;
-        mGridView.setAdapter(new MyAdapter());
-    }
-
-
-    void addItems(int index, int[] items) {
-        int length = items.length;
-        if (mItemLengths.length < mNumItems + length) {
-            int[] array = new int[mNumItems + length];
-            System.arraycopy(mItemLengths, 0, array, 0, mNumItems);
-            mItemLengths = array;
-        }
-        System.arraycopy(mItemLengths, index, mItemLengths, index + length, mNumItems - index);
-        System.arraycopy(items, 0, mItemLengths, index, length);
-        mNumItems += length;
-        if (mGridView.getAdapter() != null) {
-            mGridView.getAdapter().notifyItemRangeInserted(index, length);
-        }
-    }
-
-    class MyAdapter extends RecyclerView.Adapter implements FacetProviderAdapter {
-
-        @Override
-        public int getItemViewType(int position) {
-            if (mViewTypeProvider != null) {
-                return mViewTypeProvider.getViewType(position);
-            }
-            return 0;
-        }
-
-        @Override
-        public FacetProvider getFacetProvider(int viewType) {
-            final Object alignmentFacet = mAlignmentViewTypeProvider != null?
-                mAlignmentViewTypeProvider.getItemAlignmentFacet(viewType) : null;
-            if (alignmentFacet != null) {
-                return new FacetProvider() {
-                    @Override
-                    public Object getFacet(Class facetClass) {
-                        if (facetClass.equals(ItemAlignmentFacet.class)) {
-                            return alignmentFacet;
-                        }
-                        return null;
-                    }
-                };
-            }
-            return null;
-        }
-
-        @Override
-        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
-            if (DEBUG) Log.v(TAG, "createViewHolder " + viewType);
-            View itemView;
-            if (mChildLayout != -1) {
-                final View view = getLayoutInflater().inflate(mChildLayout, parent, false);
-                ArrayList<View> focusables = new ArrayList<View>();
-                view.addFocusables(focusables, View.FOCUS_UP);
-                for (int i = 0; i < focusables.size(); i++) {
-                    View f = focusables.get(i);
-                    f.setBackgroundColor(Color.LTGRAY);
-                    f.setOnFocusChangeListener(new OnFocusChangeListener() {
-                        @Override
-                        public void onFocusChange(View v, boolean hasFocus) {
-                            if (hasFocus) {
-                                v.setBackgroundColor(Color.YELLOW);
-                            } else {
-                                v.setBackgroundColor(Color.LTGRAY);
-                            }
-                            if (mRequestLayoutOnFocus) {
-                                if (v == view) {
-                                    RecyclerView.ViewHolder vh = mGridView.getChildViewHolder(v);
-                                    int position = vh.getAdapterPosition();
-                                    updateSize(v, position);
-                                }
-                                view.requestLayout();
-                            }
-                        }
-                    });
-                }
-                itemView = view;
-            } else {
-                TextView textView = new TextView(parent.getContext()) {
-                    @Override
-                    protected void onLayout(boolean change, int left, int top, int right,
-                            int bottom) {
-                        super.onLayout(change, left, top, right, bottom);
-                        if (mRequestFocusOnLayout) {
-                            if (hasFocus()) {
-                                clearFocus();
-                                requestFocus();
-                            }
-                        }
-                    }
-                };
-                textView.setTextColor(Color.BLACK);
-                textView.setOnFocusChangeListener(mItemFocusChangeListener);
-                itemView = textView;
-            }
-            if (mLayoutMargins != null) {
-                ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams)
-                        itemView.getLayoutParams();
-                if (lp == null) {
-                    lp = new ViewGroup.MarginLayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
-                            ViewGroup.LayoutParams.WRAP_CONTENT);
-                }
-                lp.leftMargin = mLayoutMargins[0];
-                lp.topMargin = mLayoutMargins[1];
-                lp.rightMargin = mLayoutMargins[2];
-                lp.bottomMargin = mLayoutMargins[3];
-                itemView.setLayoutParams(lp);
-            }
-            if (mNinePatchShadow != 0) {
-                ViewGroup viewGroup = (ViewGroup) itemView;
-                View shadow = new View(viewGroup.getContext());
-                shadow.setBackgroundResource(mNinePatchShadow);
-                viewGroup.addView(shadow);
-                viewGroup.setLayoutMode(ViewGroup.LAYOUT_MODE_OPTICAL_BOUNDS);
-            }
-            return new ViewHolder(itemView);
-        }
-
-        @Override
-        public void onBindViewHolder(RecyclerView.ViewHolder baseHolder, int position) {
-            if (DEBUG) Log.v(TAG, "bindViewHolder " + position + " " + baseHolder);
-            mBoundCount++;
-            ViewHolder holder = (ViewHolder) baseHolder;
-            if (mAlignmentProvider != null) {
-                holder.mItemAlignment = mAlignmentProvider.getItemAlignmentFacet(position);
-            } else {
-                holder.mItemAlignment = null;
-            }
-            if (mChildLayout == -1) {
-                ((TextView) holder.itemView).setText("Item "+mItemLengths[position]
-                        + " type=" + getItemViewType(position));
-                boolean focusable = true;
-                if (mItemFocusables != null) {
-                    focusable = mItemFocusables[position];
-                }
-                ((TextView) holder.itemView).setFocusable(focusable);
-                ((TextView) holder.itemView).setFocusableInTouchMode(focusable);
-                holder.itemView.setBackgroundColor(Color.LTGRAY);
-            } else {
-                if (holder.itemView instanceof TextView) {
-                    ((TextView) holder.itemView).setText("Item "+mItemLengths[position]
-                            + " type=" + getItemViewType(position));
-                }
-            }
-            updateSize(holder.itemView, position);
-            if (mAdapterListener != null) {
-                mAdapterListener.onBind(baseHolder, position);
-            }
-        }
-
-        @Override
-        public int getItemCount() {
-            return mNumItems;
-        }
-
-    }
-
-    void updateSize(View view, int position) {
-        if (!mUpdateSize) {
-            return;
-        }
-        ViewGroup.LayoutParams p = view.getLayoutParams();
-        if (p == null) {
-            p = new ViewGroup.LayoutParams(0, 0);
-        }
-        if (mOrientation == BaseGridView.HORIZONTAL) {
-            p.width = mItemLengths[position] + (mRequestLayoutOnFocus && view.hasFocus() ? 1 : 0);
-            p.height = mSecondarySizeZero ? 0 : 80;
-        } else {
-            p.width = mSecondarySizeZero ? 0 : 240;
-            p.height = mItemLengths[position] + (mRequestLayoutOnFocus && view.hasFocus() ? 1 : 0);
-        }
-        view.setLayoutParams(p);
-    }
-
-    static class ViewHolder extends RecyclerView.ViewHolder implements FacetProvider {
-
-        ItemAlignmentFacet mItemAlignment;
-        public ViewHolder(View v) {
-            super(v);
-        }
-
-        @Override
-        public Object getFacet(Class facetClass) {
-            if (facetClass.equals(ItemAlignmentFacet.class)) {
-                return mItemAlignment;
-            }
-            return null;
-        }
-    }
-}
diff --git a/v17/tests/src/android/support/v17/leanback/widget/GridWidgetTest.java b/v17/tests/src/android/support/v17/leanback/widget/GridWidgetTest.java
deleted file mode 100644
index 91a114f..0000000
--- a/v17/tests/src/android/support/v17/leanback/widget/GridWidgetTest.java
+++ /dev/null
@@ -1,2743 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.v17.leanback.widget;
-
-import android.app.Instrumentation;
-import android.content.Intent;
-import android.graphics.Canvas;
-import android.graphics.Color;
-import android.graphics.Rect;
-import android.graphics.drawable.ColorDrawable;
-import android.os.Parcelable;
-import android.support.v17.leanback.tests.R;
-import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat;
-import android.support.v7.widget.RecyclerView;
-import android.support.v7.widget.RecyclerViewAccessibilityDelegate;
-import android.test.ActivityInstrumentationTestCase2;
-import android.text.Selection;
-import android.text.Spannable;
-import android.util.SparseArray;
-import android.util.SparseIntArray;
-import android.view.KeyEvent;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.TextView;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.HashMap;
-
-/**
- * @hide from javadoc
- */
-public class GridWidgetTest extends ActivityInstrumentationTestCase2<GridActivity> {
-
-    private static final boolean HUMAN_DELAY = false;
-    private static final long WAIT_FOR_SCROLL_IDLE_TIMEOUT_MS = 60000;
-
-    protected GridActivity mActivity;
-    protected Instrumentation mInstrumentation;
-    protected BaseGridView mGridView;
-    protected GridLayoutManager mLayoutManager;
-    protected int mOrientation;
-    protected int mNumRows;
-
-    private final Comparator<View> mRowSortComparator = new Comparator<View>() {
-        public int compare(View lhs, View rhs) {
-            if (mOrientation == BaseGridView.HORIZONTAL) {
-                return lhs.getLeft() - rhs.getLeft();
-            } else {
-                return lhs.getTop() - rhs.getTop();
-            }
-        };
-    };
-
-    /**
-     * Verify margins between items on same row are same.
-     */
-    private final Runnable mVerifyLayout = new Runnable() {
-        @Override
-        public void run() {
-            verifyMargin();
-        }
-    };
-
-    public GridWidgetTest() {
-        super("android.support.v17.leanback.tests", GridActivity.class);
-    }
-
-    private void humanDelay(int delay) throws InterruptedException {
-        if (HUMAN_DELAY) Thread.sleep(delay);
-    }
-    /**
-     * Change size of the Adapter and notifyDataSetChanged.
-     */
-    private void changeArraySize(final int size) throws Throwable {
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mActivity.changeArraySize(size);
-            }
-        });
-        Thread.sleep(500);
-    }
-
-    /**
-     * Change selected position.
-     */
-    private void setSelectedPosition(final int position, final int scrollExtra) throws Throwable {
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mGridView.setSelectedPosition(position, scrollExtra);
-            }
-        });
-        Thread.sleep(500);
-    }
-
-    protected void waitForScrollIdleAndItemAnimation(Runnable verify) throws Throwable {
-        waitForScrollIdle();
-        waitForItemAnimation();
-        verify.run();
-    }
-
-    protected void waitForItemAnimation() throws Throwable {
-        Thread.sleep(100);
-        while (mGridView.getItemAnimator() != null && mGridView.getItemAnimator().isRunning()) {
-            try {
-                Thread.sleep(100);
-            } catch (InterruptedException ex) {
-                break;
-            }
-        }
-    }
-
-    /**
-     * Wait for grid view stop scroll and optionally verify state of grid view.
-     */
-    protected void waitForScrollIdle(Runnable verify) throws Throwable {
-        Thread.sleep(100);
-        int total = 0;
-        while (mGridView.getLayoutManager().isSmoothScrolling() ||
-                mGridView.getScrollState() != BaseGridView.SCROLL_STATE_IDLE) {
-            if ((total += 100) >= WAIT_FOR_SCROLL_IDLE_TIMEOUT_MS) {
-                throw new RuntimeException("waitForScrollIdle Timeout");
-            }
-            try {
-                Thread.sleep(100);
-            } catch (InterruptedException ex) {
-                break;
-            }
-            if (verify != null) {
-                runTestOnUiThread(verify);
-            }
-        }
-    }
-
-    /**
-     * Wait for grid view stop animation and optionally verify state of grid view.
-     */
-    protected void waitForTransientStateGone(Runnable verify) throws Throwable {
-        do {
-            try {
-                Thread.sleep(100);
-            } catch (InterruptedException ex) {
-                break;
-            }
-            if (verify != null) {
-                runTestOnUiThread(verify);
-            }
-        } while (mGridView.hasTransientState());
-    }
-
-    /**
-     * Wait for grid view stop scroll.
-     */
-    protected void waitForScrollIdle() throws Throwable {
-        waitForScrollIdle(null);
-    }
-
-    /**
-     * Scrolls using given key.
-     */
-    protected void scroll(int key, Runnable verify) throws Throwable {
-        do {
-            if (verify != null) {
-                runTestOnUiThread(verify);
-            }
-            sendRepeatedKeys(10, key);
-            try {
-                Thread.sleep(300);
-            } catch (InterruptedException ex) {
-                break;
-            }
-        } while (mGridView.getLayoutManager().isSmoothScrolling() ||
-                mGridView.getScrollState() != BaseGridView.SCROLL_STATE_IDLE);
-    }
-
-    protected void scrollToBegin(Runnable verify) throws Throwable {
-        int key;
-        if (mOrientation == BaseGridView.HORIZONTAL) {
-            if (mGridView.getLayoutDirection() == ViewGroup.LAYOUT_DIRECTION_RTL) {
-                key = KeyEvent.KEYCODE_DPAD_RIGHT;
-            } else {
-                key = KeyEvent.KEYCODE_DPAD_LEFT;
-            }
-        } else {
-            key = KeyEvent.KEYCODE_DPAD_UP;
-        }
-        scroll(key, verify);
-    }
-
-    protected void scrollToEnd(Runnable verify) throws Throwable {
-        int key;
-        if (mOrientation == BaseGridView.HORIZONTAL) {
-            if (mGridView.getLayoutDirection() == ViewGroup.LAYOUT_DIRECTION_RTL) {
-                key = KeyEvent.KEYCODE_DPAD_LEFT;
-            } else {
-                key = KeyEvent.KEYCODE_DPAD_RIGHT;
-            }
-        } else {
-            key = KeyEvent.KEYCODE_DPAD_DOWN;
-        }
-        scroll(key, verify);
-    }
-
-    /**
-     * Group and sort children by their position on each row (HORIZONTAL) or column(VERTICAL).
-     */
-    protected View[][] sortByRows() {
-        final HashMap<Integer, ArrayList<View>> rows = new HashMap<Integer, ArrayList<View>>();
-        ArrayList<Integer> rowLocations = new ArrayList();
-        for (int i = 0; i < mGridView.getChildCount(); i++) {
-            View v = mGridView.getChildAt(i);
-            int rowLocation;
-            if (mOrientation == BaseGridView.HORIZONTAL) {
-                rowLocation = v.getTop();
-            } else {
-                rowLocation = mGridView.getLayoutDirection() == ViewGroup.LAYOUT_DIRECTION_RTL ?
-                    v.getRight() : v.getLeft();
-            }
-            ArrayList<View> views = rows.get(rowLocation);
-            if (views == null) {
-                views = new ArrayList<View>();
-                rows.put(rowLocation, views);
-                rowLocations.add(rowLocation);
-            }
-            views.add(v);
-        }
-        Object[] sortedLocations = rowLocations.toArray();
-        Arrays.sort(sortedLocations);
-        if (mNumRows != rows.size()) {
-            assertEquals("Dump Views by rows "+rows, mNumRows, rows.size());
-        }
-        View[][] sorted = new View[rows.size()][];
-        for (int i = 0; i < rowLocations.size(); i++) {
-            Integer rowLocation = rowLocations.get(i);
-            ArrayList<View> arr = rows.get(rowLocation);
-            View[] views = arr.toArray(new View[arr.size()]);
-            Arrays.sort(views, mRowSortComparator);
-            sorted[i] = views;
-        }
-        return sorted;
-    }
-
-    protected void verifyMargin() {
-        View[][] sorted = sortByRows();
-        for (int row = 0; row < sorted.length; row++) {
-            View[] views = sorted[row];
-            int margin = -1;
-            for (int i = 1; i < views.length; i++) {
-                if (mOrientation == BaseGridView.HORIZONTAL) {
-                    assertEquals(mGridView.getHorizontalMargin(),
-                            views[i].getLeft() - views[i - 1].getRight());
-                } else {
-                    assertEquals(mGridView.getVerticalMargin(),
-                            views[i].getTop() - views[i - 1].getBottom());
-                }
-            }
-        }
-    }
-
-    protected void verifyBeginAligned() {
-        View[][] sorted = sortByRows();
-        int alignedLocation = 0;
-        if (mOrientation == BaseGridView.HORIZONTAL) {
-            if (mGridView.getLayoutDirection() == ViewGroup.LAYOUT_DIRECTION_RTL) {
-                for (int i = 0; i < sorted.length; i++) {
-                    if (i == 0) {
-                        alignedLocation = sorted[i][sorted[i].length - 1].getRight();
-                    } else {
-                        assertEquals(alignedLocation, sorted[i][sorted[i].length - 1].getRight());
-                    }
-                }
-            } else {
-                for (int i = 0; i < sorted.length; i++) {
-                    if (i == 0) {
-                        alignedLocation = sorted[i][0].getLeft();
-                    } else {
-                        assertEquals(alignedLocation, sorted[i][0].getLeft());
-                    }
-                }
-            }
-        } else {
-            for (int i = 0; i < sorted.length; i++) {
-                if (i == 0) {
-                    alignedLocation = sorted[i][0].getTop();
-                } else {
-                    assertEquals(alignedLocation, sorted[i][0].getTop());
-                }
-            }
-        }
-    }
-
-    protected int[] getEndEdges() {
-        View[][] sorted = sortByRows();
-        int[] edges = new int[sorted.length];
-        if (mOrientation == BaseGridView.HORIZONTAL) {
-            if (mGridView.getLayoutDirection() == ViewGroup.LAYOUT_DIRECTION_RTL) {
-                for (int i = 0; i < sorted.length; i++) {
-                    edges[i] = sorted[i][0].getLeft();
-                }
-            } else {
-                for (int i = 0; i < sorted.length; i++) {
-                    edges[i] = sorted[i][sorted[i].length - 1].getRight();
-                }
-            }
-        } else {
-            for (int i = 0; i < sorted.length; i++) {
-                edges[i] = sorted[i][sorted[i].length - 1].getBottom();
-            }
-        }
-        return edges;
-    }
-
-    protected void verifyEdgesSame(int[] edges, int[] edges2) {
-        assertEquals(edges.length, edges2.length);
-        for (int i = 0; i < edges.length; i++) {
-            assertEquals(edges[i], edges2[i]);
-        }
-    }
-
-    protected void verifyBoundCount(int count) {
-        if (mActivity.getBoundCount() != count) {
-            StringBuffer b = new StringBuffer();
-            b.append("ItemsLength: ");
-            for (int i = 0; i < mActivity.mItemLengths.length; i++) {
-                b.append(mActivity.mItemLengths[i]).append(",");
-            }
-            assertEquals("Bound count does not match, ItemsLengths: "+ b,
-                    count, mActivity.getBoundCount());
-        }
-    }
-
-    private static int getCenterY(View v) {
-        return (v.getTop() + v.getBottom())/2;
-    }
-
-    private static int getCenterX(View v) {
-        return (v.getLeft() + v.getRight())/2;
-    }
-
-    private void initActivity(Intent intent) {
-        setActivityIntent(intent);
-        mActivity = getActivity();
-        final String testName = getName();
-        try {
-            runTestOnUiThread(new Runnable() {
-                public void run() {
-                    mActivity.setTitle(testName);
-                }
-            });
-            Thread.sleep(1000);
-        } catch (Throwable t) {
-            t.printStackTrace();
-        }
-        mGridView = mActivity.mGridView;
-    }
-
-    public void testThreeRowHorizontalBasic() throws Throwable {
-        mInstrumentation = getInstrumentation();
-        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
-        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID, R.layout.horizontal_grid);
-        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 100);
-        initActivity(intent);
-        mOrientation = BaseGridView.HORIZONTAL;
-        mNumRows = 3;
-
-        scrollToEnd(mVerifyLayout);
-        verifyBoundCount(100);
-
-        scrollToBegin(mVerifyLayout);
-
-        verifyBeginAligned();
-    }
-
-    static class DividerDecoration extends RecyclerView.ItemDecoration {
-
-        private ColorDrawable mTopDivider;
-        private ColorDrawable mBottomDivider;
-        private int mLeftOffset;
-        private int mRightOffset;
-        private int mTopOffset;
-        private int mBottomOffset;
-
-        DividerDecoration(int leftOffset, int topOffset, int rightOffset, int bottomOffset) {
-            mLeftOffset = leftOffset;
-            mTopOffset = topOffset;
-            mRightOffset = rightOffset;
-            mBottomOffset = bottomOffset;
-        }
-
-        @Override
-        public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
-            if (mTopDivider == null) {
-                mTopDivider = new ColorDrawable(Color.RED);
-            }
-            if (mBottomDivider == null) {
-                mBottomDivider = new ColorDrawable(Color.BLUE);
-            }
-            final int childCount = parent.getChildCount();
-            final int width = parent.getWidth();
-            for (int childViewIndex = 0; childViewIndex < childCount; childViewIndex++) {
-                final View view = parent.getChildAt(childViewIndex);
-                mTopDivider.setBounds(0, (int) view.getY() - mTopOffset, width, (int) view.getY());
-                mTopDivider.draw(c);
-                mBottomDivider.setBounds(0, (int) view.getY() + view.getHeight(), width,
-                        (int) view.getY() + view.getHeight() + mBottomOffset);
-                mBottomDivider.draw(c);
-            }
-        }
-
-        @Override
-        public void getItemOffsets(Rect outRect, View view, RecyclerView parent,
-                                   RecyclerView.State state) {
-            outRect.left = mLeftOffset;
-            outRect.top = mTopOffset;
-            outRect.right = mRightOffset;
-            outRect.bottom = mBottomOffset;
-        }
-    }
-
-    public void testItemDecorationAndMargins() throws Throwable {
-
-        final int leftMargin = 3;
-        final int topMargin = 4;
-        final int rightMargin = 7;
-        final int bottomMargin = 8;
-        final int itemHeight = 100;
-
-        mInstrumentation = getInstrumentation();
-        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
-        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID, R.layout.vertical_linear);
-        intent.putExtra(GridActivity.EXTRA_ITEMS, new int[]{itemHeight, itemHeight, itemHeight});
-        intent.putExtra(GridActivity.EXTRA_LAYOUT_MARGINS,
-                new int[]{leftMargin, topMargin, rightMargin, bottomMargin});
-        initActivity(intent);
-        mOrientation = BaseGridView.VERTICAL;
-        mNumRows = 1;
-
-        final int paddingLeft = mGridView.getPaddingLeft();
-        final int paddingTop = mGridView.getPaddingTop();
-        final int verticalSpace = mGridView.getVerticalMargin();
-        final int decorationLeft = 17;
-        final int decorationTop = 1;
-        final int decorationRight = 19;
-        final int decorationBottom = 2;
-
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mGridView.addItemDecoration(new DividerDecoration(decorationLeft, decorationTop,
-                        decorationRight, decorationBottom));
-            }
-        });
-        waitForScrollIdle();
-
-        View child0 = mGridView.getChildAt(0);
-        View child1 = mGridView.getChildAt(1);
-        View child2 = mGridView.getChildAt(2);
-
-        assertEquals(itemHeight, child0.getBottom() - child0.getTop());
-
-        // verify left margins
-        assertEquals(paddingLeft + leftMargin + decorationLeft, child0.getLeft());
-        assertEquals(paddingLeft + leftMargin + decorationLeft, child1.getLeft());
-        assertEquals(paddingLeft + leftMargin + decorationLeft, child2.getLeft());
-        // verify top bottom margins and decoration offset
-        assertEquals(paddingTop + topMargin + decorationTop, child0.getTop());
-        assertEquals(bottomMargin + decorationBottom + verticalSpace + decorationTop + topMargin,
-                child1.getTop() - child0.getBottom());
-        assertEquals(bottomMargin + decorationBottom + verticalSpace + decorationTop + topMargin,
-                child2.getTop() - child1.getBottom());
-
-    }
-
-    public void testItemDecorationAndMarginsAndOpticalBounds() throws Throwable {
-        final int leftMargin = 3;
-        final int topMargin = 4;
-        final int rightMargin = 7;
-        final int bottomMargin = 8;
-        final int itemHeight = 100;
-        final int ninePatchDrawableResourceId = R.drawable.lb_card_shadow_focused;
-
-        mInstrumentation = getInstrumentation();
-        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
-        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID, R.layout.vertical_linear);
-        intent.putExtra(GridActivity.EXTRA_ITEMS, new int[]{itemHeight, itemHeight, itemHeight});
-        intent.putExtra(GridActivity.EXTRA_CHILD_LAYOUT_ID, R.layout.relative_layout);
-        intent.putExtra(GridActivity.EXTRA_LAYOUT_MARGINS,
-                new int[]{leftMargin, topMargin, rightMargin, bottomMargin});
-        intent.putExtra(GridActivity.EXTRA_NINEPATCH_SHADOW, ninePatchDrawableResourceId);
-        initActivity(intent);
-        mOrientation = BaseGridView.VERTICAL;
-        mNumRows = 1;
-
-        final int paddingLeft = mGridView.getPaddingLeft();
-        final int paddingTop = mGridView.getPaddingTop();
-        final int verticalSpace = mGridView.getVerticalMargin();
-        final int decorationLeft = 17;
-        final int decorationTop = 1;
-        final int decorationRight = 19;
-        final int decorationBottom = 2;
-
-        final Rect opticalPaddings = new Rect();
-        mGridView.getContext().getDrawable(ninePatchDrawableResourceId).getPadding(opticalPaddings);
-        final int opticalInsetsLeft = opticalPaddings.left;
-        final int opticalInsetsTop = opticalPaddings.top;
-        final int opticalInsetsRight = opticalPaddings.right;
-        final int opticalInsetsBottom = opticalPaddings.bottom;
-        assertTrue(opticalInsetsLeft > 0);
-        assertTrue(opticalInsetsTop > 0);
-        assertTrue(opticalInsetsRight > 0);
-        assertTrue(opticalInsetsBottom > 0);
-
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mGridView.addItemDecoration(new DividerDecoration(decorationLeft, decorationTop,
-                        decorationRight, decorationBottom));
-            }
-        });
-        waitForScrollIdle();
-
-        View child0 = mGridView.getChildAt(0);
-        View child1 = mGridView.getChildAt(1);
-        View child2 = mGridView.getChildAt(2);
-
-        assertEquals(itemHeight + opticalInsetsTop + opticalInsetsBottom,
-                child0.getBottom() - child0.getTop());
-
-        // verify left margins decoration and optical insets
-        assertEquals(paddingLeft + leftMargin + decorationLeft - opticalInsetsLeft,
-                child0.getLeft());
-        assertEquals(paddingLeft + leftMargin + decorationLeft - opticalInsetsLeft,
-                child1.getLeft());
-        assertEquals(paddingLeft + leftMargin + decorationLeft - opticalInsetsLeft,
-                child2.getLeft());
-        // verify top bottom margins decoration offset and optical insets
-        assertEquals(paddingTop + topMargin + decorationTop, child0.getTop() + opticalInsetsTop);
-        assertEquals(bottomMargin + decorationBottom + verticalSpace + decorationTop + topMargin,
-                (child1.getTop() + opticalInsetsTop) - (child0.getBottom() - opticalInsetsBottom));
-        assertEquals(bottomMargin + decorationBottom + verticalSpace + decorationTop + topMargin,
-                (child2.getTop() + opticalInsetsTop) - (child1.getBottom() - opticalInsetsBottom));
-
-    }
-
-    public void testThreeColumnVerticalBasic() throws Throwable {
-
-        mInstrumentation = getInstrumentation();
-        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
-        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID, R.layout.vertical_grid);
-        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 200);
-        initActivity(intent);
-        mOrientation = BaseGridView.VERTICAL;
-        mNumRows = 3;
-
-        scrollToEnd(mVerifyLayout);
-        verifyBoundCount(200);
-
-        scrollToBegin(mVerifyLayout);
-
-        verifyBeginAligned();
-    }
-
-    public void testRedundantAppendRemove() throws Throwable {
-        mInstrumentation = getInstrumentation();
-        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
-        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
-                R.layout.vertical_grid_testredundantappendremove);
-        intent.putExtra(GridActivity.EXTRA_ITEMS, new int[]{
-                149,177,128,234,227,187,163,223,146,210,228,148,227,193,182,197,177,142,225,207,
-                157,171,209,204,187,184,123,221,197,153,202,179,193,214,226,173,225,143,188,159,
-                139,193,233,143,227,203,222,124,228,223,164,131,228,126,211,160,165,152,235,184,
-                155,224,149,181,171,229,200,234,177,130,164,172,188,139,132,203,179,220,147,131,
-                226,127,230,239,183,203,206,227,123,170,239,234,200,149,237,204,160,133,202,234,
-                173,122,139,149,151,153,216,231,121,145,227,153,186,174,223,180,123,215,206,216,
-                239,222,219,207,193,218,140,133,171,153,183,132,233,138,159,174,189,171,143,128,
-                152,222,141,202,224,190,134,120,181,231,230,136,132,224,136,210,207,150,128,183,
-                221,194,179,220,126,221,137,205,223,193,172,132,226,209,133,191,227,127,159,171,
-                180,149,237,177,194,207,170,202,161,144,147,199,205,186,164,140,193,203,224,129});
-        initActivity(intent);
-        mOrientation = BaseGridView.VERTICAL;
-        mNumRows = 3;
-
-        scrollToEnd(mVerifyLayout);
-
-        verifyBoundCount(200);
-
-        scrollToBegin(mVerifyLayout);
-
-        verifyBeginAligned();
-    }
-
-    public void testRedundantAppendRemove2() throws Throwable {
-        mInstrumentation = getInstrumentation();
-        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
-        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
-                R.layout.horizontal_grid_testredundantappendremove2);
-        intent.putExtra(GridActivity.EXTRA_ITEMS, new int[]{
-                318,333,199,224,246,273,269,289,340,313,265,306,349,269,185,282,257,354,316,252,
-                237,290,283,343,196,313,290,343,191,262,342,228,343,349,251,203,226,305,265,213,
-                216,333,295,188,187,281,288,311,244,232,224,332,290,181,267,276,226,261,335,355,
-                225,217,219,183,234,285,257,304,182,250,244,223,257,219,342,185,347,205,302,315,
-                299,309,292,237,192,309,228,250,347,227,337,298,299,185,185,331,223,284,265,351});
-        initActivity(intent);
-        mOrientation = BaseGridView.HORIZONTAL;
-        mNumRows = 3;
-        mLayoutManager = (GridLayoutManager) mGridView.getLayoutManager();
-
-        // test append without staggered result cache
-        scrollToEnd(mVerifyLayout);
-
-        verifyBoundCount(100);
-        int[] endEdges = getEndEdges();
-
-        scrollToBegin(mVerifyLayout);
-
-        verifyBeginAligned();
-
-        // now test append with staggered result cache
-        changeArraySize(3);
-        assertEquals("Staggerd cache should be kept as is when no item size change",
-                100, ((StaggeredGrid) mLayoutManager.mGrid).mLocations.size());
-
-        mActivity.resetBoundCount();
-        changeArraySize(100);
-
-        scrollToEnd(mVerifyLayout);
-        verifyBoundCount(100);
-
-        // we should get same aligned end edges
-        int[] endEdges2 = getEndEdges();
-        verifyEdgesSame(endEdges, endEdges2);
-    }
-
-    public void testItemMovedHorizontal() throws Throwable {
-
-        mInstrumentation = getInstrumentation();
-        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
-        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
-                R.layout.horizontal_grid);
-        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 200);
-        initActivity(intent);
-        mOrientation = BaseGridView.HORIZONTAL;
-        mNumRows = 3;
-
-        mGridView.setSelectedPositionSmooth(150);
-        waitForScrollIdle(mVerifyLayout);
-        mActivity.swap(150, 152);
-        waitForTransientStateGone(null);
-
-        runTestOnUiThread(mVerifyLayout);
-
-        scrollToBegin(mVerifyLayout);
-
-        verifyBeginAligned();
-    }
-
-    public void testItemMovedVertical() throws Throwable {
-
-        mInstrumentation = getInstrumentation();
-        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
-        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
-                R.layout.vertical_grid);
-        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 200);
-        initActivity(intent);
-        mOrientation = BaseGridView.VERTICAL;
-        mNumRows = 3;
-
-        mGridView.setSelectedPositionSmooth(150);
-        waitForScrollIdle(mVerifyLayout);
-        mActivity.swap(150, 152);
-        waitForTransientStateGone(null);
-
-        runTestOnUiThread(mVerifyLayout);
-
-        scrollToEnd(mVerifyLayout);
-        scrollToBegin(mVerifyLayout);
-
-        verifyBeginAligned();
-    }
-
-    public void testItemAddRemoveHorizontal() throws Throwable {
-
-        mInstrumentation = getInstrumentation();
-        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
-        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
-                R.layout.horizontal_grid);
-        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 200);
-        initActivity(intent);
-        mOrientation = BaseGridView.HORIZONTAL;
-        mNumRows = 3;
-
-        scrollToEnd(mVerifyLayout);
-        int[] endEdges = getEndEdges();
-
-        mGridView.setSelectedPositionSmooth(150);
-        waitForScrollIdle(mVerifyLayout);
-        int[] removedItems = mActivity.removeItems(151, 4);
-        waitForTransientStateGone(null);
-
-        scrollToEnd(mVerifyLayout);
-        mGridView.setSelectedPositionSmooth(150);
-        waitForScrollIdle(mVerifyLayout);
-
-        mActivity.addItems(151, removedItems);
-        waitForTransientStateGone(null);
-        scrollToEnd(mVerifyLayout);
-
-        // we should get same aligned end edges
-        int[] endEdges2 = getEndEdges();
-        verifyEdgesSame(endEdges, endEdges2);
-
-        scrollToBegin(mVerifyLayout);
-        verifyBeginAligned();
-    }
-
-    public void testSetSelectedPositionDetached() throws Throwable {
-
-        mInstrumentation = getInstrumentation();
-        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
-        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
-                R.layout.horizontal_linear);
-        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 50);
-        initActivity(intent);
-        mOrientation = BaseGridView.HORIZONTAL;
-        mNumRows = 1;
-
-        final int focusToIndex = 49;
-        final ViewGroup parent = (ViewGroup) mGridView.getParent();
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                parent.removeView(mGridView);
-            }
-        });
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mGridView.setSelectedPositionSmooth(focusToIndex);
-            }
-        });
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                parent.addView(mGridView);
-                mGridView.requestFocus();
-            }
-        });
-        waitForTransientStateGone(null);
-        waitForScrollIdle();
-        assertEquals(mGridView.getSelectedPosition(), focusToIndex);
-        assertTrue(mGridView.getLayoutManager().findViewByPosition(focusToIndex).hasFocus());
-
-        final int focusToIndex2 = 0;
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                parent.removeView(mGridView);
-            }
-        });
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mGridView.setSelectedPosition(focusToIndex2);
-            }
-        });
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                parent.addView(mGridView);
-                mGridView.requestFocus();
-            }
-        });
-        assertEquals(mGridView.getSelectedPosition(), focusToIndex2);
-        waitForTransientStateGone(null);
-        waitForScrollIdle();
-        assertTrue(mGridView.getLayoutManager().findViewByPosition(focusToIndex2).hasFocus());
-    }
-
-    public void testBug22209986() throws Throwable {
-
-        mInstrumentation = getInstrumentation();
-        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
-        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
-                R.layout.horizontal_linear);
-        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 50);
-        initActivity(intent);
-        mOrientation = BaseGridView.HORIZONTAL;
-        mNumRows = 1;
-
-        final int focusToIndex = mGridView.getChildCount() - 1;
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mGridView.setSelectedPositionSmooth(focusToIndex);
-            }
-        });
-
-        waitForTransientStateGone(null);
-        waitForScrollIdle();
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mGridView.setSelectedPositionSmooth(focusToIndex + 1);
-            }
-        });
-        // let the scroll running for a while and requestLayout during scroll
-        Thread.sleep(80);
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                assertEquals(mGridView.getScrollState(), BaseGridView.SCROLL_STATE_SETTLING);
-                mGridView.requestLayout();
-            }
-        });
-        waitForTransientStateGone(null);
-        waitForScrollIdle();
-
-        int leftEdge = mGridView.getLayoutManager().findViewByPosition(focusToIndex).getLeft();
-
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mGridView.requestLayout();
-            }
-        });
-        waitForTransientStateGone(null);
-        waitForScrollIdle();
-        assertEquals(leftEdge,
-                mGridView.getLayoutManager().findViewByPosition(focusToIndex).getLeft());
-    }
-
-    public void testScrollAndRemove() throws Throwable {
-
-        mInstrumentation = getInstrumentation();
-        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
-        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
-                R.layout.horizontal_linear);
-        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 50);
-        initActivity(intent);
-        mOrientation = BaseGridView.HORIZONTAL;
-        mNumRows = 1;
-
-        final int focusToIndex = mGridView.getChildCount() - 1;
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mGridView.setSelectedPositionSmooth(focusToIndex);
-            }
-        });
-
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mActivity.removeItems(focusToIndex, 1);
-            }
-        });
-
-        waitForTransientStateGone(null);
-        waitForScrollIdle();
-        int leftEdge = mGridView.getLayoutManager().findViewByPosition(focusToIndex).getLeft();
-
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mGridView.requestLayout();
-            }
-        });
-        waitForTransientStateGone(null);
-        waitForScrollIdle();
-        assertEquals(leftEdge,
-                mGridView.getLayoutManager().findViewByPosition(focusToIndex).getLeft());
-    }
-
-    public void testScrollAndInsert() throws Throwable {
-
-        mInstrumentation = getInstrumentation();
-        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
-        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
-                R.layout.vertical_grid);
-        int[] items = new int[1000];
-        for (int i = 0; i < items.length; i++) {
-            items[i] = 300 + (int)(Math.random() * 100);
-        }
-        intent.putExtra(GridActivity.EXTRA_ITEMS, items);
-        intent.putExtra(GridActivity.EXTRA_STAGGERED, true);
-        mOrientation = BaseGridView.VERTICAL;
-        mNumRows = 3;
-
-        initActivity(intent);
-
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mGridView.setSelectedPositionSmooth(150);
-            }
-        });
-        waitForScrollIdle(mVerifyLayout);
-
-        View view =  mGridView.getChildAt(mGridView.getChildCount() - 1);
-        final int focusToIndex = mGridView.getChildAdapterPosition(view);
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mGridView.setSelectedPositionSmooth(focusToIndex);
-            }
-        });
-
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                int[] newItems = new int[]{300, 300, 300};
-                mActivity.addItems(0, newItems);
-            }
-        });
-
-        waitForTransientStateGone(null);
-        waitForScrollIdle();
-    }
-
-    public void testScrollAndInsertBeforeVisibleItem() throws Throwable {
-
-        mInstrumentation = getInstrumentation();
-        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
-        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
-                R.layout.vertical_grid);
-        int[] items = new int[1000];
-        for (int i = 0; i < items.length; i++) {
-            items[i] = 300 + (int)(Math.random() * 100);
-        }
-        intent.putExtra(GridActivity.EXTRA_ITEMS, items);
-        intent.putExtra(GridActivity.EXTRA_STAGGERED, true);
-        mOrientation = BaseGridView.VERTICAL;
-        mNumRows = 3;
-
-        initActivity(intent);
-
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mGridView.setSelectedPositionSmooth(150);
-            }
-        });
-        waitForScrollIdle(mVerifyLayout);
-
-        View view =  mGridView.getChildAt(mGridView.getChildCount() - 1);
-        final int focusToIndex = mGridView.getChildAdapterPosition(view);
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mGridView.setSelectedPositionSmooth(focusToIndex);
-            }
-        });
-
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                int[] newItems = new int[]{300, 300, 300};
-                mActivity.addItems(focusToIndex, newItems);
-            }
-        });
-
-        waitForTransientStateGone(null);
-        waitForScrollIdle();
-    }
-
-    public void testSmoothScrollAndRemove() throws Throwable {
-
-        mInstrumentation = getInstrumentation();
-        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
-        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
-                R.layout.horizontal_linear);
-        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 50);
-        initActivity(intent);
-        mOrientation = BaseGridView.HORIZONTAL;
-        mNumRows = 1;
-
-        final int focusToIndex = 40;
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mGridView.setSelectedPositionSmooth(focusToIndex);
-            }
-        });
-
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mActivity.removeItems(focusToIndex, 1);
-            }
-        });
-
-        Thread.sleep(20); // wait for layout
-        assertTrue("removing the index of not attached child should not affect smooth scroller",
-                mGridView.getLayoutManager().isSmoothScrolling());
-        waitForTransientStateGone(null);
-        waitForScrollIdle();
-        int leftEdge = mGridView.getLayoutManager().findViewByPosition(focusToIndex).getLeft();
-
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mGridView.requestLayout();
-            }
-        });
-        waitForTransientStateGone(null);
-        waitForScrollIdle();
-        assertEquals(leftEdge,
-                mGridView.getLayoutManager().findViewByPosition(focusToIndex).getLeft());
-    }
-
-    public void testSmoothScrollAndRemove2() throws Throwable {
-
-        mInstrumentation = getInstrumentation();
-        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
-        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
-                R.layout.horizontal_linear);
-        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 50);
-        initActivity(intent);
-        mOrientation = BaseGridView.HORIZONTAL;
-        mNumRows = 1;
-
-        final int focusToIndex = 40;
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mGridView.setSelectedPositionSmooth(focusToIndex);
-            }
-        });
-
-        final int removeIndex = mGridView.getChildCount() - 1;
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mActivity.removeItems(removeIndex, 1);
-            }
-        });
-
-        Thread.sleep(20); // wait for layout
-        assertFalse("removing the index of attached child should kill smooth scroller",
-                mGridView.getLayoutManager().isSmoothScrolling());
-        waitForTransientStateGone(null);
-        waitForScrollIdle();
-        int leftEdge = mGridView.getLayoutManager().findViewByPosition(focusToIndex).getLeft();
-
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mGridView.requestLayout();
-            }
-        });
-        waitForTransientStateGone(null);
-        waitForScrollIdle();
-        assertEquals(leftEdge,
-                mGridView.getLayoutManager().findViewByPosition(focusToIndex).getLeft());
-    }
-
-    public void testPendingSmoothScrollAndRemove() throws Throwable {
-        mInstrumentation = getInstrumentation();
-        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
-        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
-                R.layout.vertical_linear);
-        intent.putExtra(GridActivity.EXTRA_REQUEST_FOCUS_ONLAYOUT, true);
-        int[] items = new int[100];
-        for (int i = 0; i < items.length; i++) {
-            items[i] = 630 + (int)(Math.random() * 100);
-        }
-        intent.putExtra(GridActivity.EXTRA_ITEMS, items);
-        intent.putExtra(GridActivity.EXTRA_STAGGERED, true);
-        mOrientation = BaseGridView.VERTICAL;
-        mNumRows = 1;
-
-        initActivity(intent);
-
-        mGridView.setSelectedPositionSmooth(0);
-        waitForScrollIdle(mVerifyLayout);
-        assertTrue(mGridView.getChildAt(0).hasFocus());
-
-        // Pressing lots of key to make sure smooth scroller is running
-        for (int i = 0; i < 20; i++) {
-            sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);
-        }
-        Thread.sleep(100);
-
-        assertTrue(mGridView.getLayoutManager().isSmoothScrolling());
-        final int removeIndex = mGridView.getChildCount() - 1;
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mActivity.removeItems(removeIndex, 1);
-            }
-        });
-
-        Thread.sleep(20); // wait for layout
-        assertFalse("removing the index of attached child should kill smooth scroller",
-                mGridView.getLayoutManager().isSmoothScrolling());
-
-        waitForTransientStateGone(null);
-        waitForScrollIdle();
-        int focusIndex = mGridView.getSelectedPosition();
-        int leftEdge = mGridView.getLayoutManager().findViewByPosition(focusIndex).getLeft();
-
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mGridView.requestLayout();
-            }
-        });
-        waitForTransientStateGone(null);
-        waitForScrollIdle();
-        assertEquals(leftEdge,
-                mGridView.getLayoutManager().findViewByPosition(focusIndex).getLeft());
-    }
-
-    public void testFocusToFirstItem() throws Throwable {
-
-        mInstrumentation = getInstrumentation();
-        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
-        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
-                R.layout.horizontal_grid);
-        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 200);
-        initActivity(intent);
-        mOrientation = BaseGridView.HORIZONTAL;
-        mNumRows = 3;
-
-        int[] removedItems = mActivity.removeItems(0, 200);
-
-        waitForTransientStateGone(null);
-        humanDelay(500);
-        mActivity.addItems(0, removedItems);
-
-        waitForTransientStateGone(null);
-        humanDelay(500);
-        assertTrue(mGridView.getLayoutManager().findViewByPosition(0).hasFocus());
-
-        changeArraySize(0);
-
-        changeArraySize(200);
-        assertTrue(mGridView.getLayoutManager().findViewByPosition(0).hasFocus());
-    }
-
-    public void testNonFocusableHorizontal() throws Throwable {
-        final int numItems = 200;
-        final int startPos = 45;
-        final int skips = 20;
-        final int numColumns = 3;
-        final int endPos = startPos + numColumns * (skips + 1);
-
-        mInstrumentation = getInstrumentation();
-        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
-        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
-                R.layout.horizontal_grid);
-        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, numItems);
-        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
-        mOrientation = BaseGridView.HORIZONTAL;
-        mNumRows = numColumns;
-        boolean[] focusable = new boolean[numItems];
-        for (int i = 0; i < focusable.length; i++) {
-            focusable[i] = true;
-        }
-        for (int i = startPos + mNumRows, j = 0; j < skips; i += mNumRows, j++) {
-            focusable[i] = false;
-        }
-        intent.putExtra(GridActivity.EXTRA_ITEMS_FOCUSABLE, focusable);
-        initActivity(intent);
-
-        mGridView.setSelectedPositionSmooth(startPos);
-        waitForScrollIdle(mVerifyLayout);
-
-        if (mGridView.getLayoutDirection() == ViewGroup.LAYOUT_DIRECTION_RTL) {
-            sendKeys(KeyEvent.KEYCODE_DPAD_LEFT);
-        } else {
-            sendKeys(KeyEvent.KEYCODE_DPAD_RIGHT);
-        }
-        waitForScrollIdle(mVerifyLayout);
-        assertEquals(endPos, mGridView.getSelectedPosition());
-
-        if (mGridView.getLayoutDirection() == ViewGroup.LAYOUT_DIRECTION_RTL) {
-            sendKeys(KeyEvent.KEYCODE_DPAD_RIGHT);
-        } else {
-            sendKeys(KeyEvent.KEYCODE_DPAD_LEFT);
-        }
-        waitForScrollIdle(mVerifyLayout);
-        assertEquals(startPos, mGridView.getSelectedPosition());
-
-    }
-
-    public void testNoInitialFocusable() throws Throwable {
-
-        mInstrumentation = getInstrumentation();
-        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
-        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
-                R.layout.horizontal_linear);
-        final int numItems = 100;
-        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, numItems);
-        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
-        mOrientation = BaseGridView.HORIZONTAL;
-        mNumRows = 1;
-        boolean[] focusable = new boolean[numItems];
-        final int firstFocusableIndex = 10;
-        for (int i = 0; i < firstFocusableIndex; i++) {
-            focusable[i] = false;
-        }
-        for (int i = firstFocusableIndex; i < focusable.length; i++) {
-            focusable[i] = true;
-        }
-        intent.putExtra(GridActivity.EXTRA_ITEMS_FOCUSABLE, focusable);
-        initActivity(intent);
-        assertTrue(mGridView.isFocused());
-
-        if (mGridView.getLayoutDirection() == ViewGroup.LAYOUT_DIRECTION_RTL) {
-            sendKeys(KeyEvent.KEYCODE_DPAD_LEFT);
-        } else {
-            sendKeys(KeyEvent.KEYCODE_DPAD_RIGHT);
-        }
-        waitForScrollIdle(mVerifyLayout);
-        assertEquals(firstFocusableIndex, mGridView.getSelectedPosition());
-        assertTrue(mGridView.getLayoutManager().findViewByPosition(firstFocusableIndex).hasFocus());
-    }
-
-    public void testFocusOutOfEmptyListView() throws Throwable {
-
-        mInstrumentation = getInstrumentation();
-        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
-        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
-                R.layout.horizontal_linear);
-        final int numItems = 100;
-        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, numItems);
-        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
-        mOrientation = BaseGridView.HORIZONTAL;
-        mNumRows = 1;
-        initActivity(intent);
-
-        final View horizontalGridView = new HorizontalGridViewEx(mGridView.getContext());
-        runTestOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                horizontalGridView.setFocusable(true);
-                horizontalGridView.setFocusableInTouchMode(true);
-                horizontalGridView.setLayoutParams(new ViewGroup.LayoutParams(100, 100));
-                ((ViewGroup) mGridView.getParent()).addView(horizontalGridView, 0);
-                horizontalGridView.requestFocus();
-            }
-        });
-
-        assertTrue(horizontalGridView.isFocused());
-
-        sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);
-
-        assertTrue(mGridView.hasFocus());
-    }
-
-    public void testTransferFocusToChildWhenGainFocus() throws Throwable {
-
-        mInstrumentation = getInstrumentation();
-        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
-        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
-                R.layout.horizontal_linear);
-        final int numItems = 100;
-        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, numItems);
-        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
-        mOrientation = BaseGridView.HORIZONTAL;
-        mNumRows = 1;
-        boolean[] focusable = new boolean[numItems];
-        final int firstFocusableIndex = 1;
-        for (int i = 0; i < firstFocusableIndex; i++) {
-            focusable[i] = false;
-        }
-        for (int i = firstFocusableIndex; i < focusable.length; i++) {
-            focusable[i] = true;
-        }
-        intent.putExtra(GridActivity.EXTRA_ITEMS_FOCUSABLE, focusable);
-        initActivity(intent);
-
-        assertEquals(firstFocusableIndex, mGridView.getSelectedPosition());
-        assertTrue(mGridView.getLayoutManager().findViewByPosition(firstFocusableIndex).hasFocus());
-    }
-
-    public void testFocusFromSecondChild() throws Throwable {
-
-        mInstrumentation = getInstrumentation();
-        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
-        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
-                R.layout.horizontal_linear);
-        final int numItems = 100;
-        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, numItems);
-        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
-        mOrientation = BaseGridView.HORIZONTAL;
-        mNumRows = 1;
-        boolean[] focusable = new boolean[numItems];
-        for (int i = 0; i < focusable.length; i++) {
-            focusable[i] = false;
-        }
-        intent.putExtra(GridActivity.EXTRA_ITEMS_FOCUSABLE, focusable);
-        initActivity(intent);
-
-        // switching Adapter to cause a full rebind,  test if it will focus to second item.
-        runTestOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                mActivity.mNumItems = numItems;
-                mActivity.mItemFocusables[1] = true;
-                mActivity.rebindToNewAdapter();
-            }
-        });
-    }
-
-    public void testNonFocusableVertical() throws Throwable {
-        final int numItems = 200;
-        final int startPos = 44;
-        final int skips = 20;
-        final int numColumns = 3;
-        final int endPos = startPos + numColumns * (skips + 1);
-
-        mInstrumentation = getInstrumentation();
-        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
-        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
-                R.layout.vertical_grid);
-        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, numItems);
-        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
-        mOrientation = BaseGridView.VERTICAL;
-        mNumRows = numColumns;
-        boolean[] focusable = new boolean[numItems];
-        for (int i = 0; i < focusable.length; i++) {
-            focusable[i] = true;
-        }
-        for (int i = startPos + mNumRows, j = 0; j < skips; i += mNumRows, j++) {
-            focusable[i] = false;
-        }
-        intent.putExtra(GridActivity.EXTRA_ITEMS_FOCUSABLE, focusable);
-        initActivity(intent);
-
-        mGridView.setSelectedPositionSmooth(startPos);
-        waitForScrollIdle(mVerifyLayout);
-
-        sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);
-        waitForScrollIdle(mVerifyLayout);
-        assertEquals(endPos, mGridView.getSelectedPosition());
-
-        sendKeys(KeyEvent.KEYCODE_DPAD_UP);
-        waitForScrollIdle(mVerifyLayout);
-        assertEquals(startPos, mGridView.getSelectedPosition());
-
-    }
-
-    public void testLtrFocusOutStartDisabled() throws Throwable {
-        final int numItems = 200;
-
-        mInstrumentation = getInstrumentation();
-        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
-        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID, R.layout.vertical_grid_ltr);
-        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, numItems);
-        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
-        mOrientation = BaseGridView.VERTICAL;
-        mNumRows = 1;
-        initActivity(intent);
-
-        runTestOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                mGridView.requestFocus();
-                mGridView.setSelectedPositionSmooth(0);
-            }
-        });
-        waitForScrollIdle(mVerifyLayout);
-
-        sendKeys(KeyEvent.KEYCODE_DPAD_LEFT);
-        waitForScrollIdle(mVerifyLayout);
-        assertTrue(mGridView.hasFocus());
-    }
-
-    public void testRtlFocusOutStartDisabled() throws Throwable {
-        final int numItems = 200;
-
-        mInstrumentation = getInstrumentation();
-        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
-        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID, R.layout.vertical_grid_rtl);
-        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, numItems);
-        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
-        mOrientation = BaseGridView.VERTICAL;
-        mNumRows = 1;
-        initActivity(intent);
-
-        runTestOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                mGridView.requestFocus();
-                mGridView.setSelectedPositionSmooth(0);
-            }
-        });
-        waitForScrollIdle(mVerifyLayout);
-
-        sendKeys(KeyEvent.KEYCODE_DPAD_RIGHT);
-        waitForScrollIdle(mVerifyLayout);
-        assertTrue(mGridView.hasFocus());
-    }
-
-    public void testTransferFocusable() throws Throwable {
-        final int numItems = 200;
-        final int numColumns = 3;
-        final int startPos = 1;
-
-        mInstrumentation = getInstrumentation();
-        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
-        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
-                R.layout.horizontal_grid);
-        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, numItems);
-        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
-        mOrientation = BaseGridView.HORIZONTAL;
-        mNumRows = numColumns;
-        boolean[] focusable = new boolean[numItems];
-        for (int i = 0; i < focusable.length; i++) {
-            focusable[i] = true;
-        }
-        for (int i = 0; i < startPos; i++) {
-            focusable[i] = false;
-        }
-        intent.putExtra(GridActivity.EXTRA_ITEMS_FOCUSABLE, focusable);
-        initActivity(intent);
-
-        changeArraySize(0);
-        assertTrue(mGridView.isFocused());
-
-        changeArraySize(numItems);
-        assertTrue(mGridView.getLayoutManager().findViewByPosition(startPos).hasFocus());
-    }
-
-    public void testTransferFocusable2() throws Throwable {
-        final int numItems = 200;
-        final int numColumns = 3;
-        final int startPos = 10;
-
-        mInstrumentation = getInstrumentation();
-        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
-        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
-                R.layout.horizontal_grid);
-        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, numItems);
-        intent.putExtra(GridActivity.EXTRA_STAGGERED, true);
-        mOrientation = BaseGridView.HORIZONTAL;
-        mNumRows = numColumns;
-        boolean[] focusable = new boolean[numItems];
-        for (int i = 0; i < focusable.length; i++) {
-            focusable[i] = true;
-        }
-        for (int i = 0; i < startPos; i++) {
-            focusable[i] = false;
-        }
-        intent.putExtra(GridActivity.EXTRA_ITEMS_FOCUSABLE, focusable);
-        initActivity(intent);
-
-        changeArraySize(0);
-        assertTrue(mGridView.isFocused());
-
-        changeArraySize(numItems);
-        assertTrue(mGridView.getLayoutManager().findViewByPosition(startPos).hasFocus());
-    }
-
-    public void testNonFocusableLoseInFastLayout() throws Throwable {
-        mInstrumentation = getInstrumentation();
-        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
-        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
-                R.layout.vertical_linear);
-        int[] items = new int[300];
-        for (int i = 0; i < items.length; i++) {
-            items[i] = 480;
-        }
-        intent.putExtra(GridActivity.EXTRA_ITEMS, items);
-        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
-        intent.putExtra(GridActivity.EXTRA_REQUEST_LAYOUT_ONFOCUS, true);
-        mOrientation = BaseGridView.VERTICAL;
-        mNumRows = 1;
-        int pressDown = 15;
-
-        initActivity(intent);
-
-        mGridView.setSelectedPositionSmooth(0);
-        waitForScrollIdleAndItemAnimation(mVerifyLayout);
-
-        for (int i = 0; i < pressDown; i++) {
-            sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);
-        }
-        waitForScrollIdleAndItemAnimation(mVerifyLayout);
-        assertFalse(mGridView.isFocused());
-
-    }
-
-    public void testSetSelectionWithDelta() throws Throwable {
-        mInstrumentation = getInstrumentation();
-        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
-        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
-                R.layout.vertical_linear);
-        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 300);
-        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
-        mOrientation = BaseGridView.VERTICAL;
-        mNumRows = 1;
-
-        initActivity(intent);
-
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mGridView.setSelectedPositionSmooth(3);
-            }
-        });
-        waitForScrollIdle(mVerifyLayout);
-        int top1 = mGridView.getLayoutManager().findViewByPosition(3).getTop();
-
-        humanDelay(1000);
-
-        // scroll to position with delta
-        setSelectedPosition(3, 100);
-        int top2 = mGridView.getLayoutManager().findViewByPosition(3).getTop();
-        assertEquals(top1 - 100, top2);
-
-        // scroll to same position without delta, it will be reset
-        setSelectedPosition(3, 0);
-        int top3 = mGridView.getLayoutManager().findViewByPosition(3).getTop();
-        assertEquals(top1, top3);
-
-        // scroll invisible item after last visible item
-        final int lastVisiblePos = ((GridLayoutManager)mGridView.getLayoutManager())
-                .mGrid.getLastVisibleIndex();
-        setSelectedPosition(lastVisiblePos + 1, 100);
-        int top4 = mGridView.getLayoutManager().findViewByPosition(lastVisiblePos + 1).getTop();
-        assertEquals(top1 - 100, top4);
-
-        // scroll invisible item before first visible item
-        final int firstVisiblePos = ((GridLayoutManager)mGridView.getLayoutManager())
-                .mGrid.getFirstVisibleIndex();
-        setSelectedPosition(firstVisiblePos - 1, 100);
-        int top5 = mGridView.getLayoutManager().findViewByPosition(firstVisiblePos - 1).getTop();
-        assertEquals(top1 - 100, top5);
-
-        // scroll to invisible item that is far away.
-        setSelectedPosition(50, 100);
-        int top6 = mGridView.getLayoutManager().findViewByPosition(50).getTop();
-        assertEquals(top1 - 100, top6);
-
-        // scroll to invisible item that is far away.
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mGridView.setSelectedPositionSmooth(100);
-            }
-        });
-        waitForScrollIdle(mVerifyLayout);
-        int top7 = mGridView.getLayoutManager().findViewByPosition(100).getTop();
-        assertEquals(top1, top7);
-
-        // scroll to invisible item that is far away.
-        setSelectedPosition(10, 50);
-        int top8 = mGridView.getLayoutManager().findViewByPosition(10).getTop();
-        assertEquals(top1 - 50, top8);
-    }
-
-    public void testSetSelectionWithDeltaInGrid() throws Throwable {
-        mInstrumentation = getInstrumentation();
-        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
-        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
-                R.layout.vertical_grid);
-        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 500);
-        intent.putExtra(GridActivity.EXTRA_STAGGERED, true);
-        mOrientation = BaseGridView.VERTICAL;
-        mNumRows = 3;
-
-        initActivity(intent);
-
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mGridView.setSelectedPositionSmooth(10);
-            }
-        });
-        waitForScrollIdle(mVerifyLayout);
-        int top1 = getCenterY(mGridView.getLayoutManager().findViewByPosition(10));
-
-        humanDelay(500);
-
-        // scroll to position with delta
-        setSelectedPosition(20, 100);
-        int top2 = getCenterY(mGridView.getLayoutManager().findViewByPosition(20));
-        assertEquals(top1 - 100, top2);
-
-        // scroll to same position without delta, it will be reset
-        setSelectedPosition(20, 0);
-        int top3 = getCenterY(mGridView.getLayoutManager().findViewByPosition(20));
-        assertEquals(top1, top3);
-
-        // scroll invisible item after last visible item
-        final int lastVisiblePos = ((GridLayoutManager)mGridView.getLayoutManager())
-                .mGrid.getLastVisibleIndex();
-        setSelectedPosition(lastVisiblePos + 1, 100);
-        int top4 = getCenterY(mGridView.getLayoutManager().findViewByPosition(lastVisiblePos + 1));
-        verifyMargin();
-        assertEquals(top1 - 100, top4);
-
-        // scroll invisible item before first visible item
-        final int firstVisiblePos = ((GridLayoutManager)mGridView.getLayoutManager())
-                .mGrid.getFirstVisibleIndex();
-        setSelectedPosition(firstVisiblePos - 1, 100);
-        int top5 = getCenterY(mGridView.getLayoutManager().findViewByPosition(firstVisiblePos - 1));
-        assertEquals(top1 - 100, top5);
-
-        // scroll to invisible item that is far away.
-        setSelectedPosition(100, 100);
-        int top6 = getCenterY(mGridView.getLayoutManager().findViewByPosition(100));
-        assertEquals(top1 - 100, top6);
-
-        // scroll to invisible item that is far away.
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mGridView.setSelectedPositionSmooth(200);
-            }
-        });
-        waitForScrollIdle(mVerifyLayout);
-        Thread.sleep(500);
-        int top7 = getCenterY(mGridView.getLayoutManager().findViewByPosition(200));
-        assertEquals(top1, top7);
-
-        // scroll to invisible item that is far away.
-        setSelectedPosition(10, 50);
-        int top8 = getCenterY(mGridView.getLayoutManager().findViewByPosition(10));
-        assertEquals(top1 - 50, top8);
-    }
-
-
-    public void testSetSelectionWithDeltaInGrid1() throws Throwable {
-        mInstrumentation = getInstrumentation();
-        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
-        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
-                R.layout.vertical_grid);
-        intent.putExtra(GridActivity.EXTRA_ITEMS, new int[]{
-                193,176,153,141,203,184,232,139,177,206,222,136,132,237,172,137,
-                188,172,163,213,158,219,209,147,133,229,170,197,138,215,188,205,
-                223,192,225,170,195,127,229,229,210,195,134,142,160,139,130,222,
-                150,163,180,176,157,137,234,169,159,167,182,150,224,231,202,236,
-                123,140,181,223,120,185,183,221,123,210,134,158,166,208,149,128,
-                192,214,212,198,133,140,158,133,229,173,226,141,180,128,127,218,
-                192,235,183,213,216,150,143,193,125,141,219,210,195,195,192,191,
-                212,236,157,189,160,220,147,158,220,199,233,231,201,180,168,141,
-                156,204,191,183,190,153,123,210,238,151,139,221,223,200,175,191,
-                132,184,197,204,236,157,230,151,195,219,212,143,172,149,219,184,
-                164,211,132,187,172,142,174,146,127,147,206,238,188,129,199,226,
-                132,220,210,159,235,153,208,182,196,123,180,159,131,135,175,226,
-                127,134,237,211,133,225,132,124,160,226,224,200,173,137,217,169,
-                182,183,176,185,122,168,195,159,172,129,126,129,166,136,149,220,
-                178,191,192,238,180,208,234,154,222,206,239,228,129,140,203,125,
-                214,175,125,169,196,132,234,138,192,142,234,190,215,232,239,122,
-                188,158,128,221,159,237,207,157,232,138,132,214,122,199,121,191,
-                199,209,126,164,175,187,173,186,194,224,191,196,146,208,213,210,
-                164,176,202,213,123,157,179,138,217,129,186,166,237,211,157,130,
-                137,132,171,232,216,239,180,151,137,132,190,133,218,155,171,227,
-                193,147,197,164,120,218,193,154,170,196,138,222,161,235,143,154,
-                192,178,228,195,178,133,203,178,173,206,178,212,136,157,169,124,
-                172,121,128,223,238,125,217,187,184,156,169,215,231,124,210,174,
-                146,226,185,134,223,228,183,182,136,133,199,146,180,233,226,225,
-                174,233,145,235,216,170,192,171,132,132,134,223,233,148,154,162,
-                192,179,197,203,139,197,174,187,135,132,180,136,192,195,124,221,
-                120,189,233,233,146,225,234,163,215,143,132,198,156,205,151,190,
-                204,239,221,229,123,138,134,217,219,136,218,215,167,139,195,125,
-                202,225,178,226,145,208,130,194,228,197,157,215,124,147,174,123,
-                237,140,172,181,161,151,229,216,199,199,179,213,146,122,222,162,
-                139,173,165,150,160,217,207,137,165,175,129,158,134,133,178,199,
-                215,213,122,197
-        });
-        intent.putExtra(GridActivity.EXTRA_STAGGERED, true);
-        mOrientation = BaseGridView.VERTICAL;
-        mNumRows = 3;
-
-        initActivity(intent);
-
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mGridView.setSelectedPositionSmooth(10);
-            }
-        });
-        waitForScrollIdle(mVerifyLayout);
-        int top1 = getCenterY(mGridView.getLayoutManager().findViewByPosition(10));
-
-        humanDelay(500);
-
-        // scroll to position with delta
-        setSelectedPosition(20, 100);
-        int top2 = getCenterY(mGridView.getLayoutManager().findViewByPosition(20));
-        assertEquals(top1 - 100, top2);
-
-        // scroll to same position without delta, it will be reset
-        setSelectedPosition(20, 0);
-        int top3 = getCenterY(mGridView.getLayoutManager().findViewByPosition(20));
-        assertEquals(top1, top3);
-
-        // scroll invisible item after last visible item
-        final int lastVisiblePos = ((GridLayoutManager)mGridView.getLayoutManager())
-                .mGrid.getLastVisibleIndex();
-        setSelectedPosition(lastVisiblePos + 1, 100);
-        int top4 = getCenterY(mGridView.getLayoutManager().findViewByPosition(lastVisiblePos + 1));
-        verifyMargin();
-        assertEquals(top1 - 100, top4);
-
-        // scroll invisible item before first visible item
-        final int firstVisiblePos = ((GridLayoutManager)mGridView.getLayoutManager())
-                .mGrid.getFirstVisibleIndex();
-        setSelectedPosition(firstVisiblePos - 1, 100);
-        int top5 = getCenterY(mGridView.getLayoutManager().findViewByPosition(firstVisiblePos - 1));
-        assertEquals(top1 - 100, top5);
-
-        // scroll to invisible item that is far away.
-        setSelectedPosition(100, 100);
-        int top6 = getCenterY(mGridView.getLayoutManager().findViewByPosition(100));
-        assertEquals(top1 - 100, top6);
-
-        // scroll to invisible item that is far away.
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mGridView.setSelectedPositionSmooth(200);
-            }
-        });
-        waitForScrollIdle(mVerifyLayout);
-        Thread.sleep(500);
-        int top7 = getCenterY(mGridView.getLayoutManager().findViewByPosition(200));
-        assertEquals(top1, top7);
-
-        // scroll to invisible item that is far away.
-        setSelectedPosition(10, 50);
-        int top8 = getCenterY(mGridView.getLayoutManager().findViewByPosition(10));
-        assertEquals(top1 - 50, top8);
-    }
-
-    public void testSmoothScrollSelectionEvents() throws Throwable {
-        mInstrumentation = getInstrumentation();
-        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
-        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
-                R.layout.vertical_grid);
-        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 500);
-        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
-        mOrientation = BaseGridView.VERTICAL;
-        mNumRows = 3;
-        initActivity(intent);
-
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mGridView.setSelectedPositionSmooth(30);
-            }
-        });
-        waitForScrollIdle(mVerifyLayout);
-        humanDelay(500);
-
-        final ArrayList<Integer> selectedPositions = new ArrayList<Integer>();
-        mGridView.setOnChildSelectedListener(new OnChildSelectedListener() {
-            @Override
-            public void onChildSelected(ViewGroup parent, View view, int position, long id) {
-                selectedPositions.add(position);
-            }
-        });
-
-        sendRepeatedKeys(10, KeyEvent.KEYCODE_DPAD_UP);
-        humanDelay(500);
-        waitForScrollIdle(mVerifyLayout);
-        // should only get childselected event for item 0 once
-        assertTrue(selectedPositions.size() > 0);
-        assertEquals(0, selectedPositions.get(selectedPositions.size() - 1).intValue());
-        for (int i = selectedPositions.size() - 2; i >= 0; i--) {
-            assertFalse(0 == selectedPositions.get(i).intValue());
-        }
-
-    }
-
-    public void testSmoothScrollSelectionEventsLinear() throws Throwable {
-        mInstrumentation = getInstrumentation();
-        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
-        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
-                R.layout.vertical_linear);
-        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 500);
-        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
-        mOrientation = BaseGridView.VERTICAL;
-        mNumRows = 1;
-        initActivity(intent);
-
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mGridView.setSelectedPositionSmooth(10);
-            }
-        });
-        waitForScrollIdle(mVerifyLayout);
-        humanDelay(500);
-
-        final ArrayList<Integer> selectedPositions = new ArrayList<Integer>();
-        mGridView.setOnChildSelectedListener(new OnChildSelectedListener() {
-            @Override
-            public void onChildSelected(ViewGroup parent, View view, int position, long id) {
-                selectedPositions.add(position);
-            }
-        });
-
-        sendRepeatedKeys(10, KeyEvent.KEYCODE_DPAD_UP);
-        humanDelay(500);
-        waitForScrollIdle(mVerifyLayout);
-        // should only get childselected event for item 0 once
-        assertTrue(selectedPositions.size() > 0);
-        assertEquals(0, selectedPositions.get(selectedPositions.size() - 1).intValue());
-        for (int i = selectedPositions.size() - 2; i >= 0; i--) {
-            assertFalse(0 == selectedPositions.get(i).intValue());
-        }
-
-    }
-
-    public void testScrollToNoneExisting() throws Throwable {
-        mInstrumentation = getInstrumentation();
-        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
-        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
-                R.layout.vertical_grid);
-        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 100);
-        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
-        mOrientation = BaseGridView.VERTICAL;
-        mNumRows = 3;
-        initActivity(intent);
-
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mGridView.setSelectedPositionSmooth(99);
-            }
-        });
-        waitForScrollIdle(mVerifyLayout);
-        humanDelay(500);
-
-
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mGridView.setSelectedPositionSmooth(50);
-            }
-        });
-        Thread.sleep(100);
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mGridView.requestLayout();
-                mGridView.setSelectedPositionSmooth(0);
-            }
-        });
-        waitForScrollIdle(mVerifyLayout);
-        humanDelay(500);
-
-    }
-
-    public void testSmoothscrollerInterrupted() throws Throwable {
-        mInstrumentation = getInstrumentation();
-        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
-        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
-                R.layout.vertical_linear);
-        intent.putExtra(GridActivity.EXTRA_REQUEST_FOCUS_ONLAYOUT, true);
-        int[] items = new int[100];
-        for (int i = 0; i < items.length; i++) {
-            items[i] = 680;
-        }
-        intent.putExtra(GridActivity.EXTRA_ITEMS, items);
-        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
-        mOrientation = BaseGridView.VERTICAL;
-        mNumRows = 1;
-
-        initActivity(intent);
-
-        mGridView.setSelectedPositionSmooth(0);
-        waitForScrollIdle(mVerifyLayout);
-        assertTrue(mGridView.getChildAt(0).hasFocus());
-
-        // Pressing lots of key to make sure smooth scroller is running
-        for (int i = 0; i < 20; i++) {
-            sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);
-        }
-        Thread.sleep(100);
-        int total = 0;
-        while (mGridView.getLayoutManager().isSmoothScrolling() ||
-                mGridView.getScrollState() != BaseGridView.SCROLL_STATE_IDLE) {
-            if ((total += 10) >= WAIT_FOR_SCROLL_IDLE_TIMEOUT_MS) {
-                throw new RuntimeException("waitForScrollIdle Timeout");
-            }
-            try {
-                // Repeatedly pressing to make sure pending keys does not drop to zero.
-                Thread.sleep(10);
-                sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);
-            } catch (InterruptedException ex) {
-                break;
-            }
-        }
-
-        assertTrue("LinearSmoothScroller would not use many RV.smoothScrollBy() calls",
-                ((VerticalGridViewEx) mGridView).mSmoothScrollByCalled < 10);
-    }
-
-    public void testSmoothscrollerCancelled() throws Throwable {
-        mInstrumentation = getInstrumentation();
-        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
-        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
-                R.layout.vertical_linear);
-        intent.putExtra(GridActivity.EXTRA_REQUEST_FOCUS_ONLAYOUT, true);
-        int[] items = new int[100];
-        for (int i = 0; i < items.length; i++) {
-            items[i] = 680;
-        }
-        intent.putExtra(GridActivity.EXTRA_ITEMS, items);
-        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
-        mOrientation = BaseGridView.VERTICAL;
-        mNumRows = 1;
-
-        initActivity(intent);
-
-        mGridView.setSelectedPositionSmooth(0);
-        waitForScrollIdle(mVerifyLayout);
-        assertTrue(mGridView.getChildAt(0).hasFocus());
-
-        int targetPosition = items.length - 1;
-        mGridView.setSelectedPositionSmooth(targetPosition);
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mGridView.stopScroll();
-            }
-        });
-        Thread.sleep(100);
-        assertEquals(mGridView.getSelectedPosition(), targetPosition);
-        assertSame(mGridView.getLayoutManager().findViewByPosition(targetPosition),
-                mGridView.findFocus());
-    }
-
-    public void testSetNumRowsAndAddItem() throws Throwable {
-        mInstrumentation = getInstrumentation();
-        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
-        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
-                R.layout.vertical_linear);
-        intent.putExtra(GridActivity.EXTRA_REQUEST_FOCUS_ONLAYOUT, true);
-        int[] items = new int[2];
-        for (int i = 0; i < items.length; i++) {
-            items[i] = 300;
-        }
-        intent.putExtra(GridActivity.EXTRA_ITEMS, items);
-        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
-        mOrientation = BaseGridView.VERTICAL;
-        mNumRows = 1;
-
-        initActivity(intent);
-
-        mGridView.setSelectedPositionSmooth(0);
-        waitForScrollIdle(mVerifyLayout);
-
-        mActivity.addItems(items.length, new int[]{300});
-
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                ((VerticalGridView) mGridView).setNumColumns(2);
-            }
-        });
-        Thread.sleep(1000);
-        assertTrue(mGridView.getChildAt(2).getLeft() != mGridView.getChildAt(1).getLeft());
-    }
-
-
-    public void testRequestLayoutBugInLayout() throws Throwable {
-        mInstrumentation = getInstrumentation();
-        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
-        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
-                R.layout.vertical_linear);
-        intent.putExtra(GridActivity.EXTRA_CHILD_LAYOUT_ID, R.layout.relative_layout);
-        intent.putExtra(GridActivity.EXTRA_REQUEST_FOCUS_ONLAYOUT, true);
-        int[] items = new int[100];
-        for (int i = 0; i < items.length; i++) {
-            items[i] = 300;
-        }
-        intent.putExtra(GridActivity.EXTRA_ITEMS, items);
-        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
-        mOrientation = BaseGridView.VERTICAL;
-        mNumRows = 1;
-
-        initActivity(intent);
-
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mGridView.setSelectedPositionSmooth(1);
-            }
-        });
-        waitForScrollIdle(mVerifyLayout);
-
-        sendKeys(KeyEvent.KEYCODE_DPAD_UP);
-        waitForScrollIdle(mVerifyLayout);
-
-        assertEquals("Line 2", ((TextView) mGridView.findFocus()).getText().toString());
-    }
-
-
-    public void testChangeLayoutInChild() throws Throwable {
-        mInstrumentation = getInstrumentation();
-        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
-        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
-                R.layout.vertical_linear_wrap_content);
-        intent.putExtra(GridActivity.EXTRA_REQUEST_LAYOUT_ONFOCUS, true);
-        int[] items = new int[2];
-        for (int i = 0; i < items.length; i++) {
-            items[i] = 300;
-        }
-        intent.putExtra(GridActivity.EXTRA_ITEMS, items);
-        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
-        mOrientation = BaseGridView.VERTICAL;
-        mNumRows = 1;
-
-        initActivity(intent);
-
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mGridView.setSelectedPositionSmooth(0);
-            }
-        });
-        waitForScrollIdleAndItemAnimation(mVerifyLayout);
-        verifyMargin();
-
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mGridView.setSelectedPositionSmooth(1);
-            }
-        });
-        waitForScrollIdleAndItemAnimation(mVerifyLayout);
-        verifyMargin();
-    }
-
-    public void testWrapContent() throws Throwable {
-        mInstrumentation = getInstrumentation();
-        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
-        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
-                R.layout.horizontal_grid_wrap);
-        int[] items = new int[200];
-        for (int i = 0; i < items.length; i++) {
-            items[i] = 300;
-        }
-        intent.putExtra(GridActivity.EXTRA_ITEMS, items);
-        mOrientation = BaseGridView.HORIZONTAL;
-        mNumRows = 1;
-
-        initActivity(intent);
-
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mActivity.attachToNewAdapter(new int[0]);
-            }
-        });
-
-    }
-
-
-    public void testZeroFixedSecondarySize() throws Throwable {
-        mInstrumentation = getInstrumentation();
-        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
-        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
-                R.layout.vertical_linear_measured_with_zero);
-        intent.putExtra(GridActivity.EXTRA_SECONDARY_SIZE_ZERO, true);
-        int[] items = new int[2];
-        for (int i = 0; i < items.length; i++) {
-            items[i] = 0;
-        }
-        intent.putExtra(GridActivity.EXTRA_ITEMS, items);
-        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
-        mOrientation = BaseGridView.VERTICAL;
-        mNumRows = 1;
-
-        initActivity(intent);
-
-    }
-
-    public void testChildStates() throws Throwable {
-        mInstrumentation = getInstrumentation();
-        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
-        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID, R.layout.vertical_linear);
-        int[] items = new int[100];
-        for (int i = 0; i < items.length; i++) {
-            items[i] = 200;
-        }
-        intent.putExtra(GridActivity.EXTRA_ITEMS, items);
-        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
-        intent.putExtra(GridActivity.EXTRA_REQUEST_LAYOUT_ONFOCUS, true);
-        intent.putExtra(GridActivity.EXTRA_CHILD_LAYOUT_ID, R.layout.selectable_text_view);
-        mOrientation = BaseGridView.VERTICAL;
-        mNumRows = 1;
-
-        initActivity(intent);
-        mGridView.setSaveChildrenPolicy(VerticalGridView.SAVE_ALL_CHILD);
-
-        final SparseArray<Parcelable> container = new SparseArray<Parcelable>();
-
-        // 1 Save view states
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                Selection.setSelection((Spannable)(((TextView) mGridView.getChildAt(0))
-                        .getText()), 0, 1);
-                Selection.setSelection((Spannable)(((TextView) mGridView.getChildAt(1))
-                        .getText()), 0, 1);
-                mGridView.saveHierarchyState(container);
-            }
-        });
-
-        // 2 Change view states
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                Selection.setSelection((Spannable)(((TextView) mGridView.getChildAt(0))
-                        .getText()), 1, 2);
-                Selection.setSelection((Spannable)(((TextView) mGridView.getChildAt(1))
-                        .getText()), 1, 2);
-            }
-        });
-
-        // 3 Detached and re-attached,  should still maintain state of (2)
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mGridView.setSelectedPositionSmooth(1);
-            }
-        });
-        waitForScrollIdleAndItemAnimation(mVerifyLayout);
-        assertEquals(((TextView) mGridView.getChildAt(0)).getSelectionStart(), 1);
-        assertEquals(((TextView) mGridView.getChildAt(0)).getSelectionEnd(), 2);
-        assertEquals(((TextView) mGridView.getChildAt(1)).getSelectionStart(), 1);
-        assertEquals(((TextView) mGridView.getChildAt(1)).getSelectionEnd(), 2);
-
-        // 4 Recycled and rebound, should load state from (2)
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mGridView.setSelectedPositionSmooth(20);
-            }
-        });
-        waitForScrollIdle(mVerifyLayout);
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mGridView.setSelectedPositionSmooth(0);
-            }
-        });
-        waitForScrollIdleAndItemAnimation(mVerifyLayout);
-        assertEquals(((TextView) mGridView.getChildAt(0)).getSelectionStart(), 1);
-        assertEquals(((TextView) mGridView.getChildAt(0)).getSelectionEnd(), 2);
-        assertEquals(((TextView) mGridView.getChildAt(1)).getSelectionStart(), 1);
-        assertEquals(((TextView) mGridView.getChildAt(1)).getSelectionEnd(), 2);
-    }
-
-
-    public void testNoDispatchSaveChildState() throws Throwable {
-        mInstrumentation = getInstrumentation();
-        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
-        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID, R.layout.vertical_linear);
-        int[] items = new int[100];
-        for (int i = 0; i < items.length; i++) {
-            items[i] = 200;
-        }
-        intent.putExtra(GridActivity.EXTRA_ITEMS, items);
-        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
-        intent.putExtra(GridActivity.EXTRA_CHILD_LAYOUT_ID, R.layout.selectable_text_view);
-        mOrientation = BaseGridView.VERTICAL;
-        mNumRows = 1;
-
-        initActivity(intent);
-        mGridView.setSaveChildrenPolicy(VerticalGridView.SAVE_NO_CHILD);
-
-        final SparseArray<Parcelable> container = new SparseArray<Parcelable>();
-
-        // 1. Set text selection, save view states should do nothing on child
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                for (int i = 0; i < mGridView.getChildCount(); i++) {
-                    Selection.setSelection((Spannable)(((TextView) mGridView.getChildAt(i))
-                            .getText()), 0, 1);
-                }
-                mGridView.saveHierarchyState(container);
-            }
-        });
-
-        // 2. clear the text selection
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                for (int i = 0; i < mGridView.getChildCount(); i++) {
-                    Selection.removeSelection((Spannable)(((TextView) mGridView.getChildAt(i))
-                            .getText()));
-                }
-            }
-        });
-
-        // 3. Restore view states should be a no-op for child
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mGridView.restoreHierarchyState(container);
-                for (int i = 0; i < mGridView.getChildCount(); i++) {
-                    assertEquals(-1, ((TextView) mGridView.getChildAt(i)).getSelectionStart());
-                    assertEquals(-1, ((TextView) mGridView.getChildAt(i)).getSelectionEnd());
-                }
-            }
-        });
-    }
-
-
-    static interface ViewTypeProvider {
-        public int getViewType(int position);
-    }
-
-    static interface ItemAlignmentFacetProvider {
-        public ItemAlignmentFacet getItemAlignmentFacet(int viewType);
-    }
-
-    static class TwoViewTypesProvider implements ViewTypeProvider {
-        static int VIEW_TYPE_FIRST = 1;
-        static int VIEW_TYPE_DEFAULT = 0;
-        @Override
-        public int getViewType(int position) {
-            if (position == 0) {
-                return VIEW_TYPE_FIRST;
-            } else {
-                return VIEW_TYPE_DEFAULT;
-            }
-        }
-    }
-
-    static class ChangeableViewTypesProvider implements ViewTypeProvider {
-        static SparseIntArray sViewTypes = new SparseIntArray();
-        @Override
-        public int getViewType(int position) {
-            return sViewTypes.get(position);
-        }
-        public static void clear() {
-            sViewTypes.clear();
-        }
-        public static void setViewType(int position, int type) {
-            sViewTypes.put(position, type);
-        }
-    }
-
-    static class PositionItemAlignmentFacetProviderForRelativeLayout1
-            implements ItemAlignmentFacetProvider {
-        ItemAlignmentFacet mMultipleFacet;
-
-        PositionItemAlignmentFacetProviderForRelativeLayout1() {
-            mMultipleFacet = new ItemAlignmentFacet();
-            ItemAlignmentFacet.ItemAlignmentDef[] defs =
-                    new ItemAlignmentFacet.ItemAlignmentDef[2];
-            defs[0] = new ItemAlignmentFacet.ItemAlignmentDef();
-            defs[0].setItemAlignmentViewId(R.id.t1);
-            defs[1] = new ItemAlignmentFacet.ItemAlignmentDef();
-            defs[1].setItemAlignmentViewId(R.id.t2);
-            defs[1].setItemAlignmentOffsetPercent(100);
-            defs[1].setItemAlignmentOffset(-10);
-            mMultipleFacet.setAlignmentDefs(defs);
-        }
-
-        @Override
-        public ItemAlignmentFacet getItemAlignmentFacet(int position) {
-            if (position == 0) {
-                return mMultipleFacet;
-            } else {
-                return null;
-            }
-        }
-    }
-
-    public void testMultipleScrollPosition1() throws Throwable {
-        mInstrumentation = getInstrumentation();
-        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
-        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
-                R.layout.vertical_linear);
-        intent.putExtra(GridActivity.EXTRA_CHILD_LAYOUT_ID, R.layout.relative_layout);
-        intent.putExtra(GridActivity.EXTRA_REQUEST_FOCUS_ONLAYOUT, true);
-        int[] items = new int[100];
-        for (int i = 0; i < items.length; i++) {
-            items[i] = 300;
-        }
-        intent.putExtra(GridActivity.EXTRA_ITEMS, items);
-        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
-        intent.putExtra(GridActivity.EXTRA_VIEWTYPEPROVIDER_CLASS,
-                TwoViewTypesProvider.class.getName());
-        // Set ItemAlignment for each ViewHolder and view type,  ViewHolder should
-        // override the view type settings.
-        intent.putExtra(GridActivity.EXTRA_ITEMALIGNMENTPROVIDER_CLASS,
-                PositionItemAlignmentFacetProviderForRelativeLayout1.class.getName());
-        intent.putExtra(GridActivity.EXTRA_ITEMALIGNMENTPROVIDER_VIEWTYPE_CLASS,
-                ViewTypePositionItemAlignmentFacetProviderForRelativeLayout2.class.getName());
-        mOrientation = BaseGridView.VERTICAL;
-        mNumRows = 1;
-
-        initActivity(intent);
-
-        assertEquals("First view is aligned with padding top",
-                mGridView.getPaddingTop(), mGridView.getChildAt(0).getTop());
-
-        sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);
-        waitForScrollIdle(mVerifyLayout);
-
-        final View v = mGridView.getChildAt(0);
-        View t1 = v.findViewById(R.id.t1);
-        int t1align = (t1.getTop() + t1.getBottom()) / 2;
-        View t2 = v.findViewById(R.id.t2);
-        int t2align = t2.getBottom() - 10;
-        assertEquals("Expected alignment for 2nd textview",
-                mGridView.getPaddingTop() - (t2align - t1align),
-                v.getTop());
-    }
-
-    static class PositionItemAlignmentFacetProviderForRelativeLayout2 implements
-            ItemAlignmentFacetProvider {
-        ItemAlignmentFacet mMultipleFacet;
-
-        PositionItemAlignmentFacetProviderForRelativeLayout2() {
-            mMultipleFacet = new ItemAlignmentFacet();
-            ItemAlignmentFacet.ItemAlignmentDef[] defs = new ItemAlignmentFacet.ItemAlignmentDef[2];
-            defs[0] = new ItemAlignmentFacet.ItemAlignmentDef();
-            defs[0].setItemAlignmentViewId(R.id.t1);
-            defs[0].setItemAlignmentOffsetPercent(0);
-            defs[1] = new ItemAlignmentFacet.ItemAlignmentDef();
-            defs[1].setItemAlignmentViewId(R.id.t2);
-            defs[1].setItemAlignmentOffsetPercent(ItemAlignmentFacet.ITEM_ALIGN_OFFSET_PERCENT_DISABLED);
-            defs[1].setItemAlignmentOffset(-10);
-            mMultipleFacet.setAlignmentDefs(defs);
-        }
-
-        @Override
-        public ItemAlignmentFacet getItemAlignmentFacet(int position) {
-            if (position == 0) {
-                return mMultipleFacet;
-            } else {
-                return null;
-            }
-        }
-    }
-
-    public void testMultipleScrollPosition2() throws Throwable {
-        mInstrumentation = getInstrumentation();
-        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
-        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID, R.layout.vertical_linear);
-        intent.putExtra(GridActivity.EXTRA_CHILD_LAYOUT_ID, R.layout.relative_layout);
-        intent.putExtra(GridActivity.EXTRA_REQUEST_FOCUS_ONLAYOUT, true);
-        int[] items = new int[100];
-        for (int i = 0; i < items.length; i++) {
-            items[i] = 300;
-        }
-        intent.putExtra(GridActivity.EXTRA_ITEMS, items);
-        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
-        intent.putExtra(GridActivity.EXTRA_VIEWTYPEPROVIDER_CLASS,
-                TwoViewTypesProvider.class.getName());
-        intent.putExtra(GridActivity.EXTRA_ITEMALIGNMENTPROVIDER_CLASS,
-                PositionItemAlignmentFacetProviderForRelativeLayout2.class.getName());
-        mOrientation = BaseGridView.VERTICAL;
-        mNumRows = 1;
-
-        initActivity(intent);
-
-        assertEquals("First view is aligned with padding top", mGridView.getPaddingTop(),
-                mGridView.getChildAt(0).getTop());
-
-        sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);
-        waitForScrollIdle(mVerifyLayout);
-
-        final View v = mGridView.getChildAt(0);
-        View t1 = v.findViewById(R.id.t1);
-        int t1align = t1.getTop();
-        View t2 = v.findViewById(R.id.t2);
-        int t2align = t2.getTop() - 10;
-        assertEquals("Expected alignment for 2nd textview",
-                mGridView.getPaddingTop() - (t2align - t1align), v.getTop());
-    }
-
-    static class ViewTypePositionItemAlignmentFacetProviderForRelativeLayout2 implements
-            ItemAlignmentFacetProvider {
-        ItemAlignmentFacet mMultipleFacet;
-
-        ViewTypePositionItemAlignmentFacetProviderForRelativeLayout2() {
-            mMultipleFacet = new ItemAlignmentFacet();
-            ItemAlignmentFacet.ItemAlignmentDef[] defs = new ItemAlignmentFacet.ItemAlignmentDef[2];
-            defs[0] = new ItemAlignmentFacet.ItemAlignmentDef();
-            defs[0].setItemAlignmentViewId(R.id.t1);
-            defs[0].setItemAlignmentOffsetPercent(0);
-            defs[1] = new ItemAlignmentFacet.ItemAlignmentDef();
-            defs[1].setItemAlignmentViewId(R.id.t2);
-            defs[1].setItemAlignmentOffsetPercent(100);
-            defs[1].setItemAlignmentOffset(-10);
-            mMultipleFacet.setAlignmentDefs(defs);
-        }
-
-        @Override
-        public ItemAlignmentFacet getItemAlignmentFacet(int viewType) {
-            if (viewType == TwoViewTypesProvider.VIEW_TYPE_FIRST) {
-                return mMultipleFacet;
-            } else {
-                return null;
-            }
-        }
-    }
-
-    public void testMultipleScrollPosition3() throws Throwable {
-        mInstrumentation = getInstrumentation();
-        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
-        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID, R.layout.vertical_linear);
-        intent.putExtra(GridActivity.EXTRA_CHILD_LAYOUT_ID, R.layout.relative_layout);
-        intent.putExtra(GridActivity.EXTRA_REQUEST_FOCUS_ONLAYOUT, true);
-        int[] items = new int[100];
-        for (int i = 0; i < items.length; i++) {
-            items[i] = 300;
-        }
-        intent.putExtra(GridActivity.EXTRA_ITEMS, items);
-        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
-        intent.putExtra(GridActivity.EXTRA_VIEWTYPEPROVIDER_CLASS,
-                TwoViewTypesProvider.class.getName());
-        intent.putExtra(GridActivity.EXTRA_ITEMALIGNMENTPROVIDER_VIEWTYPE_CLASS,
-                ViewTypePositionItemAlignmentFacetProviderForRelativeLayout2.class.getName());
-        mOrientation = BaseGridView.VERTICAL;
-        mNumRows = 1;
-
-        initActivity(intent);
-
-        assertEquals("First view is aligned with padding top", mGridView.getPaddingTop(),
-                mGridView.getChildAt(0).getTop());
-
-        sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);
-        waitForScrollIdle(mVerifyLayout);
-
-        final View v = mGridView.getChildAt(0);
-        View t1 = v.findViewById(R.id.t1);
-        int t1align = t1.getTop();
-        View t2 = v.findViewById(R.id.t2);
-        int t2align = t2.getBottom() - 10;
-        assertEquals("Expected alignment for 2nd textview",
-                mGridView.getPaddingTop() - (t2align - t1align), v.getTop());
-    }
-
-    public void testSelectionAndAddItemInOneCycle() throws Throwable {
-        mInstrumentation = getInstrumentation();
-        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
-        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
-                R.layout.vertical_linear);
-        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 0);
-        initActivity(intent);
-        mOrientation = BaseGridView.HORIZONTAL;
-        mNumRows = 1;
-
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mActivity.addItems(0, new int[]{300, 300});
-                mGridView.setSelectedPosition(0);
-            }
-        });
-        waitForTransientStateGone(null);
-        assertEquals(0, mGridView.getSelectedPosition());
-    }
-
-    public void testNotifyItemTypeChangedSelectionEvent() throws Throwable {
-        mInstrumentation = getInstrumentation();
-        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
-        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
-                R.layout.vertical_linear);
-        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 10);
-        intent.putExtra(GridActivity.EXTRA_VIEWTYPEPROVIDER_CLASS,
-                ChangeableViewTypesProvider.class.getName());
-        ChangeableViewTypesProvider.clear();
-        initActivity(intent);
-        mOrientation = BaseGridView.HORIZONTAL;
-        mNumRows = 1;
-
-        final ArrayList<Integer> selectedLog = new ArrayList<Integer>();
-        mGridView.setOnChildSelectedListener(new OnChildSelectedListener() {
-            public void onChildSelected(ViewGroup parent, View view, int position, long id) {
-                selectedLog.add(position);
-            }
-        });
-
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                ChangeableViewTypesProvider.setViewType(0, 1);
-                mGridView.getAdapter().notifyItemChanged(0, 1);
-            }
-        });
-        waitForTransientStateGone(null);
-        assertEquals(0, mGridView.getSelectedPosition());
-        assertEquals(selectedLog.size(), 1);
-        assertEquals((int) selectedLog.get(0), 0);
-    }
-
-    public void testSelectionSmoothAndAddItemInOneCycle() throws Throwable {
-        mInstrumentation = getInstrumentation();
-        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
-        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
-                R.layout.vertical_linear);
-        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 0);
-        initActivity(intent);
-        mOrientation = BaseGridView.HORIZONTAL;
-        mNumRows = 1;
-
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mActivity.addItems(0, new int[]{300, 300});
-                mGridView.setSelectedPositionSmooth(0);
-            }
-        });
-        waitForTransientStateGone(null);
-        assertEquals(0, mGridView.getSelectedPosition());
-    }
-
-    public void testExtraLayoutSpace() throws Throwable {
-        mInstrumentation = getInstrumentation();
-        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
-        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
-                R.layout.vertical_linear);
-        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 1000);
-        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
-        initActivity(intent);
-
-        final int windowSize = mGridView.getHeight();
-        final int extraLayoutSize = windowSize;
-        int itemLength = mActivity.mItemLengths[0];
-        mOrientation = BaseGridView.VERTICAL;
-        mNumRows = 1;
-
-        // add extra layout space
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mGridView.setExtraLayoutSpace(extraLayoutSize);
-            }
-        });
-        Thread.sleep(50);
-        View v;
-        v = mGridView.getChildAt(mGridView.getChildCount() - 1);
-        assertTrue(v.getTop() < windowSize + extraLayoutSize);
-        assertTrue(v.getBottom() >= windowSize + extraLayoutSize -
-                mGridView.getVerticalMargin());
-
-        mGridView.setSelectedPositionSmooth(150);
-        waitForScrollIdle(mVerifyLayout);
-        v = mGridView.getChildAt(0);
-        assertTrue(v.getBottom() > - extraLayoutSize);
-        assertTrue(v.getTop() <= -extraLayoutSize + mGridView.getVerticalMargin());
-
-        // clear extra layout space
-        runTestOnUiThread(new Runnable() {
-            public void run() {
-                mGridView.setExtraLayoutSpace(0);
-                verifyMargin();
-            }
-        });
-        Thread.sleep(50);
-        v = mGridView.getChildAt(mGridView.getChildCount() - 1);
-        assertTrue(v.getTop() < windowSize);
-        assertTrue(v.getBottom() >= windowSize - mGridView.getVerticalMargin());
-    }
-
-    public void testFocusFinder() throws Throwable {
-        mInstrumentation = getInstrumentation();
-        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
-        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
-                R.layout.vertical_linear_with_button);
-        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 3);
-        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
-        initActivity(intent);
-        mOrientation = BaseGridView.VERTICAL;
-        mNumRows = 1;
-
-        // test focus from button to vertical grid view
-        final View button = mActivity.findViewById(R.id.button);
-        assertTrue(button.isFocused());
-        sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);
-        assertFalse(mGridView.isFocused());
-        assertTrue(mGridView.hasFocus());
-
-        // FocusFinder should find last focused(2nd) item on DPAD_DOWN
-        final View secondChild = mGridView.getChildAt(1);
-        runTestOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                secondChild.requestFocus();
-                button.requestFocus();
-            }
-        });
-        assertTrue(button.isFocused());
-        sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);
-        assertTrue(secondChild.isFocused());
-
-        // Bug 26918143 Even VerticalGridView is not focusable, FocusFinder should find last focused
-        // (2nd) item on DPAD_DOWN.
-        runTestOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                button.requestFocus();
-            }
-        });
-        mGridView.setFocusable(false);
-        mGridView.setFocusableInTouchMode(false);
-        assertTrue(button.isFocused());
-        sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);
-        assertTrue(secondChild.isFocused());
-    }
-
-    public void testRestoreIndexAndAddItems() throws Throwable {
-        mInstrumentation = getInstrumentation();
-        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
-        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
-                R.layout.vertical_linear);
-        intent.putExtra(GridActivity.EXTRA_CHILD_LAYOUT_ID, R.layout.horizontal_item);
-        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 4);
-        initActivity(intent);
-        mOrientation = BaseGridView.VERTICAL;
-        mNumRows = 1;
-
-        assertEquals(mGridView.getSelectedPosition(), 0);
-        final SparseArray states = new SparseArray();
-        runTestOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                mGridView.saveHierarchyState(states);
-                mGridView.setAdapter(null);
-            }
-
-        });
-        runTestOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                mGridView.restoreHierarchyState(states);
-                mActivity.attachToNewAdapter(new int[0]);
-                mActivity.addItems(0, new int[]{100, 100, 100, 100});
-            }
-
-        });
-        waitForTransientStateGone(null);
-        assertEquals(mGridView.getSelectedPosition(), 0);
-    }
-
-    public void test27766012() throws Throwable {
-        mInstrumentation = getInstrumentation();
-        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
-        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
-                R.layout.vertical_linear_with_button_onleft);
-        intent.putExtra(GridActivity.EXTRA_CHILD_LAYOUT_ID, R.layout.horizontal_item);
-        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 2);
-        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
-        intent.putExtra(GridActivity.EXTRA_UPDATE_SIZE, false);
-        initActivity(intent);
-        mOrientation = BaseGridView.VERTICAL;
-        mNumRows = 1;
-
-        // set remove animator two seconds
-        mGridView.getItemAnimator().setRemoveDuration(2000);
-        final View view = mGridView.getChildAt(1);
-        runTestOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                view.requestFocus();
-            }
-        });
-        assertTrue(view.hasFocus());
-        runTestOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                mActivity.removeItems(0, 2);
-            }
-
-        });
-        // wait one second, removing second view is still attached to parent
-        Thread.sleep(1000);
-        assertSame(view.getParent(), mGridView);
-        runTestOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                // refocus to the removed item and do a focus search.
-                view.requestFocus();
-                view.focusSearch(View.FOCUS_UP);
-            }
-
-        });
-    }
-
-    public void testBug27258366() throws Throwable {
-        mInstrumentation = getInstrumentation();
-        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
-        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
-                R.layout.vertical_linear_with_button_onleft);
-        intent.putExtra(GridActivity.EXTRA_CHILD_LAYOUT_ID, R.layout.horizontal_item);
-        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 10);
-        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
-        intent.putExtra(GridActivity.EXTRA_UPDATE_SIZE, false);
-        initActivity(intent);
-        mOrientation = BaseGridView.VERTICAL;
-        mNumRows = 1;
-
-        // move item1 500 pixels right, when focus is on item1, default focus finder will pick
-        // item0 and item2 for the best match of focusSearch(FOCUS_LEFT).  The grid widget
-        // must override default addFocusables(), not to add item0 or item2.
-        mActivity.mAdapterListener = new GridActivity.AdapterListener() {
-            public void onBind(RecyclerView.ViewHolder vh, int position) {
-                if (position == 1) {
-                    vh.itemView.setPaddingRelative(500, 0, 0, 0);
-                } else {
-                    vh.itemView.setPaddingRelative(0, 0, 0, 0);
-                }
-            }
-        };
-        runTestOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                mGridView.getAdapter().notifyDataSetChanged();
-            }
-        });
-        Thread.sleep(100);
-
-        final ViewGroup secondChild = (ViewGroup) mGridView.getChildAt(1);
-        runTestOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                secondChild.requestFocus();
-            }
-        });
-        sendKeys(KeyEvent.KEYCODE_DPAD_LEFT);
-        Thread.sleep(100);
-        final View button = mActivity.findViewById(R.id.button);
-        assertTrue(button.isFocused());
-    }
-
-    public void testAccessibility() throws Throwable {
-        mInstrumentation = getInstrumentation();
-        Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
-        intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
-                R.layout.vertical_linear);
-        intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 1000);
-        intent.putExtra(GridActivity.EXTRA_STAGGERED, false);
-        initActivity(intent);
-        mOrientation = BaseGridView.VERTICAL;
-        mNumRows = 1;
-
-        assertTrue(0 == mGridView.getSelectedPosition());
-
-        final RecyclerViewAccessibilityDelegate delegateCompat = mGridView
-                .getCompatAccessibilityDelegate();
-        final AccessibilityNodeInfoCompat info = AccessibilityNodeInfoCompat.obtain();
-        runTestOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                delegateCompat.onInitializeAccessibilityNodeInfo(mGridView, info);
-            }
-        });
-        assertTrue("test sanity", info.isScrollable());
-        runTestOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                delegateCompat.performAccessibilityAction(mGridView,
-                        AccessibilityNodeInfoCompat.ACTION_SCROLL_FORWARD, null);
-            }
-        });
-        waitForScrollIdle(mVerifyLayout);
-        int selectedPosition1 = mGridView.getSelectedPosition();
-        assertTrue(0 < selectedPosition1);
-
-        runTestOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                delegateCompat.onInitializeAccessibilityNodeInfo(mGridView, info);
-            }
-        });
-        assertTrue("test sanity", info.isScrollable());
-        runTestOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                delegateCompat.performAccessibilityAction(mGridView,
-                        AccessibilityNodeInfoCompat.ACTION_SCROLL_BACKWARD, null);
-            }
-        });
-        waitForScrollIdle(mVerifyLayout);
-        int selectedPosition2 = mGridView.getSelectedPosition();
-        assertTrue(selectedPosition2 < selectedPosition1);
-    }
-
-}
diff --git a/v17/tests/src/android/support/v17/leanback/widget/PresenterTest.java b/v17/tests/src/android/support/v17/leanback/widget/PresenterTest.java
deleted file mode 100644
index e0d42a1..0000000
--- a/v17/tests/src/android/support/v17/leanback/widget/PresenterTest.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.v17.leanback.widget;
-
-import android.graphics.Bitmap;
-import android.support.v17.leanback.app.HeadersFragment;
-import android.support.v17.leanback.R;
-import android.test.AndroidTestCase;
-import android.view.ContextThemeWrapper;
-import android.widget.FrameLayout;
-import android.view.View;
-import android.view.ViewGroup.LayoutParams;
-
-public class PresenterTest extends AndroidTestCase {
-
-    public void testZoomFactors() throws Throwable {
-        new ListRowPresenter(FocusHighlight.ZOOM_FACTOR_SMALL);
-        new ListRowPresenter(FocusHighlight.ZOOM_FACTOR_MEDIUM);
-        new ListRowPresenter(FocusHighlight.ZOOM_FACTOR_LARGE);
-        new ListRowPresenter(FocusHighlight.ZOOM_FACTOR_XSMALL);
-        try {
-            new ListRowPresenter(100);
-            fail("Should have thrown exception");
-        } catch (IllegalArgumentException exception) {
-        }
-    }
-
-    private void testHeaderPresenter(RowHeaderPresenter p) {
-        int expectedVisibility;
-        Presenter.ViewHolder vh = p.onCreateViewHolder(new FrameLayout(getContext()));
-        p.onBindViewHolder(vh, null);
-        expectedVisibility = p.isNullItemVisibilityGone() ? View.GONE : View.VISIBLE;
-        assertTrue("Header visibility",
-                vh.view.getVisibility() == expectedVisibility);
-        p.onBindViewHolder(vh, new Row(null));
-        assertTrue("Header visibility",
-                vh.view.getVisibility() == expectedVisibility);
-        p.onBindViewHolder(vh, new Row(new HeaderItem("")));
-        assertTrue("Header visibility",
-                vh.view.getVisibility() == View.VISIBLE);
-    }
-
-    public void testHeaderPresenter() throws Throwable {
-        HeadersFragment hf = new HeadersFragment();
-        PresenterSelector ps = hf.getPresenterSelector();
-
-        Presenter p = ps.getPresenter(new Row());
-        assertTrue("Row header instance",
-                p instanceof RowHeaderPresenter);
-        assertFalse("isNullItemVisibilityGone",
-                ((RowHeaderPresenter) p).isNullItemVisibilityGone());
-        testHeaderPresenter((RowHeaderPresenter) p);
-
-        p = ps.getPresenter(new SectionRow("Section Name"));
-        assertTrue("Row header instance",
-                p instanceof RowHeaderPresenter);
-        assertFalse("isNullItemVisibilityGone",
-                ((RowHeaderPresenter) p).isNullItemVisibilityGone());
-        testHeaderPresenter((RowHeaderPresenter) p);
-
-        p = ps.getPresenter(new DividerRow());
-        assertTrue("Row header instance",
-                p instanceof DividerPresenter);
-
-        ListRowPresenter lrp = new ListRowPresenter();
-        assertTrue("Row header instance",
-                lrp.getHeaderPresenter() instanceof RowHeaderPresenter);
-        RowHeaderPresenter rhp = (RowHeaderPresenter) lrp.getHeaderPresenter();
-        assertTrue("isNullItemVisibilityGone",
-                rhp.isNullItemVisibilityGone());
-        testHeaderPresenter(rhp);
-    }
-
-    public void testPlaybackControlsRowPresenter() {
-        setContext(new ContextThemeWrapper(getContext(), R.style.Theme_Leanback));
-        Presenter detailsPresenter = new AbstractDetailsDescriptionPresenter() {
-            @Override
-            protected void onBindDescription(ViewHolder vh, Object item) {
-                vh.getTitle().setText("The quick brown fox jumped over the lazy dog");
-                vh.getSubtitle().setText("Subtitle");
-            }
-        };
-        PlaybackControlsRowPresenter controlsRowPresenter = new PlaybackControlsRowPresenter(
-                detailsPresenter);
-        PlaybackControlsRowPresenter.ViewHolder vh = (PlaybackControlsRowPresenter.ViewHolder)
-                controlsRowPresenter.onCreateViewHolder(new FrameLayout(getContext()));
-
-        Object item = new Object();
-        PlaybackControlsRow controlsRow = new PlaybackControlsRow(item);
-
-        controlsRowPresenter.onBindRowViewHolder(vh, controlsRow);
-        assertEquals("Controls card right panel layout height",
-                vh.view.findViewById(R.id.controls_card_right_panel).getLayoutParams().height,
-                LayoutParams.WRAP_CONTENT);
-        assertEquals("Description dock layout height",
-                vh.view.findViewById(R.id.description_dock).getLayoutParams().height,
-                LayoutParams.WRAP_CONTENT);
-        controlsRowPresenter.onUnbindRowViewHolder(vh);
-
-        controlsRow.setImageBitmap(
-                getContext(), Bitmap.createBitmap(10, 10, Bitmap.Config.ARGB_8888));
-        controlsRowPresenter.onBindRowViewHolder(vh, controlsRow);
-        AssertHelper.assertGreaterThan("Controls card right panel layout height",
-                vh.view.findViewById(R.id.controls_card_right_panel).getLayoutParams().height, 0);
-        assertEquals("Description dock layout height",
-                vh.view.findViewById(R.id.description_dock).getLayoutParams().height, 0);
-        controlsRowPresenter.onUnbindRowViewHolder(vh);
-    }
-}
diff --git a/v4/Android.mk b/v4/Android.mk
index 1e8adad..8063cb3 100644
--- a/v4/Android.mk
+++ b/v4/Android.mk
@@ -14,274 +14,109 @@
 
 LOCAL_PATH := $(call my-dir)
 
-# A helper sub-library that makes direct use of Donut APIs.
-include $(CLEAR_VARS)
-LOCAL_MODULE := android-support-v4-donut
-LOCAL_SDK_VERSION := 4
-LOCAL_SRC_FILES := $(call all-java-files-under, donut)
-LOCAL_STATIC_JAVA_LIBRARIES := android-support-annotations
-LOCAL_JAVA_LANGUAGE_VERSION := 1.7
-include $(BUILD_STATIC_JAVA_LIBRARY)
-
-support_module_src_files := $(LOCAL_SRC_FILES)
-support_module_java_libraries := android-support-annotations
-
-# -----------------------------------------------------------------------
-
-# A helper sub-library that makes direct use of Eclair APIs.
-include $(CLEAR_VARS)
-LOCAL_MODULE := android-support-v4-eclair
-LOCAL_SDK_VERSION := 5
-LOCAL_SRC_FILES := $(call all-java-files-under, eclair)
-LOCAL_STATIC_JAVA_LIBRARIES := android-support-v4-donut
-LOCAL_JAVA_LANGUAGE_VERSION := 1.7
-include $(BUILD_STATIC_JAVA_LIBRARY)
-
-support_module_src_files += $(LOCAL_SRC_FILES)
-
-# -----------------------------------------------------------------------
-
-# A helper sub-library that makes direct use of Eclair MR1 APIs.
-include $(CLEAR_VARS)
-LOCAL_MODULE := android-support-v4-eclair-mr1
-LOCAL_SDK_VERSION := 7
-LOCAL_SRC_FILES := $(call all-java-files-under, eclair-mr1)
-LOCAL_STATIC_JAVA_LIBRARIES := android-support-v4-eclair
-LOCAL_JAVA_LANGUAGE_VERSION := 1.7
-include $(BUILD_STATIC_JAVA_LIBRARY)
-
-support_module_src_files += $(LOCAL_SRC_FILES)
-
-# -----------------------------------------------------------------------
-
-# A helper sub-library that makes direct use of Froyo APIs.
-include $(CLEAR_VARS)
-LOCAL_MODULE := android-support-v4-froyo
-LOCAL_SDK_VERSION := 8
-LOCAL_SRC_FILES := $(call all-java-files-under, froyo)
-LOCAL_STATIC_JAVA_LIBRARIES := android-support-v4-eclair-mr1
-LOCAL_JAVA_LANGUAGE_VERSION := 1.7
-include $(BUILD_STATIC_JAVA_LIBRARY)
-
-support_module_src_files += $(LOCAL_SRC_FILES)
-
-# -----------------------------------------------------------------------
-
 # A helper sub-library that makes direct use of Gingerbread APIs.
 include $(CLEAR_VARS)
-LOCAL_MODULE := android-support-v4-gingerbread
+LOCAL_MODULE := android-support-core-utils-gingerbread
 LOCAL_SDK_VERSION := 9
 LOCAL_SRC_FILES := $(call all-java-files-under, gingerbread)
-LOCAL_STATIC_JAVA_LIBRARIES := android-support-v4-froyo
+LOCAL_STATIC_JAVA_LIBRARIES := \
+    android-support-annotations \
+    android-support-compat
 LOCAL_JAVA_LANGUAGE_VERSION := 1.7
 include $(BUILD_STATIC_JAVA_LIBRARY)
 
-support_module_src_files += $(LOCAL_SRC_FILES)
-
 # -----------------------------------------------------------------------
 
 # A helper sub-library that makes direct use of Honeycomb APIs.
 include $(CLEAR_VARS)
-LOCAL_MODULE := android-support-v4-honeycomb
+LOCAL_MODULE := android-support-core-utils-honeycomb
 LOCAL_SDK_VERSION := 11
 LOCAL_SRC_FILES := $(call all-java-files-under, honeycomb)
-LOCAL_STATIC_JAVA_LIBRARIES := android-support-v4-gingerbread
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-core-utils-gingerbread
 LOCAL_JAVA_LANGUAGE_VERSION := 1.7
 include $(BUILD_STATIC_JAVA_LIBRARY)
 
-support_module_src_files += $(LOCAL_SRC_FILES)
-
-# -----------------------------------------------------------------------
-
-# A helper sub-library that makes direct use of Honeycomb MR1 APIs.
-include $(CLEAR_VARS)
-LOCAL_MODULE := android-support-v4-honeycomb-mr1
-LOCAL_SDK_VERSION := 12
-LOCAL_SRC_FILES := $(call all-java-files-under, honeycomb_mr1)
-LOCAL_STATIC_JAVA_LIBRARIES := android-support-v4-honeycomb
-LOCAL_JAVA_LANGUAGE_VERSION := 1.7
-include $(BUILD_STATIC_JAVA_LIBRARY)
-
-support_module_src_files += $(LOCAL_SRC_FILES)
-
-# -----------------------------------------------------------------------
-
-# A helper sub-library that makes direct use of Honeycomb MR2 APIs.
-include $(CLEAR_VARS)
-LOCAL_MODULE := android-support-v4-honeycomb-mr2
-LOCAL_SDK_VERSION := 13
-LOCAL_SRC_FILES := $(call all-java-files-under, honeycomb_mr2)
-LOCAL_STATIC_JAVA_LIBRARIES := android-support-v4-honeycomb-mr1
-LOCAL_JAVA_LANGUAGE_VERSION := 1.7
-include $(BUILD_STATIC_JAVA_LIBRARY)
-
-support_module_src_files += $(LOCAL_SRC_FILES)
-
-# -----------------------------------------------------------------------
-
-# A helper sub-library that makes direct use of Ice Cream Sandwich APIs.
-include $(CLEAR_VARS)
-LOCAL_MODULE := android-support-v4-ics
-LOCAL_SDK_VERSION := 14
-LOCAL_SRC_FILES := $(call all-java-files-under, ics)
-LOCAL_STATIC_JAVA_LIBRARIES := android-support-v4-honeycomb-mr2
-LOCAL_JAVA_LANGUAGE_VERSION := 1.7
-include $(BUILD_STATIC_JAVA_LIBRARY)
-
-support_module_src_files += $(LOCAL_SRC_FILES)
-
-# -----------------------------------------------------------------------
-
-# A helper sub-library that makes direct use of Ice Cream Sandwich MR1 APIs.
-include $(CLEAR_VARS)
-LOCAL_MODULE := android-support-v4-ics-mr1
-LOCAL_SDK_VERSION := 15
-LOCAL_SRC_FILES := $(call all-java-files-under, ics-mr1)
-LOCAL_STATIC_JAVA_LIBRARIES := android-support-v4-ics
-LOCAL_JAVA_LANGUAGE_VERSION := 1.7
-include $(BUILD_STATIC_JAVA_LIBRARY)
-
-support_module_src_files += $(LOCAL_SRC_FILES)
-
 # -----------------------------------------------------------------------
 
 # A helper sub-library that makes direct use of JellyBean APIs.
 include $(CLEAR_VARS)
-LOCAL_MODULE := android-support-v4-jellybean
+LOCAL_MODULE := android-support-core-utils-jellybean
 LOCAL_SDK_VERSION := 16
 LOCAL_SRC_FILES := $(call all-java-files-under, jellybean)
-LOCAL_STATIC_JAVA_LIBRARIES := android-support-v4-ics-mr1
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-core-utils-honeycomb
 LOCAL_JAVA_LANGUAGE_VERSION := 1.7
 include $(BUILD_STATIC_JAVA_LIBRARY)
 
-support_module_src_files += $(LOCAL_SRC_FILES)
-
-# -----------------------------------------------------------------------
-
-# A helper sub-library that makes direct use of JellyBean MR1 APIs.
-include $(CLEAR_VARS)
-LOCAL_MODULE := android-support-v4-jellybean-mr1
-LOCAL_SDK_VERSION := 17
-LOCAL_SRC_FILES := $(call all-java-files-under, jellybean-mr1)
-LOCAL_STATIC_JAVA_LIBRARIES := android-support-v4-jellybean
-LOCAL_JAVA_LANGUAGE_VERSION := 1.7
-include $(BUILD_STATIC_JAVA_LIBRARY)
-
-support_module_src_files += $(LOCAL_SRC_FILES)
-
-# -----------------------------------------------------------------------
-
-# A helper sub-library that makes direct use of JellyBean MR2 APIs.
-include $(CLEAR_VARS)
-LOCAL_MODULE := android-support-v4-jellybean-mr2
-LOCAL_SDK_VERSION := 18
-LOCAL_SRC_FILES := $(call all-java-files-under, jellybean-mr2)
-LOCAL_STATIC_JAVA_LIBRARIES := android-support-v4-jellybean-mr1
-LOCAL_JAVA_LANGUAGE_VERSION := 1.7
-include $(BUILD_STATIC_JAVA_LIBRARY)
-
-support_module_src_files += $(LOCAL_SRC_FILES)
-
 # -----------------------------------------------------------------------
 
 # A helper sub-library that makes direct use of KitKat APIs.
 include $(CLEAR_VARS)
-LOCAL_MODULE := android-support-v4-kitkat
+LOCAL_MODULE := android-support-core-utils-kitkat
 LOCAL_SDK_VERSION := 19
 LOCAL_SRC_FILES := $(call all-java-files-under, kitkat)
-LOCAL_STATIC_JAVA_LIBRARIES := android-support-v4-jellybean-mr2
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-core-utils-jellybean
 LOCAL_JAVA_LANGUAGE_VERSION := 1.7
 include $(BUILD_STATIC_JAVA_LIBRARY)
 
-support_module_src_files += $(LOCAL_SRC_FILES)
-
 # -----------------------------------------------------------------------
 
 # A helper sub-library that makes direct use of V20 APIs.
 include $(CLEAR_VARS)
-LOCAL_MODULE := android-support-v4-api20
+LOCAL_MODULE := android-support-core-utils-api20
 LOCAL_SDK_VERSION := 20
 LOCAL_SRC_FILES := $(call all-java-files-under, api20)
-LOCAL_STATIC_JAVA_LIBRARIES := android-support-v4-kitkat
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-core-utils-kitkat
 LOCAL_JAVA_LANGUAGE_VERSION := 1.7
 include $(BUILD_STATIC_JAVA_LIBRARY)
 
-support_module_src_files += $(LOCAL_SRC_FILES)
-
 # -----------------------------------------------------------------------
 
 # A helper sub-library that makes direct use of Lollipop APIs.
 include $(CLEAR_VARS)
-LOCAL_MODULE := android-support-v4-api21
+LOCAL_MODULE := android-support-core-utils-api21
 LOCAL_SDK_VERSION := 21
 LOCAL_SRC_FILES := $(call all-java-files-under, api21)
-LOCAL_STATIC_JAVA_LIBRARIES := android-support-v4-api20
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-core-utils-api20
 LOCAL_JAVA_LANGUAGE_VERSION := 1.7
 include $(BUILD_STATIC_JAVA_LIBRARY)
 
-support_module_src_files += $(LOCAL_SRC_FILES)
-
-# -----------------------------------------------------------------------
-
-# A helper sub-library that makes direct use of V22 APIs.
-include $(CLEAR_VARS)
-LOCAL_MODULE := android-support-v4-api22
-LOCAL_SDK_VERSION := 22
-LOCAL_SRC_FILES := $(call all-java-files-under, api22)
-LOCAL_STATIC_JAVA_LIBRARIES := android-support-v4-api21
-LOCAL_JAVA_LANGUAGE_VERSION := 1.7
-include $(BUILD_STATIC_JAVA_LIBRARY)
-
-support_module_src_files += $(LOCAL_SRC_FILES)
-
 # -----------------------------------------------------------------------
 
 # A helper sub-library that makes direct use of V23 APIs.
 include $(CLEAR_VARS)
-LOCAL_MODULE := android-support-v4-api23
+LOCAL_MODULE := android-support-core-utils-api23
 LOCAL_SDK_VERSION := 23
 LOCAL_SRC_FILES := $(call all-java-files-under, api23)
-LOCAL_STATIC_JAVA_LIBRARIES := android-support-v4-api22
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-core-utils-api21
 LOCAL_JAVA_LANGUAGE_VERSION := 1.7
 include $(BUILD_STATIC_JAVA_LIBRARY)
 
-support_module_src_files += $(LOCAL_SRC_FILES)
-
 # -----------------------------------------------------------------------
 
 # A helper sub-library that makes direct use of V24 APIs.
 include $(CLEAR_VARS)
-LOCAL_MODULE := android-support-v4-api24
+LOCAL_MODULE := android-support-core-utils-api24
 LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
 LOCAL_SRC_FILES := $(call all-java-files-under, api24)
-LOCAL_STATIC_JAVA_LIBRARIES := android-support-v4-api23
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-core-utils-api23
 LOCAL_JAVA_LANGUAGE_VERSION := 1.7
 include $(BUILD_STATIC_JAVA_LIBRARY)
 
-support_module_src_files += $(LOCAL_SRC_FILES)
-
 # -----------------------------------------------------------------------
 
 # Here is the final static library that apps can link against.
 include $(CLEAR_VARS)
 LOCAL_USE_AAPT2 := true
-LOCAL_MODULE := android-support-v4
-LOCAL_SDK_VERSION := 4
+LOCAL_MODULE := android-support-core-utils
+LOCAL_SDK_VERSION := 9
 LOCAL_AIDL_INCLUDES := frameworks/support/v4/java
 LOCAL_SRC_FILES := $(call all-java-files-under, java) \
     $(call all-Iaidl-files-under, java)
 LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
-LOCAL_STATIC_JAVA_LIBRARIES += android-support-v4-api24
+LOCAL_STATIC_JAVA_LIBRARIES += android-support-core-utils-api24
+LOCAL_SHARED_ANDROID_LIBRARIES := \
+    android-support-compat \
+    android-support-annotations
 LOCAL_JAR_EXCLUDE_FILES := none
 LOCAL_JAVA_LANGUAGE_VERSION := 1.7
 include $(BUILD_STATIC_JAVA_LIBRARY)
-
-support_module_src_files += $(LOCAL_SRC_FILES)
-support_module_aidl_includes := $(LOCAL_AIDL_INCLUDES)
-
-# API Check
-# ---------------------------------------------
-support_module := $(LOCAL_MODULE)
-support_module_api_dir := $(LOCAL_PATH)/api
-support_module_java_packages := android.support.v4.*
-include $(SUPPORT_API_CHECK)
diff --git a/v4/AndroidManifest.xml b/v4/AndroidManifest.xml
index 01eaccf..586a28e 100644
--- a/v4/AndroidManifest.xml
+++ b/v4/AndroidManifest.xml
@@ -15,7 +15,7 @@
 -->
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
           xmlns:tools="http://schemas.android.com/tools"
-          package="android.support.v4">
-    <uses-sdk android:minSdkVersion="4" tools:overrideLibrary="android.support.v4"/>
+          package="android.support.coreutils">
+    <uses-sdk android:minSdkVersion="9" tools:overrideLibrary="android.support.coreutils"/>
     <application />
 </manifest>
diff --git a/v4/api/22.0.0.txt b/v4/api/22.0.0.txt
deleted file mode 100644
index af014f4..0000000
--- a/v4/api/22.0.0.txt
+++ /dev/null
@@ -1,2849 +0,0 @@
-package android.support.v4.accessibilityservice {
-
-  public class AccessibilityServiceInfoCompat {
-    method public static java.lang.String capabilityToString(int);
-    method public static java.lang.String feedbackTypeToString(int);
-    method public static java.lang.String flagToString(int);
-    method public static boolean getCanRetrieveWindowContent(android.accessibilityservice.AccessibilityServiceInfo);
-    method public static int getCapabilities(android.accessibilityservice.AccessibilityServiceInfo);
-    method public static java.lang.String getDescription(android.accessibilityservice.AccessibilityServiceInfo);
-    method public static java.lang.String getId(android.accessibilityservice.AccessibilityServiceInfo);
-    method public static android.content.pm.ResolveInfo getResolveInfo(android.accessibilityservice.AccessibilityServiceInfo);
-    method public static java.lang.String getSettingsActivityName(android.accessibilityservice.AccessibilityServiceInfo);
-    field public static final int CAPABILITY_CAN_FILTER_KEY_EVENTS = 8; // 0x8
-    field public static final int CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 4; // 0x4
-    field public static final int CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION = 2; // 0x2
-    field public static final int CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT = 1; // 0x1
-    field public static final int DEFAULT = 1; // 0x1
-    field public static final int FEEDBACK_ALL_MASK = -1; // 0xffffffff
-    field public static final int FEEDBACK_BRAILLE = 32; // 0x20
-    field public static final int FLAG_INCLUDE_NOT_IMPORTANT_VIEWS = 2; // 0x2
-    field public static final int FLAG_REPORT_VIEW_IDS = 16; // 0x10
-    field public static final int FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 8; // 0x8
-    field public static final int FLAG_REQUEST_FILTER_KEY_EVENTS = 32; // 0x20
-    field public static final int FLAG_REQUEST_TOUCH_EXPLORATION_MODE = 4; // 0x4
-  }
-
-}
-
-package android.support.v4.app {
-
-  public deprecated class ActionBarDrawerToggle implements android.support.v4.widget.DrawerLayout.DrawerListener {
-    ctor public ActionBarDrawerToggle(android.app.Activity, android.support.v4.widget.DrawerLayout, int, int, int);
-    ctor public ActionBarDrawerToggle(android.app.Activity, android.support.v4.widget.DrawerLayout, boolean, int, int, int);
-    method public boolean isDrawerIndicatorEnabled();
-    method public void onConfigurationChanged(android.content.res.Configuration);
-    method public void onDrawerClosed(android.view.View);
-    method public void onDrawerOpened(android.view.View);
-    method public void onDrawerSlide(android.view.View, float);
-    method public void onDrawerStateChanged(int);
-    method public boolean onOptionsItemSelected(android.view.MenuItem);
-    method public void setDrawerIndicatorEnabled(boolean);
-    method public void setHomeAsUpIndicator(android.graphics.drawable.Drawable);
-    method public void setHomeAsUpIndicator(int);
-    method public void syncState();
-  }
-
-  public static abstract interface ActionBarDrawerToggle.Delegate {
-    method public abstract android.graphics.drawable.Drawable getThemeUpIndicator();
-    method public abstract void setActionBarDescription(int);
-    method public abstract void setActionBarUpIndicator(android.graphics.drawable.Drawable, int);
-  }
-
-  public static abstract interface ActionBarDrawerToggle.DelegateProvider {
-    method public abstract android.support.v4.app.ActionBarDrawerToggle.Delegate getDrawerToggleDelegate();
-  }
-
-  public class ActivityCompat extends android.support.v4.content.ContextCompat {
-    ctor public ActivityCompat();
-    method public static void finishAffinity(android.app.Activity);
-    method public static void finishAfterTransition(android.app.Activity);
-    method public static boolean invalidateOptionsMenu(android.app.Activity);
-    method public static void postponeEnterTransition(android.app.Activity);
-    method public static void setEnterSharedElementCallback(android.app.Activity, android.support.v4.app.SharedElementCallback);
-    method public static void setExitSharedElementCallback(android.app.Activity, android.support.v4.app.SharedElementCallback);
-    method public static void startActivity(android.app.Activity, android.content.Intent, android.os.Bundle);
-    method public static void startActivityForResult(android.app.Activity, android.content.Intent, int, android.os.Bundle);
-    method public static void startPostponedEnterTransition(android.app.Activity);
-  }
-
-  public final class ActivityManagerCompat {
-    method public static boolean isLowRamDevice(android.app.ActivityManager);
-  }
-
-  public class ActivityOptionsCompat {
-    ctor protected ActivityOptionsCompat();
-    method public static android.support.v4.app.ActivityOptionsCompat makeCustomAnimation(android.content.Context, int, int);
-    method public static android.support.v4.app.ActivityOptionsCompat makeScaleUpAnimation(android.view.View, int, int, int, int);
-    method public static android.support.v4.app.ActivityOptionsCompat makeSceneTransitionAnimation(android.app.Activity, android.view.View, java.lang.String);
-    method public static android.support.v4.app.ActivityOptionsCompat makeSceneTransitionAnimation(android.app.Activity, android.support.v4.util.Pair<android.view.View, java.lang.String>...);
-    method public static android.support.v4.app.ActivityOptionsCompat makeThumbnailScaleUpAnimation(android.view.View, android.graphics.Bitmap, int, int);
-    method public android.os.Bundle toBundle();
-    method public void update(android.support.v4.app.ActivityOptionsCompat);
-  }
-
-  public class DialogFragment extends android.support.v4.app.Fragment implements android.content.DialogInterface.OnCancelListener android.content.DialogInterface.OnDismissListener {
-    ctor public DialogFragment();
-    method public void dismiss();
-    method public void dismissAllowingStateLoss();
-    method public android.app.Dialog getDialog();
-    method public boolean getShowsDialog();
-    method public int getTheme();
-    method public boolean isCancelable();
-    method public void onCancel(android.content.DialogInterface);
-    method public android.app.Dialog onCreateDialog(android.os.Bundle);
-    method public void onDismiss(android.content.DialogInterface);
-    method public void setCancelable(boolean);
-    method public void setShowsDialog(boolean);
-    method public void setStyle(int, int);
-    method public void show(android.support.v4.app.FragmentManager, java.lang.String);
-    method public int show(android.support.v4.app.FragmentTransaction, java.lang.String);
-    field public static final int STYLE_NORMAL = 0; // 0x0
-    field public static final int STYLE_NO_FRAME = 2; // 0x2
-    field public static final int STYLE_NO_INPUT = 3; // 0x3
-    field public static final int STYLE_NO_TITLE = 1; // 0x1
-  }
-
-  public class Fragment implements android.content.ComponentCallbacks android.view.View.OnCreateContextMenuListener {
-    ctor public Fragment();
-    method public void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
-    method public final boolean equals(java.lang.Object);
-    method public final android.support.v4.app.FragmentActivity getActivity();
-    method public boolean getAllowEnterTransitionOverlap();
-    method public boolean getAllowReturnTransitionOverlap();
-    method public final android.os.Bundle getArguments();
-    method public final android.support.v4.app.FragmentManager getChildFragmentManager();
-    method public java.lang.Object getEnterTransition();
-    method public java.lang.Object getExitTransition();
-    method public final android.support.v4.app.FragmentManager getFragmentManager();
-    method public final int getId();
-    method public android.support.v4.app.LoaderManager getLoaderManager();
-    method public final android.support.v4.app.Fragment getParentFragment();
-    method public java.lang.Object getReenterTransition();
-    method public final android.content.res.Resources getResources();
-    method public final boolean getRetainInstance();
-    method public java.lang.Object getReturnTransition();
-    method public java.lang.Object getSharedElementEnterTransition();
-    method public java.lang.Object getSharedElementReturnTransition();
-    method public final java.lang.String getString(int);
-    method public final java.lang.String getString(int, java.lang.Object...);
-    method public final java.lang.String getTag();
-    method public final android.support.v4.app.Fragment getTargetFragment();
-    method public final int getTargetRequestCode();
-    method public final java.lang.CharSequence getText(int);
-    method public boolean getUserVisibleHint();
-    method public android.view.View getView();
-    method public final int hashCode();
-    method public static android.support.v4.app.Fragment instantiate(android.content.Context, java.lang.String);
-    method public static android.support.v4.app.Fragment instantiate(android.content.Context, java.lang.String, android.os.Bundle);
-    method public final boolean isAdded();
-    method public final boolean isDetached();
-    method public final boolean isHidden();
-    method public final boolean isInLayout();
-    method public final boolean isRemoving();
-    method public final boolean isResumed();
-    method public final boolean isVisible();
-    method public void onActivityCreated(android.os.Bundle);
-    method public void onActivityResult(int, int, android.content.Intent);
-    method public void onAttach(android.app.Activity);
-    method public void onConfigurationChanged(android.content.res.Configuration);
-    method public boolean onContextItemSelected(android.view.MenuItem);
-    method public void onCreate(android.os.Bundle);
-    method public android.view.animation.Animation onCreateAnimation(int, boolean, int);
-    method public void onCreateContextMenu(android.view.ContextMenu, android.view.View, android.view.ContextMenu.ContextMenuInfo);
-    method public void onCreateOptionsMenu(android.view.Menu, android.view.MenuInflater);
-    method public android.view.View onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
-    method public void onDestroy();
-    method public void onDestroyOptionsMenu();
-    method public void onDestroyView();
-    method public void onDetach();
-    method public void onHiddenChanged(boolean);
-    method public void onInflate(android.app.Activity, android.util.AttributeSet, android.os.Bundle);
-    method public void onLowMemory();
-    method public boolean onOptionsItemSelected(android.view.MenuItem);
-    method public void onOptionsMenuClosed(android.view.Menu);
-    method public void onPause();
-    method public void onPrepareOptionsMenu(android.view.Menu);
-    method public void onResume();
-    method public void onSaveInstanceState(android.os.Bundle);
-    method public void onStart();
-    method public void onStop();
-    method public void onViewCreated(android.view.View, android.os.Bundle);
-    method public void onViewStateRestored(android.os.Bundle);
-    method public void registerForContextMenu(android.view.View);
-    method public void setAllowEnterTransitionOverlap(boolean);
-    method public void setAllowReturnTransitionOverlap(boolean);
-    method public void setArguments(android.os.Bundle);
-    method public void setEnterSharedElementCallback(android.support.v4.app.SharedElementCallback);
-    method public void setEnterTransition(java.lang.Object);
-    method public void setExitSharedElementCallback(android.support.v4.app.SharedElementCallback);
-    method public void setExitTransition(java.lang.Object);
-    method public void setHasOptionsMenu(boolean);
-    method public void setInitialSavedState(android.support.v4.app.Fragment.SavedState);
-    method public void setMenuVisibility(boolean);
-    method public void setReenterTransition(java.lang.Object);
-    method public void setRetainInstance(boolean);
-    method public void setReturnTransition(java.lang.Object);
-    method public void setSharedElementEnterTransition(java.lang.Object);
-    method public void setSharedElementReturnTransition(java.lang.Object);
-    method public void setTargetFragment(android.support.v4.app.Fragment, int);
-    method public void setUserVisibleHint(boolean);
-    method public void startActivity(android.content.Intent);
-    method public void startActivityForResult(android.content.Intent, int);
-    method public void unregisterForContextMenu(android.view.View);
-  }
-
-  public static class Fragment.InstantiationException extends java.lang.RuntimeException {
-    ctor public Fragment.InstantiationException(java.lang.String, java.lang.Exception);
-  }
-
-  public static class Fragment.SavedState implements android.os.Parcelable {
-    method public int describeContents();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.support.v4.app.Fragment.SavedState> CREATOR;
-  }
-
-  public class FragmentActivity extends android.app.Activity {
-    ctor public FragmentActivity();
-    method public java.lang.Object getLastCustomNonConfigurationInstance();
-    method public android.support.v4.app.FragmentManager getSupportFragmentManager();
-    method public android.support.v4.app.LoaderManager getSupportLoaderManager();
-    method public void onAttachFragment(android.support.v4.app.Fragment);
-    method protected void onResumeFragments();
-    method public java.lang.Object onRetainCustomNonConfigurationInstance();
-    method public final java.lang.Object onRetainNonConfigurationInstance();
-    method public void setEnterSharedElementCallback(android.support.v4.app.SharedElementCallback);
-    method public void setExitSharedElementCallback(android.support.v4.app.SharedElementCallback);
-    method public void startActivityFromFragment(android.support.v4.app.Fragment, android.content.Intent, int);
-    method public void supportFinishAfterTransition();
-    method public void supportInvalidateOptionsMenu();
-    method public void supportPostponeEnterTransition();
-    method public void supportStartPostponedEnterTransition();
-  }
-
-  public abstract class FragmentManager {
-    ctor public FragmentManager();
-    method public abstract void addOnBackStackChangedListener(android.support.v4.app.FragmentManager.OnBackStackChangedListener);
-    method public abstract android.support.v4.app.FragmentTransaction beginTransaction();
-    method public abstract void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
-    method public static void enableDebugLogging(boolean);
-    method public abstract boolean executePendingTransactions();
-    method public abstract android.support.v4.app.Fragment findFragmentById(int);
-    method public abstract android.support.v4.app.Fragment findFragmentByTag(java.lang.String);
-    method public abstract android.support.v4.app.FragmentManager.BackStackEntry getBackStackEntryAt(int);
-    method public abstract int getBackStackEntryCount();
-    method public abstract android.support.v4.app.Fragment getFragment(android.os.Bundle, java.lang.String);
-    method public abstract boolean isDestroyed();
-    method public abstract void popBackStack();
-    method public abstract void popBackStack(java.lang.String, int);
-    method public abstract void popBackStack(int, int);
-    method public abstract boolean popBackStackImmediate();
-    method public abstract boolean popBackStackImmediate(java.lang.String, int);
-    method public abstract boolean popBackStackImmediate(int, int);
-    method public abstract void putFragment(android.os.Bundle, java.lang.String, android.support.v4.app.Fragment);
-    method public abstract void removeOnBackStackChangedListener(android.support.v4.app.FragmentManager.OnBackStackChangedListener);
-    method public abstract android.support.v4.app.Fragment.SavedState saveFragmentInstanceState(android.support.v4.app.Fragment);
-    field public static final int POP_BACK_STACK_INCLUSIVE = 1; // 0x1
-  }
-
-  public static abstract interface FragmentManager.BackStackEntry {
-    method public abstract java.lang.CharSequence getBreadCrumbShortTitle();
-    method public abstract int getBreadCrumbShortTitleRes();
-    method public abstract java.lang.CharSequence getBreadCrumbTitle();
-    method public abstract int getBreadCrumbTitleRes();
-    method public abstract int getId();
-    method public abstract java.lang.String getName();
-  }
-
-  public static abstract interface FragmentManager.OnBackStackChangedListener {
-    method public abstract void onBackStackChanged();
-  }
-
-  public abstract class FragmentPagerAdapter extends android.support.v4.view.PagerAdapter {
-    ctor public FragmentPagerAdapter(android.support.v4.app.FragmentManager);
-    method public abstract android.support.v4.app.Fragment getItem(int);
-    method public long getItemId(int);
-    method public boolean isViewFromObject(android.view.View, java.lang.Object);
-  }
-
-  public abstract class FragmentStatePagerAdapter extends android.support.v4.view.PagerAdapter {
-    ctor public FragmentStatePagerAdapter(android.support.v4.app.FragmentManager);
-    method public abstract android.support.v4.app.Fragment getItem(int);
-    method public boolean isViewFromObject(android.view.View, java.lang.Object);
-  }
-
-  public class FragmentTabHost extends android.widget.TabHost implements android.widget.TabHost.OnTabChangeListener {
-    ctor public FragmentTabHost(android.content.Context);
-    ctor public FragmentTabHost(android.content.Context, android.util.AttributeSet);
-    method public void addTab(android.widget.TabHost.TabSpec, java.lang.Class<?>, android.os.Bundle);
-    method public void onTabChanged(java.lang.String);
-    method public void setup(android.content.Context, android.support.v4.app.FragmentManager);
-    method public void setup(android.content.Context, android.support.v4.app.FragmentManager, int);
-  }
-
-  public abstract class FragmentTransaction {
-    ctor public FragmentTransaction();
-    method public abstract android.support.v4.app.FragmentTransaction add(android.support.v4.app.Fragment, java.lang.String);
-    method public abstract android.support.v4.app.FragmentTransaction add(int, android.support.v4.app.Fragment);
-    method public abstract android.support.v4.app.FragmentTransaction add(int, android.support.v4.app.Fragment, java.lang.String);
-    method public abstract android.support.v4.app.FragmentTransaction addSharedElement(android.view.View, java.lang.String);
-    method public abstract android.support.v4.app.FragmentTransaction addToBackStack(java.lang.String);
-    method public abstract android.support.v4.app.FragmentTransaction attach(android.support.v4.app.Fragment);
-    method public abstract int commit();
-    method public abstract int commitAllowingStateLoss();
-    method public abstract android.support.v4.app.FragmentTransaction detach(android.support.v4.app.Fragment);
-    method public abstract android.support.v4.app.FragmentTransaction disallowAddToBackStack();
-    method public abstract android.support.v4.app.FragmentTransaction hide(android.support.v4.app.Fragment);
-    method public abstract boolean isAddToBackStackAllowed();
-    method public abstract boolean isEmpty();
-    method public abstract android.support.v4.app.FragmentTransaction remove(android.support.v4.app.Fragment);
-    method public abstract android.support.v4.app.FragmentTransaction replace(int, android.support.v4.app.Fragment);
-    method public abstract android.support.v4.app.FragmentTransaction replace(int, android.support.v4.app.Fragment, java.lang.String);
-    method public abstract android.support.v4.app.FragmentTransaction setBreadCrumbShortTitle(int);
-    method public abstract android.support.v4.app.FragmentTransaction setBreadCrumbShortTitle(java.lang.CharSequence);
-    method public abstract android.support.v4.app.FragmentTransaction setBreadCrumbTitle(int);
-    method public abstract android.support.v4.app.FragmentTransaction setBreadCrumbTitle(java.lang.CharSequence);
-    method public abstract android.support.v4.app.FragmentTransaction setCustomAnimations(int, int);
-    method public abstract android.support.v4.app.FragmentTransaction setCustomAnimations(int, int, int, int);
-    method public abstract android.support.v4.app.FragmentTransaction setTransition(int);
-    method public abstract android.support.v4.app.FragmentTransaction setTransitionStyle(int);
-    method public abstract android.support.v4.app.FragmentTransaction show(android.support.v4.app.Fragment);
-    field public static final int TRANSIT_ENTER_MASK = 4096; // 0x1000
-    field public static final int TRANSIT_EXIT_MASK = 8192; // 0x2000
-    field public static final int TRANSIT_FRAGMENT_CLOSE = 8194; // 0x2002
-    field public static final int TRANSIT_FRAGMENT_FADE = 4099; // 0x1003
-    field public static final int TRANSIT_FRAGMENT_OPEN = 4097; // 0x1001
-    field public static final int TRANSIT_NONE = 0; // 0x0
-    field public static final int TRANSIT_UNSET = -1; // 0xffffffff
-  }
-
-  public class ListFragment extends android.support.v4.app.Fragment {
-    ctor public ListFragment();
-    method public android.widget.ListAdapter getListAdapter();
-    method public android.widget.ListView getListView();
-    method public long getSelectedItemId();
-    method public int getSelectedItemPosition();
-    method public void onListItemClick(android.widget.ListView, android.view.View, int, long);
-    method public void setEmptyText(java.lang.CharSequence);
-    method public void setListAdapter(android.widget.ListAdapter);
-    method public void setListShown(boolean);
-    method public void setListShownNoAnimation(boolean);
-    method public void setSelection(int);
-  }
-
-  public abstract class LoaderManager {
-    ctor public LoaderManager();
-    method public abstract void destroyLoader(int);
-    method public abstract void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
-    method public static void enableDebugLogging(boolean);
-    method public abstract android.support.v4.content.Loader<D> getLoader(int);
-    method public boolean hasRunningLoaders();
-    method public abstract android.support.v4.content.Loader<D> initLoader(int, android.os.Bundle, android.support.v4.app.LoaderManager.LoaderCallbacks<D>);
-    method public abstract android.support.v4.content.Loader<D> restartLoader(int, android.os.Bundle, android.support.v4.app.LoaderManager.LoaderCallbacks<D>);
-  }
-
-  public static abstract interface LoaderManager.LoaderCallbacks {
-    method public abstract android.support.v4.content.Loader<D> onCreateLoader(int, android.os.Bundle);
-    method public abstract void onLoadFinished(android.support.v4.content.Loader<D>, D);
-    method public abstract void onLoaderReset(android.support.v4.content.Loader<D>);
-  }
-
-  public class NavUtils {
-    method public static android.content.Intent getParentActivityIntent(android.app.Activity);
-    method public static android.content.Intent getParentActivityIntent(android.content.Context, java.lang.Class<?>) throws android.content.pm.PackageManager.NameNotFoundException;
-    method public static android.content.Intent getParentActivityIntent(android.content.Context, android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
-    method public static java.lang.String getParentActivityName(android.app.Activity);
-    method public static java.lang.String getParentActivityName(android.content.Context, android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
-    method public static void navigateUpFromSameTask(android.app.Activity);
-    method public static void navigateUpTo(android.app.Activity, android.content.Intent);
-    method public static boolean shouldUpRecreateTask(android.app.Activity, android.content.Intent);
-    field public static final java.lang.String PARENT_ACTIVITY = "android.support.PARENT_ACTIVITY";
-  }
-
-  public class NotificationCompat {
-    ctor public NotificationCompat();
-    method public static android.support.v4.app.NotificationCompat.Action getAction(android.app.Notification, int);
-    method public static int getActionCount(android.app.Notification);
-    method public static java.lang.String getCategory(android.app.Notification);
-    method public static android.os.Bundle getExtras(android.app.Notification);
-    method public static java.lang.String getGroup(android.app.Notification);
-    method public static boolean getLocalOnly(android.app.Notification);
-    method public static java.lang.String getSortKey(android.app.Notification);
-    method public static boolean isGroupSummary(android.app.Notification);
-    field public static final java.lang.String CATEGORY_ALARM = "alarm";
-    field public static final java.lang.String CATEGORY_CALL = "call";
-    field public static final java.lang.String CATEGORY_EMAIL = "email";
-    field public static final java.lang.String CATEGORY_ERROR = "err";
-    field public static final java.lang.String CATEGORY_EVENT = "event";
-    field public static final java.lang.String CATEGORY_MESSAGE = "msg";
-    field public static final java.lang.String CATEGORY_PROGRESS = "progress";
-    field public static final java.lang.String CATEGORY_PROMO = "promo";
-    field public static final java.lang.String CATEGORY_RECOMMENDATION = "recommendation";
-    field public static final java.lang.String CATEGORY_SERVICE = "service";
-    field public static final java.lang.String CATEGORY_SOCIAL = "social";
-    field public static final java.lang.String CATEGORY_STATUS = "status";
-    field public static final java.lang.String CATEGORY_SYSTEM = "sys";
-    field public static final java.lang.String CATEGORY_TRANSPORT = "transport";
-    field public static final int COLOR_DEFAULT = 0; // 0x0
-    field public static final int DEFAULT_ALL = -1; // 0xffffffff
-    field public static final int DEFAULT_LIGHTS = 4; // 0x4
-    field public static final int DEFAULT_SOUND = 1; // 0x1
-    field public static final int DEFAULT_VIBRATE = 2; // 0x2
-    field public static final java.lang.String EXTRA_BACKGROUND_IMAGE_URI = "android.backgroundImageUri";
-    field public static final java.lang.String EXTRA_BIG_TEXT = "android.bigText";
-    field public static final java.lang.String EXTRA_COMPACT_ACTIONS = "android.compactActions";
-    field public static final java.lang.String EXTRA_INFO_TEXT = "android.infoText";
-    field public static final java.lang.String EXTRA_LARGE_ICON = "android.largeIcon";
-    field public static final java.lang.String EXTRA_LARGE_ICON_BIG = "android.largeIcon.big";
-    field public static final java.lang.String EXTRA_MEDIA_SESSION = "android.mediaSession";
-    field public static final java.lang.String EXTRA_PEOPLE = "android.people";
-    field public static final java.lang.String EXTRA_PICTURE = "android.picture";
-    field public static final java.lang.String EXTRA_PROGRESS = "android.progress";
-    field public static final java.lang.String EXTRA_PROGRESS_INDETERMINATE = "android.progressIndeterminate";
-    field public static final java.lang.String EXTRA_PROGRESS_MAX = "android.progressMax";
-    field public static final java.lang.String EXTRA_SHOW_CHRONOMETER = "android.showChronometer";
-    field public static final java.lang.String EXTRA_SHOW_WHEN = "android.showWhen";
-    field public static final java.lang.String EXTRA_SMALL_ICON = "android.icon";
-    field public static final java.lang.String EXTRA_SUB_TEXT = "android.subText";
-    field public static final java.lang.String EXTRA_SUMMARY_TEXT = "android.summaryText";
-    field public static final java.lang.String EXTRA_TEMPLATE = "android.template";
-    field public static final java.lang.String EXTRA_TEXT = "android.text";
-    field public static final java.lang.String EXTRA_TEXT_LINES = "android.textLines";
-    field public static final java.lang.String EXTRA_TITLE = "android.title";
-    field public static final java.lang.String EXTRA_TITLE_BIG = "android.title.big";
-    field public static final int FLAG_AUTO_CANCEL = 16; // 0x10
-    field public static final int FLAG_FOREGROUND_SERVICE = 64; // 0x40
-    field public static final int FLAG_GROUP_SUMMARY = 512; // 0x200
-    field public static final deprecated int FLAG_HIGH_PRIORITY = 128; // 0x80
-    field public static final int FLAG_INSISTENT = 4; // 0x4
-    field public static final int FLAG_LOCAL_ONLY = 256; // 0x100
-    field public static final int FLAG_NO_CLEAR = 32; // 0x20
-    field public static final int FLAG_ONGOING_EVENT = 2; // 0x2
-    field public static final int FLAG_ONLY_ALERT_ONCE = 8; // 0x8
-    field public static final int FLAG_SHOW_LIGHTS = 1; // 0x1
-    field public static final int PRIORITY_DEFAULT = 0; // 0x0
-    field public static final int PRIORITY_HIGH = 1; // 0x1
-    field public static final int PRIORITY_LOW = -1; // 0xffffffff
-    field public static final int PRIORITY_MAX = 2; // 0x2
-    field public static final int PRIORITY_MIN = -2; // 0xfffffffe
-    field public static final int STREAM_DEFAULT = -1; // 0xffffffff
-    field public static final int VISIBILITY_PRIVATE = 0; // 0x0
-    field public static final int VISIBILITY_PUBLIC = 1; // 0x1
-    field public static final int VISIBILITY_SECRET = -1; // 0xffffffff
-  }
-
-  public static class NotificationCompat.Action extends android.support.v4.app.NotificationCompatBase.Action {
-    ctor public NotificationCompat.Action(int, java.lang.CharSequence, android.app.PendingIntent);
-    method protected android.app.PendingIntent getActionIntent();
-    method public android.os.Bundle getExtras();
-    method protected int getIcon();
-    method public android.support.v4.app.RemoteInput[] getRemoteInputs();
-    method protected java.lang.CharSequence getTitle();
-    field public android.app.PendingIntent actionIntent;
-    field public int icon;
-    field public java.lang.CharSequence title;
-  }
-
-  public static final class NotificationCompat.Action.Builder {
-    ctor public NotificationCompat.Action.Builder(int, java.lang.CharSequence, android.app.PendingIntent);
-    ctor public NotificationCompat.Action.Builder(android.support.v4.app.NotificationCompat.Action);
-    method public android.support.v4.app.NotificationCompat.Action.Builder addExtras(android.os.Bundle);
-    method public android.support.v4.app.NotificationCompat.Action.Builder addRemoteInput(android.support.v4.app.RemoteInput);
-    method public android.support.v4.app.NotificationCompat.Action build();
-    method public android.support.v4.app.NotificationCompat.Action.Builder extend(android.support.v4.app.NotificationCompat.Action.Extender);
-    method public android.os.Bundle getExtras();
-  }
-
-  public static abstract interface NotificationCompat.Action.Extender {
-    method public abstract android.support.v4.app.NotificationCompat.Action.Builder extend(android.support.v4.app.NotificationCompat.Action.Builder);
-  }
-
-  public static final class NotificationCompat.Action.WearableExtender implements android.support.v4.app.NotificationCompat.Action.Extender {
-    ctor public NotificationCompat.Action.WearableExtender();
-    ctor public NotificationCompat.Action.WearableExtender(android.support.v4.app.NotificationCompat.Action);
-    method public android.support.v4.app.NotificationCompat.Action.WearableExtender clone();
-    method public android.support.v4.app.NotificationCompat.Action.Builder extend(android.support.v4.app.NotificationCompat.Action.Builder);
-    method public java.lang.CharSequence getCancelLabel();
-    method public java.lang.CharSequence getConfirmLabel();
-    method public java.lang.CharSequence getInProgressLabel();
-    method public boolean isAvailableOffline();
-    method public android.support.v4.app.NotificationCompat.Action.WearableExtender setAvailableOffline(boolean);
-    method public android.support.v4.app.NotificationCompat.Action.WearableExtender setCancelLabel(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.Action.WearableExtender setConfirmLabel(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.Action.WearableExtender setInProgressLabel(java.lang.CharSequence);
-  }
-
-  public static class NotificationCompat.BigPictureStyle extends android.support.v4.app.NotificationCompat.Style {
-    ctor public NotificationCompat.BigPictureStyle();
-    ctor public NotificationCompat.BigPictureStyle(android.support.v4.app.NotificationCompat.Builder);
-    method public android.support.v4.app.NotificationCompat.BigPictureStyle bigLargeIcon(android.graphics.Bitmap);
-    method public android.support.v4.app.NotificationCompat.BigPictureStyle bigPicture(android.graphics.Bitmap);
-    method public android.support.v4.app.NotificationCompat.BigPictureStyle setBigContentTitle(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.BigPictureStyle setSummaryText(java.lang.CharSequence);
-  }
-
-  public static class NotificationCompat.BigTextStyle extends android.support.v4.app.NotificationCompat.Style {
-    ctor public NotificationCompat.BigTextStyle();
-    ctor public NotificationCompat.BigTextStyle(android.support.v4.app.NotificationCompat.Builder);
-    method public android.support.v4.app.NotificationCompat.BigTextStyle bigText(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.BigTextStyle setBigContentTitle(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.BigTextStyle setSummaryText(java.lang.CharSequence);
-  }
-
-  public static class NotificationCompat.Builder {
-    ctor public NotificationCompat.Builder(android.content.Context);
-    method public android.support.v4.app.NotificationCompat.Builder addAction(int, java.lang.CharSequence, android.app.PendingIntent);
-    method public android.support.v4.app.NotificationCompat.Builder addAction(android.support.v4.app.NotificationCompat.Action);
-    method public android.support.v4.app.NotificationCompat.Builder addExtras(android.os.Bundle);
-    method public android.support.v4.app.NotificationCompat.Builder addPerson(java.lang.String);
-    method public android.app.Notification build();
-    method public android.support.v4.app.NotificationCompat.Builder extend(android.support.v4.app.NotificationCompat.Extender);
-    method public android.os.Bundle getExtras();
-    method public deprecated android.app.Notification getNotification();
-    method protected static java.lang.CharSequence limitCharSequenceLength(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.Builder setAutoCancel(boolean);
-    method public android.support.v4.app.NotificationCompat.Builder setCategory(java.lang.String);
-    method public android.support.v4.app.NotificationCompat.Builder setColor(int);
-    method public android.support.v4.app.NotificationCompat.Builder setContent(android.widget.RemoteViews);
-    method public android.support.v4.app.NotificationCompat.Builder setContentInfo(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.Builder setContentIntent(android.app.PendingIntent);
-    method public android.support.v4.app.NotificationCompat.Builder setContentText(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.Builder setContentTitle(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.Builder setDefaults(int);
-    method public android.support.v4.app.NotificationCompat.Builder setDeleteIntent(android.app.PendingIntent);
-    method public android.support.v4.app.NotificationCompat.Builder setExtras(android.os.Bundle);
-    method public android.support.v4.app.NotificationCompat.Builder setFullScreenIntent(android.app.PendingIntent, boolean);
-    method public android.support.v4.app.NotificationCompat.Builder setGroup(java.lang.String);
-    method public android.support.v4.app.NotificationCompat.Builder setGroupSummary(boolean);
-    method public android.support.v4.app.NotificationCompat.Builder setLargeIcon(android.graphics.Bitmap);
-    method public android.support.v4.app.NotificationCompat.Builder setLights(int, int, int);
-    method public android.support.v4.app.NotificationCompat.Builder setLocalOnly(boolean);
-    method public android.support.v4.app.NotificationCompat.Builder setNumber(int);
-    method public android.support.v4.app.NotificationCompat.Builder setOngoing(boolean);
-    method public android.support.v4.app.NotificationCompat.Builder setOnlyAlertOnce(boolean);
-    method public android.support.v4.app.NotificationCompat.Builder setPriority(int);
-    method public android.support.v4.app.NotificationCompat.Builder setProgress(int, int, boolean);
-    method public android.support.v4.app.NotificationCompat.Builder setPublicVersion(android.app.Notification);
-    method public android.support.v4.app.NotificationCompat.Builder setShowWhen(boolean);
-    method public android.support.v4.app.NotificationCompat.Builder setSmallIcon(int);
-    method public android.support.v4.app.NotificationCompat.Builder setSmallIcon(int, int);
-    method public android.support.v4.app.NotificationCompat.Builder setSortKey(java.lang.String);
-    method public android.support.v4.app.NotificationCompat.Builder setSound(android.net.Uri);
-    method public android.support.v4.app.NotificationCompat.Builder setSound(android.net.Uri, int);
-    method public android.support.v4.app.NotificationCompat.Builder setStyle(android.support.v4.app.NotificationCompat.Style);
-    method public android.support.v4.app.NotificationCompat.Builder setSubText(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.Builder setTicker(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.Builder setTicker(java.lang.CharSequence, android.widget.RemoteViews);
-    method public android.support.v4.app.NotificationCompat.Builder setUsesChronometer(boolean);
-    method public android.support.v4.app.NotificationCompat.Builder setVibrate(long[]);
-    method public android.support.v4.app.NotificationCompat.Builder setVisibility(int);
-    method public android.support.v4.app.NotificationCompat.Builder setWhen(long);
-    field public java.util.ArrayList<java.lang.String> mPeople;
-  }
-
-  public static final class NotificationCompat.CarExtender implements android.support.v4.app.NotificationCompat.Extender {
-    ctor public NotificationCompat.CarExtender();
-    ctor public NotificationCompat.CarExtender(android.app.Notification);
-    method public android.support.v4.app.NotificationCompat.Builder extend(android.support.v4.app.NotificationCompat.Builder);
-    method public int getColor();
-    method public android.graphics.Bitmap getLargeIcon();
-    method public android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation getUnreadConversation();
-    method public android.support.v4.app.NotificationCompat.CarExtender setColor(int);
-    method public android.support.v4.app.NotificationCompat.CarExtender setLargeIcon(android.graphics.Bitmap);
-    method public android.support.v4.app.NotificationCompat.CarExtender setUnreadConversation(android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation);
-  }
-
-  public static class NotificationCompat.CarExtender.UnreadConversation extends android.support.v4.app.NotificationCompatBase.UnreadConversation {
-    method public long getLatestTimestamp();
-    method public java.lang.String[] getMessages();
-    method public java.lang.String getParticipant();
-    method public java.lang.String[] getParticipants();
-    method public android.app.PendingIntent getReadPendingIntent();
-    method public android.support.v4.app.RemoteInput getRemoteInput();
-    method public android.app.PendingIntent getReplyPendingIntent();
-  }
-
-  public static class NotificationCompat.CarExtender.UnreadConversation.Builder {
-    ctor public NotificationCompat.CarExtender.UnreadConversation.Builder(java.lang.String);
-    method public android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation.Builder addMessage(java.lang.String);
-    method public android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation build();
-    method public android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation.Builder setLatestTimestamp(long);
-    method public android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation.Builder setReadPendingIntent(android.app.PendingIntent);
-    method public android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation.Builder setReplyAction(android.app.PendingIntent, android.support.v4.app.RemoteInput);
-  }
-
-  public static abstract interface NotificationCompat.Extender {
-    method public abstract android.support.v4.app.NotificationCompat.Builder extend(android.support.v4.app.NotificationCompat.Builder);
-  }
-
-  public static class NotificationCompat.InboxStyle extends android.support.v4.app.NotificationCompat.Style {
-    ctor public NotificationCompat.InboxStyle();
-    ctor public NotificationCompat.InboxStyle(android.support.v4.app.NotificationCompat.Builder);
-    method public android.support.v4.app.NotificationCompat.InboxStyle addLine(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.InboxStyle setBigContentTitle(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.InboxStyle setSummaryText(java.lang.CharSequence);
-  }
-
-  public static abstract class NotificationCompat.Style {
-    ctor public NotificationCompat.Style();
-    method public android.app.Notification build();
-    method public void setBuilder(android.support.v4.app.NotificationCompat.Builder);
-  }
-
-  public static final class NotificationCompat.WearableExtender implements android.support.v4.app.NotificationCompat.Extender {
-    ctor public NotificationCompat.WearableExtender();
-    ctor public NotificationCompat.WearableExtender(android.app.Notification);
-    method public android.support.v4.app.NotificationCompat.WearableExtender addAction(android.support.v4.app.NotificationCompat.Action);
-    method public android.support.v4.app.NotificationCompat.WearableExtender addActions(java.util.List<android.support.v4.app.NotificationCompat.Action>);
-    method public android.support.v4.app.NotificationCompat.WearableExtender addPage(android.app.Notification);
-    method public android.support.v4.app.NotificationCompat.WearableExtender addPages(java.util.List<android.app.Notification>);
-    method public android.support.v4.app.NotificationCompat.WearableExtender clearActions();
-    method public android.support.v4.app.NotificationCompat.WearableExtender clearPages();
-    method public android.support.v4.app.NotificationCompat.WearableExtender clone();
-    method public android.support.v4.app.NotificationCompat.Builder extend(android.support.v4.app.NotificationCompat.Builder);
-    method public java.util.List<android.support.v4.app.NotificationCompat.Action> getActions();
-    method public android.graphics.Bitmap getBackground();
-    method public int getContentAction();
-    method public int getContentIcon();
-    method public int getContentIconGravity();
-    method public boolean getContentIntentAvailableOffline();
-    method public int getCustomContentHeight();
-    method public int getCustomSizePreset();
-    method public android.app.PendingIntent getDisplayIntent();
-    method public int getGravity();
-    method public boolean getHintAvoidBackgroundClipping();
-    method public boolean getHintHideIcon();
-    method public int getHintScreenTimeout();
-    method public boolean getHintShowBackgroundOnly();
-    method public java.util.List<android.app.Notification> getPages();
-    method public boolean getStartScrollBottom();
-    method public android.support.v4.app.NotificationCompat.WearableExtender setBackground(android.graphics.Bitmap);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setContentAction(int);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setContentIcon(int);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setContentIconGravity(int);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setContentIntentAvailableOffline(boolean);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setCustomContentHeight(int);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setCustomSizePreset(int);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setDisplayIntent(android.app.PendingIntent);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setGravity(int);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setHintAvoidBackgroundClipping(boolean);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setHintHideIcon(boolean);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setHintScreenTimeout(int);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setHintShowBackgroundOnly(boolean);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setStartScrollBottom(boolean);
-    field public static final int SCREEN_TIMEOUT_LONG = -1; // 0xffffffff
-    field public static final int SCREEN_TIMEOUT_SHORT = 0; // 0x0
-    field public static final int SIZE_DEFAULT = 0; // 0x0
-    field public static final int SIZE_FULL_SCREEN = 5; // 0x5
-    field public static final int SIZE_LARGE = 4; // 0x4
-    field public static final int SIZE_MEDIUM = 3; // 0x3
-    field public static final int SIZE_SMALL = 2; // 0x2
-    field public static final int SIZE_XSMALL = 1; // 0x1
-    field public static final int UNSET_ACTION_INDEX = -1; // 0xffffffff
-  }
-
-   class NotificationCompatBase {
-  }
-
-  public static abstract class NotificationCompatBase.Action {
-    ctor public NotificationCompatBase.Action();
-    method protected abstract android.app.PendingIntent getActionIntent();
-    method protected abstract android.os.Bundle getExtras();
-    method protected abstract int getIcon();
-    method protected abstract android.support.v4.app.RemoteInputCompatBase.RemoteInput[] getRemoteInputs();
-    method protected abstract java.lang.CharSequence getTitle();
-  }
-
-  public static abstract class NotificationCompatBase.UnreadConversation {
-    ctor public NotificationCompatBase.UnreadConversation();
-  }
-
-  public final class NotificationCompatExtras {
-    field public static final java.lang.String EXTRA_ACTION_EXTRAS = "android.support.actionExtras";
-    field public static final java.lang.String EXTRA_GROUP_KEY = "android.support.groupKey";
-    field public static final java.lang.String EXTRA_GROUP_SUMMARY = "android.support.isGroupSummary";
-    field public static final java.lang.String EXTRA_LOCAL_ONLY = "android.support.localOnly";
-    field public static final java.lang.String EXTRA_REMOTE_INPUTS = "android.support.remoteInputs";
-    field public static final java.lang.String EXTRA_SORT_KEY = "android.support.sortKey";
-  }
-
-  public abstract class NotificationCompatSideChannelService extends android.app.Service {
-    ctor public NotificationCompatSideChannelService();
-    method public abstract void cancel(java.lang.String, int, java.lang.String);
-    method public abstract void cancelAll(java.lang.String);
-    method public abstract void notify(java.lang.String, int, java.lang.String, android.app.Notification);
-    method public android.os.IBinder onBind(android.content.Intent);
-  }
-
-  public class NotificationManagerCompat {
-    method public void cancel(int);
-    method public void cancel(java.lang.String, int);
-    method public void cancelAll();
-    method public static android.support.v4.app.NotificationManagerCompat from(android.content.Context);
-    method public static java.util.Set<java.lang.String> getEnabledListenerPackages(android.content.Context);
-    method public void notify(int, android.app.Notification);
-    method public void notify(java.lang.String, int, android.app.Notification);
-    field public static final java.lang.String ACTION_BIND_SIDE_CHANNEL = "android.support.BIND_NOTIFICATION_SIDE_CHANNEL";
-    field public static final java.lang.String EXTRA_USE_SIDE_CHANNEL = "android.support.useSideChannel";
-  }
-
-  public class RemoteInput extends android.support.v4.app.RemoteInputCompatBase.RemoteInput {
-    method public static void addResultsToIntent(android.support.v4.app.RemoteInput[], android.content.Intent, android.os.Bundle);
-    method public boolean getAllowFreeFormInput();
-    method public java.lang.CharSequence[] getChoices();
-    method public android.os.Bundle getExtras();
-    method public java.lang.CharSequence getLabel();
-    method public java.lang.String getResultKey();
-    method public static android.os.Bundle getResultsFromIntent(android.content.Intent);
-    field public static final java.lang.String EXTRA_RESULTS_DATA = "android.remoteinput.resultsData";
-    field public static final java.lang.String RESULTS_CLIP_LABEL = "android.remoteinput.results";
-  }
-
-  public static final class RemoteInput.Builder {
-    ctor public RemoteInput.Builder(java.lang.String);
-    method public android.support.v4.app.RemoteInput.Builder addExtras(android.os.Bundle);
-    method public android.support.v4.app.RemoteInput build();
-    method public android.os.Bundle getExtras();
-    method public android.support.v4.app.RemoteInput.Builder setAllowFreeFormInput(boolean);
-    method public android.support.v4.app.RemoteInput.Builder setChoices(java.lang.CharSequence[]);
-    method public android.support.v4.app.RemoteInput.Builder setLabel(java.lang.CharSequence);
-  }
-
-   class RemoteInputCompatBase {
-  }
-
-  public static abstract class RemoteInputCompatBase.RemoteInput {
-    ctor public RemoteInputCompatBase.RemoteInput();
-    method protected abstract boolean getAllowFreeFormInput();
-    method protected abstract java.lang.CharSequence[] getChoices();
-    method protected abstract android.os.Bundle getExtras();
-    method protected abstract java.lang.CharSequence getLabel();
-    method protected abstract java.lang.String getResultKey();
-  }
-
-  public class ServiceCompat {
-    field public static final int START_STICKY = 1; // 0x1
-  }
-
-  public class ShareCompat {
-    ctor public ShareCompat();
-    method public static void configureMenuItem(android.view.MenuItem, android.support.v4.app.ShareCompat.IntentBuilder);
-    method public static void configureMenuItem(android.view.Menu, int, android.support.v4.app.ShareCompat.IntentBuilder);
-    method public static android.content.ComponentName getCallingActivity(android.app.Activity);
-    method public static java.lang.String getCallingPackage(android.app.Activity);
-    field public static final java.lang.String EXTRA_CALLING_ACTIVITY = "android.support.v4.app.EXTRA_CALLING_ACTIVITY";
-    field public static final java.lang.String EXTRA_CALLING_PACKAGE = "android.support.v4.app.EXTRA_CALLING_PACKAGE";
-  }
-
-  public static class ShareCompat.IntentBuilder {
-    method public android.support.v4.app.ShareCompat.IntentBuilder addEmailBcc(java.lang.String);
-    method public android.support.v4.app.ShareCompat.IntentBuilder addEmailBcc(java.lang.String[]);
-    method public android.support.v4.app.ShareCompat.IntentBuilder addEmailCc(java.lang.String);
-    method public android.support.v4.app.ShareCompat.IntentBuilder addEmailCc(java.lang.String[]);
-    method public android.support.v4.app.ShareCompat.IntentBuilder addEmailTo(java.lang.String);
-    method public android.support.v4.app.ShareCompat.IntentBuilder addEmailTo(java.lang.String[]);
-    method public android.support.v4.app.ShareCompat.IntentBuilder addStream(android.net.Uri);
-    method public android.content.Intent createChooserIntent();
-    method public static android.support.v4.app.ShareCompat.IntentBuilder from(android.app.Activity);
-    method public android.content.Intent getIntent();
-    method public android.support.v4.app.ShareCompat.IntentBuilder setChooserTitle(java.lang.CharSequence);
-    method public android.support.v4.app.ShareCompat.IntentBuilder setChooserTitle(int);
-    method public android.support.v4.app.ShareCompat.IntentBuilder setEmailBcc(java.lang.String[]);
-    method public android.support.v4.app.ShareCompat.IntentBuilder setEmailCc(java.lang.String[]);
-    method public android.support.v4.app.ShareCompat.IntentBuilder setEmailTo(java.lang.String[]);
-    method public android.support.v4.app.ShareCompat.IntentBuilder setHtmlText(java.lang.String);
-    method public android.support.v4.app.ShareCompat.IntentBuilder setStream(android.net.Uri);
-    method public android.support.v4.app.ShareCompat.IntentBuilder setSubject(java.lang.String);
-    method public android.support.v4.app.ShareCompat.IntentBuilder setText(java.lang.CharSequence);
-    method public android.support.v4.app.ShareCompat.IntentBuilder setType(java.lang.String);
-    method public void startChooser();
-  }
-
-  public static class ShareCompat.IntentReader {
-    method public static android.support.v4.app.ShareCompat.IntentReader from(android.app.Activity);
-    method public android.content.ComponentName getCallingActivity();
-    method public android.graphics.drawable.Drawable getCallingActivityIcon();
-    method public android.graphics.drawable.Drawable getCallingApplicationIcon();
-    method public java.lang.CharSequence getCallingApplicationLabel();
-    method public java.lang.String getCallingPackage();
-    method public java.lang.String[] getEmailBcc();
-    method public java.lang.String[] getEmailCc();
-    method public java.lang.String[] getEmailTo();
-    method public java.lang.String getHtmlText();
-    method public android.net.Uri getStream();
-    method public android.net.Uri getStream(int);
-    method public int getStreamCount();
-    method public java.lang.String getSubject();
-    method public java.lang.CharSequence getText();
-    method public java.lang.String getType();
-    method public boolean isMultipleShare();
-    method public boolean isShareIntent();
-    method public boolean isSingleShare();
-  }
-
-  public abstract class SharedElementCallback {
-    ctor public SharedElementCallback();
-    method public android.os.Parcelable onCaptureSharedElementSnapshot(android.view.View, android.graphics.Matrix, android.graphics.RectF);
-    method public android.view.View onCreateSnapshotView(android.content.Context, android.os.Parcelable);
-    method public void onMapSharedElements(java.util.List<java.lang.String>, java.util.Map<java.lang.String, android.view.View>);
-    method public void onRejectSharedElements(java.util.List<android.view.View>);
-    method public void onSharedElementEnd(java.util.List<java.lang.String>, java.util.List<android.view.View>, java.util.List<android.view.View>);
-    method public void onSharedElementStart(java.util.List<java.lang.String>, java.util.List<android.view.View>, java.util.List<android.view.View>);
-  }
-
-  public class TaskStackBuilder implements java.lang.Iterable {
-    method public android.support.v4.app.TaskStackBuilder addNextIntent(android.content.Intent);
-    method public android.support.v4.app.TaskStackBuilder addNextIntentWithParentStack(android.content.Intent);
-    method public android.support.v4.app.TaskStackBuilder addParentStack(android.app.Activity);
-    method public android.support.v4.app.TaskStackBuilder addParentStack(java.lang.Class<?>);
-    method public android.support.v4.app.TaskStackBuilder addParentStack(android.content.ComponentName);
-    method public static android.support.v4.app.TaskStackBuilder create(android.content.Context);
-    method public android.content.Intent editIntentAt(int);
-    method public static deprecated android.support.v4.app.TaskStackBuilder from(android.content.Context);
-    method public deprecated android.content.Intent getIntent(int);
-    method public int getIntentCount();
-    method public android.content.Intent[] getIntents();
-    method public android.app.PendingIntent getPendingIntent(int, int);
-    method public android.app.PendingIntent getPendingIntent(int, int, android.os.Bundle);
-    method public deprecated java.util.Iterator<android.content.Intent> iterator();
-    method public void startActivities();
-    method public void startActivities(android.os.Bundle);
-  }
-
-  public static abstract interface TaskStackBuilder.SupportParentable {
-    method public abstract android.content.Intent getSupportParentActivityIntent();
-  }
-
-}
-
-package android.support.v4.content {
-
-  public abstract class AsyncTaskLoader extends android.support.v4.content.Loader {
-    ctor public AsyncTaskLoader(android.content.Context);
-    method public boolean cancelLoad();
-    method public abstract D loadInBackground();
-    method public void onCanceled(D);
-    method protected D onLoadInBackground();
-    method public void setUpdateThrottle(long);
-  }
-
-  public class ContextCompat {
-    ctor public ContextCompat();
-    method public final java.io.File getCodeCacheDir(android.content.Context);
-    method public static final android.graphics.drawable.Drawable getDrawable(android.content.Context, int);
-    method public static java.io.File[] getExternalCacheDirs(android.content.Context);
-    method public static java.io.File[] getExternalFilesDirs(android.content.Context, java.lang.String);
-    method public final java.io.File getNoBackupFilesDir(android.content.Context);
-    method public static java.io.File[] getObbDirs(android.content.Context);
-    method public static boolean startActivities(android.content.Context, android.content.Intent[]);
-    method public static boolean startActivities(android.content.Context, android.content.Intent[], android.os.Bundle);
-  }
-
-  public class CursorLoader extends android.support.v4.content.AsyncTaskLoader {
-    ctor public CursorLoader(android.content.Context);
-    ctor public CursorLoader(android.content.Context, android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String);
-    method public void deliverResult(android.database.Cursor);
-    method public java.lang.String[] getProjection();
-    method public java.lang.String getSelection();
-    method public java.lang.String[] getSelectionArgs();
-    method public java.lang.String getSortOrder();
-    method public android.net.Uri getUri();
-    method public android.database.Cursor loadInBackground();
-    method public void onCanceled(android.database.Cursor);
-    method public void setProjection(java.lang.String[]);
-    method public void setSelection(java.lang.String);
-    method public void setSelectionArgs(java.lang.String[]);
-    method public void setSortOrder(java.lang.String);
-    method public void setUri(android.net.Uri);
-  }
-
-  public class FileProvider extends android.content.ContentProvider {
-    ctor public FileProvider();
-    method public int delete(android.net.Uri, java.lang.String, java.lang.String[]);
-    method public java.lang.String getType(android.net.Uri);
-    method public static android.net.Uri getUriForFile(android.content.Context, java.lang.String, java.io.File);
-    method public android.net.Uri insert(android.net.Uri, android.content.ContentValues);
-    method public boolean onCreate();
-    method public android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String);
-    method public int update(android.net.Uri, android.content.ContentValues, java.lang.String, java.lang.String[]);
-  }
-
-  public class IntentCompat {
-    method public static android.content.Intent makeMainActivity(android.content.ComponentName);
-    method public static android.content.Intent makeMainSelectorActivity(java.lang.String, java.lang.String);
-    method public static android.content.Intent makeRestartActivityTask(android.content.ComponentName);
-    field public static final java.lang.String ACTION_EXTERNAL_APPLICATIONS_AVAILABLE = "android.intent.action.EXTERNAL_APPLICATIONS_AVAILABLE";
-    field public static final java.lang.String ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE = "android.intent.action.EXTERNAL_APPLICATIONS_UNAVAILABLE";
-    field public static final java.lang.String EXTRA_CHANGED_PACKAGE_LIST = "android.intent.extra.changed_package_list";
-    field public static final java.lang.String EXTRA_CHANGED_UID_LIST = "android.intent.extra.changed_uid_list";
-    field public static final java.lang.String EXTRA_HTML_TEXT = "android.intent.extra.HTML_TEXT";
-    field public static final int FLAG_ACTIVITY_CLEAR_TASK = 32768; // 0x8000
-    field public static final int FLAG_ACTIVITY_TASK_ON_HOME = 16384; // 0x4000
-  }
-
-  public class Loader {
-    ctor public Loader(android.content.Context);
-    method public void abandon();
-    method public void commitContentChanged();
-    method public java.lang.String dataToString(D);
-    method public void deliverResult(D);
-    method public void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
-    method public void forceLoad();
-    method public android.content.Context getContext();
-    method public int getId();
-    method public boolean isAbandoned();
-    method public boolean isReset();
-    method public boolean isStarted();
-    method protected void onAbandon();
-    method public void onContentChanged();
-    method protected void onForceLoad();
-    method protected void onReset();
-    method protected void onStartLoading();
-    method protected void onStopLoading();
-    method public void registerListener(int, android.support.v4.content.Loader.OnLoadCompleteListener<D>);
-    method public void reset();
-    method public void rollbackContentChanged();
-    method public final void startLoading();
-    method public void stopLoading();
-    method public boolean takeContentChanged();
-    method public void unregisterListener(android.support.v4.content.Loader.OnLoadCompleteListener<D>);
-  }
-
-  public final class Loader.ForceLoadContentObserver extends android.database.ContentObserver {
-    ctor public Loader.ForceLoadContentObserver();
-  }
-
-  public static abstract interface Loader.OnLoadCompleteListener {
-    method public abstract void onLoadComplete(android.support.v4.content.Loader<D>, D);
-  }
-
-  public class LocalBroadcastManager {
-    method public static android.support.v4.content.LocalBroadcastManager getInstance(android.content.Context);
-    method public void registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter);
-    method public boolean sendBroadcast(android.content.Intent);
-    method public void sendBroadcastSync(android.content.Intent);
-    method public void unregisterReceiver(android.content.BroadcastReceiver);
-  }
-
-  public abstract class WakefulBroadcastReceiver extends android.content.BroadcastReceiver {
-    ctor public WakefulBroadcastReceiver();
-    method public static boolean completeWakefulIntent(android.content.Intent);
-    method public static android.content.ComponentName startWakefulService(android.content.Context, android.content.Intent);
-  }
-
-}
-
-package android.support.v4.database {
-
-  public class DatabaseUtilsCompat {
-    method public static java.lang.String[] appendSelectionArgs(java.lang.String[], java.lang.String[]);
-    method public static java.lang.String concatenateWhere(java.lang.String, java.lang.String);
-  }
-
-}
-
-package android.support.v4.graphics {
-
-  public class BitmapCompat {
-    ctor public BitmapCompat();
-    method public static int getAllocationByteCount(android.graphics.Bitmap);
-    method public static boolean hasMipMap(android.graphics.Bitmap);
-    method public static void setHasMipMap(android.graphics.Bitmap, boolean);
-  }
-
-}
-
-package android.support.v4.graphics.drawable {
-
-  public class DrawableCompat {
-    ctor public DrawableCompat();
-    method public static boolean isAutoMirrored(android.graphics.drawable.Drawable);
-    method public static void jumpToCurrentState(android.graphics.drawable.Drawable);
-    method public static void setAutoMirrored(android.graphics.drawable.Drawable, boolean);
-    method public static void setHotspot(android.graphics.drawable.Drawable, float, float);
-    method public static void setHotspotBounds(android.graphics.drawable.Drawable, int, int, int, int);
-    method public static void setTint(android.graphics.drawable.Drawable, int);
-    method public static void setTintList(android.graphics.drawable.Drawable, android.content.res.ColorStateList);
-    method public static void setTintMode(android.graphics.drawable.Drawable, android.graphics.PorterDuff.Mode);
-  }
-
-  public abstract class RoundedBitmapDrawable extends android.graphics.drawable.Drawable {
-    method public void draw(android.graphics.Canvas);
-    method public final android.graphics.Bitmap getBitmap();
-    method public float getCornerRadius();
-    method public int getGravity();
-    method public int getOpacity();
-    method public final android.graphics.Paint getPaint();
-    method public boolean hasAntiAlias();
-    method public boolean hasMipMap();
-    method public void setAlpha(int);
-    method public void setAntiAlias(boolean);
-    method public void setColorFilter(android.graphics.ColorFilter);
-    method public void setCornerRadius(float);
-    method public void setGravity(int);
-    method public void setMipMap(boolean);
-    method public void setTargetDensity(android.graphics.Canvas);
-    method public void setTargetDensity(android.util.DisplayMetrics);
-    method public void setTargetDensity(int);
-  }
-
-  public class RoundedBitmapDrawableFactory {
-    ctor public RoundedBitmapDrawableFactory();
-    method public static android.support.v4.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, android.graphics.Bitmap);
-    method public static android.support.v4.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, java.lang.String);
-    method public static android.support.v4.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, java.io.InputStream);
-  }
-
-}
-
-package android.support.v4.hardware.display {
-
-  public abstract class DisplayManagerCompat {
-    method public abstract android.view.Display getDisplay(int);
-    method public abstract android.view.Display[] getDisplays();
-    method public abstract android.view.Display[] getDisplays(java.lang.String);
-    method public static android.support.v4.hardware.display.DisplayManagerCompat getInstance(android.content.Context);
-    field public static final java.lang.String DISPLAY_CATEGORY_PRESENTATION = "android.hardware.display.category.PRESENTATION";
-  }
-
-}
-
-package android.support.v4.media {
-
-  public final class MediaDescriptionCompat implements android.os.Parcelable {
-    method public int describeContents();
-    method public static android.support.v4.media.MediaDescriptionCompat fromMediaDescription(java.lang.Object);
-    method public java.lang.CharSequence getDescription();
-    method public android.os.Bundle getExtras();
-    method public android.graphics.Bitmap getIconBitmap();
-    method public android.net.Uri getIconUri();
-    method public java.lang.Object getMediaDescription();
-    method public java.lang.String getMediaId();
-    method public java.lang.CharSequence getSubtitle();
-    method public java.lang.CharSequence getTitle();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.support.v4.media.MediaDescriptionCompat> CREATOR;
-  }
-
-  public static final class MediaDescriptionCompat.Builder {
-    ctor public MediaDescriptionCompat.Builder();
-    method public android.support.v4.media.MediaDescriptionCompat build();
-    method public android.support.v4.media.MediaDescriptionCompat.Builder setDescription(java.lang.CharSequence);
-    method public android.support.v4.media.MediaDescriptionCompat.Builder setExtras(android.os.Bundle);
-    method public android.support.v4.media.MediaDescriptionCompat.Builder setIconBitmap(android.graphics.Bitmap);
-    method public android.support.v4.media.MediaDescriptionCompat.Builder setIconUri(android.net.Uri);
-    method public android.support.v4.media.MediaDescriptionCompat.Builder setMediaId(java.lang.String);
-    method public android.support.v4.media.MediaDescriptionCompat.Builder setSubtitle(java.lang.CharSequence);
-    method public android.support.v4.media.MediaDescriptionCompat.Builder setTitle(java.lang.CharSequence);
-  }
-
-  public final class MediaMetadataCompat implements android.os.Parcelable {
-    method public boolean containsKey(java.lang.String);
-    method public int describeContents();
-    method public static android.support.v4.media.MediaMetadataCompat fromMediaMetadata(java.lang.Object);
-    method public android.graphics.Bitmap getBitmap(java.lang.String);
-    method public android.os.Bundle getBundle();
-    method public android.support.v4.media.MediaDescriptionCompat getDescription();
-    method public long getLong(java.lang.String);
-    method public java.lang.Object getMediaMetadata();
-    method public android.support.v4.media.RatingCompat getRating(java.lang.String);
-    method public java.lang.String getString(java.lang.String);
-    method public java.lang.CharSequence getText(java.lang.String);
-    method public java.util.Set<java.lang.String> keySet();
-    method public int size();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.support.v4.media.MediaMetadataCompat> CREATOR;
-    field public static final java.lang.String METADATA_KEY_ALBUM = "android.media.metadata.ALBUM";
-    field public static final java.lang.String METADATA_KEY_ALBUM_ART = "android.media.metadata.ALBUM_ART";
-    field public static final java.lang.String METADATA_KEY_ALBUM_ARTIST = "android.media.metadata.ALBUM_ARTIST";
-    field public static final java.lang.String METADATA_KEY_ALBUM_ART_URI = "android.media.metadata.ALBUM_ART_URI";
-    field public static final java.lang.String METADATA_KEY_ART = "android.media.metadata.ART";
-    field public static final java.lang.String METADATA_KEY_ARTIST = "android.media.metadata.ARTIST";
-    field public static final java.lang.String METADATA_KEY_ART_URI = "android.media.metadata.ART_URI";
-    field public static final java.lang.String METADATA_KEY_AUTHOR = "android.media.metadata.AUTHOR";
-    field public static final java.lang.String METADATA_KEY_COMPILATION = "android.media.metadata.COMPILATION";
-    field public static final java.lang.String METADATA_KEY_COMPOSER = "android.media.metadata.COMPOSER";
-    field public static final java.lang.String METADATA_KEY_DATE = "android.media.metadata.DATE";
-    field public static final java.lang.String METADATA_KEY_DISC_NUMBER = "android.media.metadata.DISC_NUMBER";
-    field public static final java.lang.String METADATA_KEY_DISPLAY_DESCRIPTION = "android.media.metadata.DISPLAY_DESCRIPTION";
-    field public static final java.lang.String METADATA_KEY_DISPLAY_ICON = "android.media.metadata.DISPLAY_ICON";
-    field public static final java.lang.String METADATA_KEY_DISPLAY_ICON_URI = "android.media.metadata.DISPLAY_ICON_URI";
-    field public static final java.lang.String METADATA_KEY_DISPLAY_SUBTITLE = "android.media.metadata.DISPLAY_SUBTITLE";
-    field public static final java.lang.String METADATA_KEY_DISPLAY_TITLE = "android.media.metadata.DISPLAY_TITLE";
-    field public static final java.lang.String METADATA_KEY_DURATION = "android.media.metadata.DURATION";
-    field public static final java.lang.String METADATA_KEY_GENRE = "android.media.metadata.GENRE";
-    field public static final java.lang.String METADATA_KEY_MEDIA_ID = "android.media.metadata.MEDIA_ID";
-    field public static final java.lang.String METADATA_KEY_NUM_TRACKS = "android.media.metadata.NUM_TRACKS";
-    field public static final java.lang.String METADATA_KEY_RATING = "android.media.metadata.RATING";
-    field public static final java.lang.String METADATA_KEY_TITLE = "android.media.metadata.TITLE";
-    field public static final java.lang.String METADATA_KEY_TRACK_NUMBER = "android.media.metadata.TRACK_NUMBER";
-    field public static final java.lang.String METADATA_KEY_USER_RATING = "android.media.metadata.USER_RATING";
-    field public static final java.lang.String METADATA_KEY_WRITER = "android.media.metadata.WRITER";
-    field public static final java.lang.String METADATA_KEY_YEAR = "android.media.metadata.YEAR";
-  }
-
-  public static final class MediaMetadataCompat.Builder {
-    ctor public MediaMetadataCompat.Builder();
-    ctor public MediaMetadataCompat.Builder(android.support.v4.media.MediaMetadataCompat);
-    method public android.support.v4.media.MediaMetadataCompat build();
-    method public android.support.v4.media.MediaMetadataCompat.Builder putBitmap(java.lang.String, android.graphics.Bitmap);
-    method public android.support.v4.media.MediaMetadataCompat.Builder putLong(java.lang.String, long);
-    method public android.support.v4.media.MediaMetadataCompat.Builder putRating(java.lang.String, android.support.v4.media.RatingCompat);
-    method public android.support.v4.media.MediaMetadataCompat.Builder putString(java.lang.String, java.lang.String);
-    method public android.support.v4.media.MediaMetadataCompat.Builder putText(java.lang.String, java.lang.CharSequence);
-  }
-
-  public final class RatingCompat implements android.os.Parcelable {
-    method public int describeContents();
-    method public static android.support.v4.media.RatingCompat fromRating(java.lang.Object);
-    method public float getPercentRating();
-    method public java.lang.Object getRating();
-    method public int getRatingStyle();
-    method public float getStarRating();
-    method public boolean hasHeart();
-    method public boolean isRated();
-    method public boolean isThumbUp();
-    method public static android.support.v4.media.RatingCompat newHeartRating(boolean);
-    method public static android.support.v4.media.RatingCompat newPercentageRating(float);
-    method public static android.support.v4.media.RatingCompat newStarRating(int, float);
-    method public static android.support.v4.media.RatingCompat newThumbRating(boolean);
-    method public static android.support.v4.media.RatingCompat newUnratedRating(int);
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.support.v4.media.RatingCompat> CREATOR;
-    field public static final int RATING_3_STARS = 3; // 0x3
-    field public static final int RATING_4_STARS = 4; // 0x4
-    field public static final int RATING_5_STARS = 5; // 0x5
-    field public static final int RATING_HEART = 1; // 0x1
-    field public static final int RATING_NONE = 0; // 0x0
-    field public static final int RATING_PERCENTAGE = 6; // 0x6
-    field public static final int RATING_THUMB_UP_DOWN = 2; // 0x2
-  }
-
-  public abstract class TransportController {
-    ctor public TransportController();
-    method public abstract int getBufferPercentage();
-    method public abstract long getCurrentPosition();
-    method public abstract long getDuration();
-    method public abstract int getTransportControlFlags();
-    method public abstract boolean isPlaying();
-    method public abstract void pausePlaying();
-    method public abstract void registerStateListener(android.support.v4.media.TransportStateListener);
-    method public abstract void seekTo(long);
-    method public abstract void startPlaying();
-    method public abstract void stopPlaying();
-    method public abstract void unregisterStateListener(android.support.v4.media.TransportStateListener);
-  }
-
-  public class TransportMediator extends android.support.v4.media.TransportController {
-    ctor public TransportMediator(android.app.Activity, android.support.v4.media.TransportPerformer);
-    ctor public TransportMediator(android.view.View, android.support.v4.media.TransportPerformer);
-    method public void destroy();
-    method public boolean dispatchKeyEvent(android.view.KeyEvent);
-    method public int getBufferPercentage();
-    method public long getCurrentPosition();
-    method public long getDuration();
-    method public java.lang.Object getRemoteControlClient();
-    method public int getTransportControlFlags();
-    method public boolean isPlaying();
-    method public void pausePlaying();
-    method public void refreshState();
-    method public void registerStateListener(android.support.v4.media.TransportStateListener);
-    method public void seekTo(long);
-    method public void startPlaying();
-    method public void stopPlaying();
-    method public void unregisterStateListener(android.support.v4.media.TransportStateListener);
-    field public static final int FLAG_KEY_MEDIA_FAST_FORWARD = 64; // 0x40
-    field public static final int FLAG_KEY_MEDIA_NEXT = 128; // 0x80
-    field public static final int FLAG_KEY_MEDIA_PAUSE = 16; // 0x10
-    field public static final int FLAG_KEY_MEDIA_PLAY = 4; // 0x4
-    field public static final int FLAG_KEY_MEDIA_PLAY_PAUSE = 8; // 0x8
-    field public static final int FLAG_KEY_MEDIA_PREVIOUS = 1; // 0x1
-    field public static final int FLAG_KEY_MEDIA_REWIND = 2; // 0x2
-    field public static final int FLAG_KEY_MEDIA_STOP = 32; // 0x20
-    field public static final int KEYCODE_MEDIA_PAUSE = 127; // 0x7f
-    field public static final int KEYCODE_MEDIA_PLAY = 126; // 0x7e
-    field public static final int KEYCODE_MEDIA_RECORD = 130; // 0x82
-  }
-
-  public abstract class TransportPerformer {
-    ctor public TransportPerformer();
-    method public void onAudioFocusChange(int);
-    method public int onGetBufferPercentage();
-    method public abstract long onGetCurrentPosition();
-    method public abstract long onGetDuration();
-    method public int onGetTransportControlFlags();
-    method public abstract boolean onIsPlaying();
-    method public boolean onMediaButtonDown(int, android.view.KeyEvent);
-    method public boolean onMediaButtonUp(int, android.view.KeyEvent);
-    method public abstract void onPause();
-    method public abstract void onSeekTo(long);
-    method public abstract void onStart();
-    method public abstract void onStop();
-  }
-
-  public class TransportStateListener {
-    ctor public TransportStateListener();
-    method public void onPlayingChanged(android.support.v4.media.TransportController);
-    method public void onTransportControlsChanged(android.support.v4.media.TransportController);
-  }
-
-  public abstract class VolumeProviderCompat {
-    ctor public VolumeProviderCompat(int, int, int);
-    method public final int getCurrentVolume();
-    method public final int getMaxVolume();
-    method public final int getVolumeControl();
-    method public java.lang.Object getVolumeProvider();
-    method public void onAdjustVolume(int);
-    method public void onSetVolumeTo(int);
-    method public void setCallback(android.support.v4.media.VolumeProviderCompat.Callback);
-    method public final void setCurrentVolume(int);
-    field public static final int VOLUME_CONTROL_ABSOLUTE = 2; // 0x2
-    field public static final int VOLUME_CONTROL_FIXED = 0; // 0x0
-    field public static final int VOLUME_CONTROL_RELATIVE = 1; // 0x1
-  }
-
-  public static abstract class VolumeProviderCompat.Callback {
-    ctor public VolumeProviderCompat.Callback();
-    method public abstract void onVolumeChanged(android.support.v4.media.VolumeProviderCompat);
-  }
-
-}
-
-package android.support.v4.media.session {
-
-  public final class MediaControllerCompat {
-    ctor public MediaControllerCompat(android.content.Context, android.support.v4.media.session.MediaSessionCompat);
-    ctor public MediaControllerCompat(android.content.Context, android.support.v4.media.session.MediaSessionCompat.Token) throws android.os.RemoteException;
-    method public void adjustVolume(int, int);
-    method public boolean dispatchMediaButtonEvent(android.view.KeyEvent);
-    method public android.os.Bundle getExtras();
-    method public long getFlags();
-    method public java.lang.Object getMediaController();
-    method public android.support.v4.media.MediaMetadataCompat getMetadata();
-    method public java.lang.String getPackageName();
-    method public android.support.v4.media.session.MediaControllerCompat.PlaybackInfo getPlaybackInfo();
-    method public android.support.v4.media.session.PlaybackStateCompat getPlaybackState();
-    method public java.util.List<android.support.v4.media.session.MediaSessionCompat.QueueItem> getQueue();
-    method public java.lang.CharSequence getQueueTitle();
-    method public int getRatingType();
-    method public android.app.PendingIntent getSessionActivity();
-    method public android.support.v4.media.session.MediaSessionCompat.Token getSessionToken();
-    method public android.support.v4.media.session.MediaControllerCompat.TransportControls getTransportControls();
-    method public void registerCallback(android.support.v4.media.session.MediaControllerCompat.Callback);
-    method public void registerCallback(android.support.v4.media.session.MediaControllerCompat.Callback, android.os.Handler);
-    method public void sendCommand(java.lang.String, android.os.Bundle, android.os.ResultReceiver);
-    method public void setVolumeTo(int, int);
-    method public void unregisterCallback(android.support.v4.media.session.MediaControllerCompat.Callback);
-  }
-
-  public static abstract class MediaControllerCompat.Callback implements android.os.IBinder.DeathRecipient {
-    ctor public MediaControllerCompat.Callback();
-    method public void binderDied();
-    method public void onAudioInfoChanged(android.support.v4.media.session.MediaControllerCompat.PlaybackInfo);
-    method public void onExtrasChanged(android.os.Bundle);
-    method public void onMetadataChanged(android.support.v4.media.MediaMetadataCompat);
-    method public void onPlaybackStateChanged(android.support.v4.media.session.PlaybackStateCompat);
-    method public void onQueueChanged(java.util.List<android.support.v4.media.session.MediaSessionCompat.QueueItem>);
-    method public void onQueueTitleChanged(java.lang.CharSequence);
-    method public void onSessionDestroyed();
-    method public void onSessionEvent(java.lang.String, android.os.Bundle);
-  }
-
-  public static final class MediaControllerCompat.PlaybackInfo {
-    method public int getAudioStream();
-    method public int getCurrentVolume();
-    method public int getMaxVolume();
-    method public int getPlaybackType();
-    method public int getVolumeControl();
-    field public static final int PLAYBACK_TYPE_LOCAL = 1; // 0x1
-    field public static final int PLAYBACK_TYPE_REMOTE = 2; // 0x2
-  }
-
-  public static abstract class MediaControllerCompat.TransportControls {
-    method public abstract void fastForward();
-    method public abstract void pause();
-    method public abstract void play();
-    method public abstract void playFromMediaId(java.lang.String, android.os.Bundle);
-    method public abstract void playFromSearch(java.lang.String, android.os.Bundle);
-    method public abstract void rewind();
-    method public abstract void seekTo(long);
-    method public abstract void sendCustomAction(android.support.v4.media.session.PlaybackStateCompat.CustomAction, android.os.Bundle);
-    method public abstract void sendCustomAction(java.lang.String, android.os.Bundle);
-    method public abstract void setRating(android.support.v4.media.RatingCompat);
-    method public abstract void skipToNext();
-    method public abstract void skipToPrevious();
-    method public abstract void skipToQueueItem(long);
-    method public abstract void stop();
-  }
-
-  public class MediaSessionCompat {
-    ctor public MediaSessionCompat(android.content.Context, java.lang.String, android.content.ComponentName, android.app.PendingIntent);
-    method public void addOnActiveChangeListener(android.support.v4.media.session.MediaSessionCompat.OnActiveChangeListener);
-    method public android.support.v4.media.session.MediaControllerCompat getController();
-    method public java.lang.Object getMediaSession();
-    method public java.lang.Object getRemoteControlClient();
-    method public android.support.v4.media.session.MediaSessionCompat.Token getSessionToken();
-    method public boolean isActive();
-    method public static android.support.v4.media.session.MediaSessionCompat obtain(android.content.Context, java.lang.Object);
-    method public void release();
-    method public void removeOnActiveChangeListener(android.support.v4.media.session.MediaSessionCompat.OnActiveChangeListener);
-    method public void sendSessionEvent(java.lang.String, android.os.Bundle);
-    method public void setActive(boolean);
-    method public void setCallback(android.support.v4.media.session.MediaSessionCompat.Callback);
-    method public void setCallback(android.support.v4.media.session.MediaSessionCompat.Callback, android.os.Handler);
-    method public void setExtras(android.os.Bundle);
-    method public void setFlags(int);
-    method public void setMediaButtonReceiver(android.app.PendingIntent);
-    method public void setMetadata(android.support.v4.media.MediaMetadataCompat);
-    method public void setPlaybackState(android.support.v4.media.session.PlaybackStateCompat);
-    method public void setPlaybackToLocal(int);
-    method public void setPlaybackToRemote(android.support.v4.media.VolumeProviderCompat);
-    method public void setQueue(java.util.List<android.support.v4.media.session.MediaSessionCompat.QueueItem>);
-    method public void setQueueTitle(java.lang.CharSequence);
-    method public void setRatingType(int);
-    method public void setSessionActivity(android.app.PendingIntent);
-    field public static final int FLAG_HANDLES_MEDIA_BUTTONS = 1; // 0x1
-    field public static final int FLAG_HANDLES_TRANSPORT_CONTROLS = 2; // 0x2
-  }
-
-  public static abstract class MediaSessionCompat.Callback {
-    ctor public MediaSessionCompat.Callback();
-    method public void onCommand(java.lang.String, android.os.Bundle, android.os.ResultReceiver);
-    method public void onCustomAction(java.lang.String, android.os.Bundle);
-    method public void onFastForward();
-    method public boolean onMediaButtonEvent(android.content.Intent);
-    method public void onPause();
-    method public void onPlay();
-    method public void onPlayFromMediaId(java.lang.String, android.os.Bundle);
-    method public void onPlayFromSearch(java.lang.String, android.os.Bundle);
-    method public void onRewind();
-    method public void onSeekTo(long);
-    method public void onSetRating(android.support.v4.media.RatingCompat);
-    method public void onSkipToNext();
-    method public void onSkipToPrevious();
-    method public void onSkipToQueueItem(long);
-    method public void onStop();
-  }
-
-  public static abstract interface MediaSessionCompat.OnActiveChangeListener {
-    method public abstract void onActiveChanged();
-  }
-
-  public static final class MediaSessionCompat.QueueItem implements android.os.Parcelable {
-    ctor public MediaSessionCompat.QueueItem(android.support.v4.media.MediaDescriptionCompat, long);
-    method public int describeContents();
-    method public android.support.v4.media.MediaDescriptionCompat getDescription();
-    method public long getQueueId();
-    method public java.lang.Object getQueueItem();
-    method public static android.support.v4.media.session.MediaSessionCompat.QueueItem obtain(java.lang.Object);
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.support.v4.media.session.MediaSessionCompat.QueueItem> CREATOR;
-    field public static final int UNKNOWN_ID = -1; // 0xffffffff
-  }
-
-  public static final class MediaSessionCompat.Token implements android.os.Parcelable {
-    method public int describeContents();
-    method public static android.support.v4.media.session.MediaSessionCompat.Token fromToken(java.lang.Object);
-    method public java.lang.Object getToken();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.support.v4.media.session.MediaSessionCompat.Token> CREATOR;
-  }
-
-  public class ParcelableVolumeInfo implements android.os.Parcelable {
-    ctor public ParcelableVolumeInfo(int, int, int, int, int);
-    ctor public ParcelableVolumeInfo(android.os.Parcel);
-    method public int describeContents();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.support.v4.media.session.ParcelableVolumeInfo> CREATOR;
-    field public int audioStream;
-    field public int controlType;
-    field public int currentVolume;
-    field public int maxVolume;
-    field public int volumeType;
-  }
-
-  public final class PlaybackStateCompat implements android.os.Parcelable {
-    method public int describeContents();
-    method public static android.support.v4.media.session.PlaybackStateCompat fromPlaybackState(java.lang.Object);
-    method public long getActions();
-    method public long getBufferedPosition();
-    method public java.lang.CharSequence getErrorMessage();
-    method public long getLastPositionUpdateTime();
-    method public float getPlaybackSpeed();
-    method public java.lang.Object getPlaybackState();
-    method public long getPosition();
-    method public int getState();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final long ACTION_FAST_FORWARD = 64L; // 0x40L
-    field public static final long ACTION_PAUSE = 2L; // 0x2L
-    field public static final long ACTION_PLAY = 4L; // 0x4L
-    field public static final long ACTION_PLAY_FROM_MEDIA_ID = 1024L; // 0x400L
-    field public static final long ACTION_PLAY_FROM_SEARCH = 2048L; // 0x800L
-    field public static final long ACTION_PLAY_PAUSE = 512L; // 0x200L
-    field public static final long ACTION_REWIND = 8L; // 0x8L
-    field public static final long ACTION_SEEK_TO = 256L; // 0x100L
-    field public static final long ACTION_SET_RATING = 128L; // 0x80L
-    field public static final long ACTION_SKIP_TO_NEXT = 32L; // 0x20L
-    field public static final long ACTION_SKIP_TO_PREVIOUS = 16L; // 0x10L
-    field public static final long ACTION_SKIP_TO_QUEUE_ITEM = 4096L; // 0x1000L
-    field public static final long ACTION_STOP = 1L; // 0x1L
-    field public static final android.os.Parcelable.Creator<android.support.v4.media.session.PlaybackStateCompat> CREATOR;
-    field public static final long PLAYBACK_POSITION_UNKNOWN = -1L; // 0xffffffffffffffffL
-    field public static final int STATE_BUFFERING = 6; // 0x6
-    field public static final int STATE_ERROR = 7; // 0x7
-    field public static final int STATE_FAST_FORWARDING = 4; // 0x4
-    field public static final int STATE_NONE = 0; // 0x0
-    field public static final int STATE_PAUSED = 2; // 0x2
-    field public static final int STATE_PLAYING = 3; // 0x3
-    field public static final int STATE_REWINDING = 5; // 0x5
-    field public static final int STATE_SKIPPING_TO_NEXT = 10; // 0xa
-    field public static final int STATE_SKIPPING_TO_PREVIOUS = 9; // 0x9
-    field public static final int STATE_STOPPED = 1; // 0x1
-  }
-
-  public static final class PlaybackStateCompat.Builder {
-    ctor public PlaybackStateCompat.Builder();
-    ctor public PlaybackStateCompat.Builder(android.support.v4.media.session.PlaybackStateCompat);
-    method public android.support.v4.media.session.PlaybackStateCompat build();
-    method public android.support.v4.media.session.PlaybackStateCompat.Builder setActions(long);
-    method public android.support.v4.media.session.PlaybackStateCompat.Builder setBufferedPosition(long);
-    method public android.support.v4.media.session.PlaybackStateCompat.Builder setErrorMessage(java.lang.CharSequence);
-    method public android.support.v4.media.session.PlaybackStateCompat.Builder setState(int, long, float);
-    method public android.support.v4.media.session.PlaybackStateCompat.Builder setState(int, long, float, long);
-  }
-
-  public static final class PlaybackStateCompat.CustomAction implements android.os.Parcelable {
-    method public int describeContents();
-    method public java.lang.String getAction();
-    method public android.os.Bundle getExtras();
-    method public int getIcon();
-    method public java.lang.CharSequence getName();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.support.v4.media.session.PlaybackStateCompat.CustomAction> CREATOR;
-  }
-
-  public static final class PlaybackStateCompat.CustomAction.Builder {
-    ctor public PlaybackStateCompat.CustomAction.Builder(java.lang.String, java.lang.CharSequence, int);
-    method public android.support.v4.media.session.PlaybackStateCompat.CustomAction build();
-    method public android.support.v4.media.session.PlaybackStateCompat.CustomAction.Builder setExtras(android.os.Bundle);
-  }
-
-}
-
-package android.support.v4.net {
-
-  public class ConnectivityManagerCompat {
-    ctor public ConnectivityManagerCompat();
-    method public static android.net.NetworkInfo getNetworkInfoFromBroadcast(android.net.ConnectivityManager, android.content.Intent);
-    method public static boolean isActiveNetworkMetered(android.net.ConnectivityManager);
-  }
-
-  public class TrafficStatsCompat {
-    ctor public TrafficStatsCompat();
-    method public static void clearThreadStatsTag();
-    method public static int getThreadStatsTag();
-    method public static void incrementOperationCount(int);
-    method public static void incrementOperationCount(int, int);
-    method public static void setThreadStatsTag(int);
-    method public static void tagSocket(java.net.Socket) throws java.net.SocketException;
-    method public static void untagSocket(java.net.Socket) throws java.net.SocketException;
-  }
-
-}
-
-package android.support.v4.os {
-
-  public class AsyncTaskCompat {
-    ctor public AsyncTaskCompat();
-    method public static android.os.AsyncTask<Params, Progress, Result> executeParallel(android.os.AsyncTask<Params, Progress, Result>, Params...);
-  }
-
-  public class EnvironmentCompat {
-    ctor public EnvironmentCompat();
-    method public static java.lang.String getStorageState(java.io.File);
-    field public static final java.lang.String MEDIA_UNKNOWN = "unknown";
-  }
-
-  public class ParcelableCompat {
-    ctor public ParcelableCompat();
-    method public static android.os.Parcelable.Creator<T> newCreator(android.support.v4.os.ParcelableCompatCreatorCallbacks<T>);
-  }
-
-  public abstract interface ParcelableCompatCreatorCallbacks {
-    method public abstract T createFromParcel(android.os.Parcel, java.lang.ClassLoader);
-    method public abstract T[] newArray(int);
-  }
-
-}
-
-package android.support.v4.print {
-
-  public final class PrintHelper {
-    ctor public PrintHelper(android.content.Context);
-    method public int getColorMode();
-    method public int getOrientation();
-    method public int getScaleMode();
-    method public void printBitmap(java.lang.String, android.graphics.Bitmap);
-    method public void printBitmap(java.lang.String, android.graphics.Bitmap, android.support.v4.print.PrintHelper.OnPrintFinishCallback);
-    method public void printBitmap(java.lang.String, android.net.Uri) throws java.io.FileNotFoundException;
-    method public void printBitmap(java.lang.String, android.net.Uri, android.support.v4.print.PrintHelper.OnPrintFinishCallback) throws java.io.FileNotFoundException;
-    method public void setColorMode(int);
-    method public void setOrientation(int);
-    method public void setScaleMode(int);
-    method public static boolean systemSupportsPrint();
-    field public static final int COLOR_MODE_COLOR = 2; // 0x2
-    field public static final int COLOR_MODE_MONOCHROME = 1; // 0x1
-    field public static final int ORIENTATION_LANDSCAPE = 1; // 0x1
-    field public static final int ORIENTATION_PORTRAIT = 2; // 0x2
-    field public static final int SCALE_MODE_FILL = 2; // 0x2
-    field public static final int SCALE_MODE_FIT = 1; // 0x1
-  }
-
-  public static abstract interface PrintHelper.OnPrintFinishCallback {
-    method public abstract void onFinish();
-  }
-
-}
-
-package android.support.v4.provider {
-
-  public abstract class DocumentFile {
-    method public abstract boolean canRead();
-    method public abstract boolean canWrite();
-    method public abstract android.support.v4.provider.DocumentFile createDirectory(java.lang.String);
-    method public abstract android.support.v4.provider.DocumentFile createFile(java.lang.String, java.lang.String);
-    method public abstract boolean delete();
-    method public abstract boolean exists();
-    method public android.support.v4.provider.DocumentFile findFile(java.lang.String);
-    method public static android.support.v4.provider.DocumentFile fromFile(java.io.File);
-    method public static android.support.v4.provider.DocumentFile fromSingleUri(android.content.Context, android.net.Uri);
-    method public static android.support.v4.provider.DocumentFile fromTreeUri(android.content.Context, android.net.Uri);
-    method public abstract java.lang.String getName();
-    method public android.support.v4.provider.DocumentFile getParentFile();
-    method public abstract java.lang.String getType();
-    method public abstract android.net.Uri getUri();
-    method public abstract boolean isDirectory();
-    method public static boolean isDocumentUri(android.content.Context, android.net.Uri);
-    method public abstract boolean isFile();
-    method public abstract long lastModified();
-    method public abstract long length();
-    method public abstract android.support.v4.provider.DocumentFile[] listFiles();
-    method public abstract boolean renameTo(java.lang.String);
-  }
-
-}
-
-package android.support.v4.text {
-
-  public final class BidiFormatter {
-    method public static android.support.v4.text.BidiFormatter getInstance();
-    method public static android.support.v4.text.BidiFormatter getInstance(boolean);
-    method public static android.support.v4.text.BidiFormatter getInstance(java.util.Locale);
-    method public boolean getStereoReset();
-    method public boolean isRtl(java.lang.String);
-    method public boolean isRtlContext();
-    method public java.lang.String unicodeWrap(java.lang.String, android.support.v4.text.TextDirectionHeuristicCompat, boolean);
-    method public java.lang.String unicodeWrap(java.lang.String, android.support.v4.text.TextDirectionHeuristicCompat);
-    method public java.lang.String unicodeWrap(java.lang.String, boolean);
-    method public java.lang.String unicodeWrap(java.lang.String);
-  }
-
-  public static final class BidiFormatter.Builder {
-    ctor public BidiFormatter.Builder();
-    ctor public BidiFormatter.Builder(boolean);
-    ctor public BidiFormatter.Builder(java.util.Locale);
-    method public android.support.v4.text.BidiFormatter build();
-    method public android.support.v4.text.BidiFormatter.Builder setTextDirectionHeuristic(android.support.v4.text.TextDirectionHeuristicCompat);
-    method public android.support.v4.text.BidiFormatter.Builder stereoReset(boolean);
-  }
-
-  public class ICUCompat {
-    ctor public ICUCompat();
-    method public static java.lang.String addLikelySubtags(java.lang.String);
-    method public static java.lang.String getScript(java.lang.String);
-  }
-
-  public abstract interface TextDirectionHeuristicCompat {
-    method public abstract boolean isRtl(char[], int, int);
-    method public abstract boolean isRtl(java.lang.CharSequence, int, int);
-  }
-
-  public class TextDirectionHeuristicsCompat {
-    ctor public TextDirectionHeuristicsCompat();
-    field public static final android.support.v4.text.TextDirectionHeuristicCompat ANYRTL_LTR;
-    field public static final android.support.v4.text.TextDirectionHeuristicCompat FIRSTSTRONG_LTR;
-    field public static final android.support.v4.text.TextDirectionHeuristicCompat FIRSTSTRONG_RTL;
-    field public static final android.support.v4.text.TextDirectionHeuristicCompat LOCALE;
-    field public static final android.support.v4.text.TextDirectionHeuristicCompat LTR;
-    field public static final android.support.v4.text.TextDirectionHeuristicCompat RTL;
-  }
-
-  public class TextUtilsCompat {
-    ctor public TextUtilsCompat();
-    method public static int getLayoutDirectionFromLocale(java.util.Locale);
-    method public static java.lang.String htmlEncode(java.lang.String);
-    field public static final java.util.Locale ROOT;
-  }
-
-}
-
-package android.support.v4.util {
-
-  public class ArrayMap extends android.support.v4.util.SimpleArrayMap implements java.util.Map {
-    ctor public ArrayMap();
-    ctor public ArrayMap(int);
-    ctor public ArrayMap(android.support.v4.util.SimpleArrayMap);
-    method public boolean containsAll(java.util.Collection<?>);
-    method public java.util.Set<java.util.Map.Entry<K, V>> entrySet();
-    method public java.util.Set<K> keySet();
-    method public void putAll(java.util.Map<? extends K, ? extends V>);
-    method public boolean removeAll(java.util.Collection<?>);
-    method public boolean retainAll(java.util.Collection<?>);
-    method public java.util.Collection<V> values();
-  }
-
-  public class AtomicFile {
-    ctor public AtomicFile(java.io.File);
-    method public void delete();
-    method public void failWrite(java.io.FileOutputStream);
-    method public void finishWrite(java.io.FileOutputStream);
-    method public java.io.File getBaseFile();
-    method public java.io.FileInputStream openRead() throws java.io.FileNotFoundException;
-    method public byte[] readFully() throws java.io.IOException;
-    method public java.io.FileOutputStream startWrite() throws java.io.IOException;
-  }
-
-  public class CircularArray {
-    ctor public CircularArray();
-    ctor public CircularArray(int);
-    method public final void addFirst(E);
-    method public final void addLast(E);
-    method public final E get(int);
-    method public final E getFirst();
-    method public final E getLast();
-    method public final boolean isEmpty();
-    method public final E popFirst();
-    method public final E popLast();
-    method public final int size();
-  }
-
-  public class LongSparseArray {
-    ctor public LongSparseArray();
-    ctor public LongSparseArray(int);
-    method public void append(long, E);
-    method public void clear();
-    method public android.support.v4.util.LongSparseArray<E> clone();
-    method public void delete(long);
-    method public E get(long);
-    method public E get(long, E);
-    method public int indexOfKey(long);
-    method public int indexOfValue(E);
-    method public long keyAt(int);
-    method public void put(long, E);
-    method public void remove(long);
-    method public void removeAt(int);
-    method public void setValueAt(int, E);
-    method public int size();
-    method public E valueAt(int);
-  }
-
-  public class LruCache {
-    ctor public LruCache(int);
-    method protected V create(K);
-    method public final synchronized int createCount();
-    method protected void entryRemoved(boolean, K, V, V);
-    method public final void evictAll();
-    method public final synchronized int evictionCount();
-    method public final V get(K);
-    method public final synchronized int hitCount();
-    method public final synchronized int maxSize();
-    method public final synchronized int missCount();
-    method public final V put(K, V);
-    method public final synchronized int putCount();
-    method public final V remove(K);
-    method public void resize(int);
-    method public final synchronized int size();
-    method protected int sizeOf(K, V);
-    method public final synchronized java.util.Map<K, V> snapshot();
-    method public final synchronized java.lang.String toString();
-    method public void trimToSize(int);
-  }
-
-  public class Pair {
-    ctor public Pair(F, S);
-    method public static android.support.v4.util.Pair<A, B> create(A, B);
-    field public final F first;
-    field public final S second;
-  }
-
-  public final class Pools {
-  }
-
-  public static abstract interface Pools.Pool {
-    method public abstract T acquire();
-    method public abstract boolean release(T);
-  }
-
-  public static class Pools.SimplePool implements android.support.v4.util.Pools.Pool {
-    ctor public Pools.SimplePool(int);
-    method public T acquire();
-    method public boolean release(T);
-  }
-
-  public static class Pools.SynchronizedPool extends android.support.v4.util.Pools.SimplePool {
-    ctor public Pools.SynchronizedPool(int);
-  }
-
-  public class SimpleArrayMap {
-    ctor public SimpleArrayMap();
-    ctor public SimpleArrayMap(int);
-    ctor public SimpleArrayMap(android.support.v4.util.SimpleArrayMap);
-    method public void clear();
-    method public boolean containsKey(java.lang.Object);
-    method public boolean containsValue(java.lang.Object);
-    method public void ensureCapacity(int);
-    method public V get(java.lang.Object);
-    method public int indexOfKey(java.lang.Object);
-    method public boolean isEmpty();
-    method public K keyAt(int);
-    method public V put(K, V);
-    method public void putAll(android.support.v4.util.SimpleArrayMap<? extends K, ? extends V>);
-    method public V remove(java.lang.Object);
-    method public V removeAt(int);
-    method public V setValueAt(int, V);
-    method public int size();
-    method public V valueAt(int);
-  }
-
-  public class SparseArrayCompat {
-    ctor public SparseArrayCompat();
-    ctor public SparseArrayCompat(int);
-    method public void append(int, E);
-    method public void clear();
-    method public android.support.v4.util.SparseArrayCompat<E> clone();
-    method public void delete(int);
-    method public E get(int);
-    method public E get(int, E);
-    method public int indexOfKey(int);
-    method public int indexOfValue(E);
-    method public int keyAt(int);
-    method public void put(int, E);
-    method public void remove(int);
-    method public void removeAt(int);
-    method public void removeAtRange(int, int);
-    method public void setValueAt(int, E);
-    method public int size();
-    method public E valueAt(int);
-  }
-
-}
-
-package android.support.v4.view {
-
-  public class AccessibilityDelegateCompat {
-    ctor public AccessibilityDelegateCompat();
-    method public boolean dispatchPopulateAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
-    method public android.support.v4.view.accessibility.AccessibilityNodeProviderCompat getAccessibilityNodeProvider(android.view.View);
-    method public void onInitializeAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
-    method public void onInitializeAccessibilityNodeInfo(android.view.View, android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
-    method public void onPopulateAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
-    method public boolean onRequestSendAccessibilityEvent(android.view.ViewGroup, android.view.View, android.view.accessibility.AccessibilityEvent);
-    method public boolean performAccessibilityAction(android.view.View, int, android.os.Bundle);
-    method public void sendAccessibilityEvent(android.view.View, int);
-    method public void sendAccessibilityEventUnchecked(android.view.View, android.view.accessibility.AccessibilityEvent);
-  }
-
-  public abstract class ActionProvider {
-    ctor public ActionProvider(android.content.Context);
-    method public android.content.Context getContext();
-    method public boolean hasSubMenu();
-    method public boolean isVisible();
-    method public abstract android.view.View onCreateActionView();
-    method public android.view.View onCreateActionView(android.view.MenuItem);
-    method public boolean onPerformDefaultAction();
-    method public void onPrepareSubMenu(android.view.SubMenu);
-    method public boolean overridesItemVisibility();
-    method public void refreshVisibility();
-    method public void setVisibilityListener(android.support.v4.view.ActionProvider.VisibilityListener);
-  }
-
-  public static abstract interface ActionProvider.VisibilityListener {
-    method public abstract void onActionProviderVisibilityChanged(boolean);
-  }
-
-  public class GestureDetectorCompat {
-    ctor public GestureDetectorCompat(android.content.Context, android.view.GestureDetector.OnGestureListener);
-    ctor public GestureDetectorCompat(android.content.Context, android.view.GestureDetector.OnGestureListener, android.os.Handler);
-    method public boolean isLongpressEnabled();
-    method public boolean onTouchEvent(android.view.MotionEvent);
-    method public void setIsLongpressEnabled(boolean);
-    method public void setOnDoubleTapListener(android.view.GestureDetector.OnDoubleTapListener);
-  }
-
-  public class GravityCompat {
-    ctor public GravityCompat();
-    method public static void apply(int, int, int, android.graphics.Rect, android.graphics.Rect, int);
-    method public static void apply(int, int, int, android.graphics.Rect, int, int, android.graphics.Rect, int);
-    method public static void applyDisplay(int, android.graphics.Rect, android.graphics.Rect, int);
-    method public static int getAbsoluteGravity(int, int);
-    field public static final int END = 8388613; // 0x800005
-    field public static final int RELATIVE_HORIZONTAL_GRAVITY_MASK = 8388615; // 0x800007
-    field public static final int RELATIVE_LAYOUT_DIRECTION = 8388608; // 0x800000
-    field public static final int START = 8388611; // 0x800003
-  }
-
-  public class KeyEventCompat {
-    ctor public KeyEventCompat();
-    method public static boolean dispatch(android.view.KeyEvent, android.view.KeyEvent.Callback, java.lang.Object, java.lang.Object);
-    method public static java.lang.Object getKeyDispatcherState(android.view.View);
-    method public static boolean hasModifiers(android.view.KeyEvent, int);
-    method public static boolean hasNoModifiers(android.view.KeyEvent);
-    method public static boolean isTracking(android.view.KeyEvent);
-    method public static boolean metaStateHasModifiers(int, int);
-    method public static boolean metaStateHasNoModifiers(int);
-    method public static int normalizeMetaState(int);
-    method public static void startTracking(android.view.KeyEvent);
-  }
-
-  public class MarginLayoutParamsCompat {
-    ctor public MarginLayoutParamsCompat();
-    method public static int getLayoutDirection(android.view.ViewGroup.MarginLayoutParams);
-    method public static int getMarginEnd(android.view.ViewGroup.MarginLayoutParams);
-    method public static int getMarginStart(android.view.ViewGroup.MarginLayoutParams);
-    method public static boolean isMarginRelative(android.view.ViewGroup.MarginLayoutParams);
-    method public static void resolveLayoutDirection(android.view.ViewGroup.MarginLayoutParams, int);
-    method public static void setLayoutDirection(android.view.ViewGroup.MarginLayoutParams, int);
-    method public static void setMarginEnd(android.view.ViewGroup.MarginLayoutParams, int);
-    method public static void setMarginStart(android.view.ViewGroup.MarginLayoutParams, int);
-  }
-
-  public class MenuCompat {
-    ctor public MenuCompat();
-    method public static deprecated void setShowAsAction(android.view.MenuItem, int);
-  }
-
-  public class MenuItemCompat {
-    ctor public MenuItemCompat();
-    method public static boolean collapseActionView(android.view.MenuItem);
-    method public static boolean expandActionView(android.view.MenuItem);
-    method public static android.support.v4.view.ActionProvider getActionProvider(android.view.MenuItem);
-    method public static android.view.View getActionView(android.view.MenuItem);
-    method public static boolean isActionViewExpanded(android.view.MenuItem);
-    method public static android.view.MenuItem setActionProvider(android.view.MenuItem, android.support.v4.view.ActionProvider);
-    method public static android.view.MenuItem setActionView(android.view.MenuItem, android.view.View);
-    method public static android.view.MenuItem setActionView(android.view.MenuItem, int);
-    method public static android.view.MenuItem setOnActionExpandListener(android.view.MenuItem, android.support.v4.view.MenuItemCompat.OnActionExpandListener);
-    method public static void setShowAsAction(android.view.MenuItem, int);
-    field public static final int SHOW_AS_ACTION_ALWAYS = 2; // 0x2
-    field public static final int SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW = 8; // 0x8
-    field public static final int SHOW_AS_ACTION_IF_ROOM = 1; // 0x1
-    field public static final int SHOW_AS_ACTION_NEVER = 0; // 0x0
-    field public static final int SHOW_AS_ACTION_WITH_TEXT = 4; // 0x4
-  }
-
-  public static abstract interface MenuItemCompat.OnActionExpandListener {
-    method public abstract boolean onMenuItemActionCollapse(android.view.MenuItem);
-    method public abstract boolean onMenuItemActionExpand(android.view.MenuItem);
-  }
-
-  public class MotionEventCompat {
-    ctor public MotionEventCompat();
-    method public static int findPointerIndex(android.view.MotionEvent, int);
-    method public static int getActionIndex(android.view.MotionEvent);
-    method public static int getActionMasked(android.view.MotionEvent);
-    method public static int getPointerCount(android.view.MotionEvent);
-    method public static int getPointerId(android.view.MotionEvent, int);
-    method public static float getX(android.view.MotionEvent, int);
-    method public static float getY(android.view.MotionEvent, int);
-    field public static final int ACTION_HOVER_ENTER = 9; // 0x9
-    field public static final int ACTION_HOVER_EXIT = 10; // 0xa
-    field public static final int ACTION_HOVER_MOVE = 7; // 0x7
-    field public static final int ACTION_MASK = 255; // 0xff
-    field public static final int ACTION_POINTER_DOWN = 5; // 0x5
-    field public static final int ACTION_POINTER_INDEX_MASK = 65280; // 0xff00
-    field public static final int ACTION_POINTER_INDEX_SHIFT = 8; // 0x8
-    field public static final int ACTION_POINTER_UP = 6; // 0x6
-    field public static final int ACTION_SCROLL = 8; // 0x8
-  }
-
-  public abstract interface OnApplyWindowInsetsListener {
-    method public abstract android.support.v4.view.WindowInsetsCompat onApplyWindowInsets(android.view.View, android.support.v4.view.WindowInsetsCompat);
-  }
-
-  public abstract class PagerAdapter {
-    ctor public PagerAdapter();
-    method public void destroyItem(android.view.ViewGroup, int, java.lang.Object);
-    method public deprecated void destroyItem(android.view.View, int, java.lang.Object);
-    method public void finishUpdate(android.view.ViewGroup);
-    method public deprecated void finishUpdate(android.view.View);
-    method public abstract int getCount();
-    method public int getItemPosition(java.lang.Object);
-    method public java.lang.CharSequence getPageTitle(int);
-    method public float getPageWidth(int);
-    method public java.lang.Object instantiateItem(android.view.ViewGroup, int);
-    method public deprecated java.lang.Object instantiateItem(android.view.View, int);
-    method public abstract boolean isViewFromObject(android.view.View, java.lang.Object);
-    method public void notifyDataSetChanged();
-    method public void registerDataSetObserver(android.database.DataSetObserver);
-    method public void restoreState(android.os.Parcelable, java.lang.ClassLoader);
-    method public android.os.Parcelable saveState();
-    method public void setPrimaryItem(android.view.ViewGroup, int, java.lang.Object);
-    method public deprecated void setPrimaryItem(android.view.View, int, java.lang.Object);
-    method public void startUpdate(android.view.ViewGroup);
-    method public deprecated void startUpdate(android.view.View);
-    method public void unregisterDataSetObserver(android.database.DataSetObserver);
-    field public static final int POSITION_NONE = -2; // 0xfffffffe
-    field public static final int POSITION_UNCHANGED = -1; // 0xffffffff
-  }
-
-  public class PagerTabStrip extends android.support.v4.view.PagerTitleStrip {
-    ctor public PagerTabStrip(android.content.Context);
-    ctor public PagerTabStrip(android.content.Context, android.util.AttributeSet);
-    method public boolean getDrawFullUnderline();
-    method public int getTabIndicatorColor();
-    method public void setDrawFullUnderline(boolean);
-    method public void setTabIndicatorColor(int);
-    method public void setTabIndicatorColorResource(int);
-  }
-
-  public class PagerTitleStrip extends android.view.ViewGroup {
-    ctor public PagerTitleStrip(android.content.Context);
-    ctor public PagerTitleStrip(android.content.Context, android.util.AttributeSet);
-    method public int getTextSpacing();
-    method protected void onLayout(boolean, int, int, int, int);
-    method public void setGravity(int);
-    method public void setNonPrimaryAlpha(float);
-    method public void setTextColor(int);
-    method public void setTextSize(int, float);
-    method public void setTextSpacing(int);
-  }
-
-  public class ScaleGestureDetectorCompat {
-    method public static boolean isQuickScaleEnabled(java.lang.Object);
-    method public static void setQuickScaleEnabled(java.lang.Object, boolean);
-  }
-
-  public class VelocityTrackerCompat {
-    ctor public VelocityTrackerCompat();
-    method public static float getXVelocity(android.view.VelocityTracker, int);
-    method public static float getYVelocity(android.view.VelocityTracker, int);
-  }
-
-  public class ViewCompat {
-    ctor public ViewCompat();
-    method public static android.support.v4.view.ViewPropertyAnimatorCompat animate(android.view.View);
-    method public static boolean canScrollHorizontally(android.view.View, int);
-    method public static boolean canScrollVertically(android.view.View, int);
-    method public static void dispatchFinishTemporaryDetach(android.view.View);
-    method public static void dispatchStartTemporaryDetach(android.view.View);
-    method public static int getAccessibilityLiveRegion(android.view.View);
-    method public static android.support.v4.view.accessibility.AccessibilityNodeProviderCompat getAccessibilityNodeProvider(android.view.View);
-    method public static float getAlpha(android.view.View);
-    method public static float getElevation(android.view.View);
-    method public static boolean getFitsSystemWindows(android.view.View);
-    method public static int getImportantForAccessibility(android.view.View);
-    method public static int getLabelFor(android.view.View);
-    method public static int getLayerType(android.view.View);
-    method public static int getLayoutDirection(android.view.View);
-    method public static int getMeasuredHeightAndState(android.view.View);
-    method public static int getMeasuredState(android.view.View);
-    method public static int getMeasuredWidthAndState(android.view.View);
-    method public static int getMinimumHeight(android.view.View);
-    method public static int getMinimumWidth(android.view.View);
-    method public static int getOverScrollMode(android.view.View);
-    method public static int getPaddingEnd(android.view.View);
-    method public static int getPaddingStart(android.view.View);
-    method public static android.view.ViewParent getParentForAccessibility(android.view.View);
-    method public static float getPivotX(android.view.View);
-    method public static float getPivotY(android.view.View);
-    method public static float getRotation(android.view.View);
-    method public static float getRotationX(android.view.View);
-    method public static float getRotationY(android.view.View);
-    method public static float getScaleX(android.view.View);
-    method public static float getScaleY(android.view.View);
-    method public static java.lang.String getTransitionName(android.view.View);
-    method public static float getTranslationX(android.view.View);
-    method public static float getTranslationY(android.view.View);
-    method public static float getTranslationZ(android.view.View);
-    method public static int getWindowSystemUiVisibility(android.view.View);
-    method public static float getX(android.view.View);
-    method public static float getY(android.view.View);
-    method public static boolean hasAccessibilityDelegate(android.view.View);
-    method public static boolean hasTransientState(android.view.View);
-    method public static boolean isOpaque(android.view.View);
-    method public static void jumpDrawablesToCurrentState(android.view.View);
-    method public static void onInitializeAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
-    method public static void onInitializeAccessibilityNodeInfo(android.view.View, android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
-    method public static void onPopulateAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
-    method public static boolean performAccessibilityAction(android.view.View, int, android.os.Bundle);
-    method public static void postInvalidateOnAnimation(android.view.View);
-    method public static void postInvalidateOnAnimation(android.view.View, int, int, int, int);
-    method public static void postOnAnimation(android.view.View, java.lang.Runnable);
-    method public static void postOnAnimationDelayed(android.view.View, java.lang.Runnable, long);
-    method public static void requestApplyInsets(android.view.View);
-    method public static int resolveSizeAndState(int, int, int);
-    method public static void setAccessibilityDelegate(android.view.View, android.support.v4.view.AccessibilityDelegateCompat);
-    method public static void setAccessibilityLiveRegion(android.view.View, int);
-    method public static void setActivated(android.view.View, boolean);
-    method public static void setAlpha(android.view.View, float);
-    method public static void setChildrenDrawingOrderEnabled(android.view.ViewGroup, boolean);
-    method public static void setElevation(android.view.View, float);
-    method public static void setFitsSystemWindows(android.view.View, boolean);
-    method public static void setHasTransientState(android.view.View, boolean);
-    method public static void setImportantForAccessibility(android.view.View, int);
-    method public static void setLabelFor(android.view.View, int);
-    method public static void setLayerPaint(android.view.View, android.graphics.Paint);
-    method public static void setLayerType(android.view.View, int, android.graphics.Paint);
-    method public static void setLayoutDirection(android.view.View, int);
-    method public static void setOnApplyWindowInsetsListener(android.view.View, android.support.v4.view.OnApplyWindowInsetsListener);
-    method public static void setOverScrollMode(android.view.View, int);
-    method public static void setPaddingRelative(android.view.View, int, int, int, int);
-    method public static void setPivotX(android.view.View, float);
-    method public static void setPivotY(android.view.View, float);
-    method public static void setRotation(android.view.View, float);
-    method public static void setRotationX(android.view.View, float);
-    method public static void setRotationY(android.view.View, float);
-    method public static void setSaveFromParentEnabled(android.view.View, boolean);
-    method public static void setScaleX(android.view.View, float);
-    method public static void setScaleY(android.view.View, float);
-    method public static void setTransitionName(android.view.View, java.lang.String);
-    method public static void setTranslationX(android.view.View, float);
-    method public static void setTranslationY(android.view.View, float);
-    method public static void setTranslationZ(android.view.View, float);
-    method public static void setX(android.view.View, float);
-    method public static void setY(android.view.View, float);
-    field public static final int ACCESSIBILITY_LIVE_REGION_ASSERTIVE = 2; // 0x2
-    field public static final int ACCESSIBILITY_LIVE_REGION_NONE = 0; // 0x0
-    field public static final int ACCESSIBILITY_LIVE_REGION_POLITE = 1; // 0x1
-    field public static final int IMPORTANT_FOR_ACCESSIBILITY_AUTO = 0; // 0x0
-    field public static final int IMPORTANT_FOR_ACCESSIBILITY_NO = 2; // 0x2
-    field public static final int IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS = 4; // 0x4
-    field public static final int IMPORTANT_FOR_ACCESSIBILITY_YES = 1; // 0x1
-    field public static final int LAYER_TYPE_HARDWARE = 2; // 0x2
-    field public static final int LAYER_TYPE_NONE = 0; // 0x0
-    field public static final int LAYER_TYPE_SOFTWARE = 1; // 0x1
-    field public static final int LAYOUT_DIRECTION_INHERIT = 2; // 0x2
-    field public static final int LAYOUT_DIRECTION_LOCALE = 3; // 0x3
-    field public static final int LAYOUT_DIRECTION_LTR = 0; // 0x0
-    field public static final int LAYOUT_DIRECTION_RTL = 1; // 0x1
-    field public static final int MEASURED_HEIGHT_STATE_SHIFT = 16; // 0x10
-    field public static final int MEASURED_SIZE_MASK = 16777215; // 0xffffff
-    field public static final int MEASURED_STATE_MASK = -16777216; // 0xff000000
-    field public static final int MEASURED_STATE_TOO_SMALL = 16777216; // 0x1000000
-    field public static final int OVER_SCROLL_ALWAYS = 0; // 0x0
-    field public static final int OVER_SCROLL_IF_CONTENT_SCROLLS = 1; // 0x1
-    field public static final int OVER_SCROLL_NEVER = 2; // 0x2
-  }
-
-  public class ViewConfigurationCompat {
-    ctor public ViewConfigurationCompat();
-    method public static int getScaledPagingTouchSlop(android.view.ViewConfiguration);
-    method public static boolean hasPermanentMenuKey(android.view.ViewConfiguration);
-  }
-
-  public class ViewGroupCompat {
-    method public static int getLayoutMode(android.view.ViewGroup);
-    method public static boolean isTransitionGroup(android.view.ViewGroup);
-    method public static boolean onRequestSendAccessibilityEvent(android.view.ViewGroup, android.view.View, android.view.accessibility.AccessibilityEvent);
-    method public static void setLayoutMode(android.view.ViewGroup, int);
-    method public static void setMotionEventSplittingEnabled(android.view.ViewGroup, boolean);
-    method public static void setTransitionGroup(android.view.ViewGroup, boolean);
-    field public static final int LAYOUT_MODE_CLIP_BOUNDS = 0; // 0x0
-    field public static final int LAYOUT_MODE_OPTICAL_BOUNDS = 1; // 0x1
-  }
-
-  public class ViewPager extends android.view.ViewGroup {
-    ctor public ViewPager(android.content.Context);
-    ctor public ViewPager(android.content.Context, android.util.AttributeSet);
-    method public boolean arrowScroll(int);
-    method public boolean beginFakeDrag();
-    method protected boolean canScroll(android.view.View, boolean, int, int, int);
-    method public void endFakeDrag();
-    method public boolean executeKeyEvent(android.view.KeyEvent);
-    method public void fakeDragBy(float);
-    method public android.support.v4.view.PagerAdapter getAdapter();
-    method public int getCurrentItem();
-    method public int getOffscreenPageLimit();
-    method public int getPageMargin();
-    method public boolean isFakeDragging();
-    method protected void onLayout(boolean, int, int, int, int);
-    method protected void onPageScrolled(int, float, int);
-    method public void onRestoreInstanceState(android.os.Parcelable);
-    method public android.os.Parcelable onSaveInstanceState();
-    method public void setAdapter(android.support.v4.view.PagerAdapter);
-    method public void setCurrentItem(int);
-    method public void setCurrentItem(int, boolean);
-    method public void setOffscreenPageLimit(int);
-    method public void setOnPageChangeListener(android.support.v4.view.ViewPager.OnPageChangeListener);
-    method public void setPageMargin(int);
-    method public void setPageMarginDrawable(android.graphics.drawable.Drawable);
-    method public void setPageMarginDrawable(int);
-    method public void setPageTransformer(boolean, android.support.v4.view.ViewPager.PageTransformer);
-    field public static final int SCROLL_STATE_DRAGGING = 1; // 0x1
-    field public static final int SCROLL_STATE_IDLE = 0; // 0x0
-    field public static final int SCROLL_STATE_SETTLING = 2; // 0x2
-  }
-
-  public static class ViewPager.LayoutParams extends android.view.ViewGroup.LayoutParams {
-    ctor public ViewPager.LayoutParams();
-    ctor public ViewPager.LayoutParams(android.content.Context, android.util.AttributeSet);
-    field public int gravity;
-    field public boolean isDecor;
-  }
-
-  public static abstract interface ViewPager.OnPageChangeListener {
-    method public abstract void onPageScrollStateChanged(int);
-    method public abstract void onPageScrolled(int, float, int);
-    method public abstract void onPageSelected(int);
-  }
-
-  public static abstract interface ViewPager.PageTransformer {
-    method public abstract void transformPage(android.view.View, float);
-  }
-
-  public static class ViewPager.SavedState extends android.view.View.BaseSavedState {
-    ctor public ViewPager.SavedState(android.os.Parcelable);
-    field public static final android.os.Parcelable.Creator<android.support.v4.view.ViewPager.SavedState> CREATOR;
-  }
-
-  public static class ViewPager.SimpleOnPageChangeListener implements android.support.v4.view.ViewPager.OnPageChangeListener {
-    ctor public ViewPager.SimpleOnPageChangeListener();
-    method public void onPageScrollStateChanged(int);
-    method public void onPageScrolled(int, float, int);
-    method public void onPageSelected(int);
-  }
-
-  public class ViewParentCompat {
-    method public static boolean requestSendAccessibilityEvent(android.view.ViewParent, android.view.View, android.view.accessibility.AccessibilityEvent);
-  }
-
-  public class ViewPropertyAnimatorCompat {
-    method public android.support.v4.view.ViewPropertyAnimatorCompat alpha(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat alphaBy(float);
-    method public void cancel();
-    method public long getDuration();
-    method public android.view.animation.Interpolator getInterpolator();
-    method public long getStartDelay();
-    method public android.support.v4.view.ViewPropertyAnimatorCompat rotation(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat rotationBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat rotationX(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat rotationXBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat rotationY(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat rotationYBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat scaleX(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat scaleXBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat scaleY(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat scaleYBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat setDuration(long);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat setInterpolator(android.view.animation.Interpolator);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat setListener(android.support.v4.view.ViewPropertyAnimatorListener);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat setStartDelay(long);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat setUpdateListener(android.support.v4.view.ViewPropertyAnimatorUpdateListener);
-    method public void start();
-    method public android.support.v4.view.ViewPropertyAnimatorCompat translationX(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat translationXBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat translationY(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat translationYBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat withEndAction(java.lang.Runnable);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat withLayer();
-    method public android.support.v4.view.ViewPropertyAnimatorCompat withStartAction(java.lang.Runnable);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat x(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat xBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat y(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat yBy(float);
-  }
-
-  public abstract interface ViewPropertyAnimatorListener {
-    method public abstract void onAnimationCancel(android.view.View);
-    method public abstract void onAnimationEnd(android.view.View);
-    method public abstract void onAnimationStart(android.view.View);
-  }
-
-  public class ViewPropertyAnimatorListenerAdapter implements android.support.v4.view.ViewPropertyAnimatorListener {
-    ctor public ViewPropertyAnimatorListenerAdapter();
-    method public void onAnimationCancel(android.view.View);
-    method public void onAnimationEnd(android.view.View);
-    method public void onAnimationStart(android.view.View);
-  }
-
-  public abstract interface ViewPropertyAnimatorUpdateListener {
-    method public abstract void onAnimationUpdate(android.view.View);
-  }
-
-  public class WindowCompat {
-    ctor public WindowCompat();
-    field public static final int FEATURE_ACTION_BAR = 8; // 0x8
-    field public static final int FEATURE_ACTION_BAR_OVERLAY = 9; // 0x9
-    field public static final int FEATURE_ACTION_MODE_OVERLAY = 10; // 0xa
-  }
-
-  public class WindowInsetsCompat {
-    method public android.support.v4.view.WindowInsetsCompat consumeStableInsets();
-    method public android.support.v4.view.WindowInsetsCompat consumeSystemWindowInsets();
-    method public int getStableInsetBottom();
-    method public int getStableInsetLeft();
-    method public int getStableInsetRight();
-    method public int getStableInsetTop();
-    method public int getSystemWindowInsetBottom();
-    method public int getSystemWindowInsetLeft();
-    method public int getSystemWindowInsetRight();
-    method public int getSystemWindowInsetTop();
-    method public boolean hasInsets();
-    method public boolean hasStableInsets();
-    method public boolean hasSystemWindowInsets();
-    method public boolean isConsumed();
-    method public boolean isRound();
-    method public android.support.v4.view.WindowInsetsCompat replaceSystemWindowInsets(int, int, int, int);
-    method public android.support.v4.view.WindowInsetsCompat replaceSystemWindowInsets(android.graphics.Rect);
-  }
-
-}
-
-package android.support.v4.view.accessibility {
-
-  public class AccessibilityEventCompat {
-    method public static void appendRecord(android.view.accessibility.AccessibilityEvent, android.support.v4.view.accessibility.AccessibilityRecordCompat);
-    method public static android.support.v4.view.accessibility.AccessibilityRecordCompat asRecord(android.view.accessibility.AccessibilityEvent);
-    method public static android.support.v4.view.accessibility.AccessibilityRecordCompat getRecord(android.view.accessibility.AccessibilityEvent, int);
-    method public static int getRecordCount(android.view.accessibility.AccessibilityEvent);
-    field public static final int TYPES_ALL_MASK = -1; // 0xffffffff
-    field public static final int TYPE_ANNOUNCEMENT = 16384; // 0x4000
-    field public static final int TYPE_GESTURE_DETECTION_END = 524288; // 0x80000
-    field public static final int TYPE_GESTURE_DETECTION_START = 262144; // 0x40000
-    field public static final int TYPE_TOUCH_EXPLORATION_GESTURE_END = 1024; // 0x400
-    field public static final int TYPE_TOUCH_EXPLORATION_GESTURE_START = 512; // 0x200
-    field public static final int TYPE_TOUCH_INTERACTION_END = 2097152; // 0x200000
-    field public static final int TYPE_TOUCH_INTERACTION_START = 1048576; // 0x100000
-    field public static final int TYPE_VIEW_ACCESSIBILITY_FOCUSED = 32768; // 0x8000
-    field public static final int TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED = 65536; // 0x10000
-    field public static final int TYPE_VIEW_HOVER_ENTER = 128; // 0x80
-    field public static final int TYPE_VIEW_HOVER_EXIT = 256; // 0x100
-    field public static final int TYPE_VIEW_SCROLLED = 4096; // 0x1000
-    field public static final int TYPE_VIEW_TEXT_SELECTION_CHANGED = 8192; // 0x2000
-    field public static final int TYPE_VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITY = 131072; // 0x20000
-    field public static final int TYPE_WINDOW_CONTENT_CHANGED = 2048; // 0x800
-  }
-
-  public class AccessibilityManagerCompat {
-    ctor public AccessibilityManagerCompat();
-    method public static boolean addAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager, android.support.v4.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat);
-    method public static java.util.List<android.accessibilityservice.AccessibilityServiceInfo> getEnabledAccessibilityServiceList(android.view.accessibility.AccessibilityManager, int);
-    method public static java.util.List<android.accessibilityservice.AccessibilityServiceInfo> getInstalledAccessibilityServiceList(android.view.accessibility.AccessibilityManager);
-    method public static boolean isTouchExplorationEnabled(android.view.accessibility.AccessibilityManager);
-    method public static boolean removeAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager, android.support.v4.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat);
-  }
-
-  public static abstract class AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat {
-    ctor public AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat();
-    method public abstract void onAccessibilityStateChanged(boolean);
-  }
-
-  public class AccessibilityNodeInfoCompat {
-    ctor public AccessibilityNodeInfoCompat(java.lang.Object);
-    method public void addAction(int);
-    method public void addAction(android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat);
-    method public void addChild(android.view.View);
-    method public void addChild(android.view.View, int);
-    method public java.util.List<android.support.v4.view.accessibility.AccessibilityNodeInfoCompat> findAccessibilityNodeInfosByText(java.lang.String);
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat findFocus(int);
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat focusSearch(int);
-    method public java.util.List<android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat> getActionList();
-    method public int getActions();
-    method public void getBoundsInParent(android.graphics.Rect);
-    method public void getBoundsInScreen(android.graphics.Rect);
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getChild(int);
-    method public int getChildCount();
-    method public java.lang.CharSequence getClassName();
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat getCollectionInfo();
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat getCollectionItemInfo();
-    method public java.lang.CharSequence getContentDescription();
-    method public java.lang.Object getInfo();
-    method public int getLiveRegion();
-    method public int getMovementGranularities();
-    method public java.lang.CharSequence getPackageName();
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getParent();
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat getRangeInfo();
-    method public java.lang.CharSequence getText();
-    method public java.lang.String getViewIdResourceName();
-    method public int getWindowId();
-    method public boolean isAccessibilityFocused();
-    method public boolean isCheckable();
-    method public boolean isChecked();
-    method public boolean isClickable();
-    method public boolean isEnabled();
-    method public boolean isFocusable();
-    method public boolean isFocused();
-    method public boolean isLongClickable();
-    method public boolean isPassword();
-    method public boolean isScrollable();
-    method public boolean isSelected();
-    method public boolean isVisibleToUser();
-    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat obtain(android.view.View);
-    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat obtain(android.view.View, int);
-    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat obtain();
-    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat obtain(android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
-    method public boolean performAction(int);
-    method public boolean performAction(int, android.os.Bundle);
-    method public void recycle();
-    method public void setAccessibilityFocused(boolean);
-    method public void setBoundsInParent(android.graphics.Rect);
-    method public void setBoundsInScreen(android.graphics.Rect);
-    method public void setCheckable(boolean);
-    method public void setChecked(boolean);
-    method public void setClassName(java.lang.CharSequence);
-    method public void setClickable(boolean);
-    method public void setCollectionInfo(java.lang.Object);
-    method public void setCollectionItemInfo(java.lang.Object);
-    method public void setContentDescription(java.lang.CharSequence);
-    method public void setEnabled(boolean);
-    method public void setFocusable(boolean);
-    method public void setFocused(boolean);
-    method public void setLiveRegion(int);
-    method public void setLongClickable(boolean);
-    method public void setMovementGranularities(int);
-    method public void setPackageName(java.lang.CharSequence);
-    method public void setParent(android.view.View);
-    method public void setParent(android.view.View, int);
-    method public void setPassword(boolean);
-    method public void setScrollable(boolean);
-    method public void setSelected(boolean);
-    method public void setSource(android.view.View);
-    method public void setSource(android.view.View, int);
-    method public void setText(java.lang.CharSequence);
-    method public void setViewIdResourceName(java.lang.String);
-    method public void setVisibleToUser(boolean);
-    field public static final int ACTION_ACCESSIBILITY_FOCUS = 64; // 0x40
-    field public static final java.lang.String ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN = "ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN";
-    field public static final java.lang.String ACTION_ARGUMENT_HTML_ELEMENT_STRING = "ACTION_ARGUMENT_HTML_ELEMENT_STRING";
-    field public static final java.lang.String ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT = "ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT";
-    field public static final java.lang.String ACTION_ARGUMENT_SELECTION_END_INT = "ACTION_ARGUMENT_SELECTION_END_INT";
-    field public static final java.lang.String ACTION_ARGUMENT_SELECTION_START_INT = "ACTION_ARGUMENT_SELECTION_START_INT";
-    field public static final java.lang.String ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE = "ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE";
-    field public static final int ACTION_CLEAR_ACCESSIBILITY_FOCUS = 128; // 0x80
-    field public static final int ACTION_CLEAR_FOCUS = 2; // 0x2
-    field public static final int ACTION_CLEAR_SELECTION = 8; // 0x8
-    field public static final int ACTION_CLICK = 16; // 0x10
-    field public static final int ACTION_COPY = 16384; // 0x4000
-    field public static final int ACTION_CUT = 65536; // 0x10000
-    field public static final int ACTION_FOCUS = 1; // 0x1
-    field public static final int ACTION_LONG_CLICK = 32; // 0x20
-    field public static final int ACTION_NEXT_AT_MOVEMENT_GRANULARITY = 256; // 0x100
-    field public static final int ACTION_NEXT_HTML_ELEMENT = 1024; // 0x400
-    field public static final int ACTION_PASTE = 32768; // 0x8000
-    field public static final int ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY = 512; // 0x200
-    field public static final int ACTION_PREVIOUS_HTML_ELEMENT = 2048; // 0x800
-    field public static final int ACTION_SCROLL_BACKWARD = 8192; // 0x2000
-    field public static final int ACTION_SCROLL_FORWARD = 4096; // 0x1000
-    field public static final int ACTION_SELECT = 4; // 0x4
-    field public static final int ACTION_SET_SELECTION = 131072; // 0x20000
-    field public static final int ACTION_SET_TEXT = 2097152; // 0x200000
-    field public static final int FOCUS_ACCESSIBILITY = 2; // 0x2
-    field public static final int FOCUS_INPUT = 1; // 0x1
-    field public static final int MOVEMENT_GRANULARITY_CHARACTER = 1; // 0x1
-    field public static final int MOVEMENT_GRANULARITY_LINE = 4; // 0x4
-    field public static final int MOVEMENT_GRANULARITY_PAGE = 16; // 0x10
-    field public static final int MOVEMENT_GRANULARITY_PARAGRAPH = 8; // 0x8
-    field public static final int MOVEMENT_GRANULARITY_WORD = 2; // 0x2
-  }
-
-  public static class AccessibilityNodeInfoCompat.AccessibilityActionCompat {
-    ctor public AccessibilityNodeInfoCompat.AccessibilityActionCompat(int, java.lang.CharSequence);
-    method public int getId();
-    method public java.lang.CharSequence getLabel();
-  }
-
-  public static class AccessibilityNodeInfoCompat.CollectionInfoCompat {
-    method public int getColumnCount();
-    method public int getRowCount();
-    method public boolean isHierarchical();
-    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat obtain(int, int, boolean, int);
-    field public static final int SELECTION_MODE_MULTIPLE = 2; // 0x2
-    field public static final int SELECTION_MODE_NONE = 0; // 0x0
-    field public static final int SELECTION_MODE_SINGLE = 1; // 0x1
-  }
-
-  public static class AccessibilityNodeInfoCompat.CollectionItemInfoCompat {
-    method public int getColumnIndex();
-    method public int getColumnSpan();
-    method public int getRowIndex();
-    method public int getRowSpan();
-    method public boolean isHeading();
-    method public boolean isSelected();
-    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat obtain(int, int, int, int, boolean, boolean);
-  }
-
-  public static class AccessibilityNodeInfoCompat.RangeInfoCompat {
-    method public float getCurrent();
-    method public float getMax();
-    method public float getMin();
-    method public int getType();
-    field public static final int RANGE_TYPE_FLOAT = 1; // 0x1
-    field public static final int RANGE_TYPE_INT = 0; // 0x0
-    field public static final int RANGE_TYPE_PERCENT = 2; // 0x2
-  }
-
-  public class AccessibilityNodeProviderCompat {
-    ctor public AccessibilityNodeProviderCompat();
-    ctor public AccessibilityNodeProviderCompat(java.lang.Object);
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat createAccessibilityNodeInfo(int);
-    method public java.util.List<android.support.v4.view.accessibility.AccessibilityNodeInfoCompat> findAccessibilityNodeInfosByText(java.lang.String, int);
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat findFocus(int);
-    method public java.lang.Object getProvider();
-    method public boolean performAction(int, int, android.os.Bundle);
-  }
-
-  public class AccessibilityRecordCompat {
-    ctor public deprecated AccessibilityRecordCompat(java.lang.Object);
-    method public int getAddedCount();
-    method public java.lang.CharSequence getBeforeText();
-    method public java.lang.CharSequence getClassName();
-    method public java.lang.CharSequence getContentDescription();
-    method public int getCurrentItemIndex();
-    method public int getFromIndex();
-    method public deprecated java.lang.Object getImpl();
-    method public int getItemCount();
-    method public int getMaxScrollX();
-    method public int getMaxScrollY();
-    method public android.os.Parcelable getParcelableData();
-    method public int getRemovedCount();
-    method public int getScrollX();
-    method public int getScrollY();
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getSource();
-    method public java.util.List<java.lang.CharSequence> getText();
-    method public int getToIndex();
-    method public int getWindowId();
-    method public boolean isChecked();
-    method public boolean isEnabled();
-    method public boolean isFullScreen();
-    method public boolean isPassword();
-    method public boolean isScrollable();
-    method public static android.support.v4.view.accessibility.AccessibilityRecordCompat obtain(android.support.v4.view.accessibility.AccessibilityRecordCompat);
-    method public static android.support.v4.view.accessibility.AccessibilityRecordCompat obtain();
-    method public void recycle();
-    method public void setAddedCount(int);
-    method public void setBeforeText(java.lang.CharSequence);
-    method public void setChecked(boolean);
-    method public void setClassName(java.lang.CharSequence);
-    method public void setContentDescription(java.lang.CharSequence);
-    method public void setCurrentItemIndex(int);
-    method public void setEnabled(boolean);
-    method public void setFromIndex(int);
-    method public void setFullScreen(boolean);
-    method public void setItemCount(int);
-    method public void setMaxScrollX(int);
-    method public void setMaxScrollY(int);
-    method public void setParcelableData(android.os.Parcelable);
-    method public void setPassword(boolean);
-    method public void setRemovedCount(int);
-    method public void setScrollX(int);
-    method public void setScrollY(int);
-    method public void setScrollable(boolean);
-    method public void setSource(android.view.View);
-    method public void setSource(android.view.View, int);
-    method public void setToIndex(int);
-  }
-
-}
-
-package android.support.v4.widget {
-
-  public abstract class AutoScrollHelper implements android.view.View.OnTouchListener {
-    ctor public AutoScrollHelper(android.view.View);
-    method public abstract boolean canTargetScrollHorizontally(int);
-    method public abstract boolean canTargetScrollVertically(int);
-    method public boolean isEnabled();
-    method public boolean isExclusive();
-    method public boolean onTouch(android.view.View, android.view.MotionEvent);
-    method public abstract void scrollTargetBy(int, int);
-    method public android.support.v4.widget.AutoScrollHelper setActivationDelay(int);
-    method public android.support.v4.widget.AutoScrollHelper setEdgeType(int);
-    method public android.support.v4.widget.AutoScrollHelper setEnabled(boolean);
-    method public android.support.v4.widget.AutoScrollHelper setExclusive(boolean);
-    method public android.support.v4.widget.AutoScrollHelper setMaximumEdges(float, float);
-    method public android.support.v4.widget.AutoScrollHelper setMaximumVelocity(float, float);
-    method public android.support.v4.widget.AutoScrollHelper setMinimumVelocity(float, float);
-    method public android.support.v4.widget.AutoScrollHelper setRampDownDuration(int);
-    method public android.support.v4.widget.AutoScrollHelper setRampUpDuration(int);
-    method public android.support.v4.widget.AutoScrollHelper setRelativeEdges(float, float);
-    method public android.support.v4.widget.AutoScrollHelper setRelativeVelocity(float, float);
-    field public static final int EDGE_TYPE_INSIDE = 0; // 0x0
-    field public static final int EDGE_TYPE_INSIDE_EXTEND = 1; // 0x1
-    field public static final int EDGE_TYPE_OUTSIDE = 2; // 0x2
-    field public static final float NO_MAX = 3.4028235E38f;
-    field public static final float NO_MIN = 0.0f;
-    field public static final float RELATIVE_UNSPECIFIED = 0.0f;
-  }
-
-  public class ContentLoadingProgressBar extends android.widget.ProgressBar {
-    ctor public ContentLoadingProgressBar(android.content.Context);
-    ctor public ContentLoadingProgressBar(android.content.Context, android.util.AttributeSet);
-    method public void hide();
-    method public void onAttachedToWindow();
-    method public void onDetachedFromWindow();
-    method public void show();
-  }
-
-  public abstract class CursorAdapter extends android.widget.BaseAdapter {
-    ctor public deprecated CursorAdapter(android.content.Context, android.database.Cursor);
-    ctor public CursorAdapter(android.content.Context, android.database.Cursor, boolean);
-    ctor public CursorAdapter(android.content.Context, android.database.Cursor, int);
-    method public abstract void bindView(android.view.View, android.content.Context, android.database.Cursor);
-    method public void changeCursor(android.database.Cursor);
-    method public java.lang.CharSequence convertToString(android.database.Cursor);
-    method public int getCount();
-    method public android.database.Cursor getCursor();
-    method public android.widget.Filter getFilter();
-    method public android.widget.FilterQueryProvider getFilterQueryProvider();
-    method public java.lang.Object getItem(int);
-    method public long getItemId(int);
-    method public android.view.View getView(int, android.view.View, android.view.ViewGroup);
-    method protected deprecated void init(android.content.Context, android.database.Cursor, boolean);
-    method public android.view.View newDropDownView(android.content.Context, android.database.Cursor, android.view.ViewGroup);
-    method public abstract android.view.View newView(android.content.Context, android.database.Cursor, android.view.ViewGroup);
-    method protected void onContentChanged();
-    method public android.database.Cursor runQueryOnBackgroundThread(java.lang.CharSequence);
-    method public void setFilterQueryProvider(android.widget.FilterQueryProvider);
-    method public android.database.Cursor swapCursor(android.database.Cursor);
-    field public static final deprecated int FLAG_AUTO_REQUERY = 1; // 0x1
-    field public static final int FLAG_REGISTER_CONTENT_OBSERVER = 2; // 0x2
-  }
-
-  public class DrawerLayout extends android.view.ViewGroup {
-    ctor public DrawerLayout(android.content.Context);
-    ctor public DrawerLayout(android.content.Context, android.util.AttributeSet);
-    ctor public DrawerLayout(android.content.Context, android.util.AttributeSet, int);
-    method public void closeDrawer(android.view.View);
-    method public void closeDrawer(int);
-    method public void closeDrawers();
-    method public int getDrawerLockMode(int);
-    method public int getDrawerLockMode(android.view.View);
-    method public java.lang.CharSequence getDrawerTitle(int);
-    method public android.graphics.drawable.Drawable getStatusBarBackgroundDrawable();
-    method public boolean isDrawerOpen(android.view.View);
-    method public boolean isDrawerOpen(int);
-    method public boolean isDrawerVisible(android.view.View);
-    method public boolean isDrawerVisible(int);
-    method public void onDraw(android.graphics.Canvas);
-    method protected void onLayout(boolean, int, int, int, int);
-    method public void openDrawer(android.view.View);
-    method public void openDrawer(int);
-    method public void setDrawerListener(android.support.v4.widget.DrawerLayout.DrawerListener);
-    method public void setDrawerLockMode(int);
-    method public void setDrawerLockMode(int, int);
-    method public void setDrawerLockMode(int, android.view.View);
-    method public void setDrawerShadow(android.graphics.drawable.Drawable, int);
-    method public void setDrawerShadow(int, int);
-    method public void setDrawerTitle(int, java.lang.CharSequence);
-    method public void setScrimColor(int);
-    method public void setStatusBarBackground(android.graphics.drawable.Drawable);
-    method public void setStatusBarBackground(int);
-    method public void setStatusBarBackgroundColor(int);
-    field public static final int LOCK_MODE_LOCKED_CLOSED = 1; // 0x1
-    field public static final int LOCK_MODE_LOCKED_OPEN = 2; // 0x2
-    field public static final int LOCK_MODE_UNLOCKED = 0; // 0x0
-    field public static final int STATE_DRAGGING = 1; // 0x1
-    field public static final int STATE_IDLE = 0; // 0x0
-    field public static final int STATE_SETTLING = 2; // 0x2
-  }
-
-  public static abstract interface DrawerLayout.DrawerListener {
-    method public abstract void onDrawerClosed(android.view.View);
-    method public abstract void onDrawerOpened(android.view.View);
-    method public abstract void onDrawerSlide(android.view.View, float);
-    method public abstract void onDrawerStateChanged(int);
-  }
-
-  public static class DrawerLayout.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
-    ctor public DrawerLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public DrawerLayout.LayoutParams(int, int);
-    ctor public DrawerLayout.LayoutParams(int, int, int);
-    ctor public DrawerLayout.LayoutParams(android.support.v4.widget.DrawerLayout.LayoutParams);
-    ctor public DrawerLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public DrawerLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    field public int gravity;
-  }
-
-  protected static class DrawerLayout.SavedState extends android.view.View.BaseSavedState {
-    ctor public DrawerLayout.SavedState(android.os.Parcel);
-    ctor public DrawerLayout.SavedState(android.os.Parcelable);
-    field public static final android.os.Parcelable.Creator<android.support.v4.widget.DrawerLayout.SavedState> CREATOR;
-  }
-
-  public static abstract class DrawerLayout.SimpleDrawerListener implements android.support.v4.widget.DrawerLayout.DrawerListener {
-    ctor public DrawerLayout.SimpleDrawerListener();
-    method public void onDrawerClosed(android.view.View);
-    method public void onDrawerOpened(android.view.View);
-    method public void onDrawerSlide(android.view.View, float);
-    method public void onDrawerStateChanged(int);
-  }
-
-  public class EdgeEffectCompat {
-    ctor public EdgeEffectCompat(android.content.Context);
-    method public boolean draw(android.graphics.Canvas);
-    method public void finish();
-    method public boolean isFinished();
-    method public boolean onAbsorb(int);
-    method public boolean onPull(float);
-    method public boolean onRelease();
-    method public void setSize(int, int);
-  }
-
-  public abstract class ExploreByTouchHelper extends android.support.v4.view.AccessibilityDelegateCompat {
-    ctor public ExploreByTouchHelper(android.view.View);
-    method public boolean dispatchHoverEvent(android.view.MotionEvent);
-    method public int getFocusedVirtualView();
-    method protected abstract int getVirtualViewAt(float, float);
-    method protected abstract void getVisibleVirtualViews(java.util.List<java.lang.Integer>);
-    method public void invalidateRoot();
-    method public void invalidateVirtualView(int);
-    method protected abstract boolean onPerformActionForVirtualView(int, int, android.os.Bundle);
-    method protected abstract void onPopulateEventForVirtualView(int, android.view.accessibility.AccessibilityEvent);
-    method protected abstract void onPopulateNodeForVirtualView(int, android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
-    method public boolean sendEventForVirtualView(int, int);
-    field public static final int INVALID_ID = -2147483648; // 0x80000000
-  }
-
-  public class ListPopupWindowCompat {
-    method public static android.view.View.OnTouchListener createDragToOpenListener(java.lang.Object, android.view.View);
-  }
-
-  public class ListViewAutoScrollHelper extends android.support.v4.widget.AutoScrollHelper {
-    ctor public ListViewAutoScrollHelper(android.widget.ListView);
-    method public boolean canTargetScrollHorizontally(int);
-    method public boolean canTargetScrollVertically(int);
-    method public void scrollTargetBy(int, int);
-  }
-
-  public class PopupMenuCompat {
-    method public static android.view.View.OnTouchListener getDragToOpenListener(java.lang.Object);
-  }
-
-  public class PopupWindowCompat {
-    method public static void showAsDropDown(android.widget.PopupWindow, android.view.View, int, int, int);
-  }
-
-  public abstract class ResourceCursorAdapter extends android.support.v4.widget.CursorAdapter {
-    ctor public deprecated ResourceCursorAdapter(android.content.Context, int, android.database.Cursor);
-    ctor public ResourceCursorAdapter(android.content.Context, int, android.database.Cursor, boolean);
-    ctor public ResourceCursorAdapter(android.content.Context, int, android.database.Cursor, int);
-    method public android.view.View newView(android.content.Context, android.database.Cursor, android.view.ViewGroup);
-    method public void setDropDownViewResource(int);
-    method public void setViewResource(int);
-  }
-
-  public class ScrollerCompat {
-    method public void abortAnimation();
-    method public boolean computeScrollOffset();
-    method public static android.support.v4.widget.ScrollerCompat create(android.content.Context);
-    method public static android.support.v4.widget.ScrollerCompat create(android.content.Context, android.view.animation.Interpolator);
-    method public void fling(int, int, int, int, int, int, int, int);
-    method public void fling(int, int, int, int, int, int, int, int, int, int);
-    method public float getCurrVelocity();
-    method public int getCurrX();
-    method public int getCurrY();
-    method public int getFinalX();
-    method public int getFinalY();
-    method public boolean isFinished();
-    method public boolean isOverScrolled();
-    method public void notifyHorizontalEdgeReached(int, int, int);
-    method public void notifyVerticalEdgeReached(int, int, int);
-    method public void startScroll(int, int, int, int);
-    method public void startScroll(int, int, int, int, int);
-  }
-
-  public class SearchViewCompat {
-    method public static java.lang.CharSequence getQuery(android.view.View);
-    method public static boolean isIconified(android.view.View);
-    method public static boolean isQueryRefinementEnabled(android.view.View);
-    method public static boolean isSubmitButtonEnabled(android.view.View);
-    method public static android.view.View newSearchView(android.content.Context);
-    method public static void setIconified(android.view.View, boolean);
-    method public static void setImeOptions(android.view.View, int);
-    method public static void setInputType(android.view.View, int);
-    method public static void setMaxWidth(android.view.View, int);
-    method public static void setOnCloseListener(android.view.View, android.support.v4.widget.SearchViewCompat.OnCloseListenerCompat);
-    method public static void setOnQueryTextListener(android.view.View, android.support.v4.widget.SearchViewCompat.OnQueryTextListenerCompat);
-    method public static void setQuery(android.view.View, java.lang.CharSequence, boolean);
-    method public static void setQueryHint(android.view.View, java.lang.CharSequence);
-    method public static void setQueryRefinementEnabled(android.view.View, boolean);
-    method public static void setSearchableInfo(android.view.View, android.content.ComponentName);
-    method public static void setSubmitButtonEnabled(android.view.View, boolean);
-  }
-
-  public static abstract class SearchViewCompat.OnCloseListenerCompat {
-    ctor public SearchViewCompat.OnCloseListenerCompat();
-    method public boolean onClose();
-  }
-
-  public static abstract class SearchViewCompat.OnQueryTextListenerCompat {
-    ctor public SearchViewCompat.OnQueryTextListenerCompat();
-    method public boolean onQueryTextChange(java.lang.String);
-    method public boolean onQueryTextSubmit(java.lang.String);
-  }
-
-  public class SimpleCursorAdapter extends android.support.v4.widget.ResourceCursorAdapter {
-    ctor public deprecated SimpleCursorAdapter(android.content.Context, int, android.database.Cursor, java.lang.String[], int[]);
-    ctor public SimpleCursorAdapter(android.content.Context, int, android.database.Cursor, java.lang.String[], int[], int);
-    method public void bindView(android.view.View, android.content.Context, android.database.Cursor);
-    method public void changeCursorAndColumns(android.database.Cursor, java.lang.String[], int[]);
-    method public android.support.v4.widget.SimpleCursorAdapter.CursorToStringConverter getCursorToStringConverter();
-    method public int getStringConversionColumn();
-    method public android.support.v4.widget.SimpleCursorAdapter.ViewBinder getViewBinder();
-    method public void setCursorToStringConverter(android.support.v4.widget.SimpleCursorAdapter.CursorToStringConverter);
-    method public void setStringConversionColumn(int);
-    method public void setViewBinder(android.support.v4.widget.SimpleCursorAdapter.ViewBinder);
-    method public void setViewImage(android.widget.ImageView, java.lang.String);
-    method public void setViewText(android.widget.TextView, java.lang.String);
-  }
-
-  public static abstract interface SimpleCursorAdapter.CursorToStringConverter {
-    method public abstract java.lang.CharSequence convertToString(android.database.Cursor);
-  }
-
-  public static abstract interface SimpleCursorAdapter.ViewBinder {
-    method public abstract boolean setViewValue(android.view.View, android.database.Cursor, int);
-  }
-
-  public class SlidingPaneLayout extends android.view.ViewGroup {
-    ctor public SlidingPaneLayout(android.content.Context);
-    ctor public SlidingPaneLayout(android.content.Context, android.util.AttributeSet);
-    ctor public SlidingPaneLayout(android.content.Context, android.util.AttributeSet, int);
-    method protected boolean canScroll(android.view.View, boolean, int, int, int);
-    method public deprecated boolean canSlide();
-    method public boolean closePane();
-    method public int getCoveredFadeColor();
-    method public int getParallaxDistance();
-    method public int getSliderFadeColor();
-    method public boolean isOpen();
-    method public boolean isSlideable();
-    method protected void onLayout(boolean, int, int, int, int);
-    method public boolean openPane();
-    method public void setCoveredFadeColor(int);
-    method public void setPanelSlideListener(android.support.v4.widget.SlidingPaneLayout.PanelSlideListener);
-    method public void setParallaxDistance(int);
-    method public deprecated void setShadowDrawable(android.graphics.drawable.Drawable);
-    method public void setShadowDrawableLeft(android.graphics.drawable.Drawable);
-    method public void setShadowDrawableRight(android.graphics.drawable.Drawable);
-    method public deprecated void setShadowResource(int);
-    method public void setShadowResourceLeft(int);
-    method public void setShadowResourceRight(int);
-    method public void setSliderFadeColor(int);
-    method public deprecated void smoothSlideClosed();
-    method public deprecated void smoothSlideOpen();
-  }
-
-  public static class SlidingPaneLayout.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
-    ctor public SlidingPaneLayout.LayoutParams();
-    ctor public SlidingPaneLayout.LayoutParams(int, int);
-    ctor public SlidingPaneLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public SlidingPaneLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public SlidingPaneLayout.LayoutParams(android.support.v4.widget.SlidingPaneLayout.LayoutParams);
-    ctor public SlidingPaneLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
-    field public float weight;
-  }
-
-  public static abstract interface SlidingPaneLayout.PanelSlideListener {
-    method public abstract void onPanelClosed(android.view.View);
-    method public abstract void onPanelOpened(android.view.View);
-    method public abstract void onPanelSlide(android.view.View, float);
-  }
-
-  public static class SlidingPaneLayout.SimplePanelSlideListener implements android.support.v4.widget.SlidingPaneLayout.PanelSlideListener {
-    ctor public SlidingPaneLayout.SimplePanelSlideListener();
-    method public void onPanelClosed(android.view.View);
-    method public void onPanelOpened(android.view.View);
-    method public void onPanelSlide(android.view.View, float);
-  }
-
-  public class SwipeRefreshLayout extends android.view.ViewGroup {
-    ctor public SwipeRefreshLayout(android.content.Context);
-    ctor public SwipeRefreshLayout(android.content.Context, android.util.AttributeSet);
-    method public boolean canChildScrollUp();
-    method public int getProgressCircleDiameter();
-    method public boolean isRefreshing();
-    method protected void onLayout(boolean, int, int, int, int);
-    method public void onMeasure(int, int);
-    method public deprecated void setColorScheme(int...);
-    method public void setColorSchemeColors(int...);
-    method public void setColorSchemeResources(int...);
-    method public void setDistanceToTriggerSync(int);
-    method public void setOnRefreshListener(android.support.v4.widget.SwipeRefreshLayout.OnRefreshListener);
-    method public deprecated void setProgressBackgroundColor(int);
-    method public void setProgressBackgroundColorSchemeColor(int);
-    method public void setProgressBackgroundColorSchemeResource(int);
-    method public void setProgressViewEndTarget(boolean, int);
-    method public void setProgressViewOffset(boolean, int, int);
-    method public void setRefreshing(boolean);
-    method public void setSize(int);
-    field public static final int DEFAULT = 1; // 0x1
-    field public static final int LARGE = 0; // 0x0
-    field protected int mFrom;
-    field protected int mOriginalOffsetTop;
-  }
-
-  public static abstract interface SwipeRefreshLayout.OnRefreshListener {
-    method public abstract void onRefresh();
-  }
-
-  public class ViewDragHelper {
-    method public void abort();
-    method protected boolean canScroll(android.view.View, boolean, int, int, int, int);
-    method public void cancel();
-    method public void captureChildView(android.view.View, int);
-    method public boolean checkTouchSlop(int);
-    method public boolean checkTouchSlop(int, int);
-    method public boolean continueSettling(boolean);
-    method public static android.support.v4.widget.ViewDragHelper create(android.view.ViewGroup, android.support.v4.widget.ViewDragHelper.Callback);
-    method public static android.support.v4.widget.ViewDragHelper create(android.view.ViewGroup, float, android.support.v4.widget.ViewDragHelper.Callback);
-    method public android.view.View findTopChildUnder(int, int);
-    method public void flingCapturedView(int, int, int, int);
-    method public int getActivePointerId();
-    method public android.view.View getCapturedView();
-    method public int getEdgeSize();
-    method public float getMinVelocity();
-    method public int getTouchSlop();
-    method public int getViewDragState();
-    method public boolean isCapturedViewUnder(int, int);
-    method public boolean isEdgeTouched(int);
-    method public boolean isEdgeTouched(int, int);
-    method public boolean isPointerDown(int);
-    method public boolean isViewUnder(android.view.View, int, int);
-    method public void processTouchEvent(android.view.MotionEvent);
-    method public void setEdgeTrackingEnabled(int);
-    method public void setMinVelocity(float);
-    method public boolean settleCapturedViewAt(int, int);
-    method public boolean shouldInterceptTouchEvent(android.view.MotionEvent);
-    method public boolean smoothSlideViewTo(android.view.View, int, int);
-    field public static final int DIRECTION_ALL = 3; // 0x3
-    field public static final int DIRECTION_HORIZONTAL = 1; // 0x1
-    field public static final int DIRECTION_VERTICAL = 2; // 0x2
-    field public static final int EDGE_ALL = 15; // 0xf
-    field public static final int EDGE_BOTTOM = 8; // 0x8
-    field public static final int EDGE_LEFT = 1; // 0x1
-    field public static final int EDGE_RIGHT = 2; // 0x2
-    field public static final int EDGE_TOP = 4; // 0x4
-    field public static final int INVALID_POINTER = -1; // 0xffffffff
-    field public static final int STATE_DRAGGING = 1; // 0x1
-    field public static final int STATE_IDLE = 0; // 0x0
-    field public static final int STATE_SETTLING = 2; // 0x2
-  }
-
-  public static abstract class ViewDragHelper.Callback {
-    ctor public ViewDragHelper.Callback();
-    method public int clampViewPositionHorizontal(android.view.View, int, int);
-    method public int clampViewPositionVertical(android.view.View, int, int);
-    method public int getOrderedChildIndex(int);
-    method public int getViewHorizontalDragRange(android.view.View);
-    method public int getViewVerticalDragRange(android.view.View);
-    method public void onEdgeDragStarted(int, int);
-    method public boolean onEdgeLock(int);
-    method public void onEdgeTouched(int, int);
-    method public void onViewCaptured(android.view.View, int);
-    method public void onViewDragStateChanged(int);
-    method public void onViewPositionChanged(android.view.View, int, int, int, int);
-    method public void onViewReleased(android.view.View, float, float);
-    method public abstract boolean tryCaptureView(android.view.View, int);
-  }
-
-}
-
diff --git a/v4/api/22.1.0.txt b/v4/api/22.1.0.txt
deleted file mode 100644
index 33b6625..0000000
--- a/v4/api/22.1.0.txt
+++ /dev/null
@@ -1,3115 +0,0 @@
-package android.support.v4.accessibilityservice {
-
-  public class AccessibilityServiceInfoCompat {
-    method public static java.lang.String capabilityToString(int);
-    method public static java.lang.String feedbackTypeToString(int);
-    method public static java.lang.String flagToString(int);
-    method public static boolean getCanRetrieveWindowContent(android.accessibilityservice.AccessibilityServiceInfo);
-    method public static int getCapabilities(android.accessibilityservice.AccessibilityServiceInfo);
-    method public static java.lang.String getDescription(android.accessibilityservice.AccessibilityServiceInfo);
-    method public static java.lang.String getId(android.accessibilityservice.AccessibilityServiceInfo);
-    method public static android.content.pm.ResolveInfo getResolveInfo(android.accessibilityservice.AccessibilityServiceInfo);
-    method public static java.lang.String getSettingsActivityName(android.accessibilityservice.AccessibilityServiceInfo);
-    field public static final int CAPABILITY_CAN_FILTER_KEY_EVENTS = 8; // 0x8
-    field public static final int CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 4; // 0x4
-    field public static final int CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION = 2; // 0x2
-    field public static final int CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT = 1; // 0x1
-    field public static final int DEFAULT = 1; // 0x1
-    field public static final int FEEDBACK_ALL_MASK = -1; // 0xffffffff
-    field public static final int FEEDBACK_BRAILLE = 32; // 0x20
-    field public static final int FLAG_INCLUDE_NOT_IMPORTANT_VIEWS = 2; // 0x2
-    field public static final int FLAG_REPORT_VIEW_IDS = 16; // 0x10
-    field public static final int FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 8; // 0x8
-    field public static final int FLAG_REQUEST_FILTER_KEY_EVENTS = 32; // 0x20
-    field public static final int FLAG_REQUEST_TOUCH_EXPLORATION_MODE = 4; // 0x4
-  }
-
-}
-
-package android.support.v4.app {
-
-  public deprecated class ActionBarDrawerToggle implements android.support.v4.widget.DrawerLayout.DrawerListener {
-    ctor public ActionBarDrawerToggle(android.app.Activity, android.support.v4.widget.DrawerLayout, int, int, int);
-    ctor public ActionBarDrawerToggle(android.app.Activity, android.support.v4.widget.DrawerLayout, boolean, int, int, int);
-    method public boolean isDrawerIndicatorEnabled();
-    method public void onConfigurationChanged(android.content.res.Configuration);
-    method public void onDrawerClosed(android.view.View);
-    method public void onDrawerOpened(android.view.View);
-    method public void onDrawerSlide(android.view.View, float);
-    method public void onDrawerStateChanged(int);
-    method public boolean onOptionsItemSelected(android.view.MenuItem);
-    method public void setDrawerIndicatorEnabled(boolean);
-    method public void setHomeAsUpIndicator(android.graphics.drawable.Drawable);
-    method public void setHomeAsUpIndicator(int);
-    method public void syncState();
-  }
-
-  public static abstract interface ActionBarDrawerToggle.Delegate {
-    method public abstract android.graphics.drawable.Drawable getThemeUpIndicator();
-    method public abstract void setActionBarDescription(int);
-    method public abstract void setActionBarUpIndicator(android.graphics.drawable.Drawable, int);
-  }
-
-  public static abstract interface ActionBarDrawerToggle.DelegateProvider {
-    method public abstract android.support.v4.app.ActionBarDrawerToggle.Delegate getDrawerToggleDelegate();
-  }
-
-  public class ActivityCompat extends android.support.v4.content.ContextCompat {
-    ctor public ActivityCompat();
-    method public static void finishAffinity(android.app.Activity);
-    method public static void finishAfterTransition(android.app.Activity);
-    method public static boolean invalidateOptionsMenu(android.app.Activity);
-    method public static void postponeEnterTransition(android.app.Activity);
-    method public static void setEnterSharedElementCallback(android.app.Activity, android.support.v4.app.SharedElementCallback);
-    method public static void setExitSharedElementCallback(android.app.Activity, android.support.v4.app.SharedElementCallback);
-    method public static void startActivity(android.app.Activity, android.content.Intent, android.os.Bundle);
-    method public static void startActivityForResult(android.app.Activity, android.content.Intent, int, android.os.Bundle);
-    method public static void startPostponedEnterTransition(android.app.Activity);
-  }
-
-  public final class ActivityManagerCompat {
-    method public static boolean isLowRamDevice(android.app.ActivityManager);
-  }
-
-  public class ActivityOptionsCompat {
-    ctor protected ActivityOptionsCompat();
-    method public static android.support.v4.app.ActivityOptionsCompat makeCustomAnimation(android.content.Context, int, int);
-    method public static android.support.v4.app.ActivityOptionsCompat makeScaleUpAnimation(android.view.View, int, int, int, int);
-    method public static android.support.v4.app.ActivityOptionsCompat makeSceneTransitionAnimation(android.app.Activity, android.view.View, java.lang.String);
-    method public static android.support.v4.app.ActivityOptionsCompat makeSceneTransitionAnimation(android.app.Activity, android.support.v4.util.Pair<android.view.View, java.lang.String>...);
-    method public static android.support.v4.app.ActivityOptionsCompat makeThumbnailScaleUpAnimation(android.view.View, android.graphics.Bitmap, int, int);
-    method public android.os.Bundle toBundle();
-    method public void update(android.support.v4.app.ActivityOptionsCompat);
-  }
-
-  public class DialogFragment extends android.support.v4.app.Fragment implements android.content.DialogInterface.OnCancelListener android.content.DialogInterface.OnDismissListener {
-    ctor public DialogFragment();
-    method public void dismiss();
-    method public void dismissAllowingStateLoss();
-    method public android.app.Dialog getDialog();
-    method public boolean getShowsDialog();
-    method public int getTheme();
-    method public boolean isCancelable();
-    method public void onCancel(android.content.DialogInterface);
-    method public android.app.Dialog onCreateDialog(android.os.Bundle);
-    method public void onDismiss(android.content.DialogInterface);
-    method public void setCancelable(boolean);
-    method public void setShowsDialog(boolean);
-    method public void setStyle(int, int);
-    method public void show(android.support.v4.app.FragmentManager, java.lang.String);
-    method public int show(android.support.v4.app.FragmentTransaction, java.lang.String);
-    field public static final int STYLE_NORMAL = 0; // 0x0
-    field public static final int STYLE_NO_FRAME = 2; // 0x2
-    field public static final int STYLE_NO_INPUT = 3; // 0x3
-    field public static final int STYLE_NO_TITLE = 1; // 0x1
-  }
-
-  public class Fragment implements android.content.ComponentCallbacks android.view.View.OnCreateContextMenuListener {
-    ctor public Fragment();
-    method public void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
-    method public final boolean equals(java.lang.Object);
-    method public final android.support.v4.app.FragmentActivity getActivity();
-    method public boolean getAllowEnterTransitionOverlap();
-    method public boolean getAllowReturnTransitionOverlap();
-    method public final android.os.Bundle getArguments();
-    method public final android.support.v4.app.FragmentManager getChildFragmentManager();
-    method public java.lang.Object getEnterTransition();
-    method public java.lang.Object getExitTransition();
-    method public final android.support.v4.app.FragmentManager getFragmentManager();
-    method public final int getId();
-    method public android.support.v4.app.LoaderManager getLoaderManager();
-    method public final android.support.v4.app.Fragment getParentFragment();
-    method public java.lang.Object getReenterTransition();
-    method public final android.content.res.Resources getResources();
-    method public final boolean getRetainInstance();
-    method public java.lang.Object getReturnTransition();
-    method public java.lang.Object getSharedElementEnterTransition();
-    method public java.lang.Object getSharedElementReturnTransition();
-    method public final java.lang.String getString(int);
-    method public final java.lang.String getString(int, java.lang.Object...);
-    method public final java.lang.String getTag();
-    method public final android.support.v4.app.Fragment getTargetFragment();
-    method public final int getTargetRequestCode();
-    method public final java.lang.CharSequence getText(int);
-    method public boolean getUserVisibleHint();
-    method public android.view.View getView();
-    method public final int hashCode();
-    method public static android.support.v4.app.Fragment instantiate(android.content.Context, java.lang.String);
-    method public static android.support.v4.app.Fragment instantiate(android.content.Context, java.lang.String, android.os.Bundle);
-    method public final boolean isAdded();
-    method public final boolean isDetached();
-    method public final boolean isHidden();
-    method public final boolean isInLayout();
-    method public final boolean isRemoving();
-    method public final boolean isResumed();
-    method public final boolean isVisible();
-    method public void onActivityCreated(android.os.Bundle);
-    method public void onActivityResult(int, int, android.content.Intent);
-    method public void onAttach(android.app.Activity);
-    method public void onConfigurationChanged(android.content.res.Configuration);
-    method public boolean onContextItemSelected(android.view.MenuItem);
-    method public void onCreate(android.os.Bundle);
-    method public android.view.animation.Animation onCreateAnimation(int, boolean, int);
-    method public void onCreateContextMenu(android.view.ContextMenu, android.view.View, android.view.ContextMenu.ContextMenuInfo);
-    method public void onCreateOptionsMenu(android.view.Menu, android.view.MenuInflater);
-    method public android.view.View onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
-    method public void onDestroy();
-    method public void onDestroyOptionsMenu();
-    method public void onDestroyView();
-    method public void onDetach();
-    method public void onHiddenChanged(boolean);
-    method public void onInflate(android.app.Activity, android.util.AttributeSet, android.os.Bundle);
-    method public void onLowMemory();
-    method public boolean onOptionsItemSelected(android.view.MenuItem);
-    method public void onOptionsMenuClosed(android.view.Menu);
-    method public void onPause();
-    method public void onPrepareOptionsMenu(android.view.Menu);
-    method public void onResume();
-    method public void onSaveInstanceState(android.os.Bundle);
-    method public void onStart();
-    method public void onStop();
-    method public void onViewCreated(android.view.View, android.os.Bundle);
-    method public void onViewStateRestored(android.os.Bundle);
-    method public void registerForContextMenu(android.view.View);
-    method public void setAllowEnterTransitionOverlap(boolean);
-    method public void setAllowReturnTransitionOverlap(boolean);
-    method public void setArguments(android.os.Bundle);
-    method public void setEnterSharedElementCallback(android.support.v4.app.SharedElementCallback);
-    method public void setEnterTransition(java.lang.Object);
-    method public void setExitSharedElementCallback(android.support.v4.app.SharedElementCallback);
-    method public void setExitTransition(java.lang.Object);
-    method public void setHasOptionsMenu(boolean);
-    method public void setInitialSavedState(android.support.v4.app.Fragment.SavedState);
-    method public void setMenuVisibility(boolean);
-    method public void setReenterTransition(java.lang.Object);
-    method public void setRetainInstance(boolean);
-    method public void setReturnTransition(java.lang.Object);
-    method public void setSharedElementEnterTransition(java.lang.Object);
-    method public void setSharedElementReturnTransition(java.lang.Object);
-    method public void setTargetFragment(android.support.v4.app.Fragment, int);
-    method public void setUserVisibleHint(boolean);
-    method public void startActivity(android.content.Intent);
-    method public void startActivityForResult(android.content.Intent, int);
-    method public void unregisterForContextMenu(android.view.View);
-  }
-
-  public static class Fragment.InstantiationException extends java.lang.RuntimeException {
-    ctor public Fragment.InstantiationException(java.lang.String, java.lang.Exception);
-  }
-
-  public static class Fragment.SavedState implements android.os.Parcelable {
-    method public int describeContents();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.support.v4.app.Fragment.SavedState> CREATOR;
-  }
-
-  public class FragmentActivity extends android.app.Activity {
-    ctor public FragmentActivity();
-    method public java.lang.Object getLastCustomNonConfigurationInstance();
-    method public android.support.v4.app.FragmentManager getSupportFragmentManager();
-    method public android.support.v4.app.LoaderManager getSupportLoaderManager();
-    method public void onAttachFragment(android.support.v4.app.Fragment);
-    method protected void onResumeFragments();
-    method public java.lang.Object onRetainCustomNonConfigurationInstance();
-    method public final java.lang.Object onRetainNonConfigurationInstance();
-    method public void setEnterSharedElementCallback(android.support.v4.app.SharedElementCallback);
-    method public void setExitSharedElementCallback(android.support.v4.app.SharedElementCallback);
-    method public void startActivityFromFragment(android.support.v4.app.Fragment, android.content.Intent, int);
-    method public void supportFinishAfterTransition();
-    method public void supportInvalidateOptionsMenu();
-    method public void supportPostponeEnterTransition();
-    method public void supportStartPostponedEnterTransition();
-  }
-
-  public abstract class FragmentManager {
-    ctor public FragmentManager();
-    method public abstract void addOnBackStackChangedListener(android.support.v4.app.FragmentManager.OnBackStackChangedListener);
-    method public abstract android.support.v4.app.FragmentTransaction beginTransaction();
-    method public abstract void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
-    method public static void enableDebugLogging(boolean);
-    method public abstract boolean executePendingTransactions();
-    method public abstract android.support.v4.app.Fragment findFragmentById(int);
-    method public abstract android.support.v4.app.Fragment findFragmentByTag(java.lang.String);
-    method public abstract android.support.v4.app.FragmentManager.BackStackEntry getBackStackEntryAt(int);
-    method public abstract int getBackStackEntryCount();
-    method public abstract android.support.v4.app.Fragment getFragment(android.os.Bundle, java.lang.String);
-    method public abstract boolean isDestroyed();
-    method public abstract void popBackStack();
-    method public abstract void popBackStack(java.lang.String, int);
-    method public abstract void popBackStack(int, int);
-    method public abstract boolean popBackStackImmediate();
-    method public abstract boolean popBackStackImmediate(java.lang.String, int);
-    method public abstract boolean popBackStackImmediate(int, int);
-    method public abstract void putFragment(android.os.Bundle, java.lang.String, android.support.v4.app.Fragment);
-    method public abstract void removeOnBackStackChangedListener(android.support.v4.app.FragmentManager.OnBackStackChangedListener);
-    method public abstract android.support.v4.app.Fragment.SavedState saveFragmentInstanceState(android.support.v4.app.Fragment);
-    field public static final int POP_BACK_STACK_INCLUSIVE = 1; // 0x1
-  }
-
-  public static abstract interface FragmentManager.BackStackEntry {
-    method public abstract java.lang.CharSequence getBreadCrumbShortTitle();
-    method public abstract int getBreadCrumbShortTitleRes();
-    method public abstract java.lang.CharSequence getBreadCrumbTitle();
-    method public abstract int getBreadCrumbTitleRes();
-    method public abstract int getId();
-    method public abstract java.lang.String getName();
-  }
-
-  public static abstract interface FragmentManager.OnBackStackChangedListener {
-    method public abstract void onBackStackChanged();
-  }
-
-  public abstract class FragmentPagerAdapter extends android.support.v4.view.PagerAdapter {
-    ctor public FragmentPagerAdapter(android.support.v4.app.FragmentManager);
-    method public abstract android.support.v4.app.Fragment getItem(int);
-    method public long getItemId(int);
-    method public boolean isViewFromObject(android.view.View, java.lang.Object);
-  }
-
-  public abstract class FragmentStatePagerAdapter extends android.support.v4.view.PagerAdapter {
-    ctor public FragmentStatePagerAdapter(android.support.v4.app.FragmentManager);
-    method public abstract android.support.v4.app.Fragment getItem(int);
-    method public boolean isViewFromObject(android.view.View, java.lang.Object);
-  }
-
-  public class FragmentTabHost extends android.widget.TabHost implements android.widget.TabHost.OnTabChangeListener {
-    ctor public FragmentTabHost(android.content.Context);
-    ctor public FragmentTabHost(android.content.Context, android.util.AttributeSet);
-    method public void addTab(android.widget.TabHost.TabSpec, java.lang.Class<?>, android.os.Bundle);
-    method public void onTabChanged(java.lang.String);
-    method public void setup(android.content.Context, android.support.v4.app.FragmentManager);
-    method public void setup(android.content.Context, android.support.v4.app.FragmentManager, int);
-  }
-
-  public abstract class FragmentTransaction {
-    ctor public FragmentTransaction();
-    method public abstract android.support.v4.app.FragmentTransaction add(android.support.v4.app.Fragment, java.lang.String);
-    method public abstract android.support.v4.app.FragmentTransaction add(int, android.support.v4.app.Fragment);
-    method public abstract android.support.v4.app.FragmentTransaction add(int, android.support.v4.app.Fragment, java.lang.String);
-    method public abstract android.support.v4.app.FragmentTransaction addSharedElement(android.view.View, java.lang.String);
-    method public abstract android.support.v4.app.FragmentTransaction addToBackStack(java.lang.String);
-    method public abstract android.support.v4.app.FragmentTransaction attach(android.support.v4.app.Fragment);
-    method public abstract int commit();
-    method public abstract int commitAllowingStateLoss();
-    method public abstract android.support.v4.app.FragmentTransaction detach(android.support.v4.app.Fragment);
-    method public abstract android.support.v4.app.FragmentTransaction disallowAddToBackStack();
-    method public abstract android.support.v4.app.FragmentTransaction hide(android.support.v4.app.Fragment);
-    method public abstract boolean isAddToBackStackAllowed();
-    method public abstract boolean isEmpty();
-    method public abstract android.support.v4.app.FragmentTransaction remove(android.support.v4.app.Fragment);
-    method public abstract android.support.v4.app.FragmentTransaction replace(int, android.support.v4.app.Fragment);
-    method public abstract android.support.v4.app.FragmentTransaction replace(int, android.support.v4.app.Fragment, java.lang.String);
-    method public abstract android.support.v4.app.FragmentTransaction setBreadCrumbShortTitle(int);
-    method public abstract android.support.v4.app.FragmentTransaction setBreadCrumbShortTitle(java.lang.CharSequence);
-    method public abstract android.support.v4.app.FragmentTransaction setBreadCrumbTitle(int);
-    method public abstract android.support.v4.app.FragmentTransaction setBreadCrumbTitle(java.lang.CharSequence);
-    method public abstract android.support.v4.app.FragmentTransaction setCustomAnimations(int, int);
-    method public abstract android.support.v4.app.FragmentTransaction setCustomAnimations(int, int, int, int);
-    method public abstract android.support.v4.app.FragmentTransaction setTransition(int);
-    method public abstract android.support.v4.app.FragmentTransaction setTransitionStyle(int);
-    method public abstract android.support.v4.app.FragmentTransaction show(android.support.v4.app.Fragment);
-    field public static final int TRANSIT_ENTER_MASK = 4096; // 0x1000
-    field public static final int TRANSIT_EXIT_MASK = 8192; // 0x2000
-    field public static final int TRANSIT_FRAGMENT_CLOSE = 8194; // 0x2002
-    field public static final int TRANSIT_FRAGMENT_FADE = 4099; // 0x1003
-    field public static final int TRANSIT_FRAGMENT_OPEN = 4097; // 0x1001
-    field public static final int TRANSIT_NONE = 0; // 0x0
-    field public static final int TRANSIT_UNSET = -1; // 0xffffffff
-  }
-
-  public class ListFragment extends android.support.v4.app.Fragment {
-    ctor public ListFragment();
-    method public android.widget.ListAdapter getListAdapter();
-    method public android.widget.ListView getListView();
-    method public long getSelectedItemId();
-    method public int getSelectedItemPosition();
-    method public void onListItemClick(android.widget.ListView, android.view.View, int, long);
-    method public void setEmptyText(java.lang.CharSequence);
-    method public void setListAdapter(android.widget.ListAdapter);
-    method public void setListShown(boolean);
-    method public void setListShownNoAnimation(boolean);
-    method public void setSelection(int);
-  }
-
-  public abstract class LoaderManager {
-    ctor public LoaderManager();
-    method public abstract void destroyLoader(int);
-    method public abstract void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
-    method public static void enableDebugLogging(boolean);
-    method public abstract android.support.v4.content.Loader<D> getLoader(int);
-    method public boolean hasRunningLoaders();
-    method public abstract android.support.v4.content.Loader<D> initLoader(int, android.os.Bundle, android.support.v4.app.LoaderManager.LoaderCallbacks<D>);
-    method public abstract android.support.v4.content.Loader<D> restartLoader(int, android.os.Bundle, android.support.v4.app.LoaderManager.LoaderCallbacks<D>);
-  }
-
-  public static abstract interface LoaderManager.LoaderCallbacks {
-    method public abstract android.support.v4.content.Loader<D> onCreateLoader(int, android.os.Bundle);
-    method public abstract void onLoadFinished(android.support.v4.content.Loader<D>, D);
-    method public abstract void onLoaderReset(android.support.v4.content.Loader<D>);
-  }
-
-  public class NavUtils {
-    method public static android.content.Intent getParentActivityIntent(android.app.Activity);
-    method public static android.content.Intent getParentActivityIntent(android.content.Context, java.lang.Class<?>) throws android.content.pm.PackageManager.NameNotFoundException;
-    method public static android.content.Intent getParentActivityIntent(android.content.Context, android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
-    method public static java.lang.String getParentActivityName(android.app.Activity);
-    method public static java.lang.String getParentActivityName(android.content.Context, android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
-    method public static void navigateUpFromSameTask(android.app.Activity);
-    method public static void navigateUpTo(android.app.Activity, android.content.Intent);
-    method public static boolean shouldUpRecreateTask(android.app.Activity, android.content.Intent);
-    field public static final java.lang.String PARENT_ACTIVITY = "android.support.PARENT_ACTIVITY";
-  }
-
-  public class NotificationCompat {
-    ctor public NotificationCompat();
-    method public static android.support.v4.app.NotificationCompat.Action getAction(android.app.Notification, int);
-    method public static int getActionCount(android.app.Notification);
-    method public static java.lang.String getCategory(android.app.Notification);
-    method public static android.os.Bundle getExtras(android.app.Notification);
-    method public static java.lang.String getGroup(android.app.Notification);
-    method public static boolean getLocalOnly(android.app.Notification);
-    method public static java.lang.String getSortKey(android.app.Notification);
-    method public static boolean isGroupSummary(android.app.Notification);
-    field public static final java.lang.String CATEGORY_ALARM = "alarm";
-    field public static final java.lang.String CATEGORY_CALL = "call";
-    field public static final java.lang.String CATEGORY_EMAIL = "email";
-    field public static final java.lang.String CATEGORY_ERROR = "err";
-    field public static final java.lang.String CATEGORY_EVENT = "event";
-    field public static final java.lang.String CATEGORY_MESSAGE = "msg";
-    field public static final java.lang.String CATEGORY_PROGRESS = "progress";
-    field public static final java.lang.String CATEGORY_PROMO = "promo";
-    field public static final java.lang.String CATEGORY_RECOMMENDATION = "recommendation";
-    field public static final java.lang.String CATEGORY_SERVICE = "service";
-    field public static final java.lang.String CATEGORY_SOCIAL = "social";
-    field public static final java.lang.String CATEGORY_STATUS = "status";
-    field public static final java.lang.String CATEGORY_SYSTEM = "sys";
-    field public static final java.lang.String CATEGORY_TRANSPORT = "transport";
-    field public static final int COLOR_DEFAULT = 0; // 0x0
-    field public static final int DEFAULT_ALL = -1; // 0xffffffff
-    field public static final int DEFAULT_LIGHTS = 4; // 0x4
-    field public static final int DEFAULT_SOUND = 1; // 0x1
-    field public static final int DEFAULT_VIBRATE = 2; // 0x2
-    field public static final java.lang.String EXTRA_BACKGROUND_IMAGE_URI = "android.backgroundImageUri";
-    field public static final java.lang.String EXTRA_BIG_TEXT = "android.bigText";
-    field public static final java.lang.String EXTRA_COMPACT_ACTIONS = "android.compactActions";
-    field public static final java.lang.String EXTRA_INFO_TEXT = "android.infoText";
-    field public static final java.lang.String EXTRA_LARGE_ICON = "android.largeIcon";
-    field public static final java.lang.String EXTRA_LARGE_ICON_BIG = "android.largeIcon.big";
-    field public static final java.lang.String EXTRA_MEDIA_SESSION = "android.mediaSession";
-    field public static final java.lang.String EXTRA_PEOPLE = "android.people";
-    field public static final java.lang.String EXTRA_PICTURE = "android.picture";
-    field public static final java.lang.String EXTRA_PROGRESS = "android.progress";
-    field public static final java.lang.String EXTRA_PROGRESS_INDETERMINATE = "android.progressIndeterminate";
-    field public static final java.lang.String EXTRA_PROGRESS_MAX = "android.progressMax";
-    field public static final java.lang.String EXTRA_SHOW_CHRONOMETER = "android.showChronometer";
-    field public static final java.lang.String EXTRA_SHOW_WHEN = "android.showWhen";
-    field public static final java.lang.String EXTRA_SMALL_ICON = "android.icon";
-    field public static final java.lang.String EXTRA_SUB_TEXT = "android.subText";
-    field public static final java.lang.String EXTRA_SUMMARY_TEXT = "android.summaryText";
-    field public static final java.lang.String EXTRA_TEMPLATE = "android.template";
-    field public static final java.lang.String EXTRA_TEXT = "android.text";
-    field public static final java.lang.String EXTRA_TEXT_LINES = "android.textLines";
-    field public static final java.lang.String EXTRA_TITLE = "android.title";
-    field public static final java.lang.String EXTRA_TITLE_BIG = "android.title.big";
-    field public static final int FLAG_AUTO_CANCEL = 16; // 0x10
-    field public static final int FLAG_FOREGROUND_SERVICE = 64; // 0x40
-    field public static final int FLAG_GROUP_SUMMARY = 512; // 0x200
-    field public static final deprecated int FLAG_HIGH_PRIORITY = 128; // 0x80
-    field public static final int FLAG_INSISTENT = 4; // 0x4
-    field public static final int FLAG_LOCAL_ONLY = 256; // 0x100
-    field public static final int FLAG_NO_CLEAR = 32; // 0x20
-    field public static final int FLAG_ONGOING_EVENT = 2; // 0x2
-    field public static final int FLAG_ONLY_ALERT_ONCE = 8; // 0x8
-    field public static final int FLAG_SHOW_LIGHTS = 1; // 0x1
-    field public static final int PRIORITY_DEFAULT = 0; // 0x0
-    field public static final int PRIORITY_HIGH = 1; // 0x1
-    field public static final int PRIORITY_LOW = -1; // 0xffffffff
-    field public static final int PRIORITY_MAX = 2; // 0x2
-    field public static final int PRIORITY_MIN = -2; // 0xfffffffe
-    field public static final int STREAM_DEFAULT = -1; // 0xffffffff
-    field public static final int VISIBILITY_PRIVATE = 0; // 0x0
-    field public static final int VISIBILITY_PUBLIC = 1; // 0x1
-    field public static final int VISIBILITY_SECRET = -1; // 0xffffffff
-  }
-
-  public static class NotificationCompat.Action extends android.support.v4.app.NotificationCompatBase.Action {
-    ctor public NotificationCompat.Action(int, java.lang.CharSequence, android.app.PendingIntent);
-    method protected android.app.PendingIntent getActionIntent();
-    method public android.os.Bundle getExtras();
-    method protected int getIcon();
-    method public android.support.v4.app.RemoteInput[] getRemoteInputs();
-    method protected java.lang.CharSequence getTitle();
-    field public android.app.PendingIntent actionIntent;
-    field public int icon;
-    field public java.lang.CharSequence title;
-  }
-
-  public static final class NotificationCompat.Action.Builder {
-    ctor public NotificationCompat.Action.Builder(int, java.lang.CharSequence, android.app.PendingIntent);
-    ctor public NotificationCompat.Action.Builder(android.support.v4.app.NotificationCompat.Action);
-    method public android.support.v4.app.NotificationCompat.Action.Builder addExtras(android.os.Bundle);
-    method public android.support.v4.app.NotificationCompat.Action.Builder addRemoteInput(android.support.v4.app.RemoteInput);
-    method public android.support.v4.app.NotificationCompat.Action build();
-    method public android.support.v4.app.NotificationCompat.Action.Builder extend(android.support.v4.app.NotificationCompat.Action.Extender);
-    method public android.os.Bundle getExtras();
-  }
-
-  public static abstract interface NotificationCompat.Action.Extender {
-    method public abstract android.support.v4.app.NotificationCompat.Action.Builder extend(android.support.v4.app.NotificationCompat.Action.Builder);
-  }
-
-  public static final class NotificationCompat.Action.WearableExtender implements android.support.v4.app.NotificationCompat.Action.Extender {
-    ctor public NotificationCompat.Action.WearableExtender();
-    ctor public NotificationCompat.Action.WearableExtender(android.support.v4.app.NotificationCompat.Action);
-    method public android.support.v4.app.NotificationCompat.Action.WearableExtender clone();
-    method public android.support.v4.app.NotificationCompat.Action.Builder extend(android.support.v4.app.NotificationCompat.Action.Builder);
-    method public java.lang.CharSequence getCancelLabel();
-    method public java.lang.CharSequence getConfirmLabel();
-    method public java.lang.CharSequence getInProgressLabel();
-    method public boolean isAvailableOffline();
-    method public android.support.v4.app.NotificationCompat.Action.WearableExtender setAvailableOffline(boolean);
-    method public android.support.v4.app.NotificationCompat.Action.WearableExtender setCancelLabel(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.Action.WearableExtender setConfirmLabel(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.Action.WearableExtender setInProgressLabel(java.lang.CharSequence);
-  }
-
-  public static class NotificationCompat.BigPictureStyle extends android.support.v4.app.NotificationCompat.Style {
-    ctor public NotificationCompat.BigPictureStyle();
-    ctor public NotificationCompat.BigPictureStyle(android.support.v4.app.NotificationCompat.Builder);
-    method public android.support.v4.app.NotificationCompat.BigPictureStyle bigLargeIcon(android.graphics.Bitmap);
-    method public android.support.v4.app.NotificationCompat.BigPictureStyle bigPicture(android.graphics.Bitmap);
-    method public android.support.v4.app.NotificationCompat.BigPictureStyle setBigContentTitle(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.BigPictureStyle setSummaryText(java.lang.CharSequence);
-  }
-
-  public static class NotificationCompat.BigTextStyle extends android.support.v4.app.NotificationCompat.Style {
-    ctor public NotificationCompat.BigTextStyle();
-    ctor public NotificationCompat.BigTextStyle(android.support.v4.app.NotificationCompat.Builder);
-    method public android.support.v4.app.NotificationCompat.BigTextStyle bigText(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.BigTextStyle setBigContentTitle(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.BigTextStyle setSummaryText(java.lang.CharSequence);
-  }
-
-  public static class NotificationCompat.Builder {
-    ctor public NotificationCompat.Builder(android.content.Context);
-    method public android.support.v4.app.NotificationCompat.Builder addAction(int, java.lang.CharSequence, android.app.PendingIntent);
-    method public android.support.v4.app.NotificationCompat.Builder addAction(android.support.v4.app.NotificationCompat.Action);
-    method public android.support.v4.app.NotificationCompat.Builder addExtras(android.os.Bundle);
-    method public android.support.v4.app.NotificationCompat.Builder addPerson(java.lang.String);
-    method public android.app.Notification build();
-    method public android.support.v4.app.NotificationCompat.Builder extend(android.support.v4.app.NotificationCompat.Extender);
-    method public android.os.Bundle getExtras();
-    method public deprecated android.app.Notification getNotification();
-    method protected static java.lang.CharSequence limitCharSequenceLength(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.Builder setAutoCancel(boolean);
-    method public android.support.v4.app.NotificationCompat.Builder setCategory(java.lang.String);
-    method public android.support.v4.app.NotificationCompat.Builder setColor(int);
-    method public android.support.v4.app.NotificationCompat.Builder setContent(android.widget.RemoteViews);
-    method public android.support.v4.app.NotificationCompat.Builder setContentInfo(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.Builder setContentIntent(android.app.PendingIntent);
-    method public android.support.v4.app.NotificationCompat.Builder setContentText(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.Builder setContentTitle(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.Builder setDefaults(int);
-    method public android.support.v4.app.NotificationCompat.Builder setDeleteIntent(android.app.PendingIntent);
-    method public android.support.v4.app.NotificationCompat.Builder setExtras(android.os.Bundle);
-    method public android.support.v4.app.NotificationCompat.Builder setFullScreenIntent(android.app.PendingIntent, boolean);
-    method public android.support.v4.app.NotificationCompat.Builder setGroup(java.lang.String);
-    method public android.support.v4.app.NotificationCompat.Builder setGroupSummary(boolean);
-    method public android.support.v4.app.NotificationCompat.Builder setLargeIcon(android.graphics.Bitmap);
-    method public android.support.v4.app.NotificationCompat.Builder setLights(int, int, int);
-    method public android.support.v4.app.NotificationCompat.Builder setLocalOnly(boolean);
-    method public android.support.v4.app.NotificationCompat.Builder setNumber(int);
-    method public android.support.v4.app.NotificationCompat.Builder setOngoing(boolean);
-    method public android.support.v4.app.NotificationCompat.Builder setOnlyAlertOnce(boolean);
-    method public android.support.v4.app.NotificationCompat.Builder setPriority(int);
-    method public android.support.v4.app.NotificationCompat.Builder setProgress(int, int, boolean);
-    method public android.support.v4.app.NotificationCompat.Builder setPublicVersion(android.app.Notification);
-    method public android.support.v4.app.NotificationCompat.Builder setShowWhen(boolean);
-    method public android.support.v4.app.NotificationCompat.Builder setSmallIcon(int);
-    method public android.support.v4.app.NotificationCompat.Builder setSmallIcon(int, int);
-    method public android.support.v4.app.NotificationCompat.Builder setSortKey(java.lang.String);
-    method public android.support.v4.app.NotificationCompat.Builder setSound(android.net.Uri);
-    method public android.support.v4.app.NotificationCompat.Builder setSound(android.net.Uri, int);
-    method public android.support.v4.app.NotificationCompat.Builder setStyle(android.support.v4.app.NotificationCompat.Style);
-    method public android.support.v4.app.NotificationCompat.Builder setSubText(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.Builder setTicker(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.Builder setTicker(java.lang.CharSequence, android.widget.RemoteViews);
-    method public android.support.v4.app.NotificationCompat.Builder setUsesChronometer(boolean);
-    method public android.support.v4.app.NotificationCompat.Builder setVibrate(long[]);
-    method public android.support.v4.app.NotificationCompat.Builder setVisibility(int);
-    method public android.support.v4.app.NotificationCompat.Builder setWhen(long);
-    field public java.util.ArrayList<java.lang.String> mPeople;
-  }
-
-  public static final class NotificationCompat.CarExtender implements android.support.v4.app.NotificationCompat.Extender {
-    ctor public NotificationCompat.CarExtender();
-    ctor public NotificationCompat.CarExtender(android.app.Notification);
-    method public android.support.v4.app.NotificationCompat.Builder extend(android.support.v4.app.NotificationCompat.Builder);
-    method public int getColor();
-    method public android.graphics.Bitmap getLargeIcon();
-    method public android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation getUnreadConversation();
-    method public android.support.v4.app.NotificationCompat.CarExtender setColor(int);
-    method public android.support.v4.app.NotificationCompat.CarExtender setLargeIcon(android.graphics.Bitmap);
-    method public android.support.v4.app.NotificationCompat.CarExtender setUnreadConversation(android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation);
-  }
-
-  public static class NotificationCompat.CarExtender.UnreadConversation extends android.support.v4.app.NotificationCompatBase.UnreadConversation {
-    method public long getLatestTimestamp();
-    method public java.lang.String[] getMessages();
-    method public java.lang.String getParticipant();
-    method public java.lang.String[] getParticipants();
-    method public android.app.PendingIntent getReadPendingIntent();
-    method public android.support.v4.app.RemoteInput getRemoteInput();
-    method public android.app.PendingIntent getReplyPendingIntent();
-  }
-
-  public static class NotificationCompat.CarExtender.UnreadConversation.Builder {
-    ctor public NotificationCompat.CarExtender.UnreadConversation.Builder(java.lang.String);
-    method public android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation.Builder addMessage(java.lang.String);
-    method public android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation build();
-    method public android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation.Builder setLatestTimestamp(long);
-    method public android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation.Builder setReadPendingIntent(android.app.PendingIntent);
-    method public android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation.Builder setReplyAction(android.app.PendingIntent, android.support.v4.app.RemoteInput);
-  }
-
-  public static abstract interface NotificationCompat.Extender {
-    method public abstract android.support.v4.app.NotificationCompat.Builder extend(android.support.v4.app.NotificationCompat.Builder);
-  }
-
-  public static class NotificationCompat.InboxStyle extends android.support.v4.app.NotificationCompat.Style {
-    ctor public NotificationCompat.InboxStyle();
-    ctor public NotificationCompat.InboxStyle(android.support.v4.app.NotificationCompat.Builder);
-    method public android.support.v4.app.NotificationCompat.InboxStyle addLine(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.InboxStyle setBigContentTitle(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.InboxStyle setSummaryText(java.lang.CharSequence);
-  }
-
-  public static abstract class NotificationCompat.Style {
-    ctor public NotificationCompat.Style();
-    method public android.app.Notification build();
-    method public void setBuilder(android.support.v4.app.NotificationCompat.Builder);
-  }
-
-  public static final class NotificationCompat.WearableExtender implements android.support.v4.app.NotificationCompat.Extender {
-    ctor public NotificationCompat.WearableExtender();
-    ctor public NotificationCompat.WearableExtender(android.app.Notification);
-    method public android.support.v4.app.NotificationCompat.WearableExtender addAction(android.support.v4.app.NotificationCompat.Action);
-    method public android.support.v4.app.NotificationCompat.WearableExtender addActions(java.util.List<android.support.v4.app.NotificationCompat.Action>);
-    method public android.support.v4.app.NotificationCompat.WearableExtender addPage(android.app.Notification);
-    method public android.support.v4.app.NotificationCompat.WearableExtender addPages(java.util.List<android.app.Notification>);
-    method public android.support.v4.app.NotificationCompat.WearableExtender clearActions();
-    method public android.support.v4.app.NotificationCompat.WearableExtender clearPages();
-    method public android.support.v4.app.NotificationCompat.WearableExtender clone();
-    method public android.support.v4.app.NotificationCompat.Builder extend(android.support.v4.app.NotificationCompat.Builder);
-    method public java.util.List<android.support.v4.app.NotificationCompat.Action> getActions();
-    method public android.graphics.Bitmap getBackground();
-    method public int getContentAction();
-    method public int getContentIcon();
-    method public int getContentIconGravity();
-    method public boolean getContentIntentAvailableOffline();
-    method public int getCustomContentHeight();
-    method public int getCustomSizePreset();
-    method public android.app.PendingIntent getDisplayIntent();
-    method public int getGravity();
-    method public boolean getHintAvoidBackgroundClipping();
-    method public boolean getHintHideIcon();
-    method public int getHintScreenTimeout();
-    method public boolean getHintShowBackgroundOnly();
-    method public java.util.List<android.app.Notification> getPages();
-    method public boolean getStartScrollBottom();
-    method public android.support.v4.app.NotificationCompat.WearableExtender setBackground(android.graphics.Bitmap);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setContentAction(int);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setContentIcon(int);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setContentIconGravity(int);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setContentIntentAvailableOffline(boolean);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setCustomContentHeight(int);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setCustomSizePreset(int);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setDisplayIntent(android.app.PendingIntent);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setGravity(int);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setHintAvoidBackgroundClipping(boolean);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setHintHideIcon(boolean);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setHintScreenTimeout(int);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setHintShowBackgroundOnly(boolean);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setStartScrollBottom(boolean);
-    field public static final int SCREEN_TIMEOUT_LONG = -1; // 0xffffffff
-    field public static final int SCREEN_TIMEOUT_SHORT = 0; // 0x0
-    field public static final int SIZE_DEFAULT = 0; // 0x0
-    field public static final int SIZE_FULL_SCREEN = 5; // 0x5
-    field public static final int SIZE_LARGE = 4; // 0x4
-    field public static final int SIZE_MEDIUM = 3; // 0x3
-    field public static final int SIZE_SMALL = 2; // 0x2
-    field public static final int SIZE_XSMALL = 1; // 0x1
-    field public static final int UNSET_ACTION_INDEX = -1; // 0xffffffff
-  }
-
-   class NotificationCompatBase {
-  }
-
-  public static abstract class NotificationCompatBase.Action {
-    ctor public NotificationCompatBase.Action();
-    method protected abstract android.app.PendingIntent getActionIntent();
-    method protected abstract android.os.Bundle getExtras();
-    method protected abstract int getIcon();
-    method protected abstract android.support.v4.app.RemoteInputCompatBase.RemoteInput[] getRemoteInputs();
-    method protected abstract java.lang.CharSequence getTitle();
-  }
-
-  public static abstract class NotificationCompatBase.UnreadConversation {
-    ctor public NotificationCompatBase.UnreadConversation();
-  }
-
-  public final class NotificationCompatExtras {
-    field public static final java.lang.String EXTRA_ACTION_EXTRAS = "android.support.actionExtras";
-    field public static final java.lang.String EXTRA_GROUP_KEY = "android.support.groupKey";
-    field public static final java.lang.String EXTRA_GROUP_SUMMARY = "android.support.isGroupSummary";
-    field public static final java.lang.String EXTRA_LOCAL_ONLY = "android.support.localOnly";
-    field public static final java.lang.String EXTRA_REMOTE_INPUTS = "android.support.remoteInputs";
-    field public static final java.lang.String EXTRA_SORT_KEY = "android.support.sortKey";
-  }
-
-  public abstract class NotificationCompatSideChannelService extends android.app.Service {
-    ctor public NotificationCompatSideChannelService();
-    method public abstract void cancel(java.lang.String, int, java.lang.String);
-    method public abstract void cancelAll(java.lang.String);
-    method public abstract void notify(java.lang.String, int, java.lang.String, android.app.Notification);
-    method public android.os.IBinder onBind(android.content.Intent);
-  }
-
-  public class NotificationManagerCompat {
-    method public void cancel(int);
-    method public void cancel(java.lang.String, int);
-    method public void cancelAll();
-    method public static android.support.v4.app.NotificationManagerCompat from(android.content.Context);
-    method public static java.util.Set<java.lang.String> getEnabledListenerPackages(android.content.Context);
-    method public void notify(int, android.app.Notification);
-    method public void notify(java.lang.String, int, android.app.Notification);
-    field public static final java.lang.String ACTION_BIND_SIDE_CHANNEL = "android.support.BIND_NOTIFICATION_SIDE_CHANNEL";
-    field public static final java.lang.String EXTRA_USE_SIDE_CHANNEL = "android.support.useSideChannel";
-  }
-
-  public class RemoteInput extends android.support.v4.app.RemoteInputCompatBase.RemoteInput {
-    method public static void addResultsToIntent(android.support.v4.app.RemoteInput[], android.content.Intent, android.os.Bundle);
-    method public boolean getAllowFreeFormInput();
-    method public java.lang.CharSequence[] getChoices();
-    method public android.os.Bundle getExtras();
-    method public java.lang.CharSequence getLabel();
-    method public java.lang.String getResultKey();
-    method public static android.os.Bundle getResultsFromIntent(android.content.Intent);
-    field public static final java.lang.String EXTRA_RESULTS_DATA = "android.remoteinput.resultsData";
-    field public static final java.lang.String RESULTS_CLIP_LABEL = "android.remoteinput.results";
-  }
-
-  public static final class RemoteInput.Builder {
-    ctor public RemoteInput.Builder(java.lang.String);
-    method public android.support.v4.app.RemoteInput.Builder addExtras(android.os.Bundle);
-    method public android.support.v4.app.RemoteInput build();
-    method public android.os.Bundle getExtras();
-    method public android.support.v4.app.RemoteInput.Builder setAllowFreeFormInput(boolean);
-    method public android.support.v4.app.RemoteInput.Builder setChoices(java.lang.CharSequence[]);
-    method public android.support.v4.app.RemoteInput.Builder setLabel(java.lang.CharSequence);
-  }
-
-   class RemoteInputCompatBase {
-  }
-
-  public static abstract class RemoteInputCompatBase.RemoteInput {
-    ctor public RemoteInputCompatBase.RemoteInput();
-    method protected abstract boolean getAllowFreeFormInput();
-    method protected abstract java.lang.CharSequence[] getChoices();
-    method protected abstract android.os.Bundle getExtras();
-    method protected abstract java.lang.CharSequence getLabel();
-    method protected abstract java.lang.String getResultKey();
-  }
-
-  public class ServiceCompat {
-    field public static final int START_STICKY = 1; // 0x1
-  }
-
-  public class ShareCompat {
-    ctor public ShareCompat();
-    method public static void configureMenuItem(android.view.MenuItem, android.support.v4.app.ShareCompat.IntentBuilder);
-    method public static void configureMenuItem(android.view.Menu, int, android.support.v4.app.ShareCompat.IntentBuilder);
-    method public static android.content.ComponentName getCallingActivity(android.app.Activity);
-    method public static java.lang.String getCallingPackage(android.app.Activity);
-    field public static final java.lang.String EXTRA_CALLING_ACTIVITY = "android.support.v4.app.EXTRA_CALLING_ACTIVITY";
-    field public static final java.lang.String EXTRA_CALLING_PACKAGE = "android.support.v4.app.EXTRA_CALLING_PACKAGE";
-  }
-
-  public static class ShareCompat.IntentBuilder {
-    method public android.support.v4.app.ShareCompat.IntentBuilder addEmailBcc(java.lang.String);
-    method public android.support.v4.app.ShareCompat.IntentBuilder addEmailBcc(java.lang.String[]);
-    method public android.support.v4.app.ShareCompat.IntentBuilder addEmailCc(java.lang.String);
-    method public android.support.v4.app.ShareCompat.IntentBuilder addEmailCc(java.lang.String[]);
-    method public android.support.v4.app.ShareCompat.IntentBuilder addEmailTo(java.lang.String);
-    method public android.support.v4.app.ShareCompat.IntentBuilder addEmailTo(java.lang.String[]);
-    method public android.support.v4.app.ShareCompat.IntentBuilder addStream(android.net.Uri);
-    method public android.content.Intent createChooserIntent();
-    method public static android.support.v4.app.ShareCompat.IntentBuilder from(android.app.Activity);
-    method public android.content.Intent getIntent();
-    method public android.support.v4.app.ShareCompat.IntentBuilder setChooserTitle(java.lang.CharSequence);
-    method public android.support.v4.app.ShareCompat.IntentBuilder setChooserTitle(int);
-    method public android.support.v4.app.ShareCompat.IntentBuilder setEmailBcc(java.lang.String[]);
-    method public android.support.v4.app.ShareCompat.IntentBuilder setEmailCc(java.lang.String[]);
-    method public android.support.v4.app.ShareCompat.IntentBuilder setEmailTo(java.lang.String[]);
-    method public android.support.v4.app.ShareCompat.IntentBuilder setHtmlText(java.lang.String);
-    method public android.support.v4.app.ShareCompat.IntentBuilder setStream(android.net.Uri);
-    method public android.support.v4.app.ShareCompat.IntentBuilder setSubject(java.lang.String);
-    method public android.support.v4.app.ShareCompat.IntentBuilder setText(java.lang.CharSequence);
-    method public android.support.v4.app.ShareCompat.IntentBuilder setType(java.lang.String);
-    method public void startChooser();
-  }
-
-  public static class ShareCompat.IntentReader {
-    method public static android.support.v4.app.ShareCompat.IntentReader from(android.app.Activity);
-    method public android.content.ComponentName getCallingActivity();
-    method public android.graphics.drawable.Drawable getCallingActivityIcon();
-    method public android.graphics.drawable.Drawable getCallingApplicationIcon();
-    method public java.lang.CharSequence getCallingApplicationLabel();
-    method public java.lang.String getCallingPackage();
-    method public java.lang.String[] getEmailBcc();
-    method public java.lang.String[] getEmailCc();
-    method public java.lang.String[] getEmailTo();
-    method public java.lang.String getHtmlText();
-    method public android.net.Uri getStream();
-    method public android.net.Uri getStream(int);
-    method public int getStreamCount();
-    method public java.lang.String getSubject();
-    method public java.lang.CharSequence getText();
-    method public java.lang.String getType();
-    method public boolean isMultipleShare();
-    method public boolean isShareIntent();
-    method public boolean isSingleShare();
-  }
-
-  public abstract class SharedElementCallback {
-    ctor public SharedElementCallback();
-    method public android.os.Parcelable onCaptureSharedElementSnapshot(android.view.View, android.graphics.Matrix, android.graphics.RectF);
-    method public android.view.View onCreateSnapshotView(android.content.Context, android.os.Parcelable);
-    method public void onMapSharedElements(java.util.List<java.lang.String>, java.util.Map<java.lang.String, android.view.View>);
-    method public void onRejectSharedElements(java.util.List<android.view.View>);
-    method public void onSharedElementEnd(java.util.List<java.lang.String>, java.util.List<android.view.View>, java.util.List<android.view.View>);
-    method public void onSharedElementStart(java.util.List<java.lang.String>, java.util.List<android.view.View>, java.util.List<android.view.View>);
-  }
-
-  public class TaskStackBuilder implements java.lang.Iterable {
-    method public android.support.v4.app.TaskStackBuilder addNextIntent(android.content.Intent);
-    method public android.support.v4.app.TaskStackBuilder addNextIntentWithParentStack(android.content.Intent);
-    method public android.support.v4.app.TaskStackBuilder addParentStack(android.app.Activity);
-    method public android.support.v4.app.TaskStackBuilder addParentStack(java.lang.Class<?>);
-    method public android.support.v4.app.TaskStackBuilder addParentStack(android.content.ComponentName);
-    method public static android.support.v4.app.TaskStackBuilder create(android.content.Context);
-    method public android.content.Intent editIntentAt(int);
-    method public static deprecated android.support.v4.app.TaskStackBuilder from(android.content.Context);
-    method public deprecated android.content.Intent getIntent(int);
-    method public int getIntentCount();
-    method public android.content.Intent[] getIntents();
-    method public android.app.PendingIntent getPendingIntent(int, int);
-    method public android.app.PendingIntent getPendingIntent(int, int, android.os.Bundle);
-    method public deprecated java.util.Iterator<android.content.Intent> iterator();
-    method public void startActivities();
-    method public void startActivities(android.os.Bundle);
-  }
-
-  public static abstract interface TaskStackBuilder.SupportParentable {
-    method public abstract android.content.Intent getSupportParentActivityIntent();
-  }
-
-}
-
-package android.support.v4.content {
-
-  public abstract class AsyncTaskLoader extends android.support.v4.content.Loader {
-    ctor public AsyncTaskLoader(android.content.Context);
-    method public boolean cancelLoad();
-    method public abstract D loadInBackground();
-    method public void onCanceled(D);
-    method protected D onLoadInBackground();
-    method public void setUpdateThrottle(long);
-  }
-
-  public class ContextCompat {
-    ctor public ContextCompat();
-    method public final java.io.File getCodeCacheDir(android.content.Context);
-    method public static final android.graphics.drawable.Drawable getDrawable(android.content.Context, int);
-    method public static java.io.File[] getExternalCacheDirs(android.content.Context);
-    method public static java.io.File[] getExternalFilesDirs(android.content.Context, java.lang.String);
-    method public final java.io.File getNoBackupFilesDir(android.content.Context);
-    method public static java.io.File[] getObbDirs(android.content.Context);
-    method public static boolean startActivities(android.content.Context, android.content.Intent[]);
-    method public static boolean startActivities(android.content.Context, android.content.Intent[], android.os.Bundle);
-  }
-
-  public class CursorLoader extends android.support.v4.content.AsyncTaskLoader {
-    ctor public CursorLoader(android.content.Context);
-    ctor public CursorLoader(android.content.Context, android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String);
-    method public void deliverResult(android.database.Cursor);
-    method public java.lang.String[] getProjection();
-    method public java.lang.String getSelection();
-    method public java.lang.String[] getSelectionArgs();
-    method public java.lang.String getSortOrder();
-    method public android.net.Uri getUri();
-    method public android.database.Cursor loadInBackground();
-    method public void onCanceled(android.database.Cursor);
-    method public void setProjection(java.lang.String[]);
-    method public void setSelection(java.lang.String);
-    method public void setSelectionArgs(java.lang.String[]);
-    method public void setSortOrder(java.lang.String);
-    method public void setUri(android.net.Uri);
-  }
-
-  public class FileProvider extends android.content.ContentProvider {
-    ctor public FileProvider();
-    method public int delete(android.net.Uri, java.lang.String, java.lang.String[]);
-    method public java.lang.String getType(android.net.Uri);
-    method public static android.net.Uri getUriForFile(android.content.Context, java.lang.String, java.io.File);
-    method public android.net.Uri insert(android.net.Uri, android.content.ContentValues);
-    method public boolean onCreate();
-    method public android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String);
-    method public int update(android.net.Uri, android.content.ContentValues, java.lang.String, java.lang.String[]);
-  }
-
-  public class IntentCompat {
-    method public static android.content.Intent makeMainActivity(android.content.ComponentName);
-    method public static android.content.Intent makeMainSelectorActivity(java.lang.String, java.lang.String);
-    method public static android.content.Intent makeRestartActivityTask(android.content.ComponentName);
-    field public static final java.lang.String ACTION_EXTERNAL_APPLICATIONS_AVAILABLE = "android.intent.action.EXTERNAL_APPLICATIONS_AVAILABLE";
-    field public static final java.lang.String ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE = "android.intent.action.EXTERNAL_APPLICATIONS_UNAVAILABLE";
-    field public static final java.lang.String EXTRA_CHANGED_PACKAGE_LIST = "android.intent.extra.changed_package_list";
-    field public static final java.lang.String EXTRA_CHANGED_UID_LIST = "android.intent.extra.changed_uid_list";
-    field public static final java.lang.String EXTRA_HTML_TEXT = "android.intent.extra.HTML_TEXT";
-    field public static final int FLAG_ACTIVITY_CLEAR_TASK = 32768; // 0x8000
-    field public static final int FLAG_ACTIVITY_TASK_ON_HOME = 16384; // 0x4000
-  }
-
-  public class Loader {
-    ctor public Loader(android.content.Context);
-    method public void abandon();
-    method public void commitContentChanged();
-    method public java.lang.String dataToString(D);
-    method public void deliverResult(D);
-    method public void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
-    method public void forceLoad();
-    method public android.content.Context getContext();
-    method public int getId();
-    method public boolean isAbandoned();
-    method public boolean isReset();
-    method public boolean isStarted();
-    method protected void onAbandon();
-    method public void onContentChanged();
-    method protected void onForceLoad();
-    method protected void onReset();
-    method protected void onStartLoading();
-    method protected void onStopLoading();
-    method public void registerListener(int, android.support.v4.content.Loader.OnLoadCompleteListener<D>);
-    method public void reset();
-    method public void rollbackContentChanged();
-    method public final void startLoading();
-    method public void stopLoading();
-    method public boolean takeContentChanged();
-    method public void unregisterListener(android.support.v4.content.Loader.OnLoadCompleteListener<D>);
-  }
-
-  public final class Loader.ForceLoadContentObserver extends android.database.ContentObserver {
-    ctor public Loader.ForceLoadContentObserver();
-  }
-
-  public static abstract interface Loader.OnLoadCompleteListener {
-    method public abstract void onLoadComplete(android.support.v4.content.Loader<D>, D);
-  }
-
-  public class LocalBroadcastManager {
-    method public static android.support.v4.content.LocalBroadcastManager getInstance(android.content.Context);
-    method public void registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter);
-    method public boolean sendBroadcast(android.content.Intent);
-    method public void sendBroadcastSync(android.content.Intent);
-    method public void unregisterReceiver(android.content.BroadcastReceiver);
-  }
-
-  public abstract class WakefulBroadcastReceiver extends android.content.BroadcastReceiver {
-    ctor public WakefulBroadcastReceiver();
-    method public static boolean completeWakefulIntent(android.content.Intent);
-    method public static android.content.ComponentName startWakefulService(android.content.Context, android.content.Intent);
-  }
-
-}
-
-package android.support.v4.database {
-
-  public class DatabaseUtilsCompat {
-    method public static java.lang.String[] appendSelectionArgs(java.lang.String[], java.lang.String[]);
-    method public static java.lang.String concatenateWhere(java.lang.String, java.lang.String);
-  }
-
-}
-
-package android.support.v4.graphics {
-
-  public class BitmapCompat {
-    ctor public BitmapCompat();
-    method public static int getAllocationByteCount(android.graphics.Bitmap);
-    method public static boolean hasMipMap(android.graphics.Bitmap);
-    method public static void setHasMipMap(android.graphics.Bitmap, boolean);
-  }
-
-  public class ColorUtils {
-    method public static int HSLToColor(float[]);
-    method public static void RGBToHSL(int, int, int, float[]);
-    method public static double calculateContrast(int, int);
-    method public static double calculateLuminance(int);
-    method public static int calculateMinimumAlpha(int, int, float);
-    method public static void colorToHSL(int, float[]);
-    method public static int compositeColors(int, int);
-    method public static int setAlphaComponent(int, int);
-  }
-
-}
-
-package android.support.v4.graphics.drawable {
-
-  public class DrawableCompat {
-    ctor public DrawableCompat();
-    method public static boolean isAutoMirrored(android.graphics.drawable.Drawable);
-    method public static void jumpToCurrentState(android.graphics.drawable.Drawable);
-    method public static void setAutoMirrored(android.graphics.drawable.Drawable, boolean);
-    method public static void setHotspot(android.graphics.drawable.Drawable, float, float);
-    method public static void setHotspotBounds(android.graphics.drawable.Drawable, int, int, int, int);
-    method public static void setTint(android.graphics.drawable.Drawable, int);
-    method public static void setTintList(android.graphics.drawable.Drawable, android.content.res.ColorStateList);
-    method public static void setTintMode(android.graphics.drawable.Drawable, android.graphics.PorterDuff.Mode);
-    method public static T unwrap(android.graphics.drawable.Drawable);
-    method public static android.graphics.drawable.Drawable wrap(android.graphics.drawable.Drawable);
-  }
-
-  public abstract class RoundedBitmapDrawable extends android.graphics.drawable.Drawable {
-    method public void draw(android.graphics.Canvas);
-    method public final android.graphics.Bitmap getBitmap();
-    method public float getCornerRadius();
-    method public int getGravity();
-    method public int getOpacity();
-    method public final android.graphics.Paint getPaint();
-    method public boolean hasAntiAlias();
-    method public boolean hasMipMap();
-    method public void setAlpha(int);
-    method public void setAntiAlias(boolean);
-    method public void setColorFilter(android.graphics.ColorFilter);
-    method public void setCornerRadius(float);
-    method public void setGravity(int);
-    method public void setMipMap(boolean);
-    method public void setTargetDensity(android.graphics.Canvas);
-    method public void setTargetDensity(android.util.DisplayMetrics);
-    method public void setTargetDensity(int);
-  }
-
-  public class RoundedBitmapDrawableFactory {
-    ctor public RoundedBitmapDrawableFactory();
-    method public static android.support.v4.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, android.graphics.Bitmap);
-    method public static android.support.v4.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, java.lang.String);
-    method public static android.support.v4.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, java.io.InputStream);
-  }
-
-}
-
-package android.support.v4.hardware.display {
-
-  public abstract class DisplayManagerCompat {
-    method public abstract android.view.Display getDisplay(int);
-    method public abstract android.view.Display[] getDisplays();
-    method public abstract android.view.Display[] getDisplays(java.lang.String);
-    method public static android.support.v4.hardware.display.DisplayManagerCompat getInstance(android.content.Context);
-    field public static final java.lang.String DISPLAY_CATEGORY_PRESENTATION = "android.hardware.display.category.PRESENTATION";
-  }
-
-}
-
-package android.support.v4.media {
-
-  public final class MediaDescriptionCompat implements android.os.Parcelable {
-    method public int describeContents();
-    method public static android.support.v4.media.MediaDescriptionCompat fromMediaDescription(java.lang.Object);
-    method public java.lang.CharSequence getDescription();
-    method public android.os.Bundle getExtras();
-    method public android.graphics.Bitmap getIconBitmap();
-    method public android.net.Uri getIconUri();
-    method public java.lang.Object getMediaDescription();
-    method public java.lang.String getMediaId();
-    method public java.lang.CharSequence getSubtitle();
-    method public java.lang.CharSequence getTitle();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.support.v4.media.MediaDescriptionCompat> CREATOR;
-  }
-
-  public static final class MediaDescriptionCompat.Builder {
-    ctor public MediaDescriptionCompat.Builder();
-    method public android.support.v4.media.MediaDescriptionCompat build();
-    method public android.support.v4.media.MediaDescriptionCompat.Builder setDescription(java.lang.CharSequence);
-    method public android.support.v4.media.MediaDescriptionCompat.Builder setExtras(android.os.Bundle);
-    method public android.support.v4.media.MediaDescriptionCompat.Builder setIconBitmap(android.graphics.Bitmap);
-    method public android.support.v4.media.MediaDescriptionCompat.Builder setIconUri(android.net.Uri);
-    method public android.support.v4.media.MediaDescriptionCompat.Builder setMediaId(java.lang.String);
-    method public android.support.v4.media.MediaDescriptionCompat.Builder setSubtitle(java.lang.CharSequence);
-    method public android.support.v4.media.MediaDescriptionCompat.Builder setTitle(java.lang.CharSequence);
-  }
-
-  public final class MediaMetadataCompat implements android.os.Parcelable {
-    method public boolean containsKey(java.lang.String);
-    method public int describeContents();
-    method public static android.support.v4.media.MediaMetadataCompat fromMediaMetadata(java.lang.Object);
-    method public android.graphics.Bitmap getBitmap(java.lang.String);
-    method public android.os.Bundle getBundle();
-    method public android.support.v4.media.MediaDescriptionCompat getDescription();
-    method public long getLong(java.lang.String);
-    method public java.lang.Object getMediaMetadata();
-    method public android.support.v4.media.RatingCompat getRating(java.lang.String);
-    method public java.lang.String getString(java.lang.String);
-    method public java.lang.CharSequence getText(java.lang.String);
-    method public java.util.Set<java.lang.String> keySet();
-    method public int size();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.support.v4.media.MediaMetadataCompat> CREATOR;
-    field public static final java.lang.String METADATA_KEY_ALBUM = "android.media.metadata.ALBUM";
-    field public static final java.lang.String METADATA_KEY_ALBUM_ART = "android.media.metadata.ALBUM_ART";
-    field public static final java.lang.String METADATA_KEY_ALBUM_ARTIST = "android.media.metadata.ALBUM_ARTIST";
-    field public static final java.lang.String METADATA_KEY_ALBUM_ART_URI = "android.media.metadata.ALBUM_ART_URI";
-    field public static final java.lang.String METADATA_KEY_ART = "android.media.metadata.ART";
-    field public static final java.lang.String METADATA_KEY_ARTIST = "android.media.metadata.ARTIST";
-    field public static final java.lang.String METADATA_KEY_ART_URI = "android.media.metadata.ART_URI";
-    field public static final java.lang.String METADATA_KEY_AUTHOR = "android.media.metadata.AUTHOR";
-    field public static final java.lang.String METADATA_KEY_COMPILATION = "android.media.metadata.COMPILATION";
-    field public static final java.lang.String METADATA_KEY_COMPOSER = "android.media.metadata.COMPOSER";
-    field public static final java.lang.String METADATA_KEY_DATE = "android.media.metadata.DATE";
-    field public static final java.lang.String METADATA_KEY_DISC_NUMBER = "android.media.metadata.DISC_NUMBER";
-    field public static final java.lang.String METADATA_KEY_DISPLAY_DESCRIPTION = "android.media.metadata.DISPLAY_DESCRIPTION";
-    field public static final java.lang.String METADATA_KEY_DISPLAY_ICON = "android.media.metadata.DISPLAY_ICON";
-    field public static final java.lang.String METADATA_KEY_DISPLAY_ICON_URI = "android.media.metadata.DISPLAY_ICON_URI";
-    field public static final java.lang.String METADATA_KEY_DISPLAY_SUBTITLE = "android.media.metadata.DISPLAY_SUBTITLE";
-    field public static final java.lang.String METADATA_KEY_DISPLAY_TITLE = "android.media.metadata.DISPLAY_TITLE";
-    field public static final java.lang.String METADATA_KEY_DURATION = "android.media.metadata.DURATION";
-    field public static final java.lang.String METADATA_KEY_GENRE = "android.media.metadata.GENRE";
-    field public static final java.lang.String METADATA_KEY_MEDIA_ID = "android.media.metadata.MEDIA_ID";
-    field public static final java.lang.String METADATA_KEY_NUM_TRACKS = "android.media.metadata.NUM_TRACKS";
-    field public static final java.lang.String METADATA_KEY_RATING = "android.media.metadata.RATING";
-    field public static final java.lang.String METADATA_KEY_TITLE = "android.media.metadata.TITLE";
-    field public static final java.lang.String METADATA_KEY_TRACK_NUMBER = "android.media.metadata.TRACK_NUMBER";
-    field public static final java.lang.String METADATA_KEY_USER_RATING = "android.media.metadata.USER_RATING";
-    field public static final java.lang.String METADATA_KEY_WRITER = "android.media.metadata.WRITER";
-    field public static final java.lang.String METADATA_KEY_YEAR = "android.media.metadata.YEAR";
-  }
-
-  public static final class MediaMetadataCompat.Builder {
-    ctor public MediaMetadataCompat.Builder();
-    ctor public MediaMetadataCompat.Builder(android.support.v4.media.MediaMetadataCompat);
-    method public android.support.v4.media.MediaMetadataCompat build();
-    method public android.support.v4.media.MediaMetadataCompat.Builder putBitmap(java.lang.String, android.graphics.Bitmap);
-    method public android.support.v4.media.MediaMetadataCompat.Builder putLong(java.lang.String, long);
-    method public android.support.v4.media.MediaMetadataCompat.Builder putRating(java.lang.String, android.support.v4.media.RatingCompat);
-    method public android.support.v4.media.MediaMetadataCompat.Builder putString(java.lang.String, java.lang.String);
-    method public android.support.v4.media.MediaMetadataCompat.Builder putText(java.lang.String, java.lang.CharSequence);
-  }
-
-  public final class RatingCompat implements android.os.Parcelable {
-    method public int describeContents();
-    method public static android.support.v4.media.RatingCompat fromRating(java.lang.Object);
-    method public float getPercentRating();
-    method public java.lang.Object getRating();
-    method public int getRatingStyle();
-    method public float getStarRating();
-    method public boolean hasHeart();
-    method public boolean isRated();
-    method public boolean isThumbUp();
-    method public static android.support.v4.media.RatingCompat newHeartRating(boolean);
-    method public static android.support.v4.media.RatingCompat newPercentageRating(float);
-    method public static android.support.v4.media.RatingCompat newStarRating(int, float);
-    method public static android.support.v4.media.RatingCompat newThumbRating(boolean);
-    method public static android.support.v4.media.RatingCompat newUnratedRating(int);
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.support.v4.media.RatingCompat> CREATOR;
-    field public static final int RATING_3_STARS = 3; // 0x3
-    field public static final int RATING_4_STARS = 4; // 0x4
-    field public static final int RATING_5_STARS = 5; // 0x5
-    field public static final int RATING_HEART = 1; // 0x1
-    field public static final int RATING_NONE = 0; // 0x0
-    field public static final int RATING_PERCENTAGE = 6; // 0x6
-    field public static final int RATING_THUMB_UP_DOWN = 2; // 0x2
-  }
-
-  public abstract class TransportController {
-    ctor public TransportController();
-    method public abstract int getBufferPercentage();
-    method public abstract long getCurrentPosition();
-    method public abstract long getDuration();
-    method public abstract int getTransportControlFlags();
-    method public abstract boolean isPlaying();
-    method public abstract void pausePlaying();
-    method public abstract void registerStateListener(android.support.v4.media.TransportStateListener);
-    method public abstract void seekTo(long);
-    method public abstract void startPlaying();
-    method public abstract void stopPlaying();
-    method public abstract void unregisterStateListener(android.support.v4.media.TransportStateListener);
-  }
-
-  public class TransportMediator extends android.support.v4.media.TransportController {
-    ctor public TransportMediator(android.app.Activity, android.support.v4.media.TransportPerformer);
-    ctor public TransportMediator(android.view.View, android.support.v4.media.TransportPerformer);
-    method public void destroy();
-    method public boolean dispatchKeyEvent(android.view.KeyEvent);
-    method public int getBufferPercentage();
-    method public long getCurrentPosition();
-    method public long getDuration();
-    method public java.lang.Object getRemoteControlClient();
-    method public int getTransportControlFlags();
-    method public boolean isPlaying();
-    method public void pausePlaying();
-    method public void refreshState();
-    method public void registerStateListener(android.support.v4.media.TransportStateListener);
-    method public void seekTo(long);
-    method public void startPlaying();
-    method public void stopPlaying();
-    method public void unregisterStateListener(android.support.v4.media.TransportStateListener);
-    field public static final int FLAG_KEY_MEDIA_FAST_FORWARD = 64; // 0x40
-    field public static final int FLAG_KEY_MEDIA_NEXT = 128; // 0x80
-    field public static final int FLAG_KEY_MEDIA_PAUSE = 16; // 0x10
-    field public static final int FLAG_KEY_MEDIA_PLAY = 4; // 0x4
-    field public static final int FLAG_KEY_MEDIA_PLAY_PAUSE = 8; // 0x8
-    field public static final int FLAG_KEY_MEDIA_PREVIOUS = 1; // 0x1
-    field public static final int FLAG_KEY_MEDIA_REWIND = 2; // 0x2
-    field public static final int FLAG_KEY_MEDIA_STOP = 32; // 0x20
-    field public static final int KEYCODE_MEDIA_PAUSE = 127; // 0x7f
-    field public static final int KEYCODE_MEDIA_PLAY = 126; // 0x7e
-    field public static final int KEYCODE_MEDIA_RECORD = 130; // 0x82
-  }
-
-  public abstract class TransportPerformer {
-    ctor public TransportPerformer();
-    method public void onAudioFocusChange(int);
-    method public int onGetBufferPercentage();
-    method public abstract long onGetCurrentPosition();
-    method public abstract long onGetDuration();
-    method public int onGetTransportControlFlags();
-    method public abstract boolean onIsPlaying();
-    method public boolean onMediaButtonDown(int, android.view.KeyEvent);
-    method public boolean onMediaButtonUp(int, android.view.KeyEvent);
-    method public abstract void onPause();
-    method public abstract void onSeekTo(long);
-    method public abstract void onStart();
-    method public abstract void onStop();
-  }
-
-  public class TransportStateListener {
-    ctor public TransportStateListener();
-    method public void onPlayingChanged(android.support.v4.media.TransportController);
-    method public void onTransportControlsChanged(android.support.v4.media.TransportController);
-  }
-
-  public abstract class VolumeProviderCompat {
-    ctor public VolumeProviderCompat(int, int, int);
-    method public final int getCurrentVolume();
-    method public final int getMaxVolume();
-    method public final int getVolumeControl();
-    method public java.lang.Object getVolumeProvider();
-    method public void onAdjustVolume(int);
-    method public void onSetVolumeTo(int);
-    method public void setCallback(android.support.v4.media.VolumeProviderCompat.Callback);
-    method public final void setCurrentVolume(int);
-    field public static final int VOLUME_CONTROL_ABSOLUTE = 2; // 0x2
-    field public static final int VOLUME_CONTROL_FIXED = 0; // 0x0
-    field public static final int VOLUME_CONTROL_RELATIVE = 1; // 0x1
-  }
-
-  public static abstract class VolumeProviderCompat.Callback {
-    ctor public VolumeProviderCompat.Callback();
-    method public abstract void onVolumeChanged(android.support.v4.media.VolumeProviderCompat);
-  }
-
-}
-
-package android.support.v4.media.session {
-
-  public final class MediaControllerCompat {
-    ctor public MediaControllerCompat(android.content.Context, android.support.v4.media.session.MediaSessionCompat);
-    ctor public MediaControllerCompat(android.content.Context, android.support.v4.media.session.MediaSessionCompat.Token) throws android.os.RemoteException;
-    method public void adjustVolume(int, int);
-    method public boolean dispatchMediaButtonEvent(android.view.KeyEvent);
-    method public android.os.Bundle getExtras();
-    method public long getFlags();
-    method public java.lang.Object getMediaController();
-    method public android.support.v4.media.MediaMetadataCompat getMetadata();
-    method public java.lang.String getPackageName();
-    method public android.support.v4.media.session.MediaControllerCompat.PlaybackInfo getPlaybackInfo();
-    method public android.support.v4.media.session.PlaybackStateCompat getPlaybackState();
-    method public java.util.List<android.support.v4.media.session.MediaSessionCompat.QueueItem> getQueue();
-    method public java.lang.CharSequence getQueueTitle();
-    method public int getRatingType();
-    method public android.app.PendingIntent getSessionActivity();
-    method public android.support.v4.media.session.MediaSessionCompat.Token getSessionToken();
-    method public android.support.v4.media.session.MediaControllerCompat.TransportControls getTransportControls();
-    method public void registerCallback(android.support.v4.media.session.MediaControllerCompat.Callback);
-    method public void registerCallback(android.support.v4.media.session.MediaControllerCompat.Callback, android.os.Handler);
-    method public void sendCommand(java.lang.String, android.os.Bundle, android.os.ResultReceiver);
-    method public void setVolumeTo(int, int);
-    method public void unregisterCallback(android.support.v4.media.session.MediaControllerCompat.Callback);
-  }
-
-  public static abstract class MediaControllerCompat.Callback implements android.os.IBinder.DeathRecipient {
-    ctor public MediaControllerCompat.Callback();
-    method public void binderDied();
-    method public void onAudioInfoChanged(android.support.v4.media.session.MediaControllerCompat.PlaybackInfo);
-    method public void onExtrasChanged(android.os.Bundle);
-    method public void onMetadataChanged(android.support.v4.media.MediaMetadataCompat);
-    method public void onPlaybackStateChanged(android.support.v4.media.session.PlaybackStateCompat);
-    method public void onQueueChanged(java.util.List<android.support.v4.media.session.MediaSessionCompat.QueueItem>);
-    method public void onQueueTitleChanged(java.lang.CharSequence);
-    method public void onSessionDestroyed();
-    method public void onSessionEvent(java.lang.String, android.os.Bundle);
-  }
-
-  public static final class MediaControllerCompat.PlaybackInfo {
-    method public int getAudioStream();
-    method public int getCurrentVolume();
-    method public int getMaxVolume();
-    method public int getPlaybackType();
-    method public int getVolumeControl();
-    field public static final int PLAYBACK_TYPE_LOCAL = 1; // 0x1
-    field public static final int PLAYBACK_TYPE_REMOTE = 2; // 0x2
-  }
-
-  public static abstract class MediaControllerCompat.TransportControls {
-    method public abstract void fastForward();
-    method public abstract void pause();
-    method public abstract void play();
-    method public abstract void playFromMediaId(java.lang.String, android.os.Bundle);
-    method public abstract void playFromSearch(java.lang.String, android.os.Bundle);
-    method public abstract void rewind();
-    method public abstract void seekTo(long);
-    method public abstract void sendCustomAction(android.support.v4.media.session.PlaybackStateCompat.CustomAction, android.os.Bundle);
-    method public abstract void sendCustomAction(java.lang.String, android.os.Bundle);
-    method public abstract void setRating(android.support.v4.media.RatingCompat);
-    method public abstract void skipToNext();
-    method public abstract void skipToPrevious();
-    method public abstract void skipToQueueItem(long);
-    method public abstract void stop();
-  }
-
-  public class MediaSessionCompat {
-    ctor public MediaSessionCompat(android.content.Context, java.lang.String, android.content.ComponentName, android.app.PendingIntent);
-    method public void addOnActiveChangeListener(android.support.v4.media.session.MediaSessionCompat.OnActiveChangeListener);
-    method public android.support.v4.media.session.MediaControllerCompat getController();
-    method public java.lang.Object getMediaSession();
-    method public java.lang.Object getRemoteControlClient();
-    method public android.support.v4.media.session.MediaSessionCompat.Token getSessionToken();
-    method public boolean isActive();
-    method public static android.support.v4.media.session.MediaSessionCompat obtain(android.content.Context, java.lang.Object);
-    method public void release();
-    method public void removeOnActiveChangeListener(android.support.v4.media.session.MediaSessionCompat.OnActiveChangeListener);
-    method public void sendSessionEvent(java.lang.String, android.os.Bundle);
-    method public void setActive(boolean);
-    method public void setCallback(android.support.v4.media.session.MediaSessionCompat.Callback);
-    method public void setCallback(android.support.v4.media.session.MediaSessionCompat.Callback, android.os.Handler);
-    method public void setExtras(android.os.Bundle);
-    method public void setFlags(int);
-    method public void setMediaButtonReceiver(android.app.PendingIntent);
-    method public void setMetadata(android.support.v4.media.MediaMetadataCompat);
-    method public void setPlaybackState(android.support.v4.media.session.PlaybackStateCompat);
-    method public void setPlaybackToLocal(int);
-    method public void setPlaybackToRemote(android.support.v4.media.VolumeProviderCompat);
-    method public void setQueue(java.util.List<android.support.v4.media.session.MediaSessionCompat.QueueItem>);
-    method public void setQueueTitle(java.lang.CharSequence);
-    method public void setRatingType(int);
-    method public void setSessionActivity(android.app.PendingIntent);
-    field public static final int FLAG_HANDLES_MEDIA_BUTTONS = 1; // 0x1
-    field public static final int FLAG_HANDLES_TRANSPORT_CONTROLS = 2; // 0x2
-  }
-
-  public static abstract class MediaSessionCompat.Callback {
-    ctor public MediaSessionCompat.Callback();
-    method public void onCommand(java.lang.String, android.os.Bundle, android.os.ResultReceiver);
-    method public void onCustomAction(java.lang.String, android.os.Bundle);
-    method public void onFastForward();
-    method public boolean onMediaButtonEvent(android.content.Intent);
-    method public void onPause();
-    method public void onPlay();
-    method public void onPlayFromMediaId(java.lang.String, android.os.Bundle);
-    method public void onPlayFromSearch(java.lang.String, android.os.Bundle);
-    method public void onRewind();
-    method public void onSeekTo(long);
-    method public void onSetRating(android.support.v4.media.RatingCompat);
-    method public void onSkipToNext();
-    method public void onSkipToPrevious();
-    method public void onSkipToQueueItem(long);
-    method public void onStop();
-  }
-
-  public static abstract interface MediaSessionCompat.OnActiveChangeListener {
-    method public abstract void onActiveChanged();
-  }
-
-  public static final class MediaSessionCompat.QueueItem implements android.os.Parcelable {
-    ctor public MediaSessionCompat.QueueItem(android.support.v4.media.MediaDescriptionCompat, long);
-    method public int describeContents();
-    method public android.support.v4.media.MediaDescriptionCompat getDescription();
-    method public long getQueueId();
-    method public java.lang.Object getQueueItem();
-    method public static android.support.v4.media.session.MediaSessionCompat.QueueItem obtain(java.lang.Object);
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.support.v4.media.session.MediaSessionCompat.QueueItem> CREATOR;
-    field public static final int UNKNOWN_ID = -1; // 0xffffffff
-  }
-
-  public static final class MediaSessionCompat.Token implements android.os.Parcelable {
-    method public int describeContents();
-    method public static android.support.v4.media.session.MediaSessionCompat.Token fromToken(java.lang.Object);
-    method public java.lang.Object getToken();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.support.v4.media.session.MediaSessionCompat.Token> CREATOR;
-  }
-
-  public class ParcelableVolumeInfo implements android.os.Parcelable {
-    ctor public ParcelableVolumeInfo(int, int, int, int, int);
-    ctor public ParcelableVolumeInfo(android.os.Parcel);
-    method public int describeContents();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.support.v4.media.session.ParcelableVolumeInfo> CREATOR;
-    field public int audioStream;
-    field public int controlType;
-    field public int currentVolume;
-    field public int maxVolume;
-    field public int volumeType;
-  }
-
-  public final class PlaybackStateCompat implements android.os.Parcelable {
-    method public int describeContents();
-    method public static android.support.v4.media.session.PlaybackStateCompat fromPlaybackState(java.lang.Object);
-    method public long getActions();
-    method public long getBufferedPosition();
-    method public java.lang.CharSequence getErrorMessage();
-    method public long getLastPositionUpdateTime();
-    method public float getPlaybackSpeed();
-    method public java.lang.Object getPlaybackState();
-    method public long getPosition();
-    method public int getState();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final long ACTION_FAST_FORWARD = 64L; // 0x40L
-    field public static final long ACTION_PAUSE = 2L; // 0x2L
-    field public static final long ACTION_PLAY = 4L; // 0x4L
-    field public static final long ACTION_PLAY_FROM_MEDIA_ID = 1024L; // 0x400L
-    field public static final long ACTION_PLAY_FROM_SEARCH = 2048L; // 0x800L
-    field public static final long ACTION_PLAY_PAUSE = 512L; // 0x200L
-    field public static final long ACTION_REWIND = 8L; // 0x8L
-    field public static final long ACTION_SEEK_TO = 256L; // 0x100L
-    field public static final long ACTION_SET_RATING = 128L; // 0x80L
-    field public static final long ACTION_SKIP_TO_NEXT = 32L; // 0x20L
-    field public static final long ACTION_SKIP_TO_PREVIOUS = 16L; // 0x10L
-    field public static final long ACTION_SKIP_TO_QUEUE_ITEM = 4096L; // 0x1000L
-    field public static final long ACTION_STOP = 1L; // 0x1L
-    field public static final android.os.Parcelable.Creator<android.support.v4.media.session.PlaybackStateCompat> CREATOR;
-    field public static final long PLAYBACK_POSITION_UNKNOWN = -1L; // 0xffffffffffffffffL
-    field public static final int STATE_BUFFERING = 6; // 0x6
-    field public static final int STATE_ERROR = 7; // 0x7
-    field public static final int STATE_FAST_FORWARDING = 4; // 0x4
-    field public static final int STATE_NONE = 0; // 0x0
-    field public static final int STATE_PAUSED = 2; // 0x2
-    field public static final int STATE_PLAYING = 3; // 0x3
-    field public static final int STATE_REWINDING = 5; // 0x5
-    field public static final int STATE_SKIPPING_TO_NEXT = 10; // 0xa
-    field public static final int STATE_SKIPPING_TO_PREVIOUS = 9; // 0x9
-    field public static final int STATE_STOPPED = 1; // 0x1
-  }
-
-  public static final class PlaybackStateCompat.Builder {
-    ctor public PlaybackStateCompat.Builder();
-    ctor public PlaybackStateCompat.Builder(android.support.v4.media.session.PlaybackStateCompat);
-    method public android.support.v4.media.session.PlaybackStateCompat build();
-    method public android.support.v4.media.session.PlaybackStateCompat.Builder setActions(long);
-    method public android.support.v4.media.session.PlaybackStateCompat.Builder setBufferedPosition(long);
-    method public android.support.v4.media.session.PlaybackStateCompat.Builder setErrorMessage(java.lang.CharSequence);
-    method public android.support.v4.media.session.PlaybackStateCompat.Builder setState(int, long, float);
-    method public android.support.v4.media.session.PlaybackStateCompat.Builder setState(int, long, float, long);
-  }
-
-  public static final class PlaybackStateCompat.CustomAction implements android.os.Parcelable {
-    method public int describeContents();
-    method public java.lang.String getAction();
-    method public android.os.Bundle getExtras();
-    method public int getIcon();
-    method public java.lang.CharSequence getName();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.support.v4.media.session.PlaybackStateCompat.CustomAction> CREATOR;
-  }
-
-  public static final class PlaybackStateCompat.CustomAction.Builder {
-    ctor public PlaybackStateCompat.CustomAction.Builder(java.lang.String, java.lang.CharSequence, int);
-    method public android.support.v4.media.session.PlaybackStateCompat.CustomAction build();
-    method public android.support.v4.media.session.PlaybackStateCompat.CustomAction.Builder setExtras(android.os.Bundle);
-  }
-
-}
-
-package android.support.v4.net {
-
-  public class ConnectivityManagerCompat {
-    ctor public ConnectivityManagerCompat();
-    method public static android.net.NetworkInfo getNetworkInfoFromBroadcast(android.net.ConnectivityManager, android.content.Intent);
-    method public static boolean isActiveNetworkMetered(android.net.ConnectivityManager);
-  }
-
-  public class TrafficStatsCompat {
-    ctor public TrafficStatsCompat();
-    method public static void clearThreadStatsTag();
-    method public static int getThreadStatsTag();
-    method public static void incrementOperationCount(int);
-    method public static void incrementOperationCount(int, int);
-    method public static void setThreadStatsTag(int);
-    method public static void tagSocket(java.net.Socket) throws java.net.SocketException;
-    method public static void untagSocket(java.net.Socket) throws java.net.SocketException;
-  }
-
-}
-
-package android.support.v4.os {
-
-  public class AsyncTaskCompat {
-    ctor public AsyncTaskCompat();
-    method public static android.os.AsyncTask<Params, Progress, Result> executeParallel(android.os.AsyncTask<Params, Progress, Result>, Params...);
-  }
-
-  public class EnvironmentCompat {
-    ctor public EnvironmentCompat();
-    method public static java.lang.String getStorageState(java.io.File);
-    field public static final java.lang.String MEDIA_UNKNOWN = "unknown";
-  }
-
-  public class ParcelableCompat {
-    ctor public ParcelableCompat();
-    method public static android.os.Parcelable.Creator<T> newCreator(android.support.v4.os.ParcelableCompatCreatorCallbacks<T>);
-  }
-
-  public abstract interface ParcelableCompatCreatorCallbacks {
-    method public abstract T createFromParcel(android.os.Parcel, java.lang.ClassLoader);
-    method public abstract T[] newArray(int);
-  }
-
-  public class TraceCompat {
-    ctor public TraceCompat();
-    method public static void beginSection(java.lang.String);
-    method public static void endSection();
-  }
-
-}
-
-package android.support.v4.print {
-
-  public final class PrintHelper {
-    ctor public PrintHelper(android.content.Context);
-    method public int getColorMode();
-    method public int getOrientation();
-    method public int getScaleMode();
-    method public void printBitmap(java.lang.String, android.graphics.Bitmap);
-    method public void printBitmap(java.lang.String, android.graphics.Bitmap, android.support.v4.print.PrintHelper.OnPrintFinishCallback);
-    method public void printBitmap(java.lang.String, android.net.Uri) throws java.io.FileNotFoundException;
-    method public void printBitmap(java.lang.String, android.net.Uri, android.support.v4.print.PrintHelper.OnPrintFinishCallback) throws java.io.FileNotFoundException;
-    method public void setColorMode(int);
-    method public void setOrientation(int);
-    method public void setScaleMode(int);
-    method public static boolean systemSupportsPrint();
-    field public static final int COLOR_MODE_COLOR = 2; // 0x2
-    field public static final int COLOR_MODE_MONOCHROME = 1; // 0x1
-    field public static final int ORIENTATION_LANDSCAPE = 1; // 0x1
-    field public static final int ORIENTATION_PORTRAIT = 2; // 0x2
-    field public static final int SCALE_MODE_FILL = 2; // 0x2
-    field public static final int SCALE_MODE_FIT = 1; // 0x1
-  }
-
-  public static abstract interface PrintHelper.OnPrintFinishCallback {
-    method public abstract void onFinish();
-  }
-
-}
-
-package android.support.v4.provider {
-
-  public abstract class DocumentFile {
-    method public abstract boolean canRead();
-    method public abstract boolean canWrite();
-    method public abstract android.support.v4.provider.DocumentFile createDirectory(java.lang.String);
-    method public abstract android.support.v4.provider.DocumentFile createFile(java.lang.String, java.lang.String);
-    method public abstract boolean delete();
-    method public abstract boolean exists();
-    method public android.support.v4.provider.DocumentFile findFile(java.lang.String);
-    method public static android.support.v4.provider.DocumentFile fromFile(java.io.File);
-    method public static android.support.v4.provider.DocumentFile fromSingleUri(android.content.Context, android.net.Uri);
-    method public static android.support.v4.provider.DocumentFile fromTreeUri(android.content.Context, android.net.Uri);
-    method public abstract java.lang.String getName();
-    method public android.support.v4.provider.DocumentFile getParentFile();
-    method public abstract java.lang.String getType();
-    method public abstract android.net.Uri getUri();
-    method public abstract boolean isDirectory();
-    method public static boolean isDocumentUri(android.content.Context, android.net.Uri);
-    method public abstract boolean isFile();
-    method public abstract long lastModified();
-    method public abstract long length();
-    method public abstract android.support.v4.provider.DocumentFile[] listFiles();
-    method public abstract boolean renameTo(java.lang.String);
-  }
-
-}
-
-package android.support.v4.text {
-
-  public final class BidiFormatter {
-    method public static android.support.v4.text.BidiFormatter getInstance();
-    method public static android.support.v4.text.BidiFormatter getInstance(boolean);
-    method public static android.support.v4.text.BidiFormatter getInstance(java.util.Locale);
-    method public boolean getStereoReset();
-    method public boolean isRtl(java.lang.String);
-    method public boolean isRtlContext();
-    method public java.lang.String unicodeWrap(java.lang.String, android.support.v4.text.TextDirectionHeuristicCompat, boolean);
-    method public java.lang.String unicodeWrap(java.lang.String, android.support.v4.text.TextDirectionHeuristicCompat);
-    method public java.lang.String unicodeWrap(java.lang.String, boolean);
-    method public java.lang.String unicodeWrap(java.lang.String);
-  }
-
-  public static final class BidiFormatter.Builder {
-    ctor public BidiFormatter.Builder();
-    ctor public BidiFormatter.Builder(boolean);
-    ctor public BidiFormatter.Builder(java.util.Locale);
-    method public android.support.v4.text.BidiFormatter build();
-    method public android.support.v4.text.BidiFormatter.Builder setTextDirectionHeuristic(android.support.v4.text.TextDirectionHeuristicCompat);
-    method public android.support.v4.text.BidiFormatter.Builder stereoReset(boolean);
-  }
-
-  public class ICUCompat {
-    ctor public ICUCompat();
-    method public static java.lang.String addLikelySubtags(java.lang.String);
-    method public static java.lang.String getScript(java.lang.String);
-  }
-
-  public abstract interface TextDirectionHeuristicCompat {
-    method public abstract boolean isRtl(char[], int, int);
-    method public abstract boolean isRtl(java.lang.CharSequence, int, int);
-  }
-
-  public class TextDirectionHeuristicsCompat {
-    ctor public TextDirectionHeuristicsCompat();
-    field public static final android.support.v4.text.TextDirectionHeuristicCompat ANYRTL_LTR;
-    field public static final android.support.v4.text.TextDirectionHeuristicCompat FIRSTSTRONG_LTR;
-    field public static final android.support.v4.text.TextDirectionHeuristicCompat FIRSTSTRONG_RTL;
-    field public static final android.support.v4.text.TextDirectionHeuristicCompat LOCALE;
-    field public static final android.support.v4.text.TextDirectionHeuristicCompat LTR;
-    field public static final android.support.v4.text.TextDirectionHeuristicCompat RTL;
-  }
-
-  public class TextUtilsCompat {
-    ctor public TextUtilsCompat();
-    method public static int getLayoutDirectionFromLocale(java.util.Locale);
-    method public static java.lang.String htmlEncode(java.lang.String);
-    field public static final java.util.Locale ROOT;
-  }
-
-}
-
-package android.support.v4.util {
-
-  public class ArrayMap extends android.support.v4.util.SimpleArrayMap implements java.util.Map {
-    ctor public ArrayMap();
-    ctor public ArrayMap(int);
-    ctor public ArrayMap(android.support.v4.util.SimpleArrayMap);
-    method public boolean containsAll(java.util.Collection<?>);
-    method public java.util.Set<java.util.Map.Entry<K, V>> entrySet();
-    method public java.util.Set<K> keySet();
-    method public void putAll(java.util.Map<? extends K, ? extends V>);
-    method public boolean removeAll(java.util.Collection<?>);
-    method public boolean retainAll(java.util.Collection<?>);
-    method public java.util.Collection<V> values();
-  }
-
-  public class AtomicFile {
-    ctor public AtomicFile(java.io.File);
-    method public void delete();
-    method public void failWrite(java.io.FileOutputStream);
-    method public void finishWrite(java.io.FileOutputStream);
-    method public java.io.File getBaseFile();
-    method public java.io.FileInputStream openRead() throws java.io.FileNotFoundException;
-    method public byte[] readFully() throws java.io.IOException;
-    method public java.io.FileOutputStream startWrite() throws java.io.IOException;
-  }
-
-  public final class CircularArray {
-    ctor public CircularArray();
-    ctor public CircularArray(int);
-    method public void addFirst(E);
-    method public void addLast(E);
-    method public void clear();
-    method public E get(int);
-    method public E getFirst();
-    method public E getLast();
-    method public boolean isEmpty();
-    method public E popFirst();
-    method public E popLast();
-    method public void removeFromEnd(int);
-    method public void removeFromStart(int);
-    method public int size();
-  }
-
-  public final class CircularIntArray {
-    ctor public CircularIntArray();
-    ctor public CircularIntArray(int);
-    method public void addFirst(int);
-    method public void addLast(int);
-    method public void clear();
-    method public int get(int);
-    method public int getFirst();
-    method public int getLast();
-    method public boolean isEmpty();
-    method public int popFirst();
-    method public int popLast();
-    method public void removeFromEnd(int);
-    method public void removeFromStart(int);
-    method public int size();
-  }
-
-  public class LongSparseArray {
-    ctor public LongSparseArray();
-    ctor public LongSparseArray(int);
-    method public void append(long, E);
-    method public void clear();
-    method public android.support.v4.util.LongSparseArray<E> clone();
-    method public void delete(long);
-    method public E get(long);
-    method public E get(long, E);
-    method public int indexOfKey(long);
-    method public int indexOfValue(E);
-    method public long keyAt(int);
-    method public void put(long, E);
-    method public void remove(long);
-    method public void removeAt(int);
-    method public void setValueAt(int, E);
-    method public int size();
-    method public E valueAt(int);
-  }
-
-  public class LruCache {
-    ctor public LruCache(int);
-    method protected V create(K);
-    method public final synchronized int createCount();
-    method protected void entryRemoved(boolean, K, V, V);
-    method public final void evictAll();
-    method public final synchronized int evictionCount();
-    method public final V get(K);
-    method public final synchronized int hitCount();
-    method public final synchronized int maxSize();
-    method public final synchronized int missCount();
-    method public final V put(K, V);
-    method public final synchronized int putCount();
-    method public final V remove(K);
-    method public void resize(int);
-    method public final synchronized int size();
-    method protected int sizeOf(K, V);
-    method public final synchronized java.util.Map<K, V> snapshot();
-    method public final synchronized java.lang.String toString();
-    method public void trimToSize(int);
-  }
-
-  public class Pair {
-    ctor public Pair(F, S);
-    method public static android.support.v4.util.Pair<A, B> create(A, B);
-    field public final F first;
-    field public final S second;
-  }
-
-  public final class Pools {
-  }
-
-  public static abstract interface Pools.Pool {
-    method public abstract T acquire();
-    method public abstract boolean release(T);
-  }
-
-  public static class Pools.SimplePool implements android.support.v4.util.Pools.Pool {
-    ctor public Pools.SimplePool(int);
-    method public T acquire();
-    method public boolean release(T);
-  }
-
-  public static class Pools.SynchronizedPool extends android.support.v4.util.Pools.SimplePool {
-    ctor public Pools.SynchronizedPool(int);
-  }
-
-  public class SimpleArrayMap {
-    ctor public SimpleArrayMap();
-    ctor public SimpleArrayMap(int);
-    ctor public SimpleArrayMap(android.support.v4.util.SimpleArrayMap);
-    method public void clear();
-    method public boolean containsKey(java.lang.Object);
-    method public boolean containsValue(java.lang.Object);
-    method public void ensureCapacity(int);
-    method public V get(java.lang.Object);
-    method public int indexOfKey(java.lang.Object);
-    method public boolean isEmpty();
-    method public K keyAt(int);
-    method public V put(K, V);
-    method public void putAll(android.support.v4.util.SimpleArrayMap<? extends K, ? extends V>);
-    method public V remove(java.lang.Object);
-    method public V removeAt(int);
-    method public V setValueAt(int, V);
-    method public int size();
-    method public V valueAt(int);
-  }
-
-  public class SparseArrayCompat {
-    ctor public SparseArrayCompat();
-    ctor public SparseArrayCompat(int);
-    method public void append(int, E);
-    method public void clear();
-    method public android.support.v4.util.SparseArrayCompat<E> clone();
-    method public void delete(int);
-    method public E get(int);
-    method public E get(int, E);
-    method public int indexOfKey(int);
-    method public int indexOfValue(E);
-    method public int keyAt(int);
-    method public void put(int, E);
-    method public void remove(int);
-    method public void removeAt(int);
-    method public void removeAtRange(int, int);
-    method public void setValueAt(int, E);
-    method public int size();
-    method public E valueAt(int);
-  }
-
-}
-
-package android.support.v4.view {
-
-  public class AccessibilityDelegateCompat {
-    ctor public AccessibilityDelegateCompat();
-    method public boolean dispatchPopulateAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
-    method public android.support.v4.view.accessibility.AccessibilityNodeProviderCompat getAccessibilityNodeProvider(android.view.View);
-    method public void onInitializeAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
-    method public void onInitializeAccessibilityNodeInfo(android.view.View, android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
-    method public void onPopulateAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
-    method public boolean onRequestSendAccessibilityEvent(android.view.ViewGroup, android.view.View, android.view.accessibility.AccessibilityEvent);
-    method public boolean performAccessibilityAction(android.view.View, int, android.os.Bundle);
-    method public void sendAccessibilityEvent(android.view.View, int);
-    method public void sendAccessibilityEventUnchecked(android.view.View, android.view.accessibility.AccessibilityEvent);
-  }
-
-  public abstract class ActionProvider {
-    ctor public ActionProvider(android.content.Context);
-    method public android.content.Context getContext();
-    method public boolean hasSubMenu();
-    method public boolean isVisible();
-    method public abstract android.view.View onCreateActionView();
-    method public android.view.View onCreateActionView(android.view.MenuItem);
-    method public boolean onPerformDefaultAction();
-    method public void onPrepareSubMenu(android.view.SubMenu);
-    method public boolean overridesItemVisibility();
-    method public void refreshVisibility();
-    method public void setVisibilityListener(android.support.v4.view.ActionProvider.VisibilityListener);
-  }
-
-  public static abstract interface ActionProvider.VisibilityListener {
-    method public abstract void onActionProviderVisibilityChanged(boolean);
-  }
-
-  public class GestureDetectorCompat {
-    ctor public GestureDetectorCompat(android.content.Context, android.view.GestureDetector.OnGestureListener);
-    ctor public GestureDetectorCompat(android.content.Context, android.view.GestureDetector.OnGestureListener, android.os.Handler);
-    method public boolean isLongpressEnabled();
-    method public boolean onTouchEvent(android.view.MotionEvent);
-    method public void setIsLongpressEnabled(boolean);
-    method public void setOnDoubleTapListener(android.view.GestureDetector.OnDoubleTapListener);
-  }
-
-  public class GravityCompat {
-    ctor public GravityCompat();
-    method public static void apply(int, int, int, android.graphics.Rect, android.graphics.Rect, int);
-    method public static void apply(int, int, int, android.graphics.Rect, int, int, android.graphics.Rect, int);
-    method public static void applyDisplay(int, android.graphics.Rect, android.graphics.Rect, int);
-    method public static int getAbsoluteGravity(int, int);
-    field public static final int END = 8388613; // 0x800005
-    field public static final int RELATIVE_HORIZONTAL_GRAVITY_MASK = 8388615; // 0x800007
-    field public static final int RELATIVE_LAYOUT_DIRECTION = 8388608; // 0x800000
-    field public static final int START = 8388611; // 0x800003
-  }
-
-  public class InputDeviceCompat {
-    ctor public InputDeviceCompat();
-    field public static final int SOURCE_ANY = -256; // 0xffffff00
-    field public static final int SOURCE_CLASS_BUTTON = 1; // 0x1
-    field public static final int SOURCE_CLASS_JOYSTICK = 16; // 0x10
-    field public static final int SOURCE_CLASS_MASK = 255; // 0xff
-    field public static final int SOURCE_CLASS_NONE = 0; // 0x0
-    field public static final int SOURCE_CLASS_POINTER = 2; // 0x2
-    field public static final int SOURCE_CLASS_POSITION = 8; // 0x8
-    field public static final int SOURCE_CLASS_TRACKBALL = 4; // 0x4
-    field public static final int SOURCE_DPAD = 513; // 0x201
-    field public static final int SOURCE_GAMEPAD = 1025; // 0x401
-    field public static final int SOURCE_HDMI = 33554433; // 0x2000001
-    field public static final int SOURCE_JOYSTICK = 16777232; // 0x1000010
-    field public static final int SOURCE_KEYBOARD = 257; // 0x101
-    field public static final int SOURCE_MOUSE = 8194; // 0x2002
-    field public static final int SOURCE_STYLUS = 16386; // 0x4002
-    field public static final int SOURCE_TOUCHPAD = 1048584; // 0x100008
-    field public static final int SOURCE_TOUCHSCREEN = 4098; // 0x1002
-    field public static final int SOURCE_TOUCH_NAVIGATION = 2097152; // 0x200000
-    field public static final int SOURCE_TRACKBALL = 65540; // 0x10004
-    field public static final int SOURCE_UNKNOWN = 0; // 0x0
-  }
-
-  public class KeyEventCompat {
-    ctor public KeyEventCompat();
-    method public static boolean dispatch(android.view.KeyEvent, android.view.KeyEvent.Callback, java.lang.Object, java.lang.Object);
-    method public static java.lang.Object getKeyDispatcherState(android.view.View);
-    method public static boolean hasModifiers(android.view.KeyEvent, int);
-    method public static boolean hasNoModifiers(android.view.KeyEvent);
-    method public static boolean isTracking(android.view.KeyEvent);
-    method public static boolean metaStateHasModifiers(int, int);
-    method public static boolean metaStateHasNoModifiers(int);
-    method public static int normalizeMetaState(int);
-    method public static void startTracking(android.view.KeyEvent);
-  }
-
-  public class LayoutInflaterCompat {
-    method public static void setFactory(android.view.LayoutInflater, android.support.v4.view.LayoutInflaterFactory);
-  }
-
-  public abstract interface LayoutInflaterFactory {
-    method public abstract android.view.View onCreateView(android.view.View, java.lang.String, android.content.Context, android.util.AttributeSet);
-  }
-
-  public class MarginLayoutParamsCompat {
-    ctor public MarginLayoutParamsCompat();
-    method public static int getLayoutDirection(android.view.ViewGroup.MarginLayoutParams);
-    method public static int getMarginEnd(android.view.ViewGroup.MarginLayoutParams);
-    method public static int getMarginStart(android.view.ViewGroup.MarginLayoutParams);
-    method public static boolean isMarginRelative(android.view.ViewGroup.MarginLayoutParams);
-    method public static void resolveLayoutDirection(android.view.ViewGroup.MarginLayoutParams, int);
-    method public static void setLayoutDirection(android.view.ViewGroup.MarginLayoutParams, int);
-    method public static void setMarginEnd(android.view.ViewGroup.MarginLayoutParams, int);
-    method public static void setMarginStart(android.view.ViewGroup.MarginLayoutParams, int);
-  }
-
-  public class MenuCompat {
-    ctor public MenuCompat();
-    method public static deprecated void setShowAsAction(android.view.MenuItem, int);
-  }
-
-  public class MenuItemCompat {
-    ctor public MenuItemCompat();
-    method public static boolean collapseActionView(android.view.MenuItem);
-    method public static boolean expandActionView(android.view.MenuItem);
-    method public static android.support.v4.view.ActionProvider getActionProvider(android.view.MenuItem);
-    method public static android.view.View getActionView(android.view.MenuItem);
-    method public static boolean isActionViewExpanded(android.view.MenuItem);
-    method public static android.view.MenuItem setActionProvider(android.view.MenuItem, android.support.v4.view.ActionProvider);
-    method public static android.view.MenuItem setActionView(android.view.MenuItem, android.view.View);
-    method public static android.view.MenuItem setActionView(android.view.MenuItem, int);
-    method public static android.view.MenuItem setOnActionExpandListener(android.view.MenuItem, android.support.v4.view.MenuItemCompat.OnActionExpandListener);
-    method public static void setShowAsAction(android.view.MenuItem, int);
-    field public static final int SHOW_AS_ACTION_ALWAYS = 2; // 0x2
-    field public static final int SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW = 8; // 0x8
-    field public static final int SHOW_AS_ACTION_IF_ROOM = 1; // 0x1
-    field public static final int SHOW_AS_ACTION_NEVER = 0; // 0x0
-    field public static final int SHOW_AS_ACTION_WITH_TEXT = 4; // 0x4
-  }
-
-  public static abstract interface MenuItemCompat.OnActionExpandListener {
-    method public abstract boolean onMenuItemActionCollapse(android.view.MenuItem);
-    method public abstract boolean onMenuItemActionExpand(android.view.MenuItem);
-  }
-
-  public class MotionEventCompat {
-    ctor public MotionEventCompat();
-    method public static int findPointerIndex(android.view.MotionEvent, int);
-    method public static int getActionIndex(android.view.MotionEvent);
-    method public static int getActionMasked(android.view.MotionEvent);
-    method public static float getAxisValue(android.view.MotionEvent, int);
-    method public static float getAxisValue(android.view.MotionEvent, int, int);
-    method public static int getPointerCount(android.view.MotionEvent);
-    method public static int getPointerId(android.view.MotionEvent, int);
-    method public static int getSource(android.view.MotionEvent);
-    method public static float getX(android.view.MotionEvent, int);
-    method public static float getY(android.view.MotionEvent, int);
-    field public static final int ACTION_HOVER_ENTER = 9; // 0x9
-    field public static final int ACTION_HOVER_EXIT = 10; // 0xa
-    field public static final int ACTION_HOVER_MOVE = 7; // 0x7
-    field public static final int ACTION_MASK = 255; // 0xff
-    field public static final int ACTION_POINTER_DOWN = 5; // 0x5
-    field public static final int ACTION_POINTER_INDEX_MASK = 65280; // 0xff00
-    field public static final int ACTION_POINTER_INDEX_SHIFT = 8; // 0x8
-    field public static final int ACTION_POINTER_UP = 6; // 0x6
-    field public static final int ACTION_SCROLL = 8; // 0x8
-    field public static final int AXIS_BRAKE = 23; // 0x17
-    field public static final int AXIS_DISTANCE = 24; // 0x18
-    field public static final int AXIS_GAS = 22; // 0x16
-    field public static final int AXIS_GENERIC_1 = 32; // 0x20
-    field public static final int AXIS_GENERIC_10 = 41; // 0x29
-    field public static final int AXIS_GENERIC_11 = 42; // 0x2a
-    field public static final int AXIS_GENERIC_12 = 43; // 0x2b
-    field public static final int AXIS_GENERIC_13 = 44; // 0x2c
-    field public static final int AXIS_GENERIC_14 = 45; // 0x2d
-    field public static final int AXIS_GENERIC_15 = 46; // 0x2e
-    field public static final int AXIS_GENERIC_16 = 47; // 0x2f
-    field public static final int AXIS_GENERIC_2 = 33; // 0x21
-    field public static final int AXIS_GENERIC_3 = 34; // 0x22
-    field public static final int AXIS_GENERIC_4 = 35; // 0x23
-    field public static final int AXIS_GENERIC_5 = 36; // 0x24
-    field public static final int AXIS_GENERIC_6 = 37; // 0x25
-    field public static final int AXIS_GENERIC_7 = 38; // 0x26
-    field public static final int AXIS_GENERIC_8 = 39; // 0x27
-    field public static final int AXIS_GENERIC_9 = 40; // 0x28
-    field public static final int AXIS_HAT_X = 15; // 0xf
-    field public static final int AXIS_HAT_Y = 16; // 0x10
-    field public static final int AXIS_HSCROLL = 10; // 0xa
-    field public static final int AXIS_LTRIGGER = 17; // 0x11
-    field public static final int AXIS_ORIENTATION = 8; // 0x8
-    field public static final int AXIS_PRESSURE = 2; // 0x2
-    field public static final int AXIS_RTRIGGER = 18; // 0x12
-    field public static final int AXIS_RUDDER = 20; // 0x14
-    field public static final int AXIS_RX = 12; // 0xc
-    field public static final int AXIS_RY = 13; // 0xd
-    field public static final int AXIS_RZ = 14; // 0xe
-    field public static final int AXIS_SIZE = 3; // 0x3
-    field public static final int AXIS_THROTTLE = 19; // 0x13
-    field public static final int AXIS_TILT = 25; // 0x19
-    field public static final int AXIS_TOOL_MAJOR = 6; // 0x6
-    field public static final int AXIS_TOOL_MINOR = 7; // 0x7
-    field public static final int AXIS_TOUCH_MAJOR = 4; // 0x4
-    field public static final int AXIS_TOUCH_MINOR = 5; // 0x5
-    field public static final int AXIS_VSCROLL = 9; // 0x9
-    field public static final int AXIS_WHEEL = 21; // 0x15
-    field public static final int AXIS_X = 0; // 0x0
-    field public static final int AXIS_Y = 1; // 0x1
-    field public static final int AXIS_Z = 11; // 0xb
-  }
-
-  public abstract interface NestedScrollingChild {
-    method public abstract boolean dispatchNestedFling(float, float, boolean);
-    method public abstract boolean dispatchNestedPreFling(float, float);
-    method public abstract boolean dispatchNestedPreScroll(int, int, int[], int[]);
-    method public abstract boolean dispatchNestedScroll(int, int, int, int, int[]);
-    method public abstract boolean hasNestedScrollingParent();
-    method public abstract boolean isNestedScrollingEnabled();
-    method public abstract void setNestedScrollingEnabled(boolean);
-    method public abstract boolean startNestedScroll(int);
-    method public abstract void stopNestedScroll();
-  }
-
-  public class NestedScrollingChildHelper {
-    ctor public NestedScrollingChildHelper(android.view.View);
-    method public boolean dispatchNestedFling(float, float, boolean);
-    method public boolean dispatchNestedPreFling(float, float);
-    method public boolean dispatchNestedPreScroll(int, int, int[], int[]);
-    method public boolean dispatchNestedScroll(int, int, int, int, int[]);
-    method public boolean hasNestedScrollingParent();
-    method public boolean isNestedScrollingEnabled();
-    method public void onDetachedFromWindow();
-    method public void onStopNestedScroll(android.view.View);
-    method public void setNestedScrollingEnabled(boolean);
-    method public boolean startNestedScroll(int);
-    method public void stopNestedScroll();
-  }
-
-  public abstract interface NestedScrollingParent {
-    method public abstract int getNestedScrollAxes();
-    method public abstract boolean onNestedFling(android.view.View, float, float, boolean);
-    method public abstract boolean onNestedPreFling(android.view.View, float, float);
-    method public abstract void onNestedPreScroll(android.view.View, int, int, int[]);
-    method public abstract void onNestedScroll(android.view.View, int, int, int, int);
-    method public abstract void onNestedScrollAccepted(android.view.View, android.view.View, int);
-    method public abstract boolean onStartNestedScroll(android.view.View, android.view.View, int);
-    method public abstract void onStopNestedScroll(android.view.View);
-  }
-
-  public class NestedScrollingParentHelper {
-    ctor public NestedScrollingParentHelper(android.view.ViewGroup);
-    method public int getNestedScrollAxes();
-    method public void onNestedScrollAccepted(android.view.View, android.view.View, int);
-    method public void onStopNestedScroll(android.view.View);
-  }
-
-  public abstract interface OnApplyWindowInsetsListener {
-    method public abstract android.support.v4.view.WindowInsetsCompat onApplyWindowInsets(android.view.View, android.support.v4.view.WindowInsetsCompat);
-  }
-
-  public abstract class PagerAdapter {
-    ctor public PagerAdapter();
-    method public void destroyItem(android.view.ViewGroup, int, java.lang.Object);
-    method public deprecated void destroyItem(android.view.View, int, java.lang.Object);
-    method public void finishUpdate(android.view.ViewGroup);
-    method public deprecated void finishUpdate(android.view.View);
-    method public abstract int getCount();
-    method public int getItemPosition(java.lang.Object);
-    method public java.lang.CharSequence getPageTitle(int);
-    method public float getPageWidth(int);
-    method public java.lang.Object instantiateItem(android.view.ViewGroup, int);
-    method public deprecated java.lang.Object instantiateItem(android.view.View, int);
-    method public abstract boolean isViewFromObject(android.view.View, java.lang.Object);
-    method public void notifyDataSetChanged();
-    method public void registerDataSetObserver(android.database.DataSetObserver);
-    method public void restoreState(android.os.Parcelable, java.lang.ClassLoader);
-    method public android.os.Parcelable saveState();
-    method public void setPrimaryItem(android.view.ViewGroup, int, java.lang.Object);
-    method public deprecated void setPrimaryItem(android.view.View, int, java.lang.Object);
-    method public void startUpdate(android.view.ViewGroup);
-    method public deprecated void startUpdate(android.view.View);
-    method public void unregisterDataSetObserver(android.database.DataSetObserver);
-    field public static final int POSITION_NONE = -2; // 0xfffffffe
-    field public static final int POSITION_UNCHANGED = -1; // 0xffffffff
-  }
-
-  public class PagerTabStrip extends android.support.v4.view.PagerTitleStrip {
-    ctor public PagerTabStrip(android.content.Context);
-    ctor public PagerTabStrip(android.content.Context, android.util.AttributeSet);
-    method public boolean getDrawFullUnderline();
-    method public int getTabIndicatorColor();
-    method public void setDrawFullUnderline(boolean);
-    method public void setTabIndicatorColor(int);
-    method public void setTabIndicatorColorResource(int);
-  }
-
-  public class PagerTitleStrip extends android.view.ViewGroup {
-    ctor public PagerTitleStrip(android.content.Context);
-    ctor public PagerTitleStrip(android.content.Context, android.util.AttributeSet);
-    method public int getTextSpacing();
-    method protected void onLayout(boolean, int, int, int, int);
-    method public void setGravity(int);
-    method public void setNonPrimaryAlpha(float);
-    method public void setTextColor(int);
-    method public void setTextSize(int, float);
-    method public void setTextSpacing(int);
-  }
-
-  public class ScaleGestureDetectorCompat {
-    method public static boolean isQuickScaleEnabled(java.lang.Object);
-    method public static void setQuickScaleEnabled(java.lang.Object, boolean);
-  }
-
-  public abstract interface ScrollingView {
-    method public abstract int computeHorizontalScrollExtent();
-    method public abstract int computeHorizontalScrollOffset();
-    method public abstract int computeHorizontalScrollRange();
-    method public abstract int computeVerticalScrollExtent();
-    method public abstract int computeVerticalScrollOffset();
-    method public abstract int computeVerticalScrollRange();
-  }
-
-  public class VelocityTrackerCompat {
-    ctor public VelocityTrackerCompat();
-    method public static float getXVelocity(android.view.VelocityTracker, int);
-    method public static float getYVelocity(android.view.VelocityTracker, int);
-  }
-
-  public class ViewCompat {
-    ctor public ViewCompat();
-    method public static android.support.v4.view.ViewPropertyAnimatorCompat animate(android.view.View);
-    method public static boolean canScrollHorizontally(android.view.View, int);
-    method public static boolean canScrollVertically(android.view.View, int);
-    method public static int combineMeasuredStates(int, int);
-    method public static android.support.v4.view.WindowInsetsCompat dispatchApplyWindowInsets(android.view.View, android.support.v4.view.WindowInsetsCompat);
-    method public static void dispatchFinishTemporaryDetach(android.view.View);
-    method public static boolean dispatchNestedFling(android.view.View, float, float, boolean);
-    method public static boolean dispatchNestedPreFling(android.view.View, float, float);
-    method public static boolean dispatchNestedPreScroll(android.view.View, int, int, int[], int[]);
-    method public static boolean dispatchNestedScroll(android.view.View, int, int, int, int, int[]);
-    method public static void dispatchStartTemporaryDetach(android.view.View);
-    method public static int getAccessibilityLiveRegion(android.view.View);
-    method public static android.support.v4.view.accessibility.AccessibilityNodeProviderCompat getAccessibilityNodeProvider(android.view.View);
-    method public static float getAlpha(android.view.View);
-    method public static android.content.res.ColorStateList getBackgroundTintList(android.view.View);
-    method public static android.graphics.PorterDuff.Mode getBackgroundTintMode(android.view.View);
-    method public static float getElevation(android.view.View);
-    method public static boolean getFitsSystemWindows(android.view.View);
-    method public static int getImportantForAccessibility(android.view.View);
-    method public static int getLabelFor(android.view.View);
-    method public static int getLayerType(android.view.View);
-    method public static int getLayoutDirection(android.view.View);
-    method public static int getMeasuredHeightAndState(android.view.View);
-    method public static int getMeasuredState(android.view.View);
-    method public static int getMeasuredWidthAndState(android.view.View);
-    method public static int getMinimumHeight(android.view.View);
-    method public static int getMinimumWidth(android.view.View);
-    method public static int getOverScrollMode(android.view.View);
-    method public static int getPaddingEnd(android.view.View);
-    method public static int getPaddingStart(android.view.View);
-    method public static android.view.ViewParent getParentForAccessibility(android.view.View);
-    method public static float getPivotX(android.view.View);
-    method public static float getPivotY(android.view.View);
-    method public static float getRotation(android.view.View);
-    method public static float getRotationX(android.view.View);
-    method public static float getRotationY(android.view.View);
-    method public static float getScaleX(android.view.View);
-    method public static float getScaleY(android.view.View);
-    method public static java.lang.String getTransitionName(android.view.View);
-    method public static float getTranslationX(android.view.View);
-    method public static float getTranslationY(android.view.View);
-    method public static float getTranslationZ(android.view.View);
-    method public static int getWindowSystemUiVisibility(android.view.View);
-    method public static float getX(android.view.View);
-    method public static float getY(android.view.View);
-    method public static float getZ(android.view.View);
-    method public static boolean hasAccessibilityDelegate(android.view.View);
-    method public static boolean hasNestedScrollingParent(android.view.View);
-    method public static boolean hasTransientState(android.view.View);
-    method public static boolean isLaidOut(android.view.View);
-    method public static boolean isNestedScrollingEnabled(android.view.View);
-    method public static boolean isOpaque(android.view.View);
-    method public static boolean isPaddingRelative(android.view.View);
-    method public static void jumpDrawablesToCurrentState(android.view.View);
-    method public static android.support.v4.view.WindowInsetsCompat onApplyWindowInsets(android.view.View, android.support.v4.view.WindowInsetsCompat);
-    method public static void onInitializeAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
-    method public static void onInitializeAccessibilityNodeInfo(android.view.View, android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
-    method public static void onPopulateAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
-    method public static boolean performAccessibilityAction(android.view.View, int, android.os.Bundle);
-    method public static void postInvalidateOnAnimation(android.view.View);
-    method public static void postInvalidateOnAnimation(android.view.View, int, int, int, int);
-    method public static void postOnAnimation(android.view.View, java.lang.Runnable);
-    method public static void postOnAnimationDelayed(android.view.View, java.lang.Runnable, long);
-    method public static void requestApplyInsets(android.view.View);
-    method public static int resolveSizeAndState(int, int, int);
-    method public static void setAccessibilityDelegate(android.view.View, android.support.v4.view.AccessibilityDelegateCompat);
-    method public static void setAccessibilityLiveRegion(android.view.View, int);
-    method public static void setActivated(android.view.View, boolean);
-    method public static void setAlpha(android.view.View, float);
-    method public static void setBackgroundTintList(android.view.View, android.content.res.ColorStateList);
-    method public static void setBackgroundTintMode(android.view.View, android.graphics.PorterDuff.Mode);
-    method public static void setChildrenDrawingOrderEnabled(android.view.ViewGroup, boolean);
-    method public static void setElevation(android.view.View, float);
-    method public static void setFitsSystemWindows(android.view.View, boolean);
-    method public static void setHasTransientState(android.view.View, boolean);
-    method public static void setImportantForAccessibility(android.view.View, int);
-    method public static void setLabelFor(android.view.View, int);
-    method public static void setLayerPaint(android.view.View, android.graphics.Paint);
-    method public static void setLayerType(android.view.View, int, android.graphics.Paint);
-    method public static void setLayoutDirection(android.view.View, int);
-    method public static void setNestedScrollingEnabled(android.view.View, boolean);
-    method public static void setOnApplyWindowInsetsListener(android.view.View, android.support.v4.view.OnApplyWindowInsetsListener);
-    method public static void setOverScrollMode(android.view.View, int);
-    method public static void setPaddingRelative(android.view.View, int, int, int, int);
-    method public static void setPivotX(android.view.View, float);
-    method public static void setPivotY(android.view.View, float);
-    method public static void setRotation(android.view.View, float);
-    method public static void setRotationX(android.view.View, float);
-    method public static void setRotationY(android.view.View, float);
-    method public static void setSaveFromParentEnabled(android.view.View, boolean);
-    method public static void setScaleX(android.view.View, float);
-    method public static void setScaleY(android.view.View, float);
-    method public static void setTransitionName(android.view.View, java.lang.String);
-    method public static void setTranslationX(android.view.View, float);
-    method public static void setTranslationY(android.view.View, float);
-    method public static void setTranslationZ(android.view.View, float);
-    method public static void setX(android.view.View, float);
-    method public static void setY(android.view.View, float);
-    method public static boolean startNestedScroll(android.view.View, int);
-    method public static void stopNestedScroll(android.view.View);
-    field public static final int ACCESSIBILITY_LIVE_REGION_ASSERTIVE = 2; // 0x2
-    field public static final int ACCESSIBILITY_LIVE_REGION_NONE = 0; // 0x0
-    field public static final int ACCESSIBILITY_LIVE_REGION_POLITE = 1; // 0x1
-    field public static final int IMPORTANT_FOR_ACCESSIBILITY_AUTO = 0; // 0x0
-    field public static final int IMPORTANT_FOR_ACCESSIBILITY_NO = 2; // 0x2
-    field public static final int IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS = 4; // 0x4
-    field public static final int IMPORTANT_FOR_ACCESSIBILITY_YES = 1; // 0x1
-    field public static final int LAYER_TYPE_HARDWARE = 2; // 0x2
-    field public static final int LAYER_TYPE_NONE = 0; // 0x0
-    field public static final int LAYER_TYPE_SOFTWARE = 1; // 0x1
-    field public static final int LAYOUT_DIRECTION_INHERIT = 2; // 0x2
-    field public static final int LAYOUT_DIRECTION_LOCALE = 3; // 0x3
-    field public static final int LAYOUT_DIRECTION_LTR = 0; // 0x0
-    field public static final int LAYOUT_DIRECTION_RTL = 1; // 0x1
-    field public static final int MEASURED_HEIGHT_STATE_SHIFT = 16; // 0x10
-    field public static final int MEASURED_SIZE_MASK = 16777215; // 0xffffff
-    field public static final int MEASURED_STATE_MASK = -16777216; // 0xff000000
-    field public static final int MEASURED_STATE_TOO_SMALL = 16777216; // 0x1000000
-    field public static final int OVER_SCROLL_ALWAYS = 0; // 0x0
-    field public static final int OVER_SCROLL_IF_CONTENT_SCROLLS = 1; // 0x1
-    field public static final int OVER_SCROLL_NEVER = 2; // 0x2
-    field public static final int SCROLL_AXIS_HORIZONTAL = 1; // 0x1
-    field public static final int SCROLL_AXIS_NONE = 0; // 0x0
-    field public static final int SCROLL_AXIS_VERTICAL = 2; // 0x2
-  }
-
-  public class ViewConfigurationCompat {
-    ctor public ViewConfigurationCompat();
-    method public static int getScaledPagingTouchSlop(android.view.ViewConfiguration);
-    method public static boolean hasPermanentMenuKey(android.view.ViewConfiguration);
-  }
-
-  public class ViewGroupCompat {
-    method public static int getLayoutMode(android.view.ViewGroup);
-    method public static int getNestedScrollAxes(android.view.ViewGroup);
-    method public static boolean isTransitionGroup(android.view.ViewGroup);
-    method public static boolean onRequestSendAccessibilityEvent(android.view.ViewGroup, android.view.View, android.view.accessibility.AccessibilityEvent);
-    method public static void setLayoutMode(android.view.ViewGroup, int);
-    method public static void setMotionEventSplittingEnabled(android.view.ViewGroup, boolean);
-    method public static void setTransitionGroup(android.view.ViewGroup, boolean);
-    field public static final int LAYOUT_MODE_CLIP_BOUNDS = 0; // 0x0
-    field public static final int LAYOUT_MODE_OPTICAL_BOUNDS = 1; // 0x1
-  }
-
-  public class ViewPager extends android.view.ViewGroup {
-    ctor public ViewPager(android.content.Context);
-    ctor public ViewPager(android.content.Context, android.util.AttributeSet);
-    method public boolean arrowScroll(int);
-    method public boolean beginFakeDrag();
-    method protected boolean canScroll(android.view.View, boolean, int, int, int);
-    method public void endFakeDrag();
-    method public boolean executeKeyEvent(android.view.KeyEvent);
-    method public void fakeDragBy(float);
-    method public android.support.v4.view.PagerAdapter getAdapter();
-    method public int getCurrentItem();
-    method public int getOffscreenPageLimit();
-    method public int getPageMargin();
-    method public boolean isFakeDragging();
-    method protected void onLayout(boolean, int, int, int, int);
-    method protected void onPageScrolled(int, float, int);
-    method public void onRestoreInstanceState(android.os.Parcelable);
-    method public android.os.Parcelable onSaveInstanceState();
-    method public void setAdapter(android.support.v4.view.PagerAdapter);
-    method public void setCurrentItem(int);
-    method public void setCurrentItem(int, boolean);
-    method public void setOffscreenPageLimit(int);
-    method public void setOnPageChangeListener(android.support.v4.view.ViewPager.OnPageChangeListener);
-    method public void setPageMargin(int);
-    method public void setPageMarginDrawable(android.graphics.drawable.Drawable);
-    method public void setPageMarginDrawable(int);
-    method public void setPageTransformer(boolean, android.support.v4.view.ViewPager.PageTransformer);
-    field public static final int SCROLL_STATE_DRAGGING = 1; // 0x1
-    field public static final int SCROLL_STATE_IDLE = 0; // 0x0
-    field public static final int SCROLL_STATE_SETTLING = 2; // 0x2
-  }
-
-  public static class ViewPager.LayoutParams extends android.view.ViewGroup.LayoutParams {
-    ctor public ViewPager.LayoutParams();
-    ctor public ViewPager.LayoutParams(android.content.Context, android.util.AttributeSet);
-    field public int gravity;
-    field public boolean isDecor;
-  }
-
-  public static abstract interface ViewPager.OnPageChangeListener {
-    method public abstract void onPageScrollStateChanged(int);
-    method public abstract void onPageScrolled(int, float, int);
-    method public abstract void onPageSelected(int);
-  }
-
-  public static abstract interface ViewPager.PageTransformer {
-    method public abstract void transformPage(android.view.View, float);
-  }
-
-  public static class ViewPager.SavedState extends android.view.View.BaseSavedState {
-    ctor public ViewPager.SavedState(android.os.Parcelable);
-    field public static final android.os.Parcelable.Creator<android.support.v4.view.ViewPager.SavedState> CREATOR;
-  }
-
-  public static class ViewPager.SimpleOnPageChangeListener implements android.support.v4.view.ViewPager.OnPageChangeListener {
-    ctor public ViewPager.SimpleOnPageChangeListener();
-    method public void onPageScrollStateChanged(int);
-    method public void onPageScrolled(int, float, int);
-    method public void onPageSelected(int);
-  }
-
-  public class ViewParentCompat {
-    method public static boolean onNestedFling(android.view.ViewParent, android.view.View, float, float, boolean);
-    method public static boolean onNestedPreFling(android.view.ViewParent, android.view.View, float, float);
-    method public static void onNestedPreScroll(android.view.ViewParent, android.view.View, int, int, int[]);
-    method public static void onNestedScroll(android.view.ViewParent, android.view.View, int, int, int, int);
-    method public static void onNestedScrollAccepted(android.view.ViewParent, android.view.View, android.view.View, int);
-    method public static boolean onStartNestedScroll(android.view.ViewParent, android.view.View, android.view.View, int);
-    method public static void onStopNestedScroll(android.view.ViewParent, android.view.View);
-    method public static boolean requestSendAccessibilityEvent(android.view.ViewParent, android.view.View, android.view.accessibility.AccessibilityEvent);
-  }
-
-  public class ViewPropertyAnimatorCompat {
-    method public android.support.v4.view.ViewPropertyAnimatorCompat alpha(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat alphaBy(float);
-    method public void cancel();
-    method public long getDuration();
-    method public android.view.animation.Interpolator getInterpolator();
-    method public long getStartDelay();
-    method public android.support.v4.view.ViewPropertyAnimatorCompat rotation(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat rotationBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat rotationX(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat rotationXBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat rotationY(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat rotationYBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat scaleX(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat scaleXBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat scaleY(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat scaleYBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat setDuration(long);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat setInterpolator(android.view.animation.Interpolator);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat setListener(android.support.v4.view.ViewPropertyAnimatorListener);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat setStartDelay(long);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat setUpdateListener(android.support.v4.view.ViewPropertyAnimatorUpdateListener);
-    method public void start();
-    method public android.support.v4.view.ViewPropertyAnimatorCompat translationX(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat translationXBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat translationY(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat translationYBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat withEndAction(java.lang.Runnable);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat withLayer();
-    method public android.support.v4.view.ViewPropertyAnimatorCompat withStartAction(java.lang.Runnable);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat x(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat xBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat y(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat yBy(float);
-  }
-
-  public abstract interface ViewPropertyAnimatorListener {
-    method public abstract void onAnimationCancel(android.view.View);
-    method public abstract void onAnimationEnd(android.view.View);
-    method public abstract void onAnimationStart(android.view.View);
-  }
-
-  public class ViewPropertyAnimatorListenerAdapter implements android.support.v4.view.ViewPropertyAnimatorListener {
-    ctor public ViewPropertyAnimatorListenerAdapter();
-    method public void onAnimationCancel(android.view.View);
-    method public void onAnimationEnd(android.view.View);
-    method public void onAnimationStart(android.view.View);
-  }
-
-  public abstract interface ViewPropertyAnimatorUpdateListener {
-    method public abstract void onAnimationUpdate(android.view.View);
-  }
-
-  public class WindowCompat {
-    ctor public WindowCompat();
-    field public static final int FEATURE_ACTION_BAR = 8; // 0x8
-    field public static final int FEATURE_ACTION_BAR_OVERLAY = 9; // 0x9
-    field public static final int FEATURE_ACTION_MODE_OVERLAY = 10; // 0xa
-  }
-
-  public class WindowInsetsCompat {
-    method public android.support.v4.view.WindowInsetsCompat consumeStableInsets();
-    method public android.support.v4.view.WindowInsetsCompat consumeSystemWindowInsets();
-    method public int getStableInsetBottom();
-    method public int getStableInsetLeft();
-    method public int getStableInsetRight();
-    method public int getStableInsetTop();
-    method public int getSystemWindowInsetBottom();
-    method public int getSystemWindowInsetLeft();
-    method public int getSystemWindowInsetRight();
-    method public int getSystemWindowInsetTop();
-    method public boolean hasInsets();
-    method public boolean hasStableInsets();
-    method public boolean hasSystemWindowInsets();
-    method public boolean isConsumed();
-    method public boolean isRound();
-    method public android.support.v4.view.WindowInsetsCompat replaceSystemWindowInsets(int, int, int, int);
-    method public android.support.v4.view.WindowInsetsCompat replaceSystemWindowInsets(android.graphics.Rect);
-  }
-
-}
-
-package android.support.v4.view.accessibility {
-
-  public class AccessibilityEventCompat {
-    method public static void appendRecord(android.view.accessibility.AccessibilityEvent, android.support.v4.view.accessibility.AccessibilityRecordCompat);
-    method public static android.support.v4.view.accessibility.AccessibilityRecordCompat asRecord(android.view.accessibility.AccessibilityEvent);
-    method public static android.support.v4.view.accessibility.AccessibilityRecordCompat getRecord(android.view.accessibility.AccessibilityEvent, int);
-    method public static int getRecordCount(android.view.accessibility.AccessibilityEvent);
-    field public static final int TYPES_ALL_MASK = -1; // 0xffffffff
-    field public static final int TYPE_ANNOUNCEMENT = 16384; // 0x4000
-    field public static final int TYPE_GESTURE_DETECTION_END = 524288; // 0x80000
-    field public static final int TYPE_GESTURE_DETECTION_START = 262144; // 0x40000
-    field public static final int TYPE_TOUCH_EXPLORATION_GESTURE_END = 1024; // 0x400
-    field public static final int TYPE_TOUCH_EXPLORATION_GESTURE_START = 512; // 0x200
-    field public static final int TYPE_TOUCH_INTERACTION_END = 2097152; // 0x200000
-    field public static final int TYPE_TOUCH_INTERACTION_START = 1048576; // 0x100000
-    field public static final int TYPE_VIEW_ACCESSIBILITY_FOCUSED = 32768; // 0x8000
-    field public static final int TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED = 65536; // 0x10000
-    field public static final int TYPE_VIEW_HOVER_ENTER = 128; // 0x80
-    field public static final int TYPE_VIEW_HOVER_EXIT = 256; // 0x100
-    field public static final int TYPE_VIEW_SCROLLED = 4096; // 0x1000
-    field public static final int TYPE_VIEW_TEXT_SELECTION_CHANGED = 8192; // 0x2000
-    field public static final int TYPE_VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITY = 131072; // 0x20000
-    field public static final int TYPE_WINDOW_CONTENT_CHANGED = 2048; // 0x800
-  }
-
-  public class AccessibilityManagerCompat {
-    ctor public AccessibilityManagerCompat();
-    method public static boolean addAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager, android.support.v4.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat);
-    method public static java.util.List<android.accessibilityservice.AccessibilityServiceInfo> getEnabledAccessibilityServiceList(android.view.accessibility.AccessibilityManager, int);
-    method public static java.util.List<android.accessibilityservice.AccessibilityServiceInfo> getInstalledAccessibilityServiceList(android.view.accessibility.AccessibilityManager);
-    method public static boolean isTouchExplorationEnabled(android.view.accessibility.AccessibilityManager);
-    method public static boolean removeAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager, android.support.v4.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat);
-  }
-
-  public static abstract class AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat {
-    ctor public AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat();
-    method public abstract void onAccessibilityStateChanged(boolean);
-  }
-
-  public class AccessibilityNodeInfoCompat {
-    ctor public AccessibilityNodeInfoCompat(java.lang.Object);
-    method public void addAction(int);
-    method public void addAction(android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat);
-    method public void addChild(android.view.View);
-    method public void addChild(android.view.View, int);
-    method public java.util.List<android.support.v4.view.accessibility.AccessibilityNodeInfoCompat> findAccessibilityNodeInfosByText(java.lang.String);
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat findFocus(int);
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat focusSearch(int);
-    method public java.util.List<android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat> getActionList();
-    method public int getActions();
-    method public void getBoundsInParent(android.graphics.Rect);
-    method public void getBoundsInScreen(android.graphics.Rect);
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getChild(int);
-    method public int getChildCount();
-    method public java.lang.CharSequence getClassName();
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat getCollectionInfo();
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat getCollectionItemInfo();
-    method public java.lang.CharSequence getContentDescription();
-    method public java.lang.CharSequence getError();
-    method public java.lang.Object getInfo();
-    method public int getLiveRegion();
-    method public int getMovementGranularities();
-    method public java.lang.CharSequence getPackageName();
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getParent();
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat getRangeInfo();
-    method public java.lang.CharSequence getText();
-    method public java.lang.String getViewIdResourceName();
-    method public int getWindowId();
-    method public boolean isAccessibilityFocused();
-    method public boolean isCheckable();
-    method public boolean isChecked();
-    method public boolean isClickable();
-    method public boolean isContentInvalid();
-    method public boolean isEnabled();
-    method public boolean isFocusable();
-    method public boolean isFocused();
-    method public boolean isLongClickable();
-    method public boolean isPassword();
-    method public boolean isScrollable();
-    method public boolean isSelected();
-    method public boolean isVisibleToUser();
-    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat obtain(android.view.View);
-    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat obtain(android.view.View, int);
-    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat obtain();
-    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat obtain(android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
-    method public boolean performAction(int);
-    method public boolean performAction(int, android.os.Bundle);
-    method public void recycle();
-    method public void setAccessibilityFocused(boolean);
-    method public void setBoundsInParent(android.graphics.Rect);
-    method public void setBoundsInScreen(android.graphics.Rect);
-    method public void setCheckable(boolean);
-    method public void setChecked(boolean);
-    method public void setClassName(java.lang.CharSequence);
-    method public void setClickable(boolean);
-    method public void setCollectionInfo(java.lang.Object);
-    method public void setCollectionItemInfo(java.lang.Object);
-    method public void setContentDescription(java.lang.CharSequence);
-    method public void setContentInvalid(boolean);
-    method public void setEnabled(boolean);
-    method public void setError(java.lang.CharSequence);
-    method public void setFocusable(boolean);
-    method public void setFocused(boolean);
-    method public void setLabelFor(android.view.View);
-    method public void setLabelFor(android.view.View, int);
-    method public void setLiveRegion(int);
-    method public void setLongClickable(boolean);
-    method public void setMovementGranularities(int);
-    method public void setPackageName(java.lang.CharSequence);
-    method public void setParent(android.view.View);
-    method public void setParent(android.view.View, int);
-    method public void setPassword(boolean);
-    method public void setScrollable(boolean);
-    method public void setSelected(boolean);
-    method public void setSource(android.view.View);
-    method public void setSource(android.view.View, int);
-    method public void setText(java.lang.CharSequence);
-    method public void setViewIdResourceName(java.lang.String);
-    method public void setVisibleToUser(boolean);
-    field public static final int ACTION_ACCESSIBILITY_FOCUS = 64; // 0x40
-    field public static final java.lang.String ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN = "ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN";
-    field public static final java.lang.String ACTION_ARGUMENT_HTML_ELEMENT_STRING = "ACTION_ARGUMENT_HTML_ELEMENT_STRING";
-    field public static final java.lang.String ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT = "ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT";
-    field public static final java.lang.String ACTION_ARGUMENT_SELECTION_END_INT = "ACTION_ARGUMENT_SELECTION_END_INT";
-    field public static final java.lang.String ACTION_ARGUMENT_SELECTION_START_INT = "ACTION_ARGUMENT_SELECTION_START_INT";
-    field public static final java.lang.String ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE = "ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE";
-    field public static final int ACTION_CLEAR_ACCESSIBILITY_FOCUS = 128; // 0x80
-    field public static final int ACTION_CLEAR_FOCUS = 2; // 0x2
-    field public static final int ACTION_CLEAR_SELECTION = 8; // 0x8
-    field public static final int ACTION_CLICK = 16; // 0x10
-    field public static final int ACTION_COPY = 16384; // 0x4000
-    field public static final int ACTION_CUT = 65536; // 0x10000
-    field public static final int ACTION_FOCUS = 1; // 0x1
-    field public static final int ACTION_LONG_CLICK = 32; // 0x20
-    field public static final int ACTION_NEXT_AT_MOVEMENT_GRANULARITY = 256; // 0x100
-    field public static final int ACTION_NEXT_HTML_ELEMENT = 1024; // 0x400
-    field public static final int ACTION_PASTE = 32768; // 0x8000
-    field public static final int ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY = 512; // 0x200
-    field public static final int ACTION_PREVIOUS_HTML_ELEMENT = 2048; // 0x800
-    field public static final int ACTION_SCROLL_BACKWARD = 8192; // 0x2000
-    field public static final int ACTION_SCROLL_FORWARD = 4096; // 0x1000
-    field public static final int ACTION_SELECT = 4; // 0x4
-    field public static final int ACTION_SET_SELECTION = 131072; // 0x20000
-    field public static final int ACTION_SET_TEXT = 2097152; // 0x200000
-    field public static final int FOCUS_ACCESSIBILITY = 2; // 0x2
-    field public static final int FOCUS_INPUT = 1; // 0x1
-    field public static final int MOVEMENT_GRANULARITY_CHARACTER = 1; // 0x1
-    field public static final int MOVEMENT_GRANULARITY_LINE = 4; // 0x4
-    field public static final int MOVEMENT_GRANULARITY_PAGE = 16; // 0x10
-    field public static final int MOVEMENT_GRANULARITY_PARAGRAPH = 8; // 0x8
-    field public static final int MOVEMENT_GRANULARITY_WORD = 2; // 0x2
-  }
-
-  public static class AccessibilityNodeInfoCompat.AccessibilityActionCompat {
-    ctor public AccessibilityNodeInfoCompat.AccessibilityActionCompat(int, java.lang.CharSequence);
-    method public int getId();
-    method public java.lang.CharSequence getLabel();
-  }
-
-  public static class AccessibilityNodeInfoCompat.CollectionInfoCompat {
-    method public int getColumnCount();
-    method public int getRowCount();
-    method public boolean isHierarchical();
-    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat obtain(int, int, boolean, int);
-    field public static final int SELECTION_MODE_MULTIPLE = 2; // 0x2
-    field public static final int SELECTION_MODE_NONE = 0; // 0x0
-    field public static final int SELECTION_MODE_SINGLE = 1; // 0x1
-  }
-
-  public static class AccessibilityNodeInfoCompat.CollectionItemInfoCompat {
-    method public int getColumnIndex();
-    method public int getColumnSpan();
-    method public int getRowIndex();
-    method public int getRowSpan();
-    method public boolean isHeading();
-    method public boolean isSelected();
-    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat obtain(int, int, int, int, boolean, boolean);
-  }
-
-  public static class AccessibilityNodeInfoCompat.RangeInfoCompat {
-    method public float getCurrent();
-    method public float getMax();
-    method public float getMin();
-    method public int getType();
-    field public static final int RANGE_TYPE_FLOAT = 1; // 0x1
-    field public static final int RANGE_TYPE_INT = 0; // 0x0
-    field public static final int RANGE_TYPE_PERCENT = 2; // 0x2
-  }
-
-  public class AccessibilityNodeProviderCompat {
-    ctor public AccessibilityNodeProviderCompat();
-    ctor public AccessibilityNodeProviderCompat(java.lang.Object);
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat createAccessibilityNodeInfo(int);
-    method public java.util.List<android.support.v4.view.accessibility.AccessibilityNodeInfoCompat> findAccessibilityNodeInfosByText(java.lang.String, int);
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat findFocus(int);
-    method public java.lang.Object getProvider();
-    method public boolean performAction(int, int, android.os.Bundle);
-  }
-
-  public class AccessibilityRecordCompat {
-    ctor public deprecated AccessibilityRecordCompat(java.lang.Object);
-    method public int getAddedCount();
-    method public java.lang.CharSequence getBeforeText();
-    method public java.lang.CharSequence getClassName();
-    method public java.lang.CharSequence getContentDescription();
-    method public int getCurrentItemIndex();
-    method public int getFromIndex();
-    method public deprecated java.lang.Object getImpl();
-    method public int getItemCount();
-    method public int getMaxScrollX();
-    method public int getMaxScrollY();
-    method public android.os.Parcelable getParcelableData();
-    method public int getRemovedCount();
-    method public int getScrollX();
-    method public int getScrollY();
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getSource();
-    method public java.util.List<java.lang.CharSequence> getText();
-    method public int getToIndex();
-    method public int getWindowId();
-    method public boolean isChecked();
-    method public boolean isEnabled();
-    method public boolean isFullScreen();
-    method public boolean isPassword();
-    method public boolean isScrollable();
-    method public static android.support.v4.view.accessibility.AccessibilityRecordCompat obtain(android.support.v4.view.accessibility.AccessibilityRecordCompat);
-    method public static android.support.v4.view.accessibility.AccessibilityRecordCompat obtain();
-    method public void recycle();
-    method public void setAddedCount(int);
-    method public void setBeforeText(java.lang.CharSequence);
-    method public void setChecked(boolean);
-    method public void setClassName(java.lang.CharSequence);
-    method public void setContentDescription(java.lang.CharSequence);
-    method public void setCurrentItemIndex(int);
-    method public void setEnabled(boolean);
-    method public void setFromIndex(int);
-    method public void setFullScreen(boolean);
-    method public void setItemCount(int);
-    method public void setMaxScrollX(int);
-    method public void setMaxScrollY(int);
-    method public void setParcelableData(android.os.Parcelable);
-    method public void setPassword(boolean);
-    method public void setRemovedCount(int);
-    method public void setScrollX(int);
-    method public void setScrollY(int);
-    method public void setScrollable(boolean);
-    method public void setSource(android.view.View);
-    method public void setSource(android.view.View, int);
-    method public void setToIndex(int);
-  }
-
-}
-
-package android.support.v4.view.animation {
-
-  public class FastOutLinearInInterpolator extends android.support.v4.view.animation.LookupTableInterpolator {
-    ctor public FastOutLinearInInterpolator();
-  }
-
-  public class FastOutSlowInInterpolator extends android.support.v4.view.animation.LookupTableInterpolator {
-    ctor public FastOutSlowInInterpolator();
-  }
-
-  public class LinearOutSlowInInterpolator extends android.support.v4.view.animation.LookupTableInterpolator {
-    ctor public LinearOutSlowInInterpolator();
-  }
-
-   abstract class LookupTableInterpolator implements android.view.animation.Interpolator {
-    ctor public LookupTableInterpolator(float[]);
-    method public float getInterpolation(float);
-  }
-
-  public class PathInterpolatorCompat {
-    method public static android.view.animation.Interpolator create(android.graphics.Path);
-    method public static android.view.animation.Interpolator create(float, float);
-    method public static android.view.animation.Interpolator create(float, float, float, float);
-  }
-
-}
-
-package android.support.v4.widget {
-
-  public abstract class AutoScrollHelper implements android.view.View.OnTouchListener {
-    ctor public AutoScrollHelper(android.view.View);
-    method public abstract boolean canTargetScrollHorizontally(int);
-    method public abstract boolean canTargetScrollVertically(int);
-    method public boolean isEnabled();
-    method public boolean isExclusive();
-    method public boolean onTouch(android.view.View, android.view.MotionEvent);
-    method public abstract void scrollTargetBy(int, int);
-    method public android.support.v4.widget.AutoScrollHelper setActivationDelay(int);
-    method public android.support.v4.widget.AutoScrollHelper setEdgeType(int);
-    method public android.support.v4.widget.AutoScrollHelper setEnabled(boolean);
-    method public android.support.v4.widget.AutoScrollHelper setExclusive(boolean);
-    method public android.support.v4.widget.AutoScrollHelper setMaximumEdges(float, float);
-    method public android.support.v4.widget.AutoScrollHelper setMaximumVelocity(float, float);
-    method public android.support.v4.widget.AutoScrollHelper setMinimumVelocity(float, float);
-    method public android.support.v4.widget.AutoScrollHelper setRampDownDuration(int);
-    method public android.support.v4.widget.AutoScrollHelper setRampUpDuration(int);
-    method public android.support.v4.widget.AutoScrollHelper setRelativeEdges(float, float);
-    method public android.support.v4.widget.AutoScrollHelper setRelativeVelocity(float, float);
-    field public static final int EDGE_TYPE_INSIDE = 0; // 0x0
-    field public static final int EDGE_TYPE_INSIDE_EXTEND = 1; // 0x1
-    field public static final int EDGE_TYPE_OUTSIDE = 2; // 0x2
-    field public static final float NO_MAX = 3.4028235E38f;
-    field public static final float NO_MIN = 0.0f;
-    field public static final float RELATIVE_UNSPECIFIED = 0.0f;
-  }
-
-  public class ContentLoadingProgressBar extends android.widget.ProgressBar {
-    ctor public ContentLoadingProgressBar(android.content.Context);
-    ctor public ContentLoadingProgressBar(android.content.Context, android.util.AttributeSet);
-    method public void hide();
-    method public void onAttachedToWindow();
-    method public void onDetachedFromWindow();
-    method public void show();
-  }
-
-  public abstract class CursorAdapter extends android.widget.BaseAdapter {
-    ctor public deprecated CursorAdapter(android.content.Context, android.database.Cursor);
-    ctor public CursorAdapter(android.content.Context, android.database.Cursor, boolean);
-    ctor public CursorAdapter(android.content.Context, android.database.Cursor, int);
-    method public abstract void bindView(android.view.View, android.content.Context, android.database.Cursor);
-    method public void changeCursor(android.database.Cursor);
-    method public java.lang.CharSequence convertToString(android.database.Cursor);
-    method public int getCount();
-    method public android.database.Cursor getCursor();
-    method public android.widget.Filter getFilter();
-    method public android.widget.FilterQueryProvider getFilterQueryProvider();
-    method public java.lang.Object getItem(int);
-    method public long getItemId(int);
-    method public android.view.View getView(int, android.view.View, android.view.ViewGroup);
-    method protected deprecated void init(android.content.Context, android.database.Cursor, boolean);
-    method public android.view.View newDropDownView(android.content.Context, android.database.Cursor, android.view.ViewGroup);
-    method public abstract android.view.View newView(android.content.Context, android.database.Cursor, android.view.ViewGroup);
-    method protected void onContentChanged();
-    method public android.database.Cursor runQueryOnBackgroundThread(java.lang.CharSequence);
-    method public void setFilterQueryProvider(android.widget.FilterQueryProvider);
-    method public android.database.Cursor swapCursor(android.database.Cursor);
-    field public static final deprecated int FLAG_AUTO_REQUERY = 1; // 0x1
-    field public static final int FLAG_REGISTER_CONTENT_OBSERVER = 2; // 0x2
-  }
-
-  public class DrawerLayout extends android.view.ViewGroup {
-    ctor public DrawerLayout(android.content.Context);
-    ctor public DrawerLayout(android.content.Context, android.util.AttributeSet);
-    ctor public DrawerLayout(android.content.Context, android.util.AttributeSet, int);
-    method public void closeDrawer(android.view.View);
-    method public void closeDrawer(int);
-    method public void closeDrawers();
-    method public int getDrawerLockMode(int);
-    method public int getDrawerLockMode(android.view.View);
-    method public java.lang.CharSequence getDrawerTitle(int);
-    method public android.graphics.drawable.Drawable getStatusBarBackgroundDrawable();
-    method public boolean isDrawerOpen(android.view.View);
-    method public boolean isDrawerOpen(int);
-    method public boolean isDrawerVisible(android.view.View);
-    method public boolean isDrawerVisible(int);
-    method public void onDraw(android.graphics.Canvas);
-    method protected void onLayout(boolean, int, int, int, int);
-    method public void openDrawer(android.view.View);
-    method public void openDrawer(int);
-    method public void setDrawerListener(android.support.v4.widget.DrawerLayout.DrawerListener);
-    method public void setDrawerLockMode(int);
-    method public void setDrawerLockMode(int, int);
-    method public void setDrawerLockMode(int, android.view.View);
-    method public void setDrawerShadow(android.graphics.drawable.Drawable, int);
-    method public void setDrawerShadow(int, int);
-    method public void setDrawerTitle(int, java.lang.CharSequence);
-    method public void setScrimColor(int);
-    method public void setStatusBarBackground(android.graphics.drawable.Drawable);
-    method public void setStatusBarBackground(int);
-    method public void setStatusBarBackgroundColor(int);
-    field public static final int LOCK_MODE_LOCKED_CLOSED = 1; // 0x1
-    field public static final int LOCK_MODE_LOCKED_OPEN = 2; // 0x2
-    field public static final int LOCK_MODE_UNLOCKED = 0; // 0x0
-    field public static final int STATE_DRAGGING = 1; // 0x1
-    field public static final int STATE_IDLE = 0; // 0x0
-    field public static final int STATE_SETTLING = 2; // 0x2
-  }
-
-  public static abstract interface DrawerLayout.DrawerListener {
-    method public abstract void onDrawerClosed(android.view.View);
-    method public abstract void onDrawerOpened(android.view.View);
-    method public abstract void onDrawerSlide(android.view.View, float);
-    method public abstract void onDrawerStateChanged(int);
-  }
-
-  public static class DrawerLayout.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
-    ctor public DrawerLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public DrawerLayout.LayoutParams(int, int);
-    ctor public DrawerLayout.LayoutParams(int, int, int);
-    ctor public DrawerLayout.LayoutParams(android.support.v4.widget.DrawerLayout.LayoutParams);
-    ctor public DrawerLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public DrawerLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    field public int gravity;
-  }
-
-  protected static class DrawerLayout.SavedState extends android.view.View.BaseSavedState {
-    ctor public DrawerLayout.SavedState(android.os.Parcel);
-    ctor public DrawerLayout.SavedState(android.os.Parcelable);
-    field public static final android.os.Parcelable.Creator<android.support.v4.widget.DrawerLayout.SavedState> CREATOR;
-  }
-
-  public static abstract class DrawerLayout.SimpleDrawerListener implements android.support.v4.widget.DrawerLayout.DrawerListener {
-    ctor public DrawerLayout.SimpleDrawerListener();
-    method public void onDrawerClosed(android.view.View);
-    method public void onDrawerOpened(android.view.View);
-    method public void onDrawerSlide(android.view.View, float);
-    method public void onDrawerStateChanged(int);
-  }
-
-  public class EdgeEffectCompat {
-    ctor public EdgeEffectCompat(android.content.Context);
-    method public boolean draw(android.graphics.Canvas);
-    method public void finish();
-    method public boolean isFinished();
-    method public boolean onAbsorb(int);
-    method public deprecated boolean onPull(float);
-    method public boolean onPull(float, float);
-    method public boolean onRelease();
-    method public void setSize(int, int);
-  }
-
-  public abstract class ExploreByTouchHelper extends android.support.v4.view.AccessibilityDelegateCompat {
-    ctor public ExploreByTouchHelper(android.view.View);
-    method public boolean dispatchHoverEvent(android.view.MotionEvent);
-    method public int getFocusedVirtualView();
-    method protected abstract int getVirtualViewAt(float, float);
-    method protected abstract void getVisibleVirtualViews(java.util.List<java.lang.Integer>);
-    method public void invalidateRoot();
-    method public void invalidateVirtualView(int);
-    method protected abstract boolean onPerformActionForVirtualView(int, int, android.os.Bundle);
-    method protected abstract void onPopulateEventForVirtualView(int, android.view.accessibility.AccessibilityEvent);
-    method protected abstract void onPopulateNodeForVirtualView(int, android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
-    method public boolean sendEventForVirtualView(int, int);
-    field public static final int INVALID_ID = -2147483648; // 0x80000000
-  }
-
-  public class ListPopupWindowCompat {
-    method public static android.view.View.OnTouchListener createDragToOpenListener(java.lang.Object, android.view.View);
-  }
-
-  public class ListViewAutoScrollHelper extends android.support.v4.widget.AutoScrollHelper {
-    ctor public ListViewAutoScrollHelper(android.widget.ListView);
-    method public boolean canTargetScrollHorizontally(int);
-    method public boolean canTargetScrollVertically(int);
-    method public void scrollTargetBy(int, int);
-  }
-
-  public class NestedScrollView extends android.widget.FrameLayout implements android.support.v4.view.NestedScrollingChild android.support.v4.view.NestedScrollingParent {
-    ctor public NestedScrollView(android.content.Context);
-    ctor public NestedScrollView(android.content.Context, android.util.AttributeSet);
-    ctor public NestedScrollView(android.content.Context, android.util.AttributeSet, int);
-    method public boolean arrowScroll(int);
-    method protected int computeScrollDeltaToGetChildRectOnScreen(android.graphics.Rect);
-    method public boolean executeKeyEvent(android.view.KeyEvent);
-    method public void fling(int);
-    method public boolean fullScroll(int);
-    method public int getMaxScrollAmount();
-    method public boolean isFillViewport();
-    method public boolean isSmoothScrollingEnabled();
-    method public void onAttachedToWindow();
-    method public boolean pageScroll(int);
-    method public void setFillViewport(boolean);
-    method public void setSmoothScrollingEnabled(boolean);
-    method public final void smoothScrollBy(int, int);
-    method public final void smoothScrollTo(int, int);
-  }
-
-  public class PopupMenuCompat {
-    method public static android.view.View.OnTouchListener getDragToOpenListener(java.lang.Object);
-  }
-
-  public class PopupWindowCompat {
-    method public static void showAsDropDown(android.widget.PopupWindow, android.view.View, int, int, int);
-  }
-
-  public abstract class ResourceCursorAdapter extends android.support.v4.widget.CursorAdapter {
-    ctor public deprecated ResourceCursorAdapter(android.content.Context, int, android.database.Cursor);
-    ctor public ResourceCursorAdapter(android.content.Context, int, android.database.Cursor, boolean);
-    ctor public ResourceCursorAdapter(android.content.Context, int, android.database.Cursor, int);
-    method public android.view.View newView(android.content.Context, android.database.Cursor, android.view.ViewGroup);
-    method public void setDropDownViewResource(int);
-    method public void setViewResource(int);
-  }
-
-  public class ScrollerCompat {
-    method public void abortAnimation();
-    method public boolean computeScrollOffset();
-    method public static android.support.v4.widget.ScrollerCompat create(android.content.Context);
-    method public static android.support.v4.widget.ScrollerCompat create(android.content.Context, android.view.animation.Interpolator);
-    method public void fling(int, int, int, int, int, int, int, int);
-    method public void fling(int, int, int, int, int, int, int, int, int, int);
-    method public float getCurrVelocity();
-    method public int getCurrX();
-    method public int getCurrY();
-    method public int getFinalX();
-    method public int getFinalY();
-    method public boolean isFinished();
-    method public boolean isOverScrolled();
-    method public void notifyHorizontalEdgeReached(int, int, int);
-    method public void notifyVerticalEdgeReached(int, int, int);
-    method public void startScroll(int, int, int, int);
-    method public void startScroll(int, int, int, int, int);
-  }
-
-  public class SearchViewCompat {
-    method public static java.lang.CharSequence getQuery(android.view.View);
-    method public static boolean isIconified(android.view.View);
-    method public static boolean isQueryRefinementEnabled(android.view.View);
-    method public static boolean isSubmitButtonEnabled(android.view.View);
-    method public static android.view.View newSearchView(android.content.Context);
-    method public static void setIconified(android.view.View, boolean);
-    method public static void setImeOptions(android.view.View, int);
-    method public static void setInputType(android.view.View, int);
-    method public static void setMaxWidth(android.view.View, int);
-    method public static void setOnCloseListener(android.view.View, android.support.v4.widget.SearchViewCompat.OnCloseListenerCompat);
-    method public static void setOnQueryTextListener(android.view.View, android.support.v4.widget.SearchViewCompat.OnQueryTextListenerCompat);
-    method public static void setQuery(android.view.View, java.lang.CharSequence, boolean);
-    method public static void setQueryHint(android.view.View, java.lang.CharSequence);
-    method public static void setQueryRefinementEnabled(android.view.View, boolean);
-    method public static void setSearchableInfo(android.view.View, android.content.ComponentName);
-    method public static void setSubmitButtonEnabled(android.view.View, boolean);
-  }
-
-  public static abstract class SearchViewCompat.OnCloseListenerCompat {
-    ctor public SearchViewCompat.OnCloseListenerCompat();
-    method public boolean onClose();
-  }
-
-  public static abstract class SearchViewCompat.OnQueryTextListenerCompat {
-    ctor public SearchViewCompat.OnQueryTextListenerCompat();
-    method public boolean onQueryTextChange(java.lang.String);
-    method public boolean onQueryTextSubmit(java.lang.String);
-  }
-
-  public class SimpleCursorAdapter extends android.support.v4.widget.ResourceCursorAdapter {
-    ctor public deprecated SimpleCursorAdapter(android.content.Context, int, android.database.Cursor, java.lang.String[], int[]);
-    ctor public SimpleCursorAdapter(android.content.Context, int, android.database.Cursor, java.lang.String[], int[], int);
-    method public void bindView(android.view.View, android.content.Context, android.database.Cursor);
-    method public void changeCursorAndColumns(android.database.Cursor, java.lang.String[], int[]);
-    method public android.support.v4.widget.SimpleCursorAdapter.CursorToStringConverter getCursorToStringConverter();
-    method public int getStringConversionColumn();
-    method public android.support.v4.widget.SimpleCursorAdapter.ViewBinder getViewBinder();
-    method public void setCursorToStringConverter(android.support.v4.widget.SimpleCursorAdapter.CursorToStringConverter);
-    method public void setStringConversionColumn(int);
-    method public void setViewBinder(android.support.v4.widget.SimpleCursorAdapter.ViewBinder);
-    method public void setViewImage(android.widget.ImageView, java.lang.String);
-    method public void setViewText(android.widget.TextView, java.lang.String);
-  }
-
-  public static abstract interface SimpleCursorAdapter.CursorToStringConverter {
-    method public abstract java.lang.CharSequence convertToString(android.database.Cursor);
-  }
-
-  public static abstract interface SimpleCursorAdapter.ViewBinder {
-    method public abstract boolean setViewValue(android.view.View, android.database.Cursor, int);
-  }
-
-  public class SlidingPaneLayout extends android.view.ViewGroup {
-    ctor public SlidingPaneLayout(android.content.Context);
-    ctor public SlidingPaneLayout(android.content.Context, android.util.AttributeSet);
-    ctor public SlidingPaneLayout(android.content.Context, android.util.AttributeSet, int);
-    method protected boolean canScroll(android.view.View, boolean, int, int, int);
-    method public deprecated boolean canSlide();
-    method public boolean closePane();
-    method public int getCoveredFadeColor();
-    method public int getParallaxDistance();
-    method public int getSliderFadeColor();
-    method public boolean isOpen();
-    method public boolean isSlideable();
-    method protected void onLayout(boolean, int, int, int, int);
-    method public boolean openPane();
-    method public void setCoveredFadeColor(int);
-    method public void setPanelSlideListener(android.support.v4.widget.SlidingPaneLayout.PanelSlideListener);
-    method public void setParallaxDistance(int);
-    method public deprecated void setShadowDrawable(android.graphics.drawable.Drawable);
-    method public void setShadowDrawableLeft(android.graphics.drawable.Drawable);
-    method public void setShadowDrawableRight(android.graphics.drawable.Drawable);
-    method public deprecated void setShadowResource(int);
-    method public void setShadowResourceLeft(int);
-    method public void setShadowResourceRight(int);
-    method public void setSliderFadeColor(int);
-    method public deprecated void smoothSlideClosed();
-    method public deprecated void smoothSlideOpen();
-  }
-
-  public static class SlidingPaneLayout.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
-    ctor public SlidingPaneLayout.LayoutParams();
-    ctor public SlidingPaneLayout.LayoutParams(int, int);
-    ctor public SlidingPaneLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public SlidingPaneLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public SlidingPaneLayout.LayoutParams(android.support.v4.widget.SlidingPaneLayout.LayoutParams);
-    ctor public SlidingPaneLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
-    field public float weight;
-  }
-
-  public static abstract interface SlidingPaneLayout.PanelSlideListener {
-    method public abstract void onPanelClosed(android.view.View);
-    method public abstract void onPanelOpened(android.view.View);
-    method public abstract void onPanelSlide(android.view.View, float);
-  }
-
-  public static class SlidingPaneLayout.SimplePanelSlideListener implements android.support.v4.widget.SlidingPaneLayout.PanelSlideListener {
-    ctor public SlidingPaneLayout.SimplePanelSlideListener();
-    method public void onPanelClosed(android.view.View);
-    method public void onPanelOpened(android.view.View);
-    method public void onPanelSlide(android.view.View, float);
-  }
-
-  public class Space extends android.view.View {
-    ctor public Space(android.content.Context, android.util.AttributeSet, int);
-    ctor public Space(android.content.Context, android.util.AttributeSet);
-    ctor public Space(android.content.Context);
-  }
-
-  public class SwipeRefreshLayout extends android.view.ViewGroup {
-    ctor public SwipeRefreshLayout(android.content.Context);
-    ctor public SwipeRefreshLayout(android.content.Context, android.util.AttributeSet);
-    method public boolean canChildScrollUp();
-    method public int getProgressCircleDiameter();
-    method public boolean isRefreshing();
-    method protected void onLayout(boolean, int, int, int, int);
-    method public void onMeasure(int, int);
-    method public deprecated void setColorScheme(int...);
-    method public void setColorSchemeColors(int...);
-    method public void setColorSchemeResources(int...);
-    method public void setDistanceToTriggerSync(int);
-    method public void setOnRefreshListener(android.support.v4.widget.SwipeRefreshLayout.OnRefreshListener);
-    method public deprecated void setProgressBackgroundColor(int);
-    method public void setProgressBackgroundColorSchemeColor(int);
-    method public void setProgressBackgroundColorSchemeResource(int);
-    method public void setProgressViewEndTarget(boolean, int);
-    method public void setProgressViewOffset(boolean, int, int);
-    method public void setRefreshing(boolean);
-    method public void setSize(int);
-    field public static final int DEFAULT = 1; // 0x1
-    field public static final int LARGE = 0; // 0x0
-    field protected int mFrom;
-    field protected int mOriginalOffsetTop;
-  }
-
-  public static abstract interface SwipeRefreshLayout.OnRefreshListener {
-    method public abstract void onRefresh();
-  }
-
-  public class TextViewCompat {
-    method public static void setCompoundDrawablesRelative(android.widget.TextView, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable);
-    method public static void setCompoundDrawablesRelativeWithIntrinsicBounds(android.widget.TextView, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable);
-    method public static void setCompoundDrawablesRelativeWithIntrinsicBounds(android.widget.TextView, int, int, int, int);
-  }
-
-  public class ViewDragHelper {
-    method public void abort();
-    method protected boolean canScroll(android.view.View, boolean, int, int, int, int);
-    method public void cancel();
-    method public void captureChildView(android.view.View, int);
-    method public boolean checkTouchSlop(int);
-    method public boolean checkTouchSlop(int, int);
-    method public boolean continueSettling(boolean);
-    method public static android.support.v4.widget.ViewDragHelper create(android.view.ViewGroup, android.support.v4.widget.ViewDragHelper.Callback);
-    method public static android.support.v4.widget.ViewDragHelper create(android.view.ViewGroup, float, android.support.v4.widget.ViewDragHelper.Callback);
-    method public android.view.View findTopChildUnder(int, int);
-    method public void flingCapturedView(int, int, int, int);
-    method public int getActivePointerId();
-    method public android.view.View getCapturedView();
-    method public int getEdgeSize();
-    method public float getMinVelocity();
-    method public int getTouchSlop();
-    method public int getViewDragState();
-    method public boolean isCapturedViewUnder(int, int);
-    method public boolean isEdgeTouched(int);
-    method public boolean isEdgeTouched(int, int);
-    method public boolean isPointerDown(int);
-    method public boolean isViewUnder(android.view.View, int, int);
-    method public void processTouchEvent(android.view.MotionEvent);
-    method public void setEdgeTrackingEnabled(int);
-    method public void setMinVelocity(float);
-    method public boolean settleCapturedViewAt(int, int);
-    method public boolean shouldInterceptTouchEvent(android.view.MotionEvent);
-    method public boolean smoothSlideViewTo(android.view.View, int, int);
-    field public static final int DIRECTION_ALL = 3; // 0x3
-    field public static final int DIRECTION_HORIZONTAL = 1; // 0x1
-    field public static final int DIRECTION_VERTICAL = 2; // 0x2
-    field public static final int EDGE_ALL = 15; // 0xf
-    field public static final int EDGE_BOTTOM = 8; // 0x8
-    field public static final int EDGE_LEFT = 1; // 0x1
-    field public static final int EDGE_RIGHT = 2; // 0x2
-    field public static final int EDGE_TOP = 4; // 0x4
-    field public static final int INVALID_POINTER = -1; // 0xffffffff
-    field public static final int STATE_DRAGGING = 1; // 0x1
-    field public static final int STATE_IDLE = 0; // 0x0
-    field public static final int STATE_SETTLING = 2; // 0x2
-  }
-
-  public static abstract class ViewDragHelper.Callback {
-    ctor public ViewDragHelper.Callback();
-    method public int clampViewPositionHorizontal(android.view.View, int, int);
-    method public int clampViewPositionVertical(android.view.View, int, int);
-    method public int getOrderedChildIndex(int);
-    method public int getViewHorizontalDragRange(android.view.View);
-    method public int getViewVerticalDragRange(android.view.View);
-    method public void onEdgeDragStarted(int, int);
-    method public boolean onEdgeLock(int);
-    method public void onEdgeTouched(int, int);
-    method public void onViewCaptured(android.view.View, int);
-    method public void onViewDragStateChanged(int);
-    method public void onViewPositionChanged(android.view.View, int, int, int, int);
-    method public void onViewReleased(android.view.View, float, float);
-    method public abstract boolean tryCaptureView(android.view.View, int);
-  }
-
-}
-
diff --git a/v4/api/22.2.0.txt b/v4/api/22.2.0.txt
deleted file mode 100644
index b0600dc..0000000
--- a/v4/api/22.2.0.txt
+++ /dev/null
@@ -1,3190 +0,0 @@
-package android.support.v4.accessibilityservice {
-
-  public class AccessibilityServiceInfoCompat {
-    method public static java.lang.String capabilityToString(int);
-    method public static java.lang.String feedbackTypeToString(int);
-    method public static java.lang.String flagToString(int);
-    method public static boolean getCanRetrieveWindowContent(android.accessibilityservice.AccessibilityServiceInfo);
-    method public static int getCapabilities(android.accessibilityservice.AccessibilityServiceInfo);
-    method public static java.lang.String getDescription(android.accessibilityservice.AccessibilityServiceInfo);
-    method public static java.lang.String getId(android.accessibilityservice.AccessibilityServiceInfo);
-    method public static android.content.pm.ResolveInfo getResolveInfo(android.accessibilityservice.AccessibilityServiceInfo);
-    method public static java.lang.String getSettingsActivityName(android.accessibilityservice.AccessibilityServiceInfo);
-    field public static final int CAPABILITY_CAN_FILTER_KEY_EVENTS = 8; // 0x8
-    field public static final int CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 4; // 0x4
-    field public static final int CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION = 2; // 0x2
-    field public static final int CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT = 1; // 0x1
-    field public static final int DEFAULT = 1; // 0x1
-    field public static final int FEEDBACK_ALL_MASK = -1; // 0xffffffff
-    field public static final int FEEDBACK_BRAILLE = 32; // 0x20
-    field public static final int FLAG_INCLUDE_NOT_IMPORTANT_VIEWS = 2; // 0x2
-    field public static final int FLAG_REPORT_VIEW_IDS = 16; // 0x10
-    field public static final int FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 8; // 0x8
-    field public static final int FLAG_REQUEST_FILTER_KEY_EVENTS = 32; // 0x20
-    field public static final int FLAG_REQUEST_TOUCH_EXPLORATION_MODE = 4; // 0x4
-  }
-
-}
-
-package android.support.v4.animation {
-
-  public abstract class AnimatorCompatHelper {
-    method public static android.support.v4.animation.ValueAnimatorCompat emptyValueAnimator();
-  }
-
-  public abstract interface AnimatorListenerCompat {
-    method public abstract void onAnimationCancel(android.support.v4.animation.ValueAnimatorCompat);
-    method public abstract void onAnimationEnd(android.support.v4.animation.ValueAnimatorCompat);
-    method public abstract void onAnimationRepeat(android.support.v4.animation.ValueAnimatorCompat);
-    method public abstract void onAnimationStart(android.support.v4.animation.ValueAnimatorCompat);
-  }
-
-  public abstract interface AnimatorUpdateListenerCompat {
-    method public abstract void onAnimationUpdate(android.support.v4.animation.ValueAnimatorCompat);
-  }
-
-  public abstract interface ValueAnimatorCompat {
-    method public abstract void addListener(android.support.v4.animation.AnimatorListenerCompat);
-    method public abstract void addUpdateListener(android.support.v4.animation.AnimatorUpdateListenerCompat);
-    method public abstract void cancel();
-    method public abstract float getAnimatedFraction();
-    method public abstract void setDuration(long);
-    method public abstract void setTarget(android.view.View);
-    method public abstract void start();
-  }
-
-}
-
-package android.support.v4.app {
-
-  public deprecated class ActionBarDrawerToggle implements android.support.v4.widget.DrawerLayout.DrawerListener {
-    ctor public ActionBarDrawerToggle(android.app.Activity, android.support.v4.widget.DrawerLayout, int, int, int);
-    ctor public ActionBarDrawerToggle(android.app.Activity, android.support.v4.widget.DrawerLayout, boolean, int, int, int);
-    method public boolean isDrawerIndicatorEnabled();
-    method public void onConfigurationChanged(android.content.res.Configuration);
-    method public void onDrawerClosed(android.view.View);
-    method public void onDrawerOpened(android.view.View);
-    method public void onDrawerSlide(android.view.View, float);
-    method public void onDrawerStateChanged(int);
-    method public boolean onOptionsItemSelected(android.view.MenuItem);
-    method public void setDrawerIndicatorEnabled(boolean);
-    method public void setHomeAsUpIndicator(android.graphics.drawable.Drawable);
-    method public void setHomeAsUpIndicator(int);
-    method public void syncState();
-  }
-
-  public static abstract interface ActionBarDrawerToggle.Delegate {
-    method public abstract android.graphics.drawable.Drawable getThemeUpIndicator();
-    method public abstract void setActionBarDescription(int);
-    method public abstract void setActionBarUpIndicator(android.graphics.drawable.Drawable, int);
-  }
-
-  public static abstract interface ActionBarDrawerToggle.DelegateProvider {
-    method public abstract android.support.v4.app.ActionBarDrawerToggle.Delegate getDrawerToggleDelegate();
-  }
-
-  public class ActivityCompat extends android.support.v4.content.ContextCompat {
-    ctor public ActivityCompat();
-    method public static void finishAffinity(android.app.Activity);
-    method public static void finishAfterTransition(android.app.Activity);
-    method public static boolean invalidateOptionsMenu(android.app.Activity);
-    method public static void postponeEnterTransition(android.app.Activity);
-    method public static void setEnterSharedElementCallback(android.app.Activity, android.support.v4.app.SharedElementCallback);
-    method public static void setExitSharedElementCallback(android.app.Activity, android.support.v4.app.SharedElementCallback);
-    method public static void startActivity(android.app.Activity, android.content.Intent, android.os.Bundle);
-    method public static void startActivityForResult(android.app.Activity, android.content.Intent, int, android.os.Bundle);
-    method public static void startPostponedEnterTransition(android.app.Activity);
-  }
-
-  public final class ActivityManagerCompat {
-    method public static boolean isLowRamDevice(android.app.ActivityManager);
-  }
-
-  public class ActivityOptionsCompat {
-    ctor protected ActivityOptionsCompat();
-    method public static android.support.v4.app.ActivityOptionsCompat makeCustomAnimation(android.content.Context, int, int);
-    method public static android.support.v4.app.ActivityOptionsCompat makeScaleUpAnimation(android.view.View, int, int, int, int);
-    method public static android.support.v4.app.ActivityOptionsCompat makeSceneTransitionAnimation(android.app.Activity, android.view.View, java.lang.String);
-    method public static android.support.v4.app.ActivityOptionsCompat makeSceneTransitionAnimation(android.app.Activity, android.support.v4.util.Pair<android.view.View, java.lang.String>...);
-    method public static android.support.v4.app.ActivityOptionsCompat makeThumbnailScaleUpAnimation(android.view.View, android.graphics.Bitmap, int, int);
-    method public android.os.Bundle toBundle();
-    method public void update(android.support.v4.app.ActivityOptionsCompat);
-  }
-
-  public class DialogFragment extends android.support.v4.app.Fragment implements android.content.DialogInterface.OnCancelListener android.content.DialogInterface.OnDismissListener {
-    ctor public DialogFragment();
-    method public void dismiss();
-    method public void dismissAllowingStateLoss();
-    method public android.app.Dialog getDialog();
-    method public boolean getShowsDialog();
-    method public int getTheme();
-    method public boolean isCancelable();
-    method public void onCancel(android.content.DialogInterface);
-    method public android.app.Dialog onCreateDialog(android.os.Bundle);
-    method public void onDismiss(android.content.DialogInterface);
-    method public void setCancelable(boolean);
-    method public void setShowsDialog(boolean);
-    method public void setStyle(int, int);
-    method public void show(android.support.v4.app.FragmentManager, java.lang.String);
-    method public int show(android.support.v4.app.FragmentTransaction, java.lang.String);
-    field public static final int STYLE_NORMAL = 0; // 0x0
-    field public static final int STYLE_NO_FRAME = 2; // 0x2
-    field public static final int STYLE_NO_INPUT = 3; // 0x3
-    field public static final int STYLE_NO_TITLE = 1; // 0x1
-  }
-
-  public class Fragment implements android.content.ComponentCallbacks android.view.View.OnCreateContextMenuListener {
-    ctor public Fragment();
-    method public void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
-    method public final boolean equals(java.lang.Object);
-    method public final android.support.v4.app.FragmentActivity getActivity();
-    method public boolean getAllowEnterTransitionOverlap();
-    method public boolean getAllowReturnTransitionOverlap();
-    method public final android.os.Bundle getArguments();
-    method public final android.support.v4.app.FragmentManager getChildFragmentManager();
-    method public java.lang.Object getEnterTransition();
-    method public java.lang.Object getExitTransition();
-    method public final android.support.v4.app.FragmentManager getFragmentManager();
-    method public final int getId();
-    method public android.support.v4.app.LoaderManager getLoaderManager();
-    method public final android.support.v4.app.Fragment getParentFragment();
-    method public java.lang.Object getReenterTransition();
-    method public final android.content.res.Resources getResources();
-    method public final boolean getRetainInstance();
-    method public java.lang.Object getReturnTransition();
-    method public java.lang.Object getSharedElementEnterTransition();
-    method public java.lang.Object getSharedElementReturnTransition();
-    method public final java.lang.String getString(int);
-    method public final java.lang.String getString(int, java.lang.Object...);
-    method public final java.lang.String getTag();
-    method public final android.support.v4.app.Fragment getTargetFragment();
-    method public final int getTargetRequestCode();
-    method public final java.lang.CharSequence getText(int);
-    method public boolean getUserVisibleHint();
-    method public android.view.View getView();
-    method public final int hashCode();
-    method public static android.support.v4.app.Fragment instantiate(android.content.Context, java.lang.String);
-    method public static android.support.v4.app.Fragment instantiate(android.content.Context, java.lang.String, android.os.Bundle);
-    method public final boolean isAdded();
-    method public final boolean isDetached();
-    method public final boolean isHidden();
-    method public final boolean isInLayout();
-    method public final boolean isRemoving();
-    method public final boolean isResumed();
-    method public final boolean isVisible();
-    method public void onActivityCreated(android.os.Bundle);
-    method public void onActivityResult(int, int, android.content.Intent);
-    method public void onAttach(android.app.Activity);
-    method public void onConfigurationChanged(android.content.res.Configuration);
-    method public boolean onContextItemSelected(android.view.MenuItem);
-    method public void onCreate(android.os.Bundle);
-    method public android.view.animation.Animation onCreateAnimation(int, boolean, int);
-    method public void onCreateContextMenu(android.view.ContextMenu, android.view.View, android.view.ContextMenu.ContextMenuInfo);
-    method public void onCreateOptionsMenu(android.view.Menu, android.view.MenuInflater);
-    method public android.view.View onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
-    method public void onDestroy();
-    method public void onDestroyOptionsMenu();
-    method public void onDestroyView();
-    method public void onDetach();
-    method public void onHiddenChanged(boolean);
-    method public void onInflate(android.app.Activity, android.util.AttributeSet, android.os.Bundle);
-    method public void onLowMemory();
-    method public boolean onOptionsItemSelected(android.view.MenuItem);
-    method public void onOptionsMenuClosed(android.view.Menu);
-    method public void onPause();
-    method public void onPrepareOptionsMenu(android.view.Menu);
-    method public void onResume();
-    method public void onSaveInstanceState(android.os.Bundle);
-    method public void onStart();
-    method public void onStop();
-    method public void onViewCreated(android.view.View, android.os.Bundle);
-    method public void onViewStateRestored(android.os.Bundle);
-    method public void registerForContextMenu(android.view.View);
-    method public void setAllowEnterTransitionOverlap(boolean);
-    method public void setAllowReturnTransitionOverlap(boolean);
-    method public void setArguments(android.os.Bundle);
-    method public void setEnterSharedElementCallback(android.support.v4.app.SharedElementCallback);
-    method public void setEnterTransition(java.lang.Object);
-    method public void setExitSharedElementCallback(android.support.v4.app.SharedElementCallback);
-    method public void setExitTransition(java.lang.Object);
-    method public void setHasOptionsMenu(boolean);
-    method public void setInitialSavedState(android.support.v4.app.Fragment.SavedState);
-    method public void setMenuVisibility(boolean);
-    method public void setReenterTransition(java.lang.Object);
-    method public void setRetainInstance(boolean);
-    method public void setReturnTransition(java.lang.Object);
-    method public void setSharedElementEnterTransition(java.lang.Object);
-    method public void setSharedElementReturnTransition(java.lang.Object);
-    method public void setTargetFragment(android.support.v4.app.Fragment, int);
-    method public void setUserVisibleHint(boolean);
-    method public void startActivity(android.content.Intent);
-    method public void startActivityForResult(android.content.Intent, int);
-    method public void unregisterForContextMenu(android.view.View);
-  }
-
-  public static class Fragment.InstantiationException extends java.lang.RuntimeException {
-    ctor public Fragment.InstantiationException(java.lang.String, java.lang.Exception);
-  }
-
-  public static class Fragment.SavedState implements android.os.Parcelable {
-    method public int describeContents();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.support.v4.app.Fragment.SavedState> CREATOR;
-  }
-
-  public class FragmentActivity extends android.app.Activity {
-    ctor public FragmentActivity();
-    method public java.lang.Object getLastCustomNonConfigurationInstance();
-    method public android.support.v4.app.FragmentManager getSupportFragmentManager();
-    method public android.support.v4.app.LoaderManager getSupportLoaderManager();
-    method public void onAttachFragment(android.support.v4.app.Fragment);
-    method protected void onResumeFragments();
-    method public java.lang.Object onRetainCustomNonConfigurationInstance();
-    method public final java.lang.Object onRetainNonConfigurationInstance();
-    method public void setEnterSharedElementCallback(android.support.v4.app.SharedElementCallback);
-    method public void setExitSharedElementCallback(android.support.v4.app.SharedElementCallback);
-    method public void startActivityFromFragment(android.support.v4.app.Fragment, android.content.Intent, int);
-    method public void supportFinishAfterTransition();
-    method public void supportInvalidateOptionsMenu();
-    method public void supportPostponeEnterTransition();
-    method public void supportStartPostponedEnterTransition();
-  }
-
-  public abstract class FragmentManager {
-    ctor public FragmentManager();
-    method public abstract void addOnBackStackChangedListener(android.support.v4.app.FragmentManager.OnBackStackChangedListener);
-    method public abstract android.support.v4.app.FragmentTransaction beginTransaction();
-    method public abstract void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
-    method public static void enableDebugLogging(boolean);
-    method public abstract boolean executePendingTransactions();
-    method public abstract android.support.v4.app.Fragment findFragmentById(int);
-    method public abstract android.support.v4.app.Fragment findFragmentByTag(java.lang.String);
-    method public abstract android.support.v4.app.FragmentManager.BackStackEntry getBackStackEntryAt(int);
-    method public abstract int getBackStackEntryCount();
-    method public abstract android.support.v4.app.Fragment getFragment(android.os.Bundle, java.lang.String);
-    method public abstract boolean isDestroyed();
-    method public abstract void popBackStack();
-    method public abstract void popBackStack(java.lang.String, int);
-    method public abstract void popBackStack(int, int);
-    method public abstract boolean popBackStackImmediate();
-    method public abstract boolean popBackStackImmediate(java.lang.String, int);
-    method public abstract boolean popBackStackImmediate(int, int);
-    method public abstract void putFragment(android.os.Bundle, java.lang.String, android.support.v4.app.Fragment);
-    method public abstract void removeOnBackStackChangedListener(android.support.v4.app.FragmentManager.OnBackStackChangedListener);
-    method public abstract android.support.v4.app.Fragment.SavedState saveFragmentInstanceState(android.support.v4.app.Fragment);
-    field public static final int POP_BACK_STACK_INCLUSIVE = 1; // 0x1
-  }
-
-  public static abstract interface FragmentManager.BackStackEntry {
-    method public abstract java.lang.CharSequence getBreadCrumbShortTitle();
-    method public abstract int getBreadCrumbShortTitleRes();
-    method public abstract java.lang.CharSequence getBreadCrumbTitle();
-    method public abstract int getBreadCrumbTitleRes();
-    method public abstract int getId();
-    method public abstract java.lang.String getName();
-  }
-
-  public static abstract interface FragmentManager.OnBackStackChangedListener {
-    method public abstract void onBackStackChanged();
-  }
-
-  public abstract class FragmentPagerAdapter extends android.support.v4.view.PagerAdapter {
-    ctor public FragmentPagerAdapter(android.support.v4.app.FragmentManager);
-    method public abstract android.support.v4.app.Fragment getItem(int);
-    method public long getItemId(int);
-    method public boolean isViewFromObject(android.view.View, java.lang.Object);
-  }
-
-  public abstract class FragmentStatePagerAdapter extends android.support.v4.view.PagerAdapter {
-    ctor public FragmentStatePagerAdapter(android.support.v4.app.FragmentManager);
-    method public abstract android.support.v4.app.Fragment getItem(int);
-    method public boolean isViewFromObject(android.view.View, java.lang.Object);
-  }
-
-  public class FragmentTabHost extends android.widget.TabHost implements android.widget.TabHost.OnTabChangeListener {
-    ctor public FragmentTabHost(android.content.Context);
-    ctor public FragmentTabHost(android.content.Context, android.util.AttributeSet);
-    method public void addTab(android.widget.TabHost.TabSpec, java.lang.Class<?>, android.os.Bundle);
-    method public void onTabChanged(java.lang.String);
-    method public void setup(android.content.Context, android.support.v4.app.FragmentManager);
-    method public void setup(android.content.Context, android.support.v4.app.FragmentManager, int);
-  }
-
-  public abstract class FragmentTransaction {
-    ctor public FragmentTransaction();
-    method public abstract android.support.v4.app.FragmentTransaction add(android.support.v4.app.Fragment, java.lang.String);
-    method public abstract android.support.v4.app.FragmentTransaction add(int, android.support.v4.app.Fragment);
-    method public abstract android.support.v4.app.FragmentTransaction add(int, android.support.v4.app.Fragment, java.lang.String);
-    method public abstract android.support.v4.app.FragmentTransaction addSharedElement(android.view.View, java.lang.String);
-    method public abstract android.support.v4.app.FragmentTransaction addToBackStack(java.lang.String);
-    method public abstract android.support.v4.app.FragmentTransaction attach(android.support.v4.app.Fragment);
-    method public abstract int commit();
-    method public abstract int commitAllowingStateLoss();
-    method public abstract android.support.v4.app.FragmentTransaction detach(android.support.v4.app.Fragment);
-    method public abstract android.support.v4.app.FragmentTransaction disallowAddToBackStack();
-    method public abstract android.support.v4.app.FragmentTransaction hide(android.support.v4.app.Fragment);
-    method public abstract boolean isAddToBackStackAllowed();
-    method public abstract boolean isEmpty();
-    method public abstract android.support.v4.app.FragmentTransaction remove(android.support.v4.app.Fragment);
-    method public abstract android.support.v4.app.FragmentTransaction replace(int, android.support.v4.app.Fragment);
-    method public abstract android.support.v4.app.FragmentTransaction replace(int, android.support.v4.app.Fragment, java.lang.String);
-    method public abstract android.support.v4.app.FragmentTransaction setBreadCrumbShortTitle(int);
-    method public abstract android.support.v4.app.FragmentTransaction setBreadCrumbShortTitle(java.lang.CharSequence);
-    method public abstract android.support.v4.app.FragmentTransaction setBreadCrumbTitle(int);
-    method public abstract android.support.v4.app.FragmentTransaction setBreadCrumbTitle(java.lang.CharSequence);
-    method public abstract android.support.v4.app.FragmentTransaction setCustomAnimations(int, int);
-    method public abstract android.support.v4.app.FragmentTransaction setCustomAnimations(int, int, int, int);
-    method public abstract android.support.v4.app.FragmentTransaction setTransition(int);
-    method public abstract android.support.v4.app.FragmentTransaction setTransitionStyle(int);
-    method public abstract android.support.v4.app.FragmentTransaction show(android.support.v4.app.Fragment);
-    field public static final int TRANSIT_ENTER_MASK = 4096; // 0x1000
-    field public static final int TRANSIT_EXIT_MASK = 8192; // 0x2000
-    field public static final int TRANSIT_FRAGMENT_CLOSE = 8194; // 0x2002
-    field public static final int TRANSIT_FRAGMENT_FADE = 4099; // 0x1003
-    field public static final int TRANSIT_FRAGMENT_OPEN = 4097; // 0x1001
-    field public static final int TRANSIT_NONE = 0; // 0x0
-    field public static final int TRANSIT_UNSET = -1; // 0xffffffff
-  }
-
-  public class ListFragment extends android.support.v4.app.Fragment {
-    ctor public ListFragment();
-    method public android.widget.ListAdapter getListAdapter();
-    method public android.widget.ListView getListView();
-    method public long getSelectedItemId();
-    method public int getSelectedItemPosition();
-    method public void onListItemClick(android.widget.ListView, android.view.View, int, long);
-    method public void setEmptyText(java.lang.CharSequence);
-    method public void setListAdapter(android.widget.ListAdapter);
-    method public void setListShown(boolean);
-    method public void setListShownNoAnimation(boolean);
-    method public void setSelection(int);
-  }
-
-  public abstract class LoaderManager {
-    ctor public LoaderManager();
-    method public abstract void destroyLoader(int);
-    method public abstract void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
-    method public static void enableDebugLogging(boolean);
-    method public abstract android.support.v4.content.Loader<D> getLoader(int);
-    method public boolean hasRunningLoaders();
-    method public abstract android.support.v4.content.Loader<D> initLoader(int, android.os.Bundle, android.support.v4.app.LoaderManager.LoaderCallbacks<D>);
-    method public abstract android.support.v4.content.Loader<D> restartLoader(int, android.os.Bundle, android.support.v4.app.LoaderManager.LoaderCallbacks<D>);
-  }
-
-  public static abstract interface LoaderManager.LoaderCallbacks {
-    method public abstract android.support.v4.content.Loader<D> onCreateLoader(int, android.os.Bundle);
-    method public abstract void onLoadFinished(android.support.v4.content.Loader<D>, D);
-    method public abstract void onLoaderReset(android.support.v4.content.Loader<D>);
-  }
-
-  public class NavUtils {
-    method public static android.content.Intent getParentActivityIntent(android.app.Activity);
-    method public static android.content.Intent getParentActivityIntent(android.content.Context, java.lang.Class<?>) throws android.content.pm.PackageManager.NameNotFoundException;
-    method public static android.content.Intent getParentActivityIntent(android.content.Context, android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
-    method public static java.lang.String getParentActivityName(android.app.Activity);
-    method public static java.lang.String getParentActivityName(android.content.Context, android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
-    method public static void navigateUpFromSameTask(android.app.Activity);
-    method public static void navigateUpTo(android.app.Activity, android.content.Intent);
-    method public static boolean shouldUpRecreateTask(android.app.Activity, android.content.Intent);
-    field public static final java.lang.String PARENT_ACTIVITY = "android.support.PARENT_ACTIVITY";
-  }
-
-  public class NotificationCompat {
-    ctor public NotificationCompat();
-    method public static android.support.v4.app.NotificationCompat.Action getAction(android.app.Notification, int);
-    method public static int getActionCount(android.app.Notification);
-    method public static java.lang.String getCategory(android.app.Notification);
-    method public static android.os.Bundle getExtras(android.app.Notification);
-    method public static java.lang.String getGroup(android.app.Notification);
-    method public static boolean getLocalOnly(android.app.Notification);
-    method public static java.lang.String getSortKey(android.app.Notification);
-    method public static boolean isGroupSummary(android.app.Notification);
-    field public static final java.lang.String CATEGORY_ALARM = "alarm";
-    field public static final java.lang.String CATEGORY_CALL = "call";
-    field public static final java.lang.String CATEGORY_EMAIL = "email";
-    field public static final java.lang.String CATEGORY_ERROR = "err";
-    field public static final java.lang.String CATEGORY_EVENT = "event";
-    field public static final java.lang.String CATEGORY_MESSAGE = "msg";
-    field public static final java.lang.String CATEGORY_PROGRESS = "progress";
-    field public static final java.lang.String CATEGORY_PROMO = "promo";
-    field public static final java.lang.String CATEGORY_RECOMMENDATION = "recommendation";
-    field public static final java.lang.String CATEGORY_SERVICE = "service";
-    field public static final java.lang.String CATEGORY_SOCIAL = "social";
-    field public static final java.lang.String CATEGORY_STATUS = "status";
-    field public static final java.lang.String CATEGORY_SYSTEM = "sys";
-    field public static final java.lang.String CATEGORY_TRANSPORT = "transport";
-    field public static final int COLOR_DEFAULT = 0; // 0x0
-    field public static final int DEFAULT_ALL = -1; // 0xffffffff
-    field public static final int DEFAULT_LIGHTS = 4; // 0x4
-    field public static final int DEFAULT_SOUND = 1; // 0x1
-    field public static final int DEFAULT_VIBRATE = 2; // 0x2
-    field public static final java.lang.String EXTRA_BACKGROUND_IMAGE_URI = "android.backgroundImageUri";
-    field public static final java.lang.String EXTRA_BIG_TEXT = "android.bigText";
-    field public static final java.lang.String EXTRA_COMPACT_ACTIONS = "android.compactActions";
-    field public static final java.lang.String EXTRA_INFO_TEXT = "android.infoText";
-    field public static final java.lang.String EXTRA_LARGE_ICON = "android.largeIcon";
-    field public static final java.lang.String EXTRA_LARGE_ICON_BIG = "android.largeIcon.big";
-    field public static final java.lang.String EXTRA_MEDIA_SESSION = "android.mediaSession";
-    field public static final java.lang.String EXTRA_PEOPLE = "android.people";
-    field public static final java.lang.String EXTRA_PICTURE = "android.picture";
-    field public static final java.lang.String EXTRA_PROGRESS = "android.progress";
-    field public static final java.lang.String EXTRA_PROGRESS_INDETERMINATE = "android.progressIndeterminate";
-    field public static final java.lang.String EXTRA_PROGRESS_MAX = "android.progressMax";
-    field public static final java.lang.String EXTRA_SHOW_CHRONOMETER = "android.showChronometer";
-    field public static final java.lang.String EXTRA_SHOW_WHEN = "android.showWhen";
-    field public static final java.lang.String EXTRA_SMALL_ICON = "android.icon";
-    field public static final java.lang.String EXTRA_SUB_TEXT = "android.subText";
-    field public static final java.lang.String EXTRA_SUMMARY_TEXT = "android.summaryText";
-    field public static final java.lang.String EXTRA_TEMPLATE = "android.template";
-    field public static final java.lang.String EXTRA_TEXT = "android.text";
-    field public static final java.lang.String EXTRA_TEXT_LINES = "android.textLines";
-    field public static final java.lang.String EXTRA_TITLE = "android.title";
-    field public static final java.lang.String EXTRA_TITLE_BIG = "android.title.big";
-    field public static final int FLAG_AUTO_CANCEL = 16; // 0x10
-    field public static final int FLAG_FOREGROUND_SERVICE = 64; // 0x40
-    field public static final int FLAG_GROUP_SUMMARY = 512; // 0x200
-    field public static final deprecated int FLAG_HIGH_PRIORITY = 128; // 0x80
-    field public static final int FLAG_INSISTENT = 4; // 0x4
-    field public static final int FLAG_LOCAL_ONLY = 256; // 0x100
-    field public static final int FLAG_NO_CLEAR = 32; // 0x20
-    field public static final int FLAG_ONGOING_EVENT = 2; // 0x2
-    field public static final int FLAG_ONLY_ALERT_ONCE = 8; // 0x8
-    field public static final int FLAG_SHOW_LIGHTS = 1; // 0x1
-    field public static final int PRIORITY_DEFAULT = 0; // 0x0
-    field public static final int PRIORITY_HIGH = 1; // 0x1
-    field public static final int PRIORITY_LOW = -1; // 0xffffffff
-    field public static final int PRIORITY_MAX = 2; // 0x2
-    field public static final int PRIORITY_MIN = -2; // 0xfffffffe
-    field public static final int STREAM_DEFAULT = -1; // 0xffffffff
-    field public static final int VISIBILITY_PRIVATE = 0; // 0x0
-    field public static final int VISIBILITY_PUBLIC = 1; // 0x1
-    field public static final int VISIBILITY_SECRET = -1; // 0xffffffff
-  }
-
-  public static class NotificationCompat.Action extends android.support.v4.app.NotificationCompatBase.Action {
-    ctor public NotificationCompat.Action(int, java.lang.CharSequence, android.app.PendingIntent);
-    method protected android.app.PendingIntent getActionIntent();
-    method public android.os.Bundle getExtras();
-    method protected int getIcon();
-    method public android.support.v4.app.RemoteInput[] getRemoteInputs();
-    method protected java.lang.CharSequence getTitle();
-    field public android.app.PendingIntent actionIntent;
-    field public int icon;
-    field public java.lang.CharSequence title;
-  }
-
-  public static final class NotificationCompat.Action.Builder {
-    ctor public NotificationCompat.Action.Builder(int, java.lang.CharSequence, android.app.PendingIntent);
-    ctor public NotificationCompat.Action.Builder(android.support.v4.app.NotificationCompat.Action);
-    method public android.support.v4.app.NotificationCompat.Action.Builder addExtras(android.os.Bundle);
-    method public android.support.v4.app.NotificationCompat.Action.Builder addRemoteInput(android.support.v4.app.RemoteInput);
-    method public android.support.v4.app.NotificationCompat.Action build();
-    method public android.support.v4.app.NotificationCompat.Action.Builder extend(android.support.v4.app.NotificationCompat.Action.Extender);
-    method public android.os.Bundle getExtras();
-  }
-
-  public static abstract interface NotificationCompat.Action.Extender {
-    method public abstract android.support.v4.app.NotificationCompat.Action.Builder extend(android.support.v4.app.NotificationCompat.Action.Builder);
-  }
-
-  public static final class NotificationCompat.Action.WearableExtender implements android.support.v4.app.NotificationCompat.Action.Extender {
-    ctor public NotificationCompat.Action.WearableExtender();
-    ctor public NotificationCompat.Action.WearableExtender(android.support.v4.app.NotificationCompat.Action);
-    method public android.support.v4.app.NotificationCompat.Action.WearableExtender clone();
-    method public android.support.v4.app.NotificationCompat.Action.Builder extend(android.support.v4.app.NotificationCompat.Action.Builder);
-    method public java.lang.CharSequence getCancelLabel();
-    method public java.lang.CharSequence getConfirmLabel();
-    method public java.lang.CharSequence getInProgressLabel();
-    method public boolean isAvailableOffline();
-    method public android.support.v4.app.NotificationCompat.Action.WearableExtender setAvailableOffline(boolean);
-    method public android.support.v4.app.NotificationCompat.Action.WearableExtender setCancelLabel(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.Action.WearableExtender setConfirmLabel(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.Action.WearableExtender setInProgressLabel(java.lang.CharSequence);
-  }
-
-  public static class NotificationCompat.BigPictureStyle extends android.support.v4.app.NotificationCompat.Style {
-    ctor public NotificationCompat.BigPictureStyle();
-    ctor public NotificationCompat.BigPictureStyle(android.support.v4.app.NotificationCompat.Builder);
-    method public android.support.v4.app.NotificationCompat.BigPictureStyle bigLargeIcon(android.graphics.Bitmap);
-    method public android.support.v4.app.NotificationCompat.BigPictureStyle bigPicture(android.graphics.Bitmap);
-    method public android.support.v4.app.NotificationCompat.BigPictureStyle setBigContentTitle(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.BigPictureStyle setSummaryText(java.lang.CharSequence);
-  }
-
-  public static class NotificationCompat.BigTextStyle extends android.support.v4.app.NotificationCompat.Style {
-    ctor public NotificationCompat.BigTextStyle();
-    ctor public NotificationCompat.BigTextStyle(android.support.v4.app.NotificationCompat.Builder);
-    method public android.support.v4.app.NotificationCompat.BigTextStyle bigText(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.BigTextStyle setBigContentTitle(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.BigTextStyle setSummaryText(java.lang.CharSequence);
-  }
-
-  public static class NotificationCompat.Builder {
-    ctor public NotificationCompat.Builder(android.content.Context);
-    method public android.support.v4.app.NotificationCompat.Builder addAction(int, java.lang.CharSequence, android.app.PendingIntent);
-    method public android.support.v4.app.NotificationCompat.Builder addAction(android.support.v4.app.NotificationCompat.Action);
-    method public android.support.v4.app.NotificationCompat.Builder addExtras(android.os.Bundle);
-    method public android.support.v4.app.NotificationCompat.Builder addPerson(java.lang.String);
-    method public android.app.Notification build();
-    method public android.support.v4.app.NotificationCompat.Builder extend(android.support.v4.app.NotificationCompat.Extender);
-    method public android.os.Bundle getExtras();
-    method public deprecated android.app.Notification getNotification();
-    method protected static java.lang.CharSequence limitCharSequenceLength(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.Builder setAutoCancel(boolean);
-    method public android.support.v4.app.NotificationCompat.Builder setCategory(java.lang.String);
-    method public android.support.v4.app.NotificationCompat.Builder setColor(int);
-    method public android.support.v4.app.NotificationCompat.Builder setContent(android.widget.RemoteViews);
-    method public android.support.v4.app.NotificationCompat.Builder setContentInfo(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.Builder setContentIntent(android.app.PendingIntent);
-    method public android.support.v4.app.NotificationCompat.Builder setContentText(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.Builder setContentTitle(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.Builder setDefaults(int);
-    method public android.support.v4.app.NotificationCompat.Builder setDeleteIntent(android.app.PendingIntent);
-    method public android.support.v4.app.NotificationCompat.Builder setExtras(android.os.Bundle);
-    method public android.support.v4.app.NotificationCompat.Builder setFullScreenIntent(android.app.PendingIntent, boolean);
-    method public android.support.v4.app.NotificationCompat.Builder setGroup(java.lang.String);
-    method public android.support.v4.app.NotificationCompat.Builder setGroupSummary(boolean);
-    method public android.support.v4.app.NotificationCompat.Builder setLargeIcon(android.graphics.Bitmap);
-    method public android.support.v4.app.NotificationCompat.Builder setLights(int, int, int);
-    method public android.support.v4.app.NotificationCompat.Builder setLocalOnly(boolean);
-    method public android.support.v4.app.NotificationCompat.Builder setNumber(int);
-    method public android.support.v4.app.NotificationCompat.Builder setOngoing(boolean);
-    method public android.support.v4.app.NotificationCompat.Builder setOnlyAlertOnce(boolean);
-    method public android.support.v4.app.NotificationCompat.Builder setPriority(int);
-    method public android.support.v4.app.NotificationCompat.Builder setProgress(int, int, boolean);
-    method public android.support.v4.app.NotificationCompat.Builder setPublicVersion(android.app.Notification);
-    method public android.support.v4.app.NotificationCompat.Builder setShowWhen(boolean);
-    method public android.support.v4.app.NotificationCompat.Builder setSmallIcon(int);
-    method public android.support.v4.app.NotificationCompat.Builder setSmallIcon(int, int);
-    method public android.support.v4.app.NotificationCompat.Builder setSortKey(java.lang.String);
-    method public android.support.v4.app.NotificationCompat.Builder setSound(android.net.Uri);
-    method public android.support.v4.app.NotificationCompat.Builder setSound(android.net.Uri, int);
-    method public android.support.v4.app.NotificationCompat.Builder setStyle(android.support.v4.app.NotificationCompat.Style);
-    method public android.support.v4.app.NotificationCompat.Builder setSubText(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.Builder setTicker(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.Builder setTicker(java.lang.CharSequence, android.widget.RemoteViews);
-    method public android.support.v4.app.NotificationCompat.Builder setUsesChronometer(boolean);
-    method public android.support.v4.app.NotificationCompat.Builder setVibrate(long[]);
-    method public android.support.v4.app.NotificationCompat.Builder setVisibility(int);
-    method public android.support.v4.app.NotificationCompat.Builder setWhen(long);
-    field public java.util.ArrayList<java.lang.String> mPeople;
-  }
-
-  public static final class NotificationCompat.CarExtender implements android.support.v4.app.NotificationCompat.Extender {
-    ctor public NotificationCompat.CarExtender();
-    ctor public NotificationCompat.CarExtender(android.app.Notification);
-    method public android.support.v4.app.NotificationCompat.Builder extend(android.support.v4.app.NotificationCompat.Builder);
-    method public int getColor();
-    method public android.graphics.Bitmap getLargeIcon();
-    method public android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation getUnreadConversation();
-    method public android.support.v4.app.NotificationCompat.CarExtender setColor(int);
-    method public android.support.v4.app.NotificationCompat.CarExtender setLargeIcon(android.graphics.Bitmap);
-    method public android.support.v4.app.NotificationCompat.CarExtender setUnreadConversation(android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation);
-  }
-
-  public static class NotificationCompat.CarExtender.UnreadConversation extends android.support.v4.app.NotificationCompatBase.UnreadConversation {
-    method public long getLatestTimestamp();
-    method public java.lang.String[] getMessages();
-    method public java.lang.String getParticipant();
-    method public java.lang.String[] getParticipants();
-    method public android.app.PendingIntent getReadPendingIntent();
-    method public android.support.v4.app.RemoteInput getRemoteInput();
-    method public android.app.PendingIntent getReplyPendingIntent();
-  }
-
-  public static class NotificationCompat.CarExtender.UnreadConversation.Builder {
-    ctor public NotificationCompat.CarExtender.UnreadConversation.Builder(java.lang.String);
-    method public android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation.Builder addMessage(java.lang.String);
-    method public android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation build();
-    method public android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation.Builder setLatestTimestamp(long);
-    method public android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation.Builder setReadPendingIntent(android.app.PendingIntent);
-    method public android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation.Builder setReplyAction(android.app.PendingIntent, android.support.v4.app.RemoteInput);
-  }
-
-  public static abstract interface NotificationCompat.Extender {
-    method public abstract android.support.v4.app.NotificationCompat.Builder extend(android.support.v4.app.NotificationCompat.Builder);
-  }
-
-  public static class NotificationCompat.InboxStyle extends android.support.v4.app.NotificationCompat.Style {
-    ctor public NotificationCompat.InboxStyle();
-    ctor public NotificationCompat.InboxStyle(android.support.v4.app.NotificationCompat.Builder);
-    method public android.support.v4.app.NotificationCompat.InboxStyle addLine(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.InboxStyle setBigContentTitle(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.InboxStyle setSummaryText(java.lang.CharSequence);
-  }
-
-  public static abstract class NotificationCompat.Style {
-    ctor public NotificationCompat.Style();
-    method public android.app.Notification build();
-    method public void setBuilder(android.support.v4.app.NotificationCompat.Builder);
-  }
-
-  public static final class NotificationCompat.WearableExtender implements android.support.v4.app.NotificationCompat.Extender {
-    ctor public NotificationCompat.WearableExtender();
-    ctor public NotificationCompat.WearableExtender(android.app.Notification);
-    method public android.support.v4.app.NotificationCompat.WearableExtender addAction(android.support.v4.app.NotificationCompat.Action);
-    method public android.support.v4.app.NotificationCompat.WearableExtender addActions(java.util.List<android.support.v4.app.NotificationCompat.Action>);
-    method public android.support.v4.app.NotificationCompat.WearableExtender addPage(android.app.Notification);
-    method public android.support.v4.app.NotificationCompat.WearableExtender addPages(java.util.List<android.app.Notification>);
-    method public android.support.v4.app.NotificationCompat.WearableExtender clearActions();
-    method public android.support.v4.app.NotificationCompat.WearableExtender clearPages();
-    method public android.support.v4.app.NotificationCompat.WearableExtender clone();
-    method public android.support.v4.app.NotificationCompat.Builder extend(android.support.v4.app.NotificationCompat.Builder);
-    method public java.util.List<android.support.v4.app.NotificationCompat.Action> getActions();
-    method public android.graphics.Bitmap getBackground();
-    method public int getContentAction();
-    method public int getContentIcon();
-    method public int getContentIconGravity();
-    method public boolean getContentIntentAvailableOffline();
-    method public int getCustomContentHeight();
-    method public int getCustomSizePreset();
-    method public android.app.PendingIntent getDisplayIntent();
-    method public int getGravity();
-    method public boolean getHintAvoidBackgroundClipping();
-    method public boolean getHintHideIcon();
-    method public int getHintScreenTimeout();
-    method public boolean getHintShowBackgroundOnly();
-    method public java.util.List<android.app.Notification> getPages();
-    method public boolean getStartScrollBottom();
-    method public android.support.v4.app.NotificationCompat.WearableExtender setBackground(android.graphics.Bitmap);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setContentAction(int);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setContentIcon(int);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setContentIconGravity(int);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setContentIntentAvailableOffline(boolean);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setCustomContentHeight(int);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setCustomSizePreset(int);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setDisplayIntent(android.app.PendingIntent);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setGravity(int);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setHintAvoidBackgroundClipping(boolean);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setHintHideIcon(boolean);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setHintScreenTimeout(int);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setHintShowBackgroundOnly(boolean);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setStartScrollBottom(boolean);
-    field public static final int SCREEN_TIMEOUT_LONG = -1; // 0xffffffff
-    field public static final int SCREEN_TIMEOUT_SHORT = 0; // 0x0
-    field public static final int SIZE_DEFAULT = 0; // 0x0
-    field public static final int SIZE_FULL_SCREEN = 5; // 0x5
-    field public static final int SIZE_LARGE = 4; // 0x4
-    field public static final int SIZE_MEDIUM = 3; // 0x3
-    field public static final int SIZE_SMALL = 2; // 0x2
-    field public static final int SIZE_XSMALL = 1; // 0x1
-    field public static final int UNSET_ACTION_INDEX = -1; // 0xffffffff
-  }
-
-   class NotificationCompatBase {
-  }
-
-  public static abstract class NotificationCompatBase.Action {
-    ctor public NotificationCompatBase.Action();
-    method protected abstract android.app.PendingIntent getActionIntent();
-    method protected abstract android.os.Bundle getExtras();
-    method protected abstract int getIcon();
-    method protected abstract android.support.v4.app.RemoteInputCompatBase.RemoteInput[] getRemoteInputs();
-    method protected abstract java.lang.CharSequence getTitle();
-  }
-
-  public static abstract class NotificationCompatBase.UnreadConversation {
-    ctor public NotificationCompatBase.UnreadConversation();
-  }
-
-  public final class NotificationCompatExtras {
-    field public static final java.lang.String EXTRA_ACTION_EXTRAS = "android.support.actionExtras";
-    field public static final java.lang.String EXTRA_GROUP_KEY = "android.support.groupKey";
-    field public static final java.lang.String EXTRA_GROUP_SUMMARY = "android.support.isGroupSummary";
-    field public static final java.lang.String EXTRA_LOCAL_ONLY = "android.support.localOnly";
-    field public static final java.lang.String EXTRA_REMOTE_INPUTS = "android.support.remoteInputs";
-    field public static final java.lang.String EXTRA_SORT_KEY = "android.support.sortKey";
-  }
-
-  public abstract class NotificationCompatSideChannelService extends android.app.Service {
-    ctor public NotificationCompatSideChannelService();
-    method public abstract void cancel(java.lang.String, int, java.lang.String);
-    method public abstract void cancelAll(java.lang.String);
-    method public abstract void notify(java.lang.String, int, java.lang.String, android.app.Notification);
-    method public android.os.IBinder onBind(android.content.Intent);
-  }
-
-  public class NotificationManagerCompat {
-    method public void cancel(int);
-    method public void cancel(java.lang.String, int);
-    method public void cancelAll();
-    method public static android.support.v4.app.NotificationManagerCompat from(android.content.Context);
-    method public static java.util.Set<java.lang.String> getEnabledListenerPackages(android.content.Context);
-    method public void notify(int, android.app.Notification);
-    method public void notify(java.lang.String, int, android.app.Notification);
-    field public static final java.lang.String ACTION_BIND_SIDE_CHANNEL = "android.support.BIND_NOTIFICATION_SIDE_CHANNEL";
-    field public static final java.lang.String EXTRA_USE_SIDE_CHANNEL = "android.support.useSideChannel";
-  }
-
-  public class RemoteInput extends android.support.v4.app.RemoteInputCompatBase.RemoteInput {
-    method public static void addResultsToIntent(android.support.v4.app.RemoteInput[], android.content.Intent, android.os.Bundle);
-    method public boolean getAllowFreeFormInput();
-    method public java.lang.CharSequence[] getChoices();
-    method public android.os.Bundle getExtras();
-    method public java.lang.CharSequence getLabel();
-    method public java.lang.String getResultKey();
-    method public static android.os.Bundle getResultsFromIntent(android.content.Intent);
-    field public static final java.lang.String EXTRA_RESULTS_DATA = "android.remoteinput.resultsData";
-    field public static final java.lang.String RESULTS_CLIP_LABEL = "android.remoteinput.results";
-  }
-
-  public static final class RemoteInput.Builder {
-    ctor public RemoteInput.Builder(java.lang.String);
-    method public android.support.v4.app.RemoteInput.Builder addExtras(android.os.Bundle);
-    method public android.support.v4.app.RemoteInput build();
-    method public android.os.Bundle getExtras();
-    method public android.support.v4.app.RemoteInput.Builder setAllowFreeFormInput(boolean);
-    method public android.support.v4.app.RemoteInput.Builder setChoices(java.lang.CharSequence[]);
-    method public android.support.v4.app.RemoteInput.Builder setLabel(java.lang.CharSequence);
-  }
-
-   class RemoteInputCompatBase {
-  }
-
-  public static abstract class RemoteInputCompatBase.RemoteInput {
-    ctor public RemoteInputCompatBase.RemoteInput();
-    method protected abstract boolean getAllowFreeFormInput();
-    method protected abstract java.lang.CharSequence[] getChoices();
-    method protected abstract android.os.Bundle getExtras();
-    method protected abstract java.lang.CharSequence getLabel();
-    method protected abstract java.lang.String getResultKey();
-  }
-
-  public class ServiceCompat {
-    field public static final int START_STICKY = 1; // 0x1
-  }
-
-  public class ShareCompat {
-    ctor public ShareCompat();
-    method public static void configureMenuItem(android.view.MenuItem, android.support.v4.app.ShareCompat.IntentBuilder);
-    method public static void configureMenuItem(android.view.Menu, int, android.support.v4.app.ShareCompat.IntentBuilder);
-    method public static android.content.ComponentName getCallingActivity(android.app.Activity);
-    method public static java.lang.String getCallingPackage(android.app.Activity);
-    field public static final java.lang.String EXTRA_CALLING_ACTIVITY = "android.support.v4.app.EXTRA_CALLING_ACTIVITY";
-    field public static final java.lang.String EXTRA_CALLING_PACKAGE = "android.support.v4.app.EXTRA_CALLING_PACKAGE";
-  }
-
-  public static class ShareCompat.IntentBuilder {
-    method public android.support.v4.app.ShareCompat.IntentBuilder addEmailBcc(java.lang.String);
-    method public android.support.v4.app.ShareCompat.IntentBuilder addEmailBcc(java.lang.String[]);
-    method public android.support.v4.app.ShareCompat.IntentBuilder addEmailCc(java.lang.String);
-    method public android.support.v4.app.ShareCompat.IntentBuilder addEmailCc(java.lang.String[]);
-    method public android.support.v4.app.ShareCompat.IntentBuilder addEmailTo(java.lang.String);
-    method public android.support.v4.app.ShareCompat.IntentBuilder addEmailTo(java.lang.String[]);
-    method public android.support.v4.app.ShareCompat.IntentBuilder addStream(android.net.Uri);
-    method public android.content.Intent createChooserIntent();
-    method public static android.support.v4.app.ShareCompat.IntentBuilder from(android.app.Activity);
-    method public android.content.Intent getIntent();
-    method public android.support.v4.app.ShareCompat.IntentBuilder setChooserTitle(java.lang.CharSequence);
-    method public android.support.v4.app.ShareCompat.IntentBuilder setChooserTitle(int);
-    method public android.support.v4.app.ShareCompat.IntentBuilder setEmailBcc(java.lang.String[]);
-    method public android.support.v4.app.ShareCompat.IntentBuilder setEmailCc(java.lang.String[]);
-    method public android.support.v4.app.ShareCompat.IntentBuilder setEmailTo(java.lang.String[]);
-    method public android.support.v4.app.ShareCompat.IntentBuilder setHtmlText(java.lang.String);
-    method public android.support.v4.app.ShareCompat.IntentBuilder setStream(android.net.Uri);
-    method public android.support.v4.app.ShareCompat.IntentBuilder setSubject(java.lang.String);
-    method public android.support.v4.app.ShareCompat.IntentBuilder setText(java.lang.CharSequence);
-    method public android.support.v4.app.ShareCompat.IntentBuilder setType(java.lang.String);
-    method public void startChooser();
-  }
-
-  public static class ShareCompat.IntentReader {
-    method public static android.support.v4.app.ShareCompat.IntentReader from(android.app.Activity);
-    method public android.content.ComponentName getCallingActivity();
-    method public android.graphics.drawable.Drawable getCallingActivityIcon();
-    method public android.graphics.drawable.Drawable getCallingApplicationIcon();
-    method public java.lang.CharSequence getCallingApplicationLabel();
-    method public java.lang.String getCallingPackage();
-    method public java.lang.String[] getEmailBcc();
-    method public java.lang.String[] getEmailCc();
-    method public java.lang.String[] getEmailTo();
-    method public java.lang.String getHtmlText();
-    method public android.net.Uri getStream();
-    method public android.net.Uri getStream(int);
-    method public int getStreamCount();
-    method public java.lang.String getSubject();
-    method public java.lang.CharSequence getText();
-    method public java.lang.String getType();
-    method public boolean isMultipleShare();
-    method public boolean isShareIntent();
-    method public boolean isSingleShare();
-  }
-
-  public abstract class SharedElementCallback {
-    ctor public SharedElementCallback();
-    method public android.os.Parcelable onCaptureSharedElementSnapshot(android.view.View, android.graphics.Matrix, android.graphics.RectF);
-    method public android.view.View onCreateSnapshotView(android.content.Context, android.os.Parcelable);
-    method public void onMapSharedElements(java.util.List<java.lang.String>, java.util.Map<java.lang.String, android.view.View>);
-    method public void onRejectSharedElements(java.util.List<android.view.View>);
-    method public void onSharedElementEnd(java.util.List<java.lang.String>, java.util.List<android.view.View>, java.util.List<android.view.View>);
-    method public void onSharedElementStart(java.util.List<java.lang.String>, java.util.List<android.view.View>, java.util.List<android.view.View>);
-  }
-
-  public class TaskStackBuilder implements java.lang.Iterable {
-    method public android.support.v4.app.TaskStackBuilder addNextIntent(android.content.Intent);
-    method public android.support.v4.app.TaskStackBuilder addNextIntentWithParentStack(android.content.Intent);
-    method public android.support.v4.app.TaskStackBuilder addParentStack(android.app.Activity);
-    method public android.support.v4.app.TaskStackBuilder addParentStack(java.lang.Class<?>);
-    method public android.support.v4.app.TaskStackBuilder addParentStack(android.content.ComponentName);
-    method public static android.support.v4.app.TaskStackBuilder create(android.content.Context);
-    method public android.content.Intent editIntentAt(int);
-    method public static deprecated android.support.v4.app.TaskStackBuilder from(android.content.Context);
-    method public deprecated android.content.Intent getIntent(int);
-    method public int getIntentCount();
-    method public android.content.Intent[] getIntents();
-    method public android.app.PendingIntent getPendingIntent(int, int);
-    method public android.app.PendingIntent getPendingIntent(int, int, android.os.Bundle);
-    method public deprecated java.util.Iterator<android.content.Intent> iterator();
-    method public void startActivities();
-    method public void startActivities(android.os.Bundle);
-  }
-
-  public static abstract interface TaskStackBuilder.SupportParentable {
-    method public abstract android.content.Intent getSupportParentActivityIntent();
-  }
-
-}
-
-package android.support.v4.content {
-
-  public abstract class AsyncTaskLoader extends android.support.v4.content.Loader {
-    ctor public AsyncTaskLoader(android.content.Context);
-    method public boolean cancelLoad();
-    method public abstract D loadInBackground();
-    method public void onCanceled(D);
-    method protected D onLoadInBackground();
-    method public void setUpdateThrottle(long);
-  }
-
-  public class ContextCompat {
-    ctor public ContextCompat();
-    method public final java.io.File getCodeCacheDir(android.content.Context);
-    method public static final android.graphics.drawable.Drawable getDrawable(android.content.Context, int);
-    method public static java.io.File[] getExternalCacheDirs(android.content.Context);
-    method public static java.io.File[] getExternalFilesDirs(android.content.Context, java.lang.String);
-    method public final java.io.File getNoBackupFilesDir(android.content.Context);
-    method public static java.io.File[] getObbDirs(android.content.Context);
-    method public static boolean startActivities(android.content.Context, android.content.Intent[]);
-    method public static boolean startActivities(android.content.Context, android.content.Intent[], android.os.Bundle);
-  }
-
-  public class CursorLoader extends android.support.v4.content.AsyncTaskLoader {
-    ctor public CursorLoader(android.content.Context);
-    ctor public CursorLoader(android.content.Context, android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String);
-    method public void deliverResult(android.database.Cursor);
-    method public java.lang.String[] getProjection();
-    method public java.lang.String getSelection();
-    method public java.lang.String[] getSelectionArgs();
-    method public java.lang.String getSortOrder();
-    method public android.net.Uri getUri();
-    method public android.database.Cursor loadInBackground();
-    method public void onCanceled(android.database.Cursor);
-    method public void setProjection(java.lang.String[]);
-    method public void setSelection(java.lang.String);
-    method public void setSelectionArgs(java.lang.String[]);
-    method public void setSortOrder(java.lang.String);
-    method public void setUri(android.net.Uri);
-  }
-
-  public class FileProvider extends android.content.ContentProvider {
-    ctor public FileProvider();
-    method public int delete(android.net.Uri, java.lang.String, java.lang.String[]);
-    method public java.lang.String getType(android.net.Uri);
-    method public static android.net.Uri getUriForFile(android.content.Context, java.lang.String, java.io.File);
-    method public android.net.Uri insert(android.net.Uri, android.content.ContentValues);
-    method public boolean onCreate();
-    method public android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String);
-    method public int update(android.net.Uri, android.content.ContentValues, java.lang.String, java.lang.String[]);
-  }
-
-  public class IntentCompat {
-    method public static android.content.Intent makeMainActivity(android.content.ComponentName);
-    method public static android.content.Intent makeMainSelectorActivity(java.lang.String, java.lang.String);
-    method public static android.content.Intent makeRestartActivityTask(android.content.ComponentName);
-    field public static final java.lang.String ACTION_EXTERNAL_APPLICATIONS_AVAILABLE = "android.intent.action.EXTERNAL_APPLICATIONS_AVAILABLE";
-    field public static final java.lang.String ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE = "android.intent.action.EXTERNAL_APPLICATIONS_UNAVAILABLE";
-    field public static final java.lang.String EXTRA_CHANGED_PACKAGE_LIST = "android.intent.extra.changed_package_list";
-    field public static final java.lang.String EXTRA_CHANGED_UID_LIST = "android.intent.extra.changed_uid_list";
-    field public static final java.lang.String EXTRA_HTML_TEXT = "android.intent.extra.HTML_TEXT";
-    field public static final int FLAG_ACTIVITY_CLEAR_TASK = 32768; // 0x8000
-    field public static final int FLAG_ACTIVITY_TASK_ON_HOME = 16384; // 0x4000
-  }
-
-  public class Loader {
-    ctor public Loader(android.content.Context);
-    method public void abandon();
-    method public void commitContentChanged();
-    method public java.lang.String dataToString(D);
-    method public void deliverResult(D);
-    method public void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
-    method public void forceLoad();
-    method public android.content.Context getContext();
-    method public int getId();
-    method public boolean isAbandoned();
-    method public boolean isReset();
-    method public boolean isStarted();
-    method protected void onAbandon();
-    method public void onContentChanged();
-    method protected void onForceLoad();
-    method protected void onReset();
-    method protected void onStartLoading();
-    method protected void onStopLoading();
-    method public void registerListener(int, android.support.v4.content.Loader.OnLoadCompleteListener<D>);
-    method public void reset();
-    method public void rollbackContentChanged();
-    method public final void startLoading();
-    method public void stopLoading();
-    method public boolean takeContentChanged();
-    method public void unregisterListener(android.support.v4.content.Loader.OnLoadCompleteListener<D>);
-  }
-
-  public final class Loader.ForceLoadContentObserver extends android.database.ContentObserver {
-    ctor public Loader.ForceLoadContentObserver();
-  }
-
-  public static abstract interface Loader.OnLoadCompleteListener {
-    method public abstract void onLoadComplete(android.support.v4.content.Loader<D>, D);
-  }
-
-  public class LocalBroadcastManager {
-    method public static android.support.v4.content.LocalBroadcastManager getInstance(android.content.Context);
-    method public void registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter);
-    method public boolean sendBroadcast(android.content.Intent);
-    method public void sendBroadcastSync(android.content.Intent);
-    method public void unregisterReceiver(android.content.BroadcastReceiver);
-  }
-
-  public abstract class WakefulBroadcastReceiver extends android.content.BroadcastReceiver {
-    ctor public WakefulBroadcastReceiver();
-    method public static boolean completeWakefulIntent(android.content.Intent);
-    method public static android.content.ComponentName startWakefulService(android.content.Context, android.content.Intent);
-  }
-
-}
-
-package android.support.v4.content.pm {
-
-  public class ActivityInfoCompat {
-    field public static final int CONFIG_UI_MODE = 512; // 0x200
-  }
-
-}
-
-package android.support.v4.content.res {
-
-  public class ResourcesCompat {
-    ctor public ResourcesCompat();
-    method public static android.graphics.drawable.Drawable getDrawable(android.content.res.Resources, int, android.content.res.Resources.Theme) throws android.content.res.Resources.NotFoundException;
-    method public static android.graphics.drawable.Drawable getDrawableForDensity(android.content.res.Resources, int, int, android.content.res.Resources.Theme) throws android.content.res.Resources.NotFoundException;
-  }
-
-}
-
-package android.support.v4.database {
-
-  public class DatabaseUtilsCompat {
-    method public static java.lang.String[] appendSelectionArgs(java.lang.String[], java.lang.String[]);
-    method public static java.lang.String concatenateWhere(java.lang.String, java.lang.String);
-  }
-
-}
-
-package android.support.v4.graphics {
-
-  public class BitmapCompat {
-    ctor public BitmapCompat();
-    method public static int getAllocationByteCount(android.graphics.Bitmap);
-    method public static boolean hasMipMap(android.graphics.Bitmap);
-    method public static void setHasMipMap(android.graphics.Bitmap, boolean);
-  }
-
-  public class ColorUtils {
-    method public static int HSLToColor(float[]);
-    method public static void RGBToHSL(int, int, int, float[]);
-    method public static double calculateContrast(int, int);
-    method public static double calculateLuminance(int);
-    method public static int calculateMinimumAlpha(int, int, float);
-    method public static void colorToHSL(int, float[]);
-    method public static int compositeColors(int, int);
-    method public static int setAlphaComponent(int, int);
-  }
-
-}
-
-package android.support.v4.graphics.drawable {
-
-  public class DrawableCompat {
-    ctor public DrawableCompat();
-    method public static boolean isAutoMirrored(android.graphics.drawable.Drawable);
-    method public static void jumpToCurrentState(android.graphics.drawable.Drawable);
-    method public static void setAutoMirrored(android.graphics.drawable.Drawable, boolean);
-    method public static void setHotspot(android.graphics.drawable.Drawable, float, float);
-    method public static void setHotspotBounds(android.graphics.drawable.Drawable, int, int, int, int);
-    method public static void setTint(android.graphics.drawable.Drawable, int);
-    method public static void setTintList(android.graphics.drawable.Drawable, android.content.res.ColorStateList);
-    method public static void setTintMode(android.graphics.drawable.Drawable, android.graphics.PorterDuff.Mode);
-    method public static T unwrap(android.graphics.drawable.Drawable);
-    method public static android.graphics.drawable.Drawable wrap(android.graphics.drawable.Drawable);
-  }
-
-  public abstract class RoundedBitmapDrawable extends android.graphics.drawable.Drawable {
-    method public void draw(android.graphics.Canvas);
-    method public final android.graphics.Bitmap getBitmap();
-    method public float getCornerRadius();
-    method public int getGravity();
-    method public int getOpacity();
-    method public final android.graphics.Paint getPaint();
-    method public boolean hasAntiAlias();
-    method public boolean hasMipMap();
-    method public void setAlpha(int);
-    method public void setAntiAlias(boolean);
-    method public void setColorFilter(android.graphics.ColorFilter);
-    method public void setCornerRadius(float);
-    method public void setGravity(int);
-    method public void setMipMap(boolean);
-    method public void setTargetDensity(android.graphics.Canvas);
-    method public void setTargetDensity(android.util.DisplayMetrics);
-    method public void setTargetDensity(int);
-  }
-
-  public class RoundedBitmapDrawableFactory {
-    ctor public RoundedBitmapDrawableFactory();
-    method public static android.support.v4.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, android.graphics.Bitmap);
-    method public static android.support.v4.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, java.lang.String);
-    method public static android.support.v4.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, java.io.InputStream);
-  }
-
-}
-
-package android.support.v4.hardware.display {
-
-  public abstract class DisplayManagerCompat {
-    method public abstract android.view.Display getDisplay(int);
-    method public abstract android.view.Display[] getDisplays();
-    method public abstract android.view.Display[] getDisplays(java.lang.String);
-    method public static android.support.v4.hardware.display.DisplayManagerCompat getInstance(android.content.Context);
-    field public static final java.lang.String DISPLAY_CATEGORY_PRESENTATION = "android.hardware.display.category.PRESENTATION";
-  }
-
-}
-
-package android.support.v4.media {
-
-  public final class MediaDescriptionCompat implements android.os.Parcelable {
-    method public int describeContents();
-    method public static android.support.v4.media.MediaDescriptionCompat fromMediaDescription(java.lang.Object);
-    method public java.lang.CharSequence getDescription();
-    method public android.os.Bundle getExtras();
-    method public android.graphics.Bitmap getIconBitmap();
-    method public android.net.Uri getIconUri();
-    method public java.lang.Object getMediaDescription();
-    method public java.lang.String getMediaId();
-    method public java.lang.CharSequence getSubtitle();
-    method public java.lang.CharSequence getTitle();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.support.v4.media.MediaDescriptionCompat> CREATOR;
-  }
-
-  public static final class MediaDescriptionCompat.Builder {
-    ctor public MediaDescriptionCompat.Builder();
-    method public android.support.v4.media.MediaDescriptionCompat build();
-    method public android.support.v4.media.MediaDescriptionCompat.Builder setDescription(java.lang.CharSequence);
-    method public android.support.v4.media.MediaDescriptionCompat.Builder setExtras(android.os.Bundle);
-    method public android.support.v4.media.MediaDescriptionCompat.Builder setIconBitmap(android.graphics.Bitmap);
-    method public android.support.v4.media.MediaDescriptionCompat.Builder setIconUri(android.net.Uri);
-    method public android.support.v4.media.MediaDescriptionCompat.Builder setMediaId(java.lang.String);
-    method public android.support.v4.media.MediaDescriptionCompat.Builder setSubtitle(java.lang.CharSequence);
-    method public android.support.v4.media.MediaDescriptionCompat.Builder setTitle(java.lang.CharSequence);
-  }
-
-  public final class MediaMetadataCompat implements android.os.Parcelable {
-    method public boolean containsKey(java.lang.String);
-    method public int describeContents();
-    method public static android.support.v4.media.MediaMetadataCompat fromMediaMetadata(java.lang.Object);
-    method public android.graphics.Bitmap getBitmap(java.lang.String);
-    method public android.os.Bundle getBundle();
-    method public android.support.v4.media.MediaDescriptionCompat getDescription();
-    method public long getLong(java.lang.String);
-    method public java.lang.Object getMediaMetadata();
-    method public android.support.v4.media.RatingCompat getRating(java.lang.String);
-    method public java.lang.String getString(java.lang.String);
-    method public java.lang.CharSequence getText(java.lang.String);
-    method public java.util.Set<java.lang.String> keySet();
-    method public int size();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.support.v4.media.MediaMetadataCompat> CREATOR;
-    field public static final java.lang.String METADATA_KEY_ALBUM = "android.media.metadata.ALBUM";
-    field public static final java.lang.String METADATA_KEY_ALBUM_ART = "android.media.metadata.ALBUM_ART";
-    field public static final java.lang.String METADATA_KEY_ALBUM_ARTIST = "android.media.metadata.ALBUM_ARTIST";
-    field public static final java.lang.String METADATA_KEY_ALBUM_ART_URI = "android.media.metadata.ALBUM_ART_URI";
-    field public static final java.lang.String METADATA_KEY_ART = "android.media.metadata.ART";
-    field public static final java.lang.String METADATA_KEY_ARTIST = "android.media.metadata.ARTIST";
-    field public static final java.lang.String METADATA_KEY_ART_URI = "android.media.metadata.ART_URI";
-    field public static final java.lang.String METADATA_KEY_AUTHOR = "android.media.metadata.AUTHOR";
-    field public static final java.lang.String METADATA_KEY_COMPILATION = "android.media.metadata.COMPILATION";
-    field public static final java.lang.String METADATA_KEY_COMPOSER = "android.media.metadata.COMPOSER";
-    field public static final java.lang.String METADATA_KEY_DATE = "android.media.metadata.DATE";
-    field public static final java.lang.String METADATA_KEY_DISC_NUMBER = "android.media.metadata.DISC_NUMBER";
-    field public static final java.lang.String METADATA_KEY_DISPLAY_DESCRIPTION = "android.media.metadata.DISPLAY_DESCRIPTION";
-    field public static final java.lang.String METADATA_KEY_DISPLAY_ICON = "android.media.metadata.DISPLAY_ICON";
-    field public static final java.lang.String METADATA_KEY_DISPLAY_ICON_URI = "android.media.metadata.DISPLAY_ICON_URI";
-    field public static final java.lang.String METADATA_KEY_DISPLAY_SUBTITLE = "android.media.metadata.DISPLAY_SUBTITLE";
-    field public static final java.lang.String METADATA_KEY_DISPLAY_TITLE = "android.media.metadata.DISPLAY_TITLE";
-    field public static final java.lang.String METADATA_KEY_DURATION = "android.media.metadata.DURATION";
-    field public static final java.lang.String METADATA_KEY_GENRE = "android.media.metadata.GENRE";
-    field public static final java.lang.String METADATA_KEY_MEDIA_ID = "android.media.metadata.MEDIA_ID";
-    field public static final java.lang.String METADATA_KEY_NUM_TRACKS = "android.media.metadata.NUM_TRACKS";
-    field public static final java.lang.String METADATA_KEY_RATING = "android.media.metadata.RATING";
-    field public static final java.lang.String METADATA_KEY_TITLE = "android.media.metadata.TITLE";
-    field public static final java.lang.String METADATA_KEY_TRACK_NUMBER = "android.media.metadata.TRACK_NUMBER";
-    field public static final java.lang.String METADATA_KEY_USER_RATING = "android.media.metadata.USER_RATING";
-    field public static final java.lang.String METADATA_KEY_WRITER = "android.media.metadata.WRITER";
-    field public static final java.lang.String METADATA_KEY_YEAR = "android.media.metadata.YEAR";
-  }
-
-  public static final class MediaMetadataCompat.Builder {
-    ctor public MediaMetadataCompat.Builder();
-    ctor public MediaMetadataCompat.Builder(android.support.v4.media.MediaMetadataCompat);
-    method public android.support.v4.media.MediaMetadataCompat build();
-    method public android.support.v4.media.MediaMetadataCompat.Builder putBitmap(java.lang.String, android.graphics.Bitmap);
-    method public android.support.v4.media.MediaMetadataCompat.Builder putLong(java.lang.String, long);
-    method public android.support.v4.media.MediaMetadataCompat.Builder putRating(java.lang.String, android.support.v4.media.RatingCompat);
-    method public android.support.v4.media.MediaMetadataCompat.Builder putString(java.lang.String, java.lang.String);
-    method public android.support.v4.media.MediaMetadataCompat.Builder putText(java.lang.String, java.lang.CharSequence);
-  }
-
-  public final class RatingCompat implements android.os.Parcelable {
-    method public int describeContents();
-    method public static android.support.v4.media.RatingCompat fromRating(java.lang.Object);
-    method public float getPercentRating();
-    method public java.lang.Object getRating();
-    method public int getRatingStyle();
-    method public float getStarRating();
-    method public boolean hasHeart();
-    method public boolean isRated();
-    method public boolean isThumbUp();
-    method public static android.support.v4.media.RatingCompat newHeartRating(boolean);
-    method public static android.support.v4.media.RatingCompat newPercentageRating(float);
-    method public static android.support.v4.media.RatingCompat newStarRating(int, float);
-    method public static android.support.v4.media.RatingCompat newThumbRating(boolean);
-    method public static android.support.v4.media.RatingCompat newUnratedRating(int);
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.support.v4.media.RatingCompat> CREATOR;
-    field public static final int RATING_3_STARS = 3; // 0x3
-    field public static final int RATING_4_STARS = 4; // 0x4
-    field public static final int RATING_5_STARS = 5; // 0x5
-    field public static final int RATING_HEART = 1; // 0x1
-    field public static final int RATING_NONE = 0; // 0x0
-    field public static final int RATING_PERCENTAGE = 6; // 0x6
-    field public static final int RATING_THUMB_UP_DOWN = 2; // 0x2
-  }
-
-  public abstract class TransportController {
-    ctor public TransportController();
-    method public abstract int getBufferPercentage();
-    method public abstract long getCurrentPosition();
-    method public abstract long getDuration();
-    method public abstract int getTransportControlFlags();
-    method public abstract boolean isPlaying();
-    method public abstract void pausePlaying();
-    method public abstract void registerStateListener(android.support.v4.media.TransportStateListener);
-    method public abstract void seekTo(long);
-    method public abstract void startPlaying();
-    method public abstract void stopPlaying();
-    method public abstract void unregisterStateListener(android.support.v4.media.TransportStateListener);
-  }
-
-  public class TransportMediator extends android.support.v4.media.TransportController {
-    ctor public TransportMediator(android.app.Activity, android.support.v4.media.TransportPerformer);
-    ctor public TransportMediator(android.view.View, android.support.v4.media.TransportPerformer);
-    method public void destroy();
-    method public boolean dispatchKeyEvent(android.view.KeyEvent);
-    method public int getBufferPercentage();
-    method public long getCurrentPosition();
-    method public long getDuration();
-    method public java.lang.Object getRemoteControlClient();
-    method public int getTransportControlFlags();
-    method public boolean isPlaying();
-    method public void pausePlaying();
-    method public void refreshState();
-    method public void registerStateListener(android.support.v4.media.TransportStateListener);
-    method public void seekTo(long);
-    method public void startPlaying();
-    method public void stopPlaying();
-    method public void unregisterStateListener(android.support.v4.media.TransportStateListener);
-    field public static final int FLAG_KEY_MEDIA_FAST_FORWARD = 64; // 0x40
-    field public static final int FLAG_KEY_MEDIA_NEXT = 128; // 0x80
-    field public static final int FLAG_KEY_MEDIA_PAUSE = 16; // 0x10
-    field public static final int FLAG_KEY_MEDIA_PLAY = 4; // 0x4
-    field public static final int FLAG_KEY_MEDIA_PLAY_PAUSE = 8; // 0x8
-    field public static final int FLAG_KEY_MEDIA_PREVIOUS = 1; // 0x1
-    field public static final int FLAG_KEY_MEDIA_REWIND = 2; // 0x2
-    field public static final int FLAG_KEY_MEDIA_STOP = 32; // 0x20
-    field public static final int KEYCODE_MEDIA_PAUSE = 127; // 0x7f
-    field public static final int KEYCODE_MEDIA_PLAY = 126; // 0x7e
-    field public static final int KEYCODE_MEDIA_RECORD = 130; // 0x82
-  }
-
-  public abstract class TransportPerformer {
-    ctor public TransportPerformer();
-    method public void onAudioFocusChange(int);
-    method public int onGetBufferPercentage();
-    method public abstract long onGetCurrentPosition();
-    method public abstract long onGetDuration();
-    method public int onGetTransportControlFlags();
-    method public abstract boolean onIsPlaying();
-    method public boolean onMediaButtonDown(int, android.view.KeyEvent);
-    method public boolean onMediaButtonUp(int, android.view.KeyEvent);
-    method public abstract void onPause();
-    method public abstract void onSeekTo(long);
-    method public abstract void onStart();
-    method public abstract void onStop();
-  }
-
-  public class TransportStateListener {
-    ctor public TransportStateListener();
-    method public void onPlayingChanged(android.support.v4.media.TransportController);
-    method public void onTransportControlsChanged(android.support.v4.media.TransportController);
-  }
-
-  public abstract class VolumeProviderCompat {
-    ctor public VolumeProviderCompat(int, int, int);
-    method public final int getCurrentVolume();
-    method public final int getMaxVolume();
-    method public final int getVolumeControl();
-    method public java.lang.Object getVolumeProvider();
-    method public void onAdjustVolume(int);
-    method public void onSetVolumeTo(int);
-    method public void setCallback(android.support.v4.media.VolumeProviderCompat.Callback);
-    method public final void setCurrentVolume(int);
-    field public static final int VOLUME_CONTROL_ABSOLUTE = 2; // 0x2
-    field public static final int VOLUME_CONTROL_FIXED = 0; // 0x0
-    field public static final int VOLUME_CONTROL_RELATIVE = 1; // 0x1
-  }
-
-  public static abstract class VolumeProviderCompat.Callback {
-    ctor public VolumeProviderCompat.Callback();
-    method public abstract void onVolumeChanged(android.support.v4.media.VolumeProviderCompat);
-  }
-
-}
-
-package android.support.v4.media.session {
-
-  public final class MediaControllerCompat {
-    ctor public MediaControllerCompat(android.content.Context, android.support.v4.media.session.MediaSessionCompat);
-    ctor public MediaControllerCompat(android.content.Context, android.support.v4.media.session.MediaSessionCompat.Token) throws android.os.RemoteException;
-    method public void adjustVolume(int, int);
-    method public boolean dispatchMediaButtonEvent(android.view.KeyEvent);
-    method public android.os.Bundle getExtras();
-    method public long getFlags();
-    method public java.lang.Object getMediaController();
-    method public android.support.v4.media.MediaMetadataCompat getMetadata();
-    method public java.lang.String getPackageName();
-    method public android.support.v4.media.session.MediaControllerCompat.PlaybackInfo getPlaybackInfo();
-    method public android.support.v4.media.session.PlaybackStateCompat getPlaybackState();
-    method public java.util.List<android.support.v4.media.session.MediaSessionCompat.QueueItem> getQueue();
-    method public java.lang.CharSequence getQueueTitle();
-    method public int getRatingType();
-    method public android.app.PendingIntent getSessionActivity();
-    method public android.support.v4.media.session.MediaSessionCompat.Token getSessionToken();
-    method public android.support.v4.media.session.MediaControllerCompat.TransportControls getTransportControls();
-    method public void registerCallback(android.support.v4.media.session.MediaControllerCompat.Callback);
-    method public void registerCallback(android.support.v4.media.session.MediaControllerCompat.Callback, android.os.Handler);
-    method public void sendCommand(java.lang.String, android.os.Bundle, android.os.ResultReceiver);
-    method public void setVolumeTo(int, int);
-    method public void unregisterCallback(android.support.v4.media.session.MediaControllerCompat.Callback);
-  }
-
-  public static abstract class MediaControllerCompat.Callback implements android.os.IBinder.DeathRecipient {
-    ctor public MediaControllerCompat.Callback();
-    method public void binderDied();
-    method public void onAudioInfoChanged(android.support.v4.media.session.MediaControllerCompat.PlaybackInfo);
-    method public void onExtrasChanged(android.os.Bundle);
-    method public void onMetadataChanged(android.support.v4.media.MediaMetadataCompat);
-    method public void onPlaybackStateChanged(android.support.v4.media.session.PlaybackStateCompat);
-    method public void onQueueChanged(java.util.List<android.support.v4.media.session.MediaSessionCompat.QueueItem>);
-    method public void onQueueTitleChanged(java.lang.CharSequence);
-    method public void onSessionDestroyed();
-    method public void onSessionEvent(java.lang.String, android.os.Bundle);
-  }
-
-  public static final class MediaControllerCompat.PlaybackInfo {
-    method public int getAudioStream();
-    method public int getCurrentVolume();
-    method public int getMaxVolume();
-    method public int getPlaybackType();
-    method public int getVolumeControl();
-    field public static final int PLAYBACK_TYPE_LOCAL = 1; // 0x1
-    field public static final int PLAYBACK_TYPE_REMOTE = 2; // 0x2
-  }
-
-  public static abstract class MediaControllerCompat.TransportControls {
-    method public abstract void fastForward();
-    method public abstract void pause();
-    method public abstract void play();
-    method public abstract void playFromMediaId(java.lang.String, android.os.Bundle);
-    method public abstract void playFromSearch(java.lang.String, android.os.Bundle);
-    method public abstract void rewind();
-    method public abstract void seekTo(long);
-    method public abstract void sendCustomAction(android.support.v4.media.session.PlaybackStateCompat.CustomAction, android.os.Bundle);
-    method public abstract void sendCustomAction(java.lang.String, android.os.Bundle);
-    method public abstract void setRating(android.support.v4.media.RatingCompat);
-    method public abstract void skipToNext();
-    method public abstract void skipToPrevious();
-    method public abstract void skipToQueueItem(long);
-    method public abstract void stop();
-  }
-
-  public class MediaSessionCompat {
-    ctor public MediaSessionCompat(android.content.Context, java.lang.String, android.content.ComponentName, android.app.PendingIntent);
-    method public void addOnActiveChangeListener(android.support.v4.media.session.MediaSessionCompat.OnActiveChangeListener);
-    method public android.support.v4.media.session.MediaControllerCompat getController();
-    method public java.lang.Object getMediaSession();
-    method public java.lang.Object getRemoteControlClient();
-    method public android.support.v4.media.session.MediaSessionCompat.Token getSessionToken();
-    method public boolean isActive();
-    method public static android.support.v4.media.session.MediaSessionCompat obtain(android.content.Context, java.lang.Object);
-    method public void release();
-    method public void removeOnActiveChangeListener(android.support.v4.media.session.MediaSessionCompat.OnActiveChangeListener);
-    method public void sendSessionEvent(java.lang.String, android.os.Bundle);
-    method public void setActive(boolean);
-    method public void setCallback(android.support.v4.media.session.MediaSessionCompat.Callback);
-    method public void setCallback(android.support.v4.media.session.MediaSessionCompat.Callback, android.os.Handler);
-    method public void setExtras(android.os.Bundle);
-    method public void setFlags(int);
-    method public void setMediaButtonReceiver(android.app.PendingIntent);
-    method public void setMetadata(android.support.v4.media.MediaMetadataCompat);
-    method public void setPlaybackState(android.support.v4.media.session.PlaybackStateCompat);
-    method public void setPlaybackToLocal(int);
-    method public void setPlaybackToRemote(android.support.v4.media.VolumeProviderCompat);
-    method public void setQueue(java.util.List<android.support.v4.media.session.MediaSessionCompat.QueueItem>);
-    method public void setQueueTitle(java.lang.CharSequence);
-    method public void setRatingType(int);
-    method public void setSessionActivity(android.app.PendingIntent);
-    field public static final int FLAG_HANDLES_MEDIA_BUTTONS = 1; // 0x1
-    field public static final int FLAG_HANDLES_TRANSPORT_CONTROLS = 2; // 0x2
-  }
-
-  public static abstract class MediaSessionCompat.Callback {
-    ctor public MediaSessionCompat.Callback();
-    method public void onCommand(java.lang.String, android.os.Bundle, android.os.ResultReceiver);
-    method public void onCustomAction(java.lang.String, android.os.Bundle);
-    method public void onFastForward();
-    method public boolean onMediaButtonEvent(android.content.Intent);
-    method public void onPause();
-    method public void onPlay();
-    method public void onPlayFromMediaId(java.lang.String, android.os.Bundle);
-    method public void onPlayFromSearch(java.lang.String, android.os.Bundle);
-    method public void onRewind();
-    method public void onSeekTo(long);
-    method public void onSetRating(android.support.v4.media.RatingCompat);
-    method public void onSkipToNext();
-    method public void onSkipToPrevious();
-    method public void onSkipToQueueItem(long);
-    method public void onStop();
-  }
-
-  public static abstract interface MediaSessionCompat.OnActiveChangeListener {
-    method public abstract void onActiveChanged();
-  }
-
-  public static final class MediaSessionCompat.QueueItem implements android.os.Parcelable {
-    ctor public MediaSessionCompat.QueueItem(android.support.v4.media.MediaDescriptionCompat, long);
-    method public int describeContents();
-    method public android.support.v4.media.MediaDescriptionCompat getDescription();
-    method public long getQueueId();
-    method public java.lang.Object getQueueItem();
-    method public static android.support.v4.media.session.MediaSessionCompat.QueueItem obtain(java.lang.Object);
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.support.v4.media.session.MediaSessionCompat.QueueItem> CREATOR;
-    field public static final int UNKNOWN_ID = -1; // 0xffffffff
-  }
-
-  public static final class MediaSessionCompat.Token implements android.os.Parcelable {
-    method public int describeContents();
-    method public static android.support.v4.media.session.MediaSessionCompat.Token fromToken(java.lang.Object);
-    method public java.lang.Object getToken();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.support.v4.media.session.MediaSessionCompat.Token> CREATOR;
-  }
-
-  public class ParcelableVolumeInfo implements android.os.Parcelable {
-    ctor public ParcelableVolumeInfo(int, int, int, int, int);
-    ctor public ParcelableVolumeInfo(android.os.Parcel);
-    method public int describeContents();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.support.v4.media.session.ParcelableVolumeInfo> CREATOR;
-    field public int audioStream;
-    field public int controlType;
-    field public int currentVolume;
-    field public int maxVolume;
-    field public int volumeType;
-  }
-
-  public final class PlaybackStateCompat implements android.os.Parcelable {
-    method public int describeContents();
-    method public static android.support.v4.media.session.PlaybackStateCompat fromPlaybackState(java.lang.Object);
-    method public long getActions();
-    method public long getActiveQueueItemId();
-    method public long getBufferedPosition();
-    method public java.util.List<android.support.v4.media.session.PlaybackStateCompat.CustomAction> getCustomActions();
-    method public java.lang.CharSequence getErrorMessage();
-    method public android.os.Bundle getExtras();
-    method public long getLastPositionUpdateTime();
-    method public float getPlaybackSpeed();
-    method public java.lang.Object getPlaybackState();
-    method public long getPosition();
-    method public int getState();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final long ACTION_FAST_FORWARD = 64L; // 0x40L
-    field public static final long ACTION_PAUSE = 2L; // 0x2L
-    field public static final long ACTION_PLAY = 4L; // 0x4L
-    field public static final long ACTION_PLAY_FROM_MEDIA_ID = 1024L; // 0x400L
-    field public static final long ACTION_PLAY_FROM_SEARCH = 2048L; // 0x800L
-    field public static final long ACTION_PLAY_PAUSE = 512L; // 0x200L
-    field public static final long ACTION_REWIND = 8L; // 0x8L
-    field public static final long ACTION_SEEK_TO = 256L; // 0x100L
-    field public static final long ACTION_SET_RATING = 128L; // 0x80L
-    field public static final long ACTION_SKIP_TO_NEXT = 32L; // 0x20L
-    field public static final long ACTION_SKIP_TO_PREVIOUS = 16L; // 0x10L
-    field public static final long ACTION_SKIP_TO_QUEUE_ITEM = 4096L; // 0x1000L
-    field public static final long ACTION_STOP = 1L; // 0x1L
-    field public static final android.os.Parcelable.Creator<android.support.v4.media.session.PlaybackStateCompat> CREATOR;
-    field public static final long PLAYBACK_POSITION_UNKNOWN = -1L; // 0xffffffffffffffffL
-    field public static final int STATE_BUFFERING = 6; // 0x6
-    field public static final int STATE_CONNECTING = 8; // 0x8
-    field public static final int STATE_ERROR = 7; // 0x7
-    field public static final int STATE_FAST_FORWARDING = 4; // 0x4
-    field public static final int STATE_NONE = 0; // 0x0
-    field public static final int STATE_PAUSED = 2; // 0x2
-    field public static final int STATE_PLAYING = 3; // 0x3
-    field public static final int STATE_REWINDING = 5; // 0x5
-    field public static final int STATE_SKIPPING_TO_NEXT = 10; // 0xa
-    field public static final int STATE_SKIPPING_TO_PREVIOUS = 9; // 0x9
-    field public static final int STATE_SKIPPING_TO_QUEUE_ITEM = 11; // 0xb
-    field public static final int STATE_STOPPED = 1; // 0x1
-  }
-
-  public static final class PlaybackStateCompat.Builder {
-    ctor public PlaybackStateCompat.Builder();
-    ctor public PlaybackStateCompat.Builder(android.support.v4.media.session.PlaybackStateCompat);
-    method public android.support.v4.media.session.PlaybackStateCompat.Builder addCustomAction(java.lang.String, java.lang.String, int);
-    method public android.support.v4.media.session.PlaybackStateCompat.Builder addCustomAction(android.support.v4.media.session.PlaybackStateCompat.CustomAction);
-    method public android.support.v4.media.session.PlaybackStateCompat build();
-    method public android.support.v4.media.session.PlaybackStateCompat.Builder setActions(long);
-    method public android.support.v4.media.session.PlaybackStateCompat.Builder setActiveQueueItemId(long);
-    method public android.support.v4.media.session.PlaybackStateCompat.Builder setBufferedPosition(long);
-    method public android.support.v4.media.session.PlaybackStateCompat.Builder setErrorMessage(java.lang.CharSequence);
-    method public android.support.v4.media.session.PlaybackStateCompat.Builder setExtras(android.os.Bundle);
-    method public android.support.v4.media.session.PlaybackStateCompat.Builder setState(int, long, float);
-    method public android.support.v4.media.session.PlaybackStateCompat.Builder setState(int, long, float, long);
-  }
-
-  public static final class PlaybackStateCompat.CustomAction implements android.os.Parcelable {
-    method public int describeContents();
-    method public static android.support.v4.media.session.PlaybackStateCompat.CustomAction fromCustomAction(java.lang.Object);
-    method public java.lang.String getAction();
-    method public java.lang.Object getCustomAction();
-    method public android.os.Bundle getExtras();
-    method public int getIcon();
-    method public java.lang.CharSequence getName();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.support.v4.media.session.PlaybackStateCompat.CustomAction> CREATOR;
-  }
-
-  public static final class PlaybackStateCompat.CustomAction.Builder {
-    ctor public PlaybackStateCompat.CustomAction.Builder(java.lang.String, java.lang.CharSequence, int);
-    method public android.support.v4.media.session.PlaybackStateCompat.CustomAction build();
-    method public android.support.v4.media.session.PlaybackStateCompat.CustomAction.Builder setExtras(android.os.Bundle);
-  }
-
-}
-
-package android.support.v4.net {
-
-  public class ConnectivityManagerCompat {
-    ctor public ConnectivityManagerCompat();
-    method public static android.net.NetworkInfo getNetworkInfoFromBroadcast(android.net.ConnectivityManager, android.content.Intent);
-    method public static boolean isActiveNetworkMetered(android.net.ConnectivityManager);
-  }
-
-  public class TrafficStatsCompat {
-    ctor public TrafficStatsCompat();
-    method public static void clearThreadStatsTag();
-    method public static int getThreadStatsTag();
-    method public static void incrementOperationCount(int);
-    method public static void incrementOperationCount(int, int);
-    method public static void setThreadStatsTag(int);
-    method public static void tagSocket(java.net.Socket) throws java.net.SocketException;
-    method public static void untagSocket(java.net.Socket) throws java.net.SocketException;
-  }
-
-}
-
-package android.support.v4.os {
-
-  public class AsyncTaskCompat {
-    ctor public AsyncTaskCompat();
-    method public static android.os.AsyncTask<Params, Progress, Result> executeParallel(android.os.AsyncTask<Params, Progress, Result>, Params...);
-  }
-
-  public class EnvironmentCompat {
-    ctor public EnvironmentCompat();
-    method public static java.lang.String getStorageState(java.io.File);
-    field public static final java.lang.String MEDIA_UNKNOWN = "unknown";
-  }
-
-  public class ParcelableCompat {
-    ctor public ParcelableCompat();
-    method public static android.os.Parcelable.Creator<T> newCreator(android.support.v4.os.ParcelableCompatCreatorCallbacks<T>);
-  }
-
-  public abstract interface ParcelableCompatCreatorCallbacks {
-    method public abstract T createFromParcel(android.os.Parcel, java.lang.ClassLoader);
-    method public abstract T[] newArray(int);
-  }
-
-  public class TraceCompat {
-    ctor public TraceCompat();
-    method public static void beginSection(java.lang.String);
-    method public static void endSection();
-  }
-
-}
-
-package android.support.v4.print {
-
-  public final class PrintHelper {
-    ctor public PrintHelper(android.content.Context);
-    method public int getColorMode();
-    method public int getOrientation();
-    method public int getScaleMode();
-    method public void printBitmap(java.lang.String, android.graphics.Bitmap);
-    method public void printBitmap(java.lang.String, android.graphics.Bitmap, android.support.v4.print.PrintHelper.OnPrintFinishCallback);
-    method public void printBitmap(java.lang.String, android.net.Uri) throws java.io.FileNotFoundException;
-    method public void printBitmap(java.lang.String, android.net.Uri, android.support.v4.print.PrintHelper.OnPrintFinishCallback) throws java.io.FileNotFoundException;
-    method public void setColorMode(int);
-    method public void setOrientation(int);
-    method public void setScaleMode(int);
-    method public static boolean systemSupportsPrint();
-    field public static final int COLOR_MODE_COLOR = 2; // 0x2
-    field public static final int COLOR_MODE_MONOCHROME = 1; // 0x1
-    field public static final int ORIENTATION_LANDSCAPE = 1; // 0x1
-    field public static final int ORIENTATION_PORTRAIT = 2; // 0x2
-    field public static final int SCALE_MODE_FILL = 2; // 0x2
-    field public static final int SCALE_MODE_FIT = 1; // 0x1
-  }
-
-  public static abstract interface PrintHelper.OnPrintFinishCallback {
-    method public abstract void onFinish();
-  }
-
-}
-
-package android.support.v4.provider {
-
-  public abstract class DocumentFile {
-    method public abstract boolean canRead();
-    method public abstract boolean canWrite();
-    method public abstract android.support.v4.provider.DocumentFile createDirectory(java.lang.String);
-    method public abstract android.support.v4.provider.DocumentFile createFile(java.lang.String, java.lang.String);
-    method public abstract boolean delete();
-    method public abstract boolean exists();
-    method public android.support.v4.provider.DocumentFile findFile(java.lang.String);
-    method public static android.support.v4.provider.DocumentFile fromFile(java.io.File);
-    method public static android.support.v4.provider.DocumentFile fromSingleUri(android.content.Context, android.net.Uri);
-    method public static android.support.v4.provider.DocumentFile fromTreeUri(android.content.Context, android.net.Uri);
-    method public abstract java.lang.String getName();
-    method public android.support.v4.provider.DocumentFile getParentFile();
-    method public abstract java.lang.String getType();
-    method public abstract android.net.Uri getUri();
-    method public abstract boolean isDirectory();
-    method public static boolean isDocumentUri(android.content.Context, android.net.Uri);
-    method public abstract boolean isFile();
-    method public abstract long lastModified();
-    method public abstract long length();
-    method public abstract android.support.v4.provider.DocumentFile[] listFiles();
-    method public abstract boolean renameTo(java.lang.String);
-  }
-
-}
-
-package android.support.v4.text {
-
-  public final class BidiFormatter {
-    method public static android.support.v4.text.BidiFormatter getInstance();
-    method public static android.support.v4.text.BidiFormatter getInstance(boolean);
-    method public static android.support.v4.text.BidiFormatter getInstance(java.util.Locale);
-    method public boolean getStereoReset();
-    method public boolean isRtl(java.lang.String);
-    method public boolean isRtlContext();
-    method public java.lang.String unicodeWrap(java.lang.String, android.support.v4.text.TextDirectionHeuristicCompat, boolean);
-    method public java.lang.String unicodeWrap(java.lang.String, android.support.v4.text.TextDirectionHeuristicCompat);
-    method public java.lang.String unicodeWrap(java.lang.String, boolean);
-    method public java.lang.String unicodeWrap(java.lang.String);
-  }
-
-  public static final class BidiFormatter.Builder {
-    ctor public BidiFormatter.Builder();
-    ctor public BidiFormatter.Builder(boolean);
-    ctor public BidiFormatter.Builder(java.util.Locale);
-    method public android.support.v4.text.BidiFormatter build();
-    method public android.support.v4.text.BidiFormatter.Builder setTextDirectionHeuristic(android.support.v4.text.TextDirectionHeuristicCompat);
-    method public android.support.v4.text.BidiFormatter.Builder stereoReset(boolean);
-  }
-
-  public class ICUCompat {
-    ctor public ICUCompat();
-    method public static java.lang.String addLikelySubtags(java.lang.String);
-    method public static java.lang.String getScript(java.lang.String);
-  }
-
-  public abstract interface TextDirectionHeuristicCompat {
-    method public abstract boolean isRtl(char[], int, int);
-    method public abstract boolean isRtl(java.lang.CharSequence, int, int);
-  }
-
-  public class TextDirectionHeuristicsCompat {
-    ctor public TextDirectionHeuristicsCompat();
-    field public static final android.support.v4.text.TextDirectionHeuristicCompat ANYRTL_LTR;
-    field public static final android.support.v4.text.TextDirectionHeuristicCompat FIRSTSTRONG_LTR;
-    field public static final android.support.v4.text.TextDirectionHeuristicCompat FIRSTSTRONG_RTL;
-    field public static final android.support.v4.text.TextDirectionHeuristicCompat LOCALE;
-    field public static final android.support.v4.text.TextDirectionHeuristicCompat LTR;
-    field public static final android.support.v4.text.TextDirectionHeuristicCompat RTL;
-  }
-
-  public class TextUtilsCompat {
-    ctor public TextUtilsCompat();
-    method public static int getLayoutDirectionFromLocale(java.util.Locale);
-    method public static java.lang.String htmlEncode(java.lang.String);
-    field public static final java.util.Locale ROOT;
-  }
-
-}
-
-package android.support.v4.util {
-
-  public class ArrayMap extends android.support.v4.util.SimpleArrayMap implements java.util.Map {
-    ctor public ArrayMap();
-    ctor public ArrayMap(int);
-    ctor public ArrayMap(android.support.v4.util.SimpleArrayMap);
-    method public boolean containsAll(java.util.Collection<?>);
-    method public java.util.Set<java.util.Map.Entry<K, V>> entrySet();
-    method public java.util.Set<K> keySet();
-    method public void putAll(java.util.Map<? extends K, ? extends V>);
-    method public boolean removeAll(java.util.Collection<?>);
-    method public boolean retainAll(java.util.Collection<?>);
-    method public java.util.Collection<V> values();
-  }
-
-  public class AtomicFile {
-    ctor public AtomicFile(java.io.File);
-    method public void delete();
-    method public void failWrite(java.io.FileOutputStream);
-    method public void finishWrite(java.io.FileOutputStream);
-    method public java.io.File getBaseFile();
-    method public java.io.FileInputStream openRead() throws java.io.FileNotFoundException;
-    method public byte[] readFully() throws java.io.IOException;
-    method public java.io.FileOutputStream startWrite() throws java.io.IOException;
-  }
-
-  public final class CircularArray {
-    ctor public CircularArray();
-    ctor public CircularArray(int);
-    method public void addFirst(E);
-    method public void addLast(E);
-    method public void clear();
-    method public E get(int);
-    method public E getFirst();
-    method public E getLast();
-    method public boolean isEmpty();
-    method public E popFirst();
-    method public E popLast();
-    method public void removeFromEnd(int);
-    method public void removeFromStart(int);
-    method public int size();
-  }
-
-  public final class CircularIntArray {
-    ctor public CircularIntArray();
-    ctor public CircularIntArray(int);
-    method public void addFirst(int);
-    method public void addLast(int);
-    method public void clear();
-    method public int get(int);
-    method public int getFirst();
-    method public int getLast();
-    method public boolean isEmpty();
-    method public int popFirst();
-    method public int popLast();
-    method public void removeFromEnd(int);
-    method public void removeFromStart(int);
-    method public int size();
-  }
-
-  public class LongSparseArray {
-    ctor public LongSparseArray();
-    ctor public LongSparseArray(int);
-    method public void append(long, E);
-    method public void clear();
-    method public android.support.v4.util.LongSparseArray<E> clone();
-    method public void delete(long);
-    method public E get(long);
-    method public E get(long, E);
-    method public int indexOfKey(long);
-    method public int indexOfValue(E);
-    method public long keyAt(int);
-    method public void put(long, E);
-    method public void remove(long);
-    method public void removeAt(int);
-    method public void setValueAt(int, E);
-    method public int size();
-    method public E valueAt(int);
-  }
-
-  public class LruCache {
-    ctor public LruCache(int);
-    method protected V create(K);
-    method public final synchronized int createCount();
-    method protected void entryRemoved(boolean, K, V, V);
-    method public final void evictAll();
-    method public final synchronized int evictionCount();
-    method public final V get(K);
-    method public final synchronized int hitCount();
-    method public final synchronized int maxSize();
-    method public final synchronized int missCount();
-    method public final V put(K, V);
-    method public final synchronized int putCount();
-    method public final V remove(K);
-    method public void resize(int);
-    method public final synchronized int size();
-    method protected int sizeOf(K, V);
-    method public final synchronized java.util.Map<K, V> snapshot();
-    method public final synchronized java.lang.String toString();
-    method public void trimToSize(int);
-  }
-
-  public class Pair {
-    ctor public Pair(F, S);
-    method public static android.support.v4.util.Pair<A, B> create(A, B);
-    field public final F first;
-    field public final S second;
-  }
-
-  public final class Pools {
-  }
-
-  public static abstract interface Pools.Pool {
-    method public abstract T acquire();
-    method public abstract boolean release(T);
-  }
-
-  public static class Pools.SimplePool implements android.support.v4.util.Pools.Pool {
-    ctor public Pools.SimplePool(int);
-    method public T acquire();
-    method public boolean release(T);
-  }
-
-  public static class Pools.SynchronizedPool extends android.support.v4.util.Pools.SimplePool {
-    ctor public Pools.SynchronizedPool(int);
-  }
-
-  public class SimpleArrayMap {
-    ctor public SimpleArrayMap();
-    ctor public SimpleArrayMap(int);
-    ctor public SimpleArrayMap(android.support.v4.util.SimpleArrayMap);
-    method public void clear();
-    method public boolean containsKey(java.lang.Object);
-    method public boolean containsValue(java.lang.Object);
-    method public void ensureCapacity(int);
-    method public V get(java.lang.Object);
-    method public int indexOfKey(java.lang.Object);
-    method public boolean isEmpty();
-    method public K keyAt(int);
-    method public V put(K, V);
-    method public void putAll(android.support.v4.util.SimpleArrayMap<? extends K, ? extends V>);
-    method public V remove(java.lang.Object);
-    method public V removeAt(int);
-    method public V setValueAt(int, V);
-    method public int size();
-    method public V valueAt(int);
-  }
-
-  public class SparseArrayCompat {
-    ctor public SparseArrayCompat();
-    ctor public SparseArrayCompat(int);
-    method public void append(int, E);
-    method public void clear();
-    method public android.support.v4.util.SparseArrayCompat<E> clone();
-    method public void delete(int);
-    method public E get(int);
-    method public E get(int, E);
-    method public int indexOfKey(int);
-    method public int indexOfValue(E);
-    method public int keyAt(int);
-    method public void put(int, E);
-    method public void remove(int);
-    method public void removeAt(int);
-    method public void removeAtRange(int, int);
-    method public void setValueAt(int, E);
-    method public int size();
-    method public E valueAt(int);
-  }
-
-}
-
-package android.support.v4.view {
-
-  public class AccessibilityDelegateCompat {
-    ctor public AccessibilityDelegateCompat();
-    method public boolean dispatchPopulateAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
-    method public android.support.v4.view.accessibility.AccessibilityNodeProviderCompat getAccessibilityNodeProvider(android.view.View);
-    method public void onInitializeAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
-    method public void onInitializeAccessibilityNodeInfo(android.view.View, android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
-    method public void onPopulateAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
-    method public boolean onRequestSendAccessibilityEvent(android.view.ViewGroup, android.view.View, android.view.accessibility.AccessibilityEvent);
-    method public boolean performAccessibilityAction(android.view.View, int, android.os.Bundle);
-    method public void sendAccessibilityEvent(android.view.View, int);
-    method public void sendAccessibilityEventUnchecked(android.view.View, android.view.accessibility.AccessibilityEvent);
-  }
-
-  public abstract class ActionProvider {
-    ctor public ActionProvider(android.content.Context);
-    method public android.content.Context getContext();
-    method public boolean hasSubMenu();
-    method public boolean isVisible();
-    method public abstract android.view.View onCreateActionView();
-    method public android.view.View onCreateActionView(android.view.MenuItem);
-    method public boolean onPerformDefaultAction();
-    method public void onPrepareSubMenu(android.view.SubMenu);
-    method public boolean overridesItemVisibility();
-    method public void refreshVisibility();
-    method public void setVisibilityListener(android.support.v4.view.ActionProvider.VisibilityListener);
-  }
-
-  public static abstract interface ActionProvider.VisibilityListener {
-    method public abstract void onActionProviderVisibilityChanged(boolean);
-  }
-
-  public class GestureDetectorCompat {
-    ctor public GestureDetectorCompat(android.content.Context, android.view.GestureDetector.OnGestureListener);
-    ctor public GestureDetectorCompat(android.content.Context, android.view.GestureDetector.OnGestureListener, android.os.Handler);
-    method public boolean isLongpressEnabled();
-    method public boolean onTouchEvent(android.view.MotionEvent);
-    method public void setIsLongpressEnabled(boolean);
-    method public void setOnDoubleTapListener(android.view.GestureDetector.OnDoubleTapListener);
-  }
-
-  public class GravityCompat {
-    ctor public GravityCompat();
-    method public static void apply(int, int, int, android.graphics.Rect, android.graphics.Rect, int);
-    method public static void apply(int, int, int, android.graphics.Rect, int, int, android.graphics.Rect, int);
-    method public static void applyDisplay(int, android.graphics.Rect, android.graphics.Rect, int);
-    method public static int getAbsoluteGravity(int, int);
-    field public static final int END = 8388613; // 0x800005
-    field public static final int RELATIVE_HORIZONTAL_GRAVITY_MASK = 8388615; // 0x800007
-    field public static final int RELATIVE_LAYOUT_DIRECTION = 8388608; // 0x800000
-    field public static final int START = 8388611; // 0x800003
-  }
-
-  public class InputDeviceCompat {
-    ctor public InputDeviceCompat();
-    field public static final int SOURCE_ANY = -256; // 0xffffff00
-    field public static final int SOURCE_CLASS_BUTTON = 1; // 0x1
-    field public static final int SOURCE_CLASS_JOYSTICK = 16; // 0x10
-    field public static final int SOURCE_CLASS_MASK = 255; // 0xff
-    field public static final int SOURCE_CLASS_NONE = 0; // 0x0
-    field public static final int SOURCE_CLASS_POINTER = 2; // 0x2
-    field public static final int SOURCE_CLASS_POSITION = 8; // 0x8
-    field public static final int SOURCE_CLASS_TRACKBALL = 4; // 0x4
-    field public static final int SOURCE_DPAD = 513; // 0x201
-    field public static final int SOURCE_GAMEPAD = 1025; // 0x401
-    field public static final int SOURCE_HDMI = 33554433; // 0x2000001
-    field public static final int SOURCE_JOYSTICK = 16777232; // 0x1000010
-    field public static final int SOURCE_KEYBOARD = 257; // 0x101
-    field public static final int SOURCE_MOUSE = 8194; // 0x2002
-    field public static final int SOURCE_STYLUS = 16386; // 0x4002
-    field public static final int SOURCE_TOUCHPAD = 1048584; // 0x100008
-    field public static final int SOURCE_TOUCHSCREEN = 4098; // 0x1002
-    field public static final int SOURCE_TOUCH_NAVIGATION = 2097152; // 0x200000
-    field public static final int SOURCE_TRACKBALL = 65540; // 0x10004
-    field public static final int SOURCE_UNKNOWN = 0; // 0x0
-  }
-
-  public class KeyEventCompat {
-    ctor public KeyEventCompat();
-    method public static boolean dispatch(android.view.KeyEvent, android.view.KeyEvent.Callback, java.lang.Object, java.lang.Object);
-    method public static java.lang.Object getKeyDispatcherState(android.view.View);
-    method public static boolean hasModifiers(android.view.KeyEvent, int);
-    method public static boolean hasNoModifiers(android.view.KeyEvent);
-    method public static boolean isTracking(android.view.KeyEvent);
-    method public static boolean metaStateHasModifiers(int, int);
-    method public static boolean metaStateHasNoModifiers(int);
-    method public static int normalizeMetaState(int);
-    method public static void startTracking(android.view.KeyEvent);
-  }
-
-  public class LayoutInflaterCompat {
-    method public static void setFactory(android.view.LayoutInflater, android.support.v4.view.LayoutInflaterFactory);
-  }
-
-  public abstract interface LayoutInflaterFactory {
-    method public abstract android.view.View onCreateView(android.view.View, java.lang.String, android.content.Context, android.util.AttributeSet);
-  }
-
-  public class MarginLayoutParamsCompat {
-    ctor public MarginLayoutParamsCompat();
-    method public static int getLayoutDirection(android.view.ViewGroup.MarginLayoutParams);
-    method public static int getMarginEnd(android.view.ViewGroup.MarginLayoutParams);
-    method public static int getMarginStart(android.view.ViewGroup.MarginLayoutParams);
-    method public static boolean isMarginRelative(android.view.ViewGroup.MarginLayoutParams);
-    method public static void resolveLayoutDirection(android.view.ViewGroup.MarginLayoutParams, int);
-    method public static void setLayoutDirection(android.view.ViewGroup.MarginLayoutParams, int);
-    method public static void setMarginEnd(android.view.ViewGroup.MarginLayoutParams, int);
-    method public static void setMarginStart(android.view.ViewGroup.MarginLayoutParams, int);
-  }
-
-  public class MenuCompat {
-    ctor public MenuCompat();
-    method public static deprecated void setShowAsAction(android.view.MenuItem, int);
-  }
-
-  public class MenuItemCompat {
-    ctor public MenuItemCompat();
-    method public static boolean collapseActionView(android.view.MenuItem);
-    method public static boolean expandActionView(android.view.MenuItem);
-    method public static android.support.v4.view.ActionProvider getActionProvider(android.view.MenuItem);
-    method public static android.view.View getActionView(android.view.MenuItem);
-    method public static boolean isActionViewExpanded(android.view.MenuItem);
-    method public static android.view.MenuItem setActionProvider(android.view.MenuItem, android.support.v4.view.ActionProvider);
-    method public static android.view.MenuItem setActionView(android.view.MenuItem, android.view.View);
-    method public static android.view.MenuItem setActionView(android.view.MenuItem, int);
-    method public static android.view.MenuItem setOnActionExpandListener(android.view.MenuItem, android.support.v4.view.MenuItemCompat.OnActionExpandListener);
-    method public static void setShowAsAction(android.view.MenuItem, int);
-    field public static final int SHOW_AS_ACTION_ALWAYS = 2; // 0x2
-    field public static final int SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW = 8; // 0x8
-    field public static final int SHOW_AS_ACTION_IF_ROOM = 1; // 0x1
-    field public static final int SHOW_AS_ACTION_NEVER = 0; // 0x0
-    field public static final int SHOW_AS_ACTION_WITH_TEXT = 4; // 0x4
-  }
-
-  public static abstract interface MenuItemCompat.OnActionExpandListener {
-    method public abstract boolean onMenuItemActionCollapse(android.view.MenuItem);
-    method public abstract boolean onMenuItemActionExpand(android.view.MenuItem);
-  }
-
-  public class MotionEventCompat {
-    ctor public MotionEventCompat();
-    method public static int findPointerIndex(android.view.MotionEvent, int);
-    method public static int getActionIndex(android.view.MotionEvent);
-    method public static int getActionMasked(android.view.MotionEvent);
-    method public static float getAxisValue(android.view.MotionEvent, int);
-    method public static float getAxisValue(android.view.MotionEvent, int, int);
-    method public static int getPointerCount(android.view.MotionEvent);
-    method public static int getPointerId(android.view.MotionEvent, int);
-    method public static int getSource(android.view.MotionEvent);
-    method public static float getX(android.view.MotionEvent, int);
-    method public static float getY(android.view.MotionEvent, int);
-    field public static final int ACTION_HOVER_ENTER = 9; // 0x9
-    field public static final int ACTION_HOVER_EXIT = 10; // 0xa
-    field public static final int ACTION_HOVER_MOVE = 7; // 0x7
-    field public static final int ACTION_MASK = 255; // 0xff
-    field public static final int ACTION_POINTER_DOWN = 5; // 0x5
-    field public static final int ACTION_POINTER_INDEX_MASK = 65280; // 0xff00
-    field public static final int ACTION_POINTER_INDEX_SHIFT = 8; // 0x8
-    field public static final int ACTION_POINTER_UP = 6; // 0x6
-    field public static final int ACTION_SCROLL = 8; // 0x8
-    field public static final int AXIS_BRAKE = 23; // 0x17
-    field public static final int AXIS_DISTANCE = 24; // 0x18
-    field public static final int AXIS_GAS = 22; // 0x16
-    field public static final int AXIS_GENERIC_1 = 32; // 0x20
-    field public static final int AXIS_GENERIC_10 = 41; // 0x29
-    field public static final int AXIS_GENERIC_11 = 42; // 0x2a
-    field public static final int AXIS_GENERIC_12 = 43; // 0x2b
-    field public static final int AXIS_GENERIC_13 = 44; // 0x2c
-    field public static final int AXIS_GENERIC_14 = 45; // 0x2d
-    field public static final int AXIS_GENERIC_15 = 46; // 0x2e
-    field public static final int AXIS_GENERIC_16 = 47; // 0x2f
-    field public static final int AXIS_GENERIC_2 = 33; // 0x21
-    field public static final int AXIS_GENERIC_3 = 34; // 0x22
-    field public static final int AXIS_GENERIC_4 = 35; // 0x23
-    field public static final int AXIS_GENERIC_5 = 36; // 0x24
-    field public static final int AXIS_GENERIC_6 = 37; // 0x25
-    field public static final int AXIS_GENERIC_7 = 38; // 0x26
-    field public static final int AXIS_GENERIC_8 = 39; // 0x27
-    field public static final int AXIS_GENERIC_9 = 40; // 0x28
-    field public static final int AXIS_HAT_X = 15; // 0xf
-    field public static final int AXIS_HAT_Y = 16; // 0x10
-    field public static final int AXIS_HSCROLL = 10; // 0xa
-    field public static final int AXIS_LTRIGGER = 17; // 0x11
-    field public static final int AXIS_ORIENTATION = 8; // 0x8
-    field public static final int AXIS_PRESSURE = 2; // 0x2
-    field public static final int AXIS_RTRIGGER = 18; // 0x12
-    field public static final int AXIS_RUDDER = 20; // 0x14
-    field public static final int AXIS_RX = 12; // 0xc
-    field public static final int AXIS_RY = 13; // 0xd
-    field public static final int AXIS_RZ = 14; // 0xe
-    field public static final int AXIS_SIZE = 3; // 0x3
-    field public static final int AXIS_THROTTLE = 19; // 0x13
-    field public static final int AXIS_TILT = 25; // 0x19
-    field public static final int AXIS_TOOL_MAJOR = 6; // 0x6
-    field public static final int AXIS_TOOL_MINOR = 7; // 0x7
-    field public static final int AXIS_TOUCH_MAJOR = 4; // 0x4
-    field public static final int AXIS_TOUCH_MINOR = 5; // 0x5
-    field public static final int AXIS_VSCROLL = 9; // 0x9
-    field public static final int AXIS_WHEEL = 21; // 0x15
-    field public static final int AXIS_X = 0; // 0x0
-    field public static final int AXIS_Y = 1; // 0x1
-    field public static final int AXIS_Z = 11; // 0xb
-  }
-
-  public abstract interface NestedScrollingChild {
-    method public abstract boolean dispatchNestedFling(float, float, boolean);
-    method public abstract boolean dispatchNestedPreFling(float, float);
-    method public abstract boolean dispatchNestedPreScroll(int, int, int[], int[]);
-    method public abstract boolean dispatchNestedScroll(int, int, int, int, int[]);
-    method public abstract boolean hasNestedScrollingParent();
-    method public abstract boolean isNestedScrollingEnabled();
-    method public abstract void setNestedScrollingEnabled(boolean);
-    method public abstract boolean startNestedScroll(int);
-    method public abstract void stopNestedScroll();
-  }
-
-  public class NestedScrollingChildHelper {
-    ctor public NestedScrollingChildHelper(android.view.View);
-    method public boolean dispatchNestedFling(float, float, boolean);
-    method public boolean dispatchNestedPreFling(float, float);
-    method public boolean dispatchNestedPreScroll(int, int, int[], int[]);
-    method public boolean dispatchNestedScroll(int, int, int, int, int[]);
-    method public boolean hasNestedScrollingParent();
-    method public boolean isNestedScrollingEnabled();
-    method public void onDetachedFromWindow();
-    method public void onStopNestedScroll(android.view.View);
-    method public void setNestedScrollingEnabled(boolean);
-    method public boolean startNestedScroll(int);
-    method public void stopNestedScroll();
-  }
-
-  public abstract interface NestedScrollingParent {
-    method public abstract int getNestedScrollAxes();
-    method public abstract boolean onNestedFling(android.view.View, float, float, boolean);
-    method public abstract boolean onNestedPreFling(android.view.View, float, float);
-    method public abstract void onNestedPreScroll(android.view.View, int, int, int[]);
-    method public abstract void onNestedScroll(android.view.View, int, int, int, int);
-    method public abstract void onNestedScrollAccepted(android.view.View, android.view.View, int);
-    method public abstract boolean onStartNestedScroll(android.view.View, android.view.View, int);
-    method public abstract void onStopNestedScroll(android.view.View);
-  }
-
-  public class NestedScrollingParentHelper {
-    ctor public NestedScrollingParentHelper(android.view.ViewGroup);
-    method public int getNestedScrollAxes();
-    method public void onNestedScrollAccepted(android.view.View, android.view.View, int);
-    method public void onStopNestedScroll(android.view.View);
-  }
-
-  public abstract interface OnApplyWindowInsetsListener {
-    method public abstract android.support.v4.view.WindowInsetsCompat onApplyWindowInsets(android.view.View, android.support.v4.view.WindowInsetsCompat);
-  }
-
-  public abstract class PagerAdapter {
-    ctor public PagerAdapter();
-    method public void destroyItem(android.view.ViewGroup, int, java.lang.Object);
-    method public deprecated void destroyItem(android.view.View, int, java.lang.Object);
-    method public void finishUpdate(android.view.ViewGroup);
-    method public deprecated void finishUpdate(android.view.View);
-    method public abstract int getCount();
-    method public int getItemPosition(java.lang.Object);
-    method public java.lang.CharSequence getPageTitle(int);
-    method public float getPageWidth(int);
-    method public java.lang.Object instantiateItem(android.view.ViewGroup, int);
-    method public deprecated java.lang.Object instantiateItem(android.view.View, int);
-    method public abstract boolean isViewFromObject(android.view.View, java.lang.Object);
-    method public void notifyDataSetChanged();
-    method public void registerDataSetObserver(android.database.DataSetObserver);
-    method public void restoreState(android.os.Parcelable, java.lang.ClassLoader);
-    method public android.os.Parcelable saveState();
-    method public void setPrimaryItem(android.view.ViewGroup, int, java.lang.Object);
-    method public deprecated void setPrimaryItem(android.view.View, int, java.lang.Object);
-    method public void startUpdate(android.view.ViewGroup);
-    method public deprecated void startUpdate(android.view.View);
-    method public void unregisterDataSetObserver(android.database.DataSetObserver);
-    field public static final int POSITION_NONE = -2; // 0xfffffffe
-    field public static final int POSITION_UNCHANGED = -1; // 0xffffffff
-  }
-
-  public class PagerTabStrip extends android.support.v4.view.PagerTitleStrip {
-    ctor public PagerTabStrip(android.content.Context);
-    ctor public PagerTabStrip(android.content.Context, android.util.AttributeSet);
-    method public boolean getDrawFullUnderline();
-    method public int getTabIndicatorColor();
-    method public void setDrawFullUnderline(boolean);
-    method public void setTabIndicatorColor(int);
-    method public void setTabIndicatorColorResource(int);
-  }
-
-  public class PagerTitleStrip extends android.view.ViewGroup {
-    ctor public PagerTitleStrip(android.content.Context);
-    ctor public PagerTitleStrip(android.content.Context, android.util.AttributeSet);
-    method public int getTextSpacing();
-    method protected void onLayout(boolean, int, int, int, int);
-    method public void setGravity(int);
-    method public void setNonPrimaryAlpha(float);
-    method public void setTextColor(int);
-    method public void setTextSize(int, float);
-    method public void setTextSpacing(int);
-  }
-
-  public class ScaleGestureDetectorCompat {
-    method public static boolean isQuickScaleEnabled(java.lang.Object);
-    method public static void setQuickScaleEnabled(java.lang.Object, boolean);
-  }
-
-  public abstract interface ScrollingView {
-    method public abstract int computeHorizontalScrollExtent();
-    method public abstract int computeHorizontalScrollOffset();
-    method public abstract int computeHorizontalScrollRange();
-    method public abstract int computeVerticalScrollExtent();
-    method public abstract int computeVerticalScrollOffset();
-    method public abstract int computeVerticalScrollRange();
-  }
-
-  public class VelocityTrackerCompat {
-    ctor public VelocityTrackerCompat();
-    method public static float getXVelocity(android.view.VelocityTracker, int);
-    method public static float getYVelocity(android.view.VelocityTracker, int);
-  }
-
-  public class ViewCompat {
-    ctor public ViewCompat();
-    method public static android.support.v4.view.ViewPropertyAnimatorCompat animate(android.view.View);
-    method public static boolean canScrollHorizontally(android.view.View, int);
-    method public static boolean canScrollVertically(android.view.View, int);
-    method public static int combineMeasuredStates(int, int);
-    method public static android.support.v4.view.WindowInsetsCompat dispatchApplyWindowInsets(android.view.View, android.support.v4.view.WindowInsetsCompat);
-    method public static void dispatchFinishTemporaryDetach(android.view.View);
-    method public static boolean dispatchNestedFling(android.view.View, float, float, boolean);
-    method public static boolean dispatchNestedPreFling(android.view.View, float, float);
-    method public static boolean dispatchNestedPreScroll(android.view.View, int, int, int[], int[]);
-    method public static boolean dispatchNestedScroll(android.view.View, int, int, int, int, int[]);
-    method public static void dispatchStartTemporaryDetach(android.view.View);
-    method public static int getAccessibilityLiveRegion(android.view.View);
-    method public static android.support.v4.view.accessibility.AccessibilityNodeProviderCompat getAccessibilityNodeProvider(android.view.View);
-    method public static float getAlpha(android.view.View);
-    method public static android.content.res.ColorStateList getBackgroundTintList(android.view.View);
-    method public static android.graphics.PorterDuff.Mode getBackgroundTintMode(android.view.View);
-    method public static float getElevation(android.view.View);
-    method public static boolean getFitsSystemWindows(android.view.View);
-    method public static int getImportantForAccessibility(android.view.View);
-    method public static int getLabelFor(android.view.View);
-    method public static int getLayerType(android.view.View);
-    method public static int getLayoutDirection(android.view.View);
-    method public static int getMeasuredHeightAndState(android.view.View);
-    method public static int getMeasuredState(android.view.View);
-    method public static int getMeasuredWidthAndState(android.view.View);
-    method public static int getMinimumHeight(android.view.View);
-    method public static int getMinimumWidth(android.view.View);
-    method public static int getOverScrollMode(android.view.View);
-    method public static int getPaddingEnd(android.view.View);
-    method public static int getPaddingStart(android.view.View);
-    method public static android.view.ViewParent getParentForAccessibility(android.view.View);
-    method public static float getPivotX(android.view.View);
-    method public static float getPivotY(android.view.View);
-    method public static float getRotation(android.view.View);
-    method public static float getRotationX(android.view.View);
-    method public static float getRotationY(android.view.View);
-    method public static float getScaleX(android.view.View);
-    method public static float getScaleY(android.view.View);
-    method public static java.lang.String getTransitionName(android.view.View);
-    method public static float getTranslationX(android.view.View);
-    method public static float getTranslationY(android.view.View);
-    method public static float getTranslationZ(android.view.View);
-    method public static int getWindowSystemUiVisibility(android.view.View);
-    method public static float getX(android.view.View);
-    method public static float getY(android.view.View);
-    method public static float getZ(android.view.View);
-    method public static boolean hasAccessibilityDelegate(android.view.View);
-    method public static boolean hasNestedScrollingParent(android.view.View);
-    method public static boolean hasTransientState(android.view.View);
-    method public static boolean isAttachedToWindow(android.view.View);
-    method public static boolean isLaidOut(android.view.View);
-    method public static boolean isNestedScrollingEnabled(android.view.View);
-    method public static boolean isOpaque(android.view.View);
-    method public static boolean isPaddingRelative(android.view.View);
-    method public static void jumpDrawablesToCurrentState(android.view.View);
-    method public static void offsetLeftAndRight(android.view.View, int);
-    method public static void offsetTopAndBottom(android.view.View, int);
-    method public static android.support.v4.view.WindowInsetsCompat onApplyWindowInsets(android.view.View, android.support.v4.view.WindowInsetsCompat);
-    method public static void onInitializeAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
-    method public static void onInitializeAccessibilityNodeInfo(android.view.View, android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
-    method public static void onPopulateAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
-    method public static boolean performAccessibilityAction(android.view.View, int, android.os.Bundle);
-    method public static void postInvalidateOnAnimation(android.view.View);
-    method public static void postInvalidateOnAnimation(android.view.View, int, int, int, int);
-    method public static void postOnAnimation(android.view.View, java.lang.Runnable);
-    method public static void postOnAnimationDelayed(android.view.View, java.lang.Runnable, long);
-    method public static void requestApplyInsets(android.view.View);
-    method public static int resolveSizeAndState(int, int, int);
-    method public static void setAccessibilityDelegate(android.view.View, android.support.v4.view.AccessibilityDelegateCompat);
-    method public static void setAccessibilityLiveRegion(android.view.View, int);
-    method public static void setActivated(android.view.View, boolean);
-    method public static void setAlpha(android.view.View, float);
-    method public static void setBackgroundTintList(android.view.View, android.content.res.ColorStateList);
-    method public static void setBackgroundTintMode(android.view.View, android.graphics.PorterDuff.Mode);
-    method public static void setChildrenDrawingOrderEnabled(android.view.ViewGroup, boolean);
-    method public static void setElevation(android.view.View, float);
-    method public static void setFitsSystemWindows(android.view.View, boolean);
-    method public static void setHasTransientState(android.view.View, boolean);
-    method public static void setImportantForAccessibility(android.view.View, int);
-    method public static void setLabelFor(android.view.View, int);
-    method public static void setLayerPaint(android.view.View, android.graphics.Paint);
-    method public static void setLayerType(android.view.View, int, android.graphics.Paint);
-    method public static void setLayoutDirection(android.view.View, int);
-    method public static void setNestedScrollingEnabled(android.view.View, boolean);
-    method public static void setOnApplyWindowInsetsListener(android.view.View, android.support.v4.view.OnApplyWindowInsetsListener);
-    method public static void setOverScrollMode(android.view.View, int);
-    method public static void setPaddingRelative(android.view.View, int, int, int, int);
-    method public static void setPivotX(android.view.View, float);
-    method public static void setPivotY(android.view.View, float);
-    method public static void setRotation(android.view.View, float);
-    method public static void setRotationX(android.view.View, float);
-    method public static void setRotationY(android.view.View, float);
-    method public static void setSaveFromParentEnabled(android.view.View, boolean);
-    method public static void setScaleX(android.view.View, float);
-    method public static void setScaleY(android.view.View, float);
-    method public static void setTransitionName(android.view.View, java.lang.String);
-    method public static void setTranslationX(android.view.View, float);
-    method public static void setTranslationY(android.view.View, float);
-    method public static void setTranslationZ(android.view.View, float);
-    method public static void setX(android.view.View, float);
-    method public static void setY(android.view.View, float);
-    method public static boolean startNestedScroll(android.view.View, int);
-    method public static void stopNestedScroll(android.view.View);
-    field public static final int ACCESSIBILITY_LIVE_REGION_ASSERTIVE = 2; // 0x2
-    field public static final int ACCESSIBILITY_LIVE_REGION_NONE = 0; // 0x0
-    field public static final int ACCESSIBILITY_LIVE_REGION_POLITE = 1; // 0x1
-    field public static final int IMPORTANT_FOR_ACCESSIBILITY_AUTO = 0; // 0x0
-    field public static final int IMPORTANT_FOR_ACCESSIBILITY_NO = 2; // 0x2
-    field public static final int IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS = 4; // 0x4
-    field public static final int IMPORTANT_FOR_ACCESSIBILITY_YES = 1; // 0x1
-    field public static final int LAYER_TYPE_HARDWARE = 2; // 0x2
-    field public static final int LAYER_TYPE_NONE = 0; // 0x0
-    field public static final int LAYER_TYPE_SOFTWARE = 1; // 0x1
-    field public static final int LAYOUT_DIRECTION_INHERIT = 2; // 0x2
-    field public static final int LAYOUT_DIRECTION_LOCALE = 3; // 0x3
-    field public static final int LAYOUT_DIRECTION_LTR = 0; // 0x0
-    field public static final int LAYOUT_DIRECTION_RTL = 1; // 0x1
-    field public static final int MEASURED_HEIGHT_STATE_SHIFT = 16; // 0x10
-    field public static final int MEASURED_SIZE_MASK = 16777215; // 0xffffff
-    field public static final int MEASURED_STATE_MASK = -16777216; // 0xff000000
-    field public static final int MEASURED_STATE_TOO_SMALL = 16777216; // 0x1000000
-    field public static final int OVER_SCROLL_ALWAYS = 0; // 0x0
-    field public static final int OVER_SCROLL_IF_CONTENT_SCROLLS = 1; // 0x1
-    field public static final int OVER_SCROLL_NEVER = 2; // 0x2
-    field public static final int SCROLL_AXIS_HORIZONTAL = 1; // 0x1
-    field public static final int SCROLL_AXIS_NONE = 0; // 0x0
-    field public static final int SCROLL_AXIS_VERTICAL = 2; // 0x2
-  }
-
-  public class ViewConfigurationCompat {
-    ctor public ViewConfigurationCompat();
-    method public static int getScaledPagingTouchSlop(android.view.ViewConfiguration);
-    method public static boolean hasPermanentMenuKey(android.view.ViewConfiguration);
-  }
-
-  public class ViewGroupCompat {
-    method public static int getLayoutMode(android.view.ViewGroup);
-    method public static int getNestedScrollAxes(android.view.ViewGroup);
-    method public static boolean isTransitionGroup(android.view.ViewGroup);
-    method public static boolean onRequestSendAccessibilityEvent(android.view.ViewGroup, android.view.View, android.view.accessibility.AccessibilityEvent);
-    method public static void setLayoutMode(android.view.ViewGroup, int);
-    method public static void setMotionEventSplittingEnabled(android.view.ViewGroup, boolean);
-    method public static void setTransitionGroup(android.view.ViewGroup, boolean);
-    field public static final int LAYOUT_MODE_CLIP_BOUNDS = 0; // 0x0
-    field public static final int LAYOUT_MODE_OPTICAL_BOUNDS = 1; // 0x1
-  }
-
-  public class ViewPager extends android.view.ViewGroup {
-    ctor public ViewPager(android.content.Context);
-    ctor public ViewPager(android.content.Context, android.util.AttributeSet);
-    method public void addOnPageChangeListener(android.support.v4.view.ViewPager.OnPageChangeListener);
-    method public boolean arrowScroll(int);
-    method public boolean beginFakeDrag();
-    method protected boolean canScroll(android.view.View, boolean, int, int, int);
-    method public void clearOnPageChangeListeners();
-    method public void endFakeDrag();
-    method public boolean executeKeyEvent(android.view.KeyEvent);
-    method public void fakeDragBy(float);
-    method public android.support.v4.view.PagerAdapter getAdapter();
-    method public int getCurrentItem();
-    method public int getOffscreenPageLimit();
-    method public int getPageMargin();
-    method public boolean isFakeDragging();
-    method protected void onLayout(boolean, int, int, int, int);
-    method protected void onPageScrolled(int, float, int);
-    method public void onRestoreInstanceState(android.os.Parcelable);
-    method public android.os.Parcelable onSaveInstanceState();
-    method public void removeOnPageChangeListener(android.support.v4.view.ViewPager.OnPageChangeListener);
-    method public void setAdapter(android.support.v4.view.PagerAdapter);
-    method public void setCurrentItem(int);
-    method public void setCurrentItem(int, boolean);
-    method public void setOffscreenPageLimit(int);
-    method public deprecated void setOnPageChangeListener(android.support.v4.view.ViewPager.OnPageChangeListener);
-    method public void setPageMargin(int);
-    method public void setPageMarginDrawable(android.graphics.drawable.Drawable);
-    method public void setPageMarginDrawable(int);
-    method public void setPageTransformer(boolean, android.support.v4.view.ViewPager.PageTransformer);
-    field public static final int SCROLL_STATE_DRAGGING = 1; // 0x1
-    field public static final int SCROLL_STATE_IDLE = 0; // 0x0
-    field public static final int SCROLL_STATE_SETTLING = 2; // 0x2
-  }
-
-  public static class ViewPager.LayoutParams extends android.view.ViewGroup.LayoutParams {
-    ctor public ViewPager.LayoutParams();
-    ctor public ViewPager.LayoutParams(android.content.Context, android.util.AttributeSet);
-    field public int gravity;
-    field public boolean isDecor;
-  }
-
-  public static abstract interface ViewPager.OnPageChangeListener {
-    method public abstract void onPageScrollStateChanged(int);
-    method public abstract void onPageScrolled(int, float, int);
-    method public abstract void onPageSelected(int);
-  }
-
-  public static abstract interface ViewPager.PageTransformer {
-    method public abstract void transformPage(android.view.View, float);
-  }
-
-  public static class ViewPager.SavedState extends android.view.View.BaseSavedState {
-    ctor public ViewPager.SavedState(android.os.Parcelable);
-    field public static final android.os.Parcelable.Creator<android.support.v4.view.ViewPager.SavedState> CREATOR;
-  }
-
-  public static class ViewPager.SimpleOnPageChangeListener implements android.support.v4.view.ViewPager.OnPageChangeListener {
-    ctor public ViewPager.SimpleOnPageChangeListener();
-    method public void onPageScrollStateChanged(int);
-    method public void onPageScrolled(int, float, int);
-    method public void onPageSelected(int);
-  }
-
-  public class ViewParentCompat {
-    method public static void notifySubtreeAccessibilityStateChanged(android.view.ViewParent, android.view.View, android.view.View, int);
-    method public static boolean onNestedFling(android.view.ViewParent, android.view.View, float, float, boolean);
-    method public static boolean onNestedPreFling(android.view.ViewParent, android.view.View, float, float);
-    method public static void onNestedPreScroll(android.view.ViewParent, android.view.View, int, int, int[]);
-    method public static void onNestedScroll(android.view.ViewParent, android.view.View, int, int, int, int);
-    method public static void onNestedScrollAccepted(android.view.ViewParent, android.view.View, android.view.View, int);
-    method public static boolean onStartNestedScroll(android.view.ViewParent, android.view.View, android.view.View, int);
-    method public static void onStopNestedScroll(android.view.ViewParent, android.view.View);
-    method public static boolean requestSendAccessibilityEvent(android.view.ViewParent, android.view.View, android.view.accessibility.AccessibilityEvent);
-  }
-
-  public class ViewPropertyAnimatorCompat {
-    method public android.support.v4.view.ViewPropertyAnimatorCompat alpha(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat alphaBy(float);
-    method public void cancel();
-    method public long getDuration();
-    method public android.view.animation.Interpolator getInterpolator();
-    method public long getStartDelay();
-    method public android.support.v4.view.ViewPropertyAnimatorCompat rotation(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat rotationBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat rotationX(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat rotationXBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat rotationY(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat rotationYBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat scaleX(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat scaleXBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat scaleY(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat scaleYBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat setDuration(long);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat setInterpolator(android.view.animation.Interpolator);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat setListener(android.support.v4.view.ViewPropertyAnimatorListener);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat setStartDelay(long);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat setUpdateListener(android.support.v4.view.ViewPropertyAnimatorUpdateListener);
-    method public void start();
-    method public android.support.v4.view.ViewPropertyAnimatorCompat translationX(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat translationXBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat translationY(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat translationYBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat translationZ(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat translationZBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat withEndAction(java.lang.Runnable);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat withLayer();
-    method public android.support.v4.view.ViewPropertyAnimatorCompat withStartAction(java.lang.Runnable);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat x(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat xBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat y(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat yBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat z(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat zBy(float);
-  }
-
-  public abstract interface ViewPropertyAnimatorListener {
-    method public abstract void onAnimationCancel(android.view.View);
-    method public abstract void onAnimationEnd(android.view.View);
-    method public abstract void onAnimationStart(android.view.View);
-  }
-
-  public class ViewPropertyAnimatorListenerAdapter implements android.support.v4.view.ViewPropertyAnimatorListener {
-    ctor public ViewPropertyAnimatorListenerAdapter();
-    method public void onAnimationCancel(android.view.View);
-    method public void onAnimationEnd(android.view.View);
-    method public void onAnimationStart(android.view.View);
-  }
-
-  public abstract interface ViewPropertyAnimatorUpdateListener {
-    method public abstract void onAnimationUpdate(android.view.View);
-  }
-
-  public class WindowCompat {
-    ctor public WindowCompat();
-    field public static final int FEATURE_ACTION_BAR = 8; // 0x8
-    field public static final int FEATURE_ACTION_BAR_OVERLAY = 9; // 0x9
-    field public static final int FEATURE_ACTION_MODE_OVERLAY = 10; // 0xa
-  }
-
-  public class WindowInsetsCompat {
-    method public android.support.v4.view.WindowInsetsCompat consumeStableInsets();
-    method public android.support.v4.view.WindowInsetsCompat consumeSystemWindowInsets();
-    method public int getStableInsetBottom();
-    method public int getStableInsetLeft();
-    method public int getStableInsetRight();
-    method public int getStableInsetTop();
-    method public int getSystemWindowInsetBottom();
-    method public int getSystemWindowInsetLeft();
-    method public int getSystemWindowInsetRight();
-    method public int getSystemWindowInsetTop();
-    method public boolean hasInsets();
-    method public boolean hasStableInsets();
-    method public boolean hasSystemWindowInsets();
-    method public boolean isConsumed();
-    method public boolean isRound();
-    method public android.support.v4.view.WindowInsetsCompat replaceSystemWindowInsets(int, int, int, int);
-    method public android.support.v4.view.WindowInsetsCompat replaceSystemWindowInsets(android.graphics.Rect);
-  }
-
-}
-
-package android.support.v4.view.accessibility {
-
-  public class AccessibilityEventCompat {
-    method public static void appendRecord(android.view.accessibility.AccessibilityEvent, android.support.v4.view.accessibility.AccessibilityRecordCompat);
-    method public static android.support.v4.view.accessibility.AccessibilityRecordCompat asRecord(android.view.accessibility.AccessibilityEvent);
-    method public static int getContentChangeTypes(android.view.accessibility.AccessibilityEvent);
-    method public static android.support.v4.view.accessibility.AccessibilityRecordCompat getRecord(android.view.accessibility.AccessibilityEvent, int);
-    method public static int getRecordCount(android.view.accessibility.AccessibilityEvent);
-    method public static void setContentChangeTypes(android.view.accessibility.AccessibilityEvent, int);
-    field public static final int CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION = 4; // 0x4
-    field public static final int CONTENT_CHANGE_TYPE_SUBTREE = 1; // 0x1
-    field public static final int CONTENT_CHANGE_TYPE_TEXT = 2; // 0x2
-    field public static final int CONTENT_CHANGE_TYPE_UNDEFINED = 0; // 0x0
-    field public static final int TYPES_ALL_MASK = -1; // 0xffffffff
-    field public static final int TYPE_ANNOUNCEMENT = 16384; // 0x4000
-    field public static final int TYPE_GESTURE_DETECTION_END = 524288; // 0x80000
-    field public static final int TYPE_GESTURE_DETECTION_START = 262144; // 0x40000
-    field public static final int TYPE_TOUCH_EXPLORATION_GESTURE_END = 1024; // 0x400
-    field public static final int TYPE_TOUCH_EXPLORATION_GESTURE_START = 512; // 0x200
-    field public static final int TYPE_TOUCH_INTERACTION_END = 2097152; // 0x200000
-    field public static final int TYPE_TOUCH_INTERACTION_START = 1048576; // 0x100000
-    field public static final int TYPE_VIEW_ACCESSIBILITY_FOCUSED = 32768; // 0x8000
-    field public static final int TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED = 65536; // 0x10000
-    field public static final int TYPE_VIEW_HOVER_ENTER = 128; // 0x80
-    field public static final int TYPE_VIEW_HOVER_EXIT = 256; // 0x100
-    field public static final int TYPE_VIEW_SCROLLED = 4096; // 0x1000
-    field public static final int TYPE_VIEW_TEXT_SELECTION_CHANGED = 8192; // 0x2000
-    field public static final int TYPE_VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITY = 131072; // 0x20000
-    field public static final int TYPE_WINDOW_CONTENT_CHANGED = 2048; // 0x800
-  }
-
-  public class AccessibilityManagerCompat {
-    ctor public AccessibilityManagerCompat();
-    method public static boolean addAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager, android.support.v4.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat);
-    method public static java.util.List<android.accessibilityservice.AccessibilityServiceInfo> getEnabledAccessibilityServiceList(android.view.accessibility.AccessibilityManager, int);
-    method public static java.util.List<android.accessibilityservice.AccessibilityServiceInfo> getInstalledAccessibilityServiceList(android.view.accessibility.AccessibilityManager);
-    method public static boolean isTouchExplorationEnabled(android.view.accessibility.AccessibilityManager);
-    method public static boolean removeAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager, android.support.v4.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat);
-  }
-
-  public static abstract class AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat {
-    ctor public AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat();
-    method public abstract void onAccessibilityStateChanged(boolean);
-  }
-
-  public class AccessibilityNodeInfoCompat {
-    ctor public AccessibilityNodeInfoCompat(java.lang.Object);
-    method public void addAction(int);
-    method public void addAction(android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat);
-    method public void addChild(android.view.View);
-    method public void addChild(android.view.View, int);
-    method public java.util.List<android.support.v4.view.accessibility.AccessibilityNodeInfoCompat> findAccessibilityNodeInfosByText(java.lang.String);
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat findFocus(int);
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat focusSearch(int);
-    method public java.util.List<android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat> getActionList();
-    method public int getActions();
-    method public void getBoundsInParent(android.graphics.Rect);
-    method public void getBoundsInScreen(android.graphics.Rect);
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getChild(int);
-    method public int getChildCount();
-    method public java.lang.CharSequence getClassName();
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat getCollectionInfo();
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat getCollectionItemInfo();
-    method public java.lang.CharSequence getContentDescription();
-    method public java.lang.CharSequence getError();
-    method public java.lang.Object getInfo();
-    method public int getLiveRegion();
-    method public int getMovementGranularities();
-    method public java.lang.CharSequence getPackageName();
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getParent();
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat getRangeInfo();
-    method public java.lang.CharSequence getText();
-    method public java.lang.String getViewIdResourceName();
-    method public int getWindowId();
-    method public boolean isAccessibilityFocused();
-    method public boolean isCheckable();
-    method public boolean isChecked();
-    method public boolean isClickable();
-    method public boolean isContentInvalid();
-    method public boolean isEnabled();
-    method public boolean isFocusable();
-    method public boolean isFocused();
-    method public boolean isLongClickable();
-    method public boolean isPassword();
-    method public boolean isScrollable();
-    method public boolean isSelected();
-    method public boolean isVisibleToUser();
-    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat obtain(android.view.View);
-    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat obtain(android.view.View, int);
-    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat obtain();
-    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat obtain(android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
-    method public boolean performAction(int);
-    method public boolean performAction(int, android.os.Bundle);
-    method public void recycle();
-    method public void setAccessibilityFocused(boolean);
-    method public void setBoundsInParent(android.graphics.Rect);
-    method public void setBoundsInScreen(android.graphics.Rect);
-    method public void setCheckable(boolean);
-    method public void setChecked(boolean);
-    method public void setClassName(java.lang.CharSequence);
-    method public void setClickable(boolean);
-    method public void setCollectionInfo(java.lang.Object);
-    method public void setCollectionItemInfo(java.lang.Object);
-    method public void setContentDescription(java.lang.CharSequence);
-    method public void setContentInvalid(boolean);
-    method public void setEnabled(boolean);
-    method public void setError(java.lang.CharSequence);
-    method public void setFocusable(boolean);
-    method public void setFocused(boolean);
-    method public void setLabelFor(android.view.View);
-    method public void setLabelFor(android.view.View, int);
-    method public void setLiveRegion(int);
-    method public void setLongClickable(boolean);
-    method public void setMovementGranularities(int);
-    method public void setPackageName(java.lang.CharSequence);
-    method public void setParent(android.view.View);
-    method public void setParent(android.view.View, int);
-    method public void setPassword(boolean);
-    method public void setScrollable(boolean);
-    method public void setSelected(boolean);
-    method public void setSource(android.view.View);
-    method public void setSource(android.view.View, int);
-    method public void setText(java.lang.CharSequence);
-    method public void setViewIdResourceName(java.lang.String);
-    method public void setVisibleToUser(boolean);
-    field public static final int ACTION_ACCESSIBILITY_FOCUS = 64; // 0x40
-    field public static final java.lang.String ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN = "ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN";
-    field public static final java.lang.String ACTION_ARGUMENT_HTML_ELEMENT_STRING = "ACTION_ARGUMENT_HTML_ELEMENT_STRING";
-    field public static final java.lang.String ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT = "ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT";
-    field public static final java.lang.String ACTION_ARGUMENT_SELECTION_END_INT = "ACTION_ARGUMENT_SELECTION_END_INT";
-    field public static final java.lang.String ACTION_ARGUMENT_SELECTION_START_INT = "ACTION_ARGUMENT_SELECTION_START_INT";
-    field public static final java.lang.String ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE = "ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE";
-    field public static final int ACTION_CLEAR_ACCESSIBILITY_FOCUS = 128; // 0x80
-    field public static final int ACTION_CLEAR_FOCUS = 2; // 0x2
-    field public static final int ACTION_CLEAR_SELECTION = 8; // 0x8
-    field public static final int ACTION_CLICK = 16; // 0x10
-    field public static final int ACTION_COPY = 16384; // 0x4000
-    field public static final int ACTION_CUT = 65536; // 0x10000
-    field public static final int ACTION_FOCUS = 1; // 0x1
-    field public static final int ACTION_LONG_CLICK = 32; // 0x20
-    field public static final int ACTION_NEXT_AT_MOVEMENT_GRANULARITY = 256; // 0x100
-    field public static final int ACTION_NEXT_HTML_ELEMENT = 1024; // 0x400
-    field public static final int ACTION_PASTE = 32768; // 0x8000
-    field public static final int ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY = 512; // 0x200
-    field public static final int ACTION_PREVIOUS_HTML_ELEMENT = 2048; // 0x800
-    field public static final int ACTION_SCROLL_BACKWARD = 8192; // 0x2000
-    field public static final int ACTION_SCROLL_FORWARD = 4096; // 0x1000
-    field public static final int ACTION_SELECT = 4; // 0x4
-    field public static final int ACTION_SET_SELECTION = 131072; // 0x20000
-    field public static final int ACTION_SET_TEXT = 2097152; // 0x200000
-    field public static final int FOCUS_ACCESSIBILITY = 2; // 0x2
-    field public static final int FOCUS_INPUT = 1; // 0x1
-    field public static final int MOVEMENT_GRANULARITY_CHARACTER = 1; // 0x1
-    field public static final int MOVEMENT_GRANULARITY_LINE = 4; // 0x4
-    field public static final int MOVEMENT_GRANULARITY_PAGE = 16; // 0x10
-    field public static final int MOVEMENT_GRANULARITY_PARAGRAPH = 8; // 0x8
-    field public static final int MOVEMENT_GRANULARITY_WORD = 2; // 0x2
-  }
-
-  public static class AccessibilityNodeInfoCompat.AccessibilityActionCompat {
-    ctor public AccessibilityNodeInfoCompat.AccessibilityActionCompat(int, java.lang.CharSequence);
-    method public int getId();
-    method public java.lang.CharSequence getLabel();
-  }
-
-  public static class AccessibilityNodeInfoCompat.CollectionInfoCompat {
-    method public int getColumnCount();
-    method public int getRowCount();
-    method public boolean isHierarchical();
-    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat obtain(int, int, boolean, int);
-    field public static final int SELECTION_MODE_MULTIPLE = 2; // 0x2
-    field public static final int SELECTION_MODE_NONE = 0; // 0x0
-    field public static final int SELECTION_MODE_SINGLE = 1; // 0x1
-  }
-
-  public static class AccessibilityNodeInfoCompat.CollectionItemInfoCompat {
-    method public int getColumnIndex();
-    method public int getColumnSpan();
-    method public int getRowIndex();
-    method public int getRowSpan();
-    method public boolean isHeading();
-    method public boolean isSelected();
-    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat obtain(int, int, int, int, boolean, boolean);
-  }
-
-  public static class AccessibilityNodeInfoCompat.RangeInfoCompat {
-    method public float getCurrent();
-    method public float getMax();
-    method public float getMin();
-    method public int getType();
-    field public static final int RANGE_TYPE_FLOAT = 1; // 0x1
-    field public static final int RANGE_TYPE_INT = 0; // 0x0
-    field public static final int RANGE_TYPE_PERCENT = 2; // 0x2
-  }
-
-  public class AccessibilityNodeProviderCompat {
-    ctor public AccessibilityNodeProviderCompat();
-    ctor public AccessibilityNodeProviderCompat(java.lang.Object);
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat createAccessibilityNodeInfo(int);
-    method public java.util.List<android.support.v4.view.accessibility.AccessibilityNodeInfoCompat> findAccessibilityNodeInfosByText(java.lang.String, int);
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat findFocus(int);
-    method public java.lang.Object getProvider();
-    method public boolean performAction(int, int, android.os.Bundle);
-  }
-
-  public class AccessibilityRecordCompat {
-    ctor public deprecated AccessibilityRecordCompat(java.lang.Object);
-    method public int getAddedCount();
-    method public java.lang.CharSequence getBeforeText();
-    method public java.lang.CharSequence getClassName();
-    method public java.lang.CharSequence getContentDescription();
-    method public int getCurrentItemIndex();
-    method public int getFromIndex();
-    method public deprecated java.lang.Object getImpl();
-    method public int getItemCount();
-    method public int getMaxScrollX();
-    method public int getMaxScrollY();
-    method public android.os.Parcelable getParcelableData();
-    method public int getRemovedCount();
-    method public int getScrollX();
-    method public int getScrollY();
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getSource();
-    method public java.util.List<java.lang.CharSequence> getText();
-    method public int getToIndex();
-    method public int getWindowId();
-    method public boolean isChecked();
-    method public boolean isEnabled();
-    method public boolean isFullScreen();
-    method public boolean isPassword();
-    method public boolean isScrollable();
-    method public static android.support.v4.view.accessibility.AccessibilityRecordCompat obtain(android.support.v4.view.accessibility.AccessibilityRecordCompat);
-    method public static android.support.v4.view.accessibility.AccessibilityRecordCompat obtain();
-    method public void recycle();
-    method public void setAddedCount(int);
-    method public void setBeforeText(java.lang.CharSequence);
-    method public void setChecked(boolean);
-    method public void setClassName(java.lang.CharSequence);
-    method public void setContentDescription(java.lang.CharSequence);
-    method public void setCurrentItemIndex(int);
-    method public void setEnabled(boolean);
-    method public void setFromIndex(int);
-    method public void setFullScreen(boolean);
-    method public void setItemCount(int);
-    method public void setMaxScrollX(int);
-    method public void setMaxScrollY(int);
-    method public void setParcelableData(android.os.Parcelable);
-    method public void setPassword(boolean);
-    method public void setRemovedCount(int);
-    method public void setScrollX(int);
-    method public void setScrollY(int);
-    method public void setScrollable(boolean);
-    method public void setSource(android.view.View);
-    method public void setSource(android.view.View, int);
-    method public void setToIndex(int);
-  }
-
-}
-
-package android.support.v4.view.animation {
-
-  public class FastOutLinearInInterpolator extends android.support.v4.view.animation.LookupTableInterpolator {
-    ctor public FastOutLinearInInterpolator();
-  }
-
-  public class FastOutSlowInInterpolator extends android.support.v4.view.animation.LookupTableInterpolator {
-    ctor public FastOutSlowInInterpolator();
-  }
-
-  public class LinearOutSlowInInterpolator extends android.support.v4.view.animation.LookupTableInterpolator {
-    ctor public LinearOutSlowInInterpolator();
-  }
-
-   abstract class LookupTableInterpolator implements android.view.animation.Interpolator {
-    ctor public LookupTableInterpolator(float[]);
-    method public float getInterpolation(float);
-  }
-
-  public class PathInterpolatorCompat {
-    method public static android.view.animation.Interpolator create(android.graphics.Path);
-    method public static android.view.animation.Interpolator create(float, float);
-    method public static android.view.animation.Interpolator create(float, float, float, float);
-  }
-
-}
-
-package android.support.v4.widget {
-
-  public abstract class AutoScrollHelper implements android.view.View.OnTouchListener {
-    ctor public AutoScrollHelper(android.view.View);
-    method public abstract boolean canTargetScrollHorizontally(int);
-    method public abstract boolean canTargetScrollVertically(int);
-    method public boolean isEnabled();
-    method public boolean isExclusive();
-    method public boolean onTouch(android.view.View, android.view.MotionEvent);
-    method public abstract void scrollTargetBy(int, int);
-    method public android.support.v4.widget.AutoScrollHelper setActivationDelay(int);
-    method public android.support.v4.widget.AutoScrollHelper setEdgeType(int);
-    method public android.support.v4.widget.AutoScrollHelper setEnabled(boolean);
-    method public android.support.v4.widget.AutoScrollHelper setExclusive(boolean);
-    method public android.support.v4.widget.AutoScrollHelper setMaximumEdges(float, float);
-    method public android.support.v4.widget.AutoScrollHelper setMaximumVelocity(float, float);
-    method public android.support.v4.widget.AutoScrollHelper setMinimumVelocity(float, float);
-    method public android.support.v4.widget.AutoScrollHelper setRampDownDuration(int);
-    method public android.support.v4.widget.AutoScrollHelper setRampUpDuration(int);
-    method public android.support.v4.widget.AutoScrollHelper setRelativeEdges(float, float);
-    method public android.support.v4.widget.AutoScrollHelper setRelativeVelocity(float, float);
-    field public static final int EDGE_TYPE_INSIDE = 0; // 0x0
-    field public static final int EDGE_TYPE_INSIDE_EXTEND = 1; // 0x1
-    field public static final int EDGE_TYPE_OUTSIDE = 2; // 0x2
-    field public static final float NO_MAX = 3.4028235E38f;
-    field public static final float NO_MIN = 0.0f;
-    field public static final float RELATIVE_UNSPECIFIED = 0.0f;
-  }
-
-  public class ContentLoadingProgressBar extends android.widget.ProgressBar {
-    ctor public ContentLoadingProgressBar(android.content.Context);
-    ctor public ContentLoadingProgressBar(android.content.Context, android.util.AttributeSet);
-    method public void hide();
-    method public void onAttachedToWindow();
-    method public void onDetachedFromWindow();
-    method public void show();
-  }
-
-  public abstract class CursorAdapter extends android.widget.BaseAdapter {
-    ctor public deprecated CursorAdapter(android.content.Context, android.database.Cursor);
-    ctor public CursorAdapter(android.content.Context, android.database.Cursor, boolean);
-    ctor public CursorAdapter(android.content.Context, android.database.Cursor, int);
-    method public abstract void bindView(android.view.View, android.content.Context, android.database.Cursor);
-    method public void changeCursor(android.database.Cursor);
-    method public java.lang.CharSequence convertToString(android.database.Cursor);
-    method public int getCount();
-    method public android.database.Cursor getCursor();
-    method public android.widget.Filter getFilter();
-    method public android.widget.FilterQueryProvider getFilterQueryProvider();
-    method public java.lang.Object getItem(int);
-    method public long getItemId(int);
-    method public android.view.View getView(int, android.view.View, android.view.ViewGroup);
-    method protected deprecated void init(android.content.Context, android.database.Cursor, boolean);
-    method public android.view.View newDropDownView(android.content.Context, android.database.Cursor, android.view.ViewGroup);
-    method public abstract android.view.View newView(android.content.Context, android.database.Cursor, android.view.ViewGroup);
-    method protected void onContentChanged();
-    method public android.database.Cursor runQueryOnBackgroundThread(java.lang.CharSequence);
-    method public void setFilterQueryProvider(android.widget.FilterQueryProvider);
-    method public android.database.Cursor swapCursor(android.database.Cursor);
-    field public static final deprecated int FLAG_AUTO_REQUERY = 1; // 0x1
-    field public static final int FLAG_REGISTER_CONTENT_OBSERVER = 2; // 0x2
-  }
-
-  public class DrawerLayout extends android.view.ViewGroup {
-    ctor public DrawerLayout(android.content.Context);
-    ctor public DrawerLayout(android.content.Context, android.util.AttributeSet);
-    ctor public DrawerLayout(android.content.Context, android.util.AttributeSet, int);
-    method public void closeDrawer(android.view.View);
-    method public void closeDrawer(int);
-    method public void closeDrawers();
-    method public int getDrawerLockMode(int);
-    method public int getDrawerLockMode(android.view.View);
-    method public java.lang.CharSequence getDrawerTitle(int);
-    method public android.graphics.drawable.Drawable getStatusBarBackgroundDrawable();
-    method public boolean isDrawerOpen(android.view.View);
-    method public boolean isDrawerOpen(int);
-    method public boolean isDrawerVisible(android.view.View);
-    method public boolean isDrawerVisible(int);
-    method public void onDraw(android.graphics.Canvas);
-    method protected void onLayout(boolean, int, int, int, int);
-    method public void openDrawer(android.view.View);
-    method public void openDrawer(int);
-    method public void setDrawerListener(android.support.v4.widget.DrawerLayout.DrawerListener);
-    method public void setDrawerLockMode(int);
-    method public void setDrawerLockMode(int, int);
-    method public void setDrawerLockMode(int, android.view.View);
-    method public void setDrawerShadow(android.graphics.drawable.Drawable, int);
-    method public void setDrawerShadow(int, int);
-    method public void setDrawerTitle(int, java.lang.CharSequence);
-    method public void setScrimColor(int);
-    method public void setStatusBarBackground(android.graphics.drawable.Drawable);
-    method public void setStatusBarBackground(int);
-    method public void setStatusBarBackgroundColor(int);
-    field public static final int LOCK_MODE_LOCKED_CLOSED = 1; // 0x1
-    field public static final int LOCK_MODE_LOCKED_OPEN = 2; // 0x2
-    field public static final int LOCK_MODE_UNLOCKED = 0; // 0x0
-    field public static final int STATE_DRAGGING = 1; // 0x1
-    field public static final int STATE_IDLE = 0; // 0x0
-    field public static final int STATE_SETTLING = 2; // 0x2
-  }
-
-  public static abstract interface DrawerLayout.DrawerListener {
-    method public abstract void onDrawerClosed(android.view.View);
-    method public abstract void onDrawerOpened(android.view.View);
-    method public abstract void onDrawerSlide(android.view.View, float);
-    method public abstract void onDrawerStateChanged(int);
-  }
-
-  public static class DrawerLayout.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
-    ctor public DrawerLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public DrawerLayout.LayoutParams(int, int);
-    ctor public DrawerLayout.LayoutParams(int, int, int);
-    ctor public DrawerLayout.LayoutParams(android.support.v4.widget.DrawerLayout.LayoutParams);
-    ctor public DrawerLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public DrawerLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    field public int gravity;
-  }
-
-  protected static class DrawerLayout.SavedState extends android.view.View.BaseSavedState {
-    ctor public DrawerLayout.SavedState(android.os.Parcel);
-    ctor public DrawerLayout.SavedState(android.os.Parcelable);
-    field public static final android.os.Parcelable.Creator<android.support.v4.widget.DrawerLayout.SavedState> CREATOR;
-  }
-
-  public static abstract class DrawerLayout.SimpleDrawerListener implements android.support.v4.widget.DrawerLayout.DrawerListener {
-    ctor public DrawerLayout.SimpleDrawerListener();
-    method public void onDrawerClosed(android.view.View);
-    method public void onDrawerOpened(android.view.View);
-    method public void onDrawerSlide(android.view.View, float);
-    method public void onDrawerStateChanged(int);
-  }
-
-  public class EdgeEffectCompat {
-    ctor public EdgeEffectCompat(android.content.Context);
-    method public boolean draw(android.graphics.Canvas);
-    method public void finish();
-    method public boolean isFinished();
-    method public boolean onAbsorb(int);
-    method public deprecated boolean onPull(float);
-    method public boolean onPull(float, float);
-    method public boolean onRelease();
-    method public void setSize(int, int);
-  }
-
-  public abstract class ExploreByTouchHelper extends android.support.v4.view.AccessibilityDelegateCompat {
-    ctor public ExploreByTouchHelper(android.view.View);
-    method public boolean dispatchHoverEvent(android.view.MotionEvent);
-    method public int getFocusedVirtualView();
-    method protected abstract int getVirtualViewAt(float, float);
-    method protected abstract void getVisibleVirtualViews(java.util.List<java.lang.Integer>);
-    method public void invalidateRoot();
-    method public void invalidateVirtualView(int);
-    method protected abstract boolean onPerformActionForVirtualView(int, int, android.os.Bundle);
-    method protected abstract void onPopulateEventForVirtualView(int, android.view.accessibility.AccessibilityEvent);
-    method protected abstract void onPopulateNodeForVirtualView(int, android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
-    method public boolean sendEventForVirtualView(int, int);
-    field public static final int INVALID_ID = -2147483648; // 0x80000000
-  }
-
-  public class ListPopupWindowCompat {
-    method public static android.view.View.OnTouchListener createDragToOpenListener(java.lang.Object, android.view.View);
-  }
-
-  public class ListViewAutoScrollHelper extends android.support.v4.widget.AutoScrollHelper {
-    ctor public ListViewAutoScrollHelper(android.widget.ListView);
-    method public boolean canTargetScrollHorizontally(int);
-    method public boolean canTargetScrollVertically(int);
-    method public void scrollTargetBy(int, int);
-  }
-
-  public class NestedScrollView extends android.widget.FrameLayout implements android.support.v4.view.NestedScrollingChild android.support.v4.view.NestedScrollingParent {
-    ctor public NestedScrollView(android.content.Context);
-    ctor public NestedScrollView(android.content.Context, android.util.AttributeSet);
-    ctor public NestedScrollView(android.content.Context, android.util.AttributeSet, int);
-    method public boolean arrowScroll(int);
-    method protected int computeScrollDeltaToGetChildRectOnScreen(android.graphics.Rect);
-    method public boolean executeKeyEvent(android.view.KeyEvent);
-    method public void fling(int);
-    method public boolean fullScroll(int);
-    method public int getMaxScrollAmount();
-    method public boolean isFillViewport();
-    method public boolean isSmoothScrollingEnabled();
-    method public void onAttachedToWindow();
-    method public boolean pageScroll(int);
-    method public void setFillViewport(boolean);
-    method public void setSmoothScrollingEnabled(boolean);
-    method public final void smoothScrollBy(int, int);
-    method public final void smoothScrollTo(int, int);
-  }
-
-  public class PopupMenuCompat {
-    method public static android.view.View.OnTouchListener getDragToOpenListener(java.lang.Object);
-  }
-
-  public class PopupWindowCompat {
-    method public static void showAsDropDown(android.widget.PopupWindow, android.view.View, int, int, int);
-  }
-
-  public abstract class ResourceCursorAdapter extends android.support.v4.widget.CursorAdapter {
-    ctor public deprecated ResourceCursorAdapter(android.content.Context, int, android.database.Cursor);
-    ctor public ResourceCursorAdapter(android.content.Context, int, android.database.Cursor, boolean);
-    ctor public ResourceCursorAdapter(android.content.Context, int, android.database.Cursor, int);
-    method public android.view.View newView(android.content.Context, android.database.Cursor, android.view.ViewGroup);
-    method public void setDropDownViewResource(int);
-    method public void setViewResource(int);
-  }
-
-  public class ScrollerCompat {
-    method public void abortAnimation();
-    method public boolean computeScrollOffset();
-    method public static android.support.v4.widget.ScrollerCompat create(android.content.Context);
-    method public static android.support.v4.widget.ScrollerCompat create(android.content.Context, android.view.animation.Interpolator);
-    method public void fling(int, int, int, int, int, int, int, int);
-    method public void fling(int, int, int, int, int, int, int, int, int, int);
-    method public float getCurrVelocity();
-    method public int getCurrX();
-    method public int getCurrY();
-    method public int getFinalX();
-    method public int getFinalY();
-    method public boolean isFinished();
-    method public boolean isOverScrolled();
-    method public void notifyHorizontalEdgeReached(int, int, int);
-    method public void notifyVerticalEdgeReached(int, int, int);
-    method public void startScroll(int, int, int, int);
-    method public void startScroll(int, int, int, int, int);
-  }
-
-  public class SearchViewCompat {
-    method public static java.lang.CharSequence getQuery(android.view.View);
-    method public static boolean isIconified(android.view.View);
-    method public static boolean isQueryRefinementEnabled(android.view.View);
-    method public static boolean isSubmitButtonEnabled(android.view.View);
-    method public static android.view.View newSearchView(android.content.Context);
-    method public static void setIconified(android.view.View, boolean);
-    method public static void setImeOptions(android.view.View, int);
-    method public static void setInputType(android.view.View, int);
-    method public static void setMaxWidth(android.view.View, int);
-    method public static void setOnCloseListener(android.view.View, android.support.v4.widget.SearchViewCompat.OnCloseListenerCompat);
-    method public static void setOnQueryTextListener(android.view.View, android.support.v4.widget.SearchViewCompat.OnQueryTextListenerCompat);
-    method public static void setQuery(android.view.View, java.lang.CharSequence, boolean);
-    method public static void setQueryHint(android.view.View, java.lang.CharSequence);
-    method public static void setQueryRefinementEnabled(android.view.View, boolean);
-    method public static void setSearchableInfo(android.view.View, android.content.ComponentName);
-    method public static void setSubmitButtonEnabled(android.view.View, boolean);
-  }
-
-  public static abstract class SearchViewCompat.OnCloseListenerCompat {
-    ctor public SearchViewCompat.OnCloseListenerCompat();
-    method public boolean onClose();
-  }
-
-  public static abstract class SearchViewCompat.OnQueryTextListenerCompat {
-    ctor public SearchViewCompat.OnQueryTextListenerCompat();
-    method public boolean onQueryTextChange(java.lang.String);
-    method public boolean onQueryTextSubmit(java.lang.String);
-  }
-
-  public class SimpleCursorAdapter extends android.support.v4.widget.ResourceCursorAdapter {
-    ctor public deprecated SimpleCursorAdapter(android.content.Context, int, android.database.Cursor, java.lang.String[], int[]);
-    ctor public SimpleCursorAdapter(android.content.Context, int, android.database.Cursor, java.lang.String[], int[], int);
-    method public void bindView(android.view.View, android.content.Context, android.database.Cursor);
-    method public void changeCursorAndColumns(android.database.Cursor, java.lang.String[], int[]);
-    method public android.support.v4.widget.SimpleCursorAdapter.CursorToStringConverter getCursorToStringConverter();
-    method public int getStringConversionColumn();
-    method public android.support.v4.widget.SimpleCursorAdapter.ViewBinder getViewBinder();
-    method public void setCursorToStringConverter(android.support.v4.widget.SimpleCursorAdapter.CursorToStringConverter);
-    method public void setStringConversionColumn(int);
-    method public void setViewBinder(android.support.v4.widget.SimpleCursorAdapter.ViewBinder);
-    method public void setViewImage(android.widget.ImageView, java.lang.String);
-    method public void setViewText(android.widget.TextView, java.lang.String);
-  }
-
-  public static abstract interface SimpleCursorAdapter.CursorToStringConverter {
-    method public abstract java.lang.CharSequence convertToString(android.database.Cursor);
-  }
-
-  public static abstract interface SimpleCursorAdapter.ViewBinder {
-    method public abstract boolean setViewValue(android.view.View, android.database.Cursor, int);
-  }
-
-  public class SlidingPaneLayout extends android.view.ViewGroup {
-    ctor public SlidingPaneLayout(android.content.Context);
-    ctor public SlidingPaneLayout(android.content.Context, android.util.AttributeSet);
-    ctor public SlidingPaneLayout(android.content.Context, android.util.AttributeSet, int);
-    method protected boolean canScroll(android.view.View, boolean, int, int, int);
-    method public deprecated boolean canSlide();
-    method public boolean closePane();
-    method public int getCoveredFadeColor();
-    method public int getParallaxDistance();
-    method public int getSliderFadeColor();
-    method public boolean isOpen();
-    method public boolean isSlideable();
-    method protected void onLayout(boolean, int, int, int, int);
-    method public boolean openPane();
-    method public void setCoveredFadeColor(int);
-    method public void setPanelSlideListener(android.support.v4.widget.SlidingPaneLayout.PanelSlideListener);
-    method public void setParallaxDistance(int);
-    method public deprecated void setShadowDrawable(android.graphics.drawable.Drawable);
-    method public void setShadowDrawableLeft(android.graphics.drawable.Drawable);
-    method public void setShadowDrawableRight(android.graphics.drawable.Drawable);
-    method public deprecated void setShadowResource(int);
-    method public void setShadowResourceLeft(int);
-    method public void setShadowResourceRight(int);
-    method public void setSliderFadeColor(int);
-    method public deprecated void smoothSlideClosed();
-    method public deprecated void smoothSlideOpen();
-  }
-
-  public static class SlidingPaneLayout.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
-    ctor public SlidingPaneLayout.LayoutParams();
-    ctor public SlidingPaneLayout.LayoutParams(int, int);
-    ctor public SlidingPaneLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public SlidingPaneLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public SlidingPaneLayout.LayoutParams(android.support.v4.widget.SlidingPaneLayout.LayoutParams);
-    ctor public SlidingPaneLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
-    field public float weight;
-  }
-
-  public static abstract interface SlidingPaneLayout.PanelSlideListener {
-    method public abstract void onPanelClosed(android.view.View);
-    method public abstract void onPanelOpened(android.view.View);
-    method public abstract void onPanelSlide(android.view.View, float);
-  }
-
-  public static class SlidingPaneLayout.SimplePanelSlideListener implements android.support.v4.widget.SlidingPaneLayout.PanelSlideListener {
-    ctor public SlidingPaneLayout.SimplePanelSlideListener();
-    method public void onPanelClosed(android.view.View);
-    method public void onPanelOpened(android.view.View);
-    method public void onPanelSlide(android.view.View, float);
-  }
-
-  public class Space extends android.view.View {
-    ctor public Space(android.content.Context, android.util.AttributeSet, int);
-    ctor public Space(android.content.Context, android.util.AttributeSet);
-    ctor public Space(android.content.Context);
-  }
-
-  public class SwipeRefreshLayout extends android.view.ViewGroup {
-    ctor public SwipeRefreshLayout(android.content.Context);
-    ctor public SwipeRefreshLayout(android.content.Context, android.util.AttributeSet);
-    method public boolean canChildScrollUp();
-    method public int getProgressCircleDiameter();
-    method public boolean isRefreshing();
-    method protected void onLayout(boolean, int, int, int, int);
-    method public void onMeasure(int, int);
-    method public deprecated void setColorScheme(int...);
-    method public void setColorSchemeColors(int...);
-    method public void setColorSchemeResources(int...);
-    method public void setDistanceToTriggerSync(int);
-    method public void setOnRefreshListener(android.support.v4.widget.SwipeRefreshLayout.OnRefreshListener);
-    method public deprecated void setProgressBackgroundColor(int);
-    method public void setProgressBackgroundColorSchemeColor(int);
-    method public void setProgressBackgroundColorSchemeResource(int);
-    method public void setProgressViewEndTarget(boolean, int);
-    method public void setProgressViewOffset(boolean, int, int);
-    method public void setRefreshing(boolean);
-    method public void setSize(int);
-    field public static final int DEFAULT = 1; // 0x1
-    field public static final int LARGE = 0; // 0x0
-    field protected int mFrom;
-    field protected int mOriginalOffsetTop;
-  }
-
-  public static abstract interface SwipeRefreshLayout.OnRefreshListener {
-    method public abstract void onRefresh();
-  }
-
-  public class TextViewCompat {
-    method public static void setCompoundDrawablesRelative(android.widget.TextView, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable);
-    method public static void setCompoundDrawablesRelativeWithIntrinsicBounds(android.widget.TextView, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable);
-    method public static void setCompoundDrawablesRelativeWithIntrinsicBounds(android.widget.TextView, int, int, int, int);
-  }
-
-  public class ViewDragHelper {
-    method public void abort();
-    method protected boolean canScroll(android.view.View, boolean, int, int, int, int);
-    method public void cancel();
-    method public void captureChildView(android.view.View, int);
-    method public boolean checkTouchSlop(int);
-    method public boolean checkTouchSlop(int, int);
-    method public boolean continueSettling(boolean);
-    method public static android.support.v4.widget.ViewDragHelper create(android.view.ViewGroup, android.support.v4.widget.ViewDragHelper.Callback);
-    method public static android.support.v4.widget.ViewDragHelper create(android.view.ViewGroup, float, android.support.v4.widget.ViewDragHelper.Callback);
-    method public android.view.View findTopChildUnder(int, int);
-    method public void flingCapturedView(int, int, int, int);
-    method public int getActivePointerId();
-    method public android.view.View getCapturedView();
-    method public int getEdgeSize();
-    method public float getMinVelocity();
-    method public int getTouchSlop();
-    method public int getViewDragState();
-    method public boolean isCapturedViewUnder(int, int);
-    method public boolean isEdgeTouched(int);
-    method public boolean isEdgeTouched(int, int);
-    method public boolean isPointerDown(int);
-    method public boolean isViewUnder(android.view.View, int, int);
-    method public void processTouchEvent(android.view.MotionEvent);
-    method public void setEdgeTrackingEnabled(int);
-    method public void setMinVelocity(float);
-    method public boolean settleCapturedViewAt(int, int);
-    method public boolean shouldInterceptTouchEvent(android.view.MotionEvent);
-    method public boolean smoothSlideViewTo(android.view.View, int, int);
-    field public static final int DIRECTION_ALL = 3; // 0x3
-    field public static final int DIRECTION_HORIZONTAL = 1; // 0x1
-    field public static final int DIRECTION_VERTICAL = 2; // 0x2
-    field public static final int EDGE_ALL = 15; // 0xf
-    field public static final int EDGE_BOTTOM = 8; // 0x8
-    field public static final int EDGE_LEFT = 1; // 0x1
-    field public static final int EDGE_RIGHT = 2; // 0x2
-    field public static final int EDGE_TOP = 4; // 0x4
-    field public static final int INVALID_POINTER = -1; // 0xffffffff
-    field public static final int STATE_DRAGGING = 1; // 0x1
-    field public static final int STATE_IDLE = 0; // 0x0
-    field public static final int STATE_SETTLING = 2; // 0x2
-  }
-
-  public static abstract class ViewDragHelper.Callback {
-    ctor public ViewDragHelper.Callback();
-    method public int clampViewPositionHorizontal(android.view.View, int, int);
-    method public int clampViewPositionVertical(android.view.View, int, int);
-    method public int getOrderedChildIndex(int);
-    method public int getViewHorizontalDragRange(android.view.View);
-    method public int getViewVerticalDragRange(android.view.View);
-    method public void onEdgeDragStarted(int, int);
-    method public boolean onEdgeLock(int);
-    method public void onEdgeTouched(int, int);
-    method public void onViewCaptured(android.view.View, int);
-    method public void onViewDragStateChanged(int);
-    method public void onViewPositionChanged(android.view.View, int, int, int, int);
-    method public void onViewReleased(android.view.View, float, float);
-    method public abstract boolean tryCaptureView(android.view.View, int);
-  }
-
-}
-
diff --git a/v4/api/22.2.1.txt b/v4/api/22.2.1.txt
deleted file mode 100644
index dad71be..0000000
--- a/v4/api/22.2.1.txt
+++ /dev/null
@@ -1,3191 +0,0 @@
-package android.support.v4.accessibilityservice {
-
-  public class AccessibilityServiceInfoCompat {
-    method public static java.lang.String capabilityToString(int);
-    method public static java.lang.String feedbackTypeToString(int);
-    method public static java.lang.String flagToString(int);
-    method public static boolean getCanRetrieveWindowContent(android.accessibilityservice.AccessibilityServiceInfo);
-    method public static int getCapabilities(android.accessibilityservice.AccessibilityServiceInfo);
-    method public static java.lang.String getDescription(android.accessibilityservice.AccessibilityServiceInfo);
-    method public static java.lang.String getId(android.accessibilityservice.AccessibilityServiceInfo);
-    method public static android.content.pm.ResolveInfo getResolveInfo(android.accessibilityservice.AccessibilityServiceInfo);
-    method public static java.lang.String getSettingsActivityName(android.accessibilityservice.AccessibilityServiceInfo);
-    field public static final int CAPABILITY_CAN_FILTER_KEY_EVENTS = 8; // 0x8
-    field public static final int CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 4; // 0x4
-    field public static final int CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION = 2; // 0x2
-    field public static final int CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT = 1; // 0x1
-    field public static final int DEFAULT = 1; // 0x1
-    field public static final int FEEDBACK_ALL_MASK = -1; // 0xffffffff
-    field public static final int FEEDBACK_BRAILLE = 32; // 0x20
-    field public static final int FLAG_INCLUDE_NOT_IMPORTANT_VIEWS = 2; // 0x2
-    field public static final int FLAG_REPORT_VIEW_IDS = 16; // 0x10
-    field public static final int FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 8; // 0x8
-    field public static final int FLAG_REQUEST_FILTER_KEY_EVENTS = 32; // 0x20
-    field public static final int FLAG_REQUEST_TOUCH_EXPLORATION_MODE = 4; // 0x4
-  }
-
-}
-
-package android.support.v4.animation {
-
-  public abstract class AnimatorCompatHelper {
-    method public static android.support.v4.animation.ValueAnimatorCompat emptyValueAnimator();
-  }
-
-  public abstract interface AnimatorListenerCompat {
-    method public abstract void onAnimationCancel(android.support.v4.animation.ValueAnimatorCompat);
-    method public abstract void onAnimationEnd(android.support.v4.animation.ValueAnimatorCompat);
-    method public abstract void onAnimationRepeat(android.support.v4.animation.ValueAnimatorCompat);
-    method public abstract void onAnimationStart(android.support.v4.animation.ValueAnimatorCompat);
-  }
-
-  public abstract interface AnimatorUpdateListenerCompat {
-    method public abstract void onAnimationUpdate(android.support.v4.animation.ValueAnimatorCompat);
-  }
-
-  public abstract interface ValueAnimatorCompat {
-    method public abstract void addListener(android.support.v4.animation.AnimatorListenerCompat);
-    method public abstract void addUpdateListener(android.support.v4.animation.AnimatorUpdateListenerCompat);
-    method public abstract void cancel();
-    method public abstract float getAnimatedFraction();
-    method public abstract void setDuration(long);
-    method public abstract void setTarget(android.view.View);
-    method public abstract void start();
-  }
-
-}
-
-package android.support.v4.app {
-
-  public deprecated class ActionBarDrawerToggle implements android.support.v4.widget.DrawerLayout.DrawerListener {
-    ctor public ActionBarDrawerToggle(android.app.Activity, android.support.v4.widget.DrawerLayout, int, int, int);
-    ctor public ActionBarDrawerToggle(android.app.Activity, android.support.v4.widget.DrawerLayout, boolean, int, int, int);
-    method public boolean isDrawerIndicatorEnabled();
-    method public void onConfigurationChanged(android.content.res.Configuration);
-    method public void onDrawerClosed(android.view.View);
-    method public void onDrawerOpened(android.view.View);
-    method public void onDrawerSlide(android.view.View, float);
-    method public void onDrawerStateChanged(int);
-    method public boolean onOptionsItemSelected(android.view.MenuItem);
-    method public void setDrawerIndicatorEnabled(boolean);
-    method public void setHomeAsUpIndicator(android.graphics.drawable.Drawable);
-    method public void setHomeAsUpIndicator(int);
-    method public void syncState();
-  }
-
-  public static abstract interface ActionBarDrawerToggle.Delegate {
-    method public abstract android.graphics.drawable.Drawable getThemeUpIndicator();
-    method public abstract void setActionBarDescription(int);
-    method public abstract void setActionBarUpIndicator(android.graphics.drawable.Drawable, int);
-  }
-
-  public static abstract interface ActionBarDrawerToggle.DelegateProvider {
-    method public abstract android.support.v4.app.ActionBarDrawerToggle.Delegate getDrawerToggleDelegate();
-  }
-
-  public class ActivityCompat extends android.support.v4.content.ContextCompat {
-    ctor public ActivityCompat();
-    method public static void finishAffinity(android.app.Activity);
-    method public static void finishAfterTransition(android.app.Activity);
-    method public static boolean invalidateOptionsMenu(android.app.Activity);
-    method public static void postponeEnterTransition(android.app.Activity);
-    method public static void setEnterSharedElementCallback(android.app.Activity, android.support.v4.app.SharedElementCallback);
-    method public static void setExitSharedElementCallback(android.app.Activity, android.support.v4.app.SharedElementCallback);
-    method public static void startActivity(android.app.Activity, android.content.Intent, android.os.Bundle);
-    method public static void startActivityForResult(android.app.Activity, android.content.Intent, int, android.os.Bundle);
-    method public static void startPostponedEnterTransition(android.app.Activity);
-  }
-
-  public final class ActivityManagerCompat {
-    method public static boolean isLowRamDevice(android.app.ActivityManager);
-  }
-
-  public class ActivityOptionsCompat {
-    ctor protected ActivityOptionsCompat();
-    method public static android.support.v4.app.ActivityOptionsCompat makeCustomAnimation(android.content.Context, int, int);
-    method public static android.support.v4.app.ActivityOptionsCompat makeScaleUpAnimation(android.view.View, int, int, int, int);
-    method public static android.support.v4.app.ActivityOptionsCompat makeSceneTransitionAnimation(android.app.Activity, android.view.View, java.lang.String);
-    method public static android.support.v4.app.ActivityOptionsCompat makeSceneTransitionAnimation(android.app.Activity, android.support.v4.util.Pair<android.view.View, java.lang.String>...);
-    method public static android.support.v4.app.ActivityOptionsCompat makeThumbnailScaleUpAnimation(android.view.View, android.graphics.Bitmap, int, int);
-    method public android.os.Bundle toBundle();
-    method public void update(android.support.v4.app.ActivityOptionsCompat);
-  }
-
-  public class DialogFragment extends android.support.v4.app.Fragment implements android.content.DialogInterface.OnCancelListener android.content.DialogInterface.OnDismissListener {
-    ctor public DialogFragment();
-    method public void dismiss();
-    method public void dismissAllowingStateLoss();
-    method public android.app.Dialog getDialog();
-    method public boolean getShowsDialog();
-    method public int getTheme();
-    method public boolean isCancelable();
-    method public void onCancel(android.content.DialogInterface);
-    method public android.app.Dialog onCreateDialog(android.os.Bundle);
-    method public void onDismiss(android.content.DialogInterface);
-    method public void setCancelable(boolean);
-    method public void setShowsDialog(boolean);
-    method public void setStyle(int, int);
-    method public void show(android.support.v4.app.FragmentManager, java.lang.String);
-    method public int show(android.support.v4.app.FragmentTransaction, java.lang.String);
-    field public static final int STYLE_NORMAL = 0; // 0x0
-    field public static final int STYLE_NO_FRAME = 2; // 0x2
-    field public static final int STYLE_NO_INPUT = 3; // 0x3
-    field public static final int STYLE_NO_TITLE = 1; // 0x1
-  }
-
-  public class Fragment implements android.content.ComponentCallbacks android.view.View.OnCreateContextMenuListener {
-    ctor public Fragment();
-    method public void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
-    method public final boolean equals(java.lang.Object);
-    method public final android.support.v4.app.FragmentActivity getActivity();
-    method public boolean getAllowEnterTransitionOverlap();
-    method public boolean getAllowReturnTransitionOverlap();
-    method public final android.os.Bundle getArguments();
-    method public final android.support.v4.app.FragmentManager getChildFragmentManager();
-    method public java.lang.Object getEnterTransition();
-    method public java.lang.Object getExitTransition();
-    method public final android.support.v4.app.FragmentManager getFragmentManager();
-    method public final int getId();
-    method public android.support.v4.app.LoaderManager getLoaderManager();
-    method public final android.support.v4.app.Fragment getParentFragment();
-    method public java.lang.Object getReenterTransition();
-    method public final android.content.res.Resources getResources();
-    method public final boolean getRetainInstance();
-    method public java.lang.Object getReturnTransition();
-    method public java.lang.Object getSharedElementEnterTransition();
-    method public java.lang.Object getSharedElementReturnTransition();
-    method public final java.lang.String getString(int);
-    method public final java.lang.String getString(int, java.lang.Object...);
-    method public final java.lang.String getTag();
-    method public final android.support.v4.app.Fragment getTargetFragment();
-    method public final int getTargetRequestCode();
-    method public final java.lang.CharSequence getText(int);
-    method public boolean getUserVisibleHint();
-    method public android.view.View getView();
-    method public final int hashCode();
-    method public static android.support.v4.app.Fragment instantiate(android.content.Context, java.lang.String);
-    method public static android.support.v4.app.Fragment instantiate(android.content.Context, java.lang.String, android.os.Bundle);
-    method public final boolean isAdded();
-    method public final boolean isDetached();
-    method public final boolean isHidden();
-    method public final boolean isInLayout();
-    method public final boolean isRemoving();
-    method public final boolean isResumed();
-    method public final boolean isVisible();
-    method public void onActivityCreated(android.os.Bundle);
-    method public void onActivityResult(int, int, android.content.Intent);
-    method public void onAttach(android.app.Activity);
-    method public void onConfigurationChanged(android.content.res.Configuration);
-    method public boolean onContextItemSelected(android.view.MenuItem);
-    method public void onCreate(android.os.Bundle);
-    method public android.view.animation.Animation onCreateAnimation(int, boolean, int);
-    method public void onCreateContextMenu(android.view.ContextMenu, android.view.View, android.view.ContextMenu.ContextMenuInfo);
-    method public void onCreateOptionsMenu(android.view.Menu, android.view.MenuInflater);
-    method public android.view.View onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
-    method public void onDestroy();
-    method public void onDestroyOptionsMenu();
-    method public void onDestroyView();
-    method public void onDetach();
-    method public void onHiddenChanged(boolean);
-    method public void onInflate(android.app.Activity, android.util.AttributeSet, android.os.Bundle);
-    method public void onLowMemory();
-    method public boolean onOptionsItemSelected(android.view.MenuItem);
-    method public void onOptionsMenuClosed(android.view.Menu);
-    method public void onPause();
-    method public void onPrepareOptionsMenu(android.view.Menu);
-    method public void onResume();
-    method public void onSaveInstanceState(android.os.Bundle);
-    method public void onStart();
-    method public void onStop();
-    method public void onViewCreated(android.view.View, android.os.Bundle);
-    method public void onViewStateRestored(android.os.Bundle);
-    method public void registerForContextMenu(android.view.View);
-    method public void setAllowEnterTransitionOverlap(boolean);
-    method public void setAllowReturnTransitionOverlap(boolean);
-    method public void setArguments(android.os.Bundle);
-    method public void setEnterSharedElementCallback(android.support.v4.app.SharedElementCallback);
-    method public void setEnterTransition(java.lang.Object);
-    method public void setExitSharedElementCallback(android.support.v4.app.SharedElementCallback);
-    method public void setExitTransition(java.lang.Object);
-    method public void setHasOptionsMenu(boolean);
-    method public void setInitialSavedState(android.support.v4.app.Fragment.SavedState);
-    method public void setMenuVisibility(boolean);
-    method public void setReenterTransition(java.lang.Object);
-    method public void setRetainInstance(boolean);
-    method public void setReturnTransition(java.lang.Object);
-    method public void setSharedElementEnterTransition(java.lang.Object);
-    method public void setSharedElementReturnTransition(java.lang.Object);
-    method public void setTargetFragment(android.support.v4.app.Fragment, int);
-    method public void setUserVisibleHint(boolean);
-    method public void startActivity(android.content.Intent);
-    method public void startActivityForResult(android.content.Intent, int);
-    method public void unregisterForContextMenu(android.view.View);
-  }
-
-  public static class Fragment.InstantiationException extends java.lang.RuntimeException {
-    ctor public Fragment.InstantiationException(java.lang.String, java.lang.Exception);
-  }
-
-  public static class Fragment.SavedState implements android.os.Parcelable {
-    method public int describeContents();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.support.v4.app.Fragment.SavedState> CREATOR;
-  }
-
-  public class FragmentActivity extends android.app.Activity {
-    ctor public FragmentActivity();
-    method public java.lang.Object getLastCustomNonConfigurationInstance();
-    method public android.support.v4.app.FragmentManager getSupportFragmentManager();
-    method public android.support.v4.app.LoaderManager getSupportLoaderManager();
-    method public void onAttachFragment(android.support.v4.app.Fragment);
-    method protected void onResumeFragments();
-    method public java.lang.Object onRetainCustomNonConfigurationInstance();
-    method public final java.lang.Object onRetainNonConfigurationInstance();
-    method public void setEnterSharedElementCallback(android.support.v4.app.SharedElementCallback);
-    method public void setExitSharedElementCallback(android.support.v4.app.SharedElementCallback);
-    method public void startActivityFromFragment(android.support.v4.app.Fragment, android.content.Intent, int);
-    method public void supportFinishAfterTransition();
-    method public void supportInvalidateOptionsMenu();
-    method public void supportPostponeEnterTransition();
-    method public void supportStartPostponedEnterTransition();
-  }
-
-  public abstract class FragmentManager {
-    ctor public FragmentManager();
-    method public abstract void addOnBackStackChangedListener(android.support.v4.app.FragmentManager.OnBackStackChangedListener);
-    method public abstract android.support.v4.app.FragmentTransaction beginTransaction();
-    method public abstract void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
-    method public static void enableDebugLogging(boolean);
-    method public abstract boolean executePendingTransactions();
-    method public abstract android.support.v4.app.Fragment findFragmentById(int);
-    method public abstract android.support.v4.app.Fragment findFragmentByTag(java.lang.String);
-    method public abstract android.support.v4.app.FragmentManager.BackStackEntry getBackStackEntryAt(int);
-    method public abstract int getBackStackEntryCount();
-    method public abstract android.support.v4.app.Fragment getFragment(android.os.Bundle, java.lang.String);
-    method public abstract boolean isDestroyed();
-    method public abstract void popBackStack();
-    method public abstract void popBackStack(java.lang.String, int);
-    method public abstract void popBackStack(int, int);
-    method public abstract boolean popBackStackImmediate();
-    method public abstract boolean popBackStackImmediate(java.lang.String, int);
-    method public abstract boolean popBackStackImmediate(int, int);
-    method public abstract void putFragment(android.os.Bundle, java.lang.String, android.support.v4.app.Fragment);
-    method public abstract void removeOnBackStackChangedListener(android.support.v4.app.FragmentManager.OnBackStackChangedListener);
-    method public abstract android.support.v4.app.Fragment.SavedState saveFragmentInstanceState(android.support.v4.app.Fragment);
-    field public static final int POP_BACK_STACK_INCLUSIVE = 1; // 0x1
-  }
-
-  public static abstract interface FragmentManager.BackStackEntry {
-    method public abstract java.lang.CharSequence getBreadCrumbShortTitle();
-    method public abstract int getBreadCrumbShortTitleRes();
-    method public abstract java.lang.CharSequence getBreadCrumbTitle();
-    method public abstract int getBreadCrumbTitleRes();
-    method public abstract int getId();
-    method public abstract java.lang.String getName();
-  }
-
-  public static abstract interface FragmentManager.OnBackStackChangedListener {
-    method public abstract void onBackStackChanged();
-  }
-
-  public abstract class FragmentPagerAdapter extends android.support.v4.view.PagerAdapter {
-    ctor public FragmentPagerAdapter(android.support.v4.app.FragmentManager);
-    method public abstract android.support.v4.app.Fragment getItem(int);
-    method public long getItemId(int);
-    method public boolean isViewFromObject(android.view.View, java.lang.Object);
-  }
-
-  public abstract class FragmentStatePagerAdapter extends android.support.v4.view.PagerAdapter {
-    ctor public FragmentStatePagerAdapter(android.support.v4.app.FragmentManager);
-    method public abstract android.support.v4.app.Fragment getItem(int);
-    method public boolean isViewFromObject(android.view.View, java.lang.Object);
-  }
-
-  public class FragmentTabHost extends android.widget.TabHost implements android.widget.TabHost.OnTabChangeListener {
-    ctor public FragmentTabHost(android.content.Context);
-    ctor public FragmentTabHost(android.content.Context, android.util.AttributeSet);
-    method public void addTab(android.widget.TabHost.TabSpec, java.lang.Class<?>, android.os.Bundle);
-    method public void onTabChanged(java.lang.String);
-    method public void setup(android.content.Context, android.support.v4.app.FragmentManager);
-    method public void setup(android.content.Context, android.support.v4.app.FragmentManager, int);
-  }
-
-  public abstract class FragmentTransaction {
-    ctor public FragmentTransaction();
-    method public abstract android.support.v4.app.FragmentTransaction add(android.support.v4.app.Fragment, java.lang.String);
-    method public abstract android.support.v4.app.FragmentTransaction add(int, android.support.v4.app.Fragment);
-    method public abstract android.support.v4.app.FragmentTransaction add(int, android.support.v4.app.Fragment, java.lang.String);
-    method public abstract android.support.v4.app.FragmentTransaction addSharedElement(android.view.View, java.lang.String);
-    method public abstract android.support.v4.app.FragmentTransaction addToBackStack(java.lang.String);
-    method public abstract android.support.v4.app.FragmentTransaction attach(android.support.v4.app.Fragment);
-    method public abstract int commit();
-    method public abstract int commitAllowingStateLoss();
-    method public abstract android.support.v4.app.FragmentTransaction detach(android.support.v4.app.Fragment);
-    method public abstract android.support.v4.app.FragmentTransaction disallowAddToBackStack();
-    method public abstract android.support.v4.app.FragmentTransaction hide(android.support.v4.app.Fragment);
-    method public abstract boolean isAddToBackStackAllowed();
-    method public abstract boolean isEmpty();
-    method public abstract android.support.v4.app.FragmentTransaction remove(android.support.v4.app.Fragment);
-    method public abstract android.support.v4.app.FragmentTransaction replace(int, android.support.v4.app.Fragment);
-    method public abstract android.support.v4.app.FragmentTransaction replace(int, android.support.v4.app.Fragment, java.lang.String);
-    method public abstract android.support.v4.app.FragmentTransaction setBreadCrumbShortTitle(int);
-    method public abstract android.support.v4.app.FragmentTransaction setBreadCrumbShortTitle(java.lang.CharSequence);
-    method public abstract android.support.v4.app.FragmentTransaction setBreadCrumbTitle(int);
-    method public abstract android.support.v4.app.FragmentTransaction setBreadCrumbTitle(java.lang.CharSequence);
-    method public abstract android.support.v4.app.FragmentTransaction setCustomAnimations(int, int);
-    method public abstract android.support.v4.app.FragmentTransaction setCustomAnimations(int, int, int, int);
-    method public abstract android.support.v4.app.FragmentTransaction setTransition(int);
-    method public abstract android.support.v4.app.FragmentTransaction setTransitionStyle(int);
-    method public abstract android.support.v4.app.FragmentTransaction show(android.support.v4.app.Fragment);
-    field public static final int TRANSIT_ENTER_MASK = 4096; // 0x1000
-    field public static final int TRANSIT_EXIT_MASK = 8192; // 0x2000
-    field public static final int TRANSIT_FRAGMENT_CLOSE = 8194; // 0x2002
-    field public static final int TRANSIT_FRAGMENT_FADE = 4099; // 0x1003
-    field public static final int TRANSIT_FRAGMENT_OPEN = 4097; // 0x1001
-    field public static final int TRANSIT_NONE = 0; // 0x0
-    field public static final int TRANSIT_UNSET = -1; // 0xffffffff
-  }
-
-  public class ListFragment extends android.support.v4.app.Fragment {
-    ctor public ListFragment();
-    method public android.widget.ListAdapter getListAdapter();
-    method public android.widget.ListView getListView();
-    method public long getSelectedItemId();
-    method public int getSelectedItemPosition();
-    method public void onListItemClick(android.widget.ListView, android.view.View, int, long);
-    method public void setEmptyText(java.lang.CharSequence);
-    method public void setListAdapter(android.widget.ListAdapter);
-    method public void setListShown(boolean);
-    method public void setListShownNoAnimation(boolean);
-    method public void setSelection(int);
-  }
-
-  public abstract class LoaderManager {
-    ctor public LoaderManager();
-    method public abstract void destroyLoader(int);
-    method public abstract void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
-    method public static void enableDebugLogging(boolean);
-    method public abstract android.support.v4.content.Loader<D> getLoader(int);
-    method public boolean hasRunningLoaders();
-    method public abstract android.support.v4.content.Loader<D> initLoader(int, android.os.Bundle, android.support.v4.app.LoaderManager.LoaderCallbacks<D>);
-    method public abstract android.support.v4.content.Loader<D> restartLoader(int, android.os.Bundle, android.support.v4.app.LoaderManager.LoaderCallbacks<D>);
-  }
-
-  public static abstract interface LoaderManager.LoaderCallbacks {
-    method public abstract android.support.v4.content.Loader<D> onCreateLoader(int, android.os.Bundle);
-    method public abstract void onLoadFinished(android.support.v4.content.Loader<D>, D);
-    method public abstract void onLoaderReset(android.support.v4.content.Loader<D>);
-  }
-
-  public class NavUtils {
-    method public static android.content.Intent getParentActivityIntent(android.app.Activity);
-    method public static android.content.Intent getParentActivityIntent(android.content.Context, java.lang.Class<?>) throws android.content.pm.PackageManager.NameNotFoundException;
-    method public static android.content.Intent getParentActivityIntent(android.content.Context, android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
-    method public static java.lang.String getParentActivityName(android.app.Activity);
-    method public static java.lang.String getParentActivityName(android.content.Context, android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
-    method public static void navigateUpFromSameTask(android.app.Activity);
-    method public static void navigateUpTo(android.app.Activity, android.content.Intent);
-    method public static boolean shouldUpRecreateTask(android.app.Activity, android.content.Intent);
-    field public static final java.lang.String PARENT_ACTIVITY = "android.support.PARENT_ACTIVITY";
-  }
-
-  public class NotificationCompat {
-    ctor public NotificationCompat();
-    method public static android.support.v4.app.NotificationCompat.Action getAction(android.app.Notification, int);
-    method public static int getActionCount(android.app.Notification);
-    method public static java.lang.String getCategory(android.app.Notification);
-    method public static android.os.Bundle getExtras(android.app.Notification);
-    method public static java.lang.String getGroup(android.app.Notification);
-    method public static boolean getLocalOnly(android.app.Notification);
-    method public static java.lang.String getSortKey(android.app.Notification);
-    method public static boolean isGroupSummary(android.app.Notification);
-    field public static final java.lang.String CATEGORY_ALARM = "alarm";
-    field public static final java.lang.String CATEGORY_CALL = "call";
-    field public static final java.lang.String CATEGORY_EMAIL = "email";
-    field public static final java.lang.String CATEGORY_ERROR = "err";
-    field public static final java.lang.String CATEGORY_EVENT = "event";
-    field public static final java.lang.String CATEGORY_MESSAGE = "msg";
-    field public static final java.lang.String CATEGORY_PROGRESS = "progress";
-    field public static final java.lang.String CATEGORY_PROMO = "promo";
-    field public static final java.lang.String CATEGORY_RECOMMENDATION = "recommendation";
-    field public static final java.lang.String CATEGORY_SERVICE = "service";
-    field public static final java.lang.String CATEGORY_SOCIAL = "social";
-    field public static final java.lang.String CATEGORY_STATUS = "status";
-    field public static final java.lang.String CATEGORY_SYSTEM = "sys";
-    field public static final java.lang.String CATEGORY_TRANSPORT = "transport";
-    field public static final int COLOR_DEFAULT = 0; // 0x0
-    field public static final int DEFAULT_ALL = -1; // 0xffffffff
-    field public static final int DEFAULT_LIGHTS = 4; // 0x4
-    field public static final int DEFAULT_SOUND = 1; // 0x1
-    field public static final int DEFAULT_VIBRATE = 2; // 0x2
-    field public static final java.lang.String EXTRA_BACKGROUND_IMAGE_URI = "android.backgroundImageUri";
-    field public static final java.lang.String EXTRA_BIG_TEXT = "android.bigText";
-    field public static final java.lang.String EXTRA_COMPACT_ACTIONS = "android.compactActions";
-    field public static final java.lang.String EXTRA_INFO_TEXT = "android.infoText";
-    field public static final java.lang.String EXTRA_LARGE_ICON = "android.largeIcon";
-    field public static final java.lang.String EXTRA_LARGE_ICON_BIG = "android.largeIcon.big";
-    field public static final java.lang.String EXTRA_MEDIA_SESSION = "android.mediaSession";
-    field public static final java.lang.String EXTRA_PEOPLE = "android.people";
-    field public static final java.lang.String EXTRA_PICTURE = "android.picture";
-    field public static final java.lang.String EXTRA_PROGRESS = "android.progress";
-    field public static final java.lang.String EXTRA_PROGRESS_INDETERMINATE = "android.progressIndeterminate";
-    field public static final java.lang.String EXTRA_PROGRESS_MAX = "android.progressMax";
-    field public static final java.lang.String EXTRA_SHOW_CHRONOMETER = "android.showChronometer";
-    field public static final java.lang.String EXTRA_SHOW_WHEN = "android.showWhen";
-    field public static final java.lang.String EXTRA_SMALL_ICON = "android.icon";
-    field public static final java.lang.String EXTRA_SUB_TEXT = "android.subText";
-    field public static final java.lang.String EXTRA_SUMMARY_TEXT = "android.summaryText";
-    field public static final java.lang.String EXTRA_TEMPLATE = "android.template";
-    field public static final java.lang.String EXTRA_TEXT = "android.text";
-    field public static final java.lang.String EXTRA_TEXT_LINES = "android.textLines";
-    field public static final java.lang.String EXTRA_TITLE = "android.title";
-    field public static final java.lang.String EXTRA_TITLE_BIG = "android.title.big";
-    field public static final int FLAG_AUTO_CANCEL = 16; // 0x10
-    field public static final int FLAG_FOREGROUND_SERVICE = 64; // 0x40
-    field public static final int FLAG_GROUP_SUMMARY = 512; // 0x200
-    field public static final deprecated int FLAG_HIGH_PRIORITY = 128; // 0x80
-    field public static final int FLAG_INSISTENT = 4; // 0x4
-    field public static final int FLAG_LOCAL_ONLY = 256; // 0x100
-    field public static final int FLAG_NO_CLEAR = 32; // 0x20
-    field public static final int FLAG_ONGOING_EVENT = 2; // 0x2
-    field public static final int FLAG_ONLY_ALERT_ONCE = 8; // 0x8
-    field public static final int FLAG_SHOW_LIGHTS = 1; // 0x1
-    field public static final int PRIORITY_DEFAULT = 0; // 0x0
-    field public static final int PRIORITY_HIGH = 1; // 0x1
-    field public static final int PRIORITY_LOW = -1; // 0xffffffff
-    field public static final int PRIORITY_MAX = 2; // 0x2
-    field public static final int PRIORITY_MIN = -2; // 0xfffffffe
-    field public static final int STREAM_DEFAULT = -1; // 0xffffffff
-    field public static final int VISIBILITY_PRIVATE = 0; // 0x0
-    field public static final int VISIBILITY_PUBLIC = 1; // 0x1
-    field public static final int VISIBILITY_SECRET = -1; // 0xffffffff
-  }
-
-  public static class NotificationCompat.Action extends android.support.v4.app.NotificationCompatBase.Action {
-    ctor public NotificationCompat.Action(int, java.lang.CharSequence, android.app.PendingIntent);
-    method public android.app.PendingIntent getActionIntent();
-    method public android.os.Bundle getExtras();
-    method public int getIcon();
-    method public android.support.v4.app.RemoteInput[] getRemoteInputs();
-    method public java.lang.CharSequence getTitle();
-    field public android.app.PendingIntent actionIntent;
-    field public int icon;
-    field public java.lang.CharSequence title;
-  }
-
-  public static final class NotificationCompat.Action.Builder {
-    ctor public NotificationCompat.Action.Builder(int, java.lang.CharSequence, android.app.PendingIntent);
-    ctor public NotificationCompat.Action.Builder(android.support.v4.app.NotificationCompat.Action);
-    method public android.support.v4.app.NotificationCompat.Action.Builder addExtras(android.os.Bundle);
-    method public android.support.v4.app.NotificationCompat.Action.Builder addRemoteInput(android.support.v4.app.RemoteInput);
-    method public android.support.v4.app.NotificationCompat.Action build();
-    method public android.support.v4.app.NotificationCompat.Action.Builder extend(android.support.v4.app.NotificationCompat.Action.Extender);
-    method public android.os.Bundle getExtras();
-  }
-
-  public static abstract interface NotificationCompat.Action.Extender {
-    method public abstract android.support.v4.app.NotificationCompat.Action.Builder extend(android.support.v4.app.NotificationCompat.Action.Builder);
-  }
-
-  public static final class NotificationCompat.Action.WearableExtender implements android.support.v4.app.NotificationCompat.Action.Extender {
-    ctor public NotificationCompat.Action.WearableExtender();
-    ctor public NotificationCompat.Action.WearableExtender(android.support.v4.app.NotificationCompat.Action);
-    method public android.support.v4.app.NotificationCompat.Action.WearableExtender clone();
-    method public android.support.v4.app.NotificationCompat.Action.Builder extend(android.support.v4.app.NotificationCompat.Action.Builder);
-    method public java.lang.CharSequence getCancelLabel();
-    method public java.lang.CharSequence getConfirmLabel();
-    method public java.lang.CharSequence getInProgressLabel();
-    method public boolean isAvailableOffline();
-    method public android.support.v4.app.NotificationCompat.Action.WearableExtender setAvailableOffline(boolean);
-    method public android.support.v4.app.NotificationCompat.Action.WearableExtender setCancelLabel(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.Action.WearableExtender setConfirmLabel(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.Action.WearableExtender setInProgressLabel(java.lang.CharSequence);
-  }
-
-  public static class NotificationCompat.BigPictureStyle extends android.support.v4.app.NotificationCompat.Style {
-    ctor public NotificationCompat.BigPictureStyle();
-    ctor public NotificationCompat.BigPictureStyle(android.support.v4.app.NotificationCompat.Builder);
-    method public android.support.v4.app.NotificationCompat.BigPictureStyle bigLargeIcon(android.graphics.Bitmap);
-    method public android.support.v4.app.NotificationCompat.BigPictureStyle bigPicture(android.graphics.Bitmap);
-    method public android.support.v4.app.NotificationCompat.BigPictureStyle setBigContentTitle(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.BigPictureStyle setSummaryText(java.lang.CharSequence);
-  }
-
-  public static class NotificationCompat.BigTextStyle extends android.support.v4.app.NotificationCompat.Style {
-    ctor public NotificationCompat.BigTextStyle();
-    ctor public NotificationCompat.BigTextStyle(android.support.v4.app.NotificationCompat.Builder);
-    method public android.support.v4.app.NotificationCompat.BigTextStyle bigText(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.BigTextStyle setBigContentTitle(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.BigTextStyle setSummaryText(java.lang.CharSequence);
-  }
-
-  public static class NotificationCompat.Builder {
-    ctor public NotificationCompat.Builder(android.content.Context);
-    method public android.support.v4.app.NotificationCompat.Builder addAction(int, java.lang.CharSequence, android.app.PendingIntent);
-    method public android.support.v4.app.NotificationCompat.Builder addAction(android.support.v4.app.NotificationCompat.Action);
-    method public android.support.v4.app.NotificationCompat.Builder addExtras(android.os.Bundle);
-    method public android.support.v4.app.NotificationCompat.Builder addPerson(java.lang.String);
-    method public android.app.Notification build();
-    method public android.support.v4.app.NotificationCompat.Builder extend(android.support.v4.app.NotificationCompat.Extender);
-    method public android.os.Bundle getExtras();
-    method public deprecated android.app.Notification getNotification();
-    method protected static java.lang.CharSequence limitCharSequenceLength(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.Builder setAutoCancel(boolean);
-    method public android.support.v4.app.NotificationCompat.Builder setCategory(java.lang.String);
-    method public android.support.v4.app.NotificationCompat.Builder setColor(int);
-    method public android.support.v4.app.NotificationCompat.Builder setContent(android.widget.RemoteViews);
-    method public android.support.v4.app.NotificationCompat.Builder setContentInfo(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.Builder setContentIntent(android.app.PendingIntent);
-    method public android.support.v4.app.NotificationCompat.Builder setContentText(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.Builder setContentTitle(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.Builder setDefaults(int);
-    method public android.support.v4.app.NotificationCompat.Builder setDeleteIntent(android.app.PendingIntent);
-    method public android.support.v4.app.NotificationCompat.Builder setExtras(android.os.Bundle);
-    method public android.support.v4.app.NotificationCompat.Builder setFullScreenIntent(android.app.PendingIntent, boolean);
-    method public android.support.v4.app.NotificationCompat.Builder setGroup(java.lang.String);
-    method public android.support.v4.app.NotificationCompat.Builder setGroupSummary(boolean);
-    method public android.support.v4.app.NotificationCompat.Builder setLargeIcon(android.graphics.Bitmap);
-    method public android.support.v4.app.NotificationCompat.Builder setLights(int, int, int);
-    method public android.support.v4.app.NotificationCompat.Builder setLocalOnly(boolean);
-    method public android.support.v4.app.NotificationCompat.Builder setNumber(int);
-    method public android.support.v4.app.NotificationCompat.Builder setOngoing(boolean);
-    method public android.support.v4.app.NotificationCompat.Builder setOnlyAlertOnce(boolean);
-    method public android.support.v4.app.NotificationCompat.Builder setPriority(int);
-    method public android.support.v4.app.NotificationCompat.Builder setProgress(int, int, boolean);
-    method public android.support.v4.app.NotificationCompat.Builder setPublicVersion(android.app.Notification);
-    method public android.support.v4.app.NotificationCompat.Builder setShowWhen(boolean);
-    method public android.support.v4.app.NotificationCompat.Builder setSmallIcon(int);
-    method public android.support.v4.app.NotificationCompat.Builder setSmallIcon(int, int);
-    method public android.support.v4.app.NotificationCompat.Builder setSortKey(java.lang.String);
-    method public android.support.v4.app.NotificationCompat.Builder setSound(android.net.Uri);
-    method public android.support.v4.app.NotificationCompat.Builder setSound(android.net.Uri, int);
-    method public android.support.v4.app.NotificationCompat.Builder setStyle(android.support.v4.app.NotificationCompat.Style);
-    method public android.support.v4.app.NotificationCompat.Builder setSubText(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.Builder setTicker(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.Builder setTicker(java.lang.CharSequence, android.widget.RemoteViews);
-    method public android.support.v4.app.NotificationCompat.Builder setUsesChronometer(boolean);
-    method public android.support.v4.app.NotificationCompat.Builder setVibrate(long[]);
-    method public android.support.v4.app.NotificationCompat.Builder setVisibility(int);
-    method public android.support.v4.app.NotificationCompat.Builder setWhen(long);
-    field public java.util.ArrayList<java.lang.String> mPeople;
-  }
-
-  public static final class NotificationCompat.CarExtender implements android.support.v4.app.NotificationCompat.Extender {
-    ctor public NotificationCompat.CarExtender();
-    ctor public NotificationCompat.CarExtender(android.app.Notification);
-    method public android.support.v4.app.NotificationCompat.Builder extend(android.support.v4.app.NotificationCompat.Builder);
-    method public int getColor();
-    method public android.graphics.Bitmap getLargeIcon();
-    method public android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation getUnreadConversation();
-    method public android.support.v4.app.NotificationCompat.CarExtender setColor(int);
-    method public android.support.v4.app.NotificationCompat.CarExtender setLargeIcon(android.graphics.Bitmap);
-    method public android.support.v4.app.NotificationCompat.CarExtender setUnreadConversation(android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation);
-  }
-
-  public static class NotificationCompat.CarExtender.UnreadConversation extends android.support.v4.app.NotificationCompatBase.UnreadConversation {
-    method public long getLatestTimestamp();
-    method public java.lang.String[] getMessages();
-    method public java.lang.String getParticipant();
-    method public java.lang.String[] getParticipants();
-    method public android.app.PendingIntent getReadPendingIntent();
-    method public android.support.v4.app.RemoteInput getRemoteInput();
-    method public android.app.PendingIntent getReplyPendingIntent();
-  }
-
-  public static class NotificationCompat.CarExtender.UnreadConversation.Builder {
-    ctor public NotificationCompat.CarExtender.UnreadConversation.Builder(java.lang.String);
-    method public android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation.Builder addMessage(java.lang.String);
-    method public android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation build();
-    method public android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation.Builder setLatestTimestamp(long);
-    method public android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation.Builder setReadPendingIntent(android.app.PendingIntent);
-    method public android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation.Builder setReplyAction(android.app.PendingIntent, android.support.v4.app.RemoteInput);
-  }
-
-  public static abstract interface NotificationCompat.Extender {
-    method public abstract android.support.v4.app.NotificationCompat.Builder extend(android.support.v4.app.NotificationCompat.Builder);
-  }
-
-  public static class NotificationCompat.InboxStyle extends android.support.v4.app.NotificationCompat.Style {
-    ctor public NotificationCompat.InboxStyle();
-    ctor public NotificationCompat.InboxStyle(android.support.v4.app.NotificationCompat.Builder);
-    method public android.support.v4.app.NotificationCompat.InboxStyle addLine(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.InboxStyle setBigContentTitle(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.InboxStyle setSummaryText(java.lang.CharSequence);
-  }
-
-  public static abstract class NotificationCompat.Style {
-    ctor public NotificationCompat.Style();
-    method public android.app.Notification build();
-    method public void setBuilder(android.support.v4.app.NotificationCompat.Builder);
-  }
-
-  public static final class NotificationCompat.WearableExtender implements android.support.v4.app.NotificationCompat.Extender {
-    ctor public NotificationCompat.WearableExtender();
-    ctor public NotificationCompat.WearableExtender(android.app.Notification);
-    method public android.support.v4.app.NotificationCompat.WearableExtender addAction(android.support.v4.app.NotificationCompat.Action);
-    method public android.support.v4.app.NotificationCompat.WearableExtender addActions(java.util.List<android.support.v4.app.NotificationCompat.Action>);
-    method public android.support.v4.app.NotificationCompat.WearableExtender addPage(android.app.Notification);
-    method public android.support.v4.app.NotificationCompat.WearableExtender addPages(java.util.List<android.app.Notification>);
-    method public android.support.v4.app.NotificationCompat.WearableExtender clearActions();
-    method public android.support.v4.app.NotificationCompat.WearableExtender clearPages();
-    method public android.support.v4.app.NotificationCompat.WearableExtender clone();
-    method public android.support.v4.app.NotificationCompat.Builder extend(android.support.v4.app.NotificationCompat.Builder);
-    method public java.util.List<android.support.v4.app.NotificationCompat.Action> getActions();
-    method public android.graphics.Bitmap getBackground();
-    method public int getContentAction();
-    method public int getContentIcon();
-    method public int getContentIconGravity();
-    method public boolean getContentIntentAvailableOffline();
-    method public int getCustomContentHeight();
-    method public int getCustomSizePreset();
-    method public android.app.PendingIntent getDisplayIntent();
-    method public int getGravity();
-    method public boolean getHintAvoidBackgroundClipping();
-    method public boolean getHintHideIcon();
-    method public int getHintScreenTimeout();
-    method public boolean getHintShowBackgroundOnly();
-    method public java.util.List<android.app.Notification> getPages();
-    method public boolean getStartScrollBottom();
-    method public android.support.v4.app.NotificationCompat.WearableExtender setBackground(android.graphics.Bitmap);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setContentAction(int);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setContentIcon(int);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setContentIconGravity(int);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setContentIntentAvailableOffline(boolean);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setCustomContentHeight(int);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setCustomSizePreset(int);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setDisplayIntent(android.app.PendingIntent);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setGravity(int);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setHintAvoidBackgroundClipping(boolean);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setHintHideIcon(boolean);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setHintScreenTimeout(int);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setHintShowBackgroundOnly(boolean);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setStartScrollBottom(boolean);
-    field public static final int SCREEN_TIMEOUT_LONG = -1; // 0xffffffff
-    field public static final int SCREEN_TIMEOUT_SHORT = 0; // 0x0
-    field public static final int SIZE_DEFAULT = 0; // 0x0
-    field public static final int SIZE_FULL_SCREEN = 5; // 0x5
-    field public static final int SIZE_LARGE = 4; // 0x4
-    field public static final int SIZE_MEDIUM = 3; // 0x3
-    field public static final int SIZE_SMALL = 2; // 0x2
-    field public static final int SIZE_XSMALL = 1; // 0x1
-    field public static final int UNSET_ACTION_INDEX = -1; // 0xffffffff
-  }
-
-  public class NotificationCompatBase {
-    ctor public NotificationCompatBase();
-  }
-
-  public static abstract class NotificationCompatBase.Action {
-    ctor public NotificationCompatBase.Action();
-    method public abstract android.app.PendingIntent getActionIntent();
-    method public abstract android.os.Bundle getExtras();
-    method public abstract int getIcon();
-    method public abstract android.support.v4.app.RemoteInputCompatBase.RemoteInput[] getRemoteInputs();
-    method public abstract java.lang.CharSequence getTitle();
-  }
-
-  public static abstract class NotificationCompatBase.UnreadConversation {
-    ctor public NotificationCompatBase.UnreadConversation();
-  }
-
-  public final class NotificationCompatExtras {
-    field public static final java.lang.String EXTRA_ACTION_EXTRAS = "android.support.actionExtras";
-    field public static final java.lang.String EXTRA_GROUP_KEY = "android.support.groupKey";
-    field public static final java.lang.String EXTRA_GROUP_SUMMARY = "android.support.isGroupSummary";
-    field public static final java.lang.String EXTRA_LOCAL_ONLY = "android.support.localOnly";
-    field public static final java.lang.String EXTRA_REMOTE_INPUTS = "android.support.remoteInputs";
-    field public static final java.lang.String EXTRA_SORT_KEY = "android.support.sortKey";
-  }
-
-  public abstract class NotificationCompatSideChannelService extends android.app.Service {
-    ctor public NotificationCompatSideChannelService();
-    method public abstract void cancel(java.lang.String, int, java.lang.String);
-    method public abstract void cancelAll(java.lang.String);
-    method public abstract void notify(java.lang.String, int, java.lang.String, android.app.Notification);
-    method public android.os.IBinder onBind(android.content.Intent);
-  }
-
-  public class NotificationManagerCompat {
-    method public void cancel(int);
-    method public void cancel(java.lang.String, int);
-    method public void cancelAll();
-    method public static android.support.v4.app.NotificationManagerCompat from(android.content.Context);
-    method public static java.util.Set<java.lang.String> getEnabledListenerPackages(android.content.Context);
-    method public void notify(int, android.app.Notification);
-    method public void notify(java.lang.String, int, android.app.Notification);
-    field public static final java.lang.String ACTION_BIND_SIDE_CHANNEL = "android.support.BIND_NOTIFICATION_SIDE_CHANNEL";
-    field public static final java.lang.String EXTRA_USE_SIDE_CHANNEL = "android.support.useSideChannel";
-  }
-
-  public class RemoteInput extends android.support.v4.app.RemoteInputCompatBase.RemoteInput {
-    method public static void addResultsToIntent(android.support.v4.app.RemoteInput[], android.content.Intent, android.os.Bundle);
-    method public boolean getAllowFreeFormInput();
-    method public java.lang.CharSequence[] getChoices();
-    method public android.os.Bundle getExtras();
-    method public java.lang.CharSequence getLabel();
-    method public java.lang.String getResultKey();
-    method public static android.os.Bundle getResultsFromIntent(android.content.Intent);
-    field public static final java.lang.String EXTRA_RESULTS_DATA = "android.remoteinput.resultsData";
-    field public static final java.lang.String RESULTS_CLIP_LABEL = "android.remoteinput.results";
-  }
-
-  public static final class RemoteInput.Builder {
-    ctor public RemoteInput.Builder(java.lang.String);
-    method public android.support.v4.app.RemoteInput.Builder addExtras(android.os.Bundle);
-    method public android.support.v4.app.RemoteInput build();
-    method public android.os.Bundle getExtras();
-    method public android.support.v4.app.RemoteInput.Builder setAllowFreeFormInput(boolean);
-    method public android.support.v4.app.RemoteInput.Builder setChoices(java.lang.CharSequence[]);
-    method public android.support.v4.app.RemoteInput.Builder setLabel(java.lang.CharSequence);
-  }
-
-   class RemoteInputCompatBase {
-  }
-
-  public static abstract class RemoteInputCompatBase.RemoteInput {
-    ctor public RemoteInputCompatBase.RemoteInput();
-    method protected abstract boolean getAllowFreeFormInput();
-    method protected abstract java.lang.CharSequence[] getChoices();
-    method protected abstract android.os.Bundle getExtras();
-    method protected abstract java.lang.CharSequence getLabel();
-    method protected abstract java.lang.String getResultKey();
-  }
-
-  public class ServiceCompat {
-    field public static final int START_STICKY = 1; // 0x1
-  }
-
-  public class ShareCompat {
-    ctor public ShareCompat();
-    method public static void configureMenuItem(android.view.MenuItem, android.support.v4.app.ShareCompat.IntentBuilder);
-    method public static void configureMenuItem(android.view.Menu, int, android.support.v4.app.ShareCompat.IntentBuilder);
-    method public static android.content.ComponentName getCallingActivity(android.app.Activity);
-    method public static java.lang.String getCallingPackage(android.app.Activity);
-    field public static final java.lang.String EXTRA_CALLING_ACTIVITY = "android.support.v4.app.EXTRA_CALLING_ACTIVITY";
-    field public static final java.lang.String EXTRA_CALLING_PACKAGE = "android.support.v4.app.EXTRA_CALLING_PACKAGE";
-  }
-
-  public static class ShareCompat.IntentBuilder {
-    method public android.support.v4.app.ShareCompat.IntentBuilder addEmailBcc(java.lang.String);
-    method public android.support.v4.app.ShareCompat.IntentBuilder addEmailBcc(java.lang.String[]);
-    method public android.support.v4.app.ShareCompat.IntentBuilder addEmailCc(java.lang.String);
-    method public android.support.v4.app.ShareCompat.IntentBuilder addEmailCc(java.lang.String[]);
-    method public android.support.v4.app.ShareCompat.IntentBuilder addEmailTo(java.lang.String);
-    method public android.support.v4.app.ShareCompat.IntentBuilder addEmailTo(java.lang.String[]);
-    method public android.support.v4.app.ShareCompat.IntentBuilder addStream(android.net.Uri);
-    method public android.content.Intent createChooserIntent();
-    method public static android.support.v4.app.ShareCompat.IntentBuilder from(android.app.Activity);
-    method public android.content.Intent getIntent();
-    method public android.support.v4.app.ShareCompat.IntentBuilder setChooserTitle(java.lang.CharSequence);
-    method public android.support.v4.app.ShareCompat.IntentBuilder setChooserTitle(int);
-    method public android.support.v4.app.ShareCompat.IntentBuilder setEmailBcc(java.lang.String[]);
-    method public android.support.v4.app.ShareCompat.IntentBuilder setEmailCc(java.lang.String[]);
-    method public android.support.v4.app.ShareCompat.IntentBuilder setEmailTo(java.lang.String[]);
-    method public android.support.v4.app.ShareCompat.IntentBuilder setHtmlText(java.lang.String);
-    method public android.support.v4.app.ShareCompat.IntentBuilder setStream(android.net.Uri);
-    method public android.support.v4.app.ShareCompat.IntentBuilder setSubject(java.lang.String);
-    method public android.support.v4.app.ShareCompat.IntentBuilder setText(java.lang.CharSequence);
-    method public android.support.v4.app.ShareCompat.IntentBuilder setType(java.lang.String);
-    method public void startChooser();
-  }
-
-  public static class ShareCompat.IntentReader {
-    method public static android.support.v4.app.ShareCompat.IntentReader from(android.app.Activity);
-    method public android.content.ComponentName getCallingActivity();
-    method public android.graphics.drawable.Drawable getCallingActivityIcon();
-    method public android.graphics.drawable.Drawable getCallingApplicationIcon();
-    method public java.lang.CharSequence getCallingApplicationLabel();
-    method public java.lang.String getCallingPackage();
-    method public java.lang.String[] getEmailBcc();
-    method public java.lang.String[] getEmailCc();
-    method public java.lang.String[] getEmailTo();
-    method public java.lang.String getHtmlText();
-    method public android.net.Uri getStream();
-    method public android.net.Uri getStream(int);
-    method public int getStreamCount();
-    method public java.lang.String getSubject();
-    method public java.lang.CharSequence getText();
-    method public java.lang.String getType();
-    method public boolean isMultipleShare();
-    method public boolean isShareIntent();
-    method public boolean isSingleShare();
-  }
-
-  public abstract class SharedElementCallback {
-    ctor public SharedElementCallback();
-    method public android.os.Parcelable onCaptureSharedElementSnapshot(android.view.View, android.graphics.Matrix, android.graphics.RectF);
-    method public android.view.View onCreateSnapshotView(android.content.Context, android.os.Parcelable);
-    method public void onMapSharedElements(java.util.List<java.lang.String>, java.util.Map<java.lang.String, android.view.View>);
-    method public void onRejectSharedElements(java.util.List<android.view.View>);
-    method public void onSharedElementEnd(java.util.List<java.lang.String>, java.util.List<android.view.View>, java.util.List<android.view.View>);
-    method public void onSharedElementStart(java.util.List<java.lang.String>, java.util.List<android.view.View>, java.util.List<android.view.View>);
-  }
-
-  public class TaskStackBuilder implements java.lang.Iterable {
-    method public android.support.v4.app.TaskStackBuilder addNextIntent(android.content.Intent);
-    method public android.support.v4.app.TaskStackBuilder addNextIntentWithParentStack(android.content.Intent);
-    method public android.support.v4.app.TaskStackBuilder addParentStack(android.app.Activity);
-    method public android.support.v4.app.TaskStackBuilder addParentStack(java.lang.Class<?>);
-    method public android.support.v4.app.TaskStackBuilder addParentStack(android.content.ComponentName);
-    method public static android.support.v4.app.TaskStackBuilder create(android.content.Context);
-    method public android.content.Intent editIntentAt(int);
-    method public static deprecated android.support.v4.app.TaskStackBuilder from(android.content.Context);
-    method public deprecated android.content.Intent getIntent(int);
-    method public int getIntentCount();
-    method public android.content.Intent[] getIntents();
-    method public android.app.PendingIntent getPendingIntent(int, int);
-    method public android.app.PendingIntent getPendingIntent(int, int, android.os.Bundle);
-    method public deprecated java.util.Iterator<android.content.Intent> iterator();
-    method public void startActivities();
-    method public void startActivities(android.os.Bundle);
-  }
-
-  public static abstract interface TaskStackBuilder.SupportParentable {
-    method public abstract android.content.Intent getSupportParentActivityIntent();
-  }
-
-}
-
-package android.support.v4.content {
-
-  public abstract class AsyncTaskLoader extends android.support.v4.content.Loader {
-    ctor public AsyncTaskLoader(android.content.Context);
-    method public boolean cancelLoad();
-    method public abstract D loadInBackground();
-    method public void onCanceled(D);
-    method protected D onLoadInBackground();
-    method public void setUpdateThrottle(long);
-  }
-
-  public class ContextCompat {
-    ctor public ContextCompat();
-    method public final java.io.File getCodeCacheDir(android.content.Context);
-    method public static final android.graphics.drawable.Drawable getDrawable(android.content.Context, int);
-    method public static java.io.File[] getExternalCacheDirs(android.content.Context);
-    method public static java.io.File[] getExternalFilesDirs(android.content.Context, java.lang.String);
-    method public final java.io.File getNoBackupFilesDir(android.content.Context);
-    method public static java.io.File[] getObbDirs(android.content.Context);
-    method public static boolean startActivities(android.content.Context, android.content.Intent[]);
-    method public static boolean startActivities(android.content.Context, android.content.Intent[], android.os.Bundle);
-  }
-
-  public class CursorLoader extends android.support.v4.content.AsyncTaskLoader {
-    ctor public CursorLoader(android.content.Context);
-    ctor public CursorLoader(android.content.Context, android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String);
-    method public void deliverResult(android.database.Cursor);
-    method public java.lang.String[] getProjection();
-    method public java.lang.String getSelection();
-    method public java.lang.String[] getSelectionArgs();
-    method public java.lang.String getSortOrder();
-    method public android.net.Uri getUri();
-    method public android.database.Cursor loadInBackground();
-    method public void onCanceled(android.database.Cursor);
-    method public void setProjection(java.lang.String[]);
-    method public void setSelection(java.lang.String);
-    method public void setSelectionArgs(java.lang.String[]);
-    method public void setSortOrder(java.lang.String);
-    method public void setUri(android.net.Uri);
-  }
-
-  public class FileProvider extends android.content.ContentProvider {
-    ctor public FileProvider();
-    method public int delete(android.net.Uri, java.lang.String, java.lang.String[]);
-    method public java.lang.String getType(android.net.Uri);
-    method public static android.net.Uri getUriForFile(android.content.Context, java.lang.String, java.io.File);
-    method public android.net.Uri insert(android.net.Uri, android.content.ContentValues);
-    method public boolean onCreate();
-    method public android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String);
-    method public int update(android.net.Uri, android.content.ContentValues, java.lang.String, java.lang.String[]);
-  }
-
-  public class IntentCompat {
-    method public static android.content.Intent makeMainActivity(android.content.ComponentName);
-    method public static android.content.Intent makeMainSelectorActivity(java.lang.String, java.lang.String);
-    method public static android.content.Intent makeRestartActivityTask(android.content.ComponentName);
-    field public static final java.lang.String ACTION_EXTERNAL_APPLICATIONS_AVAILABLE = "android.intent.action.EXTERNAL_APPLICATIONS_AVAILABLE";
-    field public static final java.lang.String ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE = "android.intent.action.EXTERNAL_APPLICATIONS_UNAVAILABLE";
-    field public static final java.lang.String EXTRA_CHANGED_PACKAGE_LIST = "android.intent.extra.changed_package_list";
-    field public static final java.lang.String EXTRA_CHANGED_UID_LIST = "android.intent.extra.changed_uid_list";
-    field public static final java.lang.String EXTRA_HTML_TEXT = "android.intent.extra.HTML_TEXT";
-    field public static final int FLAG_ACTIVITY_CLEAR_TASK = 32768; // 0x8000
-    field public static final int FLAG_ACTIVITY_TASK_ON_HOME = 16384; // 0x4000
-  }
-
-  public class Loader {
-    ctor public Loader(android.content.Context);
-    method public void abandon();
-    method public void commitContentChanged();
-    method public java.lang.String dataToString(D);
-    method public void deliverResult(D);
-    method public void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
-    method public void forceLoad();
-    method public android.content.Context getContext();
-    method public int getId();
-    method public boolean isAbandoned();
-    method public boolean isReset();
-    method public boolean isStarted();
-    method protected void onAbandon();
-    method public void onContentChanged();
-    method protected void onForceLoad();
-    method protected void onReset();
-    method protected void onStartLoading();
-    method protected void onStopLoading();
-    method public void registerListener(int, android.support.v4.content.Loader.OnLoadCompleteListener<D>);
-    method public void reset();
-    method public void rollbackContentChanged();
-    method public final void startLoading();
-    method public void stopLoading();
-    method public boolean takeContentChanged();
-    method public void unregisterListener(android.support.v4.content.Loader.OnLoadCompleteListener<D>);
-  }
-
-  public final class Loader.ForceLoadContentObserver extends android.database.ContentObserver {
-    ctor public Loader.ForceLoadContentObserver();
-  }
-
-  public static abstract interface Loader.OnLoadCompleteListener {
-    method public abstract void onLoadComplete(android.support.v4.content.Loader<D>, D);
-  }
-
-  public class LocalBroadcastManager {
-    method public static android.support.v4.content.LocalBroadcastManager getInstance(android.content.Context);
-    method public void registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter);
-    method public boolean sendBroadcast(android.content.Intent);
-    method public void sendBroadcastSync(android.content.Intent);
-    method public void unregisterReceiver(android.content.BroadcastReceiver);
-  }
-
-  public abstract class WakefulBroadcastReceiver extends android.content.BroadcastReceiver {
-    ctor public WakefulBroadcastReceiver();
-    method public static boolean completeWakefulIntent(android.content.Intent);
-    method public static android.content.ComponentName startWakefulService(android.content.Context, android.content.Intent);
-  }
-
-}
-
-package android.support.v4.content.pm {
-
-  public class ActivityInfoCompat {
-    field public static final int CONFIG_UI_MODE = 512; // 0x200
-  }
-
-}
-
-package android.support.v4.content.res {
-
-  public class ResourcesCompat {
-    ctor public ResourcesCompat();
-    method public static android.graphics.drawable.Drawable getDrawable(android.content.res.Resources, int, android.content.res.Resources.Theme) throws android.content.res.Resources.NotFoundException;
-    method public static android.graphics.drawable.Drawable getDrawableForDensity(android.content.res.Resources, int, int, android.content.res.Resources.Theme) throws android.content.res.Resources.NotFoundException;
-  }
-
-}
-
-package android.support.v4.database {
-
-  public class DatabaseUtilsCompat {
-    method public static java.lang.String[] appendSelectionArgs(java.lang.String[], java.lang.String[]);
-    method public static java.lang.String concatenateWhere(java.lang.String, java.lang.String);
-  }
-
-}
-
-package android.support.v4.graphics {
-
-  public class BitmapCompat {
-    ctor public BitmapCompat();
-    method public static int getAllocationByteCount(android.graphics.Bitmap);
-    method public static boolean hasMipMap(android.graphics.Bitmap);
-    method public static void setHasMipMap(android.graphics.Bitmap, boolean);
-  }
-
-  public class ColorUtils {
-    method public static int HSLToColor(float[]);
-    method public static void RGBToHSL(int, int, int, float[]);
-    method public static double calculateContrast(int, int);
-    method public static double calculateLuminance(int);
-    method public static int calculateMinimumAlpha(int, int, float);
-    method public static void colorToHSL(int, float[]);
-    method public static int compositeColors(int, int);
-    method public static int setAlphaComponent(int, int);
-  }
-
-}
-
-package android.support.v4.graphics.drawable {
-
-  public class DrawableCompat {
-    ctor public DrawableCompat();
-    method public static boolean isAutoMirrored(android.graphics.drawable.Drawable);
-    method public static void jumpToCurrentState(android.graphics.drawable.Drawable);
-    method public static void setAutoMirrored(android.graphics.drawable.Drawable, boolean);
-    method public static void setHotspot(android.graphics.drawable.Drawable, float, float);
-    method public static void setHotspotBounds(android.graphics.drawable.Drawable, int, int, int, int);
-    method public static void setTint(android.graphics.drawable.Drawable, int);
-    method public static void setTintList(android.graphics.drawable.Drawable, android.content.res.ColorStateList);
-    method public static void setTintMode(android.graphics.drawable.Drawable, android.graphics.PorterDuff.Mode);
-    method public static T unwrap(android.graphics.drawable.Drawable);
-    method public static android.graphics.drawable.Drawable wrap(android.graphics.drawable.Drawable);
-  }
-
-  public abstract class RoundedBitmapDrawable extends android.graphics.drawable.Drawable {
-    method public void draw(android.graphics.Canvas);
-    method public final android.graphics.Bitmap getBitmap();
-    method public float getCornerRadius();
-    method public int getGravity();
-    method public int getOpacity();
-    method public final android.graphics.Paint getPaint();
-    method public boolean hasAntiAlias();
-    method public boolean hasMipMap();
-    method public void setAlpha(int);
-    method public void setAntiAlias(boolean);
-    method public void setColorFilter(android.graphics.ColorFilter);
-    method public void setCornerRadius(float);
-    method public void setGravity(int);
-    method public void setMipMap(boolean);
-    method public void setTargetDensity(android.graphics.Canvas);
-    method public void setTargetDensity(android.util.DisplayMetrics);
-    method public void setTargetDensity(int);
-  }
-
-  public class RoundedBitmapDrawableFactory {
-    ctor public RoundedBitmapDrawableFactory();
-    method public static android.support.v4.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, android.graphics.Bitmap);
-    method public static android.support.v4.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, java.lang.String);
-    method public static android.support.v4.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, java.io.InputStream);
-  }
-
-}
-
-package android.support.v4.hardware.display {
-
-  public abstract class DisplayManagerCompat {
-    method public abstract android.view.Display getDisplay(int);
-    method public abstract android.view.Display[] getDisplays();
-    method public abstract android.view.Display[] getDisplays(java.lang.String);
-    method public static android.support.v4.hardware.display.DisplayManagerCompat getInstance(android.content.Context);
-    field public static final java.lang.String DISPLAY_CATEGORY_PRESENTATION = "android.hardware.display.category.PRESENTATION";
-  }
-
-}
-
-package android.support.v4.media {
-
-  public final class MediaDescriptionCompat implements android.os.Parcelable {
-    method public int describeContents();
-    method public static android.support.v4.media.MediaDescriptionCompat fromMediaDescription(java.lang.Object);
-    method public java.lang.CharSequence getDescription();
-    method public android.os.Bundle getExtras();
-    method public android.graphics.Bitmap getIconBitmap();
-    method public android.net.Uri getIconUri();
-    method public java.lang.Object getMediaDescription();
-    method public java.lang.String getMediaId();
-    method public java.lang.CharSequence getSubtitle();
-    method public java.lang.CharSequence getTitle();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.support.v4.media.MediaDescriptionCompat> CREATOR;
-  }
-
-  public static final class MediaDescriptionCompat.Builder {
-    ctor public MediaDescriptionCompat.Builder();
-    method public android.support.v4.media.MediaDescriptionCompat build();
-    method public android.support.v4.media.MediaDescriptionCompat.Builder setDescription(java.lang.CharSequence);
-    method public android.support.v4.media.MediaDescriptionCompat.Builder setExtras(android.os.Bundle);
-    method public android.support.v4.media.MediaDescriptionCompat.Builder setIconBitmap(android.graphics.Bitmap);
-    method public android.support.v4.media.MediaDescriptionCompat.Builder setIconUri(android.net.Uri);
-    method public android.support.v4.media.MediaDescriptionCompat.Builder setMediaId(java.lang.String);
-    method public android.support.v4.media.MediaDescriptionCompat.Builder setSubtitle(java.lang.CharSequence);
-    method public android.support.v4.media.MediaDescriptionCompat.Builder setTitle(java.lang.CharSequence);
-  }
-
-  public final class MediaMetadataCompat implements android.os.Parcelable {
-    method public boolean containsKey(java.lang.String);
-    method public int describeContents();
-    method public static android.support.v4.media.MediaMetadataCompat fromMediaMetadata(java.lang.Object);
-    method public android.graphics.Bitmap getBitmap(java.lang.String);
-    method public android.os.Bundle getBundle();
-    method public android.support.v4.media.MediaDescriptionCompat getDescription();
-    method public long getLong(java.lang.String);
-    method public java.lang.Object getMediaMetadata();
-    method public android.support.v4.media.RatingCompat getRating(java.lang.String);
-    method public java.lang.String getString(java.lang.String);
-    method public java.lang.CharSequence getText(java.lang.String);
-    method public java.util.Set<java.lang.String> keySet();
-    method public int size();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.support.v4.media.MediaMetadataCompat> CREATOR;
-    field public static final java.lang.String METADATA_KEY_ALBUM = "android.media.metadata.ALBUM";
-    field public static final java.lang.String METADATA_KEY_ALBUM_ART = "android.media.metadata.ALBUM_ART";
-    field public static final java.lang.String METADATA_KEY_ALBUM_ARTIST = "android.media.metadata.ALBUM_ARTIST";
-    field public static final java.lang.String METADATA_KEY_ALBUM_ART_URI = "android.media.metadata.ALBUM_ART_URI";
-    field public static final java.lang.String METADATA_KEY_ART = "android.media.metadata.ART";
-    field public static final java.lang.String METADATA_KEY_ARTIST = "android.media.metadata.ARTIST";
-    field public static final java.lang.String METADATA_KEY_ART_URI = "android.media.metadata.ART_URI";
-    field public static final java.lang.String METADATA_KEY_AUTHOR = "android.media.metadata.AUTHOR";
-    field public static final java.lang.String METADATA_KEY_COMPILATION = "android.media.metadata.COMPILATION";
-    field public static final java.lang.String METADATA_KEY_COMPOSER = "android.media.metadata.COMPOSER";
-    field public static final java.lang.String METADATA_KEY_DATE = "android.media.metadata.DATE";
-    field public static final java.lang.String METADATA_KEY_DISC_NUMBER = "android.media.metadata.DISC_NUMBER";
-    field public static final java.lang.String METADATA_KEY_DISPLAY_DESCRIPTION = "android.media.metadata.DISPLAY_DESCRIPTION";
-    field public static final java.lang.String METADATA_KEY_DISPLAY_ICON = "android.media.metadata.DISPLAY_ICON";
-    field public static final java.lang.String METADATA_KEY_DISPLAY_ICON_URI = "android.media.metadata.DISPLAY_ICON_URI";
-    field public static final java.lang.String METADATA_KEY_DISPLAY_SUBTITLE = "android.media.metadata.DISPLAY_SUBTITLE";
-    field public static final java.lang.String METADATA_KEY_DISPLAY_TITLE = "android.media.metadata.DISPLAY_TITLE";
-    field public static final java.lang.String METADATA_KEY_DURATION = "android.media.metadata.DURATION";
-    field public static final java.lang.String METADATA_KEY_GENRE = "android.media.metadata.GENRE";
-    field public static final java.lang.String METADATA_KEY_MEDIA_ID = "android.media.metadata.MEDIA_ID";
-    field public static final java.lang.String METADATA_KEY_NUM_TRACKS = "android.media.metadata.NUM_TRACKS";
-    field public static final java.lang.String METADATA_KEY_RATING = "android.media.metadata.RATING";
-    field public static final java.lang.String METADATA_KEY_TITLE = "android.media.metadata.TITLE";
-    field public static final java.lang.String METADATA_KEY_TRACK_NUMBER = "android.media.metadata.TRACK_NUMBER";
-    field public static final java.lang.String METADATA_KEY_USER_RATING = "android.media.metadata.USER_RATING";
-    field public static final java.lang.String METADATA_KEY_WRITER = "android.media.metadata.WRITER";
-    field public static final java.lang.String METADATA_KEY_YEAR = "android.media.metadata.YEAR";
-  }
-
-  public static final class MediaMetadataCompat.Builder {
-    ctor public MediaMetadataCompat.Builder();
-    ctor public MediaMetadataCompat.Builder(android.support.v4.media.MediaMetadataCompat);
-    method public android.support.v4.media.MediaMetadataCompat build();
-    method public android.support.v4.media.MediaMetadataCompat.Builder putBitmap(java.lang.String, android.graphics.Bitmap);
-    method public android.support.v4.media.MediaMetadataCompat.Builder putLong(java.lang.String, long);
-    method public android.support.v4.media.MediaMetadataCompat.Builder putRating(java.lang.String, android.support.v4.media.RatingCompat);
-    method public android.support.v4.media.MediaMetadataCompat.Builder putString(java.lang.String, java.lang.String);
-    method public android.support.v4.media.MediaMetadataCompat.Builder putText(java.lang.String, java.lang.CharSequence);
-  }
-
-  public final class RatingCompat implements android.os.Parcelable {
-    method public int describeContents();
-    method public static android.support.v4.media.RatingCompat fromRating(java.lang.Object);
-    method public float getPercentRating();
-    method public java.lang.Object getRating();
-    method public int getRatingStyle();
-    method public float getStarRating();
-    method public boolean hasHeart();
-    method public boolean isRated();
-    method public boolean isThumbUp();
-    method public static android.support.v4.media.RatingCompat newHeartRating(boolean);
-    method public static android.support.v4.media.RatingCompat newPercentageRating(float);
-    method public static android.support.v4.media.RatingCompat newStarRating(int, float);
-    method public static android.support.v4.media.RatingCompat newThumbRating(boolean);
-    method public static android.support.v4.media.RatingCompat newUnratedRating(int);
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.support.v4.media.RatingCompat> CREATOR;
-    field public static final int RATING_3_STARS = 3; // 0x3
-    field public static final int RATING_4_STARS = 4; // 0x4
-    field public static final int RATING_5_STARS = 5; // 0x5
-    field public static final int RATING_HEART = 1; // 0x1
-    field public static final int RATING_NONE = 0; // 0x0
-    field public static final int RATING_PERCENTAGE = 6; // 0x6
-    field public static final int RATING_THUMB_UP_DOWN = 2; // 0x2
-  }
-
-  public abstract class TransportController {
-    ctor public TransportController();
-    method public abstract int getBufferPercentage();
-    method public abstract long getCurrentPosition();
-    method public abstract long getDuration();
-    method public abstract int getTransportControlFlags();
-    method public abstract boolean isPlaying();
-    method public abstract void pausePlaying();
-    method public abstract void registerStateListener(android.support.v4.media.TransportStateListener);
-    method public abstract void seekTo(long);
-    method public abstract void startPlaying();
-    method public abstract void stopPlaying();
-    method public abstract void unregisterStateListener(android.support.v4.media.TransportStateListener);
-  }
-
-  public class TransportMediator extends android.support.v4.media.TransportController {
-    ctor public TransportMediator(android.app.Activity, android.support.v4.media.TransportPerformer);
-    ctor public TransportMediator(android.view.View, android.support.v4.media.TransportPerformer);
-    method public void destroy();
-    method public boolean dispatchKeyEvent(android.view.KeyEvent);
-    method public int getBufferPercentage();
-    method public long getCurrentPosition();
-    method public long getDuration();
-    method public java.lang.Object getRemoteControlClient();
-    method public int getTransportControlFlags();
-    method public boolean isPlaying();
-    method public void pausePlaying();
-    method public void refreshState();
-    method public void registerStateListener(android.support.v4.media.TransportStateListener);
-    method public void seekTo(long);
-    method public void startPlaying();
-    method public void stopPlaying();
-    method public void unregisterStateListener(android.support.v4.media.TransportStateListener);
-    field public static final int FLAG_KEY_MEDIA_FAST_FORWARD = 64; // 0x40
-    field public static final int FLAG_KEY_MEDIA_NEXT = 128; // 0x80
-    field public static final int FLAG_KEY_MEDIA_PAUSE = 16; // 0x10
-    field public static final int FLAG_KEY_MEDIA_PLAY = 4; // 0x4
-    field public static final int FLAG_KEY_MEDIA_PLAY_PAUSE = 8; // 0x8
-    field public static final int FLAG_KEY_MEDIA_PREVIOUS = 1; // 0x1
-    field public static final int FLAG_KEY_MEDIA_REWIND = 2; // 0x2
-    field public static final int FLAG_KEY_MEDIA_STOP = 32; // 0x20
-    field public static final int KEYCODE_MEDIA_PAUSE = 127; // 0x7f
-    field public static final int KEYCODE_MEDIA_PLAY = 126; // 0x7e
-    field public static final int KEYCODE_MEDIA_RECORD = 130; // 0x82
-  }
-
-  public abstract class TransportPerformer {
-    ctor public TransportPerformer();
-    method public void onAudioFocusChange(int);
-    method public int onGetBufferPercentage();
-    method public abstract long onGetCurrentPosition();
-    method public abstract long onGetDuration();
-    method public int onGetTransportControlFlags();
-    method public abstract boolean onIsPlaying();
-    method public boolean onMediaButtonDown(int, android.view.KeyEvent);
-    method public boolean onMediaButtonUp(int, android.view.KeyEvent);
-    method public abstract void onPause();
-    method public abstract void onSeekTo(long);
-    method public abstract void onStart();
-    method public abstract void onStop();
-  }
-
-  public class TransportStateListener {
-    ctor public TransportStateListener();
-    method public void onPlayingChanged(android.support.v4.media.TransportController);
-    method public void onTransportControlsChanged(android.support.v4.media.TransportController);
-  }
-
-  public abstract class VolumeProviderCompat {
-    ctor public VolumeProviderCompat(int, int, int);
-    method public final int getCurrentVolume();
-    method public final int getMaxVolume();
-    method public final int getVolumeControl();
-    method public java.lang.Object getVolumeProvider();
-    method public void onAdjustVolume(int);
-    method public void onSetVolumeTo(int);
-    method public void setCallback(android.support.v4.media.VolumeProviderCompat.Callback);
-    method public final void setCurrentVolume(int);
-    field public static final int VOLUME_CONTROL_ABSOLUTE = 2; // 0x2
-    field public static final int VOLUME_CONTROL_FIXED = 0; // 0x0
-    field public static final int VOLUME_CONTROL_RELATIVE = 1; // 0x1
-  }
-
-  public static abstract class VolumeProviderCompat.Callback {
-    ctor public VolumeProviderCompat.Callback();
-    method public abstract void onVolumeChanged(android.support.v4.media.VolumeProviderCompat);
-  }
-
-}
-
-package android.support.v4.media.session {
-
-  public final class MediaControllerCompat {
-    ctor public MediaControllerCompat(android.content.Context, android.support.v4.media.session.MediaSessionCompat);
-    ctor public MediaControllerCompat(android.content.Context, android.support.v4.media.session.MediaSessionCompat.Token) throws android.os.RemoteException;
-    method public void adjustVolume(int, int);
-    method public boolean dispatchMediaButtonEvent(android.view.KeyEvent);
-    method public android.os.Bundle getExtras();
-    method public long getFlags();
-    method public java.lang.Object getMediaController();
-    method public android.support.v4.media.MediaMetadataCompat getMetadata();
-    method public java.lang.String getPackageName();
-    method public android.support.v4.media.session.MediaControllerCompat.PlaybackInfo getPlaybackInfo();
-    method public android.support.v4.media.session.PlaybackStateCompat getPlaybackState();
-    method public java.util.List<android.support.v4.media.session.MediaSessionCompat.QueueItem> getQueue();
-    method public java.lang.CharSequence getQueueTitle();
-    method public int getRatingType();
-    method public android.app.PendingIntent getSessionActivity();
-    method public android.support.v4.media.session.MediaSessionCompat.Token getSessionToken();
-    method public android.support.v4.media.session.MediaControllerCompat.TransportControls getTransportControls();
-    method public void registerCallback(android.support.v4.media.session.MediaControllerCompat.Callback);
-    method public void registerCallback(android.support.v4.media.session.MediaControllerCompat.Callback, android.os.Handler);
-    method public void sendCommand(java.lang.String, android.os.Bundle, android.os.ResultReceiver);
-    method public void setVolumeTo(int, int);
-    method public void unregisterCallback(android.support.v4.media.session.MediaControllerCompat.Callback);
-  }
-
-  public static abstract class MediaControllerCompat.Callback implements android.os.IBinder.DeathRecipient {
-    ctor public MediaControllerCompat.Callback();
-    method public void binderDied();
-    method public void onAudioInfoChanged(android.support.v4.media.session.MediaControllerCompat.PlaybackInfo);
-    method public void onExtrasChanged(android.os.Bundle);
-    method public void onMetadataChanged(android.support.v4.media.MediaMetadataCompat);
-    method public void onPlaybackStateChanged(android.support.v4.media.session.PlaybackStateCompat);
-    method public void onQueueChanged(java.util.List<android.support.v4.media.session.MediaSessionCompat.QueueItem>);
-    method public void onQueueTitleChanged(java.lang.CharSequence);
-    method public void onSessionDestroyed();
-    method public void onSessionEvent(java.lang.String, android.os.Bundle);
-  }
-
-  public static final class MediaControllerCompat.PlaybackInfo {
-    method public int getAudioStream();
-    method public int getCurrentVolume();
-    method public int getMaxVolume();
-    method public int getPlaybackType();
-    method public int getVolumeControl();
-    field public static final int PLAYBACK_TYPE_LOCAL = 1; // 0x1
-    field public static final int PLAYBACK_TYPE_REMOTE = 2; // 0x2
-  }
-
-  public static abstract class MediaControllerCompat.TransportControls {
-    method public abstract void fastForward();
-    method public abstract void pause();
-    method public abstract void play();
-    method public abstract void playFromMediaId(java.lang.String, android.os.Bundle);
-    method public abstract void playFromSearch(java.lang.String, android.os.Bundle);
-    method public abstract void rewind();
-    method public abstract void seekTo(long);
-    method public abstract void sendCustomAction(android.support.v4.media.session.PlaybackStateCompat.CustomAction, android.os.Bundle);
-    method public abstract void sendCustomAction(java.lang.String, android.os.Bundle);
-    method public abstract void setRating(android.support.v4.media.RatingCompat);
-    method public abstract void skipToNext();
-    method public abstract void skipToPrevious();
-    method public abstract void skipToQueueItem(long);
-    method public abstract void stop();
-  }
-
-  public class MediaSessionCompat {
-    ctor public MediaSessionCompat(android.content.Context, java.lang.String, android.content.ComponentName, android.app.PendingIntent);
-    method public void addOnActiveChangeListener(android.support.v4.media.session.MediaSessionCompat.OnActiveChangeListener);
-    method public android.support.v4.media.session.MediaControllerCompat getController();
-    method public java.lang.Object getMediaSession();
-    method public java.lang.Object getRemoteControlClient();
-    method public android.support.v4.media.session.MediaSessionCompat.Token getSessionToken();
-    method public boolean isActive();
-    method public static android.support.v4.media.session.MediaSessionCompat obtain(android.content.Context, java.lang.Object);
-    method public void release();
-    method public void removeOnActiveChangeListener(android.support.v4.media.session.MediaSessionCompat.OnActiveChangeListener);
-    method public void sendSessionEvent(java.lang.String, android.os.Bundle);
-    method public void setActive(boolean);
-    method public void setCallback(android.support.v4.media.session.MediaSessionCompat.Callback);
-    method public void setCallback(android.support.v4.media.session.MediaSessionCompat.Callback, android.os.Handler);
-    method public void setExtras(android.os.Bundle);
-    method public void setFlags(int);
-    method public void setMediaButtonReceiver(android.app.PendingIntent);
-    method public void setMetadata(android.support.v4.media.MediaMetadataCompat);
-    method public void setPlaybackState(android.support.v4.media.session.PlaybackStateCompat);
-    method public void setPlaybackToLocal(int);
-    method public void setPlaybackToRemote(android.support.v4.media.VolumeProviderCompat);
-    method public void setQueue(java.util.List<android.support.v4.media.session.MediaSessionCompat.QueueItem>);
-    method public void setQueueTitle(java.lang.CharSequence);
-    method public void setRatingType(int);
-    method public void setSessionActivity(android.app.PendingIntent);
-    field public static final int FLAG_HANDLES_MEDIA_BUTTONS = 1; // 0x1
-    field public static final int FLAG_HANDLES_TRANSPORT_CONTROLS = 2; // 0x2
-  }
-
-  public static abstract class MediaSessionCompat.Callback {
-    ctor public MediaSessionCompat.Callback();
-    method public void onCommand(java.lang.String, android.os.Bundle, android.os.ResultReceiver);
-    method public void onCustomAction(java.lang.String, android.os.Bundle);
-    method public void onFastForward();
-    method public boolean onMediaButtonEvent(android.content.Intent);
-    method public void onPause();
-    method public void onPlay();
-    method public void onPlayFromMediaId(java.lang.String, android.os.Bundle);
-    method public void onPlayFromSearch(java.lang.String, android.os.Bundle);
-    method public void onRewind();
-    method public void onSeekTo(long);
-    method public void onSetRating(android.support.v4.media.RatingCompat);
-    method public void onSkipToNext();
-    method public void onSkipToPrevious();
-    method public void onSkipToQueueItem(long);
-    method public void onStop();
-  }
-
-  public static abstract interface MediaSessionCompat.OnActiveChangeListener {
-    method public abstract void onActiveChanged();
-  }
-
-  public static final class MediaSessionCompat.QueueItem implements android.os.Parcelable {
-    ctor public MediaSessionCompat.QueueItem(android.support.v4.media.MediaDescriptionCompat, long);
-    method public int describeContents();
-    method public android.support.v4.media.MediaDescriptionCompat getDescription();
-    method public long getQueueId();
-    method public java.lang.Object getQueueItem();
-    method public static android.support.v4.media.session.MediaSessionCompat.QueueItem obtain(java.lang.Object);
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.support.v4.media.session.MediaSessionCompat.QueueItem> CREATOR;
-    field public static final int UNKNOWN_ID = -1; // 0xffffffff
-  }
-
-  public static final class MediaSessionCompat.Token implements android.os.Parcelable {
-    method public int describeContents();
-    method public static android.support.v4.media.session.MediaSessionCompat.Token fromToken(java.lang.Object);
-    method public java.lang.Object getToken();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.support.v4.media.session.MediaSessionCompat.Token> CREATOR;
-  }
-
-  public class ParcelableVolumeInfo implements android.os.Parcelable {
-    ctor public ParcelableVolumeInfo(int, int, int, int, int);
-    ctor public ParcelableVolumeInfo(android.os.Parcel);
-    method public int describeContents();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.support.v4.media.session.ParcelableVolumeInfo> CREATOR;
-    field public int audioStream;
-    field public int controlType;
-    field public int currentVolume;
-    field public int maxVolume;
-    field public int volumeType;
-  }
-
-  public final class PlaybackStateCompat implements android.os.Parcelable {
-    method public int describeContents();
-    method public static android.support.v4.media.session.PlaybackStateCompat fromPlaybackState(java.lang.Object);
-    method public long getActions();
-    method public long getActiveQueueItemId();
-    method public long getBufferedPosition();
-    method public java.util.List<android.support.v4.media.session.PlaybackStateCompat.CustomAction> getCustomActions();
-    method public java.lang.CharSequence getErrorMessage();
-    method public android.os.Bundle getExtras();
-    method public long getLastPositionUpdateTime();
-    method public float getPlaybackSpeed();
-    method public java.lang.Object getPlaybackState();
-    method public long getPosition();
-    method public int getState();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final long ACTION_FAST_FORWARD = 64L; // 0x40L
-    field public static final long ACTION_PAUSE = 2L; // 0x2L
-    field public static final long ACTION_PLAY = 4L; // 0x4L
-    field public static final long ACTION_PLAY_FROM_MEDIA_ID = 1024L; // 0x400L
-    field public static final long ACTION_PLAY_FROM_SEARCH = 2048L; // 0x800L
-    field public static final long ACTION_PLAY_PAUSE = 512L; // 0x200L
-    field public static final long ACTION_REWIND = 8L; // 0x8L
-    field public static final long ACTION_SEEK_TO = 256L; // 0x100L
-    field public static final long ACTION_SET_RATING = 128L; // 0x80L
-    field public static final long ACTION_SKIP_TO_NEXT = 32L; // 0x20L
-    field public static final long ACTION_SKIP_TO_PREVIOUS = 16L; // 0x10L
-    field public static final long ACTION_SKIP_TO_QUEUE_ITEM = 4096L; // 0x1000L
-    field public static final long ACTION_STOP = 1L; // 0x1L
-    field public static final android.os.Parcelable.Creator<android.support.v4.media.session.PlaybackStateCompat> CREATOR;
-    field public static final long PLAYBACK_POSITION_UNKNOWN = -1L; // 0xffffffffffffffffL
-    field public static final int STATE_BUFFERING = 6; // 0x6
-    field public static final int STATE_CONNECTING = 8; // 0x8
-    field public static final int STATE_ERROR = 7; // 0x7
-    field public static final int STATE_FAST_FORWARDING = 4; // 0x4
-    field public static final int STATE_NONE = 0; // 0x0
-    field public static final int STATE_PAUSED = 2; // 0x2
-    field public static final int STATE_PLAYING = 3; // 0x3
-    field public static final int STATE_REWINDING = 5; // 0x5
-    field public static final int STATE_SKIPPING_TO_NEXT = 10; // 0xa
-    field public static final int STATE_SKIPPING_TO_PREVIOUS = 9; // 0x9
-    field public static final int STATE_SKIPPING_TO_QUEUE_ITEM = 11; // 0xb
-    field public static final int STATE_STOPPED = 1; // 0x1
-  }
-
-  public static final class PlaybackStateCompat.Builder {
-    ctor public PlaybackStateCompat.Builder();
-    ctor public PlaybackStateCompat.Builder(android.support.v4.media.session.PlaybackStateCompat);
-    method public android.support.v4.media.session.PlaybackStateCompat.Builder addCustomAction(java.lang.String, java.lang.String, int);
-    method public android.support.v4.media.session.PlaybackStateCompat.Builder addCustomAction(android.support.v4.media.session.PlaybackStateCompat.CustomAction);
-    method public android.support.v4.media.session.PlaybackStateCompat build();
-    method public android.support.v4.media.session.PlaybackStateCompat.Builder setActions(long);
-    method public android.support.v4.media.session.PlaybackStateCompat.Builder setActiveQueueItemId(long);
-    method public android.support.v4.media.session.PlaybackStateCompat.Builder setBufferedPosition(long);
-    method public android.support.v4.media.session.PlaybackStateCompat.Builder setErrorMessage(java.lang.CharSequence);
-    method public android.support.v4.media.session.PlaybackStateCompat.Builder setExtras(android.os.Bundle);
-    method public android.support.v4.media.session.PlaybackStateCompat.Builder setState(int, long, float);
-    method public android.support.v4.media.session.PlaybackStateCompat.Builder setState(int, long, float, long);
-  }
-
-  public static final class PlaybackStateCompat.CustomAction implements android.os.Parcelable {
-    method public int describeContents();
-    method public static android.support.v4.media.session.PlaybackStateCompat.CustomAction fromCustomAction(java.lang.Object);
-    method public java.lang.String getAction();
-    method public java.lang.Object getCustomAction();
-    method public android.os.Bundle getExtras();
-    method public int getIcon();
-    method public java.lang.CharSequence getName();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.support.v4.media.session.PlaybackStateCompat.CustomAction> CREATOR;
-  }
-
-  public static final class PlaybackStateCompat.CustomAction.Builder {
-    ctor public PlaybackStateCompat.CustomAction.Builder(java.lang.String, java.lang.CharSequence, int);
-    method public android.support.v4.media.session.PlaybackStateCompat.CustomAction build();
-    method public android.support.v4.media.session.PlaybackStateCompat.CustomAction.Builder setExtras(android.os.Bundle);
-  }
-
-}
-
-package android.support.v4.net {
-
-  public class ConnectivityManagerCompat {
-    ctor public ConnectivityManagerCompat();
-    method public static android.net.NetworkInfo getNetworkInfoFromBroadcast(android.net.ConnectivityManager, android.content.Intent);
-    method public static boolean isActiveNetworkMetered(android.net.ConnectivityManager);
-  }
-
-  public class TrafficStatsCompat {
-    ctor public TrafficStatsCompat();
-    method public static void clearThreadStatsTag();
-    method public static int getThreadStatsTag();
-    method public static void incrementOperationCount(int);
-    method public static void incrementOperationCount(int, int);
-    method public static void setThreadStatsTag(int);
-    method public static void tagSocket(java.net.Socket) throws java.net.SocketException;
-    method public static void untagSocket(java.net.Socket) throws java.net.SocketException;
-  }
-
-}
-
-package android.support.v4.os {
-
-  public class AsyncTaskCompat {
-    ctor public AsyncTaskCompat();
-    method public static android.os.AsyncTask<Params, Progress, Result> executeParallel(android.os.AsyncTask<Params, Progress, Result>, Params...);
-  }
-
-  public class EnvironmentCompat {
-    ctor public EnvironmentCompat();
-    method public static java.lang.String getStorageState(java.io.File);
-    field public static final java.lang.String MEDIA_UNKNOWN = "unknown";
-  }
-
-  public class ParcelableCompat {
-    ctor public ParcelableCompat();
-    method public static android.os.Parcelable.Creator<T> newCreator(android.support.v4.os.ParcelableCompatCreatorCallbacks<T>);
-  }
-
-  public abstract interface ParcelableCompatCreatorCallbacks {
-    method public abstract T createFromParcel(android.os.Parcel, java.lang.ClassLoader);
-    method public abstract T[] newArray(int);
-  }
-
-  public class TraceCompat {
-    ctor public TraceCompat();
-    method public static void beginSection(java.lang.String);
-    method public static void endSection();
-  }
-
-}
-
-package android.support.v4.print {
-
-  public final class PrintHelper {
-    ctor public PrintHelper(android.content.Context);
-    method public int getColorMode();
-    method public int getOrientation();
-    method public int getScaleMode();
-    method public void printBitmap(java.lang.String, android.graphics.Bitmap);
-    method public void printBitmap(java.lang.String, android.graphics.Bitmap, android.support.v4.print.PrintHelper.OnPrintFinishCallback);
-    method public void printBitmap(java.lang.String, android.net.Uri) throws java.io.FileNotFoundException;
-    method public void printBitmap(java.lang.String, android.net.Uri, android.support.v4.print.PrintHelper.OnPrintFinishCallback) throws java.io.FileNotFoundException;
-    method public void setColorMode(int);
-    method public void setOrientation(int);
-    method public void setScaleMode(int);
-    method public static boolean systemSupportsPrint();
-    field public static final int COLOR_MODE_COLOR = 2; // 0x2
-    field public static final int COLOR_MODE_MONOCHROME = 1; // 0x1
-    field public static final int ORIENTATION_LANDSCAPE = 1; // 0x1
-    field public static final int ORIENTATION_PORTRAIT = 2; // 0x2
-    field public static final int SCALE_MODE_FILL = 2; // 0x2
-    field public static final int SCALE_MODE_FIT = 1; // 0x1
-  }
-
-  public static abstract interface PrintHelper.OnPrintFinishCallback {
-    method public abstract void onFinish();
-  }
-
-}
-
-package android.support.v4.provider {
-
-  public abstract class DocumentFile {
-    method public abstract boolean canRead();
-    method public abstract boolean canWrite();
-    method public abstract android.support.v4.provider.DocumentFile createDirectory(java.lang.String);
-    method public abstract android.support.v4.provider.DocumentFile createFile(java.lang.String, java.lang.String);
-    method public abstract boolean delete();
-    method public abstract boolean exists();
-    method public android.support.v4.provider.DocumentFile findFile(java.lang.String);
-    method public static android.support.v4.provider.DocumentFile fromFile(java.io.File);
-    method public static android.support.v4.provider.DocumentFile fromSingleUri(android.content.Context, android.net.Uri);
-    method public static android.support.v4.provider.DocumentFile fromTreeUri(android.content.Context, android.net.Uri);
-    method public abstract java.lang.String getName();
-    method public android.support.v4.provider.DocumentFile getParentFile();
-    method public abstract java.lang.String getType();
-    method public abstract android.net.Uri getUri();
-    method public abstract boolean isDirectory();
-    method public static boolean isDocumentUri(android.content.Context, android.net.Uri);
-    method public abstract boolean isFile();
-    method public abstract long lastModified();
-    method public abstract long length();
-    method public abstract android.support.v4.provider.DocumentFile[] listFiles();
-    method public abstract boolean renameTo(java.lang.String);
-  }
-
-}
-
-package android.support.v4.text {
-
-  public final class BidiFormatter {
-    method public static android.support.v4.text.BidiFormatter getInstance();
-    method public static android.support.v4.text.BidiFormatter getInstance(boolean);
-    method public static android.support.v4.text.BidiFormatter getInstance(java.util.Locale);
-    method public boolean getStereoReset();
-    method public boolean isRtl(java.lang.String);
-    method public boolean isRtlContext();
-    method public java.lang.String unicodeWrap(java.lang.String, android.support.v4.text.TextDirectionHeuristicCompat, boolean);
-    method public java.lang.String unicodeWrap(java.lang.String, android.support.v4.text.TextDirectionHeuristicCompat);
-    method public java.lang.String unicodeWrap(java.lang.String, boolean);
-    method public java.lang.String unicodeWrap(java.lang.String);
-  }
-
-  public static final class BidiFormatter.Builder {
-    ctor public BidiFormatter.Builder();
-    ctor public BidiFormatter.Builder(boolean);
-    ctor public BidiFormatter.Builder(java.util.Locale);
-    method public android.support.v4.text.BidiFormatter build();
-    method public android.support.v4.text.BidiFormatter.Builder setTextDirectionHeuristic(android.support.v4.text.TextDirectionHeuristicCompat);
-    method public android.support.v4.text.BidiFormatter.Builder stereoReset(boolean);
-  }
-
-  public class ICUCompat {
-    ctor public ICUCompat();
-    method public static java.lang.String addLikelySubtags(java.lang.String);
-    method public static java.lang.String getScript(java.lang.String);
-  }
-
-  public abstract interface TextDirectionHeuristicCompat {
-    method public abstract boolean isRtl(char[], int, int);
-    method public abstract boolean isRtl(java.lang.CharSequence, int, int);
-  }
-
-  public class TextDirectionHeuristicsCompat {
-    ctor public TextDirectionHeuristicsCompat();
-    field public static final android.support.v4.text.TextDirectionHeuristicCompat ANYRTL_LTR;
-    field public static final android.support.v4.text.TextDirectionHeuristicCompat FIRSTSTRONG_LTR;
-    field public static final android.support.v4.text.TextDirectionHeuristicCompat FIRSTSTRONG_RTL;
-    field public static final android.support.v4.text.TextDirectionHeuristicCompat LOCALE;
-    field public static final android.support.v4.text.TextDirectionHeuristicCompat LTR;
-    field public static final android.support.v4.text.TextDirectionHeuristicCompat RTL;
-  }
-
-  public class TextUtilsCompat {
-    ctor public TextUtilsCompat();
-    method public static int getLayoutDirectionFromLocale(java.util.Locale);
-    method public static java.lang.String htmlEncode(java.lang.String);
-    field public static final java.util.Locale ROOT;
-  }
-
-}
-
-package android.support.v4.util {
-
-  public class ArrayMap extends android.support.v4.util.SimpleArrayMap implements java.util.Map {
-    ctor public ArrayMap();
-    ctor public ArrayMap(int);
-    ctor public ArrayMap(android.support.v4.util.SimpleArrayMap);
-    method public boolean containsAll(java.util.Collection<?>);
-    method public java.util.Set<java.util.Map.Entry<K, V>> entrySet();
-    method public java.util.Set<K> keySet();
-    method public void putAll(java.util.Map<? extends K, ? extends V>);
-    method public boolean removeAll(java.util.Collection<?>);
-    method public boolean retainAll(java.util.Collection<?>);
-    method public java.util.Collection<V> values();
-  }
-
-  public class AtomicFile {
-    ctor public AtomicFile(java.io.File);
-    method public void delete();
-    method public void failWrite(java.io.FileOutputStream);
-    method public void finishWrite(java.io.FileOutputStream);
-    method public java.io.File getBaseFile();
-    method public java.io.FileInputStream openRead() throws java.io.FileNotFoundException;
-    method public byte[] readFully() throws java.io.IOException;
-    method public java.io.FileOutputStream startWrite() throws java.io.IOException;
-  }
-
-  public final class CircularArray {
-    ctor public CircularArray();
-    ctor public CircularArray(int);
-    method public void addFirst(E);
-    method public void addLast(E);
-    method public void clear();
-    method public E get(int);
-    method public E getFirst();
-    method public E getLast();
-    method public boolean isEmpty();
-    method public E popFirst();
-    method public E popLast();
-    method public void removeFromEnd(int);
-    method public void removeFromStart(int);
-    method public int size();
-  }
-
-  public final class CircularIntArray {
-    ctor public CircularIntArray();
-    ctor public CircularIntArray(int);
-    method public void addFirst(int);
-    method public void addLast(int);
-    method public void clear();
-    method public int get(int);
-    method public int getFirst();
-    method public int getLast();
-    method public boolean isEmpty();
-    method public int popFirst();
-    method public int popLast();
-    method public void removeFromEnd(int);
-    method public void removeFromStart(int);
-    method public int size();
-  }
-
-  public class LongSparseArray {
-    ctor public LongSparseArray();
-    ctor public LongSparseArray(int);
-    method public void append(long, E);
-    method public void clear();
-    method public android.support.v4.util.LongSparseArray<E> clone();
-    method public void delete(long);
-    method public E get(long);
-    method public E get(long, E);
-    method public int indexOfKey(long);
-    method public int indexOfValue(E);
-    method public long keyAt(int);
-    method public void put(long, E);
-    method public void remove(long);
-    method public void removeAt(int);
-    method public void setValueAt(int, E);
-    method public int size();
-    method public E valueAt(int);
-  }
-
-  public class LruCache {
-    ctor public LruCache(int);
-    method protected V create(K);
-    method public final synchronized int createCount();
-    method protected void entryRemoved(boolean, K, V, V);
-    method public final void evictAll();
-    method public final synchronized int evictionCount();
-    method public final V get(K);
-    method public final synchronized int hitCount();
-    method public final synchronized int maxSize();
-    method public final synchronized int missCount();
-    method public final V put(K, V);
-    method public final synchronized int putCount();
-    method public final V remove(K);
-    method public void resize(int);
-    method public final synchronized int size();
-    method protected int sizeOf(K, V);
-    method public final synchronized java.util.Map<K, V> snapshot();
-    method public final synchronized java.lang.String toString();
-    method public void trimToSize(int);
-  }
-
-  public class Pair {
-    ctor public Pair(F, S);
-    method public static android.support.v4.util.Pair<A, B> create(A, B);
-    field public final F first;
-    field public final S second;
-  }
-
-  public final class Pools {
-  }
-
-  public static abstract interface Pools.Pool {
-    method public abstract T acquire();
-    method public abstract boolean release(T);
-  }
-
-  public static class Pools.SimplePool implements android.support.v4.util.Pools.Pool {
-    ctor public Pools.SimplePool(int);
-    method public T acquire();
-    method public boolean release(T);
-  }
-
-  public static class Pools.SynchronizedPool extends android.support.v4.util.Pools.SimplePool {
-    ctor public Pools.SynchronizedPool(int);
-  }
-
-  public class SimpleArrayMap {
-    ctor public SimpleArrayMap();
-    ctor public SimpleArrayMap(int);
-    ctor public SimpleArrayMap(android.support.v4.util.SimpleArrayMap);
-    method public void clear();
-    method public boolean containsKey(java.lang.Object);
-    method public boolean containsValue(java.lang.Object);
-    method public void ensureCapacity(int);
-    method public V get(java.lang.Object);
-    method public int indexOfKey(java.lang.Object);
-    method public boolean isEmpty();
-    method public K keyAt(int);
-    method public V put(K, V);
-    method public void putAll(android.support.v4.util.SimpleArrayMap<? extends K, ? extends V>);
-    method public V remove(java.lang.Object);
-    method public V removeAt(int);
-    method public V setValueAt(int, V);
-    method public int size();
-    method public V valueAt(int);
-  }
-
-  public class SparseArrayCompat {
-    ctor public SparseArrayCompat();
-    ctor public SparseArrayCompat(int);
-    method public void append(int, E);
-    method public void clear();
-    method public android.support.v4.util.SparseArrayCompat<E> clone();
-    method public void delete(int);
-    method public E get(int);
-    method public E get(int, E);
-    method public int indexOfKey(int);
-    method public int indexOfValue(E);
-    method public int keyAt(int);
-    method public void put(int, E);
-    method public void remove(int);
-    method public void removeAt(int);
-    method public void removeAtRange(int, int);
-    method public void setValueAt(int, E);
-    method public int size();
-    method public E valueAt(int);
-  }
-
-}
-
-package android.support.v4.view {
-
-  public class AccessibilityDelegateCompat {
-    ctor public AccessibilityDelegateCompat();
-    method public boolean dispatchPopulateAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
-    method public android.support.v4.view.accessibility.AccessibilityNodeProviderCompat getAccessibilityNodeProvider(android.view.View);
-    method public void onInitializeAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
-    method public void onInitializeAccessibilityNodeInfo(android.view.View, android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
-    method public void onPopulateAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
-    method public boolean onRequestSendAccessibilityEvent(android.view.ViewGroup, android.view.View, android.view.accessibility.AccessibilityEvent);
-    method public boolean performAccessibilityAction(android.view.View, int, android.os.Bundle);
-    method public void sendAccessibilityEvent(android.view.View, int);
-    method public void sendAccessibilityEventUnchecked(android.view.View, android.view.accessibility.AccessibilityEvent);
-  }
-
-  public abstract class ActionProvider {
-    ctor public ActionProvider(android.content.Context);
-    method public android.content.Context getContext();
-    method public boolean hasSubMenu();
-    method public boolean isVisible();
-    method public abstract android.view.View onCreateActionView();
-    method public android.view.View onCreateActionView(android.view.MenuItem);
-    method public boolean onPerformDefaultAction();
-    method public void onPrepareSubMenu(android.view.SubMenu);
-    method public boolean overridesItemVisibility();
-    method public void refreshVisibility();
-    method public void setVisibilityListener(android.support.v4.view.ActionProvider.VisibilityListener);
-  }
-
-  public static abstract interface ActionProvider.VisibilityListener {
-    method public abstract void onActionProviderVisibilityChanged(boolean);
-  }
-
-  public class GestureDetectorCompat {
-    ctor public GestureDetectorCompat(android.content.Context, android.view.GestureDetector.OnGestureListener);
-    ctor public GestureDetectorCompat(android.content.Context, android.view.GestureDetector.OnGestureListener, android.os.Handler);
-    method public boolean isLongpressEnabled();
-    method public boolean onTouchEvent(android.view.MotionEvent);
-    method public void setIsLongpressEnabled(boolean);
-    method public void setOnDoubleTapListener(android.view.GestureDetector.OnDoubleTapListener);
-  }
-
-  public class GravityCompat {
-    ctor public GravityCompat();
-    method public static void apply(int, int, int, android.graphics.Rect, android.graphics.Rect, int);
-    method public static void apply(int, int, int, android.graphics.Rect, int, int, android.graphics.Rect, int);
-    method public static void applyDisplay(int, android.graphics.Rect, android.graphics.Rect, int);
-    method public static int getAbsoluteGravity(int, int);
-    field public static final int END = 8388613; // 0x800005
-    field public static final int RELATIVE_HORIZONTAL_GRAVITY_MASK = 8388615; // 0x800007
-    field public static final int RELATIVE_LAYOUT_DIRECTION = 8388608; // 0x800000
-    field public static final int START = 8388611; // 0x800003
-  }
-
-  public class InputDeviceCompat {
-    ctor public InputDeviceCompat();
-    field public static final int SOURCE_ANY = -256; // 0xffffff00
-    field public static final int SOURCE_CLASS_BUTTON = 1; // 0x1
-    field public static final int SOURCE_CLASS_JOYSTICK = 16; // 0x10
-    field public static final int SOURCE_CLASS_MASK = 255; // 0xff
-    field public static final int SOURCE_CLASS_NONE = 0; // 0x0
-    field public static final int SOURCE_CLASS_POINTER = 2; // 0x2
-    field public static final int SOURCE_CLASS_POSITION = 8; // 0x8
-    field public static final int SOURCE_CLASS_TRACKBALL = 4; // 0x4
-    field public static final int SOURCE_DPAD = 513; // 0x201
-    field public static final int SOURCE_GAMEPAD = 1025; // 0x401
-    field public static final int SOURCE_HDMI = 33554433; // 0x2000001
-    field public static final int SOURCE_JOYSTICK = 16777232; // 0x1000010
-    field public static final int SOURCE_KEYBOARD = 257; // 0x101
-    field public static final int SOURCE_MOUSE = 8194; // 0x2002
-    field public static final int SOURCE_STYLUS = 16386; // 0x4002
-    field public static final int SOURCE_TOUCHPAD = 1048584; // 0x100008
-    field public static final int SOURCE_TOUCHSCREEN = 4098; // 0x1002
-    field public static final int SOURCE_TOUCH_NAVIGATION = 2097152; // 0x200000
-    field public static final int SOURCE_TRACKBALL = 65540; // 0x10004
-    field public static final int SOURCE_UNKNOWN = 0; // 0x0
-  }
-
-  public class KeyEventCompat {
-    ctor public KeyEventCompat();
-    method public static boolean dispatch(android.view.KeyEvent, android.view.KeyEvent.Callback, java.lang.Object, java.lang.Object);
-    method public static java.lang.Object getKeyDispatcherState(android.view.View);
-    method public static boolean hasModifiers(android.view.KeyEvent, int);
-    method public static boolean hasNoModifiers(android.view.KeyEvent);
-    method public static boolean isTracking(android.view.KeyEvent);
-    method public static boolean metaStateHasModifiers(int, int);
-    method public static boolean metaStateHasNoModifiers(int);
-    method public static int normalizeMetaState(int);
-    method public static void startTracking(android.view.KeyEvent);
-  }
-
-  public class LayoutInflaterCompat {
-    method public static void setFactory(android.view.LayoutInflater, android.support.v4.view.LayoutInflaterFactory);
-  }
-
-  public abstract interface LayoutInflaterFactory {
-    method public abstract android.view.View onCreateView(android.view.View, java.lang.String, android.content.Context, android.util.AttributeSet);
-  }
-
-  public class MarginLayoutParamsCompat {
-    ctor public MarginLayoutParamsCompat();
-    method public static int getLayoutDirection(android.view.ViewGroup.MarginLayoutParams);
-    method public static int getMarginEnd(android.view.ViewGroup.MarginLayoutParams);
-    method public static int getMarginStart(android.view.ViewGroup.MarginLayoutParams);
-    method public static boolean isMarginRelative(android.view.ViewGroup.MarginLayoutParams);
-    method public static void resolveLayoutDirection(android.view.ViewGroup.MarginLayoutParams, int);
-    method public static void setLayoutDirection(android.view.ViewGroup.MarginLayoutParams, int);
-    method public static void setMarginEnd(android.view.ViewGroup.MarginLayoutParams, int);
-    method public static void setMarginStart(android.view.ViewGroup.MarginLayoutParams, int);
-  }
-
-  public class MenuCompat {
-    ctor public MenuCompat();
-    method public static deprecated void setShowAsAction(android.view.MenuItem, int);
-  }
-
-  public class MenuItemCompat {
-    ctor public MenuItemCompat();
-    method public static boolean collapseActionView(android.view.MenuItem);
-    method public static boolean expandActionView(android.view.MenuItem);
-    method public static android.support.v4.view.ActionProvider getActionProvider(android.view.MenuItem);
-    method public static android.view.View getActionView(android.view.MenuItem);
-    method public static boolean isActionViewExpanded(android.view.MenuItem);
-    method public static android.view.MenuItem setActionProvider(android.view.MenuItem, android.support.v4.view.ActionProvider);
-    method public static android.view.MenuItem setActionView(android.view.MenuItem, android.view.View);
-    method public static android.view.MenuItem setActionView(android.view.MenuItem, int);
-    method public static android.view.MenuItem setOnActionExpandListener(android.view.MenuItem, android.support.v4.view.MenuItemCompat.OnActionExpandListener);
-    method public static void setShowAsAction(android.view.MenuItem, int);
-    field public static final int SHOW_AS_ACTION_ALWAYS = 2; // 0x2
-    field public static final int SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW = 8; // 0x8
-    field public static final int SHOW_AS_ACTION_IF_ROOM = 1; // 0x1
-    field public static final int SHOW_AS_ACTION_NEVER = 0; // 0x0
-    field public static final int SHOW_AS_ACTION_WITH_TEXT = 4; // 0x4
-  }
-
-  public static abstract interface MenuItemCompat.OnActionExpandListener {
-    method public abstract boolean onMenuItemActionCollapse(android.view.MenuItem);
-    method public abstract boolean onMenuItemActionExpand(android.view.MenuItem);
-  }
-
-  public class MotionEventCompat {
-    ctor public MotionEventCompat();
-    method public static int findPointerIndex(android.view.MotionEvent, int);
-    method public static int getActionIndex(android.view.MotionEvent);
-    method public static int getActionMasked(android.view.MotionEvent);
-    method public static float getAxisValue(android.view.MotionEvent, int);
-    method public static float getAxisValue(android.view.MotionEvent, int, int);
-    method public static int getPointerCount(android.view.MotionEvent);
-    method public static int getPointerId(android.view.MotionEvent, int);
-    method public static int getSource(android.view.MotionEvent);
-    method public static float getX(android.view.MotionEvent, int);
-    method public static float getY(android.view.MotionEvent, int);
-    field public static final int ACTION_HOVER_ENTER = 9; // 0x9
-    field public static final int ACTION_HOVER_EXIT = 10; // 0xa
-    field public static final int ACTION_HOVER_MOVE = 7; // 0x7
-    field public static final int ACTION_MASK = 255; // 0xff
-    field public static final int ACTION_POINTER_DOWN = 5; // 0x5
-    field public static final int ACTION_POINTER_INDEX_MASK = 65280; // 0xff00
-    field public static final int ACTION_POINTER_INDEX_SHIFT = 8; // 0x8
-    field public static final int ACTION_POINTER_UP = 6; // 0x6
-    field public static final int ACTION_SCROLL = 8; // 0x8
-    field public static final int AXIS_BRAKE = 23; // 0x17
-    field public static final int AXIS_DISTANCE = 24; // 0x18
-    field public static final int AXIS_GAS = 22; // 0x16
-    field public static final int AXIS_GENERIC_1 = 32; // 0x20
-    field public static final int AXIS_GENERIC_10 = 41; // 0x29
-    field public static final int AXIS_GENERIC_11 = 42; // 0x2a
-    field public static final int AXIS_GENERIC_12 = 43; // 0x2b
-    field public static final int AXIS_GENERIC_13 = 44; // 0x2c
-    field public static final int AXIS_GENERIC_14 = 45; // 0x2d
-    field public static final int AXIS_GENERIC_15 = 46; // 0x2e
-    field public static final int AXIS_GENERIC_16 = 47; // 0x2f
-    field public static final int AXIS_GENERIC_2 = 33; // 0x21
-    field public static final int AXIS_GENERIC_3 = 34; // 0x22
-    field public static final int AXIS_GENERIC_4 = 35; // 0x23
-    field public static final int AXIS_GENERIC_5 = 36; // 0x24
-    field public static final int AXIS_GENERIC_6 = 37; // 0x25
-    field public static final int AXIS_GENERIC_7 = 38; // 0x26
-    field public static final int AXIS_GENERIC_8 = 39; // 0x27
-    field public static final int AXIS_GENERIC_9 = 40; // 0x28
-    field public static final int AXIS_HAT_X = 15; // 0xf
-    field public static final int AXIS_HAT_Y = 16; // 0x10
-    field public static final int AXIS_HSCROLL = 10; // 0xa
-    field public static final int AXIS_LTRIGGER = 17; // 0x11
-    field public static final int AXIS_ORIENTATION = 8; // 0x8
-    field public static final int AXIS_PRESSURE = 2; // 0x2
-    field public static final int AXIS_RTRIGGER = 18; // 0x12
-    field public static final int AXIS_RUDDER = 20; // 0x14
-    field public static final int AXIS_RX = 12; // 0xc
-    field public static final int AXIS_RY = 13; // 0xd
-    field public static final int AXIS_RZ = 14; // 0xe
-    field public static final int AXIS_SIZE = 3; // 0x3
-    field public static final int AXIS_THROTTLE = 19; // 0x13
-    field public static final int AXIS_TILT = 25; // 0x19
-    field public static final int AXIS_TOOL_MAJOR = 6; // 0x6
-    field public static final int AXIS_TOOL_MINOR = 7; // 0x7
-    field public static final int AXIS_TOUCH_MAJOR = 4; // 0x4
-    field public static final int AXIS_TOUCH_MINOR = 5; // 0x5
-    field public static final int AXIS_VSCROLL = 9; // 0x9
-    field public static final int AXIS_WHEEL = 21; // 0x15
-    field public static final int AXIS_X = 0; // 0x0
-    field public static final int AXIS_Y = 1; // 0x1
-    field public static final int AXIS_Z = 11; // 0xb
-  }
-
-  public abstract interface NestedScrollingChild {
-    method public abstract boolean dispatchNestedFling(float, float, boolean);
-    method public abstract boolean dispatchNestedPreFling(float, float);
-    method public abstract boolean dispatchNestedPreScroll(int, int, int[], int[]);
-    method public abstract boolean dispatchNestedScroll(int, int, int, int, int[]);
-    method public abstract boolean hasNestedScrollingParent();
-    method public abstract boolean isNestedScrollingEnabled();
-    method public abstract void setNestedScrollingEnabled(boolean);
-    method public abstract boolean startNestedScroll(int);
-    method public abstract void stopNestedScroll();
-  }
-
-  public class NestedScrollingChildHelper {
-    ctor public NestedScrollingChildHelper(android.view.View);
-    method public boolean dispatchNestedFling(float, float, boolean);
-    method public boolean dispatchNestedPreFling(float, float);
-    method public boolean dispatchNestedPreScroll(int, int, int[], int[]);
-    method public boolean dispatchNestedScroll(int, int, int, int, int[]);
-    method public boolean hasNestedScrollingParent();
-    method public boolean isNestedScrollingEnabled();
-    method public void onDetachedFromWindow();
-    method public void onStopNestedScroll(android.view.View);
-    method public void setNestedScrollingEnabled(boolean);
-    method public boolean startNestedScroll(int);
-    method public void stopNestedScroll();
-  }
-
-  public abstract interface NestedScrollingParent {
-    method public abstract int getNestedScrollAxes();
-    method public abstract boolean onNestedFling(android.view.View, float, float, boolean);
-    method public abstract boolean onNestedPreFling(android.view.View, float, float);
-    method public abstract void onNestedPreScroll(android.view.View, int, int, int[]);
-    method public abstract void onNestedScroll(android.view.View, int, int, int, int);
-    method public abstract void onNestedScrollAccepted(android.view.View, android.view.View, int);
-    method public abstract boolean onStartNestedScroll(android.view.View, android.view.View, int);
-    method public abstract void onStopNestedScroll(android.view.View);
-  }
-
-  public class NestedScrollingParentHelper {
-    ctor public NestedScrollingParentHelper(android.view.ViewGroup);
-    method public int getNestedScrollAxes();
-    method public void onNestedScrollAccepted(android.view.View, android.view.View, int);
-    method public void onStopNestedScroll(android.view.View);
-  }
-
-  public abstract interface OnApplyWindowInsetsListener {
-    method public abstract android.support.v4.view.WindowInsetsCompat onApplyWindowInsets(android.view.View, android.support.v4.view.WindowInsetsCompat);
-  }
-
-  public abstract class PagerAdapter {
-    ctor public PagerAdapter();
-    method public void destroyItem(android.view.ViewGroup, int, java.lang.Object);
-    method public deprecated void destroyItem(android.view.View, int, java.lang.Object);
-    method public void finishUpdate(android.view.ViewGroup);
-    method public deprecated void finishUpdate(android.view.View);
-    method public abstract int getCount();
-    method public int getItemPosition(java.lang.Object);
-    method public java.lang.CharSequence getPageTitle(int);
-    method public float getPageWidth(int);
-    method public java.lang.Object instantiateItem(android.view.ViewGroup, int);
-    method public deprecated java.lang.Object instantiateItem(android.view.View, int);
-    method public abstract boolean isViewFromObject(android.view.View, java.lang.Object);
-    method public void notifyDataSetChanged();
-    method public void registerDataSetObserver(android.database.DataSetObserver);
-    method public void restoreState(android.os.Parcelable, java.lang.ClassLoader);
-    method public android.os.Parcelable saveState();
-    method public void setPrimaryItem(android.view.ViewGroup, int, java.lang.Object);
-    method public deprecated void setPrimaryItem(android.view.View, int, java.lang.Object);
-    method public void startUpdate(android.view.ViewGroup);
-    method public deprecated void startUpdate(android.view.View);
-    method public void unregisterDataSetObserver(android.database.DataSetObserver);
-    field public static final int POSITION_NONE = -2; // 0xfffffffe
-    field public static final int POSITION_UNCHANGED = -1; // 0xffffffff
-  }
-
-  public class PagerTabStrip extends android.support.v4.view.PagerTitleStrip {
-    ctor public PagerTabStrip(android.content.Context);
-    ctor public PagerTabStrip(android.content.Context, android.util.AttributeSet);
-    method public boolean getDrawFullUnderline();
-    method public int getTabIndicatorColor();
-    method public void setDrawFullUnderline(boolean);
-    method public void setTabIndicatorColor(int);
-    method public void setTabIndicatorColorResource(int);
-  }
-
-  public class PagerTitleStrip extends android.view.ViewGroup {
-    ctor public PagerTitleStrip(android.content.Context);
-    ctor public PagerTitleStrip(android.content.Context, android.util.AttributeSet);
-    method public int getTextSpacing();
-    method protected void onLayout(boolean, int, int, int, int);
-    method public void setGravity(int);
-    method public void setNonPrimaryAlpha(float);
-    method public void setTextColor(int);
-    method public void setTextSize(int, float);
-    method public void setTextSpacing(int);
-  }
-
-  public class ScaleGestureDetectorCompat {
-    method public static boolean isQuickScaleEnabled(java.lang.Object);
-    method public static void setQuickScaleEnabled(java.lang.Object, boolean);
-  }
-
-  public abstract interface ScrollingView {
-    method public abstract int computeHorizontalScrollExtent();
-    method public abstract int computeHorizontalScrollOffset();
-    method public abstract int computeHorizontalScrollRange();
-    method public abstract int computeVerticalScrollExtent();
-    method public abstract int computeVerticalScrollOffset();
-    method public abstract int computeVerticalScrollRange();
-  }
-
-  public class VelocityTrackerCompat {
-    ctor public VelocityTrackerCompat();
-    method public static float getXVelocity(android.view.VelocityTracker, int);
-    method public static float getYVelocity(android.view.VelocityTracker, int);
-  }
-
-  public class ViewCompat {
-    ctor public ViewCompat();
-    method public static android.support.v4.view.ViewPropertyAnimatorCompat animate(android.view.View);
-    method public static boolean canScrollHorizontally(android.view.View, int);
-    method public static boolean canScrollVertically(android.view.View, int);
-    method public static int combineMeasuredStates(int, int);
-    method public static android.support.v4.view.WindowInsetsCompat dispatchApplyWindowInsets(android.view.View, android.support.v4.view.WindowInsetsCompat);
-    method public static void dispatchFinishTemporaryDetach(android.view.View);
-    method public static boolean dispatchNestedFling(android.view.View, float, float, boolean);
-    method public static boolean dispatchNestedPreFling(android.view.View, float, float);
-    method public static boolean dispatchNestedPreScroll(android.view.View, int, int, int[], int[]);
-    method public static boolean dispatchNestedScroll(android.view.View, int, int, int, int, int[]);
-    method public static void dispatchStartTemporaryDetach(android.view.View);
-    method public static int getAccessibilityLiveRegion(android.view.View);
-    method public static android.support.v4.view.accessibility.AccessibilityNodeProviderCompat getAccessibilityNodeProvider(android.view.View);
-    method public static float getAlpha(android.view.View);
-    method public static android.content.res.ColorStateList getBackgroundTintList(android.view.View);
-    method public static android.graphics.PorterDuff.Mode getBackgroundTintMode(android.view.View);
-    method public static float getElevation(android.view.View);
-    method public static boolean getFitsSystemWindows(android.view.View);
-    method public static int getImportantForAccessibility(android.view.View);
-    method public static int getLabelFor(android.view.View);
-    method public static int getLayerType(android.view.View);
-    method public static int getLayoutDirection(android.view.View);
-    method public static int getMeasuredHeightAndState(android.view.View);
-    method public static int getMeasuredState(android.view.View);
-    method public static int getMeasuredWidthAndState(android.view.View);
-    method public static int getMinimumHeight(android.view.View);
-    method public static int getMinimumWidth(android.view.View);
-    method public static int getOverScrollMode(android.view.View);
-    method public static int getPaddingEnd(android.view.View);
-    method public static int getPaddingStart(android.view.View);
-    method public static android.view.ViewParent getParentForAccessibility(android.view.View);
-    method public static float getPivotX(android.view.View);
-    method public static float getPivotY(android.view.View);
-    method public static float getRotation(android.view.View);
-    method public static float getRotationX(android.view.View);
-    method public static float getRotationY(android.view.View);
-    method public static float getScaleX(android.view.View);
-    method public static float getScaleY(android.view.View);
-    method public static java.lang.String getTransitionName(android.view.View);
-    method public static float getTranslationX(android.view.View);
-    method public static float getTranslationY(android.view.View);
-    method public static float getTranslationZ(android.view.View);
-    method public static int getWindowSystemUiVisibility(android.view.View);
-    method public static float getX(android.view.View);
-    method public static float getY(android.view.View);
-    method public static float getZ(android.view.View);
-    method public static boolean hasAccessibilityDelegate(android.view.View);
-    method public static boolean hasNestedScrollingParent(android.view.View);
-    method public static boolean hasTransientState(android.view.View);
-    method public static boolean isAttachedToWindow(android.view.View);
-    method public static boolean isLaidOut(android.view.View);
-    method public static boolean isNestedScrollingEnabled(android.view.View);
-    method public static boolean isOpaque(android.view.View);
-    method public static boolean isPaddingRelative(android.view.View);
-    method public static void jumpDrawablesToCurrentState(android.view.View);
-    method public static void offsetLeftAndRight(android.view.View, int);
-    method public static void offsetTopAndBottom(android.view.View, int);
-    method public static android.support.v4.view.WindowInsetsCompat onApplyWindowInsets(android.view.View, android.support.v4.view.WindowInsetsCompat);
-    method public static void onInitializeAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
-    method public static void onInitializeAccessibilityNodeInfo(android.view.View, android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
-    method public static void onPopulateAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
-    method public static boolean performAccessibilityAction(android.view.View, int, android.os.Bundle);
-    method public static void postInvalidateOnAnimation(android.view.View);
-    method public static void postInvalidateOnAnimation(android.view.View, int, int, int, int);
-    method public static void postOnAnimation(android.view.View, java.lang.Runnable);
-    method public static void postOnAnimationDelayed(android.view.View, java.lang.Runnable, long);
-    method public static void requestApplyInsets(android.view.View);
-    method public static int resolveSizeAndState(int, int, int);
-    method public static void setAccessibilityDelegate(android.view.View, android.support.v4.view.AccessibilityDelegateCompat);
-    method public static void setAccessibilityLiveRegion(android.view.View, int);
-    method public static void setActivated(android.view.View, boolean);
-    method public static void setAlpha(android.view.View, float);
-    method public static void setBackgroundTintList(android.view.View, android.content.res.ColorStateList);
-    method public static void setBackgroundTintMode(android.view.View, android.graphics.PorterDuff.Mode);
-    method public static void setChildrenDrawingOrderEnabled(android.view.ViewGroup, boolean);
-    method public static void setElevation(android.view.View, float);
-    method public static void setFitsSystemWindows(android.view.View, boolean);
-    method public static void setHasTransientState(android.view.View, boolean);
-    method public static void setImportantForAccessibility(android.view.View, int);
-    method public static void setLabelFor(android.view.View, int);
-    method public static void setLayerPaint(android.view.View, android.graphics.Paint);
-    method public static void setLayerType(android.view.View, int, android.graphics.Paint);
-    method public static void setLayoutDirection(android.view.View, int);
-    method public static void setNestedScrollingEnabled(android.view.View, boolean);
-    method public static void setOnApplyWindowInsetsListener(android.view.View, android.support.v4.view.OnApplyWindowInsetsListener);
-    method public static void setOverScrollMode(android.view.View, int);
-    method public static void setPaddingRelative(android.view.View, int, int, int, int);
-    method public static void setPivotX(android.view.View, float);
-    method public static void setPivotY(android.view.View, float);
-    method public static void setRotation(android.view.View, float);
-    method public static void setRotationX(android.view.View, float);
-    method public static void setRotationY(android.view.View, float);
-    method public static void setSaveFromParentEnabled(android.view.View, boolean);
-    method public static void setScaleX(android.view.View, float);
-    method public static void setScaleY(android.view.View, float);
-    method public static void setTransitionName(android.view.View, java.lang.String);
-    method public static void setTranslationX(android.view.View, float);
-    method public static void setTranslationY(android.view.View, float);
-    method public static void setTranslationZ(android.view.View, float);
-    method public static void setX(android.view.View, float);
-    method public static void setY(android.view.View, float);
-    method public static boolean startNestedScroll(android.view.View, int);
-    method public static void stopNestedScroll(android.view.View);
-    field public static final int ACCESSIBILITY_LIVE_REGION_ASSERTIVE = 2; // 0x2
-    field public static final int ACCESSIBILITY_LIVE_REGION_NONE = 0; // 0x0
-    field public static final int ACCESSIBILITY_LIVE_REGION_POLITE = 1; // 0x1
-    field public static final int IMPORTANT_FOR_ACCESSIBILITY_AUTO = 0; // 0x0
-    field public static final int IMPORTANT_FOR_ACCESSIBILITY_NO = 2; // 0x2
-    field public static final int IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS = 4; // 0x4
-    field public static final int IMPORTANT_FOR_ACCESSIBILITY_YES = 1; // 0x1
-    field public static final int LAYER_TYPE_HARDWARE = 2; // 0x2
-    field public static final int LAYER_TYPE_NONE = 0; // 0x0
-    field public static final int LAYER_TYPE_SOFTWARE = 1; // 0x1
-    field public static final int LAYOUT_DIRECTION_INHERIT = 2; // 0x2
-    field public static final int LAYOUT_DIRECTION_LOCALE = 3; // 0x3
-    field public static final int LAYOUT_DIRECTION_LTR = 0; // 0x0
-    field public static final int LAYOUT_DIRECTION_RTL = 1; // 0x1
-    field public static final int MEASURED_HEIGHT_STATE_SHIFT = 16; // 0x10
-    field public static final int MEASURED_SIZE_MASK = 16777215; // 0xffffff
-    field public static final int MEASURED_STATE_MASK = -16777216; // 0xff000000
-    field public static final int MEASURED_STATE_TOO_SMALL = 16777216; // 0x1000000
-    field public static final int OVER_SCROLL_ALWAYS = 0; // 0x0
-    field public static final int OVER_SCROLL_IF_CONTENT_SCROLLS = 1; // 0x1
-    field public static final int OVER_SCROLL_NEVER = 2; // 0x2
-    field public static final int SCROLL_AXIS_HORIZONTAL = 1; // 0x1
-    field public static final int SCROLL_AXIS_NONE = 0; // 0x0
-    field public static final int SCROLL_AXIS_VERTICAL = 2; // 0x2
-  }
-
-  public class ViewConfigurationCompat {
-    ctor public ViewConfigurationCompat();
-    method public static int getScaledPagingTouchSlop(android.view.ViewConfiguration);
-    method public static boolean hasPermanentMenuKey(android.view.ViewConfiguration);
-  }
-
-  public class ViewGroupCompat {
-    method public static int getLayoutMode(android.view.ViewGroup);
-    method public static int getNestedScrollAxes(android.view.ViewGroup);
-    method public static boolean isTransitionGroup(android.view.ViewGroup);
-    method public static boolean onRequestSendAccessibilityEvent(android.view.ViewGroup, android.view.View, android.view.accessibility.AccessibilityEvent);
-    method public static void setLayoutMode(android.view.ViewGroup, int);
-    method public static void setMotionEventSplittingEnabled(android.view.ViewGroup, boolean);
-    method public static void setTransitionGroup(android.view.ViewGroup, boolean);
-    field public static final int LAYOUT_MODE_CLIP_BOUNDS = 0; // 0x0
-    field public static final int LAYOUT_MODE_OPTICAL_BOUNDS = 1; // 0x1
-  }
-
-  public class ViewPager extends android.view.ViewGroup {
-    ctor public ViewPager(android.content.Context);
-    ctor public ViewPager(android.content.Context, android.util.AttributeSet);
-    method public void addOnPageChangeListener(android.support.v4.view.ViewPager.OnPageChangeListener);
-    method public boolean arrowScroll(int);
-    method public boolean beginFakeDrag();
-    method protected boolean canScroll(android.view.View, boolean, int, int, int);
-    method public void clearOnPageChangeListeners();
-    method public void endFakeDrag();
-    method public boolean executeKeyEvent(android.view.KeyEvent);
-    method public void fakeDragBy(float);
-    method public android.support.v4.view.PagerAdapter getAdapter();
-    method public int getCurrentItem();
-    method public int getOffscreenPageLimit();
-    method public int getPageMargin();
-    method public boolean isFakeDragging();
-    method protected void onLayout(boolean, int, int, int, int);
-    method protected void onPageScrolled(int, float, int);
-    method public void onRestoreInstanceState(android.os.Parcelable);
-    method public android.os.Parcelable onSaveInstanceState();
-    method public void removeOnPageChangeListener(android.support.v4.view.ViewPager.OnPageChangeListener);
-    method public void setAdapter(android.support.v4.view.PagerAdapter);
-    method public void setCurrentItem(int);
-    method public void setCurrentItem(int, boolean);
-    method public void setOffscreenPageLimit(int);
-    method public deprecated void setOnPageChangeListener(android.support.v4.view.ViewPager.OnPageChangeListener);
-    method public void setPageMargin(int);
-    method public void setPageMarginDrawable(android.graphics.drawable.Drawable);
-    method public void setPageMarginDrawable(int);
-    method public void setPageTransformer(boolean, android.support.v4.view.ViewPager.PageTransformer);
-    field public static final int SCROLL_STATE_DRAGGING = 1; // 0x1
-    field public static final int SCROLL_STATE_IDLE = 0; // 0x0
-    field public static final int SCROLL_STATE_SETTLING = 2; // 0x2
-  }
-
-  public static class ViewPager.LayoutParams extends android.view.ViewGroup.LayoutParams {
-    ctor public ViewPager.LayoutParams();
-    ctor public ViewPager.LayoutParams(android.content.Context, android.util.AttributeSet);
-    field public int gravity;
-    field public boolean isDecor;
-  }
-
-  public static abstract interface ViewPager.OnPageChangeListener {
-    method public abstract void onPageScrollStateChanged(int);
-    method public abstract void onPageScrolled(int, float, int);
-    method public abstract void onPageSelected(int);
-  }
-
-  public static abstract interface ViewPager.PageTransformer {
-    method public abstract void transformPage(android.view.View, float);
-  }
-
-  public static class ViewPager.SavedState extends android.view.View.BaseSavedState {
-    ctor public ViewPager.SavedState(android.os.Parcelable);
-    field public static final android.os.Parcelable.Creator<android.support.v4.view.ViewPager.SavedState> CREATOR;
-  }
-
-  public static class ViewPager.SimpleOnPageChangeListener implements android.support.v4.view.ViewPager.OnPageChangeListener {
-    ctor public ViewPager.SimpleOnPageChangeListener();
-    method public void onPageScrollStateChanged(int);
-    method public void onPageScrolled(int, float, int);
-    method public void onPageSelected(int);
-  }
-
-  public class ViewParentCompat {
-    method public static void notifySubtreeAccessibilityStateChanged(android.view.ViewParent, android.view.View, android.view.View, int);
-    method public static boolean onNestedFling(android.view.ViewParent, android.view.View, float, float, boolean);
-    method public static boolean onNestedPreFling(android.view.ViewParent, android.view.View, float, float);
-    method public static void onNestedPreScroll(android.view.ViewParent, android.view.View, int, int, int[]);
-    method public static void onNestedScroll(android.view.ViewParent, android.view.View, int, int, int, int);
-    method public static void onNestedScrollAccepted(android.view.ViewParent, android.view.View, android.view.View, int);
-    method public static boolean onStartNestedScroll(android.view.ViewParent, android.view.View, android.view.View, int);
-    method public static void onStopNestedScroll(android.view.ViewParent, android.view.View);
-    method public static boolean requestSendAccessibilityEvent(android.view.ViewParent, android.view.View, android.view.accessibility.AccessibilityEvent);
-  }
-
-  public class ViewPropertyAnimatorCompat {
-    method public android.support.v4.view.ViewPropertyAnimatorCompat alpha(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat alphaBy(float);
-    method public void cancel();
-    method public long getDuration();
-    method public android.view.animation.Interpolator getInterpolator();
-    method public long getStartDelay();
-    method public android.support.v4.view.ViewPropertyAnimatorCompat rotation(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat rotationBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat rotationX(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat rotationXBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat rotationY(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat rotationYBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat scaleX(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat scaleXBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat scaleY(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat scaleYBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat setDuration(long);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat setInterpolator(android.view.animation.Interpolator);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat setListener(android.support.v4.view.ViewPropertyAnimatorListener);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat setStartDelay(long);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat setUpdateListener(android.support.v4.view.ViewPropertyAnimatorUpdateListener);
-    method public void start();
-    method public android.support.v4.view.ViewPropertyAnimatorCompat translationX(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat translationXBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat translationY(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat translationYBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat translationZ(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat translationZBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat withEndAction(java.lang.Runnable);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat withLayer();
-    method public android.support.v4.view.ViewPropertyAnimatorCompat withStartAction(java.lang.Runnable);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat x(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat xBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat y(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat yBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat z(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat zBy(float);
-  }
-
-  public abstract interface ViewPropertyAnimatorListener {
-    method public abstract void onAnimationCancel(android.view.View);
-    method public abstract void onAnimationEnd(android.view.View);
-    method public abstract void onAnimationStart(android.view.View);
-  }
-
-  public class ViewPropertyAnimatorListenerAdapter implements android.support.v4.view.ViewPropertyAnimatorListener {
-    ctor public ViewPropertyAnimatorListenerAdapter();
-    method public void onAnimationCancel(android.view.View);
-    method public void onAnimationEnd(android.view.View);
-    method public void onAnimationStart(android.view.View);
-  }
-
-  public abstract interface ViewPropertyAnimatorUpdateListener {
-    method public abstract void onAnimationUpdate(android.view.View);
-  }
-
-  public class WindowCompat {
-    ctor public WindowCompat();
-    field public static final int FEATURE_ACTION_BAR = 8; // 0x8
-    field public static final int FEATURE_ACTION_BAR_OVERLAY = 9; // 0x9
-    field public static final int FEATURE_ACTION_MODE_OVERLAY = 10; // 0xa
-  }
-
-  public class WindowInsetsCompat {
-    method public android.support.v4.view.WindowInsetsCompat consumeStableInsets();
-    method public android.support.v4.view.WindowInsetsCompat consumeSystemWindowInsets();
-    method public int getStableInsetBottom();
-    method public int getStableInsetLeft();
-    method public int getStableInsetRight();
-    method public int getStableInsetTop();
-    method public int getSystemWindowInsetBottom();
-    method public int getSystemWindowInsetLeft();
-    method public int getSystemWindowInsetRight();
-    method public int getSystemWindowInsetTop();
-    method public boolean hasInsets();
-    method public boolean hasStableInsets();
-    method public boolean hasSystemWindowInsets();
-    method public boolean isConsumed();
-    method public boolean isRound();
-    method public android.support.v4.view.WindowInsetsCompat replaceSystemWindowInsets(int, int, int, int);
-    method public android.support.v4.view.WindowInsetsCompat replaceSystemWindowInsets(android.graphics.Rect);
-  }
-
-}
-
-package android.support.v4.view.accessibility {
-
-  public class AccessibilityEventCompat {
-    method public static void appendRecord(android.view.accessibility.AccessibilityEvent, android.support.v4.view.accessibility.AccessibilityRecordCompat);
-    method public static android.support.v4.view.accessibility.AccessibilityRecordCompat asRecord(android.view.accessibility.AccessibilityEvent);
-    method public static int getContentChangeTypes(android.view.accessibility.AccessibilityEvent);
-    method public static android.support.v4.view.accessibility.AccessibilityRecordCompat getRecord(android.view.accessibility.AccessibilityEvent, int);
-    method public static int getRecordCount(android.view.accessibility.AccessibilityEvent);
-    method public static void setContentChangeTypes(android.view.accessibility.AccessibilityEvent, int);
-    field public static final int CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION = 4; // 0x4
-    field public static final int CONTENT_CHANGE_TYPE_SUBTREE = 1; // 0x1
-    field public static final int CONTENT_CHANGE_TYPE_TEXT = 2; // 0x2
-    field public static final int CONTENT_CHANGE_TYPE_UNDEFINED = 0; // 0x0
-    field public static final int TYPES_ALL_MASK = -1; // 0xffffffff
-    field public static final int TYPE_ANNOUNCEMENT = 16384; // 0x4000
-    field public static final int TYPE_GESTURE_DETECTION_END = 524288; // 0x80000
-    field public static final int TYPE_GESTURE_DETECTION_START = 262144; // 0x40000
-    field public static final int TYPE_TOUCH_EXPLORATION_GESTURE_END = 1024; // 0x400
-    field public static final int TYPE_TOUCH_EXPLORATION_GESTURE_START = 512; // 0x200
-    field public static final int TYPE_TOUCH_INTERACTION_END = 2097152; // 0x200000
-    field public static final int TYPE_TOUCH_INTERACTION_START = 1048576; // 0x100000
-    field public static final int TYPE_VIEW_ACCESSIBILITY_FOCUSED = 32768; // 0x8000
-    field public static final int TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED = 65536; // 0x10000
-    field public static final int TYPE_VIEW_HOVER_ENTER = 128; // 0x80
-    field public static final int TYPE_VIEW_HOVER_EXIT = 256; // 0x100
-    field public static final int TYPE_VIEW_SCROLLED = 4096; // 0x1000
-    field public static final int TYPE_VIEW_TEXT_SELECTION_CHANGED = 8192; // 0x2000
-    field public static final int TYPE_VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITY = 131072; // 0x20000
-    field public static final int TYPE_WINDOW_CONTENT_CHANGED = 2048; // 0x800
-  }
-
-  public class AccessibilityManagerCompat {
-    ctor public AccessibilityManagerCompat();
-    method public static boolean addAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager, android.support.v4.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat);
-    method public static java.util.List<android.accessibilityservice.AccessibilityServiceInfo> getEnabledAccessibilityServiceList(android.view.accessibility.AccessibilityManager, int);
-    method public static java.util.List<android.accessibilityservice.AccessibilityServiceInfo> getInstalledAccessibilityServiceList(android.view.accessibility.AccessibilityManager);
-    method public static boolean isTouchExplorationEnabled(android.view.accessibility.AccessibilityManager);
-    method public static boolean removeAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager, android.support.v4.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat);
-  }
-
-  public static abstract class AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat {
-    ctor public AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat();
-    method public abstract void onAccessibilityStateChanged(boolean);
-  }
-
-  public class AccessibilityNodeInfoCompat {
-    ctor public AccessibilityNodeInfoCompat(java.lang.Object);
-    method public void addAction(int);
-    method public void addAction(android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat);
-    method public void addChild(android.view.View);
-    method public void addChild(android.view.View, int);
-    method public java.util.List<android.support.v4.view.accessibility.AccessibilityNodeInfoCompat> findAccessibilityNodeInfosByText(java.lang.String);
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat findFocus(int);
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat focusSearch(int);
-    method public java.util.List<android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat> getActionList();
-    method public int getActions();
-    method public void getBoundsInParent(android.graphics.Rect);
-    method public void getBoundsInScreen(android.graphics.Rect);
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getChild(int);
-    method public int getChildCount();
-    method public java.lang.CharSequence getClassName();
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat getCollectionInfo();
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat getCollectionItemInfo();
-    method public java.lang.CharSequence getContentDescription();
-    method public java.lang.CharSequence getError();
-    method public java.lang.Object getInfo();
-    method public int getLiveRegion();
-    method public int getMovementGranularities();
-    method public java.lang.CharSequence getPackageName();
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getParent();
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat getRangeInfo();
-    method public java.lang.CharSequence getText();
-    method public java.lang.String getViewIdResourceName();
-    method public int getWindowId();
-    method public boolean isAccessibilityFocused();
-    method public boolean isCheckable();
-    method public boolean isChecked();
-    method public boolean isClickable();
-    method public boolean isContentInvalid();
-    method public boolean isEnabled();
-    method public boolean isFocusable();
-    method public boolean isFocused();
-    method public boolean isLongClickable();
-    method public boolean isPassword();
-    method public boolean isScrollable();
-    method public boolean isSelected();
-    method public boolean isVisibleToUser();
-    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat obtain(android.view.View);
-    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat obtain(android.view.View, int);
-    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat obtain();
-    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat obtain(android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
-    method public boolean performAction(int);
-    method public boolean performAction(int, android.os.Bundle);
-    method public void recycle();
-    method public void setAccessibilityFocused(boolean);
-    method public void setBoundsInParent(android.graphics.Rect);
-    method public void setBoundsInScreen(android.graphics.Rect);
-    method public void setCheckable(boolean);
-    method public void setChecked(boolean);
-    method public void setClassName(java.lang.CharSequence);
-    method public void setClickable(boolean);
-    method public void setCollectionInfo(java.lang.Object);
-    method public void setCollectionItemInfo(java.lang.Object);
-    method public void setContentDescription(java.lang.CharSequence);
-    method public void setContentInvalid(boolean);
-    method public void setEnabled(boolean);
-    method public void setError(java.lang.CharSequence);
-    method public void setFocusable(boolean);
-    method public void setFocused(boolean);
-    method public void setLabelFor(android.view.View);
-    method public void setLabelFor(android.view.View, int);
-    method public void setLiveRegion(int);
-    method public void setLongClickable(boolean);
-    method public void setMovementGranularities(int);
-    method public void setPackageName(java.lang.CharSequence);
-    method public void setParent(android.view.View);
-    method public void setParent(android.view.View, int);
-    method public void setPassword(boolean);
-    method public void setScrollable(boolean);
-    method public void setSelected(boolean);
-    method public void setSource(android.view.View);
-    method public void setSource(android.view.View, int);
-    method public void setText(java.lang.CharSequence);
-    method public void setViewIdResourceName(java.lang.String);
-    method public void setVisibleToUser(boolean);
-    field public static final int ACTION_ACCESSIBILITY_FOCUS = 64; // 0x40
-    field public static final java.lang.String ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN = "ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN";
-    field public static final java.lang.String ACTION_ARGUMENT_HTML_ELEMENT_STRING = "ACTION_ARGUMENT_HTML_ELEMENT_STRING";
-    field public static final java.lang.String ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT = "ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT";
-    field public static final java.lang.String ACTION_ARGUMENT_SELECTION_END_INT = "ACTION_ARGUMENT_SELECTION_END_INT";
-    field public static final java.lang.String ACTION_ARGUMENT_SELECTION_START_INT = "ACTION_ARGUMENT_SELECTION_START_INT";
-    field public static final java.lang.String ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE = "ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE";
-    field public static final int ACTION_CLEAR_ACCESSIBILITY_FOCUS = 128; // 0x80
-    field public static final int ACTION_CLEAR_FOCUS = 2; // 0x2
-    field public static final int ACTION_CLEAR_SELECTION = 8; // 0x8
-    field public static final int ACTION_CLICK = 16; // 0x10
-    field public static final int ACTION_COPY = 16384; // 0x4000
-    field public static final int ACTION_CUT = 65536; // 0x10000
-    field public static final int ACTION_FOCUS = 1; // 0x1
-    field public static final int ACTION_LONG_CLICK = 32; // 0x20
-    field public static final int ACTION_NEXT_AT_MOVEMENT_GRANULARITY = 256; // 0x100
-    field public static final int ACTION_NEXT_HTML_ELEMENT = 1024; // 0x400
-    field public static final int ACTION_PASTE = 32768; // 0x8000
-    field public static final int ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY = 512; // 0x200
-    field public static final int ACTION_PREVIOUS_HTML_ELEMENT = 2048; // 0x800
-    field public static final int ACTION_SCROLL_BACKWARD = 8192; // 0x2000
-    field public static final int ACTION_SCROLL_FORWARD = 4096; // 0x1000
-    field public static final int ACTION_SELECT = 4; // 0x4
-    field public static final int ACTION_SET_SELECTION = 131072; // 0x20000
-    field public static final int ACTION_SET_TEXT = 2097152; // 0x200000
-    field public static final int FOCUS_ACCESSIBILITY = 2; // 0x2
-    field public static final int FOCUS_INPUT = 1; // 0x1
-    field public static final int MOVEMENT_GRANULARITY_CHARACTER = 1; // 0x1
-    field public static final int MOVEMENT_GRANULARITY_LINE = 4; // 0x4
-    field public static final int MOVEMENT_GRANULARITY_PAGE = 16; // 0x10
-    field public static final int MOVEMENT_GRANULARITY_PARAGRAPH = 8; // 0x8
-    field public static final int MOVEMENT_GRANULARITY_WORD = 2; // 0x2
-  }
-
-  public static class AccessibilityNodeInfoCompat.AccessibilityActionCompat {
-    ctor public AccessibilityNodeInfoCompat.AccessibilityActionCompat(int, java.lang.CharSequence);
-    method public int getId();
-    method public java.lang.CharSequence getLabel();
-  }
-
-  public static class AccessibilityNodeInfoCompat.CollectionInfoCompat {
-    method public int getColumnCount();
-    method public int getRowCount();
-    method public boolean isHierarchical();
-    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat obtain(int, int, boolean, int);
-    field public static final int SELECTION_MODE_MULTIPLE = 2; // 0x2
-    field public static final int SELECTION_MODE_NONE = 0; // 0x0
-    field public static final int SELECTION_MODE_SINGLE = 1; // 0x1
-  }
-
-  public static class AccessibilityNodeInfoCompat.CollectionItemInfoCompat {
-    method public int getColumnIndex();
-    method public int getColumnSpan();
-    method public int getRowIndex();
-    method public int getRowSpan();
-    method public boolean isHeading();
-    method public boolean isSelected();
-    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat obtain(int, int, int, int, boolean, boolean);
-  }
-
-  public static class AccessibilityNodeInfoCompat.RangeInfoCompat {
-    method public float getCurrent();
-    method public float getMax();
-    method public float getMin();
-    method public int getType();
-    field public static final int RANGE_TYPE_FLOAT = 1; // 0x1
-    field public static final int RANGE_TYPE_INT = 0; // 0x0
-    field public static final int RANGE_TYPE_PERCENT = 2; // 0x2
-  }
-
-  public class AccessibilityNodeProviderCompat {
-    ctor public AccessibilityNodeProviderCompat();
-    ctor public AccessibilityNodeProviderCompat(java.lang.Object);
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat createAccessibilityNodeInfo(int);
-    method public java.util.List<android.support.v4.view.accessibility.AccessibilityNodeInfoCompat> findAccessibilityNodeInfosByText(java.lang.String, int);
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat findFocus(int);
-    method public java.lang.Object getProvider();
-    method public boolean performAction(int, int, android.os.Bundle);
-  }
-
-  public class AccessibilityRecordCompat {
-    ctor public deprecated AccessibilityRecordCompat(java.lang.Object);
-    method public int getAddedCount();
-    method public java.lang.CharSequence getBeforeText();
-    method public java.lang.CharSequence getClassName();
-    method public java.lang.CharSequence getContentDescription();
-    method public int getCurrentItemIndex();
-    method public int getFromIndex();
-    method public deprecated java.lang.Object getImpl();
-    method public int getItemCount();
-    method public int getMaxScrollX();
-    method public int getMaxScrollY();
-    method public android.os.Parcelable getParcelableData();
-    method public int getRemovedCount();
-    method public int getScrollX();
-    method public int getScrollY();
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getSource();
-    method public java.util.List<java.lang.CharSequence> getText();
-    method public int getToIndex();
-    method public int getWindowId();
-    method public boolean isChecked();
-    method public boolean isEnabled();
-    method public boolean isFullScreen();
-    method public boolean isPassword();
-    method public boolean isScrollable();
-    method public static android.support.v4.view.accessibility.AccessibilityRecordCompat obtain(android.support.v4.view.accessibility.AccessibilityRecordCompat);
-    method public static android.support.v4.view.accessibility.AccessibilityRecordCompat obtain();
-    method public void recycle();
-    method public void setAddedCount(int);
-    method public void setBeforeText(java.lang.CharSequence);
-    method public void setChecked(boolean);
-    method public void setClassName(java.lang.CharSequence);
-    method public void setContentDescription(java.lang.CharSequence);
-    method public void setCurrentItemIndex(int);
-    method public void setEnabled(boolean);
-    method public void setFromIndex(int);
-    method public void setFullScreen(boolean);
-    method public void setItemCount(int);
-    method public void setMaxScrollX(int);
-    method public void setMaxScrollY(int);
-    method public void setParcelableData(android.os.Parcelable);
-    method public void setPassword(boolean);
-    method public void setRemovedCount(int);
-    method public void setScrollX(int);
-    method public void setScrollY(int);
-    method public void setScrollable(boolean);
-    method public void setSource(android.view.View);
-    method public void setSource(android.view.View, int);
-    method public void setToIndex(int);
-  }
-
-}
-
-package android.support.v4.view.animation {
-
-  public class FastOutLinearInInterpolator extends android.support.v4.view.animation.LookupTableInterpolator {
-    ctor public FastOutLinearInInterpolator();
-  }
-
-  public class FastOutSlowInInterpolator extends android.support.v4.view.animation.LookupTableInterpolator {
-    ctor public FastOutSlowInInterpolator();
-  }
-
-  public class LinearOutSlowInInterpolator extends android.support.v4.view.animation.LookupTableInterpolator {
-    ctor public LinearOutSlowInInterpolator();
-  }
-
-   abstract class LookupTableInterpolator implements android.view.animation.Interpolator {
-    ctor public LookupTableInterpolator(float[]);
-    method public float getInterpolation(float);
-  }
-
-  public class PathInterpolatorCompat {
-    method public static android.view.animation.Interpolator create(android.graphics.Path);
-    method public static android.view.animation.Interpolator create(float, float);
-    method public static android.view.animation.Interpolator create(float, float, float, float);
-  }
-
-}
-
-package android.support.v4.widget {
-
-  public abstract class AutoScrollHelper implements android.view.View.OnTouchListener {
-    ctor public AutoScrollHelper(android.view.View);
-    method public abstract boolean canTargetScrollHorizontally(int);
-    method public abstract boolean canTargetScrollVertically(int);
-    method public boolean isEnabled();
-    method public boolean isExclusive();
-    method public boolean onTouch(android.view.View, android.view.MotionEvent);
-    method public abstract void scrollTargetBy(int, int);
-    method public android.support.v4.widget.AutoScrollHelper setActivationDelay(int);
-    method public android.support.v4.widget.AutoScrollHelper setEdgeType(int);
-    method public android.support.v4.widget.AutoScrollHelper setEnabled(boolean);
-    method public android.support.v4.widget.AutoScrollHelper setExclusive(boolean);
-    method public android.support.v4.widget.AutoScrollHelper setMaximumEdges(float, float);
-    method public android.support.v4.widget.AutoScrollHelper setMaximumVelocity(float, float);
-    method public android.support.v4.widget.AutoScrollHelper setMinimumVelocity(float, float);
-    method public android.support.v4.widget.AutoScrollHelper setRampDownDuration(int);
-    method public android.support.v4.widget.AutoScrollHelper setRampUpDuration(int);
-    method public android.support.v4.widget.AutoScrollHelper setRelativeEdges(float, float);
-    method public android.support.v4.widget.AutoScrollHelper setRelativeVelocity(float, float);
-    field public static final int EDGE_TYPE_INSIDE = 0; // 0x0
-    field public static final int EDGE_TYPE_INSIDE_EXTEND = 1; // 0x1
-    field public static final int EDGE_TYPE_OUTSIDE = 2; // 0x2
-    field public static final float NO_MAX = 3.4028235E38f;
-    field public static final float NO_MIN = 0.0f;
-    field public static final float RELATIVE_UNSPECIFIED = 0.0f;
-  }
-
-  public class ContentLoadingProgressBar extends android.widget.ProgressBar {
-    ctor public ContentLoadingProgressBar(android.content.Context);
-    ctor public ContentLoadingProgressBar(android.content.Context, android.util.AttributeSet);
-    method public void hide();
-    method public void onAttachedToWindow();
-    method public void onDetachedFromWindow();
-    method public void show();
-  }
-
-  public abstract class CursorAdapter extends android.widget.BaseAdapter {
-    ctor public deprecated CursorAdapter(android.content.Context, android.database.Cursor);
-    ctor public CursorAdapter(android.content.Context, android.database.Cursor, boolean);
-    ctor public CursorAdapter(android.content.Context, android.database.Cursor, int);
-    method public abstract void bindView(android.view.View, android.content.Context, android.database.Cursor);
-    method public void changeCursor(android.database.Cursor);
-    method public java.lang.CharSequence convertToString(android.database.Cursor);
-    method public int getCount();
-    method public android.database.Cursor getCursor();
-    method public android.widget.Filter getFilter();
-    method public android.widget.FilterQueryProvider getFilterQueryProvider();
-    method public java.lang.Object getItem(int);
-    method public long getItemId(int);
-    method public android.view.View getView(int, android.view.View, android.view.ViewGroup);
-    method protected deprecated void init(android.content.Context, android.database.Cursor, boolean);
-    method public android.view.View newDropDownView(android.content.Context, android.database.Cursor, android.view.ViewGroup);
-    method public abstract android.view.View newView(android.content.Context, android.database.Cursor, android.view.ViewGroup);
-    method protected void onContentChanged();
-    method public android.database.Cursor runQueryOnBackgroundThread(java.lang.CharSequence);
-    method public void setFilterQueryProvider(android.widget.FilterQueryProvider);
-    method public android.database.Cursor swapCursor(android.database.Cursor);
-    field public static final deprecated int FLAG_AUTO_REQUERY = 1; // 0x1
-    field public static final int FLAG_REGISTER_CONTENT_OBSERVER = 2; // 0x2
-  }
-
-  public class DrawerLayout extends android.view.ViewGroup {
-    ctor public DrawerLayout(android.content.Context);
-    ctor public DrawerLayout(android.content.Context, android.util.AttributeSet);
-    ctor public DrawerLayout(android.content.Context, android.util.AttributeSet, int);
-    method public void closeDrawer(android.view.View);
-    method public void closeDrawer(int);
-    method public void closeDrawers();
-    method public int getDrawerLockMode(int);
-    method public int getDrawerLockMode(android.view.View);
-    method public java.lang.CharSequence getDrawerTitle(int);
-    method public android.graphics.drawable.Drawable getStatusBarBackgroundDrawable();
-    method public boolean isDrawerOpen(android.view.View);
-    method public boolean isDrawerOpen(int);
-    method public boolean isDrawerVisible(android.view.View);
-    method public boolean isDrawerVisible(int);
-    method public void onDraw(android.graphics.Canvas);
-    method protected void onLayout(boolean, int, int, int, int);
-    method public void openDrawer(android.view.View);
-    method public void openDrawer(int);
-    method public void setDrawerListener(android.support.v4.widget.DrawerLayout.DrawerListener);
-    method public void setDrawerLockMode(int);
-    method public void setDrawerLockMode(int, int);
-    method public void setDrawerLockMode(int, android.view.View);
-    method public void setDrawerShadow(android.graphics.drawable.Drawable, int);
-    method public void setDrawerShadow(int, int);
-    method public void setDrawerTitle(int, java.lang.CharSequence);
-    method public void setScrimColor(int);
-    method public void setStatusBarBackground(android.graphics.drawable.Drawable);
-    method public void setStatusBarBackground(int);
-    method public void setStatusBarBackgroundColor(int);
-    field public static final int LOCK_MODE_LOCKED_CLOSED = 1; // 0x1
-    field public static final int LOCK_MODE_LOCKED_OPEN = 2; // 0x2
-    field public static final int LOCK_MODE_UNLOCKED = 0; // 0x0
-    field public static final int STATE_DRAGGING = 1; // 0x1
-    field public static final int STATE_IDLE = 0; // 0x0
-    field public static final int STATE_SETTLING = 2; // 0x2
-  }
-
-  public static abstract interface DrawerLayout.DrawerListener {
-    method public abstract void onDrawerClosed(android.view.View);
-    method public abstract void onDrawerOpened(android.view.View);
-    method public abstract void onDrawerSlide(android.view.View, float);
-    method public abstract void onDrawerStateChanged(int);
-  }
-
-  public static class DrawerLayout.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
-    ctor public DrawerLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public DrawerLayout.LayoutParams(int, int);
-    ctor public DrawerLayout.LayoutParams(int, int, int);
-    ctor public DrawerLayout.LayoutParams(android.support.v4.widget.DrawerLayout.LayoutParams);
-    ctor public DrawerLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public DrawerLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    field public int gravity;
-  }
-
-  protected static class DrawerLayout.SavedState extends android.view.View.BaseSavedState {
-    ctor public DrawerLayout.SavedState(android.os.Parcel);
-    ctor public DrawerLayout.SavedState(android.os.Parcelable);
-    field public static final android.os.Parcelable.Creator<android.support.v4.widget.DrawerLayout.SavedState> CREATOR;
-  }
-
-  public static abstract class DrawerLayout.SimpleDrawerListener implements android.support.v4.widget.DrawerLayout.DrawerListener {
-    ctor public DrawerLayout.SimpleDrawerListener();
-    method public void onDrawerClosed(android.view.View);
-    method public void onDrawerOpened(android.view.View);
-    method public void onDrawerSlide(android.view.View, float);
-    method public void onDrawerStateChanged(int);
-  }
-
-  public class EdgeEffectCompat {
-    ctor public EdgeEffectCompat(android.content.Context);
-    method public boolean draw(android.graphics.Canvas);
-    method public void finish();
-    method public boolean isFinished();
-    method public boolean onAbsorb(int);
-    method public deprecated boolean onPull(float);
-    method public boolean onPull(float, float);
-    method public boolean onRelease();
-    method public void setSize(int, int);
-  }
-
-  public abstract class ExploreByTouchHelper extends android.support.v4.view.AccessibilityDelegateCompat {
-    ctor public ExploreByTouchHelper(android.view.View);
-    method public boolean dispatchHoverEvent(android.view.MotionEvent);
-    method public int getFocusedVirtualView();
-    method protected abstract int getVirtualViewAt(float, float);
-    method protected abstract void getVisibleVirtualViews(java.util.List<java.lang.Integer>);
-    method public void invalidateRoot();
-    method public void invalidateVirtualView(int);
-    method protected abstract boolean onPerformActionForVirtualView(int, int, android.os.Bundle);
-    method protected abstract void onPopulateEventForVirtualView(int, android.view.accessibility.AccessibilityEvent);
-    method protected abstract void onPopulateNodeForVirtualView(int, android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
-    method public boolean sendEventForVirtualView(int, int);
-    field public static final int INVALID_ID = -2147483648; // 0x80000000
-  }
-
-  public class ListPopupWindowCompat {
-    method public static android.view.View.OnTouchListener createDragToOpenListener(java.lang.Object, android.view.View);
-  }
-
-  public class ListViewAutoScrollHelper extends android.support.v4.widget.AutoScrollHelper {
-    ctor public ListViewAutoScrollHelper(android.widget.ListView);
-    method public boolean canTargetScrollHorizontally(int);
-    method public boolean canTargetScrollVertically(int);
-    method public void scrollTargetBy(int, int);
-  }
-
-  public class NestedScrollView extends android.widget.FrameLayout implements android.support.v4.view.NestedScrollingChild android.support.v4.view.NestedScrollingParent {
-    ctor public NestedScrollView(android.content.Context);
-    ctor public NestedScrollView(android.content.Context, android.util.AttributeSet);
-    ctor public NestedScrollView(android.content.Context, android.util.AttributeSet, int);
-    method public boolean arrowScroll(int);
-    method protected int computeScrollDeltaToGetChildRectOnScreen(android.graphics.Rect);
-    method public boolean executeKeyEvent(android.view.KeyEvent);
-    method public void fling(int);
-    method public boolean fullScroll(int);
-    method public int getMaxScrollAmount();
-    method public boolean isFillViewport();
-    method public boolean isSmoothScrollingEnabled();
-    method public void onAttachedToWindow();
-    method public boolean pageScroll(int);
-    method public void setFillViewport(boolean);
-    method public void setSmoothScrollingEnabled(boolean);
-    method public final void smoothScrollBy(int, int);
-    method public final void smoothScrollTo(int, int);
-  }
-
-  public class PopupMenuCompat {
-    method public static android.view.View.OnTouchListener getDragToOpenListener(java.lang.Object);
-  }
-
-  public class PopupWindowCompat {
-    method public static void showAsDropDown(android.widget.PopupWindow, android.view.View, int, int, int);
-  }
-
-  public abstract class ResourceCursorAdapter extends android.support.v4.widget.CursorAdapter {
-    ctor public deprecated ResourceCursorAdapter(android.content.Context, int, android.database.Cursor);
-    ctor public ResourceCursorAdapter(android.content.Context, int, android.database.Cursor, boolean);
-    ctor public ResourceCursorAdapter(android.content.Context, int, android.database.Cursor, int);
-    method public android.view.View newView(android.content.Context, android.database.Cursor, android.view.ViewGroup);
-    method public void setDropDownViewResource(int);
-    method public void setViewResource(int);
-  }
-
-  public class ScrollerCompat {
-    method public void abortAnimation();
-    method public boolean computeScrollOffset();
-    method public static android.support.v4.widget.ScrollerCompat create(android.content.Context);
-    method public static android.support.v4.widget.ScrollerCompat create(android.content.Context, android.view.animation.Interpolator);
-    method public void fling(int, int, int, int, int, int, int, int);
-    method public void fling(int, int, int, int, int, int, int, int, int, int);
-    method public float getCurrVelocity();
-    method public int getCurrX();
-    method public int getCurrY();
-    method public int getFinalX();
-    method public int getFinalY();
-    method public boolean isFinished();
-    method public boolean isOverScrolled();
-    method public void notifyHorizontalEdgeReached(int, int, int);
-    method public void notifyVerticalEdgeReached(int, int, int);
-    method public void startScroll(int, int, int, int);
-    method public void startScroll(int, int, int, int, int);
-  }
-
-  public class SearchViewCompat {
-    method public static java.lang.CharSequence getQuery(android.view.View);
-    method public static boolean isIconified(android.view.View);
-    method public static boolean isQueryRefinementEnabled(android.view.View);
-    method public static boolean isSubmitButtonEnabled(android.view.View);
-    method public static android.view.View newSearchView(android.content.Context);
-    method public static void setIconified(android.view.View, boolean);
-    method public static void setImeOptions(android.view.View, int);
-    method public static void setInputType(android.view.View, int);
-    method public static void setMaxWidth(android.view.View, int);
-    method public static void setOnCloseListener(android.view.View, android.support.v4.widget.SearchViewCompat.OnCloseListenerCompat);
-    method public static void setOnQueryTextListener(android.view.View, android.support.v4.widget.SearchViewCompat.OnQueryTextListenerCompat);
-    method public static void setQuery(android.view.View, java.lang.CharSequence, boolean);
-    method public static void setQueryHint(android.view.View, java.lang.CharSequence);
-    method public static void setQueryRefinementEnabled(android.view.View, boolean);
-    method public static void setSearchableInfo(android.view.View, android.content.ComponentName);
-    method public static void setSubmitButtonEnabled(android.view.View, boolean);
-  }
-
-  public static abstract class SearchViewCompat.OnCloseListenerCompat {
-    ctor public SearchViewCompat.OnCloseListenerCompat();
-    method public boolean onClose();
-  }
-
-  public static abstract class SearchViewCompat.OnQueryTextListenerCompat {
-    ctor public SearchViewCompat.OnQueryTextListenerCompat();
-    method public boolean onQueryTextChange(java.lang.String);
-    method public boolean onQueryTextSubmit(java.lang.String);
-  }
-
-  public class SimpleCursorAdapter extends android.support.v4.widget.ResourceCursorAdapter {
-    ctor public deprecated SimpleCursorAdapter(android.content.Context, int, android.database.Cursor, java.lang.String[], int[]);
-    ctor public SimpleCursorAdapter(android.content.Context, int, android.database.Cursor, java.lang.String[], int[], int);
-    method public void bindView(android.view.View, android.content.Context, android.database.Cursor);
-    method public void changeCursorAndColumns(android.database.Cursor, java.lang.String[], int[]);
-    method public android.support.v4.widget.SimpleCursorAdapter.CursorToStringConverter getCursorToStringConverter();
-    method public int getStringConversionColumn();
-    method public android.support.v4.widget.SimpleCursorAdapter.ViewBinder getViewBinder();
-    method public void setCursorToStringConverter(android.support.v4.widget.SimpleCursorAdapter.CursorToStringConverter);
-    method public void setStringConversionColumn(int);
-    method public void setViewBinder(android.support.v4.widget.SimpleCursorAdapter.ViewBinder);
-    method public void setViewImage(android.widget.ImageView, java.lang.String);
-    method public void setViewText(android.widget.TextView, java.lang.String);
-  }
-
-  public static abstract interface SimpleCursorAdapter.CursorToStringConverter {
-    method public abstract java.lang.CharSequence convertToString(android.database.Cursor);
-  }
-
-  public static abstract interface SimpleCursorAdapter.ViewBinder {
-    method public abstract boolean setViewValue(android.view.View, android.database.Cursor, int);
-  }
-
-  public class SlidingPaneLayout extends android.view.ViewGroup {
-    ctor public SlidingPaneLayout(android.content.Context);
-    ctor public SlidingPaneLayout(android.content.Context, android.util.AttributeSet);
-    ctor public SlidingPaneLayout(android.content.Context, android.util.AttributeSet, int);
-    method protected boolean canScroll(android.view.View, boolean, int, int, int);
-    method public deprecated boolean canSlide();
-    method public boolean closePane();
-    method public int getCoveredFadeColor();
-    method public int getParallaxDistance();
-    method public int getSliderFadeColor();
-    method public boolean isOpen();
-    method public boolean isSlideable();
-    method protected void onLayout(boolean, int, int, int, int);
-    method public boolean openPane();
-    method public void setCoveredFadeColor(int);
-    method public void setPanelSlideListener(android.support.v4.widget.SlidingPaneLayout.PanelSlideListener);
-    method public void setParallaxDistance(int);
-    method public deprecated void setShadowDrawable(android.graphics.drawable.Drawable);
-    method public void setShadowDrawableLeft(android.graphics.drawable.Drawable);
-    method public void setShadowDrawableRight(android.graphics.drawable.Drawable);
-    method public deprecated void setShadowResource(int);
-    method public void setShadowResourceLeft(int);
-    method public void setShadowResourceRight(int);
-    method public void setSliderFadeColor(int);
-    method public deprecated void smoothSlideClosed();
-    method public deprecated void smoothSlideOpen();
-  }
-
-  public static class SlidingPaneLayout.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
-    ctor public SlidingPaneLayout.LayoutParams();
-    ctor public SlidingPaneLayout.LayoutParams(int, int);
-    ctor public SlidingPaneLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public SlidingPaneLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public SlidingPaneLayout.LayoutParams(android.support.v4.widget.SlidingPaneLayout.LayoutParams);
-    ctor public SlidingPaneLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
-    field public float weight;
-  }
-
-  public static abstract interface SlidingPaneLayout.PanelSlideListener {
-    method public abstract void onPanelClosed(android.view.View);
-    method public abstract void onPanelOpened(android.view.View);
-    method public abstract void onPanelSlide(android.view.View, float);
-  }
-
-  public static class SlidingPaneLayout.SimplePanelSlideListener implements android.support.v4.widget.SlidingPaneLayout.PanelSlideListener {
-    ctor public SlidingPaneLayout.SimplePanelSlideListener();
-    method public void onPanelClosed(android.view.View);
-    method public void onPanelOpened(android.view.View);
-    method public void onPanelSlide(android.view.View, float);
-  }
-
-  public class Space extends android.view.View {
-    ctor public Space(android.content.Context, android.util.AttributeSet, int);
-    ctor public Space(android.content.Context, android.util.AttributeSet);
-    ctor public Space(android.content.Context);
-  }
-
-  public class SwipeRefreshLayout extends android.view.ViewGroup {
-    ctor public SwipeRefreshLayout(android.content.Context);
-    ctor public SwipeRefreshLayout(android.content.Context, android.util.AttributeSet);
-    method public boolean canChildScrollUp();
-    method public int getProgressCircleDiameter();
-    method public boolean isRefreshing();
-    method protected void onLayout(boolean, int, int, int, int);
-    method public void onMeasure(int, int);
-    method public deprecated void setColorScheme(int...);
-    method public void setColorSchemeColors(int...);
-    method public void setColorSchemeResources(int...);
-    method public void setDistanceToTriggerSync(int);
-    method public void setOnRefreshListener(android.support.v4.widget.SwipeRefreshLayout.OnRefreshListener);
-    method public deprecated void setProgressBackgroundColor(int);
-    method public void setProgressBackgroundColorSchemeColor(int);
-    method public void setProgressBackgroundColorSchemeResource(int);
-    method public void setProgressViewEndTarget(boolean, int);
-    method public void setProgressViewOffset(boolean, int, int);
-    method public void setRefreshing(boolean);
-    method public void setSize(int);
-    field public static final int DEFAULT = 1; // 0x1
-    field public static final int LARGE = 0; // 0x0
-    field protected int mFrom;
-    field protected int mOriginalOffsetTop;
-  }
-
-  public static abstract interface SwipeRefreshLayout.OnRefreshListener {
-    method public abstract void onRefresh();
-  }
-
-  public class TextViewCompat {
-    method public static void setCompoundDrawablesRelative(android.widget.TextView, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable);
-    method public static void setCompoundDrawablesRelativeWithIntrinsicBounds(android.widget.TextView, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable);
-    method public static void setCompoundDrawablesRelativeWithIntrinsicBounds(android.widget.TextView, int, int, int, int);
-  }
-
-  public class ViewDragHelper {
-    method public void abort();
-    method protected boolean canScroll(android.view.View, boolean, int, int, int, int);
-    method public void cancel();
-    method public void captureChildView(android.view.View, int);
-    method public boolean checkTouchSlop(int);
-    method public boolean checkTouchSlop(int, int);
-    method public boolean continueSettling(boolean);
-    method public static android.support.v4.widget.ViewDragHelper create(android.view.ViewGroup, android.support.v4.widget.ViewDragHelper.Callback);
-    method public static android.support.v4.widget.ViewDragHelper create(android.view.ViewGroup, float, android.support.v4.widget.ViewDragHelper.Callback);
-    method public android.view.View findTopChildUnder(int, int);
-    method public void flingCapturedView(int, int, int, int);
-    method public int getActivePointerId();
-    method public android.view.View getCapturedView();
-    method public int getEdgeSize();
-    method public float getMinVelocity();
-    method public int getTouchSlop();
-    method public int getViewDragState();
-    method public boolean isCapturedViewUnder(int, int);
-    method public boolean isEdgeTouched(int);
-    method public boolean isEdgeTouched(int, int);
-    method public boolean isPointerDown(int);
-    method public boolean isViewUnder(android.view.View, int, int);
-    method public void processTouchEvent(android.view.MotionEvent);
-    method public void setEdgeTrackingEnabled(int);
-    method public void setMinVelocity(float);
-    method public boolean settleCapturedViewAt(int, int);
-    method public boolean shouldInterceptTouchEvent(android.view.MotionEvent);
-    method public boolean smoothSlideViewTo(android.view.View, int, int);
-    field public static final int DIRECTION_ALL = 3; // 0x3
-    field public static final int DIRECTION_HORIZONTAL = 1; // 0x1
-    field public static final int DIRECTION_VERTICAL = 2; // 0x2
-    field public static final int EDGE_ALL = 15; // 0xf
-    field public static final int EDGE_BOTTOM = 8; // 0x8
-    field public static final int EDGE_LEFT = 1; // 0x1
-    field public static final int EDGE_RIGHT = 2; // 0x2
-    field public static final int EDGE_TOP = 4; // 0x4
-    field public static final int INVALID_POINTER = -1; // 0xffffffff
-    field public static final int STATE_DRAGGING = 1; // 0x1
-    field public static final int STATE_IDLE = 0; // 0x0
-    field public static final int STATE_SETTLING = 2; // 0x2
-  }
-
-  public static abstract class ViewDragHelper.Callback {
-    ctor public ViewDragHelper.Callback();
-    method public int clampViewPositionHorizontal(android.view.View, int, int);
-    method public int clampViewPositionVertical(android.view.View, int, int);
-    method public int getOrderedChildIndex(int);
-    method public int getViewHorizontalDragRange(android.view.View);
-    method public int getViewVerticalDragRange(android.view.View);
-    method public void onEdgeDragStarted(int, int);
-    method public boolean onEdgeLock(int);
-    method public void onEdgeTouched(int, int);
-    method public void onViewCaptured(android.view.View, int);
-    method public void onViewDragStateChanged(int);
-    method public void onViewPositionChanged(android.view.View, int, int, int, int);
-    method public void onViewReleased(android.view.View, float, float);
-    method public abstract boolean tryCaptureView(android.view.View, int);
-  }
-
-}
-
diff --git a/v4/api/23.0.0.txt b/v4/api/23.0.0.txt
deleted file mode 100644
index 27d5993..0000000
--- a/v4/api/23.0.0.txt
+++ /dev/null
@@ -1,3480 +0,0 @@
-package android.support.v4.accessibilityservice {
-
-  public class AccessibilityServiceInfoCompat {
-    method public static java.lang.String capabilityToString(int);
-    method public static java.lang.String feedbackTypeToString(int);
-    method public static java.lang.String flagToString(int);
-    method public static boolean getCanRetrieveWindowContent(android.accessibilityservice.AccessibilityServiceInfo);
-    method public static int getCapabilities(android.accessibilityservice.AccessibilityServiceInfo);
-    method public static java.lang.String getDescription(android.accessibilityservice.AccessibilityServiceInfo);
-    method public static java.lang.String getId(android.accessibilityservice.AccessibilityServiceInfo);
-    method public static android.content.pm.ResolveInfo getResolveInfo(android.accessibilityservice.AccessibilityServiceInfo);
-    method public static java.lang.String getSettingsActivityName(android.accessibilityservice.AccessibilityServiceInfo);
-    field public static final int CAPABILITY_CAN_FILTER_KEY_EVENTS = 8; // 0x8
-    field public static final int CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 4; // 0x4
-    field public static final int CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION = 2; // 0x2
-    field public static final int CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT = 1; // 0x1
-    field public static final int DEFAULT = 1; // 0x1
-    field public static final int FEEDBACK_ALL_MASK = -1; // 0xffffffff
-    field public static final int FEEDBACK_BRAILLE = 32; // 0x20
-    field public static final int FLAG_INCLUDE_NOT_IMPORTANT_VIEWS = 2; // 0x2
-    field public static final int FLAG_REPORT_VIEW_IDS = 16; // 0x10
-    field public static final int FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 8; // 0x8
-    field public static final int FLAG_REQUEST_FILTER_KEY_EVENTS = 32; // 0x20
-    field public static final int FLAG_REQUEST_TOUCH_EXPLORATION_MODE = 4; // 0x4
-  }
-
-}
-
-package android.support.v4.animation {
-
-  public abstract class AnimatorCompatHelper {
-    method public static void clearInterpolator(android.view.View);
-    method public static android.support.v4.animation.ValueAnimatorCompat emptyValueAnimator();
-  }
-
-  public abstract interface AnimatorListenerCompat {
-    method public abstract void onAnimationCancel(android.support.v4.animation.ValueAnimatorCompat);
-    method public abstract void onAnimationEnd(android.support.v4.animation.ValueAnimatorCompat);
-    method public abstract void onAnimationRepeat(android.support.v4.animation.ValueAnimatorCompat);
-    method public abstract void onAnimationStart(android.support.v4.animation.ValueAnimatorCompat);
-  }
-
-  public abstract interface AnimatorUpdateListenerCompat {
-    method public abstract void onAnimationUpdate(android.support.v4.animation.ValueAnimatorCompat);
-  }
-
-  public abstract interface ValueAnimatorCompat {
-    method public abstract void addListener(android.support.v4.animation.AnimatorListenerCompat);
-    method public abstract void addUpdateListener(android.support.v4.animation.AnimatorUpdateListenerCompat);
-    method public abstract void cancel();
-    method public abstract float getAnimatedFraction();
-    method public abstract void setDuration(long);
-    method public abstract void setTarget(android.view.View);
-    method public abstract void start();
-  }
-
-}
-
-package android.support.v4.app {
-
-  public deprecated class ActionBarDrawerToggle implements android.support.v4.widget.DrawerLayout.DrawerListener {
-    ctor public ActionBarDrawerToggle(android.app.Activity, android.support.v4.widget.DrawerLayout, int, int, int);
-    ctor public ActionBarDrawerToggle(android.app.Activity, android.support.v4.widget.DrawerLayout, boolean, int, int, int);
-    method public boolean isDrawerIndicatorEnabled();
-    method public void onConfigurationChanged(android.content.res.Configuration);
-    method public void onDrawerClosed(android.view.View);
-    method public void onDrawerOpened(android.view.View);
-    method public void onDrawerSlide(android.view.View, float);
-    method public void onDrawerStateChanged(int);
-    method public boolean onOptionsItemSelected(android.view.MenuItem);
-    method public void setDrawerIndicatorEnabled(boolean);
-    method public void setHomeAsUpIndicator(android.graphics.drawable.Drawable);
-    method public void setHomeAsUpIndicator(int);
-    method public void syncState();
-  }
-
-  public static abstract interface ActionBarDrawerToggle.Delegate {
-    method public abstract android.graphics.drawable.Drawable getThemeUpIndicator();
-    method public abstract void setActionBarDescription(int);
-    method public abstract void setActionBarUpIndicator(android.graphics.drawable.Drawable, int);
-  }
-
-  public static abstract interface ActionBarDrawerToggle.DelegateProvider {
-    method public abstract android.support.v4.app.ActionBarDrawerToggle.Delegate getDrawerToggleDelegate();
-  }
-
-  public class ActivityCompat extends android.support.v4.content.ContextCompat {
-    ctor public ActivityCompat();
-    method public static void finishAffinity(android.app.Activity);
-    method public static void finishAfterTransition(android.app.Activity);
-    method public android.net.Uri getReferrer(android.app.Activity);
-    method public static boolean invalidateOptionsMenu(android.app.Activity);
-    method public static void postponeEnterTransition(android.app.Activity);
-    method public static void requestPermissions(android.app.Activity, java.lang.String[], int);
-    method public static void setEnterSharedElementCallback(android.app.Activity, android.support.v4.app.SharedElementCallback);
-    method public static void setExitSharedElementCallback(android.app.Activity, android.support.v4.app.SharedElementCallback);
-    method public static boolean shouldShowRequestPermissionRationale(android.app.Activity, java.lang.String);
-    method public static void startActivity(android.app.Activity, android.content.Intent, android.os.Bundle);
-    method public static void startActivityForResult(android.app.Activity, android.content.Intent, int, android.os.Bundle);
-    method public static void startPostponedEnterTransition(android.app.Activity);
-  }
-
-  public static abstract interface ActivityCompat.OnRequestPermissionsResultCallback {
-    method public abstract void onRequestPermissionsResult(int, java.lang.String[], int[]);
-  }
-
-  public final class ActivityManagerCompat {
-    method public static boolean isLowRamDevice(android.app.ActivityManager);
-  }
-
-  public class ActivityOptionsCompat {
-    ctor protected ActivityOptionsCompat();
-    method public static android.support.v4.app.ActivityOptionsCompat makeCustomAnimation(android.content.Context, int, int);
-    method public static android.support.v4.app.ActivityOptionsCompat makeScaleUpAnimation(android.view.View, int, int, int, int);
-    method public static android.support.v4.app.ActivityOptionsCompat makeSceneTransitionAnimation(android.app.Activity, android.view.View, java.lang.String);
-    method public static android.support.v4.app.ActivityOptionsCompat makeSceneTransitionAnimation(android.app.Activity, android.support.v4.util.Pair<android.view.View, java.lang.String>...);
-    method public static android.support.v4.app.ActivityOptionsCompat makeThumbnailScaleUpAnimation(android.view.View, android.graphics.Bitmap, int, int);
-    method public android.os.Bundle toBundle();
-    method public void update(android.support.v4.app.ActivityOptionsCompat);
-  }
-
-  public class AppOpsManagerCompat {
-    ctor public AppOpsManagerCompat();
-    method public static int noteOp(android.content.Context, java.lang.String, int, java.lang.String);
-    method public static int noteProxyOp(android.content.Context, java.lang.String, java.lang.String);
-    method public static java.lang.String permissionToOp(java.lang.String);
-    field public static final int MODE_ALLOWED = 0; // 0x0
-    field public static final int MODE_DEFAULT = 3; // 0x3
-    field public static final int MODE_IGNORED = 1; // 0x1
-  }
-
-   abstract class BaseFragmentActivityDonut extends android.app.Activity {
-  }
-
-   abstract class BaseFragmentActivityHoneycomb extends android.support.v4.app.BaseFragmentActivityDonut {
-  }
-
-  public class DialogFragment extends android.support.v4.app.Fragment implements android.content.DialogInterface.OnCancelListener android.content.DialogInterface.OnDismissListener {
-    ctor public DialogFragment();
-    method public void dismiss();
-    method public void dismissAllowingStateLoss();
-    method public android.app.Dialog getDialog();
-    method public boolean getShowsDialog();
-    method public int getTheme();
-    method public boolean isCancelable();
-    method public void onCancel(android.content.DialogInterface);
-    method public android.app.Dialog onCreateDialog(android.os.Bundle);
-    method public void onDismiss(android.content.DialogInterface);
-    method public void setCancelable(boolean);
-    method public void setShowsDialog(boolean);
-    method public void setStyle(int, int);
-    method public void show(android.support.v4.app.FragmentManager, java.lang.String);
-    method public int show(android.support.v4.app.FragmentTransaction, java.lang.String);
-    field public static final int STYLE_NORMAL = 0; // 0x0
-    field public static final int STYLE_NO_FRAME = 2; // 0x2
-    field public static final int STYLE_NO_INPUT = 3; // 0x3
-    field public static final int STYLE_NO_TITLE = 1; // 0x1
-  }
-
-  public class Fragment implements android.content.ComponentCallbacks android.view.View.OnCreateContextMenuListener {
-    ctor public Fragment();
-    method public void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
-    method public final boolean equals(java.lang.Object);
-    method public final android.support.v4.app.FragmentActivity getActivity();
-    method public boolean getAllowEnterTransitionOverlap();
-    method public boolean getAllowReturnTransitionOverlap();
-    method public final android.os.Bundle getArguments();
-    method public final android.support.v4.app.FragmentManager getChildFragmentManager();
-    method public android.content.Context getContext();
-    method public java.lang.Object getEnterTransition();
-    method public java.lang.Object getExitTransition();
-    method public final android.support.v4.app.FragmentManager getFragmentManager();
-    method public final java.lang.Object getHost();
-    method public final int getId();
-    method public android.support.v4.app.LoaderManager getLoaderManager();
-    method public final android.support.v4.app.Fragment getParentFragment();
-    method public java.lang.Object getReenterTransition();
-    method public final android.content.res.Resources getResources();
-    method public final boolean getRetainInstance();
-    method public java.lang.Object getReturnTransition();
-    method public java.lang.Object getSharedElementEnterTransition();
-    method public java.lang.Object getSharedElementReturnTransition();
-    method public final java.lang.String getString(int);
-    method public final java.lang.String getString(int, java.lang.Object...);
-    method public final java.lang.String getTag();
-    method public final android.support.v4.app.Fragment getTargetFragment();
-    method public final int getTargetRequestCode();
-    method public final java.lang.CharSequence getText(int);
-    method public boolean getUserVisibleHint();
-    method public android.view.View getView();
-    method public final int hashCode();
-    method public static android.support.v4.app.Fragment instantiate(android.content.Context, java.lang.String);
-    method public static android.support.v4.app.Fragment instantiate(android.content.Context, java.lang.String, android.os.Bundle);
-    method public final boolean isAdded();
-    method public final boolean isDetached();
-    method public final boolean isHidden();
-    method public final boolean isInLayout();
-    method public final boolean isRemoving();
-    method public final boolean isResumed();
-    method public final boolean isVisible();
-    method public void onActivityCreated(android.os.Bundle);
-    method public void onActivityResult(int, int, android.content.Intent);
-    method public void onAttach(android.content.Context);
-    method public deprecated void onAttach(android.app.Activity);
-    method public void onConfigurationChanged(android.content.res.Configuration);
-    method public boolean onContextItemSelected(android.view.MenuItem);
-    method public void onCreate(android.os.Bundle);
-    method public android.view.animation.Animation onCreateAnimation(int, boolean, int);
-    method public void onCreateContextMenu(android.view.ContextMenu, android.view.View, android.view.ContextMenu.ContextMenuInfo);
-    method public void onCreateOptionsMenu(android.view.Menu, android.view.MenuInflater);
-    method public android.view.View onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
-    method public void onDestroy();
-    method public void onDestroyOptionsMenu();
-    method public void onDestroyView();
-    method public void onDetach();
-    method public void onHiddenChanged(boolean);
-    method public void onInflate(android.content.Context, android.util.AttributeSet, android.os.Bundle);
-    method public deprecated void onInflate(android.app.Activity, android.util.AttributeSet, android.os.Bundle);
-    method public void onLowMemory();
-    method public boolean onOptionsItemSelected(android.view.MenuItem);
-    method public void onOptionsMenuClosed(android.view.Menu);
-    method public void onPause();
-    method public void onPrepareOptionsMenu(android.view.Menu);
-    method public void onRequestPermissionsResult(int, java.lang.String[], int[]);
-    method public void onResume();
-    method public void onSaveInstanceState(android.os.Bundle);
-    method public void onStart();
-    method public void onStop();
-    method public void onViewCreated(android.view.View, android.os.Bundle);
-    method public void onViewStateRestored(android.os.Bundle);
-    method public void registerForContextMenu(android.view.View);
-    method public final void requestPermissions(java.lang.String[], int);
-    method public void setAllowEnterTransitionOverlap(boolean);
-    method public void setAllowReturnTransitionOverlap(boolean);
-    method public void setArguments(android.os.Bundle);
-    method public void setEnterSharedElementCallback(android.support.v4.app.SharedElementCallback);
-    method public void setEnterTransition(java.lang.Object);
-    method public void setExitSharedElementCallback(android.support.v4.app.SharedElementCallback);
-    method public void setExitTransition(java.lang.Object);
-    method public void setHasOptionsMenu(boolean);
-    method public void setInitialSavedState(android.support.v4.app.Fragment.SavedState);
-    method public void setMenuVisibility(boolean);
-    method public void setReenterTransition(java.lang.Object);
-    method public void setRetainInstance(boolean);
-    method public void setReturnTransition(java.lang.Object);
-    method public void setSharedElementEnterTransition(java.lang.Object);
-    method public void setSharedElementReturnTransition(java.lang.Object);
-    method public void setTargetFragment(android.support.v4.app.Fragment, int);
-    method public void setUserVisibleHint(boolean);
-    method public boolean shouldShowRequestPermissionRationale(java.lang.String);
-    method public void startActivity(android.content.Intent);
-    method public void startActivityForResult(android.content.Intent, int);
-    method public void unregisterForContextMenu(android.view.View);
-  }
-
-  public static class Fragment.InstantiationException extends java.lang.RuntimeException {
-    ctor public Fragment.InstantiationException(java.lang.String, java.lang.Exception);
-  }
-
-  public static class Fragment.SavedState implements android.os.Parcelable {
-    method public int describeContents();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.support.v4.app.Fragment.SavedState> CREATOR;
-  }
-
-  public class FragmentActivity extends android.support.v4.app.BaseFragmentActivityHoneycomb implements android.support.v4.app.ActivityCompat.OnRequestPermissionsResultCallback {
-    ctor public FragmentActivity();
-    method public java.lang.Object getLastCustomNonConfigurationInstance();
-    method public android.support.v4.app.FragmentManager getSupportFragmentManager();
-    method public android.support.v4.app.LoaderManager getSupportLoaderManager();
-    method public void onAttachFragment(android.support.v4.app.Fragment);
-    method protected void onResumeFragments();
-    method public java.lang.Object onRetainCustomNonConfigurationInstance();
-    method public final java.lang.Object onRetainNonConfigurationInstance();
-    method public void setEnterSharedElementCallback(android.support.v4.app.SharedElementCallback);
-    method public void setExitSharedElementCallback(android.support.v4.app.SharedElementCallback);
-    method public void startActivityFromFragment(android.support.v4.app.Fragment, android.content.Intent, int);
-    method public void supportFinishAfterTransition();
-    method public void supportInvalidateOptionsMenu();
-    method public void supportPostponeEnterTransition();
-    method public void supportStartPostponedEnterTransition();
-    method public final void validateRequestPermissionsRequestCode(int);
-  }
-
-  public abstract class FragmentContainer {
-    ctor public FragmentContainer();
-    method public abstract android.view.View onFindViewById(int);
-    method public abstract boolean onHasView();
-  }
-
-  public class FragmentController {
-    method public void attachHost(android.support.v4.app.Fragment);
-    method public static final android.support.v4.app.FragmentController createController(android.support.v4.app.FragmentHostCallback<?>);
-    method public void dispatchActivityCreated();
-    method public void dispatchConfigurationChanged(android.content.res.Configuration);
-    method public boolean dispatchContextItemSelected(android.view.MenuItem);
-    method public void dispatchCreate();
-    method public boolean dispatchCreateOptionsMenu(android.view.Menu, android.view.MenuInflater);
-    method public void dispatchDestroy();
-    method public void dispatchDestroyView();
-    method public void dispatchLowMemory();
-    method public boolean dispatchOptionsItemSelected(android.view.MenuItem);
-    method public void dispatchOptionsMenuClosed(android.view.Menu);
-    method public void dispatchPause();
-    method public boolean dispatchPrepareOptionsMenu(android.view.Menu);
-    method public void dispatchReallyStop();
-    method public void dispatchResume();
-    method public void dispatchStart();
-    method public void dispatchStop();
-    method public void doLoaderDestroy();
-    method public void doLoaderRetain();
-    method public void doLoaderStart();
-    method public void doLoaderStop(boolean);
-    method public void dumpLoaders(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
-    method public boolean execPendingActions();
-    method public java.util.List<android.support.v4.app.Fragment> getActiveFragments(java.util.List<android.support.v4.app.Fragment>);
-    method public int getActiveFragmentsCount();
-    method public android.support.v4.app.FragmentManager getSupportFragmentManager();
-    method public android.support.v4.app.LoaderManager getSupportLoaderManager();
-    method public void noteStateNotSaved();
-    method public android.view.View onCreateView(android.view.View, java.lang.String, android.content.Context, android.util.AttributeSet);
-    method public void reportLoaderStart();
-    method public void restoreAllState(android.os.Parcelable, java.util.List<android.support.v4.app.Fragment>);
-    method public void restoreLoaderNonConfig(android.support.v4.util.SimpleArrayMap<java.lang.String, android.support.v4.app.LoaderManager>);
-    method public android.support.v4.util.SimpleArrayMap<java.lang.String, android.support.v4.app.LoaderManager> retainLoaderNonConfig();
-    method public java.util.List<android.support.v4.app.Fragment> retainNonConfig();
-    method public android.os.Parcelable saveAllState();
-  }
-
-  public abstract class FragmentHostCallback extends android.support.v4.app.FragmentContainer {
-    ctor public FragmentHostCallback(android.content.Context, android.os.Handler, int);
-    method public void onDump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
-    method public android.view.View onFindViewById(int);
-    method public abstract E onGetHost();
-    method public android.view.LayoutInflater onGetLayoutInflater();
-    method public int onGetWindowAnimations();
-    method public boolean onHasView();
-    method public boolean onHasWindowAnimations();
-    method public void onRequestPermissionsFromFragment(android.support.v4.app.Fragment, java.lang.String[], int);
-    method public boolean onShouldSaveFragmentState(android.support.v4.app.Fragment);
-    method public boolean onShouldShowRequestPermissionRationale(java.lang.String);
-    method public void onStartActivityFromFragment(android.support.v4.app.Fragment, android.content.Intent, int);
-    method public void onSupportInvalidateOptionsMenu();
-  }
-
-  public abstract class FragmentManager {
-    ctor public FragmentManager();
-    method public abstract void addOnBackStackChangedListener(android.support.v4.app.FragmentManager.OnBackStackChangedListener);
-    method public abstract android.support.v4.app.FragmentTransaction beginTransaction();
-    method public abstract void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
-    method public static void enableDebugLogging(boolean);
-    method public abstract boolean executePendingTransactions();
-    method public abstract android.support.v4.app.Fragment findFragmentById(int);
-    method public abstract android.support.v4.app.Fragment findFragmentByTag(java.lang.String);
-    method public abstract android.support.v4.app.FragmentManager.BackStackEntry getBackStackEntryAt(int);
-    method public abstract int getBackStackEntryCount();
-    method public abstract android.support.v4.app.Fragment getFragment(android.os.Bundle, java.lang.String);
-    method public abstract boolean isDestroyed();
-    method public abstract void popBackStack();
-    method public abstract void popBackStack(java.lang.String, int);
-    method public abstract void popBackStack(int, int);
-    method public abstract boolean popBackStackImmediate();
-    method public abstract boolean popBackStackImmediate(java.lang.String, int);
-    method public abstract boolean popBackStackImmediate(int, int);
-    method public abstract void putFragment(android.os.Bundle, java.lang.String, android.support.v4.app.Fragment);
-    method public abstract void removeOnBackStackChangedListener(android.support.v4.app.FragmentManager.OnBackStackChangedListener);
-    method public abstract android.support.v4.app.Fragment.SavedState saveFragmentInstanceState(android.support.v4.app.Fragment);
-    field public static final int POP_BACK_STACK_INCLUSIVE = 1; // 0x1
-  }
-
-  public static abstract interface FragmentManager.BackStackEntry {
-    method public abstract java.lang.CharSequence getBreadCrumbShortTitle();
-    method public abstract int getBreadCrumbShortTitleRes();
-    method public abstract java.lang.CharSequence getBreadCrumbTitle();
-    method public abstract int getBreadCrumbTitleRes();
-    method public abstract int getId();
-    method public abstract java.lang.String getName();
-  }
-
-  public static abstract interface FragmentManager.OnBackStackChangedListener {
-    method public abstract void onBackStackChanged();
-  }
-
-  public abstract class FragmentPagerAdapter extends android.support.v4.view.PagerAdapter {
-    ctor public FragmentPagerAdapter(android.support.v4.app.FragmentManager);
-    method public abstract android.support.v4.app.Fragment getItem(int);
-    method public long getItemId(int);
-    method public boolean isViewFromObject(android.view.View, java.lang.Object);
-  }
-
-  public abstract class FragmentStatePagerAdapter extends android.support.v4.view.PagerAdapter {
-    ctor public FragmentStatePagerAdapter(android.support.v4.app.FragmentManager);
-    method public abstract android.support.v4.app.Fragment getItem(int);
-    method public boolean isViewFromObject(android.view.View, java.lang.Object);
-  }
-
-  public class FragmentTabHost extends android.widget.TabHost implements android.widget.TabHost.OnTabChangeListener {
-    ctor public FragmentTabHost(android.content.Context);
-    ctor public FragmentTabHost(android.content.Context, android.util.AttributeSet);
-    method public void addTab(android.widget.TabHost.TabSpec, java.lang.Class<?>, android.os.Bundle);
-    method public void onTabChanged(java.lang.String);
-    method public void setup(android.content.Context, android.support.v4.app.FragmentManager);
-    method public void setup(android.content.Context, android.support.v4.app.FragmentManager, int);
-  }
-
-  public abstract class FragmentTransaction {
-    ctor public FragmentTransaction();
-    method public abstract android.support.v4.app.FragmentTransaction add(android.support.v4.app.Fragment, java.lang.String);
-    method public abstract android.support.v4.app.FragmentTransaction add(int, android.support.v4.app.Fragment);
-    method public abstract android.support.v4.app.FragmentTransaction add(int, android.support.v4.app.Fragment, java.lang.String);
-    method public abstract android.support.v4.app.FragmentTransaction addSharedElement(android.view.View, java.lang.String);
-    method public abstract android.support.v4.app.FragmentTransaction addToBackStack(java.lang.String);
-    method public abstract android.support.v4.app.FragmentTransaction attach(android.support.v4.app.Fragment);
-    method public abstract int commit();
-    method public abstract int commitAllowingStateLoss();
-    method public abstract android.support.v4.app.FragmentTransaction detach(android.support.v4.app.Fragment);
-    method public abstract android.support.v4.app.FragmentTransaction disallowAddToBackStack();
-    method public abstract android.support.v4.app.FragmentTransaction hide(android.support.v4.app.Fragment);
-    method public abstract boolean isAddToBackStackAllowed();
-    method public abstract boolean isEmpty();
-    method public abstract android.support.v4.app.FragmentTransaction remove(android.support.v4.app.Fragment);
-    method public abstract android.support.v4.app.FragmentTransaction replace(int, android.support.v4.app.Fragment);
-    method public abstract android.support.v4.app.FragmentTransaction replace(int, android.support.v4.app.Fragment, java.lang.String);
-    method public abstract android.support.v4.app.FragmentTransaction setBreadCrumbShortTitle(int);
-    method public abstract android.support.v4.app.FragmentTransaction setBreadCrumbShortTitle(java.lang.CharSequence);
-    method public abstract android.support.v4.app.FragmentTransaction setBreadCrumbTitle(int);
-    method public abstract android.support.v4.app.FragmentTransaction setBreadCrumbTitle(java.lang.CharSequence);
-    method public abstract android.support.v4.app.FragmentTransaction setCustomAnimations(int, int);
-    method public abstract android.support.v4.app.FragmentTransaction setCustomAnimations(int, int, int, int);
-    method public abstract android.support.v4.app.FragmentTransaction setTransition(int);
-    method public abstract android.support.v4.app.FragmentTransaction setTransitionStyle(int);
-    method public abstract android.support.v4.app.FragmentTransaction show(android.support.v4.app.Fragment);
-    field public static final int TRANSIT_ENTER_MASK = 4096; // 0x1000
-    field public static final int TRANSIT_EXIT_MASK = 8192; // 0x2000
-    field public static final int TRANSIT_FRAGMENT_CLOSE = 8194; // 0x2002
-    field public static final int TRANSIT_FRAGMENT_FADE = 4099; // 0x1003
-    field public static final int TRANSIT_FRAGMENT_OPEN = 4097; // 0x1001
-    field public static final int TRANSIT_NONE = 0; // 0x0
-    field public static final int TRANSIT_UNSET = -1; // 0xffffffff
-  }
-
-  public class ListFragment extends android.support.v4.app.Fragment {
-    ctor public ListFragment();
-    method public android.widget.ListAdapter getListAdapter();
-    method public android.widget.ListView getListView();
-    method public long getSelectedItemId();
-    method public int getSelectedItemPosition();
-    method public void onListItemClick(android.widget.ListView, android.view.View, int, long);
-    method public void setEmptyText(java.lang.CharSequence);
-    method public void setListAdapter(android.widget.ListAdapter);
-    method public void setListShown(boolean);
-    method public void setListShownNoAnimation(boolean);
-    method public void setSelection(int);
-  }
-
-  public abstract class LoaderManager {
-    ctor public LoaderManager();
-    method public abstract void destroyLoader(int);
-    method public abstract void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
-    method public static void enableDebugLogging(boolean);
-    method public abstract android.support.v4.content.Loader<D> getLoader(int);
-    method public boolean hasRunningLoaders();
-    method public abstract android.support.v4.content.Loader<D> initLoader(int, android.os.Bundle, android.support.v4.app.LoaderManager.LoaderCallbacks<D>);
-    method public abstract android.support.v4.content.Loader<D> restartLoader(int, android.os.Bundle, android.support.v4.app.LoaderManager.LoaderCallbacks<D>);
-  }
-
-  public static abstract interface LoaderManager.LoaderCallbacks {
-    method public abstract android.support.v4.content.Loader<D> onCreateLoader(int, android.os.Bundle);
-    method public abstract void onLoadFinished(android.support.v4.content.Loader<D>, D);
-    method public abstract void onLoaderReset(android.support.v4.content.Loader<D>);
-  }
-
-  public class NavUtils {
-    method public static android.content.Intent getParentActivityIntent(android.app.Activity);
-    method public static android.content.Intent getParentActivityIntent(android.content.Context, java.lang.Class<?>) throws android.content.pm.PackageManager.NameNotFoundException;
-    method public static android.content.Intent getParentActivityIntent(android.content.Context, android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
-    method public static java.lang.String getParentActivityName(android.app.Activity);
-    method public static java.lang.String getParentActivityName(android.content.Context, android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
-    method public static void navigateUpFromSameTask(android.app.Activity);
-    method public static void navigateUpTo(android.app.Activity, android.content.Intent);
-    method public static boolean shouldUpRecreateTask(android.app.Activity, android.content.Intent);
-    field public static final java.lang.String PARENT_ACTIVITY = "android.support.PARENT_ACTIVITY";
-  }
-
-  public class NotificationCompat {
-    ctor public NotificationCompat();
-    method public static android.support.v4.app.NotificationCompat.Action getAction(android.app.Notification, int);
-    method public static int getActionCount(android.app.Notification);
-    method public static java.lang.String getCategory(android.app.Notification);
-    method public static android.os.Bundle getExtras(android.app.Notification);
-    method public static java.lang.String getGroup(android.app.Notification);
-    method public static boolean getLocalOnly(android.app.Notification);
-    method public static java.lang.String getSortKey(android.app.Notification);
-    method public static boolean isGroupSummary(android.app.Notification);
-    field public static final java.lang.String CATEGORY_ALARM = "alarm";
-    field public static final java.lang.String CATEGORY_CALL = "call";
-    field public static final java.lang.String CATEGORY_EMAIL = "email";
-    field public static final java.lang.String CATEGORY_ERROR = "err";
-    field public static final java.lang.String CATEGORY_EVENT = "event";
-    field public static final java.lang.String CATEGORY_MESSAGE = "msg";
-    field public static final java.lang.String CATEGORY_PROGRESS = "progress";
-    field public static final java.lang.String CATEGORY_PROMO = "promo";
-    field public static final java.lang.String CATEGORY_RECOMMENDATION = "recommendation";
-    field public static final java.lang.String CATEGORY_SERVICE = "service";
-    field public static final java.lang.String CATEGORY_SOCIAL = "social";
-    field public static final java.lang.String CATEGORY_STATUS = "status";
-    field public static final java.lang.String CATEGORY_SYSTEM = "sys";
-    field public static final java.lang.String CATEGORY_TRANSPORT = "transport";
-    field public static final int COLOR_DEFAULT = 0; // 0x0
-    field public static final int DEFAULT_ALL = -1; // 0xffffffff
-    field public static final int DEFAULT_LIGHTS = 4; // 0x4
-    field public static final int DEFAULT_SOUND = 1; // 0x1
-    field public static final int DEFAULT_VIBRATE = 2; // 0x2
-    field public static final java.lang.String EXTRA_BACKGROUND_IMAGE_URI = "android.backgroundImageUri";
-    field public static final java.lang.String EXTRA_BIG_TEXT = "android.bigText";
-    field public static final java.lang.String EXTRA_COMPACT_ACTIONS = "android.compactActions";
-    field public static final java.lang.String EXTRA_INFO_TEXT = "android.infoText";
-    field public static final java.lang.String EXTRA_LARGE_ICON = "android.largeIcon";
-    field public static final java.lang.String EXTRA_LARGE_ICON_BIG = "android.largeIcon.big";
-    field public static final java.lang.String EXTRA_MEDIA_SESSION = "android.mediaSession";
-    field public static final java.lang.String EXTRA_PEOPLE = "android.people";
-    field public static final java.lang.String EXTRA_PICTURE = "android.picture";
-    field public static final java.lang.String EXTRA_PROGRESS = "android.progress";
-    field public static final java.lang.String EXTRA_PROGRESS_INDETERMINATE = "android.progressIndeterminate";
-    field public static final java.lang.String EXTRA_PROGRESS_MAX = "android.progressMax";
-    field public static final java.lang.String EXTRA_SHOW_CHRONOMETER = "android.showChronometer";
-    field public static final java.lang.String EXTRA_SHOW_WHEN = "android.showWhen";
-    field public static final java.lang.String EXTRA_SMALL_ICON = "android.icon";
-    field public static final java.lang.String EXTRA_SUB_TEXT = "android.subText";
-    field public static final java.lang.String EXTRA_SUMMARY_TEXT = "android.summaryText";
-    field public static final java.lang.String EXTRA_TEMPLATE = "android.template";
-    field public static final java.lang.String EXTRA_TEXT = "android.text";
-    field public static final java.lang.String EXTRA_TEXT_LINES = "android.textLines";
-    field public static final java.lang.String EXTRA_TITLE = "android.title";
-    field public static final java.lang.String EXTRA_TITLE_BIG = "android.title.big";
-    field public static final int FLAG_AUTO_CANCEL = 16; // 0x10
-    field public static final int FLAG_FOREGROUND_SERVICE = 64; // 0x40
-    field public static final int FLAG_GROUP_SUMMARY = 512; // 0x200
-    field public static final deprecated int FLAG_HIGH_PRIORITY = 128; // 0x80
-    field public static final int FLAG_INSISTENT = 4; // 0x4
-    field public static final int FLAG_LOCAL_ONLY = 256; // 0x100
-    field public static final int FLAG_NO_CLEAR = 32; // 0x20
-    field public static final int FLAG_ONGOING_EVENT = 2; // 0x2
-    field public static final int FLAG_ONLY_ALERT_ONCE = 8; // 0x8
-    field public static final int FLAG_SHOW_LIGHTS = 1; // 0x1
-    field public static final int PRIORITY_DEFAULT = 0; // 0x0
-    field public static final int PRIORITY_HIGH = 1; // 0x1
-    field public static final int PRIORITY_LOW = -1; // 0xffffffff
-    field public static final int PRIORITY_MAX = 2; // 0x2
-    field public static final int PRIORITY_MIN = -2; // 0xfffffffe
-    field public static final int STREAM_DEFAULT = -1; // 0xffffffff
-    field public static final int VISIBILITY_PRIVATE = 0; // 0x0
-    field public static final int VISIBILITY_PUBLIC = 1; // 0x1
-    field public static final int VISIBILITY_SECRET = -1; // 0xffffffff
-  }
-
-  public static class NotificationCompat.Action extends android.support.v4.app.NotificationCompatBase.Action {
-    ctor public NotificationCompat.Action(int, java.lang.CharSequence, android.app.PendingIntent);
-    method public android.app.PendingIntent getActionIntent();
-    method public android.os.Bundle getExtras();
-    method public int getIcon();
-    method public android.support.v4.app.RemoteInput[] getRemoteInputs();
-    method public java.lang.CharSequence getTitle();
-    field public android.app.PendingIntent actionIntent;
-    field public int icon;
-    field public java.lang.CharSequence title;
-  }
-
-  public static final class NotificationCompat.Action.Builder {
-    ctor public NotificationCompat.Action.Builder(int, java.lang.CharSequence, android.app.PendingIntent);
-    ctor public NotificationCompat.Action.Builder(android.support.v4.app.NotificationCompat.Action);
-    method public android.support.v4.app.NotificationCompat.Action.Builder addExtras(android.os.Bundle);
-    method public android.support.v4.app.NotificationCompat.Action.Builder addRemoteInput(android.support.v4.app.RemoteInput);
-    method public android.support.v4.app.NotificationCompat.Action build();
-    method public android.support.v4.app.NotificationCompat.Action.Builder extend(android.support.v4.app.NotificationCompat.Action.Extender);
-    method public android.os.Bundle getExtras();
-  }
-
-  public static abstract interface NotificationCompat.Action.Extender {
-    method public abstract android.support.v4.app.NotificationCompat.Action.Builder extend(android.support.v4.app.NotificationCompat.Action.Builder);
-  }
-
-  public static final class NotificationCompat.Action.WearableExtender implements android.support.v4.app.NotificationCompat.Action.Extender {
-    ctor public NotificationCompat.Action.WearableExtender();
-    ctor public NotificationCompat.Action.WearableExtender(android.support.v4.app.NotificationCompat.Action);
-    method public android.support.v4.app.NotificationCompat.Action.WearableExtender clone();
-    method public android.support.v4.app.NotificationCompat.Action.Builder extend(android.support.v4.app.NotificationCompat.Action.Builder);
-    method public java.lang.CharSequence getCancelLabel();
-    method public java.lang.CharSequence getConfirmLabel();
-    method public java.lang.CharSequence getInProgressLabel();
-    method public boolean isAvailableOffline();
-    method public android.support.v4.app.NotificationCompat.Action.WearableExtender setAvailableOffline(boolean);
-    method public android.support.v4.app.NotificationCompat.Action.WearableExtender setCancelLabel(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.Action.WearableExtender setConfirmLabel(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.Action.WearableExtender setInProgressLabel(java.lang.CharSequence);
-  }
-
-  public static class NotificationCompat.BigPictureStyle extends android.support.v4.app.NotificationCompat.Style {
-    ctor public NotificationCompat.BigPictureStyle();
-    ctor public NotificationCompat.BigPictureStyle(android.support.v4.app.NotificationCompat.Builder);
-    method public android.support.v4.app.NotificationCompat.BigPictureStyle bigLargeIcon(android.graphics.Bitmap);
-    method public android.support.v4.app.NotificationCompat.BigPictureStyle bigPicture(android.graphics.Bitmap);
-    method public android.support.v4.app.NotificationCompat.BigPictureStyle setBigContentTitle(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.BigPictureStyle setSummaryText(java.lang.CharSequence);
-  }
-
-  public static class NotificationCompat.BigTextStyle extends android.support.v4.app.NotificationCompat.Style {
-    ctor public NotificationCompat.BigTextStyle();
-    ctor public NotificationCompat.BigTextStyle(android.support.v4.app.NotificationCompat.Builder);
-    method public android.support.v4.app.NotificationCompat.BigTextStyle bigText(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.BigTextStyle setBigContentTitle(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.BigTextStyle setSummaryText(java.lang.CharSequence);
-  }
-
-  public static class NotificationCompat.Builder {
-    ctor public NotificationCompat.Builder(android.content.Context);
-    method public android.support.v4.app.NotificationCompat.Builder addAction(int, java.lang.CharSequence, android.app.PendingIntent);
-    method public android.support.v4.app.NotificationCompat.Builder addAction(android.support.v4.app.NotificationCompat.Action);
-    method public android.support.v4.app.NotificationCompat.Builder addExtras(android.os.Bundle);
-    method public android.support.v4.app.NotificationCompat.Builder addPerson(java.lang.String);
-    method public android.app.Notification build();
-    method public android.support.v4.app.NotificationCompat.Builder extend(android.support.v4.app.NotificationCompat.Extender);
-    method public android.os.Bundle getExtras();
-    method public deprecated android.app.Notification getNotification();
-    method protected static java.lang.CharSequence limitCharSequenceLength(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.Builder setAutoCancel(boolean);
-    method public android.support.v4.app.NotificationCompat.Builder setCategory(java.lang.String);
-    method public android.support.v4.app.NotificationCompat.Builder setColor(int);
-    method public android.support.v4.app.NotificationCompat.Builder setContent(android.widget.RemoteViews);
-    method public android.support.v4.app.NotificationCompat.Builder setContentInfo(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.Builder setContentIntent(android.app.PendingIntent);
-    method public android.support.v4.app.NotificationCompat.Builder setContentText(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.Builder setContentTitle(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.Builder setDefaults(int);
-    method public android.support.v4.app.NotificationCompat.Builder setDeleteIntent(android.app.PendingIntent);
-    method public android.support.v4.app.NotificationCompat.Builder setExtras(android.os.Bundle);
-    method public android.support.v4.app.NotificationCompat.Builder setFullScreenIntent(android.app.PendingIntent, boolean);
-    method public android.support.v4.app.NotificationCompat.Builder setGroup(java.lang.String);
-    method public android.support.v4.app.NotificationCompat.Builder setGroupSummary(boolean);
-    method public android.support.v4.app.NotificationCompat.Builder setLargeIcon(android.graphics.Bitmap);
-    method public android.support.v4.app.NotificationCompat.Builder setLights(int, int, int);
-    method public android.support.v4.app.NotificationCompat.Builder setLocalOnly(boolean);
-    method public android.support.v4.app.NotificationCompat.Builder setNumber(int);
-    method public android.support.v4.app.NotificationCompat.Builder setOngoing(boolean);
-    method public android.support.v4.app.NotificationCompat.Builder setOnlyAlertOnce(boolean);
-    method public android.support.v4.app.NotificationCompat.Builder setPriority(int);
-    method public android.support.v4.app.NotificationCompat.Builder setProgress(int, int, boolean);
-    method public android.support.v4.app.NotificationCompat.Builder setPublicVersion(android.app.Notification);
-    method public android.support.v4.app.NotificationCompat.Builder setShowWhen(boolean);
-    method public android.support.v4.app.NotificationCompat.Builder setSmallIcon(int);
-    method public android.support.v4.app.NotificationCompat.Builder setSmallIcon(int, int);
-    method public android.support.v4.app.NotificationCompat.Builder setSortKey(java.lang.String);
-    method public android.support.v4.app.NotificationCompat.Builder setSound(android.net.Uri);
-    method public android.support.v4.app.NotificationCompat.Builder setSound(android.net.Uri, int);
-    method public android.support.v4.app.NotificationCompat.Builder setStyle(android.support.v4.app.NotificationCompat.Style);
-    method public android.support.v4.app.NotificationCompat.Builder setSubText(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.Builder setTicker(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.Builder setTicker(java.lang.CharSequence, android.widget.RemoteViews);
-    method public android.support.v4.app.NotificationCompat.Builder setUsesChronometer(boolean);
-    method public android.support.v4.app.NotificationCompat.Builder setVibrate(long[]);
-    method public android.support.v4.app.NotificationCompat.Builder setVisibility(int);
-    method public android.support.v4.app.NotificationCompat.Builder setWhen(long);
-    field public java.util.ArrayList<java.lang.String> mPeople;
-  }
-
-  public static final class NotificationCompat.CarExtender implements android.support.v4.app.NotificationCompat.Extender {
-    ctor public NotificationCompat.CarExtender();
-    ctor public NotificationCompat.CarExtender(android.app.Notification);
-    method public android.support.v4.app.NotificationCompat.Builder extend(android.support.v4.app.NotificationCompat.Builder);
-    method public int getColor();
-    method public android.graphics.Bitmap getLargeIcon();
-    method public android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation getUnreadConversation();
-    method public android.support.v4.app.NotificationCompat.CarExtender setColor(int);
-    method public android.support.v4.app.NotificationCompat.CarExtender setLargeIcon(android.graphics.Bitmap);
-    method public android.support.v4.app.NotificationCompat.CarExtender setUnreadConversation(android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation);
-  }
-
-  public static class NotificationCompat.CarExtender.UnreadConversation extends android.support.v4.app.NotificationCompatBase.UnreadConversation {
-    method public long getLatestTimestamp();
-    method public java.lang.String[] getMessages();
-    method public java.lang.String getParticipant();
-    method public java.lang.String[] getParticipants();
-    method public android.app.PendingIntent getReadPendingIntent();
-    method public android.support.v4.app.RemoteInput getRemoteInput();
-    method public android.app.PendingIntent getReplyPendingIntent();
-  }
-
-  public static class NotificationCompat.CarExtender.UnreadConversation.Builder {
-    ctor public NotificationCompat.CarExtender.UnreadConversation.Builder(java.lang.String);
-    method public android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation.Builder addMessage(java.lang.String);
-    method public android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation build();
-    method public android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation.Builder setLatestTimestamp(long);
-    method public android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation.Builder setReadPendingIntent(android.app.PendingIntent);
-    method public android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation.Builder setReplyAction(android.app.PendingIntent, android.support.v4.app.RemoteInput);
-  }
-
-  public static abstract interface NotificationCompat.Extender {
-    method public abstract android.support.v4.app.NotificationCompat.Builder extend(android.support.v4.app.NotificationCompat.Builder);
-  }
-
-  public static class NotificationCompat.InboxStyle extends android.support.v4.app.NotificationCompat.Style {
-    ctor public NotificationCompat.InboxStyle();
-    ctor public NotificationCompat.InboxStyle(android.support.v4.app.NotificationCompat.Builder);
-    method public android.support.v4.app.NotificationCompat.InboxStyle addLine(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.InboxStyle setBigContentTitle(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.InboxStyle setSummaryText(java.lang.CharSequence);
-  }
-
-  public static abstract class NotificationCompat.Style {
-    ctor public NotificationCompat.Style();
-    method public android.app.Notification build();
-    method public void setBuilder(android.support.v4.app.NotificationCompat.Builder);
-  }
-
-  public static final class NotificationCompat.WearableExtender implements android.support.v4.app.NotificationCompat.Extender {
-    ctor public NotificationCompat.WearableExtender();
-    ctor public NotificationCompat.WearableExtender(android.app.Notification);
-    method public android.support.v4.app.NotificationCompat.WearableExtender addAction(android.support.v4.app.NotificationCompat.Action);
-    method public android.support.v4.app.NotificationCompat.WearableExtender addActions(java.util.List<android.support.v4.app.NotificationCompat.Action>);
-    method public android.support.v4.app.NotificationCompat.WearableExtender addPage(android.app.Notification);
-    method public android.support.v4.app.NotificationCompat.WearableExtender addPages(java.util.List<android.app.Notification>);
-    method public android.support.v4.app.NotificationCompat.WearableExtender clearActions();
-    method public android.support.v4.app.NotificationCompat.WearableExtender clearPages();
-    method public android.support.v4.app.NotificationCompat.WearableExtender clone();
-    method public android.support.v4.app.NotificationCompat.Builder extend(android.support.v4.app.NotificationCompat.Builder);
-    method public java.util.List<android.support.v4.app.NotificationCompat.Action> getActions();
-    method public android.graphics.Bitmap getBackground();
-    method public int getContentAction();
-    method public int getContentIcon();
-    method public int getContentIconGravity();
-    method public boolean getContentIntentAvailableOffline();
-    method public int getCustomContentHeight();
-    method public int getCustomSizePreset();
-    method public android.app.PendingIntent getDisplayIntent();
-    method public int getGravity();
-    method public boolean getHintAvoidBackgroundClipping();
-    method public boolean getHintHideIcon();
-    method public int getHintScreenTimeout();
-    method public boolean getHintShowBackgroundOnly();
-    method public java.util.List<android.app.Notification> getPages();
-    method public boolean getStartScrollBottom();
-    method public android.support.v4.app.NotificationCompat.WearableExtender setBackground(android.graphics.Bitmap);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setContentAction(int);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setContentIcon(int);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setContentIconGravity(int);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setContentIntentAvailableOffline(boolean);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setCustomContentHeight(int);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setCustomSizePreset(int);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setDisplayIntent(android.app.PendingIntent);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setGravity(int);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setHintAvoidBackgroundClipping(boolean);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setHintHideIcon(boolean);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setHintScreenTimeout(int);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setHintShowBackgroundOnly(boolean);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setStartScrollBottom(boolean);
-    field public static final int SCREEN_TIMEOUT_LONG = -1; // 0xffffffff
-    field public static final int SCREEN_TIMEOUT_SHORT = 0; // 0x0
-    field public static final int SIZE_DEFAULT = 0; // 0x0
-    field public static final int SIZE_FULL_SCREEN = 5; // 0x5
-    field public static final int SIZE_LARGE = 4; // 0x4
-    field public static final int SIZE_MEDIUM = 3; // 0x3
-    field public static final int SIZE_SMALL = 2; // 0x2
-    field public static final int SIZE_XSMALL = 1; // 0x1
-    field public static final int UNSET_ACTION_INDEX = -1; // 0xffffffff
-  }
-
-  public class NotificationCompatBase {
-    ctor public NotificationCompatBase();
-  }
-
-  public static abstract class NotificationCompatBase.Action {
-    ctor public NotificationCompatBase.Action();
-    method public abstract android.app.PendingIntent getActionIntent();
-    method public abstract android.os.Bundle getExtras();
-    method public abstract int getIcon();
-    method public abstract android.support.v4.app.RemoteInputCompatBase.RemoteInput[] getRemoteInputs();
-    method public abstract java.lang.CharSequence getTitle();
-  }
-
-  public static abstract class NotificationCompatBase.UnreadConversation {
-    ctor public NotificationCompatBase.UnreadConversation();
-  }
-
-  public final class NotificationCompatExtras {
-    field public static final java.lang.String EXTRA_ACTION_EXTRAS = "android.support.actionExtras";
-    field public static final java.lang.String EXTRA_GROUP_KEY = "android.support.groupKey";
-    field public static final java.lang.String EXTRA_GROUP_SUMMARY = "android.support.isGroupSummary";
-    field public static final java.lang.String EXTRA_LOCAL_ONLY = "android.support.localOnly";
-    field public static final java.lang.String EXTRA_REMOTE_INPUTS = "android.support.remoteInputs";
-    field public static final java.lang.String EXTRA_SORT_KEY = "android.support.sortKey";
-  }
-
-  public abstract class NotificationCompatSideChannelService extends android.app.Service {
-    ctor public NotificationCompatSideChannelService();
-    method public abstract void cancel(java.lang.String, int, java.lang.String);
-    method public abstract void cancelAll(java.lang.String);
-    method public abstract void notify(java.lang.String, int, java.lang.String, android.app.Notification);
-    method public android.os.IBinder onBind(android.content.Intent);
-  }
-
-  public class NotificationManagerCompat {
-    method public void cancel(int);
-    method public void cancel(java.lang.String, int);
-    method public void cancelAll();
-    method public static android.support.v4.app.NotificationManagerCompat from(android.content.Context);
-    method public static java.util.Set<java.lang.String> getEnabledListenerPackages(android.content.Context);
-    method public void notify(int, android.app.Notification);
-    method public void notify(java.lang.String, int, android.app.Notification);
-    field public static final java.lang.String ACTION_BIND_SIDE_CHANNEL = "android.support.BIND_NOTIFICATION_SIDE_CHANNEL";
-    field public static final java.lang.String EXTRA_USE_SIDE_CHANNEL = "android.support.useSideChannel";
-  }
-
-  public class RemoteInput extends android.support.v4.app.RemoteInputCompatBase.RemoteInput {
-    method public static void addResultsToIntent(android.support.v4.app.RemoteInput[], android.content.Intent, android.os.Bundle);
-    method public boolean getAllowFreeFormInput();
-    method public java.lang.CharSequence[] getChoices();
-    method public android.os.Bundle getExtras();
-    method public java.lang.CharSequence getLabel();
-    method public java.lang.String getResultKey();
-    method public static android.os.Bundle getResultsFromIntent(android.content.Intent);
-    field public static final java.lang.String EXTRA_RESULTS_DATA = "android.remoteinput.resultsData";
-    field public static final java.lang.String RESULTS_CLIP_LABEL = "android.remoteinput.results";
-  }
-
-  public static final class RemoteInput.Builder {
-    ctor public RemoteInput.Builder(java.lang.String);
-    method public android.support.v4.app.RemoteInput.Builder addExtras(android.os.Bundle);
-    method public android.support.v4.app.RemoteInput build();
-    method public android.os.Bundle getExtras();
-    method public android.support.v4.app.RemoteInput.Builder setAllowFreeFormInput(boolean);
-    method public android.support.v4.app.RemoteInput.Builder setChoices(java.lang.CharSequence[]);
-    method public android.support.v4.app.RemoteInput.Builder setLabel(java.lang.CharSequence);
-  }
-
-   class RemoteInputCompatBase {
-  }
-
-  public static abstract class RemoteInputCompatBase.RemoteInput {
-    ctor public RemoteInputCompatBase.RemoteInput();
-    method protected abstract boolean getAllowFreeFormInput();
-    method protected abstract java.lang.CharSequence[] getChoices();
-    method protected abstract android.os.Bundle getExtras();
-    method protected abstract java.lang.CharSequence getLabel();
-    method protected abstract java.lang.String getResultKey();
-  }
-
-  public class ServiceCompat {
-    field public static final int START_STICKY = 1; // 0x1
-  }
-
-  public class ShareCompat {
-    ctor public ShareCompat();
-    method public static void configureMenuItem(android.view.MenuItem, android.support.v4.app.ShareCompat.IntentBuilder);
-    method public static void configureMenuItem(android.view.Menu, int, android.support.v4.app.ShareCompat.IntentBuilder);
-    method public static android.content.ComponentName getCallingActivity(android.app.Activity);
-    method public static java.lang.String getCallingPackage(android.app.Activity);
-    field public static final java.lang.String EXTRA_CALLING_ACTIVITY = "android.support.v4.app.EXTRA_CALLING_ACTIVITY";
-    field public static final java.lang.String EXTRA_CALLING_PACKAGE = "android.support.v4.app.EXTRA_CALLING_PACKAGE";
-  }
-
-  public static class ShareCompat.IntentBuilder {
-    method public android.support.v4.app.ShareCompat.IntentBuilder addEmailBcc(java.lang.String);
-    method public android.support.v4.app.ShareCompat.IntentBuilder addEmailBcc(java.lang.String[]);
-    method public android.support.v4.app.ShareCompat.IntentBuilder addEmailCc(java.lang.String);
-    method public android.support.v4.app.ShareCompat.IntentBuilder addEmailCc(java.lang.String[]);
-    method public android.support.v4.app.ShareCompat.IntentBuilder addEmailTo(java.lang.String);
-    method public android.support.v4.app.ShareCompat.IntentBuilder addEmailTo(java.lang.String[]);
-    method public android.support.v4.app.ShareCompat.IntentBuilder addStream(android.net.Uri);
-    method public android.content.Intent createChooserIntent();
-    method public static android.support.v4.app.ShareCompat.IntentBuilder from(android.app.Activity);
-    method public android.content.Intent getIntent();
-    method public android.support.v4.app.ShareCompat.IntentBuilder setChooserTitle(java.lang.CharSequence);
-    method public android.support.v4.app.ShareCompat.IntentBuilder setChooserTitle(int);
-    method public android.support.v4.app.ShareCompat.IntentBuilder setEmailBcc(java.lang.String[]);
-    method public android.support.v4.app.ShareCompat.IntentBuilder setEmailCc(java.lang.String[]);
-    method public android.support.v4.app.ShareCompat.IntentBuilder setEmailTo(java.lang.String[]);
-    method public android.support.v4.app.ShareCompat.IntentBuilder setHtmlText(java.lang.String);
-    method public android.support.v4.app.ShareCompat.IntentBuilder setStream(android.net.Uri);
-    method public android.support.v4.app.ShareCompat.IntentBuilder setSubject(java.lang.String);
-    method public android.support.v4.app.ShareCompat.IntentBuilder setText(java.lang.CharSequence);
-    method public android.support.v4.app.ShareCompat.IntentBuilder setType(java.lang.String);
-    method public void startChooser();
-  }
-
-  public static class ShareCompat.IntentReader {
-    method public static android.support.v4.app.ShareCompat.IntentReader from(android.app.Activity);
-    method public android.content.ComponentName getCallingActivity();
-    method public android.graphics.drawable.Drawable getCallingActivityIcon();
-    method public android.graphics.drawable.Drawable getCallingApplicationIcon();
-    method public java.lang.CharSequence getCallingApplicationLabel();
-    method public java.lang.String getCallingPackage();
-    method public java.lang.String[] getEmailBcc();
-    method public java.lang.String[] getEmailCc();
-    method public java.lang.String[] getEmailTo();
-    method public java.lang.String getHtmlText();
-    method public android.net.Uri getStream();
-    method public android.net.Uri getStream(int);
-    method public int getStreamCount();
-    method public java.lang.String getSubject();
-    method public java.lang.CharSequence getText();
-    method public java.lang.String getType();
-    method public boolean isMultipleShare();
-    method public boolean isShareIntent();
-    method public boolean isSingleShare();
-  }
-
-  public abstract class SharedElementCallback {
-    ctor public SharedElementCallback();
-    method public android.os.Parcelable onCaptureSharedElementSnapshot(android.view.View, android.graphics.Matrix, android.graphics.RectF);
-    method public android.view.View onCreateSnapshotView(android.content.Context, android.os.Parcelable);
-    method public void onMapSharedElements(java.util.List<java.lang.String>, java.util.Map<java.lang.String, android.view.View>);
-    method public void onRejectSharedElements(java.util.List<android.view.View>);
-    method public void onSharedElementEnd(java.util.List<java.lang.String>, java.util.List<android.view.View>, java.util.List<android.view.View>);
-    method public void onSharedElementStart(java.util.List<java.lang.String>, java.util.List<android.view.View>, java.util.List<android.view.View>);
-  }
-
-  public class TaskStackBuilder implements java.lang.Iterable {
-    method public android.support.v4.app.TaskStackBuilder addNextIntent(android.content.Intent);
-    method public android.support.v4.app.TaskStackBuilder addNextIntentWithParentStack(android.content.Intent);
-    method public android.support.v4.app.TaskStackBuilder addParentStack(android.app.Activity);
-    method public android.support.v4.app.TaskStackBuilder addParentStack(java.lang.Class<?>);
-    method public android.support.v4.app.TaskStackBuilder addParentStack(android.content.ComponentName);
-    method public static android.support.v4.app.TaskStackBuilder create(android.content.Context);
-    method public android.content.Intent editIntentAt(int);
-    method public static deprecated android.support.v4.app.TaskStackBuilder from(android.content.Context);
-    method public deprecated android.content.Intent getIntent(int);
-    method public int getIntentCount();
-    method public android.content.Intent[] getIntents();
-    method public android.app.PendingIntent getPendingIntent(int, int);
-    method public android.app.PendingIntent getPendingIntent(int, int, android.os.Bundle);
-    method public deprecated java.util.Iterator<android.content.Intent> iterator();
-    method public void startActivities();
-    method public void startActivities(android.os.Bundle);
-  }
-
-  public static abstract interface TaskStackBuilder.SupportParentable {
-    method public abstract android.content.Intent getSupportParentActivityIntent();
-  }
-
-}
-
-package android.support.v4.content {
-
-  public abstract class AsyncTaskLoader extends android.support.v4.content.Loader {
-    ctor public AsyncTaskLoader(android.content.Context);
-    method public void cancelLoadInBackground();
-    method public boolean isLoadInBackgroundCanceled();
-    method public abstract D loadInBackground();
-    method public void onCanceled(D);
-    method protected D onLoadInBackground();
-    method public void setUpdateThrottle(long);
-  }
-
-  public class ContentResolverCompat {
-    method public static android.database.Cursor query(android.content.ContentResolver, android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, android.support.v4.os.CancellationSignal);
-  }
-
-  public class ContextCompat {
-    ctor public ContextCompat();
-    method public static int checkSelfPermission(android.content.Context, java.lang.String);
-    method public final java.io.File getCodeCacheDir(android.content.Context);
-    method public static final int getColor(android.content.Context, int);
-    method public static final android.content.res.ColorStateList getColorStateList(android.content.Context, int);
-    method public static final android.graphics.drawable.Drawable getDrawable(android.content.Context, int);
-    method public static java.io.File[] getExternalCacheDirs(android.content.Context);
-    method public static java.io.File[] getExternalFilesDirs(android.content.Context, java.lang.String);
-    method public final java.io.File getNoBackupFilesDir(android.content.Context);
-    method public static java.io.File[] getObbDirs(android.content.Context);
-    method public static boolean startActivities(android.content.Context, android.content.Intent[]);
-    method public static boolean startActivities(android.content.Context, android.content.Intent[], android.os.Bundle);
-  }
-
-  public class CursorLoader extends android.support.v4.content.AsyncTaskLoader {
-    ctor public CursorLoader(android.content.Context);
-    ctor public CursorLoader(android.content.Context, android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String);
-    method public void deliverResult(android.database.Cursor);
-    method public java.lang.String[] getProjection();
-    method public java.lang.String getSelection();
-    method public java.lang.String[] getSelectionArgs();
-    method public java.lang.String getSortOrder();
-    method public android.net.Uri getUri();
-    method public android.database.Cursor loadInBackground();
-    method public void onCanceled(android.database.Cursor);
-    method public void setProjection(java.lang.String[]);
-    method public void setSelection(java.lang.String);
-    method public void setSelectionArgs(java.lang.String[]);
-    method public void setSortOrder(java.lang.String);
-    method public void setUri(android.net.Uri);
-  }
-
-  public class FileProvider extends android.content.ContentProvider {
-    ctor public FileProvider();
-    method public int delete(android.net.Uri, java.lang.String, java.lang.String[]);
-    method public java.lang.String getType(android.net.Uri);
-    method public static android.net.Uri getUriForFile(android.content.Context, java.lang.String, java.io.File);
-    method public android.net.Uri insert(android.net.Uri, android.content.ContentValues);
-    method public boolean onCreate();
-    method public android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String);
-    method public int update(android.net.Uri, android.content.ContentValues, java.lang.String, java.lang.String[]);
-  }
-
-  public class IntentCompat {
-    method public static android.content.Intent makeMainActivity(android.content.ComponentName);
-    method public static android.content.Intent makeMainSelectorActivity(java.lang.String, java.lang.String);
-    method public static android.content.Intent makeRestartActivityTask(android.content.ComponentName);
-    field public static final java.lang.String ACTION_EXTERNAL_APPLICATIONS_AVAILABLE = "android.intent.action.EXTERNAL_APPLICATIONS_AVAILABLE";
-    field public static final java.lang.String ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE = "android.intent.action.EXTERNAL_APPLICATIONS_UNAVAILABLE";
-    field public static final java.lang.String EXTRA_CHANGED_PACKAGE_LIST = "android.intent.extra.changed_package_list";
-    field public static final java.lang.String EXTRA_CHANGED_UID_LIST = "android.intent.extra.changed_uid_list";
-    field public static final java.lang.String EXTRA_HTML_TEXT = "android.intent.extra.HTML_TEXT";
-    field public static final int FLAG_ACTIVITY_CLEAR_TASK = 32768; // 0x8000
-    field public static final int FLAG_ACTIVITY_TASK_ON_HOME = 16384; // 0x4000
-  }
-
-  public class Loader {
-    ctor public Loader(android.content.Context);
-    method public void abandon();
-    method public boolean cancelLoad();
-    method public void commitContentChanged();
-    method public java.lang.String dataToString(D);
-    method public void deliverCancellation();
-    method public void deliverResult(D);
-    method public void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
-    method public void forceLoad();
-    method public android.content.Context getContext();
-    method public int getId();
-    method public boolean isAbandoned();
-    method public boolean isReset();
-    method public boolean isStarted();
-    method protected void onAbandon();
-    method protected boolean onCancelLoad();
-    method public void onContentChanged();
-    method protected void onForceLoad();
-    method protected void onReset();
-    method protected void onStartLoading();
-    method protected void onStopLoading();
-    method public void registerListener(int, android.support.v4.content.Loader.OnLoadCompleteListener<D>);
-    method public void registerOnLoadCanceledListener(android.support.v4.content.Loader.OnLoadCanceledListener<D>);
-    method public void reset();
-    method public void rollbackContentChanged();
-    method public final void startLoading();
-    method public void stopLoading();
-    method public boolean takeContentChanged();
-    method public void unregisterListener(android.support.v4.content.Loader.OnLoadCompleteListener<D>);
-    method public void unregisterOnLoadCanceledListener(android.support.v4.content.Loader.OnLoadCanceledListener<D>);
-  }
-
-  public final class Loader.ForceLoadContentObserver extends android.database.ContentObserver {
-    ctor public Loader.ForceLoadContentObserver();
-  }
-
-  public static abstract interface Loader.OnLoadCanceledListener {
-    method public abstract void onLoadCanceled(android.support.v4.content.Loader<D>);
-  }
-
-  public static abstract interface Loader.OnLoadCompleteListener {
-    method public abstract void onLoadComplete(android.support.v4.content.Loader<D>, D);
-  }
-
-  public class LocalBroadcastManager {
-    method public static android.support.v4.content.LocalBroadcastManager getInstance(android.content.Context);
-    method public void registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter);
-    method public boolean sendBroadcast(android.content.Intent);
-    method public void sendBroadcastSync(android.content.Intent);
-    method public void unregisterReceiver(android.content.BroadcastReceiver);
-  }
-
-  public final class PermissionChecker {
-    method public static int checkCallingOrSelfPermission(android.content.Context, java.lang.String);
-    method public static int checkCallingPermission(android.content.Context, java.lang.String, java.lang.String);
-    method public static int checkPermission(android.content.Context, java.lang.String, int, int, java.lang.String);
-    method public static int checkSelfPermission(android.content.Context, java.lang.String);
-    field public static final int PERMISSION_DENIED = -1; // 0xffffffff
-    field public static final int PERMISSION_DENIED_APP_OP = -2; // 0xfffffffe
-    field public static final int PERMISSION_GRANTED = 0; // 0x0
-  }
-
-  public static abstract class PermissionChecker.PermissionResult implements java.lang.annotation.Annotation {
-  }
-
-  public class SharedPreferencesCompat {
-    ctor public SharedPreferencesCompat();
-  }
-
-  public static class SharedPreferencesCompat.EditorCompat {
-    method public void apply(android.content.SharedPreferences.Editor);
-    method public static android.support.v4.content.SharedPreferencesCompat.EditorCompat getInstance();
-  }
-
-  public abstract class WakefulBroadcastReceiver extends android.content.BroadcastReceiver {
-    ctor public WakefulBroadcastReceiver();
-    method public static boolean completeWakefulIntent(android.content.Intent);
-    method public static android.content.ComponentName startWakefulService(android.content.Context, android.content.Intent);
-  }
-
-}
-
-package android.support.v4.content.pm {
-
-  public class ActivityInfoCompat {
-    field public static final int CONFIG_UI_MODE = 512; // 0x200
-  }
-
-}
-
-package android.support.v4.content.res {
-
-  public class ResourcesCompat {
-    ctor public ResourcesCompat();
-    method public static android.graphics.drawable.Drawable getDrawable(android.content.res.Resources, int, android.content.res.Resources.Theme) throws android.content.res.Resources.NotFoundException;
-    method public static android.graphics.drawable.Drawable getDrawableForDensity(android.content.res.Resources, int, int, android.content.res.Resources.Theme) throws android.content.res.Resources.NotFoundException;
-  }
-
-}
-
-package android.support.v4.database {
-
-  public class DatabaseUtilsCompat {
-    method public static java.lang.String[] appendSelectionArgs(java.lang.String[], java.lang.String[]);
-    method public static java.lang.String concatenateWhere(java.lang.String, java.lang.String);
-  }
-
-}
-
-package android.support.v4.graphics {
-
-  public class BitmapCompat {
-    ctor public BitmapCompat();
-    method public static int getAllocationByteCount(android.graphics.Bitmap);
-    method public static boolean hasMipMap(android.graphics.Bitmap);
-    method public static void setHasMipMap(android.graphics.Bitmap, boolean);
-  }
-
-  public class ColorUtils {
-    method public static int HSLToColor(float[]);
-    method public static void RGBToHSL(int, int, int, float[]);
-    method public static double calculateContrast(int, int);
-    method public static double calculateLuminance(int);
-    method public static int calculateMinimumAlpha(int, int, float);
-    method public static void colorToHSL(int, float[]);
-    method public static int compositeColors(int, int);
-    method public static int setAlphaComponent(int, int);
-  }
-
-}
-
-package android.support.v4.graphics.drawable {
-
-  public class DrawableCompat {
-    ctor public DrawableCompat();
-    method public static int getLayoutDirection(android.graphics.drawable.Drawable);
-    method public static boolean isAutoMirrored(android.graphics.drawable.Drawable);
-    method public static void jumpToCurrentState(android.graphics.drawable.Drawable);
-    method public static void setAutoMirrored(android.graphics.drawable.Drawable, boolean);
-    method public static void setHotspot(android.graphics.drawable.Drawable, float, float);
-    method public static void setHotspotBounds(android.graphics.drawable.Drawable, int, int, int, int);
-    method public static void setLayoutDirection(android.graphics.drawable.Drawable, int);
-    method public static void setTint(android.graphics.drawable.Drawable, int);
-    method public static void setTintList(android.graphics.drawable.Drawable, android.content.res.ColorStateList);
-    method public static void setTintMode(android.graphics.drawable.Drawable, android.graphics.PorterDuff.Mode);
-    method public static T unwrap(android.graphics.drawable.Drawable);
-    method public static android.graphics.drawable.Drawable wrap(android.graphics.drawable.Drawable);
-  }
-
-  public abstract class RoundedBitmapDrawable extends android.graphics.drawable.Drawable {
-    method public void draw(android.graphics.Canvas);
-    method public final android.graphics.Bitmap getBitmap();
-    method public float getCornerRadius();
-    method public int getGravity();
-    method public int getOpacity();
-    method public final android.graphics.Paint getPaint();
-    method public boolean hasAntiAlias();
-    method public boolean hasMipMap();
-    method public boolean isCircular();
-    method public void setAlpha(int);
-    method public void setAntiAlias(boolean);
-    method public void setCircular(boolean);
-    method public void setColorFilter(android.graphics.ColorFilter);
-    method public void setCornerRadius(float);
-    method public void setGravity(int);
-    method public void setMipMap(boolean);
-    method public void setTargetDensity(android.graphics.Canvas);
-    method public void setTargetDensity(android.util.DisplayMetrics);
-    method public void setTargetDensity(int);
-  }
-
-  public class RoundedBitmapDrawableFactory {
-    ctor public RoundedBitmapDrawableFactory();
-    method public static android.support.v4.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, android.graphics.Bitmap);
-    method public static android.support.v4.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, java.lang.String);
-    method public static android.support.v4.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, java.io.InputStream);
-  }
-
-}
-
-package android.support.v4.hardware.display {
-
-  public abstract class DisplayManagerCompat {
-    method public abstract android.view.Display getDisplay(int);
-    method public abstract android.view.Display[] getDisplays();
-    method public abstract android.view.Display[] getDisplays(java.lang.String);
-    method public static android.support.v4.hardware.display.DisplayManagerCompat getInstance(android.content.Context);
-    field public static final java.lang.String DISPLAY_CATEGORY_PRESENTATION = "android.hardware.display.category.PRESENTATION";
-  }
-
-}
-
-package android.support.v4.hardware.fingerprint {
-
-  public class FingerprintManagerCompat {
-    method public void authenticate(android.support.v4.hardware.fingerprint.FingerprintManagerCompat.CryptoObject, int, android.support.v4.os.CancellationSignal, android.support.v4.hardware.fingerprint.FingerprintManagerCompat.AuthenticationCallback, android.os.Handler);
-    method public static android.support.v4.hardware.fingerprint.FingerprintManagerCompat from(android.content.Context);
-    method public boolean hasEnrolledFingerprints();
-    method public boolean isHardwareDetected();
-  }
-
-  public static abstract class FingerprintManagerCompat.AuthenticationCallback {
-    ctor public FingerprintManagerCompat.AuthenticationCallback();
-    method public void onAuthenticationError(int, java.lang.CharSequence);
-    method public void onAuthenticationFailed();
-    method public void onAuthenticationHelp(int, java.lang.CharSequence);
-    method public void onAuthenticationSucceeded(android.support.v4.hardware.fingerprint.FingerprintManagerCompat.AuthenticationResult);
-  }
-
-  public static final class FingerprintManagerCompat.AuthenticationResult {
-    ctor public FingerprintManagerCompat.AuthenticationResult(android.support.v4.hardware.fingerprint.FingerprintManagerCompat.CryptoObject);
-    method public android.support.v4.hardware.fingerprint.FingerprintManagerCompat.CryptoObject getCryptoObject();
-  }
-
-  public static class FingerprintManagerCompat.CryptoObject {
-    ctor public FingerprintManagerCompat.CryptoObject(java.security.Signature);
-    ctor public FingerprintManagerCompat.CryptoObject(javax.crypto.Cipher);
-    ctor public FingerprintManagerCompat.CryptoObject(javax.crypto.Mac);
-    method public javax.crypto.Cipher getCipher();
-    method public javax.crypto.Mac getMac();
-    method public java.security.Signature getSignature();
-  }
-
-}
-
-package android.support.v4.media {
-
-  public final class MediaDescriptionCompat implements android.os.Parcelable {
-    method public int describeContents();
-    method public static android.support.v4.media.MediaDescriptionCompat fromMediaDescription(java.lang.Object);
-    method public java.lang.CharSequence getDescription();
-    method public android.os.Bundle getExtras();
-    method public android.graphics.Bitmap getIconBitmap();
-    method public android.net.Uri getIconUri();
-    method public java.lang.Object getMediaDescription();
-    method public java.lang.String getMediaId();
-    method public android.net.Uri getMediaUri();
-    method public java.lang.CharSequence getSubtitle();
-    method public java.lang.CharSequence getTitle();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.support.v4.media.MediaDescriptionCompat> CREATOR;
-  }
-
-  public static final class MediaDescriptionCompat.Builder {
-    ctor public MediaDescriptionCompat.Builder();
-    method public android.support.v4.media.MediaDescriptionCompat build();
-    method public android.support.v4.media.MediaDescriptionCompat.Builder setDescription(java.lang.CharSequence);
-    method public android.support.v4.media.MediaDescriptionCompat.Builder setExtras(android.os.Bundle);
-    method public android.support.v4.media.MediaDescriptionCompat.Builder setIconBitmap(android.graphics.Bitmap);
-    method public android.support.v4.media.MediaDescriptionCompat.Builder setIconUri(android.net.Uri);
-    method public android.support.v4.media.MediaDescriptionCompat.Builder setMediaId(java.lang.String);
-    method public android.support.v4.media.MediaDescriptionCompat.Builder setMediaUri(android.net.Uri);
-    method public android.support.v4.media.MediaDescriptionCompat.Builder setSubtitle(java.lang.CharSequence);
-    method public android.support.v4.media.MediaDescriptionCompat.Builder setTitle(java.lang.CharSequence);
-  }
-
-  public final class MediaMetadataCompat implements android.os.Parcelable {
-    method public boolean containsKey(java.lang.String);
-    method public int describeContents();
-    method public static android.support.v4.media.MediaMetadataCompat fromMediaMetadata(java.lang.Object);
-    method public android.graphics.Bitmap getBitmap(java.lang.String);
-    method public android.os.Bundle getBundle();
-    method public android.support.v4.media.MediaDescriptionCompat getDescription();
-    method public long getLong(java.lang.String);
-    method public java.lang.Object getMediaMetadata();
-    method public android.support.v4.media.RatingCompat getRating(java.lang.String);
-    method public java.lang.String getString(java.lang.String);
-    method public java.lang.CharSequence getText(java.lang.String);
-    method public java.util.Set<java.lang.String> keySet();
-    method public int size();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.support.v4.media.MediaMetadataCompat> CREATOR;
-    field public static final java.lang.String METADATA_KEY_ALBUM = "android.media.metadata.ALBUM";
-    field public static final java.lang.String METADATA_KEY_ALBUM_ART = "android.media.metadata.ALBUM_ART";
-    field public static final java.lang.String METADATA_KEY_ALBUM_ARTIST = "android.media.metadata.ALBUM_ARTIST";
-    field public static final java.lang.String METADATA_KEY_ALBUM_ART_URI = "android.media.metadata.ALBUM_ART_URI";
-    field public static final java.lang.String METADATA_KEY_ART = "android.media.metadata.ART";
-    field public static final java.lang.String METADATA_KEY_ARTIST = "android.media.metadata.ARTIST";
-    field public static final java.lang.String METADATA_KEY_ART_URI = "android.media.metadata.ART_URI";
-    field public static final java.lang.String METADATA_KEY_AUTHOR = "android.media.metadata.AUTHOR";
-    field public static final java.lang.String METADATA_KEY_COMPILATION = "android.media.metadata.COMPILATION";
-    field public static final java.lang.String METADATA_KEY_COMPOSER = "android.media.metadata.COMPOSER";
-    field public static final java.lang.String METADATA_KEY_DATE = "android.media.metadata.DATE";
-    field public static final java.lang.String METADATA_KEY_DISC_NUMBER = "android.media.metadata.DISC_NUMBER";
-    field public static final java.lang.String METADATA_KEY_DISPLAY_DESCRIPTION = "android.media.metadata.DISPLAY_DESCRIPTION";
-    field public static final java.lang.String METADATA_KEY_DISPLAY_ICON = "android.media.metadata.DISPLAY_ICON";
-    field public static final java.lang.String METADATA_KEY_DISPLAY_ICON_URI = "android.media.metadata.DISPLAY_ICON_URI";
-    field public static final java.lang.String METADATA_KEY_DISPLAY_SUBTITLE = "android.media.metadata.DISPLAY_SUBTITLE";
-    field public static final java.lang.String METADATA_KEY_DISPLAY_TITLE = "android.media.metadata.DISPLAY_TITLE";
-    field public static final java.lang.String METADATA_KEY_DURATION = "android.media.metadata.DURATION";
-    field public static final java.lang.String METADATA_KEY_GENRE = "android.media.metadata.GENRE";
-    field public static final java.lang.String METADATA_KEY_MEDIA_ID = "android.media.metadata.MEDIA_ID";
-    field public static final java.lang.String METADATA_KEY_NUM_TRACKS = "android.media.metadata.NUM_TRACKS";
-    field public static final java.lang.String METADATA_KEY_RATING = "android.media.metadata.RATING";
-    field public static final java.lang.String METADATA_KEY_TITLE = "android.media.metadata.TITLE";
-    field public static final java.lang.String METADATA_KEY_TRACK_NUMBER = "android.media.metadata.TRACK_NUMBER";
-    field public static final java.lang.String METADATA_KEY_USER_RATING = "android.media.metadata.USER_RATING";
-    field public static final java.lang.String METADATA_KEY_WRITER = "android.media.metadata.WRITER";
-    field public static final java.lang.String METADATA_KEY_YEAR = "android.media.metadata.YEAR";
-  }
-
-  public static final class MediaMetadataCompat.Builder {
-    ctor public MediaMetadataCompat.Builder();
-    ctor public MediaMetadataCompat.Builder(android.support.v4.media.MediaMetadataCompat);
-    method public android.support.v4.media.MediaMetadataCompat build();
-    method public android.support.v4.media.MediaMetadataCompat.Builder putBitmap(java.lang.String, android.graphics.Bitmap);
-    method public android.support.v4.media.MediaMetadataCompat.Builder putLong(java.lang.String, long);
-    method public android.support.v4.media.MediaMetadataCompat.Builder putRating(java.lang.String, android.support.v4.media.RatingCompat);
-    method public android.support.v4.media.MediaMetadataCompat.Builder putString(java.lang.String, java.lang.String);
-    method public android.support.v4.media.MediaMetadataCompat.Builder putText(java.lang.String, java.lang.CharSequence);
-  }
-
-  public final class RatingCompat implements android.os.Parcelable {
-    method public int describeContents();
-    method public static android.support.v4.media.RatingCompat fromRating(java.lang.Object);
-    method public float getPercentRating();
-    method public java.lang.Object getRating();
-    method public int getRatingStyle();
-    method public float getStarRating();
-    method public boolean hasHeart();
-    method public boolean isRated();
-    method public boolean isThumbUp();
-    method public static android.support.v4.media.RatingCompat newHeartRating(boolean);
-    method public static android.support.v4.media.RatingCompat newPercentageRating(float);
-    method public static android.support.v4.media.RatingCompat newStarRating(int, float);
-    method public static android.support.v4.media.RatingCompat newThumbRating(boolean);
-    method public static android.support.v4.media.RatingCompat newUnratedRating(int);
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.support.v4.media.RatingCompat> CREATOR;
-    field public static final int RATING_3_STARS = 3; // 0x3
-    field public static final int RATING_4_STARS = 4; // 0x4
-    field public static final int RATING_5_STARS = 5; // 0x5
-    field public static final int RATING_HEART = 1; // 0x1
-    field public static final int RATING_NONE = 0; // 0x0
-    field public static final int RATING_PERCENTAGE = 6; // 0x6
-    field public static final int RATING_THUMB_UP_DOWN = 2; // 0x2
-  }
-
-  public abstract class TransportController {
-    ctor public TransportController();
-    method public abstract int getBufferPercentage();
-    method public abstract long getCurrentPosition();
-    method public abstract long getDuration();
-    method public abstract int getTransportControlFlags();
-    method public abstract boolean isPlaying();
-    method public abstract void pausePlaying();
-    method public abstract void registerStateListener(android.support.v4.media.TransportStateListener);
-    method public abstract void seekTo(long);
-    method public abstract void startPlaying();
-    method public abstract void stopPlaying();
-    method public abstract void unregisterStateListener(android.support.v4.media.TransportStateListener);
-  }
-
-  public class TransportMediator extends android.support.v4.media.TransportController {
-    ctor public TransportMediator(android.app.Activity, android.support.v4.media.TransportPerformer);
-    ctor public TransportMediator(android.view.View, android.support.v4.media.TransportPerformer);
-    method public void destroy();
-    method public boolean dispatchKeyEvent(android.view.KeyEvent);
-    method public int getBufferPercentage();
-    method public long getCurrentPosition();
-    method public long getDuration();
-    method public java.lang.Object getRemoteControlClient();
-    method public int getTransportControlFlags();
-    method public boolean isPlaying();
-    method public void pausePlaying();
-    method public void refreshState();
-    method public void registerStateListener(android.support.v4.media.TransportStateListener);
-    method public void seekTo(long);
-    method public void startPlaying();
-    method public void stopPlaying();
-    method public void unregisterStateListener(android.support.v4.media.TransportStateListener);
-    field public static final int FLAG_KEY_MEDIA_FAST_FORWARD = 64; // 0x40
-    field public static final int FLAG_KEY_MEDIA_NEXT = 128; // 0x80
-    field public static final int FLAG_KEY_MEDIA_PAUSE = 16; // 0x10
-    field public static final int FLAG_KEY_MEDIA_PLAY = 4; // 0x4
-    field public static final int FLAG_KEY_MEDIA_PLAY_PAUSE = 8; // 0x8
-    field public static final int FLAG_KEY_MEDIA_PREVIOUS = 1; // 0x1
-    field public static final int FLAG_KEY_MEDIA_REWIND = 2; // 0x2
-    field public static final int FLAG_KEY_MEDIA_STOP = 32; // 0x20
-    field public static final int KEYCODE_MEDIA_PAUSE = 127; // 0x7f
-    field public static final int KEYCODE_MEDIA_PLAY = 126; // 0x7e
-    field public static final int KEYCODE_MEDIA_RECORD = 130; // 0x82
-  }
-
-  public abstract class TransportPerformer {
-    ctor public TransportPerformer();
-    method public void onAudioFocusChange(int);
-    method public int onGetBufferPercentage();
-    method public abstract long onGetCurrentPosition();
-    method public abstract long onGetDuration();
-    method public int onGetTransportControlFlags();
-    method public abstract boolean onIsPlaying();
-    method public boolean onMediaButtonDown(int, android.view.KeyEvent);
-    method public boolean onMediaButtonUp(int, android.view.KeyEvent);
-    method public abstract void onPause();
-    method public abstract void onSeekTo(long);
-    method public abstract void onStart();
-    method public abstract void onStop();
-  }
-
-  public class TransportStateListener {
-    ctor public TransportStateListener();
-    method public void onPlayingChanged(android.support.v4.media.TransportController);
-    method public void onTransportControlsChanged(android.support.v4.media.TransportController);
-  }
-
-  public abstract class VolumeProviderCompat {
-    ctor public VolumeProviderCompat(int, int, int);
-    method public final int getCurrentVolume();
-    method public final int getMaxVolume();
-    method public final int getVolumeControl();
-    method public java.lang.Object getVolumeProvider();
-    method public void onAdjustVolume(int);
-    method public void onSetVolumeTo(int);
-    method public void setCallback(android.support.v4.media.VolumeProviderCompat.Callback);
-    method public final void setCurrentVolume(int);
-    field public static final int VOLUME_CONTROL_ABSOLUTE = 2; // 0x2
-    field public static final int VOLUME_CONTROL_FIXED = 0; // 0x0
-    field public static final int VOLUME_CONTROL_RELATIVE = 1; // 0x1
-  }
-
-  public static abstract class VolumeProviderCompat.Callback {
-    ctor public VolumeProviderCompat.Callback();
-    method public abstract void onVolumeChanged(android.support.v4.media.VolumeProviderCompat);
-  }
-
-}
-
-package android.support.v4.media.session {
-
-  public final class MediaControllerCompat {
-    ctor public MediaControllerCompat(android.content.Context, android.support.v4.media.session.MediaSessionCompat);
-    ctor public MediaControllerCompat(android.content.Context, android.support.v4.media.session.MediaSessionCompat.Token) throws android.os.RemoteException;
-    method public void adjustVolume(int, int);
-    method public boolean dispatchMediaButtonEvent(android.view.KeyEvent);
-    method public android.os.Bundle getExtras();
-    method public long getFlags();
-    method public java.lang.Object getMediaController();
-    method public android.support.v4.media.MediaMetadataCompat getMetadata();
-    method public java.lang.String getPackageName();
-    method public android.support.v4.media.session.MediaControllerCompat.PlaybackInfo getPlaybackInfo();
-    method public android.support.v4.media.session.PlaybackStateCompat getPlaybackState();
-    method public java.util.List<android.support.v4.media.session.MediaSessionCompat.QueueItem> getQueue();
-    method public java.lang.CharSequence getQueueTitle();
-    method public int getRatingType();
-    method public android.app.PendingIntent getSessionActivity();
-    method public android.support.v4.media.session.MediaSessionCompat.Token getSessionToken();
-    method public android.support.v4.media.session.MediaControllerCompat.TransportControls getTransportControls();
-    method public void registerCallback(android.support.v4.media.session.MediaControllerCompat.Callback);
-    method public void registerCallback(android.support.v4.media.session.MediaControllerCompat.Callback, android.os.Handler);
-    method public void sendCommand(java.lang.String, android.os.Bundle, android.os.ResultReceiver);
-    method public void setVolumeTo(int, int);
-    method public void unregisterCallback(android.support.v4.media.session.MediaControllerCompat.Callback);
-  }
-
-  public static abstract class MediaControllerCompat.Callback implements android.os.IBinder.DeathRecipient {
-    ctor public MediaControllerCompat.Callback();
-    method public void binderDied();
-    method public void onAudioInfoChanged(android.support.v4.media.session.MediaControllerCompat.PlaybackInfo);
-    method public void onExtrasChanged(android.os.Bundle);
-    method public void onMetadataChanged(android.support.v4.media.MediaMetadataCompat);
-    method public void onPlaybackStateChanged(android.support.v4.media.session.PlaybackStateCompat);
-    method public void onQueueChanged(java.util.List<android.support.v4.media.session.MediaSessionCompat.QueueItem>);
-    method public void onQueueTitleChanged(java.lang.CharSequence);
-    method public void onSessionDestroyed();
-    method public void onSessionEvent(java.lang.String, android.os.Bundle);
-  }
-
-  public static final class MediaControllerCompat.PlaybackInfo {
-    method public int getAudioStream();
-    method public int getCurrentVolume();
-    method public int getMaxVolume();
-    method public int getPlaybackType();
-    method public int getVolumeControl();
-    field public static final int PLAYBACK_TYPE_LOCAL = 1; // 0x1
-    field public static final int PLAYBACK_TYPE_REMOTE = 2; // 0x2
-  }
-
-  public static abstract class MediaControllerCompat.TransportControls {
-    method public abstract void fastForward();
-    method public abstract void pause();
-    method public abstract void play();
-    method public abstract void playFromMediaId(java.lang.String, android.os.Bundle);
-    method public abstract void playFromSearch(java.lang.String, android.os.Bundle);
-    method public abstract void playFromUri(android.net.Uri, android.os.Bundle);
-    method public abstract void rewind();
-    method public abstract void seekTo(long);
-    method public abstract void sendCustomAction(android.support.v4.media.session.PlaybackStateCompat.CustomAction, android.os.Bundle);
-    method public abstract void sendCustomAction(java.lang.String, android.os.Bundle);
-    method public abstract void setRating(android.support.v4.media.RatingCompat);
-    method public abstract void skipToNext();
-    method public abstract void skipToPrevious();
-    method public abstract void skipToQueueItem(long);
-    method public abstract void stop();
-  }
-
-  public class MediaSessionCompat {
-    ctor public MediaSessionCompat(android.content.Context, java.lang.String, android.content.ComponentName, android.app.PendingIntent);
-    method public void addOnActiveChangeListener(android.support.v4.media.session.MediaSessionCompat.OnActiveChangeListener);
-    method public android.support.v4.media.session.MediaControllerCompat getController();
-    method public java.lang.Object getMediaSession();
-    method public java.lang.Object getRemoteControlClient();
-    method public android.support.v4.media.session.MediaSessionCompat.Token getSessionToken();
-    method public boolean isActive();
-    method public static android.support.v4.media.session.MediaSessionCompat obtain(android.content.Context, java.lang.Object);
-    method public void release();
-    method public void removeOnActiveChangeListener(android.support.v4.media.session.MediaSessionCompat.OnActiveChangeListener);
-    method public void sendSessionEvent(java.lang.String, android.os.Bundle);
-    method public void setActive(boolean);
-    method public void setCallback(android.support.v4.media.session.MediaSessionCompat.Callback);
-    method public void setCallback(android.support.v4.media.session.MediaSessionCompat.Callback, android.os.Handler);
-    method public void setExtras(android.os.Bundle);
-    method public void setFlags(int);
-    method public void setMediaButtonReceiver(android.app.PendingIntent);
-    method public void setMetadata(android.support.v4.media.MediaMetadataCompat);
-    method public void setPlaybackState(android.support.v4.media.session.PlaybackStateCompat);
-    method public void setPlaybackToLocal(int);
-    method public void setPlaybackToRemote(android.support.v4.media.VolumeProviderCompat);
-    method public void setQueue(java.util.List<android.support.v4.media.session.MediaSessionCompat.QueueItem>);
-    method public void setQueueTitle(java.lang.CharSequence);
-    method public void setRatingType(int);
-    method public void setSessionActivity(android.app.PendingIntent);
-    field public static final int FLAG_HANDLES_MEDIA_BUTTONS = 1; // 0x1
-    field public static final int FLAG_HANDLES_TRANSPORT_CONTROLS = 2; // 0x2
-  }
-
-  public static abstract class MediaSessionCompat.Callback {
-    ctor public MediaSessionCompat.Callback();
-    method public void onCommand(java.lang.String, android.os.Bundle, android.os.ResultReceiver);
-    method public void onCustomAction(java.lang.String, android.os.Bundle);
-    method public void onFastForward();
-    method public boolean onMediaButtonEvent(android.content.Intent);
-    method public void onPause();
-    method public void onPlay();
-    method public void onPlayFromMediaId(java.lang.String, android.os.Bundle);
-    method public void onPlayFromSearch(java.lang.String, android.os.Bundle);
-    method public void onPlayFromUri(android.net.Uri, android.os.Bundle);
-    method public void onRewind();
-    method public void onSeekTo(long);
-    method public void onSetRating(android.support.v4.media.RatingCompat);
-    method public void onSkipToNext();
-    method public void onSkipToPrevious();
-    method public void onSkipToQueueItem(long);
-    method public void onStop();
-  }
-
-  public static abstract interface MediaSessionCompat.OnActiveChangeListener {
-    method public abstract void onActiveChanged();
-  }
-
-  public static final class MediaSessionCompat.QueueItem implements android.os.Parcelable {
-    ctor public MediaSessionCompat.QueueItem(android.support.v4.media.MediaDescriptionCompat, long);
-    method public int describeContents();
-    method public android.support.v4.media.MediaDescriptionCompat getDescription();
-    method public long getQueueId();
-    method public java.lang.Object getQueueItem();
-    method public static android.support.v4.media.session.MediaSessionCompat.QueueItem obtain(java.lang.Object);
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.support.v4.media.session.MediaSessionCompat.QueueItem> CREATOR;
-    field public static final int UNKNOWN_ID = -1; // 0xffffffff
-  }
-
-  public static final class MediaSessionCompat.Token implements android.os.Parcelable {
-    method public int describeContents();
-    method public static android.support.v4.media.session.MediaSessionCompat.Token fromToken(java.lang.Object);
-    method public java.lang.Object getToken();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.support.v4.media.session.MediaSessionCompat.Token> CREATOR;
-  }
-
-  public class ParcelableVolumeInfo implements android.os.Parcelable {
-    ctor public ParcelableVolumeInfo(int, int, int, int, int);
-    ctor public ParcelableVolumeInfo(android.os.Parcel);
-    method public int describeContents();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.support.v4.media.session.ParcelableVolumeInfo> CREATOR;
-    field public int audioStream;
-    field public int controlType;
-    field public int currentVolume;
-    field public int maxVolume;
-    field public int volumeType;
-  }
-
-  public final class PlaybackStateCompat implements android.os.Parcelable {
-    method public int describeContents();
-    method public static android.support.v4.media.session.PlaybackStateCompat fromPlaybackState(java.lang.Object);
-    method public long getActions();
-    method public long getActiveQueueItemId();
-    method public long getBufferedPosition();
-    method public java.util.List<android.support.v4.media.session.PlaybackStateCompat.CustomAction> getCustomActions();
-    method public java.lang.CharSequence getErrorMessage();
-    method public android.os.Bundle getExtras();
-    method public long getLastPositionUpdateTime();
-    method public float getPlaybackSpeed();
-    method public java.lang.Object getPlaybackState();
-    method public long getPosition();
-    method public int getState();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final long ACTION_FAST_FORWARD = 64L; // 0x40L
-    field public static final long ACTION_PAUSE = 2L; // 0x2L
-    field public static final long ACTION_PLAY = 4L; // 0x4L
-    field public static final long ACTION_PLAY_FROM_MEDIA_ID = 1024L; // 0x400L
-    field public static final long ACTION_PLAY_FROM_SEARCH = 2048L; // 0x800L
-    field public static final long ACTION_PLAY_FROM_URI = 8192L; // 0x2000L
-    field public static final long ACTION_PLAY_PAUSE = 512L; // 0x200L
-    field public static final long ACTION_REWIND = 8L; // 0x8L
-    field public static final long ACTION_SEEK_TO = 256L; // 0x100L
-    field public static final long ACTION_SET_RATING = 128L; // 0x80L
-    field public static final long ACTION_SKIP_TO_NEXT = 32L; // 0x20L
-    field public static final long ACTION_SKIP_TO_PREVIOUS = 16L; // 0x10L
-    field public static final long ACTION_SKIP_TO_QUEUE_ITEM = 4096L; // 0x1000L
-    field public static final long ACTION_STOP = 1L; // 0x1L
-    field public static final android.os.Parcelable.Creator<android.support.v4.media.session.PlaybackStateCompat> CREATOR;
-    field public static final long PLAYBACK_POSITION_UNKNOWN = -1L; // 0xffffffffffffffffL
-    field public static final int STATE_BUFFERING = 6; // 0x6
-    field public static final int STATE_CONNECTING = 8; // 0x8
-    field public static final int STATE_ERROR = 7; // 0x7
-    field public static final int STATE_FAST_FORWARDING = 4; // 0x4
-    field public static final int STATE_NONE = 0; // 0x0
-    field public static final int STATE_PAUSED = 2; // 0x2
-    field public static final int STATE_PLAYING = 3; // 0x3
-    field public static final int STATE_REWINDING = 5; // 0x5
-    field public static final int STATE_SKIPPING_TO_NEXT = 10; // 0xa
-    field public static final int STATE_SKIPPING_TO_PREVIOUS = 9; // 0x9
-    field public static final int STATE_SKIPPING_TO_QUEUE_ITEM = 11; // 0xb
-    field public static final int STATE_STOPPED = 1; // 0x1
-  }
-
-  public static final class PlaybackStateCompat.Builder {
-    ctor public PlaybackStateCompat.Builder();
-    ctor public PlaybackStateCompat.Builder(android.support.v4.media.session.PlaybackStateCompat);
-    method public android.support.v4.media.session.PlaybackStateCompat.Builder addCustomAction(java.lang.String, java.lang.String, int);
-    method public android.support.v4.media.session.PlaybackStateCompat.Builder addCustomAction(android.support.v4.media.session.PlaybackStateCompat.CustomAction);
-    method public android.support.v4.media.session.PlaybackStateCompat build();
-    method public android.support.v4.media.session.PlaybackStateCompat.Builder setActions(long);
-    method public android.support.v4.media.session.PlaybackStateCompat.Builder setActiveQueueItemId(long);
-    method public android.support.v4.media.session.PlaybackStateCompat.Builder setBufferedPosition(long);
-    method public android.support.v4.media.session.PlaybackStateCompat.Builder setErrorMessage(java.lang.CharSequence);
-    method public android.support.v4.media.session.PlaybackStateCompat.Builder setExtras(android.os.Bundle);
-    method public android.support.v4.media.session.PlaybackStateCompat.Builder setState(int, long, float);
-    method public android.support.v4.media.session.PlaybackStateCompat.Builder setState(int, long, float, long);
-  }
-
-  public static final class PlaybackStateCompat.CustomAction implements android.os.Parcelable {
-    method public int describeContents();
-    method public static android.support.v4.media.session.PlaybackStateCompat.CustomAction fromCustomAction(java.lang.Object);
-    method public java.lang.String getAction();
-    method public java.lang.Object getCustomAction();
-    method public android.os.Bundle getExtras();
-    method public int getIcon();
-    method public java.lang.CharSequence getName();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.support.v4.media.session.PlaybackStateCompat.CustomAction> CREATOR;
-  }
-
-  public static final class PlaybackStateCompat.CustomAction.Builder {
-    ctor public PlaybackStateCompat.CustomAction.Builder(java.lang.String, java.lang.CharSequence, int);
-    method public android.support.v4.media.session.PlaybackStateCompat.CustomAction build();
-    method public android.support.v4.media.session.PlaybackStateCompat.CustomAction.Builder setExtras(android.os.Bundle);
-  }
-
-}
-
-package android.support.v4.net {
-
-  public class ConnectivityManagerCompat {
-    ctor public ConnectivityManagerCompat();
-    method public static android.net.NetworkInfo getNetworkInfoFromBroadcast(android.net.ConnectivityManager, android.content.Intent);
-    method public static boolean isActiveNetworkMetered(android.net.ConnectivityManager);
-  }
-
-  public class TrafficStatsCompat {
-    ctor public TrafficStatsCompat();
-    method public static void clearThreadStatsTag();
-    method public static int getThreadStatsTag();
-    method public static void incrementOperationCount(int);
-    method public static void incrementOperationCount(int, int);
-    method public static void setThreadStatsTag(int);
-    method public static void tagSocket(java.net.Socket) throws java.net.SocketException;
-    method public static void untagSocket(java.net.Socket) throws java.net.SocketException;
-  }
-
-}
-
-package android.support.v4.os {
-
-  public class AsyncTaskCompat {
-    ctor public AsyncTaskCompat();
-    method public static android.os.AsyncTask<Params, Progress, Result> executeParallel(android.os.AsyncTask<Params, Progress, Result>, Params...);
-  }
-
-  public final class CancellationSignal {
-    ctor public CancellationSignal();
-    method public void cancel();
-    method public java.lang.Object getCancellationSignalObject();
-    method public boolean isCanceled();
-    method public void setOnCancelListener(android.support.v4.os.CancellationSignal.OnCancelListener);
-    method public void throwIfCanceled();
-  }
-
-  public static abstract interface CancellationSignal.OnCancelListener {
-    method public abstract void onCancel();
-  }
-
-  public class EnvironmentCompat {
-    ctor public EnvironmentCompat();
-    method public static java.lang.String getStorageState(java.io.File);
-    field public static final java.lang.String MEDIA_UNKNOWN = "unknown";
-  }
-
-  public class OperationCanceledException extends java.lang.RuntimeException {
-    ctor public OperationCanceledException();
-    ctor public OperationCanceledException(java.lang.String);
-  }
-
-  public class ParcelableCompat {
-    ctor public ParcelableCompat();
-    method public static android.os.Parcelable.Creator<T> newCreator(android.support.v4.os.ParcelableCompatCreatorCallbacks<T>);
-  }
-
-  public abstract interface ParcelableCompatCreatorCallbacks {
-    method public abstract T createFromParcel(android.os.Parcel, java.lang.ClassLoader);
-    method public abstract T[] newArray(int);
-  }
-
-  public class TraceCompat {
-    ctor public TraceCompat();
-    method public static void beginSection(java.lang.String);
-    method public static void endSection();
-  }
-
-}
-
-package android.support.v4.print {
-
-  public final class PrintHelper {
-    ctor public PrintHelper(android.content.Context);
-    method public int getColorMode();
-    method public int getOrientation();
-    method public int getScaleMode();
-    method public void printBitmap(java.lang.String, android.graphics.Bitmap);
-    method public void printBitmap(java.lang.String, android.graphics.Bitmap, android.support.v4.print.PrintHelper.OnPrintFinishCallback);
-    method public void printBitmap(java.lang.String, android.net.Uri) throws java.io.FileNotFoundException;
-    method public void printBitmap(java.lang.String, android.net.Uri, android.support.v4.print.PrintHelper.OnPrintFinishCallback) throws java.io.FileNotFoundException;
-    method public void setColorMode(int);
-    method public void setOrientation(int);
-    method public void setScaleMode(int);
-    method public static boolean systemSupportsPrint();
-    field public static final int COLOR_MODE_COLOR = 2; // 0x2
-    field public static final int COLOR_MODE_MONOCHROME = 1; // 0x1
-    field public static final int ORIENTATION_LANDSCAPE = 1; // 0x1
-    field public static final int ORIENTATION_PORTRAIT = 2; // 0x2
-    field public static final int SCALE_MODE_FILL = 2; // 0x2
-    field public static final int SCALE_MODE_FIT = 1; // 0x1
-  }
-
-  public static abstract interface PrintHelper.OnPrintFinishCallback {
-    method public abstract void onFinish();
-  }
-
-}
-
-package android.support.v4.provider {
-
-  public abstract class DocumentFile {
-    method public abstract boolean canRead();
-    method public abstract boolean canWrite();
-    method public abstract android.support.v4.provider.DocumentFile createDirectory(java.lang.String);
-    method public abstract android.support.v4.provider.DocumentFile createFile(java.lang.String, java.lang.String);
-    method public abstract boolean delete();
-    method public abstract boolean exists();
-    method public android.support.v4.provider.DocumentFile findFile(java.lang.String);
-    method public static android.support.v4.provider.DocumentFile fromFile(java.io.File);
-    method public static android.support.v4.provider.DocumentFile fromSingleUri(android.content.Context, android.net.Uri);
-    method public static android.support.v4.provider.DocumentFile fromTreeUri(android.content.Context, android.net.Uri);
-    method public abstract java.lang.String getName();
-    method public android.support.v4.provider.DocumentFile getParentFile();
-    method public abstract java.lang.String getType();
-    method public abstract android.net.Uri getUri();
-    method public abstract boolean isDirectory();
-    method public static boolean isDocumentUri(android.content.Context, android.net.Uri);
-    method public abstract boolean isFile();
-    method public abstract long lastModified();
-    method public abstract long length();
-    method public abstract android.support.v4.provider.DocumentFile[] listFiles();
-    method public abstract boolean renameTo(java.lang.String);
-  }
-
-}
-
-package android.support.v4.text {
-
-  public final class BidiFormatter {
-    method public static android.support.v4.text.BidiFormatter getInstance();
-    method public static android.support.v4.text.BidiFormatter getInstance(boolean);
-    method public static android.support.v4.text.BidiFormatter getInstance(java.util.Locale);
-    method public boolean getStereoReset();
-    method public boolean isRtl(java.lang.String);
-    method public boolean isRtlContext();
-    method public java.lang.String unicodeWrap(java.lang.String, android.support.v4.text.TextDirectionHeuristicCompat, boolean);
-    method public java.lang.String unicodeWrap(java.lang.String, android.support.v4.text.TextDirectionHeuristicCompat);
-    method public java.lang.String unicodeWrap(java.lang.String, boolean);
-    method public java.lang.String unicodeWrap(java.lang.String);
-  }
-
-  public static final class BidiFormatter.Builder {
-    ctor public BidiFormatter.Builder();
-    ctor public BidiFormatter.Builder(boolean);
-    ctor public BidiFormatter.Builder(java.util.Locale);
-    method public android.support.v4.text.BidiFormatter build();
-    method public android.support.v4.text.BidiFormatter.Builder setTextDirectionHeuristic(android.support.v4.text.TextDirectionHeuristicCompat);
-    method public android.support.v4.text.BidiFormatter.Builder stereoReset(boolean);
-  }
-
-  public class ICUCompat {
-    ctor public ICUCompat();
-    method public static java.lang.String maximizeAndGetScript(java.util.Locale);
-  }
-
-  public abstract interface TextDirectionHeuristicCompat {
-    method public abstract boolean isRtl(char[], int, int);
-    method public abstract boolean isRtl(java.lang.CharSequence, int, int);
-  }
-
-  public class TextDirectionHeuristicsCompat {
-    ctor public TextDirectionHeuristicsCompat();
-    field public static final android.support.v4.text.TextDirectionHeuristicCompat ANYRTL_LTR;
-    field public static final android.support.v4.text.TextDirectionHeuristicCompat FIRSTSTRONG_LTR;
-    field public static final android.support.v4.text.TextDirectionHeuristicCompat FIRSTSTRONG_RTL;
-    field public static final android.support.v4.text.TextDirectionHeuristicCompat LOCALE;
-    field public static final android.support.v4.text.TextDirectionHeuristicCompat LTR;
-    field public static final android.support.v4.text.TextDirectionHeuristicCompat RTL;
-  }
-
-  public class TextUtilsCompat {
-    ctor public TextUtilsCompat();
-    method public static int getLayoutDirectionFromLocale(java.util.Locale);
-    method public static java.lang.String htmlEncode(java.lang.String);
-    field public static final java.util.Locale ROOT;
-  }
-
-}
-
-package android.support.v4.util {
-
-  public class ArrayMap extends android.support.v4.util.SimpleArrayMap implements java.util.Map {
-    ctor public ArrayMap();
-    ctor public ArrayMap(int);
-    ctor public ArrayMap(android.support.v4.util.SimpleArrayMap);
-    method public boolean containsAll(java.util.Collection<?>);
-    method public java.util.Set<java.util.Map.Entry<K, V>> entrySet();
-    method public java.util.Set<K> keySet();
-    method public void putAll(java.util.Map<? extends K, ? extends V>);
-    method public boolean removeAll(java.util.Collection<?>);
-    method public boolean retainAll(java.util.Collection<?>);
-    method public java.util.Collection<V> values();
-  }
-
-  public class AtomicFile {
-    ctor public AtomicFile(java.io.File);
-    method public void delete();
-    method public void failWrite(java.io.FileOutputStream);
-    method public void finishWrite(java.io.FileOutputStream);
-    method public java.io.File getBaseFile();
-    method public java.io.FileInputStream openRead() throws java.io.FileNotFoundException;
-    method public byte[] readFully() throws java.io.IOException;
-    method public java.io.FileOutputStream startWrite() throws java.io.IOException;
-  }
-
-  public final class CircularArray {
-    ctor public CircularArray();
-    ctor public CircularArray(int);
-    method public void addFirst(E);
-    method public void addLast(E);
-    method public void clear();
-    method public E get(int);
-    method public E getFirst();
-    method public E getLast();
-    method public boolean isEmpty();
-    method public E popFirst();
-    method public E popLast();
-    method public void removeFromEnd(int);
-    method public void removeFromStart(int);
-    method public int size();
-  }
-
-  public final class CircularIntArray {
-    ctor public CircularIntArray();
-    ctor public CircularIntArray(int);
-    method public void addFirst(int);
-    method public void addLast(int);
-    method public void clear();
-    method public int get(int);
-    method public int getFirst();
-    method public int getLast();
-    method public boolean isEmpty();
-    method public int popFirst();
-    method public int popLast();
-    method public void removeFromEnd(int);
-    method public void removeFromStart(int);
-    method public int size();
-  }
-
-  public class LongSparseArray {
-    ctor public LongSparseArray();
-    ctor public LongSparseArray(int);
-    method public void append(long, E);
-    method public void clear();
-    method public android.support.v4.util.LongSparseArray<E> clone();
-    method public void delete(long);
-    method public E get(long);
-    method public E get(long, E);
-    method public int indexOfKey(long);
-    method public int indexOfValue(E);
-    method public long keyAt(int);
-    method public void put(long, E);
-    method public void remove(long);
-    method public void removeAt(int);
-    method public void setValueAt(int, E);
-    method public int size();
-    method public E valueAt(int);
-  }
-
-  public class LruCache {
-    ctor public LruCache(int);
-    method protected V create(K);
-    method public final synchronized int createCount();
-    method protected void entryRemoved(boolean, K, V, V);
-    method public final void evictAll();
-    method public final synchronized int evictionCount();
-    method public final V get(K);
-    method public final synchronized int hitCount();
-    method public final synchronized int maxSize();
-    method public final synchronized int missCount();
-    method public final V put(K, V);
-    method public final synchronized int putCount();
-    method public final V remove(K);
-    method public void resize(int);
-    method public final synchronized int size();
-    method protected int sizeOf(K, V);
-    method public final synchronized java.util.Map<K, V> snapshot();
-    method public final synchronized java.lang.String toString();
-    method public void trimToSize(int);
-  }
-
-  public class Pair {
-    ctor public Pair(F, S);
-    method public static android.support.v4.util.Pair<A, B> create(A, B);
-    field public final F first;
-    field public final S second;
-  }
-
-  public final class Pools {
-  }
-
-  public static abstract interface Pools.Pool {
-    method public abstract T acquire();
-    method public abstract boolean release(T);
-  }
-
-  public static class Pools.SimplePool implements android.support.v4.util.Pools.Pool {
-    ctor public Pools.SimplePool(int);
-    method public T acquire();
-    method public boolean release(T);
-  }
-
-  public static class Pools.SynchronizedPool extends android.support.v4.util.Pools.SimplePool {
-    ctor public Pools.SynchronizedPool(int);
-  }
-
-  public class SimpleArrayMap {
-    ctor public SimpleArrayMap();
-    ctor public SimpleArrayMap(int);
-    ctor public SimpleArrayMap(android.support.v4.util.SimpleArrayMap);
-    method public void clear();
-    method public boolean containsKey(java.lang.Object);
-    method public boolean containsValue(java.lang.Object);
-    method public void ensureCapacity(int);
-    method public V get(java.lang.Object);
-    method public int indexOfKey(java.lang.Object);
-    method public boolean isEmpty();
-    method public K keyAt(int);
-    method public V put(K, V);
-    method public void putAll(android.support.v4.util.SimpleArrayMap<? extends K, ? extends V>);
-    method public V remove(java.lang.Object);
-    method public V removeAt(int);
-    method public V setValueAt(int, V);
-    method public int size();
-    method public V valueAt(int);
-  }
-
-  public class SparseArrayCompat {
-    ctor public SparseArrayCompat();
-    ctor public SparseArrayCompat(int);
-    method public void append(int, E);
-    method public void clear();
-    method public android.support.v4.util.SparseArrayCompat<E> clone();
-    method public void delete(int);
-    method public E get(int);
-    method public E get(int, E);
-    method public int indexOfKey(int);
-    method public int indexOfValue(E);
-    method public int keyAt(int);
-    method public void put(int, E);
-    method public void remove(int);
-    method public void removeAt(int);
-    method public void removeAtRange(int, int);
-    method public void setValueAt(int, E);
-    method public int size();
-    method public E valueAt(int);
-  }
-
-}
-
-package android.support.v4.view {
-
-  public class AccessibilityDelegateCompat {
-    ctor public AccessibilityDelegateCompat();
-    method public boolean dispatchPopulateAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
-    method public android.support.v4.view.accessibility.AccessibilityNodeProviderCompat getAccessibilityNodeProvider(android.view.View);
-    method public void onInitializeAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
-    method public void onInitializeAccessibilityNodeInfo(android.view.View, android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
-    method public void onPopulateAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
-    method public boolean onRequestSendAccessibilityEvent(android.view.ViewGroup, android.view.View, android.view.accessibility.AccessibilityEvent);
-    method public boolean performAccessibilityAction(android.view.View, int, android.os.Bundle);
-    method public void sendAccessibilityEvent(android.view.View, int);
-    method public void sendAccessibilityEventUnchecked(android.view.View, android.view.accessibility.AccessibilityEvent);
-  }
-
-  public abstract class ActionProvider {
-    ctor public ActionProvider(android.content.Context);
-    method public android.content.Context getContext();
-    method public boolean hasSubMenu();
-    method public boolean isVisible();
-    method public abstract android.view.View onCreateActionView();
-    method public android.view.View onCreateActionView(android.view.MenuItem);
-    method public boolean onPerformDefaultAction();
-    method public void onPrepareSubMenu(android.view.SubMenu);
-    method public boolean overridesItemVisibility();
-    method public void refreshVisibility();
-    method public void setVisibilityListener(android.support.v4.view.ActionProvider.VisibilityListener);
-  }
-
-  public static abstract interface ActionProvider.VisibilityListener {
-    method public abstract void onActionProviderVisibilityChanged(boolean);
-  }
-
-  public class GestureDetectorCompat {
-    ctor public GestureDetectorCompat(android.content.Context, android.view.GestureDetector.OnGestureListener);
-    ctor public GestureDetectorCompat(android.content.Context, android.view.GestureDetector.OnGestureListener, android.os.Handler);
-    method public boolean isLongpressEnabled();
-    method public boolean onTouchEvent(android.view.MotionEvent);
-    method public void setIsLongpressEnabled(boolean);
-    method public void setOnDoubleTapListener(android.view.GestureDetector.OnDoubleTapListener);
-  }
-
-  public class GravityCompat {
-    ctor public GravityCompat();
-    method public static void apply(int, int, int, android.graphics.Rect, android.graphics.Rect, int);
-    method public static void apply(int, int, int, android.graphics.Rect, int, int, android.graphics.Rect, int);
-    method public static void applyDisplay(int, android.graphics.Rect, android.graphics.Rect, int);
-    method public static int getAbsoluteGravity(int, int);
-    field public static final int END = 8388613; // 0x800005
-    field public static final int RELATIVE_HORIZONTAL_GRAVITY_MASK = 8388615; // 0x800007
-    field public static final int RELATIVE_LAYOUT_DIRECTION = 8388608; // 0x800000
-    field public static final int START = 8388611; // 0x800003
-  }
-
-  public class InputDeviceCompat {
-    ctor public InputDeviceCompat();
-    field public static final int SOURCE_ANY = -256; // 0xffffff00
-    field public static final int SOURCE_CLASS_BUTTON = 1; // 0x1
-    field public static final int SOURCE_CLASS_JOYSTICK = 16; // 0x10
-    field public static final int SOURCE_CLASS_MASK = 255; // 0xff
-    field public static final int SOURCE_CLASS_NONE = 0; // 0x0
-    field public static final int SOURCE_CLASS_POINTER = 2; // 0x2
-    field public static final int SOURCE_CLASS_POSITION = 8; // 0x8
-    field public static final int SOURCE_CLASS_TRACKBALL = 4; // 0x4
-    field public static final int SOURCE_DPAD = 513; // 0x201
-    field public static final int SOURCE_GAMEPAD = 1025; // 0x401
-    field public static final int SOURCE_HDMI = 33554433; // 0x2000001
-    field public static final int SOURCE_JOYSTICK = 16777232; // 0x1000010
-    field public static final int SOURCE_KEYBOARD = 257; // 0x101
-    field public static final int SOURCE_MOUSE = 8194; // 0x2002
-    field public static final int SOURCE_STYLUS = 16386; // 0x4002
-    field public static final int SOURCE_TOUCHPAD = 1048584; // 0x100008
-    field public static final int SOURCE_TOUCHSCREEN = 4098; // 0x1002
-    field public static final int SOURCE_TOUCH_NAVIGATION = 2097152; // 0x200000
-    field public static final int SOURCE_TRACKBALL = 65540; // 0x10004
-    field public static final int SOURCE_UNKNOWN = 0; // 0x0
-  }
-
-  public class KeyEventCompat {
-    ctor public KeyEventCompat();
-    method public static boolean dispatch(android.view.KeyEvent, android.view.KeyEvent.Callback, java.lang.Object, java.lang.Object);
-    method public static java.lang.Object getKeyDispatcherState(android.view.View);
-    method public static boolean hasModifiers(android.view.KeyEvent, int);
-    method public static boolean hasNoModifiers(android.view.KeyEvent);
-    method public static boolean isTracking(android.view.KeyEvent);
-    method public static boolean metaStateHasModifiers(int, int);
-    method public static boolean metaStateHasNoModifiers(int);
-    method public static int normalizeMetaState(int);
-    method public static void startTracking(android.view.KeyEvent);
-  }
-
-  public class LayoutInflaterCompat {
-    method public static void setFactory(android.view.LayoutInflater, android.support.v4.view.LayoutInflaterFactory);
-  }
-
-  public abstract interface LayoutInflaterFactory {
-    method public abstract android.view.View onCreateView(android.view.View, java.lang.String, android.content.Context, android.util.AttributeSet);
-  }
-
-  public class MarginLayoutParamsCompat {
-    ctor public MarginLayoutParamsCompat();
-    method public static int getLayoutDirection(android.view.ViewGroup.MarginLayoutParams);
-    method public static int getMarginEnd(android.view.ViewGroup.MarginLayoutParams);
-    method public static int getMarginStart(android.view.ViewGroup.MarginLayoutParams);
-    method public static boolean isMarginRelative(android.view.ViewGroup.MarginLayoutParams);
-    method public static void resolveLayoutDirection(android.view.ViewGroup.MarginLayoutParams, int);
-    method public static void setLayoutDirection(android.view.ViewGroup.MarginLayoutParams, int);
-    method public static void setMarginEnd(android.view.ViewGroup.MarginLayoutParams, int);
-    method public static void setMarginStart(android.view.ViewGroup.MarginLayoutParams, int);
-  }
-
-  public class MenuCompat {
-    ctor public MenuCompat();
-    method public static deprecated void setShowAsAction(android.view.MenuItem, int);
-  }
-
-  public class MenuItemCompat {
-    ctor public MenuItemCompat();
-    method public static boolean collapseActionView(android.view.MenuItem);
-    method public static boolean expandActionView(android.view.MenuItem);
-    method public static android.support.v4.view.ActionProvider getActionProvider(android.view.MenuItem);
-    method public static android.view.View getActionView(android.view.MenuItem);
-    method public static boolean isActionViewExpanded(android.view.MenuItem);
-    method public static android.view.MenuItem setActionProvider(android.view.MenuItem, android.support.v4.view.ActionProvider);
-    method public static android.view.MenuItem setActionView(android.view.MenuItem, android.view.View);
-    method public static android.view.MenuItem setActionView(android.view.MenuItem, int);
-    method public static android.view.MenuItem setOnActionExpandListener(android.view.MenuItem, android.support.v4.view.MenuItemCompat.OnActionExpandListener);
-    method public static void setShowAsAction(android.view.MenuItem, int);
-    field public static final int SHOW_AS_ACTION_ALWAYS = 2; // 0x2
-    field public static final int SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW = 8; // 0x8
-    field public static final int SHOW_AS_ACTION_IF_ROOM = 1; // 0x1
-    field public static final int SHOW_AS_ACTION_NEVER = 0; // 0x0
-    field public static final int SHOW_AS_ACTION_WITH_TEXT = 4; // 0x4
-  }
-
-  public static abstract interface MenuItemCompat.OnActionExpandListener {
-    method public abstract boolean onMenuItemActionCollapse(android.view.MenuItem);
-    method public abstract boolean onMenuItemActionExpand(android.view.MenuItem);
-  }
-
-  public class MotionEventCompat {
-    ctor public MotionEventCompat();
-    method public static int findPointerIndex(android.view.MotionEvent, int);
-    method public static int getActionIndex(android.view.MotionEvent);
-    method public static int getActionMasked(android.view.MotionEvent);
-    method public static float getAxisValue(android.view.MotionEvent, int);
-    method public static float getAxisValue(android.view.MotionEvent, int, int);
-    method public static int getPointerCount(android.view.MotionEvent);
-    method public static int getPointerId(android.view.MotionEvent, int);
-    method public static int getSource(android.view.MotionEvent);
-    method public static float getX(android.view.MotionEvent, int);
-    method public static float getY(android.view.MotionEvent, int);
-    field public static final int ACTION_HOVER_ENTER = 9; // 0x9
-    field public static final int ACTION_HOVER_EXIT = 10; // 0xa
-    field public static final int ACTION_HOVER_MOVE = 7; // 0x7
-    field public static final int ACTION_MASK = 255; // 0xff
-    field public static final int ACTION_POINTER_DOWN = 5; // 0x5
-    field public static final int ACTION_POINTER_INDEX_MASK = 65280; // 0xff00
-    field public static final int ACTION_POINTER_INDEX_SHIFT = 8; // 0x8
-    field public static final int ACTION_POINTER_UP = 6; // 0x6
-    field public static final int ACTION_SCROLL = 8; // 0x8
-    field public static final int AXIS_BRAKE = 23; // 0x17
-    field public static final int AXIS_DISTANCE = 24; // 0x18
-    field public static final int AXIS_GAS = 22; // 0x16
-    field public static final int AXIS_GENERIC_1 = 32; // 0x20
-    field public static final int AXIS_GENERIC_10 = 41; // 0x29
-    field public static final int AXIS_GENERIC_11 = 42; // 0x2a
-    field public static final int AXIS_GENERIC_12 = 43; // 0x2b
-    field public static final int AXIS_GENERIC_13 = 44; // 0x2c
-    field public static final int AXIS_GENERIC_14 = 45; // 0x2d
-    field public static final int AXIS_GENERIC_15 = 46; // 0x2e
-    field public static final int AXIS_GENERIC_16 = 47; // 0x2f
-    field public static final int AXIS_GENERIC_2 = 33; // 0x21
-    field public static final int AXIS_GENERIC_3 = 34; // 0x22
-    field public static final int AXIS_GENERIC_4 = 35; // 0x23
-    field public static final int AXIS_GENERIC_5 = 36; // 0x24
-    field public static final int AXIS_GENERIC_6 = 37; // 0x25
-    field public static final int AXIS_GENERIC_7 = 38; // 0x26
-    field public static final int AXIS_GENERIC_8 = 39; // 0x27
-    field public static final int AXIS_GENERIC_9 = 40; // 0x28
-    field public static final int AXIS_HAT_X = 15; // 0xf
-    field public static final int AXIS_HAT_Y = 16; // 0x10
-    field public static final int AXIS_HSCROLL = 10; // 0xa
-    field public static final int AXIS_LTRIGGER = 17; // 0x11
-    field public static final int AXIS_ORIENTATION = 8; // 0x8
-    field public static final int AXIS_PRESSURE = 2; // 0x2
-    field public static final int AXIS_RTRIGGER = 18; // 0x12
-    field public static final int AXIS_RUDDER = 20; // 0x14
-    field public static final int AXIS_RX = 12; // 0xc
-    field public static final int AXIS_RY = 13; // 0xd
-    field public static final int AXIS_RZ = 14; // 0xe
-    field public static final int AXIS_SIZE = 3; // 0x3
-    field public static final int AXIS_THROTTLE = 19; // 0x13
-    field public static final int AXIS_TILT = 25; // 0x19
-    field public static final int AXIS_TOOL_MAJOR = 6; // 0x6
-    field public static final int AXIS_TOOL_MINOR = 7; // 0x7
-    field public static final int AXIS_TOUCH_MAJOR = 4; // 0x4
-    field public static final int AXIS_TOUCH_MINOR = 5; // 0x5
-    field public static final int AXIS_VSCROLL = 9; // 0x9
-    field public static final int AXIS_WHEEL = 21; // 0x15
-    field public static final int AXIS_X = 0; // 0x0
-    field public static final int AXIS_Y = 1; // 0x1
-    field public static final int AXIS_Z = 11; // 0xb
-  }
-
-  public abstract interface NestedScrollingChild {
-    method public abstract boolean dispatchNestedFling(float, float, boolean);
-    method public abstract boolean dispatchNestedPreFling(float, float);
-    method public abstract boolean dispatchNestedPreScroll(int, int, int[], int[]);
-    method public abstract boolean dispatchNestedScroll(int, int, int, int, int[]);
-    method public abstract boolean hasNestedScrollingParent();
-    method public abstract boolean isNestedScrollingEnabled();
-    method public abstract void setNestedScrollingEnabled(boolean);
-    method public abstract boolean startNestedScroll(int);
-    method public abstract void stopNestedScroll();
-  }
-
-  public class NestedScrollingChildHelper {
-    ctor public NestedScrollingChildHelper(android.view.View);
-    method public boolean dispatchNestedFling(float, float, boolean);
-    method public boolean dispatchNestedPreFling(float, float);
-    method public boolean dispatchNestedPreScroll(int, int, int[], int[]);
-    method public boolean dispatchNestedScroll(int, int, int, int, int[]);
-    method public boolean hasNestedScrollingParent();
-    method public boolean isNestedScrollingEnabled();
-    method public void onDetachedFromWindow();
-    method public void onStopNestedScroll(android.view.View);
-    method public void setNestedScrollingEnabled(boolean);
-    method public boolean startNestedScroll(int);
-    method public void stopNestedScroll();
-  }
-
-  public abstract interface NestedScrollingParent {
-    method public abstract int getNestedScrollAxes();
-    method public abstract boolean onNestedFling(android.view.View, float, float, boolean);
-    method public abstract boolean onNestedPreFling(android.view.View, float, float);
-    method public abstract void onNestedPreScroll(android.view.View, int, int, int[]);
-    method public abstract void onNestedScroll(android.view.View, int, int, int, int);
-    method public abstract void onNestedScrollAccepted(android.view.View, android.view.View, int);
-    method public abstract boolean onStartNestedScroll(android.view.View, android.view.View, int);
-    method public abstract void onStopNestedScroll(android.view.View);
-  }
-
-  public class NestedScrollingParentHelper {
-    ctor public NestedScrollingParentHelper(android.view.ViewGroup);
-    method public int getNestedScrollAxes();
-    method public void onNestedScrollAccepted(android.view.View, android.view.View, int);
-    method public void onStopNestedScroll(android.view.View);
-  }
-
-  public abstract interface OnApplyWindowInsetsListener {
-    method public abstract android.support.v4.view.WindowInsetsCompat onApplyWindowInsets(android.view.View, android.support.v4.view.WindowInsetsCompat);
-  }
-
-  public abstract class PagerAdapter {
-    ctor public PagerAdapter();
-    method public void destroyItem(android.view.ViewGroup, int, java.lang.Object);
-    method public deprecated void destroyItem(android.view.View, int, java.lang.Object);
-    method public void finishUpdate(android.view.ViewGroup);
-    method public deprecated void finishUpdate(android.view.View);
-    method public abstract int getCount();
-    method public int getItemPosition(java.lang.Object);
-    method public java.lang.CharSequence getPageTitle(int);
-    method public float getPageWidth(int);
-    method public java.lang.Object instantiateItem(android.view.ViewGroup, int);
-    method public deprecated java.lang.Object instantiateItem(android.view.View, int);
-    method public abstract boolean isViewFromObject(android.view.View, java.lang.Object);
-    method public void notifyDataSetChanged();
-    method public void registerDataSetObserver(android.database.DataSetObserver);
-    method public void restoreState(android.os.Parcelable, java.lang.ClassLoader);
-    method public android.os.Parcelable saveState();
-    method public void setPrimaryItem(android.view.ViewGroup, int, java.lang.Object);
-    method public deprecated void setPrimaryItem(android.view.View, int, java.lang.Object);
-    method public void startUpdate(android.view.ViewGroup);
-    method public deprecated void startUpdate(android.view.View);
-    method public void unregisterDataSetObserver(android.database.DataSetObserver);
-    field public static final int POSITION_NONE = -2; // 0xfffffffe
-    field public static final int POSITION_UNCHANGED = -1; // 0xffffffff
-  }
-
-  public class PagerTabStrip extends android.support.v4.view.PagerTitleStrip {
-    ctor public PagerTabStrip(android.content.Context);
-    ctor public PagerTabStrip(android.content.Context, android.util.AttributeSet);
-    method public boolean getDrawFullUnderline();
-    method public int getTabIndicatorColor();
-    method public void setDrawFullUnderline(boolean);
-    method public void setTabIndicatorColor(int);
-    method public void setTabIndicatorColorResource(int);
-  }
-
-  public class PagerTitleStrip extends android.view.ViewGroup {
-    ctor public PagerTitleStrip(android.content.Context);
-    ctor public PagerTitleStrip(android.content.Context, android.util.AttributeSet);
-    method public int getTextSpacing();
-    method protected void onLayout(boolean, int, int, int, int);
-    method public void setGravity(int);
-    method public void setNonPrimaryAlpha(float);
-    method public void setTextColor(int);
-    method public void setTextSize(int, float);
-    method public void setTextSpacing(int);
-  }
-
-  public class ScaleGestureDetectorCompat {
-    method public static boolean isQuickScaleEnabled(java.lang.Object);
-    method public static void setQuickScaleEnabled(java.lang.Object, boolean);
-  }
-
-  public abstract interface ScrollingView {
-    method public abstract int computeHorizontalScrollExtent();
-    method public abstract int computeHorizontalScrollOffset();
-    method public abstract int computeHorizontalScrollRange();
-    method public abstract int computeVerticalScrollExtent();
-    method public abstract int computeVerticalScrollOffset();
-    method public abstract int computeVerticalScrollRange();
-  }
-
-  public class VelocityTrackerCompat {
-    ctor public VelocityTrackerCompat();
-    method public static float getXVelocity(android.view.VelocityTracker, int);
-    method public static float getYVelocity(android.view.VelocityTracker, int);
-  }
-
-  public class ViewCompat {
-    ctor public ViewCompat();
-    method public static android.support.v4.view.ViewPropertyAnimatorCompat animate(android.view.View);
-    method public static boolean canScrollHorizontally(android.view.View, int);
-    method public static boolean canScrollVertically(android.view.View, int);
-    method public static int combineMeasuredStates(int, int);
-    method public static android.support.v4.view.WindowInsetsCompat dispatchApplyWindowInsets(android.view.View, android.support.v4.view.WindowInsetsCompat);
-    method public static void dispatchFinishTemporaryDetach(android.view.View);
-    method public static boolean dispatchNestedFling(android.view.View, float, float, boolean);
-    method public static boolean dispatchNestedPreFling(android.view.View, float, float);
-    method public static boolean dispatchNestedPreScroll(android.view.View, int, int, int[], int[]);
-    method public static boolean dispatchNestedScroll(android.view.View, int, int, int, int, int[]);
-    method public static void dispatchStartTemporaryDetach(android.view.View);
-    method public static int getAccessibilityLiveRegion(android.view.View);
-    method public static android.support.v4.view.accessibility.AccessibilityNodeProviderCompat getAccessibilityNodeProvider(android.view.View);
-    method public static float getAlpha(android.view.View);
-    method public static android.content.res.ColorStateList getBackgroundTintList(android.view.View);
-    method public static android.graphics.PorterDuff.Mode getBackgroundTintMode(android.view.View);
-    method public static android.graphics.Rect getClipBounds(android.view.View);
-    method public static float getElevation(android.view.View);
-    method public static boolean getFitsSystemWindows(android.view.View);
-    method public static int getImportantForAccessibility(android.view.View);
-    method public static int getLabelFor(android.view.View);
-    method public static int getLayerType(android.view.View);
-    method public static int getLayoutDirection(android.view.View);
-    method public static int getMeasuredHeightAndState(android.view.View);
-    method public static int getMeasuredState(android.view.View);
-    method public static int getMeasuredWidthAndState(android.view.View);
-    method public static int getMinimumHeight(android.view.View);
-    method public static int getMinimumWidth(android.view.View);
-    method public static int getOverScrollMode(android.view.View);
-    method public static int getPaddingEnd(android.view.View);
-    method public static int getPaddingStart(android.view.View);
-    method public static android.view.ViewParent getParentForAccessibility(android.view.View);
-    method public static float getPivotX(android.view.View);
-    method public static float getPivotY(android.view.View);
-    method public static float getRotation(android.view.View);
-    method public static float getRotationX(android.view.View);
-    method public static float getRotationY(android.view.View);
-    method public static float getScaleX(android.view.View);
-    method public static float getScaleY(android.view.View);
-    method public static java.lang.String getTransitionName(android.view.View);
-    method public static float getTranslationX(android.view.View);
-    method public static float getTranslationY(android.view.View);
-    method public static float getTranslationZ(android.view.View);
-    method public static int getWindowSystemUiVisibility(android.view.View);
-    method public static float getX(android.view.View);
-    method public static float getY(android.view.View);
-    method public static float getZ(android.view.View);
-    method public static boolean hasAccessibilityDelegate(android.view.View);
-    method public static boolean hasNestedScrollingParent(android.view.View);
-    method public static boolean hasOverlappingRendering(android.view.View);
-    method public static boolean hasTransientState(android.view.View);
-    method public static boolean isAttachedToWindow(android.view.View);
-    method public static boolean isLaidOut(android.view.View);
-    method public static boolean isNestedScrollingEnabled(android.view.View);
-    method public static boolean isOpaque(android.view.View);
-    method public static boolean isPaddingRelative(android.view.View);
-    method public static void jumpDrawablesToCurrentState(android.view.View);
-    method public static void offsetLeftAndRight(android.view.View, int);
-    method public static void offsetTopAndBottom(android.view.View, int);
-    method public static android.support.v4.view.WindowInsetsCompat onApplyWindowInsets(android.view.View, android.support.v4.view.WindowInsetsCompat);
-    method public static void onInitializeAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
-    method public static void onInitializeAccessibilityNodeInfo(android.view.View, android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
-    method public static void onPopulateAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
-    method public static boolean performAccessibilityAction(android.view.View, int, android.os.Bundle);
-    method public static void postInvalidateOnAnimation(android.view.View);
-    method public static void postInvalidateOnAnimation(android.view.View, int, int, int, int);
-    method public static void postOnAnimation(android.view.View, java.lang.Runnable);
-    method public static void postOnAnimationDelayed(android.view.View, java.lang.Runnable, long);
-    method public static void requestApplyInsets(android.view.View);
-    method public static int resolveSizeAndState(int, int, int);
-    method public static void setAccessibilityDelegate(android.view.View, android.support.v4.view.AccessibilityDelegateCompat);
-    method public static void setAccessibilityLiveRegion(android.view.View, int);
-    method public static void setActivated(android.view.View, boolean);
-    method public static void setAlpha(android.view.View, float);
-    method public static void setBackgroundTintList(android.view.View, android.content.res.ColorStateList);
-    method public static void setBackgroundTintMode(android.view.View, android.graphics.PorterDuff.Mode);
-    method public static void setChildrenDrawingOrderEnabled(android.view.ViewGroup, boolean);
-    method public static void setClipBounds(android.view.View, android.graphics.Rect);
-    method public static void setElevation(android.view.View, float);
-    method public static void setFitsSystemWindows(android.view.View, boolean);
-    method public static void setHasTransientState(android.view.View, boolean);
-    method public static void setImportantForAccessibility(android.view.View, int);
-    method public static void setLabelFor(android.view.View, int);
-    method public static void setLayerPaint(android.view.View, android.graphics.Paint);
-    method public static void setLayerType(android.view.View, int, android.graphics.Paint);
-    method public static void setLayoutDirection(android.view.View, int);
-    method public static void setNestedScrollingEnabled(android.view.View, boolean);
-    method public static void setOnApplyWindowInsetsListener(android.view.View, android.support.v4.view.OnApplyWindowInsetsListener);
-    method public static void setOverScrollMode(android.view.View, int);
-    method public static void setPaddingRelative(android.view.View, int, int, int, int);
-    method public static void setPivotX(android.view.View, float);
-    method public static void setPivotY(android.view.View, float);
-    method public static void setRotation(android.view.View, float);
-    method public static void setRotationX(android.view.View, float);
-    method public static void setRotationY(android.view.View, float);
-    method public static void setSaveFromParentEnabled(android.view.View, boolean);
-    method public static void setScaleX(android.view.View, float);
-    method public static void setScaleY(android.view.View, float);
-    method public static void setTransitionName(android.view.View, java.lang.String);
-    method public static void setTranslationX(android.view.View, float);
-    method public static void setTranslationY(android.view.View, float);
-    method public static void setTranslationZ(android.view.View, float);
-    method public static void setX(android.view.View, float);
-    method public static void setY(android.view.View, float);
-    method public static boolean startNestedScroll(android.view.View, int);
-    method public static void stopNestedScroll(android.view.View);
-    field public static final int ACCESSIBILITY_LIVE_REGION_ASSERTIVE = 2; // 0x2
-    field public static final int ACCESSIBILITY_LIVE_REGION_NONE = 0; // 0x0
-    field public static final int ACCESSIBILITY_LIVE_REGION_POLITE = 1; // 0x1
-    field public static final int IMPORTANT_FOR_ACCESSIBILITY_AUTO = 0; // 0x0
-    field public static final int IMPORTANT_FOR_ACCESSIBILITY_NO = 2; // 0x2
-    field public static final int IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS = 4; // 0x4
-    field public static final int IMPORTANT_FOR_ACCESSIBILITY_YES = 1; // 0x1
-    field public static final int LAYER_TYPE_HARDWARE = 2; // 0x2
-    field public static final int LAYER_TYPE_NONE = 0; // 0x0
-    field public static final int LAYER_TYPE_SOFTWARE = 1; // 0x1
-    field public static final int LAYOUT_DIRECTION_INHERIT = 2; // 0x2
-    field public static final int LAYOUT_DIRECTION_LOCALE = 3; // 0x3
-    field public static final int LAYOUT_DIRECTION_LTR = 0; // 0x0
-    field public static final int LAYOUT_DIRECTION_RTL = 1; // 0x1
-    field public static final int MEASURED_HEIGHT_STATE_SHIFT = 16; // 0x10
-    field public static final int MEASURED_SIZE_MASK = 16777215; // 0xffffff
-    field public static final int MEASURED_STATE_MASK = -16777216; // 0xff000000
-    field public static final int MEASURED_STATE_TOO_SMALL = 16777216; // 0x1000000
-    field public static final int OVER_SCROLL_ALWAYS = 0; // 0x0
-    field public static final int OVER_SCROLL_IF_CONTENT_SCROLLS = 1; // 0x1
-    field public static final int OVER_SCROLL_NEVER = 2; // 0x2
-    field public static final int SCROLL_AXIS_HORIZONTAL = 1; // 0x1
-    field public static final int SCROLL_AXIS_NONE = 0; // 0x0
-    field public static final int SCROLL_AXIS_VERTICAL = 2; // 0x2
-  }
-
-  public class ViewConfigurationCompat {
-    ctor public ViewConfigurationCompat();
-    method public static int getScaledPagingTouchSlop(android.view.ViewConfiguration);
-    method public static boolean hasPermanentMenuKey(android.view.ViewConfiguration);
-  }
-
-  public class ViewGroupCompat {
-    method public static int getLayoutMode(android.view.ViewGroup);
-    method public static int getNestedScrollAxes(android.view.ViewGroup);
-    method public static boolean isTransitionGroup(android.view.ViewGroup);
-    method public static boolean onRequestSendAccessibilityEvent(android.view.ViewGroup, android.view.View, android.view.accessibility.AccessibilityEvent);
-    method public static void setLayoutMode(android.view.ViewGroup, int);
-    method public static void setMotionEventSplittingEnabled(android.view.ViewGroup, boolean);
-    method public static void setTransitionGroup(android.view.ViewGroup, boolean);
-    field public static final int LAYOUT_MODE_CLIP_BOUNDS = 0; // 0x0
-    field public static final int LAYOUT_MODE_OPTICAL_BOUNDS = 1; // 0x1
-  }
-
-  public class ViewPager extends android.view.ViewGroup {
-    ctor public ViewPager(android.content.Context);
-    ctor public ViewPager(android.content.Context, android.util.AttributeSet);
-    method public void addOnPageChangeListener(android.support.v4.view.ViewPager.OnPageChangeListener);
-    method public boolean arrowScroll(int);
-    method public boolean beginFakeDrag();
-    method protected boolean canScroll(android.view.View, boolean, int, int, int);
-    method public void clearOnPageChangeListeners();
-    method public void endFakeDrag();
-    method public boolean executeKeyEvent(android.view.KeyEvent);
-    method public void fakeDragBy(float);
-    method public android.support.v4.view.PagerAdapter getAdapter();
-    method public int getCurrentItem();
-    method public int getOffscreenPageLimit();
-    method public int getPageMargin();
-    method public boolean isFakeDragging();
-    method protected void onLayout(boolean, int, int, int, int);
-    method protected void onPageScrolled(int, float, int);
-    method public void onRestoreInstanceState(android.os.Parcelable);
-    method public android.os.Parcelable onSaveInstanceState();
-    method public void removeOnPageChangeListener(android.support.v4.view.ViewPager.OnPageChangeListener);
-    method public void setAdapter(android.support.v4.view.PagerAdapter);
-    method public void setCurrentItem(int);
-    method public void setCurrentItem(int, boolean);
-    method public void setOffscreenPageLimit(int);
-    method public deprecated void setOnPageChangeListener(android.support.v4.view.ViewPager.OnPageChangeListener);
-    method public void setPageMargin(int);
-    method public void setPageMarginDrawable(android.graphics.drawable.Drawable);
-    method public void setPageMarginDrawable(int);
-    method public void setPageTransformer(boolean, android.support.v4.view.ViewPager.PageTransformer);
-    field public static final int SCROLL_STATE_DRAGGING = 1; // 0x1
-    field public static final int SCROLL_STATE_IDLE = 0; // 0x0
-    field public static final int SCROLL_STATE_SETTLING = 2; // 0x2
-  }
-
-  public static class ViewPager.LayoutParams extends android.view.ViewGroup.LayoutParams {
-    ctor public ViewPager.LayoutParams();
-    ctor public ViewPager.LayoutParams(android.content.Context, android.util.AttributeSet);
-    field public int gravity;
-    field public boolean isDecor;
-  }
-
-  public static abstract interface ViewPager.OnPageChangeListener {
-    method public abstract void onPageScrollStateChanged(int);
-    method public abstract void onPageScrolled(int, float, int);
-    method public abstract void onPageSelected(int);
-  }
-
-  public static abstract interface ViewPager.PageTransformer {
-    method public abstract void transformPage(android.view.View, float);
-  }
-
-  public static class ViewPager.SavedState extends android.view.View.BaseSavedState {
-    ctor public ViewPager.SavedState(android.os.Parcelable);
-    field public static final android.os.Parcelable.Creator<android.support.v4.view.ViewPager.SavedState> CREATOR;
-  }
-
-  public static class ViewPager.SimpleOnPageChangeListener implements android.support.v4.view.ViewPager.OnPageChangeListener {
-    ctor public ViewPager.SimpleOnPageChangeListener();
-    method public void onPageScrollStateChanged(int);
-    method public void onPageScrolled(int, float, int);
-    method public void onPageSelected(int);
-  }
-
-  public class ViewParentCompat {
-    method public static void notifySubtreeAccessibilityStateChanged(android.view.ViewParent, android.view.View, android.view.View, int);
-    method public static boolean onNestedFling(android.view.ViewParent, android.view.View, float, float, boolean);
-    method public static boolean onNestedPreFling(android.view.ViewParent, android.view.View, float, float);
-    method public static void onNestedPreScroll(android.view.ViewParent, android.view.View, int, int, int[]);
-    method public static void onNestedScroll(android.view.ViewParent, android.view.View, int, int, int, int);
-    method public static void onNestedScrollAccepted(android.view.ViewParent, android.view.View, android.view.View, int);
-    method public static boolean onStartNestedScroll(android.view.ViewParent, android.view.View, android.view.View, int);
-    method public static void onStopNestedScroll(android.view.ViewParent, android.view.View);
-    method public static boolean requestSendAccessibilityEvent(android.view.ViewParent, android.view.View, android.view.accessibility.AccessibilityEvent);
-  }
-
-  public class ViewPropertyAnimatorCompat {
-    method public android.support.v4.view.ViewPropertyAnimatorCompat alpha(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat alphaBy(float);
-    method public void cancel();
-    method public long getDuration();
-    method public android.view.animation.Interpolator getInterpolator();
-    method public long getStartDelay();
-    method public android.support.v4.view.ViewPropertyAnimatorCompat rotation(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat rotationBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat rotationX(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat rotationXBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat rotationY(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat rotationYBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat scaleX(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat scaleXBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat scaleY(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat scaleYBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat setDuration(long);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat setInterpolator(android.view.animation.Interpolator);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat setListener(android.support.v4.view.ViewPropertyAnimatorListener);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat setStartDelay(long);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat setUpdateListener(android.support.v4.view.ViewPropertyAnimatorUpdateListener);
-    method public void start();
-    method public android.support.v4.view.ViewPropertyAnimatorCompat translationX(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat translationXBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat translationY(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat translationYBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat translationZ(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat translationZBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat withEndAction(java.lang.Runnable);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat withLayer();
-    method public android.support.v4.view.ViewPropertyAnimatorCompat withStartAction(java.lang.Runnable);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat x(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat xBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat y(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat yBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat z(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat zBy(float);
-  }
-
-  public abstract interface ViewPropertyAnimatorListener {
-    method public abstract void onAnimationCancel(android.view.View);
-    method public abstract void onAnimationEnd(android.view.View);
-    method public abstract void onAnimationStart(android.view.View);
-  }
-
-  public class ViewPropertyAnimatorListenerAdapter implements android.support.v4.view.ViewPropertyAnimatorListener {
-    ctor public ViewPropertyAnimatorListenerAdapter();
-    method public void onAnimationCancel(android.view.View);
-    method public void onAnimationEnd(android.view.View);
-    method public void onAnimationStart(android.view.View);
-  }
-
-  public abstract interface ViewPropertyAnimatorUpdateListener {
-    method public abstract void onAnimationUpdate(android.view.View);
-  }
-
-  public class WindowCompat {
-    ctor public WindowCompat();
-    field public static final int FEATURE_ACTION_BAR = 8; // 0x8
-    field public static final int FEATURE_ACTION_BAR_OVERLAY = 9; // 0x9
-    field public static final int FEATURE_ACTION_MODE_OVERLAY = 10; // 0xa
-  }
-
-  public class WindowInsetsCompat {
-    method public android.support.v4.view.WindowInsetsCompat consumeStableInsets();
-    method public android.support.v4.view.WindowInsetsCompat consumeSystemWindowInsets();
-    method public int getStableInsetBottom();
-    method public int getStableInsetLeft();
-    method public int getStableInsetRight();
-    method public int getStableInsetTop();
-    method public int getSystemWindowInsetBottom();
-    method public int getSystemWindowInsetLeft();
-    method public int getSystemWindowInsetRight();
-    method public int getSystemWindowInsetTop();
-    method public boolean hasInsets();
-    method public boolean hasStableInsets();
-    method public boolean hasSystemWindowInsets();
-    method public boolean isConsumed();
-    method public boolean isRound();
-    method public android.support.v4.view.WindowInsetsCompat replaceSystemWindowInsets(int, int, int, int);
-    method public android.support.v4.view.WindowInsetsCompat replaceSystemWindowInsets(android.graphics.Rect);
-  }
-
-}
-
-package android.support.v4.view.accessibility {
-
-  public class AccessibilityEventCompat {
-    method public static void appendRecord(android.view.accessibility.AccessibilityEvent, android.support.v4.view.accessibility.AccessibilityRecordCompat);
-    method public static android.support.v4.view.accessibility.AccessibilityRecordCompat asRecord(android.view.accessibility.AccessibilityEvent);
-    method public static int getContentChangeTypes(android.view.accessibility.AccessibilityEvent);
-    method public static android.support.v4.view.accessibility.AccessibilityRecordCompat getRecord(android.view.accessibility.AccessibilityEvent, int);
-    method public static int getRecordCount(android.view.accessibility.AccessibilityEvent);
-    method public static void setContentChangeTypes(android.view.accessibility.AccessibilityEvent, int);
-    field public static final int CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION = 4; // 0x4
-    field public static final int CONTENT_CHANGE_TYPE_SUBTREE = 1; // 0x1
-    field public static final int CONTENT_CHANGE_TYPE_TEXT = 2; // 0x2
-    field public static final int CONTENT_CHANGE_TYPE_UNDEFINED = 0; // 0x0
-    field public static final int TYPES_ALL_MASK = -1; // 0xffffffff
-    field public static final int TYPE_ANNOUNCEMENT = 16384; // 0x4000
-    field public static final int TYPE_GESTURE_DETECTION_END = 524288; // 0x80000
-    field public static final int TYPE_GESTURE_DETECTION_START = 262144; // 0x40000
-    field public static final int TYPE_TOUCH_EXPLORATION_GESTURE_END = 1024; // 0x400
-    field public static final int TYPE_TOUCH_EXPLORATION_GESTURE_START = 512; // 0x200
-    field public static final int TYPE_TOUCH_INTERACTION_END = 2097152; // 0x200000
-    field public static final int TYPE_TOUCH_INTERACTION_START = 1048576; // 0x100000
-    field public static final int TYPE_VIEW_ACCESSIBILITY_FOCUSED = 32768; // 0x8000
-    field public static final int TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED = 65536; // 0x10000
-    field public static final int TYPE_VIEW_HOVER_ENTER = 128; // 0x80
-    field public static final int TYPE_VIEW_HOVER_EXIT = 256; // 0x100
-    field public static final int TYPE_VIEW_SCROLLED = 4096; // 0x1000
-    field public static final int TYPE_VIEW_TEXT_SELECTION_CHANGED = 8192; // 0x2000
-    field public static final int TYPE_VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITY = 131072; // 0x20000
-    field public static final int TYPE_WINDOW_CONTENT_CHANGED = 2048; // 0x800
-  }
-
-  public class AccessibilityManagerCompat {
-    ctor public AccessibilityManagerCompat();
-    method public static boolean addAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager, android.support.v4.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat);
-    method public static java.util.List<android.accessibilityservice.AccessibilityServiceInfo> getEnabledAccessibilityServiceList(android.view.accessibility.AccessibilityManager, int);
-    method public static java.util.List<android.accessibilityservice.AccessibilityServiceInfo> getInstalledAccessibilityServiceList(android.view.accessibility.AccessibilityManager);
-    method public static boolean isTouchExplorationEnabled(android.view.accessibility.AccessibilityManager);
-    method public static boolean removeAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager, android.support.v4.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat);
-  }
-
-  public static abstract class AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat {
-    ctor public AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat();
-    method public abstract void onAccessibilityStateChanged(boolean);
-  }
-
-  public class AccessibilityNodeInfoCompat {
-    ctor public AccessibilityNodeInfoCompat(java.lang.Object);
-    method public void addAction(int);
-    method public void addAction(android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat);
-    method public void addChild(android.view.View);
-    method public void addChild(android.view.View, int);
-    method public boolean canOpenPopup();
-    method public java.util.List<android.support.v4.view.accessibility.AccessibilityNodeInfoCompat> findAccessibilityNodeInfosByText(java.lang.String);
-    method public java.util.List<android.support.v4.view.accessibility.AccessibilityNodeInfoCompat> findAccessibilityNodeInfosByViewId(java.lang.String);
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat findFocus(int);
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat focusSearch(int);
-    method public java.util.List<android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat> getActionList();
-    method public int getActions();
-    method public void getBoundsInParent(android.graphics.Rect);
-    method public void getBoundsInScreen(android.graphics.Rect);
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getChild(int);
-    method public int getChildCount();
-    method public java.lang.CharSequence getClassName();
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat getCollectionInfo();
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat getCollectionItemInfo();
-    method public java.lang.CharSequence getContentDescription();
-    method public java.lang.CharSequence getError();
-    method public android.os.Bundle getExtras();
-    method public java.lang.Object getInfo();
-    method public int getInputType();
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getLabelFor();
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getLabeledBy();
-    method public int getLiveRegion();
-    method public int getMaxTextLength();
-    method public int getMovementGranularities();
-    method public java.lang.CharSequence getPackageName();
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getParent();
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat getRangeInfo();
-    method public java.lang.CharSequence getText();
-    method public int getTextSelectionEnd();
-    method public int getTextSelectionStart();
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getTraversalAfter();
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getTraversalBefore();
-    method public java.lang.String getViewIdResourceName();
-    method public android.support.v4.view.accessibility.AccessibilityWindowInfoCompat getWindow();
-    method public int getWindowId();
-    method public boolean isAccessibilityFocused();
-    method public boolean isCheckable();
-    method public boolean isChecked();
-    method public boolean isClickable();
-    method public boolean isContentInvalid();
-    method public boolean isDismissable();
-    method public boolean isEditable();
-    method public boolean isEnabled();
-    method public boolean isFocusable();
-    method public boolean isFocused();
-    method public boolean isLongClickable();
-    method public boolean isMultiLine();
-    method public boolean isPassword();
-    method public boolean isScrollable();
-    method public boolean isSelected();
-    method public boolean isVisibleToUser();
-    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat obtain(android.view.View);
-    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat obtain(android.view.View, int);
-    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat obtain();
-    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat obtain(android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
-    method public boolean performAction(int);
-    method public boolean performAction(int, android.os.Bundle);
-    method public void recycle();
-    method public boolean refresh();
-    method public boolean removeAction(android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat);
-    method public boolean removeChild(android.view.View);
-    method public boolean removeChild(android.view.View, int);
-    method public void setAccessibilityFocused(boolean);
-    method public void setBoundsInParent(android.graphics.Rect);
-    method public void setBoundsInScreen(android.graphics.Rect);
-    method public void setCanOpenPopup(boolean);
-    method public void setCheckable(boolean);
-    method public void setChecked(boolean);
-    method public void setClassName(java.lang.CharSequence);
-    method public void setClickable(boolean);
-    method public void setCollectionInfo(java.lang.Object);
-    method public void setCollectionItemInfo(java.lang.Object);
-    method public void setContentDescription(java.lang.CharSequence);
-    method public void setContentInvalid(boolean);
-    method public void setDismissable(boolean);
-    method public void setEditable(boolean);
-    method public void setEnabled(boolean);
-    method public void setError(java.lang.CharSequence);
-    method public void setFocusable(boolean);
-    method public void setFocused(boolean);
-    method public void setInputType(int);
-    method public void setLabelFor(android.view.View);
-    method public void setLabelFor(android.view.View, int);
-    method public void setLabeledBy(android.view.View);
-    method public void setLabeledBy(android.view.View, int);
-    method public void setLiveRegion(int);
-    method public void setLongClickable(boolean);
-    method public void setMaxTextLength(int);
-    method public void setMovementGranularities(int);
-    method public void setMultiLine(boolean);
-    method public void setPackageName(java.lang.CharSequence);
-    method public void setParent(android.view.View);
-    method public void setParent(android.view.View, int);
-    method public void setPassword(boolean);
-    method public void setRangeInfo(android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat);
-    method public void setScrollable(boolean);
-    method public void setSelected(boolean);
-    method public void setSource(android.view.View);
-    method public void setSource(android.view.View, int);
-    method public void setText(java.lang.CharSequence);
-    method public void setTextSelection(int, int);
-    method public void setTraversalAfter(android.view.View);
-    method public void setTraversalAfter(android.view.View, int);
-    method public void setTraversalBefore(android.view.View);
-    method public void setTraversalBefore(android.view.View, int);
-    method public void setViewIdResourceName(java.lang.String);
-    method public void setVisibleToUser(boolean);
-    field public static final int ACTION_ACCESSIBILITY_FOCUS = 64; // 0x40
-    field public static final java.lang.String ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN = "ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN";
-    field public static final java.lang.String ACTION_ARGUMENT_HTML_ELEMENT_STRING = "ACTION_ARGUMENT_HTML_ELEMENT_STRING";
-    field public static final java.lang.String ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT = "ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT";
-    field public static final java.lang.String ACTION_ARGUMENT_SELECTION_END_INT = "ACTION_ARGUMENT_SELECTION_END_INT";
-    field public static final java.lang.String ACTION_ARGUMENT_SELECTION_START_INT = "ACTION_ARGUMENT_SELECTION_START_INT";
-    field public static final java.lang.String ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE = "ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE";
-    field public static final int ACTION_CLEAR_ACCESSIBILITY_FOCUS = 128; // 0x80
-    field public static final int ACTION_CLEAR_FOCUS = 2; // 0x2
-    field public static final int ACTION_CLEAR_SELECTION = 8; // 0x8
-    field public static final int ACTION_CLICK = 16; // 0x10
-    field public static final int ACTION_COLLAPSE = 524288; // 0x80000
-    field public static final int ACTION_COPY = 16384; // 0x4000
-    field public static final int ACTION_CUT = 65536; // 0x10000
-    field public static final int ACTION_DISMISS = 1048576; // 0x100000
-    field public static final int ACTION_EXPAND = 262144; // 0x40000
-    field public static final int ACTION_FOCUS = 1; // 0x1
-    field public static final int ACTION_LONG_CLICK = 32; // 0x20
-    field public static final int ACTION_NEXT_AT_MOVEMENT_GRANULARITY = 256; // 0x100
-    field public static final int ACTION_NEXT_HTML_ELEMENT = 1024; // 0x400
-    field public static final int ACTION_PASTE = 32768; // 0x8000
-    field public static final int ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY = 512; // 0x200
-    field public static final int ACTION_PREVIOUS_HTML_ELEMENT = 2048; // 0x800
-    field public static final int ACTION_SCROLL_BACKWARD = 8192; // 0x2000
-    field public static final int ACTION_SCROLL_FORWARD = 4096; // 0x1000
-    field public static final int ACTION_SELECT = 4; // 0x4
-    field public static final int ACTION_SET_SELECTION = 131072; // 0x20000
-    field public static final int ACTION_SET_TEXT = 2097152; // 0x200000
-    field public static final int FOCUS_ACCESSIBILITY = 2; // 0x2
-    field public static final int FOCUS_INPUT = 1; // 0x1
-    field public static final int MOVEMENT_GRANULARITY_CHARACTER = 1; // 0x1
-    field public static final int MOVEMENT_GRANULARITY_LINE = 4; // 0x4
-    field public static final int MOVEMENT_GRANULARITY_PAGE = 16; // 0x10
-    field public static final int MOVEMENT_GRANULARITY_PARAGRAPH = 8; // 0x8
-    field public static final int MOVEMENT_GRANULARITY_WORD = 2; // 0x2
-  }
-
-  public static class AccessibilityNodeInfoCompat.AccessibilityActionCompat {
-    ctor public AccessibilityNodeInfoCompat.AccessibilityActionCompat(int, java.lang.CharSequence);
-    method public int getId();
-    method public java.lang.CharSequence getLabel();
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_ACCESSIBILITY_FOCUS;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_CLEAR_ACCESSIBILITY_FOCUS;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_CLEAR_FOCUS;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_CLEAR_SELECTION;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_CLICK;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_COLLAPSE;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_COPY;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_CUT;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_DISMISS;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_EXPAND;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_FOCUS;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_LONG_CLICK;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_NEXT_AT_MOVEMENT_GRANULARITY;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_NEXT_HTML_ELEMENT;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PASTE;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PREVIOUS_HTML_ELEMENT;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_SCROLL_BACKWARD;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_SCROLL_FORWARD;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_SELECT;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_SET_SELECTION;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_SET_TEXT;
-  }
-
-  public static class AccessibilityNodeInfoCompat.CollectionInfoCompat {
-    method public int getColumnCount();
-    method public int getRowCount();
-    method public boolean isHierarchical();
-    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat obtain(int, int, boolean, int);
-    field public static final int SELECTION_MODE_MULTIPLE = 2; // 0x2
-    field public static final int SELECTION_MODE_NONE = 0; // 0x0
-    field public static final int SELECTION_MODE_SINGLE = 1; // 0x1
-  }
-
-  public static class AccessibilityNodeInfoCompat.CollectionItemInfoCompat {
-    method public int getColumnIndex();
-    method public int getColumnSpan();
-    method public int getRowIndex();
-    method public int getRowSpan();
-    method public boolean isHeading();
-    method public boolean isSelected();
-    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat obtain(int, int, int, int, boolean, boolean);
-  }
-
-  public static class AccessibilityNodeInfoCompat.RangeInfoCompat {
-    method public float getCurrent();
-    method public float getMax();
-    method public float getMin();
-    method public int getType();
-    field public static final int RANGE_TYPE_FLOAT = 1; // 0x1
-    field public static final int RANGE_TYPE_INT = 0; // 0x0
-    field public static final int RANGE_TYPE_PERCENT = 2; // 0x2
-  }
-
-  public class AccessibilityNodeProviderCompat {
-    ctor public AccessibilityNodeProviderCompat();
-    ctor public AccessibilityNodeProviderCompat(java.lang.Object);
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat createAccessibilityNodeInfo(int);
-    method public java.util.List<android.support.v4.view.accessibility.AccessibilityNodeInfoCompat> findAccessibilityNodeInfosByText(java.lang.String, int);
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat findFocus(int);
-    method public java.lang.Object getProvider();
-    method public boolean performAction(int, int, android.os.Bundle);
-  }
-
-  public class AccessibilityRecordCompat {
-    ctor public deprecated AccessibilityRecordCompat(java.lang.Object);
-    method public int getAddedCount();
-    method public java.lang.CharSequence getBeforeText();
-    method public java.lang.CharSequence getClassName();
-    method public java.lang.CharSequence getContentDescription();
-    method public int getCurrentItemIndex();
-    method public int getFromIndex();
-    method public deprecated java.lang.Object getImpl();
-    method public int getItemCount();
-    method public int getMaxScrollX();
-    method public int getMaxScrollY();
-    method public android.os.Parcelable getParcelableData();
-    method public int getRemovedCount();
-    method public int getScrollX();
-    method public int getScrollY();
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getSource();
-    method public java.util.List<java.lang.CharSequence> getText();
-    method public int getToIndex();
-    method public int getWindowId();
-    method public boolean isChecked();
-    method public boolean isEnabled();
-    method public boolean isFullScreen();
-    method public boolean isPassword();
-    method public boolean isScrollable();
-    method public static android.support.v4.view.accessibility.AccessibilityRecordCompat obtain(android.support.v4.view.accessibility.AccessibilityRecordCompat);
-    method public static android.support.v4.view.accessibility.AccessibilityRecordCompat obtain();
-    method public void recycle();
-    method public void setAddedCount(int);
-    method public void setBeforeText(java.lang.CharSequence);
-    method public void setChecked(boolean);
-    method public void setClassName(java.lang.CharSequence);
-    method public void setContentDescription(java.lang.CharSequence);
-    method public void setCurrentItemIndex(int);
-    method public void setEnabled(boolean);
-    method public void setFromIndex(int);
-    method public void setFullScreen(boolean);
-    method public void setItemCount(int);
-    method public void setMaxScrollX(int);
-    method public void setMaxScrollY(int);
-    method public void setParcelableData(android.os.Parcelable);
-    method public void setPassword(boolean);
-    method public void setRemovedCount(int);
-    method public void setScrollX(int);
-    method public void setScrollY(int);
-    method public void setScrollable(boolean);
-    method public void setSource(android.view.View);
-    method public void setSource(android.view.View, int);
-    method public void setToIndex(int);
-  }
-
-  public class AccessibilityWindowInfoCompat {
-    method public void getBoundsInScreen(android.graphics.Rect);
-    method public android.support.v4.view.accessibility.AccessibilityWindowInfoCompat getChild(int);
-    method public int getChildCount();
-    method public int getId();
-    method public int getLayer();
-    method public android.support.v4.view.accessibility.AccessibilityWindowInfoCompat getParent();
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getRoot();
-    method public int getType();
-    method public boolean isAccessibilityFocused();
-    method public boolean isActive();
-    method public boolean isFocused();
-    method public static android.support.v4.view.accessibility.AccessibilityWindowInfoCompat obtain();
-    method public static android.support.v4.view.accessibility.AccessibilityWindowInfoCompat obtain(android.support.v4.view.accessibility.AccessibilityWindowInfoCompat);
-    method public void recycle();
-    field public static final int TYPE_ACCESSIBILITY_OVERLAY = 4; // 0x4
-    field public static final int TYPE_APPLICATION = 1; // 0x1
-    field public static final int TYPE_INPUT_METHOD = 2; // 0x2
-    field public static final int TYPE_SYSTEM = 3; // 0x3
-  }
-
-}
-
-package android.support.v4.view.animation {
-
-  public class FastOutLinearInInterpolator extends android.support.v4.view.animation.LookupTableInterpolator {
-    ctor public FastOutLinearInInterpolator();
-  }
-
-  public class FastOutSlowInInterpolator extends android.support.v4.view.animation.LookupTableInterpolator {
-    ctor public FastOutSlowInInterpolator();
-  }
-
-  public class LinearOutSlowInInterpolator extends android.support.v4.view.animation.LookupTableInterpolator {
-    ctor public LinearOutSlowInInterpolator();
-  }
-
-   abstract class LookupTableInterpolator implements android.view.animation.Interpolator {
-    ctor public LookupTableInterpolator(float[]);
-    method public float getInterpolation(float);
-  }
-
-  public class PathInterpolatorCompat {
-    method public static android.view.animation.Interpolator create(android.graphics.Path);
-    method public static android.view.animation.Interpolator create(float, float);
-    method public static android.view.animation.Interpolator create(float, float, float, float);
-  }
-
-}
-
-package android.support.v4.widget {
-
-  public abstract class AutoScrollHelper implements android.view.View.OnTouchListener {
-    ctor public AutoScrollHelper(android.view.View);
-    method public abstract boolean canTargetScrollHorizontally(int);
-    method public abstract boolean canTargetScrollVertically(int);
-    method public boolean isEnabled();
-    method public boolean isExclusive();
-    method public boolean onTouch(android.view.View, android.view.MotionEvent);
-    method public abstract void scrollTargetBy(int, int);
-    method public android.support.v4.widget.AutoScrollHelper setActivationDelay(int);
-    method public android.support.v4.widget.AutoScrollHelper setEdgeType(int);
-    method public android.support.v4.widget.AutoScrollHelper setEnabled(boolean);
-    method public android.support.v4.widget.AutoScrollHelper setExclusive(boolean);
-    method public android.support.v4.widget.AutoScrollHelper setMaximumEdges(float, float);
-    method public android.support.v4.widget.AutoScrollHelper setMaximumVelocity(float, float);
-    method public android.support.v4.widget.AutoScrollHelper setMinimumVelocity(float, float);
-    method public android.support.v4.widget.AutoScrollHelper setRampDownDuration(int);
-    method public android.support.v4.widget.AutoScrollHelper setRampUpDuration(int);
-    method public android.support.v4.widget.AutoScrollHelper setRelativeEdges(float, float);
-    method public android.support.v4.widget.AutoScrollHelper setRelativeVelocity(float, float);
-    field public static final int EDGE_TYPE_INSIDE = 0; // 0x0
-    field public static final int EDGE_TYPE_INSIDE_EXTEND = 1; // 0x1
-    field public static final int EDGE_TYPE_OUTSIDE = 2; // 0x2
-    field public static final float NO_MAX = 3.4028235E38f;
-    field public static final float NO_MIN = 0.0f;
-    field public static final float RELATIVE_UNSPECIFIED = 0.0f;
-  }
-
-  public final class CompoundButtonCompat {
-    method public static android.graphics.drawable.Drawable getButtonDrawable(android.widget.CompoundButton);
-    method public static android.content.res.ColorStateList getButtonTintList(android.widget.CompoundButton);
-    method public static android.graphics.PorterDuff.Mode getButtonTintMode(android.widget.CompoundButton);
-    method public static void setButtonTintList(android.widget.CompoundButton, android.content.res.ColorStateList);
-    method public static void setButtonTintMode(android.widget.CompoundButton, android.graphics.PorterDuff.Mode);
-  }
-
-  public class ContentLoadingProgressBar extends android.widget.ProgressBar {
-    ctor public ContentLoadingProgressBar(android.content.Context);
-    ctor public ContentLoadingProgressBar(android.content.Context, android.util.AttributeSet);
-    method public void hide();
-    method public void onAttachedToWindow();
-    method public void onDetachedFromWindow();
-    method public void show();
-  }
-
-  public abstract class CursorAdapter extends android.widget.BaseAdapter {
-    ctor public deprecated CursorAdapter(android.content.Context, android.database.Cursor);
-    ctor public CursorAdapter(android.content.Context, android.database.Cursor, boolean);
-    ctor public CursorAdapter(android.content.Context, android.database.Cursor, int);
-    method public abstract void bindView(android.view.View, android.content.Context, android.database.Cursor);
-    method public void changeCursor(android.database.Cursor);
-    method public java.lang.CharSequence convertToString(android.database.Cursor);
-    method public int getCount();
-    method public android.database.Cursor getCursor();
-    method public android.widget.Filter getFilter();
-    method public android.widget.FilterQueryProvider getFilterQueryProvider();
-    method public java.lang.Object getItem(int);
-    method public long getItemId(int);
-    method public android.view.View getView(int, android.view.View, android.view.ViewGroup);
-    method protected deprecated void init(android.content.Context, android.database.Cursor, boolean);
-    method public android.view.View newDropDownView(android.content.Context, android.database.Cursor, android.view.ViewGroup);
-    method public abstract android.view.View newView(android.content.Context, android.database.Cursor, android.view.ViewGroup);
-    method protected void onContentChanged();
-    method public android.database.Cursor runQueryOnBackgroundThread(java.lang.CharSequence);
-    method public void setFilterQueryProvider(android.widget.FilterQueryProvider);
-    method public android.database.Cursor swapCursor(android.database.Cursor);
-    field public static final deprecated int FLAG_AUTO_REQUERY = 1; // 0x1
-    field public static final int FLAG_REGISTER_CONTENT_OBSERVER = 2; // 0x2
-  }
-
-  public class DrawerLayout extends android.view.ViewGroup {
-    ctor public DrawerLayout(android.content.Context);
-    ctor public DrawerLayout(android.content.Context, android.util.AttributeSet);
-    ctor public DrawerLayout(android.content.Context, android.util.AttributeSet, int);
-    method public void closeDrawer(android.view.View);
-    method public void closeDrawer(int);
-    method public void closeDrawers();
-    method public float getDrawerElevation();
-    method public int getDrawerLockMode(int);
-    method public int getDrawerLockMode(android.view.View);
-    method public java.lang.CharSequence getDrawerTitle(int);
-    method public android.graphics.drawable.Drawable getStatusBarBackgroundDrawable();
-    method public boolean isDrawerOpen(android.view.View);
-    method public boolean isDrawerOpen(int);
-    method public boolean isDrawerVisible(android.view.View);
-    method public boolean isDrawerVisible(int);
-    method public void onDraw(android.graphics.Canvas);
-    method protected void onLayout(boolean, int, int, int, int);
-    method public void openDrawer(android.view.View);
-    method public void openDrawer(int);
-    method public void setDrawerElevation(float);
-    method public void setDrawerListener(android.support.v4.widget.DrawerLayout.DrawerListener);
-    method public void setDrawerLockMode(int);
-    method public void setDrawerLockMode(int, int);
-    method public void setDrawerLockMode(int, android.view.View);
-    method public void setDrawerShadow(android.graphics.drawable.Drawable, int);
-    method public void setDrawerShadow(int, int);
-    method public void setDrawerTitle(int, java.lang.CharSequence);
-    method public void setScrimColor(int);
-    method public void setStatusBarBackground(android.graphics.drawable.Drawable);
-    method public void setStatusBarBackground(int);
-    method public void setStatusBarBackgroundColor(int);
-    field public static final int LOCK_MODE_LOCKED_CLOSED = 1; // 0x1
-    field public static final int LOCK_MODE_LOCKED_OPEN = 2; // 0x2
-    field public static final int LOCK_MODE_UNLOCKED = 0; // 0x0
-    field public static final int STATE_DRAGGING = 1; // 0x1
-    field public static final int STATE_IDLE = 0; // 0x0
-    field public static final int STATE_SETTLING = 2; // 0x2
-  }
-
-  public static abstract interface DrawerLayout.DrawerListener {
-    method public abstract void onDrawerClosed(android.view.View);
-    method public abstract void onDrawerOpened(android.view.View);
-    method public abstract void onDrawerSlide(android.view.View, float);
-    method public abstract void onDrawerStateChanged(int);
-  }
-
-  public static class DrawerLayout.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
-    ctor public DrawerLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public DrawerLayout.LayoutParams(int, int);
-    ctor public DrawerLayout.LayoutParams(int, int, int);
-    ctor public DrawerLayout.LayoutParams(android.support.v4.widget.DrawerLayout.LayoutParams);
-    ctor public DrawerLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public DrawerLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    field public int gravity;
-  }
-
-  protected static class DrawerLayout.SavedState extends android.view.View.BaseSavedState {
-    ctor public DrawerLayout.SavedState(android.os.Parcel);
-    ctor public DrawerLayout.SavedState(android.os.Parcelable);
-    field public static final android.os.Parcelable.Creator<android.support.v4.widget.DrawerLayout.SavedState> CREATOR;
-  }
-
-  public static abstract class DrawerLayout.SimpleDrawerListener implements android.support.v4.widget.DrawerLayout.DrawerListener {
-    ctor public DrawerLayout.SimpleDrawerListener();
-    method public void onDrawerClosed(android.view.View);
-    method public void onDrawerOpened(android.view.View);
-    method public void onDrawerSlide(android.view.View, float);
-    method public void onDrawerStateChanged(int);
-  }
-
-  public class EdgeEffectCompat {
-    ctor public EdgeEffectCompat(android.content.Context);
-    method public boolean draw(android.graphics.Canvas);
-    method public void finish();
-    method public boolean isFinished();
-    method public boolean onAbsorb(int);
-    method public deprecated boolean onPull(float);
-    method public boolean onPull(float, float);
-    method public boolean onRelease();
-    method public void setSize(int, int);
-  }
-
-  public abstract class ExploreByTouchHelper extends android.support.v4.view.AccessibilityDelegateCompat {
-    ctor public ExploreByTouchHelper(android.view.View);
-    method public boolean dispatchHoverEvent(android.view.MotionEvent);
-    method public int getFocusedVirtualView();
-    method protected abstract int getVirtualViewAt(float, float);
-    method protected abstract void getVisibleVirtualViews(java.util.List<java.lang.Integer>);
-    method public void invalidateRoot();
-    method public void invalidateVirtualView(int);
-    method protected abstract boolean onPerformActionForVirtualView(int, int, android.os.Bundle);
-    method protected abstract void onPopulateEventForVirtualView(int, android.view.accessibility.AccessibilityEvent);
-    method public void onPopulateNodeForHost(android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
-    method protected abstract void onPopulateNodeForVirtualView(int, android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
-    method public boolean sendEventForVirtualView(int, int);
-    field public static final int HOST_ID = -1; // 0xffffffff
-    field public static final int INVALID_ID = -2147483648; // 0x80000000
-  }
-
-  public class ListPopupWindowCompat {
-    method public static android.view.View.OnTouchListener createDragToOpenListener(java.lang.Object, android.view.View);
-  }
-
-  public class ListViewAutoScrollHelper extends android.support.v4.widget.AutoScrollHelper {
-    ctor public ListViewAutoScrollHelper(android.widget.ListView);
-    method public boolean canTargetScrollHorizontally(int);
-    method public boolean canTargetScrollVertically(int);
-    method public void scrollTargetBy(int, int);
-  }
-
-  public class NestedScrollView extends android.widget.FrameLayout implements android.support.v4.view.NestedScrollingChild android.support.v4.view.NestedScrollingParent {
-    ctor public NestedScrollView(android.content.Context);
-    ctor public NestedScrollView(android.content.Context, android.util.AttributeSet);
-    ctor public NestedScrollView(android.content.Context, android.util.AttributeSet, int);
-    method public boolean arrowScroll(int);
-    method protected int computeScrollDeltaToGetChildRectOnScreen(android.graphics.Rect);
-    method public boolean executeKeyEvent(android.view.KeyEvent);
-    method public void fling(int);
-    method public boolean fullScroll(int);
-    method public int getMaxScrollAmount();
-    method public boolean isFillViewport();
-    method public boolean isSmoothScrollingEnabled();
-    method public void onAttachedToWindow();
-    method public boolean pageScroll(int);
-    method public void setFillViewport(boolean);
-    method public void setSmoothScrollingEnabled(boolean);
-    method public final void smoothScrollBy(int, int);
-    method public final void smoothScrollTo(int, int);
-  }
-
-  public class PopupMenuCompat {
-    method public static android.view.View.OnTouchListener getDragToOpenListener(java.lang.Object);
-  }
-
-  public class PopupWindowCompat {
-    method public static boolean getOverlapAnchor(android.widget.PopupWindow);
-    method public static int getWindowLayoutType(android.widget.PopupWindow);
-    method public static void setOverlapAnchor(android.widget.PopupWindow, boolean);
-    method public static void setWindowLayoutType(android.widget.PopupWindow, int);
-    method public static void showAsDropDown(android.widget.PopupWindow, android.view.View, int, int, int);
-  }
-
-  public abstract class ResourceCursorAdapter extends android.support.v4.widget.CursorAdapter {
-    ctor public deprecated ResourceCursorAdapter(android.content.Context, int, android.database.Cursor);
-    ctor public ResourceCursorAdapter(android.content.Context, int, android.database.Cursor, boolean);
-    ctor public ResourceCursorAdapter(android.content.Context, int, android.database.Cursor, int);
-    method public android.view.View newView(android.content.Context, android.database.Cursor, android.view.ViewGroup);
-    method public void setDropDownViewResource(int);
-    method public void setViewResource(int);
-  }
-
-  public class ScrollerCompat {
-    method public void abortAnimation();
-    method public boolean computeScrollOffset();
-    method public static android.support.v4.widget.ScrollerCompat create(android.content.Context);
-    method public static android.support.v4.widget.ScrollerCompat create(android.content.Context, android.view.animation.Interpolator);
-    method public void fling(int, int, int, int, int, int, int, int);
-    method public void fling(int, int, int, int, int, int, int, int, int, int);
-    method public float getCurrVelocity();
-    method public int getCurrX();
-    method public int getCurrY();
-    method public int getFinalX();
-    method public int getFinalY();
-    method public boolean isFinished();
-    method public boolean isOverScrolled();
-    method public void notifyHorizontalEdgeReached(int, int, int);
-    method public void notifyVerticalEdgeReached(int, int, int);
-    method public void startScroll(int, int, int, int);
-    method public void startScroll(int, int, int, int, int);
-  }
-
-  public class SearchViewCompat {
-    method public static java.lang.CharSequence getQuery(android.view.View);
-    method public static boolean isIconified(android.view.View);
-    method public static boolean isQueryRefinementEnabled(android.view.View);
-    method public static boolean isSubmitButtonEnabled(android.view.View);
-    method public static android.view.View newSearchView(android.content.Context);
-    method public static void setIconified(android.view.View, boolean);
-    method public static void setImeOptions(android.view.View, int);
-    method public static void setInputType(android.view.View, int);
-    method public static void setMaxWidth(android.view.View, int);
-    method public static void setOnCloseListener(android.view.View, android.support.v4.widget.SearchViewCompat.OnCloseListenerCompat);
-    method public static void setOnQueryTextListener(android.view.View, android.support.v4.widget.SearchViewCompat.OnQueryTextListenerCompat);
-    method public static void setQuery(android.view.View, java.lang.CharSequence, boolean);
-    method public static void setQueryHint(android.view.View, java.lang.CharSequence);
-    method public static void setQueryRefinementEnabled(android.view.View, boolean);
-    method public static void setSearchableInfo(android.view.View, android.content.ComponentName);
-    method public static void setSubmitButtonEnabled(android.view.View, boolean);
-  }
-
-  public static abstract class SearchViewCompat.OnCloseListenerCompat {
-    ctor public SearchViewCompat.OnCloseListenerCompat();
-    method public boolean onClose();
-  }
-
-  public static abstract class SearchViewCompat.OnQueryTextListenerCompat {
-    ctor public SearchViewCompat.OnQueryTextListenerCompat();
-    method public boolean onQueryTextChange(java.lang.String);
-    method public boolean onQueryTextSubmit(java.lang.String);
-  }
-
-  public class SimpleCursorAdapter extends android.support.v4.widget.ResourceCursorAdapter {
-    ctor public deprecated SimpleCursorAdapter(android.content.Context, int, android.database.Cursor, java.lang.String[], int[]);
-    ctor public SimpleCursorAdapter(android.content.Context, int, android.database.Cursor, java.lang.String[], int[], int);
-    method public void bindView(android.view.View, android.content.Context, android.database.Cursor);
-    method public void changeCursorAndColumns(android.database.Cursor, java.lang.String[], int[]);
-    method public android.support.v4.widget.SimpleCursorAdapter.CursorToStringConverter getCursorToStringConverter();
-    method public int getStringConversionColumn();
-    method public android.support.v4.widget.SimpleCursorAdapter.ViewBinder getViewBinder();
-    method public void setCursorToStringConverter(android.support.v4.widget.SimpleCursorAdapter.CursorToStringConverter);
-    method public void setStringConversionColumn(int);
-    method public void setViewBinder(android.support.v4.widget.SimpleCursorAdapter.ViewBinder);
-    method public void setViewImage(android.widget.ImageView, java.lang.String);
-    method public void setViewText(android.widget.TextView, java.lang.String);
-  }
-
-  public static abstract interface SimpleCursorAdapter.CursorToStringConverter {
-    method public abstract java.lang.CharSequence convertToString(android.database.Cursor);
-  }
-
-  public static abstract interface SimpleCursorAdapter.ViewBinder {
-    method public abstract boolean setViewValue(android.view.View, android.database.Cursor, int);
-  }
-
-  public class SlidingPaneLayout extends android.view.ViewGroup {
-    ctor public SlidingPaneLayout(android.content.Context);
-    ctor public SlidingPaneLayout(android.content.Context, android.util.AttributeSet);
-    ctor public SlidingPaneLayout(android.content.Context, android.util.AttributeSet, int);
-    method protected boolean canScroll(android.view.View, boolean, int, int, int);
-    method public deprecated boolean canSlide();
-    method public boolean closePane();
-    method public int getCoveredFadeColor();
-    method public int getParallaxDistance();
-    method public int getSliderFadeColor();
-    method public boolean isOpen();
-    method public boolean isSlideable();
-    method protected void onLayout(boolean, int, int, int, int);
-    method public boolean openPane();
-    method public void setCoveredFadeColor(int);
-    method public void setPanelSlideListener(android.support.v4.widget.SlidingPaneLayout.PanelSlideListener);
-    method public void setParallaxDistance(int);
-    method public deprecated void setShadowDrawable(android.graphics.drawable.Drawable);
-    method public void setShadowDrawableLeft(android.graphics.drawable.Drawable);
-    method public void setShadowDrawableRight(android.graphics.drawable.Drawable);
-    method public deprecated void setShadowResource(int);
-    method public void setShadowResourceLeft(int);
-    method public void setShadowResourceRight(int);
-    method public void setSliderFadeColor(int);
-    method public deprecated void smoothSlideClosed();
-    method public deprecated void smoothSlideOpen();
-  }
-
-  public static class SlidingPaneLayout.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
-    ctor public SlidingPaneLayout.LayoutParams();
-    ctor public SlidingPaneLayout.LayoutParams(int, int);
-    ctor public SlidingPaneLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public SlidingPaneLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public SlidingPaneLayout.LayoutParams(android.support.v4.widget.SlidingPaneLayout.LayoutParams);
-    ctor public SlidingPaneLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
-    field public float weight;
-  }
-
-  public static abstract interface SlidingPaneLayout.PanelSlideListener {
-    method public abstract void onPanelClosed(android.view.View);
-    method public abstract void onPanelOpened(android.view.View);
-    method public abstract void onPanelSlide(android.view.View, float);
-  }
-
-  public static class SlidingPaneLayout.SimplePanelSlideListener implements android.support.v4.widget.SlidingPaneLayout.PanelSlideListener {
-    ctor public SlidingPaneLayout.SimplePanelSlideListener();
-    method public void onPanelClosed(android.view.View);
-    method public void onPanelOpened(android.view.View);
-    method public void onPanelSlide(android.view.View, float);
-  }
-
-  public class Space extends android.view.View {
-    ctor public Space(android.content.Context, android.util.AttributeSet, int);
-    ctor public Space(android.content.Context, android.util.AttributeSet);
-    ctor public Space(android.content.Context);
-  }
-
-  public class SwipeRefreshLayout extends android.view.ViewGroup implements android.support.v4.view.NestedScrollingChild android.support.v4.view.NestedScrollingParent {
-    ctor public SwipeRefreshLayout(android.content.Context);
-    ctor public SwipeRefreshLayout(android.content.Context, android.util.AttributeSet);
-    method public boolean canChildScrollUp();
-    method public int getProgressCircleDiameter();
-    method public boolean isRefreshing();
-    method protected void onLayout(boolean, int, int, int, int);
-    method public void onMeasure(int, int);
-    method public deprecated void setColorScheme(int...);
-    method public void setColorSchemeColors(int...);
-    method public void setColorSchemeResources(int...);
-    method public void setDistanceToTriggerSync(int);
-    method public void setOnRefreshListener(android.support.v4.widget.SwipeRefreshLayout.OnRefreshListener);
-    method public deprecated void setProgressBackgroundColor(int);
-    method public void setProgressBackgroundColorSchemeColor(int);
-    method public void setProgressBackgroundColorSchemeResource(int);
-    method public void setProgressViewEndTarget(boolean, int);
-    method public void setProgressViewOffset(boolean, int, int);
-    method public void setRefreshing(boolean);
-    method public void setSize(int);
-    field public static final int DEFAULT = 1; // 0x1
-    field public static final int LARGE = 0; // 0x0
-    field protected int mFrom;
-    field protected int mOriginalOffsetTop;
-  }
-
-  public static abstract interface SwipeRefreshLayout.OnRefreshListener {
-    method public abstract void onRefresh();
-  }
-
-  public class TextViewCompat {
-    method public static void setCompoundDrawablesRelative(android.widget.TextView, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable);
-    method public static void setCompoundDrawablesRelativeWithIntrinsicBounds(android.widget.TextView, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable);
-    method public static void setCompoundDrawablesRelativeWithIntrinsicBounds(android.widget.TextView, int, int, int, int);
-  }
-
-  public class ViewDragHelper {
-    method public void abort();
-    method protected boolean canScroll(android.view.View, boolean, int, int, int, int);
-    method public void cancel();
-    method public void captureChildView(android.view.View, int);
-    method public boolean checkTouchSlop(int);
-    method public boolean checkTouchSlop(int, int);
-    method public boolean continueSettling(boolean);
-    method public static android.support.v4.widget.ViewDragHelper create(android.view.ViewGroup, android.support.v4.widget.ViewDragHelper.Callback);
-    method public static android.support.v4.widget.ViewDragHelper create(android.view.ViewGroup, float, android.support.v4.widget.ViewDragHelper.Callback);
-    method public android.view.View findTopChildUnder(int, int);
-    method public void flingCapturedView(int, int, int, int);
-    method public int getActivePointerId();
-    method public android.view.View getCapturedView();
-    method public int getEdgeSize();
-    method public float getMinVelocity();
-    method public int getTouchSlop();
-    method public int getViewDragState();
-    method public boolean isCapturedViewUnder(int, int);
-    method public boolean isEdgeTouched(int);
-    method public boolean isEdgeTouched(int, int);
-    method public boolean isPointerDown(int);
-    method public boolean isViewUnder(android.view.View, int, int);
-    method public void processTouchEvent(android.view.MotionEvent);
-    method public void setEdgeTrackingEnabled(int);
-    method public void setMinVelocity(float);
-    method public boolean settleCapturedViewAt(int, int);
-    method public boolean shouldInterceptTouchEvent(android.view.MotionEvent);
-    method public boolean smoothSlideViewTo(android.view.View, int, int);
-    field public static final int DIRECTION_ALL = 3; // 0x3
-    field public static final int DIRECTION_HORIZONTAL = 1; // 0x1
-    field public static final int DIRECTION_VERTICAL = 2; // 0x2
-    field public static final int EDGE_ALL = 15; // 0xf
-    field public static final int EDGE_BOTTOM = 8; // 0x8
-    field public static final int EDGE_LEFT = 1; // 0x1
-    field public static final int EDGE_RIGHT = 2; // 0x2
-    field public static final int EDGE_TOP = 4; // 0x4
-    field public static final int INVALID_POINTER = -1; // 0xffffffff
-    field public static final int STATE_DRAGGING = 1; // 0x1
-    field public static final int STATE_IDLE = 0; // 0x0
-    field public static final int STATE_SETTLING = 2; // 0x2
-  }
-
-  public static abstract class ViewDragHelper.Callback {
-    ctor public ViewDragHelper.Callback();
-    method public int clampViewPositionHorizontal(android.view.View, int, int);
-    method public int clampViewPositionVertical(android.view.View, int, int);
-    method public int getOrderedChildIndex(int);
-    method public int getViewHorizontalDragRange(android.view.View);
-    method public int getViewVerticalDragRange(android.view.View);
-    method public void onEdgeDragStarted(int, int);
-    method public boolean onEdgeLock(int);
-    method public void onEdgeTouched(int, int);
-    method public void onViewCaptured(android.view.View, int);
-    method public void onViewDragStateChanged(int);
-    method public void onViewPositionChanged(android.view.View, int, int, int, int);
-    method public void onViewReleased(android.view.View, float, float);
-    method public abstract boolean tryCaptureView(android.view.View, int);
-  }
-
-}
-
diff --git a/v4/api/23.1.0.txt b/v4/api/23.1.0.txt
deleted file mode 100644
index ccefe22..0000000
--- a/v4/api/23.1.0.txt
+++ /dev/null
@@ -1,3520 +0,0 @@
-package android.support.v4.accessibilityservice {
-
-  public class AccessibilityServiceInfoCompat {
-    method public static java.lang.String capabilityToString(int);
-    method public static java.lang.String feedbackTypeToString(int);
-    method public static java.lang.String flagToString(int);
-    method public static boolean getCanRetrieveWindowContent(android.accessibilityservice.AccessibilityServiceInfo);
-    method public static int getCapabilities(android.accessibilityservice.AccessibilityServiceInfo);
-    method public static java.lang.String getDescription(android.accessibilityservice.AccessibilityServiceInfo);
-    method public static java.lang.String getId(android.accessibilityservice.AccessibilityServiceInfo);
-    method public static android.content.pm.ResolveInfo getResolveInfo(android.accessibilityservice.AccessibilityServiceInfo);
-    method public static java.lang.String getSettingsActivityName(android.accessibilityservice.AccessibilityServiceInfo);
-    field public static final int CAPABILITY_CAN_FILTER_KEY_EVENTS = 8; // 0x8
-    field public static final int CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 4; // 0x4
-    field public static final int CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION = 2; // 0x2
-    field public static final int CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT = 1; // 0x1
-    field public static final int DEFAULT = 1; // 0x1
-    field public static final int FEEDBACK_ALL_MASK = -1; // 0xffffffff
-    field public static final int FEEDBACK_BRAILLE = 32; // 0x20
-    field public static final int FLAG_INCLUDE_NOT_IMPORTANT_VIEWS = 2; // 0x2
-    field public static final int FLAG_REPORT_VIEW_IDS = 16; // 0x10
-    field public static final int FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 8; // 0x8
-    field public static final int FLAG_REQUEST_FILTER_KEY_EVENTS = 32; // 0x20
-    field public static final int FLAG_REQUEST_TOUCH_EXPLORATION_MODE = 4; // 0x4
-  }
-
-}
-
-package android.support.v4.animation {
-
-  public abstract class AnimatorCompatHelper {
-    method public static void clearInterpolator(android.view.View);
-    method public static android.support.v4.animation.ValueAnimatorCompat emptyValueAnimator();
-  }
-
-  public abstract interface AnimatorListenerCompat {
-    method public abstract void onAnimationCancel(android.support.v4.animation.ValueAnimatorCompat);
-    method public abstract void onAnimationEnd(android.support.v4.animation.ValueAnimatorCompat);
-    method public abstract void onAnimationRepeat(android.support.v4.animation.ValueAnimatorCompat);
-    method public abstract void onAnimationStart(android.support.v4.animation.ValueAnimatorCompat);
-  }
-
-  public abstract interface AnimatorUpdateListenerCompat {
-    method public abstract void onAnimationUpdate(android.support.v4.animation.ValueAnimatorCompat);
-  }
-
-  public abstract interface ValueAnimatorCompat {
-    method public abstract void addListener(android.support.v4.animation.AnimatorListenerCompat);
-    method public abstract void addUpdateListener(android.support.v4.animation.AnimatorUpdateListenerCompat);
-    method public abstract void cancel();
-    method public abstract float getAnimatedFraction();
-    method public abstract void setDuration(long);
-    method public abstract void setTarget(android.view.View);
-    method public abstract void start();
-  }
-
-}
-
-package android.support.v4.app {
-
-  public deprecated class ActionBarDrawerToggle implements android.support.v4.widget.DrawerLayout.DrawerListener {
-    ctor public ActionBarDrawerToggle(android.app.Activity, android.support.v4.widget.DrawerLayout, int, int, int);
-    ctor public ActionBarDrawerToggle(android.app.Activity, android.support.v4.widget.DrawerLayout, boolean, int, int, int);
-    method public boolean isDrawerIndicatorEnabled();
-    method public void onConfigurationChanged(android.content.res.Configuration);
-    method public void onDrawerClosed(android.view.View);
-    method public void onDrawerOpened(android.view.View);
-    method public void onDrawerSlide(android.view.View, float);
-    method public void onDrawerStateChanged(int);
-    method public boolean onOptionsItemSelected(android.view.MenuItem);
-    method public void setDrawerIndicatorEnabled(boolean);
-    method public void setHomeAsUpIndicator(android.graphics.drawable.Drawable);
-    method public void setHomeAsUpIndicator(int);
-    method public void syncState();
-  }
-
-  public static abstract interface ActionBarDrawerToggle.Delegate {
-    method public abstract android.graphics.drawable.Drawable getThemeUpIndicator();
-    method public abstract void setActionBarDescription(int);
-    method public abstract void setActionBarUpIndicator(android.graphics.drawable.Drawable, int);
-  }
-
-  public static abstract interface ActionBarDrawerToggle.DelegateProvider {
-    method public abstract android.support.v4.app.ActionBarDrawerToggle.Delegate getDrawerToggleDelegate();
-  }
-
-  public class ActivityCompat extends android.support.v4.content.ContextCompat {
-    ctor public ActivityCompat();
-    method public static void finishAffinity(android.app.Activity);
-    method public static void finishAfterTransition(android.app.Activity);
-    method public android.net.Uri getReferrer(android.app.Activity);
-    method public static boolean invalidateOptionsMenu(android.app.Activity);
-    method public static void postponeEnterTransition(android.app.Activity);
-    method public static void requestPermissions(android.app.Activity, java.lang.String[], int);
-    method public static void setEnterSharedElementCallback(android.app.Activity, android.support.v4.app.SharedElementCallback);
-    method public static void setExitSharedElementCallback(android.app.Activity, android.support.v4.app.SharedElementCallback);
-    method public static boolean shouldShowRequestPermissionRationale(android.app.Activity, java.lang.String);
-    method public static void startActivity(android.app.Activity, android.content.Intent, android.os.Bundle);
-    method public static void startActivityForResult(android.app.Activity, android.content.Intent, int, android.os.Bundle);
-    method public static void startPostponedEnterTransition(android.app.Activity);
-  }
-
-  public static abstract interface ActivityCompat.OnRequestPermissionsResultCallback {
-    method public abstract void onRequestPermissionsResult(int, java.lang.String[], int[]);
-  }
-
-  public final class ActivityManagerCompat {
-    method public static boolean isLowRamDevice(android.app.ActivityManager);
-  }
-
-  public class ActivityOptionsCompat {
-    ctor protected ActivityOptionsCompat();
-    method public static android.support.v4.app.ActivityOptionsCompat makeCustomAnimation(android.content.Context, int, int);
-    method public static android.support.v4.app.ActivityOptionsCompat makeScaleUpAnimation(android.view.View, int, int, int, int);
-    method public static android.support.v4.app.ActivityOptionsCompat makeSceneTransitionAnimation(android.app.Activity, android.view.View, java.lang.String);
-    method public static android.support.v4.app.ActivityOptionsCompat makeSceneTransitionAnimation(android.app.Activity, android.support.v4.util.Pair<android.view.View, java.lang.String>...);
-    method public static android.support.v4.app.ActivityOptionsCompat makeThumbnailScaleUpAnimation(android.view.View, android.graphics.Bitmap, int, int);
-    method public android.os.Bundle toBundle();
-    method public void update(android.support.v4.app.ActivityOptionsCompat);
-  }
-
-  public class AppOpsManagerCompat {
-    ctor public AppOpsManagerCompat();
-    method public static int noteOp(android.content.Context, java.lang.String, int, java.lang.String);
-    method public static int noteProxyOp(android.content.Context, java.lang.String, java.lang.String);
-    method public static java.lang.String permissionToOp(java.lang.String);
-    field public static final int MODE_ALLOWED = 0; // 0x0
-    field public static final int MODE_DEFAULT = 3; // 0x3
-    field public static final int MODE_IGNORED = 1; // 0x1
-  }
-
-   abstract class BaseFragmentActivityDonut extends android.app.Activity {
-  }
-
-   abstract class BaseFragmentActivityHoneycomb extends android.support.v4.app.BaseFragmentActivityDonut {
-  }
-
-  public class BundleCompat {
-    ctor public BundleCompat();
-    method public static android.os.IBinder getBinder(android.os.Bundle, java.lang.String);
-    method public static void putBinder(android.os.Bundle, java.lang.String, android.os.IBinder);
-  }
-
-  public class DialogFragment extends android.support.v4.app.Fragment implements android.content.DialogInterface.OnCancelListener android.content.DialogInterface.OnDismissListener {
-    ctor public DialogFragment();
-    method public void dismiss();
-    method public void dismissAllowingStateLoss();
-    method public android.app.Dialog getDialog();
-    method public boolean getShowsDialog();
-    method public int getTheme();
-    method public boolean isCancelable();
-    method public void onCancel(android.content.DialogInterface);
-    method public android.app.Dialog onCreateDialog(android.os.Bundle);
-    method public void onDismiss(android.content.DialogInterface);
-    method public void setCancelable(boolean);
-    method public void setShowsDialog(boolean);
-    method public void setStyle(int, int);
-    method public void show(android.support.v4.app.FragmentManager, java.lang.String);
-    method public int show(android.support.v4.app.FragmentTransaction, java.lang.String);
-    field public static final int STYLE_NORMAL = 0; // 0x0
-    field public static final int STYLE_NO_FRAME = 2; // 0x2
-    field public static final int STYLE_NO_INPUT = 3; // 0x3
-    field public static final int STYLE_NO_TITLE = 1; // 0x1
-  }
-
-  public class Fragment implements android.content.ComponentCallbacks android.view.View.OnCreateContextMenuListener {
-    ctor public Fragment();
-    method public void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
-    method public final boolean equals(java.lang.Object);
-    method public final android.support.v4.app.FragmentActivity getActivity();
-    method public boolean getAllowEnterTransitionOverlap();
-    method public boolean getAllowReturnTransitionOverlap();
-    method public final android.os.Bundle getArguments();
-    method public final android.support.v4.app.FragmentManager getChildFragmentManager();
-    method public android.content.Context getContext();
-    method public java.lang.Object getEnterTransition();
-    method public java.lang.Object getExitTransition();
-    method public final android.support.v4.app.FragmentManager getFragmentManager();
-    method public final java.lang.Object getHost();
-    method public final int getId();
-    method public android.support.v4.app.LoaderManager getLoaderManager();
-    method public final android.support.v4.app.Fragment getParentFragment();
-    method public java.lang.Object getReenterTransition();
-    method public final android.content.res.Resources getResources();
-    method public final boolean getRetainInstance();
-    method public java.lang.Object getReturnTransition();
-    method public java.lang.Object getSharedElementEnterTransition();
-    method public java.lang.Object getSharedElementReturnTransition();
-    method public final java.lang.String getString(int);
-    method public final java.lang.String getString(int, java.lang.Object...);
-    method public final java.lang.String getTag();
-    method public final android.support.v4.app.Fragment getTargetFragment();
-    method public final int getTargetRequestCode();
-    method public final java.lang.CharSequence getText(int);
-    method public boolean getUserVisibleHint();
-    method public android.view.View getView();
-    method public final int hashCode();
-    method public static android.support.v4.app.Fragment instantiate(android.content.Context, java.lang.String);
-    method public static android.support.v4.app.Fragment instantiate(android.content.Context, java.lang.String, android.os.Bundle);
-    method public final boolean isAdded();
-    method public final boolean isDetached();
-    method public final boolean isHidden();
-    method public final boolean isInLayout();
-    method public final boolean isRemoving();
-    method public final boolean isResumed();
-    method public final boolean isVisible();
-    method public void onActivityCreated(android.os.Bundle);
-    method public void onActivityResult(int, int, android.content.Intent);
-    method public void onAttach(android.content.Context);
-    method public deprecated void onAttach(android.app.Activity);
-    method public void onConfigurationChanged(android.content.res.Configuration);
-    method public boolean onContextItemSelected(android.view.MenuItem);
-    method public void onCreate(android.os.Bundle);
-    method public android.view.animation.Animation onCreateAnimation(int, boolean, int);
-    method public void onCreateContextMenu(android.view.ContextMenu, android.view.View, android.view.ContextMenu.ContextMenuInfo);
-    method public void onCreateOptionsMenu(android.view.Menu, android.view.MenuInflater);
-    method public android.view.View onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
-    method public void onDestroy();
-    method public void onDestroyOptionsMenu();
-    method public void onDestroyView();
-    method public void onDetach();
-    method public void onHiddenChanged(boolean);
-    method public void onInflate(android.content.Context, android.util.AttributeSet, android.os.Bundle);
-    method public deprecated void onInflate(android.app.Activity, android.util.AttributeSet, android.os.Bundle);
-    method public void onLowMemory();
-    method public boolean onOptionsItemSelected(android.view.MenuItem);
-    method public void onOptionsMenuClosed(android.view.Menu);
-    method public void onPause();
-    method public void onPrepareOptionsMenu(android.view.Menu);
-    method public void onRequestPermissionsResult(int, java.lang.String[], int[]);
-    method public void onResume();
-    method public void onSaveInstanceState(android.os.Bundle);
-    method public void onStart();
-    method public void onStop();
-    method public void onViewCreated(android.view.View, android.os.Bundle);
-    method public void onViewStateRestored(android.os.Bundle);
-    method public void registerForContextMenu(android.view.View);
-    method public final void requestPermissions(java.lang.String[], int);
-    method public void setAllowEnterTransitionOverlap(boolean);
-    method public void setAllowReturnTransitionOverlap(boolean);
-    method public void setArguments(android.os.Bundle);
-    method public void setEnterSharedElementCallback(android.support.v4.app.SharedElementCallback);
-    method public void setEnterTransition(java.lang.Object);
-    method public void setExitSharedElementCallback(android.support.v4.app.SharedElementCallback);
-    method public void setExitTransition(java.lang.Object);
-    method public void setHasOptionsMenu(boolean);
-    method public void setInitialSavedState(android.support.v4.app.Fragment.SavedState);
-    method public void setMenuVisibility(boolean);
-    method public void setReenterTransition(java.lang.Object);
-    method public void setRetainInstance(boolean);
-    method public void setReturnTransition(java.lang.Object);
-    method public void setSharedElementEnterTransition(java.lang.Object);
-    method public void setSharedElementReturnTransition(java.lang.Object);
-    method public void setTargetFragment(android.support.v4.app.Fragment, int);
-    method public void setUserVisibleHint(boolean);
-    method public boolean shouldShowRequestPermissionRationale(java.lang.String);
-    method public void startActivity(android.content.Intent);
-    method public void startActivityForResult(android.content.Intent, int);
-    method public void unregisterForContextMenu(android.view.View);
-  }
-
-  public static class Fragment.InstantiationException extends java.lang.RuntimeException {
-    ctor public Fragment.InstantiationException(java.lang.String, java.lang.Exception);
-  }
-
-  public static class Fragment.SavedState implements android.os.Parcelable {
-    method public int describeContents();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.support.v4.app.Fragment.SavedState> CREATOR;
-  }
-
-  public class FragmentActivity extends android.support.v4.app.BaseFragmentActivityHoneycomb implements android.support.v4.app.ActivityCompat.OnRequestPermissionsResultCallback {
-    ctor public FragmentActivity();
-    method public java.lang.Object getLastCustomNonConfigurationInstance();
-    method public android.support.v4.app.FragmentManager getSupportFragmentManager();
-    method public android.support.v4.app.LoaderManager getSupportLoaderManager();
-    method public final android.support.v4.media.session.MediaControllerCompat getSupportMediaController();
-    method public void onAttachFragment(android.support.v4.app.Fragment);
-    method protected void onResumeFragments();
-    method public java.lang.Object onRetainCustomNonConfigurationInstance();
-    method public final java.lang.Object onRetainNonConfigurationInstance();
-    method public void setEnterSharedElementCallback(android.support.v4.app.SharedElementCallback);
-    method public void setExitSharedElementCallback(android.support.v4.app.SharedElementCallback);
-    method public final void setSupportMediaController(android.support.v4.media.session.MediaControllerCompat);
-    method public void startActivityFromFragment(android.support.v4.app.Fragment, android.content.Intent, int);
-    method public void supportFinishAfterTransition();
-    method public void supportInvalidateOptionsMenu();
-    method public void supportPostponeEnterTransition();
-    method public void supportStartPostponedEnterTransition();
-    method public final void validateRequestPermissionsRequestCode(int);
-  }
-
-  public abstract class FragmentContainer {
-    ctor public FragmentContainer();
-    method public abstract android.view.View onFindViewById(int);
-    method public abstract boolean onHasView();
-  }
-
-  public class FragmentController {
-    method public void attachHost(android.support.v4.app.Fragment);
-    method public static final android.support.v4.app.FragmentController createController(android.support.v4.app.FragmentHostCallback<?>);
-    method public void dispatchActivityCreated();
-    method public void dispatchConfigurationChanged(android.content.res.Configuration);
-    method public boolean dispatchContextItemSelected(android.view.MenuItem);
-    method public void dispatchCreate();
-    method public boolean dispatchCreateOptionsMenu(android.view.Menu, android.view.MenuInflater);
-    method public void dispatchDestroy();
-    method public void dispatchDestroyView();
-    method public void dispatchLowMemory();
-    method public boolean dispatchOptionsItemSelected(android.view.MenuItem);
-    method public void dispatchOptionsMenuClosed(android.view.Menu);
-    method public void dispatchPause();
-    method public boolean dispatchPrepareOptionsMenu(android.view.Menu);
-    method public void dispatchReallyStop();
-    method public void dispatchResume();
-    method public void dispatchStart();
-    method public void dispatchStop();
-    method public void doLoaderDestroy();
-    method public void doLoaderRetain();
-    method public void doLoaderStart();
-    method public void doLoaderStop(boolean);
-    method public void dumpLoaders(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
-    method public boolean execPendingActions();
-    method public java.util.List<android.support.v4.app.Fragment> getActiveFragments(java.util.List<android.support.v4.app.Fragment>);
-    method public int getActiveFragmentsCount();
-    method public android.support.v4.app.FragmentManager getSupportFragmentManager();
-    method public android.support.v4.app.LoaderManager getSupportLoaderManager();
-    method public void noteStateNotSaved();
-    method public android.view.View onCreateView(android.view.View, java.lang.String, android.content.Context, android.util.AttributeSet);
-    method public void reportLoaderStart();
-    method public void restoreAllState(android.os.Parcelable, java.util.List<android.support.v4.app.Fragment>);
-    method public void restoreLoaderNonConfig(android.support.v4.util.SimpleArrayMap<java.lang.String, android.support.v4.app.LoaderManager>);
-    method public android.support.v4.util.SimpleArrayMap<java.lang.String, android.support.v4.app.LoaderManager> retainLoaderNonConfig();
-    method public java.util.List<android.support.v4.app.Fragment> retainNonConfig();
-    method public android.os.Parcelable saveAllState();
-  }
-
-  public abstract class FragmentHostCallback extends android.support.v4.app.FragmentContainer {
-    ctor public FragmentHostCallback(android.content.Context, android.os.Handler, int);
-    method public void onDump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
-    method public android.view.View onFindViewById(int);
-    method public abstract E onGetHost();
-    method public android.view.LayoutInflater onGetLayoutInflater();
-    method public int onGetWindowAnimations();
-    method public boolean onHasView();
-    method public boolean onHasWindowAnimations();
-    method public void onRequestPermissionsFromFragment(android.support.v4.app.Fragment, java.lang.String[], int);
-    method public boolean onShouldSaveFragmentState(android.support.v4.app.Fragment);
-    method public boolean onShouldShowRequestPermissionRationale(java.lang.String);
-    method public void onStartActivityFromFragment(android.support.v4.app.Fragment, android.content.Intent, int);
-    method public void onSupportInvalidateOptionsMenu();
-  }
-
-  public abstract class FragmentManager {
-    ctor public FragmentManager();
-    method public abstract void addOnBackStackChangedListener(android.support.v4.app.FragmentManager.OnBackStackChangedListener);
-    method public abstract android.support.v4.app.FragmentTransaction beginTransaction();
-    method public abstract void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
-    method public static void enableDebugLogging(boolean);
-    method public abstract boolean executePendingTransactions();
-    method public abstract android.support.v4.app.Fragment findFragmentById(int);
-    method public abstract android.support.v4.app.Fragment findFragmentByTag(java.lang.String);
-    method public abstract android.support.v4.app.FragmentManager.BackStackEntry getBackStackEntryAt(int);
-    method public abstract int getBackStackEntryCount();
-    method public abstract android.support.v4.app.Fragment getFragment(android.os.Bundle, java.lang.String);
-    method public abstract boolean isDestroyed();
-    method public abstract void popBackStack();
-    method public abstract void popBackStack(java.lang.String, int);
-    method public abstract void popBackStack(int, int);
-    method public abstract boolean popBackStackImmediate();
-    method public abstract boolean popBackStackImmediate(java.lang.String, int);
-    method public abstract boolean popBackStackImmediate(int, int);
-    method public abstract void putFragment(android.os.Bundle, java.lang.String, android.support.v4.app.Fragment);
-    method public abstract void removeOnBackStackChangedListener(android.support.v4.app.FragmentManager.OnBackStackChangedListener);
-    method public abstract android.support.v4.app.Fragment.SavedState saveFragmentInstanceState(android.support.v4.app.Fragment);
-    field public static final int POP_BACK_STACK_INCLUSIVE = 1; // 0x1
-  }
-
-  public static abstract interface FragmentManager.BackStackEntry {
-    method public abstract java.lang.CharSequence getBreadCrumbShortTitle();
-    method public abstract int getBreadCrumbShortTitleRes();
-    method public abstract java.lang.CharSequence getBreadCrumbTitle();
-    method public abstract int getBreadCrumbTitleRes();
-    method public abstract int getId();
-    method public abstract java.lang.String getName();
-  }
-
-  public static abstract interface FragmentManager.OnBackStackChangedListener {
-    method public abstract void onBackStackChanged();
-  }
-
-  public abstract class FragmentPagerAdapter extends android.support.v4.view.PagerAdapter {
-    ctor public FragmentPagerAdapter(android.support.v4.app.FragmentManager);
-    method public abstract android.support.v4.app.Fragment getItem(int);
-    method public long getItemId(int);
-    method public boolean isViewFromObject(android.view.View, java.lang.Object);
-  }
-
-  public abstract class FragmentStatePagerAdapter extends android.support.v4.view.PagerAdapter {
-    ctor public FragmentStatePagerAdapter(android.support.v4.app.FragmentManager);
-    method public abstract android.support.v4.app.Fragment getItem(int);
-    method public boolean isViewFromObject(android.view.View, java.lang.Object);
-  }
-
-  public class FragmentTabHost extends android.widget.TabHost implements android.widget.TabHost.OnTabChangeListener {
-    ctor public FragmentTabHost(android.content.Context);
-    ctor public FragmentTabHost(android.content.Context, android.util.AttributeSet);
-    method public void addTab(android.widget.TabHost.TabSpec, java.lang.Class<?>, android.os.Bundle);
-    method public void onTabChanged(java.lang.String);
-    method public void setup(android.content.Context, android.support.v4.app.FragmentManager);
-    method public void setup(android.content.Context, android.support.v4.app.FragmentManager, int);
-  }
-
-  public abstract class FragmentTransaction {
-    ctor public FragmentTransaction();
-    method public abstract android.support.v4.app.FragmentTransaction add(android.support.v4.app.Fragment, java.lang.String);
-    method public abstract android.support.v4.app.FragmentTransaction add(int, android.support.v4.app.Fragment);
-    method public abstract android.support.v4.app.FragmentTransaction add(int, android.support.v4.app.Fragment, java.lang.String);
-    method public abstract android.support.v4.app.FragmentTransaction addSharedElement(android.view.View, java.lang.String);
-    method public abstract android.support.v4.app.FragmentTransaction addToBackStack(java.lang.String);
-    method public abstract android.support.v4.app.FragmentTransaction attach(android.support.v4.app.Fragment);
-    method public abstract int commit();
-    method public abstract int commitAllowingStateLoss();
-    method public abstract android.support.v4.app.FragmentTransaction detach(android.support.v4.app.Fragment);
-    method public abstract android.support.v4.app.FragmentTransaction disallowAddToBackStack();
-    method public abstract android.support.v4.app.FragmentTransaction hide(android.support.v4.app.Fragment);
-    method public abstract boolean isAddToBackStackAllowed();
-    method public abstract boolean isEmpty();
-    method public abstract android.support.v4.app.FragmentTransaction remove(android.support.v4.app.Fragment);
-    method public abstract android.support.v4.app.FragmentTransaction replace(int, android.support.v4.app.Fragment);
-    method public abstract android.support.v4.app.FragmentTransaction replace(int, android.support.v4.app.Fragment, java.lang.String);
-    method public abstract android.support.v4.app.FragmentTransaction setBreadCrumbShortTitle(int);
-    method public abstract android.support.v4.app.FragmentTransaction setBreadCrumbShortTitle(java.lang.CharSequence);
-    method public abstract android.support.v4.app.FragmentTransaction setBreadCrumbTitle(int);
-    method public abstract android.support.v4.app.FragmentTransaction setBreadCrumbTitle(java.lang.CharSequence);
-    method public abstract android.support.v4.app.FragmentTransaction setCustomAnimations(int, int);
-    method public abstract android.support.v4.app.FragmentTransaction setCustomAnimations(int, int, int, int);
-    method public abstract android.support.v4.app.FragmentTransaction setTransition(int);
-    method public abstract android.support.v4.app.FragmentTransaction setTransitionStyle(int);
-    method public abstract android.support.v4.app.FragmentTransaction show(android.support.v4.app.Fragment);
-    field public static final int TRANSIT_ENTER_MASK = 4096; // 0x1000
-    field public static final int TRANSIT_EXIT_MASK = 8192; // 0x2000
-    field public static final int TRANSIT_FRAGMENT_CLOSE = 8194; // 0x2002
-    field public static final int TRANSIT_FRAGMENT_FADE = 4099; // 0x1003
-    field public static final int TRANSIT_FRAGMENT_OPEN = 4097; // 0x1001
-    field public static final int TRANSIT_NONE = 0; // 0x0
-    field public static final int TRANSIT_UNSET = -1; // 0xffffffff
-  }
-
-  public class ListFragment extends android.support.v4.app.Fragment {
-    ctor public ListFragment();
-    method public android.widget.ListAdapter getListAdapter();
-    method public android.widget.ListView getListView();
-    method public long getSelectedItemId();
-    method public int getSelectedItemPosition();
-    method public void onListItemClick(android.widget.ListView, android.view.View, int, long);
-    method public void setEmptyText(java.lang.CharSequence);
-    method public void setListAdapter(android.widget.ListAdapter);
-    method public void setListShown(boolean);
-    method public void setListShownNoAnimation(boolean);
-    method public void setSelection(int);
-  }
-
-  public abstract class LoaderManager {
-    ctor public LoaderManager();
-    method public abstract void destroyLoader(int);
-    method public abstract void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
-    method public static void enableDebugLogging(boolean);
-    method public abstract android.support.v4.content.Loader<D> getLoader(int);
-    method public boolean hasRunningLoaders();
-    method public abstract android.support.v4.content.Loader<D> initLoader(int, android.os.Bundle, android.support.v4.app.LoaderManager.LoaderCallbacks<D>);
-    method public abstract android.support.v4.content.Loader<D> restartLoader(int, android.os.Bundle, android.support.v4.app.LoaderManager.LoaderCallbacks<D>);
-  }
-
-  public static abstract interface LoaderManager.LoaderCallbacks {
-    method public abstract android.support.v4.content.Loader<D> onCreateLoader(int, android.os.Bundle);
-    method public abstract void onLoadFinished(android.support.v4.content.Loader<D>, D);
-    method public abstract void onLoaderReset(android.support.v4.content.Loader<D>);
-  }
-
-  public class NavUtils {
-    method public static android.content.Intent getParentActivityIntent(android.app.Activity);
-    method public static android.content.Intent getParentActivityIntent(android.content.Context, java.lang.Class<?>) throws android.content.pm.PackageManager.NameNotFoundException;
-    method public static android.content.Intent getParentActivityIntent(android.content.Context, android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
-    method public static java.lang.String getParentActivityName(android.app.Activity);
-    method public static java.lang.String getParentActivityName(android.content.Context, android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
-    method public static void navigateUpFromSameTask(android.app.Activity);
-    method public static void navigateUpTo(android.app.Activity, android.content.Intent);
-    method public static boolean shouldUpRecreateTask(android.app.Activity, android.content.Intent);
-    field public static final java.lang.String PARENT_ACTIVITY = "android.support.PARENT_ACTIVITY";
-  }
-
-  public class NotificationCompat {
-    ctor public NotificationCompat();
-    method public static android.support.v4.app.NotificationCompat.Action getAction(android.app.Notification, int);
-    method public static int getActionCount(android.app.Notification);
-    method public static java.lang.String getCategory(android.app.Notification);
-    method public static android.os.Bundle getExtras(android.app.Notification);
-    method public static java.lang.String getGroup(android.app.Notification);
-    method public static boolean getLocalOnly(android.app.Notification);
-    method public static java.lang.String getSortKey(android.app.Notification);
-    method public static boolean isGroupSummary(android.app.Notification);
-    field public static final java.lang.String CATEGORY_ALARM = "alarm";
-    field public static final java.lang.String CATEGORY_CALL = "call";
-    field public static final java.lang.String CATEGORY_EMAIL = "email";
-    field public static final java.lang.String CATEGORY_ERROR = "err";
-    field public static final java.lang.String CATEGORY_EVENT = "event";
-    field public static final java.lang.String CATEGORY_MESSAGE = "msg";
-    field public static final java.lang.String CATEGORY_PROGRESS = "progress";
-    field public static final java.lang.String CATEGORY_PROMO = "promo";
-    field public static final java.lang.String CATEGORY_RECOMMENDATION = "recommendation";
-    field public static final java.lang.String CATEGORY_SERVICE = "service";
-    field public static final java.lang.String CATEGORY_SOCIAL = "social";
-    field public static final java.lang.String CATEGORY_STATUS = "status";
-    field public static final java.lang.String CATEGORY_SYSTEM = "sys";
-    field public static final java.lang.String CATEGORY_TRANSPORT = "transport";
-    field public static final int COLOR_DEFAULT = 0; // 0x0
-    field public static final int DEFAULT_ALL = -1; // 0xffffffff
-    field public static final int DEFAULT_LIGHTS = 4; // 0x4
-    field public static final int DEFAULT_SOUND = 1; // 0x1
-    field public static final int DEFAULT_VIBRATE = 2; // 0x2
-    field public static final java.lang.String EXTRA_BACKGROUND_IMAGE_URI = "android.backgroundImageUri";
-    field public static final java.lang.String EXTRA_BIG_TEXT = "android.bigText";
-    field public static final java.lang.String EXTRA_COMPACT_ACTIONS = "android.compactActions";
-    field public static final java.lang.String EXTRA_INFO_TEXT = "android.infoText";
-    field public static final java.lang.String EXTRA_LARGE_ICON = "android.largeIcon";
-    field public static final java.lang.String EXTRA_LARGE_ICON_BIG = "android.largeIcon.big";
-    field public static final java.lang.String EXTRA_MEDIA_SESSION = "android.mediaSession";
-    field public static final java.lang.String EXTRA_PEOPLE = "android.people";
-    field public static final java.lang.String EXTRA_PICTURE = "android.picture";
-    field public static final java.lang.String EXTRA_PROGRESS = "android.progress";
-    field public static final java.lang.String EXTRA_PROGRESS_INDETERMINATE = "android.progressIndeterminate";
-    field public static final java.lang.String EXTRA_PROGRESS_MAX = "android.progressMax";
-    field public static final java.lang.String EXTRA_SHOW_CHRONOMETER = "android.showChronometer";
-    field public static final java.lang.String EXTRA_SHOW_WHEN = "android.showWhen";
-    field public static final java.lang.String EXTRA_SMALL_ICON = "android.icon";
-    field public static final java.lang.String EXTRA_SUB_TEXT = "android.subText";
-    field public static final java.lang.String EXTRA_SUMMARY_TEXT = "android.summaryText";
-    field public static final java.lang.String EXTRA_TEMPLATE = "android.template";
-    field public static final java.lang.String EXTRA_TEXT = "android.text";
-    field public static final java.lang.String EXTRA_TEXT_LINES = "android.textLines";
-    field public static final java.lang.String EXTRA_TITLE = "android.title";
-    field public static final java.lang.String EXTRA_TITLE_BIG = "android.title.big";
-    field public static final int FLAG_AUTO_CANCEL = 16; // 0x10
-    field public static final int FLAG_FOREGROUND_SERVICE = 64; // 0x40
-    field public static final int FLAG_GROUP_SUMMARY = 512; // 0x200
-    field public static final deprecated int FLAG_HIGH_PRIORITY = 128; // 0x80
-    field public static final int FLAG_INSISTENT = 4; // 0x4
-    field public static final int FLAG_LOCAL_ONLY = 256; // 0x100
-    field public static final int FLAG_NO_CLEAR = 32; // 0x20
-    field public static final int FLAG_ONGOING_EVENT = 2; // 0x2
-    field public static final int FLAG_ONLY_ALERT_ONCE = 8; // 0x8
-    field public static final int FLAG_SHOW_LIGHTS = 1; // 0x1
-    field public static final int PRIORITY_DEFAULT = 0; // 0x0
-    field public static final int PRIORITY_HIGH = 1; // 0x1
-    field public static final int PRIORITY_LOW = -1; // 0xffffffff
-    field public static final int PRIORITY_MAX = 2; // 0x2
-    field public static final int PRIORITY_MIN = -2; // 0xfffffffe
-    field public static final int STREAM_DEFAULT = -1; // 0xffffffff
-    field public static final int VISIBILITY_PRIVATE = 0; // 0x0
-    field public static final int VISIBILITY_PUBLIC = 1; // 0x1
-    field public static final int VISIBILITY_SECRET = -1; // 0xffffffff
-  }
-
-  public static class NotificationCompat.Action extends android.support.v4.app.NotificationCompatBase.Action {
-    ctor public NotificationCompat.Action(int, java.lang.CharSequence, android.app.PendingIntent);
-    method public android.app.PendingIntent getActionIntent();
-    method public android.os.Bundle getExtras();
-    method public int getIcon();
-    method public android.support.v4.app.RemoteInput[] getRemoteInputs();
-    method public java.lang.CharSequence getTitle();
-    field public android.app.PendingIntent actionIntent;
-    field public int icon;
-    field public java.lang.CharSequence title;
-  }
-
-  public static final class NotificationCompat.Action.Builder {
-    ctor public NotificationCompat.Action.Builder(int, java.lang.CharSequence, android.app.PendingIntent);
-    ctor public NotificationCompat.Action.Builder(android.support.v4.app.NotificationCompat.Action);
-    method public android.support.v4.app.NotificationCompat.Action.Builder addExtras(android.os.Bundle);
-    method public android.support.v4.app.NotificationCompat.Action.Builder addRemoteInput(android.support.v4.app.RemoteInput);
-    method public android.support.v4.app.NotificationCompat.Action build();
-    method public android.support.v4.app.NotificationCompat.Action.Builder extend(android.support.v4.app.NotificationCompat.Action.Extender);
-    method public android.os.Bundle getExtras();
-  }
-
-  public static abstract interface NotificationCompat.Action.Extender {
-    method public abstract android.support.v4.app.NotificationCompat.Action.Builder extend(android.support.v4.app.NotificationCompat.Action.Builder);
-  }
-
-  public static final class NotificationCompat.Action.WearableExtender implements android.support.v4.app.NotificationCompat.Action.Extender {
-    ctor public NotificationCompat.Action.WearableExtender();
-    ctor public NotificationCompat.Action.WearableExtender(android.support.v4.app.NotificationCompat.Action);
-    method public android.support.v4.app.NotificationCompat.Action.WearableExtender clone();
-    method public android.support.v4.app.NotificationCompat.Action.Builder extend(android.support.v4.app.NotificationCompat.Action.Builder);
-    method public java.lang.CharSequence getCancelLabel();
-    method public java.lang.CharSequence getConfirmLabel();
-    method public java.lang.CharSequence getInProgressLabel();
-    method public boolean isAvailableOffline();
-    method public android.support.v4.app.NotificationCompat.Action.WearableExtender setAvailableOffline(boolean);
-    method public android.support.v4.app.NotificationCompat.Action.WearableExtender setCancelLabel(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.Action.WearableExtender setConfirmLabel(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.Action.WearableExtender setInProgressLabel(java.lang.CharSequence);
-  }
-
-  public static class NotificationCompat.BigPictureStyle extends android.support.v4.app.NotificationCompat.Style {
-    ctor public NotificationCompat.BigPictureStyle();
-    ctor public NotificationCompat.BigPictureStyle(android.support.v4.app.NotificationCompat.Builder);
-    method public android.support.v4.app.NotificationCompat.BigPictureStyle bigLargeIcon(android.graphics.Bitmap);
-    method public android.support.v4.app.NotificationCompat.BigPictureStyle bigPicture(android.graphics.Bitmap);
-    method public android.support.v4.app.NotificationCompat.BigPictureStyle setBigContentTitle(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.BigPictureStyle setSummaryText(java.lang.CharSequence);
-  }
-
-  public static class NotificationCompat.BigTextStyle extends android.support.v4.app.NotificationCompat.Style {
-    ctor public NotificationCompat.BigTextStyle();
-    ctor public NotificationCompat.BigTextStyle(android.support.v4.app.NotificationCompat.Builder);
-    method public android.support.v4.app.NotificationCompat.BigTextStyle bigText(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.BigTextStyle setBigContentTitle(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.BigTextStyle setSummaryText(java.lang.CharSequence);
-  }
-
-  public static class NotificationCompat.Builder {
-    ctor public NotificationCompat.Builder(android.content.Context);
-    method public android.support.v4.app.NotificationCompat.Builder addAction(int, java.lang.CharSequence, android.app.PendingIntent);
-    method public android.support.v4.app.NotificationCompat.Builder addAction(android.support.v4.app.NotificationCompat.Action);
-    method public android.support.v4.app.NotificationCompat.Builder addExtras(android.os.Bundle);
-    method public android.support.v4.app.NotificationCompat.Builder addPerson(java.lang.String);
-    method public android.app.Notification build();
-    method public android.support.v4.app.NotificationCompat.Builder extend(android.support.v4.app.NotificationCompat.Extender);
-    method public android.os.Bundle getExtras();
-    method public deprecated android.app.Notification getNotification();
-    method protected static java.lang.CharSequence limitCharSequenceLength(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.Builder setAutoCancel(boolean);
-    method public android.support.v4.app.NotificationCompat.Builder setCategory(java.lang.String);
-    method public android.support.v4.app.NotificationCompat.Builder setColor(int);
-    method public android.support.v4.app.NotificationCompat.Builder setContent(android.widget.RemoteViews);
-    method public android.support.v4.app.NotificationCompat.Builder setContentInfo(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.Builder setContentIntent(android.app.PendingIntent);
-    method public android.support.v4.app.NotificationCompat.Builder setContentText(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.Builder setContentTitle(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.Builder setDefaults(int);
-    method public android.support.v4.app.NotificationCompat.Builder setDeleteIntent(android.app.PendingIntent);
-    method public android.support.v4.app.NotificationCompat.Builder setExtras(android.os.Bundle);
-    method public android.support.v4.app.NotificationCompat.Builder setFullScreenIntent(android.app.PendingIntent, boolean);
-    method public android.support.v4.app.NotificationCompat.Builder setGroup(java.lang.String);
-    method public android.support.v4.app.NotificationCompat.Builder setGroupSummary(boolean);
-    method public android.support.v4.app.NotificationCompat.Builder setLargeIcon(android.graphics.Bitmap);
-    method public android.support.v4.app.NotificationCompat.Builder setLights(int, int, int);
-    method public android.support.v4.app.NotificationCompat.Builder setLocalOnly(boolean);
-    method public android.support.v4.app.NotificationCompat.Builder setNumber(int);
-    method public android.support.v4.app.NotificationCompat.Builder setOngoing(boolean);
-    method public android.support.v4.app.NotificationCompat.Builder setOnlyAlertOnce(boolean);
-    method public android.support.v4.app.NotificationCompat.Builder setPriority(int);
-    method public android.support.v4.app.NotificationCompat.Builder setProgress(int, int, boolean);
-    method public android.support.v4.app.NotificationCompat.Builder setPublicVersion(android.app.Notification);
-    method public android.support.v4.app.NotificationCompat.Builder setShowWhen(boolean);
-    method public android.support.v4.app.NotificationCompat.Builder setSmallIcon(int);
-    method public android.support.v4.app.NotificationCompat.Builder setSmallIcon(int, int);
-    method public android.support.v4.app.NotificationCompat.Builder setSortKey(java.lang.String);
-    method public android.support.v4.app.NotificationCompat.Builder setSound(android.net.Uri);
-    method public android.support.v4.app.NotificationCompat.Builder setSound(android.net.Uri, int);
-    method public android.support.v4.app.NotificationCompat.Builder setStyle(android.support.v4.app.NotificationCompat.Style);
-    method public android.support.v4.app.NotificationCompat.Builder setSubText(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.Builder setTicker(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.Builder setTicker(java.lang.CharSequence, android.widget.RemoteViews);
-    method public android.support.v4.app.NotificationCompat.Builder setUsesChronometer(boolean);
-    method public android.support.v4.app.NotificationCompat.Builder setVibrate(long[]);
-    method public android.support.v4.app.NotificationCompat.Builder setVisibility(int);
-    method public android.support.v4.app.NotificationCompat.Builder setWhen(long);
-    field public java.util.ArrayList<java.lang.String> mPeople;
-  }
-
-  public static final class NotificationCompat.CarExtender implements android.support.v4.app.NotificationCompat.Extender {
-    ctor public NotificationCompat.CarExtender();
-    ctor public NotificationCompat.CarExtender(android.app.Notification);
-    method public android.support.v4.app.NotificationCompat.Builder extend(android.support.v4.app.NotificationCompat.Builder);
-    method public int getColor();
-    method public android.graphics.Bitmap getLargeIcon();
-    method public android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation getUnreadConversation();
-    method public android.support.v4.app.NotificationCompat.CarExtender setColor(int);
-    method public android.support.v4.app.NotificationCompat.CarExtender setLargeIcon(android.graphics.Bitmap);
-    method public android.support.v4.app.NotificationCompat.CarExtender setUnreadConversation(android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation);
-  }
-
-  public static class NotificationCompat.CarExtender.UnreadConversation extends android.support.v4.app.NotificationCompatBase.UnreadConversation {
-    method public long getLatestTimestamp();
-    method public java.lang.String[] getMessages();
-    method public java.lang.String getParticipant();
-    method public java.lang.String[] getParticipants();
-    method public android.app.PendingIntent getReadPendingIntent();
-    method public android.support.v4.app.RemoteInput getRemoteInput();
-    method public android.app.PendingIntent getReplyPendingIntent();
-  }
-
-  public static class NotificationCompat.CarExtender.UnreadConversation.Builder {
-    ctor public NotificationCompat.CarExtender.UnreadConversation.Builder(java.lang.String);
-    method public android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation.Builder addMessage(java.lang.String);
-    method public android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation build();
-    method public android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation.Builder setLatestTimestamp(long);
-    method public android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation.Builder setReadPendingIntent(android.app.PendingIntent);
-    method public android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation.Builder setReplyAction(android.app.PendingIntent, android.support.v4.app.RemoteInput);
-  }
-
-  public static abstract interface NotificationCompat.Extender {
-    method public abstract android.support.v4.app.NotificationCompat.Builder extend(android.support.v4.app.NotificationCompat.Builder);
-  }
-
-  public static class NotificationCompat.InboxStyle extends android.support.v4.app.NotificationCompat.Style {
-    ctor public NotificationCompat.InboxStyle();
-    ctor public NotificationCompat.InboxStyle(android.support.v4.app.NotificationCompat.Builder);
-    method public android.support.v4.app.NotificationCompat.InboxStyle addLine(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.InboxStyle setBigContentTitle(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.InboxStyle setSummaryText(java.lang.CharSequence);
-  }
-
-  public static abstract class NotificationCompat.Style {
-    ctor public NotificationCompat.Style();
-    method public android.app.Notification build();
-    method public void setBuilder(android.support.v4.app.NotificationCompat.Builder);
-  }
-
-  public static final class NotificationCompat.WearableExtender implements android.support.v4.app.NotificationCompat.Extender {
-    ctor public NotificationCompat.WearableExtender();
-    ctor public NotificationCompat.WearableExtender(android.app.Notification);
-    method public android.support.v4.app.NotificationCompat.WearableExtender addAction(android.support.v4.app.NotificationCompat.Action);
-    method public android.support.v4.app.NotificationCompat.WearableExtender addActions(java.util.List<android.support.v4.app.NotificationCompat.Action>);
-    method public android.support.v4.app.NotificationCompat.WearableExtender addPage(android.app.Notification);
-    method public android.support.v4.app.NotificationCompat.WearableExtender addPages(java.util.List<android.app.Notification>);
-    method public android.support.v4.app.NotificationCompat.WearableExtender clearActions();
-    method public android.support.v4.app.NotificationCompat.WearableExtender clearPages();
-    method public android.support.v4.app.NotificationCompat.WearableExtender clone();
-    method public android.support.v4.app.NotificationCompat.Builder extend(android.support.v4.app.NotificationCompat.Builder);
-    method public java.util.List<android.support.v4.app.NotificationCompat.Action> getActions();
-    method public android.graphics.Bitmap getBackground();
-    method public int getContentAction();
-    method public int getContentIcon();
-    method public int getContentIconGravity();
-    method public boolean getContentIntentAvailableOffline();
-    method public int getCustomContentHeight();
-    method public int getCustomSizePreset();
-    method public android.app.PendingIntent getDisplayIntent();
-    method public int getGravity();
-    method public boolean getHintAvoidBackgroundClipping();
-    method public boolean getHintHideIcon();
-    method public int getHintScreenTimeout();
-    method public boolean getHintShowBackgroundOnly();
-    method public java.util.List<android.app.Notification> getPages();
-    method public boolean getStartScrollBottom();
-    method public android.support.v4.app.NotificationCompat.WearableExtender setBackground(android.graphics.Bitmap);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setContentAction(int);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setContentIcon(int);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setContentIconGravity(int);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setContentIntentAvailableOffline(boolean);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setCustomContentHeight(int);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setCustomSizePreset(int);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setDisplayIntent(android.app.PendingIntent);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setGravity(int);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setHintAvoidBackgroundClipping(boolean);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setHintHideIcon(boolean);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setHintScreenTimeout(int);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setHintShowBackgroundOnly(boolean);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setStartScrollBottom(boolean);
-    field public static final int SCREEN_TIMEOUT_LONG = -1; // 0xffffffff
-    field public static final int SCREEN_TIMEOUT_SHORT = 0; // 0x0
-    field public static final int SIZE_DEFAULT = 0; // 0x0
-    field public static final int SIZE_FULL_SCREEN = 5; // 0x5
-    field public static final int SIZE_LARGE = 4; // 0x4
-    field public static final int SIZE_MEDIUM = 3; // 0x3
-    field public static final int SIZE_SMALL = 2; // 0x2
-    field public static final int SIZE_XSMALL = 1; // 0x1
-    field public static final int UNSET_ACTION_INDEX = -1; // 0xffffffff
-  }
-
-  public class NotificationCompatBase {
-    ctor public NotificationCompatBase();
-  }
-
-  public static abstract class NotificationCompatBase.Action {
-    ctor public NotificationCompatBase.Action();
-    method public abstract android.app.PendingIntent getActionIntent();
-    method public abstract android.os.Bundle getExtras();
-    method public abstract int getIcon();
-    method public abstract android.support.v4.app.RemoteInputCompatBase.RemoteInput[] getRemoteInputs();
-    method public abstract java.lang.CharSequence getTitle();
-  }
-
-  public static abstract class NotificationCompatBase.UnreadConversation {
-    ctor public NotificationCompatBase.UnreadConversation();
-  }
-
-  public final class NotificationCompatExtras {
-    field public static final java.lang.String EXTRA_ACTION_EXTRAS = "android.support.actionExtras";
-    field public static final java.lang.String EXTRA_GROUP_KEY = "android.support.groupKey";
-    field public static final java.lang.String EXTRA_GROUP_SUMMARY = "android.support.isGroupSummary";
-    field public static final java.lang.String EXTRA_LOCAL_ONLY = "android.support.localOnly";
-    field public static final java.lang.String EXTRA_REMOTE_INPUTS = "android.support.remoteInputs";
-    field public static final java.lang.String EXTRA_SORT_KEY = "android.support.sortKey";
-  }
-
-  public abstract class NotificationCompatSideChannelService extends android.app.Service {
-    ctor public NotificationCompatSideChannelService();
-    method public abstract void cancel(java.lang.String, int, java.lang.String);
-    method public abstract void cancelAll(java.lang.String);
-    method public abstract void notify(java.lang.String, int, java.lang.String, android.app.Notification);
-    method public android.os.IBinder onBind(android.content.Intent);
-  }
-
-  public class NotificationManagerCompat {
-    method public void cancel(int);
-    method public void cancel(java.lang.String, int);
-    method public void cancelAll();
-    method public static android.support.v4.app.NotificationManagerCompat from(android.content.Context);
-    method public static java.util.Set<java.lang.String> getEnabledListenerPackages(android.content.Context);
-    method public void notify(int, android.app.Notification);
-    method public void notify(java.lang.String, int, android.app.Notification);
-    field public static final java.lang.String ACTION_BIND_SIDE_CHANNEL = "android.support.BIND_NOTIFICATION_SIDE_CHANNEL";
-    field public static final java.lang.String EXTRA_USE_SIDE_CHANNEL = "android.support.useSideChannel";
-  }
-
-  public class RemoteInput extends android.support.v4.app.RemoteInputCompatBase.RemoteInput {
-    method public static void addResultsToIntent(android.support.v4.app.RemoteInput[], android.content.Intent, android.os.Bundle);
-    method public boolean getAllowFreeFormInput();
-    method public java.lang.CharSequence[] getChoices();
-    method public android.os.Bundle getExtras();
-    method public java.lang.CharSequence getLabel();
-    method public java.lang.String getResultKey();
-    method public static android.os.Bundle getResultsFromIntent(android.content.Intent);
-    field public static final java.lang.String EXTRA_RESULTS_DATA = "android.remoteinput.resultsData";
-    field public static final java.lang.String RESULTS_CLIP_LABEL = "android.remoteinput.results";
-  }
-
-  public static final class RemoteInput.Builder {
-    ctor public RemoteInput.Builder(java.lang.String);
-    method public android.support.v4.app.RemoteInput.Builder addExtras(android.os.Bundle);
-    method public android.support.v4.app.RemoteInput build();
-    method public android.os.Bundle getExtras();
-    method public android.support.v4.app.RemoteInput.Builder setAllowFreeFormInput(boolean);
-    method public android.support.v4.app.RemoteInput.Builder setChoices(java.lang.CharSequence[]);
-    method public android.support.v4.app.RemoteInput.Builder setLabel(java.lang.CharSequence);
-  }
-
-   class RemoteInputCompatBase {
-  }
-
-  public static abstract class RemoteInputCompatBase.RemoteInput {
-    ctor public RemoteInputCompatBase.RemoteInput();
-    method protected abstract boolean getAllowFreeFormInput();
-    method protected abstract java.lang.CharSequence[] getChoices();
-    method protected abstract android.os.Bundle getExtras();
-    method protected abstract java.lang.CharSequence getLabel();
-    method protected abstract java.lang.String getResultKey();
-  }
-
-  public class ServiceCompat {
-    field public static final int START_STICKY = 1; // 0x1
-  }
-
-  public class ShareCompat {
-    ctor public ShareCompat();
-    method public static void configureMenuItem(android.view.MenuItem, android.support.v4.app.ShareCompat.IntentBuilder);
-    method public static void configureMenuItem(android.view.Menu, int, android.support.v4.app.ShareCompat.IntentBuilder);
-    method public static android.content.ComponentName getCallingActivity(android.app.Activity);
-    method public static java.lang.String getCallingPackage(android.app.Activity);
-    field public static final java.lang.String EXTRA_CALLING_ACTIVITY = "android.support.v4.app.EXTRA_CALLING_ACTIVITY";
-    field public static final java.lang.String EXTRA_CALLING_PACKAGE = "android.support.v4.app.EXTRA_CALLING_PACKAGE";
-  }
-
-  public static class ShareCompat.IntentBuilder {
-    method public android.support.v4.app.ShareCompat.IntentBuilder addEmailBcc(java.lang.String);
-    method public android.support.v4.app.ShareCompat.IntentBuilder addEmailBcc(java.lang.String[]);
-    method public android.support.v4.app.ShareCompat.IntentBuilder addEmailCc(java.lang.String);
-    method public android.support.v4.app.ShareCompat.IntentBuilder addEmailCc(java.lang.String[]);
-    method public android.support.v4.app.ShareCompat.IntentBuilder addEmailTo(java.lang.String);
-    method public android.support.v4.app.ShareCompat.IntentBuilder addEmailTo(java.lang.String[]);
-    method public android.support.v4.app.ShareCompat.IntentBuilder addStream(android.net.Uri);
-    method public android.content.Intent createChooserIntent();
-    method public static android.support.v4.app.ShareCompat.IntentBuilder from(android.app.Activity);
-    method public android.content.Intent getIntent();
-    method public android.support.v4.app.ShareCompat.IntentBuilder setChooserTitle(java.lang.CharSequence);
-    method public android.support.v4.app.ShareCompat.IntentBuilder setChooserTitle(int);
-    method public android.support.v4.app.ShareCompat.IntentBuilder setEmailBcc(java.lang.String[]);
-    method public android.support.v4.app.ShareCompat.IntentBuilder setEmailCc(java.lang.String[]);
-    method public android.support.v4.app.ShareCompat.IntentBuilder setEmailTo(java.lang.String[]);
-    method public android.support.v4.app.ShareCompat.IntentBuilder setHtmlText(java.lang.String);
-    method public android.support.v4.app.ShareCompat.IntentBuilder setStream(android.net.Uri);
-    method public android.support.v4.app.ShareCompat.IntentBuilder setSubject(java.lang.String);
-    method public android.support.v4.app.ShareCompat.IntentBuilder setText(java.lang.CharSequence);
-    method public android.support.v4.app.ShareCompat.IntentBuilder setType(java.lang.String);
-    method public void startChooser();
-  }
-
-  public static class ShareCompat.IntentReader {
-    method public static android.support.v4.app.ShareCompat.IntentReader from(android.app.Activity);
-    method public android.content.ComponentName getCallingActivity();
-    method public android.graphics.drawable.Drawable getCallingActivityIcon();
-    method public android.graphics.drawable.Drawable getCallingApplicationIcon();
-    method public java.lang.CharSequence getCallingApplicationLabel();
-    method public java.lang.String getCallingPackage();
-    method public java.lang.String[] getEmailBcc();
-    method public java.lang.String[] getEmailCc();
-    method public java.lang.String[] getEmailTo();
-    method public java.lang.String getHtmlText();
-    method public android.net.Uri getStream();
-    method public android.net.Uri getStream(int);
-    method public int getStreamCount();
-    method public java.lang.String getSubject();
-    method public java.lang.CharSequence getText();
-    method public java.lang.String getType();
-    method public boolean isMultipleShare();
-    method public boolean isShareIntent();
-    method public boolean isSingleShare();
-  }
-
-  public abstract class SharedElementCallback {
-    ctor public SharedElementCallback();
-    method public android.os.Parcelable onCaptureSharedElementSnapshot(android.view.View, android.graphics.Matrix, android.graphics.RectF);
-    method public android.view.View onCreateSnapshotView(android.content.Context, android.os.Parcelable);
-    method public void onMapSharedElements(java.util.List<java.lang.String>, java.util.Map<java.lang.String, android.view.View>);
-    method public void onRejectSharedElements(java.util.List<android.view.View>);
-    method public void onSharedElementEnd(java.util.List<java.lang.String>, java.util.List<android.view.View>, java.util.List<android.view.View>);
-    method public void onSharedElementStart(java.util.List<java.lang.String>, java.util.List<android.view.View>, java.util.List<android.view.View>);
-  }
-
-  public class TaskStackBuilder implements java.lang.Iterable {
-    method public android.support.v4.app.TaskStackBuilder addNextIntent(android.content.Intent);
-    method public android.support.v4.app.TaskStackBuilder addNextIntentWithParentStack(android.content.Intent);
-    method public android.support.v4.app.TaskStackBuilder addParentStack(android.app.Activity);
-    method public android.support.v4.app.TaskStackBuilder addParentStack(java.lang.Class<?>);
-    method public android.support.v4.app.TaskStackBuilder addParentStack(android.content.ComponentName);
-    method public static android.support.v4.app.TaskStackBuilder create(android.content.Context);
-    method public android.content.Intent editIntentAt(int);
-    method public static deprecated android.support.v4.app.TaskStackBuilder from(android.content.Context);
-    method public deprecated android.content.Intent getIntent(int);
-    method public int getIntentCount();
-    method public android.content.Intent[] getIntents();
-    method public android.app.PendingIntent getPendingIntent(int, int);
-    method public android.app.PendingIntent getPendingIntent(int, int, android.os.Bundle);
-    method public deprecated java.util.Iterator<android.content.Intent> iterator();
-    method public void startActivities();
-    method public void startActivities(android.os.Bundle);
-  }
-
-  public static abstract interface TaskStackBuilder.SupportParentable {
-    method public abstract android.content.Intent getSupportParentActivityIntent();
-  }
-
-}
-
-package android.support.v4.content {
-
-  public abstract class AsyncTaskLoader extends android.support.v4.content.Loader {
-    ctor public AsyncTaskLoader(android.content.Context);
-    method public void cancelLoadInBackground();
-    method public boolean isLoadInBackgroundCanceled();
-    method public abstract D loadInBackground();
-    method public void onCanceled(D);
-    method protected D onLoadInBackground();
-    method public void setUpdateThrottle(long);
-  }
-
-  public class ContentResolverCompat {
-    method public static android.database.Cursor query(android.content.ContentResolver, android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, android.support.v4.os.CancellationSignal);
-  }
-
-  public class ContextCompat {
-    ctor public ContextCompat();
-    method public static int checkSelfPermission(android.content.Context, java.lang.String);
-    method public final java.io.File getCodeCacheDir(android.content.Context);
-    method public static final int getColor(android.content.Context, int);
-    method public static final android.content.res.ColorStateList getColorStateList(android.content.Context, int);
-    method public static final android.graphics.drawable.Drawable getDrawable(android.content.Context, int);
-    method public static java.io.File[] getExternalCacheDirs(android.content.Context);
-    method public static java.io.File[] getExternalFilesDirs(android.content.Context, java.lang.String);
-    method public final java.io.File getNoBackupFilesDir(android.content.Context);
-    method public static java.io.File[] getObbDirs(android.content.Context);
-    method public static boolean startActivities(android.content.Context, android.content.Intent[]);
-    method public static boolean startActivities(android.content.Context, android.content.Intent[], android.os.Bundle);
-  }
-
-  public class CursorLoader extends android.support.v4.content.AsyncTaskLoader {
-    ctor public CursorLoader(android.content.Context);
-    ctor public CursorLoader(android.content.Context, android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String);
-    method public void deliverResult(android.database.Cursor);
-    method public java.lang.String[] getProjection();
-    method public java.lang.String getSelection();
-    method public java.lang.String[] getSelectionArgs();
-    method public java.lang.String getSortOrder();
-    method public android.net.Uri getUri();
-    method public android.database.Cursor loadInBackground();
-    method public void onCanceled(android.database.Cursor);
-    method public void setProjection(java.lang.String[]);
-    method public void setSelection(java.lang.String);
-    method public void setSelectionArgs(java.lang.String[]);
-    method public void setSortOrder(java.lang.String);
-    method public void setUri(android.net.Uri);
-  }
-
-  public class FileProvider extends android.content.ContentProvider {
-    ctor public FileProvider();
-    method public int delete(android.net.Uri, java.lang.String, java.lang.String[]);
-    method public java.lang.String getType(android.net.Uri);
-    method public static android.net.Uri getUriForFile(android.content.Context, java.lang.String, java.io.File);
-    method public android.net.Uri insert(android.net.Uri, android.content.ContentValues);
-    method public boolean onCreate();
-    method public android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String);
-    method public int update(android.net.Uri, android.content.ContentValues, java.lang.String, java.lang.String[]);
-  }
-
-  public class IntentCompat {
-    method public static android.content.Intent makeMainActivity(android.content.ComponentName);
-    method public static android.content.Intent makeMainSelectorActivity(java.lang.String, java.lang.String);
-    method public static android.content.Intent makeRestartActivityTask(android.content.ComponentName);
-    field public static final java.lang.String ACTION_EXTERNAL_APPLICATIONS_AVAILABLE = "android.intent.action.EXTERNAL_APPLICATIONS_AVAILABLE";
-    field public static final java.lang.String ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE = "android.intent.action.EXTERNAL_APPLICATIONS_UNAVAILABLE";
-    field public static final java.lang.String EXTRA_CHANGED_PACKAGE_LIST = "android.intent.extra.changed_package_list";
-    field public static final java.lang.String EXTRA_CHANGED_UID_LIST = "android.intent.extra.changed_uid_list";
-    field public static final java.lang.String EXTRA_HTML_TEXT = "android.intent.extra.HTML_TEXT";
-    field public static final int FLAG_ACTIVITY_CLEAR_TASK = 32768; // 0x8000
-    field public static final int FLAG_ACTIVITY_TASK_ON_HOME = 16384; // 0x4000
-  }
-
-  public class Loader {
-    ctor public Loader(android.content.Context);
-    method public void abandon();
-    method public boolean cancelLoad();
-    method public void commitContentChanged();
-    method public java.lang.String dataToString(D);
-    method public void deliverCancellation();
-    method public void deliverResult(D);
-    method public void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
-    method public void forceLoad();
-    method public android.content.Context getContext();
-    method public int getId();
-    method public boolean isAbandoned();
-    method public boolean isReset();
-    method public boolean isStarted();
-    method protected void onAbandon();
-    method protected boolean onCancelLoad();
-    method public void onContentChanged();
-    method protected void onForceLoad();
-    method protected void onReset();
-    method protected void onStartLoading();
-    method protected void onStopLoading();
-    method public void registerListener(int, android.support.v4.content.Loader.OnLoadCompleteListener<D>);
-    method public void registerOnLoadCanceledListener(android.support.v4.content.Loader.OnLoadCanceledListener<D>);
-    method public void reset();
-    method public void rollbackContentChanged();
-    method public final void startLoading();
-    method public void stopLoading();
-    method public boolean takeContentChanged();
-    method public void unregisterListener(android.support.v4.content.Loader.OnLoadCompleteListener<D>);
-    method public void unregisterOnLoadCanceledListener(android.support.v4.content.Loader.OnLoadCanceledListener<D>);
-  }
-
-  public final class Loader.ForceLoadContentObserver extends android.database.ContentObserver {
-    ctor public Loader.ForceLoadContentObserver();
-  }
-
-  public static abstract interface Loader.OnLoadCanceledListener {
-    method public abstract void onLoadCanceled(android.support.v4.content.Loader<D>);
-  }
-
-  public static abstract interface Loader.OnLoadCompleteListener {
-    method public abstract void onLoadComplete(android.support.v4.content.Loader<D>, D);
-  }
-
-  public class LocalBroadcastManager {
-    method public static android.support.v4.content.LocalBroadcastManager getInstance(android.content.Context);
-    method public void registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter);
-    method public boolean sendBroadcast(android.content.Intent);
-    method public void sendBroadcastSync(android.content.Intent);
-    method public void unregisterReceiver(android.content.BroadcastReceiver);
-  }
-
-  public class ParallelExecutorCompat {
-    ctor public ParallelExecutorCompat();
-    method public static java.util.concurrent.Executor getParallelExecutor();
-  }
-
-  public final class PermissionChecker {
-    method public static int checkCallingOrSelfPermission(android.content.Context, java.lang.String);
-    method public static int checkCallingPermission(android.content.Context, java.lang.String, java.lang.String);
-    method public static int checkPermission(android.content.Context, java.lang.String, int, int, java.lang.String);
-    method public static int checkSelfPermission(android.content.Context, java.lang.String);
-    field public static final int PERMISSION_DENIED = -1; // 0xffffffff
-    field public static final int PERMISSION_DENIED_APP_OP = -2; // 0xfffffffe
-    field public static final int PERMISSION_GRANTED = 0; // 0x0
-  }
-
-  public static abstract class PermissionChecker.PermissionResult implements java.lang.annotation.Annotation {
-  }
-
-  public class SharedPreferencesCompat {
-    ctor public SharedPreferencesCompat();
-  }
-
-  public static class SharedPreferencesCompat.EditorCompat {
-    method public void apply(android.content.SharedPreferences.Editor);
-    method public static android.support.v4.content.SharedPreferencesCompat.EditorCompat getInstance();
-  }
-
-  public abstract class WakefulBroadcastReceiver extends android.content.BroadcastReceiver {
-    ctor public WakefulBroadcastReceiver();
-    method public static boolean completeWakefulIntent(android.content.Intent);
-    method public static android.content.ComponentName startWakefulService(android.content.Context, android.content.Intent);
-  }
-
-}
-
-package android.support.v4.content.pm {
-
-  public class ActivityInfoCompat {
-    field public static final int CONFIG_UI_MODE = 512; // 0x200
-  }
-
-}
-
-package android.support.v4.content.res {
-
-  public class ResourcesCompat {
-    ctor public ResourcesCompat();
-    method public int getColor(android.content.res.Resources, int, android.content.res.Resources.Theme) throws android.content.res.Resources.NotFoundException;
-    method public android.content.res.ColorStateList getColorStateList(android.content.res.Resources, int, android.content.res.Resources.Theme) throws android.content.res.Resources.NotFoundException;
-    method public static android.graphics.drawable.Drawable getDrawable(android.content.res.Resources, int, android.content.res.Resources.Theme) throws android.content.res.Resources.NotFoundException;
-    method public static android.graphics.drawable.Drawable getDrawableForDensity(android.content.res.Resources, int, int, android.content.res.Resources.Theme) throws android.content.res.Resources.NotFoundException;
-  }
-
-}
-
-package android.support.v4.database {
-
-  public class DatabaseUtilsCompat {
-    method public static java.lang.String[] appendSelectionArgs(java.lang.String[], java.lang.String[]);
-    method public static java.lang.String concatenateWhere(java.lang.String, java.lang.String);
-  }
-
-}
-
-package android.support.v4.graphics {
-
-  public class BitmapCompat {
-    ctor public BitmapCompat();
-    method public static int getAllocationByteCount(android.graphics.Bitmap);
-    method public static boolean hasMipMap(android.graphics.Bitmap);
-    method public static void setHasMipMap(android.graphics.Bitmap, boolean);
-  }
-
-  public class ColorUtils {
-    method public static int HSLToColor(float[]);
-    method public static void RGBToHSL(int, int, int, float[]);
-    method public static double calculateContrast(int, int);
-    method public static double calculateLuminance(int);
-    method public static int calculateMinimumAlpha(int, int, float);
-    method public static void colorToHSL(int, float[]);
-    method public static int compositeColors(int, int);
-    method public static int setAlphaComponent(int, int);
-  }
-
-}
-
-package android.support.v4.graphics.drawable {
-
-  public class DrawableCompat {
-    ctor public DrawableCompat();
-    method public static int getLayoutDirection(android.graphics.drawable.Drawable);
-    method public static boolean isAutoMirrored(android.graphics.drawable.Drawable);
-    method public static void jumpToCurrentState(android.graphics.drawable.Drawable);
-    method public static void setAutoMirrored(android.graphics.drawable.Drawable, boolean);
-    method public static void setHotspot(android.graphics.drawable.Drawable, float, float);
-    method public static void setHotspotBounds(android.graphics.drawable.Drawable, int, int, int, int);
-    method public static void setLayoutDirection(android.graphics.drawable.Drawable, int);
-    method public static void setTint(android.graphics.drawable.Drawable, int);
-    method public static void setTintList(android.graphics.drawable.Drawable, android.content.res.ColorStateList);
-    method public static void setTintMode(android.graphics.drawable.Drawable, android.graphics.PorterDuff.Mode);
-    method public static T unwrap(android.graphics.drawable.Drawable);
-    method public static android.graphics.drawable.Drawable wrap(android.graphics.drawable.Drawable);
-  }
-
-  public abstract class RoundedBitmapDrawable extends android.graphics.drawable.Drawable {
-    method public void draw(android.graphics.Canvas);
-    method public final android.graphics.Bitmap getBitmap();
-    method public float getCornerRadius();
-    method public int getGravity();
-    method public int getOpacity();
-    method public final android.graphics.Paint getPaint();
-    method public boolean hasAntiAlias();
-    method public boolean hasMipMap();
-    method public boolean isCircular();
-    method public void setAlpha(int);
-    method public void setAntiAlias(boolean);
-    method public void setCircular(boolean);
-    method public void setColorFilter(android.graphics.ColorFilter);
-    method public void setCornerRadius(float);
-    method public void setGravity(int);
-    method public void setMipMap(boolean);
-    method public void setTargetDensity(android.graphics.Canvas);
-    method public void setTargetDensity(android.util.DisplayMetrics);
-    method public void setTargetDensity(int);
-  }
-
-  public class RoundedBitmapDrawableFactory {
-    ctor public RoundedBitmapDrawableFactory();
-    method public static android.support.v4.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, android.graphics.Bitmap);
-    method public static android.support.v4.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, java.lang.String);
-    method public static android.support.v4.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, java.io.InputStream);
-  }
-
-}
-
-package android.support.v4.hardware.display {
-
-  public abstract class DisplayManagerCompat {
-    method public abstract android.view.Display getDisplay(int);
-    method public abstract android.view.Display[] getDisplays();
-    method public abstract android.view.Display[] getDisplays(java.lang.String);
-    method public static android.support.v4.hardware.display.DisplayManagerCompat getInstance(android.content.Context);
-    field public static final java.lang.String DISPLAY_CATEGORY_PRESENTATION = "android.hardware.display.category.PRESENTATION";
-  }
-
-}
-
-package android.support.v4.hardware.fingerprint {
-
-  public class FingerprintManagerCompat {
-    method public void authenticate(android.support.v4.hardware.fingerprint.FingerprintManagerCompat.CryptoObject, int, android.support.v4.os.CancellationSignal, android.support.v4.hardware.fingerprint.FingerprintManagerCompat.AuthenticationCallback, android.os.Handler);
-    method public static android.support.v4.hardware.fingerprint.FingerprintManagerCompat from(android.content.Context);
-    method public boolean hasEnrolledFingerprints();
-    method public boolean isHardwareDetected();
-  }
-
-  public static abstract class FingerprintManagerCompat.AuthenticationCallback {
-    ctor public FingerprintManagerCompat.AuthenticationCallback();
-    method public void onAuthenticationError(int, java.lang.CharSequence);
-    method public void onAuthenticationFailed();
-    method public void onAuthenticationHelp(int, java.lang.CharSequence);
-    method public void onAuthenticationSucceeded(android.support.v4.hardware.fingerprint.FingerprintManagerCompat.AuthenticationResult);
-  }
-
-  public static final class FingerprintManagerCompat.AuthenticationResult {
-    ctor public FingerprintManagerCompat.AuthenticationResult(android.support.v4.hardware.fingerprint.FingerprintManagerCompat.CryptoObject);
-    method public android.support.v4.hardware.fingerprint.FingerprintManagerCompat.CryptoObject getCryptoObject();
-  }
-
-  public static class FingerprintManagerCompat.CryptoObject {
-    ctor public FingerprintManagerCompat.CryptoObject(java.security.Signature);
-    ctor public FingerprintManagerCompat.CryptoObject(javax.crypto.Cipher);
-    ctor public FingerprintManagerCompat.CryptoObject(javax.crypto.Mac);
-    method public javax.crypto.Cipher getCipher();
-    method public javax.crypto.Mac getMac();
-    method public java.security.Signature getSignature();
-  }
-
-}
-
-package android.support.v4.media {
-
-  public final class MediaDescriptionCompat implements android.os.Parcelable {
-    method public int describeContents();
-    method public static android.support.v4.media.MediaDescriptionCompat fromMediaDescription(java.lang.Object);
-    method public java.lang.CharSequence getDescription();
-    method public android.os.Bundle getExtras();
-    method public android.graphics.Bitmap getIconBitmap();
-    method public android.net.Uri getIconUri();
-    method public java.lang.Object getMediaDescription();
-    method public java.lang.String getMediaId();
-    method public android.net.Uri getMediaUri();
-    method public java.lang.CharSequence getSubtitle();
-    method public java.lang.CharSequence getTitle();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.support.v4.media.MediaDescriptionCompat> CREATOR;
-  }
-
-  public static final class MediaDescriptionCompat.Builder {
-    ctor public MediaDescriptionCompat.Builder();
-    method public android.support.v4.media.MediaDescriptionCompat build();
-    method public android.support.v4.media.MediaDescriptionCompat.Builder setDescription(java.lang.CharSequence);
-    method public android.support.v4.media.MediaDescriptionCompat.Builder setExtras(android.os.Bundle);
-    method public android.support.v4.media.MediaDescriptionCompat.Builder setIconBitmap(android.graphics.Bitmap);
-    method public android.support.v4.media.MediaDescriptionCompat.Builder setIconUri(android.net.Uri);
-    method public android.support.v4.media.MediaDescriptionCompat.Builder setMediaId(java.lang.String);
-    method public android.support.v4.media.MediaDescriptionCompat.Builder setMediaUri(android.net.Uri);
-    method public android.support.v4.media.MediaDescriptionCompat.Builder setSubtitle(java.lang.CharSequence);
-    method public android.support.v4.media.MediaDescriptionCompat.Builder setTitle(java.lang.CharSequence);
-  }
-
-  public final class MediaMetadataCompat implements android.os.Parcelable {
-    method public boolean containsKey(java.lang.String);
-    method public int describeContents();
-    method public static android.support.v4.media.MediaMetadataCompat fromMediaMetadata(java.lang.Object);
-    method public android.graphics.Bitmap getBitmap(java.lang.String);
-    method public android.os.Bundle getBundle();
-    method public android.support.v4.media.MediaDescriptionCompat getDescription();
-    method public long getLong(java.lang.String);
-    method public java.lang.Object getMediaMetadata();
-    method public android.support.v4.media.RatingCompat getRating(java.lang.String);
-    method public java.lang.String getString(java.lang.String);
-    method public java.lang.CharSequence getText(java.lang.String);
-    method public java.util.Set<java.lang.String> keySet();
-    method public int size();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.support.v4.media.MediaMetadataCompat> CREATOR;
-    field public static final java.lang.String METADATA_KEY_ALBUM = "android.media.metadata.ALBUM";
-    field public static final java.lang.String METADATA_KEY_ALBUM_ART = "android.media.metadata.ALBUM_ART";
-    field public static final java.lang.String METADATA_KEY_ALBUM_ARTIST = "android.media.metadata.ALBUM_ARTIST";
-    field public static final java.lang.String METADATA_KEY_ALBUM_ART_URI = "android.media.metadata.ALBUM_ART_URI";
-    field public static final java.lang.String METADATA_KEY_ART = "android.media.metadata.ART";
-    field public static final java.lang.String METADATA_KEY_ARTIST = "android.media.metadata.ARTIST";
-    field public static final java.lang.String METADATA_KEY_ART_URI = "android.media.metadata.ART_URI";
-    field public static final java.lang.String METADATA_KEY_AUTHOR = "android.media.metadata.AUTHOR";
-    field public static final java.lang.String METADATA_KEY_COMPILATION = "android.media.metadata.COMPILATION";
-    field public static final java.lang.String METADATA_KEY_COMPOSER = "android.media.metadata.COMPOSER";
-    field public static final java.lang.String METADATA_KEY_DATE = "android.media.metadata.DATE";
-    field public static final java.lang.String METADATA_KEY_DISC_NUMBER = "android.media.metadata.DISC_NUMBER";
-    field public static final java.lang.String METADATA_KEY_DISPLAY_DESCRIPTION = "android.media.metadata.DISPLAY_DESCRIPTION";
-    field public static final java.lang.String METADATA_KEY_DISPLAY_ICON = "android.media.metadata.DISPLAY_ICON";
-    field public static final java.lang.String METADATA_KEY_DISPLAY_ICON_URI = "android.media.metadata.DISPLAY_ICON_URI";
-    field public static final java.lang.String METADATA_KEY_DISPLAY_SUBTITLE = "android.media.metadata.DISPLAY_SUBTITLE";
-    field public static final java.lang.String METADATA_KEY_DISPLAY_TITLE = "android.media.metadata.DISPLAY_TITLE";
-    field public static final java.lang.String METADATA_KEY_DURATION = "android.media.metadata.DURATION";
-    field public static final java.lang.String METADATA_KEY_GENRE = "android.media.metadata.GENRE";
-    field public static final java.lang.String METADATA_KEY_MEDIA_ID = "android.media.metadata.MEDIA_ID";
-    field public static final java.lang.String METADATA_KEY_NUM_TRACKS = "android.media.metadata.NUM_TRACKS";
-    field public static final java.lang.String METADATA_KEY_RATING = "android.media.metadata.RATING";
-    field public static final java.lang.String METADATA_KEY_TITLE = "android.media.metadata.TITLE";
-    field public static final java.lang.String METADATA_KEY_TRACK_NUMBER = "android.media.metadata.TRACK_NUMBER";
-    field public static final java.lang.String METADATA_KEY_USER_RATING = "android.media.metadata.USER_RATING";
-    field public static final java.lang.String METADATA_KEY_WRITER = "android.media.metadata.WRITER";
-    field public static final java.lang.String METADATA_KEY_YEAR = "android.media.metadata.YEAR";
-  }
-
-  public static final class MediaMetadataCompat.Builder {
-    ctor public MediaMetadataCompat.Builder();
-    ctor public MediaMetadataCompat.Builder(android.support.v4.media.MediaMetadataCompat);
-    method public android.support.v4.media.MediaMetadataCompat build();
-    method public android.support.v4.media.MediaMetadataCompat.Builder putBitmap(java.lang.String, android.graphics.Bitmap);
-    method public android.support.v4.media.MediaMetadataCompat.Builder putLong(java.lang.String, long);
-    method public android.support.v4.media.MediaMetadataCompat.Builder putRating(java.lang.String, android.support.v4.media.RatingCompat);
-    method public android.support.v4.media.MediaMetadataCompat.Builder putString(java.lang.String, java.lang.String);
-    method public android.support.v4.media.MediaMetadataCompat.Builder putText(java.lang.String, java.lang.CharSequence);
-  }
-
-  public final class RatingCompat implements android.os.Parcelable {
-    method public int describeContents();
-    method public static android.support.v4.media.RatingCompat fromRating(java.lang.Object);
-    method public float getPercentRating();
-    method public java.lang.Object getRating();
-    method public int getRatingStyle();
-    method public float getStarRating();
-    method public boolean hasHeart();
-    method public boolean isRated();
-    method public boolean isThumbUp();
-    method public static android.support.v4.media.RatingCompat newHeartRating(boolean);
-    method public static android.support.v4.media.RatingCompat newPercentageRating(float);
-    method public static android.support.v4.media.RatingCompat newStarRating(int, float);
-    method public static android.support.v4.media.RatingCompat newThumbRating(boolean);
-    method public static android.support.v4.media.RatingCompat newUnratedRating(int);
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.support.v4.media.RatingCompat> CREATOR;
-    field public static final int RATING_3_STARS = 3; // 0x3
-    field public static final int RATING_4_STARS = 4; // 0x4
-    field public static final int RATING_5_STARS = 5; // 0x5
-    field public static final int RATING_HEART = 1; // 0x1
-    field public static final int RATING_NONE = 0; // 0x0
-    field public static final int RATING_PERCENTAGE = 6; // 0x6
-    field public static final int RATING_THUMB_UP_DOWN = 2; // 0x2
-  }
-
-  public abstract class TransportController {
-    ctor public TransportController();
-    method public abstract int getBufferPercentage();
-    method public abstract long getCurrentPosition();
-    method public abstract long getDuration();
-    method public abstract int getTransportControlFlags();
-    method public abstract boolean isPlaying();
-    method public abstract void pausePlaying();
-    method public abstract void registerStateListener(android.support.v4.media.TransportStateListener);
-    method public abstract void seekTo(long);
-    method public abstract void startPlaying();
-    method public abstract void stopPlaying();
-    method public abstract void unregisterStateListener(android.support.v4.media.TransportStateListener);
-  }
-
-  public class TransportMediator extends android.support.v4.media.TransportController {
-    ctor public TransportMediator(android.app.Activity, android.support.v4.media.TransportPerformer);
-    ctor public TransportMediator(android.view.View, android.support.v4.media.TransportPerformer);
-    method public void destroy();
-    method public boolean dispatchKeyEvent(android.view.KeyEvent);
-    method public int getBufferPercentage();
-    method public long getCurrentPosition();
-    method public long getDuration();
-    method public java.lang.Object getRemoteControlClient();
-    method public int getTransportControlFlags();
-    method public boolean isPlaying();
-    method public void pausePlaying();
-    method public void refreshState();
-    method public void registerStateListener(android.support.v4.media.TransportStateListener);
-    method public void seekTo(long);
-    method public void startPlaying();
-    method public void stopPlaying();
-    method public void unregisterStateListener(android.support.v4.media.TransportStateListener);
-    field public static final int FLAG_KEY_MEDIA_FAST_FORWARD = 64; // 0x40
-    field public static final int FLAG_KEY_MEDIA_NEXT = 128; // 0x80
-    field public static final int FLAG_KEY_MEDIA_PAUSE = 16; // 0x10
-    field public static final int FLAG_KEY_MEDIA_PLAY = 4; // 0x4
-    field public static final int FLAG_KEY_MEDIA_PLAY_PAUSE = 8; // 0x8
-    field public static final int FLAG_KEY_MEDIA_PREVIOUS = 1; // 0x1
-    field public static final int FLAG_KEY_MEDIA_REWIND = 2; // 0x2
-    field public static final int FLAG_KEY_MEDIA_STOP = 32; // 0x20
-    field public static final int KEYCODE_MEDIA_PAUSE = 127; // 0x7f
-    field public static final int KEYCODE_MEDIA_PLAY = 126; // 0x7e
-    field public static final int KEYCODE_MEDIA_RECORD = 130; // 0x82
-  }
-
-  public abstract class TransportPerformer {
-    ctor public TransportPerformer();
-    method public void onAudioFocusChange(int);
-    method public int onGetBufferPercentage();
-    method public abstract long onGetCurrentPosition();
-    method public abstract long onGetDuration();
-    method public int onGetTransportControlFlags();
-    method public abstract boolean onIsPlaying();
-    method public boolean onMediaButtonDown(int, android.view.KeyEvent);
-    method public boolean onMediaButtonUp(int, android.view.KeyEvent);
-    method public abstract void onPause();
-    method public abstract void onSeekTo(long);
-    method public abstract void onStart();
-    method public abstract void onStop();
-  }
-
-  public class TransportStateListener {
-    ctor public TransportStateListener();
-    method public void onPlayingChanged(android.support.v4.media.TransportController);
-    method public void onTransportControlsChanged(android.support.v4.media.TransportController);
-  }
-
-  public abstract class VolumeProviderCompat {
-    ctor public VolumeProviderCompat(int, int, int);
-    method public final int getCurrentVolume();
-    method public final int getMaxVolume();
-    method public final int getVolumeControl();
-    method public java.lang.Object getVolumeProvider();
-    method public void onAdjustVolume(int);
-    method public void onSetVolumeTo(int);
-    method public void setCallback(android.support.v4.media.VolumeProviderCompat.Callback);
-    method public final void setCurrentVolume(int);
-    field public static final int VOLUME_CONTROL_ABSOLUTE = 2; // 0x2
-    field public static final int VOLUME_CONTROL_FIXED = 0; // 0x0
-    field public static final int VOLUME_CONTROL_RELATIVE = 1; // 0x1
-  }
-
-  public static abstract class VolumeProviderCompat.Callback {
-    ctor public VolumeProviderCompat.Callback();
-    method public abstract void onVolumeChanged(android.support.v4.media.VolumeProviderCompat);
-  }
-
-}
-
-package android.support.v4.media.session {
-
-  public class MediaButtonReceiver extends android.content.BroadcastReceiver {
-    ctor public MediaButtonReceiver();
-    method public static android.view.KeyEvent handleIntent(android.support.v4.media.session.MediaSessionCompat, android.content.Intent);
-    method public void onReceive(android.content.Context, android.content.Intent);
-  }
-
-  public final class MediaControllerCompat {
-    ctor public MediaControllerCompat(android.content.Context, android.support.v4.media.session.MediaSessionCompat);
-    ctor public MediaControllerCompat(android.content.Context, android.support.v4.media.session.MediaSessionCompat.Token) throws android.os.RemoteException;
-    method public void adjustVolume(int, int);
-    method public boolean dispatchMediaButtonEvent(android.view.KeyEvent);
-    method public android.os.Bundle getExtras();
-    method public long getFlags();
-    method public java.lang.Object getMediaController();
-    method public android.support.v4.media.MediaMetadataCompat getMetadata();
-    method public java.lang.String getPackageName();
-    method public android.support.v4.media.session.MediaControllerCompat.PlaybackInfo getPlaybackInfo();
-    method public android.support.v4.media.session.PlaybackStateCompat getPlaybackState();
-    method public java.util.List<android.support.v4.media.session.MediaSessionCompat.QueueItem> getQueue();
-    method public java.lang.CharSequence getQueueTitle();
-    method public int getRatingType();
-    method public android.app.PendingIntent getSessionActivity();
-    method public android.support.v4.media.session.MediaSessionCompat.Token getSessionToken();
-    method public android.support.v4.media.session.MediaControllerCompat.TransportControls getTransportControls();
-    method public void registerCallback(android.support.v4.media.session.MediaControllerCompat.Callback);
-    method public void registerCallback(android.support.v4.media.session.MediaControllerCompat.Callback, android.os.Handler);
-    method public void sendCommand(java.lang.String, android.os.Bundle, android.os.ResultReceiver);
-    method public void setVolumeTo(int, int);
-    method public void unregisterCallback(android.support.v4.media.session.MediaControllerCompat.Callback);
-  }
-
-  public static abstract class MediaControllerCompat.Callback implements android.os.IBinder.DeathRecipient {
-    ctor public MediaControllerCompat.Callback();
-    method public void binderDied();
-    method public void onAudioInfoChanged(android.support.v4.media.session.MediaControllerCompat.PlaybackInfo);
-    method public void onExtrasChanged(android.os.Bundle);
-    method public void onMetadataChanged(android.support.v4.media.MediaMetadataCompat);
-    method public void onPlaybackStateChanged(android.support.v4.media.session.PlaybackStateCompat);
-    method public void onQueueChanged(java.util.List<android.support.v4.media.session.MediaSessionCompat.QueueItem>);
-    method public void onQueueTitleChanged(java.lang.CharSequence);
-    method public void onSessionDestroyed();
-    method public void onSessionEvent(java.lang.String, android.os.Bundle);
-  }
-
-  public static final class MediaControllerCompat.PlaybackInfo {
-    method public int getAudioStream();
-    method public int getCurrentVolume();
-    method public int getMaxVolume();
-    method public int getPlaybackType();
-    method public int getVolumeControl();
-    field public static final int PLAYBACK_TYPE_LOCAL = 1; // 0x1
-    field public static final int PLAYBACK_TYPE_REMOTE = 2; // 0x2
-  }
-
-  public static abstract class MediaControllerCompat.TransportControls {
-    method public abstract void fastForward();
-    method public abstract void pause();
-    method public abstract void play();
-    method public abstract void playFromMediaId(java.lang.String, android.os.Bundle);
-    method public abstract void playFromSearch(java.lang.String, android.os.Bundle);
-    method public abstract void playFromUri(android.net.Uri, android.os.Bundle);
-    method public abstract void rewind();
-    method public abstract void seekTo(long);
-    method public abstract void sendCustomAction(android.support.v4.media.session.PlaybackStateCompat.CustomAction, android.os.Bundle);
-    method public abstract void sendCustomAction(java.lang.String, android.os.Bundle);
-    method public abstract void setRating(android.support.v4.media.RatingCompat);
-    method public abstract void skipToNext();
-    method public abstract void skipToPrevious();
-    method public abstract void skipToQueueItem(long);
-    method public abstract void stop();
-  }
-
-  public class MediaSessionCompat {
-    ctor public MediaSessionCompat(android.content.Context, java.lang.String);
-    ctor public MediaSessionCompat(android.content.Context, java.lang.String, android.content.ComponentName, android.app.PendingIntent);
-    method public void addOnActiveChangeListener(android.support.v4.media.session.MediaSessionCompat.OnActiveChangeListener);
-    method public android.support.v4.media.session.MediaControllerCompat getController();
-    method public java.lang.Object getMediaSession();
-    method public java.lang.Object getRemoteControlClient();
-    method public android.support.v4.media.session.MediaSessionCompat.Token getSessionToken();
-    method public boolean isActive();
-    method public static android.support.v4.media.session.MediaSessionCompat obtain(android.content.Context, java.lang.Object);
-    method public void release();
-    method public void removeOnActiveChangeListener(android.support.v4.media.session.MediaSessionCompat.OnActiveChangeListener);
-    method public void sendSessionEvent(java.lang.String, android.os.Bundle);
-    method public void setActive(boolean);
-    method public void setCallback(android.support.v4.media.session.MediaSessionCompat.Callback);
-    method public void setCallback(android.support.v4.media.session.MediaSessionCompat.Callback, android.os.Handler);
-    method public void setExtras(android.os.Bundle);
-    method public void setFlags(int);
-    method public void setMediaButtonReceiver(android.app.PendingIntent);
-    method public void setMetadata(android.support.v4.media.MediaMetadataCompat);
-    method public void setPlaybackState(android.support.v4.media.session.PlaybackStateCompat);
-    method public void setPlaybackToLocal(int);
-    method public void setPlaybackToRemote(android.support.v4.media.VolumeProviderCompat);
-    method public void setQueue(java.util.List<android.support.v4.media.session.MediaSessionCompat.QueueItem>);
-    method public void setQueueTitle(java.lang.CharSequence);
-    method public void setRatingType(int);
-    method public void setSessionActivity(android.app.PendingIntent);
-    field public static final int FLAG_HANDLES_MEDIA_BUTTONS = 1; // 0x1
-    field public static final int FLAG_HANDLES_TRANSPORT_CONTROLS = 2; // 0x2
-  }
-
-  public static abstract class MediaSessionCompat.Callback {
-    ctor public MediaSessionCompat.Callback();
-    method public void onCommand(java.lang.String, android.os.Bundle, android.os.ResultReceiver);
-    method public void onCustomAction(java.lang.String, android.os.Bundle);
-    method public void onFastForward();
-    method public boolean onMediaButtonEvent(android.content.Intent);
-    method public void onPause();
-    method public void onPlay();
-    method public void onPlayFromMediaId(java.lang.String, android.os.Bundle);
-    method public void onPlayFromSearch(java.lang.String, android.os.Bundle);
-    method public void onPlayFromUri(android.net.Uri, android.os.Bundle);
-    method public void onRewind();
-    method public void onSeekTo(long);
-    method public void onSetRating(android.support.v4.media.RatingCompat);
-    method public void onSkipToNext();
-    method public void onSkipToPrevious();
-    method public void onSkipToQueueItem(long);
-    method public void onStop();
-  }
-
-  public static abstract interface MediaSessionCompat.OnActiveChangeListener {
-    method public abstract void onActiveChanged();
-  }
-
-  public static final class MediaSessionCompat.QueueItem implements android.os.Parcelable {
-    ctor public MediaSessionCompat.QueueItem(android.support.v4.media.MediaDescriptionCompat, long);
-    method public int describeContents();
-    method public android.support.v4.media.MediaDescriptionCompat getDescription();
-    method public long getQueueId();
-    method public java.lang.Object getQueueItem();
-    method public static android.support.v4.media.session.MediaSessionCompat.QueueItem obtain(java.lang.Object);
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.support.v4.media.session.MediaSessionCompat.QueueItem> CREATOR;
-    field public static final int UNKNOWN_ID = -1; // 0xffffffff
-  }
-
-  public static final class MediaSessionCompat.Token implements android.os.Parcelable {
-    method public int describeContents();
-    method public static android.support.v4.media.session.MediaSessionCompat.Token fromToken(java.lang.Object);
-    method public java.lang.Object getToken();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.support.v4.media.session.MediaSessionCompat.Token> CREATOR;
-  }
-
-  public class ParcelableVolumeInfo implements android.os.Parcelable {
-    ctor public ParcelableVolumeInfo(int, int, int, int, int);
-    ctor public ParcelableVolumeInfo(android.os.Parcel);
-    method public int describeContents();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.support.v4.media.session.ParcelableVolumeInfo> CREATOR;
-    field public int audioStream;
-    field public int controlType;
-    field public int currentVolume;
-    field public int maxVolume;
-    field public int volumeType;
-  }
-
-  public final class PlaybackStateCompat implements android.os.Parcelable {
-    method public int describeContents();
-    method public static android.support.v4.media.session.PlaybackStateCompat fromPlaybackState(java.lang.Object);
-    method public long getActions();
-    method public long getActiveQueueItemId();
-    method public long getBufferedPosition();
-    method public java.util.List<android.support.v4.media.session.PlaybackStateCompat.CustomAction> getCustomActions();
-    method public java.lang.CharSequence getErrorMessage();
-    method public android.os.Bundle getExtras();
-    method public long getLastPositionUpdateTime();
-    method public float getPlaybackSpeed();
-    method public java.lang.Object getPlaybackState();
-    method public long getPosition();
-    method public int getState();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final long ACTION_FAST_FORWARD = 64L; // 0x40L
-    field public static final long ACTION_PAUSE = 2L; // 0x2L
-    field public static final long ACTION_PLAY = 4L; // 0x4L
-    field public static final long ACTION_PLAY_FROM_MEDIA_ID = 1024L; // 0x400L
-    field public static final long ACTION_PLAY_FROM_SEARCH = 2048L; // 0x800L
-    field public static final long ACTION_PLAY_FROM_URI = 8192L; // 0x2000L
-    field public static final long ACTION_PLAY_PAUSE = 512L; // 0x200L
-    field public static final long ACTION_REWIND = 8L; // 0x8L
-    field public static final long ACTION_SEEK_TO = 256L; // 0x100L
-    field public static final long ACTION_SET_RATING = 128L; // 0x80L
-    field public static final long ACTION_SKIP_TO_NEXT = 32L; // 0x20L
-    field public static final long ACTION_SKIP_TO_PREVIOUS = 16L; // 0x10L
-    field public static final long ACTION_SKIP_TO_QUEUE_ITEM = 4096L; // 0x1000L
-    field public static final long ACTION_STOP = 1L; // 0x1L
-    field public static final android.os.Parcelable.Creator<android.support.v4.media.session.PlaybackStateCompat> CREATOR;
-    field public static final long PLAYBACK_POSITION_UNKNOWN = -1L; // 0xffffffffffffffffL
-    field public static final int STATE_BUFFERING = 6; // 0x6
-    field public static final int STATE_CONNECTING = 8; // 0x8
-    field public static final int STATE_ERROR = 7; // 0x7
-    field public static final int STATE_FAST_FORWARDING = 4; // 0x4
-    field public static final int STATE_NONE = 0; // 0x0
-    field public static final int STATE_PAUSED = 2; // 0x2
-    field public static final int STATE_PLAYING = 3; // 0x3
-    field public static final int STATE_REWINDING = 5; // 0x5
-    field public static final int STATE_SKIPPING_TO_NEXT = 10; // 0xa
-    field public static final int STATE_SKIPPING_TO_PREVIOUS = 9; // 0x9
-    field public static final int STATE_SKIPPING_TO_QUEUE_ITEM = 11; // 0xb
-    field public static final int STATE_STOPPED = 1; // 0x1
-  }
-
-  public static final class PlaybackStateCompat.Builder {
-    ctor public PlaybackStateCompat.Builder();
-    ctor public PlaybackStateCompat.Builder(android.support.v4.media.session.PlaybackStateCompat);
-    method public android.support.v4.media.session.PlaybackStateCompat.Builder addCustomAction(java.lang.String, java.lang.String, int);
-    method public android.support.v4.media.session.PlaybackStateCompat.Builder addCustomAction(android.support.v4.media.session.PlaybackStateCompat.CustomAction);
-    method public android.support.v4.media.session.PlaybackStateCompat build();
-    method public android.support.v4.media.session.PlaybackStateCompat.Builder setActions(long);
-    method public android.support.v4.media.session.PlaybackStateCompat.Builder setActiveQueueItemId(long);
-    method public android.support.v4.media.session.PlaybackStateCompat.Builder setBufferedPosition(long);
-    method public android.support.v4.media.session.PlaybackStateCompat.Builder setErrorMessage(java.lang.CharSequence);
-    method public android.support.v4.media.session.PlaybackStateCompat.Builder setExtras(android.os.Bundle);
-    method public android.support.v4.media.session.PlaybackStateCompat.Builder setState(int, long, float);
-    method public android.support.v4.media.session.PlaybackStateCompat.Builder setState(int, long, float, long);
-  }
-
-  public static final class PlaybackStateCompat.CustomAction implements android.os.Parcelable {
-    method public int describeContents();
-    method public static android.support.v4.media.session.PlaybackStateCompat.CustomAction fromCustomAction(java.lang.Object);
-    method public java.lang.String getAction();
-    method public java.lang.Object getCustomAction();
-    method public android.os.Bundle getExtras();
-    method public int getIcon();
-    method public java.lang.CharSequence getName();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.support.v4.media.session.PlaybackStateCompat.CustomAction> CREATOR;
-  }
-
-  public static final class PlaybackStateCompat.CustomAction.Builder {
-    ctor public PlaybackStateCompat.CustomAction.Builder(java.lang.String, java.lang.CharSequence, int);
-    method public android.support.v4.media.session.PlaybackStateCompat.CustomAction build();
-    method public android.support.v4.media.session.PlaybackStateCompat.CustomAction.Builder setExtras(android.os.Bundle);
-  }
-
-}
-
-package android.support.v4.net {
-
-  public class ConnectivityManagerCompat {
-    ctor public ConnectivityManagerCompat();
-    method public static android.net.NetworkInfo getNetworkInfoFromBroadcast(android.net.ConnectivityManager, android.content.Intent);
-    method public static boolean isActiveNetworkMetered(android.net.ConnectivityManager);
-  }
-
-  public class TrafficStatsCompat {
-    ctor public TrafficStatsCompat();
-    method public static void clearThreadStatsTag();
-    method public static int getThreadStatsTag();
-    method public static void incrementOperationCount(int);
-    method public static void incrementOperationCount(int, int);
-    method public static void setThreadStatsTag(int);
-    method public static void tagSocket(java.net.Socket) throws java.net.SocketException;
-    method public static void untagSocket(java.net.Socket) throws java.net.SocketException;
-  }
-
-}
-
-package android.support.v4.os {
-
-  public class AsyncTaskCompat {
-    ctor public AsyncTaskCompat();
-    method public static android.os.AsyncTask<Params, Progress, Result> executeParallel(android.os.AsyncTask<Params, Progress, Result>, Params...);
-  }
-
-  public final class CancellationSignal {
-    ctor public CancellationSignal();
-    method public void cancel();
-    method public java.lang.Object getCancellationSignalObject();
-    method public boolean isCanceled();
-    method public void setOnCancelListener(android.support.v4.os.CancellationSignal.OnCancelListener);
-    method public void throwIfCanceled();
-  }
-
-  public static abstract interface CancellationSignal.OnCancelListener {
-    method public abstract void onCancel();
-  }
-
-  public class EnvironmentCompat {
-    ctor public EnvironmentCompat();
-    method public static java.lang.String getStorageState(java.io.File);
-    field public static final java.lang.String MEDIA_UNKNOWN = "unknown";
-  }
-
-  public class OperationCanceledException extends java.lang.RuntimeException {
-    ctor public OperationCanceledException();
-    ctor public OperationCanceledException(java.lang.String);
-  }
-
-  public class ParcelableCompat {
-    ctor public ParcelableCompat();
-    method public static android.os.Parcelable.Creator<T> newCreator(android.support.v4.os.ParcelableCompatCreatorCallbacks<T>);
-  }
-
-  public abstract interface ParcelableCompatCreatorCallbacks {
-    method public abstract T createFromParcel(android.os.Parcel, java.lang.ClassLoader);
-    method public abstract T[] newArray(int);
-  }
-
-  public class TraceCompat {
-    ctor public TraceCompat();
-    method public static void beginSection(java.lang.String);
-    method public static void endSection();
-  }
-
-}
-
-package android.support.v4.print {
-
-  public final class PrintHelper {
-    ctor public PrintHelper(android.content.Context);
-    method public int getColorMode();
-    method public int getOrientation();
-    method public int getScaleMode();
-    method public void printBitmap(java.lang.String, android.graphics.Bitmap);
-    method public void printBitmap(java.lang.String, android.graphics.Bitmap, android.support.v4.print.PrintHelper.OnPrintFinishCallback);
-    method public void printBitmap(java.lang.String, android.net.Uri) throws java.io.FileNotFoundException;
-    method public void printBitmap(java.lang.String, android.net.Uri, android.support.v4.print.PrintHelper.OnPrintFinishCallback) throws java.io.FileNotFoundException;
-    method public void setColorMode(int);
-    method public void setOrientation(int);
-    method public void setScaleMode(int);
-    method public static boolean systemSupportsPrint();
-    field public static final int COLOR_MODE_COLOR = 2; // 0x2
-    field public static final int COLOR_MODE_MONOCHROME = 1; // 0x1
-    field public static final int ORIENTATION_LANDSCAPE = 1; // 0x1
-    field public static final int ORIENTATION_PORTRAIT = 2; // 0x2
-    field public static final int SCALE_MODE_FILL = 2; // 0x2
-    field public static final int SCALE_MODE_FIT = 1; // 0x1
-  }
-
-  public static abstract interface PrintHelper.OnPrintFinishCallback {
-    method public abstract void onFinish();
-  }
-
-}
-
-package android.support.v4.provider {
-
-  public abstract class DocumentFile {
-    method public abstract boolean canRead();
-    method public abstract boolean canWrite();
-    method public abstract android.support.v4.provider.DocumentFile createDirectory(java.lang.String);
-    method public abstract android.support.v4.provider.DocumentFile createFile(java.lang.String, java.lang.String);
-    method public abstract boolean delete();
-    method public abstract boolean exists();
-    method public android.support.v4.provider.DocumentFile findFile(java.lang.String);
-    method public static android.support.v4.provider.DocumentFile fromFile(java.io.File);
-    method public static android.support.v4.provider.DocumentFile fromSingleUri(android.content.Context, android.net.Uri);
-    method public static android.support.v4.provider.DocumentFile fromTreeUri(android.content.Context, android.net.Uri);
-    method public abstract java.lang.String getName();
-    method public android.support.v4.provider.DocumentFile getParentFile();
-    method public abstract java.lang.String getType();
-    method public abstract android.net.Uri getUri();
-    method public abstract boolean isDirectory();
-    method public static boolean isDocumentUri(android.content.Context, android.net.Uri);
-    method public abstract boolean isFile();
-    method public abstract long lastModified();
-    method public abstract long length();
-    method public abstract android.support.v4.provider.DocumentFile[] listFiles();
-    method public abstract boolean renameTo(java.lang.String);
-  }
-
-}
-
-package android.support.v4.text {
-
-  public final class BidiFormatter {
-    method public static android.support.v4.text.BidiFormatter getInstance();
-    method public static android.support.v4.text.BidiFormatter getInstance(boolean);
-    method public static android.support.v4.text.BidiFormatter getInstance(java.util.Locale);
-    method public boolean getStereoReset();
-    method public boolean isRtl(java.lang.String);
-    method public boolean isRtlContext();
-    method public java.lang.String unicodeWrap(java.lang.String, android.support.v4.text.TextDirectionHeuristicCompat, boolean);
-    method public java.lang.String unicodeWrap(java.lang.String, android.support.v4.text.TextDirectionHeuristicCompat);
-    method public java.lang.String unicodeWrap(java.lang.String, boolean);
-    method public java.lang.String unicodeWrap(java.lang.String);
-  }
-
-  public static final class BidiFormatter.Builder {
-    ctor public BidiFormatter.Builder();
-    ctor public BidiFormatter.Builder(boolean);
-    ctor public BidiFormatter.Builder(java.util.Locale);
-    method public android.support.v4.text.BidiFormatter build();
-    method public android.support.v4.text.BidiFormatter.Builder setTextDirectionHeuristic(android.support.v4.text.TextDirectionHeuristicCompat);
-    method public android.support.v4.text.BidiFormatter.Builder stereoReset(boolean);
-  }
-
-  public class ICUCompat {
-    ctor public ICUCompat();
-    method public static java.lang.String maximizeAndGetScript(java.util.Locale);
-  }
-
-  public abstract interface TextDirectionHeuristicCompat {
-    method public abstract boolean isRtl(char[], int, int);
-    method public abstract boolean isRtl(java.lang.CharSequence, int, int);
-  }
-
-  public class TextDirectionHeuristicsCompat {
-    ctor public TextDirectionHeuristicsCompat();
-    field public static final android.support.v4.text.TextDirectionHeuristicCompat ANYRTL_LTR;
-    field public static final android.support.v4.text.TextDirectionHeuristicCompat FIRSTSTRONG_LTR;
-    field public static final android.support.v4.text.TextDirectionHeuristicCompat FIRSTSTRONG_RTL;
-    field public static final android.support.v4.text.TextDirectionHeuristicCompat LOCALE;
-    field public static final android.support.v4.text.TextDirectionHeuristicCompat LTR;
-    field public static final android.support.v4.text.TextDirectionHeuristicCompat RTL;
-  }
-
-  public class TextUtilsCompat {
-    ctor public TextUtilsCompat();
-    method public static int getLayoutDirectionFromLocale(java.util.Locale);
-    method public static java.lang.String htmlEncode(java.lang.String);
-    field public static final java.util.Locale ROOT;
-  }
-
-}
-
-package android.support.v4.util {
-
-  public class ArrayMap extends android.support.v4.util.SimpleArrayMap implements java.util.Map {
-    ctor public ArrayMap();
-    ctor public ArrayMap(int);
-    ctor public ArrayMap(android.support.v4.util.SimpleArrayMap);
-    method public boolean containsAll(java.util.Collection<?>);
-    method public java.util.Set<java.util.Map.Entry<K, V>> entrySet();
-    method public java.util.Set<K> keySet();
-    method public void putAll(java.util.Map<? extends K, ? extends V>);
-    method public boolean removeAll(java.util.Collection<?>);
-    method public boolean retainAll(java.util.Collection<?>);
-    method public java.util.Collection<V> values();
-  }
-
-  public class AtomicFile {
-    ctor public AtomicFile(java.io.File);
-    method public void delete();
-    method public void failWrite(java.io.FileOutputStream);
-    method public void finishWrite(java.io.FileOutputStream);
-    method public java.io.File getBaseFile();
-    method public java.io.FileInputStream openRead() throws java.io.FileNotFoundException;
-    method public byte[] readFully() throws java.io.IOException;
-    method public java.io.FileOutputStream startWrite() throws java.io.IOException;
-  }
-
-  public final class CircularArray {
-    ctor public CircularArray();
-    ctor public CircularArray(int);
-    method public void addFirst(E);
-    method public void addLast(E);
-    method public void clear();
-    method public E get(int);
-    method public E getFirst();
-    method public E getLast();
-    method public boolean isEmpty();
-    method public E popFirst();
-    method public E popLast();
-    method public void removeFromEnd(int);
-    method public void removeFromStart(int);
-    method public int size();
-  }
-
-  public final class CircularIntArray {
-    ctor public CircularIntArray();
-    ctor public CircularIntArray(int);
-    method public void addFirst(int);
-    method public void addLast(int);
-    method public void clear();
-    method public int get(int);
-    method public int getFirst();
-    method public int getLast();
-    method public boolean isEmpty();
-    method public int popFirst();
-    method public int popLast();
-    method public void removeFromEnd(int);
-    method public void removeFromStart(int);
-    method public int size();
-  }
-
-  public class LongSparseArray {
-    ctor public LongSparseArray();
-    ctor public LongSparseArray(int);
-    method public void append(long, E);
-    method public void clear();
-    method public android.support.v4.util.LongSparseArray<E> clone();
-    method public void delete(long);
-    method public E get(long);
-    method public E get(long, E);
-    method public int indexOfKey(long);
-    method public int indexOfValue(E);
-    method public long keyAt(int);
-    method public void put(long, E);
-    method public void remove(long);
-    method public void removeAt(int);
-    method public void setValueAt(int, E);
-    method public int size();
-    method public E valueAt(int);
-  }
-
-  public class LruCache {
-    ctor public LruCache(int);
-    method protected V create(K);
-    method public final synchronized int createCount();
-    method protected void entryRemoved(boolean, K, V, V);
-    method public final void evictAll();
-    method public final synchronized int evictionCount();
-    method public final V get(K);
-    method public final synchronized int hitCount();
-    method public final synchronized int maxSize();
-    method public final synchronized int missCount();
-    method public final V put(K, V);
-    method public final synchronized int putCount();
-    method public final V remove(K);
-    method public void resize(int);
-    method public final synchronized int size();
-    method protected int sizeOf(K, V);
-    method public final synchronized java.util.Map<K, V> snapshot();
-    method public final synchronized java.lang.String toString();
-    method public void trimToSize(int);
-  }
-
-  public class Pair {
-    ctor public Pair(F, S);
-    method public static android.support.v4.util.Pair<A, B> create(A, B);
-    field public final F first;
-    field public final S second;
-  }
-
-  public final class Pools {
-  }
-
-  public static abstract interface Pools.Pool {
-    method public abstract T acquire();
-    method public abstract boolean release(T);
-  }
-
-  public static class Pools.SimplePool implements android.support.v4.util.Pools.Pool {
-    ctor public Pools.SimplePool(int);
-    method public T acquire();
-    method public boolean release(T);
-  }
-
-  public static class Pools.SynchronizedPool extends android.support.v4.util.Pools.SimplePool {
-    ctor public Pools.SynchronizedPool(int);
-  }
-
-  public class SimpleArrayMap {
-    ctor public SimpleArrayMap();
-    ctor public SimpleArrayMap(int);
-    ctor public SimpleArrayMap(android.support.v4.util.SimpleArrayMap);
-    method public void clear();
-    method public boolean containsKey(java.lang.Object);
-    method public boolean containsValue(java.lang.Object);
-    method public void ensureCapacity(int);
-    method public V get(java.lang.Object);
-    method public int indexOfKey(java.lang.Object);
-    method public boolean isEmpty();
-    method public K keyAt(int);
-    method public V put(K, V);
-    method public void putAll(android.support.v4.util.SimpleArrayMap<? extends K, ? extends V>);
-    method public V remove(java.lang.Object);
-    method public V removeAt(int);
-    method public V setValueAt(int, V);
-    method public int size();
-    method public V valueAt(int);
-  }
-
-  public class SparseArrayCompat {
-    ctor public SparseArrayCompat();
-    ctor public SparseArrayCompat(int);
-    method public void append(int, E);
-    method public void clear();
-    method public android.support.v4.util.SparseArrayCompat<E> clone();
-    method public void delete(int);
-    method public E get(int);
-    method public E get(int, E);
-    method public int indexOfKey(int);
-    method public int indexOfValue(E);
-    method public int keyAt(int);
-    method public void put(int, E);
-    method public void remove(int);
-    method public void removeAt(int);
-    method public void removeAtRange(int, int);
-    method public void setValueAt(int, E);
-    method public int size();
-    method public E valueAt(int);
-  }
-
-}
-
-package android.support.v4.view {
-
-  public class AccessibilityDelegateCompat {
-    ctor public AccessibilityDelegateCompat();
-    method public boolean dispatchPopulateAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
-    method public android.support.v4.view.accessibility.AccessibilityNodeProviderCompat getAccessibilityNodeProvider(android.view.View);
-    method public void onInitializeAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
-    method public void onInitializeAccessibilityNodeInfo(android.view.View, android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
-    method public void onPopulateAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
-    method public boolean onRequestSendAccessibilityEvent(android.view.ViewGroup, android.view.View, android.view.accessibility.AccessibilityEvent);
-    method public boolean performAccessibilityAction(android.view.View, int, android.os.Bundle);
-    method public void sendAccessibilityEvent(android.view.View, int);
-    method public void sendAccessibilityEventUnchecked(android.view.View, android.view.accessibility.AccessibilityEvent);
-  }
-
-  public abstract class ActionProvider {
-    ctor public ActionProvider(android.content.Context);
-    method public android.content.Context getContext();
-    method public boolean hasSubMenu();
-    method public boolean isVisible();
-    method public abstract android.view.View onCreateActionView();
-    method public android.view.View onCreateActionView(android.view.MenuItem);
-    method public boolean onPerformDefaultAction();
-    method public void onPrepareSubMenu(android.view.SubMenu);
-    method public boolean overridesItemVisibility();
-    method public void refreshVisibility();
-    method public void setVisibilityListener(android.support.v4.view.ActionProvider.VisibilityListener);
-  }
-
-  public static abstract interface ActionProvider.VisibilityListener {
-    method public abstract void onActionProviderVisibilityChanged(boolean);
-  }
-
-  public class GestureDetectorCompat {
-    ctor public GestureDetectorCompat(android.content.Context, android.view.GestureDetector.OnGestureListener);
-    ctor public GestureDetectorCompat(android.content.Context, android.view.GestureDetector.OnGestureListener, android.os.Handler);
-    method public boolean isLongpressEnabled();
-    method public boolean onTouchEvent(android.view.MotionEvent);
-    method public void setIsLongpressEnabled(boolean);
-    method public void setOnDoubleTapListener(android.view.GestureDetector.OnDoubleTapListener);
-  }
-
-  public class GravityCompat {
-    ctor public GravityCompat();
-    method public static void apply(int, int, int, android.graphics.Rect, android.graphics.Rect, int);
-    method public static void apply(int, int, int, android.graphics.Rect, int, int, android.graphics.Rect, int);
-    method public static void applyDisplay(int, android.graphics.Rect, android.graphics.Rect, int);
-    method public static int getAbsoluteGravity(int, int);
-    field public static final int END = 8388613; // 0x800005
-    field public static final int RELATIVE_HORIZONTAL_GRAVITY_MASK = 8388615; // 0x800007
-    field public static final int RELATIVE_LAYOUT_DIRECTION = 8388608; // 0x800000
-    field public static final int START = 8388611; // 0x800003
-  }
-
-  public class InputDeviceCompat {
-    ctor public InputDeviceCompat();
-    field public static final int SOURCE_ANY = -256; // 0xffffff00
-    field public static final int SOURCE_CLASS_BUTTON = 1; // 0x1
-    field public static final int SOURCE_CLASS_JOYSTICK = 16; // 0x10
-    field public static final int SOURCE_CLASS_MASK = 255; // 0xff
-    field public static final int SOURCE_CLASS_NONE = 0; // 0x0
-    field public static final int SOURCE_CLASS_POINTER = 2; // 0x2
-    field public static final int SOURCE_CLASS_POSITION = 8; // 0x8
-    field public static final int SOURCE_CLASS_TRACKBALL = 4; // 0x4
-    field public static final int SOURCE_DPAD = 513; // 0x201
-    field public static final int SOURCE_GAMEPAD = 1025; // 0x401
-    field public static final int SOURCE_HDMI = 33554433; // 0x2000001
-    field public static final int SOURCE_JOYSTICK = 16777232; // 0x1000010
-    field public static final int SOURCE_KEYBOARD = 257; // 0x101
-    field public static final int SOURCE_MOUSE = 8194; // 0x2002
-    field public static final int SOURCE_STYLUS = 16386; // 0x4002
-    field public static final int SOURCE_TOUCHPAD = 1048584; // 0x100008
-    field public static final int SOURCE_TOUCHSCREEN = 4098; // 0x1002
-    field public static final int SOURCE_TOUCH_NAVIGATION = 2097152; // 0x200000
-    field public static final int SOURCE_TRACKBALL = 65540; // 0x10004
-    field public static final int SOURCE_UNKNOWN = 0; // 0x0
-  }
-
-  public class KeyEventCompat {
-    ctor public KeyEventCompat();
-    method public static boolean dispatch(android.view.KeyEvent, android.view.KeyEvent.Callback, java.lang.Object, java.lang.Object);
-    method public static java.lang.Object getKeyDispatcherState(android.view.View);
-    method public static boolean hasModifiers(android.view.KeyEvent, int);
-    method public static boolean hasNoModifiers(android.view.KeyEvent);
-    method public static boolean isTracking(android.view.KeyEvent);
-    method public static boolean metaStateHasModifiers(int, int);
-    method public static boolean metaStateHasNoModifiers(int);
-    method public static int normalizeMetaState(int);
-    method public static void startTracking(android.view.KeyEvent);
-  }
-
-  public class LayoutInflaterCompat {
-    method public static void setFactory(android.view.LayoutInflater, android.support.v4.view.LayoutInflaterFactory);
-  }
-
-  public abstract interface LayoutInflaterFactory {
-    method public abstract android.view.View onCreateView(android.view.View, java.lang.String, android.content.Context, android.util.AttributeSet);
-  }
-
-  public class MarginLayoutParamsCompat {
-    ctor public MarginLayoutParamsCompat();
-    method public static int getLayoutDirection(android.view.ViewGroup.MarginLayoutParams);
-    method public static int getMarginEnd(android.view.ViewGroup.MarginLayoutParams);
-    method public static int getMarginStart(android.view.ViewGroup.MarginLayoutParams);
-    method public static boolean isMarginRelative(android.view.ViewGroup.MarginLayoutParams);
-    method public static void resolveLayoutDirection(android.view.ViewGroup.MarginLayoutParams, int);
-    method public static void setLayoutDirection(android.view.ViewGroup.MarginLayoutParams, int);
-    method public static void setMarginEnd(android.view.ViewGroup.MarginLayoutParams, int);
-    method public static void setMarginStart(android.view.ViewGroup.MarginLayoutParams, int);
-  }
-
-  public class MenuCompat {
-    ctor public MenuCompat();
-    method public static deprecated void setShowAsAction(android.view.MenuItem, int);
-  }
-
-  public class MenuItemCompat {
-    ctor public MenuItemCompat();
-    method public static boolean collapseActionView(android.view.MenuItem);
-    method public static boolean expandActionView(android.view.MenuItem);
-    method public static android.support.v4.view.ActionProvider getActionProvider(android.view.MenuItem);
-    method public static android.view.View getActionView(android.view.MenuItem);
-    method public static boolean isActionViewExpanded(android.view.MenuItem);
-    method public static android.view.MenuItem setActionProvider(android.view.MenuItem, android.support.v4.view.ActionProvider);
-    method public static android.view.MenuItem setActionView(android.view.MenuItem, android.view.View);
-    method public static android.view.MenuItem setActionView(android.view.MenuItem, int);
-    method public static android.view.MenuItem setOnActionExpandListener(android.view.MenuItem, android.support.v4.view.MenuItemCompat.OnActionExpandListener);
-    method public static void setShowAsAction(android.view.MenuItem, int);
-    field public static final int SHOW_AS_ACTION_ALWAYS = 2; // 0x2
-    field public static final int SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW = 8; // 0x8
-    field public static final int SHOW_AS_ACTION_IF_ROOM = 1; // 0x1
-    field public static final int SHOW_AS_ACTION_NEVER = 0; // 0x0
-    field public static final int SHOW_AS_ACTION_WITH_TEXT = 4; // 0x4
-  }
-
-  public static abstract interface MenuItemCompat.OnActionExpandListener {
-    method public abstract boolean onMenuItemActionCollapse(android.view.MenuItem);
-    method public abstract boolean onMenuItemActionExpand(android.view.MenuItem);
-  }
-
-  public class MotionEventCompat {
-    ctor public MotionEventCompat();
-    method public static int findPointerIndex(android.view.MotionEvent, int);
-    method public static int getActionIndex(android.view.MotionEvent);
-    method public static int getActionMasked(android.view.MotionEvent);
-    method public static float getAxisValue(android.view.MotionEvent, int);
-    method public static float getAxisValue(android.view.MotionEvent, int, int);
-    method public static int getPointerCount(android.view.MotionEvent);
-    method public static int getPointerId(android.view.MotionEvent, int);
-    method public static int getSource(android.view.MotionEvent);
-    method public static float getX(android.view.MotionEvent, int);
-    method public static float getY(android.view.MotionEvent, int);
-    field public static final int ACTION_HOVER_ENTER = 9; // 0x9
-    field public static final int ACTION_HOVER_EXIT = 10; // 0xa
-    field public static final int ACTION_HOVER_MOVE = 7; // 0x7
-    field public static final int ACTION_MASK = 255; // 0xff
-    field public static final int ACTION_POINTER_DOWN = 5; // 0x5
-    field public static final int ACTION_POINTER_INDEX_MASK = 65280; // 0xff00
-    field public static final int ACTION_POINTER_INDEX_SHIFT = 8; // 0x8
-    field public static final int ACTION_POINTER_UP = 6; // 0x6
-    field public static final int ACTION_SCROLL = 8; // 0x8
-    field public static final int AXIS_BRAKE = 23; // 0x17
-    field public static final int AXIS_DISTANCE = 24; // 0x18
-    field public static final int AXIS_GAS = 22; // 0x16
-    field public static final int AXIS_GENERIC_1 = 32; // 0x20
-    field public static final int AXIS_GENERIC_10 = 41; // 0x29
-    field public static final int AXIS_GENERIC_11 = 42; // 0x2a
-    field public static final int AXIS_GENERIC_12 = 43; // 0x2b
-    field public static final int AXIS_GENERIC_13 = 44; // 0x2c
-    field public static final int AXIS_GENERIC_14 = 45; // 0x2d
-    field public static final int AXIS_GENERIC_15 = 46; // 0x2e
-    field public static final int AXIS_GENERIC_16 = 47; // 0x2f
-    field public static final int AXIS_GENERIC_2 = 33; // 0x21
-    field public static final int AXIS_GENERIC_3 = 34; // 0x22
-    field public static final int AXIS_GENERIC_4 = 35; // 0x23
-    field public static final int AXIS_GENERIC_5 = 36; // 0x24
-    field public static final int AXIS_GENERIC_6 = 37; // 0x25
-    field public static final int AXIS_GENERIC_7 = 38; // 0x26
-    field public static final int AXIS_GENERIC_8 = 39; // 0x27
-    field public static final int AXIS_GENERIC_9 = 40; // 0x28
-    field public static final int AXIS_HAT_X = 15; // 0xf
-    field public static final int AXIS_HAT_Y = 16; // 0x10
-    field public static final int AXIS_HSCROLL = 10; // 0xa
-    field public static final int AXIS_LTRIGGER = 17; // 0x11
-    field public static final int AXIS_ORIENTATION = 8; // 0x8
-    field public static final int AXIS_PRESSURE = 2; // 0x2
-    field public static final int AXIS_RTRIGGER = 18; // 0x12
-    field public static final int AXIS_RUDDER = 20; // 0x14
-    field public static final int AXIS_RX = 12; // 0xc
-    field public static final int AXIS_RY = 13; // 0xd
-    field public static final int AXIS_RZ = 14; // 0xe
-    field public static final int AXIS_SIZE = 3; // 0x3
-    field public static final int AXIS_THROTTLE = 19; // 0x13
-    field public static final int AXIS_TILT = 25; // 0x19
-    field public static final int AXIS_TOOL_MAJOR = 6; // 0x6
-    field public static final int AXIS_TOOL_MINOR = 7; // 0x7
-    field public static final int AXIS_TOUCH_MAJOR = 4; // 0x4
-    field public static final int AXIS_TOUCH_MINOR = 5; // 0x5
-    field public static final int AXIS_VSCROLL = 9; // 0x9
-    field public static final int AXIS_WHEEL = 21; // 0x15
-    field public static final int AXIS_X = 0; // 0x0
-    field public static final int AXIS_Y = 1; // 0x1
-    field public static final int AXIS_Z = 11; // 0xb
-  }
-
-  public abstract interface NestedScrollingChild {
-    method public abstract boolean dispatchNestedFling(float, float, boolean);
-    method public abstract boolean dispatchNestedPreFling(float, float);
-    method public abstract boolean dispatchNestedPreScroll(int, int, int[], int[]);
-    method public abstract boolean dispatchNestedScroll(int, int, int, int, int[]);
-    method public abstract boolean hasNestedScrollingParent();
-    method public abstract boolean isNestedScrollingEnabled();
-    method public abstract void setNestedScrollingEnabled(boolean);
-    method public abstract boolean startNestedScroll(int);
-    method public abstract void stopNestedScroll();
-  }
-
-  public class NestedScrollingChildHelper {
-    ctor public NestedScrollingChildHelper(android.view.View);
-    method public boolean dispatchNestedFling(float, float, boolean);
-    method public boolean dispatchNestedPreFling(float, float);
-    method public boolean dispatchNestedPreScroll(int, int, int[], int[]);
-    method public boolean dispatchNestedScroll(int, int, int, int, int[]);
-    method public boolean hasNestedScrollingParent();
-    method public boolean isNestedScrollingEnabled();
-    method public void onDetachedFromWindow();
-    method public void onStopNestedScroll(android.view.View);
-    method public void setNestedScrollingEnabled(boolean);
-    method public boolean startNestedScroll(int);
-    method public void stopNestedScroll();
-  }
-
-  public abstract interface NestedScrollingParent {
-    method public abstract int getNestedScrollAxes();
-    method public abstract boolean onNestedFling(android.view.View, float, float, boolean);
-    method public abstract boolean onNestedPreFling(android.view.View, float, float);
-    method public abstract void onNestedPreScroll(android.view.View, int, int, int[]);
-    method public abstract void onNestedScroll(android.view.View, int, int, int, int);
-    method public abstract void onNestedScrollAccepted(android.view.View, android.view.View, int);
-    method public abstract boolean onStartNestedScroll(android.view.View, android.view.View, int);
-    method public abstract void onStopNestedScroll(android.view.View);
-  }
-
-  public class NestedScrollingParentHelper {
-    ctor public NestedScrollingParentHelper(android.view.ViewGroup);
-    method public int getNestedScrollAxes();
-    method public void onNestedScrollAccepted(android.view.View, android.view.View, int);
-    method public void onStopNestedScroll(android.view.View);
-  }
-
-  public abstract interface OnApplyWindowInsetsListener {
-    method public abstract android.support.v4.view.WindowInsetsCompat onApplyWindowInsets(android.view.View, android.support.v4.view.WindowInsetsCompat);
-  }
-
-  public abstract class PagerAdapter {
-    ctor public PagerAdapter();
-    method public void destroyItem(android.view.ViewGroup, int, java.lang.Object);
-    method public deprecated void destroyItem(android.view.View, int, java.lang.Object);
-    method public void finishUpdate(android.view.ViewGroup);
-    method public deprecated void finishUpdate(android.view.View);
-    method public abstract int getCount();
-    method public int getItemPosition(java.lang.Object);
-    method public java.lang.CharSequence getPageTitle(int);
-    method public float getPageWidth(int);
-    method public java.lang.Object instantiateItem(android.view.ViewGroup, int);
-    method public deprecated java.lang.Object instantiateItem(android.view.View, int);
-    method public abstract boolean isViewFromObject(android.view.View, java.lang.Object);
-    method public void notifyDataSetChanged();
-    method public void registerDataSetObserver(android.database.DataSetObserver);
-    method public void restoreState(android.os.Parcelable, java.lang.ClassLoader);
-    method public android.os.Parcelable saveState();
-    method public void setPrimaryItem(android.view.ViewGroup, int, java.lang.Object);
-    method public deprecated void setPrimaryItem(android.view.View, int, java.lang.Object);
-    method public void startUpdate(android.view.ViewGroup);
-    method public deprecated void startUpdate(android.view.View);
-    method public void unregisterDataSetObserver(android.database.DataSetObserver);
-    field public static final int POSITION_NONE = -2; // 0xfffffffe
-    field public static final int POSITION_UNCHANGED = -1; // 0xffffffff
-  }
-
-  public class PagerTabStrip extends android.support.v4.view.PagerTitleStrip {
-    ctor public PagerTabStrip(android.content.Context);
-    ctor public PagerTabStrip(android.content.Context, android.util.AttributeSet);
-    method public boolean getDrawFullUnderline();
-    method public int getTabIndicatorColor();
-    method public void setDrawFullUnderline(boolean);
-    method public void setTabIndicatorColor(int);
-    method public void setTabIndicatorColorResource(int);
-  }
-
-  public class PagerTitleStrip extends android.view.ViewGroup {
-    ctor public PagerTitleStrip(android.content.Context);
-    ctor public PagerTitleStrip(android.content.Context, android.util.AttributeSet);
-    method public int getTextSpacing();
-    method protected void onLayout(boolean, int, int, int, int);
-    method public void setGravity(int);
-    method public void setNonPrimaryAlpha(float);
-    method public void setTextColor(int);
-    method public void setTextSize(int, float);
-    method public void setTextSpacing(int);
-  }
-
-  public class ScaleGestureDetectorCompat {
-    method public static boolean isQuickScaleEnabled(java.lang.Object);
-    method public static void setQuickScaleEnabled(java.lang.Object, boolean);
-  }
-
-  public abstract interface ScrollingView {
-    method public abstract int computeHorizontalScrollExtent();
-    method public abstract int computeHorizontalScrollOffset();
-    method public abstract int computeHorizontalScrollRange();
-    method public abstract int computeVerticalScrollExtent();
-    method public abstract int computeVerticalScrollOffset();
-    method public abstract int computeVerticalScrollRange();
-  }
-
-  public class VelocityTrackerCompat {
-    ctor public VelocityTrackerCompat();
-    method public static float getXVelocity(android.view.VelocityTracker, int);
-    method public static float getYVelocity(android.view.VelocityTracker, int);
-  }
-
-  public class ViewCompat {
-    ctor public ViewCompat();
-    method public static android.support.v4.view.ViewPropertyAnimatorCompat animate(android.view.View);
-    method public static boolean canScrollHorizontally(android.view.View, int);
-    method public static boolean canScrollVertically(android.view.View, int);
-    method public static int combineMeasuredStates(int, int);
-    method public static android.support.v4.view.WindowInsetsCompat dispatchApplyWindowInsets(android.view.View, android.support.v4.view.WindowInsetsCompat);
-    method public static void dispatchFinishTemporaryDetach(android.view.View);
-    method public static boolean dispatchNestedFling(android.view.View, float, float, boolean);
-    method public static boolean dispatchNestedPreFling(android.view.View, float, float);
-    method public static boolean dispatchNestedPreScroll(android.view.View, int, int, int[], int[]);
-    method public static boolean dispatchNestedScroll(android.view.View, int, int, int, int, int[]);
-    method public static void dispatchStartTemporaryDetach(android.view.View);
-    method public static int getAccessibilityLiveRegion(android.view.View);
-    method public static android.support.v4.view.accessibility.AccessibilityNodeProviderCompat getAccessibilityNodeProvider(android.view.View);
-    method public static float getAlpha(android.view.View);
-    method public static android.content.res.ColorStateList getBackgroundTintList(android.view.View);
-    method public static android.graphics.PorterDuff.Mode getBackgroundTintMode(android.view.View);
-    method public static android.graphics.Rect getClipBounds(android.view.View);
-    method public static float getElevation(android.view.View);
-    method public static boolean getFitsSystemWindows(android.view.View);
-    method public static int getImportantForAccessibility(android.view.View);
-    method public static int getLabelFor(android.view.View);
-    method public static int getLayerType(android.view.View);
-    method public static int getLayoutDirection(android.view.View);
-    method public static int getMeasuredHeightAndState(android.view.View);
-    method public static int getMeasuredState(android.view.View);
-    method public static int getMeasuredWidthAndState(android.view.View);
-    method public static int getMinimumHeight(android.view.View);
-    method public static int getMinimumWidth(android.view.View);
-    method public static int getOverScrollMode(android.view.View);
-    method public static int getPaddingEnd(android.view.View);
-    method public static int getPaddingStart(android.view.View);
-    method public static android.view.ViewParent getParentForAccessibility(android.view.View);
-    method public static float getPivotX(android.view.View);
-    method public static float getPivotY(android.view.View);
-    method public static float getRotation(android.view.View);
-    method public static float getRotationX(android.view.View);
-    method public static float getRotationY(android.view.View);
-    method public static float getScaleX(android.view.View);
-    method public static float getScaleY(android.view.View);
-    method public static int getScrollIndicators(android.view.View);
-    method public static java.lang.String getTransitionName(android.view.View);
-    method public static float getTranslationX(android.view.View);
-    method public static float getTranslationY(android.view.View);
-    method public static float getTranslationZ(android.view.View);
-    method public static int getWindowSystemUiVisibility(android.view.View);
-    method public static float getX(android.view.View);
-    method public static float getY(android.view.View);
-    method public static float getZ(android.view.View);
-    method public static boolean hasAccessibilityDelegate(android.view.View);
-    method public static boolean hasNestedScrollingParent(android.view.View);
-    method public static boolean hasOnClickListeners(android.view.View);
-    method public static boolean hasOverlappingRendering(android.view.View);
-    method public static boolean hasTransientState(android.view.View);
-    method public static boolean isAttachedToWindow(android.view.View);
-    method public static boolean isLaidOut(android.view.View);
-    method public static boolean isNestedScrollingEnabled(android.view.View);
-    method public static boolean isOpaque(android.view.View);
-    method public static boolean isPaddingRelative(android.view.View);
-    method public static void jumpDrawablesToCurrentState(android.view.View);
-    method public static void offsetLeftAndRight(android.view.View, int);
-    method public static void offsetTopAndBottom(android.view.View, int);
-    method public static android.support.v4.view.WindowInsetsCompat onApplyWindowInsets(android.view.View, android.support.v4.view.WindowInsetsCompat);
-    method public static void onInitializeAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
-    method public static void onInitializeAccessibilityNodeInfo(android.view.View, android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
-    method public static void onPopulateAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
-    method public static boolean performAccessibilityAction(android.view.View, int, android.os.Bundle);
-    method public static void postInvalidateOnAnimation(android.view.View);
-    method public static void postInvalidateOnAnimation(android.view.View, int, int, int, int);
-    method public static void postOnAnimation(android.view.View, java.lang.Runnable);
-    method public static void postOnAnimationDelayed(android.view.View, java.lang.Runnable, long);
-    method public static void requestApplyInsets(android.view.View);
-    method public static int resolveSizeAndState(int, int, int);
-    method public static void setAccessibilityDelegate(android.view.View, android.support.v4.view.AccessibilityDelegateCompat);
-    method public static void setAccessibilityLiveRegion(android.view.View, int);
-    method public static void setActivated(android.view.View, boolean);
-    method public static void setAlpha(android.view.View, float);
-    method public static void setBackgroundTintList(android.view.View, android.content.res.ColorStateList);
-    method public static void setBackgroundTintMode(android.view.View, android.graphics.PorterDuff.Mode);
-    method public static void setChildrenDrawingOrderEnabled(android.view.ViewGroup, boolean);
-    method public static void setClipBounds(android.view.View, android.graphics.Rect);
-    method public static void setElevation(android.view.View, float);
-    method public static void setFitsSystemWindows(android.view.View, boolean);
-    method public static void setHasTransientState(android.view.View, boolean);
-    method public static void setImportantForAccessibility(android.view.View, int);
-    method public static void setLabelFor(android.view.View, int);
-    method public static void setLayerPaint(android.view.View, android.graphics.Paint);
-    method public static void setLayerType(android.view.View, int, android.graphics.Paint);
-    method public static void setLayoutDirection(android.view.View, int);
-    method public static void setNestedScrollingEnabled(android.view.View, boolean);
-    method public static void setOnApplyWindowInsetsListener(android.view.View, android.support.v4.view.OnApplyWindowInsetsListener);
-    method public static void setOverScrollMode(android.view.View, int);
-    method public static void setPaddingRelative(android.view.View, int, int, int, int);
-    method public static void setPivotX(android.view.View, float);
-    method public static void setPivotY(android.view.View, float);
-    method public static void setRotation(android.view.View, float);
-    method public static void setRotationX(android.view.View, float);
-    method public static void setRotationY(android.view.View, float);
-    method public static void setSaveFromParentEnabled(android.view.View, boolean);
-    method public static void setScaleX(android.view.View, float);
-    method public static void setScaleY(android.view.View, float);
-    method public static void setScrollIndicators(android.view.View, int);
-    method public static void setScrollIndicators(android.view.View, int, int);
-    method public static void setTransitionName(android.view.View, java.lang.String);
-    method public static void setTranslationX(android.view.View, float);
-    method public static void setTranslationY(android.view.View, float);
-    method public static void setTranslationZ(android.view.View, float);
-    method public static void setX(android.view.View, float);
-    method public static void setY(android.view.View, float);
-    method public static boolean startNestedScroll(android.view.View, int);
-    method public static void stopNestedScroll(android.view.View);
-    field public static final int ACCESSIBILITY_LIVE_REGION_ASSERTIVE = 2; // 0x2
-    field public static final int ACCESSIBILITY_LIVE_REGION_NONE = 0; // 0x0
-    field public static final int ACCESSIBILITY_LIVE_REGION_POLITE = 1; // 0x1
-    field public static final int IMPORTANT_FOR_ACCESSIBILITY_AUTO = 0; // 0x0
-    field public static final int IMPORTANT_FOR_ACCESSIBILITY_NO = 2; // 0x2
-    field public static final int IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS = 4; // 0x4
-    field public static final int IMPORTANT_FOR_ACCESSIBILITY_YES = 1; // 0x1
-    field public static final int LAYER_TYPE_HARDWARE = 2; // 0x2
-    field public static final int LAYER_TYPE_NONE = 0; // 0x0
-    field public static final int LAYER_TYPE_SOFTWARE = 1; // 0x1
-    field public static final int LAYOUT_DIRECTION_INHERIT = 2; // 0x2
-    field public static final int LAYOUT_DIRECTION_LOCALE = 3; // 0x3
-    field public static final int LAYOUT_DIRECTION_LTR = 0; // 0x0
-    field public static final int LAYOUT_DIRECTION_RTL = 1; // 0x1
-    field public static final int MEASURED_HEIGHT_STATE_SHIFT = 16; // 0x10
-    field public static final int MEASURED_SIZE_MASK = 16777215; // 0xffffff
-    field public static final int MEASURED_STATE_MASK = -16777216; // 0xff000000
-    field public static final int MEASURED_STATE_TOO_SMALL = 16777216; // 0x1000000
-    field public static final int OVER_SCROLL_ALWAYS = 0; // 0x0
-    field public static final int OVER_SCROLL_IF_CONTENT_SCROLLS = 1; // 0x1
-    field public static final int OVER_SCROLL_NEVER = 2; // 0x2
-    field public static final int SCROLL_AXIS_HORIZONTAL = 1; // 0x1
-    field public static final int SCROLL_AXIS_NONE = 0; // 0x0
-    field public static final int SCROLL_AXIS_VERTICAL = 2; // 0x2
-    field public static final int SCROLL_INDICATOR_BOTTOM = 2; // 0x2
-    field public static final int SCROLL_INDICATOR_END = 32; // 0x20
-    field public static final int SCROLL_INDICATOR_LEFT = 4; // 0x4
-    field public static final int SCROLL_INDICATOR_RIGHT = 8; // 0x8
-    field public static final int SCROLL_INDICATOR_START = 16; // 0x10
-    field public static final int SCROLL_INDICATOR_TOP = 1; // 0x1
-  }
-
-  public class ViewConfigurationCompat {
-    ctor public ViewConfigurationCompat();
-    method public static int getScaledPagingTouchSlop(android.view.ViewConfiguration);
-    method public static boolean hasPermanentMenuKey(android.view.ViewConfiguration);
-  }
-
-  public class ViewGroupCompat {
-    method public static int getLayoutMode(android.view.ViewGroup);
-    method public static int getNestedScrollAxes(android.view.ViewGroup);
-    method public static boolean isTransitionGroup(android.view.ViewGroup);
-    method public static boolean onRequestSendAccessibilityEvent(android.view.ViewGroup, android.view.View, android.view.accessibility.AccessibilityEvent);
-    method public static void setLayoutMode(android.view.ViewGroup, int);
-    method public static void setMotionEventSplittingEnabled(android.view.ViewGroup, boolean);
-    method public static void setTransitionGroup(android.view.ViewGroup, boolean);
-    field public static final int LAYOUT_MODE_CLIP_BOUNDS = 0; // 0x0
-    field public static final int LAYOUT_MODE_OPTICAL_BOUNDS = 1; // 0x1
-  }
-
-  public class ViewPager extends android.view.ViewGroup {
-    ctor public ViewPager(android.content.Context);
-    ctor public ViewPager(android.content.Context, android.util.AttributeSet);
-    method public void addOnPageChangeListener(android.support.v4.view.ViewPager.OnPageChangeListener);
-    method public boolean arrowScroll(int);
-    method public boolean beginFakeDrag();
-    method protected boolean canScroll(android.view.View, boolean, int, int, int);
-    method public void clearOnPageChangeListeners();
-    method public void endFakeDrag();
-    method public boolean executeKeyEvent(android.view.KeyEvent);
-    method public void fakeDragBy(float);
-    method public android.support.v4.view.PagerAdapter getAdapter();
-    method public int getCurrentItem();
-    method public int getOffscreenPageLimit();
-    method public int getPageMargin();
-    method public boolean isFakeDragging();
-    method protected void onLayout(boolean, int, int, int, int);
-    method protected void onPageScrolled(int, float, int);
-    method public void onRestoreInstanceState(android.os.Parcelable);
-    method public android.os.Parcelable onSaveInstanceState();
-    method public void removeOnPageChangeListener(android.support.v4.view.ViewPager.OnPageChangeListener);
-    method public void setAdapter(android.support.v4.view.PagerAdapter);
-    method public void setCurrentItem(int);
-    method public void setCurrentItem(int, boolean);
-    method public void setOffscreenPageLimit(int);
-    method public deprecated void setOnPageChangeListener(android.support.v4.view.ViewPager.OnPageChangeListener);
-    method public void setPageMargin(int);
-    method public void setPageMarginDrawable(android.graphics.drawable.Drawable);
-    method public void setPageMarginDrawable(int);
-    method public void setPageTransformer(boolean, android.support.v4.view.ViewPager.PageTransformer);
-    field public static final int SCROLL_STATE_DRAGGING = 1; // 0x1
-    field public static final int SCROLL_STATE_IDLE = 0; // 0x0
-    field public static final int SCROLL_STATE_SETTLING = 2; // 0x2
-  }
-
-  public static class ViewPager.LayoutParams extends android.view.ViewGroup.LayoutParams {
-    ctor public ViewPager.LayoutParams();
-    ctor public ViewPager.LayoutParams(android.content.Context, android.util.AttributeSet);
-    field public int gravity;
-    field public boolean isDecor;
-  }
-
-  public static abstract interface ViewPager.OnPageChangeListener {
-    method public abstract void onPageScrollStateChanged(int);
-    method public abstract void onPageScrolled(int, float, int);
-    method public abstract void onPageSelected(int);
-  }
-
-  public static abstract interface ViewPager.PageTransformer {
-    method public abstract void transformPage(android.view.View, float);
-  }
-
-  public static class ViewPager.SavedState extends android.view.View.BaseSavedState {
-    ctor public ViewPager.SavedState(android.os.Parcelable);
-    field public static final android.os.Parcelable.Creator<android.support.v4.view.ViewPager.SavedState> CREATOR;
-  }
-
-  public static class ViewPager.SimpleOnPageChangeListener implements android.support.v4.view.ViewPager.OnPageChangeListener {
-    ctor public ViewPager.SimpleOnPageChangeListener();
-    method public void onPageScrollStateChanged(int);
-    method public void onPageScrolled(int, float, int);
-    method public void onPageSelected(int);
-  }
-
-  public class ViewParentCompat {
-    method public static void notifySubtreeAccessibilityStateChanged(android.view.ViewParent, android.view.View, android.view.View, int);
-    method public static boolean onNestedFling(android.view.ViewParent, android.view.View, float, float, boolean);
-    method public static boolean onNestedPreFling(android.view.ViewParent, android.view.View, float, float);
-    method public static void onNestedPreScroll(android.view.ViewParent, android.view.View, int, int, int[]);
-    method public static void onNestedScroll(android.view.ViewParent, android.view.View, int, int, int, int);
-    method public static void onNestedScrollAccepted(android.view.ViewParent, android.view.View, android.view.View, int);
-    method public static boolean onStartNestedScroll(android.view.ViewParent, android.view.View, android.view.View, int);
-    method public static void onStopNestedScroll(android.view.ViewParent, android.view.View);
-    method public static boolean requestSendAccessibilityEvent(android.view.ViewParent, android.view.View, android.view.accessibility.AccessibilityEvent);
-  }
-
-  public class ViewPropertyAnimatorCompat {
-    method public android.support.v4.view.ViewPropertyAnimatorCompat alpha(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat alphaBy(float);
-    method public void cancel();
-    method public long getDuration();
-    method public android.view.animation.Interpolator getInterpolator();
-    method public long getStartDelay();
-    method public android.support.v4.view.ViewPropertyAnimatorCompat rotation(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat rotationBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat rotationX(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat rotationXBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat rotationY(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat rotationYBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat scaleX(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat scaleXBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat scaleY(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat scaleYBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat setDuration(long);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat setInterpolator(android.view.animation.Interpolator);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat setListener(android.support.v4.view.ViewPropertyAnimatorListener);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat setStartDelay(long);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat setUpdateListener(android.support.v4.view.ViewPropertyAnimatorUpdateListener);
-    method public void start();
-    method public android.support.v4.view.ViewPropertyAnimatorCompat translationX(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat translationXBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat translationY(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat translationYBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat translationZ(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat translationZBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat withEndAction(java.lang.Runnable);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat withLayer();
-    method public android.support.v4.view.ViewPropertyAnimatorCompat withStartAction(java.lang.Runnable);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat x(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat xBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat y(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat yBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat z(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat zBy(float);
-  }
-
-  public abstract interface ViewPropertyAnimatorListener {
-    method public abstract void onAnimationCancel(android.view.View);
-    method public abstract void onAnimationEnd(android.view.View);
-    method public abstract void onAnimationStart(android.view.View);
-  }
-
-  public class ViewPropertyAnimatorListenerAdapter implements android.support.v4.view.ViewPropertyAnimatorListener {
-    ctor public ViewPropertyAnimatorListenerAdapter();
-    method public void onAnimationCancel(android.view.View);
-    method public void onAnimationEnd(android.view.View);
-    method public void onAnimationStart(android.view.View);
-  }
-
-  public abstract interface ViewPropertyAnimatorUpdateListener {
-    method public abstract void onAnimationUpdate(android.view.View);
-  }
-
-  public class WindowCompat {
-    ctor public WindowCompat();
-    field public static final int FEATURE_ACTION_BAR = 8; // 0x8
-    field public static final int FEATURE_ACTION_BAR_OVERLAY = 9; // 0x9
-    field public static final int FEATURE_ACTION_MODE_OVERLAY = 10; // 0xa
-  }
-
-  public class WindowInsetsCompat {
-    method public android.support.v4.view.WindowInsetsCompat consumeStableInsets();
-    method public android.support.v4.view.WindowInsetsCompat consumeSystemWindowInsets();
-    method public int getStableInsetBottom();
-    method public int getStableInsetLeft();
-    method public int getStableInsetRight();
-    method public int getStableInsetTop();
-    method public int getSystemWindowInsetBottom();
-    method public int getSystemWindowInsetLeft();
-    method public int getSystemWindowInsetRight();
-    method public int getSystemWindowInsetTop();
-    method public boolean hasInsets();
-    method public boolean hasStableInsets();
-    method public boolean hasSystemWindowInsets();
-    method public boolean isConsumed();
-    method public boolean isRound();
-    method public android.support.v4.view.WindowInsetsCompat replaceSystemWindowInsets(int, int, int, int);
-    method public android.support.v4.view.WindowInsetsCompat replaceSystemWindowInsets(android.graphics.Rect);
-  }
-
-}
-
-package android.support.v4.view.accessibility {
-
-  public class AccessibilityEventCompat {
-    method public static void appendRecord(android.view.accessibility.AccessibilityEvent, android.support.v4.view.accessibility.AccessibilityRecordCompat);
-    method public static android.support.v4.view.accessibility.AccessibilityRecordCompat asRecord(android.view.accessibility.AccessibilityEvent);
-    method public static int getContentChangeTypes(android.view.accessibility.AccessibilityEvent);
-    method public static android.support.v4.view.accessibility.AccessibilityRecordCompat getRecord(android.view.accessibility.AccessibilityEvent, int);
-    method public static int getRecordCount(android.view.accessibility.AccessibilityEvent);
-    method public static void setContentChangeTypes(android.view.accessibility.AccessibilityEvent, int);
-    field public static final int CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION = 4; // 0x4
-    field public static final int CONTENT_CHANGE_TYPE_SUBTREE = 1; // 0x1
-    field public static final int CONTENT_CHANGE_TYPE_TEXT = 2; // 0x2
-    field public static final int CONTENT_CHANGE_TYPE_UNDEFINED = 0; // 0x0
-    field public static final int TYPES_ALL_MASK = -1; // 0xffffffff
-    field public static final int TYPE_ANNOUNCEMENT = 16384; // 0x4000
-    field public static final int TYPE_GESTURE_DETECTION_END = 524288; // 0x80000
-    field public static final int TYPE_GESTURE_DETECTION_START = 262144; // 0x40000
-    field public static final int TYPE_TOUCH_EXPLORATION_GESTURE_END = 1024; // 0x400
-    field public static final int TYPE_TOUCH_EXPLORATION_GESTURE_START = 512; // 0x200
-    field public static final int TYPE_TOUCH_INTERACTION_END = 2097152; // 0x200000
-    field public static final int TYPE_TOUCH_INTERACTION_START = 1048576; // 0x100000
-    field public static final int TYPE_VIEW_ACCESSIBILITY_FOCUSED = 32768; // 0x8000
-    field public static final int TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED = 65536; // 0x10000
-    field public static final int TYPE_VIEW_HOVER_ENTER = 128; // 0x80
-    field public static final int TYPE_VIEW_HOVER_EXIT = 256; // 0x100
-    field public static final int TYPE_VIEW_SCROLLED = 4096; // 0x1000
-    field public static final int TYPE_VIEW_TEXT_SELECTION_CHANGED = 8192; // 0x2000
-    field public static final int TYPE_VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITY = 131072; // 0x20000
-    field public static final int TYPE_WINDOW_CONTENT_CHANGED = 2048; // 0x800
-  }
-
-  public class AccessibilityManagerCompat {
-    ctor public AccessibilityManagerCompat();
-    method public static boolean addAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager, android.support.v4.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat);
-    method public static java.util.List<android.accessibilityservice.AccessibilityServiceInfo> getEnabledAccessibilityServiceList(android.view.accessibility.AccessibilityManager, int);
-    method public static java.util.List<android.accessibilityservice.AccessibilityServiceInfo> getInstalledAccessibilityServiceList(android.view.accessibility.AccessibilityManager);
-    method public static boolean isTouchExplorationEnabled(android.view.accessibility.AccessibilityManager);
-    method public static boolean removeAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager, android.support.v4.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat);
-  }
-
-  public static abstract class AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat {
-    ctor public AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat();
-    method public abstract void onAccessibilityStateChanged(boolean);
-  }
-
-  public class AccessibilityNodeInfoCompat {
-    ctor public AccessibilityNodeInfoCompat(java.lang.Object);
-    method public void addAction(int);
-    method public void addAction(android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat);
-    method public void addChild(android.view.View);
-    method public void addChild(android.view.View, int);
-    method public boolean canOpenPopup();
-    method public java.util.List<android.support.v4.view.accessibility.AccessibilityNodeInfoCompat> findAccessibilityNodeInfosByText(java.lang.String);
-    method public java.util.List<android.support.v4.view.accessibility.AccessibilityNodeInfoCompat> findAccessibilityNodeInfosByViewId(java.lang.String);
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat findFocus(int);
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat focusSearch(int);
-    method public java.util.List<android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat> getActionList();
-    method public int getActions();
-    method public void getBoundsInParent(android.graphics.Rect);
-    method public void getBoundsInScreen(android.graphics.Rect);
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getChild(int);
-    method public int getChildCount();
-    method public java.lang.CharSequence getClassName();
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat getCollectionInfo();
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat getCollectionItemInfo();
-    method public java.lang.CharSequence getContentDescription();
-    method public java.lang.CharSequence getError();
-    method public android.os.Bundle getExtras();
-    method public java.lang.Object getInfo();
-    method public int getInputType();
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getLabelFor();
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getLabeledBy();
-    method public int getLiveRegion();
-    method public int getMaxTextLength();
-    method public int getMovementGranularities();
-    method public java.lang.CharSequence getPackageName();
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getParent();
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat getRangeInfo();
-    method public java.lang.CharSequence getText();
-    method public int getTextSelectionEnd();
-    method public int getTextSelectionStart();
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getTraversalAfter();
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getTraversalBefore();
-    method public java.lang.String getViewIdResourceName();
-    method public android.support.v4.view.accessibility.AccessibilityWindowInfoCompat getWindow();
-    method public int getWindowId();
-    method public boolean isAccessibilityFocused();
-    method public boolean isCheckable();
-    method public boolean isChecked();
-    method public boolean isClickable();
-    method public boolean isContentInvalid();
-    method public boolean isDismissable();
-    method public boolean isEditable();
-    method public boolean isEnabled();
-    method public boolean isFocusable();
-    method public boolean isFocused();
-    method public boolean isLongClickable();
-    method public boolean isMultiLine();
-    method public boolean isPassword();
-    method public boolean isScrollable();
-    method public boolean isSelected();
-    method public boolean isVisibleToUser();
-    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat obtain(android.view.View);
-    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat obtain(android.view.View, int);
-    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat obtain();
-    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat obtain(android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
-    method public boolean performAction(int);
-    method public boolean performAction(int, android.os.Bundle);
-    method public void recycle();
-    method public boolean refresh();
-    method public boolean removeAction(android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat);
-    method public boolean removeChild(android.view.View);
-    method public boolean removeChild(android.view.View, int);
-    method public void setAccessibilityFocused(boolean);
-    method public void setBoundsInParent(android.graphics.Rect);
-    method public void setBoundsInScreen(android.graphics.Rect);
-    method public void setCanOpenPopup(boolean);
-    method public void setCheckable(boolean);
-    method public void setChecked(boolean);
-    method public void setClassName(java.lang.CharSequence);
-    method public void setClickable(boolean);
-    method public void setCollectionInfo(java.lang.Object);
-    method public void setCollectionItemInfo(java.lang.Object);
-    method public void setContentDescription(java.lang.CharSequence);
-    method public void setContentInvalid(boolean);
-    method public void setDismissable(boolean);
-    method public void setEditable(boolean);
-    method public void setEnabled(boolean);
-    method public void setError(java.lang.CharSequence);
-    method public void setFocusable(boolean);
-    method public void setFocused(boolean);
-    method public void setInputType(int);
-    method public void setLabelFor(android.view.View);
-    method public void setLabelFor(android.view.View, int);
-    method public void setLabeledBy(android.view.View);
-    method public void setLabeledBy(android.view.View, int);
-    method public void setLiveRegion(int);
-    method public void setLongClickable(boolean);
-    method public void setMaxTextLength(int);
-    method public void setMovementGranularities(int);
-    method public void setMultiLine(boolean);
-    method public void setPackageName(java.lang.CharSequence);
-    method public void setParent(android.view.View);
-    method public void setParent(android.view.View, int);
-    method public void setPassword(boolean);
-    method public void setRangeInfo(android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat);
-    method public void setScrollable(boolean);
-    method public void setSelected(boolean);
-    method public void setSource(android.view.View);
-    method public void setSource(android.view.View, int);
-    method public void setText(java.lang.CharSequence);
-    method public void setTextSelection(int, int);
-    method public void setTraversalAfter(android.view.View);
-    method public void setTraversalAfter(android.view.View, int);
-    method public void setTraversalBefore(android.view.View);
-    method public void setTraversalBefore(android.view.View, int);
-    method public void setViewIdResourceName(java.lang.String);
-    method public void setVisibleToUser(boolean);
-    field public static final int ACTION_ACCESSIBILITY_FOCUS = 64; // 0x40
-    field public static final java.lang.String ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN = "ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN";
-    field public static final java.lang.String ACTION_ARGUMENT_HTML_ELEMENT_STRING = "ACTION_ARGUMENT_HTML_ELEMENT_STRING";
-    field public static final java.lang.String ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT = "ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT";
-    field public static final java.lang.String ACTION_ARGUMENT_SELECTION_END_INT = "ACTION_ARGUMENT_SELECTION_END_INT";
-    field public static final java.lang.String ACTION_ARGUMENT_SELECTION_START_INT = "ACTION_ARGUMENT_SELECTION_START_INT";
-    field public static final java.lang.String ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE = "ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE";
-    field public static final int ACTION_CLEAR_ACCESSIBILITY_FOCUS = 128; // 0x80
-    field public static final int ACTION_CLEAR_FOCUS = 2; // 0x2
-    field public static final int ACTION_CLEAR_SELECTION = 8; // 0x8
-    field public static final int ACTION_CLICK = 16; // 0x10
-    field public static final int ACTION_COLLAPSE = 524288; // 0x80000
-    field public static final int ACTION_COPY = 16384; // 0x4000
-    field public static final int ACTION_CUT = 65536; // 0x10000
-    field public static final int ACTION_DISMISS = 1048576; // 0x100000
-    field public static final int ACTION_EXPAND = 262144; // 0x40000
-    field public static final int ACTION_FOCUS = 1; // 0x1
-    field public static final int ACTION_LONG_CLICK = 32; // 0x20
-    field public static final int ACTION_NEXT_AT_MOVEMENT_GRANULARITY = 256; // 0x100
-    field public static final int ACTION_NEXT_HTML_ELEMENT = 1024; // 0x400
-    field public static final int ACTION_PASTE = 32768; // 0x8000
-    field public static final int ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY = 512; // 0x200
-    field public static final int ACTION_PREVIOUS_HTML_ELEMENT = 2048; // 0x800
-    field public static final int ACTION_SCROLL_BACKWARD = 8192; // 0x2000
-    field public static final int ACTION_SCROLL_FORWARD = 4096; // 0x1000
-    field public static final int ACTION_SELECT = 4; // 0x4
-    field public static final int ACTION_SET_SELECTION = 131072; // 0x20000
-    field public static final int ACTION_SET_TEXT = 2097152; // 0x200000
-    field public static final int FOCUS_ACCESSIBILITY = 2; // 0x2
-    field public static final int FOCUS_INPUT = 1; // 0x1
-    field public static final int MOVEMENT_GRANULARITY_CHARACTER = 1; // 0x1
-    field public static final int MOVEMENT_GRANULARITY_LINE = 4; // 0x4
-    field public static final int MOVEMENT_GRANULARITY_PAGE = 16; // 0x10
-    field public static final int MOVEMENT_GRANULARITY_PARAGRAPH = 8; // 0x8
-    field public static final int MOVEMENT_GRANULARITY_WORD = 2; // 0x2
-  }
-
-  public static class AccessibilityNodeInfoCompat.AccessibilityActionCompat {
-    ctor public AccessibilityNodeInfoCompat.AccessibilityActionCompat(int, java.lang.CharSequence);
-    method public int getId();
-    method public java.lang.CharSequence getLabel();
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_ACCESSIBILITY_FOCUS;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_CLEAR_ACCESSIBILITY_FOCUS;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_CLEAR_FOCUS;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_CLEAR_SELECTION;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_CLICK;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_COLLAPSE;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_COPY;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_CUT;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_DISMISS;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_EXPAND;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_FOCUS;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_LONG_CLICK;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_NEXT_AT_MOVEMENT_GRANULARITY;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_NEXT_HTML_ELEMENT;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PASTE;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PREVIOUS_HTML_ELEMENT;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_SCROLL_BACKWARD;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_SCROLL_FORWARD;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_SELECT;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_SET_SELECTION;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_SET_TEXT;
-  }
-
-  public static class AccessibilityNodeInfoCompat.CollectionInfoCompat {
-    method public int getColumnCount();
-    method public int getRowCount();
-    method public boolean isHierarchical();
-    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat obtain(int, int, boolean, int);
-    field public static final int SELECTION_MODE_MULTIPLE = 2; // 0x2
-    field public static final int SELECTION_MODE_NONE = 0; // 0x0
-    field public static final int SELECTION_MODE_SINGLE = 1; // 0x1
-  }
-
-  public static class AccessibilityNodeInfoCompat.CollectionItemInfoCompat {
-    method public int getColumnIndex();
-    method public int getColumnSpan();
-    method public int getRowIndex();
-    method public int getRowSpan();
-    method public boolean isHeading();
-    method public boolean isSelected();
-    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat obtain(int, int, int, int, boolean, boolean);
-  }
-
-  public static class AccessibilityNodeInfoCompat.RangeInfoCompat {
-    method public float getCurrent();
-    method public float getMax();
-    method public float getMin();
-    method public int getType();
-    field public static final int RANGE_TYPE_FLOAT = 1; // 0x1
-    field public static final int RANGE_TYPE_INT = 0; // 0x0
-    field public static final int RANGE_TYPE_PERCENT = 2; // 0x2
-  }
-
-  public class AccessibilityNodeProviderCompat {
-    ctor public AccessibilityNodeProviderCompat();
-    ctor public AccessibilityNodeProviderCompat(java.lang.Object);
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat createAccessibilityNodeInfo(int);
-    method public java.util.List<android.support.v4.view.accessibility.AccessibilityNodeInfoCompat> findAccessibilityNodeInfosByText(java.lang.String, int);
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat findFocus(int);
-    method public java.lang.Object getProvider();
-    method public boolean performAction(int, int, android.os.Bundle);
-  }
-
-  public class AccessibilityRecordCompat {
-    ctor public deprecated AccessibilityRecordCompat(java.lang.Object);
-    method public int getAddedCount();
-    method public java.lang.CharSequence getBeforeText();
-    method public java.lang.CharSequence getClassName();
-    method public java.lang.CharSequence getContentDescription();
-    method public int getCurrentItemIndex();
-    method public int getFromIndex();
-    method public deprecated java.lang.Object getImpl();
-    method public int getItemCount();
-    method public int getMaxScrollX();
-    method public int getMaxScrollY();
-    method public android.os.Parcelable getParcelableData();
-    method public int getRemovedCount();
-    method public int getScrollX();
-    method public int getScrollY();
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getSource();
-    method public java.util.List<java.lang.CharSequence> getText();
-    method public int getToIndex();
-    method public int getWindowId();
-    method public boolean isChecked();
-    method public boolean isEnabled();
-    method public boolean isFullScreen();
-    method public boolean isPassword();
-    method public boolean isScrollable();
-    method public static android.support.v4.view.accessibility.AccessibilityRecordCompat obtain(android.support.v4.view.accessibility.AccessibilityRecordCompat);
-    method public static android.support.v4.view.accessibility.AccessibilityRecordCompat obtain();
-    method public void recycle();
-    method public void setAddedCount(int);
-    method public void setBeforeText(java.lang.CharSequence);
-    method public void setChecked(boolean);
-    method public void setClassName(java.lang.CharSequence);
-    method public void setContentDescription(java.lang.CharSequence);
-    method public void setCurrentItemIndex(int);
-    method public void setEnabled(boolean);
-    method public void setFromIndex(int);
-    method public void setFullScreen(boolean);
-    method public void setItemCount(int);
-    method public void setMaxScrollX(int);
-    method public void setMaxScrollY(int);
-    method public void setParcelableData(android.os.Parcelable);
-    method public void setPassword(boolean);
-    method public void setRemovedCount(int);
-    method public void setScrollX(int);
-    method public void setScrollY(int);
-    method public void setScrollable(boolean);
-    method public void setSource(android.view.View);
-    method public void setSource(android.view.View, int);
-    method public void setToIndex(int);
-  }
-
-  public class AccessibilityWindowInfoCompat {
-    method public void getBoundsInScreen(android.graphics.Rect);
-    method public android.support.v4.view.accessibility.AccessibilityWindowInfoCompat getChild(int);
-    method public int getChildCount();
-    method public int getId();
-    method public int getLayer();
-    method public android.support.v4.view.accessibility.AccessibilityWindowInfoCompat getParent();
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getRoot();
-    method public int getType();
-    method public boolean isAccessibilityFocused();
-    method public boolean isActive();
-    method public boolean isFocused();
-    method public static android.support.v4.view.accessibility.AccessibilityWindowInfoCompat obtain();
-    method public static android.support.v4.view.accessibility.AccessibilityWindowInfoCompat obtain(android.support.v4.view.accessibility.AccessibilityWindowInfoCompat);
-    method public void recycle();
-    field public static final int TYPE_ACCESSIBILITY_OVERLAY = 4; // 0x4
-    field public static final int TYPE_APPLICATION = 1; // 0x1
-    field public static final int TYPE_INPUT_METHOD = 2; // 0x2
-    field public static final int TYPE_SYSTEM = 3; // 0x3
-  }
-
-}
-
-package android.support.v4.view.animation {
-
-  public class FastOutLinearInInterpolator extends android.support.v4.view.animation.LookupTableInterpolator {
-    ctor public FastOutLinearInInterpolator();
-  }
-
-  public class FastOutSlowInInterpolator extends android.support.v4.view.animation.LookupTableInterpolator {
-    ctor public FastOutSlowInInterpolator();
-  }
-
-  public class LinearOutSlowInInterpolator extends android.support.v4.view.animation.LookupTableInterpolator {
-    ctor public LinearOutSlowInInterpolator();
-  }
-
-   abstract class LookupTableInterpolator implements android.view.animation.Interpolator {
-    ctor public LookupTableInterpolator(float[]);
-    method public float getInterpolation(float);
-  }
-
-  public class PathInterpolatorCompat {
-    method public static android.view.animation.Interpolator create(android.graphics.Path);
-    method public static android.view.animation.Interpolator create(float, float);
-    method public static android.view.animation.Interpolator create(float, float, float, float);
-  }
-
-}
-
-package android.support.v4.widget {
-
-  public abstract class AutoScrollHelper implements android.view.View.OnTouchListener {
-    ctor public AutoScrollHelper(android.view.View);
-    method public abstract boolean canTargetScrollHorizontally(int);
-    method public abstract boolean canTargetScrollVertically(int);
-    method public boolean isEnabled();
-    method public boolean isExclusive();
-    method public boolean onTouch(android.view.View, android.view.MotionEvent);
-    method public abstract void scrollTargetBy(int, int);
-    method public android.support.v4.widget.AutoScrollHelper setActivationDelay(int);
-    method public android.support.v4.widget.AutoScrollHelper setEdgeType(int);
-    method public android.support.v4.widget.AutoScrollHelper setEnabled(boolean);
-    method public android.support.v4.widget.AutoScrollHelper setExclusive(boolean);
-    method public android.support.v4.widget.AutoScrollHelper setMaximumEdges(float, float);
-    method public android.support.v4.widget.AutoScrollHelper setMaximumVelocity(float, float);
-    method public android.support.v4.widget.AutoScrollHelper setMinimumVelocity(float, float);
-    method public android.support.v4.widget.AutoScrollHelper setRampDownDuration(int);
-    method public android.support.v4.widget.AutoScrollHelper setRampUpDuration(int);
-    method public android.support.v4.widget.AutoScrollHelper setRelativeEdges(float, float);
-    method public android.support.v4.widget.AutoScrollHelper setRelativeVelocity(float, float);
-    field public static final int EDGE_TYPE_INSIDE = 0; // 0x0
-    field public static final int EDGE_TYPE_INSIDE_EXTEND = 1; // 0x1
-    field public static final int EDGE_TYPE_OUTSIDE = 2; // 0x2
-    field public static final float NO_MAX = 3.4028235E38f;
-    field public static final float NO_MIN = 0.0f;
-    field public static final float RELATIVE_UNSPECIFIED = 0.0f;
-  }
-
-  public final class CompoundButtonCompat {
-    method public static android.graphics.drawable.Drawable getButtonDrawable(android.widget.CompoundButton);
-    method public static android.content.res.ColorStateList getButtonTintList(android.widget.CompoundButton);
-    method public static android.graphics.PorterDuff.Mode getButtonTintMode(android.widget.CompoundButton);
-    method public static void setButtonTintList(android.widget.CompoundButton, android.content.res.ColorStateList);
-    method public static void setButtonTintMode(android.widget.CompoundButton, android.graphics.PorterDuff.Mode);
-  }
-
-  public class ContentLoadingProgressBar extends android.widget.ProgressBar {
-    ctor public ContentLoadingProgressBar(android.content.Context);
-    ctor public ContentLoadingProgressBar(android.content.Context, android.util.AttributeSet);
-    method public void hide();
-    method public void onAttachedToWindow();
-    method public void onDetachedFromWindow();
-    method public void show();
-  }
-
-  public abstract class CursorAdapter extends android.widget.BaseAdapter {
-    ctor public deprecated CursorAdapter(android.content.Context, android.database.Cursor);
-    ctor public CursorAdapter(android.content.Context, android.database.Cursor, boolean);
-    ctor public CursorAdapter(android.content.Context, android.database.Cursor, int);
-    method public abstract void bindView(android.view.View, android.content.Context, android.database.Cursor);
-    method public void changeCursor(android.database.Cursor);
-    method public java.lang.CharSequence convertToString(android.database.Cursor);
-    method public int getCount();
-    method public android.database.Cursor getCursor();
-    method public android.widget.Filter getFilter();
-    method public android.widget.FilterQueryProvider getFilterQueryProvider();
-    method public java.lang.Object getItem(int);
-    method public long getItemId(int);
-    method public android.view.View getView(int, android.view.View, android.view.ViewGroup);
-    method protected deprecated void init(android.content.Context, android.database.Cursor, boolean);
-    method public android.view.View newDropDownView(android.content.Context, android.database.Cursor, android.view.ViewGroup);
-    method public abstract android.view.View newView(android.content.Context, android.database.Cursor, android.view.ViewGroup);
-    method protected void onContentChanged();
-    method public android.database.Cursor runQueryOnBackgroundThread(java.lang.CharSequence);
-    method public void setFilterQueryProvider(android.widget.FilterQueryProvider);
-    method public android.database.Cursor swapCursor(android.database.Cursor);
-    field public static final deprecated int FLAG_AUTO_REQUERY = 1; // 0x1
-    field public static final int FLAG_REGISTER_CONTENT_OBSERVER = 2; // 0x2
-  }
-
-  public class DrawerLayout extends android.view.ViewGroup {
-    ctor public DrawerLayout(android.content.Context);
-    ctor public DrawerLayout(android.content.Context, android.util.AttributeSet);
-    ctor public DrawerLayout(android.content.Context, android.util.AttributeSet, int);
-    method public void closeDrawer(android.view.View);
-    method public void closeDrawer(int);
-    method public void closeDrawers();
-    method public float getDrawerElevation();
-    method public int getDrawerLockMode(int);
-    method public int getDrawerLockMode(android.view.View);
-    method public java.lang.CharSequence getDrawerTitle(int);
-    method public android.graphics.drawable.Drawable getStatusBarBackgroundDrawable();
-    method public boolean isDrawerOpen(android.view.View);
-    method public boolean isDrawerOpen(int);
-    method public boolean isDrawerVisible(android.view.View);
-    method public boolean isDrawerVisible(int);
-    method public void onDraw(android.graphics.Canvas);
-    method protected void onLayout(boolean, int, int, int, int);
-    method public void openDrawer(android.view.View);
-    method public void openDrawer(int);
-    method public void setDrawerElevation(float);
-    method public void setDrawerListener(android.support.v4.widget.DrawerLayout.DrawerListener);
-    method public void setDrawerLockMode(int);
-    method public void setDrawerLockMode(int, int);
-    method public void setDrawerLockMode(int, android.view.View);
-    method public void setDrawerShadow(android.graphics.drawable.Drawable, int);
-    method public void setDrawerShadow(int, int);
-    method public void setDrawerTitle(int, java.lang.CharSequence);
-    method public void setScrimColor(int);
-    method public void setStatusBarBackground(android.graphics.drawable.Drawable);
-    method public void setStatusBarBackground(int);
-    method public void setStatusBarBackgroundColor(int);
-    field public static final int LOCK_MODE_LOCKED_CLOSED = 1; // 0x1
-    field public static final int LOCK_MODE_LOCKED_OPEN = 2; // 0x2
-    field public static final int LOCK_MODE_UNLOCKED = 0; // 0x0
-    field public static final int STATE_DRAGGING = 1; // 0x1
-    field public static final int STATE_IDLE = 0; // 0x0
-    field public static final int STATE_SETTLING = 2; // 0x2
-  }
-
-  public static abstract interface DrawerLayout.DrawerListener {
-    method public abstract void onDrawerClosed(android.view.View);
-    method public abstract void onDrawerOpened(android.view.View);
-    method public abstract void onDrawerSlide(android.view.View, float);
-    method public abstract void onDrawerStateChanged(int);
-  }
-
-  public static class DrawerLayout.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
-    ctor public DrawerLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public DrawerLayout.LayoutParams(int, int);
-    ctor public DrawerLayout.LayoutParams(int, int, int);
-    ctor public DrawerLayout.LayoutParams(android.support.v4.widget.DrawerLayout.LayoutParams);
-    ctor public DrawerLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public DrawerLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    field public int gravity;
-  }
-
-  protected static class DrawerLayout.SavedState extends android.view.View.BaseSavedState {
-    ctor public DrawerLayout.SavedState(android.os.Parcel);
-    ctor public DrawerLayout.SavedState(android.os.Parcelable);
-    field public static final android.os.Parcelable.Creator<android.support.v4.widget.DrawerLayout.SavedState> CREATOR;
-  }
-
-  public static abstract class DrawerLayout.SimpleDrawerListener implements android.support.v4.widget.DrawerLayout.DrawerListener {
-    ctor public DrawerLayout.SimpleDrawerListener();
-    method public void onDrawerClosed(android.view.View);
-    method public void onDrawerOpened(android.view.View);
-    method public void onDrawerSlide(android.view.View, float);
-    method public void onDrawerStateChanged(int);
-  }
-
-  public class EdgeEffectCompat {
-    ctor public EdgeEffectCompat(android.content.Context);
-    method public boolean draw(android.graphics.Canvas);
-    method public void finish();
-    method public boolean isFinished();
-    method public boolean onAbsorb(int);
-    method public deprecated boolean onPull(float);
-    method public boolean onPull(float, float);
-    method public boolean onRelease();
-    method public void setSize(int, int);
-  }
-
-  public abstract class ExploreByTouchHelper extends android.support.v4.view.AccessibilityDelegateCompat {
-    ctor public ExploreByTouchHelper(android.view.View);
-    method public boolean dispatchHoverEvent(android.view.MotionEvent);
-    method public int getFocusedVirtualView();
-    method protected abstract int getVirtualViewAt(float, float);
-    method protected abstract void getVisibleVirtualViews(java.util.List<java.lang.Integer>);
-    method public void invalidateRoot();
-    method public void invalidateVirtualView(int);
-    method protected abstract boolean onPerformActionForVirtualView(int, int, android.os.Bundle);
-    method protected abstract void onPopulateEventForVirtualView(int, android.view.accessibility.AccessibilityEvent);
-    method public void onPopulateNodeForHost(android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
-    method protected abstract void onPopulateNodeForVirtualView(int, android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
-    method public boolean sendEventForVirtualView(int, int);
-    field public static final int HOST_ID = -1; // 0xffffffff
-    field public static final int INVALID_ID = -2147483648; // 0x80000000
-  }
-
-  public class ListPopupWindowCompat {
-    method public static android.view.View.OnTouchListener createDragToOpenListener(java.lang.Object, android.view.View);
-  }
-
-  public class ListViewAutoScrollHelper extends android.support.v4.widget.AutoScrollHelper {
-    ctor public ListViewAutoScrollHelper(android.widget.ListView);
-    method public boolean canTargetScrollHorizontally(int);
-    method public boolean canTargetScrollVertically(int);
-    method public void scrollTargetBy(int, int);
-  }
-
-  public class NestedScrollView extends android.widget.FrameLayout implements android.support.v4.view.NestedScrollingChild android.support.v4.view.NestedScrollingParent android.support.v4.view.ScrollingView {
-    ctor public NestedScrollView(android.content.Context);
-    ctor public NestedScrollView(android.content.Context, android.util.AttributeSet);
-    ctor public NestedScrollView(android.content.Context, android.util.AttributeSet, int);
-    method public boolean arrowScroll(int);
-    method protected int computeScrollDeltaToGetChildRectOnScreen(android.graphics.Rect);
-    method public boolean executeKeyEvent(android.view.KeyEvent);
-    method public void fling(int);
-    method public boolean fullScroll(int);
-    method public int getMaxScrollAmount();
-    method public boolean isFillViewport();
-    method public boolean isSmoothScrollingEnabled();
-    method public void onAttachedToWindow();
-    method public boolean pageScroll(int);
-    method public void setFillViewport(boolean);
-    method public void setOnScrollChangeListener(android.support.v4.widget.NestedScrollView.OnScrollChangeListener);
-    method public void setSmoothScrollingEnabled(boolean);
-    method public final void smoothScrollBy(int, int);
-    method public final void smoothScrollTo(int, int);
-  }
-
-  public static abstract interface NestedScrollView.OnScrollChangeListener {
-    method public abstract void onScrollChange(android.support.v4.widget.NestedScrollView, int, int, int, int);
-  }
-
-  public class PopupMenuCompat {
-    method public static android.view.View.OnTouchListener getDragToOpenListener(java.lang.Object);
-  }
-
-  public class PopupWindowCompat {
-    method public static boolean getOverlapAnchor(android.widget.PopupWindow);
-    method public static int getWindowLayoutType(android.widget.PopupWindow);
-    method public static void setOverlapAnchor(android.widget.PopupWindow, boolean);
-    method public static void setWindowLayoutType(android.widget.PopupWindow, int);
-    method public static void showAsDropDown(android.widget.PopupWindow, android.view.View, int, int, int);
-  }
-
-  public abstract class ResourceCursorAdapter extends android.support.v4.widget.CursorAdapter {
-    ctor public deprecated ResourceCursorAdapter(android.content.Context, int, android.database.Cursor);
-    ctor public ResourceCursorAdapter(android.content.Context, int, android.database.Cursor, boolean);
-    ctor public ResourceCursorAdapter(android.content.Context, int, android.database.Cursor, int);
-    method public android.view.View newView(android.content.Context, android.database.Cursor, android.view.ViewGroup);
-    method public void setDropDownViewResource(int);
-    method public void setViewResource(int);
-  }
-
-  public class ScrollerCompat {
-    method public void abortAnimation();
-    method public boolean computeScrollOffset();
-    method public static android.support.v4.widget.ScrollerCompat create(android.content.Context);
-    method public static android.support.v4.widget.ScrollerCompat create(android.content.Context, android.view.animation.Interpolator);
-    method public void fling(int, int, int, int, int, int, int, int);
-    method public void fling(int, int, int, int, int, int, int, int, int, int);
-    method public float getCurrVelocity();
-    method public int getCurrX();
-    method public int getCurrY();
-    method public int getFinalX();
-    method public int getFinalY();
-    method public boolean isFinished();
-    method public boolean isOverScrolled();
-    method public void notifyHorizontalEdgeReached(int, int, int);
-    method public void notifyVerticalEdgeReached(int, int, int);
-    method public boolean springBack(int, int, int, int, int, int);
-    method public void startScroll(int, int, int, int);
-    method public void startScroll(int, int, int, int, int);
-  }
-
-  public class SearchViewCompat {
-    method public static java.lang.CharSequence getQuery(android.view.View);
-    method public static boolean isIconified(android.view.View);
-    method public static boolean isQueryRefinementEnabled(android.view.View);
-    method public static boolean isSubmitButtonEnabled(android.view.View);
-    method public static android.view.View newSearchView(android.content.Context);
-    method public static void setIconified(android.view.View, boolean);
-    method public static void setImeOptions(android.view.View, int);
-    method public static void setInputType(android.view.View, int);
-    method public static void setMaxWidth(android.view.View, int);
-    method public static void setOnCloseListener(android.view.View, android.support.v4.widget.SearchViewCompat.OnCloseListenerCompat);
-    method public static void setOnQueryTextListener(android.view.View, android.support.v4.widget.SearchViewCompat.OnQueryTextListenerCompat);
-    method public static void setQuery(android.view.View, java.lang.CharSequence, boolean);
-    method public static void setQueryHint(android.view.View, java.lang.CharSequence);
-    method public static void setQueryRefinementEnabled(android.view.View, boolean);
-    method public static void setSearchableInfo(android.view.View, android.content.ComponentName);
-    method public static void setSubmitButtonEnabled(android.view.View, boolean);
-  }
-
-  public static abstract class SearchViewCompat.OnCloseListenerCompat {
-    ctor public SearchViewCompat.OnCloseListenerCompat();
-    method public boolean onClose();
-  }
-
-  public static abstract class SearchViewCompat.OnQueryTextListenerCompat {
-    ctor public SearchViewCompat.OnQueryTextListenerCompat();
-    method public boolean onQueryTextChange(java.lang.String);
-    method public boolean onQueryTextSubmit(java.lang.String);
-  }
-
-  public class SimpleCursorAdapter extends android.support.v4.widget.ResourceCursorAdapter {
-    ctor public deprecated SimpleCursorAdapter(android.content.Context, int, android.database.Cursor, java.lang.String[], int[]);
-    ctor public SimpleCursorAdapter(android.content.Context, int, android.database.Cursor, java.lang.String[], int[], int);
-    method public void bindView(android.view.View, android.content.Context, android.database.Cursor);
-    method public void changeCursorAndColumns(android.database.Cursor, java.lang.String[], int[]);
-    method public android.support.v4.widget.SimpleCursorAdapter.CursorToStringConverter getCursorToStringConverter();
-    method public int getStringConversionColumn();
-    method public android.support.v4.widget.SimpleCursorAdapter.ViewBinder getViewBinder();
-    method public void setCursorToStringConverter(android.support.v4.widget.SimpleCursorAdapter.CursorToStringConverter);
-    method public void setStringConversionColumn(int);
-    method public void setViewBinder(android.support.v4.widget.SimpleCursorAdapter.ViewBinder);
-    method public void setViewImage(android.widget.ImageView, java.lang.String);
-    method public void setViewText(android.widget.TextView, java.lang.String);
-  }
-
-  public static abstract interface SimpleCursorAdapter.CursorToStringConverter {
-    method public abstract java.lang.CharSequence convertToString(android.database.Cursor);
-  }
-
-  public static abstract interface SimpleCursorAdapter.ViewBinder {
-    method public abstract boolean setViewValue(android.view.View, android.database.Cursor, int);
-  }
-
-  public class SlidingPaneLayout extends android.view.ViewGroup {
-    ctor public SlidingPaneLayout(android.content.Context);
-    ctor public SlidingPaneLayout(android.content.Context, android.util.AttributeSet);
-    ctor public SlidingPaneLayout(android.content.Context, android.util.AttributeSet, int);
-    method protected boolean canScroll(android.view.View, boolean, int, int, int);
-    method public deprecated boolean canSlide();
-    method public boolean closePane();
-    method public int getCoveredFadeColor();
-    method public int getParallaxDistance();
-    method public int getSliderFadeColor();
-    method public boolean isOpen();
-    method public boolean isSlideable();
-    method protected void onLayout(boolean, int, int, int, int);
-    method public boolean openPane();
-    method public void setCoveredFadeColor(int);
-    method public void setPanelSlideListener(android.support.v4.widget.SlidingPaneLayout.PanelSlideListener);
-    method public void setParallaxDistance(int);
-    method public deprecated void setShadowDrawable(android.graphics.drawable.Drawable);
-    method public void setShadowDrawableLeft(android.graphics.drawable.Drawable);
-    method public void setShadowDrawableRight(android.graphics.drawable.Drawable);
-    method public deprecated void setShadowResource(int);
-    method public void setShadowResourceLeft(int);
-    method public void setShadowResourceRight(int);
-    method public void setSliderFadeColor(int);
-    method public deprecated void smoothSlideClosed();
-    method public deprecated void smoothSlideOpen();
-  }
-
-  public static class SlidingPaneLayout.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
-    ctor public SlidingPaneLayout.LayoutParams();
-    ctor public SlidingPaneLayout.LayoutParams(int, int);
-    ctor public SlidingPaneLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public SlidingPaneLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public SlidingPaneLayout.LayoutParams(android.support.v4.widget.SlidingPaneLayout.LayoutParams);
-    ctor public SlidingPaneLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
-    field public float weight;
-  }
-
-  public static abstract interface SlidingPaneLayout.PanelSlideListener {
-    method public abstract void onPanelClosed(android.view.View);
-    method public abstract void onPanelOpened(android.view.View);
-    method public abstract void onPanelSlide(android.view.View, float);
-  }
-
-  public static class SlidingPaneLayout.SimplePanelSlideListener implements android.support.v4.widget.SlidingPaneLayout.PanelSlideListener {
-    ctor public SlidingPaneLayout.SimplePanelSlideListener();
-    method public void onPanelClosed(android.view.View);
-    method public void onPanelOpened(android.view.View);
-    method public void onPanelSlide(android.view.View, float);
-  }
-
-  public class Space extends android.view.View {
-    ctor public Space(android.content.Context, android.util.AttributeSet, int);
-    ctor public Space(android.content.Context, android.util.AttributeSet);
-    ctor public Space(android.content.Context);
-  }
-
-  public class SwipeRefreshLayout extends android.view.ViewGroup implements android.support.v4.view.NestedScrollingChild android.support.v4.view.NestedScrollingParent {
-    ctor public SwipeRefreshLayout(android.content.Context);
-    ctor public SwipeRefreshLayout(android.content.Context, android.util.AttributeSet);
-    method public boolean canChildScrollUp();
-    method public int getProgressCircleDiameter();
-    method public boolean isRefreshing();
-    method protected void onLayout(boolean, int, int, int, int);
-    method public void onMeasure(int, int);
-    method public deprecated void setColorScheme(int...);
-    method public void setColorSchemeColors(int...);
-    method public void setColorSchemeResources(int...);
-    method public void setDistanceToTriggerSync(int);
-    method public void setOnRefreshListener(android.support.v4.widget.SwipeRefreshLayout.OnRefreshListener);
-    method public deprecated void setProgressBackgroundColor(int);
-    method public void setProgressBackgroundColorSchemeColor(int);
-    method public void setProgressBackgroundColorSchemeResource(int);
-    method public void setProgressViewEndTarget(boolean, int);
-    method public void setProgressViewOffset(boolean, int, int);
-    method public void setRefreshing(boolean);
-    method public void setSize(int);
-    field public static final int DEFAULT = 1; // 0x1
-    field public static final int LARGE = 0; // 0x0
-    field protected int mFrom;
-    field protected int mOriginalOffsetTop;
-  }
-
-  public static abstract interface SwipeRefreshLayout.OnRefreshListener {
-    method public abstract void onRefresh();
-  }
-
-  public class TextViewCompat {
-    method public static int getMaxLines(android.widget.TextView);
-    method public static int getMinLines(android.widget.TextView);
-    method public static void setCompoundDrawablesRelative(android.widget.TextView, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable);
-    method public static void setCompoundDrawablesRelativeWithIntrinsicBounds(android.widget.TextView, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable);
-    method public static void setCompoundDrawablesRelativeWithIntrinsicBounds(android.widget.TextView, int, int, int, int);
-  }
-
-  public class ViewDragHelper {
-    method public void abort();
-    method protected boolean canScroll(android.view.View, boolean, int, int, int, int);
-    method public void cancel();
-    method public void captureChildView(android.view.View, int);
-    method public boolean checkTouchSlop(int);
-    method public boolean checkTouchSlop(int, int);
-    method public boolean continueSettling(boolean);
-    method public static android.support.v4.widget.ViewDragHelper create(android.view.ViewGroup, android.support.v4.widget.ViewDragHelper.Callback);
-    method public static android.support.v4.widget.ViewDragHelper create(android.view.ViewGroup, float, android.support.v4.widget.ViewDragHelper.Callback);
-    method public android.view.View findTopChildUnder(int, int);
-    method public void flingCapturedView(int, int, int, int);
-    method public int getActivePointerId();
-    method public android.view.View getCapturedView();
-    method public int getEdgeSize();
-    method public float getMinVelocity();
-    method public int getTouchSlop();
-    method public int getViewDragState();
-    method public boolean isCapturedViewUnder(int, int);
-    method public boolean isEdgeTouched(int);
-    method public boolean isEdgeTouched(int, int);
-    method public boolean isPointerDown(int);
-    method public boolean isViewUnder(android.view.View, int, int);
-    method public void processTouchEvent(android.view.MotionEvent);
-    method public void setEdgeTrackingEnabled(int);
-    method public void setMinVelocity(float);
-    method public boolean settleCapturedViewAt(int, int);
-    method public boolean shouldInterceptTouchEvent(android.view.MotionEvent);
-    method public boolean smoothSlideViewTo(android.view.View, int, int);
-    field public static final int DIRECTION_ALL = 3; // 0x3
-    field public static final int DIRECTION_HORIZONTAL = 1; // 0x1
-    field public static final int DIRECTION_VERTICAL = 2; // 0x2
-    field public static final int EDGE_ALL = 15; // 0xf
-    field public static final int EDGE_BOTTOM = 8; // 0x8
-    field public static final int EDGE_LEFT = 1; // 0x1
-    field public static final int EDGE_RIGHT = 2; // 0x2
-    field public static final int EDGE_TOP = 4; // 0x4
-    field public static final int INVALID_POINTER = -1; // 0xffffffff
-    field public static final int STATE_DRAGGING = 1; // 0x1
-    field public static final int STATE_IDLE = 0; // 0x0
-    field public static final int STATE_SETTLING = 2; // 0x2
-  }
-
-  public static abstract class ViewDragHelper.Callback {
-    ctor public ViewDragHelper.Callback();
-    method public int clampViewPositionHorizontal(android.view.View, int, int);
-    method public int clampViewPositionVertical(android.view.View, int, int);
-    method public int getOrderedChildIndex(int);
-    method public int getViewHorizontalDragRange(android.view.View);
-    method public int getViewVerticalDragRange(android.view.View);
-    method public void onEdgeDragStarted(int, int);
-    method public boolean onEdgeLock(int);
-    method public void onEdgeTouched(int, int);
-    method public void onViewCaptured(android.view.View, int);
-    method public void onViewDragStateChanged(int);
-    method public void onViewPositionChanged(android.view.View, int, int, int, int);
-    method public void onViewReleased(android.view.View, float, float);
-    method public abstract boolean tryCaptureView(android.view.View, int);
-  }
-
-}
-
diff --git a/v4/api/23.1.1.txt b/v4/api/23.1.1.txt
deleted file mode 100644
index 5b4c450..0000000
--- a/v4/api/23.1.1.txt
+++ /dev/null
@@ -1,3487 +0,0 @@
-package android.support.v4.accessibilityservice {
-
-  public class AccessibilityServiceInfoCompat {
-    method public static java.lang.String capabilityToString(int);
-    method public static java.lang.String feedbackTypeToString(int);
-    method public static java.lang.String flagToString(int);
-    method public static boolean getCanRetrieveWindowContent(android.accessibilityservice.AccessibilityServiceInfo);
-    method public static int getCapabilities(android.accessibilityservice.AccessibilityServiceInfo);
-    method public static java.lang.String getDescription(android.accessibilityservice.AccessibilityServiceInfo);
-    method public static java.lang.String getId(android.accessibilityservice.AccessibilityServiceInfo);
-    method public static android.content.pm.ResolveInfo getResolveInfo(android.accessibilityservice.AccessibilityServiceInfo);
-    method public static java.lang.String getSettingsActivityName(android.accessibilityservice.AccessibilityServiceInfo);
-    field public static final int CAPABILITY_CAN_FILTER_KEY_EVENTS = 8; // 0x8
-    field public static final int CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 4; // 0x4
-    field public static final int CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION = 2; // 0x2
-    field public static final int CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT = 1; // 0x1
-    field public static final int DEFAULT = 1; // 0x1
-    field public static final int FEEDBACK_ALL_MASK = -1; // 0xffffffff
-    field public static final int FEEDBACK_BRAILLE = 32; // 0x20
-    field public static final int FLAG_INCLUDE_NOT_IMPORTANT_VIEWS = 2; // 0x2
-    field public static final int FLAG_REPORT_VIEW_IDS = 16; // 0x10
-    field public static final int FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 8; // 0x8
-    field public static final int FLAG_REQUEST_FILTER_KEY_EVENTS = 32; // 0x20
-    field public static final int FLAG_REQUEST_TOUCH_EXPLORATION_MODE = 4; // 0x4
-  }
-
-}
-
-package android.support.v4.app {
-
-  public deprecated class ActionBarDrawerToggle implements android.support.v4.widget.DrawerLayout.DrawerListener {
-    ctor public ActionBarDrawerToggle(android.app.Activity, android.support.v4.widget.DrawerLayout, int, int, int);
-    ctor public ActionBarDrawerToggle(android.app.Activity, android.support.v4.widget.DrawerLayout, boolean, int, int, int);
-    method public boolean isDrawerIndicatorEnabled();
-    method public void onConfigurationChanged(android.content.res.Configuration);
-    method public void onDrawerClosed(android.view.View);
-    method public void onDrawerOpened(android.view.View);
-    method public void onDrawerSlide(android.view.View, float);
-    method public void onDrawerStateChanged(int);
-    method public boolean onOptionsItemSelected(android.view.MenuItem);
-    method public void setDrawerIndicatorEnabled(boolean);
-    method public void setHomeAsUpIndicator(android.graphics.drawable.Drawable);
-    method public void setHomeAsUpIndicator(int);
-    method public void syncState();
-  }
-
-  public static abstract interface ActionBarDrawerToggle.Delegate {
-    method public abstract android.graphics.drawable.Drawable getThemeUpIndicator();
-    method public abstract void setActionBarDescription(int);
-    method public abstract void setActionBarUpIndicator(android.graphics.drawable.Drawable, int);
-  }
-
-  public static abstract interface ActionBarDrawerToggle.DelegateProvider {
-    method public abstract android.support.v4.app.ActionBarDrawerToggle.Delegate getDrawerToggleDelegate();
-  }
-
-  public class ActivityCompat extends android.support.v4.content.ContextCompat {
-    ctor public ActivityCompat();
-    method public static void finishAffinity(android.app.Activity);
-    method public static void finishAfterTransition(android.app.Activity);
-    method public android.net.Uri getReferrer(android.app.Activity);
-    method public static boolean invalidateOptionsMenu(android.app.Activity);
-    method public static void postponeEnterTransition(android.app.Activity);
-    method public static void requestPermissions(android.app.Activity, java.lang.String[], int);
-    method public static void setEnterSharedElementCallback(android.app.Activity, android.support.v4.app.SharedElementCallback);
-    method public static void setExitSharedElementCallback(android.app.Activity, android.support.v4.app.SharedElementCallback);
-    method public static boolean shouldShowRequestPermissionRationale(android.app.Activity, java.lang.String);
-    method public static void startActivity(android.app.Activity, android.content.Intent, android.os.Bundle);
-    method public static void startActivityForResult(android.app.Activity, android.content.Intent, int, android.os.Bundle);
-    method public static void startPostponedEnterTransition(android.app.Activity);
-  }
-
-  public static abstract interface ActivityCompat.OnRequestPermissionsResultCallback {
-    method public abstract void onRequestPermissionsResult(int, java.lang.String[], int[]);
-  }
-
-  public final class ActivityManagerCompat {
-    method public static boolean isLowRamDevice(android.app.ActivityManager);
-  }
-
-  public class ActivityOptionsCompat {
-    ctor protected ActivityOptionsCompat();
-    method public static android.support.v4.app.ActivityOptionsCompat makeCustomAnimation(android.content.Context, int, int);
-    method public static android.support.v4.app.ActivityOptionsCompat makeScaleUpAnimation(android.view.View, int, int, int, int);
-    method public static android.support.v4.app.ActivityOptionsCompat makeSceneTransitionAnimation(android.app.Activity, android.view.View, java.lang.String);
-    method public static android.support.v4.app.ActivityOptionsCompat makeSceneTransitionAnimation(android.app.Activity, android.support.v4.util.Pair<android.view.View, java.lang.String>...);
-    method public static android.support.v4.app.ActivityOptionsCompat makeThumbnailScaleUpAnimation(android.view.View, android.graphics.Bitmap, int, int);
-    method public android.os.Bundle toBundle();
-    method public void update(android.support.v4.app.ActivityOptionsCompat);
-  }
-
-  public class AppOpsManagerCompat {
-    ctor public AppOpsManagerCompat();
-    method public static int noteOp(android.content.Context, java.lang.String, int, java.lang.String);
-    method public static int noteProxyOp(android.content.Context, java.lang.String, java.lang.String);
-    method public static java.lang.String permissionToOp(java.lang.String);
-    field public static final int MODE_ALLOWED = 0; // 0x0
-    field public static final int MODE_DEFAULT = 3; // 0x3
-    field public static final int MODE_IGNORED = 1; // 0x1
-  }
-
-   abstract class BaseFragmentActivityDonut extends android.app.Activity {
-  }
-
-   abstract class BaseFragmentActivityHoneycomb extends android.support.v4.app.BaseFragmentActivityDonut {
-  }
-
-  public class BundleCompat {
-    ctor public BundleCompat();
-    method public static android.os.IBinder getBinder(android.os.Bundle, java.lang.String);
-    method public static void putBinder(android.os.Bundle, java.lang.String, android.os.IBinder);
-  }
-
-  public class DialogFragment extends android.support.v4.app.Fragment implements android.content.DialogInterface.OnCancelListener android.content.DialogInterface.OnDismissListener {
-    ctor public DialogFragment();
-    method public void dismiss();
-    method public void dismissAllowingStateLoss();
-    method public android.app.Dialog getDialog();
-    method public boolean getShowsDialog();
-    method public int getTheme();
-    method public boolean isCancelable();
-    method public void onCancel(android.content.DialogInterface);
-    method public android.app.Dialog onCreateDialog(android.os.Bundle);
-    method public void onDismiss(android.content.DialogInterface);
-    method public void setCancelable(boolean);
-    method public void setShowsDialog(boolean);
-    method public void setStyle(int, int);
-    method public void show(android.support.v4.app.FragmentManager, java.lang.String);
-    method public int show(android.support.v4.app.FragmentTransaction, java.lang.String);
-    field public static final int STYLE_NORMAL = 0; // 0x0
-    field public static final int STYLE_NO_FRAME = 2; // 0x2
-    field public static final int STYLE_NO_INPUT = 3; // 0x3
-    field public static final int STYLE_NO_TITLE = 1; // 0x1
-  }
-
-  public class Fragment implements android.content.ComponentCallbacks android.view.View.OnCreateContextMenuListener {
-    ctor public Fragment();
-    method public void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
-    method public final boolean equals(java.lang.Object);
-    method public final android.support.v4.app.FragmentActivity getActivity();
-    method public boolean getAllowEnterTransitionOverlap();
-    method public boolean getAllowReturnTransitionOverlap();
-    method public final android.os.Bundle getArguments();
-    method public final android.support.v4.app.FragmentManager getChildFragmentManager();
-    method public android.content.Context getContext();
-    method public java.lang.Object getEnterTransition();
-    method public java.lang.Object getExitTransition();
-    method public final android.support.v4.app.FragmentManager getFragmentManager();
-    method public final java.lang.Object getHost();
-    method public final int getId();
-    method public android.support.v4.app.LoaderManager getLoaderManager();
-    method public final android.support.v4.app.Fragment getParentFragment();
-    method public java.lang.Object getReenterTransition();
-    method public final android.content.res.Resources getResources();
-    method public final boolean getRetainInstance();
-    method public java.lang.Object getReturnTransition();
-    method public java.lang.Object getSharedElementEnterTransition();
-    method public java.lang.Object getSharedElementReturnTransition();
-    method public final java.lang.String getString(int);
-    method public final java.lang.String getString(int, java.lang.Object...);
-    method public final java.lang.String getTag();
-    method public final android.support.v4.app.Fragment getTargetFragment();
-    method public final int getTargetRequestCode();
-    method public final java.lang.CharSequence getText(int);
-    method public boolean getUserVisibleHint();
-    method public android.view.View getView();
-    method public final int hashCode();
-    method public static android.support.v4.app.Fragment instantiate(android.content.Context, java.lang.String);
-    method public static android.support.v4.app.Fragment instantiate(android.content.Context, java.lang.String, android.os.Bundle);
-    method public final boolean isAdded();
-    method public final boolean isDetached();
-    method public final boolean isHidden();
-    method public final boolean isInLayout();
-    method public final boolean isRemoving();
-    method public final boolean isResumed();
-    method public final boolean isVisible();
-    method public void onActivityCreated(android.os.Bundle);
-    method public void onActivityResult(int, int, android.content.Intent);
-    method public void onAttach(android.content.Context);
-    method public deprecated void onAttach(android.app.Activity);
-    method public void onConfigurationChanged(android.content.res.Configuration);
-    method public boolean onContextItemSelected(android.view.MenuItem);
-    method public void onCreate(android.os.Bundle);
-    method public android.view.animation.Animation onCreateAnimation(int, boolean, int);
-    method public void onCreateContextMenu(android.view.ContextMenu, android.view.View, android.view.ContextMenu.ContextMenuInfo);
-    method public void onCreateOptionsMenu(android.view.Menu, android.view.MenuInflater);
-    method public android.view.View onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
-    method public void onDestroy();
-    method public void onDestroyOptionsMenu();
-    method public void onDestroyView();
-    method public void onDetach();
-    method public void onHiddenChanged(boolean);
-    method public void onInflate(android.content.Context, android.util.AttributeSet, android.os.Bundle);
-    method public deprecated void onInflate(android.app.Activity, android.util.AttributeSet, android.os.Bundle);
-    method public void onLowMemory();
-    method public boolean onOptionsItemSelected(android.view.MenuItem);
-    method public void onOptionsMenuClosed(android.view.Menu);
-    method public void onPause();
-    method public void onPrepareOptionsMenu(android.view.Menu);
-    method public void onRequestPermissionsResult(int, java.lang.String[], int[]);
-    method public void onResume();
-    method public void onSaveInstanceState(android.os.Bundle);
-    method public void onStart();
-    method public void onStop();
-    method public void onViewCreated(android.view.View, android.os.Bundle);
-    method public void onViewStateRestored(android.os.Bundle);
-    method public void registerForContextMenu(android.view.View);
-    method public final void requestPermissions(java.lang.String[], int);
-    method public void setAllowEnterTransitionOverlap(boolean);
-    method public void setAllowReturnTransitionOverlap(boolean);
-    method public void setArguments(android.os.Bundle);
-    method public void setEnterSharedElementCallback(android.support.v4.app.SharedElementCallback);
-    method public void setEnterTransition(java.lang.Object);
-    method public void setExitSharedElementCallback(android.support.v4.app.SharedElementCallback);
-    method public void setExitTransition(java.lang.Object);
-    method public void setHasOptionsMenu(boolean);
-    method public void setInitialSavedState(android.support.v4.app.Fragment.SavedState);
-    method public void setMenuVisibility(boolean);
-    method public void setReenterTransition(java.lang.Object);
-    method public void setRetainInstance(boolean);
-    method public void setReturnTransition(java.lang.Object);
-    method public void setSharedElementEnterTransition(java.lang.Object);
-    method public void setSharedElementReturnTransition(java.lang.Object);
-    method public void setTargetFragment(android.support.v4.app.Fragment, int);
-    method public void setUserVisibleHint(boolean);
-    method public boolean shouldShowRequestPermissionRationale(java.lang.String);
-    method public void startActivity(android.content.Intent);
-    method public void startActivityForResult(android.content.Intent, int);
-    method public void unregisterForContextMenu(android.view.View);
-  }
-
-  public static class Fragment.InstantiationException extends java.lang.RuntimeException {
-    ctor public Fragment.InstantiationException(java.lang.String, java.lang.Exception);
-  }
-
-  public static class Fragment.SavedState implements android.os.Parcelable {
-    method public int describeContents();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.support.v4.app.Fragment.SavedState> CREATOR;
-  }
-
-  public class FragmentActivity extends android.support.v4.app.BaseFragmentActivityHoneycomb implements android.support.v4.app.ActivityCompat.OnRequestPermissionsResultCallback {
-    ctor public FragmentActivity();
-    method public java.lang.Object getLastCustomNonConfigurationInstance();
-    method public android.support.v4.app.FragmentManager getSupportFragmentManager();
-    method public android.support.v4.app.LoaderManager getSupportLoaderManager();
-    method public final android.support.v4.media.session.MediaControllerCompat getSupportMediaController();
-    method public void onAttachFragment(android.support.v4.app.Fragment);
-    method protected void onResumeFragments();
-    method public java.lang.Object onRetainCustomNonConfigurationInstance();
-    method public final java.lang.Object onRetainNonConfigurationInstance();
-    method public void setEnterSharedElementCallback(android.support.v4.app.SharedElementCallback);
-    method public void setExitSharedElementCallback(android.support.v4.app.SharedElementCallback);
-    method public final void setSupportMediaController(android.support.v4.media.session.MediaControllerCompat);
-    method public void startActivityFromFragment(android.support.v4.app.Fragment, android.content.Intent, int);
-    method public void supportFinishAfterTransition();
-    method public void supportInvalidateOptionsMenu();
-    method public void supportPostponeEnterTransition();
-    method public void supportStartPostponedEnterTransition();
-    method public final void validateRequestPermissionsRequestCode(int);
-  }
-
-  public abstract class FragmentContainer {
-    ctor public FragmentContainer();
-    method public abstract android.view.View onFindViewById(int);
-    method public abstract boolean onHasView();
-  }
-
-  public class FragmentController {
-    method public void attachHost(android.support.v4.app.Fragment);
-    method public static final android.support.v4.app.FragmentController createController(android.support.v4.app.FragmentHostCallback<?>);
-    method public void dispatchActivityCreated();
-    method public void dispatchConfigurationChanged(android.content.res.Configuration);
-    method public boolean dispatchContextItemSelected(android.view.MenuItem);
-    method public void dispatchCreate();
-    method public boolean dispatchCreateOptionsMenu(android.view.Menu, android.view.MenuInflater);
-    method public void dispatchDestroy();
-    method public void dispatchDestroyView();
-    method public void dispatchLowMemory();
-    method public boolean dispatchOptionsItemSelected(android.view.MenuItem);
-    method public void dispatchOptionsMenuClosed(android.view.Menu);
-    method public void dispatchPause();
-    method public boolean dispatchPrepareOptionsMenu(android.view.Menu);
-    method public void dispatchReallyStop();
-    method public void dispatchResume();
-    method public void dispatchStart();
-    method public void dispatchStop();
-    method public void doLoaderDestroy();
-    method public void doLoaderRetain();
-    method public void doLoaderStart();
-    method public void doLoaderStop(boolean);
-    method public void dumpLoaders(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
-    method public boolean execPendingActions();
-    method public java.util.List<android.support.v4.app.Fragment> getActiveFragments(java.util.List<android.support.v4.app.Fragment>);
-    method public int getActiveFragmentsCount();
-    method public android.support.v4.app.FragmentManager getSupportFragmentManager();
-    method public android.support.v4.app.LoaderManager getSupportLoaderManager();
-    method public void noteStateNotSaved();
-    method public android.view.View onCreateView(android.view.View, java.lang.String, android.content.Context, android.util.AttributeSet);
-    method public void reportLoaderStart();
-    method public void restoreAllState(android.os.Parcelable, java.util.List<android.support.v4.app.Fragment>);
-    method public void restoreLoaderNonConfig(android.support.v4.util.SimpleArrayMap<java.lang.String, android.support.v4.app.LoaderManager>);
-    method public android.support.v4.util.SimpleArrayMap<java.lang.String, android.support.v4.app.LoaderManager> retainLoaderNonConfig();
-    method public java.util.List<android.support.v4.app.Fragment> retainNonConfig();
-    method public android.os.Parcelable saveAllState();
-  }
-
-  public abstract class FragmentHostCallback extends android.support.v4.app.FragmentContainer {
-    ctor public FragmentHostCallback(android.content.Context, android.os.Handler, int);
-    method public void onDump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
-    method public android.view.View onFindViewById(int);
-    method public abstract E onGetHost();
-    method public android.view.LayoutInflater onGetLayoutInflater();
-    method public int onGetWindowAnimations();
-    method public boolean onHasView();
-    method public boolean onHasWindowAnimations();
-    method public void onRequestPermissionsFromFragment(android.support.v4.app.Fragment, java.lang.String[], int);
-    method public boolean onShouldSaveFragmentState(android.support.v4.app.Fragment);
-    method public boolean onShouldShowRequestPermissionRationale(java.lang.String);
-    method public void onStartActivityFromFragment(android.support.v4.app.Fragment, android.content.Intent, int);
-    method public void onSupportInvalidateOptionsMenu();
-  }
-
-  public abstract class FragmentManager {
-    ctor public FragmentManager();
-    method public abstract void addOnBackStackChangedListener(android.support.v4.app.FragmentManager.OnBackStackChangedListener);
-    method public abstract android.support.v4.app.FragmentTransaction beginTransaction();
-    method public abstract void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
-    method public static void enableDebugLogging(boolean);
-    method public abstract boolean executePendingTransactions();
-    method public abstract android.support.v4.app.Fragment findFragmentById(int);
-    method public abstract android.support.v4.app.Fragment findFragmentByTag(java.lang.String);
-    method public abstract android.support.v4.app.FragmentManager.BackStackEntry getBackStackEntryAt(int);
-    method public abstract int getBackStackEntryCount();
-    method public abstract android.support.v4.app.Fragment getFragment(android.os.Bundle, java.lang.String);
-    method public abstract boolean isDestroyed();
-    method public abstract void popBackStack();
-    method public abstract void popBackStack(java.lang.String, int);
-    method public abstract void popBackStack(int, int);
-    method public abstract boolean popBackStackImmediate();
-    method public abstract boolean popBackStackImmediate(java.lang.String, int);
-    method public abstract boolean popBackStackImmediate(int, int);
-    method public abstract void putFragment(android.os.Bundle, java.lang.String, android.support.v4.app.Fragment);
-    method public abstract void removeOnBackStackChangedListener(android.support.v4.app.FragmentManager.OnBackStackChangedListener);
-    method public abstract android.support.v4.app.Fragment.SavedState saveFragmentInstanceState(android.support.v4.app.Fragment);
-    field public static final int POP_BACK_STACK_INCLUSIVE = 1; // 0x1
-  }
-
-  public static abstract interface FragmentManager.BackStackEntry {
-    method public abstract java.lang.CharSequence getBreadCrumbShortTitle();
-    method public abstract int getBreadCrumbShortTitleRes();
-    method public abstract java.lang.CharSequence getBreadCrumbTitle();
-    method public abstract int getBreadCrumbTitleRes();
-    method public abstract int getId();
-    method public abstract java.lang.String getName();
-  }
-
-  public static abstract interface FragmentManager.OnBackStackChangedListener {
-    method public abstract void onBackStackChanged();
-  }
-
-  public abstract class FragmentPagerAdapter extends android.support.v4.view.PagerAdapter {
-    ctor public FragmentPagerAdapter(android.support.v4.app.FragmentManager);
-    method public abstract android.support.v4.app.Fragment getItem(int);
-    method public long getItemId(int);
-    method public boolean isViewFromObject(android.view.View, java.lang.Object);
-  }
-
-  public abstract class FragmentStatePagerAdapter extends android.support.v4.view.PagerAdapter {
-    ctor public FragmentStatePagerAdapter(android.support.v4.app.FragmentManager);
-    method public abstract android.support.v4.app.Fragment getItem(int);
-    method public boolean isViewFromObject(android.view.View, java.lang.Object);
-  }
-
-  public class FragmentTabHost extends android.widget.TabHost implements android.widget.TabHost.OnTabChangeListener {
-    ctor public FragmentTabHost(android.content.Context);
-    ctor public FragmentTabHost(android.content.Context, android.util.AttributeSet);
-    method public void addTab(android.widget.TabHost.TabSpec, java.lang.Class<?>, android.os.Bundle);
-    method public void onTabChanged(java.lang.String);
-    method public void setup(android.content.Context, android.support.v4.app.FragmentManager);
-    method public void setup(android.content.Context, android.support.v4.app.FragmentManager, int);
-  }
-
-  public abstract class FragmentTransaction {
-    ctor public FragmentTransaction();
-    method public abstract android.support.v4.app.FragmentTransaction add(android.support.v4.app.Fragment, java.lang.String);
-    method public abstract android.support.v4.app.FragmentTransaction add(int, android.support.v4.app.Fragment);
-    method public abstract android.support.v4.app.FragmentTransaction add(int, android.support.v4.app.Fragment, java.lang.String);
-    method public abstract android.support.v4.app.FragmentTransaction addSharedElement(android.view.View, java.lang.String);
-    method public abstract android.support.v4.app.FragmentTransaction addToBackStack(java.lang.String);
-    method public abstract android.support.v4.app.FragmentTransaction attach(android.support.v4.app.Fragment);
-    method public abstract int commit();
-    method public abstract int commitAllowingStateLoss();
-    method public abstract android.support.v4.app.FragmentTransaction detach(android.support.v4.app.Fragment);
-    method public abstract android.support.v4.app.FragmentTransaction disallowAddToBackStack();
-    method public abstract android.support.v4.app.FragmentTransaction hide(android.support.v4.app.Fragment);
-    method public abstract boolean isAddToBackStackAllowed();
-    method public abstract boolean isEmpty();
-    method public abstract android.support.v4.app.FragmentTransaction remove(android.support.v4.app.Fragment);
-    method public abstract android.support.v4.app.FragmentTransaction replace(int, android.support.v4.app.Fragment);
-    method public abstract android.support.v4.app.FragmentTransaction replace(int, android.support.v4.app.Fragment, java.lang.String);
-    method public abstract android.support.v4.app.FragmentTransaction setBreadCrumbShortTitle(int);
-    method public abstract android.support.v4.app.FragmentTransaction setBreadCrumbShortTitle(java.lang.CharSequence);
-    method public abstract android.support.v4.app.FragmentTransaction setBreadCrumbTitle(int);
-    method public abstract android.support.v4.app.FragmentTransaction setBreadCrumbTitle(java.lang.CharSequence);
-    method public abstract android.support.v4.app.FragmentTransaction setCustomAnimations(int, int);
-    method public abstract android.support.v4.app.FragmentTransaction setCustomAnimations(int, int, int, int);
-    method public abstract android.support.v4.app.FragmentTransaction setTransition(int);
-    method public abstract android.support.v4.app.FragmentTransaction setTransitionStyle(int);
-    method public abstract android.support.v4.app.FragmentTransaction show(android.support.v4.app.Fragment);
-    field public static final int TRANSIT_ENTER_MASK = 4096; // 0x1000
-    field public static final int TRANSIT_EXIT_MASK = 8192; // 0x2000
-    field public static final int TRANSIT_FRAGMENT_CLOSE = 8194; // 0x2002
-    field public static final int TRANSIT_FRAGMENT_FADE = 4099; // 0x1003
-    field public static final int TRANSIT_FRAGMENT_OPEN = 4097; // 0x1001
-    field public static final int TRANSIT_NONE = 0; // 0x0
-    field public static final int TRANSIT_UNSET = -1; // 0xffffffff
-  }
-
-  public class ListFragment extends android.support.v4.app.Fragment {
-    ctor public ListFragment();
-    method public android.widget.ListAdapter getListAdapter();
-    method public android.widget.ListView getListView();
-    method public long getSelectedItemId();
-    method public int getSelectedItemPosition();
-    method public void onListItemClick(android.widget.ListView, android.view.View, int, long);
-    method public void setEmptyText(java.lang.CharSequence);
-    method public void setListAdapter(android.widget.ListAdapter);
-    method public void setListShown(boolean);
-    method public void setListShownNoAnimation(boolean);
-    method public void setSelection(int);
-  }
-
-  public abstract class LoaderManager {
-    ctor public LoaderManager();
-    method public abstract void destroyLoader(int);
-    method public abstract void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
-    method public static void enableDebugLogging(boolean);
-    method public abstract android.support.v4.content.Loader<D> getLoader(int);
-    method public boolean hasRunningLoaders();
-    method public abstract android.support.v4.content.Loader<D> initLoader(int, android.os.Bundle, android.support.v4.app.LoaderManager.LoaderCallbacks<D>);
-    method public abstract android.support.v4.content.Loader<D> restartLoader(int, android.os.Bundle, android.support.v4.app.LoaderManager.LoaderCallbacks<D>);
-  }
-
-  public static abstract interface LoaderManager.LoaderCallbacks {
-    method public abstract android.support.v4.content.Loader<D> onCreateLoader(int, android.os.Bundle);
-    method public abstract void onLoadFinished(android.support.v4.content.Loader<D>, D);
-    method public abstract void onLoaderReset(android.support.v4.content.Loader<D>);
-  }
-
-  public class NavUtils {
-    method public static android.content.Intent getParentActivityIntent(android.app.Activity);
-    method public static android.content.Intent getParentActivityIntent(android.content.Context, java.lang.Class<?>) throws android.content.pm.PackageManager.NameNotFoundException;
-    method public static android.content.Intent getParentActivityIntent(android.content.Context, android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
-    method public static java.lang.String getParentActivityName(android.app.Activity);
-    method public static java.lang.String getParentActivityName(android.content.Context, android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
-    method public static void navigateUpFromSameTask(android.app.Activity);
-    method public static void navigateUpTo(android.app.Activity, android.content.Intent);
-    method public static boolean shouldUpRecreateTask(android.app.Activity, android.content.Intent);
-    field public static final java.lang.String PARENT_ACTIVITY = "android.support.PARENT_ACTIVITY";
-  }
-
-  public class NotificationCompat {
-    ctor public NotificationCompat();
-    method public static android.support.v4.app.NotificationCompat.Action getAction(android.app.Notification, int);
-    method public static int getActionCount(android.app.Notification);
-    method public static java.lang.String getCategory(android.app.Notification);
-    method public static android.os.Bundle getExtras(android.app.Notification);
-    method public static java.lang.String getGroup(android.app.Notification);
-    method public static boolean getLocalOnly(android.app.Notification);
-    method public static java.lang.String getSortKey(android.app.Notification);
-    method public static boolean isGroupSummary(android.app.Notification);
-    field public static final java.lang.String CATEGORY_ALARM = "alarm";
-    field public static final java.lang.String CATEGORY_CALL = "call";
-    field public static final java.lang.String CATEGORY_EMAIL = "email";
-    field public static final java.lang.String CATEGORY_ERROR = "err";
-    field public static final java.lang.String CATEGORY_EVENT = "event";
-    field public static final java.lang.String CATEGORY_MESSAGE = "msg";
-    field public static final java.lang.String CATEGORY_PROGRESS = "progress";
-    field public static final java.lang.String CATEGORY_PROMO = "promo";
-    field public static final java.lang.String CATEGORY_RECOMMENDATION = "recommendation";
-    field public static final java.lang.String CATEGORY_SERVICE = "service";
-    field public static final java.lang.String CATEGORY_SOCIAL = "social";
-    field public static final java.lang.String CATEGORY_STATUS = "status";
-    field public static final java.lang.String CATEGORY_SYSTEM = "sys";
-    field public static final java.lang.String CATEGORY_TRANSPORT = "transport";
-    field public static final int COLOR_DEFAULT = 0; // 0x0
-    field public static final int DEFAULT_ALL = -1; // 0xffffffff
-    field public static final int DEFAULT_LIGHTS = 4; // 0x4
-    field public static final int DEFAULT_SOUND = 1; // 0x1
-    field public static final int DEFAULT_VIBRATE = 2; // 0x2
-    field public static final java.lang.String EXTRA_BACKGROUND_IMAGE_URI = "android.backgroundImageUri";
-    field public static final java.lang.String EXTRA_BIG_TEXT = "android.bigText";
-    field public static final java.lang.String EXTRA_COMPACT_ACTIONS = "android.compactActions";
-    field public static final java.lang.String EXTRA_INFO_TEXT = "android.infoText";
-    field public static final java.lang.String EXTRA_LARGE_ICON = "android.largeIcon";
-    field public static final java.lang.String EXTRA_LARGE_ICON_BIG = "android.largeIcon.big";
-    field public static final java.lang.String EXTRA_MEDIA_SESSION = "android.mediaSession";
-    field public static final java.lang.String EXTRA_PEOPLE = "android.people";
-    field public static final java.lang.String EXTRA_PICTURE = "android.picture";
-    field public static final java.lang.String EXTRA_PROGRESS = "android.progress";
-    field public static final java.lang.String EXTRA_PROGRESS_INDETERMINATE = "android.progressIndeterminate";
-    field public static final java.lang.String EXTRA_PROGRESS_MAX = "android.progressMax";
-    field public static final java.lang.String EXTRA_SHOW_CHRONOMETER = "android.showChronometer";
-    field public static final java.lang.String EXTRA_SHOW_WHEN = "android.showWhen";
-    field public static final java.lang.String EXTRA_SMALL_ICON = "android.icon";
-    field public static final java.lang.String EXTRA_SUB_TEXT = "android.subText";
-    field public static final java.lang.String EXTRA_SUMMARY_TEXT = "android.summaryText";
-    field public static final java.lang.String EXTRA_TEMPLATE = "android.template";
-    field public static final java.lang.String EXTRA_TEXT = "android.text";
-    field public static final java.lang.String EXTRA_TEXT_LINES = "android.textLines";
-    field public static final java.lang.String EXTRA_TITLE = "android.title";
-    field public static final java.lang.String EXTRA_TITLE_BIG = "android.title.big";
-    field public static final int FLAG_AUTO_CANCEL = 16; // 0x10
-    field public static final int FLAG_FOREGROUND_SERVICE = 64; // 0x40
-    field public static final int FLAG_GROUP_SUMMARY = 512; // 0x200
-    field public static final deprecated int FLAG_HIGH_PRIORITY = 128; // 0x80
-    field public static final int FLAG_INSISTENT = 4; // 0x4
-    field public static final int FLAG_LOCAL_ONLY = 256; // 0x100
-    field public static final int FLAG_NO_CLEAR = 32; // 0x20
-    field public static final int FLAG_ONGOING_EVENT = 2; // 0x2
-    field public static final int FLAG_ONLY_ALERT_ONCE = 8; // 0x8
-    field public static final int FLAG_SHOW_LIGHTS = 1; // 0x1
-    field public static final int PRIORITY_DEFAULT = 0; // 0x0
-    field public static final int PRIORITY_HIGH = 1; // 0x1
-    field public static final int PRIORITY_LOW = -1; // 0xffffffff
-    field public static final int PRIORITY_MAX = 2; // 0x2
-    field public static final int PRIORITY_MIN = -2; // 0xfffffffe
-    field public static final int STREAM_DEFAULT = -1; // 0xffffffff
-    field public static final int VISIBILITY_PRIVATE = 0; // 0x0
-    field public static final int VISIBILITY_PUBLIC = 1; // 0x1
-    field public static final int VISIBILITY_SECRET = -1; // 0xffffffff
-  }
-
-  public static class NotificationCompat.Action {
-    ctor public NotificationCompat.Action(int, java.lang.CharSequence, android.app.PendingIntent);
-    method public android.app.PendingIntent getActionIntent();
-    method public android.os.Bundle getExtras();
-    method public int getIcon();
-    method public android.support.v4.app.RemoteInput[] getRemoteInputs();
-    method public java.lang.CharSequence getTitle();
-    field public android.app.PendingIntent actionIntent;
-    field public int icon;
-    field public java.lang.CharSequence title;
-  }
-
-  public static final class NotificationCompat.Action.Builder {
-    ctor public NotificationCompat.Action.Builder(int, java.lang.CharSequence, android.app.PendingIntent);
-    ctor public NotificationCompat.Action.Builder(android.support.v4.app.NotificationCompat.Action);
-    method public android.support.v4.app.NotificationCompat.Action.Builder addExtras(android.os.Bundle);
-    method public android.support.v4.app.NotificationCompat.Action.Builder addRemoteInput(android.support.v4.app.RemoteInput);
-    method public android.support.v4.app.NotificationCompat.Action build();
-    method public android.support.v4.app.NotificationCompat.Action.Builder extend(android.support.v4.app.NotificationCompat.Action.Extender);
-    method public android.os.Bundle getExtras();
-  }
-
-  public static abstract interface NotificationCompat.Action.Extender {
-    method public abstract android.support.v4.app.NotificationCompat.Action.Builder extend(android.support.v4.app.NotificationCompat.Action.Builder);
-  }
-
-  public static final class NotificationCompat.Action.WearableExtender implements android.support.v4.app.NotificationCompat.Action.Extender {
-    ctor public NotificationCompat.Action.WearableExtender();
-    ctor public NotificationCompat.Action.WearableExtender(android.support.v4.app.NotificationCompat.Action);
-    method public android.support.v4.app.NotificationCompat.Action.WearableExtender clone();
-    method public android.support.v4.app.NotificationCompat.Action.Builder extend(android.support.v4.app.NotificationCompat.Action.Builder);
-    method public java.lang.CharSequence getCancelLabel();
-    method public java.lang.CharSequence getConfirmLabel();
-    method public java.lang.CharSequence getInProgressLabel();
-    method public boolean isAvailableOffline();
-    method public android.support.v4.app.NotificationCompat.Action.WearableExtender setAvailableOffline(boolean);
-    method public android.support.v4.app.NotificationCompat.Action.WearableExtender setCancelLabel(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.Action.WearableExtender setConfirmLabel(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.Action.WearableExtender setInProgressLabel(java.lang.CharSequence);
-  }
-
-  public static class NotificationCompat.BigPictureStyle extends android.support.v4.app.NotificationCompat.Style {
-    ctor public NotificationCompat.BigPictureStyle();
-    ctor public NotificationCompat.BigPictureStyle(android.support.v4.app.NotificationCompat.Builder);
-    method public android.support.v4.app.NotificationCompat.BigPictureStyle bigLargeIcon(android.graphics.Bitmap);
-    method public android.support.v4.app.NotificationCompat.BigPictureStyle bigPicture(android.graphics.Bitmap);
-    method public android.support.v4.app.NotificationCompat.BigPictureStyle setBigContentTitle(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.BigPictureStyle setSummaryText(java.lang.CharSequence);
-  }
-
-  public static class NotificationCompat.BigTextStyle extends android.support.v4.app.NotificationCompat.Style {
-    ctor public NotificationCompat.BigTextStyle();
-    ctor public NotificationCompat.BigTextStyle(android.support.v4.app.NotificationCompat.Builder);
-    method public android.support.v4.app.NotificationCompat.BigTextStyle bigText(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.BigTextStyle setBigContentTitle(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.BigTextStyle setSummaryText(java.lang.CharSequence);
-  }
-
-  public static class NotificationCompat.Builder {
-    ctor public NotificationCompat.Builder(android.content.Context);
-    method public android.support.v4.app.NotificationCompat.Builder addAction(int, java.lang.CharSequence, android.app.PendingIntent);
-    method public android.support.v4.app.NotificationCompat.Builder addAction(android.support.v4.app.NotificationCompat.Action);
-    method public android.support.v4.app.NotificationCompat.Builder addExtras(android.os.Bundle);
-    method public android.support.v4.app.NotificationCompat.Builder addPerson(java.lang.String);
-    method public android.app.Notification build();
-    method public android.support.v4.app.NotificationCompat.Builder extend(android.support.v4.app.NotificationCompat.Extender);
-    method public android.os.Bundle getExtras();
-    method public deprecated android.app.Notification getNotification();
-    method protected static java.lang.CharSequence limitCharSequenceLength(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.Builder setAutoCancel(boolean);
-    method public android.support.v4.app.NotificationCompat.Builder setCategory(java.lang.String);
-    method public android.support.v4.app.NotificationCompat.Builder setColor(int);
-    method public android.support.v4.app.NotificationCompat.Builder setContent(android.widget.RemoteViews);
-    method public android.support.v4.app.NotificationCompat.Builder setContentInfo(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.Builder setContentIntent(android.app.PendingIntent);
-    method public android.support.v4.app.NotificationCompat.Builder setContentText(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.Builder setContentTitle(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.Builder setDefaults(int);
-    method public android.support.v4.app.NotificationCompat.Builder setDeleteIntent(android.app.PendingIntent);
-    method public android.support.v4.app.NotificationCompat.Builder setExtras(android.os.Bundle);
-    method public android.support.v4.app.NotificationCompat.Builder setFullScreenIntent(android.app.PendingIntent, boolean);
-    method public android.support.v4.app.NotificationCompat.Builder setGroup(java.lang.String);
-    method public android.support.v4.app.NotificationCompat.Builder setGroupSummary(boolean);
-    method public android.support.v4.app.NotificationCompat.Builder setLargeIcon(android.graphics.Bitmap);
-    method public android.support.v4.app.NotificationCompat.Builder setLights(int, int, int);
-    method public android.support.v4.app.NotificationCompat.Builder setLocalOnly(boolean);
-    method public android.support.v4.app.NotificationCompat.Builder setNumber(int);
-    method public android.support.v4.app.NotificationCompat.Builder setOngoing(boolean);
-    method public android.support.v4.app.NotificationCompat.Builder setOnlyAlertOnce(boolean);
-    method public android.support.v4.app.NotificationCompat.Builder setPriority(int);
-    method public android.support.v4.app.NotificationCompat.Builder setProgress(int, int, boolean);
-    method public android.support.v4.app.NotificationCompat.Builder setPublicVersion(android.app.Notification);
-    method public android.support.v4.app.NotificationCompat.Builder setShowWhen(boolean);
-    method public android.support.v4.app.NotificationCompat.Builder setSmallIcon(int);
-    method public android.support.v4.app.NotificationCompat.Builder setSmallIcon(int, int);
-    method public android.support.v4.app.NotificationCompat.Builder setSortKey(java.lang.String);
-    method public android.support.v4.app.NotificationCompat.Builder setSound(android.net.Uri);
-    method public android.support.v4.app.NotificationCompat.Builder setSound(android.net.Uri, int);
-    method public android.support.v4.app.NotificationCompat.Builder setStyle(android.support.v4.app.NotificationCompat.Style);
-    method public android.support.v4.app.NotificationCompat.Builder setSubText(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.Builder setTicker(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.Builder setTicker(java.lang.CharSequence, android.widget.RemoteViews);
-    method public android.support.v4.app.NotificationCompat.Builder setUsesChronometer(boolean);
-    method public android.support.v4.app.NotificationCompat.Builder setVibrate(long[]);
-    method public android.support.v4.app.NotificationCompat.Builder setVisibility(int);
-    method public android.support.v4.app.NotificationCompat.Builder setWhen(long);
-    field public java.util.ArrayList<java.lang.String> mPeople;
-  }
-
-  public static final class NotificationCompat.CarExtender implements android.support.v4.app.NotificationCompat.Extender {
-    ctor public NotificationCompat.CarExtender();
-    ctor public NotificationCompat.CarExtender(android.app.Notification);
-    method public android.support.v4.app.NotificationCompat.Builder extend(android.support.v4.app.NotificationCompat.Builder);
-    method public int getColor();
-    method public android.graphics.Bitmap getLargeIcon();
-    method public android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation getUnreadConversation();
-    method public android.support.v4.app.NotificationCompat.CarExtender setColor(int);
-    method public android.support.v4.app.NotificationCompat.CarExtender setLargeIcon(android.graphics.Bitmap);
-    method public android.support.v4.app.NotificationCompat.CarExtender setUnreadConversation(android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation);
-  }
-
-  public static class NotificationCompat.CarExtender.UnreadConversation {
-    method public long getLatestTimestamp();
-    method public java.lang.String[] getMessages();
-    method public java.lang.String getParticipant();
-    method public java.lang.String[] getParticipants();
-    method public android.app.PendingIntent getReadPendingIntent();
-    method public android.support.v4.app.RemoteInput getRemoteInput();
-    method public android.app.PendingIntent getReplyPendingIntent();
-  }
-
-  public static class NotificationCompat.CarExtender.UnreadConversation.Builder {
-    ctor public NotificationCompat.CarExtender.UnreadConversation.Builder(java.lang.String);
-    method public android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation.Builder addMessage(java.lang.String);
-    method public android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation build();
-    method public android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation.Builder setLatestTimestamp(long);
-    method public android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation.Builder setReadPendingIntent(android.app.PendingIntent);
-    method public android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation.Builder setReplyAction(android.app.PendingIntent, android.support.v4.app.RemoteInput);
-  }
-
-  public static abstract interface NotificationCompat.Extender {
-    method public abstract android.support.v4.app.NotificationCompat.Builder extend(android.support.v4.app.NotificationCompat.Builder);
-  }
-
-  public static class NotificationCompat.InboxStyle extends android.support.v4.app.NotificationCompat.Style {
-    ctor public NotificationCompat.InboxStyle();
-    ctor public NotificationCompat.InboxStyle(android.support.v4.app.NotificationCompat.Builder);
-    method public android.support.v4.app.NotificationCompat.InboxStyle addLine(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.InboxStyle setBigContentTitle(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.InboxStyle setSummaryText(java.lang.CharSequence);
-  }
-
-  public static abstract class NotificationCompat.Style {
-    ctor public NotificationCompat.Style();
-    method public android.app.Notification build();
-    method public void setBuilder(android.support.v4.app.NotificationCompat.Builder);
-  }
-
-  public static final class NotificationCompat.WearableExtender implements android.support.v4.app.NotificationCompat.Extender {
-    ctor public NotificationCompat.WearableExtender();
-    ctor public NotificationCompat.WearableExtender(android.app.Notification);
-    method public android.support.v4.app.NotificationCompat.WearableExtender addAction(android.support.v4.app.NotificationCompat.Action);
-    method public android.support.v4.app.NotificationCompat.WearableExtender addActions(java.util.List<android.support.v4.app.NotificationCompat.Action>);
-    method public android.support.v4.app.NotificationCompat.WearableExtender addPage(android.app.Notification);
-    method public android.support.v4.app.NotificationCompat.WearableExtender addPages(java.util.List<android.app.Notification>);
-    method public android.support.v4.app.NotificationCompat.WearableExtender clearActions();
-    method public android.support.v4.app.NotificationCompat.WearableExtender clearPages();
-    method public android.support.v4.app.NotificationCompat.WearableExtender clone();
-    method public android.support.v4.app.NotificationCompat.Builder extend(android.support.v4.app.NotificationCompat.Builder);
-    method public java.util.List<android.support.v4.app.NotificationCompat.Action> getActions();
-    method public android.graphics.Bitmap getBackground();
-    method public int getContentAction();
-    method public int getContentIcon();
-    method public int getContentIconGravity();
-    method public boolean getContentIntentAvailableOffline();
-    method public int getCustomContentHeight();
-    method public int getCustomSizePreset();
-    method public android.app.PendingIntent getDisplayIntent();
-    method public int getGravity();
-    method public boolean getHintAvoidBackgroundClipping();
-    method public boolean getHintHideIcon();
-    method public int getHintScreenTimeout();
-    method public boolean getHintShowBackgroundOnly();
-    method public java.util.List<android.app.Notification> getPages();
-    method public boolean getStartScrollBottom();
-    method public android.support.v4.app.NotificationCompat.WearableExtender setBackground(android.graphics.Bitmap);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setContentAction(int);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setContentIcon(int);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setContentIconGravity(int);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setContentIntentAvailableOffline(boolean);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setCustomContentHeight(int);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setCustomSizePreset(int);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setDisplayIntent(android.app.PendingIntent);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setGravity(int);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setHintAvoidBackgroundClipping(boolean);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setHintHideIcon(boolean);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setHintScreenTimeout(int);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setHintShowBackgroundOnly(boolean);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setStartScrollBottom(boolean);
-    field public static final int SCREEN_TIMEOUT_LONG = -1; // 0xffffffff
-    field public static final int SCREEN_TIMEOUT_SHORT = 0; // 0x0
-    field public static final int SIZE_DEFAULT = 0; // 0x0
-    field public static final int SIZE_FULL_SCREEN = 5; // 0x5
-    field public static final int SIZE_LARGE = 4; // 0x4
-    field public static final int SIZE_MEDIUM = 3; // 0x3
-    field public static final int SIZE_SMALL = 2; // 0x2
-    field public static final int SIZE_XSMALL = 1; // 0x1
-    field public static final int UNSET_ACTION_INDEX = -1; // 0xffffffff
-  }
-
-  public final class NotificationCompatExtras {
-    field public static final java.lang.String EXTRA_ACTION_EXTRAS = "android.support.actionExtras";
-    field public static final java.lang.String EXTRA_GROUP_KEY = "android.support.groupKey";
-    field public static final java.lang.String EXTRA_GROUP_SUMMARY = "android.support.isGroupSummary";
-    field public static final java.lang.String EXTRA_LOCAL_ONLY = "android.support.localOnly";
-    field public static final java.lang.String EXTRA_REMOTE_INPUTS = "android.support.remoteInputs";
-    field public static final java.lang.String EXTRA_SORT_KEY = "android.support.sortKey";
-  }
-
-  public abstract class NotificationCompatSideChannelService extends android.app.Service {
-    ctor public NotificationCompatSideChannelService();
-    method public abstract void cancel(java.lang.String, int, java.lang.String);
-    method public abstract void cancelAll(java.lang.String);
-    method public abstract void notify(java.lang.String, int, java.lang.String, android.app.Notification);
-    method public android.os.IBinder onBind(android.content.Intent);
-  }
-
-  public class NotificationManagerCompat {
-    method public void cancel(int);
-    method public void cancel(java.lang.String, int);
-    method public void cancelAll();
-    method public static android.support.v4.app.NotificationManagerCompat from(android.content.Context);
-    method public static java.util.Set<java.lang.String> getEnabledListenerPackages(android.content.Context);
-    method public void notify(int, android.app.Notification);
-    method public void notify(java.lang.String, int, android.app.Notification);
-    field public static final java.lang.String ACTION_BIND_SIDE_CHANNEL = "android.support.BIND_NOTIFICATION_SIDE_CHANNEL";
-    field public static final java.lang.String EXTRA_USE_SIDE_CHANNEL = "android.support.useSideChannel";
-  }
-
-  public class RemoteInput extends android.support.v4.app.RemoteInputCompatBase.RemoteInput {
-    method public static void addResultsToIntent(android.support.v4.app.RemoteInput[], android.content.Intent, android.os.Bundle);
-    method public boolean getAllowFreeFormInput();
-    method public java.lang.CharSequence[] getChoices();
-    method public android.os.Bundle getExtras();
-    method public java.lang.CharSequence getLabel();
-    method public java.lang.String getResultKey();
-    method public static android.os.Bundle getResultsFromIntent(android.content.Intent);
-    field public static final java.lang.String EXTRA_RESULTS_DATA = "android.remoteinput.resultsData";
-    field public static final java.lang.String RESULTS_CLIP_LABEL = "android.remoteinput.results";
-  }
-
-  public static final class RemoteInput.Builder {
-    ctor public RemoteInput.Builder(java.lang.String);
-    method public android.support.v4.app.RemoteInput.Builder addExtras(android.os.Bundle);
-    method public android.support.v4.app.RemoteInput build();
-    method public android.os.Bundle getExtras();
-    method public android.support.v4.app.RemoteInput.Builder setAllowFreeFormInput(boolean);
-    method public android.support.v4.app.RemoteInput.Builder setChoices(java.lang.CharSequence[]);
-    method public android.support.v4.app.RemoteInput.Builder setLabel(java.lang.CharSequence);
-  }
-
-   class RemoteInputCompatBase {
-  }
-
-  public static abstract class RemoteInputCompatBase.RemoteInput {
-    ctor public RemoteInputCompatBase.RemoteInput();
-    method protected abstract boolean getAllowFreeFormInput();
-    method protected abstract java.lang.CharSequence[] getChoices();
-    method protected abstract android.os.Bundle getExtras();
-    method protected abstract java.lang.CharSequence getLabel();
-    method protected abstract java.lang.String getResultKey();
-  }
-
-  public class ServiceCompat {
-    field public static final int START_STICKY = 1; // 0x1
-  }
-
-  public class ShareCompat {
-    ctor public ShareCompat();
-    method public static void configureMenuItem(android.view.MenuItem, android.support.v4.app.ShareCompat.IntentBuilder);
-    method public static void configureMenuItem(android.view.Menu, int, android.support.v4.app.ShareCompat.IntentBuilder);
-    method public static android.content.ComponentName getCallingActivity(android.app.Activity);
-    method public static java.lang.String getCallingPackage(android.app.Activity);
-    field public static final java.lang.String EXTRA_CALLING_ACTIVITY = "android.support.v4.app.EXTRA_CALLING_ACTIVITY";
-    field public static final java.lang.String EXTRA_CALLING_PACKAGE = "android.support.v4.app.EXTRA_CALLING_PACKAGE";
-  }
-
-  public static class ShareCompat.IntentBuilder {
-    method public android.support.v4.app.ShareCompat.IntentBuilder addEmailBcc(java.lang.String);
-    method public android.support.v4.app.ShareCompat.IntentBuilder addEmailBcc(java.lang.String[]);
-    method public android.support.v4.app.ShareCompat.IntentBuilder addEmailCc(java.lang.String);
-    method public android.support.v4.app.ShareCompat.IntentBuilder addEmailCc(java.lang.String[]);
-    method public android.support.v4.app.ShareCompat.IntentBuilder addEmailTo(java.lang.String);
-    method public android.support.v4.app.ShareCompat.IntentBuilder addEmailTo(java.lang.String[]);
-    method public android.support.v4.app.ShareCompat.IntentBuilder addStream(android.net.Uri);
-    method public android.content.Intent createChooserIntent();
-    method public static android.support.v4.app.ShareCompat.IntentBuilder from(android.app.Activity);
-    method public android.content.Intent getIntent();
-    method public android.support.v4.app.ShareCompat.IntentBuilder setChooserTitle(java.lang.CharSequence);
-    method public android.support.v4.app.ShareCompat.IntentBuilder setChooserTitle(int);
-    method public android.support.v4.app.ShareCompat.IntentBuilder setEmailBcc(java.lang.String[]);
-    method public android.support.v4.app.ShareCompat.IntentBuilder setEmailCc(java.lang.String[]);
-    method public android.support.v4.app.ShareCompat.IntentBuilder setEmailTo(java.lang.String[]);
-    method public android.support.v4.app.ShareCompat.IntentBuilder setHtmlText(java.lang.String);
-    method public android.support.v4.app.ShareCompat.IntentBuilder setStream(android.net.Uri);
-    method public android.support.v4.app.ShareCompat.IntentBuilder setSubject(java.lang.String);
-    method public android.support.v4.app.ShareCompat.IntentBuilder setText(java.lang.CharSequence);
-    method public android.support.v4.app.ShareCompat.IntentBuilder setType(java.lang.String);
-    method public void startChooser();
-  }
-
-  public static class ShareCompat.IntentReader {
-    method public static android.support.v4.app.ShareCompat.IntentReader from(android.app.Activity);
-    method public android.content.ComponentName getCallingActivity();
-    method public android.graphics.drawable.Drawable getCallingActivityIcon();
-    method public android.graphics.drawable.Drawable getCallingApplicationIcon();
-    method public java.lang.CharSequence getCallingApplicationLabel();
-    method public java.lang.String getCallingPackage();
-    method public java.lang.String[] getEmailBcc();
-    method public java.lang.String[] getEmailCc();
-    method public java.lang.String[] getEmailTo();
-    method public java.lang.String getHtmlText();
-    method public android.net.Uri getStream();
-    method public android.net.Uri getStream(int);
-    method public int getStreamCount();
-    method public java.lang.String getSubject();
-    method public java.lang.CharSequence getText();
-    method public java.lang.String getType();
-    method public boolean isMultipleShare();
-    method public boolean isShareIntent();
-    method public boolean isSingleShare();
-  }
-
-  public abstract class SharedElementCallback {
-    ctor public SharedElementCallback();
-    method public android.os.Parcelable onCaptureSharedElementSnapshot(android.view.View, android.graphics.Matrix, android.graphics.RectF);
-    method public android.view.View onCreateSnapshotView(android.content.Context, android.os.Parcelable);
-    method public void onMapSharedElements(java.util.List<java.lang.String>, java.util.Map<java.lang.String, android.view.View>);
-    method public void onRejectSharedElements(java.util.List<android.view.View>);
-    method public void onSharedElementEnd(java.util.List<java.lang.String>, java.util.List<android.view.View>, java.util.List<android.view.View>);
-    method public void onSharedElementStart(java.util.List<java.lang.String>, java.util.List<android.view.View>, java.util.List<android.view.View>);
-  }
-
-  public class TaskStackBuilder implements java.lang.Iterable {
-    method public android.support.v4.app.TaskStackBuilder addNextIntent(android.content.Intent);
-    method public android.support.v4.app.TaskStackBuilder addNextIntentWithParentStack(android.content.Intent);
-    method public android.support.v4.app.TaskStackBuilder addParentStack(android.app.Activity);
-    method public android.support.v4.app.TaskStackBuilder addParentStack(java.lang.Class<?>);
-    method public android.support.v4.app.TaskStackBuilder addParentStack(android.content.ComponentName);
-    method public static android.support.v4.app.TaskStackBuilder create(android.content.Context);
-    method public android.content.Intent editIntentAt(int);
-    method public static deprecated android.support.v4.app.TaskStackBuilder from(android.content.Context);
-    method public deprecated android.content.Intent getIntent(int);
-    method public int getIntentCount();
-    method public android.content.Intent[] getIntents();
-    method public android.app.PendingIntent getPendingIntent(int, int);
-    method public android.app.PendingIntent getPendingIntent(int, int, android.os.Bundle);
-    method public deprecated java.util.Iterator<android.content.Intent> iterator();
-    method public void startActivities();
-    method public void startActivities(android.os.Bundle);
-  }
-
-  public static abstract interface TaskStackBuilder.SupportParentable {
-    method public abstract android.content.Intent getSupportParentActivityIntent();
-  }
-
-}
-
-package android.support.v4.content {
-
-  public abstract class AsyncTaskLoader extends android.support.v4.content.Loader {
-    ctor public AsyncTaskLoader(android.content.Context);
-    method public void cancelLoadInBackground();
-    method public boolean isLoadInBackgroundCanceled();
-    method public abstract D loadInBackground();
-    method public void onCanceled(D);
-    method protected D onLoadInBackground();
-    method public void setUpdateThrottle(long);
-  }
-
-  public class ContentResolverCompat {
-    method public static android.database.Cursor query(android.content.ContentResolver, android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, android.support.v4.os.CancellationSignal);
-  }
-
-  public class ContextCompat {
-    ctor public ContextCompat();
-    method public static int checkSelfPermission(android.content.Context, java.lang.String);
-    method public final java.io.File getCodeCacheDir(android.content.Context);
-    method public static final int getColor(android.content.Context, int);
-    method public static final android.content.res.ColorStateList getColorStateList(android.content.Context, int);
-    method public static final android.graphics.drawable.Drawable getDrawable(android.content.Context, int);
-    method public static java.io.File[] getExternalCacheDirs(android.content.Context);
-    method public static java.io.File[] getExternalFilesDirs(android.content.Context, java.lang.String);
-    method public final java.io.File getNoBackupFilesDir(android.content.Context);
-    method public static java.io.File[] getObbDirs(android.content.Context);
-    method public static boolean startActivities(android.content.Context, android.content.Intent[]);
-    method public static boolean startActivities(android.content.Context, android.content.Intent[], android.os.Bundle);
-  }
-
-  public class CursorLoader extends android.support.v4.content.AsyncTaskLoader {
-    ctor public CursorLoader(android.content.Context);
-    ctor public CursorLoader(android.content.Context, android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String);
-    method public void deliverResult(android.database.Cursor);
-    method public java.lang.String[] getProjection();
-    method public java.lang.String getSelection();
-    method public java.lang.String[] getSelectionArgs();
-    method public java.lang.String getSortOrder();
-    method public android.net.Uri getUri();
-    method public android.database.Cursor loadInBackground();
-    method public void onCanceled(android.database.Cursor);
-    method public void setProjection(java.lang.String[]);
-    method public void setSelection(java.lang.String);
-    method public void setSelectionArgs(java.lang.String[]);
-    method public void setSortOrder(java.lang.String);
-    method public void setUri(android.net.Uri);
-  }
-
-  public class FileProvider extends android.content.ContentProvider {
-    ctor public FileProvider();
-    method public int delete(android.net.Uri, java.lang.String, java.lang.String[]);
-    method public java.lang.String getType(android.net.Uri);
-    method public static android.net.Uri getUriForFile(android.content.Context, java.lang.String, java.io.File);
-    method public android.net.Uri insert(android.net.Uri, android.content.ContentValues);
-    method public boolean onCreate();
-    method public android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String);
-    method public int update(android.net.Uri, android.content.ContentValues, java.lang.String, java.lang.String[]);
-  }
-
-  public class IntentCompat {
-    method public static android.content.Intent makeMainActivity(android.content.ComponentName);
-    method public static android.content.Intent makeMainSelectorActivity(java.lang.String, java.lang.String);
-    method public static android.content.Intent makeRestartActivityTask(android.content.ComponentName);
-    field public static final java.lang.String ACTION_EXTERNAL_APPLICATIONS_AVAILABLE = "android.intent.action.EXTERNAL_APPLICATIONS_AVAILABLE";
-    field public static final java.lang.String ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE = "android.intent.action.EXTERNAL_APPLICATIONS_UNAVAILABLE";
-    field public static final java.lang.String EXTRA_CHANGED_PACKAGE_LIST = "android.intent.extra.changed_package_list";
-    field public static final java.lang.String EXTRA_CHANGED_UID_LIST = "android.intent.extra.changed_uid_list";
-    field public static final java.lang.String EXTRA_HTML_TEXT = "android.intent.extra.HTML_TEXT";
-    field public static final int FLAG_ACTIVITY_CLEAR_TASK = 32768; // 0x8000
-    field public static final int FLAG_ACTIVITY_TASK_ON_HOME = 16384; // 0x4000
-  }
-
-  public class Loader {
-    ctor public Loader(android.content.Context);
-    method public void abandon();
-    method public boolean cancelLoad();
-    method public void commitContentChanged();
-    method public java.lang.String dataToString(D);
-    method public void deliverCancellation();
-    method public void deliverResult(D);
-    method public void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
-    method public void forceLoad();
-    method public android.content.Context getContext();
-    method public int getId();
-    method public boolean isAbandoned();
-    method public boolean isReset();
-    method public boolean isStarted();
-    method protected void onAbandon();
-    method protected boolean onCancelLoad();
-    method public void onContentChanged();
-    method protected void onForceLoad();
-    method protected void onReset();
-    method protected void onStartLoading();
-    method protected void onStopLoading();
-    method public void registerListener(int, android.support.v4.content.Loader.OnLoadCompleteListener<D>);
-    method public void registerOnLoadCanceledListener(android.support.v4.content.Loader.OnLoadCanceledListener<D>);
-    method public void reset();
-    method public void rollbackContentChanged();
-    method public final void startLoading();
-    method public void stopLoading();
-    method public boolean takeContentChanged();
-    method public void unregisterListener(android.support.v4.content.Loader.OnLoadCompleteListener<D>);
-    method public void unregisterOnLoadCanceledListener(android.support.v4.content.Loader.OnLoadCanceledListener<D>);
-  }
-
-  public final class Loader.ForceLoadContentObserver extends android.database.ContentObserver {
-    ctor public Loader.ForceLoadContentObserver();
-  }
-
-  public static abstract interface Loader.OnLoadCanceledListener {
-    method public abstract void onLoadCanceled(android.support.v4.content.Loader<D>);
-  }
-
-  public static abstract interface Loader.OnLoadCompleteListener {
-    method public abstract void onLoadComplete(android.support.v4.content.Loader<D>, D);
-  }
-
-  public class LocalBroadcastManager {
-    method public static android.support.v4.content.LocalBroadcastManager getInstance(android.content.Context);
-    method public void registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter);
-    method public boolean sendBroadcast(android.content.Intent);
-    method public void sendBroadcastSync(android.content.Intent);
-    method public void unregisterReceiver(android.content.BroadcastReceiver);
-  }
-
-  public class ParallelExecutorCompat {
-    ctor public ParallelExecutorCompat();
-    method public static java.util.concurrent.Executor getParallelExecutor();
-  }
-
-  public final class PermissionChecker {
-    method public static int checkCallingOrSelfPermission(android.content.Context, java.lang.String);
-    method public static int checkCallingPermission(android.content.Context, java.lang.String, java.lang.String);
-    method public static int checkPermission(android.content.Context, java.lang.String, int, int, java.lang.String);
-    method public static int checkSelfPermission(android.content.Context, java.lang.String);
-    field public static final int PERMISSION_DENIED = -1; // 0xffffffff
-    field public static final int PERMISSION_DENIED_APP_OP = -2; // 0xfffffffe
-    field public static final int PERMISSION_GRANTED = 0; // 0x0
-  }
-
-  public static abstract class PermissionChecker.PermissionResult implements java.lang.annotation.Annotation {
-  }
-
-  public class SharedPreferencesCompat {
-    ctor public SharedPreferencesCompat();
-  }
-
-  public static class SharedPreferencesCompat.EditorCompat {
-    method public void apply(android.content.SharedPreferences.Editor);
-    method public static android.support.v4.content.SharedPreferencesCompat.EditorCompat getInstance();
-  }
-
-  public abstract class WakefulBroadcastReceiver extends android.content.BroadcastReceiver {
-    ctor public WakefulBroadcastReceiver();
-    method public static boolean completeWakefulIntent(android.content.Intent);
-    method public static android.content.ComponentName startWakefulService(android.content.Context, android.content.Intent);
-  }
-
-}
-
-package android.support.v4.content.pm {
-
-  public class ActivityInfoCompat {
-    field public static final int CONFIG_UI_MODE = 512; // 0x200
-  }
-
-}
-
-package android.support.v4.content.res {
-
-  public class ResourcesCompat {
-    ctor public ResourcesCompat();
-    method public int getColor(android.content.res.Resources, int, android.content.res.Resources.Theme) throws android.content.res.Resources.NotFoundException;
-    method public android.content.res.ColorStateList getColorStateList(android.content.res.Resources, int, android.content.res.Resources.Theme) throws android.content.res.Resources.NotFoundException;
-    method public static android.graphics.drawable.Drawable getDrawable(android.content.res.Resources, int, android.content.res.Resources.Theme) throws android.content.res.Resources.NotFoundException;
-    method public static android.graphics.drawable.Drawable getDrawableForDensity(android.content.res.Resources, int, int, android.content.res.Resources.Theme) throws android.content.res.Resources.NotFoundException;
-  }
-
-}
-
-package android.support.v4.database {
-
-  public class DatabaseUtilsCompat {
-    method public static java.lang.String[] appendSelectionArgs(java.lang.String[], java.lang.String[]);
-    method public static java.lang.String concatenateWhere(java.lang.String, java.lang.String);
-  }
-
-}
-
-package android.support.v4.graphics {
-
-  public class BitmapCompat {
-    ctor public BitmapCompat();
-    method public static int getAllocationByteCount(android.graphics.Bitmap);
-    method public static boolean hasMipMap(android.graphics.Bitmap);
-    method public static void setHasMipMap(android.graphics.Bitmap, boolean);
-  }
-
-  public class ColorUtils {
-    method public static int HSLToColor(float[]);
-    method public static void RGBToHSL(int, int, int, float[]);
-    method public static double calculateContrast(int, int);
-    method public static double calculateLuminance(int);
-    method public static int calculateMinimumAlpha(int, int, float);
-    method public static void colorToHSL(int, float[]);
-    method public static int compositeColors(int, int);
-    method public static int setAlphaComponent(int, int);
-  }
-
-}
-
-package android.support.v4.graphics.drawable {
-
-  public class DrawableCompat {
-    ctor public DrawableCompat();
-    method public static int getLayoutDirection(android.graphics.drawable.Drawable);
-    method public static boolean isAutoMirrored(android.graphics.drawable.Drawable);
-    method public static void jumpToCurrentState(android.graphics.drawable.Drawable);
-    method public static void setAutoMirrored(android.graphics.drawable.Drawable, boolean);
-    method public static void setHotspot(android.graphics.drawable.Drawable, float, float);
-    method public static void setHotspotBounds(android.graphics.drawable.Drawable, int, int, int, int);
-    method public static void setLayoutDirection(android.graphics.drawable.Drawable, int);
-    method public static void setTint(android.graphics.drawable.Drawable, int);
-    method public static void setTintList(android.graphics.drawable.Drawable, android.content.res.ColorStateList);
-    method public static void setTintMode(android.graphics.drawable.Drawable, android.graphics.PorterDuff.Mode);
-    method public static T unwrap(android.graphics.drawable.Drawable);
-    method public static android.graphics.drawable.Drawable wrap(android.graphics.drawable.Drawable);
-  }
-
-  public abstract class RoundedBitmapDrawable extends android.graphics.drawable.Drawable {
-    method public void draw(android.graphics.Canvas);
-    method public final android.graphics.Bitmap getBitmap();
-    method public float getCornerRadius();
-    method public int getGravity();
-    method public int getOpacity();
-    method public final android.graphics.Paint getPaint();
-    method public boolean hasAntiAlias();
-    method public boolean hasMipMap();
-    method public boolean isCircular();
-    method public void setAlpha(int);
-    method public void setAntiAlias(boolean);
-    method public void setCircular(boolean);
-    method public void setColorFilter(android.graphics.ColorFilter);
-    method public void setCornerRadius(float);
-    method public void setGravity(int);
-    method public void setMipMap(boolean);
-    method public void setTargetDensity(android.graphics.Canvas);
-    method public void setTargetDensity(android.util.DisplayMetrics);
-    method public void setTargetDensity(int);
-  }
-
-  public class RoundedBitmapDrawableFactory {
-    ctor public RoundedBitmapDrawableFactory();
-    method public static android.support.v4.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, android.graphics.Bitmap);
-    method public static android.support.v4.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, java.lang.String);
-    method public static android.support.v4.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, java.io.InputStream);
-  }
-
-}
-
-package android.support.v4.hardware.display {
-
-  public abstract class DisplayManagerCompat {
-    method public abstract android.view.Display getDisplay(int);
-    method public abstract android.view.Display[] getDisplays();
-    method public abstract android.view.Display[] getDisplays(java.lang.String);
-    method public static android.support.v4.hardware.display.DisplayManagerCompat getInstance(android.content.Context);
-    field public static final java.lang.String DISPLAY_CATEGORY_PRESENTATION = "android.hardware.display.category.PRESENTATION";
-  }
-
-}
-
-package android.support.v4.hardware.fingerprint {
-
-  public class FingerprintManagerCompat {
-    method public void authenticate(android.support.v4.hardware.fingerprint.FingerprintManagerCompat.CryptoObject, int, android.support.v4.os.CancellationSignal, android.support.v4.hardware.fingerprint.FingerprintManagerCompat.AuthenticationCallback, android.os.Handler);
-    method public static android.support.v4.hardware.fingerprint.FingerprintManagerCompat from(android.content.Context);
-    method public boolean hasEnrolledFingerprints();
-    method public boolean isHardwareDetected();
-  }
-
-  public static abstract class FingerprintManagerCompat.AuthenticationCallback {
-    ctor public FingerprintManagerCompat.AuthenticationCallback();
-    method public void onAuthenticationError(int, java.lang.CharSequence);
-    method public void onAuthenticationFailed();
-    method public void onAuthenticationHelp(int, java.lang.CharSequence);
-    method public void onAuthenticationSucceeded(android.support.v4.hardware.fingerprint.FingerprintManagerCompat.AuthenticationResult);
-  }
-
-  public static final class FingerprintManagerCompat.AuthenticationResult {
-    ctor public FingerprintManagerCompat.AuthenticationResult(android.support.v4.hardware.fingerprint.FingerprintManagerCompat.CryptoObject);
-    method public android.support.v4.hardware.fingerprint.FingerprintManagerCompat.CryptoObject getCryptoObject();
-  }
-
-  public static class FingerprintManagerCompat.CryptoObject {
-    ctor public FingerprintManagerCompat.CryptoObject(java.security.Signature);
-    ctor public FingerprintManagerCompat.CryptoObject(javax.crypto.Cipher);
-    ctor public FingerprintManagerCompat.CryptoObject(javax.crypto.Mac);
-    method public javax.crypto.Cipher getCipher();
-    method public javax.crypto.Mac getMac();
-    method public java.security.Signature getSignature();
-  }
-
-}
-
-package android.support.v4.media {
-
-  public final class MediaDescriptionCompat implements android.os.Parcelable {
-    method public int describeContents();
-    method public static android.support.v4.media.MediaDescriptionCompat fromMediaDescription(java.lang.Object);
-    method public java.lang.CharSequence getDescription();
-    method public android.os.Bundle getExtras();
-    method public android.graphics.Bitmap getIconBitmap();
-    method public android.net.Uri getIconUri();
-    method public java.lang.Object getMediaDescription();
-    method public java.lang.String getMediaId();
-    method public android.net.Uri getMediaUri();
-    method public java.lang.CharSequence getSubtitle();
-    method public java.lang.CharSequence getTitle();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.support.v4.media.MediaDescriptionCompat> CREATOR;
-  }
-
-  public static final class MediaDescriptionCompat.Builder {
-    ctor public MediaDescriptionCompat.Builder();
-    method public android.support.v4.media.MediaDescriptionCompat build();
-    method public android.support.v4.media.MediaDescriptionCompat.Builder setDescription(java.lang.CharSequence);
-    method public android.support.v4.media.MediaDescriptionCompat.Builder setExtras(android.os.Bundle);
-    method public android.support.v4.media.MediaDescriptionCompat.Builder setIconBitmap(android.graphics.Bitmap);
-    method public android.support.v4.media.MediaDescriptionCompat.Builder setIconUri(android.net.Uri);
-    method public android.support.v4.media.MediaDescriptionCompat.Builder setMediaId(java.lang.String);
-    method public android.support.v4.media.MediaDescriptionCompat.Builder setMediaUri(android.net.Uri);
-    method public android.support.v4.media.MediaDescriptionCompat.Builder setSubtitle(java.lang.CharSequence);
-    method public android.support.v4.media.MediaDescriptionCompat.Builder setTitle(java.lang.CharSequence);
-  }
-
-  public final class MediaMetadataCompat implements android.os.Parcelable {
-    method public boolean containsKey(java.lang.String);
-    method public int describeContents();
-    method public static android.support.v4.media.MediaMetadataCompat fromMediaMetadata(java.lang.Object);
-    method public android.graphics.Bitmap getBitmap(java.lang.String);
-    method public android.os.Bundle getBundle();
-    method public android.support.v4.media.MediaDescriptionCompat getDescription();
-    method public long getLong(java.lang.String);
-    method public java.lang.Object getMediaMetadata();
-    method public android.support.v4.media.RatingCompat getRating(java.lang.String);
-    method public java.lang.String getString(java.lang.String);
-    method public java.lang.CharSequence getText(java.lang.String);
-    method public java.util.Set<java.lang.String> keySet();
-    method public int size();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.support.v4.media.MediaMetadataCompat> CREATOR;
-    field public static final java.lang.String METADATA_KEY_ALBUM = "android.media.metadata.ALBUM";
-    field public static final java.lang.String METADATA_KEY_ALBUM_ART = "android.media.metadata.ALBUM_ART";
-    field public static final java.lang.String METADATA_KEY_ALBUM_ARTIST = "android.media.metadata.ALBUM_ARTIST";
-    field public static final java.lang.String METADATA_KEY_ALBUM_ART_URI = "android.media.metadata.ALBUM_ART_URI";
-    field public static final java.lang.String METADATA_KEY_ART = "android.media.metadata.ART";
-    field public static final java.lang.String METADATA_KEY_ARTIST = "android.media.metadata.ARTIST";
-    field public static final java.lang.String METADATA_KEY_ART_URI = "android.media.metadata.ART_URI";
-    field public static final java.lang.String METADATA_KEY_AUTHOR = "android.media.metadata.AUTHOR";
-    field public static final java.lang.String METADATA_KEY_COMPILATION = "android.media.metadata.COMPILATION";
-    field public static final java.lang.String METADATA_KEY_COMPOSER = "android.media.metadata.COMPOSER";
-    field public static final java.lang.String METADATA_KEY_DATE = "android.media.metadata.DATE";
-    field public static final java.lang.String METADATA_KEY_DISC_NUMBER = "android.media.metadata.DISC_NUMBER";
-    field public static final java.lang.String METADATA_KEY_DISPLAY_DESCRIPTION = "android.media.metadata.DISPLAY_DESCRIPTION";
-    field public static final java.lang.String METADATA_KEY_DISPLAY_ICON = "android.media.metadata.DISPLAY_ICON";
-    field public static final java.lang.String METADATA_KEY_DISPLAY_ICON_URI = "android.media.metadata.DISPLAY_ICON_URI";
-    field public static final java.lang.String METADATA_KEY_DISPLAY_SUBTITLE = "android.media.metadata.DISPLAY_SUBTITLE";
-    field public static final java.lang.String METADATA_KEY_DISPLAY_TITLE = "android.media.metadata.DISPLAY_TITLE";
-    field public static final java.lang.String METADATA_KEY_DURATION = "android.media.metadata.DURATION";
-    field public static final java.lang.String METADATA_KEY_GENRE = "android.media.metadata.GENRE";
-    field public static final java.lang.String METADATA_KEY_MEDIA_ID = "android.media.metadata.MEDIA_ID";
-    field public static final java.lang.String METADATA_KEY_NUM_TRACKS = "android.media.metadata.NUM_TRACKS";
-    field public static final java.lang.String METADATA_KEY_RATING = "android.media.metadata.RATING";
-    field public static final java.lang.String METADATA_KEY_TITLE = "android.media.metadata.TITLE";
-    field public static final java.lang.String METADATA_KEY_TRACK_NUMBER = "android.media.metadata.TRACK_NUMBER";
-    field public static final java.lang.String METADATA_KEY_USER_RATING = "android.media.metadata.USER_RATING";
-    field public static final java.lang.String METADATA_KEY_WRITER = "android.media.metadata.WRITER";
-    field public static final java.lang.String METADATA_KEY_YEAR = "android.media.metadata.YEAR";
-  }
-
-  public static final class MediaMetadataCompat.Builder {
-    ctor public MediaMetadataCompat.Builder();
-    ctor public MediaMetadataCompat.Builder(android.support.v4.media.MediaMetadataCompat);
-    method public android.support.v4.media.MediaMetadataCompat build();
-    method public android.support.v4.media.MediaMetadataCompat.Builder putBitmap(java.lang.String, android.graphics.Bitmap);
-    method public android.support.v4.media.MediaMetadataCompat.Builder putLong(java.lang.String, long);
-    method public android.support.v4.media.MediaMetadataCompat.Builder putRating(java.lang.String, android.support.v4.media.RatingCompat);
-    method public android.support.v4.media.MediaMetadataCompat.Builder putString(java.lang.String, java.lang.String);
-    method public android.support.v4.media.MediaMetadataCompat.Builder putText(java.lang.String, java.lang.CharSequence);
-  }
-
-  public final class RatingCompat implements android.os.Parcelable {
-    method public int describeContents();
-    method public static android.support.v4.media.RatingCompat fromRating(java.lang.Object);
-    method public float getPercentRating();
-    method public java.lang.Object getRating();
-    method public int getRatingStyle();
-    method public float getStarRating();
-    method public boolean hasHeart();
-    method public boolean isRated();
-    method public boolean isThumbUp();
-    method public static android.support.v4.media.RatingCompat newHeartRating(boolean);
-    method public static android.support.v4.media.RatingCompat newPercentageRating(float);
-    method public static android.support.v4.media.RatingCompat newStarRating(int, float);
-    method public static android.support.v4.media.RatingCompat newThumbRating(boolean);
-    method public static android.support.v4.media.RatingCompat newUnratedRating(int);
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.support.v4.media.RatingCompat> CREATOR;
-    field public static final int RATING_3_STARS = 3; // 0x3
-    field public static final int RATING_4_STARS = 4; // 0x4
-    field public static final int RATING_5_STARS = 5; // 0x5
-    field public static final int RATING_HEART = 1; // 0x1
-    field public static final int RATING_NONE = 0; // 0x0
-    field public static final int RATING_PERCENTAGE = 6; // 0x6
-    field public static final int RATING_THUMB_UP_DOWN = 2; // 0x2
-  }
-
-  public abstract class TransportController {
-    ctor public TransportController();
-    method public abstract int getBufferPercentage();
-    method public abstract long getCurrentPosition();
-    method public abstract long getDuration();
-    method public abstract int getTransportControlFlags();
-    method public abstract boolean isPlaying();
-    method public abstract void pausePlaying();
-    method public abstract void registerStateListener(android.support.v4.media.TransportStateListener);
-    method public abstract void seekTo(long);
-    method public abstract void startPlaying();
-    method public abstract void stopPlaying();
-    method public abstract void unregisterStateListener(android.support.v4.media.TransportStateListener);
-  }
-
-  public class TransportMediator extends android.support.v4.media.TransportController {
-    ctor public TransportMediator(android.app.Activity, android.support.v4.media.TransportPerformer);
-    ctor public TransportMediator(android.view.View, android.support.v4.media.TransportPerformer);
-    method public void destroy();
-    method public boolean dispatchKeyEvent(android.view.KeyEvent);
-    method public int getBufferPercentage();
-    method public long getCurrentPosition();
-    method public long getDuration();
-    method public java.lang.Object getRemoteControlClient();
-    method public int getTransportControlFlags();
-    method public boolean isPlaying();
-    method public void pausePlaying();
-    method public void refreshState();
-    method public void registerStateListener(android.support.v4.media.TransportStateListener);
-    method public void seekTo(long);
-    method public void startPlaying();
-    method public void stopPlaying();
-    method public void unregisterStateListener(android.support.v4.media.TransportStateListener);
-    field public static final int FLAG_KEY_MEDIA_FAST_FORWARD = 64; // 0x40
-    field public static final int FLAG_KEY_MEDIA_NEXT = 128; // 0x80
-    field public static final int FLAG_KEY_MEDIA_PAUSE = 16; // 0x10
-    field public static final int FLAG_KEY_MEDIA_PLAY = 4; // 0x4
-    field public static final int FLAG_KEY_MEDIA_PLAY_PAUSE = 8; // 0x8
-    field public static final int FLAG_KEY_MEDIA_PREVIOUS = 1; // 0x1
-    field public static final int FLAG_KEY_MEDIA_REWIND = 2; // 0x2
-    field public static final int FLAG_KEY_MEDIA_STOP = 32; // 0x20
-    field public static final int KEYCODE_MEDIA_PAUSE = 127; // 0x7f
-    field public static final int KEYCODE_MEDIA_PLAY = 126; // 0x7e
-    field public static final int KEYCODE_MEDIA_RECORD = 130; // 0x82
-  }
-
-  public abstract class TransportPerformer {
-    ctor public TransportPerformer();
-    method public void onAudioFocusChange(int);
-    method public int onGetBufferPercentage();
-    method public abstract long onGetCurrentPosition();
-    method public abstract long onGetDuration();
-    method public int onGetTransportControlFlags();
-    method public abstract boolean onIsPlaying();
-    method public boolean onMediaButtonDown(int, android.view.KeyEvent);
-    method public boolean onMediaButtonUp(int, android.view.KeyEvent);
-    method public abstract void onPause();
-    method public abstract void onSeekTo(long);
-    method public abstract void onStart();
-    method public abstract void onStop();
-  }
-
-  public class TransportStateListener {
-    ctor public TransportStateListener();
-    method public void onPlayingChanged(android.support.v4.media.TransportController);
-    method public void onTransportControlsChanged(android.support.v4.media.TransportController);
-  }
-
-  public abstract class VolumeProviderCompat {
-    ctor public VolumeProviderCompat(int, int, int);
-    method public final int getCurrentVolume();
-    method public final int getMaxVolume();
-    method public final int getVolumeControl();
-    method public java.lang.Object getVolumeProvider();
-    method public void onAdjustVolume(int);
-    method public void onSetVolumeTo(int);
-    method public void setCallback(android.support.v4.media.VolumeProviderCompat.Callback);
-    method public final void setCurrentVolume(int);
-    field public static final int VOLUME_CONTROL_ABSOLUTE = 2; // 0x2
-    field public static final int VOLUME_CONTROL_FIXED = 0; // 0x0
-    field public static final int VOLUME_CONTROL_RELATIVE = 1; // 0x1
-  }
-
-  public static abstract class VolumeProviderCompat.Callback {
-    ctor public VolumeProviderCompat.Callback();
-    method public abstract void onVolumeChanged(android.support.v4.media.VolumeProviderCompat);
-  }
-
-}
-
-package android.support.v4.media.session {
-
-  public class MediaButtonReceiver extends android.content.BroadcastReceiver {
-    ctor public MediaButtonReceiver();
-    method public static android.view.KeyEvent handleIntent(android.support.v4.media.session.MediaSessionCompat, android.content.Intent);
-    method public void onReceive(android.content.Context, android.content.Intent);
-  }
-
-  public final class MediaControllerCompat {
-    ctor public MediaControllerCompat(android.content.Context, android.support.v4.media.session.MediaSessionCompat);
-    ctor public MediaControllerCompat(android.content.Context, android.support.v4.media.session.MediaSessionCompat.Token) throws android.os.RemoteException;
-    method public void adjustVolume(int, int);
-    method public boolean dispatchMediaButtonEvent(android.view.KeyEvent);
-    method public android.os.Bundle getExtras();
-    method public long getFlags();
-    method public java.lang.Object getMediaController();
-    method public android.support.v4.media.MediaMetadataCompat getMetadata();
-    method public java.lang.String getPackageName();
-    method public android.support.v4.media.session.MediaControllerCompat.PlaybackInfo getPlaybackInfo();
-    method public android.support.v4.media.session.PlaybackStateCompat getPlaybackState();
-    method public java.util.List<android.support.v4.media.session.MediaSessionCompat.QueueItem> getQueue();
-    method public java.lang.CharSequence getQueueTitle();
-    method public int getRatingType();
-    method public android.app.PendingIntent getSessionActivity();
-    method public android.support.v4.media.session.MediaSessionCompat.Token getSessionToken();
-    method public android.support.v4.media.session.MediaControllerCompat.TransportControls getTransportControls();
-    method public void registerCallback(android.support.v4.media.session.MediaControllerCompat.Callback);
-    method public void registerCallback(android.support.v4.media.session.MediaControllerCompat.Callback, android.os.Handler);
-    method public void sendCommand(java.lang.String, android.os.Bundle, android.os.ResultReceiver);
-    method public void setVolumeTo(int, int);
-    method public void unregisterCallback(android.support.v4.media.session.MediaControllerCompat.Callback);
-  }
-
-  public static abstract class MediaControllerCompat.Callback implements android.os.IBinder.DeathRecipient {
-    ctor public MediaControllerCompat.Callback();
-    method public void binderDied();
-    method public void onAudioInfoChanged(android.support.v4.media.session.MediaControllerCompat.PlaybackInfo);
-    method public void onExtrasChanged(android.os.Bundle);
-    method public void onMetadataChanged(android.support.v4.media.MediaMetadataCompat);
-    method public void onPlaybackStateChanged(android.support.v4.media.session.PlaybackStateCompat);
-    method public void onQueueChanged(java.util.List<android.support.v4.media.session.MediaSessionCompat.QueueItem>);
-    method public void onQueueTitleChanged(java.lang.CharSequence);
-    method public void onSessionDestroyed();
-    method public void onSessionEvent(java.lang.String, android.os.Bundle);
-  }
-
-  public static final class MediaControllerCompat.PlaybackInfo {
-    method public int getAudioStream();
-    method public int getCurrentVolume();
-    method public int getMaxVolume();
-    method public int getPlaybackType();
-    method public int getVolumeControl();
-    field public static final int PLAYBACK_TYPE_LOCAL = 1; // 0x1
-    field public static final int PLAYBACK_TYPE_REMOTE = 2; // 0x2
-  }
-
-  public static abstract class MediaControllerCompat.TransportControls {
-    method public abstract void fastForward();
-    method public abstract void pause();
-    method public abstract void play();
-    method public abstract void playFromMediaId(java.lang.String, android.os.Bundle);
-    method public abstract void playFromSearch(java.lang.String, android.os.Bundle);
-    method public abstract void playFromUri(android.net.Uri, android.os.Bundle);
-    method public abstract void rewind();
-    method public abstract void seekTo(long);
-    method public abstract void sendCustomAction(android.support.v4.media.session.PlaybackStateCompat.CustomAction, android.os.Bundle);
-    method public abstract void sendCustomAction(java.lang.String, android.os.Bundle);
-    method public abstract void setRating(android.support.v4.media.RatingCompat);
-    method public abstract void skipToNext();
-    method public abstract void skipToPrevious();
-    method public abstract void skipToQueueItem(long);
-    method public abstract void stop();
-  }
-
-  public class MediaSessionCompat {
-    ctor public MediaSessionCompat(android.content.Context, java.lang.String);
-    ctor public MediaSessionCompat(android.content.Context, java.lang.String, android.content.ComponentName, android.app.PendingIntent);
-    method public void addOnActiveChangeListener(android.support.v4.media.session.MediaSessionCompat.OnActiveChangeListener);
-    method public android.support.v4.media.session.MediaControllerCompat getController();
-    method public java.lang.Object getMediaSession();
-    method public java.lang.Object getRemoteControlClient();
-    method public android.support.v4.media.session.MediaSessionCompat.Token getSessionToken();
-    method public boolean isActive();
-    method public static android.support.v4.media.session.MediaSessionCompat obtain(android.content.Context, java.lang.Object);
-    method public void release();
-    method public void removeOnActiveChangeListener(android.support.v4.media.session.MediaSessionCompat.OnActiveChangeListener);
-    method public void sendSessionEvent(java.lang.String, android.os.Bundle);
-    method public void setActive(boolean);
-    method public void setCallback(android.support.v4.media.session.MediaSessionCompat.Callback);
-    method public void setCallback(android.support.v4.media.session.MediaSessionCompat.Callback, android.os.Handler);
-    method public void setExtras(android.os.Bundle);
-    method public void setFlags(int);
-    method public void setMediaButtonReceiver(android.app.PendingIntent);
-    method public void setMetadata(android.support.v4.media.MediaMetadataCompat);
-    method public void setPlaybackState(android.support.v4.media.session.PlaybackStateCompat);
-    method public void setPlaybackToLocal(int);
-    method public void setPlaybackToRemote(android.support.v4.media.VolumeProviderCompat);
-    method public void setQueue(java.util.List<android.support.v4.media.session.MediaSessionCompat.QueueItem>);
-    method public void setQueueTitle(java.lang.CharSequence);
-    method public void setRatingType(int);
-    method public void setSessionActivity(android.app.PendingIntent);
-    field public static final int FLAG_HANDLES_MEDIA_BUTTONS = 1; // 0x1
-    field public static final int FLAG_HANDLES_TRANSPORT_CONTROLS = 2; // 0x2
-  }
-
-  public static abstract class MediaSessionCompat.Callback {
-    ctor public MediaSessionCompat.Callback();
-    method public void onCommand(java.lang.String, android.os.Bundle, android.os.ResultReceiver);
-    method public void onCustomAction(java.lang.String, android.os.Bundle);
-    method public void onFastForward();
-    method public boolean onMediaButtonEvent(android.content.Intent);
-    method public void onPause();
-    method public void onPlay();
-    method public void onPlayFromMediaId(java.lang.String, android.os.Bundle);
-    method public void onPlayFromSearch(java.lang.String, android.os.Bundle);
-    method public void onPlayFromUri(android.net.Uri, android.os.Bundle);
-    method public void onRewind();
-    method public void onSeekTo(long);
-    method public void onSetRating(android.support.v4.media.RatingCompat);
-    method public void onSkipToNext();
-    method public void onSkipToPrevious();
-    method public void onSkipToQueueItem(long);
-    method public void onStop();
-  }
-
-  public static abstract interface MediaSessionCompat.OnActiveChangeListener {
-    method public abstract void onActiveChanged();
-  }
-
-  public static final class MediaSessionCompat.QueueItem implements android.os.Parcelable {
-    ctor public MediaSessionCompat.QueueItem(android.support.v4.media.MediaDescriptionCompat, long);
-    method public int describeContents();
-    method public android.support.v4.media.MediaDescriptionCompat getDescription();
-    method public long getQueueId();
-    method public java.lang.Object getQueueItem();
-    method public static android.support.v4.media.session.MediaSessionCompat.QueueItem obtain(java.lang.Object);
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.support.v4.media.session.MediaSessionCompat.QueueItem> CREATOR;
-    field public static final int UNKNOWN_ID = -1; // 0xffffffff
-  }
-
-  public static final class MediaSessionCompat.Token implements android.os.Parcelable {
-    method public int describeContents();
-    method public static android.support.v4.media.session.MediaSessionCompat.Token fromToken(java.lang.Object);
-    method public java.lang.Object getToken();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.support.v4.media.session.MediaSessionCompat.Token> CREATOR;
-  }
-
-  public class ParcelableVolumeInfo implements android.os.Parcelable {
-    ctor public ParcelableVolumeInfo(int, int, int, int, int);
-    ctor public ParcelableVolumeInfo(android.os.Parcel);
-    method public int describeContents();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.support.v4.media.session.ParcelableVolumeInfo> CREATOR;
-    field public int audioStream;
-    field public int controlType;
-    field public int currentVolume;
-    field public int maxVolume;
-    field public int volumeType;
-  }
-
-  public final class PlaybackStateCompat implements android.os.Parcelable {
-    method public int describeContents();
-    method public static android.support.v4.media.session.PlaybackStateCompat fromPlaybackState(java.lang.Object);
-    method public long getActions();
-    method public long getActiveQueueItemId();
-    method public long getBufferedPosition();
-    method public java.util.List<android.support.v4.media.session.PlaybackStateCompat.CustomAction> getCustomActions();
-    method public java.lang.CharSequence getErrorMessage();
-    method public android.os.Bundle getExtras();
-    method public long getLastPositionUpdateTime();
-    method public float getPlaybackSpeed();
-    method public java.lang.Object getPlaybackState();
-    method public long getPosition();
-    method public int getState();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final long ACTION_FAST_FORWARD = 64L; // 0x40L
-    field public static final long ACTION_PAUSE = 2L; // 0x2L
-    field public static final long ACTION_PLAY = 4L; // 0x4L
-    field public static final long ACTION_PLAY_FROM_MEDIA_ID = 1024L; // 0x400L
-    field public static final long ACTION_PLAY_FROM_SEARCH = 2048L; // 0x800L
-    field public static final long ACTION_PLAY_FROM_URI = 8192L; // 0x2000L
-    field public static final long ACTION_PLAY_PAUSE = 512L; // 0x200L
-    field public static final long ACTION_REWIND = 8L; // 0x8L
-    field public static final long ACTION_SEEK_TO = 256L; // 0x100L
-    field public static final long ACTION_SET_RATING = 128L; // 0x80L
-    field public static final long ACTION_SKIP_TO_NEXT = 32L; // 0x20L
-    field public static final long ACTION_SKIP_TO_PREVIOUS = 16L; // 0x10L
-    field public static final long ACTION_SKIP_TO_QUEUE_ITEM = 4096L; // 0x1000L
-    field public static final long ACTION_STOP = 1L; // 0x1L
-    field public static final android.os.Parcelable.Creator<android.support.v4.media.session.PlaybackStateCompat> CREATOR;
-    field public static final long PLAYBACK_POSITION_UNKNOWN = -1L; // 0xffffffffffffffffL
-    field public static final int STATE_BUFFERING = 6; // 0x6
-    field public static final int STATE_CONNECTING = 8; // 0x8
-    field public static final int STATE_ERROR = 7; // 0x7
-    field public static final int STATE_FAST_FORWARDING = 4; // 0x4
-    field public static final int STATE_NONE = 0; // 0x0
-    field public static final int STATE_PAUSED = 2; // 0x2
-    field public static final int STATE_PLAYING = 3; // 0x3
-    field public static final int STATE_REWINDING = 5; // 0x5
-    field public static final int STATE_SKIPPING_TO_NEXT = 10; // 0xa
-    field public static final int STATE_SKIPPING_TO_PREVIOUS = 9; // 0x9
-    field public static final int STATE_SKIPPING_TO_QUEUE_ITEM = 11; // 0xb
-    field public static final int STATE_STOPPED = 1; // 0x1
-  }
-
-  public static final class PlaybackStateCompat.Builder {
-    ctor public PlaybackStateCompat.Builder();
-    ctor public PlaybackStateCompat.Builder(android.support.v4.media.session.PlaybackStateCompat);
-    method public android.support.v4.media.session.PlaybackStateCompat.Builder addCustomAction(java.lang.String, java.lang.String, int);
-    method public android.support.v4.media.session.PlaybackStateCompat.Builder addCustomAction(android.support.v4.media.session.PlaybackStateCompat.CustomAction);
-    method public android.support.v4.media.session.PlaybackStateCompat build();
-    method public android.support.v4.media.session.PlaybackStateCompat.Builder setActions(long);
-    method public android.support.v4.media.session.PlaybackStateCompat.Builder setActiveQueueItemId(long);
-    method public android.support.v4.media.session.PlaybackStateCompat.Builder setBufferedPosition(long);
-    method public android.support.v4.media.session.PlaybackStateCompat.Builder setErrorMessage(java.lang.CharSequence);
-    method public android.support.v4.media.session.PlaybackStateCompat.Builder setExtras(android.os.Bundle);
-    method public android.support.v4.media.session.PlaybackStateCompat.Builder setState(int, long, float);
-    method public android.support.v4.media.session.PlaybackStateCompat.Builder setState(int, long, float, long);
-  }
-
-  public static final class PlaybackStateCompat.CustomAction implements android.os.Parcelable {
-    method public int describeContents();
-    method public static android.support.v4.media.session.PlaybackStateCompat.CustomAction fromCustomAction(java.lang.Object);
-    method public java.lang.String getAction();
-    method public java.lang.Object getCustomAction();
-    method public android.os.Bundle getExtras();
-    method public int getIcon();
-    method public java.lang.CharSequence getName();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.support.v4.media.session.PlaybackStateCompat.CustomAction> CREATOR;
-  }
-
-  public static final class PlaybackStateCompat.CustomAction.Builder {
-    ctor public PlaybackStateCompat.CustomAction.Builder(java.lang.String, java.lang.CharSequence, int);
-    method public android.support.v4.media.session.PlaybackStateCompat.CustomAction build();
-    method public android.support.v4.media.session.PlaybackStateCompat.CustomAction.Builder setExtras(android.os.Bundle);
-  }
-
-}
-
-package android.support.v4.net {
-
-  public class ConnectivityManagerCompat {
-    ctor public ConnectivityManagerCompat();
-    method public static android.net.NetworkInfo getNetworkInfoFromBroadcast(android.net.ConnectivityManager, android.content.Intent);
-    method public static boolean isActiveNetworkMetered(android.net.ConnectivityManager);
-  }
-
-  public class TrafficStatsCompat {
-    ctor public TrafficStatsCompat();
-    method public static void clearThreadStatsTag();
-    method public static int getThreadStatsTag();
-    method public static void incrementOperationCount(int);
-    method public static void incrementOperationCount(int, int);
-    method public static void setThreadStatsTag(int);
-    method public static void tagSocket(java.net.Socket) throws java.net.SocketException;
-    method public static void untagSocket(java.net.Socket) throws java.net.SocketException;
-  }
-
-}
-
-package android.support.v4.os {
-
-  public class AsyncTaskCompat {
-    ctor public AsyncTaskCompat();
-    method public static android.os.AsyncTask<Params, Progress, Result> executeParallel(android.os.AsyncTask<Params, Progress, Result>, Params...);
-  }
-
-  public final class CancellationSignal {
-    ctor public CancellationSignal();
-    method public void cancel();
-    method public java.lang.Object getCancellationSignalObject();
-    method public boolean isCanceled();
-    method public void setOnCancelListener(android.support.v4.os.CancellationSignal.OnCancelListener);
-    method public void throwIfCanceled();
-  }
-
-  public static abstract interface CancellationSignal.OnCancelListener {
-    method public abstract void onCancel();
-  }
-
-  public class EnvironmentCompat {
-    ctor public EnvironmentCompat();
-    method public static java.lang.String getStorageState(java.io.File);
-    field public static final java.lang.String MEDIA_UNKNOWN = "unknown";
-  }
-
-  public class OperationCanceledException extends java.lang.RuntimeException {
-    ctor public OperationCanceledException();
-    ctor public OperationCanceledException(java.lang.String);
-  }
-
-  public class ParcelableCompat {
-    ctor public ParcelableCompat();
-    method public static android.os.Parcelable.Creator<T> newCreator(android.support.v4.os.ParcelableCompatCreatorCallbacks<T>);
-  }
-
-  public abstract interface ParcelableCompatCreatorCallbacks {
-    method public abstract T createFromParcel(android.os.Parcel, java.lang.ClassLoader);
-    method public abstract T[] newArray(int);
-  }
-
-  public class TraceCompat {
-    ctor public TraceCompat();
-    method public static void beginSection(java.lang.String);
-    method public static void endSection();
-  }
-
-}
-
-package android.support.v4.print {
-
-  public final class PrintHelper {
-    ctor public PrintHelper(android.content.Context);
-    method public int getColorMode();
-    method public int getOrientation();
-    method public int getScaleMode();
-    method public void printBitmap(java.lang.String, android.graphics.Bitmap);
-    method public void printBitmap(java.lang.String, android.graphics.Bitmap, android.support.v4.print.PrintHelper.OnPrintFinishCallback);
-    method public void printBitmap(java.lang.String, android.net.Uri) throws java.io.FileNotFoundException;
-    method public void printBitmap(java.lang.String, android.net.Uri, android.support.v4.print.PrintHelper.OnPrintFinishCallback) throws java.io.FileNotFoundException;
-    method public void setColorMode(int);
-    method public void setOrientation(int);
-    method public void setScaleMode(int);
-    method public static boolean systemSupportsPrint();
-    field public static final int COLOR_MODE_COLOR = 2; // 0x2
-    field public static final int COLOR_MODE_MONOCHROME = 1; // 0x1
-    field public static final int ORIENTATION_LANDSCAPE = 1; // 0x1
-    field public static final int ORIENTATION_PORTRAIT = 2; // 0x2
-    field public static final int SCALE_MODE_FILL = 2; // 0x2
-    field public static final int SCALE_MODE_FIT = 1; // 0x1
-  }
-
-  public static abstract interface PrintHelper.OnPrintFinishCallback {
-    method public abstract void onFinish();
-  }
-
-}
-
-package android.support.v4.provider {
-
-  public abstract class DocumentFile {
-    method public abstract boolean canRead();
-    method public abstract boolean canWrite();
-    method public abstract android.support.v4.provider.DocumentFile createDirectory(java.lang.String);
-    method public abstract android.support.v4.provider.DocumentFile createFile(java.lang.String, java.lang.String);
-    method public abstract boolean delete();
-    method public abstract boolean exists();
-    method public android.support.v4.provider.DocumentFile findFile(java.lang.String);
-    method public static android.support.v4.provider.DocumentFile fromFile(java.io.File);
-    method public static android.support.v4.provider.DocumentFile fromSingleUri(android.content.Context, android.net.Uri);
-    method public static android.support.v4.provider.DocumentFile fromTreeUri(android.content.Context, android.net.Uri);
-    method public abstract java.lang.String getName();
-    method public android.support.v4.provider.DocumentFile getParentFile();
-    method public abstract java.lang.String getType();
-    method public abstract android.net.Uri getUri();
-    method public abstract boolean isDirectory();
-    method public static boolean isDocumentUri(android.content.Context, android.net.Uri);
-    method public abstract boolean isFile();
-    method public abstract long lastModified();
-    method public abstract long length();
-    method public abstract android.support.v4.provider.DocumentFile[] listFiles();
-    method public abstract boolean renameTo(java.lang.String);
-  }
-
-}
-
-package android.support.v4.text {
-
-  public final class BidiFormatter {
-    method public static android.support.v4.text.BidiFormatter getInstance();
-    method public static android.support.v4.text.BidiFormatter getInstance(boolean);
-    method public static android.support.v4.text.BidiFormatter getInstance(java.util.Locale);
-    method public boolean getStereoReset();
-    method public boolean isRtl(java.lang.String);
-    method public boolean isRtlContext();
-    method public java.lang.String unicodeWrap(java.lang.String, android.support.v4.text.TextDirectionHeuristicCompat, boolean);
-    method public java.lang.String unicodeWrap(java.lang.String, android.support.v4.text.TextDirectionHeuristicCompat);
-    method public java.lang.String unicodeWrap(java.lang.String, boolean);
-    method public java.lang.String unicodeWrap(java.lang.String);
-  }
-
-  public static final class BidiFormatter.Builder {
-    ctor public BidiFormatter.Builder();
-    ctor public BidiFormatter.Builder(boolean);
-    ctor public BidiFormatter.Builder(java.util.Locale);
-    method public android.support.v4.text.BidiFormatter build();
-    method public android.support.v4.text.BidiFormatter.Builder setTextDirectionHeuristic(android.support.v4.text.TextDirectionHeuristicCompat);
-    method public android.support.v4.text.BidiFormatter.Builder stereoReset(boolean);
-  }
-
-  public class ICUCompat {
-    ctor public ICUCompat();
-    method public static java.lang.String maximizeAndGetScript(java.util.Locale);
-  }
-
-  public abstract interface TextDirectionHeuristicCompat {
-    method public abstract boolean isRtl(char[], int, int);
-    method public abstract boolean isRtl(java.lang.CharSequence, int, int);
-  }
-
-  public class TextDirectionHeuristicsCompat {
-    ctor public TextDirectionHeuristicsCompat();
-    field public static final android.support.v4.text.TextDirectionHeuristicCompat ANYRTL_LTR;
-    field public static final android.support.v4.text.TextDirectionHeuristicCompat FIRSTSTRONG_LTR;
-    field public static final android.support.v4.text.TextDirectionHeuristicCompat FIRSTSTRONG_RTL;
-    field public static final android.support.v4.text.TextDirectionHeuristicCompat LOCALE;
-    field public static final android.support.v4.text.TextDirectionHeuristicCompat LTR;
-    field public static final android.support.v4.text.TextDirectionHeuristicCompat RTL;
-  }
-
-  public class TextUtilsCompat {
-    ctor public TextUtilsCompat();
-    method public static int getLayoutDirectionFromLocale(java.util.Locale);
-    method public static java.lang.String htmlEncode(java.lang.String);
-    field public static final java.util.Locale ROOT;
-  }
-
-}
-
-package android.support.v4.util {
-
-  public class ArrayMap extends android.support.v4.util.SimpleArrayMap implements java.util.Map {
-    ctor public ArrayMap();
-    ctor public ArrayMap(int);
-    ctor public ArrayMap(android.support.v4.util.SimpleArrayMap);
-    method public boolean containsAll(java.util.Collection<?>);
-    method public java.util.Set<java.util.Map.Entry<K, V>> entrySet();
-    method public java.util.Set<K> keySet();
-    method public void putAll(java.util.Map<? extends K, ? extends V>);
-    method public boolean removeAll(java.util.Collection<?>);
-    method public boolean retainAll(java.util.Collection<?>);
-    method public java.util.Collection<V> values();
-  }
-
-  public class AtomicFile {
-    ctor public AtomicFile(java.io.File);
-    method public void delete();
-    method public void failWrite(java.io.FileOutputStream);
-    method public void finishWrite(java.io.FileOutputStream);
-    method public java.io.File getBaseFile();
-    method public java.io.FileInputStream openRead() throws java.io.FileNotFoundException;
-    method public byte[] readFully() throws java.io.IOException;
-    method public java.io.FileOutputStream startWrite() throws java.io.IOException;
-  }
-
-  public final class CircularArray {
-    ctor public CircularArray();
-    ctor public CircularArray(int);
-    method public void addFirst(E);
-    method public void addLast(E);
-    method public void clear();
-    method public E get(int);
-    method public E getFirst();
-    method public E getLast();
-    method public boolean isEmpty();
-    method public E popFirst();
-    method public E popLast();
-    method public void removeFromEnd(int);
-    method public void removeFromStart(int);
-    method public int size();
-  }
-
-  public final class CircularIntArray {
-    ctor public CircularIntArray();
-    ctor public CircularIntArray(int);
-    method public void addFirst(int);
-    method public void addLast(int);
-    method public void clear();
-    method public int get(int);
-    method public int getFirst();
-    method public int getLast();
-    method public boolean isEmpty();
-    method public int popFirst();
-    method public int popLast();
-    method public void removeFromEnd(int);
-    method public void removeFromStart(int);
-    method public int size();
-  }
-
-  public class LongSparseArray {
-    ctor public LongSparseArray();
-    ctor public LongSparseArray(int);
-    method public void append(long, E);
-    method public void clear();
-    method public android.support.v4.util.LongSparseArray<E> clone();
-    method public void delete(long);
-    method public E get(long);
-    method public E get(long, E);
-    method public int indexOfKey(long);
-    method public int indexOfValue(E);
-    method public long keyAt(int);
-    method public void put(long, E);
-    method public void remove(long);
-    method public void removeAt(int);
-    method public void setValueAt(int, E);
-    method public int size();
-    method public E valueAt(int);
-  }
-
-  public class LruCache {
-    ctor public LruCache(int);
-    method protected V create(K);
-    method public final synchronized int createCount();
-    method protected void entryRemoved(boolean, K, V, V);
-    method public final void evictAll();
-    method public final synchronized int evictionCount();
-    method public final V get(K);
-    method public final synchronized int hitCount();
-    method public final synchronized int maxSize();
-    method public final synchronized int missCount();
-    method public final V put(K, V);
-    method public final synchronized int putCount();
-    method public final V remove(K);
-    method public void resize(int);
-    method public final synchronized int size();
-    method protected int sizeOf(K, V);
-    method public final synchronized java.util.Map<K, V> snapshot();
-    method public final synchronized java.lang.String toString();
-    method public void trimToSize(int);
-  }
-
-  public class Pair {
-    ctor public Pair(F, S);
-    method public static android.support.v4.util.Pair<A, B> create(A, B);
-    field public final F first;
-    field public final S second;
-  }
-
-  public final class Pools {
-  }
-
-  public static abstract interface Pools.Pool {
-    method public abstract T acquire();
-    method public abstract boolean release(T);
-  }
-
-  public static class Pools.SimplePool implements android.support.v4.util.Pools.Pool {
-    ctor public Pools.SimplePool(int);
-    method public T acquire();
-    method public boolean release(T);
-  }
-
-  public static class Pools.SynchronizedPool extends android.support.v4.util.Pools.SimplePool {
-    ctor public Pools.SynchronizedPool(int);
-  }
-
-  public class SimpleArrayMap {
-    ctor public SimpleArrayMap();
-    ctor public SimpleArrayMap(int);
-    ctor public SimpleArrayMap(android.support.v4.util.SimpleArrayMap);
-    method public void clear();
-    method public boolean containsKey(java.lang.Object);
-    method public boolean containsValue(java.lang.Object);
-    method public void ensureCapacity(int);
-    method public V get(java.lang.Object);
-    method public int indexOfKey(java.lang.Object);
-    method public boolean isEmpty();
-    method public K keyAt(int);
-    method public V put(K, V);
-    method public void putAll(android.support.v4.util.SimpleArrayMap<? extends K, ? extends V>);
-    method public V remove(java.lang.Object);
-    method public V removeAt(int);
-    method public V setValueAt(int, V);
-    method public int size();
-    method public V valueAt(int);
-  }
-
-  public class SparseArrayCompat {
-    ctor public SparseArrayCompat();
-    ctor public SparseArrayCompat(int);
-    method public void append(int, E);
-    method public void clear();
-    method public android.support.v4.util.SparseArrayCompat<E> clone();
-    method public void delete(int);
-    method public E get(int);
-    method public E get(int, E);
-    method public int indexOfKey(int);
-    method public int indexOfValue(E);
-    method public int keyAt(int);
-    method public void put(int, E);
-    method public void remove(int);
-    method public void removeAt(int);
-    method public void removeAtRange(int, int);
-    method public void setValueAt(int, E);
-    method public int size();
-    method public E valueAt(int);
-  }
-
-}
-
-package android.support.v4.view {
-
-  public class AccessibilityDelegateCompat {
-    ctor public AccessibilityDelegateCompat();
-    method public boolean dispatchPopulateAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
-    method public android.support.v4.view.accessibility.AccessibilityNodeProviderCompat getAccessibilityNodeProvider(android.view.View);
-    method public void onInitializeAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
-    method public void onInitializeAccessibilityNodeInfo(android.view.View, android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
-    method public void onPopulateAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
-    method public boolean onRequestSendAccessibilityEvent(android.view.ViewGroup, android.view.View, android.view.accessibility.AccessibilityEvent);
-    method public boolean performAccessibilityAction(android.view.View, int, android.os.Bundle);
-    method public void sendAccessibilityEvent(android.view.View, int);
-    method public void sendAccessibilityEventUnchecked(android.view.View, android.view.accessibility.AccessibilityEvent);
-  }
-
-  public abstract class ActionProvider {
-    ctor public ActionProvider(android.content.Context);
-    method public android.content.Context getContext();
-    method public boolean hasSubMenu();
-    method public boolean isVisible();
-    method public abstract android.view.View onCreateActionView();
-    method public android.view.View onCreateActionView(android.view.MenuItem);
-    method public boolean onPerformDefaultAction();
-    method public void onPrepareSubMenu(android.view.SubMenu);
-    method public boolean overridesItemVisibility();
-    method public void refreshVisibility();
-    method public void setVisibilityListener(android.support.v4.view.ActionProvider.VisibilityListener);
-  }
-
-  public static abstract interface ActionProvider.VisibilityListener {
-    method public abstract void onActionProviderVisibilityChanged(boolean);
-  }
-
-  public class GestureDetectorCompat {
-    ctor public GestureDetectorCompat(android.content.Context, android.view.GestureDetector.OnGestureListener);
-    ctor public GestureDetectorCompat(android.content.Context, android.view.GestureDetector.OnGestureListener, android.os.Handler);
-    method public boolean isLongpressEnabled();
-    method public boolean onTouchEvent(android.view.MotionEvent);
-    method public void setIsLongpressEnabled(boolean);
-    method public void setOnDoubleTapListener(android.view.GestureDetector.OnDoubleTapListener);
-  }
-
-  public class GravityCompat {
-    ctor public GravityCompat();
-    method public static void apply(int, int, int, android.graphics.Rect, android.graphics.Rect, int);
-    method public static void apply(int, int, int, android.graphics.Rect, int, int, android.graphics.Rect, int);
-    method public static void applyDisplay(int, android.graphics.Rect, android.graphics.Rect, int);
-    method public static int getAbsoluteGravity(int, int);
-    field public static final int END = 8388613; // 0x800005
-    field public static final int RELATIVE_HORIZONTAL_GRAVITY_MASK = 8388615; // 0x800007
-    field public static final int RELATIVE_LAYOUT_DIRECTION = 8388608; // 0x800000
-    field public static final int START = 8388611; // 0x800003
-  }
-
-  public class InputDeviceCompat {
-    ctor public InputDeviceCompat();
-    field public static final int SOURCE_ANY = -256; // 0xffffff00
-    field public static final int SOURCE_CLASS_BUTTON = 1; // 0x1
-    field public static final int SOURCE_CLASS_JOYSTICK = 16; // 0x10
-    field public static final int SOURCE_CLASS_MASK = 255; // 0xff
-    field public static final int SOURCE_CLASS_NONE = 0; // 0x0
-    field public static final int SOURCE_CLASS_POINTER = 2; // 0x2
-    field public static final int SOURCE_CLASS_POSITION = 8; // 0x8
-    field public static final int SOURCE_CLASS_TRACKBALL = 4; // 0x4
-    field public static final int SOURCE_DPAD = 513; // 0x201
-    field public static final int SOURCE_GAMEPAD = 1025; // 0x401
-    field public static final int SOURCE_HDMI = 33554433; // 0x2000001
-    field public static final int SOURCE_JOYSTICK = 16777232; // 0x1000010
-    field public static final int SOURCE_KEYBOARD = 257; // 0x101
-    field public static final int SOURCE_MOUSE = 8194; // 0x2002
-    field public static final int SOURCE_STYLUS = 16386; // 0x4002
-    field public static final int SOURCE_TOUCHPAD = 1048584; // 0x100008
-    field public static final int SOURCE_TOUCHSCREEN = 4098; // 0x1002
-    field public static final int SOURCE_TOUCH_NAVIGATION = 2097152; // 0x200000
-    field public static final int SOURCE_TRACKBALL = 65540; // 0x10004
-    field public static final int SOURCE_UNKNOWN = 0; // 0x0
-  }
-
-  public class KeyEventCompat {
-    ctor public KeyEventCompat();
-    method public static boolean dispatch(android.view.KeyEvent, android.view.KeyEvent.Callback, java.lang.Object, java.lang.Object);
-    method public static java.lang.Object getKeyDispatcherState(android.view.View);
-    method public static boolean hasModifiers(android.view.KeyEvent, int);
-    method public static boolean hasNoModifiers(android.view.KeyEvent);
-    method public static boolean isTracking(android.view.KeyEvent);
-    method public static boolean metaStateHasModifiers(int, int);
-    method public static boolean metaStateHasNoModifiers(int);
-    method public static int normalizeMetaState(int);
-    method public static void startTracking(android.view.KeyEvent);
-  }
-
-  public class LayoutInflaterCompat {
-    method public static void setFactory(android.view.LayoutInflater, android.support.v4.view.LayoutInflaterFactory);
-  }
-
-  public abstract interface LayoutInflaterFactory {
-    method public abstract android.view.View onCreateView(android.view.View, java.lang.String, android.content.Context, android.util.AttributeSet);
-  }
-
-  public class MarginLayoutParamsCompat {
-    ctor public MarginLayoutParamsCompat();
-    method public static int getLayoutDirection(android.view.ViewGroup.MarginLayoutParams);
-    method public static int getMarginEnd(android.view.ViewGroup.MarginLayoutParams);
-    method public static int getMarginStart(android.view.ViewGroup.MarginLayoutParams);
-    method public static boolean isMarginRelative(android.view.ViewGroup.MarginLayoutParams);
-    method public static void resolveLayoutDirection(android.view.ViewGroup.MarginLayoutParams, int);
-    method public static void setLayoutDirection(android.view.ViewGroup.MarginLayoutParams, int);
-    method public static void setMarginEnd(android.view.ViewGroup.MarginLayoutParams, int);
-    method public static void setMarginStart(android.view.ViewGroup.MarginLayoutParams, int);
-  }
-
-  public class MenuCompat {
-    ctor public MenuCompat();
-    method public static deprecated void setShowAsAction(android.view.MenuItem, int);
-  }
-
-  public class MenuItemCompat {
-    ctor public MenuItemCompat();
-    method public static boolean collapseActionView(android.view.MenuItem);
-    method public static boolean expandActionView(android.view.MenuItem);
-    method public static android.support.v4.view.ActionProvider getActionProvider(android.view.MenuItem);
-    method public static android.view.View getActionView(android.view.MenuItem);
-    method public static boolean isActionViewExpanded(android.view.MenuItem);
-    method public static android.view.MenuItem setActionProvider(android.view.MenuItem, android.support.v4.view.ActionProvider);
-    method public static android.view.MenuItem setActionView(android.view.MenuItem, android.view.View);
-    method public static android.view.MenuItem setActionView(android.view.MenuItem, int);
-    method public static android.view.MenuItem setOnActionExpandListener(android.view.MenuItem, android.support.v4.view.MenuItemCompat.OnActionExpandListener);
-    method public static void setShowAsAction(android.view.MenuItem, int);
-    field public static final int SHOW_AS_ACTION_ALWAYS = 2; // 0x2
-    field public static final int SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW = 8; // 0x8
-    field public static final int SHOW_AS_ACTION_IF_ROOM = 1; // 0x1
-    field public static final int SHOW_AS_ACTION_NEVER = 0; // 0x0
-    field public static final int SHOW_AS_ACTION_WITH_TEXT = 4; // 0x4
-  }
-
-  public static abstract interface MenuItemCompat.OnActionExpandListener {
-    method public abstract boolean onMenuItemActionCollapse(android.view.MenuItem);
-    method public abstract boolean onMenuItemActionExpand(android.view.MenuItem);
-  }
-
-  public class MotionEventCompat {
-    ctor public MotionEventCompat();
-    method public static int findPointerIndex(android.view.MotionEvent, int);
-    method public static int getActionIndex(android.view.MotionEvent);
-    method public static int getActionMasked(android.view.MotionEvent);
-    method public static float getAxisValue(android.view.MotionEvent, int);
-    method public static float getAxisValue(android.view.MotionEvent, int, int);
-    method public static int getPointerCount(android.view.MotionEvent);
-    method public static int getPointerId(android.view.MotionEvent, int);
-    method public static int getSource(android.view.MotionEvent);
-    method public static float getX(android.view.MotionEvent, int);
-    method public static float getY(android.view.MotionEvent, int);
-    field public static final int ACTION_HOVER_ENTER = 9; // 0x9
-    field public static final int ACTION_HOVER_EXIT = 10; // 0xa
-    field public static final int ACTION_HOVER_MOVE = 7; // 0x7
-    field public static final int ACTION_MASK = 255; // 0xff
-    field public static final int ACTION_POINTER_DOWN = 5; // 0x5
-    field public static final int ACTION_POINTER_INDEX_MASK = 65280; // 0xff00
-    field public static final int ACTION_POINTER_INDEX_SHIFT = 8; // 0x8
-    field public static final int ACTION_POINTER_UP = 6; // 0x6
-    field public static final int ACTION_SCROLL = 8; // 0x8
-    field public static final int AXIS_BRAKE = 23; // 0x17
-    field public static final int AXIS_DISTANCE = 24; // 0x18
-    field public static final int AXIS_GAS = 22; // 0x16
-    field public static final int AXIS_GENERIC_1 = 32; // 0x20
-    field public static final int AXIS_GENERIC_10 = 41; // 0x29
-    field public static final int AXIS_GENERIC_11 = 42; // 0x2a
-    field public static final int AXIS_GENERIC_12 = 43; // 0x2b
-    field public static final int AXIS_GENERIC_13 = 44; // 0x2c
-    field public static final int AXIS_GENERIC_14 = 45; // 0x2d
-    field public static final int AXIS_GENERIC_15 = 46; // 0x2e
-    field public static final int AXIS_GENERIC_16 = 47; // 0x2f
-    field public static final int AXIS_GENERIC_2 = 33; // 0x21
-    field public static final int AXIS_GENERIC_3 = 34; // 0x22
-    field public static final int AXIS_GENERIC_4 = 35; // 0x23
-    field public static final int AXIS_GENERIC_5 = 36; // 0x24
-    field public static final int AXIS_GENERIC_6 = 37; // 0x25
-    field public static final int AXIS_GENERIC_7 = 38; // 0x26
-    field public static final int AXIS_GENERIC_8 = 39; // 0x27
-    field public static final int AXIS_GENERIC_9 = 40; // 0x28
-    field public static final int AXIS_HAT_X = 15; // 0xf
-    field public static final int AXIS_HAT_Y = 16; // 0x10
-    field public static final int AXIS_HSCROLL = 10; // 0xa
-    field public static final int AXIS_LTRIGGER = 17; // 0x11
-    field public static final int AXIS_ORIENTATION = 8; // 0x8
-    field public static final int AXIS_PRESSURE = 2; // 0x2
-    field public static final int AXIS_RTRIGGER = 18; // 0x12
-    field public static final int AXIS_RUDDER = 20; // 0x14
-    field public static final int AXIS_RX = 12; // 0xc
-    field public static final int AXIS_RY = 13; // 0xd
-    field public static final int AXIS_RZ = 14; // 0xe
-    field public static final int AXIS_SIZE = 3; // 0x3
-    field public static final int AXIS_THROTTLE = 19; // 0x13
-    field public static final int AXIS_TILT = 25; // 0x19
-    field public static final int AXIS_TOOL_MAJOR = 6; // 0x6
-    field public static final int AXIS_TOOL_MINOR = 7; // 0x7
-    field public static final int AXIS_TOUCH_MAJOR = 4; // 0x4
-    field public static final int AXIS_TOUCH_MINOR = 5; // 0x5
-    field public static final int AXIS_VSCROLL = 9; // 0x9
-    field public static final int AXIS_WHEEL = 21; // 0x15
-    field public static final int AXIS_X = 0; // 0x0
-    field public static final int AXIS_Y = 1; // 0x1
-    field public static final int AXIS_Z = 11; // 0xb
-  }
-
-  public abstract interface NestedScrollingChild {
-    method public abstract boolean dispatchNestedFling(float, float, boolean);
-    method public abstract boolean dispatchNestedPreFling(float, float);
-    method public abstract boolean dispatchNestedPreScroll(int, int, int[], int[]);
-    method public abstract boolean dispatchNestedScroll(int, int, int, int, int[]);
-    method public abstract boolean hasNestedScrollingParent();
-    method public abstract boolean isNestedScrollingEnabled();
-    method public abstract void setNestedScrollingEnabled(boolean);
-    method public abstract boolean startNestedScroll(int);
-    method public abstract void stopNestedScroll();
-  }
-
-  public class NestedScrollingChildHelper {
-    ctor public NestedScrollingChildHelper(android.view.View);
-    method public boolean dispatchNestedFling(float, float, boolean);
-    method public boolean dispatchNestedPreFling(float, float);
-    method public boolean dispatchNestedPreScroll(int, int, int[], int[]);
-    method public boolean dispatchNestedScroll(int, int, int, int, int[]);
-    method public boolean hasNestedScrollingParent();
-    method public boolean isNestedScrollingEnabled();
-    method public void onDetachedFromWindow();
-    method public void onStopNestedScroll(android.view.View);
-    method public void setNestedScrollingEnabled(boolean);
-    method public boolean startNestedScroll(int);
-    method public void stopNestedScroll();
-  }
-
-  public abstract interface NestedScrollingParent {
-    method public abstract int getNestedScrollAxes();
-    method public abstract boolean onNestedFling(android.view.View, float, float, boolean);
-    method public abstract boolean onNestedPreFling(android.view.View, float, float);
-    method public abstract void onNestedPreScroll(android.view.View, int, int, int[]);
-    method public abstract void onNestedScroll(android.view.View, int, int, int, int);
-    method public abstract void onNestedScrollAccepted(android.view.View, android.view.View, int);
-    method public abstract boolean onStartNestedScroll(android.view.View, android.view.View, int);
-    method public abstract void onStopNestedScroll(android.view.View);
-  }
-
-  public class NestedScrollingParentHelper {
-    ctor public NestedScrollingParentHelper(android.view.ViewGroup);
-    method public int getNestedScrollAxes();
-    method public void onNestedScrollAccepted(android.view.View, android.view.View, int);
-    method public void onStopNestedScroll(android.view.View);
-  }
-
-  public abstract interface OnApplyWindowInsetsListener {
-    method public abstract android.support.v4.view.WindowInsetsCompat onApplyWindowInsets(android.view.View, android.support.v4.view.WindowInsetsCompat);
-  }
-
-  public abstract class PagerAdapter {
-    ctor public PagerAdapter();
-    method public void destroyItem(android.view.ViewGroup, int, java.lang.Object);
-    method public deprecated void destroyItem(android.view.View, int, java.lang.Object);
-    method public void finishUpdate(android.view.ViewGroup);
-    method public deprecated void finishUpdate(android.view.View);
-    method public abstract int getCount();
-    method public int getItemPosition(java.lang.Object);
-    method public java.lang.CharSequence getPageTitle(int);
-    method public float getPageWidth(int);
-    method public java.lang.Object instantiateItem(android.view.ViewGroup, int);
-    method public deprecated java.lang.Object instantiateItem(android.view.View, int);
-    method public abstract boolean isViewFromObject(android.view.View, java.lang.Object);
-    method public void notifyDataSetChanged();
-    method public void registerDataSetObserver(android.database.DataSetObserver);
-    method public void restoreState(android.os.Parcelable, java.lang.ClassLoader);
-    method public android.os.Parcelable saveState();
-    method public void setPrimaryItem(android.view.ViewGroup, int, java.lang.Object);
-    method public deprecated void setPrimaryItem(android.view.View, int, java.lang.Object);
-    method public void startUpdate(android.view.ViewGroup);
-    method public deprecated void startUpdate(android.view.View);
-    method public void unregisterDataSetObserver(android.database.DataSetObserver);
-    field public static final int POSITION_NONE = -2; // 0xfffffffe
-    field public static final int POSITION_UNCHANGED = -1; // 0xffffffff
-  }
-
-  public class PagerTabStrip extends android.support.v4.view.PagerTitleStrip {
-    ctor public PagerTabStrip(android.content.Context);
-    ctor public PagerTabStrip(android.content.Context, android.util.AttributeSet);
-    method public boolean getDrawFullUnderline();
-    method public int getTabIndicatorColor();
-    method public void setDrawFullUnderline(boolean);
-    method public void setTabIndicatorColor(int);
-    method public void setTabIndicatorColorResource(int);
-  }
-
-  public class PagerTitleStrip extends android.view.ViewGroup {
-    ctor public PagerTitleStrip(android.content.Context);
-    ctor public PagerTitleStrip(android.content.Context, android.util.AttributeSet);
-    method public int getTextSpacing();
-    method protected void onLayout(boolean, int, int, int, int);
-    method public void setGravity(int);
-    method public void setNonPrimaryAlpha(float);
-    method public void setTextColor(int);
-    method public void setTextSize(int, float);
-    method public void setTextSpacing(int);
-  }
-
-  public class ScaleGestureDetectorCompat {
-    method public static boolean isQuickScaleEnabled(java.lang.Object);
-    method public static void setQuickScaleEnabled(java.lang.Object, boolean);
-  }
-
-  public abstract interface ScrollingView {
-    method public abstract int computeHorizontalScrollExtent();
-    method public abstract int computeHorizontalScrollOffset();
-    method public abstract int computeHorizontalScrollRange();
-    method public abstract int computeVerticalScrollExtent();
-    method public abstract int computeVerticalScrollOffset();
-    method public abstract int computeVerticalScrollRange();
-  }
-
-  public abstract interface TintableBackgroundView {
-    method public abstract android.content.res.ColorStateList getSupportBackgroundTintList();
-    method public abstract android.graphics.PorterDuff.Mode getSupportBackgroundTintMode();
-    method public abstract void setSupportBackgroundTintList(android.content.res.ColorStateList);
-    method public abstract void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode);
-  }
-
-  public class VelocityTrackerCompat {
-    ctor public VelocityTrackerCompat();
-    method public static float getXVelocity(android.view.VelocityTracker, int);
-    method public static float getYVelocity(android.view.VelocityTracker, int);
-  }
-
-  public class ViewCompat {
-    ctor public ViewCompat();
-    method public static android.support.v4.view.ViewPropertyAnimatorCompat animate(android.view.View);
-    method public static boolean canScrollHorizontally(android.view.View, int);
-    method public static boolean canScrollVertically(android.view.View, int);
-    method public static int combineMeasuredStates(int, int);
-    method public static android.support.v4.view.WindowInsetsCompat dispatchApplyWindowInsets(android.view.View, android.support.v4.view.WindowInsetsCompat);
-    method public static void dispatchFinishTemporaryDetach(android.view.View);
-    method public static boolean dispatchNestedFling(android.view.View, float, float, boolean);
-    method public static boolean dispatchNestedPreFling(android.view.View, float, float);
-    method public static boolean dispatchNestedPreScroll(android.view.View, int, int, int[], int[]);
-    method public static boolean dispatchNestedScroll(android.view.View, int, int, int, int, int[]);
-    method public static void dispatchStartTemporaryDetach(android.view.View);
-    method public static int getAccessibilityLiveRegion(android.view.View);
-    method public static android.support.v4.view.accessibility.AccessibilityNodeProviderCompat getAccessibilityNodeProvider(android.view.View);
-    method public static float getAlpha(android.view.View);
-    method public static android.content.res.ColorStateList getBackgroundTintList(android.view.View);
-    method public static android.graphics.PorterDuff.Mode getBackgroundTintMode(android.view.View);
-    method public static android.graphics.Rect getClipBounds(android.view.View);
-    method public static float getElevation(android.view.View);
-    method public static boolean getFitsSystemWindows(android.view.View);
-    method public static int getImportantForAccessibility(android.view.View);
-    method public static int getLabelFor(android.view.View);
-    method public static int getLayerType(android.view.View);
-    method public static int getLayoutDirection(android.view.View);
-    method public static int getMeasuredHeightAndState(android.view.View);
-    method public static int getMeasuredState(android.view.View);
-    method public static int getMeasuredWidthAndState(android.view.View);
-    method public static int getMinimumHeight(android.view.View);
-    method public static int getMinimumWidth(android.view.View);
-    method public static int getOverScrollMode(android.view.View);
-    method public static int getPaddingEnd(android.view.View);
-    method public static int getPaddingStart(android.view.View);
-    method public static android.view.ViewParent getParentForAccessibility(android.view.View);
-    method public static float getPivotX(android.view.View);
-    method public static float getPivotY(android.view.View);
-    method public static float getRotation(android.view.View);
-    method public static float getRotationX(android.view.View);
-    method public static float getRotationY(android.view.View);
-    method public static float getScaleX(android.view.View);
-    method public static float getScaleY(android.view.View);
-    method public static int getScrollIndicators(android.view.View);
-    method public static java.lang.String getTransitionName(android.view.View);
-    method public static float getTranslationX(android.view.View);
-    method public static float getTranslationY(android.view.View);
-    method public static float getTranslationZ(android.view.View);
-    method public static int getWindowSystemUiVisibility(android.view.View);
-    method public static float getX(android.view.View);
-    method public static float getY(android.view.View);
-    method public static float getZ(android.view.View);
-    method public static boolean hasAccessibilityDelegate(android.view.View);
-    method public static boolean hasNestedScrollingParent(android.view.View);
-    method public static boolean hasOnClickListeners(android.view.View);
-    method public static boolean hasOverlappingRendering(android.view.View);
-    method public static boolean hasTransientState(android.view.View);
-    method public static boolean isAttachedToWindow(android.view.View);
-    method public static boolean isLaidOut(android.view.View);
-    method public static boolean isNestedScrollingEnabled(android.view.View);
-    method public static boolean isOpaque(android.view.View);
-    method public static boolean isPaddingRelative(android.view.View);
-    method public static void jumpDrawablesToCurrentState(android.view.View);
-    method public static void offsetLeftAndRight(android.view.View, int);
-    method public static void offsetTopAndBottom(android.view.View, int);
-    method public static android.support.v4.view.WindowInsetsCompat onApplyWindowInsets(android.view.View, android.support.v4.view.WindowInsetsCompat);
-    method public static void onInitializeAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
-    method public static void onInitializeAccessibilityNodeInfo(android.view.View, android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
-    method public static void onPopulateAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
-    method public static boolean performAccessibilityAction(android.view.View, int, android.os.Bundle);
-    method public static void postInvalidateOnAnimation(android.view.View);
-    method public static void postInvalidateOnAnimation(android.view.View, int, int, int, int);
-    method public static void postOnAnimation(android.view.View, java.lang.Runnable);
-    method public static void postOnAnimationDelayed(android.view.View, java.lang.Runnable, long);
-    method public static void requestApplyInsets(android.view.View);
-    method public static int resolveSizeAndState(int, int, int);
-    method public static void setAccessibilityDelegate(android.view.View, android.support.v4.view.AccessibilityDelegateCompat);
-    method public static void setAccessibilityLiveRegion(android.view.View, int);
-    method public static void setActivated(android.view.View, boolean);
-    method public static void setAlpha(android.view.View, float);
-    method public static void setBackgroundTintList(android.view.View, android.content.res.ColorStateList);
-    method public static void setBackgroundTintMode(android.view.View, android.graphics.PorterDuff.Mode);
-    method public static void setChildrenDrawingOrderEnabled(android.view.ViewGroup, boolean);
-    method public static void setClipBounds(android.view.View, android.graphics.Rect);
-    method public static void setElevation(android.view.View, float);
-    method public static void setFitsSystemWindows(android.view.View, boolean);
-    method public static void setHasTransientState(android.view.View, boolean);
-    method public static void setImportantForAccessibility(android.view.View, int);
-    method public static void setLabelFor(android.view.View, int);
-    method public static void setLayerPaint(android.view.View, android.graphics.Paint);
-    method public static void setLayerType(android.view.View, int, android.graphics.Paint);
-    method public static void setLayoutDirection(android.view.View, int);
-    method public static void setNestedScrollingEnabled(android.view.View, boolean);
-    method public static void setOnApplyWindowInsetsListener(android.view.View, android.support.v4.view.OnApplyWindowInsetsListener);
-    method public static void setOverScrollMode(android.view.View, int);
-    method public static void setPaddingRelative(android.view.View, int, int, int, int);
-    method public static void setPivotX(android.view.View, float);
-    method public static void setPivotY(android.view.View, float);
-    method public static void setRotation(android.view.View, float);
-    method public static void setRotationX(android.view.View, float);
-    method public static void setRotationY(android.view.View, float);
-    method public static void setSaveFromParentEnabled(android.view.View, boolean);
-    method public static void setScaleX(android.view.View, float);
-    method public static void setScaleY(android.view.View, float);
-    method public static void setScrollIndicators(android.view.View, int);
-    method public static void setScrollIndicators(android.view.View, int, int);
-    method public static void setTransitionName(android.view.View, java.lang.String);
-    method public static void setTranslationX(android.view.View, float);
-    method public static void setTranslationY(android.view.View, float);
-    method public static void setTranslationZ(android.view.View, float);
-    method public static void setX(android.view.View, float);
-    method public static void setY(android.view.View, float);
-    method public static boolean startNestedScroll(android.view.View, int);
-    method public static void stopNestedScroll(android.view.View);
-    field public static final int ACCESSIBILITY_LIVE_REGION_ASSERTIVE = 2; // 0x2
-    field public static final int ACCESSIBILITY_LIVE_REGION_NONE = 0; // 0x0
-    field public static final int ACCESSIBILITY_LIVE_REGION_POLITE = 1; // 0x1
-    field public static final int IMPORTANT_FOR_ACCESSIBILITY_AUTO = 0; // 0x0
-    field public static final int IMPORTANT_FOR_ACCESSIBILITY_NO = 2; // 0x2
-    field public static final int IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS = 4; // 0x4
-    field public static final int IMPORTANT_FOR_ACCESSIBILITY_YES = 1; // 0x1
-    field public static final int LAYER_TYPE_HARDWARE = 2; // 0x2
-    field public static final int LAYER_TYPE_NONE = 0; // 0x0
-    field public static final int LAYER_TYPE_SOFTWARE = 1; // 0x1
-    field public static final int LAYOUT_DIRECTION_INHERIT = 2; // 0x2
-    field public static final int LAYOUT_DIRECTION_LOCALE = 3; // 0x3
-    field public static final int LAYOUT_DIRECTION_LTR = 0; // 0x0
-    field public static final int LAYOUT_DIRECTION_RTL = 1; // 0x1
-    field public static final int MEASURED_HEIGHT_STATE_SHIFT = 16; // 0x10
-    field public static final int MEASURED_SIZE_MASK = 16777215; // 0xffffff
-    field public static final int MEASURED_STATE_MASK = -16777216; // 0xff000000
-    field public static final int MEASURED_STATE_TOO_SMALL = 16777216; // 0x1000000
-    field public static final int OVER_SCROLL_ALWAYS = 0; // 0x0
-    field public static final int OVER_SCROLL_IF_CONTENT_SCROLLS = 1; // 0x1
-    field public static final int OVER_SCROLL_NEVER = 2; // 0x2
-    field public static final int SCROLL_AXIS_HORIZONTAL = 1; // 0x1
-    field public static final int SCROLL_AXIS_NONE = 0; // 0x0
-    field public static final int SCROLL_AXIS_VERTICAL = 2; // 0x2
-    field public static final int SCROLL_INDICATOR_BOTTOM = 2; // 0x2
-    field public static final int SCROLL_INDICATOR_END = 32; // 0x20
-    field public static final int SCROLL_INDICATOR_LEFT = 4; // 0x4
-    field public static final int SCROLL_INDICATOR_RIGHT = 8; // 0x8
-    field public static final int SCROLL_INDICATOR_START = 16; // 0x10
-    field public static final int SCROLL_INDICATOR_TOP = 1; // 0x1
-  }
-
-  public class ViewConfigurationCompat {
-    ctor public ViewConfigurationCompat();
-    method public static int getScaledPagingTouchSlop(android.view.ViewConfiguration);
-    method public static boolean hasPermanentMenuKey(android.view.ViewConfiguration);
-  }
-
-  public class ViewGroupCompat {
-    method public static int getLayoutMode(android.view.ViewGroup);
-    method public static int getNestedScrollAxes(android.view.ViewGroup);
-    method public static boolean isTransitionGroup(android.view.ViewGroup);
-    method public static boolean onRequestSendAccessibilityEvent(android.view.ViewGroup, android.view.View, android.view.accessibility.AccessibilityEvent);
-    method public static void setLayoutMode(android.view.ViewGroup, int);
-    method public static void setMotionEventSplittingEnabled(android.view.ViewGroup, boolean);
-    method public static void setTransitionGroup(android.view.ViewGroup, boolean);
-    field public static final int LAYOUT_MODE_CLIP_BOUNDS = 0; // 0x0
-    field public static final int LAYOUT_MODE_OPTICAL_BOUNDS = 1; // 0x1
-  }
-
-  public class ViewPager extends android.view.ViewGroup {
-    ctor public ViewPager(android.content.Context);
-    ctor public ViewPager(android.content.Context, android.util.AttributeSet);
-    method public void addOnPageChangeListener(android.support.v4.view.ViewPager.OnPageChangeListener);
-    method public boolean arrowScroll(int);
-    method public boolean beginFakeDrag();
-    method protected boolean canScroll(android.view.View, boolean, int, int, int);
-    method public void clearOnPageChangeListeners();
-    method public void endFakeDrag();
-    method public boolean executeKeyEvent(android.view.KeyEvent);
-    method public void fakeDragBy(float);
-    method public android.support.v4.view.PagerAdapter getAdapter();
-    method public int getCurrentItem();
-    method public int getOffscreenPageLimit();
-    method public int getPageMargin();
-    method public boolean isFakeDragging();
-    method protected void onLayout(boolean, int, int, int, int);
-    method protected void onPageScrolled(int, float, int);
-    method public void onRestoreInstanceState(android.os.Parcelable);
-    method public android.os.Parcelable onSaveInstanceState();
-    method public void removeOnPageChangeListener(android.support.v4.view.ViewPager.OnPageChangeListener);
-    method public void setAdapter(android.support.v4.view.PagerAdapter);
-    method public void setCurrentItem(int);
-    method public void setCurrentItem(int, boolean);
-    method public void setOffscreenPageLimit(int);
-    method public deprecated void setOnPageChangeListener(android.support.v4.view.ViewPager.OnPageChangeListener);
-    method public void setPageMargin(int);
-    method public void setPageMarginDrawable(android.graphics.drawable.Drawable);
-    method public void setPageMarginDrawable(int);
-    method public void setPageTransformer(boolean, android.support.v4.view.ViewPager.PageTransformer);
-    field public static final int SCROLL_STATE_DRAGGING = 1; // 0x1
-    field public static final int SCROLL_STATE_IDLE = 0; // 0x0
-    field public static final int SCROLL_STATE_SETTLING = 2; // 0x2
-  }
-
-  public static class ViewPager.LayoutParams extends android.view.ViewGroup.LayoutParams {
-    ctor public ViewPager.LayoutParams();
-    ctor public ViewPager.LayoutParams(android.content.Context, android.util.AttributeSet);
-    field public int gravity;
-    field public boolean isDecor;
-  }
-
-  public static abstract interface ViewPager.OnPageChangeListener {
-    method public abstract void onPageScrollStateChanged(int);
-    method public abstract void onPageScrolled(int, float, int);
-    method public abstract void onPageSelected(int);
-  }
-
-  public static abstract interface ViewPager.PageTransformer {
-    method public abstract void transformPage(android.view.View, float);
-  }
-
-  public static class ViewPager.SavedState extends android.view.View.BaseSavedState {
-    ctor public ViewPager.SavedState(android.os.Parcelable);
-    field public static final android.os.Parcelable.Creator<android.support.v4.view.ViewPager.SavedState> CREATOR;
-  }
-
-  public static class ViewPager.SimpleOnPageChangeListener implements android.support.v4.view.ViewPager.OnPageChangeListener {
-    ctor public ViewPager.SimpleOnPageChangeListener();
-    method public void onPageScrollStateChanged(int);
-    method public void onPageScrolled(int, float, int);
-    method public void onPageSelected(int);
-  }
-
-  public class ViewParentCompat {
-    method public static void notifySubtreeAccessibilityStateChanged(android.view.ViewParent, android.view.View, android.view.View, int);
-    method public static boolean onNestedFling(android.view.ViewParent, android.view.View, float, float, boolean);
-    method public static boolean onNestedPreFling(android.view.ViewParent, android.view.View, float, float);
-    method public static void onNestedPreScroll(android.view.ViewParent, android.view.View, int, int, int[]);
-    method public static void onNestedScroll(android.view.ViewParent, android.view.View, int, int, int, int);
-    method public static void onNestedScrollAccepted(android.view.ViewParent, android.view.View, android.view.View, int);
-    method public static boolean onStartNestedScroll(android.view.ViewParent, android.view.View, android.view.View, int);
-    method public static void onStopNestedScroll(android.view.ViewParent, android.view.View);
-    method public static boolean requestSendAccessibilityEvent(android.view.ViewParent, android.view.View, android.view.accessibility.AccessibilityEvent);
-  }
-
-  public class ViewPropertyAnimatorCompat {
-    method public android.support.v4.view.ViewPropertyAnimatorCompat alpha(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat alphaBy(float);
-    method public void cancel();
-    method public long getDuration();
-    method public android.view.animation.Interpolator getInterpolator();
-    method public long getStartDelay();
-    method public android.support.v4.view.ViewPropertyAnimatorCompat rotation(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat rotationBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat rotationX(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat rotationXBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat rotationY(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat rotationYBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat scaleX(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat scaleXBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat scaleY(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat scaleYBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat setDuration(long);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat setInterpolator(android.view.animation.Interpolator);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat setListener(android.support.v4.view.ViewPropertyAnimatorListener);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat setStartDelay(long);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat setUpdateListener(android.support.v4.view.ViewPropertyAnimatorUpdateListener);
-    method public void start();
-    method public android.support.v4.view.ViewPropertyAnimatorCompat translationX(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat translationXBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat translationY(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat translationYBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat translationZ(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat translationZBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat withEndAction(java.lang.Runnable);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat withLayer();
-    method public android.support.v4.view.ViewPropertyAnimatorCompat withStartAction(java.lang.Runnable);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat x(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat xBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat y(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat yBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat z(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat zBy(float);
-  }
-
-  public abstract interface ViewPropertyAnimatorListener {
-    method public abstract void onAnimationCancel(android.view.View);
-    method public abstract void onAnimationEnd(android.view.View);
-    method public abstract void onAnimationStart(android.view.View);
-  }
-
-  public class ViewPropertyAnimatorListenerAdapter implements android.support.v4.view.ViewPropertyAnimatorListener {
-    ctor public ViewPropertyAnimatorListenerAdapter();
-    method public void onAnimationCancel(android.view.View);
-    method public void onAnimationEnd(android.view.View);
-    method public void onAnimationStart(android.view.View);
-  }
-
-  public abstract interface ViewPropertyAnimatorUpdateListener {
-    method public abstract void onAnimationUpdate(android.view.View);
-  }
-
-  public class WindowCompat {
-    ctor public WindowCompat();
-    field public static final int FEATURE_ACTION_BAR = 8; // 0x8
-    field public static final int FEATURE_ACTION_BAR_OVERLAY = 9; // 0x9
-    field public static final int FEATURE_ACTION_MODE_OVERLAY = 10; // 0xa
-  }
-
-  public class WindowInsetsCompat {
-    method public android.support.v4.view.WindowInsetsCompat consumeStableInsets();
-    method public android.support.v4.view.WindowInsetsCompat consumeSystemWindowInsets();
-    method public int getStableInsetBottom();
-    method public int getStableInsetLeft();
-    method public int getStableInsetRight();
-    method public int getStableInsetTop();
-    method public int getSystemWindowInsetBottom();
-    method public int getSystemWindowInsetLeft();
-    method public int getSystemWindowInsetRight();
-    method public int getSystemWindowInsetTop();
-    method public boolean hasInsets();
-    method public boolean hasStableInsets();
-    method public boolean hasSystemWindowInsets();
-    method public boolean isConsumed();
-    method public boolean isRound();
-    method public android.support.v4.view.WindowInsetsCompat replaceSystemWindowInsets(int, int, int, int);
-    method public android.support.v4.view.WindowInsetsCompat replaceSystemWindowInsets(android.graphics.Rect);
-  }
-
-}
-
-package android.support.v4.view.accessibility {
-
-  public class AccessibilityEventCompat {
-    method public static void appendRecord(android.view.accessibility.AccessibilityEvent, android.support.v4.view.accessibility.AccessibilityRecordCompat);
-    method public static android.support.v4.view.accessibility.AccessibilityRecordCompat asRecord(android.view.accessibility.AccessibilityEvent);
-    method public static int getContentChangeTypes(android.view.accessibility.AccessibilityEvent);
-    method public static android.support.v4.view.accessibility.AccessibilityRecordCompat getRecord(android.view.accessibility.AccessibilityEvent, int);
-    method public static int getRecordCount(android.view.accessibility.AccessibilityEvent);
-    method public static void setContentChangeTypes(android.view.accessibility.AccessibilityEvent, int);
-    field public static final int CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION = 4; // 0x4
-    field public static final int CONTENT_CHANGE_TYPE_SUBTREE = 1; // 0x1
-    field public static final int CONTENT_CHANGE_TYPE_TEXT = 2; // 0x2
-    field public static final int CONTENT_CHANGE_TYPE_UNDEFINED = 0; // 0x0
-    field public static final int TYPES_ALL_MASK = -1; // 0xffffffff
-    field public static final int TYPE_ANNOUNCEMENT = 16384; // 0x4000
-    field public static final int TYPE_GESTURE_DETECTION_END = 524288; // 0x80000
-    field public static final int TYPE_GESTURE_DETECTION_START = 262144; // 0x40000
-    field public static final int TYPE_TOUCH_EXPLORATION_GESTURE_END = 1024; // 0x400
-    field public static final int TYPE_TOUCH_EXPLORATION_GESTURE_START = 512; // 0x200
-    field public static final int TYPE_TOUCH_INTERACTION_END = 2097152; // 0x200000
-    field public static final int TYPE_TOUCH_INTERACTION_START = 1048576; // 0x100000
-    field public static final int TYPE_VIEW_ACCESSIBILITY_FOCUSED = 32768; // 0x8000
-    field public static final int TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED = 65536; // 0x10000
-    field public static final int TYPE_VIEW_HOVER_ENTER = 128; // 0x80
-    field public static final int TYPE_VIEW_HOVER_EXIT = 256; // 0x100
-    field public static final int TYPE_VIEW_SCROLLED = 4096; // 0x1000
-    field public static final int TYPE_VIEW_TEXT_SELECTION_CHANGED = 8192; // 0x2000
-    field public static final int TYPE_VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITY = 131072; // 0x20000
-    field public static final int TYPE_WINDOW_CONTENT_CHANGED = 2048; // 0x800
-  }
-
-  public class AccessibilityManagerCompat {
-    ctor public AccessibilityManagerCompat();
-    method public static boolean addAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager, android.support.v4.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat);
-    method public static java.util.List<android.accessibilityservice.AccessibilityServiceInfo> getEnabledAccessibilityServiceList(android.view.accessibility.AccessibilityManager, int);
-    method public static java.util.List<android.accessibilityservice.AccessibilityServiceInfo> getInstalledAccessibilityServiceList(android.view.accessibility.AccessibilityManager);
-    method public static boolean isTouchExplorationEnabled(android.view.accessibility.AccessibilityManager);
-    method public static boolean removeAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager, android.support.v4.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat);
-  }
-
-  public static abstract class AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat {
-    ctor public AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat();
-    method public abstract void onAccessibilityStateChanged(boolean);
-  }
-
-  public class AccessibilityNodeInfoCompat {
-    ctor public AccessibilityNodeInfoCompat(java.lang.Object);
-    method public void addAction(int);
-    method public void addAction(android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat);
-    method public void addChild(android.view.View);
-    method public void addChild(android.view.View, int);
-    method public boolean canOpenPopup();
-    method public java.util.List<android.support.v4.view.accessibility.AccessibilityNodeInfoCompat> findAccessibilityNodeInfosByText(java.lang.String);
-    method public java.util.List<android.support.v4.view.accessibility.AccessibilityNodeInfoCompat> findAccessibilityNodeInfosByViewId(java.lang.String);
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat findFocus(int);
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat focusSearch(int);
-    method public java.util.List<android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat> getActionList();
-    method public int getActions();
-    method public void getBoundsInParent(android.graphics.Rect);
-    method public void getBoundsInScreen(android.graphics.Rect);
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getChild(int);
-    method public int getChildCount();
-    method public java.lang.CharSequence getClassName();
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat getCollectionInfo();
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat getCollectionItemInfo();
-    method public java.lang.CharSequence getContentDescription();
-    method public java.lang.CharSequence getError();
-    method public android.os.Bundle getExtras();
-    method public java.lang.Object getInfo();
-    method public int getInputType();
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getLabelFor();
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getLabeledBy();
-    method public int getLiveRegion();
-    method public int getMaxTextLength();
-    method public int getMovementGranularities();
-    method public java.lang.CharSequence getPackageName();
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getParent();
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat getRangeInfo();
-    method public java.lang.CharSequence getText();
-    method public int getTextSelectionEnd();
-    method public int getTextSelectionStart();
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getTraversalAfter();
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getTraversalBefore();
-    method public java.lang.String getViewIdResourceName();
-    method public android.support.v4.view.accessibility.AccessibilityWindowInfoCompat getWindow();
-    method public int getWindowId();
-    method public boolean isAccessibilityFocused();
-    method public boolean isCheckable();
-    method public boolean isChecked();
-    method public boolean isClickable();
-    method public boolean isContentInvalid();
-    method public boolean isDismissable();
-    method public boolean isEditable();
-    method public boolean isEnabled();
-    method public boolean isFocusable();
-    method public boolean isFocused();
-    method public boolean isLongClickable();
-    method public boolean isMultiLine();
-    method public boolean isPassword();
-    method public boolean isScrollable();
-    method public boolean isSelected();
-    method public boolean isVisibleToUser();
-    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat obtain(android.view.View);
-    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat obtain(android.view.View, int);
-    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat obtain();
-    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat obtain(android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
-    method public boolean performAction(int);
-    method public boolean performAction(int, android.os.Bundle);
-    method public void recycle();
-    method public boolean refresh();
-    method public boolean removeAction(android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat);
-    method public boolean removeChild(android.view.View);
-    method public boolean removeChild(android.view.View, int);
-    method public void setAccessibilityFocused(boolean);
-    method public void setBoundsInParent(android.graphics.Rect);
-    method public void setBoundsInScreen(android.graphics.Rect);
-    method public void setCanOpenPopup(boolean);
-    method public void setCheckable(boolean);
-    method public void setChecked(boolean);
-    method public void setClassName(java.lang.CharSequence);
-    method public void setClickable(boolean);
-    method public void setCollectionInfo(java.lang.Object);
-    method public void setCollectionItemInfo(java.lang.Object);
-    method public void setContentDescription(java.lang.CharSequence);
-    method public void setContentInvalid(boolean);
-    method public void setDismissable(boolean);
-    method public void setEditable(boolean);
-    method public void setEnabled(boolean);
-    method public void setError(java.lang.CharSequence);
-    method public void setFocusable(boolean);
-    method public void setFocused(boolean);
-    method public void setInputType(int);
-    method public void setLabelFor(android.view.View);
-    method public void setLabelFor(android.view.View, int);
-    method public void setLabeledBy(android.view.View);
-    method public void setLabeledBy(android.view.View, int);
-    method public void setLiveRegion(int);
-    method public void setLongClickable(boolean);
-    method public void setMaxTextLength(int);
-    method public void setMovementGranularities(int);
-    method public void setMultiLine(boolean);
-    method public void setPackageName(java.lang.CharSequence);
-    method public void setParent(android.view.View);
-    method public void setParent(android.view.View, int);
-    method public void setPassword(boolean);
-    method public void setRangeInfo(android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat);
-    method public void setScrollable(boolean);
-    method public void setSelected(boolean);
-    method public void setSource(android.view.View);
-    method public void setSource(android.view.View, int);
-    method public void setText(java.lang.CharSequence);
-    method public void setTextSelection(int, int);
-    method public void setTraversalAfter(android.view.View);
-    method public void setTraversalAfter(android.view.View, int);
-    method public void setTraversalBefore(android.view.View);
-    method public void setTraversalBefore(android.view.View, int);
-    method public void setViewIdResourceName(java.lang.String);
-    method public void setVisibleToUser(boolean);
-    field public static final int ACTION_ACCESSIBILITY_FOCUS = 64; // 0x40
-    field public static final java.lang.String ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN = "ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN";
-    field public static final java.lang.String ACTION_ARGUMENT_HTML_ELEMENT_STRING = "ACTION_ARGUMENT_HTML_ELEMENT_STRING";
-    field public static final java.lang.String ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT = "ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT";
-    field public static final java.lang.String ACTION_ARGUMENT_SELECTION_END_INT = "ACTION_ARGUMENT_SELECTION_END_INT";
-    field public static final java.lang.String ACTION_ARGUMENT_SELECTION_START_INT = "ACTION_ARGUMENT_SELECTION_START_INT";
-    field public static final java.lang.String ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE = "ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE";
-    field public static final int ACTION_CLEAR_ACCESSIBILITY_FOCUS = 128; // 0x80
-    field public static final int ACTION_CLEAR_FOCUS = 2; // 0x2
-    field public static final int ACTION_CLEAR_SELECTION = 8; // 0x8
-    field public static final int ACTION_CLICK = 16; // 0x10
-    field public static final int ACTION_COLLAPSE = 524288; // 0x80000
-    field public static final int ACTION_COPY = 16384; // 0x4000
-    field public static final int ACTION_CUT = 65536; // 0x10000
-    field public static final int ACTION_DISMISS = 1048576; // 0x100000
-    field public static final int ACTION_EXPAND = 262144; // 0x40000
-    field public static final int ACTION_FOCUS = 1; // 0x1
-    field public static final int ACTION_LONG_CLICK = 32; // 0x20
-    field public static final int ACTION_NEXT_AT_MOVEMENT_GRANULARITY = 256; // 0x100
-    field public static final int ACTION_NEXT_HTML_ELEMENT = 1024; // 0x400
-    field public static final int ACTION_PASTE = 32768; // 0x8000
-    field public static final int ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY = 512; // 0x200
-    field public static final int ACTION_PREVIOUS_HTML_ELEMENT = 2048; // 0x800
-    field public static final int ACTION_SCROLL_BACKWARD = 8192; // 0x2000
-    field public static final int ACTION_SCROLL_FORWARD = 4096; // 0x1000
-    field public static final int ACTION_SELECT = 4; // 0x4
-    field public static final int ACTION_SET_SELECTION = 131072; // 0x20000
-    field public static final int ACTION_SET_TEXT = 2097152; // 0x200000
-    field public static final int FOCUS_ACCESSIBILITY = 2; // 0x2
-    field public static final int FOCUS_INPUT = 1; // 0x1
-    field public static final int MOVEMENT_GRANULARITY_CHARACTER = 1; // 0x1
-    field public static final int MOVEMENT_GRANULARITY_LINE = 4; // 0x4
-    field public static final int MOVEMENT_GRANULARITY_PAGE = 16; // 0x10
-    field public static final int MOVEMENT_GRANULARITY_PARAGRAPH = 8; // 0x8
-    field public static final int MOVEMENT_GRANULARITY_WORD = 2; // 0x2
-  }
-
-  public static class AccessibilityNodeInfoCompat.AccessibilityActionCompat {
-    ctor public AccessibilityNodeInfoCompat.AccessibilityActionCompat(int, java.lang.CharSequence);
-    method public int getId();
-    method public java.lang.CharSequence getLabel();
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_ACCESSIBILITY_FOCUS;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_CLEAR_ACCESSIBILITY_FOCUS;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_CLEAR_FOCUS;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_CLEAR_SELECTION;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_CLICK;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_COLLAPSE;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_COPY;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_CUT;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_DISMISS;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_EXPAND;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_FOCUS;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_LONG_CLICK;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_NEXT_AT_MOVEMENT_GRANULARITY;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_NEXT_HTML_ELEMENT;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PASTE;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PREVIOUS_HTML_ELEMENT;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_SCROLL_BACKWARD;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_SCROLL_FORWARD;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_SELECT;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_SET_SELECTION;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_SET_TEXT;
-  }
-
-  public static class AccessibilityNodeInfoCompat.CollectionInfoCompat {
-    method public int getColumnCount();
-    method public int getRowCount();
-    method public boolean isHierarchical();
-    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat obtain(int, int, boolean, int);
-    field public static final int SELECTION_MODE_MULTIPLE = 2; // 0x2
-    field public static final int SELECTION_MODE_NONE = 0; // 0x0
-    field public static final int SELECTION_MODE_SINGLE = 1; // 0x1
-  }
-
-  public static class AccessibilityNodeInfoCompat.CollectionItemInfoCompat {
-    method public int getColumnIndex();
-    method public int getColumnSpan();
-    method public int getRowIndex();
-    method public int getRowSpan();
-    method public boolean isHeading();
-    method public boolean isSelected();
-    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat obtain(int, int, int, int, boolean, boolean);
-  }
-
-  public static class AccessibilityNodeInfoCompat.RangeInfoCompat {
-    method public float getCurrent();
-    method public float getMax();
-    method public float getMin();
-    method public int getType();
-    field public static final int RANGE_TYPE_FLOAT = 1; // 0x1
-    field public static final int RANGE_TYPE_INT = 0; // 0x0
-    field public static final int RANGE_TYPE_PERCENT = 2; // 0x2
-  }
-
-  public class AccessibilityNodeProviderCompat {
-    ctor public AccessibilityNodeProviderCompat();
-    ctor public AccessibilityNodeProviderCompat(java.lang.Object);
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat createAccessibilityNodeInfo(int);
-    method public java.util.List<android.support.v4.view.accessibility.AccessibilityNodeInfoCompat> findAccessibilityNodeInfosByText(java.lang.String, int);
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat findFocus(int);
-    method public java.lang.Object getProvider();
-    method public boolean performAction(int, int, android.os.Bundle);
-  }
-
-  public class AccessibilityRecordCompat {
-    ctor public deprecated AccessibilityRecordCompat(java.lang.Object);
-    method public int getAddedCount();
-    method public java.lang.CharSequence getBeforeText();
-    method public java.lang.CharSequence getClassName();
-    method public java.lang.CharSequence getContentDescription();
-    method public int getCurrentItemIndex();
-    method public int getFromIndex();
-    method public deprecated java.lang.Object getImpl();
-    method public int getItemCount();
-    method public int getMaxScrollX();
-    method public int getMaxScrollY();
-    method public android.os.Parcelable getParcelableData();
-    method public int getRemovedCount();
-    method public int getScrollX();
-    method public int getScrollY();
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getSource();
-    method public java.util.List<java.lang.CharSequence> getText();
-    method public int getToIndex();
-    method public int getWindowId();
-    method public boolean isChecked();
-    method public boolean isEnabled();
-    method public boolean isFullScreen();
-    method public boolean isPassword();
-    method public boolean isScrollable();
-    method public static android.support.v4.view.accessibility.AccessibilityRecordCompat obtain(android.support.v4.view.accessibility.AccessibilityRecordCompat);
-    method public static android.support.v4.view.accessibility.AccessibilityRecordCompat obtain();
-    method public void recycle();
-    method public void setAddedCount(int);
-    method public void setBeforeText(java.lang.CharSequence);
-    method public void setChecked(boolean);
-    method public void setClassName(java.lang.CharSequence);
-    method public void setContentDescription(java.lang.CharSequence);
-    method public void setCurrentItemIndex(int);
-    method public void setEnabled(boolean);
-    method public void setFromIndex(int);
-    method public void setFullScreen(boolean);
-    method public void setItemCount(int);
-    method public void setMaxScrollX(int);
-    method public void setMaxScrollY(int);
-    method public void setParcelableData(android.os.Parcelable);
-    method public void setPassword(boolean);
-    method public void setRemovedCount(int);
-    method public void setScrollX(int);
-    method public void setScrollY(int);
-    method public void setScrollable(boolean);
-    method public void setSource(android.view.View);
-    method public void setSource(android.view.View, int);
-    method public void setToIndex(int);
-  }
-
-  public class AccessibilityWindowInfoCompat {
-    method public void getBoundsInScreen(android.graphics.Rect);
-    method public android.support.v4.view.accessibility.AccessibilityWindowInfoCompat getChild(int);
-    method public int getChildCount();
-    method public int getId();
-    method public int getLayer();
-    method public android.support.v4.view.accessibility.AccessibilityWindowInfoCompat getParent();
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getRoot();
-    method public int getType();
-    method public boolean isAccessibilityFocused();
-    method public boolean isActive();
-    method public boolean isFocused();
-    method public static android.support.v4.view.accessibility.AccessibilityWindowInfoCompat obtain();
-    method public static android.support.v4.view.accessibility.AccessibilityWindowInfoCompat obtain(android.support.v4.view.accessibility.AccessibilityWindowInfoCompat);
-    method public void recycle();
-    field public static final int TYPE_ACCESSIBILITY_OVERLAY = 4; // 0x4
-    field public static final int TYPE_APPLICATION = 1; // 0x1
-    field public static final int TYPE_INPUT_METHOD = 2; // 0x2
-    field public static final int TYPE_SYSTEM = 3; // 0x3
-  }
-
-}
-
-package android.support.v4.view.animation {
-
-  public class FastOutLinearInInterpolator extends android.support.v4.view.animation.LookupTableInterpolator {
-    ctor public FastOutLinearInInterpolator();
-  }
-
-  public class FastOutSlowInInterpolator extends android.support.v4.view.animation.LookupTableInterpolator {
-    ctor public FastOutSlowInInterpolator();
-  }
-
-  public class LinearOutSlowInInterpolator extends android.support.v4.view.animation.LookupTableInterpolator {
-    ctor public LinearOutSlowInInterpolator();
-  }
-
-   abstract class LookupTableInterpolator implements android.view.animation.Interpolator {
-    ctor public LookupTableInterpolator(float[]);
-    method public float getInterpolation(float);
-  }
-
-  public class PathInterpolatorCompat {
-    method public static android.view.animation.Interpolator create(android.graphics.Path);
-    method public static android.view.animation.Interpolator create(float, float);
-    method public static android.view.animation.Interpolator create(float, float, float, float);
-  }
-
-}
-
-package android.support.v4.widget {
-
-  public abstract class AutoScrollHelper implements android.view.View.OnTouchListener {
-    ctor public AutoScrollHelper(android.view.View);
-    method public abstract boolean canTargetScrollHorizontally(int);
-    method public abstract boolean canTargetScrollVertically(int);
-    method public boolean isEnabled();
-    method public boolean isExclusive();
-    method public boolean onTouch(android.view.View, android.view.MotionEvent);
-    method public abstract void scrollTargetBy(int, int);
-    method public android.support.v4.widget.AutoScrollHelper setActivationDelay(int);
-    method public android.support.v4.widget.AutoScrollHelper setEdgeType(int);
-    method public android.support.v4.widget.AutoScrollHelper setEnabled(boolean);
-    method public android.support.v4.widget.AutoScrollHelper setExclusive(boolean);
-    method public android.support.v4.widget.AutoScrollHelper setMaximumEdges(float, float);
-    method public android.support.v4.widget.AutoScrollHelper setMaximumVelocity(float, float);
-    method public android.support.v4.widget.AutoScrollHelper setMinimumVelocity(float, float);
-    method public android.support.v4.widget.AutoScrollHelper setRampDownDuration(int);
-    method public android.support.v4.widget.AutoScrollHelper setRampUpDuration(int);
-    method public android.support.v4.widget.AutoScrollHelper setRelativeEdges(float, float);
-    method public android.support.v4.widget.AutoScrollHelper setRelativeVelocity(float, float);
-    field public static final int EDGE_TYPE_INSIDE = 0; // 0x0
-    field public static final int EDGE_TYPE_INSIDE_EXTEND = 1; // 0x1
-    field public static final int EDGE_TYPE_OUTSIDE = 2; // 0x2
-    field public static final float NO_MAX = 3.4028235E38f;
-    field public static final float NO_MIN = 0.0f;
-    field public static final float RELATIVE_UNSPECIFIED = 0.0f;
-  }
-
-  public final class CompoundButtonCompat {
-    method public static android.graphics.drawable.Drawable getButtonDrawable(android.widget.CompoundButton);
-    method public static android.content.res.ColorStateList getButtonTintList(android.widget.CompoundButton);
-    method public static android.graphics.PorterDuff.Mode getButtonTintMode(android.widget.CompoundButton);
-    method public static void setButtonTintList(android.widget.CompoundButton, android.content.res.ColorStateList);
-    method public static void setButtonTintMode(android.widget.CompoundButton, android.graphics.PorterDuff.Mode);
-  }
-
-  public class ContentLoadingProgressBar extends android.widget.ProgressBar {
-    ctor public ContentLoadingProgressBar(android.content.Context);
-    ctor public ContentLoadingProgressBar(android.content.Context, android.util.AttributeSet);
-    method public void hide();
-    method public void onAttachedToWindow();
-    method public void onDetachedFromWindow();
-    method public void show();
-  }
-
-  public abstract class CursorAdapter extends android.widget.BaseAdapter {
-    ctor public deprecated CursorAdapter(android.content.Context, android.database.Cursor);
-    ctor public CursorAdapter(android.content.Context, android.database.Cursor, boolean);
-    ctor public CursorAdapter(android.content.Context, android.database.Cursor, int);
-    method public abstract void bindView(android.view.View, android.content.Context, android.database.Cursor);
-    method public void changeCursor(android.database.Cursor);
-    method public java.lang.CharSequence convertToString(android.database.Cursor);
-    method public int getCount();
-    method public android.database.Cursor getCursor();
-    method public android.widget.Filter getFilter();
-    method public android.widget.FilterQueryProvider getFilterQueryProvider();
-    method public java.lang.Object getItem(int);
-    method public long getItemId(int);
-    method public android.view.View getView(int, android.view.View, android.view.ViewGroup);
-    method protected deprecated void init(android.content.Context, android.database.Cursor, boolean);
-    method public android.view.View newDropDownView(android.content.Context, android.database.Cursor, android.view.ViewGroup);
-    method public abstract android.view.View newView(android.content.Context, android.database.Cursor, android.view.ViewGroup);
-    method protected void onContentChanged();
-    method public android.database.Cursor runQueryOnBackgroundThread(java.lang.CharSequence);
-    method public void setFilterQueryProvider(android.widget.FilterQueryProvider);
-    method public android.database.Cursor swapCursor(android.database.Cursor);
-    field public static final deprecated int FLAG_AUTO_REQUERY = 1; // 0x1
-    field public static final int FLAG_REGISTER_CONTENT_OBSERVER = 2; // 0x2
-  }
-
-  public class DrawerLayout extends android.view.ViewGroup {
-    ctor public DrawerLayout(android.content.Context);
-    ctor public DrawerLayout(android.content.Context, android.util.AttributeSet);
-    ctor public DrawerLayout(android.content.Context, android.util.AttributeSet, int);
-    method public void closeDrawer(android.view.View);
-    method public void closeDrawer(int);
-    method public void closeDrawers();
-    method public float getDrawerElevation();
-    method public int getDrawerLockMode(int);
-    method public int getDrawerLockMode(android.view.View);
-    method public java.lang.CharSequence getDrawerTitle(int);
-    method public android.graphics.drawable.Drawable getStatusBarBackgroundDrawable();
-    method public boolean isDrawerOpen(android.view.View);
-    method public boolean isDrawerOpen(int);
-    method public boolean isDrawerVisible(android.view.View);
-    method public boolean isDrawerVisible(int);
-    method public void onDraw(android.graphics.Canvas);
-    method protected void onLayout(boolean, int, int, int, int);
-    method public void openDrawer(android.view.View);
-    method public void openDrawer(int);
-    method public void setDrawerElevation(float);
-    method public void setDrawerListener(android.support.v4.widget.DrawerLayout.DrawerListener);
-    method public void setDrawerLockMode(int);
-    method public void setDrawerLockMode(int, int);
-    method public void setDrawerLockMode(int, android.view.View);
-    method public void setDrawerShadow(android.graphics.drawable.Drawable, int);
-    method public void setDrawerShadow(int, int);
-    method public void setDrawerTitle(int, java.lang.CharSequence);
-    method public void setScrimColor(int);
-    method public void setStatusBarBackground(android.graphics.drawable.Drawable);
-    method public void setStatusBarBackground(int);
-    method public void setStatusBarBackgroundColor(int);
-    field public static final int LOCK_MODE_LOCKED_CLOSED = 1; // 0x1
-    field public static final int LOCK_MODE_LOCKED_OPEN = 2; // 0x2
-    field public static final int LOCK_MODE_UNLOCKED = 0; // 0x0
-    field public static final int STATE_DRAGGING = 1; // 0x1
-    field public static final int STATE_IDLE = 0; // 0x0
-    field public static final int STATE_SETTLING = 2; // 0x2
-  }
-
-  public static abstract interface DrawerLayout.DrawerListener {
-    method public abstract void onDrawerClosed(android.view.View);
-    method public abstract void onDrawerOpened(android.view.View);
-    method public abstract void onDrawerSlide(android.view.View, float);
-    method public abstract void onDrawerStateChanged(int);
-  }
-
-  public static class DrawerLayout.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
-    ctor public DrawerLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public DrawerLayout.LayoutParams(int, int);
-    ctor public DrawerLayout.LayoutParams(int, int, int);
-    ctor public DrawerLayout.LayoutParams(android.support.v4.widget.DrawerLayout.LayoutParams);
-    ctor public DrawerLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public DrawerLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    field public int gravity;
-  }
-
-  protected static class DrawerLayout.SavedState extends android.view.View.BaseSavedState {
-    ctor public DrawerLayout.SavedState(android.os.Parcel);
-    ctor public DrawerLayout.SavedState(android.os.Parcelable);
-    field public static final android.os.Parcelable.Creator<android.support.v4.widget.DrawerLayout.SavedState> CREATOR;
-  }
-
-  public static abstract class DrawerLayout.SimpleDrawerListener implements android.support.v4.widget.DrawerLayout.DrawerListener {
-    ctor public DrawerLayout.SimpleDrawerListener();
-    method public void onDrawerClosed(android.view.View);
-    method public void onDrawerOpened(android.view.View);
-    method public void onDrawerSlide(android.view.View, float);
-    method public void onDrawerStateChanged(int);
-  }
-
-  public class EdgeEffectCompat {
-    ctor public EdgeEffectCompat(android.content.Context);
-    method public boolean draw(android.graphics.Canvas);
-    method public void finish();
-    method public boolean isFinished();
-    method public boolean onAbsorb(int);
-    method public deprecated boolean onPull(float);
-    method public boolean onPull(float, float);
-    method public boolean onRelease();
-    method public void setSize(int, int);
-  }
-
-  public abstract class ExploreByTouchHelper extends android.support.v4.view.AccessibilityDelegateCompat {
-    ctor public ExploreByTouchHelper(android.view.View);
-    method public boolean dispatchHoverEvent(android.view.MotionEvent);
-    method public int getFocusedVirtualView();
-    method protected abstract int getVirtualViewAt(float, float);
-    method protected abstract void getVisibleVirtualViews(java.util.List<java.lang.Integer>);
-    method public void invalidateRoot();
-    method public void invalidateVirtualView(int);
-    method protected abstract boolean onPerformActionForVirtualView(int, int, android.os.Bundle);
-    method protected abstract void onPopulateEventForVirtualView(int, android.view.accessibility.AccessibilityEvent);
-    method public void onPopulateNodeForHost(android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
-    method protected abstract void onPopulateNodeForVirtualView(int, android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
-    method public boolean sendEventForVirtualView(int, int);
-    field public static final int HOST_ID = -1; // 0xffffffff
-    field public static final int INVALID_ID = -2147483648; // 0x80000000
-  }
-
-  public class ListPopupWindowCompat {
-    method public static android.view.View.OnTouchListener createDragToOpenListener(java.lang.Object, android.view.View);
-  }
-
-  public class ListViewAutoScrollHelper extends android.support.v4.widget.AutoScrollHelper {
-    ctor public ListViewAutoScrollHelper(android.widget.ListView);
-    method public boolean canTargetScrollHorizontally(int);
-    method public boolean canTargetScrollVertically(int);
-    method public void scrollTargetBy(int, int);
-  }
-
-  public class NestedScrollView extends android.widget.FrameLayout implements android.support.v4.view.NestedScrollingChild android.support.v4.view.NestedScrollingParent android.support.v4.view.ScrollingView {
-    ctor public NestedScrollView(android.content.Context);
-    ctor public NestedScrollView(android.content.Context, android.util.AttributeSet);
-    ctor public NestedScrollView(android.content.Context, android.util.AttributeSet, int);
-    method public boolean arrowScroll(int);
-    method protected int computeScrollDeltaToGetChildRectOnScreen(android.graphics.Rect);
-    method public boolean executeKeyEvent(android.view.KeyEvent);
-    method public void fling(int);
-    method public boolean fullScroll(int);
-    method public int getMaxScrollAmount();
-    method public boolean isFillViewport();
-    method public boolean isSmoothScrollingEnabled();
-    method public void onAttachedToWindow();
-    method public boolean pageScroll(int);
-    method public void setFillViewport(boolean);
-    method public void setOnScrollChangeListener(android.support.v4.widget.NestedScrollView.OnScrollChangeListener);
-    method public void setSmoothScrollingEnabled(boolean);
-    method public final void smoothScrollBy(int, int);
-    method public final void smoothScrollTo(int, int);
-  }
-
-  public static abstract interface NestedScrollView.OnScrollChangeListener {
-    method public abstract void onScrollChange(android.support.v4.widget.NestedScrollView, int, int, int, int);
-  }
-
-  public class PopupMenuCompat {
-    method public static android.view.View.OnTouchListener getDragToOpenListener(java.lang.Object);
-  }
-
-  public class PopupWindowCompat {
-    method public static boolean getOverlapAnchor(android.widget.PopupWindow);
-    method public static int getWindowLayoutType(android.widget.PopupWindow);
-    method public static void setOverlapAnchor(android.widget.PopupWindow, boolean);
-    method public static void setWindowLayoutType(android.widget.PopupWindow, int);
-    method public static void showAsDropDown(android.widget.PopupWindow, android.view.View, int, int, int);
-  }
-
-  public abstract class ResourceCursorAdapter extends android.support.v4.widget.CursorAdapter {
-    ctor public deprecated ResourceCursorAdapter(android.content.Context, int, android.database.Cursor);
-    ctor public ResourceCursorAdapter(android.content.Context, int, android.database.Cursor, boolean);
-    ctor public ResourceCursorAdapter(android.content.Context, int, android.database.Cursor, int);
-    method public android.view.View newView(android.content.Context, android.database.Cursor, android.view.ViewGroup);
-    method public void setDropDownViewResource(int);
-    method public void setViewResource(int);
-  }
-
-  public class ScrollerCompat {
-    method public void abortAnimation();
-    method public boolean computeScrollOffset();
-    method public static android.support.v4.widget.ScrollerCompat create(android.content.Context);
-    method public static android.support.v4.widget.ScrollerCompat create(android.content.Context, android.view.animation.Interpolator);
-    method public void fling(int, int, int, int, int, int, int, int);
-    method public void fling(int, int, int, int, int, int, int, int, int, int);
-    method public float getCurrVelocity();
-    method public int getCurrX();
-    method public int getCurrY();
-    method public int getFinalX();
-    method public int getFinalY();
-    method public boolean isFinished();
-    method public boolean isOverScrolled();
-    method public void notifyHorizontalEdgeReached(int, int, int);
-    method public void notifyVerticalEdgeReached(int, int, int);
-    method public boolean springBack(int, int, int, int, int, int);
-    method public void startScroll(int, int, int, int);
-    method public void startScroll(int, int, int, int, int);
-  }
-
-  public class SearchViewCompat {
-    method public static java.lang.CharSequence getQuery(android.view.View);
-    method public static boolean isIconified(android.view.View);
-    method public static boolean isQueryRefinementEnabled(android.view.View);
-    method public static boolean isSubmitButtonEnabled(android.view.View);
-    method public static android.view.View newSearchView(android.content.Context);
-    method public static void setIconified(android.view.View, boolean);
-    method public static void setImeOptions(android.view.View, int);
-    method public static void setInputType(android.view.View, int);
-    method public static void setMaxWidth(android.view.View, int);
-    method public static void setOnCloseListener(android.view.View, android.support.v4.widget.SearchViewCompat.OnCloseListenerCompat);
-    method public static void setOnQueryTextListener(android.view.View, android.support.v4.widget.SearchViewCompat.OnQueryTextListenerCompat);
-    method public static void setQuery(android.view.View, java.lang.CharSequence, boolean);
-    method public static void setQueryHint(android.view.View, java.lang.CharSequence);
-    method public static void setQueryRefinementEnabled(android.view.View, boolean);
-    method public static void setSearchableInfo(android.view.View, android.content.ComponentName);
-    method public static void setSubmitButtonEnabled(android.view.View, boolean);
-  }
-
-  public static abstract class SearchViewCompat.OnCloseListenerCompat {
-    ctor public SearchViewCompat.OnCloseListenerCompat();
-    method public boolean onClose();
-  }
-
-  public static abstract class SearchViewCompat.OnQueryTextListenerCompat {
-    ctor public SearchViewCompat.OnQueryTextListenerCompat();
-    method public boolean onQueryTextChange(java.lang.String);
-    method public boolean onQueryTextSubmit(java.lang.String);
-  }
-
-  public class SimpleCursorAdapter extends android.support.v4.widget.ResourceCursorAdapter {
-    ctor public deprecated SimpleCursorAdapter(android.content.Context, int, android.database.Cursor, java.lang.String[], int[]);
-    ctor public SimpleCursorAdapter(android.content.Context, int, android.database.Cursor, java.lang.String[], int[], int);
-    method public void bindView(android.view.View, android.content.Context, android.database.Cursor);
-    method public void changeCursorAndColumns(android.database.Cursor, java.lang.String[], int[]);
-    method public android.support.v4.widget.SimpleCursorAdapter.CursorToStringConverter getCursorToStringConverter();
-    method public int getStringConversionColumn();
-    method public android.support.v4.widget.SimpleCursorAdapter.ViewBinder getViewBinder();
-    method public void setCursorToStringConverter(android.support.v4.widget.SimpleCursorAdapter.CursorToStringConverter);
-    method public void setStringConversionColumn(int);
-    method public void setViewBinder(android.support.v4.widget.SimpleCursorAdapter.ViewBinder);
-    method public void setViewImage(android.widget.ImageView, java.lang.String);
-    method public void setViewText(android.widget.TextView, java.lang.String);
-  }
-
-  public static abstract interface SimpleCursorAdapter.CursorToStringConverter {
-    method public abstract java.lang.CharSequence convertToString(android.database.Cursor);
-  }
-
-  public static abstract interface SimpleCursorAdapter.ViewBinder {
-    method public abstract boolean setViewValue(android.view.View, android.database.Cursor, int);
-  }
-
-  public class SlidingPaneLayout extends android.view.ViewGroup {
-    ctor public SlidingPaneLayout(android.content.Context);
-    ctor public SlidingPaneLayout(android.content.Context, android.util.AttributeSet);
-    ctor public SlidingPaneLayout(android.content.Context, android.util.AttributeSet, int);
-    method protected boolean canScroll(android.view.View, boolean, int, int, int);
-    method public deprecated boolean canSlide();
-    method public boolean closePane();
-    method public int getCoveredFadeColor();
-    method public int getParallaxDistance();
-    method public int getSliderFadeColor();
-    method public boolean isOpen();
-    method public boolean isSlideable();
-    method protected void onLayout(boolean, int, int, int, int);
-    method public boolean openPane();
-    method public void setCoveredFadeColor(int);
-    method public void setPanelSlideListener(android.support.v4.widget.SlidingPaneLayout.PanelSlideListener);
-    method public void setParallaxDistance(int);
-    method public deprecated void setShadowDrawable(android.graphics.drawable.Drawable);
-    method public void setShadowDrawableLeft(android.graphics.drawable.Drawable);
-    method public void setShadowDrawableRight(android.graphics.drawable.Drawable);
-    method public deprecated void setShadowResource(int);
-    method public void setShadowResourceLeft(int);
-    method public void setShadowResourceRight(int);
-    method public void setSliderFadeColor(int);
-    method public deprecated void smoothSlideClosed();
-    method public deprecated void smoothSlideOpen();
-  }
-
-  public static class SlidingPaneLayout.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
-    ctor public SlidingPaneLayout.LayoutParams();
-    ctor public SlidingPaneLayout.LayoutParams(int, int);
-    ctor public SlidingPaneLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public SlidingPaneLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public SlidingPaneLayout.LayoutParams(android.support.v4.widget.SlidingPaneLayout.LayoutParams);
-    ctor public SlidingPaneLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
-    field public float weight;
-  }
-
-  public static abstract interface SlidingPaneLayout.PanelSlideListener {
-    method public abstract void onPanelClosed(android.view.View);
-    method public abstract void onPanelOpened(android.view.View);
-    method public abstract void onPanelSlide(android.view.View, float);
-  }
-
-  public static class SlidingPaneLayout.SimplePanelSlideListener implements android.support.v4.widget.SlidingPaneLayout.PanelSlideListener {
-    ctor public SlidingPaneLayout.SimplePanelSlideListener();
-    method public void onPanelClosed(android.view.View);
-    method public void onPanelOpened(android.view.View);
-    method public void onPanelSlide(android.view.View, float);
-  }
-
-  public class Space extends android.view.View {
-    ctor public Space(android.content.Context, android.util.AttributeSet, int);
-    ctor public Space(android.content.Context, android.util.AttributeSet);
-    ctor public Space(android.content.Context);
-  }
-
-  public class SwipeRefreshLayout extends android.view.ViewGroup implements android.support.v4.view.NestedScrollingChild android.support.v4.view.NestedScrollingParent {
-    ctor public SwipeRefreshLayout(android.content.Context);
-    ctor public SwipeRefreshLayout(android.content.Context, android.util.AttributeSet);
-    method public boolean canChildScrollUp();
-    method public int getProgressCircleDiameter();
-    method public boolean isRefreshing();
-    method protected void onLayout(boolean, int, int, int, int);
-    method public void onMeasure(int, int);
-    method public deprecated void setColorScheme(int...);
-    method public void setColorSchemeColors(int...);
-    method public void setColorSchemeResources(int...);
-    method public void setDistanceToTriggerSync(int);
-    method public void setOnRefreshListener(android.support.v4.widget.SwipeRefreshLayout.OnRefreshListener);
-    method public deprecated void setProgressBackgroundColor(int);
-    method public void setProgressBackgroundColorSchemeColor(int);
-    method public void setProgressBackgroundColorSchemeResource(int);
-    method public void setProgressViewEndTarget(boolean, int);
-    method public void setProgressViewOffset(boolean, int, int);
-    method public void setRefreshing(boolean);
-    method public void setSize(int);
-    field public static final int DEFAULT = 1; // 0x1
-    field public static final int LARGE = 0; // 0x0
-    field protected int mFrom;
-    field protected int mOriginalOffsetTop;
-  }
-
-  public static abstract interface SwipeRefreshLayout.OnRefreshListener {
-    method public abstract void onRefresh();
-  }
-
-  public class TextViewCompat {
-    method public static int getMaxLines(android.widget.TextView);
-    method public static int getMinLines(android.widget.TextView);
-    method public static void setCompoundDrawablesRelative(android.widget.TextView, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable);
-    method public static void setCompoundDrawablesRelativeWithIntrinsicBounds(android.widget.TextView, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable);
-    method public static void setCompoundDrawablesRelativeWithIntrinsicBounds(android.widget.TextView, int, int, int, int);
-  }
-
-  public abstract interface TintableCompoundButton {
-    method public abstract android.content.res.ColorStateList getSupportButtonTintList();
-    method public abstract android.graphics.PorterDuff.Mode getSupportButtonTintMode();
-    method public abstract void setSupportButtonTintList(android.content.res.ColorStateList);
-    method public abstract void setSupportButtonTintMode(android.graphics.PorterDuff.Mode);
-  }
-
-  public class ViewDragHelper {
-    method public void abort();
-    method protected boolean canScroll(android.view.View, boolean, int, int, int, int);
-    method public void cancel();
-    method public void captureChildView(android.view.View, int);
-    method public boolean checkTouchSlop(int);
-    method public boolean checkTouchSlop(int, int);
-    method public boolean continueSettling(boolean);
-    method public static android.support.v4.widget.ViewDragHelper create(android.view.ViewGroup, android.support.v4.widget.ViewDragHelper.Callback);
-    method public static android.support.v4.widget.ViewDragHelper create(android.view.ViewGroup, float, android.support.v4.widget.ViewDragHelper.Callback);
-    method public android.view.View findTopChildUnder(int, int);
-    method public void flingCapturedView(int, int, int, int);
-    method public int getActivePointerId();
-    method public android.view.View getCapturedView();
-    method public int getEdgeSize();
-    method public float getMinVelocity();
-    method public int getTouchSlop();
-    method public int getViewDragState();
-    method public boolean isCapturedViewUnder(int, int);
-    method public boolean isEdgeTouched(int);
-    method public boolean isEdgeTouched(int, int);
-    method public boolean isPointerDown(int);
-    method public boolean isViewUnder(android.view.View, int, int);
-    method public void processTouchEvent(android.view.MotionEvent);
-    method public void setEdgeTrackingEnabled(int);
-    method public void setMinVelocity(float);
-    method public boolean settleCapturedViewAt(int, int);
-    method public boolean shouldInterceptTouchEvent(android.view.MotionEvent);
-    method public boolean smoothSlideViewTo(android.view.View, int, int);
-    field public static final int DIRECTION_ALL = 3; // 0x3
-    field public static final int DIRECTION_HORIZONTAL = 1; // 0x1
-    field public static final int DIRECTION_VERTICAL = 2; // 0x2
-    field public static final int EDGE_ALL = 15; // 0xf
-    field public static final int EDGE_BOTTOM = 8; // 0x8
-    field public static final int EDGE_LEFT = 1; // 0x1
-    field public static final int EDGE_RIGHT = 2; // 0x2
-    field public static final int EDGE_TOP = 4; // 0x4
-    field public static final int INVALID_POINTER = -1; // 0xffffffff
-    field public static final int STATE_DRAGGING = 1; // 0x1
-    field public static final int STATE_IDLE = 0; // 0x0
-    field public static final int STATE_SETTLING = 2; // 0x2
-  }
-
-  public static abstract class ViewDragHelper.Callback {
-    ctor public ViewDragHelper.Callback();
-    method public int clampViewPositionHorizontal(android.view.View, int, int);
-    method public int clampViewPositionVertical(android.view.View, int, int);
-    method public int getOrderedChildIndex(int);
-    method public int getViewHorizontalDragRange(android.view.View);
-    method public int getViewVerticalDragRange(android.view.View);
-    method public void onEdgeDragStarted(int, int);
-    method public boolean onEdgeLock(int);
-    method public void onEdgeTouched(int, int);
-    method public void onViewCaptured(android.view.View, int);
-    method public void onViewDragStateChanged(int);
-    method public void onViewPositionChanged(android.view.View, int, int, int, int);
-    method public void onViewReleased(android.view.View, float, float);
-    method public abstract boolean tryCaptureView(android.view.View, int);
-  }
-
-}
-
diff --git a/v4/api/current.txt b/v4/api/current.txt
deleted file mode 100644
index bda93c5..0000000
--- a/v4/api/current.txt
+++ /dev/null
@@ -1,3761 +0,0 @@
-package android.support.v4.accessibilityservice {
-
-  public final class AccessibilityServiceInfoCompat {
-    method public static java.lang.String capabilityToString(int);
-    method public static java.lang.String feedbackTypeToString(int);
-    method public static java.lang.String flagToString(int);
-    method public static boolean getCanRetrieveWindowContent(android.accessibilityservice.AccessibilityServiceInfo);
-    method public static int getCapabilities(android.accessibilityservice.AccessibilityServiceInfo);
-    method public static java.lang.String getDescription(android.accessibilityservice.AccessibilityServiceInfo);
-    method public static java.lang.String getId(android.accessibilityservice.AccessibilityServiceInfo);
-    method public static android.content.pm.ResolveInfo getResolveInfo(android.accessibilityservice.AccessibilityServiceInfo);
-    method public static java.lang.String getSettingsActivityName(android.accessibilityservice.AccessibilityServiceInfo);
-    field public static final int CAPABILITY_CAN_FILTER_KEY_EVENTS = 8; // 0x8
-    field public static final int CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 4; // 0x4
-    field public static final int CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION = 2; // 0x2
-    field public static final int CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT = 1; // 0x1
-    field public static final int DEFAULT = 1; // 0x1
-    field public static final int FEEDBACK_ALL_MASK = -1; // 0xffffffff
-    field public static final int FEEDBACK_BRAILLE = 32; // 0x20
-    field public static final int FLAG_INCLUDE_NOT_IMPORTANT_VIEWS = 2; // 0x2
-    field public static final int FLAG_REPORT_VIEW_IDS = 16; // 0x10
-    field public static final int FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 8; // 0x8
-    field public static final int FLAG_REQUEST_FILTER_KEY_EVENTS = 32; // 0x20
-    field public static final int FLAG_REQUEST_TOUCH_EXPLORATION_MODE = 4; // 0x4
-  }
-
-}
-
-package android.support.v4.app {
-
-  public deprecated class ActionBarDrawerToggle implements android.support.v4.widget.DrawerLayout.DrawerListener {
-    ctor public ActionBarDrawerToggle(android.app.Activity, android.support.v4.widget.DrawerLayout, int, int, int);
-    ctor public ActionBarDrawerToggle(android.app.Activity, android.support.v4.widget.DrawerLayout, boolean, int, int, int);
-    method public boolean isDrawerIndicatorEnabled();
-    method public void onConfigurationChanged(android.content.res.Configuration);
-    method public void onDrawerClosed(android.view.View);
-    method public void onDrawerOpened(android.view.View);
-    method public void onDrawerSlide(android.view.View, float);
-    method public void onDrawerStateChanged(int);
-    method public boolean onOptionsItemSelected(android.view.MenuItem);
-    method public void setDrawerIndicatorEnabled(boolean);
-    method public void setHomeAsUpIndicator(android.graphics.drawable.Drawable);
-    method public void setHomeAsUpIndicator(int);
-    method public void syncState();
-  }
-
-  public static abstract interface ActionBarDrawerToggle.Delegate {
-    method public abstract android.graphics.drawable.Drawable getThemeUpIndicator();
-    method public abstract void setActionBarDescription(int);
-    method public abstract void setActionBarUpIndicator(android.graphics.drawable.Drawable, int);
-  }
-
-  public static abstract interface ActionBarDrawerToggle.DelegateProvider {
-    method public abstract android.support.v4.app.ActionBarDrawerToggle.Delegate getDrawerToggleDelegate();
-  }
-
-  public class ActivityCompat extends android.support.v4.content.ContextCompat {
-    ctor public ActivityCompat();
-    method public static void finishAffinity(android.app.Activity);
-    method public static void finishAfterTransition(android.app.Activity);
-    method public android.net.Uri getReferrer(android.app.Activity);
-    method public static boolean invalidateOptionsMenu(android.app.Activity);
-    method public static void postponeEnterTransition(android.app.Activity);
-    method public static void requestPermissions(android.app.Activity, java.lang.String[], int);
-    method public static void setEnterSharedElementCallback(android.app.Activity, android.support.v4.app.SharedElementCallback);
-    method public static void setExitSharedElementCallback(android.app.Activity, android.support.v4.app.SharedElementCallback);
-    method public static boolean shouldShowRequestPermissionRationale(android.app.Activity, java.lang.String);
-    method public static void startActivity(android.app.Activity, android.content.Intent, android.os.Bundle);
-    method public static void startActivityForResult(android.app.Activity, android.content.Intent, int, android.os.Bundle);
-    method public static void startIntentSenderForResult(android.app.Activity, android.content.IntentSender, int, android.content.Intent, int, int, int, android.os.Bundle) throws android.content.IntentSender.SendIntentException;
-    method public static void startPostponedEnterTransition(android.app.Activity);
-  }
-
-  public static abstract interface ActivityCompat.OnRequestPermissionsResultCallback {
-    method public abstract void onRequestPermissionsResult(int, java.lang.String[], int[]);
-  }
-
-  public final class ActivityManagerCompat {
-    method public static boolean isLowRamDevice(android.app.ActivityManager);
-  }
-
-  public class ActivityOptionsCompat {
-    ctor protected ActivityOptionsCompat();
-    method public static android.support.v4.app.ActivityOptionsCompat makeCustomAnimation(android.content.Context, int, int);
-    method public static android.support.v4.app.ActivityOptionsCompat makeScaleUpAnimation(android.view.View, int, int, int, int);
-    method public static android.support.v4.app.ActivityOptionsCompat makeSceneTransitionAnimation(android.app.Activity, android.view.View, java.lang.String);
-    method public static android.support.v4.app.ActivityOptionsCompat makeSceneTransitionAnimation(android.app.Activity, android.support.v4.util.Pair<android.view.View, java.lang.String>...);
-    method public static android.support.v4.app.ActivityOptionsCompat makeThumbnailScaleUpAnimation(android.view.View, android.graphics.Bitmap, int, int);
-    method public android.os.Bundle toBundle();
-    method public void update(android.support.v4.app.ActivityOptionsCompat);
-  }
-
-  public class AppLaunchChecker {
-    ctor public AppLaunchChecker();
-    method public static boolean hasStartedFromLauncher(android.content.Context);
-    method public static void onActivityCreate(android.app.Activity);
-  }
-
-  public final class AppOpsManagerCompat {
-    method public static int noteOp(android.content.Context, java.lang.String, int, java.lang.String);
-    method public static int noteProxyOp(android.content.Context, java.lang.String, java.lang.String);
-    method public static java.lang.String permissionToOp(java.lang.String);
-    field public static final int MODE_ALLOWED = 0; // 0x0
-    field public static final int MODE_DEFAULT = 3; // 0x3
-    field public static final int MODE_IGNORED = 1; // 0x1
-  }
-
-  public final class BundleCompat {
-    method public static android.os.IBinder getBinder(android.os.Bundle, java.lang.String);
-    method public static void putBinder(android.os.Bundle, java.lang.String, android.os.IBinder);
-  }
-
-  public class DialogFragment extends android.support.v4.app.Fragment implements android.content.DialogInterface.OnCancelListener android.content.DialogInterface.OnDismissListener {
-    ctor public DialogFragment();
-    method public void dismiss();
-    method public void dismissAllowingStateLoss();
-    method public android.app.Dialog getDialog();
-    method public boolean getShowsDialog();
-    method public int getTheme();
-    method public boolean isCancelable();
-    method public void onCancel(android.content.DialogInterface);
-    method public android.app.Dialog onCreateDialog(android.os.Bundle);
-    method public void onDismiss(android.content.DialogInterface);
-    method public void setCancelable(boolean);
-    method public void setShowsDialog(boolean);
-    method public void setStyle(int, int);
-    method public void show(android.support.v4.app.FragmentManager, java.lang.String);
-    method public int show(android.support.v4.app.FragmentTransaction, java.lang.String);
-    field public static final int STYLE_NORMAL = 0; // 0x0
-    field public static final int STYLE_NO_FRAME = 2; // 0x2
-    field public static final int STYLE_NO_INPUT = 3; // 0x3
-    field public static final int STYLE_NO_TITLE = 1; // 0x1
-  }
-
-  public class Fragment implements android.content.ComponentCallbacks android.view.View.OnCreateContextMenuListener {
-    ctor public Fragment();
-    method public void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
-    method public final boolean equals(java.lang.Object);
-    method public final android.support.v4.app.FragmentActivity getActivity();
-    method public boolean getAllowEnterTransitionOverlap();
-    method public boolean getAllowReturnTransitionOverlap();
-    method public final android.os.Bundle getArguments();
-    method public final android.support.v4.app.FragmentManager getChildFragmentManager();
-    method public android.content.Context getContext();
-    method public java.lang.Object getEnterTransition();
-    method public java.lang.Object getExitTransition();
-    method public final android.support.v4.app.FragmentManager getFragmentManager();
-    method public final java.lang.Object getHost();
-    method public final int getId();
-    method public android.support.v4.app.LoaderManager getLoaderManager();
-    method public final android.support.v4.app.Fragment getParentFragment();
-    method public java.lang.Object getReenterTransition();
-    method public final android.content.res.Resources getResources();
-    method public final boolean getRetainInstance();
-    method public java.lang.Object getReturnTransition();
-    method public java.lang.Object getSharedElementEnterTransition();
-    method public java.lang.Object getSharedElementReturnTransition();
-    method public final java.lang.String getString(int);
-    method public final java.lang.String getString(int, java.lang.Object...);
-    method public final java.lang.String getTag();
-    method public final android.support.v4.app.Fragment getTargetFragment();
-    method public final int getTargetRequestCode();
-    method public final java.lang.CharSequence getText(int);
-    method public boolean getUserVisibleHint();
-    method public android.view.View getView();
-    method public final int hashCode();
-    method public static android.support.v4.app.Fragment instantiate(android.content.Context, java.lang.String);
-    method public static android.support.v4.app.Fragment instantiate(android.content.Context, java.lang.String, android.os.Bundle);
-    method public final boolean isAdded();
-    method public final boolean isDetached();
-    method public final boolean isHidden();
-    method public final boolean isInLayout();
-    method public final boolean isRemoving();
-    method public final boolean isResumed();
-    method public final boolean isVisible();
-    method public void onActivityCreated(android.os.Bundle);
-    method public void onActivityResult(int, int, android.content.Intent);
-    method public void onAttach(android.content.Context);
-    method public deprecated void onAttach(android.app.Activity);
-    method public void onAttachFragment(android.support.v4.app.Fragment);
-    method public void onConfigurationChanged(android.content.res.Configuration);
-    method public boolean onContextItemSelected(android.view.MenuItem);
-    method public void onCreate(android.os.Bundle);
-    method public android.view.animation.Animation onCreateAnimation(int, boolean, int);
-    method public void onCreateContextMenu(android.view.ContextMenu, android.view.View, android.view.ContextMenu.ContextMenuInfo);
-    method public void onCreateOptionsMenu(android.view.Menu, android.view.MenuInflater);
-    method public android.view.View onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
-    method public void onDestroy();
-    method public void onDestroyOptionsMenu();
-    method public void onDestroyView();
-    method public void onDetach();
-    method public void onHiddenChanged(boolean);
-    method public void onInflate(android.content.Context, android.util.AttributeSet, android.os.Bundle);
-    method public deprecated void onInflate(android.app.Activity, android.util.AttributeSet, android.os.Bundle);
-    method public void onLowMemory();
-    method public void onMultiWindowModeChanged(boolean);
-    method public boolean onOptionsItemSelected(android.view.MenuItem);
-    method public void onOptionsMenuClosed(android.view.Menu);
-    method public void onPause();
-    method public void onPictureInPictureModeChanged(boolean);
-    method public void onPrepareOptionsMenu(android.view.Menu);
-    method public void onRequestPermissionsResult(int, java.lang.String[], int[]);
-    method public void onResume();
-    method public void onSaveInstanceState(android.os.Bundle);
-    method public void onStart();
-    method public void onStop();
-    method public void onViewCreated(android.view.View, android.os.Bundle);
-    method public void onViewStateRestored(android.os.Bundle);
-    method public void registerForContextMenu(android.view.View);
-    method public final void requestPermissions(java.lang.String[], int);
-    method public void setAllowEnterTransitionOverlap(boolean);
-    method public void setAllowReturnTransitionOverlap(boolean);
-    method public void setArguments(android.os.Bundle);
-    method public void setEnterSharedElementCallback(android.support.v4.app.SharedElementCallback);
-    method public void setEnterTransition(java.lang.Object);
-    method public void setExitSharedElementCallback(android.support.v4.app.SharedElementCallback);
-    method public void setExitTransition(java.lang.Object);
-    method public void setHasOptionsMenu(boolean);
-    method public void setInitialSavedState(android.support.v4.app.Fragment.SavedState);
-    method public void setMenuVisibility(boolean);
-    method public void setReenterTransition(java.lang.Object);
-    method public void setRetainInstance(boolean);
-    method public void setReturnTransition(java.lang.Object);
-    method public void setSharedElementEnterTransition(java.lang.Object);
-    method public void setSharedElementReturnTransition(java.lang.Object);
-    method public void setTargetFragment(android.support.v4.app.Fragment, int);
-    method public void setUserVisibleHint(boolean);
-    method public boolean shouldShowRequestPermissionRationale(java.lang.String);
-    method public void startActivity(android.content.Intent);
-    method public void startActivity(android.content.Intent, android.os.Bundle);
-    method public void startActivityForResult(android.content.Intent, int);
-    method public void startActivityForResult(android.content.Intent, int, android.os.Bundle);
-    method public void startIntentSenderForResult(android.content.IntentSender, int, android.content.Intent, int, int, int, android.os.Bundle) throws android.content.IntentSender.SendIntentException;
-    method public void unregisterForContextMenu(android.view.View);
-  }
-
-  public static class Fragment.InstantiationException extends java.lang.RuntimeException {
-    ctor public Fragment.InstantiationException(java.lang.String, java.lang.Exception);
-  }
-
-  public static class Fragment.SavedState implements android.os.Parcelable {
-    method public int describeContents();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.support.v4.app.Fragment.SavedState> CREATOR;
-  }
-
-  public class FragmentActivity extends android.app.Activity implements android.support.v4.app.ActivityCompat.OnRequestPermissionsResultCallback {
-    ctor public FragmentActivity();
-    method public java.lang.Object getLastCustomNonConfigurationInstance();
-    method public android.support.v4.app.FragmentManager getSupportFragmentManager();
-    method public android.support.v4.app.LoaderManager getSupportLoaderManager();
-    method public final android.support.v4.media.session.MediaControllerCompat getSupportMediaController();
-    method public void onAttachFragment(android.support.v4.app.Fragment);
-    method protected void onResumeFragments();
-    method public java.lang.Object onRetainCustomNonConfigurationInstance();
-    method public final java.lang.Object onRetainNonConfigurationInstance();
-    method public void setEnterSharedElementCallback(android.support.v4.app.SharedElementCallback);
-    method public void setExitSharedElementCallback(android.support.v4.app.SharedElementCallback);
-    method public final void setSupportMediaController(android.support.v4.media.session.MediaControllerCompat);
-    method public void startActivityFromFragment(android.support.v4.app.Fragment, android.content.Intent, int);
-    method public void startActivityFromFragment(android.support.v4.app.Fragment, android.content.Intent, int, android.os.Bundle);
-    method public void startIntentSenderFromFragment(android.support.v4.app.Fragment, android.content.IntentSender, int, android.content.Intent, int, int, int, android.os.Bundle) throws android.content.IntentSender.SendIntentException;
-    method public void supportFinishAfterTransition();
-    method public void supportInvalidateOptionsMenu();
-    method public void supportPostponeEnterTransition();
-    method public void supportStartPostponedEnterTransition();
-    method public final void validateRequestPermissionsRequestCode(int);
-  }
-
-  public abstract class FragmentContainer {
-    ctor public FragmentContainer();
-    method public abstract android.view.View onFindViewById(int);
-    method public abstract boolean onHasView();
-  }
-
-  public class FragmentController {
-    method public void attachHost(android.support.v4.app.Fragment);
-    method public static final android.support.v4.app.FragmentController createController(android.support.v4.app.FragmentHostCallback<?>);
-    method public void dispatchActivityCreated();
-    method public void dispatchConfigurationChanged(android.content.res.Configuration);
-    method public boolean dispatchContextItemSelected(android.view.MenuItem);
-    method public void dispatchCreate();
-    method public boolean dispatchCreateOptionsMenu(android.view.Menu, android.view.MenuInflater);
-    method public void dispatchDestroy();
-    method public void dispatchDestroyView();
-    method public void dispatchLowMemory();
-    method public void dispatchMultiWindowModeChanged(boolean);
-    method public boolean dispatchOptionsItemSelected(android.view.MenuItem);
-    method public void dispatchOptionsMenuClosed(android.view.Menu);
-    method public void dispatchPause();
-    method public void dispatchPictureInPictureModeChanged(boolean);
-    method public boolean dispatchPrepareOptionsMenu(android.view.Menu);
-    method public void dispatchReallyStop();
-    method public void dispatchResume();
-    method public void dispatchStart();
-    method public void dispatchStop();
-    method public void doLoaderDestroy();
-    method public void doLoaderRetain();
-    method public void doLoaderStart();
-    method public void doLoaderStop(boolean);
-    method public void dumpLoaders(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
-    method public boolean execPendingActions();
-    method public java.util.List<android.support.v4.app.Fragment> getActiveFragments(java.util.List<android.support.v4.app.Fragment>);
-    method public int getActiveFragmentsCount();
-    method public android.support.v4.app.FragmentManager getSupportFragmentManager();
-    method public android.support.v4.app.LoaderManager getSupportLoaderManager();
-    method public void noteStateNotSaved();
-    method public android.view.View onCreateView(android.view.View, java.lang.String, android.content.Context, android.util.AttributeSet);
-    method public void reportLoaderStart();
-    method public deprecated void restoreAllState(android.os.Parcelable, java.util.List<android.support.v4.app.Fragment>);
-    method public void restoreAllState(android.os.Parcelable, android.support.v4.app.FragmentManagerNonConfig);
-    method public void restoreLoaderNonConfig(android.support.v4.util.SimpleArrayMap<java.lang.String, android.support.v4.app.LoaderManager>);
-    method public android.support.v4.util.SimpleArrayMap<java.lang.String, android.support.v4.app.LoaderManager> retainLoaderNonConfig();
-    method public android.support.v4.app.FragmentManagerNonConfig retainNestedNonConfig();
-    method public deprecated java.util.List<android.support.v4.app.Fragment> retainNonConfig();
-    method public android.os.Parcelable saveAllState();
-  }
-
-  public abstract class FragmentHostCallback extends android.support.v4.app.FragmentContainer {
-    ctor public FragmentHostCallback(android.content.Context, android.os.Handler, int);
-    method public void onDump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
-    method public android.view.View onFindViewById(int);
-    method public abstract E onGetHost();
-    method public android.view.LayoutInflater onGetLayoutInflater();
-    method public int onGetWindowAnimations();
-    method public boolean onHasView();
-    method public boolean onHasWindowAnimations();
-    method public void onRequestPermissionsFromFragment(android.support.v4.app.Fragment, java.lang.String[], int);
-    method public boolean onShouldSaveFragmentState(android.support.v4.app.Fragment);
-    method public boolean onShouldShowRequestPermissionRationale(java.lang.String);
-    method public void onStartActivityFromFragment(android.support.v4.app.Fragment, android.content.Intent, int);
-    method public void onStartActivityFromFragment(android.support.v4.app.Fragment, android.content.Intent, int, android.os.Bundle);
-    method public void onStartIntentSenderFromFragment(android.support.v4.app.Fragment, android.content.IntentSender, int, android.content.Intent, int, int, int, android.os.Bundle) throws android.content.IntentSender.SendIntentException;
-    method public void onSupportInvalidateOptionsMenu();
-  }
-
-  public abstract class FragmentManager {
-    ctor public FragmentManager();
-    method public abstract void addOnBackStackChangedListener(android.support.v4.app.FragmentManager.OnBackStackChangedListener);
-    method public abstract android.support.v4.app.FragmentTransaction beginTransaction();
-    method public abstract void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
-    method public static void enableDebugLogging(boolean);
-    method public abstract boolean executePendingTransactions();
-    method public abstract android.support.v4.app.Fragment findFragmentById(int);
-    method public abstract android.support.v4.app.Fragment findFragmentByTag(java.lang.String);
-    method public abstract android.support.v4.app.FragmentManager.BackStackEntry getBackStackEntryAt(int);
-    method public abstract int getBackStackEntryCount();
-    method public abstract android.support.v4.app.Fragment getFragment(android.os.Bundle, java.lang.String);
-    method public abstract boolean isDestroyed();
-    method public abstract void popBackStack();
-    method public abstract void popBackStack(java.lang.String, int);
-    method public abstract void popBackStack(int, int);
-    method public abstract boolean popBackStackImmediate();
-    method public abstract boolean popBackStackImmediate(java.lang.String, int);
-    method public abstract boolean popBackStackImmediate(int, int);
-    method public abstract void putFragment(android.os.Bundle, java.lang.String, android.support.v4.app.Fragment);
-    method public abstract void removeOnBackStackChangedListener(android.support.v4.app.FragmentManager.OnBackStackChangedListener);
-    method public abstract android.support.v4.app.Fragment.SavedState saveFragmentInstanceState(android.support.v4.app.Fragment);
-    field public static final int POP_BACK_STACK_INCLUSIVE = 1; // 0x1
-  }
-
-  public static abstract interface FragmentManager.BackStackEntry {
-    method public abstract java.lang.CharSequence getBreadCrumbShortTitle();
-    method public abstract int getBreadCrumbShortTitleRes();
-    method public abstract java.lang.CharSequence getBreadCrumbTitle();
-    method public abstract int getBreadCrumbTitleRes();
-    method public abstract int getId();
-    method public abstract java.lang.String getName();
-  }
-
-  public static abstract interface FragmentManager.OnBackStackChangedListener {
-    method public abstract void onBackStackChanged();
-  }
-
-  public class FragmentManagerNonConfig {
-  }
-
-  public abstract class FragmentPagerAdapter extends android.support.v4.view.PagerAdapter {
-    ctor public FragmentPagerAdapter(android.support.v4.app.FragmentManager);
-    method public abstract android.support.v4.app.Fragment getItem(int);
-    method public long getItemId(int);
-    method public boolean isViewFromObject(android.view.View, java.lang.Object);
-  }
-
-  public abstract class FragmentStatePagerAdapter extends android.support.v4.view.PagerAdapter {
-    ctor public FragmentStatePagerAdapter(android.support.v4.app.FragmentManager);
-    method public abstract android.support.v4.app.Fragment getItem(int);
-    method public boolean isViewFromObject(android.view.View, java.lang.Object);
-  }
-
-  public class FragmentTabHost extends android.widget.TabHost implements android.widget.TabHost.OnTabChangeListener {
-    ctor public FragmentTabHost(android.content.Context);
-    ctor public FragmentTabHost(android.content.Context, android.util.AttributeSet);
-    method public void addTab(android.widget.TabHost.TabSpec, java.lang.Class<?>, android.os.Bundle);
-    method public void onTabChanged(java.lang.String);
-    method public void setup(android.content.Context, android.support.v4.app.FragmentManager);
-    method public void setup(android.content.Context, android.support.v4.app.FragmentManager, int);
-  }
-
-  public abstract class FragmentTransaction {
-    ctor public FragmentTransaction();
-    method public abstract android.support.v4.app.FragmentTransaction add(android.support.v4.app.Fragment, java.lang.String);
-    method public abstract android.support.v4.app.FragmentTransaction add(int, android.support.v4.app.Fragment);
-    method public abstract android.support.v4.app.FragmentTransaction add(int, android.support.v4.app.Fragment, java.lang.String);
-    method public abstract android.support.v4.app.FragmentTransaction addSharedElement(android.view.View, java.lang.String);
-    method public abstract android.support.v4.app.FragmentTransaction addToBackStack(java.lang.String);
-    method public abstract android.support.v4.app.FragmentTransaction attach(android.support.v4.app.Fragment);
-    method public abstract int commit();
-    method public abstract int commitAllowingStateLoss();
-    method public abstract void commitNow();
-    method public abstract void commitNowAllowingStateLoss();
-    method public abstract android.support.v4.app.FragmentTransaction detach(android.support.v4.app.Fragment);
-    method public abstract android.support.v4.app.FragmentTransaction disallowAddToBackStack();
-    method public abstract android.support.v4.app.FragmentTransaction hide(android.support.v4.app.Fragment);
-    method public abstract boolean isAddToBackStackAllowed();
-    method public abstract boolean isEmpty();
-    method public abstract android.support.v4.app.FragmentTransaction remove(android.support.v4.app.Fragment);
-    method public abstract android.support.v4.app.FragmentTransaction replace(int, android.support.v4.app.Fragment);
-    method public abstract android.support.v4.app.FragmentTransaction replace(int, android.support.v4.app.Fragment, java.lang.String);
-    method public abstract android.support.v4.app.FragmentTransaction setBreadCrumbShortTitle(int);
-    method public abstract android.support.v4.app.FragmentTransaction setBreadCrumbShortTitle(java.lang.CharSequence);
-    method public abstract android.support.v4.app.FragmentTransaction setBreadCrumbTitle(int);
-    method public abstract android.support.v4.app.FragmentTransaction setBreadCrumbTitle(java.lang.CharSequence);
-    method public abstract android.support.v4.app.FragmentTransaction setCustomAnimations(int, int);
-    method public abstract android.support.v4.app.FragmentTransaction setCustomAnimations(int, int, int, int);
-    method public abstract android.support.v4.app.FragmentTransaction setTransition(int);
-    method public abstract android.support.v4.app.FragmentTransaction setTransitionStyle(int);
-    method public abstract android.support.v4.app.FragmentTransaction show(android.support.v4.app.Fragment);
-    field public static final int TRANSIT_ENTER_MASK = 4096; // 0x1000
-    field public static final int TRANSIT_EXIT_MASK = 8192; // 0x2000
-    field public static final int TRANSIT_FRAGMENT_CLOSE = 8194; // 0x2002
-    field public static final int TRANSIT_FRAGMENT_FADE = 4099; // 0x1003
-    field public static final int TRANSIT_FRAGMENT_OPEN = 4097; // 0x1001
-    field public static final int TRANSIT_NONE = 0; // 0x0
-    field public static final int TRANSIT_UNSET = -1; // 0xffffffff
-  }
-
-  public class ListFragment extends android.support.v4.app.Fragment {
-    ctor public ListFragment();
-    method public android.widget.ListAdapter getListAdapter();
-    method public android.widget.ListView getListView();
-    method public long getSelectedItemId();
-    method public int getSelectedItemPosition();
-    method public void onListItemClick(android.widget.ListView, android.view.View, int, long);
-    method public void setEmptyText(java.lang.CharSequence);
-    method public void setListAdapter(android.widget.ListAdapter);
-    method public void setListShown(boolean);
-    method public void setListShownNoAnimation(boolean);
-    method public void setSelection(int);
-  }
-
-  public abstract class LoaderManager {
-    ctor public LoaderManager();
-    method public abstract void destroyLoader(int);
-    method public abstract void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
-    method public static void enableDebugLogging(boolean);
-    method public abstract android.support.v4.content.Loader<D> getLoader(int);
-    method public boolean hasRunningLoaders();
-    method public abstract android.support.v4.content.Loader<D> initLoader(int, android.os.Bundle, android.support.v4.app.LoaderManager.LoaderCallbacks<D>);
-    method public abstract android.support.v4.content.Loader<D> restartLoader(int, android.os.Bundle, android.support.v4.app.LoaderManager.LoaderCallbacks<D>);
-  }
-
-  public static abstract interface LoaderManager.LoaderCallbacks {
-    method public abstract android.support.v4.content.Loader<D> onCreateLoader(int, android.os.Bundle);
-    method public abstract void onLoadFinished(android.support.v4.content.Loader<D>, D);
-    method public abstract void onLoaderReset(android.support.v4.content.Loader<D>);
-  }
-
-  public final class NavUtils {
-    method public static android.content.Intent getParentActivityIntent(android.app.Activity);
-    method public static android.content.Intent getParentActivityIntent(android.content.Context, java.lang.Class<?>) throws android.content.pm.PackageManager.NameNotFoundException;
-    method public static android.content.Intent getParentActivityIntent(android.content.Context, android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
-    method public static java.lang.String getParentActivityName(android.app.Activity);
-    method public static java.lang.String getParentActivityName(android.content.Context, android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
-    method public static void navigateUpFromSameTask(android.app.Activity);
-    method public static void navigateUpTo(android.app.Activity, android.content.Intent);
-    method public static boolean shouldUpRecreateTask(android.app.Activity, android.content.Intent);
-    field public static final java.lang.String PARENT_ACTIVITY = "android.support.PARENT_ACTIVITY";
-  }
-
-  public class NotificationCompat {
-    ctor public NotificationCompat();
-    method public static android.support.v4.app.NotificationCompat.Action getAction(android.app.Notification, int);
-    method public static int getActionCount(android.app.Notification);
-    method public static java.lang.String getCategory(android.app.Notification);
-    method public static android.os.Bundle getExtras(android.app.Notification);
-    method public static java.lang.String getGroup(android.app.Notification);
-    method public static boolean getLocalOnly(android.app.Notification);
-    method public static java.lang.String getSortKey(android.app.Notification);
-    method public static boolean isGroupSummary(android.app.Notification);
-    field public static final java.lang.String CATEGORY_ALARM = "alarm";
-    field public static final java.lang.String CATEGORY_CALL = "call";
-    field public static final java.lang.String CATEGORY_EMAIL = "email";
-    field public static final java.lang.String CATEGORY_ERROR = "err";
-    field public static final java.lang.String CATEGORY_EVENT = "event";
-    field public static final java.lang.String CATEGORY_MESSAGE = "msg";
-    field public static final java.lang.String CATEGORY_PROGRESS = "progress";
-    field public static final java.lang.String CATEGORY_PROMO = "promo";
-    field public static final java.lang.String CATEGORY_RECOMMENDATION = "recommendation";
-    field public static final java.lang.String CATEGORY_REMINDER = "reminder";
-    field public static final java.lang.String CATEGORY_SERVICE = "service";
-    field public static final java.lang.String CATEGORY_SOCIAL = "social";
-    field public static final java.lang.String CATEGORY_STATUS = "status";
-    field public static final java.lang.String CATEGORY_SYSTEM = "sys";
-    field public static final java.lang.String CATEGORY_TRANSPORT = "transport";
-    field public static final int COLOR_DEFAULT = 0; // 0x0
-    field public static final int DEFAULT_ALL = -1; // 0xffffffff
-    field public static final int DEFAULT_LIGHTS = 4; // 0x4
-    field public static final int DEFAULT_SOUND = 1; // 0x1
-    field public static final int DEFAULT_VIBRATE = 2; // 0x2
-    field public static final java.lang.String EXTRA_BACKGROUND_IMAGE_URI = "android.backgroundImageUri";
-    field public static final java.lang.String EXTRA_BIG_TEXT = "android.bigText";
-    field public static final java.lang.String EXTRA_COMPACT_ACTIONS = "android.compactActions";
-    field public static final java.lang.String EXTRA_CONVERSATION_TITLE = "android.conversationTitle";
-    field public static final java.lang.String EXTRA_INFO_TEXT = "android.infoText";
-    field public static final java.lang.String EXTRA_LARGE_ICON = "android.largeIcon";
-    field public static final java.lang.String EXTRA_LARGE_ICON_BIG = "android.largeIcon.big";
-    field public static final java.lang.String EXTRA_MEDIA_SESSION = "android.mediaSession";
-    field public static final java.lang.String EXTRA_MESSAGES = "android.messages";
-    field public static final java.lang.String EXTRA_PEOPLE = "android.people";
-    field public static final java.lang.String EXTRA_PICTURE = "android.picture";
-    field public static final java.lang.String EXTRA_PROGRESS = "android.progress";
-    field public static final java.lang.String EXTRA_PROGRESS_INDETERMINATE = "android.progressIndeterminate";
-    field public static final java.lang.String EXTRA_PROGRESS_MAX = "android.progressMax";
-    field public static final java.lang.String EXTRA_REMOTE_INPUT_HISTORY = "android.remoteInputHistory";
-    field public static final java.lang.String EXTRA_SELF_DISPLAY_NAME = "android.selfDisplayName";
-    field public static final java.lang.String EXTRA_SHOW_CHRONOMETER = "android.showChronometer";
-    field public static final java.lang.String EXTRA_SHOW_WHEN = "android.showWhen";
-    field public static final java.lang.String EXTRA_SMALL_ICON = "android.icon";
-    field public static final java.lang.String EXTRA_SUB_TEXT = "android.subText";
-    field public static final java.lang.String EXTRA_SUMMARY_TEXT = "android.summaryText";
-    field public static final java.lang.String EXTRA_TEMPLATE = "android.template";
-    field public static final java.lang.String EXTRA_TEXT = "android.text";
-    field public static final java.lang.String EXTRA_TEXT_LINES = "android.textLines";
-    field public static final java.lang.String EXTRA_TITLE = "android.title";
-    field public static final java.lang.String EXTRA_TITLE_BIG = "android.title.big";
-    field public static final int FLAG_AUTO_CANCEL = 16; // 0x10
-    field public static final int FLAG_FOREGROUND_SERVICE = 64; // 0x40
-    field public static final int FLAG_GROUP_SUMMARY = 512; // 0x200
-    field public static final deprecated int FLAG_HIGH_PRIORITY = 128; // 0x80
-    field public static final int FLAG_INSISTENT = 4; // 0x4
-    field public static final int FLAG_LOCAL_ONLY = 256; // 0x100
-    field public static final int FLAG_NO_CLEAR = 32; // 0x20
-    field public static final int FLAG_ONGOING_EVENT = 2; // 0x2
-    field public static final int FLAG_ONLY_ALERT_ONCE = 8; // 0x8
-    field public static final int FLAG_SHOW_LIGHTS = 1; // 0x1
-    field public static final int PRIORITY_DEFAULT = 0; // 0x0
-    field public static final int PRIORITY_HIGH = 1; // 0x1
-    field public static final int PRIORITY_LOW = -1; // 0xffffffff
-    field public static final int PRIORITY_MAX = 2; // 0x2
-    field public static final int PRIORITY_MIN = -2; // 0xfffffffe
-    field public static final int STREAM_DEFAULT = -1; // 0xffffffff
-    field public static final int VISIBILITY_PRIVATE = 0; // 0x0
-    field public static final int VISIBILITY_PUBLIC = 1; // 0x1
-    field public static final int VISIBILITY_SECRET = -1; // 0xffffffff
-  }
-
-  public static class NotificationCompat.Action {
-    ctor public NotificationCompat.Action(int, java.lang.CharSequence, android.app.PendingIntent);
-    method public android.app.PendingIntent getActionIntent();
-    method public boolean getAllowGeneratedReplies();
-    method public android.os.Bundle getExtras();
-    method public int getIcon();
-    method public android.support.v4.app.RemoteInput[] getRemoteInputs();
-    method public java.lang.CharSequence getTitle();
-    field public android.app.PendingIntent actionIntent;
-    field public int icon;
-    field public java.lang.CharSequence title;
-  }
-
-  public static final class NotificationCompat.Action.Builder {
-    ctor public NotificationCompat.Action.Builder(int, java.lang.CharSequence, android.app.PendingIntent);
-    ctor public NotificationCompat.Action.Builder(android.support.v4.app.NotificationCompat.Action);
-    method public android.support.v4.app.NotificationCompat.Action.Builder addExtras(android.os.Bundle);
-    method public android.support.v4.app.NotificationCompat.Action.Builder addRemoteInput(android.support.v4.app.RemoteInput);
-    method public android.support.v4.app.NotificationCompat.Action build();
-    method public android.support.v4.app.NotificationCompat.Action.Builder extend(android.support.v4.app.NotificationCompat.Action.Extender);
-    method public android.os.Bundle getExtras();
-    method public android.support.v4.app.NotificationCompat.Action.Builder setAllowGeneratedReplies(boolean);
-  }
-
-  public static abstract interface NotificationCompat.Action.Extender {
-    method public abstract android.support.v4.app.NotificationCompat.Action.Builder extend(android.support.v4.app.NotificationCompat.Action.Builder);
-  }
-
-  public static final class NotificationCompat.Action.WearableExtender implements android.support.v4.app.NotificationCompat.Action.Extender {
-    ctor public NotificationCompat.Action.WearableExtender();
-    ctor public NotificationCompat.Action.WearableExtender(android.support.v4.app.NotificationCompat.Action);
-    method public android.support.v4.app.NotificationCompat.Action.WearableExtender clone();
-    method public android.support.v4.app.NotificationCompat.Action.Builder extend(android.support.v4.app.NotificationCompat.Action.Builder);
-    method public java.lang.CharSequence getCancelLabel();
-    method public java.lang.CharSequence getConfirmLabel();
-    method public boolean getHintLaunchesActivity();
-    method public java.lang.CharSequence getInProgressLabel();
-    method public boolean isAvailableOffline();
-    method public android.support.v4.app.NotificationCompat.Action.WearableExtender setAvailableOffline(boolean);
-    method public android.support.v4.app.NotificationCompat.Action.WearableExtender setCancelLabel(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.Action.WearableExtender setConfirmLabel(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.Action.WearableExtender setHintLaunchesActivity(boolean);
-    method public android.support.v4.app.NotificationCompat.Action.WearableExtender setInProgressLabel(java.lang.CharSequence);
-  }
-
-  public static class NotificationCompat.BigPictureStyle extends android.support.v4.app.NotificationCompat.Style {
-    ctor public NotificationCompat.BigPictureStyle();
-    ctor public NotificationCompat.BigPictureStyle(android.support.v4.app.NotificationCompat.Builder);
-    method public android.support.v4.app.NotificationCompat.BigPictureStyle bigLargeIcon(android.graphics.Bitmap);
-    method public android.support.v4.app.NotificationCompat.BigPictureStyle bigPicture(android.graphics.Bitmap);
-    method public android.support.v4.app.NotificationCompat.BigPictureStyle setBigContentTitle(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.BigPictureStyle setSummaryText(java.lang.CharSequence);
-  }
-
-  public static class NotificationCompat.BigTextStyle extends android.support.v4.app.NotificationCompat.Style {
-    ctor public NotificationCompat.BigTextStyle();
-    ctor public NotificationCompat.BigTextStyle(android.support.v4.app.NotificationCompat.Builder);
-    method public android.support.v4.app.NotificationCompat.BigTextStyle bigText(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.BigTextStyle setBigContentTitle(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.BigTextStyle setSummaryText(java.lang.CharSequence);
-  }
-
-  public static class NotificationCompat.Builder {
-    ctor public NotificationCompat.Builder(android.content.Context);
-    method public android.support.v4.app.NotificationCompat.Builder addAction(int, java.lang.CharSequence, android.app.PendingIntent);
-    method public android.support.v4.app.NotificationCompat.Builder addAction(android.support.v4.app.NotificationCompat.Action);
-    method public android.support.v4.app.NotificationCompat.Builder addExtras(android.os.Bundle);
-    method public android.support.v4.app.NotificationCompat.Builder addPerson(java.lang.String);
-    method public android.app.Notification build();
-    method public android.support.v4.app.NotificationCompat.Builder extend(android.support.v4.app.NotificationCompat.Extender);
-    method public android.os.Bundle getExtras();
-    method public deprecated android.app.Notification getNotification();
-    method protected static java.lang.CharSequence limitCharSequenceLength(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.Builder setAutoCancel(boolean);
-    method public android.support.v4.app.NotificationCompat.Builder setCategory(java.lang.String);
-    method public android.support.v4.app.NotificationCompat.Builder setColor(int);
-    method public android.support.v4.app.NotificationCompat.Builder setContent(android.widget.RemoteViews);
-    method public android.support.v4.app.NotificationCompat.Builder setContentInfo(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.Builder setContentIntent(android.app.PendingIntent);
-    method public android.support.v4.app.NotificationCompat.Builder setContentText(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.Builder setContentTitle(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.Builder setCustomBigContentView(android.widget.RemoteViews);
-    method public android.support.v4.app.NotificationCompat.Builder setCustomContentView(android.widget.RemoteViews);
-    method public android.support.v4.app.NotificationCompat.Builder setCustomHeadsUpContentView(android.widget.RemoteViews);
-    method public android.support.v4.app.NotificationCompat.Builder setDefaults(int);
-    method public android.support.v4.app.NotificationCompat.Builder setDeleteIntent(android.app.PendingIntent);
-    method public android.support.v4.app.NotificationCompat.Builder setExtras(android.os.Bundle);
-    method public android.support.v4.app.NotificationCompat.Builder setFullScreenIntent(android.app.PendingIntent, boolean);
-    method public android.support.v4.app.NotificationCompat.Builder setGroup(java.lang.String);
-    method public android.support.v4.app.NotificationCompat.Builder setGroupSummary(boolean);
-    method public android.support.v4.app.NotificationCompat.Builder setLargeIcon(android.graphics.Bitmap);
-    method public android.support.v4.app.NotificationCompat.Builder setLights(int, int, int);
-    method public android.support.v4.app.NotificationCompat.Builder setLocalOnly(boolean);
-    method public android.support.v4.app.NotificationCompat.Builder setNumber(int);
-    method public android.support.v4.app.NotificationCompat.Builder setOngoing(boolean);
-    method public android.support.v4.app.NotificationCompat.Builder setOnlyAlertOnce(boolean);
-    method public android.support.v4.app.NotificationCompat.Builder setPriority(int);
-    method public android.support.v4.app.NotificationCompat.Builder setProgress(int, int, boolean);
-    method public android.support.v4.app.NotificationCompat.Builder setPublicVersion(android.app.Notification);
-    method public android.support.v4.app.NotificationCompat.Builder setRemoteInputHistory(java.lang.CharSequence[]);
-    method public android.support.v4.app.NotificationCompat.Builder setShowWhen(boolean);
-    method public android.support.v4.app.NotificationCompat.Builder setSmallIcon(int);
-    method public android.support.v4.app.NotificationCompat.Builder setSmallIcon(int, int);
-    method public android.support.v4.app.NotificationCompat.Builder setSortKey(java.lang.String);
-    method public android.support.v4.app.NotificationCompat.Builder setSound(android.net.Uri);
-    method public android.support.v4.app.NotificationCompat.Builder setSound(android.net.Uri, int);
-    method public android.support.v4.app.NotificationCompat.Builder setStyle(android.support.v4.app.NotificationCompat.Style);
-    method public android.support.v4.app.NotificationCompat.Builder setSubText(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.Builder setTicker(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.Builder setTicker(java.lang.CharSequence, android.widget.RemoteViews);
-    method public android.support.v4.app.NotificationCompat.Builder setUsesChronometer(boolean);
-    method public android.support.v4.app.NotificationCompat.Builder setVibrate(long[]);
-    method public android.support.v4.app.NotificationCompat.Builder setVisibility(int);
-    method public android.support.v4.app.NotificationCompat.Builder setWhen(long);
-    field public java.util.ArrayList<java.lang.String> mPeople;
-  }
-
-  public static final class NotificationCompat.CarExtender implements android.support.v4.app.NotificationCompat.Extender {
-    ctor public NotificationCompat.CarExtender();
-    ctor public NotificationCompat.CarExtender(android.app.Notification);
-    method public android.support.v4.app.NotificationCompat.Builder extend(android.support.v4.app.NotificationCompat.Builder);
-    method public int getColor();
-    method public android.graphics.Bitmap getLargeIcon();
-    method public android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation getUnreadConversation();
-    method public android.support.v4.app.NotificationCompat.CarExtender setColor(int);
-    method public android.support.v4.app.NotificationCompat.CarExtender setLargeIcon(android.graphics.Bitmap);
-    method public android.support.v4.app.NotificationCompat.CarExtender setUnreadConversation(android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation);
-  }
-
-  public static class NotificationCompat.CarExtender.UnreadConversation {
-    method public long getLatestTimestamp();
-    method public java.lang.String[] getMessages();
-    method public java.lang.String getParticipant();
-    method public java.lang.String[] getParticipants();
-    method public android.app.PendingIntent getReadPendingIntent();
-    method public android.support.v4.app.RemoteInput getRemoteInput();
-    method public android.app.PendingIntent getReplyPendingIntent();
-  }
-
-  public static class NotificationCompat.CarExtender.UnreadConversation.Builder {
-    ctor public NotificationCompat.CarExtender.UnreadConversation.Builder(java.lang.String);
-    method public android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation.Builder addMessage(java.lang.String);
-    method public android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation build();
-    method public android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation.Builder setLatestTimestamp(long);
-    method public android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation.Builder setReadPendingIntent(android.app.PendingIntent);
-    method public android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation.Builder setReplyAction(android.app.PendingIntent, android.support.v4.app.RemoteInput);
-  }
-
-  public static abstract interface NotificationCompat.Extender {
-    method public abstract android.support.v4.app.NotificationCompat.Builder extend(android.support.v4.app.NotificationCompat.Builder);
-  }
-
-  public static class NotificationCompat.InboxStyle extends android.support.v4.app.NotificationCompat.Style {
-    ctor public NotificationCompat.InboxStyle();
-    ctor public NotificationCompat.InboxStyle(android.support.v4.app.NotificationCompat.Builder);
-    method public android.support.v4.app.NotificationCompat.InboxStyle addLine(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.InboxStyle setBigContentTitle(java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.InboxStyle setSummaryText(java.lang.CharSequence);
-  }
-
-  public static class NotificationCompat.MessagingStyle extends android.support.v4.app.NotificationCompat.Style {
-    ctor public NotificationCompat.MessagingStyle(java.lang.CharSequence);
-    method public void addCompatExtras(android.os.Bundle);
-    method public android.support.v4.app.NotificationCompat.MessagingStyle addMessage(java.lang.CharSequence, long, java.lang.CharSequence);
-    method public android.support.v4.app.NotificationCompat.MessagingStyle addMessage(android.support.v4.app.NotificationCompat.MessagingStyle.Message);
-    method public static android.support.v4.app.NotificationCompat.MessagingStyle extractMessagingStyleFromNotification(android.app.Notification);
-    method public java.lang.CharSequence getConversationTitle();
-    method public java.util.List<android.support.v4.app.NotificationCompat.MessagingStyle.Message> getMessages();
-    method public java.lang.CharSequence getUserDisplayName();
-    method public android.support.v4.app.NotificationCompat.MessagingStyle setConversationTitle(java.lang.CharSequence);
-    field public static final int MAXIMUM_RETAINED_MESSAGES = 25; // 0x19
-  }
-
-  public static final class NotificationCompat.MessagingStyle.Message {
-    ctor public NotificationCompat.MessagingStyle.Message(java.lang.CharSequence, long, java.lang.CharSequence);
-    method public java.lang.String getDataMimeType();
-    method public android.net.Uri getDataUri();
-    method public java.lang.CharSequence getSender();
-    method public java.lang.CharSequence getText();
-    method public long getTimestamp();
-    method public android.support.v4.app.NotificationCompat.MessagingStyle.Message setData(java.lang.String, android.net.Uri);
-  }
-
-  public static abstract class NotificationCompat.Style {
-    ctor public NotificationCompat.Style();
-    method public android.app.Notification build();
-    method public void setBuilder(android.support.v4.app.NotificationCompat.Builder);
-  }
-
-  public static final class NotificationCompat.WearableExtender implements android.support.v4.app.NotificationCompat.Extender {
-    ctor public NotificationCompat.WearableExtender();
-    ctor public NotificationCompat.WearableExtender(android.app.Notification);
-    method public android.support.v4.app.NotificationCompat.WearableExtender addAction(android.support.v4.app.NotificationCompat.Action);
-    method public android.support.v4.app.NotificationCompat.WearableExtender addActions(java.util.List<android.support.v4.app.NotificationCompat.Action>);
-    method public android.support.v4.app.NotificationCompat.WearableExtender addPage(android.app.Notification);
-    method public android.support.v4.app.NotificationCompat.WearableExtender addPages(java.util.List<android.app.Notification>);
-    method public android.support.v4.app.NotificationCompat.WearableExtender clearActions();
-    method public android.support.v4.app.NotificationCompat.WearableExtender clearPages();
-    method public android.support.v4.app.NotificationCompat.WearableExtender clone();
-    method public android.support.v4.app.NotificationCompat.Builder extend(android.support.v4.app.NotificationCompat.Builder);
-    method public java.util.List<android.support.v4.app.NotificationCompat.Action> getActions();
-    method public android.graphics.Bitmap getBackground();
-    method public int getContentAction();
-    method public int getContentIcon();
-    method public int getContentIconGravity();
-    method public boolean getContentIntentAvailableOffline();
-    method public int getCustomContentHeight();
-    method public int getCustomSizePreset();
-    method public java.lang.String getDismissalId();
-    method public android.app.PendingIntent getDisplayIntent();
-    method public int getGravity();
-    method public boolean getHintAmbientBigPicture();
-    method public boolean getHintAvoidBackgroundClipping();
-    method public boolean getHintContentIntentLaunchesActivity();
-    method public boolean getHintHideIcon();
-    method public int getHintScreenTimeout();
-    method public boolean getHintShowBackgroundOnly();
-    method public java.util.List<android.app.Notification> getPages();
-    method public boolean getStartScrollBottom();
-    method public android.support.v4.app.NotificationCompat.WearableExtender setBackground(android.graphics.Bitmap);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setContentAction(int);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setContentIcon(int);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setContentIconGravity(int);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setContentIntentAvailableOffline(boolean);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setCustomContentHeight(int);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setCustomSizePreset(int);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setDismissalId(java.lang.String);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setDisplayIntent(android.app.PendingIntent);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setGravity(int);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setHintAmbientBigPicture(boolean);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setHintAvoidBackgroundClipping(boolean);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setHintContentIntentLaunchesActivity(boolean);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setHintHideIcon(boolean);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setHintScreenTimeout(int);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setHintShowBackgroundOnly(boolean);
-    method public android.support.v4.app.NotificationCompat.WearableExtender setStartScrollBottom(boolean);
-    field public static final int SCREEN_TIMEOUT_LONG = -1; // 0xffffffff
-    field public static final int SCREEN_TIMEOUT_SHORT = 0; // 0x0
-    field public static final int SIZE_DEFAULT = 0; // 0x0
-    field public static final int SIZE_FULL_SCREEN = 5; // 0x5
-    field public static final int SIZE_LARGE = 4; // 0x4
-    field public static final int SIZE_MEDIUM = 3; // 0x3
-    field public static final int SIZE_SMALL = 2; // 0x2
-    field public static final int SIZE_XSMALL = 1; // 0x1
-    field public static final int UNSET_ACTION_INDEX = -1; // 0xffffffff
-  }
-
-  public final class NotificationCompatExtras {
-    field public static final java.lang.String EXTRA_ACTION_EXTRAS = "android.support.actionExtras";
-    field public static final java.lang.String EXTRA_GROUP_KEY = "android.support.groupKey";
-    field public static final java.lang.String EXTRA_GROUP_SUMMARY = "android.support.isGroupSummary";
-    field public static final java.lang.String EXTRA_LOCAL_ONLY = "android.support.localOnly";
-    field public static final java.lang.String EXTRA_REMOTE_INPUTS = "android.support.remoteInputs";
-    field public static final java.lang.String EXTRA_SORT_KEY = "android.support.sortKey";
-  }
-
-  public abstract class NotificationCompatSideChannelService extends android.app.Service {
-    ctor public NotificationCompatSideChannelService();
-    method public abstract void cancel(java.lang.String, int, java.lang.String);
-    method public abstract void cancelAll(java.lang.String);
-    method public abstract void notify(java.lang.String, int, java.lang.String, android.app.Notification);
-    method public android.os.IBinder onBind(android.content.Intent);
-  }
-
-  public final class NotificationManagerCompat {
-    method public boolean areNotificationsEnabled();
-    method public void cancel(int);
-    method public void cancel(java.lang.String, int);
-    method public void cancelAll();
-    method public static android.support.v4.app.NotificationManagerCompat from(android.content.Context);
-    method public static java.util.Set<java.lang.String> getEnabledListenerPackages(android.content.Context);
-    method public int getImportance();
-    method public void notify(int, android.app.Notification);
-    method public void notify(java.lang.String, int, android.app.Notification);
-    field public static final java.lang.String ACTION_BIND_SIDE_CHANNEL = "android.support.BIND_NOTIFICATION_SIDE_CHANNEL";
-    field public static final java.lang.String EXTRA_USE_SIDE_CHANNEL = "android.support.useSideChannel";
-    field public static final int IMPORTANCE_DEFAULT = 3; // 0x3
-    field public static final int IMPORTANCE_HIGH = 4; // 0x4
-    field public static final int IMPORTANCE_LOW = 2; // 0x2
-    field public static final int IMPORTANCE_MAX = 5; // 0x5
-    field public static final int IMPORTANCE_MIN = 1; // 0x1
-    field public static final int IMPORTANCE_NONE = 0; // 0x0
-    field public static final int IMPORTANCE_UNSPECIFIED = -1000; // 0xfffffc18
-  }
-
-  public final class RemoteInput extends android.support.v4.app.RemoteInputCompatBase.RemoteInput {
-    method public static void addResultsToIntent(android.support.v4.app.RemoteInput[], android.content.Intent, android.os.Bundle);
-    method public boolean getAllowFreeFormInput();
-    method public java.lang.CharSequence[] getChoices();
-    method public android.os.Bundle getExtras();
-    method public java.lang.CharSequence getLabel();
-    method public java.lang.String getResultKey();
-    method public static android.os.Bundle getResultsFromIntent(android.content.Intent);
-    field public static final java.lang.String EXTRA_RESULTS_DATA = "android.remoteinput.resultsData";
-    field public static final java.lang.String RESULTS_CLIP_LABEL = "android.remoteinput.results";
-  }
-
-  public static final class RemoteInput.Builder {
-    ctor public RemoteInput.Builder(java.lang.String);
-    method public android.support.v4.app.RemoteInput.Builder addExtras(android.os.Bundle);
-    method public android.support.v4.app.RemoteInput build();
-    method public android.os.Bundle getExtras();
-    method public android.support.v4.app.RemoteInput.Builder setAllowFreeFormInput(boolean);
-    method public android.support.v4.app.RemoteInput.Builder setChoices(java.lang.CharSequence[]);
-    method public android.support.v4.app.RemoteInput.Builder setLabel(java.lang.CharSequence);
-  }
-
-   class RemoteInputCompatBase {
-  }
-
-  public static abstract class RemoteInputCompatBase.RemoteInput {
-    ctor public RemoteInputCompatBase.RemoteInput();
-    method protected abstract boolean getAllowFreeFormInput();
-    method protected abstract java.lang.CharSequence[] getChoices();
-    method protected abstract android.os.Bundle getExtras();
-    method protected abstract java.lang.CharSequence getLabel();
-    method protected abstract java.lang.String getResultKey();
-  }
-
-  public final class ServiceCompat {
-    field public static final int START_STICKY = 1; // 0x1
-  }
-
-  public final class ShareCompat {
-    method public static void configureMenuItem(android.view.MenuItem, android.support.v4.app.ShareCompat.IntentBuilder);
-    method public static void configureMenuItem(android.view.Menu, int, android.support.v4.app.ShareCompat.IntentBuilder);
-    method public static android.content.ComponentName getCallingActivity(android.app.Activity);
-    method public static java.lang.String getCallingPackage(android.app.Activity);
-    field public static final java.lang.String EXTRA_CALLING_ACTIVITY = "android.support.v4.app.EXTRA_CALLING_ACTIVITY";
-    field public static final java.lang.String EXTRA_CALLING_PACKAGE = "android.support.v4.app.EXTRA_CALLING_PACKAGE";
-  }
-
-  public static class ShareCompat.IntentBuilder {
-    method public android.support.v4.app.ShareCompat.IntentBuilder addEmailBcc(java.lang.String);
-    method public android.support.v4.app.ShareCompat.IntentBuilder addEmailBcc(java.lang.String[]);
-    method public android.support.v4.app.ShareCompat.IntentBuilder addEmailCc(java.lang.String);
-    method public android.support.v4.app.ShareCompat.IntentBuilder addEmailCc(java.lang.String[]);
-    method public android.support.v4.app.ShareCompat.IntentBuilder addEmailTo(java.lang.String);
-    method public android.support.v4.app.ShareCompat.IntentBuilder addEmailTo(java.lang.String[]);
-    method public android.support.v4.app.ShareCompat.IntentBuilder addStream(android.net.Uri);
-    method public android.content.Intent createChooserIntent();
-    method public static android.support.v4.app.ShareCompat.IntentBuilder from(android.app.Activity);
-    method public android.content.Intent getIntent();
-    method public android.support.v4.app.ShareCompat.IntentBuilder setChooserTitle(java.lang.CharSequence);
-    method public android.support.v4.app.ShareCompat.IntentBuilder setChooserTitle(int);
-    method public android.support.v4.app.ShareCompat.IntentBuilder setEmailBcc(java.lang.String[]);
-    method public android.support.v4.app.ShareCompat.IntentBuilder setEmailCc(java.lang.String[]);
-    method public android.support.v4.app.ShareCompat.IntentBuilder setEmailTo(java.lang.String[]);
-    method public android.support.v4.app.ShareCompat.IntentBuilder setHtmlText(java.lang.String);
-    method public android.support.v4.app.ShareCompat.IntentBuilder setStream(android.net.Uri);
-    method public android.support.v4.app.ShareCompat.IntentBuilder setSubject(java.lang.String);
-    method public android.support.v4.app.ShareCompat.IntentBuilder setText(java.lang.CharSequence);
-    method public android.support.v4.app.ShareCompat.IntentBuilder setType(java.lang.String);
-    method public void startChooser();
-  }
-
-  public static class ShareCompat.IntentReader {
-    method public static android.support.v4.app.ShareCompat.IntentReader from(android.app.Activity);
-    method public android.content.ComponentName getCallingActivity();
-    method public android.graphics.drawable.Drawable getCallingActivityIcon();
-    method public android.graphics.drawable.Drawable getCallingApplicationIcon();
-    method public java.lang.CharSequence getCallingApplicationLabel();
-    method public java.lang.String getCallingPackage();
-    method public java.lang.String[] getEmailBcc();
-    method public java.lang.String[] getEmailCc();
-    method public java.lang.String[] getEmailTo();
-    method public java.lang.String getHtmlText();
-    method public android.net.Uri getStream();
-    method public android.net.Uri getStream(int);
-    method public int getStreamCount();
-    method public java.lang.String getSubject();
-    method public java.lang.CharSequence getText();
-    method public java.lang.String getType();
-    method public boolean isMultipleShare();
-    method public boolean isShareIntent();
-    method public boolean isSingleShare();
-  }
-
-  public abstract class SharedElementCallback {
-    ctor public SharedElementCallback();
-    method public android.os.Parcelable onCaptureSharedElementSnapshot(android.view.View, android.graphics.Matrix, android.graphics.RectF);
-    method public android.view.View onCreateSnapshotView(android.content.Context, android.os.Parcelable);
-    method public void onMapSharedElements(java.util.List<java.lang.String>, java.util.Map<java.lang.String, android.view.View>);
-    method public void onRejectSharedElements(java.util.List<android.view.View>);
-    method public void onSharedElementEnd(java.util.List<java.lang.String>, java.util.List<android.view.View>, java.util.List<android.view.View>);
-    method public void onSharedElementStart(java.util.List<java.lang.String>, java.util.List<android.view.View>, java.util.List<android.view.View>);
-  }
-
-  public final class TaskStackBuilder implements java.lang.Iterable {
-    method public android.support.v4.app.TaskStackBuilder addNextIntent(android.content.Intent);
-    method public android.support.v4.app.TaskStackBuilder addNextIntentWithParentStack(android.content.Intent);
-    method public android.support.v4.app.TaskStackBuilder addParentStack(android.app.Activity);
-    method public android.support.v4.app.TaskStackBuilder addParentStack(java.lang.Class<?>);
-    method public android.support.v4.app.TaskStackBuilder addParentStack(android.content.ComponentName);
-    method public static android.support.v4.app.TaskStackBuilder create(android.content.Context);
-    method public android.content.Intent editIntentAt(int);
-    method public static deprecated android.support.v4.app.TaskStackBuilder from(android.content.Context);
-    method public deprecated android.content.Intent getIntent(int);
-    method public int getIntentCount();
-    method public android.content.Intent[] getIntents();
-    method public android.app.PendingIntent getPendingIntent(int, int);
-    method public android.app.PendingIntent getPendingIntent(int, int, android.os.Bundle);
-    method public deprecated java.util.Iterator<android.content.Intent> iterator();
-    method public void startActivities();
-    method public void startActivities(android.os.Bundle);
-  }
-
-  public static abstract interface TaskStackBuilder.SupportParentable {
-    method public abstract android.content.Intent getSupportParentActivityIntent();
-  }
-
-}
-
-package android.support.v4.content {
-
-  public abstract class AsyncTaskLoader extends android.support.v4.content.Loader {
-    ctor public AsyncTaskLoader(android.content.Context);
-    method public void cancelLoadInBackground();
-    method public boolean isLoadInBackgroundCanceled();
-    method public abstract D loadInBackground();
-    method public void onCanceled(D);
-    method protected D onLoadInBackground();
-    method public void setUpdateThrottle(long);
-  }
-
-  public final class ContentResolverCompat {
-    method public static android.database.Cursor query(android.content.ContentResolver, android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, android.support.v4.os.CancellationSignal);
-  }
-
-  public class ContextCompat {
-    ctor public ContextCompat();
-    method public static int checkSelfPermission(android.content.Context, java.lang.String);
-    method public static android.content.Context createDeviceProtectedStorageContext(android.content.Context);
-    method public static java.io.File getCodeCacheDir(android.content.Context);
-    method public static final int getColor(android.content.Context, int);
-    method public static final android.content.res.ColorStateList getColorStateList(android.content.Context, int);
-    method public static java.io.File getDataDir(android.content.Context);
-    method public static final android.graphics.drawable.Drawable getDrawable(android.content.Context, int);
-    method public static java.io.File[] getExternalCacheDirs(android.content.Context);
-    method public static java.io.File[] getExternalFilesDirs(android.content.Context, java.lang.String);
-    method public static final java.io.File getNoBackupFilesDir(android.content.Context);
-    method public static java.io.File[] getObbDirs(android.content.Context);
-    method public static boolean isDeviceProtectedStorage(android.content.Context);
-    method public static boolean startActivities(android.content.Context, android.content.Intent[]);
-    method public static boolean startActivities(android.content.Context, android.content.Intent[], android.os.Bundle);
-  }
-
-  public class CursorLoader extends android.support.v4.content.AsyncTaskLoader {
-    ctor public CursorLoader(android.content.Context);
-    ctor public CursorLoader(android.content.Context, android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String);
-    method public void deliverResult(android.database.Cursor);
-    method public java.lang.String[] getProjection();
-    method public java.lang.String getSelection();
-    method public java.lang.String[] getSelectionArgs();
-    method public java.lang.String getSortOrder();
-    method public android.net.Uri getUri();
-    method public android.database.Cursor loadInBackground();
-    method public void onCanceled(android.database.Cursor);
-    method public void setProjection(java.lang.String[]);
-    method public void setSelection(java.lang.String);
-    method public void setSelectionArgs(java.lang.String[]);
-    method public void setSortOrder(java.lang.String);
-    method public void setUri(android.net.Uri);
-  }
-
-  public class FileProvider extends android.content.ContentProvider {
-    ctor public FileProvider();
-    method public int delete(android.net.Uri, java.lang.String, java.lang.String[]);
-    method public java.lang.String getType(android.net.Uri);
-    method public static android.net.Uri getUriForFile(android.content.Context, java.lang.String, java.io.File);
-    method public android.net.Uri insert(android.net.Uri, android.content.ContentValues);
-    method public boolean onCreate();
-    method public android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String);
-    method public int update(android.net.Uri, android.content.ContentValues, java.lang.String, java.lang.String[]);
-  }
-
-  public final class IntentCompat {
-    method public static android.content.Intent makeMainActivity(android.content.ComponentName);
-    method public static android.content.Intent makeMainSelectorActivity(java.lang.String, java.lang.String);
-    method public static android.content.Intent makeRestartActivityTask(android.content.ComponentName);
-    field public static final java.lang.String ACTION_EXTERNAL_APPLICATIONS_AVAILABLE = "android.intent.action.EXTERNAL_APPLICATIONS_AVAILABLE";
-    field public static final java.lang.String ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE = "android.intent.action.EXTERNAL_APPLICATIONS_UNAVAILABLE";
-    field public static final java.lang.String CATEGORY_LEANBACK_LAUNCHER = "android.intent.category.LEANBACK_LAUNCHER";
-    field public static final java.lang.String EXTRA_CHANGED_PACKAGE_LIST = "android.intent.extra.changed_package_list";
-    field public static final java.lang.String EXTRA_CHANGED_UID_LIST = "android.intent.extra.changed_uid_list";
-    field public static final java.lang.String EXTRA_HTML_TEXT = "android.intent.extra.HTML_TEXT";
-    field public static final int FLAG_ACTIVITY_CLEAR_TASK = 32768; // 0x8000
-    field public static final int FLAG_ACTIVITY_TASK_ON_HOME = 16384; // 0x4000
-  }
-
-  public class Loader {
-    ctor public Loader(android.content.Context);
-    method public void abandon();
-    method public boolean cancelLoad();
-    method public void commitContentChanged();
-    method public java.lang.String dataToString(D);
-    method public void deliverCancellation();
-    method public void deliverResult(D);
-    method public void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
-    method public void forceLoad();
-    method public android.content.Context getContext();
-    method public int getId();
-    method public boolean isAbandoned();
-    method public boolean isReset();
-    method public boolean isStarted();
-    method protected void onAbandon();
-    method protected boolean onCancelLoad();
-    method public void onContentChanged();
-    method protected void onForceLoad();
-    method protected void onReset();
-    method protected void onStartLoading();
-    method protected void onStopLoading();
-    method public void registerListener(int, android.support.v4.content.Loader.OnLoadCompleteListener<D>);
-    method public void registerOnLoadCanceledListener(android.support.v4.content.Loader.OnLoadCanceledListener<D>);
-    method public void reset();
-    method public void rollbackContentChanged();
-    method public final void startLoading();
-    method public void stopLoading();
-    method public boolean takeContentChanged();
-    method public void unregisterListener(android.support.v4.content.Loader.OnLoadCompleteListener<D>);
-    method public void unregisterOnLoadCanceledListener(android.support.v4.content.Loader.OnLoadCanceledListener<D>);
-  }
-
-  public final class Loader.ForceLoadContentObserver extends android.database.ContentObserver {
-    ctor public Loader.ForceLoadContentObserver();
-  }
-
-  public static abstract interface Loader.OnLoadCanceledListener {
-    method public abstract void onLoadCanceled(android.support.v4.content.Loader<D>);
-  }
-
-  public static abstract interface Loader.OnLoadCompleteListener {
-    method public abstract void onLoadComplete(android.support.v4.content.Loader<D>, D);
-  }
-
-  public final class LocalBroadcastManager {
-    method public static android.support.v4.content.LocalBroadcastManager getInstance(android.content.Context);
-    method public void registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter);
-    method public boolean sendBroadcast(android.content.Intent);
-    method public void sendBroadcastSync(android.content.Intent);
-    method public void unregisterReceiver(android.content.BroadcastReceiver);
-  }
-
-  public final class ParallelExecutorCompat {
-    method public static java.util.concurrent.Executor getParallelExecutor();
-  }
-
-  public final class PermissionChecker {
-    method public static int checkCallingOrSelfPermission(android.content.Context, java.lang.String);
-    method public static int checkCallingPermission(android.content.Context, java.lang.String, java.lang.String);
-    method public static int checkPermission(android.content.Context, java.lang.String, int, int, java.lang.String);
-    method public static int checkSelfPermission(android.content.Context, java.lang.String);
-    field public static final int PERMISSION_DENIED = -1; // 0xffffffff
-    field public static final int PERMISSION_DENIED_APP_OP = -2; // 0xfffffffe
-    field public static final int PERMISSION_GRANTED = 0; // 0x0
-  }
-
-  public static abstract class PermissionChecker.PermissionResult implements java.lang.annotation.Annotation {
-  }
-
-  public final class SharedPreferencesCompat {
-  }
-
-  public static final class SharedPreferencesCompat.EditorCompat {
-    method public void apply(android.content.SharedPreferences.Editor);
-    method public static android.support.v4.content.SharedPreferencesCompat.EditorCompat getInstance();
-  }
-
-  public abstract class WakefulBroadcastReceiver extends android.content.BroadcastReceiver {
-    ctor public WakefulBroadcastReceiver();
-    method public static boolean completeWakefulIntent(android.content.Intent);
-    method public static android.content.ComponentName startWakefulService(android.content.Context, android.content.Intent);
-  }
-
-}
-
-package android.support.v4.content.pm {
-
-  public final class ActivityInfoCompat {
-    field public static final int CONFIG_UI_MODE = 512; // 0x200
-  }
-
-}
-
-package android.support.v4.content.res {
-
-  public final class ConfigurationHelper {
-    method public static int getDensityDpi(android.content.res.Resources);
-    method public static int getScreenHeightDp(android.content.res.Resources);
-    method public static int getScreenWidthDp(android.content.res.Resources);
-    method public static int getSmallestScreenWidthDp(android.content.res.Resources);
-  }
-
-  public final class ResourcesCompat {
-    method public static int getColor(android.content.res.Resources, int, android.content.res.Resources.Theme) throws android.content.res.Resources.NotFoundException;
-    method public static android.content.res.ColorStateList getColorStateList(android.content.res.Resources, int, android.content.res.Resources.Theme) throws android.content.res.Resources.NotFoundException;
-    method public static android.graphics.drawable.Drawable getDrawable(android.content.res.Resources, int, android.content.res.Resources.Theme) throws android.content.res.Resources.NotFoundException;
-    method public static android.graphics.drawable.Drawable getDrawableForDensity(android.content.res.Resources, int, int, android.content.res.Resources.Theme) throws android.content.res.Resources.NotFoundException;
-  }
-
-}
-
-package android.support.v4.database {
-
-  public final class DatabaseUtilsCompat {
-    method public static java.lang.String[] appendSelectionArgs(java.lang.String[], java.lang.String[]);
-    method public static java.lang.String concatenateWhere(java.lang.String, java.lang.String);
-  }
-
-}
-
-package android.support.v4.graphics {
-
-  public final class BitmapCompat {
-    method public static int getAllocationByteCount(android.graphics.Bitmap);
-    method public static boolean hasMipMap(android.graphics.Bitmap);
-    method public static void setHasMipMap(android.graphics.Bitmap, boolean);
-  }
-
-  public final class ColorUtils {
-    method public static int HSLToColor(float[]);
-    method public static int LABToColor(double, double, double);
-    method public static void LABToXYZ(double, double, double, double[]);
-    method public static void RGBToHSL(int, int, int, float[]);
-    method public static void RGBToLAB(int, int, int, double[]);
-    method public static void RGBToXYZ(int, int, int, double[]);
-    method public static int XYZToColor(double, double, double);
-    method public static void XYZToLAB(double, double, double, double[]);
-    method public static int blendARGB(int, int, float);
-    method public static void blendHSL(float[], float[], float, float[]);
-    method public static void blendLAB(double[], double[], double, double[]);
-    method public static double calculateContrast(int, int);
-    method public static double calculateLuminance(int);
-    method public static int calculateMinimumAlpha(int, int, float);
-    method public static void colorToHSL(int, float[]);
-    method public static void colorToLAB(int, double[]);
-    method public static void colorToXYZ(int, double[]);
-    method public static int compositeColors(int, int);
-    method public static double distanceEuclidean(double[], double[]);
-    method public static int setAlphaComponent(int, int);
-  }
-
-}
-
-package android.support.v4.graphics.drawable {
-
-  public final class DrawableCompat {
-    method public static void applyTheme(android.graphics.drawable.Drawable, android.content.res.Resources.Theme);
-    method public static boolean canApplyTheme(android.graphics.drawable.Drawable);
-    method public static int getAlpha(android.graphics.drawable.Drawable);
-    method public static android.graphics.ColorFilter getColorFilter(android.graphics.drawable.Drawable);
-    method public static int getLayoutDirection(android.graphics.drawable.Drawable);
-    method public static void inflate(android.graphics.drawable.Drawable, android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources.Theme) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
-    method public static boolean isAutoMirrored(android.graphics.drawable.Drawable);
-    method public static void jumpToCurrentState(android.graphics.drawable.Drawable);
-    method public static void setAutoMirrored(android.graphics.drawable.Drawable, boolean);
-    method public static void setHotspot(android.graphics.drawable.Drawable, float, float);
-    method public static void setHotspotBounds(android.graphics.drawable.Drawable, int, int, int, int);
-    method public static boolean setLayoutDirection(android.graphics.drawable.Drawable, int);
-    method public static void setTint(android.graphics.drawable.Drawable, int);
-    method public static void setTintList(android.graphics.drawable.Drawable, android.content.res.ColorStateList);
-    method public static void setTintMode(android.graphics.drawable.Drawable, android.graphics.PorterDuff.Mode);
-    method public static T unwrap(android.graphics.drawable.Drawable);
-    method public static android.graphics.drawable.Drawable wrap(android.graphics.drawable.Drawable);
-  }
-
-  public abstract class RoundedBitmapDrawable extends android.graphics.drawable.Drawable {
-    method public void draw(android.graphics.Canvas);
-    method public final android.graphics.Bitmap getBitmap();
-    method public float getCornerRadius();
-    method public int getGravity();
-    method public int getOpacity();
-    method public final android.graphics.Paint getPaint();
-    method public boolean hasAntiAlias();
-    method public boolean hasMipMap();
-    method public boolean isCircular();
-    method public void setAlpha(int);
-    method public void setAntiAlias(boolean);
-    method public void setCircular(boolean);
-    method public void setColorFilter(android.graphics.ColorFilter);
-    method public void setCornerRadius(float);
-    method public void setGravity(int);
-    method public void setMipMap(boolean);
-    method public void setTargetDensity(android.graphics.Canvas);
-    method public void setTargetDensity(android.util.DisplayMetrics);
-    method public void setTargetDensity(int);
-  }
-
-  public final class RoundedBitmapDrawableFactory {
-    method public static android.support.v4.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, android.graphics.Bitmap);
-    method public static android.support.v4.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, java.lang.String);
-    method public static android.support.v4.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, java.io.InputStream);
-  }
-
-}
-
-package android.support.v4.hardware.display {
-
-  public abstract class DisplayManagerCompat {
-    method public abstract android.view.Display getDisplay(int);
-    method public abstract android.view.Display[] getDisplays();
-    method public abstract android.view.Display[] getDisplays(java.lang.String);
-    method public static android.support.v4.hardware.display.DisplayManagerCompat getInstance(android.content.Context);
-    field public static final java.lang.String DISPLAY_CATEGORY_PRESENTATION = "android.hardware.display.category.PRESENTATION";
-  }
-
-}
-
-package android.support.v4.hardware.fingerprint {
-
-  public final class FingerprintManagerCompat {
-    method public void authenticate(android.support.v4.hardware.fingerprint.FingerprintManagerCompat.CryptoObject, int, android.support.v4.os.CancellationSignal, android.support.v4.hardware.fingerprint.FingerprintManagerCompat.AuthenticationCallback, android.os.Handler);
-    method public static android.support.v4.hardware.fingerprint.FingerprintManagerCompat from(android.content.Context);
-    method public boolean hasEnrolledFingerprints();
-    method public boolean isHardwareDetected();
-  }
-
-  public static abstract class FingerprintManagerCompat.AuthenticationCallback {
-    ctor public FingerprintManagerCompat.AuthenticationCallback();
-    method public void onAuthenticationError(int, java.lang.CharSequence);
-    method public void onAuthenticationFailed();
-    method public void onAuthenticationHelp(int, java.lang.CharSequence);
-    method public void onAuthenticationSucceeded(android.support.v4.hardware.fingerprint.FingerprintManagerCompat.AuthenticationResult);
-  }
-
-  public static final class FingerprintManagerCompat.AuthenticationResult {
-    ctor public FingerprintManagerCompat.AuthenticationResult(android.support.v4.hardware.fingerprint.FingerprintManagerCompat.CryptoObject);
-    method public android.support.v4.hardware.fingerprint.FingerprintManagerCompat.CryptoObject getCryptoObject();
-  }
-
-  public static class FingerprintManagerCompat.CryptoObject {
-    ctor public FingerprintManagerCompat.CryptoObject(java.security.Signature);
-    ctor public FingerprintManagerCompat.CryptoObject(javax.crypto.Cipher);
-    ctor public FingerprintManagerCompat.CryptoObject(javax.crypto.Mac);
-    method public javax.crypto.Cipher getCipher();
-    method public javax.crypto.Mac getMac();
-    method public java.security.Signature getSignature();
-  }
-
-}
-
-package android.support.v4.media {
-
-  public final class MediaBrowserCompat {
-    ctor public MediaBrowserCompat(android.content.Context, android.content.ComponentName, android.support.v4.media.MediaBrowserCompat.ConnectionCallback, android.os.Bundle);
-    method public void connect();
-    method public void disconnect();
-    method public android.os.Bundle getExtras();
-    method public void getItem(java.lang.String, android.support.v4.media.MediaBrowserCompat.ItemCallback);
-    method public java.lang.String getRoot();
-    method public android.content.ComponentName getServiceComponent();
-    method public android.support.v4.media.session.MediaSessionCompat.Token getSessionToken();
-    method public boolean isConnected();
-    method public void subscribe(java.lang.String, android.support.v4.media.MediaBrowserCompat.SubscriptionCallback);
-    method public void subscribe(java.lang.String, android.os.Bundle, android.support.v4.media.MediaBrowserCompat.SubscriptionCallback);
-    method public void unsubscribe(java.lang.String);
-    method public void unsubscribe(java.lang.String, android.support.v4.media.MediaBrowserCompat.SubscriptionCallback);
-    field public static final java.lang.String EXTRA_PAGE = "android.media.browse.extra.PAGE";
-    field public static final java.lang.String EXTRA_PAGE_SIZE = "android.media.browse.extra.PAGE_SIZE";
-  }
-
-  public static class MediaBrowserCompat.ConnectionCallback {
-    ctor public MediaBrowserCompat.ConnectionCallback();
-    method public void onConnected();
-    method public void onConnectionFailed();
-    method public void onConnectionSuspended();
-  }
-
-  public static abstract class MediaBrowserCompat.ItemCallback {
-    ctor public MediaBrowserCompat.ItemCallback();
-    method public void onError(java.lang.String);
-    method public void onItemLoaded(android.support.v4.media.MediaBrowserCompat.MediaItem);
-  }
-
-  public static class MediaBrowserCompat.MediaItem implements android.os.Parcelable {
-    ctor public MediaBrowserCompat.MediaItem(android.support.v4.media.MediaDescriptionCompat, int);
-    method public int describeContents();
-    method public android.support.v4.media.MediaDescriptionCompat getDescription();
-    method public int getFlags();
-    method public java.lang.String getMediaId();
-    method public boolean isBrowsable();
-    method public boolean isPlayable();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.support.v4.media.MediaBrowserCompat.MediaItem> CREATOR;
-    field public static final int FLAG_BROWSABLE = 1; // 0x1
-    field public static final int FLAG_PLAYABLE = 2; // 0x2
-  }
-
-  public static abstract class MediaBrowserCompat.SubscriptionCallback {
-    ctor public MediaBrowserCompat.SubscriptionCallback();
-    method public void onChildrenLoaded(java.lang.String, java.util.List<android.support.v4.media.MediaBrowserCompat.MediaItem>);
-    method public void onChildrenLoaded(java.lang.String, java.util.List<android.support.v4.media.MediaBrowserCompat.MediaItem>, android.os.Bundle);
-    method public void onError(java.lang.String);
-    method public void onError(java.lang.String, android.os.Bundle);
-  }
-
-  public abstract class MediaBrowserServiceCompat extends android.app.Service {
-    ctor public MediaBrowserServiceCompat();
-    method public void dump(java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
-    method public final android.os.Bundle getBrowserRootHints();
-    method public android.support.v4.media.session.MediaSessionCompat.Token getSessionToken();
-    method public void notifyChildrenChanged(java.lang.String);
-    method public void notifyChildrenChanged(java.lang.String, android.os.Bundle);
-    method public android.os.IBinder onBind(android.content.Intent);
-    method public abstract android.support.v4.media.MediaBrowserServiceCompat.BrowserRoot onGetRoot(java.lang.String, int, android.os.Bundle);
-    method public abstract void onLoadChildren(java.lang.String, android.support.v4.media.MediaBrowserServiceCompat.Result<java.util.List<android.support.v4.media.MediaBrowserCompat.MediaItem>>);
-    method public void onLoadChildren(java.lang.String, android.support.v4.media.MediaBrowserServiceCompat.Result<java.util.List<android.support.v4.media.MediaBrowserCompat.MediaItem>>, android.os.Bundle);
-    method public void onLoadItem(java.lang.String, android.support.v4.media.MediaBrowserServiceCompat.Result<android.support.v4.media.MediaBrowserCompat.MediaItem>);
-    method public void setSessionToken(android.support.v4.media.session.MediaSessionCompat.Token);
-    field public static final java.lang.String SERVICE_INTERFACE = "android.media.browse.MediaBrowserService";
-  }
-
-  public static final class MediaBrowserServiceCompat.BrowserRoot {
-    ctor public MediaBrowserServiceCompat.BrowserRoot(java.lang.String, android.os.Bundle);
-    method public android.os.Bundle getExtras();
-    method public java.lang.String getRootId();
-    field public static final java.lang.String EXTRA_OFFLINE = "android.service.media.extra.OFFLINE";
-    field public static final java.lang.String EXTRA_RECENT = "android.service.media.extra.RECENT";
-    field public static final java.lang.String EXTRA_SUGGESTED = "android.service.media.extra.SUGGESTED";
-  }
-
-  public static class MediaBrowserServiceCompat.Result {
-    method public void detach();
-    method public void sendResult(T);
-  }
-
-  public final class MediaDescriptionCompat implements android.os.Parcelable {
-    method public int describeContents();
-    method public static android.support.v4.media.MediaDescriptionCompat fromMediaDescription(java.lang.Object);
-    method public java.lang.CharSequence getDescription();
-    method public android.os.Bundle getExtras();
-    method public android.graphics.Bitmap getIconBitmap();
-    method public android.net.Uri getIconUri();
-    method public java.lang.Object getMediaDescription();
-    method public java.lang.String getMediaId();
-    method public android.net.Uri getMediaUri();
-    method public java.lang.CharSequence getSubtitle();
-    method public java.lang.CharSequence getTitle();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.support.v4.media.MediaDescriptionCompat> CREATOR;
-  }
-
-  public static final class MediaDescriptionCompat.Builder {
-    ctor public MediaDescriptionCompat.Builder();
-    method public android.support.v4.media.MediaDescriptionCompat build();
-    method public android.support.v4.media.MediaDescriptionCompat.Builder setDescription(java.lang.CharSequence);
-    method public android.support.v4.media.MediaDescriptionCompat.Builder setExtras(android.os.Bundle);
-    method public android.support.v4.media.MediaDescriptionCompat.Builder setIconBitmap(android.graphics.Bitmap);
-    method public android.support.v4.media.MediaDescriptionCompat.Builder setIconUri(android.net.Uri);
-    method public android.support.v4.media.MediaDescriptionCompat.Builder setMediaId(java.lang.String);
-    method public android.support.v4.media.MediaDescriptionCompat.Builder setMediaUri(android.net.Uri);
-    method public android.support.v4.media.MediaDescriptionCompat.Builder setSubtitle(java.lang.CharSequence);
-    method public android.support.v4.media.MediaDescriptionCompat.Builder setTitle(java.lang.CharSequence);
-  }
-
-  public final class MediaMetadataCompat implements android.os.Parcelable {
-    method public boolean containsKey(java.lang.String);
-    method public int describeContents();
-    method public static android.support.v4.media.MediaMetadataCompat fromMediaMetadata(java.lang.Object);
-    method public android.graphics.Bitmap getBitmap(java.lang.String);
-    method public android.os.Bundle getBundle();
-    method public android.support.v4.media.MediaDescriptionCompat getDescription();
-    method public long getLong(java.lang.String);
-    method public java.lang.Object getMediaMetadata();
-    method public android.support.v4.media.RatingCompat getRating(java.lang.String);
-    method public java.lang.String getString(java.lang.String);
-    method public java.lang.CharSequence getText(java.lang.String);
-    method public java.util.Set<java.lang.String> keySet();
-    method public int size();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.support.v4.media.MediaMetadataCompat> CREATOR;
-    field public static final java.lang.String METADATA_KEY_ALBUM = "android.media.metadata.ALBUM";
-    field public static final java.lang.String METADATA_KEY_ALBUM_ART = "android.media.metadata.ALBUM_ART";
-    field public static final java.lang.String METADATA_KEY_ALBUM_ARTIST = "android.media.metadata.ALBUM_ARTIST";
-    field public static final java.lang.String METADATA_KEY_ALBUM_ART_URI = "android.media.metadata.ALBUM_ART_URI";
-    field public static final java.lang.String METADATA_KEY_ART = "android.media.metadata.ART";
-    field public static final java.lang.String METADATA_KEY_ARTIST = "android.media.metadata.ARTIST";
-    field public static final java.lang.String METADATA_KEY_ART_URI = "android.media.metadata.ART_URI";
-    field public static final java.lang.String METADATA_KEY_AUTHOR = "android.media.metadata.AUTHOR";
-    field public static final java.lang.String METADATA_KEY_COMPILATION = "android.media.metadata.COMPILATION";
-    field public static final java.lang.String METADATA_KEY_COMPOSER = "android.media.metadata.COMPOSER";
-    field public static final java.lang.String METADATA_KEY_DATE = "android.media.metadata.DATE";
-    field public static final java.lang.String METADATA_KEY_DISC_NUMBER = "android.media.metadata.DISC_NUMBER";
-    field public static final java.lang.String METADATA_KEY_DISPLAY_DESCRIPTION = "android.media.metadata.DISPLAY_DESCRIPTION";
-    field public static final java.lang.String METADATA_KEY_DISPLAY_ICON = "android.media.metadata.DISPLAY_ICON";
-    field public static final java.lang.String METADATA_KEY_DISPLAY_ICON_URI = "android.media.metadata.DISPLAY_ICON_URI";
-    field public static final java.lang.String METADATA_KEY_DISPLAY_SUBTITLE = "android.media.metadata.DISPLAY_SUBTITLE";
-    field public static final java.lang.String METADATA_KEY_DISPLAY_TITLE = "android.media.metadata.DISPLAY_TITLE";
-    field public static final java.lang.String METADATA_KEY_DURATION = "android.media.metadata.DURATION";
-    field public static final java.lang.String METADATA_KEY_GENRE = "android.media.metadata.GENRE";
-    field public static final java.lang.String METADATA_KEY_MEDIA_ID = "android.media.metadata.MEDIA_ID";
-    field public static final java.lang.String METADATA_KEY_NUM_TRACKS = "android.media.metadata.NUM_TRACKS";
-    field public static final java.lang.String METADATA_KEY_RATING = "android.media.metadata.RATING";
-    field public static final java.lang.String METADATA_KEY_TITLE = "android.media.metadata.TITLE";
-    field public static final java.lang.String METADATA_KEY_TRACK_NUMBER = "android.media.metadata.TRACK_NUMBER";
-    field public static final java.lang.String METADATA_KEY_USER_RATING = "android.media.metadata.USER_RATING";
-    field public static final java.lang.String METADATA_KEY_WRITER = "android.media.metadata.WRITER";
-    field public static final java.lang.String METADATA_KEY_YEAR = "android.media.metadata.YEAR";
-  }
-
-  public static final class MediaMetadataCompat.Builder {
-    ctor public MediaMetadataCompat.Builder();
-    ctor public MediaMetadataCompat.Builder(android.support.v4.media.MediaMetadataCompat);
-    method public android.support.v4.media.MediaMetadataCompat build();
-    method public android.support.v4.media.MediaMetadataCompat.Builder putBitmap(java.lang.String, android.graphics.Bitmap);
-    method public android.support.v4.media.MediaMetadataCompat.Builder putLong(java.lang.String, long);
-    method public android.support.v4.media.MediaMetadataCompat.Builder putRating(java.lang.String, android.support.v4.media.RatingCompat);
-    method public android.support.v4.media.MediaMetadataCompat.Builder putString(java.lang.String, java.lang.String);
-    method public android.support.v4.media.MediaMetadataCompat.Builder putText(java.lang.String, java.lang.CharSequence);
-  }
-
-  public final class RatingCompat implements android.os.Parcelable {
-    method public int describeContents();
-    method public static android.support.v4.media.RatingCompat fromRating(java.lang.Object);
-    method public float getPercentRating();
-    method public java.lang.Object getRating();
-    method public int getRatingStyle();
-    method public float getStarRating();
-    method public boolean hasHeart();
-    method public boolean isRated();
-    method public boolean isThumbUp();
-    method public static android.support.v4.media.RatingCompat newHeartRating(boolean);
-    method public static android.support.v4.media.RatingCompat newPercentageRating(float);
-    method public static android.support.v4.media.RatingCompat newStarRating(int, float);
-    method public static android.support.v4.media.RatingCompat newThumbRating(boolean);
-    method public static android.support.v4.media.RatingCompat newUnratedRating(int);
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.support.v4.media.RatingCompat> CREATOR;
-    field public static final int RATING_3_STARS = 3; // 0x3
-    field public static final int RATING_4_STARS = 4; // 0x4
-    field public static final int RATING_5_STARS = 5; // 0x5
-    field public static final int RATING_HEART = 1; // 0x1
-    field public static final int RATING_NONE = 0; // 0x0
-    field public static final int RATING_PERCENTAGE = 6; // 0x6
-    field public static final int RATING_THUMB_UP_DOWN = 2; // 0x2
-  }
-
-  public abstract class TransportController {
-    ctor public TransportController();
-    method public abstract int getBufferPercentage();
-    method public abstract long getCurrentPosition();
-    method public abstract long getDuration();
-    method public abstract int getTransportControlFlags();
-    method public abstract boolean isPlaying();
-    method public abstract void pausePlaying();
-    method public abstract void registerStateListener(android.support.v4.media.TransportStateListener);
-    method public abstract void seekTo(long);
-    method public abstract void startPlaying();
-    method public abstract void stopPlaying();
-    method public abstract void unregisterStateListener(android.support.v4.media.TransportStateListener);
-  }
-
-  public class TransportMediator extends android.support.v4.media.TransportController {
-    ctor public TransportMediator(android.app.Activity, android.support.v4.media.TransportPerformer);
-    ctor public TransportMediator(android.view.View, android.support.v4.media.TransportPerformer);
-    method public void destroy();
-    method public boolean dispatchKeyEvent(android.view.KeyEvent);
-    method public int getBufferPercentage();
-    method public long getCurrentPosition();
-    method public long getDuration();
-    method public java.lang.Object getRemoteControlClient();
-    method public int getTransportControlFlags();
-    method public boolean isPlaying();
-    method public void pausePlaying();
-    method public void refreshState();
-    method public void registerStateListener(android.support.v4.media.TransportStateListener);
-    method public void seekTo(long);
-    method public void startPlaying();
-    method public void stopPlaying();
-    method public void unregisterStateListener(android.support.v4.media.TransportStateListener);
-    field public static final int FLAG_KEY_MEDIA_FAST_FORWARD = 64; // 0x40
-    field public static final int FLAG_KEY_MEDIA_NEXT = 128; // 0x80
-    field public static final int FLAG_KEY_MEDIA_PAUSE = 16; // 0x10
-    field public static final int FLAG_KEY_MEDIA_PLAY = 4; // 0x4
-    field public static final int FLAG_KEY_MEDIA_PLAY_PAUSE = 8; // 0x8
-    field public static final int FLAG_KEY_MEDIA_PREVIOUS = 1; // 0x1
-    field public static final int FLAG_KEY_MEDIA_REWIND = 2; // 0x2
-    field public static final int FLAG_KEY_MEDIA_STOP = 32; // 0x20
-    field public static final int KEYCODE_MEDIA_PAUSE = 127; // 0x7f
-    field public static final int KEYCODE_MEDIA_PLAY = 126; // 0x7e
-    field public static final int KEYCODE_MEDIA_RECORD = 130; // 0x82
-  }
-
-  public abstract class TransportPerformer {
-    ctor public TransportPerformer();
-    method public void onAudioFocusChange(int);
-    method public int onGetBufferPercentage();
-    method public abstract long onGetCurrentPosition();
-    method public abstract long onGetDuration();
-    method public int onGetTransportControlFlags();
-    method public abstract boolean onIsPlaying();
-    method public boolean onMediaButtonDown(int, android.view.KeyEvent);
-    method public boolean onMediaButtonUp(int, android.view.KeyEvent);
-    method public abstract void onPause();
-    method public abstract void onSeekTo(long);
-    method public abstract void onStart();
-    method public abstract void onStop();
-  }
-
-  public class TransportStateListener {
-    ctor public TransportStateListener();
-    method public void onPlayingChanged(android.support.v4.media.TransportController);
-    method public void onTransportControlsChanged(android.support.v4.media.TransportController);
-  }
-
-  public abstract class VolumeProviderCompat {
-    ctor public VolumeProviderCompat(int, int, int);
-    method public final int getCurrentVolume();
-    method public final int getMaxVolume();
-    method public final int getVolumeControl();
-    method public java.lang.Object getVolumeProvider();
-    method public void onAdjustVolume(int);
-    method public void onSetVolumeTo(int);
-    method public void setCallback(android.support.v4.media.VolumeProviderCompat.Callback);
-    method public final void setCurrentVolume(int);
-    field public static final int VOLUME_CONTROL_ABSOLUTE = 2; // 0x2
-    field public static final int VOLUME_CONTROL_FIXED = 0; // 0x0
-    field public static final int VOLUME_CONTROL_RELATIVE = 1; // 0x1
-  }
-
-  public static abstract class VolumeProviderCompat.Callback {
-    ctor public VolumeProviderCompat.Callback();
-    method public abstract void onVolumeChanged(android.support.v4.media.VolumeProviderCompat);
-  }
-
-}
-
-package android.support.v4.media.session {
-
-  public class MediaButtonReceiver extends android.content.BroadcastReceiver {
-    ctor public MediaButtonReceiver();
-    method public static android.view.KeyEvent handleIntent(android.support.v4.media.session.MediaSessionCompat, android.content.Intent);
-    method public void onReceive(android.content.Context, android.content.Intent);
-  }
-
-  public final class MediaControllerCompat {
-    ctor public MediaControllerCompat(android.content.Context, android.support.v4.media.session.MediaSessionCompat);
-    ctor public MediaControllerCompat(android.content.Context, android.support.v4.media.session.MediaSessionCompat.Token) throws android.os.RemoteException;
-    method public void adjustVolume(int, int);
-    method public boolean dispatchMediaButtonEvent(android.view.KeyEvent);
-    method public android.os.Bundle getExtras();
-    method public long getFlags();
-    method public java.lang.Object getMediaController();
-    method public android.support.v4.media.MediaMetadataCompat getMetadata();
-    method public java.lang.String getPackageName();
-    method public android.support.v4.media.session.MediaControllerCompat.PlaybackInfo getPlaybackInfo();
-    method public android.support.v4.media.session.PlaybackStateCompat getPlaybackState();
-    method public java.util.List<android.support.v4.media.session.MediaSessionCompat.QueueItem> getQueue();
-    method public java.lang.CharSequence getQueueTitle();
-    method public int getRatingType();
-    method public android.app.PendingIntent getSessionActivity();
-    method public android.support.v4.media.session.MediaSessionCompat.Token getSessionToken();
-    method public android.support.v4.media.session.MediaControllerCompat.TransportControls getTransportControls();
-    method public void registerCallback(android.support.v4.media.session.MediaControllerCompat.Callback);
-    method public void registerCallback(android.support.v4.media.session.MediaControllerCompat.Callback, android.os.Handler);
-    method public void sendCommand(java.lang.String, android.os.Bundle, android.os.ResultReceiver);
-    method public void setVolumeTo(int, int);
-    method public void unregisterCallback(android.support.v4.media.session.MediaControllerCompat.Callback);
-  }
-
-  public static abstract class MediaControllerCompat.Callback implements android.os.IBinder.DeathRecipient {
-    ctor public MediaControllerCompat.Callback();
-    method public void binderDied();
-    method public void onAudioInfoChanged(android.support.v4.media.session.MediaControllerCompat.PlaybackInfo);
-    method public void onExtrasChanged(android.os.Bundle);
-    method public void onMetadataChanged(android.support.v4.media.MediaMetadataCompat);
-    method public void onPlaybackStateChanged(android.support.v4.media.session.PlaybackStateCompat);
-    method public void onQueueChanged(java.util.List<android.support.v4.media.session.MediaSessionCompat.QueueItem>);
-    method public void onQueueTitleChanged(java.lang.CharSequence);
-    method public void onSessionDestroyed();
-    method public void onSessionEvent(java.lang.String, android.os.Bundle);
-  }
-
-  public static final class MediaControllerCompat.PlaybackInfo {
-    method public int getAudioStream();
-    method public int getCurrentVolume();
-    method public int getMaxVolume();
-    method public int getPlaybackType();
-    method public int getVolumeControl();
-    field public static final int PLAYBACK_TYPE_LOCAL = 1; // 0x1
-    field public static final int PLAYBACK_TYPE_REMOTE = 2; // 0x2
-  }
-
-  public static abstract class MediaControllerCompat.TransportControls {
-    method public abstract void fastForward();
-    method public abstract void pause();
-    method public abstract void play();
-    method public abstract void playFromMediaId(java.lang.String, android.os.Bundle);
-    method public abstract void playFromSearch(java.lang.String, android.os.Bundle);
-    method public abstract void playFromUri(android.net.Uri, android.os.Bundle);
-    method public abstract void prepare();
-    method public abstract void prepareFromMediaId(java.lang.String, android.os.Bundle);
-    method public abstract void prepareFromSearch(java.lang.String, android.os.Bundle);
-    method public abstract void prepareFromUri(android.net.Uri, android.os.Bundle);
-    method public abstract void rewind();
-    method public abstract void seekTo(long);
-    method public abstract void sendCustomAction(android.support.v4.media.session.PlaybackStateCompat.CustomAction, android.os.Bundle);
-    method public abstract void sendCustomAction(java.lang.String, android.os.Bundle);
-    method public abstract void setRating(android.support.v4.media.RatingCompat);
-    method public abstract void skipToNext();
-    method public abstract void skipToPrevious();
-    method public abstract void skipToQueueItem(long);
-    method public abstract void stop();
-  }
-
-  public class MediaSessionCompat {
-    ctor public MediaSessionCompat(android.content.Context, java.lang.String);
-    ctor public MediaSessionCompat(android.content.Context, java.lang.String, android.content.ComponentName, android.app.PendingIntent);
-    method public void addOnActiveChangeListener(android.support.v4.media.session.MediaSessionCompat.OnActiveChangeListener);
-    method public android.support.v4.media.session.MediaControllerCompat getController();
-    method public java.lang.Object getMediaSession();
-    method public java.lang.Object getRemoteControlClient();
-    method public android.support.v4.media.session.MediaSessionCompat.Token getSessionToken();
-    method public boolean isActive();
-    method public static android.support.v4.media.session.MediaSessionCompat obtain(android.content.Context, java.lang.Object);
-    method public void release();
-    method public void removeOnActiveChangeListener(android.support.v4.media.session.MediaSessionCompat.OnActiveChangeListener);
-    method public void sendSessionEvent(java.lang.String, android.os.Bundle);
-    method public void setActive(boolean);
-    method public void setCallback(android.support.v4.media.session.MediaSessionCompat.Callback);
-    method public void setCallback(android.support.v4.media.session.MediaSessionCompat.Callback, android.os.Handler);
-    method public void setExtras(android.os.Bundle);
-    method public void setFlags(int);
-    method public void setMediaButtonReceiver(android.app.PendingIntent);
-    method public void setMetadata(android.support.v4.media.MediaMetadataCompat);
-    method public void setPlaybackState(android.support.v4.media.session.PlaybackStateCompat);
-    method public void setPlaybackToLocal(int);
-    method public void setPlaybackToRemote(android.support.v4.media.VolumeProviderCompat);
-    method public void setQueue(java.util.List<android.support.v4.media.session.MediaSessionCompat.QueueItem>);
-    method public void setQueueTitle(java.lang.CharSequence);
-    method public void setRatingType(int);
-    method public void setSessionActivity(android.app.PendingIntent);
-    field public static final int FLAG_HANDLES_MEDIA_BUTTONS = 1; // 0x1
-    field public static final int FLAG_HANDLES_TRANSPORT_CONTROLS = 2; // 0x2
-  }
-
-  public static abstract class MediaSessionCompat.Callback {
-    ctor public MediaSessionCompat.Callback();
-    method public void onCommand(java.lang.String, android.os.Bundle, android.os.ResultReceiver);
-    method public void onCustomAction(java.lang.String, android.os.Bundle);
-    method public void onFastForward();
-    method public boolean onMediaButtonEvent(android.content.Intent);
-    method public void onPause();
-    method public void onPlay();
-    method public void onPlayFromMediaId(java.lang.String, android.os.Bundle);
-    method public void onPlayFromSearch(java.lang.String, android.os.Bundle);
-    method public void onPlayFromUri(android.net.Uri, android.os.Bundle);
-    method public void onPrepare();
-    method public void onPrepareFromMediaId(java.lang.String, android.os.Bundle);
-    method public void onPrepareFromSearch(java.lang.String, android.os.Bundle);
-    method public void onPrepareFromUri(android.net.Uri, android.os.Bundle);
-    method public void onRewind();
-    method public void onSeekTo(long);
-    method public void onSetRating(android.support.v4.media.RatingCompat);
-    method public void onSkipToNext();
-    method public void onSkipToPrevious();
-    method public void onSkipToQueueItem(long);
-    method public void onStop();
-  }
-
-  public static abstract interface MediaSessionCompat.OnActiveChangeListener {
-    method public abstract void onActiveChanged();
-  }
-
-  public static final class MediaSessionCompat.QueueItem implements android.os.Parcelable {
-    ctor public MediaSessionCompat.QueueItem(android.support.v4.media.MediaDescriptionCompat, long);
-    method public int describeContents();
-    method public android.support.v4.media.MediaDescriptionCompat getDescription();
-    method public long getQueueId();
-    method public java.lang.Object getQueueItem();
-    method public static android.support.v4.media.session.MediaSessionCompat.QueueItem obtain(java.lang.Object);
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.support.v4.media.session.MediaSessionCompat.QueueItem> CREATOR;
-    field public static final int UNKNOWN_ID = -1; // 0xffffffff
-  }
-
-  public static final class MediaSessionCompat.Token implements android.os.Parcelable {
-    method public int describeContents();
-    method public static android.support.v4.media.session.MediaSessionCompat.Token fromToken(java.lang.Object);
-    method public java.lang.Object getToken();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.support.v4.media.session.MediaSessionCompat.Token> CREATOR;
-  }
-
-  public class ParcelableVolumeInfo implements android.os.Parcelable {
-    ctor public ParcelableVolumeInfo(int, int, int, int, int);
-    ctor public ParcelableVolumeInfo(android.os.Parcel);
-    method public int describeContents();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.support.v4.media.session.ParcelableVolumeInfo> CREATOR;
-    field public int audioStream;
-    field public int controlType;
-    field public int currentVolume;
-    field public int maxVolume;
-    field public int volumeType;
-  }
-
-  public final class PlaybackStateCompat implements android.os.Parcelable {
-    method public int describeContents();
-    method public static android.support.v4.media.session.PlaybackStateCompat fromPlaybackState(java.lang.Object);
-    method public long getActions();
-    method public long getActiveQueueItemId();
-    method public long getBufferedPosition();
-    method public java.util.List<android.support.v4.media.session.PlaybackStateCompat.CustomAction> getCustomActions();
-    method public java.lang.CharSequence getErrorMessage();
-    method public android.os.Bundle getExtras();
-    method public long getLastPositionUpdateTime();
-    method public float getPlaybackSpeed();
-    method public java.lang.Object getPlaybackState();
-    method public long getPosition();
-    method public int getState();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final long ACTION_FAST_FORWARD = 64L; // 0x40L
-    field public static final long ACTION_PAUSE = 2L; // 0x2L
-    field public static final long ACTION_PLAY = 4L; // 0x4L
-    field public static final long ACTION_PLAY_FROM_MEDIA_ID = 1024L; // 0x400L
-    field public static final long ACTION_PLAY_FROM_SEARCH = 2048L; // 0x800L
-    field public static final long ACTION_PLAY_FROM_URI = 8192L; // 0x2000L
-    field public static final long ACTION_PLAY_PAUSE = 512L; // 0x200L
-    field public static final long ACTION_PREPARE = 16384L; // 0x4000L
-    field public static final long ACTION_PREPARE_FROM_MEDIA_ID = 32768L; // 0x8000L
-    field public static final long ACTION_PREPARE_FROM_SEARCH = 65536L; // 0x10000L
-    field public static final long ACTION_PREPARE_FROM_URI = 131072L; // 0x20000L
-    field public static final long ACTION_REWIND = 8L; // 0x8L
-    field public static final long ACTION_SEEK_TO = 256L; // 0x100L
-    field public static final long ACTION_SET_RATING = 128L; // 0x80L
-    field public static final long ACTION_SKIP_TO_NEXT = 32L; // 0x20L
-    field public static final long ACTION_SKIP_TO_PREVIOUS = 16L; // 0x10L
-    field public static final long ACTION_SKIP_TO_QUEUE_ITEM = 4096L; // 0x1000L
-    field public static final long ACTION_STOP = 1L; // 0x1L
-    field public static final android.os.Parcelable.Creator<android.support.v4.media.session.PlaybackStateCompat> CREATOR;
-    field public static final long PLAYBACK_POSITION_UNKNOWN = -1L; // 0xffffffffffffffffL
-    field public static final int STATE_BUFFERING = 6; // 0x6
-    field public static final int STATE_CONNECTING = 8; // 0x8
-    field public static final int STATE_ERROR = 7; // 0x7
-    field public static final int STATE_FAST_FORWARDING = 4; // 0x4
-    field public static final int STATE_NONE = 0; // 0x0
-    field public static final int STATE_PAUSED = 2; // 0x2
-    field public static final int STATE_PLAYING = 3; // 0x3
-    field public static final int STATE_REWINDING = 5; // 0x5
-    field public static final int STATE_SKIPPING_TO_NEXT = 10; // 0xa
-    field public static final int STATE_SKIPPING_TO_PREVIOUS = 9; // 0x9
-    field public static final int STATE_SKIPPING_TO_QUEUE_ITEM = 11; // 0xb
-    field public static final int STATE_STOPPED = 1; // 0x1
-  }
-
-  public static final class PlaybackStateCompat.Builder {
-    ctor public PlaybackStateCompat.Builder();
-    ctor public PlaybackStateCompat.Builder(android.support.v4.media.session.PlaybackStateCompat);
-    method public android.support.v4.media.session.PlaybackStateCompat.Builder addCustomAction(java.lang.String, java.lang.String, int);
-    method public android.support.v4.media.session.PlaybackStateCompat.Builder addCustomAction(android.support.v4.media.session.PlaybackStateCompat.CustomAction);
-    method public android.support.v4.media.session.PlaybackStateCompat build();
-    method public android.support.v4.media.session.PlaybackStateCompat.Builder setActions(long);
-    method public android.support.v4.media.session.PlaybackStateCompat.Builder setActiveQueueItemId(long);
-    method public android.support.v4.media.session.PlaybackStateCompat.Builder setBufferedPosition(long);
-    method public android.support.v4.media.session.PlaybackStateCompat.Builder setErrorMessage(java.lang.CharSequence);
-    method public android.support.v4.media.session.PlaybackStateCompat.Builder setExtras(android.os.Bundle);
-    method public android.support.v4.media.session.PlaybackStateCompat.Builder setState(int, long, float);
-    method public android.support.v4.media.session.PlaybackStateCompat.Builder setState(int, long, float, long);
-  }
-
-  public static final class PlaybackStateCompat.CustomAction implements android.os.Parcelable {
-    method public int describeContents();
-    method public static android.support.v4.media.session.PlaybackStateCompat.CustomAction fromCustomAction(java.lang.Object);
-    method public java.lang.String getAction();
-    method public java.lang.Object getCustomAction();
-    method public android.os.Bundle getExtras();
-    method public int getIcon();
-    method public java.lang.CharSequence getName();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.support.v4.media.session.PlaybackStateCompat.CustomAction> CREATOR;
-  }
-
-  public static final class PlaybackStateCompat.CustomAction.Builder {
-    ctor public PlaybackStateCompat.CustomAction.Builder(java.lang.String, java.lang.CharSequence, int);
-    method public android.support.v4.media.session.PlaybackStateCompat.CustomAction build();
-    method public android.support.v4.media.session.PlaybackStateCompat.CustomAction.Builder setExtras(android.os.Bundle);
-  }
-
-}
-
-package android.support.v4.net {
-
-  public final class ConnectivityManagerCompat {
-    method public static android.net.NetworkInfo getNetworkInfoFromBroadcast(android.net.ConnectivityManager, android.content.Intent);
-    method public static boolean isActiveNetworkMetered(android.net.ConnectivityManager);
-  }
-
-  public final class TrafficStatsCompat {
-    method public static void clearThreadStatsTag();
-    method public static int getThreadStatsTag();
-    method public static void incrementOperationCount(int);
-    method public static void incrementOperationCount(int, int);
-    method public static void setThreadStatsTag(int);
-    method public static void tagDatagramSocket(java.net.DatagramSocket) throws java.net.SocketException;
-    method public static void tagSocket(java.net.Socket) throws java.net.SocketException;
-    method public static void untagDatagramSocket(java.net.DatagramSocket) throws java.net.SocketException;
-    method public static void untagSocket(java.net.Socket) throws java.net.SocketException;
-  }
-
-}
-
-package android.support.v4.os {
-
-  public final class AsyncTaskCompat {
-    method public static android.os.AsyncTask<Params, Progress, Result> executeParallel(android.os.AsyncTask<Params, Progress, Result>, Params...);
-  }
-
-  public class BuildCompat {
-    method public static boolean isAtLeastN();
-  }
-
-  public final class CancellationSignal {
-    ctor public CancellationSignal();
-    method public void cancel();
-    method public java.lang.Object getCancellationSignalObject();
-    method public boolean isCanceled();
-    method public void setOnCancelListener(android.support.v4.os.CancellationSignal.OnCancelListener);
-    method public void throwIfCanceled();
-  }
-
-  public static abstract interface CancellationSignal.OnCancelListener {
-    method public abstract void onCancel();
-  }
-
-  public final class EnvironmentCompat {
-    method public static java.lang.String getStorageState(java.io.File);
-    field public static final java.lang.String MEDIA_UNKNOWN = "unknown";
-  }
-
-  public class OperationCanceledException extends java.lang.RuntimeException {
-    ctor public OperationCanceledException();
-    ctor public OperationCanceledException(java.lang.String);
-  }
-
-  public final class ParcelableCompat {
-    method public static android.os.Parcelable.Creator<T> newCreator(android.support.v4.os.ParcelableCompatCreatorCallbacks<T>);
-  }
-
-  public abstract interface ParcelableCompatCreatorCallbacks {
-    method public abstract T createFromParcel(android.os.Parcel, java.lang.ClassLoader);
-    method public abstract T[] newArray(int);
-  }
-
-  public final class TraceCompat {
-    method public static void beginSection(java.lang.String);
-    method public static void endSection();
-  }
-
-  public class UserManagerCompat {
-    method public static boolean isUserUnlocked(android.content.Context);
-  }
-
-}
-
-package android.support.v4.print {
-
-  public final class PrintHelper {
-    ctor public PrintHelper(android.content.Context);
-    method public int getColorMode();
-    method public int getOrientation();
-    method public int getScaleMode();
-    method public void printBitmap(java.lang.String, android.graphics.Bitmap);
-    method public void printBitmap(java.lang.String, android.graphics.Bitmap, android.support.v4.print.PrintHelper.OnPrintFinishCallback);
-    method public void printBitmap(java.lang.String, android.net.Uri) throws java.io.FileNotFoundException;
-    method public void printBitmap(java.lang.String, android.net.Uri, android.support.v4.print.PrintHelper.OnPrintFinishCallback) throws java.io.FileNotFoundException;
-    method public void setColorMode(int);
-    method public void setOrientation(int);
-    method public void setScaleMode(int);
-    method public static boolean systemSupportsPrint();
-    field public static final int COLOR_MODE_COLOR = 2; // 0x2
-    field public static final int COLOR_MODE_MONOCHROME = 1; // 0x1
-    field public static final int ORIENTATION_LANDSCAPE = 1; // 0x1
-    field public static final int ORIENTATION_PORTRAIT = 2; // 0x2
-    field public static final int SCALE_MODE_FILL = 2; // 0x2
-    field public static final int SCALE_MODE_FIT = 1; // 0x1
-  }
-
-  public static abstract interface PrintHelper.OnPrintFinishCallback {
-    method public abstract void onFinish();
-  }
-
-}
-
-package android.support.v4.provider {
-
-  public abstract class DocumentFile {
-    method public abstract boolean canRead();
-    method public abstract boolean canWrite();
-    method public abstract android.support.v4.provider.DocumentFile createDirectory(java.lang.String);
-    method public abstract android.support.v4.provider.DocumentFile createFile(java.lang.String, java.lang.String);
-    method public abstract boolean delete();
-    method public abstract boolean exists();
-    method public android.support.v4.provider.DocumentFile findFile(java.lang.String);
-    method public static android.support.v4.provider.DocumentFile fromFile(java.io.File);
-    method public static android.support.v4.provider.DocumentFile fromSingleUri(android.content.Context, android.net.Uri);
-    method public static android.support.v4.provider.DocumentFile fromTreeUri(android.content.Context, android.net.Uri);
-    method public abstract java.lang.String getName();
-    method public android.support.v4.provider.DocumentFile getParentFile();
-    method public abstract java.lang.String getType();
-    method public abstract android.net.Uri getUri();
-    method public abstract boolean isDirectory();
-    method public static boolean isDocumentUri(android.content.Context, android.net.Uri);
-    method public abstract boolean isFile();
-    method public abstract long lastModified();
-    method public abstract long length();
-    method public abstract android.support.v4.provider.DocumentFile[] listFiles();
-    method public abstract boolean renameTo(java.lang.String);
-  }
-
-}
-
-package android.support.v4.text {
-
-  public final class BidiFormatter {
-    method public static android.support.v4.text.BidiFormatter getInstance();
-    method public static android.support.v4.text.BidiFormatter getInstance(boolean);
-    method public static android.support.v4.text.BidiFormatter getInstance(java.util.Locale);
-    method public boolean getStereoReset();
-    method public boolean isRtl(java.lang.String);
-    method public boolean isRtlContext();
-    method public java.lang.String unicodeWrap(java.lang.String, android.support.v4.text.TextDirectionHeuristicCompat, boolean);
-    method public java.lang.String unicodeWrap(java.lang.String, android.support.v4.text.TextDirectionHeuristicCompat);
-    method public java.lang.String unicodeWrap(java.lang.String, boolean);
-    method public java.lang.String unicodeWrap(java.lang.String);
-  }
-
-  public static final class BidiFormatter.Builder {
-    ctor public BidiFormatter.Builder();
-    ctor public BidiFormatter.Builder(boolean);
-    ctor public BidiFormatter.Builder(java.util.Locale);
-    method public android.support.v4.text.BidiFormatter build();
-    method public android.support.v4.text.BidiFormatter.Builder setTextDirectionHeuristic(android.support.v4.text.TextDirectionHeuristicCompat);
-    method public android.support.v4.text.BidiFormatter.Builder stereoReset(boolean);
-  }
-
-  public final class ICUCompat {
-    method public static java.lang.String maximizeAndGetScript(java.util.Locale);
-  }
-
-  public abstract interface TextDirectionHeuristicCompat {
-    method public abstract boolean isRtl(char[], int, int);
-    method public abstract boolean isRtl(java.lang.CharSequence, int, int);
-  }
-
-  public final class TextDirectionHeuristicsCompat {
-    field public static final android.support.v4.text.TextDirectionHeuristicCompat ANYRTL_LTR;
-    field public static final android.support.v4.text.TextDirectionHeuristicCompat FIRSTSTRONG_LTR;
-    field public static final android.support.v4.text.TextDirectionHeuristicCompat FIRSTSTRONG_RTL;
-    field public static final android.support.v4.text.TextDirectionHeuristicCompat LOCALE;
-    field public static final android.support.v4.text.TextDirectionHeuristicCompat LTR;
-    field public static final android.support.v4.text.TextDirectionHeuristicCompat RTL;
-  }
-
-  public final class TextUtilsCompat {
-    method public static int getLayoutDirectionFromLocale(java.util.Locale);
-    method public static java.lang.String htmlEncode(java.lang.String);
-    field public static final java.util.Locale ROOT;
-  }
-
-}
-
-package android.support.v4.util {
-
-  public class ArrayMap extends android.support.v4.util.SimpleArrayMap implements java.util.Map {
-    ctor public ArrayMap();
-    ctor public ArrayMap(int);
-    ctor public ArrayMap(android.support.v4.util.SimpleArrayMap);
-    method public boolean containsAll(java.util.Collection<?>);
-    method public java.util.Set<java.util.Map.Entry<K, V>> entrySet();
-    method public java.util.Set<K> keySet();
-    method public void putAll(java.util.Map<? extends K, ? extends V>);
-    method public boolean removeAll(java.util.Collection<?>);
-    method public boolean retainAll(java.util.Collection<?>);
-    method public java.util.Collection<V> values();
-  }
-
-  public class AtomicFile {
-    ctor public AtomicFile(java.io.File);
-    method public void delete();
-    method public void failWrite(java.io.FileOutputStream);
-    method public void finishWrite(java.io.FileOutputStream);
-    method public java.io.File getBaseFile();
-    method public java.io.FileInputStream openRead() throws java.io.FileNotFoundException;
-    method public byte[] readFully() throws java.io.IOException;
-    method public java.io.FileOutputStream startWrite() throws java.io.IOException;
-  }
-
-  public final class CircularArray {
-    ctor public CircularArray();
-    ctor public CircularArray(int);
-    method public void addFirst(E);
-    method public void addLast(E);
-    method public void clear();
-    method public E get(int);
-    method public E getFirst();
-    method public E getLast();
-    method public boolean isEmpty();
-    method public E popFirst();
-    method public E popLast();
-    method public void removeFromEnd(int);
-    method public void removeFromStart(int);
-    method public int size();
-  }
-
-  public final class CircularIntArray {
-    ctor public CircularIntArray();
-    ctor public CircularIntArray(int);
-    method public void addFirst(int);
-    method public void addLast(int);
-    method public void clear();
-    method public int get(int);
-    method public int getFirst();
-    method public int getLast();
-    method public boolean isEmpty();
-    method public int popFirst();
-    method public int popLast();
-    method public void removeFromEnd(int);
-    method public void removeFromStart(int);
-    method public int size();
-  }
-
-  public class LongSparseArray {
-    ctor public LongSparseArray();
-    ctor public LongSparseArray(int);
-    method public void append(long, E);
-    method public void clear();
-    method public android.support.v4.util.LongSparseArray<E> clone();
-    method public void delete(long);
-    method public E get(long);
-    method public E get(long, E);
-    method public int indexOfKey(long);
-    method public int indexOfValue(E);
-    method public long keyAt(int);
-    method public void put(long, E);
-    method public void remove(long);
-    method public void removeAt(int);
-    method public void setValueAt(int, E);
-    method public int size();
-    method public E valueAt(int);
-  }
-
-  public class LruCache {
-    ctor public LruCache(int);
-    method protected V create(K);
-    method public final synchronized int createCount();
-    method protected void entryRemoved(boolean, K, V, V);
-    method public final void evictAll();
-    method public final synchronized int evictionCount();
-    method public final V get(K);
-    method public final synchronized int hitCount();
-    method public final synchronized int maxSize();
-    method public final synchronized int missCount();
-    method public final V put(K, V);
-    method public final synchronized int putCount();
-    method public final V remove(K);
-    method public void resize(int);
-    method public final synchronized int size();
-    method protected int sizeOf(K, V);
-    method public final synchronized java.util.Map<K, V> snapshot();
-    method public final synchronized java.lang.String toString();
-    method public void trimToSize(int);
-  }
-
-  public class Pair {
-    ctor public Pair(F, S);
-    method public static android.support.v4.util.Pair<A, B> create(A, B);
-    field public final F first;
-    field public final S second;
-  }
-
-  public final class Pools {
-  }
-
-  public static abstract interface Pools.Pool {
-    method public abstract T acquire();
-    method public abstract boolean release(T);
-  }
-
-  public static class Pools.SimplePool implements android.support.v4.util.Pools.Pool {
-    ctor public Pools.SimplePool(int);
-    method public T acquire();
-    method public boolean release(T);
-  }
-
-  public static class Pools.SynchronizedPool extends android.support.v4.util.Pools.SimplePool {
-    ctor public Pools.SynchronizedPool(int);
-  }
-
-  public class SimpleArrayMap {
-    ctor public SimpleArrayMap();
-    ctor public SimpleArrayMap(int);
-    ctor public SimpleArrayMap(android.support.v4.util.SimpleArrayMap);
-    method public void clear();
-    method public boolean containsKey(java.lang.Object);
-    method public boolean containsValue(java.lang.Object);
-    method public void ensureCapacity(int);
-    method public V get(java.lang.Object);
-    method public int indexOfKey(java.lang.Object);
-    method public boolean isEmpty();
-    method public K keyAt(int);
-    method public V put(K, V);
-    method public void putAll(android.support.v4.util.SimpleArrayMap<? extends K, ? extends V>);
-    method public V remove(java.lang.Object);
-    method public V removeAt(int);
-    method public V setValueAt(int, V);
-    method public int size();
-    method public V valueAt(int);
-  }
-
-  public class SparseArrayCompat {
-    ctor public SparseArrayCompat();
-    ctor public SparseArrayCompat(int);
-    method public void append(int, E);
-    method public void clear();
-    method public android.support.v4.util.SparseArrayCompat<E> clone();
-    method public void delete(int);
-    method public E get(int);
-    method public E get(int, E);
-    method public int indexOfKey(int);
-    method public int indexOfValue(E);
-    method public int keyAt(int);
-    method public void put(int, E);
-    method public void remove(int);
-    method public void removeAt(int);
-    method public void removeAtRange(int, int);
-    method public void setValueAt(int, E);
-    method public int size();
-    method public E valueAt(int);
-  }
-
-}
-
-package android.support.v4.view {
-
-  public abstract class AbsSavedState implements android.os.Parcelable {
-    ctor protected AbsSavedState(android.os.Parcelable);
-    ctor protected AbsSavedState(android.os.Parcel);
-    ctor protected AbsSavedState(android.os.Parcel, java.lang.ClassLoader);
-    method public int describeContents();
-    method public final android.os.Parcelable getSuperState();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.support.v4.view.AbsSavedState> CREATOR;
-    field public static final android.support.v4.view.AbsSavedState EMPTY_STATE;
-  }
-
-  public class AccessibilityDelegateCompat {
-    ctor public AccessibilityDelegateCompat();
-    method public boolean dispatchPopulateAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
-    method public android.support.v4.view.accessibility.AccessibilityNodeProviderCompat getAccessibilityNodeProvider(android.view.View);
-    method public void onInitializeAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
-    method public void onInitializeAccessibilityNodeInfo(android.view.View, android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
-    method public void onPopulateAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
-    method public boolean onRequestSendAccessibilityEvent(android.view.ViewGroup, android.view.View, android.view.accessibility.AccessibilityEvent);
-    method public boolean performAccessibilityAction(android.view.View, int, android.os.Bundle);
-    method public void sendAccessibilityEvent(android.view.View, int);
-    method public void sendAccessibilityEventUnchecked(android.view.View, android.view.accessibility.AccessibilityEvent);
-  }
-
-  public abstract class ActionProvider {
-    ctor public ActionProvider(android.content.Context);
-    method public android.content.Context getContext();
-    method public boolean hasSubMenu();
-    method public boolean isVisible();
-    method public abstract android.view.View onCreateActionView();
-    method public android.view.View onCreateActionView(android.view.MenuItem);
-    method public boolean onPerformDefaultAction();
-    method public void onPrepareSubMenu(android.view.SubMenu);
-    method public boolean overridesItemVisibility();
-    method public void refreshVisibility();
-    method public void setVisibilityListener(android.support.v4.view.ActionProvider.VisibilityListener);
-  }
-
-  public static abstract interface ActionProvider.VisibilityListener {
-    method public abstract void onActionProviderVisibilityChanged(boolean);
-  }
-
-  public final class AsyncLayoutInflater {
-    ctor public AsyncLayoutInflater(android.content.Context);
-    method public void inflate(int, android.view.ViewGroup, android.support.v4.view.AsyncLayoutInflater.OnInflateFinishedListener);
-  }
-
-  public static abstract interface AsyncLayoutInflater.OnInflateFinishedListener {
-    method public abstract void onInflateFinished(android.view.View, int, android.view.ViewGroup);
-  }
-
-  public final class GestureDetectorCompat {
-    ctor public GestureDetectorCompat(android.content.Context, android.view.GestureDetector.OnGestureListener);
-    ctor public GestureDetectorCompat(android.content.Context, android.view.GestureDetector.OnGestureListener, android.os.Handler);
-    method public boolean isLongpressEnabled();
-    method public boolean onTouchEvent(android.view.MotionEvent);
-    method public void setIsLongpressEnabled(boolean);
-    method public void setOnDoubleTapListener(android.view.GestureDetector.OnDoubleTapListener);
-  }
-
-  public final class GravityCompat {
-    method public static void apply(int, int, int, android.graphics.Rect, android.graphics.Rect, int);
-    method public static void apply(int, int, int, android.graphics.Rect, int, int, android.graphics.Rect, int);
-    method public static void applyDisplay(int, android.graphics.Rect, android.graphics.Rect, int);
-    method public static int getAbsoluteGravity(int, int);
-    field public static final int END = 8388613; // 0x800005
-    field public static final int RELATIVE_HORIZONTAL_GRAVITY_MASK = 8388615; // 0x800007
-    field public static final int RELATIVE_LAYOUT_DIRECTION = 8388608; // 0x800000
-    field public static final int START = 8388611; // 0x800003
-  }
-
-  public final class InputDeviceCompat {
-    field public static final int SOURCE_ANY = -256; // 0xffffff00
-    field public static final int SOURCE_CLASS_BUTTON = 1; // 0x1
-    field public static final int SOURCE_CLASS_JOYSTICK = 16; // 0x10
-    field public static final int SOURCE_CLASS_MASK = 255; // 0xff
-    field public static final int SOURCE_CLASS_NONE = 0; // 0x0
-    field public static final int SOURCE_CLASS_POINTER = 2; // 0x2
-    field public static final int SOURCE_CLASS_POSITION = 8; // 0x8
-    field public static final int SOURCE_CLASS_TRACKBALL = 4; // 0x4
-    field public static final int SOURCE_DPAD = 513; // 0x201
-    field public static final int SOURCE_GAMEPAD = 1025; // 0x401
-    field public static final int SOURCE_HDMI = 33554433; // 0x2000001
-    field public static final int SOURCE_JOYSTICK = 16777232; // 0x1000010
-    field public static final int SOURCE_KEYBOARD = 257; // 0x101
-    field public static final int SOURCE_MOUSE = 8194; // 0x2002
-    field public static final int SOURCE_STYLUS = 16386; // 0x4002
-    field public static final int SOURCE_TOUCHPAD = 1048584; // 0x100008
-    field public static final int SOURCE_TOUCHSCREEN = 4098; // 0x1002
-    field public static final int SOURCE_TOUCH_NAVIGATION = 2097152; // 0x200000
-    field public static final int SOURCE_TRACKBALL = 65540; // 0x10004
-    field public static final int SOURCE_UNKNOWN = 0; // 0x0
-  }
-
-  public final class KeyEventCompat {
-    method public static boolean dispatch(android.view.KeyEvent, android.view.KeyEvent.Callback, java.lang.Object, java.lang.Object);
-    method public static java.lang.Object getKeyDispatcherState(android.view.View);
-    method public static boolean hasModifiers(android.view.KeyEvent, int);
-    method public static boolean hasNoModifiers(android.view.KeyEvent);
-    method public static boolean isCtrlPressed(android.view.KeyEvent);
-    method public static boolean isTracking(android.view.KeyEvent);
-    method public static boolean metaStateHasModifiers(int, int);
-    method public static boolean metaStateHasNoModifiers(int);
-    method public static int normalizeMetaState(int);
-    method public static void startTracking(android.view.KeyEvent);
-  }
-
-  public final class LayoutInflaterCompat {
-    method public static android.support.v4.view.LayoutInflaterFactory getFactory(android.view.LayoutInflater);
-    method public static void setFactory(android.view.LayoutInflater, android.support.v4.view.LayoutInflaterFactory);
-  }
-
-  public abstract interface LayoutInflaterFactory {
-    method public abstract android.view.View onCreateView(android.view.View, java.lang.String, android.content.Context, android.util.AttributeSet);
-  }
-
-  public final class MarginLayoutParamsCompat {
-    method public static int getLayoutDirection(android.view.ViewGroup.MarginLayoutParams);
-    method public static int getMarginEnd(android.view.ViewGroup.MarginLayoutParams);
-    method public static int getMarginStart(android.view.ViewGroup.MarginLayoutParams);
-    method public static boolean isMarginRelative(android.view.ViewGroup.MarginLayoutParams);
-    method public static void resolveLayoutDirection(android.view.ViewGroup.MarginLayoutParams, int);
-    method public static void setLayoutDirection(android.view.ViewGroup.MarginLayoutParams, int);
-    method public static void setMarginEnd(android.view.ViewGroup.MarginLayoutParams, int);
-    method public static void setMarginStart(android.view.ViewGroup.MarginLayoutParams, int);
-  }
-
-  public final class MenuCompat {
-    method public static deprecated void setShowAsAction(android.view.MenuItem, int);
-  }
-
-  public final class MenuItemCompat {
-    method public static boolean collapseActionView(android.view.MenuItem);
-    method public static boolean expandActionView(android.view.MenuItem);
-    method public static android.support.v4.view.ActionProvider getActionProvider(android.view.MenuItem);
-    method public static android.view.View getActionView(android.view.MenuItem);
-    method public static boolean isActionViewExpanded(android.view.MenuItem);
-    method public static android.view.MenuItem setActionProvider(android.view.MenuItem, android.support.v4.view.ActionProvider);
-    method public static android.view.MenuItem setActionView(android.view.MenuItem, android.view.View);
-    method public static android.view.MenuItem setActionView(android.view.MenuItem, int);
-    method public static android.view.MenuItem setOnActionExpandListener(android.view.MenuItem, android.support.v4.view.MenuItemCompat.OnActionExpandListener);
-    method public static void setShowAsAction(android.view.MenuItem, int);
-    field public static final int SHOW_AS_ACTION_ALWAYS = 2; // 0x2
-    field public static final int SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW = 8; // 0x8
-    field public static final int SHOW_AS_ACTION_IF_ROOM = 1; // 0x1
-    field public static final int SHOW_AS_ACTION_NEVER = 0; // 0x0
-    field public static final int SHOW_AS_ACTION_WITH_TEXT = 4; // 0x4
-  }
-
-  public static abstract interface MenuItemCompat.OnActionExpandListener {
-    method public abstract boolean onMenuItemActionCollapse(android.view.MenuItem);
-    method public abstract boolean onMenuItemActionExpand(android.view.MenuItem);
-  }
-
-  public final class MotionEventCompat {
-    method public static int findPointerIndex(android.view.MotionEvent, int);
-    method public static int getActionIndex(android.view.MotionEvent);
-    method public static int getActionMasked(android.view.MotionEvent);
-    method public static float getAxisValue(android.view.MotionEvent, int);
-    method public static float getAxisValue(android.view.MotionEvent, int, int);
-    method public static int getButtonState(android.view.MotionEvent);
-    method public static int getPointerCount(android.view.MotionEvent);
-    method public static int getPointerId(android.view.MotionEvent, int);
-    method public static int getSource(android.view.MotionEvent);
-    method public static float getX(android.view.MotionEvent, int);
-    method public static float getY(android.view.MotionEvent, int);
-    method public static boolean isFromSource(android.view.MotionEvent, int);
-    field public static final int ACTION_HOVER_ENTER = 9; // 0x9
-    field public static final int ACTION_HOVER_EXIT = 10; // 0xa
-    field public static final int ACTION_HOVER_MOVE = 7; // 0x7
-    field public static final int ACTION_MASK = 255; // 0xff
-    field public static final int ACTION_POINTER_DOWN = 5; // 0x5
-    field public static final int ACTION_POINTER_INDEX_MASK = 65280; // 0xff00
-    field public static final int ACTION_POINTER_INDEX_SHIFT = 8; // 0x8
-    field public static final int ACTION_POINTER_UP = 6; // 0x6
-    field public static final int ACTION_SCROLL = 8; // 0x8
-    field public static final int AXIS_BRAKE = 23; // 0x17
-    field public static final int AXIS_DISTANCE = 24; // 0x18
-    field public static final int AXIS_GAS = 22; // 0x16
-    field public static final int AXIS_GENERIC_1 = 32; // 0x20
-    field public static final int AXIS_GENERIC_10 = 41; // 0x29
-    field public static final int AXIS_GENERIC_11 = 42; // 0x2a
-    field public static final int AXIS_GENERIC_12 = 43; // 0x2b
-    field public static final int AXIS_GENERIC_13 = 44; // 0x2c
-    field public static final int AXIS_GENERIC_14 = 45; // 0x2d
-    field public static final int AXIS_GENERIC_15 = 46; // 0x2e
-    field public static final int AXIS_GENERIC_16 = 47; // 0x2f
-    field public static final int AXIS_GENERIC_2 = 33; // 0x21
-    field public static final int AXIS_GENERIC_3 = 34; // 0x22
-    field public static final int AXIS_GENERIC_4 = 35; // 0x23
-    field public static final int AXIS_GENERIC_5 = 36; // 0x24
-    field public static final int AXIS_GENERIC_6 = 37; // 0x25
-    field public static final int AXIS_GENERIC_7 = 38; // 0x26
-    field public static final int AXIS_GENERIC_8 = 39; // 0x27
-    field public static final int AXIS_GENERIC_9 = 40; // 0x28
-    field public static final int AXIS_HAT_X = 15; // 0xf
-    field public static final int AXIS_HAT_Y = 16; // 0x10
-    field public static final int AXIS_HSCROLL = 10; // 0xa
-    field public static final int AXIS_LTRIGGER = 17; // 0x11
-    field public static final int AXIS_ORIENTATION = 8; // 0x8
-    field public static final int AXIS_PRESSURE = 2; // 0x2
-    field public static final int AXIS_RELATIVE_X = 27; // 0x1b
-    field public static final int AXIS_RELATIVE_Y = 28; // 0x1c
-    field public static final int AXIS_RTRIGGER = 18; // 0x12
-    field public static final int AXIS_RUDDER = 20; // 0x14
-    field public static final int AXIS_RX = 12; // 0xc
-    field public static final int AXIS_RY = 13; // 0xd
-    field public static final int AXIS_RZ = 14; // 0xe
-    field public static final int AXIS_SIZE = 3; // 0x3
-    field public static final int AXIS_THROTTLE = 19; // 0x13
-    field public static final int AXIS_TILT = 25; // 0x19
-    field public static final int AXIS_TOOL_MAJOR = 6; // 0x6
-    field public static final int AXIS_TOOL_MINOR = 7; // 0x7
-    field public static final int AXIS_TOUCH_MAJOR = 4; // 0x4
-    field public static final int AXIS_TOUCH_MINOR = 5; // 0x5
-    field public static final int AXIS_VSCROLL = 9; // 0x9
-    field public static final int AXIS_WHEEL = 21; // 0x15
-    field public static final int AXIS_X = 0; // 0x0
-    field public static final int AXIS_Y = 1; // 0x1
-    field public static final int AXIS_Z = 11; // 0xb
-    field public static final int BUTTON_PRIMARY = 1; // 0x1
-  }
-
-  public abstract interface NestedScrollingChild {
-    method public abstract boolean dispatchNestedFling(float, float, boolean);
-    method public abstract boolean dispatchNestedPreFling(float, float);
-    method public abstract boolean dispatchNestedPreScroll(int, int, int[], int[]);
-    method public abstract boolean dispatchNestedScroll(int, int, int, int, int[]);
-    method public abstract boolean hasNestedScrollingParent();
-    method public abstract boolean isNestedScrollingEnabled();
-    method public abstract void setNestedScrollingEnabled(boolean);
-    method public abstract boolean startNestedScroll(int);
-    method public abstract void stopNestedScroll();
-  }
-
-  public class NestedScrollingChildHelper {
-    ctor public NestedScrollingChildHelper(android.view.View);
-    method public boolean dispatchNestedFling(float, float, boolean);
-    method public boolean dispatchNestedPreFling(float, float);
-    method public boolean dispatchNestedPreScroll(int, int, int[], int[]);
-    method public boolean dispatchNestedScroll(int, int, int, int, int[]);
-    method public boolean hasNestedScrollingParent();
-    method public boolean isNestedScrollingEnabled();
-    method public void onDetachedFromWindow();
-    method public void onStopNestedScroll(android.view.View);
-    method public void setNestedScrollingEnabled(boolean);
-    method public boolean startNestedScroll(int);
-    method public void stopNestedScroll();
-  }
-
-  public abstract interface NestedScrollingParent {
-    method public abstract int getNestedScrollAxes();
-    method public abstract boolean onNestedFling(android.view.View, float, float, boolean);
-    method public abstract boolean onNestedPreFling(android.view.View, float, float);
-    method public abstract void onNestedPreScroll(android.view.View, int, int, int[]);
-    method public abstract void onNestedScroll(android.view.View, int, int, int, int);
-    method public abstract void onNestedScrollAccepted(android.view.View, android.view.View, int);
-    method public abstract boolean onStartNestedScroll(android.view.View, android.view.View, int);
-    method public abstract void onStopNestedScroll(android.view.View);
-  }
-
-  public class NestedScrollingParentHelper {
-    ctor public NestedScrollingParentHelper(android.view.ViewGroup);
-    method public int getNestedScrollAxes();
-    method public void onNestedScrollAccepted(android.view.View, android.view.View, int);
-    method public void onStopNestedScroll(android.view.View);
-  }
-
-  public abstract interface OnApplyWindowInsetsListener {
-    method public abstract android.support.v4.view.WindowInsetsCompat onApplyWindowInsets(android.view.View, android.support.v4.view.WindowInsetsCompat);
-  }
-
-  public abstract class PagerAdapter {
-    ctor public PagerAdapter();
-    method public void destroyItem(android.view.ViewGroup, int, java.lang.Object);
-    method public deprecated void destroyItem(android.view.View, int, java.lang.Object);
-    method public void finishUpdate(android.view.ViewGroup);
-    method public deprecated void finishUpdate(android.view.View);
-    method public abstract int getCount();
-    method public int getItemPosition(java.lang.Object);
-    method public java.lang.CharSequence getPageTitle(int);
-    method public float getPageWidth(int);
-    method public java.lang.Object instantiateItem(android.view.ViewGroup, int);
-    method public deprecated java.lang.Object instantiateItem(android.view.View, int);
-    method public abstract boolean isViewFromObject(android.view.View, java.lang.Object);
-    method public void notifyDataSetChanged();
-    method public void registerDataSetObserver(android.database.DataSetObserver);
-    method public void restoreState(android.os.Parcelable, java.lang.ClassLoader);
-    method public android.os.Parcelable saveState();
-    method public void setPrimaryItem(android.view.ViewGroup, int, java.lang.Object);
-    method public deprecated void setPrimaryItem(android.view.View, int, java.lang.Object);
-    method public void startUpdate(android.view.ViewGroup);
-    method public deprecated void startUpdate(android.view.View);
-    method public void unregisterDataSetObserver(android.database.DataSetObserver);
-    field public static final int POSITION_NONE = -2; // 0xfffffffe
-    field public static final int POSITION_UNCHANGED = -1; // 0xffffffff
-  }
-
-  public class PagerTabStrip extends android.support.v4.view.PagerTitleStrip {
-    ctor public PagerTabStrip(android.content.Context);
-    ctor public PagerTabStrip(android.content.Context, android.util.AttributeSet);
-    method public boolean getDrawFullUnderline();
-    method public int getTabIndicatorColor();
-    method public void setDrawFullUnderline(boolean);
-    method public void setTabIndicatorColor(int);
-    method public void setTabIndicatorColorResource(int);
-  }
-
-  public class PagerTitleStrip extends android.view.ViewGroup {
-    ctor public PagerTitleStrip(android.content.Context);
-    ctor public PagerTitleStrip(android.content.Context, android.util.AttributeSet);
-    method public int getTextSpacing();
-    method protected void onLayout(boolean, int, int, int, int);
-    method public void setGravity(int);
-    method public void setNonPrimaryAlpha(float);
-    method public void setTextColor(int);
-    method public void setTextSize(int, float);
-    method public void setTextSpacing(int);
-  }
-
-  public final class PointerIconCompat {
-    method public static android.support.v4.view.PointerIconCompat create(android.graphics.Bitmap, float, float);
-    method public static android.support.v4.view.PointerIconCompat getSystemIcon(android.content.Context, int);
-    method public static android.support.v4.view.PointerIconCompat load(android.content.res.Resources, int);
-    field public static final int TYPE_ALIAS = 1010; // 0x3f2
-    field public static final int TYPE_ALL_SCROLL = 1013; // 0x3f5
-    field public static final int TYPE_ARROW = 1000; // 0x3e8
-    field public static final int TYPE_CELL = 1006; // 0x3ee
-    field public static final int TYPE_CONTEXT_MENU = 1001; // 0x3e9
-    field public static final int TYPE_COPY = 1011; // 0x3f3
-    field public static final int TYPE_CROSSHAIR = 1007; // 0x3ef
-    field public static final int TYPE_DEFAULT = 1000; // 0x3e8
-    field public static final int TYPE_GRAB = 1020; // 0x3fc
-    field public static final int TYPE_GRABBING = 1021; // 0x3fd
-    field public static final int TYPE_HAND = 1002; // 0x3ea
-    field public static final int TYPE_HELP = 1003; // 0x3eb
-    field public static final int TYPE_HORIZONTAL_DOUBLE_ARROW = 1014; // 0x3f6
-    field public static final int TYPE_NO_DROP = 1012; // 0x3f4
-    field public static final int TYPE_NULL = 0; // 0x0
-    field public static final int TYPE_TEXT = 1008; // 0x3f0
-    field public static final int TYPE_TOP_LEFT_DIAGONAL_DOUBLE_ARROW = 1017; // 0x3f9
-    field public static final int TYPE_TOP_RIGHT_DIAGONAL_DOUBLE_ARROW = 1016; // 0x3f8
-    field public static final int TYPE_VERTICAL_DOUBLE_ARROW = 1015; // 0x3f7
-    field public static final int TYPE_VERTICAL_TEXT = 1009; // 0x3f1
-    field public static final int TYPE_WAIT = 1004; // 0x3ec
-    field public static final int TYPE_ZOOM_IN = 1018; // 0x3fa
-    field public static final int TYPE_ZOOM_OUT = 1019; // 0x3fb
-  }
-
-  public final class ScaleGestureDetectorCompat {
-    method public static boolean isQuickScaleEnabled(java.lang.Object);
-    method public static void setQuickScaleEnabled(java.lang.Object, boolean);
-  }
-
-  public abstract interface ScrollingView {
-    method public abstract int computeHorizontalScrollExtent();
-    method public abstract int computeHorizontalScrollOffset();
-    method public abstract int computeHorizontalScrollRange();
-    method public abstract int computeVerticalScrollExtent();
-    method public abstract int computeVerticalScrollOffset();
-    method public abstract int computeVerticalScrollRange();
-  }
-
-  public abstract interface TintableBackgroundView {
-    method public abstract android.content.res.ColorStateList getSupportBackgroundTintList();
-    method public abstract android.graphics.PorterDuff.Mode getSupportBackgroundTintMode();
-    method public abstract void setSupportBackgroundTintList(android.content.res.ColorStateList);
-    method public abstract void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode);
-  }
-
-  public final class VelocityTrackerCompat {
-    method public static float getXVelocity(android.view.VelocityTracker, int);
-    method public static float getYVelocity(android.view.VelocityTracker, int);
-  }
-
-  public class ViewCompat {
-    ctor protected ViewCompat();
-    method public static android.support.v4.view.ViewPropertyAnimatorCompat animate(android.view.View);
-    method public static boolean canScrollHorizontally(android.view.View, int);
-    method public static boolean canScrollVertically(android.view.View, int);
-    method public static int combineMeasuredStates(int, int);
-    method public static android.support.v4.view.WindowInsetsCompat dispatchApplyWindowInsets(android.view.View, android.support.v4.view.WindowInsetsCompat);
-    method public static void dispatchFinishTemporaryDetach(android.view.View);
-    method public static boolean dispatchNestedFling(android.view.View, float, float, boolean);
-    method public static boolean dispatchNestedPreFling(android.view.View, float, float);
-    method public static boolean dispatchNestedPreScroll(android.view.View, int, int, int[], int[]);
-    method public static boolean dispatchNestedScroll(android.view.View, int, int, int, int, int[]);
-    method public static void dispatchStartTemporaryDetach(android.view.View);
-    method public static int getAccessibilityLiveRegion(android.view.View);
-    method public static android.support.v4.view.accessibility.AccessibilityNodeProviderCompat getAccessibilityNodeProvider(android.view.View);
-    method public static float getAlpha(android.view.View);
-    method public static android.content.res.ColorStateList getBackgroundTintList(android.view.View);
-    method public static android.graphics.PorterDuff.Mode getBackgroundTintMode(android.view.View);
-    method public static android.graphics.Rect getClipBounds(android.view.View);
-    method public static float getElevation(android.view.View);
-    method public static boolean getFitsSystemWindows(android.view.View);
-    method public static int getImportantForAccessibility(android.view.View);
-    method public static int getLabelFor(android.view.View);
-    method public static int getLayerType(android.view.View);
-    method public static int getLayoutDirection(android.view.View);
-    method public static android.graphics.Matrix getMatrix(android.view.View);
-    method public static int getMeasuredHeightAndState(android.view.View);
-    method public static int getMeasuredState(android.view.View);
-    method public static int getMeasuredWidthAndState(android.view.View);
-    method public static int getMinimumHeight(android.view.View);
-    method public static int getMinimumWidth(android.view.View);
-    method public static int getOverScrollMode(android.view.View);
-    method public static int getPaddingEnd(android.view.View);
-    method public static int getPaddingStart(android.view.View);
-    method public static android.view.ViewParent getParentForAccessibility(android.view.View);
-    method public static float getPivotX(android.view.View);
-    method public static float getPivotY(android.view.View);
-    method public static float getRotation(android.view.View);
-    method public static float getRotationX(android.view.View);
-    method public static float getRotationY(android.view.View);
-    method public static float getScaleX(android.view.View);
-    method public static float getScaleY(android.view.View);
-    method public static int getScrollIndicators(android.view.View);
-    method public static java.lang.String getTransitionName(android.view.View);
-    method public static float getTranslationX(android.view.View);
-    method public static float getTranslationY(android.view.View);
-    method public static float getTranslationZ(android.view.View);
-    method public static int getWindowSystemUiVisibility(android.view.View);
-    method public static float getX(android.view.View);
-    method public static float getY(android.view.View);
-    method public static float getZ(android.view.View);
-    method public static boolean hasAccessibilityDelegate(android.view.View);
-    method public static boolean hasNestedScrollingParent(android.view.View);
-    method public static boolean hasOnClickListeners(android.view.View);
-    method public static boolean hasOverlappingRendering(android.view.View);
-    method public static boolean hasTransientState(android.view.View);
-    method public static boolean isAttachedToWindow(android.view.View);
-    method public static boolean isInLayout(android.view.View);
-    method public static boolean isLaidOut(android.view.View);
-    method public static boolean isLayoutDirectionResolved(android.view.View);
-    method public static boolean isNestedScrollingEnabled(android.view.View);
-    method public static boolean isOpaque(android.view.View);
-    method public static boolean isPaddingRelative(android.view.View);
-    method public static void jumpDrawablesToCurrentState(android.view.View);
-    method public static void offsetLeftAndRight(android.view.View, int);
-    method public static void offsetTopAndBottom(android.view.View, int);
-    method public static android.support.v4.view.WindowInsetsCompat onApplyWindowInsets(android.view.View, android.support.v4.view.WindowInsetsCompat);
-    method public static void onInitializeAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
-    method public static void onInitializeAccessibilityNodeInfo(android.view.View, android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
-    method public static void onPopulateAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
-    method public static boolean performAccessibilityAction(android.view.View, int, android.os.Bundle);
-    method public static void postInvalidateOnAnimation(android.view.View);
-    method public static void postInvalidateOnAnimation(android.view.View, int, int, int, int);
-    method public static void postOnAnimation(android.view.View, java.lang.Runnable);
-    method public static void postOnAnimationDelayed(android.view.View, java.lang.Runnable, long);
-    method public static void requestApplyInsets(android.view.View);
-    method public static int resolveSizeAndState(int, int, int);
-    method public static void setAccessibilityDelegate(android.view.View, android.support.v4.view.AccessibilityDelegateCompat);
-    method public static void setAccessibilityLiveRegion(android.view.View, int);
-    method public static void setActivated(android.view.View, boolean);
-    method public static void setAlpha(android.view.View, float);
-    method public static void setBackgroundTintList(android.view.View, android.content.res.ColorStateList);
-    method public static void setBackgroundTintMode(android.view.View, android.graphics.PorterDuff.Mode);
-    method public static void setChildrenDrawingOrderEnabled(android.view.ViewGroup, boolean);
-    method public static void setClipBounds(android.view.View, android.graphics.Rect);
-    method public static void setElevation(android.view.View, float);
-    method public static void setFitsSystemWindows(android.view.View, boolean);
-    method public static void setHasTransientState(android.view.View, boolean);
-    method public static void setImportantForAccessibility(android.view.View, int);
-    method public static void setLabelFor(android.view.View, int);
-    method public static void setLayerPaint(android.view.View, android.graphics.Paint);
-    method public static void setLayerType(android.view.View, int, android.graphics.Paint);
-    method public static void setLayoutDirection(android.view.View, int);
-    method public static void setNestedScrollingEnabled(android.view.View, boolean);
-    method public static void setOnApplyWindowInsetsListener(android.view.View, android.support.v4.view.OnApplyWindowInsetsListener);
-    method public static void setOverScrollMode(android.view.View, int);
-    method public static void setPaddingRelative(android.view.View, int, int, int, int);
-    method public static void setPivotX(android.view.View, float);
-    method public static void setPivotY(android.view.View, float);
-    method public static void setPointerIcon(android.view.View, android.support.v4.view.PointerIconCompat);
-    method public static void setRotation(android.view.View, float);
-    method public static void setRotationX(android.view.View, float);
-    method public static void setRotationY(android.view.View, float);
-    method public static void setSaveFromParentEnabled(android.view.View, boolean);
-    method public static void setScaleX(android.view.View, float);
-    method public static void setScaleY(android.view.View, float);
-    method public static void setScrollIndicators(android.view.View, int);
-    method public static void setScrollIndicators(android.view.View, int, int);
-    method public static void setTransitionName(android.view.View, java.lang.String);
-    method public static void setTranslationX(android.view.View, float);
-    method public static void setTranslationY(android.view.View, float);
-    method public static void setTranslationZ(android.view.View, float);
-    method public static void setX(android.view.View, float);
-    method public static void setY(android.view.View, float);
-    method public static void setZ(android.view.View, float);
-    method public static boolean startNestedScroll(android.view.View, int);
-    method public static void stopNestedScroll(android.view.View);
-    field public static final int ACCESSIBILITY_LIVE_REGION_ASSERTIVE = 2; // 0x2
-    field public static final int ACCESSIBILITY_LIVE_REGION_NONE = 0; // 0x0
-    field public static final int ACCESSIBILITY_LIVE_REGION_POLITE = 1; // 0x1
-    field public static final int IMPORTANT_FOR_ACCESSIBILITY_AUTO = 0; // 0x0
-    field public static final int IMPORTANT_FOR_ACCESSIBILITY_NO = 2; // 0x2
-    field public static final int IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS = 4; // 0x4
-    field public static final int IMPORTANT_FOR_ACCESSIBILITY_YES = 1; // 0x1
-    field public static final int LAYER_TYPE_HARDWARE = 2; // 0x2
-    field public static final int LAYER_TYPE_NONE = 0; // 0x0
-    field public static final int LAYER_TYPE_SOFTWARE = 1; // 0x1
-    field public static final int LAYOUT_DIRECTION_INHERIT = 2; // 0x2
-    field public static final int LAYOUT_DIRECTION_LOCALE = 3; // 0x3
-    field public static final int LAYOUT_DIRECTION_LTR = 0; // 0x0
-    field public static final int LAYOUT_DIRECTION_RTL = 1; // 0x1
-    field public static final int MEASURED_HEIGHT_STATE_SHIFT = 16; // 0x10
-    field public static final int MEASURED_SIZE_MASK = 16777215; // 0xffffff
-    field public static final int MEASURED_STATE_MASK = -16777216; // 0xff000000
-    field public static final int MEASURED_STATE_TOO_SMALL = 16777216; // 0x1000000
-    field public static final int OVER_SCROLL_ALWAYS = 0; // 0x0
-    field public static final int OVER_SCROLL_IF_CONTENT_SCROLLS = 1; // 0x1
-    field public static final int OVER_SCROLL_NEVER = 2; // 0x2
-    field public static final int SCROLL_AXIS_HORIZONTAL = 1; // 0x1
-    field public static final int SCROLL_AXIS_NONE = 0; // 0x0
-    field public static final int SCROLL_AXIS_VERTICAL = 2; // 0x2
-    field public static final int SCROLL_INDICATOR_BOTTOM = 2; // 0x2
-    field public static final int SCROLL_INDICATOR_END = 32; // 0x20
-    field public static final int SCROLL_INDICATOR_LEFT = 4; // 0x4
-    field public static final int SCROLL_INDICATOR_RIGHT = 8; // 0x8
-    field public static final int SCROLL_INDICATOR_START = 16; // 0x10
-    field public static final int SCROLL_INDICATOR_TOP = 1; // 0x1
-  }
-
-  public final class ViewConfigurationCompat {
-    method public static int getScaledPagingTouchSlop(android.view.ViewConfiguration);
-    method public static boolean hasPermanentMenuKey(android.view.ViewConfiguration);
-  }
-
-  public final class ViewGroupCompat {
-    method public static int getLayoutMode(android.view.ViewGroup);
-    method public static int getNestedScrollAxes(android.view.ViewGroup);
-    method public static boolean isTransitionGroup(android.view.ViewGroup);
-    method public static boolean onRequestSendAccessibilityEvent(android.view.ViewGroup, android.view.View, android.view.accessibility.AccessibilityEvent);
-    method public static void setLayoutMode(android.view.ViewGroup, int);
-    method public static void setMotionEventSplittingEnabled(android.view.ViewGroup, boolean);
-    method public static void setTransitionGroup(android.view.ViewGroup, boolean);
-    field public static final int LAYOUT_MODE_CLIP_BOUNDS = 0; // 0x0
-    field public static final int LAYOUT_MODE_OPTICAL_BOUNDS = 1; // 0x1
-  }
-
-  public class ViewPager extends android.view.ViewGroup {
-    ctor public ViewPager(android.content.Context);
-    ctor public ViewPager(android.content.Context, android.util.AttributeSet);
-    method public void addOnAdapterChangeListener(android.support.v4.view.ViewPager.OnAdapterChangeListener);
-    method public void addOnPageChangeListener(android.support.v4.view.ViewPager.OnPageChangeListener);
-    method public boolean arrowScroll(int);
-    method public boolean beginFakeDrag();
-    method protected boolean canScroll(android.view.View, boolean, int, int, int);
-    method public void clearOnPageChangeListeners();
-    method public void endFakeDrag();
-    method public boolean executeKeyEvent(android.view.KeyEvent);
-    method public void fakeDragBy(float);
-    method public android.support.v4.view.PagerAdapter getAdapter();
-    method public int getCurrentItem();
-    method public int getOffscreenPageLimit();
-    method public int getPageMargin();
-    method public boolean isFakeDragging();
-    method protected void onLayout(boolean, int, int, int, int);
-    method protected void onPageScrolled(int, float, int);
-    method public void onRestoreInstanceState(android.os.Parcelable);
-    method public android.os.Parcelable onSaveInstanceState();
-    method public void removeOnAdapterChangeListener(android.support.v4.view.ViewPager.OnAdapterChangeListener);
-    method public void removeOnPageChangeListener(android.support.v4.view.ViewPager.OnPageChangeListener);
-    method public void setAdapter(android.support.v4.view.PagerAdapter);
-    method public void setCurrentItem(int);
-    method public void setCurrentItem(int, boolean);
-    method public void setOffscreenPageLimit(int);
-    method public deprecated void setOnPageChangeListener(android.support.v4.view.ViewPager.OnPageChangeListener);
-    method public void setPageMargin(int);
-    method public void setPageMarginDrawable(android.graphics.drawable.Drawable);
-    method public void setPageMarginDrawable(int);
-    method public void setPageTransformer(boolean, android.support.v4.view.ViewPager.PageTransformer);
-    field public static final int SCROLL_STATE_DRAGGING = 1; // 0x1
-    field public static final int SCROLL_STATE_IDLE = 0; // 0x0
-    field public static final int SCROLL_STATE_SETTLING = 2; // 0x2
-  }
-
-  public static abstract class ViewPager.DecorView implements java.lang.annotation.Annotation {
-  }
-
-  public static class ViewPager.LayoutParams extends android.view.ViewGroup.LayoutParams {
-    ctor public ViewPager.LayoutParams();
-    ctor public ViewPager.LayoutParams(android.content.Context, android.util.AttributeSet);
-    field public int gravity;
-    field public boolean isDecor;
-  }
-
-  public static abstract interface ViewPager.OnAdapterChangeListener {
-    method public abstract void onAdapterChanged(android.support.v4.view.ViewPager, android.support.v4.view.PagerAdapter, android.support.v4.view.PagerAdapter);
-  }
-
-  public static abstract interface ViewPager.OnPageChangeListener {
-    method public abstract void onPageScrollStateChanged(int);
-    method public abstract void onPageScrolled(int, float, int);
-    method public abstract void onPageSelected(int);
-  }
-
-  public static abstract interface ViewPager.PageTransformer {
-    method public abstract void transformPage(android.view.View, float);
-  }
-
-  public static class ViewPager.SavedState extends android.support.v4.view.AbsSavedState {
-    ctor public ViewPager.SavedState(android.os.Parcelable);
-    field public static final android.os.Parcelable.Creator<android.support.v4.view.ViewPager.SavedState> CREATOR;
-  }
-
-  public static class ViewPager.SimpleOnPageChangeListener implements android.support.v4.view.ViewPager.OnPageChangeListener {
-    ctor public ViewPager.SimpleOnPageChangeListener();
-    method public void onPageScrollStateChanged(int);
-    method public void onPageScrolled(int, float, int);
-    method public void onPageSelected(int);
-  }
-
-  public final class ViewParentCompat {
-    method public static void notifySubtreeAccessibilityStateChanged(android.view.ViewParent, android.view.View, android.view.View, int);
-    method public static boolean onNestedFling(android.view.ViewParent, android.view.View, float, float, boolean);
-    method public static boolean onNestedPreFling(android.view.ViewParent, android.view.View, float, float);
-    method public static void onNestedPreScroll(android.view.ViewParent, android.view.View, int, int, int[]);
-    method public static void onNestedScroll(android.view.ViewParent, android.view.View, int, int, int, int);
-    method public static void onNestedScrollAccepted(android.view.ViewParent, android.view.View, android.view.View, int);
-    method public static boolean onStartNestedScroll(android.view.ViewParent, android.view.View, android.view.View, int);
-    method public static void onStopNestedScroll(android.view.ViewParent, android.view.View);
-    method public static boolean requestSendAccessibilityEvent(android.view.ViewParent, android.view.View, android.view.accessibility.AccessibilityEvent);
-  }
-
-  public final class ViewPropertyAnimatorCompat {
-    method public android.support.v4.view.ViewPropertyAnimatorCompat alpha(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat alphaBy(float);
-    method public void cancel();
-    method public long getDuration();
-    method public android.view.animation.Interpolator getInterpolator();
-    method public long getStartDelay();
-    method public android.support.v4.view.ViewPropertyAnimatorCompat rotation(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat rotationBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat rotationX(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat rotationXBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat rotationY(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat rotationYBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat scaleX(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat scaleXBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat scaleY(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat scaleYBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat setDuration(long);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat setInterpolator(android.view.animation.Interpolator);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat setListener(android.support.v4.view.ViewPropertyAnimatorListener);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat setStartDelay(long);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat setUpdateListener(android.support.v4.view.ViewPropertyAnimatorUpdateListener);
-    method public void start();
-    method public android.support.v4.view.ViewPropertyAnimatorCompat translationX(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat translationXBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat translationY(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat translationYBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat translationZ(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat translationZBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat withEndAction(java.lang.Runnable);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat withLayer();
-    method public android.support.v4.view.ViewPropertyAnimatorCompat withStartAction(java.lang.Runnable);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat x(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat xBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat y(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat yBy(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat z(float);
-    method public android.support.v4.view.ViewPropertyAnimatorCompat zBy(float);
-  }
-
-  public abstract interface ViewPropertyAnimatorListener {
-    method public abstract void onAnimationCancel(android.view.View);
-    method public abstract void onAnimationEnd(android.view.View);
-    method public abstract void onAnimationStart(android.view.View);
-  }
-
-  public class ViewPropertyAnimatorListenerAdapter implements android.support.v4.view.ViewPropertyAnimatorListener {
-    ctor public ViewPropertyAnimatorListenerAdapter();
-    method public void onAnimationCancel(android.view.View);
-    method public void onAnimationEnd(android.view.View);
-    method public void onAnimationStart(android.view.View);
-  }
-
-  public abstract interface ViewPropertyAnimatorUpdateListener {
-    method public abstract void onAnimationUpdate(android.view.View);
-  }
-
-  public final class WindowCompat {
-    field public static final int FEATURE_ACTION_BAR = 8; // 0x8
-    field public static final int FEATURE_ACTION_BAR_OVERLAY = 9; // 0x9
-    field public static final int FEATURE_ACTION_MODE_OVERLAY = 10; // 0xa
-  }
-
-  public class WindowInsetsCompat {
-    method public android.support.v4.view.WindowInsetsCompat consumeStableInsets();
-    method public android.support.v4.view.WindowInsetsCompat consumeSystemWindowInsets();
-    method public int getStableInsetBottom();
-    method public int getStableInsetLeft();
-    method public int getStableInsetRight();
-    method public int getStableInsetTop();
-    method public int getSystemWindowInsetBottom();
-    method public int getSystemWindowInsetLeft();
-    method public int getSystemWindowInsetRight();
-    method public int getSystemWindowInsetTop();
-    method public boolean hasInsets();
-    method public boolean hasStableInsets();
-    method public boolean hasSystemWindowInsets();
-    method public boolean isConsumed();
-    method public boolean isRound();
-    method public android.support.v4.view.WindowInsetsCompat replaceSystemWindowInsets(int, int, int, int);
-    method public android.support.v4.view.WindowInsetsCompat replaceSystemWindowInsets(android.graphics.Rect);
-  }
-
-}
-
-package android.support.v4.view.accessibility {
-
-  public final class AccessibilityEventCompat {
-    method public static void appendRecord(android.view.accessibility.AccessibilityEvent, android.support.v4.view.accessibility.AccessibilityRecordCompat);
-    method public static android.support.v4.view.accessibility.AccessibilityRecordCompat asRecord(android.view.accessibility.AccessibilityEvent);
-    method public static int getContentChangeTypes(android.view.accessibility.AccessibilityEvent);
-    method public static android.support.v4.view.accessibility.AccessibilityRecordCompat getRecord(android.view.accessibility.AccessibilityEvent, int);
-    method public static int getRecordCount(android.view.accessibility.AccessibilityEvent);
-    method public static void setContentChangeTypes(android.view.accessibility.AccessibilityEvent, int);
-    field public static final int CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION = 4; // 0x4
-    field public static final int CONTENT_CHANGE_TYPE_SUBTREE = 1; // 0x1
-    field public static final int CONTENT_CHANGE_TYPE_TEXT = 2; // 0x2
-    field public static final int CONTENT_CHANGE_TYPE_UNDEFINED = 0; // 0x0
-    field public static final int TYPES_ALL_MASK = -1; // 0xffffffff
-    field public static final int TYPE_ANNOUNCEMENT = 16384; // 0x4000
-    field public static final int TYPE_GESTURE_DETECTION_END = 524288; // 0x80000
-    field public static final int TYPE_GESTURE_DETECTION_START = 262144; // 0x40000
-    field public static final int TYPE_TOUCH_EXPLORATION_GESTURE_END = 1024; // 0x400
-    field public static final int TYPE_TOUCH_EXPLORATION_GESTURE_START = 512; // 0x200
-    field public static final int TYPE_TOUCH_INTERACTION_END = 2097152; // 0x200000
-    field public static final int TYPE_TOUCH_INTERACTION_START = 1048576; // 0x100000
-    field public static final int TYPE_VIEW_ACCESSIBILITY_FOCUSED = 32768; // 0x8000
-    field public static final int TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED = 65536; // 0x10000
-    field public static final int TYPE_VIEW_HOVER_ENTER = 128; // 0x80
-    field public static final int TYPE_VIEW_HOVER_EXIT = 256; // 0x100
-    field public static final int TYPE_VIEW_SCROLLED = 4096; // 0x1000
-    field public static final int TYPE_VIEW_TEXT_SELECTION_CHANGED = 8192; // 0x2000
-    field public static final int TYPE_VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITY = 131072; // 0x20000
-    field public static final int TYPE_WINDOW_CONTENT_CHANGED = 2048; // 0x800
-  }
-
-  public final class AccessibilityManagerCompat {
-    method public static boolean addAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager, android.support.v4.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat);
-    method public static java.util.List<android.accessibilityservice.AccessibilityServiceInfo> getEnabledAccessibilityServiceList(android.view.accessibility.AccessibilityManager, int);
-    method public static java.util.List<android.accessibilityservice.AccessibilityServiceInfo> getInstalledAccessibilityServiceList(android.view.accessibility.AccessibilityManager);
-    method public static boolean isTouchExplorationEnabled(android.view.accessibility.AccessibilityManager);
-    method public static boolean removeAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager, android.support.v4.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat);
-  }
-
-  public static abstract class AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat {
-    ctor public AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat();
-    method public abstract void onAccessibilityStateChanged(boolean);
-  }
-
-  public class AccessibilityNodeInfoCompat {
-    ctor public AccessibilityNodeInfoCompat(java.lang.Object);
-    method public void addAction(int);
-    method public void addAction(android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat);
-    method public void addChild(android.view.View);
-    method public void addChild(android.view.View, int);
-    method public boolean canOpenPopup();
-    method public java.util.List<android.support.v4.view.accessibility.AccessibilityNodeInfoCompat> findAccessibilityNodeInfosByText(java.lang.String);
-    method public java.util.List<android.support.v4.view.accessibility.AccessibilityNodeInfoCompat> findAccessibilityNodeInfosByViewId(java.lang.String);
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat findFocus(int);
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat focusSearch(int);
-    method public java.util.List<android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat> getActionList();
-    method public int getActions();
-    method public void getBoundsInParent(android.graphics.Rect);
-    method public void getBoundsInScreen(android.graphics.Rect);
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getChild(int);
-    method public int getChildCount();
-    method public java.lang.CharSequence getClassName();
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat getCollectionInfo();
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat getCollectionItemInfo();
-    method public java.lang.CharSequence getContentDescription();
-    method public int getDrawingOrder();
-    method public java.lang.CharSequence getError();
-    method public android.os.Bundle getExtras();
-    method public java.lang.Object getInfo();
-    method public int getInputType();
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getLabelFor();
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getLabeledBy();
-    method public int getLiveRegion();
-    method public int getMaxTextLength();
-    method public int getMovementGranularities();
-    method public java.lang.CharSequence getPackageName();
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getParent();
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat getRangeInfo();
-    method public java.lang.CharSequence getRoleDescription();
-    method public java.lang.CharSequence getText();
-    method public int getTextSelectionEnd();
-    method public int getTextSelectionStart();
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getTraversalAfter();
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getTraversalBefore();
-    method public java.lang.String getViewIdResourceName();
-    method public android.support.v4.view.accessibility.AccessibilityWindowInfoCompat getWindow();
-    method public int getWindowId();
-    method public boolean isAccessibilityFocused();
-    method public boolean isCheckable();
-    method public boolean isChecked();
-    method public boolean isClickable();
-    method public boolean isContentInvalid();
-    method public boolean isDismissable();
-    method public boolean isEditable();
-    method public boolean isEnabled();
-    method public boolean isFocusable();
-    method public boolean isFocused();
-    method public boolean isImportantForAccessibility();
-    method public boolean isLongClickable();
-    method public boolean isMultiLine();
-    method public boolean isPassword();
-    method public boolean isScrollable();
-    method public boolean isSelected();
-    method public boolean isVisibleToUser();
-    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat obtain(android.view.View);
-    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat obtain(android.view.View, int);
-    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat obtain();
-    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat obtain(android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
-    method public boolean performAction(int);
-    method public boolean performAction(int, android.os.Bundle);
-    method public void recycle();
-    method public boolean refresh();
-    method public boolean removeAction(android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat);
-    method public boolean removeChild(android.view.View);
-    method public boolean removeChild(android.view.View, int);
-    method public void setAccessibilityFocused(boolean);
-    method public void setBoundsInParent(android.graphics.Rect);
-    method public void setBoundsInScreen(android.graphics.Rect);
-    method public void setCanOpenPopup(boolean);
-    method public void setCheckable(boolean);
-    method public void setChecked(boolean);
-    method public void setClassName(java.lang.CharSequence);
-    method public void setClickable(boolean);
-    method public void setCollectionInfo(java.lang.Object);
-    method public void setCollectionItemInfo(java.lang.Object);
-    method public void setContentDescription(java.lang.CharSequence);
-    method public void setContentInvalid(boolean);
-    method public void setDismissable(boolean);
-    method public void setDrawingOrder(int);
-    method public void setEditable(boolean);
-    method public void setEnabled(boolean);
-    method public void setError(java.lang.CharSequence);
-    method public void setFocusable(boolean);
-    method public void setFocused(boolean);
-    method public void setImportantForAccessibility(boolean);
-    method public void setInputType(int);
-    method public void setLabelFor(android.view.View);
-    method public void setLabelFor(android.view.View, int);
-    method public void setLabeledBy(android.view.View);
-    method public void setLabeledBy(android.view.View, int);
-    method public void setLiveRegion(int);
-    method public void setLongClickable(boolean);
-    method public void setMaxTextLength(int);
-    method public void setMovementGranularities(int);
-    method public void setMultiLine(boolean);
-    method public void setPackageName(java.lang.CharSequence);
-    method public void setParent(android.view.View);
-    method public void setParent(android.view.View, int);
-    method public void setPassword(boolean);
-    method public void setRangeInfo(android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat);
-    method public void setRoleDescription(java.lang.CharSequence);
-    method public void setScrollable(boolean);
-    method public void setSelected(boolean);
-    method public void setSource(android.view.View);
-    method public void setSource(android.view.View, int);
-    method public void setText(java.lang.CharSequence);
-    method public void setTextSelection(int, int);
-    method public void setTraversalAfter(android.view.View);
-    method public void setTraversalAfter(android.view.View, int);
-    method public void setTraversalBefore(android.view.View);
-    method public void setTraversalBefore(android.view.View, int);
-    method public void setViewIdResourceName(java.lang.String);
-    method public void setVisibleToUser(boolean);
-    field public static final int ACTION_ACCESSIBILITY_FOCUS = 64; // 0x40
-    field public static final java.lang.String ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN = "ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN";
-    field public static final java.lang.String ACTION_ARGUMENT_HTML_ELEMENT_STRING = "ACTION_ARGUMENT_HTML_ELEMENT_STRING";
-    field public static final java.lang.String ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT = "ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT";
-    field public static final java.lang.String ACTION_ARGUMENT_SELECTION_END_INT = "ACTION_ARGUMENT_SELECTION_END_INT";
-    field public static final java.lang.String ACTION_ARGUMENT_SELECTION_START_INT = "ACTION_ARGUMENT_SELECTION_START_INT";
-    field public static final java.lang.String ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE = "ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE";
-    field public static final int ACTION_CLEAR_ACCESSIBILITY_FOCUS = 128; // 0x80
-    field public static final int ACTION_CLEAR_FOCUS = 2; // 0x2
-    field public static final int ACTION_CLEAR_SELECTION = 8; // 0x8
-    field public static final int ACTION_CLICK = 16; // 0x10
-    field public static final int ACTION_COLLAPSE = 524288; // 0x80000
-    field public static final int ACTION_COPY = 16384; // 0x4000
-    field public static final int ACTION_CUT = 65536; // 0x10000
-    field public static final int ACTION_DISMISS = 1048576; // 0x100000
-    field public static final int ACTION_EXPAND = 262144; // 0x40000
-    field public static final int ACTION_FOCUS = 1; // 0x1
-    field public static final int ACTION_LONG_CLICK = 32; // 0x20
-    field public static final int ACTION_NEXT_AT_MOVEMENT_GRANULARITY = 256; // 0x100
-    field public static final int ACTION_NEXT_HTML_ELEMENT = 1024; // 0x400
-    field public static final int ACTION_PASTE = 32768; // 0x8000
-    field public static final int ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY = 512; // 0x200
-    field public static final int ACTION_PREVIOUS_HTML_ELEMENT = 2048; // 0x800
-    field public static final int ACTION_SCROLL_BACKWARD = 8192; // 0x2000
-    field public static final int ACTION_SCROLL_FORWARD = 4096; // 0x1000
-    field public static final int ACTION_SELECT = 4; // 0x4
-    field public static final int ACTION_SET_SELECTION = 131072; // 0x20000
-    field public static final int ACTION_SET_TEXT = 2097152; // 0x200000
-    field public static final int FOCUS_ACCESSIBILITY = 2; // 0x2
-    field public static final int FOCUS_INPUT = 1; // 0x1
-    field public static final int MOVEMENT_GRANULARITY_CHARACTER = 1; // 0x1
-    field public static final int MOVEMENT_GRANULARITY_LINE = 4; // 0x4
-    field public static final int MOVEMENT_GRANULARITY_PAGE = 16; // 0x10
-    field public static final int MOVEMENT_GRANULARITY_PARAGRAPH = 8; // 0x8
-    field public static final int MOVEMENT_GRANULARITY_WORD = 2; // 0x2
-  }
-
-  public static class AccessibilityNodeInfoCompat.AccessibilityActionCompat {
-    ctor public AccessibilityNodeInfoCompat.AccessibilityActionCompat(int, java.lang.CharSequence);
-    method public int getId();
-    method public java.lang.CharSequence getLabel();
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_ACCESSIBILITY_FOCUS;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_CLEAR_ACCESSIBILITY_FOCUS;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_CLEAR_FOCUS;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_CLEAR_SELECTION;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_CLICK;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_COLLAPSE;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_COPY;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_CUT;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_DISMISS;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_EXPAND;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_FOCUS;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_LONG_CLICK;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_NEXT_AT_MOVEMENT_GRANULARITY;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_NEXT_HTML_ELEMENT;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PASTE;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PREVIOUS_HTML_ELEMENT;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_SCROLL_BACKWARD;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_SCROLL_FORWARD;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_SELECT;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_SET_SELECTION;
-    field public static final android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_SET_TEXT;
-  }
-
-  public static class AccessibilityNodeInfoCompat.CollectionInfoCompat {
-    method public int getColumnCount();
-    method public int getRowCount();
-    method public boolean isHierarchical();
-    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat obtain(int, int, boolean, int);
-    field public static final int SELECTION_MODE_MULTIPLE = 2; // 0x2
-    field public static final int SELECTION_MODE_NONE = 0; // 0x0
-    field public static final int SELECTION_MODE_SINGLE = 1; // 0x1
-  }
-
-  public static class AccessibilityNodeInfoCompat.CollectionItemInfoCompat {
-    method public int getColumnIndex();
-    method public int getColumnSpan();
-    method public int getRowIndex();
-    method public int getRowSpan();
-    method public boolean isHeading();
-    method public boolean isSelected();
-    method public static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat obtain(int, int, int, int, boolean, boolean);
-  }
-
-  public static class AccessibilityNodeInfoCompat.RangeInfoCompat {
-    method public float getCurrent();
-    method public float getMax();
-    method public float getMin();
-    method public int getType();
-    field public static final int RANGE_TYPE_FLOAT = 1; // 0x1
-    field public static final int RANGE_TYPE_INT = 0; // 0x0
-    field public static final int RANGE_TYPE_PERCENT = 2; // 0x2
-  }
-
-  public class AccessibilityNodeProviderCompat {
-    ctor public AccessibilityNodeProviderCompat();
-    ctor public AccessibilityNodeProviderCompat(java.lang.Object);
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat createAccessibilityNodeInfo(int);
-    method public java.util.List<android.support.v4.view.accessibility.AccessibilityNodeInfoCompat> findAccessibilityNodeInfosByText(java.lang.String, int);
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat findFocus(int);
-    method public java.lang.Object getProvider();
-    method public boolean performAction(int, int, android.os.Bundle);
-  }
-
-  public class AccessibilityRecordCompat {
-    ctor public deprecated AccessibilityRecordCompat(java.lang.Object);
-    method public int getAddedCount();
-    method public java.lang.CharSequence getBeforeText();
-    method public java.lang.CharSequence getClassName();
-    method public java.lang.CharSequence getContentDescription();
-    method public int getCurrentItemIndex();
-    method public int getFromIndex();
-    method public deprecated java.lang.Object getImpl();
-    method public int getItemCount();
-    method public int getMaxScrollX();
-    method public int getMaxScrollY();
-    method public android.os.Parcelable getParcelableData();
-    method public int getRemovedCount();
-    method public int getScrollX();
-    method public int getScrollY();
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getSource();
-    method public java.util.List<java.lang.CharSequence> getText();
-    method public int getToIndex();
-    method public int getWindowId();
-    method public boolean isChecked();
-    method public boolean isEnabled();
-    method public boolean isFullScreen();
-    method public boolean isPassword();
-    method public boolean isScrollable();
-    method public static android.support.v4.view.accessibility.AccessibilityRecordCompat obtain(android.support.v4.view.accessibility.AccessibilityRecordCompat);
-    method public static android.support.v4.view.accessibility.AccessibilityRecordCompat obtain();
-    method public void recycle();
-    method public void setAddedCount(int);
-    method public void setBeforeText(java.lang.CharSequence);
-    method public void setChecked(boolean);
-    method public void setClassName(java.lang.CharSequence);
-    method public void setContentDescription(java.lang.CharSequence);
-    method public void setCurrentItemIndex(int);
-    method public void setEnabled(boolean);
-    method public void setFromIndex(int);
-    method public void setFullScreen(boolean);
-    method public void setItemCount(int);
-    method public void setMaxScrollX(int);
-    method public void setMaxScrollY(int);
-    method public void setParcelableData(android.os.Parcelable);
-    method public void setPassword(boolean);
-    method public void setRemovedCount(int);
-    method public void setScrollX(int);
-    method public void setScrollY(int);
-    method public void setScrollable(boolean);
-    method public void setSource(android.view.View);
-    method public void setSource(android.view.View, int);
-    method public void setToIndex(int);
-  }
-
-  public class AccessibilityWindowInfoCompat {
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getAnchor();
-    method public void getBoundsInScreen(android.graphics.Rect);
-    method public android.support.v4.view.accessibility.AccessibilityWindowInfoCompat getChild(int);
-    method public int getChildCount();
-    method public int getId();
-    method public int getLayer();
-    method public android.support.v4.view.accessibility.AccessibilityWindowInfoCompat getParent();
-    method public android.support.v4.view.accessibility.AccessibilityNodeInfoCompat getRoot();
-    method public java.lang.CharSequence getTitle();
-    method public int getType();
-    method public boolean isAccessibilityFocused();
-    method public boolean isActive();
-    method public boolean isFocused();
-    method public static android.support.v4.view.accessibility.AccessibilityWindowInfoCompat obtain();
-    method public static android.support.v4.view.accessibility.AccessibilityWindowInfoCompat obtain(android.support.v4.view.accessibility.AccessibilityWindowInfoCompat);
-    method public void recycle();
-    field public static final int TYPE_ACCESSIBILITY_OVERLAY = 4; // 0x4
-    field public static final int TYPE_APPLICATION = 1; // 0x1
-    field public static final int TYPE_INPUT_METHOD = 2; // 0x2
-    field public static final int TYPE_SYSTEM = 3; // 0x3
-  }
-
-}
-
-package android.support.v4.view.animation {
-
-  public class FastOutLinearInInterpolator extends android.support.v4.view.animation.LookupTableInterpolator {
-    ctor public FastOutLinearInInterpolator();
-  }
-
-  public class FastOutSlowInInterpolator extends android.support.v4.view.animation.LookupTableInterpolator {
-    ctor public FastOutSlowInInterpolator();
-  }
-
-  public class LinearOutSlowInInterpolator extends android.support.v4.view.animation.LookupTableInterpolator {
-    ctor public LinearOutSlowInInterpolator();
-  }
-
-   abstract class LookupTableInterpolator implements android.view.animation.Interpolator {
-    ctor public LookupTableInterpolator(float[]);
-    method public float getInterpolation(float);
-  }
-
-  public final class PathInterpolatorCompat {
-    method public static android.view.animation.Interpolator create(android.graphics.Path);
-    method public static android.view.animation.Interpolator create(float, float);
-    method public static android.view.animation.Interpolator create(float, float, float, float);
-  }
-
-}
-
-package android.support.v4.widget {
-
-  public abstract class AutoScrollHelper implements android.view.View.OnTouchListener {
-    ctor public AutoScrollHelper(android.view.View);
-    method public abstract boolean canTargetScrollHorizontally(int);
-    method public abstract boolean canTargetScrollVertically(int);
-    method public boolean isEnabled();
-    method public boolean isExclusive();
-    method public boolean onTouch(android.view.View, android.view.MotionEvent);
-    method public abstract void scrollTargetBy(int, int);
-    method public android.support.v4.widget.AutoScrollHelper setActivationDelay(int);
-    method public android.support.v4.widget.AutoScrollHelper setEdgeType(int);
-    method public android.support.v4.widget.AutoScrollHelper setEnabled(boolean);
-    method public android.support.v4.widget.AutoScrollHelper setExclusive(boolean);
-    method public android.support.v4.widget.AutoScrollHelper setMaximumEdges(float, float);
-    method public android.support.v4.widget.AutoScrollHelper setMaximumVelocity(float, float);
-    method public android.support.v4.widget.AutoScrollHelper setMinimumVelocity(float, float);
-    method public android.support.v4.widget.AutoScrollHelper setRampDownDuration(int);
-    method public android.support.v4.widget.AutoScrollHelper setRampUpDuration(int);
-    method public android.support.v4.widget.AutoScrollHelper setRelativeEdges(float, float);
-    method public android.support.v4.widget.AutoScrollHelper setRelativeVelocity(float, float);
-    field public static final int EDGE_TYPE_INSIDE = 0; // 0x0
-    field public static final int EDGE_TYPE_INSIDE_EXTEND = 1; // 0x1
-    field public static final int EDGE_TYPE_OUTSIDE = 2; // 0x2
-    field public static final float NO_MAX = 3.4028235E38f;
-    field public static final float NO_MIN = 0.0f;
-    field public static final float RELATIVE_UNSPECIFIED = 0.0f;
-  }
-
-  public final class CompoundButtonCompat {
-    method public static android.graphics.drawable.Drawable getButtonDrawable(android.widget.CompoundButton);
-    method public static android.content.res.ColorStateList getButtonTintList(android.widget.CompoundButton);
-    method public static android.graphics.PorterDuff.Mode getButtonTintMode(android.widget.CompoundButton);
-    method public static void setButtonTintList(android.widget.CompoundButton, android.content.res.ColorStateList);
-    method public static void setButtonTintMode(android.widget.CompoundButton, android.graphics.PorterDuff.Mode);
-  }
-
-  public class ContentLoadingProgressBar extends android.widget.ProgressBar {
-    ctor public ContentLoadingProgressBar(android.content.Context);
-    ctor public ContentLoadingProgressBar(android.content.Context, android.util.AttributeSet);
-    method public void hide();
-    method public void onAttachedToWindow();
-    method public void onDetachedFromWindow();
-    method public void show();
-  }
-
-  public abstract class CursorAdapter extends android.widget.BaseAdapter {
-    ctor public deprecated CursorAdapter(android.content.Context, android.database.Cursor);
-    ctor public CursorAdapter(android.content.Context, android.database.Cursor, boolean);
-    ctor public CursorAdapter(android.content.Context, android.database.Cursor, int);
-    method public abstract void bindView(android.view.View, android.content.Context, android.database.Cursor);
-    method public void changeCursor(android.database.Cursor);
-    method public java.lang.CharSequence convertToString(android.database.Cursor);
-    method public int getCount();
-    method public android.database.Cursor getCursor();
-    method public android.widget.Filter getFilter();
-    method public android.widget.FilterQueryProvider getFilterQueryProvider();
-    method public java.lang.Object getItem(int);
-    method public long getItemId(int);
-    method public android.view.View getView(int, android.view.View, android.view.ViewGroup);
-    method protected deprecated void init(android.content.Context, android.database.Cursor, boolean);
-    method public android.view.View newDropDownView(android.content.Context, android.database.Cursor, android.view.ViewGroup);
-    method public abstract android.view.View newView(android.content.Context, android.database.Cursor, android.view.ViewGroup);
-    method protected void onContentChanged();
-    method public android.database.Cursor runQueryOnBackgroundThread(java.lang.CharSequence);
-    method public void setFilterQueryProvider(android.widget.FilterQueryProvider);
-    method public android.database.Cursor swapCursor(android.database.Cursor);
-    field public static final deprecated int FLAG_AUTO_REQUERY = 1; // 0x1
-    field public static final int FLAG_REGISTER_CONTENT_OBSERVER = 2; // 0x2
-  }
-
-  public class DrawerLayout extends android.view.ViewGroup {
-    ctor public DrawerLayout(android.content.Context);
-    ctor public DrawerLayout(android.content.Context, android.util.AttributeSet);
-    ctor public DrawerLayout(android.content.Context, android.util.AttributeSet, int);
-    method public void addDrawerListener(android.support.v4.widget.DrawerLayout.DrawerListener);
-    method public void closeDrawer(android.view.View);
-    method public void closeDrawer(android.view.View, boolean);
-    method public void closeDrawer(int);
-    method public void closeDrawer(int, boolean);
-    method public void closeDrawers();
-    method public float getDrawerElevation();
-    method public int getDrawerLockMode(int);
-    method public int getDrawerLockMode(android.view.View);
-    method public java.lang.CharSequence getDrawerTitle(int);
-    method public android.graphics.drawable.Drawable getStatusBarBackgroundDrawable();
-    method public boolean isDrawerOpen(android.view.View);
-    method public boolean isDrawerOpen(int);
-    method public boolean isDrawerVisible(android.view.View);
-    method public boolean isDrawerVisible(int);
-    method public void onDraw(android.graphics.Canvas);
-    method protected void onLayout(boolean, int, int, int, int);
-    method public void openDrawer(android.view.View);
-    method public void openDrawer(android.view.View, boolean);
-    method public void openDrawer(int);
-    method public void openDrawer(int, boolean);
-    method public void removeDrawerListener(android.support.v4.widget.DrawerLayout.DrawerListener);
-    method public void setDrawerElevation(float);
-    method public deprecated void setDrawerListener(android.support.v4.widget.DrawerLayout.DrawerListener);
-    method public void setDrawerLockMode(int);
-    method public void setDrawerLockMode(int, int);
-    method public void setDrawerLockMode(int, android.view.View);
-    method public void setDrawerShadow(android.graphics.drawable.Drawable, int);
-    method public void setDrawerShadow(int, int);
-    method public void setDrawerTitle(int, java.lang.CharSequence);
-    method public void setScrimColor(int);
-    method public void setStatusBarBackground(android.graphics.drawable.Drawable);
-    method public void setStatusBarBackground(int);
-    method public void setStatusBarBackgroundColor(int);
-    field public static final int LOCK_MODE_LOCKED_CLOSED = 1; // 0x1
-    field public static final int LOCK_MODE_LOCKED_OPEN = 2; // 0x2
-    field public static final int LOCK_MODE_UNDEFINED = 3; // 0x3
-    field public static final int LOCK_MODE_UNLOCKED = 0; // 0x0
-    field public static final int STATE_DRAGGING = 1; // 0x1
-    field public static final int STATE_IDLE = 0; // 0x0
-    field public static final int STATE_SETTLING = 2; // 0x2
-  }
-
-  public static abstract interface DrawerLayout.DrawerListener {
-    method public abstract void onDrawerClosed(android.view.View);
-    method public abstract void onDrawerOpened(android.view.View);
-    method public abstract void onDrawerSlide(android.view.View, float);
-    method public abstract void onDrawerStateChanged(int);
-  }
-
-  public static class DrawerLayout.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
-    ctor public DrawerLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public DrawerLayout.LayoutParams(int, int);
-    ctor public DrawerLayout.LayoutParams(int, int, int);
-    ctor public DrawerLayout.LayoutParams(android.support.v4.widget.DrawerLayout.LayoutParams);
-    ctor public DrawerLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public DrawerLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    field public int gravity;
-  }
-
-  protected static class DrawerLayout.SavedState extends android.support.v4.view.AbsSavedState {
-    ctor public DrawerLayout.SavedState(android.os.Parcel, java.lang.ClassLoader);
-    ctor public DrawerLayout.SavedState(android.os.Parcelable);
-    field public static final android.os.Parcelable.Creator<android.support.v4.widget.DrawerLayout.SavedState> CREATOR;
-  }
-
-  public static abstract class DrawerLayout.SimpleDrawerListener implements android.support.v4.widget.DrawerLayout.DrawerListener {
-    ctor public DrawerLayout.SimpleDrawerListener();
-    method public void onDrawerClosed(android.view.View);
-    method public void onDrawerOpened(android.view.View);
-    method public void onDrawerSlide(android.view.View, float);
-    method public void onDrawerStateChanged(int);
-  }
-
-  public final class EdgeEffectCompat {
-    ctor public EdgeEffectCompat(android.content.Context);
-    method public boolean draw(android.graphics.Canvas);
-    method public void finish();
-    method public boolean isFinished();
-    method public boolean onAbsorb(int);
-    method public deprecated boolean onPull(float);
-    method public boolean onPull(float, float);
-    method public boolean onRelease();
-    method public void setSize(int, int);
-  }
-
-  public abstract class ExploreByTouchHelper extends android.support.v4.view.AccessibilityDelegateCompat {
-    ctor public ExploreByTouchHelper(android.view.View);
-    method public final boolean clearKeyboardFocusForVirtualView(int);
-    method public final boolean dispatchHoverEvent(android.view.MotionEvent);
-    method public final boolean dispatchKeyEvent(android.view.KeyEvent);
-    method public final int getAccessibilityFocusedVirtualViewId();
-    method public deprecated int getFocusedVirtualView();
-    method public final int getKeyboardFocusedVirtualViewId();
-    method protected abstract int getVirtualViewAt(float, float);
-    method protected abstract void getVisibleVirtualViews(java.util.List<java.lang.Integer>);
-    method public final void invalidateRoot();
-    method public final void invalidateVirtualView(int);
-    method public final void invalidateVirtualView(int, int);
-    method public final void onFocusChanged(boolean, int, android.graphics.Rect);
-    method protected abstract boolean onPerformActionForVirtualView(int, int, android.os.Bundle);
-    method protected void onPopulateEventForHost(android.view.accessibility.AccessibilityEvent);
-    method protected void onPopulateEventForVirtualView(int, android.view.accessibility.AccessibilityEvent);
-    method protected void onPopulateNodeForHost(android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
-    method protected abstract void onPopulateNodeForVirtualView(int, android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
-    method protected void onVirtualViewKeyboardFocusChanged(int, boolean);
-    method public final boolean requestKeyboardFocusForVirtualView(int);
-    method public final boolean sendEventForVirtualView(int, int);
-    field public static final int HOST_ID = -1; // 0xffffffff
-    field public static final int INVALID_ID = -2147483648; // 0x80000000
-  }
-
-  public final class ListPopupWindowCompat {
-    method public static android.view.View.OnTouchListener createDragToOpenListener(java.lang.Object, android.view.View);
-  }
-
-  public class ListViewAutoScrollHelper extends android.support.v4.widget.AutoScrollHelper {
-    ctor public ListViewAutoScrollHelper(android.widget.ListView);
-    method public boolean canTargetScrollHorizontally(int);
-    method public boolean canTargetScrollVertically(int);
-    method public void scrollTargetBy(int, int);
-  }
-
-  public final class ListViewCompat {
-    method public static void scrollListBy(android.widget.ListView, int);
-  }
-
-  public class NestedScrollView extends android.widget.FrameLayout implements android.support.v4.view.NestedScrollingChild android.support.v4.view.NestedScrollingParent android.support.v4.view.ScrollingView {
-    ctor public NestedScrollView(android.content.Context);
-    ctor public NestedScrollView(android.content.Context, android.util.AttributeSet);
-    ctor public NestedScrollView(android.content.Context, android.util.AttributeSet, int);
-    method public boolean arrowScroll(int);
-    method protected int computeScrollDeltaToGetChildRectOnScreen(android.graphics.Rect);
-    method public boolean executeKeyEvent(android.view.KeyEvent);
-    method public void fling(int);
-    method public boolean fullScroll(int);
-    method public int getMaxScrollAmount();
-    method public boolean isFillViewport();
-    method public boolean isSmoothScrollingEnabled();
-    method public void onAttachedToWindow();
-    method public boolean pageScroll(int);
-    method public void setFillViewport(boolean);
-    method public void setOnScrollChangeListener(android.support.v4.widget.NestedScrollView.OnScrollChangeListener);
-    method public void setSmoothScrollingEnabled(boolean);
-    method public final void smoothScrollBy(int, int);
-    method public final void smoothScrollTo(int, int);
-  }
-
-  public static abstract interface NestedScrollView.OnScrollChangeListener {
-    method public abstract void onScrollChange(android.support.v4.widget.NestedScrollView, int, int, int, int);
-  }
-
-  public final class PopupMenuCompat {
-    method public static android.view.View.OnTouchListener getDragToOpenListener(java.lang.Object);
-  }
-
-  public final class PopupWindowCompat {
-    method public static boolean getOverlapAnchor(android.widget.PopupWindow);
-    method public static int getWindowLayoutType(android.widget.PopupWindow);
-    method public static void setOverlapAnchor(android.widget.PopupWindow, boolean);
-    method public static void setWindowLayoutType(android.widget.PopupWindow, int);
-    method public static void showAsDropDown(android.widget.PopupWindow, android.view.View, int, int, int);
-  }
-
-  public abstract class ResourceCursorAdapter extends android.support.v4.widget.CursorAdapter {
-    ctor public deprecated ResourceCursorAdapter(android.content.Context, int, android.database.Cursor);
-    ctor public deprecated ResourceCursorAdapter(android.content.Context, int, android.database.Cursor, boolean);
-    ctor public ResourceCursorAdapter(android.content.Context, int, android.database.Cursor, int);
-    method public android.view.View newView(android.content.Context, android.database.Cursor, android.view.ViewGroup);
-    method public void setDropDownViewResource(int);
-    method public void setViewResource(int);
-  }
-
-  public final class ScrollerCompat {
-    method public void abortAnimation();
-    method public boolean computeScrollOffset();
-    method public static android.support.v4.widget.ScrollerCompat create(android.content.Context);
-    method public static android.support.v4.widget.ScrollerCompat create(android.content.Context, android.view.animation.Interpolator);
-    method public void fling(int, int, int, int, int, int, int, int);
-    method public void fling(int, int, int, int, int, int, int, int, int, int);
-    method public float getCurrVelocity();
-    method public int getCurrX();
-    method public int getCurrY();
-    method public int getFinalX();
-    method public int getFinalY();
-    method public boolean isFinished();
-    method public boolean isOverScrolled();
-    method public void notifyHorizontalEdgeReached(int, int, int);
-    method public void notifyVerticalEdgeReached(int, int, int);
-    method public boolean springBack(int, int, int, int, int, int);
-    method public void startScroll(int, int, int, int);
-    method public void startScroll(int, int, int, int, int);
-  }
-
-  public final class SearchViewCompat {
-    method public static java.lang.CharSequence getQuery(android.view.View);
-    method public static boolean isIconified(android.view.View);
-    method public static boolean isQueryRefinementEnabled(android.view.View);
-    method public static boolean isSubmitButtonEnabled(android.view.View);
-    method public static android.view.View newSearchView(android.content.Context);
-    method public static void setIconified(android.view.View, boolean);
-    method public static void setImeOptions(android.view.View, int);
-    method public static void setInputType(android.view.View, int);
-    method public static void setMaxWidth(android.view.View, int);
-    method public static void setOnCloseListener(android.view.View, android.support.v4.widget.SearchViewCompat.OnCloseListenerCompat);
-    method public static void setOnQueryTextListener(android.view.View, android.support.v4.widget.SearchViewCompat.OnQueryTextListenerCompat);
-    method public static void setQuery(android.view.View, java.lang.CharSequence, boolean);
-    method public static void setQueryHint(android.view.View, java.lang.CharSequence);
-    method public static void setQueryRefinementEnabled(android.view.View, boolean);
-    method public static void setSearchableInfo(android.view.View, android.content.ComponentName);
-    method public static void setSubmitButtonEnabled(android.view.View, boolean);
-  }
-
-  public static abstract class SearchViewCompat.OnCloseListenerCompat {
-    ctor public SearchViewCompat.OnCloseListenerCompat();
-    method public boolean onClose();
-  }
-
-  public static abstract class SearchViewCompat.OnQueryTextListenerCompat {
-    ctor public SearchViewCompat.OnQueryTextListenerCompat();
-    method public boolean onQueryTextChange(java.lang.String);
-    method public boolean onQueryTextSubmit(java.lang.String);
-  }
-
-  public class SimpleCursorAdapter extends android.support.v4.widget.ResourceCursorAdapter {
-    ctor public deprecated SimpleCursorAdapter(android.content.Context, int, android.database.Cursor, java.lang.String[], int[]);
-    ctor public SimpleCursorAdapter(android.content.Context, int, android.database.Cursor, java.lang.String[], int[], int);
-    method public void bindView(android.view.View, android.content.Context, android.database.Cursor);
-    method public void changeCursorAndColumns(android.database.Cursor, java.lang.String[], int[]);
-    method public android.support.v4.widget.SimpleCursorAdapter.CursorToStringConverter getCursorToStringConverter();
-    method public int getStringConversionColumn();
-    method public android.support.v4.widget.SimpleCursorAdapter.ViewBinder getViewBinder();
-    method public void setCursorToStringConverter(android.support.v4.widget.SimpleCursorAdapter.CursorToStringConverter);
-    method public void setStringConversionColumn(int);
-    method public void setViewBinder(android.support.v4.widget.SimpleCursorAdapter.ViewBinder);
-    method public void setViewImage(android.widget.ImageView, java.lang.String);
-    method public void setViewText(android.widget.TextView, java.lang.String);
-  }
-
-  public static abstract interface SimpleCursorAdapter.CursorToStringConverter {
-    method public abstract java.lang.CharSequence convertToString(android.database.Cursor);
-  }
-
-  public static abstract interface SimpleCursorAdapter.ViewBinder {
-    method public abstract boolean setViewValue(android.view.View, android.database.Cursor, int);
-  }
-
-  public class SlidingPaneLayout extends android.view.ViewGroup {
-    ctor public SlidingPaneLayout(android.content.Context);
-    ctor public SlidingPaneLayout(android.content.Context, android.util.AttributeSet);
-    ctor public SlidingPaneLayout(android.content.Context, android.util.AttributeSet, int);
-    method protected boolean canScroll(android.view.View, boolean, int, int, int);
-    method public deprecated boolean canSlide();
-    method public boolean closePane();
-    method public int getCoveredFadeColor();
-    method public int getParallaxDistance();
-    method public int getSliderFadeColor();
-    method public boolean isOpen();
-    method public boolean isSlideable();
-    method protected void onLayout(boolean, int, int, int, int);
-    method public boolean openPane();
-    method public void setCoveredFadeColor(int);
-    method public void setPanelSlideListener(android.support.v4.widget.SlidingPaneLayout.PanelSlideListener);
-    method public void setParallaxDistance(int);
-    method public deprecated void setShadowDrawable(android.graphics.drawable.Drawable);
-    method public void setShadowDrawableLeft(android.graphics.drawable.Drawable);
-    method public void setShadowDrawableRight(android.graphics.drawable.Drawable);
-    method public deprecated void setShadowResource(int);
-    method public void setShadowResourceLeft(int);
-    method public void setShadowResourceRight(int);
-    method public void setSliderFadeColor(int);
-    method public deprecated void smoothSlideClosed();
-    method public deprecated void smoothSlideOpen();
-  }
-
-  public static class SlidingPaneLayout.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
-    ctor public SlidingPaneLayout.LayoutParams();
-    ctor public SlidingPaneLayout.LayoutParams(int, int);
-    ctor public SlidingPaneLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public SlidingPaneLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public SlidingPaneLayout.LayoutParams(android.support.v4.widget.SlidingPaneLayout.LayoutParams);
-    ctor public SlidingPaneLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
-    field public float weight;
-  }
-
-  public static abstract interface SlidingPaneLayout.PanelSlideListener {
-    method public abstract void onPanelClosed(android.view.View);
-    method public abstract void onPanelOpened(android.view.View);
-    method public abstract void onPanelSlide(android.view.View, float);
-  }
-
-  public static class SlidingPaneLayout.SimplePanelSlideListener implements android.support.v4.widget.SlidingPaneLayout.PanelSlideListener {
-    ctor public SlidingPaneLayout.SimplePanelSlideListener();
-    method public void onPanelClosed(android.view.View);
-    method public void onPanelOpened(android.view.View);
-    method public void onPanelSlide(android.view.View, float);
-  }
-
-  public class Space extends android.view.View {
-    ctor public Space(android.content.Context, android.util.AttributeSet, int);
-    ctor public Space(android.content.Context, android.util.AttributeSet);
-    ctor public Space(android.content.Context);
-  }
-
-  public class SwipeRefreshLayout extends android.view.ViewGroup implements android.support.v4.view.NestedScrollingChild android.support.v4.view.NestedScrollingParent {
-    ctor public SwipeRefreshLayout(android.content.Context);
-    ctor public SwipeRefreshLayout(android.content.Context, android.util.AttributeSet);
-    method public boolean canChildScrollUp();
-    method public int getProgressCircleDiameter();
-    method public boolean isRefreshing();
-    method protected void onLayout(boolean, int, int, int, int);
-    method public void onMeasure(int, int);
-    method public deprecated void setColorScheme(int...);
-    method public void setColorSchemeColors(int...);
-    method public void setColorSchemeResources(int...);
-    method public void setDistanceToTriggerSync(int);
-    method public void setOnRefreshListener(android.support.v4.widget.SwipeRefreshLayout.OnRefreshListener);
-    method public deprecated void setProgressBackgroundColor(int);
-    method public void setProgressBackgroundColorSchemeColor(int);
-    method public void setProgressBackgroundColorSchemeResource(int);
-    method public void setProgressViewEndTarget(boolean, int);
-    method public void setProgressViewOffset(boolean, int, int);
-    method public void setRefreshing(boolean);
-    method public void setSize(int);
-    field public static final int DEFAULT = 1; // 0x1
-    field public static final int LARGE = 0; // 0x0
-    field protected int mFrom;
-    field protected int mOriginalOffsetTop;
-  }
-
-  public static abstract interface SwipeRefreshLayout.OnRefreshListener {
-    method public abstract void onRefresh();
-  }
-
-  public final class TextViewCompat {
-    method public static int getMaxLines(android.widget.TextView);
-    method public static int getMinLines(android.widget.TextView);
-    method public static void setCompoundDrawablesRelative(android.widget.TextView, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable);
-    method public static void setCompoundDrawablesRelativeWithIntrinsicBounds(android.widget.TextView, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable);
-    method public static void setCompoundDrawablesRelativeWithIntrinsicBounds(android.widget.TextView, int, int, int, int);
-    method public static void setTextAppearance(android.widget.TextView, int);
-  }
-
-  public abstract interface TintableCompoundButton {
-    method public abstract android.content.res.ColorStateList getSupportButtonTintList();
-    method public abstract android.graphics.PorterDuff.Mode getSupportButtonTintMode();
-    method public abstract void setSupportButtonTintList(android.content.res.ColorStateList);
-    method public abstract void setSupportButtonTintMode(android.graphics.PorterDuff.Mode);
-  }
-
-  public class ViewDragHelper {
-    method public void abort();
-    method protected boolean canScroll(android.view.View, boolean, int, int, int, int);
-    method public void cancel();
-    method public void captureChildView(android.view.View, int);
-    method public boolean checkTouchSlop(int);
-    method public boolean checkTouchSlop(int, int);
-    method public boolean continueSettling(boolean);
-    method public static android.support.v4.widget.ViewDragHelper create(android.view.ViewGroup, android.support.v4.widget.ViewDragHelper.Callback);
-    method public static android.support.v4.widget.ViewDragHelper create(android.view.ViewGroup, float, android.support.v4.widget.ViewDragHelper.Callback);
-    method public android.view.View findTopChildUnder(int, int);
-    method public void flingCapturedView(int, int, int, int);
-    method public int getActivePointerId();
-    method public android.view.View getCapturedView();
-    method public int getEdgeSize();
-    method public float getMinVelocity();
-    method public int getTouchSlop();
-    method public int getViewDragState();
-    method public boolean isCapturedViewUnder(int, int);
-    method public boolean isEdgeTouched(int);
-    method public boolean isEdgeTouched(int, int);
-    method public boolean isPointerDown(int);
-    method public boolean isViewUnder(android.view.View, int, int);
-    method public void processTouchEvent(android.view.MotionEvent);
-    method public void setEdgeTrackingEnabled(int);
-    method public void setMinVelocity(float);
-    method public boolean settleCapturedViewAt(int, int);
-    method public boolean shouldInterceptTouchEvent(android.view.MotionEvent);
-    method public boolean smoothSlideViewTo(android.view.View, int, int);
-    field public static final int DIRECTION_ALL = 3; // 0x3
-    field public static final int DIRECTION_HORIZONTAL = 1; // 0x1
-    field public static final int DIRECTION_VERTICAL = 2; // 0x2
-    field public static final int EDGE_ALL = 15; // 0xf
-    field public static final int EDGE_BOTTOM = 8; // 0x8
-    field public static final int EDGE_LEFT = 1; // 0x1
-    field public static final int EDGE_RIGHT = 2; // 0x2
-    field public static final int EDGE_TOP = 4; // 0x4
-    field public static final int INVALID_POINTER = -1; // 0xffffffff
-    field public static final int STATE_DRAGGING = 1; // 0x1
-    field public static final int STATE_IDLE = 0; // 0x0
-    field public static final int STATE_SETTLING = 2; // 0x2
-  }
-
-  public static abstract class ViewDragHelper.Callback {
-    ctor public ViewDragHelper.Callback();
-    method public int clampViewPositionHorizontal(android.view.View, int, int);
-    method public int clampViewPositionVertical(android.view.View, int, int);
-    method public int getOrderedChildIndex(int);
-    method public int getViewHorizontalDragRange(android.view.View);
-    method public int getViewVerticalDragRange(android.view.View);
-    method public void onEdgeDragStarted(int, int);
-    method public boolean onEdgeLock(int);
-    method public void onEdgeTouched(int, int);
-    method public void onViewCaptured(android.view.View, int);
-    method public void onViewDragStateChanged(int);
-    method public void onViewPositionChanged(android.view.View, int, int, int, int);
-    method public void onViewReleased(android.view.View, float, float);
-    method public abstract boolean tryCaptureView(android.view.View, int);
-  }
-
-}
-
diff --git a/v4/api/removed.txt b/v4/api/removed.txt
deleted file mode 100644
index 98f8c44..0000000
--- a/v4/api/removed.txt
+++ /dev/null
@@ -1,18 +0,0 @@
-package android.support.v4.content {
-
-  public class ContextCompat {
-    method public static deprecated android.content.Context createDeviceEncryptedStorageContext(android.content.Context);
-    method public static deprecated boolean isDeviceEncryptedStorage(android.content.Context);
-  }
-
-}
-
-package android.support.v4.os {
-
-  public class UserManagerCompat {
-    method public static deprecated boolean isUserRunningAndLocked(android.content.Context);
-    method public static deprecated boolean isUserRunningAndUnlocked(android.content.Context);
-  }
-
-}
-
diff --git a/v4/api21/android/support/v4/app/ActivityOptionsCompat21.java b/v4/api21/android/support/v4/app/ActivityOptionsCompat21.java
deleted file mode 100644
index d629e65..0000000
--- a/v4/api21/android/support/v4/app/ActivityOptionsCompat21.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (C) 2014 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 android.support.v4.app;
-
-import android.app.ActivityOptions;
-import android.app.Activity;
-import android.os.Bundle;
-import android.util.Pair;
-import android.view.View;
-
-class ActivityOptionsCompat21 {
-
-    private final ActivityOptions mActivityOptions;
-
-    public static ActivityOptionsCompat21 makeSceneTransitionAnimation(Activity activity,
-            View sharedElement, String sharedElementName) {
-        return new ActivityOptionsCompat21(
-                ActivityOptions.makeSceneTransitionAnimation(activity, sharedElement,
-                        sharedElementName));
-    }
-
-    public static ActivityOptionsCompat21 makeSceneTransitionAnimation(Activity activity,
-            View[] sharedElements, String[] sharedElementNames) {
-        Pair[] pairs = null;
-        if (sharedElements != null) {
-            pairs = new Pair[sharedElements.length];
-            for (int i = 0; i < pairs.length; i++) {
-                pairs[i] = Pair.create(sharedElements[i], sharedElementNames[i]);
-            }
-        }
-        return new ActivityOptionsCompat21(
-                ActivityOptions.makeSceneTransitionAnimation(activity, pairs));
-    }
-
-    private ActivityOptionsCompat21(ActivityOptions activityOptions) {
-        mActivityOptions = activityOptions;
-    }
-
-    public Bundle toBundle() {
-        return mActivityOptions.toBundle();
-    }
-
-    public void update(ActivityOptionsCompat21 otherOptions) {
-        mActivityOptions.update(otherOptions.mActivityOptions);
-    }
-}
diff --git a/v4/api21/android/support/v4/app/FragmentTransitionCompat21.java b/v4/api21/android/support/v4/app/FragmentTransitionCompat21.java
deleted file mode 100644
index 37c4b97..0000000
--- a/v4/api21/android/support/v4/app/FragmentTransitionCompat21.java
+++ /dev/null
@@ -1,498 +0,0 @@
-/*
- * Copyright (C) 2014 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 android.support.v4.app;
-
-import android.graphics.Rect;
-import android.transition.Transition;
-import android.transition.TransitionManager;
-import android.transition.TransitionSet;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.ViewTreeObserver;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-class FragmentTransitionCompat21 {
-    public static String getTransitionName(View view) {
-        return view.getTransitionName();
-    }
-
-    public static Object cloneTransition(Object transition) {
-        if (transition != null) {
-            transition = ((Transition)transition).clone();
-        }
-        return transition;
-    }
-
-    public static Object captureExitingViews(Object exitTransition, View root,
-            ArrayList<View> viewList, Map<String, View> namedViews, View nonExistentView) {
-        if (exitTransition != null) {
-            captureTransitioningViews(viewList, root);
-            if (namedViews != null) {
-                viewList.removeAll(namedViews.values());
-            }
-            if (viewList.isEmpty()) {
-                exitTransition = null;
-            } else {
-                viewList.add(nonExistentView);
-                addTargets((Transition) exitTransition, viewList);
-            }
-        }
-        return exitTransition;
-    }
-
-    public static void excludeTarget(Object transitionObject, View view, boolean exclude) {
-        Transition transition = (Transition) transitionObject;
-        transition.excludeTarget(view, exclude);
-    }
-
-    public static void beginDelayedTransition(ViewGroup sceneRoot, Object transitionObject) {
-        Transition transition = (Transition) transitionObject;
-        TransitionManager.beginDelayedTransition(sceneRoot, transition);
-    }
-
-    public static void setEpicenter(Object transitionObject, View view) {
-        Transition transition = (Transition) transitionObject;
-        final Rect epicenter = getBoundsOnScreen(view);
-
-        transition.setEpicenterCallback(new Transition.EpicenterCallback() {
-            @Override
-            public Rect onGetEpicenter(Transition transition) {
-                return epicenter;
-            }
-        });
-    }
-
-    public static Object wrapSharedElementTransition(Object transitionObj) {
-        if (transitionObj == null) {
-            return null;
-        }
-        Transition transition = (Transition) transitionObj;
-        if (transition == null) {
-            return null;
-        }
-        TransitionSet transitionSet = new TransitionSet();
-        transitionSet.addTransition(transition);
-        return transitionSet;
-    }
-
-    private static void excludeViews(Transition transition, Transition fromTransition,
-            ArrayList<View> views, boolean exclude) {
-        if (transition != null) {
-            final int viewCount = fromTransition == null ? 0 : views.size();
-            for (int i = 0; i < viewCount; i++) {
-                transition.excludeTarget(views.get(i), exclude);
-            }
-        }
-    }
-
-    /**
-     * Exclude (or remove the exclude) of shared element views from the enter and exit transitions.
-     *
-     * @param enterTransitionObj The enter transition
-     * @param exitTransitionObj The exit transition
-     * @param sharedElementTransitionObj The shared element transition
-     * @param views The shared element target views.
-     * @param exclude <code>true</code> to exclude or <code>false</code> to remove the excluded
-     *                views.
-     */
-    public static void excludeSharedElementViews(Object enterTransitionObj,
-            Object exitTransitionObj, Object sharedElementTransitionObj, ArrayList<View> views,
-            boolean exclude) {
-        Transition enterTransition = (Transition) enterTransitionObj;
-        Transition exitTransition = (Transition) exitTransitionObj;
-        Transition sharedElementTransition = (Transition) sharedElementTransitionObj;
-        excludeViews(enterTransition, sharedElementTransition, views, exclude);
-        excludeViews(exitTransition, sharedElementTransition, views, exclude);
-    }
-
-    /**
-     * Prepares the enter transition by adding a non-existent view to the transition's target list
-     * and setting it epicenter callback. By adding a non-existent view to the target list,
-     * we can prevent any view from being targeted at the beginning of the transition.
-     * We will add to the views before the end state of the transition is captured so that the
-     * views will appear. At the start of the transition, we clear the list of targets so that
-     * we can restore the state of the transition and use it again.
-     *
-     * <p>The shared element transition maps its shared elements immediately prior to
-     *  capturing the final state of the Transition.</p>
-     */
-    public static void addTransitionTargets(Object enterTransitionObject,
-            Object sharedElementTransitionObject, Object exitTransitionObject, final View container,
-            final ViewRetriever inFragment, final View nonExistentView,
-            EpicenterView epicenterView, final Map<String, String> nameOverrides,
-            final ArrayList<View> enteringViews, final ArrayList<View> exitingViews,
-            final Map<String, View> namedViews, final Map<String, View> renamedViews,
-            final ArrayList<View> sharedElementTargets) {
-        final Transition enterTransition = (Transition) enterTransitionObject;
-        final Transition exitTransition = (Transition) exitTransitionObject;
-        final Transition sharedElementTransition = (Transition) sharedElementTransitionObject;
-        excludeViews(enterTransition, exitTransition, exitingViews, true);
-        if (enterTransitionObject != null || sharedElementTransitionObject != null) {
-            if (enterTransition != null) {
-                enterTransition.addTarget(nonExistentView);
-            }
-            if (sharedElementTransitionObject != null) {
-                setSharedElementTargets(sharedElementTransition, nonExistentView,
-                        namedViews, sharedElementTargets);
-                excludeViews(enterTransition, sharedElementTransition, sharedElementTargets, true);
-                excludeViews(exitTransition, sharedElementTransition, sharedElementTargets, true);
-            }
-
-            container.getViewTreeObserver().addOnPreDrawListener(
-                    new ViewTreeObserver.OnPreDrawListener() {
-                        public boolean onPreDraw() {
-                            container.getViewTreeObserver().removeOnPreDrawListener(this);
-                            if (enterTransition != null) {
-                                enterTransition.removeTarget(nonExistentView);
-                            }
-                            if (inFragment != null) {
-                                View fragmentView = inFragment.getView();
-                                if (fragmentView != null) {
-                                    if (!nameOverrides.isEmpty()) {
-                                        findNamedViews(renamedViews, fragmentView);
-                                        renamedViews.keySet().retainAll(nameOverrides.values());
-                                        for (Map.Entry<String, String> entry : nameOverrides
-                                                .entrySet()) {
-                                            String to = entry.getValue();
-                                            View view = renamedViews.get(to);
-                                            if (view != null) {
-                                                String from = entry.getKey();
-                                                view.setTransitionName(from);
-                                            }
-                                        }
-                                    }
-                                    if (enterTransition != null) {
-                                        captureTransitioningViews(enteringViews, fragmentView);
-                                        enteringViews.removeAll(renamedViews.values());
-                                        enteringViews.add(nonExistentView);
-                                        addTargets(enterTransition, enteringViews);
-                                    }
-                                }
-                            }
-                            excludeViews(exitTransition, enterTransition, enteringViews, true);
-
-                            return true;
-                        }
-                    });
-            setSharedElementEpicenter(enterTransition, epicenterView);
-        }
-    }
-
-    public static Object mergeTransitions(Object enterTransitionObject,
-            Object exitTransitionObject, Object sharedElementTransitionObject,
-            boolean allowOverlap) {
-        boolean overlap = true;
-        Transition enterTransition = (Transition) enterTransitionObject;
-        Transition exitTransition = (Transition) exitTransitionObject;
-        Transition sharedElementTransition = (Transition) sharedElementTransitionObject;
-
-        if (enterTransition != null && exitTransition != null) {
-            overlap = allowOverlap;
-        }
-
-        // Wrap the transitions. Explicit targets like in enter and exit will cause the
-        // views to be targeted regardless of excluded views. If that happens, then the
-        // excluded fragments views (hidden fragments) will still be in the transition.
-
-        Transition transition;
-        if (overlap) {
-            // Regular transition -- do it all together
-            TransitionSet transitionSet = new TransitionSet();
-            if (enterTransition != null) {
-                transitionSet.addTransition(enterTransition);
-            }
-            if (exitTransition != null) {
-                transitionSet.addTransition(exitTransition);
-            }
-            if (sharedElementTransition != null) {
-                transitionSet.addTransition(sharedElementTransition);
-            }
-            transition = transitionSet;
-        } else {
-            // First do exit, then enter, but allow shared element transition to happen
-            // during both.
-            Transition staggered = null;
-            if (exitTransition != null && enterTransition != null) {
-                staggered = new TransitionSet()
-                        .addTransition(exitTransition)
-                        .addTransition(enterTransition)
-                        .setOrdering(TransitionSet.ORDERING_SEQUENTIAL);
-            } else if (exitTransition != null) {
-                staggered = exitTransition;
-            } else if (enterTransition != null) {
-                staggered = enterTransition;
-            }
-            if (sharedElementTransition != null) {
-                TransitionSet together = new TransitionSet();
-                if (staggered != null) {
-                    together.addTransition(staggered);
-                }
-                together.addTransition(sharedElementTransition);
-                transition = together;
-            } else {
-                transition = staggered;
-            }
-        }
-        return transition;
-    }
-
-    /**
-     * Finds all children of the shared elements and sets the wrapping TransitionSet
-     * targets to point to those. It also limits transitions that have no targets to the
-     * specific shared elements. This allows developers to target child views of the
-     * shared elements specifically, but this doesn't happen by default.
-     */
-    public static void setSharedElementTargets(Object transitionObj,
-            View nonExistentView, Map<String, View> namedViews,
-            ArrayList<View> sharedElementTargets) {
-        TransitionSet transition = (TransitionSet) transitionObj;
-        sharedElementTargets.clear();
-        sharedElementTargets.addAll(namedViews.values());
-
-        final List<View> views = transition.getTargets();
-        views.clear();
-        final int count = sharedElementTargets.size();
-        for (int i = 0; i < count; i++) {
-            final View view = sharedElementTargets.get(i);
-            bfsAddViewChildren(views, view);
-        }
-        sharedElementTargets.add(nonExistentView);
-        addTargets(transition, sharedElementTargets);
-    }
-
-    /**
-     * Uses a breadth-first scheme to add startView and all of its children to views.
-     * It won't add a child if it is already in views.
-     */
-    private static void bfsAddViewChildren(final List<View> views, final View startView) {
-        final int startIndex = views.size();
-        if (containedBeforeIndex(views, startView, startIndex)) {
-            return; // This child is already in the list, so all its children are also.
-        }
-        views.add(startView);
-        for (int index = startIndex; index < views.size(); index++) {
-            final View view = views.get(index);
-            if (view instanceof ViewGroup) {
-                ViewGroup viewGroup = (ViewGroup) view;
-                final int childCount =  viewGroup.getChildCount();
-                for (int childIndex = 0; childIndex < childCount; childIndex++) {
-                    final View child = viewGroup.getChildAt(childIndex);
-                    if (!containedBeforeIndex(views, child, startIndex)) {
-                        views.add(child);
-                    }
-                }
-            }
-        }
-    }
-
-    /**
-     * Does a linear search through views for view, limited to maxIndex.
-     */
-    private static boolean containedBeforeIndex(final List<View> views, final View view,
-            final int maxIndex) {
-        for (int i = 0; i < maxIndex; i++) {
-            if (views.get(i) == view) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    private static void setSharedElementEpicenter(Transition transition,
-            final EpicenterView epicenterView) {
-        if (transition != null) {
-            transition.setEpicenterCallback(new Transition.EpicenterCallback() {
-                private Rect mEpicenter;
-
-                @Override
-                public Rect onGetEpicenter(Transition transition) {
-                    if (mEpicenter == null && epicenterView.epicenter != null) {
-                        mEpicenter = getBoundsOnScreen(epicenterView.epicenter);
-                    }
-                    return mEpicenter;
-                }
-            });
-        }
-    }
-
-    private static Rect getBoundsOnScreen(View view) {
-        Rect epicenter = new Rect();
-        int[] loc = new int[2];
-        view.getLocationOnScreen(loc);
-        // not as good as View.getBoundsOnScreen, but that's not public
-        epicenter.set(loc[0], loc[1], loc[0] + view.getWidth(), loc[1] + view.getHeight());
-        return epicenter;
-    }
-
-    private static void captureTransitioningViews(ArrayList<View> transitioningViews, View view) {
-        if (view.getVisibility() == View.VISIBLE) {
-            if (view instanceof ViewGroup) {
-                ViewGroup viewGroup = (ViewGroup) view;
-                if (viewGroup.isTransitionGroup()) {
-                    transitioningViews.add(viewGroup);
-                } else {
-                    int count = viewGroup.getChildCount();
-                    for (int i = 0; i < count; i++) {
-                        View child = viewGroup.getChildAt(i);
-                        captureTransitioningViews(transitioningViews, child);
-                    }
-                }
-            } else {
-                transitioningViews.add(view);
-            }
-        }
-    }
-
-    public static void findNamedViews(Map<String, View> namedViews, View view) {
-        if (view.getVisibility() == View.VISIBLE) {
-            String transitionName = view.getTransitionName();
-            if (transitionName != null) {
-                namedViews.put(transitionName, view);
-            }
-            if (view instanceof ViewGroup) {
-                ViewGroup viewGroup = (ViewGroup) view;
-                int count = viewGroup.getChildCount();
-                for (int i = 0; i < count; i++) {
-                    View child = viewGroup.getChildAt(i);
-                    findNamedViews(namedViews, child);
-                }
-            }
-        }
-    }
-
-    public static void cleanupTransitions(final View sceneRoot, final View nonExistentView,
-            Object enterTransitionObject, final ArrayList<View> enteringViews,
-            Object exitTransitionObject, final ArrayList<View> exitingViews,
-            Object sharedElementTransitionObject, final ArrayList<View> sharedElementTargets,
-            Object overallTransitionObject, final ArrayList<View> hiddenViews,
-            final Map<String, View> renamedViews) {
-        final Transition enterTransition = (Transition) enterTransitionObject;
-        final Transition exitTransition = (Transition) exitTransitionObject;
-        final Transition sharedElementTransition = (Transition) sharedElementTransitionObject;
-        final Transition overallTransition = (Transition) overallTransitionObject;
-        if (overallTransition != null) {
-            sceneRoot.getViewTreeObserver().addOnPreDrawListener(
-                    new ViewTreeObserver.OnPreDrawListener() {
-                public boolean onPreDraw() {
-                    sceneRoot.getViewTreeObserver().removeOnPreDrawListener(this);
-                    if (enterTransition != null) {
-                        removeTargets(enterTransition, enteringViews);
-                        excludeViews(enterTransition, exitTransition, exitingViews, false);
-                        excludeViews(enterTransition, sharedElementTransition, sharedElementTargets,
-                                false);
-                    }
-                    if (exitTransition != null) {
-                        removeTargets(exitTransition, exitingViews);
-                        excludeViews(exitTransition, enterTransition, enteringViews, false);
-                        excludeViews(exitTransition, sharedElementTransition, sharedElementTargets,
-                                false);
-                    }
-                    if (sharedElementTransition != null) {
-                        removeTargets(sharedElementTransition, sharedElementTargets);
-                    }
-                    for (Map.Entry<String, View> entry : renamedViews.entrySet()) {
-                        View view = entry.getValue();
-                        String name = entry.getKey();
-                        view.setTransitionName(name);
-                    }
-                    int numViews = hiddenViews.size();
-                    for (int i = 0; i < numViews; i++) {
-                        overallTransition.excludeTarget(hiddenViews.get(i), false);
-                    }
-                    overallTransition.excludeTarget(nonExistentView, false);
-                    return true;
-                }
-            });
-        }
-    }
-
-    /**
-     * This method removes the views from transitions that target ONLY those views.
-     * The views list should match those added in addTargets and should contain
-     * one view that is not in the view hierarchy (state.nonExistentView).
-     */
-    public static void removeTargets(Object transitionObject, ArrayList<View> views) {
-        Transition transition = (Transition) transitionObject;
-        if (transition instanceof TransitionSet) {
-            TransitionSet set = (TransitionSet) transition;
-            int numTransitions = set.getTransitionCount();
-            for (int i = 0; i < numTransitions; i++) {
-                Transition child = set.getTransitionAt(i);
-                removeTargets(child, views);
-            }
-        } else if (!hasSimpleTarget(transition)) {
-            List<View> targets = transition.getTargets();
-            if (targets != null && targets.size() == views.size() &&
-                    targets.containsAll(views)) {
-                // We have an exact match. We must have added these earlier in addTargets
-                for (int i = views.size() - 1; i >= 0; i--) {
-                    transition.removeTarget(views.get(i));
-                }
-            }
-        }
-    }
-
-    /**
-     * This method adds views as targets to the transition, but only if the transition
-     * doesn't already have a target. It is best for views to contain one View object
-     * that does not exist in the view hierarchy (state.nonExistentView) so that
-     * when they are removed later, a list match will suffice to remove the targets.
-     * Otherwise, if you happened to have targeted the exact views for the transition,
-     * the removeTargets call will remove them unexpectedly.
-     */
-    public static void addTargets(Object transitionObject, ArrayList<View> views) {
-        Transition transition = (Transition) transitionObject;
-        if (transition instanceof TransitionSet) {
-            TransitionSet set = (TransitionSet) transition;
-            int numTransitions = set.getTransitionCount();
-            for (int i = 0; i < numTransitions; i++) {
-                Transition child = set.getTransitionAt(i);
-                addTargets(child, views);
-            }
-        } else if (!hasSimpleTarget(transition)) {
-            List<View> targets = transition.getTargets();
-            if (isNullOrEmpty(targets)) {
-                // We can just add the target views
-                int numViews = views.size();
-                for (int i = 0; i < numViews; i++) {
-                    transition.addTarget(views.get(i));
-                }
-            }
-        }
-    }
-
-    private static boolean hasSimpleTarget(Transition transition) {
-        return !isNullOrEmpty(transition.getTargetIds()) ||
-                !isNullOrEmpty(transition.getTargetNames()) ||
-                !isNullOrEmpty(transition.getTargetTypes());
-    }
-
-    private static boolean isNullOrEmpty(List list) {
-        return list == null || list.isEmpty();
-    }
-
-    public interface ViewRetriever {
-        View getView();
-    }
-
-    public static class EpicenterView {
-        public View epicenter;
-    }
-}
diff --git a/v4/api21/android/support/v4/graphics/drawable/DrawableCompatLollipop.java b/v4/api21/android/support/v4/graphics/drawable/DrawableCompatLollipop.java
deleted file mode 100644
index 2c50df9..0000000
--- a/v4/api21/android/support/v4/graphics/drawable/DrawableCompatLollipop.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright (C) 2014 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 android.support.v4.graphics.drawable;
-
-import android.content.res.ColorStateList;
-import android.content.res.Resources;
-import android.graphics.ColorFilter;
-import android.graphics.PorterDuff;
-import android.graphics.drawable.Drawable;
-import android.util.AttributeSet;
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-
-import java.io.IOException;
-
-/**
- * Implementation of drawable compatibility that can call L APIs.
- */
-class DrawableCompatLollipop {
-
-    public static void setHotspot(Drawable drawable, float x, float y) {
-        drawable.setHotspot(x, y);
-    }
-
-    public static void setHotspotBounds(Drawable drawable, int left, int top,
-            int right, int bottom) {
-        drawable.setHotspotBounds( left, top, right, bottom);
-    }
-
-    public static void setTint(Drawable drawable, int tint) {
-        drawable.setTint(tint);
-    }
-
-    public static void setTintList(Drawable drawable, ColorStateList tint) {
-        drawable.setTintList(tint);
-    }
-
-    public static void setTintMode(Drawable drawable, PorterDuff.Mode tintMode) {
-        drawable.setTintMode(tintMode);
-    }
-
-    public static Drawable wrapForTinting(final Drawable drawable) {
-        if (!(drawable instanceof TintAwareDrawable)) {
-            return new DrawableWrapperLollipop(drawable);
-        }
-        return drawable;
-    }
-
-    public static void applyTheme(Drawable drawable, Resources.Theme t) {
-        drawable.applyTheme(t);
-    }
-
-    public static boolean canApplyTheme(Drawable drawable) {
-        return drawable.canApplyTheme();
-    }
-
-    public static ColorFilter getColorFilter(Drawable drawable) {
-        return drawable.getColorFilter();
-    }
-
-    public static void inflate(Drawable drawable, Resources res, XmlPullParser parser,
-                               AttributeSet attrs, Resources.Theme t)
-            throws IOException, XmlPullParserException {
-        drawable.inflate(res, parser, attrs, t);
-    }
-}
diff --git a/v4/api21/android/support/v4/view/ViewCompatLollipop.java b/v4/api21/android/support/v4/view/ViewCompatLollipop.java
deleted file mode 100644
index 218c90a..0000000
--- a/v4/api21/android/support/v4/view/ViewCompatLollipop.java
+++ /dev/null
@@ -1,267 +0,0 @@
-/*
- * Copyright (C) 2014 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 android.support.v4.view;
-
-import android.content.res.ColorStateList;
-import android.graphics.PorterDuff;
-import android.graphics.Rect;
-import android.graphics.drawable.Drawable;
-import android.os.Build;
-import android.view.View;
-import android.view.ViewParent;
-import android.view.WindowInsets;
-
-class ViewCompatLollipop {
-
-    private static ThreadLocal<Rect> sThreadLocalRect;
-
-    public static void setTransitionName(View view, String transitionName) {
-        view.setTransitionName(transitionName);
-    }
-
-    public static String getTransitionName(View view) {
-        return view.getTransitionName();
-    }
-
-    public static void requestApplyInsets(View view) {
-        view.requestApplyInsets();
-    }
-
-    public static void setElevation(View view, float elevation) {
-        view.setElevation(elevation);
-    }
-
-    public static float getElevation(View view) {
-        return view.getElevation();
-    }
-
-    public static void setTranslationZ(View view, float translationZ) {
-        view.setTranslationZ(translationZ);
-    }
-
-    public static float getTranslationZ(View view) {
-        return view.getTranslationZ();
-    }
-
-    public static void setOnApplyWindowInsetsListener(View view,
-            final OnApplyWindowInsetsListener listener) {
-        if (listener == null) {
-            view.setOnApplyWindowInsetsListener(null);
-        } else {
-            view.setOnApplyWindowInsetsListener(new View.OnApplyWindowInsetsListener() {
-                @Override
-                public WindowInsets onApplyWindowInsets(View view, WindowInsets windowInsets) {
-                    // Wrap the framework insets in our wrapper
-                    WindowInsetsCompatApi21 insets = new WindowInsetsCompatApi21(windowInsets);
-                    // Give the listener a chance to use the wrapped insets
-                    insets = (WindowInsetsCompatApi21) listener.onApplyWindowInsets(view, insets);
-                    // Return the unwrapped insets
-                    return insets.unwrap();
-                }
-            });
-        }
-    }
-
-    public static boolean isImportantForAccessibility(View view) {
-        return view.isImportantForAccessibility();
-    }
-
-    static ColorStateList getBackgroundTintList(View view) {
-        return view.getBackgroundTintList();
-    }
-
-    static void setBackgroundTintList(View view, ColorStateList tintList) {
-        view.setBackgroundTintList(tintList);
-
-        if (Build.VERSION.SDK_INT == 21) {
-            // Work around a bug in L that did not update the state of the background
-            // after applying the tint
-            Drawable background = view.getBackground();
-            boolean hasTint = (view.getBackgroundTintList() != null)
-                    && (view.getBackgroundTintMode() != null);
-            if ((background != null) && hasTint) {
-                if (background.isStateful()) {
-                    background.setState(view.getDrawableState());
-                }
-                view.setBackground(background);
-            }
-        }
-    }
-
-    static PorterDuff.Mode getBackgroundTintMode(View view) {
-        return view.getBackgroundTintMode();
-    }
-
-    static void setBackgroundTintMode(View view, PorterDuff.Mode mode) {
-        view.setBackgroundTintMode(mode);
-
-        if (Build.VERSION.SDK_INT == 21) {
-            // Work around a bug in L that did not update the state of the background
-            // after applying the tint
-            Drawable background = view.getBackground();
-            boolean hasTint = (view.getBackgroundTintList() != null)
-                    && (view.getBackgroundTintMode() != null);
-            if ((background != null) && hasTint) {
-                if (background.isStateful()) {
-                    background.setState(view.getDrawableState());
-                }
-                view.setBackground(background);
-            }
-        }
-    }
-
-    public static WindowInsetsCompat onApplyWindowInsets(View v, WindowInsetsCompat insets) {
-        if (insets instanceof WindowInsetsCompatApi21) {
-            // First unwrap the compat version so that we have the framework instance
-            WindowInsets unwrapped = ((WindowInsetsCompatApi21) insets).unwrap();
-            // Now call onApplyWindowInsets
-            WindowInsets result = v.onApplyWindowInsets(unwrapped);
-
-            if (result != unwrapped) {
-                // ...and return a newly wrapped compat insets instance if different
-                insets = new WindowInsetsCompatApi21(result);
-            }
-        }
-        return insets;
-    }
-
-    public static WindowInsetsCompat dispatchApplyWindowInsets(View v, WindowInsetsCompat insets) {
-        if (insets instanceof WindowInsetsCompatApi21) {
-            // First unwrap the compat version so that we have the framework instance
-            WindowInsets unwrapped = ((WindowInsetsCompatApi21) insets).unwrap();
-            // Now call dispatchApplyWindowInsets
-            WindowInsets result = v.dispatchApplyWindowInsets(unwrapped);
-
-            if (result != unwrapped) {
-                // ...and return a newly wrapped compat insets instance if different
-                insets = new WindowInsetsCompatApi21(result);
-            }
-        }
-        return insets;
-    }
-
-    public static void setNestedScrollingEnabled(View view, boolean enabled) {
-        view.setNestedScrollingEnabled(enabled);
-    }
-
-    public static boolean isNestedScrollingEnabled(View view) {
-        return view.isNestedScrollingEnabled();
-    }
-
-    public static boolean startNestedScroll(View view, int axes) {
-        return view.startNestedScroll(axes);
-    }
-
-    public static void stopNestedScroll(View view) {
-        view.stopNestedScroll();
-    }
-
-    public static boolean hasNestedScrollingParent(View view) {
-        return view.hasNestedScrollingParent();
-    }
-
-    public static boolean dispatchNestedScroll(View view, int dxConsumed, int dyConsumed,
-            int dxUnconsumed, int dyUnconsumed, int[] offsetInWindow) {
-        return view.dispatchNestedScroll(dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed,
-                offsetInWindow);
-    }
-
-    public static boolean dispatchNestedPreScroll(View view, int dx, int dy, int[] consumed,
-            int[] offsetInWindow) {
-        return view.dispatchNestedPreScroll(dx, dy, consumed, offsetInWindow);
-    }
-
-    public static boolean dispatchNestedFling(View view, float velocityX, float velocityY,
-            boolean consumed) {
-        return view.dispatchNestedFling(velocityX, velocityY, consumed);
-    }
-
-    public static boolean dispatchNestedPreFling(View view, float velocityX, float velocityY) {
-        return view.dispatchNestedPreFling(velocityX, velocityY);
-    }
-
-    public static float getZ(View view) {
-        return view.getZ();
-    }
-
-    public static void setZ(View view, float z) {
-        view.setZ(z);
-    }
-
-    static void offsetTopAndBottom(final View view, final int offset) {
-        final Rect parentRect = getEmptyTempRect();
-        boolean needInvalidateWorkaround = false;
-
-        final ViewParent parent = view.getParent();
-        if (parent instanceof View) {
-            final View p = (View) parent;
-            parentRect.set(p.getLeft(), p.getTop(), p.getRight(), p.getBottom());
-            // If the view currently does not currently intersect the parent (and is therefore
-            // not displayed) we may need need to invalidate
-            needInvalidateWorkaround = !parentRect.intersects(view.getLeft(), view.getTop(),
-                    view.getRight(), view.getBottom());
-        }
-
-        // Now offset, invoking the API 11+ implementation (which contains it's own workarounds)
-        ViewCompatHC.offsetTopAndBottom(view, offset);
-
-        // The view has now been offset, so let's intersect the Rect and invalidate where
-        // the View is now displayed
-        if (needInvalidateWorkaround && parentRect.intersect(view.getLeft(), view.getTop(),
-                view.getRight(), view.getBottom())) {
-            ((View) parent).invalidate(parentRect);
-        }
-    }
-
-    static void offsetLeftAndRight(final View view, final int offset) {
-        final Rect parentRect = getEmptyTempRect();
-        boolean needInvalidateWorkaround = false;
-
-        final ViewParent parent = view.getParent();
-        if (parent instanceof View) {
-            final View p = (View) parent;
-            parentRect.set(p.getLeft(), p.getTop(), p.getRight(), p.getBottom());
-            // If the view currently does not currently intersect the parent (and is therefore
-            // not displayed) we may need need to invalidate
-            needInvalidateWorkaround = !parentRect.intersects(view.getLeft(), view.getTop(),
-                    view.getRight(), view.getBottom());
-        }
-
-        // Now offset, invoking the API 11+ implementation (which contains it's own workarounds)
-        ViewCompatHC.offsetLeftAndRight(view, offset);
-
-        // The view has now been offset, so let's intersect the Rect and invalidate where
-        // the View is now displayed
-        if (needInvalidateWorkaround && parentRect.intersect(view.getLeft(), view.getTop(),
-                view.getRight(), view.getBottom())) {
-            ((View) parent).invalidate(parentRect);
-        }
-    }
-
-    private static Rect getEmptyTempRect() {
-        if (sThreadLocalRect == null) {
-            sThreadLocalRect = new ThreadLocal<>();
-        }
-        Rect rect = sThreadLocalRect.get();
-        if (rect == null) {
-            rect = new Rect();
-            sThreadLocalRect.set(rect);
-        }
-        rect.setEmpty();
-        return rect;
-    }
-}
diff --git a/v4/api21/android/support/v4/view/WindowInsetsCompatApi21.java b/v4/api21/android/support/v4/view/WindowInsetsCompatApi21.java
deleted file mode 100644
index c3237a4..0000000
--- a/v4/api21/android/support/v4/view/WindowInsetsCompatApi21.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Copyright (C) 2014 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 android.support.v4.view;
-
-import android.graphics.Rect;
-import android.view.WindowInsets;
-
-class WindowInsetsCompatApi21 extends WindowInsetsCompat {
-
-    private final WindowInsets mSource;
-
-    WindowInsetsCompatApi21(WindowInsets source) {
-        mSource = source;
-    }
-
-    @Override
-    public int getSystemWindowInsetLeft() {
-        return mSource.getSystemWindowInsetLeft();
-    }
-
-    @Override
-    public int getSystemWindowInsetTop() {
-        return mSource.getSystemWindowInsetTop();
-    }
-
-    @Override
-    public int getSystemWindowInsetRight() {
-        return mSource.getSystemWindowInsetRight();
-    }
-
-    @Override
-    public int getSystemWindowInsetBottom() {
-        return mSource.getSystemWindowInsetBottom();
-    }
-
-    @Override
-    public boolean hasSystemWindowInsets() {
-        return mSource.hasSystemWindowInsets();
-    }
-
-    @Override
-    public boolean hasInsets() {
-        return mSource.hasInsets();
-    }
-
-    @Override
-    public boolean isConsumed() {
-        return mSource.isConsumed();
-    }
-
-    @Override
-    public boolean isRound() {
-        return mSource.isRound();
-    }
-
-    @Override
-    public WindowInsetsCompat consumeSystemWindowInsets() {
-        return new WindowInsetsCompatApi21(mSource.consumeSystemWindowInsets());
-    }
-
-    @Override
-    public WindowInsetsCompat replaceSystemWindowInsets(int left, int top, int right, int bottom) {
-        return new WindowInsetsCompatApi21(mSource.replaceSystemWindowInsets(left, top, right, bottom));
-    }
-
-    @Override
-    public WindowInsetsCompat replaceSystemWindowInsets(Rect systemWindowInsets) {
-        return new WindowInsetsCompatApi21(mSource.replaceSystemWindowInsets(systemWindowInsets));
-    }
-
-    @Override
-    public int getStableInsetTop() {
-        return mSource.getStableInsetTop();
-    }
-
-    @Override
-    public int getStableInsetLeft() {
-        return mSource.getStableInsetLeft();
-    }
-
-    @Override
-    public int getStableInsetRight() {
-        return mSource.getStableInsetRight();
-    }
-
-    @Override
-    public int getStableInsetBottom() {
-        return mSource.getStableInsetBottom();
-    }
-
-    @Override
-    public boolean hasStableInsets() {
-        return mSource.hasStableInsets();
-    }
-
-    @Override
-    public WindowInsetsCompat consumeStableInsets() {
-        return new WindowInsetsCompatApi21(mSource.consumeStableInsets());
-    }
-
-    WindowInsets unwrap() {
-        return mSource;
-    }
-}
diff --git a/v4/api21/android/support/v4/view/accessibility/AccessibilityNodeInfoCompatApi21.java b/v4/api21/android/support/v4/view/accessibility/AccessibilityNodeInfoCompatApi21.java
deleted file mode 100644
index 8939fee..0000000
--- a/v4/api21/android/support/v4/view/accessibility/AccessibilityNodeInfoCompatApi21.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Copyright (C) 2014 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 android.support.v4.view.accessibility;
-
-import android.view.View;
-import android.view.accessibility.AccessibilityNodeInfo;
-import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction;
-
-import java.util.List;
-
-/**
- * Api21-specific AccessibilityNodeInfo API implementation.
- */
-class AccessibilityNodeInfoCompatApi21 {
-    static List<Object> getActionList(Object info) {
-        Object result = ((AccessibilityNodeInfo) info).getActionList();
-        return (List<Object>) result;
-    }
-
-    static void addAction(Object info, Object action) {
-        ((AccessibilityNodeInfo) info).addAction((AccessibilityAction) action);
-    }
-
-    public static boolean removeAction(Object info, Object action) {
-        return ((AccessibilityNodeInfo) info).removeAction((AccessibilityAction) action);
-    }
-
-    public static Object obtainCollectionInfo(int rowCount, int columnCount,
-            boolean hierarchical, int selectionMode) {
-        return AccessibilityNodeInfo.CollectionInfo.obtain(rowCount, columnCount, hierarchical,
-                selectionMode);
-    }
-
-    public static Object obtainCollectionItemInfo(int rowIndex, int rowSpan, int columnIndex,
-            int columnSpan, boolean heading, boolean selected) {
-        return AccessibilityNodeInfo.CollectionItemInfo.obtain(rowIndex, rowSpan, columnIndex,
-                columnSpan, heading, selected);
-    }
-
-    public static CharSequence getError(Object info) {
-        return ((AccessibilityNodeInfo) info).getError();
-    }
-
-    public static void setError(Object info, CharSequence error) {
-        ((AccessibilityNodeInfo) info).setError(error);
-    }
-
-    public static void setMaxTextLength(Object info, int max) {
-        ((AccessibilityNodeInfo) info).setMaxTextLength(max);
-    }
-
-    public static int getMaxTextLength(Object info) {
-        return ((AccessibilityNodeInfo) info).getMaxTextLength();
-    }
-
-    public static Object getWindow(Object info) {
-        return ((AccessibilityNodeInfo) info).getWindow();
-    }
-
-    public static boolean removeChild(Object info, View child) {
-        return ((AccessibilityNodeInfo) info).removeChild(child);
-    }
-
-    public static boolean removeChild(Object info, View root, int virtualDescendantId) {
-        return ((AccessibilityNodeInfo) info).removeChild(root, virtualDescendantId);
-    }
-
-    static class CollectionItemInfo {
-        public static boolean isSelected(Object info) {
-            return ((AccessibilityNodeInfo.CollectionItemInfo) info).isSelected();
-        }
-    }
-
-    static Object newAccessibilityAction(int actionId, CharSequence label) {
-        return new AccessibilityAction(actionId, label);
-    }
-
-    static int getAccessibilityActionId(Object action) {
-        return ((AccessibilityNodeInfo.AccessibilityAction) action).getId();
-    }
-
-    static CharSequence getAccessibilityActionLabel(Object action) {
-        return ((AccessibilityNodeInfo.AccessibilityAction) action).getLabel();
-    }
-}
diff --git a/v4/api23/android/support/v4/app/ActivityCompat23.java b/v4/api23/android/support/v4/app/ActivityCompat23.java
deleted file mode 100644
index 40df982..0000000
--- a/v4/api23/android/support/v4/app/ActivityCompat23.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.v4.app;
-
-import android.app.Activity;
-
-class ActivityCompatApi23 {
-    public interface RequestPermissionsRequestCodeValidator {
-        public void validateRequestPermissionsRequestCode(int requestCode);
-    }
-
-    public static void requestPermissions(Activity activity, String[] permissions,
-            int requestCode) {
-        if (activity instanceof RequestPermissionsRequestCodeValidator) {
-            ((RequestPermissionsRequestCodeValidator) activity)
-                    .validateRequestPermissionsRequestCode(requestCode);
-        }
-        activity.requestPermissions(permissions, requestCode);
-    }
-
-    public static boolean shouldShowRequestPermissionRationale(Activity activity,
-            String permission) {
-        return activity.shouldShowRequestPermissionRationale(permission);
-    }
-}
diff --git a/v4/api24/android/support/v4/app/NotificationManagerCompatApi24.java b/v4/api24/android/support/v4/app/NotificationManagerCompatApi24.java
deleted file mode 100644
index f65d299..0000000
--- a/v4/api24/android/support/v4/app/NotificationManagerCompatApi24.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 2016 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 android.support.v4.app;
-
-import android.app.NotificationManager;
-import android.content.Context;
-
-class NotificationManagerCompatApi24 {
-    public static boolean areNotificationsEnabled(NotificationManager notificationManager) {
-        return notificationManager.areNotificationsEnabled();
-    }
-
-    public static int getImportance(NotificationManager notificationManager) {
-        return notificationManager.getImportance();
-    }
-}
diff --git a/v4/api24/android/support/v4/view/accessibility/AccessibilityNodeInfoCompatApi24.java b/v4/api24/android/support/v4/view/accessibility/AccessibilityNodeInfoCompatApi24.java
deleted file mode 100644
index dedf88d..0000000
--- a/v4/api24/android/support/v4/view/accessibility/AccessibilityNodeInfoCompatApi24.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (C) 2016 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 android.support.v4.view.accessibility;
-
-import android.view.accessibility.AccessibilityNodeInfo;
-
-/**
- * Api24-specific AccessibilityNodeInfo API implementation.
- */
-class AccessibilityNodeInfoCompatApi24 {
-    public static int getDrawingOrder(Object info) {
-        return ((AccessibilityNodeInfo) info).getDrawingOrder();
-    }
-
-    public static void setDrawingOrder(Object info, int drawingOrderInParent) {
-        ((AccessibilityNodeInfo) info).setDrawingOrder(drawingOrderInParent);
-    }
-
-    public static boolean isImportantForAccessibility(Object info) {
-        return ((AccessibilityNodeInfo) info).isImportantForAccessibility();
-    }
-
-    public static void setImportantForAccessibility(Object info,
-            boolean importantForAccessibility) {
-        ((AccessibilityNodeInfo) info).setImportantForAccessibility(importantForAccessibility);
-    }
-}
diff --git a/v4/build.gradle b/v4/build.gradle
index 4da2100..38d4887 100644
--- a/v4/build.gradle
+++ b/v4/build.gradle
@@ -1,9 +1,10 @@
 apply plugin: 'com.android.library'
-archivesBaseName = 'support-v4'
+archivesBaseName = 'support-core-utils'
 
 
-createApiSourceSets(project, gradle.ext.studioCompat.modules.v4.apiTargets)
+createApiSourceSets(project, gradle.ext.studioCompat.modules.coreutils.apiTargets)
 dependencies {
+    compile project(':support-compat')
     androidTestCompile ('com.android.support.test:runner:0.4.1') {
         exclude module: 'support-annotations'
     }
@@ -18,13 +19,13 @@
 
 sourceCompatibility = JavaVersion.VERSION_1_7
 targetCompatibility = JavaVersion.VERSION_1_7
-setApiModuleDependencies(project, dependencies, gradle.ext.studioCompat.modules.v4.dependencies)
+setApiModuleDependencies(project, dependencies, gradle.ext.studioCompat.modules.coreutils.dependencies)
 
 android {
-    compileSdkVersion 4
+    compileSdkVersion 9
 
     defaultConfig {
-        minSdkVersion 4
+        minSdkVersion 9
         // TODO: get target from branch
         //targetSdkVersion 19
 
@@ -38,7 +39,6 @@
 
         androidTest.setRoot('tests')
         androidTest.java.srcDir 'tests/java'
-        androidTest.res.srcDir 'tests/res'
         androidTest.manifest.srcFile 'tests/AndroidManifest.xml'
     }
 
@@ -47,10 +47,6 @@
         abortOnError false
     }
 
-    buildTypes.all {
-        consumerProguardFiles 'proguard-rules.pro'
-    }
-
     compileOptions {
         sourceCompatibility JavaVersion.VERSION_1_7
         targetCompatibility JavaVersion.VERSION_1_7
diff --git a/v4/donut/android/support/v4/animation/DonutAnimatorCompatProvider.java b/v4/donut/android/support/v4/animation/DonutAnimatorCompatProvider.java
deleted file mode 100644
index 290a73d..0000000
--- a/v4/donut/android/support/v4/animation/DonutAnimatorCompatProvider.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.v4.animation;
-
-import android.view.View;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Provides similar functionality to Animators on platforms prior to Honeycomb.
- * <p>
- * This is not a fully implemented API which is why it is not public.
- *
- * @hide
- */
-class DonutAnimatorCompatProvider implements AnimatorProvider {
-
-    @Override
-    public ValueAnimatorCompat emptyValueAnimator() {
-        return new DonutFloatValueAnimator();
-    }
-
-    private static class DonutFloatValueAnimator implements ValueAnimatorCompat {
-
-        List<AnimatorListenerCompat> mListeners = new ArrayList<AnimatorListenerCompat>();
-        List<AnimatorUpdateListenerCompat> mUpdateListeners
-                = new ArrayList<AnimatorUpdateListenerCompat>();
-        View mTarget;
-        private long mStartTime;
-        private long mDuration = 200;
-        private float mFraction = 0f;
-
-        private boolean mStarted = false;
-        private boolean mEnded = false;
-
-        public DonutFloatValueAnimator() {
-        }
-
-        private Runnable mLoopRunnable = new Runnable() {
-            @Override
-            public void run() {
-                long dt = getTime() - mStartTime;
-                float fraction = dt * 1f / mDuration;
-                if (fraction > 1f || mTarget.getParent() == null) {
-                    fraction = 1f;
-                }
-                mFraction = fraction;
-                notifyUpdateListeners();
-                if (mFraction >= 1f) {
-                    dispatchEnd();
-                } else {
-                    mTarget.postDelayed(mLoopRunnable, 16);
-                }
-            }
-        };
-
-        private void notifyUpdateListeners() {
-            for (int i = mUpdateListeners.size() - 1; i >= 0; i--) {
-                mUpdateListeners.get(i).onAnimationUpdate(this);
-            }
-        }
-
-        @Override
-        public void setTarget(View view) {
-            mTarget = view;
-        }
-
-        @Override
-        public void addListener(AnimatorListenerCompat listener) {
-            mListeners.add(listener);
-        }
-
-        @Override
-        public void setDuration(long duration) {
-            if (!mStarted) {
-                mDuration = duration;
-            }
-        }
-
-        @Override
-        public void start() {
-            if (mStarted) {
-                return;
-            }
-            mStarted = true;
-            dispatchStart();
-            mFraction = 0f;
-            mStartTime = getTime();
-            mTarget.postDelayed(mLoopRunnable, 16);
-        }
-
-        private long getTime() {
-            return mTarget.getDrawingTime();
-        }
-
-        private void dispatchStart() {
-            for (int i = mListeners.size() - 1; i >= 0; i--) {
-                mListeners.get(i).onAnimationStart(this);
-            }
-        }
-
-        private void dispatchEnd() {
-            for (int i = mListeners.size() - 1; i >= 0; i--) {
-                mListeners.get(i).onAnimationEnd(this);
-            }
-        }
-
-        private void dispatchCancel() {
-            for (int i = mListeners.size() - 1; i >= 0; i--) {
-                mListeners.get(i).onAnimationCancel(this);
-            }
-        }
-
-        @Override
-        public void cancel() {
-            if (mEnded) {
-                return;
-            }
-            mEnded = true;
-            if (mStarted) {
-                dispatchCancel();
-            }
-            dispatchEnd();
-        }
-
-        @Override
-        public void addUpdateListener(AnimatorUpdateListenerCompat animatorUpdateListener) {
-            mUpdateListeners.add(animatorUpdateListener);
-        }
-
-        @Override
-        public float getAnimatedFraction() {
-            return mFraction;
-        }
-    }
-
-    @Override
-    public void clearInterpolator(View view) {
-    }
-}
diff --git a/v4/donut/android/support/v4/app/BaseFragmentActivityDonut.java b/v4/donut/android/support/v4/app/BaseFragmentActivityDonut.java
deleted file mode 100644
index 4179632..0000000
--- a/v4/donut/android/support/v4/app/BaseFragmentActivityDonut.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.v4.app;
-
-import android.app.Activity;
-import android.content.Context;
-import android.os.Build;
-import android.os.Bundle;
-import android.util.AttributeSet;
-import android.view.View;
-
-/**
- * Base class for {@code FragmentActivity} to be able to use Donut APIs.
- *
- * @hide
- */
-abstract class BaseFragmentActivityDonut extends Activity {
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        if (Build.VERSION.SDK_INT < 11 && getLayoutInflater().getFactory() == null) {
-            // On pre-HC devices we need to manually install ourselves as a Factory.
-            // On HC and above, we are automatically installed as a private factory
-            getLayoutInflater().setFactory(this);
-        }
-
-        super.onCreate(savedInstanceState);
-    }
-
-    @Override
-    public View onCreateView(String name, Context context, AttributeSet attrs) {
-        final View v = dispatchFragmentsOnCreateView(null, name, context, attrs);
-        if (v == null) {
-            return super.onCreateView(name, context, attrs);
-        }
-        return v;
-    }
-
-    abstract View dispatchFragmentsOnCreateView(View parent, String name,
-            Context context, AttributeSet attrs);
-
-    /**
-     * Called when the back button has been pressed.and not handled by the support fragment manager.
-     */
-    void onBackPressedNotHandled() {
-        // on v4, just call finish manually
-        finish();
-    }
-
-}
diff --git a/v4/donut/android/support/v4/app/BundleCompatDonut.java b/v4/donut/android/support/v4/app/BundleCompatDonut.java
deleted file mode 100644
index e5e4149..0000000
--- a/v4/donut/android/support/v4/app/BundleCompatDonut.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.v4.app;
-
-import android.os.Bundle;
-import android.os.IBinder;
-import android.util.Log;
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-
-/**
- * @hide
- */
-class BundleCompatDonut {
-    private static final String TAG = "BundleCompatDonut";
-
-    private static Method sGetIBinderMethod;
-    private static boolean sGetIBinderMethodFetched;
-
-    private static Method sPutIBinderMethod;
-    private static boolean sPutIBinderMethodFetched;
-
-    public static IBinder getBinder(Bundle bundle, String key) {
-        if (!sGetIBinderMethodFetched) {
-            try {
-                sGetIBinderMethod = Bundle.class.getMethod("getIBinder", String.class);
-                sGetIBinderMethod.setAccessible(true);
-            } catch (NoSuchMethodException e) {
-                Log.i(TAG, "Failed to retrieve getIBinder method", e);
-            }
-            sGetIBinderMethodFetched = true;
-        }
-
-        if (sGetIBinderMethod != null) {
-            try {
-                return (IBinder) sGetIBinderMethod.invoke(bundle, key);
-            } catch (InvocationTargetException | IllegalAccessException
-                    | IllegalArgumentException e) {
-                Log.i(TAG, "Failed to invoke getIBinder via reflection", e);
-                sGetIBinderMethod = null;
-            }
-        }
-        return null;
-    }
-
-    public static void putBinder(Bundle bundle, String key, IBinder binder) {
-        if (!sPutIBinderMethodFetched) {
-            try {
-                sPutIBinderMethod =
-                        Bundle.class.getMethod("putIBinder", String.class, IBinder.class);
-                sPutIBinderMethod.setAccessible(true);
-            } catch (NoSuchMethodException e) {
-                Log.i(TAG, "Failed to retrieve putIBinder method", e);
-            }
-            sPutIBinderMethodFetched = true;
-        }
-
-        if (sPutIBinderMethod != null) {
-            try {
-                sPutIBinderMethod.invoke(bundle, key, binder);
-            } catch (InvocationTargetException | IllegalAccessException
-                    | IllegalArgumentException e) {
-                Log.i(TAG, "Failed to invoke putIBinder via reflection", e);
-                sPutIBinderMethod = null;
-            }
-        }
-    }
-}
diff --git a/v4/donut/android/support/v4/app/NotificationCompatBase.java b/v4/donut/android/support/v4/app/NotificationCompatBase.java
deleted file mode 100644
index b7104f2..0000000
--- a/v4/donut/android/support/v4/app/NotificationCompatBase.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright (C) 2014 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 android.support.v4.app;
-
-import android.app.Notification;
-import android.app.PendingIntent;
-import android.content.Context;
-import android.os.Bundle;
-
-/**
- * @hide
- */
-public class NotificationCompatBase {
-
-    public static abstract class Action {
-        public abstract int getIcon();
-        public abstract CharSequence getTitle();
-        public abstract PendingIntent getActionIntent();
-        public abstract Bundle getExtras();
-        public abstract RemoteInputCompatBase.RemoteInput[] getRemoteInputs();
-        public abstract boolean getAllowGeneratedReplies();
-
-        public interface Factory {
-            Action build(int icon, CharSequence title, PendingIntent actionIntent,
-                    Bundle extras, RemoteInputCompatBase.RemoteInput[] remoteInputs,
-                    boolean allowGeneratedReplies);
-            public Action[] newArray(int length);
-        }
-    }
-
-    public static abstract class UnreadConversation {
-        abstract String[] getParticipants();
-        abstract String getParticipant();
-        abstract String[] getMessages();
-        abstract RemoteInputCompatBase.RemoteInput getRemoteInput();
-        abstract PendingIntent getReplyPendingIntent();
-        abstract PendingIntent getReadPendingIntent();
-        abstract long getLatestTimestamp();
-
-        public interface Factory {
-            UnreadConversation build(String[] messages,
-                    RemoteInputCompatBase.RemoteInput remoteInput,
-                    PendingIntent replyPendingIntent, PendingIntent readPendingIntent,
-                    String[] participants, long latestTimestamp);
-        }
-    }
-
-    public static Notification add(Notification notification, Context context,
-            CharSequence contentTitle, CharSequence contentText, PendingIntent contentIntent) {
-        notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);
-        return notification;
-    }
-}
diff --git a/v4/donut/android/support/v4/content/res/ConfigurationHelperDonut.java b/v4/donut/android/support/v4/content/res/ConfigurationHelperDonut.java
deleted file mode 100644
index 3bb9397..0000000
--- a/v4/donut/android/support/v4/content/res/ConfigurationHelperDonut.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright (C) 2016 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 android.support.v4.content.res;
-
-import android.content.Context;
-import android.content.res.Resources;
-import android.support.annotation.NonNull;
-import android.util.DisplayMetrics;
-
-class ConfigurationHelperDonut {
-
-    static int getScreenHeightDp(@NonNull Resources resources) {
-        final DisplayMetrics metrics = resources.getDisplayMetrics();
-        return (int) (metrics.heightPixels / metrics.density);
-    }
-
-    static int getScreenWidthDp(@NonNull Resources resources) {
-        final DisplayMetrics metrics = resources.getDisplayMetrics();
-        return (int) (metrics.widthPixels / metrics.density);
-    }
-
-    static int getSmallestScreenWidthDp(@NonNull Resources resources) {
-        // Not perfect, but close enough
-        return Math.min(getScreenWidthDp(resources), getScreenHeightDp(resources));
-    }
-
-    static int getDensityDpi(@NonNull Resources resources) {
-        return resources.getDisplayMetrics().densityDpi;
-    }
-}
diff --git a/v4/donut/android/support/v4/graphics/drawable/DrawableCompatBase.java b/v4/donut/android/support/v4/graphics/drawable/DrawableCompatBase.java
deleted file mode 100644
index 53de6ff..0000000
--- a/v4/donut/android/support/v4/graphics/drawable/DrawableCompatBase.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.v4.graphics.drawable;
-
-import android.content.res.ColorStateList;
-import android.content.res.Resources;
-import android.graphics.PorterDuff;
-import android.graphics.drawable.Drawable;
-import android.util.AttributeSet;
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-
-import java.io.IOException;
-
-/**
- * Base implementation of drawable compatibility.
- */
-class DrawableCompatBase {
-
-    public static void setTint(Drawable drawable, int tint) {
-        if (drawable instanceof TintAwareDrawable) {
-            ((TintAwareDrawable) drawable).setTint(tint);
-        }
-    }
-
-    public static void setTintList(Drawable drawable, ColorStateList tint) {
-        if (drawable instanceof TintAwareDrawable) {
-            ((TintAwareDrawable) drawable).setTintList(tint);
-        }
-    }
-
-    public static void setTintMode(Drawable drawable, PorterDuff.Mode tintMode) {
-        if (drawable instanceof TintAwareDrawable) {
-            ((TintAwareDrawable) drawable).setTintMode(tintMode);
-        }
-    }
-
-    public static Drawable wrapForTinting(Drawable drawable) {
-        if (!(drawable instanceof TintAwareDrawable)) {
-            return new DrawableWrapperDonut(drawable);
-        }
-        return drawable;
-    }
-
-    public static void inflate(Drawable drawable, Resources res, XmlPullParser parser,
-                               AttributeSet attrs, Resources.Theme t)
-            throws IOException, XmlPullParserException {
-        drawable.inflate(res, parser, attrs);
-    }
-}
diff --git a/v4/donut/android/support/v4/graphics/drawable/DrawableWrapperDonut.java b/v4/donut/android/support/v4/graphics/drawable/DrawableWrapperDonut.java
deleted file mode 100644
index 916debf..0000000
--- a/v4/donut/android/support/v4/graphics/drawable/DrawableWrapperDonut.java
+++ /dev/null
@@ -1,383 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.v4.graphics.drawable;
-
-import android.content.res.ColorStateList;
-import android.content.res.Resources;
-import android.graphics.Canvas;
-import android.graphics.ColorFilter;
-import android.graphics.PorterDuff;
-import android.graphics.Rect;
-import android.graphics.Region;
-import android.graphics.drawable.Drawable;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-
-/**
- * Drawable which delegates all calls to it's wrapped {@link android.graphics.drawable.Drawable}.
- * <p>
- * Also allows backward compatible tinting via a color or {@link ColorStateList}.
- * This functionality is accessed via static methods in {@code DrawableCompat}.
- */
-class DrawableWrapperDonut extends Drawable
-        implements Drawable.Callback, DrawableWrapper, TintAwareDrawable {
-
-    static final PorterDuff.Mode DEFAULT_TINT_MODE = PorterDuff.Mode.SRC_IN;
-
-    private int mCurrentColor;
-    private PorterDuff.Mode mCurrentMode;
-    private boolean mColorFilterSet;
-
-    DrawableWrapperState mState;
-    private boolean mMutated;
-
-    Drawable mDrawable;
-
-    DrawableWrapperDonut(@NonNull DrawableWrapperState state, @Nullable Resources res) {
-        mState = state;
-        updateLocalState(res);
-    }
-
-    /**
-     * Creates a new wrapper around the specified drawable.
-     *
-     * @param dr the drawable to wrap
-     */
-    DrawableWrapperDonut(@Nullable Drawable dr) {
-        mState = mutateConstantState();
-        // Now set the drawable...
-        setWrappedDrawable(dr);
-    }
-
-    /**
-     * Initializes local dynamic properties from state. This should be called
-     * after significant state changes, e.g. from the One True Constructor and
-     * after inflating or applying a theme.
-     */
-    private void updateLocalState(@Nullable Resources res) {
-        if (mState != null && mState.mDrawableState != null) {
-            final Drawable dr = newDrawableFromState(mState.mDrawableState, res);
-            setWrappedDrawable(dr);
-        }
-    }
-
-    /**
-     * Allows us to call ConstantState.newDrawable(*) is a API safe way
-     */
-    protected Drawable newDrawableFromState(@NonNull Drawable.ConstantState state,
-            @Nullable Resources res) {
-        return state.newDrawable();
-    }
-
-    @Override
-    public void draw(Canvas canvas) {
-        mDrawable.draw(canvas);
-    }
-
-    @Override
-    protected void onBoundsChange(Rect bounds) {
-        if (mDrawable != null) {
-            mDrawable.setBounds(bounds);
-        }
-    }
-
-    @Override
-    public void setChangingConfigurations(int configs) {
-        mDrawable.setChangingConfigurations(configs);
-    }
-
-    @Override
-    public int getChangingConfigurations() {
-        return super.getChangingConfigurations()
-                | (mState != null ? mState.getChangingConfigurations() : 0)
-                | mDrawable.getChangingConfigurations();
-    }
-
-    @Override
-    public void setDither(boolean dither) {
-        mDrawable.setDither(dither);
-    }
-
-    @Override
-    public void setFilterBitmap(boolean filter) {
-        mDrawable.setFilterBitmap(filter);
-    }
-
-    @Override
-    public void setAlpha(int alpha) {
-        mDrawable.setAlpha(alpha);
-    }
-
-    @Override
-    public void setColorFilter(ColorFilter cf) {
-        mDrawable.setColorFilter(cf);
-    }
-
-    @Override
-    public boolean isStateful() {
-        final ColorStateList tintList = (isCompatTintEnabled() && mState != null)
-                ? mState.mTint
-                : null;
-        return (tintList != null && tintList.isStateful()) || mDrawable.isStateful();
-    }
-
-    @Override
-    public boolean setState(final int[] stateSet) {
-        boolean handled = mDrawable.setState(stateSet);
-        handled = updateTint(stateSet) || handled;
-        return handled;
-    }
-
-    @Override
-    public int[] getState() {
-        return mDrawable.getState();
-    }
-
-    @Override
-    public Drawable getCurrent() {
-        return mDrawable.getCurrent();
-    }
-
-    @Override
-    public boolean setVisible(boolean visible, boolean restart) {
-        return super.setVisible(visible, restart) || mDrawable.setVisible(visible, restart);
-    }
-
-    @Override
-    public int getOpacity() {
-        return mDrawable.getOpacity();
-    }
-
-    @Override
-    public Region getTransparentRegion() {
-        return mDrawable.getTransparentRegion();
-    }
-
-    @Override
-    public int getIntrinsicWidth() {
-        return mDrawable.getIntrinsicWidth();
-    }
-
-    @Override
-    public int getIntrinsicHeight() {
-        return mDrawable.getIntrinsicHeight();
-    }
-
-    @Override
-    public int getMinimumWidth() {
-        return mDrawable.getMinimumWidth();
-    }
-
-    @Override
-    public int getMinimumHeight() {
-        return mDrawable.getMinimumHeight();
-    }
-
-    @Override
-    public boolean getPadding(Rect padding) {
-        return mDrawable.getPadding(padding);
-    }
-
-    @Override
-    @Nullable
-    public ConstantState getConstantState() {
-        if (mState != null && mState.canConstantState()) {
-            mState.mChangingConfigurations = getChangingConfigurations();
-            return mState;
-        }
-        return null;
-    }
-
-    @Override
-    public Drawable mutate() {
-        if (!mMutated && super.mutate() == this) {
-            mState = mutateConstantState();
-            if (mDrawable != null) {
-                mDrawable.mutate();
-            }
-            if (mState != null) {
-                mState.mDrawableState = mDrawable != null ? mDrawable.getConstantState() : null;
-            }
-            mMutated = true;
-        }
-        return this;
-    }
-
-    /**
-     * Mutates the constant state and returns the new state.
-     * <p>
-     * This method should never call the super implementation; it should always
-     * mutate and return its own constant state.
-     *
-     * @return the new state
-     */
-    @NonNull
-    DrawableWrapperState mutateConstantState() {
-        return new DrawableWrapperStateDonut(mState, null);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public void invalidateDrawable(Drawable who) {
-        invalidateSelf();
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public void scheduleDrawable(Drawable who, Runnable what, long when) {
-        scheduleSelf(what, when);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public void unscheduleDrawable(Drawable who, Runnable what) {
-        unscheduleSelf(what);
-    }
-
-    @Override
-    protected boolean onLevelChange(int level) {
-        return mDrawable.setLevel(level);
-    }
-
-    @Override
-    public void setTint(int tint) {
-        setTintList(ColorStateList.valueOf(tint));
-    }
-
-    @Override
-    public void setTintList(ColorStateList tint) {
-        mState.mTint = tint;
-        updateTint(getState());
-    }
-
-    @Override
-    public void setTintMode(PorterDuff.Mode tintMode) {
-        mState.mTintMode = tintMode;
-        updateTint(getState());
-    }
-
-    private boolean updateTint(int[] state) {
-        if (!isCompatTintEnabled()) {
-            // If compat tinting is not enabled, fail fast
-            return false;
-        }
-
-        final ColorStateList tintList = mState.mTint;
-        final PorterDuff.Mode tintMode = mState.mTintMode;
-
-        if (tintList != null && tintMode != null) {
-            final int color = tintList.getColorForState(state, tintList.getDefaultColor());
-            if (!mColorFilterSet || color != mCurrentColor || tintMode != mCurrentMode) {
-                setColorFilter(color, tintMode);
-                mCurrentColor = color;
-                mCurrentMode = tintMode;
-                mColorFilterSet = true;
-                return true;
-            }
-        } else {
-            mColorFilterSet = false;
-            clearColorFilter();
-        }
-        return false;
-    }
-
-    /**
-     * Returns the wrapped {@link Drawable}
-     */
-    public final Drawable getWrappedDrawable() {
-        return mDrawable;
-    }
-
-    /**
-     * Sets the current wrapped {@link Drawable}
-     */
-    public final void setWrappedDrawable(Drawable dr) {
-        if (mDrawable != null) {
-            mDrawable.setCallback(null);
-        }
-
-        mDrawable = dr;
-
-        if (dr != null) {
-            dr.setCallback(this);
-            // Only call setters for data that's stored in the base Drawable.
-            dr.setVisible(isVisible(), true);
-            dr.setState(getState());
-            dr.setLevel(getLevel());
-            dr.setBounds(getBounds());
-            if (mState != null) {
-                mState.mDrawableState = dr.getConstantState();
-            }
-        }
-
-        invalidateSelf();
-    }
-
-    protected boolean isCompatTintEnabled() {
-        // It's enabled by default on Donut
-        return true;
-    }
-
-    protected static abstract class DrawableWrapperState extends Drawable.ConstantState {
-        int mChangingConfigurations;
-        Drawable.ConstantState mDrawableState;
-
-        ColorStateList mTint = null;
-        PorterDuff.Mode mTintMode = DEFAULT_TINT_MODE;
-
-        DrawableWrapperState(@Nullable DrawableWrapperState orig, @Nullable Resources res) {
-            if (orig != null) {
-                mChangingConfigurations = orig.mChangingConfigurations;
-                mDrawableState = orig.mDrawableState;
-                mTint = orig.mTint;
-                mTintMode = orig.mTintMode;
-            }
-        }
-
-        @Override
-        public Drawable newDrawable() {
-            return newDrawable(null);
-        }
-
-        public abstract Drawable newDrawable(@Nullable Resources res);
-
-        @Override
-        public int getChangingConfigurations() {
-            return mChangingConfigurations
-                    | (mDrawableState != null ? mDrawableState.getChangingConfigurations() : 0);
-        }
-
-        boolean canConstantState() {
-            return mDrawableState != null;
-        }
-    }
-
-    private static class DrawableWrapperStateDonut extends DrawableWrapperState {
-        DrawableWrapperStateDonut(
-                @Nullable DrawableWrapperState orig, @Nullable Resources res) {
-            super(orig, res);
-        }
-
-        @Override
-        public Drawable newDrawable(@Nullable Resources res) {
-            return new DrawableWrapperDonut(this, res);
-        }
-    }
-}
diff --git a/v4/donut/android/support/v4/view/OnApplyWindowInsetsListener.java b/v4/donut/android/support/v4/view/OnApplyWindowInsetsListener.java
deleted file mode 100644
index 2c2b95f..0000000
--- a/v4/donut/android/support/v4/view/OnApplyWindowInsetsListener.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (C) 2014 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 android.support.v4.view;
-
-import android.view.View;
-
-/**
- * Listener for applying window insets on a view in a custom way.
- *
- * <p>Apps may choose to implement this interface if they want to apply custom policy
- * to the way that window insets are treated for a view. If an OnApplyWindowInsetsListener
- * is set, it's
- * {@link #onApplyWindowInsets(android.view.View, WindowInsetsCompat) onApplyWindowInsets}
- * method will be called instead of the View's own {@code onApplyWindowInsets} method.
- * The listener may optionally call the parameter View's <code>onApplyWindowInsets</code>
- * method to apply the View's normal behavior as part of its own.</p>
- */
-public interface OnApplyWindowInsetsListener {
-    /**
-     * When {@link ViewCompat#setOnApplyWindowInsetsListener(View, OnApplyWindowInsetsListener) set}
-     * on a View, this listener method will be called instead of the view's own
-     * {@code onApplyWindowInsets} method.
-     *
-     * @param v The view applying window insets
-     * @param insets The insets to apply
-     * @return The insets supplied, minus any insets that were consumed
-     */
-    public WindowInsetsCompat onApplyWindowInsets(View v, WindowInsetsCompat insets);
-}
\ No newline at end of file
diff --git a/v4/donut/android/support/v4/view/WindowInsetsCompat.java b/v4/donut/android/support/v4/view/WindowInsetsCompat.java
deleted file mode 100644
index 45959a9..0000000
--- a/v4/donut/android/support/v4/view/WindowInsetsCompat.java
+++ /dev/null
@@ -1,259 +0,0 @@
-/*
- * Copyright (C) 2014 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 android.support.v4.view;
-
-import android.graphics.Rect;
-
-/**
- * Describes a set of insets for window content.
- *
- * <p>WindowInsetsCompats are immutable and may be expanded to include more inset types in the
- * future. To adjust insets, use one of the supplied clone methods to obtain a new
- * WindowInsetsCompat instance with the adjusted properties.</p>
- */
-public class WindowInsetsCompat {
-
-    /** Private ctor */
-    WindowInsetsCompat() {}
-
-    /**
-     * Returns the left system window inset in pixels.
-     *
-     * <p>The system window inset represents the area of a full-screen window that is
-     * partially or fully obscured by the status bar, navigation bar, IME or other system windows.
-     * </p>
-     *
-     * @return The left system window inset
-     */
-    public int getSystemWindowInsetLeft() {
-        return 0;
-    }
-
-    /**
-     * Returns the top system window inset in pixels.
-     *
-     * <p>The system window inset represents the area of a full-screen window that is
-     * partially or fully obscured by the status bar, navigation bar, IME or other system windows.
-     * </p>
-     *
-     * @return The top system window inset
-     */
-    public int getSystemWindowInsetTop() {
-        return 0;
-    }
-
-    /**
-     * Returns the right system window inset in pixels.
-     *
-     * <p>The system window inset represents the area of a full-screen window that is
-     * partially or fully obscured by the status bar, navigation bar, IME or other system windows.
-     * </p>
-     *
-     * @return The right system window inset
-     */
-    public int getSystemWindowInsetRight() {
-        return 0;
-    }
-
-    /**
-     * Returns the bottom system window inset in pixels.
-     *
-     * <p>The system window inset represents the area of a full-screen window that is
-     * partially or fully obscured by the status bar, navigation bar, IME or other system windows.
-     * </p>
-     *
-     * @return The bottom system window inset
-     */
-    public int getSystemWindowInsetBottom() {
-        return 0;
-    }
-
-    /**
-     * Returns true if this WindowInsets has nonzero system window insets.
-     *
-     * <p>The system window inset represents the area of a full-screen window that is
-     * partially or fully obscured by the status bar, navigation bar, IME or other system windows.
-     * </p>
-     *
-     * @return true if any of the system window inset values are nonzero
-     */
-    public boolean hasSystemWindowInsets() {
-        return false;
-    }
-
-    /**
-     * Returns true if this WindowInsets has any nonzero insets.
-     *
-     * @return true if any inset values are nonzero
-     */
-    public boolean hasInsets() {
-        return false;
-    }
-
-    /**
-     * Check if these insets have been fully consumed.
-     *
-     * <p>Insets are considered "consumed" if the applicable <code>consume*</code> methods
-     * have been called such that all insets have been set to zero. This affects propagation of
-     * insets through the view hierarchy; insets that have not been fully consumed will continue
-     * to propagate down to child views.</p>
-     *
-     * <p>The result of this method is equivalent to the return value of
-     * {@link android.view.View#fitSystemWindows(android.graphics.Rect)}.</p>
-     *
-     * @return true if the insets have been fully consumed.
-     */
-    public boolean isConsumed() {
-        return false;
-    }
-
-    /**
-     * Returns true if the associated window has a round shape.
-     *
-     * <p>A round window's left, top, right and bottom edges reach all the way to the
-     * associated edges of the window but the corners may not be visible. Views responding
-     * to round insets should take care to not lay out critical elements within the corners
-     * where they may not be accessible.</p>
-     *
-     * @return True if the window is round
-     */
-    public boolean isRound() {
-        return false;
-    }
-
-    /**
-     * Returns a copy of this WindowInsets with the system window insets fully consumed.
-     *
-     * @return A modified copy of this WindowInsets
-     */
-    public WindowInsetsCompat consumeSystemWindowInsets() {
-        return this;
-    }
-
-    /**
-     * Returns a copy of this WindowInsets with selected system window insets replaced
-     * with new values.
-     *
-     * @param left New left inset in pixels
-     * @param top New top inset in pixels
-     * @param right New right inset in pixels
-     * @param bottom New bottom inset in pixels
-     * @return A modified copy of this WindowInsets
-     */
-    public WindowInsetsCompat replaceSystemWindowInsets(int left, int top, int right, int bottom) {
-        return this;
-    }
-
-    /**
-     * Returns a copy of this WindowInsets with selected system window insets replaced
-     * with new values.
-     *
-     * @param systemWindowInsets New system window insets. Each field is the inset in pixels
-     *                           for that edge
-     * @return A modified copy of this WindowInsets
-     */
-    public WindowInsetsCompat replaceSystemWindowInsets(Rect systemWindowInsets) {
-        return this;
-    }
-
-    /**
-     * Returns the top stable inset in pixels.
-     *
-     * <p>The stable inset represents the area of a full-screen window that <b>may</b> be
-     * partially or fully obscured by the system UI elements.  This value does not change
-     * based on the visibility state of those elements; for example, if the status bar is
-     * normally shown, but temporarily hidden, the stable inset will still provide the inset
-     * associated with the status bar being shown.</p>
-     *
-     * @return The top stable inset
-     */
-    public int getStableInsetTop() {
-        return 0;
-    }
-
-
-    /**
-     * Returns the left stable inset in pixels.
-     *
-     * <p>The stable inset represents the area of a full-screen window that <b>may</b> be
-     * partially or fully obscured by the system UI elements.  This value does not change
-     * based on the visibility state of those elements; for example, if the status bar is
-     * normally shown, but temporarily hidden, the stable inset will still provide the inset
-     * associated with the status bar being shown.</p>
-     *
-     * @return The left stable inset
-     */
-    public int getStableInsetLeft() {
-        return 0;
-    }
-
-    /**
-     * Returns the right stable inset in pixels.
-     *
-     * <p>The stable inset represents the area of a full-screen window that <b>may</b> be
-     * partially or fully obscured by the system UI elements.  This value does not change
-     * based on the visibility state of those elements; for example, if the status bar is
-     * normally shown, but temporarily hidden, the stable inset will still provide the inset
-     * associated with the status bar being shown.</p>
-     *
-     * @return The right stable inset
-     */
-    public int getStableInsetRight() {
-        return 0;
-    }
-
-
-    /**
-     * Returns the bottom stable inset in pixels.
-     *
-     * <p>The stable inset represents the area of a full-screen window that <b>may</b> be
-     * partially or fully obscured by the system UI elements.  This value does not change
-     * based on the visibility state of those elements; for example, if the status bar is
-     * normally shown, but temporarily hidden, the stable inset will still provide the inset
-     * associated with the status bar being shown.</p>
-     *
-     * @return The bottom stable inset
-     */
-    public int getStableInsetBottom() {
-        return 0;
-    }
-
-    /**
-     * Returns true if this WindowInsets has nonzero stable insets.
-     *
-     * <p>The stable inset represents the area of a full-screen window that <b>may</b> be
-     * partially or fully obscured by the system UI elements.  This value does not change
-     * based on the visibility state of those elements; for example, if the status bar is
-     * normally shown, but temporarily hidden, the stable inset will still provide the inset
-     * associated with the status bar being shown.</p>
-     *
-     * @return true if any of the stable inset values are nonzero
-     */
-    public boolean hasStableInsets() {
-        return false;
-    }
-
-    /**
-     * Returns a copy of this WindowInsets with the stable insets fully consumed.
-     *
-     * @return A modified copy of this WindowInsetsCompat
-     */
-    public WindowInsetsCompat consumeStableInsets() {
-        return this;
-    }
-
-}
diff --git a/v4/donut/android/support/v4/view/animation/PathInterpolatorCompatBase.java b/v4/donut/android/support/v4/view/animation/PathInterpolatorCompatBase.java
deleted file mode 100644
index 9bd4c94..0000000
--- a/v4/donut/android/support/v4/view/animation/PathInterpolatorCompatBase.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.v4.view.animation;
-
-import android.graphics.Path;
-import android.view.animation.Interpolator;
-
-/**
- * Base implementation for path interpolator compatibility.
- */
-class PathInterpolatorCompatBase  {
-
-    private PathInterpolatorCompatBase() {
-        // prevent instantiation
-    }
-
-    public static Interpolator create(Path path) {
-        return new PathInterpolatorDonut(path);
-    }
-
-    public static Interpolator create(float controlX, float controlY) {
-        return new PathInterpolatorDonut(controlX, controlY);
-    }
-
-    public static Interpolator create(float controlX1, float controlY1,
-            float controlX2, float controlY2) {
-        return new PathInterpolatorDonut(controlX1, controlY1, controlX2, controlY2);
-    }
-}
diff --git a/v4/donut/android/support/v4/view/animation/PathInterpolatorDonut.java b/v4/donut/android/support/v4/view/animation/PathInterpolatorDonut.java
deleted file mode 100644
index 1240e1f..0000000
--- a/v4/donut/android/support/v4/view/animation/PathInterpolatorDonut.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.v4.view.animation;
-
-import android.graphics.Path;
-import android.graphics.PathMeasure;
-import android.view.animation.Interpolator;
-
-/**
- * A path interpolator implementation compatible with API 4+.
- */
-class PathInterpolatorDonut implements Interpolator {
-
-    /**
-     * Governs the accuracy of the approximation of the {@link Path}.
-     */
-    private static final float PRECISION = 0.002f;
-
-    private final float[] mX;
-    private final float[] mY;
-
-    public PathInterpolatorDonut(Path path) {
-        final PathMeasure pathMeasure = new PathMeasure(path, false /* forceClosed */);
-
-        final float pathLength = pathMeasure.getLength();
-        final int numPoints = (int) (pathLength / PRECISION) + 1;
-
-        mX = new float[numPoints];
-        mY = new float[numPoints];
-
-        final float[] position = new float[2];
-        for (int i = 0; i < numPoints; ++i) {
-            final float distance = (i * pathLength) / (numPoints - 1);
-            pathMeasure.getPosTan(distance, position, null /* tangent */);
-
-            mX[i] = position[0];
-            mY[i] = position[1];
-        }
-    }
-
-    public PathInterpolatorDonut(float controlX, float controlY) {
-        this(createQuad(controlX, controlY));
-    }
-
-    public PathInterpolatorDonut(float controlX1, float controlY1,
-            float controlX2, float controlY2) {
-        this(createCubic(controlX1, controlY1, controlX2, controlY2));
-    }
-
-    @Override
-    public float getInterpolation(float t) {
-        if (t <= 0.0f) {
-            return 0.0f;
-        } else if (t >= 1.0f) {
-            return 1.0f;
-        }
-
-        // Do a binary search for the correct x to interpolate between.
-        int startIndex = 0;
-        int endIndex = mX.length - 1;
-        while (endIndex - startIndex > 1) {
-            int midIndex = (startIndex + endIndex) / 2;
-            if (t < mX[midIndex]) {
-                endIndex = midIndex;
-            } else {
-                startIndex = midIndex;
-            }
-        }
-
-        final float xRange = mX[endIndex] - mX[startIndex];
-        if (xRange == 0) {
-            return mY[startIndex];
-        }
-
-        final float tInRange = t - mX[startIndex];
-        final float fraction = tInRange / xRange;
-
-        final float startY = mY[startIndex];
-        final float endY = mY[endIndex];
-
-        return startY + (fraction * (endY - startY));
-    }
-
-    private static Path createQuad(float controlX, float controlY) {
-        final Path path = new Path();
-        path.moveTo(0.0f, 0.0f);
-        path.quadTo(controlX, controlY, 1.0f, 1.0f);
-        return path;
-    }
-
-    private static Path createCubic(float controlX1, float controlY1,
-            float controlX2, float controlY2) {
-        final Path path = new Path();
-        path.moveTo(0.0f, 0.0f);
-        path.cubicTo(controlX1, controlY1, controlX2, controlY2, 1.0f, 1.0f);
-        return path;
-    }
-}
diff --git a/v4/donut/android/support/v4/widget/CompoundButtonCompatDonut.java b/v4/donut/android/support/v4/widget/CompoundButtonCompatDonut.java
deleted file mode 100644
index af9e19f..0000000
--- a/v4/donut/android/support/v4/widget/CompoundButtonCompatDonut.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.v4.widget;
-
-import android.content.res.ColorStateList;
-import android.graphics.PorterDuff;
-import android.graphics.drawable.Drawable;
-import android.util.Log;
-import android.widget.CompoundButton;
-
-import java.lang.reflect.Field;
-
-class CompoundButtonCompatDonut {
-
-    private static final String TAG = "CompoundButtonCompatDonut";
-
-    private static Field sButtonDrawableField;
-    private static boolean sButtonDrawableFieldFetched;
-
-    static void setButtonTintList(CompoundButton button, ColorStateList tint) {
-        if (button instanceof TintableCompoundButton) {
-            ((TintableCompoundButton) button).setSupportButtonTintList(tint);
-        }
-    }
-
-    static ColorStateList getButtonTintList(CompoundButton button) {
-        if (button instanceof TintableCompoundButton) {
-             return((TintableCompoundButton) button).getSupportButtonTintList();
-        }
-        return null;
-    }
-
-    static void setButtonTintMode(CompoundButton button, PorterDuff.Mode tintMode) {
-        if (button instanceof TintableCompoundButton) {
-            ((TintableCompoundButton) button).setSupportButtonTintMode(tintMode);
-        }
-    }
-
-    static PorterDuff.Mode getButtonTintMode(CompoundButton button) {
-        if (button instanceof TintableCompoundButton) {
-            return ((TintableCompoundButton) button).getSupportButtonTintMode();
-        }
-        return null;
-    }
-
-    static Drawable getButtonDrawable(CompoundButton button) {
-        if (!sButtonDrawableFieldFetched) {
-            try {
-                sButtonDrawableField = CompoundButton.class.getDeclaredField("mButtonDrawable");
-                sButtonDrawableField.setAccessible(true);
-            } catch (NoSuchFieldException e) {
-                Log.i(TAG, "Failed to retrieve mButtonDrawable field", e);
-            }
-            sButtonDrawableFieldFetched = true;
-        }
-
-        if (sButtonDrawableField != null) {
-            try {
-                return (Drawable) sButtonDrawableField.get(button);
-            } catch (IllegalAccessException e) {
-                Log.i(TAG, "Failed to get button drawable via reflection", e);
-                sButtonDrawableField = null;
-            }
-        }
-        return null;
-    }
-
-}
diff --git a/v4/donut/android/support/v4/widget/ListViewCompatDonut.java b/v4/donut/android/support/v4/widget/ListViewCompatDonut.java
deleted file mode 100644
index 4e9aede..0000000
--- a/v4/donut/android/support/v4/widget/ListViewCompatDonut.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (C) 2016 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 android.support.v4.widget;
-
-import android.view.View;
-import android.widget.AbsListView;
-import android.widget.ListView;
-
-class ListViewCompatDonut {
-    static void scrollListBy(final ListView listView, int y) {
-        final int firstPosition = listView.getFirstVisiblePosition();
-        if (firstPosition == ListView.INVALID_POSITION) {
-            return;
-        }
-
-        final View firstView = listView.getChildAt(0);
-        if (firstView == null) {
-            return;
-        }
-
-        final int newTop = firstView.getTop() - y;
-        listView.setSelectionFromTop(firstPosition, newTop);
-    }
-}
diff --git a/v4/eclair-mr1/android/support/v4/view/ViewCompatEclairMr1.java b/v4/eclair-mr1/android/support/v4/view/ViewCompatEclairMr1.java
deleted file mode 100644
index 971b70d..0000000
--- a/v4/eclair-mr1/android/support/v4/view/ViewCompatEclairMr1.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-package android.support.v4.view;
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-
-import android.util.Log;
-import android.view.View;
-import android.view.ViewGroup;
-
-class ViewCompatEclairMr1 {
-    public static final String TAG = "ViewCompat";
-
-    private static Method sChildrenDrawingOrderMethod;
-
-    public static boolean isOpaque(View view) {
-        return view.isOpaque();
-    }
-
-    public static void setChildrenDrawingOrderEnabled(ViewGroup viewGroup, boolean enabled) {
-        if (sChildrenDrawingOrderMethod == null) {
-            try {
-                sChildrenDrawingOrderMethod = ViewGroup.class
-                        .getDeclaredMethod("setChildrenDrawingOrderEnabled", boolean.class);
-            } catch (NoSuchMethodException e) {
-                Log.e(TAG, "Unable to find childrenDrawingOrderEnabled", e);
-            }
-            sChildrenDrawingOrderMethod.setAccessible(true);
-        }
-        try {
-            sChildrenDrawingOrderMethod.invoke(viewGroup, enabled);
-        } catch (IllegalAccessException e) {
-            Log.e(TAG, "Unable to invoke childrenDrawingOrderEnabled", e);
-        } catch (IllegalArgumentException e) {
-            Log.e(TAG, "Unable to invoke childrenDrawingOrderEnabled", e);
-        } catch (InvocationTargetException e) {
-            Log.e(TAG, "Unable to invoke childrenDrawingOrderEnabled", e);
-        }
-    }
-}
diff --git a/v4/eclair/android/support/v4/app/ActivityCompatEclair.java b/v4/eclair/android/support/v4/app/ActivityCompatEclair.java
deleted file mode 100644
index 95a77f8..0000000
--- a/v4/eclair/android/support/v4/app/ActivityCompatEclair.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2016 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 android.support.v4.app;
-
-
-import android.app.Activity;
-import android.content.Intent;
-import android.content.IntentSender;
-
-class ActivityCompatEclair {
-
-    public static void startIntentSenderForResult(Activity activity, IntentSender intent,
-            int requestCode, Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags)
-            throws IntentSender.SendIntentException {
-        activity.startIntentSenderForResult(intent, requestCode, fillInIntent, flagsMask,
-                flagsValues, extraFlags);
-    }
-}
diff --git a/v4/eclair/android/support/v4/app/BaseFragmentActivityEclair.java b/v4/eclair/android/support/v4/app/BaseFragmentActivityEclair.java
deleted file mode 100644
index a77f057..0000000
--- a/v4/eclair/android/support/v4/app/BaseFragmentActivityEclair.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright (C) 2016 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 android.support.v4.app;
-
-import android.content.Intent;
-import android.content.IntentSender;
-import android.support.annotation.Nullable;
-
-/**
- * Base class for {@code FragmentActivity} to be able to use v5 APIs.
- *
- * @hide
- */
-abstract class BaseFragmentActivityEclair extends BaseFragmentActivityDonut {
-
-    // We need to keep track of whether startIntentSenderForResult originated from a Fragment, so we
-    // can conditionally check whether the requestCode collides with our reserved ID space for the
-    // request index (see above). Unfortunately we can't just call
-    // super.startIntentSenderForResult(...) to bypass the check when the call didn't come from a
-    // fragment, since we need to use the ActivityCompat version for backward compatibility.
-    boolean mStartedIntentSenderFromFragment;
-
-    @Override
-    public void startIntentSenderForResult(IntentSender intent, int requestCode,
-            @Nullable Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags)
-            throws IntentSender.SendIntentException {
-        // If this was started from a Fragment we've already checked the upper 16 bits were not in
-        // use, and then repurposed them for the Fragment's index.
-        if (!mStartedIntentSenderFromFragment) {
-            if (requestCode != -1) {
-                checkForValidRequestCode(requestCode);
-            }
-        }
-        super.startIntentSenderForResult(intent, requestCode, fillInIntent, flagsMask, flagsValues,
-                extraFlags);
-    }
-
-    @Override
-    void onBackPressedNotHandled() {
-        // On v5+, delegate to the framework impl of onBackPressed()
-        super.onBackPressed();
-    }
-
-    /**
-     * Checks whether the given request code is a valid code by masking it with 0xffff0000. Throws
-     * an {@link IllegalArgumentException} if the code is not valid.
-     */
-    static void checkForValidRequestCode(int requestCode) {
-        if ((requestCode & 0xffff0000) != 0) {
-            throw new IllegalArgumentException("Can only use lower 16 bits for requestCode");
-        }
-    }
-}
diff --git a/v4/eclair/android/support/v4/app/NotificationManagerCompatEclair.java b/v4/eclair/android/support/v4/app/NotificationManagerCompatEclair.java
deleted file mode 100644
index 45d96e4..0000000
--- a/v4/eclair/android/support/v4/app/NotificationManagerCompatEclair.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2014 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 android.support.v4.app;
-
-import android.app.Notification;
-import android.app.NotificationManager;
-
-class NotificationManagerCompatEclair {
-    static void cancelNotification(NotificationManager notificationManager, String tag,
-            int id) {
-        notificationManager.cancel(tag, id);
-    }
-
-    public static void postNotification(NotificationManager notificationManager, String tag, int id,
-            Notification notification) {
-        notificationManager.notify(tag, id, notification);
-    }
-}
diff --git a/v4/eclair/android/support/v4/graphics/drawable/DrawableCompatEclair.java b/v4/eclair/android/support/v4/graphics/drawable/DrawableCompatEclair.java
deleted file mode 100644
index a33efe5..0000000
--- a/v4/eclair/android/support/v4/graphics/drawable/DrawableCompatEclair.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (C) 2016 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 android.support.v4.graphics.drawable;
-
-import android.graphics.drawable.Drawable;
-
-/**
- * Implementation of drawable compatibility that can call Eclair APIs.
- */
-class DrawableCompatEclair {
-    public static Drawable wrapForTinting(Drawable drawable) {
-        if (!(drawable instanceof TintAwareDrawable)) {
-            return new DrawableWrapperEclair(drawable);
-        }
-        return drawable;
-    }
-}
diff --git a/v4/eclair/android/support/v4/graphics/drawable/DrawableWrapperEclair.java b/v4/eclair/android/support/v4/graphics/drawable/DrawableWrapperEclair.java
deleted file mode 100644
index 11a65ee..0000000
--- a/v4/eclair/android/support/v4/graphics/drawable/DrawableWrapperEclair.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (C) 2016 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 android.support.v4.graphics.drawable;
-
-import android.content.res.ColorStateList;
-import android.content.res.Resources;
-import android.graphics.Canvas;
-import android.graphics.ColorFilter;
-import android.graphics.PorterDuff;
-import android.graphics.Rect;
-import android.graphics.Region;
-import android.graphics.drawable.Drawable;
-import android.support.annotation.Nullable;
-
-class DrawableWrapperEclair extends DrawableWrapperDonut {
-
-    DrawableWrapperEclair(Drawable drawable) {
-        super(drawable);
-    }
-
-    DrawableWrapperEclair(DrawableWrapperState state, Resources resources) {
-        super(state, resources);
-    }
-
-    @Override
-    DrawableWrapperState mutateConstantState() {
-        return new DrawableWrapperStateEclair(mState, null);
-    }
-
-    @Override
-    protected Drawable newDrawableFromState(Drawable.ConstantState state, Resources res) {
-        return state.newDrawable(res);
-    }
-
-    private static class DrawableWrapperStateEclair extends DrawableWrapperState {
-        DrawableWrapperStateEclair(@Nullable DrawableWrapperState orig,
-                @Nullable Resources res) {
-            super(orig, res);
-        }
-
-        @Override
-        public Drawable newDrawable(@Nullable Resources res) {
-            return new DrawableWrapperEclair(this, res);
-        }
-    }
-}
\ No newline at end of file
diff --git a/v4/eclair/android/support/v4/view/KeyEventCompatEclair.java b/v4/eclair/android/support/v4/view/KeyEventCompatEclair.java
deleted file mode 100644
index b3b0d11..0000000
--- a/v4/eclair/android/support/v4/view/KeyEventCompatEclair.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-package android.support.v4.view;
-
-import android.view.KeyEvent;
-import android.view.View;
-
-class KeyEventCompatEclair {
-    public static Object getKeyDispatcherState(View view) {
-        return view.getKeyDispatcherState();
-    }
-
-    public static boolean dispatch(KeyEvent event, KeyEvent.Callback receiver, Object state,
-                Object target) {
-        return event.dispatch(receiver, (KeyEvent.DispatcherState)state, target);
-    }
-
-    public static void startTracking(KeyEvent event) {
-        event.startTracking();
-    }
-
-    public static boolean isTracking(KeyEvent event) {
-        return event.isTracking();
-    }
-}
diff --git a/v4/eclair/android/support/v4/view/MotionEventCompatEclair.java b/v4/eclair/android/support/v4/view/MotionEventCompatEclair.java
deleted file mode 100644
index 7ecfb5c..0000000
--- a/v4/eclair/android/support/v4/view/MotionEventCompatEclair.java
+++ /dev/null
@@ -1,40 +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 android.support.v4.view;
-
-import android.view.MotionEvent;
-
-/**
- * Implementation of motion event compatibility that can call Eclair APIs.
- */
-class MotionEventCompatEclair {
-    public static int findPointerIndex(MotionEvent event, int pointerId) {
-        return event.findPointerIndex(pointerId);
-    }
-    public static int getPointerId(MotionEvent event, int pointerIndex) {
-        return event.getPointerId(pointerIndex);
-    }
-    public static float getX(MotionEvent event, int pointerIndex) {
-        return event.getX(pointerIndex);
-    }
-    public static float getY(MotionEvent event, int pointerIndex) {
-        return event.getY(pointerIndex);
-    }
-    public static int getPointerCount(MotionEvent event) {
-        return event.getPointerCount();
-    }
-}
diff --git a/v4/froyo/android/support/v4/content/ContextCompatFroyo.java b/v4/froyo/android/support/v4/content/ContextCompatFroyo.java
deleted file mode 100644
index 1fc2f8d..0000000
--- a/v4/froyo/android/support/v4/content/ContextCompatFroyo.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.support.v4.content;
-
-import android.content.Context;
-
-import java.io.File;
-
-class ContextCompatFroyo {
-    public static File getExternalCacheDir(Context context) {
-        return context.getExternalCacheDir();
-    }
-
-    public static File getExternalFilesDir(Context context, String type) {
-        return context.getExternalFilesDir(type);
-    }
-}
diff --git a/v4/froyo/android/support/v4/media/session/MediaSessionCompatApi8.java b/v4/froyo/android/support/v4/media/session/MediaSessionCompatApi8.java
deleted file mode 100644
index d03287f..0000000
--- a/v4/froyo/android/support/v4/media/session/MediaSessionCompatApi8.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2014 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 android.support.v4.media.session;
-
-import android.content.ComponentName;
-import android.content.Context;
-import android.media.AudioManager;
-
-class MediaSessionCompatApi8 {
-    public static void registerMediaButtonEventReceiver(Context context, ComponentName mbr) {
-        AudioManager am = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
-        am.registerMediaButtonEventReceiver(mbr);
-    }
-
-    public static void unregisterMediaButtonEventReceiver(Context context, ComponentName mbr) {
-        AudioManager am = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
-        am.unregisterMediaButtonEventReceiver(mbr);
-    }
-}
\ No newline at end of file
diff --git a/v4/froyo/android/support/v4/view/ViewConfigurationCompatFroyo.java b/v4/froyo/android/support/v4/view/ViewConfigurationCompatFroyo.java
deleted file mode 100644
index 71a4b26..0000000
--- a/v4/froyo/android/support/v4/view/ViewConfigurationCompatFroyo.java
+++ /dev/null
@@ -1,28 +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 android.support.v4.view;
-
-import android.view.ViewConfiguration;
-
-/**
- * Implementation of menu compatibility that can call Froyo APIs.
- */
-class ViewConfigurationCompatFroyo {
-    public static int getScaledPagingTouchSlop(ViewConfiguration config) {
-        return config.getScaledPagingTouchSlop();
-    }
-}
diff --git a/v4/gingerbread/android/support/v4/app/NotificationCompatGingerbread.java b/v4/gingerbread/android/support/v4/app/NotificationCompatGingerbread.java
deleted file mode 100644
index 8537ab7..0000000
--- a/v4/gingerbread/android/support/v4/app/NotificationCompatGingerbread.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.support.v4.app;
-
-import android.app.Notification;
-import android.app.PendingIntent;
-import android.content.Context;
-
-class NotificationCompatGingerbread {
-    public static Notification add(Notification notification, Context context,
-            CharSequence contentTitle, CharSequence contentText, PendingIntent contentIntent,
-            PendingIntent fullScreenIntent) {
-        notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);
-        notification.fullScreenIntent = fullScreenIntent;
-        return notification;
-    }
-}
diff --git a/v4/gingerbread/android/support/v4/content/EditorCompatGingerbread.java b/v4/gingerbread/android/support/v4/content/EditorCompatGingerbread.java
deleted file mode 100644
index 394964d..0000000
--- a/v4/gingerbread/android/support/v4/content/EditorCompatGingerbread.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.v4.content;
-
-import android.content.SharedPreferences;
-import android.support.annotation.NonNull;
-
-class EditorCompatGingerbread {
-    public static void apply(@NonNull SharedPreferences.Editor editor) {
-        try {
-            editor.apply();
-        } catch (AbstractMethodError unused) {
-            // The app injected its own pre-Gingerbread
-            // SharedPreferences.Editor implementation without
-            // an apply method.
-            editor.commit();
-        }
-    }
-}
diff --git a/v4/donut/android/support/v4/graphics/drawable/RoundedBitmapDrawable.java b/v4/gingerbread/android/support/v4/graphics/drawable/RoundedBitmapDrawable.java
similarity index 100%
rename from v4/donut/android/support/v4/graphics/drawable/RoundedBitmapDrawable.java
rename to v4/gingerbread/android/support/v4/graphics/drawable/RoundedBitmapDrawable.java
diff --git a/v4/gingerbread/android/support/v4/net/ConnectivityManagerCompatGingerbread.java b/v4/gingerbread/android/support/v4/net/ConnectivityManagerCompatGingerbread.java
deleted file mode 100644
index 281aab2..0000000
--- a/v4/gingerbread/android/support/v4/net/ConnectivityManagerCompatGingerbread.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (C) 2012 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 android.support.v4.net;
-
-import static android.net.ConnectivityManager.TYPE_MOBILE;
-import static android.net.ConnectivityManager.TYPE_MOBILE_DUN;
-import static android.net.ConnectivityManager.TYPE_MOBILE_HIPRI;
-import static android.net.ConnectivityManager.TYPE_MOBILE_MMS;
-import static android.net.ConnectivityManager.TYPE_MOBILE_SUPL;
-import static android.net.ConnectivityManager.TYPE_WIFI;
-import static android.net.ConnectivityManager.TYPE_WIMAX;
-
-import android.net.ConnectivityManager;
-import android.net.NetworkInfo;
-
-/**
- * Implementation of ConnectivityManagerCompat that can use Gingerbread APIs.
- */
-class ConnectivityManagerCompatGingerbread {
-    public static boolean isActiveNetworkMetered(ConnectivityManager cm) {
-        final NetworkInfo info = cm.getActiveNetworkInfo();
-        if (info == null) {
-            // err on side of caution
-            return true;
-        }
-
-        final int type = info.getType();
-        switch (type) {
-            case TYPE_MOBILE:
-            case TYPE_MOBILE_DUN:
-            case TYPE_MOBILE_HIPRI:
-            case TYPE_MOBILE_MMS:
-            case TYPE_MOBILE_SUPL:
-            case TYPE_WIMAX:
-                return true;
-            case TYPE_WIFI:
-                return false;
-            default:
-                // err on side of caution
-                return true;
-        }
-    }
-}
diff --git a/v4/gingerbread/android/support/v4/view/MotionEventCompatGingerbread.java b/v4/gingerbread/android/support/v4/view/MotionEventCompatGingerbread.java
deleted file mode 100644
index f43dc0a..0000000
--- a/v4/gingerbread/android/support/v4/view/MotionEventCompatGingerbread.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.v4.view;
-
-import android.view.MotionEvent;
-
-/**
- * Motion event compatibility class for API 8+.
- */
-class MotionEventCompatGingerbread {
-    public static int getSource(MotionEvent event) {
-        return event.getSource();
-    }
-}
diff --git a/v4/gingerbread/android/support/v4/view/ViewCompatGingerbread.java b/v4/gingerbread/android/support/v4/view/ViewCompatGingerbread.java
deleted file mode 100644
index f410a69..0000000
--- a/v4/gingerbread/android/support/v4/view/ViewCompatGingerbread.java
+++ /dev/null
@@ -1,29 +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 android.support.v4.view;
-
-import android.view.View;
-
-class ViewCompatGingerbread {
-    public static int getOverScrollMode(View v) {
-        return v.getOverScrollMode();
-    }
-
-    public static void setOverScrollMode(View v, int mode) {
-        v.setOverScrollMode(mode);
-    }
-}
diff --git a/v4/gingerbread/android/support/v4/widget/PopupWindowCompatGingerbread.java b/v4/gingerbread/android/support/v4/widget/PopupWindowCompatGingerbread.java
deleted file mode 100644
index b87db30..0000000
--- a/v4/gingerbread/android/support/v4/widget/PopupWindowCompatGingerbread.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.v4.widget;
-
-import android.widget.PopupWindow;
-
-import java.lang.reflect.Method;
-
-/**
- * Implementation of PopupWindow compatibility that can call Gingerbread APIs.
- */
-class PopupWindowCompatGingerbread {
-
-    private static Method sSetWindowLayoutTypeMethod;
-    private static boolean sSetWindowLayoutTypeMethodAttempted;
-    private static Method sGetWindowLayoutTypeMethod;
-    private static boolean sGetWindowLayoutTypeMethodAttempted;
-
-    static void setWindowLayoutType(PopupWindow popupWindow, int layoutType) {
-        if (!sSetWindowLayoutTypeMethodAttempted) {
-            try {
-                sSetWindowLayoutTypeMethod = PopupWindow.class.getDeclaredMethod(
-                        "setWindowLayoutType", int.class);
-                sSetWindowLayoutTypeMethod.setAccessible(true);
-            } catch (Exception e) {
-                // Reflection method fetch failed. Oh well.
-            }
-            sSetWindowLayoutTypeMethodAttempted = true;
-        }
-
-        if (sSetWindowLayoutTypeMethod != null) {
-            try {
-                sSetWindowLayoutTypeMethod.invoke(popupWindow, layoutType);
-            } catch (Exception e) {
-                // Reflection call failed. Oh well.
-            }
-        }
-    }
-
-    static int getWindowLayoutType(PopupWindow popupWindow) {
-        if (!sGetWindowLayoutTypeMethodAttempted) {
-            try {
-                sGetWindowLayoutTypeMethod = PopupWindow.class.getDeclaredMethod(
-                        "getWindowLayoutType");
-                sGetWindowLayoutTypeMethod.setAccessible(true);
-            } catch (Exception e) {
-                // Reflection method fetch failed. Oh well.
-            }
-            sGetWindowLayoutTypeMethodAttempted = true;
-        }
-
-        if (sGetWindowLayoutTypeMethod != null) {
-            try {
-                return (Integer) sGetWindowLayoutTypeMethod.invoke(popupWindow);
-            } catch (Exception e) {
-                // Reflection call failed. Oh well.
-            }
-        }
-        return 0;
-    }
-
-}
diff --git a/v4/gingerbread/android/support/v4/widget/ScrollerCompatGingerbread.java b/v4/gingerbread/android/support/v4/widget/ScrollerCompatGingerbread.java
deleted file mode 100644
index 61c9a03..0000000
--- a/v4/gingerbread/android/support/v4/widget/ScrollerCompatGingerbread.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-package android.support.v4.widget;
-
-import android.content.Context;
-import android.view.animation.Interpolator;
-import android.widget.OverScroller;
-
-class ScrollerCompatGingerbread {
-    public static Object createScroller(Context context, Interpolator interpolator) {
-        return interpolator != null ?
-                new OverScroller(context, interpolator) : new OverScroller(context);
-    }
-
-    public static boolean isFinished(Object scroller) {
-        return ((OverScroller) scroller).isFinished();
-    }
-
-    public static int getCurrX(Object scroller) {
-        return ((OverScroller) scroller).getCurrX();
-    }
-
-    public static int getCurrY(Object scroller) {
-        return ((OverScroller) scroller).getCurrY();
-    }
-
-    public static boolean computeScrollOffset(Object scroller) {
-        return ((OverScroller) scroller).computeScrollOffset();
-    }
-
-    public static void startScroll(Object scroller, int startX, int startY, int dx, int dy) {
-        ((OverScroller) scroller).startScroll(startX, startY, dx, dy);
-    }
-
-    public static void startScroll(Object scroller, int startX, int startY, int dx, int dy,
-            int duration) {
-        ((OverScroller) scroller).startScroll(startX, startY, dx, dy, duration);
-    }
-
-    public static void fling(Object scroller, int startX, int startY, int velX, int velY,
-            int minX, int maxX, int minY, int maxY) {
-        ((OverScroller) scroller).fling(startX, startY, velX, velY, minX, maxX, minY, maxY);
-    }
-
-    public static void fling(Object scroller, int startX, int startY, int velX, int velY,
-            int minX, int maxX, int minY, int maxY, int overX, int overY) {
-        ((OverScroller) scroller).fling(startX, startY, velX, velY,
-                minX, maxX, minY, maxY, overX, overY);
-    }
-
-    public static void abortAnimation(Object scroller) {
-        ((OverScroller) scroller).abortAnimation();
-    }
-
-    public static void notifyHorizontalEdgeReached(Object scroller, int startX, int finalX,
-            int overX) {
-        ((OverScroller) scroller).notifyHorizontalEdgeReached(startX, finalX, overX);
-    }
-
-    public static void notifyVerticalEdgeReached(Object scroller, int startY, int finalY, int overY) {
-        ((OverScroller) scroller).notifyVerticalEdgeReached(startY, finalY, overY);
-    }
-
-    public static boolean isOverScrolled(Object scroller) {
-        return ((OverScroller) scroller).isOverScrolled();
-    }
-
-    public static int getFinalX(Object scroller) {
-        return ((OverScroller) scroller).getFinalX();
-    }
-
-    public static int getFinalY(Object scroller) {
-        return ((OverScroller) scroller).getFinalY();
-    }
-
-    public static boolean springBack(Object scroller, int startX, int startY, int minX, int maxX,
-            int minY, int maxY) {
-        return ((OverScroller) scroller).springBack(startX, startY, minX, maxX, minY, maxY);
-    }
-}
diff --git a/v4/honeycomb/android/support/v4/app/BaseFragmentActivityHoneycomb.java b/v4/honeycomb/android/support/v4/app/BaseFragmentActivityHoneycomb.java
deleted file mode 100644
index 10e6a79..0000000
--- a/v4/honeycomb/android/support/v4/app/BaseFragmentActivityHoneycomb.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.v4.app;
-
-import android.content.Context;
-import android.os.Build;
-import android.util.AttributeSet;
-import android.view.View;
-
-/**
- * Base class for {@code FragmentActivity} to be able to use v11 APIs.
- *
- * @hide
- */
-abstract class BaseFragmentActivityHoneycomb extends BaseFragmentActivityEclair {
-
-    @Override
-    public View onCreateView(View parent, String name, Context context, AttributeSet attrs) {
-        final View v = dispatchFragmentsOnCreateView(parent, name, context, attrs);
-        if (v == null && Build.VERSION.SDK_INT >= 11) {
-            // If we're running on HC or above, let the super have a go
-            return super.onCreateView(parent, name, context, attrs);
-        }
-        return v;
-    }
-
-}
diff --git a/v4/honeycomb/android/support/v4/graphics/drawable/DrawableWrapperHoneycomb.java b/v4/honeycomb/android/support/v4/graphics/drawable/DrawableWrapperHoneycomb.java
deleted file mode 100644
index d37ba97..0000000
--- a/v4/honeycomb/android/support/v4/graphics/drawable/DrawableWrapperHoneycomb.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.v4.graphics.drawable;
-
-import android.content.res.Resources;
-import android.graphics.drawable.Drawable;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-
-class DrawableWrapperHoneycomb extends DrawableWrapperDonut {
-
-    DrawableWrapperHoneycomb(Drawable drawable) {
-        super(drawable);
-    }
-
-    DrawableWrapperHoneycomb(DrawableWrapperState state, Resources resources) {
-        super(state, resources);
-    }
-
-    @Override
-    public void jumpToCurrentState() {
-        mDrawable.jumpToCurrentState();
-    }
-
-    @NonNull
-    @Override
-    DrawableWrapperState mutateConstantState() {
-        return new DrawableWrapperStateHoneycomb(mState, null);
-    }
-
-    private static class DrawableWrapperStateHoneycomb extends DrawableWrapperState {
-        DrawableWrapperStateHoneycomb(@Nullable DrawableWrapperState orig,
-                @Nullable Resources res) {
-            super(orig, res);
-        }
-
-        @Override
-        public Drawable newDrawable(@Nullable Resources res) {
-            return new DrawableWrapperHoneycomb(this, res);
-        }
-    }
-}
diff --git a/v4/ics-mr1/android/support/v4/speech/tts/TextToSpeechICSMR1.java b/v4/ics-mr1/android/support/v4/speech/tts/TextToSpeechICSMR1.java
deleted file mode 100644
index bbad4c1..0000000
--- a/v4/ics-mr1/android/support/v4/speech/tts/TextToSpeechICSMR1.java
+++ /dev/null
@@ -1,74 +0,0 @@
-package android.support.v4.speech.tts;
-
-import android.speech.tts.TextToSpeech;
-import android.speech.tts.UtteranceProgressListener;
-import android.speech.tts.TextToSpeech.OnUtteranceCompletedListener;
-
-import java.util.Locale;
-import java.util.Set;
-
-/** Helper class for TTS functionality introduced in ICS MR1 */
-class TextToSpeechICSMR1 {
-    /**
-     * Call {@link TextToSpeech#getFeatures} if available.
-     *
-     * @return {@link TextToSpeech#getFeatures} or null on older devices.
-     */
-    static Set<String> getFeatures(TextToSpeech tts, Locale locale) {
-        if (android.os.Build.VERSION.SDK_INT >=
-                android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) {
-            return tts.getFeatures(locale);
-        }
-        return null;
-    }
-
-    public static final String KEY_FEATURE_EMBEDDED_SYNTHESIS = "embeddedTts";
-    public static final String KEY_FEATURE_NETWORK_SYNTHESIS = "networkTts";
-
-    static interface UtteranceProgressListenerICSMR1 {
-        void onDone(String utteranceId);
-        void onError(String utteranceId);
-        void onStart(String utteranceId);
-    }
-
-    /**
-     * Call {@link TextToSpeech#setOnUtteranceProgressListener} if ICS-MR1 or newer.
-     *
-     * On pre ICS-MR1 devices,{@link TextToSpeech#setOnUtteranceCompletedListener} is
-     * used to emulate its behavior - at the end of synthesis we call
-     * {@link UtteranceProgressListenerICSMR1#onStart(String)} and
-     * {@link UtteranceProgressListenerICSMR1#onDone(String)} one after the other.
-     * Errors can't be detected.
-     */
-    static void setUtteranceProgressListener(TextToSpeech tts,
-            final UtteranceProgressListenerICSMR1 listener) {
-        if (android.os.Build.VERSION.SDK_INT >=
-                android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) {
-            tts.setOnUtteranceProgressListener(new UtteranceProgressListener() {
-                @Override
-                public void onStart(String utteranceId) {
-                    listener.onStart(utteranceId);
-                }
-
-                @Override
-                public void onError(String utteranceId) {
-                    listener.onError(utteranceId);
-                }
-
-                @Override
-                public void onDone(String utteranceId) {
-                    listener.onDone(utteranceId);
-                }
-            });
-        } else {
-            tts.setOnUtteranceCompletedListener(new OnUtteranceCompletedListener() {
-                @Override
-                public void onUtteranceCompleted(String utteranceId) {
-                    // Emulate onStart. Clients are expecting it will happen.
-                    listener.onStart(utteranceId);
-                    listener.onDone(utteranceId);
-                }
-            });
-        }
-    }
-}
diff --git a/v4/ics/android/support/v4/speech/tts/TextToSpeechICS.java b/v4/ics/android/support/v4/speech/tts/TextToSpeechICS.java
deleted file mode 100644
index 4e0c041..0000000
--- a/v4/ics/android/support/v4/speech/tts/TextToSpeechICS.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package android.support.v4.speech.tts;
-
-import android.content.Context;
-import android.os.Build;
-import android.speech.tts.TextToSpeech;
-import android.speech.tts.TextToSpeech.OnInitListener;
-import android.util.Log;
-
-/** Helper class for TTS functionality introduced in ICS */
-class TextToSpeechICS {
-    private static final String TAG = "android.support.v4.speech.tts";
-
-    static TextToSpeech construct(Context context, OnInitListener onInitListener,
-            String engineName) {
-        if (Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
-            if (engineName == null) {
-                return new TextToSpeech(context, onInitListener);
-            } else {
-                Log.w(TAG, "Can't specify tts engine on this device");
-                return new TextToSpeech(context, onInitListener);
-            }
-        } else {
-            return new TextToSpeech(context, onInitListener, engineName);
-        }
-    }
-
-}
diff --git a/v4/ics/android/support/v4/view/accessibility/AccessibilityNodeInfoCompatIcs.java b/v4/ics/android/support/v4/view/accessibility/AccessibilityNodeInfoCompatIcs.java
deleted file mode 100644
index 367f995..0000000
--- a/v4/ics/android/support/v4/view/accessibility/AccessibilityNodeInfoCompatIcs.java
+++ /dev/null
@@ -1,219 +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 android.support.v4.view.accessibility;
-
-import android.graphics.Rect;
-import android.view.View;
-import android.view.accessibility.AccessibilityNodeInfo;
-
-import java.util.List;
-
-/**
- * ICS specific AccessibilityNodeInfo API implementation.
- */
-class AccessibilityNodeInfoCompatIcs {
-
-    public static Object obtain() {
-        return AccessibilityNodeInfo.obtain();
-    }
-
-    public static Object obtain(View source) {
-        return AccessibilityNodeInfo.obtain(source);
-    }
-
-    public static Object obtain(Object info) {
-        return AccessibilityNodeInfo.obtain((AccessibilityNodeInfo) info);
-    }
-
-    public static void addAction(Object info, int action) {
-        ((AccessibilityNodeInfo) info).addAction(action);
-    }
-
-    public static void addChild(Object info, View child) {
-        ((AccessibilityNodeInfo) info).addChild(child);
-    }
-
-    @SuppressWarnings("unchecked")
-    public static List<Object> findAccessibilityNodeInfosByText(Object info, String text) {
-        Object result = ((AccessibilityNodeInfo) info).findAccessibilityNodeInfosByText(text);
-        return (List<Object>) result;
-    }
-
-    public static int getActions(Object info) {
-        return ((AccessibilityNodeInfo) info).getActions();
-    }
-
-    public static void getBoundsInParent(Object info, Rect outBounds) {
-        ((AccessibilityNodeInfo) info).getBoundsInParent(outBounds);
-    }
-
-    public static void getBoundsInScreen(Object info, Rect outBounds) {
-        ((AccessibilityNodeInfo) info).getBoundsInScreen(outBounds);
-    }
-
-    public static Object getChild(Object info, int index) {
-        return ((AccessibilityNodeInfo) info).getChild(index);
-    }
-
-    public static int getChildCount(Object info) {
-        return ((AccessibilityNodeInfo) info).getChildCount();
-    }
-
-    public static CharSequence getClassName(Object info) {
-        return ((AccessibilityNodeInfo) info).getClassName();
-    }
-
-    public static CharSequence getContentDescription(Object info) {
-        return ((AccessibilityNodeInfo) info).getContentDescription();
-    }
-
-    public static CharSequence getPackageName(Object info) {
-        return ((AccessibilityNodeInfo) info).getPackageName();
-    }
-
-    public static Object getParent(Object info) {
-        return ((AccessibilityNodeInfo) info).getParent();
-    }
-
-    public static CharSequence getText(Object info) {
-        return ((AccessibilityNodeInfo) info).getText();
-    }
-
-    public static int getWindowId(Object info) {
-        return ((AccessibilityNodeInfo) info).getWindowId();
-    }
-
-    public static boolean isCheckable(Object info) {
-        return ((AccessibilityNodeInfo) info).isCheckable();
-    }
-
-    public static boolean isChecked(Object info) {
-        return ((AccessibilityNodeInfo) info).isChecked();
-    }
-
-    public static boolean isClickable(Object info) {
-        return ((AccessibilityNodeInfo) info).isClickable();
-    }
-
-    public static boolean isEnabled(Object info) {
-        return ((AccessibilityNodeInfo) info).isEnabled();
-    }
-
-    public static boolean isFocusable(Object info) {
-        return ((AccessibilityNodeInfo) info).isFocusable();
-    }
-
-    public static boolean isFocused(Object info) {
-        return ((AccessibilityNodeInfo) info).isFocused();
-    }
-
-    public static boolean isLongClickable(Object info) {
-        return ((AccessibilityNodeInfo) info).isLongClickable();
-    }
-
-    public static boolean isPassword(Object info) {
-        return ((AccessibilityNodeInfo) info).isPassword();
-    }
-
-    public static boolean isScrollable(Object info) {
-        return ((AccessibilityNodeInfo) info).isScrollable();
-    }
-
-    public static boolean isSelected(Object info) {
-        return ((AccessibilityNodeInfo) info).isSelected();
-    }
-
-    public static boolean performAction(Object info, int action) {
-        return ((AccessibilityNodeInfo) info).performAction(action);
-    }
-
-    public static void setBoundsInParent(Object info, Rect bounds) {
-        ((AccessibilityNodeInfo) info).setBoundsInParent(bounds);
-    }
-
-    public static void setBoundsInScreen(Object info, Rect bounds) {
-        ((AccessibilityNodeInfo) info).setBoundsInScreen(bounds);
-    }
-
-    public static void setCheckable(Object info, boolean checkable) {
-        ((AccessibilityNodeInfo) info).setCheckable(checkable);
-    }
-
-    public static void setChecked(Object info, boolean checked) {
-        ((AccessibilityNodeInfo) info).setChecked(checked);
-    }
-
-    public static void setClassName(Object info, CharSequence className) {
-        ((AccessibilityNodeInfo) info).setClassName(className);
-    }
-
-    public static void setClickable(Object info, boolean clickable) {
-        ((AccessibilityNodeInfo) info).setClickable(clickable);
-    }
-
-    public static void setContentDescription(Object info, CharSequence contentDescription) {
-        ((AccessibilityNodeInfo) info).setContentDescription(contentDescription);
-    }
-
-    public static void setEnabled(Object info, boolean enabled) {
-        ((AccessibilityNodeInfo) info).setEnabled(enabled);
-    }
-
-    public static void setFocusable(Object info, boolean focusable) {
-        ((AccessibilityNodeInfo) info).setFocusable(focusable);
-    }
-
-    public static void setFocused(Object info, boolean focused) {
-        ((AccessibilityNodeInfo) info).setFocused(focused);
-    }
-
-    public static void setLongClickable(Object info, boolean longClickable) {
-        ((AccessibilityNodeInfo) info).setLongClickable(longClickable);
-    }
-
-    public static void setPackageName(Object info, CharSequence packageName) {
-        ((AccessibilityNodeInfo) info).setPackageName(packageName);
-    }
-
-    public static void setParent(Object info, View parent) {
-        ((AccessibilityNodeInfo) info).setParent(parent);
-    }
-
-    public static void setPassword(Object info, boolean password) {
-        ((AccessibilityNodeInfo) info).setPassword(password);
-    }
-
-    public static void setScrollable(Object info, boolean scrollable) {
-        ((AccessibilityNodeInfo) info).setScrollable(scrollable);
-    }
-
-    public static void setSelected(Object info, boolean selected) {
-        ((AccessibilityNodeInfo) info).setSelected(selected);
-    }
-
-    public static void setSource(Object info, View source) {
-        ((AccessibilityNodeInfo) info).setSource(source);
-    }
-
-    public static void setText(Object info, CharSequence text) {
-        ((AccessibilityNodeInfo) info).setText(text);
-    }
-
-    public static void recycle(Object info) {
-        ((AccessibilityNodeInfo) info).recycle();
-    }
-}
diff --git a/v4/java/android/support/v4/accessibilityservice/AccessibilityServiceInfoCompat.java b/v4/java/android/support/v4/accessibilityservice/AccessibilityServiceInfoCompat.java
deleted file mode 100644
index 3de3631..0000000
--- a/v4/java/android/support/v4/accessibilityservice/AccessibilityServiceInfoCompat.java
+++ /dev/null
@@ -1,449 +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 android.support.v4.accessibilityservice;
-
-import android.accessibilityservice.AccessibilityService;
-import android.accessibilityservice.AccessibilityServiceInfo;
-import android.content.pm.ResolveInfo;
-import android.os.Build;
-import android.view.View;
-
-/**
- * Helper for accessing features in {@link android.accessibilityservice.AccessibilityService}
- * introduced after API level 4 in a backwards compatible fashion.
- */
-public final class AccessibilityServiceInfoCompat {
-
-    static interface AccessibilityServiceInfoVersionImpl {
-        public String getId(AccessibilityServiceInfo info);
-        public ResolveInfo getResolveInfo(AccessibilityServiceInfo info);
-        public boolean getCanRetrieveWindowContent(AccessibilityServiceInfo info);
-        public String getDescription(AccessibilityServiceInfo info);
-        public String getSettingsActivityName(AccessibilityServiceInfo info);
-        public int getCapabilities(AccessibilityServiceInfo info);
-    }
-
-    static class AccessibilityServiceInfoStubImpl implements AccessibilityServiceInfoVersionImpl {
-
-        public boolean getCanRetrieveWindowContent(AccessibilityServiceInfo info) {
-            return false;
-        }
-
-        public String getDescription(AccessibilityServiceInfo info) {
-            return null;
-        }
-
-        public String getId(AccessibilityServiceInfo info) {
-            return null;
-        }
-
-        public ResolveInfo getResolveInfo(AccessibilityServiceInfo info) {
-            return null;
-        }
-
-        public String getSettingsActivityName(AccessibilityServiceInfo info) {
-            return null;
-        }
-
-        public int getCapabilities(AccessibilityServiceInfo info) {
-            return 0;
-        }
-    }
-
-    static class AccessibilityServiceInfoIcsImpl extends AccessibilityServiceInfoStubImpl {
-
-        @Override
-        public boolean getCanRetrieveWindowContent(AccessibilityServiceInfo info) {
-            return AccessibilityServiceInfoCompatIcs.getCanRetrieveWindowContent(info);
-        }
-
-        @Override
-        public String getDescription(AccessibilityServiceInfo info) {
-            return AccessibilityServiceInfoCompatIcs.getDescription(info);
-        }
-
-        @Override
-        public String getId(AccessibilityServiceInfo info) {
-            return AccessibilityServiceInfoCompatIcs.getId(info);
-        }
-
-        @Override
-        public ResolveInfo getResolveInfo(AccessibilityServiceInfo info) {
-            return AccessibilityServiceInfoCompatIcs.getResolveInfo(info);
-        }
-
-        @Override
-        public String getSettingsActivityName(AccessibilityServiceInfo info) {
-            return AccessibilityServiceInfoCompatIcs.getSettingsActivityName(info);
-        }
-
-        @Override
-        public int getCapabilities(AccessibilityServiceInfo info) {
-            if (getCanRetrieveWindowContent(info)) {
-                return CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT;
-            }
-            return 0;
-        }
-    }
-
-    static class AccessibilityServiceInfoJellyBeanMr2 extends AccessibilityServiceInfoIcsImpl {
-        @Override
-        public int getCapabilities(AccessibilityServiceInfo info) {
-            return AccessibilityServiceInfoCompatJellyBeanMr2.getCapabilities(info);
-        }
-    }
-
-    static {
-        if (Build.VERSION.SDK_INT >= 18) { // JellyBean MR2
-            IMPL = new AccessibilityServiceInfoJellyBeanMr2();
-        } else if (Build.VERSION.SDK_INT >= 14) { // ICS
-            IMPL = new AccessibilityServiceInfoIcsImpl();
-        } else {
-            IMPL = new AccessibilityServiceInfoStubImpl();
-        }
-    }
-
-    // Capabilities
-
-    private static final AccessibilityServiceInfoVersionImpl IMPL;
-
-    /**
-     * Capability: This accessibility service can retrieve the active window content.
-     */
-    public static final int CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT = 0x00000001;
-
-    /**
-     * Capability: This accessibility service can request touch exploration mode in which
-     * touched items are spoken aloud and the UI can be explored via gestures.
-     */
-    public static final int CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION = 0x00000002;
-
-    /**
-     * Capability: This accessibility service can request enhanced web accessibility
-     * enhancements. For example, installing scripts to make app content more accessible.
-     */
-    public static final int CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 0x00000004;
-
-    /**
-     * Capability: This accessibility service can filter the key event stream.
-     */
-    public static final int CAPABILITY_CAN_FILTER_KEY_EVENTS = 0x00000008;
-
-    // Feedback types
-
-    /**
-     * Denotes braille feedback.
-     */
-    public static final int FEEDBACK_BRAILLE = 0x0000020;
-
-    /**
-     * Mask for all feedback types.
-     *
-     * @see AccessibilityServiceInfo#FEEDBACK_SPOKEN
-     * @see AccessibilityServiceInfo#FEEDBACK_HAPTIC
-     * @see AccessibilityServiceInfo#FEEDBACK_AUDIBLE
-     * @see AccessibilityServiceInfo#FEEDBACK_VISUAL
-     * @see AccessibilityServiceInfo#FEEDBACK_GENERIC
-     * @see FEEDBACK_BRAILLE
-     */
-    public static final int FEEDBACK_ALL_MASK = 0xFFFFFFFF;
-
-    // Flags
-
-    /**
-     * If an {@link AccessibilityService} is the default for a given type.
-     * Default service is invoked only if no package specific one exists. In case of
-     * more than one package specific service only the earlier registered is notified.
-     */
-    public static final int DEFAULT = 0x0000001;
-
-    /**
-     * If this flag is set the system will regard views that are not important
-     * for accessibility in addition to the ones that are important for accessibility.
-     * That is, views that are marked as not important for accessibility via
-     * {@link View#IMPORTANT_FOR_ACCESSIBILITY_NO} or
-     * {@link View#IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS} and views that are
-     * marked as potentially important for accessibility via
-     * {@link View#IMPORTANT_FOR_ACCESSIBILITY_AUTO} for which the system has determined
-     * that are not important for accessibility, are both reported while querying the
-     * window content and also the accessibility service will receive accessibility events
-     * from them.
-     * <p>
-     * <strong>Note:</strong> For accessibility services targeting API version
-     * {@link Build.VERSION_CODES#JELLY_BEAN} or higher this flag has to be explicitly
-     * set for the system to regard views that are not important for accessibility. For
-     * accessibility services targeting API version lower than
-     * {@link Build.VERSION_CODES#JELLY_BEAN} this flag is ignored and all views are
-     * regarded for accessibility purposes.
-     * </p>
-     * <p>
-     * Usually views not important for accessibility are layout managers that do not
-     * react to user actions, do not draw any content, and do not have any special
-     * semantics in the context of the screen content. For example, a three by three
-     * grid can be implemented as three horizontal linear layouts and one vertical,
-     * or three vertical linear layouts and one horizontal, or one grid layout, etc.
-     * In this context the actual layout mangers used to achieve the grid configuration
-     * are not important, rather it is important that there are nine evenly distributed
-     * elements.
-     * </p>
-     */
-    public static final int FLAG_INCLUDE_NOT_IMPORTANT_VIEWS = 0x0000002;
-
-    /**
-     * This flag requests that the system gets into touch exploration mode.
-     * In this mode a single finger moving on the screen behaves as a mouse
-     * pointer hovering over the user interface. The system will also detect
-     * certain gestures performed on the touch screen and notify this service.
-     * The system will enable touch exploration mode if there is at least one
-     * accessibility service that has this flag set. Hence, clearing this
-     * flag does not guarantee that the device will not be in touch exploration
-     * mode since there may be another enabled service that requested it.
-     * <p>
-     * For accessibility services targeting API version higher than
-     * {@link Build.VERSION_CODES#JELLY_BEAN_MR1} that want to set
-     * this flag have to declare this capability in their meta-data by setting
-     * the attribute canRequestTouchExplorationMode to true, otherwise this flag
-     * will be ignored. For how to declare the meta-data of a service refer to
-     * {@value AccessibilityService#SERVICE_META_DATA}.
-     * </p>
-     * <p>
-     * Services targeting API version equal to or lower than
-     * {@link Build.VERSION_CODES#JELLY_BEAN_MR1} will work normally, i.e.
-     * the first time they are run, if this flag is specified, a dialog is
-     * shown to the user to confirm enabling explore by touch.
-     * </p>
-     */
-    public static final int FLAG_REQUEST_TOUCH_EXPLORATION_MODE = 0x0000004;
-
-    /**
-     * This flag requests from the system to enable web accessibility enhancing
-     * extensions. Such extensions aim to provide improved accessibility support
-     * for content presented in a {@link android.webkit.WebView}. An example of such
-     * an extension is injecting JavaScript from a secure source. The system will enable
-     * enhanced web accessibility if there is at least one accessibility service
-     * that has this flag set. Hence, clearing this flag does not guarantee that the
-     * device will not have enhanced web accessibility enabled since there may be
-     * another enabled service that requested it.
-     * <p>
-     * Services that want to set this flag have to declare this capability
-     * in their meta-data by setting the attribute canRequestEnhancedWebAccessibility
-     * to true, otherwise this flag will be ignored. For how to declare the meta-data
-     * of a service refer to {@value AccessibilityService#SERVICE_META_DATA}.
-     * </p>
-     */
-    public static final int FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 0x00000008;
-
-    /**
-     * This flag requests that the AccessibilityNodeInfos obtained
-     * by an {@link AccessibilityService} contain the id of the source view.
-     * The source view id will be a fully qualified resource name of the
-     * form "package:id/name", for example "foo.bar:id/my_list", and it is
-     * useful for UI test automation. This flag is not set by default.
-     */
-    public static final int FLAG_REPORT_VIEW_IDS = 0x00000010;
-
-    /**
-     * This flag requests from the system to filter key events. If this flag
-     * is set the accessibility service will receive the key events before
-     * applications allowing it implement global shortcuts. Setting this flag
-     * does not guarantee that this service will filter key events since only
-     * one service can do so at any given time. This avoids user confusion due
-     * to behavior change in case different key filtering services are enabled.
-     * If there is already another key filtering service enabled, this one will
-     * not receive key events.
-     * <p>
-     * Services that want to set this flag have to declare this capability
-     * in their meta-data by setting the attribute canRequestFilterKeyEvents
-     * to true, otherwise this flag will be ignored. For how to declare the meta
-     * -data of a service refer to {@value AccessibilityService#SERVICE_META_DATA}.
-     * </p>
-     */
-    public static final int FLAG_REQUEST_FILTER_KEY_EVENTS = 0x00000020;
-
-    /*
-     * Hide constructor
-     */
-    private AccessibilityServiceInfoCompat() {}
-
-    /**
-     * The accessibility service id.
-     * <p>
-     * <strong>Generated by the system.</strong>
-     * </p>
-     *
-     * @return The id.
-     */
-    public static String getId(AccessibilityServiceInfo info) {
-        return IMPL.getId(info);
-    }
-
-    /**
-     * The service {@link ResolveInfo}.
-     * <p>
-     * <strong>Generated by the system.</strong>
-     * </p>
-     *
-     * @return The info.
-     */
-    public static ResolveInfo getResolveInfo(AccessibilityServiceInfo info) {
-        return IMPL.getResolveInfo(info);
-    }
-
-    /**
-     * The settings activity name.
-     * <p>
-     * <strong>Statically set from {@link AccessibilityService#SERVICE_META_DATA
-     * meta-data}.</strong>
-     * </p>
-     *
-     * @return The settings activity name.
-     */
-    public static String getSettingsActivityName(AccessibilityServiceInfo info) {
-        return IMPL.getSettingsActivityName(info);
-    }
-
-    /**
-     * Whether this service can retrieve the current window's content.
-     * <p>
-     * <strong>Statically set from {@link AccessibilityService#SERVICE_META_DATA
-     * meta-data}.</strong>
-     * </p>
-     *
-     * @return True window content can be retrieved.
-     */
-    public static boolean getCanRetrieveWindowContent(AccessibilityServiceInfo info) {
-        return IMPL.getCanRetrieveWindowContent(info);
-    }
-
-    /**
-     * Description of the accessibility service.
-     * <p>
-     * <strong>Statically set from {@link AccessibilityService#SERVICE_META_DATA
-     * meta-data}.</strong>
-     * </p>
-     *
-     * @return The description.
-     */
-    public static String getDescription(AccessibilityServiceInfo info) {
-        return IMPL.getDescription(info);
-    }
-
-    /**
-     * Returns the string representation of a feedback type. For example,
-     * {@link AccessibilityServiceInfo#FEEDBACK_SPOKEN} is represented by the
-     * string FEEDBACK_SPOKEN.
-     *
-     * @param feedbackType The feedback type.
-     * @return The string representation.
-     */
-    public static String feedbackTypeToString(int feedbackType) {
-        StringBuilder builder = new StringBuilder();
-        builder.append("[");
-        while (feedbackType > 0) {
-            final int feedbackTypeFlag = 1 << Integer.numberOfTrailingZeros(feedbackType);
-            feedbackType &= ~feedbackTypeFlag;
-            if (builder.length() > 1) {
-                builder.append(", ");
-            }
-            switch (feedbackTypeFlag) {
-                case AccessibilityServiceInfo.FEEDBACK_AUDIBLE:
-                    builder.append("FEEDBACK_AUDIBLE");
-                    break;
-                case AccessibilityServiceInfo.FEEDBACK_HAPTIC:
-                    builder.append("FEEDBACK_HAPTIC");
-                    break;
-                case AccessibilityServiceInfo.FEEDBACK_GENERIC:
-                    builder.append("FEEDBACK_GENERIC");
-                    break;
-                case AccessibilityServiceInfo.FEEDBACK_SPOKEN:
-                    builder.append("FEEDBACK_SPOKEN");
-                    break;
-                case AccessibilityServiceInfo.FEEDBACK_VISUAL:
-                    builder.append("FEEDBACK_VISUAL");
-                    break;
-            }
-        }
-        builder.append("]");
-        return builder.toString();
-    }
-
-    /**
-     * Returns the string representation of a flag. For example,
-     * {@link AccessibilityServiceInfo#DEFAULT} is represented by the
-     * string DEFAULT.
-     *
-     * @param flag The flag.
-     * @return The string representation.
-     */
-    public static String flagToString(int flag) {
-        switch (flag) {
-            case DEFAULT:
-                return "DEFAULT";
-            case FLAG_INCLUDE_NOT_IMPORTANT_VIEWS:
-                return "FLAG_INCLUDE_NOT_IMPORTANT_VIEWS";
-            case FLAG_REQUEST_TOUCH_EXPLORATION_MODE:
-                return "FLAG_REQUEST_TOUCH_EXPLORATION_MODE";
-            case FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY:
-                return "FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY";
-            case FLAG_REPORT_VIEW_IDS:
-                return "FLAG_REPORT_VIEW_IDS";
-            case FLAG_REQUEST_FILTER_KEY_EVENTS:
-                return "FLAG_REQUEST_FILTER_KEY_EVENTS";
-            default:
-                return null;
-        }
-    }
-
-    /**
-     * Returns the bit mask of capabilities this accessibility service has such as
-     * being able to retrieve the active window content, etc.
-     *
-     * @param info The service info whose capabilities to get.
-     * @return The capability bit mask.
-     *
-     * @see #CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT
-     * @see #CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION
-     * @see #CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY
-     * @see #CAPABILITY_CAN_FILTER_KEY_EVENTS
-     */
-    public static int getCapabilities(AccessibilityServiceInfo info) {
-        return IMPL.getCapabilities(info);
-    }
-
-    /**
-     * Returns the string representation of a capability. For example,
-     * {@link #CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT} is represented
-     * by the string CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT.
-     *
-     * @param capability The capability.
-     * @return The string representation.
-     */
-    public static String capabilityToString(int capability) {
-        switch (capability) {
-            case CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT:
-                return "CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT";
-            case CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION:
-                return "CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION";
-            case CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY:
-                return "CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY";
-            case CAPABILITY_CAN_FILTER_KEY_EVENTS:
-                return "CAPABILITY_CAN_FILTER_KEY_EVENTS";
-            default:
-                return "UNKNOWN";
-        }
-    }
-}
diff --git a/v4/java/android/support/v4/animation/AnimatorCompatHelper.java b/v4/java/android/support/v4/animation/AnimatorCompatHelper.java
deleted file mode 100644
index 6ebe5c8..0000000
--- a/v4/java/android/support/v4/animation/AnimatorCompatHelper.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.v4.animation;
-
-import android.os.Build;
-import android.view.View;
-
-/**
- * @hide
- */
-public final class AnimatorCompatHelper {
-
-    private final static AnimatorProvider IMPL;
-
-    static {
-        if (Build.VERSION.SDK_INT >= 12) {
-            IMPL = new HoneycombMr1AnimatorCompatProvider();
-        } else {
-            IMPL = new DonutAnimatorCompatProvider();
-        }
-    }
-
-    public static ValueAnimatorCompat emptyValueAnimator() {
-        return IMPL.emptyValueAnimator();
-    }
-
-    private AnimatorCompatHelper() {}
-
-    public static void clearInterpolator(View view) {
-        IMPL.clearInterpolator(view);
-    }
-}
diff --git a/v4/java/android/support/v4/app/ActivityCompat.java b/v4/java/android/support/v4/app/ActivityCompat.java
deleted file mode 100644
index 9d6e940..0000000
--- a/v4/java/android/support/v4/app/ActivityCompat.java
+++ /dev/null
@@ -1,467 +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 android.support.v4.app;
-
-import android.app.Activity;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentSender;
-import android.content.pm.PackageManager;
-import android.graphics.Matrix;
-import android.graphics.RectF;
-import android.net.Uri;
-import android.os.Build;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.Looper;
-import android.os.Parcelable;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.v4.content.ContextCompat;
-import android.view.View;
-
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Helper for accessing features in {@link android.app.Activity}
- * introduced after API level 4 in a backwards compatible fashion.
- */
-public class ActivityCompat extends ContextCompat {
-
-    /**
-     * This interface is the contract for receiving the results for permission requests.
-     */
-    public interface OnRequestPermissionsResultCallback {
-
-        /**
-         * Callback for the result from requesting permissions. This method
-         * is invoked for every call on {@link #requestPermissions(android.app.Activity,
-         * String[], int)}.
-         * <p>
-         * <strong>Note:</strong> It is possible that the permissions request interaction
-         * with the user is interrupted. In this case you will receive empty permissions
-         * and results arrays which should be treated as a cancellation.
-         * </p>
-         *
-         * @param requestCode The request code passed in {@link #requestPermissions(
-         * android.app.Activity, String[], int)}
-         * @param permissions The requested permissions. Never null.
-         * @param grantResults The grant results for the corresponding permissions
-         *     which is either {@link android.content.pm.PackageManager#PERMISSION_GRANTED}
-         *     or {@link android.content.pm.PackageManager#PERMISSION_DENIED}. Never null.
-         *
-         * @see #requestPermissions(android.app.Activity, String[], int)
-         */
-        public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
-                @NonNull int[] grantResults);
-    }
-
-    /**
-     * Invalidate the activity's options menu, if able.
-     *
-     * <p>Before API level 11 (Android 3.0/Honeycomb) the lifecycle of the
-     * options menu was controlled primarily by the user's operation of
-     * the hardware menu key. When the user presses down on the menu key
-     * for the first time the menu was created and prepared by calls
-     * to {@link Activity#onCreateOptionsMenu(android.view.Menu)} and
-     * {@link Activity#onPrepareOptionsMenu(android.view.Menu)} respectively.
-     * Subsequent presses of the menu key kept the existing instance of the
-     * Menu itself and called {@link Activity#onPrepareOptionsMenu(android.view.Menu)}
-     * to give the activity an opportunity to contextually alter the menu
-     * before the menu panel was shown.</p>
-     *
-     * <p>In Android 3.0+ the Action Bar forces the options menu to be built early
-     * so that items chosen to show as actions may be displayed when the activity
-     * first becomes visible. The Activity method invalidateOptionsMenu forces
-     * the entire menu to be destroyed and recreated from
-     * {@link Activity#onCreateOptionsMenu(android.view.Menu)}, offering a similar
-     * though heavier-weight opportunity to change the menu's contents. Normally
-     * this functionality is used to support a changing configuration of Fragments.</p>
-     *
-     * <p>Applications may use this support helper to signal a significant change in
-     * activity state that should cause the options menu to be rebuilt. If the app
-     * is running on an older platform version that does not support menu invalidation
-     * the app will still receive {@link Activity#onPrepareOptionsMenu(android.view.Menu)}
-     * the next time the user presses the menu key and this method will return false.
-     * If this method returns true the options menu was successfully invalidated.</p>
-     *
-     * @param activity Invalidate the options menu of this activity
-     * @return true if this operation was supported and it completed; false if it was not available.
-     */
-    public static boolean invalidateOptionsMenu(Activity activity) {
-        if (Build.VERSION.SDK_INT >= 11) {
-            ActivityCompatHoneycomb.invalidateOptionsMenu(activity);
-            return true;
-        }
-        return false;
-    }
-
-    /**
-     * Start an activity with additional launch information, if able.
-     *
-     * <p>In Android 4.1+ additional options were introduced to allow for more
-     * control on activity launch animations. Applications can use this method
-     * along with {@link ActivityOptionsCompat} to use these animations when
-     * available. When run on versions of the platform where this feature does
-     * not exist the activity will be launched normally.</p>
-     *
-     * @param activity Context to launch activity from.
-     * @param intent The description of the activity to start.
-     * @param options Additional options for how the Activity should be started.
-     *                May be null if there are no options. See
-     *                {@link ActivityOptionsCompat} for how to build the Bundle
-     *                supplied here; there are no supported definitions for
-     *                building it manually.
-     */
-    public static void startActivity(Activity activity, Intent intent, @Nullable Bundle options) {
-        if (Build.VERSION.SDK_INT >= 16) {
-            ActivityCompatJB.startActivity(activity, intent, options);
-        } else {
-            activity.startActivity(intent);
-        }
-    }
-
-    /**
-     * Start new activity with options, if able, for which you would like a
-     * result when it finished.
-     *
-     * <p>In Android 4.1+ additional options were introduced to allow for more
-     * control on activity launch animations. Applications can use this method
-     * along with {@link ActivityOptionsCompat} to use these animations when
-     * available. When run on versions of the platform where this feature does
-     * not exist the activity will be launched normally.</p>
-     *
-     * @param activity Origin activity to launch from.
-     * @param intent The description of the activity to start.
-     * @param requestCode If >= 0, this code will be returned in
-     *                   onActivityResult() when the activity exits.
-     * @param options Additional options for how the Activity should be started.
-     *                May be null if there are no options. See
-     *                {@link ActivityOptionsCompat} for how to build the Bundle
-     *                supplied here; there are no supported definitions for
-     *                building it manually.
-     */
-    public static void startActivityForResult(Activity activity, Intent intent, int requestCode,
-            @Nullable Bundle options) {
-        if (Build.VERSION.SDK_INT >= 16) {
-            ActivityCompatJB.startActivityForResult(activity, intent, requestCode, options);
-        } else {
-            activity.startActivityForResult(intent, requestCode);
-        }
-    }
-
-    /**
-     * Start new IntentSender with options, if able, for which you would like a
-     * result when it finished.
-     *
-     * <p>In Android 4.1+ additional options were introduced to allow for more
-     * control on activity launch animations. Applications can use this method
-     * along with {@link ActivityOptionsCompat} to use these animations when
-     * available. When run on versions of the platform where this feature does
-     * not exist the activity will be launched normally.</p>
-     *
-     * @param activity Origin activity to launch from.
-     * @param intent The IntentSender to launch.
-     * @param requestCode If >= 0, this code will be returned in
-     *                   onActivityResult() when the activity exits.
-     * @param fillInIntent If non-null, this will be provided as the
-     *                     intent parameter to {@link IntentSender#sendIntent}.
-     * @param flagsMask Intent flags in the original IntentSender that you
-     *                  would like to change.
-     * @param flagsValues Desired values for any bits set in <var>flagsMask</var>
-     * @param extraFlags Always set to 0.
-     * @param options Additional options for how the Activity should be started.
-     *                May be null if there are no options. See
-     *                {@link ActivityOptionsCompat} for how to build the Bundle
-     *                supplied here; there are no supported definitions for
-     *                building it manually.
-     */
-    public static void startIntentSenderForResult(Activity activity, IntentSender intent,
-            int requestCode, Intent fillInIntent, int flagsMask, int flagsValues,
-            int extraFlags, @Nullable Bundle options) throws IntentSender.SendIntentException {
-        if (Build.VERSION.SDK_INT >= 16) {
-            ActivityCompatJB.startIntentSenderForResult(activity, intent, requestCode, fillInIntent,
-                    flagsMask, flagsValues, extraFlags, options);
-        } else if (Build.VERSION.SDK_INT >= 5) {
-            ActivityCompatEclair.startIntentSenderForResult(activity, intent, requestCode,
-                    fillInIntent, flagsMask, flagsValues, extraFlags);
-        }
-    }
-
-    /**
-     * Finish this activity, and tries to finish all activities immediately below it
-     * in the current task that have the same affinity.
-     *
-     * <p>On Android 4.1+ calling this method will call through to the native version of this
-     * method. For other platforms {@link Activity#finish()} will be called instead.</p>
-     */
-    public static void finishAffinity(Activity activity) {
-        if (Build.VERSION.SDK_INT >= 16) {
-            ActivityCompatJB.finishAffinity(activity);
-        } else {
-            activity.finish();
-        }
-    }
-
-    /**
-     * Reverses the Activity Scene entry Transition and triggers the calling Activity
-     * to reverse its exit Transition. When the exit Transition completes,
-     * {@link Activity#finish()} is called. If no entry Transition was used, finish() is called
-     * immediately and the Activity exit Transition is run.
-     *
-     * <p>On Android 4.4 or lower, this method only finishes the Activity with no
-     * special exit transition.</p>
-     */
-    public static void finishAfterTransition(Activity activity) {
-        if (Build.VERSION.SDK_INT >= 21) {
-            ActivityCompat21.finishAfterTransition(activity);
-        } else {
-            activity.finish();
-        }
-    }
-
-    /**
-     * Backwards compatible implementation of {@link android.app.Activity#getReferrer()
-     * Activity.getReferrer}.  Uses the platform's implementation if available, otherwise
-     * only falls back to digging any explicitly specified referrer from the activity's intent.
-     */
-    public Uri getReferrer(Activity activity) {
-        if (Build.VERSION.SDK_INT >= 22) {
-            return ActivityCompat22.getReferrer(activity);
-        }
-        Intent intent = activity.getIntent();
-        Uri referrer = intent.getParcelableExtra("android.intent.extra.REFERRER");
-        if (referrer != null) {
-            return referrer;
-        }
-        String referrerName = intent.getStringExtra("android.intent.extra.REFERRER_NAME");
-        if (referrerName != null) {
-            return Uri.parse(referrerName);
-        }
-        return null;
-    }
-
-    /**
-     * When {@link android.app.ActivityOptions#makeSceneTransitionAnimation(Activity,
-     * android.view.View, String)} was used to start an Activity, <var>callback</var>
-     * will be called to handle shared elements on the <i>launched</i> Activity. This requires
-     * {@link android.view.Window#FEATURE_CONTENT_TRANSITIONS}.
-     *
-     * @param callback Used to manipulate shared element transitions on the launched Activity.
-     */
-    public static void setEnterSharedElementCallback(Activity activity,
-            SharedElementCallback callback) {
-        if (Build.VERSION.SDK_INT >= 21) {
-            ActivityCompat21.setEnterSharedElementCallback(activity, createCallback(callback));
-        }
-    }
-
-    /**
-     * When {@link android.app.ActivityOptions#makeSceneTransitionAnimation(Activity,
-     * android.view.View, String)} was used to start an Activity, <var>callback</var>
-     * will be called to handle shared elements on the <i>launching</i> Activity. Most
-     * calls will only come when returning from the started Activity.
-     * This requires {@link android.view.Window#FEATURE_CONTENT_TRANSITIONS}.
-     *
-     * @param callback Used to manipulate shared element transitions on the launching Activity.
-     */
-    public static void setExitSharedElementCallback(Activity activity,
-            SharedElementCallback callback) {
-        if (Build.VERSION.SDK_INT >= 21) {
-            ActivityCompat21.setExitSharedElementCallback(activity, createCallback(callback));
-        }
-    }
-
-    public static void postponeEnterTransition(Activity activity) {
-        if (Build.VERSION.SDK_INT >= 21) {
-            ActivityCompat21.postponeEnterTransition(activity);
-        }
-    }
-
-    public static void startPostponedEnterTransition(Activity activity) {
-        if (Build.VERSION.SDK_INT >= 21) {
-            ActivityCompat21.startPostponedEnterTransition(activity);
-        }
-    }
-
-    /**
-     * Requests permissions to be granted to this application. These permissions
-     * must be requested in your manifest, they should not be granted to your app,
-     * and they should have protection level {@link android.content.pm.PermissionInfo
-     * #PROTECTION_DANGEROUS dangerous}, regardless whether they are declared by
-     * the platform or a third-party app.
-     * <p>
-     * Normal permissions {@link android.content.pm.PermissionInfo#PROTECTION_NORMAL}
-     * are granted at install time if requested in the manifest. Signature permissions
-     * {@link android.content.pm.PermissionInfo#PROTECTION_SIGNATURE} are granted at
-     * install time if requested in the manifest and the signature of your app matches
-     * the signature of the app declaring the permissions.
-     * </p>
-     * <p>
-     * If your app does not have the requested permissions the user will be presented
-     * with UI for accepting them. After the user has accepted or rejected the
-     * requested permissions you will receive a callback reporting whether the
-     * permissions were granted or not. Your activity has to implement {@link
-     * android.support.v4.app.ActivityCompat.OnRequestPermissionsResultCallback}
-     * and the results of permission requests will be delivered to its {@link
-     * android.support.v4.app.ActivityCompat.OnRequestPermissionsResultCallback#onRequestPermissionsResult(
-     * int, String[], int[])} method.
-     * </p>
-     * <p>
-     * Note that requesting a permission does not guarantee it will be granted and
-     * your app should be able to run without having this permission.
-     * </p>
-     * <p>
-     * This method may start an activity allowing the user to choose which permissions
-     * to grant and which to reject. Hence, you should be prepared that your activity
-     * may be paused and resumed. Further, granting some permissions may require
-     * a restart of you application. In such a case, the system will recreate the
-     * activity stack before delivering the result to your onRequestPermissionsResult(
-     * int, String[], int[]).
-     * </p>
-     * <p>
-     * When checking whether you have a permission you should use {@link
-     * #checkSelfPermission(android.content.Context, String)}.
-     * </p>
-     * <p>
-     * Calling this API for permissions already granted to your app would show UI
-     * to the user to decided whether the app can still hold these permissions. This
-     * can be useful if the way your app uses the data guarded by the permissions
-     * changes significantly.
-     * </p>
-     *
-     * @param activity The target activity.
-     * @param permissions The requested permissions.
-     * @param requestCode Application specific request code to match with a result
-     *    reported to {@link OnRequestPermissionsResultCallback#onRequestPermissionsResult(
-     *    int, String[], int[])}.
-     *
-     * @see #checkSelfPermission(android.content.Context, String)
-     * @see #shouldShowRequestPermissionRationale(android.app.Activity, String)
-     */
-    public static void requestPermissions(final @NonNull Activity activity,
-            final @NonNull String[] permissions, final int requestCode) {
-        if (Build.VERSION.SDK_INT >= 23) {
-            ActivityCompatApi23.requestPermissions(activity, permissions, requestCode);
-        } else if (activity instanceof OnRequestPermissionsResultCallback) {
-            Handler handler = new Handler(Looper.getMainLooper());
-            handler.post(new Runnable() {
-                @Override
-                public void run() {
-                    final int[] grantResults = new int[permissions.length];
-
-                    PackageManager packageManager = activity.getPackageManager();
-                    String packageName = activity.getPackageName();
-
-                    final int permissionCount = permissions.length;
-                    for (int i = 0; i < permissionCount; i++) {
-                        grantResults[i] = packageManager.checkPermission(
-                                permissions[i], packageName);
-                    }
-
-                    ((OnRequestPermissionsResultCallback) activity).onRequestPermissionsResult(
-                            requestCode, permissions, grantResults);
-                }
-            });
-        }
-    }
-
-    /**
-     * Gets whether you should show UI with rationale for requesting a permission.
-     * You should do this only if you do not have the permission and the context in
-     * which the permission is requested does not clearly communicate to the user
-     * what would be the benefit from granting this permission.
-     * <p>
-     * For example, if you write a camera app, requesting the camera permission
-     * would be expected by the user and no rationale for why it is requested is
-     * needed. If however, the app needs location for tagging photos then a non-tech
-     * savvy user may wonder how location is related to taking photos. In this case
-     * you may choose to show UI with rationale of requesting this permission.
-     * </p>
-     *
-     * @param activity The target activity.
-     * @param permission A permission your app wants to request.
-     * @return Whether you can show permission rationale UI.
-     *
-     * @see #checkSelfPermission(android.content.Context, String)
-     * @see #requestPermissions(android.app.Activity, String[], int)
-     */
-    public static boolean shouldShowRequestPermissionRationale(@NonNull Activity activity,
-            @NonNull String permission) {
-        if (Build.VERSION.SDK_INT >= 23) {
-            return ActivityCompatApi23.shouldShowRequestPermissionRationale(activity, permission);
-        }
-        return false;
-    }
-
-    private static ActivityCompat21.SharedElementCallback21 createCallback(
-            SharedElementCallback callback) {
-        ActivityCompat21.SharedElementCallback21 newCallback = null;
-        if (callback != null) {
-            newCallback = new ActivityCompat.SharedElementCallback21Impl(callback);
-        }
-        return newCallback;
-    }
-
-    private static class SharedElementCallback21Impl
-            extends ActivityCompat21.SharedElementCallback21 {
-
-        private SharedElementCallback mCallback;
-
-        public SharedElementCallback21Impl(SharedElementCallback callback) {
-            mCallback = callback;
-        }
-
-        @Override
-        public void onSharedElementStart(List<String> sharedElementNames,
-                List<View> sharedElements, List<View> sharedElementSnapshots) {
-            mCallback.onSharedElementStart(sharedElementNames, sharedElements,
-                    sharedElementSnapshots);
-        }
-
-        @Override
-        public void onSharedElementEnd(List<String> sharedElementNames, List<View> sharedElements,
-                List<View> sharedElementSnapshots) {
-            mCallback.onSharedElementEnd(sharedElementNames, sharedElements,
-                    sharedElementSnapshots);
-        }
-
-        @Override
-        public void onRejectSharedElements(List<View> rejectedSharedElements) {
-            mCallback.onRejectSharedElements(rejectedSharedElements);
-        }
-
-        @Override
-        public void onMapSharedElements(List<String> names, Map<String, View> sharedElements) {
-            mCallback.onMapSharedElements(names, sharedElements);
-        }
-
-        @Override
-        public Parcelable onCaptureSharedElementSnapshot(View sharedElement,
-                Matrix viewToGlobalMatrix, RectF screenBounds) {
-            return mCallback.onCaptureSharedElementSnapshot(sharedElement, viewToGlobalMatrix,
-                    screenBounds);
-        }
-
-        @Override
-        public View onCreateSnapshotView(Context context, Parcelable snapshot) {
-            return mCallback.onCreateSnapshotView(context, snapshot);
-        }
-    }
-}
diff --git a/v4/java/android/support/v4/app/ActivityOptionsCompat.java b/v4/java/android/support/v4/app/ActivityOptionsCompat.java
deleted file mode 100644
index 6eb93c7..0000000
--- a/v4/java/android/support/v4/app/ActivityOptionsCompat.java
+++ /dev/null
@@ -1,242 +0,0 @@
-/*
- * Copyright (C) 2012 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 android.support.v4.app;
-
-import android.app.Activity;
-import android.content.Context;
-import android.graphics.Bitmap;
-import android.os.Build;
-import android.os.Bundle;
-import android.support.v4.util.Pair;
-import android.view.View;
-
-/**
- * Helper for accessing features in {@link android.app.ActivityOptions}
- * introduced in API level 16 in a backwards compatible fashion.
- */
-public class ActivityOptionsCompat {
-    /**
-     * Create an ActivityOptions specifying a custom animation to run when the
-     * activity is displayed.
-     *
-     * @param context Who is defining this. This is the application that the
-     * animation resources will be loaded from.
-     * @param enterResId A resource ID of the animation resource to use for the
-     * incoming activity. Use 0 for no animation.
-     * @param exitResId A resource ID of the animation resource to use for the
-     * outgoing activity. Use 0 for no animation.
-     * @return Returns a new ActivityOptions object that you can use to supply
-     * these options as the options Bundle when starting an activity.
-     */
-    public static ActivityOptionsCompat makeCustomAnimation(Context context,
-            int enterResId, int exitResId) {
-        if (Build.VERSION.SDK_INT >= 16) {
-            return new ActivityOptionsImplJB(
-                ActivityOptionsCompatJB.makeCustomAnimation(context, enterResId, exitResId));
-        }
-        return new ActivityOptionsCompat();
-    }
-
-    /**
-     * Create an ActivityOptions specifying an animation where the new activity is
-     * scaled from a small originating area of the screen to its final full
-     * representation.
-     * <p/>
-     * If the Intent this is being used with has not set its
-     * {@link android.content.Intent#setSourceBounds(android.graphics.Rect)},
-     * those bounds will be filled in for you based on the initial bounds passed
-     * in here.
-     *
-     * @param source The View that the new activity is animating from. This
-     * defines the coordinate space for startX and startY.
-     * @param startX The x starting location of the new activity, relative to
-     * source.
-     * @param startY The y starting location of the activity, relative to source.
-     * @param startWidth The initial width of the new activity.
-     * @param startHeight The initial height of the new activity.
-     * @return Returns a new ActivityOptions object that you can use to supply
-     * these options as the options Bundle when starting an activity.
-     */
-    public static ActivityOptionsCompat makeScaleUpAnimation(View source,
-            int startX, int startY, int startWidth, int startHeight) {
-        if (Build.VERSION.SDK_INT >= 16) {
-            return new ActivityOptionsImplJB(
-                ActivityOptionsCompatJB.makeScaleUpAnimation(source, startX, startY,
-                        startWidth, startHeight));
-        }
-        return new ActivityOptionsCompat();
-    }
-
-    /**
-     * Create an ActivityOptions specifying an animation where a thumbnail is
-     * scaled from a given position to the new activity window that is being
-     * started.
-     * <p/>
-     * If the Intent this is being used with has not set its
-     * {@link android.content.Intent#setSourceBounds(android.graphics.Rect)},
-     * those bounds will be filled in for you based on the initial thumbnail
-     * location and size provided here.
-     *
-     * @param source The View that this thumbnail is animating from. This
-     * defines the coordinate space for startX and startY.
-     * @param thumbnail The bitmap that will be shown as the initial thumbnail
-     * of the animation.
-     * @param startX The x starting location of the bitmap, relative to source.
-     * @param startY The y starting location of the bitmap, relative to source.
-     * @return Returns a new ActivityOptions object that you can use to supply
-     * these options as the options Bundle when starting an activity.
-     */
-    public static ActivityOptionsCompat makeThumbnailScaleUpAnimation(View source,
-            Bitmap thumbnail, int startX, int startY) {
-        if (Build.VERSION.SDK_INT >= 16) {
-            return new ActivityOptionsImplJB(
-                ActivityOptionsCompatJB.makeThumbnailScaleUpAnimation(source, thumbnail,
-                        startX, startY));
-        }
-        return new ActivityOptionsCompat();
-    }
-
-    /**
-     * Create an ActivityOptions to transition between Activities using cross-Activity scene
-     * animations. This method carries the position of one shared element to the started Activity.
-     * The position of <code>sharedElement</code> will be used as the epicenter for the
-     * exit Transition. The position of the shared element in the launched Activity will be the
-     * epicenter of its entering Transition.
-     *
-     * <p>This requires {@link android.view.Window#FEATURE_CONTENT_TRANSITIONS} to be
-     * enabled on the calling Activity to cause an exit transition. The same must be in
-     * the called Activity to get an entering transition.</p>
-     * @param activity The Activity whose window contains the shared elements.
-     * @param sharedElement The View to transition to the started Activity. sharedElement must
-     *                      have a non-null sharedElementName.
-     * @param sharedElementName The shared element name as used in the target Activity. This may
-     *                          be null if it has the same name as sharedElement.
-     * @return Returns a new ActivityOptions object that you can use to
-     *         supply these options as the options Bundle when starting an activity.
-     */
-    public static ActivityOptionsCompat makeSceneTransitionAnimation(Activity activity,
-            View sharedElement, String sharedElementName) {
-        if (Build.VERSION.SDK_INT >= 21) {
-            return new ActivityOptionsCompat.ActivityOptionsImpl21(
-                    ActivityOptionsCompat21.makeSceneTransitionAnimation(activity,
-                            sharedElement, sharedElementName));
-        }
-        return new ActivityOptionsCompat();
-    }
-
-    /**
-     * Create an ActivityOptions to transition between Activities using cross-Activity scene
-     * animations. This method carries the position of multiple shared elements to the started
-     * Activity. The position of the first element in sharedElements
-     * will be used as the epicenter for the exit Transition. The position of the associated
-     * shared element in the launched Activity will be the epicenter of its entering Transition.
-     *
-     * <p>This requires {@link android.view.Window#FEATURE_CONTENT_TRANSITIONS} to be
-     * enabled on the calling Activity to cause an exit transition. The same must be in
-     * the called Activity to get an entering transition.</p>
-     * @param activity The Activity whose window contains the shared elements.
-     * @param sharedElements The names of the shared elements to transfer to the called
-     *                       Activity and their associated Views. The Views must each have
-     *                       a unique shared element name.
-     * @return Returns a new ActivityOptions object that you can use to
-     *         supply these options as the options Bundle when starting an activity.
-     */
-    public static ActivityOptionsCompat makeSceneTransitionAnimation(Activity activity,
-            Pair<View, String>... sharedElements) {
-        if (Build.VERSION.SDK_INT >= 21) {
-            View[] views = null;
-            String[] names = null;
-            if (sharedElements != null) {
-                views = new View[sharedElements.length];
-                names = new String[sharedElements.length];
-                for (int i = 0; i < sharedElements.length; i++) {
-                    views[i] = sharedElements[i].first;
-                    names[i] = sharedElements[i].second;
-                }
-            }
-            return new ActivityOptionsCompat.ActivityOptionsImpl21(
-                    ActivityOptionsCompat21.makeSceneTransitionAnimation(activity, views, names));
-        }
-        return new ActivityOptionsCompat();
-    }
-
-    private static class ActivityOptionsImplJB extends ActivityOptionsCompat {
-        private final ActivityOptionsCompatJB mImpl;
-
-        ActivityOptionsImplJB(ActivityOptionsCompatJB impl) {
-            mImpl = impl;
-        }
-
-        @Override
-        public Bundle toBundle() {
-            return mImpl.toBundle();
-        }
-
-        @Override
-        public void update(ActivityOptionsCompat otherOptions) {
-            if (otherOptions instanceof ActivityOptionsImplJB) {
-                ActivityOptionsImplJB otherImpl = (ActivityOptionsImplJB)otherOptions;
-                mImpl.update(otherImpl.mImpl);
-            }
-        }
-    }
-
-    private static class ActivityOptionsImpl21 extends ActivityOptionsCompat {
-        private final ActivityOptionsCompat21 mImpl;
-
-        ActivityOptionsImpl21(ActivityOptionsCompat21 impl) {
-            mImpl = impl;
-        }
-
-        @Override
-        public Bundle toBundle() {
-            return mImpl.toBundle();
-        }
-
-        @Override
-        public void update(ActivityOptionsCompat otherOptions) {
-            if (otherOptions instanceof ActivityOptionsCompat.ActivityOptionsImpl21) {
-                ActivityOptionsCompat.ActivityOptionsImpl21
-                        otherImpl = (ActivityOptionsCompat.ActivityOptionsImpl21)otherOptions;
-                mImpl.update(otherImpl.mImpl);
-            }
-        }
-    }
-
-    protected ActivityOptionsCompat() {
-    }
-
-    /**
-     * Returns the created options as a Bundle, which can be passed to
-     * {@link ActivityCompat#startActivity(android.app.Activity, android.content.Intent, android.os.Bundle)}.
-     * Note that the returned Bundle is still owned by the ActivityOptions
-     * object; you must not modify it, but can supply it to the startActivity
-     * methods that take an options Bundle.
-     */
-    public Bundle toBundle() {
-        return null;
-    }
-
-    /**
-     * Update the current values in this ActivityOptions from those supplied in
-     * otherOptions. Any values defined in otherOptions replace those in the
-     * base options.
-     */
-    public void update(ActivityOptionsCompat otherOptions) {
-        // Do nothing.
-    }
-}
diff --git a/v4/java/android/support/v4/app/BackStackRecord.java b/v4/java/android/support/v4/app/BackStackRecord.java
deleted file mode 100644
index ee0d758..0000000
--- a/v4/java/android/support/v4/app/BackStackRecord.java
+++ /dev/null
@@ -1,1502 +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 android.support.v4.app;
-
-import android.os.Build;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.support.v4.util.ArrayMap;
-import android.support.v4.util.LogWriter;
-import android.text.TextUtils;
-import android.util.Log;
-import android.util.SparseArray;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.ViewTreeObserver;
-
-import java.io.FileDescriptor;
-import java.io.PrintWriter;
-import java.util.ArrayList;
-
-final class BackStackState implements Parcelable {
-    final int[] mOps;
-    final int mTransition;
-    final int mTransitionStyle;
-    final String mName;
-    final int mIndex;
-    final int mBreadCrumbTitleRes;
-    final CharSequence mBreadCrumbTitleText;
-    final int mBreadCrumbShortTitleRes;
-    final CharSequence mBreadCrumbShortTitleText;
-    final ArrayList<String> mSharedElementSourceNames;
-    final ArrayList<String> mSharedElementTargetNames;
-
-    public BackStackState(BackStackRecord bse) {
-        int numRemoved = 0;
-        BackStackRecord.Op op = bse.mHead;
-        while (op != null) {
-            if (op.removed != null) numRemoved += op.removed.size();
-            op = op.next;
-        }
-        mOps = new int[bse.mNumOp*7 + numRemoved];
-
-        if (!bse.mAddToBackStack) {
-            throw new IllegalStateException("Not on back stack");
-        }
-
-        op = bse.mHead;
-        int pos = 0;
-        while (op != null) {
-            mOps[pos++] = op.cmd;
-            mOps[pos++] = op.fragment != null ? op.fragment.mIndex : -1;
-            mOps[pos++] = op.enterAnim;
-            mOps[pos++] = op.exitAnim;
-            mOps[pos++] = op.popEnterAnim;
-            mOps[pos++] = op.popExitAnim;
-            if (op.removed != null) {
-                final int N = op.removed.size();
-                mOps[pos++] = N;
-                for (int i=0; i<N; i++) {
-                    mOps[pos++] = op.removed.get(i).mIndex;
-                }
-            } else {
-                mOps[pos++] = 0;
-            }
-            op = op.next;
-        }
-        mTransition = bse.mTransition;
-        mTransitionStyle = bse.mTransitionStyle;
-        mName = bse.mName;
-        mIndex = bse.mIndex;
-        mBreadCrumbTitleRes = bse.mBreadCrumbTitleRes;
-        mBreadCrumbTitleText = bse.mBreadCrumbTitleText;
-        mBreadCrumbShortTitleRes = bse.mBreadCrumbShortTitleRes;
-        mBreadCrumbShortTitleText = bse.mBreadCrumbShortTitleText;
-        mSharedElementSourceNames = bse.mSharedElementSourceNames;
-        mSharedElementTargetNames = bse.mSharedElementTargetNames;
-    }
-
-    public BackStackState(Parcel in) {
-        mOps = in.createIntArray();
-        mTransition = in.readInt();
-        mTransitionStyle = in.readInt();
-        mName = in.readString();
-        mIndex = in.readInt();
-        mBreadCrumbTitleRes = in.readInt();
-        mBreadCrumbTitleText = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in);
-        mBreadCrumbShortTitleRes = in.readInt();
-        mBreadCrumbShortTitleText = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in);
-        mSharedElementSourceNames = in.createStringArrayList();
-        mSharedElementTargetNames = in.createStringArrayList();
-    }
-
-    public BackStackRecord instantiate(FragmentManagerImpl fm) {
-        BackStackRecord bse = new BackStackRecord(fm);
-        int pos = 0;
-        int num = 0;
-        while (pos < mOps.length) {
-            BackStackRecord.Op op = new BackStackRecord.Op();
-            op.cmd = mOps[pos++];
-            if (FragmentManagerImpl.DEBUG) Log.v(FragmentManagerImpl.TAG,
-                    "Instantiate " + bse + " op #" + num + " base fragment #" + mOps[pos]);
-            int findex = mOps[pos++];
-            if (findex >= 0) {
-                Fragment f = fm.mActive.get(findex);
-                op.fragment = f;
-            } else {
-                op.fragment = null;
-            }
-            op.enterAnim = mOps[pos++];
-            op.exitAnim = mOps[pos++];
-            op.popEnterAnim = mOps[pos++];
-            op.popExitAnim = mOps[pos++];
-            final int N = mOps[pos++];
-            if (N > 0) {
-                op.removed = new ArrayList<Fragment>(N);
-                for (int i=0; i<N; i++) {
-                    if (FragmentManagerImpl.DEBUG) Log.v(FragmentManagerImpl.TAG,
-                            "Instantiate " + bse + " set remove fragment #" + mOps[pos]);
-                    Fragment r = fm.mActive.get(mOps[pos++]);
-                    op.removed.add(r);
-                }
-            }
-            bse.mEnterAnim = op.enterAnim;
-            bse.mExitAnim = op.exitAnim;
-            bse.mPopEnterAnim = op.popEnterAnim;
-            bse.mPopExitAnim = op.popExitAnim;
-            bse.addOp(op);
-            num++;
-        }
-        bse.mTransition = mTransition;
-        bse.mTransitionStyle = mTransitionStyle;
-        bse.mName = mName;
-        bse.mIndex = mIndex;
-        bse.mAddToBackStack = true;
-        bse.mBreadCrumbTitleRes = mBreadCrumbTitleRes;
-        bse.mBreadCrumbTitleText = mBreadCrumbTitleText;
-        bse.mBreadCrumbShortTitleRes = mBreadCrumbShortTitleRes;
-        bse.mBreadCrumbShortTitleText = mBreadCrumbShortTitleText;
-        bse.mSharedElementSourceNames = mSharedElementSourceNames;
-        bse.mSharedElementTargetNames = mSharedElementTargetNames;
-        bse.bumpBackStackNesting(1);
-        return bse;
-    }
-
-    public int describeContents() {
-        return 0;
-    }
-
-    public void writeToParcel(Parcel dest, int flags) {
-        dest.writeIntArray(mOps);
-        dest.writeInt(mTransition);
-        dest.writeInt(mTransitionStyle);
-        dest.writeString(mName);
-        dest.writeInt(mIndex);
-        dest.writeInt(mBreadCrumbTitleRes);
-        TextUtils.writeToParcel(mBreadCrumbTitleText, dest, 0);
-        dest.writeInt(mBreadCrumbShortTitleRes);
-        TextUtils.writeToParcel(mBreadCrumbShortTitleText, dest, 0);
-        dest.writeStringList(mSharedElementSourceNames);
-        dest.writeStringList(mSharedElementTargetNames);
-    }
-
-    public static final Parcelable.Creator<BackStackState> CREATOR
-            = new Parcelable.Creator<BackStackState>() {
-        public BackStackState createFromParcel(Parcel in) {
-            return new BackStackState(in);
-        }
-
-        public BackStackState[] newArray(int size) {
-            return new BackStackState[size];
-        }
-    };
-}
-
-/**
- * @hide Entry of an operation on the fragment back stack.
- */
-final class BackStackRecord extends FragmentTransaction implements
-        FragmentManager.BackStackEntry, Runnable {
-    static final String TAG = FragmentManagerImpl.TAG;
-    static final boolean SUPPORTS_TRANSITIONS = Build.VERSION.SDK_INT >= 21;
-
-    final FragmentManagerImpl mManager;
-
-    static final int OP_NULL = 0;
-    static final int OP_ADD = 1;
-    static final int OP_REPLACE = 2;
-    static final int OP_REMOVE = 3;
-    static final int OP_HIDE = 4;
-    static final int OP_SHOW = 5;
-    static final int OP_DETACH = 6;
-    static final int OP_ATTACH = 7;
-
-    static final class Op {
-        Op next;
-        Op prev;
-        int cmd;
-        Fragment fragment;
-        int enterAnim;
-        int exitAnim;
-        int popEnterAnim;
-        int popExitAnim;
-        ArrayList<Fragment> removed;
-    }
-
-    Op mHead;
-    Op mTail;
-    int mNumOp;
-    int mEnterAnim;
-    int mExitAnim;
-    int mPopEnterAnim;
-    int mPopExitAnim;
-    int mTransition;
-    int mTransitionStyle;
-    boolean mAddToBackStack;
-    boolean mAllowAddToBackStack = true;
-    String mName;
-    boolean mCommitted;
-    int mIndex = -1;
-
-    int mBreadCrumbTitleRes;
-    CharSequence mBreadCrumbTitleText;
-    int mBreadCrumbShortTitleRes;
-    CharSequence mBreadCrumbShortTitleText;
-
-    ArrayList<String> mSharedElementSourceNames;
-    ArrayList<String> mSharedElementTargetNames;
-
-    @Override
-    public String toString() {
-        StringBuilder sb = new StringBuilder(128);
-        sb.append("BackStackEntry{");
-        sb.append(Integer.toHexString(System.identityHashCode(this)));
-        if (mIndex >= 0) {
-            sb.append(" #");
-            sb.append(mIndex);
-        }
-        if (mName != null) {
-            sb.append(" ");
-            sb.append(mName);
-        }
-        sb.append("}");
-        return sb.toString();
-    }
-
-    public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) {
-        dump(prefix, writer, true);
-    }
-
-    public void dump(String prefix, PrintWriter writer, boolean full) {
-        if (full) {
-            writer.print(prefix); writer.print("mName="); writer.print(mName);
-                    writer.print(" mIndex="); writer.print(mIndex);
-                    writer.print(" mCommitted="); writer.println(mCommitted);
-            if (mTransition != FragmentTransaction.TRANSIT_NONE) {
-                writer.print(prefix); writer.print("mTransition=#");
-                        writer.print(Integer.toHexString(mTransition));
-                        writer.print(" mTransitionStyle=#");
-                        writer.println(Integer.toHexString(mTransitionStyle));
-            }
-            if (mEnterAnim != 0 || mExitAnim !=0) {
-                writer.print(prefix); writer.print("mEnterAnim=#");
-                        writer.print(Integer.toHexString(mEnterAnim));
-                        writer.print(" mExitAnim=#");
-                        writer.println(Integer.toHexString(mExitAnim));
-            }
-            if (mPopEnterAnim != 0 || mPopExitAnim !=0) {
-                writer.print(prefix); writer.print("mPopEnterAnim=#");
-                        writer.print(Integer.toHexString(mPopEnterAnim));
-                        writer.print(" mPopExitAnim=#");
-                        writer.println(Integer.toHexString(mPopExitAnim));
-            }
-            if (mBreadCrumbTitleRes != 0 || mBreadCrumbTitleText != null) {
-                writer.print(prefix); writer.print("mBreadCrumbTitleRes=#");
-                        writer.print(Integer.toHexString(mBreadCrumbTitleRes));
-                        writer.print(" mBreadCrumbTitleText=");
-                        writer.println(mBreadCrumbTitleText);
-            }
-            if (mBreadCrumbShortTitleRes != 0 || mBreadCrumbShortTitleText != null) {
-                writer.print(prefix); writer.print("mBreadCrumbShortTitleRes=#");
-                        writer.print(Integer.toHexString(mBreadCrumbShortTitleRes));
-                        writer.print(" mBreadCrumbShortTitleText=");
-                        writer.println(mBreadCrumbShortTitleText);
-            }
-        }
-
-        if (mHead != null) {
-            writer.print(prefix); writer.println("Operations:");
-            String innerPrefix = prefix + "    ";
-            Op op = mHead;
-            int num = 0;
-            while (op != null) {
-                String cmdStr;
-                switch (op.cmd) {
-                    case OP_NULL: cmdStr="NULL"; break;
-                    case OP_ADD: cmdStr="ADD"; break;
-                    case OP_REPLACE: cmdStr="REPLACE"; break;
-                    case OP_REMOVE: cmdStr="REMOVE"; break;
-                    case OP_HIDE: cmdStr="HIDE"; break;
-                    case OP_SHOW: cmdStr="SHOW"; break;
-                    case OP_DETACH: cmdStr="DETACH"; break;
-                    case OP_ATTACH: cmdStr="ATTACH"; break;
-                    default: cmdStr="cmd=" + op.cmd; break;
-                }
-                writer.print(prefix); writer.print("  Op #"); writer.print(num);
-                        writer.print(": "); writer.print(cmdStr);
-                        writer.print(" "); writer.println(op.fragment);
-                if (full) {
-                    if (op.enterAnim != 0 || op.exitAnim != 0) {
-                        writer.print(prefix); writer.print("enterAnim=#");
-                                writer.print(Integer.toHexString(op.enterAnim));
-                                writer.print(" exitAnim=#");
-                                writer.println(Integer.toHexString(op.exitAnim));
-                    }
-                    if (op.popEnterAnim != 0 || op.popExitAnim != 0) {
-                        writer.print(prefix); writer.print("popEnterAnim=#");
-                                writer.print(Integer.toHexString(op.popEnterAnim));
-                                writer.print(" popExitAnim=#");
-                                writer.println(Integer.toHexString(op.popExitAnim));
-                    }
-                }
-                if (op.removed != null && op.removed.size() > 0) {
-                    for (int i=0; i<op.removed.size(); i++) {
-                        writer.print(innerPrefix);
-                        if (op.removed.size() == 1) {
-                            writer.print("Removed: ");
-                        } else {
-                            if (i == 0) {
-                                writer.println("Removed:");
-                            }
-                            writer.print(innerPrefix); writer.print("  #"); writer.print(i);
-                                    writer.print(": "); 
-                        }
-                        writer.println(op.removed.get(i));
-                    }
-                }
-                op = op.next;
-                num++;
-            }
-        }
-    }
-
-    public BackStackRecord(FragmentManagerImpl manager) {
-        mManager = manager;
-    }
-
-    public int getId() {
-        return mIndex;
-    }
-
-    public int getBreadCrumbTitleRes() {
-        return mBreadCrumbTitleRes;
-    }
-
-    public int getBreadCrumbShortTitleRes() {
-        return mBreadCrumbShortTitleRes;
-    }
-
-    public CharSequence getBreadCrumbTitle() {
-        if (mBreadCrumbTitleRes != 0) {
-            return mManager.mHost.getContext().getText(mBreadCrumbTitleRes);
-        }
-        return mBreadCrumbTitleText;
-    }
-
-    public CharSequence getBreadCrumbShortTitle() {
-        if (mBreadCrumbShortTitleRes != 0) {
-            return mManager.mHost.getContext().getText(mBreadCrumbShortTitleRes);
-        }
-        return mBreadCrumbShortTitleText;
-    }
-
-    void addOp(Op op) {
-        if (mHead == null) {
-            mHead = mTail = op;
-        } else {
-            op.prev = mTail;
-            mTail.next = op;
-            mTail = op;
-        }
-        op.enterAnim = mEnterAnim;
-        op.exitAnim = mExitAnim;
-        op.popEnterAnim = mPopEnterAnim;
-        op.popExitAnim = mPopExitAnim;
-        mNumOp++;
-    }
-
-    public FragmentTransaction add(Fragment fragment, String tag) {
-        doAddOp(0, fragment, tag, OP_ADD);
-        return this;
-    }
-
-    public FragmentTransaction add(int containerViewId, Fragment fragment) {
-        doAddOp(containerViewId, fragment, null, OP_ADD);
-        return this;
-    }
-
-    public FragmentTransaction add(int containerViewId, Fragment fragment, String tag) {
-        doAddOp(containerViewId, fragment, tag, OP_ADD);
-        return this;
-    }
-
-    private void doAddOp(int containerViewId, Fragment fragment, String tag, int opcmd) {
-        fragment.mFragmentManager = mManager;
-
-        if (tag != null) {
-            if (fragment.mTag != null && !tag.equals(fragment.mTag)) {
-                throw new IllegalStateException("Can't change tag of fragment "
-                        + fragment + ": was " + fragment.mTag
-                        + " now " + tag);
-            }
-            fragment.mTag = tag;
-        }
-
-        if (containerViewId != 0) {
-            if (containerViewId == View.NO_ID) {
-                throw new IllegalArgumentException("Can't add fragment "
-                        + fragment + " with tag " + tag + " to container view with no id");
-            }
-            if (fragment.mFragmentId != 0 && fragment.mFragmentId != containerViewId) {
-                throw new IllegalStateException("Can't change container ID of fragment "
-                        + fragment + ": was " + fragment.mFragmentId
-                        + " now " + containerViewId);
-            }
-            fragment.mContainerId = fragment.mFragmentId = containerViewId;
-        }
-
-        Op op = new Op();
-        op.cmd = opcmd;
-        op.fragment = fragment;
-        addOp(op);
-    }
-
-    public FragmentTransaction replace(int containerViewId, Fragment fragment) {
-        return replace(containerViewId, fragment, null);
-    }
-
-    public FragmentTransaction replace(int containerViewId, Fragment fragment, String tag) {
-        if (containerViewId == 0) {
-            throw new IllegalArgumentException("Must use non-zero containerViewId");
-        }
-
-        doAddOp(containerViewId, fragment, tag, OP_REPLACE);
-        return this;
-    }
-
-    public FragmentTransaction remove(Fragment fragment) {
-        Op op = new Op();
-        op.cmd = OP_REMOVE;
-        op.fragment = fragment;
-        addOp(op);
-
-        return this;
-    }
-
-    public FragmentTransaction hide(Fragment fragment) {
-        Op op = new Op();
-        op.cmd = OP_HIDE;
-        op.fragment = fragment;
-        addOp(op);
-
-        return this;
-    }
-
-    public FragmentTransaction show(Fragment fragment) {
-        Op op = new Op();
-        op.cmd = OP_SHOW;
-        op.fragment = fragment;
-        addOp(op);
-
-        return this;
-    }
-
-    public FragmentTransaction detach(Fragment fragment) {
-        Op op = new Op();
-        op.cmd = OP_DETACH;
-        op.fragment = fragment;
-        addOp(op);
-
-        return this;
-    }
-
-    public FragmentTransaction attach(Fragment fragment) {
-        Op op = new Op();
-        op.cmd = OP_ATTACH;
-        op.fragment = fragment;
-        addOp(op);
-
-        return this;
-    }
-
-    public FragmentTransaction setCustomAnimations(int enter, int exit) {
-        return setCustomAnimations(enter, exit, 0, 0);
-    }
-
-    public FragmentTransaction setCustomAnimations(int enter, int exit,
-            int popEnter, int popExit) {
-        mEnterAnim = enter;
-        mExitAnim = exit;
-        mPopEnterAnim = popEnter;
-        mPopExitAnim = popExit;
-        return this;
-    }
-
-    public FragmentTransaction setTransition(int transition) {
-        mTransition = transition;
-        return this;
-    }
-
-    @Override
-    public FragmentTransaction addSharedElement(View sharedElement, String name) {
-        if (SUPPORTS_TRANSITIONS) {
-            String transitionName = FragmentTransitionCompat21.getTransitionName(sharedElement);
-            if (transitionName == null) {
-                throw new IllegalArgumentException("Unique transitionNames are required for all" +
-                        " sharedElements");
-            }
-            if (mSharedElementSourceNames == null) {
-                mSharedElementSourceNames = new ArrayList<String>();
-                mSharedElementTargetNames = new ArrayList<String>();
-            }
-
-            mSharedElementSourceNames.add(transitionName);
-            mSharedElementTargetNames.add(name);
-        }
-        return this;
-    }
-
-    public FragmentTransaction setTransitionStyle(int styleRes) {
-        mTransitionStyle = styleRes;
-        return this;
-    }
-
-    public FragmentTransaction addToBackStack(String name) {
-        if (!mAllowAddToBackStack) {
-            throw new IllegalStateException(
-                    "This FragmentTransaction is not allowed to be added to the back stack.");
-        }
-        mAddToBackStack = true;
-        mName = name;
-        return this;
-    }
-
-    public boolean isAddToBackStackAllowed() {
-        return mAllowAddToBackStack;
-    }
-
-    public FragmentTransaction disallowAddToBackStack() {
-        if (mAddToBackStack) {
-            throw new IllegalStateException(
-                    "This transaction is already being added to the back stack");
-        }
-        mAllowAddToBackStack = false;
-        return this;
-    }
-
-    public FragmentTransaction setBreadCrumbTitle(int res) {
-        mBreadCrumbTitleRes = res;
-        mBreadCrumbTitleText = null;
-        return this;
-    }
-
-    public FragmentTransaction setBreadCrumbTitle(CharSequence text) {
-        mBreadCrumbTitleRes = 0;
-        mBreadCrumbTitleText = text;
-        return this;
-    }
-
-    public FragmentTransaction setBreadCrumbShortTitle(int res) {
-        mBreadCrumbShortTitleRes = res;
-        mBreadCrumbShortTitleText = null;
-        return this;
-    }
-
-    public FragmentTransaction setBreadCrumbShortTitle(CharSequence text) {
-        mBreadCrumbShortTitleRes = 0;
-        mBreadCrumbShortTitleText = text;
-        return this;
-    }
-
-    void bumpBackStackNesting(int amt) {
-        if (!mAddToBackStack) {
-            return;
-        }
-        if (FragmentManagerImpl.DEBUG) Log.v(TAG, "Bump nesting in " + this
-                + " by " + amt);
-        Op op = mHead;
-        while (op != null) {
-            if (op.fragment != null) {
-                op.fragment.mBackStackNesting += amt;
-                if (FragmentManagerImpl.DEBUG) Log.v(TAG, "Bump nesting of "
-                        + op.fragment + " to " + op.fragment.mBackStackNesting);
-            }
-            if (op.removed != null) {
-                for (int i=op.removed.size()-1; i>=0; i--) {
-                    Fragment r = op.removed.get(i);
-                    r.mBackStackNesting += amt;
-                    if (FragmentManagerImpl.DEBUG) Log.v(TAG, "Bump nesting of "
-                            + r + " to " + r.mBackStackNesting);
-                }
-            }
-            op = op.next;
-        }
-    }
-
-    public int commit() {
-        return commitInternal(false);
-    }
-
-    public int commitAllowingStateLoss() {
-        return commitInternal(true);
-    }
-
-    @Override
-    public void commitNow() {
-        disallowAddToBackStack();
-        mManager.execSingleAction(this, false);
-    }
-
-    @Override
-    public void commitNowAllowingStateLoss() {
-        disallowAddToBackStack();
-        mManager.execSingleAction(this, true);
-    }
-    
-    int commitInternal(boolean allowStateLoss) {
-        if (mCommitted) throw new IllegalStateException("commit already called");
-        if (FragmentManagerImpl.DEBUG) {
-            Log.v(TAG, "Commit: " + this);
-            LogWriter logw = new LogWriter(TAG);
-            PrintWriter pw = new PrintWriter(logw);
-            dump("  ", null, pw, null);
-        }
-        mCommitted = true;
-        if (mAddToBackStack) {
-            mIndex = mManager.allocBackStackIndex(this);
-        } else {
-            mIndex = -1;
-        }
-        mManager.enqueueAction(this, allowStateLoss);
-        return mIndex;
-    }
-    
-    public void run() {
-        if (FragmentManagerImpl.DEBUG) Log.v(TAG, "Run: " + this);
-
-        if (mAddToBackStack) {
-            if (mIndex < 0) {
-                throw new IllegalStateException("addToBackStack() called after commit()");
-            }
-        }
-
-        bumpBackStackNesting(1);
-
-        TransitionState state = null;
-        SparseArray<Fragment> firstOutFragments = null;
-        SparseArray<Fragment> lastInFragments = null;
-        if (SUPPORTS_TRANSITIONS && mManager.mCurState >= Fragment.CREATED) {
-            firstOutFragments = new SparseArray<Fragment>();
-            lastInFragments = new SparseArray<Fragment>();
-
-            calculateFragments(firstOutFragments, lastInFragments);
-
-            state = beginTransition(firstOutFragments, lastInFragments, false);
-        }
-
-        int transitionStyle = state != null ? 0 : mTransitionStyle;
-        int transition = state != null ? 0 : mTransition;
-        Op op = mHead;
-        while (op != null) {
-            int enterAnim = state != null ? 0 : op.enterAnim;
-            int exitAnim = state != null ? 0 : op.exitAnim;
-            switch (op.cmd) {
-                case OP_ADD: {
-                    Fragment f = op.fragment;
-                    f.mNextAnim = enterAnim;
-                    mManager.addFragment(f, false);
-                } break;
-                case OP_REPLACE: {
-                    Fragment f = op.fragment;
-                    int containerId = f.mContainerId;
-                    if (mManager.mAdded != null) {
-                        for (int i = mManager.mAdded.size() - 1; i >= 0; i--) {
-                            Fragment old = mManager.mAdded.get(i);
-                            if (FragmentManagerImpl.DEBUG) Log.v(TAG,
-                                    "OP_REPLACE: adding=" + f + " old=" + old);
-                            if (old.mContainerId == containerId) {
-                                if (old == f) {
-                                    op.fragment = f = null;
-                                } else {
-                                    if (op.removed == null) {
-                                        op.removed = new ArrayList<Fragment>();
-                                    }
-                                    op.removed.add(old);
-                                    old.mNextAnim = exitAnim;
-                                    if (mAddToBackStack) {
-                                        old.mBackStackNesting += 1;
-                                        if (FragmentManagerImpl.DEBUG) Log.v(TAG, "Bump nesting of "
-                                                + old + " to " + old.mBackStackNesting);
-                                    }
-                                    mManager.removeFragment(old, transition, transitionStyle);
-                                }
-                            }
-                        }
-                    }
-                    if (f != null) {
-                        f.mNextAnim = enterAnim;
-                        mManager.addFragment(f, false);
-                    }
-                } break;
-                case OP_REMOVE: {
-                    Fragment f = op.fragment;
-                    f.mNextAnim = exitAnim;
-                    mManager.removeFragment(f, transition, transitionStyle);
-                } break;
-                case OP_HIDE: {
-                    Fragment f = op.fragment;
-                    f.mNextAnim = exitAnim;
-                    mManager.hideFragment(f, transition, transitionStyle);
-                } break;
-                case OP_SHOW: {
-                    Fragment f = op.fragment;
-                    f.mNextAnim = enterAnim;
-                    mManager.showFragment(f, transition, transitionStyle);
-                } break;
-                case OP_DETACH: {
-                    Fragment f = op.fragment;
-                    f.mNextAnim = exitAnim;
-                    mManager.detachFragment(f, transition, transitionStyle);
-                } break;
-                case OP_ATTACH: {
-                    Fragment f = op.fragment;
-                    f.mNextAnim = enterAnim;
-                    mManager.attachFragment(f, transition, transitionStyle);
-                } break;
-                default: {
-                    throw new IllegalArgumentException("Unknown cmd: " + op.cmd);
-                }
-            }
-
-            op = op.next;
-        }
-
-        mManager.moveToState(mManager.mCurState, transition, transitionStyle, true);
-
-        if (mAddToBackStack) {
-            mManager.addBackStackState(this);
-        }
-    }
-
-    private static void setFirstOut(SparseArray<Fragment> firstOutFragments,
-            SparseArray<Fragment> lastInFragments, Fragment fragment) {
-        if (fragment != null) {
-            int containerId = fragment.mContainerId;
-            if (containerId != 0 && !fragment.isHidden()) {
-                if (fragment.isAdded() && fragment.getView() != null
-                        && firstOutFragments.get(containerId) == null) {
-                    firstOutFragments.put(containerId, fragment);
-                }
-                if (lastInFragments.get(containerId) == fragment) {
-                    lastInFragments.remove(containerId);
-                }
-            }
-        }
-    }
-
-    private void setLastIn(SparseArray<Fragment> firstOutFragments,
-            SparseArray<Fragment> lastInFragments, Fragment fragment) {
-        if (fragment != null) {
-            int containerId = fragment.mContainerId;
-            if (containerId != 0) {
-                if (!fragment.isAdded()) {
-                    lastInFragments.put(containerId, fragment);
-                }
-                if (firstOutFragments.get(containerId) == fragment) {
-                    firstOutFragments.remove(containerId);
-                }
-            }
-            if (fragment.mState < Fragment.CREATED && mManager.mCurState >= Fragment.CREATED) {
-                mManager.makeActive(fragment);
-                mManager.moveToState(fragment, Fragment.CREATED, 0, 0, false);
-            }
-        }
-    }
-
-    /**
-     * Finds the first removed fragment and last added fragments when going forward.
-     * If none of the fragments have transitions, then both lists will be empty.
-     *
-     * @param firstOutFragments The list of first fragments to be removed, keyed on the
-     *                          container ID. This list will be modified by the method.
-     * @param lastInFragments The list of last fragments to be added, keyed on the
-     *                        container ID. This list will be modified by the method.
-     */
-    private void calculateFragments(SparseArray<Fragment> firstOutFragments,
-            SparseArray<Fragment> lastInFragments) {
-        if (!mManager.mContainer.onHasView()) {
-            return; // nothing to see, so no transitions
-        }
-        Op op = mHead;
-        while (op != null) {
-            switch (op.cmd) {
-                case OP_ADD:
-                    setLastIn(firstOutFragments, lastInFragments, op.fragment);
-                    break;
-                case OP_REPLACE: {
-                    Fragment f = op.fragment;
-                    if (mManager.mAdded != null) {
-                        for (int i = 0; i < mManager.mAdded.size(); i++) {
-                            Fragment old = mManager.mAdded.get(i);
-                            if (f == null || old.mContainerId == f.mContainerId) {
-                                if (old == f) {
-                                    f = null;
-                                    lastInFragments.remove(old.mContainerId);
-                                } else {
-                                    setFirstOut(firstOutFragments, lastInFragments, old);
-                                }
-                            }
-                        }
-                    }
-                    setLastIn(firstOutFragments, lastInFragments, op.fragment);
-                    break;
-                }
-                case OP_REMOVE:
-                    setFirstOut(firstOutFragments, lastInFragments, op.fragment);
-                    break;
-                case OP_HIDE:
-                    setFirstOut(firstOutFragments, lastInFragments, op.fragment);
-                    break;
-                case OP_SHOW:
-                    setLastIn(firstOutFragments, lastInFragments, op.fragment);
-                    break;
-                case OP_DETACH:
-                    setFirstOut(firstOutFragments, lastInFragments, op.fragment);
-                    break;
-                case OP_ATTACH:
-                    setLastIn(firstOutFragments, lastInFragments, op.fragment);
-                    break;
-            }
-
-            op = op.next;
-        }
-    }
-
-    /**
-     * Finds the first removed fragment and last added fragments when popping the back stack.
-     * If none of the fragments have transitions, then both lists will be empty.
-     *
-     * @param firstOutFragments The list of first fragments to be removed, keyed on the
-     *                          container ID. This list will be modified by the method.
-     * @param lastInFragments The list of last fragments to be added, keyed on the
-     *                        container ID. This list will be modified by the method.
-     */
-    public void calculateBackFragments(SparseArray<Fragment> firstOutFragments,
-            SparseArray<Fragment> lastInFragments) {
-        if (!mManager.mContainer.onHasView()) {
-            return; // nothing to see, so no transitions
-        }
-        Op op = mTail;
-        while (op != null) {
-            switch (op.cmd) {
-                case OP_ADD:
-                    setFirstOut(firstOutFragments, lastInFragments, op.fragment);
-                    break;
-                case OP_REPLACE:
-                    if (op.removed != null) {
-                        for (int i = op.removed.size() - 1; i >= 0; i--) {
-                            setLastIn(firstOutFragments, lastInFragments, op.removed.get(i));
-                        }
-                    }
-                    setFirstOut(firstOutFragments, lastInFragments, op.fragment);
-                    break;
-                case OP_REMOVE:
-                    setLastIn(firstOutFragments, lastInFragments, op.fragment);
-                    break;
-                case OP_HIDE:
-                    setLastIn(firstOutFragments, lastInFragments, op.fragment);
-                    break;
-                case OP_SHOW:
-                    setFirstOut(firstOutFragments, lastInFragments, op.fragment);
-                    break;
-                case OP_DETACH:
-                    setLastIn(firstOutFragments, lastInFragments, op.fragment);
-                    break;
-                case OP_ATTACH:
-                    setFirstOut(firstOutFragments, lastInFragments, op.fragment);
-                    break;
-            }
-
-            op = op.prev;
-        }
-    }
-
-    public TransitionState popFromBackStack(boolean doStateMove, TransitionState state,
-            SparseArray<Fragment> firstOutFragments, SparseArray<Fragment> lastInFragments) {
-        if (FragmentManagerImpl.DEBUG) {
-            Log.v(TAG, "popFromBackStack: " + this);
-            LogWriter logw = new LogWriter(TAG);
-            PrintWriter pw = new PrintWriter(logw);
-            dump("  ", null, pw, null);
-        }
-
-        if (SUPPORTS_TRANSITIONS && mManager.mCurState >= Fragment.CREATED) {
-            if (state == null) {
-                if (firstOutFragments.size() != 0 || lastInFragments.size() != 0) {
-                    state = beginTransition(firstOutFragments, lastInFragments, true);
-                }
-            } else if (!doStateMove) {
-                setNameOverrides(state, mSharedElementTargetNames, mSharedElementSourceNames);
-            }
-        }
-
-        bumpBackStackNesting(-1);
-
-        int transitionStyle = state != null ? 0 : mTransitionStyle;
-        int transition = state != null ? 0 : mTransition;
-        Op op = mTail;
-        while (op != null) {
-            int popEnterAnim = state != null ? 0 : op.popEnterAnim;
-            int popExitAnim= state != null ? 0 : op.popExitAnim;
-            switch (op.cmd) {
-                case OP_ADD: {
-                    Fragment f = op.fragment;
-                    f.mNextAnim = popExitAnim;
-                    mManager.removeFragment(f,
-                            FragmentManagerImpl.reverseTransit(transition), transitionStyle);
-                } break;
-                case OP_REPLACE: {
-                    Fragment f = op.fragment;
-                    if (f != null) {
-                        f.mNextAnim = popExitAnim;
-                        mManager.removeFragment(f,
-                                FragmentManagerImpl.reverseTransit(transition), transitionStyle);
-                    }
-                    if (op.removed != null) {
-                        for (int i=0; i<op.removed.size(); i++) {
-                            Fragment old = op.removed.get(i);
-                            old.mNextAnim = popEnterAnim;
-                            mManager.addFragment(old, false);
-                        }
-                    }
-                } break;
-                case OP_REMOVE: {
-                    Fragment f = op.fragment;
-                    f.mNextAnim = popEnterAnim;
-                    mManager.addFragment(f, false);
-                } break;
-                case OP_HIDE: {
-                    Fragment f = op.fragment;
-                    f.mNextAnim = popEnterAnim;
-                    mManager.showFragment(f,
-                            FragmentManagerImpl.reverseTransit(transition), transitionStyle);
-                } break;
-                case OP_SHOW: {
-                    Fragment f = op.fragment;
-                    f.mNextAnim = popExitAnim;
-                    mManager.hideFragment(f,
-                            FragmentManagerImpl.reverseTransit(transition), transitionStyle);
-                } break;
-                case OP_DETACH: {
-                    Fragment f = op.fragment;
-                    f.mNextAnim = popEnterAnim;
-                    mManager.attachFragment(f,
-                            FragmentManagerImpl.reverseTransit(transition), transitionStyle);
-                } break;
-                case OP_ATTACH: {
-                    Fragment f = op.fragment;
-                    f.mNextAnim = popEnterAnim;
-                    mManager.detachFragment(f,
-                            FragmentManagerImpl.reverseTransit(transition), transitionStyle);
-                } break;
-                default: {
-                    throw new IllegalArgumentException("Unknown cmd: " + op.cmd);
-                }
-            }
-
-            op = op.prev;
-        }
-
-        if (doStateMove) {
-            mManager.moveToState(mManager.mCurState,
-                    FragmentManagerImpl.reverseTransit(transition), transitionStyle, true);
-            state = null;
-        }
-
-        if (mIndex >= 0) {
-            mManager.freeBackStackIndex(mIndex);
-            mIndex = -1;
-        }
-        return state;
-    }
-
-    public String getName() {
-        return mName;
-    }
-
-    public int getTransition() {
-        return mTransition;
-    }
-
-    public int getTransitionStyle() {
-        return mTransitionStyle;
-    }
-
-    public boolean isEmpty() {
-        return mNumOp == 0;
-    }
-
-    /**
-     * When custom fragment transitions are used, this sets up the state for each transition
-     * and begins the transition. A different transition is started for each fragment container
-     * and consists of up to 3 different transitions: the exit transition, a shared element
-     * transition and an enter transition.
-     *
-     * <p>The exit transition operates against the leaf nodes of the first fragment
-     * with a view that was removed. If no such fragment was removed, then no exit
-     * transition is executed. The exit transition comes from the outgoing fragment.</p>
-     *
-     * <p>The enter transition operates against the last fragment that was added. If
-     * that fragment does not have a view or no fragment was added, then no enter
-     * transition is executed. The enter transition comes from the incoming fragment.</p>
-     *
-     * <p>The shared element transition operates against all views and comes either
-     * from the outgoing fragment or the incoming fragment, depending on whether this
-     * is going forward or popping the back stack. When going forward, the incoming
-     * fragment's enter shared element transition is used, but when going back, the
-     * outgoing fragment's return shared element transition is used. Shared element
-     * transitions only operate if there is both an incoming and outgoing fragment.</p>
-     *
-     * @param firstOutFragments The list of first fragments to be removed, keyed on the
-     *                          container ID.
-     * @param lastInFragments The list of last fragments to be added, keyed on the
-     *                        container ID.
-     * @param isBack true if this is popping the back stack or false if this is a
-     *               forward operation.
-     * @return The TransitionState used to complete the operation of the transition
-     * in {@link #setNameOverrides(BackStackRecord.TransitionState, java.util.ArrayList,
-     * java.util.ArrayList)}.
-     */
-    private TransitionState beginTransition(SparseArray<Fragment> firstOutFragments,
-            SparseArray<Fragment> lastInFragments, boolean isBack) {
-        TransitionState state = new TransitionState();
-
-        // Adding a non-existent target view makes sure that the transitions don't target
-        // any views by default. They'll only target the views we tell add. If we don't
-        // add any, then no views will be targeted.
-        state.nonExistentView = new View(mManager.mHost.getContext());
-
-        boolean anyTransitionStarted = false;
-        // Go over all leaving fragments.
-        for (int i = 0; i < firstOutFragments.size(); i++) {
-            int containerId = firstOutFragments.keyAt(i);
-            if (configureTransitions(containerId, state, isBack, firstOutFragments,
-                    lastInFragments)) {
-                anyTransitionStarted = true;
-            }
-        }
-
-        // Now go over all entering fragments that didn't have a leaving fragment.
-        for (int i = 0; i < lastInFragments.size(); i++) {
-            int containerId = lastInFragments.keyAt(i);
-            if (firstOutFragments.get(containerId) == null &&
-                configureTransitions(containerId, state, isBack, firstOutFragments,
-                        lastInFragments)) {
-                anyTransitionStarted = true;
-            }
-        }
-
-        if (!anyTransitionStarted) {
-            state = null;
-        }
-
-        return state;
-    }
-
-    private static Object getEnterTransition(Fragment inFragment, boolean isBack) {
-        if (inFragment == null) {
-            return null;
-        }
-        return FragmentTransitionCompat21.cloneTransition(isBack ?
-                inFragment.getReenterTransition() : inFragment.getEnterTransition());
-    }
-
-    private static Object getExitTransition(Fragment outFragment, boolean isBack) {
-        if (outFragment == null) {
-            return null;
-        }
-        return FragmentTransitionCompat21.cloneTransition(isBack ?
-                outFragment.getReturnTransition() : outFragment.getExitTransition());
-    }
-
-    private static Object getSharedElementTransition(Fragment inFragment, Fragment outFragment,
-            boolean isBack) {
-        if (inFragment == null || outFragment == null) {
-            return null;
-        }
-        return FragmentTransitionCompat21.wrapSharedElementTransition(isBack ?
-                outFragment.getSharedElementReturnTransition() :
-                inFragment.getSharedElementEnterTransition());
-    }
-
-    private static Object captureExitingViews(Object exitTransition, Fragment outFragment,
-            ArrayList<View> exitingViews, ArrayMap<String, View> namedViews, View nonExistentView) {
-        if (exitTransition != null) {
-            exitTransition = FragmentTransitionCompat21.captureExitingViews(exitTransition,
-                    outFragment.getView(), exitingViews, namedViews, nonExistentView);
-        }
-        return exitTransition;
-    }
-
-    private ArrayMap<String, View> remapSharedElements(TransitionState state, Fragment outFragment,
-            boolean isBack) {
-        ArrayMap<String, View> namedViews = new ArrayMap<String, View>();
-        if (mSharedElementSourceNames != null) {
-            FragmentTransitionCompat21.findNamedViews(namedViews, outFragment.getView());
-            if (isBack) {
-                namedViews.retainAll(mSharedElementTargetNames);
-            } else {
-                namedViews = remapNames(mSharedElementSourceNames, mSharedElementTargetNames,
-                        namedViews);
-            }
-        }
-
-        if (isBack) {
-            if (outFragment.mEnterTransitionCallback != null) {
-                outFragment.mEnterTransitionCallback.onMapSharedElements(
-                        mSharedElementTargetNames, namedViews);
-            }
-            setBackNameOverrides(state, namedViews, false);
-        } else {
-            if (outFragment.mExitTransitionCallback != null) {
-                outFragment.mExitTransitionCallback.onMapSharedElements(
-                        mSharedElementTargetNames, namedViews);
-            }
-            setNameOverrides(state, namedViews, false);
-        }
-
-        return namedViews;
-    }
-
-    /**
-     * Configures custom transitions for a specific fragment container.
-     *
-     * @param containerId The container ID of the fragments to configure the transition for.
-     * @param state The Transition State keeping track of the executing transitions.
-     * @param firstOutFragments The list of first fragments to be removed, keyed on the
-     *                          container ID.
-     * @param lastInFragments The list of last fragments to be added, keyed on the
-     *                        container ID.
-     * @param isBack true if this is popping the back stack or false if this is a
-     *               forward operation.
-     */
-    private boolean configureTransitions(int containerId, TransitionState state, boolean isBack,
-            SparseArray<Fragment> firstOutFragments, SparseArray<Fragment> lastInFragments) {
-        ViewGroup sceneRoot = (ViewGroup) mManager.mContainer.onFindViewById(containerId);
-        if (sceneRoot == null) {
-            return false;
-        }
-        final Fragment inFragment = lastInFragments.get(containerId);
-        Fragment outFragment = firstOutFragments.get(containerId);
-
-        Object enterTransition = getEnterTransition(inFragment, isBack);
-        Object sharedElementTransition = getSharedElementTransition(inFragment, outFragment,
-                isBack);
-        Object exitTransition = getExitTransition(outFragment, isBack);
-        ArrayMap<String, View> namedViews = null;
-        ArrayList<View> sharedElementTargets = new ArrayList<View>();
-        if (sharedElementTransition != null) {
-            namedViews = remapSharedElements(state, outFragment, isBack);
-            if (namedViews.isEmpty()) {
-                sharedElementTransition = null;
-                namedViews = null;
-            } else {
-                // Notify the start of the transition.
-                SharedElementCallback callback = isBack ?
-                        outFragment.mEnterTransitionCallback :
-                        inFragment.mEnterTransitionCallback;
-                if (callback != null) {
-                    ArrayList<String> names = new ArrayList<String>(namedViews.keySet());
-                    ArrayList<View> views = new ArrayList<View>(namedViews.values());
-                    callback.onSharedElementStart(names, views, null);
-                }
-                prepareSharedElementTransition(state, sceneRoot, sharedElementTransition,
-                        inFragment, outFragment, isBack, sharedElementTargets, enterTransition,
-                        exitTransition);
-            }
-        }
-        if (enterTransition == null && sharedElementTransition == null &&
-                exitTransition == null) {
-            return false; // no transitions!
-        }
-
-        ArrayList<View> exitingViews = new ArrayList<View>();
-        exitTransition = captureExitingViews(exitTransition, outFragment, exitingViews,
-                namedViews, state.nonExistentView);
-
-        // Set the epicenter of the exit transition
-        if (mSharedElementTargetNames != null && namedViews != null) {
-            View epicenterView = namedViews.get(mSharedElementTargetNames.get(0));
-            if (epicenterView != null) {
-                if (exitTransition != null) {
-                    FragmentTransitionCompat21.setEpicenter(exitTransition, epicenterView);
-                }
-                if (sharedElementTransition != null) {
-                    FragmentTransitionCompat21.setEpicenter(sharedElementTransition,
-                            epicenterView);
-                }
-            }
-        }
-
-        FragmentTransitionCompat21.ViewRetriever viewRetriever =
-                new FragmentTransitionCompat21.ViewRetriever() {
-                    @Override
-                    public View getView() {
-                        return inFragment.getView();
-                    }
-                };
-
-        ArrayList<View> enteringViews = new ArrayList<View>();
-        ArrayMap<String, View> renamedViews = new ArrayMap<String, View>();
-
-        boolean allowOverlap = true;
-        if (inFragment != null) {
-            allowOverlap = isBack ? inFragment.getAllowReturnTransitionOverlap() :
-                    inFragment.getAllowEnterTransitionOverlap();
-        }
-        Object transition = FragmentTransitionCompat21.mergeTransitions(enterTransition,
-                exitTransition, sharedElementTransition, allowOverlap);
-
-        if (transition != null) {
-            FragmentTransitionCompat21.addTransitionTargets(enterTransition,
-                    sharedElementTransition, exitTransition, sceneRoot, viewRetriever,
-                    state.nonExistentView, state.enteringEpicenterView, state.nameOverrides,
-                    enteringViews, exitingViews, namedViews, renamedViews, sharedElementTargets);
-            excludeHiddenFragmentsAfterEnter(sceneRoot, state, containerId, transition);
-
-            // We want to exclude hidden views later, so we need a non-null list in the
-            // transition now.
-            FragmentTransitionCompat21.excludeTarget(transition, state.nonExistentView, true);
-            // Now exclude all currently hidden fragments.
-            excludeHiddenFragments(state, containerId, transition);
-
-            FragmentTransitionCompat21.beginDelayedTransition(sceneRoot, transition);
-
-            FragmentTransitionCompat21.cleanupTransitions(sceneRoot, state.nonExistentView,
-                    enterTransition, enteringViews, exitTransition, exitingViews,
-                    sharedElementTransition, sharedElementTargets,
-                    transition, state.hiddenFragmentViews, renamedViews);
-        }
-        return transition != null;
-    }
-
-    private void prepareSharedElementTransition(final TransitionState state, final View sceneRoot,
-            final Object sharedElementTransition, final Fragment inFragment,
-            final Fragment outFragment, final boolean isBack,
-            final ArrayList<View> sharedElementTargets, final Object enterTransition,
-            final Object exitTransition) {
-        if (sharedElementTransition != null) {
-            sceneRoot.getViewTreeObserver().addOnPreDrawListener(
-                    new ViewTreeObserver.OnPreDrawListener() {
-                @Override
-                public boolean onPreDraw() {
-                    sceneRoot.getViewTreeObserver().removeOnPreDrawListener(this);
-
-                    // Remove the exclude for the shared elements from the exiting fragment.
-                    FragmentTransitionCompat21.removeTargets(sharedElementTransition,
-                            sharedElementTargets);
-                    // keep the nonExistentView as excluded so the list doesn't get emptied
-                    sharedElementTargets.remove(state.nonExistentView);
-                    FragmentTransitionCompat21.excludeSharedElementViews(enterTransition,
-                            exitTransition, sharedElementTransition, sharedElementTargets, false);
-                    sharedElementTargets.clear();
-
-                    ArrayMap<String, View> namedViews = mapSharedElementsIn(
-                            state, isBack, inFragment);
-                    FragmentTransitionCompat21.setSharedElementTargets(sharedElementTransition,
-                            state.nonExistentView, namedViews, sharedElementTargets);
-
-                    setEpicenterIn(namedViews, state);
-
-                    callSharedElementEnd(state, inFragment, outFragment, isBack,
-                            namedViews);
-
-                    // Exclude the shared elements from the entering fragment.
-                    FragmentTransitionCompat21.excludeSharedElementViews(enterTransition,
-                            exitTransition, sharedElementTransition, sharedElementTargets, true);
-                    return true;
-                }
-            });
-        }
-    }
-
-    private void callSharedElementEnd(TransitionState state, Fragment inFragment,
-            Fragment outFragment, boolean isBack, ArrayMap<String, View> namedViews) {
-        SharedElementCallback sharedElementCallback = isBack ?
-                outFragment.mEnterTransitionCallback :
-                inFragment.mEnterTransitionCallback;
-        if (sharedElementCallback != null) {
-            ArrayList<String> names = new ArrayList<String>(namedViews.keySet());
-            ArrayList<View> views = new ArrayList<View>(namedViews.values());
-            sharedElementCallback.onSharedElementEnd(names, views, null);
-        }
-    }
-
-    private void setEpicenterIn(ArrayMap<String, View> namedViews, TransitionState state) {
-        if (mSharedElementTargetNames != null && !namedViews.isEmpty()) {
-            // now we know the epicenter of the entering transition.
-            View epicenter = namedViews
-                    .get(mSharedElementTargetNames.get(0));
-            if (epicenter != null) {
-                state.enteringEpicenterView.epicenter = epicenter;
-            }
-        }
-    }
-
-    private ArrayMap<String, View> mapSharedElementsIn(TransitionState state,
-            boolean isBack, Fragment inFragment) {
-        // Now map the shared elements in the incoming fragment
-        ArrayMap<String, View> namedViews = mapEnteringSharedElements(state, inFragment, isBack);
-
-        // remap shared elements and set the name mapping used
-        // in the shared element transition.
-        if (isBack) {
-            if (inFragment.mExitTransitionCallback != null) {
-                inFragment.mExitTransitionCallback.onMapSharedElements(
-                        mSharedElementTargetNames, namedViews);
-            }
-            setBackNameOverrides(state, namedViews, true);
-        } else {
-            if (inFragment.mEnterTransitionCallback != null) {
-                inFragment.mEnterTransitionCallback.onMapSharedElements(
-                        mSharedElementTargetNames, namedViews);
-            }
-            setNameOverrides(state, namedViews, true);
-        }
-        return namedViews;
-    }
-
-    /**
-     * Remaps a name-to-View map, substituting different names for keys.
-     *
-     * @param inMap A list of keys found in the map, in the order in toGoInMap
-     * @param toGoInMap A list of keys to use for the new map, in the order of inMap
-     * @param namedViews The current mapping
-     * @return A copy of namedViews with the keys coming from toGoInMap.
-     */
-    private static ArrayMap<String, View> remapNames(ArrayList<String> inMap,
-            ArrayList<String> toGoInMap, ArrayMap<String, View> namedViews) {
-        if (namedViews.isEmpty()) {
-            return namedViews;
-        }
-        ArrayMap<String, View> remappedViews = new ArrayMap<String, View>();
-        int numKeys = inMap.size();
-        for (int i = 0; i < numKeys; i++) {
-            View view = namedViews.get(inMap.get(i));
-            if (view != null) {
-                remappedViews.put(toGoInMap.get(i), view);
-            }
-        }
-        return remappedViews;
-    }
-
-    /**
-     * Maps shared elements to views in the entering fragment.
-     *
-     * @param state The transition State as returned from {@link #beginTransition(
-     * android.util.SparseArray, android.util.SparseArray, boolean)}.
-     * @param inFragment The last fragment to be added.
-     * @param isBack true if this is popping the back stack or false if this is a
-     *               forward operation.
-     */
-    private ArrayMap<String, View> mapEnteringSharedElements(TransitionState state,
-            Fragment inFragment, boolean isBack) {
-        ArrayMap<String, View> namedViews = new ArrayMap<String, View>();
-        View root = inFragment.getView();
-        if (root != null) {
-            if (mSharedElementSourceNames != null) {
-                FragmentTransitionCompat21.findNamedViews(namedViews, root);
-                if (isBack) {
-                    namedViews = remapNames(mSharedElementSourceNames,
-                            mSharedElementTargetNames, namedViews);
-                } else {
-                    namedViews.retainAll(mSharedElementTargetNames);
-                }
-            }
-        }
-        return namedViews;
-    }
-
-    private void excludeHiddenFragmentsAfterEnter(final View sceneRoot, final TransitionState state,
-            final int containerId, final Object transition) {
-        sceneRoot.getViewTreeObserver().addOnPreDrawListener(
-                new ViewTreeObserver.OnPreDrawListener() {
-            public boolean onPreDraw() {
-                sceneRoot.getViewTreeObserver().removeOnPreDrawListener(this);
-                excludeHiddenFragments(state, containerId, transition);
-                return true;
-            }
-        });
-    }
-
-    private void excludeHiddenFragments(TransitionState state, int containerId, Object transition) {
-        if (mManager.mAdded != null) {
-            for (int i = 0; i < mManager.mAdded.size(); i++) {
-                Fragment fragment = mManager.mAdded.get(i);
-                if (fragment.mView != null && fragment.mContainer != null &&
-                        fragment.mContainerId == containerId) {
-                    if (fragment.mHidden) {
-                        if (!state.hiddenFragmentViews.contains(fragment.mView)) {
-                            FragmentTransitionCompat21.excludeTarget(transition, fragment.mView,
-                                    true);
-                            state.hiddenFragmentViews.add(fragment.mView);
-                        }
-                    } else {
-                        FragmentTransitionCompat21.excludeTarget(transition, fragment.mView,
-                                false);
-                        state.hiddenFragmentViews.remove(fragment.mView);
-                    }
-                }
-            }
-        }
-    }
-
-    private static void setNameOverride(ArrayMap<String, String> overrides,
-            String source, String target) {
-        if (source != null && target != null) {
-            for (int index = 0; index < overrides.size(); index++) {
-                if (source.equals(overrides.valueAt(index))) {
-                    overrides.setValueAt(index, target);
-                    return;
-                }
-            }
-            overrides.put(source, target);
-        }
-    }
-
-    private static void setNameOverrides(TransitionState state, ArrayList<String> sourceNames,
-            ArrayList<String> targetNames) {
-        if (sourceNames != null) {
-            for (int i = 0; i < sourceNames.size(); i++) {
-                String source = sourceNames.get(i);
-                String target = targetNames.get(i);
-                setNameOverride(state.nameOverrides, source, target);
-            }
-        }
-    }
-
-    private void setBackNameOverrides(TransitionState state, ArrayMap<String, View> namedViews,
-            boolean isEnd) {
-        int count = mSharedElementTargetNames == null ? 0 : mSharedElementTargetNames.size();
-        for (int i = 0; i < count; i++) {
-            String source = mSharedElementSourceNames.get(i);
-            String originalTarget = mSharedElementTargetNames.get(i);
-            View view = namedViews.get(originalTarget);
-            if (view != null) {
-                String target = FragmentTransitionCompat21.getTransitionName(view);
-                if (isEnd) {
-                    setNameOverride(state.nameOverrides, source, target);
-                } else {
-                    setNameOverride(state.nameOverrides, target, source);
-                }
-            }
-        }
-    }
-
-    private void setNameOverrides(TransitionState state, ArrayMap<String, View> namedViews,
-            boolean isEnd) {
-        int count = namedViews.size();
-        for (int i = 0; i < count; i++) {
-            String source = namedViews.keyAt(i);
-            String target = FragmentTransitionCompat21.getTransitionName(namedViews.valueAt(i));
-            if (isEnd) {
-                setNameOverride(state.nameOverrides, source, target);
-            } else {
-                setNameOverride(state.nameOverrides, target, source);
-            }
-        }
-    }
-
-    public class TransitionState {
-        public ArrayMap<String, String> nameOverrides = new ArrayMap<String, String>();
-        public ArrayList<View> hiddenFragmentViews = new ArrayList<View>();
-
-        public FragmentTransitionCompat21.EpicenterView enteringEpicenterView =
-                new FragmentTransitionCompat21.EpicenterView();
-        public View nonExistentView;
-    }
-}
diff --git a/v4/java/android/support/v4/app/BundleCompat.java b/v4/java/android/support/v4/app/BundleCompat.java
deleted file mode 100644
index 9c54e0c..0000000
--- a/v4/java/android/support/v4/app/BundleCompat.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.v4.app;
-
-import android.os.Build;
-import android.os.Bundle;
-import android.os.IBinder;
-
-/**
- * Helper for accessing features in {@link Bundle}
- * introduced after API level 4 in a backwards compatible fashion.
- */
-public final class BundleCompat {
-
-    private BundleCompat() {}
-
-    /**
-     * A convenience method to handle getting an {@link IBinder} inside a {@link Bundle} for all
-     * Android versions.
-     * @param bundle The bundle to get the {@link IBinder}.
-     * @param key    The key to use while getting the {@link IBinder}.
-     * @return       The {@link IBinder} that was obtained.
-     */
-    public static IBinder getBinder(Bundle bundle, String key) {
-        if (Build.VERSION.SDK_INT >= 18) {
-            return BundleCompatJellybeanMR2.getBinder(bundle, key);
-        } else {
-            return BundleCompatDonut.getBinder(bundle, key);
-        }
-    }
-
-    /**
-     * A convenience method to handle putting an {@link IBinder} inside a {@link Bundle} for all
-     * Android versions.
-     * @param bundle The bundle to insert the {@link IBinder}.
-     * @param key    The key to use while putting the {@link IBinder}.
-     * @param binder The {@link IBinder} to put.
-     */
-    public static void putBinder(Bundle bundle, String key, IBinder binder) {
-        if (Build.VERSION.SDK_INT >= 18) {
-            BundleCompatJellybeanMR2.putBinder(bundle, key, binder);
-        } else {
-            BundleCompatDonut.putBinder(bundle, key, binder);
-        }
-    }
-}
diff --git a/v4/java/android/support/v4/app/DialogFragment.java b/v4/java/android/support/v4/app/DialogFragment.java
deleted file mode 100644
index 4eadf5e..0000000
--- a/v4/java/android/support/v4/app/DialogFragment.java
+++ /dev/null
@@ -1,463 +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 android.support.v4.app;
-
-import android.app.Activity;
-import android.app.Dialog;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.os.Bundle;
-import android.support.annotation.IntDef;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.annotation.StyleRes;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.Window;
-import android.view.WindowManager;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- * Static library support version of the framework's {@link android.app.DialogFragment}.
- * Used to write apps that run on platforms prior to Android 3.0.  When running
- * on Android 3.0 or above, this implementation is still used; it does not try
- * to switch to the framework's implementation.  See the framework SDK
- * documentation for a class overview.
- */
-public class DialogFragment extends Fragment
-        implements DialogInterface.OnCancelListener, DialogInterface.OnDismissListener {
-
-    /** @hide */
-    @IntDef({STYLE_NORMAL, STYLE_NO_TITLE, STYLE_NO_FRAME, STYLE_NO_INPUT})
-    @Retention(RetentionPolicy.SOURCE)
-    private @interface DialogStyle {}
-
-    /**
-     * Style for {@link #setStyle(int, int)}: a basic,
-     * normal dialog.
-     */
-    public static final int STYLE_NORMAL = 0;
-
-    /**
-     * Style for {@link #setStyle(int, int)}: don't include
-     * a title area.
-     */
-    public static final int STYLE_NO_TITLE = 1;
-
-    /**
-     * Style for {@link #setStyle(int, int)}: don't draw
-     * any frame at all; the view hierarchy returned by {@link #onCreateView}
-     * is entirely responsible for drawing the dialog.
-     */
-    public static final int STYLE_NO_FRAME = 2;
-
-    /**
-     * Style for {@link #setStyle(int, int)}: like
-     * {@link #STYLE_NO_FRAME}, but also disables all input to the dialog.
-     * The user can not touch it, and its window will not receive input focus.
-     */
-    public static final int STYLE_NO_INPUT = 3;
-
-    private static final String SAVED_DIALOG_STATE_TAG = "android:savedDialogState";
-    private static final String SAVED_STYLE = "android:style";
-    private static final String SAVED_THEME = "android:theme";
-    private static final String SAVED_CANCELABLE = "android:cancelable";
-    private static final String SAVED_SHOWS_DIALOG = "android:showsDialog";
-    private static final String SAVED_BACK_STACK_ID = "android:backStackId";
-
-    int mStyle = STYLE_NORMAL;
-    int mTheme = 0;
-    boolean mCancelable = true;
-    boolean mShowsDialog = true;
-    int mBackStackId = -1;
-
-    Dialog mDialog;
-    boolean mViewDestroyed;
-    boolean mDismissed;
-    boolean mShownByMe;
-
-    public DialogFragment() {
-    }
-
-    /**
-     * Call to customize the basic appearance and behavior of the
-     * fragment's dialog.  This can be used for some common dialog behaviors,
-     * taking care of selecting flags, theme, and other options for you.  The
-     * same effect can be achieve by manually setting Dialog and Window
-     * attributes yourself.  Calling this after the fragment's Dialog is
-     * created will have no effect.
-     *
-     * @param style Selects a standard style: may be {@link #STYLE_NORMAL},
-     * {@link #STYLE_NO_TITLE}, {@link #STYLE_NO_FRAME}, or
-     * {@link #STYLE_NO_INPUT}.
-     * @param theme Optional custom theme.  If 0, an appropriate theme (based
-     * on the style) will be selected for you.
-     */
-    public void setStyle(@DialogStyle int style, @StyleRes int theme) {
-        mStyle = style;
-        if (mStyle == STYLE_NO_FRAME || mStyle == STYLE_NO_INPUT) {
-            mTheme = android.R.style.Theme_Panel;
-        }
-        if (theme != 0) {
-            mTheme = theme;
-        }
-    }
-
-    /**
-     * Display the dialog, adding the fragment to the given FragmentManager.  This
-     * is a convenience for explicitly creating a transaction, adding the
-     * fragment to it with the given tag, and committing it.  This does
-     * <em>not</em> add the transaction to the back stack.  When the fragment
-     * is dismissed, a new transaction will be executed to remove it from
-     * the activity.
-     * @param manager The FragmentManager this fragment will be added to.
-     * @param tag The tag for this fragment, as per
-     * {@link FragmentTransaction#add(Fragment, String) FragmentTransaction.add}.
-     */
-    public void show(FragmentManager manager, String tag) {
-        mDismissed = false;
-        mShownByMe = true;
-        FragmentTransaction ft = manager.beginTransaction();
-        ft.add(this, tag);
-        ft.commit();
-    }
-
-    /**
-     * Display the dialog, adding the fragment using an existing transaction
-     * and then committing the transaction.
-     * @param transaction An existing transaction in which to add the fragment.
-     * @param tag The tag for this fragment, as per
-     * {@link FragmentTransaction#add(Fragment, String) FragmentTransaction.add}.
-     * @return Returns the identifier of the committed transaction, as per
-     * {@link FragmentTransaction#commit() FragmentTransaction.commit()}.
-     */
-    public int show(FragmentTransaction transaction, String tag) {
-        mDismissed = false;
-        mShownByMe = true;
-        transaction.add(this, tag);
-        mViewDestroyed = false;
-        mBackStackId = transaction.commit();
-        return mBackStackId;
-    }
-
-    /**
-     * Dismiss the fragment and its dialog.  If the fragment was added to the
-     * back stack, all back stack state up to and including this entry will
-     * be popped.  Otherwise, a new transaction will be committed to remove
-     * the fragment.
-     */
-    public void dismiss() {
-        dismissInternal(false);
-    }
-
-    /**
-     * Version of {@link #dismiss()} that uses
-     * {@link FragmentTransaction#commitAllowingStateLoss()
-     * FragmentTransaction.commitAllowingStateLoss()}. See linked
-     * documentation for further details.
-     */
-    public void dismissAllowingStateLoss() {
-        dismissInternal(true);
-    }
-
-    void dismissInternal(boolean allowStateLoss) {
-        if (mDismissed) {
-            return;
-        }
-        mDismissed = true;
-        mShownByMe = false;
-        if (mDialog != null) {
-            mDialog.dismiss();
-            mDialog = null;
-        }
-        mViewDestroyed = true;
-        if (mBackStackId >= 0) {
-            getFragmentManager().popBackStack(mBackStackId,
-                    FragmentManager.POP_BACK_STACK_INCLUSIVE);
-            mBackStackId = -1;
-        } else {
-            FragmentTransaction ft = getFragmentManager().beginTransaction();
-            ft.remove(this);
-            if (allowStateLoss) {
-                ft.commitAllowingStateLoss();
-            } else {
-                ft.commit();
-            }
-        }
-    }
-    
-    public Dialog getDialog() {
-        return mDialog;
-    }
-
-    @StyleRes
-    public int getTheme() {
-        return mTheme;
-    }
-
-    /**
-     * Control whether the shown Dialog is cancelable.  Use this instead of
-     * directly calling {@link Dialog#setCancelable(boolean)
-     * Dialog.setCancelable(boolean)}, because DialogFragment needs to change
-     * its behavior based on this.
-     *
-     * @param cancelable If true, the dialog is cancelable.  The default
-     * is true.
-     */
-    public void setCancelable(boolean cancelable) {
-        mCancelable = cancelable;
-        if (mDialog != null) mDialog.setCancelable(cancelable);
-    }
-
-    /**
-     * Return the current value of {@link #setCancelable(boolean)}.
-     */
-    public boolean isCancelable() {
-        return mCancelable;
-    }
-
-    /**
-     * Controls whether this fragment should be shown in a dialog.  If not
-     * set, no Dialog will be created in {@link #onActivityCreated(Bundle)},
-     * and the fragment's view hierarchy will thus not be added to it.  This
-     * allows you to instead use it as a normal fragment (embedded inside of
-     * its activity).
-     *
-     * <p>This is normally set for you based on whether the fragment is
-     * associated with a container view ID passed to
-     * {@link FragmentTransaction#add(int, Fragment) FragmentTransaction.add(int, Fragment)}.
-     * If the fragment was added with a container, setShowsDialog will be
-     * initialized to false; otherwise, it will be true.
-     *
-     * @param showsDialog If true, the fragment will be displayed in a Dialog.
-     * If false, no Dialog will be created and the fragment's view hierarchly
-     * left undisturbed.
-     */
-    public void setShowsDialog(boolean showsDialog) {
-        mShowsDialog = showsDialog;
-    }
-
-    /**
-     * Return the current value of {@link #setShowsDialog(boolean)}.
-     */
-    public boolean getShowsDialog() {
-        return mShowsDialog;
-    }
-
-    @Override
-    public void onAttach(Context context) {
-        super.onAttach(context);
-        if (!mShownByMe) {
-            // If not explicitly shown through our API, take this as an
-            // indication that the dialog is no longer dismissed.
-            mDismissed = false;
-        }
-    }
-
-    @Override
-    public void onDetach() {
-        super.onDetach();
-        if (!mShownByMe && !mDismissed) {
-            // The fragment was not shown by a direct call here, it is not
-            // dismissed, and now it is being detached...  well, okay, thou
-            // art now dismissed.  Have fun.
-            mDismissed = true;
-        }
-    }
-
-    @Override
-    public void onCreate(@Nullable Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-
-        mShowsDialog = mContainerId == 0;
-
-        if (savedInstanceState != null) {
-            mStyle = savedInstanceState.getInt(SAVED_STYLE, STYLE_NORMAL);
-            mTheme = savedInstanceState.getInt(SAVED_THEME, 0);
-            mCancelable = savedInstanceState.getBoolean(SAVED_CANCELABLE, true);
-            mShowsDialog = savedInstanceState.getBoolean(SAVED_SHOWS_DIALOG, mShowsDialog);
-            mBackStackId = savedInstanceState.getInt(SAVED_BACK_STACK_ID, -1);
-        }
-    }
-
-    /** @hide */
-    @Override
-    public LayoutInflater getLayoutInflater(Bundle savedInstanceState) {
-        if (!mShowsDialog) {
-            return super.getLayoutInflater(savedInstanceState);
-        }
-
-        mDialog = onCreateDialog(savedInstanceState);
-
-        if (mDialog != null) {
-            setupDialog(mDialog, mStyle);
-
-            return (LayoutInflater) mDialog.getContext().getSystemService(
-                    Context.LAYOUT_INFLATER_SERVICE);
-        }
-        return (LayoutInflater) mHost.getContext().getSystemService(
-                Context.LAYOUT_INFLATER_SERVICE);
-    }
-
-    /** @hide */
-    public void setupDialog(Dialog dialog, int style) {
-        switch (style) {
-            case STYLE_NO_INPUT:
-                dialog.getWindow().addFlags(
-                        WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
-                                WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
-                // fall through...
-            case STYLE_NO_FRAME:
-            case STYLE_NO_TITLE:
-                dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
-        }
-    }
-    
-    /**
-     * Override to build your own custom Dialog container.  This is typically
-     * used to show an AlertDialog instead of a generic Dialog; when doing so,
-     * {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)} does not need
-     * to be implemented since the AlertDialog takes care of its own content.
-     * 
-     * <p>This method will be called after {@link #onCreate(Bundle)} and
-     * before {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)}.  The
-     * default implementation simply instantiates and returns a {@link Dialog}
-     * class.
-     * 
-     * <p><em>Note: DialogFragment own the {@link Dialog#setOnCancelListener
-     * Dialog.setOnCancelListener} and {@link Dialog#setOnDismissListener
-     * Dialog.setOnDismissListener} callbacks.  You must not set them yourself.</em>
-     * To find out about these events, override {@link #onCancel(DialogInterface)}
-     * and {@link #onDismiss(DialogInterface)}.</p>
-     * 
-     * @param savedInstanceState The last saved instance state of the Fragment,
-     * or null if this is a freshly created Fragment.
-     * 
-     * @return Return a new Dialog instance to be displayed by the Fragment.
-     */
-    @NonNull
-    public Dialog onCreateDialog(Bundle savedInstanceState) {
-        return new Dialog(getActivity(), getTheme());
-    }
-
-    public void onCancel(DialogInterface dialog) {
-    }
-
-    public void onDismiss(DialogInterface dialog) {
-        if (!mViewDestroyed) {
-            // Note: we need to use allowStateLoss, because the dialog
-            // dispatches this asynchronously so we can receive the call
-            // after the activity is paused.  Worst case, when the user comes
-            // back to the activity they see the dialog again.
-            dismissInternal(true);
-        }
-    }
-
-    @Override
-    public void onActivityCreated(Bundle savedInstanceState) {
-        super.onActivityCreated(savedInstanceState);
-
-        if (!mShowsDialog) {
-            return;
-        }
-
-        View view = getView();
-        if (view != null) {
-            if (view.getParent() != null) {
-                throw new IllegalStateException(
-                        "DialogFragment can not be attached to a container view");
-            }
-            mDialog.setContentView(view);
-        }
-        final Activity activity = getActivity();
-        if (activity != null) {
-            mDialog.setOwnerActivity(activity);
-        }
-        mDialog.setCancelable(mCancelable);
-        mDialog.setOnCancelListener(this);
-        mDialog.setOnDismissListener(this);
-        if (savedInstanceState != null) {
-            Bundle dialogState = savedInstanceState.getBundle(SAVED_DIALOG_STATE_TAG);
-            if (dialogState != null) {
-                mDialog.onRestoreInstanceState(dialogState);
-            }
-        }
-    }
-
-    @Override
-    public void onStart() {
-        super.onStart();
-
-        if (mDialog != null) {
-            mViewDestroyed = false;
-            mDialog.show();
-        }
-    }
-
-    @Override
-    public void onSaveInstanceState(Bundle outState) {
-        super.onSaveInstanceState(outState);
-        if (mDialog != null) {
-            Bundle dialogState = mDialog.onSaveInstanceState();
-            if (dialogState != null) {
-                outState.putBundle(SAVED_DIALOG_STATE_TAG, dialogState);
-            }
-        }
-        if (mStyle != STYLE_NORMAL) {
-            outState.putInt(SAVED_STYLE, mStyle);
-        }
-        if (mTheme != 0) {
-            outState.putInt(SAVED_THEME, mTheme);
-        }
-        if (!mCancelable) {
-            outState.putBoolean(SAVED_CANCELABLE, mCancelable);
-        }
-        if (!mShowsDialog) {
-            outState.putBoolean(SAVED_SHOWS_DIALOG, mShowsDialog);
-        }
-        if (mBackStackId != -1) {
-            outState.putInt(SAVED_BACK_STACK_ID, mBackStackId);
-        }
-    }
-
-    @Override
-    public void onStop() {
-        super.onStop();
-        if (mDialog != null) {
-            mDialog.hide();
-        }
-    }
-
-    /**
-     * Remove dialog.
-     */
-    @Override
-    public void onDestroyView() {
-        super.onDestroyView();
-        if (mDialog != null) {
-            // Set removed here because this dismissal is just to hide
-            // the dialog -- we don't want this to cause the fragment to
-            // actually be removed.
-            mViewDestroyed = true;
-            mDialog.dismiss();
-            mDialog = null;
-        }
-    }
-}
diff --git a/v4/java/android/support/v4/app/Fragment.java b/v4/java/android/support/v4/app/Fragment.java
deleted file mode 100644
index 1ee0236..0000000
--- a/v4/java/android/support/v4/app/Fragment.java
+++ /dev/null
@@ -1,2345 +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 android.support.v4.app;
-
-import android.app.Activity;
-import android.content.ComponentCallbacks;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentSender;
-import android.content.res.Configuration;
-import android.content.res.Resources;
-import android.os.Bundle;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.support.annotation.CallSuper;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.annotation.StringRes;
-import android.support.v4.util.SimpleArrayMap;
-import android.support.v4.util.DebugUtils;
-import android.support.v4.view.LayoutInflaterCompat;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.util.SparseArray;
-import android.view.ContextMenu;
-import android.view.LayoutInflater;
-import android.view.Menu;
-import android.view.MenuInflater;
-import android.view.MenuItem;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.ContextMenu.ContextMenuInfo;
-import android.view.View.OnCreateContextMenuListener;
-import android.view.animation.Animation;
-import android.widget.AdapterView;
-
-import java.io.FileDescriptor;
-import java.io.PrintWriter;
-
-final class FragmentState implements Parcelable {
-    final String mClassName;
-    final int mIndex;
-    final boolean mFromLayout;
-    final int mFragmentId;
-    final int mContainerId;
-    final String mTag;
-    final boolean mRetainInstance;
-    final boolean mDetached;
-    final Bundle mArguments;
-    final boolean mHidden;
-    
-    Bundle mSavedFragmentState;
-    
-    Fragment mInstance;
-
-    public FragmentState(Fragment frag) {
-        mClassName = frag.getClass().getName();
-        mIndex = frag.mIndex;
-        mFromLayout = frag.mFromLayout;
-        mFragmentId = frag.mFragmentId;
-        mContainerId = frag.mContainerId;
-        mTag = frag.mTag;
-        mRetainInstance = frag.mRetainInstance;
-        mDetached = frag.mDetached;
-        mArguments = frag.mArguments;
-        mHidden = frag.mHidden;
-    }
-    
-    public FragmentState(Parcel in) {
-        mClassName = in.readString();
-        mIndex = in.readInt();
-        mFromLayout = in.readInt() != 0;
-        mFragmentId = in.readInt();
-        mContainerId = in.readInt();
-        mTag = in.readString();
-        mRetainInstance = in.readInt() != 0;
-        mDetached = in.readInt() != 0;
-        mArguments = in.readBundle();
-        mHidden = in.readInt() != 0;
-        mSavedFragmentState = in.readBundle();
-    }
-
-    public Fragment instantiate(FragmentHostCallback host, Fragment parent,
-            FragmentManagerNonConfig childNonConfig) {
-        if (mInstance == null) {
-            final Context context = host.getContext();
-            if (mArguments != null) {
-                mArguments.setClassLoader(context.getClassLoader());
-            }
-
-            mInstance = Fragment.instantiate(context, mClassName, mArguments);
-
-            if (mSavedFragmentState != null) {
-                mSavedFragmentState.setClassLoader(context.getClassLoader());
-                mInstance.mSavedFragmentState = mSavedFragmentState;
-            }
-            mInstance.setIndex(mIndex, parent);
-            mInstance.mFromLayout = mFromLayout;
-            mInstance.mRestored = true;
-            mInstance.mFragmentId = mFragmentId;
-            mInstance.mContainerId = mContainerId;
-            mInstance.mTag = mTag;
-            mInstance.mRetainInstance = mRetainInstance;
-            mInstance.mDetached = mDetached;
-            mInstance.mHidden = mHidden;
-            mInstance.mFragmentManager = host.mFragmentManager;
-
-            if (FragmentManagerImpl.DEBUG) Log.v(FragmentManagerImpl.TAG,
-                    "Instantiated fragment " + mInstance);
-        }
-        mInstance.mChildNonConfig = childNonConfig;
-        return mInstance;
-    }
-
-    public int describeContents() {
-        return 0;
-    }
-
-    public void writeToParcel(Parcel dest, int flags) {
-        dest.writeString(mClassName);
-        dest.writeInt(mIndex);
-        dest.writeInt(mFromLayout ? 1 : 0);
-        dest.writeInt(mFragmentId);
-        dest.writeInt(mContainerId);
-        dest.writeString(mTag);
-        dest.writeInt(mRetainInstance ? 1 : 0);
-        dest.writeInt(mDetached ? 1 : 0);
-        dest.writeBundle(mArguments);
-        dest.writeInt(mHidden? 1 : 0);
-        dest.writeBundle(mSavedFragmentState);
-    }
-    
-    public static final Parcelable.Creator<FragmentState> CREATOR
-            = new Parcelable.Creator<FragmentState>() {
-        public FragmentState createFromParcel(Parcel in) {
-            return new FragmentState(in);
-        }
-        
-        public FragmentState[] newArray(int size) {
-            return new FragmentState[size];
-        }
-    };
-}
-
-/**
- * Static library support version of the framework's {@link android.app.Fragment}.
- * Used to write apps that run on platforms prior to Android 3.0.  When running
- * on Android 3.0 or above, this implementation is still used; it does not try
- * to switch to the framework's implementation. See the framework {@link android.app.Fragment}
- * documentation for a class overview.
- *
- * <p>The main differences when using this support version instead of the framework version are:
- * <ul>
- *  <li>Your activity must extend {@link FragmentActivity}
- *  <li>You must call {@link FragmentActivity#getSupportFragmentManager} to get the
- *  {@link FragmentManager}
- * </ul>
- *
- */
-public class Fragment implements ComponentCallbacks, OnCreateContextMenuListener {
-    private static final SimpleArrayMap<String, Class<?>> sClassMap =
-            new SimpleArrayMap<String, Class<?>>();
-
-    static final Object USE_DEFAULT_TRANSITION = new Object();
-
-    static final int INITIALIZING = 0;     // Not yet created.
-    static final int CREATED = 1;          // Created.
-    static final int ACTIVITY_CREATED = 2; // The activity has finished its creation.
-    static final int STOPPED = 3;          // Fully created, not started.
-    static final int STARTED = 4;          // Created and started, not resumed.
-    static final int RESUMED = 5;          // Created started and resumed.
-    
-    int mState = INITIALIZING;
-    
-    // Non-null if the fragment's view hierarchy is currently animating away,
-    // meaning we need to wait a bit on completely destroying it.  This is the
-    // view that is animating.
-    View mAnimatingAway;
-
-    // If mAnimatingAway != null, this is the state we should move to once the
-    // animation is done.
-    int mStateAfterAnimating;
-
-    // When instantiated from saved state, this is the saved state.
-    Bundle mSavedFragmentState;
-    SparseArray<Parcelable> mSavedViewState;
-    
-    // Index into active fragment array.
-    int mIndex = -1;
-    
-    // Internal unique name for this fragment;
-    String mWho;
-    
-    // Construction arguments;
-    Bundle mArguments;
-
-    // Target fragment.
-    Fragment mTarget;
-
-    // For use when retaining a fragment: this is the index of the last mTarget.
-    int mTargetIndex = -1;
-
-    // Target request code.
-    int mTargetRequestCode;
-
-    // True if the fragment is in the list of added fragments.
-    boolean mAdded;
-    
-    // If set this fragment is being removed from its activity.
-    boolean mRemoving;
-    
-    // Set to true if this fragment was instantiated from a layout file.
-    boolean mFromLayout;
-    
-    // Set to true when the view has actually been inflated in its layout.
-    boolean mInLayout;
-
-    // True if this fragment has been restored from previously saved state.
-    boolean mRestored;
-
-    // Number of active back stack entries this fragment is in.
-    int mBackStackNesting;
-
-    // The fragment manager we are associated with.  Set as soon as the
-    // fragment is used in a transaction; cleared after it has been removed
-    // from all transactions.
-    FragmentManagerImpl mFragmentManager;
-
-    // Host this fragment is attached to.
-    FragmentHostCallback mHost;
-
-    // Private fragment manager for child fragments inside of this one.
-    FragmentManagerImpl mChildFragmentManager;
-
-    // For use when restoring fragment state and descendant fragments are retained.
-    // This state is set by FragmentState.instantiate and cleared in onCreate.
-    FragmentManagerNonConfig mChildNonConfig;
-
-    // If this Fragment is contained in another Fragment, this is that container.
-    Fragment mParentFragment;
-
-    // The optional identifier for this fragment -- either the container ID if it
-    // was dynamically added to the view hierarchy, or the ID supplied in
-    // layout.
-    int mFragmentId;
-    
-    // When a fragment is being dynamically added to the view hierarchy, this
-    // is the identifier of the parent container it is being added to.
-    int mContainerId;
-    
-    // The optional named tag for this fragment -- usually used to find
-    // fragments that are not part of the layout.
-    String mTag;
-    
-    // Set to true when the app has requested that this fragment be hidden
-    // from the user.
-    boolean mHidden;
-    
-    // Set to true when the app has requested that this fragment be deactivated.
-    boolean mDetached;
-
-    // If set this fragment would like its instance retained across
-    // configuration changes.
-    boolean mRetainInstance;
-
-    // If set this fragment is being retained across the current config change.
-    boolean mRetaining;
-    
-    // If set this fragment has menu items to contribute.
-    boolean mHasMenu;
-
-    // Set to true to allow the fragment's menu to be shown.
-    boolean mMenuVisible = true;
-
-    // Used to verify that subclasses call through to super class.
-    boolean mCalled;
-    
-    // If app has requested a specific animation, this is the one to use.
-    int mNextAnim;
-    
-    // The parent container of the fragment after dynamically added to UI.
-    ViewGroup mContainer;
-    
-    // The View generated for this fragment.
-    View mView;
-    
-    // The real inner view that will save/restore state.
-    View mInnerView;
-
-    // Whether this fragment should defer starting until after other fragments
-    // have been started and their loaders are finished.
-    boolean mDeferStart;
-    
-    // Hint provided by the app that this fragment is currently visible to the user.
-    boolean mUserVisibleHint = true;
-
-    LoaderManagerImpl mLoaderManager;
-    boolean mLoadersStarted;
-    boolean mCheckedForLoaderManager;
-
-    Object mEnterTransition = null;
-    Object mReturnTransition = USE_DEFAULT_TRANSITION;
-    Object mExitTransition = null;
-    Object mReenterTransition = USE_DEFAULT_TRANSITION;
-    Object mSharedElementEnterTransition = null;
-    Object mSharedElementReturnTransition = USE_DEFAULT_TRANSITION;
-    Boolean mAllowReturnTransitionOverlap;
-    Boolean mAllowEnterTransitionOverlap;
-
-    SharedElementCallback mEnterTransitionCallback = null;
-    SharedElementCallback mExitTransitionCallback = null;
-
-    /**
-     * State information that has been retrieved from a fragment instance
-     * through {@link FragmentManager#saveFragmentInstanceState(Fragment)
-     * FragmentManager.saveFragmentInstanceState}.
-     */
-    public static class SavedState implements Parcelable {
-        final Bundle mState;
-
-        SavedState(Bundle state) {
-            mState = state;
-        }
-
-        SavedState(Parcel in, ClassLoader loader) {
-            mState = in.readBundle();
-            if (loader != null && mState != null) {
-                mState.setClassLoader(loader);
-            }
-        }
-
-        @Override
-        public int describeContents() {
-            return 0;
-        }
-
-        @Override
-        public void writeToParcel(Parcel dest, int flags) {
-            dest.writeBundle(mState);
-        }
-
-        public static final Parcelable.Creator<SavedState> CREATOR
-                = new Parcelable.Creator<SavedState>() {
-            @Override
-            public SavedState createFromParcel(Parcel in) {
-                return new SavedState(in, null);
-            }
-
-            @Override
-            public SavedState[] newArray(int size) {
-                return new SavedState[size];
-            }
-        };
-    }
-
-    /**
-     * Thrown by {@link Fragment#instantiate(Context, String, Bundle)} when
-     * there is an instantiation failure.
-     */
-    static public class InstantiationException extends RuntimeException {
-        public InstantiationException(String msg, Exception cause) {
-            super(msg, cause);
-        }
-    }
-
-    /**
-     * Default constructor.  <strong>Every</strong> fragment must have an
-     * empty constructor, so it can be instantiated when restoring its
-     * activity's state.  It is strongly recommended that subclasses do not
-     * have other constructors with parameters, since these constructors
-     * will not be called when the fragment is re-instantiated; instead,
-     * arguments can be supplied by the caller with {@link #setArguments}
-     * and later retrieved by the Fragment with {@link #getArguments}.
-     * 
-     * <p>Applications should generally not implement a constructor.  The
-     * first place application code an run where the fragment is ready to
-     * be used is in {@link #onAttach(Activity)}, the point where the fragment
-     * is actually associated with its activity.  Some applications may also
-     * want to implement {@link #onInflate} to retrieve attributes from a
-     * layout resource, though should take care here because this happens for
-     * the fragment is attached to its activity.
-     */
-    public Fragment() {
-    }
-
-    /**
-     * Like {@link #instantiate(Context, String, Bundle)} but with a null
-     * argument Bundle.
-     */
-    public static Fragment instantiate(Context context, String fname) {
-        return instantiate(context, fname, null);
-    }
-
-    /**
-     * Create a new instance of a Fragment with the given class name.  This is
-     * the same as calling its empty constructor.
-     *
-     * @param context The calling context being used to instantiate the fragment.
-     * This is currently just used to get its ClassLoader.
-     * @param fname The class name of the fragment to instantiate.
-     * @param args Bundle of arguments to supply to the fragment, which it
-     * can retrieve with {@link #getArguments()}.  May be null.
-     * @return Returns a new fragment instance.
-     * @throws InstantiationException If there is a failure in instantiating
-     * the given fragment class.  This is a runtime exception; it is not
-     * normally expected to happen.
-     */
-    public static Fragment instantiate(Context context, String fname, @Nullable Bundle args) {
-        try {
-            Class<?> clazz = sClassMap.get(fname);
-            if (clazz == null) {
-                // Class not found in the cache, see if it's real, and try to add it
-                clazz = context.getClassLoader().loadClass(fname);
-                sClassMap.put(fname, clazz);
-            }
-            Fragment f = (Fragment)clazz.newInstance();
-            if (args != null) {
-                args.setClassLoader(f.getClass().getClassLoader());
-                f.mArguments = args;
-            }
-            return f;
-        } catch (ClassNotFoundException e) {
-            throw new InstantiationException("Unable to instantiate fragment " + fname
-                    + ": make sure class name exists, is public, and has an"
-                    + " empty constructor that is public", e);
-        } catch (java.lang.InstantiationException e) {
-            throw new InstantiationException("Unable to instantiate fragment " + fname
-                    + ": make sure class name exists, is public, and has an"
-                    + " empty constructor that is public", e);
-        } catch (IllegalAccessException e) {
-            throw new InstantiationException("Unable to instantiate fragment " + fname
-                    + ": make sure class name exists, is public, and has an"
-                    + " empty constructor that is public", e);
-        }
-    }
-
-    /**
-     * Determine if the given fragment name is a support library fragment class.
-     *
-     * @param context Context used to determine the correct ClassLoader to use
-     * @param fname Class name of the fragment to test
-     * @return true if <code>fname</code> is <code>android.support.v4.app.Fragment</code>
-     *         or a subclass, false otherwise.
-     */
-    static boolean isSupportFragmentClass(Context context, String fname) {
-        try {
-            Class<?> clazz = sClassMap.get(fname);
-            if (clazz == null) {
-                // Class not found in the cache, see if it's real, and try to add it
-                clazz = context.getClassLoader().loadClass(fname);
-                sClassMap.put(fname, clazz);
-            }
-            return Fragment.class.isAssignableFrom(clazz);
-        } catch (ClassNotFoundException e) {
-            return false;
-        }
-    }
-    
-    final void restoreViewState(Bundle savedInstanceState) {
-        if (mSavedViewState != null) {
-            mInnerView.restoreHierarchyState(mSavedViewState);
-            mSavedViewState = null;
-        }
-        mCalled = false;
-        onViewStateRestored(savedInstanceState);
-        if (!mCalled) {
-            throw new SuperNotCalledException("Fragment " + this
-                    + " did not call through to super.onViewStateRestored()");
-        }
-    }
-
-    final void setIndex(int index, Fragment parent) {
-        mIndex = index;
-        if (parent != null) {
-            mWho = parent.mWho + ":" + mIndex;
-        } else {
-            mWho = "android:fragment:" + mIndex;
-        }
-    }
-
-    final boolean isInBackStack() {
-        return mBackStackNesting > 0;
-    }
-
-    /**
-     * Subclasses can not override equals().
-     */
-    @Override final public boolean equals(Object o) {
-        return super.equals(o);
-    }
-
-    /**
-     * Subclasses can not override hashCode().
-     */
-    @Override final public int hashCode() {
-        return super.hashCode();
-    }
-    
-    @Override
-    public String toString() {
-        StringBuilder sb = new StringBuilder(128);
-        DebugUtils.buildShortClassTag(this, sb);
-        if (mIndex >= 0) {
-            sb.append(" #");
-            sb.append(mIndex);
-        }
-        if (mFragmentId != 0) {
-            sb.append(" id=0x");
-            sb.append(Integer.toHexString(mFragmentId));
-        }
-        if (mTag != null) {
-            sb.append(" ");
-            sb.append(mTag);
-        }
-        sb.append('}');
-        return sb.toString();
-    }
-    
-    /**
-     * Return the identifier this fragment is known by.  This is either
-     * the android:id value supplied in a layout or the container view ID
-     * supplied when adding the fragment.
-     */
-    final public int getId() {
-        return mFragmentId;
-    }
-    
-    /**
-     * Get the tag name of the fragment, if specified.
-     */
-    final public String getTag() {
-        return mTag;
-    }
-    
-    /**
-     * Supply the construction arguments for this fragment.  This can only
-     * be called before the fragment has been attached to its activity; that
-     * is, you should call it immediately after constructing the fragment.  The
-     * arguments supplied here will be retained across fragment destroy and
-     * creation.
-     */
-    public void setArguments(Bundle args) {
-        if (mIndex >= 0) {
-            throw new IllegalStateException("Fragment already active");
-        }
-        mArguments = args;
-    }
-
-    /**
-     * Return the arguments supplied when the fragment was instantiated,
-     * if any.
-     */
-    final public Bundle getArguments() {
-        return mArguments;
-    }
-
-    /**
-     * Set the initial saved state that this Fragment should restore itself
-     * from when first being constructed, as returned by
-     * {@link FragmentManager#saveFragmentInstanceState(Fragment)
-     * FragmentManager.saveFragmentInstanceState}.
-     *
-     * @param state The state the fragment should be restored from.
-     */
-    public void setInitialSavedState(SavedState state) {
-        if (mIndex >= 0) {
-            throw new IllegalStateException("Fragment already active");
-        }
-        mSavedFragmentState = state != null && state.mState != null
-                ? state.mState : null;
-    }
-
-    /**
-     * Optional target for this fragment.  This may be used, for example,
-     * if this fragment is being started by another, and when done wants to
-     * give a result back to the first.  The target set here is retained
-     * across instances via {@link FragmentManager#putFragment
-     * FragmentManager.putFragment()}.
-     *
-     * @param fragment The fragment that is the target of this one.
-     * @param requestCode Optional request code, for convenience if you
-     * are going to call back with {@link #onActivityResult(int, int, Intent)}.
-     */
-    public void setTargetFragment(Fragment fragment, int requestCode) {
-        mTarget = fragment;
-        mTargetRequestCode = requestCode;
-    }
-
-    /**
-     * Return the target fragment set by {@link #setTargetFragment}.
-     */
-    final public Fragment getTargetFragment() {
-        return mTarget;
-    }
-
-    /**
-     * Return the target request code set by {@link #setTargetFragment}.
-     */
-    final public int getTargetRequestCode() {
-        return mTargetRequestCode;
-    }
-
-    /**
-     * Return the {@link Context} this fragment is currently associated with.
-     */
-    public Context getContext() {
-        return mHost == null ? null : mHost.getContext();
-    }
-
-    /**
-     * Return the {@link FragmentActivity} this fragment is currently associated with.
-     * May return {@code null} if the fragment is associated with a {@link Context}
-     * instead.
-     */
-    final public FragmentActivity getActivity() {
-        return mHost == null ? null : (FragmentActivity) mHost.getActivity();
-    }
-
-    /**
-     * Return the host object of this fragment. May return {@code null} if the fragment
-     * isn't currently being hosted.
-     */
-    final public Object getHost() {
-        return mHost == null ? null : mHost.onGetHost();
-    }
-
-    /**
-     * Return <code>getActivity().getResources()</code>.
-     */
-    final public Resources getResources() {
-        if (mHost == null) {
-            throw new IllegalStateException("Fragment " + this + " not attached to Activity");
-        }
-        return mHost.getContext().getResources();
-    }
-
-    /**
-     * Return a localized, styled CharSequence from the application's package's
-     * default string table.
-     *
-     * @param resId Resource id for the CharSequence text
-     */
-    public final CharSequence getText(@StringRes int resId) {
-        return getResources().getText(resId);
-    }
-
-    /**
-     * Return a localized string from the application's package's
-     * default string table.
-     *
-     * @param resId Resource id for the string
-     */
-    public final String getString(@StringRes int resId) {
-        return getResources().getString(resId);
-    }
-
-    /**
-     * Return a localized formatted string from the application's package's
-     * default string table, substituting the format arguments as defined in
-     * {@link java.util.Formatter} and {@link java.lang.String#format}.
-     *
-     * @param resId Resource id for the format string
-     * @param formatArgs The format arguments that will be used for substitution.
-     */
-
-    public final String getString(@StringRes int resId, Object... formatArgs) {
-        return getResources().getString(resId, formatArgs);
-    }
-
-    /**
-     * Return the FragmentManager for interacting with fragments associated
-     * with this fragment's activity.  Note that this will be non-null slightly
-     * before {@link #getActivity()}, during the time from when the fragment is
-     * placed in a {@link FragmentTransaction} until it is committed and
-     * attached to its activity.
-     *
-     * <p>If this Fragment is a child of another Fragment, the FragmentManager
-     * returned here will be the parent's {@link #getChildFragmentManager()}.
-     */
-    final public FragmentManager getFragmentManager() {
-        return mFragmentManager;
-    }
-
-    /**
-     * Return a private FragmentManager for placing and managing Fragments
-     * inside of this Fragment.
-     */
-    final public FragmentManager getChildFragmentManager() {
-        if (mChildFragmentManager == null) {
-            instantiateChildFragmentManager();
-            if (mState >= RESUMED) {
-                mChildFragmentManager.dispatchResume();
-            } else if (mState >= STARTED) {
-                mChildFragmentManager.dispatchStart();
-            } else if (mState >= ACTIVITY_CREATED) {
-                mChildFragmentManager.dispatchActivityCreated();
-            } else if (mState >= CREATED) {
-                mChildFragmentManager.dispatchCreate();
-            }
-        }
-        return mChildFragmentManager;
-    }
-
-    /**
-     * Returns the parent Fragment containing this Fragment.  If this Fragment
-     * is attached directly to an Activity, returns null.
-     */
-    final public Fragment getParentFragment() {
-        return mParentFragment;
-    }
-
-    /**
-     * Return true if the fragment is currently added to its activity.
-     */
-    final public boolean isAdded() {
-        return mHost != null && mAdded;
-    }
-
-    /**
-     * Return true if the fragment has been explicitly detached from the UI.
-     * That is, {@link FragmentTransaction#detach(Fragment)
-     * FragmentTransaction.detach(Fragment)} has been used on it.
-     */
-    final public boolean isDetached() {
-        return mDetached;
-    }
-
-    /**
-     * Return true if this fragment is currently being removed from its
-     * activity.  This is  <em>not</em> whether its activity is finishing, but
-     * rather whether it is in the process of being removed from its activity.
-     */
-    final public boolean isRemoving() {
-        return mRemoving;
-    }
-    
-    /**
-     * Return true if the layout is included as part of an activity view
-     * hierarchy via the &lt;fragment&gt; tag.  This will always be true when
-     * fragments are created through the &lt;fragment&gt; tag, <em>except</em>
-     * in the case where an old fragment is restored from a previous state and
-     * it does not appear in the layout of the current state.
-     */
-    final public boolean isInLayout() {
-        return mInLayout;
-    }
-
-    /**
-     * Return true if the fragment is in the resumed state.  This is true
-     * for the duration of {@link #onResume()} and {@link #onPause()} as well.
-     */
-    final public boolean isResumed() {
-        return mState >= RESUMED;
-    }
-    
-    /**
-     * Return true if the fragment is currently visible to the user.  This means
-     * it: (1) has been added, (2) has its view attached to the window, and 
-     * (3) is not hidden.
-     */
-    final public boolean isVisible() {
-        return isAdded() && !isHidden() && mView != null
-                && mView.getWindowToken() != null && mView.getVisibility() == View.VISIBLE;
-    }
-    
-    /**
-     * Return true if the fragment has been hidden.  By default fragments
-     * are shown.  You can find out about changes to this state with
-     * {@link #onHiddenChanged}.  Note that the hidden state is orthogonal
-     * to other states -- that is, to be visible to the user, a fragment
-     * must be both started and not hidden.
-     */
-    final public boolean isHidden() {
-        return mHidden;
-    }
-
-    /** @hide */
-    final public boolean hasOptionsMenu() {
-        return mHasMenu;
-    }
-
-    /** @hide */
-    final public boolean isMenuVisible() {
-        return mMenuVisible;
-    }
-
-    /**
-     * Called when the hidden state (as returned by {@link #isHidden()} of
-     * the fragment has changed.  Fragments start out not hidden; this will
-     * be called whenever the fragment changes state from that.
-     * @param hidden True if the fragment is now hidden, false if it is not
-     * visible.
-     */
-    public void onHiddenChanged(boolean hidden) {
-    }
-    
-    /**
-     * Control whether a fragment instance is retained across Activity
-     * re-creation (such as from a configuration change).  This can only
-     * be used with fragments not in the back stack.  If set, the fragment
-     * lifecycle will be slightly different when an activity is recreated:
-     * <ul>
-     * <li> {@link #onDestroy()} will not be called (but {@link #onDetach()} still
-     * will be, because the fragment is being detached from its current activity).
-     * <li> {@link #onCreate(Bundle)} will not be called since the fragment
-     * is not being re-created.
-     * <li> {@link #onAttach(Activity)} and {@link #onActivityCreated(Bundle)} <b>will</b>
-     * still be called.
-     * </ul>
-     */
-    public void setRetainInstance(boolean retain) {
-        mRetainInstance = retain;
-    }
-    
-    final public boolean getRetainInstance() {
-        return mRetainInstance;
-    }
-    
-    /**
-     * Report that this fragment would like to participate in populating
-     * the options menu by receiving a call to {@link #onCreateOptionsMenu}
-     * and related methods.
-     *
-     * @param hasMenu If true, the fragment has menu items to contribute.
-     */
-    public void setHasOptionsMenu(boolean hasMenu) {
-        if (mHasMenu != hasMenu) {
-            mHasMenu = hasMenu;
-            if (isAdded() && !isHidden()) {
-                mHost.onSupportInvalidateOptionsMenu();
-            }
-        }
-    }
-
-    /**
-     * Set a hint for whether this fragment's menu should be visible.  This
-     * is useful if you know that a fragment has been placed in your view
-     * hierarchy so that the user can not currently seen it, so any menu items
-     * it has should also not be shown.
-     *
-     * @param menuVisible The default is true, meaning the fragment's menu will
-     * be shown as usual.  If false, the user will not see the menu.
-     */
-    public void setMenuVisibility(boolean menuVisible) {
-        if (mMenuVisible != menuVisible) {
-            mMenuVisible = menuVisible;
-            if (mHasMenu && isAdded() && !isHidden()) {
-                mHost.onSupportInvalidateOptionsMenu();
-            }
-        }
-    }
-
-    /**
-     * Set a hint to the system about whether this fragment's UI is currently visible
-     * to the user. This hint defaults to true and is persistent across fragment instance
-     * state save and restore.
-     *
-     * <p>An app may set this to false to indicate that the fragment's UI is
-     * scrolled out of visibility or is otherwise not directly visible to the user.
-     * This may be used by the system to prioritize operations such as fragment lifecycle updates
-     * or loader ordering behavior.</p>
-     *
-     * @param isVisibleToUser true if this fragment's UI is currently visible to the user (default),
-     *                        false if it is not.
-     */
-    public void setUserVisibleHint(boolean isVisibleToUser) {
-        if (!mUserVisibleHint && isVisibleToUser && mState < STARTED
-                && mFragmentManager != null && isAdded()) {
-            mFragmentManager.performPendingDeferredStart(this);
-        }
-        mUserVisibleHint = isVisibleToUser;
-        mDeferStart = mState < STARTED && !isVisibleToUser;
-    }
-
-    /**
-     * @return The current value of the user-visible hint on this fragment.
-     * @see #setUserVisibleHint(boolean)
-     */
-    public boolean getUserVisibleHint() {
-        return mUserVisibleHint;
-    }
-
-    /**
-     * Return the LoaderManager for this fragment, creating it if needed.
-     */
-    public LoaderManager getLoaderManager() {
-        if (mLoaderManager != null) {
-            return mLoaderManager;
-        }
-        if (mHost == null) {
-            throw new IllegalStateException("Fragment " + this + " not attached to Activity");
-        }
-        mCheckedForLoaderManager = true;
-        mLoaderManager = mHost.getLoaderManager(mWho, mLoadersStarted, true);
-        return mLoaderManager;
-    }
-
-    /**
-     * Call {@link Activity#startActivity(Intent)} from the fragment's
-     * containing Activity.
-     */
-    public void startActivity(Intent intent) {
-        startActivity(intent, null);
-    }
-
-    /**
-     * Call {@link Activity#startActivity(Intent, Bundle)} from the fragment's
-     * containing Activity.
-     */
-    public void startActivity(Intent intent, @Nullable Bundle options) {
-        if (mHost == null) {
-            throw new IllegalStateException("Fragment " + this + " not attached to Activity");
-        }
-        mHost.onStartActivityFromFragment(this /*fragment*/, intent, -1, options);
-    }
-
-    /**
-     * Call {@link Activity#startActivityForResult(Intent, int)} from the fragment's
-     * containing Activity.
-     */
-    public void startActivityForResult(Intent intent, int requestCode) {
-        startActivityForResult(intent, requestCode, null);
-    }
-
-    /**
-     * Call {@link Activity#startActivityForResult(Intent, int, Bundle)} from the fragment's
-     * containing Activity.
-     */
-    public void startActivityForResult(Intent intent, int requestCode, @Nullable Bundle options) {
-        if (mHost == null) {
-            throw new IllegalStateException("Fragment " + this + " not attached to Activity");
-        }
-        mHost.onStartActivityFromFragment(this /*fragment*/, intent, requestCode, options);
-    }
-
-    /**
-     * Call {@link Activity#startIntentSenderForResult(IntentSender, int, Intent, int, int, int,
-     * Bundle)} from the fragment's containing Activity.
-     */
-    public void startIntentSenderForResult(IntentSender intent, int requestCode,
-            @Nullable Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags,
-            Bundle options) throws IntentSender.SendIntentException {
-        if (mHost == null) {
-            throw new IllegalStateException("Fragment " + this + " not attached to Activity");
-        }
-        mHost.onStartIntentSenderFromFragment(this, intent, requestCode, fillInIntent, flagsMask,
-                flagsValues, extraFlags, options);
-    }
-
-    /**
-     * Receive the result from a previous call to
-     * {@link #startActivityForResult(Intent, int)}.  This follows the
-     * related Activity API as described there in
-     * {@link Activity#onActivityResult(int, int, Intent)}.
-     *
-     * @param requestCode The integer request code originally supplied to
-     *                    startActivityForResult(), allowing you to identify who this
-     *                    result came from.
-     * @param resultCode The integer result code returned by the child activity
-     *                   through its setResult().
-     * @param data An Intent, which can return result data to the caller
-     *               (various data can be attached to Intent "extras").
-     */
-    public void onActivityResult(int requestCode, int resultCode, Intent data) {
-    }
-
-    /**
-     * Requests permissions to be granted to this application. These permissions
-     * must be requested in your manifest, they should not be granted to your app,
-     * and they should have protection level {@link android.content.pm.PermissionInfo
-     * #PROTECTION_DANGEROUS dangerous}, regardless whether they are declared by
-     * the platform or a third-party app.
-     * <p>
-     * Normal permissions {@link android.content.pm.PermissionInfo#PROTECTION_NORMAL}
-     * are granted at install time if requested in the manifest. Signature permissions
-     * {@link android.content.pm.PermissionInfo#PROTECTION_SIGNATURE} are granted at
-     * install time if requested in the manifest and the signature of your app matches
-     * the signature of the app declaring the permissions.
-     * </p>
-     * <p>
-     * If your app does not have the requested permissions the user will be presented
-     * with UI for accepting them. After the user has accepted or rejected the
-     * requested permissions you will receive a callback on {@link
-     * #onRequestPermissionsResult(int, String[], int[])} reporting whether the
-     * permissions were granted or not.
-     * </p>
-     * <p>
-     * Note that requesting a permission does not guarantee it will be granted and
-     * your app should be able to run without having this permission.
-     * </p>
-     * <p>
-     * This method may start an activity allowing the user to choose which permissions
-     * to grant and which to reject. Hence, you should be prepared that your activity
-     * may be paused and resumed. Further, granting some permissions may require
-     * a restart of you application. In such a case, the system will recreate the
-     * activity stack before delivering the result to {@link
-     * #onRequestPermissionsResult(int, String[], int[])}.
-     * </p>
-     * <p>
-     * When checking whether you have a permission you should use {@link
-     * android.content.Context#checkSelfPermission(String)}.
-     * </p>
-     * <p>
-     * Calling this API for permissions already granted to your app would show UI
-     * to the user to decided whether the app can still hold these permissions. This
-     * can be useful if the way your app uses the data guarded by the permissions
-     * changes significantly.
-     * </p>
-     * <p>
-     * A sample permissions request looks like this:
-     * </p>
-     * <code><pre><p>
-     * private void showContacts() {
-     *     if (getActivity().checkSelfPermission(Manifest.permission.READ_CONTACTS)
-     *             != PackageManager.PERMISSION_GRANTED) {
-     *         requestPermissions(new String[]{Manifest.permission.READ_CONTACTS},
-     *                 PERMISSIONS_REQUEST_READ_CONTACTS);
-     *     } else {
-     *         doShowContacts();
-     *     }
-     * }
-     *
-     * {@literal @}Override
-     * public void onRequestPermissionsResult(int requestCode, String[] permissions,
-     *         int[] grantResults) {
-     *     if (requestCode == PERMISSIONS_REQUEST_READ_CONTACTS
-     *             && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
-     *         doShowContacts();
-     *     }
-     * }
-     * </code></pre></p>
-     *
-     * @param permissions The requested permissions.
-     * @param requestCode Application specific request code to match with a result
-     *    reported to {@link #onRequestPermissionsResult(int, String[], int[])}.
-     *
-     * @see #onRequestPermissionsResult(int, String[], int[])
-     * @see android.content.Context#checkSelfPermission(String)
-     */
-    public final void requestPermissions(@NonNull String[] permissions, int requestCode) {
-        if (mHost == null) {
-            throw new IllegalStateException("Fragment " + this + " not attached to Activity");
-        }
-        mHost.onRequestPermissionsFromFragment(this, permissions, requestCode);
-    }
-
-    /**
-     * Callback for the result from requesting permissions. This method
-     * is invoked for every call on {@link #requestPermissions(String[], int)}.
-     * <p>
-     * <strong>Note:</strong> It is possible that the permissions request interaction
-     * with the user is interrupted. In this case you will receive empty permissions
-     * and results arrays which should be treated as a cancellation.
-     * </p>
-     *
-     * @param requestCode The request code passed in {@link #requestPermissions(String[], int)}.
-     * @param permissions The requested permissions. Never null.
-     * @param grantResults The grant results for the corresponding permissions
-     *     which is either {@link android.content.pm.PackageManager#PERMISSION_GRANTED}
-     *     or {@link android.content.pm.PackageManager#PERMISSION_DENIED}. Never null.
-     *
-     * @see #requestPermissions(String[], int)
-     */
-    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
-            @NonNull int[] grantResults) {
-        /* callback - do nothing */
-    }
-
-    /**
-     * Gets whether you should show UI with rationale for requesting a permission.
-     * You should do this only if you do not have the permission and the context in
-     * which the permission is requested does not clearly communicate to the user
-     * what would be the benefit from granting this permission.
-     * <p>
-     * For example, if you write a camera app, requesting the camera permission
-     * would be expected by the user and no rationale for why it is requested is
-     * needed. If however, the app needs location for tagging photos then a non-tech
-     * savvy user may wonder how location is related to taking photos. In this case
-     * you may choose to show UI with rationale of requesting this permission.
-     * </p>
-     *
-     * @param permission A permission your app wants to request.
-     * @return Whether you can show permission rationale UI.
-     *
-     * @see Context#checkSelfPermission(String)
-     * @see #requestPermissions(String[], int)
-     * @see #onRequestPermissionsResult(int, String[], int[])
-     */
-    public boolean shouldShowRequestPermissionRationale(@NonNull String permission) {
-        if (mHost != null) {
-            return mHost.onShouldShowRequestPermissionRationale(permission);
-        }
-        return false;
-    }
-
-    /**
-     * @hide Hack so that DialogFragment can make its Dialog before creating
-     * its views, and the view construction can use the dialog's context for
-     * inflation.  Maybe this should become a public API. Note sure.
-     */
-    public LayoutInflater getLayoutInflater(Bundle savedInstanceState) {
-        LayoutInflater result = mHost.onGetLayoutInflater();
-        getChildFragmentManager(); // Init if needed; use raw implementation below.
-        LayoutInflaterCompat.setFactory(result, mChildFragmentManager.getLayoutInflaterFactory());
-        return result;
-    }
-
-    /**
-     * Called when a fragment is being created as part of a view layout
-     * inflation, typically from setting the content view of an activity.  This
-     * may be called immediately after the fragment is created from a <fragment>
-     * tag in a layout file.  Note this is <em>before</em> the fragment's
-     * {@link #onAttach(Activity)} has been called; all you should do here is
-     * parse the attributes and save them away.
-     * 
-     * <p>This is called every time the fragment is inflated, even if it is
-     * being inflated into a new instance with saved state.  It typically makes
-     * sense to re-parse the parameters each time, to allow them to change with
-     * different configurations.</p>
-     *
-     * <p>Here is a typical implementation of a fragment that can take parameters
-     * both through attributes supplied here as well from {@link #getArguments()}:</p>
-     *
-     * {@sample development/samples/ApiDemos/src/com/example/android/apis/app/FragmentArguments.java
-     *      fragment}
-     *
-     * <p>Note that parsing the XML attributes uses a "styleable" resource.  The
-     * declaration for the styleable used here is:</p>
-     *
-     * {@sample development/samples/ApiDemos/res/values/attrs.xml fragment_arguments}
-     * 
-     * <p>The fragment can then be declared within its activity's content layout
-     * through a tag like this:</p>
-     *
-     * {@sample development/samples/ApiDemos/res/layout/fragment_arguments.xml from_attributes}
-     *
-     * <p>This fragment can also be created dynamically from arguments given
-     * at runtime in the arguments Bundle; here is an example of doing so at
-     * creation of the containing activity:</p>
-     *
-     * {@sample development/samples/ApiDemos/src/com/example/android/apis/app/FragmentArguments.java
-     *      create}
-     *
-     * @param context The Activity that is inflating this fragment.
-     * @param attrs The attributes at the tag where the fragment is
-     * being created.
-     * @param savedInstanceState If the fragment is being re-created from
-     * a previous saved state, this is the state.
-     */
-    @CallSuper
-    public void onInflate(Context context, AttributeSet attrs, Bundle savedInstanceState) {
-        mCalled = true;
-        final Activity hostActivity = mHost == null ? null : mHost.getActivity();
-        if (hostActivity != null) {
-            mCalled = false;
-            onInflate(hostActivity, attrs, savedInstanceState);
-        }
-    }
-
-    /**
-     * Called when a fragment is being created as part of a view layout
-     * inflation, typically from setting the content view of an activity.
-     *
-     * @deprecated See {@link #onInflate(Context, AttributeSet, Bundle)}.
-     */
-    @Deprecated
-    @CallSuper
-    public void onInflate(Activity activity, AttributeSet attrs, Bundle savedInstanceState) {
-        mCalled = true;
-    }
-
-    /**
-     * Called when a fragment is attached as a child of this fragment.
-     *
-     * <p>This is called after the attached fragment's <code>onAttach</code> and before
-     * the attached fragment's <code>onCreate</code> if the fragment has not yet had a previous
-     * call to <code>onCreate</code>.</p>
-     *
-     * @param childFragment child fragment being attached
-     */
-    public void onAttachFragment(Fragment childFragment) {
-    }
-
-    /**
-     * Called when a fragment is first attached to its context.
-     * {@link #onCreate(Bundle)} will be called after this.
-     */
-    @CallSuper
-    public void onAttach(Context context) {
-        mCalled = true;
-        final Activity hostActivity = mHost == null ? null : mHost.getActivity();
-        if (hostActivity != null) {
-            mCalled = false;
-            onAttach(hostActivity);
-        }
-    }
-
-    /**
-     * Called when a fragment is first attached to its activity.
-     * {@link #onCreate(Bundle)} will be called after this.
-     *
-     * @deprecated See {@link #onAttach(Context)}.
-     */
-    @Deprecated
-    @CallSuper
-    public void onAttach(Activity activity) {
-        mCalled = true;
-    }
-
-    /**
-     * Called when a fragment loads an animation.
-     */
-    public Animation onCreateAnimation(int transit, boolean enter, int nextAnim) {
-        return null;
-    }
-
-    /**
-     * Called to do initial creation of a fragment.  This is called after
-     * {@link #onAttach(Activity)} and before
-     * {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)}.
-     * 
-     * <p>Note that this can be called while the fragment's activity is
-     * still in the process of being created.  As such, you can not rely
-     * on things like the activity's content view hierarchy being initialized
-     * at this point.  If you want to do work once the activity itself is
-     * created, see {@link #onActivityCreated(Bundle)}.
-     *
-     * <p>Any restored child fragments will be created before the base
-     * <code>Fragment.onCreate</code> method returns.</p>
-     * 
-     * @param savedInstanceState If the fragment is being re-created from
-     * a previous saved state, this is the state.
-     */
-    @CallSuper
-    public void onCreate(@Nullable Bundle savedInstanceState) {
-        mCalled = true;
-        restoreChildFragmentState(savedInstanceState);
-        if (mChildFragmentManager != null
-                && !mChildFragmentManager.isStateAtLeast(Fragment.CREATED)) {
-            mChildFragmentManager.dispatchCreate();
-        }
-    }
-
-    /**
-     * Restore the state of the child FragmentManager. Called by either
-     * {@link #onCreate(Bundle)} for non-retained instance fragments or by
-     * {@link FragmentManagerImpl#moveToState(Fragment, int, int, int, boolean)}
-     * for retained instance fragments.
-     *
-     * <p><strong>Postcondition:</strong> if there were child fragments to restore,
-     * the child FragmentManager will be instantiated and brought to the {@link #CREATED} state.
-     * </p>
-     *
-     * @param savedInstanceState the savedInstanceState potentially containing fragment info
-     */
-    void restoreChildFragmentState(@Nullable Bundle savedInstanceState) {
-        if (savedInstanceState != null) {
-            Parcelable p = savedInstanceState.getParcelable(
-                    FragmentActivity.FRAGMENTS_TAG);
-            if (p != null) {
-                if (mChildFragmentManager == null) {
-                    instantiateChildFragmentManager();
-                }
-                mChildFragmentManager.restoreAllState(p, mChildNonConfig);
-                mChildNonConfig = null;
-                mChildFragmentManager.dispatchCreate();
-            }
-        }
-    }
-
-    /**
-     * Called to have the fragment instantiate its user interface view.
-     * This is optional, and non-graphical fragments can return null (which
-     * is the default implementation).  This will be called between
-     * {@link #onCreate(Bundle)} and {@link #onActivityCreated(Bundle)}.
-     * 
-     * <p>If you return a View from here, you will later be called in
-     * {@link #onDestroyView} when the view is being released.
-     * 
-     * @param inflater The LayoutInflater object that can be used to inflate
-     * any views in the fragment,
-     * @param container If non-null, this is the parent view that the fragment's
-     * UI should be attached to.  The fragment should not add the view itself,
-     * but this can be used to generate the LayoutParams of the view.
-     * @param savedInstanceState If non-null, this fragment is being re-constructed
-     * from a previous saved state as given here.
-     * 
-     * @return Return the View for the fragment's UI, or null.
-     */
-    @Nullable
-    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
-            @Nullable Bundle savedInstanceState) {
-        return null;
-    }
-
-    /**
-     * Called immediately after {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)}
-     * has returned, but before any saved state has been restored in to the view.
-     * This gives subclasses a chance to initialize themselves once
-     * they know their view hierarchy has been completely created.  The fragment's
-     * view hierarchy is not however attached to its parent at this point.
-     * @param view The View returned by {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)}.
-     * @param savedInstanceState If non-null, this fragment is being re-constructed
-     * from a previous saved state as given here.
-     */
-    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
-    }
-
-    /**
-     * Get the root view for the fragment's layout (the one returned by {@link #onCreateView}),
-     * if provided.
-     * 
-     * @return The fragment's root view, or null if it has no layout.
-     */
-    @Nullable
-    public View getView() {
-        return mView;
-    }
-    
-    /**
-     * Called when the fragment's activity has been created and this
-     * fragment's view hierarchy instantiated.  It can be used to do final
-     * initialization once these pieces are in place, such as retrieving
-     * views or restoring state.  It is also useful for fragments that use
-     * {@link #setRetainInstance(boolean)} to retain their instance,
-     * as this callback tells the fragment when it is fully associated with
-     * the new activity instance.  This is called after {@link #onCreateView}
-     * and before {@link #onViewStateRestored(Bundle)}.
-     *
-     * @param savedInstanceState If the fragment is being re-created from
-     * a previous saved state, this is the state.
-     */
-    @CallSuper
-    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
-        mCalled = true;
-    }
-
-    /**
-     * Called when all saved state has been restored into the view hierarchy
-     * of the fragment.  This can be used to do initialization based on saved
-     * state that you are letting the view hierarchy track itself, such as
-     * whether check box widgets are currently checked.  This is called
-     * after {@link #onActivityCreated(Bundle)} and before
-     * {@link #onStart()}.
-     *
-     * @param savedInstanceState If the fragment is being re-created from
-     * a previous saved state, this is the state.
-     */
-    @CallSuper
-    public void onViewStateRestored(@Nullable Bundle savedInstanceState) {
-        mCalled = true;
-    }
-
-    /**
-     * Called when the Fragment is visible to the user.  This is generally
-     * tied to {@link Activity#onStart() Activity.onStart} of the containing
-     * Activity's lifecycle.
-     */
-    @CallSuper
-    public void onStart() {
-        mCalled = true;
-
-        if (!mLoadersStarted) {
-            mLoadersStarted = true;
-            if (!mCheckedForLoaderManager) {
-                mCheckedForLoaderManager = true;
-                mLoaderManager = mHost.getLoaderManager(mWho, mLoadersStarted, false);
-            }
-            if (mLoaderManager != null) {
-                mLoaderManager.doStart();
-            }
-        }
-    }
-
-    /**
-     * Called when the fragment is visible to the user and actively running.
-     * This is generally
-     * tied to {@link Activity#onResume() Activity.onResume} of the containing
-     * Activity's lifecycle.
-     */
-    @CallSuper
-    public void onResume() {
-        mCalled = true;
-    }
-    
-    /**
-     * Called to ask the fragment to save its current dynamic state, so it
-     * can later be reconstructed in a new instance of its process is
-     * restarted.  If a new instance of the fragment later needs to be
-     * created, the data you place in the Bundle here will be available
-     * in the Bundle given to {@link #onCreate(Bundle)},
-     * {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)}, and
-     * {@link #onActivityCreated(Bundle)}.
-     *
-     * <p>This corresponds to {@link Activity#onSaveInstanceState(Bundle)
-     * Activity.onSaveInstanceState(Bundle)} and most of the discussion there
-     * applies here as well.  Note however: <em>this method may be called
-     * at any time before {@link #onDestroy()}</em>.  There are many situations
-     * where a fragment may be mostly torn down (such as when placed on the
-     * back stack with no UI showing), but its state will not be saved until
-     * its owning activity actually needs to save its state.
-     *
-     * @param outState Bundle in which to place your saved state.
-     */
-    public void onSaveInstanceState(Bundle outState) {
-    }
-
-    /**
-     * Called when the Fragment's activity changes from fullscreen mode to multi-window mode and
-     * visa-versa. This is generally tied to {@link Activity#onMultiWindowModeChanged} of the
-     * containing Activity.
-     *
-     * @param isInMultiWindowMode True if the activity is in multi-window mode.
-     */
-    public void onMultiWindowModeChanged(boolean isInMultiWindowMode) {
-    }
-
-    /**
-     * Called by the system when the activity changes to and from picture-in-picture mode. This is
-     * generally tied to {@link Activity#onPictureInPictureModeChanged} of the containing Activity.
-     *
-     * @param isInPictureInPictureMode True if the activity is in picture-in-picture mode.
-     */
-    public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode) {
-    }
-
-    @CallSuper
-    public void onConfigurationChanged(Configuration newConfig) {
-        mCalled = true;
-    }
-
-    /**
-     * Called when the Fragment is no longer resumed.  This is generally
-     * tied to {@link Activity#onPause() Activity.onPause} of the containing
-     * Activity's lifecycle.
-     */
-    @CallSuper
-    public void onPause() {
-        mCalled = true;
-    }
-    
-    /**
-     * Called when the Fragment is no longer started.  This is generally
-     * tied to {@link Activity#onStop() Activity.onStop} of the containing
-     * Activity's lifecycle.
-     */
-    @CallSuper
-    public void onStop() {
-        mCalled = true;
-    }
-
-    @CallSuper
-    public void onLowMemory() {
-        mCalled = true;
-    }
-    
-    /**
-     * Called when the view previously created by {@link #onCreateView} has
-     * been detached from the fragment.  The next time the fragment needs
-     * to be displayed, a new view will be created.  This is called
-     * after {@link #onStop()} and before {@link #onDestroy()}.  It is called
-     * <em>regardless</em> of whether {@link #onCreateView} returned a
-     * non-null view.  Internally it is called after the view's state has
-     * been saved but before it has been removed from its parent.
-     */
-    @CallSuper
-    public void onDestroyView() {
-        mCalled = true;
-    }
-    
-    /**
-     * Called when the fragment is no longer in use.  This is called
-     * after {@link #onStop()} and before {@link #onDetach()}.
-     */
-    @CallSuper
-    public void onDestroy() {
-        mCalled = true;
-        //Log.v("foo", "onDestroy: mCheckedForLoaderManager=" + mCheckedForLoaderManager
-        //        + " mLoaderManager=" + mLoaderManager);
-        if (!mCheckedForLoaderManager) {
-            mCheckedForLoaderManager = true;
-            mLoaderManager = mHost.getLoaderManager(mWho, mLoadersStarted, false);
-        }
-        if (mLoaderManager != null) {
-            mLoaderManager.doDestroy();
-        }
-    }
-
-    /**
-     * Called by the fragment manager once this fragment has been removed,
-     * so that we don't have any left-over state if the application decides
-     * to re-use the instance.  This only clears state that the framework
-     * internally manages, not things the application sets.
-     */
-    void initState() {
-        mIndex = -1;
-        mWho = null;
-        mAdded = false;
-        mRemoving = false;
-        mFromLayout = false;
-        mInLayout = false;
-        mRestored = false;
-        mBackStackNesting = 0;
-        mFragmentManager = null;
-        mChildFragmentManager = null;
-        mHost = null;
-        mFragmentId = 0;
-        mContainerId = 0;
-        mTag = null;
-        mHidden = false;
-        mDetached = false;
-        mRetaining = false;
-        mLoaderManager = null;
-        mLoadersStarted = false;
-        mCheckedForLoaderManager = false;
-    }
-
-    /**
-     * Called when the fragment is no longer attached to its activity.  This
-     * is called after {@link #onDestroy()}.
-     */
-    @CallSuper
-    public void onDetach() {
-        mCalled = true;
-    }
-    
-    /**
-     * Initialize the contents of the Fragment host's standard options menu.  You
-     * should place your menu items in to <var>menu</var>.  For this method
-     * to be called, you must have first called {@link #setHasOptionsMenu}.  See
-     * {@link Activity#onCreateOptionsMenu(Menu) Activity.onCreateOptionsMenu}
-     * for more information.
-     * 
-     * @param menu The options menu in which you place your items.
-     * 
-     * @see #setHasOptionsMenu
-     * @see #onPrepareOptionsMenu
-     * @see #onOptionsItemSelected
-     */
-    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
-    }
-
-    /**
-     * Prepare the Fragment host's standard options menu to be displayed.  This is
-     * called right before the menu is shown, every time it is shown.  You can
-     * use this method to efficiently enable/disable items or otherwise
-     * dynamically modify the contents.  See
-     * {@link Activity#onPrepareOptionsMenu(Menu) Activity.onPrepareOptionsMenu}
-     * for more information.
-     * 
-     * @param menu The options menu as last shown or first initialized by
-     *             onCreateOptionsMenu().
-     * 
-     * @see #setHasOptionsMenu
-     * @see #onCreateOptionsMenu
-     */
-    public void onPrepareOptionsMenu(Menu menu) {
-    }
-
-    /**
-     * Called when this fragment's option menu items are no longer being
-     * included in the overall options menu.  Receiving this call means that
-     * the menu needed to be rebuilt, but this fragment's items were not
-     * included in the newly built menu (its {@link #onCreateOptionsMenu(Menu, MenuInflater)}
-     * was not called).
-     */
-    public void onDestroyOptionsMenu() {
-    }
-    
-    /**
-     * This hook is called whenever an item in your options menu is selected.
-     * The default implementation simply returns false to have the normal
-     * processing happen (calling the item's Runnable or sending a message to
-     * its Handler as appropriate).  You can use this method for any items
-     * for which you would like to do processing without those other
-     * facilities.
-     * 
-     * <p>Derived classes should call through to the base class for it to
-     * perform the default menu handling.
-     * 
-     * @param item The menu item that was selected.
-     * 
-     * @return boolean Return false to allow normal menu processing to
-     *         proceed, true to consume it here.
-     * 
-     * @see #onCreateOptionsMenu
-     */
-    public boolean onOptionsItemSelected(MenuItem item) {
-        return false;
-    }
-
-    /**
-     * This hook is called whenever the options menu is being closed (either by the user canceling
-     * the menu with the back/menu button, or when an item is selected).
-     *  
-     * @param menu The options menu as last shown or first initialized by
-     *             onCreateOptionsMenu().
-     */
-    public void onOptionsMenuClosed(Menu menu) {
-    }
-    
-    /**
-     * Called when a context menu for the {@code view} is about to be shown.
-     * Unlike {@link #onCreateOptionsMenu}, this will be called every
-     * time the context menu is about to be shown and should be populated for
-     * the view (or item inside the view for {@link AdapterView} subclasses,
-     * this can be found in the {@code menuInfo})).
-     * <p>
-     * Use {@link #onContextItemSelected(android.view.MenuItem)} to know when an
-     * item has been selected.
-     * <p>
-     * The default implementation calls up to
-     * {@link Activity#onCreateContextMenu Activity.onCreateContextMenu}, though
-     * you can not call this implementation if you don't want that behavior.
-     * <p>
-     * It is not safe to hold onto the context menu after this method returns.
-     * {@inheritDoc}
-     */
-    @Override
-    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
-        getActivity().onCreateContextMenu(menu, v, menuInfo);
-    }
-
-    /**
-     * Registers a context menu to be shown for the given view (multiple views
-     * can show the context menu). This method will set the
-     * {@link OnCreateContextMenuListener} on the view to this fragment, so
-     * {@link #onCreateContextMenu(ContextMenu, View, ContextMenuInfo)} will be
-     * called when it is time to show the context menu.
-     * 
-     * @see #unregisterForContextMenu(View)
-     * @param view The view that should show a context menu.
-     */
-    public void registerForContextMenu(View view) {
-        view.setOnCreateContextMenuListener(this);
-    }
-    
-    /**
-     * Prevents a context menu to be shown for the given view. This method will
-     * remove the {@link OnCreateContextMenuListener} on the view.
-     * 
-     * @see #registerForContextMenu(View)
-     * @param view The view that should stop showing a context menu.
-     */
-    public void unregisterForContextMenu(View view) {
-        view.setOnCreateContextMenuListener(null);
-    }
-    
-    /**
-     * This hook is called whenever an item in a context menu is selected. The
-     * default implementation simply returns false to have the normal processing
-     * happen (calling the item's Runnable or sending a message to its Handler
-     * as appropriate). You can use this method for any items for which you
-     * would like to do processing without those other facilities.
-     * <p>
-     * Use {@link MenuItem#getMenuInfo()} to get extra information set by the
-     * View that added this menu item.
-     * <p>
-     * Derived classes should call through to the base class for it to perform
-     * the default menu handling.
-     * 
-     * @param item The context menu item that was selected.
-     * @return boolean Return false to allow normal context menu processing to
-     *         proceed, true to consume it here.
-     */
-    public boolean onContextItemSelected(MenuItem item) {
-        return false;
-    }
-
-    /**
-     * When custom transitions are used with Fragments, the enter transition callback
-     * is called when this Fragment is attached or detached when not popping the back stack.
-     *
-     * @param callback Used to manipulate the shared element transitions on this Fragment
-     *                 when added not as a pop from the back stack.
-     */
-    public void setEnterSharedElementCallback(SharedElementCallback callback) {
-        mEnterTransitionCallback = callback;
-    }
-
-    /**
-     * When custom transitions are used with Fragments, the exit transition callback
-     * is called when this Fragment is attached or detached when popping the back stack.
-     *
-     * @param callback Used to manipulate the shared element transitions on this Fragment
-     *                 when added as a pop from the back stack.
-     */
-    public void setExitSharedElementCallback(SharedElementCallback callback) {
-        mExitTransitionCallback = callback;
-    }
-
-    /**
-     * Sets the Transition that will be used to move Views into the initial scene. The entering
-     * Views will be those that are regular Views or ViewGroups that have
-     * {@link ViewGroup#isTransitionGroup} return true. Typical Transitions will extend
-     * {@link android.transition.Visibility} as entering is governed by changing visibility from
-     * {@link View#INVISIBLE} to {@link View#VISIBLE}. If <code>transition</code> is null,
-     * entering Views will remain unaffected.
-     *
-     * @param transition The Transition to use to move Views into the initial Scene.
-     */
-    public void setEnterTransition(Object transition) {
-        mEnterTransition = transition;
-    }
-
-    /**
-     * Returns the Transition that will be used to move Views into the initial scene. The entering
-     * Views will be those that are regular Views or ViewGroups that have
-     * {@link ViewGroup#isTransitionGroup} return true. Typical Transitions will extend
-     * {@link android.transition.Visibility} as entering is governed by changing visibility from
-     * {@link View#INVISIBLE} to {@link View#VISIBLE}.
-     *
-     * @return the Transition to use to move Views into the initial Scene.
-     */
-    public Object getEnterTransition() {
-        return mEnterTransition;
-    }
-
-    /**
-     * Sets the Transition that will be used to move Views out of the scene when the Fragment is
-     * preparing to be removed, hidden, or detached because of popping the back stack. The exiting
-     * Views will be those that are regular Views or ViewGroups that have
-     * {@link ViewGroup#isTransitionGroup} return true. Typical Transitions will extend
-     * {@link android.transition.Visibility} as entering is governed by changing visibility from
-     * {@link View#VISIBLE} to {@link View#INVISIBLE}. If <code>transition</code> is null,
-     * entering Views will remain unaffected. If nothing is set, the default will be to
-     * use the same value as set in {@link #setEnterTransition(Object)}.
-     *
-     * @param transition The Transition to use to move Views out of the Scene when the Fragment
-     *                   is preparing to close. <code>transition</code> must be an
-     *                   android.transition.Transition.
-     */
-    public void setReturnTransition(Object transition) {
-        mReturnTransition = transition;
-    }
-
-    /**
-     * Returns the Transition that will be used to move Views out of the scene when the Fragment is
-     * preparing to be removed, hidden, or detached because of popping the back stack. The exiting
-     * Views will be those that are regular Views or ViewGroups that have
-     * {@link ViewGroup#isTransitionGroup} return true. Typical Transitions will extend
-     * {@link android.transition.Visibility} as entering is governed by changing visibility from
-     * {@link View#VISIBLE} to {@link View#INVISIBLE}. If <code>transition</code> is null,
-     * entering Views will remain unaffected.
-     *
-     * @return the Transition to use to move Views out of the Scene when the Fragment
-     *         is preparing to close.
-     */
-    public Object getReturnTransition() {
-        return mReturnTransition == USE_DEFAULT_TRANSITION ? getEnterTransition()
-                : mReturnTransition;
-    }
-
-    /**
-     * Sets the Transition that will be used to move Views out of the scene when the
-     * fragment is removed, hidden, or detached when not popping the back stack.
-     * The exiting Views will be those that are regular Views or ViewGroups that
-     * have {@link ViewGroup#isTransitionGroup} return true. Typical Transitions will extend
-     * {@link android.transition.Visibility} as exiting is governed by changing visibility
-     * from {@link View#VISIBLE} to {@link View#INVISIBLE}. If transition is null, the views will
-     * remain unaffected.
-     *
-     * @param transition The Transition to use to move Views out of the Scene when the Fragment
-     *                   is being closed not due to popping the back stack. <code>transition</code>
-     *                   must be an android.transition.Transition.
-     */
-    public void setExitTransition(Object transition) {
-        mExitTransition = transition;
-    }
-
-    /**
-     * Returns the Transition that will be used to move Views out of the scene when the
-     * fragment is removed, hidden, or detached when not popping the back stack.
-     * The exiting Views will be those that are regular Views or ViewGroups that
-     * have {@link ViewGroup#isTransitionGroup} return true. Typical Transitions will extend
-     * {@link android.transition.Visibility} as exiting is governed by changing visibility
-     * from {@link View#VISIBLE} to {@link View#INVISIBLE}. If transition is null, the views will
-     * remain unaffected.
-     *
-     * @return the Transition to use to move Views out of the Scene when the Fragment
-     *         is being closed not due to popping the back stack.
-     */
-    public Object getExitTransition() {
-        return mExitTransition;
-    }
-
-    /**
-     * Sets the Transition that will be used to move Views in to the scene when returning due
-     * to popping a back stack. The entering Views will be those that are regular Views
-     * or ViewGroups that have {@link ViewGroup#isTransitionGroup} return true. Typical Transitions
-     * will extend {@link android.transition.Visibility} as exiting is governed by changing
-     * visibility from {@link View#VISIBLE} to {@link View#INVISIBLE}. If transition is null,
-     * the views will remain unaffected. If nothing is set, the default will be to use the same
-     * transition as {@link #setExitTransition(Object)}.
-     *
-     * @param transition The Transition to use to move Views into the scene when reentering from a
-     *                   previously-started Activity. <code>transition</code>
-     *                   must be an android.transition.Transition.
-     */
-    public void setReenterTransition(Object transition) {
-        mReenterTransition = transition;
-    }
-
-    /**
-     * Returns the Transition that will be used to move Views in to the scene when returning due
-     * to popping a back stack. The entering Views will be those that are regular Views
-     * or ViewGroups that have {@link ViewGroup#isTransitionGroup} return true. Typical Transitions
-     * will extend {@link android.transition.Visibility} as exiting is governed by changing
-     * visibility from {@link View#VISIBLE} to {@link View#INVISIBLE}. If transition is null,
-     * the views will remain unaffected. If nothing is set, the default will be to use the same
-     * transition as {@link #setExitTransition(Object)}.
-     *
-     * @return the Transition to use to move Views into the scene when reentering from a
-     *                   previously-started Activity.
-     */
-    public Object getReenterTransition() {
-        return mReenterTransition == USE_DEFAULT_TRANSITION ? getExitTransition()
-                : mReenterTransition;
-    }
-
-    /**
-     * Sets the Transition that will be used for shared elements transferred into the content
-     * Scene. Typical Transitions will affect size and location, such as
-     * {@link android.transition.ChangeBounds}. A null
-     * value will cause transferred shared elements to blink to the final position.
-     *
-     * @param transition The Transition to use for shared elements transferred into the content
-     *                   Scene.  <code>transition</code> must be an android.transition.Transition.
-     */
-    public void setSharedElementEnterTransition(Object transition) {
-        mSharedElementEnterTransition = transition;
-    }
-
-    /**
-     * Returns the Transition that will be used for shared elements transferred into the content
-     * Scene. Typical Transitions will affect size and location, such as
-     * {@link android.transition.ChangeBounds}. A null
-     * value will cause transferred shared elements to blink to the final position.
-     *
-     * @return The Transition to use for shared elements transferred into the content
-     *                   Scene.
-     */
-    public Object getSharedElementEnterTransition() {
-        return mSharedElementEnterTransition;
-    }
-
-    /**
-     * Sets the Transition that will be used for shared elements transferred back during a
-     * pop of the back stack. This Transition acts in the leaving Fragment.
-     * Typical Transitions will affect size and location, such as
-     * {@link android.transition.ChangeBounds}. A null
-     * value will cause transferred shared elements to blink to the final position.
-     * If no value is set, the default will be to use the same value as
-     * {@link #setSharedElementEnterTransition(Object)}.
-     *
-     * @param transition The Transition to use for shared elements transferred out of the content
-     *                   Scene. <code>transition</code> must be an android.transition.Transition.
-     */
-    public void setSharedElementReturnTransition(Object transition) {
-        mSharedElementReturnTransition = transition;
-    }
-
-    /**
-     * Return the Transition that will be used for shared elements transferred back during a
-     * pop of the back stack. This Transition acts in the leaving Fragment.
-     * Typical Transitions will affect size and location, such as
-     * {@link android.transition.ChangeBounds}. A null
-     * value will cause transferred shared elements to blink to the final position.
-     * If no value is set, the default will be to use the same value as
-     * {@link #setSharedElementEnterTransition(Object)}.
-     *
-     * @return The Transition to use for shared elements transferred out of the content
-     *                   Scene.
-     */
-    public Object getSharedElementReturnTransition() {
-        return mSharedElementReturnTransition == USE_DEFAULT_TRANSITION ?
-                getSharedElementEnterTransition() : mSharedElementReturnTransition;
-    }
-
-    /**
-     * Sets whether the the exit transition and enter transition overlap or not.
-     * When true, the enter transition will start as soon as possible. When false, the
-     * enter transition will wait until the exit transition completes before starting.
-     *
-     * @param allow true to start the enter transition when possible or false to
-     *              wait until the exiting transition completes.
-     */
-    public void setAllowEnterTransitionOverlap(boolean allow) {
-        mAllowEnterTransitionOverlap = allow;
-    }
-
-    /**
-     * Returns whether the the exit transition and enter transition overlap or not.
-     * When true, the enter transition will start as soon as possible. When false, the
-     * enter transition will wait until the exit transition completes before starting.
-     *
-     * @return true when the enter transition should start as soon as possible or false to
-     * when it should wait until the exiting transition completes.
-     */
-    public boolean getAllowEnterTransitionOverlap() {
-        return (mAllowEnterTransitionOverlap == null) ? true : mAllowEnterTransitionOverlap;
-    }
-
-    /**
-     * Sets whether the the return transition and reenter transition overlap or not.
-     * When true, the reenter transition will start as soon as possible. When false, the
-     * reenter transition will wait until the return transition completes before starting.
-     *
-     * @param allow true to start the reenter transition when possible or false to wait until the
-     *              return transition completes.
-     */
-    public void setAllowReturnTransitionOverlap(boolean allow) {
-        mAllowReturnTransitionOverlap = allow;
-    }
-
-    /**
-     * Returns whether the the return transition and reenter transition overlap or not.
-     * When true, the reenter transition will start as soon as possible. When false, the
-     * reenter transition will wait until the return transition completes before starting.
-     *
-     * @return true to start the reenter transition when possible or false to wait until the
-     *         return transition completes.
-     */
-    public boolean getAllowReturnTransitionOverlap() {
-        return (mAllowReturnTransitionOverlap == null) ? true : mAllowReturnTransitionOverlap;
-    }
-
-    /**
-     * Print the Fragments's state into the given stream.
-     *
-     * @param prefix Text to print at the front of each line.
-     * @param fd The raw file descriptor that the dump is being sent to.
-     * @param writer The PrintWriter to which you should dump your state.  This will be
-     * closed for you after you return.
-     * @param args additional arguments to the dump request.
-     */
-    public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) {
-        writer.print(prefix); writer.print("mFragmentId=#");
-                writer.print(Integer.toHexString(mFragmentId));
-                writer.print(" mContainerId=#");
-                writer.print(Integer.toHexString(mContainerId));
-                writer.print(" mTag="); writer.println(mTag);
-        writer.print(prefix); writer.print("mState="); writer.print(mState);
-                writer.print(" mIndex="); writer.print(mIndex);
-                writer.print(" mWho="); writer.print(mWho);
-                writer.print(" mBackStackNesting="); writer.println(mBackStackNesting);
-        writer.print(prefix); writer.print("mAdded="); writer.print(mAdded);
-                writer.print(" mRemoving="); writer.print(mRemoving);
-                writer.print(" mFromLayout="); writer.print(mFromLayout);
-                writer.print(" mInLayout="); writer.println(mInLayout);
-        writer.print(prefix); writer.print("mHidden="); writer.print(mHidden);
-                writer.print(" mDetached="); writer.print(mDetached);
-                writer.print(" mMenuVisible="); writer.print(mMenuVisible);
-                writer.print(" mHasMenu="); writer.println(mHasMenu);
-        writer.print(prefix); writer.print("mRetainInstance="); writer.print(mRetainInstance);
-                writer.print(" mRetaining="); writer.print(mRetaining);
-                writer.print(" mUserVisibleHint="); writer.println(mUserVisibleHint);
-        if (mFragmentManager != null) {
-            writer.print(prefix); writer.print("mFragmentManager=");
-                    writer.println(mFragmentManager);
-        }
-        if (mHost != null) {
-            writer.print(prefix); writer.print("mHost=");
-                    writer.println(mHost);
-        }
-        if (mParentFragment != null) {
-            writer.print(prefix); writer.print("mParentFragment=");
-                    writer.println(mParentFragment);
-        }
-        if (mArguments != null) {
-            writer.print(prefix); writer.print("mArguments="); writer.println(mArguments);
-        }
-        if (mSavedFragmentState != null) {
-            writer.print(prefix); writer.print("mSavedFragmentState=");
-                    writer.println(mSavedFragmentState);
-        }
-        if (mSavedViewState != null) {
-            writer.print(prefix); writer.print("mSavedViewState=");
-                    writer.println(mSavedViewState);
-        }
-        if (mTarget != null) {
-            writer.print(prefix); writer.print("mTarget="); writer.print(mTarget);
-                    writer.print(" mTargetRequestCode=");
-                    writer.println(mTargetRequestCode);
-        }
-        if (mNextAnim != 0) {
-            writer.print(prefix); writer.print("mNextAnim="); writer.println(mNextAnim);
-        }
-        if (mContainer != null) {
-            writer.print(prefix); writer.print("mContainer="); writer.println(mContainer);
-        }
-        if (mView != null) {
-            writer.print(prefix); writer.print("mView="); writer.println(mView);
-        }
-        if (mInnerView != null) {
-            writer.print(prefix); writer.print("mInnerView="); writer.println(mView);
-        }
-        if (mAnimatingAway != null) {
-            writer.print(prefix); writer.print("mAnimatingAway="); writer.println(mAnimatingAway);
-            writer.print(prefix); writer.print("mStateAfterAnimating=");
-                    writer.println(mStateAfterAnimating);
-        }
-        if (mLoaderManager != null) {
-            writer.print(prefix); writer.println("Loader Manager:");
-            mLoaderManager.dump(prefix + "  ", fd, writer, args);
-        }
-        if (mChildFragmentManager != null) {
-            writer.print(prefix); writer.println("Child " + mChildFragmentManager + ":");
-            mChildFragmentManager.dump(prefix + "  ", fd, writer, args);
-        }
-    }
-
-    Fragment findFragmentByWho(String who) {
-        if (who.equals(mWho)) {
-            return this;
-        }
-        if (mChildFragmentManager != null) {
-            return mChildFragmentManager.findFragmentByWho(who);
-        }
-        return null;
-    }
-
-    void instantiateChildFragmentManager() {
-        mChildFragmentManager = new FragmentManagerImpl();
-        mChildFragmentManager.attachController(mHost, new FragmentContainer() {
-            @Override
-            @Nullable
-            public View onFindViewById(int id) {
-                if (mView == null) {
-                    throw new IllegalStateException("Fragment does not have a view");
-                }
-                return mView.findViewById(id);
-            }
-
-            @Override
-            public boolean onHasView() {
-                return (mView != null);
-            }
-        }, this);
-    }
-
-    void performCreate(Bundle savedInstanceState) {
-        if (mChildFragmentManager != null) {
-            mChildFragmentManager.noteStateNotSaved();
-        }
-        mState = CREATED;
-        mCalled = false;
-        onCreate(savedInstanceState);
-        if (!mCalled) {
-            throw new SuperNotCalledException("Fragment " + this
-                    + " did not call through to super.onCreate()");
-        }
-    }
-
-    View performCreateView(LayoutInflater inflater, ViewGroup container,
-            Bundle savedInstanceState) {
-        if (mChildFragmentManager != null) {
-            mChildFragmentManager.noteStateNotSaved();
-        }
-        return onCreateView(inflater, container, savedInstanceState);
-    }
-
-    void performActivityCreated(Bundle savedInstanceState) {
-        if (mChildFragmentManager != null) {
-            mChildFragmentManager.noteStateNotSaved();
-        }
-        mState = ACTIVITY_CREATED;
-        mCalled = false;
-        onActivityCreated(savedInstanceState);
-        if (!mCalled) {
-            throw new SuperNotCalledException("Fragment " + this
-                    + " did not call through to super.onActivityCreated()");
-        }
-        if (mChildFragmentManager != null) {
-            mChildFragmentManager.dispatchActivityCreated();
-        }
-    }
-
-    void performStart() {
-        if (mChildFragmentManager != null) {
-            mChildFragmentManager.noteStateNotSaved();
-            mChildFragmentManager.execPendingActions();
-        }
-        mState = STARTED;
-        mCalled = false;
-        onStart();
-        if (!mCalled) {
-            throw new SuperNotCalledException("Fragment " + this
-                    + " did not call through to super.onStart()");
-        }
-        if (mChildFragmentManager != null) {
-            mChildFragmentManager.dispatchStart();
-        }
-        if (mLoaderManager != null) {
-            mLoaderManager.doReportStart();
-        }
-    }
-
-    void performResume() {
-        if (mChildFragmentManager != null) {
-            mChildFragmentManager.noteStateNotSaved();
-            mChildFragmentManager.execPendingActions();
-        }
-        mState = RESUMED;
-        mCalled = false;
-        onResume();
-        if (!mCalled) {
-            throw new SuperNotCalledException("Fragment " + this
-                    + " did not call through to super.onResume()");
-        }
-        if (mChildFragmentManager != null) {
-            mChildFragmentManager.dispatchResume();
-            mChildFragmentManager.execPendingActions();
-        }
-    }
-
-    void performMultiWindowModeChanged(boolean isInMultiWindowMode) {
-        onMultiWindowModeChanged(isInMultiWindowMode);
-        if (mChildFragmentManager != null) {
-            mChildFragmentManager.dispatchMultiWindowModeChanged(isInMultiWindowMode);
-        }
-    }
-
-    void performPictureInPictureModeChanged(boolean isInPictureInPictureMode) {
-        onPictureInPictureModeChanged(isInPictureInPictureMode);
-        if (mChildFragmentManager != null) {
-            mChildFragmentManager.dispatchPictureInPictureModeChanged(isInPictureInPictureMode);
-        }
-    }
-
-    void performConfigurationChanged(Configuration newConfig) {
-        onConfigurationChanged(newConfig);
-        if (mChildFragmentManager != null) {
-            mChildFragmentManager.dispatchConfigurationChanged(newConfig);
-        }
-    }
-
-    void performLowMemory() {
-        onLowMemory();
-        if (mChildFragmentManager != null) {
-            mChildFragmentManager.dispatchLowMemory();
-        }
-    }
-
-    /*
-    void performTrimMemory(int level) {
-        onTrimMemory(level);
-        if (mChildFragmentManager != null) {
-            mChildFragmentManager.dispatchTrimMemory(level);
-        }
-    }
-    */
-
-    boolean performCreateOptionsMenu(Menu menu, MenuInflater inflater) {
-        boolean show = false;
-        if (!mHidden) {
-            if (mHasMenu && mMenuVisible) {
-                show = true;
-                onCreateOptionsMenu(menu, inflater);
-            }
-            if (mChildFragmentManager != null) {
-                show |= mChildFragmentManager.dispatchCreateOptionsMenu(menu, inflater);
-            }
-        }
-        return show;
-    }
-
-    boolean performPrepareOptionsMenu(Menu menu) {
-        boolean show = false;
-        if (!mHidden) {
-            if (mHasMenu && mMenuVisible) {
-                show = true;
-                onPrepareOptionsMenu(menu);
-            }
-            if (mChildFragmentManager != null) {
-                show |= mChildFragmentManager.dispatchPrepareOptionsMenu(menu);
-            }
-        }
-        return show;
-    }
-
-    boolean performOptionsItemSelected(MenuItem item) {
-        if (!mHidden) {
-            if (mHasMenu && mMenuVisible) {
-                if (onOptionsItemSelected(item)) {
-                    return true;
-                }
-            }
-            if (mChildFragmentManager != null) {
-                if (mChildFragmentManager.dispatchOptionsItemSelected(item)) {
-                    return true;
-                }
-            }
-        }
-        return false;
-    }
-
-    boolean performContextItemSelected(MenuItem item) {
-        if (!mHidden) {
-            if (onContextItemSelected(item)) {
-                return true;
-            }
-            if (mChildFragmentManager != null) {
-                if (mChildFragmentManager.dispatchContextItemSelected(item)) {
-                    return true;
-                }
-            }
-        }
-        return false;
-    }
-
-    void performOptionsMenuClosed(Menu menu) {
-        if (!mHidden) {
-            if (mHasMenu && mMenuVisible) {
-                onOptionsMenuClosed(menu);
-            }
-            if (mChildFragmentManager != null) {
-                mChildFragmentManager.dispatchOptionsMenuClosed(menu);
-            }
-        }
-    }
-
-    void performSaveInstanceState(Bundle outState) {
-        onSaveInstanceState(outState);
-        if (mChildFragmentManager != null) {
-            Parcelable p = mChildFragmentManager.saveAllState();
-            if (p != null) {
-                outState.putParcelable(FragmentActivity.FRAGMENTS_TAG, p);
-            }
-        }
-    }
-
-    void performPause() {
-        if (mChildFragmentManager != null) {
-            mChildFragmentManager.dispatchPause();
-        }
-        mState = STARTED;
-        mCalled = false;
-        onPause();
-        if (!mCalled) {
-            throw new SuperNotCalledException("Fragment " + this
-                    + " did not call through to super.onPause()");
-        }
-    }
-
-    void performStop() {
-        if (mChildFragmentManager != null) {
-            mChildFragmentManager.dispatchStop();
-        }
-        mState = STOPPED;
-        mCalled = false;
-        onStop();
-        if (!mCalled) {
-            throw new SuperNotCalledException("Fragment " + this
-                    + " did not call through to super.onStop()");
-        }
-    }
-
-    void performReallyStop() {
-        if (mChildFragmentManager != null) {
-            mChildFragmentManager.dispatchReallyStop();
-        }
-        mState = ACTIVITY_CREATED;
-        if (mLoadersStarted) {
-            mLoadersStarted = false;
-            if (!mCheckedForLoaderManager) {
-                mCheckedForLoaderManager = true;
-                mLoaderManager = mHost.getLoaderManager(mWho, mLoadersStarted, false);
-            }
-            if (mLoaderManager != null) {
-                if (mHost.getRetainLoaders()) {
-                    mLoaderManager.doRetain();
-                } else {
-                    mLoaderManager.doStop();
-                }
-            }
-        }
-    }
-
-    void performDestroyView() {
-        if (mChildFragmentManager != null) {
-            mChildFragmentManager.dispatchDestroyView();
-        }
-        mState = CREATED;
-        mCalled = false;
-        onDestroyView();
-        if (!mCalled) {
-            throw new SuperNotCalledException("Fragment " + this
-                    + " did not call through to super.onDestroyView()");
-        }
-        if (mLoaderManager != null) {
-            mLoaderManager.doReportNextStart();
-        }
-    }
-
-    void performDestroy() {
-        if (mChildFragmentManager != null) {
-            mChildFragmentManager.dispatchDestroy();
-        }
-        mState = INITIALIZING;
-        mCalled = false;
-        onDestroy();
-        if (!mCalled) {
-            throw new SuperNotCalledException("Fragment " + this
-                    + " did not call through to super.onDestroy()");
-        }
-        mChildFragmentManager = null;
-    }
-
-    void performDetach() {
-        mCalled = false;
-        onDetach();
-        if (!mCalled) {
-            throw new SuperNotCalledException("Fragment " + this
-                    + " did not call through to super.onDetach()");
-        }
-
-        // Destroy the child FragmentManager if we still have it here.
-        // We won't unless we're retaining our instance and if we do,
-        // our child FragmentManager instance state will have already been saved.
-        if (mChildFragmentManager != null) {
-            if (!mRetaining) {
-                throw new IllegalStateException("Child FragmentManager of " + this + " was not "
-                        + " destroyed and this fragment is not retaining instance");
-            }
-            mChildFragmentManager.dispatchDestroy();
-            mChildFragmentManager = null;
-        }
-    }
-
-}
diff --git a/v4/java/android/support/v4/app/FragmentActivity.java b/v4/java/android/support/v4/app/FragmentActivity.java
deleted file mode 100644
index 82d6530..0000000
--- a/v4/java/android/support/v4/app/FragmentActivity.java
+++ /dev/null
@@ -1,1109 +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 android.support.v4.app;
-
-import android.app.Activity;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentSender;
-import android.content.res.Configuration;
-import android.content.res.Resources;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.Message;
-import android.os.Parcelable;
-import android.support.annotation.CallSuper;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.v4.media.session.MediaControllerCompat;
-import android.support.v4.util.SimpleArrayMap;
-import android.support.v4.util.SparseArrayCompat;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.view.KeyEvent;
-import android.view.LayoutInflater;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.Window;
-
-import java.io.FileDescriptor;
-import java.io.PrintWriter;
-
-/**
- * Base class for activities that want to use the support-based
- * {@link android.support.v4.app.Fragment} and
- * {@link android.support.v4.content.Loader} APIs.
- *
- * <p>When using this class as opposed to new platform's built-in fragment
- * and loader support, you must use the {@link #getSupportFragmentManager()}
- * and {@link #getSupportLoaderManager()} methods respectively to access
- * those features.
- *
- * <p>Known limitations:</p>
- * <ul>
- * <li> <p>When using the <code>&lt;fragment></code> tag, this implementation can not
- * use the parent view's ID as the new fragment's ID.  You must explicitly
- * specify an ID (or tag) in the <code>&lt;fragment></code>.</p>
- * <li> <p>Prior to Honeycomb (3.0), an activity's state was saved before pausing.
- * Fragments are a significant amount of new state, and dynamic enough that one
- * often wants them to change between pausing and stopping.  These classes
- * throw an exception if you try to change the fragment state after it has been
- * saved, to avoid accidental loss of UI state.  However this is too restrictive
- * prior to Honeycomb, where the state is saved before pausing.  To address this,
- * when running on platforms prior to Honeycomb an exception will not be thrown
- * if you change fragments between the state save and the activity being stopped.
- * This means that in some cases if the activity is restored from its last saved
- * state, this may be a snapshot slightly before what the user last saw.</p>
- * </ul>
- */
-public class FragmentActivity extends BaseFragmentActivityJB implements
-        ActivityCompat.OnRequestPermissionsResultCallback,
-        ActivityCompatApi23.RequestPermissionsRequestCodeValidator {
-    private static final String TAG = "FragmentActivity";
-
-    static final String FRAGMENTS_TAG = "android:support:fragments";
-    static final String NEXT_CANDIDATE_REQUEST_INDEX_TAG = "android:support:next_request_index";
-    static final String ALLOCATED_REQUEST_INDICIES_TAG = "android:support:request_indicies";
-    static final String REQUEST_FRAGMENT_WHO_TAG = "android:support:request_fragment_who";
-    static final int MAX_NUM_PENDING_FRAGMENT_ACTIVITY_RESULTS = 0xffff - 1;
-
-    // This is the SDK API version of Honeycomb (3.0).
-    private static final int HONEYCOMB = 11;
-
-    static final int MSG_REALLY_STOPPED = 1;
-    static final int MSG_RESUME_PENDING = 2;
-
-    final Handler mHandler = new Handler() {
-        @Override
-        public void handleMessage(Message msg) {
-            switch (msg.what) {
-                case MSG_REALLY_STOPPED:
-                    if (mStopped) {
-                        doReallyStop(false);
-                    }
-                    break;
-                case MSG_RESUME_PENDING:
-                    onResumeFragments();
-                    mFragments.execPendingActions();
-                    break;
-                default:
-                    super.handleMessage(msg);
-            }
-        }
-
-    };
-    final FragmentController mFragments = FragmentController.createController(new HostCallbacks());
-
-    boolean mCreated;
-    boolean mResumed;
-    boolean mStopped;
-    boolean mReallyStopped;
-    boolean mRetaining;
-
-    boolean mOptionsMenuInvalidated;
-    boolean mRequestedPermissionsFromFragment;
-
-    // A hint for the next candidate request index. Request indicies are ints between 0 and 2^16-1
-    // which are encoded into the upper 16 bits of the requestCode for
-    // Fragment.startActivityForResult(...) calls. This allows us to dispatch onActivityResult(...)
-    // to the appropriate Fragment. Request indicies are allocated by allocateRequestIndex(...).
-    int mNextCandidateRequestIndex;
-    // A map from request index to Fragment "who" (i.e. a Fragment's unique identifier). Used to
-    // keep track of the originating Fragment for Fragment.startActivityForResult(...) calls, so we
-    // can dispatch the onActivityResult(...) to the appropriate Fragment. Will only contain entries
-    // for startActivityForResult calls where a result has not yet been delivered.
-    SparseArrayCompat<String> mPendingFragmentActivityResults;
-
-    static final class NonConfigurationInstances {
-        Object custom;
-        FragmentManagerNonConfig fragments;
-        SimpleArrayMap<String, LoaderManager> loaders;
-    }
-
-    MediaControllerCompat mMediaController;
-
-    // ------------------------------------------------------------------------
-    // HOOKS INTO ACTIVITY
-    // ------------------------------------------------------------------------
-
-    /**
-     * Dispatch incoming result to the correct fragment.
-     */
-    @Override
-    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
-        mFragments.noteStateNotSaved();
-        int requestIndex = requestCode>>16;
-        if (requestIndex != 0) {
-            requestIndex--;
-
-            String who = mPendingFragmentActivityResults.get(requestIndex);
-            mPendingFragmentActivityResults.remove(requestIndex);
-            if (who == null) {
-                Log.w(TAG, "Activity result delivered for unknown Fragment.");
-                return;
-            }
-            Fragment targetFragment = mFragments.findFragmentByWho(who);
-            if (targetFragment == null) {
-                Log.w(TAG, "Activity result no fragment exists for who: " + who);
-            } else {
-                targetFragment.onActivityResult(requestCode & 0xffff, resultCode, data);
-            }
-            return;
-        }
-
-        super.onActivityResult(requestCode, resultCode, data);
-    }
-
-    /**
-     * Take care of popping the fragment back stack or finishing the activity
-     * as appropriate.
-     */
-    public void onBackPressed() {
-        if (!mFragments.getSupportFragmentManager().popBackStackImmediate()) {
-            onBackPressedNotHandled();
-        }
-    }
-
-    /**
-     * Sets a {@link MediaControllerCompat} for later retrieval via
-     * {@link #getSupportMediaController()}.
-     *
-     * <p>On API 21 and later, this controller will be tied to the window of the activity and
-     * media key and volume events which are received while the Activity is in the foreground
-     * will be forwarded to the controller and used to invoke transport controls or adjust the
-     * volume. Prior to API 21, the global handling of media key and volume events through an
-     * active {@link android.support.v4.media.session.MediaSessionCompat} and media button receiver
-     * will still be respected.</p>
-     *
-     * @param mediaController The controller for the session which should receive
-     *     media keys and volume changes on API 21 and later.
-     * @see #setMediaController(android.media.session.MediaController)
-     */
-    final public void setSupportMediaController(MediaControllerCompat mediaController) {
-        mMediaController = mediaController;
-        if (android.os.Build.VERSION.SDK_INT >= 21) {
-            ActivityCompat21.setMediaController(this, mediaController.getMediaController());
-        }
-    }
-
-    /**
-     * Retrieves the current {@link MediaControllerCompat} for sending media key and volume events.
-     *
-     * @return The controller which should receive events.
-     * @see #setSupportMediaController(android.support.v4.media.session.MediaController)
-     * @see #getMediaController()
-     */
-    final public MediaControllerCompat getSupportMediaController() {
-        return mMediaController;
-    }
-
-    /**
-     * Reverses the Activity Scene entry Transition and triggers the calling Activity
-     * to reverse its exit Transition. When the exit Transition completes,
-     * {@link #finish()} is called. If no entry Transition was used, finish() is called
-     * immediately and the Activity exit Transition is run.
-     *
-     * <p>On Android 4.4 or lower, this method only finishes the Activity with no
-     * special exit transition.</p>
-     */
-    public void supportFinishAfterTransition() {
-        ActivityCompat.finishAfterTransition(this);
-    }
-
-    /**
-     * When {@link android.app.ActivityOptions#makeSceneTransitionAnimation(Activity,
-     * android.view.View, String)} was used to start an Activity, <var>callback</var>
-     * will be called to handle shared elements on the <i>launched</i> Activity. This requires
-     * {@link Window#FEATURE_CONTENT_TRANSITIONS}.
-     *
-     * @param callback Used to manipulate shared element transitions on the launched Activity.
-     */
-    public void setEnterSharedElementCallback(SharedElementCallback callback) {
-        ActivityCompat.setEnterSharedElementCallback(this, callback);
-    }
-
-    /**
-     * When {@link android.app.ActivityOptions#makeSceneTransitionAnimation(Activity,
-     * android.view.View, String)} was used to start an Activity, <var>listener</var>
-     * will be called to handle shared elements on the <i>launching</i> Activity. Most
-     * calls will only come when returning from the started Activity.
-     * This requires {@link Window#FEATURE_CONTENT_TRANSITIONS}.
-     *
-     * @param listener Used to manipulate shared element transitions on the launching Activity.
-     */
-    public void setExitSharedElementCallback(SharedElementCallback listener) {
-        ActivityCompat.setExitSharedElementCallback(this, listener);
-    }
-
-    /**
-     * Support library version of {@link android.app.Activity#postponeEnterTransition()} that works
-     * only on API 21 and later.
-     */
-    public void supportPostponeEnterTransition() {
-        ActivityCompat.postponeEnterTransition(this);
-    }
-
-    /**
-     * Support library version of {@link android.app.Activity#startPostponedEnterTransition()}
-     * that only works with API 21 and later.
-     */
-    public void supportStartPostponedEnterTransition() {
-        ActivityCompat.startPostponedEnterTransition(this);
-    }
-
-    /**
-     * {@inheritDoc}
-     *
-     * <p><strong>Note:</strong> If you override this method you must call
-     * <code>super.onMultiWindowModeChanged</code> to correctly dispatch the event
-     * to support fragments attached to this activity.</p>
-     *
-     * @param isInMultiWindowMode True if the activity is in multi-window mode.
-     */
-    @CallSuper
-    public void onMultiWindowModeChanged(boolean isInMultiWindowMode) {
-        mFragments.dispatchMultiWindowModeChanged(isInMultiWindowMode);
-    }
-
-    /**
-     * {@inheritDoc}
-     *
-     * <p><strong>Note:</strong> If you override this method you must call
-     * <code>super.onPictureInPictureModeChanged</code> to correctly dispatch the event
-     * to support fragments attached to this activity.</p>
-     *
-     * @param isInPictureInPictureMode True if the activity is in picture-in-picture mode.
-     */
-    @CallSuper
-    public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode) {
-        mFragments.dispatchPictureInPictureModeChanged(isInPictureInPictureMode);
-    }
-
-    /**
-     * Dispatch configuration change to all fragments.
-     */
-    @Override
-    public void onConfigurationChanged(Configuration newConfig) {
-        super.onConfigurationChanged(newConfig);
-        mFragments.dispatchConfigurationChanged(newConfig);
-    }
-
-    /**
-     * Perform initialization of all fragments and loaders.
-     */
-    @SuppressWarnings("deprecation")
-    @Override
-    protected void onCreate(@Nullable Bundle savedInstanceState) {
-        mFragments.attachHost(null /*parent*/);
-
-        super.onCreate(savedInstanceState);
-
-        NonConfigurationInstances nc =
-                (NonConfigurationInstances) getLastNonConfigurationInstance();
-        if (nc != null) {
-            mFragments.restoreLoaderNonConfig(nc.loaders);
-        }
-        if (savedInstanceState != null) {
-            Parcelable p = savedInstanceState.getParcelable(FRAGMENTS_TAG);
-            mFragments.restoreAllState(p, nc != null ? nc.fragments : null);
-
-            // Check if there are any pending onActivityResult calls to descendent Fragments.
-            if (savedInstanceState.containsKey(NEXT_CANDIDATE_REQUEST_INDEX_TAG)) {
-                mNextCandidateRequestIndex =
-                        savedInstanceState.getInt(NEXT_CANDIDATE_REQUEST_INDEX_TAG);
-                int[] requestCodes = savedInstanceState.getIntArray(ALLOCATED_REQUEST_INDICIES_TAG);
-                String[] fragmentWhos = savedInstanceState.getStringArray(REQUEST_FRAGMENT_WHO_TAG);
-                if (requestCodes == null || fragmentWhos == null ||
-                            requestCodes.length != fragmentWhos.length) {
-                    Log.w(TAG, "Invalid requestCode mapping in savedInstanceState.");
-                } else {
-                    mPendingFragmentActivityResults = new SparseArrayCompat<>(requestCodes.length);
-                    for (int i = 0; i < requestCodes.length; i++) {
-                        mPendingFragmentActivityResults.put(requestCodes[i], fragmentWhos[i]);
-                    }
-                }
-            }
-        }
-
-        if (mPendingFragmentActivityResults == null) {
-            mPendingFragmentActivityResults = new SparseArrayCompat<>();
-            mNextCandidateRequestIndex = 0;
-        }
-
-        mFragments.dispatchCreate();
-    }
-
-    /**
-     * Dispatch to Fragment.onCreateOptionsMenu().
-     */
-    @Override
-    public boolean onCreatePanelMenu(int featureId, Menu menu) {
-        if (featureId == Window.FEATURE_OPTIONS_PANEL) {
-            boolean show = super.onCreatePanelMenu(featureId, menu);
-            show |= mFragments.dispatchCreateOptionsMenu(menu, getMenuInflater());
-            if (android.os.Build.VERSION.SDK_INT >= HONEYCOMB) {
-                return show;
-            }
-            // Prior to Honeycomb, the framework can't invalidate the options
-            // menu, so we must always say we have one in case the app later
-            // invalidates it and needs to have it shown.
-            return true;
-        }
-        return super.onCreatePanelMenu(featureId, menu);
-    }
-
-    @Override
-    final View dispatchFragmentsOnCreateView(View parent, String name, Context context,
-            AttributeSet attrs) {
-        return mFragments.onCreateView(parent, name, context, attrs);
-    }
-
-    /**
-     * Destroy all fragments and loaders.
-     */
-    @Override
-    protected void onDestroy() {
-        super.onDestroy();
-
-        doReallyStop(false);
-
-        mFragments.dispatchDestroy();
-        mFragments.doLoaderDestroy();
-    }
-
-    /**
-     * Take care of calling onBackPressed() for pre-Eclair platforms.
-     */
-    @Override
-    public boolean onKeyDown(int keyCode, KeyEvent event) {
-        if (android.os.Build.VERSION.SDK_INT < 5 /* ECLAIR */
-                && keyCode == KeyEvent.KEYCODE_BACK
-                && event.getRepeatCount() == 0) {
-            // Take care of calling this method on earlier versions of
-            // the platform where it doesn't exist.
-            onBackPressed();
-            return true;
-        }
-
-        return super.onKeyDown(keyCode, event);
-    }
-
-    /**
-     * Dispatch onLowMemory() to all fragments.
-     */
-    @Override
-    public void onLowMemory() {
-        super.onLowMemory();
-        mFragments.dispatchLowMemory();
-    }
-
-    /**
-     * Dispatch context and options menu to fragments.
-     */
-    @Override
-    public boolean onMenuItemSelected(int featureId, MenuItem item) {
-        if (super.onMenuItemSelected(featureId, item)) {
-            return true;
-        }
-        
-        switch (featureId) {
-            case Window.FEATURE_OPTIONS_PANEL:
-                return mFragments.dispatchOptionsItemSelected(item);
-                
-            case Window.FEATURE_CONTEXT_MENU:
-                return mFragments.dispatchContextItemSelected(item);
-
-            default:
-                return false;
-        }
-    }
-
-    /**
-     * Call onOptionsMenuClosed() on fragments.
-     */
-    @Override
-    public void onPanelClosed(int featureId, Menu menu) {
-        switch (featureId) {
-            case Window.FEATURE_OPTIONS_PANEL:
-                mFragments.dispatchOptionsMenuClosed(menu);
-                break;
-        }
-        super.onPanelClosed(featureId, menu);
-    }
-    
-    /**
-     * Dispatch onPause() to fragments.
-     */
-    @Override
-    protected void onPause() {
-        super.onPause();
-        mResumed = false;
-        if (mHandler.hasMessages(MSG_RESUME_PENDING)) {
-            mHandler.removeMessages(MSG_RESUME_PENDING);
-            onResumeFragments();
-        }
-        mFragments.dispatchPause();
-    }
-
-    /**
-     * Handle onNewIntent() to inform the fragment manager that the
-     * state is not saved.  If you are handling new intents and may be
-     * making changes to the fragment state, you want to be sure to call
-     * through to the super-class here first.  Otherwise, if your state
-     * is saved but the activity is not stopped, you could get an
-     * onNewIntent() call which happens before onResume() and trying to
-     * perform fragment operations at that point will throw IllegalStateException
-     * because the fragment manager thinks the state is still saved.
-     */
-    @Override
-    protected void onNewIntent(Intent intent) {
-        super.onNewIntent(intent);
-        mFragments.noteStateNotSaved();
-    }
-
-    /**
-     * Hook in to note that fragment state is no longer saved.
-     */
-    public void onStateNotSaved() {
-        mFragments.noteStateNotSaved();
-    }
-
-    /**
-     * Dispatch onResume() to fragments.  Note that for better inter-operation
-     * with older versions of the platform, at the point of this call the
-     * fragments attached to the activity are <em>not</em> resumed.  This means
-     * that in some cases the previous state may still be saved, not allowing
-     * fragment transactions that modify the state.  To correctly interact
-     * with fragments in their proper state, you should instead override
-     * {@link #onResumeFragments()}.
-     */
-    @Override
-    protected void onResume() {
-        super.onResume();
-        mHandler.sendEmptyMessage(MSG_RESUME_PENDING);
-        mResumed = true;
-        mFragments.execPendingActions();
-    }
-
-    /**
-     * Dispatch onResume() to fragments.
-     */
-    @Override
-    protected void onPostResume() {
-        super.onPostResume();
-        mHandler.removeMessages(MSG_RESUME_PENDING);
-        onResumeFragments();
-        mFragments.execPendingActions();
-    }
-
-    /**
-     * This is the fragment-orientated version of {@link #onResume()} that you
-     * can override to perform operations in the Activity at the same point
-     * where its fragments are resumed.  Be sure to always call through to
-     * the super-class.
-     */
-    protected void onResumeFragments() {
-        mFragments.dispatchResume();
-    }
-
-    /**
-     * Dispatch onPrepareOptionsMenu() to fragments.
-     */
-    @Override
-    public boolean onPreparePanel(int featureId, View view, Menu menu) {
-        if (featureId == Window.FEATURE_OPTIONS_PANEL && menu != null) {
-            if (mOptionsMenuInvalidated) {
-                mOptionsMenuInvalidated = false;
-                menu.clear();
-                onCreatePanelMenu(featureId, menu);
-            }
-            boolean goforit = onPrepareOptionsPanel(view, menu);
-            goforit |= mFragments.dispatchPrepareOptionsMenu(menu);
-            return goforit;
-        }
-        return super.onPreparePanel(featureId, view, menu);
-    }
-
-    /**
-     * @hide
-     */
-    protected boolean onPrepareOptionsPanel(View view, Menu menu) {
-        return super.onPreparePanel(Window.FEATURE_OPTIONS_PANEL, view, menu);
-    }
-
-    /**
-     * Retain all appropriate fragment and loader state.  You can NOT
-     * override this yourself!  Use {@link #onRetainCustomNonConfigurationInstance()}
-     * if you want to retain your own state.
-     */
-    @Override
-    public final Object onRetainNonConfigurationInstance() {
-        if (mStopped) {
-            doReallyStop(true);
-        }
-
-        Object custom = onRetainCustomNonConfigurationInstance();
-
-        FragmentManagerNonConfig fragments = mFragments.retainNestedNonConfig();
-        SimpleArrayMap<String, LoaderManager> loaders = mFragments.retainLoaderNonConfig();
-
-        if (fragments == null && loaders == null && custom == null) {
-            return null;
-        }
-
-        NonConfigurationInstances nci = new NonConfigurationInstances();
-        nci.custom = custom;
-        nci.fragments = fragments;
-        nci.loaders = loaders;
-        return nci;
-    }
-
-    /**
-     * Save all appropriate fragment state.
-     */
-    @Override
-    protected void onSaveInstanceState(Bundle outState) {
-        super.onSaveInstanceState(outState);
-        Parcelable p = mFragments.saveAllState();
-        if (p != null) {
-            outState.putParcelable(FRAGMENTS_TAG, p);
-        }
-        if (mPendingFragmentActivityResults.size() > 0) {
-            outState.putInt(NEXT_CANDIDATE_REQUEST_INDEX_TAG, mNextCandidateRequestIndex);
-
-            int[] requestCodes = new int[mPendingFragmentActivityResults.size()];
-            String[] fragmentWhos = new String[mPendingFragmentActivityResults.size()];
-            for (int i = 0; i < mPendingFragmentActivityResults.size(); i++) {
-                requestCodes[i] = mPendingFragmentActivityResults.keyAt(i);
-                fragmentWhos[i] = mPendingFragmentActivityResults.valueAt(i);
-            }
-            outState.putIntArray(ALLOCATED_REQUEST_INDICIES_TAG, requestCodes);
-            outState.putStringArray(REQUEST_FRAGMENT_WHO_TAG, fragmentWhos);
-        }
-    }
-
-    /**
-     * Dispatch onStart() to all fragments.  Ensure any created loaders are
-     * now started.
-     */
-    @Override
-    protected void onStart() {
-        super.onStart();
-
-        mStopped = false;
-        mReallyStopped = false;
-        mHandler.removeMessages(MSG_REALLY_STOPPED);
-
-        if (!mCreated) {
-            mCreated = true;
-            mFragments.dispatchActivityCreated();
-        }
-
-        mFragments.noteStateNotSaved();
-        mFragments.execPendingActions();
-
-        mFragments.doLoaderStart();
-
-        // NOTE: HC onStart goes here.
-
-        mFragments.dispatchStart();
-        mFragments.reportLoaderStart();
-    }
-
-    /**
-     * Dispatch onStop() to all fragments.  Ensure all loaders are stopped.
-     */
-    @Override
-    protected void onStop() {
-        super.onStop();
-
-        mStopped = true;
-        mHandler.sendEmptyMessage(MSG_REALLY_STOPPED);
-
-        mFragments.dispatchStop();
-    }
-
-    // ------------------------------------------------------------------------
-    // NEW METHODS
-    // ------------------------------------------------------------------------
-
-    /**
-     * Use this instead of {@link #onRetainNonConfigurationInstance()}.
-     * Retrieve later with {@link #getLastCustomNonConfigurationInstance()}.
-     */
-    public Object onRetainCustomNonConfigurationInstance() {
-        return null;
-    }
-
-    /**
-     * Return the value previously returned from
-     * {@link #onRetainCustomNonConfigurationInstance()}.
-     */
-    @SuppressWarnings("deprecation")
-    public Object getLastCustomNonConfigurationInstance() {
-        NonConfigurationInstances nc = (NonConfigurationInstances)
-                getLastNonConfigurationInstance();
-        return nc != null ? nc.custom : null;
-    }
-
-    /**
-     * Support library version of {@link Activity#invalidateOptionsMenu}.
-     *
-     * <p>Invalidate the activity's options menu. This will cause relevant presentations
-     * of the menu to fully update via calls to onCreateOptionsMenu and
-     * onPrepareOptionsMenu the next time the menu is requested.
-     */
-    public void supportInvalidateOptionsMenu() {
-        if (android.os.Build.VERSION.SDK_INT >= HONEYCOMB) {
-            // If we are running on HC or greater, we can use the framework
-            // API to invalidate the options menu.
-            ActivityCompatHoneycomb.invalidateOptionsMenu(this);
-            return;
-        }
-
-        // Whoops, older platform...  we'll use a hack, to manually rebuild
-        // the options menu the next time it is prepared.
-        mOptionsMenuInvalidated = true;
-    }
-
-    /**
-     * Print the Activity's state into the given stream.  This gets invoked if
-     * you run "adb shell dumpsys activity <activity_component_name>".
-     *
-     * @param prefix Desired prefix to prepend at each line of output.
-     * @param fd The raw file descriptor that the dump is being sent to.
-     * @param writer The PrintWriter to which you should dump your state.  This will be
-     * closed for you after you return.
-     * @param args additional arguments to the dump request.
-     */
-    public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) {
-        if (android.os.Build.VERSION.SDK_INT >= HONEYCOMB) {
-            // XXX This can only work if we can call the super-class impl. :/
-            //ActivityCompatHoneycomb.dump(this, prefix, fd, writer, args);
-        }
-        writer.print(prefix); writer.print("Local FragmentActivity ");
-                writer.print(Integer.toHexString(System.identityHashCode(this)));
-                writer.println(" State:");
-        String innerPrefix = prefix + "  ";
-        writer.print(innerPrefix); writer.print("mCreated=");
-                writer.print(mCreated); writer.print("mResumed=");
-                writer.print(mResumed); writer.print(" mStopped=");
-                writer.print(mStopped); writer.print(" mReallyStopped=");
-                writer.println(mReallyStopped);
-        mFragments.dumpLoaders(innerPrefix, fd, writer, args);
-        mFragments.getSupportFragmentManager().dump(prefix, fd, writer, args);
-        writer.print(prefix); writer.println("View Hierarchy:");
-        dumpViewHierarchy(prefix + "  ", writer, getWindow().getDecorView());
-    }
-
-    private static String viewToString(View view) {
-        StringBuilder out = new StringBuilder(128);
-        out.append(view.getClass().getName());
-        out.append('{');
-        out.append(Integer.toHexString(System.identityHashCode(view)));
-        out.append(' ');
-        switch (view.getVisibility()) {
-            case View.VISIBLE: out.append('V'); break;
-            case View.INVISIBLE: out.append('I'); break;
-            case View.GONE: out.append('G'); break;
-            default: out.append('.'); break;
-        }
-        out.append(view.isFocusable() ? 'F' : '.');
-        out.append(view.isEnabled() ? 'E' : '.');
-        out.append(view.willNotDraw() ? '.' : 'D');
-        out.append(view.isHorizontalScrollBarEnabled()? 'H' : '.');
-        out.append(view.isVerticalScrollBarEnabled() ? 'V' : '.');
-        out.append(view.isClickable() ? 'C' : '.');
-        out.append(view.isLongClickable() ? 'L' : '.');
-        out.append(' ');
-        out.append(view.isFocused() ? 'F' : '.');
-        out.append(view.isSelected() ? 'S' : '.');
-        out.append(view.isPressed() ? 'P' : '.');
-        out.append(' ');
-        out.append(view.getLeft());
-        out.append(',');
-        out.append(view.getTop());
-        out.append('-');
-        out.append(view.getRight());
-        out.append(',');
-        out.append(view.getBottom());
-        final int id = view.getId();
-        if (id != View.NO_ID) {
-            out.append(" #");
-            out.append(Integer.toHexString(id));
-            final Resources r = view.getResources();
-            if (id != 0 && r != null) {
-                try {
-                    String pkgname;
-                    switch (id&0xff000000) {
-                        case 0x7f000000:
-                            pkgname="app";
-                            break;
-                        case 0x01000000:
-                            pkgname="android";
-                            break;
-                        default:
-                            pkgname = r.getResourcePackageName(id);
-                            break;
-                    }
-                    String typename = r.getResourceTypeName(id);
-                    String entryname = r.getResourceEntryName(id);
-                    out.append(" ");
-                    out.append(pkgname);
-                    out.append(":");
-                    out.append(typename);
-                    out.append("/");
-                    out.append(entryname);
-                } catch (Resources.NotFoundException e) {
-                }
-            }
-        }
-        out.append("}");
-        return out.toString();
-    }
-
-    private void dumpViewHierarchy(String prefix, PrintWriter writer, View view) {
-        writer.print(prefix);
-        if (view == null) {
-            writer.println("null");
-            return;
-        }
-        writer.println(viewToString(view));
-        if (!(view instanceof ViewGroup)) {
-            return;
-        }
-        ViewGroup grp = (ViewGroup)view;
-        final int N = grp.getChildCount();
-        if (N <= 0) {
-            return;
-        }
-        prefix = prefix + "  ";
-        for (int i=0; i<N; i++) {
-            dumpViewHierarchy(prefix, writer, grp.getChildAt(i));
-        }
-    }
-
-    void doReallyStop(boolean retaining) {
-        if (!mReallyStopped) {
-            mReallyStopped = true;
-            mRetaining = retaining;
-            mHandler.removeMessages(MSG_REALLY_STOPPED);
-            onReallyStop();
-        } else if (retaining) {
-            // We're already really stopped, but we've been asked to retain.
-            // Our fragments are taken care of but we need to mark the loaders for retention.
-            // In order to do this correctly we need to restart the loaders first before
-            // handing them off to the next activity.
-            mFragments.doLoaderStart();
-            mFragments.doLoaderStop(true);
-        }
-    }
-
-    /**
-     * Pre-HC, we didn't have a way to determine whether an activity was
-     * being stopped for a config change or not until we saw
-     * onRetainNonConfigurationInstance() called after onStop().  However
-     * we need to know this, to know whether to retain fragments.  This will
-     * tell us what we need to know.
-     */
-    void onReallyStop() {
-        mFragments.doLoaderStop(mRetaining);
-
-        mFragments.dispatchReallyStop();
-    }
-
-    // ------------------------------------------------------------------------
-    // FRAGMENT SUPPORT
-    // ------------------------------------------------------------------------
-
-    /**
-     * Called when a fragment is attached to the activity.
-     *
-     * <p>This is called after the attached fragment's <code>onAttach</code> and before
-     * the attached fragment's <code>onCreate</code> if the fragment has not yet had a previous
-     * call to <code>onCreate</code>.</p>
-     */
-    @SuppressWarnings("unused")
-    public void onAttachFragment(Fragment fragment) {
-    }
-
-    /**
-     * Return the FragmentManager for interacting with fragments associated
-     * with this activity.
-     */
-    public FragmentManager getSupportFragmentManager() {
-        return mFragments.getSupportFragmentManager();
-    }
-
-    public LoaderManager getSupportLoaderManager() {
-        return mFragments.getSupportLoaderManager();
-    }
-
-    /**
-     * Modifies the standard behavior to allow results to be delivered to fragments.
-     * This imposes a restriction that requestCode be <= 0xffff.
-     */
-    @Override
-    public void startActivityForResult(Intent intent, int requestCode) {
-        // If this was started from a Fragment we've already checked the upper 16 bits were not in
-        // use, and then repurposed them for the Fragment's index.
-        if (!mStartedActivityFromFragment) {
-            if (requestCode != -1) {
-                checkForValidRequestCode(requestCode);
-            }
-        }
-        super.startActivityForResult(intent, requestCode);
-    }
-
-    @Override
-    public final void validateRequestPermissionsRequestCode(int requestCode) {
-        // We use 16 bits of the request code to encode the fragment id when
-        // requesting permissions from a fragment. Hence, requestPermissions()
-        // should validate the code against that but we cannot override it as
-        // we can not then call super and also the ActivityCompat would call
-        // back to this override. To handle this we use dependency inversion
-        // where we are the validator of request codes when requesting
-        // permissions in ActivityCompat.
-        if (!mRequestedPermissionsFromFragment
-                && requestCode != -1) {
-            checkForValidRequestCode(requestCode);
-        }
-    }
-
-    /**
-     * Callback for the result from requesting permissions. This method
-     * is invoked for every call on {@link #requestPermissions(String[], int)}.
-     * <p>
-     * <strong>Note:</strong> It is possible that the permissions request interaction
-     * with the user is interrupted. In this case you will receive empty permissions
-     * and results arrays which should be treated as a cancellation.
-     * </p>
-     *
-     * @param requestCode The request code passed in {@link #requestPermissions(String[], int)}.
-     * @param permissions The requested permissions. Never null.
-     * @param grantResults The grant results for the corresponding permissions
-     *     which is either {@link android.content.pm.PackageManager#PERMISSION_GRANTED}
-     *     or {@link android.content.pm.PackageManager#PERMISSION_DENIED}. Never null.
-     *
-     * @see #requestPermissions(String[], int)
-     */
-    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
-            @NonNull int[] grantResults) {
-        int index = (requestCode >> 16) & 0xffff;
-        if (index != 0) {
-            index--;
-
-            String who = mPendingFragmentActivityResults.get(index);
-            mPendingFragmentActivityResults.remove(index);
-            if (who == null) {
-                Log.w(TAG, "Activity result delivered for unknown Fragment.");
-                return;
-            }
-            Fragment frag = mFragments.findFragmentByWho(who);
-            if (frag == null) {
-                Log.w(TAG, "Activity result no fragment exists for who: " + who);
-            } else {
-                frag.onRequestPermissionsResult(requestCode & 0xffff, permissions, grantResults);
-            }
-        }
-    }
-
-    /**
-     * Called by Fragment.startActivityForResult() to implement its behavior.
-     */
-    public void startActivityFromFragment(Fragment fragment, Intent intent,
-            int requestCode) {
-        startActivityFromFragment(fragment, intent, requestCode, null);
-    }
-
-    /**
-     * Called by Fragment.startActivityForResult() to implement its behavior.
-     */
-    public void startActivityFromFragment(Fragment fragment, Intent intent,
-            int requestCode, @Nullable Bundle options) {
-        mStartedActivityFromFragment = true;
-        try {
-            if (requestCode == -1) {
-                ActivityCompat.startActivityForResult(this, intent, -1, options);
-                return;
-            }
-            checkForValidRequestCode(requestCode);
-            int requestIndex = allocateRequestIndex(fragment);
-            ActivityCompat.startActivityForResult(
-                    this, intent, ((requestIndex + 1) << 16) + (requestCode & 0xffff), options);
-        } finally {
-            mStartedActivityFromFragment = false;
-        }
-    }
-
-    /**
-     * Called by Fragment.startIntentSenderForResult() to implement its behavior.
-     */
-    public void startIntentSenderFromFragment(Fragment fragment, IntentSender intent,
-            int requestCode, @Nullable Intent fillInIntent, int flagsMask, int flagsValues,
-            int extraFlags, Bundle options) throws IntentSender.SendIntentException {
-        mStartedIntentSenderFromFragment = true;
-        try {
-            if (requestCode == -1) {
-                ActivityCompat.startIntentSenderForResult(this, intent, requestCode, fillInIntent,
-                        flagsMask, flagsValues, extraFlags, options);
-                return;
-            }
-            checkForValidRequestCode(requestCode);
-            int requestIndex = allocateRequestIndex(fragment);
-            ActivityCompat.startIntentSenderForResult(this, intent,
-                    ((requestIndex + 1) << 16) + (requestCode & 0xffff), fillInIntent,
-                    flagsMask, flagsValues, extraFlags, options);
-        } finally {
-            mStartedIntentSenderFromFragment = false;
-        }
-    }
-
-    // Allocates the next available startActivityForResult request index.
-    private int allocateRequestIndex(Fragment fragment) {
-        // Sanity check that we havn't exhaused the request index space.
-        if (mPendingFragmentActivityResults.size() >= MAX_NUM_PENDING_FRAGMENT_ACTIVITY_RESULTS) {
-            throw new IllegalStateException("Too many pending Fragment activity results.");
-        }
-
-        // Find an unallocated request index in the mPendingFragmentActivityResults map.
-        while (mPendingFragmentActivityResults.indexOfKey(mNextCandidateRequestIndex) >= 0) {
-            mNextCandidateRequestIndex =
-                    (mNextCandidateRequestIndex + 1) % MAX_NUM_PENDING_FRAGMENT_ACTIVITY_RESULTS;
-        }
-
-        int requestIndex = mNextCandidateRequestIndex;
-        mPendingFragmentActivityResults.put(requestIndex, fragment.mWho);
-        mNextCandidateRequestIndex =
-                (mNextCandidateRequestIndex + 1) % MAX_NUM_PENDING_FRAGMENT_ACTIVITY_RESULTS;
-
-        return requestIndex;
-    }
-
-    /**
-     * Called by Fragment.requestPermissions() to implement its behavior.
-     */
-    private void requestPermissionsFromFragment(Fragment fragment, String[] permissions,
-            int requestCode) {
-        if (requestCode == -1) {
-            ActivityCompat.requestPermissions(this, permissions, requestCode);
-            return;
-        }
-        checkForValidRequestCode(requestCode);
-        try {
-            mRequestedPermissionsFromFragment = true;
-            int requestIndex = allocateRequestIndex(fragment);
-            ActivityCompat.requestPermissions(this, permissions,
-                    ((requestIndex + 1) << 16) + (requestCode & 0xffff));
-        } finally {
-            mRequestedPermissionsFromFragment = false;
-        }
-    }
-
-    class HostCallbacks extends FragmentHostCallback<FragmentActivity> {
-        public HostCallbacks() {
-            super(FragmentActivity.this /*fragmentActivity*/);
-        }
-
-        @Override
-        public void onDump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) {
-            FragmentActivity.this.dump(prefix, fd, writer, args);
-        }
-
-        @Override
-        public boolean onShouldSaveFragmentState(Fragment fragment) {
-            return !isFinishing();
-        }
-
-        @Override
-        public LayoutInflater onGetLayoutInflater() {
-            return FragmentActivity.this.getLayoutInflater().cloneInContext(FragmentActivity.this);
-        }
-
-        @Override
-        public FragmentActivity onGetHost() {
-            return FragmentActivity.this;
-        }
-
-        @Override
-        public void onSupportInvalidateOptionsMenu() {
-            FragmentActivity.this.supportInvalidateOptionsMenu();
-        }
-
-        @Override
-        public void onStartActivityFromFragment(Fragment fragment, Intent intent, int requestCode) {
-            FragmentActivity.this.startActivityFromFragment(fragment, intent, requestCode);
-        }
-
-        @Override
-        public void onStartActivityFromFragment(
-                Fragment fragment, Intent intent, int requestCode, @Nullable Bundle options) {
-            FragmentActivity.this.startActivityFromFragment(fragment, intent, requestCode, options);
-        }
-
-        @Override
-        public void onStartIntentSenderFromFragment(Fragment fragment, IntentSender intent,
-                int requestCode, @Nullable Intent fillInIntent, int flagsMask, int flagsValues,
-                int extraFlags, Bundle options) throws IntentSender.SendIntentException {
-            FragmentActivity.this.startIntentSenderFromFragment(fragment, intent, requestCode,
-                    fillInIntent, flagsMask, flagsValues, extraFlags, options);
-        }
-
-        @Override
-        public void onRequestPermissionsFromFragment(@NonNull Fragment fragment,
-                @NonNull String[] permissions, int requestCode) {
-            FragmentActivity.this.requestPermissionsFromFragment(fragment, permissions,
-                    requestCode);
-        }
-
-        @Override
-        public boolean onShouldShowRequestPermissionRationale(@NonNull String permission) {
-            return ActivityCompat.shouldShowRequestPermissionRationale(
-                    FragmentActivity.this, permission);
-        }
-
-        @Override
-        public boolean onHasWindowAnimations() {
-            return getWindow() != null;
-        }
-
-        @Override
-        public int onGetWindowAnimations() {
-            final Window w = getWindow();
-            return (w == null) ? 0 : w.getAttributes().windowAnimations;
-        }
-
-        @Override
-        public void onAttachFragment(Fragment fragment) {
-            FragmentActivity.this.onAttachFragment(fragment);
-        }
-
-        @Nullable
-        @Override
-        public View onFindViewById(int id) {
-            return FragmentActivity.this.findViewById(id);
-        }
-
-        @Override
-        public boolean onHasView() {
-            final Window w = getWindow();
-            return (w != null && w.peekDecorView() != null);
-        }
-    }
-}
diff --git a/v4/java/android/support/v4/app/FragmentHostCallback.java b/v4/java/android/support/v4/app/FragmentHostCallback.java
deleted file mode 100644
index 6a91a3a..0000000
--- a/v4/java/android/support/v4/app/FragmentHostCallback.java
+++ /dev/null
@@ -1,366 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.v4.app;
-
-import android.app.Activity;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentSender;
-import android.os.Bundle;
-import android.os.Handler;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.v4.util.SimpleArrayMap;
-import android.view.LayoutInflater;
-import android.view.View;
-
-import java.io.FileDescriptor;
-import java.io.PrintWriter;
-
-/**
- * Integration points with the Fragment host.
- * <p>
- * Fragments may be hosted by any object; such as an {@link Activity}. In order to
- * host fragments, implement {@link FragmentHostCallback}, overriding the methods
- * applicable to the host.
- */
-public abstract class FragmentHostCallback<E> extends FragmentContainer {
-    private final Activity mActivity;
-    final Context mContext;
-    private final Handler mHandler;
-    final int mWindowAnimations;
-    final FragmentManagerImpl mFragmentManager = new FragmentManagerImpl();
-    /** The loader managers for individual fragments [i.e. Fragment#getLoaderManager()] */
-    private SimpleArrayMap<String, LoaderManager> mAllLoaderManagers;
-    /** Whether or not fragment loaders should retain their state */
-    private boolean mRetainLoaders;
-    /** The loader manger for the fragment host [i.e. Activity#getLoaderManager()] */
-    private LoaderManagerImpl mLoaderManager;
-    private boolean mCheckedForLoaderManager;
-    /** Whether or not the fragment host loader manager was started */
-    private boolean mLoadersStarted;
-
-    public FragmentHostCallback(Context context, Handler handler, int windowAnimations) {
-        this(null /*activity*/, context, handler, windowAnimations);
-    }
-
-    FragmentHostCallback(FragmentActivity activity) {
-        this(activity, activity /*context*/, activity.mHandler, 0 /*windowAnimations*/);
-    }
-
-    FragmentHostCallback(Activity activity, Context context, Handler handler,
-            int windowAnimations) {
-        mActivity = activity;
-        mContext = context;
-        mHandler = handler;
-        mWindowAnimations = windowAnimations;
-    }
-
-    /**
-     * Print internal state into the given stream.
-     *
-     * @param prefix Desired prefix to prepend at each line of output.
-     * @param fd The raw file descriptor that the dump is being sent to.
-     * @param writer The PrintWriter to which you should dump your state. This will be closed
-     *                  for you after you return.
-     * @param args additional arguments to the dump request.
-     */
-    public void onDump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) {
-    }
-
-    /**
-     * Return {@code true} if the fragment's state needs to be saved.
-     */
-    public boolean onShouldSaveFragmentState(Fragment fragment) {
-        return true;
-    }
-
-    /**
-     * Return a {@link LayoutInflater}.
-     * See {@link Activity#getLayoutInflater()}.
-     */
-    public LayoutInflater onGetLayoutInflater() {
-        return (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
-    }
-
-    /**
-     * Return the object that's currently hosting the fragment. If a {@link Fragment}
-     * is hosted by a {@link FragmentActivity}, the object returned here should be
-     * the same object returned from {@link Fragment#getActivity()}.
-     */
-    @Nullable
-    public abstract E onGetHost();
-
-    /**
-     * Invalidates the activity's options menu.
-     * See {@link FragmentActivity#supportInvalidateOptionsMenu()}
-     */
-    public void onSupportInvalidateOptionsMenu() {
-    }
-
-    /**
-     * Starts a new {@link Activity} from the given fragment.
-     * See {@link FragmentActivity#startActivityForResult(Intent, int)}.
-     */
-    public void onStartActivityFromFragment(Fragment fragment, Intent intent, int requestCode) {
-        onStartActivityFromFragment(fragment, intent, requestCode, null);
-    }
-
-    /**
-     * Starts a new {@link Activity} from the given fragment.
-     * See {@link FragmentActivity#startActivityForResult(Intent, int, Bundle)}.
-     */
-    public void onStartActivityFromFragment(
-            Fragment fragment, Intent intent, int requestCode, @Nullable Bundle options) {
-        if (requestCode != -1) {
-            throw new IllegalStateException(
-                    "Starting activity with a requestCode requires a FragmentActivity host");
-        }
-        mContext.startActivity(intent);
-    }
-
-    /**
-     * Starts a new {@link IntentSender} from the given fragment.
-     * See {@link Activity#startIntentSender(IntentSender, Intent, int, int, int, Bundle)}.
-     */
-    public void onStartIntentSenderFromFragment(Fragment fragment, IntentSender intent,
-            int requestCode, @Nullable Intent fillInIntent, int flagsMask, int flagsValues,
-            int extraFlags, Bundle options) throws IntentSender.SendIntentException {
-        if (requestCode != -1) {
-            throw new IllegalStateException(
-                    "Starting intent sender with a requestCode requires a FragmentActivity host");
-        }
-        ActivityCompat.startIntentSenderForResult(mActivity, intent, requestCode, fillInIntent,
-                flagsMask, flagsValues, extraFlags, options);
-    }
-
-    /**
-     * Requests permissions from the given fragment.
-     * See {@link FragmentActivity#requestPermissions(String[], int)}
-     */
-    public void onRequestPermissionsFromFragment(@NonNull Fragment fragment,
-            @NonNull String[] permissions, int requestCode) {
-    }
-
-    /**
-     * Checks wehter to show permission rationale UI from a fragment.
-     * See {@link FragmentActivity#shouldShowRequestPermissionRationale(String)}
-     */
-    public boolean onShouldShowRequestPermissionRationale(@NonNull String permission) {
-        return false;
-    }
-
-    /**
-     * Return {@code true} if there are window animations.
-     */
-    public boolean onHasWindowAnimations() {
-        return true;
-    }
-
-    /**
-     * Return the window animations.
-     */
-    public int onGetWindowAnimations() {
-        return mWindowAnimations;
-    }
-
-    @Nullable
-    @Override
-    public View onFindViewById(int id) {
-        return null;
-    }
-
-    @Override
-    public boolean onHasView() {
-        return true;
-    }
-
-    Activity getActivity() {
-        return mActivity;
-    }
-
-    Context getContext() {
-        return mContext;
-    }
-
-    Handler getHandler() {
-        return mHandler;
-    }
-
-    FragmentManagerImpl getFragmentManagerImpl() {
-        return mFragmentManager;
-    }
-
-    LoaderManagerImpl getLoaderManagerImpl() {
-        if (mLoaderManager != null) {
-            return mLoaderManager;
-        }
-        mCheckedForLoaderManager = true;
-        mLoaderManager = getLoaderManager("(root)", mLoadersStarted, true /*create*/);
-        return mLoaderManager;
-    }
-
-    void inactivateFragment(String who) {
-        //Log.v(TAG, "invalidateSupportFragment: who=" + who);
-        if (mAllLoaderManagers != null) {
-            LoaderManagerImpl lm = (LoaderManagerImpl) mAllLoaderManagers.get(who);
-            if (lm != null && !lm.mRetaining) {
-                lm.doDestroy();
-                mAllLoaderManagers.remove(who);
-            }
-        }
-    }
-
-    void onAttachFragment(Fragment fragment) {
-    }
-
-    boolean getRetainLoaders() {
-        return mRetainLoaders;
-    }
-
-    void doLoaderStart() {
-        if (mLoadersStarted) {
-            return;
-        }
-        mLoadersStarted = true;
-
-        if (mLoaderManager != null) {
-            mLoaderManager.doStart();
-        } else if (!mCheckedForLoaderManager) {
-            mLoaderManager = getLoaderManager("(root)", mLoadersStarted, false);
-            // the returned loader manager may be a new one, so we have to start it
-            if ((mLoaderManager != null) && (!mLoaderManager.mStarted)) {
-                mLoaderManager.doStart();
-            }
-        }
-        mCheckedForLoaderManager = true;
-    }
-
-    // retain -- whether to stop the loader or retain it
-    void doLoaderStop(boolean retain) {
-        mRetainLoaders = retain;
-
-        if (mLoaderManager == null) {
-            return;
-        }
-
-        if (!mLoadersStarted) {
-            return;
-        }
-        mLoadersStarted = false;
-
-        if (retain) {
-            mLoaderManager.doRetain();
-        } else {
-            mLoaderManager.doStop();
-        }
-    }
-
-    void doLoaderRetain() {
-        if (mLoaderManager == null) {
-            return;
-        }
-        mLoaderManager.doRetain();
-    }
-
-    void doLoaderDestroy() {
-        if (mLoaderManager == null) {
-            return;
-        }
-        mLoaderManager.doDestroy();
-    }
-
-    void reportLoaderStart() {
-        if (mAllLoaderManagers != null) {
-            final int N = mAllLoaderManagers.size();
-            LoaderManagerImpl loaders[] = new LoaderManagerImpl[N];
-            for (int i=N-1; i>=0; i--) {
-                loaders[i] = (LoaderManagerImpl) mAllLoaderManagers.valueAt(i);
-            }
-            for (int i=0; i<N; i++) {
-                LoaderManagerImpl lm = loaders[i];
-                lm.finishRetain();
-                lm.doReportStart();
-            }
-        }
-    }
-
-    LoaderManagerImpl getLoaderManager(String who, boolean started, boolean create) {
-        if (mAllLoaderManagers == null) {
-            mAllLoaderManagers = new SimpleArrayMap<String, LoaderManager>();
-        }
-        LoaderManagerImpl lm = (LoaderManagerImpl) mAllLoaderManagers.get(who);
-        if (lm == null) {
-            if (create) {
-                lm = new LoaderManagerImpl(who, this, started);
-                mAllLoaderManagers.put(who, lm);
-            }
-        } else {
-            lm.updateHostController(this);
-        }
-        return lm;
-    }
-
-    SimpleArrayMap<String, LoaderManager> retainLoaderNonConfig() {
-        boolean retainLoaders = false;
-        if (mAllLoaderManagers != null) {
-            // Restart any loader managers that were already stopped so that they
-            // will be ready to retain
-            final int N = mAllLoaderManagers.size();
-            LoaderManagerImpl loaders[] = new LoaderManagerImpl[N];
-            for (int i=N-1; i>=0; i--) {
-                loaders[i] = (LoaderManagerImpl) mAllLoaderManagers.valueAt(i);
-            }
-            final boolean doRetainLoaders = getRetainLoaders();
-            for (int i=0; i<N; i++) {
-                LoaderManagerImpl lm = loaders[i];
-                if (!lm.mRetaining && doRetainLoaders) {
-                    if (!lm.mStarted) {
-                        lm.doStart();
-                    }
-                    lm.doRetain();
-                }
-                if (lm.mRetaining) {
-                    retainLoaders = true;
-                } else {
-                    lm.doDestroy();
-                    mAllLoaderManagers.remove(lm.mWho);
-                }
-            }
-        }
-
-        if (retainLoaders) {
-            return mAllLoaderManagers;
-        }
-        return null;
-    }
-
-    void restoreLoaderNonConfig(SimpleArrayMap<String, LoaderManager> loaderManagers) {
-        mAllLoaderManagers = loaderManagers;
-    }
-
-    void dumpLoaders(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) {
-        writer.print(prefix); writer.print("mLoadersStarted=");
-        writer.println(mLoadersStarted);
-        if (mLoaderManager != null) {
-            writer.print(prefix); writer.print("Loader Manager ");
-            writer.print(Integer.toHexString(System.identityHashCode(mLoaderManager)));
-            writer.println(":");
-            mLoaderManager.dump(prefix + "  ", fd, writer, args);
-        }
-    }
-}
diff --git a/v4/java/android/support/v4/app/FragmentManager.java b/v4/java/android/support/v4/app/FragmentManager.java
deleted file mode 100644
index 1040bd2..0000000
--- a/v4/java/android/support/v4/app/FragmentManager.java
+++ /dev/null
@@ -1,2464 +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 android.support.v4.app;
-
-import android.content.Context;
-import android.content.res.Configuration;
-import android.content.res.Resources.NotFoundException;
-import android.content.res.TypedArray;
-import android.os.Build;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.Looper;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.support.annotation.CallSuper;
-import android.support.annotation.IdRes;
-import android.support.annotation.StringRes;
-import android.support.v4.os.BuildCompat;
-import android.support.v4.util.DebugUtils;
-import android.support.v4.util.LogWriter;
-import android.support.v4.view.LayoutInflaterFactory;
-import android.support.v4.view.ViewCompat;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.util.SparseArray;
-import android.view.animation.AccelerateInterpolator;
-import android.view.animation.AlphaAnimation;
-import android.view.animation.Animation;
-import android.view.animation.AnimationSet;
-import android.view.animation.AnimationUtils;
-import android.view.animation.DecelerateInterpolator;
-import android.view.animation.Interpolator;
-import android.view.animation.ScaleAnimation;
-import android.view.animation.Animation.AnimationListener;
-import android.view.Menu;
-import android.view.MenuInflater;
-import android.view.MenuItem;
-import android.view.View;
-import android.view.ViewGroup;
-
-import java.io.FileDescriptor;
-import java.io.PrintWriter;
-import java.lang.reflect.Field;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * Static library support version of the framework's {@link android.app.FragmentManager}.
- * Used to write apps that run on platforms prior to Android 3.0.  When running
- * on Android 3.0 or above, this implementation is still used; it does not try
- * to switch to the framework's implementation.  See the framework {@link FragmentManager}
- * documentation for a class overview.
- *
- * <p>Your activity must derive from {@link FragmentActivity} to use this. From such an activity,
- * you can acquire the {@link FragmentManager} by calling
- * {@link FragmentActivity#getSupportFragmentManager}.
- */
-public abstract class FragmentManager {
-    /**
-     * Representation of an entry on the fragment back stack, as created
-     * with {@link FragmentTransaction#addToBackStack(String)
-     * FragmentTransaction.addToBackStack()}.  Entries can later be
-     * retrieved with {@link FragmentManager#getBackStackEntryAt(int)
-     * FragmentManager.getBackStackEntry()}.
-     *
-     * <p>Note that you should never hold on to a BackStackEntry object;
-     * the identifier as returned by {@link #getId} is the only thing that
-     * will be persisted across activity instances.
-     */
-    public interface BackStackEntry {
-        /**
-         * Return the unique identifier for the entry.  This is the only
-         * representation of the entry that will persist across activity
-         * instances.
-         */
-        public int getId();
-
-        /**
-         * Get the name that was supplied to
-         * {@link FragmentTransaction#addToBackStack(String)
-         * FragmentTransaction.addToBackStack(String)} when creating this entry.
-         */
-        public String getName();
-
-        /**
-         * Return the full bread crumb title resource identifier for the entry,
-         * or 0 if it does not have one.
-         */
-        @StringRes
-        public int getBreadCrumbTitleRes();
-
-        /**
-         * Return the short bread crumb title resource identifier for the entry,
-         * or 0 if it does not have one.
-         */
-        @StringRes
-        public int getBreadCrumbShortTitleRes();
-
-        /**
-         * Return the full bread crumb title for the entry, or null if it
-         * does not have one.
-         */
-        public CharSequence getBreadCrumbTitle();
-
-        /**
-         * Return the short bread crumb title for the entry, or null if it
-         * does not have one.
-         */
-        public CharSequence getBreadCrumbShortTitle();
-    }
-
-    /**
-     * Interface to watch for changes to the back stack.
-     */
-    public interface OnBackStackChangedListener {
-        /**
-         * Called whenever the contents of the back stack change.
-         */
-        public void onBackStackChanged();
-    }
-
-    /**
-     * Start a series of edit operations on the Fragments associated with
-     * this FragmentManager.
-     * 
-     * <p>Note: A fragment transaction can only be created/committed prior
-     * to an activity saving its state.  If you try to commit a transaction
-     * after {@link FragmentActivity#onSaveInstanceState FragmentActivity.onSaveInstanceState()}
-     * (and prior to a following {@link FragmentActivity#onStart FragmentActivity.onStart}
-     * or {@link FragmentActivity#onResume FragmentActivity.onResume()}, you will get an error.
-     * This is because the framework takes care of saving your current fragments
-     * in the state, and if changes are made after the state is saved then they
-     * will be lost.</p>
-     */
-    public abstract FragmentTransaction beginTransaction();
-
-    /**
-     * @hide -- remove once prebuilts are in.
-     * @deprecated
-     */
-    @Deprecated
-    public FragmentTransaction openTransaction() {
-        return beginTransaction();
-    }
-    
-    /**
-     * After a {@link FragmentTransaction} is committed with
-     * {@link FragmentTransaction#commit FragmentTransaction.commit()}, it
-     * is scheduled to be executed asynchronously on the process's main thread.
-     * If you want to immediately executing any such pending operations, you
-     * can call this function (only from the main thread) to do so.  Note that
-     * all callbacks and other related behavior will be done from within this
-     * call, so be careful about where this is called from.
-     *
-     * <p>If you are committing a single transaction that does not modify the
-     * fragment back stack, strongly consider using
-     * {@link FragmentTransaction#commitNow()} instead. This can help avoid
-     * unwanted side effects when other code in your app has pending committed
-     * transactions that expect different timing.</p>
-     *
-     * @return Returns true if there were any pending transactions to be
-     * executed.
-     */
-    public abstract boolean executePendingTransactions();
-
-    /**
-     * Finds a fragment that was identified by the given id either when inflated
-     * from XML or as the container ID when added in a transaction.  This first
-     * searches through fragments that are currently added to the manager's
-     * activity; if no such fragment is found, then all fragments currently
-     * on the back stack associated with this ID are searched.
-     * @return The fragment if found or null otherwise.
-     */
-    public abstract Fragment findFragmentById(@IdRes int id);
-
-    /**
-     * Finds a fragment that was identified by the given tag either when inflated
-     * from XML or as supplied when added in a transaction.  This first
-     * searches through fragments that are currently added to the manager's
-     * activity; if no such fragment is found, then all fragments currently
-     * on the back stack are searched.
-     * @return The fragment if found or null otherwise.
-     */
-    public abstract Fragment findFragmentByTag(String tag);
-
-    /**
-     * Flag for {@link #popBackStack(String, int)}
-     * and {@link #popBackStack(int, int)}: If set, and the name or ID of
-     * a back stack entry has been supplied, then all matching entries will
-     * be consumed until one that doesn't match is found or the bottom of
-     * the stack is reached.  Otherwise, all entries up to but not including that entry
-     * will be removed.
-     */
-    public static final int POP_BACK_STACK_INCLUSIVE = 1<<0;
-
-    /**
-     * Pop the top state off the back stack.  Returns true if there was one
-     * to pop, else false.  This function is asynchronous -- it enqueues the
-     * request to pop, but the action will not be performed until the application
-     * returns to its event loop.
-     */
-    public abstract void popBackStack();
-
-    /**
-     * Like {@link #popBackStack()}, but performs the operation immediately
-     * inside of the call.  This is like calling {@link #executePendingTransactions()}
-     * afterwards.
-     * @return Returns true if there was something popped, else false.
-     */
-    public abstract boolean popBackStackImmediate();
-
-    /**
-     * Pop the last fragment transition from the manager's fragment
-     * back stack.  If there is nothing to pop, false is returned.
-     * This function is asynchronous -- it enqueues the
-     * request to pop, but the action will not be performed until the application
-     * returns to its event loop.
-     * 
-     * @param name If non-null, this is the name of a previous back state
-     * to look for; if found, all states up to that state will be popped.  The
-     * {@link #POP_BACK_STACK_INCLUSIVE} flag can be used to control whether
-     * the named state itself is popped. If null, only the top state is popped.
-     * @param flags Either 0 or {@link #POP_BACK_STACK_INCLUSIVE}.
-     */
-    public abstract void popBackStack(String name, int flags);
-
-    /**
-     * Like {@link #popBackStack(String, int)}, but performs the operation immediately
-     * inside of the call.  This is like calling {@link #executePendingTransactions()}
-     * afterwards.
-     * @return Returns true if there was something popped, else false.
-     */
-    public abstract boolean popBackStackImmediate(String name, int flags);
-
-    /**
-     * Pop all back stack states up to the one with the given identifier.
-     * This function is asynchronous -- it enqueues the
-     * request to pop, but the action will not be performed until the application
-     * returns to its event loop.
-     * 
-     * @param id Identifier of the stated to be popped. If no identifier exists,
-     * false is returned.
-     * The identifier is the number returned by
-     * {@link FragmentTransaction#commit() FragmentTransaction.commit()}.  The
-     * {@link #POP_BACK_STACK_INCLUSIVE} flag can be used to control whether
-     * the named state itself is popped.
-     * @param flags Either 0 or {@link #POP_BACK_STACK_INCLUSIVE}.
-     */
-    public abstract void popBackStack(int id, int flags);
-
-    /**
-     * Like {@link #popBackStack(int, int)}, but performs the operation immediately
-     * inside of the call.  This is like calling {@link #executePendingTransactions()}
-     * afterwards.
-     * @return Returns true if there was something popped, else false.
-     */
-    public abstract boolean popBackStackImmediate(int id, int flags);
-
-    /**
-     * Return the number of entries currently in the back stack.
-     */
-    public abstract int getBackStackEntryCount();
-
-    /**
-     * Return the BackStackEntry at index <var>index</var> in the back stack;
-     * entries start index 0 being the bottom of the stack.
-     */
-    public abstract BackStackEntry getBackStackEntryAt(int index);
-
-    /**
-     * Add a new listener for changes to the fragment back stack.
-     */
-    public abstract void addOnBackStackChangedListener(OnBackStackChangedListener listener);
-
-    /**
-     * Remove a listener that was previously added with
-     * {@link #addOnBackStackChangedListener(OnBackStackChangedListener)}.
-     */
-    public abstract void removeOnBackStackChangedListener(OnBackStackChangedListener listener);
-
-    /**
-     * Put a reference to a fragment in a Bundle.  This Bundle can be
-     * persisted as saved state, and when later restoring
-     * {@link #getFragment(Bundle, String)} will return the current
-     * instance of the same fragment.
-     *
-     * @param bundle The bundle in which to put the fragment reference.
-     * @param key The name of the entry in the bundle.
-     * @param fragment The Fragment whose reference is to be stored.
-     */
-    public abstract void putFragment(Bundle bundle, String key, Fragment fragment);
-
-    /**
-     * Retrieve the current Fragment instance for a reference previously
-     * placed with {@link #putFragment(Bundle, String, Fragment)}.
-     *
-     * @param bundle The bundle from which to retrieve the fragment reference.
-     * @param key The name of the entry in the bundle.
-     * @return Returns the current Fragment instance that is associated with
-     * the given reference.
-     */
-    public abstract Fragment getFragment(Bundle bundle, String key);
-
-    /**
-     * Get a list of all fragments that have been added to the fragment manager.
-     *
-     * @return The list of all fragments or null if none.
-     * @hide
-     */
-    public abstract List<Fragment> getFragments();
-
-    /**
-     * Save the current instance state of the given Fragment.  This can be
-     * used later when creating a new instance of the Fragment and adding
-     * it to the fragment manager, to have it create itself to match the
-     * current state returned here.  Note that there are limits on how
-     * this can be used:
-     *
-     * <ul>
-     * <li>The Fragment must currently be attached to the FragmentManager.
-     * <li>A new Fragment created using this saved state must be the same class
-     * type as the Fragment it was created from.
-     * <li>The saved state can not contain dependencies on other fragments --
-     * that is it can't use {@link #putFragment(Bundle, String, Fragment)} to
-     * store a fragment reference because that reference may not be valid when
-     * this saved state is later used.  Likewise the Fragment's target and
-     * result code are not included in this state.
-     * </ul>
-     *
-     * @param f The Fragment whose state is to be saved.
-     * @return The generated state.  This will be null if there was no
-     * interesting state created by the fragment.
-     */
-    public abstract Fragment.SavedState saveFragmentInstanceState(Fragment f);
-
-    /**
-     * Returns true if the final {@link android.app.Activity#onDestroy() Activity.onDestroy()}
-     * call has been made on the FragmentManager's Activity, so this instance is now dead.
-     */
-    public abstract boolean isDestroyed();
-
-    /**
-     * Print the FragmentManager's state into the given stream.
-     *
-     * @param prefix Text to print at the front of each line.
-     * @param fd The raw file descriptor that the dump is being sent to.
-     * @param writer A PrintWriter to which the dump is to be set.
-     * @param args Additional arguments to the dump request.
-     */
-    public abstract void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args);
-
-    /**
-     * Control whether the framework's internal fragment manager debugging
-     * logs are turned on.  If enabled, you will see output in logcat as
-     * the framework performs fragment operations.
-     */
-    public static void enableDebugLogging(boolean enabled) {
-        FragmentManagerImpl.DEBUG = enabled;
-    }
-}
-
-final class FragmentManagerState implements Parcelable {
-    FragmentState[] mActive;
-    int[] mAdded;
-    BackStackState[] mBackStack;
-    
-    public FragmentManagerState() {
-    }
-    
-    public FragmentManagerState(Parcel in) {
-        mActive = in.createTypedArray(FragmentState.CREATOR);
-        mAdded = in.createIntArray();
-        mBackStack = in.createTypedArray(BackStackState.CREATOR);
-    }
-    
-    public int describeContents() {
-        return 0;
-    }
-
-    public void writeToParcel(Parcel dest, int flags) {
-        dest.writeTypedArray(mActive, flags);
-        dest.writeIntArray(mAdded);
-        dest.writeTypedArray(mBackStack, flags);
-    }
-    
-    public static final Parcelable.Creator<FragmentManagerState> CREATOR
-            = new Parcelable.Creator<FragmentManagerState>() {
-        public FragmentManagerState createFromParcel(Parcel in) {
-            return new FragmentManagerState(in);
-        }
-        
-        public FragmentManagerState[] newArray(int size) {
-            return new FragmentManagerState[size];
-        }
-    };
-}
-
-/**
- * Container for fragments associated with an activity.
- */
-final class FragmentManagerImpl extends FragmentManager implements LayoutInflaterFactory {
-    static boolean DEBUG = false;
-    static final String TAG = "FragmentManager";
-    
-    static final boolean HONEYCOMB = android.os.Build.VERSION.SDK_INT >= 11;
-
-    static final String TARGET_REQUEST_CODE_STATE_TAG = "android:target_req_state";
-    static final String TARGET_STATE_TAG = "android:target_state";
-    static final String VIEW_STATE_TAG = "android:view_state";
-    static final String USER_VISIBLE_HINT_TAG = "android:user_visible_hint";
-
-    static class AnimateOnHWLayerIfNeededListener implements AnimationListener {
-        private AnimationListener mOrignalListener;
-        private boolean mShouldRunOnHWLayer;
-        private View mView;
-
-        public AnimateOnHWLayerIfNeededListener(final View v, Animation anim) {
-            if (v == null || anim == null) {
-                return;
-            }
-            mView = v;
-        }
-
-        public AnimateOnHWLayerIfNeededListener(final View v, Animation anim,
-                AnimationListener listener) {
-            if (v == null || anim == null) {
-                return;
-            }
-            mOrignalListener = listener;
-            mView = v;
-            mShouldRunOnHWLayer = true;
-        }
-
-        @Override
-        @CallSuper
-        public void onAnimationStart(Animation animation) {
-            if (mOrignalListener != null) {
-                mOrignalListener.onAnimationStart(animation);
-            }
-        }
-
-        @Override
-        @CallSuper
-        public void onAnimationEnd(Animation animation) {
-            if (mView != null && mShouldRunOnHWLayer) {
-                // If we're attached to a window, assume we're in the normal performTraversals
-                // drawing path for Animations running. It's not safe to change the layer type
-                // during drawing, so post it to the View to run later. If we're not attached
-                // or we're running on N and above, post it to the view. If we're not on N and
-                // not attached, do it right now since existing platform versions don't run the
-                // hwui renderer for detached views off the UI thread making changing layer type
-                // safe, but posting may not be.
-                // Prior to N posting to a detached view from a non-Looper thread could cause
-                // leaks, since the thread-local run queue on a non-Looper thread would never
-                // be flushed.
-                if (ViewCompat.isAttachedToWindow(mView) || BuildCompat.isAtLeastN()) {
-                    mView.post(new Runnable() {
-                        @Override
-                        public void run() {
-                            ViewCompat.setLayerType(mView, ViewCompat.LAYER_TYPE_NONE, null);
-                        }
-                    });
-                } else {
-                    ViewCompat.setLayerType(mView, ViewCompat.LAYER_TYPE_NONE, null);
-                }
-            }
-            if (mOrignalListener != null) {
-                mOrignalListener.onAnimationEnd(animation);
-            }
-        }
-
-        @Override
-        public void onAnimationRepeat(Animation animation) {
-            if (mOrignalListener != null) {
-                mOrignalListener.onAnimationRepeat(animation);
-            }
-        }
-    }
-
-    ArrayList<Runnable> mPendingActions;
-    Runnable[] mTmpActions;
-    boolean mExecutingActions;
-    
-    ArrayList<Fragment> mActive;
-    ArrayList<Fragment> mAdded;
-    ArrayList<Integer> mAvailIndices;
-    ArrayList<BackStackRecord> mBackStack;
-    ArrayList<Fragment> mCreatedMenus;
-    
-    // Must be accessed while locked.
-    ArrayList<BackStackRecord> mBackStackIndices;
-    ArrayList<Integer> mAvailBackStackIndices;
-
-    ArrayList<OnBackStackChangedListener> mBackStackChangeListeners;
-
-    int mCurState = Fragment.INITIALIZING;
-    FragmentHostCallback mHost;
-    FragmentController mController;
-    FragmentContainer mContainer;
-    Fragment mParent;
-
-    static Field sAnimationListenerField = null;
-    
-    boolean mNeedMenuInvalidate;
-    boolean mStateSaved;
-    boolean mDestroyed;
-    String mNoTransactionsBecause;
-    boolean mHavePendingDeferredStart;
-    
-    // Temporary vars for state save and restore.
-    Bundle mStateBundle = null;
-    SparseArray<Parcelable> mStateArray = null;
-    
-    Runnable mExecCommit = new Runnable() {
-        @Override
-        public void run() {
-            execPendingActions();
-        }
-    };
-
-    static boolean modifiesAlpha(Animation anim) {
-        if (anim instanceof AlphaAnimation) {
-            return true;
-        } else if (anim instanceof AnimationSet) {
-            List<Animation> anims = ((AnimationSet) anim).getAnimations();
-            for (int i = 0; i < anims.size(); i++) {
-                if (anims.get(i) instanceof AlphaAnimation) {
-                    return true;
-                }
-            }
-        }
-        return false;
-    }
-
-    static boolean shouldRunOnHWLayer(View v, Animation anim) {
-        return Build.VERSION.SDK_INT >= 19
-                && ViewCompat.getLayerType(v) == ViewCompat.LAYER_TYPE_NONE
-                && ViewCompat.hasOverlappingRendering(v)
-                && modifiesAlpha(anim);
-    }
-
-    private void throwException(RuntimeException ex) {
-        Log.e(TAG, ex.getMessage());
-        Log.e(TAG, "Activity state:");
-        LogWriter logw = new LogWriter(TAG);
-        PrintWriter pw = new PrintWriter(logw);
-        if (mHost != null) {
-            try {
-                mHost.onDump("  ", null, pw, new String[] { });
-            } catch (Exception e) {
-                Log.e(TAG, "Failed dumping state", e);
-            }
-        } else {
-            try {
-                dump("  ", null, pw, new String[] { });
-            } catch (Exception e) {
-                Log.e(TAG, "Failed dumping state", e);
-            }
-        }
-        throw ex;
-    }
-
-    @Override
-    public FragmentTransaction beginTransaction() {
-        return new BackStackRecord(this);
-    }
-
-    @Override
-    public boolean executePendingTransactions() {
-        return execPendingActions();
-    }
-
-    @Override
-    public void popBackStack() {
-        enqueueAction(new Runnable() {
-            @Override public void run() {
-                popBackStackState(mHost.getHandler(), null, -1, 0);
-            }
-        }, false);
-    }
-
-    @Override
-    public boolean popBackStackImmediate() {
-        checkStateLoss();
-        executePendingTransactions();
-        return popBackStackState(mHost.getHandler(), null, -1, 0);
-    }
-
-    @Override
-    public void popBackStack(final String name, final int flags) {
-        enqueueAction(new Runnable() {
-            @Override public void run() {
-                popBackStackState(mHost.getHandler(), name, -1, flags);
-            }
-        }, false);
-    }
-
-    @Override
-    public boolean popBackStackImmediate(String name, int flags) {
-        checkStateLoss();
-        executePendingTransactions();
-        return popBackStackState(mHost.getHandler(), name, -1, flags);
-    }
-
-    @Override
-    public void popBackStack(final int id, final int flags) {
-        if (id < 0) {
-            throw new IllegalArgumentException("Bad id: " + id);
-        }
-        enqueueAction(new Runnable() {
-            @Override public void run() {
-                popBackStackState(mHost.getHandler(), null, id, flags);
-            }
-        }, false);
-    }
-
-    @Override
-    public boolean popBackStackImmediate(int id, int flags) {
-        checkStateLoss();
-        executePendingTransactions();
-        if (id < 0) {
-            throw new IllegalArgumentException("Bad id: " + id);
-        }
-        return popBackStackState(mHost.getHandler(), null, id, flags);
-    }
-
-    @Override
-    public int getBackStackEntryCount() {
-        return mBackStack != null ? mBackStack.size() : 0;
-    }
-
-    @Override
-    public BackStackEntry getBackStackEntryAt(int index) {
-        return mBackStack.get(index);
-    }
-
-    @Override
-    public void addOnBackStackChangedListener(OnBackStackChangedListener listener) {
-        if (mBackStackChangeListeners == null) {
-            mBackStackChangeListeners = new ArrayList<OnBackStackChangedListener>();
-        }
-        mBackStackChangeListeners.add(listener);
-    }
-
-    @Override
-    public void removeOnBackStackChangedListener(OnBackStackChangedListener listener) {
-        if (mBackStackChangeListeners != null) {
-            mBackStackChangeListeners.remove(listener);
-        }
-    }
-
-    @Override
-    public void putFragment(Bundle bundle, String key, Fragment fragment) {
-        if (fragment.mIndex < 0) {
-            throwException(new IllegalStateException("Fragment " + fragment
-                    + " is not currently in the FragmentManager"));
-        }
-        bundle.putInt(key, fragment.mIndex);
-    }
-
-    @Override
-    public Fragment getFragment(Bundle bundle, String key) {
-        int index = bundle.getInt(key, -1);
-        if (index == -1) {
-            return null;
-        }
-        if (index >= mActive.size()) {
-            throwException(new IllegalStateException("Fragment no longer exists for key "
-                    + key + ": index " + index));
-        }
-        Fragment f = mActive.get(index);
-        if (f == null) {
-            throwException(new IllegalStateException("Fragment no longer exists for key "
-                    + key + ": index " + index));
-        }
-        return f;
-    }
-
-    @Override
-    public List<Fragment> getFragments() {
-        return mActive;
-    }
-
-    @Override
-    public Fragment.SavedState saveFragmentInstanceState(Fragment fragment) {
-        if (fragment.mIndex < 0) {
-            throwException( new IllegalStateException("Fragment " + fragment
-                    + " is not currently in the FragmentManager"));
-        }
-        if (fragment.mState > Fragment.INITIALIZING) {
-            Bundle result = saveFragmentBasicState(fragment);
-            return result != null ? new Fragment.SavedState(result) : null;
-        }
-        return null;
-    }
-
-    @Override
-    public boolean isDestroyed() {
-        return mDestroyed;
-    }
-
-    @Override
-    public String toString() {
-        StringBuilder sb = new StringBuilder(128);
-        sb.append("FragmentManager{");
-        sb.append(Integer.toHexString(System.identityHashCode(this)));
-        sb.append(" in ");
-        if (mParent != null) {
-            DebugUtils.buildShortClassTag(mParent, sb);
-        } else {
-            DebugUtils.buildShortClassTag(mHost, sb);
-        }
-        sb.append("}}");
-        return sb.toString();
-    }
-
-    @Override
-    public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) {
-        String innerPrefix = prefix + "    ";
-
-        int N;
-        if (mActive != null) {
-            N = mActive.size();
-            if (N > 0) {
-                writer.print(prefix); writer.print("Active Fragments in ");
-                        writer.print(Integer.toHexString(System.identityHashCode(this)));
-                        writer.println(":");
-                for (int i=0; i<N; i++) {
-                    Fragment f = mActive.get(i);
-                    writer.print(prefix); writer.print("  #"); writer.print(i);
-                            writer.print(": "); writer.println(f);
-                    if (f != null) {
-                        f.dump(innerPrefix, fd, writer, args);
-                    }
-                }
-            }
-        }
-
-        if (mAdded != null) {
-            N = mAdded.size();
-            if (N > 0) {
-                writer.print(prefix); writer.println("Added Fragments:");
-                for (int i=0; i<N; i++) {
-                    Fragment f = mAdded.get(i);
-                    writer.print(prefix); writer.print("  #"); writer.print(i);
-                            writer.print(": "); writer.println(f.toString());
-                }
-            }
-        }
-
-        if (mCreatedMenus != null) {
-            N = mCreatedMenus.size();
-            if (N > 0) {
-                writer.print(prefix); writer.println("Fragments Created Menus:");
-                for (int i=0; i<N; i++) {
-                    Fragment f = mCreatedMenus.get(i);
-                    writer.print(prefix); writer.print("  #"); writer.print(i);
-                            writer.print(": "); writer.println(f.toString());
-                }
-            }
-        }
-
-        if (mBackStack != null) {
-            N = mBackStack.size();
-            if (N > 0) {
-                writer.print(prefix); writer.println("Back Stack:");
-                for (int i=0; i<N; i++) {
-                    BackStackRecord bs = mBackStack.get(i);
-                    writer.print(prefix); writer.print("  #"); writer.print(i);
-                            writer.print(": "); writer.println(bs.toString());
-                    bs.dump(innerPrefix, fd, writer, args);
-                }
-            }
-        }
-
-        synchronized (this) {
-            if (mBackStackIndices != null) {
-                N = mBackStackIndices.size();
-                if (N > 0) {
-                    writer.print(prefix); writer.println("Back Stack Indices:");
-                    for (int i=0; i<N; i++) {
-                        BackStackRecord bs = mBackStackIndices.get(i);
-                        writer.print(prefix); writer.print("  #"); writer.print(i);
-                                writer.print(": "); writer.println(bs);
-                    }
-                }
-            }
-
-            if (mAvailBackStackIndices != null && mAvailBackStackIndices.size() > 0) {
-                writer.print(prefix); writer.print("mAvailBackStackIndices: ");
-                        writer.println(Arrays.toString(mAvailBackStackIndices.toArray()));
-            }
-        }
-
-        if (mPendingActions != null) {
-            N = mPendingActions.size();
-            if (N > 0) {
-                writer.print(prefix); writer.println("Pending Actions:");
-                for (int i=0; i<N; i++) {
-                    Runnable r = mPendingActions.get(i);
-                    writer.print(prefix); writer.print("  #"); writer.print(i);
-                            writer.print(": "); writer.println(r);
-                }
-            }
-        }
-
-        writer.print(prefix); writer.println("FragmentManager misc state:");
-        writer.print(prefix); writer.print("  mHost="); writer.println(mHost);
-        writer.print(prefix); writer.print("  mContainer="); writer.println(mContainer);
-        if (mParent != null) {
-            writer.print(prefix); writer.print("  mParent="); writer.println(mParent);
-        }
-        writer.print(prefix); writer.print("  mCurState="); writer.print(mCurState);
-                writer.print(" mStateSaved="); writer.print(mStateSaved);
-                writer.print(" mDestroyed="); writer.println(mDestroyed);
-        if (mNeedMenuInvalidate) {
-            writer.print(prefix); writer.print("  mNeedMenuInvalidate=");
-                    writer.println(mNeedMenuInvalidate);
-        }
-        if (mNoTransactionsBecause != null) {
-            writer.print(prefix); writer.print("  mNoTransactionsBecause=");
-                    writer.println(mNoTransactionsBecause);
-        }
-        if (mAvailIndices != null && mAvailIndices.size() > 0) {
-            writer.print(prefix); writer.print("  mAvailIndices: ");
-                    writer.println(Arrays.toString(mAvailIndices.toArray()));
-        }
-    }
-
-    static final Interpolator DECELERATE_QUINT = new DecelerateInterpolator(2.5f);
-    static final Interpolator DECELERATE_CUBIC = new DecelerateInterpolator(1.5f);
-    static final Interpolator ACCELERATE_QUINT = new AccelerateInterpolator(2.5f);
-    static final Interpolator ACCELERATE_CUBIC = new AccelerateInterpolator(1.5f);
-    
-    static final int ANIM_DUR = 220;
-    
-    static Animation makeOpenCloseAnimation(Context context, float startScale,
-            float endScale, float startAlpha, float endAlpha) {
-        AnimationSet set = new AnimationSet(false);
-        ScaleAnimation scale = new ScaleAnimation(startScale, endScale, startScale, endScale,
-                Animation.RELATIVE_TO_SELF, .5f, Animation.RELATIVE_TO_SELF, .5f);
-        scale.setInterpolator(DECELERATE_QUINT);
-        scale.setDuration(ANIM_DUR);
-        set.addAnimation(scale);
-        AlphaAnimation alpha = new AlphaAnimation(startAlpha, endAlpha);
-        alpha.setInterpolator(DECELERATE_CUBIC);
-        alpha.setDuration(ANIM_DUR);
-        set.addAnimation(alpha);
-        return set;
-    }
-    
-    static Animation makeFadeAnimation(Context context, float start, float end) {
-        AlphaAnimation anim = new AlphaAnimation(start, end);
-        anim.setInterpolator(DECELERATE_CUBIC);
-        anim.setDuration(ANIM_DUR);
-        return anim;
-    }
-
-    Animation loadAnimation(Fragment fragment, int transit, boolean enter,
-            int transitionStyle) {
-        Animation animObj = fragment.onCreateAnimation(transit, enter,
-                fragment.mNextAnim);
-        if (animObj != null) {
-            return animObj;
-        }
-        
-        if (fragment.mNextAnim != 0) {
-            Animation anim = AnimationUtils.loadAnimation(mHost.getContext(), fragment.mNextAnim);
-            if (anim != null) {
-                return anim;
-            }
-        }
-        
-        if (transit == 0) {
-            return null;
-        }
-        
-        int styleIndex = transitToStyleIndex(transit, enter);
-        if (styleIndex < 0) {
-            return null;
-        }
-
-        switch (styleIndex) {
-            case ANIM_STYLE_OPEN_ENTER:
-                return makeOpenCloseAnimation(mHost.getContext(), 1.125f, 1.0f, 0, 1);
-            case ANIM_STYLE_OPEN_EXIT:
-                return makeOpenCloseAnimation(mHost.getContext(), 1.0f, .975f, 1, 0);
-            case ANIM_STYLE_CLOSE_ENTER:
-                return makeOpenCloseAnimation(mHost.getContext(), .975f, 1.0f, 0, 1);
-            case ANIM_STYLE_CLOSE_EXIT:
-                return makeOpenCloseAnimation(mHost.getContext(), 1.0f, 1.075f, 1, 0);
-            case ANIM_STYLE_FADE_ENTER:
-                return makeFadeAnimation(mHost.getContext(), 0, 1);
-            case ANIM_STYLE_FADE_EXIT:
-                return makeFadeAnimation(mHost.getContext(), 1, 0);
-        }
-        
-        if (transitionStyle == 0 && mHost.onHasWindowAnimations()) {
-            transitionStyle = mHost.onGetWindowAnimations();
-        }
-        if (transitionStyle == 0) {
-            return null;
-        }
-        
-        //TypedArray attrs = mActivity.obtainStyledAttributes(transitionStyle,
-        //        com.android.internal.R.styleable.FragmentAnimation);
-        //int anim = attrs.getResourceId(styleIndex, 0);
-        //attrs.recycle();
-        
-        //if (anim == 0) {
-        //    return null;
-        //}
-        
-        //return AnimatorInflater.loadAnimator(mActivity, anim);
-        return null;
-    }
-    
-    public void performPendingDeferredStart(Fragment f) {
-        if (f.mDeferStart) {
-            if (mExecutingActions) {
-                // Wait until we're done executing our pending transactions
-                mHavePendingDeferredStart = true;
-                return;
-            }
-            f.mDeferStart = false;
-            moveToState(f, mCurState, 0, 0, false);
-        }
-    }
-
-    /**
-     * Sets the to be animated view on hardware layer during the animation. Note
-     * that calling this will replace any existing animation listener on the animation
-     * with a new one, as animations do not support more than one listeners. Therefore,
-     * animations that already have listeners should do the layer change operations
-     * in their existing listeners, rather than calling this function.
-     */
-    private void setHWLayerAnimListenerIfAlpha(final View v, Animation anim) {
-        if (v == null || anim == null) {
-            return;
-        }
-        if (shouldRunOnHWLayer(v, anim)) {
-            AnimationListener originalListener = null;
-            try {
-                if (sAnimationListenerField == null) {
-                    sAnimationListenerField = Animation.class.getDeclaredField("mListener");
-                    sAnimationListenerField.setAccessible(true);
-                }
-                originalListener = (AnimationListener) sAnimationListenerField.get(anim);
-            } catch (NoSuchFieldException e) {
-                Log.e(TAG, "No field with the name mListener is found in Animation class", e);
-            } catch (IllegalAccessException e) {
-                Log.e(TAG, "Cannot access Animation's mListener field", e);
-            }
-            // If there's already a listener set on the animation, we need wrap the new listener
-            // around the existing listener, so that they will both get animation listener
-            // callbacks.
-            ViewCompat.setLayerType(v, ViewCompat.LAYER_TYPE_HARDWARE, null);
-            anim.setAnimationListener(new AnimateOnHWLayerIfNeededListener(v, anim,
-                    originalListener));
-        }
-    }
-
-    boolean isStateAtLeast(int state) {
-        return mCurState >= state;
-    }
-
-    void moveToState(Fragment f, int newState, int transit, int transitionStyle,
-            boolean keepActive) {
-        // Fragments that are not currently added will sit in the onCreate() state.
-        if ((!f.mAdded || f.mDetached) && newState > Fragment.CREATED) {
-            newState = Fragment.CREATED;
-        }
-        if (f.mRemoving && newState > f.mState) {
-            // While removing a fragment, we can't change it to a higher state.
-            newState = f.mState;
-        }
-        // Defer start if requested; don't allow it to move to STARTED or higher
-        // if it's not already started.
-        if (f.mDeferStart && f.mState < Fragment.STARTED && newState > Fragment.STOPPED) {
-            newState = Fragment.STOPPED;
-        }
-        if (f.mState < newState) {
-            // For fragments that are created from a layout, when restoring from
-            // state we don't want to allow them to be created until they are
-            // being reloaded from the layout.
-            if (f.mFromLayout && !f.mInLayout) {
-                return;
-            }  
-            if (f.mAnimatingAway != null) {
-                // The fragment is currently being animated...  but!  Now we
-                // want to move our state back up.  Give up on waiting for the
-                // animation, move to whatever the final state should be once
-                // the animation is done, and then we can proceed from there.
-                f.mAnimatingAway = null;
-                moveToState(f, f.mStateAfterAnimating, 0, 0, true);
-            }
-            switch (f.mState) {
-                case Fragment.INITIALIZING:
-                    if (DEBUG) Log.v(TAG, "moveto CREATED: " + f);
-                    if (f.mSavedFragmentState != null) {
-                        f.mSavedFragmentState.setClassLoader(mHost.getContext().getClassLoader());
-                        f.mSavedViewState = f.mSavedFragmentState.getSparseParcelableArray(
-                                FragmentManagerImpl.VIEW_STATE_TAG);
-                        f.mTarget = getFragment(f.mSavedFragmentState,
-                                FragmentManagerImpl.TARGET_STATE_TAG);
-                        if (f.mTarget != null) {
-                            f.mTargetRequestCode = f.mSavedFragmentState.getInt(
-                                    FragmentManagerImpl.TARGET_REQUEST_CODE_STATE_TAG, 0);
-                        }
-                        f.mUserVisibleHint = f.mSavedFragmentState.getBoolean(
-                                FragmentManagerImpl.USER_VISIBLE_HINT_TAG, true);
-                        if (!f.mUserVisibleHint) {
-                            f.mDeferStart = true;
-                            if (newState > Fragment.STOPPED) {
-                                newState = Fragment.STOPPED;
-                            }
-                        }
-                    }
-                    f.mHost = mHost;
-                    f.mParentFragment = mParent;
-                    f.mFragmentManager = mParent != null
-                            ? mParent.mChildFragmentManager : mHost.getFragmentManagerImpl();
-                    f.mCalled = false;
-                    f.onAttach(mHost.getContext());
-                    if (!f.mCalled) {
-                        throw new SuperNotCalledException("Fragment " + f
-                                + " did not call through to super.onAttach()");
-                    }
-                    if (f.mParentFragment == null) {
-                        mHost.onAttachFragment(f);
-                    } else {
-                        f.mParentFragment.onAttachFragment(f);
-                    }
-
-                    if (!f.mRetaining) {
-                        f.performCreate(f.mSavedFragmentState);
-                    } else {
-                        f.restoreChildFragmentState(f.mSavedFragmentState);
-                        f.mState = Fragment.CREATED;
-                    }
-                    f.mRetaining = false;
-                    if (f.mFromLayout) {
-                        // For fragments that are part of the content view
-                        // layout, we need to instantiate the view immediately
-                        // and the inflater will take care of adding it.
-                        f.mView = f.performCreateView(f.getLayoutInflater(
-                                f.mSavedFragmentState), null, f.mSavedFragmentState);
-                        if (f.mView != null) {
-                            f.mInnerView = f.mView;
-                            if (Build.VERSION.SDK_INT >= 11) {
-                                ViewCompat.setSaveFromParentEnabled(f.mView, false);
-                            } else {
-                                f.mView = NoSaveStateFrameLayout.wrap(f.mView);
-                            }
-                            if (f.mHidden) f.mView.setVisibility(View.GONE);
-                            f.onViewCreated(f.mView, f.mSavedFragmentState);
-                        } else {
-                            f.mInnerView = null;
-                        }
-                    }
-                case Fragment.CREATED:
-                    if (newState > Fragment.CREATED) {
-                        if (DEBUG) Log.v(TAG, "moveto ACTIVITY_CREATED: " + f);
-                        if (!f.mFromLayout) {
-                            ViewGroup container = null;
-                            if (f.mContainerId != 0) {
-                                if (f.mContainerId == View.NO_ID) {
-                                    throwException(new IllegalArgumentException(
-                                            "Cannot create fragment "
-                                                    + f
-                                                    + " for a container view with no id"));
-                                }
-                                container = (ViewGroup) mContainer.onFindViewById(f.mContainerId);
-                                if (container == null && !f.mRestored) {
-                                    String resName;
-                                    try {
-                                        resName = f.getResources().getResourceName(f.mContainerId);
-                                    } catch (NotFoundException e) {
-                                        resName = "unknown";
-                                    }
-                                    throwException(new IllegalArgumentException(
-                                            "No view found for id 0x"
-                                            + Integer.toHexString(f.mContainerId) + " ("
-                                            + resName
-                                            + ") for fragment " + f));
-                                }
-                            }
-                            f.mContainer = container;
-                            f.mView = f.performCreateView(f.getLayoutInflater(
-                                    f.mSavedFragmentState), container, f.mSavedFragmentState);
-                            if (f.mView != null) {
-                                f.mInnerView = f.mView;
-                                if (Build.VERSION.SDK_INT >= 11) {
-                                    ViewCompat.setSaveFromParentEnabled(f.mView, false);
-                                } else {
-                                    f.mView = NoSaveStateFrameLayout.wrap(f.mView);
-                                }
-                                if (container != null) {
-                                    Animation anim = loadAnimation(f, transit, true,
-                                            transitionStyle);
-                                    if (anim != null) {
-                                        setHWLayerAnimListenerIfAlpha(f.mView, anim);
-                                        f.mView.startAnimation(anim);
-                                    }
-                                    container.addView(f.mView);
-                                }
-                                if (f.mHidden) f.mView.setVisibility(View.GONE);
-                                f.onViewCreated(f.mView, f.mSavedFragmentState);
-                            } else {
-                                f.mInnerView = null;
-                            }
-                        }
-
-                        f.performActivityCreated(f.mSavedFragmentState);
-                        if (f.mView != null) {
-                            f.restoreViewState(f.mSavedFragmentState);
-                        }
-                        f.mSavedFragmentState = null;
-                    }
-                case Fragment.ACTIVITY_CREATED:
-                    if (newState > Fragment.ACTIVITY_CREATED) {
-                        f.mState = Fragment.STOPPED;
-                    }
-                case Fragment.STOPPED:
-                    if (newState > Fragment.STOPPED) {
-                        if (DEBUG) Log.v(TAG, "moveto STARTED: " + f);
-                        f.performStart();
-                    }
-                case Fragment.STARTED:
-                    if (newState > Fragment.STARTED) {
-                        if (DEBUG) Log.v(TAG, "moveto RESUMED: " + f);
-                        f.performResume();
-                        f.mSavedFragmentState = null;
-                        f.mSavedViewState = null;
-                    }
-            }
-        } else if (f.mState > newState) {
-            switch (f.mState) {
-                case Fragment.RESUMED:
-                    if (newState < Fragment.RESUMED) {
-                        if (DEBUG) Log.v(TAG, "movefrom RESUMED: " + f);
-                        f.performPause();
-                    }
-                case Fragment.STARTED:
-                    if (newState < Fragment.STARTED) {
-                        if (DEBUG) Log.v(TAG, "movefrom STARTED: " + f);
-                        f.performStop();
-                    }
-                case Fragment.STOPPED:
-                    if (newState < Fragment.STOPPED) {
-                        if (DEBUG) Log.v(TAG, "movefrom STOPPED: " + f);
-                        f.performReallyStop();
-                    }
-                case Fragment.ACTIVITY_CREATED:
-                    if (newState < Fragment.ACTIVITY_CREATED) {
-                        if (DEBUG) Log.v(TAG, "movefrom ACTIVITY_CREATED: " + f);
-                        if (f.mView != null) {
-                            // Need to save the current view state if not
-                            // done already.
-                            if (mHost.onShouldSaveFragmentState(f) && f.mSavedViewState == null) {
-                                saveFragmentViewState(f);
-                            }
-                        }
-                        f.performDestroyView();
-                        if (f.mView != null && f.mContainer != null) {
-                            Animation anim = null;
-                            if (mCurState > Fragment.INITIALIZING && !mDestroyed) {
-                                anim = loadAnimation(f, transit, false,
-                                        transitionStyle);
-                            }
-                            if (anim != null) {
-                                final Fragment fragment = f;
-                                f.mAnimatingAway = f.mView;
-                                f.mStateAfterAnimating = newState;
-                                final View viewToAnimate = f.mView;
-                                anim.setAnimationListener(new AnimateOnHWLayerIfNeededListener(
-                                        viewToAnimate, anim) {
-                                    @Override
-                                    public void onAnimationEnd(Animation animation) {
-                                        super.onAnimationEnd(animation);
-                                        if (fragment.mAnimatingAway != null) {
-                                            fragment.mAnimatingAway = null;
-                                            moveToState(fragment, fragment.mStateAfterAnimating,
-                                                    0, 0, false);
-                                        }
-                                    }
-                                });
-                                f.mView.startAnimation(anim);
-                            }
-                            f.mContainer.removeView(f.mView);
-                        }
-                        f.mContainer = null;
-                        f.mView = null;
-                        f.mInnerView = null;
-                    }
-                case Fragment.CREATED:
-                    if (newState < Fragment.CREATED) {
-                        if (mDestroyed) {
-                            if (f.mAnimatingAway != null) {
-                                // The fragment's containing activity is
-                                // being destroyed, but this fragment is
-                                // currently animating away.  Stop the
-                                // animation right now -- it is not needed,
-                                // and we can't wait any more on destroying
-                                // the fragment.
-                                View v = f.mAnimatingAway;
-                                f.mAnimatingAway = null;
-                                v.clearAnimation();
-                            }
-                        }
-                        if (f.mAnimatingAway != null) {
-                            // We are waiting for the fragment's view to finish
-                            // animating away.  Just make a note of the state
-                            // the fragment now should move to once the animation
-                            // is done.
-                            f.mStateAfterAnimating = newState;
-                            newState = Fragment.CREATED;
-                        } else {
-                            if (DEBUG) Log.v(TAG, "movefrom CREATED: " + f);
-                            if (!f.mRetaining) {
-                                f.performDestroy();
-                            } else {
-                                f.mState = Fragment.INITIALIZING;
-                            }
-
-                            f.performDetach();
-                            if (!keepActive) {
-                                if (!f.mRetaining) {
-                                    makeInactive(f);
-                                } else {
-                                    f.mHost = null;
-                                    f.mParentFragment = null;
-                                    f.mFragmentManager = null;
-                                }
-                            }
-                        }
-                    }
-            }
-        }
-
-        if (f.mState != newState) {
-            Log.w(TAG, "moveToState: Fragment state for " + f + " not updated inline; "
-                    + "expected state " + newState + " found " + f.mState);
-            f.mState = newState;
-        }
-    }
-    
-    void moveToState(Fragment f) {
-        moveToState(f, mCurState, 0, 0, false);
-    }
-
-    void moveToState(int newState, boolean always) {
-        moveToState(newState, 0, 0, always);
-    }
-    
-    void moveToState(int newState, int transit, int transitStyle, boolean always) {
-        if (mHost == null && newState != Fragment.INITIALIZING) {
-            throw new IllegalStateException("No host");
-        }
-
-        if (!always && mCurState == newState) {
-            return;
-        }
-
-        mCurState = newState;
-        if (mActive != null) {
-            boolean loadersRunning = false;
-            for (int i=0; i<mActive.size(); i++) {
-                Fragment f = mActive.get(i);
-                if (f != null) {
-                    moveToState(f, newState, transit, transitStyle, false);
-                    if (f.mLoaderManager != null) {
-                        loadersRunning |= f.mLoaderManager.hasRunningLoaders();
-                    }
-                }
-            }
-
-            if (!loadersRunning) {
-                startPendingDeferredFragments();
-            }
-
-            if (mNeedMenuInvalidate && mHost != null && mCurState == Fragment.RESUMED) {
-                mHost.onSupportInvalidateOptionsMenu();
-                mNeedMenuInvalidate = false;
-            }
-        }
-    }
-
-    void startPendingDeferredFragments() {
-        if (mActive == null) return;
-
-        for (int i=0; i<mActive.size(); i++) {
-            Fragment f = mActive.get(i);
-            if (f != null) {
-                performPendingDeferredStart(f);
-            }
-        }
-    }
-    
-    void makeActive(Fragment f) {
-        if (f.mIndex >= 0) {
-            return;
-        }
-        
-        if (mAvailIndices == null || mAvailIndices.size() <= 0) {
-            if (mActive == null) {
-                mActive = new ArrayList<Fragment>();
-            }
-            f.setIndex(mActive.size(), mParent);
-            mActive.add(f);
-            
-        } else {
-            f.setIndex(mAvailIndices.remove(mAvailIndices.size()-1), mParent);
-            mActive.set(f.mIndex, f);
-        }
-        if (DEBUG) Log.v(TAG, "Allocated fragment index " + f);
-    }
-    
-    void makeInactive(Fragment f) {
-        if (f.mIndex < 0) {
-            return;
-        }
-        
-        if (DEBUG) Log.v(TAG, "Freeing fragment index " + f);
-        mActive.set(f.mIndex, null);
-        if (mAvailIndices == null) {
-            mAvailIndices = new ArrayList<Integer>();
-        }
-        mAvailIndices.add(f.mIndex);
-        mHost.inactivateFragment(f.mWho);
-        f.initState();
-    }
-    
-    public void addFragment(Fragment fragment, boolean moveToStateNow) {
-        if (mAdded == null) {
-            mAdded = new ArrayList<Fragment>();
-        }
-        if (DEBUG) Log.v(TAG, "add: " + fragment);
-        makeActive(fragment);
-        if (!fragment.mDetached) {
-            if (mAdded.contains(fragment)) {
-                throw new IllegalStateException("Fragment already added: " + fragment);
-            }
-            mAdded.add(fragment);
-            fragment.mAdded = true;
-            fragment.mRemoving = false;
-            if (fragment.mHasMenu && fragment.mMenuVisible) {
-                mNeedMenuInvalidate = true;
-            }
-            if (moveToStateNow) {
-                moveToState(fragment);
-            }
-        }
-    }
-    
-    public void removeFragment(Fragment fragment, int transition, int transitionStyle) {
-        if (DEBUG) Log.v(TAG, "remove: " + fragment + " nesting=" + fragment.mBackStackNesting);
-        final boolean inactive = !fragment.isInBackStack();
-        if (!fragment.mDetached || inactive) {
-            if (mAdded != null) {
-                mAdded.remove(fragment);
-            }
-            if (fragment.mHasMenu && fragment.mMenuVisible) {
-                mNeedMenuInvalidate = true;
-            }
-            fragment.mAdded = false;
-            fragment.mRemoving = true;
-            moveToState(fragment, inactive ? Fragment.INITIALIZING : Fragment.CREATED,
-                    transition, transitionStyle, false);
-        }
-    }
-    
-    public void hideFragment(Fragment fragment, int transition, int transitionStyle) {
-        if (DEBUG) Log.v(TAG, "hide: " + fragment);
-        if (!fragment.mHidden) {
-            fragment.mHidden = true;
-            if (fragment.mView != null) {
-                Animation anim = loadAnimation(fragment, transition, false,
-                        transitionStyle);
-                if (anim != null) {
-                    setHWLayerAnimListenerIfAlpha(fragment.mView, anim);
-                    fragment.mView.startAnimation(anim);
-                }
-                fragment.mView.setVisibility(View.GONE);
-            }
-            if (fragment.mAdded && fragment.mHasMenu && fragment.mMenuVisible) {
-                mNeedMenuInvalidate = true;
-            }
-            fragment.onHiddenChanged(true);
-        }
-    }
-    
-    public void showFragment(Fragment fragment, int transition, int transitionStyle) {
-        if (DEBUG) Log.v(TAG, "show: " + fragment);
-        if (fragment.mHidden) {
-            fragment.mHidden = false;
-            if (fragment.mView != null) {
-                Animation anim = loadAnimation(fragment, transition, true,
-                        transitionStyle);
-                if (anim != null) {
-                    setHWLayerAnimListenerIfAlpha(fragment.mView, anim);
-                    fragment.mView.startAnimation(anim);
-                }
-                fragment.mView.setVisibility(View.VISIBLE);
-            }
-            if (fragment.mAdded && fragment.mHasMenu && fragment.mMenuVisible) {
-                mNeedMenuInvalidate = true;
-            }
-            fragment.onHiddenChanged(false);
-        }
-    }
-    
-    public void detachFragment(Fragment fragment, int transition, int transitionStyle) {
-        if (DEBUG) Log.v(TAG, "detach: " + fragment);
-        if (!fragment.mDetached) {
-            fragment.mDetached = true;
-            if (fragment.mAdded) {
-                // We are not already in back stack, so need to remove the fragment.
-                if (mAdded != null) {
-                    if (DEBUG) Log.v(TAG, "remove from detach: " + fragment);
-                    mAdded.remove(fragment);
-                }
-                if (fragment.mHasMenu && fragment.mMenuVisible) {
-                    mNeedMenuInvalidate = true;
-                }
-                fragment.mAdded = false;
-                moveToState(fragment, Fragment.CREATED, transition, transitionStyle, false);
-            }
-        }
-    }
-
-    public void attachFragment(Fragment fragment, int transition, int transitionStyle) {
-        if (DEBUG) Log.v(TAG, "attach: " + fragment);
-        if (fragment.mDetached) {
-            fragment.mDetached = false;
-            if (!fragment.mAdded) {
-                if (mAdded == null) {
-                    mAdded = new ArrayList<Fragment>();
-                }
-                if (mAdded.contains(fragment)) {
-                    throw new IllegalStateException("Fragment already added: " + fragment);
-                }
-                if (DEBUG) Log.v(TAG, "add from attach: " + fragment);
-                mAdded.add(fragment);
-                fragment.mAdded = true;
-                if (fragment.mHasMenu && fragment.mMenuVisible) {
-                    mNeedMenuInvalidate = true;
-                }
-                moveToState(fragment, mCurState, transition, transitionStyle, false);
-            }
-        }
-    }
-
-    public Fragment findFragmentById(int id) {
-        if (mAdded != null) {
-            // First look through added fragments.
-            for (int i=mAdded.size()-1; i>=0; i--) {
-                Fragment f = mAdded.get(i);
-                if (f != null && f.mFragmentId == id) {
-                    return f;
-                }
-            }
-        }
-        if (mActive != null) {
-            // Now for any known fragment.
-            for (int i=mActive.size()-1; i>=0; i--) {
-                Fragment f = mActive.get(i);
-                if (f != null && f.mFragmentId == id) {
-                    return f;
-                }
-            }
-        }
-        return null;
-    }
-    
-    public Fragment findFragmentByTag(String tag) {
-        if (mAdded != null && tag != null) {
-            // First look through added fragments.
-            for (int i=mAdded.size()-1; i>=0; i--) {
-                Fragment f = mAdded.get(i);
-                if (f != null && tag.equals(f.mTag)) {
-                    return f;
-                }
-            }
-        }
-        if (mActive != null && tag != null) {
-            // Now for any known fragment.
-            for (int i=mActive.size()-1; i>=0; i--) {
-                Fragment f = mActive.get(i);
-                if (f != null && tag.equals(f.mTag)) {
-                    return f;
-                }
-            }
-        }
-        return null;
-    }
-    
-    public Fragment findFragmentByWho(String who) {
-        if (mActive != null && who != null) {
-            for (int i=mActive.size()-1; i>=0; i--) {
-                Fragment f = mActive.get(i);
-                if (f != null && (f=f.findFragmentByWho(who)) != null) {
-                    return f;
-                }
-            }
-        }
-        return null;
-    }
-    
-    private void checkStateLoss() {
-        if (mStateSaved) {
-            throw new IllegalStateException(
-                    "Can not perform this action after onSaveInstanceState");
-        }
-        if (mNoTransactionsBecause != null) {
-            throw new IllegalStateException(
-                    "Can not perform this action inside of " + mNoTransactionsBecause);
-        }
-    }
-
-    /**
-     * Adds an action to the queue of pending actions.
-     *
-     * @param action the action to add
-     * @param allowStateLoss whether to allow loss of state information
-     * @throws IllegalStateException if the activity has been destroyed
-     */
-    public void enqueueAction(Runnable action, boolean allowStateLoss) {
-        if (!allowStateLoss) {
-            checkStateLoss();
-        }
-        synchronized (this) {
-            if (mDestroyed || mHost == null) {
-                throw new IllegalStateException("Activity has been destroyed");
-            }
-            if (mPendingActions == null) {
-                mPendingActions = new ArrayList<Runnable>();
-            }
-            mPendingActions.add(action);
-            if (mPendingActions.size() == 1) {
-                mHost.getHandler().removeCallbacks(mExecCommit);
-                mHost.getHandler().post(mExecCommit);
-            }
-        }
-    }
-    
-    public int allocBackStackIndex(BackStackRecord bse) {
-        synchronized (this) {
-            if (mAvailBackStackIndices == null || mAvailBackStackIndices.size() <= 0) {
-                if (mBackStackIndices == null) {
-                    mBackStackIndices = new ArrayList<BackStackRecord>();
-                }
-                int index = mBackStackIndices.size();
-                if (DEBUG) Log.v(TAG, "Setting back stack index " + index + " to " + bse);
-                mBackStackIndices.add(bse);
-                return index;
-
-            } else {
-                int index = mAvailBackStackIndices.remove(mAvailBackStackIndices.size()-1);
-                if (DEBUG) Log.v(TAG, "Adding back stack index " + index + " with " + bse);
-                mBackStackIndices.set(index, bse);
-                return index;
-            }
-        }
-    }
-
-    public void setBackStackIndex(int index, BackStackRecord bse) {
-        synchronized (this) {
-            if (mBackStackIndices == null) {
-                mBackStackIndices = new ArrayList<BackStackRecord>();
-            }
-            int N = mBackStackIndices.size();
-            if (index < N) {
-                if (DEBUG) Log.v(TAG, "Setting back stack index " + index + " to " + bse);
-                mBackStackIndices.set(index, bse);
-            } else {
-                while (N < index) {
-                    mBackStackIndices.add(null);
-                    if (mAvailBackStackIndices == null) {
-                        mAvailBackStackIndices = new ArrayList<Integer>();
-                    }
-                    if (DEBUG) Log.v(TAG, "Adding available back stack index " + N);
-                    mAvailBackStackIndices.add(N);
-                    N++;
-                }
-                if (DEBUG) Log.v(TAG, "Adding back stack index " + index + " with " + bse);
-                mBackStackIndices.add(bse);
-            }
-        }
-    }
-
-    public void freeBackStackIndex(int index) {
-        synchronized (this) {
-            mBackStackIndices.set(index, null);
-            if (mAvailBackStackIndices == null) {
-                mAvailBackStackIndices = new ArrayList<Integer>();
-            }
-            if (DEBUG) Log.v(TAG, "Freeing back stack index " + index);
-            mAvailBackStackIndices.add(index);
-        }
-    }
-
-    public void execSingleAction(Runnable action, boolean allowStateLoss) {
-        if (mExecutingActions) {
-            throw new IllegalStateException("FragmentManager is already executing transactions");
-        }
-
-        if (Looper.myLooper() != mHost.getHandler().getLooper()) {
-            throw new IllegalStateException("Must be called from main thread of fragment host");
-        }
-
-        if (!allowStateLoss) {
-            checkStateLoss();
-        }
-
-        mExecutingActions = true;
-        action.run();
-        mExecutingActions = false;
-
-        doPendingDeferredStart();
-    }
-
-    /**
-     * Only call from main thread!
-     */
-    public boolean execPendingActions() {
-        if (mExecutingActions) {
-            throw new IllegalStateException("FragmentManager is already executing transactions");
-        }
-        
-        if (Looper.myLooper() != mHost.getHandler().getLooper()) {
-            throw new IllegalStateException("Must be called from main thread of fragment host");
-        }
-
-        boolean didSomething = false;
-
-        while (true) {
-            int numActions;
-            
-            synchronized (this) {
-                if (mPendingActions == null || mPendingActions.size() == 0) {
-                    break;
-                }
-                
-                numActions = mPendingActions.size();
-                if (mTmpActions == null || mTmpActions.length < numActions) {
-                    mTmpActions = new Runnable[numActions];
-                }
-                mPendingActions.toArray(mTmpActions);
-                mPendingActions.clear();
-                mHost.getHandler().removeCallbacks(mExecCommit);
-            }
-            
-            mExecutingActions = true;
-            for (int i=0; i<numActions; i++) {
-                mTmpActions[i].run();
-                mTmpActions[i] = null;
-            }
-            mExecutingActions = false;
-            didSomething = true;
-        }
-        
-        doPendingDeferredStart();
-
-        return didSomething;
-    }
-
-    void doPendingDeferredStart() {
-        if (mHavePendingDeferredStart) {
-            boolean loadersRunning = false;
-            for (int i = 0; i < mActive.size(); i++) {
-                Fragment f = mActive.get(i);
-                if (f != null && f.mLoaderManager != null) {
-                    loadersRunning |= f.mLoaderManager.hasRunningLoaders();
-                }
-            }
-            if (!loadersRunning) {
-                mHavePendingDeferredStart = false;
-                startPendingDeferredFragments();
-            }
-        }
-    }
-
-    void reportBackStackChanged() {
-        if (mBackStackChangeListeners != null) {
-            for (int i=0; i<mBackStackChangeListeners.size(); i++) {
-                mBackStackChangeListeners.get(i).onBackStackChanged();
-            }
-        }
-    }
-
-    void addBackStackState(BackStackRecord state) {
-        if (mBackStack == null) {
-            mBackStack = new ArrayList<BackStackRecord>();
-        }
-        mBackStack.add(state);
-        reportBackStackChanged();
-    }
-    
-    @SuppressWarnings("unused")
-    boolean popBackStackState(Handler handler, String name, int id, int flags) {
-        if (mBackStack == null) {
-            return false;
-        }
-        if (name == null && id < 0 && (flags&POP_BACK_STACK_INCLUSIVE) == 0) {
-            int last = mBackStack.size()-1;
-            if (last < 0) {
-                return false;
-            }
-            final BackStackRecord bss = mBackStack.remove(last);
-            SparseArray<Fragment> firstOutFragments = new SparseArray<Fragment>();
-            SparseArray<Fragment> lastInFragments = new SparseArray<Fragment>();
-            if (mCurState >= Fragment.CREATED) {
-                bss.calculateBackFragments(firstOutFragments, lastInFragments);
-            }
-            bss.popFromBackStack(true, null, firstOutFragments, lastInFragments);
-            reportBackStackChanged();
-        } else {
-            int index = -1;
-            if (name != null || id >= 0) {
-                // If a name or ID is specified, look for that place in
-                // the stack.
-                index = mBackStack.size()-1;
-                while (index >= 0) {
-                    BackStackRecord bss = mBackStack.get(index);
-                    if (name != null && name.equals(bss.getName())) {
-                        break;
-                    }
-                    if (id >= 0 && id == bss.mIndex) {
-                        break;
-                    }
-                    index--;
-                }
-                if (index < 0) {
-                    return false;
-                }
-                if ((flags&POP_BACK_STACK_INCLUSIVE) != 0) {
-                    index--;
-                    // Consume all following entries that match.
-                    while (index >= 0) {
-                        BackStackRecord bss = mBackStack.get(index);
-                        if ((name != null && name.equals(bss.getName()))
-                                || (id >= 0 && id == bss.mIndex)) {
-                            index--;
-                            continue;
-                        }
-                        break;
-                    }
-                }
-            }
-            if (index == mBackStack.size()-1) {
-                return false;
-            }
-            final ArrayList<BackStackRecord> states
-                    = new ArrayList<BackStackRecord>();
-            for (int i=mBackStack.size()-1; i>index; i--) {
-                states.add(mBackStack.remove(i));
-            }
-            final int LAST = states.size()-1;
-            SparseArray<Fragment> firstOutFragments = new SparseArray<Fragment>();
-            SparseArray<Fragment> lastInFragments = new SparseArray<Fragment>();
-            if (mCurState >= Fragment.CREATED) {
-                for (int i = 0; i <= LAST; i++) {
-                    states.get(i).calculateBackFragments(firstOutFragments, lastInFragments);
-                }
-            }
-            BackStackRecord.TransitionState state = null;
-            for (int i=0; i<=LAST; i++) {
-                if (DEBUG) Log.v(TAG, "Popping back stack state: " + states.get(i));
-                state = states.get(i).popFromBackStack(i == LAST, state,
-                        firstOutFragments, lastInFragments);
-            }
-            reportBackStackChanged();
-        }
-        return true;
-    }
-    
-    FragmentManagerNonConfig retainNonConfig() {
-        ArrayList<Fragment> fragments = null;
-        ArrayList<FragmentManagerNonConfig> childFragments = null;
-        if (mActive != null) {
-            for (int i=0; i<mActive.size(); i++) {
-                Fragment f = mActive.get(i);
-                if (f != null) {
-                    if (f.mRetainInstance) {
-                        if (fragments == null) {
-                            fragments = new ArrayList<Fragment>();
-                        }
-                        fragments.add(f);
-                        f.mRetaining = true;
-                        f.mTargetIndex = f.mTarget != null ? f.mTarget.mIndex : -1;
-                        if (DEBUG) Log.v(TAG, "retainNonConfig: keeping retained " + f);
-                    }
-                    boolean addedChild = false;
-                    if (f.mChildFragmentManager != null) {
-                        FragmentManagerNonConfig child = f.mChildFragmentManager.retainNonConfig();
-                        if (child != null) {
-                            if (childFragments == null) {
-                                childFragments = new ArrayList<FragmentManagerNonConfig>();
-                                for (int j = 0; j < i; j++) {
-                                    childFragments.add(null);
-                                }
-                            }
-                            childFragments.add(child);
-                            addedChild = true;
-                        }
-                    }
-                    if (childFragments != null && !addedChild) {
-                        childFragments.add(null);
-                    }
-                }
-            }
-        }
-        if (fragments == null && childFragments == null) {
-            return null;
-        }
-        return new FragmentManagerNonConfig(fragments, childFragments);
-    }
-    
-    void saveFragmentViewState(Fragment f) {
-        if (f.mInnerView == null) {
-            return;
-        }
-        if (mStateArray == null) {
-            mStateArray = new SparseArray<Parcelable>();
-        } else {
-            mStateArray.clear();
-        }
-        f.mInnerView.saveHierarchyState(mStateArray);
-        if (mStateArray.size() > 0) {
-            f.mSavedViewState = mStateArray;
-            mStateArray = null;
-        }
-    }
-    
-    Bundle saveFragmentBasicState(Fragment f) {
-        Bundle result = null;
-
-        if (mStateBundle == null) {
-            mStateBundle = new Bundle();
-        }
-        f.performSaveInstanceState(mStateBundle);
-        if (!mStateBundle.isEmpty()) {
-            result = mStateBundle;
-            mStateBundle = null;
-        }
-
-        if (f.mView != null) {
-            saveFragmentViewState(f);
-        }
-        if (f.mSavedViewState != null) {
-            if (result == null) {
-                result = new Bundle();
-            }
-            result.putSparseParcelableArray(
-                    FragmentManagerImpl.VIEW_STATE_TAG, f.mSavedViewState);
-        }
-        if (!f.mUserVisibleHint) {
-            if (result == null) {
-                result = new Bundle();
-            }
-            // Only add this if it's not the default value
-            result.putBoolean(FragmentManagerImpl.USER_VISIBLE_HINT_TAG, f.mUserVisibleHint);
-        }
-
-        return result;
-    }
-
-    Parcelable saveAllState() {
-        // Make sure all pending operations have now been executed to get
-        // our state update-to-date.
-        execPendingActions();
-
-        if (HONEYCOMB) {
-            // As of Honeycomb, we save state after pausing.  Prior to that
-            // it is before pausing.  With fragments this is an issue, since
-            // there are many things you may do after pausing but before
-            // stopping that change the fragment state.  For those older
-            // devices, we will not at this point say that we have saved
-            // the state, so we will allow them to continue doing fragment
-            // transactions.  This retains the same semantics as Honeycomb,
-            // though you do have the risk of losing the very most recent state
-            // if the process is killed...  we'll live with that.
-            mStateSaved = true;
-        }
-
-        if (mActive == null || mActive.size() <= 0) {
-            return null;
-        }
-        
-        // First collect all active fragments.
-        int N = mActive.size();
-        FragmentState[] active = new FragmentState[N];
-        boolean haveFragments = false;
-        for (int i=0; i<N; i++) {
-            Fragment f = mActive.get(i);
-            if (f != null) {
-                if (f.mIndex < 0) {
-                    throwException(new IllegalStateException(
-                            "Failure saving state: active " + f
-                            + " has cleared index: " + f.mIndex));
-                }
-
-                haveFragments = true;
-                
-                FragmentState fs = new FragmentState(f);
-                active[i] = fs;
-                
-                if (f.mState > Fragment.INITIALIZING && fs.mSavedFragmentState == null) {
-                    fs.mSavedFragmentState = saveFragmentBasicState(f);
-
-                    if (f.mTarget != null) {
-                        if (f.mTarget.mIndex < 0) {
-                            throwException(new IllegalStateException(
-                                    "Failure saving state: " + f
-                                    + " has target not in fragment manager: " + f.mTarget));
-                        }
-                        if (fs.mSavedFragmentState == null) {
-                            fs.mSavedFragmentState = new Bundle();
-                        }
-                        putFragment(fs.mSavedFragmentState,
-                                FragmentManagerImpl.TARGET_STATE_TAG, f.mTarget);
-                        if (f.mTargetRequestCode != 0) {
-                            fs.mSavedFragmentState.putInt(
-                                    FragmentManagerImpl.TARGET_REQUEST_CODE_STATE_TAG,
-                                    f.mTargetRequestCode);
-                        }
-                    }
-
-                } else {
-                    fs.mSavedFragmentState = f.mSavedFragmentState;
-                }
-                
-                if (DEBUG) Log.v(TAG, "Saved state of " + f + ": "
-                        + fs.mSavedFragmentState);
-            }
-        }
-        
-        if (!haveFragments) {
-            if (DEBUG) Log.v(TAG, "saveAllState: no fragments!");
-            return null;
-        }
-        
-        int[] added = null;
-        BackStackState[] backStack = null;
-        
-        // Build list of currently added fragments.
-        if (mAdded != null) {
-            N = mAdded.size();
-            if (N > 0) {
-                added = new int[N];
-                for (int i=0; i<N; i++) {
-                    added[i] = mAdded.get(i).mIndex;
-                    if (added[i] < 0) {
-                        throwException(new IllegalStateException(
-                                "Failure saving state: active " + mAdded.get(i)
-                                + " has cleared index: " + added[i]));
-                    }
-                    if (DEBUG) Log.v(TAG, "saveAllState: adding fragment #" + i
-                            + ": " + mAdded.get(i));
-                }
-            }
-        }
-        
-        // Now save back stack.
-        if (mBackStack != null) {
-            N = mBackStack.size();
-            if (N > 0) {
-                backStack = new BackStackState[N];
-                for (int i=0; i<N; i++) {
-                    backStack[i] = new BackStackState(mBackStack.get(i));
-                    if (DEBUG) Log.v(TAG, "saveAllState: adding back stack #" + i
-                            + ": " + mBackStack.get(i));
-                }
-            }
-        }
-        
-        FragmentManagerState fms = new FragmentManagerState();
-        fms.mActive = active;
-        fms.mAdded = added;
-        fms.mBackStack = backStack;
-        return fms;
-    }
-    
-    void restoreAllState(Parcelable state, FragmentManagerNonConfig nonConfig) {
-        // If there is no saved state at all, then there can not be
-        // any nonConfig fragments either, so that is that.
-        if (state == null) return;
-        FragmentManagerState fms = (FragmentManagerState)state;
-        if (fms.mActive == null) return;
-
-        List<FragmentManagerNonConfig> childNonConfigs = null;
-
-        // First re-attach any non-config instances we are retaining back
-        // to their saved state, so we don't try to instantiate them again.
-        if (nonConfig != null) {
-            List<Fragment> nonConfigFragments = nonConfig.getFragments();
-            childNonConfigs = nonConfig.getChildNonConfigs();
-            final int count = nonConfigFragments != null ? nonConfigFragments.size() : 0;
-            for (int i = 0; i < count; i++) {
-                Fragment f = nonConfigFragments.get(i);
-                if (DEBUG) Log.v(TAG, "restoreAllState: re-attaching retained " + f);
-                FragmentState fs = fms.mActive[f.mIndex];
-                fs.mInstance = f;
-                f.mSavedViewState = null;
-                f.mBackStackNesting = 0;
-                f.mInLayout = false;
-                f.mAdded = false;
-                f.mTarget = null;
-                if (fs.mSavedFragmentState != null) {
-                    fs.mSavedFragmentState.setClassLoader(mHost.getContext().getClassLoader());
-                    f.mSavedViewState = fs.mSavedFragmentState.getSparseParcelableArray(
-                            FragmentManagerImpl.VIEW_STATE_TAG);
-                    f.mSavedFragmentState = fs.mSavedFragmentState;
-                }
-            }
-        }
-        
-        // Build the full list of active fragments, instantiating them from
-        // their saved state.
-        mActive = new ArrayList<>(fms.mActive.length);
-        if (mAvailIndices != null) {
-            mAvailIndices.clear();
-        }
-        for (int i=0; i<fms.mActive.length; i++) {
-            FragmentState fs = fms.mActive[i];
-            if (fs != null) {
-                FragmentManagerNonConfig childNonConfig = null;
-                if (childNonConfigs != null && i < childNonConfigs.size()) {
-                    childNonConfig = childNonConfigs.get(i);
-                }
-                Fragment f = fs.instantiate(mHost, mParent, childNonConfig);
-                if (DEBUG) Log.v(TAG, "restoreAllState: active #" + i + ": " + f);
-                mActive.add(f);
-                // Now that the fragment is instantiated (or came from being
-                // retained above), clear mInstance in case we end up re-restoring
-                // from this FragmentState again.
-                fs.mInstance = null;
-            } else {
-                mActive.add(null);
-                if (mAvailIndices == null) {
-                    mAvailIndices = new ArrayList<Integer>();
-                }
-                if (DEBUG) Log.v(TAG, "restoreAllState: avail #" + i);
-                mAvailIndices.add(i);
-            }
-        }
-        
-        // Update the target of all retained fragments.
-        if (nonConfig != null) {
-            List<Fragment> nonConfigFragments = nonConfig.getFragments();
-            final int count = nonConfigFragments != null ? nonConfigFragments.size() : 0;
-            for (int i = 0; i < count; i++) {
-                Fragment f = nonConfigFragments.get(i);
-                if (f.mTargetIndex >= 0) {
-                    if (f.mTargetIndex < mActive.size()) {
-                        f.mTarget = mActive.get(f.mTargetIndex);
-                    } else {
-                        Log.w(TAG, "Re-attaching retained fragment " + f
-                                + " target no longer exists: " + f.mTargetIndex);
-                        f.mTarget = null;
-                    }
-                }
-            }
-        }
-
-        // Build the list of currently added fragments.
-        if (fms.mAdded != null) {
-            mAdded = new ArrayList<Fragment>(fms.mAdded.length);
-            for (int i=0; i<fms.mAdded.length; i++) {
-                Fragment f = mActive.get(fms.mAdded[i]);
-                if (f == null) {
-                    throwException(new IllegalStateException(
-                            "No instantiated fragment for index #" + fms.mAdded[i]));
-                }
-                f.mAdded = true;
-                if (DEBUG) Log.v(TAG, "restoreAllState: added #" + i + ": " + f);
-                if (mAdded.contains(f)) {
-                    throw new IllegalStateException("Already added!");
-                }
-                mAdded.add(f);
-            }
-        } else {
-            mAdded = null;
-        }
-        
-        // Build the back stack.
-        if (fms.mBackStack != null) {
-            mBackStack = new ArrayList<BackStackRecord>(fms.mBackStack.length);
-            for (int i=0; i<fms.mBackStack.length; i++) {
-                BackStackRecord bse = fms.mBackStack[i].instantiate(this);
-                if (DEBUG) {
-                    Log.v(TAG, "restoreAllState: back stack #" + i
-                        + " (index " + bse.mIndex + "): " + bse);
-                    LogWriter logw = new LogWriter(TAG);
-                    PrintWriter pw = new PrintWriter(logw);
-                    bse.dump("  ", pw, false);
-                }
-                mBackStack.add(bse);
-                if (bse.mIndex >= 0) {
-                    setBackStackIndex(bse.mIndex, bse);
-                }
-            }
-        } else {
-            mBackStack = null;
-        }
-    }
-
-    public void attachController(FragmentHostCallback host,
-            FragmentContainer container, Fragment parent) {
-        if (mHost != null) throw new IllegalStateException("Already attached");
-        mHost = host;
-        mContainer = container;
-        mParent = parent;
-    }
-    
-    public void noteStateNotSaved() {
-        mStateSaved = false;
-    }
-    
-    public void dispatchCreate() {
-        mStateSaved = false;
-        moveToState(Fragment.CREATED, false);
-    }
-    
-    public void dispatchActivityCreated() {
-        mStateSaved = false;
-        moveToState(Fragment.ACTIVITY_CREATED, false);
-    }
-    
-    public void dispatchStart() {
-        mStateSaved = false;
-        moveToState(Fragment.STARTED, false);
-    }
-    
-    public void dispatchResume() {
-        mStateSaved = false;
-        moveToState(Fragment.RESUMED, false);
-    }
-    
-    public void dispatchPause() {
-        moveToState(Fragment.STARTED, false);
-    }
-    
-    public void dispatchStop() {
-        // See saveAllState() for the explanation of this.  We do this for
-        // all platform versions, to keep our behavior more consistent between
-        // them.
-        mStateSaved = true;
-
-        moveToState(Fragment.STOPPED, false);
-    }
-    
-    public void dispatchReallyStop() {
-        moveToState(Fragment.ACTIVITY_CREATED, false);
-    }
-
-    public void dispatchDestroyView() {
-        moveToState(Fragment.CREATED, false);
-    }
-
-    public void dispatchDestroy() {
-        mDestroyed = true;
-        execPendingActions();
-        moveToState(Fragment.INITIALIZING, false);
-        mHost = null;
-        mContainer = null;
-        mParent = null;
-    }
-
-    public void dispatchMultiWindowModeChanged(boolean isInMultiWindowMode) {
-        if (mAdded == null) {
-            return;
-        }
-        for (int i = mAdded.size() - 1; i >= 0; --i) {
-            final android.support.v4.app.Fragment f = mAdded.get(i);
-            if (f != null) {
-                f.performMultiWindowModeChanged(isInMultiWindowMode);
-            }
-        }
-    }
-
-    public void dispatchPictureInPictureModeChanged(boolean isInPictureInPictureMode) {
-        if (mAdded == null) {
-            return;
-        }
-        for (int i = mAdded.size() - 1; i >= 0; --i) {
-            final android.support.v4.app.Fragment f = mAdded.get(i);
-            if (f != null) {
-                f.performPictureInPictureModeChanged(isInPictureInPictureMode);
-            }
-        }
-    }
-
-    public void dispatchConfigurationChanged(Configuration newConfig) {
-        if (mAdded != null) {
-            for (int i=0; i<mAdded.size(); i++) {
-                Fragment f = mAdded.get(i);
-                if (f != null) {
-                    f.performConfigurationChanged(newConfig);
-                }
-            }
-        }
-    }
-
-    public void dispatchLowMemory() {
-        if (mAdded != null) {
-            for (int i=0; i<mAdded.size(); i++) {
-                Fragment f = mAdded.get(i);
-                if (f != null) {
-                    f.performLowMemory();
-                }
-            }
-        }
-    }
-
-    public boolean dispatchCreateOptionsMenu(Menu menu, MenuInflater inflater) {
-        boolean show = false;
-        ArrayList<Fragment> newMenus = null;
-        if (mAdded != null) {
-            for (int i=0; i<mAdded.size(); i++) {
-                Fragment f = mAdded.get(i);
-                if (f != null) {
-                    if (f.performCreateOptionsMenu(menu, inflater)) {
-                        show = true;
-                        if (newMenus == null) {
-                            newMenus = new ArrayList<Fragment>();
-                        }
-                        newMenus.add(f);
-                    }
-                }
-            }
-        }
-
-        if (mCreatedMenus != null) {
-            for (int i=0; i<mCreatedMenus.size(); i++) {
-                Fragment f = mCreatedMenus.get(i);
-                if (newMenus == null || !newMenus.contains(f)) {
-                    f.onDestroyOptionsMenu();
-                }
-            }
-        }
-
-        mCreatedMenus = newMenus;
-
-        return show;
-    }
-    
-    public boolean dispatchPrepareOptionsMenu(Menu menu) {
-        boolean show = false;
-        if (mAdded != null) {
-            for (int i=0; i<mAdded.size(); i++) {
-                Fragment f = mAdded.get(i);
-                if (f != null) {
-                    if (f.performPrepareOptionsMenu(menu)) {
-                        show = true;
-                    }
-                }
-            }
-        }
-        return show;
-    }
-    
-    public boolean dispatchOptionsItemSelected(MenuItem item) {
-        if (mAdded != null) {
-            for (int i=0; i<mAdded.size(); i++) {
-                Fragment f = mAdded.get(i);
-                if (f != null) {
-                    if (f.performOptionsItemSelected(item)) {
-                        return true;
-                    }
-                }
-            }
-        }
-        return false;
-    }
-    
-    public boolean dispatchContextItemSelected(MenuItem item) {
-        if (mAdded != null) {
-            for (int i=0; i<mAdded.size(); i++) {
-                Fragment f = mAdded.get(i);
-                if (f != null) {
-                    if (f.performContextItemSelected(item)) {
-                        return true;
-                    }
-                }
-            }
-        }
-        return false;
-    }
-    
-    public void dispatchOptionsMenuClosed(Menu menu) {
-        if (mAdded != null) {
-            for (int i=0; i<mAdded.size(); i++) {
-                Fragment f = mAdded.get(i);
-                if (f != null) {
-                    f.performOptionsMenuClosed(menu);
-                }
-            }
-        }
-    }
-
-    public static int reverseTransit(int transit) {
-        int rev = 0;
-        switch (transit) {
-            case FragmentTransaction.TRANSIT_FRAGMENT_OPEN:
-                rev = FragmentTransaction.TRANSIT_FRAGMENT_CLOSE;
-                break;
-            case FragmentTransaction.TRANSIT_FRAGMENT_CLOSE:
-                rev = FragmentTransaction.TRANSIT_FRAGMENT_OPEN;
-                break;
-            case FragmentTransaction.TRANSIT_FRAGMENT_FADE:
-                rev = FragmentTransaction.TRANSIT_FRAGMENT_FADE;
-                break;
-        }
-        return rev;
-        
-    }
-    
-    public static final int ANIM_STYLE_OPEN_ENTER = 1;
-    public static final int ANIM_STYLE_OPEN_EXIT = 2;
-    public static final int ANIM_STYLE_CLOSE_ENTER = 3;
-    public static final int ANIM_STYLE_CLOSE_EXIT = 4;
-    public static final int ANIM_STYLE_FADE_ENTER = 5;
-    public static final int ANIM_STYLE_FADE_EXIT = 6;
-    
-    public static int transitToStyleIndex(int transit, boolean enter) {
-        int animAttr = -1;
-        switch (transit) {
-            case FragmentTransaction.TRANSIT_FRAGMENT_OPEN:
-                animAttr = enter ? ANIM_STYLE_OPEN_ENTER : ANIM_STYLE_OPEN_EXIT;
-                break;
-            case FragmentTransaction.TRANSIT_FRAGMENT_CLOSE:
-                animAttr = enter ? ANIM_STYLE_CLOSE_ENTER : ANIM_STYLE_CLOSE_EXIT;
-                break;
-            case FragmentTransaction.TRANSIT_FRAGMENT_FADE:
-                animAttr = enter ? ANIM_STYLE_FADE_ENTER : ANIM_STYLE_FADE_EXIT;
-                break;
-        }
-        return animAttr;
-    }
-
-    @Override
-    public View onCreateView(View parent, String name, Context context, AttributeSet attrs) {
-        if (!"fragment".equals(name)) {
-            return null;
-        }
-
-        String fname = attrs.getAttributeValue(null, "class");
-        TypedArray a =  context.obtainStyledAttributes(attrs, FragmentTag.Fragment);
-        if (fname == null) {
-            fname = a.getString(FragmentTag.Fragment_name);
-        }
-        int id = a.getResourceId(FragmentTag.Fragment_id, View.NO_ID);
-        String tag = a.getString(FragmentTag.Fragment_tag);
-        a.recycle();
-
-        if (!Fragment.isSupportFragmentClass(mHost.getContext(), fname)) {
-            // Invalid support lib fragment; let the device's framework handle it.
-            // This will allow android.app.Fragments to do the right thing.
-            return null;
-        }
-
-        int containerId = parent != null ? parent.getId() : 0;
-        if (containerId == View.NO_ID && id == View.NO_ID && tag == null) {
-            throw new IllegalArgumentException(attrs.getPositionDescription()
-                    + ": Must specify unique android:id, android:tag, or have a parent with an id for " + fname);
-        }
-
-        // If we restored from a previous state, we may already have
-        // instantiated this fragment from the state and should use
-        // that instance instead of making a new one.
-        Fragment fragment = id != View.NO_ID ? findFragmentById(id) : null;
-        if (fragment == null && tag != null) {
-            fragment = findFragmentByTag(tag);
-        }
-        if (fragment == null && containerId != View.NO_ID) {
-            fragment = findFragmentById(containerId);
-        }
-
-        if (FragmentManagerImpl.DEBUG) Log.v(TAG, "onCreateView: id=0x"
-                + Integer.toHexString(id) + " fname=" + fname
-                + " existing=" + fragment);
-        if (fragment == null) {
-            fragment = Fragment.instantiate(context, fname);
-            fragment.mFromLayout = true;
-            fragment.mFragmentId = id != 0 ? id : containerId;
-            fragment.mContainerId = containerId;
-            fragment.mTag = tag;
-            fragment.mInLayout = true;
-            fragment.mFragmentManager = this;
-            fragment.mHost = mHost;
-            fragment.onInflate(mHost.getContext(), attrs, fragment.mSavedFragmentState);
-            addFragment(fragment, true);
-
-        } else if (fragment.mInLayout) {
-            // A fragment already exists and it is not one we restored from
-            // previous state.
-            throw new IllegalArgumentException(attrs.getPositionDescription()
-                    + ": Duplicate id 0x" + Integer.toHexString(id)
-                    + ", tag " + tag + ", or parent id 0x" + Integer.toHexString(containerId)
-                    + " with another fragment for " + fname);
-        } else {
-            // This fragment was retained from a previous instance; get it
-            // going now.
-            fragment.mInLayout = true;
-            fragment.mHost = mHost;
-            // If this fragment is newly instantiated (either right now, or
-            // from last saved state), then give it the attributes to
-            // initialize itself.
-            if (!fragment.mRetaining) {
-                fragment.onInflate(mHost.getContext(), attrs, fragment.mSavedFragmentState);
-            }
-        }
-
-        // If we haven't finished entering the CREATED state ourselves yet,
-        // push the inflated child fragment along.
-        if (mCurState < Fragment.CREATED && fragment.mFromLayout) {
-            moveToState(fragment, Fragment.CREATED, 0, 0, false);
-        } else {
-            moveToState(fragment);
-        }
-
-        if (fragment.mView == null) {
-            throw new IllegalStateException("Fragment " + fname
-                    + " did not create a view.");
-        }
-        if (id != 0) {
-            fragment.mView.setId(id);
-        }
-        if (fragment.mView.getTag() == null) {
-            fragment.mView.setTag(tag);
-        }
-        return fragment.mView;
-    }
-
-    LayoutInflaterFactory getLayoutInflaterFactory() {
-        return this;
-    }
-
-    static class FragmentTag {
-        public static final int[] Fragment = {
-                0x01010003, 0x010100d0, 0x010100d1
-        };
-        public static final int Fragment_id = 1;
-        public static final int Fragment_name = 0;
-        public static final int Fragment_tag = 2;
-    }
-}
diff --git a/v4/java/android/support/v4/app/FragmentPagerAdapter.java b/v4/java/android/support/v4/app/FragmentPagerAdapter.java
deleted file mode 100644
index d0d1006..0000000
--- a/v4/java/android/support/v4/app/FragmentPagerAdapter.java
+++ /dev/null
@@ -1,178 +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 android.support.v4.app;
-
-import android.os.Parcelable;
-import android.support.v4.view.PagerAdapter;
-import android.util.Log;
-import android.view.View;
-import android.view.ViewGroup;
-
-/**
- * Implementation of {@link android.support.v4.view.PagerAdapter} that
- * represents each page as a {@link Fragment} that is persistently
- * kept in the fragment manager as long as the user can return to the page.
- *
- * <p>This version of the pager is best for use when there are a handful of
- * typically more static fragments to be paged through, such as a set of tabs.
- * The fragment of each page the user visits will be kept in memory, though its
- * view hierarchy may be destroyed when not visible.  This can result in using
- * a significant amount of memory since fragment instances can hold on to an
- * arbitrary amount of state.  For larger sets of pages, consider
- * {@link FragmentStatePagerAdapter}.
- *
- * <p>When using FragmentPagerAdapter the host ViewPager must have a
- * valid ID set.</p>
- *
- * <p>Subclasses only need to implement {@link #getItem(int)}
- * and {@link #getCount()} to have a working adapter.
- *
- * <p>Here is an example implementation of a pager containing fragments of
- * lists:
- *
- * {@sample development/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentPagerSupport.java
- *      complete}
- *
- * <p>The <code>R.layout.fragment_pager</code> resource of the top-level fragment is:
- *
- * {@sample development/samples/Support4Demos/res/layout/fragment_pager.xml
- *      complete}
- *
- * <p>The <code>R.layout.fragment_pager_list</code> resource containing each
- * individual fragment's layout is:
- *
- * {@sample development/samples/Support4Demos/res/layout/fragment_pager_list.xml
- *      complete}
- */
-public abstract class FragmentPagerAdapter extends PagerAdapter {
-    private static final String TAG = "FragmentPagerAdapter";
-    private static final boolean DEBUG = false;
-
-    private final FragmentManager mFragmentManager;
-    private FragmentTransaction mCurTransaction = null;
-    private Fragment mCurrentPrimaryItem = null;
-
-    public FragmentPagerAdapter(FragmentManager fm) {
-        mFragmentManager = fm;
-    }
-
-    /**
-     * Return the Fragment associated with a specified position.
-     */
-    public abstract Fragment getItem(int position);
-
-    @Override
-    public void startUpdate(ViewGroup container) {
-        if (container.getId() == View.NO_ID) {
-            throw new IllegalStateException("ViewPager with adapter " + this
-                    + " requires a view id");
-        }
-    }
-
-    @Override
-    public Object instantiateItem(ViewGroup container, int position) {
-        if (mCurTransaction == null) {
-            mCurTransaction = mFragmentManager.beginTransaction();
-        }
-
-        final long itemId = getItemId(position);
-
-        // Do we already have this fragment?
-        String name = makeFragmentName(container.getId(), itemId);
-        Fragment fragment = mFragmentManager.findFragmentByTag(name);
-        if (fragment != null) {
-            if (DEBUG) Log.v(TAG, "Attaching item #" + itemId + ": f=" + fragment);
-            mCurTransaction.attach(fragment);
-        } else {
-            fragment = getItem(position);
-            if (DEBUG) Log.v(TAG, "Adding item #" + itemId + ": f=" + fragment);
-            mCurTransaction.add(container.getId(), fragment,
-                    makeFragmentName(container.getId(), itemId));
-        }
-        if (fragment != mCurrentPrimaryItem) {
-            fragment.setMenuVisibility(false);
-            fragment.setUserVisibleHint(false);
-        }
-
-        return fragment;
-    }
-
-    @Override
-    public void destroyItem(ViewGroup container, int position, Object object) {
-        if (mCurTransaction == null) {
-            mCurTransaction = mFragmentManager.beginTransaction();
-        }
-        if (DEBUG) Log.v(TAG, "Detaching item #" + getItemId(position) + ": f=" + object
-                + " v=" + ((Fragment)object).getView());
-        mCurTransaction.detach((Fragment)object);
-    }
-
-    @Override
-    public void setPrimaryItem(ViewGroup container, int position, Object object) {
-        Fragment fragment = (Fragment)object;
-        if (fragment != mCurrentPrimaryItem) {
-            if (mCurrentPrimaryItem != null) {
-                mCurrentPrimaryItem.setMenuVisibility(false);
-                mCurrentPrimaryItem.setUserVisibleHint(false);
-            }
-            if (fragment != null) {
-                fragment.setMenuVisibility(true);
-                fragment.setUserVisibleHint(true);
-            }
-            mCurrentPrimaryItem = fragment;
-        }
-    }
-
-    @Override
-    public void finishUpdate(ViewGroup container) {
-        if (mCurTransaction != null) {
-            mCurTransaction.commitNowAllowingStateLoss();
-            mCurTransaction = null;
-        }
-    }
-
-    @Override
-    public boolean isViewFromObject(View view, Object object) {
-        return ((Fragment)object).getView() == view;
-    }
-
-    @Override
-    public Parcelable saveState() {
-        return null;
-    }
-
-    @Override
-    public void restoreState(Parcelable state, ClassLoader loader) {
-    }
-
-    /**
-     * Return a unique identifier for the item at the given position.
-     *
-     * <p>The default implementation returns the given position.
-     * Subclasses should override this method if the positions of items can change.</p>
-     *
-     * @param position Position within this adapter
-     * @return Unique identifier for the item at position
-     */
-    public long getItemId(int position) {
-        return position;
-    }
-
-    private static String makeFragmentName(int viewId, long id) {
-        return "android:switcher:" + viewId + ":" + id;
-    }
-}
diff --git a/v4/java/android/support/v4/app/FragmentStatePagerAdapter.java b/v4/java/android/support/v4/app/FragmentStatePagerAdapter.java
deleted file mode 100644
index 0154750..0000000
--- a/v4/java/android/support/v4/app/FragmentStatePagerAdapter.java
+++ /dev/null
@@ -1,229 +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 android.support.v4.app;
-
-import android.os.Bundle;
-import android.os.Parcelable;
-import android.support.v4.view.PagerAdapter;
-import android.util.Log;
-import android.view.View;
-import android.view.ViewGroup;
-
-import java.util.ArrayList;
-
-/**
- * Implementation of {@link android.support.v4.view.PagerAdapter} that
- * uses a {@link Fragment} to manage each page. This class also handles
- * saving and restoring of fragment's state.
- *
- * <p>This version of the pager is more useful when there are a large number
- * of pages, working more like a list view.  When pages are not visible to
- * the user, their entire fragment may be destroyed, only keeping the saved
- * state of that fragment.  This allows the pager to hold on to much less
- * memory associated with each visited page as compared to
- * {@link FragmentPagerAdapter} at the cost of potentially more overhead when
- * switching between pages.
- *
- * <p>When using FragmentPagerAdapter the host ViewPager must have a
- * valid ID set.</p>
- *
- * <p>Subclasses only need to implement {@link #getItem(int)}
- * and {@link #getCount()} to have a working adapter.
- *
- * <p>Here is an example implementation of a pager containing fragments of
- * lists:
- *
- * {@sample development/samples/Support13Demos/src/com/example/android/supportv13/app/FragmentStatePagerSupport.java
- *      complete}
- *
- * <p>The <code>R.layout.fragment_pager</code> resource of the top-level fragment is:
- *
- * {@sample development/samples/Support13Demos/res/layout/fragment_pager.xml
- *      complete}
- *
- * <p>The <code>R.layout.fragment_pager_list</code> resource containing each
- * individual fragment's layout is:
- *
- * {@sample development/samples/Support13Demos/res/layout/fragment_pager_list.xml
- *      complete}
- */
-public abstract class FragmentStatePagerAdapter extends PagerAdapter {
-    private static final String TAG = "FragmentStatePagerAdapter";
-    private static final boolean DEBUG = false;
-
-    private final FragmentManager mFragmentManager;
-    private FragmentTransaction mCurTransaction = null;
-
-    private ArrayList<Fragment.SavedState> mSavedState = new ArrayList<Fragment.SavedState>();
-    private ArrayList<Fragment> mFragments = new ArrayList<Fragment>();
-    private Fragment mCurrentPrimaryItem = null;
-
-    public FragmentStatePagerAdapter(FragmentManager fm) {
-        mFragmentManager = fm;
-    }
-
-    /**
-     * Return the Fragment associated with a specified position.
-     */
-    public abstract Fragment getItem(int position);
-
-    @Override
-    public void startUpdate(ViewGroup container) {
-        if (container.getId() == View.NO_ID) {
-            throw new IllegalStateException("ViewPager with adapter " + this
-                    + " requires a view id");
-        }
-    }
-
-    @Override
-    public Object instantiateItem(ViewGroup container, int position) {
-        // If we already have this item instantiated, there is nothing
-        // to do.  This can happen when we are restoring the entire pager
-        // from its saved state, where the fragment manager has already
-        // taken care of restoring the fragments we previously had instantiated.
-        if (mFragments.size() > position) {
-            Fragment f = mFragments.get(position);
-            if (f != null) {
-                return f;
-            }
-        }
-
-        if (mCurTransaction == null) {
-            mCurTransaction = mFragmentManager.beginTransaction();
-        }
-
-        Fragment fragment = getItem(position);
-        if (DEBUG) Log.v(TAG, "Adding item #" + position + ": f=" + fragment);
-        if (mSavedState.size() > position) {
-            Fragment.SavedState fss = mSavedState.get(position);
-            if (fss != null) {
-                fragment.setInitialSavedState(fss);
-            }
-        }
-        while (mFragments.size() <= position) {
-            mFragments.add(null);
-        }
-        fragment.setMenuVisibility(false);
-        fragment.setUserVisibleHint(false);
-        mFragments.set(position, fragment);
-        mCurTransaction.add(container.getId(), fragment);
-
-        return fragment;
-    }
-
-    @Override
-    public void destroyItem(ViewGroup container, int position, Object object) {
-        Fragment fragment = (Fragment) object;
-
-        if (mCurTransaction == null) {
-            mCurTransaction = mFragmentManager.beginTransaction();
-        }
-        if (DEBUG) Log.v(TAG, "Removing item #" + position + ": f=" + object
-                + " v=" + ((Fragment)object).getView());
-        while (mSavedState.size() <= position) {
-            mSavedState.add(null);
-        }
-        mSavedState.set(position, fragment.isAdded()
-                ? mFragmentManager.saveFragmentInstanceState(fragment) : null);
-        mFragments.set(position, null);
-
-        mCurTransaction.remove(fragment);
-    }
-
-    @Override
-    public void setPrimaryItem(ViewGroup container, int position, Object object) {
-        Fragment fragment = (Fragment)object;
-        if (fragment != mCurrentPrimaryItem) {
-            if (mCurrentPrimaryItem != null) {
-                mCurrentPrimaryItem.setMenuVisibility(false);
-                mCurrentPrimaryItem.setUserVisibleHint(false);
-            }
-            if (fragment != null) {
-                fragment.setMenuVisibility(true);
-                fragment.setUserVisibleHint(true);
-            }
-            mCurrentPrimaryItem = fragment;
-        }
-    }
-
-    @Override
-    public void finishUpdate(ViewGroup container) {
-        if (mCurTransaction != null) {
-            mCurTransaction.commitNowAllowingStateLoss();
-            mCurTransaction = null;
-        }
-    }
-
-    @Override
-    public boolean isViewFromObject(View view, Object object) {
-        return ((Fragment)object).getView() == view;
-    }
-
-    @Override
-    public Parcelable saveState() {
-        Bundle state = null;
-        if (mSavedState.size() > 0) {
-            state = new Bundle();
-            Fragment.SavedState[] fss = new Fragment.SavedState[mSavedState.size()];
-            mSavedState.toArray(fss);
-            state.putParcelableArray("states", fss);
-        }
-        for (int i=0; i<mFragments.size(); i++) {
-            Fragment f = mFragments.get(i);
-            if (f != null && f.isAdded()) {
-                if (state == null) {
-                    state = new Bundle();
-                }
-                String key = "f" + i;
-                mFragmentManager.putFragment(state, key, f);
-            }
-        }
-        return state;
-    }
-
-    @Override
-    public void restoreState(Parcelable state, ClassLoader loader) {
-        if (state != null) {
-            Bundle bundle = (Bundle)state;
-            bundle.setClassLoader(loader);
-            Parcelable[] fss = bundle.getParcelableArray("states");
-            mSavedState.clear();
-            mFragments.clear();
-            if (fss != null) {
-                for (int i=0; i<fss.length; i++) {
-                    mSavedState.add((Fragment.SavedState)fss[i]);
-                }
-            }
-            Iterable<String> keys = bundle.keySet();
-            for (String key: keys) {
-                if (key.startsWith("f")) {
-                    int index = Integer.parseInt(key.substring(1));
-                    Fragment f = mFragmentManager.getFragment(bundle, key);
-                    if (f != null) {
-                        while (mFragments.size() <= index) {
-                            mFragments.add(null);
-                        }
-                        f.setMenuVisibility(false);
-                        mFragments.set(index, f);
-                    } else {
-                        Log.w(TAG, "Bad fragment at key " + key);
-                    }
-                }
-            }
-        }
-    }
-}
diff --git a/v4/java/android/support/v4/app/FragmentTabHost.java b/v4/java/android/support/v4/app/FragmentTabHost.java
deleted file mode 100644
index 7cb1266..0000000
--- a/v4/java/android/support/v4/app/FragmentTabHost.java
+++ /dev/null
@@ -1,359 +0,0 @@
-/*
- * Copyright (C) 2012 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 android.support.v4.app;
-
-import java.util.ArrayList;
-
-import android.content.Context;
-import android.content.res.TypedArray;
-import android.os.Bundle;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.util.AttributeSet;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.FrameLayout;
-import android.widget.LinearLayout;
-import android.widget.TabHost;
-import android.widget.TabWidget;
-
-/**
- * Special TabHost that allows the use of {@link Fragment} objects for
- * its tab content.  When placing this in a view hierarchy, after inflating
- * the hierarchy you must call {@link #setup(Context, FragmentManager, int)}
- * to complete the initialization of the tab host.
- *
- * <p>Here is a simple example of using a FragmentTabHost in an Activity:
- *
- * {@sample development/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentTabs.java
- *      complete}
- *
- * <p>This can also be used inside of a fragment through fragment nesting:
- *
- * {@sample development/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentTabsFragmentSupport.java
- *      complete}
- */
-public class FragmentTabHost extends TabHost
-        implements TabHost.OnTabChangeListener {
-    private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();
-    private FrameLayout mRealTabContent;
-    private Context mContext;
-    private FragmentManager mFragmentManager;
-    private int mContainerId;
-    private TabHost.OnTabChangeListener mOnTabChangeListener;
-    private TabInfo mLastTab;
-    private boolean mAttached;
-
-    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;
-        }
-    }
-
-    static class SavedState extends BaseSavedState {
-        String curTab;
-
-        SavedState(Parcelable superState) {
-            super(superState);
-        }
-
-        private SavedState(Parcel in) {
-            super(in);
-            curTab = in.readString();
-        }
-
-        @Override
-        public void writeToParcel(Parcel out, int flags) {
-            super.writeToParcel(out, flags);
-            out.writeString(curTab);
-        }
-
-        @Override
-        public String toString() {
-            return "FragmentTabHost.SavedState{"
-                    + Integer.toHexString(System.identityHashCode(this))
-                    + " curTab=" + curTab + "}";
-        }
-
-        public static final Parcelable.Creator<SavedState> CREATOR
-                = new Parcelable.Creator<SavedState>() {
-            public SavedState createFromParcel(Parcel in) {
-                return new SavedState(in);
-            }
-
-            public SavedState[] newArray(int size) {
-                return new SavedState[size];
-            }
-        };
-    }
-
-    public FragmentTabHost(Context context) {
-        // Note that we call through to the version that takes an AttributeSet,
-        // because the simple Context construct can result in a broken object!
-        super(context, null);
-        initFragmentTabHost(context, null);
-    }
-
-    public FragmentTabHost(Context context, AttributeSet attrs) {
-        super(context, attrs);
-        initFragmentTabHost(context, attrs);
-    }
-
-    private void initFragmentTabHost(Context context, AttributeSet attrs) {
-        TypedArray a = context.obtainStyledAttributes(attrs,
-                new int[] { android.R.attr.inflatedId }, 0, 0);
-        mContainerId = a.getResourceId(0, 0);
-        a.recycle();
-
-        super.setOnTabChangedListener(this);
-    }
-
-    private void ensureHierarchy(Context context) {
-        // If owner hasn't made its own view hierarchy, then as a convenience
-        // we will construct a standard one here.
-        if (findViewById(android.R.id.tabs) == null) {
-            LinearLayout ll = new LinearLayout(context);
-            ll.setOrientation(LinearLayout.VERTICAL);
-            addView(ll, new FrameLayout.LayoutParams(
-                    ViewGroup.LayoutParams.FILL_PARENT,
-                    ViewGroup.LayoutParams.FILL_PARENT));
-
-            TabWidget tw = new TabWidget(context);
-            tw.setId(android.R.id.tabs);
-            tw.setOrientation(TabWidget.HORIZONTAL);
-            ll.addView(tw, new LinearLayout.LayoutParams(
-                    ViewGroup.LayoutParams.FILL_PARENT,
-                    ViewGroup.LayoutParams.WRAP_CONTENT, 0));
-
-            FrameLayout fl = new FrameLayout(context);
-            fl.setId(android.R.id.tabcontent);
-            ll.addView(fl, new LinearLayout.LayoutParams(0, 0, 0));
-
-            mRealTabContent = fl = new FrameLayout(context);
-            mRealTabContent.setId(mContainerId);
-            ll.addView(fl, new LinearLayout.LayoutParams(
-                    LinearLayout.LayoutParams.FILL_PARENT, 0, 1));
-        }
-    }
-
-    /**
-     * @deprecated Don't call the original TabHost setup, you must instead
-     * call {@link #setup(Context, FragmentManager)} or
-     * {@link #setup(Context, FragmentManager, int)}.
-     */
-    @Override @Deprecated
-    public void setup() {
-        throw new IllegalStateException(
-                "Must call setup() that takes a Context and FragmentManager");
-    }
-
-    public void setup(Context context, FragmentManager manager) {
-        ensureHierarchy(context);  // Ensure views required by super.setup()
-        super.setup();
-        mContext = context;
-        mFragmentManager = manager;
-        ensureContent();
-    }
-
-    public void setup(Context context, FragmentManager manager, int containerId) {
-        ensureHierarchy(context);  // Ensure views required by super.setup()
-        super.setup();
-        mContext = context;
-        mFragmentManager = manager;
-        mContainerId = containerId;
-        ensureContent();
-        mRealTabContent.setId(containerId);
-
-        // We must have an ID to be able to save/restore our state.  If
-        // the owner hasn't set one at this point, we will set it ourself.
-        if (getId() == View.NO_ID) {
-            setId(android.R.id.tabhost);
-        }
-    }
-
-    private void ensureContent() {
-        if (mRealTabContent == null) {
-            mRealTabContent = (FrameLayout)findViewById(mContainerId);
-            if (mRealTabContent == null) {
-                throw new IllegalStateException(
-                        "No tab content FrameLayout found for id " + mContainerId);
-            }
-        }
-    }
-
-    @Override
-    public void setOnTabChangedListener(OnTabChangeListener l) {
-        mOnTabChangeListener = l;
-    }
-
-    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);
-
-        if (mAttached) {
-            // If we are already attached to the window, then check to make
-            // sure this tab's fragment is inactive if it exists.  This shouldn't
-            // normally happen.
-            info.fragment = mFragmentManager.findFragmentByTag(tag);
-            if (info.fragment != null && !info.fragment.isDetached()) {
-                FragmentTransaction ft = mFragmentManager.beginTransaction();
-                ft.detach(info.fragment);
-                ft.commit();
-            }
-        }
-
-        mTabs.add(info);
-        addTab(tabSpec);
-    }
-
-    @Override
-    protected void onAttachedToWindow() {
-        super.onAttachedToWindow();
-
-        String currentTab = getCurrentTabTag();
-
-        // Go through all tabs and make sure their fragments match
-        // the correct state.
-        FragmentTransaction ft = null;
-        for (int i=0; i<mTabs.size(); i++) {
-            TabInfo tab = mTabs.get(i);
-            tab.fragment = mFragmentManager.findFragmentByTag(tab.tag);
-            if (tab.fragment != null && !tab.fragment.isDetached()) {
-                if (tab.tag.equals(currentTab)) {
-                    // The fragment for this tab is already there and
-                    // active, and it is what we really want to have
-                    // as the current tab.  Nothing to do.
-                    mLastTab = tab;
-                } else {
-                    // This fragment was restored in the active state,
-                    // but is not the current tab.  Deactivate it.
-                    if (ft == null) {
-                        ft = mFragmentManager.beginTransaction();
-                    }
-                    ft.detach(tab.fragment);
-                }
-            }
-        }
-
-        // We are now ready to go.  Make sure we are switched to the
-        // correct tab.
-        mAttached = true;
-        ft = doTabChanged(currentTab, ft);
-        if (ft != null) {
-            ft.commit();
-            mFragmentManager.executePendingTransactions();
-        }
-    }
-
-    @Override
-    protected void onDetachedFromWindow() {
-        super.onDetachedFromWindow();
-        mAttached = false;
-    }
-
-    @Override
-    protected Parcelable onSaveInstanceState() {
-        Parcelable superState = super.onSaveInstanceState();
-        SavedState ss = new SavedState(superState);
-        ss.curTab = getCurrentTabTag();
-        return ss;
-    }
-
-    @Override
-    protected void onRestoreInstanceState(Parcelable state) {
-        if (!(state instanceof SavedState)) {
-            super.onRestoreInstanceState(state);
-            return;
-        }
-        SavedState ss = (SavedState) state;
-        super.onRestoreInstanceState(ss.getSuperState());
-        setCurrentTabByTag(ss.curTab);
-    }
-
-    @Override
-    public void onTabChanged(String tabId) {
-        if (mAttached) {
-            FragmentTransaction ft = doTabChanged(tabId, null);
-            if (ft != null) {
-                ft.commit();
-            }
-        }
-        if (mOnTabChangeListener != null) {
-            mOnTabChangeListener.onTabChanged(tabId);
-        }
-    }
-
-    private FragmentTransaction doTabChanged(String tabId, FragmentTransaction ft) {
-        TabInfo newTab = null;
-        for (int i=0; i<mTabs.size(); i++) {
-            TabInfo tab = mTabs.get(i);
-            if (tab.tag.equals(tabId)) {
-                newTab = tab;
-            }
-        }
-        if (newTab == null) {
-            throw new IllegalStateException("No tab known for tag " + tabId);
-        }
-        if (mLastTab != newTab) {
-            if (ft == null) {
-                ft = mFragmentManager.beginTransaction();
-            }
-            if (mLastTab != null) {
-                if (mLastTab.fragment != null) {
-                    ft.detach(mLastTab.fragment);
-                }
-            }
-            if (newTab != null) {
-                if (newTab.fragment == null) {
-                    newTab.fragment = Fragment.instantiate(mContext,
-                            newTab.clss.getName(), newTab.args);
-                    ft.add(mContainerId, newTab.fragment, newTab.tag);
-                } else {
-                    ft.attach(newTab.fragment);
-                }
-            }
-
-            mLastTab = newTab;
-        }
-        return ft;
-    }
-}
diff --git a/v4/java/android/support/v4/app/FragmentTransaction.java b/v4/java/android/support/v4/app/FragmentTransaction.java
deleted file mode 100644
index 4dbc791..0000000
--- a/v4/java/android/support/v4/app/FragmentTransaction.java
+++ /dev/null
@@ -1,347 +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 android.support.v4.app;
-
-import android.support.annotation.AnimRes;
-import android.support.annotation.IdRes;
-import android.support.annotation.IntDef;
-import android.support.annotation.Nullable;
-import android.support.annotation.StringRes;
-import android.support.annotation.StyleRes;
-import android.support.v4.util.Pair;
-import android.view.View;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- * Static library support version of the framework's {@link android.app.FragmentTransaction}.
- * Used to write apps that run on platforms prior to Android 3.0.  When running
- * on Android 3.0 or above, this implementation is still used; it does not try
- * to switch to the framework's implementation.  See the framework SDK
- * documentation for a class overview.
- */
-public abstract class FragmentTransaction {
-    /**
-     * Calls {@link #add(int, Fragment, String)} with a 0 containerViewId.
-     */
-    public abstract FragmentTransaction add(Fragment fragment, String tag);
-    
-    /**
-     * Calls {@link #add(int, Fragment, String)} with a null tag.
-     */
-    public abstract FragmentTransaction add(@IdRes int containerViewId, Fragment fragment);
-    
-    /**
-     * Add a fragment to the activity state.  This fragment may optionally
-     * also have its view (if {@link Fragment#onCreateView Fragment.onCreateView}
-     * returns non-null) into a container view of the activity.
-     * 
-     * @param containerViewId Optional identifier of the container this fragment is
-     * to be placed in.  If 0, it will not be placed in a container.
-     * @param fragment The fragment to be added.  This fragment must not already
-     * be added to the activity.
-     * @param tag Optional tag name for the fragment, to later retrieve the
-     * fragment with {@link FragmentManager#findFragmentByTag(String)
-     * FragmentManager.findFragmentByTag(String)}.
-     * 
-     * @return Returns the same FragmentTransaction instance.
-     */
-    public abstract FragmentTransaction add(@IdRes int containerViewId, Fragment fragment,
-            @Nullable String tag);
-    
-    /**
-     * Calls {@link #replace(int, Fragment, String)} with a null tag.
-     */
-    public abstract FragmentTransaction replace(@IdRes int containerViewId, Fragment fragment);
-    
-    /**
-     * Replace an existing fragment that was added to a container.  This is
-     * essentially the same as calling {@link #remove(Fragment)} for all
-     * currently added fragments that were added with the same containerViewId
-     * and then {@link #add(int, Fragment, String)} with the same arguments
-     * given here.
-     * 
-     * @param containerViewId Identifier of the container whose fragment(s) are
-     * to be replaced.
-     * @param fragment The new fragment to place in the container.
-     * @param tag Optional tag name for the fragment, to later retrieve the
-     * fragment with {@link FragmentManager#findFragmentByTag(String)
-     * FragmentManager.findFragmentByTag(String)}.
-     * 
-     * @return Returns the same FragmentTransaction instance.
-     */
-    public abstract FragmentTransaction replace(@IdRes int containerViewId, Fragment fragment,
-            @Nullable String tag);
-    
-    /**
-     * Remove an existing fragment.  If it was added to a container, its view
-     * is also removed from that container.
-     * 
-     * @param fragment The fragment to be removed.
-     * 
-     * @return Returns the same FragmentTransaction instance.
-     */
-    public abstract FragmentTransaction remove(Fragment fragment);
-    
-    /**
-     * Hides an existing fragment.  This is only relevant for fragments whose
-     * views have been added to a container, as this will cause the view to
-     * be hidden.
-     * 
-     * @param fragment The fragment to be hidden.
-     * 
-     * @return Returns the same FragmentTransaction instance.
-     */
-    public abstract FragmentTransaction hide(Fragment fragment);
-    
-    /**
-     * Shows a previously hidden fragment.  This is only relevant for fragments whose
-     * views have been added to a container, as this will cause the view to
-     * be shown.
-     * 
-     * @param fragment The fragment to be shown.
-     * 
-     * @return Returns the same FragmentTransaction instance.
-     */
-    public abstract FragmentTransaction show(Fragment fragment);
-
-    /**
-     * Detach the given fragment from the UI.  This is the same state as
-     * when it is put on the back stack: the fragment is removed from
-     * the UI, however its state is still being actively managed by the
-     * fragment manager.  When going into this state its view hierarchy
-     * is destroyed.
-     *
-     * @param fragment The fragment to be detached.
-     *
-     * @return Returns the same FragmentTransaction instance.
-     */
-    public abstract FragmentTransaction detach(Fragment fragment);
-
-    /**
-     * Re-attach a fragment after it had previously been deatched from
-     * the UI with {@link #detach(Fragment)}.  This
-     * causes its view hierarchy to be re-created, attached to the UI,
-     * and displayed.
-     *
-     * @param fragment The fragment to be attached.
-     *
-     * @return Returns the same FragmentTransaction instance.
-     */
-    public abstract FragmentTransaction attach(Fragment fragment);
-
-    /**
-     * @return <code>true</code> if this transaction contains no operations,
-     * <code>false</code> otherwise.
-     */
-    public abstract boolean isEmpty();
-    
-    /**
-     * Bit mask that is set for all enter transitions.
-     */
-    public static final int TRANSIT_ENTER_MASK = 0x1000;
-    
-    /**
-     * Bit mask that is set for all exit transitions.
-     */
-    public static final int TRANSIT_EXIT_MASK = 0x2000;
-
-    /** @hide */
-    @IntDef({TRANSIT_NONE, TRANSIT_FRAGMENT_OPEN, TRANSIT_FRAGMENT_CLOSE, TRANSIT_FRAGMENT_FADE})
-    @Retention(RetentionPolicy.SOURCE)
-    private @interface Transit {}
-
-    /** Not set up for a transition. */
-    public static final int TRANSIT_UNSET = -1;
-    /** No animation for transition. */
-    public static final int TRANSIT_NONE = 0;
-    /** Fragment is being added onto the stack */
-    public static final int TRANSIT_FRAGMENT_OPEN = 1 | TRANSIT_ENTER_MASK;
-    /** Fragment is being removed from the stack */
-    public static final int TRANSIT_FRAGMENT_CLOSE = 2 | TRANSIT_EXIT_MASK;
-    /** Fragment should simply fade in or out; that is, no strong navigation associated
-     * with it except that it is appearing or disappearing for some reason. */
-    public static final int TRANSIT_FRAGMENT_FADE = 3 | TRANSIT_ENTER_MASK;
-
-    /**
-     * Set specific animation resources to run for the fragments that are
-     * entering and exiting in this transaction. These animations will not be
-     * played when popping the back stack.
-     */
-    public abstract FragmentTransaction setCustomAnimations(@AnimRes int enter,
-            @AnimRes int exit);
-
-    /**
-     * Set specific animation resources to run for the fragments that are
-     * entering and exiting in this transaction. The <code>popEnter</code>
-     * and <code>popExit</code> animations will be played for enter/exit
-     * operations specifically when popping the back stack.
-     */
-    public abstract FragmentTransaction setCustomAnimations(@AnimRes int enter,
-            @AnimRes int exit, @AnimRes int popEnter, @AnimRes int popExit);
-
-    /**
-     * Used with custom Transitions to map a View from a removed or hidden
-     * Fragment to a View from a shown or added Fragment.
-     * <var>sharedElement</var> must have a unique transitionName in the View hierarchy.
-     *
-     * @param sharedElement A View in a disappearing Fragment to match with a View in an
-     *                      appearing Fragment.
-     * @param name The transitionName for a View in an appearing Fragment to match to the shared
-     *             element.
-     * @see Fragment#setSharedElementReturnTransition(Object)
-     * @see Fragment#setSharedElementEnterTransition(Object)
-     */
-    public abstract FragmentTransaction addSharedElement(View sharedElement, String name);
-
-    /**
-     * Select a standard transition animation for this transaction.  May be
-     * one of {@link #TRANSIT_NONE}, {@link #TRANSIT_FRAGMENT_OPEN},
-     * {@link #TRANSIT_FRAGMENT_CLOSE}, or {@link #TRANSIT_FRAGMENT_FADE}.
-     */
-    public abstract FragmentTransaction setTransition(@Transit int transit);
-
-    /**
-     * Set a custom style resource that will be used for resolving transit
-     * animations.
-     */
-    public abstract FragmentTransaction setTransitionStyle(@StyleRes int styleRes);
-    
-    /**
-     * Add this transaction to the back stack.  This means that the transaction
-     * will be remembered after it is committed, and will reverse its operation
-     * when later popped off the stack.
-     *
-     * @param name An optional name for this back stack state, or null.
-     */
-    public abstract FragmentTransaction addToBackStack(@Nullable String name);
-
-    /**
-     * Returns true if this FragmentTransaction is allowed to be added to the back
-     * stack. If this method would return false, {@link #addToBackStack(String)}
-     * will throw {@link IllegalStateException}.
-     *
-     * @return True if {@link #addToBackStack(String)} is permitted on this transaction.
-     */
-    public abstract boolean isAddToBackStackAllowed();
-
-    /**
-     * Disallow calls to {@link #addToBackStack(String)}. Any future calls to
-     * addToBackStack will throw {@link IllegalStateException}. If addToBackStack
-     * has already been called, this method will throw IllegalStateException.
-     */
-    public abstract FragmentTransaction disallowAddToBackStack();
-
-    /**
-     * Set the full title to show as a bread crumb when this transaction
-     * is on the back stack.
-     *
-     * @param res A string resource containing the title.
-     */
-    public abstract FragmentTransaction setBreadCrumbTitle(@StringRes int res);
-
-    /**
-     * Like {@link #setBreadCrumbTitle(int)} but taking a raw string; this
-     * method is <em>not</em> recommended, as the string can not be changed
-     * later if the locale changes.
-     */
-    public abstract FragmentTransaction setBreadCrumbTitle(CharSequence text);
-
-    /**
-     * Set the short title to show as a bread crumb when this transaction
-     * is on the back stack.
-     *
-     * @param res A string resource containing the title.
-     */
-    public abstract FragmentTransaction setBreadCrumbShortTitle(@StringRes int res);
-
-    /**
-     * Like {@link #setBreadCrumbShortTitle(int)} but taking a raw string; this
-     * method is <em>not</em> recommended, as the string can not be changed
-     * later if the locale changes.
-     */
-    public abstract FragmentTransaction setBreadCrumbShortTitle(CharSequence text);
-
-    /**
-     * Schedules a commit of this transaction.  The commit does
-     * not happen immediately; it will be scheduled as work on the main thread
-     * to be done the next time that thread is ready.
-     *
-     * <p class="note">A transaction can only be committed with this method
-     * prior to its containing activity saving its state.  If the commit is
-     * attempted after that point, an exception will be thrown.  This is
-     * because the state after the commit can be lost if the activity needs to
-     * be restored from its state.  See {@link #commitAllowingStateLoss()} for
-     * situations where it may be okay to lose the commit.</p>
-     * 
-     * @return Returns the identifier of this transaction's back stack entry,
-     * if {@link #addToBackStack(String)} had been called.  Otherwise, returns
-     * a negative number.
-     */
-    public abstract int commit();
-
-    /**
-     * Like {@link #commit} but allows the commit to be executed after an
-     * activity's state is saved.  This is dangerous because the commit can
-     * be lost if the activity needs to later be restored from its state, so
-     * this should only be used for cases where it is okay for the UI state
-     * to change unexpectedly on the user.
-     */
-    public abstract int commitAllowingStateLoss();
-
-    /**
-     * Commits this transaction synchronously. Any added fragments will be
-     * initialized and brought completely to the lifecycle state of their host
-     * and any removed fragments will be torn down accordingly before this
-     * call returns. Committing a transaction in this way allows fragments
-     * to be added as dedicated, encapsulated components that monitor the
-     * lifecycle state of their host while providing firmer ordering guarantees
-     * around when those fragments are fully initialized and ready. Fragments
-     * that manage views will have those views created and attached.
-     *
-     * <p>Calling <code>commitNow</code> is preferable to calling
-     * {@link #commit()} followed by {@link FragmentManager#executePendingTransactions()}
-     * as the latter will have the side effect of attempting to commit <em>all</em>
-     * currently pending transactions whether that is the desired behavior
-     * or not.</p>
-     *
-     * <p>Transactions committed in this way may not be added to the
-     * FragmentManager's back stack, as doing so would break other expected
-     * ordering guarantees for other asynchronously committed transactions.
-     * This method will throw {@link IllegalStateException} if the transaction
-     * previously requested to be added to the back stack with
-     * {@link #addToBackStack(String)}.</p>
-     *
-     * <p class="note">A transaction can only be committed with this method
-     * prior to its containing activity saving its state.  If the commit is
-     * attempted after that point, an exception will be thrown.  This is
-     * because the state after the commit can be lost if the activity needs to
-     * be restored from its state.  See {@link #commitAllowingStateLoss()} for
-     * situations where it may be okay to lose the commit.</p>
-     */
-    public abstract void commitNow();
-
-    /**
-     * Like {@link #commitNow} but allows the commit to be executed after an
-     * activity's state is saved.  This is dangerous because the commit can
-     * be lost if the activity needs to later be restored from its state, so
-     * this should only be used for cases where it is okay for the UI state
-     * to change unexpectedly on the user.
-     */
-    public abstract void commitNowAllowingStateLoss();
-}
diff --git a/v4/java/android/support/v4/app/ListFragment.java b/v4/java/android/support/v4/app/ListFragment.java
deleted file mode 100644
index 9923e8a..0000000
--- a/v4/java/android/support/v4/app/ListFragment.java
+++ /dev/null
@@ -1,375 +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 android.support.v4.app;
-
-import android.content.Context;
-import android.os.Bundle;
-import android.os.Handler;
-import android.view.Gravity;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.animation.AnimationUtils;
-import android.widget.AdapterView;
-import android.widget.FrameLayout;
-import android.widget.LinearLayout;
-import android.widget.ListAdapter;
-import android.widget.ListView;
-import android.widget.ProgressBar;
-import android.widget.TextView;
-
-/**
- * Static library support version of the framework's {@link android.app.ListFragment}.
- * Used to write apps that run on platforms prior to Android 3.0.  When running
- * on Android 3.0 or above, this implementation is still used; it does not try
- * to switch to the framework's implementation.  See the framework SDK
- * documentation for a class overview.
- */
-public class ListFragment extends Fragment {
-    static final int INTERNAL_EMPTY_ID = 0x00ff0001;
-    static final int INTERNAL_PROGRESS_CONTAINER_ID = 0x00ff0002;
-    static final int INTERNAL_LIST_CONTAINER_ID = 0x00ff0003;
-    
-    final private Handler mHandler = new Handler();
-
-    final private Runnable mRequestFocus = new Runnable() {
-        public void run() {
-            mList.focusableViewAvailable(mList);
-        }
-    };
-    
-    final private AdapterView.OnItemClickListener mOnClickListener
-            = new AdapterView.OnItemClickListener() {
-        public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
-            onListItemClick((ListView)parent, v, position, id);
-        }
-    };
-
-    ListAdapter mAdapter;
-    ListView mList;
-    View mEmptyView;
-    TextView mStandardEmptyView;
-    View mProgressContainer;
-    View mListContainer;
-    CharSequence mEmptyText;
-    boolean mListShown;
-
-    public ListFragment() {
-    }
-
-    /**
-     * Provide default implementation to return a simple list view.  Subclasses
-     * can override to replace with their own layout.  If doing so, the
-     * returned view hierarchy <em>must</em> have a ListView whose id
-     * is {@link android.R.id#list android.R.id.list} and can optionally
-     * have a sibling view id {@link android.R.id#empty android.R.id.empty}
-     * that is to be shown when the list is empty.
-     * 
-     * <p>If you are overriding this method with your own custom content,
-     * consider including the standard layout {@link android.R.layout#list_content}
-     * in your layout file, so that you continue to retain all of the standard
-     * behavior of ListFragment.  In particular, this is currently the only
-     * way to have the built-in indeterminant progress state be shown.
-     */
-    @Override
-    public View onCreateView(LayoutInflater inflater, ViewGroup container,
-            Bundle savedInstanceState) {
-        final Context context = getContext();
-
-        FrameLayout root = new FrameLayout(context);
-
-        // ------------------------------------------------------------------
-
-        LinearLayout pframe = new LinearLayout(context);
-        pframe.setId(INTERNAL_PROGRESS_CONTAINER_ID);
-        pframe.setOrientation(LinearLayout.VERTICAL);
-        pframe.setVisibility(View.GONE);
-        pframe.setGravity(Gravity.CENTER);
-
-        ProgressBar progress = new ProgressBar(context, null,
-                android.R.attr.progressBarStyleLarge);
-        pframe.addView(progress, new FrameLayout.LayoutParams(
-                ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
-
-        root.addView(pframe, new FrameLayout.LayoutParams(
-                ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT));
-
-        // ------------------------------------------------------------------
-
-        FrameLayout lframe = new FrameLayout(context);
-        lframe.setId(INTERNAL_LIST_CONTAINER_ID);
-        
-        TextView tv = new TextView(context);
-        tv.setId(INTERNAL_EMPTY_ID);
-        tv.setGravity(Gravity.CENTER);
-        lframe.addView(tv, new FrameLayout.LayoutParams(
-                ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT));
-        
-        ListView lv = new ListView(context);
-        lv.setId(android.R.id.list);
-        lv.setDrawSelectorOnTop(false);
-        lframe.addView(lv, new FrameLayout.LayoutParams(
-                ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT));
-
-        root.addView(lframe, new FrameLayout.LayoutParams(
-                ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT));
-        
-        // ------------------------------------------------------------------
-
-        root.setLayoutParams(new FrameLayout.LayoutParams(
-                ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT));
-        
-        return root;
-    }
-
-    /**
-     * Attach to list view once the view hierarchy has been created.
-     */
-    @Override
-    public void onViewCreated(View view, Bundle savedInstanceState) {
-        super.onViewCreated(view, savedInstanceState);
-        ensureList();
-    }
-
-    /**
-     * Detach from list view.
-     */
-    @Override
-    public void onDestroyView() {
-        mHandler.removeCallbacks(mRequestFocus);
-        mList = null;
-        mListShown = false;
-        mEmptyView = mProgressContainer = mListContainer = null;
-        mStandardEmptyView = null;
-        super.onDestroyView();
-    }
-
-    /**
-     * This method will be called when an item in the list is selected.
-     * Subclasses should override. Subclasses can call
-     * getListView().getItemAtPosition(position) if they need to access the
-     * data associated with the selected item.
-     *
-     * @param l The ListView where the click happened
-     * @param v The view that was clicked within the ListView
-     * @param position The position of the view in the list
-     * @param id The row id of the item that was clicked
-     */
-    public void onListItemClick(ListView l, View v, int position, long id) {
-    }
-
-    /**
-     * Provide the cursor for the list view.
-     */
-    public void setListAdapter(ListAdapter adapter) {
-        boolean hadAdapter = mAdapter != null;
-        mAdapter = adapter;
-        if (mList != null) {
-            mList.setAdapter(adapter);
-            if (!mListShown && !hadAdapter) {
-                // The list was hidden, and previously didn't have an
-                // adapter.  It is now time to show it.
-                setListShown(true, getView().getWindowToken() != null);
-            }
-        }
-    }
-
-    /**
-     * Set the currently selected list item to the specified
-     * position with the adapter's data
-     *
-     * @param position
-     */
-    public void setSelection(int position) {
-        ensureList();
-        mList.setSelection(position);
-    }
-
-    /**
-     * Get the position of the currently selected list item.
-     */
-    public int getSelectedItemPosition() {
-        ensureList();
-        return mList.getSelectedItemPosition();
-    }
-
-    /**
-     * Get the cursor row ID of the currently selected list item.
-     */
-    public long getSelectedItemId() {
-        ensureList();
-        return mList.getSelectedItemId();
-    }
-
-    /**
-     * Get the fragment's list view widget.
-     */
-    public ListView getListView() {
-        ensureList();
-        return mList;
-    }
-
-    /**
-     * The default content for a ListFragment has a TextView that can
-     * be shown when the list is empty.  If you would like to have it
-     * shown, call this method to supply the text it should use.
-     */
-    public void setEmptyText(CharSequence text) {
-        ensureList();
-        if (mStandardEmptyView == null) {
-            throw new IllegalStateException("Can't be used with a custom content view");
-        }
-        mStandardEmptyView.setText(text);
-        if (mEmptyText == null) {
-            mList.setEmptyView(mStandardEmptyView);
-        }
-        mEmptyText = text;
-    }
-    
-    /**
-     * Control whether the list is being displayed.  You can make it not
-     * displayed if you are waiting for the initial data to show in it.  During
-     * this time an indeterminant progress indicator will be shown instead.
-     * 
-     * <p>Applications do not normally need to use this themselves.  The default
-     * behavior of ListFragment is to start with the list not being shown, only
-     * showing it once an adapter is given with {@link #setListAdapter(ListAdapter)}.
-     * If the list at that point had not been shown, when it does get shown
-     * it will be do without the user ever seeing the hidden state.
-     * 
-     * @param shown If true, the list view is shown; if false, the progress
-     * indicator.  The initial value is true.
-     */
-    public void setListShown(boolean shown) {
-        setListShown(shown, true);
-    }
-    
-    /**
-     * Like {@link #setListShown(boolean)}, but no animation is used when
-     * transitioning from the previous state.
-     */
-    public void setListShownNoAnimation(boolean shown) {
-        setListShown(shown, false);
-    }
-    
-    /**
-     * Control whether the list is being displayed.  You can make it not
-     * displayed if you are waiting for the initial data to show in it.  During
-     * this time an indeterminant progress indicator will be shown instead.
-     * 
-     * @param shown If true, the list view is shown; if false, the progress
-     * indicator.  The initial value is true.
-     * @param animate If true, an animation will be used to transition to the
-     * new state.
-     */
-    private void setListShown(boolean shown, boolean animate) {
-        ensureList();
-        if (mProgressContainer == null) {
-            throw new IllegalStateException("Can't be used with a custom content view");
-        }
-        if (mListShown == shown) {
-            return;
-        }
-        mListShown = shown;
-        if (shown) {
-            if (animate) {
-                mProgressContainer.startAnimation(AnimationUtils.loadAnimation(
-                        getContext(), android.R.anim.fade_out));
-                mListContainer.startAnimation(AnimationUtils.loadAnimation(
-                        getContext(), android.R.anim.fade_in));
-            } else {
-                mProgressContainer.clearAnimation();
-                mListContainer.clearAnimation();
-            }
-            mProgressContainer.setVisibility(View.GONE);
-            mListContainer.setVisibility(View.VISIBLE);
-        } else {
-            if (animate) {
-                mProgressContainer.startAnimation(AnimationUtils.loadAnimation(
-                        getContext(), android.R.anim.fade_in));
-                mListContainer.startAnimation(AnimationUtils.loadAnimation(
-                        getContext(), android.R.anim.fade_out));
-            } else {
-                mProgressContainer.clearAnimation();
-                mListContainer.clearAnimation();
-            }
-            mProgressContainer.setVisibility(View.VISIBLE);
-            mListContainer.setVisibility(View.GONE);
-        }
-    }
-    
-    /**
-     * Get the ListAdapter associated with this fragment's ListView.
-     */
-    public ListAdapter getListAdapter() {
-        return mAdapter;
-    }
-
-    private void ensureList() {
-        if (mList != null) {
-            return;
-        }
-        View root = getView();
-        if (root == null) {
-            throw new IllegalStateException("Content view not yet created");
-        }
-        if (root instanceof ListView) {
-            mList = (ListView)root;
-        } else {
-            mStandardEmptyView = (TextView)root.findViewById(INTERNAL_EMPTY_ID);
-            if (mStandardEmptyView == null) {
-                mEmptyView = root.findViewById(android.R.id.empty);
-            } else {
-                mStandardEmptyView.setVisibility(View.GONE);
-            }
-            mProgressContainer = root.findViewById(INTERNAL_PROGRESS_CONTAINER_ID);
-            mListContainer = root.findViewById(INTERNAL_LIST_CONTAINER_ID);
-            View rawListView = root.findViewById(android.R.id.list);
-            if (!(rawListView instanceof ListView)) {
-                if (rawListView == null) {
-                    throw new RuntimeException(
-                            "Your content must have a ListView whose id attribute is " +
-                            "'android.R.id.list'");
-                }
-                throw new RuntimeException(
-                        "Content has view with id attribute 'android.R.id.list' "
-                        + "that is not a ListView class");
-            }
-            mList = (ListView)rawListView;
-            if (mEmptyView != null) {
-                mList.setEmptyView(mEmptyView);
-            } else if (mEmptyText != null) {
-                mStandardEmptyView.setText(mEmptyText);
-                mList.setEmptyView(mStandardEmptyView);
-            }
-        }
-        mListShown = true;
-        mList.setOnItemClickListener(mOnClickListener);
-        if (mAdapter != null) {
-            ListAdapter adapter = mAdapter;
-            mAdapter = null;
-            setListAdapter(adapter);
-        } else {
-            // We are starting without an adapter, so assume we won't
-            // have our data right away and start with the progress indicator.
-            if (mProgressContainer != null) {
-                setListShown(false, false);
-            }
-        }
-        mHandler.post(mRequestFocus);
-    }
-}
diff --git a/v4/java/android/support/v4/app/LoaderManager.java b/v4/java/android/support/v4/app/LoaderManager.java
deleted file mode 100644
index 789e0e9..0000000
--- a/v4/java/android/support/v4/app/LoaderManager.java
+++ /dev/null
@@ -1,888 +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 android.support.v4.app;
-
-import android.app.Activity;
-import android.os.Bundle;
-import android.support.v4.content.Loader;
-import android.support.v4.util.DebugUtils;
-import android.support.v4.util.SparseArrayCompat;
-import android.util.Log;
-
-import java.io.FileDescriptor;
-import java.io.PrintWriter;
-import java.lang.reflect.Modifier;
-
-/**
- * Static library support version of the framework's {@link android.app.LoaderManager}.
- * Used to write apps that run on platforms prior to Android 3.0.  When running
- * on Android 3.0 or above, this implementation is still used; it does not try
- * to switch to the framework's implementation.  See the framework SDK
- * documentation for a class overview.
- * 
- * <p>Your activity must derive from {@link FragmentActivity} to use this.
- */
-public abstract class LoaderManager {
-    /**
-     * Callback interface for a client to interact with the manager.
-     */
-    public interface LoaderCallbacks<D> {
-        /**
-         * Instantiate and return a new Loader for the given ID.
-         *
-         * @param id The ID whose loader is to be created.
-         * @param args Any arguments supplied by the caller.
-         * @return Return a new Loader instance that is ready to start loading.
-         */
-        public Loader<D> onCreateLoader(int id, Bundle args);
-
-        /**
-         * Called when a previously created loader has finished its load.  Note
-         * that normally an application is <em>not</em> allowed to commit fragment
-         * transactions while in this call, since it can happen after an
-         * activity's state is saved.  See {@link FragmentManager#beginTransaction()
-         * FragmentManager.openTransaction()} for further discussion on this.
-         * 
-         * <p>This function is guaranteed to be called prior to the release of
-         * the last data that was supplied for this Loader.  At this point
-         * you should remove all use of the old data (since it will be released
-         * soon), but should not do your own release of the data since its Loader
-         * owns it and will take care of that.  The Loader will take care of
-         * management of its data so you don't have to.  In particular:
-         *
-         * <ul>
-         * <li> <p>The Loader will monitor for changes to the data, and report
-         * them to you through new calls here.  You should not monitor the
-         * data yourself.  For example, if the data is a {@link android.database.Cursor}
-         * and you place it in a {@link android.widget.CursorAdapter}, use
-         * the {@link android.widget.CursorAdapter#CursorAdapter(android.content.Context,
-         * android.database.Cursor, int)} constructor <em>without</em> passing
-         * in either {@link android.widget.CursorAdapter#FLAG_AUTO_REQUERY}
-         * or {@link android.widget.CursorAdapter#FLAG_REGISTER_CONTENT_OBSERVER}
-         * (that is, use 0 for the flags argument).  This prevents the CursorAdapter
-         * from doing its own observing of the Cursor, which is not needed since
-         * when a change happens you will get a new Cursor throw another call
-         * here.
-         * <li> The Loader will release the data once it knows the application
-         * is no longer using it.  For example, if the data is
-         * a {@link android.database.Cursor} from a {@link android.content.CursorLoader},
-         * you should not call close() on it yourself.  If the Cursor is being placed in a
-         * {@link android.widget.CursorAdapter}, you should use the
-         * {@link android.widget.CursorAdapter#swapCursor(android.database.Cursor)}
-         * method so that the old Cursor is not closed.
-         * </ul>
-         *
-         * @param loader The Loader that has finished.
-         * @param data The data generated by the Loader.
-         */
-        public void onLoadFinished(Loader<D> loader, D data);
-
-        /**
-         * Called when a previously created loader is being reset, and thus
-         * making its data unavailable.  The application should at this point
-         * remove any references it has to the Loader's data.
-         *
-         * @param loader The Loader that is being reset.
-         */
-        public void onLoaderReset(Loader<D> loader);
-    }
-    
-    /**
-     * Ensures a loader is initialized and active.  If the loader doesn't
-     * already exist, one is created and (if the activity/fragment is currently
-     * started) starts the loader.  Otherwise the last created
-     * loader is re-used.
-     *
-     * <p>In either case, the given callback is associated with the loader, and
-     * will be called as the loader state changes.  If at the point of call
-     * the caller is in its started state, and the requested loader
-     * already exists and has generated its data, then
-     * callback {@link LoaderCallbacks#onLoadFinished} will
-     * be called immediately (inside of this function), so you must be prepared
-     * for this to happen.
-     *
-     * @param id A unique identifier for this loader.  Can be whatever you want.
-     * Identifiers are scoped to a particular LoaderManager instance.
-     * @param args Optional arguments to supply to the loader at construction.
-     * If a loader already exists (a new one does not need to be created), this
-     * parameter will be ignored and the last arguments continue to be used.
-     * @param callback Interface the LoaderManager will call to report about
-     * changes in the state of the loader.  Required.
-     */
-    public abstract <D> Loader<D> initLoader(int id, Bundle args,
-            LoaderManager.LoaderCallbacks<D> callback);
-
-    /**
-     * Starts a new or restarts an existing {@link android.content.Loader} in
-     * this manager, registers the callbacks to it,
-     * and (if the activity/fragment is currently started) starts loading it.
-     * If a loader with the same id has previously been
-     * started it will automatically be destroyed when the new loader completes
-     * its work. The callback will be delivered before the old loader
-     * is destroyed.
-     *
-     * @param id A unique identifier for this loader.  Can be whatever you want.
-     * Identifiers are scoped to a particular LoaderManager instance.
-     * @param args Optional arguments to supply to the loader at construction.
-     * @param callback Interface the LoaderManager will call to report about
-     * changes in the state of the loader.  Required.
-     */
-    public abstract <D> Loader<D> restartLoader(int id, Bundle args,
-            LoaderManager.LoaderCallbacks<D> callback);
-
-    /**
-     * Stops and removes the loader with the given ID.  If this loader
-     * had previously reported data to the client through
-     * {@link LoaderCallbacks#onLoadFinished(Loader, Object)}, a call
-     * will be made to {@link LoaderCallbacks#onLoaderReset(Loader)}.
-     */
-    public abstract void destroyLoader(int id);
-
-    /**
-     * Return the Loader with the given id or null if no matching Loader
-     * is found.
-     */
-    public abstract <D> Loader<D> getLoader(int id);
-
-    /**
-     * Print the LoaderManager's state into the given stream.
-     *
-     * @param prefix Text to print at the front of each line.
-     * @param fd The raw file descriptor that the dump is being sent to.
-     * @param writer A PrintWriter to which the dump is to be set.
-     * @param args Additional arguments to the dump request.
-     */
-    public abstract void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args);
-
-    /**
-     * Control whether the framework's internal loader manager debugging
-     * logs are turned on.  If enabled, you will see output in logcat as
-     * the framework performs loader operations.
-     */
-    public static void enableDebugLogging(boolean enabled) {
-        LoaderManagerImpl.DEBUG = enabled;
-    }
-
-    /**
-     * Returns true if any loaders managed are currently running and have not
-     * returned data to the application yet.
-     */
-    public boolean hasRunningLoaders() { return false; }
-}
-
-/**
- * @hide
- */
-class LoaderManagerImpl extends LoaderManager {
-    static final String TAG = "LoaderManager";
-    static boolean DEBUG = false;
-
-    // These are the currently active loaders.  A loader is here
-    // from the time its load is started until it has been explicitly
-    // stopped or restarted by the application.
-    final SparseArrayCompat<LoaderInfo> mLoaders = new SparseArrayCompat<LoaderInfo>();
-
-    // These are previously run loaders.  This list is maintained internally
-    // to avoid destroying a loader while an application is still using it.
-    // It allows an application to restart a loader, but continue using its
-    // previously run loader until the new loader's data is available.
-    final SparseArrayCompat<LoaderInfo> mInactiveLoaders = new SparseArrayCompat<LoaderInfo>();
-
-    final String mWho;
-
-    boolean mStarted;
-    boolean mRetaining;
-    boolean mRetainingStarted;
-    
-    boolean mCreatingLoader;
-    private FragmentHostCallback mHost;
-
-    final class LoaderInfo implements Loader.OnLoadCompleteListener<Object>,
-            Loader.OnLoadCanceledListener<Object> {
-        final int mId;
-        final Bundle mArgs;
-        LoaderManager.LoaderCallbacks<Object> mCallbacks;
-        Loader<Object> mLoader;
-        boolean mHaveData;
-        boolean mDeliveredData;
-        Object mData;
-        @SuppressWarnings("hiding")
-        boolean mStarted;
-        @SuppressWarnings("hiding")
-        boolean mRetaining;
-        @SuppressWarnings("hiding")
-        boolean mRetainingStarted;
-        boolean mReportNextStart;
-        boolean mDestroyed;
-        boolean mListenerRegistered;
-
-        LoaderInfo mPendingLoader;
-        
-        public LoaderInfo(int id, Bundle args, LoaderManager.LoaderCallbacks<Object> callbacks) {
-            mId = id;
-            mArgs = args;
-            mCallbacks = callbacks;
-        }
-        
-        void start() {
-            if (mRetaining && mRetainingStarted) {
-                // Our owner is started, but we were being retained from a
-                // previous instance in the started state...  so there is really
-                // nothing to do here, since the loaders are still started.
-                mStarted = true;
-                return;
-            }
-
-            if (mStarted) {
-                // If loader already started, don't restart.
-                return;
-            }
-
-            mStarted = true;
-            
-            if (DEBUG) Log.v(TAG, "  Starting: " + this);
-            if (mLoader == null && mCallbacks != null) {
-               mLoader = mCallbacks.onCreateLoader(mId, mArgs);
-            }
-            if (mLoader != null) {
-                if (mLoader.getClass().isMemberClass()
-                        && !Modifier.isStatic(mLoader.getClass().getModifiers())) {
-                    throw new IllegalArgumentException(
-                            "Object returned from onCreateLoader must not be a non-static inner member class: "
-                            + mLoader);
-                }
-                if (!mListenerRegistered) {
-                    mLoader.registerListener(mId, this);
-                    mLoader.registerOnLoadCanceledListener(this);
-                    mListenerRegistered = true;
-                }
-                mLoader.startLoading();
-            }
-        }
-        
-        void retain() {
-            if (DEBUG) Log.v(TAG, "  Retaining: " + this);
-            mRetaining = true;
-            mRetainingStarted = mStarted;
-            mStarted = false;
-            mCallbacks = null;
-        }
-        
-        void finishRetain() {
-            if (mRetaining) {
-                if (DEBUG) Log.v(TAG, "  Finished Retaining: " + this);
-                mRetaining = false;
-                if (mStarted != mRetainingStarted) {
-                    if (!mStarted) {
-                        // This loader was retained in a started state, but
-                        // at the end of retaining everything our owner is
-                        // no longer started...  so make it stop.
-                        stop();
-                    }
-                }
-            }
-
-            if (mStarted && mHaveData && !mReportNextStart) {
-                // This loader has retained its data, either completely across
-                // a configuration change or just whatever the last data set
-                // was after being restarted from a stop, and now at the point of
-                // finishing the retain we find we remain started, have
-                // our data, and the owner has a new callback...  so
-                // let's deliver the data now.
-                callOnLoadFinished(mLoader, mData);
-            }
-        }
-        
-        void reportStart() {
-            if (mStarted) {
-                if (mReportNextStart) {
-                    mReportNextStart = false;
-                    if (mHaveData && !mRetaining) {
-                        callOnLoadFinished(mLoader, mData);
-                    }
-                }
-            }
-        }
-
-        void stop() {
-            if (DEBUG) Log.v(TAG, "  Stopping: " + this);
-            mStarted = false;
-            if (!mRetaining) {
-                if (mLoader != null && mListenerRegistered) {
-                    // Let the loader know we're done with it
-                    mListenerRegistered = false;
-                    mLoader.unregisterListener(this);
-                    mLoader.unregisterOnLoadCanceledListener(this);
-                    mLoader.stopLoading();
-                }
-            }
-        }
-
-        boolean cancel() {
-            if (DEBUG) Log.v(TAG, "  Canceling: " + this);
-            if (mStarted && mLoader != null && mListenerRegistered) {
-                final boolean cancelLoadResult = mLoader.cancelLoad();
-                if (!cancelLoadResult) {
-                    onLoadCanceled(mLoader);
-                }
-                return cancelLoadResult;
-            }
-            return false;
-        }
-
-        void destroy() {
-            if (DEBUG) Log.v(TAG, "  Destroying: " + this);
-            mDestroyed = true;
-            boolean needReset = mDeliveredData;
-            mDeliveredData = false;
-            if (mCallbacks != null && mLoader != null && mHaveData && needReset) {
-                if (DEBUG) Log.v(TAG, "  Reseting: " + this);
-                String lastBecause = null;
-                if (mHost != null) {
-                    lastBecause = mHost.mFragmentManager.mNoTransactionsBecause;
-                    mHost.mFragmentManager.mNoTransactionsBecause = "onLoaderReset";
-                }
-                try {
-                    mCallbacks.onLoaderReset(mLoader);
-                } finally {
-                    if (mHost != null) {
-                        mHost.mFragmentManager.mNoTransactionsBecause = lastBecause;
-                    }
-                }
-            }
-            mCallbacks = null;
-            mData = null;
-            mHaveData = false;
-            if (mLoader != null) {
-                if (mListenerRegistered) {
-                    mListenerRegistered = false;
-                    mLoader.unregisterListener(this);
-                    mLoader.unregisterOnLoadCanceledListener(this);
-                }
-                mLoader.reset();
-            }
-            if (mPendingLoader != null) {
-                mPendingLoader.destroy();
-            }
-        }
-
-        @Override
-        public void onLoadCanceled(Loader<Object> loader) {
-            if (DEBUG) Log.v(TAG, "onLoadCanceled: " + this);
-
-            if (mDestroyed) {
-                if (DEBUG) Log.v(TAG, "  Ignoring load canceled -- destroyed");
-                return;
-            }
-
-            if (mLoaders.get(mId) != this) {
-                // This cancellation message is not coming from the current active loader.
-                // We don't care about it.
-                if (DEBUG) Log.v(TAG, "  Ignoring load canceled -- not active");
-                return;
-            }
-
-            LoaderInfo pending = mPendingLoader;
-            if (pending != null) {
-                // There is a new request pending and we were just
-                // waiting for the old one to cancel or complete before starting
-                // it.  So now it is time, switch over to the new loader.
-                if (DEBUG) Log.v(TAG, "  Switching to pending loader: " + pending);
-                mPendingLoader = null;
-                mLoaders.put(mId, null);
-                destroy();
-                installLoader(pending);
-            }
-        }
-
-        @Override
-        public void onLoadComplete(Loader<Object> loader, Object data) {
-            if (DEBUG) Log.v(TAG, "onLoadComplete: " + this);
-            
-            if (mDestroyed) {
-                if (DEBUG) Log.v(TAG, "  Ignoring load complete -- destroyed");
-                return;
-            }
-
-            if (mLoaders.get(mId) != this) {
-                // This data is not coming from the current active loader.
-                // We don't care about it.
-                if (DEBUG) Log.v(TAG, "  Ignoring load complete -- not active");
-                return;
-            }
-            
-            LoaderInfo pending = mPendingLoader;
-            if (pending != null) {
-                // There is a new request pending and we were just
-                // waiting for the old one to complete before starting
-                // it.  So now it is time, switch over to the new loader.
-                if (DEBUG) Log.v(TAG, "  Switching to pending loader: " + pending);
-                mPendingLoader = null;
-                mLoaders.put(mId, null);
-                destroy();
-                installLoader(pending);
-                return;
-            }
-            
-            // Notify of the new data so the app can switch out the old data before
-            // we try to destroy it.
-            if (mData != data || !mHaveData) {
-                mData = data;
-                mHaveData = true;
-                if (mStarted) {
-                    callOnLoadFinished(loader, data);
-                }
-            }
-
-            //if (DEBUG) Log.v(TAG, "  onLoadFinished returned: " + this);
-
-            // We have now given the application the new loader with its
-            // loaded data, so it should have stopped using the previous
-            // loader.  If there is a previous loader on the inactive list,
-            // clean it up.
-            LoaderInfo info = mInactiveLoaders.get(mId);
-            if (info != null && info != this) {
-                info.mDeliveredData = false;
-                info.destroy();
-                mInactiveLoaders.remove(mId);
-            }
-
-            if (mHost != null && !hasRunningLoaders()) {
-                mHost.mFragmentManager.startPendingDeferredFragments();
-            }
-        }
-
-        void callOnLoadFinished(Loader<Object> loader, Object data) {
-            if (mCallbacks != null) {
-                String lastBecause = null;
-                if (mHost != null) {
-                    lastBecause = mHost.mFragmentManager.mNoTransactionsBecause;
-                    mHost.mFragmentManager.mNoTransactionsBecause = "onLoadFinished";
-                }
-                try {
-                    if (DEBUG) Log.v(TAG, "  onLoadFinished in " + loader + ": "
-                            + loader.dataToString(data));
-                    mCallbacks.onLoadFinished(loader, data);
-                } finally {
-                    if (mHost != null) {
-                        mHost.mFragmentManager.mNoTransactionsBecause = lastBecause;
-                    }
-                }
-                mDeliveredData = true;
-            }
-        }
-        
-        @Override
-        public String toString() {
-            StringBuilder sb = new StringBuilder(64);
-            sb.append("LoaderInfo{");
-            sb.append(Integer.toHexString(System.identityHashCode(this)));
-            sb.append(" #");
-            sb.append(mId);
-            sb.append(" : ");
-            DebugUtils.buildShortClassTag(mLoader, sb);
-            sb.append("}}");
-            return sb.toString();
-        }
-
-        public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) {
-            writer.print(prefix); writer.print("mId="); writer.print(mId);
-                    writer.print(" mArgs="); writer.println(mArgs);
-            writer.print(prefix); writer.print("mCallbacks="); writer.println(mCallbacks);
-            writer.print(prefix); writer.print("mLoader="); writer.println(mLoader);
-            if (mLoader != null) {
-                mLoader.dump(prefix + "  ", fd, writer, args);
-            }
-            if (mHaveData || mDeliveredData) {
-                writer.print(prefix); writer.print("mHaveData="); writer.print(mHaveData);
-                        writer.print("  mDeliveredData="); writer.println(mDeliveredData);
-                writer.print(prefix); writer.print("mData="); writer.println(mData);
-            }
-            writer.print(prefix); writer.print("mStarted="); writer.print(mStarted);
-                    writer.print(" mReportNextStart="); writer.print(mReportNextStart);
-                    writer.print(" mDestroyed="); writer.println(mDestroyed);
-            writer.print(prefix); writer.print("mRetaining="); writer.print(mRetaining);
-                    writer.print(" mRetainingStarted="); writer.print(mRetainingStarted);
-                    writer.print(" mListenerRegistered="); writer.println(mListenerRegistered);
-            if (mPendingLoader != null) {
-                writer.print(prefix); writer.println("Pending Loader ");
-                        writer.print(mPendingLoader); writer.println(":");
-                mPendingLoader.dump(prefix + "  ", fd, writer, args);
-            }
-        }
-    }
-    
-    LoaderManagerImpl(String who, FragmentHostCallback host, boolean started) {
-        mWho = who;
-        mHost = host;
-        mStarted = started;
-    }
-    
-    void updateHostController(FragmentHostCallback host) {
-        mHost = host;
-    }
-    
-    private LoaderInfo createLoader(int id, Bundle args,
-            LoaderManager.LoaderCallbacks<Object> callback) {
-        LoaderInfo info = new LoaderInfo(id, args,  callback);
-        Loader<Object> loader = callback.onCreateLoader(id, args);
-        info.mLoader = loader;
-        return info;
-    }
-    
-    private LoaderInfo createAndInstallLoader(int id, Bundle args,
-            LoaderManager.LoaderCallbacks<Object> callback) {
-        try {
-            mCreatingLoader = true;
-            LoaderInfo info = createLoader(id, args, callback);
-            installLoader(info);
-            return info;
-        } finally {
-            mCreatingLoader = false;
-        }
-    }
-    
-    void installLoader(LoaderInfo info) {
-        mLoaders.put(info.mId, info);
-        if (mStarted) {
-            // The activity will start all existing loaders in it's onStart(),
-            // so only start them here if we're past that point of the activitiy's
-            // life cycle
-            info.start();
-        }
-    }
-    
-    /**
-     * Call to initialize a particular ID with a Loader.  If this ID already
-     * has a Loader associated with it, it is left unchanged and any previous
-     * callbacks replaced with the newly provided ones.  If there is not currently
-     * a Loader for the ID, a new one is created and started.
-     * 
-     * <p>This function should generally be used when a component is initializing,
-     * to ensure that a Loader it relies on is created.  This allows it to re-use
-     * an existing Loader's data if there already is one, so that for example
-     * when an {@link Activity} is re-created after a configuration change it
-     * does not need to re-create its loaders.
-     * 
-     * <p>Note that in the case where an existing Loader is re-used, the
-     * <var>args</var> given here <em>will be ignored</em> because you will
-     * continue using the previous Loader.
-     * 
-     * @param id A unique (to this LoaderManager instance) identifier under
-     * which to manage the new Loader.
-     * @param args Optional arguments that will be propagated to
-     * {@link android.support.v4.app.LoaderManager.LoaderCallbacks#onCreateLoader(int, Bundle) LoaderCallbacks.onCreateLoader()}.
-     * @param callback Interface implementing management of this Loader.  Required.
-     * Its onCreateLoader() method will be called while inside of the function to
-     * instantiate the Loader object.
-     */
-    @SuppressWarnings("unchecked")
-    public <D> Loader<D> initLoader(int id, Bundle args, LoaderManager.LoaderCallbacks<D> callback) {
-        if (mCreatingLoader) {
-            throw new IllegalStateException("Called while creating a loader");
-        }
-        
-        LoaderInfo info = mLoaders.get(id);
-        
-        if (DEBUG) Log.v(TAG, "initLoader in " + this + ": args=" + args);
-
-        if (info == null) {
-            // Loader doesn't already exist; create.
-            info = createAndInstallLoader(id, args,  (LoaderManager.LoaderCallbacks<Object>)callback);
-            if (DEBUG) Log.v(TAG, "  Created new loader " + info);
-        } else {
-            if (DEBUG) Log.v(TAG, "  Re-using existing loader " + info);
-            info.mCallbacks = (LoaderManager.LoaderCallbacks<Object>)callback;
-        }
-        
-        if (info.mHaveData && mStarted) {
-            // If the loader has already generated its data, report it now.
-            info.callOnLoadFinished(info.mLoader, info.mData);
-        }
-        
-        return (Loader<D>)info.mLoader;
-    }
-    
-    /**
-     * Call to re-create the Loader associated with a particular ID.  If there
-     * is currently a Loader associated with this ID, it will be
-     * canceled/stopped/destroyed as appropriate.  A new Loader with the given
-     * arguments will be created and its data delivered to you once available.
-     * 
-     * <p>This function does some throttling of Loaders.  If too many Loaders
-     * have been created for the given ID but not yet generated their data,
-     * new calls to this function will create and return a new Loader but not
-     * actually start it until some previous loaders have completed.
-     * 
-     * <p>After calling this function, any previous Loaders associated with
-     * this ID will be considered invalid, and you will receive no further
-     * data updates from them.
-     * 
-     * @param id A unique (to this LoaderManager instance) identifier under
-     * which to manage the new Loader.
-     * @param args Optional arguments that will be propagated to
-     * {@link android.support.v4.app.LoaderManager.LoaderCallbacks#onCreateLoader(int, Bundle) LoaderCallbacks.onCreateLoader()}.
-     * @param callback Interface implementing management of this Loader.  Required.
-     * Its onCreateLoader() method will be called while inside of the function to
-     * instantiate the Loader object.
-     */
-    @SuppressWarnings("unchecked")
-    public <D> Loader<D> restartLoader(int id, Bundle args, LoaderManager.LoaderCallbacks<D> callback) {
-        if (mCreatingLoader) {
-            throw new IllegalStateException("Called while creating a loader");
-        }
-        
-        LoaderInfo info = mLoaders.get(id);
-        if (DEBUG) Log.v(TAG, "restartLoader in " + this + ": args=" + args);
-        if (info != null) {
-            LoaderInfo inactive = mInactiveLoaders.get(id);
-            if (inactive != null) {
-                if (info.mHaveData) {
-                    // This loader now has data...  we are probably being
-                    // called from within onLoadComplete, where we haven't
-                    // yet destroyed the last inactive loader.  So just do
-                    // that now.
-                    if (DEBUG) Log.v(TAG, "  Removing last inactive loader: " + info);
-                    inactive.mDeliveredData = false;
-                    inactive.destroy();
-                    info.mLoader.abandon();
-                    mInactiveLoaders.put(id, info);
-                } else {
-                    // We already have an inactive loader for this ID that we are
-                    // waiting for! Try to cancel; if this returns true then the task is still
-                    // running and we have more work to do.
-                    if (!info.cancel()) {
-                        // The current Loader has not been started or was successfully canceled,
-                        // we thus have no reason to keep it around. Remove it and a new
-                        // LoaderInfo will be created below.
-                        if (DEBUG) Log.v(TAG, "  Current loader is stopped; replacing");
-                        mLoaders.put(id, null);
-                        info.destroy();
-                    } else {
-                        // Now we have three active loaders... we'll queue
-                        // up this request to be processed once one of the other loaders
-                        // finishes.
-                        if (DEBUG) Log.v(TAG,
-                                "  Current loader is running; configuring pending loader");
-                        if (info.mPendingLoader != null) {
-                            if (DEBUG) Log.v(TAG, "  Removing pending loader: " + info.mPendingLoader);
-                            info.mPendingLoader.destroy();
-                            info.mPendingLoader = null;
-                        }
-                        if (DEBUG) Log.v(TAG, "  Enqueuing as new pending loader");
-                        info.mPendingLoader = createLoader(id, args, 
-                                (LoaderManager.LoaderCallbacks<Object>)callback);
-                        return (Loader<D>)info.mPendingLoader.mLoader;
-                    }
-                }
-            } else {
-                // Keep track of the previous instance of this loader so we can destroy
-                // it when the new one completes.
-                if (DEBUG) Log.v(TAG, "  Making last loader inactive: " + info);
-                info.mLoader.abandon();
-                mInactiveLoaders.put(id, info);
-            }
-        }
-        
-        info = createAndInstallLoader(id, args,  (LoaderManager.LoaderCallbacks<Object>)callback);
-        return (Loader<D>)info.mLoader;
-    }
-    
-    /**
-     * Rip down, tear apart, shred to pieces a current Loader ID.  After returning
-     * from this function, any Loader objects associated with this ID are
-     * destroyed.  Any data associated with them is destroyed.  You better not
-     * be using it when you do this.
-     * @param id Identifier of the Loader to be destroyed.
-     */
-    public void destroyLoader(int id) {
-        if (mCreatingLoader) {
-            throw new IllegalStateException("Called while creating a loader");
-        }
-        
-        if (DEBUG) Log.v(TAG, "destroyLoader in " + this + " of " + id);
-        int idx = mLoaders.indexOfKey(id);
-        if (idx >= 0) {
-            LoaderInfo info = mLoaders.valueAt(idx);
-            mLoaders.removeAt(idx);
-            info.destroy();
-        }
-        idx = mInactiveLoaders.indexOfKey(id);
-        if (idx >= 0) {
-            LoaderInfo info = mInactiveLoaders.valueAt(idx);
-            mInactiveLoaders.removeAt(idx);
-            info.destroy();
-        }
-        if (mHost != null && !hasRunningLoaders()) {
-            mHost.mFragmentManager.startPendingDeferredFragments();
-        }
-    }
-
-    /**
-     * Return the most recent Loader object associated with the
-     * given ID.
-     */
-    @SuppressWarnings("unchecked")
-    public <D> Loader<D> getLoader(int id) {
-        if (mCreatingLoader) {
-            throw new IllegalStateException("Called while creating a loader");
-        }
-        
-        LoaderInfo loaderInfo = mLoaders.get(id);
-        if (loaderInfo != null) {
-            if (loaderInfo.mPendingLoader != null) {
-                return (Loader<D>)loaderInfo.mPendingLoader.mLoader;
-            }
-            return (Loader<D>)loaderInfo.mLoader;
-        }
-        return null;
-    }
- 
-    void doStart() {
-        if (DEBUG) Log.v(TAG, "Starting in " + this);
-        if (mStarted) {
-            RuntimeException e = new RuntimeException("here");
-            e.fillInStackTrace();
-            Log.w(TAG, "Called doStart when already started: " + this, e);
-            return;
-        }
-        
-        mStarted = true;
-
-        // Call out to sub classes so they can start their loaders
-        // Let the existing loaders know that we want to be notified when a load is complete
-        for (int i = mLoaders.size()-1; i >= 0; i--) {
-            mLoaders.valueAt(i).start();
-        }
-    }
-    
-    void doStop() {
-        if (DEBUG) Log.v(TAG, "Stopping in " + this);
-        if (!mStarted) {
-            RuntimeException e = new RuntimeException("here");
-            e.fillInStackTrace();
-            Log.w(TAG, "Called doStop when not started: " + this, e);
-            return;
-        }
-
-        for (int i = mLoaders.size()-1; i >= 0; i--) {
-            mLoaders.valueAt(i).stop();
-        }
-        mStarted = false;
-    }
-    
-    void doRetain() {
-        if (DEBUG) Log.v(TAG, "Retaining in " + this);
-        if (!mStarted) {
-            RuntimeException e = new RuntimeException("here");
-            e.fillInStackTrace();
-            Log.w(TAG, "Called doRetain when not started: " + this, e);
-            return;
-        }
-
-        mRetaining = true;
-        mStarted = false;
-        for (int i = mLoaders.size()-1; i >= 0; i--) {
-            mLoaders.valueAt(i).retain();
-        }
-    }
-    
-    void finishRetain() {
-        if (mRetaining) {
-            if (DEBUG) Log.v(TAG, "Finished Retaining in " + this);
-
-            mRetaining = false;
-            for (int i = mLoaders.size()-1; i >= 0; i--) {
-                mLoaders.valueAt(i).finishRetain();
-            }
-        }
-    }
-    
-    void doReportNextStart() {
-        for (int i = mLoaders.size()-1; i >= 0; i--) {
-            mLoaders.valueAt(i).mReportNextStart = true;
-        }
-    }
-
-    void doReportStart() {
-        for (int i = mLoaders.size()-1; i >= 0; i--) {
-            mLoaders.valueAt(i).reportStart();
-        }
-    }
-
-    void doDestroy() {
-        if (!mRetaining) {
-            if (DEBUG) Log.v(TAG, "Destroying Active in " + this);
-            for (int i = mLoaders.size()-1; i >= 0; i--) {
-                mLoaders.valueAt(i).destroy();
-            }
-            mLoaders.clear();
-        }
-        
-        if (DEBUG) Log.v(TAG, "Destroying Inactive in " + this);
-        for (int i = mInactiveLoaders.size()-1; i >= 0; i--) {
-            mInactiveLoaders.valueAt(i).destroy();
-        }
-        mInactiveLoaders.clear();
-    }
-
-    @Override
-    public String toString() {
-        StringBuilder sb = new StringBuilder(128);
-        sb.append("LoaderManager{");
-        sb.append(Integer.toHexString(System.identityHashCode(this)));
-        sb.append(" in ");
-        DebugUtils.buildShortClassTag(mHost, sb);
-        sb.append("}}");
-        return sb.toString();
-    }
-
-    @Override
-    public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) {
-        if (mLoaders.size() > 0) {
-            writer.print(prefix); writer.println("Active Loaders:");
-            String innerPrefix = prefix + "    ";
-            for (int i=0; i < mLoaders.size(); i++) {
-                LoaderInfo li = mLoaders.valueAt(i);
-                writer.print(prefix); writer.print("  #"); writer.print(mLoaders.keyAt(i));
-                        writer.print(": "); writer.println(li.toString());
-                li.dump(innerPrefix, fd, writer, args);
-            }
-        }
-        if (mInactiveLoaders.size() > 0) {
-            writer.print(prefix); writer.println("Inactive Loaders:");
-            String innerPrefix = prefix + "    ";
-            for (int i=0; i < mInactiveLoaders.size(); i++) {
-                LoaderInfo li = mInactiveLoaders.valueAt(i);
-                writer.print(prefix); writer.print("  #"); writer.print(mInactiveLoaders.keyAt(i));
-                        writer.print(": "); writer.println(li.toString());
-                li.dump(innerPrefix, fd, writer, args);
-            }
-        }
-    }
-
-    @Override
-    public boolean hasRunningLoaders() {
-        boolean loadersRunning = false;
-        final int count = mLoaders.size();
-        for (int i = 0; i < count; i++) {
-            final LoaderInfo li = mLoaders.valueAt(i);
-            loadersRunning |= li.mStarted && !li.mDeliveredData;
-        }
-        return loadersRunning;
-    }
-}
diff --git a/v4/java/android/support/v4/app/NotificationCompat.java b/v4/java/android/support/v4/app/NotificationCompat.java
deleted file mode 100644
index d7b778c..0000000
--- a/v4/java/android/support/v4/app/NotificationCompat.java
+++ /dev/null
@@ -1,4023 +0,0 @@
-/*
- * Copyright (C) 2012 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 android.support.v4.app;
-
-import android.app.Activity;
-import android.app.Notification;
-import android.app.PendingIntent;
-import android.content.Context;
-import android.graphics.Bitmap;
-import android.graphics.Color;
-import android.media.AudioManager;
-import android.net.Uri;
-import android.os.Build;
-import android.os.Bundle;
-import android.os.Parcelable;
-import android.support.annotation.ColorInt;
-import android.support.v4.os.BuildCompat;
-import android.support.v4.view.GravityCompat;
-import android.view.Gravity;
-import android.widget.RemoteViews;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Helper for accessing features in {@link android.app.Notification}
- * introduced after API level 4 in a backwards compatible fashion.
- */
-public class NotificationCompat {
-
-    /**
-     * Use all default values (where applicable).
-     */
-    public static final int DEFAULT_ALL = ~0;
-
-    /**
-     * Use the default notification sound. This will ignore any sound set using
-     * {@link Builder#setSound}
-     *
-     * <p>
-     * A notification that is noisy is more likely to be presented as a heads-up notification,
-     * on some platforms.
-     * </p>
-     *
-     * @see Builder#setDefaults
-     */
-    public static final int DEFAULT_SOUND = 1;
-
-    /**
-     * Use the default notification vibrate. This will ignore any vibrate set using
-     * {@link Builder#setVibrate}. Using phone vibration requires the
-     * {@link android.Manifest.permission#VIBRATE VIBRATE} permission.
-     *
-     * <p>
-     * A notification that vibrates is more likely to be presented as a heads-up notification,
-     * on some platforms.
-     * </p>
-     *
-     * @see Builder#setDefaults
-     */
-    public static final int DEFAULT_VIBRATE = 2;
-
-    /**
-     * Use the default notification lights. This will ignore the
-     * {@link #FLAG_SHOW_LIGHTS} bit, and values set with {@link Builder#setLights}.
-     *
-     * @see Builder#setDefaults
-     */
-    public static final int DEFAULT_LIGHTS = 4;
-
-    /**
-     * Use this constant as the value for audioStreamType to request that
-     * the default stream type for notifications be used.  Currently the
-     * default stream type is {@link AudioManager#STREAM_NOTIFICATION}.
-     */
-    public static final int STREAM_DEFAULT = -1;
-
-    /**
-     * Bit set in the Notification flags field when LEDs should be turned on
-     * for this notification.
-     */
-    public static final int FLAG_SHOW_LIGHTS        = 0x00000001;
-
-    /**
-     * Bit set in the Notification flags field if this notification is in
-     * reference to something that is ongoing, like a phone call.  It should
-     * not be set if this notification is in reference to something that
-     * happened at a particular point in time, like a missed phone call.
-     */
-    public static final int FLAG_ONGOING_EVENT      = 0x00000002;
-
-    /**
-     * Bit set in the Notification flags field if
-     * the audio will be repeated until the notification is
-     * cancelled or the notification window is opened.
-     */
-    public static final int FLAG_INSISTENT          = 0x00000004;
-
-    /**
-     * Bit set in the Notification flags field if the notification's sound,
-     * vibrate and ticker should only be played if the notification is not already showing.
-     */
-    public static final int FLAG_ONLY_ALERT_ONCE    = 0x00000008;
-
-    /**
-     * Bit set in the Notification flags field if the notification should be canceled when
-     * it is clicked by the user.
-     */
-    public static final int FLAG_AUTO_CANCEL        = 0x00000010;
-
-    /**
-     * Bit set in the Notification flags field if the notification should not be canceled
-     * when the user clicks the Clear all button.
-     */
-    public static final int FLAG_NO_CLEAR           = 0x00000020;
-
-    /**
-     * Bit set in the Notification flags field if this notification represents a currently
-     * running service.  This will normally be set for you by
-     * {@link android.app.Service#startForeground}.
-     */
-    public static final int FLAG_FOREGROUND_SERVICE = 0x00000040;
-
-    /**
-     * Obsolete flag indicating high-priority notifications; use the priority field instead.
-     *
-     * @deprecated Use {@link NotificationCompat.Builder#setPriority(int)} with a positive value.
-     */
-    @Deprecated
-    public static final int FLAG_HIGH_PRIORITY      = 0x00000080;
-
-    /**
-     * Bit set in the Notification flags field if this notification is relevant to the current
-     * device only and it is not recommended that it bridge to other devices.
-     */
-    public static final int FLAG_LOCAL_ONLY         = 0x00000100;
-
-    /**
-     * Bit set in the Notification flags field if this notification is the group summary for a
-     * group of notifications. Grouped notifications may display in a cluster or stack on devices
-     * which support such rendering. Requires a group key also be set using
-     * {@link Builder#setGroup}.
-     */
-    public static final int FLAG_GROUP_SUMMARY      = 0x00000200;
-
-    /**
-     * Default notification priority for {@link NotificationCompat.Builder#setPriority(int)}.
-     * If your application does not prioritize its own notifications,
-     * use this value for all notifications.
-     */
-    public static final int PRIORITY_DEFAULT = 0;
-
-    /**
-     * Lower notification priority for {@link NotificationCompat.Builder#setPriority(int)},
-     * for items that are less important. The UI may choose to show
-     * these items smaller, or at a different position in the list,
-     * compared with your app's {@link #PRIORITY_DEFAULT} items.
-     */
-    public static final int PRIORITY_LOW = -1;
-
-    /**
-     * Lowest notification priority for {@link NotificationCompat.Builder#setPriority(int)};
-     * these items might not be shown to the user except under
-     * special circumstances, such as detailed notification logs.
-     */
-    public static final int PRIORITY_MIN = -2;
-
-    /**
-     * Higher notification priority for {@link NotificationCompat.Builder#setPriority(int)},
-     * for more important notifications or alerts. The UI may choose
-     * to show these items larger, or at a different position in
-     * notification lists, compared with your app's {@link #PRIORITY_DEFAULT} items.
-     */
-    public static final int PRIORITY_HIGH = 1;
-
-    /**
-     * Highest notification priority for {@link NotificationCompat.Builder#setPriority(int)},
-     * for your application's most important items that require the user's
-     * prompt attention or input.
-     */
-    public static final int PRIORITY_MAX = 2;
-
-    /**
-     * Notification extras key: this is the title of the notification,
-     * as supplied to {@link Builder#setContentTitle(CharSequence)}.
-     */
-    public static final String EXTRA_TITLE = "android.title";
-
-    /**
-     * Notification extras key: this is the title of the notification when shown in expanded form,
-     * e.g. as supplied to {@link BigTextStyle#setBigContentTitle(CharSequence)}.
-     */
-    public static final String EXTRA_TITLE_BIG = EXTRA_TITLE + ".big";
-
-    /**
-     * Notification extras key: this is the main text payload, as supplied to
-     * {@link Builder#setContentText(CharSequence)}.
-     */
-    public static final String EXTRA_TEXT = "android.text";
-
-    /**
-     * Notification extras key: this is a third line of text, as supplied to
-     * {@link Builder#setSubText(CharSequence)}.
-     */
-    public static final String EXTRA_SUB_TEXT = "android.subText";
-
-    /**
-     * Notification extras key: this is the remote input history, as supplied to
-     * {@link Builder#setRemoteInputHistory(CharSequence[])}.
-     *
-     * Apps can fill this through {@link Builder#setRemoteInputHistory(CharSequence[])}
-     * with the most recent inputs that have been sent through a {@link RemoteInput} of this
-     * Notification and are expected to clear it once the it is no longer relevant (e.g. for chat
-     * notifications once the other party has responded).
-     *
-     * The extra with this key is of type CharSequence[] and contains the most recent entry at
-     * the 0 index, the second most recent at the 1 index, etc.
-     *
-     * @see Builder#setRemoteInputHistory(CharSequence[])
-     */
-    public static final String EXTRA_REMOTE_INPUT_HISTORY = "android.remoteInputHistory";
-
-    /**
-     * Notification extras key: this is a small piece of additional text as supplied to
-     * {@link Builder#setContentInfo(CharSequence)}.
-     */
-    public static final String EXTRA_INFO_TEXT = "android.infoText";
-
-    /**
-     * Notification extras key: this is a line of summary information intended to be shown
-     * alongside expanded notifications, as supplied to (e.g.)
-     * {@link BigTextStyle#setSummaryText(CharSequence)}.
-     */
-    public static final String EXTRA_SUMMARY_TEXT = "android.summaryText";
-
-    /**
-     * Notification extras key: this is the longer text shown in the big form of a
-     * {@link BigTextStyle} notification, as supplied to
-     * {@link BigTextStyle#bigText(CharSequence)}.
-     */
-    public static final String EXTRA_BIG_TEXT = "android.bigText";
-
-    /**
-     * Notification extras key: this is the resource ID of the notification's main small icon, as
-     * supplied to {@link Builder#setSmallIcon(int)}.
-     */
-    public static final String EXTRA_SMALL_ICON = "android.icon";
-
-    /**
-     * Notification extras key: this is a bitmap to be used instead of the small icon when showing the
-     * notification payload, as
-     * supplied to {@link Builder#setLargeIcon(android.graphics.Bitmap)}.
-     */
-    public static final String EXTRA_LARGE_ICON = "android.largeIcon";
-
-    /**
-     * Notification extras key: this is a bitmap to be used instead of the one from
-     * {@link Builder#setLargeIcon(android.graphics.Bitmap)} when the notification is
-     * shown in its expanded form, as supplied to
-     * {@link BigPictureStyle#bigLargeIcon(android.graphics.Bitmap)}.
-     */
-    public static final String EXTRA_LARGE_ICON_BIG = EXTRA_LARGE_ICON + ".big";
-
-    /**
-     * Notification extras key: this is the progress value supplied to
-     * {@link Builder#setProgress(int, int, boolean)}.
-     */
-    public static final String EXTRA_PROGRESS = "android.progress";
-
-    /**
-     * Notification extras key: this is the maximum value supplied to
-     * {@link Builder#setProgress(int, int, boolean)}.
-     */
-    public static final String EXTRA_PROGRESS_MAX = "android.progressMax";
-
-    /**
-     * Notification extras key: whether the progress bar is indeterminate, supplied to
-     * {@link Builder#setProgress(int, int, boolean)}.
-     */
-    public static final String EXTRA_PROGRESS_INDETERMINATE = "android.progressIndeterminate";
-
-    /**
-     * Notification extras key: whether the when field set using {@link Builder#setWhen} should
-     * be shown as a count-up timer (specifically a {@link android.widget.Chronometer}) instead
-     * of a timestamp, as supplied to {@link Builder#setUsesChronometer(boolean)}.
-     */
-    public static final String EXTRA_SHOW_CHRONOMETER = "android.showChronometer";
-
-    /**
-     * Notification extras key: whether the when field set using {@link Builder#setWhen} should
-     * be shown, as supplied to {@link Builder#setShowWhen(boolean)}.
-     */
-    public static final String EXTRA_SHOW_WHEN = "android.showWhen";
-
-    /**
-     * Notification extras key: this is a bitmap to be shown in {@link BigPictureStyle} expanded
-     * notifications, supplied to {@link BigPictureStyle#bigPicture(android.graphics.Bitmap)}.
-     */
-    public static final String EXTRA_PICTURE = "android.picture";
-
-    /**
-     * Notification extras key: An array of CharSequences to show in {@link InboxStyle} expanded
-     * notifications, each of which was supplied to {@link InboxStyle#addLine(CharSequence)}.
-     */
-    public static final String EXTRA_TEXT_LINES = "android.textLines";
-
-    /**
-     * Notification extras key: A string representing the name of the specific
-     * {@link android.app.Notification.Style} used to create this notification.
-     */
-    public static final String EXTRA_TEMPLATE = "android.template";
-
-    /**
-     * Notification extras key: A String array containing the people that this
-     * notification relates to, each of which was supplied to
-     * {@link Builder#addPerson(String)}.
-     */
-    public static final String EXTRA_PEOPLE = "android.people";
-
-    /**
-     * Notification extras key: A
-     * {@link android.content.ContentUris content URI} pointing to an image that can be displayed
-     * in the background when the notification is selected. The URI must point to an image stream
-     * suitable for passing into
-     * {@link android.graphics.BitmapFactory#decodeStream(java.io.InputStream)
-     * BitmapFactory.decodeStream}; all other content types will be ignored. The content provider
-     * URI used for this purpose must require no permissions to read the image data.
-     */
-    public static final String EXTRA_BACKGROUND_IMAGE_URI = "android.backgroundImageUri";
-
-    /**
-     * Notification key: A
-     * {@link android.media.session.MediaSession.Token} associated with a
-     * {@link android.app.Notification.MediaStyle} notification.
-     */
-    public static final String EXTRA_MEDIA_SESSION = "android.mediaSession";
-
-    /**
-     * Notification extras key: the indices of actions to be shown in the compact view,
-     * as supplied to (e.g.) {@link Notification.MediaStyle#setShowActionsInCompactView(int...)}.
-     */
-    public static final String EXTRA_COMPACT_ACTIONS = "android.compactActions";
-
-    /**
-     * Notification key: the username to be displayed for all messages sent by the user
-     * including
-     * direct replies
-     * {@link MessagingStyle} notification.
-     */
-    public static final String EXTRA_SELF_DISPLAY_NAME = "android.selfDisplayName";
-
-    /**
-     * Notification key: a {@link String} to be displayed as the title to a conversation
-     * represented by a {@link MessagingStyle}
-     */
-    public static final String EXTRA_CONVERSATION_TITLE = "android.conversationTitle";
-
-    /**
-     * Notification key: an array of {@link Bundle} objects representing
-     * {@link MessagingStyle.Message} objects for a {@link MessagingStyle} notification.
-     */
-    public static final String EXTRA_MESSAGES = "android.messages";
-
-    /**
-     * Value of {@link Notification#color} equal to 0 (also known as
-     * {@link android.graphics.Color#TRANSPARENT Color.TRANSPARENT}),
-     * telling the system not to decorate this notification with any special color but instead use
-     * default colors when presenting this notification.
-     */
-    @ColorInt
-    public static final int COLOR_DEFAULT = Color.TRANSPARENT;
-
-    /**
-     * Notification visibility: Show this notification in its entirety on all lockscreens.
-     *
-     * {@see android.app.Notification#visibility}
-     */
-    public static final int VISIBILITY_PUBLIC = 1;
-
-    /**
-     * Notification visibility: Show this notification on all lockscreens, but conceal sensitive or
-     * private information on secure lockscreens.
-     *
-     * {@see android.app.Notification#visibility}
-     */
-    public static final int VISIBILITY_PRIVATE = 0;
-
-    /**
-     * Notification visibility: Do not reveal any part of this notification on a secure lockscreen.
-     *
-     * {@see android.app.Notification#visibility}
-     */
-    public static final int VISIBILITY_SECRET = -1;
-
-    /**
-     * Notification category: incoming call (voice or video) or similar synchronous communication request.
-     */
-    public static final String CATEGORY_CALL = NotificationCompatApi21.CATEGORY_CALL;
-
-    /**
-     * Notification category: incoming direct message (SMS, instant message, etc.).
-     */
-    public static final String CATEGORY_MESSAGE = NotificationCompatApi21.CATEGORY_MESSAGE;
-
-    /**
-     * Notification category: asynchronous bulk message (email).
-     */
-    public static final String CATEGORY_EMAIL = NotificationCompatApi21.CATEGORY_EMAIL;
-
-    /**
-     * Notification category: calendar event.
-     */
-    public static final String CATEGORY_EVENT = NotificationCompatApi21.CATEGORY_EVENT;
-
-    /**
-     * Notification category: promotion or advertisement.
-     */
-    public static final String CATEGORY_PROMO = NotificationCompatApi21.CATEGORY_PROMO;
-
-    /**
-     * Notification category: alarm or timer.
-     */
-    public static final String CATEGORY_ALARM = NotificationCompatApi21.CATEGORY_ALARM;
-
-    /**
-     * Notification category: progress of a long-running background operation.
-     */
-    public static final String CATEGORY_PROGRESS = NotificationCompatApi21.CATEGORY_PROGRESS;
-
-    /**
-     * Notification category: social network or sharing update.
-     */
-    public static final String CATEGORY_SOCIAL = NotificationCompatApi21.CATEGORY_SOCIAL;
-
-    /**
-     * Notification category: error in background operation or authentication status.
-     */
-    public static final String CATEGORY_ERROR = NotificationCompatApi21.CATEGORY_ERROR;
-
-    /**
-     * Notification category: media transport control for playback.
-     */
-    public static final String CATEGORY_TRANSPORT = NotificationCompatApi21.CATEGORY_TRANSPORT;
-
-    /**
-     * Notification category: system or device status update.  Reserved for system use.
-     */
-    public static final String CATEGORY_SYSTEM = NotificationCompatApi21.CATEGORY_SYSTEM;
-
-    /**
-     * Notification category: indication of running background service.
-     */
-    public static final String CATEGORY_SERVICE = NotificationCompatApi21.CATEGORY_SERVICE;
-
-    /**
-     * Notification category: user-scheduled reminder.
-     */
-    public static final String CATEGORY_REMINDER = NotificationCompatApi23.CATEGORY_REMINDER;
-
-    /**
-     * Notification category: a specific, timely recommendation for a single thing.
-     * For example, a news app might want to recommend a news story it believes the user will
-     * want to read next.
-     */
-    public static final String CATEGORY_RECOMMENDATION =
-            NotificationCompatApi21.CATEGORY_RECOMMENDATION;
-
-    /**
-     * Notification category: ongoing information about device or contextual status.
-     */
-    public static final String CATEGORY_STATUS = NotificationCompatApi21.CATEGORY_STATUS;
-
-    private static final NotificationCompatImpl IMPL;
-
-    interface NotificationCompatImpl {
-        public Notification build(Builder b, BuilderExtender extender);
-        public Bundle getExtras(Notification n);
-        public int getActionCount(Notification n);
-        public Action getAction(Notification n, int actionIndex);
-        public Action[] getActionsFromParcelableArrayList(ArrayList<Parcelable> parcelables);
-        public ArrayList<Parcelable> getParcelableArrayListForActions(Action[] actions);
-        public String getCategory(Notification n);
-        public boolean getLocalOnly(Notification n);
-        public String getGroup(Notification n);
-        public boolean isGroupSummary(Notification n);
-        public String getSortKey(Notification n);
-        Bundle getBundleForUnreadConversation(NotificationCompatBase.UnreadConversation uc);
-        NotificationCompatBase.UnreadConversation getUnreadConversationFromBundle(
-                Bundle b, NotificationCompatBase.UnreadConversation.Factory factory,
-                RemoteInputCompatBase.RemoteInput.Factory remoteInputFactory);
-    }
-
-    /**
-     * Interface for appcompat to extend v4 builder with media style.
-     *
-     * @hide
-     */
-    protected static class BuilderExtender {
-        public Notification build(Builder b, NotificationBuilderWithBuilderAccessor builder) {
-            return builder.build();
-        }
-    }
-
-    static class NotificationCompatImplBase implements NotificationCompatImpl {
-        @Override
-        public Notification build(Builder b, BuilderExtender extender) {
-            Notification result = b.mNotification;
-            result = NotificationCompatBase.add(result, b.mContext,
-                    b.mContentTitle, b.mContentText, b.mContentIntent);
-            // translate high priority requests into legacy flag
-            if (b.mPriority > PRIORITY_DEFAULT) {
-                result.flags |= FLAG_HIGH_PRIORITY;
-            }
-            if (b.mContentView != null) {
-                result.contentView = b.mContentView;
-            }
-            return result;
-        }
-
-        @Override
-        public Bundle getExtras(Notification n) {
-            return null;
-        }
-
-        @Override
-        public int getActionCount(Notification n) {
-            return 0;
-        }
-
-        @Override
-        public Action getAction(Notification n, int actionIndex) {
-            return null;
-        }
-
-        @Override
-        public Action[] getActionsFromParcelableArrayList(
-                ArrayList<Parcelable> parcelables) {
-            return null;
-        }
-
-        @Override
-        public ArrayList<Parcelable> getParcelableArrayListForActions(Action[] actions) {
-            return null;
-        }
-
-        @Override
-        public String getCategory(Notification n) {
-            return null;
-        }
-
-        @Override
-        public boolean getLocalOnly(Notification n) {
-            return false;
-        }
-
-        @Override
-        public String getGroup(Notification n) {
-            return null;
-        }
-
-        @Override
-        public boolean isGroupSummary(Notification n) {
-            return false;
-        }
-
-        @Override
-        public String getSortKey(Notification n) {
-            return null;
-        }
-
-        @Override
-        public Bundle getBundleForUnreadConversation(NotificationCompatBase.UnreadConversation uc) {
-            return null;
-        }
-
-        @Override
-        public NotificationCompatBase.UnreadConversation getUnreadConversationFromBundle(
-                Bundle b, NotificationCompatBase.UnreadConversation.Factory factory,
-                RemoteInputCompatBase.RemoteInput.Factory remoteInputFactory) {
-            return null;
-        }
-    }
-
-    static class NotificationCompatImplGingerbread extends NotificationCompatImplBase {
-        @Override
-        public Notification build(Builder b, BuilderExtender extender) {
-            Notification result = b.mNotification;
-            result = NotificationCompatGingerbread.add(result, b.mContext,
-                    b.mContentTitle, b.mContentText, b.mContentIntent, b.mFullScreenIntent);
-            // translate high priority requests into legacy flag
-            if (b.mPriority > PRIORITY_DEFAULT) {
-                result.flags |= FLAG_HIGH_PRIORITY;
-            }
-            if (b.mContentView != null) {
-                result.contentView = b.mContentView;
-            }
-            return result;
-        }
-    }
-
-    static class NotificationCompatImplHoneycomb extends NotificationCompatImplBase {
-        @Override
-        public Notification build(Builder b, BuilderExtender extender) {
-            Notification notification = NotificationCompatHoneycomb.add(b.mContext, b.mNotification,
-                    b.mContentTitle, b.mContentText, b.mContentInfo, b.mTickerView,
-                    b.mNumber, b.mContentIntent, b.mFullScreenIntent, b.mLargeIcon);
-            if (b.mContentView != null) {
-                notification.contentView = b.mContentView;
-            }
-            return notification;
-        }
-    }
-
-    static class NotificationCompatImplIceCreamSandwich extends NotificationCompatImplBase {
-        @Override
-        public Notification build(Builder b, BuilderExtender extender) {
-            NotificationCompatIceCreamSandwich.Builder builder =
-                    new NotificationCompatIceCreamSandwich.Builder(
-                            b.mContext, b.mNotification, b.mContentTitle, b.mContentText, b.mContentInfo,
-                            b.mTickerView, b.mNumber, b.mContentIntent, b.mFullScreenIntent, b.mLargeIcon,
-                            b.mProgressMax, b.mProgress, b.mProgressIndeterminate);
-            Notification notification = extender.build(b, builder);
-            if (b.mContentView != null) {
-                notification.contentView = b.mContentView;
-            }
-            return notification;
-        }
-    }
-
-    static class NotificationCompatImplJellybean extends NotificationCompatImplBase {
-        @Override
-        public Notification build(Builder b, BuilderExtender extender) {
-            NotificationCompatJellybean.Builder builder = new NotificationCompatJellybean.Builder(
-                    b.mContext, b.mNotification, b.mContentTitle, b.mContentText, b.mContentInfo,
-                    b.mTickerView, b.mNumber, b.mContentIntent, b.mFullScreenIntent, b.mLargeIcon,
-                    b.mProgressMax, b.mProgress, b.mProgressIndeterminate,
-                    b.mUseChronometer, b.mPriority, b.mSubText, b.mLocalOnly, b.mExtras,
-                    b.mGroupKey, b.mGroupSummary, b.mSortKey, b.mContentView, b.mBigContentView);
-            addActionsToBuilder(builder, b.mActions);
-            addStyleToBuilderJellybean(builder, b.mStyle);
-            Notification notification = extender.build(b, builder);
-            if (b.mStyle != null) {
-                b.mStyle.addCompatExtras(getExtras(notification));
-            }
-            return notification;
-        }
-
-        @Override
-        public Bundle getExtras(Notification n) {
-            return NotificationCompatJellybean.getExtras(n);
-        }
-
-        @Override
-        public int getActionCount(Notification n) {
-            return NotificationCompatJellybean.getActionCount(n);
-        }
-
-        @Override
-        public Action getAction(Notification n, int actionIndex) {
-            return (Action) NotificationCompatJellybean.getAction(n, actionIndex, Action.FACTORY,
-                    RemoteInput.FACTORY);
-        }
-
-        @Override
-        public Action[] getActionsFromParcelableArrayList(
-                ArrayList<Parcelable> parcelables) {
-            return (Action[]) NotificationCompatJellybean.getActionsFromParcelableArrayList(
-                    parcelables, Action.FACTORY, RemoteInput.FACTORY);
-        }
-
-        @Override
-        public ArrayList<Parcelable> getParcelableArrayListForActions(
-                Action[] actions) {
-            return NotificationCompatJellybean.getParcelableArrayListForActions(actions);
-        }
-
-        @Override
-        public boolean getLocalOnly(Notification n) {
-            return NotificationCompatJellybean.getLocalOnly(n);
-        }
-
-        @Override
-        public String getGroup(Notification n) {
-            return NotificationCompatJellybean.getGroup(n);
-        }
-
-        @Override
-        public boolean isGroupSummary(Notification n) {
-            return NotificationCompatJellybean.isGroupSummary(n);
-        }
-
-        @Override
-        public String getSortKey(Notification n) {
-            return NotificationCompatJellybean.getSortKey(n);
-        }
-    }
-
-    static class NotificationCompatImplKitKat extends NotificationCompatImplJellybean {
-        @Override
-        public Notification build(Builder b, BuilderExtender extender) {
-            NotificationCompatKitKat.Builder builder = new NotificationCompatKitKat.Builder(
-                    b.mContext, b.mNotification, b.mContentTitle, b.mContentText, b.mContentInfo,
-                    b.mTickerView, b.mNumber, b.mContentIntent, b.mFullScreenIntent, b.mLargeIcon,
-                    b.mProgressMax, b.mProgress, b.mProgressIndeterminate, b.mShowWhen,
-                    b.mUseChronometer, b.mPriority, b.mSubText, b.mLocalOnly,
-                    b.mPeople, b.mExtras, b.mGroupKey, b.mGroupSummary, b.mSortKey,
-                    b.mContentView, b.mBigContentView);
-            addActionsToBuilder(builder, b.mActions);
-            addStyleToBuilderJellybean(builder, b.mStyle);
-            return extender.build(b, builder);
-        }
-
-        @Override
-        public Bundle getExtras(Notification n) {
-            return NotificationCompatKitKat.getExtras(n);
-        }
-
-        @Override
-        public int getActionCount(Notification n) {
-            return NotificationCompatKitKat.getActionCount(n);
-        }
-
-        @Override
-        public Action getAction(Notification n, int actionIndex) {
-            return (Action) NotificationCompatKitKat.getAction(n, actionIndex, Action.FACTORY,
-                    RemoteInput.FACTORY);
-        }
-
-        @Override
-        public boolean getLocalOnly(Notification n) {
-            return NotificationCompatKitKat.getLocalOnly(n);
-        }
-
-        @Override
-        public String getGroup(Notification n) {
-            return NotificationCompatKitKat.getGroup(n);
-        }
-
-        @Override
-        public boolean isGroupSummary(Notification n) {
-            return NotificationCompatKitKat.isGroupSummary(n);
-        }
-
-        @Override
-        public String getSortKey(Notification n) {
-            return NotificationCompatKitKat.getSortKey(n);
-        }
-    }
-
-    static class NotificationCompatImplApi20 extends NotificationCompatImplKitKat {
-        @Override
-        public Notification build(Builder b, BuilderExtender extender) {
-            NotificationCompatApi20.Builder builder = new NotificationCompatApi20.Builder(
-                    b.mContext, b.mNotification, b.mContentTitle, b.mContentText, b.mContentInfo,
-                    b.mTickerView, b.mNumber, b.mContentIntent, b.mFullScreenIntent, b.mLargeIcon,
-                    b.mProgressMax, b.mProgress, b.mProgressIndeterminate, b.mShowWhen,
-                    b.mUseChronometer, b.mPriority, b.mSubText, b.mLocalOnly, b.mPeople, b.mExtras,
-                    b.mGroupKey, b.mGroupSummary, b.mSortKey, b.mContentView, b.mBigContentView);
-            addActionsToBuilder(builder, b.mActions);
-            addStyleToBuilderJellybean(builder, b.mStyle);
-            Notification notification = extender.build(b, builder);
-            if (b.mStyle != null) {
-                b.mStyle.addCompatExtras(getExtras(notification));
-            }
-            return notification;
-        }
-
-        @Override
-        public Action getAction(Notification n, int actionIndex) {
-            return (Action) NotificationCompatApi20.getAction(n, actionIndex, Action.FACTORY,
-                    RemoteInput.FACTORY);
-        }
-
-        @Override
-        public Action[] getActionsFromParcelableArrayList(
-                ArrayList<Parcelable> parcelables) {
-            return (Action[]) NotificationCompatApi20.getActionsFromParcelableArrayList(
-                    parcelables, Action.FACTORY, RemoteInput.FACTORY);
-        }
-
-        @Override
-        public ArrayList<Parcelable> getParcelableArrayListForActions(
-                Action[] actions) {
-            return NotificationCompatApi20.getParcelableArrayListForActions(actions);
-        }
-
-        @Override
-        public boolean getLocalOnly(Notification n) {
-            return NotificationCompatApi20.getLocalOnly(n);
-        }
-
-        @Override
-        public String getGroup(Notification n) {
-            return NotificationCompatApi20.getGroup(n);
-        }
-
-        @Override
-        public boolean isGroupSummary(Notification n) {
-            return NotificationCompatApi20.isGroupSummary(n);
-        }
-
-        @Override
-        public String getSortKey(Notification n) {
-            return NotificationCompatApi20.getSortKey(n);
-        }
-    }
-
-    static class NotificationCompatImplApi21 extends NotificationCompatImplApi20 {
-        @Override
-        public Notification build(Builder b, BuilderExtender extender) {
-            NotificationCompatApi21.Builder builder = new NotificationCompatApi21.Builder(
-                    b.mContext, b.mNotification, b.mContentTitle, b.mContentText, b.mContentInfo,
-                    b.mTickerView, b.mNumber, b.mContentIntent, b.mFullScreenIntent, b.mLargeIcon,
-                    b.mProgressMax, b.mProgress, b.mProgressIndeterminate, b.mShowWhen,
-                    b.mUseChronometer, b.mPriority, b.mSubText, b.mLocalOnly, b.mCategory,
-                    b.mPeople, b.mExtras, b.mColor, b.mVisibility, b.mPublicVersion,
-                    b.mGroupKey, b.mGroupSummary, b.mSortKey, b.mContentView, b.mBigContentView,
-                    b.mHeadsUpContentView);
-            addActionsToBuilder(builder, b.mActions);
-            addStyleToBuilderJellybean(builder, b.mStyle);
-            Notification notification = extender.build(b, builder);
-            if (b.mStyle != null) {
-                b.mStyle.addCompatExtras(getExtras(notification));
-            }
-            return notification;
-        }
-
-        @Override
-        public String getCategory(Notification notif) {
-            return NotificationCompatApi21.getCategory(notif);
-        }
-
-        @Override
-        public Bundle getBundleForUnreadConversation(NotificationCompatBase.UnreadConversation uc) {
-            return NotificationCompatApi21.getBundleForUnreadConversation(uc);
-        }
-
-        @Override
-        public NotificationCompatBase.UnreadConversation getUnreadConversationFromBundle(
-                Bundle b, NotificationCompatBase.UnreadConversation.Factory factory,
-                RemoteInputCompatBase.RemoteInput.Factory remoteInputFactory) {
-            return NotificationCompatApi21.getUnreadConversationFromBundle(
-                    b, factory, remoteInputFactory);
-        }
-    }
-
-    static class NotificationCompatImplApi24 extends NotificationCompatImplApi21 {
-        @Override
-        public Notification build(Builder b,
-                BuilderExtender extender) {
-            NotificationCompatApi24.Builder builder = new NotificationCompatApi24.Builder(
-                    b.mContext, b.mNotification, b.mContentTitle, b.mContentText, b.mContentInfo,
-                    b.mTickerView, b.mNumber, b.mContentIntent, b.mFullScreenIntent, b.mLargeIcon,
-                    b.mProgressMax, b.mProgress, b.mProgressIndeterminate, b.mShowWhen,
-                    b.mUseChronometer, b.mPriority, b.mSubText, b.mLocalOnly, b.mCategory,
-                    b.mPeople, b.mExtras, b.mColor, b.mVisibility, b.mPublicVersion,
-                    b.mGroupKey, b.mGroupSummary, b.mSortKey, b.mRemoteInputHistory, b.mContentView,
-                    b.mBigContentView, b.mHeadsUpContentView);
-            addActionsToBuilder(builder, b.mActions);
-            addStyleToBuilderApi24(builder, b.mStyle);
-            Notification notification = extender.build(b, builder);
-            if (b.mStyle != null) {
-                b.mStyle.addCompatExtras(getExtras(notification));
-            }
-            return notification;
-        }
-    }
-
-    private static void addActionsToBuilder(NotificationBuilderWithActions builder,
-            ArrayList<Action> actions) {
-        for (Action action : actions) {
-            builder.addAction(action);
-        }
-    }
-
-    private static void addStyleToBuilderJellybean(NotificationBuilderWithBuilderAccessor builder,
-            Style style) {
-        if (style != null) {
-            if (style instanceof BigTextStyle) {
-                BigTextStyle bigTextStyle = (BigTextStyle) style;
-                NotificationCompatJellybean.addBigTextStyle(builder,
-                        bigTextStyle.mBigContentTitle,
-                        bigTextStyle.mSummaryTextSet,
-                        bigTextStyle.mSummaryText,
-                        bigTextStyle.mBigText);
-            } else if (style instanceof InboxStyle) {
-                InboxStyle inboxStyle = (InboxStyle) style;
-                NotificationCompatJellybean.addInboxStyle(builder,
-                        inboxStyle.mBigContentTitle,
-                        inboxStyle.mSummaryTextSet,
-                        inboxStyle.mSummaryText,
-                        inboxStyle.mTexts);
-            } else if (style instanceof BigPictureStyle) {
-                BigPictureStyle bigPictureStyle = (BigPictureStyle) style;
-                NotificationCompatJellybean.addBigPictureStyle(builder,
-                        bigPictureStyle.mBigContentTitle,
-                        bigPictureStyle.mSummaryTextSet,
-                        bigPictureStyle.mSummaryText,
-                        bigPictureStyle.mPicture,
-                        bigPictureStyle.mBigLargeIcon,
-                        bigPictureStyle.mBigLargeIconSet);
-            } else if (style instanceof MessagingStyle) {
-                // TODO implement BigText fallback
-            }
-        }
-    }
-
-    private static void addStyleToBuilderApi24(NotificationBuilderWithBuilderAccessor builder,
-            Style style) {
-        if (style != null) {
-            if (style instanceof MessagingStyle) {
-                MessagingStyle messagingStyle = (MessagingStyle) style;
-                List<CharSequence> texts = new ArrayList<>();
-                List<Long> timestamps = new ArrayList<>();
-                List<CharSequence> senders = new ArrayList<>();
-                List<String> dataMimeTypes = new ArrayList<>();
-                List<Uri> dataUris = new ArrayList<>();
-
-                for (MessagingStyle.Message message : messagingStyle.mMessages) {
-                    texts.add(message.getText());
-                    timestamps.add(message.getTimestamp());
-                    senders.add(message.getSender());
-                    dataMimeTypes.add(message.getDataMimeType());
-                    dataUris.add(message.getDataUri());
-                }
-                NotificationCompatApi24.addMessagingStyle(builder, messagingStyle.mUserDisplayName,
-                        messagingStyle.mConversationTitle, texts, timestamps, senders,
-                        dataMimeTypes, dataUris);
-            } else {
-                addStyleToBuilderJellybean(builder, style);
-            }
-        }
-    }
-
-    static {
-        if (BuildCompat.isAtLeastN()) {
-            IMPL = new NotificationCompatImplApi24();
-        } else if (Build.VERSION.SDK_INT >= 21) {
-            IMPL = new NotificationCompatImplApi21();
-        } else if (Build.VERSION.SDK_INT >= 20) {
-            IMPL = new NotificationCompatImplApi20();
-        } else if (Build.VERSION.SDK_INT >= 19) {
-            IMPL = new NotificationCompatImplKitKat();
-        } else if (Build.VERSION.SDK_INT >= 16) {
-            IMPL = new NotificationCompatImplJellybean();
-        } else if (Build.VERSION.SDK_INT >= 14) {
-            IMPL = new NotificationCompatImplIceCreamSandwich();
-        } else if (Build.VERSION.SDK_INT >= 11) {
-            IMPL = new NotificationCompatImplHoneycomb();
-        } else if (Build.VERSION.SDK_INT >= 9) {
-            IMPL = new NotificationCompatImplGingerbread();
-        } else {
-            IMPL = new NotificationCompatImplBase();
-        }
-    }
-
-    /**
-     * Builder class for {@link NotificationCompat} objects.  Allows easier control over
-     * all the flags, as well as help constructing the typical notification layouts.
-     * <p>
-     * On platform versions that don't offer expanded notifications, methods that depend on
-     * expanded notifications have no effect.
-     * </p>
-     * <p>
-     * For example, action buttons won't appear on platforms prior to Android 4.1. Action
-     * buttons depend on expanded notifications, which are only available in Android 4.1
-     * and later.
-     * <p>
-     * For this reason, you should always ensure that UI controls in a notification are also
-     * available in an {@link android.app.Activity} in your app, and you should always start that
-     * {@link android.app.Activity} when users click the notification. To do this, use the
-     * {@link NotificationCompat.Builder#setContentIntent setContentIntent()}
-     * method.
-     * </p>
-     *
-     */
-    public static class Builder {
-        /**
-         * Maximum length of CharSequences accepted by Builder and friends.
-         *
-         * <p>
-         * Avoids spamming the system with overly large strings such as full e-mails.
-         */
-        private static final int MAX_CHARSEQUENCE_LENGTH = 5 * 1024;
-
-        // All these variables are declared public/hidden so they can be accessed by a builder
-        // extender.
-
-        /** @hide */
-        public Context mContext;
-
-        /** @hide */
-        public CharSequence mContentTitle;
-        /** @hide */
-        public CharSequence mContentText;
-        PendingIntent mContentIntent;
-        PendingIntent mFullScreenIntent;
-        RemoteViews mTickerView;
-        /** @hide */
-        public Bitmap mLargeIcon;
-        /** @hide */
-        public CharSequence mContentInfo;
-        /** @hide */
-        public int mNumber;
-        int mPriority;
-        boolean mShowWhen = true;
-        /** @hide */
-        public boolean mUseChronometer;
-        /** @hide */
-        public Style mStyle;
-        /** @hide */
-        public CharSequence mSubText;
-        /** @hide */
-        public CharSequence[] mRemoteInputHistory;
-        int mProgressMax;
-        int mProgress;
-        boolean mProgressIndeterminate;
-        String mGroupKey;
-        boolean mGroupSummary;
-        String mSortKey;
-        /** @hide */
-        public ArrayList<Action> mActions = new ArrayList<Action>();
-        boolean mLocalOnly = false;
-        String mCategory;
-        Bundle mExtras;
-        int mColor = COLOR_DEFAULT;
-        int mVisibility = VISIBILITY_PRIVATE;
-        Notification mPublicVersion;
-        RemoteViews mContentView;
-        RemoteViews mBigContentView;
-        RemoteViews mHeadsUpContentView;
-
-        /** @hide */
-        public Notification mNotification = new Notification();
-        public ArrayList<String> mPeople;
-
-        /**
-         * Constructor.
-         *
-         * Automatically sets the when field to {@link System#currentTimeMillis()
-         * System.currentTimeMillis()} and the audio stream to the
-         * {@link Notification#STREAM_DEFAULT}.
-         *
-         * @param context A {@link Context} that will be used to construct the
-         *      RemoteViews. The Context will not be held past the lifetime of this
-         *      Builder object.
-         */
-        public Builder(Context context) {
-            mContext = context;
-
-            // Set defaults to match the defaults of a Notification
-            mNotification.when = System.currentTimeMillis();
-            mNotification.audioStreamType = Notification.STREAM_DEFAULT;
-            mPriority = PRIORITY_DEFAULT;
-            mPeople = new ArrayList<String>();
-        }
-
-        /**
-         * Set the time that the event occurred.  Notifications in the panel are
-         * sorted by this time.
-         */
-        public Builder setWhen(long when) {
-            mNotification.when = when;
-            return this;
-        }
-
-        /**
-         * Control whether the timestamp set with {@link #setWhen(long) setWhen} is shown
-         * in the content view.
-         */
-        public Builder setShowWhen(boolean show) {
-            mShowWhen = show;
-            return this;
-        }
-
-        /**
-         * Show the {@link Notification#when} field as a stopwatch.
-         *
-         * Instead of presenting <code>when</code> as a timestamp, the notification will show an
-         * automatically updating display of the minutes and seconds since <code>when</code>.
-         *
-         * Useful when showing an elapsed time (like an ongoing phone call).
-         *
-         * @see android.widget.Chronometer
-         * @see Notification#when
-         */
-        public Builder setUsesChronometer(boolean b) {
-            mUseChronometer = b;
-            return this;
-        }
-
-        /**
-         * Set the small icon to use in the notification layouts.  Different classes of devices
-         * may return different sizes.  See the UX guidelines for more information on how to
-         * design these icons.
-         *
-         * @param icon A resource ID in the application's package of the drawble to use.
-         */
-        public Builder setSmallIcon(int icon) {
-            mNotification.icon = icon;
-            return this;
-        }
-
-        /**
-         * A variant of {@link #setSmallIcon(int) setSmallIcon(int)} that takes an additional
-         * level parameter for when the icon is a {@link android.graphics.drawable.LevelListDrawable
-         * LevelListDrawable}.
-         *
-         * @param icon A resource ID in the application's package of the drawble to use.
-         * @param level The level to use for the icon.
-         *
-         * @see android.graphics.drawable.LevelListDrawable
-         */
-        public Builder setSmallIcon(int icon, int level) {
-            mNotification.icon = icon;
-            mNotification.iconLevel = level;
-            return this;
-        }
-
-        /**
-         * Set the title (first row) of the notification, in a standard notification.
-         */
-        public Builder setContentTitle(CharSequence title) {
-            mContentTitle = limitCharSequenceLength(title);
-            return this;
-        }
-
-        /**
-         * Set the text (second row) of the notification, in a standard notification.
-         */
-        public Builder setContentText(CharSequence text) {
-            mContentText = limitCharSequenceLength(text);
-            return this;
-        }
-
-        /**
-         * Set the third line of text in the platform notification template.
-         * Don't use if you're also using {@link #setProgress(int, int, boolean)};
-         * they occupy the same location in the standard template.
-         * <br>
-         * If the platform does not provide large-format notifications, this method has no effect.
-         * The third line of text only appears in expanded view.
-         * <br>
-         */
-        public Builder setSubText(CharSequence text) {
-            mSubText = limitCharSequenceLength(text);
-            return this;
-        }
-
-        /**
-         * Set the remote input history.
-         *
-         * This should be set to the most recent inputs that have been sent
-         * through a {@link RemoteInput} of this Notification and cleared once the it is no
-         * longer relevant (e.g. for chat notifications once the other party has responded).
-         *
-         * The most recent input must be stored at the 0 index, the second most recent at the
-         * 1 index, etc. Note that the system will limit both how far back the inputs will be shown
-         * and how much of each individual input is shown.
-         *
-         * <p>Note: The reply text will only be shown on notifications that have least one action
-         * with a {@code RemoteInput}.</p>
-         */
-        public Builder setRemoteInputHistory(CharSequence[] text) {
-            mRemoteInputHistory = text;
-            return this;
-        }
-
-        /**
-         * Set the large number at the right-hand side of the notification.  This is
-         * equivalent to setContentInfo, although it might show the number in a different
-         * font size for readability.
-         */
-        public Builder setNumber(int number) {
-            mNumber = number;
-            return this;
-        }
-
-        /**
-         * Set the large text at the right-hand side of the notification.
-         */
-        public Builder setContentInfo(CharSequence info) {
-            mContentInfo = limitCharSequenceLength(info);
-            return this;
-        }
-
-        /**
-         * Set the progress this notification represents, which may be
-         * represented as a {@link android.widget.ProgressBar}.
-         */
-        public Builder setProgress(int max, int progress, boolean indeterminate) {
-            mProgressMax = max;
-            mProgress = progress;
-            mProgressIndeterminate = indeterminate;
-            return this;
-        }
-
-        /**
-         * Supply a custom RemoteViews to use instead of the standard one.
-         */
-        public Builder setContent(RemoteViews views) {
-            mNotification.contentView = views;
-            return this;
-        }
-
-        /**
-         * Supply a {@link PendingIntent} to send when the notification is clicked.
-         * If you do not supply an intent, you can now add PendingIntents to individual
-         * views to be launched when clicked by calling {@link RemoteViews#setOnClickPendingIntent
-         * RemoteViews.setOnClickPendingIntent(int,PendingIntent)}.  Be sure to
-         * read {@link Notification#contentIntent Notification.contentIntent} for
-         * how to correctly use this.
-         */
-        public Builder setContentIntent(PendingIntent intent) {
-            mContentIntent = intent;
-            return this;
-        }
-
-        /**
-         * Supply a {@link PendingIntent} to send when the notification is cleared by the user
-         * directly from the notification panel.  For example, this intent is sent when the user
-         * clicks the "Clear all" button, or the individual "X" buttons on notifications.  This
-         * intent is not sent when the application calls
-         * {@link android.app.NotificationManager#cancel NotificationManager.cancel(int)}.
-         */
-        public Builder setDeleteIntent(PendingIntent intent) {
-            mNotification.deleteIntent = intent;
-            return this;
-        }
-
-        /**
-         * An intent to launch instead of posting the notification to the status bar.
-         * Only for use with extremely high-priority notifications demanding the user's
-         * <strong>immediate</strong> attention, such as an incoming phone call or
-         * alarm clock that the user has explicitly set to a particular time.
-         * If this facility is used for something else, please give the user an option
-         * to turn it off and use a normal notification, as this can be extremely
-         * disruptive.
-         *
-         * <p>
-         * On some platforms, the system UI may choose to display a heads-up notification,
-         * instead of launching this intent, while the user is using the device.
-         * </p>
-         *
-         * @param intent The pending intent to launch.
-         * @param highPriority Passing true will cause this notification to be sent
-         *          even if other notifications are suppressed.
-         */
-        public Builder setFullScreenIntent(PendingIntent intent, boolean highPriority) {
-            mFullScreenIntent = intent;
-            setFlag(FLAG_HIGH_PRIORITY, highPriority);
-            return this;
-        }
-
-        /**
-         * Set the text that is displayed in the status bar when the notification first
-         * arrives.
-         */
-        public Builder setTicker(CharSequence tickerText) {
-            mNotification.tickerText = limitCharSequenceLength(tickerText);
-            return this;
-        }
-
-        /**
-         * Set the text that is displayed in the status bar when the notification first
-         * arrives, and also a RemoteViews object that may be displayed instead on some
-         * devices.
-         */
-        public Builder setTicker(CharSequence tickerText, RemoteViews views) {
-            mNotification.tickerText = limitCharSequenceLength(tickerText);
-            mTickerView = views;
-            return this;
-        }
-
-        /**
-         * Set the large icon that is shown in the ticker and notification.
-         */
-        public Builder setLargeIcon(Bitmap icon) {
-            mLargeIcon = icon;
-            return this;
-        }
-
-        /**
-         * Set the sound to play.  It will play on the default stream.
-         *
-         * <p>
-         * On some platforms, a notification that is noisy is more likely to be presented
-         * as a heads-up notification.
-         * </p>
-         */
-        public Builder setSound(Uri sound) {
-            mNotification.sound = sound;
-            mNotification.audioStreamType = Notification.STREAM_DEFAULT;
-            return this;
-        }
-
-        /**
-         * Set the sound to play.  It will play on the stream you supply.
-         *
-         * <p>
-         * On some platforms, a notification that is noisy is more likely to be presented
-         * as a heads-up notification.
-         * </p>
-         *
-         * @see Notification#STREAM_DEFAULT
-         * @see AudioManager for the <code>STREAM_</code> constants.
-         */
-        public Builder setSound(Uri sound, int streamType) {
-            mNotification.sound = sound;
-            mNotification.audioStreamType = streamType;
-            return this;
-        }
-
-        /**
-         * Set the vibration pattern to use.
-         *
-         * <p>
-         * On some platforms, a notification that vibrates is more likely to be presented
-         * as a heads-up notification.
-         * </p>
-         *
-         * @see android.os.Vibrator for a discussion of the <code>pattern</code>
-         * parameter.
-         */
-        public Builder setVibrate(long[] pattern) {
-            mNotification.vibrate = pattern;
-            return this;
-        }
-
-        /**
-         * Set the argb value that you would like the LED on the device to blnk, as well as the
-         * rate.  The rate is specified in terms of the number of milliseconds to be on
-         * and then the number of milliseconds to be off.
-         */
-        public Builder setLights(@ColorInt int argb, int onMs, int offMs) {
-            mNotification.ledARGB = argb;
-            mNotification.ledOnMS = onMs;
-            mNotification.ledOffMS = offMs;
-            boolean showLights = mNotification.ledOnMS != 0 && mNotification.ledOffMS != 0;
-            mNotification.flags = (mNotification.flags & ~Notification.FLAG_SHOW_LIGHTS) |
-                    (showLights ? Notification.FLAG_SHOW_LIGHTS : 0);
-            return this;
-        }
-
-        /**
-         * Set whether this is an ongoing notification.
-         *
-         * <p>Ongoing notifications differ from regular notifications in the following ways:
-         * <ul>
-         *   <li>Ongoing notifications are sorted above the regular notifications in the
-         *   notification panel.</li>
-         *   <li>Ongoing notifications do not have an 'X' close button, and are not affected
-         *   by the "Clear all" button.
-         * </ul>
-         */
-        public Builder setOngoing(boolean ongoing) {
-            setFlag(Notification.FLAG_ONGOING_EVENT, ongoing);
-            return this;
-        }
-
-        /**
-         * Set this flag if you would only like the sound, vibrate
-         * and ticker to be played if the notification is not already showing.
-         */
-        public Builder setOnlyAlertOnce(boolean onlyAlertOnce) {
-            setFlag(Notification.FLAG_ONLY_ALERT_ONCE, onlyAlertOnce);
-            return this;
-        }
-
-        /**
-         * Setting this flag will make it so the notification is automatically
-         * canceled when the user clicks it in the panel.  The PendingIntent
-         * set with {@link #setDeleteIntent} will be broadcast when the notification
-         * is canceled.
-         */
-        public Builder setAutoCancel(boolean autoCancel) {
-            setFlag(Notification.FLAG_AUTO_CANCEL, autoCancel);
-            return this;
-        }
-
-        /**
-         * Set whether or not this notification is only relevant to the current device.
-         *
-         * <p>Some notifications can be bridged to other devices for remote display.
-         * This hint can be set to recommend this notification not be bridged.
-         */
-        public Builder setLocalOnly(boolean b) {
-            mLocalOnly = b;
-            return this;
-        }
-
-        /**
-         * Set the notification category.
-         *
-         * <p>Must be one of the predefined notification categories (see the <code>CATEGORY_*</code>
-         * constants in {@link Notification}) that best describes this notification.
-         * May be used by the system for ranking and filtering.
-         */
-        public Builder setCategory(String category) {
-            mCategory = category;
-            return this;
-        }
-
-        /**
-         * Set the default notification options that will be used.
-         * <p>
-         * The value should be one or more of the following fields combined with
-         * bitwise-or:
-         * {@link Notification#DEFAULT_SOUND}, {@link Notification#DEFAULT_VIBRATE},
-         * {@link Notification#DEFAULT_LIGHTS}.
-         * <p>
-         * For all default values, use {@link Notification#DEFAULT_ALL}.
-         */
-        public Builder setDefaults(int defaults) {
-            mNotification.defaults = defaults;
-            if ((defaults & Notification.DEFAULT_LIGHTS) != 0) {
-                mNotification.flags |= Notification.FLAG_SHOW_LIGHTS;
-            }
-            return this;
-        }
-
-        private void setFlag(int mask, boolean value) {
-            if (value) {
-                mNotification.flags |= mask;
-            } else {
-                mNotification.flags &= ~mask;
-            }
-        }
-
-        /**
-         * Set the relative priority for this notification.
-         *
-         * Priority is an indication of how much of the user's
-         * valuable attention should be consumed by this
-         * notification. Low-priority notifications may be hidden from
-         * the user in certain situations, while the user might be
-         * interrupted for a higher-priority notification.
-         * The system sets a notification's priority based on various factors including the
-         * setPriority value. The effect may differ slightly on different platforms.
-         *
-         * @param pri Relative priority for this notification. Must be one of
-         *     the priority constants defined by {@link NotificationCompat}.
-         *     Acceptable values range from {@link
-         *     NotificationCompat#PRIORITY_MIN} (-2) to {@link
-         *     NotificationCompat#PRIORITY_MAX} (2).
-         */
-        public Builder setPriority(int pri) {
-            mPriority = pri;
-            return this;
-        }
-
-        /**
-         * Add a person that is relevant to this notification.
-         *
-         * <P>
-         * Depending on user preferences, this annotation may allow the notification to pass
-         * through interruption filters, and to appear more prominently in the user interface.
-         * </P>
-         *
-         * <P>
-         * The person should be specified by the {@code String} representation of a
-         * {@link android.provider.ContactsContract.Contacts#CONTENT_LOOKUP_URI}.
-         * </P>
-         *
-         * <P>The system will also attempt to resolve {@code mailto:} and {@code tel:} schema
-         * URIs.  The path part of these URIs must exist in the contacts database, in the
-         * appropriate column, or the reference will be discarded as invalid. Telephone schema
-         * URIs will be resolved by {@link android.provider.ContactsContract.PhoneLookup}.
-         * </P>
-         *
-         * @param uri A URI for the person.
-         * @see Notification#EXTRA_PEOPLE
-         */
-        public Builder addPerson(String uri) {
-            mPeople.add(uri);
-            return this;
-        }
-
-        /**
-         * Set this notification to be part of a group of notifications sharing the same key.
-         * Grouped notifications may display in a cluster or stack on devices which
-         * support such rendering.
-         *
-         * <p>To make this notification the summary for its group, also call
-         * {@link #setGroupSummary}. A sort order can be specified for group members by using
-         * {@link #setSortKey}.
-         * @param groupKey The group key of the group.
-         * @return this object for method chaining
-         */
-        public Builder setGroup(String groupKey) {
-            mGroupKey = groupKey;
-            return this;
-        }
-
-        /**
-         * Set this notification to be the group summary for a group of notifications.
-         * Grouped notifications may display in a cluster or stack on devices which
-         * support such rendering. Requires a group key also be set using {@link #setGroup}.
-         * @param isGroupSummary Whether this notification should be a group summary.
-         * @return this object for method chaining
-         */
-        public Builder setGroupSummary(boolean isGroupSummary) {
-            mGroupSummary = isGroupSummary;
-            return this;
-        }
-
-        /**
-         * Set a sort key that orders this notification among other notifications from the
-         * same package. This can be useful if an external sort was already applied and an app
-         * would like to preserve this. Notifications will be sorted lexicographically using this
-         * value, although providing different priorities in addition to providing sort key may
-         * cause this value to be ignored.
-         *
-         * <p>This sort key can also be used to order members of a notification group. See
-         * {@link Builder#setGroup}.
-         *
-         * @see String#compareTo(String)
-         */
-        public Builder setSortKey(String sortKey) {
-            mSortKey = sortKey;
-            return this;
-        }
-
-        /**
-         * Merge additional metadata into this notification.
-         *
-         * <p>Values within the Bundle will replace existing extras values in this Builder.
-         *
-         * @see Notification#extras
-         */
-        public Builder addExtras(Bundle extras) {
-            if (extras != null) {
-                if (mExtras == null) {
-                    mExtras = new Bundle(extras);
-                } else {
-                    mExtras.putAll(extras);
-                }
-            }
-            return this;
-        }
-
-        /**
-         * Set metadata for this notification.
-         *
-         * <p>A reference to the Bundle is held for the lifetime of this Builder, and the Bundle's
-         * current contents are copied into the Notification each time {@link #build()} is
-         * called.
-         *
-         * <p>Replaces any existing extras values with those from the provided Bundle.
-         * Use {@link #addExtras} to merge in metadata instead.
-         *
-         * @see Notification#extras
-         */
-        public Builder setExtras(Bundle extras) {
-            mExtras = extras;
-            return this;
-        }
-
-        /**
-         * Get the current metadata Bundle used by this notification Builder.
-         *
-         * <p>The returned Bundle is shared with this Builder.
-         *
-         * <p>The current contents of this Bundle are copied into the Notification each time
-         * {@link #build()} is called.
-         *
-         * @see Notification#extras
-         */
-        public Bundle getExtras() {
-            if (mExtras == null) {
-                mExtras = new Bundle();
-            }
-            return mExtras;
-        }
-
-        /**
-         * Add an action to this notification. Actions are typically displayed by
-         * the system as a button adjacent to the notification content.
-         * <br>
-         * Action buttons won't appear on platforms prior to Android 4.1. Action
-         * buttons depend on expanded notifications, which are only available in Android 4.1
-         * and later. To ensure that an action button's functionality is always available, first
-         * implement the functionality in the {@link android.app.Activity} that starts when a user
-         * clicks the  notification (see {@link #setContentIntent setContentIntent()}), and then
-         * enhance the notification by implementing the same functionality with
-         * {@link #addAction addAction()}.
-         *
-         * @param icon Resource ID of a drawable that represents the action.
-         * @param title Text describing the action.
-         * @param intent {@link android.app.PendingIntent} to be fired when the action is invoked.
-         */
-        public Builder addAction(int icon, CharSequence title, PendingIntent intent) {
-            mActions.add(new Action(icon, title, intent));
-            return this;
-        }
-
-        /**
-         * Add an action to this notification. Actions are typically displayed by
-         * the system as a button adjacent to the notification content.
-         * <br>
-         * Action buttons won't appear on platforms prior to Android 4.1. Action
-         * buttons depend on expanded notifications, which are only available in Android 4.1
-         * and later. To ensure that an action button's functionality is always available, first
-         * implement the functionality in the {@link android.app.Activity} that starts when a user
-         * clicks the  notification (see {@link #setContentIntent setContentIntent()}), and then
-         * enhance the notification by implementing the same functionality with
-         * {@link #addAction addAction()}.
-         *
-         * @param action The action to add.
-         */
-        public Builder addAction(Action action) {
-            mActions.add(action);
-            return this;
-        }
-
-        /**
-         * Add a rich notification style to be applied at build time.
-         * <br>
-         * If the platform does not provide rich notification styles, this method has no effect. The
-         * user will always see the normal notification style.
-         *
-         * @param style Object responsible for modifying the notification style.
-         */
-        public Builder setStyle(Style style) {
-            if (mStyle != style) {
-                mStyle = style;
-                if (mStyle != null) {
-                    mStyle.setBuilder(this);
-                }
-            }
-            return this;
-        }
-
-        /**
-         * Sets {@link Notification#color}.
-         *
-         * @param argb The accent color to use
-         *
-         * @return The same Builder.
-         */
-        public Builder setColor(@ColorInt int argb) {
-            mColor = argb;
-            return this;
-        }
-
-        /**
-         * Sets {@link Notification#visibility}.
-         *
-         * @param visibility One of {@link Notification#VISIBILITY_PRIVATE} (the default),
-         *                   {@link Notification#VISIBILITY_PUBLIC}, or
-         *                   {@link Notification#VISIBILITY_SECRET}.
-         */
-        public Builder setVisibility(int visibility) {
-            mVisibility = visibility;
-            return this;
-        }
-
-        /**
-         * Supply a replacement Notification whose contents should be shown in insecure contexts
-         * (i.e. atop the secure lockscreen). See {@link Notification#visibility} and
-         * {@link #VISIBILITY_PUBLIC}.
-         *
-         * @param n A replacement notification, presumably with some or all info redacted.
-         * @return The same Builder.
-         */
-        public Builder setPublicVersion(Notification n) {
-            mPublicVersion = n;
-            return this;
-        }
-
-        /**
-         * Supply custom RemoteViews to use instead of the platform template.
-         *
-         * This will override the layout that would otherwise be constructed by this Builder
-         * object.
-         */
-        public Builder setCustomContentView(RemoteViews contentView) {
-            mContentView = contentView;
-            return this;
-        }
-
-        /**
-         * Supply custom RemoteViews to use instead of the platform template in the expanded form.
-         *
-         * This will override the expanded layout that would otherwise be constructed by this
-         * Builder object.
-         *
-         * No-op on versions prior to {@link android.os.Build.VERSION_CODES#JELLY_BEAN}.
-         */
-        public Builder setCustomBigContentView(RemoteViews contentView) {
-            mBigContentView = contentView;
-            return this;
-        }
-
-        /**
-         * Supply custom RemoteViews to use instead of the platform template in the heads up dialog.
-         *
-         * This will override the heads-up layout that would otherwise be constructed by this
-         * Builder object.
-         *
-         * No-op on versions prior to {@link android.os.Build.VERSION_CODES#LOLLIPOP}.
-         */
-        public Builder setCustomHeadsUpContentView(RemoteViews contentView) {
-            mHeadsUpContentView = contentView;
-            return this;
-        }
-
-        /**
-         * Apply an extender to this notification builder. Extenders may be used to add
-         * metadata or change options on this builder.
-         */
-        public Builder extend(Extender extender) {
-            extender.extend(this);
-            return this;
-        }
-
-        /**
-         * @deprecated Use {@link #build()} instead.
-         */
-        @Deprecated
-        public Notification getNotification() {
-            return build();
-        }
-
-        /**
-         * Combine all of the options that have been set and return a new {@link Notification}
-         * object.
-         */
-        public Notification build() {
-            return IMPL.build(this, getExtender());
-        }
-
-        /**
-         * @hide
-         */
-        protected BuilderExtender getExtender() {
-            return new BuilderExtender();
-        }
-
-        protected static CharSequence limitCharSequenceLength(CharSequence cs) {
-            if (cs == null) return cs;
-            if (cs.length() > MAX_CHARSEQUENCE_LENGTH) {
-                cs = cs.subSequence(0, MAX_CHARSEQUENCE_LENGTH);
-            }
-            return cs;
-        }
-    }
-
-    /**
-     * An object that can apply a rich notification style to a {@link Notification.Builder}
-     * object.
-     * <br>
-     * If the platform does not provide rich notification styles, methods in this class have no
-     * effect.
-     */
-    public static abstract class Style {
-        Builder mBuilder;
-        CharSequence mBigContentTitle;
-        CharSequence mSummaryText;
-        boolean mSummaryTextSet = false;
-
-        public void setBuilder(Builder builder) {
-            if (mBuilder != builder) {
-                mBuilder = builder;
-                if (mBuilder != null) {
-                    mBuilder.setStyle(this);
-                }
-            }
-        }
-
-        public Notification build() {
-            Notification notification = null;
-            if (mBuilder != null) {
-                notification = mBuilder.build();
-            }
-            return notification;
-        }
-
-        /**
-         * @hide
-         */
-        // TODO: implement for all styles
-        public void addCompatExtras(Bundle extras) {
-        }
-
-        /**
-         * @hide
-         */
-        // TODO: implement for all styles
-        protected void restoreFromCompatExtras(Bundle extras) {
-        }
-    }
-
-    /**
-     * Helper class for generating large-format notifications that include a large image attachment.
-     * <br>
-     * If the platform does not provide large-format notifications, this method has no effect. The
-     * user will always see the normal notification view.
-     * <br>
-     * This class is a "rebuilder": It attaches to a Builder object and modifies its behavior, like so:
-     * <pre class="prettyprint">
-     * Notification notif = new Notification.Builder(mContext)
-     *     .setContentTitle(&quot;New photo from &quot; + sender.toString())
-     *     .setContentText(subject)
-     *     .setSmallIcon(R.drawable.new_post)
-     *     .setLargeIcon(aBitmap)
-     *     .setStyle(new Notification.BigPictureStyle()
-     *         .bigPicture(aBigBitmap))
-     *     .build();
-     * </pre>
-     *
-     * @see Notification#bigContentView
-     */
-    public static class BigPictureStyle extends Style {
-        Bitmap mPicture;
-        Bitmap mBigLargeIcon;
-        boolean mBigLargeIconSet;
-
-        public BigPictureStyle() {
-        }
-
-        public BigPictureStyle(Builder builder) {
-            setBuilder(builder);
-        }
-
-        /**
-         * Overrides ContentTitle in the big form of the template.
-         * This defaults to the value passed to setContentTitle().
-         */
-        public BigPictureStyle setBigContentTitle(CharSequence title) {
-            mBigContentTitle = Builder.limitCharSequenceLength(title);
-            return this;
-        }
-
-        /**
-         * Set the first line of text after the detail section in the big form of the template.
-         */
-        public BigPictureStyle setSummaryText(CharSequence cs) {
-            mSummaryText = Builder.limitCharSequenceLength(cs);
-            mSummaryTextSet = true;
-            return this;
-        }
-
-        /**
-         * Provide the bitmap to be used as the payload for the BigPicture notification.
-         */
-        public BigPictureStyle bigPicture(Bitmap b) {
-            mPicture = b;
-            return this;
-        }
-
-        /**
-         * Override the large icon when the big notification is shown.
-         */
-        public BigPictureStyle bigLargeIcon(Bitmap b) {
-            mBigLargeIcon = b;
-            mBigLargeIconSet = true;
-            return this;
-        }
-    }
-
-    /**
-     * Helper class for generating large-format notifications that include a lot of text.
-     *
-     * <br>
-     * If the platform does not provide large-format notifications, this method has no effect. The
-     * user will always see the normal notification view.
-     * <br>
-     * This class is a "rebuilder": It attaches to a Builder object and modifies its behavior, like so:
-     * <pre class="prettyprint">
-     * Notification notif = new Notification.Builder(mContext)
-     *     .setContentTitle(&quot;New mail from &quot; + sender.toString())
-     *     .setContentText(subject)
-     *     .setSmallIcon(R.drawable.new_mail)
-     *     .setLargeIcon(aBitmap)
-     *     .setStyle(new Notification.BigTextStyle()
-     *         .bigText(aVeryLongString))
-     *     .build();
-     * </pre>
-     *
-     * @see Notification#bigContentView
-     */
-    public static class BigTextStyle extends Style {
-        CharSequence mBigText;
-
-        public BigTextStyle() {
-        }
-
-        public BigTextStyle(Builder builder) {
-            setBuilder(builder);
-        }
-
-        /**
-         * Overrides ContentTitle in the big form of the template.
-         * This defaults to the value passed to setContentTitle().
-         */
-        public BigTextStyle setBigContentTitle(CharSequence title) {
-            mBigContentTitle = Builder.limitCharSequenceLength(title);
-            return this;
-        }
-
-        /**
-         * Set the first line of text after the detail section in the big form of the template.
-         */
-        public BigTextStyle setSummaryText(CharSequence cs) {
-            mSummaryText = Builder.limitCharSequenceLength(cs);
-            mSummaryTextSet = true;
-            return this;
-        }
-
-        /**
-         * Provide the longer text to be displayed in the big form of the
-         * template in place of the content text.
-         */
-        public BigTextStyle bigText(CharSequence cs) {
-            mBigText = Builder.limitCharSequenceLength(cs);
-            return this;
-        }
-    }
-
-    /**
-     * Helper class for generating large-format notifications that include multiple back-and-forth
-     * messages of varying types between any number of people.
-     *
-     * <br>
-     * If the platform does not provide large-format notifications, this method has no effect. The
-     * user will always see the normal notification view.
-     * <br>
-     * This class is a "rebuilder": It attaches to a Builder object and modifies its behavior, like
-     * so:
-     * <pre class="prettyprint">
-     *
-     * Notification noti = new Notification.Builder()
-     *     .setContentTitle(&quot;2 new messages wtih &quot; + sender.toString())
-     *     .setContentText(subject)
-     *     .setSmallIcon(R.drawable.new_message)
-     *     .setLargeIcon(aBitmap)
-     *     .setStyle(new Notification.MessagingStyle(resources.getString(R.string.reply_name))
-     *         .addMessage(messages[0].getText(), messages[0].getTime(), messages[0].getSender())
-     *         .addMessage(messages[1].getText(), messages[1].getTime(), messages[1].getSender()))
-     *     .build();
-     * </pre>
-     */
-    public static class MessagingStyle extends Style {
-
-        /**
-         * The maximum number of messages that will be retained in the Notification itself (the
-         * number displayed is up to the platform).
-         */
-        public static final int MAXIMUM_RETAINED_MESSAGES = 25;
-
-        CharSequence mUserDisplayName;
-        CharSequence mConversationTitle;
-        List<Message> mMessages = new ArrayList<>();
-
-        MessagingStyle() {
-        }
-
-        /**
-         * @param userDisplayName the name to be displayed for any replies sent by the user before the
-         * posting app reposts the notification with those messages after they've been actually
-         * sent and in previous messages sent by the user added in
-         * {@link #addMessage(Message)}
-         */
-        public MessagingStyle(CharSequence userDisplayName) {
-            mUserDisplayName = userDisplayName;
-        }
-
-        /**
-         * Returns the name to be displayed for any replies sent by the user
-         */
-        public CharSequence getUserDisplayName() {
-            return mUserDisplayName;
-        }
-
-        /**
-         * Sets the title to be displayed on this conversation. This should only be used for
-         * group messaging and left unset for one-on-one conversations.
-         * @param conversationTitle
-         * @return this object for method chaining.
-         */
-        public MessagingStyle setConversationTitle(CharSequence conversationTitle) {
-            mConversationTitle = conversationTitle;
-            return this;
-        }
-
-        /**
-         * Return the title to be displayed on this conversation. Can be <code>null</code> and
-         * should be for one-on-one conversations
-         */
-        public CharSequence getConversationTitle() {
-            return mConversationTitle;
-        }
-
-        /**
-         * Adds a message for display by this notification. Convenience call for a simple
-         * {@link Message} in {@link #addMessage(Message)}
-         * @param text A {@link CharSequence} to be displayed as the message content
-         * @param timestamp Time at which the message arrived
-         * @param sender A {@link CharSequence} to be used for displaying the name of the
-         * sender. Should be <code>null</code> for messages by the current user, in which case
-         * the platform will insert {@link #getUserDisplayName()}.
-         * Should be unique amongst all individuals in the conversation, and should be
-         * consistent during re-posts of the notification.
-         *
-         * @see Message#Message(CharSequence, long, CharSequence)
-         *
-         * @return this object for method chaining
-         */
-        public MessagingStyle addMessage(CharSequence text, long timestamp, CharSequence sender) {
-            mMessages.add(new Message(text, timestamp, sender));
-            if (mMessages.size() > MAXIMUM_RETAINED_MESSAGES) {
-                mMessages.remove(0);
-            }
-            return this;
-        }
-
-        /**
-         * Adds a {@link Message} for display in this notification.
-         * @param message The {@link Message} to be displayed
-         * @return this object for method chaining
-         */
-        public MessagingStyle addMessage(Message message) {
-            mMessages.add(message);
-            if (mMessages.size() > MAXIMUM_RETAINED_MESSAGES) {
-                mMessages.remove(0);
-            }
-            return this;
-        }
-
-        /**
-         * Gets the list of {@code Message} objects that represent the notification
-         */
-        public List<Message> getMessages() {
-            return mMessages;
-        }
-
-        /**
-         * Retrieves a {@link MessagingStyle} from a {@link Notification}, enabling an application
-         * that has set a {@link MessagingStyle} using {@link NotificationCompat} or
-         * {@link android.app.Notification.Builder} to send messaging information to another
-         * application using {@link NotificationCompat}, regardless of the API level of the system.
-         * Returns {@code null} if there is no {@link MessagingStyle} set.
-         */
-        public static MessagingStyle extractMessagingStyleFromNotification(Notification notif) {
-            MessagingStyle style;
-            Bundle extras = IMPL.getExtras(notif);
-            if (!extras.containsKey(EXTRA_SELF_DISPLAY_NAME)) {
-                style = null;
-            } else {
-                try {
-                    style = new MessagingStyle();
-                    style.restoreFromCompatExtras(extras);
-                } catch (ClassCastException e) {
-                    style = null;
-                }
-            }
-            return style;
-        }
-
-        @Override
-        public void addCompatExtras(Bundle extras) {
-            super.addCompatExtras(extras);
-            if (mUserDisplayName != null) {
-                extras.putCharSequence(EXTRA_SELF_DISPLAY_NAME, mUserDisplayName);
-            }
-            if (mConversationTitle != null) {
-                extras.putCharSequence(EXTRA_CONVERSATION_TITLE, mConversationTitle);
-            }
-            if (!mMessages.isEmpty()) { extras.putParcelableArray(EXTRA_MESSAGES,
-                    Message.getBundleArrayForMessages(mMessages));
-            }
-        }
-
-        /**
-         * @hide
-         */
-        @Override
-        protected void restoreFromCompatExtras(Bundle extras) {
-            mMessages.clear();
-            mUserDisplayName = extras.getString(EXTRA_SELF_DISPLAY_NAME);
-            mConversationTitle = extras.getString(EXTRA_CONVERSATION_TITLE);
-            Parcelable[] parcelables = extras.getParcelableArray(EXTRA_MESSAGES);
-            if (parcelables != null) {
-                mMessages = Message.getMessagesFromBundleArray(parcelables);
-            }
-        }
-
-        public static final class Message {
-
-            static final String KEY_TEXT = "text";
-            static final String KEY_TIMESTAMP = "time";
-            static final String KEY_SENDER = "sender";
-            static final String KEY_DATA_MIME_TYPE = "type";
-            static final String KEY_DATA_URI= "uri";
-
-            private final CharSequence mText;
-            private final long mTimestamp;
-            private final CharSequence mSender;
-
-            private String mDataMimeType;
-            private Uri mDataUri;
-
-            /**
-             * Constructor
-             * @param text A {@link CharSequence} to be displayed as the message content
-             * @param timestamp Time at which the message arrived
-             * @param sender A {@link CharSequence} to be used for displaying the name of the
-             * sender. Should be <code>null</code> for messages by the current user, in which case
-             * the platform will insert {@link MessagingStyle#getUserDisplayName()}.
-             * Should be unique amongst all individuals in the conversation, and should be
-             * consistent during re-posts of the notification.
-             */
-            public Message(CharSequence text, long timestamp, CharSequence sender){
-                mText = text;
-                mTimestamp = timestamp;
-                mSender = sender;
-            }
-
-            /**
-             * Sets a binary blob of data and an associated MIME type for a message. In the case
-             * where the platform doesn't support the MIME type, the original text provided in the
-             * constructor will be used.
-             * @param dataMimeType The MIME type of the content. See
-             * <a href="{@docRoot}notifications/messaging.html"> for the list of supported MIME
-             * types on Android and Android Wear.
-             * @param dataUri The uri containing the content whose type is given by the MIME type.
-             * <p class="note">
-             * <ol>
-             *   <li>Notification Listeners including the System UI need permission to access the
-             *       data the Uri points to. The recommended ways to do this are:</li>
-             *   <li>Store the data in your own ContentProvider, making sure that other apps have
-             *       the correct permission to access your provider. The preferred mechanism for
-             *       providing access is to use per-URI permissions which are temporary and only
-             *       grant access to the receiving application. An easy way to create a
-             *       ContentProvider like this is to use the FileProvider helper class.</li>
-             *   <li>Use the system MediaStore. The MediaStore is primarily aimed at video, audio
-             *       and image MIME types, however beginning with Android 3.0 (API level 11) it can
-             *       also store non-media types (see MediaStore.Files for more info). Files can be
-             *       inserted into the MediaStore using scanFile() after which a content:// style
-             *       Uri suitable for sharing is passed to the provided onScanCompleted() callback.
-             *       Note that once added to the system MediaStore the content is accessible to any
-             *       app on the device.</li>
-             * </ol>
-             * @return this object for method chaining
-             */
-            public Message setData(String dataMimeType, Uri dataUri) {
-                mDataMimeType = dataMimeType;
-                mDataUri = dataUri;
-                return this;
-            }
-
-            /**
-             * Get the text to be used for this message, or the fallback text if a type and content
-             * Uri have been set
-             */
-            public CharSequence getText() {
-                return mText;
-            }
-
-            /**
-             * Get the time at which this message arrived
-             */
-            public long getTimestamp() {
-                return mTimestamp;
-            }
-
-            /**
-             * Get the text used to display the contact's name in the messaging experience
-             */
-            public CharSequence getSender() {
-                return mSender;
-            }
-
-            /**
-             * Get the MIME type of the data pointed to by the Uri
-             */
-            public String getDataMimeType() {
-                return mDataMimeType;
-            }
-
-            /**
-             * Get the the Uri pointing to the content of the message. Can be null, in which case
-             * {@see #getText()} is used.
-             */
-            public Uri getDataUri() {
-                return mDataUri;
-            }
-
-            private Bundle toBundle() {
-                Bundle bundle = new Bundle();
-                if (mText != null) {
-                    bundle.putCharSequence(KEY_TEXT, mText);
-                }
-                bundle.putLong(KEY_TIMESTAMP, mTimestamp);
-                if (mSender != null) {
-                    bundle.putCharSequence(KEY_SENDER, mSender);
-                }
-                if (mDataMimeType != null) {
-                    bundle.putString(KEY_DATA_MIME_TYPE, mDataMimeType);
-                }
-                if (mDataUri != null) {
-                    bundle.putParcelable(KEY_DATA_URI, mDataUri);
-                }
-                return bundle;
-            }
-
-            static Bundle[] getBundleArrayForMessages(List<Message> messages) {
-                Bundle[] bundles = new Bundle[messages.size()];
-                final int N = messages.size();
-                for (int i = 0; i < N; i++) {
-                    bundles[i] = messages.get(i).toBundle();
-                }
-                return bundles;
-            }
-
-            static List<Message> getMessagesFromBundleArray(Parcelable[] bundles) {
-                List<Message> messages = new ArrayList<>(bundles.length);
-                for (int i = 0; i < bundles.length; i++) {
-                    if (bundles[i] instanceof Bundle) {
-                        Message message = getMessageFromBundle((Bundle)bundles[i]);
-                        if (message != null) {
-                            messages.add(message);
-                        }
-                    }
-                }
-                return messages;
-            }
-
-            static Message getMessageFromBundle(Bundle bundle) {
-                try {
-                    if (!bundle.containsKey(KEY_TEXT) || !bundle.containsKey(KEY_TIMESTAMP)) {
-                        return null;
-                    } else {
-                        Message message = new Message(bundle.getCharSequence(KEY_TEXT),
-                                bundle.getLong(KEY_TIMESTAMP), bundle.getCharSequence(KEY_SENDER));
-                        if (bundle.containsKey(KEY_DATA_MIME_TYPE) &&
-                                bundle.containsKey(KEY_DATA_URI)) {
-
-                            message.setData(bundle.getString(KEY_DATA_MIME_TYPE),
-                                    (Uri) bundle.getParcelable(KEY_DATA_URI));
-                        }
-                        return message;
-                    }
-                } catch (ClassCastException e) {
-                    return null;
-                }
-            }
-        }
-    }
-
-    /**
-     * Helper class for generating large-format notifications that include a list of (up to 5) strings.
-     *
-     * <br>
-     * If the platform does not provide large-format notifications, this method has no effect. The
-     * user will always see the normal notification view.
-     * <br>
-     * This class is a "rebuilder": It attaches to a Builder object and modifies its behavior, like so:
-     * <pre class="prettyprint">
-     * Notification noti = new Notification.Builder()
-     *     .setContentTitle(&quot;5 New mails from &quot; + sender.toString())
-     *     .setContentText(subject)
-     *     .setSmallIcon(R.drawable.new_mail)
-     *     .setLargeIcon(aBitmap)
-     *     .setStyle(new Notification.InboxStyle()
-     *         .addLine(str1)
-     *         .addLine(str2)
-     *         .setContentTitle(&quot;&quot;)
-     *         .setSummaryText(&quot;+3 more&quot;))
-     *     .build();
-     * </pre>
-     *
-     * @see Notification#bigContentView
-     */
-    public static class InboxStyle extends Style {
-        ArrayList<CharSequence> mTexts = new ArrayList<CharSequence>();
-
-        public InboxStyle() {
-        }
-
-        public InboxStyle(Builder builder) {
-            setBuilder(builder);
-        }
-
-        /**
-         * Overrides ContentTitle in the big form of the template.
-         * This defaults to the value passed to setContentTitle().
-         */
-        public InboxStyle setBigContentTitle(CharSequence title) {
-            mBigContentTitle = Builder.limitCharSequenceLength(title);
-            return this;
-        }
-
-        /**
-         * Set the first line of text after the detail section in the big form of the template.
-         */
-        public InboxStyle setSummaryText(CharSequence cs) {
-            mSummaryText = Builder.limitCharSequenceLength(cs);
-            mSummaryTextSet = true;
-            return this;
-        }
-
-        /**
-         * Append a line to the digest section of the Inbox notification.
-         */
-        public InboxStyle addLine(CharSequence cs) {
-            mTexts.add(Builder.limitCharSequenceLength(cs));
-            return this;
-        }
-    }
-
-    /**
-     * Structure to encapsulate a named action that can be shown as part of this notification.
-     * It must include an icon, a label, and a {@link PendingIntent} to be fired when the action is
-     * selected by the user. Action buttons won't appear on platforms prior to Android 4.1.
-     * <p>
-     * Apps should use {@link NotificationCompat.Builder#addAction(int, CharSequence, PendingIntent)}
-     * or {@link NotificationCompat.Builder#addAction(NotificationCompat.Action)}
-     * to attach actions.
-     */
-    public static class Action extends NotificationCompatBase.Action {
-        private final Bundle mExtras;
-        private final RemoteInput[] mRemoteInputs;
-        private boolean mAllowGeneratedReplies = false;
-
-        /**
-         * Small icon representing the action.
-         */
-        public int icon;
-        /**
-         * Title of the action.
-         */
-        public CharSequence title;
-        /**
-         * Intent to send when the user invokes this action. May be null, in which case the action
-         * may be rendered in a disabled presentation.
-         */
-        public PendingIntent actionIntent;
-
-        public Action(int icon, CharSequence title, PendingIntent intent) {
-            this(icon, title, intent, new Bundle(), null, false);
-        }
-
-        private Action(int icon, CharSequence title, PendingIntent intent, Bundle extras,
-                RemoteInput[] remoteInputs, boolean allowGeneratedReplies) {
-            this.icon = icon;
-            this.title = NotificationCompat.Builder.limitCharSequenceLength(title);
-            this.actionIntent = intent;
-            this.mExtras = extras != null ? extras : new Bundle();
-            this.mRemoteInputs = remoteInputs;
-            this.mAllowGeneratedReplies = allowGeneratedReplies;
-        }
-
-        @Override
-        public int getIcon() {
-            return icon;
-        }
-
-        @Override
-        public CharSequence getTitle() {
-            return title;
-        }
-
-        @Override
-        public PendingIntent getActionIntent() {
-            return actionIntent;
-        }
-
-        /**
-         * Get additional metadata carried around with this Action.
-         */
-        @Override
-        public Bundle getExtras() {
-            return mExtras;
-        }
-
-        /**
-         * Return whether the platform should automatically generate possible replies for this
-         * {@link Action}
-         */
-        @Override
-        public boolean getAllowGeneratedReplies() {
-            return mAllowGeneratedReplies;
-        }
-
-        /**
-         * Get the list of inputs to be collected from the user when this action is sent.
-         * May return null if no remote inputs were added.
-         */
-        @Override
-        public RemoteInput[] getRemoteInputs() {
-            return mRemoteInputs;
-        }
-
-        /**
-         * Builder class for {@link Action} objects.
-         */
-        public static final class Builder {
-            private final int mIcon;
-            private final CharSequence mTitle;
-            private final PendingIntent mIntent;
-            private boolean mAllowGeneratedReplies;
-            private final Bundle mExtras;
-            private ArrayList<RemoteInput> mRemoteInputs;
-
-            /**
-             * Construct a new builder for {@link Action} object.
-             * @param icon icon to show for this action
-             * @param title the title of the action
-             * @param intent the {@link PendingIntent} to fire when users trigger this action
-             */
-            public Builder(int icon, CharSequence title, PendingIntent intent) {
-                this(icon, title, intent, new Bundle());
-            }
-
-            /**
-             * Construct a new builder for {@link Action} object using the fields from an
-             * {@link Action}.
-             * @param action the action to read fields from.
-             */
-            public Builder(Action action) {
-                this(action.icon, action.title, action.actionIntent, new Bundle(action.mExtras));
-            }
-
-            private Builder(int icon, CharSequence title, PendingIntent intent, Bundle extras) {
-                mIcon = icon;
-                mTitle = NotificationCompat.Builder.limitCharSequenceLength(title);
-                mIntent = intent;
-                mExtras = extras;
-            }
-
-            /**
-             * Merge additional metadata into this builder.
-             *
-             * <p>Values within the Bundle will replace existing extras values in this Builder.
-             *
-             * @see NotificationCompat.Action#getExtras
-             */
-            public Builder addExtras(Bundle extras) {
-                if (extras != null) {
-                    mExtras.putAll(extras);
-                }
-                return this;
-            }
-
-            /**
-             * Get the metadata Bundle used by this Builder.
-             *
-             * <p>The returned Bundle is shared with this Builder.
-             */
-            public Bundle getExtras() {
-                return mExtras;
-            }
-
-            /**
-             * Add an input to be collected from the user when this action is sent.
-             * Response values can be retrieved from the fired intent by using the
-             * {@link RemoteInput#getResultsFromIntent} function.
-             * @param remoteInput a {@link RemoteInput} to add to the action
-             * @return this object for method chaining
-             */
-            public Builder addRemoteInput(RemoteInput remoteInput) {
-                if (mRemoteInputs == null) {
-                    mRemoteInputs = new ArrayList<RemoteInput>();
-                }
-                mRemoteInputs.add(remoteInput);
-                return this;
-            }
-
-            /**
-             * Set whether the platform should automatically generate possible replies to add to
-             * {@link RemoteInput#getChoices()}. If the {@link Action} doesn't have a
-             * {@link RemoteInput}, this has no effect.
-             * @param allowGeneratedReplies {@code true} to allow generated replies, {@code false}
-             * otherwise
-             * @return this object for method chaining
-             * The default value is {@code false}
-             */
-            public Builder setAllowGeneratedReplies(boolean allowGeneratedReplies) {
-                mAllowGeneratedReplies = allowGeneratedReplies;
-                return this;
-            }
-
-            /**
-             * Apply an extender to this action builder. Extenders may be used to add
-             * metadata or change options on this builder.
-             */
-            public Builder extend(Extender extender) {
-                extender.extend(this);
-                return this;
-            }
-
-            /**
-             * Combine all of the options that have been set and return a new {@link Action}
-             * object.
-             * @return the built action
-             */
-            public Action build() {
-                RemoteInput[] remoteInputs = mRemoteInputs != null
-                        ? mRemoteInputs.toArray(new RemoteInput[mRemoteInputs.size()]) : null;
-                return new Action(mIcon, mTitle, mIntent, mExtras, remoteInputs,
-                        mAllowGeneratedReplies);
-            }
-        }
-
-
-        /**
-         * Extender interface for use with {@link Builder#extend}. Extenders may be used to add
-         * metadata or change options on an action builder.
-         */
-        public interface Extender {
-            /**
-             * Apply this extender to a notification action builder.
-             * @param builder the builder to be modified.
-             * @return the build object for chaining.
-             */
-            public Builder extend(Builder builder);
-        }
-
-        /**
-         * Wearable extender for notification actions. To add extensions to an action,
-         * create a new {@link NotificationCompat.Action.WearableExtender} object using
-         * the {@code WearableExtender()} constructor and apply it to a
-         * {@link NotificationCompat.Action.Builder} using
-         * {@link NotificationCompat.Action.Builder#extend}.
-         *
-         * <pre class="prettyprint">
-         * NotificationCompat.Action action = new NotificationCompat.Action.Builder(
-         *         R.drawable.archive_all, "Archive all", actionIntent)
-         *         .extend(new NotificationCompat.Action.WearableExtender()
-         *                 .setAvailableOffline(false))
-         *         .build();</pre>
-         */
-        public static final class WearableExtender implements Extender {
-            /** Notification action extra which contains wearable extensions */
-            private static final String EXTRA_WEARABLE_EXTENSIONS = "android.wearable.EXTENSIONS";
-
-            // Keys within EXTRA_WEARABLE_EXTENSIONS for wearable options.
-            private static final String KEY_FLAGS = "flags";
-            private static final String KEY_IN_PROGRESS_LABEL = "inProgressLabel";
-            private static final String KEY_CONFIRM_LABEL = "confirmLabel";
-            private static final String KEY_CANCEL_LABEL = "cancelLabel";
-
-            // Flags bitwise-ored to mFlags
-            private static final int FLAG_AVAILABLE_OFFLINE = 0x1;
-            private static final int FLAG_HINT_LAUNCHES_ACTIVITY = 1 << 1;
-
-            // Default value for flags integer
-            private static final int DEFAULT_FLAGS = FLAG_AVAILABLE_OFFLINE;
-
-            private int mFlags = DEFAULT_FLAGS;
-
-            private CharSequence mInProgressLabel;
-            private CharSequence mConfirmLabel;
-            private CharSequence mCancelLabel;
-
-            /**
-             * Create a {@link NotificationCompat.Action.WearableExtender} with default
-             * options.
-             */
-            public WearableExtender() {
-            }
-
-            /**
-             * Create a {@link NotificationCompat.Action.WearableExtender} by reading
-             * wearable options present in an existing notification action.
-             * @param action the notification action to inspect.
-             */
-            public WearableExtender(Action action) {
-                Bundle wearableBundle = action.getExtras().getBundle(EXTRA_WEARABLE_EXTENSIONS);
-                if (wearableBundle != null) {
-                    mFlags = wearableBundle.getInt(KEY_FLAGS, DEFAULT_FLAGS);
-                    mInProgressLabel = wearableBundle.getCharSequence(KEY_IN_PROGRESS_LABEL);
-                    mConfirmLabel = wearableBundle.getCharSequence(KEY_CONFIRM_LABEL);
-                    mCancelLabel = wearableBundle.getCharSequence(KEY_CANCEL_LABEL);
-                }
-            }
-
-            /**
-             * Apply wearable extensions to a notification action that is being built. This is
-             * typically called by the {@link NotificationCompat.Action.Builder#extend}
-             * method of {@link NotificationCompat.Action.Builder}.
-             */
-            @Override
-            public Action.Builder extend(Action.Builder builder) {
-                Bundle wearableBundle = new Bundle();
-
-                if (mFlags != DEFAULT_FLAGS) {
-                    wearableBundle.putInt(KEY_FLAGS, mFlags);
-                }
-                if (mInProgressLabel != null) {
-                    wearableBundle.putCharSequence(KEY_IN_PROGRESS_LABEL, mInProgressLabel);
-                }
-                if (mConfirmLabel != null) {
-                    wearableBundle.putCharSequence(KEY_CONFIRM_LABEL, mConfirmLabel);
-                }
-                if (mCancelLabel != null) {
-                    wearableBundle.putCharSequence(KEY_CANCEL_LABEL, mCancelLabel);
-                }
-
-                builder.getExtras().putBundle(EXTRA_WEARABLE_EXTENSIONS, wearableBundle);
-                return builder;
-            }
-
-            @Override
-            public WearableExtender clone() {
-                WearableExtender that = new WearableExtender();
-                that.mFlags = this.mFlags;
-                that.mInProgressLabel = this.mInProgressLabel;
-                that.mConfirmLabel = this.mConfirmLabel;
-                that.mCancelLabel = this.mCancelLabel;
-                return that;
-            }
-
-            /**
-             * Set whether this action is available when the wearable device is not connected to
-             * a companion device. The user can still trigger this action when the wearable device
-             * is offline, but a visual hint will indicate that the action may not be available.
-             * Defaults to true.
-             */
-            public WearableExtender setAvailableOffline(boolean availableOffline) {
-                setFlag(FLAG_AVAILABLE_OFFLINE, availableOffline);
-                return this;
-            }
-
-            /**
-             * Get whether this action is available when the wearable device is not connected to
-             * a companion device. The user can still trigger this action when the wearable device
-             * is offline, but a visual hint will indicate that the action may not be available.
-             * Defaults to true.
-             */
-            public boolean isAvailableOffline() {
-                return (mFlags & FLAG_AVAILABLE_OFFLINE) != 0;
-            }
-
-            private void setFlag(int mask, boolean value) {
-                if (value) {
-                    mFlags |= mask;
-                } else {
-                    mFlags &= ~mask;
-                }
-            }
-
-            /**
-             * Set a label to display while the wearable is preparing to automatically execute the
-             * action. This is usually a 'ing' verb ending in ellipsis like "Sending..."
-             *
-             * @param label the label to display while the action is being prepared to execute
-             * @return this object for method chaining
-             */
-            public WearableExtender setInProgressLabel(CharSequence label) {
-                mInProgressLabel = label;
-                return this;
-            }
-
-            /**
-             * Get the label to display while the wearable is preparing to automatically execute
-             * the action. This is usually a 'ing' verb ending in ellipsis like "Sending..."
-             *
-             * @return the label to display while the action is being prepared to execute
-             */
-            public CharSequence getInProgressLabel() {
-                return mInProgressLabel;
-            }
-
-            /**
-             * Set a label to display to confirm that the action should be executed.
-             * This is usually an imperative verb like "Send".
-             *
-             * @param label the label to confirm the action should be executed
-             * @return this object for method chaining
-             */
-            public WearableExtender setConfirmLabel(CharSequence label) {
-                mConfirmLabel = label;
-                return this;
-            }
-
-            /**
-             * Get the label to display to confirm that the action should be executed.
-             * This is usually an imperative verb like "Send".
-             *
-             * @return the label to confirm the action should be executed
-             */
-            public CharSequence getConfirmLabel() {
-                return mConfirmLabel;
-            }
-
-            /**
-             * Set a label to display to cancel the action.
-             * This is usually an imperative verb, like "Cancel".
-             *
-             * @param label the label to display to cancel the action
-             * @return this object for method chaining
-             */
-            public WearableExtender setCancelLabel(CharSequence label) {
-                mCancelLabel = label;
-                return this;
-            }
-
-            /**
-             * Get the label to display to cancel the action.
-             * This is usually an imperative verb like "Cancel".
-             *
-             * @return the label to display to cancel the action
-             */
-            public CharSequence getCancelLabel() {
-                return mCancelLabel;
-            }
-
-            /**
-             * Set a hint that this Action will launch an {@link Activity} directly, telling the
-             * platform that it can generate the appropriate transitions.
-             * @param hintLaunchesActivity {@code true} if the content intent will launch
-             * an activity and transitions should be generated, false otherwise.
-             * @return this object for method chaining
-             */
-            public WearableExtender setHintLaunchesActivity(
-                    boolean hintLaunchesActivity) {
-                setFlag(FLAG_HINT_LAUNCHES_ACTIVITY, hintLaunchesActivity);
-                return this;
-            }
-
-            /**
-             * Get a hint that this Action will launch an {@link Activity} directly, telling the
-             * platform that it can generate the appropriate transitions
-             * @return {@code true} if the content intent will launch an activity and transitions
-             * should be generated, false otherwise. The default value is {@code false} if this was
-             * never set.
-             */
-            public boolean getHintLaunchesActivity() {
-                return (mFlags & FLAG_HINT_LAUNCHES_ACTIVITY) != 0;
-            }
-        }
-
-        /** @hide */
-        public static final Factory FACTORY = new Factory() {
-            @Override
-            public NotificationCompatBase.Action build(int icon, CharSequence title,
-                    PendingIntent actionIntent, Bundle extras,
-                    RemoteInputCompatBase.RemoteInput[] remoteInputs,
-                    boolean allowGeneratedReplies) {
-                return new Action(icon, title, actionIntent, extras,
-                        (RemoteInput[]) remoteInputs, allowGeneratedReplies);
-            }
-
-            @Override
-            public Action[] newArray(int length) {
-                return new Action[length];
-            }
-        };
-    }
-
-
-    /**
-     * Extender interface for use with {@link Builder#extend}. Extenders may be used to add
-     * metadata or change options on a notification builder.
-     */
-    public interface Extender {
-        /**
-         * Apply this extender to a notification builder.
-         * @param builder the builder to be modified.
-         * @return the build object for chaining.
-         */
-        public Builder extend(Builder builder);
-    }
-
-    /**
-     * Helper class to add wearable extensions to notifications.
-     * <p class="note"> See
-     * <a href="{@docRoot}wear/notifications/creating.html">Creating Notifications
-     * for Android Wear</a> for more information on how to use this class.
-     * <p>
-     * To create a notification with wearable extensions:
-     * <ol>
-     *   <li>Create a {@link NotificationCompat.Builder}, setting any desired
-     *   properties.
-     *   <li>Create a {@link NotificationCompat.WearableExtender}.
-     *   <li>Set wearable-specific properties using the
-     *   {@code add} and {@code set} methods of {@link NotificationCompat.WearableExtender}.
-     *   <li>Call {@link NotificationCompat.Builder#extend} to apply the extensions to a
-     *   notification.
-     *   <li>Post the notification to the notification
-     *   system with the {@code NotificationManagerCompat.notify(...)} methods
-     *   and not the {@code NotificationManager.notify(...)} methods.
-     * </ol>
-     *
-     * <pre class="prettyprint">
-     * Notification notif = new NotificationCompat.Builder(mContext)
-     *         .setContentTitle(&quot;New mail from &quot; + sender.toString())
-     *         .setContentText(subject)
-     *         .setSmallIcon(R.drawable.new_mail)
-     *         .extend(new NotificationCompat.WearableExtender()
-     *                 .setContentIcon(R.drawable.new_mail))
-     *         .build();
-     * NotificationManagerCompat.from(mContext).notify(0, notif);</pre>
-     *
-     * <p>Wearable extensions can be accessed on an existing notification by using the
-     * {@code WearableExtender(Notification)} constructor,
-     * and then using the {@code get} methods to access values.
-     *
-     * <pre class="prettyprint">
-     * NotificationCompat.WearableExtender wearableExtender =
-     *         new NotificationCompat.WearableExtender(notification);
-     * List&lt;Notification&gt; pages = wearableExtender.getPages();</pre>
-     */
-    public static final class WearableExtender implements Extender {
-        /**
-         * Sentinel value for an action index that is unset.
-         */
-        public static final int UNSET_ACTION_INDEX = -1;
-
-        /**
-         * Size value for use with {@link #setCustomSizePreset} to show this notification with
-         * default sizing.
-         * <p>For custom display notifications created using {@link #setDisplayIntent},
-         * the default is {@link #SIZE_MEDIUM}. All other notifications size automatically based
-         * on their content.
-         */
-        public static final int SIZE_DEFAULT = 0;
-
-        /**
-         * Size value for use with {@link #setCustomSizePreset} to show this notification
-         * with an extra small size.
-         * <p>This value is only applicable for custom display notifications created using
-         * {@link #setDisplayIntent}.
-         */
-        public static final int SIZE_XSMALL = 1;
-
-        /**
-         * Size value for use with {@link #setCustomSizePreset} to show this notification
-         * with a small size.
-         * <p>This value is only applicable for custom display notifications created using
-         * {@link #setDisplayIntent}.
-         */
-        public static final int SIZE_SMALL = 2;
-
-        /**
-         * Size value for use with {@link #setCustomSizePreset} to show this notification
-         * with a medium size.
-         * <p>This value is only applicable for custom display notifications created using
-         * {@link #setDisplayIntent}.
-         */
-        public static final int SIZE_MEDIUM = 3;
-
-        /**
-         * Size value for use with {@link #setCustomSizePreset} to show this notification
-         * with a large size.
-         * <p>This value is only applicable for custom display notifications created using
-         * {@link #setDisplayIntent}.
-         */
-        public static final int SIZE_LARGE = 4;
-
-        /**
-         * Size value for use with {@link #setCustomSizePreset} to show this notification
-         * full screen.
-         * <p>This value is only applicable for custom display notifications created using
-         * {@link #setDisplayIntent}.
-         */
-        public static final int SIZE_FULL_SCREEN = 5;
-
-        /**
-         * Sentinel value for use with {@link #setHintScreenTimeout} to keep the screen on for a
-         * short amount of time when this notification is displayed on the screen. This
-         * is the default value.
-         */
-        public static final int SCREEN_TIMEOUT_SHORT = 0;
-
-        /**
-         * Sentinel value for use with {@link #setHintScreenTimeout} to keep the screen on
-         * for a longer amount of time when this notification is displayed on the screen.
-         */
-        public static final int SCREEN_TIMEOUT_LONG = -1;
-
-        /** Notification extra which contains wearable extensions */
-        private static final String EXTRA_WEARABLE_EXTENSIONS = "android.wearable.EXTENSIONS";
-
-        // Keys within EXTRA_WEARABLE_EXTENSIONS for wearable options.
-        private static final String KEY_ACTIONS = "actions";
-        private static final String KEY_FLAGS = "flags";
-        private static final String KEY_DISPLAY_INTENT = "displayIntent";
-        private static final String KEY_PAGES = "pages";
-        private static final String KEY_BACKGROUND = "background";
-        private static final String KEY_CONTENT_ICON = "contentIcon";
-        private static final String KEY_CONTENT_ICON_GRAVITY = "contentIconGravity";
-        private static final String KEY_CONTENT_ACTION_INDEX = "contentActionIndex";
-        private static final String KEY_CUSTOM_SIZE_PRESET = "customSizePreset";
-        private static final String KEY_CUSTOM_CONTENT_HEIGHT = "customContentHeight";
-        private static final String KEY_GRAVITY = "gravity";
-        private static final String KEY_HINT_SCREEN_TIMEOUT = "hintScreenTimeout";
-        private static final String KEY_DISMISSAL_ID = "dismissalId";
-
-        // Flags bitwise-ored to mFlags
-        private static final int FLAG_CONTENT_INTENT_AVAILABLE_OFFLINE = 0x1;
-        private static final int FLAG_HINT_HIDE_ICON = 1 << 1;
-        private static final int FLAG_HINT_SHOW_BACKGROUND_ONLY = 1 << 2;
-        private static final int FLAG_START_SCROLL_BOTTOM = 1 << 3;
-        private static final int FLAG_HINT_AVOID_BACKGROUND_CLIPPING = 1 << 4;
-        private static final int FLAG_BIG_PICTURE_AMBIENT = 1 << 5;
-        private static final int FLAG_HINT_CONTENT_INTENT_LAUNCHES_ACTIVITY = 1 << 6;
-
-        // Default value for flags integer
-        private static final int DEFAULT_FLAGS = FLAG_CONTENT_INTENT_AVAILABLE_OFFLINE;
-
-        private static final int DEFAULT_CONTENT_ICON_GRAVITY = GravityCompat.END;
-        private static final int DEFAULT_GRAVITY = Gravity.BOTTOM;
-
-        private ArrayList<Action> mActions = new ArrayList<Action>();
-        private int mFlags = DEFAULT_FLAGS;
-        private PendingIntent mDisplayIntent;
-        private ArrayList<Notification> mPages = new ArrayList<Notification>();
-        private Bitmap mBackground;
-        private int mContentIcon;
-        private int mContentIconGravity = DEFAULT_CONTENT_ICON_GRAVITY;
-        private int mContentActionIndex = UNSET_ACTION_INDEX;
-        private int mCustomSizePreset = SIZE_DEFAULT;
-        private int mCustomContentHeight;
-        private int mGravity = DEFAULT_GRAVITY;
-        private int mHintScreenTimeout;
-        private String mDismissalId;
-
-        /**
-         * Create a {@link NotificationCompat.WearableExtender} with default
-         * options.
-         */
-        public WearableExtender() {
-        }
-
-        public WearableExtender(Notification notif) {
-            Bundle extras = getExtras(notif);
-            Bundle wearableBundle = extras != null ? extras.getBundle(EXTRA_WEARABLE_EXTENSIONS)
-                    : null;
-            if (wearableBundle != null) {
-                Action[] actions = IMPL.getActionsFromParcelableArrayList(
-                        wearableBundle.getParcelableArrayList(KEY_ACTIONS));
-                if (actions != null) {
-                    Collections.addAll(mActions, actions);
-                }
-
-                mFlags = wearableBundle.getInt(KEY_FLAGS, DEFAULT_FLAGS);
-                mDisplayIntent = wearableBundle.getParcelable(KEY_DISPLAY_INTENT);
-
-                Notification[] pages = getNotificationArrayFromBundle(
-                        wearableBundle, KEY_PAGES);
-                if (pages != null) {
-                    Collections.addAll(mPages, pages);
-                }
-
-                mBackground = wearableBundle.getParcelable(KEY_BACKGROUND);
-                mContentIcon = wearableBundle.getInt(KEY_CONTENT_ICON);
-                mContentIconGravity = wearableBundle.getInt(KEY_CONTENT_ICON_GRAVITY,
-                        DEFAULT_CONTENT_ICON_GRAVITY);
-                mContentActionIndex = wearableBundle.getInt(KEY_CONTENT_ACTION_INDEX,
-                        UNSET_ACTION_INDEX);
-                mCustomSizePreset = wearableBundle.getInt(KEY_CUSTOM_SIZE_PRESET,
-                        SIZE_DEFAULT);
-                mCustomContentHeight = wearableBundle.getInt(KEY_CUSTOM_CONTENT_HEIGHT);
-                mGravity = wearableBundle.getInt(KEY_GRAVITY, DEFAULT_GRAVITY);
-                mHintScreenTimeout = wearableBundle.getInt(KEY_HINT_SCREEN_TIMEOUT);
-                mDismissalId = wearableBundle.getString(KEY_DISMISSAL_ID);
-            }
-        }
-
-        /**
-         * Apply wearable extensions to a notification that is being built. This is typically
-         * called by the {@link NotificationCompat.Builder#extend} method of
-         * {@link NotificationCompat.Builder}.
-         */
-        @Override
-        public NotificationCompat.Builder extend(NotificationCompat.Builder builder) {
-            Bundle wearableBundle = new Bundle();
-
-            if (!mActions.isEmpty()) {
-                wearableBundle.putParcelableArrayList(KEY_ACTIONS,
-                        IMPL.getParcelableArrayListForActions(mActions.toArray(
-                                new Action[mActions.size()])));
-            }
-            if (mFlags != DEFAULT_FLAGS) {
-                wearableBundle.putInt(KEY_FLAGS, mFlags);
-            }
-            if (mDisplayIntent != null) {
-                wearableBundle.putParcelable(KEY_DISPLAY_INTENT, mDisplayIntent);
-            }
-            if (!mPages.isEmpty()) {
-                wearableBundle.putParcelableArray(KEY_PAGES, mPages.toArray(
-                        new Notification[mPages.size()]));
-            }
-            if (mBackground != null) {
-                wearableBundle.putParcelable(KEY_BACKGROUND, mBackground);
-            }
-            if (mContentIcon != 0) {
-                wearableBundle.putInt(KEY_CONTENT_ICON, mContentIcon);
-            }
-            if (mContentIconGravity != DEFAULT_CONTENT_ICON_GRAVITY) {
-                wearableBundle.putInt(KEY_CONTENT_ICON_GRAVITY, mContentIconGravity);
-            }
-            if (mContentActionIndex != UNSET_ACTION_INDEX) {
-                wearableBundle.putInt(KEY_CONTENT_ACTION_INDEX,
-                        mContentActionIndex);
-            }
-            if (mCustomSizePreset != SIZE_DEFAULT) {
-                wearableBundle.putInt(KEY_CUSTOM_SIZE_PRESET, mCustomSizePreset);
-            }
-            if (mCustomContentHeight != 0) {
-                wearableBundle.putInt(KEY_CUSTOM_CONTENT_HEIGHT, mCustomContentHeight);
-            }
-            if (mGravity != DEFAULT_GRAVITY) {
-                wearableBundle.putInt(KEY_GRAVITY, mGravity);
-            }
-            if (mHintScreenTimeout != 0) {
-                wearableBundle.putInt(KEY_HINT_SCREEN_TIMEOUT, mHintScreenTimeout);
-            }
-            if (mDismissalId != null) {
-                wearableBundle.putString(KEY_DISMISSAL_ID, mDismissalId);
-            }
-
-            builder.getExtras().putBundle(EXTRA_WEARABLE_EXTENSIONS, wearableBundle);
-            return builder;
-        }
-
-        @Override
-        public WearableExtender clone() {
-            WearableExtender that = new WearableExtender();
-            that.mActions = new ArrayList<Action>(this.mActions);
-            that.mFlags = this.mFlags;
-            that.mDisplayIntent = this.mDisplayIntent;
-            that.mPages = new ArrayList<Notification>(this.mPages);
-            that.mBackground = this.mBackground;
-            that.mContentIcon = this.mContentIcon;
-            that.mContentIconGravity = this.mContentIconGravity;
-            that.mContentActionIndex = this.mContentActionIndex;
-            that.mCustomSizePreset = this.mCustomSizePreset;
-            that.mCustomContentHeight = this.mCustomContentHeight;
-            that.mGravity = this.mGravity;
-            that.mHintScreenTimeout = this.mHintScreenTimeout;
-            that.mDismissalId = this.mDismissalId;
-            return that;
-        }
-
-        /**
-         * Add a wearable action to this notification.
-         *
-         * <p>When wearable actions are added using this method, the set of actions that
-         * show on a wearable device splits from devices that only show actions added
-         * using {@link NotificationCompat.Builder#addAction}. This allows for customization
-         * of which actions display on different devices.
-         *
-         * @param action the action to add to this notification
-         * @return this object for method chaining
-         * @see NotificationCompat.Action
-         */
-        public WearableExtender addAction(Action action) {
-            mActions.add(action);
-            return this;
-        }
-
-        /**
-         * Adds wearable actions to this notification.
-         *
-         * <p>When wearable actions are added using this method, the set of actions that
-         * show on a wearable device splits from devices that only show actions added
-         * using {@link NotificationCompat.Builder#addAction}. This allows for customization
-         * of which actions display on different devices.
-         *
-         * @param actions the actions to add to this notification
-         * @return this object for method chaining
-         * @see NotificationCompat.Action
-         */
-        public WearableExtender addActions(List<Action> actions) {
-            mActions.addAll(actions);
-            return this;
-        }
-
-        /**
-         * Clear all wearable actions present on this builder.
-         * @return this object for method chaining.
-         * @see #addAction
-         */
-        public WearableExtender clearActions() {
-            mActions.clear();
-            return this;
-        }
-
-        /**
-         * Get the wearable actions present on this notification.
-         */
-        public List<Action> getActions() {
-            return mActions;
-        }
-
-        /**
-         * Set an intent to launch inside of an activity view when displaying
-         * this notification. The {@link PendingIntent} provided should be for an activity.
-         *
-         * <pre class="prettyprint">
-         * Intent displayIntent = new Intent(context, MyDisplayActivity.class);
-         * PendingIntent displayPendingIntent = PendingIntent.getActivity(context,
-         *         0, displayIntent, PendingIntent.FLAG_UPDATE_CURRENT);
-         * Notification notif = new NotificationCompat.Builder(context)
-         *         .extend(new NotificationCompat.WearableExtender()
-         *                 .setDisplayIntent(displayPendingIntent)
-         *                 .setCustomSizePreset(NotificationCompat.WearableExtender.SIZE_MEDIUM))
-         *         .build();</pre>
-         *
-         * <p>The activity to launch needs to allow embedding, must be exported, and
-         * should have an empty task affinity. It is also recommended to use the device
-         * default light theme.
-         *
-         * <p>Example AndroidManifest.xml entry:
-         * <pre class="prettyprint">
-         * &lt;activity android:name=&quot;com.example.MyDisplayActivity&quot;
-         *     android:exported=&quot;true&quot;
-         *     android:allowEmbedded=&quot;true&quot;
-         *     android:taskAffinity=&quot;&quot;
-         *     android:theme=&quot;@android:style/Theme.DeviceDefault.Light&quot; /&gt;</pre>
-         *
-         * @param intent the {@link PendingIntent} for an activity
-         * @return this object for method chaining
-         * @see NotificationCompat.WearableExtender#getDisplayIntent
-         */
-        public WearableExtender setDisplayIntent(PendingIntent intent) {
-            mDisplayIntent = intent;
-            return this;
-        }
-
-        /**
-         * Get the intent to launch inside of an activity view when displaying this
-         * notification. This {@code PendingIntent} should be for an activity.
-         */
-        public PendingIntent getDisplayIntent() {
-            return mDisplayIntent;
-        }
-
-        /**
-         * Add an additional page of content to display with this notification. The current
-         * notification forms the first page, and pages added using this function form
-         * subsequent pages. This field can be used to separate a notification into multiple
-         * sections.
-         *
-         * @param page the notification to add as another page
-         * @return this object for method chaining
-         * @see NotificationCompat.WearableExtender#getPages
-         */
-        public WearableExtender addPage(Notification page) {
-            mPages.add(page);
-            return this;
-        }
-
-        /**
-         * Add additional pages of content to display with this notification. The current
-         * notification forms the first page, and pages added using this function form
-         * subsequent pages. This field can be used to separate a notification into multiple
-         * sections.
-         *
-         * @param pages a list of notifications
-         * @return this object for method chaining
-         * @see NotificationCompat.WearableExtender#getPages
-         */
-        public WearableExtender addPages(List<Notification> pages) {
-            mPages.addAll(pages);
-            return this;
-        }
-
-        /**
-         * Clear all additional pages present on this builder.
-         * @return this object for method chaining.
-         * @see #addPage
-         */
-        public WearableExtender clearPages() {
-            mPages.clear();
-            return this;
-        }
-
-        /**
-         * Get the array of additional pages of content for displaying this notification. The
-         * current notification forms the first page, and elements within this array form
-         * subsequent pages. This field can be used to separate a notification into multiple
-         * sections.
-         * @return the pages for this notification
-         */
-        public List<Notification> getPages() {
-            return mPages;
-        }
-
-        /**
-         * Set a background image to be displayed behind the notification content.
-         * Contrary to the {@link NotificationCompat.BigPictureStyle}, this background
-         * will work with any notification style.
-         *
-         * @param background the background bitmap
-         * @return this object for method chaining
-         * @see NotificationCompat.WearableExtender#getBackground
-         */
-        public WearableExtender setBackground(Bitmap background) {
-            mBackground = background;
-            return this;
-        }
-
-        /**
-         * Get a background image to be displayed behind the notification content.
-         * Contrary to the {@link NotificationCompat.BigPictureStyle}, this background
-         * will work with any notification style.
-         *
-         * @return the background image
-         * @see NotificationCompat.WearableExtender#setBackground
-         */
-        public Bitmap getBackground() {
-            return mBackground;
-        }
-
-        /**
-         * Set an icon that goes with the content of this notification.
-         */
-        public WearableExtender setContentIcon(int icon) {
-            mContentIcon = icon;
-            return this;
-        }
-
-        /**
-         * Get an icon that goes with the content of this notification.
-         */
-        public int getContentIcon() {
-            return mContentIcon;
-        }
-
-        /**
-         * Set the gravity that the content icon should have within the notification display.
-         * Supported values include {@link android.view.Gravity#START} and
-         * {@link android.view.Gravity#END}. The default value is {@link android.view.Gravity#END}.
-         * @see #setContentIcon
-         */
-        public WearableExtender setContentIconGravity(int contentIconGravity) {
-            mContentIconGravity = contentIconGravity;
-            return this;
-        }
-
-        /**
-         * Get the gravity that the content icon should have within the notification display.
-         * Supported values include {@link android.view.Gravity#START} and
-         * {@link android.view.Gravity#END}. The default value is {@link android.view.Gravity#END}.
-         * @see #getContentIcon
-         */
-        public int getContentIconGravity() {
-            return mContentIconGravity;
-        }
-
-        /**
-         * Set an action from this notification's actions to be clickable with the content of
-         * this notification. This action will no longer display separately from the
-         * notification's content.
-         *
-         * <p>For notifications with multiple pages, child pages can also have content actions
-         * set, although the list of available actions comes from the main notification and not
-         * from the child page's notification.
-         *
-         * @param actionIndex The index of the action to hoist onto the current notification page.
-         *                    If wearable actions were added to the main notification, this index
-         *                    will apply to that list, otherwise it will apply to the regular
-         *                    actions list.
-         */
-        public WearableExtender setContentAction(int actionIndex) {
-            mContentActionIndex = actionIndex;
-            return this;
-        }
-
-        /**
-         * Get the index of the notification action, if any, that was specified as being clickable
-         * with the content of this notification. This action will no longer display separately
-         * from the notification's content.
-         *
-         * <p>For notifications with multiple pages, child pages can also have content actions
-         * set, although the list of available actions comes from the main notification and not
-         * from the child page's notification.
-         *
-         * <p>If wearable specific actions were added to the main notification, this index will
-         * apply to that list, otherwise it will apply to the regular actions list.
-         *
-         * @return the action index or {@link #UNSET_ACTION_INDEX} if no action was selected.
-         */
-        public int getContentAction() {
-            return mContentActionIndex;
-        }
-
-        /**
-         * Set the gravity that this notification should have within the available viewport space.
-         * Supported values include {@link android.view.Gravity#TOP},
-         * {@link android.view.Gravity#CENTER_VERTICAL} and {@link android.view.Gravity#BOTTOM}.
-         * The default value is {@link android.view.Gravity#BOTTOM}.
-         */
-        public WearableExtender setGravity(int gravity) {
-            mGravity = gravity;
-            return this;
-        }
-
-        /**
-         * Get the gravity that this notification should have within the available viewport space.
-         * Supported values include {@link android.view.Gravity#TOP},
-         * {@link android.view.Gravity#CENTER_VERTICAL} and {@link android.view.Gravity#BOTTOM}.
-         * The default value is {@link android.view.Gravity#BOTTOM}.
-         */
-        public int getGravity() {
-            return mGravity;
-        }
-
-        /**
-         * Set the custom size preset for the display of this notification out of the available
-         * presets found in {@link NotificationCompat.WearableExtender}, e.g.
-         * {@link #SIZE_LARGE}.
-         * <p>Some custom size presets are only applicable for custom display notifications created
-         * using {@link NotificationCompat.WearableExtender#setDisplayIntent}. Check the
-         * documentation for the preset in question. See also
-         * {@link #setCustomContentHeight} and {@link #getCustomSizePreset}.
-         */
-        public WearableExtender setCustomSizePreset(int sizePreset) {
-            mCustomSizePreset = sizePreset;
-            return this;
-        }
-
-        /**
-         * Get the custom size preset for the display of this notification out of the available
-         * presets found in {@link NotificationCompat.WearableExtender}, e.g.
-         * {@link #SIZE_LARGE}.
-         * <p>Some custom size presets are only applicable for custom display notifications created
-         * using {@link #setDisplayIntent}. Check the documentation for the preset in question.
-         * See also {@link #setCustomContentHeight} and {@link #setCustomSizePreset}.
-         */
-        public int getCustomSizePreset() {
-            return mCustomSizePreset;
-        }
-
-        /**
-         * Set the custom height in pixels for the display of this notification's content.
-         * <p>This option is only available for custom display notifications created
-         * using {@link NotificationCompat.WearableExtender#setDisplayIntent}. See also
-         * {@link NotificationCompat.WearableExtender#setCustomSizePreset} and
-         * {@link #getCustomContentHeight}.
-         */
-        public WearableExtender setCustomContentHeight(int height) {
-            mCustomContentHeight = height;
-            return this;
-        }
-
-        /**
-         * Get the custom height in pixels for the display of this notification's content.
-         * <p>This option is only available for custom display notifications created
-         * using {@link #setDisplayIntent}. See also {@link #setCustomSizePreset} and
-         * {@link #setCustomContentHeight}.
-         */
-        public int getCustomContentHeight() {
-            return mCustomContentHeight;
-        }
-
-        /**
-         * Set whether the scrolling position for the contents of this notification should start
-         * at the bottom of the contents instead of the top when the contents are too long to
-         * display within the screen.  Default is false (start scroll at the top).
-         */
-        public WearableExtender setStartScrollBottom(boolean startScrollBottom) {
-            setFlag(FLAG_START_SCROLL_BOTTOM, startScrollBottom);
-            return this;
-        }
-
-        /**
-         * Get whether the scrolling position for the contents of this notification should start
-         * at the bottom of the contents instead of the top when the contents are too long to
-         * display within the screen. Default is false (start scroll at the top).
-         */
-        public boolean getStartScrollBottom() {
-            return (mFlags & FLAG_START_SCROLL_BOTTOM) != 0;
-        }
-
-        /**
-         * Set whether the content intent is available when the wearable device is not connected
-         * to a companion device.  The user can still trigger this intent when the wearable device
-         * is offline, but a visual hint will indicate that the content intent may not be available.
-         * Defaults to true.
-         */
-        public WearableExtender setContentIntentAvailableOffline(
-                boolean contentIntentAvailableOffline) {
-            setFlag(FLAG_CONTENT_INTENT_AVAILABLE_OFFLINE, contentIntentAvailableOffline);
-            return this;
-        }
-
-        /**
-         * Get whether the content intent is available when the wearable device is not connected
-         * to a companion device.  The user can still trigger this intent when the wearable device
-         * is offline, but a visual hint will indicate that the content intent may not be available.
-         * Defaults to true.
-         */
-        public boolean getContentIntentAvailableOffline() {
-            return (mFlags & FLAG_CONTENT_INTENT_AVAILABLE_OFFLINE) != 0;
-        }
-
-        /**
-         * Set a hint that this notification's icon should not be displayed.
-         * @param hintHideIcon {@code true} to hide the icon, {@code false} otherwise.
-         * @return this object for method chaining
-         */
-        public WearableExtender setHintHideIcon(boolean hintHideIcon) {
-            setFlag(FLAG_HINT_HIDE_ICON, hintHideIcon);
-            return this;
-        }
-
-        /**
-         * Get a hint that this notification's icon should not be displayed.
-         * @return {@code true} if this icon should not be displayed, false otherwise.
-         * The default value is {@code false} if this was never set.
-         */
-        public boolean getHintHideIcon() {
-            return (mFlags & FLAG_HINT_HIDE_ICON) != 0;
-        }
-
-        /**
-         * Set a visual hint that only the background image of this notification should be
-         * displayed, and other semantic content should be hidden. This hint is only applicable
-         * to sub-pages added using {@link #addPage}.
-         */
-        public WearableExtender setHintShowBackgroundOnly(boolean hintShowBackgroundOnly) {
-            setFlag(FLAG_HINT_SHOW_BACKGROUND_ONLY, hintShowBackgroundOnly);
-            return this;
-        }
-
-        /**
-         * Get a visual hint that only the background image of this notification should be
-         * displayed, and other semantic content should be hidden. This hint is only applicable
-         * to sub-pages added using {@link NotificationCompat.WearableExtender#addPage}.
-         */
-        public boolean getHintShowBackgroundOnly() {
-            return (mFlags & FLAG_HINT_SHOW_BACKGROUND_ONLY) != 0;
-        }
-
-        /**
-         * Set a hint that this notification's background should not be clipped if possible,
-         * and should instead be resized to fully display on the screen, retaining the aspect
-         * ratio of the image. This can be useful for images like barcodes or qr codes.
-         * @param hintAvoidBackgroundClipping {@code true} to avoid clipping if possible.
-         * @return this object for method chaining
-         */
-        public WearableExtender setHintAvoidBackgroundClipping(
-                boolean hintAvoidBackgroundClipping) {
-            setFlag(FLAG_HINT_AVOID_BACKGROUND_CLIPPING, hintAvoidBackgroundClipping);
-            return this;
-        }
-
-        /**
-         * Get a hint that this notification's background should not be clipped if possible,
-         * and should instead be resized to fully display on the screen, retaining the aspect
-         * ratio of the image. This can be useful for images like barcodes or qr codes.
-         * @return {@code true} if it's ok if the background is clipped on the screen, false
-         * otherwise. The default value is {@code false} if this was never set.
-         */
-        public boolean getHintAvoidBackgroundClipping() {
-            return (mFlags & FLAG_HINT_AVOID_BACKGROUND_CLIPPING) != 0;
-        }
-
-        /**
-         * Set a hint that the screen should remain on for at least this duration when
-         * this notification is displayed on the screen.
-         * @param timeout The requested screen timeout in milliseconds. Can also be either
-         *     {@link #SCREEN_TIMEOUT_SHORT} or {@link #SCREEN_TIMEOUT_LONG}.
-         * @return this object for method chaining
-         */
-        public WearableExtender setHintScreenTimeout(int timeout) {
-            mHintScreenTimeout = timeout;
-            return this;
-        }
-
-        /**
-         * Get the duration, in milliseconds, that the screen should remain on for
-         * when this notification is displayed.
-         * @return the duration in milliseconds if > 0, or either one of the sentinel values
-         *     {@link #SCREEN_TIMEOUT_SHORT} or {@link #SCREEN_TIMEOUT_LONG}.
-         */
-        public int getHintScreenTimeout() {
-            return mHintScreenTimeout;
-        }
-
-        /**
-         * Set a hint that this notification's {@link BigPictureStyle} (if present) should be
-         * converted to low-bit and displayed in ambient mode, especially useful for barcodes and
-         * qr codes, as well as other simple black-and-white tickets.
-         * @param hintAmbientBigPicture {@code true} to enable converstion and ambient.
-         * @return this object for method chaining
-         */
-        public WearableExtender setHintAmbientBigPicture(boolean hintAmbientBigPicture) {
-            setFlag(FLAG_BIG_PICTURE_AMBIENT, hintAmbientBigPicture);
-            return this;
-        }
-
-        /**
-         * Get a hint that this notification's {@link BigPictureStyle} (if present) should be
-         * converted to low-bit and displayed in ambient mode, especially useful for barcodes and
-         * qr codes, as well as other simple black-and-white tickets.
-         * @return {@code true} if it should be displayed in ambient, false otherwise
-         * otherwise. The default value is {@code false} if this was never set.
-         */
-        public boolean getHintAmbientBigPicture() {
-            return (mFlags & FLAG_BIG_PICTURE_AMBIENT) != 0;
-        }
-
-        /**
-         * Set a hint that this notification's content intent will launch an {@link Activity}
-         * directly, telling the platform that it can generate the appropriate transitions.
-         * @param hintContentIntentLaunchesActivity {@code true} if the content intent will launch
-         * an activity and transitions should be generated, false otherwise.
-         * @return this object for method chaining
-         */
-        public WearableExtender setHintContentIntentLaunchesActivity(
-                boolean hintContentIntentLaunchesActivity) {
-            setFlag(FLAG_HINT_CONTENT_INTENT_LAUNCHES_ACTIVITY, hintContentIntentLaunchesActivity);
-            return this;
-        }
-
-        /**
-         * Get a hint that this notification's content intent will launch an {@link Activity}
-         * directly, telling the platform that it can generate the appropriate transitions
-         * @return {@code true} if the content intent will launch an activity and transitions should
-         * be generated, false otherwise. The default value is {@code false} if this was never set.
-         */
-        public boolean getHintContentIntentLaunchesActivity() {
-            return (mFlags & FLAG_HINT_CONTENT_INTENT_LAUNCHES_ACTIVITY) != 0;
-        }
-
-        /**
-         * When you post a notification, if you set the dismissal id field, then when that
-         * notification is canceled, notifications on other wearables and the paired Android phone
-         * having that same dismissal id will also be canceled.  Note that this only works if you
-         * have notification bridge mode set to NO_BRIDGING in your Wear app manifest.  See
-         * <a href="{@docRoot}wear/notifications/index.html">Adding Wearable Features to
-         * Notifications</a> for more information on how to use the bridge mode feature.
-         * @param dismissalId the dismissal id of the notification.
-         * @return this object for method chaining
-         */
-        public WearableExtender setDismissalId(String dismissalId) {
-            mDismissalId = dismissalId;
-            return this;
-        }
-
-        /**
-         * Returns the dismissal id of the notification.
-         * @return the dismissal id of the notification or null if it has not been set.
-         */
-        public String getDismissalId() {
-            return mDismissalId;
-        }
-
-        private void setFlag(int mask, boolean value) {
-            if (value) {
-                mFlags |= mask;
-            } else {
-                mFlags &= ~mask;
-            }
-        }
-    }
-
-    /**
-     * <p>Helper class to add Android Auto extensions to notifications. To create a notification
-     * with car extensions:
-     *
-     * <ol>
-     *  <li>Create an {@link NotificationCompat.Builder}, setting any desired
-     *  properties.
-     *  <li>Create a {@link CarExtender}.
-     *  <li>Set car-specific properties using the {@code add} and {@code set} methods of
-     *  {@link CarExtender}.
-     *  <li>Call {@link android.support.v4.app.NotificationCompat.Builder#extend(NotificationCompat.Extender)}
-     *  to apply the extensions to a notification.
-     *  <li>Post the notification to the notification system with the
-     *  {@code NotificationManagerCompat.notify(...)} methods and not the
-     *  {@code NotificationManager.notify(...)} methods.
-     * </ol>
-     *
-     * <pre class="prettyprint">
-     * Notification notification = new NotificationCompat.Builder(context)
-     *         ...
-     *         .extend(new CarExtender()
-     *                 .set*(...))
-     *         .build();
-     * </pre>
-     *
-     * <p>Car extensions can be accessed on an existing notification by using the
-     * {@code CarExtender(Notification)} constructor, and then using the {@code get} methods
-     * to access values.
-     */
-    public static final class CarExtender implements Extender {
-        private static final String TAG = "CarExtender";
-
-        private static final String EXTRA_CAR_EXTENDER = "android.car.EXTENSIONS";
-        private static final String EXTRA_LARGE_ICON = "large_icon";
-        private static final String EXTRA_CONVERSATION = "car_conversation";
-        private static final String EXTRA_COLOR = "app_color";
-
-        private Bitmap mLargeIcon;
-        private UnreadConversation mUnreadConversation;
-        private int mColor = NotificationCompat.COLOR_DEFAULT;
-
-        /**
-         * Create a {@link CarExtender} with default options.
-         */
-        public CarExtender() {
-        }
-
-        /**
-         * Create a {@link CarExtender} from the CarExtender options of an existing Notification.
-         *
-         * @param notif The notification from which to copy options.
-         */
-        public CarExtender(Notification notif) {
-            if (Build.VERSION.SDK_INT < 21) {
-                return;
-            }
-
-            Bundle carBundle = getExtras(notif)==null ?
-                    null : getExtras(notif).getBundle(EXTRA_CAR_EXTENDER);
-            if (carBundle != null) {
-                mLargeIcon = carBundle.getParcelable(EXTRA_LARGE_ICON);
-                mColor = carBundle.getInt(EXTRA_COLOR, NotificationCompat.COLOR_DEFAULT);
-
-                Bundle b = carBundle.getBundle(EXTRA_CONVERSATION);
-                mUnreadConversation = (UnreadConversation) IMPL.getUnreadConversationFromBundle(
-                        b, UnreadConversation.FACTORY, RemoteInput.FACTORY);
-            }
-        }
-
-        /**
-         * Apply car extensions to a notification that is being built. This is typically called by
-         * the {@link android.support.v4.app.NotificationCompat.Builder#extend(NotificationCompat.Extender)}
-         * method of {@link NotificationCompat.Builder}.
-         */
-        @Override
-        public NotificationCompat.Builder extend(NotificationCompat.Builder builder) {
-            if (Build.VERSION.SDK_INT < 21) {
-                return builder;
-            }
-
-            Bundle carExtensions = new Bundle();
-
-            if (mLargeIcon != null) {
-                carExtensions.putParcelable(EXTRA_LARGE_ICON, mLargeIcon);
-            }
-            if (mColor != NotificationCompat.COLOR_DEFAULT) {
-                carExtensions.putInt(EXTRA_COLOR, mColor);
-            }
-
-            if (mUnreadConversation != null) {
-                Bundle b = IMPL.getBundleForUnreadConversation(mUnreadConversation);
-                carExtensions.putBundle(EXTRA_CONVERSATION, b);
-            }
-
-            builder.getExtras().putBundle(EXTRA_CAR_EXTENDER, carExtensions);
-            return builder;
-        }
-
-        /**
-         * Sets the accent color to use when Android Auto presents the notification.
-         *
-         * Android Auto uses the color set with {@link android.support.v4.app.NotificationCompat.Builder#setColor(int)}
-         * to accent the displayed notification. However, not all colors are acceptable in an
-         * automotive setting. This method can be used to override the color provided in the
-         * notification in such a situation.
-         */
-        public CarExtender setColor(@ColorInt int color) {
-            mColor = color;
-            return this;
-        }
-
-        /**
-         * Gets the accent color.
-         *
-         * @see #setColor
-         */
-        @ColorInt
-        public int getColor() {
-            return mColor;
-        }
-
-        /**
-         * Sets the large icon of the car notification.
-         *
-         * If no large icon is set in the extender, Android Auto will display the icon
-         * specified by {@link android.support.v4.app.NotificationCompat.Builder#setLargeIcon(android.graphics.Bitmap)}
-         *
-         * @param largeIcon The large icon to use in the car notification.
-         * @return This object for method chaining.
-         */
-        public CarExtender setLargeIcon(Bitmap largeIcon) {
-            mLargeIcon = largeIcon;
-            return this;
-        }
-
-        /**
-         * Gets the large icon used in this car notification, or null if no icon has been set.
-         *
-         * @return The large icon for the car notification.
-         * @see CarExtender#setLargeIcon
-         */
-        public Bitmap getLargeIcon() {
-            return mLargeIcon;
-        }
-
-        /**
-         * Sets the unread conversation in a message notification.
-         *
-         * @param unreadConversation The unread part of the conversation this notification conveys.
-         * @return This object for method chaining.
-         */
-        public CarExtender setUnreadConversation(UnreadConversation unreadConversation) {
-            mUnreadConversation = unreadConversation;
-            return this;
-        }
-
-        /**
-         * Returns the unread conversation conveyed by this notification.
-         * @see #setUnreadConversation(UnreadConversation)
-         */
-        public UnreadConversation getUnreadConversation() {
-            return mUnreadConversation;
-        }
-
-        /**
-         * A class which holds the unread messages from a conversation.
-         */
-        public static class UnreadConversation extends NotificationCompatBase.UnreadConversation {
-            private final String[] mMessages;
-            private final RemoteInput mRemoteInput;
-            private final PendingIntent mReplyPendingIntent;
-            private final PendingIntent mReadPendingIntent;
-            private final String[] mParticipants;
-            private final long mLatestTimestamp;
-
-            UnreadConversation(String[] messages, RemoteInput remoteInput,
-                    PendingIntent replyPendingIntent, PendingIntent readPendingIntent,
-                    String[] participants, long latestTimestamp) {
-                mMessages = messages;
-                mRemoteInput = remoteInput;
-                mReadPendingIntent = readPendingIntent;
-                mReplyPendingIntent = replyPendingIntent;
-                mParticipants = participants;
-                mLatestTimestamp = latestTimestamp;
-            }
-
-            /**
-             * Gets the list of messages conveyed by this notification.
-             */
-            @Override
-            public String[] getMessages() {
-                return mMessages;
-            }
-
-            /**
-             * Gets the remote input that will be used to convey the response to a message list, or
-             * null if no such remote input exists.
-             */
-            @Override
-            public RemoteInput getRemoteInput() {
-                return mRemoteInput;
-            }
-
-            /**
-             * Gets the pending intent that will be triggered when the user replies to this
-             * notification.
-             */
-            @Override
-            public PendingIntent getReplyPendingIntent() {
-                return mReplyPendingIntent;
-            }
-
-            /**
-             * Gets the pending intent that Android Auto will send after it reads aloud all messages
-             * in this object's message list.
-             */
-            @Override
-            public PendingIntent getReadPendingIntent() {
-                return mReadPendingIntent;
-            }
-
-            /**
-             * Gets the participants in the conversation.
-             */
-            @Override
-            public String[] getParticipants() {
-                return mParticipants;
-            }
-
-            /**
-             * Gets the firs participant in the conversation.
-             */
-            @Override
-            public String getParticipant() {
-                return mParticipants.length > 0 ? mParticipants[0] : null;
-            }
-
-            /**
-             * Gets the timestamp of the conversation.
-             */
-            @Override
-            public long getLatestTimestamp() {
-                return mLatestTimestamp;
-            }
-
-            /** @hide */
-            static final Factory FACTORY = new Factory() {
-                @Override
-                public UnreadConversation build(
-                        String[] messages, RemoteInputCompatBase.RemoteInput remoteInput,
-                        PendingIntent replyPendingIntent, PendingIntent readPendingIntent,
-                        String[] participants, long latestTimestamp) {
-                    return new UnreadConversation(
-                            messages, (RemoteInput) remoteInput, replyPendingIntent,
-                            readPendingIntent,
-                            participants, latestTimestamp);
-                }
-            };
-
-            /**
-             * Builder class for {@link CarExtender.UnreadConversation} objects.
-             */
-            public static class Builder {
-                private final List<String> mMessages = new ArrayList<String>();
-                private final String mParticipant;
-                private RemoteInput mRemoteInput;
-                private PendingIntent mReadPendingIntent;
-                private PendingIntent mReplyPendingIntent;
-                private long mLatestTimestamp;
-
-                /**
-                 * Constructs a new builder for {@link CarExtender.UnreadConversation}.
-                 *
-                 * @param name The name of the other participant in the conversation.
-                 */
-                public Builder(String name) {
-                    mParticipant = name;
-                }
-
-                /**
-                 * Appends a new unread message to the list of messages for this conversation.
-                 *
-                 * The messages should be added from oldest to newest.
-                 *
-                 * @param message The text of the new unread message.
-                 * @return This object for method chaining.
-                 */
-                public Builder addMessage(String message) {
-                    mMessages.add(message);
-                    return this;
-                }
-
-                /**
-                 * Sets the pending intent and remote input which will convey the reply to this
-                 * notification.
-                 *
-                 * @param pendingIntent The pending intent which will be triggered on a reply.
-                 * @param remoteInput The remote input parcelable which will carry the reply.
-                 * @return This object for method chaining.
-                 *
-                 * @see CarExtender.UnreadConversation#getRemoteInput
-                 * @see CarExtender.UnreadConversation#getReplyPendingIntent
-                 */
-                public Builder setReplyAction(
-                        PendingIntent pendingIntent, RemoteInput remoteInput) {
-                    mRemoteInput = remoteInput;
-                    mReplyPendingIntent = pendingIntent;
-
-                    return this;
-                }
-
-                /**
-                 * Sets the pending intent that will be sent once the messages in this notification
-                 * are read.
-                 *
-                 * @param pendingIntent The pending intent to use.
-                 * @return This object for method chaining.
-                 */
-                public Builder setReadPendingIntent(PendingIntent pendingIntent) {
-                    mReadPendingIntent = pendingIntent;
-                    return this;
-                }
-
-                /**
-                 * Sets the timestamp of the most recent message in an unread conversation.
-                 *
-                 * If a messaging notification has been posted by your application and has not
-                 * yet been cancelled, posting a later notification with the same id and tag
-                 * but without a newer timestamp may result in Android Auto not displaying a
-                 * heads up notification for the later notification.
-                 *
-                 * @param timestamp The timestamp of the most recent message in the conversation.
-                 * @return This object for method chaining.
-                 */
-                public Builder setLatestTimestamp(long timestamp) {
-                    mLatestTimestamp = timestamp;
-                    return this;
-                }
-
-                /**
-                 * Builds a new unread conversation object.
-                 *
-                 * @return The new unread conversation object.
-                 */
-                public UnreadConversation build() {
-                    String[] messages = mMessages.toArray(new String[mMessages.size()]);
-                    String[] participants = { mParticipant };
-                    return new UnreadConversation(messages, mRemoteInput, mReplyPendingIntent,
-                            mReadPendingIntent, participants, mLatestTimestamp);
-                }
-            }
-        }
-    }
-
-
-    /**
-     * Get an array of Notification objects from a parcelable array bundle field.
-     * Update the bundle to have a typed array so fetches in the future don't need
-     * to do an array copy.
-     */
-    private static Notification[] getNotificationArrayFromBundle(Bundle bundle, String key) {
-        Parcelable[] array = bundle.getParcelableArray(key);
-        if (array instanceof Notification[] || array == null) {
-            return (Notification[]) array;
-        }
-        Notification[] typedArray = new Notification[array.length];
-        for (int i = 0; i < array.length; i++) {
-            typedArray[i] = (Notification) array[i];
-        }
-        bundle.putParcelableArray(key, typedArray);
-        return typedArray;
-    }
-
-    /**
-     * Gets the {@link Notification#extras} field from a notification in a backwards
-     * compatible manner. Extras field was supported from JellyBean (Api level 16)
-     * forwards. This function will return null on older api levels.
-     */
-    public static Bundle getExtras(Notification notif) {
-        return IMPL.getExtras(notif);
-    }
-
-    /**
-     * Get the number of actions in this notification in a backwards compatible
-     * manner. Actions were supported from JellyBean (Api level 16) forwards.
-     */
-    public static int getActionCount(Notification notif) {
-        return IMPL.getActionCount(notif);
-    }
-
-    /**
-     * Get an action on this notification in a backwards compatible
-     * manner. Actions were supported from JellyBean (Api level 16) forwards.
-     * @param notif The notification to inspect.
-     * @param actionIndex The index of the action to retrieve.
-     */
-    public static Action getAction(Notification notif, int actionIndex) {
-        return IMPL.getAction(notif, actionIndex);
-    }
-
-    /**
-     * Get the category of this notification in a backwards compatible
-     * manner.
-     * @param notif The notification to inspect.
-     */
-    public static String getCategory(Notification notif) {
-        return IMPL.getCategory(notif);
-    }
-
-    /**
-     * Get whether or not this notification is only relevant to the current device.
-     *
-     * <p>Some notifications can be bridged to other devices for remote display.
-     * If this hint is set, it is recommend that this notification not be bridged.
-     */
-    public static boolean getLocalOnly(Notification notif) {
-        return IMPL.getLocalOnly(notif);
-    }
-
-    /**
-     * Get the key used to group this notification into a cluster or stack
-     * with other notifications on devices which support such rendering.
-     */
-    public static String getGroup(Notification notif) {
-        return IMPL.getGroup(notif);
-    }
-
-    /**
-     * Get whether this notification to be the group summary for a group of notifications.
-     * Grouped notifications may display in a cluster or stack on devices which
-     * support such rendering. Requires a group key also be set using {@link Builder#setGroup}.
-     * @return Whether this notification is a group summary.
-     */
-    public static boolean isGroupSummary(Notification notif) {
-        return IMPL.isGroupSummary(notif);
-    }
-
-    /**
-     * Get a sort key that orders this notification among other notifications from the
-     * same package. This can be useful if an external sort was already applied and an app
-     * would like to preserve this. Notifications will be sorted lexicographically using this
-     * value, although providing different priorities in addition to providing sort key may
-     * cause this value to be ignored.
-     *
-     * <p>This sort key can also be used to order members of a notification group. See
-     * {@link Builder#setGroup}.
-     *
-     * @see String#compareTo(String)
-     */
-    public static String getSortKey(Notification notif) {
-        return IMPL.getSortKey(notif);
-    }
-}
diff --git a/v4/java/android/support/v4/app/NotificationManagerCompat.java b/v4/java/android/support/v4/app/NotificationManagerCompat.java
deleted file mode 100644
index de484e9..0000000
--- a/v4/java/android/support/v4/app/NotificationManagerCompat.java
+++ /dev/null
@@ -1,726 +0,0 @@
-/*
- * Copyright (C) 2014 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 android.support.v4.app;
-
-import android.app.Notification;
-import android.app.NotificationManager;
-import android.app.Service;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.ServiceConnection;
-import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
-import android.os.Build;
-import android.os.Bundle;
-import android.os.DeadObjectException;
-import android.os.Handler;
-import android.os.HandlerThread;
-import android.os.IBinder;
-import android.os.Message;
-import android.os.RemoteException;
-import android.provider.Settings;
-import android.support.v4.os.BuildCompat;
-import android.util.Log;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Compatibility library for NotificationManager with fallbacks for older platforms.
- *
- * <p>To use this class, call the static function {@link #from} to get a
- * {@link NotificationManagerCompat} object, and then call one of its
- * methods to post or cancel notifications.
- */
-public final class NotificationManagerCompat {
-    private static final String TAG = "NotifManCompat";
-
-    /**
-     * Notification extras key: if set to true, the posted notification should use
-     * the side channel for delivery instead of using notification manager.
-     */
-    public static final String EXTRA_USE_SIDE_CHANNEL =
-            NotificationCompatJellybean.EXTRA_USE_SIDE_CHANNEL;
-
-    /**
-     * Intent action to register for on a service to receive side channel
-     * notifications. The listening service must be in the same package as an enabled
-     * {@link android.service.notification.NotificationListenerService}.
-     */
-    public static final String ACTION_BIND_SIDE_CHANNEL =
-            "android.support.BIND_NOTIFICATION_SIDE_CHANNEL";
-
-    /**
-     * Maximum sdk build version which needs support for side channeled notifications.
-     * Currently the only needed use is for side channeling group children before KITKAT_WATCH.
-     */
-    static final int MAX_SIDE_CHANNEL_SDK_VERSION = 19;
-
-    /** Base time delay for a side channel listener queue retry. */
-    private static final int SIDE_CHANNEL_RETRY_BASE_INTERVAL_MS = 1000;
-    /** Maximum retries for a side channel listener before dropping tasks. */
-    private static final int SIDE_CHANNEL_RETRY_MAX_COUNT = 6;
-    /** Hidden field Settings.Secure.ENABLED_NOTIFICATION_LISTENERS */
-    private static final String SETTING_ENABLED_NOTIFICATION_LISTENERS =
-            "enabled_notification_listeners";
-    private static final int SIDE_CHANNEL_BIND_FLAGS;
-
-    /** Cache of enabled notification listener components */
-    private static final Object sEnabledNotificationListenersLock = new Object();
-    /** Guarded by {@link #sEnabledNotificationListenersLock} */
-    private static String sEnabledNotificationListeners;
-    /** Guarded by {@link #sEnabledNotificationListenersLock} */
-    private static Set<String> sEnabledNotificationListenerPackages = new HashSet<String>();
-
-    private final Context mContext;
-    private final NotificationManager mNotificationManager;
-    /** Lock for mutable static fields */
-    private static final Object sLock = new Object();
-    /** Guarded by {@link #sLock} */
-    private static SideChannelManager sSideChannelManager;
-
-    /**
-     * Value signifying that the user has not expressed an importance.
-     *
-     * This value is for persisting preferences, and should never be associated with
-     * an actual notification.
-     */
-    public static final int IMPORTANCE_UNSPECIFIED = -1000;
-
-    /**
-     * A notification with no importance: shows nowhere, is blocked.
-     */
-    public static final int IMPORTANCE_NONE = 0;
-
-    /**
-     * Min notification importance: only shows in the shade, below the fold.
-     */
-    public static final int IMPORTANCE_MIN = 1;
-
-    /**
-     * Low notification importance: shows everywhere, but is not intrusive.
-     */
-    public static final int IMPORTANCE_LOW = 2;
-
-    /**
-     * Default notification importance: shows everywhere, allowed to makes noise,
-     * but does not visually intrude.
-     */
-    public static final int IMPORTANCE_DEFAULT = 3;
-
-    /**
-     * Higher notification importance: shows everywhere, allowed to makes noise and peek.
-     */
-    public static final int IMPORTANCE_HIGH = 4;
-
-    /**
-     * Highest notification importance: shows everywhere, allowed to makes noise, peek, and
-     * use full screen intents.
-     */
-    public static final int IMPORTANCE_MAX = 5;
-
-    /** Get a {@link NotificationManagerCompat} instance for a provided context. */
-    public static NotificationManagerCompat from(Context context) {
-        return new NotificationManagerCompat(context);
-    }
-
-    private NotificationManagerCompat(Context context) {
-        mContext = context;
-        mNotificationManager = (NotificationManager) mContext.getSystemService(
-                Context.NOTIFICATION_SERVICE);
-    }
-
-    private static final Impl IMPL;
-
-    interface Impl {
-        void cancelNotification(NotificationManager notificationManager, String tag, int id);
-
-        void postNotification(NotificationManager notificationManager, String tag, int id,
-                Notification notification);
-
-        int getSideChannelBindFlags();
-
-        boolean areNotificationsEnabled(Context context, NotificationManager notificationManager);
-
-        int getImportance(NotificationManager notificationManager);
-    }
-
-    static class ImplBase implements Impl {
-
-        @Override
-        public void cancelNotification(NotificationManager notificationManager, String tag,
-                int id) {
-            notificationManager.cancel(id);
-        }
-
-        @Override
-        public void postNotification(NotificationManager notificationManager, String tag, int id,
-                Notification notification) {
-            notificationManager.notify(id, notification);
-        }
-
-        @Override
-        public int getSideChannelBindFlags() {
-            return Service.BIND_AUTO_CREATE;
-        }
-
-        @Override
-        public boolean areNotificationsEnabled(Context context,
-                NotificationManager notificationManager) {
-            return true;
-        }
-
-        @Override
-        public int getImportance(NotificationManager notificationManager) {
-            return IMPORTANCE_UNSPECIFIED;
-        }
-    }
-
-    static class ImplEclair extends ImplBase {
-        @Override
-        public void cancelNotification(NotificationManager notificationManager, String tag,
-                int id) {
-            NotificationManagerCompatEclair.cancelNotification(notificationManager, tag, id);
-        }
-
-        @Override
-        public void postNotification(NotificationManager notificationManager, String tag, int id,
-                Notification notification) {
-            NotificationManagerCompatEclair.postNotification(notificationManager, tag, id,
-                    notification);
-        }
-    }
-
-    static class ImplIceCreamSandwich extends ImplEclair {
-        @Override
-        public int getSideChannelBindFlags() {
-            return NotificationManagerCompatIceCreamSandwich.SIDE_CHANNEL_BIND_FLAGS;
-        }
-    }
-
-    static class ImplKitKat extends ImplIceCreamSandwich {
-        @Override
-        public boolean areNotificationsEnabled(Context context,
-                NotificationManager notificationManager) {
-            return NotificationManagerCompatKitKat.areNotificationsEnabled(context);
-        }
-    }
-
-    static class ImplApi24 extends ImplKitKat {
-        @Override
-        public boolean areNotificationsEnabled(Context context,
-                NotificationManager notificationManager) {
-            return NotificationManagerCompatApi24.areNotificationsEnabled(notificationManager);
-        }
-
-        @Override
-        public int getImportance(NotificationManager notificationManager) {
-            return NotificationManagerCompatApi24.getImportance(notificationManager);
-        }
-    }
-
-    static {
-        if (BuildCompat.isAtLeastN()) {
-            IMPL = new ImplApi24();
-        } else if (Build.VERSION.SDK_INT >= 19) {
-            IMPL = new ImplKitKat();
-        }  else if (Build.VERSION.SDK_INT >= 14) {
-            IMPL = new ImplIceCreamSandwich();
-        } else if (Build.VERSION.SDK_INT >= 5) {
-            IMPL = new ImplEclair();
-        } else {
-            IMPL = new ImplBase();
-        }
-        SIDE_CHANNEL_BIND_FLAGS = IMPL.getSideChannelBindFlags();
-    }
-
-    /**
-     * Cancel a previously shown notification.
-     * @param id the ID of the notification
-     */
-    public void cancel(int id) {
-        cancel(null, id);
-    }
-
-    /**
-     * Cancel a previously shown notification.
-     * @param tag the string identifier of the notification.
-     * @param id the ID of the notification
-     */
-    public void cancel(String tag, int id) {
-        IMPL.cancelNotification(mNotificationManager, tag, id);
-        if (Build.VERSION.SDK_INT <= MAX_SIDE_CHANNEL_SDK_VERSION) {
-            pushSideChannelQueue(new CancelTask(mContext.getPackageName(), id, tag));
-        }
-    }
-
-    /** Cancel all previously shown notifications. */
-    public void cancelAll() {
-        mNotificationManager.cancelAll();
-        if (Build.VERSION.SDK_INT <= MAX_SIDE_CHANNEL_SDK_VERSION) {
-            pushSideChannelQueue(new CancelTask(mContext.getPackageName()));
-        }
-    }
-
-    /**
-     * Post a notification to be shown in the status bar, stream, etc.
-     * @param id the ID of the notification
-     * @param notification the notification to post to the system
-     */
-    public void notify(int id, Notification notification) {
-        notify(null, id, notification);
-    }
-
-    /**
-     * Post a notification to be shown in the status bar, stream, etc.
-     * @param tag the string identifier for a notification. Can be {@code null}.
-     * @param id the ID of the notification. The pair (tag, id) must be unique within your app.
-     * @param notification the notification to post to the system
-    */
-    public void notify(String tag, int id, Notification notification) {
-        if (useSideChannelForNotification(notification)) {
-            pushSideChannelQueue(new NotifyTask(mContext.getPackageName(), id, tag, notification));
-            // Cancel this notification in notification manager if it just transitioned to being
-            // side channelled.
-            IMPL.cancelNotification(mNotificationManager, tag, id);
-        } else {
-            IMPL.postNotification(mNotificationManager, tag, id, notification);
-        }
-    }
-
-    /**
-     * Returns whether notifications from the calling package are not blocked.
-     */
-    public boolean areNotificationsEnabled() {
-        return IMPL.areNotificationsEnabled(mContext, mNotificationManager);
-    }
-
-    /**
-     * Returns the user specified importance for notifications from the calling package.
-     *
-     * @return An importance level, such as {@link #IMPORTANCE_DEFAULT}.
-     */
-    public int getImportance() {
-        return IMPL.getImportance(mNotificationManager);
-    }
-
-    /**
-     * Get the set of packages that have an enabled notification listener component within them.
-     */
-    public static Set<String> getEnabledListenerPackages(Context context) {
-        final String enabledNotificationListeners = Settings.Secure.getString(
-                context.getContentResolver(),
-                SETTING_ENABLED_NOTIFICATION_LISTENERS);
-        synchronized (sEnabledNotificationListenersLock) {
-            // Parse the string again if it is different from the last time this method was called.
-            if (enabledNotificationListeners != null
-                    && !enabledNotificationListeners.equals(sEnabledNotificationListeners)) {
-                final String[] components = enabledNotificationListeners.split(":");
-                Set<String> packageNames = new HashSet<String>(components.length);
-                for (String component : components) {
-                    ComponentName componentName = ComponentName.unflattenFromString(component);
-                    if (componentName != null) {
-                        packageNames.add(componentName.getPackageName());
-                    }
-                }
-                sEnabledNotificationListenerPackages = packageNames;
-                sEnabledNotificationListeners = enabledNotificationListeners;
-            }
-            return sEnabledNotificationListenerPackages;
-        }
-    }
-
-    /**
-     * Returns true if this notification should use the side channel for delivery.
-     */
-    private static boolean useSideChannelForNotification(Notification notification) {
-        Bundle extras = NotificationCompat.getExtras(notification);
-        return extras != null && extras.getBoolean(EXTRA_USE_SIDE_CHANNEL);
-    }
-
-    /**
-     * Push a notification task for distribution to notification side channels.
-     */
-    private void pushSideChannelQueue(Task task) {
-        synchronized (sLock) {
-            if (sSideChannelManager == null) {
-                sSideChannelManager = new SideChannelManager(mContext.getApplicationContext());
-            }
-            sSideChannelManager.queueTask(task);
-        }
-    }
-
-    /**
-     * Helper class to manage a queue of pending tasks to send to notification side channel
-     * listeners.
-     */
-    private static class SideChannelManager implements Handler.Callback, ServiceConnection {
-        private static final int MSG_QUEUE_TASK = 0;
-        private static final int MSG_SERVICE_CONNECTED = 1;
-        private static final int MSG_SERVICE_DISCONNECTED = 2;
-        private static final int MSG_RETRY_LISTENER_QUEUE = 3;
-
-        private static final String KEY_BINDER = "binder";
-
-        private final Context mContext;
-        private final HandlerThread mHandlerThread;
-        private final Handler mHandler;
-        private final Map<ComponentName, ListenerRecord> mRecordMap =
-                new HashMap<ComponentName, ListenerRecord>();
-        private Set<String> mCachedEnabledPackages = new HashSet<String>();
-
-        public SideChannelManager(Context context) {
-            mContext = context;
-            mHandlerThread = new HandlerThread("NotificationManagerCompat");
-            mHandlerThread.start();
-            mHandler = new Handler(mHandlerThread.getLooper(), this);
-        }
-
-        /**
-         * Queue a new task to be sent to all listeners. This function can be called
-         * from any thread.
-         */
-        public void queueTask(Task task) {
-            mHandler.obtainMessage(MSG_QUEUE_TASK, task).sendToTarget();
-        }
-
-        @Override
-        public boolean handleMessage(Message msg) {
-            switch (msg.what) {
-                case MSG_QUEUE_TASK:
-                    handleQueueTask((Task) msg.obj);
-                    return true;
-                case MSG_SERVICE_CONNECTED:
-                    ServiceConnectedEvent event = (ServiceConnectedEvent) msg.obj;
-                    handleServiceConnected(event.componentName, event.iBinder);
-                    return true;
-                case MSG_SERVICE_DISCONNECTED:
-                    handleServiceDisconnected((ComponentName) msg.obj);
-                    return true;
-                case MSG_RETRY_LISTENER_QUEUE:
-                    handleRetryListenerQueue((ComponentName) msg.obj);
-                    return true;
-            }
-            return false;
-        }
-
-        private void handleQueueTask(Task task) {
-            updateListenerMap();
-            for (ListenerRecord record : mRecordMap.values()) {
-                record.taskQueue.add(task);
-                processListenerQueue(record);
-            }
-        }
-
-        private void handleServiceConnected(ComponentName componentName, IBinder iBinder) {
-            ListenerRecord record = mRecordMap.get(componentName);
-            if (record != null) {
-                record.service = INotificationSideChannel.Stub.asInterface(iBinder);
-                record.retryCount = 0;
-                processListenerQueue(record);
-            }
-        }
-
-        private void handleServiceDisconnected(ComponentName componentName) {
-            ListenerRecord record = mRecordMap.get(componentName);
-            if (record != null) {
-                ensureServiceUnbound(record);
-            }
-        }
-
-        private void handleRetryListenerQueue(ComponentName componentName) {
-            ListenerRecord record = mRecordMap.get(componentName);
-            if (record != null) {
-                processListenerQueue(record);
-            }
-        }
-
-        @Override
-        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
-            if (Log.isLoggable(TAG, Log.DEBUG)) {
-                Log.d(TAG, "Connected to service " + componentName);
-            }
-            mHandler.obtainMessage(MSG_SERVICE_CONNECTED,
-                    new ServiceConnectedEvent(componentName, iBinder))
-                    .sendToTarget();
-        }
-
-        @Override
-        public void onServiceDisconnected(ComponentName componentName) {
-            if (Log.isLoggable(TAG, Log.DEBUG)) {
-                Log.d(TAG, "Disconnected from service " + componentName);
-            }
-            mHandler.obtainMessage(MSG_SERVICE_DISCONNECTED, componentName).sendToTarget();
-        }
-
-        /**
-         * Check the current list of enabled listener packages and update the records map
-         * accordingly.
-         */
-        private void updateListenerMap() {
-            Set<String> enabledPackages = getEnabledListenerPackages(mContext);
-            if (enabledPackages.equals(mCachedEnabledPackages)) {
-                // Short-circuit when the list of enabled packages has not changed.
-                return;
-            }
-            mCachedEnabledPackages = enabledPackages;
-            List<ResolveInfo> resolveInfos = mContext.getPackageManager().queryIntentServices(
-                    new Intent().setAction(ACTION_BIND_SIDE_CHANNEL), PackageManager.GET_SERVICES);
-            Set<ComponentName> enabledComponents = new HashSet<ComponentName>();
-            for (ResolveInfo resolveInfo : resolveInfos) {
-                if (!enabledPackages.contains(resolveInfo.serviceInfo.packageName)) {
-                    continue;
-                }
-                ComponentName componentName = new ComponentName(
-                        resolveInfo.serviceInfo.packageName, resolveInfo.serviceInfo.name);
-                if (resolveInfo.serviceInfo.permission != null) {
-                    Log.w(TAG, "Permission present on component " + componentName
-                            + ", not adding listener record.");
-                    continue;
-                }
-                enabledComponents.add(componentName);
-            }
-            // Ensure all enabled components have a record in the listener map.
-            for (ComponentName componentName : enabledComponents) {
-                if (!mRecordMap.containsKey(componentName)) {
-                    if (Log.isLoggable(TAG, Log.DEBUG)) {
-                        Log.d(TAG, "Adding listener record for " + componentName);
-                    }
-                    mRecordMap.put(componentName, new ListenerRecord(componentName));
-                }
-            }
-            // Remove listener records that are no longer for enabled components.
-            Iterator<Map.Entry<ComponentName, ListenerRecord>> it =
-                    mRecordMap.entrySet().iterator();
-            while (it.hasNext()) {
-                Map.Entry<ComponentName, ListenerRecord> entry = it.next();
-                if (!enabledComponents.contains(entry.getKey())) {
-                    if (Log.isLoggable(TAG, Log.DEBUG)) {
-                        Log.d(TAG, "Removing listener record for " + entry.getKey());
-                    }
-                    ensureServiceUnbound(entry.getValue());
-                    it.remove();
-                }
-            }
-        }
-
-        /**
-         * Ensure we are already attempting to bind to a service, or start a new binding if not.
-         * @return Whether the service bind attempt was successful.
-         */
-        private boolean ensureServiceBound(ListenerRecord record) {
-            if (record.bound) {
-                return true;
-            }
-            Intent intent = new Intent(ACTION_BIND_SIDE_CHANNEL).setComponent(record.componentName);
-            record.bound = mContext.bindService(intent, this, SIDE_CHANNEL_BIND_FLAGS);
-            if (record.bound) {
-                record.retryCount = 0;
-            } else {
-                Log.w(TAG, "Unable to bind to listener " + record.componentName);
-                mContext.unbindService(this);
-            }
-            return record.bound;
-        }
-
-        /**
-         * Ensure we have unbound from a service.
-         */
-        private void ensureServiceUnbound(ListenerRecord record) {
-            if (record.bound) {
-                mContext.unbindService(this);
-                record.bound = false;
-            }
-            record.service = null;
-        }
-
-        /**
-         * Schedule a delayed retry to communicate with a listener service.
-         * After a maximum number of attempts (with exponential back-off), start
-         * dropping pending tasks for this listener.
-         */
-        private void scheduleListenerRetry(ListenerRecord record) {
-            if (mHandler.hasMessages(MSG_RETRY_LISTENER_QUEUE, record.componentName)) {
-                return;
-            }
-            record.retryCount++;
-            if (record.retryCount > SIDE_CHANNEL_RETRY_MAX_COUNT) {
-                Log.w(TAG, "Giving up on delivering " + record.taskQueue.size() + " tasks to "
-                        + record.componentName + " after " + record.retryCount + " retries");
-                record.taskQueue.clear();
-                return;
-            }
-            int delayMs = SIDE_CHANNEL_RETRY_BASE_INTERVAL_MS * (1 << (record.retryCount - 1));
-            if (Log.isLoggable(TAG, Log.DEBUG)) {
-                Log.d(TAG, "Scheduling retry for " + delayMs + " ms");
-            }
-            Message msg = mHandler.obtainMessage(MSG_RETRY_LISTENER_QUEUE, record.componentName);
-            mHandler.sendMessageDelayed(msg, delayMs);
-        }
-
-        /**
-         * Perform a processing step for a listener. First check the bind state, then attempt
-         * to flush the task queue, and if an error is encountered, schedule a retry.
-         */
-        private void processListenerQueue(ListenerRecord record) {
-            if (Log.isLoggable(TAG, Log.DEBUG)) {
-                Log.d(TAG, "Processing component " + record.componentName + ", "
-                        + record.taskQueue.size() + " queued tasks");
-            }
-            if (record.taskQueue.isEmpty()) {
-                return;
-            }
-            if (!ensureServiceBound(record) || record.service == null) {
-                // Ensure bind has started and that a service interface is ready to use.
-                scheduleListenerRetry(record);
-                return;
-            }
-            // Attempt to flush all items in the task queue.
-            while (true) {
-                Task task = record.taskQueue.peek();
-                if (task == null) {
-                    break;
-                }
-                try {
-                    if (Log.isLoggable(TAG, Log.DEBUG)) {
-                        Log.d(TAG, "Sending task " + task);
-                    }
-                    task.send(record.service);
-                    record.taskQueue.remove();
-                } catch (DeadObjectException e) {
-                    if (Log.isLoggable(TAG, Log.DEBUG)) {
-                        Log.d(TAG, "Remote service has died: " + record.componentName);
-                    }
-                    break;
-                } catch (RemoteException e) {
-                    Log.w(TAG, "RemoteException communicating with " + record.componentName, e);
-                    break;
-                }
-            }
-            if (!record.taskQueue.isEmpty()) {
-                // Some tasks were not sent, meaning an error was encountered, schedule a retry.
-                scheduleListenerRetry(record);
-            }
-        }
-
-        /** A per-side-channel-service listener state record */
-        private static class ListenerRecord {
-            public final ComponentName componentName;
-            /** Whether the service is currently bound to. */
-            public boolean bound = false;
-            /** The service stub provided by onServiceConnected */
-            public INotificationSideChannel service;
-            /** Queue of pending tasks to send to this listener service */
-            public LinkedList<Task> taskQueue = new LinkedList<Task>();
-            /** Number of retries attempted while connecting to this listener service */
-            public int retryCount = 0;
-
-            public ListenerRecord(ComponentName componentName) {
-                this.componentName = componentName;
-            }
-        }
-    }
-
-    private static class ServiceConnectedEvent {
-        final ComponentName componentName;
-        final IBinder iBinder;
-
-        public ServiceConnectedEvent(ComponentName componentName,
-                final IBinder iBinder) {
-            this.componentName = componentName;
-            this.iBinder = iBinder;
-        }
-    }
-
-    private interface Task {
-        public void send(INotificationSideChannel service) throws RemoteException;
-    }
-
-    private static class NotifyTask implements Task {
-        final String packageName;
-        final int id;
-        final String tag;
-        final Notification notif;
-
-        public NotifyTask(String packageName, int id, String tag, Notification notif) {
-            this.packageName = packageName;
-            this.id = id;
-            this.tag = tag;
-            this.notif = notif;
-        }
-
-        @Override
-        public void send(INotificationSideChannel service) throws RemoteException {
-            service.notify(packageName, id, tag, notif);
-        }
-
-        public String toString() {
-            StringBuilder sb = new StringBuilder("NotifyTask[");
-            sb.append("packageName:").append(packageName);
-            sb.append(", id:").append(id);
-            sb.append(", tag:").append(tag);
-            sb.append("]");
-            return sb.toString();
-        }
-    }
-
-    private static class CancelTask implements Task {
-        final String packageName;
-        final int id;
-        final String tag;
-        final boolean all;
-
-        public CancelTask(String packageName) {
-            this.packageName = packageName;
-            this.id = 0;
-            this.tag = null;
-            this.all = true;
-        }
-
-        public CancelTask(String packageName, int id, String tag) {
-            this.packageName = packageName;
-            this.id = id;
-            this.tag = tag;
-            this.all = false;
-        }
-
-        @Override
-        public void send(INotificationSideChannel service) throws RemoteException {
-            if (all) {
-                service.cancelAll(packageName);
-            } else {
-                service.cancel(packageName, id, tag);
-            }
-        }
-
-        public String toString() {
-            StringBuilder sb = new StringBuilder("CancelTask[");
-            sb.append("packageName:").append(packageName);
-            sb.append(", id:").append(id);
-            sb.append(", tag:").append(tag);
-            sb.append(", all:").append(all);
-            sb.append("]");
-            return sb.toString();
-        }
-    }
-}
diff --git a/v4/java/android/support/v4/app/RemoteInput.java b/v4/java/android/support/v4/app/RemoteInput.java
deleted file mode 100644
index eb389d6..0000000
--- a/v4/java/android/support/v4/app/RemoteInput.java
+++ /dev/null
@@ -1,276 +0,0 @@
-/*
- * Copyright (C) 2014 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 android.support.v4.app;
-
-import android.content.Intent;
-import android.os.Build;
-import android.os.Bundle;
-import android.util.Log;
-
-/**
- * Helper for using the {@link android.app.RemoteInput} API
- * introduced after API level 4 in a backwards compatible fashion.
- */
-public final class RemoteInput extends RemoteInputCompatBase.RemoteInput {
-    private static final String TAG = "RemoteInput";
-
-    /** Label used to denote the clip data type used for remote input transport */
-    public static final String RESULTS_CLIP_LABEL = RemoteInputCompatJellybean.RESULTS_CLIP_LABEL;
-
-    /** Extra added to a clip data intent object to hold the results bundle. */
-    public static final String EXTRA_RESULTS_DATA = RemoteInputCompatJellybean.EXTRA_RESULTS_DATA;
-
-    private final String mResultKey;
-    private final CharSequence mLabel;
-    private final CharSequence[] mChoices;
-    private final boolean mAllowFreeFormInput;
-    private final Bundle mExtras;
-
-    private RemoteInput(String resultKey, CharSequence label, CharSequence[] choices,
-            boolean allowFreeFormInput, Bundle extras) {
-        this.mResultKey = resultKey;
-        this.mLabel = label;
-        this.mChoices = choices;
-        this.mAllowFreeFormInput = allowFreeFormInput;
-        this.mExtras = extras;
-    }
-
-    /**
-     * Get the key that the result of this input will be set in from the Bundle returned by
-     * {@link #getResultsFromIntent} when the {@link android.app.PendingIntent} is sent.
-     */
-    public String getResultKey() {
-        return mResultKey;
-    }
-
-    /**
-     * Get the label to display to users when collecting this input.
-     */
-    public CharSequence getLabel() {
-        return mLabel;
-    }
-
-    /**
-     * Get possible input choices. This can be {@code null} if there are no choices to present.
-     */
-    public CharSequence[] getChoices() {
-        return mChoices;
-    }
-
-    /**
-     * Get whether or not users can provide an arbitrary value for
-     * input. If you set this to {@code false}, users must select one of the
-     * choices in {@link #getChoices}. An {@link IllegalArgumentException} is thrown
-     * if you set this to false and {@link #getChoices} returns {@code null} or empty.
-     */
-    public boolean getAllowFreeFormInput() {
-        return mAllowFreeFormInput;
-    }
-
-    /**
-     * Get additional metadata carried around with this remote input.
-     */
-    public Bundle getExtras() {
-        return mExtras;
-    }
-
-    /**
-     * Builder class for {@link android.support.v4.app.RemoteInput} objects.
-     */
-    public static final class Builder {
-        private final String mResultKey;
-        private CharSequence mLabel;
-        private CharSequence[] mChoices;
-        private boolean mAllowFreeFormInput = true;
-        private Bundle mExtras = new Bundle();
-
-        /**
-         * Create a builder object for {@link android.support.v4.app.RemoteInput} objects.
-         * @param resultKey the Bundle key that refers to this input when collected from the user
-         */
-        public Builder(String resultKey) {
-            if (resultKey == null) {
-                throw new IllegalArgumentException("Result key can't be null");
-            }
-            mResultKey = resultKey;
-        }
-
-        /**
-         * Set a label to be displayed to the user when collecting this input.
-         * @param label The label to show to users when they input a response.
-         * @return this object for method chaining
-         */
-        public Builder setLabel(CharSequence label) {
-            mLabel = label;
-            return this;
-        }
-
-        /**
-         * Specifies choices available to the user to satisfy this input.
-         * @param choices an array of pre-defined choices for users input.
-         *        You must provide a non-null and non-empty array if
-         *        you disabled free form input using {@link #setAllowFreeFormInput}.
-         * @return this object for method chaining
-         */
-        public Builder setChoices(CharSequence[] choices) {
-            mChoices = choices;
-            return this;
-        }
-
-        /**
-         * Specifies whether the user can provide arbitrary values.
-         *
-         * @param allowFreeFormInput The default is {@code true}.
-         *         If you specify {@code false}, you must provide a non-null
-         *         and non-empty array to {@link #setChoices} or an
-         *         {@link IllegalArgumentException} is thrown.
-         * @return this object for method chaining
-         */
-        public Builder setAllowFreeFormInput(boolean allowFreeFormInput) {
-            mAllowFreeFormInput = allowFreeFormInput;
-            return this;
-        }
-
-        /**
-         * Merge additional metadata into this builder.
-         *
-         * <p>Values within the Bundle will replace existing extras values in this Builder.
-         *
-         * @see RemoteInput#getExtras
-         */
-        public Builder addExtras(Bundle extras) {
-            if (extras != null) {
-                mExtras.putAll(extras);
-            }
-            return this;
-        }
-
-        /**
-         * Get the metadata Bundle used by this Builder.
-         *
-         * <p>The returned Bundle is shared with this Builder.
-         */
-        public Bundle getExtras() {
-            return mExtras;
-        }
-
-        /**
-         * Combine all of the options that have been set and return a new
-         * {@link android.support.v4.app.RemoteInput} object.
-         */
-        public RemoteInput build() {
-            return new RemoteInput(mResultKey, mLabel, mChoices, mAllowFreeFormInput, mExtras);
-        }
-    }
-
-    /**
-     * Get the remote input results bundle from an intent. The returned Bundle will
-     * contain a key/value for every result key populated by remote input collector.
-     * Use the {@link Bundle#getCharSequence(String)} method to retrieve a value.
-     * @param intent The intent object that fired in response to an action or content intent
-     *               which also had one or more remote input requested.
-     */
-    public static Bundle getResultsFromIntent(Intent intent) {
-        return IMPL.getResultsFromIntent(intent);
-    }
-
-    /**
-     * Populate an intent object with the results gathered from remote input. This method
-     * should only be called by remote input collection services when sending results to a
-     * pending intent.
-     * @param remoteInputs The remote inputs for which results are being provided
-     * @param intent The intent to add remote inputs to. The {@link android.content.ClipData}
-     *               field of the intent will be modified to contain the results.
-     * @param results A bundle holding the remote input results. This bundle should
-     *                be populated with keys matching the result keys specified in
-     *                {@code remoteInputs} with values being the result per key.
-     */
-    public static void addResultsToIntent(RemoteInput[] remoteInputs, Intent intent,
-            Bundle results) {
-        IMPL.addResultsToIntent(remoteInputs, intent, results);
-    }
-
-    private static final Impl IMPL;
-
-    interface Impl {
-        Bundle getResultsFromIntent(Intent intent);
-        void addResultsToIntent(RemoteInput[] remoteInputs, Intent intent,
-                Bundle results);
-    }
-
-    static class ImplBase implements Impl {
-        @Override
-        public Bundle getResultsFromIntent(Intent intent) {
-            Log.w(TAG, "RemoteInput is only supported from API Level 16");
-            return null;
-        }
-
-        @Override
-        public void addResultsToIntent(RemoteInput[] remoteInputs, Intent intent, Bundle results) {
-            Log.w(TAG, "RemoteInput is only supported from API Level 16");
-        }
-    }
-
-    static class ImplJellybean implements Impl {
-        @Override
-        public Bundle getResultsFromIntent(Intent intent) {
-            return RemoteInputCompatJellybean.getResultsFromIntent(intent);
-        }
-
-        @Override
-        public void addResultsToIntent(RemoteInput[] remoteInputs, Intent intent, Bundle results) {
-            RemoteInputCompatJellybean.addResultsToIntent(remoteInputs, intent, results);
-        }
-    }
-
-    static class ImplApi20 implements Impl {
-        @Override
-        public Bundle getResultsFromIntent(Intent intent) {
-            return RemoteInputCompatApi20.getResultsFromIntent(intent);
-        }
-
-        @Override
-        public void addResultsToIntent(RemoteInput[] remoteInputs, Intent intent, Bundle results) {
-            RemoteInputCompatApi20.addResultsToIntent(remoteInputs, intent, results);
-        }
-    }
-
-    static {
-        if (Build.VERSION.SDK_INT >= 20) {
-            IMPL = new ImplApi20();
-        } else if (Build.VERSION.SDK_INT >= 16) {
-            IMPL = new ImplJellybean();
-        } else {
-            IMPL = new ImplBase();
-        }
-    }
-
-    /** @hide */
-    public static final Factory FACTORY = new Factory() {
-        @Override
-        public RemoteInput build(String resultKey,
-                CharSequence label, CharSequence[] choices, boolean allowFreeFormInput,
-                Bundle extras) {
-            return new RemoteInput(resultKey, label, choices, allowFreeFormInput, extras);
-        }
-
-        @Override
-        public RemoteInput[] newArray(int size) {
-            return new RemoteInput[size];
-        }
-    };
-}
diff --git a/v4/java/android/support/v4/app/ShareCompat.java b/v4/java/android/support/v4/app/ShareCompat.java
deleted file mode 100644
index caa2a13..0000000
--- a/v4/java/android/support/v4/app/ShareCompat.java
+++ /dev/null
@@ -1,959 +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 android.support.v4.app;
-
-import android.app.Activity;
-import android.content.ComponentName;
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.content.pm.PackageManager.NameNotFoundException;
-import android.graphics.drawable.Drawable;
-import android.net.Uri;
-import android.os.Build;
-import android.support.annotation.StringRes;
-import android.support.v4.content.IntentCompat;
-import android.support.v4.view.MenuItemCompat;
-import android.text.Html;
-import android.text.Spanned;
-import android.util.Log;
-import android.view.Menu;
-import android.view.MenuItem;
-
-import java.util.ArrayList;
-
-/**
- * Extra helper functionality for sharing data between activities.
- *
- * ShareCompat provides functionality to extend the {@link Intent#ACTION_SEND}/
- * {@link Intent#ACTION_SEND_MULTIPLE} protocol and support retrieving more info
- * about the activity that invoked a social sharing action.
- *
- * {@link IntentBuilder} provides helper functions for constructing a sharing
- * intent that always includes data about the calling activity and app.
- * This lets the called activity provide attribution for the app that shared
- * content. Constructing an intent this way can be done in a method-chaining style.
- * To obtain an IntentBuilder with info about your calling activity, use the static
- * method {@link IntentBuilder#from(Activity)}.
- *
- * {@link IntentReader} provides helper functions for parsing the defined extras
- * within an {@link Intent#ACTION_SEND} or {@link Intent#ACTION_SEND_MULTIPLE} intent
- * used to launch an activity. You can also obtain a Drawable for the caller's
- * application icon and the application's localized label (the app's human-readable name).
- * Social apps that enable sharing content are encouraged to use this information
- * to call out the app that the content was shared from.
- */
-public final class ShareCompat {
-    /**
-     * Intent extra that stores the name of the calling package for an ACTION_SEND intent.
-     * When an activity is started using startActivityForResult this is redundant info.
-     * (It is also provided by {@link Activity#getCallingPackage()}.)
-     *
-     * Instead of using this constant directly, consider using {@link #getCallingPackage(Activity)}
-     * or {@link IntentReader#getCallingPackage()}.
-     */
-    public static final String EXTRA_CALLING_PACKAGE =
-            "android.support.v4.app.EXTRA_CALLING_PACKAGE";
-
-    /**
-     * Intent extra that stores the {@link ComponentName} of the calling activity for
-     * an ACTION_SEND intent.
-     */
-    public static final String EXTRA_CALLING_ACTIVITY =
-            "android.support.v4.app.EXTRA_CALLING_ACTIVITY";
-
-    /**
-     * Compatibility shims for sharing operations
-     */
-    interface ShareCompatImpl {
-        void configureMenuItem(MenuItem item, IntentBuilder shareIntent);
-        String escapeHtml(CharSequence text);
-    }
-
-    static class ShareCompatImplBase implements ShareCompatImpl {
-        public void configureMenuItem(MenuItem item, IntentBuilder shareIntent) {
-            item.setIntent(shareIntent.createChooserIntent());
-        }
-
-        public String escapeHtml(CharSequence text) {
-            StringBuilder out = new StringBuilder();
-            withinStyle(out, text, 0, text.length());
-            return out.toString();
-        }
-
-        private static void withinStyle(StringBuilder out, CharSequence text,
-                int start, int end) {
-            for (int i = start; i < end; i++) {
-                char c = text.charAt(i);
-
-                if (c == '<') {
-                    out.append("&lt;");
-                } else if (c == '>') {
-                    out.append("&gt;");
-                } else if (c == '&') {
-                    out.append("&amp;");
-                } else if (c > 0x7E || c < ' ') {
-                    out.append("&#" + ((int) c) + ";");
-                } else if (c == ' ') {
-                    while (i + 1 < end && text.charAt(i + 1) == ' ') {
-                        out.append("&nbsp;");
-                        i++;
-                    }
-
-                    out.append(' ');
-                } else {
-                    out.append(c);
-                }
-            }
-        }
-    }
-
-    static class ShareCompatImplICS extends ShareCompatImplBase {
-        public void configureMenuItem(MenuItem item, IntentBuilder shareIntent) {
-            ShareCompatICS.configureMenuItem(item, shareIntent.getActivity(),
-                    shareIntent.getIntent());
-            if (shouldAddChooserIntent(item)) {
-                item.setIntent(shareIntent.createChooserIntent());
-            }
-        }
-
-        boolean shouldAddChooserIntent(MenuItem item) {
-            return !item.hasSubMenu();
-        }
-    }
-
-    static class ShareCompatImplJB extends ShareCompatImplICS {
-        public String escapeHtml(CharSequence html) {
-            return ShareCompatJB.escapeHtml(html);
-        }
-
-        @Override
-        boolean shouldAddChooserIntent(MenuItem item) {
-            return false;
-        }
-    }
-
-    private static ShareCompatImpl IMPL;
-
-    static {
-        if (Build.VERSION.SDK_INT >= 16) {
-            IMPL = new ShareCompatImplJB();
-        } else if (Build.VERSION.SDK_INT >= 14) {
-            IMPL = new ShareCompatImplICS();
-        } else {
-            IMPL = new ShareCompatImplBase();
-        }
-    }
-
-    private ShareCompat() {}
-
-    /**
-     * Retrieve the name of the package that launched calledActivity from a share intent.
-     * Apps that provide social sharing functionality can use this to provide attribution
-     * for the app that shared the content.
-     *
-     * <p><em>Note:</em> This data may have been provided voluntarily by the calling
-     * application. As such it should not be trusted for accuracy in the context of
-     * security or verification.</p>
-     *
-     * @param calledActivity Current activity that was launched to share content
-     * @return Name of the calling package
-     */
-    public static String getCallingPackage(Activity calledActivity) {
-        String result = calledActivity.getCallingPackage();
-        if (result == null) {
-            result = calledActivity.getIntent().getStringExtra(EXTRA_CALLING_PACKAGE);
-        }
-        return result;
-    }
-
-    /**
-     * Retrieve the ComponentName of the activity that launched calledActivity from a share intent.
-     * Apps that provide social sharing functionality can use this to provide attribution
-     * for the app that shared the content.
-     *
-     * <p><em>Note:</em> This data may have been provided voluntarily by the calling
-     * application. As such it should not be trusted for accuracy in the context of
-     * security or verification.</p>
-     *
-     * @param calledActivity Current activity that was launched to share content
-     * @return ComponentName of the calling activity
-     */
-    public static ComponentName getCallingActivity(Activity calledActivity) {
-        ComponentName result = calledActivity.getCallingActivity();
-        if (result == null) {
-            result = calledActivity.getIntent().getParcelableExtra(EXTRA_CALLING_ACTIVITY);
-        }
-        return result;
-    }
-
-    /**
-     * Configure a {@link MenuItem} to act as a sharing action.
-     *
-     * <p>If the app is running on API level 14 or higher (Android 4.0/Ice Cream Sandwich)
-     * this method will configure a ShareActionProvider to provide a more robust UI
-     * for selecting the target of the share. History will be tracked for each calling
-     * activity in a file named with the prefix ".sharecompat_" in the application's
-     * private data directory. If the application wishes to set this MenuItem to show
-     * as an action in the Action Bar it should use
-     * {@link MenuItemCompat#setShowAsAction(MenuItem, int)} to request that behavior
-     * in addition to calling this method.</p>
-     *
-     * <p>If the app is running on an older platform version this method will configure
-     * a standard activity chooser dialog for the menu item.</p>
-     *
-     * <p>During the calling activity's lifecycle, if data within the share intent must
-     * change the app should change that state in one of several ways:</p>
-     * <ul>
-     * <li>Call {@link ActivityCompat#invalidateOptionsMenu(Activity)}. If the app is running
-     * on API level 11 or above and uses the Action Bar its menu will be recreated and rebuilt.
-     * If not, the activity will receive a call to {@link Activity#onPrepareOptionsMenu(Menu)}
-     * the next time the user presses the menu key to open the options menu panel. The activity
-     * can then call configureMenuItem again with a new or altered IntentBuilder to reconfigure
-     * the share menu item.</li>
-     * <li>Keep a reference to the MenuItem object for the share item once it has been created
-     * and call configureMenuItem to update the associated sharing intent as needed.</li>
-     * </ul>
-     *
-     * @param item MenuItem to configure for sharing
-     * @param shareIntent IntentBuilder with data about the content to share
-     */
-    public static void configureMenuItem(MenuItem item, IntentBuilder shareIntent) {
-        IMPL.configureMenuItem(item, shareIntent);
-    }
-
-    /**
-     * Configure a menu item to act as a sharing action.
-     *
-     * @param menu Menu containing the item to use for sharing
-     * @param menuItemId ID of the share item within menu
-     * @param shareIntent IntentBuilder with data about the content to share
-     * @see #configureMenuItem(MenuItem, IntentBuilder)
-     */
-    public static void configureMenuItem(Menu menu, int menuItemId, IntentBuilder shareIntent) {
-        MenuItem item = menu.findItem(menuItemId);
-        if (item == null) {
-            throw new IllegalArgumentException("Could not find menu item with id " + menuItemId +
-                    " in the supplied menu");
-        }
-        configureMenuItem(item, shareIntent);
-    }
-
-    /**
-     * IntentBuilder is a helper for constructing {@link Intent#ACTION_SEND} and
-     * {@link Intent#ACTION_SEND_MULTIPLE} sharing intents and starting activities
-     * to share content. The ComponentName and package name of the calling activity
-     * will be included.
-     */
-    public static class IntentBuilder {
-        private Activity mActivity;
-        private Intent mIntent;
-        private CharSequence mChooserTitle;
-        private ArrayList<String> mToAddresses;
-        private ArrayList<String> mCcAddresses;
-        private ArrayList<String> mBccAddresses;
-
-        private ArrayList<Uri> mStreams;
-
-        /**
-         * Create a new IntentBuilder for launching a sharing action from launchingActivity.
-         *
-         * @param launchingActivity Activity that the share will be launched from
-         * @return a new IntentBuilder instance
-         */
-        public static IntentBuilder from(Activity launchingActivity) {
-            return new IntentBuilder(launchingActivity);
-        }
-
-        private IntentBuilder(Activity launchingActivity) {
-            mActivity = launchingActivity;
-            mIntent = new Intent().setAction(Intent.ACTION_SEND);
-            mIntent.putExtra(EXTRA_CALLING_PACKAGE, launchingActivity.getPackageName());
-            mIntent.putExtra(EXTRA_CALLING_ACTIVITY, launchingActivity.getComponentName());
-            mIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
-        }
-
-        /**
-         * Retrieve the Intent as configured so far by the IntentBuilder. This Intent
-         * is suitable for use in a ShareActionProvider or chooser dialog.
-         *
-         * <p>To create an intent that will launch the activity chooser so that the user
-         * may select a target for the share, see {@link #createChooserIntent()}.
-         *
-         * @return The current Intent being configured by this builder
-         */
-        public Intent getIntent() {
-            if (mToAddresses != null) {
-                combineArrayExtra(Intent.EXTRA_EMAIL, mToAddresses);
-                mToAddresses = null;
-            }
-            if (mCcAddresses != null) {
-                combineArrayExtra(Intent.EXTRA_CC, mCcAddresses);
-                mCcAddresses = null;
-            }
-            if (mBccAddresses != null) {
-                combineArrayExtra(Intent.EXTRA_BCC, mBccAddresses);
-                mBccAddresses = null;
-            }
-
-            // Check if we need to change the action.
-            boolean needsSendMultiple = mStreams != null && mStreams.size() > 1;
-            boolean isSendMultiple = mIntent.getAction().equals(Intent.ACTION_SEND_MULTIPLE);
-
-            if (!needsSendMultiple && isSendMultiple) {
-                // Change back to a single send action; place the first stream into the
-                // intent for single sharing.
-                mIntent.setAction(Intent.ACTION_SEND);
-                if (mStreams != null && !mStreams.isEmpty()) {
-                    mIntent.putExtra(Intent.EXTRA_STREAM, mStreams.get(0));
-                } else {
-                    mIntent.removeExtra(Intent.EXTRA_STREAM);
-                }
-                mStreams = null;
-            }
-
-            if (needsSendMultiple && !isSendMultiple) {
-                // Change to a multiple send action; place the relevant ArrayList into the
-                // intent for multiple sharing.
-                mIntent.setAction(Intent.ACTION_SEND_MULTIPLE);
-                if (mStreams != null && !mStreams.isEmpty()) {
-                    mIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, mStreams);
-                } else {
-                    mIntent.removeExtra(Intent.EXTRA_STREAM);
-                }
-            }
-
-            return mIntent;
-        }
-
-        Activity getActivity() {
-            return mActivity;
-        }
-
-        private void combineArrayExtra(String extra, ArrayList<String> add) {
-            String[] currentAddresses = mIntent.getStringArrayExtra(extra);
-            int currentLength = currentAddresses != null ? currentAddresses.length : 0;
-            String[] finalAddresses = new String[currentLength + add.size()];
-            add.toArray(finalAddresses);
-            if (currentAddresses != null) {
-                System.arraycopy(currentAddresses, 0, finalAddresses, add.size(), currentLength);
-            }
-            mIntent.putExtra(extra, finalAddresses);
-        }
-
-        private void combineArrayExtra(String extra, String[] add) {
-            // Add any items still pending
-            Intent intent = getIntent();
-            String[] old = intent.getStringArrayExtra(extra);
-            int oldLength = old != null ? old.length : 0;
-            String[] result = new String[oldLength + add.length];
-            if (old != null) System.arraycopy(old, 0, result, 0, oldLength);
-            System.arraycopy(add, 0, result, oldLength, add.length);
-            intent.putExtra(extra, result);
-        }
-
-        /**
-         * Create an Intent that will launch the standard Android activity chooser,
-         * allowing the user to pick what activity/app on the system should handle
-         * the share.
-         *
-         * @return A chooser Intent for the currently configured sharing action
-         */
-        public Intent createChooserIntent() {
-            return Intent.createChooser(getIntent(), mChooserTitle);
-        }
-
-        /**
-         * Start a chooser activity for the current share intent.
-         *
-         * <p>Note that under most circumstances you should use
-         * {@link ShareCompat#configureMenuItem(MenuItem, IntentBuilder)
-         *  ShareCompat.configureMenuItem()} to add a Share item to the menu while
-         * presenting a detail view of the content to be shared instead
-         * of invoking this directly.</p>
-         */
-        public void startChooser() {
-            mActivity.startActivity(createChooserIntent());
-        }
-
-        /**
-         * Set the title that will be used for the activity chooser for this share.
-         *
-         * @param title Title string
-         * @return This IntentBuilder for method chaining
-         */
-        public IntentBuilder setChooserTitle(CharSequence title) {
-            mChooserTitle = title;
-            return this;
-        }
-
-        /**
-         * Set the title that will be used for the activity chooser for this share.
-         *
-         * @param resId Resource ID of the title string to use
-         * @return This IntentBuilder for method chaining
-         */
-        public IntentBuilder setChooserTitle(@StringRes int resId) {
-            return setChooserTitle(mActivity.getText(resId));
-        }
-
-        /**
-         * Set the type of data being shared
-         *
-         * @param mimeType mimetype of the shared data
-         * @return This IntentBuilder for method chaining
-         * @see Intent#setType(String)
-         */
-        public IntentBuilder setType(String mimeType) {
-            mIntent.setType(mimeType);
-            return this;
-        }
-
-        /**
-         * Set the literal text data to be sent as part of the share.
-         * This may be a styled CharSequence.
-         *
-         * @param text Text to share
-         * @return This IntentBuilder for method chaining
-         * @see Intent#EXTRA_TEXT
-         */
-        public IntentBuilder setText(CharSequence text) {
-            mIntent.putExtra(Intent.EXTRA_TEXT, text);
-            return this;
-        }
-
-        /**
-         * Set an HTML string to be sent as part of the share.
-         * If {@link Intent#EXTRA_TEXT EXTRA_TEXT} has not already been supplied,
-         * a styled version of the supplied HTML text will be added as EXTRA_TEXT as
-         * parsed by {@link android.text.Html#fromHtml(String) Html.fromHtml}.
-         *
-         * @param htmlText A string containing HTML markup as a richer version of the text
-         *                 provided by EXTRA_TEXT.
-         * @return This IntentBuilder for method chaining
-         * @see #setText(CharSequence)
-         */
-        public IntentBuilder setHtmlText(String htmlText) {
-            mIntent.putExtra(IntentCompat.EXTRA_HTML_TEXT, htmlText);
-            if (!mIntent.hasExtra(Intent.EXTRA_TEXT)) {
-                // Supply a default if EXTRA_TEXT isn't set
-                setText(Html.fromHtml(htmlText));
-            }
-            return this;
-        }
-
-        /**
-         * Set a stream URI to the data that should be shared.
-         *
-         * <p>This replaces all currently set stream URIs and will produce a single-stream
-         * ACTION_SEND intent.</p>
-         *
-         * @param streamUri URI of the stream to share
-         * @return This IntentBuilder for method chaining
-         * @see Intent#EXTRA_STREAM
-         */
-        public IntentBuilder setStream(Uri streamUri) {
-            if (!mIntent.getAction().equals(Intent.ACTION_SEND)) {
-                mIntent.setAction(Intent.ACTION_SEND);
-            }
-            mStreams = null;
-            mIntent.putExtra(Intent.EXTRA_STREAM, streamUri);
-            return this;
-        }
-
-        /**
-         * Add a stream URI to the data that should be shared. If this is not the first
-         * stream URI added the final intent constructed will become an ACTION_SEND_MULTIPLE
-         * intent. Not all apps will handle both ACTION_SEND and ACTION_SEND_MULTIPLE.
-         *
-         * @param streamUri URI of the stream to share
-         * @return This IntentBuilder for method chaining
-         * @see Intent#EXTRA_STREAM
-         * @see Intent#ACTION_SEND
-         * @see Intent#ACTION_SEND_MULTIPLE
-         */
-        public IntentBuilder addStream(Uri streamUri) {
-            Uri currentStream = mIntent.getParcelableExtra(Intent.EXTRA_STREAM);
-            if (mStreams == null && currentStream == null) {
-                return setStream(streamUri);
-            }
-            if (mStreams == null) {
-                mStreams = new ArrayList<Uri>();
-            }
-            if (currentStream != null) {
-                mIntent.removeExtra(Intent.EXTRA_STREAM);
-                mStreams.add(currentStream);
-            }
-            mStreams.add(streamUri);
-            return this;
-        }
-
-        /**
-         * Set an array of email addresses as recipients of this share.
-         * This replaces all current "to" recipients that have been set so far.
-         *
-         * @param addresses Email addresses to send to
-         * @return This IntentBuilder for method chaining
-         * @see Intent#EXTRA_EMAIL
-         */
-        public IntentBuilder setEmailTo(String[] addresses) {
-            if (mToAddresses != null) {
-                mToAddresses = null;
-            }
-            mIntent.putExtra(Intent.EXTRA_EMAIL, addresses);
-            return this;
-        }
-
-        /**
-         * Add an email address to be used in the "to" field of the final Intent.
-         *
-         * @param address Email address to send to
-         * @return This IntentBuilder for method chaining
-         * @see Intent#EXTRA_EMAIL
-         */
-        public IntentBuilder addEmailTo(String address) {
-            if (mToAddresses == null) {
-                mToAddresses = new ArrayList<String>();
-            }
-            mToAddresses.add(address);
-            return this;
-        }
-
-        /**
-         * Add an array of email addresses to be used in the "to" field of the final Intent.
-         *
-         * @param addresses Email addresses to send to
-         * @return This IntentBuilder for method chaining
-         * @see Intent#EXTRA_EMAIL
-         */
-        public IntentBuilder addEmailTo(String[] addresses) {
-            combineArrayExtra(Intent.EXTRA_EMAIL, addresses);
-            return this;
-        }
-
-        /**
-         * Set an array of email addresses to CC on this share.
-         * This replaces all current "CC" recipients that have been set so far.
-         *
-         * @param addresses Email addresses to CC on the share
-         * @return This IntentBuilder for method chaining
-         * @see Intent#EXTRA_CC
-         */
-        public IntentBuilder setEmailCc(String[] addresses) {
-            mIntent.putExtra(Intent.EXTRA_CC, addresses);
-            return this;
-        }
-
-        /**
-         * Add an email address to be used in the "cc" field of the final Intent.
-         *
-         * @param address Email address to CC
-         * @return This IntentBuilder for method chaining
-         * @see Intent#EXTRA_CC
-         */
-        public IntentBuilder addEmailCc(String address) {
-            if (mCcAddresses == null) {
-                mCcAddresses = new ArrayList<String>();
-            }
-            mCcAddresses.add(address);
-            return this;
-        }
-
-        /**
-         * Add an array of email addresses to be used in the "cc" field of the final Intent.
-         *
-         * @param addresses Email addresses to CC
-         * @return This IntentBuilder for method chaining
-         * @see Intent#EXTRA_CC
-         */
-        public IntentBuilder addEmailCc(String[] addresses) {
-            combineArrayExtra(Intent.EXTRA_CC, addresses);
-            return this;
-        }
-
-        /**
-         * Set an array of email addresses to BCC on this share.
-         * This replaces all current "BCC" recipients that have been set so far.
-         *
-         * @param addresses Email addresses to BCC on the share
-         * @return This IntentBuilder for method chaining
-         * @see Intent#EXTRA_BCC
-         */
-        public IntentBuilder setEmailBcc(String[] addresses) {
-            mIntent.putExtra(Intent.EXTRA_BCC, addresses);
-            return this;
-        }
-
-        /**
-         * Add an email address to be used in the "bcc" field of the final Intent.
-         *
-         * @param address Email address to BCC
-         * @return This IntentBuilder for method chaining
-         * @see Intent#EXTRA_BCC
-         */
-        public IntentBuilder addEmailBcc(String address) {
-            if (mBccAddresses == null) {
-                mBccAddresses = new ArrayList<String>();
-            }
-            mBccAddresses.add(address);
-            return this;
-        }
-
-        /**
-         * Add an array of email addresses to be used in the "bcc" field of the final Intent.
-         *
-         * @param addresses Email addresses to BCC
-         * @return This IntentBuilder for method chaining
-         * @see Intent#EXTRA_BCC
-         */
-        public IntentBuilder addEmailBcc(String[] addresses) {
-            combineArrayExtra(Intent.EXTRA_BCC, addresses);
-            return this;
-        }
-
-        /**
-         * Set a subject heading for this share; useful for sharing via email.
-         *
-         * @param subject Subject heading for this share
-         * @return This IntentBuilder for method chaining
-         * @see Intent#EXTRA_SUBJECT
-         */
-        public IntentBuilder setSubject(String subject) {
-            mIntent.putExtra(Intent.EXTRA_SUBJECT, subject);
-            return this;
-        }
-    }
-
-    /**
-     * IntentReader is a helper for reading the data contained within a sharing (ACTION_SEND)
-     * Intent. It provides methods to parse standard elements included with a share
-     * in addition to extra metadata about the app that shared the content.
-     *
-     * <p>Social sharing apps are encouraged to provide attribution for the app that shared
-     * the content. IntentReader offers access to the application label, calling activity info,
-     * and application icon of the app that shared the content. This data may have been provided
-     * voluntarily by the calling app and should always be displayed to the user before submission
-     * for manual verification. The user should be offered the option to omit this information
-     * from shared posts if desired.</p>
-     *
-     * <p>Activities that intend to receive sharing intents should configure an intent-filter
-     * to accept {@link Intent#ACTION_SEND} intents ("android.intent.action.SEND") and optionally
-     * accept {@link Intent#ACTION_SEND_MULTIPLE} ("android.intent.action.SEND_MULTIPLE") if
-     * the activity is equipped to handle multiple data streams.</p>
-     */
-    public static class IntentReader {
-        private static final String TAG = "IntentReader";
-
-        private Activity mActivity;
-        private Intent mIntent;
-        private String mCallingPackage;
-        private ComponentName mCallingActivity;
-
-        private ArrayList<Uri> mStreams;
-
-        /**
-         * Get an IntentReader for parsing and interpreting the sharing intent
-         * used to start the given activity.
-         *
-         * @param activity Activity that was started to share content
-         * @return IntentReader for parsing sharing data
-         */
-        public static IntentReader from(Activity activity) {
-            return new IntentReader(activity);
-        }
-
-        private IntentReader(Activity activity) {
-            mActivity = activity;
-            mIntent = activity.getIntent();
-            mCallingPackage = ShareCompat.getCallingPackage(activity);
-            mCallingActivity = ShareCompat.getCallingActivity(activity);
-        }
-
-        /**
-         * Returns true if the activity this reader was obtained for was
-         * started with an {@link Intent#ACTION_SEND} or {@link Intent#ACTION_SEND_MULTIPLE}
-         * sharing Intent.
-         *
-         * @return true if the activity was started with an ACTION_SEND
-         *         or ACTION_SEND_MULTIPLE Intent
-         */
-        public boolean isShareIntent() {
-            final String action = mIntent.getAction();
-            return Intent.ACTION_SEND.equals(action) || Intent.ACTION_SEND_MULTIPLE.equals(action);
-        }
-
-        /**
-         * Returns true if the activity this reader was obtained for was started with an
-         * {@link Intent#ACTION_SEND} intent and contains a single shared item.
-         * The shared content should be obtained using either the {@link #getText()}
-         * or {@link #getStream()} methods depending on the type of content shared.
-         *
-         * @return true if the activity was started with an ACTION_SEND intent
-         */
-        public boolean isSingleShare() {
-            return Intent.ACTION_SEND.equals(mIntent.getAction());
-        }
-
-        /**
-         * Returns true if the activity this reader was obtained for was started with an
-         * {@link Intent#ACTION_SEND_MULTIPLE} intent. The Intent may contain more than
-         * one stream item.
-         *
-         * @return true if the activity was started with an ACTION_SEND_MULTIPLE intent
-         */
-        public boolean isMultipleShare() {
-            return Intent.ACTION_SEND_MULTIPLE.equals(mIntent.getAction());
-        }
-
-        /**
-         * Get the mimetype of the data shared to this activity.
-         *
-         * @return mimetype of the shared data
-         * @see Intent#getType()
-         */
-        public String getType() {
-            return mIntent.getType();
-        }
-
-        /**
-         * Get the literal text shared with the target activity.
-         *
-         * @return Literal shared text or null if none was supplied
-         * @see Intent#EXTRA_TEXT
-         */
-        public CharSequence getText() {
-            return mIntent.getCharSequenceExtra(Intent.EXTRA_TEXT);
-        }
-
-        /**
-         * Get the styled HTML text shared with the target activity.
-         * If no HTML text was supplied but {@link Intent#EXTRA_TEXT} contained
-         * styled text, it will be converted to HTML if possible and returned.
-         * If the text provided by {@link Intent#EXTRA_TEXT} was not styled text,
-         * it will be escaped by {@link android.text.Html#escapeHtml(CharSequence)}
-         * and returned. If no text was provided at all, this method will return null.
-         *
-         * @return Styled text provided by the sender as HTML.
-         */
-        public String getHtmlText() {
-            String result = mIntent.getStringExtra(IntentCompat.EXTRA_HTML_TEXT);
-            if (result == null) {
-                CharSequence text = getText();
-                if (text instanceof Spanned) {
-                    result = Html.toHtml((Spanned) text);
-                } else if (text != null) {
-                    result = IMPL.escapeHtml(text);
-                }
-            }
-            return result;
-        }
-
-        /**
-         * Get a URI referring to a data stream shared with the target activity.
-         *
-         * <p>This call will fail if the share intent contains multiple stream items.
-         * If {@link #isMultipleShare()} returns true the application should use
-         * {@link #getStream(int)} and {@link #getStreamCount()} to retrieve the
-         * included stream items.</p>
-         *
-         * @return A URI referring to a data stream to be shared or null if one was not supplied
-         * @see Intent#EXTRA_STREAM
-         */
-        public Uri getStream() {
-            return mIntent.getParcelableExtra(Intent.EXTRA_STREAM);
-        }
-
-        /**
-         * Get the URI of a stream item shared with the target activity.
-         * Index should be in the range [0-getStreamCount()).
-         *
-         * @param index Index of text item to retrieve
-         * @return Requested stream item URI
-         * @see Intent#EXTRA_STREAM
-         * @see Intent#ACTION_SEND_MULTIPLE
-         */
-        public Uri getStream(int index) {
-            if (mStreams == null && isMultipleShare()) {
-                mStreams = mIntent.getParcelableArrayListExtra(Intent.EXTRA_STREAM);
-            }
-            if (mStreams != null) {
-                return mStreams.get(index);
-            }
-            if (index == 0) {
-                return mIntent.getParcelableExtra(Intent.EXTRA_STREAM);
-            }
-            throw new IndexOutOfBoundsException("Stream items available: " + getStreamCount() +
-                    " index requested: " + index);
-        }
-
-        /**
-         * Return the number of stream items shared. The return value will be 0 or 1 if
-         * this was an {@link Intent#ACTION_SEND} intent, or 0 or more if it was an
-         * {@link Intent#ACTION_SEND_MULTIPLE} intent.
-         *
-         * @return Count of text items contained within the Intent
-         */
-        public int getStreamCount() {
-            if (mStreams == null && isMultipleShare()) {
-                mStreams = mIntent.getParcelableArrayListExtra(Intent.EXTRA_STREAM);
-            }
-            if (mStreams != null) {
-                return mStreams.size();
-            }
-            return mIntent.hasExtra(Intent.EXTRA_STREAM) ? 1 : 0;
-        }
-
-        /**
-         * Get an array of Strings, each an email address to share to.
-         *
-         * @return An array of email addresses or null if none were supplied.
-         * @see Intent#EXTRA_EMAIL
-         */
-        public String[] getEmailTo() {
-            return mIntent.getStringArrayExtra(Intent.EXTRA_EMAIL);
-        }
-
-        /**
-         * Get an array of Strings, each an email address to CC on this share.
-         *
-         * @return An array of email addresses or null if none were supplied.
-         * @see Intent#EXTRA_CC
-         */
-        public String[] getEmailCc() {
-            return mIntent.getStringArrayExtra(Intent.EXTRA_CC);
-        }
-
-        /**
-         * Get an array of Strings, each an email address to BCC on this share.
-         *
-         * @return An array of email addresses or null if none were supplied.
-         * @see Intent#EXTRA_BCC
-         */
-        public String[] getEmailBcc() {
-            return mIntent.getStringArrayExtra(Intent.EXTRA_BCC);
-        }
-
-        /**
-         * Get a subject heading for this share; useful when sharing via email.
-         *
-         * @return The subject heading for this share or null if one was not supplied.
-         * @see Intent#EXTRA_SUBJECT
-         */
-        public String getSubject() {
-            return mIntent.getStringExtra(Intent.EXTRA_SUBJECT);
-        }
-
-        /**
-         * Get the name of the package that invoked this sharing intent. If the activity
-         * was not started for a result, IntentBuilder will read this from extra metadata placed
-         * in the Intent by ShareBuilder.
-         *
-         * <p><em>Note:</em> This data may have been provided voluntarily by the calling
-         * application. As such it should not be trusted for accuracy in the context of
-         * security or verification.</p>
-         *
-         * @return Name of the package that started this activity or null if unknown
-         * @see Activity#getCallingPackage()
-         * @see ShareCompat#EXTRA_CALLING_PACKAGE
-         */
-        public String getCallingPackage() {
-            return mCallingPackage;
-        }
-
-        /**
-         * Get the {@link ComponentName} of the Activity that invoked this sharing intent.
-         * If the target sharing activity was not started for a result, IntentBuilder will read
-         * this from extra metadata placed in the intent by ShareBuilder.
-         *
-         * <p><em>Note:</em> This data may have been provided voluntarily by the calling
-         * application. As such it should not be trusted for accuracy in the context of
-         * security or verification.</p>
-         *
-         * @return ComponentName of the calling Activity or null if unknown
-         * @see Activity#getCallingActivity()
-         * @see ShareCompat#EXTRA_CALLING_ACTIVITY
-         */
-        public ComponentName getCallingActivity() {
-            return mCallingActivity;
-        }
-
-        /**
-         * Get the icon of the calling activity as a Drawable if data about
-         * the calling activity is available.
-         *
-         * <p><em>Note:</em> This data may have been provided voluntarily by the calling
-         * application. As such it should not be trusted for accuracy in the context of
-         * security or verification.</p>
-         *
-         * @return The calling Activity's icon or null if unknown
-         */
-        public Drawable getCallingActivityIcon() {
-            if (mCallingActivity == null) return null;
-
-            PackageManager pm = mActivity.getPackageManager();
-            try {
-                return pm.getActivityIcon(mCallingActivity);
-            } catch (NameNotFoundException e) {
-                Log.e(TAG, "Could not retrieve icon for calling activity", e);
-            }
-            return null;
-        }
-
-        /**
-         * Get the icon of the calling application as a Drawable if data
-         * about the calling package is available.
-         *
-         * <p><em>Note:</em> This data may have been provided voluntarily by the calling
-         * application. As such it should not be trusted for accuracy in the context of
-         * security or verification.</p>
-         *
-         * @return The calling application's icon or null if unknown
-         */
-        public Drawable getCallingApplicationIcon() {
-            if (mCallingPackage == null) return null;
-
-            PackageManager pm = mActivity.getPackageManager();
-            try {
-                return pm.getApplicationIcon(mCallingPackage);
-            } catch (NameNotFoundException e) {
-                Log.e(TAG, "Could not retrieve icon for calling application", e);
-            }
-            return null;
-        }
-
-        /**
-         * Get the human-readable label (title) of the calling application if
-         * data about the calling package is available.
-         *
-         * <p><em>Note:</em> This data may have been provided voluntarily by the calling
-         * application. As such it should not be trusted for accuracy in the context of
-         * security or verification.</p>
-         *
-         * @return The calling application's label or null if unknown
-         */
-        public CharSequence getCallingApplicationLabel() {
-            if (mCallingPackage == null) return null;
-
-            PackageManager pm = mActivity.getPackageManager();
-            try {
-                return pm.getApplicationLabel(pm.getApplicationInfo(mCallingPackage, 0));
-            } catch (NameNotFoundException e) {
-                Log.e(TAG, "Could not retrieve label for calling application", e);
-            }
-            return null;
-        }
-    }
-}
diff --git a/v4/java/android/support/v4/app/SharedElementCallback.java b/v4/java/android/support/v4/app/SharedElementCallback.java
deleted file mode 100644
index 8beb29d..0000000
--- a/v4/java/android/support/v4/app/SharedElementCallback.java
+++ /dev/null
@@ -1,284 +0,0 @@
-/*
- * Copyright (C) 2014 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 android.support.v4.app;
-
-import android.content.Context;
-import android.content.res.Resources;
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
-import android.graphics.Matrix;
-import android.graphics.Rect;
-import android.graphics.RectF;
-import android.graphics.drawable.BitmapDrawable;
-import android.graphics.drawable.Drawable;
-import android.os.Bundle;
-import android.os.Parcelable;
-import android.view.View;
-import android.widget.ImageView;
-import android.widget.ImageView.ScaleType;
-
-import java.util.List;
-import java.util.Map;
-
-/**
- * Listener provided in
- * {@link FragmentActivity#setEnterSharedElementCallback(SharedElementCallback)} and
- * {@link FragmentActivity#setExitSharedElementCallback(SharedElementCallback)}
- * to monitor the Activity transitions. The events can be used to customize Activity
- * Transition behavior.
- */
-public abstract class SharedElementCallback {
-    private Matrix mTempMatrix;
-    private static int MAX_IMAGE_SIZE = (1024 * 1024);
-    private static final String BUNDLE_SNAPSHOT_BITMAP = "sharedElement:snapshot:bitmap";
-    private static final String BUNDLE_SNAPSHOT_IMAGE_SCALETYPE = "sharedElement:snapshot:imageScaleType";
-    private static final String BUNDLE_SNAPSHOT_IMAGE_MATRIX = "sharedElement:snapshot:imageMatrix";
-
-    /**
-     * In Activity Transitions, onSharedElementStart is called immediately before
-     * capturing the start of the shared element state on enter and reenter transitions and
-     * immediately before capturing the end of the shared element state for exit and return
-     * transitions.
-     * <p>
-     * In Fragment Transitions, onSharedElementStart is called immediately before capturing the
-     * start state of all shared element transitions.
-     * <p>
-     * This call can be used to adjust the transition start state by modifying the shared
-     * element Views. Note that no layout step will be executed between onSharedElementStart
-     * and the transition state capture.
-     * <p>
-     * For Activity Transitions, any changes made in {@link #onSharedElementEnd(List, List, List)}
-     * that are not updated during layout should be corrected in onSharedElementStart for exit and
-     * return transitions. For example, rotation or scale will not be affected by layout and
-     * if changed in {@link #onSharedElementEnd(List, List, List)}, it will also have to be reset
-     * in onSharedElementStart again to correct the end state.
-     *
-     * @param sharedElementNames The names of the shared elements that were accepted into
-     *                           the View hierarchy.
-     * @param sharedElements The shared elements that are part of the View hierarchy.
-     * @param sharedElementSnapshots The Views containing snap shots of the shared element
-     *                               from the launching Window. These elements will not
-     *                               be part of the scene, but will be positioned relative
-     *                               to the Window decor View. This list is null for Fragment
-     *                               Transitions.
-     */
-    public void onSharedElementStart(List<String> sharedElementNames,
-            List<View> sharedElements, List<View> sharedElementSnapshots) {}
-
-    /**
-     * In Activity Transitions, onSharedElementEnd is called immediately before
-     * capturing the end of the shared element state on enter and reenter transitions and
-     * immediately before capturing the start of the shared element state for exit and return
-     * transitions.
-     * <p>
-     * In Fragment Transitions, onSharedElementEnd is called immediately before capturing the
-     * end state of all shared element transitions.
-     * <p>
-     * This call can be used to adjust the transition end state by modifying the shared
-     * element Views. Note that no layout step will be executed between onSharedElementEnd
-     * and the transition state capture.
-     * <p>
-     * Any changes made in {@link #onSharedElementStart(List, List, List)} that are not updated
-     * during layout should be corrected in onSharedElementEnd. For example, rotation or scale
-     * will not be affected by layout and if changed in
-     * {@link #onSharedElementStart(List, List, List)}, it will also have to be reset in
-     * onSharedElementEnd again to correct the end state.
-     *
-     * @param sharedElementNames The names of the shared elements that were accepted into
-     *                           the View hierarchy.
-     * @param sharedElements The shared elements that are part of the View hierarchy.
-     * @param sharedElementSnapshots The Views containing snap shots of the shared element
-     *                               from the launching Window. These elements will not
-     *                               be part of the scene, but will be positioned relative
-     *                               to the Window decor View. This list will be null for
-     *                               Fragment Transitions.
-     */
-    public void onSharedElementEnd(List<String> sharedElementNames,
-            List<View> sharedElements, List<View> sharedElementSnapshots) {}
-
-    /**
-     * Called after {@link #onMapSharedElements(java.util.List, java.util.Map)} when
-     * transferring shared elements in. Any shared elements that have no mapping will be in
-     * <var>rejectedSharedElements</var>. The elements remaining in
-     * <var>rejectedSharedElements</var> will be transitioned out of the Scene. If a
-     * View is removed from <var>rejectedSharedElements</var>, it must be handled by the
-     * <code>SharedElementListener</code>.
-     * <p>
-     * Views in rejectedSharedElements will have their position and size set to the
-     * position of the calling shared element, relative to the Window decor View and contain
-     * snapshots of the View from the calling Activity or Fragment. This
-     * view may be safely added to the decor View's overlay to remain in position.
-     * </p>
-     * <p>This method is not called for Fragment Transitions. All rejected shared elements
-     * will be handled by the exit transition.</p>
-     *
-     * @param rejectedSharedElements Views containing visual information of shared elements
-     *                               that are not part of the entering scene. These Views
-     *                               are positioned relative to the Window decor View. A
-     *                               View removed from this list will not be transitioned
-     *                               automatically.
-     */
-    public void onRejectSharedElements(List<View> rejectedSharedElements) {}
-
-    /**
-     * Lets the SharedElementCallback adjust the mapping of shared element names to
-     * Views.
-     *
-     * @param names The names of all shared elements transferred from the calling Activity
-     *              or Fragment in the order they were provided.
-     * @param sharedElements The mapping of shared element names to Views. The best guess
-     *                       will be filled into sharedElements based on the transitionNames.
-     */
-    public void onMapSharedElements(List<String> names, Map<String, View> sharedElements) {}
-
-
-    /**
-     * Creates a snapshot of a shared element to be used by the remote Activity and reconstituted
-     * with {@link #onCreateSnapshotView(android.content.Context, android.os.Parcelable)}. A
-     * null return value will mean that the remote Activity will have a null snapshot View in
-     * {@link #onSharedElementStart(java.util.List, java.util.List, java.util.List)} and
-     * {@link #onSharedElementEnd(java.util.List, java.util.List, java.util.List)}.
-     *
-     * <p>This is not called for Fragment Transitions.</p>
-     *
-     * @param sharedElement The shared element View to create a snapshot for.
-     * @param viewToGlobalMatrix A matrix containing a transform from the view to the screen
-     *                           coordinates.
-     * @param screenBounds The bounds of shared element in screen coordinate space. This is
-     *                     the bounds of the view with the viewToGlobalMatrix applied.
-     * @return A snapshot to send to the remote Activity to be reconstituted with
-     * {@link #onCreateSnapshotView(android.content.Context, android.os.Parcelable)} and passed
-     * into {@link #onSharedElementStart(java.util.List, java.util.List, java.util.List)} and
-     * {@link #onSharedElementEnd(java.util.List, java.util.List, java.util.List)}.
-     */
-    public Parcelable onCaptureSharedElementSnapshot(View sharedElement, Matrix viewToGlobalMatrix,
-            RectF screenBounds) {
-        if (sharedElement instanceof ImageView) {
-            ImageView imageView = ((ImageView) sharedElement);
-            Drawable d = imageView.getDrawable();
-            Drawable bg = imageView.getBackground();
-            if (d != null && bg == null) {
-                Bitmap bitmap = createDrawableBitmap(d);
-                if (bitmap != null) {
-                    Bundle bundle = new Bundle();
-                    bundle.putParcelable(BUNDLE_SNAPSHOT_BITMAP, bitmap);
-                    bundle.putString(BUNDLE_SNAPSHOT_IMAGE_SCALETYPE,
-                            imageView.getScaleType().toString());
-                    if (imageView.getScaleType() == ScaleType.MATRIX) {
-                        Matrix matrix = imageView.getImageMatrix();
-                        float[] values = new float[9];
-                        matrix.getValues(values);
-                        bundle.putFloatArray(BUNDLE_SNAPSHOT_IMAGE_MATRIX, values);
-                    }
-                    return bundle;
-                }
-            }
-        }
-        int bitmapWidth = Math.round(screenBounds.width());
-        int bitmapHeight = Math.round(screenBounds.height());
-        Bitmap bitmap = null;
-        if (bitmapWidth > 0 && bitmapHeight > 0) {
-            float scale = Math.min(1f, ((float)MAX_IMAGE_SIZE) / (bitmapWidth * bitmapHeight));
-            bitmapWidth *= scale;
-            bitmapHeight *= scale;
-            if (mTempMatrix == null) {
-                mTempMatrix = new Matrix();
-            }
-            mTempMatrix.set(viewToGlobalMatrix);
-            mTempMatrix.postTranslate(-screenBounds.left, -screenBounds.top);
-            mTempMatrix.postScale(scale, scale);
-            bitmap = Bitmap.createBitmap(bitmapWidth, bitmapHeight, Bitmap.Config.ARGB_8888);
-            Canvas canvas = new Canvas(bitmap);
-            canvas.concat(mTempMatrix);
-            sharedElement.draw(canvas);
-        }
-        return bitmap;
-    }
-
-    /**
-     * Get a copy of bitmap of given drawable.
-     */
-    private static Bitmap createDrawableBitmap(Drawable drawable) {
-        int width = drawable.getIntrinsicWidth();
-        int height = drawable.getIntrinsicHeight();
-        if (width <= 0 || height <= 0) {
-            return null;
-        }
-        float scale = Math.min(1f, ((float)MAX_IMAGE_SIZE) / (width * height));
-        if (drawable instanceof BitmapDrawable && scale == 1f) {
-            // return same bitmap if scale down not needed
-            return ((BitmapDrawable) drawable).getBitmap();
-        }
-        int bitmapWidth = (int) (width * scale);
-        int bitmapHeight = (int) (height * scale);
-        Bitmap bitmap = Bitmap.createBitmap(bitmapWidth, bitmapHeight, Bitmap.Config.ARGB_8888);
-        Canvas canvas = new Canvas(bitmap);
-        Rect existingBounds = drawable.getBounds();
-        int left = existingBounds.left;
-        int top = existingBounds.top;
-        int right = existingBounds.right;
-        int bottom = existingBounds.bottom;
-        drawable.setBounds(0, 0, bitmapWidth, bitmapHeight);
-        drawable.draw(canvas);
-        drawable.setBounds(left, top, right, bottom);
-        return bitmap;
-    }
-
-    /**
-     * Reconstitutes a snapshot View from a Parcelable returned in
-     * {@link #onCaptureSharedElementSnapshot(android.view.View, android.graphics.Matrix,
-     * android.graphics.RectF)} to be used in {@link #onSharedElementStart(java.util.List,
-     * java.util.List, java.util.List)} and {@link #onSharedElementEnd(java.util.List,
-     * java.util.List, java.util.List)}. The returned View will be sized and positioned after
-     * this call so that it is ready to be added to the decor View's overlay.
-     *
-     * <p>This is not called for Fragment Transitions.</p>
-     *
-     * @param context The Context used to create the snapshot View.
-     * @param snapshot The Parcelable returned by {@link #onCaptureSharedElementSnapshot(
-     * android.view.View, android.graphics.Matrix, android.graphics.RectF)}.
-     * @return A View to be sent in {@link #onSharedElementStart(java.util.List, java.util.List,
-     * java.util.List)} and {@link #onSharedElementEnd(java.util.List, java.util.List,
-     * java.util.List)}. A null value will produce a null snapshot value for those two methods.
-     */
-    public View onCreateSnapshotView(Context context, Parcelable snapshot) {
-        ImageView view = null;
-        if (snapshot instanceof Bundle) {
-            Bundle bundle = (Bundle) snapshot;
-            Bitmap bitmap = (Bitmap) bundle.getParcelable(BUNDLE_SNAPSHOT_BITMAP);
-            if (bitmap == null) {
-                return null;
-            }
-            ImageView imageView = new ImageView(context);
-            view = imageView;
-            imageView.setImageBitmap(bitmap);
-            imageView.setScaleType(
-                    ScaleType.valueOf(bundle.getString(BUNDLE_SNAPSHOT_IMAGE_SCALETYPE)));
-            if (imageView.getScaleType() == ScaleType.MATRIX) {
-                float[] values = bundle.getFloatArray(BUNDLE_SNAPSHOT_IMAGE_MATRIX);
-                Matrix matrix = new Matrix();
-                matrix.setValues(values);
-                imageView.setImageMatrix(matrix);
-            }
-        } else if (snapshot instanceof Bitmap) {
-            Bitmap bitmap = (Bitmap) snapshot;
-            view = new ImageView(context);
-            view.setImageBitmap(bitmap);
-        }
-        return view;
-    }
-
-}
diff --git a/v4/java/android/support/v4/content/ContextCompat.java b/v4/java/android/support/v4/content/ContextCompat.java
deleted file mode 100644
index b61426e..0000000
--- a/v4/java/android/support/v4/content/ContextCompat.java
+++ /dev/null
@@ -1,570 +0,0 @@
-/*
- * Copyright (C) 2012 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 android.support.v4.content;
-
-import android.content.Context;
-import android.content.Intent;
-import android.content.pm.ApplicationInfo;
-import android.content.res.ColorStateList;
-import android.content.res.TypedArray;
-import android.graphics.drawable.Drawable;
-import android.os.Build;
-import android.os.Bundle;
-import android.os.Environment;
-import android.os.Process;
-import android.support.annotation.NonNull;
-import android.support.v4.os.BuildCompat;
-import android.support.v4.os.EnvironmentCompat;
-import android.util.Log;
-import android.util.TypedValue;
-
-import java.io.File;
-
-/**
- * Helper for accessing features in {@link android.content.Context}
- * introduced after API level 4 in a backwards compatible fashion.
- */
-public class ContextCompat {
-    private static final String TAG = "ContextCompat";
-
-    private static final String DIR_ANDROID = "Android";
-    private static final String DIR_DATA = "data";
-    private static final String DIR_OBB = "obb";
-    private static final String DIR_FILES = "files";
-    private static final String DIR_CACHE = "cache";
-
-    private static final Object sLock = new Object();
-
-    private static TypedValue sTempValue;
-
-    /**
-     * Start a set of activities as a synthesized task stack, if able.
-     *
-     * <p>In API level 11 (Android 3.0/Honeycomb) the recommended conventions for
-     * app navigation using the back key changed. The back key's behavior is local
-     * to the current task and does not capture navigation across different tasks.
-     * Navigating across tasks and easily reaching the previous task is accomplished
-     * through the "recents" UI, accessible through the software-provided Recents key
-     * on the navigation or system bar. On devices with the older hardware button configuration
-     * the recents UI can be accessed with a long press on the Home key.</p>
-     *
-     * <p>When crossing from one task stack to another post-Android 3.0,
-     * the application should synthesize a back stack/history for the new task so that
-     * the user may navigate out of the new task and back to the Launcher by repeated
-     * presses of the back key. Back key presses should not navigate across task stacks.</p>
-     *
-     * <p>startActivities provides a mechanism for constructing a synthetic task stack of
-     * multiple activities. If the underlying API is not available on the system this method
-     * will return false.</p>
-     *
-     * @param context Start activities using this activity as the starting context
-     * @param intents Array of intents defining the activities that will be started. The element
-     *                length-1 will correspond to the top activity on the resulting task stack.
-     * @return true if the underlying API was available and the call was successful, false otherwise
-     */
-    public static boolean startActivities(Context context, Intent[] intents) {
-        return startActivities(context, intents, null);
-    }
-
-    /**
-     * Start a set of activities as a synthesized task stack, if able.
-     *
-     * <p>In API level 11 (Android 3.0/Honeycomb) the recommended conventions for
-     * app navigation using the back key changed. The back key's behavior is local
-     * to the current task and does not capture navigation across different tasks.
-     * Navigating across tasks and easily reaching the previous task is accomplished
-     * through the "recents" UI, accessible through the software-provided Recents key
-     * on the navigation or system bar. On devices with the older hardware button configuration
-     * the recents UI can be accessed with a long press on the Home key.</p>
-     *
-     * <p>When crossing from one task stack to another post-Android 3.0,
-     * the application should synthesize a back stack/history for the new task so that
-     * the user may navigate out of the new task and back to the Launcher by repeated
-     * presses of the back key. Back key presses should not navigate across task stacks.</p>
-     *
-     * <p>startActivities provides a mechanism for constructing a synthetic task stack of
-     * multiple activities. If the underlying API is not available on the system this method
-     * will return false.</p>
-     *
-     * @param context Start activities using this activity as the starting context
-     * @param intents Array of intents defining the activities that will be started. The element
-     *                length-1 will correspond to the top activity on the resulting task stack.
-     * @param options Additional options for how the Activity should be started.
-     * See {@link android.content.Context#startActivity(Intent, android.os.Bundle)
-     * @return true if the underlying API was available and the call was successful, false otherwise
-     */
-    public static boolean startActivities(Context context, Intent[] intents,
-            Bundle options) {
-        final int version = Build.VERSION.SDK_INT;
-        if (version >= 16) {
-            ContextCompatJellybean.startActivities(context, intents, options);
-            return true;
-        } else if (version >= 11) {
-            ContextCompatHoneycomb.startActivities(context, intents);
-            return true;
-        }
-        return false;
-    }
-
-    /**
-     * Returns the absolute path to the directory on the filesystem where all
-     * private files belonging to this app are stored. Apps should not use this
-     * path directly; they should instead use {@link Context#getFilesDir()},
-     * {@link Context#getCacheDir()}, {@link Context#getDir(String, int)}, or
-     * other storage APIs on {@link Context}.
-     * <p>
-     * The returned path may change over time if the calling app is moved to an
-     * adopted storage device, so only relative paths should be persisted.
-     * <p>
-     * No additional permissions are required for the calling app to read or
-     * write files under the returned path.
-     *
-     * @see ApplicationInfo#dataDir
-     */
-    public static File getDataDir(Context context) {
-        if (BuildCompat.isAtLeastN()) {
-            return ContextCompatApi24.getDataDir(context);
-        } else {
-            final String dataDir = context.getApplicationInfo().dataDir;
-            return dataDir != null ? new File(dataDir) : null;
-        }
-    }
-
-    /**
-     * Returns absolute paths to application-specific directories on all
-     * external storage devices where the application's OBB files (if there are
-     * any) can be found. Note if the application does not have any OBB files,
-     * these directories may not exist.
-     * <p>
-     * This is like {@link Context#getFilesDir()} in that these files will be
-     * deleted when the application is uninstalled, however there are some
-     * important differences:
-     * <ul>
-     * <li>External files are not always available: they will disappear if the
-     * user mounts the external storage on a computer or removes it.
-     * <li>There is no security enforced with these files.
-     * </ul>
-     * <p>
-     * External storage devices returned here are considered a permanent part of
-     * the device, including both emulated external storage and physical media
-     * slots, such as SD cards in a battery compartment. The returned paths do
-     * not include transient devices, such as USB flash drives.
-     * <p>
-     * An application may store data on any or all of the returned devices. For
-     * example, an app may choose to store large files on the device with the
-     * most available space, as measured by {@link android.os.StatFs}.
-     * <p>
-     * Starting in {@link android.os.Build.VERSION_CODES#KITKAT}, no permissions
-     * are required to write to the returned paths; they're always accessible to
-     * the calling app. Before then,
-     * {@link android.Manifest.permission#WRITE_EXTERNAL_STORAGE} is required to
-     * write. Write access outside of these paths on secondary external storage
-     * devices is not available. To request external storage access in a
-     * backwards compatible way, consider using {@code android:maxSdkVersion}
-     * like this:
-     *
-     * <pre class="prettyprint">&lt;uses-permission
-     *     android:name="android.permission.WRITE_EXTERNAL_STORAGE"
-     *     android:maxSdkVersion="18" /&gt;</pre>
-     * <p>
-     * The first path returned is the same as {@link Context#getObbDir()}.
-     * Returned paths may be {@code null} if a storage device is unavailable.
-     *
-     * @see Context#getObbDir()
-     * @see EnvironmentCompat#getStorageState(File)
-     */
-    public static File[] getObbDirs(Context context) {
-        final int version = Build.VERSION.SDK_INT;
-        if (version >= 19) {
-            return ContextCompatKitKat.getObbDirs(context);
-        } else {
-            final File single;
-            if (version >= 11) {
-                single = ContextCompatHoneycomb.getObbDir(context);
-            } else {
-                single = buildPath(Environment.getExternalStorageDirectory(), DIR_ANDROID, DIR_OBB,
-                        context.getPackageName());
-            }
-            return new File[] { single };
-        }
-    }
-
-    /**
-     * Returns absolute paths to application-specific directories on all
-     * external storage devices where the application can place persistent files
-     * it owns. These files are internal to the application, and not typically
-     * visible to the user as media.
-     * <p>
-     * This is like {@link Context#getFilesDir()} in that these files will be
-     * deleted when the application is uninstalled, however there are some
-     * important differences:
-     * <ul>
-     * <li>External files are not always available: they will disappear if the
-     * user mounts the external storage on a computer or removes it.
-     * <li>There is no security enforced with these files.
-     * </ul>
-     * <p>
-     * External storage devices returned here are considered a permanent part of
-     * the device, including both emulated external storage and physical media
-     * slots, such as SD cards in a battery compartment. The returned paths do
-     * not include transient devices, such as USB flash drives.
-     * <p>
-     * An application may store data on any or all of the returned devices. For
-     * example, an app may choose to store large files on the device with the
-     * most available space, as measured by {@link android.os.StatFs}.
-     * <p>
-     * Starting in {@link android.os.Build.VERSION_CODES#KITKAT}, no permissions
-     * are required to write to the returned paths; they're always accessible to
-     * the calling app. Before then,
-     * {@link android.Manifest.permission#WRITE_EXTERNAL_STORAGE} is required to
-     * write. Write access outside of these paths on secondary external storage
-     * devices is not available. To request external storage access in a
-     * backwards compatible way, consider using {@code android:maxSdkVersion}
-     * like this:
-     *
-     * <pre class="prettyprint">&lt;uses-permission
-     *     android:name="android.permission.WRITE_EXTERNAL_STORAGE"
-     *     android:maxSdkVersion="18" /&gt;</pre>
-     * <p>
-     * The first path returned is the same as
-     * {@link Context#getExternalFilesDir(String)}. Returned paths may be
-     * {@code null} if a storage device is unavailable.
-     *
-     * @see Context#getExternalFilesDir(String)
-     * @see EnvironmentCompat#getStorageState(File)
-     */
-    public static File[] getExternalFilesDirs(Context context, String type) {
-        final int version = Build.VERSION.SDK_INT;
-        if (version >= 19) {
-            return ContextCompatKitKat.getExternalFilesDirs(context, type);
-        } else {
-            final File single;
-            if (version >= 8) {
-                single = ContextCompatFroyo.getExternalFilesDir(context, type);
-            } else {
-                single = buildPath(Environment.getExternalStorageDirectory(), DIR_ANDROID, DIR_DATA,
-                        context.getPackageName(), DIR_FILES, type);
-            }
-            return new File[] { single };
-        }
-    }
-
-    /**
-     * Returns absolute paths to application-specific directories on all
-     * external storage devices where the application can place cache files it
-     * owns. These files are internal to the application, and not typically
-     * visible to the user as media.
-     * <p>
-     * This is like {@link Context#getCacheDir()} in that these files will be
-     * deleted when the application is uninstalled, however there are some
-     * important differences:
-     * <ul>
-     * <li>External files are not always available: they will disappear if the
-     * user mounts the external storage on a computer or removes it.
-     * <li>There is no security enforced with these files.
-     * </ul>
-     * <p>
-     * External storage devices returned here are considered a permanent part of
-     * the device, including both emulated external storage and physical media
-     * slots, such as SD cards in a battery compartment. The returned paths do
-     * not include transient devices, such as USB flash drives.
-     * <p>
-     * An application may store data on any or all of the returned devices. For
-     * example, an app may choose to store large files on the device with the
-     * most available space, as measured by {@link android.os.StatFs}.
-     * <p>
-     * Starting in {@link android.os.Build.VERSION_CODES#KITKAT}, no permissions
-     * are required to write to the returned paths; they're always accessible to
-     * the calling app. Before then,
-     * {@link android.Manifest.permission#WRITE_EXTERNAL_STORAGE} is required to
-     * write. Write access outside of these paths on secondary external storage
-     * devices is not available. To request external storage access in a
-     * backwards compatible way, consider using {@code android:maxSdkVersion}
-     * like this:
-     *
-     * <pre class="prettyprint">&lt;uses-permission
-     *     android:name="android.permission.WRITE_EXTERNAL_STORAGE"
-     *     android:maxSdkVersion="18" /&gt;</pre>
-     * <p>
-     * The first path returned is the same as
-     * {@link Context#getExternalCacheDir()}. Returned paths may be {@code null}
-     * if a storage device is unavailable.
-     *
-     * @see Context#getExternalCacheDir()
-     * @see EnvironmentCompat#getStorageState(File)
-     */
-    public static File[] getExternalCacheDirs(Context context) {
-        final int version = Build.VERSION.SDK_INT;
-        if (version >= 19) {
-            return ContextCompatKitKat.getExternalCacheDirs(context);
-        } else {
-            final File single;
-            if (version >= 8) {
-                single = ContextCompatFroyo.getExternalCacheDir(context);
-            } else {
-                single = buildPath(Environment.getExternalStorageDirectory(), DIR_ANDROID, DIR_DATA,
-                        context.getPackageName(), DIR_CACHE);
-            }
-            return new File[] { single };
-        }
-    }
-
-    private static File buildPath(File base, String... segments) {
-        File cur = base;
-        for (String segment : segments) {
-            if (cur == null) {
-                cur = new File(segment);
-            } else if (segment != null) {
-                cur = new File(cur, segment);
-            }
-        }
-        return cur;
-    }
-
-    /**
-     * Returns a drawable object associated with a particular resource ID.
-     * <p>
-     * Starting in {@link android.os.Build.VERSION_CODES#LOLLIPOP}, the
-     * returned drawable will be styled for the specified Context's theme.
-     *
-     * @param id The desired resource identifier, as generated by the aapt tool.
-     *           This integer encodes the package, type, and resource entry.
-     *           The value 0 is an invalid identifier.
-     * @return Drawable An object that can be used to draw this resource.
-     */
-    public static final Drawable getDrawable(Context context, int id) {
-        final int version = Build.VERSION.SDK_INT;
-        if (version >= 21) {
-            return ContextCompatApi21.getDrawable(context, id);
-        } else if (version >= 16) {
-            return context.getResources().getDrawable(id);
-        } else {
-            // Prior to JELLY_BEAN, Resources.getDrawable() would not correctly
-            // retrieve the final configuration density when the resource ID
-            // is a reference another Drawable resource. As a workaround, try
-            // to resolve the drawable reference manually.
-            final int resolvedId;
-            synchronized (sLock) {
-                if (sTempValue == null) {
-                    sTempValue = new TypedValue();
-                }
-                context.getResources().getValue(id, sTempValue, true);
-                resolvedId = sTempValue.resourceId;
-            }
-            return context.getResources().getDrawable(resolvedId);
-        }
-    }
-
-    /**
-     * Returns a color state list associated with a particular resource ID.
-     * <p>
-     * Starting in {@link android.os.Build.VERSION_CODES#M}, the returned
-     * color state list will be styled for the specified Context's theme.
-     *
-     * @param id The desired resource identifier, as generated by the aapt
-     *           tool. This integer encodes the package, type, and resource
-     *           entry. The value 0 is an invalid identifier.
-     * @return A color state list, or {@code null} if the resource could not be
-     *         resolved.
-     * @throws android.content.res.Resources.NotFoundException if the given ID
-     *         does not exist.
-     */
-    public static final ColorStateList getColorStateList(Context context, int id) {
-        final int version = Build.VERSION.SDK_INT;
-        if (version >= 23) {
-            return ContextCompatApi23.getColorStateList(context, id);
-        } else {
-            return context.getResources().getColorStateList(id);
-        }
-    }
-
-    /**
-     * Returns a color associated with a particular resource ID
-     * <p>
-     * Starting in {@link android.os.Build.VERSION_CODES#M}, the returned
-     * color will be styled for the specified Context's theme.
-     *
-     * @param id The desired resource identifier, as generated by the aapt
-     *           tool. This integer encodes the package, type, and resource
-     *           entry. The value 0 is an invalid identifier.
-     * @return A single color value in the form 0xAARRGGBB.
-     * @throws android.content.res.Resources.NotFoundException if the given ID
-     *         does not exist.
-     */
-    public static final int getColor(Context context, int id) {
-        final int version = Build.VERSION.SDK_INT;
-        if (version >= 23) {
-            return ContextCompatApi23.getColor(context, id);
-        } else {
-            return context.getResources().getColor(id);
-        }
-    }
-
-    /**
-     * Determine whether <em>you</em> have been granted a particular permission.
-     *
-     * @param permission The name of the permission being checked.
-     *
-     * @return {@link android.content.pm.PackageManager#PERMISSION_GRANTED} if you have the
-     * permission, or {@link android.content.pm.PackageManager#PERMISSION_DENIED} if not.
-     *
-     * @see android.content.pm.PackageManager#checkPermission(String, String)
-     */
-    public static int checkSelfPermission(@NonNull Context context, @NonNull String permission) {
-        if (permission == null) {
-            throw new IllegalArgumentException("permission is null");
-        }
-
-        return context.checkPermission(permission, android.os.Process.myPid(), Process.myUid());
-    }
-
-    /**
-     * Returns the absolute path to the directory on the filesystem similar to
-     * {@link Context#getFilesDir()}.  The difference is that files placed under this
-     * directory will be excluded from automatic backup to remote storage on
-     * devices running {@link android.os.Build.VERSION_CODES#LOLLIPOP} or later.  See
-     * {@link android.app.backup.BackupAgent BackupAgent} for a full discussion
-     * of the automatic backup mechanism in Android.
-     *
-     * <p>No permissions are required to read or write to the returned path, since this
-     * path is internal storage.
-     *
-     * @return The path of the directory holding application files that will not be
-     *         automatically backed up to remote storage.
-     *
-     * @see android.content.Context.getFilesDir
-     */
-    public static final File getNoBackupFilesDir(Context context) {
-        final int version = Build.VERSION.SDK_INT;
-        if (version >= 21) {
-            return ContextCompatApi21.getNoBackupFilesDir(context);
-        } else {
-            ApplicationInfo appInfo = context.getApplicationInfo();
-            return createFilesDir(new File(appInfo.dataDir, "no_backup"));
-        }
-    }
-
-    /**
-     * Returns the absolute path to the application specific cache directory on
-     * the filesystem designed for storing cached code. On devices running
-     * {@link android.os.Build.VERSION_CODES#LOLLIPOP} or later, the system will delete
-     * any files stored in this location both when your specific application is
-     * upgraded, and when the entire platform is upgraded.
-     * <p>
-     * This location is optimal for storing compiled or optimized code generated
-     * by your application at runtime.
-     * <p>
-     * Apps require no extra permissions to read or write to the returned path,
-     * since this path lives in their private storage.
-     *
-     * @return The path of the directory holding application code cache files.
-     */
-    public static File getCodeCacheDir(Context context) {
-        final int version = Build.VERSION.SDK_INT;
-        if (version >= 21) {
-            return ContextCompatApi21.getCodeCacheDir(context);
-        } else {
-            ApplicationInfo appInfo = context.getApplicationInfo();
-            return createFilesDir(new File(appInfo.dataDir, "code_cache"));
-        }
-    }
-
-    private synchronized static File createFilesDir(File file) {
-        if (!file.exists()) {
-            if (!file.mkdirs()) {
-                if (file.exists()) {
-                    // spurious failure; probably racing with another process for this app
-                    return file;
-                }
-                Log.w(TAG, "Unable to create files subdir " + file.getPath());
-                return null;
-            }
-        }
-        return file;
-    }
-
-    /**
-     * Return a new Context object for the current Context but whose storage
-     * APIs are backed by device-protected storage.
-     * <p>
-     * On devices with direct boot, data stored in this location is encrypted
-     * with a key tied to the physical device, and it can be accessed
-     * immediately after the device has booted successfully, both
-     * <em>before and after</em> the user has authenticated with their
-     * credentials (such as a lock pattern or PIN).
-     * <p>
-     * Because device-protected data is available without user authentication,
-     * you should carefully limit the data you store using this Context. For
-     * example, storing sensitive authentication tokens or passwords in the
-     * device-protected area is strongly discouraged.
-     * <p>
-     * If the underlying device does not have the ability to store
-     * device-protected and credential-protected data using different keys, then
-     * both storage areas will become available at the same time. They remain as
-     * two distinct storage locations on disk, and only the window of
-     * availability changes.
-     * <p>
-     * Each call to this method returns a new instance of a Context object;
-     * Context objects are not shared, however common state (ClassLoader, other
-     * Resources for the same configuration) may be so the Context itself can be
-     * fairly lightweight.
-     * <p>
-     * Prior to {@link BuildCompat#isAtLeastN()} this method returns
-     * {@code null}, since device-protected storage is not available.
-     *
-     * @see ContextCompat#isDeviceProtectedStorage(Context)
-     */
-    public static Context createDeviceProtectedStorageContext(Context context) {
-        if (BuildCompat.isAtLeastN()) {
-            return ContextCompatApi24.createDeviceProtectedStorageContext(context);
-        } else {
-            return null;
-        }
-    }
-
-    /**
-     * @removed
-     * @deprecated Removed. Do not use.
-     */
-    @Deprecated
-    public static Context createDeviceEncryptedStorageContext(Context context) {
-        return createDeviceProtectedStorageContext(context);
-    }
-
-    /**
-     * Indicates if the storage APIs of this Context are backed by
-     * device-encrypted storage.
-     *
-     * @see ContextCompat#createDeviceProtectedStorageContext(Context)
-     */
-    public static boolean isDeviceProtectedStorage(Context context) {
-        if (BuildCompat.isAtLeastN()) {
-            return ContextCompatApi24.isDeviceProtectedStorage(context);
-        } else {
-            return false;
-        }
-    }
-
-    /**
-     * @removed
-     * @deprecated Removed. Do not use.
-     */
-    @Deprecated
-    public static boolean isDeviceEncryptedStorage(Context context) {
-        return isDeviceProtectedStorage(context);
-    }
-}
diff --git a/v4/java/android/support/v4/content/LocalBroadcastManager.java b/v4/java/android/support/v4/content/LocalBroadcastManager.java
index 299bc8e..9f4c35c 100644
--- a/v4/java/android/support/v4/content/LocalBroadcastManager.java
+++ b/v4/java/android/support/v4/content/LocalBroadcastManager.java
@@ -31,7 +31,7 @@
 
 /**
  * Helper to register for and send broadcasts of Intents to local objects
- * within your process.  This is has a number of advantages over sending
+ * within your process.  This has a number of advantages over sending
  * global broadcasts with {@link android.content.Context#sendBroadcast}:
  * <ul>
  * <li> You know that the data you are broadcasting won't leave your app, so
diff --git a/v4/java/android/support/v4/content/ModernAsyncTask.java b/v4/java/android/support/v4/content/ModernAsyncTask.java
deleted file mode 100644
index 7f9201d..0000000
--- a/v4/java/android/support/v4/content/ModernAsyncTask.java
+++ /dev/null
@@ -1,506 +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 android.support.v4.content;
-
-import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.Callable;
-import java.util.concurrent.CancellationException;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Executor;
-import java.util.concurrent.FutureTask;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.ThreadFactory;
-import java.util.concurrent.ThreadPoolExecutor;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import android.os.Handler;
-import android.os.Looper;
-import android.os.Message;
-import android.os.Process;
-
-/**
- * Copy of the required parts of {@link android.os.AsyncTask} from Android 3.0 that is
- * needed to support AsyncTaskLoader.  We use this rather than the one from the platform
- * because we rely on some subtle behavior of AsyncTask that is not reliable on
- * older platforms.
- *
- * <p>Note that for now this is not publicly available because it is not a
- * complete implementation, only sufficient for the needs of
- * {@link AsyncTaskLoader}.
- */
-abstract class ModernAsyncTask<Params, Progress, Result> {
-    private static final String LOG_TAG = "AsyncTask";
-
-    private static final int CORE_POOL_SIZE = 5;
-    private static final int MAXIMUM_POOL_SIZE = 128;
-    private static final int KEEP_ALIVE = 1;
-
-    private static final ThreadFactory sThreadFactory = new ThreadFactory() {
-        private final AtomicInteger mCount = new AtomicInteger(1);
-
-        public Thread newThread(Runnable r) {
-            return new Thread(r, "ModernAsyncTask #" + mCount.getAndIncrement());
-        }
-    };
-
-    private static final BlockingQueue<Runnable> sPoolWorkQueue =
-            new LinkedBlockingQueue<Runnable>(10);
-
-    /**
-     * An {@link Executor} that can be used to execute tasks in parallel.
-     */
-    public static final Executor THREAD_POOL_EXECUTOR
-            = new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE,
-                    TimeUnit.SECONDS, sPoolWorkQueue, sThreadFactory);
-
-    private static final int MESSAGE_POST_RESULT = 0x1;
-    private static final int MESSAGE_POST_PROGRESS = 0x2;
-
-    private static InternalHandler sHandler;
-
-    private static volatile Executor sDefaultExecutor = THREAD_POOL_EXECUTOR;
-    private final WorkerRunnable<Params, Result> mWorker;
-    private final FutureTask<Result> mFuture;
-
-    private volatile Status mStatus = Status.PENDING;
-
-    private final AtomicBoolean mTaskInvoked = new AtomicBoolean();
-
-    /**
-     * Indicates the current status of the task. Each status will be set only once
-     * during the lifetime of a task.
-     */
-    public enum Status {
-        /**
-         * Indicates that the task has not been executed yet.
-         */
-        PENDING,
-        /**
-         * Indicates that the task is running.
-         */
-        RUNNING,
-        /**
-         * Indicates that {@link android.os.AsyncTask#onPostExecute(Object)} has finished.
-         */
-        FINISHED,
-    }
-
-    private static Handler getHandler() {
-        synchronized (ModernAsyncTask.class) {
-            if (sHandler == null) {
-                sHandler = new InternalHandler();
-            }
-            return sHandler;
-        }
-    }
-
-    /** @hide */
-    public static void setDefaultExecutor(Executor exec) {
-        sDefaultExecutor = exec;
-    }
-
-    /**
-     * Creates a new asynchronous task. This constructor must be invoked on the UI thread.
-     */
-    public ModernAsyncTask() {
-        mWorker = new WorkerRunnable<Params, Result>() {
-            public Result call() throws Exception {
-                mTaskInvoked.set(true);
-
-                Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
-                return postResult(doInBackground(mParams));
-            }
-        };
-
-        mFuture = new FutureTask<Result>(mWorker) {
-            @Override
-            protected void done() {
-                try {
-                    final Result result = get();
-
-                    postResultIfNotInvoked(result);
-                } catch (InterruptedException e) {
-                    android.util.Log.w(LOG_TAG, e);
-                } catch (ExecutionException e) {
-                    throw new RuntimeException(
-                            "An error occurred while executing doInBackground()", e.getCause());
-                } catch (CancellationException e) {
-                    postResultIfNotInvoked(null);
-                } catch (Throwable t) {
-                    throw new RuntimeException(
-                            "An error occurred while executing doInBackground()", t);
-                }
-            }
-        };
-    }
-
-    private void postResultIfNotInvoked(Result result) {
-        final boolean wasTaskInvoked = mTaskInvoked.get();
-        if (!wasTaskInvoked) {
-            postResult(result);
-        }
-    }
-
-    private Result postResult(Result result) {
-        Message message = getHandler().obtainMessage(MESSAGE_POST_RESULT,
-                new AsyncTaskResult<Result>(this, result));
-        message.sendToTarget();
-        return result;
-    }
-
-    /**
-     * Returns the current status of this task.
-     *
-     * @return The current status.
-     */
-    public final Status getStatus() {
-        return mStatus;
-    }
-
-    /**
-     * Override this method to perform a computation on a background thread. The
-     * specified parameters are the parameters passed to {@link #execute}
-     * by the caller of this task.
-     *
-     * This method can call {@link #publishProgress} to publish updates
-     * on the UI thread.
-     *
-     * @param params The parameters of the task.
-     *
-     * @return A result, defined by the subclass of this task.
-     *
-     * @see #onPreExecute()
-     * @see #onPostExecute
-     * @see #publishProgress
-     */
-    protected abstract Result doInBackground(Params... params);
-
-    /**
-     * Runs on the UI thread before {@link #doInBackground}.
-     *
-     * @see #onPostExecute
-     * @see #doInBackground
-     */
-    protected void onPreExecute() {
-    }
-
-    /**
-     * <p>Runs on the UI thread after {@link #doInBackground}. The
-     * specified result is the value returned by {@link #doInBackground}.</p>
-     *
-     * <p>This method won't be invoked if the task was cancelled.</p>
-     *
-     * @param result The result of the operation computed by {@link #doInBackground}.
-     *
-     * @see #onPreExecute
-     * @see #doInBackground
-     * @see #onCancelled(Object)
-     */
-    @SuppressWarnings({"UnusedDeclaration"})
-    protected void onPostExecute(Result result) {
-    }
-
-    /**
-     * Runs on the UI thread after {@link #publishProgress} is invoked.
-     * The specified values are the values passed to {@link #publishProgress}.
-     *
-     * @param values The values indicating progress.
-     *
-     * @see #publishProgress
-     * @see #doInBackground
-     */
-    @SuppressWarnings({"UnusedDeclaration"})
-    protected void onProgressUpdate(Progress... values) {
-    }
-
-    /**
-     * <p>Runs on the UI thread after {@link #cancel(boolean)} is invoked and
-     * {@link #doInBackground(Object[])} has finished.</p>
-     *
-     * <p>The default implementation simply invokes {@link #onCancelled()} and
-     * ignores the result. If you write your own implementation, do not call
-     * <code>super.onCancelled(result)</code>.</p>
-     *
-     * @param result The result, if any, computed in
-     *               {@link #doInBackground(Object[])}, can be null
-     *
-     * @see #cancel(boolean)
-     * @see #isCancelled()
-     */
-    @SuppressWarnings({"UnusedParameters"})
-    protected void onCancelled(Result result) {
-        onCancelled();
-    }
-
-    /**
-     * <p>Applications should preferably override {@link #onCancelled(Object)}.
-     * This method is invoked by the default implementation of
-     * {@link #onCancelled(Object)}.</p>
-     *
-     * <p>Runs on the UI thread after {@link #cancel(boolean)} is invoked and
-     * {@link #doInBackground(Object[])} has finished.</p>
-     *
-     * @see #onCancelled(Object)
-     * @see #cancel(boolean)
-     * @see #isCancelled()
-     */
-    protected void onCancelled() {
-    }
-
-    /**
-     * Returns <tt>true</tt> if this task was cancelled before it completed
-     * normally. If you are calling {@link #cancel(boolean)} on the task,
-     * the value returned by this method should be checked periodically from
-     * {@link #doInBackground(Object[])} to end the task as soon as possible.
-     *
-     * @return <tt>true</tt> if task was cancelled before it completed
-     *
-     * @see #cancel(boolean)
-     */
-    public final boolean isCancelled() {
-        return mFuture.isCancelled();
-    }
-
-    /**
-     * <p>Attempts to cancel execution of this task.  This attempt will
-     * fail if the task has already completed, already been cancelled,
-     * or could not be cancelled for some other reason. If successful,
-     * and this task has not started when <tt>cancel</tt> is called,
-     * this task should never run. If the task has already started,
-     * then the <tt>mayInterruptIfRunning</tt> parameter determines
-     * whether the thread executing this task should be interrupted in
-     * an attempt to stop the task.</p>
-     *
-     * <p>Calling this method will result in {@link #onCancelled(Object)} being
-     * invoked on the UI thread after {@link #doInBackground(Object[])}
-     * returns. Calling this method guarantees that {@link #onPostExecute(Object)}
-     * is never invoked. After invoking this method, you should check the
-     * value returned by {@link #isCancelled()} periodically from
-     * {@link #doInBackground(Object[])} to finish the task as early as
-     * possible.</p>
-     *
-     * @param mayInterruptIfRunning <tt>true</tt> if the thread executing this
-     *        task should be interrupted; otherwise, in-progress tasks are allowed
-     *        to complete.
-     *
-     * @return <tt>false</tt> if the task could not be cancelled,
-     *         typically because it has already completed normally;
-     *         <tt>true</tt> otherwise
-     *
-     * @see #isCancelled()
-     * @see #onCancelled(Object)
-     */
-    public final boolean cancel(boolean mayInterruptIfRunning) {
-        return mFuture.cancel(mayInterruptIfRunning);
-    }
-
-    /**
-     * Waits if necessary for the computation to complete, and then
-     * retrieves its result.
-     *
-     * @return The computed result.
-     *
-     * @throws CancellationException If the computation was cancelled.
-     * @throws ExecutionException If the computation threw an exception.
-     * @throws InterruptedException If the current thread was interrupted
-     *         while waiting.
-     */
-    public final Result get() throws InterruptedException, ExecutionException {
-        return mFuture.get();
-    }
-
-    /**
-     * Waits if necessary for at most the given time for the computation
-     * to complete, and then retrieves its result.
-     *
-     * @param timeout Time to wait before cancelling the operation.
-     * @param unit The time unit for the timeout.
-     *
-     * @return The computed result.
-     *
-     * @throws CancellationException If the computation was cancelled.
-     * @throws ExecutionException If the computation threw an exception.
-     * @throws InterruptedException If the current thread was interrupted
-     *         while waiting.
-     * @throws TimeoutException If the wait timed out.
-     */
-    public final Result get(long timeout, TimeUnit unit) throws InterruptedException,
-            ExecutionException, TimeoutException {
-        return mFuture.get(timeout, unit);
-    }
-
-    /**
-     * Executes the task with the specified parameters. The task returns
-     * itself (this) so that the caller can keep a reference to it.
-     *
-     * <p>Note: this function schedules the task on a queue for a single background
-     * thread or pool of threads depending on the platform version.  When first
-     * introduced, AsyncTasks were executed serially on a single background thread.
-     * Starting with {@link android.os.Build.VERSION_CODES#DONUT}, this was changed
-     * to a pool of threads allowing multiple tasks to operate in parallel.  After
-     * {@link android.os.Build.VERSION_CODES#HONEYCOMB}, it is planned to change this
-     * back to a single thread to avoid common application errors caused
-     * by parallel execution.  If you truly want parallel execution, you can use
-     * the {@link #executeOnExecutor} version of this method
-     * with {@link #THREAD_POOL_EXECUTOR}; however, see commentary there for warnings on
-     * its use.
-     *
-     * <p>This method must be invoked on the UI thread.
-     *
-     * @param params The parameters of the task.
-     *
-     * @return This instance of AsyncTask.
-     *
-     * @throws IllegalStateException If {@link #getStatus()} returns either
-     *         {@link android.os.AsyncTask.Status#RUNNING} or
-     *          {@link android.os.AsyncTask.Status#FINISHED}.
-     */
-    public final ModernAsyncTask<Params, Progress, Result> execute(Params... params) {
-        return executeOnExecutor(sDefaultExecutor, params);
-    }
-
-    /**
-     * Executes the task with the specified parameters. The task returns
-     * itself (this) so that the caller can keep a reference to it.
-     *
-     * <p>This method is typically used with {@link #THREAD_POOL_EXECUTOR} to
-     * allow multiple tasks to run in parallel on a pool of threads managed by
-     * AsyncTask, however you can also use your own {@link Executor} for custom
-     * behavior.
-     *
-     * <p><em>Warning:</em> Allowing multiple tasks to run in parallel from
-     * a thread pool is generally <em>not</em> what one wants, because the order
-     * of their operation is not defined.  For example, if these tasks are used
-     * to modify any state in common (such as writing a file due to a button click),
-     * there are no guarantees on the order of the modifications.
-     * Without careful work it is possible in rare cases for the newer version
-     * of the data to be over-written by an older one, leading to obscure data
-     * loss and stability issues.
-     *
-     * <p>This method must be invoked on the UI thread.
-     *
-     * @param exec The executor to use.  {@link #THREAD_POOL_EXECUTOR} is available as a
-     *              convenient process-wide thread pool for tasks that are loosely coupled.
-     * @param params The parameters of the task.
-     *
-     * @return This instance of AsyncTask.
-     *
-     * @throws IllegalStateException If {@link #getStatus()} returns either
-     *         {@link android.os.AsyncTask.Status#RUNNING}
-     *          or {@link android.os.AsyncTask.Status#FINISHED}.
-     */
-    public final ModernAsyncTask<Params, Progress, Result> executeOnExecutor(Executor exec,
-            Params... params) {
-        if (mStatus != Status.PENDING) {
-            switch (mStatus) {
-                case RUNNING:
-                    throw new IllegalStateException("Cannot execute task:"
-                            + " the task is already running.");
-                case FINISHED:
-                    throw new IllegalStateException("Cannot execute task:"
-                            + " the task has already been executed "
-                            + "(a task can be executed only once)");
-            }
-        }
-
-        mStatus = Status.RUNNING;
-
-        onPreExecute();
-
-        mWorker.mParams = params;
-        exec.execute(mFuture);
-
-        return this;
-    }
-
-    /**
-     * Convenience version of {@link #execute(Object...)} for use with
-     * a simple Runnable object.
-     */
-    public static void execute(Runnable runnable) {
-        sDefaultExecutor.execute(runnable);
-    }
-
-    /**
-     * This method can be invoked from {@link #doInBackground} to
-     * publish updates on the UI thread while the background computation is
-     * still running. Each call to this method will trigger the execution of
-     * {@link #onProgressUpdate} on the UI thread.
-     *
-     * {@link #onProgressUpdate} will note be called if the task has been
-     * canceled.
-     *
-     * @param values The progress values to update the UI with.
-     *
-     * @see #onProgressUpdate
-     * @see #doInBackground
-     */
-    protected final void publishProgress(Progress... values) {
-        if (!isCancelled()) {
-            getHandler().obtainMessage(MESSAGE_POST_PROGRESS,
-                    new AsyncTaskResult<Progress>(this, values)).sendToTarget();
-        }
-    }
-
-    private void finish(Result result) {
-        if (isCancelled()) {
-            onCancelled(result);
-        } else {
-            onPostExecute(result);
-        }
-        mStatus = Status.FINISHED;
-    }
-
-    private static class InternalHandler extends Handler {
-        public InternalHandler() {
-            super(Looper.getMainLooper());
-        }
-
-        @SuppressWarnings({"unchecked", "RawUseOfParameterizedType"})
-        @Override
-        public void handleMessage(Message msg) {
-            AsyncTaskResult result = (AsyncTaskResult) msg.obj;
-            switch (msg.what) {
-                case MESSAGE_POST_RESULT:
-                    // There is only one result
-                    result.mTask.finish(result.mData[0]);
-                    break;
-                case MESSAGE_POST_PROGRESS:
-                    result.mTask.onProgressUpdate(result.mData);
-                    break;
-            }
-        }
-    }
-
-    private static abstract class WorkerRunnable<Params, Result> implements Callable<Result> {
-        Params[] mParams;
-    }
-
-    @SuppressWarnings({"RawUseOfParameterizedType"})
-    private static class AsyncTaskResult<Data> {
-        final ModernAsyncTask mTask;
-        final Data[] mData;
-
-        AsyncTaskResult(ModernAsyncTask task, Data... data) {
-            mTask = task;
-            mData = data;
-        }
-    }
-}
diff --git a/v4/java/android/support/v4/content/SharedPreferencesCompat.java b/v4/java/android/support/v4/content/SharedPreferencesCompat.java
deleted file mode 100644
index da5f1fb..0000000
--- a/v4/java/android/support/v4/content/SharedPreferencesCompat.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.v4.content;
-
-import android.content.SharedPreferences;
-import android.os.Build;
-import android.support.annotation.NonNull;
-
-public final class SharedPreferencesCompat {
-
-    public final static class EditorCompat {
-
-        private static EditorCompat sInstance;
-
-        private interface Helper {
-            void apply(@NonNull SharedPreferences.Editor editor);
-        }
-
-        private static class EditorHelperBaseImpl implements Helper {
-
-            @Override
-            public void apply(@NonNull SharedPreferences.Editor editor) {
-                editor.commit();
-            }
-        }
-
-        private static class EditorHelperApi9Impl implements Helper {
-
-            @Override
-            public void apply(@NonNull SharedPreferences.Editor editor) {
-                EditorCompatGingerbread.apply(editor);
-            }
-        }
-
-        private final Helper mHelper;
-
-        private EditorCompat() {
-            if (Build.VERSION.SDK_INT >= 9) {
-                mHelper = new EditorHelperApi9Impl();
-            } else {
-                mHelper = new EditorHelperBaseImpl();
-            }
-        }
-
-        public static EditorCompat getInstance() {
-            if (sInstance == null) {
-                sInstance = new EditorCompat();
-            }
-            return sInstance;
-        }
-
-        public void apply(@NonNull SharedPreferences.Editor editor) {
-            mHelper.apply(editor);
-        }
-    }
-
-    private SharedPreferencesCompat() {}
-
-}
diff --git a/v4/java/android/support/v4/content/WakefulBroadcastReceiver.java b/v4/java/android/support/v4/content/WakefulBroadcastReceiver.java
index 9e41f22..fcfc674 100644
--- a/v4/java/android/support/v4/content/WakefulBroadcastReceiver.java
+++ b/v4/java/android/support/v4/content/WakefulBroadcastReceiver.java
@@ -45,7 +45,8 @@
  * {@link WakefulBroadcastReceiver#startWakefulService startWakefulService()}
  * holds an extra identifying the wake lock.</p>
  *
- * {@sample development/samples/Support4Demos/src/com/example/android/supportv4/content/SimpleWakefulReceiver.java complete}
+ * {@sample frameworks/support/samples/Support4Demos/src/com/example/android/supportv4/content/SimpleWakefulReceiver.java
+ *      complete}
  *
  * <p>The service (in this example, an {@link android.app.IntentService}) does
  * some work. When it is finished, it releases the wake lock by calling
@@ -54,7 +55,8 @@
  * is the same intent that the {@link WakefulBroadcastReceiver} originally
  * passed in.</p>
  *
- * {@sample development/samples/Support4Demos/src/com/example/android/supportv4/content/SimpleWakefulService.java complete}
+ * {@sample frameworks/support/samples/Support4Demos/src/com/example/android/supportv4/content/SimpleWakefulService.java
+ *      complete}
  */
 public abstract class WakefulBroadcastReceiver extends BroadcastReceiver {
     private static final String EXTRA_WAKE_LOCK_ID = "android.support.content.wakelockid";
diff --git a/v4/java/android/support/v4/content/res/ConfigurationHelper.java b/v4/java/android/support/v4/content/res/ConfigurationHelper.java
deleted file mode 100644
index 2ee20d0..0000000
--- a/v4/java/android/support/v4/content/res/ConfigurationHelper.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * Copyright (C) 2016 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 android.support.v4.content.res;
-
-import android.content.res.Resources;
-import android.os.Build;
-import android.support.annotation.NonNull;
-
-/**
- * Helper class which allows access to properties of {@link android.content.res.Configuration} in
- * a backward compatible fashion.
- */
-public final class ConfigurationHelper {
-
-    private static final ConfigurationHelperImpl IMPL;
-
-    static {
-        final int sdk = Build.VERSION.SDK_INT;
-        if (sdk >= 17) {
-            IMPL = new JellybeanMr1Impl();
-        } else if (sdk >= 13) {
-            IMPL = new HoneycombMr2Impl();
-        } else {
-            IMPL = new DonutImpl();
-        }
-    }
-
-    private ConfigurationHelper() {}
-
-    private interface ConfigurationHelperImpl {
-        int getScreenHeightDp(@NonNull Resources resources);
-        int getScreenWidthDp(@NonNull Resources resources);
-        int getSmallestScreenWidthDp(@NonNull Resources resources);
-        int getDensityDpi(@NonNull Resources resources);
-    }
-
-    private static class DonutImpl implements ConfigurationHelperImpl {
-        @Override
-        public int getScreenHeightDp(@NonNull Resources resources) {
-            return ConfigurationHelperDonut.getScreenHeightDp(resources);
-        }
-
-        @Override
-        public int getScreenWidthDp(@NonNull Resources resources) {
-            return ConfigurationHelperDonut.getScreenWidthDp(resources);
-        }
-
-        @Override
-        public int getSmallestScreenWidthDp(@NonNull Resources resources) {
-            return ConfigurationHelperDonut.getSmallestScreenWidthDp(resources);
-        }
-
-        @Override
-        public int getDensityDpi(@NonNull Resources resources) {
-            return ConfigurationHelperDonut.getDensityDpi(resources);
-        }
-    }
-
-    private static class HoneycombMr2Impl extends DonutImpl {
-        @Override
-        public int getScreenHeightDp(@NonNull Resources resources) {
-            return ConfigurationHelperHoneycombMr2.getScreenHeightDp(resources);
-        }
-
-        @Override
-        public int getScreenWidthDp(@NonNull Resources resources) {
-            return ConfigurationHelperHoneycombMr2.getScreenWidthDp(resources);
-        }
-
-        @Override
-        public int getSmallestScreenWidthDp(@NonNull Resources resources) {
-            return ConfigurationHelperHoneycombMr2.getSmallestScreenWidthDp(resources);
-        }
-    }
-
-    private static class JellybeanMr1Impl extends HoneycombMr2Impl {
-        @Override
-        public int getDensityDpi(@NonNull Resources resources) {
-            return ConfigurationHelperJellybeanMr1.getDensityDpi(resources);
-        }
-    }
-
-    /**
-     * Returns the current height of the available screen space, in dp units.
-     *
-     * <p>Uses {@code Configuration.screenHeightDp} when available, otherwise an approximation
-     * is computed and returned.</p>
-     */
-    public static int getScreenHeightDp(@NonNull Resources resources) {
-        return IMPL.getScreenHeightDp(resources);
-    }
-
-    /**
-     * Returns the current width of the available screen space, in dp units.
-     *
-     * <p>Uses {@code Configuration.screenWidthDp} when available, otherwise an approximation
-     * is computed and returned.</p>
-     */
-    public static int getScreenWidthDp(@NonNull Resources resources) {
-        return IMPL.getScreenWidthDp(resources);
-    }
-
-    /**
-     * Returns The smallest screen size an application will see in normal operation, in dp units.
-     *
-     * <p>Uses {@code Configuration.smallestScreenWidthDp} when available, otherwise an
-     * approximation is computed and returned.</p>
-     */
-    public static int getSmallestScreenWidthDp(@NonNull Resources resources) {
-        return IMPL.getSmallestScreenWidthDp(resources);
-    }
-
-    /**
-     * Returns the target screen density being rendered to.
-     *
-     * <p>Uses {@code Configuration.densityDpi} when available, otherwise an approximation
-     * is computed and returned.</p>
-     */
-    public static int getDensityDpi(@NonNull Resources resources) {
-        return IMPL.getDensityDpi(resources);
-    }
-}
diff --git a/v4/java/android/support/v4/graphics/drawable/DrawableCompat.java b/v4/java/android/support/v4/graphics/drawable/DrawableCompat.java
deleted file mode 100644
index b28c7d9..0000000
--- a/v4/java/android/support/v4/graphics/drawable/DrawableCompat.java
+++ /dev/null
@@ -1,531 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.support.v4.graphics.drawable;
-
-import android.content.res.ColorStateList;
-import android.content.res.Resources;
-import android.graphics.ColorFilter;
-import android.graphics.PorterDuff;
-import android.graphics.drawable.Drawable;
-import android.support.annotation.ColorInt;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.v4.view.ViewCompat;
-import android.util.AttributeSet;
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-
-import java.io.IOException;
-
-/**
- * Helper for accessing features in {@link android.graphics.drawable.Drawable}
- * introduced after API level 4 in a backwards compatible fashion.
- */
-public final class DrawableCompat {
-    /**
-     * Interface for the full API.
-     */
-    interface DrawableImpl {
-        void jumpToCurrentState(Drawable drawable);
-        void setAutoMirrored(Drawable drawable, boolean mirrored);
-        boolean isAutoMirrored(Drawable drawable);
-        void setHotspot(Drawable drawable, float x, float y);
-        void setHotspotBounds(Drawable drawable, int left, int top, int right, int bottom);
-        void setTint(Drawable drawable, int tint);
-        void setTintList(Drawable drawable, ColorStateList tint);
-        void setTintMode(Drawable drawable, PorterDuff.Mode tintMode);
-        Drawable wrap(Drawable drawable);
-        boolean setLayoutDirection(Drawable drawable, int layoutDirection);
-        int getLayoutDirection(Drawable drawable);
-        int getAlpha(Drawable drawable);
-        void applyTheme(Drawable drawable, Resources.Theme t);
-        boolean canApplyTheme(Drawable drawable);
-        ColorFilter getColorFilter(Drawable drawable);
-        void inflate(Drawable drawable, Resources res, XmlPullParser parser, AttributeSet attrs,
-                     Resources.Theme t) throws IOException, XmlPullParserException;
-    }
-
-    /**
-     * Interface implementation that doesn't use anything about v4 APIs.
-     */
-    static class BaseDrawableImpl implements DrawableImpl {
-        @Override
-        public void jumpToCurrentState(Drawable drawable) {
-        }
-
-        @Override
-        public void setAutoMirrored(Drawable drawable, boolean mirrored) {
-        }
-
-        @Override
-        public boolean isAutoMirrored(Drawable drawable) {
-            return false;
-        }
-
-        @Override
-        public void setHotspot(Drawable drawable, float x, float y) {
-        }
-
-        @Override
-        public void setHotspotBounds(Drawable drawable, int left, int top, int right, int bottom) {
-        }
-
-        @Override
-        public void setTint(Drawable drawable, int tint) {
-            DrawableCompatBase.setTint(drawable, tint);
-        }
-
-        @Override
-        public void setTintList(Drawable drawable, ColorStateList tint) {
-            DrawableCompatBase.setTintList(drawable, tint);
-        }
-
-        @Override
-        public void setTintMode(Drawable drawable, PorterDuff.Mode tintMode) {
-            DrawableCompatBase.setTintMode(drawable, tintMode);
-        }
-
-        @Override
-        public Drawable wrap(Drawable drawable) {
-            return DrawableCompatBase.wrapForTinting(drawable);
-        }
-
-        @Override
-        public boolean setLayoutDirection(Drawable drawable, int layoutDirection) {
-            // No op for API < 23
-            return false;
-        }
-
-        @Override
-        public int getLayoutDirection(Drawable drawable) {
-            return ViewCompat.LAYOUT_DIRECTION_LTR;
-        }
-
-        @Override
-        public int getAlpha(Drawable drawable) {
-            return 0;
-        }
-
-        @Override
-        public void applyTheme(Drawable drawable, Resources.Theme t) {
-        }
-
-        @Override
-        public boolean canApplyTheme(Drawable drawable) {
-            return false;
-        }
-
-        @Override
-        public ColorFilter getColorFilter(Drawable drawable) {
-            return null;
-        }
-
-        @Override
-        public void inflate(Drawable drawable, Resources res, XmlPullParser parser,
-                            AttributeSet attrs, Resources.Theme t)
-                throws IOException, XmlPullParserException {
-            DrawableCompatBase.inflate(drawable, res, parser, attrs, t);
-        }
-    }
-
-    /**
-     * Interface implementation for devices with at least v5 APIs.
-     */
-    static class EclairDrawableImpl extends BaseDrawableImpl {
-        @Override
-        public Drawable wrap(Drawable drawable) {
-            return DrawableCompatEclair.wrapForTinting(drawable);
-        }
-    }
-
-    /**
-     * Interface implementation for devices with at least v11 APIs.
-     */
-    static class HoneycombDrawableImpl extends EclairDrawableImpl {
-        @Override
-        public void jumpToCurrentState(Drawable drawable) {
-            DrawableCompatHoneycomb.jumpToCurrentState(drawable);
-        }
-
-        @Override
-        public Drawable wrap(Drawable drawable) {
-            return DrawableCompatHoneycomb.wrapForTinting(drawable);
-        }
-    }
-
-    static class JellybeanMr1DrawableImpl extends HoneycombDrawableImpl {
-        @Override
-        public boolean setLayoutDirection(Drawable drawable, int layoutDirection) {
-            return DrawableCompatJellybeanMr1.setLayoutDirection(drawable, layoutDirection);
-        }
-
-        @Override
-        public int getLayoutDirection(Drawable drawable) {
-            final int dir = DrawableCompatJellybeanMr1.getLayoutDirection(drawable);
-            return dir >= 0 ? dir : ViewCompat.LAYOUT_DIRECTION_LTR;
-        }
-    }
-
-    /**
-     * Interface implementation for devices with at least KitKat APIs.
-     */
-    static class KitKatDrawableImpl extends JellybeanMr1DrawableImpl {
-        @Override
-        public void setAutoMirrored(Drawable drawable, boolean mirrored) {
-            DrawableCompatKitKat.setAutoMirrored(drawable, mirrored);
-        }
-
-        @Override
-        public boolean isAutoMirrored(Drawable drawable) {
-            return DrawableCompatKitKat.isAutoMirrored(drawable);
-        }
-
-        @Override
-        public Drawable wrap(Drawable drawable) {
-            return DrawableCompatKitKat.wrapForTinting(drawable);
-        }
-
-        @Override
-        public int getAlpha(Drawable drawable) {
-            return DrawableCompatKitKat.getAlpha(drawable);
-        }
-    }
-
-    /**
-     * Interface implementation for devices with at least L APIs.
-     */
-    static class LollipopDrawableImpl extends KitKatDrawableImpl {
-        @Override
-        public void setHotspot(Drawable drawable, float x, float y) {
-            DrawableCompatLollipop.setHotspot(drawable, x, y);
-        }
-
-        @Override
-        public void setHotspotBounds(Drawable drawable, int left, int top, int right, int bottom) {
-            DrawableCompatLollipop.setHotspotBounds(drawable, left, top, right, bottom);
-        }
-
-        @Override
-        public void setTint(Drawable drawable, int tint) {
-            DrawableCompatLollipop.setTint(drawable, tint);
-        }
-
-        @Override
-        public void setTintList(Drawable drawable, ColorStateList tint) {
-            DrawableCompatLollipop.setTintList(drawable, tint);
-        }
-
-        @Override
-        public void setTintMode(Drawable drawable, PorterDuff.Mode tintMode) {
-            DrawableCompatLollipop.setTintMode(drawable, tintMode);
-        }
-
-        @Override
-        public Drawable wrap(Drawable drawable) {
-            return DrawableCompatLollipop.wrapForTinting(drawable);
-        }
-
-        @Override
-        public void applyTheme(Drawable drawable, Resources.Theme t) {
-            DrawableCompatLollipop.applyTheme(drawable, t);
-        }
-
-        @Override
-        public boolean canApplyTheme(Drawable drawable) {
-            return DrawableCompatLollipop.canApplyTheme(drawable);
-        }
-
-        @Override
-        public ColorFilter getColorFilter(Drawable drawable) {
-            return DrawableCompatLollipop.getColorFilter(drawable);
-        }
-
-        @Override
-        public void inflate(Drawable drawable, Resources res, XmlPullParser parser,
-                            AttributeSet attrs, Resources.Theme t)
-                throws IOException, XmlPullParserException {
-            DrawableCompatLollipop.inflate(drawable, res, parser, attrs, t);
-        }
-    }
-
-    /**
-     * Interface implementation for devices with at least M APIs.
-     */
-    static class MDrawableImpl extends LollipopDrawableImpl {
-        @Override
-        public boolean setLayoutDirection(Drawable drawable, int layoutDirection) {
-            return DrawableCompatApi23.setLayoutDirection(drawable, layoutDirection);
-        }
-
-        @Override
-        public int getLayoutDirection(Drawable drawable) {
-            return DrawableCompatApi23.getLayoutDirection(drawable);
-        }
-
-        @Override
-        public Drawable wrap(Drawable drawable) {
-            // No need to wrap on M+
-            return drawable;
-        }
-    }
-
-    /**
-     * Select the correct implementation to use for the current platform.
-     */
-    static final DrawableImpl IMPL;
-    static {
-        final int version = android.os.Build.VERSION.SDK_INT;
-        if (version >= 23) {
-            IMPL = new MDrawableImpl();
-        } else if (version >= 21) {
-            IMPL = new LollipopDrawableImpl();
-        } else if (version >= 19) {
-            IMPL = new KitKatDrawableImpl();
-        } else if (version >= 17) {
-            IMPL = new JellybeanMr1DrawableImpl();
-        } else if (version >= 11) {
-            IMPL = new HoneycombDrawableImpl();
-        } else if (version >= 5) {
-            IMPL = new EclairDrawableImpl();
-        } else {
-            IMPL = new BaseDrawableImpl();
-        }
-    }
-
-    /**
-     * Call {@link Drawable#jumpToCurrentState() Drawable.jumpToCurrentState()}.
-     * <p>
-     * If running on a pre-{@link android.os.Build.VERSION_CODES#HONEYCOMB}
-     * device this method does nothing.
-     *
-     * @param drawable The Drawable against which to invoke the method.
-     */
-    public static void jumpToCurrentState(@NonNull Drawable drawable) {
-        IMPL.jumpToCurrentState(drawable);
-    }
-
-    /**
-     * Set whether this Drawable is automatically mirrored when its layout
-     * direction is RTL (right-to left). See
-     * {@link android.util.LayoutDirection}.
-     * <p>
-     * If running on a pre-{@link android.os.Build.VERSION_CODES#KITKAT} device
-     * this method does nothing.
-     *
-     * @param drawable The Drawable against which to invoke the method.
-     * @param mirrored Set to true if the Drawable should be mirrored, false if
-     *            not.
-     */
-    public static void setAutoMirrored(@NonNull Drawable drawable, boolean mirrored) {
-        IMPL.setAutoMirrored(drawable, mirrored);
-    }
-
-    /**
-     * Tells if this Drawable will be automatically mirrored when its layout
-     * direction is RTL right-to-left. See {@link android.util.LayoutDirection}.
-     * <p>
-     * If running on a pre-{@link android.os.Build.VERSION_CODES#KITKAT} device
-     * this method returns false.
-     *
-     * @param drawable The Drawable against which to invoke the method.
-     * @return boolean Returns true if this Drawable will be automatically
-     *         mirrored.
-     */
-    public static boolean isAutoMirrored(@NonNull Drawable drawable) {
-        return IMPL.isAutoMirrored(drawable);
-    }
-
-    /**
-     * Specifies the hotspot's location within the drawable.
-     *
-     * @param drawable The Drawable against which to invoke the method.
-     * @param x The X coordinate of the center of the hotspot
-     * @param y The Y coordinate of the center of the hotspot
-     */
-    public static void setHotspot(@NonNull Drawable drawable, float x, float y) {
-        IMPL.setHotspot(drawable, x, y);
-    }
-
-    /**
-     * Sets the bounds to which the hotspot is constrained, if they should be
-     * different from the drawable bounds.
-     *
-     * @param drawable The Drawable against which to invoke the method.
-     */
-    public static void setHotspotBounds(@NonNull Drawable drawable, int left, int top,
-            int right, int bottom) {
-        IMPL.setHotspotBounds(drawable, left, top, right, bottom);
-    }
-
-    /**
-     * Specifies a tint for {@code drawable}.
-     *
-     * @param drawable The Drawable against which to invoke the method.
-     * @param tint     Color to use for tinting this drawable
-     */
-    public static void setTint(@NonNull Drawable drawable, @ColorInt int tint) {
-        IMPL.setTint(drawable, tint);
-    }
-
-    /**
-     * Specifies a tint for {@code drawable} as a color state list.
-     *
-     * @param drawable The Drawable against which to invoke the method.
-     * @param tint     Color state list to use for tinting this drawable, or null to clear the tint
-     */
-    public static void setTintList(@NonNull Drawable drawable, @Nullable ColorStateList tint) {
-        IMPL.setTintList(drawable, tint);
-    }
-
-    /**
-     * Specifies a tint blending mode for {@code drawable}.
-     *
-     * @param drawable The Drawable against which to invoke the method.
-     * @param tintMode A Porter-Duff blending mode
-     */
-    public static void setTintMode(@NonNull Drawable drawable, @Nullable PorterDuff.Mode tintMode) {
-        IMPL.setTintMode(drawable, tintMode);
-    }
-
-    /**
-     * Get the alpha value of the {@code drawable}.
-     * 0 means fully transparent, 255 means fully opaque.
-     *
-     * @param drawable The Drawable against which to invoke the method.
-     */
-    public static int getAlpha(@NonNull Drawable drawable) {
-        return IMPL.getAlpha(drawable);
-    }
-
-    /**
-     * Applies the specified theme to this Drawable and its children.
-     */
-    public static void applyTheme(Drawable drawable, Resources.Theme t) {
-        IMPL.applyTheme(drawable, t);
-    }
-
-    /**
-     * Whether a theme can be applied to this Drawable and its children.
-     */
-    public static boolean canApplyTheme(Drawable drawable) {
-        return IMPL.canApplyTheme(drawable);
-    }
-
-    /**
-     * Returns the current color filter, or {@code null} if none set.
-     *
-     * @return the current color filter, or {@code null} if none set
-     */
-    public static ColorFilter getColorFilter(Drawable drawable) {
-        return IMPL.getColorFilter(drawable);
-    }
-
-    /**
-     * Inflate this Drawable from an XML resource optionally styled by a theme.
-     *
-     * @param res Resources used to resolve attribute values
-     * @param parser XML parser from which to inflate this Drawable
-     * @param attrs Base set of attribute values
-     * @param theme Theme to apply, may be null
-     * @throws XmlPullParserException
-     * @throws IOException
-     */
-    public static void inflate(Drawable drawable, Resources res, XmlPullParser parser,
-                               AttributeSet attrs, Resources.Theme theme)
-            throws XmlPullParserException, IOException {
-        IMPL.inflate(drawable, res, parser, attrs, theme);
-    }
-
-    /**
-     * Potentially wrap {@code drawable} so that it may be used for tinting across the
-     * different API levels, via the tinting methods in this class.
-     *
-     * <p>You must use the result of this call. If the given drawable is being used by a view
-     * (as it's background for instance), you must replace the original drawable with
-     * the result of this call:</p>
-     *
-     * <pre>
-     * Drawable bg = DrawableCompat.wrap(view.getBackground());
-     * // Need to set the background with the wrapped drawable
-     * view.setBackground(bg);
-     *
-     * // You can now tint the drawable
-     * DrawableCompat.setTint(bg, ...);
-     * </pre>
-     *
-     * <p>If you need to get hold of the original {@link android.graphics.drawable.Drawable} again,
-     * you can use the value returned from {@link #unwrap(Drawable)}.</p>
-     *
-     * @param drawable The Drawable to process
-     * @return A drawable capable of being tinted across all API levels.
-     *
-     * @see #setTint(Drawable, int)
-     * @see #setTintList(Drawable, ColorStateList)
-     * @see #setTintMode(Drawable, PorterDuff.Mode)
-     * @see #unwrap(Drawable)
-     */
-    public static Drawable wrap(@NonNull Drawable drawable) {
-        return IMPL.wrap(drawable);
-    }
-
-    /**
-     * Unwrap {@code drawable} if it is the result of a call to {@link #wrap(Drawable)}. If
-     * the {@code drawable} is not the result of a call to {@link #wrap(Drawable)} then
-     * {@code drawable} is returned as-is.
-     *
-     * @param drawable The drawable to unwrap
-     * @return the unwrapped {@link Drawable} or {@code drawable} if it hasn't been wrapped.
-     *
-     * @see #wrap(Drawable)
-     */
-    public static <T extends Drawable> T unwrap(@NonNull Drawable drawable) {
-        if (drawable instanceof DrawableWrapper) {
-            return (T) ((DrawableWrapper) drawable).getWrappedDrawable();
-        }
-        return (T) drawable;
-    }
-
-    /**
-     * Set the layout direction for this drawable. Should be a resolved
-     * layout direction, as the Drawable has no capacity to do the resolution on
-     * its own.
-     *
-     * @param layoutDirection the resolved layout direction for the drawable,
-     *                        either {@link ViewCompat#LAYOUT_DIRECTION_LTR}
-     *                        or {@link ViewCompat#LAYOUT_DIRECTION_RTL}
-     * @return {@code true} if the layout direction change has caused the
-     *         appearance of the drawable to change such that it needs to be
-     *         re-drawn, {@code false} otherwise
-     * @see #getLayoutDirection(Drawable)
-     */
-    public static boolean setLayoutDirection(@NonNull Drawable drawable, int layoutDirection) {
-        return IMPL.setLayoutDirection(drawable, layoutDirection);
-    }
-
-    /**
-     * Returns the resolved layout direction for this Drawable.
-     *
-     * @return One of {@link ViewCompat#LAYOUT_DIRECTION_LTR},
-     *         {@link ViewCompat#LAYOUT_DIRECTION_RTL}
-     * @see #setLayoutDirection(Drawable, int)
-     */
-    public static int getLayoutDirection(@NonNull Drawable drawable) {
-        return IMPL.getLayoutDirection(drawable);
-    }
-
-    private DrawableCompat() {}
-}
diff --git a/v4/java/android/support/v4/media/MediaBrowserServiceCompat.java b/v4/java/android/support/v4/media/MediaBrowserServiceCompat.java
deleted file mode 100644
index 9163cd7..0000000
--- a/v4/java/android/support/v4/media/MediaBrowserServiceCompat.java
+++ /dev/null
@@ -1,1190 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.v4.media;
-
-import static android.support.v4.media.MediaBrowserProtocol.CLIENT_MSG_ADD_SUBSCRIPTION;
-import static android.support.v4.media.MediaBrowserProtocol.CLIENT_MSG_CONNECT;
-import static android.support.v4.media.MediaBrowserProtocol.CLIENT_MSG_DISCONNECT;
-import static android.support.v4.media.MediaBrowserProtocol.CLIENT_MSG_GET_MEDIA_ITEM;
-import static android.support.v4.media.MediaBrowserProtocol.CLIENT_MSG_REGISTER_CALLBACK_MESSENGER;
-import static android.support.v4.media.MediaBrowserProtocol.CLIENT_MSG_REMOVE_SUBSCRIPTION;
-import static android.support.v4.media.MediaBrowserProtocol.CLIENT_MSG_UNREGISTER_CALLBACK_MESSENGER;
-import static android.support.v4.media.MediaBrowserProtocol.DATA_CALLBACK_TOKEN;
-import static android.support.v4.media.MediaBrowserProtocol.DATA_CALLING_UID;
-import static android.support.v4.media.MediaBrowserProtocol.DATA_MEDIA_ITEM_ID;
-import static android.support.v4.media.MediaBrowserProtocol.DATA_MEDIA_ITEM_LIST;
-import static android.support.v4.media.MediaBrowserProtocol.DATA_MEDIA_SESSION_TOKEN;
-import static android.support.v4.media.MediaBrowserProtocol.DATA_OPTIONS;
-import static android.support.v4.media.MediaBrowserProtocol.DATA_PACKAGE_NAME;
-import static android.support.v4.media.MediaBrowserProtocol.DATA_RESULT_RECEIVER;
-import static android.support.v4.media.MediaBrowserProtocol.DATA_ROOT_HINTS;
-import static android.support.v4.media.MediaBrowserProtocol.EXTRA_CLIENT_VERSION;
-import static android.support.v4.media.MediaBrowserProtocol.EXTRA_MESSENGER_BINDER;
-import static android.support.v4.media.MediaBrowserProtocol.EXTRA_SERVICE_VERSION;
-import static android.support.v4.media.MediaBrowserProtocol.SERVICE_MSG_ON_CONNECT;
-import static android.support.v4.media.MediaBrowserProtocol.SERVICE_MSG_ON_CONNECT_FAILED;
-import static android.support.v4.media.MediaBrowserProtocol.SERVICE_MSG_ON_LOAD_CHILDREN;
-import static android.support.v4.media.MediaBrowserProtocol.SERVICE_VERSION_CURRENT;
-
-import android.app.Service;
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.os.Binder;
-import android.os.Build;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.IBinder;
-import android.os.Message;
-import android.os.Messenger;
-import android.os.Parcel;
-import android.os.RemoteException;
-import android.support.annotation.IntDef;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.v4.app.BundleCompat;
-import android.support.v4.media.session.MediaSessionCompat;
-import android.support.v4.os.BuildCompat;
-import android.support.v4.os.ResultReceiver;
-import android.support.v4.util.ArrayMap;
-import android.support.v4.util.Pair;
-import android.text.TextUtils;
-import android.util.Log;
-
-import java.io.FileDescriptor;
-import java.io.PrintWriter;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-
-/**
- * Base class for media browse services.
- * <p>
- * Media browse services enable applications to browse media content provided by an application
- * and ask the application to start playing it. They may also be used to control content that
- * is already playing by way of a {@link MediaSessionCompat}.
- * </p>
- *
- * To extend this class, you must declare the service in your manifest file with
- * an intent filter with the {@link #SERVICE_INTERFACE} action.
- *
- * For example:
- * </p><pre>
- * &lt;service android:name=".MyMediaBrowserServiceCompat"
- *          android:label="&#64;string/service_name" >
- *     &lt;intent-filter>
- *         &lt;action android:name="android.media.browse.MediaBrowserService" />
- *     &lt;/intent-filter>
- * &lt;/service>
- * </pre>
- */
-public abstract class MediaBrowserServiceCompat extends Service {
-    private static final String TAG = "MBServiceCompat";
-    private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
-
-    private MediaBrowserServiceImpl mImpl;
-
-    /**
-     * The {@link Intent} that must be declared as handled by the service.
-     */
-    public static final String SERVICE_INTERFACE = "android.media.browse.MediaBrowserService";
-
-    /**
-     * A key for passing the MediaItem to the ResultReceiver in getItem.
-     *
-     * @hide
-     */
-    public static final String KEY_MEDIA_ITEM = "media_item";
-
-    private static final int RESULT_FLAG_OPTION_NOT_HANDLED = 0x00000001;
-
-    /** @hide */
-    @Retention(RetentionPolicy.SOURCE)
-    @IntDef(flag=true, value = { RESULT_FLAG_OPTION_NOT_HANDLED })
-    private @interface ResultFlags { }
-
-    private final ArrayMap<IBinder, ConnectionRecord> mConnections = new ArrayMap<>();
-    private ConnectionRecord mCurConnection;
-    private final ServiceHandler mHandler = new ServiceHandler();
-    MediaSessionCompat.Token mSession;
-
-    interface MediaBrowserServiceImpl {
-        void onCreate();
-        IBinder onBind(Intent intent);
-        void setSessionToken(MediaSessionCompat.Token token);
-        void notifyChildrenChanged(final String parentId, final Bundle options);
-        Bundle getBrowserRootHints();
-    }
-
-    class MediaBrowserServiceImplBase implements MediaBrowserServiceImpl {
-        private Messenger mMessenger;
-
-        @Override
-        public void onCreate() {
-            mMessenger = new Messenger(mHandler);
-        }
-
-        @Override
-        public IBinder onBind(Intent intent) {
-            if (SERVICE_INTERFACE.equals(intent.getAction())) {
-                return mMessenger.getBinder();
-            }
-            return null;
-        }
-
-        @Override
-        public void setSessionToken(final MediaSessionCompat.Token token) {
-            mHandler.post(new Runnable() {
-                @Override
-                public void run() {
-                    for (IBinder key : mConnections.keySet()) {
-                        ConnectionRecord connection = mConnections.get(key);
-                        try {
-                            connection.callbacks.onConnect(connection.root.getRootId(), token,
-                                    connection.root.getExtras());
-                        } catch (RemoteException e) {
-                            Log.w(TAG, "Connection for " + connection.pkg + " is no longer valid.");
-                            mConnections.remove(key);
-                        }
-                    }
-                }
-            });
-        }
-
-        @Override
-        public void notifyChildrenChanged(@NonNull final String parentId, final Bundle options) {
-            mHandler.post(new Runnable() {
-                @Override
-                public void run() {
-                    for (IBinder binder : mConnections.keySet()) {
-                        ConnectionRecord connection = mConnections.get(binder);
-                        List<Pair<IBinder, Bundle>> callbackList =
-                                connection.subscriptions.get(parentId);
-                        if (callbackList != null) {
-                            for (Pair<IBinder, Bundle> callback : callbackList) {
-                                if (MediaBrowserCompatUtils.hasDuplicatedItems(
-                                        options, callback.second)) {
-                                    performLoadChildren(parentId, connection, callback.second);
-                                }
-                            }
-                        }
-                    }
-                }
-            });
-        }
-
-        @Override
-        public Bundle getBrowserRootHints() {
-            if (mCurConnection == null) {
-                throw new IllegalStateException("This should be called inside of onLoadChildren or"
-                        + " onLoadItem methods");
-            }
-            return mCurConnection.rootHints == null ? null : new Bundle(mCurConnection.rootHints);
-        }
-    }
-
-    class MediaBrowserServiceImplApi21 implements MediaBrowserServiceImpl,
-            MediaBrowserServiceCompatApi21.ServiceCompatProxy {
-        Object mServiceObj;
-        Messenger mMessenger;
-
-        @Override
-        public void onCreate() {
-            mServiceObj = MediaBrowserServiceCompatApi21.createService(
-                    MediaBrowserServiceCompat.this, this);
-            MediaBrowserServiceCompatApi21.onCreate(mServiceObj);
-        }
-
-        @Override
-        public IBinder onBind(Intent intent) {
-            return MediaBrowserServiceCompatApi21.onBind(mServiceObj, intent);
-        }
-
-        @Override
-        public void setSessionToken(MediaSessionCompat.Token token) {
-            MediaBrowserServiceCompatApi21.setSessionToken(mServiceObj, token.getToken());
-        }
-
-        @Override
-        public void notifyChildrenChanged(final String parentId, final Bundle options) {
-            if (mMessenger == null) {
-                MediaBrowserServiceCompatApi21.notifyChildrenChanged(mServiceObj, parentId);
-            } else {
-                mHandler.post(new Runnable() {
-                    @Override
-                    public void run() {
-                        for (IBinder binder : mConnections.keySet()) {
-                            ConnectionRecord connection = mConnections.get(binder);
-                            List<Pair<IBinder, Bundle>> callbackList =
-                                    connection.subscriptions.get(parentId);
-                            if (callbackList != null) {
-                                for (Pair<IBinder, Bundle> callback : callbackList) {
-                                    if (MediaBrowserCompatUtils.hasDuplicatedItems(
-                                            options, callback.second)) {
-                                        performLoadChildren(parentId, connection, callback.second);
-                                    }
-                                }
-                            }
-                        }
-                    }
-                });
-            }
-        }
-
-        @Override
-        public Bundle getBrowserRootHints() {
-            if (mMessenger == null) {
-                // TODO: Handle getBrowserRootHints when connected with framework MediaBrowser.
-                return null;
-            }
-            if (mCurConnection == null) {
-                throw new IllegalStateException("This should be called inside of onLoadChildren or"
-                        + " onLoadItem methods");
-            }
-            return mCurConnection.rootHints == null ? null : new Bundle(mCurConnection.rootHints);
-        }
-
-        @Override
-        public MediaBrowserServiceCompatApi21.BrowserRoot onGetRoot(
-                String clientPackageName, int clientUid, Bundle rootHints) {
-            Bundle rootExtras = null;
-            if (rootHints != null && rootHints.getInt(EXTRA_CLIENT_VERSION, 0) != 0) {
-                rootHints.remove(EXTRA_CLIENT_VERSION);
-                mMessenger = new Messenger(mHandler);
-                rootExtras = new Bundle();
-                rootExtras.putInt(EXTRA_SERVICE_VERSION, SERVICE_VERSION_CURRENT);
-                BundleCompat.putBinder(rootExtras, EXTRA_MESSENGER_BINDER, mMessenger.getBinder());
-            }
-            BrowserRoot root = MediaBrowserServiceCompat.this.onGetRoot(
-                    clientPackageName, clientUid, rootHints);
-            if (root == null) {
-                return null;
-            }
-            if (rootExtras == null) {
-                rootExtras = root.getExtras();
-            } else if (root.getExtras() != null) {
-                rootExtras.putAll(root.getExtras());
-            }
-            return new MediaBrowserServiceCompatApi21.BrowserRoot(
-                    root.getRootId(), rootExtras);
-        }
-
-        @Override
-        public void onLoadChildren(String parentId,
-                final MediaBrowserServiceCompatApi21.ResultWrapper<List<Parcel>> resultWrapper) {
-            final Result<List<MediaBrowserCompat.MediaItem>> result
-                    = new Result<List<MediaBrowserCompat.MediaItem>>(parentId) {
-                @Override
-                void onResultSent(List<MediaBrowserCompat.MediaItem> list, @ResultFlags int flags) {
-                    List<Parcel> parcelList = null;
-                    if (list != null) {
-                        parcelList = new ArrayList<>();
-                        for (MediaBrowserCompat.MediaItem item : list) {
-                            Parcel parcel = Parcel.obtain();
-                            item.writeToParcel(parcel, 0);
-                            parcelList.add(parcel);
-                        }
-                    }
-                    resultWrapper.sendResult(parcelList);
-                }
-
-                @Override
-                public void detach() {
-                    resultWrapper.detach();
-                }
-            };
-            MediaBrowserServiceCompat.this.onLoadChildren(parentId, result);
-        }
-    }
-
-    class MediaBrowserServiceImplApi23 extends MediaBrowserServiceImplApi21 implements
-            MediaBrowserServiceCompatApi23.ServiceCompatProxy {
-        @Override
-        public void onCreate() {
-            mServiceObj = MediaBrowserServiceCompatApi23.createService(
-                    MediaBrowserServiceCompat.this, this);
-            MediaBrowserServiceCompatApi21.onCreate(mServiceObj);
-        }
-
-        @Override
-        public void onLoadItem(String itemId,
-                final MediaBrowserServiceCompatApi21.ResultWrapper<Parcel> resultWrapper) {
-            final Result<MediaBrowserCompat.MediaItem> result
-                    = new Result<MediaBrowserCompat.MediaItem>(itemId) {
-                @Override
-                void onResultSent(MediaBrowserCompat.MediaItem item, @ResultFlags int flags) {
-                    Parcel parcelItem = Parcel.obtain();
-                    item.writeToParcel(parcelItem, 0);
-                    resultWrapper.sendResult(parcelItem);
-                }
-
-                @Override
-                public void detach() {
-                    resultWrapper.detach();
-                }
-            };
-            MediaBrowserServiceCompat.this.onLoadItem(itemId, result);
-        }
-    }
-
-    class MediaBrowserServiceImplApi24 extends MediaBrowserServiceImplApi23 implements
-            MediaBrowserServiceCompatApi24.ServiceCompatProxy {
-        @Override
-        public void onCreate() {
-            mServiceObj = MediaBrowserServiceCompatApi24.createService(
-                    MediaBrowserServiceCompat.this, this);
-            MediaBrowserServiceCompatApi21.onCreate(mServiceObj);
-        }
-
-        @Override
-        public void notifyChildrenChanged(final String parentId, final Bundle options) {
-            if (options == null) {
-                MediaBrowserServiceCompatApi21.notifyChildrenChanged(mServiceObj, parentId);
-            } else {
-                MediaBrowserServiceCompatApi24.notifyChildrenChanged(mServiceObj, parentId,
-                        options);
-            }
-        }
-
-        @Override
-        public void onLoadChildren(String parentId,
-                final MediaBrowserServiceCompatApi24.ResultWrapper resultWrapper, Bundle options) {
-            final Result<List<MediaBrowserCompat.MediaItem>> result
-                    = new Result<List<MediaBrowserCompat.MediaItem>>(parentId) {
-                @Override
-                void onResultSent(List<MediaBrowserCompat.MediaItem> list, @ResultFlags int flags) {
-                    List<Parcel> parcelList = null;
-                    if (list != null) {
-                        parcelList = new ArrayList<>();
-                        for (MediaBrowserCompat.MediaItem item : list) {
-                            Parcel parcel = Parcel.obtain();
-                            item.writeToParcel(parcel, 0);
-                            parcelList.add(parcel);
-                        }
-                    }
-                    resultWrapper.sendResult(parcelList, flags);
-                }
-
-                @Override
-                public void detach() {
-                    resultWrapper.detach();
-                }
-            };
-            MediaBrowserServiceCompat.this.onLoadChildren(parentId, result, options);
-        }
-
-        @Override
-        public Bundle getBrowserRootHints() {
-            return MediaBrowserServiceCompatApi24.getBrowserRootHints(mServiceObj);
-        }
-    }
-
-    private final class ServiceHandler extends Handler {
-        private final ServiceBinderImpl mServiceBinderImpl = new ServiceBinderImpl();
-
-        @Override
-        public void handleMessage(Message msg) {
-            Bundle data = msg.getData();
-            switch (msg.what) {
-                case CLIENT_MSG_CONNECT:
-                    mServiceBinderImpl.connect(data.getString(DATA_PACKAGE_NAME),
-                            data.getInt(DATA_CALLING_UID), data.getBundle(DATA_ROOT_HINTS),
-                            new ServiceCallbacksCompat(msg.replyTo));
-                    break;
-                case CLIENT_MSG_DISCONNECT:
-                    mServiceBinderImpl.disconnect(new ServiceCallbacksCompat(msg.replyTo));
-                    break;
-                case CLIENT_MSG_ADD_SUBSCRIPTION:
-                    mServiceBinderImpl.addSubscription(data.getString(DATA_MEDIA_ITEM_ID),
-                            BundleCompat.getBinder(data, DATA_CALLBACK_TOKEN),
-                            data.getBundle(DATA_OPTIONS),
-                            new ServiceCallbacksCompat(msg.replyTo));
-                    break;
-                case CLIENT_MSG_REMOVE_SUBSCRIPTION:
-                    mServiceBinderImpl.removeSubscription(data.getString(DATA_MEDIA_ITEM_ID),
-                            BundleCompat.getBinder(data, DATA_CALLBACK_TOKEN),
-                            new ServiceCallbacksCompat(msg.replyTo));
-                    break;
-                case CLIENT_MSG_GET_MEDIA_ITEM:
-                    mServiceBinderImpl.getMediaItem(data.getString(DATA_MEDIA_ITEM_ID),
-                            (ResultReceiver) data.getParcelable(DATA_RESULT_RECEIVER),
-                            new ServiceCallbacksCompat(msg.replyTo));
-                    break;
-                case CLIENT_MSG_REGISTER_CALLBACK_MESSENGER:
-                    mServiceBinderImpl.registerCallbacks(new ServiceCallbacksCompat(msg.replyTo),
-                            data.getBundle(DATA_ROOT_HINTS));
-                    break;
-                case CLIENT_MSG_UNREGISTER_CALLBACK_MESSENGER:
-                    mServiceBinderImpl.unregisterCallbacks(new ServiceCallbacksCompat(msg.replyTo));
-                    break;
-                default:
-                    Log.w(TAG, "Unhandled message: " + msg
-                            + "\n  Service version: " + SERVICE_VERSION_CURRENT
-                            + "\n  Client version: " + msg.arg1);
-            }
-        }
-
-        @Override
-        public boolean sendMessageAtTime(Message msg, long uptimeMillis) {
-            // Binder.getCallingUid() in handleMessage will return the uid of this process.
-            // In order to get the right calling uid, Binder.getCallingUid() should be called here.
-            Bundle data = msg.getData();
-            data.setClassLoader(MediaBrowserCompat.class.getClassLoader());
-            data.putInt(DATA_CALLING_UID, Binder.getCallingUid());
-            return super.sendMessageAtTime(msg, uptimeMillis);
-        }
-
-        public void postOrRun(Runnable r) {
-            if (Thread.currentThread() == getLooper().getThread()) {
-                r.run();
-            } else {
-                post(r);
-            }
-        }
-    }
-
-    /**
-     * All the info about a connection.
-     */
-    private class ConnectionRecord {
-        String pkg;
-        Bundle rootHints;
-        ServiceCallbacks callbacks;
-        BrowserRoot root;
-        HashMap<String, List<Pair<IBinder, Bundle>>> subscriptions = new HashMap();
-    }
-
-    /**
-     * Completion handler for asynchronous callback methods in {@link MediaBrowserServiceCompat}.
-     * <p>
-     * Each of the methods that takes one of these to send the result must call
-     * {@link #sendResult} to respond to the caller with the given results. If those
-     * functions return without calling {@link #sendResult}, they must instead call
-     * {@link #detach} before returning, and then may call {@link #sendResult} when
-     * they are done. If more than one of those methods is called, an exception will
-     * be thrown.
-     *
-     * @see MediaBrowserServiceCompat#onLoadChildren
-     * @see MediaBrowserServiceCompat#onLoadItem
-     */
-    public static class Result<T> {
-        private Object mDebug;
-        private boolean mDetachCalled;
-        private boolean mSendResultCalled;
-        private int mFlags;
-
-        Result(Object debug) {
-            mDebug = debug;
-        }
-
-        /**
-         * Send the result back to the caller.
-         */
-        public void sendResult(T result) {
-            if (mSendResultCalled) {
-                throw new IllegalStateException("sendResult() called twice for: " + mDebug);
-            }
-            mSendResultCalled = true;
-            onResultSent(result, mFlags);
-        }
-
-        /**
-         * Detach this message from the current thread and allow the {@link #sendResult}
-         * call to happen later.
-         */
-        public void detach() {
-            if (mDetachCalled) {
-                throw new IllegalStateException("detach() called when detach() had already"
-                        + " been called for: " + mDebug);
-            }
-            if (mSendResultCalled) {
-                throw new IllegalStateException("detach() called when sendResult() had already"
-                        + " been called for: " + mDebug);
-            }
-            mDetachCalled = true;
-        }
-
-        boolean isDone() {
-            return mDetachCalled || mSendResultCalled;
-        }
-
-        void setFlags(@ResultFlags int flags) {
-            mFlags = flags;
-        }
-
-        /**
-         * Called when the result is sent, after assertions about not being called twice
-         * have happened.
-         */
-        void onResultSent(T result, @ResultFlags int flags) {
-        }
-    }
-
-    private class ServiceBinderImpl {
-        public void connect(final String pkg, final int uid, final Bundle rootHints,
-                final ServiceCallbacks callbacks) {
-
-            if (!isValidPackage(pkg, uid)) {
-                throw new IllegalArgumentException("Package/uid mismatch: uid=" + uid
-                        + " package=" + pkg);
-            }
-
-            mHandler.postOrRun(new Runnable() {
-                @Override
-                public void run() {
-                    final IBinder b = callbacks.asBinder();
-
-                    // Clear out the old subscriptions. We are getting new ones.
-                    mConnections.remove(b);
-
-                    final ConnectionRecord connection = new ConnectionRecord();
-                    connection.pkg = pkg;
-                    connection.rootHints = rootHints;
-                    connection.callbacks = callbacks;
-
-                    connection.root =
-                            MediaBrowserServiceCompat.this.onGetRoot(pkg, uid, rootHints);
-
-                    // If they didn't return something, don't allow this client.
-                    if (connection.root == null) {
-                        Log.i(TAG, "No root for client " + pkg + " from service "
-                                + getClass().getName());
-                        try {
-                            callbacks.onConnectFailed();
-                        } catch (RemoteException ex) {
-                            Log.w(TAG, "Calling onConnectFailed() failed. Ignoring. "
-                                    + "pkg=" + pkg);
-                        }
-                    } else {
-                        try {
-                            mConnections.put(b, connection);
-                            if (mSession != null) {
-                                callbacks.onConnect(connection.root.getRootId(),
-                                        mSession, connection.root.getExtras());
-                            }
-                        } catch (RemoteException ex) {
-                            Log.w(TAG, "Calling onConnect() failed. Dropping client. "
-                                    + "pkg=" + pkg);
-                            mConnections.remove(b);
-                        }
-                    }
-                }
-            });
-        }
-
-        public void disconnect(final ServiceCallbacks callbacks) {
-            mHandler.postOrRun(new Runnable() {
-                @Override
-                public void run() {
-                    final IBinder b = callbacks.asBinder();
-
-                    // Clear out the old subscriptions. We are getting new ones.
-                    final ConnectionRecord old = mConnections.remove(b);
-                    if (old != null) {
-                        // TODO
-                    }
-                }
-            });
-        }
-
-        public void addSubscription(final String id, final IBinder token, final Bundle options,
-                final ServiceCallbacks callbacks) {
-            mHandler.postOrRun(new Runnable() {
-                @Override
-                public void run() {
-                    final IBinder b = callbacks.asBinder();
-
-                    // Get the record for the connection
-                    final ConnectionRecord connection = mConnections.get(b);
-                    if (connection == null) {
-                        Log.w(TAG, "addSubscription for callback that isn't registered id="
-                                + id);
-                        return;
-                    }
-
-                    MediaBrowserServiceCompat.this.addSubscription(id, connection, token, options);
-                }
-            });
-        }
-
-        public void removeSubscription(final String id, final IBinder token,
-                final ServiceCallbacks callbacks) {
-            mHandler.postOrRun(new Runnable() {
-                @Override
-                public void run() {
-                    final IBinder b = callbacks.asBinder();
-
-                    ConnectionRecord connection = mConnections.get(b);
-                    if (connection == null) {
-                        Log.w(TAG, "removeSubscription for callback that isn't registered id="
-                                + id);
-                        return;
-                    }
-                    if (!MediaBrowserServiceCompat.this.removeSubscription(
-                            id, connection, token)) {
-                        Log.w(TAG, "removeSubscription called for " + id
-                                + " which is not subscribed");
-                    }
-                }
-            });
-        }
-
-        public void getMediaItem(final String mediaId, final ResultReceiver receiver,
-                final ServiceCallbacks callbacks) {
-            if (TextUtils.isEmpty(mediaId) || receiver == null) {
-                return;
-            }
-
-            mHandler.postOrRun(new Runnable() {
-                @Override
-                public void run() {
-                    final IBinder b = callbacks.asBinder();
-
-                    ConnectionRecord connection = mConnections.get(b);
-                    if (connection == null) {
-                        Log.w(TAG, "getMediaItem for callback that isn't registered id=" + mediaId);
-                        return;
-                    }
-                    performLoadItem(mediaId, connection, receiver);
-                }
-            });
-        }
-
-        // Used when {@link MediaBrowserProtocol#EXTRA_MESSENGER_BINDER} is used.
-        public void registerCallbacks(final ServiceCallbacks callbacks, final Bundle rootHints) {
-            mHandler.postOrRun(new Runnable() {
-                @Override
-                public void run() {
-                    final IBinder b = callbacks.asBinder();
-                    // Clear out the old subscriptions. We are getting new ones.
-                    mConnections.remove(b);
-
-                    final ConnectionRecord connection = new ConnectionRecord();
-                    connection.callbacks = callbacks;
-                    connection.rootHints = rootHints;
-                    mConnections.put(b, connection);
-                }
-            });
-        }
-
-        // Used when {@link MediaBrowserProtocol#EXTRA_MESSENGER_BINDER} is used.
-        public void unregisterCallbacks(final ServiceCallbacks callbacks) {
-            mHandler.postOrRun(new Runnable() {
-                @Override
-                public void run() {
-                    final IBinder b = callbacks.asBinder();
-                    mConnections.remove(b);
-                }
-            });
-        }
-    }
-
-    private interface ServiceCallbacks {
-        IBinder asBinder();
-        void onConnect(String root, MediaSessionCompat.Token session, Bundle extras)
-                throws RemoteException;
-        void onConnectFailed() throws RemoteException;
-        void onLoadChildren(String mediaId, List<MediaBrowserCompat.MediaItem> list, Bundle options)
-                throws RemoteException;
-    }
-
-    private class ServiceCallbacksCompat implements ServiceCallbacks {
-        final Messenger mCallbacks;
-
-        ServiceCallbacksCompat(Messenger callbacks) {
-            mCallbacks = callbacks;
-        }
-
-        public IBinder asBinder() {
-            return mCallbacks.getBinder();
-        }
-
-        public void onConnect(String root, MediaSessionCompat.Token session, Bundle extras)
-                throws RemoteException {
-            if (extras == null) {
-                extras = new Bundle();
-            }
-            extras.putInt(EXTRA_SERVICE_VERSION, SERVICE_VERSION_CURRENT);
-            Bundle data = new Bundle();
-            data.putString(DATA_MEDIA_ITEM_ID, root);
-            data.putParcelable(DATA_MEDIA_SESSION_TOKEN, session);
-            data.putBundle(DATA_ROOT_HINTS, extras);
-            sendRequest(SERVICE_MSG_ON_CONNECT, data);
-        }
-
-        public void onConnectFailed() throws RemoteException {
-            sendRequest(SERVICE_MSG_ON_CONNECT_FAILED, null);
-        }
-
-        public void onLoadChildren(String mediaId, List<MediaBrowserCompat.MediaItem> list,
-                Bundle options) throws RemoteException {
-            Bundle data = new Bundle();
-            data.putString(DATA_MEDIA_ITEM_ID, mediaId);
-            data.putBundle(DATA_OPTIONS, options);
-            if (list != null) {
-                data.putParcelableArrayList(DATA_MEDIA_ITEM_LIST,
-                        list instanceof ArrayList ? (ArrayList) list : new ArrayList<>(list));
-            }
-            sendRequest(SERVICE_MSG_ON_LOAD_CHILDREN, data);
-        }
-
-        private void sendRequest(int what, Bundle data) throws RemoteException {
-            Message msg = Message.obtain();
-            msg.what = what;
-            msg.arg1 = SERVICE_VERSION_CURRENT;
-            msg.setData(data);
-            mCallbacks.send(msg);
-        }
-    }
-
-    @Override
-    public void onCreate() {
-        super.onCreate();
-        if (Build.VERSION.SDK_INT >= 24 || BuildCompat.isAtLeastN()) {
-            mImpl = new MediaBrowserServiceImplApi24();
-        } else if (Build.VERSION.SDK_INT >= 23) {
-            mImpl = new MediaBrowserServiceImplApi23();
-        } else if (Build.VERSION.SDK_INT >= 21) {
-            mImpl = new MediaBrowserServiceImplApi21();
-        } else {
-            mImpl = new MediaBrowserServiceImplBase();
-        }
-        mImpl.onCreate();
-    }
-
-    @Override
-    public IBinder onBind(Intent intent) {
-        return mImpl.onBind(intent);
-    }
-
-    @Override
-    public void dump(FileDescriptor fd, PrintWriter writer, String[] args) {
-    }
-
-    /**
-     * Called to get the root information for browsing by a particular client.
-     * <p>
-     * The implementation should verify that the client package has permission
-     * to access browse media information before returning the root id; it
-     * should return null if the client is not allowed to access this
-     * information.
-     * </p>
-     *
-     * @param clientPackageName The package name of the application which is
-     *            requesting access to browse media.
-     * @param clientUid The uid of the application which is requesting access to
-     *            browse media.
-     * @param rootHints An optional bundle of service-specific arguments to send
-     *            to the media browse service when connecting and retrieving the
-     *            root id for browsing, or null if none. The contents of this
-     *            bundle may affect the information returned when browsing.
-     * @return The {@link BrowserRoot} for accessing this app's content or null.
-     * @see BrowserRoot#EXTRA_RECENT
-     * @see BrowserRoot#EXTRA_OFFLINE
-     * @see BrowserRoot#EXTRA_SUGGESTED
-     */
-    public abstract @Nullable BrowserRoot onGetRoot(@NonNull String clientPackageName,
-            int clientUid, @Nullable Bundle rootHints);
-
-    /**
-     * Called to get information about the children of a media item.
-     * <p>
-     * Implementations must call {@link Result#sendResult result.sendResult}
-     * with the list of children. If loading the children will be an expensive
-     * operation that should be performed on another thread,
-     * {@link Result#detach result.detach} may be called before returning from
-     * this function, and then {@link Result#sendResult result.sendResult}
-     * called when the loading is complete.
-     *
-     * @param parentId The id of the parent media item whose children are to be
-     *            queried.
-     * @param result The Result to send the list of children to, or null if the
-     *            id is invalid.
-     */
-    public abstract void onLoadChildren(@NonNull String parentId,
-            @NonNull Result<List<MediaBrowserCompat.MediaItem>> result);
-
-    /**
-     * Called to get information about the children of a media item.
-     * <p>
-     * Implementations must call {@link Result#sendResult result.sendResult}
-     * with the list of children. If loading the children will be an expensive
-     * operation that should be performed on another thread,
-     * {@link Result#detach result.detach} may be called before returning from
-     * this function, and then {@link Result#sendResult result.sendResult}
-     * called when the loading is complete.
-     *
-     * @param parentId The id of the parent media item whose children are to be
-     *            queried.
-     * @param result The Result to send the list of children to, or null if the
-     *            id is invalid.
-     * @param options A bundle of service-specific arguments sent from the media
-     *            browse. The information returned through the result should be
-     *            affected by the contents of this bundle.
-     */
-    public void onLoadChildren(@NonNull String parentId,
-            @NonNull Result<List<MediaBrowserCompat.MediaItem>> result, @NonNull Bundle options) {
-        // To support backward compatibility, when the implementation of MediaBrowserService doesn't
-        // override onLoadChildren() with options, onLoadChildren() without options will be used
-        // instead, and the options will be applied in the implementation of result.onResultSent().
-        result.setFlags(RESULT_FLAG_OPTION_NOT_HANDLED);
-        onLoadChildren(parentId, result);
-    }
-
-    /**
-     * Called to get information about a specific media item.
-     * <p>
-     * Implementations must call {@link Result#sendResult result.sendResult}. If
-     * loading the item will be an expensive operation {@link Result#detach
-     * result.detach} may be called before returning from this function, and
-     * then {@link Result#sendResult result.sendResult} called when the item has
-     * been loaded.
-     * <p>
-     * The default implementation sends a null result.
-     *
-     * @param itemId The id for the specific {@link MediaBrowserCompat.MediaItem}.
-     * @param result The Result to send the item to, or null if the id is
-     *            invalid.
-     */
-    public void onLoadItem(String itemId, Result<MediaBrowserCompat.MediaItem> result) {
-        result.sendResult(null);
-    }
-
-    /**
-     * Call to set the media session.
-     * <p>
-     * This should be called as soon as possible during the service's startup.
-     * It may only be called once.
-     *
-     * @param token The token for the service's {@link MediaSessionCompat}.
-     */
-    public void setSessionToken(MediaSessionCompat.Token token) {
-        if (token == null) {
-            throw new IllegalArgumentException("Session token may not be null.");
-        }
-        if (mSession != null) {
-            throw new IllegalStateException("The session token has already been set.");
-        }
-        mSession = token;
-        mImpl.setSessionToken(token);
-    }
-
-    /**
-     * Gets the session token, or null if it has not yet been created
-     * or if it has been destroyed.
-     */
-    public @Nullable MediaSessionCompat.Token getSessionToken() {
-        return mSession;
-    }
-
-    /**
-     * Gets the root hints sent from the currently connected {@link MediaBrowserCompat}.
-     * The root hints are service-specific arguments included in an optional bundle sent to the
-     * media browser service when connecting and retrieving the root id for browsing, or null if
-     * none. The contents of this bundle may affect the information returned when browsing.
-     * <p>
-     * Note that this will return null when connected to {@link android.media.browse.MediaBrowser}
-     * and running on API 23 or lower.
-     *
-     * @throws IllegalStateException If this method is called outside of {@link #onLoadChildren}
-     *             or {@link #onLoadItem}
-     * @see MediaBrowserServiceCompat.BrowserRoot#EXTRA_RECENT
-     * @see MediaBrowserServiceCompat.BrowserRoot#EXTRA_OFFLINE
-     * @see MediaBrowserServiceCompat.BrowserRoot#EXTRA_SUGGESTED
-     */
-    public final Bundle getBrowserRootHints() {
-        return mImpl.getBrowserRootHints();
-    }
-
-    /**
-     * Notifies all connected media browsers that the children of
-     * the specified parent id have changed in some way.
-     * This will cause browsers to fetch subscribed content again.
-     *
-     * @param parentId The id of the parent media item whose
-     * children changed.
-     */
-    public void notifyChildrenChanged(@NonNull String parentId) {
-        if (parentId == null) {
-            throw new IllegalArgumentException("parentId cannot be null in notifyChildrenChanged");
-        }
-        mImpl.notifyChildrenChanged(parentId, null);
-    }
-
-    /**
-     * Notifies all connected media browsers that the children of
-     * the specified parent id have changed in some way.
-     * This will cause browsers to fetch subscribed content again.
-     *
-     * @param parentId The id of the parent media item whose
-     *            children changed.
-     * @param options A bundle of service-specific arguments to send
-     *            to the media browse. The contents of this bundle may
-     *            contain the information about the change.
-     */
-    public void notifyChildrenChanged(@NonNull String parentId, @NonNull Bundle options) {
-        if (parentId == null) {
-            throw new IllegalArgumentException("parentId cannot be null in notifyChildrenChanged");
-        }
-        if (options == null) {
-            throw new IllegalArgumentException("options cannot be null in notifyChildrenChanged");
-        }
-        mImpl.notifyChildrenChanged(parentId, options);
-    }
-
-    /**
-     * Return whether the given package is one of the ones that is owned by the uid.
-     */
-    private boolean isValidPackage(String pkg, int uid) {
-        if (pkg == null) {
-            return false;
-        }
-        final PackageManager pm = getPackageManager();
-        final String[] packages = pm.getPackagesForUid(uid);
-        final int N = packages.length;
-        for (int i=0; i<N; i++) {
-            if (packages[i].equals(pkg)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Save the subscription and if it is a new subscription send the results.
-     */
-    private void addSubscription(String id, ConnectionRecord connection, IBinder token,
-            Bundle options) {
-        // Save the subscription
-        List<Pair<IBinder, Bundle>> callbackList = connection.subscriptions.get(id);
-        if (callbackList == null) {
-            callbackList = new ArrayList<>();
-        }
-        for (Pair<IBinder, Bundle> callback : callbackList) {
-            if (token == callback.first
-                    && MediaBrowserCompatUtils.areSameOptions(options, callback.second)) {
-                return;
-            }
-        }
-        callbackList.add(new Pair<>(token, options));
-        connection.subscriptions.put(id, callbackList);
-        // send the results
-        performLoadChildren(id, connection, options);
-    }
-
-    /**
-     * Remove the subscription.
-     */
-    private boolean removeSubscription(String id, ConnectionRecord connection, IBinder token) {
-        if (token == null) {
-            return connection.subscriptions.remove(id) != null;
-        }
-        boolean removed = false;
-        List<Pair<IBinder, Bundle>> callbackList = connection.subscriptions.get(id);
-        if (callbackList != null) {
-            for (Pair<IBinder, Bundle> callback : callbackList) {
-                if (token == callback.first) {
-                    removed = true;
-                    callbackList.remove(callback);
-                }
-            }
-            if (callbackList.size() == 0) {
-                connection.subscriptions.remove(id);
-            }
-        }
-        return removed;
-    }
-
-    /**
-     * Call onLoadChildren and then send the results back to the connection.
-     * <p>
-     * Callers must make sure that this connection is still connected.
-     */
-    private void performLoadChildren(final String parentId, final ConnectionRecord connection,
-            final Bundle options) {
-        final Result<List<MediaBrowserCompat.MediaItem>> result
-                = new Result<List<MediaBrowserCompat.MediaItem>>(parentId) {
-            @Override
-            void onResultSent(List<MediaBrowserCompat.MediaItem> list, @ResultFlags int flags) {
-                if (mConnections.get(connection.callbacks.asBinder()) != connection) {
-                    if (DEBUG) {
-                        Log.d(TAG, "Not sending onLoadChildren result for connection that has"
-                                + " been disconnected. pkg=" + connection.pkg + " id=" + parentId);
-                    }
-                    return;
-                }
-
-                List<MediaBrowserCompat.MediaItem> filteredList =
-                        (flags & RESULT_FLAG_OPTION_NOT_HANDLED) != 0
-                                ? applyOptions(list, options) : list;
-                try {
-                    connection.callbacks.onLoadChildren(parentId, filteredList, options);
-                } catch (RemoteException ex) {
-                    // The other side is in the process of crashing.
-                    Log.w(TAG, "Calling onLoadChildren() failed for id=" + parentId
-                            + " package=" + connection.pkg);
-                }
-            }
-        };
-
-        mCurConnection = connection;
-        if (options == null) {
-            onLoadChildren(parentId, result);
-        } else {
-            onLoadChildren(parentId, result, options);
-        }
-        mCurConnection = null;
-
-        if (!result.isDone()) {
-            throw new IllegalStateException("onLoadChildren must call detach() or sendResult()"
-                    + " before returning for package=" + connection.pkg + " id=" + parentId);
-        }
-    }
-
-    private List<MediaBrowserCompat.MediaItem> applyOptions(List<MediaBrowserCompat.MediaItem> list,
-            final Bundle options) {
-        if (list == null) {
-            return null;
-        }
-        int page = options.getInt(MediaBrowserCompat.EXTRA_PAGE, -1);
-        int pageSize = options.getInt(MediaBrowserCompat.EXTRA_PAGE_SIZE, -1);
-        if (page == -1 && pageSize == -1) {
-            return list;
-        }
-        int fromIndex = pageSize * page;
-        int toIndex = fromIndex + pageSize;
-        if (page < 0 || pageSize < 1 || fromIndex >= list.size()) {
-            return Collections.EMPTY_LIST;
-        }
-        if (toIndex > list.size()) {
-            toIndex = list.size();
-        }
-        return list.subList(fromIndex, toIndex);
-    }
-
-    private void performLoadItem(String itemId, ConnectionRecord connection,
-            final ResultReceiver receiver) {
-        final Result<MediaBrowserCompat.MediaItem> result =
-                new Result<MediaBrowserCompat.MediaItem>(itemId) {
-                    @Override
-                    void onResultSent(MediaBrowserCompat.MediaItem item, @ResultFlags int flags) {
-                        Bundle bundle = new Bundle();
-                        bundle.putParcelable(KEY_MEDIA_ITEM, item);
-                        receiver.send(0, bundle);
-                    }
-                };
-
-        mCurConnection = connection;
-        onLoadItem(itemId, result);
-        mCurConnection = null;
-
-        if (!result.isDone()) {
-            throw new IllegalStateException("onLoadItem must call detach() or sendResult()"
-                    + " before returning for id=" + itemId);
-        }
-    }
-
-    /**
-     * Contains information that the browser service needs to send to the client
-     * when first connected.
-     */
-    public static final class BrowserRoot {
-        /**
-         * The lookup key for a boolean that indicates whether the browser service should return a
-         * browser root for recently played media items.
-         *
-         * <p>When creating a media browser for a given media browser service, this key can be
-         * supplied as a root hint for retrieving media items that are recently played.
-         * If the media browser service can provide such media items, the implementation must return
-         * the key in the root hint when {@link #onGetRoot(String, int, Bundle)} is called back.
-         *
-         * <p>The root hint may contain multiple keys.
-         *
-         * @see #EXTRA_OFFLINE
-         * @see #EXTRA_SUGGESTED
-         */
-        public static final String EXTRA_RECENT = "android.service.media.extra.RECENT";
-
-        /**
-         * The lookup key for a boolean that indicates whether the browser service should return a
-         * browser root for offline media items.
-         *
-         * <p>When creating a media browser for a given media browser service, this key can be
-         * supplied as a root hint for retrieving media items that are can be played without an
-         * internet connection.
-         * If the media browser service can provide such media items, the implementation must return
-         * the key in the root hint when {@link #onGetRoot(String, int, Bundle)} is called back.
-         *
-         * <p>The root hint may contain multiple keys.
-         *
-         * @see #EXTRA_RECENT
-         * @see #EXTRA_SUGGESTED
-         */
-        public static final String EXTRA_OFFLINE = "android.service.media.extra.OFFLINE";
-
-        /**
-         * The lookup key for a boolean that indicates whether the browser service should return a
-         * browser root for suggested media items.
-         *
-         * <p>When creating a media browser for a given media browser service, this key can be
-         * supplied as a root hint for retrieving the media items suggested by the media browser
-         * service. The list of media items passed in {@link android.support.v4.media.MediaBrowserCompat.SubscriptionCallback#onChildrenLoaded(String, List)}
-         * is considered ordered by relevance, first being the top suggestion.
-         * If the media browser service can provide such media items, the implementation must return
-         * the key in the root hint when {@link #onGetRoot(String, int, Bundle)} is called back.
-         *
-         * <p>The root hint may contain multiple keys.
-         *
-         * @see #EXTRA_RECENT
-         * @see #EXTRA_OFFLINE
-         */
-        public static final String EXTRA_SUGGESTED = "android.service.media.extra.SUGGESTED";
-
-        final private String mRootId;
-        final private Bundle mExtras;
-
-        /**
-         * Constructs a browser root.
-         * @param rootId The root id for browsing.
-         * @param extras Any extras about the browser service.
-         */
-        public BrowserRoot(@NonNull String rootId, @Nullable Bundle extras) {
-            if (rootId == null) {
-                throw new IllegalArgumentException("The root id in BrowserRoot cannot be null. " +
-                        "Use null for BrowserRoot instead.");
-            }
-            mRootId = rootId;
-            mExtras = extras;
-        }
-
-        /**
-         * Gets the root id for browsing.
-         */
-        public String getRootId() {
-            return mRootId;
-        }
-
-        /**
-         * Gets any extras about the browser service.
-         */
-        public Bundle getExtras() {
-            return mExtras;
-        }
-    }
-}
diff --git a/v4/java/android/support/v4/media/TransportMediator.java b/v4/java/android/support/v4/media/TransportMediator.java
deleted file mode 100644
index 16bf94b..0000000
--- a/v4/java/android/support/v4/media/TransportMediator.java
+++ /dev/null
@@ -1,343 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.support.v4.media;
-
-import android.app.Activity;
-import android.content.Context;
-import android.media.AudioManager;
-import android.os.Build;
-import android.support.v4.view.KeyEventCompat;
-import android.view.KeyEvent;
-import android.view.View;
-
-import java.util.ArrayList;
-
-/**
- * Helper for implementing a media transport control (with play, pause, skip, and
- * other media actions).  Takes care of both key events and advanced features
- * like {@link android.media.RemoteControlClient}.  This class is intended to
- * serve as an intermediary between transport controls (whether they be on-screen
- * controls, hardware buttons, remote controls) and the actual player.  The player
- * is represented by a single {@link TransportPerformer} that must be supplied to
- * this class.  On-screen controls that want to control and show the state of the
- * player should do this through calls to the {@link TransportController} interface.
- *
- * <p>Here is a simple but fairly complete sample of a video player that is built
- * around this class.  Note that the MediaController class used here is not the one
- * included in the standard Android framework, but a custom implementation.  Real
- * applications often implement their own transport controls, or you can copy the
- * implementation here out of Support4Demos.</p>
- *
- * {@sample development/samples/Support4Demos/src/com/example/android/supportv4/media/TransportControllerActivity.java
- *      complete}
- */
-public class TransportMediator extends TransportController {
-    final Context mContext;
-    final TransportPerformer mCallbacks;
-    final AudioManager mAudioManager;
-    final View mView;
-    final Object mDispatcherState;
-    final TransportMediatorJellybeanMR2 mController;
-    final ArrayList<TransportStateListener> mListeners
-            = new ArrayList<TransportStateListener>();
-    final TransportMediatorCallback mTransportKeyCallback
-            = new TransportMediatorCallback() {
-        @Override
-        public void handleKey(KeyEvent key) {
-            key.dispatch(mKeyEventCallback);
-        }
-        @Override
-        public void handleAudioFocusChange(int focusChange) {
-            mCallbacks.onAudioFocusChange(focusChange);
-        }
-
-        @Override
-        public long getPlaybackPosition() {
-            return mCallbacks.onGetCurrentPosition();
-        }
-
-        @Override
-        public void playbackPositionUpdate(long newPositionMs) {
-            mCallbacks.onSeekTo(newPositionMs);
-        }
-    };
-
-    /** Synonym for {@link KeyEvent#KEYCODE_MEDIA_PLAY KeyEvent.KEYCODE_MEDIA_PLAY} */
-    public static final int KEYCODE_MEDIA_PLAY = 126;
-    /** Synonym for {@link KeyEvent#KEYCODE_MEDIA_PAUSE KeyEvent.KEYCODE_MEDIA_PAUSE} */
-    public static final int KEYCODE_MEDIA_PAUSE = 127;
-    /** Synonym for {@link KeyEvent#KEYCODE_MEDIA_RECORD KeyEvent.KEYCODE_MEDIA_RECORD} */
-    public static final int KEYCODE_MEDIA_RECORD = 130;
-
-    /** Synonym for {@link android.media.RemoteControlClient#FLAG_KEY_MEDIA_PREVIOUS
-     * RemoteControlClient.FLAG_KEY_MEDIA_PREVIOUS */
-    public final static int FLAG_KEY_MEDIA_PREVIOUS = 1 << 0;
-    /** Synonym for {@link android.media.RemoteControlClient#FLAG_KEY_MEDIA_REWIND
-     * RemoteControlClient.FLAG_KEY_MEDIA_REWIND */
-    public final static int FLAG_KEY_MEDIA_REWIND = 1 << 1;
-    /** Synonym for {@link android.media.RemoteControlClient#FLAG_KEY_MEDIA_PLAY
-     * RemoteControlClient.FLAG_KEY_MEDIA_PLAY */
-    public final static int FLAG_KEY_MEDIA_PLAY = 1 << 2;
-    /** Synonym for {@link android.media.RemoteControlClient#FLAG_KEY_MEDIA_PLAY_PAUSE
-     * RemoteControlClient.FLAG_KEY_MEDIA_PLAY_PAUSE */
-    public final static int FLAG_KEY_MEDIA_PLAY_PAUSE = 1 << 3;
-    /** Synonym for {@link android.media.RemoteControlClient#FLAG_KEY_MEDIA_PAUSE
-     * RemoteControlClient.FLAG_KEY_MEDIA_PAUSE */
-    public final static int FLAG_KEY_MEDIA_PAUSE = 1 << 4;
-    /** Synonym for {@link android.media.RemoteControlClient#FLAG_KEY_MEDIA_STOP
-     * RemoteControlClient.FLAG_KEY_MEDIA_STOP */
-    public final static int FLAG_KEY_MEDIA_STOP = 1 << 5;
-    /** Synonym for {@link android.media.RemoteControlClient#FLAG_KEY_MEDIA_FAST_FORWARD
-     * RemoteControlClient.FLAG_KEY_MEDIA_FAST_FORWARD */
-    public final static int FLAG_KEY_MEDIA_FAST_FORWARD = 1 << 6;
-    /** Synonym for {@link android.media.RemoteControlClient#FLAG_KEY_MEDIA_NEXT
-     * RemoteControlClient.FLAG_KEY_MEDIA_NEXT */
-    public final static int FLAG_KEY_MEDIA_NEXT = 1 << 7;
-
-    static boolean isMediaKey(int keyCode) {
-        switch (keyCode) {
-            case KEYCODE_MEDIA_PLAY:
-            case KEYCODE_MEDIA_PAUSE:
-            case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE:
-            case KeyEvent.KEYCODE_MUTE:
-            case KeyEvent.KEYCODE_HEADSETHOOK:
-            case KeyEvent.KEYCODE_MEDIA_STOP:
-            case KeyEvent.KEYCODE_MEDIA_NEXT:
-            case KeyEvent.KEYCODE_MEDIA_PREVIOUS:
-            case KeyEvent.KEYCODE_MEDIA_REWIND:
-            case KEYCODE_MEDIA_RECORD:
-            case KeyEvent.KEYCODE_MEDIA_FAST_FORWARD: {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    final KeyEvent.Callback mKeyEventCallback = new KeyEvent.Callback() {
-        @Override
-        public boolean onKeyDown(int keyCode, KeyEvent event) {
-            return isMediaKey(keyCode) ? mCallbacks.onMediaButtonDown(keyCode, event) : false;
-        }
-
-        public boolean onKeyLongPress(int keyCode, KeyEvent event) {
-            return false;
-        }
-
-        @Override
-        public boolean onKeyUp(int keyCode, KeyEvent event) {
-            return isMediaKey(keyCode) ? mCallbacks.onMediaButtonUp(keyCode, event) : false;
-        }
-
-        @Override
-        public boolean onKeyMultiple(int keyCode, int count, KeyEvent event) {
-            return false;
-        }
-    };
-
-    public TransportMediator(Activity activity, TransportPerformer callbacks) {
-        this(activity, null, callbacks);
-    }
-
-    public TransportMediator(View view, TransportPerformer callbacks) {
-        this(null, view, callbacks);
-    }
-
-    private TransportMediator(Activity activity, View view, TransportPerformer callbacks) {
-        mContext = activity != null ? activity : view.getContext();
-        mCallbacks = callbacks;
-        mAudioManager = (AudioManager)mContext.getSystemService(Context.AUDIO_SERVICE);
-        mView = activity != null ? activity.getWindow().getDecorView() : view;
-        mDispatcherState = KeyEventCompat.getKeyDispatcherState(mView);
-        if (Build.VERSION.SDK_INT >= 18) { // JellyBean MR2
-            mController = new TransportMediatorJellybeanMR2(mContext, mAudioManager,
-                    mView, mTransportKeyCallback);
-        } else {
-            mController = null;
-        }
-    }
-
-    /**
-     * Return the {@link android.media.RemoteControlClient} associated with this transport.
-     * This returns a generic Object since the RemoteControlClient is not availble before
-     * {@link android.os.Build.VERSION_CODES#ICE_CREAM_SANDWICH}.  Further, this class
-     * will not use RemoteControlClient in its implementation until
-     * {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}.  You should always check for
-     * null here and not do anything with the RemoteControlClient if none is given; this
-     * way you don't need to worry about the current platform API version.
-     *
-     * <p>Note that this class takes possession of the
-     * {@link android.media.RemoteControlClient.OnGetPlaybackPositionListener} and
-     * {@link android.media.RemoteControlClient.OnPlaybackPositionUpdateListener} callbacks;
-     * you will interact with these through
-     * {@link TransportPerformer#onGetCurrentPosition() TransportPerformer.onGetCurrentPosition} and
-     * {@link TransportPerformer#onSeekTo TransportPerformer.onSeekTo}, respectively.</p>
-     */
-    public Object getRemoteControlClient() {
-        return mController != null ? mController.getRemoteControlClient() : null;
-    }
-
-    /**
-     * Must call from {@link Activity#dispatchKeyEvent Activity.dispatchKeyEvent} to give
-     * the transport an opportunity to intercept media keys.  Any such keys will show up
-     * in {@link TransportPerformer}.
-     * @param event
-     */
-    public boolean dispatchKeyEvent(KeyEvent event) {
-        return KeyEventCompat.dispatch(event, mKeyEventCallback, mDispatcherState, this);
-    }
-
-    public void registerStateListener(TransportStateListener listener) {
-        mListeners.add(listener);
-    }
-
-    public void unregisterStateListener(TransportStateListener listener) {
-        mListeners.remove(listener);
-    }
-
-    private TransportStateListener[] getListeners() {
-        if (mListeners.size() <= 0) {
-            return null;
-        }
-        TransportStateListener listeners[] = new TransportStateListener[mListeners.size()];
-        mListeners.toArray(listeners);
-        return listeners;
-    }
-
-    private void reportPlayingChanged() {
-        TransportStateListener[] listeners = getListeners();
-        if (listeners != null) {
-            for (TransportStateListener listener : listeners) {
-                listener.onPlayingChanged(this);
-            }
-        }
-    }
-
-    private void reportTransportControlsChanged() {
-        TransportStateListener[] listeners = getListeners();
-        if (listeners != null) {
-            for (TransportStateListener listener : listeners) {
-                listener.onTransportControlsChanged(this);
-            }
-        }
-    }
-
-    private void pushControllerState() {
-        if (mController != null) {
-            mController.refreshState(mCallbacks.onIsPlaying(),
-                    mCallbacks.onGetCurrentPosition(),
-                    mCallbacks.onGetTransportControlFlags());
-        }
-    }
-
-    public void refreshState() {
-        pushControllerState();
-        reportPlayingChanged();
-        reportTransportControlsChanged();
-    }
-
-    /**
-     * Move the controller into the playing state.  This updates the remote control
-     * client to indicate it is playing, and takes audio focus for the app.
-     */
-    @Override
-    public void startPlaying() {
-        if (mController != null) {
-            mController.startPlaying();
-        }
-        mCallbacks.onStart();
-        pushControllerState();
-        reportPlayingChanged();
-    }
-
-    /**
-     * Move the controller into the paused state.  This updates the remote control
-     * client to indicate it is paused, but keeps audio focus.
-     */
-    @Override
-    public void pausePlaying() {
-        if (mController != null) {
-            mController.pausePlaying();
-        }
-        mCallbacks.onPause();
-        pushControllerState();
-        reportPlayingChanged();
-    }
-
-    /**
-     * Move the controller into the stopped state.  This updates the remote control
-     * client to indicate it is stopped, and removes audio focus from the app.
-     */
-    @Override
-    public void stopPlaying() {
-        if (mController != null) {
-            mController.stopPlaying();
-        }
-        mCallbacks.onStop();
-        pushControllerState();
-        reportPlayingChanged();
-    }
-
-    @Override
-    public long getDuration() {
-        return mCallbacks.onGetDuration();
-    }
-
-    @Override
-    public long getCurrentPosition() {
-        return mCallbacks.onGetCurrentPosition();
-    }
-
-    @Override
-    public void seekTo(long pos) {
-        mCallbacks.onSeekTo(pos);
-    }
-
-    @Override
-    public boolean isPlaying() {
-        return mCallbacks.onIsPlaying();
-    }
-
-    @Override
-    public int getBufferPercentage() {
-        return mCallbacks.onGetBufferPercentage();
-    }
-
-    /**
-     * Retrieves the flags for the media transport control buttons that this transport supports.
-     * Result is a combination of the following flags:
-     *      {@link #FLAG_KEY_MEDIA_PREVIOUS},
-     *      {@link #FLAG_KEY_MEDIA_REWIND},
-     *      {@link #FLAG_KEY_MEDIA_PLAY},
-     *      {@link #FLAG_KEY_MEDIA_PLAY_PAUSE},
-     *      {@link #FLAG_KEY_MEDIA_PAUSE},
-     *      {@link #FLAG_KEY_MEDIA_STOP},
-     *      {@link #FLAG_KEY_MEDIA_FAST_FORWARD},
-     *      {@link #FLAG_KEY_MEDIA_NEXT}
-     */
-    public int getTransportControlFlags() {
-        return mCallbacks.onGetTransportControlFlags();
-    }
-
-    /**
-     * Optionally call when no longer using the TransportController.  Its resources
-     * will also be automatically cleaned up when your activity/view is detached from
-     * its window, so you don't normally need to call this explicitly.
-     */
-    public void destroy() {
-        mController.destroy();
-    }
-}
diff --git a/v4/java/android/support/v4/media/session/MediaSessionCompat.java b/v4/java/android/support/v4/media/session/MediaSessionCompat.java
deleted file mode 100644
index 4c6c305..0000000
--- a/v4/java/android/support/v4/media/session/MediaSessionCompat.java
+++ /dev/null
@@ -1,2305 +0,0 @@
-
-/*
- * Copyright (C) 2014 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 android.support.v4.media.session;
-
-import android.app.Activity;
-import android.app.PendingIntent;
-import android.content.BroadcastReceiver;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
-import android.graphics.Bitmap;
-import android.media.AudioManager;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.IBinder;
-import android.os.Looper;
-import android.os.Message;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.os.RemoteCallbackList;
-import android.os.RemoteException;
-import android.os.ResultReceiver;
-import android.os.SystemClock;
-import android.support.annotation.IntDef;
-import android.support.v4.media.MediaDescriptionCompat;
-import android.support.v4.media.MediaMetadataCompat;
-import android.support.v4.media.RatingCompat;
-import android.support.v4.media.VolumeProviderCompat;
-import android.text.TextUtils;
-import android.util.Log;
-import android.view.KeyEvent;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Allows interaction with media controllers, volume keys, media buttons, and
- * transport controls.
- * <p>
- * A MediaSession should be created when an app wants to publish media playback
- * information or handle media keys. In general an app only needs one session
- * for all playback, though multiple sessions can be created to provide finer
- * grain controls of media.
- * <p>
- * Once a session is created the owner of the session may pass its
- * {@link #getSessionToken() session token} to other processes to allow them to
- * create a {@link MediaControllerCompat} to interact with the session.
- * <p>
- * To receive commands, media keys, and other events a {@link Callback} must be
- * set with {@link #setCallback(Callback)}.
- * <p>
- * When an app is finished performing playback it must call {@link #release()}
- * to clean up the session and notify any controllers.
- * <p>
- * MediaSessionCompat objects are not thread safe and all calls should be made
- * from the same thread.
- * <p>
- * This is a helper for accessing features in
- * {@link android.media.session.MediaSession} introduced after API level 4 in a
- * backwards compatible fashion.
- */
-public class MediaSessionCompat {
-    private static final String TAG = "MediaSessionCompat";
-
-    private final MediaSessionImpl mImpl;
-    private final MediaControllerCompat mController;
-    private final ArrayList<OnActiveChangeListener> mActiveListeners = new ArrayList<>();
-
-    /**
-     * @hide
-     */
-    @IntDef(flag=true, value={FLAG_HANDLES_MEDIA_BUTTONS, FLAG_HANDLES_TRANSPORT_CONTROLS})
-    @Retention(RetentionPolicy.SOURCE)
-    public @interface SessionFlags {}
-
-    /**
-     * Set this flag on the session to indicate that it can handle media button
-     * events.
-     */
-    public static final int FLAG_HANDLES_MEDIA_BUTTONS = 1 << 0;
-
-    /**
-     * Set this flag on the session to indicate that it handles transport
-     * control commands through its {@link Callback}.
-     */
-    public static final int FLAG_HANDLES_TRANSPORT_CONTROLS = 1 << 1;
-
-    /**
-     * Custom action to invoke playFromUri() for the forward compatibility.
-     */
-    static final String ACTION_PLAY_FROM_URI =
-            "android.support.v4.media.session.action.PLAY_FROM_URI";
-
-    /**
-     * Custom action to invoke prepare() for the forward compatibility.
-     */
-    static final String ACTION_PREPARE = "android.support.v4.media.session.action.PREPARE";
-
-    /**
-     * Custom action to invoke prepareFromMediaId() for the forward compatibility.
-     */
-    static final String ACTION_PREPARE_FROM_MEDIA_ID =
-            "android.support.v4.media.session.action.PREPARE_FROM_MEDIA_ID";
-
-    /**
-     * Custom action to invoke prepareFromSearch() for the forward compatibility.
-     */
-    static final String ACTION_PREPARE_FROM_SEARCH =
-            "android.support.v4.media.session.action.PREPARE_FROM_SEARCH";
-
-    /**
-     * Custom action to invoke prepareFromUri() for the forward compatibility.
-     */
-    static final String ACTION_PREPARE_FROM_URI =
-            "android.support.v4.media.session.action.PREPARE_FROM_URI";
-
-    /**
-     * Argument for use with {@link #ACTION_PREPARE_FROM_MEDIA_ID} indicating media id to play.
-     */
-    static final String ACTION_ARGUMENT_MEDIA_ID =
-            "android.support.v4.media.session.action.ARGUMENT_MEDIA_ID";
-
-    /**
-     * Argument for use with {@link #ACTION_PREPARE_FROM_SEARCH} indicating search query.
-     */
-    static final String ACTION_ARGUMENT_QUERY =
-            "android.support.v4.media.session.action.ARGUMENT_QUERY";
-
-    /**
-     * Argument for use with {@link #ACTION_PREPARE_FROM_URI} and {@link #ACTION_PLAY_FROM_URI}
-     * indicating URI to play.
-     */
-    static final String ACTION_ARGUMENT_URI =
-            "android.support.v4.media.session.action.ARGUMENT_URI";
-
-    /**
-     * Argument for use with various actions indicating extra bundle.
-     */
-    static final String ACTION_ARGUMENT_EXTRAS =
-            "android.support.v4.media.session.action.ARGUMENT_EXTRAS";
-
-    /**
-     * Creates a new session. You must call {@link #release()} when finished with the session.
-     * <p>
-     * The session will automatically be registered with the system but will not be published
-     * until {@link #setActive(boolean) setActive(true)} is called.
-     * </p><p>
-     * For API 20 or earlier, note that a media button receiver is required for handling
-     * {@link Intent#ACTION_MEDIA_BUTTON}. This constructor will attempt to find an appropriate
-     * {@link BroadcastReceiver} from your manifest. See {@link MediaButtonReceiver} for more
-     * details.
-     * </p>
-     * @param context The context to use to create the session.
-     * @param tag A short name for debugging purposes.
-     */
-    public MediaSessionCompat(Context context, String tag) {
-        this(context, tag, null, null);
-    }
-
-    /**
-     * Creates a new session with a specified media button receiver (a component name and/or
-     * a pending intent). You must call {@link #release()} when finished with the session.
-     * <p>
-     * The session will automatically be registered with the system but will not be published
-     * until {@link #setActive(boolean) setActive(true)} is called. Note that {@code mbrComponent}
-     * and {@code mrbIntent} are only used for API 20 or earlier. If you  want to set a media button
-     * receiver in API 21 or later, call {@link #setMediaButtonReceiver}.
-     * </p><p>
-     * For API 20 or earlier, the new session will use the given {@code mbrComponent}.
-     * If null, this will attempt to find an appropriate {@link BroadcastReceiver} that handles
-     * {@link Intent#ACTION_MEDIA_BUTTON} from your manifest. See {@link MediaButtonReceiver} for
-     * more details.
-     * </p>
-     * @param context The context to use to create the session.
-     * @param tag A short name for debugging purposes.
-     * @param mbrComponent The component name for your media button receiver.
-     * @param mbrIntent The PendingIntent for your receiver component that handles
-     *            media button events. This is optional and will be used on between
-     *            {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2} and
-     *            {@link android.os.Build.VERSION_CODES#KITKAT_WATCH} instead of the
-     *            component name.
-     */
-    public MediaSessionCompat(Context context, String tag, ComponentName mbrComponent,
-            PendingIntent mbrIntent) {
-        if (context == null) {
-            throw new IllegalArgumentException("context must not be null");
-        }
-        if (TextUtils.isEmpty(tag)) {
-            throw new IllegalArgumentException("tag must not be null or empty");
-        }
-
-        if (android.os.Build.VERSION.SDK_INT >= 21) {
-            mImpl = new MediaSessionImplApi21(context, tag);
-        } else {
-            mImpl = new MediaSessionImplBase(context, tag, mbrComponent, mbrIntent);
-        }
-        mController = new MediaControllerCompat(context, this);
-    }
-
-    private MediaSessionCompat(Context context, MediaSessionImpl impl) {
-        mImpl = impl;
-        mController = new MediaControllerCompat(context, this);
-    }
-
-    /**
-     * Add a callback to receive updates on for the MediaSession. This includes
-     * media button and volume events. The caller's thread will be used to post
-     * events.
-     *
-     * @param callback The callback object
-     */
-    public void setCallback(Callback callback) {
-        setCallback(callback, null);
-    }
-
-    /**
-     * Set the callback to receive updates for the MediaSession. This includes
-     * media button and volume events. Set the callback to null to stop
-     * receiving events.
-     *
-     * @param callback The callback to receive updates on.
-     * @param handler The handler that events should be posted on.
-     */
-    public void setCallback(Callback callback, Handler handler) {
-        mImpl.setCallback(callback, handler != null ? handler : new Handler());
-    }
-
-    /**
-     * Set an intent for launching UI for this Session. This can be used as a
-     * quick link to an ongoing media screen. The intent should be for an
-     * activity that may be started using
-     * {@link Activity#startActivity(Intent)}.
-     *
-     * @param pi The intent to launch to show UI for this Session.
-     */
-    public void setSessionActivity(PendingIntent pi) {
-        mImpl.setSessionActivity(pi);
-    }
-
-    /**
-     * Set a pending intent for your media button receiver to allow restarting
-     * playback after the session has been stopped. If your app is started in
-     * this way an {@link Intent#ACTION_MEDIA_BUTTON} intent will be sent via
-     * the pending intent.
-     * <p>
-     * This method will only work on
-     * {@link android.os.Build.VERSION_CODES#LOLLIPOP} and later. Earlier
-     * platform versions must include the media button receiver in the
-     * constructor.
-     *
-     * @param mbr The {@link PendingIntent} to send the media button event to.
-     */
-    public void setMediaButtonReceiver(PendingIntent mbr) {
-        mImpl.setMediaButtonReceiver(mbr);
-    }
-
-    /**
-     * Set any flags for the session.
-     *
-     * @param flags The flags to set for this session.
-     */
-    public void setFlags(@SessionFlags int flags) {
-        mImpl.setFlags(flags);
-    }
-
-    /**
-     * Set the stream this session is playing on. This will affect the system's
-     * volume handling for this session. If {@link #setPlaybackToRemote} was
-     * previously called it will stop receiving volume commands and the system
-     * will begin sending volume changes to the appropriate stream.
-     * <p>
-     * By default sessions are on {@link AudioManager#STREAM_MUSIC}.
-     *
-     * @param stream The {@link AudioManager} stream this session is playing on.
-     */
-    public void setPlaybackToLocal(int stream) {
-        mImpl.setPlaybackToLocal(stream);
-    }
-
-    /**
-     * Configure this session to use remote volume handling. This must be called
-     * to receive volume button events, otherwise the system will adjust the
-     * current stream volume for this session. If {@link #setPlaybackToLocal}
-     * was previously called that stream will stop receiving volume changes for
-     * this session.
-     * <p>
-     * On platforms earlier than {@link android.os.Build.VERSION_CODES#LOLLIPOP}
-     * this will only allow an app to handle volume commands sent directly to
-     * the session by a {@link MediaControllerCompat}. System routing of volume
-     * keys will not use the volume provider.
-     *
-     * @param volumeProvider The provider that will handle volume changes. May
-     *            not be null.
-     */
-    public void setPlaybackToRemote(VolumeProviderCompat volumeProvider) {
-        if (volumeProvider == null) {
-            throw new IllegalArgumentException("volumeProvider may not be null!");
-        }
-        mImpl.setPlaybackToRemote(volumeProvider);
-    }
-
-    /**
-     * Set if this session is currently active and ready to receive commands. If
-     * set to false your session's controller may not be discoverable. You must
-     * set the session to active before it can start receiving media button
-     * events or transport commands.
-     * <p>
-     * On platforms earlier than
-     * {@link android.os.Build.VERSION_CODES#LOLLIPOP},
-     * a media button event receiver should be set via the constructor to
-     * receive media button events.
-     *
-     * @param active Whether this session is active or not.
-     */
-    public void setActive(boolean active) {
-        mImpl.setActive(active);
-        for (OnActiveChangeListener listener : mActiveListeners) {
-            listener.onActiveChanged();
-        }
-    }
-
-    /**
-     * Get the current active state of this session.
-     *
-     * @return True if the session is active, false otherwise.
-     */
-    public boolean isActive() {
-        return mImpl.isActive();
-    }
-
-    /**
-     * Send a proprietary event to all MediaControllers listening to this
-     * Session. It's up to the Controller/Session owner to determine the meaning
-     * of any events.
-     *
-     * @param event The name of the event to send
-     * @param extras Any extras included with the event
-     */
-    public void sendSessionEvent(String event, Bundle extras) {
-        if (TextUtils.isEmpty(event)) {
-            throw new IllegalArgumentException("event cannot be null or empty");
-        }
-        mImpl.sendSessionEvent(event, extras);
-    }
-
-    /**
-     * This must be called when an app has finished performing playback. If
-     * playback is expected to start again shortly the session can be left open,
-     * but it must be released if your activity or service is being destroyed.
-     */
-    public void release() {
-        mImpl.release();
-    }
-
-    /**
-     * Retrieve a token object that can be used by apps to create a
-     * {@link MediaControllerCompat} for interacting with this session. The
-     * owner of the session is responsible for deciding how to distribute these
-     * tokens.
-     * <p>
-     * On platform versions before
-     * {@link android.os.Build.VERSION_CODES#LOLLIPOP} this token may only be
-     * used within your app as there is no way to guarantee other apps are using
-     * the same version of the support library.
-     *
-     * @return A token that can be used to create a media controller for this
-     *         session.
-     */
-    public Token getSessionToken() {
-        return mImpl.getSessionToken();
-    }
-
-    /**
-     * Get a controller for this session. This is a convenience method to avoid
-     * having to cache your own controller in process.
-     *
-     * @return A controller for this session.
-     */
-    public MediaControllerCompat getController() {
-        return mController;
-    }
-
-    /**
-     * Update the current playback state.
-     *
-     * @param state The current state of playback
-     */
-    public void setPlaybackState(PlaybackStateCompat state) {
-        mImpl.setPlaybackState(state);
-    }
-
-    /**
-     * Update the current metadata. New metadata can be created using
-     * {@link android.media.MediaMetadata.Builder}.
-     *
-     * @param metadata The new metadata
-     */
-    public void setMetadata(MediaMetadataCompat metadata) {
-        mImpl.setMetadata(metadata);
-    }
-
-    /**
-     * Update the list of items in the play queue. It is an ordered list and
-     * should contain the current item, and previous or upcoming items if they
-     * exist. Specify null if there is no current play queue.
-     * <p>
-     * The queue should be of reasonable size. If the play queue is unbounded
-     * within your app, it is better to send a reasonable amount in a sliding
-     * window instead.
-     *
-     * @param queue A list of items in the play queue.
-     */
-    public void setQueue(List<QueueItem> queue) {
-        mImpl.setQueue(queue);
-    }
-
-    /**
-     * Set the title of the play queue. The UI should display this title along
-     * with the play queue itself. e.g. "Play Queue", "Now Playing", or an album
-     * name.
-     *
-     * @param title The title of the play queue.
-     */
-    public void setQueueTitle(CharSequence title) {
-        mImpl.setQueueTitle(title);
-    }
-
-    /**
-     * Set the style of rating used by this session. Apps trying to set the
-     * rating should use this style. Must be one of the following:
-     * <ul>
-     * <li>{@link RatingCompat#RATING_NONE}</li>
-     * <li>{@link RatingCompat#RATING_3_STARS}</li>
-     * <li>{@link RatingCompat#RATING_4_STARS}</li>
-     * <li>{@link RatingCompat#RATING_5_STARS}</li>
-     * <li>{@link RatingCompat#RATING_HEART}</li>
-     * <li>{@link RatingCompat#RATING_PERCENTAGE}</li>
-     * <li>{@link RatingCompat#RATING_THUMB_UP_DOWN}</li>
-     * </ul>
-     */
-    public void setRatingType(@RatingCompat.Style int type) {
-        mImpl.setRatingType(type);
-    }
-
-    /**
-     * Set some extras that can be associated with the
-     * {@link MediaSessionCompat}. No assumptions should be made as to how a
-     * {@link MediaControllerCompat} will handle these extras. Keys should be
-     * fully qualified (e.g. com.example.MY_EXTRA) to avoid conflicts.
-     *
-     * @param extras The extras associated with the session.
-     */
-    public void setExtras(Bundle extras) {
-        mImpl.setExtras(extras);
-    }
-
-    /**
-     * Gets the underlying framework {@link android.media.session.MediaSession}
-     * object.
-     * <p>
-     * This method is only supported on API 21+.
-     * </p>
-     *
-     * @return The underlying {@link android.media.session.MediaSession} object,
-     *         or null if none.
-     */
-    public Object getMediaSession() {
-        return mImpl.getMediaSession();
-    }
-
-    /**
-     * Gets the underlying framework {@link android.media.RemoteControlClient}
-     * object.
-     * <p>
-     * This method is only supported on APIs 14-20. On API 21+
-     * {@link #getMediaSession()} should be used instead.
-     *
-     * @return The underlying {@link android.media.RemoteControlClient} object,
-     *         or null if none.
-     */
-    public Object getRemoteControlClient() {
-        return mImpl.getRemoteControlClient();
-    }
-
-    /**
-     * Returns the name of the package that sent the last media button, transport control, or
-     * command from controllers and the system. This is only valid while in a request callback, such
-     * as {@link Callback#onPlay}. This method is not available and returns null on pre-N devices.
-     *
-     * @hide
-     */
-    public String getCallingPackage() {
-        return mImpl.getCallingPackage();
-    }
-
-    /**
-     * Adds a listener to be notified when the active status of this session
-     * changes. This is primarily used by the support library and should not be
-     * needed by apps.
-     *
-     * @param listener The listener to add.
-     */
-    public void addOnActiveChangeListener(OnActiveChangeListener listener) {
-        if (listener == null) {
-            throw new IllegalArgumentException("Listener may not be null");
-        }
-        mActiveListeners.add(listener);
-    }
-
-    /**
-     * Stops the listener from being notified when the active status of this
-     * session changes.
-     *
-     * @param listener The listener to remove.
-     */
-    public void removeOnActiveChangeListener(OnActiveChangeListener listener) {
-        if (listener == null) {
-            throw new IllegalArgumentException("Listener may not be null");
-        }
-        mActiveListeners.remove(listener);
-    }
-
-    /**
-     * Obtain a compat wrapper for an existing MediaSession.
-     *
-     * @param mediaSession The {@link android.media.session.MediaSession} to
-     *            wrap.
-     * @return A compat wrapper for the provided session.
-     */
-    public static MediaSessionCompat obtain(Context context, Object mediaSession) {
-        return new MediaSessionCompat(context, new MediaSessionImplApi21(mediaSession));
-    }
-
-    /**
-     * Receives transport controls, media buttons, and commands from controllers
-     * and the system. The callback may be set using {@link #setCallback}.
-     */
-    public abstract static class Callback {
-        final Object mCallbackObj;
-
-        public Callback() {
-            if (android.os.Build.VERSION.SDK_INT >= 24) {
-                mCallbackObj = MediaSessionCompatApi24.createCallback(new StubApi24());
-            } else if (android.os.Build.VERSION.SDK_INT >= 23) {
-                mCallbackObj = MediaSessionCompatApi23.createCallback(new StubApi23());
-            } else if (android.os.Build.VERSION.SDK_INT >= 21) {
-                mCallbackObj = MediaSessionCompatApi21.createCallback(new StubApi21());
-            } else {
-                mCallbackObj = null;
-            }
-        }
-
-        /**
-         * Called when a controller has sent a custom command to this session.
-         * The owner of the session may handle custom commands but is not
-         * required to.
-         *
-         * @param command The command name.
-         * @param extras Optional parameters for the command, may be null.
-         * @param cb A result receiver to which a result may be sent by the command, may be null.
-         */
-        public void onCommand(String command, Bundle extras, ResultReceiver cb) {
-        }
-
-        /**
-         * Override to handle media button events.
-         *
-         * @param mediaButtonEvent The media button event intent.
-         * @return True if the event was handled, false otherwise.
-         */
-        public boolean onMediaButtonEvent(Intent mediaButtonEvent) {
-            return false;
-        }
-
-        /**
-         * Override to handle requests to prepare playback. During the preparation, a session
-         * should not hold audio focus in order to allow other session play seamlessly.
-         * The state of playback should be updated to {@link PlaybackStateCompat#STATE_PAUSED}
-         * after the preparation is done.
-         */
-        public void onPrepare() {
-        }
-
-        /**
-         * Override to handle requests to prepare for playing a specific mediaId that was provided
-         * by your app. During the preparation, a session should not hold audio focus in order to
-         * allow other session play seamlessly. The state of playback should be updated to
-         * {@link PlaybackStateCompat#STATE_PAUSED} after the preparation is done. The playback
-         * of the prepared content should start in the implementation of {@link #onPlay}. Override
-         * {@link #onPlayFromMediaId} to handle requests for starting playback without preparation.
-         */
-        public void onPrepareFromMediaId(String mediaId, Bundle extras) {
-        }
-
-        /**
-         * Override to handle requests to prepare playback from a search query. An
-         * empty query indicates that the app may prepare any music. The
-         * implementation should attempt to make a smart choice about what to
-         * play. During the preparation, a session should not hold audio focus in order to allow
-         * other session play seamlessly. The state of playback should be updated to
-         * {@link PlaybackStateCompat#STATE_PAUSED} after the preparation is done.
-         * The playback of the prepared content should start in the implementation of
-         * {@link #onPlay}. Override {@link #onPlayFromSearch} to handle requests for
-         * starting playback without preparation.
-         */
-        public void onPrepareFromSearch(String query, Bundle extras) {
-        }
-
-        /**
-         * Override to handle requests to prepare a specific media item represented by a URI.
-         * During the preparation, a session should not hold audio focus in order to allow other
-         * session play seamlessly. The state of playback should be updated to
-         * {@link PlaybackStateCompat#STATE_PAUSED} after the preparation is done. The playback of
-         * the prepared content should start in the implementation of {@link #onPlay}. Override
-         * {@link #onPlayFromUri} to handle requests for starting playback without preparation.
-         */
-        public void onPrepareFromUri(Uri uri, Bundle extras) {
-        }
-
-        /**
-         * Override to handle requests to begin playback.
-         */
-        public void onPlay() {
-        }
-
-        /**
-         * Override to handle requests to play a specific mediaId that was
-         * provided by your app.
-         */
-        public void onPlayFromMediaId(String mediaId, Bundle extras) {
-        }
-
-        /**
-         * Override to handle requests to begin playback from a search query. An
-         * empty query indicates that the app may play any music. The
-         * implementation should attempt to make a smart choice about what to
-         * play.
-         */
-        public void onPlayFromSearch(String query, Bundle extras) {
-        }
-
-        /**
-         * Override to handle requests to play a specific media item represented by a URI.
-         */
-        public void onPlayFromUri(Uri uri, Bundle extras) {
-        }
-
-        /**
-         * Override to handle requests to play an item with a given id from the
-         * play queue.
-         */
-        public void onSkipToQueueItem(long id) {
-        }
-
-        /**
-         * Override to handle requests to pause playback.
-         */
-        public void onPause() {
-        }
-
-        /**
-         * Override to handle requests to skip to the next media item.
-         */
-        public void onSkipToNext() {
-        }
-
-        /**
-         * Override to handle requests to skip to the previous media item.
-         */
-        public void onSkipToPrevious() {
-        }
-
-        /**
-         * Override to handle requests to fast forward.
-         */
-        public void onFastForward() {
-        }
-
-        /**
-         * Override to handle requests to rewind.
-         */
-        public void onRewind() {
-        }
-
-        /**
-         * Override to handle requests to stop playback.
-         */
-        public void onStop() {
-        }
-
-        /**
-         * Override to handle requests to seek to a specific position in ms.
-         *
-         * @param pos New position to move to, in milliseconds.
-         */
-        public void onSeekTo(long pos) {
-        }
-
-        /**
-         * Override to handle the item being rated.
-         *
-         * @param rating
-         */
-        public void onSetRating(RatingCompat rating) {
-        }
-
-        /**
-         * Called when a {@link MediaControllerCompat} wants a
-         * {@link PlaybackStateCompat.CustomAction} to be performed.
-         *
-         * @param action The action that was originally sent in the
-         *            {@link PlaybackStateCompat.CustomAction}.
-         * @param extras Optional extras specified by the
-         *            {@link MediaControllerCompat}.
-         */
-        public void onCustomAction(String action, Bundle extras) {
-        }
-
-        private class StubApi21 implements MediaSessionCompatApi21.Callback {
-
-            @Override
-            public void onCommand(String command, Bundle extras, ResultReceiver cb) {
-                Callback.this.onCommand(command, extras, cb);
-            }
-
-            @Override
-            public boolean onMediaButtonEvent(Intent mediaButtonIntent) {
-                return Callback.this.onMediaButtonEvent(mediaButtonIntent);
-            }
-
-            @Override
-            public void onPlay() {
-                Callback.this.onPlay();
-            }
-
-            @Override
-            public void onPlayFromMediaId(String mediaId, Bundle extras) {
-                Callback.this.onPlayFromMediaId(mediaId, extras);
-            }
-
-            @Override
-            public void onPlayFromSearch(String search, Bundle extras) {
-                Callback.this.onPlayFromSearch(search, extras);
-            }
-
-            @Override
-            public void onSkipToQueueItem(long id) {
-                Callback.this.onSkipToQueueItem(id);
-            }
-
-            @Override
-            public void onPause() {
-                Callback.this.onPause();
-            }
-
-            @Override
-            public void onSkipToNext() {
-                Callback.this.onSkipToNext();
-            }
-
-            @Override
-            public void onSkipToPrevious() {
-                Callback.this.onSkipToPrevious();
-            }
-
-            @Override
-            public void onFastForward() {
-                Callback.this.onFastForward();
-            }
-
-            @Override
-            public void onRewind() {
-                Callback.this.onRewind();
-            }
-
-            @Override
-            public void onStop() {
-                Callback.this.onStop();
-            }
-
-            @Override
-            public void onSeekTo(long pos) {
-                Callback.this.onSeekTo(pos);
-            }
-
-            @Override
-            public void onSetRating(Object ratingObj) {
-                Callback.this.onSetRating(RatingCompat.fromRating(ratingObj));
-            }
-
-            @Override
-            public void onCustomAction(String action, Bundle extras) {
-                if (action.equals(ACTION_PLAY_FROM_URI)) {
-                    Uri uri = extras.getParcelable(ACTION_ARGUMENT_URI);
-                    Bundle bundle = extras.getParcelable(ACTION_ARGUMENT_EXTRAS);
-                    Callback.this.onPlayFromUri(uri, bundle);
-                } else if (action.equals(ACTION_PREPARE)) {
-                    Callback.this.onPrepare();
-                } else if (action.equals(ACTION_PREPARE_FROM_MEDIA_ID)) {
-                    String mediaId = extras.getString(ACTION_ARGUMENT_MEDIA_ID);
-                    Bundle bundle = extras.getBundle(ACTION_ARGUMENT_EXTRAS);
-                    Callback.this.onPrepareFromMediaId(mediaId, bundle);
-                } else if (action.equals(ACTION_PREPARE_FROM_SEARCH)) {
-                    String query = extras.getString(ACTION_ARGUMENT_QUERY);
-                    Bundle bundle = extras.getBundle(ACTION_ARGUMENT_EXTRAS);
-                    Callback.this.onPrepareFromSearch(query, bundle);
-                } else if (action.equals(ACTION_PREPARE_FROM_URI)) {
-                    Uri uri = extras.getParcelable(ACTION_ARGUMENT_URI);
-                    Bundle bundle = extras.getBundle(ACTION_ARGUMENT_EXTRAS);
-                    Callback.this.onPrepareFromUri(uri, bundle);
-                } else {
-                    Callback.this.onCustomAction(action, extras);
-                }
-            }
-        }
-
-        private class StubApi23 extends StubApi21 implements MediaSessionCompatApi23.Callback {
-
-            @Override
-            public void onPlayFromUri(Uri uri, Bundle extras) {
-                Callback.this.onPlayFromUri(uri, extras);
-            }
-        }
-
-        private class StubApi24 extends StubApi23 implements MediaSessionCompatApi24.Callback {
-
-            @Override
-            public void onPrepare() {
-                Callback.this.onPrepare();
-            }
-
-            @Override
-            public void onPrepareFromMediaId(String mediaId, Bundle extras) {
-                Callback.this.onPrepareFromMediaId(mediaId, extras);
-            }
-
-            @Override
-            public void onPrepareFromSearch(String query, Bundle extras) {
-                Callback.this.onPrepareFromSearch(query, extras);
-            }
-
-            @Override
-            public void onPrepareFromUri(Uri uri, Bundle extras) {
-                Callback.this.onPrepareFromUri(uri, extras);
-            }
-        }
-    }
-
-    /**
-     * Represents an ongoing session. This may be passed to apps by the session
-     * owner to allow them to create a {@link MediaControllerCompat} to communicate with
-     * the session.
-     */
-    public static final class Token implements Parcelable {
-        private final Object mInner;
-
-        Token(Object inner) {
-            mInner = inner;
-        }
-
-        /**
-         * Creates a compat Token from a framework
-         * {@link android.media.session.MediaSession.Token} object.
-         * <p>
-         * This method is only supported on
-         * {@link android.os.Build.VERSION_CODES#LOLLIPOP} and later.
-         * </p>
-         *
-         * @param token The framework token object.
-         * @return A compat Token for use with {@link MediaControllerCompat}.
-         */
-        public static Token fromToken(Object token) {
-            if (token == null || android.os.Build.VERSION.SDK_INT < 21) {
-                return null;
-            }
-            return new Token(MediaSessionCompatApi21.verifyToken(token));
-        }
-
-        @Override
-        public int describeContents() {
-            return 0;
-        }
-
-        @Override
-        public void writeToParcel(Parcel dest, int flags) {
-            if (android.os.Build.VERSION.SDK_INT >= 21) {
-                dest.writeParcelable((Parcelable) mInner, flags);
-            } else {
-                dest.writeStrongBinder((IBinder) mInner);
-            }
-        }
-
-        /**
-         * Gets the underlying framework {@link android.media.session.MediaSession.Token} object.
-         * <p>
-         * This method is only supported on API 21+.
-         * </p>
-         *
-         * @return The underlying {@link android.media.session.MediaSession.Token} object,
-         * or null if none.
-         */
-        public Object getToken() {
-            return mInner;
-        }
-
-        public static final Parcelable.Creator<Token> CREATOR
-                = new Parcelable.Creator<Token>() {
-            @Override
-            public Token createFromParcel(Parcel in) {
-                Object inner;
-                if (android.os.Build.VERSION.SDK_INT >= 21) {
-                    inner = in.readParcelable(null);
-                } else {
-                    inner = in.readStrongBinder();
-                }
-                return new Token(inner);
-            }
-
-            @Override
-            public Token[] newArray(int size) {
-                return new Token[size];
-            }
-        };
-    }
-
-    /**
-     * A single item that is part of the play queue. It contains a description
-     * of the item and its id in the queue.
-     */
-    public static final class QueueItem implements Parcelable {
-        /**
-         * This id is reserved. No items can be explicitly asigned this id.
-         */
-        public static final int UNKNOWN_ID = -1;
-
-        private final MediaDescriptionCompat mDescription;
-        private final long mId;
-
-        private Object mItem;
-
-        /**
-         * Create a new {@link MediaSessionCompat.QueueItem}.
-         *
-         * @param description The {@link MediaDescriptionCompat} for this item.
-         * @param id An identifier for this item. It must be unique within the
-         *            play queue and cannot be {@link #UNKNOWN_ID}.
-         */
-        public QueueItem(MediaDescriptionCompat description, long id) {
-            this(null, description, id);
-        }
-
-        private QueueItem(Object queueItem, MediaDescriptionCompat description, long id) {
-            if (description == null) {
-                throw new IllegalArgumentException("Description cannot be null.");
-            }
-            if (id == UNKNOWN_ID) {
-                throw new IllegalArgumentException("Id cannot be QueueItem.UNKNOWN_ID");
-            }
-            mDescription = description;
-            mId = id;
-            mItem = queueItem;
-        }
-
-        private QueueItem(Parcel in) {
-            mDescription = MediaDescriptionCompat.CREATOR.createFromParcel(in);
-            mId = in.readLong();
-        }
-
-        /**
-         * Get the description for this item.
-         */
-        public MediaDescriptionCompat getDescription() {
-            return mDescription;
-        }
-
-        /**
-         * Get the queue id for this item.
-         */
-        public long getQueueId() {
-            return mId;
-        }
-
-        @Override
-        public void writeToParcel(Parcel dest, int flags) {
-            mDescription.writeToParcel(dest, flags);
-            dest.writeLong(mId);
-        }
-
-        @Override
-        public int describeContents() {
-            return 0;
-        }
-
-        /**
-         * Get the underlying
-         * {@link android.media.session.MediaSession.QueueItem}.
-         * <p>
-         * On builds before {@link android.os.Build.VERSION_CODES#LOLLIPOP} null
-         * is returned.
-         *
-         * @return The underlying
-         *         {@link android.media.session.MediaSession.QueueItem} or null.
-         */
-        public Object getQueueItem() {
-            if (mItem != null || android.os.Build.VERSION.SDK_INT < 21) {
-                return mItem;
-            }
-            mItem = MediaSessionCompatApi21.QueueItem.createItem(mDescription.getMediaDescription(),
-                    mId);
-            return mItem;
-        }
-
-        /**
-         * Obtain a compat wrapper for an existing QueueItem.
-         *
-         * @param queueItem The {@link android.media.session.MediaSession.QueueItem} to
-         *            wrap.
-         * @return A compat wrapper for the provided item.
-         */
-        public static QueueItem obtain(Object queueItem) {
-            Object descriptionObj = MediaSessionCompatApi21.QueueItem.getDescription(queueItem);
-            MediaDescriptionCompat description = MediaDescriptionCompat.fromMediaDescription(
-                    descriptionObj);
-            long id = MediaSessionCompatApi21.QueueItem.getQueueId(queueItem);
-            return new QueueItem(queueItem, description, id);
-        }
-
-        public static final Creator<MediaSessionCompat.QueueItem> CREATOR
-                = new Creator<MediaSessionCompat.QueueItem>() {
-
-            @Override
-            public MediaSessionCompat.QueueItem createFromParcel(Parcel p) {
-                return new MediaSessionCompat.QueueItem(p);
-            }
-
-            @Override
-            public MediaSessionCompat.QueueItem[] newArray(int size) {
-                return new MediaSessionCompat.QueueItem[size];
-            }
-        };
-
-        @Override
-        public String toString() {
-            return "MediaSession.QueueItem {" +
-                    "Description=" + mDescription +
-                    ", Id=" + mId + " }";
-        }
-    }
-
-    /**
-     * This is a wrapper for {@link ResultReceiver} for sending over aidl
-     * interfaces. The framework version was not exposed to aidls until
-     * {@link android.os.Build.VERSION_CODES#LOLLIPOP}.
-     */
-    static final class ResultReceiverWrapper implements Parcelable {
-        private ResultReceiver mResultReceiver;
-
-        public ResultReceiverWrapper(ResultReceiver resultReceiver) {
-            mResultReceiver = resultReceiver;
-        }
-
-        ResultReceiverWrapper(Parcel in) {
-            mResultReceiver = ResultReceiver.CREATOR.createFromParcel(in);
-        }
-
-        public static final Creator<ResultReceiverWrapper>
-                CREATOR = new Creator<ResultReceiverWrapper>() {
-            @Override
-            public ResultReceiverWrapper createFromParcel(Parcel p) {
-                return new ResultReceiverWrapper(p);
-            }
-
-            @Override
-            public ResultReceiverWrapper[] newArray(int size) {
-                return new ResultReceiverWrapper[size];
-            }
-        };
-
-        @Override
-        public int describeContents() {
-            return 0;
-        }
-
-        @Override
-        public void writeToParcel(Parcel dest, int flags) {
-            mResultReceiver.writeToParcel(dest, flags);
-        }
-    }
-
-    public interface OnActiveChangeListener {
-        void onActiveChanged();
-    }
-
-    interface MediaSessionImpl {
-        void setCallback(Callback callback, Handler handler);
-        void setFlags(@SessionFlags int flags);
-        void setPlaybackToLocal(int stream);
-        void setPlaybackToRemote(VolumeProviderCompat volumeProvider);
-        void setActive(boolean active);
-        boolean isActive();
-        void sendSessionEvent(String event, Bundle extras);
-        void release();
-        Token getSessionToken();
-        void setPlaybackState(PlaybackStateCompat state);
-        void setMetadata(MediaMetadataCompat metadata);
-
-        void setSessionActivity(PendingIntent pi);
-
-        void setMediaButtonReceiver(PendingIntent mbr);
-        void setQueue(List<QueueItem> queue);
-        void setQueueTitle(CharSequence title);
-
-        void setRatingType(@RatingCompat.Style int type);
-        void setExtras(Bundle extras);
-
-        Object getMediaSession();
-
-        Object getRemoteControlClient();
-
-        String getCallingPackage();
-    }
-
-    static class MediaSessionImplBase implements MediaSessionImpl {
-        private final Context mContext;
-        private final ComponentName mMediaButtonReceiverComponentName;
-        private final PendingIntent mMediaButtonReceiverIntent;
-        private final Object mRccObj;
-        private final MediaSessionStub mStub;
-        private final Token mToken;
-        private final String mPackageName;
-        private final String mTag;
-        private final AudioManager mAudioManager;
-
-        private final Object mLock = new Object();
-        private final RemoteCallbackList<IMediaControllerCallback> mControllerCallbacks
-                = new RemoteCallbackList<>();
-
-        private MessageHandler mHandler;
-        private boolean mDestroyed = false;
-        private boolean mIsActive = false;
-        private boolean mIsRccRegistered = false;
-        private boolean mIsMbrRegistered = false;
-        private volatile Callback mCallback;
-
-        private @SessionFlags int mFlags;
-
-        private MediaMetadataCompat mMetadata;
-        private PlaybackStateCompat mState;
-        private PendingIntent mSessionActivity;
-        private List<QueueItem> mQueue;
-        private CharSequence mQueueTitle;
-        private @RatingCompat.Style int mRatingType;
-        private Bundle mExtras;
-
-        private int mVolumeType;
-        private int mLocalStream;
-        private VolumeProviderCompat mVolumeProvider;
-
-        private VolumeProviderCompat.Callback mVolumeCallback
-                = new VolumeProviderCompat.Callback() {
-            @Override
-            public void onVolumeChanged(VolumeProviderCompat volumeProvider) {
-                if (mVolumeProvider != volumeProvider) {
-                    return;
-                }
-                ParcelableVolumeInfo info = new ParcelableVolumeInfo(mVolumeType, mLocalStream,
-                        volumeProvider.getVolumeControl(), volumeProvider.getMaxVolume(),
-                        volumeProvider.getCurrentVolume());
-                sendVolumeInfoChanged(info);
-            }
-        };
-
-        public MediaSessionImplBase(Context context, String tag, ComponentName mbrComponent,
-                PendingIntent mbrIntent) {
-            if (mbrComponent == null) {
-                Intent queryIntent = new Intent(Intent.ACTION_MEDIA_BUTTON);
-                queryIntent.setPackage(context.getPackageName());
-                PackageManager pm = context.getPackageManager();
-                List<ResolveInfo> resolveInfos = pm.queryBroadcastReceivers(queryIntent, 0);
-                // If none are found, assume we are running on a newer platform version that does
-                // not require a media button receiver ComponentName. Later code will double check
-                // this assumption and throw an error if needed
-                if (resolveInfos.size() == 1) {
-                    ResolveInfo resolveInfo = resolveInfos.get(0);
-                    mbrComponent = new ComponentName(resolveInfo.activityInfo.packageName,
-                            resolveInfo.activityInfo.name);
-                } else if (resolveInfos.size() > 1) {
-                    Log.w(TAG, "More than one BroadcastReceiver that handles "
-                            + Intent.ACTION_MEDIA_BUTTON + " was found, using null. Provide a "
-                            + "specific ComponentName to use as this session's media button "
-                            + "receiver");
-                }
-            }
-            if (mbrComponent != null && mbrIntent == null) {
-                // construct a PendingIntent for the media button
-                Intent mediaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON);
-                // the associated intent will be handled by the component being registered
-                mediaButtonIntent.setComponent(mbrComponent);
-                mbrIntent = PendingIntent.getBroadcast(context,
-                        0/* requestCode, ignored */, mediaButtonIntent, 0/* flags */);
-            }
-            if (mbrComponent == null) {
-                throw new IllegalArgumentException(
-                        "MediaButtonReceiver component may not be null.");
-            }
-            mContext = context;
-            mPackageName = context.getPackageName();
-            mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
-            mTag = tag;
-            mMediaButtonReceiverComponentName = mbrComponent;
-            mMediaButtonReceiverIntent = mbrIntent;
-            mStub = new MediaSessionStub();
-            mToken = new Token(mStub);
-
-            mRatingType = RatingCompat.RATING_NONE;
-            mVolumeType = MediaControllerCompat.PlaybackInfo.PLAYBACK_TYPE_LOCAL;
-            mLocalStream = AudioManager.STREAM_MUSIC;
-            if (android.os.Build.VERSION.SDK_INT >= 14) {
-                mRccObj = MediaSessionCompatApi14.createRemoteControlClient(mbrIntent);
-            } else {
-                mRccObj = null;
-            }
-        }
-
-        @Override
-        public void setCallback(Callback callback, Handler handler) {
-            mCallback = callback;
-            if (callback == null) {
-                // There's nothing to unregister on API < 18 since media buttons
-                // all go through the media button receiver
-                if (android.os.Build.VERSION.SDK_INT >= 18) {
-                    MediaSessionCompatApi18.setOnPlaybackPositionUpdateListener(mRccObj, null);
-                }
-                if (android.os.Build.VERSION.SDK_INT >= 19) {
-                    MediaSessionCompatApi19.setOnMetadataUpdateListener(mRccObj, null);
-                }
-            } else {
-                if (handler == null) {
-                    handler = new Handler();
-                }
-                synchronized (mLock) {
-                    mHandler = new MessageHandler(handler.getLooper());
-                }
-                MediaSessionCompatApi19.Callback cb19 = new MediaSessionCompatApi19.Callback() {
-                    @Override
-                    public void onSetRating(Object ratingObj) {
-                        postToHandler(MessageHandler.MSG_RATE,
-                                RatingCompat.fromRating(ratingObj));
-                    }
-
-                    @Override
-                    public void onSeekTo(long pos) {
-                        postToHandler(MessageHandler.MSG_SEEK_TO, pos);
-                    }
-                };
-                if (android.os.Build.VERSION.SDK_INT >= 18) {
-                    Object onPositionUpdateObj = MediaSessionCompatApi18
-                            .createPlaybackPositionUpdateListener(cb19);
-                    MediaSessionCompatApi18.setOnPlaybackPositionUpdateListener(mRccObj,
-                            onPositionUpdateObj);
-                }
-                if (android.os.Build.VERSION.SDK_INT >= 19) {
-                    Object onMetadataUpdateObj = MediaSessionCompatApi19
-                            .createMetadataUpdateListener(cb19);
-                    MediaSessionCompatApi19.setOnMetadataUpdateListener(mRccObj,
-                            onMetadataUpdateObj);
-                }
-            }
-        }
-
-        private void postToHandler(int what) {
-            postToHandler(what, null);
-        }
-
-        private void postToHandler(int what, Object obj) {
-            postToHandler(what, obj, null);
-        }
-
-        private void postToHandler(int what, Object obj, Bundle extras) {
-            synchronized (mLock) {
-                if (mHandler != null) {
-                    mHandler.post(what, obj, extras);
-                }
-            }
-        }
-
-        @Override
-        public void setFlags(@SessionFlags int flags) {
-            synchronized (mLock) {
-                mFlags = flags;
-            }
-            update();
-        }
-
-        @Override
-        public void setPlaybackToLocal(int stream) {
-            if (mVolumeProvider != null) {
-                mVolumeProvider.setCallback(null);
-            }
-            mVolumeType = MediaControllerCompat.PlaybackInfo.PLAYBACK_TYPE_LOCAL;
-            ParcelableVolumeInfo info = new ParcelableVolumeInfo(mVolumeType, mLocalStream,
-                    VolumeProviderCompat.VOLUME_CONTROL_ABSOLUTE,
-                    mAudioManager.getStreamMaxVolume(mLocalStream),
-                    mAudioManager.getStreamVolume(mLocalStream));
-            sendVolumeInfoChanged(info);
-        }
-
-        @Override
-        public void setPlaybackToRemote(VolumeProviderCompat volumeProvider) {
-            if (volumeProvider == null) {
-                throw new IllegalArgumentException("volumeProvider may not be null");
-            }
-            if (mVolumeProvider != null) {
-                mVolumeProvider.setCallback(null);
-            }
-            mVolumeType = MediaControllerCompat.PlaybackInfo.PLAYBACK_TYPE_REMOTE;
-            mVolumeProvider = volumeProvider;
-            ParcelableVolumeInfo info = new ParcelableVolumeInfo(mVolumeType, mLocalStream,
-                    mVolumeProvider.getVolumeControl(), mVolumeProvider.getMaxVolume(),
-                    mVolumeProvider.getCurrentVolume());
-            sendVolumeInfoChanged(info);
-
-            volumeProvider.setCallback(mVolumeCallback);
-        }
-
-        @Override
-        public void setActive(boolean active) {
-            if (active == mIsActive) {
-                return;
-            }
-            mIsActive = active;
-            if (update()) {
-                setMetadata(mMetadata);
-                setPlaybackState(mState);
-            }
-        }
-
-        @Override
-        public boolean isActive() {
-            return mIsActive;
-        }
-
-        @Override
-        public void sendSessionEvent(String event, Bundle extras) {
-            sendEvent(event, extras);
-        }
-
-        @Override
-        public void release() {
-            mIsActive = false;
-            mDestroyed = true;
-            update();
-            sendSessionDestroyed();
-        }
-
-        @Override
-        public Token getSessionToken() {
-            return mToken;
-        }
-
-        @Override
-        public void setPlaybackState(PlaybackStateCompat state) {
-            synchronized (mLock) {
-                mState = state;
-            }
-            sendState(state);
-            if (!mIsActive) {
-                // Don't set the state until after the RCC is registered
-                return;
-            }
-            if (state == null) {
-                if (android.os.Build.VERSION.SDK_INT >= 14) {
-                    MediaSessionCompatApi14.setState(mRccObj, PlaybackStateCompat.STATE_NONE);
-                    MediaSessionCompatApi14.setTransportControlFlags(mRccObj, 0);
-                }
-            } else {
-                // Set state
-                if (android.os.Build.VERSION.SDK_INT >= 18) {
-                    MediaSessionCompatApi18.setState(mRccObj, state.getState(), state.getPosition(),
-                            state.getPlaybackSpeed(), state.getLastPositionUpdateTime());
-                } else if (android.os.Build.VERSION.SDK_INT >= 14) {
-                    MediaSessionCompatApi14.setState(mRccObj, state.getState());
-                }
-
-                // Set transport control flags
-                if (android.os.Build.VERSION.SDK_INT >= 19) {
-                    MediaSessionCompatApi19.setTransportControlFlags(mRccObj, state.getActions());
-                } else if (android.os.Build.VERSION.SDK_INT >= 18) {
-                    MediaSessionCompatApi18.setTransportControlFlags(mRccObj, state.getActions());
-                } else if (android.os.Build.VERSION.SDK_INT >= 14) {
-                    MediaSessionCompatApi14.setTransportControlFlags(mRccObj, state.getActions());
-                }
-            }
-        }
-
-        /**
-         * Clones the given {@link MediaMetadataCompat}, deep-copying bitmaps in the metadata if
-         * they exist. If there is no bitmap in the metadata, this method just returns the given
-         * metadata.
-         *
-         * @param metadata A {@link MediaMetadataCompat} to be cloned.
-         * @return A newly cloned metadata if it contains bitmaps. Otherwise, the given metadata
-         *         will be returned.
-         */
-        private MediaMetadataCompat cloneMetadataIfNeeded(MediaMetadataCompat metadata) {
-            if (metadata == null) {
-                return null;
-            } else if (!metadata.containsKey(MediaMetadataCompat.METADATA_KEY_ART)
-                    && !metadata.containsKey(MediaMetadataCompat.METADATA_KEY_ALBUM_ART)) {
-                return metadata;
-            }
-            MediaMetadataCompat.Builder builder = new MediaMetadataCompat.Builder(metadata);
-            Bitmap artBitmap = metadata.getBitmap(MediaMetadataCompat.METADATA_KEY_ART);
-            if (artBitmap != null) {
-                builder.putBitmap(MediaMetadataCompat.METADATA_KEY_ART,
-                        artBitmap.copy(artBitmap.getConfig(), false));
-            }
-            Bitmap albumArtBitmap = metadata.getBitmap(MediaMetadataCompat.METADATA_KEY_ALBUM_ART);
-            if (albumArtBitmap != null) {
-                builder.putBitmap(MediaMetadataCompat.METADATA_KEY_ALBUM_ART,
-                        albumArtBitmap.copy(albumArtBitmap.getConfig(), false));
-            }
-            return builder.build();
-        }
-
-        @Override
-        public void setMetadata(MediaMetadataCompat metadata) {
-            if (android.os.Build.VERSION.SDK_INT >= 14 && metadata != null) {
-                // Clone bitmaps in metadata for protecting them to be recycled by RCC.
-                metadata = cloneMetadataIfNeeded(metadata);
-            }
-            synchronized (mLock) {
-                mMetadata = metadata;
-            }
-            sendMetadata(metadata);
-            if (!mIsActive) {
-                // Don't set metadata until after the rcc has been registered
-                return;
-            }
-            if (android.os.Build.VERSION.SDK_INT >= 19) {
-                MediaSessionCompatApi19.setMetadata(mRccObj,
-                        metadata == null ? null : metadata.getBundle(),
-                        mState == null ? 0 : mState.getActions());
-            } else if (android.os.Build.VERSION.SDK_INT >= 14) {
-                MediaSessionCompatApi14.setMetadata(mRccObj,
-                        metadata == null ? null : metadata.getBundle());
-            }
-        }
-
-        @Override
-        public void setSessionActivity(PendingIntent pi) {
-            synchronized (mLock) {
-                mSessionActivity = pi;
-            }
-        }
-
-        @Override
-        public void setMediaButtonReceiver(PendingIntent mbr) {
-            // Do nothing, changing this is not supported before API 21.
-        }
-
-        @Override
-        public void setQueue(List<QueueItem> queue) {
-            mQueue = queue;
-            sendQueue(queue);
-        }
-
-        @Override
-        public void setQueueTitle(CharSequence title) {
-            mQueueTitle = title;
-            sendQueueTitle(title);
-        }
-
-        @Override
-        public Object getMediaSession() {
-            return null;
-        }
-
-        @Override
-        public Object getRemoteControlClient() {
-            return mRccObj;
-        }
-
-        @Override
-        public String getCallingPackage() {
-            return null;
-        }
-
-        @Override
-        public void setRatingType(@RatingCompat.Style int type) {
-            mRatingType = type;
-        }
-
-        @Override
-        public void setExtras(Bundle extras) {
-            mExtras = extras;
-        }
-
-        // Registers/unregisters the RCC and MediaButtonEventReceiver as needed.
-        private boolean update() {
-            boolean registeredRcc = false;
-            if (mIsActive) {
-                // On API 8+ register a MBR if it's supported, unregister it
-                // if support was removed.
-                if (android.os.Build.VERSION.SDK_INT >= 8) {
-                    if (!mIsMbrRegistered && (mFlags & FLAG_HANDLES_MEDIA_BUTTONS) != 0) {
-                        if (android.os.Build.VERSION.SDK_INT >= 18) {
-                            MediaSessionCompatApi18.registerMediaButtonEventReceiver(mContext,
-                                    mMediaButtonReceiverIntent,
-                                    mMediaButtonReceiverComponentName);
-                        } else {
-                            MediaSessionCompatApi8.registerMediaButtonEventReceiver(mContext,
-                                    mMediaButtonReceiverComponentName);
-                        }
-                        mIsMbrRegistered = true;
-                    } else if (mIsMbrRegistered && (mFlags & FLAG_HANDLES_MEDIA_BUTTONS) == 0) {
-                        if (android.os.Build.VERSION.SDK_INT >= 18) {
-                            MediaSessionCompatApi18.unregisterMediaButtonEventReceiver(mContext,
-                                    mMediaButtonReceiverIntent,
-                                    mMediaButtonReceiverComponentName);
-                        } else {
-                            MediaSessionCompatApi8.unregisterMediaButtonEventReceiver(mContext,
-                                    mMediaButtonReceiverComponentName);
-                        }
-                        mIsMbrRegistered = false;
-                    }
-                }
-                // On API 14+ register a RCC if it's supported, unregister it if
-                // not.
-                if (android.os.Build.VERSION.SDK_INT >= 14) {
-                    if (!mIsRccRegistered && (mFlags & FLAG_HANDLES_TRANSPORT_CONTROLS) != 0) {
-                        MediaSessionCompatApi14.registerRemoteControlClient(mContext, mRccObj);
-                        mIsRccRegistered = true;
-                        registeredRcc = true;
-                    } else if (mIsRccRegistered
-                            && (mFlags & FLAG_HANDLES_TRANSPORT_CONTROLS) == 0) {
-                        // RCC keeps the state while the system resets its state internally when
-                        // we register RCC. Reset the state so that the states in RCC and the system
-                        // are in sync when we re-register the RCC.
-                        MediaSessionCompatApi14.setState(mRccObj, PlaybackStateCompat.STATE_NONE);
-                        MediaSessionCompatApi14.unregisterRemoteControlClient(mContext, mRccObj);
-                        mIsRccRegistered = false;
-                    }
-                }
-            } else {
-                // When inactive remove any registered components.
-                if (mIsMbrRegistered) {
-                    if (android.os.Build.VERSION.SDK_INT >= 18) {
-                        MediaSessionCompatApi18.unregisterMediaButtonEventReceiver(mContext,
-                                mMediaButtonReceiverIntent, mMediaButtonReceiverComponentName);
-                    } else {
-                        MediaSessionCompatApi8.unregisterMediaButtonEventReceiver(mContext,
-                                mMediaButtonReceiverComponentName);
-                    }
-                    mIsMbrRegistered = false;
-                }
-                if (mIsRccRegistered) {
-                    // RCC keeps the state while the system resets its state internally when
-                    // we register RCC. Reset the state so that the states in RCC and the system
-                    // are in sync when we re-register the RCC.
-                    MediaSessionCompatApi14.setState(mRccObj, PlaybackStateCompat.STATE_NONE);
-                    MediaSessionCompatApi14.unregisterRemoteControlClient(mContext, mRccObj);
-                    mIsRccRegistered = false;
-                }
-            }
-            return registeredRcc;
-        }
-
-        private void adjustVolume(int direction, int flags) {
-            if (mVolumeType == MediaControllerCompat.PlaybackInfo.PLAYBACK_TYPE_REMOTE) {
-                if (mVolumeProvider != null) {
-                    mVolumeProvider.onAdjustVolume(direction);
-                }
-            } else {
-                mAudioManager.adjustStreamVolume(mLocalStream, direction, flags);
-            }
-        }
-
-        private void setVolumeTo(int value, int flags) {
-            if (mVolumeType == MediaControllerCompat.PlaybackInfo.PLAYBACK_TYPE_REMOTE) {
-                if (mVolumeProvider != null) {
-                    mVolumeProvider.onSetVolumeTo(value);
-                }
-            } else {
-                mAudioManager.setStreamVolume(mLocalStream, value, flags);
-            }
-        }
-
-        private PlaybackStateCompat getStateWithUpdatedPosition() {
-            PlaybackStateCompat state;
-            long duration = -1;
-            synchronized (mLock) {
-                state = mState;
-                if (mMetadata != null
-                        && mMetadata.containsKey(MediaMetadataCompat.METADATA_KEY_DURATION)) {
-                    duration = mMetadata.getLong(MediaMetadataCompat.METADATA_KEY_DURATION);
-                }
-            }
-
-            PlaybackStateCompat result = null;
-            if (state != null) {
-                if (state.getState() == PlaybackStateCompat.STATE_PLAYING
-                        || state.getState() == PlaybackStateCompat.STATE_FAST_FORWARDING
-                        || state.getState() == PlaybackStateCompat.STATE_REWINDING) {
-                    long updateTime = state.getLastPositionUpdateTime();
-                    long currentTime = SystemClock.elapsedRealtime();
-                    if (updateTime > 0) {
-                        long position = (long) (state.getPlaybackSpeed()
-                                * (currentTime - updateTime)) + state.getPosition();
-                        if (duration >= 0 && position > duration) {
-                            position = duration;
-                        } else if (position < 0) {
-                            position = 0;
-                        }
-                        PlaybackStateCompat.Builder builder = new PlaybackStateCompat.Builder(
-                                state);
-                        builder.setState(state.getState(), position, state.getPlaybackSpeed(),
-                                currentTime);
-                        result = builder.build();
-                    }
-                }
-            }
-            return result == null ? state : result;
-        }
-
-        private void sendVolumeInfoChanged(ParcelableVolumeInfo info) {
-            int size = mControllerCallbacks.beginBroadcast();
-            for (int i = size - 1; i >= 0; i--) {
-                IMediaControllerCallback cb = mControllerCallbacks.getBroadcastItem(i);
-                try {
-                    cb.onVolumeInfoChanged(info);
-                } catch (RemoteException e) {
-                }
-            }
-            mControllerCallbacks.finishBroadcast();
-        }
-
-        private void sendSessionDestroyed() {
-            int size = mControllerCallbacks.beginBroadcast();
-            for (int i = size - 1; i >= 0; i--) {
-                IMediaControllerCallback cb = mControllerCallbacks.getBroadcastItem(i);
-                try {
-                    cb.onSessionDestroyed();
-                } catch (RemoteException e) {
-                }
-            }
-            mControllerCallbacks.finishBroadcast();
-            mControllerCallbacks.kill();
-        }
-
-        private void sendEvent(String event, Bundle extras) {
-            int size = mControllerCallbacks.beginBroadcast();
-            for (int i = size - 1; i >= 0; i--) {
-                IMediaControllerCallback cb = mControllerCallbacks.getBroadcastItem(i);
-                try {
-                    cb.onEvent(event, extras);
-                } catch (RemoteException e) {
-                }
-            }
-            mControllerCallbacks.finishBroadcast();
-        }
-
-        private void sendState(PlaybackStateCompat state) {
-            int size = mControllerCallbacks.beginBroadcast();
-            for (int i = size - 1; i >= 0; i--) {
-                IMediaControllerCallback cb = mControllerCallbacks.getBroadcastItem(i);
-                try {
-                    cb.onPlaybackStateChanged(state);
-                } catch (RemoteException e) {
-                }
-            }
-            mControllerCallbacks.finishBroadcast();
-        }
-
-        private void sendMetadata(MediaMetadataCompat metadata) {
-            int size = mControllerCallbacks.beginBroadcast();
-            for (int i = size - 1; i >= 0; i--) {
-                IMediaControllerCallback cb = mControllerCallbacks.getBroadcastItem(i);
-                try {
-                    cb.onMetadataChanged(metadata);
-                } catch (RemoteException e) {
-                }
-            }
-            mControllerCallbacks.finishBroadcast();
-        }
-
-        private void sendQueue(List<QueueItem> queue) {
-            int size = mControllerCallbacks.beginBroadcast();
-            for (int i = size - 1; i >= 0; i--) {
-                IMediaControllerCallback cb = mControllerCallbacks.getBroadcastItem(i);
-                try {
-                    cb.onQueueChanged(queue);
-                } catch (RemoteException e) {
-                }
-            }
-            mControllerCallbacks.finishBroadcast();
-        }
-
-        private void sendQueueTitle(CharSequence queueTitle) {
-            int size = mControllerCallbacks.beginBroadcast();
-            for (int i = size - 1; i >= 0; i--) {
-                IMediaControllerCallback cb = mControllerCallbacks.getBroadcastItem(i);
-                try {
-                    cb.onQueueTitleChanged(queueTitle);
-                } catch (RemoteException e) {
-                }
-            }
-            mControllerCallbacks.finishBroadcast();
-        }
-
-        class MediaSessionStub extends IMediaSession.Stub {
-            @Override
-            public void sendCommand(String command, Bundle args, ResultReceiverWrapper cb) {
-                postToHandler(MessageHandler.MSG_COMMAND,
-                        new Command(command, args, cb.mResultReceiver));
-            }
-
-            @Override
-            public boolean sendMediaButton(KeyEvent mediaButton) {
-                boolean handlesMediaButtons =
-                        (mFlags & MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS) != 0;
-                if (handlesMediaButtons) {
-                    postToHandler(MessageHandler.MSG_MEDIA_BUTTON, mediaButton);
-                }
-                return handlesMediaButtons;
-            }
-
-            @Override
-            public void registerCallbackListener(IMediaControllerCallback cb) {
-                // If this session is already destroyed tell the caller and
-                // don't add them.
-                if (mDestroyed) {
-                    try {
-                        cb.onSessionDestroyed();
-                    } catch (Exception e) {
-                        // ignored
-                    }
-                    return;
-                }
-                mControllerCallbacks.register(cb);
-            }
-
-            @Override
-            public void unregisterCallbackListener(IMediaControllerCallback cb) {
-                mControllerCallbacks.unregister(cb);
-            }
-
-            @Override
-            public String getPackageName() {
-                // mPackageName is final so doesn't need synchronize block
-                return mPackageName;
-            }
-
-            @Override
-            public String getTag() {
-                // mTag is final so doesn't need synchronize block
-                return mTag;
-            }
-
-            @Override
-            public PendingIntent getLaunchPendingIntent() {
-                synchronized (mLock) {
-                    return mSessionActivity;
-                }
-            }
-
-            @Override
-            @SessionFlags
-            public long getFlags() {
-                synchronized (mLock) {
-                    return mFlags;
-                }
-            }
-
-            @Override
-            public ParcelableVolumeInfo getVolumeAttributes() {
-                int controlType;
-                int max;
-                int current;
-                int stream;
-                int volumeType;
-                synchronized (mLock) {
-                    volumeType = mVolumeType;
-                    stream = mLocalStream;
-                    VolumeProviderCompat vp = mVolumeProvider;
-                    if (volumeType == MediaControllerCompat.PlaybackInfo.PLAYBACK_TYPE_REMOTE) {
-                        controlType = vp.getVolumeControl();
-                        max = vp.getMaxVolume();
-                        current = vp.getCurrentVolume();
-                    } else {
-                        controlType = VolumeProviderCompat.VOLUME_CONTROL_ABSOLUTE;
-                        max = mAudioManager.getStreamMaxVolume(stream);
-                        current = mAudioManager.getStreamVolume(stream);
-                    }
-                }
-                return new ParcelableVolumeInfo(volumeType, stream, controlType, max, current);
-            }
-
-            @Override
-            public void adjustVolume(int direction, int flags, String packageName) {
-                MediaSessionImplBase.this.adjustVolume(direction, flags);
-            }
-
-            @Override
-            public void setVolumeTo(int value, int flags, String packageName) {
-                MediaSessionImplBase.this.setVolumeTo(value, flags);
-            }
-
-            @Override
-            public void prepare() throws RemoteException {
-                postToHandler(MessageHandler.MSG_PREPARE);
-            }
-
-            @Override
-            public void prepareFromMediaId(String mediaId, Bundle extras) throws RemoteException {
-                postToHandler(MessageHandler.MSG_PREPARE_MEDIA_ID, mediaId, extras);
-            }
-
-            @Override
-            public void prepareFromSearch(String query, Bundle extras) throws RemoteException {
-                postToHandler(MessageHandler.MSG_PREPARE_SEARCH, query, extras);
-            }
-
-            @Override
-            public void prepareFromUri(Uri uri, Bundle extras) throws RemoteException {
-                postToHandler(MessageHandler.MSG_PREPARE_URI, uri, extras);
-            }
-
-            @Override
-            public void play() throws RemoteException {
-                postToHandler(MessageHandler.MSG_PLAY);
-            }
-
-            @Override
-            public void playFromMediaId(String mediaId, Bundle extras) throws RemoteException {
-                postToHandler(MessageHandler.MSG_PLAY_MEDIA_ID, mediaId, extras);
-            }
-
-            @Override
-            public void playFromSearch(String query, Bundle extras) throws RemoteException {
-                postToHandler(MessageHandler.MSG_PLAY_SEARCH, query, extras);
-            }
-
-            @Override
-            public void playFromUri(Uri uri, Bundle extras) throws RemoteException {
-                postToHandler(MessageHandler.MSG_PLAY_URI, uri, extras);
-            }
-
-            @Override
-            public void skipToQueueItem(long id) {
-                postToHandler(MessageHandler.MSG_SKIP_TO_ITEM, id);
-            }
-
-            @Override
-            public void pause() throws RemoteException {
-                postToHandler(MessageHandler.MSG_PAUSE);
-            }
-
-            @Override
-            public void stop() throws RemoteException {
-                postToHandler(MessageHandler.MSG_STOP);
-            }
-
-            @Override
-            public void next() throws RemoteException {
-                postToHandler(MessageHandler.MSG_NEXT);
-            }
-
-            @Override
-            public void previous() throws RemoteException {
-                postToHandler(MessageHandler.MSG_PREVIOUS);
-            }
-
-            @Override
-            public void fastForward() throws RemoteException {
-                postToHandler(MessageHandler.MSG_FAST_FORWARD);
-            }
-
-            @Override
-            public void rewind() throws RemoteException {
-                postToHandler(MessageHandler.MSG_REWIND);
-            }
-
-            @Override
-            public void seekTo(long pos) throws RemoteException {
-                postToHandler(MessageHandler.MSG_SEEK_TO, pos);
-            }
-
-            @Override
-            public void rate(RatingCompat rating) throws RemoteException {
-                postToHandler(MessageHandler.MSG_RATE, rating);
-            }
-
-            @Override
-            public void sendCustomAction(String action, Bundle args)
-                    throws RemoteException {
-                postToHandler(MessageHandler.MSG_CUSTOM_ACTION, action, args);
-            }
-
-            @Override
-            public MediaMetadataCompat getMetadata() {
-                return mMetadata;
-            }
-
-            @Override
-            public PlaybackStateCompat getPlaybackState() {
-                return getStateWithUpdatedPosition();
-            }
-
-            @Override
-            public List<QueueItem> getQueue() {
-                synchronized (mLock) {
-                    return mQueue;
-                }
-            }
-
-            @Override
-            public CharSequence getQueueTitle() {
-                return mQueueTitle;
-            }
-
-            @Override
-            public Bundle getExtras() {
-                synchronized (mLock) {
-                    return mExtras;
-                }
-            }
-
-            @Override
-            @RatingCompat.Style
-            public int getRatingType() {
-                return mRatingType;
-            }
-
-            @Override
-            public boolean isTransportControlEnabled() {
-                return (mFlags & FLAG_HANDLES_TRANSPORT_CONTROLS) != 0;
-            }
-        }
-
-        private static final class Command {
-            public final String command;
-            public final Bundle extras;
-            public final ResultReceiver stub;
-
-            public Command(String command, Bundle extras, ResultReceiver stub) {
-                this.command = command;
-                this.extras = extras;
-                this.stub = stub;
-            }
-        }
-
-        private class MessageHandler extends Handler {
-
-            private static final int MSG_COMMAND = 1;
-            private static final int MSG_ADJUST_VOLUME = 2;
-            private static final int MSG_PREPARE = 3;
-            private static final int MSG_PREPARE_MEDIA_ID = 4;
-            private static final int MSG_PREPARE_SEARCH = 5;
-            private static final int MSG_PREPARE_URI = 6;
-            private static final int MSG_PLAY = 7;
-            private static final int MSG_PLAY_MEDIA_ID = 8;
-            private static final int MSG_PLAY_SEARCH = 9;
-            private static final int MSG_PLAY_URI = 10;
-            private static final int MSG_SKIP_TO_ITEM = 11;
-            private static final int MSG_PAUSE = 12;
-            private static final int MSG_STOP = 13;
-            private static final int MSG_NEXT = 14;
-            private static final int MSG_PREVIOUS = 15;
-            private static final int MSG_FAST_FORWARD = 16;
-            private static final int MSG_REWIND = 17;
-            private static final int MSG_SEEK_TO = 18;
-            private static final int MSG_RATE = 19;
-            private static final int MSG_CUSTOM_ACTION = 20;
-            private static final int MSG_MEDIA_BUTTON = 21;
-            private static final int MSG_SET_VOLUME = 22;
-
-            // KeyEvent constants only available on API 11+
-            private static final int KEYCODE_MEDIA_PAUSE = 127;
-            private static final int KEYCODE_MEDIA_PLAY = 126;
-
-            public MessageHandler(Looper looper) {
-                super(looper);
-            }
-
-            public void post(int what, Object obj, Bundle bundle) {
-                Message msg = obtainMessage(what, obj);
-                msg.setData(bundle);
-                msg.sendToTarget();
-            }
-
-            public void post(int what, Object obj) {
-                obtainMessage(what, obj).sendToTarget();
-            }
-
-            public void post(int what) {
-                post(what, null);
-            }
-
-            public void post(int what, Object obj, int arg1) {
-                obtainMessage(what, arg1, 0, obj).sendToTarget();
-            }
-
-            @Override
-            public void handleMessage(Message msg) {
-                MediaSessionCompat.Callback cb = mCallback;
-                if (cb == null) {
-                    return;
-                }
-                switch (msg.what) {
-                    case MSG_COMMAND:
-                        Command cmd = (Command) msg.obj;
-                        cb.onCommand(cmd.command, cmd.extras, cmd.stub);
-                        break;
-                    case MSG_MEDIA_BUTTON:
-                        KeyEvent keyEvent = (KeyEvent) msg.obj;
-                        Intent intent = new Intent(Intent.ACTION_MEDIA_BUTTON);
-                        intent.putExtra(Intent.EXTRA_KEY_EVENT, keyEvent);
-                        // Let the Callback handle events first before using the default behavior
-                        if (!cb.onMediaButtonEvent(intent)) {
-                            onMediaButtonEvent(keyEvent, cb);
-                        }
-                        break;
-                    case MSG_PREPARE:
-                        cb.onPrepare();
-                        break;
-                    case MSG_PREPARE_MEDIA_ID:
-                        cb.onPrepareFromMediaId((String) msg.obj, msg.getData());
-                        break;
-                    case MSG_PREPARE_SEARCH:
-                        cb.onPrepareFromSearch((String) msg.obj, msg.getData());
-                        break;
-                    case MSG_PREPARE_URI:
-                        cb.onPrepareFromUri((Uri) msg.obj, msg.getData());
-                        break;
-                    case MSG_PLAY:
-                        cb.onPlay();
-                        break;
-                    case MSG_PLAY_MEDIA_ID:
-                        cb.onPlayFromMediaId((String) msg.obj, msg.getData());
-                        break;
-                    case MSG_PLAY_SEARCH:
-                        cb.onPlayFromSearch((String) msg.obj, msg.getData());
-                        break;
-                    case MSG_PLAY_URI:
-                        cb.onPlayFromUri((Uri) msg.obj, msg.getData());
-                        break;
-                    case MSG_SKIP_TO_ITEM:
-                        cb.onSkipToQueueItem((Long) msg.obj);
-                        break;
-                    case MSG_PAUSE:
-                        cb.onPause();
-                        break;
-                    case MSG_STOP:
-                        cb.onStop();
-                        break;
-                    case MSG_NEXT:
-                        cb.onSkipToNext();
-                        break;
-                    case MSG_PREVIOUS:
-                        cb.onSkipToPrevious();
-                        break;
-                    case MSG_FAST_FORWARD:
-                        cb.onFastForward();
-                        break;
-                    case MSG_REWIND:
-                        cb.onRewind();
-                        break;
-                    case MSG_SEEK_TO:
-                        cb.onSeekTo((Long) msg.obj);
-                        break;
-                    case MSG_RATE:
-                        cb.onSetRating((RatingCompat) msg.obj);
-                        break;
-                    case MSG_CUSTOM_ACTION:
-                        cb.onCustomAction((String) msg.obj, msg.getData());
-                        break;
-                    case MSG_ADJUST_VOLUME:
-                        adjustVolume((int) msg.obj, 0);
-                        break;
-                    case MSG_SET_VOLUME:
-                        setVolumeTo((int) msg.obj, 0);
-                        break;
-                }
-            }
-
-            private void onMediaButtonEvent(KeyEvent ke, MediaSessionCompat.Callback cb) {
-                if (ke == null || ke.getAction() != KeyEvent.ACTION_DOWN) {
-                    return;
-                }
-                long validActions = mState == null ? 0 : mState.getActions();
-                switch (ke.getKeyCode()) {
-                    // Note KeyEvent.KEYCODE_MEDIA_PLAY is API 11+
-                    case KEYCODE_MEDIA_PLAY:
-                        if ((validActions & PlaybackStateCompat.ACTION_PLAY) != 0) {
-                            cb.onPlay();
-                        }
-                        break;
-                    // Note KeyEvent.KEYCODE_MEDIA_PAUSE is API 11+
-                    case KEYCODE_MEDIA_PAUSE:
-                        if ((validActions & PlaybackStateCompat.ACTION_PAUSE) != 0) {
-                            cb.onPause();
-                        }
-                        break;
-                    case KeyEvent.KEYCODE_MEDIA_NEXT:
-                        if ((validActions & PlaybackStateCompat.ACTION_SKIP_TO_NEXT) != 0) {
-                            cb.onSkipToNext();
-                        }
-                        break;
-                    case KeyEvent.KEYCODE_MEDIA_PREVIOUS:
-                        if ((validActions & PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS) != 0) {
-                            cb.onSkipToPrevious();
-                        }
-                        break;
-                    case KeyEvent.KEYCODE_MEDIA_STOP:
-                        if ((validActions & PlaybackStateCompat.ACTION_STOP) != 0) {
-                            cb.onStop();
-                        }
-                        break;
-                    case KeyEvent.KEYCODE_MEDIA_FAST_FORWARD:
-                        if ((validActions & PlaybackStateCompat.ACTION_FAST_FORWARD) != 0) {
-                            cb.onFastForward();
-                        }
-                        break;
-                    case KeyEvent.KEYCODE_MEDIA_REWIND:
-                        if ((validActions & PlaybackStateCompat.ACTION_REWIND) != 0) {
-                            cb.onRewind();
-                        }
-                        break;
-                    case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE:
-                    case KeyEvent.KEYCODE_HEADSETHOOK:
-                        boolean isPlaying = mState != null
-                                && mState.getState() == PlaybackStateCompat.STATE_PLAYING;
-                        boolean canPlay = (validActions & (PlaybackStateCompat.ACTION_PLAY_PAUSE
-                                | PlaybackStateCompat.ACTION_PLAY)) != 0;
-                        boolean canPause = (validActions & (PlaybackStateCompat.ACTION_PLAY_PAUSE
-                                | PlaybackStateCompat.ACTION_PAUSE)) != 0;
-                        if (isPlaying && canPause) {
-                            cb.onPause();
-                        } else if (!isPlaying && canPlay) {
-                            cb.onPlay();
-                        }
-                        break;
-                }
-            }
-        }
-    }
-
-    static class MediaSessionImplApi21 implements MediaSessionImpl {
-        private final Object mSessionObj;
-        private final Token mToken;
-
-        private PendingIntent mMediaButtonIntent;
-
-        public MediaSessionImplApi21(Context context, String tag) {
-            mSessionObj = MediaSessionCompatApi21.createSession(context, tag);
-            mToken = new Token(MediaSessionCompatApi21.getSessionToken(mSessionObj));
-        }
-
-        public MediaSessionImplApi21(Object mediaSession) {
-            mSessionObj = MediaSessionCompatApi21.verifySession(mediaSession);
-            mToken = new Token(MediaSessionCompatApi21.getSessionToken(mSessionObj));
-        }
-
-        @Override
-        public void setCallback(Callback callback, Handler handler) {
-            MediaSessionCompatApi21.setCallback(mSessionObj,
-                    callback == null ? null : callback.mCallbackObj, handler);
-        }
-
-        @Override
-        public void setFlags(@SessionFlags int flags) {
-            MediaSessionCompatApi21.setFlags(mSessionObj, flags);
-        }
-
-        @Override
-        public void setPlaybackToLocal(int stream) {
-            MediaSessionCompatApi21.setPlaybackToLocal(mSessionObj, stream);
-        }
-
-        @Override
-        public void setPlaybackToRemote(VolumeProviderCompat volumeProvider) {
-            MediaSessionCompatApi21.setPlaybackToRemote(mSessionObj,
-                    volumeProvider.getVolumeProvider());
-        }
-
-        @Override
-        public void setActive(boolean active) {
-            MediaSessionCompatApi21.setActive(mSessionObj, active);
-        }
-
-        @Override
-        public boolean isActive() {
-            return MediaSessionCompatApi21.isActive(mSessionObj);
-        }
-
-        @Override
-        public void sendSessionEvent(String event, Bundle extras) {
-            MediaSessionCompatApi21.sendSessionEvent(mSessionObj, event, extras);
-        }
-
-        @Override
-        public void release() {
-            MediaSessionCompatApi21.release(mSessionObj);
-        }
-
-        @Override
-        public Token getSessionToken() {
-            return mToken;
-        }
-
-        @Override
-        public void setPlaybackState(PlaybackStateCompat state) {
-            MediaSessionCompatApi21.setPlaybackState(mSessionObj,
-                    state == null ? null : state.getPlaybackState());
-        }
-
-        @Override
-        public void setMetadata(MediaMetadataCompat metadata) {
-            MediaSessionCompatApi21.setMetadata(mSessionObj,
-                    metadata == null ? null : metadata.getMediaMetadata());
-        }
-
-        @Override
-        public void setSessionActivity(PendingIntent pi) {
-            MediaSessionCompatApi21.setSessionActivity(mSessionObj, pi);
-        }
-
-        @Override
-        public void setMediaButtonReceiver(PendingIntent mbr) {
-            mMediaButtonIntent = mbr;
-            MediaSessionCompatApi21.setMediaButtonReceiver(mSessionObj, mbr);
-        }
-
-        @Override
-        public void setQueue(List<QueueItem> queue) {
-            List<Object> queueObjs = null;
-            if (queue != null) {
-                queueObjs = new ArrayList<>();
-                for (QueueItem item : queue) {
-                    queueObjs.add(item.getQueueItem());
-                }
-            }
-            MediaSessionCompatApi21.setQueue(mSessionObj, queueObjs);
-        }
-
-        @Override
-        public void setQueueTitle(CharSequence title) {
-            MediaSessionCompatApi21.setQueueTitle(mSessionObj, title);
-        }
-
-        @Override
-        public void setRatingType(@RatingCompat.Style int type) {
-            if (android.os.Build.VERSION.SDK_INT < 22) {
-                // TODO figure out 21 implementation
-            } else {
-                MediaSessionCompatApi22.setRatingType(mSessionObj, type);
-            }
-        }
-
-        @Override
-        public void setExtras(Bundle extras) {
-            MediaSessionCompatApi21.setExtras(mSessionObj, extras);
-        }
-
-        @Override
-        public Object getMediaSession() {
-            return mSessionObj;
-        }
-
-        @Override
-        public Object getRemoteControlClient() {
-            return null;
-        }
-
-        @Override
-        public String getCallingPackage() {
-            if (android.os.Build.VERSION.SDK_INT < 24) {
-                return null;
-            } else {
-                return MediaSessionCompatApi24.getCallingPackage(mSessionObj);
-            }
-        }
-    }
-}
diff --git a/v4/java/android/support/v4/net/ConnectivityManagerCompat.java b/v4/java/android/support/v4/net/ConnectivityManagerCompat.java
deleted file mode 100644
index 785a8f3..0000000
--- a/v4/java/android/support/v4/net/ConnectivityManagerCompat.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Copyright (C) 2012 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 android.support.v4.net;
-
-import static android.net.ConnectivityManager.TYPE_MOBILE;
-import static android.net.ConnectivityManager.TYPE_WIFI;
-
-import android.content.Intent;
-import android.net.ConnectivityManager;
-import android.net.NetworkInfo;
-import android.os.Build;
-
-/**
- * Helper for accessing features in {@link ConnectivityManager} introduced after
- * API level 16 in a backwards compatible fashion.
- */
-public final class ConnectivityManagerCompat {
-
-    interface ConnectivityManagerCompatImpl {
-        boolean isActiveNetworkMetered(ConnectivityManager cm);
-    }
-
-    static class BaseConnectivityManagerCompatImpl implements ConnectivityManagerCompatImpl {
-        @Override
-        public boolean isActiveNetworkMetered(ConnectivityManager cm) {
-            final NetworkInfo info = cm.getActiveNetworkInfo();
-            if (info == null) {
-                // err on side of caution
-                return true;
-            }
-
-            final int type = info.getType();
-            switch (type) {
-                case TYPE_MOBILE:
-                    return true;
-                case TYPE_WIFI:
-                    return false;
-                default:
-                    // err on side of caution
-                    return true;
-            }
-        }
-    }
-
-    static class GingerbreadConnectivityManagerCompatImpl implements ConnectivityManagerCompatImpl {
-        @Override
-        public boolean isActiveNetworkMetered(ConnectivityManager cm) {
-            return ConnectivityManagerCompatGingerbread.isActiveNetworkMetered(cm);
-        }
-    }
-
-    static class HoneycombMR2ConnectivityManagerCompatImpl
-            implements ConnectivityManagerCompatImpl {
-        @Override
-        public boolean isActiveNetworkMetered(ConnectivityManager cm) {
-            return ConnectivityManagerCompatHoneycombMR2.isActiveNetworkMetered(cm);
-        }
-    }
-
-    static class JellyBeanConnectivityManagerCompatImpl implements ConnectivityManagerCompatImpl {
-        @Override
-        public boolean isActiveNetworkMetered(ConnectivityManager cm) {
-            return ConnectivityManagerCompatJellyBean.isActiveNetworkMetered(cm);
-        }
-    }
-
-    private static final ConnectivityManagerCompatImpl IMPL;
-
-    static {
-        if (Build.VERSION.SDK_INT >= 16) {
-            IMPL = new JellyBeanConnectivityManagerCompatImpl();
-        } else if (Build.VERSION.SDK_INT >= 13) {
-            IMPL = new HoneycombMR2ConnectivityManagerCompatImpl();
-        } else if (Build.VERSION.SDK_INT >= 8) {
-            IMPL = new GingerbreadConnectivityManagerCompatImpl();
-        } else {
-            IMPL = new BaseConnectivityManagerCompatImpl();
-        }
-    }
-
-    /**
-     * Returns if the currently active data network is metered. A network is
-     * classified as metered when the user is sensitive to heavy data usage on
-     * that connection. You should check this before doing large data transfers,
-     * and warn the user or delay the operation until another network is
-     * available.
-     */
-    public static boolean isActiveNetworkMetered(ConnectivityManager cm) {
-        return IMPL.isActiveNetworkMetered(cm);
-    }
-
-    /**
-     * Return the {@link NetworkInfo} that caused the given
-     * {@link ConnectivityManager#CONNECTIVITY_ACTION} broadcast. This obtains
-     * the current state from {@link ConnectivityManager} instead of using the
-     * potentially-stale value from
-     * {@link ConnectivityManager#EXTRA_NETWORK_INFO}. May be {@code null}.
-     */
-    public static NetworkInfo getNetworkInfoFromBroadcast(ConnectivityManager cm, Intent intent) {
-        final NetworkInfo info = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
-        if (info != null) {
-            return cm.getNetworkInfo(info.getType());
-        } else {
-            return null;
-        }
-    }
-
-    private ConnectivityManagerCompat() {}
-}
diff --git a/v4/java/android/support/v4/os/ResultReceiver.java b/v4/java/android/support/v4/os/ResultReceiver.java
deleted file mode 100644
index f0dc001..0000000
--- a/v4/java/android/support/v4/os/ResultReceiver.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.v4.os;
-
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.os.RemoteException;
-import android.support.v4.os.IResultReceiver;
-
-/**
- * Generic interface for receiving a callback result from someone.  Use this
- * by creating a subclass and implement {@link #onReceiveResult}, which you can
- * then pass to others and send through IPC, and receive results they
- * supply with {@link #send}.
- *
- * <p>Note: the implementation underneath is just a simple wrapper around
- * a {@link Binder} that is used to perform the communication.  This means
- * semantically you should treat it as such: this class does not impact process
- * lifecycle management (you must be using some higher-level component to tell
- * the system that your process needs to continue running), the connection will
- * break if your process goes away for any reason, etc.</p>
- * @hide
- */
-public class ResultReceiver implements Parcelable {
-    final boolean mLocal;
-    final Handler mHandler;
-    
-    IResultReceiver mReceiver;
-    
-    class MyRunnable implements Runnable {
-        final int mResultCode;
-        final Bundle mResultData;
-        
-        MyRunnable(int resultCode, Bundle resultData) {
-            mResultCode = resultCode;
-            mResultData = resultData;
-        }
-        
-        public void run() {
-            onReceiveResult(mResultCode, mResultData);
-        }
-    }
-    
-    class MyResultReceiver extends IResultReceiver.Stub {
-        public void send(int resultCode, Bundle resultData) {
-            if (mHandler != null) {
-                mHandler.post(new MyRunnable(resultCode, resultData));
-            } else {
-                onReceiveResult(resultCode, resultData);
-            }
-        }
-    }
-    
-    /**
-     * Create a new ResultReceive to receive results.  Your
-     * {@link #onReceiveResult} method will be called from the thread running
-     * <var>handler</var> if given, or from an arbitrary thread if null.
-     */
-    public ResultReceiver(Handler handler) {
-        mLocal = true;
-        mHandler = handler;
-    }
-    
-    /**
-     * Deliver a result to this receiver.  Will call {@link #onReceiveResult},
-     * always asynchronously if the receiver has supplied a Handler in which
-     * to dispatch the result.
-     * @param resultCode Arbitrary result code to deliver, as defined by you.
-     * @param resultData Any additional data provided by you.
-     */
-    public void send(int resultCode, Bundle resultData) {
-        if (mLocal) {
-            if (mHandler != null) {
-                mHandler.post(new MyRunnable(resultCode, resultData));
-            } else {
-                onReceiveResult(resultCode, resultData);
-            }
-            return;
-        }
-        
-        if (mReceiver != null) {
-            try {
-                mReceiver.send(resultCode, resultData);
-            } catch (RemoteException e) {
-            }
-        }
-    }
-    
-    /**
-     * Override to receive results delivered to this object.
-     * 
-     * @param resultCode Arbitrary result code delivered by the sender, as
-     * defined by the sender.
-     * @param resultData Any additional data provided by the sender.
-     */
-    protected void onReceiveResult(int resultCode, Bundle resultData) {
-    }
-    
-    public int describeContents() {
-        return 0;
-    }
-
-    public void writeToParcel(Parcel out, int flags) {
-        synchronized (this) {
-            if (mReceiver == null) {
-                mReceiver = new MyResultReceiver();
-            }
-            out.writeStrongBinder(mReceiver.asBinder());
-        }
-    }
-
-    ResultReceiver(Parcel in) {
-        mLocal = false;
-        mHandler = null;
-        mReceiver = IResultReceiver.Stub.asInterface(in.readStrongBinder());
-    }
-    
-    public static final Parcelable.Creator<ResultReceiver> CREATOR
-            = new Parcelable.Creator<ResultReceiver>() {
-        public ResultReceiver createFromParcel(Parcel in) {
-            return new ResultReceiver(in);
-        }
-        public ResultReceiver[] newArray(int size) {
-            return new ResultReceiver[size];
-        }
-    };
-}
diff --git a/v4/java/android/support/v4/text/TextUtilsCompat.java b/v4/java/android/support/v4/text/TextUtilsCompat.java
deleted file mode 100644
index c8207e4..0000000
--- a/v4/java/android/support/v4/text/TextUtilsCompat.java
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.support.v4.text;
-
-import android.os.Build;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.v4.view.ViewCompat;
-
-import java.util.Locale;
-
-public final class TextUtilsCompat {
-    private static class TextUtilsCompatImpl {
-        @NonNull
-        public String htmlEncode(@NonNull String s) {
-            StringBuilder sb = new StringBuilder();
-            char c;
-            for (int i = 0; i < s.length(); i++) {
-                c = s.charAt(i);
-                switch (c) {
-                    case '<':
-                        sb.append("&lt;"); //$NON-NLS-1$
-                        break;
-                    case '>':
-                        sb.append("&gt;"); //$NON-NLS-1$
-                        break;
-                    case '&':
-                        sb.append("&amp;"); //$NON-NLS-1$
-                        break;
-                    case '\'':
-                        //http://www.w3.org/TR/xhtml1
-                        // The named character reference &apos; (the apostrophe, U+0027) was
-                        // introduced in XML 1.0 but does not appear in HTML. Authors should
-                        // therefore use &#39; instead of &apos; to work as expected in HTML 4
-                        // user agents.
-                        sb.append("&#39;"); //$NON-NLS-1$
-                        break;
-                    case '"':
-                        sb.append("&quot;"); //$NON-NLS-1$
-                        break;
-                    default:
-                        sb.append(c);
-                }
-            }
-            return sb.toString();
-        }
-
-        public int getLayoutDirectionFromLocale(@Nullable Locale locale) {
-            if (locale != null && !locale.equals(ROOT)) {
-                final String scriptSubtag = ICUCompat.maximizeAndGetScript(locale);
-                if (scriptSubtag == null) return getLayoutDirectionFromFirstChar(locale);
-
-                if (scriptSubtag.equalsIgnoreCase(ARAB_SCRIPT_SUBTAG) ||
-                        scriptSubtag.equalsIgnoreCase(HEBR_SCRIPT_SUBTAG)) {
-                    return ViewCompat.LAYOUT_DIRECTION_RTL;
-                }
-            }
-            return ViewCompat.LAYOUT_DIRECTION_LTR;
-        }
-
-        /**
-         * Fallback algorithm to detect the locale direction. Rely on the first char of the
-         * localized locale name. This will not work if the localized locale name is in English
-         * (this is the case for ICU 4.4 and "Urdu" script)
-         *
-         * @param locale
-         * @return the layout direction. This may be one of:
-         * {@link ViewCompat#LAYOUT_DIRECTION_LTR} or
-         * {@link ViewCompat#LAYOUT_DIRECTION_RTL}.
-         *
-         * Be careful: this code will need to be updated when vertical scripts will be supported
-         */
-        private static int getLayoutDirectionFromFirstChar(@NonNull Locale locale) {
-            switch(Character.getDirectionality(locale.getDisplayName(locale).charAt(0))) {
-                case Character.DIRECTIONALITY_RIGHT_TO_LEFT:
-                case Character.DIRECTIONALITY_RIGHT_TO_LEFT_ARABIC:
-                    return ViewCompat.LAYOUT_DIRECTION_RTL;
-
-                case Character.DIRECTIONALITY_LEFT_TO_RIGHT:
-                default:
-                    return ViewCompat.LAYOUT_DIRECTION_LTR;
-            }
-        }
-    }
-
-    private static class TextUtilsCompatJellybeanMr1Impl extends TextUtilsCompatImpl {
-        @NonNull
-        public String htmlEncode(@NonNull String s) {
-            return TextUtilsCompatJellybeanMr1.htmlEncode(s);
-        }
-
-        @Override
-        public int getLayoutDirectionFromLocale(@Nullable Locale locale) {
-            return TextUtilsCompatJellybeanMr1.getLayoutDirectionFromLocale(locale);
-        }
-    }
-
-    private static final TextUtilsCompatImpl IMPL;
-    static {
-        final int version = Build.VERSION.SDK_INT;
-        if (version >= 17) { // JellyBean MR1
-            IMPL = new TextUtilsCompatJellybeanMr1Impl();
-        } else {
-            IMPL = new TextUtilsCompatImpl();
-        }
-    }
-
-    /**
-     * Html-encode the string.
-     * @param s the string to be encoded
-     * @return the encoded string
-     */
-    @NonNull
-    public static String htmlEncode(@NonNull String s) {
-        return IMPL.htmlEncode(s);
-    }
-
-    /**
-     * Return the layout direction for a given Locale
-     *
-     * @param locale the Locale for which we want the layout direction. Can be null.
-     * @return the layout direction. This may be one of:
-     * {@link ViewCompat#LAYOUT_DIRECTION_LTR} or
-     * {@link ViewCompat#LAYOUT_DIRECTION_RTL}.
-     *
-     * Be careful: this code will need to be updated when vertical scripts will be supported
-     */
-    public static int getLayoutDirectionFromLocale(@Nullable Locale locale) {
-        return IMPL.getLayoutDirectionFromLocale(locale);
-    }
-
-    public static final Locale ROOT = new Locale("", "");
-
-    private static String ARAB_SCRIPT_SUBTAG = "Arab";
-    private static String HEBR_SCRIPT_SUBTAG = "Hebr";
-
-    private TextUtilsCompat() {}
-}
diff --git a/v4/java/android/support/v4/util/Pools.java b/v4/java/android/support/v4/util/Pools.java
deleted file mode 100644
index e3907a1..0000000
--- a/v4/java/android/support/v4/util/Pools.java
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-package android.support.v4.util;
-
-
-/**
- * Helper class for crating pools of objects. An example use looks like this:
- * <pre>
- * public class MyPooledClass {
- *
- *     private static final SynchronizedPool<MyPooledClass> sPool =
- *             new SynchronizedPool<MyPooledClass>(10);
- *
- *     public static MyPooledClass obtain() {
- *         MyPooledClass instance = sPool.acquire();
- *         return (instance != null) ? instance : new MyPooledClass();
- *     }
- *
- *     public void recycle() {
- *          // Clear state if needed.
- *          sPool.release(this);
- *     }
- *
- *     . . .
- * }
- * </pre>
- *
- */
-public final class Pools {
-
-    /**
-     * Interface for managing a pool of objects.
-     *
-     * @param <T> The pooled type.
-     */
-    public static interface Pool<T> {
-
-        /**
-         * @return An instance from the pool if such, null otherwise.
-         */
-        public T acquire();
-
-        /**
-         * Release an instance to the pool.
-         *
-         * @param instance The instance to release.
-         * @return Whether the instance was put in the pool.
-         *
-         * @throws IllegalStateException If the instance is already in the pool.
-         */
-        public boolean release(T instance);
-    }
-
-    private Pools() {
-        /* do nothing - hiding constructor */
-    }
-
-    /**
-     * Simple (non-synchronized) pool of objects.
-     *
-     * @param <T> The pooled type.
-     */
-    public static class SimplePool<T> implements Pool<T> {
-        private final Object[] mPool;
-
-        private int mPoolSize;
-
-        /**
-         * Creates a new instance.
-         *
-         * @param maxPoolSize The max pool size.
-         *
-         * @throws IllegalArgumentException If the max pool size is less than zero.
-         */
-        public SimplePool(int maxPoolSize) {
-            if (maxPoolSize <= 0) {
-                throw new IllegalArgumentException("The max pool size must be > 0");
-            }
-            mPool = new Object[maxPoolSize];
-        }
-
-        @Override
-        @SuppressWarnings("unchecked")
-        public T acquire() {
-            if (mPoolSize > 0) {
-                final int lastPooledIndex = mPoolSize - 1;
-                T instance = (T) mPool[lastPooledIndex];
-                mPool[lastPooledIndex] = null;
-                mPoolSize--;
-                return instance;
-            }
-            return null;
-        }
-
-        @Override
-        public boolean release(T instance) {
-            if (isInPool(instance)) {
-                throw new IllegalStateException("Already in the pool!");
-            }
-            if (mPoolSize < mPool.length) {
-                mPool[mPoolSize] = instance;
-                mPoolSize++;
-                return true;
-            }
-            return false;
-        }
-
-        private boolean isInPool(T instance) {
-            for (int i = 0; i < mPoolSize; i++) {
-                if (mPool[i] == instance) {
-                    return true;
-                }
-            }
-            return false;
-        }
-    }
-
-    /**
-     * Synchronized) pool of objects.
-     *
-     * @param <T> The pooled type.
-     */
-    public static class SynchronizedPool<T> extends SimplePool<T> {
-        private final Object mLock = new Object();
-
-        /**
-         * Creates a new instance.
-         *
-         * @param maxPoolSize The max pool size.
-         *
-         * @throws IllegalArgumentException If the max pool size is less than zero.
-         */
-        public SynchronizedPool(int maxPoolSize) {
-            super(maxPoolSize);
-        }
-
-        @Override
-        public T acquire() {
-            synchronized (mLock) {
-                return super.acquire();
-            }
-        }
-
-        @Override
-        public boolean release(T element) {
-            synchronized (mLock) {
-                return super.release(element);
-            }
-        }
-    }
-}
diff --git a/v4/java/android/support/v4/view/AbsSavedState.java b/v4/java/android/support/v4/view/AbsSavedState.java
deleted file mode 100644
index e5aba09..0000000
--- a/v4/java/android/support/v4/view/AbsSavedState.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright (C) 2016 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 android.support.v4.view;
-
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.support.v4.os.ParcelableCompat;
-import android.support.v4.os.ParcelableCompatCreatorCallbacks;
-
-/**
- * A {@link Parcelable} implementation that should be used by inheritance
- * hierarchies to ensure the state of all classes along the chain is saved.
- */
-public abstract class AbsSavedState implements Parcelable {
-    public static final AbsSavedState EMPTY_STATE = new AbsSavedState() {};
-
-    private final Parcelable mSuperState;
-
-    /**
-     * Constructor used to make the EMPTY_STATE singleton
-     */
-    private AbsSavedState() {
-        mSuperState = null;
-    }
-
-    /**
-     * Constructor called by derived classes when creating their SavedState objects
-     *
-     * @param superState The state of the superclass of this view
-     */
-    protected AbsSavedState(Parcelable superState) {
-        if (superState == null) {
-            throw new IllegalArgumentException("superState must not be null");
-        }
-        mSuperState = superState != EMPTY_STATE ? superState : null;
-    }
-
-    /**
-     * Constructor used when reading from a parcel. Reads the state of the superclass.
-     *
-     * @param source parcel to read from
-     */
-    protected AbsSavedState(Parcel source) {
-        this(source, null);
-    }
-
-    /**
-     * Constructor used when reading from a parcel. Reads the state of the superclass.
-     *
-     * @param source parcel to read from
-     * @param loader ClassLoader to use for reading
-     */
-    protected AbsSavedState(Parcel source, ClassLoader loader) {
-        Parcelable superState = source.readParcelable(loader);
-        mSuperState = superState != null ? superState : EMPTY_STATE;
-    }
-
-    final public Parcelable getSuperState() {
-        return mSuperState;
-    }
-
-    public int describeContents() {
-        return 0;
-    }
-
-    public void writeToParcel(Parcel dest, int flags) {
-        dest.writeParcelable(mSuperState, flags);
-    }
-
-    public static final Parcelable.Creator<AbsSavedState> CREATOR
-            = ParcelableCompat.newCreator(new ParcelableCompatCreatorCallbacks<AbsSavedState>() {
-        @Override
-        public AbsSavedState createFromParcel(Parcel in, ClassLoader loader) {
-            Parcelable superState = in.readParcelable(loader);
-            if (superState != null) {
-                throw new IllegalStateException("superState must be null");
-            }
-            return EMPTY_STATE;
-        }
-
-        @Override
-        public AbsSavedState[] newArray(int size) {
-            return new AbsSavedState[size];
-        }
-    });
-}
diff --git a/v4/java/android/support/v4/view/AccessibilityDelegateCompat.java b/v4/java/android/support/v4/view/AccessibilityDelegateCompat.java
deleted file mode 100644
index 4d0281e..0000000
--- a/v4/java/android/support/v4/view/AccessibilityDelegateCompat.java
+++ /dev/null
@@ -1,514 +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 android.support.v4.view;
-
-import android.os.Build;
-import android.os.Bundle;
-import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat;
-import android.support.v4.view.accessibility.AccessibilityNodeProviderCompat;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.accessibility.AccessibilityEvent;
-
-/**
- * Helper for accessing {@link View.AccessibilityDelegate} introduced after
- * API level 4 in a backwards compatible fashion.
- * <p>
- * <strong>Note:</strong> On platform versions prior to
- * {@link android.os.Build.VERSION_CODES#M API 23}, delegate methods on
- * views in the {@code android.widget.*} package are called <i>before</i>
- * host methods. This prevents certain properties such as class name from
- * being modified by overriding
- * {@link AccessibilityDelegateCompat#onInitializeAccessibilityNodeInfo(View, AccessibilityNodeInfoCompat)},
- * as any changes will be overwritten by the host class.
- * <p>
- * Starting in {@link android.os.Build.VERSION_CODES#M API 23}, delegate
- * methods are called <i>after</i> host methods, which all properties to be
- * modified without being overwritten by the host class.
- */
-public class AccessibilityDelegateCompat {
-
-    static interface AccessibilityDelegateImpl {
-        public Object newAccessiblityDelegateDefaultImpl();
-        public Object newAccessiblityDelegateBridge(AccessibilityDelegateCompat listener);
-        public boolean dispatchPopulateAccessibilityEvent(Object delegate, View host,
-                AccessibilityEvent event);
-        public void onInitializeAccessibilityEvent(Object delegate, View host,
-                AccessibilityEvent event);
-        public void onInitializeAccessibilityNodeInfo(Object delegate, View host,
-                AccessibilityNodeInfoCompat info);
-        public void onPopulateAccessibilityEvent(Object delegate, View host,
-                AccessibilityEvent event);
-        public boolean onRequestSendAccessibilityEvent(Object delegate, ViewGroup host, View child,
-                AccessibilityEvent event);
-        public void sendAccessibilityEvent(Object delegate, View host, int eventType);
-        public void sendAccessibilityEventUnchecked(Object delegate, View host,
-                AccessibilityEvent event);
-        public AccessibilityNodeProviderCompat getAccessibilityNodeProvider(Object delegate,
-                View host);
-        public boolean performAccessibilityAction(Object delegate, View host, int action,
-                Bundle args);
-    }
-
-    static class AccessibilityDelegateStubImpl implements AccessibilityDelegateImpl {
-        public Object newAccessiblityDelegateDefaultImpl() {
-            return null;
-        }
-
-        @Override
-        public Object newAccessiblityDelegateBridge(AccessibilityDelegateCompat listener) {
-            return null;
-        }
-
-        @Override
-        public boolean dispatchPopulateAccessibilityEvent(Object delegate, View host,
-                AccessibilityEvent event) {
-            return false;
-        }
-
-        @Override
-        public void onInitializeAccessibilityEvent(Object delegate, View host,
-                AccessibilityEvent event) {
-
-        }
-
-        @Override
-        public void onInitializeAccessibilityNodeInfo(Object delegate, View host,
-                AccessibilityNodeInfoCompat info) {
-
-        }
-
-        @Override
-        public void onPopulateAccessibilityEvent(Object delegate, View host,
-                AccessibilityEvent event) {
-
-        }
-
-        @Override
-        public boolean onRequestSendAccessibilityEvent(Object delegate, ViewGroup host, View child,
-                AccessibilityEvent event) {
-            return true;
-        }
-
-        @Override
-        public void sendAccessibilityEvent(Object delegate, View host, int eventType) {
-
-        }
-
-        @Override
-        public void sendAccessibilityEventUnchecked(Object delegate, View host,
-                AccessibilityEvent event) {
-
-        }
-
-        @Override
-        public AccessibilityNodeProviderCompat getAccessibilityNodeProvider(Object delegate,
-                View host) {
-            return null;
-        }
-
-        @Override
-        public boolean performAccessibilityAction(Object delegate, View host, int action,
-                Bundle args) {
-            return false;
-        }
-    }
-
-    static class AccessibilityDelegateIcsImpl extends AccessibilityDelegateStubImpl {
-        @Override
-        public Object newAccessiblityDelegateDefaultImpl() {
-            return AccessibilityDelegateCompatIcs.newAccessibilityDelegateDefaultImpl();
-        }
-
-        @Override
-        public Object newAccessiblityDelegateBridge(final AccessibilityDelegateCompat compat) {
-            return AccessibilityDelegateCompatIcs.newAccessibilityDelegateBridge(
-                    new AccessibilityDelegateCompatIcs.AccessibilityDelegateBridge() {
-                @Override
-                public boolean dispatchPopulateAccessibilityEvent(View host,
-                        AccessibilityEvent event) {
-                    return compat.dispatchPopulateAccessibilityEvent(host, event);
-                }
-
-                @Override
-                public void onInitializeAccessibilityEvent(View host, AccessibilityEvent event) {
-                    compat.onInitializeAccessibilityEvent(host, event);
-                }
-
-                @Override
-                public void onInitializeAccessibilityNodeInfo(View host, Object info) {
-                    compat.onInitializeAccessibilityNodeInfo(host,
-                            new AccessibilityNodeInfoCompat(info));
-                }
-
-                @Override
-                public void onPopulateAccessibilityEvent(View host, AccessibilityEvent event) {
-                    compat.onPopulateAccessibilityEvent(host, event);
-                }
-
-                @Override
-                public boolean onRequestSendAccessibilityEvent(ViewGroup host, View child,
-                        AccessibilityEvent event) {
-                    return compat.onRequestSendAccessibilityEvent(host, child, event);
-                }
-
-                @Override
-                public void sendAccessibilityEvent(View host, int eventType) {
-                    compat.sendAccessibilityEvent(host, eventType);
-                }
-
-                @Override
-                public void sendAccessibilityEventUnchecked(View host, AccessibilityEvent event) {
-                    compat.sendAccessibilityEventUnchecked(host, event);
-                }
-            });
-        }
-
-        @Override
-        public boolean dispatchPopulateAccessibilityEvent(Object delegate, View host,
-                AccessibilityEvent event) {
-            return AccessibilityDelegateCompatIcs.dispatchPopulateAccessibilityEvent(delegate,
-                    host, event);
-        }
-
-        @Override
-        public void onInitializeAccessibilityEvent(Object delegate, View host,
-                AccessibilityEvent event) {
-            AccessibilityDelegateCompatIcs.onInitializeAccessibilityEvent(delegate, host, event);
-        }
-
-        @Override
-        public void onInitializeAccessibilityNodeInfo(Object delegate, View host,
-                AccessibilityNodeInfoCompat info) {
-            AccessibilityDelegateCompatIcs.onInitializeAccessibilityNodeInfo(delegate, host,
-                    info.getInfo());
-        }
-
-        @Override
-        public void onPopulateAccessibilityEvent(Object delegate, View host,
-                AccessibilityEvent event) {
-            AccessibilityDelegateCompatIcs.onPopulateAccessibilityEvent(delegate, host, event);
-        }
-
-        @Override
-        public boolean onRequestSendAccessibilityEvent(Object delegate, ViewGroup host, View child,
-                AccessibilityEvent event) {
-            return AccessibilityDelegateCompatIcs.onRequestSendAccessibilityEvent(delegate, host,
-                    child, event);
-        }
-
-        @Override
-        public void sendAccessibilityEvent(Object delegate, View host, int eventType) {
-            AccessibilityDelegateCompatIcs.sendAccessibilityEvent(delegate, host, eventType);
-        }
-
-        @Override
-        public void sendAccessibilityEventUnchecked(Object delegate, View host,
-                AccessibilityEvent event) {
-            AccessibilityDelegateCompatIcs.sendAccessibilityEventUnchecked(delegate, host, event);
-        }
-    }
-
-    static class AccessibilityDelegateJellyBeanImpl extends AccessibilityDelegateIcsImpl {
-        @Override
-        public Object newAccessiblityDelegateBridge(final AccessibilityDelegateCompat compat) {
-            return AccessibilityDelegateCompatJellyBean.newAccessibilityDelegateBridge(
-                    new AccessibilityDelegateCompatJellyBean
-                            .AccessibilityDelegateBridgeJellyBean() {
-                @Override
-                public boolean dispatchPopulateAccessibilityEvent(View host,
-                        AccessibilityEvent event) {
-                    return compat.dispatchPopulateAccessibilityEvent(host, event);
-                }
-
-                @Override
-                public void onInitializeAccessibilityEvent(View host, AccessibilityEvent event) {
-                    compat.onInitializeAccessibilityEvent(host, event);
-                }
-
-                @Override
-                public void onInitializeAccessibilityNodeInfo(View host, Object info) {
-                    compat.onInitializeAccessibilityNodeInfo(host,
-                            new AccessibilityNodeInfoCompat(info));
-                }
-
-                @Override
-                public void onPopulateAccessibilityEvent(View host, AccessibilityEvent event) {
-                    compat.onPopulateAccessibilityEvent(host, event);
-                }
-
-                @Override
-                public boolean onRequestSendAccessibilityEvent(ViewGroup host, View child,
-                        AccessibilityEvent event) {
-                    return compat.onRequestSendAccessibilityEvent(host, child, event);
-                }
-
-                @Override
-                public void sendAccessibilityEvent(View host, int eventType) {
-                    compat.sendAccessibilityEvent(host, eventType);
-                }
-
-                @Override
-                public void sendAccessibilityEventUnchecked(View host, AccessibilityEvent event) {
-                    compat.sendAccessibilityEventUnchecked(host, event);
-                }
-
-                @Override
-                public Object getAccessibilityNodeProvider(View host) {
-                    AccessibilityNodeProviderCompat provider =
-                        compat.getAccessibilityNodeProvider(host);
-                    return (provider != null) ? provider.getProvider() : null;
-                }
-
-                @Override
-                public boolean performAccessibilityAction(View host, int action, Bundle args) {
-                    return compat.performAccessibilityAction(host, action, args);
-                }
-            });
-        }
-
-        @Override
-        public AccessibilityNodeProviderCompat getAccessibilityNodeProvider(Object delegate,
-                View host) {
-            Object provider = AccessibilityDelegateCompatJellyBean.getAccessibilityNodeProvider(
-                    delegate, host);
-            if (provider != null) {
-                return new AccessibilityNodeProviderCompat(provider);
-            }
-            return null;
-        }
-
-        @Override
-        public boolean performAccessibilityAction(Object delegate, View host, int action,
-                Bundle args) {
-            return AccessibilityDelegateCompatJellyBean.performAccessibilityAction(delegate,
-                    host, action, args);
-        }
-    }
-
-    private static final AccessibilityDelegateImpl IMPL;
-    private static final Object DEFAULT_DELEGATE;
-
-    static {
-        if (Build.VERSION.SDK_INT >= 16) { // JellyBean
-            IMPL = new AccessibilityDelegateJellyBeanImpl();
-        } else if (Build.VERSION.SDK_INT >= 14) { // ICS
-            IMPL = new AccessibilityDelegateIcsImpl();
-        } else {
-            IMPL = new AccessibilityDelegateStubImpl();
-        }
-        DEFAULT_DELEGATE = IMPL.newAccessiblityDelegateDefaultImpl();
-    }
-
-    final Object mBridge;
-
-    /**
-     * Creates a new instance.
-     */
-    public AccessibilityDelegateCompat() {
-        mBridge = IMPL.newAccessiblityDelegateBridge(this);
-    }
-
-    /**
-     * @return The wrapped bridge implementation.
-     */
-    Object getBridge() {
-        return mBridge;
-    }
-
-    /**
-     * Sends an accessibility event of the given type. If accessibility is not
-     * enabled this method has no effect.
-     * <p>
-     * The default implementation behaves as {@link View#sendAccessibilityEvent(int)
-     * View#sendAccessibilityEvent(int)} for the case of no accessibility delegate
-     * been set.
-     * </p>
-     *
-     * @param host The View hosting the delegate.
-     * @param eventType The type of the event to send.
-     *
-     * @see View#sendAccessibilityEvent(int) View#sendAccessibilityEvent(int)
-     */
-    public void sendAccessibilityEvent(View host, int eventType) {
-        IMPL.sendAccessibilityEvent(DEFAULT_DELEGATE, host, eventType);
-    }
-
-    /**
-     * Sends an accessibility event. This method behaves exactly as
-     * {@link #sendAccessibilityEvent(View, int)} but takes as an argument an
-     * empty {@link AccessibilityEvent} and does not perform a check whether
-     * accessibility is enabled.
-     * <p>
-     * The default implementation behaves as
-     * {@link View#sendAccessibilityEventUnchecked(AccessibilityEvent)
-     * View#sendAccessibilityEventUnchecked(AccessibilityEvent)} for
-     * the case of no accessibility delegate been set.
-     * </p>
-     *
-     * @param host The View hosting the delegate.
-     * @param event The event to send.
-     *
-     * @see View#sendAccessibilityEventUnchecked(AccessibilityEvent)
-     *      View#sendAccessibilityEventUnchecked(AccessibilityEvent)
-     */
-    public void sendAccessibilityEventUnchecked(View host, AccessibilityEvent event) {
-        IMPL.sendAccessibilityEventUnchecked(DEFAULT_DELEGATE, host, event);
-    }
-
-    /**
-     * Dispatches an {@link AccessibilityEvent} to the host {@link View} first and then
-     * to its children for adding their text content to the event.
-     * <p>
-     * The default implementation behaves as
-     * {@link View#dispatchPopulateAccessibilityEvent(AccessibilityEvent)
-     * View#dispatchPopulateAccessibilityEvent(AccessibilityEvent)} for
-     * the case of no accessibility delegate been set.
-     * </p>
-     *
-     * @param host The View hosting the delegate.
-     * @param event The event.
-     * @return True if the event population was completed.
-     *
-     * @see View#dispatchPopulateAccessibilityEvent(AccessibilityEvent)
-     *      View#dispatchPopulateAccessibilityEvent(AccessibilityEvent)
-     */
-    public boolean dispatchPopulateAccessibilityEvent(View host, AccessibilityEvent event) {
-        return IMPL.dispatchPopulateAccessibilityEvent(DEFAULT_DELEGATE, host, event);
-    }
-
-    /**
-     * Gives a chance to the host View to populate the accessibility event with its
-     * text content.
-     * <p>
-     * The default implementation behaves as
-     * {@link ViewCompat#onPopulateAccessibilityEvent(View, AccessibilityEvent)
-     * ViewCompat#onPopulateAccessibilityEvent(AccessibilityEvent)} for
-     * the case of no accessibility delegate been set.
-     * </p>
-     *
-     * @param host The View hosting the delegate.
-     * @param event The accessibility event which to populate.
-     *
-     * @see ViewCompat#onPopulateAccessibilityEvent(View ,AccessibilityEvent)
-     *      ViewCompat#onPopulateAccessibilityEvent(View, AccessibilityEvent)
-     */
-    public void onPopulateAccessibilityEvent(View host, AccessibilityEvent event) {
-        IMPL.onPopulateAccessibilityEvent(DEFAULT_DELEGATE, host, event);
-    }
-
-    /**
-     * Initializes an {@link AccessibilityEvent} with information about the
-     * the host View which is the event source.
-     * <p>
-     * The default implementation behaves as
-     * {@link ViewCompat#onInitializeAccessibilityEvent(View v, AccessibilityEvent event)
-     * ViewCompat#onInitalizeAccessibilityEvent(View v, AccessibilityEvent event)} for
-     * the case of no accessibility delegate been set.
-     * </p>
-     *
-     * @param host The View hosting the delegate.
-     * @param event The event to initialize.
-     *
-     * @see ViewCompat#onInitializeAccessibilityEvent(View, AccessibilityEvent)
-     *      ViewCompat#onInitializeAccessibilityEvent(View, AccessibilityEvent)
-     */
-    public void onInitializeAccessibilityEvent(View host, AccessibilityEvent event) {
-        IMPL.onInitializeAccessibilityEvent(DEFAULT_DELEGATE, host, event);
-    }
-
-    /**
-     * Initializes an {@link AccessibilityNodeInfoCompat} with information about the host view.
-     * <p>
-     * The default implementation behaves as
-     * {@link ViewCompat#onInitializeAccessibilityNodeInfo(View, AccessibilityNodeInfoCompat)
-     * ViewCompat#onInitializeAccessibilityNodeInfo(View, AccessibilityNodeInfoCompat)} for
-     * the case of no accessibility delegate been set.
-     * </p>
-     *
-     * @param host The View hosting the delegate.
-     * @param info The instance to initialize.
-     *
-     * @see ViewCompat#onInitializeAccessibilityNodeInfo(View, AccessibilityNodeInfoCompat)
-     *      ViewCompat#onInitializeAccessibilityNodeInfo(View, AccessibilityNodeInfoCompat)
-     */
-    public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfoCompat info) {
-        IMPL.onInitializeAccessibilityNodeInfo(DEFAULT_DELEGATE, host, info);
-    }
-
-    /**
-     * Called when a child of the host View has requested sending an
-     * {@link AccessibilityEvent} and gives an opportunity to the parent (the host)
-     * to augment the event.
-     * <p>
-     * The default implementation behaves as
-     * {@link ViewGroupCompat#onRequestSendAccessibilityEvent(ViewGroup, View, AccessibilityEvent)
-     * ViewGroupCompat#onRequestSendAccessibilityEvent(ViewGroup, View, AccessibilityEvent)} for
-     * the case of no accessibility delegate been set.
-     * </p>
-     *
-     * @param host The View hosting the delegate.
-     * @param child The child which requests sending the event.
-     * @param event The event to be sent.
-     * @return True if the event should be sent
-     *
-     * @see ViewGroupCompat#onRequestSendAccessibilityEvent(ViewGroup, View, AccessibilityEvent)
-     *      ViewGroupCompat#onRequestSendAccessibilityEvent(ViewGroup, View, AccessibilityEvent)
-     */
-    public boolean onRequestSendAccessibilityEvent(ViewGroup host, View child,
-            AccessibilityEvent event) {
-        return IMPL.onRequestSendAccessibilityEvent(DEFAULT_DELEGATE, host, child, event);
-    }
-
-    /**
-     * Gets the provider for managing a virtual view hierarchy rooted at this View
-     * and reported to {@link android.accessibilityservice.AccessibilityService}s
-     * that explore the window content.
-     * <p>
-     * The default implementation behaves as
-     * {@link ViewCompat#getAccessibilityNodeProvider(View) ViewCompat#getAccessibilityNodeProvider(View)}
-     * for the case of no accessibility delegate been set.
-     * </p>
-     *
-     * @return The provider.
-     *
-     * @see AccessibilityNodeProviderCompat
-     */
-    public AccessibilityNodeProviderCompat getAccessibilityNodeProvider(View host) {
-        return IMPL.getAccessibilityNodeProvider(DEFAULT_DELEGATE, host);
-    }
-
-    /**
-     * Performs the specified accessibility action on the view. For
-     * possible accessibility actions look at {@link AccessibilityNodeInfoCompat}.
-     * <p>
-     * The default implementation behaves as
-     * {@link View#performAccessibilityAction(int, Bundle)
-     *  View#performAccessibilityAction(int, Bundle)} for the case of
-     *  no accessibility delegate been set.
-     * </p>
-     *
-     * @param action The action to perform.
-     * @return Whether the action was performed.
-     *
-     * @see View#performAccessibilityAction(int, Bundle)
-     *      View#performAccessibilityAction(int, Bundle)
-     */
-    public boolean performAccessibilityAction(View host, int action, Bundle args) {
-        return IMPL.performAccessibilityAction(DEFAULT_DELEGATE, host, action, args);
-    }
-}
diff --git a/v4/java/android/support/v4/view/GestureDetectorCompat.java b/v4/java/android/support/v4/view/GestureDetectorCompat.java
deleted file mode 100644
index 9d9ddb9..0000000
--- a/v4/java/android/support/v4/view/GestureDetectorCompat.java
+++ /dev/null
@@ -1,564 +0,0 @@
-/*
- * Copyright (C) 2012 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 android.support.v4.view;
-
-import android.content.Context;
-import android.os.Build;
-import android.os.Handler;
-import android.os.Message;
-import android.view.GestureDetector;
-import android.view.GestureDetector.OnDoubleTapListener;
-import android.view.GestureDetector.OnGestureListener;
-import android.view.MotionEvent;
-import android.view.VelocityTracker;
-import android.view.View;
-import android.view.ViewConfiguration;
-
-/**
- * Detects various gestures and events using the supplied {@link MotionEvent}s.
- * The {@link OnGestureListener} callback will notify users when a particular
- * motion event has occurred. This class should only be used with {@link MotionEvent}s
- * reported via touch (don't use for trackball events).
- *
- * <p>This compatibility implementation of the framework's GestureDetector guarantees
- * the newer focal point scrolling behavior from Jellybean MR1 on all platform versions.</p>
- *
- * To use this class:
- * <ul>
- *  <li>Create an instance of the {@code GestureDetectorCompat} for your {@link View}
- *  <li>In the {@link View#onTouchEvent(MotionEvent)} method ensure you call
- *          {@link #onTouchEvent(MotionEvent)}. The methods defined in your callback
- *          will be executed when the events occur.
- * </ul>
- */
-public final class GestureDetectorCompat {
-    interface GestureDetectorCompatImpl {
-        boolean isLongpressEnabled();
-        boolean onTouchEvent(MotionEvent ev);
-        void setIsLongpressEnabled(boolean enabled);
-        void setOnDoubleTapListener(OnDoubleTapListener listener);
-    }
-
-    static class GestureDetectorCompatImplBase implements GestureDetectorCompatImpl {
-        private int mTouchSlopSquare;
-        private int mDoubleTapSlopSquare;
-        private int mMinimumFlingVelocity;
-        private int mMaximumFlingVelocity;
-
-        private static final int LONGPRESS_TIMEOUT = ViewConfiguration.getLongPressTimeout();
-        private static final int TAP_TIMEOUT = ViewConfiguration.getTapTimeout();
-        private static final int DOUBLE_TAP_TIMEOUT = ViewConfiguration.getDoubleTapTimeout();
-
-        // constants for Message.what used by GestureHandler below
-        private static final int SHOW_PRESS = 1;
-        private static final int LONG_PRESS = 2;
-        private static final int TAP = 3;
-
-        private final Handler mHandler;
-        private final OnGestureListener mListener;
-        private OnDoubleTapListener mDoubleTapListener;
-
-        private boolean mStillDown;
-        private boolean mDeferConfirmSingleTap;
-        private boolean mInLongPress;
-        private boolean mAlwaysInTapRegion;
-        private boolean mAlwaysInBiggerTapRegion;
-
-        private MotionEvent mCurrentDownEvent;
-        private MotionEvent mPreviousUpEvent;
-
-        /**
-         * True when the user is still touching for the second tap (down, move, and
-         * up events). Can only be true if there is a double tap listener attached.
-         */
-        private boolean mIsDoubleTapping;
-
-        private float mLastFocusX;
-        private float mLastFocusY;
-        private float mDownFocusX;
-        private float mDownFocusY;
-
-        private boolean mIsLongpressEnabled;
-
-        /**
-         * Determines speed during touch scrolling
-         */
-        private VelocityTracker mVelocityTracker;
-
-        private class GestureHandler extends Handler {
-            GestureHandler() {
-                super();
-            }
-
-            GestureHandler(Handler handler) {
-                super(handler.getLooper());
-            }
-
-            @Override
-            public void handleMessage(Message msg) {
-                switch (msg.what) {
-                case SHOW_PRESS:
-                    mListener.onShowPress(mCurrentDownEvent);
-                    break;
-
-                case LONG_PRESS:
-                    dispatchLongPress();
-                    break;
-
-                case TAP:
-                    // If the user's finger is still down, do not count it as a tap
-                    if (mDoubleTapListener != null) {
-                        if (!mStillDown) {
-                            mDoubleTapListener.onSingleTapConfirmed(mCurrentDownEvent);
-                        } else {
-                            mDeferConfirmSingleTap = true;
-                        }
-                    }
-                    break;
-
-                default:
-                    throw new RuntimeException("Unknown message " + msg); //never
-                }
-            }
-        }
-
-        /**
-         * Creates a GestureDetector with the supplied listener.
-         * You may only use this constructor from a UI thread (this is the usual situation).
-         * @see android.os.Handler#Handler()
-         *
-         * @param context the application's context
-         * @param listener the listener invoked for all the callbacks, this must
-         * not be null.
-         * @param handler the handler to use
-         *
-         * @throws NullPointerException if {@code listener} is null.
-         */
-        public GestureDetectorCompatImplBase(Context context, OnGestureListener listener,
-                Handler handler) {
-            if (handler != null) {
-                mHandler = new GestureHandler(handler);
-            } else {
-                mHandler = new GestureHandler();
-            }
-            mListener = listener;
-            if (listener instanceof OnDoubleTapListener) {
-                setOnDoubleTapListener((OnDoubleTapListener) listener);
-            }
-            init(context);
-        }
-
-        private void init(Context context) {
-            if (context == null) {
-                throw new IllegalArgumentException("Context must not be null");
-            }
-            if (mListener == null) {
-                throw new IllegalArgumentException("OnGestureListener must not be null");
-            }
-            mIsLongpressEnabled = true;
-
-            final ViewConfiguration configuration = ViewConfiguration.get(context);
-            final int touchSlop = configuration.getScaledTouchSlop();
-            final int doubleTapSlop = configuration.getScaledDoubleTapSlop();
-            mMinimumFlingVelocity = configuration.getScaledMinimumFlingVelocity();
-            mMaximumFlingVelocity = configuration.getScaledMaximumFlingVelocity();
-
-            mTouchSlopSquare = touchSlop * touchSlop;
-            mDoubleTapSlopSquare = doubleTapSlop * doubleTapSlop;
-        }
-
-        /**
-         * Sets the listener which will be called for double-tap and related
-         * gestures.
-         *
-         * @param onDoubleTapListener the listener invoked for all the callbacks, or
-         *        null to stop listening for double-tap gestures.
-         */
-        public void setOnDoubleTapListener(OnDoubleTapListener onDoubleTapListener) {
-            mDoubleTapListener = onDoubleTapListener;
-        }
-
-        /**
-         * Set whether longpress is enabled, if this is enabled when a user
-         * presses and holds down you get a longpress event and nothing further.
-         * If it's disabled the user can press and hold down and then later
-         * moved their finger and you will get scroll events. By default
-         * longpress is enabled.
-         *
-         * @param isLongpressEnabled whether longpress should be enabled.
-         */
-        public void setIsLongpressEnabled(boolean isLongpressEnabled) {
-            mIsLongpressEnabled = isLongpressEnabled;
-        }
-
-        /**
-         * @return true if longpress is enabled, else false.
-         */
-        public boolean isLongpressEnabled() {
-            return mIsLongpressEnabled;
-        }
-
-        /**
-         * Analyzes the given motion event and if applicable triggers the
-         * appropriate callbacks on the {@link OnGestureListener} supplied.
-         *
-         * @param ev The current motion event.
-         * @return true if the {@link OnGestureListener} consumed the event,
-         *              else false.
-         */
-        public boolean onTouchEvent(MotionEvent ev) {
-            final int action = ev.getAction();
-
-            if (mVelocityTracker == null) {
-                mVelocityTracker = VelocityTracker.obtain();
-            }
-            mVelocityTracker.addMovement(ev);
-
-            final boolean pointerUp =
-                    (action & MotionEventCompat.ACTION_MASK) == MotionEventCompat.ACTION_POINTER_UP;
-            final int skipIndex = pointerUp ? MotionEventCompat.getActionIndex(ev) : -1;
-
-            // Determine focal point
-            float sumX = 0, sumY = 0;
-            final int count = MotionEventCompat.getPointerCount(ev);
-            for (int i = 0; i < count; i++) {
-                if (skipIndex == i) continue;
-                sumX += MotionEventCompat.getX(ev, i);
-                sumY += MotionEventCompat.getY(ev, i);
-            }
-            final int div = pointerUp ? count - 1 : count;
-            final float focusX = sumX / div;
-            final float focusY = sumY / div;
-
-            boolean handled = false;
-
-            switch (action & MotionEventCompat.ACTION_MASK) {
-            case MotionEventCompat.ACTION_POINTER_DOWN:
-                mDownFocusX = mLastFocusX = focusX;
-                mDownFocusY = mLastFocusY = focusY;
-                // Cancel long press and taps
-                cancelTaps();
-                break;
-
-            case MotionEventCompat.ACTION_POINTER_UP:
-                mDownFocusX = mLastFocusX = focusX;
-                mDownFocusY = mLastFocusY = focusY;
-
-                // Check the dot product of current velocities.
-                // If the pointer that left was opposing another velocity vector, clear.
-                mVelocityTracker.computeCurrentVelocity(1000, mMaximumFlingVelocity);
-                final int upIndex = MotionEventCompat.getActionIndex(ev);
-                final int id1 = MotionEventCompat.getPointerId(ev, upIndex);
-                final float x1 = VelocityTrackerCompat.getXVelocity(mVelocityTracker, id1);
-                final float y1 = VelocityTrackerCompat.getYVelocity(mVelocityTracker, id1);
-                for (int i = 0; i < count; i++) {
-                    if (i == upIndex) continue;
-
-                    final int id2 = MotionEventCompat.getPointerId(ev, i);
-                    final float x = x1 * VelocityTrackerCompat.getXVelocity(mVelocityTracker, id2);
-                    final float y = y1 * VelocityTrackerCompat.getYVelocity(mVelocityTracker, id2);
-
-                    final float dot = x + y;
-                    if (dot < 0) {
-                        mVelocityTracker.clear();
-                        break;
-                    }
-                }
-                break;
-
-            case MotionEvent.ACTION_DOWN:
-                if (mDoubleTapListener != null) {
-                    boolean hadTapMessage = mHandler.hasMessages(TAP);
-                    if (hadTapMessage) mHandler.removeMessages(TAP);
-                    if ((mCurrentDownEvent != null) && (mPreviousUpEvent != null) && hadTapMessage &&
-                            isConsideredDoubleTap(mCurrentDownEvent, mPreviousUpEvent, ev)) {
-                        // This is a second tap
-                        mIsDoubleTapping = true;
-                        // Give a callback with the first tap of the double-tap
-                        handled |= mDoubleTapListener.onDoubleTap(mCurrentDownEvent);
-                        // Give a callback with down event of the double-tap
-                        handled |= mDoubleTapListener.onDoubleTapEvent(ev);
-                    } else {
-                        // This is a first tap
-                        mHandler.sendEmptyMessageDelayed(TAP, DOUBLE_TAP_TIMEOUT);
-                    }
-                }
-
-                mDownFocusX = mLastFocusX = focusX;
-                mDownFocusY = mLastFocusY = focusY;
-                if (mCurrentDownEvent != null) {
-                    mCurrentDownEvent.recycle();
-                }
-                mCurrentDownEvent = MotionEvent.obtain(ev);
-                mAlwaysInTapRegion = true;
-                mAlwaysInBiggerTapRegion = true;
-                mStillDown = true;
-                mInLongPress = false;
-                mDeferConfirmSingleTap = false;
-
-                if (mIsLongpressEnabled) {
-                    mHandler.removeMessages(LONG_PRESS);
-                    mHandler.sendEmptyMessageAtTime(LONG_PRESS, mCurrentDownEvent.getDownTime()
-                            + TAP_TIMEOUT + LONGPRESS_TIMEOUT);
-                }
-                mHandler.sendEmptyMessageAtTime(SHOW_PRESS, mCurrentDownEvent.getDownTime() + TAP_TIMEOUT);
-                handled |= mListener.onDown(ev);
-                break;
-
-            case MotionEvent.ACTION_MOVE:
-                if (mInLongPress) {
-                    break;
-                }
-                final float scrollX = mLastFocusX - focusX;
-                final float scrollY = mLastFocusY - focusY;
-                if (mIsDoubleTapping) {
-                    // Give the move events of the double-tap
-                    handled |= mDoubleTapListener.onDoubleTapEvent(ev);
-                } else if (mAlwaysInTapRegion) {
-                    final int deltaX = (int) (focusX - mDownFocusX);
-                    final int deltaY = (int) (focusY - mDownFocusY);
-                    int distance = (deltaX * deltaX) + (deltaY * deltaY);
-                    if (distance > mTouchSlopSquare) {
-                        handled = mListener.onScroll(mCurrentDownEvent, ev, scrollX, scrollY);
-                        mLastFocusX = focusX;
-                        mLastFocusY = focusY;
-                        mAlwaysInTapRegion = false;
-                        mHandler.removeMessages(TAP);
-                        mHandler.removeMessages(SHOW_PRESS);
-                        mHandler.removeMessages(LONG_PRESS);
-                    }
-                    if (distance > mTouchSlopSquare) {
-                        mAlwaysInBiggerTapRegion = false;
-                    }
-                } else if ((Math.abs(scrollX) >= 1) || (Math.abs(scrollY) >= 1)) {
-                    handled = mListener.onScroll(mCurrentDownEvent, ev, scrollX, scrollY);
-                    mLastFocusX = focusX;
-                    mLastFocusY = focusY;
-                }
-                break;
-
-            case MotionEvent.ACTION_UP:
-                mStillDown = false;
-                MotionEvent currentUpEvent = MotionEvent.obtain(ev);
-                if (mIsDoubleTapping) {
-                    // Finally, give the up event of the double-tap
-                    handled |= mDoubleTapListener.onDoubleTapEvent(ev);
-                } else if (mInLongPress) {
-                    mHandler.removeMessages(TAP);
-                    mInLongPress = false;
-                } else if (mAlwaysInTapRegion) {
-                    handled = mListener.onSingleTapUp(ev);
-                    if (mDeferConfirmSingleTap && mDoubleTapListener != null) {
-                        mDoubleTapListener.onSingleTapConfirmed(ev);
-                    }
-                } else {
-                    // A fling must travel the minimum tap distance
-                    final VelocityTracker velocityTracker = mVelocityTracker;
-                    final int pointerId = MotionEventCompat.getPointerId(ev, 0);
-                    velocityTracker.computeCurrentVelocity(1000, mMaximumFlingVelocity);
-                    final float velocityY = VelocityTrackerCompat.getYVelocity(
-                            velocityTracker, pointerId);
-                    final float velocityX = VelocityTrackerCompat.getXVelocity(
-                            velocityTracker, pointerId);
-
-                    if ((Math.abs(velocityY) > mMinimumFlingVelocity)
-                            || (Math.abs(velocityX) > mMinimumFlingVelocity)){
-                        handled = mListener.onFling(mCurrentDownEvent, ev, velocityX, velocityY);
-                    }
-                }
-                if (mPreviousUpEvent != null) {
-                    mPreviousUpEvent.recycle();
-                }
-                // Hold the event we obtained above - listeners may have changed the original.
-                mPreviousUpEvent = currentUpEvent;
-                if (mVelocityTracker != null) {
-                    // This may have been cleared when we called out to the
-                    // application above.
-                    mVelocityTracker.recycle();
-                    mVelocityTracker = null;
-                }
-                mIsDoubleTapping = false;
-                mDeferConfirmSingleTap = false;
-                mHandler.removeMessages(SHOW_PRESS);
-                mHandler.removeMessages(LONG_PRESS);
-                break;
-
-            case MotionEvent.ACTION_CANCEL:
-                cancel();
-                break;
-            }
-
-            return handled;
-        }
-
-        private void cancel() {
-            mHandler.removeMessages(SHOW_PRESS);
-            mHandler.removeMessages(LONG_PRESS);
-            mHandler.removeMessages(TAP);
-            mVelocityTracker.recycle();
-            mVelocityTracker = null;
-            mIsDoubleTapping = false;
-            mStillDown = false;
-            mAlwaysInTapRegion = false;
-            mAlwaysInBiggerTapRegion = false;
-            mDeferConfirmSingleTap = false;
-            if (mInLongPress) {
-                mInLongPress = false;
-            }
-        }
-
-        private void cancelTaps() {
-            mHandler.removeMessages(SHOW_PRESS);
-            mHandler.removeMessages(LONG_PRESS);
-            mHandler.removeMessages(TAP);
-            mIsDoubleTapping = false;
-            mAlwaysInTapRegion = false;
-            mAlwaysInBiggerTapRegion = false;
-            mDeferConfirmSingleTap = false;
-            if (mInLongPress) {
-                mInLongPress = false;
-            }
-        }
-
-        private boolean isConsideredDoubleTap(MotionEvent firstDown, MotionEvent firstUp,
-                MotionEvent secondDown) {
-            if (!mAlwaysInBiggerTapRegion) {
-                return false;
-            }
-
-            if (secondDown.getEventTime() - firstUp.getEventTime() > DOUBLE_TAP_TIMEOUT) {
-                return false;
-            }
-
-            int deltaX = (int) firstDown.getX() - (int) secondDown.getX();
-            int deltaY = (int) firstDown.getY() - (int) secondDown.getY();
-            return (deltaX * deltaX + deltaY * deltaY < mDoubleTapSlopSquare);
-        }
-
-        private void dispatchLongPress() {
-            mHandler.removeMessages(TAP);
-            mDeferConfirmSingleTap = false;
-            mInLongPress = true;
-            mListener.onLongPress(mCurrentDownEvent);
-        }
-    }
-
-    static class GestureDetectorCompatImplJellybeanMr2 implements GestureDetectorCompatImpl {
-        private final GestureDetector mDetector;
-
-        public GestureDetectorCompatImplJellybeanMr2(Context context, OnGestureListener listener,
-                Handler handler) {
-            mDetector = new GestureDetector(context, listener, handler);
-        }
-
-        @Override
-        public boolean isLongpressEnabled() {
-            return mDetector.isLongpressEnabled();
-        }
-
-        @Override
-        public boolean onTouchEvent(MotionEvent ev) {
-            return mDetector.onTouchEvent(ev);
-        }
-
-        @Override
-        public void setIsLongpressEnabled(boolean enabled) {
-            mDetector.setIsLongpressEnabled(enabled);
-        }
-
-        @Override
-        public void setOnDoubleTapListener(OnDoubleTapListener listener) {
-            mDetector.setOnDoubleTapListener(listener);
-        }
-    }
-
-    private final GestureDetectorCompatImpl mImpl;
-
-    /**
-     * Creates a GestureDetectorCompat with the supplied listener.
-     * As usual, you may only use this constructor from a UI thread.
-     * @see android.os.Handler#Handler()
-     *
-     * @param context the application's context
-     * @param listener the listener invoked for all the callbacks, this must
-     * not be null.
-     */
-    public GestureDetectorCompat(Context context, OnGestureListener listener) {
-        this(context, listener, null);
-    }
-
-    /**
-     * Creates a GestureDetectorCompat with the supplied listener.
-     * As usual, you may only use this constructor from a UI thread.
-     * @see android.os.Handler#Handler()
-     *
-     * @param context the application's context
-     * @param listener the listener invoked for all the callbacks, this must
-     * not be null.
-     * @param handler the handler that will be used for posting deferred messages
-     */
-    public GestureDetectorCompat(Context context, OnGestureListener listener, Handler handler) {
-        if (Build.VERSION.SDK_INT > 17) {
-            mImpl = new GestureDetectorCompatImplJellybeanMr2(context, listener, handler);
-        } else {
-            mImpl = new GestureDetectorCompatImplBase(context, listener, handler);
-        }
-    }
-
-    /**
-     * @return true if longpress is enabled, else false.
-     */
-    public boolean isLongpressEnabled() {
-        return mImpl.isLongpressEnabled();
-    }
-
-    /**
-     * Analyzes the given motion event and if applicable triggers the
-     * appropriate callbacks on the {@link OnGestureListener} supplied.
-     *
-     * @param event The current motion event.
-     * @return true if the {@link OnGestureListener} consumed the event,
-     *              else false.
-     */
-    public boolean onTouchEvent(MotionEvent event) {
-        return mImpl.onTouchEvent(event);
-    }
-
-    /**
-     * Set whether longpress is enabled, if this is enabled when a user
-     * presses and holds down you get a longpress event and nothing further.
-     * If it's disabled the user can press and hold down and then later
-     * moved their finger and you will get scroll events. By default
-     * longpress is enabled.
-     *
-     * @param enabled whether longpress should be enabled.
-     */
-    public void setIsLongpressEnabled(boolean enabled) {
-        mImpl.setIsLongpressEnabled(enabled);
-    }
-
-    /**
-     * Sets the listener which will be called for double-tap and related
-     * gestures.
-     *
-     * @param listener the listener invoked for all the callbacks, or
-     *        null to stop listening for double-tap gestures.
-     */
-    public void setOnDoubleTapListener(OnDoubleTapListener listener) {
-        mImpl.setOnDoubleTapListener(listener);
-    }
-}
diff --git a/v4/java/android/support/v4/view/KeyEventCompat.java b/v4/java/android/support/v4/view/KeyEventCompat.java
deleted file mode 100644
index ee5a914..0000000
--- a/v4/java/android/support/v4/view/KeyEventCompat.java
+++ /dev/null
@@ -1,227 +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 android.support.v4.view;
-
-import android.view.KeyEvent;
-import android.view.View;
-
-/**
- * Helper for accessing features in {@link KeyEvent} introduced after
- * API level 4 in a backwards compatible fashion.
- */
-public final class KeyEventCompat {
-    /**
-     * Interface for the full API.
-     */
-    interface KeyEventVersionImpl {
-        int normalizeMetaState(int metaState);
-        boolean metaStateHasModifiers(int metaState, int modifiers);
-        boolean metaStateHasNoModifiers(int metaState);
-        void startTracking(KeyEvent event);
-        boolean isTracking(KeyEvent event);
-        Object getKeyDispatcherState(View view);
-        boolean dispatch(KeyEvent event, KeyEvent.Callback receiver, Object state, Object target);
-        boolean isCtrlPressed(KeyEvent event);
-    }
-
-    /**
-     * Interface implementation that doesn't use anything about v4 APIs.
-     */
-    static class BaseKeyEventVersionImpl implements KeyEventVersionImpl {
-        private static final int META_MODIFIER_MASK =
-                KeyEvent.META_SHIFT_ON | KeyEvent.META_SHIFT_LEFT_ON | KeyEvent.META_SHIFT_RIGHT_ON
-                | KeyEvent.META_ALT_ON | KeyEvent.META_ALT_LEFT_ON | KeyEvent.META_ALT_RIGHT_ON
-                | KeyEvent.META_SYM_ON;
-
-        // Mask of all lock key meta states.
-        private static final int META_ALL_MASK = META_MODIFIER_MASK;
-
-        private static int metaStateFilterDirectionalModifiers(int metaState,
-                int modifiers, int basic, int left, int right) {
-            final boolean wantBasic = (modifiers & basic) != 0;
-            final int directional = left | right;
-            final boolean wantLeftOrRight = (modifiers & directional) != 0;
-
-            if (wantBasic) {
-                if (wantLeftOrRight) {
-                    throw new IllegalArgumentException("bad arguments");
-                }
-                return metaState & ~directional;
-            } else if (wantLeftOrRight) {
-                return metaState & ~basic;
-            } else {
-                return metaState;
-            }
-        }
-
-        @Override
-        public int normalizeMetaState(int metaState) {
-            if ((metaState & (KeyEvent.META_SHIFT_LEFT_ON | KeyEvent.META_SHIFT_RIGHT_ON)) != 0) {
-                metaState |= KeyEvent.META_SHIFT_ON;
-            }
-            if ((metaState & (KeyEvent.META_ALT_LEFT_ON | KeyEvent.META_ALT_RIGHT_ON)) != 0) {
-                metaState |= KeyEvent.META_ALT_ON;
-            }
-            return metaState & META_ALL_MASK;
-        }
- 
-        @Override
-        public boolean metaStateHasModifiers(int metaState, int modifiers) {
-            metaState = normalizeMetaState(metaState) & META_MODIFIER_MASK;
-            metaState = metaStateFilterDirectionalModifiers(metaState, modifiers,
-                    KeyEvent.META_SHIFT_ON, KeyEvent.META_SHIFT_LEFT_ON, KeyEvent.META_SHIFT_RIGHT_ON);
-            metaState = metaStateFilterDirectionalModifiers(metaState, modifiers,
-                    KeyEvent.META_ALT_ON, KeyEvent.META_ALT_LEFT_ON, KeyEvent.META_ALT_RIGHT_ON);
-            return metaState == modifiers;
-        }
-
-        @Override
-        public boolean metaStateHasNoModifiers(int metaState) {
-            return (normalizeMetaState(metaState) & META_MODIFIER_MASK) == 0;
-        }
-
-        @Override
-        public void startTracking(KeyEvent event) {
-        }
-
-        @Override
-        public boolean isTracking(KeyEvent event) {
-            return false;
-        }
-
-        @Override
-        public Object getKeyDispatcherState(View view) {
-            return null;
-        }
-
-        @Override
-        public boolean dispatch(KeyEvent event, KeyEvent.Callback receiver, Object state,
-                    Object target) {
-            return event.dispatch(receiver);
-        }
-
-        @Override
-        public boolean isCtrlPressed(KeyEvent event) {
-            return false;
-        }
-    }
-
-    static class EclairKeyEventVersionImpl extends BaseKeyEventVersionImpl {
-        @Override
-        public void startTracking(KeyEvent event) {
-            KeyEventCompatEclair.startTracking(event);
-        }
-
-        @Override
-        public boolean isTracking(KeyEvent event) {
-            return KeyEventCompatEclair.isTracking(event);
-        }
-
-        @Override
-        public Object getKeyDispatcherState(View view) {
-            return KeyEventCompatEclair.getKeyDispatcherState(view);
-        }
-
-        @Override
-        public boolean dispatch(KeyEvent event, KeyEvent.Callback receiver, Object state,
-                    Object target) {
-            return KeyEventCompatEclair.dispatch(event, receiver, state, target);
-        }
-    }
-
-    /**
-     * Interface implementation for devices with at least v11 APIs.
-     */
-    static class HoneycombKeyEventVersionImpl extends EclairKeyEventVersionImpl {
-        @Override
-        public int normalizeMetaState(int metaState) {
-            return KeyEventCompatHoneycomb.normalizeMetaState(metaState);
-        }
-        
-        @Override
-        public boolean metaStateHasModifiers(int metaState, int modifiers) {
-            return KeyEventCompatHoneycomb.metaStateHasModifiers(metaState, modifiers);
-        }
-
-        @Override
-        public boolean metaStateHasNoModifiers(int metaState) {
-            return KeyEventCompatHoneycomb.metaStateHasNoModifiers(metaState);
-        }
-
-        @Override
-        public boolean isCtrlPressed(KeyEvent event) {
-            return KeyEventCompatHoneycomb.isCtrlPressed(event);
-        }
-    }
-
-    /**
-     * Select the correct implementation to use for the current platform.
-     */
-    static final KeyEventVersionImpl IMPL;
-    static {
-        if (android.os.Build.VERSION.SDK_INT >= 11) {
-            IMPL = new HoneycombKeyEventVersionImpl();
-        } else {
-            IMPL = new BaseKeyEventVersionImpl();
-        }
-    }
-
-    // -------------------------------------------------------------------
-
-    public static int normalizeMetaState(int metaState) {
-        return IMPL.normalizeMetaState(metaState);
-    }
-
-    public static boolean metaStateHasModifiers(int metaState, int modifiers) {
-        return IMPL.metaStateHasModifiers(metaState, modifiers);
-    }
-
-    public static boolean metaStateHasNoModifiers(int metaState) {
-        return IMPL.metaStateHasNoModifiers(metaState);
-    }
-
-    public static boolean hasModifiers(KeyEvent event, int modifiers) {
-        return IMPL.metaStateHasModifiers(event.getMetaState(), modifiers);
-    }
-
-    public static boolean hasNoModifiers(KeyEvent event) {
-        return IMPL.metaStateHasNoModifiers(event.getMetaState());
-    }
-
-    public static void startTracking(KeyEvent event) {
-        IMPL.startTracking(event);
-    }
-
-    public static boolean isTracking(KeyEvent event) {
-        return IMPL.isTracking(event);
-    }
-
-    public static Object getKeyDispatcherState(View view) {
-        return IMPL.getKeyDispatcherState(view);
-    }
-
-    public static boolean dispatch(KeyEvent event, KeyEvent.Callback receiver, Object state,
-                Object target) {
-        return IMPL.dispatch(event, receiver, state, target);
-    }
-
-    public static boolean isCtrlPressed(KeyEvent event) {
-        return IMPL.isCtrlPressed(event);
-    }
-
-    private KeyEventCompat() {}
-}
diff --git a/v4/java/android/support/v4/view/MotionEventCompat.java b/v4/java/android/support/v4/view/MotionEventCompat.java
deleted file mode 100644
index 81d1d05..0000000
--- a/v4/java/android/support/v4/view/MotionEventCompat.java
+++ /dev/null
@@ -1,573 +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 android.support.v4.view;
-
-import android.os.Build;
-import android.view.MotionEvent;
-
-/**
- * Helper for accessing features in {@link MotionEvent} introduced
- * after API level 4 in a backwards compatible fashion.
- */
-public final class MotionEventCompat {
-    /**
-     * Interface for the full API.
-     */
-    interface MotionEventVersionImpl {
-        public int findPointerIndex(MotionEvent event, int pointerId);
-        public int getPointerId(MotionEvent event, int pointerIndex);
-        public float getX(MotionEvent event, int pointerIndex);
-        public float getY(MotionEvent event, int pointerIndex);
-        public int getPointerCount(MotionEvent event);
-        public int getSource(MotionEvent event);
-        float getAxisValue(MotionEvent event, int axis);
-        float getAxisValue(MotionEvent event, int axis, int pointerIndex);
-        int getButtonState(MotionEvent event);
-    }
-
-    /**
-     * Interface implementation that doesn't use anything about v4 APIs.
-     */
-    static class BaseMotionEventVersionImpl implements MotionEventVersionImpl {
-        @Override
-        public int findPointerIndex(MotionEvent event, int pointerId) {
-            if (pointerId == 0) {
-                // id 0 == index 0 and vice versa.
-                return 0;
-            }
-            return -1;
-        }
-        @Override
-        public int getPointerId(MotionEvent event, int pointerIndex) {
-            if (pointerIndex == 0) {
-                // index 0 == id 0 and vice versa.
-                return 0;
-            }
-            throw new IndexOutOfBoundsException("Pre-Eclair does not support multiple pointers");
-        }
-        @Override
-        public float getX(MotionEvent event, int pointerIndex) {
-            if (pointerIndex == 0) {
-                return event.getX();
-            }
-            throw new IndexOutOfBoundsException("Pre-Eclair does not support multiple pointers");
-        }
-        @Override
-        public float getY(MotionEvent event, int pointerIndex) {
-            if (pointerIndex == 0) {
-                return event.getY();
-            }
-            throw new IndexOutOfBoundsException("Pre-Eclair does not support multiple pointers");
-        }
-        @Override
-        public int getPointerCount(MotionEvent event) {
-            return 1;
-        }
-
-        @Override
-        public int getSource(MotionEvent event) {
-            return InputDeviceCompat.SOURCE_UNKNOWN;
-        }
-
-        @Override
-        public float getAxisValue(MotionEvent event, int axis) {
-            return 0;
-        }
-
-        @Override
-        public float getAxisValue(MotionEvent event, int axis, int pointerIndex) {
-            return 0;
-        }
-
-        @Override
-        public int getButtonState(MotionEvent event) {
-            return 0;
-        }
-    }
-
-    /**
-     * Interface implementation for devices with at least v5 APIs.
-     */
-    static class EclairMotionEventVersionImpl extends BaseMotionEventVersionImpl {
-        @Override
-        public int findPointerIndex(MotionEvent event, int pointerId) {
-            return MotionEventCompatEclair.findPointerIndex(event, pointerId);
-        }
-        @Override
-        public int getPointerId(MotionEvent event, int pointerIndex) {
-            return MotionEventCompatEclair.getPointerId(event, pointerIndex);
-        }
-        @Override
-        public float getX(MotionEvent event, int pointerIndex) {
-            return MotionEventCompatEclair.getX(event, pointerIndex);
-        }
-        @Override
-        public float getY(MotionEvent event, int pointerIndex) {
-            return MotionEventCompatEclair.getY(event, pointerIndex);
-        }
-        @Override
-        public int getPointerCount(MotionEvent event) {
-            return MotionEventCompatEclair.getPointerCount(event);
-        }
-    }
-
-    /**
-     * Interface implementation for devices with at least v8 APIs.
-     */
-    static class GingerbreadMotionEventVersionImpl extends EclairMotionEventVersionImpl {
-        @Override
-        public int getSource(MotionEvent event) {
-            return MotionEventCompatGingerbread.getSource(event);
-        }
-    }
-
-    /**
-     * Interface implementation for devices with at least v12 APIs.
-     */
-    static class HoneycombMr1MotionEventVersionImpl extends GingerbreadMotionEventVersionImpl {
-
-        @Override
-        public float getAxisValue(MotionEvent event, int axis) {
-            return MotionEventCompatHoneycombMr1.getAxisValue(event, axis);
-        }
-
-        @Override
-        public float getAxisValue(MotionEvent event, int axis, int pointerIndex) {
-            return MotionEventCompatHoneycombMr1.getAxisValue(event, axis, pointerIndex);
-        }
-    }
-
-
-    /**
-     * Interface implementation for devices with at least v14 APIs.
-     */
-    private static class ICSMotionEventVersionImpl extends HoneycombMr1MotionEventVersionImpl {
-        @Override
-        public int getButtonState(MotionEvent event) {
-            return MotionEventCompatICS.getButtonState(event);
-        }
-    }
-
-    /**
-     * Select the correct implementation to use for the current platform.
-     */
-    static final MotionEventVersionImpl IMPL;
-    static {
-        if (Build.VERSION.SDK_INT >= 14) {
-            IMPL = new ICSMotionEventVersionImpl();
-        } else if (Build.VERSION.SDK_INT >= 12) {
-            IMPL = new HoneycombMr1MotionEventVersionImpl();
-        } else if (Build.VERSION.SDK_INT >= 9) {
-            IMPL = new GingerbreadMotionEventVersionImpl();
-        } else if (Build.VERSION.SDK_INT >= 5) {
-            IMPL = new EclairMotionEventVersionImpl();
-        } else {
-            IMPL = new BaseMotionEventVersionImpl();
-        }
-    }
-
-    // -------------------------------------------------------------------
-
-    /**
-     * Synonym for {@link MotionEvent#ACTION_MASK}.
-     */
-    public static final int ACTION_MASK = 0xff;
-
-    /**
-     * Synonym for {@link MotionEvent#ACTION_POINTER_DOWN}.
-     */
-    public static final int ACTION_POINTER_DOWN = 5;
-
-    /**
-     * Synonym for {@link MotionEvent#ACTION_POINTER_UP}.
-     */
-    public static final int ACTION_POINTER_UP = 6;
-
-    /**
-     * Synonym for {@link MotionEvent#ACTION_HOVER_MOVE}.
-     */
-    public static final int ACTION_HOVER_MOVE = 7;
-
-    /**
-     * Synonym for {@link MotionEvent#ACTION_SCROLL}.
-     */
-    public static final int ACTION_SCROLL = 8;
-
-    /**
-     * Synonym for {@link MotionEvent#ACTION_POINTER_INDEX_MASK}.
-     */
-    public static final int ACTION_POINTER_INDEX_MASK  = 0xff00;
-
-    /**
-     * Synonym for {@link MotionEvent#ACTION_POINTER_INDEX_SHIFT}.
-     */
-    public static final int ACTION_POINTER_INDEX_SHIFT = 8;
-
-    /**
-     * Synonym for {@link MotionEvent#ACTION_HOVER_ENTER}.
-     */
-    public static final int ACTION_HOVER_ENTER = 9;
-
-    /**
-     * Synonym for {@link MotionEvent#ACTION_HOVER_EXIT}.
-     */
-    public static final int ACTION_HOVER_EXIT = 10;
-
-    /**
-     * Synonym for {@link MotionEvent#AXIS_X}.
-     */
-    public static final int AXIS_X = 0;
-
-    /**
-     * Synonym for {@link MotionEvent#AXIS_Y}.
-     */
-    public static final int AXIS_Y = 1;
-
-    /**
-     * Synonym for {@link MotionEvent#AXIS_PRESSURE}.
-     */
-    public static final int AXIS_PRESSURE = 2;
-
-    /**
-     * Synonym for {@link MotionEvent#AXIS_SIZE}.
-     */
-    public static final int AXIS_SIZE = 3;
-
-    /**
-     * Synonym for {@link MotionEvent#AXIS_TOUCH_MAJOR}.
-     */
-    public static final int AXIS_TOUCH_MAJOR = 4;
-
-    /**
-     * Synonym for {@link MotionEvent#AXIS_TOUCH_MINOR}.
-     */
-    public static final int AXIS_TOUCH_MINOR = 5;
-
-    /**
-     * Synonym for {@link MotionEvent#AXIS_TOOL_MAJOR}.
-     */
-    public static final int AXIS_TOOL_MAJOR = 6;
-
-    /**
-     * Synonym for {@link MotionEvent#AXIS_TOOL_MINOR}.
-     */
-    public static final int AXIS_TOOL_MINOR = 7;
-
-    /**
-     * Synonym for {@link MotionEvent#AXIS_ORIENTATION}.
-     */
-    public static final int AXIS_ORIENTATION = 8;
-
-    /**
-     * Synonym for {@link MotionEvent#AXIS_VSCROLL}.
-     */
-    public static final int AXIS_VSCROLL = 9;
-
-    /**
-     * Synonym for {@link MotionEvent#AXIS_HSCROLL}.
-     */
-    public static final int AXIS_HSCROLL = 10;
-
-    /**
-     * Synonym for {@link MotionEvent#AXIS_Z}.
-     */
-    public static final int AXIS_Z = 11;
-
-    /**
-     * Synonym for {@link MotionEvent#AXIS_RX}.
-     */
-    public static final int AXIS_RX = 12;
-
-    /**
-     * Synonym for {@link MotionEvent#AXIS_RY}.
-     */
-    public static final int AXIS_RY = 13;
-
-    /**
-     * Synonym for {@link MotionEvent#AXIS_RZ}.
-     */
-    public static final int AXIS_RZ = 14;
-
-    /**
-     * Synonym for {@link MotionEvent#AXIS_HAT_X}.
-     */
-    public static final int AXIS_HAT_X = 15;
-
-    /**
-     * Synonym for {@link MotionEvent#AXIS_HAT_Y}.
-     */
-    public static final int AXIS_HAT_Y = 16;
-
-    /**
-     * Synonym for {@link MotionEvent#AXIS_LTRIGGER}.
-     */
-    public static final int AXIS_LTRIGGER = 17;
-
-    /**
-     * Synonym for {@link MotionEvent#AXIS_RTRIGGER}.
-     */
-    public static final int AXIS_RTRIGGER = 18;
-
-    /**
-     * Synonym for {@link MotionEvent#AXIS_THROTTLE}.
-     */
-    public static final int AXIS_THROTTLE = 19;
-
-    /**
-     * Synonym for {@link MotionEvent#AXIS_RUDDER}.
-     */
-    public static final int AXIS_RUDDER = 20;
-
-    /**
-     * Synonym for {@link MotionEvent#AXIS_WHEEL}.
-     */
-    public static final int AXIS_WHEEL = 21;
-
-    /**
-     * Synonym for {@link MotionEvent#AXIS_GAS}.
-     */
-    public static final int AXIS_GAS = 22;
-
-    /**
-     * Synonym for {@link MotionEvent#AXIS_BRAKE}.
-     */
-    public static final int AXIS_BRAKE = 23;
-
-    /**
-     * Synonym for {@link MotionEvent#AXIS_DISTANCE}.
-     */
-    public static final int AXIS_DISTANCE = 24;
-
-    /**
-     * Synonym for {@link MotionEvent#AXIS_TILT}.
-     */
-    public static final int AXIS_TILT = 25;
-
-    /**
-     * Synonym for {@link MotionEvent#AXIS_RELATIVE_X}.
-     */
-    public static final int AXIS_RELATIVE_X = 27;
-
-    /**
-     * Synonym for {@link MotionEvent#AXIS_RELATIVE_Y}.
-     */
-    public static final int AXIS_RELATIVE_Y = 28;
-
-    /**
-     * Synonym for {@link MotionEvent#AXIS_GENERIC_1}.
-     */
-    public static final int AXIS_GENERIC_1 = 32;
-
-    /**
-     * Synonym for {@link MotionEvent#AXIS_GENERIC_2}.
-     */
-    public static final int AXIS_GENERIC_2 = 33;
-
-    /**
-     * Synonym for {@link MotionEvent#AXIS_GENERIC_3}.
-     */
-    public static final int AXIS_GENERIC_3 = 34;
-
-    /**
-     * Synonym for {@link MotionEvent#AXIS_GENERIC_4}.
-     */
-    public static final int AXIS_GENERIC_4 = 35;
-
-    /**
-     * Synonym for {@link MotionEvent#AXIS_GENERIC_5}.
-     */
-    public static final int AXIS_GENERIC_5 = 36;
-
-    /**
-     * Synonym for {@link MotionEvent#AXIS_GENERIC_6}.
-     */
-    public static final int AXIS_GENERIC_6 = 37;
-
-    /**
-     * Synonym for {@link MotionEvent#AXIS_GENERIC_7}.
-     */
-    public static final int AXIS_GENERIC_7 = 38;
-
-    /**
-     * Synonym for {@link MotionEvent#AXIS_GENERIC_8}.
-     */
-    public static final int AXIS_GENERIC_8 = 39;
-
-    /**
-     * Synonym for {@link MotionEvent#AXIS_GENERIC_9}.
-     */
-    public static final int AXIS_GENERIC_9 = 40;
-
-    /**
-     * Synonym for {@link MotionEvent#AXIS_GENERIC_10}.
-     */
-    public static final int AXIS_GENERIC_10 = 41;
-
-    /**
-     * Synonym for {@link MotionEvent#AXIS_GENERIC_11}.
-     */
-    public static final int AXIS_GENERIC_11 = 42;
-
-    /**
-     * Synonym for {@link MotionEvent#AXIS_GENERIC_12}.
-     */
-    public static final int AXIS_GENERIC_12 = 43;
-
-    /**
-     * Synonym for {@link MotionEvent#AXIS_GENERIC_13}.
-     */
-    public static final int AXIS_GENERIC_13 = 44;
-
-    /**
-     * Synonym for {@link MotionEvent#AXIS_GENERIC_14}.
-     */
-    public static final int AXIS_GENERIC_14 = 45;
-
-    /**
-     * Synonym for {@link MotionEvent#AXIS_GENERIC_15}.
-     */
-    public static final int AXIS_GENERIC_15 = 46;
-
-    /**
-     * Synonym for {@link MotionEvent#AXIS_GENERIC_16}.
-     */
-    public static final int AXIS_GENERIC_16 = 47;
-
-    /**
-     * Synonym for {@link MotionEvent#BUTTON_PRIMARY}.
-     */
-    public static final int BUTTON_PRIMARY = 1;
-
-    /**
-     * Call {@link MotionEvent#getAction}, returning only the {@link #ACTION_MASK}
-     * portion.
-     */
-    public static int getActionMasked(MotionEvent event) {
-        return event.getAction() & ACTION_MASK;
-    }
-
-    /**
-     * Call {@link MotionEvent#getAction}, returning only the pointer index
-     * portion
-     */
-    public static int getActionIndex(MotionEvent event) {
-        return (event.getAction() & ACTION_POINTER_INDEX_MASK)
-                >> ACTION_POINTER_INDEX_SHIFT;
-    }
-
-    /**
-     * Call {@link MotionEvent#findPointerIndex(int)}.
-     * If running on a pre-{@link android.os.Build.VERSION_CODES#ECLAIR} device,
-     * does nothing and returns -1.
-     */
-    public static int findPointerIndex(MotionEvent event, int pointerId) {
-        return IMPL.findPointerIndex(event, pointerId);
-    }
-
-    /**
-     * Call {@link MotionEvent#getPointerId(int)}.
-     * If running on a pre-{@link android.os.Build.VERSION_CODES#ECLAIR} device,
-     * {@link IndexOutOfBoundsException} is thrown.
-     */
-    public static int getPointerId(MotionEvent event, int pointerIndex) {
-        return IMPL.getPointerId(event, pointerIndex);
-    }
-
-    /**
-     * Call {@link MotionEvent#getX(int)}.
-     * If running on a pre-{@link android.os.Build.VERSION_CODES#ECLAIR} device,
-     * {@link IndexOutOfBoundsException} is thrown.
-     */
-    public static float getX(MotionEvent event, int pointerIndex) {
-        return IMPL.getX(event, pointerIndex);
-    }
-
-    /**
-     * Call {@link MotionEvent#getY(int)}.
-     * If running on a pre-{@link android.os.Build.VERSION_CODES#ECLAIR} device,
-     * {@link IndexOutOfBoundsException} is thrown.
-     */
-    public static float getY(MotionEvent event, int pointerIndex) {
-        return IMPL.getY(event, pointerIndex);
-    }
-
-    /**
-     * The number of pointers of data contained in this event.  Always
-     * >= 1.
-     */
-    public static int getPointerCount(MotionEvent event) {
-        return IMPL.getPointerCount(event);
-    }
-
-    /**
-     * Gets the source of the event.
-     *
-     * @return The event source or {@link InputDeviceCompat#SOURCE_UNKNOWN} if unknown.
-     */
-    public static int getSource(MotionEvent event) {
-        return IMPL.getSource(event);
-    }
-
-    /**
-     * Determines whether the event is from the given source.
-     * @param source The input source to check against.
-     * @return Whether the event is from the given source.
-     */
-    public static boolean isFromSource(MotionEvent event, int source) {
-        return (getSource(event) & source) == source;
-    }
-
-    /**
-     * Get axis value for the first pointer index (may be an
-     * arbitrary pointer identifier).
-     *
-     * @param axis The axis identifier for the axis value to retrieve.
-     *
-     * @see #AXIS_X
-     * @see #AXIS_Y
-     */
-    public static float getAxisValue(MotionEvent event, int axis) {
-        return IMPL.getAxisValue(event, axis);
-    }
-
-    /**
-     * Returns the value of the requested axis for the given pointer <em>index</em>
-     * (use {@link #getPointerId(MotionEvent, int)} to find the pointer identifier for this index).
-     *
-     * @param axis The axis identifier for the axis value to retrieve.
-     * @param pointerIndex Raw index of pointer to retrieve.  Value may be from 0
-     * (the first pointer that is down) to {@link #getPointerCount(MotionEvent)}-1.
-     * @return The value of the axis, or 0 if the axis is not available.
-     *
-     * @see #AXIS_X
-     * @see #AXIS_Y
-     */
-    public static float getAxisValue(MotionEvent event, int axis, int pointerIndex) {
-        return IMPL.getAxisValue(event, axis, pointerIndex);
-    }
-
-    /**
-     *
-     * @param event
-     * @return
-     */
-    public static int getButtonState(MotionEvent event) {
-        return IMPL.getButtonState(event);
-    }
-
-    private MotionEventCompat() {}
-}
diff --git a/v4/java/android/support/v4/view/NestedScrollingChildHelper.java b/v4/java/android/support/v4/view/NestedScrollingChildHelper.java
deleted file mode 100644
index 9e25667..0000000
--- a/v4/java/android/support/v4/view/NestedScrollingChildHelper.java
+++ /dev/null
@@ -1,282 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.v4.view;
-
-import android.view.View;
-import android.view.ViewParent;
-
-/**
- * Helper class for implementing nested scrolling child views compatible with Android platform
- * versions earlier than Android 5.0 Lollipop (API 21).
- *
- * <p>{@link android.view.View View} subclasses should instantiate a final instance of this
- * class as a field at construction. For each <code>View</code> method that has a matching
- * method signature in this class, delegate the operation to the helper instance in an overriden
- * method implementation. This implements the standard framework policy for nested scrolling.</p>
- *
- * <p>Views invoking nested scrolling functionality should always do so from the relevant
- * {@link ViewCompat}, {@link ViewGroupCompat} or {@link ViewParentCompat} compatibility
- * shim static methods. This ensures interoperability with nested scrolling views on Android
- * 5.0 Lollipop and newer.</p>
- */
-public class NestedScrollingChildHelper {
-    private final View mView;
-    private ViewParent mNestedScrollingParent;
-    private boolean mIsNestedScrollingEnabled;
-    private int[] mTempNestedScrollConsumed;
-
-    /**
-     * Construct a new helper for a given view.
-     */
-    public NestedScrollingChildHelper(View view) {
-        mView = view;
-    }
-
-    /**
-     * Enable nested scrolling.
-     *
-     * <p>This is a delegate method. Call it from your {@link android.view.View View} subclass
-     * method/{@link NestedScrollingChild} interface method with the same signature to implement
-     * the standard policy.</p>
-     *
-     * @param enabled true to enable nested scrolling dispatch from this view, false otherwise
-     */
-    public void setNestedScrollingEnabled(boolean enabled) {
-        if (mIsNestedScrollingEnabled) {
-            ViewCompat.stopNestedScroll(mView);
-        }
-        mIsNestedScrollingEnabled = enabled;
-    }
-
-    /**
-     * Check if nested scrolling is enabled for this view.
-     *
-     * <p>This is a delegate method. Call it from your {@link android.view.View View} subclass
-     * method/{@link NestedScrollingChild} interface method with the same signature to implement
-     * the standard policy.</p>
-     *
-     * @return true if nested scrolling is enabled for this view
-     */
-    public boolean isNestedScrollingEnabled() {
-        return mIsNestedScrollingEnabled;
-    }
-
-    /**
-     * Check if this view has a nested scrolling parent view currently receiving events for
-     * a nested scroll in progress.
-     *
-     * <p>This is a delegate method. Call it from your {@link android.view.View View} subclass
-     * method/{@link NestedScrollingChild} interface method with the same signature to implement
-     * the standard policy.</p>
-     *
-     * @return true if this view has a nested scrolling parent, false otherwise
-     */
-    public boolean hasNestedScrollingParent() {
-        return mNestedScrollingParent != null;
-    }
-
-    /**
-     * Start a new nested scroll for this view.
-     *
-     * <p>This is a delegate method. Call it from your {@link android.view.View View} subclass
-     * method/{@link NestedScrollingChild} interface method with the same signature to implement
-     * the standard policy.</p>
-     *
-     * @param axes Supported nested scroll axes.
-     *             See {@link NestedScrollingChild#startNestedScroll(int)}.
-     * @return true if a cooperating parent view was found and nested scrolling started successfully
-     */
-    public boolean startNestedScroll(int axes) {
-        if (hasNestedScrollingParent()) {
-            // Already in progress
-            return true;
-        }
-        if (isNestedScrollingEnabled()) {
-            ViewParent p = mView.getParent();
-            View child = mView;
-            while (p != null) {
-                if (ViewParentCompat.onStartNestedScroll(p, child, mView, axes)) {
-                    mNestedScrollingParent = p;
-                    ViewParentCompat.onNestedScrollAccepted(p, child, mView, axes);
-                    return true;
-                }
-                if (p instanceof View) {
-                    child = (View) p;
-                }
-                p = p.getParent();
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Stop a nested scroll in progress.
-     *
-     * <p>This is a delegate method. Call it from your {@link android.view.View View} subclass
-     * method/{@link NestedScrollingChild} interface method with the same signature to implement
-     * the standard policy.</p>
-     */
-    public void stopNestedScroll() {
-        if (mNestedScrollingParent != null) {
-            ViewParentCompat.onStopNestedScroll(mNestedScrollingParent, mView);
-            mNestedScrollingParent = null;
-        }
-    }
-
-    /**
-     * Dispatch one step of a nested scrolling operation to the current nested scrolling parent.
-     *
-     * <p>This is a delegate method. Call it from your {@link android.view.View View} subclass
-     * method/{@link NestedScrollingChild} interface method with the same signature to implement
-     * the standard policy.</p>
-     *
-     * @return true if the parent consumed any of the nested scroll
-     */
-    public boolean dispatchNestedScroll(int dxConsumed, int dyConsumed,
-            int dxUnconsumed, int dyUnconsumed, int[] offsetInWindow) {
-        if (isNestedScrollingEnabled() && mNestedScrollingParent != null) {
-            if (dxConsumed != 0 || dyConsumed != 0 || dxUnconsumed != 0 || dyUnconsumed != 0) {
-                int startX = 0;
-                int startY = 0;
-                if (offsetInWindow != null) {
-                    mView.getLocationInWindow(offsetInWindow);
-                    startX = offsetInWindow[0];
-                    startY = offsetInWindow[1];
-                }
-
-                ViewParentCompat.onNestedScroll(mNestedScrollingParent, mView, dxConsumed,
-                        dyConsumed, dxUnconsumed, dyUnconsumed);
-
-                if (offsetInWindow != null) {
-                    mView.getLocationInWindow(offsetInWindow);
-                    offsetInWindow[0] -= startX;
-                    offsetInWindow[1] -= startY;
-                }
-                return true;
-            } else if (offsetInWindow != null) {
-                // No motion, no dispatch. Keep offsetInWindow up to date.
-                offsetInWindow[0] = 0;
-                offsetInWindow[1] = 0;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Dispatch one step of a nested pre-scrolling operation to the current nested scrolling parent.
-     *
-     * <p>This is a delegate method. Call it from your {@link android.view.View View} subclass
-     * method/{@link NestedScrollingChild} interface method with the same signature to implement
-     * the standard policy.</p>
-     *
-     * @return true if the parent consumed any of the nested scroll
-     */
-    public boolean dispatchNestedPreScroll(int dx, int dy, int[] consumed, int[] offsetInWindow) {
-        if (isNestedScrollingEnabled() && mNestedScrollingParent != null) {
-            if (dx != 0 || dy != 0) {
-                int startX = 0;
-                int startY = 0;
-                if (offsetInWindow != null) {
-                    mView.getLocationInWindow(offsetInWindow);
-                    startX = offsetInWindow[0];
-                    startY = offsetInWindow[1];
-                }
-
-                if (consumed == null) {
-                    if (mTempNestedScrollConsumed == null) {
-                        mTempNestedScrollConsumed = new int[2];
-                    }
-                    consumed = mTempNestedScrollConsumed;
-                }
-                consumed[0] = 0;
-                consumed[1] = 0;
-                ViewParentCompat.onNestedPreScroll(mNestedScrollingParent, mView, dx, dy, consumed);
-
-                if (offsetInWindow != null) {
-                    mView.getLocationInWindow(offsetInWindow);
-                    offsetInWindow[0] -= startX;
-                    offsetInWindow[1] -= startY;
-                }
-                return consumed[0] != 0 || consumed[1] != 0;
-            } else if (offsetInWindow != null) {
-                offsetInWindow[0] = 0;
-                offsetInWindow[1] = 0;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Dispatch a nested fling operation to the current nested scrolling parent.
-     *
-     * <p>This is a delegate method. Call it from your {@link android.view.View View} subclass
-     * method/{@link NestedScrollingChild} interface method with the same signature to implement
-     * the standard policy.</p>
-     *
-     * @return true if the parent consumed the nested fling
-     */
-    public boolean dispatchNestedFling(float velocityX, float velocityY, boolean consumed) {
-        if (isNestedScrollingEnabled() && mNestedScrollingParent != null) {
-            return ViewParentCompat.onNestedFling(mNestedScrollingParent, mView, velocityX,
-                    velocityY, consumed);
-        }
-        return false;
-    }
-
-    /**
-     * Dispatch a nested pre-fling operation to the current nested scrolling parent.
-     *
-     * <p>This is a delegate method. Call it from your {@link android.view.View View} subclass
-     * method/{@link NestedScrollingChild} interface method with the same signature to implement
-     * the standard policy.</p>
-     *
-     * @return true if the parent consumed the nested fling
-     */
-    public boolean dispatchNestedPreFling(float velocityX, float velocityY) {
-        if (isNestedScrollingEnabled() && mNestedScrollingParent != null) {
-            return ViewParentCompat.onNestedPreFling(mNestedScrollingParent, mView, velocityX,
-                    velocityY);
-        }
-        return false;
-    }
-
-    /**
-     * View subclasses should always call this method on their
-     * <code>NestedScrollingChildHelper</code> when detached from a window.
-     *
-     * <p>This is a delegate method. Call it from your {@link android.view.View View} subclass
-     * method/{@link NestedScrollingChild} interface method with the same signature to implement
-     * the standard policy.</p>
-     */
-    public void onDetachedFromWindow() {
-        ViewCompat.stopNestedScroll(mView);
-    }
-
-    /**
-     * Called when a nested scrolling child stops its current nested scroll operation.
-     *
-     * <p>This is a delegate method. Call it from your {@link android.view.View View} subclass
-     * method/{@link NestedScrollingChild} interface method with the same signature to implement
-     * the standard policy.</p>
-     *
-     * @param child Child view stopping its nested scroll. This may not be a direct child view.
-     */
-    public void onStopNestedScroll(View child) {
-        ViewCompat.stopNestedScroll(mView);
-    }
-}
diff --git a/v4/java/android/support/v4/view/NestedScrollingParentHelper.java b/v4/java/android/support/v4/view/NestedScrollingParentHelper.java
deleted file mode 100644
index 91522f1..0000000
--- a/v4/java/android/support/v4/view/NestedScrollingParentHelper.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.v4.view;
-
-import android.view.View;
-import android.view.ViewGroup;
-
-/**
- * Helper class for implementing nested scrolling parent views compatible with Android platform
- * versions earlier than Android 5.0 Lollipop (API 21).
- *
- * <p>{@link android.view.ViewGroup ViewGroup} subclasses should instantiate a final instance
- * of this class as a field at construction. For each <code>ViewGroup</code> method that has
- * a matching method signature in this class, delegate the operation to the helper instance
- * in an overriden method implementation. This implements the standard framework policy
- * for nested scrolling.</p>
- *
- * <p>Views invoking nested scrolling functionality should always do so from the relevant
- * {@link ViewCompat}, {@link ViewGroupCompat} or {@link ViewParentCompat} compatibility
- * shim static methods. This ensures interoperability with nested scrolling views on Android
- * 5.0 Lollipop and newer.</p>
- */
-public class NestedScrollingParentHelper {
-    private final ViewGroup mViewGroup;
-    private int mNestedScrollAxes;
-
-    /**
-     * Construct a new helper for a given ViewGroup
-     */
-    public NestedScrollingParentHelper(ViewGroup viewGroup) {
-        mViewGroup = viewGroup;
-    }
-
-    /**
-     * Called when a nested scrolling operation initiated by a descendant view is accepted
-     * by this ViewGroup.
-     *
-     * <p>This is a delegate method. Call it from your {@link android.view.ViewGroup ViewGroup}
-     * subclass method/{@link NestedScrollingParent} interface method with the same signature
-     * to implement the standard policy.</p>
-     */
-    public void onNestedScrollAccepted(View child, View target, int axes) {
-        mNestedScrollAxes = axes;
-    }
-
-    /**
-     * Return the current axes of nested scrolling for this ViewGroup.
-     *
-     * <p>This is a delegate method. Call it from your {@link android.view.ViewGroup ViewGroup}
-     * subclass method/{@link NestedScrollingParent} interface method with the same signature
-     * to implement the standard policy.</p>
-     */
-    public int getNestedScrollAxes() {
-        return mNestedScrollAxes;
-    }
-
-    /**
-     * React to a nested scroll operation ending.
-     *
-     * <p>This is a delegate method. Call it from your {@link android.view.ViewGroup ViewGroup}
-     * subclass method/{@link NestedScrollingParent} interface method with the same signature
-     * to implement the standard policy.</p>
-     *
-     * @param target View that initiated the nested scroll
-     */
-    public void onStopNestedScroll(View target) {
-        mNestedScrollAxes = 0;
-    }
-}
diff --git a/v4/java/android/support/v4/view/PagerTitleStrip.java b/v4/java/android/support/v4/view/PagerTitleStrip.java
deleted file mode 100644
index 288e1a0..0000000
--- a/v4/java/android/support/v4/view/PagerTitleStrip.java
+++ /dev/null
@@ -1,520 +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 android.support.v4.view;
-
-import android.content.Context;
-import android.content.res.TypedArray;
-import android.database.DataSetObserver;
-import android.graphics.drawable.Drawable;
-import android.support.annotation.ColorInt;
-import android.support.annotation.FloatRange;
-import android.text.TextUtils.TruncateAt;
-import android.util.AttributeSet;
-import android.util.TypedValue;
-import android.view.Gravity;
-import android.view.ViewGroup;
-import android.view.ViewParent;
-import android.widget.TextView;
-
-import java.lang.ref.WeakReference;
-
-/**
- * PagerTitleStrip is a non-interactive indicator of the current, next,
- * and previous pages of a {@link ViewPager}. It is intended to be used as a
- * child view of a ViewPager widget in your XML layout.
- * Add it as a child of a ViewPager in your layout file and set its
- * android:layout_gravity to TOP or BOTTOM to pin it to the top or bottom
- * of the ViewPager. The title from each page is supplied by the method
- * {@link PagerAdapter#getPageTitle(int)} in the adapter supplied to
- * the ViewPager.
- *
- * <p>For an interactive indicator, see {@link PagerTabStrip}.</p>
- */
-@ViewPager.DecorView
-public class PagerTitleStrip extends ViewGroup {
-    private static final String TAG = "PagerTitleStrip";
-
-    ViewPager mPager;
-    TextView mPrevText;
-    TextView mCurrText;
-    TextView mNextText;
-
-    private int mLastKnownCurrentPage = -1;
-    private float mLastKnownPositionOffset = -1;
-    private int mScaledTextSpacing;
-    private int mGravity;
-
-    private boolean mUpdatingText;
-    private boolean mUpdatingPositions;
-
-    private final PageListener mPageListener = new PageListener();
-
-    private WeakReference<PagerAdapter> mWatchingAdapter;
-
-    private static final int[] ATTRS = new int[] {
-        android.R.attr.textAppearance,
-        android.R.attr.textSize,
-        android.R.attr.textColor,
-        android.R.attr.gravity
-    };
-
-    private static final int[] TEXT_ATTRS = new int[] {
-        0x0101038c // android.R.attr.textAllCaps
-    };
-
-    private static final float SIDE_ALPHA = 0.6f;
-    private static final int TEXT_SPACING = 16; // dip
-
-    private int mNonPrimaryAlpha;
-    int mTextColor;
-
-    interface PagerTitleStripImpl {
-        void setSingleLineAllCaps(TextView text);
-    }
-
-    static class PagerTitleStripImplBase implements PagerTitleStripImpl {
-        public void setSingleLineAllCaps(TextView text) {
-            text.setSingleLine();
-        }
-    }
-
-    static class PagerTitleStripImplIcs implements PagerTitleStripImpl {
-        public void setSingleLineAllCaps(TextView text) {
-            PagerTitleStripIcs.setSingleLineAllCaps(text);
-        }
-    }
-
-    private static final PagerTitleStripImpl IMPL;
-    static {
-        if (android.os.Build.VERSION.SDK_INT >= 14) {
-            IMPL = new PagerTitleStripImplIcs();
-        } else {
-            IMPL = new PagerTitleStripImplBase();
-        }
-    }
-
-    private static void setSingleLineAllCaps(TextView text) {
-        IMPL.setSingleLineAllCaps(text);
-    }
-
-    public PagerTitleStrip(Context context) {
-        this(context, null);
-    }
-
-    public PagerTitleStrip(Context context, AttributeSet attrs) {
-        super(context, attrs);
-
-        addView(mPrevText = new TextView(context));
-        addView(mCurrText = new TextView(context));
-        addView(mNextText = new TextView(context));
-
-        final TypedArray a = context.obtainStyledAttributes(attrs, ATTRS);
-        final int textAppearance = a.getResourceId(0, 0);
-        if (textAppearance != 0) {
-            mPrevText.setTextAppearance(context, textAppearance);
-            mCurrText.setTextAppearance(context, textAppearance);
-            mNextText.setTextAppearance(context, textAppearance);
-        }
-        final int textSize = a.getDimensionPixelSize(1, 0);
-        if (textSize != 0) {
-            setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize);
-        }
-        if (a.hasValue(2)) {
-            final int textColor = a.getColor(2, 0);
-            mPrevText.setTextColor(textColor);
-            mCurrText.setTextColor(textColor);
-            mNextText.setTextColor(textColor);
-        }
-        mGravity = a.getInteger(3, Gravity.BOTTOM);
-        a.recycle();
-
-        mTextColor = mCurrText.getTextColors().getDefaultColor();
-        setNonPrimaryAlpha(SIDE_ALPHA);
-
-        mPrevText.setEllipsize(TruncateAt.END);
-        mCurrText.setEllipsize(TruncateAt.END);
-        mNextText.setEllipsize(TruncateAt.END);
-
-        boolean allCaps = false;
-        if (textAppearance != 0) {
-            final TypedArray ta = context.obtainStyledAttributes(textAppearance, TEXT_ATTRS);
-            allCaps = ta.getBoolean(0, false);
-            ta.recycle();
-        }
-
-        if (allCaps) {
-            setSingleLineAllCaps(mPrevText);
-            setSingleLineAllCaps(mCurrText);
-            setSingleLineAllCaps(mNextText);
-        } else {
-            mPrevText.setSingleLine();
-            mCurrText.setSingleLine();
-            mNextText.setSingleLine();
-        }
-
-        final float density = context.getResources().getDisplayMetrics().density;
-        mScaledTextSpacing = (int) (TEXT_SPACING * density);
-    }
-
-    /**
-     * Set the required spacing between title segments.
-     *
-     * @param spacingPixels Spacing between each title displayed in pixels
-     */
-    public void setTextSpacing(int spacingPixels) {
-        mScaledTextSpacing = spacingPixels;
-        requestLayout();
-    }
-
-    /**
-     * @return The required spacing between title segments in pixels
-     */
-    public int getTextSpacing() {
-        return mScaledTextSpacing;
-    }
-
-    /**
-     * Set the alpha value used for non-primary page titles.
-     *
-     * @param alpha Opacity value in the range 0-1f
-     */
-    public void setNonPrimaryAlpha(@FloatRange(from=0.0, to=1.0) float alpha) {
-        mNonPrimaryAlpha = (int) (alpha * 255) & 0xFF;
-        final int transparentColor = (mNonPrimaryAlpha << 24) | (mTextColor & 0xFFFFFF);
-        mPrevText.setTextColor(transparentColor);
-        mNextText.setTextColor(transparentColor);
-    }
-
-    /**
-     * Set the color value used as the base color for all displayed page titles.
-     * Alpha will be ignored for non-primary page titles. See {@link #setNonPrimaryAlpha(float)}.
-     *
-     * @param color Color hex code in 0xAARRGGBB format
-     */
-    public void setTextColor(@ColorInt int color) {
-        mTextColor = color;
-        mCurrText.setTextColor(color);
-        final int transparentColor = (mNonPrimaryAlpha << 24) | (mTextColor & 0xFFFFFF);
-        mPrevText.setTextColor(transparentColor);
-        mNextText.setTextColor(transparentColor);
-    }
-
-    /**
-     * Set the default text size to a given unit and value.
-     * See {@link TypedValue} for the possible dimension units.
-     *
-     * <p>Example: to set the text size to 14px, use
-     * setTextSize(TypedValue.COMPLEX_UNIT_PX, 14);</p>
-     *
-     * @param unit The desired dimension unit
-     * @param size The desired size in the given units
-     */
-    public void setTextSize(int unit, float size) {
-        mPrevText.setTextSize(unit, size);
-        mCurrText.setTextSize(unit, size);
-        mNextText.setTextSize(unit, size);
-    }
-
-    /**
-     * Set the {@link Gravity} used to position text within the title strip.
-     * Only the vertical gravity component is used.
-     *
-     * @param gravity {@link Gravity} constant for positioning title text
-     */
-    public void setGravity(int gravity) {
-        mGravity = gravity;
-        requestLayout();
-    }
-
-    @Override
-    protected void onAttachedToWindow() {
-        super.onAttachedToWindow();
-
-        final ViewParent parent = getParent();
-        if (!(parent instanceof ViewPager)) {
-            throw new IllegalStateException(
-                    "PagerTitleStrip must be a direct child of a ViewPager.");
-        }
-
-        final ViewPager pager = (ViewPager) parent;
-        final PagerAdapter adapter = pager.getAdapter();
-
-        pager.setInternalPageChangeListener(mPageListener);
-        pager.addOnAdapterChangeListener(mPageListener);
-        mPager = pager;
-        updateAdapter(mWatchingAdapter != null ? mWatchingAdapter.get() : null, adapter);
-    }
-
-    @Override
-    protected void onDetachedFromWindow() {
-        super.onDetachedFromWindow();
-        if (mPager != null) {
-            updateAdapter(mPager.getAdapter(), null);
-            mPager.setInternalPageChangeListener(null);
-            mPager.removeOnAdapterChangeListener(mPageListener);
-            mPager = null;
-        }
-    }
-
-    void updateText(int currentItem, PagerAdapter adapter) {
-        final int itemCount = adapter != null ? adapter.getCount() : 0;
-        mUpdatingText = true;
-
-        CharSequence text = null;
-        if (currentItem >= 1 && adapter != null) {
-            text = adapter.getPageTitle(currentItem - 1);
-        }
-        mPrevText.setText(text);
-
-        mCurrText.setText(adapter != null && currentItem < itemCount ?
-                adapter.getPageTitle(currentItem) : null);
-
-        text = null;
-        if (currentItem + 1 < itemCount && adapter != null) {
-            text = adapter.getPageTitle(currentItem + 1);
-        }
-        mNextText.setText(text);
-
-        // Measure everything
-        final int width = getWidth() - getPaddingLeft() - getPaddingRight();
-        final int maxWidth = Math.max(0, (int) (width * 0.8f));
-        final int childWidthSpec = MeasureSpec.makeMeasureSpec(maxWidth, MeasureSpec.AT_MOST);
-        final int childHeight = getHeight() - getPaddingTop() - getPaddingBottom();
-        final int maxHeight = Math.max(0, childHeight);
-        final int childHeightSpec = MeasureSpec.makeMeasureSpec(maxHeight, MeasureSpec.AT_MOST);
-        mPrevText.measure(childWidthSpec, childHeightSpec);
-        mCurrText.measure(childWidthSpec, childHeightSpec);
-        mNextText.measure(childWidthSpec, childHeightSpec);
-
-        mLastKnownCurrentPage = currentItem;
-
-        if (!mUpdatingPositions) {
-            updateTextPositions(currentItem, mLastKnownPositionOffset, false);
-        }
-
-        mUpdatingText = false;
-    }
-
-    @Override
-    public void requestLayout() {
-        if (!mUpdatingText) {
-            super.requestLayout();
-        }
-    }
-
-    void updateAdapter(PagerAdapter oldAdapter, PagerAdapter newAdapter) {
-        if (oldAdapter != null) {
-            oldAdapter.unregisterDataSetObserver(mPageListener);
-            mWatchingAdapter = null;
-        }
-        if (newAdapter != null) {
-            newAdapter.registerDataSetObserver(mPageListener);
-            mWatchingAdapter = new WeakReference<PagerAdapter>(newAdapter);
-        }
-        if (mPager != null) {
-            mLastKnownCurrentPage = -1;
-            mLastKnownPositionOffset = -1;
-            updateText(mPager.getCurrentItem(), newAdapter);
-            requestLayout();
-        }
-    }
-
-    void updateTextPositions(int position, float positionOffset, boolean force) {
-        if (position != mLastKnownCurrentPage) {
-            updateText(position, mPager.getAdapter());
-        } else if (!force && positionOffset == mLastKnownPositionOffset) {
-            return;
-        }
-
-        mUpdatingPositions = true;
-
-        final int prevWidth = mPrevText.getMeasuredWidth();
-        final int currWidth = mCurrText.getMeasuredWidth();
-        final int nextWidth = mNextText.getMeasuredWidth();
-        final int halfCurrWidth = currWidth / 2;
-
-        final int stripWidth = getWidth();
-        final int stripHeight = getHeight();
-        final int paddingLeft = getPaddingLeft();
-        final int paddingRight = getPaddingRight();
-        final int paddingTop = getPaddingTop();
-        final int paddingBottom = getPaddingBottom();
-        final int textPaddedLeft = paddingLeft + halfCurrWidth;
-        final int textPaddedRight = paddingRight + halfCurrWidth;
-        final int contentWidth = stripWidth - textPaddedLeft - textPaddedRight;
-
-        float currOffset = positionOffset + 0.5f;
-        if (currOffset > 1.f) {
-            currOffset -= 1.f;
-        }
-        final int currCenter = stripWidth - textPaddedRight - (int) (contentWidth * currOffset);
-        final int currLeft = currCenter - currWidth / 2;
-        final int currRight = currLeft + currWidth;
-
-        final int prevBaseline = mPrevText.getBaseline();
-        final int currBaseline = mCurrText.getBaseline();
-        final int nextBaseline = mNextText.getBaseline();
-        final int maxBaseline = Math.max(Math.max(prevBaseline, currBaseline), nextBaseline);
-        final int prevTopOffset = maxBaseline - prevBaseline;
-        final int currTopOffset = maxBaseline - currBaseline;
-        final int nextTopOffset = maxBaseline - nextBaseline;
-        final int alignedPrevHeight = prevTopOffset + mPrevText.getMeasuredHeight();
-        final int alignedCurrHeight = currTopOffset + mCurrText.getMeasuredHeight();
-        final int alignedNextHeight = nextTopOffset + mNextText.getMeasuredHeight();
-        final int maxTextHeight = Math.max(Math.max(alignedPrevHeight, alignedCurrHeight),
-                alignedNextHeight);
-
-        final int vgrav = mGravity & Gravity.VERTICAL_GRAVITY_MASK;
-
-        int prevTop;
-        int currTop;
-        int nextTop;
-        switch (vgrav) {
-            default:
-            case Gravity.TOP:
-                prevTop = paddingTop + prevTopOffset;
-                currTop = paddingTop + currTopOffset;
-                nextTop = paddingTop + nextTopOffset;
-                break;
-            case Gravity.CENTER_VERTICAL:
-                final int paddedHeight = stripHeight - paddingTop - paddingBottom;
-                final int centeredTop = (paddedHeight - maxTextHeight) / 2;
-                prevTop = centeredTop + prevTopOffset;
-                currTop = centeredTop + currTopOffset;
-                nextTop = centeredTop + nextTopOffset;
-                break;
-            case Gravity.BOTTOM:
-                final int bottomGravTop = stripHeight - paddingBottom - maxTextHeight;
-                prevTop = bottomGravTop + prevTopOffset;
-                currTop = bottomGravTop + currTopOffset;
-                nextTop = bottomGravTop + nextTopOffset;
-                break;
-        }
-
-        mCurrText.layout(currLeft, currTop, currRight,
-                currTop + mCurrText.getMeasuredHeight());
-
-        final int prevLeft = Math.min(paddingLeft, currLeft - mScaledTextSpacing - prevWidth);
-        mPrevText.layout(prevLeft, prevTop, prevLeft + prevWidth,
-                prevTop + mPrevText.getMeasuredHeight());
-
-        final int nextLeft = Math.max(stripWidth - paddingRight - nextWidth,
-                currRight + mScaledTextSpacing);
-        mNextText.layout(nextLeft, nextTop, nextLeft + nextWidth,
-                nextTop + mNextText.getMeasuredHeight());
-
-        mLastKnownPositionOffset = positionOffset;
-        mUpdatingPositions = false;
-    }
-
-    @Override
-    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
-        final int widthMode = MeasureSpec.getMode(widthMeasureSpec);
-        if (widthMode != MeasureSpec.EXACTLY) {
-            throw new IllegalStateException("Must measure with an exact width");
-        }
-
-        final int heightPadding = getPaddingTop() + getPaddingBottom();
-        final int childHeightSpec = getChildMeasureSpec(heightMeasureSpec,
-                heightPadding, LayoutParams.WRAP_CONTENT);
-
-        final int widthSize = MeasureSpec.getSize(widthMeasureSpec);
-        final int widthPadding = (int) (widthSize * 0.2f);
-        final int childWidthSpec = getChildMeasureSpec(widthMeasureSpec,
-                widthPadding, LayoutParams.WRAP_CONTENT);
-
-        mPrevText.measure(childWidthSpec, childHeightSpec);
-        mCurrText.measure(childWidthSpec, childHeightSpec);
-        mNextText.measure(childWidthSpec, childHeightSpec);
-
-        final int height;
-        final int heightMode = MeasureSpec.getMode(heightMeasureSpec);
-        if (heightMode == MeasureSpec.EXACTLY) {
-            height = MeasureSpec.getSize(heightMeasureSpec);
-        } else {
-            final int textHeight = mCurrText.getMeasuredHeight();
-            final int minHeight = getMinHeight();
-            height = Math.max(minHeight, textHeight + heightPadding);
-        }
-
-        final int childState = ViewCompat.getMeasuredState(mCurrText);
-        final int measuredHeight = ViewCompat.resolveSizeAndState(height, heightMeasureSpec,
-                childState << ViewCompat.MEASURED_HEIGHT_STATE_SHIFT);
-        setMeasuredDimension(widthSize, measuredHeight);
-    }
-
-    @Override
-    protected void onLayout(boolean changed, int l, int t, int r, int b) {
-        if (mPager != null) {
-            final float offset = mLastKnownPositionOffset >= 0 ? mLastKnownPositionOffset : 0;
-            updateTextPositions(mLastKnownCurrentPage, offset, true);
-        }
-    }
-
-    int getMinHeight() {
-        int minHeight = 0;
-        final Drawable bg = getBackground();
-        if (bg != null) {
-            minHeight = bg.getIntrinsicHeight();
-        }
-        return minHeight;
-    }
-
-    private class PageListener extends DataSetObserver implements ViewPager.OnPageChangeListener,
-            ViewPager.OnAdapterChangeListener {
-        private int mScrollState;
-
-        @Override
-        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
-            if (positionOffset > 0.5f) {
-                // Consider ourselves to be on the next page when we're 50% of the way there.
-                position++;
-            }
-            updateTextPositions(position, positionOffset, false);
-        }
-
-        @Override
-        public void onPageSelected(int position) {
-            if (mScrollState == ViewPager.SCROLL_STATE_IDLE) {
-                // Only update the text here if we're not dragging or settling.
-                updateText(mPager.getCurrentItem(), mPager.getAdapter());
-
-                final float offset = mLastKnownPositionOffset >= 0 ? mLastKnownPositionOffset : 0;
-                updateTextPositions(mPager.getCurrentItem(), offset, true);
-            }
-        }
-
-        @Override
-        public void onPageScrollStateChanged(int state) {
-            mScrollState = state;
-        }
-
-        @Override
-        public void onAdapterChanged(ViewPager viewPager, PagerAdapter oldAdapter,
-                PagerAdapter newAdapter) {
-            updateAdapter(oldAdapter, newAdapter);
-        }
-
-        @Override
-        public void onChanged() {
-            updateText(mPager.getCurrentItem(), mPager.getAdapter());
-
-            final float offset = mLastKnownPositionOffset >= 0 ? mLastKnownPositionOffset : 0;
-            updateTextPositions(mPager.getCurrentItem(), offset, true);
-        }
-    }
-}
diff --git a/v4/java/android/support/v4/view/ViewCompat.java b/v4/java/android/support/v4/view/ViewCompat.java
deleted file mode 100644
index 422d9d1..0000000
--- a/v4/java/android/support/v4/view/ViewCompat.java
+++ /dev/null
@@ -1,3464 +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 android.support.v4.view;
-
-import android.content.res.ColorStateList;
-import android.graphics.Matrix;
-import android.graphics.Paint;
-import android.graphics.PixelFormat;
-import android.graphics.PorterDuff;
-import android.graphics.Rect;
-import android.graphics.drawable.Drawable;
-import android.os.Bundle;
-import android.support.annotation.FloatRange;
-import android.support.annotation.IdRes;
-import android.support.annotation.IntDef;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.v4.os.BuildCompat;
-import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat;
-import android.support.v4.view.accessibility.AccessibilityNodeProviderCompat;
-import android.util.Log;
-import android.view.MotionEvent;
-import android.view.VelocityTracker;
-import android.view.View;
-import android.view.ViewConfiguration;
-import android.view.ViewGroup;
-import android.view.ViewParent;
-import android.view.accessibility.AccessibilityEvent;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-import java.util.WeakHashMap;
-
-/**
- * Helper for accessing features in {@link View} introduced after API
- * level 4 in a backwards compatible fashion.
- */
-public class ViewCompat {
-    private static final String TAG = "ViewCompat";
-
-    /** @hide */
-    @IntDef({View.FOCUS_LEFT, View.FOCUS_UP, View.FOCUS_RIGHT, View.FOCUS_DOWN,
-            View.FOCUS_FORWARD, View.FOCUS_BACKWARD})
-    @Retention(RetentionPolicy.SOURCE)
-    public @interface FocusDirection {}
-
-    /** @hide */
-    @IntDef({View.FOCUS_LEFT, View.FOCUS_UP, View.FOCUS_RIGHT, View.FOCUS_DOWN})
-    @Retention(RetentionPolicy.SOURCE)
-    public @interface FocusRealDirection {}
-
-    /** @hide */
-    @IntDef({View.FOCUS_FORWARD, View.FOCUS_BACKWARD})
-    @Retention(RetentionPolicy.SOURCE)
-    public @interface FocusRelativeDirection {}
-
-    /** @hide */
-    @IntDef({OVER_SCROLL_ALWAYS, OVER_SCROLL_IF_CONTENT_SCROLLS, OVER_SCROLL_NEVER})
-    @Retention(RetentionPolicy.SOURCE)
-    private @interface OverScroll {}
-
-    /**
-     * Always allow a user to over-scroll this view, provided it is a
-     * view that can scroll.
-     */
-    public static final int OVER_SCROLL_ALWAYS = 0;
-
-    /**
-     * Allow a user to over-scroll this view only if the content is large
-     * enough to meaningfully scroll, provided it is a view that can scroll.
-     */
-    public static final int OVER_SCROLL_IF_CONTENT_SCROLLS = 1;
-
-    /**
-     * Never allow a user to over-scroll this view.
-     */
-    public static final int OVER_SCROLL_NEVER = 2;
-
-    private static final long FAKE_FRAME_TIME = 10;
-
-    /** @hide */
-    @IntDef({
-            IMPORTANT_FOR_ACCESSIBILITY_AUTO,
-            IMPORTANT_FOR_ACCESSIBILITY_YES,
-            IMPORTANT_FOR_ACCESSIBILITY_NO,
-            IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS
-    })
-    @Retention(RetentionPolicy.SOURCE)
-    private @interface ImportantForAccessibility {}
-
-    /**
-     * Automatically determine whether a view is important for accessibility.
-     */
-    public static final int IMPORTANT_FOR_ACCESSIBILITY_AUTO = 0x00000000;
-
-    /**
-     * The view is important for accessibility.
-     */
-    public static final int IMPORTANT_FOR_ACCESSIBILITY_YES = 0x00000001;
-
-    /**
-     * The view is not important for accessibility.
-     */
-    public static final int IMPORTANT_FOR_ACCESSIBILITY_NO = 0x00000002;
-
-    /**
-     * The view is not important for accessibility, nor are any of its
-     * descendant views.
-     */
-    public static final int IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS = 0x00000004;
-
-    /** @hide */
-    @IntDef({
-            ACCESSIBILITY_LIVE_REGION_NONE,
-            ACCESSIBILITY_LIVE_REGION_POLITE,
-            ACCESSIBILITY_LIVE_REGION_ASSERTIVE
-    })
-    @Retention(RetentionPolicy.SOURCE)
-    private @interface AccessibilityLiveRegion {}
-
-    /**
-     * Live region mode specifying that accessibility services should not
-     * automatically announce changes to this view. This is the default live
-     * region mode for most views.
-     * <p>
-     * Use with {@link ViewCompat#setAccessibilityLiveRegion(View, int)}.
-     */
-    public static final int ACCESSIBILITY_LIVE_REGION_NONE = 0x00000000;
-
-    /**
-     * Live region mode specifying that accessibility services should announce
-     * changes to this view.
-     * <p>
-     * Use with {@link ViewCompat#setAccessibilityLiveRegion(View, int)}.
-     */
-    public static final int ACCESSIBILITY_LIVE_REGION_POLITE = 0x00000001;
-
-    /**
-     * Live region mode specifying that accessibility services should interrupt
-     * ongoing speech to immediately announce changes to this view.
-     * <p>
-     * Use with {@link ViewCompat#setAccessibilityLiveRegion(View, int)}.
-     */
-    public static final int ACCESSIBILITY_LIVE_REGION_ASSERTIVE = 0x00000002;
-
-    /** @hide */
-    @IntDef({LAYER_TYPE_NONE, LAYER_TYPE_SOFTWARE, LAYER_TYPE_HARDWARE})
-    @Retention(RetentionPolicy.SOURCE)
-    private @interface LayerType {}
-
-    /**
-     * Indicates that the view does not have a layer.
-     */
-    public static final int LAYER_TYPE_NONE = 0;
-
-    /**
-     * <p>Indicates that the view has a software layer. A software layer is backed
-     * by a bitmap and causes the view to be rendered using Android's software
-     * rendering pipeline, even if hardware acceleration is enabled.</p>
-     *
-     * <p>Software layers have various usages:</p>
-     * <p>When the application is not using hardware acceleration, a software layer
-     * is useful to apply a specific color filter and/or blending mode and/or
-     * translucency to a view and all its children.</p>
-     * <p>When the application is using hardware acceleration, a software layer
-     * is useful to render drawing primitives not supported by the hardware
-     * accelerated pipeline. It can also be used to cache a complex view tree
-     * into a texture and reduce the complexity of drawing operations. For instance,
-     * when animating a complex view tree with a translation, a software layer can
-     * be used to render the view tree only once.</p>
-     * <p>Software layers should be avoided when the affected view tree updates
-     * often. Every update will require to re-render the software layer, which can
-     * potentially be slow (particularly when hardware acceleration is turned on
-     * since the layer will have to be uploaded into a hardware texture after every
-     * update.)</p>
-     */
-    public static final int LAYER_TYPE_SOFTWARE = 1;
-
-    /**
-     * <p>Indicates that the view has a hardware layer. A hardware layer is backed
-     * by a hardware specific texture (generally Frame Buffer Objects or FBO on
-     * OpenGL hardware) and causes the view to be rendered using Android's hardware
-     * rendering pipeline, but only if hardware acceleration is turned on for the
-     * view hierarchy. When hardware acceleration is turned off, hardware layers
-     * behave exactly as {@link #LAYER_TYPE_SOFTWARE software layers}.</p>
-     *
-     * <p>A hardware layer is useful to apply a specific color filter and/or
-     * blending mode and/or translucency to a view and all its children.</p>
-     * <p>A hardware layer can be used to cache a complex view tree into a
-     * texture and reduce the complexity of drawing operations. For instance,
-     * when animating a complex view tree with a translation, a hardware layer can
-     * be used to render the view tree only once.</p>
-     * <p>A hardware layer can also be used to increase the rendering quality when
-     * rotation transformations are applied on a view. It can also be used to
-     * prevent potential clipping issues when applying 3D transforms on a view.</p>
-     */
-    public static final int LAYER_TYPE_HARDWARE = 2;
-
-    /** @hide */
-    @IntDef({
-            LAYOUT_DIRECTION_LTR,
-            LAYOUT_DIRECTION_RTL,
-            LAYOUT_DIRECTION_INHERIT,
-            LAYOUT_DIRECTION_LOCALE})
-    @Retention(RetentionPolicy.SOURCE)
-    private @interface LayoutDirectionMode {}
-
-    /** @hide */
-    @IntDef({
-            LAYOUT_DIRECTION_LTR,
-            LAYOUT_DIRECTION_RTL
-    })
-    @Retention(RetentionPolicy.SOURCE)
-    private @interface ResolvedLayoutDirectionMode {}
-
-    /**
-     * Horizontal layout direction of this view is from Left to Right.
-     */
-    public static final int LAYOUT_DIRECTION_LTR = 0;
-
-    /**
-     * Horizontal layout direction of this view is from Right to Left.
-     */
-    public static final int LAYOUT_DIRECTION_RTL = 1;
-
-    /**
-     * Horizontal layout direction of this view is inherited from its parent.
-     * Use with {@link #setLayoutDirection}.
-     */
-    public static final int LAYOUT_DIRECTION_INHERIT = 2;
-
-    /**
-     * Horizontal layout direction of this view is from deduced from the default language
-     * script for the locale. Use with {@link #setLayoutDirection}.
-     */
-    public static final int LAYOUT_DIRECTION_LOCALE = 3;
-
-    /**
-     * Bits of {@link #getMeasuredWidthAndState} and
-     * {@link #getMeasuredWidthAndState} that provide the actual measured size.
-     */
-    public static final int MEASURED_SIZE_MASK = 0x00ffffff;
-
-    /**
-     * Bits of {@link #getMeasuredWidthAndState} and
-     * {@link #getMeasuredWidthAndState} that provide the additional state bits.
-     */
-    public static final int MEASURED_STATE_MASK = 0xff000000;
-
-    /**
-     * Bit shift of {@link #MEASURED_STATE_MASK} to get to the height bits
-     * for functions that combine both width and height into a single int,
-     * such as {@link #getMeasuredState} and the childState argument of
-     * {@link #resolveSizeAndState(int, int, int)}.
-     */
-    public static final int MEASURED_HEIGHT_STATE_SHIFT = 16;
-
-    /**
-     * Bit of {@link #getMeasuredWidthAndState} and
-     * {@link #getMeasuredWidthAndState} that indicates the measured size
-     * is smaller that the space the view would like to have.
-     */
-    public static final int MEASURED_STATE_TOO_SMALL = 0x01000000;
-
-    /**
-     * Indicates no axis of view scrolling.
-     */
-    public static final int SCROLL_AXIS_NONE = 0;
-
-    /**
-     * Indicates scrolling along the horizontal axis.
-     */
-    public static final int SCROLL_AXIS_HORIZONTAL = 1 << 0;
-
-    /**
-     * Indicates scrolling along the vertical axis.
-     */
-    public static final int SCROLL_AXIS_VERTICAL = 1 << 1;
-
-    /** @hide */
-    @Retention(RetentionPolicy.SOURCE)
-    @IntDef(flag = true,
-            value = {
-                    SCROLL_INDICATOR_TOP,
-                    SCROLL_INDICATOR_BOTTOM,
-                    SCROLL_INDICATOR_LEFT,
-                    SCROLL_INDICATOR_RIGHT,
-                    SCROLL_INDICATOR_START,
-                    SCROLL_INDICATOR_END,
-            })
-    public @interface ScrollIndicators {}
-
-    /**
-     * Scroll indicator direction for the top edge of the view.
-     *
-     * @see #setScrollIndicators(View, int)
-     * @see #setScrollIndicators(View, int, int)
-     * @see #getScrollIndicators(View)
-     */
-    public static final int SCROLL_INDICATOR_TOP = 0x1;
-
-    /**
-     * Scroll indicator direction for the bottom edge of the view.
-     *
-     * @see #setScrollIndicators(View, int)
-     * @see #setScrollIndicators(View, int, int)
-     * @see #getScrollIndicators(View)
-     */
-    public static final int SCROLL_INDICATOR_BOTTOM = 0x2;
-
-    /**
-     * Scroll indicator direction for the left edge of the view.
-     *
-     * @see #setScrollIndicators(View, int)
-     * @see #setScrollIndicators(View, int, int)
-     * @see #getScrollIndicators(View)
-     */
-    public static final int SCROLL_INDICATOR_LEFT = 0x4;
-
-    /**
-     * Scroll indicator direction for the right edge of the view.
-     *
-     * @see #setScrollIndicators(View, int)
-     * @see #setScrollIndicators(View, int, int)
-     * @see #getScrollIndicators(View)
-     */
-    public static final int SCROLL_INDICATOR_RIGHT = 0x8;
-
-    /**
-     * Scroll indicator direction for the starting edge of the view.
-     *
-     * @see #setScrollIndicators(View, int)
-     * @see #setScrollIndicators(View, int, int)
-     * @see #getScrollIndicators(View)
-     */
-    public static final int SCROLL_INDICATOR_START = 0x10;
-
-    /**
-     * Scroll indicator direction for the ending edge of the view.
-     *
-     * @see #setScrollIndicators(View, int)
-     * @see #setScrollIndicators(View, int, int)
-     * @see #getScrollIndicators(View)
-     */
-    public static final int SCROLL_INDICATOR_END = 0x20;
-
-    interface ViewCompatImpl {
-        boolean canScrollHorizontally(View v, int direction);
-        boolean canScrollVertically(View v, int direction);
-        int getOverScrollMode(View v);
-        void setOverScrollMode(View v, int mode);
-        void onInitializeAccessibilityEvent(View v, AccessibilityEvent event);
-        void onPopulateAccessibilityEvent(View v, AccessibilityEvent event);
-        void onInitializeAccessibilityNodeInfo(View v, AccessibilityNodeInfoCompat info);
-        void setAccessibilityDelegate(View v, @Nullable AccessibilityDelegateCompat delegate);
-        boolean hasAccessibilityDelegate(View v);
-        boolean hasTransientState(View view);
-        void setHasTransientState(View view, boolean hasTransientState);
-        void postInvalidateOnAnimation(View view);
-        void postInvalidateOnAnimation(View view, int left, int top, int right, int bottom);
-        void postOnAnimation(View view, Runnable action);
-        void postOnAnimationDelayed(View view, Runnable action, long delayMillis);
-        int getImportantForAccessibility(View view);
-        void setImportantForAccessibility(View view, int mode);
-        boolean isImportantForAccessibility(View view);
-        boolean performAccessibilityAction(View view, int action, Bundle arguments);
-        AccessibilityNodeProviderCompat getAccessibilityNodeProvider(View view);
-        float getAlpha(View view);
-        void setLayerType(View view, int layerType, Paint paint);
-        int getLayerType(View view);
-        int getLabelFor(View view);
-        void setLabelFor(View view, int id);
-        void setLayerPaint(View view, Paint paint);
-        int getLayoutDirection(View view);
-        void setLayoutDirection(View view, int layoutDirection);
-        ViewParent getParentForAccessibility(View view);
-        boolean isOpaque(View view);
-        int resolveSizeAndState(int size, int measureSpec, int childMeasuredState);
-        int getMeasuredWidthAndState(View view);
-        int getMeasuredHeightAndState(View view);
-        int getMeasuredState(View view);
-        int getAccessibilityLiveRegion(View view);
-        void setAccessibilityLiveRegion(View view, int mode);
-        int getPaddingStart(View view);
-        int getPaddingEnd(View view);
-        void setPaddingRelative(View view, int start, int top, int end, int bottom);
-        void dispatchStartTemporaryDetach(View view);
-        void dispatchFinishTemporaryDetach(View view);
-        float getX(View view);
-        float getY(View view);
-        float getRotation(View view);
-        float getRotationX(View view);
-        float getRotationY(View view);
-        float getScaleX(View view);
-        float getScaleY(View view);
-        float getTranslationX(View view);
-        float getTranslationY(View view);
-        @Nullable Matrix getMatrix(View view);
-        int getMinimumWidth(View view);
-        int getMinimumHeight(View view);
-        ViewPropertyAnimatorCompat animate(View view);
-        void setRotation(View view, float value);
-        void setRotationX(View view, float value);
-        void setRotationY(View view, float value);
-        void setScaleX(View view, float value);
-        void setScaleY(View view, float value);
-        void setTranslationX(View view, float value);
-        void setTranslationY(View view, float value);
-        void setX(View view, float value);
-        void setY(View view, float value);
-        void setAlpha(View view, float value);
-        void setPivotX(View view, float value);
-        void setPivotY(View view, float value);
-        float getPivotX(View view);
-        float getPivotY(View view);
-        void setElevation(View view, float elevation);
-        float getElevation(View view);
-        void setTranslationZ(View view, float translationZ);
-        float getTranslationZ(View view);
-        void setClipBounds(View view, Rect clipBounds);
-        Rect getClipBounds(View view);
-        void setTransitionName(View view, String transitionName);
-        String getTransitionName(View view);
-        int getWindowSystemUiVisibility(View view);
-        void requestApplyInsets(View view);
-        void setChildrenDrawingOrderEnabled(ViewGroup viewGroup, boolean enabled);
-        boolean getFitsSystemWindows(View view);
-        boolean hasOverlappingRendering(View view);
-        void setFitsSystemWindows(View view, boolean fitSystemWindows);
-        void jumpDrawablesToCurrentState(View v);
-        void setOnApplyWindowInsetsListener(View view, OnApplyWindowInsetsListener listener);
-        WindowInsetsCompat onApplyWindowInsets(View v, WindowInsetsCompat insets);
-        WindowInsetsCompat dispatchApplyWindowInsets(View v, WindowInsetsCompat insets);
-        void setSaveFromParentEnabled(View view, boolean enabled);
-        void setActivated(View view, boolean activated);
-        boolean isPaddingRelative(View view);
-        ColorStateList getBackgroundTintList(View view);
-        void setBackgroundTintList(View view, ColorStateList tintList);
-        PorterDuff.Mode getBackgroundTintMode(View view);
-        void setBackgroundTintMode(View view, PorterDuff.Mode mode);
-        void setNestedScrollingEnabled(View view, boolean enabled);
-        boolean isNestedScrollingEnabled(View view);
-        boolean startNestedScroll(View view, int axes);
-        void stopNestedScroll(View view);
-        boolean hasNestedScrollingParent(View view);
-        boolean dispatchNestedScroll(View view, int dxConsumed, int dyConsumed, int dxUnconsumed,
-                int dyUnconsumed, int[] offsetInWindow);
-        boolean dispatchNestedPreScroll(View view, int dx, int dy, int[] consumed,
-                int[] offsetInWindow);
-        boolean dispatchNestedFling(View view, float velocityX, float velocityY, boolean consumed);
-        boolean dispatchNestedPreFling(View view, float velocityX, float velocityY);
-        boolean isInLayout(View view);
-        boolean isLaidOut(View view);
-        boolean isLayoutDirectionResolved(View view);
-        int combineMeasuredStates(int curState, int newState);
-        float getZ(View view);
-        void setZ(View view, float z);
-        boolean isAttachedToWindow(View view);
-        boolean hasOnClickListeners(View view);
-        void setScrollIndicators(View view, int indicators);
-        void setScrollIndicators(View view, int indicators, int mask);
-        int getScrollIndicators(View view);
-        void offsetTopAndBottom(View view, int offset);
-        void offsetLeftAndRight(View view, int offset);
-        void setPointerIcon(View view, PointerIconCompat pointerIcon);
-    }
-
-    static class BaseViewCompatImpl implements ViewCompatImpl {
-        private Method mDispatchStartTemporaryDetach;
-        private Method mDispatchFinishTemporaryDetach;
-        private boolean mTempDetachBound;
-        WeakHashMap<View, ViewPropertyAnimatorCompat> mViewPropertyAnimatorCompatMap = null;
-
-
-        public boolean canScrollHorizontally(View v, int direction) {
-            return (v instanceof ScrollingView) &&
-                canScrollingViewScrollHorizontally((ScrollingView) v, direction);
-        }
-        public boolean canScrollVertically(View v, int direction) {
-            return (v instanceof ScrollingView) &&
-                    canScrollingViewScrollVertically((ScrollingView) v, direction);
-        }
-        public int getOverScrollMode(View v) {
-            return OVER_SCROLL_NEVER;
-        }
-        public void setOverScrollMode(View v, int mode) {
-            // Do nothing; API doesn't exist
-        }
-        public void setAccessibilityDelegate(View v, AccessibilityDelegateCompat delegate) {
-            // Do nothing; API doesn't exist
-        }
-
-        @Override
-        public boolean hasAccessibilityDelegate(View v) {
-            return false;
-        }
-
-        public void onPopulateAccessibilityEvent(View v, AccessibilityEvent event) {
-            // Do nothing; API doesn't exist
-        }
-        public void onInitializeAccessibilityEvent(View v, AccessibilityEvent event) {
-         // Do nothing; API doesn't exist
-        }
-        public void onInitializeAccessibilityNodeInfo(View v, AccessibilityNodeInfoCompat info) {
-            // Do nothing; API doesn't exist
-        }
-        public boolean hasTransientState(View view) {
-            // A view can't have transient state if transient state wasn't supported.
-            return false;
-        }
-        public void setHasTransientState(View view, boolean hasTransientState) {
-            // Do nothing; API doesn't exist
-        }
-        public void postInvalidateOnAnimation(View view) {
-            view.invalidate();
-        }
-        public void postInvalidateOnAnimation(View view, int left, int top, int right, int bottom) {
-            view.invalidate(left, top, right, bottom);
-        }
-        public void postOnAnimation(View view, Runnable action) {
-            view.postDelayed(action, getFrameTime());
-        }
-        public void postOnAnimationDelayed(View view, Runnable action, long delayMillis) {
-            view.postDelayed(action, getFrameTime() + delayMillis);
-        }
-        long getFrameTime() {
-            return FAKE_FRAME_TIME;
-        }
-        public int getImportantForAccessibility(View view) {
-            return 0;
-        }
-        public void setImportantForAccessibility(View view, int mode) {
-
-        }
-        public boolean isImportantForAccessibility(View view) {
-            return true;
-        }
-        public boolean performAccessibilityAction(View view, int action, Bundle arguments) {
-            return false;
-        }
-        public AccessibilityNodeProviderCompat getAccessibilityNodeProvider(View view) {
-            return null;
-        }
-        public float getAlpha(View view) {
-            return 1.0f;
-        }
-        public void setLayerType(View view, int layerType, Paint paint) {
-            // No-op until layers became available (HC)
-        }
-        public int getLayerType(View view) {
-            return LAYER_TYPE_NONE;
-        }
-        public int getLabelFor(View view) {
-            return 0;
-        }
-        public void setLabelFor(View view, int id) {
-
-        }
-        public void setLayerPaint(View view, Paint p) {
-            // No-op until layers became available (HC)
-        }
-
-        @Override
-        public int getLayoutDirection(View view) {
-            return LAYOUT_DIRECTION_LTR;
-        }
-
-        @Override
-        public void setLayoutDirection(View view, int layoutDirection) {
-            // No-op
-        }
-
-        @Override
-        public ViewParent getParentForAccessibility(View view) {
-            return view.getParent();
-        }
-
-        @Override
-        public boolean isOpaque(View view) {
-            final Drawable bg = view.getBackground();
-            if (bg != null) {
-                return bg.getOpacity() == PixelFormat.OPAQUE;
-            }
-            return false;
-        }
-
-        public int resolveSizeAndState(int size, int measureSpec, int childMeasuredState) {
-            return View.resolveSize(size, measureSpec);
-        }
-
-        @Override
-        public int getMeasuredWidthAndState(View view) {
-            return view.getMeasuredWidth();
-        }
-
-        @Override
-        public int getMeasuredHeightAndState(View view) {
-            return view.getMeasuredHeight();
-        }
-
-        @Override
-        public int getMeasuredState(View view) {
-            return 0;
-        }
-
-        @Override
-        public int getAccessibilityLiveRegion(View view) {
-            return ACCESSIBILITY_LIVE_REGION_NONE;
-        }
-
-        @Override
-        public void setAccessibilityLiveRegion(View view, int mode) {
-            // No-op
-        }
-
-        @Override
-        public int getPaddingStart(View view) {
-            return view.getPaddingLeft();
-        }
-
-        @Override
-        public int getPaddingEnd(View view) {
-            return view.getPaddingRight();
-        }
-
-        @Override
-        public void setPaddingRelative(View view, int start, int top, int end, int bottom) {
-            view.setPadding(start, top, end, bottom);
-        }
-
-        @Override
-        public void dispatchStartTemporaryDetach(View view) {
-            if (!mTempDetachBound) {
-                bindTempDetach();
-            }
-            if (mDispatchStartTemporaryDetach != null) {
-                try {
-                    mDispatchStartTemporaryDetach.invoke(view);
-                } catch (Exception e) {
-                    Log.d(TAG, "Error calling dispatchStartTemporaryDetach", e);
-                }
-            } else {
-                // Try this instead
-                view.onStartTemporaryDetach();
-            }
-        }
-
-        @Override
-        public void dispatchFinishTemporaryDetach(View view) {
-            if (!mTempDetachBound) {
-                bindTempDetach();
-            }
-            if (mDispatchFinishTemporaryDetach != null) {
-                try {
-                    mDispatchFinishTemporaryDetach.invoke(view);
-                } catch (Exception e) {
-                    Log.d(TAG, "Error calling dispatchFinishTemporaryDetach", e);
-                }
-            } else {
-                // Try this instead
-                view.onFinishTemporaryDetach();
-            }
-        }
-
-        @Override
-        public boolean hasOverlappingRendering(View view) {
-            return true;
-        }
-
-        private void bindTempDetach() {
-            try {
-                mDispatchStartTemporaryDetach = View.class.getDeclaredMethod(
-                        "dispatchStartTemporaryDetach");
-                mDispatchFinishTemporaryDetach = View.class.getDeclaredMethod(
-                        "dispatchFinishTemporaryDetach");
-            } catch (NoSuchMethodException e) {
-                Log.e(TAG, "Couldn't find method", e);
-            }
-            mTempDetachBound = true;
-        }
-
-        @Override
-        public float getTranslationX(View view) {
-            return 0;
-        }
-
-        @Override
-        public float getTranslationY(View view) {
-            return 0;
-        }
-
-        @Override
-        public float getX(View view) {
-            return 0;
-        }
-
-        @Override
-        public float getY(View view) {
-            return 0;
-        }
-
-        @Override
-        public float getRotation(View view) {
-            return 0;
-        }
-
-        @Override
-        public float getRotationX(View view) {
-            return 0;
-        }
-
-        @Override
-        public float getRotationY(View view) {
-            return 0;
-        }
-
-        @Override
-        public float getScaleX(View view) {
-            return 0;
-        }
-
-        @Override
-        public float getScaleY(View view) {
-            return 0;
-        }
-
-        @Override
-        public Matrix getMatrix(View view) {
-            return null;
-        }
-
-        @Override
-        public int getMinimumWidth(View view) {
-            return ViewCompatBase.getMinimumWidth(view);
-        }
-
-        @Override
-        public int getMinimumHeight(View view) {
-            return ViewCompatBase.getMinimumHeight(view);
-        }
-
-        @Override
-        public ViewPropertyAnimatorCompat animate(View view) {
-            return new ViewPropertyAnimatorCompat(view);
-        }
-
-        @Override
-        public void setRotation(View view, float value) {
-            // noop
-        }
-
-        @Override
-        public void setTranslationX(View view, float value) {
-            // noop
-        }
-
-        @Override
-        public void setTranslationY(View view, float value) {
-            // noop
-        }
-
-        @Override
-        public void setAlpha(View view, float value) {
-            // noop
-        }
-
-        @Override
-        public void setRotationX(View view, float value) {
-            // noop
-        }
-
-        @Override
-        public void setRotationY(View view, float value) {
-            // noop
-        }
-
-        @Override
-        public void setScaleX(View view, float value) {
-            // noop
-        }
-
-        @Override
-        public void setScaleY(View view, float value) {
-            // noop
-        }
-
-        @Override
-        public void setX(View view, float value) {
-            // noop
-        }
-
-        @Override
-        public void setY(View view, float value) {
-            // noop
-        }
-
-        @Override
-        public void setPivotX(View view, float value) {
-            // noop
-        }
-
-        @Override
-        public void setPivotY(View view, float value) {
-            // noop
-        }
-
-        @Override
-        public float getPivotX(View view) {
-            return 0;
-        }
-
-        @Override
-        public float getPivotY(View view) {
-            return 0;
-        }
-
-        @Override
-        public void setTransitionName(View view, String transitionName) {
-        }
-
-        @Override
-        public String getTransitionName(View view) {
-            return null;
-        }
-
-        @Override
-        public int getWindowSystemUiVisibility(View view) {
-            return 0;
-        }
-
-        @Override
-        public void requestApplyInsets(View view) {
-        }
-
-        @Override
-        public void setElevation(View view, float elevation) {
-        }
-
-        @Override
-        public float getElevation(View view) {
-            return 0f;
-        }
-
-        @Override
-        public void setTranslationZ(View view, float translationZ) {
-        }
-
-        @Override
-        public float getTranslationZ(View view) {
-            return 0f;
-        }
-
-        @Override
-        public void setClipBounds(View view, Rect clipBounds) {
-        }
-
-        @Override
-        public Rect getClipBounds(View view) {
-            return null;
-        }
-
-        @Override
-        public void setChildrenDrawingOrderEnabled(ViewGroup viewGroup, boolean enabled) {
-            // noop
-        }
-
-        @Override
-        public boolean getFitsSystemWindows(View view) {
-            return false;
-        }
-
-        @Override
-        public void setFitsSystemWindows(View view, boolean fitSystemWindows) {
-            // noop
-        }
-
-        @Override
-        public void jumpDrawablesToCurrentState(View view) {
-            // Do nothing; API didn't exist.
-        }
-
-        @Override
-        public void setOnApplyWindowInsetsListener(View view,
-                OnApplyWindowInsetsListener listener) {
-            // noop
-        }
-
-        @Override
-        public WindowInsetsCompat onApplyWindowInsets(View v, WindowInsetsCompat insets) {
-            return insets;
-        }
-
-        @Override
-        public WindowInsetsCompat dispatchApplyWindowInsets(View v, WindowInsetsCompat insets) {
-            return insets;
-        }
-
-        @Override
-        public void setSaveFromParentEnabled(View v, boolean enabled) {
-            // noop
-        }
-
-        @Override
-        public void setActivated(View view, boolean activated) {
-            // noop
-        }
-
-        @Override
-        public boolean isPaddingRelative(View view) {
-            return false;
-        }
-
-        public void setNestedScrollingEnabled(View view, boolean enabled) {
-            if (view instanceof NestedScrollingChild) {
-                ((NestedScrollingChild) view).setNestedScrollingEnabled(enabled);
-            }
-        }
-
-        @Override
-        public boolean isNestedScrollingEnabled(View view) {
-            if (view instanceof NestedScrollingChild) {
-                return ((NestedScrollingChild) view).isNestedScrollingEnabled();
-            }
-            return false;
-        }
-
-        @Override
-        public ColorStateList getBackgroundTintList(View view) {
-            return ViewCompatBase.getBackgroundTintList(view);
-        }
-
-        @Override
-        public void setBackgroundTintList(View view, ColorStateList tintList) {
-            ViewCompatBase.setBackgroundTintList(view, tintList);
-        }
-
-        @Override
-        public void setBackgroundTintMode(View view, PorterDuff.Mode mode) {
-            ViewCompatBase.setBackgroundTintMode(view, mode);
-        }
-
-        @Override
-        public PorterDuff.Mode getBackgroundTintMode(View view) {
-            return ViewCompatBase.getBackgroundTintMode(view);
-        }
-
-        private boolean canScrollingViewScrollHorizontally(ScrollingView view, int direction) {
-            final int offset = view.computeHorizontalScrollOffset();
-            final int range = view.computeHorizontalScrollRange() -
-                    view.computeHorizontalScrollExtent();
-            if (range == 0) return false;
-            if (direction < 0) {
-                return offset > 0;
-            } else {
-                return offset < range - 1;
-            }
-        }
-
-        private boolean canScrollingViewScrollVertically(ScrollingView view, int direction) {
-            final int offset = view.computeVerticalScrollOffset();
-            final int range = view.computeVerticalScrollRange() -
-                    view.computeVerticalScrollExtent();
-            if (range == 0) return false;
-            if (direction < 0) {
-                return offset > 0;
-            } else {
-                return offset < range - 1;
-            }
-        }
-
-        public boolean startNestedScroll(View view, int axes) {
-            if (view instanceof NestedScrollingChild) {
-                return ((NestedScrollingChild) view).startNestedScroll(axes);
-            }
-            return false;
-        }
-
-        @Override
-        public void stopNestedScroll(View view) {
-            if (view instanceof NestedScrollingChild) {
-                ((NestedScrollingChild) view).stopNestedScroll();
-            }
-        }
-
-        @Override
-        public boolean hasNestedScrollingParent(View view) {
-            if (view instanceof NestedScrollingChild) {
-                return ((NestedScrollingChild) view).hasNestedScrollingParent();
-            }
-            return false;
-        }
-
-        @Override
-        public boolean dispatchNestedScroll(View view, int dxConsumed, int dyConsumed,
-                int dxUnconsumed, int dyUnconsumed, int[] offsetInWindow) {
-            if (view instanceof NestedScrollingChild) {
-                return ((NestedScrollingChild) view).dispatchNestedScroll(dxConsumed, dyConsumed,
-                        dxUnconsumed, dyUnconsumed, offsetInWindow);
-            }
-            return false;
-        }
-
-        @Override
-        public boolean dispatchNestedPreScroll(View view, int dx, int dy,
-                int[] consumed, int[] offsetInWindow) {
-            if (view instanceof NestedScrollingChild) {
-                return ((NestedScrollingChild) view).dispatchNestedPreScroll(dx, dy, consumed,
-                        offsetInWindow);
-            }
-            return false;
-        }
-
-        @Override
-        public boolean dispatchNestedFling(View view, float velocityX, float velocityY,
-                boolean consumed) {
-            if (view instanceof NestedScrollingChild) {
-                return ((NestedScrollingChild) view).dispatchNestedFling(velocityX, velocityY,
-                        consumed);
-            }
-            return false;
-        }
-
-        @Override
-        public boolean dispatchNestedPreFling(View view, float velocityX, float velocityY) {
-            if (view instanceof NestedScrollingChild) {
-                return ((NestedScrollingChild) view).dispatchNestedPreFling(velocityX, velocityY);
-            }
-            return false;
-        }
-
-        @Override
-        public boolean isInLayout(View view) {
-            return false;
-        }
-
-        @Override
-        public boolean isLaidOut(View view) {
-            return ViewCompatBase.isLaidOut(view);
-        }
-
-        @Override
-        public boolean isLayoutDirectionResolved(View view) {
-            return false;
-        }
-
-        @Override
-        public int combineMeasuredStates(int curState, int newState) {
-            return curState | newState;
-        }
-
-        @Override
-        public float getZ(View view) {
-            return getTranslationZ(view) + getElevation(view);
-        }
-
-        public void setZ(View view, float z) {
-            // no-op
-        }
-
-        @Override
-        public boolean isAttachedToWindow(View view) {
-            return ViewCompatBase.isAttachedToWindow(view);
-        }
-
-        @Override
-        public boolean hasOnClickListeners(View view) {
-            return false;
-        }
-
-        @Override
-        public int getScrollIndicators(View view) {
-            return 0;
-        }
-
-        @Override
-        public void setScrollIndicators(View view, int indicators) {
-            // no-op
-        }
-
-        @Override
-        public void setScrollIndicators(View view, int indicators, int mask) {
-            // no-op
-        }
-
-        @Override
-        public void offsetLeftAndRight(View view, int offset) {
-            ViewCompatBase.offsetLeftAndRight(view, offset);
-        }
-
-        @Override
-        public void offsetTopAndBottom(View view, int offset) {
-            ViewCompatBase.offsetTopAndBottom(view, offset);
-        }
-
-        @Override
-        public void setPointerIcon(View view, PointerIconCompat pointerIcon) {
-            // no-op
-        }
-    }
-
-    static class EclairMr1ViewCompatImpl extends BaseViewCompatImpl {
-        @Override
-        public boolean isOpaque(View view) {
-            return ViewCompatEclairMr1.isOpaque(view);
-        }
-
-        @Override
-        public void setChildrenDrawingOrderEnabled(ViewGroup viewGroup, boolean enabled) {
-            ViewCompatEclairMr1.setChildrenDrawingOrderEnabled(viewGroup, enabled);
-        }
-    }
-
-    static class GBViewCompatImpl extends EclairMr1ViewCompatImpl {
-        @Override
-        public int getOverScrollMode(View v) {
-            return ViewCompatGingerbread.getOverScrollMode(v);
-        }
-        @Override
-        public void setOverScrollMode(View v, int mode) {
-            ViewCompatGingerbread.setOverScrollMode(v, mode);
-        }
-    }
-
-    static class HCViewCompatImpl extends GBViewCompatImpl {
-        @Override
-        long getFrameTime() {
-            return ViewCompatHC.getFrameTime();
-        }
-        @Override
-        public float getAlpha(View view) {
-            return ViewCompatHC.getAlpha(view);
-        }
-        @Override
-        public void setLayerType(View view, int layerType, Paint paint) {
-            ViewCompatHC.setLayerType(view, layerType, paint);
-        }
-        @Override
-        public int getLayerType(View view)  {
-            return ViewCompatHC.getLayerType(view);
-        }
-        @Override
-        public void setLayerPaint(View view, Paint paint) {
-            // Make sure the paint is correct; this will be cheap if it's the same
-            // instance as was used to call setLayerType earlier.
-            setLayerType(view, getLayerType(view), paint);
-            // This is expensive, but the only way to accomplish this before JB-MR1.
-            view.invalidate();
-        }
-        @Override
-        public int resolveSizeAndState(int size, int measureSpec, int childMeasuredState) {
-            return ViewCompatHC.resolveSizeAndState(size, measureSpec, childMeasuredState);
-        }
-        @Override
-        public int getMeasuredWidthAndState(View view) {
-            return ViewCompatHC.getMeasuredWidthAndState(view);
-        }
-        @Override
-        public int getMeasuredHeightAndState(View view) {
-            return ViewCompatHC.getMeasuredHeightAndState(view);
-        }
-        @Override
-        public int getMeasuredState(View view) {
-            return ViewCompatHC.getMeasuredState(view);
-        }
-        @Override
-        public float getTranslationX(View view) {
-            return ViewCompatHC.getTranslationX(view);
-        }
-        @Override
-        public float getTranslationY(View view) {
-            return ViewCompatHC.getTranslationY(view);
-        }
-
-        @Override
-        public Matrix getMatrix(View view) {
-            return ViewCompatHC.getMatrix(view);
-        }
-
-        @Override
-        public void setTranslationX(View view, float value) {
-            ViewCompatHC.setTranslationX(view, value);
-        }
-        @Override
-        public void setTranslationY(View view, float value) {
-            ViewCompatHC.setTranslationY(view, value);
-        }
-        @Override
-        public void setAlpha(View view, float value) {
-            ViewCompatHC.setAlpha(view, value);
-        }
-        @Override
-        public void setX(View view, float value) {
-            ViewCompatHC.setX(view, value);
-        }
-        @Override
-        public void setY(View view, float value) {
-            ViewCompatHC.setY(view, value);
-        }
-        @Override
-        public void setRotation(View view, float value) {
-            ViewCompatHC.setRotation(view, value);
-        }
-        @Override
-        public void setRotationX(View view, float value) {
-            ViewCompatHC.setRotationX(view, value);
-        }
-        @Override
-        public void setRotationY(View view, float value) {
-            ViewCompatHC.setRotationY(view, value);
-        }
-        @Override
-        public void setScaleX(View view, float value) {
-            ViewCompatHC.setScaleX(view, value);
-        }
-        @Override
-        public void setScaleY(View view, float value) {
-            ViewCompatHC.setScaleY(view, value);
-        }
-        @Override
-        public void setPivotX(View view, float value) {
-            ViewCompatHC.setPivotX(view, value);
-        }
-        @Override
-        public void setPivotY(View view, float value) {
-            ViewCompatHC.setPivotY(view, value);
-        }
-        @Override
-        public float getX(View view) {
-            return ViewCompatHC.getX(view);
-        }
-
-        @Override
-        public float getY(View view) {
-            return ViewCompatHC.getY(view);
-        }
-
-        @Override
-        public float getRotation(View view) {
-            return ViewCompatHC.getRotation(view);
-        }
-
-        @Override
-        public float getRotationX(View view) {
-            return ViewCompatHC.getRotationX(view);
-        }
-
-        @Override
-        public float getRotationY(View view) {
-            return ViewCompatHC.getRotationY(view);
-        }
-
-        @Override
-        public float getScaleX(View view) {
-            return ViewCompatHC.getScaleX(view);
-        }
-
-        @Override
-        public float getScaleY(View view) {
-            return ViewCompatHC.getScaleY(view);
-        }
-
-        @Override
-        public float getPivotX(View view) {
-            return ViewCompatHC.getPivotX(view);
-        }
-        @Override
-        public float getPivotY(View view) {
-            return ViewCompatHC.getPivotY(view);
-        }
-        @Override
-        public void jumpDrawablesToCurrentState(View view) {
-            ViewCompatHC.jumpDrawablesToCurrentState(view);
-        }
-
-        @Override
-        public void setSaveFromParentEnabled(View view, boolean enabled) {
-            ViewCompatHC.setSaveFromParentEnabled(view, enabled);
-        }
-
-        @Override
-        public void setActivated(View view, boolean activated) {
-            ViewCompatHC.setActivated(view, activated);
-        }
-
-        @Override
-        public int combineMeasuredStates(int curState, int newState) {
-            return ViewCompatHC.combineMeasuredStates(curState, newState);
-        }
-
-        @Override
-        public void offsetLeftAndRight(View view, int offset) {
-            ViewCompatHC.offsetLeftAndRight(view, offset);
-        }
-
-        @Override
-        public void offsetTopAndBottom(View view, int offset) {
-            ViewCompatHC.offsetTopAndBottom(view, offset);
-        }
-    }
-
-    static class ICSViewCompatImpl extends HCViewCompatImpl {
-        static Field mAccessibilityDelegateField;
-        static boolean accessibilityDelegateCheckFailed = false;
-        @Override
-        public boolean canScrollHorizontally(View v, int direction) {
-            return ViewCompatICS.canScrollHorizontally(v, direction);
-        }
-        @Override
-        public boolean canScrollVertically(View v, int direction) {
-            return ViewCompatICS.canScrollVertically(v, direction);
-        }
-        @Override
-        public void onPopulateAccessibilityEvent(View v, AccessibilityEvent event) {
-            ViewCompatICS.onPopulateAccessibilityEvent(v, event);
-        }
-        @Override
-        public void onInitializeAccessibilityEvent(View v, AccessibilityEvent event) {
-            ViewCompatICS.onInitializeAccessibilityEvent(v, event);
-        }
-        @Override
-        public void onInitializeAccessibilityNodeInfo(View v, AccessibilityNodeInfoCompat info) {
-            ViewCompatICS.onInitializeAccessibilityNodeInfo(v, info.getInfo());
-        }
-        @Override
-        public void setAccessibilityDelegate(View v,
-                @Nullable AccessibilityDelegateCompat delegate) {
-            ViewCompatICS.setAccessibilityDelegate(v,
-                    delegate == null ? null : delegate.getBridge());
-        }
-
-        @Override
-        public boolean hasAccessibilityDelegate(View v) {
-            if (accessibilityDelegateCheckFailed) {
-                return false; // View implementation might have changed.
-            }
-            if (mAccessibilityDelegateField == null) {
-                try {
-                    mAccessibilityDelegateField = View.class
-                            .getDeclaredField("mAccessibilityDelegate");
-                    mAccessibilityDelegateField.setAccessible(true);
-                } catch (Throwable t) {
-                    accessibilityDelegateCheckFailed = true;
-                    return false;
-                }
-            }
-            try {
-                return mAccessibilityDelegateField.get(v) != null;
-            } catch (Throwable t) {
-                accessibilityDelegateCheckFailed = true;
-                return false;
-            }
-        }
-
-        @Override
-        public ViewPropertyAnimatorCompat animate(View view) {
-            if (mViewPropertyAnimatorCompatMap == null) {
-                mViewPropertyAnimatorCompatMap = new WeakHashMap<>();
-            }
-            ViewPropertyAnimatorCompat vpa = mViewPropertyAnimatorCompatMap.get(view);
-            if (vpa == null) {
-                vpa = new ViewPropertyAnimatorCompat(view);
-                mViewPropertyAnimatorCompatMap.put(view, vpa);
-            }
-            return vpa;
-        }
-
-        @Override
-        public void setFitsSystemWindows(View view, boolean fitSystemWindows) {
-            ViewCompatICS.setFitsSystemWindows(view, fitSystemWindows);
-        }
-    }
-
-    static class ICSMr1ViewCompatImpl extends ICSViewCompatImpl {
-        @Override
-        public boolean hasOnClickListeners(View view) {
-            return ViewCompatICSMr1.hasOnClickListeners(view);
-        }
-    }
-
-    static class JBViewCompatImpl extends ICSMr1ViewCompatImpl {
-        @Override
-        public boolean hasTransientState(View view) {
-            return ViewCompatJB.hasTransientState(view);
-        }
-        @Override
-        public void setHasTransientState(View view, boolean hasTransientState) {
-            ViewCompatJB.setHasTransientState(view, hasTransientState);
-        }
-        @Override
-        public void postInvalidateOnAnimation(View view) {
-            ViewCompatJB.postInvalidateOnAnimation(view);
-        }
-        @Override
-        public void postInvalidateOnAnimation(View view, int left, int top, int right, int bottom) {
-            ViewCompatJB.postInvalidateOnAnimation(view, left, top, right, bottom);
-        }
-        @Override
-        public void postOnAnimation(View view, Runnable action) {
-            ViewCompatJB.postOnAnimation(view, action);
-        }
-        @Override
-        public void postOnAnimationDelayed(View view, Runnable action, long delayMillis) {
-            ViewCompatJB.postOnAnimationDelayed(view, action, delayMillis);
-        }
-        @Override
-        public int getImportantForAccessibility(View view) {
-            return ViewCompatJB.getImportantForAccessibility(view);
-        }
-        @Override
-        public void setImportantForAccessibility(View view, int mode) {
-            // IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS is not available
-            // on this platform so replace with IMPORTANT_FOR_ACCESSIBILITY_NO
-            // which is closer semantically.
-            if (mode == IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS) {
-                mode = IMPORTANT_FOR_ACCESSIBILITY_NO;
-            }
-            ViewCompatJB.setImportantForAccessibility(view, mode);
-        }
-        @Override
-        public boolean performAccessibilityAction(View view, int action, Bundle arguments) {
-            return ViewCompatJB.performAccessibilityAction(view, action, arguments);
-        }
-        @Override
-        public AccessibilityNodeProviderCompat getAccessibilityNodeProvider(View view) {
-            Object compat = ViewCompatJB.getAccessibilityNodeProvider(view);
-            if (compat != null) {
-                return new AccessibilityNodeProviderCompat(compat);
-            }
-            return null;
-        }
-
-        @Override
-        public ViewParent getParentForAccessibility(View view) {
-            return ViewCompatJB.getParentForAccessibility(view);
-        }
-
-        @Override
-        public int getMinimumWidth(View view) {
-            return ViewCompatJB.getMinimumWidth(view);
-        }
-
-        @Override
-        public int getMinimumHeight(View view) {
-            return ViewCompatJB.getMinimumHeight(view);
-        }
-
-        @Override
-        public void requestApplyInsets(View view) {
-            ViewCompatJB.requestApplyInsets(view);
-        }
-
-        @Override
-        public boolean getFitsSystemWindows(View view) {
-            return ViewCompatJB.getFitsSystemWindows(view);
-        }
-
-        @Override
-        public boolean hasOverlappingRendering(View view) {
-            return ViewCompatJB.hasOverlappingRendering(view);
-        }
-    }
-
-    static class JbMr1ViewCompatImpl extends JBViewCompatImpl {
-
-        @Override
-        public int getLabelFor(View view) {
-            return ViewCompatJellybeanMr1.getLabelFor(view);
-        }
-
-        @Override
-        public void setLabelFor(View view, int id) {
-            ViewCompatJellybeanMr1.setLabelFor(view, id);
-        }
-
-        @Override
-        public void setLayerPaint(View view, Paint paint) {
-            ViewCompatJellybeanMr1.setLayerPaint(view, paint);
-        }
-
-        @Override
-        public int getLayoutDirection(View view) {
-            return ViewCompatJellybeanMr1.getLayoutDirection(view);
-        }
-
-        @Override
-        public void setLayoutDirection(View view, int layoutDirection) {
-            ViewCompatJellybeanMr1.setLayoutDirection(view, layoutDirection);
-        }
-
-        @Override
-        public int getPaddingStart(View view) {
-            return ViewCompatJellybeanMr1.getPaddingStart(view);
-        }
-
-        @Override
-        public int getPaddingEnd(View view) {
-            return ViewCompatJellybeanMr1.getPaddingEnd(view);
-        }
-
-        @Override
-        public void setPaddingRelative(View view, int start, int top, int end, int bottom) {
-            ViewCompatJellybeanMr1.setPaddingRelative(view, start, top, end, bottom);
-        }
-
-        @Override
-        public int getWindowSystemUiVisibility(View view) {
-            return ViewCompatJellybeanMr1.getWindowSystemUiVisibility(view);
-        }
-
-        @Override
-        public boolean isPaddingRelative(View view) {
-            return ViewCompatJellybeanMr1.isPaddingRelative(view);
-        }
-    }
-
-    static class JbMr2ViewCompatImpl extends JbMr1ViewCompatImpl {
-        @Override
-        public void setClipBounds(View view, Rect clipBounds) {
-            ViewCompatJellybeanMr2.setClipBounds(view, clipBounds);
-        }
-
-        @Override
-        public Rect getClipBounds(View view) {
-            return ViewCompatJellybeanMr2.getClipBounds(view);
-        }
-
-        @Override
-        public boolean isInLayout(View view) {
-            return ViewCompatJellybeanMr2.isInLayout(view);
-        }
-    }
-
-    static class KitKatViewCompatImpl extends JbMr2ViewCompatImpl {
-        @Override
-        public int getAccessibilityLiveRegion(View view) {
-            return ViewCompatKitKat.getAccessibilityLiveRegion(view);
-        }
-
-        @Override
-        public void setAccessibilityLiveRegion(View view, int mode) {
-            ViewCompatKitKat.setAccessibilityLiveRegion(view, mode);
-        }
-
-        @Override
-        public void setImportantForAccessibility(View view, int mode) {
-            ViewCompatJB.setImportantForAccessibility(view, mode);
-        }
-
-        @Override
-        public boolean isLaidOut(View view) {
-            return ViewCompatKitKat.isLaidOut(view);
-        }
-
-        @Override
-        public boolean isLayoutDirectionResolved(View view) {
-            return ViewCompatKitKat.isLayoutDirectionResolved(view);
-        }
-
-        @Override
-        public boolean isAttachedToWindow(View view) {
-            return ViewCompatKitKat.isAttachedToWindow(view);
-        }
-    }
-
-    static class LollipopViewCompatImpl extends KitKatViewCompatImpl {
-        @Override
-        public void setTransitionName(View view, String transitionName) {
-            ViewCompatLollipop.setTransitionName(view, transitionName);
-        }
-
-        @Override
-        public String getTransitionName(View view) {
-            return ViewCompatLollipop.getTransitionName(view);
-        }
-
-        @Override
-        public void requestApplyInsets(View view) {
-            ViewCompatLollipop.requestApplyInsets(view);
-        }
-
-        @Override
-        public void setElevation(View view, float elevation) {
-            ViewCompatLollipop.setElevation(view, elevation);
-        }
-
-        @Override
-        public float getElevation(View view) {
-            return ViewCompatLollipop.getElevation(view);
-        }
-
-        @Override
-        public void setTranslationZ(View view, float translationZ) {
-            ViewCompatLollipop.setTranslationZ(view, translationZ);
-        }
-
-        @Override
-        public float getTranslationZ(View view) {
-            return ViewCompatLollipop.getTranslationZ(view);
-        }
-
-        @Override
-        public void setOnApplyWindowInsetsListener(View view, OnApplyWindowInsetsListener listener) {
-            ViewCompatLollipop.setOnApplyWindowInsetsListener(view, listener);
-        }
-
-        @Override
-        public void setNestedScrollingEnabled(View view, boolean enabled) {
-            ViewCompatLollipop.setNestedScrollingEnabled(view, enabled);
-        }
-
-        @Override
-        public boolean isNestedScrollingEnabled(View view) {
-            return ViewCompatLollipop.isNestedScrollingEnabled(view);
-        }
-
-        @Override
-        public boolean startNestedScroll(View view, int axes) {
-            return ViewCompatLollipop.startNestedScroll(view, axes);
-        }
-
-        @Override
-        public void stopNestedScroll(View view) {
-            ViewCompatLollipop.stopNestedScroll(view);
-        }
-
-        @Override
-        public boolean hasNestedScrollingParent(View view) {
-            return ViewCompatLollipop.hasNestedScrollingParent(view);
-        }
-
-        @Override
-        public boolean dispatchNestedScroll(View view, int dxConsumed, int dyConsumed,
-                int dxUnconsumed, int dyUnconsumed, int[] offsetInWindow) {
-            return ViewCompatLollipop.dispatchNestedScroll(view, dxConsumed, dyConsumed,
-                    dxUnconsumed, dyUnconsumed, offsetInWindow);
-        }
-
-        @Override
-        public boolean dispatchNestedPreScroll(View view, int dx, int dy,
-                int[] consumed, int[] offsetInWindow) {
-            return ViewCompatLollipop.dispatchNestedPreScroll(view, dx, dy, consumed,
-                    offsetInWindow);
-        }
-
-        @Override
-        public boolean dispatchNestedFling(View view, float velocityX, float velocityY,
-                boolean consumed) {
-            return ViewCompatLollipop.dispatchNestedFling(view, velocityX, velocityY, consumed);
-        }
-
-        @Override
-        public boolean dispatchNestedPreFling(View view, float velocityX, float velocityY) {
-            return ViewCompatLollipop.dispatchNestedPreFling(view, velocityX, velocityY);
-        }
-
-        @Override
-        public boolean isImportantForAccessibility(View view) {
-            return ViewCompatLollipop.isImportantForAccessibility(view);
-        }
-
-        @Override
-        public ColorStateList getBackgroundTintList(View view) {
-            return ViewCompatLollipop.getBackgroundTintList(view);
-        }
-
-        @Override
-        public void setBackgroundTintList(View view, ColorStateList tintList) {
-            ViewCompatLollipop.setBackgroundTintList(view, tintList);
-        }
-
-        @Override
-        public void setBackgroundTintMode(View view, PorterDuff.Mode mode) {
-            ViewCompatLollipop.setBackgroundTintMode(view, mode);
-        }
-
-        @Override
-        public PorterDuff.Mode getBackgroundTintMode(View view) {
-            return ViewCompatLollipop.getBackgroundTintMode(view);
-        }
-
-        @Override
-        public WindowInsetsCompat onApplyWindowInsets(View v, WindowInsetsCompat insets) {
-            return ViewCompatLollipop.onApplyWindowInsets(v, insets);
-        }
-
-        @Override
-        public WindowInsetsCompat dispatchApplyWindowInsets(View v, WindowInsetsCompat insets) {
-            return ViewCompatLollipop.dispatchApplyWindowInsets(v, insets);
-        }
-
-        @Override
-        public float getZ(View view) {
-            return ViewCompatLollipop.getZ(view);
-        }
-
-        @Override
-        public void setZ(View view, float z) {
-            ViewCompatLollipop.setZ(view, z);
-        }
-
-        @Override
-        public void offsetLeftAndRight(View view, int offset) {
-            ViewCompatLollipop.offsetLeftAndRight(view, offset);
-        }
-
-        @Override
-        public void offsetTopAndBottom(View view, int offset) {
-            ViewCompatLollipop.offsetTopAndBottom(view, offset);
-        }
-    }
-
-    static class MarshmallowViewCompatImpl extends LollipopViewCompatImpl {
-        @Override
-        public void setScrollIndicators(View view, int indicators) {
-            ViewCompatMarshmallow.setScrollIndicators(view, indicators);
-        }
-
-        @Override
-        public void setScrollIndicators(View view, int indicators, int mask) {
-            ViewCompatMarshmallow.setScrollIndicators(view, indicators, mask);
-        }
-
-        @Override
-        public int getScrollIndicators(View view) {
-            return ViewCompatMarshmallow.getScrollIndicators(view);
-        }
-
-
-        @Override
-        public void offsetLeftAndRight(View view, int offset) {
-            ViewCompatMarshmallow.offsetLeftAndRight(view, offset);
-        }
-
-        @Override
-        public void offsetTopAndBottom(View view, int offset) {
-            ViewCompatMarshmallow.offsetTopAndBottom(view, offset);
-        }
-    }
-
-    static class Api24ViewCompatImpl extends MarshmallowViewCompatImpl {
-        @Override
-        public void setPointerIcon(View view, PointerIconCompat pointerIconCompat) {
-            ViewCompatApi24.setPointerIcon(view, pointerIconCompat.getPointerIcon());
-        }
-    }
-
-    static final ViewCompatImpl IMPL;
-    static {
-        final int version = android.os.Build.VERSION.SDK_INT;
-        if (BuildCompat.isAtLeastN()) {
-            IMPL = new Api24ViewCompatImpl();
-        } else if (version >= 23) {
-            IMPL = new MarshmallowViewCompatImpl();
-        } else if (version >= 21) {
-            IMPL = new LollipopViewCompatImpl();
-        } else if (version >= 19) {
-            IMPL = new KitKatViewCompatImpl();
-        } else if (version >= 18) {
-            IMPL = new JbMr2ViewCompatImpl();
-        } else if (version >= 17) {
-            IMPL = new JbMr1ViewCompatImpl();
-        } else if (version >= 16) {
-            IMPL = new JBViewCompatImpl();
-        } else if (version >= 15) {
-            IMPL = new ICSMr1ViewCompatImpl();
-        } else if (version >= 14) {
-            IMPL = new ICSViewCompatImpl();
-        } else if (version >= 11) {
-            IMPL = new HCViewCompatImpl();
-        } else if (version >= 9) {
-            IMPL = new GBViewCompatImpl();
-        } else if (version >= 7) {
-            IMPL = new EclairMr1ViewCompatImpl();
-        } else {
-            IMPL = new BaseViewCompatImpl();
-        }
-    }
-
-    /**
-     * Check if this view can be scrolled horizontally in a certain direction.
-     *
-     * @param v The View against which to invoke the method.
-     * @param direction Negative to check scrolling left, positive to check scrolling right.
-     * @return true if this view can be scrolled in the specified direction, false otherwise.
-     */
-    public static boolean canScrollHorizontally(View v, int direction) {
-        return IMPL.canScrollHorizontally(v, direction);
-    }
-
-    /**
-     * Check if this view can be scrolled vertically in a certain direction.
-     *
-     * @param v The View against which to invoke the method.
-     * @param direction Negative to check scrolling up, positive to check scrolling down.
-     * @return true if this view can be scrolled in the specified direction, false otherwise.
-     */
-    public static boolean canScrollVertically(View v, int direction) {
-        return IMPL.canScrollVertically(v, direction);
-    }
-
-    /**
-     * Returns the over-scroll mode for this view. The result will be
-     * one of {@link #OVER_SCROLL_ALWAYS} (default), {@link #OVER_SCROLL_IF_CONTENT_SCROLLS}
-     * (allow over-scrolling only if the view content is larger than the container),
-     * or {@link #OVER_SCROLL_NEVER}.
-     *
-     * @param v The View against which to invoke the method.
-     * @return This view's over-scroll mode.
-     */
-    @OverScroll
-    public static int getOverScrollMode(View v) {
-        //noinspection ResourceType
-        return IMPL.getOverScrollMode(v);
-    }
-
-    /**
-     * Set the over-scroll mode for this view. Valid over-scroll modes are
-     * {@link #OVER_SCROLL_ALWAYS} (default), {@link #OVER_SCROLL_IF_CONTENT_SCROLLS}
-     * (allow over-scrolling only if the view content is larger than the container),
-     * or {@link #OVER_SCROLL_NEVER}.
-     *
-     * Setting the over-scroll mode of a view will have an effect only if the
-     * view is capable of scrolling.
-     *
-     * @param v The View against which to invoke the method.
-     * @param overScrollMode The new over-scroll mode for this view.
-     */
-    public static void setOverScrollMode(View v, @OverScroll int overScrollMode) {
-        IMPL.setOverScrollMode(v, overScrollMode);
-    }
-
-    /**
-     * Called from {@link View#dispatchPopulateAccessibilityEvent(AccessibilityEvent)}
-     * giving a chance to this View to populate the accessibility event with its
-     * text content. While this method is free to modify event
-     * attributes other than text content, doing so should normally be performed in
-     * {@link View#onInitializeAccessibilityEvent(AccessibilityEvent)}.
-     * <p>
-     * Example: Adding formatted date string to an accessibility event in addition
-     *          to the text added by the super implementation:
-     * <pre> public void onPopulateAccessibilityEvent(AccessibilityEvent event) {
-     *     super.onPopulateAccessibilityEvent(event);
-     *     final int flags = DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_SHOW_WEEKDAY;
-     *     String selectedDateUtterance = DateUtils.formatDateTime(mContext,
-     *         mCurrentDate.getTimeInMillis(), flags);
-     *     event.getText().add(selectedDateUtterance);
-     * }</pre>
-     * <p>
-     * If an {@link AccessibilityDelegateCompat} has been specified via calling
-     * {@link ViewCompat#setAccessibilityDelegate(View, AccessibilityDelegateCompat)} its
-     * {@link AccessibilityDelegateCompat#onPopulateAccessibilityEvent(View, AccessibilityEvent)}
-     * is responsible for handling this call.
-     * </p>
-     * <p class="note"><strong>Note:</strong> Always call the super implementation before adding
-     * information to the event, in case the default implementation has basic information to add.
-     * </p>
-     *
-     * @param v The View against which to invoke the method.
-     * @param event The accessibility event which to populate.
-     *
-     * @see View#sendAccessibilityEvent(int)
-     * @see View#dispatchPopulateAccessibilityEvent(AccessibilityEvent)
-     */
-    public static void onPopulateAccessibilityEvent(View v, AccessibilityEvent event) {
-        IMPL.onPopulateAccessibilityEvent(v, event);
-    }
-
-    /**
-     * Initializes an {@link AccessibilityEvent} with information about
-     * this View which is the event source. In other words, the source of
-     * an accessibility event is the view whose state change triggered firing
-     * the event.
-     * <p>
-     * Example: Setting the password property of an event in addition
-     *          to properties set by the super implementation:
-     * <pre> public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
-     *     super.onInitializeAccessibilityEvent(event);
-     *     event.setPassword(true);
-     * }</pre>
-     * <p>
-     * If an {@link AccessibilityDelegateCompat} has been specified via calling
-     * {@link ViewCompat#setAccessibilityDelegate(View, AccessibilityDelegateCompat)}, its
-     * {@link AccessibilityDelegateCompat#onInitializeAccessibilityEvent(View, AccessibilityEvent)}
-     * is responsible for handling this call.
-     *
-     * @param v The View against which to invoke the method.
-     * @param event The event to initialize.
-     *
-     * @see View#sendAccessibilityEvent(int)
-     * @see View#dispatchPopulateAccessibilityEvent(AccessibilityEvent)
-     */
-    public static void onInitializeAccessibilityEvent(View v, AccessibilityEvent event) {
-        IMPL.onInitializeAccessibilityEvent(v, event);
-    }
-
-    /**
-     * Initializes an {@link AccessibilityNodeInfoCompat} with information
-     * about this view. The base implementation sets:
-     * <ul>
-     * <li>{@link AccessibilityNodeInfoCompat#setParent(View)},</li>
-     * <li>{@link AccessibilityNodeInfoCompat#setBoundsInParent(Rect)},</li>
-     * <li>{@link AccessibilityNodeInfoCompat#setBoundsInScreen(Rect)},</li>
-     * <li>{@link AccessibilityNodeInfoCompat#setPackageName(CharSequence)},</li>
-     * <li>{@link AccessibilityNodeInfoCompat#setClassName(CharSequence)},</li>
-     * <li>{@link AccessibilityNodeInfoCompat#setContentDescription(CharSequence)},</li>
-     * <li>{@link AccessibilityNodeInfoCompat#setEnabled(boolean)},</li>
-     * <li>{@link AccessibilityNodeInfoCompat#setClickable(boolean)},</li>
-     * <li>{@link AccessibilityNodeInfoCompat#setFocusable(boolean)},</li>
-     * <li>{@link AccessibilityNodeInfoCompat#setFocused(boolean)},</li>
-     * <li>{@link AccessibilityNodeInfoCompat#setLongClickable(boolean)},</li>
-     * <li>{@link AccessibilityNodeInfoCompat#setSelected(boolean)},</li>
-     * </ul>
-     * <p>
-     * If an {@link AccessibilityDelegateCompat} has been specified via calling
-     * {@link ViewCompat#setAccessibilityDelegate(View, AccessibilityDelegateCompat)}, its
-     * {@link AccessibilityDelegateCompat#onInitializeAccessibilityNodeInfo(View, AccessibilityNodeInfoCompat)}
-     * method is responsible for handling this call.
-     *
-     * @param v The View against which to invoke the method.
-     * @param info The instance to initialize.
-     */
-    public static void onInitializeAccessibilityNodeInfo(View v, AccessibilityNodeInfoCompat info) {
-        IMPL.onInitializeAccessibilityNodeInfo(v, info);
-    }
-
-    /**
-     * Sets a delegate for implementing accessibility support via composition
-     * (as opposed to inheritance). For more details, see
-     * {@link AccessibilityDelegateCompat}.
-     * <p>
-     * On platform versions prior to API 14, this method is a no-op.
-     * <p>
-     * <strong>Note:</strong> On platform versions prior to
-     * {@link android.os.Build.VERSION_CODES#M API 23}, delegate methods on
-     * views in the {@code android.widget.*} package are called <i>before</i>
-     * host methods. This prevents certain properties such as class name from
-     * being modified by overriding
-     * {@link AccessibilityDelegateCompat#onInitializeAccessibilityNodeInfo(View, AccessibilityNodeInfoCompat)},
-     * as any changes will be overwritten by the host class.
-     * <p>
-     * Starting in {@link android.os.Build.VERSION_CODES#M API 23}, delegate
-     * methods are called <i>after</i> host methods, which all properties to be
-     * modified without being overwritten by the host class.
-     *
-     * @param delegate the object to which accessibility method calls should be
-     *                 delegated
-     * @see AccessibilityDelegateCompat
-     */
-    public static void setAccessibilityDelegate(View v, AccessibilityDelegateCompat delegate) {
-        IMPL.setAccessibilityDelegate(v, delegate);
-    }
-
-    /**
-     * Checks whether provided View has an accessibility delegate attached to it.
-     *
-     * @param v The View instance to check
-     * @return True if the View has an accessibility delegate
-     */
-    public static boolean hasAccessibilityDelegate(View v) {
-        return IMPL.hasAccessibilityDelegate(v);
-    }
-
-    /**
-     * Indicates whether the view is currently tracking transient state that the
-     * app should not need to concern itself with saving and restoring, but that
-     * the framework should take special note to preserve when possible.
-     *
-     * @param view View to check for transient state
-     * @return true if the view has transient state
-     */
-    public static boolean hasTransientState(View view) {
-        return IMPL.hasTransientState(view);
-    }
-
-    /**
-     * Set whether this view is currently tracking transient state that the
-     * framework should attempt to preserve when possible.
-     *
-     * @param view View tracking transient state
-     * @param hasTransientState true if this view has transient state
-     */
-    public static void setHasTransientState(View view, boolean hasTransientState) {
-        IMPL.setHasTransientState(view, hasTransientState);
-    }
-
-    /**
-     * <p>Cause an invalidate to happen on the next animation time step, typically the
-     * next display frame.</p>
-     *
-     * <p>This method can be invoked from outside of the UI thread
-     * only when this View is attached to a window.</p>
-     *
-     * @param view View to invalidate
-     */
-    public static void postInvalidateOnAnimation(View view) {
-        IMPL.postInvalidateOnAnimation(view);
-    }
-
-    /**
-     * <p>Cause an invalidate of the specified area to happen on the next animation
-     * time step, typically the next display frame.</p>
-     *
-     * <p>This method can be invoked from outside of the UI thread
-     * only when this View is attached to a window.</p>
-     *
-     * @param view View to invalidate
-     * @param left The left coordinate of the rectangle to invalidate.
-     * @param top The top coordinate of the rectangle to invalidate.
-     * @param right The right coordinate of the rectangle to invalidate.
-     * @param bottom The bottom coordinate of the rectangle to invalidate.
-     */
-    public static void postInvalidateOnAnimation(View view, int left, int top,
-            int right, int bottom) {
-        IMPL.postInvalidateOnAnimation(view, left, top, right, bottom);
-    }
-
-    /**
-     * <p>Causes the Runnable to execute on the next animation time step.
-     * The runnable will be run on the user interface thread.</p>
-     *
-     * <p>This method can be invoked from outside of the UI thread
-     * only when this View is attached to a window.</p>
-     *
-     * @param view View to post this Runnable to
-     * @param action The Runnable that will be executed.
-     */
-    public static void postOnAnimation(View view, Runnable action) {
-        IMPL.postOnAnimation(view, action);
-    }
-
-    /**
-     * <p>Causes the Runnable to execute on the next animation time step,
-     * after the specified amount of time elapses.
-     * The runnable will be run on the user interface thread.</p>
-     *
-     * <p>This method can be invoked from outside of the UI thread
-     * only when this View is attached to a window.</p>
-     *
-     * @param view The view to post this Runnable to
-     * @param action The Runnable that will be executed.
-     * @param delayMillis The delay (in milliseconds) until the Runnable
-     *        will be executed.
-     */
-    public static void postOnAnimationDelayed(View view, Runnable action, long delayMillis) {
-        IMPL.postOnAnimationDelayed(view, action, delayMillis);
-    }
-
-    /**
-     * Gets the mode for determining whether this View is important for accessibility
-     * which is if it fires accessibility events and if it is reported to
-     * accessibility services that query the screen.
-     *
-     * @param view The view whose property to get.
-     * @return The mode for determining whether a View is important for accessibility.
-     *
-     * @see #IMPORTANT_FOR_ACCESSIBILITY_YES
-     * @see #IMPORTANT_FOR_ACCESSIBILITY_NO
-     * @see #IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS
-     * @see #IMPORTANT_FOR_ACCESSIBILITY_AUTO
-     */
-    @ImportantForAccessibility
-    public static int getImportantForAccessibility(View view) {
-        //noinspection ResourceType
-        return IMPL.getImportantForAccessibility(view);
-    }
-
-    /**
-     * Sets how to determine whether this view is important for accessibility
-     * which is if it fires accessibility events and if it is reported to
-     * accessibility services that query the screen.
-     * <p>
-     * <em>Note:</em> If the current paltform version does not support the
-     *  {@link #IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS} mode, then
-     *  {@link #IMPORTANT_FOR_ACCESSIBILITY_NO} will be used as it is the
-     *  closest terms of semantics.
-     * </p>
-     *
-     * @param view The view whose property to set.
-     * @param mode How to determine whether this view is important for accessibility.
-     *
-     * @see #IMPORTANT_FOR_ACCESSIBILITY_YES
-     * @see #IMPORTANT_FOR_ACCESSIBILITY_NO
-     * @see #IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS
-     * @see #IMPORTANT_FOR_ACCESSIBILITY_AUTO
-     */
-    public static void setImportantForAccessibility(View view,
-            @ImportantForAccessibility int mode) {
-        IMPL.setImportantForAccessibility(view, mode);
-    }
-
-    /**
-     * Performs the specified accessibility action on the view. For
-     * possible accessibility actions look at {@link AccessibilityNodeInfoCompat}.
-     * <p>
-     * If an {@link AccessibilityDelegateCompat} has been specified via calling
-     * {@link #setAccessibilityDelegate(View, AccessibilityDelegateCompat)} its
-     * {@link AccessibilityDelegateCompat#performAccessibilityAction(View, int, Bundle)}
-     * is responsible for handling this call.
-     * </p>
-     *
-     * @param action The action to perform.
-     * @param arguments Optional action arguments.
-     * @return Whether the action was performed.
-     */
-    public static boolean performAccessibilityAction(View view, int action, Bundle arguments) {
-        return IMPL.performAccessibilityAction(view, action, arguments);
-    }
-
-    /**
-     * Gets the provider for managing a virtual view hierarchy rooted at this View
-     * and reported to {@link android.accessibilityservice.AccessibilityService}s
-     * that explore the window content.
-     * <p>
-     * If this method returns an instance, this instance is responsible for managing
-     * {@link AccessibilityNodeInfoCompat}s describing the virtual sub-tree rooted at
-     * this View including the one representing the View itself. Similarly the returned
-     * instance is responsible for performing accessibility actions on any virtual
-     * view or the root view itself.
-     * </p>
-     * <p>
-     * If an {@link AccessibilityDelegateCompat} has been specified via calling
-     * {@link #setAccessibilityDelegate(View, AccessibilityDelegateCompat)} its
-     * {@link AccessibilityDelegateCompat#getAccessibilityNodeProvider(View)}
-     * is responsible for handling this call.
-     * </p>
-     *
-     * @param view The view whose property to get.
-     * @return The provider.
-     *
-     * @see AccessibilityNodeProviderCompat
-     */
-    public static AccessibilityNodeProviderCompat getAccessibilityNodeProvider(View view) {
-        return IMPL.getAccessibilityNodeProvider(view);
-    }
-
-    /**
-     * The opacity of the view. This is a value from 0 to 1, where 0 means the view is
-     * completely transparent and 1 means the view is completely opaque.
-     *
-     * <p>By default this is 1.0f. Prior to API 11, the returned value is always 1.0f.
-     * @return The opacity of the view.
-     */
-    public static float getAlpha(View view) {
-        return IMPL.getAlpha(view);
-    }
-
-    /**
-     * <p>Specifies the type of layer backing this view. The layer can be
-     * {@link #LAYER_TYPE_NONE disabled}, {@link #LAYER_TYPE_SOFTWARE software} or
-     * {@link #LAYER_TYPE_HARDWARE hardware}.</p>
-     *
-     * <p>A layer is associated with an optional {@link android.graphics.Paint}
-     * instance that controls how the layer is composed on screen. The following
-     * properties of the paint are taken into account when composing the layer:</p>
-     * <ul>
-     * <li>{@link android.graphics.Paint#getAlpha() Translucency (alpha)}</li>
-     * <li>{@link android.graphics.Paint#getXfermode() Blending mode}</li>
-     * <li>{@link android.graphics.Paint#getColorFilter() Color filter}</li>
-     * </ul>
-     *
-     * <p>If this view has an alpha value set to < 1.0 by calling
-     * setAlpha(float), the alpha value of the layer's paint is replaced by
-     * this view's alpha value. Calling setAlpha(float) is therefore
-     * equivalent to setting a hardware layer on this view and providing a paint with
-     * the desired alpha value.<p>
-     *
-     * <p>Refer to the documentation of {@link #LAYER_TYPE_NONE disabled},
-     * {@link #LAYER_TYPE_SOFTWARE software} and {@link #LAYER_TYPE_HARDWARE hardware}
-     * for more information on when and how to use layers.</p>
-     *
-     * @param view View to set the layer type for
-     * @param layerType The type of layer to use with this view, must be one of
-     *        {@link #LAYER_TYPE_NONE}, {@link #LAYER_TYPE_SOFTWARE} or
-     *        {@link #LAYER_TYPE_HARDWARE}
-     * @param paint The paint used to compose the layer. This argument is optional
-     *        and can be null. It is ignored when the layer type is
-     *        {@link #LAYER_TYPE_NONE}
-     */
-    public static void setLayerType(View view, @LayerType int layerType, Paint paint) {
-        IMPL.setLayerType(view, layerType, paint);
-    }
-
-    /**
-     * Indicates what type of layer is currently associated with this view. By default
-     * a view does not have a layer, and the layer type is {@link #LAYER_TYPE_NONE}.
-     * Refer to the documentation of
-     * {@link #setLayerType(android.view.View, int, android.graphics.Paint)}
-     * for more information on the different types of layers.
-     *
-     * @param view The view to fetch the layer type from
-     * @return {@link #LAYER_TYPE_NONE}, {@link #LAYER_TYPE_SOFTWARE} or
-     *         {@link #LAYER_TYPE_HARDWARE}
-     *
-     * @see #setLayerType(android.view.View, int, android.graphics.Paint)
-     * @see #LAYER_TYPE_NONE
-     * @see #LAYER_TYPE_SOFTWARE
-     * @see #LAYER_TYPE_HARDWARE
-     */
-    @LayerType
-    public static int getLayerType(View view) {
-        //noinspection ResourceType
-        return IMPL.getLayerType(view);
-    }
-
-    /**
-     * Gets the id of a view for which a given view serves as a label for
-     * accessibility purposes.
-     *
-     * @param view The view on which to invoke the corresponding method.
-     * @return The labeled view id.
-     */
-    public static int getLabelFor(View view) {
-        return IMPL.getLabelFor(view);
-    }
-
-    /**
-     * Sets the id of a view for which a given view serves as a label for
-     * accessibility purposes.
-     *
-     * @param view The view on which to invoke the corresponding method.
-     * @param labeledId The labeled view id.
-     */
-    public static void setLabelFor(View view, @IdRes int labeledId) {
-        IMPL.setLabelFor(view, labeledId);
-    }
-
-    /**
-     * Updates the {@link Paint} object used with the current layer (used only if the current
-     * layer type is not set to {@link #LAYER_TYPE_NONE}). Changed properties of the Paint
-     * provided to {@link #setLayerType(android.view.View, int, android.graphics.Paint)}
-     * will be used the next time the View is redrawn, but
-     * {@link #setLayerPaint(android.view.View, android.graphics.Paint)}
-     * must be called to ensure that the view gets redrawn immediately.
-     *
-     * <p>A layer is associated with an optional {@link android.graphics.Paint}
-     * instance that controls how the layer is composed on screen. The following
-     * properties of the paint are taken into account when composing the layer:</p>
-     * <ul>
-     * <li>{@link android.graphics.Paint#getAlpha() Translucency (alpha)}</li>
-     * <li>{@link android.graphics.Paint#getXfermode() Blending mode}</li>
-     * <li>{@link android.graphics.Paint#getColorFilter() Color filter}</li>
-     * </ul>
-     *
-     * <p>If this view has an alpha value set to < 1.0 by calling
-     * View#setAlpha(float), the alpha value of the layer's paint is replaced by
-     * this view's alpha value. Calling View#setAlpha(float) is therefore
-     * equivalent to setting a hardware layer on this view and providing a paint with
-     * the desired alpha value.</p>
-     *
-     * @param view View to set a layer paint for
-     * @param paint The paint used to compose the layer. This argument is optional
-     *        and can be null. It is ignored when the layer type is
-     *        {@link #LAYER_TYPE_NONE}
-     *
-     * @see #setLayerType(View, int, android.graphics.Paint)
-     */
-    public static void setLayerPaint(View view, Paint paint) {
-        IMPL.setLayerPaint(view, paint);
-    }
-
-    /**
-     * Returns the resolved layout direction for this view.
-     *
-     * @param view View to get layout direction for
-     * @return {@link #LAYOUT_DIRECTION_RTL} if the layout direction is RTL or returns
-     * {@link #LAYOUT_DIRECTION_LTR} if the layout direction is not RTL.
-     *
-     * For compatibility, this will return {@link #LAYOUT_DIRECTION_LTR} if API version
-     * is lower than Jellybean MR1 (API 17)
-     */
-    @ResolvedLayoutDirectionMode
-    public static int getLayoutDirection(View view) {
-        //noinspection ResourceType
-        return IMPL.getLayoutDirection(view);
-    }
-
-    /**
-     * Set the layout direction for this view. This will propagate a reset of layout direction
-     * resolution to the view's children and resolve layout direction for this view.
-     *
-     * @param view View to set layout direction for
-     * @param layoutDirection the layout direction to set. Should be one of:
-     *
-     * {@link #LAYOUT_DIRECTION_LTR},
-     * {@link #LAYOUT_DIRECTION_RTL},
-     * {@link #LAYOUT_DIRECTION_INHERIT},
-     * {@link #LAYOUT_DIRECTION_LOCALE}.
-     *
-     * Resolution will be done if the value is set to LAYOUT_DIRECTION_INHERIT. The resolution
-     * proceeds up the parent chain of the view to get the value. If there is no parent, then it
-     * will return the default {@link #LAYOUT_DIRECTION_LTR}.
-     */
-    public static void setLayoutDirection(View view, @LayoutDirectionMode int layoutDirection) {
-        IMPL.setLayoutDirection(view, layoutDirection);
-    }
-
-    /**
-     * Gets the parent for accessibility purposes. Note that the parent for
-     * accessibility is not necessary the immediate parent. It is the first
-     * predecessor that is important for accessibility.
-     *
-     * @param view View to retrieve parent for
-     * @return The parent for use in accessibility inspection
-     */
-    public static ViewParent getParentForAccessibility(View view) {
-        return IMPL.getParentForAccessibility(view);
-    }
-
-    /**
-     * Indicates whether this View is opaque. An opaque View guarantees that it will
-     * draw all the pixels overlapping its bounds using a fully opaque color.
-     *
-     * On API 7 and above this will call View's true isOpaque method. On previous platform
-     * versions it will check the opacity of the view's background drawable if present.
-     *
-     * @return True if this View is guaranteed to be fully opaque, false otherwise.
-     */
-    public static boolean isOpaque(View view) {
-        return IMPL.isOpaque(view);
-    }
-
-    /**
-     * Utility to reconcile a desired size and state, with constraints imposed
-     * by a MeasureSpec.  Will take the desired size, unless a different size
-     * is imposed by the constraints.  The returned value is a compound integer,
-     * with the resolved size in the {@link #MEASURED_SIZE_MASK} bits and
-     * optionally the bit {@link #MEASURED_STATE_TOO_SMALL} set if the resulting
-     * size is smaller than the size the view wants to be.
-     *
-     * @param size How big the view wants to be
-     * @param measureSpec Constraints imposed by the parent
-     * @return Size information bit mask as defined by
-     * {@link #MEASURED_SIZE_MASK} and {@link #MEASURED_STATE_TOO_SMALL}.
-     */
-    public static int resolveSizeAndState(int size, int measureSpec, int childMeasuredState) {
-        return IMPL.resolveSizeAndState(size, measureSpec, childMeasuredState);
-    }
-
-    /**
-     * Return the full width measurement information for this view as computed
-     * by the most recent call to {@link android.view.View#measure(int, int)}.
-     * This result is a bit mask as defined by {@link #MEASURED_SIZE_MASK} and
-     * {@link #MEASURED_STATE_TOO_SMALL}.
-     * This should be used during measurement and layout calculations only. Use
-     * {@link android.view.View#getWidth()} to see how wide a view is after layout.
-     *
-     * @return The measured width of this view as a bit mask.
-     */
-    public static int getMeasuredWidthAndState(View view) {
-        return IMPL.getMeasuredWidthAndState(view);
-    }
-
-    /**
-     * Return the full height measurement information for this view as computed
-     * by the most recent call to {@link android.view.View#measure(int, int)}.
-     * This result is a bit mask as defined by {@link #MEASURED_SIZE_MASK} and
-     * {@link #MEASURED_STATE_TOO_SMALL}.
-     * This should be used during measurement and layout calculations only. Use
-     * {@link android.view.View#getHeight()} to see how wide a view is after layout.
-     *
-     * @return The measured width of this view as a bit mask.
-     */
-    public static int getMeasuredHeightAndState(View view) {
-        return IMPL.getMeasuredHeightAndState(view);
-    }
-
-    /**
-     * Return only the state bits of {@link #getMeasuredWidthAndState}
-     * and {@link #getMeasuredHeightAndState}, combined into one integer.
-     * The width component is in the regular bits {@link #MEASURED_STATE_MASK}
-     * and the height component is at the shifted bits
-     * {@link #MEASURED_HEIGHT_STATE_SHIFT}>>{@link #MEASURED_STATE_MASK}.
-     */
-    public static int getMeasuredState(View view) {
-        return IMPL.getMeasuredState(view);
-    }
-
-    /**
-     * Merge two states as returned by {@link #getMeasuredState(View)}.
-     * @param curState The current state as returned from a view or the result
-     * of combining multiple views.
-     * @param newState The new view state to combine.
-     * @return Returns a new integer reflecting the combination of the two
-     * states.
-     */
-    public static int combineMeasuredStates(int curState, int newState) {
-        return IMPL.combineMeasuredStates(curState, newState);
-    }
-
-    /**
-     * Gets the live region mode for the specified View.
-     *
-     * @param view The view from which to obtain the live region mode
-     * @return The live region mode for the view.
-     *
-     * @see ViewCompat#setAccessibilityLiveRegion(View, int)
-     */
-    @AccessibilityLiveRegion
-    public static int getAccessibilityLiveRegion(View view) {
-        //noinspection ResourceType
-        return IMPL.getAccessibilityLiveRegion(view);
-    }
-
-    /**
-     * Sets the live region mode for the specified view. This indicates to
-     * accessibility services whether they should automatically notify the user
-     * about changes to the view's content description or text, or to the
-     * content descriptions or text of the view's children (where applicable).
-     * <p>
-     * For example, in a login screen with a TextView that displays an "incorrect
-     * password" notification, that view should be marked as a live region with
-     * mode {@link #ACCESSIBILITY_LIVE_REGION_POLITE}.
-     * <p>
-     * To disable change notifications for this view, use
-     * {@link #ACCESSIBILITY_LIVE_REGION_NONE}. This is the default live region
-     * mode for most views.
-     * <p>
-     * To indicate that the user should be notified of changes, use
-     * {@link #ACCESSIBILITY_LIVE_REGION_POLITE}.
-     * <p>
-     * If the view's changes should interrupt ongoing speech and notify the user
-     * immediately, use {@link #ACCESSIBILITY_LIVE_REGION_ASSERTIVE}.
-     *
-     * @param view The view on which to set the live region mode
-     * @param mode The live region mode for this view, one of:
-     *        <ul>
-     *        <li>{@link #ACCESSIBILITY_LIVE_REGION_NONE}
-     *        <li>{@link #ACCESSIBILITY_LIVE_REGION_POLITE}
-     *        <li>{@link #ACCESSIBILITY_LIVE_REGION_ASSERTIVE}
-     *        </ul>
-     */
-    public static void setAccessibilityLiveRegion(View view, @AccessibilityLiveRegion int mode) {
-        IMPL.setAccessibilityLiveRegion(view, mode);
-    }
-
-    /**
-     * Returns the start padding of the specified view depending on its resolved layout direction.
-     * If there are inset and enabled scrollbars, this value may include the space
-     * required to display the scrollbars as well.
-     *
-     * @param view The view to get padding for
-     * @return the start padding in pixels
-     */
-    public static int getPaddingStart(View view) {
-        return IMPL.getPaddingStart(view);
-    }
-
-    /**
-     * Returns the end padding of the specified view depending on its resolved layout direction.
-     * If there are inset and enabled scrollbars, this value may include the space
-     * required to display the scrollbars as well.
-     *
-     * @param view The view to get padding for
-     * @return the end padding in pixels
-     */
-    public static int getPaddingEnd(View view) {
-        return IMPL.getPaddingEnd(view);
-    }
-
-    /**
-     * Sets the relative padding. The view may add on the space required to display
-     * the scrollbars, depending on the style and visibility of the scrollbars.
-     * So the values returned from {@link #getPaddingStart}, {@link View#getPaddingTop},
-     * {@link #getPaddingEnd} and {@link View#getPaddingBottom} may be different
-     * from the values set in this call.
-     *
-     * @param view The view on which to set relative padding
-     * @param start the start padding in pixels
-     * @param top the top padding in pixels
-     * @param end the end padding in pixels
-     * @param bottom the bottom padding in pixels
-     */
-    public static void setPaddingRelative(View view, int start, int top, int end, int bottom) {
-        IMPL.setPaddingRelative(view, start, top, end, bottom);
-    }
-
-    /**
-     * Notify a view that it is being temporarily detached.
-     */
-    public static void dispatchStartTemporaryDetach(View view) {
-        IMPL.dispatchStartTemporaryDetach(view);
-    }
-
-    /**
-     * Notify a view that its temporary detach has ended; the view is now reattached.
-     */
-    public static void dispatchFinishTemporaryDetach(View view) {
-        IMPL.dispatchFinishTemporaryDetach(view);
-    }
-
-    /**
-     * The horizontal location of this view relative to its {@link View#getLeft() left} position.
-     * This position is post-layout, in addition to wherever the object's
-     * layout placed it.
-     *
-     * <p>Prior to API 11 this will return 0.</p>
-     *
-     * @return The horizontal position of this view relative to its left position, in pixels.
-     */
-    public static float getTranslationX(View view) {
-        return IMPL.getTranslationX(view);
-    }
-
-    /**
-     * The vertical location of this view relative to its {@link View#getTop() top} position.
-     * This position is post-layout, in addition to wherever the object's
-     * layout placed it.
-     *
-     * <p>Prior to API 11 this will return 0.</p>
-     *
-     * @return The vertical position of this view relative to its top position, in pixels.
-     */
-    public static float getTranslationY(View view) {
-        return IMPL.getTranslationY(view);
-    }
-
-    /**
-     * The transform matrix of this view, which is calculated based on the current
-     * rotation, scale, and pivot properties.
-     * <p>
-     * Prior to 11, this method will return {@code null}.
-     *
-     * @param view The view whose Matrix will be returned
-     * @return The current transform matrix for the view
-     *
-     * @see #getRotation(View)
-     * @see #getScaleX(View)
-     * @see #getScaleY(View)
-     * @see #getPivotX(View)
-     * @see #getPivotY(View)
-     */
-    @Nullable
-    public static Matrix getMatrix(View view) {
-        return IMPL.getMatrix(view);
-    }
-
-    /**
-     * Returns the minimum width of the view.
-     *
-     * <p>Prior to API 16 this will return 0.</p>
-     *
-     * @return the minimum width the view will try to be.
-     */
-    public static int getMinimumWidth(View view) {
-        return IMPL.getMinimumWidth(view);
-    }
-
-    /**
-     * Returns the minimum height of the view.
-     *
-     * <p>Prior to API 16 this will return 0.</p>
-     *
-     * @return the minimum height the view will try to be.
-     */
-    public static int getMinimumHeight(View view) {
-        return IMPL.getMinimumHeight(view);
-    }
-
-    /**
-     * This method returns a ViewPropertyAnimator object, which can be used to animate
-     * specific properties on this View.
-     *
-     * <p>Prior to API 14, this method will do nothing.</p>
-     *
-     * @return ViewPropertyAnimator The ViewPropertyAnimator associated with this View.
-     */
-    public static ViewPropertyAnimatorCompat animate(View view) {
-        return IMPL.animate(view);
-    }
-
-    /**
-     * Sets the horizontal location of this view relative to its left position.
-     * This effectively positions the object post-layout, in addition to wherever the object's
-     * layout placed it.
-     *
-     * <p>Prior to API 11 this will have no effect.</p>
-     *
-     * @param value The horizontal position of this view relative to its left position,
-     * in pixels.
-     */
-    public static void setTranslationX(View view, float value) {
-        IMPL.setTranslationX(view, value);
-    }
-
-    /**
-     * Sets the vertical location of this view relative to its top position.
-     * This effectively positions the object post-layout, in addition to wherever the object's
-     * layout placed it.
-     *
-     * <p>Prior to API 11 this will have no effect.</p>
-     *
-     * @param value The vertical position of this view relative to its top position,
-     * in pixels.
-     *
-     * @attr name android:translationY
-     */
-    public static void setTranslationY(View view, float value) {
-        IMPL.setTranslationY(view, value);
-    }
-
-    /**
-     * <p>Sets the opacity of the view. This is a value from 0 to 1, where 0 means the view is
-     * completely transparent and 1 means the view is completely opaque.</p>
-     *
-     * <p> Note that setting alpha to a translucent value (0 < alpha < 1) can have significant
-     * performance implications, especially for large views. It is best to use the alpha property
-     * sparingly and transiently, as in the case of fading animations.</p>
-     *
-     * <p>Prior to API 11 this will have no effect.</p>
-     *
-     * @param value The opacity of the view.
-     */
-    public static void setAlpha(View view, @FloatRange(from=0.0, to=1.0) float value) {
-        IMPL.setAlpha(view, value);
-    }
-
-    /**
-     * Sets the visual x position of this view, in pixels. This is equivalent to setting the
-     * {@link #setTranslationX(View, float) translationX} property to be the difference between
-     * the x value passed in and the current left property of the view as determined
-     * by the layout bounds.
-     *
-     * <p>Prior to API 11 this will have no effect.</p>
-     *
-     * @param value The visual x position of this view, in pixels.
-     */
-    public static void setX(View view, float value) {
-        IMPL.setX(view, value);
-    }
-
-    /**
-     * Sets the visual y position of this view, in pixels. This is equivalent to setting the
-     * {@link #setTranslationY(View, float) translationY} property to be the difference between
-     * the y value passed in and the current top property of the view as determined by the
-     * layout bounds.
-     *
-     * <p>Prior to API 11 this will have no effect.</p>
-     *
-     * @param value The visual y position of this view, in pixels.
-     */
-    public static void setY(View view, float value) {
-        IMPL.setY(view, value);
-    }
-
-    /**
-     * Sets the degrees that the view is rotated around the pivot point. Increasing values
-     * result in clockwise rotation.
-     *
-     * <p>Prior to API 11 this will have no effect.</p>
-     *
-     * @param value The degrees of rotation.
-     */
-    public static void setRotation(View view, float value) {
-        IMPL.setRotation(view, value);
-    }
-
-    /**
-     * Sets the degrees that the view is rotated around the horizontal axis through the pivot point.
-     * Increasing values result in clockwise rotation from the viewpoint of looking down the
-     * x axis.
-     *
-     * <p>Prior to API 11 this will have no effect.</p>
-     *
-     * @param value The degrees of X rotation.
-     */
-    public static void setRotationX(View view, float value) {
-        IMPL.setRotationX(view, value);
-    }
-
-    /**
-     * Sets the degrees that the view is rotated around the vertical axis through the pivot point.
-     * Increasing values result in counter-clockwise rotation from the viewpoint of looking
-     * down the y axis.
-     *
-     * <p>Prior to API 11 this will have no effect.</p>
-     *
-     * @param value The degrees of Y rotation.
-     */
-    public static void setRotationY(View view, float value) {
-        IMPL.setRotationY(view, value);
-    }
-
-    /**
-     * Sets the amount that the view is scaled in x around the pivot point, as a proportion of
-     * the view's unscaled width. A value of 1 means that no scaling is applied.
-     *
-     * <p>Prior to API 11 this will have no effect.</p>
-     *
-     * @param value The scaling factor.
-     */
-    public static void setScaleX(View view, float value) {
-        IMPL.setScaleX(view, value);
-    }
-
-    /**
-     * Sets the amount that the view is scaled in Y around the pivot point, as a proportion of
-     * the view's unscaled width. A value of 1 means that no scaling is applied.
-     *
-     * <p>Prior to API 11 this will have no effect.</p>
-     *
-     * @param value The scaling factor.
-     */
-    public static void setScaleY(View view, float value) {
-        IMPL.setScaleY(view, value);
-    }
-
-    /**
-     * The x location of the point around which the view is
-     * {@link #setRotation(View, float) rotated} and {@link #setScaleX(View, float) scaled}.
-     *
-     * <p>Prior to API 11 this will have no effect.</p>
-     *
-     */
-    public static float getPivotX(View view) {
-        return IMPL.getPivotX(view);
-    }
-
-    /**
-     * Sets the x location of the point around which the view is
-     * {@link #setRotation(View, float) rotated} and {@link #setScaleX(View, float) scaled}.
-     * By default, the pivot point is centered on the object.
-     * Setting this property disables this behavior and causes the view to use only the
-     * explicitly set pivotX and pivotY values.
-     *
-     * <p>Prior to API 11 this will have no effect.</p>
-     *
-     * @param value The x location of the pivot point.
-     */
-    public static void setPivotX(View view, float value) {
-        IMPL.setPivotX(view, value);
-    }
-
-    /**
-     * The y location of the point around which the view is {@link #setRotation(View,
-     * float) rotated} and {@link #setScaleY(View, float) scaled}.
-     *
-     * <p>Prior to API 11 this will return 0.</p>
-     *
-     * @return The y location of the pivot point.
-     */
-    public static float getPivotY(View view) {
-        return IMPL.getPivotY(view);
-    }
-
-    /**
-     * Sets the y location of the point around which the view is
-     * {@link #setRotation(View, float) rotated} and {@link #setScaleY(View, float) scaled}.
-     * By default, the pivot point is centered on the object.
-     * Setting this property disables this behavior and causes the view to use only the
-     * explicitly set pivotX and pivotY values.
-     *
-     * <p>Prior to API 11 this will have no effect.</p>
-     *
-     * @param value The y location of the pivot point.
-     */
-    public static void setPivotY(View view, float value) {
-        IMPL.setPivotY(view, value);
-    }
-
-    public static float getRotation(View view) {
-        return IMPL.getRotation(view);
-    }
-
-    public static float getRotationX(View view) {
-        return IMPL.getRotationX(view);
-    }
-
-    public static float getRotationY(View view) {
-        return IMPL.getRotationY(view);
-    }
-
-    public static float getScaleX(View view) {
-        return IMPL.getScaleX(view);
-    }
-
-    public static float getScaleY(View view) {
-        return IMPL.getScaleY(view);
-    }
-
-    public static float getX(View view) {
-        return IMPL.getX(view);
-    }
-
-    public static float getY(View view) {
-        return IMPL.getY(view);
-    }
-
-    /**
-     * Sets the base elevation of this view, in pixels.
-     */
-    public static void setElevation(View view, float elevation) {
-        IMPL.setElevation(view, elevation);
-    }
-
-    /**
-     * The base elevation of this view relative to its parent, in pixels.
-     *
-     * @return The base depth position of the view, in pixels.
-     */
-    public static float getElevation(View view) {
-        return IMPL.getElevation(view);
-    }
-
-    /**
-     * Sets the depth location of this view relative to its {@link #getElevation(View) elevation}.
-     */
-    public static void setTranslationZ(View view, float translationZ) {
-        IMPL.setTranslationZ(view, translationZ);
-    }
-
-    /**
-     * The depth location of this view relative to its {@link #getElevation(View) elevation}.
-     *
-     * @return The depth of this view relative to its elevation.
-     */
-    public static float getTranslationZ(View view) {
-        return IMPL.getTranslationZ(view);
-    }
-
-    /**
-     * Sets the name of the View to be used to identify Views in Transitions.
-     * Names should be unique in the View hierarchy.
-     *
-     * @param view The View against which to invoke the method.
-     * @param transitionName The name of the View to uniquely identify it for Transitions.
-     */
-    public static void setTransitionName(View view, String transitionName) {
-        IMPL.setTransitionName(view, transitionName);
-    }
-
-    /**
-     * Returns the name of the View to be used to identify Views in Transitions.
-     * Names should be unique in the View hierarchy.
-     *
-     * <p>This returns null if the View has not been given a name.</p>
-     *
-     * @param view The View against which to invoke the method.
-     * @return The name used of the View to be used to identify Views in Transitions or null
-     * if no name has been given.
-     */
-    public static String getTransitionName(View view) {
-        return IMPL.getTransitionName(view);
-    }
-
-    /**
-     * Returns the current system UI visibility that is currently set for the entire window.
-     */
-    public static int getWindowSystemUiVisibility(View view) {
-        return IMPL.getWindowSystemUiVisibility(view);
-    }
-
-    /**
-     * Ask that a new dispatch of {@code View.onApplyWindowInsets(WindowInsets)} be performed. This
-     * falls back to {@code View.requestFitSystemWindows()} where available.
-     */
-    public static void requestApplyInsets(View view) {
-        IMPL.requestApplyInsets(view);
-    }
-
-    /**
-     * Tells the ViewGroup whether to draw its children in the order defined by the method
-     * {@code ViewGroup.getChildDrawingOrder(int, int)}.
-     *
-     * @param enabled true if the order of the children when drawing is determined by
-     *        {@link ViewGroup#getChildDrawingOrder(int, int)}, false otherwise
-     *
-     * <p>Prior to API 7 this will have no effect.</p>
-     */
-    public static void setChildrenDrawingOrderEnabled(ViewGroup viewGroup, boolean enabled) {
-       IMPL.setChildrenDrawingOrderEnabled(viewGroup, enabled);
-    }
-
-    /**
-     * Returns true if this view should adapt to fit system window insets. This method will always
-     * return false before API 16 (Jellybean).
-     */
-    public static boolean getFitsSystemWindows(View v) {
-        return IMPL.getFitsSystemWindows(v);
-    }
-
-    /**
-     * Sets whether or not this view should account for system screen decorations
-     * such as the status bar and inset its content; that is, controlling whether
-     * the default implementation of {@link View#fitSystemWindows(Rect)} will be
-     * executed. See that method for more details.
-     */
-    public static void setFitsSystemWindows(View view, boolean fitSystemWindows) {
-        IMPL.setFitsSystemWindows(view, fitSystemWindows);
-    }
-
-    /**
-     * On API 11 devices and above, call <code>Drawable.jumpToCurrentState()</code>
-     * on all Drawable objects associated with this view.
-     * <p>
-     * On API 21 and above, also calls <code>StateListAnimator#jumpToCurrentState()</code>
-     * if there is a StateListAnimator attached to this view.
-     */
-    public static void jumpDrawablesToCurrentState(View v) {
-        IMPL.jumpDrawablesToCurrentState(v);
-    }
-
-    /**
-     * Set an {@link OnApplyWindowInsetsListener} to take over the policy for applying
-     * window insets to this view. This will only take effect on devices with API 21 or above.
-     */
-    public static void setOnApplyWindowInsetsListener(View v,
-            OnApplyWindowInsetsListener listener) {
-        IMPL.setOnApplyWindowInsetsListener(v, listener);
-    }
-
-    /**
-     * Called when the view should apply {@link WindowInsetsCompat} according to its internal policy.
-     *
-     * <p>Clients may supply an {@link OnApplyWindowInsetsListener} to a view. If one is set
-     * it will be called during dispatch instead of this method. The listener may optionally
-     * call this method from its own implementation if it wishes to apply the view's default
-     * insets policy in addition to its own.</p>
-     *
-     * @param view The View against which to invoke the method.
-     * @param insets Insets to apply
-     * @return The supplied insets with any applied insets consumed
-     */
-    public static WindowInsetsCompat onApplyWindowInsets(View view, WindowInsetsCompat insets) {
-        return IMPL.onApplyWindowInsets(view, insets);
-    }
-
-    /**
-     * Request to apply the given window insets to this view or another view in its subtree.
-     *
-     * <p>This method should be called by clients wishing to apply insets corresponding to areas
-     * obscured by window decorations or overlays. This can include the status and navigation bars,
-     * action bars, input methods and more. New inset categories may be added in the future.
-     * The method returns the insets provided minus any that were applied by this view or its
-     * children.</p>
-     *
-     * @param insets Insets to apply
-     * @return The provided insets minus the insets that were consumed
-     */
-    public static WindowInsetsCompat dispatchApplyWindowInsets(View view,
-            WindowInsetsCompat insets) {
-        return IMPL.dispatchApplyWindowInsets(view, insets);
-    }
-
-    /**
-     * Controls whether the entire hierarchy under this view will save its
-     * state when a state saving traversal occurs from its parent.
-     *
-     * @param enabled Set to false to <em>disable</em> state saving, or true
-     * (the default) to allow it.
-     */
-    public static void setSaveFromParentEnabled(View v, boolean enabled) {
-        IMPL.setSaveFromParentEnabled(v, enabled);
-    }
-
-    /**
-     * Changes the activated state of this view. A view can be activated or not.
-     * Note that activation is not the same as selection.  Selection is
-     * a transient property, representing the view (hierarchy) the user is
-     * currently interacting with.  Activation is a longer-term state that the
-     * user can move views in and out of.
-     *
-     * @param activated true if the view must be activated, false otherwise
-     */
-    public static void setActivated(View view, boolean activated) {
-        IMPL.setActivated(view, activated);
-    }
-
-    /**
-     * Returns whether this View has content which overlaps.
-     *
-     * <p>This function, intended to be overridden by specific View types, is an optimization when
-     * alpha is set on a view. If rendering overlaps in a view with alpha < 1, that view is drawn to
-     * an offscreen buffer and then composited into place, which can be expensive. If the view has
-     * no overlapping rendering, the view can draw each primitive with the appropriate alpha value
-     * directly. An example of overlapping rendering is a TextView with a background image, such as
-     * a Button. An example of non-overlapping rendering is a TextView with no background, or an
-     * ImageView with only the foreground image. The default implementation returns true; subclasses
-     * should override if they have cases which can be optimized.</p>
-     *
-     * @return true if the content in this view might overlap, false otherwise.
-     */
-    public static boolean hasOverlappingRendering(View view) {
-        return IMPL.hasOverlappingRendering(view);
-    }
-
-    /**
-     * Return if the padding as been set through relative values
-     * {@code View.setPaddingRelative(int, int, int, int)} or thru
-     *
-     * @return true if the padding is relative or false if it is not.
-     */
-    public static boolean isPaddingRelative(View view) {
-        return IMPL.isPaddingRelative(view);
-    }
-
-    /**
-     * Return the tint applied to the background drawable, if specified.
-     * <p>
-     * Only returns meaningful info when running on API v21 or newer, or if {@code view}
-     * implements the {@code TintableBackgroundView} interface.
-     */
-    public static ColorStateList getBackgroundTintList(View view) {
-        return IMPL.getBackgroundTintList(view);
-    }
-
-    /**
-     * Applies a tint to the background drawable.
-     * <p>
-     * This will always take effect when running on API v21 or newer. When running on platforms
-     * previous to API v21, it will only take effect if {@code view} implement the
-     * {@code TintableBackgroundView} interface.
-     */
-    public static void setBackgroundTintList(View view, ColorStateList tintList) {
-        IMPL.setBackgroundTintList(view, tintList);
-    }
-
-    /**
-     * Return the blending mode used to apply the tint to the background
-     * drawable, if specified.
-     * <p>
-     * Only returns meaningful info when running on API v21 or newer, or if {@code view}
-     * implements the {@code TintableBackgroundView} interface.
-     */
-    public static PorterDuff.Mode getBackgroundTintMode(View view) {
-        return IMPL.getBackgroundTintMode(view);
-    }
-
-    /**
-     * Specifies the blending mode used to apply the tint specified by
-     * {@link #setBackgroundTintList(android.view.View, android.content.res.ColorStateList)} to
-     * the background drawable. The default mode is {@link PorterDuff.Mode#SRC_IN}.
-     * <p>
-     * This will always take effect when running on API v21 or newer. When running on platforms
-     * previous to API v21, it will only take effect if {@code view} implement the
-     * {@code TintableBackgroundView} interface.
-     */
-    public static void setBackgroundTintMode(View view, PorterDuff.Mode mode) {
-        IMPL.setBackgroundTintMode(view, mode);
-    }
-    // TODO: getters for various view properties (rotation, etc)
-
-    /**
-     * Enable or disable nested scrolling for this view.
-     *
-     * <p>If this property is set to true the view will be permitted to initiate nested
-     * scrolling operations with a compatible parent view in the current hierarchy. If this
-     * view does not implement nested scrolling this will have no effect. Disabling nested scrolling
-     * while a nested scroll is in progress has the effect of
-     * {@link #stopNestedScroll(View) stopping} the nested scroll.</p>
-     *
-     * @param enabled true to enable nested scrolling, false to disable
-     *
-     * @see #isNestedScrollingEnabled(View)
-     */
-    public static void setNestedScrollingEnabled(View view, boolean enabled) {
-        IMPL.setNestedScrollingEnabled(view, enabled);
-    }
-
-    /**
-     * Returns true if nested scrolling is enabled for this view.
-     *
-     * <p>If nested scrolling is enabled and this View class implementation supports it,
-     * this view will act as a nested scrolling child view when applicable, forwarding data
-     * about the scroll operation in progress to a compatible and cooperating nested scrolling
-     * parent.</p>
-     *
-     * @return true if nested scrolling is enabled
-     *
-     * @see #setNestedScrollingEnabled(View, boolean)
-     */
-    public static boolean isNestedScrollingEnabled(View view) {
-        return IMPL.isNestedScrollingEnabled(view);
-    }
-
-    /**
-     * Begin a nestable scroll operation along the given axes.
-     *
-     * <p>A view starting a nested scroll promises to abide by the following contract:</p>
-     *
-     * <p>The view will call startNestedScroll upon initiating a scroll operation. In the case
-     * of a touch scroll this corresponds to the initial {@link MotionEvent#ACTION_DOWN}.
-     * In the case of touch scrolling the nested scroll will be terminated automatically in
-     * the same manner as {@link ViewParent#requestDisallowInterceptTouchEvent(boolean)}.
-     * In the event of programmatic scrolling the caller must explicitly call
-     * {@link #stopNestedScroll(View)} to indicate the end of the nested scroll.</p>
-     *
-     * <p>If <code>startNestedScroll</code> returns true, a cooperative parent was found.
-     * If it returns false the caller may ignore the rest of this contract until the next scroll.
-     * Calling startNestedScroll while a nested scroll is already in progress will return true.</p>
-     *
-     * <p>At each incremental step of the scroll the caller should invoke
-     * {@link #dispatchNestedPreScroll(View, int, int, int[], int[]) dispatchNestedPreScroll}
-     * once it has calculated the requested scrolling delta. If it returns true the nested scrolling
-     * parent at least partially consumed the scroll and the caller should adjust the amount it
-     * scrolls by.</p>
-     *
-     * <p>After applying the remainder of the scroll delta the caller should invoke
-     * {@link #dispatchNestedScroll(View, int, int, int, int, int[]) dispatchNestedScroll}, passing
-     * both the delta consumed and the delta unconsumed. A nested scrolling parent may treat
-     * these values differently. See
-     * {@link NestedScrollingParent#onNestedScroll(View, int, int, int, int)}.
-     * </p>
-     *
-     * @param axes Flags consisting of a combination of {@link ViewCompat#SCROLL_AXIS_HORIZONTAL}
-     *             and/or {@link ViewCompat#SCROLL_AXIS_VERTICAL}.
-     * @return true if a cooperative parent was found and nested scrolling has been enabled for
-     *         the current gesture.
-     *
-     * @see #stopNestedScroll(View)
-     * @see #dispatchNestedPreScroll(View, int, int, int[], int[])
-     * @see #dispatchNestedScroll(View, int, int, int, int, int[])
-     */
-    public static boolean startNestedScroll(View view, int axes) {
-        return IMPL.startNestedScroll(view, axes);
-    }
-
-    /**
-     * Stop a nested scroll in progress.
-     *
-     * <p>Calling this method when a nested scroll is not currently in progress is harmless.</p>
-     *
-     * @see #startNestedScroll(View, int)
-     */
-    public static void stopNestedScroll(View view) {
-        IMPL.stopNestedScroll(view);
-    }
-
-    /**
-     * Returns true if this view has a nested scrolling parent.
-     *
-     * <p>The presence of a nested scrolling parent indicates that this view has initiated
-     * a nested scroll and it was accepted by an ancestor view further up the view hierarchy.</p>
-     *
-     * @return whether this view has a nested scrolling parent
-     */
-    public static boolean hasNestedScrollingParent(View view) {
-        return IMPL.hasNestedScrollingParent(view);
-    }
-
-    /**
-     * Dispatch one step of a nested scroll in progress.
-     *
-     * <p>Implementations of views that support nested scrolling should call this to report
-     * info about a scroll in progress to the current nested scrolling parent. If a nested scroll
-     * is not currently in progress or nested scrolling is not
-     * {@link #isNestedScrollingEnabled(View) enabled} for this view this method does nothing.</p>
-     *
-     * <p>Compatible View implementations should also call
-     * {@link #dispatchNestedPreScroll(View, int, int, int[], int[]) dispatchNestedPreScroll} before
-     * consuming a component of the scroll event themselves.</p>
-     *
-     * @param dxConsumed Horizontal distance in pixels consumed by this view during this scroll step
-     * @param dyConsumed Vertical distance in pixels consumed by this view during this scroll step
-     * @param dxUnconsumed Horizontal scroll distance in pixels not consumed by this view
-     * @param dyUnconsumed Horizontal scroll distance in pixels not consumed by this view
-     * @param offsetInWindow Optional. If not null, on return this will contain the offset
-     *                       in local view coordinates of this view from before this operation
-     *                       to after it completes. View implementations may use this to adjust
-     *                       expected input coordinate tracking.
-     * @return true if the event was dispatched, false if it could not be dispatched.
-     * @see #dispatchNestedPreScroll(View, int, int, int[], int[])
-     */
-    public static boolean dispatchNestedScroll(View view, int dxConsumed, int dyConsumed,
-            int dxUnconsumed, int dyUnconsumed, int[] offsetInWindow) {
-        return IMPL.dispatchNestedScroll(view, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed,
-                offsetInWindow);
-    }
-
-    /**
-     * Dispatch one step of a nested scroll in progress before this view consumes any portion of it.
-     *
-     * <p>Nested pre-scroll events are to nested scroll events what touch intercept is to touch.
-     * <code>dispatchNestedPreScroll</code> offers an opportunity for the parent view in a nested
-     * scrolling operation to consume some or all of the scroll operation before the child view
-     * consumes it.</p>
-     *
-     * @param dx Horizontal scroll distance in pixels
-     * @param dy Vertical scroll distance in pixels
-     * @param consumed Output. If not null, consumed[0] will contain the consumed component of dx
-     *                 and consumed[1] the consumed dy.
-     * @param offsetInWindow Optional. If not null, on return this will contain the offset
-     *                       in local view coordinates of this view from before this operation
-     *                       to after it completes. View implementations may use this to adjust
-     *                       expected input coordinate tracking.
-     * @return true if the parent consumed some or all of the scroll delta
-     * @see #dispatchNestedScroll(View, int, int, int, int, int[])
-     */
-    public static boolean dispatchNestedPreScroll(View view, int dx, int dy, int[] consumed,
-            int[] offsetInWindow) {
-        return IMPL.dispatchNestedPreScroll(view, dx, dy, consumed, offsetInWindow);
-    }
-
-    /**
-     * Dispatch a fling to a nested scrolling parent.
-     *
-     * <p>This method should be used to indicate that a nested scrolling child has detected
-     * suitable conditions for a fling. Generally this means that a touch scroll has ended with a
-     * {@link VelocityTracker velocity} in the direction of scrolling that meets or exceeds
-     * the {@link ViewConfiguration#getScaledMinimumFlingVelocity() minimum fling velocity}
-     * along a scrollable axis.</p>
-     *
-     * <p>If a nested scrolling child view would normally fling but it is at the edge of
-     * its own content, it can use this method to delegate the fling to its nested scrolling
-     * parent instead. The parent may optionally consume the fling or observe a child fling.</p>
-     *
-     * @param velocityX Horizontal fling velocity in pixels per second
-     * @param velocityY Vertical fling velocity in pixels per second
-     * @param consumed true if the child consumed the fling, false otherwise
-     * @return true if the nested scrolling parent consumed or otherwise reacted to the fling
-     */
-    public static boolean dispatchNestedFling(View view, float velocityX, float velocityY,
-            boolean consumed) {
-        return IMPL.dispatchNestedFling(view, velocityX, velocityY, consumed);
-    }
-
-    /**
-     * Dispatch a fling to a nested scrolling parent before it is processed by this view.
-     *
-     * <p>Nested pre-fling events are to nested fling events what touch intercept is to touch
-     * and what nested pre-scroll is to nested scroll. <code>dispatchNestedPreFling</code>
-     * offsets an opportunity for the parent view in a nested fling to fully consume the fling
-     * before the child view consumes it. If this method returns <code>true</code>, a nested
-     * parent view consumed the fling and this view should not scroll as a result.</p>
-     *
-     * <p>For a better user experience, only one view in a nested scrolling chain should consume
-     * the fling at a time. If a parent view consumed the fling this method will return false.
-     * Custom view implementations should account for this in two ways:</p>
-     *
-     * <ul>
-     *     <li>If a custom view is paged and needs to settle to a fixed page-point, do not
-     *     call <code>dispatchNestedPreFling</code>; consume the fling and settle to a valid
-     *     position regardless.</li>
-     *     <li>If a nested parent does consume the fling, this view should not scroll at all,
-     *     even to settle back to a valid idle position.</li>
-     * </ul>
-     *
-     * <p>Views should also not offer fling velocities to nested parent views along an axis
-     * where scrolling is not currently supported; a {@link android.widget.ScrollView ScrollView}
-     * should not offer a horizontal fling velocity to its parents since scrolling along that
-     * axis is not permitted and carrying velocity along that motion does not make sense.</p>
-     *
-     * @param velocityX Horizontal fling velocity in pixels per second
-     * @param velocityY Vertical fling velocity in pixels per second
-     * @return true if a nested scrolling parent consumed the fling
-     */
-    public static boolean dispatchNestedPreFling(View view, float velocityX, float velocityY) {
-        return IMPL.dispatchNestedPreFling(view, velocityX, velocityY);
-    }
-
-    /**
-     * Returns whether the view hierarchy is currently undergoing a layout pass. This
-     * information is useful to avoid situations such as calling {@link View#requestLayout()}
-     * during a layout pass.
-     * <p>
-     * Compatibility:
-     * <ul>
-     *     <li>API < 18: Always returns {@code false}</li>
-     * </ul>
-     *
-     * @return whether the view hierarchy is currently undergoing a layout pass
-     */
-    public static boolean isInLayout(View view) {
-        return IMPL.isInLayout(view);
-    }
-
-    /**
-     * Returns true if {@code view} has been through at least one layout since it
-     * was last attached to or detached from a window.
-     */
-    public static boolean isLaidOut(View view) {
-        return IMPL.isLaidOut(view);
-    }
-
-    /**
-     * Returns whether layout direction has been resolved.
-     * <p>
-     * Compatibility:
-     * <ul>
-     *     <li>API < 19: Always returns {@code false}</li>
-     * </ul>
-     *
-     * @return true if layout direction has been resolved.
-     */
-    public static boolean isLayoutDirectionResolved(View view) {
-        return IMPL.isLayoutDirectionResolved(view);
-    }
-
-    /**
-     * The visual z position of this view, in pixels. This is equivalent to the
-     * {@link #setTranslationZ(View, float) translationZ} property plus the current
-     * {@link #getElevation(View) elevation} property.
-     *
-     * @return The visual z position of this view, in pixels.
-     */
-    public static float getZ(View view) {
-        return IMPL.getZ(view);
-    }
-
-    /**
-     * Sets the visual z position of this view, in pixels. This is equivalent to setting the
-     * {@link #setTranslationZ(View, float) translationZ} property to be the difference between
-     * the x value passed in and the current {@link #getElevation(View) elevation} property.
-     * <p>
-     * Compatibility:
-     * <ul>
-     *     <li>API < 21: No-op
-     * </ul>
-     *
-     * @param z The visual z position of this view, in pixels.
-     */
-    public static void setZ(View view, float z) {
-        IMPL.setZ(view, z);
-    }
-
-    /**
-     * Offset this view's vertical location by the specified number of pixels.
-     *
-     * @param offset the number of pixels to offset the view by
-     */
-    public static void offsetTopAndBottom(View view, int offset) {
-        IMPL.offsetTopAndBottom(view, offset);
-    }
-
-    /**
-     * Offset this view's horizontal location by the specified amount of pixels.
-     *
-     * @param offset the number of pixels to offset the view by
-     */
-    public static void offsetLeftAndRight(View view, int offset) {
-        IMPL.offsetLeftAndRight(view, offset);
-    }
-
-    /**
-     * Sets a rectangular area on this view to which the view will be clipped
-     * when it is drawn. Setting the value to null will remove the clip bounds
-     * and the view will draw normally, using its full bounds.
-     *
-     * <p>Prior to API 18 this does nothing.</p>
-     *
-     * @param view       The view to set clipBounds.
-     * @param clipBounds The rectangular area, in the local coordinates of
-     * this view, to which future drawing operations will be clipped.
-     */
-    public static void setClipBounds(View view, Rect clipBounds) {
-        IMPL.setClipBounds(view, clipBounds);
-    }
-
-    /**
-     * Returns a copy of the current {@link #setClipBounds(View, Rect)}.
-     *
-     * <p>Prior to API 18 this will return null.</p>
-     *
-     * @return A copy of the current clip bounds if clip bounds are set,
-     * otherwise null.
-     */
-    public static Rect getClipBounds(View view) {
-        return IMPL.getClipBounds(view);
-    }
-
-    /**
-     * Returns true if the provided view is currently attached to a window.
-     */
-    public static boolean isAttachedToWindow(View view) {
-        return IMPL.isAttachedToWindow(view);
-    }
-
-    /**
-     * Returns whether the provided view has an attached {@link View.OnClickListener}.
-     *
-     * @return true if there is a listener, false if there is none.
-     */
-    public static boolean hasOnClickListeners(View view) {
-        return IMPL.hasOnClickListeners(view);
-    }
-
-    /**
-     * Sets the state of all scroll indicators.
-     * <p>
-     * See {@link #setScrollIndicators(View, int, int)} for usage information.
-     *
-     * @param indicators a bitmask of indicators that should be enabled, or
-     *                   {@code 0} to disable all indicators
-     *
-     * @see #setScrollIndicators(View, int, int)
-     * @see #getScrollIndicators(View)
-     */
-    public static void setScrollIndicators(@NonNull View view, @ScrollIndicators int indicators) {
-        IMPL.setScrollIndicators(view, indicators);
-    }
-
-    /**
-     * Sets the state of the scroll indicators specified by the mask. To change
-     * all scroll indicators at once, see {@link #setScrollIndicators(View, int)}.
-     * <p>
-     * When a scroll indicator is enabled, it will be displayed if the view
-     * can scroll in the direction of the indicator.
-     * <p>
-     * Multiple indicator types may be enabled or disabled by passing the
-     * logical OR of the desired types. If multiple types are specified, they
-     * will all be set to the same enabled state.
-     * <p>
-     * For example, to enable the top scroll indicatorExample: {@code setScrollIndicators}
-     *
-     * @param indicators the indicator direction, or the logical OR of multiple
-     *             indicator directions. One or more of:
-     *             <ul>
-     *               <li>{@link #SCROLL_INDICATOR_TOP}</li>
-     *               <li>{@link #SCROLL_INDICATOR_BOTTOM}</li>
-     *               <li>{@link #SCROLL_INDICATOR_LEFT}</li>
-     *               <li>{@link #SCROLL_INDICATOR_RIGHT}</li>
-     *               <li>{@link #SCROLL_INDICATOR_START}</li>
-     *               <li>{@link #SCROLL_INDICATOR_END}</li>
-     *             </ul>
-     *
-     * @see #setScrollIndicators(View, int)
-     * @see #getScrollIndicators(View)
-     */
-    public static void setScrollIndicators(@NonNull View view, @ScrollIndicators int indicators,
-            @ScrollIndicators int mask) {
-        IMPL.setScrollIndicators(view, indicators, mask);
-    }
-
-    /**
-     * Returns a bitmask representing the enabled scroll indicators.
-     * <p>
-     * For example, if the top and left scroll indicators are enabled and all
-     * other indicators are disabled, the return value will be
-     * {@code ViewCompat.SCROLL_INDICATOR_TOP | ViewCompat.SCROLL_INDICATOR_LEFT}.
-     * <p>
-     * To check whether the bottom scroll indicator is enabled, use the value
-     * of {@code (ViewCompat.getScrollIndicators(view) & ViewCompat.SCROLL_INDICATOR_BOTTOM) != 0}.
-     *
-     * @return a bitmask representing the enabled scroll indicators
-     */
-    public static int getScrollIndicators(@NonNull View view) {
-        return IMPL.getScrollIndicators(view);
-    }
-
-    /**
-     * Set the pointer icon for the current view.
-     * @param pointerIcon A PointerIconCompat instance which will be shown when the mouse hovers.
-     */
-    public static void setPointerIcon(@NonNull View view, PointerIconCompat pointerIcon) {
-        IMPL.setPointerIcon(view, pointerIcon);
-    }
-
-    protected ViewCompat() {}
-}
diff --git a/v4/java/android/support/v4/view/ViewConfigurationCompat.java b/v4/java/android/support/v4/view/ViewConfigurationCompat.java
deleted file mode 100644
index c51eb41..0000000
--- a/v4/java/android/support/v4/view/ViewConfigurationCompat.java
+++ /dev/null
@@ -1,117 +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 android.support.v4.view;
-
-import android.view.ViewConfiguration;
-
-/**
- * Helper for accessing features in {@link ViewConfiguration}
- * introduced after API level 4 in a backwards compatible fashion.
- */
-public final class ViewConfigurationCompat {
-    /**
-     * Interface for the full API.
-     */
-    interface ViewConfigurationVersionImpl {
-        public int getScaledPagingTouchSlop(ViewConfiguration config);
-        public boolean hasPermanentMenuKey(ViewConfiguration config);
-    }
-
-    /**
-     * Interface implementation that doesn't use anything about v4 APIs.
-     */
-    static class BaseViewConfigurationVersionImpl implements ViewConfigurationVersionImpl {
-        @Override
-        public int getScaledPagingTouchSlop(ViewConfiguration config) {
-            return config.getScaledTouchSlop();
-        }
-
-        @Override
-        public boolean hasPermanentMenuKey(ViewConfiguration config) {
-            // Pre-HC devices will always have a menu button
-            return true;
-        }
-    }
-
-    /**
-     * Interface implementation for devices with at least v8 APIs.
-     */
-    static class FroyoViewConfigurationVersionImpl extends BaseViewConfigurationVersionImpl {
-        @Override
-        public int getScaledPagingTouchSlop(ViewConfiguration config) {
-            return ViewConfigurationCompatFroyo.getScaledPagingTouchSlop(config);
-        }
-    }
-
-    /**
-     * Interface implementation for devices with at least v11 APIs.
-     */
-    static class HoneycombViewConfigurationVersionImpl extends FroyoViewConfigurationVersionImpl {
-        @Override
-        public boolean hasPermanentMenuKey(ViewConfiguration config) {
-            // There is no way to check on Honeycomb so we assume false
-            return false;
-        }
-    }
-
-    /**
-     * Interface implementation for devices with at least v14 APIs.
-     */
-    static class IcsViewConfigurationVersionImpl extends HoneycombViewConfigurationVersionImpl {
-        @Override
-        public boolean hasPermanentMenuKey(ViewConfiguration config) {
-            return ViewConfigurationCompatICS.hasPermanentMenuKey(config);
-        }
-    }
-
-    /**
-     * Select the correct implementation to use for the current platform.
-     */
-    static final ViewConfigurationVersionImpl IMPL;
-    static {
-        if (android.os.Build.VERSION.SDK_INT >= 14) {
-            IMPL = new IcsViewConfigurationVersionImpl();
-        } else if (android.os.Build.VERSION.SDK_INT >= 11) {
-            IMPL = new HoneycombViewConfigurationVersionImpl();
-        } else if (android.os.Build.VERSION.SDK_INT >= 8) {
-            IMPL = new FroyoViewConfigurationVersionImpl();
-        } else {
-            IMPL = new BaseViewConfigurationVersionImpl();
-        }
-    }
-
-    // -------------------------------------------------------------------
-
-    /**
-     * Call {@link ViewConfiguration#getScaledPagingTouchSlop()}.
-     * If running on a pre-{@link android.os.Build.VERSION_CODES#FROYO} device,
-     * returns {@link ViewConfiguration#getScaledTouchSlop()}.
-     */
-    public static int getScaledPagingTouchSlop(ViewConfiguration config) {
-        return IMPL.getScaledPagingTouchSlop(config);
-    }
-
-    /**
-     * Report if the device has a permanent menu key available to the user, in a backwards
-     * compatible way.
-     */
-    public static boolean hasPermanentMenuKey(ViewConfiguration config) {
-        return IMPL.hasPermanentMenuKey(config);
-    }
-
-    private ViewConfigurationCompat() {}
-}
diff --git a/v4/java/android/support/v4/view/ViewGroupCompat.java b/v4/java/android/support/v4/view/ViewGroupCompat.java
deleted file mode 100644
index fbb75c7..0000000
--- a/v4/java/android/support/v4/view/ViewGroupCompat.java
+++ /dev/null
@@ -1,265 +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 android.support.v4.view;
-
-import android.os.Build;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.accessibility.AccessibilityEvent;
-
-/**
- * Helper for accessing features in {@link ViewGroup}
- * introduced after API level 4 in a backwards compatible fashion.
- */
-public final class ViewGroupCompat {
-
-    /**
-     * This constant is a {@link #setLayoutMode(ViewGroup, int) layoutMode}.
-     * Clip bounds are the raw values of {@link android.view.View#getLeft() left},
-     * {@link android.view.View#getTop() top},
-     * {@link android.view.View#getRight() right} and {@link android.view.View#getBottom() bottom}.
-     */
-    public static final int LAYOUT_MODE_CLIP_BOUNDS = 0;
-
-    /**
-     * This constant is a {@link #setLayoutMode(ViewGroup, int) layoutMode}.
-     * Optical bounds describe where a widget appears to be. They sit inside the clip
-     * bounds which need to cover a larger area to allow other effects,
-     * such as shadows and glows, to be drawn.
-     */
-    public static final int LAYOUT_MODE_OPTICAL_BOUNDS = 1;
-
-    interface ViewGroupCompatImpl {
-        boolean onRequestSendAccessibilityEvent(ViewGroup group, View child,
-                AccessibilityEvent event);
-        void setMotionEventSplittingEnabled(ViewGroup group, boolean split);
-        int getLayoutMode(ViewGroup group);
-        void setLayoutMode(ViewGroup group, int mode);
-        void setTransitionGroup(ViewGroup group, boolean isTransitionGroup);
-        boolean isTransitionGroup(ViewGroup group);
-        int getNestedScrollAxes(ViewGroup group);
-    }
-
-    static class ViewGroupCompatStubImpl implements ViewGroupCompatImpl {
-        public boolean onRequestSendAccessibilityEvent(
-                ViewGroup group, View child, AccessibilityEvent event) {
-            return true;
-        }
-
-        public void setMotionEventSplittingEnabled(ViewGroup group, boolean split) {
-            // no-op, didn't exist.
-        }
-
-        @Override
-        public int getLayoutMode(ViewGroup group) {
-            return LAYOUT_MODE_CLIP_BOUNDS;
-        }
-
-        @Override
-        public void setLayoutMode(ViewGroup group, int mode) {
-            // no-op, didn't exist. Views only support clip bounds.
-        }
-
-        @Override
-        public void setTransitionGroup(ViewGroup group, boolean isTransitionGroup) {
-        }
-
-        @Override
-        public boolean isTransitionGroup(ViewGroup group) {
-            return false;
-        }
-
-        @Override
-        public int getNestedScrollAxes(ViewGroup group) {
-            if (group instanceof NestedScrollingParent) {
-                return ((NestedScrollingParent) group).getNestedScrollAxes();
-            }
-            return ViewCompat.SCROLL_AXIS_NONE;
-        }
-    }
-
-    static class ViewGroupCompatHCImpl extends ViewGroupCompatStubImpl {
-        @Override
-        public void setMotionEventSplittingEnabled(ViewGroup group, boolean split) {
-            ViewGroupCompatHC.setMotionEventSplittingEnabled(group, split);
-        }
-    }
-
-    static class ViewGroupCompatIcsImpl extends ViewGroupCompatHCImpl {
-        @Override
-        public boolean onRequestSendAccessibilityEvent(
-                ViewGroup group, View child, AccessibilityEvent event) {
-            return ViewGroupCompatIcs.onRequestSendAccessibilityEvent(group, child, event);
-        }
-    }
-
-    static class ViewGroupCompatJellybeanMR2Impl extends ViewGroupCompatIcsImpl {
-        @Override
-        public int getLayoutMode(ViewGroup group) {
-            return ViewGroupCompatJellybeanMR2.getLayoutMode(group);
-        }
-
-        @Override
-        public void setLayoutMode(ViewGroup group, int mode) {
-            ViewGroupCompatJellybeanMR2.setLayoutMode(group, mode);
-        }
-    }
-
-    static class ViewGroupCompatLollipopImpl extends ViewGroupCompatJellybeanMR2Impl {
-        @Override
-        public void setTransitionGroup(ViewGroup group, boolean isTransitionGroup) {
-            ViewGroupCompatLollipop.setTransitionGroup(group, isTransitionGroup);
-        }
-
-        @Override
-        public boolean isTransitionGroup(ViewGroup group) {
-            return ViewGroupCompatLollipop.isTransitionGroup(group);
-        }
-
-        @Override
-        public int getNestedScrollAxes(ViewGroup group) {
-            return ViewGroupCompatLollipop.getNestedScrollAxes(group);
-        }
-    }
-
-    static final ViewGroupCompatImpl IMPL;
-    static {
-        final int version = Build.VERSION.SDK_INT;
-        if (version >= 21) {
-            IMPL = new ViewGroupCompatLollipopImpl();
-        } else if (version >= 18) {
-            IMPL = new ViewGroupCompatJellybeanMR2Impl();
-        } else if (version >= 14) {
-            IMPL = new ViewGroupCompatIcsImpl();
-        } else if (version >= 11) {
-            IMPL = new ViewGroupCompatHCImpl();
-        } else {
-            IMPL = new ViewGroupCompatStubImpl();
-        }
-    }
-
-    /*
-     * Hide the constructor.
-     */
-    private ViewGroupCompat() {}
-
-    /**
-     * Called when a child has requested sending an {@link AccessibilityEvent} and
-     * gives an opportunity to its parent to augment the event.
-     * <p>
-     * If an {@link AccessibilityDelegateCompat} has been specified via calling
-     * {@link ViewCompat#setAccessibilityDelegate(View, AccessibilityDelegateCompat)} its
-     * {@link AccessibilityDelegateCompat#onRequestSendAccessibilityEvent(ViewGroup, View,
-     * AccessibilityEvent)} is responsible for handling this call.
-     * </p>
-     *
-     * @param group The group whose method to invoke.
-     * @param child The child which requests sending the event.
-     * @param event The event to be sent.
-     * @return True if the event should be sent.
-     */
-    public static boolean onRequestSendAccessibilityEvent(ViewGroup group, View child,
-            AccessibilityEvent event) {
-        return IMPL.onRequestSendAccessibilityEvent(group, child, event);
-    }
-
-    /**
-     * Enable or disable the splitting of MotionEvents to multiple children during touch event
-     * dispatch. This behavior is enabled by default for applications that target an
-     * SDK version of 11 (Honeycomb) or newer. On earlier platform versions this feature
-     * was not supported and this method is a no-op.
-     *
-     * <p>When this option is enabled MotionEvents may be split and dispatched to different child
-     * views depending on where each pointer initially went down. This allows for user interactions
-     * such as scrolling two panes of content independently, chording of buttons, and performing
-     * independent gestures on different pieces of content.
-     *
-     * @param group ViewGroup to modify
-     * @param split <code>true</code> to allow MotionEvents to be split and dispatched to multiple
-     *              child views. <code>false</code> to only allow one child view to be the target of
-     *              any MotionEvent received by this ViewGroup.
-     */
-    public static void setMotionEventSplittingEnabled(ViewGroup group, boolean split) {
-        IMPL.setMotionEventSplittingEnabled(group, split);
-    }
-
-    /**
-     * Returns the basis of alignment during layout operations on this ViewGroup:
-     * either {@link #LAYOUT_MODE_CLIP_BOUNDS} or {@link #LAYOUT_MODE_OPTICAL_BOUNDS}.
-     * <p>
-     * If no layoutMode was explicitly set, either programmatically or in an XML resource,
-     * the method returns the layoutMode of the view's parent ViewGroup if such a parent exists,
-     * otherwise the method returns a default value of {@link #LAYOUT_MODE_CLIP_BOUNDS}.
-     *
-     * @return the layout mode to use during layout operations
-     *
-     * @see #setLayoutMode(ViewGroup, int)
-     */
-    public static int getLayoutMode(ViewGroup group) {
-        return IMPL.getLayoutMode(group);
-    }
-
-    /**
-     * Sets the basis of alignment during the layout of this ViewGroup.
-     * Valid values are either {@link #LAYOUT_MODE_CLIP_BOUNDS} or
-     * {@link #LAYOUT_MODE_OPTICAL_BOUNDS}.
-     *
-     * @param mode the layout mode to use during layout operations
-     *
-     * @see #getLayoutMode(ViewGroup)
-     */
-    public static void setLayoutMode(ViewGroup group, int mode) {
-        IMPL.setLayoutMode(group, mode);
-    }
-
-    /**
-     * Changes whether or not this ViewGroup should be treated as a single entity during
-     * Activity Transitions.
-     * @param isTransitionGroup Whether or not the ViewGroup should be treated as a unit
-     *                          in Activity transitions. If false, the ViewGroup won't transition,
-     *                          only its children. If true, the entire ViewGroup will transition
-     *                          together.
-     */
-    public static void setTransitionGroup(ViewGroup group, boolean isTransitionGroup) {
-        IMPL.setTransitionGroup(group, isTransitionGroup);
-    }
-
-    /**
-     * Returns true if this ViewGroup should be considered as a single entity for removal
-     * when executing an Activity transition. If this is false, child elements will move
-     * individually during the transition.
-     */
-    public static boolean isTransitionGroup(ViewGroup group) {
-        return IMPL.isTransitionGroup(group);
-    }
-
-    /**
-     * Return the current axes of nested scrolling for this ViewGroup.
-     *
-     * <p>A ViewGroup returning something other than {@link ViewCompat#SCROLL_AXIS_NONE} is
-     * currently acting as a nested scrolling parent for one or more descendant views in
-     * the hierarchy.</p>
-     *
-     * @return Flags indicating the current axes of nested scrolling
-     * @see ViewCompat#SCROLL_AXIS_HORIZONTAL
-     * @see ViewCompat#SCROLL_AXIS_VERTICAL
-     * @see ViewCompat#SCROLL_AXIS_NONE
-     */
-    public static int getNestedScrollAxes(ViewGroup group) {
-        return IMPL.getNestedScrollAxes(group);
-    }
-}
diff --git a/v4/java/android/support/v4/view/ViewPager.java b/v4/java/android/support/v4/view/ViewPager.java
deleted file mode 100644
index ce18817..0000000
--- a/v4/java/android/support/v4/view/ViewPager.java
+++ /dev/null
@@ -1,3131 +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 android.support.v4.view;
-
-import android.content.Context;
-import android.content.res.Resources;
-import android.content.res.TypedArray;
-import android.database.DataSetObserver;
-import android.graphics.Canvas;
-import android.graphics.Rect;
-import android.graphics.drawable.Drawable;
-import android.os.Build;
-import android.os.Bundle;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.os.SystemClock;
-import android.support.annotation.CallSuper;
-import android.support.annotation.DrawableRes;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.v4.os.ParcelableCompat;
-import android.support.v4.os.ParcelableCompatCreatorCallbacks;
-import android.support.v4.view.accessibility.AccessibilityEventCompat;
-import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat;
-import android.support.v4.view.accessibility.AccessibilityRecordCompat;
-import android.support.v4.widget.EdgeEffectCompat;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.view.FocusFinder;
-import android.view.Gravity;
-import android.view.KeyEvent;
-import android.view.MotionEvent;
-import android.view.SoundEffectConstants;
-import android.view.VelocityTracker;
-import android.view.View;
-import android.view.ViewConfiguration;
-import android.view.ViewGroup;
-import android.view.ViewParent;
-import android.view.accessibility.AccessibilityEvent;
-import android.view.animation.Interpolator;
-import android.widget.Scroller;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-
-/**
- * Layout manager that allows the user to flip left and right
- * through pages of data.  You supply an implementation of a
- * {@link PagerAdapter} to generate the pages that the view shows.
- *
- * <p>ViewPager is most often used in conjunction with {@link android.app.Fragment},
- * which is a convenient way to supply and manage the lifecycle of each page.
- * There are standard adapters implemented for using fragments with the ViewPager,
- * which cover the most common use cases.  These are
- * {@link android.support.v4.app.FragmentPagerAdapter} and
- * {@link android.support.v4.app.FragmentStatePagerAdapter}; each of these
- * classes have simple code showing how to build a full user interface
- * with them.
- *
- * <p>Views which are annotated with the {@link DecorView} annotation are treated as
- * part of the view pagers 'decor'. Each decor view's position can be controlled via
- * its {@code android:layout_gravity} attribute. For example:
- *
- * <pre>
- * &lt;android.support.v4.view.ViewPager
- *     android:layout_width=&quot;match_parent&quot;
- *     android:layout_height=&quot;match_parent&quot;&gt;
- *
- *     &lt;android.support.v4.view.PagerTitleStrip
- *         android:layout_width=&quot;match_parent&quot;
- *         android:layout_height=&quot;wrap_content&quot;
- *         android:layout_gravity=&quot;top&quot; /&gt;
- *
- * &lt;/android.support.v4.view.ViewPager&gt;
- * </pre>
- *
- * <p>For more information about how to use ViewPager, read <a
- * href="{@docRoot}training/implementing-navigation/lateral.html">Creating Swipe Views with
- * Tabs</a>.</p>
- *
- * <p>Below is a more complicated example of ViewPager, using it in conjunction
- * with {@link android.app.ActionBar} tabs.  You can find other examples of using
- * ViewPager in the API 4+ Support Demos and API 13+ Support Demos sample code.
- *
- * {@sample development/samples/Support13Demos/src/com/example/android/supportv13/app/ActionBarTabsPager.java
- *      complete}
- */
-public class ViewPager extends ViewGroup {
-    private static final String TAG = "ViewPager";
-    private static final boolean DEBUG = false;
-
-    private static final boolean USE_CACHE = false;
-
-    private static final int DEFAULT_OFFSCREEN_PAGES = 1;
-    private static final int MAX_SETTLE_DURATION = 600; // ms
-    private static final int MIN_DISTANCE_FOR_FLING = 25; // dips
-
-    private static final int DEFAULT_GUTTER_SIZE = 16; // dips
-
-    private static final int MIN_FLING_VELOCITY = 400; // dips
-
-    private static final int[] LAYOUT_ATTRS = new int[] {
-        android.R.attr.layout_gravity
-    };
-
-    /**
-     * Used to track what the expected number of items in the adapter should be.
-     * If the app changes this when we don't expect it, we'll throw a big obnoxious exception.
-     */
-    private int mExpectedAdapterCount;
-
-    static class ItemInfo {
-        Object object;
-        int position;
-        boolean scrolling;
-        float widthFactor;
-        float offset;
-    }
-
-    private static final Comparator<ItemInfo> COMPARATOR = new Comparator<ItemInfo>(){
-        @Override
-        public int compare(ItemInfo lhs, ItemInfo rhs) {
-            return lhs.position - rhs.position;
-        }
-    };
-
-    private static final Interpolator sInterpolator = new Interpolator() {
-        public float getInterpolation(float t) {
-            t -= 1.0f;
-            return t * t * t * t * t + 1.0f;
-        }
-    };
-
-    private final ArrayList<ItemInfo> mItems = new ArrayList<ItemInfo>();
-    private final ItemInfo mTempItem = new ItemInfo();
-
-    private final Rect mTempRect = new Rect();
-
-    private PagerAdapter mAdapter;
-    private int mCurItem;   // Index of currently displayed page.
-    private int mRestoredCurItem = -1;
-    private Parcelable mRestoredAdapterState = null;
-    private ClassLoader mRestoredClassLoader = null;
-
-    private Scroller mScroller;
-    private boolean mIsScrollStarted;
-
-    private PagerObserver mObserver;
-
-    private int mPageMargin;
-    private Drawable mMarginDrawable;
-    private int mTopPageBounds;
-    private int mBottomPageBounds;
-
-    // Offsets of the first and last items, if known.
-    // Set during population, used to determine if we are at the beginning
-    // or end of the pager data set during touch scrolling.
-    private float mFirstOffset = -Float.MAX_VALUE;
-    private float mLastOffset = Float.MAX_VALUE;
-
-    private int mChildWidthMeasureSpec;
-    private int mChildHeightMeasureSpec;
-    private boolean mInLayout;
-
-    private boolean mScrollingCacheEnabled;
-
-    private boolean mPopulatePending;
-    private int mOffscreenPageLimit = DEFAULT_OFFSCREEN_PAGES;
-
-    private boolean mIsBeingDragged;
-    private boolean mIsUnableToDrag;
-    private int mDefaultGutterSize;
-    private int mGutterSize;
-    private int mTouchSlop;
-    /**
-     * Position of the last motion event.
-     */
-    private float mLastMotionX;
-    private float mLastMotionY;
-    private float mInitialMotionX;
-    private float mInitialMotionY;
-    /**
-     * ID of the active pointer. This is used to retain consistency during
-     * drags/flings if multiple pointers are used.
-     */
-    private int mActivePointerId = INVALID_POINTER;
-    /**
-     * Sentinel value for no current active pointer.
-     * Used by {@link #mActivePointerId}.
-     */
-    private static final int INVALID_POINTER = -1;
-
-    /**
-     * Determines speed during touch scrolling
-     */
-    private VelocityTracker mVelocityTracker;
-    private int mMinimumVelocity;
-    private int mMaximumVelocity;
-    private int mFlingDistance;
-    private int mCloseEnough;
-
-    // If the pager is at least this close to its final position, complete the scroll
-    // on touch down and let the user interact with the content inside instead of
-    // "catching" the flinging pager.
-    private static final int CLOSE_ENOUGH = 2; // dp
-
-    private boolean mFakeDragging;
-    private long mFakeDragBeginTime;
-
-    private EdgeEffectCompat mLeftEdge;
-    private EdgeEffectCompat mRightEdge;
-
-    private boolean mFirstLayout = true;
-    private boolean mNeedCalculatePageOffsets = false;
-    private boolean mCalledSuper;
-    private int mDecorChildCount;
-
-    private List<OnPageChangeListener> mOnPageChangeListeners;
-    private OnPageChangeListener mOnPageChangeListener;
-    private OnPageChangeListener mInternalPageChangeListener;
-    private List<OnAdapterChangeListener> mAdapterChangeListeners;
-    private PageTransformer mPageTransformer;
-    private Method mSetChildrenDrawingOrderEnabled;
-
-    private static final int DRAW_ORDER_DEFAULT = 0;
-    private static final int DRAW_ORDER_FORWARD = 1;
-    private static final int DRAW_ORDER_REVERSE = 2;
-    private int mDrawingOrder;
-    private ArrayList<View> mDrawingOrderedChildren;
-    private static final ViewPositionComparator sPositionComparator = new ViewPositionComparator();
-
-    /**
-     * Indicates that the pager is in an idle, settled state. The current page
-     * is fully in view and no animation is in progress.
-     */
-    public static final int SCROLL_STATE_IDLE = 0;
-
-    /**
-     * Indicates that the pager is currently being dragged by the user.
-     */
-    public static final int SCROLL_STATE_DRAGGING = 1;
-
-    /**
-     * Indicates that the pager is in the process of settling to a final position.
-     */
-    public static final int SCROLL_STATE_SETTLING = 2;
-
-    private final Runnable mEndScrollRunnable = new Runnable() {
-        public void run() {
-            setScrollState(SCROLL_STATE_IDLE);
-            populate();
-        }
-    };
-
-    private int mScrollState = SCROLL_STATE_IDLE;
-
-    /**
-     * Callback interface for responding to changing state of the selected page.
-     */
-    public interface OnPageChangeListener {
-
-        /**
-         * This method will be invoked when the current page is scrolled, either as part
-         * of a programmatically initiated smooth scroll or a user initiated touch scroll.
-         *
-         * @param position Position index of the first page currently being displayed.
-         *                 Page position+1 will be visible if positionOffset is nonzero.
-         * @param positionOffset Value from [0, 1) indicating the offset from the page at position.
-         * @param positionOffsetPixels Value in pixels indicating the offset from position.
-         */
-        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels);
-
-        /**
-         * This method will be invoked when a new page becomes selected. Animation is not
-         * necessarily complete.
-         *
-         * @param position Position index of the new selected page.
-         */
-        public void onPageSelected(int position);
-
-        /**
-         * Called when the scroll state changes. Useful for discovering when the user
-         * begins dragging, when the pager is automatically settling to the current page,
-         * or when it is fully stopped/idle.
-         *
-         * @param state The new scroll state.
-         * @see ViewPager#SCROLL_STATE_IDLE
-         * @see ViewPager#SCROLL_STATE_DRAGGING
-         * @see ViewPager#SCROLL_STATE_SETTLING
-         */
-        public void onPageScrollStateChanged(int state);
-    }
-
-    /**
-     * Simple implementation of the {@link OnPageChangeListener} interface with stub
-     * implementations of each method. Extend this if you do not intend to override
-     * every method of {@link OnPageChangeListener}.
-     */
-    public static class SimpleOnPageChangeListener implements OnPageChangeListener {
-        @Override
-        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
-            // This space for rent
-        }
-
-        @Override
-        public void onPageSelected(int position) {
-            // This space for rent
-        }
-
-        @Override
-        public void onPageScrollStateChanged(int state) {
-            // This space for rent
-        }
-    }
-
-    /**
-     * A PageTransformer is invoked whenever a visible/attached page is scrolled.
-     * This offers an opportunity for the application to apply a custom transformation
-     * to the page views using animation properties.
-     *
-     * <p>As property animation is only supported as of Android 3.0 and forward,
-     * setting a PageTransformer on a ViewPager on earlier platform versions will
-     * be ignored.</p>
-     */
-    public interface PageTransformer {
-        /**
-         * Apply a property transformation to the given page.
-         *
-         * @param page Apply the transformation to this page
-         * @param position Position of page relative to the current front-and-center
-         *                 position of the pager. 0 is front and center. 1 is one full
-         *                 page position to the right, and -1 is one page position to the left.
-         */
-        public void transformPage(View page, float position);
-    }
-
-    /**
-     * Callback interface for responding to adapter changes.
-     */
-    public interface OnAdapterChangeListener {
-        /**
-         * Called when the adapter for the given view pager has changed.
-         *
-         * @param viewPager  ViewPager where the adapter change has happened
-         * @param oldAdapter the previously set adapter
-         * @param newAdapter the newly set adapter
-         */
-        void onAdapterChanged(@NonNull ViewPager viewPager,
-                @Nullable PagerAdapter oldAdapter, @Nullable PagerAdapter newAdapter);
-    }
-
-    /**
-     * Annotation which allows marking of views to be decoration views when added to a view
-     * pager.
-     *
-     * <p>Views marked with this annotation can be added to the view pager with a layout resource.
-     * An example being {@link PagerTitleStrip}.</p>
-     *
-     * <p>You can also control whether a view is a decor view but setting
-     * {@link LayoutParams#isDecor} on the child's layout params.</p>
-     */
-    @Retention(RetentionPolicy.RUNTIME)
-    @Target(ElementType.TYPE)
-    public @interface DecorView {
-    }
-
-    public ViewPager(Context context) {
-        super(context);
-        initViewPager();
-    }
-
-    public ViewPager(Context context, AttributeSet attrs) {
-        super(context, attrs);
-        initViewPager();
-    }
-
-    void initViewPager() {
-        setWillNotDraw(false);
-        setDescendantFocusability(FOCUS_AFTER_DESCENDANTS);
-        setFocusable(true);
-        final Context context = getContext();
-        mScroller = new Scroller(context, sInterpolator);
-        final ViewConfiguration configuration = ViewConfiguration.get(context);
-        final float density = context.getResources().getDisplayMetrics().density;
-
-        mTouchSlop = ViewConfigurationCompat.getScaledPagingTouchSlop(configuration);
-        mMinimumVelocity = (int) (MIN_FLING_VELOCITY * density);
-        mMaximumVelocity = configuration.getScaledMaximumFlingVelocity();
-        mLeftEdge = new EdgeEffectCompat(context);
-        mRightEdge = new EdgeEffectCompat(context);
-
-        mFlingDistance = (int) (MIN_DISTANCE_FOR_FLING * density);
-        mCloseEnough = (int) (CLOSE_ENOUGH * density);
-        mDefaultGutterSize = (int) (DEFAULT_GUTTER_SIZE * density);
-
-        ViewCompat.setAccessibilityDelegate(this, new MyAccessibilityDelegate());
-
-        if (ViewCompat.getImportantForAccessibility(this)
-                == ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_AUTO) {
-            ViewCompat.setImportantForAccessibility(this,
-                    ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_YES);
-        }
-
-        ViewCompat.setOnApplyWindowInsetsListener(this,
-                new android.support.v4.view.OnApplyWindowInsetsListener() {
-                    private final Rect mTempRect = new Rect();
-
-                    @Override
-                    public WindowInsetsCompat onApplyWindowInsets(final View v,
-                            final WindowInsetsCompat originalInsets) {
-                        // First let the ViewPager itself try and consume them...
-                        final WindowInsetsCompat applied =
-                                ViewCompat.onApplyWindowInsets(v, originalInsets);
-                        if (applied.isConsumed()) {
-                            // If the ViewPager consumed all insets, return now
-                            return applied;
-                        }
-
-                        // Now we'll manually dispatch the insets to our children. Since ViewPager
-                        // children are always full-height, we do not want to use the standard
-                        // ViewGroup dispatchApplyWindowInsets since if child 0 consumes them,
-                        // the rest of the children will not receive any insets. To workaround this
-                        // we manually dispatch the applied insets, not allowing children to
-                        // consume them from each other. We do however keep track of any insets
-                        // which are consumed, returning the union of our children's consumption
-                        final Rect res = mTempRect;
-                        res.left = applied.getSystemWindowInsetLeft();
-                        res.top = applied.getSystemWindowInsetTop();
-                        res.right = applied.getSystemWindowInsetRight();
-                        res.bottom = applied.getSystemWindowInsetBottom();
-
-                        for (int i = 0, count = getChildCount(); i < count; i++) {
-                            final WindowInsetsCompat childInsets = ViewCompat
-                                    .dispatchApplyWindowInsets(getChildAt(i), applied);
-                            // Now keep track of any consumed by tracking each dimension's min
-                            // value
-                            res.left = Math.min(childInsets.getSystemWindowInsetLeft(),
-                                    res.left);
-                            res.top = Math.min(childInsets.getSystemWindowInsetTop(),
-                                    res.top);
-                            res.right = Math.min(childInsets.getSystemWindowInsetRight(),
-                                    res.right);
-                            res.bottom = Math.min(childInsets.getSystemWindowInsetBottom(),
-                                    res.bottom);
-                        }
-
-                        // Now return a new WindowInsets, using the consumed window insets
-                        return applied.replaceSystemWindowInsets(
-                                res.left, res.top, res.right, res.bottom);
-                    }
-                });
-    }
-
-    @Override
-    protected void onDetachedFromWindow() {
-        removeCallbacks(mEndScrollRunnable);
-        // To be on the safe side, abort the scroller
-        if ((mScroller != null) && !mScroller.isFinished()) {
-            mScroller.abortAnimation();
-        }
-        super.onDetachedFromWindow();
-    }
-
-    private void setScrollState(int newState) {
-        if (mScrollState == newState) {
-            return;
-        }
-
-        mScrollState = newState;
-        if (mPageTransformer != null) {
-            // PageTransformers can do complex things that benefit from hardware layers.
-            enableLayers(newState != SCROLL_STATE_IDLE);
-        }
-        dispatchOnScrollStateChanged(newState);
-    }
-
-    /**
-     * Set a PagerAdapter that will supply views for this pager as needed.
-     *
-     * @param adapter Adapter to use
-     */
-    public void setAdapter(PagerAdapter adapter) {
-        if (mAdapter != null) {
-            mAdapter.setViewPagerObserver(null);
-            mAdapter.startUpdate(this);
-            for (int i = 0; i < mItems.size(); i++) {
-                final ItemInfo ii = mItems.get(i);
-                mAdapter.destroyItem(this, ii.position, ii.object);
-            }
-            mAdapter.finishUpdate(this);
-            mItems.clear();
-            removeNonDecorViews();
-            mCurItem = 0;
-            scrollTo(0, 0);
-        }
-
-        final PagerAdapter oldAdapter = mAdapter;
-        mAdapter = adapter;
-        mExpectedAdapterCount = 0;
-
-        if (mAdapter != null) {
-            if (mObserver == null) {
-                mObserver = new PagerObserver();
-            }
-            mAdapter.setViewPagerObserver(mObserver);
-            mPopulatePending = false;
-            final boolean wasFirstLayout = mFirstLayout;
-            mFirstLayout = true;
-            mExpectedAdapterCount = mAdapter.getCount();
-            if (mRestoredCurItem >= 0) {
-                mAdapter.restoreState(mRestoredAdapterState, mRestoredClassLoader);
-                setCurrentItemInternal(mRestoredCurItem, false, true);
-                mRestoredCurItem = -1;
-                mRestoredAdapterState = null;
-                mRestoredClassLoader = null;
-            } else if (!wasFirstLayout) {
-                populate();
-            } else {
-                requestLayout();
-            }
-        }
-
-        // Dispatch the change to any listeners
-        if (mAdapterChangeListeners != null && !mAdapterChangeListeners.isEmpty()) {
-            for (int i = 0, count = mAdapterChangeListeners.size(); i < count; i++) {
-                mAdapterChangeListeners.get(i).onAdapterChanged(this, oldAdapter, adapter);
-            }
-        }
-    }
-
-    private void removeNonDecorViews() {
-        for (int i = 0; i < getChildCount(); i++) {
-            final View child = getChildAt(i);
-            final LayoutParams lp = (LayoutParams) child.getLayoutParams();
-            if (!lp.isDecor) {
-                removeViewAt(i);
-                i--;
-            }
-        }
-    }
-
-    /**
-     * Retrieve the current adapter supplying pages.
-     *
-     * @return The currently registered PagerAdapter
-     */
-    public PagerAdapter getAdapter() {
-        return mAdapter;
-    }
-
-    /**
-     * Add a listener that will be invoked whenever the adapter for this ViewPager changes.
-     *
-     * @param listener listener to add
-     */
-    public void addOnAdapterChangeListener(@NonNull OnAdapterChangeListener listener) {
-        if (mAdapterChangeListeners == null) {
-            mAdapterChangeListeners = new ArrayList<>();
-        }
-        mAdapterChangeListeners.add(listener);
-    }
-
-    /**
-     * Remove a listener that was previously added via
-     * {@link #addOnAdapterChangeListener(OnAdapterChangeListener)}.
-     *
-     * @param listener listener to remove
-     */
-    public void removeOnAdapterChangeListener(@NonNull OnAdapterChangeListener listener) {
-        if (mAdapterChangeListeners != null) {
-            mAdapterChangeListeners.remove(listener);
-        }
-    }
-
-    private int getClientWidth() {
-        return getMeasuredWidth() - getPaddingLeft() - getPaddingRight();
-    }
-
-    /**
-     * Set the currently selected page. If the ViewPager has already been through its first
-     * layout with its current adapter there will be a smooth animated transition between
-     * the current item and the specified item.
-     *
-     * @param item Item index to select
-     */
-    public void setCurrentItem(int item) {
-        mPopulatePending = false;
-        setCurrentItemInternal(item, !mFirstLayout, false);
-    }
-
-    /**
-     * Set the currently selected page.
-     *
-     * @param item Item index to select
-     * @param smoothScroll True to smoothly scroll to the new item, false to transition immediately
-     */
-    public void setCurrentItem(int item, boolean smoothScroll) {
-        mPopulatePending = false;
-        setCurrentItemInternal(item, smoothScroll, false);
-    }
-
-    public int getCurrentItem() {
-        return mCurItem;
-    }
-
-    void setCurrentItemInternal(int item, boolean smoothScroll, boolean always) {
-        setCurrentItemInternal(item, smoothScroll, always, 0);
-    }
-
-    void setCurrentItemInternal(int item, boolean smoothScroll, boolean always, int velocity) {
-        if (mAdapter == null || mAdapter.getCount() <= 0) {
-            setScrollingCacheEnabled(false);
-            return;
-        }
-        if (!always && mCurItem == item && mItems.size() != 0) {
-            setScrollingCacheEnabled(false);
-            return;
-        }
-
-        if (item < 0) {
-            item = 0;
-        } else if (item >= mAdapter.getCount()) {
-            item = mAdapter.getCount() - 1;
-        }
-        final int pageLimit = mOffscreenPageLimit;
-        if (item > (mCurItem + pageLimit) || item < (mCurItem - pageLimit)) {
-            // We are doing a jump by more than one page.  To avoid
-            // glitches, we want to keep all current pages in the view
-            // until the scroll ends.
-            for (int i=0; i<mItems.size(); i++) {
-                mItems.get(i).scrolling = true;
-            }
-        }
-        final boolean dispatchSelected = mCurItem != item;
-
-        if (mFirstLayout) {
-            // We don't have any idea how big we are yet and shouldn't have any pages either.
-            // Just set things up and let the pending layout handle things.
-            mCurItem = item;
-            if (dispatchSelected) {
-                dispatchOnPageSelected(item);
-            }
-            requestLayout();
-        } else {
-            populate(item);
-            scrollToItem(item, smoothScroll, velocity, dispatchSelected);
-        }
-    }
-
-    private void scrollToItem(int item, boolean smoothScroll, int velocity,
-            boolean dispatchSelected) {
-        final ItemInfo curInfo = infoForPosition(item);
-        int destX = 0;
-        if (curInfo != null) {
-            final int width = getClientWidth();
-            destX = (int) (width * Math.max(mFirstOffset,
-                    Math.min(curInfo.offset, mLastOffset)));
-        }
-        if (smoothScroll) {
-            smoothScrollTo(destX, 0, velocity);
-            if (dispatchSelected) {
-                dispatchOnPageSelected(item);
-            }
-        } else {
-            if (dispatchSelected) {
-                dispatchOnPageSelected(item);
-            }
-            completeScroll(false);
-            scrollTo(destX, 0);
-            pageScrolled(destX);
-        }
-    }
-
-    /**
-     * Set a listener that will be invoked whenever the page changes or is incrementally
-     * scrolled. See {@link OnPageChangeListener}.
-     *
-     * @param listener Listener to set
-     *
-     * @deprecated Use {@link #addOnPageChangeListener(OnPageChangeListener)}
-     * and {@link #removeOnPageChangeListener(OnPageChangeListener)} instead.
-     */
-    @Deprecated
-    public void setOnPageChangeListener(OnPageChangeListener listener) {
-        mOnPageChangeListener = listener;
-    }
-
-    /**
-     * Add a listener that will be invoked whenever the page changes or is incrementally
-     * scrolled. See {@link OnPageChangeListener}.
-     *
-     * <p>Components that add a listener should take care to remove it when finished.
-     * Other components that take ownership of a view may call {@link #clearOnPageChangeListeners()}
-     * to remove all attached listeners.</p>
-     *
-     * @param listener listener to add
-     */
-    public void addOnPageChangeListener(OnPageChangeListener listener) {
-        if (mOnPageChangeListeners == null) {
-            mOnPageChangeListeners = new ArrayList<>();
-        }
-        mOnPageChangeListeners.add(listener);
-    }
-
-    /**
-     * Remove a listener that was previously added via
-     * {@link #addOnPageChangeListener(OnPageChangeListener)}.
-     *
-     * @param listener listener to remove
-     */
-    public void removeOnPageChangeListener(OnPageChangeListener listener) {
-        if (mOnPageChangeListeners != null) {
-            mOnPageChangeListeners.remove(listener);
-        }
-    }
-
-    /**
-     * Remove all listeners that are notified of any changes in scroll state or position.
-     */
-    public void clearOnPageChangeListeners() {
-        if (mOnPageChangeListeners != null) {
-            mOnPageChangeListeners.clear();
-        }
-    }
-
-    /**
-     * Set a {@link PageTransformer} that will be called for each attached page whenever
-     * the scroll position is changed. This allows the application to apply custom property
-     * transformations to each page, overriding the default sliding look and feel.
-     *
-     * <p><em>Note:</em> Prior to Android 3.0 the property animation APIs did not exist.
-     * As a result, setting a PageTransformer prior to Android 3.0 (API 11) will have no effect.</p>
-     *
-     * @param reverseDrawingOrder true if the supplied PageTransformer requires page views
-     *                            to be drawn from last to first instead of first to last.
-     * @param transformer PageTransformer that will modify each page's animation properties
-     */
-    public void setPageTransformer(boolean reverseDrawingOrder, PageTransformer transformer) {
-        if (Build.VERSION.SDK_INT >= 11) {
-            final boolean hasTransformer = transformer != null;
-            final boolean needsPopulate = hasTransformer != (mPageTransformer != null);
-            mPageTransformer = transformer;
-            setChildrenDrawingOrderEnabledCompat(hasTransformer);
-            if (hasTransformer) {
-                mDrawingOrder = reverseDrawingOrder ? DRAW_ORDER_REVERSE : DRAW_ORDER_FORWARD;
-            } else {
-                mDrawingOrder = DRAW_ORDER_DEFAULT;
-            }
-            if (needsPopulate) populate();
-        }
-    }
-
-    void setChildrenDrawingOrderEnabledCompat(boolean enable) {
-        if (Build.VERSION.SDK_INT >= 7) {
-            if (mSetChildrenDrawingOrderEnabled == null) {
-                try {
-                    mSetChildrenDrawingOrderEnabled = ViewGroup.class.getDeclaredMethod(
-                            "setChildrenDrawingOrderEnabled", new Class[] { Boolean.TYPE });
-                } catch (NoSuchMethodException e) {
-                    Log.e(TAG, "Can't find setChildrenDrawingOrderEnabled", e);
-                }
-            }
-            try {
-                mSetChildrenDrawingOrderEnabled.invoke(this, enable);
-            } catch (Exception e) {
-                Log.e(TAG, "Error changing children drawing order", e);
-            }
-        }
-    }
-
-    @Override
-    protected int getChildDrawingOrder(int childCount, int i) {
-        final int index = mDrawingOrder == DRAW_ORDER_REVERSE ? childCount - 1 - i : i;
-        final int result = ((LayoutParams) mDrawingOrderedChildren.get(index).getLayoutParams()).childIndex;
-        return result;
-    }
-
-    /**
-     * Set a separate OnPageChangeListener for internal use by the support library.
-     *
-     * @param listener Listener to set
-     * @return The old listener that was set, if any.
-     */
-    OnPageChangeListener setInternalPageChangeListener(OnPageChangeListener listener) {
-        OnPageChangeListener oldListener = mInternalPageChangeListener;
-        mInternalPageChangeListener = listener;
-        return oldListener;
-    }
-
-    /**
-     * Returns the number of pages that will be retained to either side of the
-     * current page in the view hierarchy in an idle state. Defaults to 1.
-     *
-     * @return How many pages will be kept offscreen on either side
-     * @see #setOffscreenPageLimit(int)
-     */
-    public int getOffscreenPageLimit() {
-        return mOffscreenPageLimit;
-    }
-
-    /**
-     * Set the number of pages that should be retained to either side of the
-     * current page in the view hierarchy in an idle state. Pages beyond this
-     * limit will be recreated from the adapter when needed.
-     *
-     * <p>This is offered as an optimization. If you know in advance the number
-     * of pages you will need to support or have lazy-loading mechanisms in place
-     * on your pages, tweaking this setting can have benefits in perceived smoothness
-     * of paging animations and interaction. If you have a small number of pages (3-4)
-     * that you can keep active all at once, less time will be spent in layout for
-     * newly created view subtrees as the user pages back and forth.</p>
-     *
-     * <p>You should keep this limit low, especially if your pages have complex layouts.
-     * This setting defaults to 1.</p>
-     *
-     * @param limit How many pages will be kept offscreen in an idle state.
-     */
-    public void setOffscreenPageLimit(int limit) {
-        if (limit < DEFAULT_OFFSCREEN_PAGES) {
-            Log.w(TAG, "Requested offscreen page limit " + limit + " too small; defaulting to " +
-                    DEFAULT_OFFSCREEN_PAGES);
-            limit = DEFAULT_OFFSCREEN_PAGES;
-        }
-        if (limit != mOffscreenPageLimit) {
-            mOffscreenPageLimit = limit;
-            populate();
-        }
-    }
-
-    /**
-     * Set the margin between pages.
-     *
-     * @param marginPixels Distance between adjacent pages in pixels
-     * @see #getPageMargin()
-     * @see #setPageMarginDrawable(Drawable)
-     * @see #setPageMarginDrawable(int)
-     */
-    public void setPageMargin(int marginPixels) {
-        final int oldMargin = mPageMargin;
-        mPageMargin = marginPixels;
-
-        final int width = getWidth();
-        recomputeScrollPosition(width, width, marginPixels, oldMargin);
-
-        requestLayout();
-    }
-
-    /**
-     * Return the margin between pages.
-     *
-     * @return The size of the margin in pixels
-     */
-    public int getPageMargin() {
-        return mPageMargin;
-    }
-
-    /**
-     * Set a drawable that will be used to fill the margin between pages.
-     *
-     * @param d Drawable to display between pages
-     */
-    public void setPageMarginDrawable(Drawable d) {
-        mMarginDrawable = d;
-        if (d != null) refreshDrawableState();
-        setWillNotDraw(d == null);
-        invalidate();
-    }
-
-    /**
-     * Set a drawable that will be used to fill the margin between pages.
-     *
-     * @param resId Resource ID of a drawable to display between pages
-     */
-    public void setPageMarginDrawable(@DrawableRes int resId) {
-        setPageMarginDrawable(getContext().getResources().getDrawable(resId));
-    }
-
-    @Override
-    protected boolean verifyDrawable(Drawable who) {
-        return super.verifyDrawable(who) || who == mMarginDrawable;
-    }
-
-    @Override
-    protected void drawableStateChanged() {
-        super.drawableStateChanged();
-        final Drawable d = mMarginDrawable;
-        if (d != null && d.isStateful()) {
-            d.setState(getDrawableState());
-        }
-    }
-
-    // We want the duration of the page snap animation to be influenced by the distance that
-    // the screen has to travel, however, we don't want this duration to be effected in a
-    // purely linear fashion. Instead, we use this method to moderate the effect that the distance
-    // of travel has on the overall snap duration.
-    float distanceInfluenceForSnapDuration(float f) {
-        f -= 0.5f; // center the values about 0.
-        f *= 0.3f * Math.PI / 2.0f;
-        return (float) Math.sin(f);
-    }
-
-    /**
-     * Like {@link View#scrollBy}, but scroll smoothly instead of immediately.
-     *
-     * @param x the number of pixels to scroll by on the X axis
-     * @param y the number of pixels to scroll by on the Y axis
-     */
-    void smoothScrollTo(int x, int y) {
-        smoothScrollTo(x, y, 0);
-    }
-
-    /**
-     * Like {@link View#scrollBy}, but scroll smoothly instead of immediately.
-     *
-     * @param x the number of pixels to scroll by on the X axis
-     * @param y the number of pixels to scroll by on the Y axis
-     * @param velocity the velocity associated with a fling, if applicable. (0 otherwise)
-     */
-    void smoothScrollTo(int x, int y, int velocity) {
-        if (getChildCount() == 0) {
-            // Nothing to do.
-            setScrollingCacheEnabled(false);
-            return;
-        }
-
-        int sx;
-        boolean wasScrolling = (mScroller != null) && !mScroller.isFinished();
-        if (wasScrolling) {
-            // We're in the middle of a previously initiated scrolling. Check to see
-            // whether that scrolling has actually started (if we always call getStartX
-            // we can get a stale value from the scroller if it hadn't yet had its first
-            // computeScrollOffset call) to decide what is the current scrolling position.
-            sx = mIsScrollStarted ? mScroller.getCurrX() : mScroller.getStartX();
-            // And abort the current scrolling.
-            mScroller.abortAnimation();
-            setScrollingCacheEnabled(false);
-        } else {
-            sx = getScrollX();
-        }
-        int sy = getScrollY();
-        int dx = x - sx;
-        int dy = y - sy;
-        if (dx == 0 && dy == 0) {
-            completeScroll(false);
-            populate();
-            setScrollState(SCROLL_STATE_IDLE);
-            return;
-        }
-
-        setScrollingCacheEnabled(true);
-        setScrollState(SCROLL_STATE_SETTLING);
-
-        final int width = getClientWidth();
-        final int halfWidth = width / 2;
-        final float distanceRatio = Math.min(1f, 1.0f * Math.abs(dx) / width);
-        final float distance = halfWidth + halfWidth *
-                distanceInfluenceForSnapDuration(distanceRatio);
-
-        int duration;
-        velocity = Math.abs(velocity);
-        if (velocity > 0) {
-            duration = 4 * Math.round(1000 * Math.abs(distance / velocity));
-        } else {
-            final float pageWidth = width * mAdapter.getPageWidth(mCurItem);
-            final float pageDelta = (float) Math.abs(dx) / (pageWidth + mPageMargin);
-            duration = (int) ((pageDelta + 1) * 100);
-        }
-        duration = Math.min(duration, MAX_SETTLE_DURATION);
-
-        // Reset the "scroll started" flag. It will be flipped to true in all places
-        // where we call computeScrollOffset().
-        mIsScrollStarted = false;
-        mScroller.startScroll(sx, sy, dx, dy, duration);
-        ViewCompat.postInvalidateOnAnimation(this);
-    }
-
-    ItemInfo addNewItem(int position, int index) {
-        ItemInfo ii = new ItemInfo();
-        ii.position = position;
-        ii.object = mAdapter.instantiateItem(this, position);
-        ii.widthFactor = mAdapter.getPageWidth(position);
-        if (index < 0 || index >= mItems.size()) {
-            mItems.add(ii);
-        } else {
-            mItems.add(index, ii);
-        }
-        return ii;
-    }
-
-    void dataSetChanged() {
-        // This method only gets called if our observer is attached, so mAdapter is non-null.
-
-        final int adapterCount = mAdapter.getCount();
-        mExpectedAdapterCount = adapterCount;
-        boolean needPopulate = mItems.size() < mOffscreenPageLimit * 2 + 1 &&
-                mItems.size() < adapterCount;
-        int newCurrItem = mCurItem;
-
-        boolean isUpdating = false;
-        for (int i = 0; i < mItems.size(); i++) {
-            final ItemInfo ii = mItems.get(i);
-            final int newPos = mAdapter.getItemPosition(ii.object);
-
-            if (newPos == PagerAdapter.POSITION_UNCHANGED) {
-                continue;
-            }
-
-            if (newPos == PagerAdapter.POSITION_NONE) {
-                mItems.remove(i);
-                i--;
-
-                if (!isUpdating) {
-                    mAdapter.startUpdate(this);
-                    isUpdating = true;
-                }
-
-                mAdapter.destroyItem(this, ii.position, ii.object);
-                needPopulate = true;
-
-                if (mCurItem == ii.position) {
-                    // Keep the current item in the valid range
-                    newCurrItem = Math.max(0, Math.min(mCurItem, adapterCount - 1));
-                    needPopulate = true;
-                }
-                continue;
-            }
-
-            if (ii.position != newPos) {
-                if (ii.position == mCurItem) {
-                    // Our current item changed position. Follow it.
-                    newCurrItem = newPos;
-                }
-
-                ii.position = newPos;
-                needPopulate = true;
-            }
-        }
-
-        if (isUpdating) {
-            mAdapter.finishUpdate(this);
-        }
-
-        Collections.sort(mItems, COMPARATOR);
-
-        if (needPopulate) {
-            // Reset our known page widths; populate will recompute them.
-            final int childCount = getChildCount();
-            for (int i = 0; i < childCount; i++) {
-                final View child = getChildAt(i);
-                final LayoutParams lp = (LayoutParams) child.getLayoutParams();
-                if (!lp.isDecor) {
-                    lp.widthFactor = 0.f;
-                }
-            }
-
-            setCurrentItemInternal(newCurrItem, false, true);
-            requestLayout();
-        }
-    }
-
-    void populate() {
-        populate(mCurItem);
-    }
-
-    void populate(int newCurrentItem) {
-        ItemInfo oldCurInfo = null;
-        if (mCurItem != newCurrentItem) {
-            oldCurInfo = infoForPosition(mCurItem);
-            mCurItem = newCurrentItem;
-        }
-
-        if (mAdapter == null) {
-            sortChildDrawingOrder();
-            return;
-        }
-
-        // Bail now if we are waiting to populate.  This is to hold off
-        // on creating views from the time the user releases their finger to
-        // fling to a new position until we have finished the scroll to
-        // that position, avoiding glitches from happening at that point.
-        if (mPopulatePending) {
-            if (DEBUG) Log.i(TAG, "populate is pending, skipping for now...");
-            sortChildDrawingOrder();
-            return;
-        }
-
-        // Also, don't populate until we are attached to a window.  This is to
-        // avoid trying to populate before we have restored our view hierarchy
-        // state and conflicting with what is restored.
-        if (getWindowToken() == null) {
-            return;
-        }
-
-        mAdapter.startUpdate(this);
-
-        final int pageLimit = mOffscreenPageLimit;
-        final int startPos = Math.max(0, mCurItem - pageLimit);
-        final int N = mAdapter.getCount();
-        final int endPos = Math.min(N-1, mCurItem + pageLimit);
-
-        if (N != mExpectedAdapterCount) {
-            String resName;
-            try {
-                resName = getResources().getResourceName(getId());
-            } catch (Resources.NotFoundException e) {
-                resName = Integer.toHexString(getId());
-            }
-            throw new IllegalStateException("The application's PagerAdapter changed the adapter's" +
-                    " contents without calling PagerAdapter#notifyDataSetChanged!" +
-                    " Expected adapter item count: " + mExpectedAdapterCount + ", found: " + N +
-                    " Pager id: " + resName +
-                    " Pager class: " + getClass() +
-                    " Problematic adapter: " + mAdapter.getClass());
-        }
-
-        // Locate the currently focused item or add it if needed.
-        int curIndex = -1;
-        ItemInfo curItem = null;
-        for (curIndex = 0; curIndex < mItems.size(); curIndex++) {
-            final ItemInfo ii = mItems.get(curIndex);
-            if (ii.position >= mCurItem) {
-                if (ii.position == mCurItem) curItem = ii;
-                break;
-            }
-        }
-
-        if (curItem == null && N > 0) {
-            curItem = addNewItem(mCurItem, curIndex);
-        }
-
-        // Fill 3x the available width or up to the number of offscreen
-        // pages requested to either side, whichever is larger.
-        // If we have no current item we have no work to do.
-        if (curItem != null) {
-            float extraWidthLeft = 0.f;
-            int itemIndex = curIndex - 1;
-            ItemInfo ii = itemIndex >= 0 ? mItems.get(itemIndex) : null;
-            final int clientWidth = getClientWidth();
-            final float leftWidthNeeded = clientWidth <= 0 ? 0 :
-                    2.f - curItem.widthFactor + (float) getPaddingLeft() / (float) clientWidth;
-            for (int pos = mCurItem - 1; pos >= 0; pos--) {
-                if (extraWidthLeft >= leftWidthNeeded && pos < startPos) {
-                    if (ii == null) {
-                        break;
-                    }
-                    if (pos == ii.position && !ii.scrolling) {
-                        mItems.remove(itemIndex);
-                        mAdapter.destroyItem(this, pos, ii.object);
-                        if (DEBUG) {
-                            Log.i(TAG, "populate() - destroyItem() with pos: " + pos +
-                                    " view: " + ((View) ii.object));
-                        }
-                        itemIndex--;
-                        curIndex--;
-                        ii = itemIndex >= 0 ? mItems.get(itemIndex) : null;
-                    }
-                } else if (ii != null && pos == ii.position) {
-                    extraWidthLeft += ii.widthFactor;
-                    itemIndex--;
-                    ii = itemIndex >= 0 ? mItems.get(itemIndex) : null;
-                } else {
-                    ii = addNewItem(pos, itemIndex + 1);
-                    extraWidthLeft += ii.widthFactor;
-                    curIndex++;
-                    ii = itemIndex >= 0 ? mItems.get(itemIndex) : null;
-                }
-            }
-
-            float extraWidthRight = curItem.widthFactor;
-            itemIndex = curIndex + 1;
-            if (extraWidthRight < 2.f) {
-                ii = itemIndex < mItems.size() ? mItems.get(itemIndex) : null;
-                final float rightWidthNeeded = clientWidth <= 0 ? 0 :
-                        (float) getPaddingRight() / (float) clientWidth + 2.f;
-                for (int pos = mCurItem + 1; pos < N; pos++) {
-                    if (extraWidthRight >= rightWidthNeeded && pos > endPos) {
-                        if (ii == null) {
-                            break;
-                        }
-                        if (pos == ii.position && !ii.scrolling) {
-                            mItems.remove(itemIndex);
-                            mAdapter.destroyItem(this, pos, ii.object);
-                            if (DEBUG) {
-                                Log.i(TAG, "populate() - destroyItem() with pos: " + pos +
-                                        " view: " + ((View) ii.object));
-                            }
-                            ii = itemIndex < mItems.size() ? mItems.get(itemIndex) : null;
-                        }
-                    } else if (ii != null && pos == ii.position) {
-                        extraWidthRight += ii.widthFactor;
-                        itemIndex++;
-                        ii = itemIndex < mItems.size() ? mItems.get(itemIndex) : null;
-                    } else {
-                        ii = addNewItem(pos, itemIndex);
-                        itemIndex++;
-                        extraWidthRight += ii.widthFactor;
-                        ii = itemIndex < mItems.size() ? mItems.get(itemIndex) : null;
-                    }
-                }
-            }
-
-            calculatePageOffsets(curItem, curIndex, oldCurInfo);
-        }
-
-        if (DEBUG) {
-            Log.i(TAG, "Current page list:");
-            for (int i=0; i<mItems.size(); i++) {
-                Log.i(TAG, "#" + i + ": page " + mItems.get(i).position);
-            }
-        }
-
-        mAdapter.setPrimaryItem(this, mCurItem, curItem != null ? curItem.object : null);
-
-        mAdapter.finishUpdate(this);
-
-        // Check width measurement of current pages and drawing sort order.
-        // Update LayoutParams as needed.
-        final int childCount = getChildCount();
-        for (int i = 0; i < childCount; i++) {
-            final View child = getChildAt(i);
-            final LayoutParams lp = (LayoutParams) child.getLayoutParams();
-            lp.childIndex = i;
-            if (!lp.isDecor && lp.widthFactor == 0.f) {
-                // 0 means requery the adapter for this, it doesn't have a valid width.
-                final ItemInfo ii = infoForChild(child);
-                if (ii != null) {
-                    lp.widthFactor = ii.widthFactor;
-                    lp.position = ii.position;
-                }
-            }
-        }
-        sortChildDrawingOrder();
-
-        if (hasFocus()) {
-            View currentFocused = findFocus();
-            ItemInfo ii = currentFocused != null ? infoForAnyChild(currentFocused) : null;
-            if (ii == null || ii.position != mCurItem) {
-                for (int i=0; i<getChildCount(); i++) {
-                    View child = getChildAt(i);
-                    ii = infoForChild(child);
-                    if (ii != null && ii.position == mCurItem) {
-                        if (child.requestFocus(View.FOCUS_FORWARD)) {
-                            break;
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    private void sortChildDrawingOrder() {
-        if (mDrawingOrder != DRAW_ORDER_DEFAULT) {
-            if (mDrawingOrderedChildren == null) {
-                mDrawingOrderedChildren = new ArrayList<View>();
-            } else {
-                mDrawingOrderedChildren.clear();
-            }
-            final int childCount = getChildCount();
-            for (int i = 0; i < childCount; i++) {
-                final View child = getChildAt(i);
-                mDrawingOrderedChildren.add(child);
-            }
-            Collections.sort(mDrawingOrderedChildren, sPositionComparator);
-        }
-    }
-
-    private void calculatePageOffsets(ItemInfo curItem, int curIndex, ItemInfo oldCurInfo) {
-        final int N = mAdapter.getCount();
-        final int width = getClientWidth();
-        final float marginOffset = width > 0 ? (float) mPageMargin / width : 0;
-        // Fix up offsets for later layout.
-        if (oldCurInfo != null) {
-            final int oldCurPosition = oldCurInfo.position;
-            // Base offsets off of oldCurInfo.
-            if (oldCurPosition < curItem.position) {
-                int itemIndex = 0;
-                ItemInfo ii = null;
-                float offset = oldCurInfo.offset + oldCurInfo.widthFactor + marginOffset;
-                for (int pos = oldCurPosition + 1;
-                        pos <= curItem.position && itemIndex < mItems.size(); pos++) {
-                    ii = mItems.get(itemIndex);
-                    while (pos > ii.position && itemIndex < mItems.size() - 1) {
-                        itemIndex++;
-                        ii = mItems.get(itemIndex);
-                    }
-                    while (pos < ii.position) {
-                        // We don't have an item populated for this,
-                        // ask the adapter for an offset.
-                        offset += mAdapter.getPageWidth(pos) + marginOffset;
-                        pos++;
-                    }
-                    ii.offset = offset;
-                    offset += ii.widthFactor + marginOffset;
-                }
-            } else if (oldCurPosition > curItem.position) {
-                int itemIndex = mItems.size() - 1;
-                ItemInfo ii = null;
-                float offset = oldCurInfo.offset;
-                for (int pos = oldCurPosition - 1;
-                        pos >= curItem.position && itemIndex >= 0; pos--) {
-                    ii = mItems.get(itemIndex);
-                    while (pos < ii.position && itemIndex > 0) {
-                        itemIndex--;
-                        ii = mItems.get(itemIndex);
-                    }
-                    while (pos > ii.position) {
-                        // We don't have an item populated for this,
-                        // ask the adapter for an offset.
-                        offset -= mAdapter.getPageWidth(pos) + marginOffset;
-                        pos--;
-                    }
-                    offset -= ii.widthFactor + marginOffset;
-                    ii.offset = offset;
-                }
-            }
-        }
-
-        // Base all offsets off of curItem.
-        final int itemCount = mItems.size();
-        float offset = curItem.offset;
-        int pos = curItem.position - 1;
-        mFirstOffset = curItem.position == 0 ? curItem.offset : -Float.MAX_VALUE;
-        mLastOffset = curItem.position == N - 1 ?
-                curItem.offset + curItem.widthFactor - 1 : Float.MAX_VALUE;
-        // Previous pages
-        for (int i = curIndex - 1; i >= 0; i--, pos--) {
-            final ItemInfo ii = mItems.get(i);
-            while (pos > ii.position) {
-                offset -= mAdapter.getPageWidth(pos--) + marginOffset;
-            }
-            offset -= ii.widthFactor + marginOffset;
-            ii.offset = offset;
-            if (ii.position == 0) mFirstOffset = offset;
-        }
-        offset = curItem.offset + curItem.widthFactor + marginOffset;
-        pos = curItem.position + 1;
-        // Next pages
-        for (int i = curIndex + 1; i < itemCount; i++, pos++) {
-            final ItemInfo ii = mItems.get(i);
-            while (pos < ii.position) {
-                offset += mAdapter.getPageWidth(pos++) + marginOffset;
-            }
-            if (ii.position == N - 1) {
-                mLastOffset = offset + ii.widthFactor - 1;
-            }
-            ii.offset = offset;
-            offset += ii.widthFactor + marginOffset;
-        }
-
-        mNeedCalculatePageOffsets = false;
-    }
-
-    /**
-     * This is the persistent state that is saved by ViewPager.  Only needed
-     * if you are creating a sublass of ViewPager that must save its own
-     * state, in which case it should implement a subclass of this which
-     * contains that state.
-     */
-    public static class SavedState extends AbsSavedState {
-        int position;
-        Parcelable adapterState;
-        ClassLoader loader;
-
-        public SavedState(Parcelable superState) {
-            super(superState);
-        }
-
-        @Override
-        public void writeToParcel(Parcel out, int flags) {
-            super.writeToParcel(out, flags);
-            out.writeInt(position);
-            out.writeParcelable(adapterState, flags);
-        }
-
-        @Override
-        public String toString() {
-            return "FragmentPager.SavedState{"
-                    + Integer.toHexString(System.identityHashCode(this))
-                    + " position=" + position + "}";
-        }
-
-        public static final Parcelable.Creator<SavedState> CREATOR
-                = ParcelableCompat.newCreator(new ParcelableCompatCreatorCallbacks<SavedState>() {
-                    @Override
-                    public SavedState createFromParcel(Parcel in, ClassLoader loader) {
-                        return new SavedState(in, loader);
-                    }
-                    @Override
-                    public SavedState[] newArray(int size) {
-                        return new SavedState[size];
-                    }
-                });
-
-        SavedState(Parcel in, ClassLoader loader) {
-            super(in, loader);
-            if (loader == null) {
-                loader = getClass().getClassLoader();
-            }
-            position = in.readInt();
-            adapterState = in.readParcelable(loader);
-            this.loader = loader;
-        }
-    }
-
-    @Override
-    public Parcelable onSaveInstanceState() {
-        Parcelable superState = super.onSaveInstanceState();
-        SavedState ss = new SavedState(superState);
-        ss.position = mCurItem;
-        if (mAdapter != null) {
-            ss.adapterState = mAdapter.saveState();
-        }
-        return ss;
-    }
-
-    @Override
-    public void onRestoreInstanceState(Parcelable state) {
-        if (!(state instanceof SavedState)) {
-            super.onRestoreInstanceState(state);
-            return;
-        }
-
-        SavedState ss = (SavedState)state;
-        super.onRestoreInstanceState(ss.getSuperState());
-
-        if (mAdapter != null) {
-            mAdapter.restoreState(ss.adapterState, ss.loader);
-            setCurrentItemInternal(ss.position, false, true);
-        } else {
-            mRestoredCurItem = ss.position;
-            mRestoredAdapterState = ss.adapterState;
-            mRestoredClassLoader = ss.loader;
-        }
-    }
-
-    @Override
-    public void addView(View child, int index, ViewGroup.LayoutParams params) {
-        if (!checkLayoutParams(params)) {
-            params = generateLayoutParams(params);
-        }
-        final LayoutParams lp = (LayoutParams) params;
-        // Any views added via inflation should be classed as part of the decor
-        lp.isDecor |= isDecorView(child);
-        if (mInLayout) {
-            if (lp != null && lp.isDecor) {
-                throw new IllegalStateException("Cannot add pager decor view during layout");
-            }
-            lp.needsMeasure = true;
-            addViewInLayout(child, index, params);
-        } else {
-            super.addView(child, index, params);
-        }
-
-        if (USE_CACHE) {
-            if (child.getVisibility() != GONE) {
-                child.setDrawingCacheEnabled(mScrollingCacheEnabled);
-            } else {
-                child.setDrawingCacheEnabled(false);
-            }
-        }
-    }
-
-    private static boolean isDecorView(@NonNull View view) {
-        Class<?> clazz = view.getClass();
-        return clazz.getAnnotation(DecorView.class) != null;
-    }
-
-    @Override
-    public void removeView(View view) {
-        if (mInLayout) {
-            removeViewInLayout(view);
-        } else {
-            super.removeView(view);
-        }
-    }
-
-    ItemInfo infoForChild(View child) {
-        for (int i=0; i<mItems.size(); i++) {
-            ItemInfo ii = mItems.get(i);
-            if (mAdapter.isViewFromObject(child, ii.object)) {
-                return ii;
-            }
-        }
-        return null;
-    }
-
-    ItemInfo infoForAnyChild(View child) {
-        ViewParent parent;
-        while ((parent=child.getParent()) != this) {
-            if (parent == null || !(parent instanceof View)) {
-                return null;
-            }
-            child = (View)parent;
-        }
-        return infoForChild(child);
-    }
-
-    ItemInfo infoForPosition(int position) {
-        for (int i = 0; i < mItems.size(); i++) {
-            ItemInfo ii = mItems.get(i);
-            if (ii.position == position) {
-                return ii;
-            }
-        }
-        return null;
-    }
-
-    @Override
-    protected void onAttachedToWindow() {
-        super.onAttachedToWindow();
-        mFirstLayout = true;
-    }
-
-    @Override
-    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
-        // For simple implementation, our internal size is always 0.
-        // We depend on the container to specify the layout size of
-        // our view.  We can't really know what it is since we will be
-        // adding and removing different arbitrary views and do not
-        // want the layout to change as this happens.
-        setMeasuredDimension(getDefaultSize(0, widthMeasureSpec),
-                getDefaultSize(0, heightMeasureSpec));
-
-        final int measuredWidth = getMeasuredWidth();
-        final int maxGutterSize = measuredWidth / 10;
-        mGutterSize = Math.min(maxGutterSize, mDefaultGutterSize);
-
-        // Children are just made to fill our space.
-        int childWidthSize = measuredWidth - getPaddingLeft() - getPaddingRight();
-        int childHeightSize = getMeasuredHeight() - getPaddingTop() - getPaddingBottom();
-
-        /*
-         * Make sure all children have been properly measured. Decor views first.
-         * Right now we cheat and make this less complicated by assuming decor
-         * views won't intersect. We will pin to edges based on gravity.
-         */
-        int size = getChildCount();
-        for (int i = 0; i < size; ++i) {
-            final View child = getChildAt(i);
-            if (child.getVisibility() != GONE) {
-                final LayoutParams lp = (LayoutParams) child.getLayoutParams();
-                if (lp != null && lp.isDecor) {
-                    final int hgrav = lp.gravity & Gravity.HORIZONTAL_GRAVITY_MASK;
-                    final int vgrav = lp.gravity & Gravity.VERTICAL_GRAVITY_MASK;
-                    int widthMode = MeasureSpec.AT_MOST;
-                    int heightMode = MeasureSpec.AT_MOST;
-                    boolean consumeVertical = vgrav == Gravity.TOP || vgrav == Gravity.BOTTOM;
-                    boolean consumeHorizontal = hgrav == Gravity.LEFT || hgrav == Gravity.RIGHT;
-
-                    if (consumeVertical) {
-                        widthMode = MeasureSpec.EXACTLY;
-                    } else if (consumeHorizontal) {
-                        heightMode = MeasureSpec.EXACTLY;
-                    }
-
-                    int widthSize = childWidthSize;
-                    int heightSize = childHeightSize;
-                    if (lp.width != LayoutParams.WRAP_CONTENT) {
-                        widthMode = MeasureSpec.EXACTLY;
-                        if (lp.width != LayoutParams.FILL_PARENT) {
-                            widthSize = lp.width;
-                        }
-                    }
-                    if (lp.height != LayoutParams.WRAP_CONTENT) {
-                        heightMode = MeasureSpec.EXACTLY;
-                        if (lp.height != LayoutParams.FILL_PARENT) {
-                            heightSize = lp.height;
-                        }
-                    }
-                    final int widthSpec = MeasureSpec.makeMeasureSpec(widthSize, widthMode);
-                    final int heightSpec = MeasureSpec.makeMeasureSpec(heightSize, heightMode);
-                    child.measure(widthSpec, heightSpec);
-
-                    if (consumeVertical) {
-                        childHeightSize -= child.getMeasuredHeight();
-                    } else if (consumeHorizontal) {
-                        childWidthSize -= child.getMeasuredWidth();
-                    }
-                }
-            }
-        }
-
-        mChildWidthMeasureSpec = MeasureSpec.makeMeasureSpec(childWidthSize, MeasureSpec.EXACTLY);
-        mChildHeightMeasureSpec = MeasureSpec.makeMeasureSpec(childHeightSize, MeasureSpec.EXACTLY);
-
-        // Make sure we have created all fragments that we need to have shown.
-        mInLayout = true;
-        populate();
-        mInLayout = false;
-
-        // Page views next.
-        size = getChildCount();
-        for (int i = 0; i < size; ++i) {
-            final View child = getChildAt(i);
-            if (child.getVisibility() != GONE) {
-                if (DEBUG) Log.v(TAG, "Measuring #" + i + " " + child
-                        + ": " + mChildWidthMeasureSpec);
-
-                final LayoutParams lp = (LayoutParams) child.getLayoutParams();
-                if (lp == null || !lp.isDecor) {
-                    final int widthSpec = MeasureSpec.makeMeasureSpec(
-                            (int) (childWidthSize * lp.widthFactor), MeasureSpec.EXACTLY);
-                    child.measure(widthSpec, mChildHeightMeasureSpec);
-                }
-            }
-        }
-    }
-
-    @Override
-    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
-        super.onSizeChanged(w, h, oldw, oldh);
-
-        // Make sure scroll position is set correctly.
-        if (w != oldw) {
-            recomputeScrollPosition(w, oldw, mPageMargin, mPageMargin);
-        }
-    }
-
-    private void recomputeScrollPosition(int width, int oldWidth, int margin, int oldMargin) {
-        if (oldWidth > 0 && !mItems.isEmpty()) {
-            if (!mScroller.isFinished()) {
-                mScroller.setFinalX(getCurrentItem() * getClientWidth());
-            } else {
-                final int widthWithMargin = width - getPaddingLeft() - getPaddingRight() + margin;
-                final int oldWidthWithMargin = oldWidth - getPaddingLeft() - getPaddingRight()
-                        + oldMargin;
-                final int xpos = getScrollX();
-                final float pageOffset = (float) xpos / oldWidthWithMargin;
-                final int newOffsetPixels = (int) (pageOffset * widthWithMargin);
-
-                scrollTo(newOffsetPixels, getScrollY());
-            }
-        } else {
-            final ItemInfo ii = infoForPosition(mCurItem);
-            final float scrollOffset = ii != null ? Math.min(ii.offset, mLastOffset) : 0;
-            final int scrollPos = (int) (scrollOffset *
-                                         (width - getPaddingLeft() - getPaddingRight()));
-            if (scrollPos != getScrollX()) {
-                completeScroll(false);
-                scrollTo(scrollPos, getScrollY());
-            }
-        }
-    }
-
-    @Override
-    protected void onLayout(boolean changed, int l, int t, int r, int b) {
-        final int count = getChildCount();
-        int width = r - l;
-        int height = b - t;
-        int paddingLeft = getPaddingLeft();
-        int paddingTop = getPaddingTop();
-        int paddingRight = getPaddingRight();
-        int paddingBottom = getPaddingBottom();
-        final int scrollX = getScrollX();
-
-        int decorCount = 0;
-
-        // First pass - decor views. We need to do this in two passes so that
-        // we have the proper offsets for non-decor views later.
-        for (int i = 0; i < count; i++) {
-            final View child = getChildAt(i);
-            if (child.getVisibility() != GONE) {
-                final LayoutParams lp = (LayoutParams) child.getLayoutParams();
-                int childLeft = 0;
-                int childTop = 0;
-                if (lp.isDecor) {
-                    final int hgrav = lp.gravity & Gravity.HORIZONTAL_GRAVITY_MASK;
-                    final int vgrav = lp.gravity & Gravity.VERTICAL_GRAVITY_MASK;
-                    switch (hgrav) {
-                        default:
-                            childLeft = paddingLeft;
-                            break;
-                        case Gravity.LEFT:
-                            childLeft = paddingLeft;
-                            paddingLeft += child.getMeasuredWidth();
-                            break;
-                        case Gravity.CENTER_HORIZONTAL:
-                            childLeft = Math.max((width - child.getMeasuredWidth()) / 2,
-                                    paddingLeft);
-                            break;
-                        case Gravity.RIGHT:
-                            childLeft = width - paddingRight - child.getMeasuredWidth();
-                            paddingRight += child.getMeasuredWidth();
-                            break;
-                    }
-                    switch (vgrav) {
-                        default:
-                            childTop = paddingTop;
-                            break;
-                        case Gravity.TOP:
-                            childTop = paddingTop;
-                            paddingTop += child.getMeasuredHeight();
-                            break;
-                        case Gravity.CENTER_VERTICAL:
-                            childTop = Math.max((height - child.getMeasuredHeight()) / 2,
-                                    paddingTop);
-                            break;
-                        case Gravity.BOTTOM:
-                            childTop = height - paddingBottom - child.getMeasuredHeight();
-                            paddingBottom += child.getMeasuredHeight();
-                            break;
-                    }
-                    childLeft += scrollX;
-                    child.layout(childLeft, childTop,
-                            childLeft + child.getMeasuredWidth(),
-                            childTop + child.getMeasuredHeight());
-                    decorCount++;
-                }
-            }
-        }
-
-        final int childWidth = width - paddingLeft - paddingRight;
-        // Page views. Do this once we have the right padding offsets from above.
-        for (int i = 0; i < count; i++) {
-            final View child = getChildAt(i);
-            if (child.getVisibility() != GONE) {
-                final LayoutParams lp = (LayoutParams) child.getLayoutParams();
-                ItemInfo ii;
-                if (!lp.isDecor && (ii = infoForChild(child)) != null) {
-                    int loff = (int) (childWidth * ii.offset);
-                    int childLeft = paddingLeft + loff;
-                    int childTop = paddingTop;
-                    if (lp.needsMeasure) {
-                        // This was added during layout and needs measurement.
-                        // Do it now that we know what we're working with.
-                        lp.needsMeasure = false;
-                        final int widthSpec = MeasureSpec.makeMeasureSpec(
-                                (int) (childWidth * lp.widthFactor),
-                                MeasureSpec.EXACTLY);
-                        final int heightSpec = MeasureSpec.makeMeasureSpec(
-                                (int) (height - paddingTop - paddingBottom),
-                                MeasureSpec.EXACTLY);
-                        child.measure(widthSpec, heightSpec);
-                    }
-                    if (DEBUG) Log.v(TAG, "Positioning #" + i + " " + child + " f=" + ii.object
-                            + ":" + childLeft + "," + childTop + " " + child.getMeasuredWidth()
-                            + "x" + child.getMeasuredHeight());
-                    child.layout(childLeft, childTop,
-                            childLeft + child.getMeasuredWidth(),
-                            childTop + child.getMeasuredHeight());
-                }
-            }
-        }
-        mTopPageBounds = paddingTop;
-        mBottomPageBounds = height - paddingBottom;
-        mDecorChildCount = decorCount;
-
-        if (mFirstLayout) {
-            scrollToItem(mCurItem, false, 0, false);
-        }
-        mFirstLayout = false;
-    }
-
-    @Override
-    public void computeScroll() {
-        mIsScrollStarted = true;
-        if (!mScroller.isFinished() && mScroller.computeScrollOffset()) {
-            int oldX = getScrollX();
-            int oldY = getScrollY();
-            int x = mScroller.getCurrX();
-            int y = mScroller.getCurrY();
-
-            if (oldX != x || oldY != y) {
-                scrollTo(x, y);
-                if (!pageScrolled(x)) {
-                    mScroller.abortAnimation();
-                    scrollTo(0, y);
-                }
-            }
-
-            // Keep on drawing until the animation has finished.
-            ViewCompat.postInvalidateOnAnimation(this);
-            return;
-        }
-
-        // Done with scroll, clean up state.
-        completeScroll(true);
-    }
-
-    private boolean pageScrolled(int xpos) {
-        if (mItems.size() == 0) {
-            if (mFirstLayout) {
-                // If we haven't been laid out yet, we probably just haven't been populated yet.
-                // Let's skip this call since it doesn't make sense in this state
-                return false;
-            }
-            mCalledSuper = false;
-            onPageScrolled(0, 0, 0);
-            if (!mCalledSuper) {
-                throw new IllegalStateException(
-                        "onPageScrolled did not call superclass implementation");
-            }
-            return false;
-        }
-        final ItemInfo ii = infoForCurrentScrollPosition();
-        final int width = getClientWidth();
-        final int widthWithMargin = width + mPageMargin;
-        final float marginOffset = (float) mPageMargin / width;
-        final int currentPage = ii.position;
-        final float pageOffset = (((float) xpos / width) - ii.offset) /
-                (ii.widthFactor + marginOffset);
-        final int offsetPixels = (int) (pageOffset * widthWithMargin);
-
-        mCalledSuper = false;
-        onPageScrolled(currentPage, pageOffset, offsetPixels);
-        if (!mCalledSuper) {
-            throw new IllegalStateException(
-                    "onPageScrolled did not call superclass implementation");
-        }
-        return true;
-    }
-
-    /**
-     * This method will be invoked when the current page is scrolled, either as part
-     * of a programmatically initiated smooth scroll or a user initiated touch scroll.
-     * If you override this method you must call through to the superclass implementation
-     * (e.g. super.onPageScrolled(position, offset, offsetPixels)) before onPageScrolled
-     * returns.
-     *
-     * @param position Position index of the first page currently being displayed.
-     *                 Page position+1 will be visible if positionOffset is nonzero.
-     * @param offset Value from [0, 1) indicating the offset from the page at position.
-     * @param offsetPixels Value in pixels indicating the offset from position.
-     */
-    @CallSuper
-    protected void onPageScrolled(int position, float offset, int offsetPixels) {
-        // Offset any decor views if needed - keep them on-screen at all times.
-        if (mDecorChildCount > 0) {
-            final int scrollX = getScrollX();
-            int paddingLeft = getPaddingLeft();
-            int paddingRight = getPaddingRight();
-            final int width = getWidth();
-            final int childCount = getChildCount();
-            for (int i = 0; i < childCount; i++) {
-                final View child = getChildAt(i);
-                final LayoutParams lp = (LayoutParams) child.getLayoutParams();
-                if (!lp.isDecor) continue;
-
-                final int hgrav = lp.gravity & Gravity.HORIZONTAL_GRAVITY_MASK;
-                int childLeft = 0;
-                switch (hgrav) {
-                    default:
-                        childLeft = paddingLeft;
-                        break;
-                    case Gravity.LEFT:
-                        childLeft = paddingLeft;
-                        paddingLeft += child.getWidth();
-                        break;
-                    case Gravity.CENTER_HORIZONTAL:
-                        childLeft = Math.max((width - child.getMeasuredWidth()) / 2,
-                                paddingLeft);
-                        break;
-                    case Gravity.RIGHT:
-                        childLeft = width - paddingRight - child.getMeasuredWidth();
-                        paddingRight += child.getMeasuredWidth();
-                        break;
-                }
-                childLeft += scrollX;
-
-                final int childOffset = childLeft - child.getLeft();
-                if (childOffset != 0) {
-                    child.offsetLeftAndRight(childOffset);
-                }
-            }
-        }
-
-        dispatchOnPageScrolled(position, offset, offsetPixels);
-
-        if (mPageTransformer != null) {
-            final int scrollX = getScrollX();
-            final int childCount = getChildCount();
-            for (int i = 0; i < childCount; i++) {
-                final View child = getChildAt(i);
-                final LayoutParams lp = (LayoutParams) child.getLayoutParams();
-
-                if (lp.isDecor) continue;
-                final float transformPos = (float) (child.getLeft() - scrollX) / getClientWidth();
-                mPageTransformer.transformPage(child, transformPos);
-            }
-        }
-
-        mCalledSuper = true;
-    }
-
-    private void dispatchOnPageScrolled(int position, float offset, int offsetPixels) {
-        if (mOnPageChangeListener != null) {
-            mOnPageChangeListener.onPageScrolled(position, offset, offsetPixels);
-        }
-        if (mOnPageChangeListeners != null) {
-            for (int i = 0, z = mOnPageChangeListeners.size(); i < z; i++) {
-                OnPageChangeListener listener = mOnPageChangeListeners.get(i);
-                if (listener != null) {
-                    listener.onPageScrolled(position, offset, offsetPixels);
-                }
-            }
-        }
-        if (mInternalPageChangeListener != null) {
-            mInternalPageChangeListener.onPageScrolled(position, offset, offsetPixels);
-        }
-    }
-
-    private void dispatchOnPageSelected(int position) {
-        if (mOnPageChangeListener != null) {
-            mOnPageChangeListener.onPageSelected(position);
-        }
-        if (mOnPageChangeListeners != null) {
-            for (int i = 0, z = mOnPageChangeListeners.size(); i < z; i++) {
-                OnPageChangeListener listener = mOnPageChangeListeners.get(i);
-                if (listener != null) {
-                    listener.onPageSelected(position);
-                }
-            }
-        }
-        if (mInternalPageChangeListener != null) {
-            mInternalPageChangeListener.onPageSelected(position);
-        }
-    }
-
-    private void dispatchOnScrollStateChanged(int state) {
-        if (mOnPageChangeListener != null) {
-            mOnPageChangeListener.onPageScrollStateChanged(state);
-        }
-        if (mOnPageChangeListeners != null) {
-            for (int i = 0, z = mOnPageChangeListeners.size(); i < z; i++) {
-                OnPageChangeListener listener = mOnPageChangeListeners.get(i);
-                if (listener != null) {
-                    listener.onPageScrollStateChanged(state);
-                }
-            }
-        }
-        if (mInternalPageChangeListener != null) {
-            mInternalPageChangeListener.onPageScrollStateChanged(state);
-        }
-    }
-
-    private void completeScroll(boolean postEvents) {
-        boolean needPopulate = mScrollState == SCROLL_STATE_SETTLING;
-        if (needPopulate) {
-            // Done with scroll, no longer want to cache view drawing.
-            setScrollingCacheEnabled(false);
-            boolean wasScrolling = !mScroller.isFinished();
-            if (wasScrolling) {
-                mScroller.abortAnimation();
-                int oldX = getScrollX();
-                int oldY = getScrollY();
-                int x = mScroller.getCurrX();
-                int y = mScroller.getCurrY();
-                if (oldX != x || oldY != y) {
-                    scrollTo(x, y);
-                    if (x != oldX) {
-                        pageScrolled(x);
-                    }
-                }
-            }
-        }
-        mPopulatePending = false;
-        for (int i=0; i<mItems.size(); i++) {
-            ItemInfo ii = mItems.get(i);
-            if (ii.scrolling) {
-                needPopulate = true;
-                ii.scrolling = false;
-            }
-        }
-        if (needPopulate) {
-            if (postEvents) {
-                ViewCompat.postOnAnimation(this, mEndScrollRunnable);
-            } else {
-                mEndScrollRunnable.run();
-            }
-        }
-    }
-
-    private boolean isGutterDrag(float x, float dx) {
-        return (x < mGutterSize && dx > 0) || (x > getWidth() - mGutterSize && dx < 0);
-    }
-
-    private void enableLayers(boolean enable) {
-        final int childCount = getChildCount();
-        for (int i = 0; i < childCount; i++) {
-            final int layerType = enable ?
-                    ViewCompat.LAYER_TYPE_HARDWARE : ViewCompat.LAYER_TYPE_NONE;
-            ViewCompat.setLayerType(getChildAt(i), layerType, null);
-        }
-    }
-
-    @Override
-    public boolean onInterceptTouchEvent(MotionEvent ev) {
-        /*
-         * This method JUST determines whether we want to intercept the motion.
-         * If we return true, onMotionEvent will be called and we do the actual
-         * scrolling there.
-         */
-
-        final int action = ev.getAction() & MotionEventCompat.ACTION_MASK;
-
-        // Always take care of the touch gesture being complete.
-        if (action == MotionEvent.ACTION_CANCEL || action == MotionEvent.ACTION_UP) {
-            // Release the drag.
-            if (DEBUG) Log.v(TAG, "Intercept done!");
-            resetTouch();
-            return false;
-        }
-
-        // Nothing more to do here if we have decided whether or not we
-        // are dragging.
-        if (action != MotionEvent.ACTION_DOWN) {
-            if (mIsBeingDragged) {
-                if (DEBUG) Log.v(TAG, "Intercept returning true!");
-                return true;
-            }
-            if (mIsUnableToDrag) {
-                if (DEBUG) Log.v(TAG, "Intercept returning false!");
-                return false;
-            }
-        }
-
-        switch (action) {
-            case MotionEvent.ACTION_MOVE: {
-                /*
-                 * mIsBeingDragged == false, otherwise the shortcut would have caught it. Check
-                 * whether the user has moved far enough from his original down touch.
-                 */
-
-                /*
-                * Locally do absolute value. mLastMotionY is set to the y value
-                * of the down event.
-                */
-                final int activePointerId = mActivePointerId;
-                if (activePointerId == INVALID_POINTER) {
-                    // If we don't have a valid id, the touch down wasn't on content.
-                    break;
-                }
-
-                final int pointerIndex = MotionEventCompat.findPointerIndex(ev, activePointerId);
-                final float x = MotionEventCompat.getX(ev, pointerIndex);
-                final float dx = x - mLastMotionX;
-                final float xDiff = Math.abs(dx);
-                final float y = MotionEventCompat.getY(ev, pointerIndex);
-                final float yDiff = Math.abs(y - mInitialMotionY);
-                if (DEBUG) Log.v(TAG, "Moved x to " + x + "," + y + " diff=" + xDiff + "," + yDiff);
-
-                if (dx != 0 && !isGutterDrag(mLastMotionX, dx) &&
-                        canScroll(this, false, (int) dx, (int) x, (int) y)) {
-                    // Nested view has scrollable area under this point. Let it be handled there.
-                    mLastMotionX = x;
-                    mLastMotionY = y;
-                    mIsUnableToDrag = true;
-                    return false;
-                }
-                if (xDiff > mTouchSlop && xDiff * 0.5f > yDiff) {
-                    if (DEBUG) Log.v(TAG, "Starting drag!");
-                    mIsBeingDragged = true;
-                    requestParentDisallowInterceptTouchEvent(true);
-                    setScrollState(SCROLL_STATE_DRAGGING);
-                    mLastMotionX = dx > 0 ? mInitialMotionX + mTouchSlop :
-                            mInitialMotionX - mTouchSlop;
-                    mLastMotionY = y;
-                    setScrollingCacheEnabled(true);
-                } else if (yDiff > mTouchSlop) {
-                    // The finger has moved enough in the vertical
-                    // direction to be counted as a drag...  abort
-                    // any attempt to drag horizontally, to work correctly
-                    // with children that have scrolling containers.
-                    if (DEBUG) Log.v(TAG, "Starting unable to drag!");
-                    mIsUnableToDrag = true;
-                }
-                if (mIsBeingDragged) {
-                    // Scroll to follow the motion event
-                    if (performDrag(x)) {
-                        ViewCompat.postInvalidateOnAnimation(this);
-                    }
-                }
-                break;
-            }
-
-            case MotionEvent.ACTION_DOWN: {
-                /*
-                 * Remember location of down touch.
-                 * ACTION_DOWN always refers to pointer index 0.
-                 */
-                mLastMotionX = mInitialMotionX = ev.getX();
-                mLastMotionY = mInitialMotionY = ev.getY();
-                mActivePointerId = MotionEventCompat.getPointerId(ev, 0);
-                mIsUnableToDrag = false;
-
-                mIsScrollStarted = true;
-                mScroller.computeScrollOffset();
-                if (mScrollState == SCROLL_STATE_SETTLING &&
-                        Math.abs(mScroller.getFinalX() - mScroller.getCurrX()) > mCloseEnough) {
-                    // Let the user 'catch' the pager as it animates.
-                    mScroller.abortAnimation();
-                    mPopulatePending = false;
-                    populate();
-                    mIsBeingDragged = true;
-                    requestParentDisallowInterceptTouchEvent(true);
-                    setScrollState(SCROLL_STATE_DRAGGING);
-                } else {
-                    completeScroll(false);
-                    mIsBeingDragged = false;
-                }
-
-                if (DEBUG) Log.v(TAG, "Down at " + mLastMotionX + "," + mLastMotionY
-                        + " mIsBeingDragged=" + mIsBeingDragged
-                        + "mIsUnableToDrag=" + mIsUnableToDrag);
-                break;
-            }
-
-            case MotionEventCompat.ACTION_POINTER_UP:
-                onSecondaryPointerUp(ev);
-                break;
-        }
-
-        if (mVelocityTracker == null) {
-            mVelocityTracker = VelocityTracker.obtain();
-        }
-        mVelocityTracker.addMovement(ev);
-
-        /*
-         * The only time we want to intercept motion events is if we are in the
-         * drag mode.
-         */
-        return mIsBeingDragged;
-    }
-
-    @Override
-    public boolean onTouchEvent(MotionEvent ev) {
-        if (mFakeDragging) {
-            // A fake drag is in progress already, ignore this real one
-            // but still eat the touch events.
-            // (It is likely that the user is multi-touching the screen.)
-            return true;
-        }
-
-        if (ev.getAction() == MotionEvent.ACTION_DOWN && ev.getEdgeFlags() != 0) {
-            // Don't handle edge touches immediately -- they may actually belong to one of our
-            // descendants.
-            return false;
-        }
-
-        if (mAdapter == null || mAdapter.getCount() == 0) {
-            // Nothing to present or scroll; nothing to touch.
-            return false;
-        }
-
-        if (mVelocityTracker == null) {
-            mVelocityTracker = VelocityTracker.obtain();
-        }
-        mVelocityTracker.addMovement(ev);
-
-        final int action = ev.getAction();
-        boolean needsInvalidate = false;
-
-        switch (action & MotionEventCompat.ACTION_MASK) {
-            case MotionEvent.ACTION_DOWN: {
-                mScroller.abortAnimation();
-                mPopulatePending = false;
-                populate();
-
-                // Remember where the motion event started
-                mLastMotionX = mInitialMotionX = ev.getX();
-                mLastMotionY = mInitialMotionY = ev.getY();
-                mActivePointerId = MotionEventCompat.getPointerId(ev, 0);
-                break;
-            }
-            case MotionEvent.ACTION_MOVE:
-                if (!mIsBeingDragged) {
-                    final int pointerIndex = MotionEventCompat.findPointerIndex(ev, mActivePointerId);
-                    if (pointerIndex == -1) {
-                        // A child has consumed some touch events and put us into an inconsistent state.
-                        needsInvalidate = resetTouch();
-                        break;
-                    }
-                    final float x = MotionEventCompat.getX(ev, pointerIndex);
-                    final float xDiff = Math.abs(x - mLastMotionX);
-                    final float y = MotionEventCompat.getY(ev, pointerIndex);
-                    final float yDiff = Math.abs(y - mLastMotionY);
-                    if (DEBUG) Log.v(TAG, "Moved x to " + x + "," + y + " diff=" + xDiff + "," + yDiff);
-                    if (xDiff > mTouchSlop && xDiff > yDiff) {
-                        if (DEBUG) Log.v(TAG, "Starting drag!");
-                        mIsBeingDragged = true;
-                        requestParentDisallowInterceptTouchEvent(true);
-                        mLastMotionX = x - mInitialMotionX > 0 ? mInitialMotionX + mTouchSlop :
-                                mInitialMotionX - mTouchSlop;
-                        mLastMotionY = y;
-                        setScrollState(SCROLL_STATE_DRAGGING);
-                        setScrollingCacheEnabled(true);
-
-                        // Disallow Parent Intercept, just in case
-                        ViewParent parent = getParent();
-                        if (parent != null) {
-                            parent.requestDisallowInterceptTouchEvent(true);
-                        }
-                    }
-                }
-                // Not else! Note that mIsBeingDragged can be set above.
-                if (mIsBeingDragged) {
-                    // Scroll to follow the motion event
-                    final int activePointerIndex = MotionEventCompat.findPointerIndex(
-                            ev, mActivePointerId);
-                    final float x = MotionEventCompat.getX(ev, activePointerIndex);
-                    needsInvalidate |= performDrag(x);
-                }
-                break;
-            case MotionEvent.ACTION_UP:
-                if (mIsBeingDragged) {
-                    final VelocityTracker velocityTracker = mVelocityTracker;
-                    velocityTracker.computeCurrentVelocity(1000, mMaximumVelocity);
-                    int initialVelocity = (int) VelocityTrackerCompat.getXVelocity(
-                            velocityTracker, mActivePointerId);
-                    mPopulatePending = true;
-                    final int width = getClientWidth();
-                    final int scrollX = getScrollX();
-                    final ItemInfo ii = infoForCurrentScrollPosition();
-                    final float marginOffset = (float) mPageMargin / width;
-                    final int currentPage = ii.position;
-                    final float pageOffset = (((float) scrollX / width) - ii.offset)
-                            / (ii.widthFactor + marginOffset);
-                    final int activePointerIndex =
-                            MotionEventCompat.findPointerIndex(ev, mActivePointerId);
-                    final float x = MotionEventCompat.getX(ev, activePointerIndex);
-                    final int totalDelta = (int) (x - mInitialMotionX);
-                    int nextPage = determineTargetPage(currentPage, pageOffset, initialVelocity,
-                            totalDelta);
-                    setCurrentItemInternal(nextPage, true, true, initialVelocity);
-
-                    needsInvalidate = resetTouch();
-                }
-                break;
-            case MotionEvent.ACTION_CANCEL:
-                if (mIsBeingDragged) {
-                    scrollToItem(mCurItem, true, 0, false);
-                    needsInvalidate = resetTouch();
-                }
-                break;
-            case MotionEventCompat.ACTION_POINTER_DOWN: {
-                final int index = MotionEventCompat.getActionIndex(ev);
-                final float x = MotionEventCompat.getX(ev, index);
-                mLastMotionX = x;
-                mActivePointerId = MotionEventCompat.getPointerId(ev, index);
-                break;
-            }
-            case MotionEventCompat.ACTION_POINTER_UP:
-                onSecondaryPointerUp(ev);
-                mLastMotionX = MotionEventCompat.getX(ev,
-                        MotionEventCompat.findPointerIndex(ev, mActivePointerId));
-                break;
-        }
-        if (needsInvalidate) {
-            ViewCompat.postInvalidateOnAnimation(this);
-        }
-        return true;
-    }
-
-    private boolean resetTouch() {
-        boolean needsInvalidate;
-        mActivePointerId = INVALID_POINTER;
-        endDrag();
-        needsInvalidate = mLeftEdge.onRelease() | mRightEdge.onRelease();
-        return needsInvalidate;
-    }
-
-    private void requestParentDisallowInterceptTouchEvent(boolean disallowIntercept) {
-        final ViewParent parent = getParent();
-        if (parent != null) {
-            parent.requestDisallowInterceptTouchEvent(disallowIntercept);
-        }
-    }
-
-    private boolean performDrag(float x) {
-        boolean needsInvalidate = false;
-
-        final float deltaX = mLastMotionX - x;
-        mLastMotionX = x;
-
-        float oldScrollX = getScrollX();
-        float scrollX = oldScrollX + deltaX;
-        final int width = getClientWidth();
-
-        float leftBound = width * mFirstOffset;
-        float rightBound = width * mLastOffset;
-        boolean leftAbsolute = true;
-        boolean rightAbsolute = true;
-
-        final ItemInfo firstItem = mItems.get(0);
-        final ItemInfo lastItem = mItems.get(mItems.size() - 1);
-        if (firstItem.position != 0) {
-            leftAbsolute = false;
-            leftBound = firstItem.offset * width;
-        }
-        if (lastItem.position != mAdapter.getCount() - 1) {
-            rightAbsolute = false;
-            rightBound = lastItem.offset * width;
-        }
-
-        if (scrollX < leftBound) {
-            if (leftAbsolute) {
-                float over = leftBound - scrollX;
-                needsInvalidate = mLeftEdge.onPull(Math.abs(over) / width);
-            }
-            scrollX = leftBound;
-        } else if (scrollX > rightBound) {
-            if (rightAbsolute) {
-                float over = scrollX - rightBound;
-                needsInvalidate = mRightEdge.onPull(Math.abs(over) / width);
-            }
-            scrollX = rightBound;
-        }
-        // Don't lose the rounded component
-        mLastMotionX += scrollX - (int) scrollX;
-        scrollTo((int) scrollX, getScrollY());
-        pageScrolled((int) scrollX);
-
-        return needsInvalidate;
-    }
-
-    /**
-     * @return Info about the page at the current scroll position.
-     *         This can be synthetic for a missing middle page; the 'object' field can be null.
-     */
-    private ItemInfo infoForCurrentScrollPosition() {
-        final int width = getClientWidth();
-        final float scrollOffset = width > 0 ? (float) getScrollX() / width : 0;
-        final float marginOffset = width > 0 ? (float) mPageMargin / width : 0;
-        int lastPos = -1;
-        float lastOffset = 0.f;
-        float lastWidth = 0.f;
-        boolean first = true;
-
-        ItemInfo lastItem = null;
-        for (int i = 0; i < mItems.size(); i++) {
-            ItemInfo ii = mItems.get(i);
-            float offset;
-            if (!first && ii.position != lastPos + 1) {
-                // Create a synthetic item for a missing page.
-                ii = mTempItem;
-                ii.offset = lastOffset + lastWidth + marginOffset;
-                ii.position = lastPos + 1;
-                ii.widthFactor = mAdapter.getPageWidth(ii.position);
-                i--;
-            }
-            offset = ii.offset;
-
-            final float leftBound = offset;
-            final float rightBound = offset + ii.widthFactor + marginOffset;
-            if (first || scrollOffset >= leftBound) {
-                if (scrollOffset < rightBound || i == mItems.size() - 1) {
-                    return ii;
-                }
-            } else {
-                return lastItem;
-            }
-            first = false;
-            lastPos = ii.position;
-            lastOffset = offset;
-            lastWidth = ii.widthFactor;
-            lastItem = ii;
-        }
-
-        return lastItem;
-    }
-
-    private int determineTargetPage(int currentPage, float pageOffset, int velocity, int deltaX) {
-        int targetPage;
-        if (Math.abs(deltaX) > mFlingDistance && Math.abs(velocity) > mMinimumVelocity) {
-            targetPage = velocity > 0 ? currentPage : currentPage + 1;
-        } else {
-            final float truncator = currentPage >= mCurItem ? 0.4f : 0.6f;
-            targetPage = currentPage + (int) (pageOffset + truncator);
-        }
-
-        if (mItems.size() > 0) {
-            final ItemInfo firstItem = mItems.get(0);
-            final ItemInfo lastItem = mItems.get(mItems.size() - 1);
-
-            // Only let the user target pages we have items for
-            targetPage = Math.max(firstItem.position, Math.min(targetPage, lastItem.position));
-        }
-
-        return targetPage;
-    }
-
-    @Override
-    public void draw(Canvas canvas) {
-        super.draw(canvas);
-        boolean needsInvalidate = false;
-
-        final int overScrollMode = ViewCompat.getOverScrollMode(this);
-        if (overScrollMode == ViewCompat.OVER_SCROLL_ALWAYS ||
-                (overScrollMode == ViewCompat.OVER_SCROLL_IF_CONTENT_SCROLLS &&
-                        mAdapter != null && mAdapter.getCount() > 1)) {
-            if (!mLeftEdge.isFinished()) {
-                final int restoreCount = canvas.save();
-                final int height = getHeight() - getPaddingTop() - getPaddingBottom();
-                final int width = getWidth();
-
-                canvas.rotate(270);
-                canvas.translate(-height + getPaddingTop(), mFirstOffset * width);
-                mLeftEdge.setSize(height, width);
-                needsInvalidate |= mLeftEdge.draw(canvas);
-                canvas.restoreToCount(restoreCount);
-            }
-            if (!mRightEdge.isFinished()) {
-                final int restoreCount = canvas.save();
-                final int width = getWidth();
-                final int height = getHeight() - getPaddingTop() - getPaddingBottom();
-
-                canvas.rotate(90);
-                canvas.translate(-getPaddingTop(), -(mLastOffset + 1) * width);
-                mRightEdge.setSize(height, width);
-                needsInvalidate |= mRightEdge.draw(canvas);
-                canvas.restoreToCount(restoreCount);
-            }
-        } else {
-            mLeftEdge.finish();
-            mRightEdge.finish();
-        }
-
-        if (needsInvalidate) {
-            // Keep animating
-            ViewCompat.postInvalidateOnAnimation(this);
-        }
-    }
-
-    @Override
-    protected void onDraw(Canvas canvas) {
-        super.onDraw(canvas);
-
-        // Draw the margin drawable between pages if needed.
-        if (mPageMargin > 0 && mMarginDrawable != null && mItems.size() > 0 && mAdapter != null) {
-            final int scrollX = getScrollX();
-            final int width = getWidth();
-
-            final float marginOffset = (float) mPageMargin / width;
-            int itemIndex = 0;
-            ItemInfo ii = mItems.get(0);
-            float offset = ii.offset;
-            final int itemCount = mItems.size();
-            final int firstPos = ii.position;
-            final int lastPos = mItems.get(itemCount - 1).position;
-            for (int pos = firstPos; pos < lastPos; pos++) {
-                while (pos > ii.position && itemIndex < itemCount) {
-                    ii = mItems.get(++itemIndex);
-                }
-
-                float drawAt;
-                if (pos == ii.position) {
-                    drawAt = (ii.offset + ii.widthFactor) * width;
-                    offset = ii.offset + ii.widthFactor + marginOffset;
-                } else {
-                    float widthFactor = mAdapter.getPageWidth(pos);
-                    drawAt = (offset + widthFactor) * width;
-                    offset += widthFactor + marginOffset;
-                }
-
-                if (drawAt + mPageMargin > scrollX) {
-                    mMarginDrawable.setBounds(Math.round(drawAt), mTopPageBounds,
-                            Math.round(drawAt + mPageMargin), mBottomPageBounds);
-                    mMarginDrawable.draw(canvas);
-                }
-
-                if (drawAt > scrollX + width) {
-                    break; // No more visible, no sense in continuing
-                }
-            }
-        }
-    }
-
-    /**
-     * Start a fake drag of the pager.
-     *
-     * <p>A fake drag can be useful if you want to synchronize the motion of the ViewPager
-     * with the touch scrolling of another view, while still letting the ViewPager
-     * control the snapping motion and fling behavior. (e.g. parallax-scrolling tabs.)
-     * Call {@link #fakeDragBy(float)} to simulate the actual drag motion. Call
-     * {@link #endFakeDrag()} to complete the fake drag and fling as necessary.
-     *
-     * <p>During a fake drag the ViewPager will ignore all touch events. If a real drag
-     * is already in progress, this method will return false.
-     *
-     * @return true if the fake drag began successfully, false if it could not be started.
-     *
-     * @see #fakeDragBy(float)
-     * @see #endFakeDrag()
-     */
-    public boolean beginFakeDrag() {
-        if (mIsBeingDragged) {
-            return false;
-        }
-        mFakeDragging = true;
-        setScrollState(SCROLL_STATE_DRAGGING);
-        mInitialMotionX = mLastMotionX = 0;
-        if (mVelocityTracker == null) {
-            mVelocityTracker = VelocityTracker.obtain();
-        } else {
-            mVelocityTracker.clear();
-        }
-        final long time = SystemClock.uptimeMillis();
-        final MotionEvent ev = MotionEvent.obtain(time, time, MotionEvent.ACTION_DOWN, 0, 0, 0);
-        mVelocityTracker.addMovement(ev);
-        ev.recycle();
-        mFakeDragBeginTime = time;
-        return true;
-    }
-
-    /**
-     * End a fake drag of the pager.
-     *
-     * @see #beginFakeDrag()
-     * @see #fakeDragBy(float)
-     */
-    public void endFakeDrag() {
-        if (!mFakeDragging) {
-            throw new IllegalStateException("No fake drag in progress. Call beginFakeDrag first.");
-        }
-
-        if (mAdapter != null) {
-            final VelocityTracker velocityTracker = mVelocityTracker;
-            velocityTracker.computeCurrentVelocity(1000, mMaximumVelocity);
-            int initialVelocity = (int) VelocityTrackerCompat.getXVelocity(
-                    velocityTracker, mActivePointerId);
-            mPopulatePending = true;
-            final int width = getClientWidth();
-            final int scrollX = getScrollX();
-            final ItemInfo ii = infoForCurrentScrollPosition();
-            final int currentPage = ii.position;
-            final float pageOffset = (((float) scrollX / width) - ii.offset) / ii.widthFactor;
-            final int totalDelta = (int) (mLastMotionX - mInitialMotionX);
-            int nextPage = determineTargetPage(currentPage, pageOffset, initialVelocity,
-                    totalDelta);
-            setCurrentItemInternal(nextPage, true, true, initialVelocity);
-        }
-        endDrag();
-
-        mFakeDragging = false;
-    }
-
-    /**
-     * Fake drag by an offset in pixels. You must have called {@link #beginFakeDrag()} first.
-     *
-     * @param xOffset Offset in pixels to drag by.
-     * @see #beginFakeDrag()
-     * @see #endFakeDrag()
-     */
-    public void fakeDragBy(float xOffset) {
-        if (!mFakeDragging) {
-            throw new IllegalStateException("No fake drag in progress. Call beginFakeDrag first.");
-        }
-
-        if (mAdapter == null) {
-            return;
-        }
-
-        mLastMotionX += xOffset;
-
-        float oldScrollX = getScrollX();
-        float scrollX = oldScrollX - xOffset;
-        final int width = getClientWidth();
-
-        float leftBound = width * mFirstOffset;
-        float rightBound = width * mLastOffset;
-
-        final ItemInfo firstItem = mItems.get(0);
-        final ItemInfo lastItem = mItems.get(mItems.size() - 1);
-        if (firstItem.position != 0) {
-            leftBound = firstItem.offset * width;
-        }
-        if (lastItem.position != mAdapter.getCount() - 1) {
-            rightBound = lastItem.offset * width;
-        }
-
-        if (scrollX < leftBound) {
-            scrollX = leftBound;
-        } else if (scrollX > rightBound) {
-            scrollX = rightBound;
-        }
-        // Don't lose the rounded component
-        mLastMotionX += scrollX - (int) scrollX;
-        scrollTo((int) scrollX, getScrollY());
-        pageScrolled((int) scrollX);
-
-        // Synthesize an event for the VelocityTracker.
-        final long time = SystemClock.uptimeMillis();
-        final MotionEvent ev = MotionEvent.obtain(mFakeDragBeginTime, time, MotionEvent.ACTION_MOVE,
-                mLastMotionX, 0, 0);
-        mVelocityTracker.addMovement(ev);
-        ev.recycle();
-    }
-
-    /**
-     * Returns true if a fake drag is in progress.
-     *
-     * @return true if currently in a fake drag, false otherwise.
-     *
-     * @see #beginFakeDrag()
-     * @see #fakeDragBy(float)
-     * @see #endFakeDrag()
-     */
-    public boolean isFakeDragging() {
-        return mFakeDragging;
-    }
-
-    private void onSecondaryPointerUp(MotionEvent ev) {
-        final int pointerIndex = MotionEventCompat.getActionIndex(ev);
-        final int pointerId = MotionEventCompat.getPointerId(ev, pointerIndex);
-        if (pointerId == mActivePointerId) {
-            // This was our active pointer going up. Choose a new
-            // active pointer and adjust accordingly.
-            final int newPointerIndex = pointerIndex == 0 ? 1 : 0;
-            mLastMotionX = MotionEventCompat.getX(ev, newPointerIndex);
-            mActivePointerId = MotionEventCompat.getPointerId(ev, newPointerIndex);
-            if (mVelocityTracker != null) {
-                mVelocityTracker.clear();
-            }
-        }
-    }
-
-    private void endDrag() {
-        mIsBeingDragged = false;
-        mIsUnableToDrag = false;
-
-        if (mVelocityTracker != null) {
-            mVelocityTracker.recycle();
-            mVelocityTracker = null;
-        }
-    }
-
-    private void setScrollingCacheEnabled(boolean enabled) {
-        if (mScrollingCacheEnabled != enabled) {
-            mScrollingCacheEnabled = enabled;
-            if (USE_CACHE) {
-                final int size = getChildCount();
-                for (int i = 0; i < size; ++i) {
-                    final View child = getChildAt(i);
-                    if (child.getVisibility() != GONE) {
-                        child.setDrawingCacheEnabled(enabled);
-                    }
-                }
-            }
-        }
-    }
-
-    public boolean canScrollHorizontally(int direction) {
-        if (mAdapter == null) {
-            return false;
-        }
-
-        final int width = getClientWidth();
-        final int scrollX = getScrollX();
-        if (direction < 0) {
-            return (scrollX > (int) (width * mFirstOffset));
-        } else if (direction > 0) {
-            return (scrollX < (int) (width * mLastOffset));
-        } else {
-            return false;
-        }
-    }
-
-    /**
-     * Tests scrollability within child views of v given a delta of dx.
-     *
-     * @param v View to test for horizontal scrollability
-     * @param checkV Whether the view v passed should itself be checked for scrollability (true),
-     *               or just its children (false).
-     * @param dx Delta scrolled in pixels
-     * @param x X coordinate of the active touch point
-     * @param y Y coordinate of the active touch point
-     * @return true if child views of v can be scrolled by delta of dx.
-     */
-    protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) {
-        if (v instanceof ViewGroup) {
-            final ViewGroup group = (ViewGroup) v;
-            final int scrollX = v.getScrollX();
-            final int scrollY = v.getScrollY();
-            final int count = group.getChildCount();
-            // Count backwards - let topmost views consume scroll distance first.
-            for (int i = count - 1; i >= 0; i--) {
-                // TODO: Add versioned support here for transformed views.
-                // This will not work for transformed views in Honeycomb+
-                final View child = group.getChildAt(i);
-                if (x + scrollX >= child.getLeft() && x + scrollX < child.getRight() &&
-                        y + scrollY >= child.getTop() && y + scrollY < child.getBottom() &&
-                        canScroll(child, true, dx, x + scrollX - child.getLeft(),
-                                y + scrollY - child.getTop())) {
-                    return true;
-                }
-            }
-        }
-
-        return checkV && ViewCompat.canScrollHorizontally(v, -dx);
-    }
-
-    @Override
-    public boolean dispatchKeyEvent(KeyEvent event) {
-        // Let the focused view and/or our descendants get the key first
-        return super.dispatchKeyEvent(event) || executeKeyEvent(event);
-    }
-
-    /**
-     * You can call this function yourself to have the scroll view perform
-     * scrolling from a key event, just as if the event had been dispatched to
-     * it by the view hierarchy.
-     *
-     * @param event The key event to execute.
-     * @return Return true if the event was handled, else false.
-     */
-    public boolean executeKeyEvent(KeyEvent event) {
-        boolean handled = false;
-        if (event.getAction() == KeyEvent.ACTION_DOWN) {
-            switch (event.getKeyCode()) {
-                case KeyEvent.KEYCODE_DPAD_LEFT:
-                    handled = arrowScroll(FOCUS_LEFT);
-                    break;
-                case KeyEvent.KEYCODE_DPAD_RIGHT:
-                    handled = arrowScroll(FOCUS_RIGHT);
-                    break;
-                case KeyEvent.KEYCODE_TAB:
-                    if (Build.VERSION.SDK_INT >= 11) {
-                        // The focus finder had a bug handling FOCUS_FORWARD and FOCUS_BACKWARD
-                        // before Android 3.0. Ignore the tab key on those devices.
-                        if (KeyEventCompat.hasNoModifiers(event)) {
-                            handled = arrowScroll(FOCUS_FORWARD);
-                        } else if (KeyEventCompat.hasModifiers(event, KeyEvent.META_SHIFT_ON)) {
-                            handled = arrowScroll(FOCUS_BACKWARD);
-                        }
-                    }
-                    break;
-            }
-        }
-        return handled;
-    }
-
-    public boolean arrowScroll(int direction) {
-        View currentFocused = findFocus();
-        if (currentFocused == this) {
-            currentFocused = null;
-        } else if (currentFocused != null) {
-            boolean isChild = false;
-            for (ViewParent parent = currentFocused.getParent(); parent instanceof ViewGroup;
-                    parent = parent.getParent()) {
-                if (parent == this) {
-                    isChild = true;
-                    break;
-                }
-            }
-            if (!isChild) {
-                // This would cause the focus search down below to fail in fun ways.
-                final StringBuilder sb = new StringBuilder();
-                sb.append(currentFocused.getClass().getSimpleName());
-                for (ViewParent parent = currentFocused.getParent(); parent instanceof ViewGroup;
-                        parent = parent.getParent()) {
-                    sb.append(" => ").append(parent.getClass().getSimpleName());
-                }
-                Log.e(TAG, "arrowScroll tried to find focus based on non-child " +
-                        "current focused view " + sb.toString());
-                currentFocused = null;
-            }
-        }
-
-        boolean handled = false;
-
-        View nextFocused = FocusFinder.getInstance().findNextFocus(this, currentFocused,
-                direction);
-        if (nextFocused != null && nextFocused != currentFocused) {
-            if (direction == View.FOCUS_LEFT) {
-                // If there is nothing to the left, or this is causing us to
-                // jump to the right, then what we really want to do is page left.
-                final int nextLeft = getChildRectInPagerCoordinates(mTempRect, nextFocused).left;
-                final int currLeft = getChildRectInPagerCoordinates(mTempRect, currentFocused).left;
-                if (currentFocused != null && nextLeft >= currLeft) {
-                    handled = pageLeft();
-                } else {
-                    handled = nextFocused.requestFocus();
-                }
-            } else if (direction == View.FOCUS_RIGHT) {
-                // If there is nothing to the right, or this is causing us to
-                // jump to the left, then what we really want to do is page right.
-                final int nextLeft = getChildRectInPagerCoordinates(mTempRect, nextFocused).left;
-                final int currLeft = getChildRectInPagerCoordinates(mTempRect, currentFocused).left;
-                if (currentFocused != null && nextLeft <= currLeft) {
-                    handled = pageRight();
-                } else {
-                    handled = nextFocused.requestFocus();
-                }
-            }
-        } else if (direction == FOCUS_LEFT || direction == FOCUS_BACKWARD) {
-            // Trying to move left and nothing there; try to page.
-            handled = pageLeft();
-        } else if (direction == FOCUS_RIGHT || direction == FOCUS_FORWARD) {
-            // Trying to move right and nothing there; try to page.
-            handled = pageRight();
-        }
-        if (handled) {
-            playSoundEffect(SoundEffectConstants.getContantForFocusDirection(direction));
-        }
-        return handled;
-    }
-
-    private Rect getChildRectInPagerCoordinates(Rect outRect, View child) {
-        if (outRect == null) {
-            outRect = new Rect();
-        }
-        if (child == null) {
-            outRect.set(0, 0, 0, 0);
-            return outRect;
-        }
-        outRect.left = child.getLeft();
-        outRect.right = child.getRight();
-        outRect.top = child.getTop();
-        outRect.bottom = child.getBottom();
-
-        ViewParent parent = child.getParent();
-        while (parent instanceof ViewGroup && parent != this) {
-            final ViewGroup group = (ViewGroup) parent;
-            outRect.left += group.getLeft();
-            outRect.right += group.getRight();
-            outRect.top += group.getTop();
-            outRect.bottom += group.getBottom();
-
-            parent = group.getParent();
-        }
-        return outRect;
-    }
-
-    boolean pageLeft() {
-        if (mCurItem > 0) {
-            setCurrentItem(mCurItem-1, true);
-            return true;
-        }
-        return false;
-    }
-
-    boolean pageRight() {
-        if (mAdapter != null && mCurItem < (mAdapter.getCount()-1)) {
-            setCurrentItem(mCurItem+1, true);
-            return true;
-        }
-        return false;
-    }
-
-    /**
-     * We only want the current page that is being shown to be focusable.
-     */
-    @Override
-    public void addFocusables(ArrayList<View> views, int direction, int focusableMode) {
-        final int focusableCount = views.size();
-
-        final int descendantFocusability = getDescendantFocusability();
-
-        if (descendantFocusability != FOCUS_BLOCK_DESCENDANTS) {
-            for (int i = 0; i < getChildCount(); i++) {
-                final View child = getChildAt(i);
-                if (child.getVisibility() == VISIBLE) {
-                    ItemInfo ii = infoForChild(child);
-                    if (ii != null && ii.position == mCurItem) {
-                        child.addFocusables(views, direction, focusableMode);
-                    }
-                }
-            }
-        }
-
-        // we add ourselves (if focusable) in all cases except for when we are
-        // FOCUS_AFTER_DESCENDANTS and there are some descendants focusable.  this is
-        // to avoid the focus search finding layouts when a more precise search
-        // among the focusable children would be more interesting.
-        if (
-            descendantFocusability != FOCUS_AFTER_DESCENDANTS ||
-                // No focusable descendants
-                (focusableCount == views.size())) {
-            // Note that we can't call the superclass here, because it will
-            // add all views in.  So we need to do the same thing View does.
-            if (!isFocusable()) {
-                return;
-            }
-            if ((focusableMode & FOCUSABLES_TOUCH_MODE) == FOCUSABLES_TOUCH_MODE &&
-                    isInTouchMode() && !isFocusableInTouchMode()) {
-                return;
-            }
-            if (views != null) {
-                views.add(this);
-            }
-        }
-    }
-
-    /**
-     * We only want the current page that is being shown to be touchable.
-     */
-    @Override
-    public void addTouchables(ArrayList<View> views) {
-        // Note that we don't call super.addTouchables(), which means that
-        // we don't call View.addTouchables().  This is okay because a ViewPager
-        // is itself not touchable.
-        for (int i = 0; i < getChildCount(); i++) {
-            final View child = getChildAt(i);
-            if (child.getVisibility() == VISIBLE) {
-                ItemInfo ii = infoForChild(child);
-                if (ii != null && ii.position == mCurItem) {
-                    child.addTouchables(views);
-                }
-            }
-        }
-    }
-
-    /**
-     * We only want the current page that is being shown to be focusable.
-     */
-    @Override
-    protected boolean onRequestFocusInDescendants(int direction,
-            Rect previouslyFocusedRect) {
-        int index;
-        int increment;
-        int end;
-        int count = getChildCount();
-        if ((direction & FOCUS_FORWARD) != 0) {
-            index = 0;
-            increment = 1;
-            end = count;
-        } else {
-            index = count - 1;
-            increment = -1;
-            end = -1;
-        }
-        for (int i = index; i != end; i += increment) {
-            View child = getChildAt(i);
-            if (child.getVisibility() == VISIBLE) {
-                ItemInfo ii = infoForChild(child);
-                if (ii != null && ii.position == mCurItem) {
-                    if (child.requestFocus(direction, previouslyFocusedRect)) {
-                        return true;
-                    }
-                }
-            }
-        }
-        return false;
-    }
-
-    @Override
-    public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
-        // Dispatch scroll events from this ViewPager.
-        if (event.getEventType() == AccessibilityEventCompat.TYPE_VIEW_SCROLLED) {
-            return super.dispatchPopulateAccessibilityEvent(event);
-        }
-
-        // Dispatch all other accessibility events from the current page.
-        final int childCount = getChildCount();
-        for (int i = 0; i < childCount; i++) {
-            final View child = getChildAt(i);
-            if (child.getVisibility() == VISIBLE) {
-                final ItemInfo ii = infoForChild(child);
-                if (ii != null && ii.position == mCurItem &&
-                        child.dispatchPopulateAccessibilityEvent(event)) {
-                    return true;
-                }
-            }
-        }
-
-        return false;
-    }
-
-    @Override
-    protected ViewGroup.LayoutParams generateDefaultLayoutParams() {
-        return new LayoutParams();
-    }
-
-    @Override
-    protected ViewGroup.LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) {
-        return generateDefaultLayoutParams();
-    }
-
-    @Override
-    protected boolean checkLayoutParams(ViewGroup.LayoutParams p) {
-        return p instanceof LayoutParams && super.checkLayoutParams(p);
-    }
-
-    @Override
-    public ViewGroup.LayoutParams generateLayoutParams(AttributeSet attrs) {
-        return new LayoutParams(getContext(), attrs);
-    }
-
-    class MyAccessibilityDelegate extends AccessibilityDelegateCompat {
-
-        @Override
-        public void onInitializeAccessibilityEvent(View host, AccessibilityEvent event) {
-            super.onInitializeAccessibilityEvent(host, event);
-            event.setClassName(ViewPager.class.getName());
-            final AccessibilityRecordCompat recordCompat =
-                    AccessibilityEventCompat.asRecord(event);
-            recordCompat.setScrollable(canScroll());
-            if (event.getEventType() == AccessibilityEventCompat.TYPE_VIEW_SCROLLED
-                    && mAdapter != null) {
-                recordCompat.setItemCount(mAdapter.getCount());
-                recordCompat.setFromIndex(mCurItem);
-                recordCompat.setToIndex(mCurItem);
-            }
-        }
-
-        @Override
-        public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfoCompat info) {
-            super.onInitializeAccessibilityNodeInfo(host, info);
-            info.setClassName(ViewPager.class.getName());
-            info.setScrollable(canScroll());
-            if (canScrollHorizontally(1)) {
-                info.addAction(AccessibilityNodeInfoCompat.ACTION_SCROLL_FORWARD);
-            }
-            if (canScrollHorizontally(-1)) {
-                info.addAction(AccessibilityNodeInfoCompat.ACTION_SCROLL_BACKWARD);
-            }
-        }
-
-        @Override
-        public boolean performAccessibilityAction(View host, int action, Bundle args) {
-            if (super.performAccessibilityAction(host, action, args)) {
-                return true;
-            }
-            switch (action) {
-                case AccessibilityNodeInfoCompat.ACTION_SCROLL_FORWARD: {
-                    if (canScrollHorizontally(1)) {
-                        setCurrentItem(mCurItem + 1);
-                        return true;
-                    }
-                } return false;
-                case AccessibilityNodeInfoCompat.ACTION_SCROLL_BACKWARD: {
-                    if (canScrollHorizontally(-1)) {
-                        setCurrentItem(mCurItem - 1);
-                        return true;
-                    }
-                } return false;
-            }
-            return false;
-        }
-
-        private boolean canScroll() {
-            return (mAdapter != null) && (mAdapter.getCount() > 1);
-        }
-    }
-
-    private class PagerObserver extends DataSetObserver {
-        @Override
-        public void onChanged() {
-            dataSetChanged();
-        }
-        @Override
-        public void onInvalidated() {
-            dataSetChanged();
-        }
-    }
-
-    /**
-     * Layout parameters that should be supplied for views added to a
-     * ViewPager.
-     */
-    public static class LayoutParams extends ViewGroup.LayoutParams {
-        /**
-         * true if this view is a decoration on the pager itself and not
-         * a view supplied by the adapter.
-         */
-        public boolean isDecor;
-
-        /**
-         * Gravity setting for use on decor views only:
-         * Where to position the view page within the overall ViewPager
-         * container; constants are defined in {@link android.view.Gravity}.
-         */
-        public int gravity;
-
-        /**
-         * Width as a 0-1 multiplier of the measured pager width
-         */
-        float widthFactor = 0.f;
-
-        /**
-         * true if this view was added during layout and needs to be measured
-         * before being positioned.
-         */
-        boolean needsMeasure;
-
-        /**
-         * Adapter position this view is for if !isDecor
-         */
-        int position;
-
-        /**
-         * Current child index within the ViewPager that this view occupies
-         */
-        int childIndex;
-
-        public LayoutParams() {
-            super(FILL_PARENT, FILL_PARENT);
-        }
-
-        public LayoutParams(Context context, AttributeSet attrs) {
-            super(context, attrs);
-
-            final TypedArray a = context.obtainStyledAttributes(attrs, LAYOUT_ATTRS);
-            gravity = a.getInteger(0, Gravity.TOP);
-            a.recycle();
-        }
-    }
-
-    static class ViewPositionComparator implements Comparator<View> {
-        @Override
-        public int compare(View lhs, View rhs) {
-            final LayoutParams llp = (LayoutParams) lhs.getLayoutParams();
-            final LayoutParams rlp = (LayoutParams) rhs.getLayoutParams();
-            if (llp.isDecor != rlp.isDecor) {
-                return llp.isDecor ? 1 : -1;
-            }
-            return llp.position - rlp.position;
-        }
-    }
-}
diff --git a/v4/java/android/support/v4/view/accessibility/AccessibilityManagerCompat.java b/v4/java/android/support/v4/view/accessibility/AccessibilityManagerCompat.java
deleted file mode 100644
index 19d893d..0000000
--- a/v4/java/android/support/v4/view/accessibility/AccessibilityManagerCompat.java
+++ /dev/null
@@ -1,218 +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 android.support.v4.view.accessibility;
-
-import android.accessibilityservice.AccessibilityServiceInfo;
-import android.os.Build;
-import android.support.v4.view.accessibility.AccessibilityManagerCompatIcs.AccessibilityStateChangeListenerBridge;
-import android.view.accessibility.AccessibilityManager;
-
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Helper for accessing features in {@link AccessibilityManager}
- * introduced after API level 4 in a backwards compatible fashion.
- */
-public final class AccessibilityManagerCompat {
-
-    interface AccessibilityManagerVersionImpl {
-        public Object newAccessiblityStateChangeListener(
-                AccessibilityStateChangeListenerCompat listener);
-        public boolean addAccessibilityStateChangeListener(AccessibilityManager manager,
-                AccessibilityStateChangeListenerCompat listener);
-        public boolean removeAccessibilityStateChangeListener(AccessibilityManager manager,
-                AccessibilityStateChangeListenerCompat listener);
-        public List<AccessibilityServiceInfo> getEnabledAccessibilityServiceList(
-                AccessibilityManager manager,int feedbackTypeFlags);
-        public List<AccessibilityServiceInfo> getInstalledAccessibilityServiceList(
-                AccessibilityManager manager);
-        public boolean isTouchExplorationEnabled(AccessibilityManager manager);
-    }
-
-    static class AccessibilityManagerStubImpl implements AccessibilityManagerVersionImpl {
-        public Object newAccessiblityStateChangeListener(
-                AccessibilityStateChangeListenerCompat listener) {
-            return null;
-        }
-
-        public boolean addAccessibilityStateChangeListener(AccessibilityManager manager,
-                AccessibilityStateChangeListenerCompat listener) {
-            return false;
-        }
-
-        public boolean removeAccessibilityStateChangeListener(AccessibilityManager manager,
-                AccessibilityStateChangeListenerCompat listener) {
-            return false;
-        }
-
-        public List<AccessibilityServiceInfo> getEnabledAccessibilityServiceList(
-                AccessibilityManager manager, int feedbackTypeFlags) {
-            return Collections.emptyList();
-        }
-
-        public List<AccessibilityServiceInfo> getInstalledAccessibilityServiceList(
-                AccessibilityManager manager) {
-            return Collections.emptyList();
-        }
-
-        public boolean isTouchExplorationEnabled(AccessibilityManager manager) {
-            return false;
-        }
-    }
-
-    static class AccessibilityManagerIcsImpl extends AccessibilityManagerStubImpl {
-        
-        @Override
-        public Object newAccessiblityStateChangeListener(
-                final AccessibilityStateChangeListenerCompat listener) {
-            return AccessibilityManagerCompatIcs.newAccessibilityStateChangeListener(
-                new AccessibilityStateChangeListenerBridge() {
-                    public void onAccessibilityStateChanged(boolean enabled) {
-                        listener.onAccessibilityStateChanged(enabled);
-                    }
-                });
-        }
-
-        @Override
-        public boolean addAccessibilityStateChangeListener(AccessibilityManager manager,
-                AccessibilityStateChangeListenerCompat listener) {
-            return AccessibilityManagerCompatIcs.addAccessibilityStateChangeListener(manager,
-                    listener.mListener);
-        }
-
-        @Override
-        public boolean removeAccessibilityStateChangeListener(AccessibilityManager manager,
-                final AccessibilityStateChangeListenerCompat listener) {
-            return AccessibilityManagerCompatIcs.removeAccessibilityStateChangeListener(manager,
-                    listener.mListener);
-        }
-
-        @Override
-        public List<AccessibilityServiceInfo> getEnabledAccessibilityServiceList(
-                AccessibilityManager manager, int feedbackTypeFlags) {
-            return AccessibilityManagerCompatIcs.getEnabledAccessibilityServiceList(manager,
-                    feedbackTypeFlags);
-        }
-
-        @Override
-        public List<AccessibilityServiceInfo> getInstalledAccessibilityServiceList(
-                AccessibilityManager manager) {
-            return AccessibilityManagerCompatIcs.getInstalledAccessibilityServiceList(manager);
-        }
-
-        @Override
-        public boolean isTouchExplorationEnabled(AccessibilityManager manager) {
-            return AccessibilityManagerCompatIcs.isTouchExplorationEnabled(manager);
-        }
-    }
-
-    static {
-        if (Build.VERSION.SDK_INT >= 14) { // ICS
-            IMPL = new AccessibilityManagerIcsImpl();
-        } else {
-            IMPL = new AccessibilityManagerStubImpl();
-        }
-    }
-
-    private static final AccessibilityManagerVersionImpl IMPL;
-
-    /**
-     * Registers an {@link AccessibilityManager.AccessibilityStateChangeListener} for changes in
-     * the global accessibility state of the system.
-     *
-     * @param manager The accessibility manager.
-     * @param listener The listener.
-     * @return True if successfully registered.
-     */
-    public static boolean addAccessibilityStateChangeListener(AccessibilityManager manager,
-            AccessibilityStateChangeListenerCompat listener) {
-        return IMPL.addAccessibilityStateChangeListener(manager, listener);
-    }
-
-    /**
-     * Unregisters an {@link AccessibilityManager.AccessibilityStateChangeListener}.
-     *
-     * @param manager The accessibility manager.
-     * @param listener The listener.
-     * @return True if successfully unregistered.
-     */
-    public static boolean removeAccessibilityStateChangeListener(AccessibilityManager manager,
-            AccessibilityStateChangeListenerCompat listener) {
-        return IMPL.removeAccessibilityStateChangeListener(manager, listener);
-    }
-
-    /**
-     * Returns the {@link AccessibilityServiceInfo}s of the installed accessibility services.
-     *
-     * @param manager The accessibility manager.
-     * @return An unmodifiable list with {@link AccessibilityServiceInfo}s.
-     */
-    public static List<AccessibilityServiceInfo> getInstalledAccessibilityServiceList(
-            AccessibilityManager manager) {
-        return IMPL.getInstalledAccessibilityServiceList(manager);
-    }
-
-    /**
-     * Returns the {@link AccessibilityServiceInfo}s of the enabled accessibility services
-     * for a given feedback type.
-     *
-     * @param manager The accessibility manager.
-     * @param feedbackTypeFlags The feedback type flags.
-     * @return An unmodifiable list with {@link AccessibilityServiceInfo}s.
-     *
-     * @see AccessibilityServiceInfo#FEEDBACK_AUDIBLE
-     * @see AccessibilityServiceInfo#FEEDBACK_GENERIC
-     * @see AccessibilityServiceInfo#FEEDBACK_HAPTIC
-     * @see AccessibilityServiceInfo#FEEDBACK_SPOKEN
-     * @see AccessibilityServiceInfo#FEEDBACK_VISUAL
-     */
-    public static List<AccessibilityServiceInfo> getEnabledAccessibilityServiceList(
-            AccessibilityManager manager, int feedbackTypeFlags) {
-        return IMPL.getEnabledAccessibilityServiceList(manager, feedbackTypeFlags);
-    }
-
-    /**
-     * Returns if the touch exploration in the system is enabled.
-     *
-     * @param manager The accessibility manager.
-     * @return True if touch exploration is enabled, false otherwise.
-     */
-    public static boolean isTouchExplorationEnabled(AccessibilityManager manager) {
-        return IMPL.isTouchExplorationEnabled(manager);
-    }
-
-    /**
-     * Listener for the accessibility state.
-     */
-    public static abstract class AccessibilityStateChangeListenerCompat {
-        final Object mListener;
-
-        public AccessibilityStateChangeListenerCompat() {
-            mListener = IMPL.newAccessiblityStateChangeListener(this);
-        }
-
-        /**
-         * Called back on change in the accessibility state.
-         *
-         * @param enabled Whether accessibility is enabled.
-         */
-        public abstract void onAccessibilityStateChanged(boolean enabled);
-    }
-
-    private AccessibilityManagerCompat() {}
-}
diff --git a/v4/java/android/support/v4/view/accessibility/AccessibilityNodeInfoCompat.java b/v4/java/android/support/v4/view/accessibility/AccessibilityNodeInfoCompat.java
deleted file mode 100644
index 5bd94e4..0000000
--- a/v4/java/android/support/v4/view/accessibility/AccessibilityNodeInfoCompat.java
+++ /dev/null
@@ -1,4047 +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 android.support.v4.view.accessibility;
-
-import android.graphics.Rect;
-import android.os.Build;
-import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.support.v4.accessibilityservice.AccessibilityServiceInfoCompat;
-import android.support.v4.view.ViewCompat;
-import android.text.InputType;
-import android.view.View;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Helper for accessing {@link android.view.accessibility.AccessibilityNodeInfo}
- * introduced after API level 4 in a backwards compatible fashion.
- */
-public class AccessibilityNodeInfoCompat {
-
-    public static class AccessibilityActionCompat {
-
-        /**
-         * Action that gives input focus to the node.
-         */
-        public static final AccessibilityActionCompat ACTION_FOCUS =
-                new AccessibilityActionCompat(
-                        AccessibilityNodeInfoCompat.ACTION_FOCUS, null);
-
-        /**
-         * Action that clears input focus of the node.
-         */
-        public static final AccessibilityActionCompat ACTION_CLEAR_FOCUS =
-                new AccessibilityActionCompat(
-                        AccessibilityNodeInfoCompat.ACTION_CLEAR_FOCUS, null);
-
-        /**
-         *  Action that selects the node.
-         */
-        public static final AccessibilityActionCompat ACTION_SELECT =
-                new AccessibilityActionCompat(
-                        AccessibilityNodeInfoCompat.ACTION_SELECT, null);
-
-        /**
-         * Action that deselects the node.
-         */
-        public static final AccessibilityActionCompat ACTION_CLEAR_SELECTION =
-                new AccessibilityActionCompat(
-                        AccessibilityNodeInfoCompat.ACTION_CLEAR_SELECTION, null);
-
-        /**
-         * Action that clicks on the node info.
-         */
-        public static final AccessibilityActionCompat ACTION_CLICK =
-                new AccessibilityActionCompat(
-                        AccessibilityNodeInfoCompat.ACTION_CLICK, null);
-
-        /**
-         * Action that long clicks on the node.
-         */
-        public static final AccessibilityActionCompat ACTION_LONG_CLICK =
-                new AccessibilityActionCompat(
-                        AccessibilityNodeInfoCompat.ACTION_LONG_CLICK, null);
-
-        /**
-         * Action that gives accessibility focus to the node.
-         */
-        public static final AccessibilityActionCompat ACTION_ACCESSIBILITY_FOCUS =
-                new AccessibilityActionCompat(
-                        AccessibilityNodeInfoCompat.ACTION_ACCESSIBILITY_FOCUS, null);
-
-        /**
-         * Action that clears accessibility focus of the node.
-         */
-        public static final AccessibilityActionCompat ACTION_CLEAR_ACCESSIBILITY_FOCUS =
-                new AccessibilityActionCompat(
-                        AccessibilityNodeInfoCompat.ACTION_CLEAR_ACCESSIBILITY_FOCUS, null);
-
-        /**
-         * Action that requests to go to the next entity in this node's text
-         * at a given movement granularity. For example, move to the next character,
-         * word, etc.
-         * <p>
-         * <strong>Arguments:</strong>
-         * {@link AccessibilityNodeInfoCompat#ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT
-         *  AccessibilityNodeInfoCompat.ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT},
-         * {@link AccessibilityNodeInfoCompat#ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN
-         *  AccessibilityNodeInfoCompat.ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN}<br>
-         * <strong>Example:</strong> Move to the previous character and do not extend selection.
-         * <code><pre><p>
-         *   Bundle arguments = new Bundle();
-         *   arguments.putInt(AccessibilityNodeInfoCompat.ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT,
-         *           AccessibilityNodeInfoCompat.MOVEMENT_GRANULARITY_CHARACTER);
-         *   arguments.putBoolean(
-         *           AccessibilityNodeInfoCompat.ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN, false);
-         *   info.performAction(
-         *           AccessibilityActionCompat.ACTION_NEXT_AT_MOVEMENT_GRANULARITY.getId(),
-         *           arguments);
-         * </code></pre></p>
-         * </p>
-         *
-         * @see AccessibilityNodeInfoCompat#ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT
-         *  AccessibilityNodeInfoCompat.ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT
-         * @see AccessibilityNodeInfoCompat#ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN
-         *  AccessibilityNodeInfoCompat.ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN
-         *
-         * @see AccessibilityNodeInfoCompat#setMovementGranularities(int)
-         *  AccessibilityNodeInfoCompat.ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN
-         * @see AccessibilityNodeInfoCompat#getMovementGranularities()
-         *  AccessibilityNodeInfoCompat.getMovementGranularities()
-         *
-         * @see AccessibilityNodeInfoCompat#MOVEMENT_GRANULARITY_CHARACTER
-         *  AccessibilityNodeInfoCompat.MOVEMENT_GRANULARITY_CHARACTER
-         * @see AccessibilityNodeInfoCompat#MOVEMENT_GRANULARITY_WORD
-         *  AccessibilityNodeInfoCompat.MOVEMENT_GRANULARITY_WORD
-         * @see AccessibilityNodeInfoCompat#MOVEMENT_GRANULARITY_LINE
-         *  AccessibilityNodeInfoCompat.MOVEMENT_GRANULARITY_LINE
-         * @see AccessibilityNodeInfoCompat#MOVEMENT_GRANULARITY_PARAGRAPH
-         *  AccessibilityNodeInfoCompat.MOVEMENT_GRANULARITY_PARAGRAPH
-         * @see AccessibilityNodeInfoCompat#MOVEMENT_GRANULARITY_PAGE
-         *  AccessibilityNodeInfoCompat.MOVEMENT_GRANULARITY_PAGE
-         */
-        public static final AccessibilityActionCompat ACTION_NEXT_AT_MOVEMENT_GRANULARITY =
-                new AccessibilityActionCompat(
-                        AccessibilityNodeInfoCompat.ACTION_NEXT_AT_MOVEMENT_GRANULARITY, null);
-
-        /**
-         * Action that requests to go to the previous entity in this node's text
-         * at a given movement granularity. For example, move to the next character,
-         * word, etc.
-         * <p>
-         * <strong>Arguments:</strong>
-         * {@link AccessibilityNodeInfoCompat#ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT
-         *  AccessibilityNodeInfoCompat.ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT},
-         * {@link AccessibilityNodeInfoCompat#ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN
-         *  AccessibilityNodeInfoCompat.ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN}<br>
-         * <strong>Example:</strong> Move to the next character and do not extend selection.
-         * <code><pre><p>
-         *   Bundle arguments = new Bundle();
-         *   arguments.putInt(AccessibilityNodeInfoCompat.ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT,
-         *           AccessibilityNodeInfoCompat.MOVEMENT_GRANULARITY_CHARACTER);
-         *   arguments.putBoolean(
-         *           AccessibilityNodeInfoCompat.ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN, false);
-         *   info.performAction(
-         *           AccessibilityActionCompat.ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY.getId(),
-         *           arguments);
-         * </code></pre></p>
-         * </p>
-         *
-         * @see AccessibilityNodeInfoCompat#ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT
-         *  AccessibilityNodeInfoCompat.ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT
-         * @see AccessibilityNodeInfoCompat#ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN
-         *  AccessibilityNodeInfoCompat.ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN
-         *
-         * @see AccessibilityNodeInfoCompat#setMovementGranularities(int)
-         *   AccessibilityNodeInfoCompat.setMovementGranularities(int)
-         * @see AccessibilityNodeInfoCompat#getMovementGranularities()
-         *  AccessibilityNodeInfoCompat.getMovementGranularities()
-         *
-         * @see AccessibilityNodeInfoCompat#MOVEMENT_GRANULARITY_CHARACTER
-         *  AccessibilityNodeInfoCompat.MOVEMENT_GRANULARITY_CHARACTER
-         * @see AccessibilityNodeInfoCompat#MOVEMENT_GRANULARITY_WORD
-         *  AccessibilityNodeInfoCompat.MOVEMENT_GRANULARITY_WORD
-         * @see AccessibilityNodeInfoCompat#MOVEMENT_GRANULARITY_LINE
-         *  AccessibilityNodeInfoCompat.MOVEMENT_GRANULARITY_LINE
-         * @see AccessibilityNodeInfoCompat#MOVEMENT_GRANULARITY_PARAGRAPH
-         *  AccessibilityNodeInfoCompat.MOVEMENT_GRANULARITY_PARAGRAPH
-         * @see AccessibilityNodeInfoCompat#MOVEMENT_GRANULARITY_PAGE
-         *  AccessibilityNodeInfoCompat.MOVEMENT_GRANULARITY_PAGE
-         */
-        public static final AccessibilityActionCompat ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY =
-                new AccessibilityActionCompat(
-                        AccessibilityNodeInfoCompat.ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY, null);
-
-        /**
-         * Action to move to the next HTML element of a given type. For example, move
-         * to the BUTTON, INPUT, TABLE, etc.
-         * <p>
-         * <strong>Arguments:</strong>
-         * {@link AccessibilityNodeInfoCompat#ACTION_ARGUMENT_HTML_ELEMENT_STRING
-         *  AccessibilityNodeInfoCompat.ACTION_ARGUMENT_HTML_ELEMENT_STRING}<br>
-         * <strong>Example:</strong>
-         * <code><pre><p>
-         *   Bundle arguments = new Bundle();
-         *   arguments.putString(
-         *           AccessibilityNodeInfoCompat.ACTION_ARGUMENT_HTML_ELEMENT_STRING, "BUTTON");
-         *   info.performAction(
-         *           AccessibilityActionCompat.ACTION_NEXT_HTML_ELEMENT.getId(), arguments);
-         * </code></pre></p>
-         * </p>
-         */
-        public static final AccessibilityActionCompat ACTION_NEXT_HTML_ELEMENT =
-                new AccessibilityActionCompat(
-                        AccessibilityNodeInfoCompat.ACTION_NEXT_HTML_ELEMENT, null);
-
-        /**
-         * Action to move to the previous HTML element of a given type. For example, move
-         * to the BUTTON, INPUT, TABLE, etc.
-         * <p>
-         * <strong>Arguments:</strong>
-         * {@link AccessibilityNodeInfoCompat#ACTION_ARGUMENT_HTML_ELEMENT_STRING
-         *  AccessibilityNodeInfoCompat.ACTION_ARGUMENT_HTML_ELEMENT_STRING}<br>
-         * <strong>Example:</strong>
-         * <code><pre><p>
-         *   Bundle arguments = new Bundle();
-         *   arguments.putString(
-         *           AccessibilityNodeInfoCompat.ACTION_ARGUMENT_HTML_ELEMENT_STRING, "BUTTON");
-         *   info.performAction(
-         *           AccessibilityActionCompat.ACTION_PREVIOUS_HTML_ELEMENT.getId(), arguments);
-         * </code></pre></p>
-         * </p>
-         */
-        public static final AccessibilityActionCompat ACTION_PREVIOUS_HTML_ELEMENT =
-                new AccessibilityActionCompat(
-                        AccessibilityNodeInfoCompat.ACTION_PREVIOUS_HTML_ELEMENT, null);
-
-        /**
-         * Action to scroll the node content forward.
-         */
-        public static final AccessibilityActionCompat ACTION_SCROLL_FORWARD =
-                new AccessibilityActionCompat(
-                        AccessibilityNodeInfoCompat.ACTION_SCROLL_FORWARD, null);
-
-        /**
-         * Action to scroll the node content backward.
-         */
-        public static final AccessibilityActionCompat ACTION_SCROLL_BACKWARD =
-                new AccessibilityActionCompat(
-                        AccessibilityNodeInfoCompat.ACTION_SCROLL_BACKWARD, null);
-
-        /**
-         * Action to copy the current selection to the clipboard.
-         */
-        public static final AccessibilityActionCompat ACTION_COPY =
-                new AccessibilityActionCompat(
-                        AccessibilityNodeInfoCompat.ACTION_COPY, null);
-
-        /**
-         * Action to paste the current clipboard content.
-         */
-        public static final AccessibilityActionCompat ACTION_PASTE =
-                new AccessibilityActionCompat(
-                        AccessibilityNodeInfoCompat.ACTION_PASTE, null);
-
-        /**
-         * Action to cut the current selection and place it to the clipboard.
-         */
-        public static final AccessibilityActionCompat ACTION_CUT =
-                new AccessibilityActionCompat(
-                        AccessibilityNodeInfoCompat.ACTION_CUT, null);
-
-        /**
-         * Action to set the selection. Performing this action with no arguments
-         * clears the selection.
-         * <p>
-         * <strong>Arguments:</strong>
-         * {@link AccessibilityNodeInfoCompat#ACTION_ARGUMENT_SELECTION_START_INT
-         *  AccessibilityNodeInfoCompat.ACTION_ARGUMENT_SELECTION_START_INT},
-         * {@link AccessibilityNodeInfoCompat#ACTION_ARGUMENT_SELECTION_END_INT
-         *  AccessibilityNodeInfoCompat.ACTION_ARGUMENT_SELECTION_END_INT}<br>
-         * <strong>Example:</strong>
-         * <code><pre><p>
-         *   Bundle arguments = new Bundle();
-         *   arguments.putInt(AccessibilityNodeInfoCompat.ACTION_ARGUMENT_SELECTION_START_INT, 1);
-         *   arguments.putInt(AccessibilityNodeInfoCompat.ACTION_ARGUMENT_SELECTION_END_INT, 2);
-         *   info.performAction(AccessibilityActionCompat.ACTION_SET_SELECTION.getId(), arguments);
-         * </code></pre></p>
-         * </p>
-         *
-         * @see AccessibilityNodeInfoCompat#ACTION_ARGUMENT_SELECTION_START_INT
-         *  AccessibilityNodeInfoCompat.ACTION_ARGUMENT_SELECTION_START_INT
-         * @see AccessibilityNodeInfoCompat#ACTION_ARGUMENT_SELECTION_END_INT
-         *  AccessibilityNodeInfoCompat.ACTION_ARGUMENT_SELECTION_END_INT
-         */
-        public static final AccessibilityActionCompat ACTION_SET_SELECTION =
-                new AccessibilityActionCompat(
-                        AccessibilityNodeInfoCompat.ACTION_SET_SELECTION, null);
-
-        /**
-         * Action to expand an expandable node.
-         */
-        public static final AccessibilityActionCompat ACTION_EXPAND =
-                new AccessibilityActionCompat(
-                        AccessibilityNodeInfoCompat.ACTION_EXPAND, null);
-
-        /**
-         * Action to collapse an expandable node.
-         */
-        public static final AccessibilityActionCompat ACTION_COLLAPSE =
-                new AccessibilityActionCompat(
-                        AccessibilityNodeInfoCompat.ACTION_COLLAPSE, null);
-
-        /**
-         * Action to dismiss a dismissable node.
-         */
-        public static final AccessibilityActionCompat ACTION_DISMISS =
-                new AccessibilityActionCompat(
-                        AccessibilityNodeInfoCompat.ACTION_DISMISS, null);
-
-        /**
-         * Action that sets the text of the node. Performing the action without argument,
-         * using <code> null</code> or empty {@link CharSequence} will clear the text. This
-         * action will also put the cursor at the end of text.
-         * <p>
-         * <strong>Arguments:</strong>
-         * {@link AccessibilityNodeInfoCompat#ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE
-         *  AccessibilityNodeInfoCompat.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE}<br>
-         * <strong>Example:</strong>
-         * <code><pre><p>
-         *   Bundle arguments = new Bundle();
-         *   arguments.putCharSequence(AccessibilityNodeInfoCompat.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE,
-         *       "android");
-         *   info.performAction(AccessibilityActionCompat.ACTION_SET_TEXT.getId(), arguments);
-         * </code></pre></p>
-         */
-        public static final AccessibilityActionCompat ACTION_SET_TEXT =
-                new AccessibilityActionCompat(
-                        AccessibilityNodeInfoCompat.ACTION_SET_TEXT, null);
-
-        private final Object mAction;
-
-        /**
-         * Creates a new instance.
-         *
-         * @param actionId The action id.
-         * @param label The action label.
-         */
-        public AccessibilityActionCompat(int actionId, CharSequence label) {
-            this(IMPL.newAccessibilityAction(actionId, label));
-        }
-
-        private AccessibilityActionCompat(Object action) {
-            mAction = action;
-        }
-
-        /**
-         * Gets the id for this action.
-         *
-         * @return The action id.
-         */
-        public int getId() {
-            return IMPL.getAccessibilityActionId(mAction);
-        }
-
-        /**
-         * Gets the label for this action. Its purpose is to describe the
-         * action to user.
-         *
-         * @return The label.
-         */
-        public CharSequence getLabel() {
-            return IMPL.getAccessibilityActionLabel(mAction);
-        }
-    }
-
-    public static class CollectionInfoCompat {
-        /** Selection mode where items are not selectable. */
-        public static final int SELECTION_MODE_NONE = 0;
-
-        /** Selection mode where a single item may be selected. */
-        public static final int SELECTION_MODE_SINGLE = 1;
-
-        /** Selection mode where multiple items may be selected. */
-        public static final int SELECTION_MODE_MULTIPLE = 2;
-
-        final Object mInfo;
-
-        /**
-         * Returns a cached instance if such is available otherwise a new one.
-         *
-         * @return An instance.
-         */
-        public static CollectionInfoCompat obtain(int rowCount, int columnCount,
-                boolean hierarchical, int selectionMode) {
-            return new CollectionInfoCompat(IMPL.obtainCollectionInfo(rowCount, columnCount,
-                    hierarchical, selectionMode));
-        }
-
-        private CollectionInfoCompat(Object info) {
-            mInfo = info;
-        }
-
-        public int getColumnCount() {
-            return IMPL.getCollectionInfoColumnCount(mInfo);
-        }
-
-        public int getRowCount() {
-            return IMPL.getCollectionInfoRowCount(mInfo);
-        }
-
-        public boolean isHierarchical() {
-            return IMPL.isCollectionInfoHierarchical(mInfo);
-        }
-    }
-
-    public static class CollectionItemInfoCompat {
-
-        private final Object mInfo;
-
-        /**
-         * Returns a cached instance if such is available otherwise a new one.
-         *
-         * @return An instance.
-         */
-        public static CollectionItemInfoCompat obtain(int rowIndex, int rowSpan,
-                int columnIndex, int columnSpan, boolean heading, boolean selected) {
-            return new CollectionItemInfoCompat(IMPL.obtainCollectionItemInfo(rowIndex, rowSpan,
-                    columnIndex, columnSpan, heading, selected));
-        }
-
-        private CollectionItemInfoCompat(Object info) {
-            mInfo = info;
-        }
-
-        public int getColumnIndex() {
-            return IMPL.getCollectionItemColumnIndex(mInfo);
-        }
-
-        public int getColumnSpan() {
-            return IMPL.getCollectionItemColumnSpan(mInfo);
-        }
-
-        public int getRowIndex() {
-            return IMPL.getCollectionItemRowIndex(mInfo);
-        }
-
-        public int getRowSpan() {
-            return IMPL.getCollectionItemRowSpan(mInfo);
-        }
-
-        public boolean isHeading() {
-            return IMPL.isCollectionItemHeading(mInfo);
-        }
-
-        public boolean isSelected() {
-            return IMPL.isCollectionItemSelected(mInfo);
-        }
-    }
-
-    public static class RangeInfoCompat {
-        /** Range type: integer. */
-        public static final int RANGE_TYPE_INT = 0;
-        /** Range type: float. */
-        public static final int RANGE_TYPE_FLOAT = 1;
-        /** Range type: percent with values from zero to one.*/
-        public static final int RANGE_TYPE_PERCENT = 2;
-
-        private final Object mInfo;
-
-        private RangeInfoCompat(Object info) {
-            mInfo = info;
-        }
-
-        public float getCurrent() {
-            return AccessibilityNodeInfoCompatKitKat.RangeInfo.getCurrent(mInfo);
-        }
-
-        public float getMax() {
-            return AccessibilityNodeInfoCompatKitKat.RangeInfo.getMax(mInfo);
-        }
-
-        public float getMin() {
-            return AccessibilityNodeInfoCompatKitKat.RangeInfo.getMin(mInfo);
-        }
-
-        public int getType() {
-            return AccessibilityNodeInfoCompatKitKat.RangeInfo.getType(mInfo);
-        }
-    }
-
-    static interface AccessibilityNodeInfoImpl {
-        public Object newAccessibilityAction(int actionId, CharSequence label);
-        public Object obtain();
-        public Object obtain(View source);
-        public Object obtain(Object info);
-        public Object obtain(View root, int virtualDescendantId);
-        public void setSource(Object info, View source);
-        public void setSource(Object info, View root, int virtualDescendantId);
-        public Object findFocus(Object info, int focus);
-        public Object focusSearch(Object info, int direction);
-        public int getWindowId(Object info);
-        public int getChildCount(Object info);
-        public Object getChild(Object info, int index);
-        public void addChild(Object info, View child);
-        public void addChild(Object info, View child, int virtualDescendantId);
-        public boolean removeChild(Object info, View child);
-        public boolean removeChild(Object info, View root, int virtualDescendantId);
-        public int getActions(Object info);
-        public void addAction(Object info, int action);
-        public void addAction(Object info, Object action);
-        public boolean removeAction(Object info, Object action);
-        public int getAccessibilityActionId(Object action);
-        public CharSequence getAccessibilityActionLabel(Object action);
-        public boolean performAction(Object info, int action);
-        public boolean performAction(Object info, int action, Bundle arguments);
-        public void setMovementGranularities(Object info, int granularities);
-        public int getMovementGranularities(Object info);
-        public List<Object> findAccessibilityNodeInfosByText(Object info, String text);
-        public Object getParent(Object info);
-        public void setParent(Object info, View root, int virtualDescendantId);
-        public void setParent(Object info, View parent);
-        public void getBoundsInParent(Object info, Rect outBounds);
-        public void setBoundsInParent(Object info, Rect bounds);
-        public void getBoundsInScreen(Object info, Rect outBounds);
-        public void setBoundsInScreen(Object info, Rect bounds);
-        public boolean isCheckable(Object info);
-        public void setCheckable(Object info, boolean checkable);
-        public boolean isChecked(Object info);
-        public void setChecked(Object info, boolean checked);
-        public boolean isFocusable(Object info);
-        public void setFocusable(Object info, boolean focusable);
-        public boolean isFocused(Object info);
-        public void setFocused(Object info, boolean focused);
-        public boolean isVisibleToUser(Object info);
-        public void setVisibleToUser(Object info, boolean visibleToUser);
-        public boolean isAccessibilityFocused(Object info);
-        public void setAccessibilityFocused(Object info, boolean focused);
-        public boolean isSelected(Object info);
-        public void setSelected(Object info, boolean selected);
-        public boolean isClickable(Object info);
-        public void setClickable(Object info, boolean clickable);
-        public boolean isLongClickable(Object info);
-        public void setLongClickable(Object info, boolean longClickable);
-        public boolean isEnabled(Object info);
-        public void setEnabled(Object info, boolean enabled);
-        public boolean isPassword(Object info);
-        public void setPassword(Object info, boolean password);
-        public boolean isScrollable(Object info);
-        public void setScrollable(Object info, boolean scrollable);
-        public CharSequence getPackageName(Object info);
-        public void setPackageName(Object info, CharSequence packageName);
-        public CharSequence getClassName(Object info);
-        public void setClassName(Object info, CharSequence className);
-        public CharSequence getText(Object info);
-        public void setText(Object info, CharSequence text);
-        public CharSequence getContentDescription(Object info);
-        public void setContentDescription(Object info, CharSequence contentDescription);
-        public void recycle(Object info);
-        public String getViewIdResourceName(Object info);
-        public void setViewIdResourceName(Object info, String viewId);
-        public int getLiveRegion(Object info);
-        public void setLiveRegion(Object info, int mode);
-        public Object getCollectionInfo(Object info);
-        public void setCollectionInfo(Object info, Object collectionInfo);
-        public Object getCollectionItemInfo(Object info);
-        public void setCollectionItemInfo(Object info, Object collectionItemInfo);
-        public Object getRangeInfo(Object info);
-        public void setRangeInfo(Object info, Object rangeInfo);
-        public List<Object> getActionList(Object info);
-        public Object obtainCollectionInfo(int rowCount, int columnCount, boolean hierarchical,
-                int selectionMode);
-        public int getCollectionInfoColumnCount(Object info);
-        public int getCollectionInfoRowCount(Object info);
-        public boolean isCollectionInfoHierarchical(Object info);
-        public Object obtainCollectionItemInfo(int rowIndex, int rowSpan, int columnIndex,
-                int columnSpan, boolean heading, boolean selected);
-        public int getCollectionItemColumnIndex(Object info);
-        public int getCollectionItemColumnSpan(Object info);
-        public int getCollectionItemRowIndex(Object info);
-        public int getCollectionItemRowSpan(Object info);
-        public boolean isCollectionItemHeading(Object info);
-        public boolean isCollectionItemSelected(Object info);
-        public Object getTraversalBefore(Object info);
-        public void setTraversalBefore(Object info, View view);
-        public void setTraversalBefore(Object info, View root, int virtualDescendantId);
-        public Object getTraversalAfter(Object info);
-        public void setTraversalAfter(Object info, View view);
-        public void setTraversalAfter(Object info, View root, int virtualDescendantId);
-        public void setContentInvalid(Object info, boolean contentInvalid);
-        public boolean isContentInvalid(Object info);
-        public void setError(Object info, CharSequence error);
-        public CharSequence getError(Object info);
-        public void setLabelFor(Object info, View labeled);
-        public void setLabelFor(Object info, View root, int virtualDescendantId);
-        public Object getLabelFor(Object info);
-        public void setLabeledBy(Object info, View labeled);
-        public void setLabeledBy(Object info, View root, int virtualDescendantId);
-        public Object getLabeledBy(Object info);
-        public boolean canOpenPopup(Object info);
-        public void setCanOpenPopup(Object info, boolean opensPopup);
-        public List<Object> findAccessibilityNodeInfosByViewId(Object info, String viewId);
-        public Bundle getExtras(Object info);
-        public int getInputType(Object info);
-        public void setInputType(Object info, int inputType);
-        public void setMaxTextLength(Object info, int max);
-        public int getMaxTextLength(Object info);
-        public void setTextSelection(Object info, int start, int end);
-        public int getTextSelectionStart(Object info);
-        public int getTextSelectionEnd(Object info);
-        public Object getWindow(Object info);
-        public boolean isDismissable(Object info);
-        public void setDismissable(Object info, boolean dismissable);
-        public boolean isEditable(Object info);
-        public void setEditable(Object info, boolean editable);
-        public int getDrawingOrder(Object info);
-        public void setDrawingOrder(Object info, int drawingOrderInParent);
-        public boolean isImportantForAccessibility(Object info);
-        public void setImportantForAccessibility(Object info, boolean importantForAccessibility);
-        public boolean isMultiLine(Object info);
-        public void setMultiLine(Object info, boolean multiLine);
-        public boolean refresh(Object info);
-        public CharSequence getRoleDescription(Object info);
-        public void setRoleDescription(Object info, CharSequence roleDescription);
-    }
-
-    static class AccessibilityNodeInfoStubImpl implements AccessibilityNodeInfoImpl {
-        @Override
-        public Object newAccessibilityAction(int actionId, CharSequence label) {
-            return null;
-        }
-
-        @Override
-        public Object obtain() {
-            return null;
-        }
-
-        @Override
-        public Object obtain(View source) {
-            return null;
-        }
-
-        @Override
-        public Object obtain(View root, int virtualDescendantId) {
-            return null;
-        }
-
-        @Override
-        public Object obtain(Object info) {
-            return null;
-        }
-
-        @Override
-        public void addAction(Object info, int action) {
-
-        }
-
-        @Override
-        public void addAction(Object info, Object action) {
-
-        }
-
-        @Override
-        public boolean removeAction(Object info, Object action) {
-            return false;
-        }
-
-        @Override
-        public int getAccessibilityActionId(Object action) {
-            return 0;
-        }
-
-        @Override
-        public CharSequence getAccessibilityActionLabel(Object action) {
-            return null;
-        }
-
-        @Override
-        public void addChild(Object info, View child) {
-
-        }
-
-        @Override
-        public void addChild(Object info, View child, int virtualDescendantId) {
-
-        }
-
-        @Override
-        public boolean removeChild(Object info, View child) {
-            return false;
-        }
-
-        @Override
-        public boolean removeChild(Object info, View root, int virtualDescendantId) {
-            return false;
-        }
-
-        @Override
-        public List<Object> findAccessibilityNodeInfosByText(Object info, String text) {
-            return Collections.emptyList();
-        }
-
-        @Override
-        public int getActions(Object info) {
-            return 0;
-        }
-
-        @Override
-        public void getBoundsInParent(Object info, Rect outBounds) {
-
-        }
-
-        @Override
-        public void getBoundsInScreen(Object info, Rect outBounds) {
-
-        }
-
-        @Override
-        public Object getChild(Object info, int index) {
-            return null;
-        }
-
-        @Override
-        public int getChildCount(Object info) {
-            return 0;
-        }
-
-        @Override
-        public CharSequence getClassName(Object info) {
-            return null;
-        }
-
-        @Override
-        public CharSequence getContentDescription(Object info) {
-            return null;
-        }
-
-        @Override
-        public CharSequence getPackageName(Object info) {
-            return null;
-        }
-
-        @Override
-        public Object getParent(Object info) {
-            return null;
-        }
-
-        @Override
-        public CharSequence getText(Object info) {
-            return null;
-        }
-
-        @Override
-        public int getWindowId(Object info) {
-            return 0;
-        }
-
-        @Override
-        public boolean isCheckable(Object info) {
-            return false;
-        }
-
-        @Override
-        public boolean isChecked(Object info) {
-            return false;
-        }
-
-        @Override
-        public boolean isClickable(Object info) {
-            return false;
-        }
-
-        @Override
-        public boolean isEnabled(Object info) {
-            return false;
-        }
-
-        @Override
-        public boolean isFocusable(Object info) {
-            return false;
-        }
-
-        @Override
-        public boolean isFocused(Object info) {
-            return false;
-        }
-
-        @Override
-        public boolean isVisibleToUser(Object info) {
-            return false;
-        }
-
-        @Override
-        public boolean isAccessibilityFocused(Object info) {
-            return false;
-        }
-
-        @Override
-        public boolean isLongClickable(Object info) {
-            return false;
-        }
-
-        @Override
-        public boolean isPassword(Object info) {
-            return false;
-        }
-
-        @Override
-        public boolean isScrollable(Object info) {
-            return false;
-        }
-
-        @Override
-        public boolean isSelected(Object info) {
-            return false;
-        }
-
-        @Override
-        public boolean performAction(Object info, int action) {
-            return false;
-        }
-
-        @Override
-        public boolean performAction(Object info, int action, Bundle arguments) {
-            return false;
-        }
-
-        @Override
-        public void setMovementGranularities(Object info, int granularities) {
-
-        }
-
-        @Override
-        public int getMovementGranularities(Object info) {
-            return 0;
-        }
-
-        @Override
-        public void setBoundsInParent(Object info, Rect bounds) {
-
-        }
-
-        @Override
-        public void setBoundsInScreen(Object info, Rect bounds) {
-
-        }
-
-        @Override
-        public void setCheckable(Object info, boolean checkable) {
-
-        }
-
-        @Override
-        public void setChecked(Object info, boolean checked) {
-
-        }
-
-        @Override
-        public void setClassName(Object info, CharSequence className) {
-
-        }
-
-        @Override
-        public void setClickable(Object info, boolean clickable) {
-
-        }
-
-        @Override
-        public void setContentDescription(Object info, CharSequence contentDescription) {
-
-        }
-
-        @Override
-        public void setEnabled(Object info, boolean enabled) {
-
-        }
-
-        @Override
-        public void setFocusable(Object info, boolean focusable) {
-
-        }
-
-        @Override
-        public void setFocused(Object info, boolean focused) {
-
-        }
-
-        @Override
-        public void setVisibleToUser(Object info, boolean visibleToUser) {
-
-        }
-
-        @Override
-        public void setAccessibilityFocused(Object info, boolean focused) {
-
-        }
-
-        @Override
-        public void setLongClickable(Object info, boolean longClickable) {
-
-        }
-
-        @Override
-        public void setPackageName(Object info, CharSequence packageName) {
-
-        }
-
-        @Override
-        public void setParent(Object info, View parent) {
-
-        }
-
-        @Override
-        public void setPassword(Object info, boolean password) {
-
-        }
-
-        @Override
-        public void setScrollable(Object info, boolean scrollable) {
-
-        }
-
-        @Override
-        public void setSelected(Object info, boolean selected) {
-
-        }
-
-        @Override
-        public void setSource(Object info, View source) {
-
-        }
-
-        @Override
-        public void setSource(Object info, View root, int virtualDescendantId) {
-
-        }
-
-        @Override
-        public Object findFocus(Object info, int focus) {
-            return null;
-        }
-
-        @Override
-        public Object focusSearch(Object info, int direction) {
-            return null;
-        }
-
-        @Override
-        public void setText(Object info, CharSequence text) {
-
-        }
-
-        @Override
-        public void recycle(Object info) {
-
-        }
-
-        @Override
-        public void setParent(Object info, View root, int virtualDescendantId) {
-
-        }
-
-        @Override
-        public String getViewIdResourceName(Object info) {
-            return null;
-        }
-
-        @Override
-        public void setViewIdResourceName(Object info, String viewId) {
-
-        }
-
-        @Override
-        public int getLiveRegion(Object info) {
-            return ViewCompat.ACCESSIBILITY_LIVE_REGION_NONE;
-        }
-
-        @Override
-        public void setLiveRegion(Object info, int mode) {
-            // No-op
-        }
-
-        @Override
-        public Object getCollectionInfo(Object info) {
-            return null;
-        }
-
-        @Override
-        public void setCollectionInfo(Object info, Object collectionInfo) {
-        }
-
-        @Override
-        public Object getCollectionItemInfo(Object info) {
-            return null;
-        }
-
-        @Override
-        public void setCollectionItemInfo(Object info, Object collectionItemInfo) {
-        }
-
-        @Override
-        public Object getRangeInfo(Object info) {
-            return null;
-        }
-
-        @Override
-        public void setRangeInfo(Object info, Object rangeInfo) {
-        }
-
-        @Override
-        public List<Object> getActionList(Object info) {
-            return null;
-        }
-
-        @Override
-        public Object obtainCollectionInfo(int rowCount, int columnCount, boolean hierarchical,
-                int selectionMode) {
-            return null;
-        }
-
-        @Override
-        public int getCollectionInfoColumnCount(Object info) {
-            return 0;
-        }
-
-        @Override
-        public int getCollectionInfoRowCount(Object info) {
-            return 0;
-        }
-
-        @Override
-        public boolean isCollectionInfoHierarchical(Object info) {
-            return false;
-        }
-
-        @Override
-        public Object obtainCollectionItemInfo(int rowIndex, int rowSpan, int columnIndex,
-                int columnSpan, boolean heading, boolean selected) {
-            return null;
-        }
-
-        @Override
-        public int getCollectionItemColumnIndex(Object info) {
-            return 0;
-        }
-
-        @Override
-        public int getCollectionItemColumnSpan(Object info) {
-            return 0;
-        }
-
-        @Override
-        public int getCollectionItemRowIndex(Object info) {
-            return 0;
-        }
-
-        @Override
-        public int getCollectionItemRowSpan(Object info) {
-            return 0;
-        }
-
-        @Override
-        public boolean isCollectionItemHeading(Object info) {
-            return false;
-        }
-
-        @Override
-        public boolean isCollectionItemSelected(Object info) {
-            return false;
-        }
-
-        @Override
-        public Object getTraversalBefore(Object info) {
-            return null;
-        }
-
-        @Override
-        public void setTraversalBefore(Object info, View view) {
-        }
-
-        @Override
-        public void setTraversalBefore(Object info, View root, int virtualDescendantId) {
-        }
-
-        @Override
-        public Object getTraversalAfter(Object info) {
-            return null;
-        }
-
-        @Override
-        public void setTraversalAfter(Object info, View view) {
-        }
-
-        @Override
-        public void setTraversalAfter(Object info, View root, int virtualDescendantId) {
-        }
-
-        @Override
-        public void setContentInvalid(Object info, boolean contentInvalid) {
-        }
-
-        @Override
-        public boolean isContentInvalid(Object info) {
-            return false;
-        }
-
-        @Override
-        public void setError(Object info, CharSequence error) {
-        }
-
-        @Override
-        public CharSequence getError(Object info) {
-            return null;
-        }
-
-        @Override
-        public void setLabelFor(Object info, View labeled) {
-        }
-
-        @Override
-        public void setLabelFor(Object info, View root, int virtualDescendantId) {
-        }
-
-        @Override
-        public Object getLabelFor(Object info) {
-            return null;
-        }
-
-        @Override
-        public void setLabeledBy(Object info, View labeled) {
-        }
-
-        @Override
-        public void setLabeledBy(Object info, View root, int virtualDescendantId) {
-        }
-
-        @Override
-        public Object getLabeledBy(Object info){
-            return null;
-        }
-
-        @Override
-        public boolean canOpenPopup(Object info) {
-            return false;
-        }
-
-        @Override
-        public void setCanOpenPopup(Object info, boolean opensPopup) {
-        }
-
-        @Override
-        public List<Object> findAccessibilityNodeInfosByViewId(Object info, String viewId) {
-            return  Collections.emptyList();
-        }
-
-        @Override
-        public Bundle getExtras(Object info) {
-            return new Bundle();
-        }
-
-        @Override
-        public int getInputType(Object info) {
-            return InputType.TYPE_NULL;
-        }
-
-        @Override
-        public void setInputType(Object info, int inputType) {
-        }
-
-        @Override
-        public void setMaxTextLength(Object info, int max) {
-        }
-
-        @Override
-        public int getMaxTextLength(Object info) {
-            return -1;
-        }
-
-        @Override
-        public void setTextSelection(Object info, int start, int end) {
-        }
-
-        @Override
-        public int getTextSelectionStart(Object info) {
-            return -1;
-        }
-
-        @Override
-        public int getTextSelectionEnd(Object info) {
-            return -1;
-        }
-
-        @Override
-        public Object getWindow(Object info) {
-            return null;
-        }
-
-        @Override
-        public boolean isDismissable(Object info) {
-            return false;
-        }
-
-        @Override
-        public void setDismissable(Object info, boolean dismissable) {
-        }
-
-        @Override
-        public boolean isEditable(Object info) {
-            return false;
-        }
-
-        @Override
-        public void setEditable(Object info, boolean editable) {
-        }
-
-        @Override
-        public boolean isMultiLine(Object info) {
-            return false;
-        }
-
-        @Override
-        public void setMultiLine(Object info, boolean multiLine) {
-        }
-
-        @Override
-        public boolean refresh(Object info) {
-            return false;
-        }
-
-        @Override
-        public CharSequence getRoleDescription(Object info) {
-            return null;
-        }
-
-        @Override
-        public void setRoleDescription(Object info, CharSequence roleDescription) {
-        }
-
-        @Override
-        public int getDrawingOrder(Object info) {
-            return 0;
-        }
-
-        @Override
-        public void setDrawingOrder(Object info, int drawingOrderInParent) {
-        }
-
-        @Override
-        public boolean isImportantForAccessibility(Object info) {
-            return true;
-        }
-
-        @Override
-        public void setImportantForAccessibility(Object info, boolean importantForAccessibility) {
-        }
-    }
-
-    static class AccessibilityNodeInfoIcsImpl extends AccessibilityNodeInfoStubImpl {
-        @Override
-        public Object obtain() {
-            return AccessibilityNodeInfoCompatIcs.obtain();
-        }
-
-        @Override
-        public Object obtain(View source) {
-            return AccessibilityNodeInfoCompatIcs.obtain(source);
-        }
-
-        @Override
-        public Object obtain(Object info) {
-            return AccessibilityNodeInfoCompatIcs.obtain(info);
-        }
-
-        @Override
-        public void addAction(Object info, int action) {
-            AccessibilityNodeInfoCompatIcs.addAction(info, action);
-        }
-
-        @Override
-        public void addChild(Object info, View child) {
-            AccessibilityNodeInfoCompatIcs.addChild(info, child);
-        }
-
-        @Override
-        public List<Object> findAccessibilityNodeInfosByText(Object info, String text) {
-            return AccessibilityNodeInfoCompatIcs.findAccessibilityNodeInfosByText(info, text);
-        }
-
-        @Override
-        public int getActions(Object info) {
-            return AccessibilityNodeInfoCompatIcs.getActions(info);
-        }
-
-        @Override
-        public void getBoundsInParent(Object info, Rect outBounds) {
-            AccessibilityNodeInfoCompatIcs.getBoundsInParent(info, outBounds);
-        }
-
-        @Override
-        public void getBoundsInScreen(Object info, Rect outBounds) {
-            AccessibilityNodeInfoCompatIcs.getBoundsInScreen(info, outBounds);
-        }
-
-        @Override
-        public Object getChild(Object info, int index) {
-            return AccessibilityNodeInfoCompatIcs.getChild(info, index);
-        }
-
-        @Override
-        public int getChildCount(Object info) {
-            return AccessibilityNodeInfoCompatIcs.getChildCount(info);
-        }
-
-        @Override
-        public CharSequence getClassName(Object info) {
-            return AccessibilityNodeInfoCompatIcs.getClassName(info);
-        }
-
-        @Override
-        public CharSequence getContentDescription(Object info) {
-            return AccessibilityNodeInfoCompatIcs.getContentDescription(info);
-        }
-
-        @Override
-        public CharSequence getPackageName(Object info) {
-            return AccessibilityNodeInfoCompatIcs.getPackageName(info);
-        }
-
-        @Override
-        public Object getParent(Object info) {
-            return AccessibilityNodeInfoCompatIcs.getParent(info);
-        }
-
-        @Override
-        public CharSequence getText(Object info) {
-            return AccessibilityNodeInfoCompatIcs.getText(info);
-        }
-
-        @Override
-        public int getWindowId(Object info) {
-            return AccessibilityNodeInfoCompatIcs.getWindowId(info);
-        }
-
-        @Override
-        public boolean isCheckable(Object info) {
-            return AccessibilityNodeInfoCompatIcs.isCheckable(info);
-        }
-
-        @Override
-        public boolean isChecked(Object info) {
-            return AccessibilityNodeInfoCompatIcs.isChecked(info);
-        }
-
-        @Override
-        public boolean isClickable(Object info) {
-            return AccessibilityNodeInfoCompatIcs.isClickable(info);
-        }
-
-        @Override
-        public boolean isEnabled(Object info) {
-            return AccessibilityNodeInfoCompatIcs.isEnabled(info);
-        }
-
-        @Override
-        public boolean isFocusable(Object info) {
-            return AccessibilityNodeInfoCompatIcs.isFocusable(info);
-        }
-
-        @Override
-        public boolean isFocused(Object info) {
-            return AccessibilityNodeInfoCompatIcs.isFocused(info);
-        }
-
-        @Override
-        public boolean isLongClickable(Object info) {
-            return AccessibilityNodeInfoCompatIcs.isLongClickable(info);
-        }
-
-        @Override
-        public boolean isPassword(Object info) {
-            return AccessibilityNodeInfoCompatIcs.isPassword(info);
-        }
-
-        @Override
-        public boolean isScrollable(Object info) {
-            return AccessibilityNodeInfoCompatIcs.isScrollable(info);
-        }
-
-        @Override
-        public boolean isSelected(Object info) {
-            return AccessibilityNodeInfoCompatIcs.isSelected(info);
-        }
-
-        @Override
-        public boolean performAction(Object info, int action) {
-            return AccessibilityNodeInfoCompatIcs.performAction(info, action);
-        }
-
-        @Override
-        public void setBoundsInParent(Object info, Rect bounds) {
-            AccessibilityNodeInfoCompatIcs.setBoundsInParent(info, bounds);
-        }
-
-        @Override
-        public void setBoundsInScreen(Object info, Rect bounds) {
-            AccessibilityNodeInfoCompatIcs.setBoundsInScreen(info, bounds);
-        }
-
-        @Override
-        public void setCheckable(Object info, boolean checkable) {
-            AccessibilityNodeInfoCompatIcs.setCheckable(info, checkable);
-        }
-
-        @Override
-        public void setChecked(Object info, boolean checked) {
-            AccessibilityNodeInfoCompatIcs.setChecked(info, checked);
-        }
-
-        @Override
-        public void setClassName(Object info, CharSequence className) {
-            AccessibilityNodeInfoCompatIcs.setClassName(info, className);
-        }
-
-        @Override
-        public void setClickable(Object info, boolean clickable) {
-            AccessibilityNodeInfoCompatIcs.setClickable(info, clickable);
-        }
-
-        @Override
-        public void setContentDescription(Object info, CharSequence contentDescription) {
-            AccessibilityNodeInfoCompatIcs.setContentDescription(info, contentDescription);
-        }
-
-        @Override
-        public void setEnabled(Object info, boolean enabled) {
-            AccessibilityNodeInfoCompatIcs.setEnabled(info, enabled);
-        }
-
-        @Override
-        public void setFocusable(Object info, boolean focusable) {
-            AccessibilityNodeInfoCompatIcs.setFocusable(info, focusable);
-        }
-
-        @Override
-        public void setFocused(Object info, boolean focused) {
-            AccessibilityNodeInfoCompatIcs.setFocused(info, focused);
-        }
-
-        @Override
-        public void setLongClickable(Object info, boolean longClickable) {
-            AccessibilityNodeInfoCompatIcs.setLongClickable(info, longClickable);
-        }
-
-        @Override
-        public void setPackageName(Object info, CharSequence packageName) {
-            AccessibilityNodeInfoCompatIcs.setPackageName(info, packageName);
-        }
-
-        @Override
-        public void setParent(Object info, View parent) {
-            AccessibilityNodeInfoCompatIcs.setParent(info, parent);
-        }
-
-        @Override
-        public void setPassword(Object info, boolean password) {
-            AccessibilityNodeInfoCompatIcs.setPassword(info, password);
-        }
-
-        @Override
-        public void setScrollable(Object info, boolean scrollable) {
-            AccessibilityNodeInfoCompatIcs.setScrollable(info, scrollable);
-        }
-
-        @Override
-        public void setSelected(Object info, boolean selected) {
-            AccessibilityNodeInfoCompatIcs.setSelected(info, selected);
-        }
-
-        @Override
-        public void setSource(Object info, View source) {
-            AccessibilityNodeInfoCompatIcs.setSource(info, source);
-        }
-
-        @Override
-        public void setText(Object info, CharSequence text) {
-            AccessibilityNodeInfoCompatIcs.setText(info, text);
-        }
-
-        @Override
-        public void recycle(Object info) {
-            AccessibilityNodeInfoCompatIcs.recycle(info);
-        }
-    }
-
-    static class AccessibilityNodeInfoJellybeanImpl extends AccessibilityNodeInfoIcsImpl {
-        @Override
-        public Object obtain(View root, int virtualDescendantId) {
-            return AccessibilityNodeInfoCompatJellyBean.obtain(root, virtualDescendantId);
-        }
-
-        @Override
-        public Object findFocus(Object info, int focus) {
-            return AccessibilityNodeInfoCompatJellyBean.findFocus(info, focus);
-        }
-
-        @Override
-        public Object focusSearch(Object info, int direction) {
-            return AccessibilityNodeInfoCompatJellyBean.focusSearch(info, direction);
-        }
-
-        @Override
-        public void addChild(Object info, View child, int virtualDescendantId) {
-            AccessibilityNodeInfoCompatJellyBean.addChild(info, child, virtualDescendantId);
-        }
-
-        @Override
-        public void setSource(Object info, View root, int virtualDescendantId) {
-            AccessibilityNodeInfoCompatJellyBean.setSource(info, root, virtualDescendantId);
-        }
-
-        @Override
-        public boolean isVisibleToUser(Object info) {
-            return AccessibilityNodeInfoCompatJellyBean.isVisibleToUser(info);
-        }
-
-        @Override
-        public void setVisibleToUser(Object info, boolean visibleToUser) {
-            AccessibilityNodeInfoCompatJellyBean.setVisibleToUser(info, visibleToUser);
-        }
-
-        @Override
-        public boolean isAccessibilityFocused(Object info) {
-            return AccessibilityNodeInfoCompatJellyBean.isAccessibilityFocused(info);
-        }
-
-        @Override
-        public void setAccessibilityFocused(Object info, boolean focused) {
-            AccessibilityNodeInfoCompatJellyBean.setAccesibilityFocused(info, focused);
-        }
-
-        @Override
-        public boolean performAction(Object info, int action, Bundle arguments) {
-            return AccessibilityNodeInfoCompatJellyBean.performAction(info, action, arguments);
-        }
-
-        @Override
-        public void setMovementGranularities(Object info, int granularities) {
-            AccessibilityNodeInfoCompatJellyBean.setMovementGranularities(info, granularities);
-        }
-
-        @Override
-        public int getMovementGranularities(Object info) {
-            return AccessibilityNodeInfoCompatJellyBean.getMovementGranularities(info);
-        }
-
-        @Override
-        public void setParent(Object info, View root, int virtualDescendantId) {
-            AccessibilityNodeInfoCompatJellyBean.setParent(info, root, virtualDescendantId);
-        }
-    }
-
-    static class AccessibilityNodeInfoJellybeanMr1Impl extends AccessibilityNodeInfoJellybeanImpl {
-
-        @Override
-        public void setLabelFor(Object info, View labeled) {
-            AccessibilityNodeInfoCompatJellybeanMr1.setLabelFor(info, labeled);
-        }
-
-        @Override
-        public void setLabelFor(Object info, View root, int virtualDescendantId) {
-            AccessibilityNodeInfoCompatJellybeanMr1.setLabelFor(info, root, virtualDescendantId);
-        }
-
-        @Override
-        public Object getLabelFor(Object info) {
-            return AccessibilityNodeInfoCompatJellybeanMr1.getLabelFor(info);
-        }
-
-        @Override
-        public void setLabeledBy(Object info, View labeled) {
-            AccessibilityNodeInfoCompatJellybeanMr1.setLabeledBy(info, labeled);
-        }
-
-        @Override
-        public void setLabeledBy(Object info, View root, int virtualDescendantId) {
-            AccessibilityNodeInfoCompatJellybeanMr1.setLabeledBy(info, root, virtualDescendantId);
-        }
-
-        @Override
-        public Object getLabeledBy(Object info) {
-            return AccessibilityNodeInfoCompatJellybeanMr1.getLabeledBy(info);
-        }
-    }
-
-    static class AccessibilityNodeInfoJellybeanMr2Impl extends
-            AccessibilityNodeInfoJellybeanMr1Impl {
-
-        @Override
-        public String getViewIdResourceName(Object info) {
-            return AccessibilityNodeInfoCompatJellybeanMr2.getViewIdResourceName(info);
-        }
-
-        @Override
-        public void setViewIdResourceName(Object info, String viewId) {
-            AccessibilityNodeInfoCompatJellybeanMr2.setViewIdResourceName(info, viewId);
-        }
-
-        @Override
-        public List<Object> findAccessibilityNodeInfosByViewId(Object info, String viewId) {
-            return AccessibilityNodeInfoCompatJellybeanMr2.findAccessibilityNodeInfosByViewId(info,
-                    viewId);
-        }
-
-        @Override
-        public void setTextSelection(Object info, int start, int end) {
-            AccessibilityNodeInfoCompatJellybeanMr2.setTextSelection(info, start, end);
-        }
-
-        @Override
-        public int getTextSelectionStart(Object info) {
-            return AccessibilityNodeInfoCompatJellybeanMr2.getTextSelectionStart(info);
-        }
-
-        @Override
-        public int getTextSelectionEnd(Object info) {
-            return AccessibilityNodeInfoCompatJellybeanMr2.getTextSelectionEnd(info);
-        }
-
-        @Override
-        public boolean isEditable(Object info) {
-            return AccessibilityNodeInfoCompatJellybeanMr2.isEditable(info);
-        }
-
-        @Override
-        public void setEditable(Object info, boolean editable) {
-            AccessibilityNodeInfoCompatJellybeanMr2.setEditable(info, editable);
-        }
-
-        @Override
-        public boolean refresh(Object info) {
-            return AccessibilityNodeInfoCompatJellybeanMr2.refresh(info);
-        }
-    }
-
-    static class AccessibilityNodeInfoKitKatImpl extends AccessibilityNodeInfoJellybeanMr2Impl {
-        @Override
-        public int getLiveRegion(Object info) {
-            return AccessibilityNodeInfoCompatKitKat.getLiveRegion(info);
-        }
-
-        @Override
-        public void setLiveRegion(Object info, int mode) {
-            AccessibilityNodeInfoCompatKitKat.setLiveRegion(info, mode);
-        }
-
-        @Override
-        public Object getCollectionInfo(Object info) {
-            return AccessibilityNodeInfoCompatKitKat.getCollectionInfo(info);
-        }
-
-        @Override
-        public void setCollectionInfo(Object info, Object collectionInfo) {
-            AccessibilityNodeInfoCompatKitKat.setCollectionInfo(info, collectionInfo);
-        }
-
-        @Override
-        public Object obtainCollectionInfo(int rowCount, int columnCount,
-                boolean hierarchical, int selectionMode) {
-            return AccessibilityNodeInfoCompatKitKat.obtainCollectionInfo(rowCount, columnCount,
-                    hierarchical, selectionMode);
-        }
-
-        @Override
-        public Object obtainCollectionItemInfo(int rowIndex, int rowSpan, int columnIndex,
-                int columnSpan, boolean heading, boolean selected) {
-            return AccessibilityNodeInfoCompatKitKat
-                    .obtainCollectionItemInfo(rowIndex, rowSpan, columnIndex, columnSpan, heading);
-        }
-
-        @Override
-        public int getCollectionInfoColumnCount(Object info) {
-            return AccessibilityNodeInfoCompatKitKat.CollectionInfo.getColumnCount(info);
-        }
-
-        @Override
-        public int getCollectionInfoRowCount(Object info) {
-            return AccessibilityNodeInfoCompatKitKat.CollectionInfo.getRowCount(info);
-        }
-
-        @Override
-        public boolean isCollectionInfoHierarchical(Object info) {
-            return AccessibilityNodeInfoCompatKitKat.CollectionInfo.isHierarchical(info);
-        }
-
-        @Override
-        public Object getCollectionItemInfo(Object info) {
-            return AccessibilityNodeInfoCompatKitKat.getCollectionItemInfo(info);
-        }
-
-        @Override
-        public Object getRangeInfo(Object info) {
-            return AccessibilityNodeInfoCompatKitKat.getRangeInfo(info);
-        }
-
-        @Override
-        public void setRangeInfo(Object info, Object rangeInfo) {
-            AccessibilityNodeInfoCompatKitKat.setRangeInfo(info, rangeInfo);
-        }
-
-        @Override
-        public int getCollectionItemColumnIndex(Object info) {
-            return AccessibilityNodeInfoCompatKitKat.CollectionItemInfo.getColumnIndex(info);
-        }
-
-        @Override
-        public int getCollectionItemColumnSpan(Object info) {
-            return AccessibilityNodeInfoCompatKitKat.CollectionItemInfo.getColumnSpan(info);
-        }
-
-        @Override
-        public int getCollectionItemRowIndex(Object info) {
-            return AccessibilityNodeInfoCompatKitKat.CollectionItemInfo.getRowIndex(info);
-        }
-
-        @Override
-        public int getCollectionItemRowSpan(Object info) {
-            return AccessibilityNodeInfoCompatKitKat.CollectionItemInfo.getRowSpan(info);
-        }
-
-        @Override
-        public boolean isCollectionItemHeading(Object info) {
-            return AccessibilityNodeInfoCompatKitKat.CollectionItemInfo.isHeading(info);
-        }
-
-        @Override
-        public void setCollectionItemInfo(Object info, Object collectionItemInfo) {
-            AccessibilityNodeInfoCompatKitKat.setCollectionItemInfo(info, collectionItemInfo);
-        }
-
-        @Override
-        public void setContentInvalid(Object info, boolean contentInvalid) {
-            AccessibilityNodeInfoCompatKitKat.setContentInvalid(info, contentInvalid);
-        }
-
-        @Override
-        public boolean isContentInvalid(Object info) {
-            return AccessibilityNodeInfoCompatKitKat.isContentInvalid(info);
-        }
-
-        @Override
-        public boolean canOpenPopup(Object info) {
-            return AccessibilityNodeInfoCompatKitKat.canOpenPopup(info);
-        }
-
-        @Override
-        public void setCanOpenPopup(Object info, boolean opensPopup) {
-            AccessibilityNodeInfoCompatKitKat.setCanOpenPopup(info, opensPopup);
-        }
-
-        @Override
-        public Bundle getExtras(Object info) {
-            return AccessibilityNodeInfoCompatKitKat.getExtras(info);
-        }
-
-        @Override
-        public int getInputType(Object info) {
-            return AccessibilityNodeInfoCompatKitKat.getInputType(info);
-        }
-
-        @Override
-        public void setInputType(Object info, int inputType) {
-            AccessibilityNodeInfoCompatKitKat.setInputType(info, inputType);
-        }
-
-        @Override
-        public boolean isDismissable(Object info) {
-            return AccessibilityNodeInfoCompatKitKat.isDismissable(info);
-        }
-
-        @Override
-        public void setDismissable(Object info, boolean dismissable) {
-            AccessibilityNodeInfoCompatKitKat.setDismissable(info, dismissable);
-        }
-
-        @Override
-        public boolean isMultiLine(Object info) {
-            return AccessibilityNodeInfoCompatKitKat.isMultiLine(info);
-        }
-
-        @Override
-        public void setMultiLine(Object info, boolean multiLine) {
-            AccessibilityNodeInfoCompatKitKat.setMultiLine(info, multiLine);
-        }
-
-        @Override
-        public CharSequence getRoleDescription(Object info) {
-            return AccessibilityNodeInfoCompatKitKat.getRoleDescription(info);
-        }
-
-        @Override
-        public void setRoleDescription(Object info, CharSequence roleDescription) {
-            AccessibilityNodeInfoCompatKitKat.setRoleDescription(info, roleDescription);
-        }
-    }
-
-    static class AccessibilityNodeInfoApi21Impl extends AccessibilityNodeInfoKitKatImpl {
-        @Override
-        public Object newAccessibilityAction(int actionId, CharSequence label) {
-            return AccessibilityNodeInfoCompatApi21.newAccessibilityAction(actionId, label);
-        }
-
-        @Override
-        public List<Object> getActionList(Object info) {
-            return AccessibilityNodeInfoCompatApi21.getActionList(info);
-        }
-
-        @Override
-        public Object obtainCollectionInfo(int rowCount, int columnCount, boolean hierarchical,
-                int selectionMode) {
-            return AccessibilityNodeInfoCompatApi21.obtainCollectionInfo(rowCount, columnCount,
-                    hierarchical, selectionMode);
-        }
-
-        @Override
-        public void addAction(Object info, Object action) {
-            AccessibilityNodeInfoCompatApi21.addAction(info, action);
-        }
-
-        @Override
-        public boolean removeAction(Object info, Object action) {
-            return AccessibilityNodeInfoCompatApi21.removeAction(info, action);
-        }
-
-        @Override
-        public int getAccessibilityActionId(Object action) {
-            return AccessibilityNodeInfoCompatApi21.getAccessibilityActionId(action);
-        }
-
-        @Override
-        public CharSequence getAccessibilityActionLabel(Object action) {
-            return AccessibilityNodeInfoCompatApi21.getAccessibilityActionLabel(action);
-        }
-
-        @Override
-        public Object obtainCollectionItemInfo(int rowIndex, int rowSpan, int columnIndex,
-                int columnSpan, boolean heading, boolean selected) {
-            return AccessibilityNodeInfoCompatApi21.obtainCollectionItemInfo(rowIndex, rowSpan,
-                    columnIndex, columnSpan, heading, selected);
-        }
-
-        @Override
-        public boolean isCollectionItemSelected(Object info) {
-            return AccessibilityNodeInfoCompatApi21.CollectionItemInfo.isSelected(info);
-        }
-
-        @Override
-        public CharSequence getError(Object info) {
-            return AccessibilityNodeInfoCompatApi21.getError(info);
-        }
-
-        @Override
-        public void setError(Object info, CharSequence error) {
-            AccessibilityNodeInfoCompatApi21.setError(info, error);
-        }
-
-        @Override
-        public void setMaxTextLength(Object info, int max) {
-            AccessibilityNodeInfoCompatApi21.setMaxTextLength(info, max);
-        }
-
-        @Override
-        public int getMaxTextLength(Object info) {
-            return AccessibilityNodeInfoCompatApi21.getMaxTextLength(info);
-        }
-
-        @Override
-        public Object getWindow(Object info) {
-            return AccessibilityNodeInfoCompatApi21.getWindow(info);
-        }
-
-        @Override
-        public boolean removeChild(Object info, View child) {
-            return AccessibilityNodeInfoCompatApi21.removeChild(info, child);
-        }
-
-        @Override
-        public boolean removeChild(Object info, View root, int virtualDescendantId) {
-            return AccessibilityNodeInfoCompatApi21.removeChild(info, root, virtualDescendantId);
-        }
-    }
-
-    static class AccessibilityNodeInfoApi22Impl extends AccessibilityNodeInfoApi21Impl {
-        @Override
-        public Object getTraversalBefore(Object info) {
-            return AccessibilityNodeInfoCompatApi22.getTraversalBefore(info);
-        }
-
-        @Override
-        public void setTraversalBefore(Object info, View view) {
-            AccessibilityNodeInfoCompatApi22.setTraversalBefore(info, view);
-        }
-
-        @Override
-        public void setTraversalBefore(Object info, View root, int virtualDescendantId) {
-            AccessibilityNodeInfoCompatApi22.setTraversalBefore(info, root, virtualDescendantId);
-        }
-
-        @Override
-        public Object getTraversalAfter(Object info) {
-            return AccessibilityNodeInfoCompatApi22.getTraversalAfter(info);
-        }
-
-        @Override
-        public void setTraversalAfter(Object info, View view) {
-            AccessibilityNodeInfoCompatApi22.setTraversalAfter(info, view);
-        }
-
-        @Override
-        public void setTraversalAfter(Object info, View root, int virtualDescendantId) {
-            AccessibilityNodeInfoCompatApi22.setTraversalAfter(info, root, virtualDescendantId);
-        }
-    }
-
-    static class AccessibilityNodeInfoApi24Impl extends AccessibilityNodeInfoApi22Impl {
-        @Override
-        public int getDrawingOrder(Object info) {
-            return AccessibilityNodeInfoCompatApi24.getDrawingOrder(info);
-        }
-
-        @Override
-        public void setDrawingOrder(Object info, int drawingOrderInParent) {
-            AccessibilityNodeInfoCompatApi24.setDrawingOrder(info, drawingOrderInParent);
-        }
-
-        @Override
-        public boolean isImportantForAccessibility(Object info) {
-            return AccessibilityNodeInfoCompatApi24.isImportantForAccessibility(info);
-        }
-
-        @Override
-        public void setImportantForAccessibility(Object info, boolean importantForAccessibility) {
-            AccessibilityNodeInfoCompatApi24.setImportantForAccessibility(
-                    info, importantForAccessibility);
-        }
-
-    }
-
-    static {
-        if (Build.VERSION.SDK_INT >= 24) {
-            IMPL = new AccessibilityNodeInfoApi24Impl();
-        } else if (Build.VERSION.SDK_INT >= 22) {
-            IMPL = new AccessibilityNodeInfoApi22Impl();
-        } else if (Build.VERSION.SDK_INT >= 21) {
-            IMPL = new AccessibilityNodeInfoApi21Impl();
-        } else if (Build.VERSION.SDK_INT >= 19) { // KitKat
-            IMPL = new AccessibilityNodeInfoKitKatImpl();
-        } else if (Build.VERSION.SDK_INT >= 18) { // JellyBean MR2
-            IMPL = new AccessibilityNodeInfoJellybeanMr2Impl();
-        } else if (Build.VERSION.SDK_INT >= 17) { // JellyBean MR1
-            IMPL = new AccessibilityNodeInfoJellybeanMr1Impl();
-        } else if (Build.VERSION.SDK_INT >= 16) { // JellyBean
-            IMPL = new AccessibilityNodeInfoJellybeanImpl();
-        } else if (Build.VERSION.SDK_INT >= 14) { // ICS
-            IMPL = new AccessibilityNodeInfoIcsImpl();
-        } else {
-            IMPL = new AccessibilityNodeInfoStubImpl();
-        }
-    }
-
-    private static final AccessibilityNodeInfoImpl IMPL;
-
-    private final Object mInfo;
-
-    // Actions introduced in IceCreamSandwich
-
-    /**
-     * Action that focuses the node.
-     */
-    public static final int ACTION_FOCUS = 0x00000001;
-
-    /**
-     * Action that unfocuses the node.
-     */
-    public static final int ACTION_CLEAR_FOCUS = 0x00000002;
-
-    /**
-     * Action that selects the node.
-     */
-    public static final int ACTION_SELECT = 0x00000004;
-
-    /**
-     * Action that unselects the node.
-     */
-    public static final int ACTION_CLEAR_SELECTION = 0x00000008;
-
-    /**
-     * Action that clicks on the node info.
-     */
-    public static final int ACTION_CLICK = 0x00000010;
-
-    /**
-     * Action that long clicks on the node.
-     */
-    public static final int ACTION_LONG_CLICK = 0x00000020;
-
-    // Actions introduced in JellyBean
-
-    /**
-     * Action that gives accessibility focus to the node.
-     */
-    public static final int ACTION_ACCESSIBILITY_FOCUS = 0x00000040;
-
-    /**
-     * Action that clears accessibility focus of the node.
-     */
-    public static final int ACTION_CLEAR_ACCESSIBILITY_FOCUS = 0x00000080;
-
-    /**
-     * Action that requests to go to the next entity in this node's text
-     * at a given movement granularity. For example, move to the next character,
-     * word, etc.
-     * <p>
-     * <strong>Arguments:</strong> {@link #ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT}<,
-     * {@link #ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN}<br>
-     * <strong>Example:</strong> Move to the previous character and do not extend selection.
-     * <code><pre><p>
-     *   Bundle arguments = new Bundle();
-     *   arguments.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT,
-     *           AccessibilityNodeInfo.MOVEMENT_GRANULARITY_CHARACTER);
-     *   arguments.putBoolean(AccessibilityNodeInfo.ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN,
-     *           false);
-     *   info.performAction(AccessibilityNodeInfo.ACTION_NEXT_AT_MOVEMENT_GRANULARITY, arguments);
-     * </code></pre></p>
-     * </p>
-     *
-     * @see #ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT
-     * @see #ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN
-     *
-     * @see #setMovementGranularities(int)
-     * @see #getMovementGranularities()
-     *
-     * @see #MOVEMENT_GRANULARITY_CHARACTER
-     * @see #MOVEMENT_GRANULARITY_WORD
-     * @see #MOVEMENT_GRANULARITY_LINE
-     * @see #MOVEMENT_GRANULARITY_PARAGRAPH
-     * @see #MOVEMENT_GRANULARITY_PAGE
-     */
-    public static final int ACTION_NEXT_AT_MOVEMENT_GRANULARITY = 0x00000100;
-
-    /**
-     * Action that requests to go to the previous entity in this node's text
-     * at a given movement granularity. For example, move to the next character,
-     * word, etc.
-     * <p>
-     * <strong>Arguments:</strong> {@link #ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT}<,
-     * {@link #ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN}<br>
-     * <strong>Example:</strong> Move to the next character and do not extend selection.
-     * <code><pre><p>
-     *   Bundle arguments = new Bundle();
-     *   arguments.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT,
-     *           AccessibilityNodeInfo.MOVEMENT_GRANULARITY_CHARACTER);
-     *   arguments.putBoolean(AccessibilityNodeInfo.ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN,
-     *           false);
-     *   info.performAction(AccessibilityNodeInfo.ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY,
-     *           arguments);
-     * </code></pre></p>
-     * </p>
-     *
-     * @see #ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT
-     * @see #ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN
-     *
-     * @see #setMovementGranularities(int)
-     * @see #getMovementGranularities()
-     *
-     * @see #MOVEMENT_GRANULARITY_CHARACTER
-     * @see #MOVEMENT_GRANULARITY_WORD
-     * @see #MOVEMENT_GRANULARITY_LINE
-     * @see #MOVEMENT_GRANULARITY_PARAGRAPH
-     * @see #MOVEMENT_GRANULARITY_PAGE
-     */
-    public static final int ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY = 0x00000200;
-
-    /**
-     * Action to move to the next HTML element of a given type. For example, move
-     * to the BUTTON, INPUT, TABLE, etc.
-     * <p>
-     * <strong>Arguments:</strong> {@link #ACTION_ARGUMENT_HTML_ELEMENT_STRING}<br>
-     * <strong>Example:</strong>
-     * <code><pre><p>
-     *   Bundle arguments = new Bundle();
-     *   arguments.putString(AccessibilityNodeInfo.ACTION_ARGUMENT_HTML_ELEMENT_STRING, "BUTTON");
-     *   info.performAction(AccessibilityNodeInfo.ACTION_NEXT_HTML_ELEMENT, arguments);
-     * </code></pre></p>
-     * </p>
-     */
-    public static final int ACTION_NEXT_HTML_ELEMENT = 0x00000400;
-
-    /**
-     * Action to move to the previous HTML element of a given type. For example, move
-     * to the BUTTON, INPUT, TABLE, etc.
-     * <p>
-     * <strong>Arguments:</strong> {@link #ACTION_ARGUMENT_HTML_ELEMENT_STRING}<br>
-     * <strong>Example:</strong>
-     * <code><pre><p>
-     *   Bundle arguments = new Bundle();
-     *   arguments.putString(AccessibilityNodeInfo.ACTION_ARGUMENT_HTML_ELEMENT_STRING, "BUTTON");
-     *   info.performAction(AccessibilityNodeInfo.ACTION_PREVIOUS_HTML_ELEMENT, arguments);
-     * </code></pre></p>
-     * </p>
-     */
-    public static final int ACTION_PREVIOUS_HTML_ELEMENT = 0x00000800;
-
-    /**
-     * Action to scroll the node content forward.
-     */
-    public static final int ACTION_SCROLL_FORWARD = 0x00001000;
-
-    /**
-     * Action to scroll the node content backward.
-     */
-    public static final int ACTION_SCROLL_BACKWARD = 0x00002000;
-
-    // Actions introduced in JellyBeanMr2
-
-    /**
-     * Action to copy the current selection to the clipboard.
-     */
-    public static final int ACTION_COPY = 0x00004000;
-
-    /**
-     * Action to paste the current clipboard content.
-     */
-    public static final int ACTION_PASTE = 0x00008000;
-
-    /**
-     * Action to cut the current selection and place it to the clipboard.
-     */
-    public static final int ACTION_CUT = 0x00010000;
-
-    /**
-     * Action to set the selection. Performing this action with no arguments
-     * clears the selection.
-     * <p>
-     * <strong>Arguments:</strong> {@link #ACTION_ARGUMENT_SELECTION_START_INT},
-     * {@link #ACTION_ARGUMENT_SELECTION_END_INT}<br>
-     * <strong>Example:</strong>
-     * <code><pre><p>
-     *   Bundle arguments = new Bundle();
-     *   arguments.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_START_INT, 1);
-     *   arguments.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_END_INT, 2);
-     *   info.performAction(AccessibilityNodeInfo.ACTION_SET_SELECTION, arguments);
-     * </code></pre></p>
-     * </p>
-     *
-     * @see #ACTION_ARGUMENT_SELECTION_START_INT
-     * @see #ACTION_ARGUMENT_SELECTION_END_INT
-     */
-    public static final int ACTION_SET_SELECTION = 0x00020000;
-
-    /**
-     * Action to expand an expandable node.
-     */
-    public static final int ACTION_EXPAND = 0x00040000;
-
-    /**
-     * Action to collapse an expandable node.
-     */
-    public static final int ACTION_COLLAPSE = 0x00080000;
-
-    /**
-     * Action to dismiss a dismissable node.
-     */
-    public static final int ACTION_DISMISS = 0x00100000;
-
-    /**
-     * Action that sets the text of the node. Performing the action without argument, using <code>
-     * null</code> or empty {@link CharSequence} will clear the text. This action will also put the
-     * cursor at the end of text.
-     * <p>
-     * <strong>Arguments:</strong> {@link #ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE}<br>
-     * <strong>Example:</strong>
-     * <code><pre><p>
-     *   Bundle arguments = new Bundle();
-     *   arguments.putCharSequence(AccessibilityNodeInfo.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE,
-     *       "android");
-     *   info.performAction(AccessibilityNodeInfo.ACTION_SET_TEXT, arguments);
-     * </code></pre></p>
-     */
-    public static final int ACTION_SET_TEXT = 0x00200000;
-
-    // Action arguments
-
-    /**
-     * Argument for which movement granularity to be used when traversing the node text.
-     * <p>
-     * <strong>Type:</strong> int<br>
-     * <strong>Actions:</strong> {@link #ACTION_NEXT_AT_MOVEMENT_GRANULARITY},
-     * {@link #ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY}
-     * </p>
-     */
-    public static final String ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT =
-        "ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT";
-
-    /**
-     * Argument for which HTML element to get moving to the next/previous HTML element.
-     * <p>
-     * <strong>Type:</strong> String<br>
-     * <strong>Actions:</strong> {@link #ACTION_NEXT_HTML_ELEMENT},
-     *         {@link #ACTION_PREVIOUS_HTML_ELEMENT}
-     * </p>
-     */
-    public static final String ACTION_ARGUMENT_HTML_ELEMENT_STRING =
-        "ACTION_ARGUMENT_HTML_ELEMENT_STRING";
-
-    /**
-     * Argument for whether when moving at granularity to extend the selection
-     * or to move it otherwise.
-     * <p>
-     * <strong>Type:</strong> boolean<br>
-     * <strong>Actions:</strong> {@link #ACTION_NEXT_AT_MOVEMENT_GRANULARITY},
-     * {@link #ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY}
-     * </p>
-     *
-     * @see #ACTION_NEXT_AT_MOVEMENT_GRANULARITY
-     * @see #ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY
-     */
-    public static final String ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN =
-            "ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN";
-
-    /**
-     * Argument for specifying the selection start.
-     * <p>
-     * <strong>Type:</strong> int<br>
-     * <strong>Actions:</strong> {@link #ACTION_SET_SELECTION}
-     * </p>
-     *
-     * @see #ACTION_SET_SELECTION
-     */
-    public static final String ACTION_ARGUMENT_SELECTION_START_INT =
-            "ACTION_ARGUMENT_SELECTION_START_INT";
-
-    /**
-     * Argument for specifying the selection end.
-     * <p>
-     * <strong>Type:</strong> int<br>
-     * <strong>Actions:</strong> {@link #ACTION_SET_SELECTION}
-     * </p>
-     *
-     * @see #ACTION_SET_SELECTION
-     */
-    public static final String ACTION_ARGUMENT_SELECTION_END_INT =
-            "ACTION_ARGUMENT_SELECTION_END_INT";
-
-    /**
-     * Argument for specifying the text content to set
-     * <p>
-     * <strong>Type:</strong> CharSequence<br>
-     * <strong>Actions:</strong> {@link #ACTION_SET_TEXT}
-     * </p>
-     *
-     * @see #ACTION_SET_TEXT
-     */
-    public static final String ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE =
-            "ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE";
-
-    // Focus types
-
-    /**
-     * The input focus.
-     */
-    public static final int FOCUS_INPUT = 1;
-
-    /**
-     * The accessibility focus.
-     */
-    public static final int FOCUS_ACCESSIBILITY = 2;
-
-    // Movement granularities
-
-    /**
-     * Movement granularity bit for traversing the text of a node by character.
-     */
-    public static final int MOVEMENT_GRANULARITY_CHARACTER = 0x00000001;
-
-    /**
-     * Movement granularity bit for traversing the text of a node by word.
-     */
-    public static final int MOVEMENT_GRANULARITY_WORD = 0x00000002;
-
-    /**
-     * Movement granularity bit for traversing the text of a node by line.
-     */
-    public static final int MOVEMENT_GRANULARITY_LINE = 0x00000004;
-
-    /**
-     * Movement granularity bit for traversing the text of a node by paragraph.
-     */
-    public static final int MOVEMENT_GRANULARITY_PARAGRAPH = 0x00000008;
-
-    /**
-     * Movement granularity bit for traversing the text of a node by page.
-     */
-    public static final int MOVEMENT_GRANULARITY_PAGE = 0x00000010;
-
-    /**
-     * Creates a wrapper for info implementation.
-     *
-     * @param object The info to wrap.
-     * @return A wrapper for if the object is not null, null otherwise.
-     */
-    static AccessibilityNodeInfoCompat wrapNonNullInstance(Object object) {
-        if (object != null) {
-            return new AccessibilityNodeInfoCompat(object);
-        }
-        return null;
-    }
-
-    /**
-     * Creates a new instance wrapping an
-     * {@link android.view.accessibility.AccessibilityNodeInfo}.
-     *
-     * @param info The info.
-     */
-    public AccessibilityNodeInfoCompat(Object info) {
-        mInfo = info;
-    }
-
-    /**
-     * @return The wrapped {@link android.view.accessibility.AccessibilityNodeInfo}.
-     */
-    public Object getInfo() {
-        return mInfo;
-    }
-
-    /**
-     * Returns a cached instance if such is available otherwise a new one and
-     * sets the source.
-     *
-     * @return An instance.
-     * @see #setSource(View)
-     */
-    public static AccessibilityNodeInfoCompat obtain(View source) {
-        return AccessibilityNodeInfoCompat.wrapNonNullInstance(IMPL.obtain(source));
-    }
-
-    /**
-     * Returns a cached instance if such is available otherwise a new one
-     * and sets the source.
-     *
-     * @param root The root of the virtual subtree.
-     * @param virtualDescendantId The id of the virtual descendant.
-     * @return An instance.
-     *
-     * @see #setSource(View, int)
-     */
-    public static AccessibilityNodeInfoCompat obtain(View root, int virtualDescendantId) {
-        return AccessibilityNodeInfoCompat.wrapNonNullInstance(
-                IMPL.obtain(root, virtualDescendantId));
-    }
-
-    /**
-     * Returns a cached instance if such is available otherwise a new one.
-     *
-     * @return An instance.
-     */
-    public static AccessibilityNodeInfoCompat obtain() {
-        return AccessibilityNodeInfoCompat.wrapNonNullInstance(IMPL.obtain());
-    }
-
-    /**
-     * Returns a cached instance if such is available or a new one is create.
-     * The returned instance is initialized from the given <code>info</code>.
-     *
-     * @param info The other info.
-     * @return An instance.
-     */
-    public static AccessibilityNodeInfoCompat obtain(AccessibilityNodeInfoCompat info) {
-        return AccessibilityNodeInfoCompat.wrapNonNullInstance(IMPL.obtain(info.mInfo));
-    }
-
-    /**
-     * Sets the source.
-     *
-     * @param source The info source.
-     */
-    public void setSource(View source) {
-        IMPL.setSource(mInfo, source);
-    }
-
-    /**
-     * Sets the source to be a virtual descendant of the given <code>root</code>.
-     * If <code>virtualDescendantId</code> is {@link View#NO_ID} the root
-     * is set as the source.
-     * <p>
-     * A virtual descendant is an imaginary View that is reported as a part of the view
-     * hierarchy for accessibility purposes. This enables custom views that draw complex
-     * content to report themselves as a tree of virtual views, thus conveying their
-     * logical structure.
-     * </p>
-     * <p>
-     *   <strong>Note:</strong> Cannot be called from an
-     *   {@link android.accessibilityservice.AccessibilityService}.
-     *   This class is made immutable before being delivered to an AccessibilityService.
-     * </p>
-     *
-     * @param root The root of the virtual subtree.
-     * @param virtualDescendantId The id of the virtual descendant.
-     */
-    public void setSource(View root, int virtualDescendantId) {
-        IMPL.setSource(mInfo, root, virtualDescendantId);
-    }
-
-    /**
-     * Find the view that has the specified focus type. The search starts from
-     * the view represented by this node info.
-     *
-     * @param focus The focus to find. One of {@link #FOCUS_INPUT} or
-     *         {@link #FOCUS_ACCESSIBILITY}.
-     * @return The node info of the focused view or null.
-     *
-     * @see #FOCUS_INPUT
-     * @see #FOCUS_ACCESSIBILITY
-     */
-    public AccessibilityNodeInfoCompat findFocus(int focus) {
-        return AccessibilityNodeInfoCompat.wrapNonNullInstance(IMPL.findFocus(mInfo, focus));
-    }
-
-    /**
-     * Searches for the nearest view in the specified direction that can take
-     * input focus.
-     *
-     * @param direction The direction. Can be one of:
-     *     {@link View#FOCUS_DOWN},
-     *     {@link View#FOCUS_UP},
-     *     {@link View#FOCUS_LEFT},
-     *     {@link View#FOCUS_RIGHT},
-     *     {@link View#FOCUS_FORWARD},
-     *     {@link View#FOCUS_BACKWARD}.
-     *
-     * @return The node info for the view that can take accessibility focus.
-     */
-    public AccessibilityNodeInfoCompat focusSearch(int direction) {
-        return AccessibilityNodeInfoCompat.wrapNonNullInstance(IMPL.focusSearch(mInfo, direction));
-    }
-
-    /**
-     * Gets the id of the window from which the info comes from.
-     *
-     * @return The window id.
-     */
-    public int getWindowId() {
-        return IMPL.getWindowId(mInfo);
-    }
-
-    /**
-     * Gets the number of children.
-     *
-     * @return The child count.
-     */
-    public int getChildCount() {
-        return IMPL.getChildCount(mInfo);
-    }
-
-    /**
-     * Get the child at given index.
-     * <p>
-     * <strong>Note:</strong> It is a client responsibility to recycle the
-     * received info by calling {@link AccessibilityNodeInfoCompat#recycle()} to
-     * avoid creating of multiple instances.
-     * </p>
-     *
-     * @param index The child index.
-     * @return The child node.
-     * @throws IllegalStateException If called outside of an
-     *             AccessibilityService.
-     */
-    public AccessibilityNodeInfoCompat getChild(int index) {
-        return AccessibilityNodeInfoCompat.wrapNonNullInstance(IMPL.getChild(mInfo, index));
-    }
-
-    /**
-     * Adds a child.
-     * <p>
-     * <strong>Note:</strong> Cannot be called from an
-     * {@link android.accessibilityservice.AccessibilityService}. This class is
-     * made immutable before being delivered to an AccessibilityService.
-     * </p>
-     *
-     * @param child The child.
-     * @throws IllegalStateException If called from an AccessibilityService.
-     */
-    public void addChild(View child) {
-        IMPL.addChild(mInfo, child);
-    }
-
-    /**
-     * Adds a virtual child which is a descendant of the given <code>root</code>.
-     * If <code>virtualDescendantId</code> is {@link View#NO_ID} the root
-     * is added as a child.
-     * <p>
-     * A virtual descendant is an imaginary View that is reported as a part of the view
-     * hierarchy for accessibility purposes. This enables custom views that draw complex
-     * content to report them selves as a tree of virtual views, thus conveying their
-     * logical structure.
-     * </p>
-     *
-     * @param root The root of the virtual subtree.
-     * @param virtualDescendantId The id of the virtual child.
-     */
-    public void addChild(View root, int virtualDescendantId) {
-        IMPL.addChild(mInfo, root, virtualDescendantId);
-    }
-
-    /**
-     * Removes a child. If the child was not previously added to the node,
-     * calling this method has no effect.
-     * <p>
-     * <strong>Note:</strong> Cannot be called from an
-     * {@link android.accessibilityservice.AccessibilityService}.
-     * This class is made immutable before being delivered to an AccessibilityService.
-     * </p>
-     *
-     * @param child The child.
-     * @return true if the child was present
-     *
-     * @throws IllegalStateException If called from an AccessibilityService.
-     */
-    public boolean removeChild(View child) {
-        return IMPL.removeChild(mInfo, child);
-    }
-
-    /**
-     * Removes a virtual child which is a descendant of the given
-     * <code>root</code>. If the child was not previously added to the node,
-     * calling this method has no effect.
-     *
-     * @param root The root of the virtual subtree.
-     * @param virtualDescendantId The id of the virtual child.
-     * @return true if the child was present
-     * @see #addChild(View, int)
-     */
-    public boolean removeChild(View root, int virtualDescendantId) {
-        return IMPL.removeChild(mInfo, root, virtualDescendantId);
-    }
-
-    /**
-     * Gets the actions that can be performed on the node.
-     *
-     * @return The bit mask of with actions.
-     * @see android.view.accessibility.AccessibilityNodeInfo#ACTION_FOCUS
-     * @see android.view.accessibility.AccessibilityNodeInfo#ACTION_CLEAR_FOCUS
-     * @see android.view.accessibility.AccessibilityNodeInfo#ACTION_SELECT
-     * @see android.view.accessibility.AccessibilityNodeInfo#ACTION_CLEAR_SELECTION
-     */
-    public int getActions() {
-        return IMPL.getActions(mInfo);
-    }
-
-    /**
-     * Adds an action that can be performed on the node.
-     * <p>
-     * <strong>Note:</strong> Cannot be called from an
-     * {@link android.accessibilityservice.AccessibilityService}. This class is
-     * made immutable before being delivered to an AccessibilityService.
-     * </p>
-     *
-     * @param action The action.
-     * @throws IllegalStateException If called from an AccessibilityService.
-     */
-    public void addAction(int action) {
-        IMPL.addAction(mInfo, action);
-    }
-
-    /**
-     * Adds an action that can be performed on the node.
-     * <p>
-     * <strong>Note:</strong> Cannot be called from an
-     * {@link android.accessibilityservice.AccessibilityService}. This class is
-     * made immutable before being delivered to an AccessibilityService.
-     * </p>
-     *
-     * @param action The action.
-     * @throws IllegalStateException If called from an AccessibilityService.
-     */
-    public void addAction(AccessibilityActionCompat action) {
-        IMPL.addAction(mInfo, action.mAction);
-    }
-
-    /**
-     * Removes an action that can be performed on the node. If the action was
-     * not already added to the node, calling this method has no effect.
-     * <p>
-     *   <strong>Note:</strong> Cannot be called from an
-     *   {@link android.accessibilityservice.AccessibilityService}.
-     *   This class is made immutable before being delivered to an AccessibilityService.
-     * </p>
-     *
-     * @param action The action to be removed.
-     * @return The action removed from the list of actions.
-     *
-     * @throws IllegalStateException If called from an AccessibilityService.
-     */
-    public boolean removeAction(AccessibilityActionCompat action) {
-        return IMPL.removeAction(mInfo, action.mAction);
-    }
-
-    /**
-     * Performs an action on the node.
-     * <p>
-     * <strong>Note:</strong> An action can be performed only if the request is
-     * made from an {@link android.accessibilityservice.AccessibilityService}.
-     * </p>
-     *
-     * @param action The action to perform.
-     * @return True if the action was performed.
-     * @throws IllegalStateException If called outside of an
-     *             AccessibilityService.
-     */
-    public boolean performAction(int action) {
-        return IMPL.performAction(mInfo, action);
-    }
-
-    /**
-     * Performs an action on the node.
-     * <p>
-     *   <strong>Note:</strong> An action can be performed only if the request is made
-     *   from an {@link android.accessibilityservice.AccessibilityService}.
-     * </p>
-     *
-     * @param action The action to perform.
-     * @param arguments A bundle with additional arguments.
-     * @return True if the action was performed.
-     *
-     * @throws IllegalStateException If called outside of an AccessibilityService.
-     */
-    public boolean performAction(int action, Bundle arguments) {
-        return IMPL.performAction(mInfo, action, arguments);
-    }
-
-    /**
-     * Sets the movement granularities for traversing the text of this node.
-     * <p>
-     *   <strong>Note:</strong> Cannot be called from an
-     *   {@link android.accessibilityservice.AccessibilityService}.
-     *   This class is made immutable before being delivered to an AccessibilityService.
-     * </p>
-     *
-     * @param granularities The bit mask with granularities.
-     *
-     * @throws IllegalStateException If called from an AccessibilityService.
-     */
-    public void setMovementGranularities(int granularities) {
-        IMPL.setMovementGranularities(mInfo, granularities);
-    }
-
-    /**
-     * Gets the movement granularities for traversing the text of this node.
-     *
-     * @return The bit mask with granularities.
-     */
-    public int getMovementGranularities() {
-        return IMPL.getMovementGranularities(mInfo);
-    }
-
-    /**
-     * Finds {@link android.view.accessibility.AccessibilityNodeInfo}s by text. The match
-     * is case insensitive containment. The search is relative to this info i.e. this
-     * info is the root of the traversed tree.
-     * <p>
-     * <strong>Note:</strong> It is a client responsibility to recycle the
-     * received info by calling {@link android.view.accessibility.AccessibilityNodeInfo#recycle()}
-     * to avoid creating of multiple instances.
-     * </p>
-     *
-     * @param text The searched text.
-     * @return A list of node info.
-     */
-    public List<AccessibilityNodeInfoCompat> findAccessibilityNodeInfosByText(String text) {
-        List<AccessibilityNodeInfoCompat> result = new ArrayList<AccessibilityNodeInfoCompat>();
-        List<Object> infos = IMPL.findAccessibilityNodeInfosByText(mInfo, text);
-        final int infoCount = infos.size();
-        for (int i = 0; i < infoCount; i++) {
-            Object info = infos.get(i);
-            result.add(new AccessibilityNodeInfoCompat(info));
-        }
-        return result;
-    }
-
-    /**
-     * Gets the parent.
-     * <p>
-     * <strong>Note:</strong> It is a client responsibility to recycle the
-     * received info by calling {@link android.view.accessibility.AccessibilityNodeInfo#recycle()}
-     * to avoid creating of multiple instances.
-     * </p>
-     *
-     * @return The parent.
-     */
-    public AccessibilityNodeInfoCompat getParent() {
-        return AccessibilityNodeInfoCompat.wrapNonNullInstance(IMPL.getParent(mInfo));
-    }
-
-    /**
-     * Sets the parent.
-     * <p>
-     * <strong>Note:</strong> Cannot be called from an
-     * {@link android.accessibilityservice.AccessibilityService}. This class is
-     * made immutable before being delivered to an AccessibilityService.
-     * </p>
-     *
-     * @param parent The parent.
-     * @throws IllegalStateException If called from an AccessibilityService.
-     */
-    public void setParent(View parent) {
-        IMPL.setParent(mInfo, parent);
-    }
-
-    /**
-     * Sets the parent to be a virtual descendant of the given <code>root</code>.
-     * If <code>virtualDescendantId</code> equals to {@link View#NO_ID} the root
-     * is set as the parent.
-     * <p>
-     * A virtual descendant is an imaginary View that is reported as a part of the view
-     * hierarchy for accessibility purposes. This enables custom views that draw complex
-     * content to report them selves as a tree of virtual views, thus conveying their
-     * logical structure.
-     * </p>
-     * <p>
-     *   <strong>Note:</strong> Cannot be called from an
-     *   {@link android.accessibilityservice.AccessibilityService}.
-     *   This class is made immutable before being delivered to an AccessibilityService.
-     * </p>
-     *
-     * @param root The root of the virtual subtree.
-     * @param virtualDescendantId The id of the virtual descendant.
-     */
-    public void setParent(View root, int virtualDescendantId) {
-        IMPL.setParent(mInfo, root, virtualDescendantId);
-    }
-
-    /**
-     * Gets the node bounds in parent coordinates.
-     *
-     * @param outBounds The output node bounds.
-     */
-    public void getBoundsInParent(Rect outBounds) {
-        IMPL.getBoundsInParent(mInfo, outBounds);
-    }
-
-    /**
-     * Sets the node bounds in parent coordinates.
-     * <p>
-     * <strong>Note:</strong> Cannot be called from an
-     * {@link android.accessibilityservice.AccessibilityService}. This class is
-     * made immutable before being delivered to an AccessibilityService.
-     * </p>
-     *
-     * @param bounds The node bounds.
-     *@throws IllegalStateException If called from an AccessibilityService.
-     */
-    public void setBoundsInParent(Rect bounds) {
-        IMPL.setBoundsInParent(mInfo, bounds);
-    }
-
-    /**
-     * Gets the node bounds in screen coordinates.
-     *
-     * @param outBounds The output node bounds.
-     */
-    public void getBoundsInScreen(Rect outBounds) {
-        IMPL.getBoundsInScreen(mInfo, outBounds);
-    }
-
-    /**
-     * Sets the node bounds in screen coordinates.
-     * <p>
-     * <strong>Note:</strong> Cannot be called from an
-     * {@link android.accessibilityservice.AccessibilityService}. This class is
-     * made immutable before being delivered to an AccessibilityService.
-     * </p>
-     *
-     * @param bounds The node bounds.
-     * @throws IllegalStateException If called from an AccessibilityService.
-     */
-    public void setBoundsInScreen(Rect bounds) {
-        IMPL.setBoundsInScreen(mInfo, bounds);
-    }
-
-    /**
-     * Gets whether this node is checkable.
-     *
-     * @return True if the node is checkable.
-     */
-    public boolean isCheckable() {
-        return IMPL.isCheckable(mInfo);
-    }
-
-    /**
-     * Sets whether this node is checkable.
-     * <p>
-     * <strong>Note:</strong> Cannot be called from an
-     * {@link android.accessibilityservice.AccessibilityService}. This class is
-     * made immutable before being delivered to an AccessibilityService.
-     * </p>
-     *
-     * @param checkable True if the node is checkable.
-     * @throws IllegalStateException If called from an AccessibilityService.
-     */
-    public void setCheckable(boolean checkable) {
-        IMPL.setCheckable(mInfo, checkable);
-    }
-
-    /**
-     * Gets whether this node is checked.
-     *
-     * @return True if the node is checked.
-     */
-    public boolean isChecked() {
-        return IMPL.isChecked(mInfo);
-    }
-
-    /**
-     * Sets whether this node is checked.
-     * <p>
-     * <strong>Note:</strong> Cannot be called from an
-     * {@link android.accessibilityservice.AccessibilityService}. This class is
-     * made immutable before being delivered to an AccessibilityService.
-     * </p>
-     *
-     * @param checked True if the node is checked.
-     * @throws IllegalStateException If called from an AccessibilityService.
-     */
-    public void setChecked(boolean checked) {
-        IMPL.setChecked(mInfo, checked);
-    }
-
-    /**
-     * Gets whether this node is focusable.
-     *
-     * @return True if the node is focusable.
-     */
-    public boolean isFocusable() {
-        return IMPL.isFocusable(mInfo);
-    }
-
-    /**
-     * Sets whether this node is focusable.
-     * <p>
-     * <strong>Note:</strong> Cannot be called from an
-     * {@link android.accessibilityservice.AccessibilityService}. This class is
-     * made immutable before being delivered to an AccessibilityService.
-     * </p>
-     *
-     * @param focusable True if the node is focusable.
-     * @throws IllegalStateException If called from an AccessibilityService.
-     */
-    public void setFocusable(boolean focusable) {
-        IMPL.setFocusable(mInfo, focusable);
-    }
-
-    /**
-     * Gets whether this node is focused.
-     *
-     * @return True if the node is focused.
-     */
-    public boolean isFocused() {
-        return IMPL.isFocused(mInfo);
-    }
-
-    /**
-     * Sets whether this node is focused.
-     * <p>
-     * <strong>Note:</strong> Cannot be called from an
-     * {@link android.accessibilityservice.AccessibilityService}. This class is
-     * made immutable before being delivered to an AccessibilityService.
-     * </p>
-     *
-     * @param focused True if the node is focused.
-     * @throws IllegalStateException If called from an AccessibilityService.
-     */
-    public void setFocused(boolean focused) {
-        IMPL.setFocused(mInfo, focused);
-    }
-
-    /**
-     * Sets whether this node is visible to the user.
-     *
-     * @return Whether the node is visible to the user.
-     */
-    public boolean isVisibleToUser() {
-        return IMPL.isVisibleToUser(mInfo);
-    }
-
-    /**
-     * Sets whether this node is visible to the user.
-     * <p>
-     *   <strong>Note:</strong> Cannot be called from an
-     *   {@link android.accessibilityservice.AccessibilityService}.
-     *   This class is made immutable before being delivered to an AccessibilityService.
-     * </p>
-     *
-     * @param visibleToUser Whether the node is visible to the user.
-     *
-     * @throws IllegalStateException If called from an AccessibilityService.
-     */
-    public void setVisibleToUser(boolean visibleToUser) {
-        IMPL.setVisibleToUser(mInfo, visibleToUser);
-    }
-
-    /**
-     * Gets whether this node is accessibility focused.
-     *
-     * @return True if the node is accessibility focused.
-     */
-    public boolean isAccessibilityFocused() {
-        return IMPL.isAccessibilityFocused(mInfo);
-    }
-
-    /**
-     * Sets whether this node is accessibility focused.
-     * <p>
-     *   <strong>Note:</strong> Cannot be called from an
-     *   {@link android.accessibilityservice.AccessibilityService}.
-     *   This class is made immutable before being delivered to an AccessibilityService.
-     * </p>
-     *
-     * @param focused True if the node is accessibility focused.
-     *
-     * @throws IllegalStateException If called from an AccessibilityService.
-     */
-    public void setAccessibilityFocused(boolean focused) {
-        IMPL.setAccessibilityFocused(mInfo, focused);
-    }
-
-    /**
-     * Gets whether this node is selected.
-     *
-     * @return True if the node is selected.
-     */
-    public boolean isSelected() {
-        return IMPL.isSelected(mInfo);
-    }
-
-    /**
-     * Sets whether this node is selected.
-     * <p>
-     * <strong>Note:</strong> Cannot be called from an
-     * {@link android.accessibilityservice.AccessibilityService}. This class is
-     * made immutable before being delivered to an AccessibilityService.
-     * </p>
-     *
-     * @param selected True if the node is selected.
-     * @throws IllegalStateException If called from an AccessibilityService.
-     */
-    public void setSelected(boolean selected) {
-        IMPL.setSelected(mInfo, selected);
-    }
-
-    /**
-     * Gets whether this node is clickable.
-     *
-     * @return True if the node is clickable.
-     */
-    public boolean isClickable() {
-        return IMPL.isClickable(mInfo);
-    }
-
-    /**
-     * Sets whether this node is clickable.
-     * <p>
-     * <strong>Note:</strong> Cannot be called from an
-     * {@link android.accessibilityservice.AccessibilityService}. This class is
-     * made immutable before being delivered to an AccessibilityService.
-     * </p>
-     *
-     * @param clickable True if the node is clickable.
-     * @throws IllegalStateException If called from an AccessibilityService.
-     */
-    public void setClickable(boolean clickable) {
-        IMPL.setClickable(mInfo, clickable);
-    }
-
-    /**
-     * Gets whether this node is long clickable.
-     *
-     * @return True if the node is long clickable.
-     */
-    public boolean isLongClickable() {
-        return IMPL.isLongClickable(mInfo);
-    }
-
-    /**
-     * Sets whether this node is long clickable.
-     * <p>
-     * <strong>Note:</strong> Cannot be called from an
-     * {@link android.accessibilityservice.AccessibilityService}. This class is
-     * made immutable before being delivered to an AccessibilityService.
-     * </p>
-     *
-     * @param longClickable True if the node is long clickable.
-     * @throws IllegalStateException If called from an AccessibilityService.
-     */
-    public void setLongClickable(boolean longClickable) {
-        IMPL.setLongClickable(mInfo, longClickable);
-    }
-
-    /**
-     * Gets whether this node is enabled.
-     *
-     * @return True if the node is enabled.
-     */
-    public boolean isEnabled() {
-        return IMPL.isEnabled(mInfo);
-    }
-
-    /**
-     * Sets whether this node is enabled.
-     * <p>
-     * <strong>Note:</strong> Cannot be called from an
-     * {@link android.accessibilityservice.AccessibilityService}. This class is
-     * made immutable before being delivered to an AccessibilityService.
-     * </p>
-     *
-     * @param enabled True if the node is enabled.
-     * @throws IllegalStateException If called from an AccessibilityService.
-     */
-    public void setEnabled(boolean enabled) {
-        IMPL.setEnabled(mInfo, enabled);
-    }
-
-    /**
-     * Gets whether this node is a password.
-     *
-     * @return True if the node is a password.
-     */
-    public boolean isPassword() {
-        return IMPL.isPassword(mInfo);
-    }
-
-    /**
-     * Sets whether this node is a password.
-     * <p>
-     * <strong>Note:</strong> Cannot be called from an
-     * {@link android.accessibilityservice.AccessibilityService}. This class is
-     * made immutable before being delivered to an AccessibilityService.
-     * </p>
-     *
-     * @param password True if the node is a password.
-     * @throws IllegalStateException If called from an AccessibilityService.
-     */
-    public void setPassword(boolean password) {
-        IMPL.setPassword(mInfo, password);
-    }
-
-    /**
-     * Gets if the node is scrollable.
-     *
-     * @return True if the node is scrollable, false otherwise.
-     */
-    public boolean isScrollable() {
-        return IMPL.isScrollable(mInfo);
-    }
-
-    /**
-     * Sets if the node is scrollable.
-     * <p>
-     * <strong>Note:</strong> Cannot be called from an
-     * {@link android.accessibilityservice.AccessibilityService}. This class is
-     * made immutable before being delivered to an AccessibilityService.
-     * </p>
-     *
-     * @param scrollable True if the node is scrollable, false otherwise.
-     * @throws IllegalStateException If called from an AccessibilityService.
-     */
-    public void setScrollable(boolean scrollable) {
-        IMPL.setScrollable(mInfo, scrollable);
-    }
-
-    /**
-     * Returns whether the node originates from a view considered important for accessibility.
-     *
-     * @return {@code true} if the node originates from a view considered important for
-     *         accessibility, {@code false} otherwise
-     *
-     * @see View#isImportantForAccessibility()
-     */
-    public boolean isImportantForAccessibility() {
-        return IMPL.isImportantForAccessibility(mInfo);
-    }
-
-    /**
-     * Sets whether the node is considered important for accessibility.
-     * <p>
-     *   <strong>Note:</strong> Cannot be called from an
-     *   {@link android.accessibilityservice.AccessibilityService}.
-     *   This class is made immutable before being delivered to an AccessibilityService.
-     * </p>
-     *
-     * @param important {@code true} if the node is considered important for accessibility,
-     *                  {@code false} otherwise
-     */
-    public void setImportantForAccessibility(boolean important) {
-        IMPL.setImportantForAccessibility(mInfo, important);
-    }
-
-    /**
-     * Gets the package this node comes from.
-     *
-     * @return The package name.
-     */
-    public CharSequence getPackageName() {
-        return IMPL.getPackageName(mInfo);
-    }
-
-    /**
-     * Sets the package this node comes from.
-     * <p>
-     * <strong>Note:</strong> Cannot be called from an
-     * {@link android.accessibilityservice.AccessibilityService}. This class is
-     * made immutable before being delivered to an AccessibilityService.
-     * </p>
-     *
-     * @param packageName The package name.
-     * @throws IllegalStateException If called from an AccessibilityService.
-     */
-    public void setPackageName(CharSequence packageName) {
-        IMPL.setPackageName(mInfo, packageName);
-    }
-
-    /**
-     * Gets the class this node comes from.
-     *
-     * @return The class name.
-     */
-    public CharSequence getClassName() {
-        return IMPL.getClassName(mInfo);
-    }
-
-    /**
-     * Sets the class this node comes from.
-     * <p>
-     * <strong>Note:</strong> Cannot be called from an
-     * {@link android.accessibilityservice.AccessibilityService}. This class is
-     * made immutable before being delivered to an AccessibilityService.
-     * </p>
-     *
-     * @param className The class name.
-     * @throws IllegalStateException If called from an AccessibilityService.
-     */
-    public void setClassName(CharSequence className) {
-        IMPL.setClassName(mInfo, className);
-    }
-
-    /**
-     * Gets the text of this node.
-     *
-     * @return The text.
-     */
-    public CharSequence getText() {
-        return IMPL.getText(mInfo);
-    }
-
-    /**
-     * Sets the text of this node.
-     * <p>
-     * <strong>Note:</strong> Cannot be called from an
-     * {@link android.accessibilityservice.AccessibilityService}. This class is
-     * made immutable before being delivered to an AccessibilityService.
-     * </p>
-     *
-     * @param text The text.
-     * @throws IllegalStateException If called from an AccessibilityService.
-     */
-    public void setText(CharSequence text) {
-        IMPL.setText(mInfo, text);
-    }
-
-    /**
-     * Gets the content description of this node.
-     *
-     * @return The content description.
-     */
-    public CharSequence getContentDescription() {
-        return IMPL.getContentDescription(mInfo);
-    }
-
-    /**
-     * Sets the content description of this node.
-     * <p>
-     * <strong>Note:</strong> Cannot be called from an
-     * {@link android.accessibilityservice.AccessibilityService}. This class is
-     * made immutable before being delivered to an AccessibilityService.
-     * </p>
-     *
-     * @param contentDescription The content description.
-     * @throws IllegalStateException If called from an AccessibilityService.
-     */
-    public void setContentDescription(CharSequence contentDescription) {
-        IMPL.setContentDescription(mInfo, contentDescription);
-    }
-
-    /**
-     * Return an instance back to be reused.
-     * <p>
-     * <strong>Note:</strong> You must not touch the object after calling this function.
-     *
-     * @throws IllegalStateException If the info is already recycled.
-     */
-    public void recycle() {
-        IMPL.recycle(mInfo);
-    }
-
-    /**
-     * Sets the fully qualified resource name of the source view's id.
-     *
-     * <p>
-     *   <strong>Note:</strong> Cannot be called from an
-     *   {@link android.accessibilityservice.AccessibilityService}.
-     *   This class is made immutable before being delivered to an AccessibilityService.
-     * </p>
-     *
-     * @param viewId The id resource name.
-     */
-    public void setViewIdResourceName(String viewId) {
-        IMPL.setViewIdResourceName(mInfo, viewId);
-    }
-
-    /**
-     * Gets the fully qualified resource name of the source view's id.
-     *
-     * <p>
-     *   <strong>Note:</strong> The primary usage of this API is for UI test automation
-     *   and in order to report the source view id of an {@link AccessibilityNodeInfoCompat}
-     *   the client has to set the {@link AccessibilityServiceInfoCompat#FLAG_REPORT_VIEW_IDS}
-     *   flag when configuring his {@link android.accessibilityservice.AccessibilityService}.
-     * </p>
-     *
-     * @return The id resource name.
-     */
-    public String getViewIdResourceName() {
-        return IMPL.getViewIdResourceName(mInfo);
-    }
-
-    /**
-     * Gets the node's live region mode.
-     * <p>
-     * A live region is a node that contains information that is important for
-     * the user and when it changes the user should be notified. For example,
-     * in a login screen with a TextView that displays an "incorrect password"
-     * notification, that view should be marked as a live region with mode
-     * {@link ViewCompat#ACCESSIBILITY_LIVE_REGION_POLITE}.
-     * <p>
-     * It is the responsibility of the accessibility service to monitor
-     * {@link AccessibilityEventCompat#TYPE_WINDOW_CONTENT_CHANGED} events
-     * indicating changes to live region nodes and their children.
-     *
-     * @return The live region mode, or
-     *         {@link ViewCompat#ACCESSIBILITY_LIVE_REGION_NONE} if the view is
-     *         not a live region.
-     * @see ViewCompat#getAccessibilityLiveRegion(View)
-     */
-    public int getLiveRegion() {
-        return IMPL.getLiveRegion(mInfo);
-    }
-
-    /**
-     * Sets the node's live region mode.
-     * <p>
-     * <strong>Note:</strong> Cannot be called from an
-     * {@link android.accessibilityservice.AccessibilityService}. This class is
-     * made immutable before being delivered to an AccessibilityService.
-     *
-     * @param mode The live region mode, or
-     *        {@link ViewCompat#ACCESSIBILITY_LIVE_REGION_NONE} if the view is
-     *        not a live region.
-     * @see ViewCompat#setAccessibilityLiveRegion(View, int)
-     */
-    public void setLiveRegion(int mode) {
-        IMPL.setLiveRegion(mInfo, mode);
-    }
-
-    /**
-     * Get the drawing order of the view corresponding it this node.
-     * <p>
-     * Drawing order is determined only within the node's parent, so this index is only relative
-     * to its siblings.
-     * <p>
-     * In some cases, the drawing order is essentially simultaneous, so it is possible for two
-     * siblings to return the same value. It is also possible that values will be skipped.
-     *
-     * @return The drawing position of the view corresponding to this node relative to its siblings.
-     */
-    public int getDrawingOrder() {
-        return IMPL.getDrawingOrder(mInfo);
-    }
-
-    /**
-     * Set the drawing order of the view corresponding it this node.
-     *
-     * <p>
-     *   <strong>Note:</strong> Cannot be called from an
-     *   {@link android.accessibilityservice.AccessibilityService}.
-     *   This class is made immutable before being delivered to an AccessibilityService.
-     * </p>
-     * @param drawingOrderInParent
-     * @throws IllegalStateException If called from an AccessibilityService.
-     */
-    public void setDrawingOrder(int drawingOrderInParent) {
-        IMPL.setDrawingOrder(mInfo, drawingOrderInParent);
-    }
-
-    /**
-     * Gets the collection info if the node is a collection. A collection
-     * child is always a collection item.
-     *
-     * @return The collection info.
-     */
-    public CollectionInfoCompat getCollectionInfo() {
-        Object info = IMPL.getCollectionInfo(mInfo);
-        if (info == null) return null;
-        return new CollectionInfoCompat(info);
-    }
-
-    public void setCollectionInfo(Object collectionInfo) {
-        IMPL.setCollectionInfo(mInfo, ((CollectionInfoCompat) collectionInfo).mInfo);
-    }
-
-    public void setCollectionItemInfo(Object collectionItemInfo) {
-        IMPL.setCollectionItemInfo(mInfo, ((CollectionItemInfoCompat) collectionItemInfo).mInfo);
-    }
-
-    /**
-     * Gets the collection item info if the node is a collection item. A collection
-     * item is always a child of a collection.
-     *
-     * @return The collection item info.
-     */
-    public CollectionItemInfoCompat getCollectionItemInfo() {
-        Object info = IMPL.getCollectionItemInfo(mInfo);
-        if (info == null) return null;
-        return new CollectionItemInfoCompat(info);
-    }
-
-    /**
-     * Gets the range info if this node is a range.
-     *
-     * @return The range.
-     */
-    public RangeInfoCompat getRangeInfo() {
-        Object info = IMPL.getRangeInfo(mInfo);
-        if (info == null) return null;
-        return new RangeInfoCompat(info);
-    }
-
-    /**
-     * Sets the range info if this node is a range.
-     * <p>
-     *   <strong>Note:</strong> Cannot be called from an
-     *   {@link android.accessibilityservice.AccessibilityService}.
-     *   This class is made immutable before being delivered to an AccessibilityService.
-     * </p>
-     *
-     * @param rangeInfo The range info.
-     */
-    public void setRangeInfo(RangeInfoCompat rangeInfo) {
-        IMPL.setRangeInfo(mInfo, rangeInfo.mInfo);
-    }
-
-    /**
-     * Gets the actions that can be performed on the node.
-     *
-     * @return A list of AccessibilityActions.
-     */
-    public List<AccessibilityActionCompat> getActionList() {
-        List<Object> actions = IMPL.getActionList(mInfo);
-        if (actions != null) {
-            List<AccessibilityActionCompat> result = new ArrayList<AccessibilityActionCompat>();
-            final int actionCount = actions.size();
-            for (int i = 0; i < actionCount; i++) {
-                Object action = actions.get(i);
-                result.add(new AccessibilityActionCompat(action));
-            }
-            return result;
-        } else {
-            return Collections.<AccessibilityActionCompat>emptyList();
-        }
-    }
-
-    /**
-     * Sets if the content of this node is invalid. For example,
-     * a date is not well-formed.
-     * <p>
-     *   <strong>Note:</strong> Cannot be called from an
-     *   {@link android.accessibilityservice.AccessibilityService}.
-     *   This class is made immutable before being delivered to an AccessibilityService.
-     * </p>
-     *
-     * @param contentInvalid If the node content is invalid.
-     */
-    public void setContentInvalid(boolean contentInvalid) {
-        IMPL.setContentInvalid(mInfo, contentInvalid);
-    }
-
-    /**
-     * Gets if the content of this node is invalid. For example,
-     * a date is not well-formed.
-     *
-     * @return If the node content is invalid.
-     */
-    public boolean isContentInvalid() {
-        return IMPL.isContentInvalid(mInfo);
-    }
-
-    /**
-     * Sets the error text of this node.
-     * <p>
-     *   <strong>Note:</strong> Cannot be called from an
-     *   {@link android.accessibilityservice.AccessibilityService}.
-     *   This class is made immutable before being delivered to an AccessibilityService.
-     * </p>
-     *
-     * @param error The error text.
-     *
-     * @throws IllegalStateException If called from an AccessibilityService.
-     */
-    public void setError(CharSequence error) {
-        IMPL.setError(mInfo, error);
-    }
-
-    /**
-     * Gets the error text of this node.
-     *
-     * @return The error text.
-     */
-    public CharSequence getError() {
-        return IMPL.getError(mInfo);
-    }
-
-    /**
-     * Sets the view for which the view represented by this info serves as a
-     * label for accessibility purposes.
-     *
-     * @param labeled The view for which this info serves as a label.
-     */
-    public void setLabelFor(View labeled) {
-        IMPL.setLabelFor(mInfo, labeled);
-    }
-
-    /**
-     * Sets the view for which the view represented by this info serves as a
-     * label for accessibility purposes. If <code>virtualDescendantId</code>
-     * is {@link View#NO_ID} the root is set as the labeled.
-     * <p>
-     * A virtual descendant is an imaginary View that is reported as a part of the view
-     * hierarchy for accessibility purposes. This enables custom views that draw complex
-     * content to report themselves as a tree of virtual views, thus conveying their
-     * logical structure.
-     * </p>
-     *
-     * @param root The root whose virtual descendant serves as a label.
-     * @param virtualDescendantId The id of the virtual descendant.
-     */
-    public void setLabelFor(View root, int virtualDescendantId) {
-        IMPL.setLabelFor(mInfo, root, virtualDescendantId);
-    }
-
-    /**
-     * Gets the node info for which the view represented by this info serves as
-     * a label for accessibility purposes.
-     * <p>
-     *   <strong>Note:</strong> It is a client responsibility to recycle the
-     *     received info by calling {@link AccessibilityNodeInfoCompat#recycle()}
-     *     to avoid creating of multiple instances.
-     * </p>
-     *
-     * @return The labeled info.
-     */
-    public AccessibilityNodeInfoCompat getLabelFor() {
-        return AccessibilityNodeInfoCompat.wrapNonNullInstance(IMPL.getLabelFor(mInfo));
-    }
-
-    /**
-     * Sets the view which serves as the label of the view represented by
-     * this info for accessibility purposes.
-     *
-     * @param label The view that labels this node's source.
-     */
-    public void setLabeledBy(View label) {
-        IMPL.setLabeledBy(mInfo, label);
-    }
-
-    /**
-     * Sets the view which serves as the label of the view represented by
-     * this info for accessibility purposes. If <code>virtualDescendantId</code>
-     * is {@link View#NO_ID} the root is set as the label.
-     * <p>
-     * A virtual descendant is an imaginary View that is reported as a part of the view
-     * hierarchy for accessibility purposes. This enables custom views that draw complex
-     * content to report themselves as a tree of virtual views, thus conveying their
-     * logical structure.
-     * </p>
-     * <p>
-     *   <strong>Note:</strong> Cannot be called from an
-     *   {@link android.accessibilityservice.AccessibilityService}.
-     *   This class is made immutable before being delivered to an AccessibilityService.
-     * </p>
-     *
-     * @param root The root whose virtual descendant labels this node's source.
-     * @param virtualDescendantId The id of the virtual descendant.
-     */
-    public void setLabeledBy(View root, int virtualDescendantId) {
-        IMPL.setLabeledBy(mInfo, root, virtualDescendantId);
-    }
-
-    /**
-     * Gets the node info which serves as the label of the view represented by
-     * this info for accessibility purposes.
-     * <p>
-     *   <strong>Note:</strong> It is a client responsibility to recycle the
-     *     received info by calling {@link AccessibilityNodeInfoCompat#recycle()}
-     *     to avoid creating of multiple instances.
-     * </p>
-     *
-     * @return The label.
-     */
-    public AccessibilityNodeInfoCompat getLabeledBy() {
-        return AccessibilityNodeInfoCompat.wrapNonNullInstance(IMPL.getLabeledBy(mInfo));
-    }
-
-    /**
-     * Gets if this node opens a popup or a dialog.
-     *
-     * @return If the the node opens a popup.
-     */
-    public boolean canOpenPopup() {
-        return IMPL.canOpenPopup(mInfo);
-    }
-
-    /**
-     * Sets if this node opens a popup or a dialog.
-     * <p>
-     *   <strong>Note:</strong> Cannot be called from an
-     *   {@link android.accessibilityservice.AccessibilityService}.
-     *   This class is made immutable before being delivered to an AccessibilityService.
-     * </p>
-     *
-     * @param opensPopup If the the node opens a popup.
-     */
-    public void setCanOpenPopup(boolean opensPopup) {
-        IMPL.setCanOpenPopup(mInfo, opensPopup);
-    }
-
-    /**
-     * Finds {@link AccessibilityNodeInfoCompat}s by the fully qualified view id's resource
-     * name where a fully qualified id is of the from "package:id/id_resource_name".
-     * For example, if the target application's package is "foo.bar" and the id
-     * resource name is "baz", the fully qualified resource id is "foo.bar:id/baz".
-     *
-     * <p>
-     *   <strong>Note:</strong> It is a client responsibility to recycle the
-     *     received info by calling {@link AccessibilityNodeInfoCompat#recycle()}
-     *     to avoid creating of multiple instances.
-     * </p>
-     * <p>
-     *   <strong>Note:</strong> The primary usage of this API is for UI test automation
-     *   and in order to report the fully qualified view id if an
-     *   {@link AccessibilityNodeInfoCompat} the client has to set the
-     *   {@link android.accessibilityservice.AccessibilityServiceInfo#FLAG_REPORT_VIEW_IDS}
-     *   flag when configuring his {@link android.accessibilityservice.AccessibilityService}.
-     * </p>
-     *
-     * @param viewId The fully qualified resource name of the view id to find.
-     * @return A list of node info.
-     */
-    public List<AccessibilityNodeInfoCompat> findAccessibilityNodeInfosByViewId(String viewId) {
-        List<Object> nodes = IMPL.findAccessibilityNodeInfosByViewId(mInfo, viewId);
-        if (nodes != null) {
-            List<AccessibilityNodeInfoCompat> result = new ArrayList<AccessibilityNodeInfoCompat>();
-            for (Object node : nodes) {
-                result.add(new AccessibilityNodeInfoCompat(node));
-            }
-            return result;
-        } else {
-            return Collections.emptyList();
-        }
-    }
-
-    /**
-     * Gets an optional bundle with extra data. The bundle
-     * is lazily created and never <code>null</code>.
-     * <p>
-     * <strong>Note:</strong> It is recommended to use the package
-     * name of your application as a prefix for the keys to avoid
-     * collisions which may confuse an accessibility service if the
-     * same key has different meaning when emitted from different
-     * applications.
-     * </p>
-     *
-     * @return The bundle.
-     */
-    public Bundle getExtras() {
-        return IMPL.getExtras(mInfo);
-    }
-
-    /**
-     * Gets the input type of the source as defined by {@link InputType}.
-     *
-     * @return The input type.
-     */
-    public int getInputType() {
-        return IMPL.getInputType(mInfo);
-    }
-
-    /**
-     * Sets the input type of the source as defined by {@link InputType}.
-     * <p>
-     *   <strong>Note:</strong> Cannot be called from an
-     *   {@link android.accessibilityservice.AccessibilityService}.
-     *   This class is made immutable before being delivered to an
-     *   AccessibilityService.
-     * </p>
-     *
-     * @param inputType The input type.
-     *
-     * @throws IllegalStateException If called from an AccessibilityService.
-     */
-    public void setInputType(int inputType) {
-        IMPL.setInputType(mInfo, inputType);
-    }
-
-    /**
-     * Sets the maximum text length, or -1 for no limit.
-     * <p>
-     * Typically used to indicate that an editable text field has a limit on
-     * the number of characters entered.
-     * <p>
-     * <strong>Note:</strong> Cannot be called from an
-     * {@link android.accessibilityservice.AccessibilityService}.
-     * This class is made immutable before being delivered to an AccessibilityService.
-     *
-     * @param max The maximum text length.
-     * @see #getMaxTextLength()
-     *
-     * @throws IllegalStateException If called from an AccessibilityService.
-     */
-    public void setMaxTextLength(int max) {
-        IMPL.setMaxTextLength(mInfo, max);
-    }
-
-    /**
-     * Returns the maximum text length for this node.
-     *
-     * @return The maximum text length, or -1 for no limit.
-     * @see #setMaxTextLength(int)
-     */
-    public int getMaxTextLength() {
-        return IMPL.getMaxTextLength(mInfo);
-    }
-
-    /**
-     * Sets the text selection start and end.
-     * <p>
-     *   <strong>Note:</strong> Cannot be called from an
-     *   {@link android.accessibilityservice.AccessibilityService}.
-     *   This class is made immutable before being delivered to an AccessibilityService.
-     * </p>
-     *
-     * @param start The text selection start.
-     * @param end The text selection end.
-     *
-     * @throws IllegalStateException If called from an AccessibilityService.
-     */
-    public void setTextSelection(int start, int end) {
-        IMPL.setTextSelection(mInfo, start, end);
-    }
-
-    /**
-     * Gets the text selection start.
-     *
-     * @return The text selection start if there is selection or -1.
-     */
-    public int getTextSelectionStart() {
-        return IMPL.getTextSelectionStart(mInfo);
-    }
-
-    /**
-     * Gets the text selection end.
-     *
-     * @return The text selection end if there is selection or -1.
-     */
-    public int getTextSelectionEnd() {
-        return IMPL.getTextSelectionEnd(mInfo);
-    }
-
-    /**
-     * Gets the node before which this one is visited during traversal. A screen-reader
-     * must visit the content of this node before the content of the one it precedes.
-     *
-     * @return The succeeding node if such or <code>null</code>.
-     *
-     * @see #setTraversalBefore(android.view.View)
-     * @see #setTraversalBefore(android.view.View, int)
-     */
-    public AccessibilityNodeInfoCompat getTraversalBefore() {
-        return AccessibilityNodeInfoCompat.wrapNonNullInstance(IMPL.getTraversalBefore(mInfo));
-    }
-
-    /**
-     * Sets the view before whose node this one should be visited during traversal. A
-     * screen-reader must visit the content of this node before the content of the one
-     * it precedes.
-     * <p>
-     *   <strong>Note:</strong> Cannot be called from an
-     *   {@link android.accessibilityservice.AccessibilityService}.
-     *   This class is made immutable before being delivered to an AccessibilityService.
-     * </p>
-     *
-     * @param view The view providing the preceding node.
-     *
-     * @see #getTraversalBefore()
-     */
-    public void setTraversalBefore(View view) {
-        IMPL.setTraversalBefore(mInfo, view);
-    }
-
-    /**
-     * Sets the node before which this one is visited during traversal. A screen-reader
-     * must visit the content of this node before the content of the one it precedes.
-     * The successor is a virtual descendant of the given <code>root</code>. If
-     * <code>virtualDescendantId</code> equals to {@link View#NO_ID} the root is set
-     * as the successor.
-     * <p>
-     * A virtual descendant is an imaginary View that is reported as a part of the view
-     * hierarchy for accessibility purposes. This enables custom views that draw complex
-     * content to report them selves as a tree of virtual views, thus conveying their
-     * logical structure.
-     * </p>
-     * <p>
-     *   <strong>Note:</strong> Cannot be called from an
-     *   {@link android.accessibilityservice.AccessibilityService}.
-     *   This class is made immutable before being delivered to an AccessibilityService.
-     * </p>
-     *
-     * @param root The root of the virtual subtree.
-     * @param virtualDescendantId The id of the virtual descendant.
-     */
-    public void setTraversalBefore(View root, int virtualDescendantId) {
-        IMPL.setTraversalBefore(mInfo, root, virtualDescendantId);
-    }
-
-    /**
-     * Gets the node after which this one is visited in accessibility traversal.
-     * A screen-reader must visit the content of the other node before the content
-     * of this one.
-     *
-     * @return The succeeding node if such or <code>null</code>.
-     *
-     * @see #setTraversalAfter(android.view.View)
-     * @see #setTraversalAfter(android.view.View, int)
-     */
-    public AccessibilityNodeInfoCompat getTraversalAfter() {
-        return AccessibilityNodeInfoCompat.wrapNonNullInstance(IMPL.getTraversalAfter(mInfo));
-    }
-
-    /**
-     * Sets the view whose node is visited after this one in accessibility traversal.
-     * A screen-reader must visit the content of the other node before the content
-     * of this one.
-     * <p>
-     *   <strong>Note:</strong> Cannot be called from an
-     *   {@link android.accessibilityservice.AccessibilityService}.
-     *   This class is made immutable before being delivered to an AccessibilityService.
-     * </p>
-     *
-     * @param view The previous view.
-     *
-     * @see #getTraversalAfter()
-     */
-    public void setTraversalAfter(View view) {
-        IMPL.setTraversalAfter(mInfo, view);
-    }
-
-    /**
-     * Sets the node after which this one is visited in accessibility traversal.
-     * A screen-reader must visit the content of the other node before the content
-     * of this one. If <code>virtualDescendantId</code> equals to {@link View#NO_ID}
-     * the root is set as the predecessor.
-     * <p>
-     * A virtual descendant is an imaginary View that is reported as a part of the view
-     * hierarchy for accessibility purposes. This enables custom views that draw complex
-     * content to report them selves as a tree of virtual views, thus conveying their
-     * logical structure.
-     * </p>
-     * <p>
-     *   <strong>Note:</strong> Cannot be called from an
-     *   {@link android.accessibilityservice.AccessibilityService}.
-     *   This class is made immutable before being delivered to an AccessibilityService.
-     * </p>
-     *
-     * @param root The root of the virtual subtree.
-     * @param virtualDescendantId The id of the virtual descendant.
-     */
-    public void setTraversalAfter(View root, int virtualDescendantId) {
-        IMPL.setTraversalAfter(mInfo, root, virtualDescendantId);
-    }
-
-    /**
-     * Gets the window to which this node belongs.
-     *
-     * @return The window.
-     *
-     * @see android.accessibilityservice.AccessibilityService#getWindows()
-     */
-    public AccessibilityWindowInfoCompat getWindow() {
-        return AccessibilityWindowInfoCompat.wrapNonNullInstance(IMPL.getWindow(mInfo));
-    }
-
-    /**
-     * Gets if the node can be dismissed.
-     *
-     * @return If the node can be dismissed.
-     */
-    public boolean isDismissable() {
-        return IMPL.isDismissable(mInfo);
-    }
-
-    /**
-     * Sets if the node can be dismissed.
-     * <p>
-     *   <strong>Note:</strong> Cannot be called from an
-     *   {@link android.accessibilityservice.AccessibilityService}.
-     *   This class is made immutable before being delivered to an AccessibilityService.
-     * </p>
-     *
-     * @param dismissable If the node can be dismissed.
-     */
-    public void setDismissable(boolean dismissable) {
-        IMPL.setDismissable(mInfo, dismissable);
-    }
-
-    /**
-     * Gets if the node is editable.
-     *
-     * @return True if the node is editable, false otherwise.
-     */
-    public boolean isEditable() {
-        return IMPL.isEditable(mInfo);
-    }
-
-    /**
-     * Sets whether this node is editable.
-     * <p>
-     *   <strong>Note:</strong> Cannot be called from an
-     *   {@link android.accessibilityservice.AccessibilityService}.
-     *   This class is made immutable before being delivered to an AccessibilityService.
-     * </p>
-     *
-     * @param editable True if the node is editable.
-     *
-     * @throws IllegalStateException If called from an AccessibilityService.
-     */
-    public void setEditable(boolean editable) {
-        IMPL.setEditable(mInfo, editable);
-    }
-
-    /**
-     * Gets if the node is a multi line editable text.
-     *
-     * @return True if the node is multi line.
-     */
-    public boolean isMultiLine() {
-        return IMPL.isMultiLine(mInfo);
-    }
-
-    /**
-     * Sets if the node is a multi line editable text.
-     * <p>
-     *   <strong>Note:</strong> Cannot be called from an
-     *   {@link android.accessibilityservice.AccessibilityService}.
-     *   This class is made immutable before being delivered to an AccessibilityService.
-     * </p>
-     *
-     * @param multiLine True if the node is multi line.
-     */
-    public void setMultiLine(boolean multiLine) {
-        IMPL.setMultiLine(mInfo, multiLine);
-    }
-
-    /**
-     * Refreshes this info with the latest state of the view it represents.
-     * <p>
-     * <strong>Note:</strong> If this method returns false this info is obsolete
-     * since it represents a view that is no longer in the view tree and should
-     * be recycled.
-     * </p>
-     * @return Whether the refresh succeeded.
-     */
-    public boolean refresh() {
-        return IMPL.refresh(mInfo);
-    }
-
-    /**
-     * Gets the custom role description.
-     * @return The role description.
-     */
-    public @Nullable CharSequence getRoleDescription() {
-        return IMPL.getRoleDescription(mInfo);
-    }
-
-    /**
-     * Sets the custom role description.
-     *
-     * <p>
-     *   The role description allows you to customize the name for the view's semantic
-     *   role. For example, if you create a custom subclass of {@link android.view.View}
-     *   to display a menu bar, you could assign it the role description of "menu bar".
-     * </p>
-     * <p>
-     *   <strong>Warning:</strong> For consistency with other applications, you should
-     *   not use the role description to force accessibility services to describe
-     *   standard views (such as buttons or checkboxes) using specific wording. For
-     *   example, you should not set a role description of "check box" or "tick box" for
-     *   a standard {@link android.widget.CheckBox}. Instead let accessibility services
-     *   decide what feedback to provide.
-     * </p>
-     * <p>
-     *   <strong>Note:</strong> Cannot be called from an
-     *   {@link android.accessibilityservice.AccessibilityService}.
-     *   This class is made immutable before being delivered to an AccessibilityService.
-     * </p>
-     *
-     * @param roleDescription The role description.
-     */
-    public void setRoleDescription(@Nullable CharSequence roleDescription) {
-        IMPL.setRoleDescription(mInfo, roleDescription);
-    }
-
-    @Override
-    public int hashCode() {
-        return (mInfo == null) ? 0 : mInfo.hashCode();
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (obj == null) {
-            return false;
-        }
-        if (getClass() != obj.getClass()) {
-            return false;
-        }
-        AccessibilityNodeInfoCompat other = (AccessibilityNodeInfoCompat) obj;
-        if (mInfo == null) {
-            if (other.mInfo != null) {
-                return false;
-            }
-        } else if (!mInfo.equals(other.mInfo)) {
-            return false;
-        }
-        return true;
-    }
-
-    @Override
-    public String toString() {
-        StringBuilder builder = new StringBuilder();
-        builder.append(super.toString());
-
-        Rect bounds = new Rect();
-
-        getBoundsInParent(bounds);
-        builder.append("; boundsInParent: " + bounds);
-
-        getBoundsInScreen(bounds);
-        builder.append("; boundsInScreen: " + bounds);
-
-        builder.append("; packageName: ").append(getPackageName());
-        builder.append("; className: ").append(getClassName());
-        builder.append("; text: ").append(getText());
-        builder.append("; contentDescription: ").append(getContentDescription());
-        builder.append("; viewId: ").append(getViewIdResourceName());
-
-        builder.append("; checkable: ").append(isCheckable());
-        builder.append("; checked: ").append(isChecked());
-        builder.append("; focusable: ").append(isFocusable());
-        builder.append("; focused: ").append(isFocused());
-        builder.append("; selected: ").append(isSelected());
-        builder.append("; clickable: ").append(isClickable());
-        builder.append("; longClickable: ").append(isLongClickable());
-        builder.append("; enabled: ").append(isEnabled());
-        builder.append("; password: ").append(isPassword());
-        builder.append("; scrollable: " + isScrollable());
-
-        builder.append("; [");
-        for (int actionBits = getActions(); actionBits != 0;) {
-            final int action = 1 << Integer.numberOfTrailingZeros(actionBits);
-            actionBits &= ~action;
-            builder.append(getActionSymbolicName(action));
-            if (actionBits != 0) {
-                builder.append(", ");
-            }
-        }
-        builder.append("]");
-
-        return builder.toString();
-    }
-
-    private static String getActionSymbolicName(int action) {
-        switch (action) {
-            case ACTION_FOCUS:
-                return "ACTION_FOCUS";
-            case ACTION_CLEAR_FOCUS:
-                return "ACTION_CLEAR_FOCUS";
-            case ACTION_SELECT:
-                return "ACTION_SELECT";
-            case ACTION_CLEAR_SELECTION:
-                return "ACTION_CLEAR_SELECTION";
-            case ACTION_CLICK:
-                return "ACTION_CLICK";
-            case ACTION_LONG_CLICK:
-                return "ACTION_LONG_CLICK";
-            case ACTION_ACCESSIBILITY_FOCUS:
-                return "ACTION_ACCESSIBILITY_FOCUS";
-            case ACTION_CLEAR_ACCESSIBILITY_FOCUS:
-                return "ACTION_CLEAR_ACCESSIBILITY_FOCUS";
-            case ACTION_NEXT_AT_MOVEMENT_GRANULARITY:
-                return "ACTION_NEXT_AT_MOVEMENT_GRANULARITY";
-            case ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY:
-                return "ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY";
-            case ACTION_NEXT_HTML_ELEMENT:
-                return "ACTION_NEXT_HTML_ELEMENT";
-            case ACTION_PREVIOUS_HTML_ELEMENT:
-                return "ACTION_PREVIOUS_HTML_ELEMENT";
-            case ACTION_SCROLL_FORWARD:
-                return "ACTION_SCROLL_FORWARD";
-            case ACTION_SCROLL_BACKWARD:
-                return "ACTION_SCROLL_BACKWARD";
-            case ACTION_CUT:
-                return "ACTION_CUT";
-            case ACTION_COPY:
-                return "ACTION_COPY";
-            case ACTION_PASTE:
-                return "ACTION_PASTE";
-            case ACTION_SET_SELECTION:
-                return "ACTION_SET_SELECTION";
-            default:
-                return"ACTION_UNKNOWN";
-        }
-    }
-}
diff --git a/v4/java/android/support/v4/view/accessibility/AccessibilityNodeProviderCompat.java b/v4/java/android/support/v4/view/accessibility/AccessibilityNodeProviderCompat.java
deleted file mode 100644
index e6da5f1..0000000
--- a/v4/java/android/support/v4/view/accessibility/AccessibilityNodeProviderCompat.java
+++ /dev/null
@@ -1,248 +0,0 @@
-/*
- * Copyright (C) 2012 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 android.support.v4.view.accessibility;
-
-import android.os.Build;
-import android.os.Bundle;
-import android.view.View;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Helper for accessing {@link android.view.accessibility.AccessibilityNodeProvider}
- * introduced after API level 4 in a backwards compatible fashion.
- */
-public class AccessibilityNodeProviderCompat {
-
-    interface AccessibilityNodeProviderImpl {
-        public Object newAccessibilityNodeProviderBridge(AccessibilityNodeProviderCompat compat);
-    }
-
-    static class AccessibilityNodeProviderStubImpl implements AccessibilityNodeProviderImpl {
-        @Override
-        public Object newAccessibilityNodeProviderBridge(AccessibilityNodeProviderCompat compat) {
-            return null;
-        }
-    }
-
-    static class AccessibilityNodeProviderJellyBeanImpl extends AccessibilityNodeProviderStubImpl {
-        @Override
-        public Object newAccessibilityNodeProviderBridge(
-                final AccessibilityNodeProviderCompat compat) {
-            return AccessibilityNodeProviderCompatJellyBean.newAccessibilityNodeProviderBridge(
-                    new AccessibilityNodeProviderCompatJellyBean.AccessibilityNodeInfoBridge() {
-                        @Override
-                        public boolean performAction(int virtualViewId, int action,
-                                Bundle arguments) {
-                            return compat.performAction(virtualViewId, action, arguments);
-                        }
-
-                        @Override
-                        public List<Object> findAccessibilityNodeInfosByText(
-                                            String text, int virtualViewId) {
-                            List<AccessibilityNodeInfoCompat> compatInfos =
-                                compat.findAccessibilityNodeInfosByText(text, virtualViewId);
-                            List<Object> infos = new ArrayList<Object>();
-                            final int infoCount = compatInfos.size();
-                            for (int i = 0; i < infoCount; i++) {
-                                AccessibilityNodeInfoCompat infoCompat = compatInfos.get(i);
-                                infos.add(infoCompat.getInfo());
-                            }
-                            return infos;
-                        }
-
-                        @Override
-                        public Object createAccessibilityNodeInfo(
-                                int virtualViewId) {
-                            final AccessibilityNodeInfoCompat compatInfo = compat
-                                    .createAccessibilityNodeInfo(virtualViewId);
-                            if (compatInfo == null) {
-                                return null;
-                            } else {
-                                return compatInfo.getInfo();
-                            }
-                        }
-                    });
-        }
-    }
-
-    static class AccessibilityNodeProviderKitKatImpl extends AccessibilityNodeProviderStubImpl {
-        @Override
-        public Object newAccessibilityNodeProviderBridge(
-                final AccessibilityNodeProviderCompat compat) {
-            return AccessibilityNodeProviderCompatKitKat.newAccessibilityNodeProviderBridge(
-                    new AccessibilityNodeProviderCompatKitKat.AccessibilityNodeInfoBridge() {
-                        @Override
-                        public boolean performAction(
-                                int virtualViewId, int action, Bundle arguments) {
-                            return compat.performAction(virtualViewId, action, arguments);
-                        }
-
-                        @Override
-                        public List<Object> findAccessibilityNodeInfosByText(
-                                String text, int virtualViewId) {
-                            List<AccessibilityNodeInfoCompat> compatInfos =
-                                    compat.findAccessibilityNodeInfosByText(text, virtualViewId);
-                            List<Object> infos = new ArrayList<Object>();
-                            final int infoCount = compatInfos.size();
-                            for (int i = 0; i < infoCount; i++) {
-                                AccessibilityNodeInfoCompat infoCompat = compatInfos.get(i);
-                                infos.add(infoCompat.getInfo());
-                            }
-                            return infos;
-                        }
-
-                        @Override
-                        public Object createAccessibilityNodeInfo(int virtualViewId) {
-                            final AccessibilityNodeInfoCompat compatInfo =
-                                    compat.createAccessibilityNodeInfo(virtualViewId);
-                            if (compatInfo == null) {
-                                return null;
-                            } else {
-                                return compatInfo.getInfo();
-                            }
-                        }
-
-                        @Override
-                        public Object findFocus(int focus) {
-                            final AccessibilityNodeInfoCompat compatInfo = compat.findFocus(focus);
-                            if (compatInfo == null) {
-                                return null;
-                            } else {
-                                return compatInfo.getInfo();
-                            }
-                        }
-                    });
-        }
-    }
-
-    private static final AccessibilityNodeProviderImpl IMPL;
-
-    private final Object mProvider;
-
-    static {
-        if (Build.VERSION.SDK_INT >= 19) { // KitKat
-            IMPL = new AccessibilityNodeProviderKitKatImpl();
-        } else if (Build.VERSION.SDK_INT >= 16) { // JellyBean
-            IMPL = new AccessibilityNodeProviderJellyBeanImpl();
-        } else {
-            IMPL = new AccessibilityNodeProviderStubImpl();
-        }
-    }
-
-    /**
-     * Creates a new instance.
-     */
-    public AccessibilityNodeProviderCompat() {
-        mProvider = IMPL.newAccessibilityNodeProviderBridge(this);
-    }
-
-    /**
-     * Creates a new instance wrapping an
-     * {@link android.view.accessibility.AccessibilityNodeProvider}.
-     *
-     * @param provider The provider.
-     */
-    public AccessibilityNodeProviderCompat(Object provider) {
-        mProvider = provider;
-    }
-
-    /**
-     * @return The wrapped {@link android.view.accessibility.AccessibilityNodeProvider}.
-     */
-    public Object getProvider() {
-        return mProvider;
-    }
-
-    /**
-     * Returns an {@link AccessibilityNodeInfoCompat} representing a virtual view,
-     * i.e. a descendant of the host View, with the given <code>virtualViewId</code>
-     * or the host View itself if <code>virtualViewId</code> equals to {@link View#NO_ID}.
-     * <p>
-     * A virtual descendant is an imaginary View that is reported as a part of the view
-     * hierarchy for accessibility purposes. This enables custom views that draw complex
-     * content to report them selves as a tree of virtual views, thus conveying their
-     * logical structure.
-     * </p>
-     * <p>
-     * The implementer is responsible for obtaining an accessibility node info from the
-     * pool of reusable instances and setting the desired properties of the node info
-     * before returning it.
-     * </p>
-     *
-     * @param virtualViewId A client defined virtual view id.
-     * @return A populated {@link AccessibilityNodeInfoCompat} for a virtual descendant
-     *     or the host View.
-     *
-     * @see AccessibilityNodeInfoCompat
-     */
-    public AccessibilityNodeInfoCompat createAccessibilityNodeInfo(int virtualViewId) {
-        return null;
-    }
-
-    /**
-     * Performs an accessibility action on a virtual view, i.e. a descendant of the
-     * host View, with the given <code>virtualViewId</code> or the host View itself
-     * if <code>virtualViewId</code> equals to {@link View#NO_ID}.
-     *
-     * @param virtualViewId A client defined virtual view id.
-     * @param action The action to perform.
-     * @param arguments Optional arguments.
-     * @return True if the action was performed.
-     *
-     * @see #createAccessibilityNodeInfo(int)
-     * @see AccessibilityNodeInfoCompat
-     */
-    public boolean performAction(int virtualViewId, int action, Bundle arguments) {
-        return false;
-    }
-
-    /**
-     * Finds {@link AccessibilityNodeInfoCompat}s by text. The match is case insensitive
-     * containment. The search is relative to the virtual view, i.e. a descendant of the
-     * host View, with the given <code>virtualViewId</code> or the host View itself
-     * <code>virtualViewId</code> equals to {@link View#NO_ID}.
-     *
-     * @param virtualViewId A client defined virtual view id which defined
-     *     the root of the tree in which to perform the search.
-     * @param text The searched text.
-     * @return A list of node info.
-     *
-     * @see #createAccessibilityNodeInfo(int)
-     * @see AccessibilityNodeInfoCompat
-     */
-    public List<AccessibilityNodeInfoCompat> findAccessibilityNodeInfosByText(String text,
-            int virtualViewId) {
-        return null;
-    }
-
-    /**
-     * Find the virtual view, i.e. a descendant of the host View, that has the
-     * specified focus type.
-     *
-     * @param focus The focus to find. One of
-     *            {@link AccessibilityNodeInfoCompat#FOCUS_INPUT} or
-     *            {@link AccessibilityNodeInfoCompat#FOCUS_ACCESSIBILITY}.
-     * @return The node info of the focused view or null.
-     * @see AccessibilityNodeInfoCompat#FOCUS_INPUT
-     * @see AccessibilityNodeInfoCompat#FOCUS_ACCESSIBILITY
-     */
-    public AccessibilityNodeInfoCompat findFocus(int focus) {
-        return null;
-    }
-}
diff --git a/v4/java/android/support/v4/view/accessibility/AccessibilityRecordCompat.java b/v4/java/android/support/v4/view/accessibility/AccessibilityRecordCompat.java
deleted file mode 100644
index dee67c9..0000000
--- a/v4/java/android/support/v4/view/accessibility/AccessibilityRecordCompat.java
+++ /dev/null
@@ -1,1046 +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 android.support.v4.view.accessibility;
-
-import android.os.Build;
-import android.os.Parcelable;
-import android.view.View;
-import android.view.accessibility.AccessibilityEvent;
-
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Helper for accessing {@link android.view.accessibility.AccessibilityRecord}
- * introduced after API level 4 in a backwards compatible fashion.
- */
-public class AccessibilityRecordCompat {
-
-    static interface AccessibilityRecordImpl {
-        public Object obtain();
-        public Object obtain(Object record);
-        public void setSource(Object record, View source);
-        public void setSource(Object record, View root, int virtualDescendantId);
-        public AccessibilityNodeInfoCompat getSource(Object record);
-        public int getWindowId(Object record);
-        public boolean isChecked(Object record);
-        public void setChecked(Object record, boolean isChecked);
-        public boolean isEnabled(Object record);
-        public void setEnabled(Object record, boolean isEnabled);
-        public boolean isPassword(Object record);
-        public void setPassword(Object record, boolean isPassword);
-        public boolean isFullScreen(Object record);
-        public void setFullScreen(Object record, boolean isFullScreen);
-        public boolean isScrollable(Object record);
-        public void setScrollable(Object record, boolean scrollable);
-        public int getItemCount(Object record);
-        public void setItemCount(Object record, int itemCount);
-        public int getCurrentItemIndex(Object record);
-        public void setCurrentItemIndex(Object record, int currentItemIndex);
-        public int getFromIndex(Object record);
-        public void setFromIndex(Object record, int fromIndex);
-        public int getToIndex(Object record);
-        public void setToIndex(Object record, int toIndex);
-        public int getScrollX(Object record);
-        public void setScrollX(Object record, int scrollX);
-        public int getScrollY(Object record);
-        public void setScrollY(Object record, int scrollY);
-        public int getMaxScrollX(Object record);
-        public void setMaxScrollX(Object record, int maxScrollX);
-        public int getMaxScrollY(Object record);
-        public void setMaxScrollY(Object record, int maxScrollY);
-        public int getAddedCount(Object record);
-        public void setAddedCount(Object record, int addedCount);
-        public int getRemovedCount(Object record);
-        public void setRemovedCount(Object record, int removedCount);
-        public CharSequence getClassName(Object record);
-        public void setClassName(Object record, CharSequence className);
-        public List<CharSequence> getText(Object record);
-        public CharSequence getBeforeText(Object record);
-        public void setBeforeText(Object record, CharSequence beforeText);
-        public CharSequence getContentDescription(Object record);
-        public void setContentDescription(Object record, CharSequence contentDescription);
-        public Parcelable getParcelableData(Object record);
-        public void setParcelableData(Object record, Parcelable parcelableData);
-        public void recycle(Object record);
-    }
-
-    static class AccessibilityRecordStubImpl implements AccessibilityRecordImpl {
-        public Object obtain() {
-            return null;
-        }
-
-        public Object obtain(Object record) {
-            return null;
-        }
-
-        public int getAddedCount(Object record) {
-            return 0;
-        }
-
-        public CharSequence getBeforeText(Object record) {
-            return null;
-        }
-
-        public CharSequence getClassName(Object record) {
-            return null;
-        }
-
-        public CharSequence getContentDescription(Object record) {
-            return null;
-        }
-
-        public int getCurrentItemIndex(Object record) {
-            return 0;
-        }
-
-        public int getFromIndex(Object record) {
-            return 0;
-        }
-
-        public int getItemCount(Object record) {
-            return 0;
-        }
-
-        public int getMaxScrollX(Object record) {
-            return 0;
-        }
-
-        public int getMaxScrollY(Object record) {
-            return 0;
-        }
-
-        public Parcelable getParcelableData(Object record) {
-            return null;
-        }
-
-        public int getRemovedCount(Object record) {
-            return 0;
-        }
-
-        public int getScrollX(Object record) {
-            return 0;
-        }
-
-        public int getScrollY(Object record) {
-            return 0;
-        }
-
-        public AccessibilityNodeInfoCompat getSource(Object record) {
-            return null;
-        }
-
-        public List<CharSequence> getText(Object record) {
-            return Collections.emptyList();
-        }
-
-        public int getToIndex(Object record) {
-            return 0;
-        }
-
-        public int getWindowId(Object record) {
-            return 0;
-        }
-
-        public boolean isChecked(Object record) {
-            return false;
-        }
-
-        public boolean isEnabled(Object record) {
-            return false;
-        }
-
-        public boolean isFullScreen(Object record) {
-            return false;
-        }
-
-        public boolean isPassword(Object record) {
-            return false;
-        }
-
-        public boolean isScrollable(Object record) {
-            return false;
-        }
-
-        public void recycle(Object record) {
-
-        }
-
-        public void setAddedCount(Object record, int addedCount) {
-
-        }
-
-        public void setBeforeText(Object record, CharSequence beforeText) {
-
-        }
-
-        public void setChecked(Object record, boolean isChecked) {
-
-        }
-
-        public void setClassName(Object record, CharSequence className) {
-
-        }
-
-        public void setContentDescription(Object record, CharSequence contentDescription) {
-
-        }
-
-        public void setCurrentItemIndex(Object record, int currentItemIndex) {
-
-        }
-
-        public void setEnabled(Object record, boolean isEnabled) {
-
-        }
-
-        public void setFromIndex(Object record, int fromIndex) {
-
-        }
-
-        public void setFullScreen(Object record, boolean isFullScreen) {
-
-        }
-
-        public void setItemCount(Object record, int itemCount) {
-
-        }
-
-        public void setMaxScrollX(Object record, int maxScrollX) {
-
-        }
-
-        public void setMaxScrollY(Object record, int maxScrollY) {
-
-        }
-
-        public void setParcelableData(Object record, Parcelable parcelableData) {
-
-        }
-
-        public void setPassword(Object record, boolean isPassword) {
-
-        }
-
-        public void setRemovedCount(Object record, int removedCount) {
-
-        }
-
-        public void setScrollX(Object record, int scrollX) {
-
-        }
-
-        public void setScrollY(Object record, int scrollY) {
-
-        }
-
-        public void setScrollable(Object record, boolean scrollable) {
-
-        }
-
-        public void setSource(Object record, View source) {
-
-        }
-
-        public void setSource(Object record, View root, int virtualDescendantId) {
-
-        }
-
-        public void setToIndex(Object record, int toIndex) {
-
-        }
-    }
-
-    static class AccessibilityRecordIcsImpl extends AccessibilityRecordStubImpl {
-        @Override
-        public Object obtain() {
-            return AccessibilityRecordCompatIcs.obtain();
-        }
-
-        @Override
-        public Object obtain(Object record) {
-            return AccessibilityRecordCompatIcs.obtain(record);
-        }
-
-        @Override
-        public int getAddedCount(Object record) {
-            return AccessibilityRecordCompatIcs.getAddedCount(record);
-        }
-
-        @Override
-        public CharSequence getBeforeText(Object record) {
-            return AccessibilityRecordCompatIcs.getBeforeText(record);
-        }
-
-        @Override
-        public CharSequence getClassName(Object record) {
-            return AccessibilityRecordCompatIcs.getClassName(record);
-        }
-
-        @Override
-        public CharSequence getContentDescription(Object record) {
-            return AccessibilityRecordCompatIcs.getContentDescription(record);
-        }
-
-        @Override
-        public int getCurrentItemIndex(Object record) {
-            return AccessibilityRecordCompatIcs.getCurrentItemIndex(record);
-        }
-
-        @Override
-        public int getFromIndex(Object record) {
-            return AccessibilityRecordCompatIcs.getFromIndex(record);
-        }
-
-        @Override
-        public int getItemCount(Object record) {
-            return AccessibilityRecordCompatIcs.getItemCount(record);
-        }
-
-        @Override
-        public Parcelable getParcelableData(Object record) {
-            return AccessibilityRecordCompatIcs.getParcelableData(record);
-        }
-
-        @Override
-        public int getRemovedCount(Object record) {
-            return AccessibilityRecordCompatIcs.getRemovedCount(record);
-        }
-
-        @Override
-        public int getScrollX(Object record) {
-            return AccessibilityRecordCompatIcs.getScrollX(record);
-        }
-
-        @Override
-        public int getScrollY(Object record) {
-            return AccessibilityRecordCompatIcs.getScrollY(record);
-        }
-
-        @Override
-        public AccessibilityNodeInfoCompat getSource(Object record) {
-            return AccessibilityNodeInfoCompat.wrapNonNullInstance(
-                    AccessibilityRecordCompatIcs.getSource(record));
-        }
-
-        @Override
-        public List<CharSequence> getText(Object record) {
-            return AccessibilityRecordCompatIcs.getText(record);
-        }
-
-        @Override
-        public int getToIndex(Object record) {
-            return AccessibilityRecordCompatIcs.getToIndex(record);
-        }
-
-        @Override
-        public int getWindowId(Object record) {
-            return AccessibilityRecordCompatIcs.getWindowId(record);
-        }
-
-        @Override
-        public boolean isChecked(Object record) {
-            return AccessibilityRecordCompatIcs.isChecked(record);
-        }
-
-        @Override
-        public boolean isEnabled(Object record) {
-            return AccessibilityRecordCompatIcs.isEnabled(record);
-        }
-
-        @Override
-        public boolean isFullScreen(Object record) {
-            return AccessibilityRecordCompatIcs.isFullScreen(record);
-        }
-
-        @Override
-        public boolean isPassword(Object record) {
-            return AccessibilityRecordCompatIcs.isPassword(record);
-        }
-
-        @Override
-        public boolean isScrollable(Object record) {
-            return AccessibilityRecordCompatIcs.isScrollable(record);
-        }
-
-        @Override
-        public void recycle(Object record) {
-            AccessibilityRecordCompatIcs.recycle(record);
-        }
-
-        @Override
-        public void setAddedCount(Object record, int addedCount) {
-            AccessibilityRecordCompatIcs.setAddedCount(record, addedCount);
-        }
-
-        @Override
-        public void setBeforeText(Object record, CharSequence beforeText) {
-            AccessibilityRecordCompatIcs.setBeforeText(record, beforeText);
-        }
-
-        @Override
-        public void setChecked(Object record, boolean isChecked) {
-            AccessibilityRecordCompatIcs.setChecked(record, isChecked);
-        }
-
-        @Override
-        public void setClassName(Object record, CharSequence className) {
-            AccessibilityRecordCompatIcs.setClassName(record, className);
-        }
-
-        @Override
-        public void setContentDescription(Object record, CharSequence contentDescription) {
-            AccessibilityRecordCompatIcs.setContentDescription(record, contentDescription);
-        }
-
-        @Override
-        public void setCurrentItemIndex(Object record, int currentItemIndex) {
-            AccessibilityRecordCompatIcs.setCurrentItemIndex(record, currentItemIndex);
-        }
-
-        @Override
-        public void setEnabled(Object record, boolean isEnabled) {
-            AccessibilityRecordCompatIcs.setEnabled(record, isEnabled);
-        }
-
-        @Override
-        public void setFromIndex(Object record, int fromIndex) {
-            AccessibilityRecordCompatIcs.setFromIndex(record, fromIndex);
-        }
-
-        @Override
-        public void setFullScreen(Object record, boolean isFullScreen) {
-            AccessibilityRecordCompatIcs.setFullScreen(record, isFullScreen);
-        }
-
-        @Override
-        public void setItemCount(Object record, int itemCount) {
-            AccessibilityRecordCompatIcs.setItemCount(record, itemCount);
-        }
-
-        @Override
-        public void setParcelableData(Object record, Parcelable parcelableData) {
-            AccessibilityRecordCompatIcs.setParcelableData(record, parcelableData);
-        }
-
-        @Override
-        public void setPassword(Object record, boolean isPassword) {
-            AccessibilityRecordCompatIcs.setPassword(record, isPassword);
-        }
-
-        @Override
-        public void setRemovedCount(Object record, int removedCount) {
-            AccessibilityRecordCompatIcs.setRemovedCount(record, removedCount);
-        }
-
-        @Override
-        public void setScrollX(Object record, int scrollX) {
-            AccessibilityRecordCompatIcs.setScrollX(record, scrollX);
-        }
-
-        @Override
-        public void setScrollY(Object record, int scrollY) {
-            AccessibilityRecordCompatIcs.setScrollY(record, scrollY);
-        }
-
-        @Override
-        public void setScrollable(Object record, boolean scrollable) {
-            AccessibilityRecordCompatIcs.setScrollable(record, scrollable);
-        }
-
-        @Override
-        public void setSource(Object record, View source) {
-            AccessibilityRecordCompatIcs.setSource(record, source);
-        }
-
-        @Override
-        public void setToIndex(Object record, int toIndex) {
-            AccessibilityRecordCompatIcs.setToIndex(record, toIndex);
-        }
-    }
-
-    static class AccessibilityRecordIcsMr1Impl extends AccessibilityRecordIcsImpl {
-        @Override
-        public int getMaxScrollX(Object record) {
-            return AccessibilityRecordCompatIcsMr1.getMaxScrollX(record);
-        }
-
-        @Override
-        public int getMaxScrollY(Object record) {
-            return AccessibilityRecordCompatIcsMr1.getMaxScrollY(record);
-        }
-
-        @Override
-        public void setMaxScrollX(Object record, int maxScrollX) {
-            AccessibilityRecordCompatIcsMr1.setMaxScrollX(record, maxScrollX);
-        }
-
-        @Override
-        public void setMaxScrollY(Object record, int maxScrollY) {
-            AccessibilityRecordCompatIcsMr1.setMaxScrollY(record, maxScrollY);
-        }
-    }
-
-    static class AccessibilityRecordJellyBeanImpl extends AccessibilityRecordIcsMr1Impl {
-        @Override
-        public void setSource(Object record, View root, int virtualDescendantId) {
-            AccessibilityRecordCompatJellyBean.setSource(record, root, virtualDescendantId);
-        }
-    }
-
-    static {
-        if (Build.VERSION.SDK_INT >= 16) { // JellyBean
-            IMPL = new AccessibilityRecordJellyBeanImpl();
-        } else if (Build.VERSION.SDK_INT >= 15) {  // ICS MR1
-            IMPL = new AccessibilityRecordIcsMr1Impl();
-        } else if (Build.VERSION.SDK_INT >= 14) { // ICS
-            IMPL = new AccessibilityRecordIcsImpl();
-        } else {
-            IMPL = new AccessibilityRecordStubImpl();
-        }
-    }
-
-    private static final AccessibilityRecordImpl IMPL;
-
-    private final Object mRecord;
-
-    /**
-     * @deprecated This is not type safe. If you want to modify an
-     * {@link AccessibilityEvent}'s properties defined in
-     * {@link android.view.accessibility.AccessibilityRecord} use
-     * {@link AccessibilityEventCompat#asRecord(AccessibilityEvent)}. This method will be removed
-     * in a subsequent release of the support library.
-     */
-    @Deprecated
-    public AccessibilityRecordCompat(Object record) {
-        mRecord = record;
-    }
-
-    /**
-     * @return The wrapped implementation.
-     *
-     * @deprecated This method will be removed in a subsequent release of
-     * the support library.
-     */
-    @Deprecated
-    public Object getImpl() {
-        return mRecord;
-    }
-
-    /**
-     * Returns a cached instance if such is available or a new one is
-     * instantiated. The instance is initialized with data from the
-     * given record.
-     *
-     * @return An instance.
-     */
-    public static AccessibilityRecordCompat obtain(AccessibilityRecordCompat record) {
-       return new AccessibilityRecordCompat(IMPL.obtain(record.mRecord));
-    }
-
-    /**
-     * Returns a cached instance if such is available or a new one is
-     * instantiated.
-     *
-     * @return An instance.
-     */
-    public static AccessibilityRecordCompat obtain() {
-        return new AccessibilityRecordCompat(IMPL.obtain());
-    }
-
-    /**
-     * Sets the event source.
-     *
-     * @param source The source.
-     *
-     * @throws IllegalStateException If called from an AccessibilityService.
-     */
-    public void setSource(View source) {
-        IMPL.setSource(mRecord, source);
-    }
-
-    /**
-     * Sets the source to be a virtual descendant of the given <code>root</code>.
-     * If <code>virtualDescendantId</code> equals to {@link View#NO_ID} the root
-     * is set as the source.
-     * <p>
-     * A virtual descendant is an imaginary View that is reported as a part of the view
-     * hierarchy for accessibility purposes. This enables custom views that draw complex
-     * content to report them selves as a tree of virtual views, thus conveying their
-     * logical structure.
-     * </p>
-     *
-     * @param root The root of the virtual subtree.
-     * @param virtualDescendantId The id of the virtual descendant.
-     */
-    public void setSource(View root, int virtualDescendantId) {
-        IMPL.setSource(mRecord, root, virtualDescendantId);
-    }
-
-    /**
-     * Gets the {@link android.view.accessibility.AccessibilityNodeInfo} of
-     * the event source.
-     * <p>
-     * <strong>Note:</strong> It is a client responsibility to recycle the
-     * received info by calling
-     * {@link android.view.accessibility.AccessibilityNodeInfo#recycle()
-     * AccessibilityNodeInfo#recycle()} to avoid creating of multiple instances.
-     *</p>
-     *
-     * @return The info of the source.
-     */
-    public AccessibilityNodeInfoCompat getSource() {
-        return IMPL.getSource(mRecord);
-    }
-
-    /**
-     * Gets the id of the window from which the event comes from.
-     *
-     * @return The window id.
-     */
-    public int getWindowId() {
-        return IMPL.getWindowId(mRecord);
-    }
-
-    /**
-     * Gets if the source is checked.
-     *
-     * @return True if the view is checked, false otherwise.
-     */
-    public boolean isChecked() {
-        return IMPL.isChecked(mRecord);
-    }
-
-    /**
-     * Sets if the source is checked.
-     *
-     * @param isChecked True if the view is checked, false otherwise.
-     *
-     * @throws IllegalStateException If called from an AccessibilityService.
-     */
-    public void setChecked(boolean isChecked) {
-        IMPL.setChecked(mRecord, isChecked);
-    }
-
-    /**
-     * Gets if the source is enabled.
-     *
-     * @return True if the view is enabled, false otherwise.
-     */
-    public boolean isEnabled() {
-        return IMPL.isEnabled(mRecord);
-    }
-
-    /**
-     * Sets if the source is enabled.
-     *
-     * @param isEnabled True if the view is enabled, false otherwise.
-     *
-     * @throws IllegalStateException If called from an AccessibilityService.
-     */
-    public void setEnabled(boolean isEnabled) {
-        IMPL.setEnabled(mRecord, isEnabled);
-    }
-
-    /**
-     * Gets if the source is a password field.
-     *
-     * @return True if the view is a password field, false otherwise.
-     */
-    public boolean isPassword() {
-        return IMPL.isPassword(mRecord);
-    }
-
-    /**
-     * Sets if the source is a password field.
-     *
-     * @param isPassword True if the view is a password field, false otherwise.
-     *
-     * @throws IllegalStateException If called from an AccessibilityService.
-     */
-    public void setPassword(boolean isPassword) {
-        IMPL.setPassword(mRecord, isPassword);
-    }
-
-    /**
-     * Gets if the source is taking the entire screen.
-     *
-     * @return True if the source is full screen, false otherwise.
-     */
-    public boolean isFullScreen() {
-        return IMPL.isFullScreen(mRecord);
-    }
-
-    /**
-     * Sets if the source is taking the entire screen.
-     *
-     * @param isFullScreen True if the source is full screen, false otherwise.
-     *
-     * @throws IllegalStateException If called from an AccessibilityService.
-     */
-    public void setFullScreen(boolean isFullScreen) {
-        IMPL.setFullScreen(mRecord, isFullScreen);
-    }
-
-    /**
-     * Gets if the source is scrollable.
-     *
-     * @return True if the source is scrollable, false otherwise.
-     */
-    public boolean isScrollable() {
-        return IMPL.isScrollable(mRecord);
-    }
-
-    /**
-     * Sets if the source is scrollable.
-     *
-     * @param scrollable True if the source is scrollable, false otherwise.
-     *
-     * @throws IllegalStateException If called from an AccessibilityService.
-     */
-    public void setScrollable(boolean scrollable) {
-        IMPL.setScrollable(mRecord, scrollable);
-    }
-
-    /**
-     * Gets the number of items that can be visited.
-     *
-     * @return The number of items.
-     */
-    public int getItemCount() {
-        return IMPL.getItemCount(mRecord);
-    }
-
-    /**
-     * Sets the number of items that can be visited.
-     *
-     * @param itemCount The number of items.
-     *
-     * @throws IllegalStateException If called from an AccessibilityService.
-     */
-    public void setItemCount(int itemCount) {
-        IMPL.setItemCount(mRecord, itemCount);
-    }
-
-    /**
-     * Gets the index of the source in the list of items the can be visited.
-     *
-     * @return The current item index.
-     */
-    public int getCurrentItemIndex() {
-        return IMPL.getCurrentItemIndex(mRecord);
-    }
-
-    /**
-     * Sets the index of the source in the list of items that can be visited.
-     *
-     * @param currentItemIndex The current item index.
-     *
-     * @throws IllegalStateException If called from an AccessibilityService.
-     */
-    public void setCurrentItemIndex(int currentItemIndex) {
-        IMPL.setCurrentItemIndex(mRecord, currentItemIndex);
-    }
-
-    /**
-     * Gets the index of the first character of the changed sequence,
-     * or the beginning of a text selection or the index of the first
-     * visible item when scrolling.
-     *
-     * @return The index of the first character or selection
-     *        start or the first visible item.
-     */
-    public int getFromIndex() {
-        return IMPL.getFromIndex(mRecord);
-    }
-
-    /**
-     * Sets the index of the first character of the changed sequence
-     * or the beginning of a text selection or the index of the first
-     * visible item when scrolling.
-     *
-     * @param fromIndex The index of the first character or selection
-     *        start or the first visible item.
-     *
-     * @throws IllegalStateException If called from an AccessibilityService.
-     */
-    public void setFromIndex(int fromIndex) {
-        IMPL.setFromIndex(mRecord, fromIndex);
-    }
-
-    /**
-     * Gets the index of text selection end or the index of the last
-     * visible item when scrolling.
-     *
-     * @return The index of selection end or last item index.
-     */
-    public int getToIndex() {
-        return IMPL.getToIndex(mRecord);
-    }
-
-    /**
-     * Sets the index of text selection end or the index of the last
-     * visible item when scrolling.
-     *
-     * @param toIndex The index of selection end or last item index.
-     */
-    public void setToIndex(int toIndex) {
-        IMPL.setToIndex(mRecord, toIndex);
-    }
-
-    /**
-     * Gets the scroll offset of the source left edge in pixels.
-     *
-     * @return The scroll.
-     */
-    public int getScrollX() {
-        return IMPL.getScrollX(mRecord);
-    }
-
-    /**
-     * Sets the scroll offset of the source left edge in pixels.
-     *
-     * @param scrollX The scroll.
-     */
-    public void setScrollX(int scrollX) {
-        IMPL.setScrollX(mRecord, scrollX);
-    }
-
-    /**
-     * Gets the scroll offset of the source top edge in pixels.
-     *
-     * @return The scroll.
-     */
-    public int getScrollY() {
-        return IMPL.getScrollY(mRecord);
-    }
-
-    /**
-     * Sets the scroll offset of the source top edge in pixels.
-     *
-     * @param scrollY The scroll.
-     */
-    public void setScrollY(int scrollY) {
-        IMPL.setScrollY(mRecord, scrollY);
-    }
-
-    /**
-     * Gets the max scroll offset of the source left edge in pixels.
-     *
-     * @return The max scroll.
-     */
-    public int getMaxScrollX() {
-        return IMPL.getMaxScrollX(mRecord);
-    }
-    /**
-     * Sets the max scroll offset of the source left edge in pixels.
-     *
-     * @param maxScrollX The max scroll.
-     */
-    public void setMaxScrollX(int maxScrollX) {
-        IMPL.setMaxScrollX(mRecord, maxScrollX);
-    }
-
-    /**
-     * Gets the max scroll offset of the source top edge in pixels.
-     *
-     * @return The max scroll.
-     */
-    public int getMaxScrollY() {
-        return IMPL.getMaxScrollY(mRecord);
-    }
-
-    /**
-     * Sets the max scroll offset of the source top edge in pixels.
-     *
-     * @param maxScrollY The max scroll.
-     */
-    public void setMaxScrollY(int maxScrollY) {
-        IMPL.setMaxScrollY(mRecord, maxScrollY);
-    }
-
-    /**
-     * Gets the number of added characters.
-     *
-     * @return The number of added characters.
-     */
-    public int getAddedCount() {
-        return IMPL.getAddedCount(mRecord);
-    }
-
-    /**
-     * Sets the number of added characters.
-     *
-     * @param addedCount The number of added characters.
-     *
-     * @throws IllegalStateException If called from an AccessibilityService.
-     */
-    public void setAddedCount(int addedCount) {
-        IMPL.setAddedCount(mRecord, addedCount);
-    }
-
-    /**
-     * Gets the number of removed characters.
-     *
-     * @return The number of removed characters.
-     */
-    public int getRemovedCount() {
-        return IMPL.getRemovedCount(mRecord);
-    }
-
-    /**
-     * Sets the number of removed characters.
-     *
-     * @param removedCount The number of removed characters.
-     *
-     * @throws IllegalStateException If called from an AccessibilityService.
-     */
-    public void setRemovedCount(int removedCount) {
-        IMPL.setRemovedCount(mRecord, removedCount);
-    }
-
-    /**
-     * Gets the class name of the source.
-     *
-     * @return The class name.
-     */
-    public CharSequence getClassName() {
-        return IMPL.getClassName(mRecord);
-    }
-
-    /**
-     * Sets the class name of the source.
-     *
-     * @param className The lass name.
-     *
-     * @throws IllegalStateException If called from an AccessibilityService.
-     */
-    public void setClassName(CharSequence className) {
-        IMPL.setClassName(mRecord, className);
-    }
-
-    /**
-     * Gets the text of the event. The index in the list represents the priority
-     * of the text. Specifically, the lower the index the higher the priority.
-     *
-     * @return The text.
-     */
-    public List<CharSequence> getText() {
-        return IMPL.getText(mRecord);
-    }
-
-    /**
-     * Sets the text before a change.
-     *
-     * @return The text before the change.
-     */
-    public CharSequence getBeforeText() {
-        return IMPL.getBeforeText(mRecord);
-    }
-
-    /**
-     * Sets the text before a change.
-     *
-     * @param beforeText The text before the change.
-     *
-     * @throws IllegalStateException If called from an AccessibilityService.
-     */
-    public void setBeforeText(CharSequence beforeText) {
-        IMPL.setBeforeText(mRecord, beforeText);
-    }
-
-    /**
-     * Gets the description of the source.
-     *
-     * @return The description.
-     */
-    public CharSequence getContentDescription() {
-        return IMPL.getContentDescription(mRecord);
-    }
-
-    /**
-     * Sets the description of the source.
-     *
-     * @param contentDescription The description.
-     *
-     * @throws IllegalStateException If called from an AccessibilityService.
-     */
-    public void setContentDescription(CharSequence contentDescription) {
-        IMPL.setContentDescription(mRecord, contentDescription);
-    }
-
-    /**
-     * Gets the {@link Parcelable} data.
-     *
-     * @return The parcelable data.
-     */
-    public Parcelable getParcelableData() {
-        return IMPL.getParcelableData(mRecord);
-    }
-
-    /**
-     * Sets the {@link Parcelable} data of the event.
-     *
-     * @param parcelableData The parcelable data.
-     *
-     * @throws IllegalStateException If called from an AccessibilityService.
-     */
-    public void setParcelableData(Parcelable parcelableData) {
-        IMPL.setParcelableData(mRecord, parcelableData);
-    }
-
-    /**
-     * Return an instance back to be reused.
-     * <p>
-     * <strong>Note:</strong> You must not touch the object after calling this
-     * function.
-     * </p>
-     *
-     * @throws IllegalStateException If the record is already recycled.
-     */
-    public void recycle() {
-        IMPL.recycle(mRecord);
-    }
-
-    @Override
-    public int hashCode() {
-        return (mRecord == null) ? 0 : mRecord.hashCode();
-    }
-
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (obj == null) {
-            return false;
-        }
-        if (getClass() != obj.getClass()) {
-            return false;
-        }
-        AccessibilityRecordCompat other = (AccessibilityRecordCompat) obj;
-        if (mRecord == null) {
-            if (other.mRecord != null) {
-                return false;
-            }
-        } else if (!mRecord.equals(other.mRecord)) {
-            return false;
-        }
-        return true;
-    }
-}
diff --git a/v4/java/android/support/v4/view/accessibility/AccessibilityWindowInfoCompat.java b/v4/java/android/support/v4/view/accessibility/AccessibilityWindowInfoCompat.java
deleted file mode 100644
index 738924c..0000000
--- a/v4/java/android/support/v4/view/accessibility/AccessibilityWindowInfoCompat.java
+++ /dev/null
@@ -1,499 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.v4.view.accessibility;
-
-import android.graphics.Rect;
-import android.os.Build;
-
-/**
- * Helper for accessing {@link android.view.accessibility.AccessibilityWindowInfo}
- * introduced after API level 4 in a backwards compatible fashion.
- */
-public class AccessibilityWindowInfoCompat {
-
-    private static interface AccessibilityWindowInfoImpl {
-        public Object obtain();
-        public Object obtain(Object info);
-        public int getType(Object info);
-        public int getLayer(Object info);
-        public Object getRoot(Object info);
-        public Object getParent(Object info);
-        public int getId(Object info);
-        public void getBoundsInScreen(Object info, Rect outBounds);
-        public boolean isActive(Object info);
-        public boolean isFocused(Object info);
-        public boolean isAccessibilityFocused(Object info);
-        public int getChildCount(Object info);
-        public Object getChild(Object info, int index);
-        public CharSequence getTitle(Object info);
-        public Object getAnchor(Object info);
-        public void recycle(Object info);
-    }
-
-    private static class AccessibilityWindowInfoStubImpl implements AccessibilityWindowInfoImpl {
-
-        @Override
-        public Object obtain() {
-            return null;
-        }
-
-        @Override
-        public Object obtain(Object info) {
-            return null;
-        }
-
-        @Override
-        public int getType(Object info) {
-            return UNDEFINED;
-        }
-
-        @Override
-        public int getLayer(Object info) {
-            return UNDEFINED;
-        }
-
-        @Override
-        public Object getRoot(Object info) {
-            return null;
-        }
-
-        @Override
-        public Object getParent(Object info) {
-            return null;
-        }
-
-        @Override
-        public int getId(Object info) {
-            return UNDEFINED;
-        }
-
-        @Override
-        public void getBoundsInScreen(Object info, Rect outBounds) {
-        }
-
-        @Override
-        public boolean isActive(Object info) {
-            return true;
-        }
-
-        @Override
-        public boolean isFocused(Object info) {
-            return true;
-        }
-
-        @Override
-        public boolean isAccessibilityFocused(Object info) {
-            return true;
-        }
-
-        @Override
-        public int getChildCount(Object info) {
-            return 0;
-        }
-
-        @Override
-        public Object getChild(Object info, int index) {
-            return null;
-        }
-
-        @Override
-        public void recycle(Object info) {
-        }
-
-        @Override
-        public CharSequence getTitle(Object info) {
-            return null;
-        }
-
-        @Override
-        public Object getAnchor(Object info) {
-            return null;
-        }
-    }
-
-    private static class AccessibilityWindowInfoApi21Impl extends AccessibilityWindowInfoStubImpl {
-        @Override
-        public Object obtain() {
-            return AccessibilityWindowInfoCompatApi21.obtain();
-        }
-
-        @Override
-        public Object obtain(Object info) {
-            return AccessibilityWindowInfoCompatApi21.obtain(info);
-        }
-
-        @Override
-        public int getType(Object info) {
-            return AccessibilityWindowInfoCompatApi21.getType(info);
-        }
-
-        @Override
-        public int getLayer(Object info) {
-            return AccessibilityWindowInfoCompatApi21.getLayer(info);
-        }
-
-        @Override
-        public Object getRoot(Object info) {
-            return AccessibilityWindowInfoCompatApi21.getRoot(info);
-        }
-
-        @Override
-        public Object getParent(Object info) {
-            return AccessibilityWindowInfoCompatApi21.getParent(info);
-        }
-
-        @Override
-        public int getId(Object info) {
-            return AccessibilityWindowInfoCompatApi21.getId(info);
-        }
-
-        @Override
-        public void getBoundsInScreen(Object info, Rect outBounds) {
-            AccessibilityWindowInfoCompatApi21.getBoundsInScreen(info, outBounds);
-        }
-
-        @Override
-        public boolean isActive(Object info) {
-            return AccessibilityWindowInfoCompatApi21.isActive(info);
-        }
-
-        @Override
-        public boolean isFocused(Object info) {
-            return AccessibilityWindowInfoCompatApi21.isFocused(info);
-        }
-
-        @Override
-        public boolean isAccessibilityFocused(Object info) {
-            return AccessibilityWindowInfoCompatApi21.isAccessibilityFocused(info);
-        }
-
-        @Override
-        public int getChildCount(Object info) {
-            return AccessibilityWindowInfoCompatApi21.getChildCount(info);
-        }
-
-        @Override
-        public Object getChild(Object info, int index) {
-            return AccessibilityWindowInfoCompatApi21.getChild(info, index);
-        }
-
-        @Override
-        public void recycle(Object info) {
-            AccessibilityWindowInfoCompatApi21.recycle(info);
-        }
-    }
-
-    private static class AccessibilityWindowInfoApi24Impl extends AccessibilityWindowInfoApi21Impl {
-        @Override
-        public CharSequence getTitle(Object info) {
-            return AccessibilityWindowInfoCompatApi24.getTitle(info);
-        }
-
-        @Override
-        public Object getAnchor(Object info) {
-            return AccessibilityWindowInfoCompatApi24.getAnchor(info);
-        }
-    }
-
-    static {
-        if (Build.VERSION.SDK_INT >= 24) {
-            IMPL = new AccessibilityWindowInfoApi24Impl();
-        } else  if (Build.VERSION.SDK_INT >= 21) {
-            IMPL = new AccessibilityWindowInfoApi21Impl();
-        } else {
-            IMPL = new AccessibilityWindowInfoStubImpl();
-        }
-    }
-
-    private static final AccessibilityWindowInfoImpl IMPL;
-    private Object mInfo;
-
-    private static final int UNDEFINED = -1;
-
-    /**
-     * Window type: This is an application window. Such a window shows UI for
-     * interacting with an application.
-     */
-    public static final int TYPE_APPLICATION = 1;
-
-    /**
-     * Window type: This is an input method window. Such a window shows UI for
-     * inputting text such as keyboard, suggestions, etc.
-     */
-    public static final int TYPE_INPUT_METHOD = 2;
-
-    /**
-     * Window type: This is an system window. Such a window shows UI for
-     * interacting with the system.
-     */
-    public static final int TYPE_SYSTEM = 3;
-
-    /**
-     * Window type: Windows that are overlaid <em>only</em> by an {@link
-     * android.accessibilityservice.AccessibilityService} for interception of
-     * user interactions without changing the windows an accessibility service
-     * can introspect. In particular, an accessibility service can introspect
-     * only windows that a sighted user can interact with which they can touch
-     * these windows or can type into these windows. For example, if there
-     * is a full screen accessibility overlay that is touchable, the windows
-     * below it will be introspectable by an accessibility service regardless
-     * they are covered by a touchable window.
-     */
-    public static final int TYPE_ACCESSIBILITY_OVERLAY = 4;
-
-    /**
-     * Creates a wrapper for info implementation.
-     *
-     * @param object The info to wrap.
-     * @return A wrapper for if the object is not null, null otherwise.
-     */
-    static AccessibilityWindowInfoCompat wrapNonNullInstance(Object object) {
-        if (object != null) {
-            return new AccessibilityWindowInfoCompat(object);
-        }
-        return null;
-    }
-
-    private AccessibilityWindowInfoCompat(Object info) {
-        mInfo = info;
-    }
-
-    /**
-     * Gets the type of the window.
-     *
-     * @return The type.
-     *
-     * @see #TYPE_APPLICATION
-     * @see #TYPE_INPUT_METHOD
-     * @see #TYPE_SYSTEM
-     * @see #TYPE_ACCESSIBILITY_OVERLAY
-     */
-    public int getType() {
-        return IMPL.getType(mInfo);
-    }
-
-    /**
-     * Gets the layer which determines the Z-order of the window. Windows
-     * with greater layer appear on top of windows with lesser layer.
-     *
-     * @return The window layer.
-     */
-    public int getLayer() {
-        return IMPL.getLayer(mInfo);
-    }
-
-    /**
-     * Gets the root node in the window's hierarchy.
-     *
-     * @return The root node.
-     */
-    public AccessibilityNodeInfoCompat getRoot() {
-        return AccessibilityNodeInfoCompat.wrapNonNullInstance(IMPL.getRoot(mInfo));
-    }
-
-    /**
-     * Gets the parent window if such.
-     *
-     * @return The parent window.
-     */
-    public AccessibilityWindowInfoCompat getParent() {
-        return wrapNonNullInstance(IMPL.getParent(mInfo));
-    }
-
-    /**
-     * Gets the unique window id.
-     *
-     * @return windowId The window id.
-     */
-    public int getId() {
-        return IMPL.getId(mInfo);
-    }
-
-    /**
-     * Gets the bounds of this window in the screen.
-     *
-     * @param outBounds The out window bounds.
-     */
-    public void getBoundsInScreen(Rect outBounds) {
-        IMPL.getBoundsInScreen(mInfo, outBounds);
-    }
-
-    /**
-     * Gets if this window is active. An active window is the one
-     * the user is currently touching or the window has input focus
-     * and the user is not touching any window.
-     *
-     * @return Whether this is the active window.
-     */
-    public boolean isActive() {
-        return IMPL.isActive(mInfo);
-    }
-
-    /**
-     * Gets if this window has input focus.
-     *
-     * @return Whether has input focus.
-     */
-    public boolean isFocused() {
-        return IMPL.isFocused(mInfo);
-    }
-
-    /**
-     * Gets if this window has accessibility focus.
-     *
-     * @return Whether has accessibility focus.
-     */
-    public boolean isAccessibilityFocused() {
-        return IMPL.isAccessibilityFocused(mInfo);
-    }
-
-    /**
-     * Gets the number of child windows.
-     *
-     * @return The child count.
-     */
-    public int getChildCount() {
-        return IMPL.getChildCount(mInfo);
-    }
-
-    /**
-     * Gets the child window at a given index.
-     *
-     * @param index The index.
-     * @return The child.
-     */
-    public AccessibilityWindowInfoCompat getChild(int index) {
-        return wrapNonNullInstance(IMPL.getChild(mInfo, index));
-    }
-
-    /**
-     * Gets the title of the window.
-     *
-     * @return The title of the window, or the application label for the window if no title was
-     * explicitly set, or {@code null} if neither is available.
-     */
-    public CharSequence getTitle() {
-        return IMPL.getTitle(mInfo);
-    }
-
-    /**
-     * Gets the node that anchors this window to another.
-     *
-     * @return The anchor node, or {@code null} if none exists.
-     */
-    public AccessibilityNodeInfoCompat getAnchor() {
-        return AccessibilityNodeInfoCompat.wrapNonNullInstance(IMPL.getAnchor(mInfo));
-    }
-
-    /**
-     * Returns a cached instance if such is available or a new one is
-     * created.
-     *
-     * @return An instance.
-     */
-    public static AccessibilityWindowInfoCompat obtain() {
-        return wrapNonNullInstance(IMPL.obtain());
-    }
-
-    /**
-     * Returns a cached instance if such is available or a new one is
-     * created. The returned instance is initialized from the given
-     * <code>info</code>.
-     *
-     * @param info The other info.
-     * @return An instance.
-     */
-    public static AccessibilityWindowInfoCompat obtain(AccessibilityWindowInfoCompat info) {
-        return wrapNonNullInstance(IMPL.obtain(info.mInfo));
-    }
-
-    /**
-     * Return an instance back to be reused.
-     * <p>
-     * <strong>Note:</strong> You must not touch the object after calling this function.
-     * </p>
-     *
-     * @throws IllegalStateException If the info is already recycled.
-     */
-    public void recycle() {
-        IMPL.recycle(mInfo);
-    }
-
-    @Override
-    public int hashCode() {
-        return (mInfo == null) ? 0 : mInfo.hashCode();
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (obj == null) {
-            return false;
-        }
-        if (getClass() != obj.getClass()) {
-            return false;
-        }
-        AccessibilityWindowInfoCompat other = (AccessibilityWindowInfoCompat) obj;
-        if (mInfo == null) {
-            if (other.mInfo != null) {
-                return false;
-            }
-        } else if (!mInfo.equals(other.mInfo)) {
-            return false;
-        }
-        return true;
-    }
-
-    @Override
-    public String toString() {
-        StringBuilder builder = new StringBuilder();
-        Rect bounds = new Rect();
-        getBoundsInScreen(bounds);
-        builder.append("AccessibilityWindowInfo[");
-        builder.append("id=").append(getId());
-        builder.append(", type=").append(typeToString(getType()));
-        builder.append(", layer=").append(getLayer());
-        builder.append(", bounds=").append(bounds);
-        builder.append(", focused=").append(isFocused());
-        builder.append(", active=").append(isActive());
-        builder.append(", hasParent=").append(getParent() != null);
-        builder.append(", hasChildren=").append(getChildCount() > 0);
-        builder.append(']');
-        return builder.toString();
-    }
-
-    private static String typeToString(int type) {
-        switch (type) {
-            case TYPE_APPLICATION: {
-                return "TYPE_APPLICATION";
-            }
-            case TYPE_INPUT_METHOD: {
-                return "TYPE_INPUT_METHOD";
-            }
-            case TYPE_SYSTEM: {
-                return "TYPE_SYSTEM";
-            }
-            case TYPE_ACCESSIBILITY_OVERLAY: {
-                return "TYPE_ACCESSIBILITY_OVERLAY";
-            }
-            default:
-                return "<UNKNOWN>";
-        }
-    }
-}
diff --git a/v4/java/android/support/v4/widget/CircleImageView.java b/v4/java/android/support/v4/widget/CircleImageView.java
deleted file mode 100644
index 246ffa7..0000000
--- a/v4/java/android/support/v4/widget/CircleImageView.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- * Copyright (C) 2014 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 android.support.v4.widget;
-
-import android.content.Context;
-import android.graphics.Canvas;
-import android.graphics.Color;
-import android.graphics.Paint;
-import android.graphics.RadialGradient;
-import android.graphics.Shader;
-import android.graphics.drawable.ShapeDrawable;
-import android.graphics.drawable.shapes.OvalShape;
-import android.support.v4.view.ViewCompat;
-import android.view.animation.Animation;
-import android.widget.ImageView;
-
-/**
- * Private class created to work around issues with AnimationListeners being
- * called before the animation is actually complete and support shadows on older
- * platforms.
- *
- * @hide
- */
-class CircleImageView extends ImageView {
-
-    private static final int KEY_SHADOW_COLOR = 0x1E000000;
-    private static final int FILL_SHADOW_COLOR = 0x3D000000;
-    // PX
-    private static final float X_OFFSET = 0f;
-    private static final float Y_OFFSET = 1.75f;
-    private static final float SHADOW_RADIUS = 3.5f;
-    private static final int SHADOW_ELEVATION = 4;
-
-    private Animation.AnimationListener mListener;
-    private int mShadowRadius;
-
-    public CircleImageView(Context context, int color, final float radius) {
-        super(context);
-        final float density = getContext().getResources().getDisplayMetrics().density;
-        final int diameter = (int) (radius * density * 2);
-        final int shadowYOffset = (int) (density * Y_OFFSET);
-        final int shadowXOffset = (int) (density * X_OFFSET);
-
-        mShadowRadius = (int) (density * SHADOW_RADIUS);
-
-        ShapeDrawable circle;
-        if (elevationSupported()) {
-            circle = new ShapeDrawable(new OvalShape());
-            ViewCompat.setElevation(this, SHADOW_ELEVATION * density);
-        } else {
-            OvalShape oval = new OvalShadow(mShadowRadius, diameter);
-            circle = new ShapeDrawable(oval);
-            ViewCompat.setLayerType(this, ViewCompat.LAYER_TYPE_SOFTWARE, circle.getPaint());
-            circle.getPaint().setShadowLayer(mShadowRadius, shadowXOffset, shadowYOffset,
-                    KEY_SHADOW_COLOR);
-            final int padding = mShadowRadius;
-            // set padding so the inner image sits correctly within the shadow.
-            setPadding(padding, padding, padding, padding);
-        }
-        circle.getPaint().setColor(color);
-        setBackgroundDrawable(circle);
-    }
-
-    private boolean elevationSupported() {
-        return android.os.Build.VERSION.SDK_INT >= 21;
-    }
-
-    @Override
-    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
-        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
-        if (!elevationSupported()) {
-            setMeasuredDimension(getMeasuredWidth() + mShadowRadius*2, getMeasuredHeight()
-                    + mShadowRadius*2);
-        }
-    }
-
-    public void setAnimationListener(Animation.AnimationListener listener) {
-        mListener = listener;
-    }
-
-    @Override
-    public void onAnimationStart() {
-        super.onAnimationStart();
-        if (mListener != null) {
-            mListener.onAnimationStart(getAnimation());
-        }
-    }
-
-    @Override
-    public void onAnimationEnd() {
-        super.onAnimationEnd();
-        if (mListener != null) {
-            mListener.onAnimationEnd(getAnimation());
-        }
-    }
-
-    /**
-     * Update the background color of the circle image view.
-     *
-     * @param colorRes Id of a color resource.
-     */
-    public void setBackgroundColorRes(int colorRes) {
-        setBackgroundColor(getContext().getResources().getColor(colorRes));
-    }
-
-    @Override
-    public void setBackgroundColor(int color) {
-        if (getBackground() instanceof ShapeDrawable) {
-            ((ShapeDrawable) getBackground()).getPaint().setColor(color);
-        }
-    }
-
-    private class OvalShadow extends OvalShape {
-        private RadialGradient mRadialGradient;
-        private Paint mShadowPaint;
-        private int mCircleDiameter;
-
-        public OvalShadow(int shadowRadius, int circleDiameter) {
-            super();
-            mShadowPaint = new Paint();
-            mShadowRadius = shadowRadius;
-            mCircleDiameter = circleDiameter;
-            mRadialGradient = new RadialGradient(mCircleDiameter / 2, mCircleDiameter / 2,
-                    mShadowRadius, new int[] {
-                            FILL_SHADOW_COLOR, Color.TRANSPARENT
-                    }, null, Shader.TileMode.CLAMP);
-            mShadowPaint.setShader(mRadialGradient);
-        }
-
-        @Override
-        public void draw(Canvas canvas, Paint paint) {
-            final int viewWidth = CircleImageView.this.getWidth();
-            final int viewHeight = CircleImageView.this.getHeight();
-            canvas.drawCircle(viewWidth / 2, viewHeight / 2, (mCircleDiameter / 2 + mShadowRadius),
-                    mShadowPaint);
-            canvas.drawCircle(viewWidth / 2, viewHeight / 2, (mCircleDiameter / 2), paint);
-        }
-    }
-}
diff --git a/v4/java/android/support/v4/widget/CompoundButtonCompat.java b/v4/java/android/support/v4/widget/CompoundButtonCompat.java
deleted file mode 100644
index 13ab974..0000000
--- a/v4/java/android/support/v4/widget/CompoundButtonCompat.java
+++ /dev/null
@@ -1,176 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.v4.widget;
-
-import android.content.Context;
-import android.content.res.ColorStateList;
-import android.graphics.Canvas;
-import android.graphics.PorterDuff;
-import android.graphics.drawable.Drawable;
-import android.os.Build;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.v4.graphics.drawable.DrawableCompat;
-import android.widget.CompoundButton;
-
-/**
- * Helper for accessing {@link android.widget.CompoundButton} methods introduced after
- * API level 4 in a backwards compatible fashion.
- */
-public final class CompoundButtonCompat {
-
-    private static final CompoundButtonCompatImpl IMPL;
-
-    static {
-        final int sdk = Build.VERSION.SDK_INT;
-        if (sdk >= 23) {
-            IMPL = new Api23CompoundButtonImpl();
-        } else if (sdk >= 21) {
-            IMPL = new LollipopCompoundButtonImpl();
-        } else {
-            IMPL = new BaseCompoundButtonCompat();
-        }
-    }
-
-    interface CompoundButtonCompatImpl {
-        void setButtonTintList(CompoundButton button, ColorStateList tint);
-        ColorStateList getButtonTintList(CompoundButton button);
-        void setButtonTintMode(CompoundButton button, PorterDuff.Mode tintMode);
-        PorterDuff.Mode getButtonTintMode(CompoundButton button);
-        Drawable getButtonDrawable(CompoundButton button);
-    }
-
-    static class BaseCompoundButtonCompat implements CompoundButtonCompatImpl {
-        @Override
-        public void setButtonTintList(CompoundButton button, ColorStateList tint) {
-            CompoundButtonCompatDonut.setButtonTintList(button, tint);
-        }
-
-        @Override
-        public ColorStateList getButtonTintList(CompoundButton button) {
-            return CompoundButtonCompatDonut.getButtonTintList(button);
-        }
-
-        @Override
-        public void setButtonTintMode(CompoundButton button, PorterDuff.Mode tintMode) {
-            CompoundButtonCompatDonut.setButtonTintMode(button, tintMode);
-        }
-
-        @Override
-        public PorterDuff.Mode getButtonTintMode(CompoundButton button) {
-            return CompoundButtonCompatDonut.getButtonTintMode(button);
-        }
-
-        @Override
-        public Drawable getButtonDrawable(CompoundButton button) {
-            return CompoundButtonCompatDonut.getButtonDrawable(button);
-        }
-    }
-
-    static class LollipopCompoundButtonImpl extends BaseCompoundButtonCompat {
-        @Override
-        public void setButtonTintList(CompoundButton button, ColorStateList tint) {
-            CompoundButtonCompatLollipop.setButtonTintList(button, tint);
-        }
-
-        @Override
-        public ColorStateList getButtonTintList(CompoundButton button) {
-            return CompoundButtonCompatLollipop.getButtonTintList(button);
-        }
-
-        @Override
-        public void setButtonTintMode(CompoundButton button, PorterDuff.Mode tintMode) {
-            CompoundButtonCompatLollipop.setButtonTintMode(button, tintMode);
-        }
-
-        @Override
-        public PorterDuff.Mode getButtonTintMode(CompoundButton button) {
-            return CompoundButtonCompatLollipop.getButtonTintMode(button);
-        }
-    }
-
-    static class Api23CompoundButtonImpl extends LollipopCompoundButtonImpl {
-        @Override
-        public Drawable getButtonDrawable(CompoundButton button) {
-            return CompoundButtonCompatApi23.getButtonDrawable(button);
-        }
-    }
-
-    private CompoundButtonCompat() {}
-
-    /**
-     * Applies a tint to the button drawable. Does not modify the current tint
-     * mode, which is {@link PorterDuff.Mode#SRC_IN} by default.
-     * <p>
-     * Subsequent calls to {@link CompoundButton#setButtonDrawable(Drawable)} should
-     * automatically mutate the drawable and apply the specified tint and tint
-     * mode using {@link DrawableCompat#setTintList(Drawable, ColorStateList)}.
-     *
-     * @param tint the tint to apply, may be {@code null} to clear tint
-     *
-     * @see #setButtonTintList(CompoundButton, ColorStateList)
-     */
-    public static void setButtonTintList(@NonNull CompoundButton button, @Nullable ColorStateList tint) {
-        IMPL.setButtonTintList(button, tint);
-    }
-
-    /**
-     * Returns the tint applied to the button drawable
-     *
-     * @see #setButtonTintList(CompoundButton, ColorStateList)
-     */
-    @Nullable
-    public static ColorStateList getButtonTintList(@NonNull CompoundButton button) {
-        return IMPL.getButtonTintList(button);
-    }
-
-    /**
-     * Specifies the blending mode used to apply the tint specified by
-     * {@link #setButtonTintList(CompoundButton, ColorStateList)}} to the button drawable. The
-     * default mode is {@link PorterDuff.Mode#SRC_IN}.
-     *
-     * @param tintMode the blending mode used to apply the tint, may be
-     *                 {@code null} to clear tint
-     *
-     * @see #getButtonTintMode(CompoundButton)
-     * @see DrawableCompat#setTintMode(Drawable, PorterDuff.Mode)
-     */
-    public static void setButtonTintMode(@NonNull CompoundButton button,
-            @Nullable PorterDuff.Mode tintMode) {
-        IMPL.setButtonTintMode(button, tintMode);
-    }
-
-    /**
-     * @return the blending mode used to apply the tint to the button drawable
-     * @attr name android:buttonTintMode
-     * @see #setButtonTintMode(PorterDuff.Mode)
-     */
-    @Nullable
-    public static PorterDuff.Mode getButtonTintMode(@NonNull CompoundButton button) {
-        return IMPL.getButtonTintMode(button);
-    }
-
-    /**
-     * Returns the drawable used as the compound button image
-     *
-     * @see CompoundButton#setButtonDrawable(Drawable)
-     */
-    @Nullable
-    public static Drawable getButtonDrawable(@NonNull CompoundButton button) {
-        return IMPL.getButtonDrawable(button);
-    }
-}
diff --git a/v4/java/android/support/v4/widget/CursorAdapter.java b/v4/java/android/support/v4/widget/CursorAdapter.java
deleted file mode 100644
index 96d9cfa..0000000
--- a/v4/java/android/support/v4/widget/CursorAdapter.java
+++ /dev/null
@@ -1,483 +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 android.support.v4.widget;
-
-import android.content.Context;
-import android.database.ContentObserver;
-import android.database.Cursor;
-import android.database.DataSetObserver;
-import android.os.Handler;
-import android.util.Log;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.BaseAdapter;
-import android.widget.Filter;
-import android.widget.FilterQueryProvider;
-import android.widget.Filterable;
-
-/**
- * Static library support version of the framework's {@link android.widget.CursorAdapter}.
- * Used to write apps that run on platforms prior to Android 3.0.  When running
- * on Android 3.0 or above, this implementation is still used; it does not try
- * to switch to the framework's implementation.  See the framework SDK
- * documentation for a class overview.
- */
-public abstract class CursorAdapter extends BaseAdapter implements Filterable,
-        CursorFilter.CursorFilterClient {
-    /**
-     * This field should be made private, so it is hidden from the SDK.
-     * {@hide}
-     */
-    protected boolean mDataValid;
-    /**
-     * This field should be made private, so it is hidden from the SDK.
-     * {@hide}
-     */
-    protected boolean mAutoRequery;
-    /**
-     * This field should be made private, so it is hidden from the SDK.
-     * {@hide}
-     */
-    protected Cursor mCursor;
-    /**
-     * This field should be made private, so it is hidden from the SDK.
-     * {@hide}
-     */
-    protected Context mContext;
-    /**
-     * This field should be made private, so it is hidden from the SDK.
-     * {@hide}
-     */
-    protected int mRowIDColumn;
-    /**
-     * This field should be made private, so it is hidden from the SDK.
-     * {@hide}
-     */
-    protected ChangeObserver mChangeObserver;
-    /**
-     * This field should be made private, so it is hidden from the SDK.
-     * {@hide}
-     */
-    protected DataSetObserver mDataSetObserver;
-    /**
-     * This field should be made private, so it is hidden from the SDK.
-     * {@hide}
-     */
-    protected CursorFilter mCursorFilter;
-    /**
-     * This field should be made private, so it is hidden from the SDK.
-     * {@hide}
-     */
-    protected FilterQueryProvider mFilterQueryProvider;
-
-    /**
-     * If set the adapter will call requery() on the cursor whenever a content change
-     * notification is delivered. Implies {@link #FLAG_REGISTER_CONTENT_OBSERVER}.
-     *
-     * @deprecated This option is discouraged, as it results in Cursor queries
-     * being performed on the application's UI thread and thus can cause poor
-     * responsiveness or even Application Not Responding errors.  As an alternative,
-     * use {@link android.app.LoaderManager} with a {@link android.content.CursorLoader}.
-     */
-    @Deprecated
-    public static final int FLAG_AUTO_REQUERY = 0x01;
-
-    /**
-     * If set the adapter will register a content observer on the cursor and will call
-     * {@link #onContentChanged()} when a notification comes in.  Be careful when
-     * using this flag: you will need to unset the current Cursor from the adapter
-     * to avoid leaks due to its registered observers.  This flag is not needed
-     * when using a CursorAdapter with a
-     * {@link android.content.CursorLoader}.
-     */
-    public static final int FLAG_REGISTER_CONTENT_OBSERVER = 0x02;
-
-    /**
-     * Constructor that always enables auto-requery.
-     *
-     * @deprecated This option is discouraged, as it results in Cursor queries
-     * being performed on the application's UI thread and thus can cause poor
-     * responsiveness or even Application Not Responding errors.  As an alternative,
-     * use {@link android.app.LoaderManager} with a {@link android.content.CursorLoader}.
-     *
-     * @param c The cursor from which to get the data.
-     * @param context The context
-     */
-    @Deprecated
-    public CursorAdapter(Context context, Cursor c) {
-        init(context, c, FLAG_AUTO_REQUERY);
-    }
-
-    /**
-     * Constructor that allows control over auto-requery.  It is recommended
-     * you not use this, but instead {@link #CursorAdapter(Context, Cursor, int)}.
-     * When using this constructor, {@link #FLAG_REGISTER_CONTENT_OBSERVER}
-     * will always be set.
-     *
-     * @param c The cursor from which to get the data.
-     * @param context The context
-     * @param autoRequery If true the adapter will call requery() on the
-     *                    cursor whenever it changes so the most recent
-     *                    data is always displayed.  Using true here is discouraged.
-     */
-    public CursorAdapter(Context context, Cursor c, boolean autoRequery) {
-        init(context, c, autoRequery ? FLAG_AUTO_REQUERY : FLAG_REGISTER_CONTENT_OBSERVER);
-    }
-
-    /**
-     * Recommended constructor.
-     *
-     * @param c The cursor from which to get the data.
-     * @param context The context
-     * @param flags Flags used to determine the behavior of the adapter; may
-     * be any combination of {@link #FLAG_AUTO_REQUERY} and
-     * {@link #FLAG_REGISTER_CONTENT_OBSERVER}.
-     */
-    public CursorAdapter(Context context, Cursor c, int flags) {
-        init(context, c, flags);
-    }
-
-    /**
-     * @deprecated Don't use this, use the normal constructor.  This will
-     * be removed in the future.
-     */
-    @Deprecated
-    protected void init(Context context, Cursor c, boolean autoRequery) {
-        init(context, c, autoRequery ? FLAG_AUTO_REQUERY : FLAG_REGISTER_CONTENT_OBSERVER);
-    }
-
-    void init(Context context, Cursor c, int flags) {
-        if ((flags & FLAG_AUTO_REQUERY) == FLAG_AUTO_REQUERY) {
-            flags |= FLAG_REGISTER_CONTENT_OBSERVER;
-            mAutoRequery = true;
-        } else {
-            mAutoRequery = false;
-        }
-        boolean cursorPresent = c != null;
-        mCursor = c;
-        mDataValid = cursorPresent;
-        mContext = context;
-        mRowIDColumn = cursorPresent ? c.getColumnIndexOrThrow("_id") : -1;
-        if ((flags & FLAG_REGISTER_CONTENT_OBSERVER) == FLAG_REGISTER_CONTENT_OBSERVER) {
-            mChangeObserver = new ChangeObserver();
-            mDataSetObserver = new MyDataSetObserver();
-        } else {
-            mChangeObserver = null;
-            mDataSetObserver = null;
-        }
-
-        if (cursorPresent) {
-            if (mChangeObserver != null) c.registerContentObserver(mChangeObserver);
-            if (mDataSetObserver != null) c.registerDataSetObserver(mDataSetObserver);
-        }
-    }
-
-    /**
-     * Returns the cursor.
-     * @return the cursor.
-     */
-    public Cursor getCursor() {
-        return mCursor;
-    }
-
-    /**
-     * @see android.widget.ListAdapter#getCount()
-     */
-    public int getCount() {
-        if (mDataValid && mCursor != null) {
-            return mCursor.getCount();
-        } else {
-            return 0;
-        }
-    }
-    
-    /**
-     * @see android.widget.ListAdapter#getItem(int)
-     */
-    public Object getItem(int position) {
-        if (mDataValid && mCursor != null) {
-            mCursor.moveToPosition(position);
-            return mCursor;
-        } else {
-            return null;
-        }
-    }
-
-    /**
-     * @see android.widget.ListAdapter#getItemId(int)
-     */
-    public long getItemId(int position) {
-        if (mDataValid && mCursor != null) {
-            if (mCursor.moveToPosition(position)) {
-                return mCursor.getLong(mRowIDColumn);
-            } else {
-                return 0;
-            }
-        } else {
-            return 0;
-        }
-    }
-    
-    @Override
-    public boolean hasStableIds() {
-        return true;
-    }
-
-    /**
-     * @see android.widget.ListAdapter#getView(int, View, ViewGroup)
-     */
-    public View getView(int position, View convertView, ViewGroup parent) {
-        if (!mDataValid) {
-            throw new IllegalStateException("this should only be called when the cursor is valid");
-        }
-        if (!mCursor.moveToPosition(position)) {
-            throw new IllegalStateException("couldn't move cursor to position " + position);
-        }
-        View v;
-        if (convertView == null) {
-            v = newView(mContext, mCursor, parent);
-        } else {
-            v = convertView;
-        }
-        bindView(v, mContext, mCursor);
-        return v;
-    }
-
-    @Override
-    public View getDropDownView(int position, View convertView, ViewGroup parent) {
-        if (mDataValid) {
-            mCursor.moveToPosition(position);
-            View v;
-            if (convertView == null) {
-                v = newDropDownView(mContext, mCursor, parent);
-            } else {
-                v = convertView;
-            }
-            bindView(v, mContext, mCursor);
-            return v;
-        } else {
-            return null;
-        }
-    }
-    
-    /**
-     * Makes a new view to hold the data pointed to by cursor.
-     * @param context Interface to application's global information
-     * @param cursor The cursor from which to get the data. The cursor is already
-     * moved to the correct position.
-     * @param parent The parent to which the new view is attached to
-     * @return the newly created view.
-     */
-    public abstract View newView(Context context, Cursor cursor, ViewGroup parent);
-
-    /**
-     * Makes a new drop down view to hold the data pointed to by cursor.
-     * @param context Interface to application's global information
-     * @param cursor The cursor from which to get the data. The cursor is already
-     * moved to the correct position.
-     * @param parent The parent to which the new view is attached to
-     * @return the newly created view.
-     */
-    public View newDropDownView(Context context, Cursor cursor, ViewGroup parent) {
-        return newView(context, cursor, parent);
-    }
-
-    /**
-     * Bind an existing view to the data pointed to by cursor
-     * @param view Existing view, returned earlier by newView
-     * @param context Interface to application's global information
-     * @param cursor The cursor from which to get the data. The cursor is already
-     * moved to the correct position.
-     */
-    public abstract void bindView(View view, Context context, Cursor cursor);
-    
-    /**
-     * Change the underlying cursor to a new cursor. If there is an existing cursor it will be
-     * closed.
-     * 
-     * @param cursor The new cursor to be used
-     */
-    public void changeCursor(Cursor cursor) {
-        Cursor old = swapCursor(cursor);
-        if (old != null) {
-            old.close();
-        }
-    }
-
-    /**
-     * Swap in a new Cursor, returning the old Cursor.  Unlike
-     * {@link #changeCursor(Cursor)}, the returned old Cursor is <em>not</em>
-     * closed.
-     *
-     * @param newCursor The new cursor to be used.
-     * @return Returns the previously set Cursor, or null if there wasa not one.
-     * If the given new Cursor is the same instance is the previously set
-     * Cursor, null is also returned.
-     */
-    public Cursor swapCursor(Cursor newCursor) {
-        if (newCursor == mCursor) {
-            return null;
-        }
-        Cursor oldCursor = mCursor;
-        if (oldCursor != null) {
-            if (mChangeObserver != null) oldCursor.unregisterContentObserver(mChangeObserver);
-            if (mDataSetObserver != null) oldCursor.unregisterDataSetObserver(mDataSetObserver);
-        }
-        mCursor = newCursor;
-        if (newCursor != null) {
-            if (mChangeObserver != null) newCursor.registerContentObserver(mChangeObserver);
-            if (mDataSetObserver != null) newCursor.registerDataSetObserver(mDataSetObserver);
-            mRowIDColumn = newCursor.getColumnIndexOrThrow("_id");
-            mDataValid = true;
-            // notify the observers about the new cursor
-            notifyDataSetChanged();
-        } else {
-            mRowIDColumn = -1;
-            mDataValid = false;
-            // notify the observers about the lack of a data set
-            notifyDataSetInvalidated();
-        }
-        return oldCursor;
-    }
-
-    /**
-     * <p>Converts the cursor into a CharSequence. Subclasses should override this
-     * method to convert their results. The default implementation returns an
-     * empty String for null values or the default String representation of
-     * the value.</p>
-     *
-     * @param cursor the cursor to convert to a CharSequence
-     * @return a CharSequence representing the value
-     */
-    public CharSequence convertToString(Cursor cursor) {
-        return cursor == null ? "" : cursor.toString();
-    }
-
-    /**
-     * Runs a query with the specified constraint. This query is requested
-     * by the filter attached to this adapter.
-     *
-     * The query is provided by a
-     * {@link android.widget.FilterQueryProvider}.
-     * If no provider is specified, the current cursor is not filtered and returned.
-     *
-     * After this method returns the resulting cursor is passed to {@link #changeCursor(Cursor)}
-     * and the previous cursor is closed.
-     *
-     * This method is always executed on a background thread, not on the
-     * application's main thread (or UI thread.)
-     * 
-     * Contract: when constraint is null or empty, the original results,
-     * prior to any filtering, must be returned.
-     *
-     * @param constraint the constraint with which the query must be filtered
-     *
-     * @return a Cursor representing the results of the new query
-     *
-     * @see #getFilter()
-     * @see #getFilterQueryProvider()
-     * @see #setFilterQueryProvider(android.widget.FilterQueryProvider)
-     */
-    public Cursor runQueryOnBackgroundThread(CharSequence constraint) {
-        if (mFilterQueryProvider != null) {
-            return mFilterQueryProvider.runQuery(constraint);
-        }
-
-        return mCursor;
-    }
-
-    public Filter getFilter() {
-        if (mCursorFilter == null) {
-            mCursorFilter = new CursorFilter(this);
-        }
-        return mCursorFilter;
-    }
-
-    /**
-     * Returns the query filter provider used for filtering. When the
-     * provider is null, no filtering occurs.
-     *
-     * @return the current filter query provider or null if it does not exist
-     *
-     * @see #setFilterQueryProvider(android.widget.FilterQueryProvider)
-     * @see #runQueryOnBackgroundThread(CharSequence)
-     */
-    public FilterQueryProvider getFilterQueryProvider() {
-        return mFilterQueryProvider;
-    }
-
-    /**
-     * Sets the query filter provider used to filter the current Cursor.
-     * The provider's
-     * {@link android.widget.FilterQueryProvider#runQuery(CharSequence)}
-     * method is invoked when filtering is requested by a client of
-     * this adapter.
-     *
-     * @param filterQueryProvider the filter query provider or null to remove it
-     *
-     * @see #getFilterQueryProvider()
-     * @see #runQueryOnBackgroundThread(CharSequence)
-     */
-    public void setFilterQueryProvider(FilterQueryProvider filterQueryProvider) {
-        mFilterQueryProvider = filterQueryProvider;
-    }
-
-    /**
-     * Called when the {@link ContentObserver} on the cursor receives a change notification.
-     * The default implementation provides the auto-requery logic, but may be overridden by
-     * sub classes.
-     * 
-     * @see ContentObserver#onChange(boolean)
-     */
-    protected void onContentChanged() {
-        if (mAutoRequery && mCursor != null && !mCursor.isClosed()) {
-            if (false) Log.v("Cursor", "Auto requerying " + mCursor + " due to update");
-            mDataValid = mCursor.requery();
-        }
-    }
-
-    private class ChangeObserver extends ContentObserver {
-        public ChangeObserver() {
-            super(new Handler());
-        }
-
-        @Override
-        public boolean deliverSelfNotifications() {
-            return true;
-        }
-
-        @Override
-        public void onChange(boolean selfChange) {
-            onContentChanged();
-        }
-    }
-
-    private class MyDataSetObserver extends DataSetObserver {
-        @Override
-        public void onChanged() {
-            mDataValid = true;
-            notifyDataSetChanged();
-        }
-
-        @Override
-        public void onInvalidated() {
-            mDataValid = false;
-            notifyDataSetInvalidated();
-        }
-    }
-
-}
diff --git a/v4/java/android/support/v4/widget/DrawerLayout.java b/v4/java/android/support/v4/widget/DrawerLayout.java
deleted file mode 100644
index a48ec4e..0000000
--- a/v4/java/android/support/v4/widget/DrawerLayout.java
+++ /dev/null
@@ -1,2389 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-package android.support.v4.widget;
-
-import android.content.Context;
-import android.content.res.TypedArray;
-import android.graphics.Canvas;
-import android.graphics.Paint;
-import android.graphics.PixelFormat;
-import android.graphics.Rect;
-import android.graphics.drawable.ColorDrawable;
-import android.graphics.drawable.Drawable;
-import android.os.Build;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.os.SystemClock;
-import android.support.annotation.ColorInt;
-import android.support.annotation.DrawableRes;
-import android.support.annotation.IntDef;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.v4.content.ContextCompat;
-import android.support.v4.graphics.drawable.DrawableCompat;
-import android.support.v4.os.ParcelableCompat;
-import android.support.v4.os.ParcelableCompatCreatorCallbacks;
-import android.support.v4.view.AbsSavedState;
-import android.support.v4.view.AccessibilityDelegateCompat;
-import android.support.v4.view.GravityCompat;
-import android.support.v4.view.KeyEventCompat;
-import android.support.v4.view.MotionEventCompat;
-import android.support.v4.view.ViewCompat;
-import android.support.v4.view.ViewGroupCompat;
-import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat;
-import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat;
-import android.util.AttributeSet;
-import android.view.Gravity;
-import android.view.KeyEvent;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.ViewParent;
-import android.view.accessibility.AccessibilityEvent;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * DrawerLayout acts as a top-level container for window content that allows for
- * interactive "drawer" views to be pulled out from one or both vertical edges of the window.
- *
- * <p>Drawer positioning and layout is controlled using the <code>android:layout_gravity</code>
- * attribute on child views corresponding to which side of the view you want the drawer
- * to emerge from: left or right (or start/end on platform versions that support layout direction.)
- * Note that you can only have one drawer view for each vertical edge of the window. If your
- * layout configures more than one drawer view per vertical edge of the window, an exception will
- * be thrown at runtime.
- * </p>
- *
- * <p>To use a DrawerLayout, position your primary content view as the first child with
- * width and height of <code>match_parent</code> and no <code>layout_gravity></code>.
- * Add drawers as child views after the main content view and set the <code>layout_gravity</code>
- * appropriately. Drawers commonly use <code>match_parent</code> for height with a fixed width.</p>
- *
- * <p>{@link DrawerListener} can be used to monitor the state and motion of drawer views.
- * Avoid performing expensive operations such as layout during animation as it can cause
- * stuttering; try to perform expensive operations during the {@link #STATE_IDLE} state.
- * {@link SimpleDrawerListener} offers default/no-op implementations of each callback method.</p>
- *
- * <p>As per the <a href="{@docRoot}design/patterns/navigation-drawer.html">Android Design
- * guide</a>, any drawers positioned to the left/start should
- * always contain content for navigating around the application, whereas any drawers
- * positioned to the right/end should always contain actions to take on the current content.
- * This preserves the same navigation left, actions right structure present in the Action Bar
- * and elsewhere.</p>
- *
- * <p>For more information about how to use DrawerLayout, read <a
- * href="{@docRoot}training/implementing-navigation/nav-drawer.html">Creating a Navigation
- * Drawer</a>.</p>
- */
-public class DrawerLayout extends ViewGroup implements DrawerLayoutImpl {
-    private static final String TAG = "DrawerLayout";
-
-    @IntDef({STATE_IDLE, STATE_DRAGGING, STATE_SETTLING})
-    @Retention(RetentionPolicy.SOURCE)
-    private @interface State {}
-
-    /**
-     * Indicates that any drawers are in an idle, settled state. No animation is in progress.
-     */
-    public static final int STATE_IDLE = ViewDragHelper.STATE_IDLE;
-
-    /**
-     * Indicates that a drawer is currently being dragged by the user.
-     */
-    public static final int STATE_DRAGGING = ViewDragHelper.STATE_DRAGGING;
-
-    /**
-     * Indicates that a drawer is in the process of settling to a final position.
-     */
-    public static final int STATE_SETTLING = ViewDragHelper.STATE_SETTLING;
-
-    /** @hide */
-    @IntDef({LOCK_MODE_UNLOCKED, LOCK_MODE_LOCKED_CLOSED, LOCK_MODE_LOCKED_OPEN,
-            LOCK_MODE_UNDEFINED})
-    @Retention(RetentionPolicy.SOURCE)
-    private @interface LockMode {}
-
-    /**
-     * The drawer is unlocked.
-     */
-    public static final int LOCK_MODE_UNLOCKED = 0;
-
-    /**
-     * The drawer is locked closed. The user may not open it, though
-     * the app may open it programmatically.
-     */
-    public static final int LOCK_MODE_LOCKED_CLOSED = 1;
-
-    /**
-     * The drawer is locked open. The user may not close it, though the app
-     * may close it programmatically.
-     */
-    public static final int LOCK_MODE_LOCKED_OPEN = 2;
-
-    /**
-     * The drawer's lock state is reset to default.
-     */
-    public static final int LOCK_MODE_UNDEFINED = 3;
-
-    /** @hide */
-    @IntDef({Gravity.LEFT, Gravity.RIGHT, GravityCompat.START, GravityCompat.END})
-    @Retention(RetentionPolicy.SOURCE)
-    private @interface EdgeGravity {}
-
-
-    private static final int MIN_DRAWER_MARGIN = 64; // dp
-    private static final int DRAWER_ELEVATION = 10; //dp
-
-    private static final int DEFAULT_SCRIM_COLOR = 0x99000000;
-
-    /**
-     * Length of time to delay before peeking the drawer.
-     */
-    private static final int PEEK_DELAY = 160; // ms
-
-    /**
-     * Minimum velocity that will be detected as a fling
-     */
-    private static final int MIN_FLING_VELOCITY = 400; // dips per second
-
-    /**
-     * Experimental feature.
-     */
-    private static final boolean ALLOW_EDGE_LOCK = false;
-
-    private static final boolean CHILDREN_DISALLOW_INTERCEPT = true;
-
-    private static final float TOUCH_SLOP_SENSITIVITY = 1.f;
-
-    private static final int[] LAYOUT_ATTRS = new int[] {
-            android.R.attr.layout_gravity
-    };
-
-    /** Whether we can use NO_HIDE_DESCENDANTS accessibility importance. */
-    private static final boolean CAN_HIDE_DESCENDANTS = Build.VERSION.SDK_INT >= 19;
-
-    /** Whether the drawer shadow comes from setting elevation on the drawer. */
-    private static final boolean SET_DRAWER_SHADOW_FROM_ELEVATION =
-            Build.VERSION.SDK_INT >= 21;
-
-    private final ChildAccessibilityDelegate mChildAccessibilityDelegate =
-            new ChildAccessibilityDelegate();
-    private float mDrawerElevation;
-
-    private int mMinDrawerMargin;
-
-    private int mScrimColor = DEFAULT_SCRIM_COLOR;
-    private float mScrimOpacity;
-    private Paint mScrimPaint = new Paint();
-
-    private final ViewDragHelper mLeftDragger;
-    private final ViewDragHelper mRightDragger;
-    private final ViewDragCallback mLeftCallback;
-    private final ViewDragCallback mRightCallback;
-    private int mDrawerState;
-    private boolean mInLayout;
-    private boolean mFirstLayout = true;
-
-    private @LockMode int mLockModeLeft = LOCK_MODE_UNDEFINED;
-    private @LockMode int mLockModeRight = LOCK_MODE_UNDEFINED;
-    private @LockMode int mLockModeStart = LOCK_MODE_UNDEFINED;
-    private @LockMode int mLockModeEnd = LOCK_MODE_UNDEFINED;
-
-    private boolean mDisallowInterceptRequested;
-    private boolean mChildrenCanceledTouch;
-
-    private @Nullable DrawerListener mListener;
-    private List<DrawerListener> mListeners;
-
-    private float mInitialMotionX;
-    private float mInitialMotionY;
-
-    private Drawable mStatusBarBackground;
-    private Drawable mShadowLeftResolved;
-    private Drawable mShadowRightResolved;
-
-    private CharSequence mTitleLeft;
-    private CharSequence mTitleRight;
-
-    private Object mLastInsets;
-    private boolean mDrawStatusBarBackground;
-
-    /** Shadow drawables for different gravity */
-    private Drawable mShadowStart = null;
-    private Drawable mShadowEnd = null;
-    private Drawable mShadowLeft = null;
-    private Drawable mShadowRight = null;
-
-    private final ArrayList<View> mNonDrawerViews;
-
-    /**
-     * Listener for monitoring events about drawers.
-     */
-    public interface DrawerListener {
-        /**
-         * Called when a drawer's position changes.
-         * @param drawerView The child view that was moved
-         * @param slideOffset The new offset of this drawer within its range, from 0-1
-         */
-        public void onDrawerSlide(View drawerView, float slideOffset);
-
-        /**
-         * Called when a drawer has settled in a completely open state.
-         * The drawer is interactive at this point.
-         *
-         * @param drawerView Drawer view that is now open
-         */
-        public void onDrawerOpened(View drawerView);
-
-        /**
-         * Called when a drawer has settled in a completely closed state.
-         *
-         * @param drawerView Drawer view that is now closed
-         */
-        public void onDrawerClosed(View drawerView);
-
-        /**
-         * Called when the drawer motion state changes. The new state will
-         * be one of {@link #STATE_IDLE}, {@link #STATE_DRAGGING} or {@link #STATE_SETTLING}.
-         *
-         * @param newState The new drawer motion state
-         */
-        public void onDrawerStateChanged(@State int newState);
-    }
-
-    /**
-     * Stub/no-op implementations of all methods of {@link DrawerListener}.
-     * Override this if you only care about a few of the available callback methods.
-     */
-    public static abstract class SimpleDrawerListener implements DrawerListener {
-        @Override
-        public void onDrawerSlide(View drawerView, float slideOffset) {
-        }
-
-        @Override
-        public void onDrawerOpened(View drawerView) {
-        }
-
-        @Override
-        public void onDrawerClosed(View drawerView) {
-        }
-
-        @Override
-        public void onDrawerStateChanged(int newState) {
-        }
-    }
-
-    interface DrawerLayoutCompatImpl {
-        void configureApplyInsets(View drawerLayout);
-        void dispatchChildInsets(View child, Object insets, int drawerGravity);
-        void applyMarginInsets(MarginLayoutParams lp, Object insets, int drawerGravity);
-        int getTopInset(Object lastInsets);
-        Drawable getDefaultStatusBarBackground(Context context);
-    }
-
-    static class DrawerLayoutCompatImplBase implements DrawerLayoutCompatImpl {
-        public void configureApplyInsets(View drawerLayout) {
-            // This space for rent
-        }
-
-        public void dispatchChildInsets(View child, Object insets, int drawerGravity) {
-            // This space for rent
-        }
-
-        public void applyMarginInsets(MarginLayoutParams lp, Object insets, int drawerGravity) {
-            // This space for rent
-        }
-
-        public int getTopInset(Object insets) {
-            return 0;
-        }
-
-        @Override
-        public Drawable getDefaultStatusBarBackground(Context context) {
-            return null;
-        }
-    }
-
-    static class DrawerLayoutCompatImplApi21 implements DrawerLayoutCompatImpl {
-        public void configureApplyInsets(View drawerLayout) {
-            DrawerLayoutCompatApi21.configureApplyInsets(drawerLayout);
-        }
-
-        public void dispatchChildInsets(View child, Object insets, int drawerGravity) {
-            DrawerLayoutCompatApi21.dispatchChildInsets(child, insets, drawerGravity);
-        }
-
-        public void applyMarginInsets(MarginLayoutParams lp, Object insets, int drawerGravity) {
-            DrawerLayoutCompatApi21.applyMarginInsets(lp, insets, drawerGravity);
-        }
-
-        public int getTopInset(Object insets) {
-            return DrawerLayoutCompatApi21.getTopInset(insets);
-        }
-
-        @Override
-        public Drawable getDefaultStatusBarBackground(Context context) {
-            return DrawerLayoutCompatApi21.getDefaultStatusBarBackground(context);
-        }
-    }
-
-    static {
-        final int version = Build.VERSION.SDK_INT;
-        if (version >= 21) {
-            IMPL = new DrawerLayoutCompatImplApi21();
-        } else {
-            IMPL = new DrawerLayoutCompatImplBase();
-        }
-    }
-
-    static final DrawerLayoutCompatImpl IMPL;
-
-    public DrawerLayout(Context context) {
-        this(context, null);
-    }
-
-    public DrawerLayout(Context context, AttributeSet attrs) {
-        this(context, attrs, 0);
-    }
-
-    public DrawerLayout(Context context, AttributeSet attrs, int defStyle) {
-        super(context, attrs, defStyle);
-        setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);
-        final float density = getResources().getDisplayMetrics().density;
-        mMinDrawerMargin = (int) (MIN_DRAWER_MARGIN * density + 0.5f);
-        final float minVel = MIN_FLING_VELOCITY * density;
-
-        mLeftCallback = new ViewDragCallback(Gravity.LEFT);
-        mRightCallback = new ViewDragCallback(Gravity.RIGHT);
-
-        mLeftDragger = ViewDragHelper.create(this, TOUCH_SLOP_SENSITIVITY, mLeftCallback);
-        mLeftDragger.setEdgeTrackingEnabled(ViewDragHelper.EDGE_LEFT);
-        mLeftDragger.setMinVelocity(minVel);
-        mLeftCallback.setDragger(mLeftDragger);
-
-        mRightDragger = ViewDragHelper.create(this, TOUCH_SLOP_SENSITIVITY, mRightCallback);
-        mRightDragger.setEdgeTrackingEnabled(ViewDragHelper.EDGE_RIGHT);
-        mRightDragger.setMinVelocity(minVel);
-        mRightCallback.setDragger(mRightDragger);
-
-        // So that we can catch the back button
-        setFocusableInTouchMode(true);
-
-        ViewCompat.setImportantForAccessibility(this,
-                ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_YES);
-
-        ViewCompat.setAccessibilityDelegate(this, new AccessibilityDelegate());
-        ViewGroupCompat.setMotionEventSplittingEnabled(this, false);
-        if (ViewCompat.getFitsSystemWindows(this)) {
-            IMPL.configureApplyInsets(this);
-            mStatusBarBackground = IMPL.getDefaultStatusBarBackground(context);
-        }
-
-        mDrawerElevation = DRAWER_ELEVATION * density;
-
-        mNonDrawerViews = new ArrayList<View>();
-    }
-
-    /**
-     * Sets the base elevation of the drawer(s) relative to the parent, in pixels. Note that the
-     * elevation change is only supported in API 21 and above.
-     *
-     * @param elevation The base depth position of the view, in pixels.
-     */
-    public void setDrawerElevation(float elevation) {
-        mDrawerElevation = elevation;
-        for (int i = 0; i < getChildCount(); i++) {
-            View child = getChildAt(i);
-            if (isDrawerView(child)) {
-                ViewCompat.setElevation(child, mDrawerElevation);
-            }
-        }
-    }
-
-    /**
-     * The base elevation of the drawer(s) relative to the parent, in pixels. Note that the
-     * elevation change is only supported in API 21 and above. For unsupported API levels, 0 will
-     * be returned as the elevation.
-     *
-     * @return The base depth position of the view, in pixels.
-     */
-    public float getDrawerElevation() {
-        if (SET_DRAWER_SHADOW_FROM_ELEVATION) {
-            return mDrawerElevation;
-        }
-        return 0f;
-    }
-
-    /**
-     * @hide Internal use only; called to apply window insets when configured
-     * with fitsSystemWindows="true"
-     */
-    @Override
-    public void setChildInsets(Object insets, boolean draw) {
-        mLastInsets = insets;
-        mDrawStatusBarBackground = draw;
-        setWillNotDraw(!draw && getBackground() == null);
-        requestLayout();
-    }
-
-    /**
-     * Set a simple drawable used for the left or right shadow. The drawable provided must have a
-     * nonzero intrinsic width. For API 21 and above, an elevation will be set on the drawer
-     * instead of the drawable provided.
-     *
-     * <p>Note that for better support for both left-to-right and right-to-left layout
-     * directions, a drawable for RTL layout (in additional to the one in LTR layout) can be
-     * defined with a resource qualifier "ldrtl" for API 17 and above with the gravity
-     * {@link GravityCompat#START}. Alternatively, for API 23 and above, the drawable can
-     * auto-mirrored such that the drawable will be mirrored in RTL layout.</p>
-     *
-     * @param shadowDrawable Shadow drawable to use at the edge of a drawer
-     * @param gravity Which drawer the shadow should apply to
-     */
-    public void setDrawerShadow(Drawable shadowDrawable, @EdgeGravity int gravity) {
-        /*
-         * TODO Someone someday might want to set more complex drawables here.
-         * They're probably nuts, but we might want to consider registering callbacks,
-         * setting states, etc. properly.
-         */
-        if (SET_DRAWER_SHADOW_FROM_ELEVATION) {
-            // No op. Drawer shadow will come from setting an elevation on the drawer.
-            return;
-        }
-        if ((gravity & GravityCompat.START) == GravityCompat.START) {
-            mShadowStart = shadowDrawable;
-        } else if ((gravity & GravityCompat.END) == GravityCompat.END) {
-            mShadowEnd = shadowDrawable;
-        } else if ((gravity & Gravity.LEFT) == Gravity.LEFT) {
-            mShadowLeft = shadowDrawable;
-        } else if ((gravity & Gravity.RIGHT) == Gravity.RIGHT) {
-            mShadowRight = shadowDrawable;
-        } else {
-            return;
-        }
-        resolveShadowDrawables();
-        invalidate();
-    }
-
-    /**
-     * Set a simple drawable used for the left or right shadow. The drawable provided must have a
-     * nonzero intrinsic width. For API 21 and above, an elevation will be set on the drawer
-     * instead of the drawable provided.
-     *
-     * <p>Note that for better support for both left-to-right and right-to-left layout
-     * directions, a drawable for RTL layout (in additional to the one in LTR layout) can be
-     * defined with a resource qualifier "ldrtl" for API 17 and above with the gravity
-     * {@link GravityCompat#START}. Alternatively, for API 23 and above, the drawable can
-     * auto-mirrored such that the drawable will be mirrored in RTL layout.</p>
-     *
-     * @param resId Resource id of a shadow drawable to use at the edge of a drawer
-     * @param gravity Which drawer the shadow should apply to
-     */
-    public void setDrawerShadow(@DrawableRes int resId, @EdgeGravity int gravity) {
-        setDrawerShadow(getResources().getDrawable(resId), gravity);
-    }
-
-    /**
-     * Set a color to use for the scrim that obscures primary content while a drawer is open.
-     *
-     * @param color Color to use in 0xAARRGGBB format.
-     */
-    public void setScrimColor(@ColorInt int color) {
-        mScrimColor = color;
-        invalidate();
-    }
-
-    /**
-     * Set a listener to be notified of drawer events. Note that this method is deprecated
-     * and you should use {@link #addDrawerListener(DrawerListener)} to add a listener and
-     * {@link #removeDrawerListener(DrawerListener)} to remove a registered listener.
-     *
-     * @param listener Listener to notify when drawer events occur
-     * @deprecated Use {@link #addDrawerListener(DrawerListener)}
-     * @see DrawerListener
-     * @see #addDrawerListener(DrawerListener)
-     * @see #removeDrawerListener(DrawerListener)
-     */
-    @Deprecated
-    public void setDrawerListener(DrawerListener listener) {
-        // The logic in this method emulates what we had before support for multiple
-        // registered listeners.
-        if (mListener != null) {
-            removeDrawerListener(mListener);
-        }
-        if (listener != null) {
-            addDrawerListener(listener);
-        }
-        // Update the deprecated field so that we can remove the passed listener the next
-        // time we're called
-        mListener = listener;
-    }
-
-    /**
-     * Adds the specified listener to the list of listeners that will be notified of drawer events.
-     *
-     * @param listener Listener to notify when drawer events occur.
-     * @see #removeDrawerListener(DrawerListener)
-     */
-    public void addDrawerListener(@NonNull DrawerListener listener) {
-        if (listener == null) {
-            return;
-        }
-        if (mListeners == null) {
-            mListeners = new ArrayList<DrawerListener>();
-        }
-        mListeners.add(listener);
-    }
-
-    /**
-     * Removes the specified listener from the list of listeners that will be notified of drawer
-     * events.
-     *
-     * @param listener Listener to remove from being notified of drawer events
-     * @see #addDrawerListener(DrawerListener)
-     */
-    public void removeDrawerListener(@NonNull DrawerListener listener) {
-        if (listener == null) {
-            return;
-        }
-        if (mListeners == null) {
-            // This can happen if this method is called before the first call to addDrawerListener
-            return;
-        }
-        mListeners.remove(listener);
-    }
-
-    /**
-     * Enable or disable interaction with all drawers.
-     *
-     * <p>This allows the application to restrict the user's ability to open or close
-     * any drawer within this layout. DrawerLayout will still respond to calls to
-     * {@link #openDrawer(int)}, {@link #closeDrawer(int)} and friends if a drawer is locked.</p>
-     *
-     * <p>Locking drawers open or closed will implicitly open or close
-     * any drawers as appropriate.</p>
-     *
-     * @param lockMode The new lock mode for the given drawer. One of {@link #LOCK_MODE_UNLOCKED},
-     *                 {@link #LOCK_MODE_LOCKED_CLOSED} or {@link #LOCK_MODE_LOCKED_OPEN}.
-     */
-    public void setDrawerLockMode(@LockMode int lockMode) {
-        setDrawerLockMode(lockMode, Gravity.LEFT);
-        setDrawerLockMode(lockMode, Gravity.RIGHT);
-    }
-
-    /**
-     * Enable or disable interaction with the given drawer.
-     *
-     * <p>This allows the application to restrict the user's ability to open or close
-     * the given drawer. DrawerLayout will still respond to calls to {@link #openDrawer(int)},
-     * {@link #closeDrawer(int)} and friends if a drawer is locked.</p>
-     *
-     * <p>Locking a drawer open or closed will implicitly open or close
-     * that drawer as appropriate.</p>
-     *
-     * @param lockMode The new lock mode for the given drawer. One of {@link #LOCK_MODE_UNLOCKED},
-     *                 {@link #LOCK_MODE_LOCKED_CLOSED} or {@link #LOCK_MODE_LOCKED_OPEN}.
-     * @param edgeGravity Gravity.LEFT, RIGHT, START or END.
-     *                    Expresses which drawer to change the mode for.
-     *
-     * @see #LOCK_MODE_UNLOCKED
-     * @see #LOCK_MODE_LOCKED_CLOSED
-     * @see #LOCK_MODE_LOCKED_OPEN
-     */
-    public void setDrawerLockMode(@LockMode int lockMode, @EdgeGravity int edgeGravity) {
-        final int absGravity = GravityCompat.getAbsoluteGravity(edgeGravity,
-                ViewCompat.getLayoutDirection(this));
-
-        switch (edgeGravity) {
-            case Gravity.LEFT:
-                mLockModeLeft = lockMode;
-                break;
-            case Gravity.RIGHT:
-                mLockModeRight = lockMode;
-                break;
-            case GravityCompat.START:
-                mLockModeStart = lockMode;
-                break;
-            case GravityCompat.END:
-                mLockModeEnd = lockMode;
-                break;
-        }
-
-        if (lockMode != LOCK_MODE_UNLOCKED) {
-            // Cancel interaction in progress
-            final ViewDragHelper helper = absGravity == Gravity.LEFT ? mLeftDragger : mRightDragger;
-            helper.cancel();
-        }
-        switch (lockMode) {
-            case LOCK_MODE_LOCKED_OPEN:
-                final View toOpen = findDrawerWithGravity(absGravity);
-                if (toOpen != null) {
-                    openDrawer(toOpen);
-                }
-                break;
-            case LOCK_MODE_LOCKED_CLOSED:
-                final View toClose = findDrawerWithGravity(absGravity);
-                if (toClose != null) {
-                    closeDrawer(toClose);
-                }
-            break;
-                // default: do nothing
-        }
-    }
-
-    /**
-     * Enable or disable interaction with the given drawer.
-     *
-     * <p>This allows the application to restrict the user's ability to open or close
-     * the given drawer. DrawerLayout will still respond to calls to {@link #openDrawer(int)},
-     * {@link #closeDrawer(int)} and friends if a drawer is locked.</p>
-     *
-     * <p>Locking a drawer open or closed will implicitly open or close
-     * that drawer as appropriate.</p>
-     *
-     * @param lockMode The new lock mode for the given drawer. One of {@link #LOCK_MODE_UNLOCKED},
-     *                 {@link #LOCK_MODE_LOCKED_CLOSED} or {@link #LOCK_MODE_LOCKED_OPEN}.
-     * @param drawerView The drawer view to change the lock mode for
-     *
-     * @see #LOCK_MODE_UNLOCKED
-     * @see #LOCK_MODE_LOCKED_CLOSED
-     * @see #LOCK_MODE_LOCKED_OPEN
-     */
-    public void setDrawerLockMode(@LockMode int lockMode, View drawerView) {
-        if (!isDrawerView(drawerView)) {
-            throw new IllegalArgumentException("View " + drawerView + " is not a " +
-                    "drawer with appropriate layout_gravity");
-        }
-        final int gravity = ((LayoutParams) drawerView.getLayoutParams()).gravity;
-        setDrawerLockMode(lockMode, gravity);
-    }
-
-    /**
-     * Check the lock mode of the drawer with the given gravity.
-     *
-     * @param edgeGravity Gravity of the drawer to check
-     * @return one of {@link #LOCK_MODE_UNLOCKED}, {@link #LOCK_MODE_LOCKED_CLOSED} or
-     *         {@link #LOCK_MODE_LOCKED_OPEN}.
-     */
-    @LockMode
-    public int getDrawerLockMode(@EdgeGravity int edgeGravity) {
-        int layoutDirection = ViewCompat.getLayoutDirection(this);
-
-        switch (edgeGravity) {
-            case Gravity.LEFT:
-                if (mLockModeLeft != LOCK_MODE_UNDEFINED) {
-                    return mLockModeLeft;
-                }
-                int leftLockMode = (layoutDirection == ViewCompat.LAYOUT_DIRECTION_LTR) ?
-                        mLockModeStart : mLockModeEnd;
-                if (leftLockMode != LOCK_MODE_UNDEFINED) {
-                    return leftLockMode;
-                }
-                break;
-            case Gravity.RIGHT:
-                if (mLockModeRight != LOCK_MODE_UNDEFINED) {
-                    return mLockModeRight;
-                }
-                int rightLockMode = (layoutDirection == ViewCompat.LAYOUT_DIRECTION_LTR) ?
-                        mLockModeEnd : mLockModeStart;
-                if (rightLockMode != LOCK_MODE_UNDEFINED) {
-                    return rightLockMode;
-                }
-                break;
-            case GravityCompat.START:
-                if (mLockModeStart != LOCK_MODE_UNDEFINED) {
-                    return mLockModeStart;
-                }
-                int startLockMode = (layoutDirection == ViewCompat.LAYOUT_DIRECTION_LTR) ?
-                        mLockModeLeft : mLockModeRight;
-                if (startLockMode != LOCK_MODE_UNDEFINED) {
-                    return startLockMode;
-                }
-                break;
-            case GravityCompat.END:
-                if (mLockModeEnd != LOCK_MODE_UNDEFINED) {
-                    return mLockModeEnd;
-                }
-                int endLockMode = (layoutDirection == ViewCompat.LAYOUT_DIRECTION_LTR) ?
-                        mLockModeRight : mLockModeLeft;
-                if (endLockMode != LOCK_MODE_UNDEFINED) {
-                    return endLockMode;
-                }
-                break;
-        }
-
-        return LOCK_MODE_UNLOCKED;
-    }
-
-    /**
-     * Check the lock mode of the given drawer view.
-     *
-     * @param drawerView Drawer view to check lock mode
-     * @return one of {@link #LOCK_MODE_UNLOCKED}, {@link #LOCK_MODE_LOCKED_CLOSED} or
-     *         {@link #LOCK_MODE_LOCKED_OPEN}.
-     */
-    @LockMode
-    public int getDrawerLockMode(View drawerView) {
-        if (!isDrawerView(drawerView)) {
-            throw new IllegalArgumentException("View " + drawerView + " is not a drawer");
-        }
-        final int drawerGravity = ((LayoutParams) drawerView.getLayoutParams()).gravity;
-        return getDrawerLockMode(drawerGravity);
-    }
-
-    /**
-     * Sets the title of the drawer with the given gravity.
-     * <p>
-     * When accessibility is turned on, this is the title that will be used to
-     * identify the drawer to the active accessibility service.
-     *
-     * @param edgeGravity Gravity.LEFT, RIGHT, START or END. Expresses which
-     *            drawer to set the title for.
-     * @param title The title for the drawer.
-     */
-    public void setDrawerTitle(@EdgeGravity int edgeGravity, CharSequence title) {
-        final int absGravity = GravityCompat.getAbsoluteGravity(
-                edgeGravity, ViewCompat.getLayoutDirection(this));
-        if (absGravity == Gravity.LEFT) {
-            mTitleLeft = title;
-        } else if (absGravity == Gravity.RIGHT) {
-            mTitleRight = title;
-        }
-    }
-
-    /**
-     * Returns the title of the drawer with the given gravity.
-     *
-     * @param edgeGravity Gravity.LEFT, RIGHT, START or END. Expresses which
-     *            drawer to return the title for.
-     * @return The title of the drawer, or null if none set.
-     * @see #setDrawerTitle(int, CharSequence)
-     */
-    @Nullable
-    public CharSequence getDrawerTitle(@EdgeGravity int edgeGravity) {
-        final int absGravity = GravityCompat.getAbsoluteGravity(
-                edgeGravity, ViewCompat.getLayoutDirection(this));
-        if (absGravity == Gravity.LEFT) {
-            return mTitleLeft;
-        } else if (absGravity == Gravity.RIGHT) {
-            return mTitleRight;
-        }
-        return null;
-    }
-
-    /**
-     * Resolve the shared state of all drawers from the component ViewDragHelpers.
-     * Should be called whenever a ViewDragHelper's state changes.
-     */
-    void updateDrawerState(int forGravity, @State int activeState, View activeDrawer) {
-        final int leftState = mLeftDragger.getViewDragState();
-        final int rightState = mRightDragger.getViewDragState();
-
-        final int state;
-        if (leftState == STATE_DRAGGING || rightState == STATE_DRAGGING) {
-            state = STATE_DRAGGING;
-        } else if (leftState == STATE_SETTLING || rightState == STATE_SETTLING) {
-            state = STATE_SETTLING;
-        } else {
-            state = STATE_IDLE;
-        }
-
-        if (activeDrawer != null && activeState == STATE_IDLE) {
-            final LayoutParams lp = (LayoutParams) activeDrawer.getLayoutParams();
-            if (lp.onScreen == 0) {
-                dispatchOnDrawerClosed(activeDrawer);
-            } else if (lp.onScreen == 1) {
-                dispatchOnDrawerOpened(activeDrawer);
-            }
-        }
-
-        if (state != mDrawerState) {
-            mDrawerState = state;
-
-            if (mListeners != null) {
-                // Notify the listeners. Do that from the end of the list so that if a listener
-                // removes itself as the result of being called, it won't mess up with our iteration
-                int listenerCount = mListeners.size();
-                for (int i = listenerCount - 1; i >= 0; i--) {
-                    mListeners.get(i).onDrawerStateChanged(state);
-                }
-            }
-        }
-    }
-
-    void dispatchOnDrawerClosed(View drawerView) {
-        final LayoutParams lp = (LayoutParams) drawerView.getLayoutParams();
-        if ((lp.openState & LayoutParams.FLAG_IS_OPENED) == 1) {
-            lp.openState = 0;
-
-            if (mListeners != null) {
-                // Notify the listeners. Do that from the end of the list so that if a listener
-                // removes itself as the result of being called, it won't mess up with our iteration
-                int listenerCount = mListeners.size();
-                for (int i = listenerCount - 1; i >= 0; i--) {
-                    mListeners.get(i).onDrawerClosed(drawerView);
-                }
-            }
-
-            updateChildrenImportantForAccessibility(drawerView, false);
-
-            // Only send WINDOW_STATE_CHANGE if the host has window focus. This
-            // may change if support for multiple foreground windows (e.g. IME)
-            // improves.
-            if (hasWindowFocus()) {
-                final View rootView = getRootView();
-                if (rootView != null) {
-                    rootView.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
-                }
-            }
-        }
-    }
-
-    void dispatchOnDrawerOpened(View drawerView) {
-        final LayoutParams lp = (LayoutParams) drawerView.getLayoutParams();
-        if ((lp.openState & LayoutParams.FLAG_IS_OPENED) == 0) {
-            lp.openState = LayoutParams.FLAG_IS_OPENED;
-            if (mListeners != null) {
-                // Notify the listeners. Do that from the end of the list so that if a listener
-                // removes itself as the result of being called, it won't mess up with our iteration
-                int listenerCount = mListeners.size();
-                for (int i = listenerCount - 1; i >= 0; i--) {
-                    mListeners.get(i).onDrawerOpened(drawerView);
-                }
-            }
-
-            updateChildrenImportantForAccessibility(drawerView, true);
-
-            // Only send WINDOW_STATE_CHANGE if the host has window focus.
-            if (hasWindowFocus()) {
-                sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
-            }
-
-            drawerView.requestFocus();
-        }
-    }
-
-    private void updateChildrenImportantForAccessibility(View drawerView, boolean isDrawerOpen) {
-        final int childCount = getChildCount();
-        for (int i = 0; i < childCount; i++) {
-            final View child = getChildAt(i);
-            if (!isDrawerOpen && !isDrawerView(child)
-                    || isDrawerOpen && child == drawerView) {
-                // Drawer is closed and this is a content view or this is an
-                // open drawer view, so it should be visible.
-                ViewCompat.setImportantForAccessibility(child,
-                        ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_YES);
-            } else {
-                ViewCompat.setImportantForAccessibility(child,
-                        ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS);
-            }
-        }
-    }
-
-    void dispatchOnDrawerSlide(View drawerView, float slideOffset) {
-        if (mListeners != null) {
-            // Notify the listeners. Do that from the end of the list so that if a listener
-            // removes itself as the result of being called, it won't mess up with our iteration
-            int listenerCount = mListeners.size();
-            for (int i = listenerCount - 1; i >= 0; i--) {
-                mListeners.get(i).onDrawerSlide(drawerView, slideOffset);
-            }
-        }
-    }
-
-    void setDrawerViewOffset(View drawerView, float slideOffset) {
-        final LayoutParams lp = (LayoutParams) drawerView.getLayoutParams();
-        if (slideOffset == lp.onScreen) {
-            return;
-        }
-
-        lp.onScreen = slideOffset;
-        dispatchOnDrawerSlide(drawerView, slideOffset);
-    }
-
-    float getDrawerViewOffset(View drawerView) {
-        return ((LayoutParams) drawerView.getLayoutParams()).onScreen;
-    }
-
-    /**
-     * @return the absolute gravity of the child drawerView, resolved according
-     *         to the current layout direction
-     */
-    int getDrawerViewAbsoluteGravity(View drawerView) {
-        final int gravity = ((LayoutParams) drawerView.getLayoutParams()).gravity;
-        return GravityCompat.getAbsoluteGravity(gravity, ViewCompat.getLayoutDirection(this));
-    }
-
-    boolean checkDrawerViewAbsoluteGravity(View drawerView, int checkFor) {
-        final int absGravity = getDrawerViewAbsoluteGravity(drawerView);
-        return (absGravity & checkFor) == checkFor;
-    }
-
-    View findOpenDrawer() {
-        final int childCount = getChildCount();
-        for (int i = 0; i < childCount; i++) {
-            final View child = getChildAt(i);
-            final LayoutParams childLp = (LayoutParams) child.getLayoutParams();
-            if ((childLp.openState & LayoutParams.FLAG_IS_OPENED) == 1) {
-                return child;
-            }
-        }
-        return null;
-    }
-
-    void moveDrawerToOffset(View drawerView, float slideOffset) {
-        final float oldOffset = getDrawerViewOffset(drawerView);
-        final int width = drawerView.getWidth();
-        final int oldPos = (int) (width * oldOffset);
-        final int newPos = (int) (width * slideOffset);
-        final int dx = newPos - oldPos;
-
-        drawerView.offsetLeftAndRight(
-                checkDrawerViewAbsoluteGravity(drawerView, Gravity.LEFT) ? dx : -dx);
-        setDrawerViewOffset(drawerView, slideOffset);
-    }
-
-    /**
-     * @param gravity the gravity of the child to return. If specified as a
-     *            relative value, it will be resolved according to the current
-     *            layout direction.
-     * @return the drawer with the specified gravity
-     */
-    View findDrawerWithGravity(int gravity) {
-        final int absHorizGravity = GravityCompat.getAbsoluteGravity(
-                gravity, ViewCompat.getLayoutDirection(this)) & Gravity.HORIZONTAL_GRAVITY_MASK;
-        final int childCount = getChildCount();
-        for (int i = 0; i < childCount; i++) {
-            final View child = getChildAt(i);
-            final int childAbsGravity = getDrawerViewAbsoluteGravity(child);
-            if ((childAbsGravity & Gravity.HORIZONTAL_GRAVITY_MASK) == absHorizGravity) {
-                return child;
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Simple gravity to string - only supports LEFT and RIGHT for debugging output.
-     *
-     * @param gravity Absolute gravity value
-     * @return LEFT or RIGHT as appropriate, or a hex string
-     */
-    static String gravityToString(@EdgeGravity int gravity) {
-        if ((gravity & Gravity.LEFT) == Gravity.LEFT) {
-            return "LEFT";
-        }
-        if ((gravity & Gravity.RIGHT) == Gravity.RIGHT) {
-            return "RIGHT";
-        }
-        return Integer.toHexString(gravity);
-    }
-
-    @Override
-    protected void onDetachedFromWindow() {
-        super.onDetachedFromWindow();
-        mFirstLayout = true;
-    }
-
-    @Override
-    protected void onAttachedToWindow() {
-        super.onAttachedToWindow();
-        mFirstLayout = true;
-    }
-
-    @Override
-    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
-        int widthMode = MeasureSpec.getMode(widthMeasureSpec);
-        int heightMode = MeasureSpec.getMode(heightMeasureSpec);
-        int widthSize = MeasureSpec.getSize(widthMeasureSpec);
-        int heightSize = MeasureSpec.getSize(heightMeasureSpec);
-
-        if (widthMode != MeasureSpec.EXACTLY || heightMode != MeasureSpec.EXACTLY) {
-            if (isInEditMode()) {
-                // Don't crash the layout editor. Consume all of the space if specified
-                // or pick a magic number from thin air otherwise.
-                // TODO Better communication with tools of this bogus state.
-                // It will crash on a real device.
-                if (widthMode == MeasureSpec.AT_MOST) {
-                    widthMode = MeasureSpec.EXACTLY;
-                } else if (widthMode == MeasureSpec.UNSPECIFIED) {
-                    widthMode = MeasureSpec.EXACTLY;
-                    widthSize = 300;
-                }
-                if (heightMode == MeasureSpec.AT_MOST) {
-                    heightMode = MeasureSpec.EXACTLY;
-                }
-                else if (heightMode == MeasureSpec.UNSPECIFIED) {
-                    heightMode = MeasureSpec.EXACTLY;
-                    heightSize = 300;
-                }
-            } else {
-                throw new IllegalArgumentException(
-                        "DrawerLayout must be measured with MeasureSpec.EXACTLY.");
-            }
-        }
-
-        setMeasuredDimension(widthSize, heightSize);
-
-        final boolean applyInsets = mLastInsets != null && ViewCompat.getFitsSystemWindows(this);
-        final int layoutDirection = ViewCompat.getLayoutDirection(this);
-
-        // Only one drawer is permitted along each vertical edge (left / right). These two booleans
-        // are tracking the presence of the edge drawers.
-        boolean hasDrawerOnLeftEdge = false;
-        boolean hasDrawerOnRightEdge = false;
-        final int childCount = getChildCount();
-        for (int i = 0; i < childCount; i++) {
-            final View child = getChildAt(i);
-
-            if (child.getVisibility() == GONE) {
-                continue;
-            }
-
-            final LayoutParams lp = (LayoutParams) child.getLayoutParams();
-
-            if (applyInsets) {
-                final int cgrav = GravityCompat.getAbsoluteGravity(lp.gravity, layoutDirection);
-                if (ViewCompat.getFitsSystemWindows(child)) {
-                    IMPL.dispatchChildInsets(child, mLastInsets, cgrav);
-                } else {
-                    IMPL.applyMarginInsets(lp, mLastInsets, cgrav);
-                }
-            }
-
-            if (isContentView(child)) {
-                // Content views get measured at exactly the layout's size.
-                final int contentWidthSpec = MeasureSpec.makeMeasureSpec(
-                        widthSize - lp.leftMargin - lp.rightMargin, MeasureSpec.EXACTLY);
-                final int contentHeightSpec = MeasureSpec.makeMeasureSpec(
-                        heightSize - lp.topMargin - lp.bottomMargin, MeasureSpec.EXACTLY);
-                child.measure(contentWidthSpec, contentHeightSpec);
-            } else if (isDrawerView(child)) {
-                if (SET_DRAWER_SHADOW_FROM_ELEVATION) {
-                    if (ViewCompat.getElevation(child) != mDrawerElevation) {
-                        ViewCompat.setElevation(child, mDrawerElevation);
-                    }
-                }
-                final @EdgeGravity int childGravity =
-                        getDrawerViewAbsoluteGravity(child) & Gravity.HORIZONTAL_GRAVITY_MASK;
-                // Note that the isDrawerView check guarantees that childGravity here is either
-                // LEFT or RIGHT
-                boolean isLeftEdgeDrawer = (childGravity == Gravity.LEFT);
-                if ((isLeftEdgeDrawer && hasDrawerOnLeftEdge) ||
-                        (!isLeftEdgeDrawer && hasDrawerOnRightEdge)) {
-                    throw new IllegalStateException("Child drawer has absolute gravity " +
-                            gravityToString(childGravity) + " but this " + TAG + " already has a " +
-                            "drawer view along that edge");
-                }
-                if (isLeftEdgeDrawer) {
-                    hasDrawerOnLeftEdge = true;
-                } else {
-                    hasDrawerOnRightEdge = true;
-                }
-                final int drawerWidthSpec = getChildMeasureSpec(widthMeasureSpec,
-                        mMinDrawerMargin + lp.leftMargin + lp.rightMargin,
-                        lp.width);
-                final int drawerHeightSpec = getChildMeasureSpec(heightMeasureSpec,
-                        lp.topMargin + lp.bottomMargin,
-                        lp.height);
-                child.measure(drawerWidthSpec, drawerHeightSpec);
-            } else {
-                throw new IllegalStateException("Child " + child + " at index " + i +
-                        " does not have a valid layout_gravity - must be Gravity.LEFT, " +
-                        "Gravity.RIGHT or Gravity.NO_GRAVITY");
-            }
-        }
-    }
-
-    private void resolveShadowDrawables() {
-        if (SET_DRAWER_SHADOW_FROM_ELEVATION) {
-            return;
-        }
-        mShadowLeftResolved = resolveLeftShadow();
-        mShadowRightResolved = resolveRightShadow();
-    }
-
-    private Drawable resolveLeftShadow() {
-        int layoutDirection = ViewCompat.getLayoutDirection(this);
-        // Prefer shadows defined with start/end gravity over left and right.
-        if (layoutDirection == ViewCompat.LAYOUT_DIRECTION_LTR) {
-            if (mShadowStart != null) {
-                // Correct drawable layout direction, if needed.
-                mirror(mShadowStart, layoutDirection);
-                return mShadowStart;
-            }
-        } else {
-            if (mShadowEnd != null) {
-                // Correct drawable layout direction, if needed.
-                mirror(mShadowEnd, layoutDirection);
-                return mShadowEnd;
-            }
-        }
-        return mShadowLeft;
-    }
-
-    private Drawable resolveRightShadow() {
-        int layoutDirection = ViewCompat.getLayoutDirection(this);
-        if (layoutDirection == ViewCompat.LAYOUT_DIRECTION_LTR) {
-            if (mShadowEnd != null) {
-                // Correct drawable layout direction, if needed.
-                mirror(mShadowEnd, layoutDirection);
-                return mShadowEnd;
-            }
-        } else {
-            if (mShadowStart != null) {
-                // Correct drawable layout direction, if needed.
-                mirror(mShadowStart, layoutDirection);
-                return mShadowStart;
-            }
-        }
-        return mShadowRight;
-    }
-
-    /**
-     * Change the layout direction of the given drawable.
-     * Return true if auto-mirror is supported and drawable's layout direction can be changed.
-     * Otherwise, return false.
-     */
-    private boolean mirror(Drawable drawable, int layoutDirection) {
-        if (drawable == null || !DrawableCompat.isAutoMirrored(drawable)) {
-            return false;
-        }
-
-        DrawableCompat.setLayoutDirection(drawable, layoutDirection);
-        return true;
-    }
-
-    @Override
-    protected void onLayout(boolean changed, int l, int t, int r, int b) {
-        mInLayout = true;
-        final int width = r - l;
-        final int childCount = getChildCount();
-        for (int i = 0; i < childCount; i++) {
-            final View child = getChildAt(i);
-
-            if (child.getVisibility() == GONE) {
-                continue;
-            }
-
-            final LayoutParams lp = (LayoutParams) child.getLayoutParams();
-
-            if (isContentView(child)) {
-                child.layout(lp.leftMargin, lp.topMargin,
-                        lp.leftMargin + child.getMeasuredWidth(),
-                        lp.topMargin + child.getMeasuredHeight());
-            } else { // Drawer, if it wasn't onMeasure would have thrown an exception.
-                final int childWidth = child.getMeasuredWidth();
-                final int childHeight = child.getMeasuredHeight();
-                int childLeft;
-
-                final float newOffset;
-                if (checkDrawerViewAbsoluteGravity(child, Gravity.LEFT)) {
-                    childLeft = -childWidth + (int) (childWidth * lp.onScreen);
-                    newOffset = (float) (childWidth + childLeft) / childWidth;
-                } else { // Right; onMeasure checked for us.
-                    childLeft = width - (int) (childWidth * lp.onScreen);
-                    newOffset = (float) (width - childLeft) / childWidth;
-                }
-
-                final boolean changeOffset = newOffset != lp.onScreen;
-
-                final int vgrav = lp.gravity & Gravity.VERTICAL_GRAVITY_MASK;
-
-                switch (vgrav) {
-                    default:
-                    case Gravity.TOP: {
-                        child.layout(childLeft, lp.topMargin, childLeft + childWidth,
-                                lp.topMargin + childHeight);
-                        break;
-                    }
-
-                    case Gravity.BOTTOM: {
-                        final int height = b - t;
-                        child.layout(childLeft,
-                                height - lp.bottomMargin - child.getMeasuredHeight(),
-                                childLeft + childWidth,
-                                height - lp.bottomMargin);
-                        break;
-                    }
-
-                    case Gravity.CENTER_VERTICAL: {
-                        final int height = b - t;
-                        int childTop = (height - childHeight) / 2;
-
-                        // Offset for margins. If things don't fit right because of
-                        // bad measurement before, oh well.
-                        if (childTop < lp.topMargin) {
-                            childTop = lp.topMargin;
-                        } else if (childTop + childHeight > height - lp.bottomMargin) {
-                            childTop = height - lp.bottomMargin - childHeight;
-                        }
-                        child.layout(childLeft, childTop, childLeft + childWidth,
-                                childTop + childHeight);
-                        break;
-                    }
-                }
-
-                if (changeOffset) {
-                    setDrawerViewOffset(child, newOffset);
-                }
-
-                final int newVisibility = lp.onScreen > 0 ? VISIBLE : INVISIBLE;
-                if (child.getVisibility() != newVisibility) {
-                    child.setVisibility(newVisibility);
-                }
-            }
-        }
-        mInLayout = false;
-        mFirstLayout = false;
-    }
-
-    @Override
-    public void requestLayout() {
-        if (!mInLayout) {
-            super.requestLayout();
-        }
-    }
-
-    @Override
-    public void computeScroll() {
-        final int childCount = getChildCount();
-        float scrimOpacity = 0;
-        for (int i = 0; i < childCount; i++) {
-            final float onscreen = ((LayoutParams) getChildAt(i).getLayoutParams()).onScreen;
-            scrimOpacity = Math.max(scrimOpacity, onscreen);
-        }
-        mScrimOpacity = scrimOpacity;
-
-        // "|" used on purpose; both need to run.
-        if (mLeftDragger.continueSettling(true) | mRightDragger.continueSettling(true)) {
-            ViewCompat.postInvalidateOnAnimation(this);
-        }
-    }
-
-    private static boolean hasOpaqueBackground(View v) {
-        final Drawable bg = v.getBackground();
-        if (bg != null) {
-            return bg.getOpacity() == PixelFormat.OPAQUE;
-        }
-        return false;
-    }
-
-    /**
-     * Set a drawable to draw in the insets area for the status bar.
-     * Note that this will only be activated if this DrawerLayout fitsSystemWindows.
-     *
-     * @param bg Background drawable to draw behind the status bar
-     */
-    public void setStatusBarBackground(Drawable bg) {
-        mStatusBarBackground = bg;
-        invalidate();
-    }
-
-    /**
-     * Gets the drawable used to draw in the insets area for the status bar.
-     *
-     * @return The status bar background drawable, or null if none set
-     */
-    public Drawable getStatusBarBackgroundDrawable() {
-        return mStatusBarBackground;
-    }
-
-    /**
-     * Set a drawable to draw in the insets area for the status bar.
-     * Note that this will only be activated if this DrawerLayout fitsSystemWindows.
-     *
-     * @param resId Resource id of a background drawable to draw behind the status bar
-     */
-    public void setStatusBarBackground(int resId) {
-        mStatusBarBackground = resId != 0 ? ContextCompat.getDrawable(getContext(), resId) : null;
-        invalidate();
-    }
-
-    /**
-     * Set a drawable to draw in the insets area for the status bar.
-     * Note that this will only be activated if this DrawerLayout fitsSystemWindows.
-     *
-     * @param color Color to use as a background drawable to draw behind the status bar
-     *              in 0xAARRGGBB format.
-     */
-    public void setStatusBarBackgroundColor(@ColorInt int color) {
-        mStatusBarBackground = new ColorDrawable(color);
-        invalidate();
-    }
-
-    public void onRtlPropertiesChanged(int layoutDirection) {
-        resolveShadowDrawables();
-    }
-
-    @Override
-    public void onDraw(Canvas c) {
-        super.onDraw(c);
-        if (mDrawStatusBarBackground && mStatusBarBackground != null) {
-            final int inset = IMPL.getTopInset(mLastInsets);
-            if (inset > 0) {
-                mStatusBarBackground.setBounds(0, 0, getWidth(), inset);
-                mStatusBarBackground.draw(c);
-            }
-        }
-    }
-
-    @Override
-    protected boolean drawChild(Canvas canvas, View child, long drawingTime) {
-        final int height = getHeight();
-        final boolean drawingContent = isContentView(child);
-        int clipLeft = 0, clipRight = getWidth();
-
-        final int restoreCount = canvas.save();
-        if (drawingContent) {
-            final int childCount = getChildCount();
-            for (int i = 0; i < childCount; i++) {
-                final View v = getChildAt(i);
-                if (v == child || v.getVisibility() != VISIBLE ||
-                        !hasOpaqueBackground(v) || !isDrawerView(v) ||
-                        v.getHeight() < height) {
-                    continue;
-                }
-
-                if (checkDrawerViewAbsoluteGravity(v, Gravity.LEFT)) {
-                    final int vright = v.getRight();
-                    if (vright > clipLeft) clipLeft = vright;
-                } else {
-                    final int vleft = v.getLeft();
-                    if (vleft < clipRight) clipRight = vleft;
-                }
-            }
-            canvas.clipRect(clipLeft, 0, clipRight, getHeight());
-        }
-        final boolean result = super.drawChild(canvas, child, drawingTime);
-        canvas.restoreToCount(restoreCount);
-
-        if (mScrimOpacity > 0 && drawingContent) {
-            final int baseAlpha = (mScrimColor & 0xff000000) >>> 24;
-            final int imag = (int) (baseAlpha * mScrimOpacity);
-            final int color = imag << 24 | (mScrimColor & 0xffffff);
-            mScrimPaint.setColor(color);
-
-            canvas.drawRect(clipLeft, 0, clipRight, getHeight(), mScrimPaint);
-        } else if (mShadowLeftResolved != null
-                &&  checkDrawerViewAbsoluteGravity(child, Gravity.LEFT)) {
-            final int shadowWidth = mShadowLeftResolved.getIntrinsicWidth();
-            final int childRight = child.getRight();
-            final int drawerPeekDistance = mLeftDragger.getEdgeSize();
-            final float alpha =
-                    Math.max(0, Math.min((float) childRight / drawerPeekDistance, 1.f));
-            mShadowLeftResolved.setBounds(childRight, child.getTop(),
-                    childRight + shadowWidth, child.getBottom());
-            mShadowLeftResolved.setAlpha((int) (0xff * alpha));
-            mShadowLeftResolved.draw(canvas);
-        } else if (mShadowRightResolved != null
-                &&  checkDrawerViewAbsoluteGravity(child, Gravity.RIGHT)) {
-            final int shadowWidth = mShadowRightResolved.getIntrinsicWidth();
-            final int childLeft = child.getLeft();
-            final int showing = getWidth() - childLeft;
-            final int drawerPeekDistance = mRightDragger.getEdgeSize();
-            final float alpha =
-                    Math.max(0, Math.min((float) showing / drawerPeekDistance, 1.f));
-            mShadowRightResolved.setBounds(childLeft - shadowWidth, child.getTop(),
-                    childLeft, child.getBottom());
-            mShadowRightResolved.setAlpha((int) (0xff * alpha));
-            mShadowRightResolved.draw(canvas);
-        }
-        return result;
-    }
-
-    boolean isContentView(View child) {
-        return ((LayoutParams) child.getLayoutParams()).gravity == Gravity.NO_GRAVITY;
-    }
-
-    boolean isDrawerView(View child) {
-        final int gravity = ((LayoutParams) child.getLayoutParams()).gravity;
-        final int absGravity = GravityCompat.getAbsoluteGravity(gravity,
-                ViewCompat.getLayoutDirection(child));
-        if ((absGravity & Gravity.LEFT) != 0) {
-            // This child is a left-edge drawer
-            return true;
-        }
-        if ((absGravity & Gravity.RIGHT) != 0) {
-            // This child is a right-edge drawer
-            return true;
-        }
-        return false;
-    }
-
-    @Override
-    public boolean onInterceptTouchEvent(MotionEvent ev) {
-        final int action = MotionEventCompat.getActionMasked(ev);
-
-        // "|" used deliberately here; both methods should be invoked.
-        final boolean interceptForDrag = mLeftDragger.shouldInterceptTouchEvent(ev) |
-                mRightDragger.shouldInterceptTouchEvent(ev);
-
-        boolean interceptForTap = false;
-
-        switch (action) {
-            case MotionEvent.ACTION_DOWN: {
-                final float x = ev.getX();
-                final float y = ev.getY();
-                mInitialMotionX = x;
-                mInitialMotionY = y;
-                if (mScrimOpacity > 0) {
-                    final View child = mLeftDragger.findTopChildUnder((int) x, (int) y);
-                    if (child != null && isContentView(child)) {
-                        interceptForTap = true;
-                    }
-                }
-                mDisallowInterceptRequested = false;
-                mChildrenCanceledTouch = false;
-                break;
-            }
-
-            case MotionEvent.ACTION_MOVE: {
-                // If we cross the touch slop, don't perform the delayed peek for an edge touch.
-                if (mLeftDragger.checkTouchSlop(ViewDragHelper.DIRECTION_ALL)) {
-                    mLeftCallback.removeCallbacks();
-                    mRightCallback.removeCallbacks();
-                }
-                break;
-            }
-
-            case MotionEvent.ACTION_CANCEL:
-            case MotionEvent.ACTION_UP: {
-                closeDrawers(true);
-                mDisallowInterceptRequested = false;
-                mChildrenCanceledTouch = false;
-            }
-        }
-
-        return interceptForDrag || interceptForTap || hasPeekingDrawer() || mChildrenCanceledTouch;
-    }
-
-    @Override
-    public boolean onTouchEvent(MotionEvent ev) {
-        mLeftDragger.processTouchEvent(ev);
-        mRightDragger.processTouchEvent(ev);
-
-        final int action = ev.getAction();
-        boolean wantTouchEvents = true;
-
-        switch (action & MotionEventCompat.ACTION_MASK) {
-            case MotionEvent.ACTION_DOWN: {
-                final float x = ev.getX();
-                final float y = ev.getY();
-                mInitialMotionX = x;
-                mInitialMotionY = y;
-                mDisallowInterceptRequested = false;
-                mChildrenCanceledTouch = false;
-                break;
-            }
-
-            case MotionEvent.ACTION_UP: {
-                final float x = ev.getX();
-                final float y = ev.getY();
-                boolean peekingOnly = true;
-                final View touchedView = mLeftDragger.findTopChildUnder((int) x, (int) y);
-                if (touchedView != null && isContentView(touchedView)) {
-                    final float dx = x - mInitialMotionX;
-                    final float dy = y - mInitialMotionY;
-                    final int slop = mLeftDragger.getTouchSlop();
-                    if (dx * dx + dy * dy < slop * slop) {
-                        // Taps close a dimmed open drawer but only if it isn't locked open.
-                        final View openDrawer = findOpenDrawer();
-                        if (openDrawer != null) {
-                            peekingOnly = getDrawerLockMode(openDrawer) == LOCK_MODE_LOCKED_OPEN;
-                        }
-                    }
-                }
-                closeDrawers(peekingOnly);
-                mDisallowInterceptRequested = false;
-                break;
-            }
-
-            case MotionEvent.ACTION_CANCEL: {
-                closeDrawers(true);
-                mDisallowInterceptRequested = false;
-                mChildrenCanceledTouch = false;
-                break;
-            }
-        }
-
-        return wantTouchEvents;
-    }
-
-    public void requestDisallowInterceptTouchEvent(boolean disallowIntercept) {
-        if (CHILDREN_DISALLOW_INTERCEPT ||
-                (!mLeftDragger.isEdgeTouched(ViewDragHelper.EDGE_LEFT) &&
-                !mRightDragger.isEdgeTouched(ViewDragHelper.EDGE_RIGHT))) {
-            // If we have an edge touch we want to skip this and track it for later instead.
-            super.requestDisallowInterceptTouchEvent(disallowIntercept);
-        }
-        mDisallowInterceptRequested = disallowIntercept;
-        if (disallowIntercept) {
-            closeDrawers(true);
-        }
-    }
-
-    /**
-     * Close all currently open drawer views by animating them out of view.
-     */
-    public void closeDrawers() {
-        closeDrawers(false);
-    }
-
-    void closeDrawers(boolean peekingOnly) {
-        boolean needsInvalidate = false;
-        final int childCount = getChildCount();
-        for (int i = 0; i < childCount; i++) {
-            final View child = getChildAt(i);
-            final LayoutParams lp = (LayoutParams) child.getLayoutParams();
-
-            if (!isDrawerView(child) || (peekingOnly && !lp.isPeeking)) {
-                continue;
-            }
-
-            final int childWidth = child.getWidth();
-
-            if (checkDrawerViewAbsoluteGravity(child, Gravity.LEFT)) {
-                needsInvalidate |= mLeftDragger.smoothSlideViewTo(child,
-                        -childWidth, child.getTop());
-            } else {
-                needsInvalidate |= mRightDragger.smoothSlideViewTo(child,
-                        getWidth(), child.getTop());
-            }
-
-            lp.isPeeking = false;
-        }
-
-        mLeftCallback.removeCallbacks();
-        mRightCallback.removeCallbacks();
-
-        if (needsInvalidate) {
-            invalidate();
-        }
-    }
-
-    /**
-     * Open the specified drawer view by animating it into view.
-     *
-     * @param drawerView Drawer view to open
-     */
-    public void openDrawer(View drawerView) {
-        openDrawer(drawerView, true);
-    }
-
-    /**
-     * Open the specified drawer view.
-     *
-     * @param drawerView Drawer view to open
-     * @param animate Whether opening of the drawer should be animated.
-     */
-    public void openDrawer(View drawerView, boolean animate) {
-        if (!isDrawerView(drawerView)) {
-            throw new IllegalArgumentException("View " + drawerView + " is not a sliding drawer");
-        }
-
-        final LayoutParams lp = (LayoutParams) drawerView.getLayoutParams();
-        if (mFirstLayout) {
-            lp.onScreen = 1.f;
-            lp.openState = LayoutParams.FLAG_IS_OPENED;
-
-            updateChildrenImportantForAccessibility(drawerView, true);
-        } else if (animate) {
-            lp.openState |= LayoutParams.FLAG_IS_OPENING;
-
-            if (checkDrawerViewAbsoluteGravity(drawerView, Gravity.LEFT)) {
-                mLeftDragger.smoothSlideViewTo(drawerView, 0, drawerView.getTop());
-            } else {
-                mRightDragger.smoothSlideViewTo(drawerView, getWidth() - drawerView.getWidth(),
-                        drawerView.getTop());
-            }
-        } else {
-            moveDrawerToOffset(drawerView, 1.f);
-            updateDrawerState(lp.gravity, STATE_IDLE, drawerView);
-            drawerView.setVisibility(VISIBLE);
-        }
-        invalidate();
-    }
-
-    /**
-     * Open the specified drawer by animating it out of view.
-     *
-     * @param gravity Gravity.LEFT to move the left drawer or Gravity.RIGHT for the right.
-     *                GravityCompat.START or GravityCompat.END may also be used.
-     */
-    public void openDrawer(@EdgeGravity int gravity) {
-        openDrawer(gravity, true);
-    }
-
-    /**
-     * Open the specified drawer.
-     *
-     * @param gravity Gravity.LEFT to move the left drawer or Gravity.RIGHT for the right.
-     *                GravityCompat.START or GravityCompat.END may also be used.
-     * @param animate Whether opening of the drawer should be animated.
-     */
-    public void openDrawer(@EdgeGravity int gravity, boolean animate) {
-        final View drawerView = findDrawerWithGravity(gravity);
-        if (drawerView == null) {
-            throw new IllegalArgumentException("No drawer view found with gravity " +
-                    gravityToString(gravity));
-        }
-        openDrawer(drawerView, animate);
-    }
-
-    /**
-     * Close the specified drawer view by animating it into view.
-     *
-     * @param drawerView Drawer view to close
-     */
-    public void closeDrawer(View drawerView) {
-        closeDrawer(drawerView, true);
-    }
-
-    /**
-     * Close the specified drawer view.
-     *
-     * @param drawerView Drawer view to close
-     * @param animate Whether closing of the drawer should be animated.
-     */
-    public void closeDrawer(View drawerView, boolean animate) {
-        if (!isDrawerView(drawerView)) {
-            throw new IllegalArgumentException("View " + drawerView + " is not a sliding drawer");
-        }
-
-        final LayoutParams lp = (LayoutParams) drawerView.getLayoutParams();
-        if (mFirstLayout) {
-            lp.onScreen = 0.f;
-            lp.openState = 0;
-        } else if (animate) {
-            lp.openState |= LayoutParams.FLAG_IS_CLOSING;
-
-            if (checkDrawerViewAbsoluteGravity(drawerView, Gravity.LEFT)) {
-                mLeftDragger.smoothSlideViewTo(drawerView, -drawerView.getWidth(),
-                        drawerView.getTop());
-            } else {
-                mRightDragger.smoothSlideViewTo(drawerView, getWidth(), drawerView.getTop());
-            }
-        } else {
-            moveDrawerToOffset(drawerView, 0.f);
-            updateDrawerState(lp.gravity, STATE_IDLE, drawerView);
-            drawerView.setVisibility(INVISIBLE);
-        }
-        invalidate();
-    }
-
-    /**
-     * Close the specified drawer by animating it out of view.
-     *
-     * @param gravity Gravity.LEFT to move the left drawer or Gravity.RIGHT for the right.
-     *                GravityCompat.START or GravityCompat.END may also be used.
-     */
-    public void closeDrawer(@EdgeGravity int gravity) {
-        closeDrawer(gravity, true);
-    }
-
-    /**
-     * Close the specified drawer.
-     *
-     * @param gravity Gravity.LEFT to move the left drawer or Gravity.RIGHT for the right.
-     *                GravityCompat.START or GravityCompat.END may also be used.
-     * @param animate Whether closing of the drawer should be animated.
-     */
-    public void closeDrawer(@EdgeGravity int gravity, boolean animate) {
-        final View drawerView = findDrawerWithGravity(gravity);
-        if (drawerView == null) {
-            throw new IllegalArgumentException("No drawer view found with gravity " +
-                    gravityToString(gravity));
-        }
-        closeDrawer(drawerView, animate);
-    }
-
-    /**
-     * Check if the given drawer view is currently in an open state.
-     * To be considered "open" the drawer must have settled into its fully
-     * visible state. To check for partial visibility use
-     * {@link #isDrawerVisible(android.view.View)}.
-     *
-     * @param drawer Drawer view to check
-     * @return true if the given drawer view is in an open state
-     * @see #isDrawerVisible(android.view.View)
-     */
-    public boolean isDrawerOpen(View drawer) {
-        if (!isDrawerView(drawer)) {
-            throw new IllegalArgumentException("View " + drawer + " is not a drawer");
-        }
-        LayoutParams drawerLp = (LayoutParams) drawer.getLayoutParams();
-        return (drawerLp.openState & LayoutParams.FLAG_IS_OPENED) == 1;
-    }
-
-    /**
-     * Check if the given drawer view is currently in an open state.
-     * To be considered "open" the drawer must have settled into its fully
-     * visible state. If there is no drawer with the given gravity this method
-     * will return false.
-     *
-     * @param drawerGravity Gravity of the drawer to check
-     * @return true if the given drawer view is in an open state
-     */
-    public boolean isDrawerOpen(@EdgeGravity int drawerGravity) {
-        final View drawerView = findDrawerWithGravity(drawerGravity);
-        if (drawerView != null) {
-            return isDrawerOpen(drawerView);
-        }
-        return false;
-    }
-
-    /**
-     * Check if a given drawer view is currently visible on-screen. The drawer
-     * may be only peeking onto the screen, fully extended, or anywhere inbetween.
-     *
-     * @param drawer Drawer view to check
-     * @return true if the given drawer is visible on-screen
-     * @see #isDrawerOpen(android.view.View)
-     */
-    public boolean isDrawerVisible(View drawer) {
-        if (!isDrawerView(drawer)) {
-            throw new IllegalArgumentException("View " + drawer + " is not a drawer");
-        }
-        return ((LayoutParams) drawer.getLayoutParams()).onScreen > 0;
-    }
-
-    /**
-     * Check if a given drawer view is currently visible on-screen. The drawer
-     * may be only peeking onto the screen, fully extended, or anywhere in between.
-     * If there is no drawer with the given gravity this method will return false.
-     *
-     * @param drawerGravity Gravity of the drawer to check
-     * @return true if the given drawer is visible on-screen
-     */
-    public boolean isDrawerVisible(@EdgeGravity int drawerGravity) {
-        final View drawerView = findDrawerWithGravity(drawerGravity);
-        if (drawerView != null) {
-            return isDrawerVisible(drawerView);
-        }
-        return false;
-    }
-
-    private boolean hasPeekingDrawer() {
-        final int childCount = getChildCount();
-        for (int i = 0; i < childCount; i++) {
-            final LayoutParams lp = (LayoutParams) getChildAt(i).getLayoutParams();
-            if (lp.isPeeking) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    @Override
-    protected ViewGroup.LayoutParams generateDefaultLayoutParams() {
-        return new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
-    }
-
-    @Override
-    protected ViewGroup.LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) {
-        return p instanceof LayoutParams
-                ? new LayoutParams((LayoutParams) p)
-                : p instanceof ViewGroup.MarginLayoutParams
-                ? new LayoutParams((MarginLayoutParams) p)
-                : new LayoutParams(p);
-    }
-
-    @Override
-    protected boolean checkLayoutParams(ViewGroup.LayoutParams p) {
-        return p instanceof LayoutParams && super.checkLayoutParams(p);
-    }
-
-    @Override
-    public ViewGroup.LayoutParams generateLayoutParams(AttributeSet attrs) {
-        return new LayoutParams(getContext(), attrs);
-    }
-
-    @Override
-    public void addFocusables(ArrayList<View> views, int direction, int focusableMode) {
-        if (getDescendantFocusability() == FOCUS_BLOCK_DESCENDANTS) {
-            return;
-        }
-
-        // Only the views in the open drawers are focusables. Add normal child views when
-        // no drawers are opened.
-        final int childCount = getChildCount();
-        boolean isDrawerOpen = false;
-        for (int i = 0; i < childCount; i++) {
-            final View child = getChildAt(i);
-            if (isDrawerView(child)) {
-                if (isDrawerOpen(child)) {
-                    isDrawerOpen = true;
-                    child.addFocusables(views, direction, focusableMode);
-                }
-            } else {
-                mNonDrawerViews.add(child);
-            }
-        }
-
-        if (!isDrawerOpen) {
-            final int nonDrawerViewsCount = mNonDrawerViews.size();
-            for (int i = 0; i < nonDrawerViewsCount; ++i) {
-                final View child = mNonDrawerViews.get(i);
-                if (child.getVisibility() == View.VISIBLE) {
-                    child.addFocusables(views, direction, focusableMode);
-                }
-            }
-        }
-
-        mNonDrawerViews.clear();
-    }
-
-    private boolean hasVisibleDrawer() {
-        return findVisibleDrawer() != null;
-    }
-
-    private View findVisibleDrawer() {
-        final int childCount = getChildCount();
-        for (int i = 0; i < childCount; i++) {
-            final View child = getChildAt(i);
-            if (isDrawerView(child) && isDrawerVisible(child)) {
-                return child;
-            }
-        }
-        return null;
-    }
-
-    void cancelChildViewTouch() {
-        // Cancel child touches
-        if (!mChildrenCanceledTouch) {
-            final long now = SystemClock.uptimeMillis();
-            final MotionEvent cancelEvent = MotionEvent.obtain(now, now,
-                    MotionEvent.ACTION_CANCEL, 0.0f, 0.0f, 0);
-            final int childCount = getChildCount();
-            for (int i = 0; i < childCount; i++) {
-                getChildAt(i).dispatchTouchEvent(cancelEvent);
-            }
-            cancelEvent.recycle();
-            mChildrenCanceledTouch = true;
-        }
-    }
-
-    @Override
-    public boolean onKeyDown(int keyCode, KeyEvent event) {
-        if (keyCode == KeyEvent.KEYCODE_BACK && hasVisibleDrawer()) {
-            KeyEventCompat.startTracking(event);
-            return true;
-        }
-        return super.onKeyDown(keyCode, event);
-    }
-
-    @Override
-    public boolean onKeyUp(int keyCode, KeyEvent event) {
-        if (keyCode == KeyEvent.KEYCODE_BACK) {
-            final View visibleDrawer = findVisibleDrawer();
-            if (visibleDrawer != null && getDrawerLockMode(visibleDrawer) == LOCK_MODE_UNLOCKED) {
-                closeDrawers();
-            }
-            return visibleDrawer != null;
-        }
-        return super.onKeyUp(keyCode, event);
-    }
-
-    @Override
-    protected void onRestoreInstanceState(Parcelable state) {
-        if (!(state instanceof SavedState)) {
-            super.onRestoreInstanceState(state);
-            return;
-        }
-
-        final SavedState ss = (SavedState) state;
-        super.onRestoreInstanceState(ss.getSuperState());
-
-        if (ss.openDrawerGravity != Gravity.NO_GRAVITY) {
-            final View toOpen = findDrawerWithGravity(ss.openDrawerGravity);
-            if (toOpen != null) {
-                openDrawer(toOpen);
-            }
-        }
-
-        if (ss.lockModeLeft != LOCK_MODE_UNDEFINED) {
-            setDrawerLockMode(ss.lockModeLeft, Gravity.LEFT);
-        }
-        if (ss.lockModeRight != LOCK_MODE_UNDEFINED) {
-            setDrawerLockMode(ss.lockModeRight, Gravity.RIGHT);
-        }
-        if (ss.lockModeStart != LOCK_MODE_UNDEFINED) {
-            setDrawerLockMode(ss.lockModeStart, GravityCompat.START);
-        }
-        if (ss.lockModeEnd != LOCK_MODE_UNDEFINED) {
-            setDrawerLockMode(ss.lockModeEnd, GravityCompat.END);
-        }
-    }
-
-    @Override
-    protected Parcelable onSaveInstanceState() {
-        final Parcelable superState = super.onSaveInstanceState();
-        final SavedState ss = new SavedState(superState);
-
-        final int childCount = getChildCount();
-        for (int i = 0; i < childCount; i++) {
-            final View child = getChildAt(i);
-            LayoutParams lp = (LayoutParams) child.getLayoutParams();
-            // Is the current child fully opened (that is, not closing)?
-            boolean isOpenedAndNotClosing = (lp.openState == LayoutParams.FLAG_IS_OPENED);
-            // Is the current child opening?
-            boolean isClosedAndOpening = (lp.openState == LayoutParams.FLAG_IS_OPENING);
-            if (isOpenedAndNotClosing || isClosedAndOpening) {
-                // If one of the conditions above holds, save the child's gravity
-                // so that we open that child during state restore.
-                ss.openDrawerGravity = lp.gravity;
-                break;
-            }
-        }
-
-        ss.lockModeLeft = mLockModeLeft;
-        ss.lockModeRight = mLockModeRight;
-        ss.lockModeStart = mLockModeStart;
-        ss.lockModeEnd = mLockModeEnd;
-
-        return ss;
-    }
-
-    @Override
-    public void addView(View child, int index, ViewGroup.LayoutParams params) {
-        super.addView(child, index, params);
-
-        final View openDrawer = findOpenDrawer();
-        if (openDrawer != null || isDrawerView(child)) {
-            // A drawer is already open or the new view is a drawer, so the
-            // new view should start out hidden.
-            ViewCompat.setImportantForAccessibility(child,
-                    ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS);
-        } else {
-            // Otherwise this is a content view and no drawer is open, so the
-            // new view should start out visible.
-            ViewCompat.setImportantForAccessibility(child,
-                    ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_YES);
-        }
-
-        // We only need a delegate here if the framework doesn't understand
-        // NO_HIDE_DESCENDANTS importance.
-        if (!CAN_HIDE_DESCENDANTS) {
-            ViewCompat.setAccessibilityDelegate(child, mChildAccessibilityDelegate);
-        }
-    }
-
-    private static boolean includeChildForAccessibility(View child) {
-        // If the child is not important for accessibility we make
-        // sure this hides the entire subtree rooted at it as the
-        // IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDATS is not
-        // supported on older platforms but we want to hide the entire
-        // content and not opened drawers if a drawer is opened.
-        return ViewCompat.getImportantForAccessibility(child)
-                != ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS
-                    && ViewCompat.getImportantForAccessibility(child)
-                != ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_NO;
-    }
-
-    /**
-     * State persisted across instances
-     */
-    protected static class SavedState extends AbsSavedState {
-        int openDrawerGravity = Gravity.NO_GRAVITY;
-        @LockMode int lockModeLeft;
-        @LockMode int lockModeRight;
-        @LockMode int lockModeStart;
-        @LockMode int lockModeEnd;
-
-        public SavedState(Parcel in, ClassLoader loader) {
-            super(in, loader);
-            openDrawerGravity = in.readInt();
-            lockModeLeft = in.readInt();
-            lockModeRight = in.readInt();
-            lockModeStart = in.readInt();
-            lockModeEnd = in.readInt();
-        }
-
-        public SavedState(Parcelable superState) {
-            super(superState);
-        }
-
-        @Override
-        public void writeToParcel(Parcel dest, int flags) {
-            super.writeToParcel(dest, flags);
-            dest.writeInt(openDrawerGravity);
-            dest.writeInt(lockModeLeft);
-            dest.writeInt(lockModeRight);
-            dest.writeInt(lockModeStart);
-            dest.writeInt(lockModeEnd);
-        }
-
-        public static final Creator<SavedState> CREATOR = ParcelableCompat.newCreator(
-                new ParcelableCompatCreatorCallbacks<SavedState>() {
-                    @Override
-                    public SavedState createFromParcel(Parcel in, ClassLoader loader) {
-                        return new SavedState(in, loader);
-                    }
-
-                    @Override
-                    public SavedState[] newArray(int size) {
-                        return new SavedState[size];
-                    }
-                });
-    }
-
-    private class ViewDragCallback extends ViewDragHelper.Callback {
-        private final int mAbsGravity;
-        private ViewDragHelper mDragger;
-
-        private final Runnable mPeekRunnable = new Runnable() {
-            @Override public void run() {
-                peekDrawer();
-            }
-        };
-
-        public ViewDragCallback(int gravity) {
-            mAbsGravity = gravity;
-        }
-
-        public void setDragger(ViewDragHelper dragger) {
-            mDragger = dragger;
-        }
-
-        public void removeCallbacks() {
-            DrawerLayout.this.removeCallbacks(mPeekRunnable);
-        }
-
-        @Override
-        public boolean tryCaptureView(View child, int pointerId) {
-            // Only capture views where the gravity matches what we're looking for.
-            // This lets us use two ViewDragHelpers, one for each side drawer.
-            return isDrawerView(child) && checkDrawerViewAbsoluteGravity(child, mAbsGravity)
-                    && getDrawerLockMode(child) == LOCK_MODE_UNLOCKED;
-        }
-
-        @Override
-        public void onViewDragStateChanged(int state) {
-            updateDrawerState(mAbsGravity, state, mDragger.getCapturedView());
-        }
-
-        @Override
-        public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) {
-            float offset;
-            final int childWidth = changedView.getWidth();
-
-            // This reverses the positioning shown in onLayout.
-            if (checkDrawerViewAbsoluteGravity(changedView, Gravity.LEFT)) {
-                offset = (float) (childWidth + left) / childWidth;
-            } else {
-                final int width = getWidth();
-                offset = (float) (width - left) / childWidth;
-            }
-            setDrawerViewOffset(changedView, offset);
-            changedView.setVisibility(offset == 0 ? INVISIBLE : VISIBLE);
-            invalidate();
-        }
-
-        @Override
-        public void onViewCaptured(View capturedChild, int activePointerId) {
-            final LayoutParams lp = (LayoutParams) capturedChild.getLayoutParams();
-            lp.isPeeking = false;
-
-            closeOtherDrawer();
-        }
-
-        private void closeOtherDrawer() {
-            final int otherGrav = mAbsGravity == Gravity.LEFT ? Gravity.RIGHT : Gravity.LEFT;
-            final View toClose = findDrawerWithGravity(otherGrav);
-            if (toClose != null) {
-                closeDrawer(toClose);
-            }
-        }
-
-        @Override
-        public void onViewReleased(View releasedChild, float xvel, float yvel) {
-            // Offset is how open the drawer is, therefore left/right values
-            // are reversed from one another.
-            final float offset = getDrawerViewOffset(releasedChild);
-            final int childWidth = releasedChild.getWidth();
-
-            int left;
-            if (checkDrawerViewAbsoluteGravity(releasedChild, Gravity.LEFT)) {
-                left = xvel > 0 || xvel == 0 && offset > 0.5f ? 0 : -childWidth;
-            } else {
-                final int width = getWidth();
-                left = xvel < 0 || xvel == 0 && offset > 0.5f ? width - childWidth : width;
-            }
-
-            mDragger.settleCapturedViewAt(left, releasedChild.getTop());
-            invalidate();
-        }
-
-        @Override
-        public void onEdgeTouched(int edgeFlags, int pointerId) {
-            postDelayed(mPeekRunnable, PEEK_DELAY);
-        }
-
-        private void peekDrawer() {
-            final View toCapture;
-            final int childLeft;
-            final int peekDistance = mDragger.getEdgeSize();
-            final boolean leftEdge = mAbsGravity == Gravity.LEFT;
-            if (leftEdge) {
-                toCapture = findDrawerWithGravity(Gravity.LEFT);
-                childLeft = (toCapture != null ? -toCapture.getWidth() : 0) + peekDistance;
-            } else {
-                toCapture = findDrawerWithGravity(Gravity.RIGHT);
-                childLeft = getWidth() - peekDistance;
-            }
-            // Only peek if it would mean making the drawer more visible and the drawer isn't locked
-            if (toCapture != null && ((leftEdge && toCapture.getLeft() < childLeft) ||
-                    (!leftEdge && toCapture.getLeft() > childLeft)) &&
-                    getDrawerLockMode(toCapture) == LOCK_MODE_UNLOCKED) {
-                final LayoutParams lp = (LayoutParams) toCapture.getLayoutParams();
-                mDragger.smoothSlideViewTo(toCapture, childLeft, toCapture.getTop());
-                lp.isPeeking = true;
-                invalidate();
-
-                closeOtherDrawer();
-
-                cancelChildViewTouch();
-            }
-        }
-
-        @Override
-        public boolean onEdgeLock(int edgeFlags) {
-            if (ALLOW_EDGE_LOCK) {
-                final View drawer = findDrawerWithGravity(mAbsGravity);
-                if (drawer != null && !isDrawerOpen(drawer)) {
-                    closeDrawer(drawer);
-                }
-                return true;
-            }
-            return false;
-        }
-
-        @Override
-        public void onEdgeDragStarted(int edgeFlags, int pointerId) {
-            final View toCapture;
-            if ((edgeFlags & ViewDragHelper.EDGE_LEFT) == ViewDragHelper.EDGE_LEFT) {
-                toCapture = findDrawerWithGravity(Gravity.LEFT);
-            } else {
-                toCapture = findDrawerWithGravity(Gravity.RIGHT);
-            }
-
-            if (toCapture != null && getDrawerLockMode(toCapture) == LOCK_MODE_UNLOCKED) {
-                mDragger.captureChildView(toCapture, pointerId);
-            }
-        }
-
-        @Override
-        public int getViewHorizontalDragRange(View child) {
-            return isDrawerView(child) ? child.getWidth() : 0;
-        }
-
-        @Override
-        public int clampViewPositionHorizontal(View child, int left, int dx) {
-            if (checkDrawerViewAbsoluteGravity(child, Gravity.LEFT)) {
-                return Math.max(-child.getWidth(), Math.min(left, 0));
-            } else {
-                final int width = getWidth();
-                return Math.max(width - child.getWidth(), Math.min(left, width));
-            }
-        }
-
-        @Override
-        public int clampViewPositionVertical(View child, int top, int dy) {
-            return child.getTop();
-        }
-    }
-
-    public static class LayoutParams extends ViewGroup.MarginLayoutParams {
-        private static final int FLAG_IS_OPENED = 0x1;
-        private static final int FLAG_IS_OPENING = 0x2;
-        private static final int FLAG_IS_CLOSING = 0x4;
-
-        public int gravity = Gravity.NO_GRAVITY;
-        private float onScreen;
-        private boolean isPeeking;
-        private int openState;
-
-        public LayoutParams(Context c, AttributeSet attrs) {
-            super(c, attrs);
-
-            final TypedArray a = c.obtainStyledAttributes(attrs, LAYOUT_ATTRS);
-            this.gravity = a.getInt(0, Gravity.NO_GRAVITY);
-            a.recycle();
-        }
-
-        public LayoutParams(int width, int height) {
-            super(width, height);
-        }
-
-        public LayoutParams(int width, int height, int gravity) {
-            this(width, height);
-            this.gravity = gravity;
-        }
-
-        public LayoutParams(LayoutParams source) {
-            super(source);
-            this.gravity = source.gravity;
-        }
-
-        public LayoutParams(ViewGroup.LayoutParams source) {
-            super(source);
-        }
-
-        public LayoutParams(ViewGroup.MarginLayoutParams source) {
-            super(source);
-        }
-    }
-
-    class AccessibilityDelegate extends AccessibilityDelegateCompat {
-        private final Rect mTmpRect = new Rect();
-
-        @Override
-        public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfoCompat info) {
-            if (CAN_HIDE_DESCENDANTS) {
-                super.onInitializeAccessibilityNodeInfo(host, info);
-            } else {
-                // Obtain a node for the host, then manually generate the list
-                // of children to only include non-obscured views.
-                final AccessibilityNodeInfoCompat superNode =
-                        AccessibilityNodeInfoCompat.obtain(info);
-                super.onInitializeAccessibilityNodeInfo(host, superNode);
-
-                info.setSource(host);
-                final ViewParent parent = ViewCompat.getParentForAccessibility(host);
-                if (parent instanceof View) {
-                    info.setParent((View) parent);
-                }
-                copyNodeInfoNoChildren(info, superNode);
-                superNode.recycle();
-
-                addChildrenForAccessibility(info, (ViewGroup) host);
-            }
-
-            info.setClassName(DrawerLayout.class.getName());
-
-            // This view reports itself as focusable so that it can intercept
-            // the back button, but we should prevent this view from reporting
-            // itself as focusable to accessibility services.
-            info.setFocusable(false);
-            info.setFocused(false);
-            info.removeAction(AccessibilityActionCompat.ACTION_FOCUS);
-            info.removeAction(AccessibilityActionCompat.ACTION_CLEAR_FOCUS);
-        }
-
-        @Override
-        public void onInitializeAccessibilityEvent(View host, AccessibilityEvent event) {
-            super.onInitializeAccessibilityEvent(host, event);
-
-            event.setClassName(DrawerLayout.class.getName());
-        }
-
-        @Override
-        public boolean dispatchPopulateAccessibilityEvent(View host, AccessibilityEvent event) {
-            // Special case to handle window state change events. As far as
-            // accessibility services are concerned, state changes from
-            // DrawerLayout invalidate the entire contents of the screen (like
-            // an Activity or Dialog) and they should announce the title of the
-            // new content.
-            if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) {
-                final List<CharSequence> eventText = event.getText();
-                final View visibleDrawer = findVisibleDrawer();
-                if (visibleDrawer != null) {
-                    final int edgeGravity = getDrawerViewAbsoluteGravity(visibleDrawer);
-                    final CharSequence title = getDrawerTitle(edgeGravity);
-                    if (title != null) {
-                        eventText.add(title);
-                    }
-                }
-
-                return true;
-            }
-
-            return super.dispatchPopulateAccessibilityEvent(host, event);
-        }
-
-        @Override
-        public boolean onRequestSendAccessibilityEvent(ViewGroup host, View child,
-                AccessibilityEvent event) {
-            if (CAN_HIDE_DESCENDANTS || includeChildForAccessibility(child)) {
-                return super.onRequestSendAccessibilityEvent(host, child, event);
-            }
-            return false;
-        }
-
-        private void addChildrenForAccessibility(AccessibilityNodeInfoCompat info, ViewGroup v) {
-            final int childCount = v.getChildCount();
-            for (int i = 0; i < childCount; i++) {
-                final View child = v.getChildAt(i);
-                if (includeChildForAccessibility(child)) {
-                    info.addChild(child);
-                }
-            }
-        }
-
-        /**
-         * This should really be in AccessibilityNodeInfoCompat, but there unfortunately
-         * seem to be a few elements that are not easily cloneable using the underlying API.
-         * Leave it private here as it's not general-purpose useful.
-         */
-        private void copyNodeInfoNoChildren(AccessibilityNodeInfoCompat dest,
-                AccessibilityNodeInfoCompat src) {
-            final Rect rect = mTmpRect;
-
-            src.getBoundsInParent(rect);
-            dest.setBoundsInParent(rect);
-
-            src.getBoundsInScreen(rect);
-            dest.setBoundsInScreen(rect);
-
-            dest.setVisibleToUser(src.isVisibleToUser());
-            dest.setPackageName(src.getPackageName());
-            dest.setClassName(src.getClassName());
-            dest.setContentDescription(src.getContentDescription());
-
-            dest.setEnabled(src.isEnabled());
-            dest.setClickable(src.isClickable());
-            dest.setFocusable(src.isFocusable());
-            dest.setFocused(src.isFocused());
-            dest.setAccessibilityFocused(src.isAccessibilityFocused());
-            dest.setSelected(src.isSelected());
-            dest.setLongClickable(src.isLongClickable());
-
-            dest.addAction(src.getActions());
-        }
-    }
-
-    final class ChildAccessibilityDelegate extends AccessibilityDelegateCompat {
-        @Override
-        public void onInitializeAccessibilityNodeInfo(View child,
-                AccessibilityNodeInfoCompat info) {
-            super.onInitializeAccessibilityNodeInfo(child, info);
-
-            if (!includeChildForAccessibility(child)) {
-                // If we are ignoring the sub-tree rooted at the child,
-                // break the connection to the rest of the node tree.
-                // For details refer to includeChildForAccessibility.
-                info.setParent(null);
-            }
-        }
-    }
-}
diff --git a/v4/java/android/support/v4/widget/EdgeEffectCompat.java b/v4/java/android/support/v4/widget/EdgeEffectCompat.java
deleted file mode 100644
index df69ca3..0000000
--- a/v4/java/android/support/v4/widget/EdgeEffectCompat.java
+++ /dev/null
@@ -1,257 +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 android.support.v4.widget;
-
-import android.content.Context;
-import android.graphics.Canvas;
-import android.os.Build;
-
-/**
- * Helper for accessing {@link android.widget.EdgeEffect} introduced after
- * API level 4 in a backwards compatible fashion.
- *
- * This class is used to access {@link android.widget.EdgeEffect} on platform versions     
- * that support it. When running on older platforms it will result in no-ops. It should     
- * be used by views that wish to use the standard Android visual effects at the edges       
- * of scrolling containers.
- */
-public final class EdgeEffectCompat {
-    private Object mEdgeEffect;
-
-    private static final EdgeEffectImpl IMPL;
-
-    static {
-        if (Build.VERSION.SDK_INT >= 21) {
-            IMPL = new EdgeEffectLollipopImpl(); // Lollipop
-        } else if (Build.VERSION.SDK_INT >= 14) { // ICS
-            IMPL = new EdgeEffectIcsImpl();
-        } else {
-            IMPL = new BaseEdgeEffectImpl();
-        }
-    }
-
-    interface EdgeEffectImpl {
-        public Object newEdgeEffect(Context context);
-        public void setSize(Object edgeEffect, int width, int height);
-        public boolean isFinished(Object edgeEffect);
-        public void finish(Object edgeEffect);
-        public boolean onPull(Object edgeEffect, float deltaDistance);
-        public boolean onRelease(Object edgeEffect);
-        public boolean onAbsorb(Object edgeEffect, int velocity);
-        public boolean draw(Object edgeEffect, Canvas canvas);
-        public boolean onPull(Object edgeEffect, float deltaDistance, float displacement);
-    }
-
-    /**
-     * Null implementation to use pre-ICS
-     */
-    static class BaseEdgeEffectImpl implements EdgeEffectImpl {
-        public Object newEdgeEffect(Context context) {
-            return null;
-        }
-
-        public void setSize(Object edgeEffect, int width, int height) {
-        }
-
-        public boolean isFinished(Object edgeEffect) {
-            return true;
-        }
-
-        public void finish(Object edgeEffect) {
-        }
-
-        public boolean onPull(Object edgeEffect, float deltaDistance) {
-            return false;
-        }
-
-        public boolean onRelease(Object edgeEffect) {
-            return false;
-        }
-
-        public boolean onAbsorb(Object edgeEffect, int velocity) {
-            return false;
-        }
-
-        public boolean draw(Object edgeEffect, Canvas canvas) {
-            return false;
-        }
-
-        public boolean onPull(Object edgeEffect, float deltaDistance, float displacement) {
-            return false;
-        }
-    }
-
-    static class EdgeEffectIcsImpl implements EdgeEffectImpl {
-        public Object newEdgeEffect(Context context) {
-            return EdgeEffectCompatIcs.newEdgeEffect(context);
-        }
-
-        public void setSize(Object edgeEffect, int width, int height) {
-            EdgeEffectCompatIcs.setSize(edgeEffect, width, height);
-        }
-
-        public boolean isFinished(Object edgeEffect) {
-            return EdgeEffectCompatIcs.isFinished(edgeEffect);
-        }
-
-        public void finish(Object edgeEffect) {
-            EdgeEffectCompatIcs.finish(edgeEffect);
-        }
-
-        public boolean onPull(Object edgeEffect, float deltaDistance) {
-            return EdgeEffectCompatIcs.onPull(edgeEffect, deltaDistance);
-        }
-
-        public boolean onRelease(Object edgeEffect) {
-            return EdgeEffectCompatIcs.onRelease(edgeEffect);
-        }
-
-        public boolean onAbsorb(Object edgeEffect, int velocity) {
-            return EdgeEffectCompatIcs.onAbsorb(edgeEffect, velocity);
-        }
-
-        public boolean draw(Object edgeEffect, Canvas canvas) {
-            return EdgeEffectCompatIcs.draw(edgeEffect, canvas);
-        }
-
-        public boolean onPull(Object edgeEffect, float deltaDistance, float displacement) {
-            return EdgeEffectCompatIcs.onPull(edgeEffect, deltaDistance);
-        }
-    }
-
-    static class EdgeEffectLollipopImpl extends EdgeEffectIcsImpl {
-        public boolean onPull(Object edgeEffect, float deltaDistance, float displacement) {
-            return EdgeEffectCompatLollipop.onPull(edgeEffect, deltaDistance, displacement);
-        }
-    }
-
-    /**
-     * Construct a new EdgeEffect themed using the given context.
-     *
-     * <p>Note: On platform versions that do not support EdgeEffect, all operations
-     * on the newly constructed object will be mocked/no-ops.</p>
-     *
-     * @param context Context to use for theming the effect
-     */
-    public EdgeEffectCompat(Context context) {
-        mEdgeEffect = IMPL.newEdgeEffect(context);
-    }
-
-    /**
-     * Set the size of this edge effect in pixels.
-     *
-     * @param width Effect width in pixels
-     * @param height Effect height in pixels
-     */
-    public void setSize(int width, int height) {
-        IMPL.setSize(mEdgeEffect, width, height);
-    }
-
-    /**
-     * Reports if this EdgeEffectCompat's animation is finished. If this method returns false
-     * after a call to {@link #draw(Canvas)} the host widget should schedule another
-     * drawing pass to continue the animation.
-     *
-     * @return true if animation is finished, false if drawing should continue on the next frame.
-     */
-    public boolean isFinished() {
-        return IMPL.isFinished(mEdgeEffect);
-    }
-
-    /**
-     * Immediately finish the current animation.
-     * After this call {@link #isFinished()} will return true.
-     */
-    public void finish() {
-        IMPL.finish(mEdgeEffect);
-    }
-
-    /**
-     * A view should call this when content is pulled away from an edge by the user.
-     * This will update the state of the current visual effect and its associated animation.
-     * The host view should always {@link android.view.View#invalidate()} if this method
-     * returns true and draw the results accordingly.
-     *
-     * @param deltaDistance Change in distance since the last call. Values may be 0 (no change) to
-     *                      1.f (full length of the view) or negative values to express change
-     *                      back toward the edge reached to initiate the effect.
-     * @return true if the host view should call invalidate, false if it should not.
-     * @deprecated use {@link #onPull(float, float)}
-     */
-    @Deprecated
-    public boolean onPull(float deltaDistance) {
-        return IMPL.onPull(mEdgeEffect, deltaDistance);
-    }
-
-    /**
-     * A view should call this when content is pulled away from an edge by the user.
-     * This will update the state of the current visual effect and its associated animation.
-     * The host view should always {@link android.view.View#invalidate()} if this method
-     * returns true and draw the results accordingly.
-     *
-     * @param deltaDistance Change in distance since the last call. Values may be 0 (no change) to
-     *                      1.f (full length of the view) or negative values to express change
-     *                      back toward the edge reached to initiate the effect.
-     * @param displacement The displacement from the starting side of the effect of the point
-     *                     initiating the pull. In the case of touch this is the finger position.
-     *                     Values may be from 0-1.
-     * @return true if the host view should call invalidate, false if it should not.
-     */
-    public boolean onPull(float deltaDistance, float displacement) {
-        return IMPL.onPull(mEdgeEffect, deltaDistance, displacement);
-    }
-
-    /**
-     * Call when the object is released after being pulled.
-     * This will begin the "decay" phase of the effect. After calling this method
-     * the host view should {@link android.view.View#invalidate()} if this method
-     * returns true and thereby draw the results accordingly.
-     *
-     * @return true if the host view should invalidate, false if it should not.
-     */
-    public boolean onRelease() {
-        return IMPL.onRelease(mEdgeEffect);
-    }
-
-    /**
-     * Call when the effect absorbs an impact at the given velocity.
-     * Used when a fling reaches the scroll boundary.
-     *
-     * <p>When using a {@link android.widget.Scroller} or {@link android.widget.OverScroller},
-     * the method <code>getCurrVelocity</code> will provide a reasonable approximation
-     * to use here.</p>
-     *
-     * @param velocity Velocity at impact in pixels per second.
-     * @return true if the host view should invalidate, false if it should not.
-     */
-    public boolean onAbsorb(int velocity) {
-        return IMPL.onAbsorb(mEdgeEffect, velocity);
-    }
-
-    /**
-     * Draw into the provided canvas. Assumes that the canvas has been rotated
-     * accordingly and the size has been set. The effect will be drawn the full
-     * width of X=0 to X=width, beginning from Y=0 and extending to some factor <
-     * 1.f of height.
-     *
-     * @param canvas Canvas to draw into
-     * @return true if drawing should continue beyond this frame to continue the
-     *         animation
-     */
-    public boolean draw(Canvas canvas) {
-        return IMPL.draw(mEdgeEffect, canvas);
-    }
-}
diff --git a/v4/java/android/support/v4/widget/FocusStrategy.java b/v4/java/android/support/v4/widget/FocusStrategy.java
deleted file mode 100644
index 8be9f1a..0000000
--- a/v4/java/android/support/v4/widget/FocusStrategy.java
+++ /dev/null
@@ -1,454 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.v4.widget;
-
-import android.graphics.Rect;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.view.View;
-
-import android.support.v4.view.ViewCompat.FocusRealDirection;
-import android.support.v4.view.ViewCompat.FocusRelativeDirection;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-
-/**
- * Implements absolute and relative focus movement strategies. Adapted from
- * android.view.FocusFinder to work with generic collections of bounded items.
- */
-class FocusStrategy {
-    public static <L,T> T findNextFocusInRelativeDirection(@NonNull L focusables,
-            @NonNull CollectionAdapter<L,T> collectionAdapter, @NonNull BoundsAdapter<T> adapter,
-            @Nullable T focused, @FocusRelativeDirection int direction, boolean isLayoutRtl,
-            boolean wrap) {
-        final int count = collectionAdapter.size(focusables);
-        final ArrayList<T> sortedFocusables = new ArrayList<>(count);
-        for (int i = 0; i < count; i++) {
-            sortedFocusables.add(collectionAdapter.get(focusables, i));
-        }
-
-        final SequentialComparator<T> comparator = new SequentialComparator<>(isLayoutRtl, adapter);
-        Collections.sort(sortedFocusables, comparator);
-
-        switch (direction) {
-            case View.FOCUS_FORWARD:
-                return getNextFocusable(focused, sortedFocusables, wrap);
-            case View.FOCUS_BACKWARD:
-                return getPreviousFocusable(focused, sortedFocusables, wrap);
-            default:
-                throw new IllegalArgumentException("direction must be one of "
-                        + "{FOCUS_FORWARD, FOCUS_BACKWARD}.");
-        }
-    }
-
-    private static <T> T getNextFocusable(T focused, ArrayList<T> focusables, boolean wrap) {
-        final int count = focusables.size();
-
-        // The position of the next focusable item, which is the first item if
-        // no item is currently focused.
-        final int position = (focused == null ? -1 : focusables.lastIndexOf(focused)) + 1;
-        if (position < count) {
-            return focusables.get(position);
-        } else if (wrap && count > 0) {
-            return focusables.get(0);
-        } else {
-            return null;
-        }
-    }
-
-    private static <T> T getPreviousFocusable(T focused, ArrayList<T> focusables, boolean wrap) {
-        final int count = focusables.size();
-
-        // The position of the previous focusable item, which is the last item
-        // if no item is currently focused.
-        final int position = (focused == null ? count : focusables.indexOf(focused)) - 1;
-        if (position >= 0) {
-            return focusables.get(position);
-        } else if (wrap && count > 0) {
-            return focusables.get(count - 1);
-        } else {
-            return null;
-        }
-    }
-
-    /**
-     * Sorts views according to their visual layout and geometry for default tab order.
-     * This is used for sequential focus traversal.
-     */
-    private static class SequentialComparator<T> implements Comparator<T> {
-        private final Rect mTemp1 = new Rect();
-        private final Rect mTemp2 = new Rect();
-
-        private final boolean mIsLayoutRtl;
-        private final BoundsAdapter<T> mAdapter;
-
-        public SequentialComparator(boolean isLayoutRtl, BoundsAdapter<T> adapter) {
-            mIsLayoutRtl = isLayoutRtl;
-            mAdapter = adapter;
-        }
-
-        public int compare(T first, T second) {
-            final Rect firstRect = mTemp1;
-            final Rect secondRect = mTemp2;
-
-            mAdapter.obtainBounds(first, firstRect);
-            mAdapter.obtainBounds(second, secondRect);
-
-            if (firstRect.top < secondRect.top) {
-                return -1;
-            } else if (firstRect.top > secondRect.top) {
-                return 1;
-            } else if (firstRect.left < secondRect.left) {
-                return mIsLayoutRtl ? 1 : -1;
-            } else if (firstRect.left > secondRect.left) {
-                return mIsLayoutRtl ? -1 : 1;
-            } else if (firstRect.bottom < secondRect.bottom) {
-                return -1;
-            } else if (firstRect.bottom > secondRect.bottom) {
-                return 1;
-            } else if (firstRect.right < secondRect.right) {
-                return mIsLayoutRtl ? 1 : -1;
-            } else if (firstRect.right > secondRect.right) {
-                return mIsLayoutRtl ? -1 : 1;
-            } else {
-                // The view are distinct but completely coincident so we
-                // consider them equal for our purposes. Since the sort is
-                // stable, this means that the views will retain their
-                // layout order relative to one another.
-                return 0;
-            }
-        }
-    }
-
-    public static <L,T> T findNextFocusInAbsoluteDirection(@NonNull L focusables,
-            @NonNull CollectionAdapter<L,T> collectionAdapter, @NonNull BoundsAdapter<T> adapter,
-            @Nullable T focused, @NonNull Rect focusedRect, int direction) {
-        // Initialize the best candidate to something impossible so that
-        // the first plausible view will become the best choice.
-        final Rect bestCandidateRect = new Rect(focusedRect);
-
-        switch (direction) {
-            case View.FOCUS_LEFT:
-                bestCandidateRect.offset(focusedRect.width() + 1, 0);
-                break;
-            case View.FOCUS_RIGHT:
-                bestCandidateRect.offset(-(focusedRect.width() + 1), 0);
-                break;
-            case View.FOCUS_UP:
-                bestCandidateRect.offset(0, focusedRect.height() + 1);
-                break;
-            case View.FOCUS_DOWN:
-                bestCandidateRect.offset(0, -(focusedRect.height() + 1));
-                break;
-            default:
-                throw new IllegalArgumentException("direction must be one of "
-                        + "{FOCUS_UP, FOCUS_DOWN, FOCUS_LEFT, FOCUS_RIGHT}.");
-        }
-
-        T closest = null;
-
-        final int count = collectionAdapter.size(focusables);
-        final Rect focusableRect = new Rect();
-        for (int i = 0; i < count; i++) {
-            final T focusable = collectionAdapter.get(focusables, i);
-            if (focusable == focused) {
-                continue;
-            }
-
-            // get focus bounds of other view
-            adapter.obtainBounds(focusable, focusableRect);
-            if (isBetterCandidate(direction, focusedRect, focusableRect, bestCandidateRect)) {
-                bestCandidateRect.set(focusableRect);
-                closest = focusable;
-            }
-        }
-
-        return closest;
-    }
-
-    /**
-     * Is candidate a better candidate than currentBest for a focus search
-     * in a particular direction from a source rect? This is the core
-     * routine that determines the order of focus searching.
-     *
-     * @param direction   the direction (up, down, left, right)
-     * @param source      the source from which we are searching
-     * @param candidate   the candidate rectangle
-     * @param currentBest the current best rectangle
-     * @return {@code true} if the candidate rectangle is a better than the
-     * current best rectangle, {@code false} otherwise
-     */
-    private static boolean isBetterCandidate(
-            @FocusRealDirection int direction, @NonNull Rect source,
-            @NonNull Rect candidate, @NonNull Rect currentBest) {
-        // To be a better candidate, need to at least be a candidate in the
-        // first place. :)
-        if (!isCandidate(source, candidate, direction)) {
-            return false;
-        }
-
-        // We know that candidateRect is a candidate. If currentBest is not
-        // a candidate, candidateRect is better.
-        if (!isCandidate(source, currentBest, direction)) {
-            return true;
-        }
-
-        // If candidateRect is better by beam, it wins.
-        if (beamBeats(direction, source, candidate, currentBest)) {
-            return true;
-        }
-
-        // If currentBest is better, then candidateRect cant' be. :)
-        if (beamBeats(direction, source, currentBest, candidate)) {
-            return false;
-        }
-
-        // Otherwise, do fudge-tastic comparison of the major and minor
-        // axis.
-        final int candidateDist = getWeightedDistanceFor(
-                majorAxisDistance(direction, source, candidate),
-                minorAxisDistance(direction, source, candidate));
-        final int currentBestDist = getWeightedDistanceFor(
-                majorAxisDistance(direction, source, currentBest),
-                minorAxisDistance(direction, source, currentBest));
-        return candidateDist < currentBestDist;
-    }
-
-    /**
-     * One rectangle may be another candidate than another by virtue of
-     * being exclusively in the beam of the source rect.
-     *
-     * @return whether rect1 is a better candidate than rect2 by virtue of
-     * it being in source's beam
-     */
-    private static boolean beamBeats(@FocusRealDirection int direction,
-            @NonNull Rect source, @NonNull Rect rect1, @NonNull Rect rect2) {
-        final boolean rect1InSrcBeam = beamsOverlap(direction, source, rect1);
-        final boolean rect2InSrcBeam = beamsOverlap(direction, source, rect2);
-
-        // If rect1 isn't exclusively in the src beam, it doesn't win.
-        if (rect2InSrcBeam || !rect1InSrcBeam) {
-            return false;
-        }
-
-        // We know rect1 is in the beam, and rect2 is not.
-
-        // If rect1 is to the direction of, and rect2 is not, rect1 wins.
-        // For example, for direction left, if rect1 is to the left of the
-        // source and rect2 is below, then we always prefer the in beam
-        // rect1, since rect2 could be reached by going down.
-        if (!isToDirectionOf(direction, source, rect2)) {
-            return true;
-        }
-
-        // For horizontal directions, being exclusively in beam always
-        // wins.
-        if (direction == View.FOCUS_LEFT || direction == View.FOCUS_RIGHT) {
-            return true;
-        }
-
-        // For vertical directions, beams only beat up to a point: now, as
-        // long as rect2 isn't completely closer, rect1 wins, e.g. for
-        // direction down, completely closer means for rect2's top edge to
-        // be closer to the source's top edge than rect1's bottom edge.
-        return majorAxisDistance(direction, source, rect1)
-                < majorAxisDistanceToFarEdge(direction, source, rect2);
-    }
-
-    /**
-     * Fudge-factor opportunity: how to calculate distance given major and
-     * minor axis distances.
-     * <p/>
-     * Warning: this fudge factor is finely tuned, be sure to run all focus
-     * tests if you dare tweak it.
-     */
-    private static int getWeightedDistanceFor(int majorAxisDistance, int minorAxisDistance) {
-        return 13 * majorAxisDistance * majorAxisDistance
-                + minorAxisDistance * minorAxisDistance;
-    }
-
-    /**
-     * Is destRect a candidate for the next focus given the direction? This
-     * checks whether the dest is at least partially to the direction of
-     * (e.g. left of) from source.
-     * <p/>
-     * Includes an edge case for an empty rect,which is used in some cases
-     * when searching from a point on the screen.
-     */
-    private static boolean isCandidate(@NonNull Rect srcRect, @NonNull Rect destRect,
-            @FocusRealDirection int direction) {
-        switch (direction) {
-            case View.FOCUS_LEFT:
-                return (srcRect.right > destRect.right || srcRect.left >= destRect.right)
-                        && srcRect.left > destRect.left;
-            case View.FOCUS_RIGHT:
-                return (srcRect.left < destRect.left || srcRect.right <= destRect.left)
-                        && srcRect.right < destRect.right;
-            case View.FOCUS_UP:
-                return (srcRect.bottom > destRect.bottom || srcRect.top >= destRect.bottom)
-                        && srcRect.top > destRect.top;
-            case View.FOCUS_DOWN:
-                return (srcRect.top < destRect.top || srcRect.bottom <= destRect.top)
-                        && srcRect.bottom < destRect.bottom;
-        }
-        throw new IllegalArgumentException("direction must be one of "
-                + "{FOCUS_UP, FOCUS_DOWN, FOCUS_LEFT, FOCUS_RIGHT}.");
-    }
-
-
-    /**
-     * Do the "beams" w.r.t the given direction's axis of rect1 and rect2 overlap?
-     *
-     * @param direction the direction (up, down, left, right)
-     * @param rect1     the first rectangle
-     * @param rect2     the second rectangle
-     * @return whether the beams overlap
-     */
-    private static boolean beamsOverlap(@FocusRealDirection int direction,
-            @NonNull Rect rect1, @NonNull Rect rect2) {
-        switch (direction) {
-            case View.FOCUS_LEFT:
-            case View.FOCUS_RIGHT:
-                return (rect2.bottom >= rect1.top) && (rect2.top <= rect1.bottom);
-            case View.FOCUS_UP:
-            case View.FOCUS_DOWN:
-                return (rect2.right >= rect1.left) && (rect2.left <= rect1.right);
-        }
-        throw new IllegalArgumentException("direction must be one of "
-                + "{FOCUS_UP, FOCUS_DOWN, FOCUS_LEFT, FOCUS_RIGHT}.");
-    }
-
-    /**
-     * e.g for left, is 'to left of'
-     */
-    private static boolean isToDirectionOf(@FocusRealDirection int direction,
-            @NonNull Rect src, @NonNull Rect dest) {
-        switch (direction) {
-            case View.FOCUS_LEFT:
-                return src.left >= dest.right;
-            case View.FOCUS_RIGHT:
-                return src.right <= dest.left;
-            case View.FOCUS_UP:
-                return src.top >= dest.bottom;
-            case View.FOCUS_DOWN:
-                return src.bottom <= dest.top;
-        }
-        throw new IllegalArgumentException("direction must be one of "
-                + "{FOCUS_UP, FOCUS_DOWN, FOCUS_LEFT, FOCUS_RIGHT}.");
-    }
-
-    /**
-     * @return the distance from the edge furthest in the given direction
-     * of source to the edge nearest in the given direction of
-     * dest. If the dest is not in the direction from source,
-     * returns 0.
-     */
-    private static int majorAxisDistance(@FocusRealDirection int direction,
-            @NonNull Rect source, @NonNull Rect dest) {
-        return Math.max(0, majorAxisDistanceRaw(direction, source, dest));
-    }
-
-    private static int majorAxisDistanceRaw(@FocusRealDirection int direction,
-            @NonNull Rect source, @NonNull Rect dest) {
-        switch (direction) {
-            case View.FOCUS_LEFT:
-                return source.left - dest.right;
-            case View.FOCUS_RIGHT:
-                return dest.left - source.right;
-            case View.FOCUS_UP:
-                return source.top - dest.bottom;
-            case View.FOCUS_DOWN:
-                return dest.top - source.bottom;
-        }
-        throw new IllegalArgumentException("direction must be one of "
-                + "{FOCUS_UP, FOCUS_DOWN, FOCUS_LEFT, FOCUS_RIGHT}.");
-    }
-
-    /**
-     * @return the distance along the major axis w.r.t the direction from
-     * the edge of source to the far edge of dest. If the dest is
-     * not in the direction from source, returns 1 to break ties
-     * with {@link #majorAxisDistance}.
-     */
-    private static int majorAxisDistanceToFarEdge(@FocusRealDirection int direction,
-            @NonNull Rect source, @NonNull Rect dest) {
-        return Math.max(1, majorAxisDistanceToFarEdgeRaw(direction, source, dest));
-    }
-
-    private static int majorAxisDistanceToFarEdgeRaw(
-            @FocusRealDirection int direction, @NonNull Rect source,
-            @NonNull Rect dest) {
-        switch (direction) {
-            case View.FOCUS_LEFT:
-                return source.left - dest.left;
-            case View.FOCUS_RIGHT:
-                return dest.right - source.right;
-            case View.FOCUS_UP:
-                return source.top - dest.top;
-            case View.FOCUS_DOWN:
-                return dest.bottom - source.bottom;
-        }
-        throw new IllegalArgumentException("direction must be one of "
-                + "{FOCUS_UP, FOCUS_DOWN, FOCUS_LEFT, FOCUS_RIGHT}.");
-    }
-
-    /**
-     * Finds the distance on the minor axis w.r.t the direction to the
-     * nearest edge of the destination rectangle.
-     *
-     * @param direction the direction (up, down, left, right)
-     * @param source the source rect
-     * @param dest the destination rect
-     * @return the distance
-     */
-    private static int minorAxisDistance(@FocusRealDirection int direction, @NonNull Rect source,
-            @NonNull Rect dest) {
-        switch (direction) {
-            case View.FOCUS_LEFT:
-            case View.FOCUS_RIGHT:
-                // the distance between the center verticals
-                return Math.abs(
-                        ((source.top + source.height() / 2) -
-                                ((dest.top + dest.height() / 2))));
-            case View.FOCUS_UP:
-            case View.FOCUS_DOWN:
-                // the distance between the center horizontals
-                return Math.abs(
-                        ((source.left + source.width() / 2) -
-                                ((dest.left + dest.width() / 2))));
-        }
-        throw new IllegalArgumentException("direction must be one of "
-                + "{FOCUS_UP, FOCUS_DOWN, FOCUS_LEFT, FOCUS_RIGHT}.");
-    }
-
-    /**
-     * Adapter used to obtain bounds from a generic data type.
-     */
-    public interface BoundsAdapter<T> {
-        void obtainBounds(T data, Rect outBounds);
-    }
-
-    /**
-     * Adapter used to obtain items from a generic collection type.
-     */
-    public interface CollectionAdapter<T, V> {
-        V get(T collection, int index);
-        int size(T collection);
-    }
-}
diff --git a/v4/java/android/support/v4/widget/ListViewCompat.java b/v4/java/android/support/v4/widget/ListViewCompat.java
deleted file mode 100644
index 811315c..0000000
--- a/v4/java/android/support/v4/widget/ListViewCompat.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright (C) 2016 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 android.support.v4.widget;
-
-import android.os.Build;
-import android.support.annotation.NonNull;
-import android.widget.ListView;
-
-/**
- * Helper for accessing features in {@link ListView} introduced after API level
- * 4 in a backwards compatible fashion.
- */
-public final class ListViewCompat {
-
-    /**
-     * Scrolls the list items within the view by a specified number of pixels.
-     *
-     * @param listView the list to scroll
-     * @param y the amount of pixels to scroll by vertically
-     */
-    public static void scrollListBy(@NonNull ListView listView, int y) {
-        if (Build.VERSION.SDK_INT >= 19) {
-            ListViewCompatKitKat.scrollListBy(listView, y);
-        } else {
-            ListViewCompatDonut.scrollListBy(listView, y);
-        }
-    }
-
-    private ListViewCompat() {}
-}
diff --git a/v4/java/android/support/v4/widget/MaterialProgressDrawable.java b/v4/java/android/support/v4/widget/MaterialProgressDrawable.java
deleted file mode 100644
index db46186..0000000
--- a/v4/java/android/support/v4/widget/MaterialProgressDrawable.java
+++ /dev/null
@@ -1,792 +0,0 @@
-/*
- * Copyright (C) 2014 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 android.support.v4.widget;
-
-import android.view.animation.AccelerateDecelerateInterpolator;
-import android.view.animation.Interpolator;
-import android.view.animation.Animation;
-import android.view.animation.LinearInterpolator;
-import android.view.animation.Transformation;
-import android.content.Context;
-import android.content.res.Resources;
-import android.graphics.Canvas;
-import android.graphics.Color;
-import android.graphics.ColorFilter;
-import android.graphics.Paint;
-import android.graphics.Paint.Style;
-import android.graphics.Path;
-import android.graphics.PixelFormat;
-import android.graphics.Rect;
-import android.graphics.RectF;
-import android.graphics.drawable.Drawable;
-import android.graphics.drawable.Animatable;
-import android.support.annotation.IntDef;
-import android.support.annotation.NonNull;
-import android.support.v4.view.animation.FastOutSlowInInterpolator;
-import android.util.DisplayMetrics;
-import android.view.View;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.util.ArrayList;
-
-/**
- * Fancy progress indicator for Material theme.
- *
- * @hide
- */
-class MaterialProgressDrawable extends Drawable implements Animatable {
-    private static final Interpolator LINEAR_INTERPOLATOR = new LinearInterpolator();
-    private static final Interpolator MATERIAL_INTERPOLATOR = new FastOutSlowInInterpolator();
-
-    private static final float FULL_ROTATION = 1080.0f;
-    @Retention(RetentionPolicy.CLASS)
-    @IntDef({LARGE, DEFAULT})
-    public @interface ProgressDrawableSize {}
-    // Maps to ProgressBar.Large style
-    static final int LARGE = 0;
-    // Maps to ProgressBar default style
-    static final int DEFAULT = 1;
-
-    // Maps to ProgressBar default style
-    private static final int CIRCLE_DIAMETER = 40;
-    private static final float CENTER_RADIUS = 8.75f; //should add up to 10 when + stroke_width
-    private static final float STROKE_WIDTH = 2.5f;
-
-    // Maps to ProgressBar.Large style
-    private static final int CIRCLE_DIAMETER_LARGE = 56;
-    private static final float CENTER_RADIUS_LARGE = 12.5f;
-    private static final float STROKE_WIDTH_LARGE = 3f;
-
-    private final int[] COLORS = new int[] {
-        Color.BLACK
-    };
-
-    /**
-     * The value in the linear interpolator for animating the drawable at which
-     * the color transition should start
-     */
-    private static final float COLOR_START_DELAY_OFFSET = 0.75f;
-    private static final float END_TRIM_START_DELAY_OFFSET = 0.5f;
-    private static final float START_TRIM_DURATION_OFFSET = 0.5f;
-
-    /** The duration of a single progress spin in milliseconds. */
-    private static final int ANIMATION_DURATION = 1332;
-
-    /** The number of points in the progress "star". */
-    private static final float NUM_POINTS = 5f;
-    /** The list of animators operating on this drawable. */
-    private final ArrayList<Animation> mAnimators = new ArrayList<Animation>();
-
-    /** The indicator ring, used to manage animation state. */
-    private final Ring mRing;
-
-    /** Canvas rotation in degrees. */
-    private float mRotation;
-
-    /** Layout info for the arrowhead in dp */
-    private static final int ARROW_WIDTH = 10;
-    private static final int ARROW_HEIGHT = 5;
-    private static final float ARROW_OFFSET_ANGLE = 5;
-
-    /** Layout info for the arrowhead for the large spinner in dp */
-    private static final int ARROW_WIDTH_LARGE = 12;
-    private static final int ARROW_HEIGHT_LARGE = 6;
-    private static final float MAX_PROGRESS_ARC = .8f;
-
-    private Resources mResources;
-    private View mParent;
-    private Animation mAnimation;
-    private float mRotationCount;
-    private double mWidth;
-    private double mHeight;
-    boolean mFinishing;
-
-    public MaterialProgressDrawable(Context context, View parent) {
-        mParent = parent;
-        mResources = context.getResources();
-
-        mRing = new Ring(mCallback);
-        mRing.setColors(COLORS);
-
-        updateSizes(DEFAULT);
-        setupAnimators();
-    }
-
-    private void setSizeParameters(double progressCircleWidth, double progressCircleHeight,
-            double centerRadius, double strokeWidth, float arrowWidth, float arrowHeight) {
-        final Ring ring = mRing;
-        final DisplayMetrics metrics = mResources.getDisplayMetrics();
-        final float screenDensity = metrics.density;
-
-        mWidth = progressCircleWidth * screenDensity;
-        mHeight = progressCircleHeight * screenDensity;
-        ring.setStrokeWidth((float) strokeWidth * screenDensity);
-        ring.setCenterRadius(centerRadius * screenDensity);
-        ring.setColorIndex(0);
-        ring.setArrowDimensions(arrowWidth * screenDensity, arrowHeight * screenDensity);
-        ring.setInsets((int) mWidth, (int) mHeight);
-    }
-
-    /**
-     * Set the overall size for the progress spinner. This updates the radius
-     * and stroke width of the ring.
-     *
-     * @param size One of {@link MaterialProgressDrawable.LARGE} or
-     *            {@link MaterialProgressDrawable.DEFAULT}
-     */
-    public void updateSizes(@ProgressDrawableSize int size) {
-        if (size == LARGE) {
-            setSizeParameters(CIRCLE_DIAMETER_LARGE, CIRCLE_DIAMETER_LARGE, CENTER_RADIUS_LARGE,
-                    STROKE_WIDTH_LARGE, ARROW_WIDTH_LARGE, ARROW_HEIGHT_LARGE);
-        } else {
-            setSizeParameters(CIRCLE_DIAMETER, CIRCLE_DIAMETER, CENTER_RADIUS, STROKE_WIDTH,
-                    ARROW_WIDTH, ARROW_HEIGHT);
-        }
-    }
-
-    /**
-     * @param show Set to true to display the arrowhead on the progress spinner.
-     */
-    public void showArrow(boolean show) {
-        mRing.setShowArrow(show);
-    }
-
-    /**
-     * @param scale Set the scale of the arrowhead for the spinner.
-     */
-    public void setArrowScale(float scale) {
-        mRing.setArrowScale(scale);
-    }
-
-    /**
-     * Set the start and end trim for the progress spinner arc.
-     *
-     * @param startAngle start angle
-     * @param endAngle end angle
-     */
-    public void setStartEndTrim(float startAngle, float endAngle) {
-        mRing.setStartTrim(startAngle);
-        mRing.setEndTrim(endAngle);
-    }
-
-    /**
-     * Set the amount of rotation to apply to the progress spinner.
-     *
-     * @param rotation Rotation is from [0..1]
-     */
-    public void setProgressRotation(float rotation) {
-        mRing.setRotation(rotation);
-    }
-
-    /**
-     * Update the background color of the circle image view.
-     */
-    public void setBackgroundColor(int color) {
-        mRing.setBackgroundColor(color);
-     }
-
-    /**
-     * Set the colors used in the progress animation from color resources.
-     * The first color will also be the color of the bar that grows in response
-     * to a user swipe gesture.
-     *
-     * @param colors
-     */
-    public void setColorSchemeColors(int... colors) {
-        mRing.setColors(colors);
-        mRing.setColorIndex(0);
-    }
-
-    @Override
-    public int getIntrinsicHeight() {
-        return (int) mHeight;
-    }
-
-    @Override
-    public int getIntrinsicWidth() {
-        return (int) mWidth;
-    }
-
-    @Override
-    public void draw(Canvas c) {
-        final Rect bounds = getBounds();
-        final int saveCount = c.save();
-        c.rotate(mRotation, bounds.exactCenterX(), bounds.exactCenterY());
-        mRing.draw(c, bounds);
-        c.restoreToCount(saveCount);
-    }
-
-    @Override
-    public void setAlpha(int alpha) {
-        mRing.setAlpha(alpha);
-    }
-
-    public int getAlpha() {
-        return mRing.getAlpha();
-    }
-
-    @Override
-    public void setColorFilter(ColorFilter colorFilter) {
-        mRing.setColorFilter(colorFilter);
-    }
-
-    @SuppressWarnings("unused")
-    void setRotation(float rotation) {
-        mRotation = rotation;
-        invalidateSelf();
-    }
-
-    @SuppressWarnings("unused")
-    private float getRotation() {
-        return mRotation;
-    }
-
-    @Override
-    public int getOpacity() {
-        return PixelFormat.TRANSLUCENT;
-    }
-
-    @Override
-    public boolean isRunning() {
-        final ArrayList<Animation> animators = mAnimators;
-        final int N = animators.size();
-        for (int i = 0; i < N; i++) {
-            final Animation animator = animators.get(i);
-            if (animator.hasStarted() && !animator.hasEnded()) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    @Override
-    public void start() {
-        mAnimation.reset();
-        mRing.storeOriginals();
-        // Already showing some part of the ring
-        if (mRing.getEndTrim() != mRing.getStartTrim()) {
-            mFinishing = true;
-            mAnimation.setDuration(ANIMATION_DURATION/2);
-            mParent.startAnimation(mAnimation);
-        } else {
-            mRing.setColorIndex(0);
-            mRing.resetOriginals();
-            mAnimation.setDuration(ANIMATION_DURATION);
-            mParent.startAnimation(mAnimation);
-        }
-    }
-
-    @Override
-    public void stop() {
-        mParent.clearAnimation();
-        setRotation(0);
-        mRing.setShowArrow(false);
-        mRing.setColorIndex(0);
-        mRing.resetOriginals();
-    }
-
-    private float getMinProgressArc(Ring ring) {
-        return (float) Math.toRadians(
-                ring.getStrokeWidth() / (2 * Math.PI * ring.getCenterRadius()));
-    }
-
-    // Adapted from ArgbEvaluator.java
-    private int evaluateColorChange(float fraction, int startValue, int endValue) {
-        int startInt = (Integer) startValue;
-        int startA = (startInt >> 24) & 0xff;
-        int startR = (startInt >> 16) & 0xff;
-        int startG = (startInt >> 8) & 0xff;
-        int startB = startInt & 0xff;
-
-        int endInt = (Integer) endValue;
-        int endA = (endInt >> 24) & 0xff;
-        int endR = (endInt >> 16) & 0xff;
-        int endG = (endInt >> 8) & 0xff;
-        int endB = endInt & 0xff;
-
-        return (int)((startA + (int)(fraction * (endA - startA))) << 24) |
-                (int)((startR + (int)(fraction * (endR - startR))) << 16) |
-                (int)((startG + (int)(fraction * (endG - startG))) << 8) |
-                (int)((startB + (int)(fraction * (endB - startB))));
-    }
-
-    /**
-     * Update the ring color if this is within the last 25% of the animation.
-     * The new ring color will be a translation from the starting ring color to
-     * the next color.
-     */
-    private void updateRingColor(float interpolatedTime, Ring ring) {
-        if (interpolatedTime > COLOR_START_DELAY_OFFSET) {
-            // scale the interpolatedTime so that the full
-            // transformation from 0 - 1 takes place in the
-            // remaining time
-            ring.setColor(evaluateColorChange((interpolatedTime - COLOR_START_DELAY_OFFSET)
-                    / (1.0f - COLOR_START_DELAY_OFFSET), ring.getStartingColor(),
-                    ring.getNextColor()));
-        }
-    }
-
-    private void applyFinishTranslation(float interpolatedTime, Ring ring) {
-        // shrink back down and complete a full rotation before
-        // starting other circles
-        // Rotation goes between [0..1].
-        updateRingColor(interpolatedTime, ring);
-        float targetRotation = (float) (Math.floor(ring.getStartingRotation() / MAX_PROGRESS_ARC)
-                + 1f);
-        final float minProgressArc = getMinProgressArc(ring);
-        final float startTrim = ring.getStartingStartTrim()
-                + (ring.getStartingEndTrim() - minProgressArc - ring.getStartingStartTrim())
-                * interpolatedTime;
-        ring.setStartTrim(startTrim);
-        ring.setEndTrim(ring.getStartingEndTrim());
-        final float rotation = ring.getStartingRotation()
-                + ((targetRotation - ring.getStartingRotation()) * interpolatedTime);
-        ring.setRotation(rotation);
-    }
-
-    private void setupAnimators() {
-        final Ring ring = mRing;
-        final Animation animation = new Animation() {
-                @Override
-            public void applyTransformation(float interpolatedTime, Transformation t) {
-                if (mFinishing) {
-                    applyFinishTranslation(interpolatedTime, ring);
-                } else {
-                    // The minProgressArc is calculated from 0 to create an
-                    // angle that matches the stroke width.
-                    final float minProgressArc = getMinProgressArc(ring);
-                    final float startingEndTrim = ring.getStartingEndTrim();
-                    final float startingTrim = ring.getStartingStartTrim();
-                    final float startingRotation = ring.getStartingRotation();
-
-                    updateRingColor(interpolatedTime, ring);
-
-                    // Moving the start trim only occurs in the first 50% of a
-                    // single ring animation
-                    if (interpolatedTime <= START_TRIM_DURATION_OFFSET) {
-                        // scale the interpolatedTime so that the full
-                        // transformation from 0 - 1 takes place in the
-                        // remaining time
-                        final float scaledTime = (interpolatedTime)
-                                / (1.0f - START_TRIM_DURATION_OFFSET);
-                        final float startTrim = startingTrim
-                                + ((MAX_PROGRESS_ARC - minProgressArc) * MATERIAL_INTERPOLATOR
-                                        .getInterpolation(scaledTime));
-                        ring.setStartTrim(startTrim);
-                    }
-
-                    // Moving the end trim starts after 50% of a single ring
-                    // animation completes
-                    if (interpolatedTime > END_TRIM_START_DELAY_OFFSET) {
-                        // scale the interpolatedTime so that the full
-                        // transformation from 0 - 1 takes place in the
-                        // remaining time
-                        final float minArc = MAX_PROGRESS_ARC - minProgressArc;
-                        float scaledTime = (interpolatedTime - START_TRIM_DURATION_OFFSET)
-                                / (1.0f - START_TRIM_DURATION_OFFSET);
-                        final float endTrim = startingEndTrim
-                                + (minArc * MATERIAL_INTERPOLATOR.getInterpolation(scaledTime));
-                        ring.setEndTrim(endTrim);
-                    }
-
-                    final float rotation = startingRotation + (0.25f * interpolatedTime);
-                    ring.setRotation(rotation);
-
-                    float groupRotation = ((FULL_ROTATION / NUM_POINTS) * interpolatedTime)
-                            + (FULL_ROTATION * (mRotationCount / NUM_POINTS));
-                    setRotation(groupRotation);
-                }
-            }
-        };
-        animation.setRepeatCount(Animation.INFINITE);
-        animation.setRepeatMode(Animation.RESTART);
-        animation.setInterpolator(LINEAR_INTERPOLATOR);
-        animation.setAnimationListener(new Animation.AnimationListener() {
-
-                @Override
-            public void onAnimationStart(Animation animation) {
-                mRotationCount = 0;
-            }
-
-                @Override
-            public void onAnimationEnd(Animation animation) {
-                // do nothing
-            }
-
-                @Override
-            public void onAnimationRepeat(Animation animation) {
-                ring.storeOriginals();
-                ring.goToNextColor();
-                ring.setStartTrim(ring.getEndTrim());
-                if (mFinishing) {
-                    // finished closing the last ring from the swipe gesture; go
-                    // into progress mode
-                    mFinishing = false;
-                    animation.setDuration(ANIMATION_DURATION);
-                    ring.setShowArrow(false);
-                } else {
-                    mRotationCount = (mRotationCount + 1) % (NUM_POINTS);
-                }
-            }
-        });
-        mAnimation = animation;
-    }
-
-    private final Callback mCallback = new Callback() {
-        @Override
-        public void invalidateDrawable(Drawable d) {
-            invalidateSelf();
-        }
-
-        @Override
-        public void scheduleDrawable(Drawable d, Runnable what, long when) {
-            scheduleSelf(what, when);
-        }
-
-        @Override
-        public void unscheduleDrawable(Drawable d, Runnable what) {
-            unscheduleSelf(what);
-        }
-    };
-
-    private static class Ring {
-        private final RectF mTempBounds = new RectF();
-        private final Paint mPaint = new Paint();
-        private final Paint mArrowPaint = new Paint();
-
-        private final Callback mCallback;
-
-        private float mStartTrim = 0.0f;
-        private float mEndTrim = 0.0f;
-        private float mRotation = 0.0f;
-        private float mStrokeWidth = 5.0f;
-        private float mStrokeInset = 2.5f;
-
-        private int[] mColors;
-        // mColorIndex represents the offset into the available mColors that the
-        // progress circle should currently display. As the progress circle is
-        // animating, the mColorIndex moves by one to the next available color.
-        private int mColorIndex;
-        private float mStartingStartTrim;
-        private float mStartingEndTrim;
-        private float mStartingRotation;
-        private boolean mShowArrow;
-        private Path mArrow;
-        private float mArrowScale;
-        private double mRingCenterRadius;
-        private int mArrowWidth;
-        private int mArrowHeight;
-        private int mAlpha;
-        private final Paint mCirclePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
-        private int mBackgroundColor;
-        private int mCurrentColor;
-
-        public Ring(Callback callback) {
-            mCallback = callback;
-
-            mPaint.setStrokeCap(Paint.Cap.SQUARE);
-            mPaint.setAntiAlias(true);
-            mPaint.setStyle(Style.STROKE);
-
-            mArrowPaint.setStyle(Paint.Style.FILL);
-            mArrowPaint.setAntiAlias(true);
-        }
-
-        public void setBackgroundColor(int color) {
-            mBackgroundColor = color;
-        }
-
-        /**
-         * Set the dimensions of the arrowhead.
-         *
-         * @param width Width of the hypotenuse of the arrow head
-         * @param height Height of the arrow point
-         */
-        public void setArrowDimensions(float width, float height) {
-            mArrowWidth = (int) width;
-            mArrowHeight = (int) height;
-        }
-
-        /**
-         * Draw the progress spinner
-         */
-        public void draw(Canvas c, Rect bounds) {
-            final RectF arcBounds = mTempBounds;
-            arcBounds.set(bounds);
-            arcBounds.inset(mStrokeInset, mStrokeInset);
-
-            final float startAngle = (mStartTrim + mRotation) * 360;
-            final float endAngle = (mEndTrim + mRotation) * 360;
-            float sweepAngle = endAngle - startAngle;
-
-            mPaint.setColor(mCurrentColor);
-            c.drawArc(arcBounds, startAngle, sweepAngle, false, mPaint);
-
-            drawTriangle(c, startAngle, sweepAngle, bounds);
-
-            if (mAlpha < 255) {
-                mCirclePaint.setColor(mBackgroundColor);
-                mCirclePaint.setAlpha(255 - mAlpha);
-                c.drawCircle(bounds.exactCenterX(), bounds.exactCenterY(), bounds.width() / 2,
-                        mCirclePaint);
-            }
-        }
-
-        private void drawTriangle(Canvas c, float startAngle, float sweepAngle, Rect bounds) {
-            if (mShowArrow) {
-                if (mArrow == null) {
-                    mArrow = new android.graphics.Path();
-                    mArrow.setFillType(android.graphics.Path.FillType.EVEN_ODD);
-                } else {
-                    mArrow.reset();
-                }
-
-                // Adjust the position of the triangle so that it is inset as
-                // much as the arc, but also centered on the arc.
-                float inset = (int) mStrokeInset / 2 * mArrowScale;
-                float x = (float) (mRingCenterRadius * Math.cos(0) + bounds.exactCenterX());
-                float y = (float) (mRingCenterRadius * Math.sin(0) + bounds.exactCenterY());
-
-                // Update the path each time. This works around an issue in SKIA
-                // where concatenating a rotation matrix to a scale matrix
-                // ignored a starting negative rotation. This appears to have
-                // been fixed as of API 21.
-                mArrow.moveTo(0, 0);
-                mArrow.lineTo(mArrowWidth * mArrowScale, 0);
-                mArrow.lineTo((mArrowWidth * mArrowScale / 2), (mArrowHeight
-                        * mArrowScale));
-                mArrow.offset(x - inset, y);
-                mArrow.close();
-                // draw a triangle
-                mArrowPaint.setColor(mCurrentColor);
-                c.rotate(startAngle + sweepAngle - ARROW_OFFSET_ANGLE, bounds.exactCenterX(),
-                        bounds.exactCenterY());
-                c.drawPath(mArrow, mArrowPaint);
-            }
-        }
-
-        /**
-         * Set the colors the progress spinner alternates between.
-         *
-         * @param colors Array of integers describing the colors. Must be non-<code>null</code>.
-         */
-        public void setColors(@NonNull int[] colors) {
-            mColors = colors;
-            // if colors are reset, make sure to reset the color index as well
-            setColorIndex(0);
-        }
-
-        /**
-         * Set the absolute color of the progress spinner. This is should only
-         * be used when animating between current and next color when the
-         * spinner is rotating.
-         *
-         * @param color int describing the color.
-         */
-        public void setColor(int color) {
-            mCurrentColor = color;
-        }
-
-        /**
-         * @param index Index into the color array of the color to display in
-         *            the progress spinner.
-         */
-        public void setColorIndex(int index) {
-            mColorIndex = index;
-            mCurrentColor = mColors[mColorIndex];
-        }
-
-        /**
-         * @return int describing the next color the progress spinner should use when drawing.
-         */
-        public int getNextColor() {
-            return mColors[getNextColorIndex()];
-        }
-
-        private int getNextColorIndex() {
-            return (mColorIndex + 1) % (mColors.length);
-        }
-
-        /**
-         * Proceed to the next available ring color. This will automatically
-         * wrap back to the beginning of colors.
-         */
-        public void goToNextColor() {
-            setColorIndex(getNextColorIndex());
-        }
-
-        public void setColorFilter(ColorFilter filter) {
-            mPaint.setColorFilter(filter);
-            invalidateSelf();
-        }
-
-        /**
-         * @param alpha Set the alpha of the progress spinner and associated arrowhead.
-         */
-        public void setAlpha(int alpha) {
-            mAlpha = alpha;
-        }
-
-        /**
-         * @return Current alpha of the progress spinner and arrowhead.
-         */
-        public int getAlpha() {
-            return mAlpha;
-        }
-
-        /**
-         * @param strokeWidth Set the stroke width of the progress spinner in pixels.
-         */
-        public void setStrokeWidth(float strokeWidth) {
-            mStrokeWidth = strokeWidth;
-            mPaint.setStrokeWidth(strokeWidth);
-            invalidateSelf();
-        }
-
-        @SuppressWarnings("unused")
-        public float getStrokeWidth() {
-            return mStrokeWidth;
-        }
-
-        @SuppressWarnings("unused")
-        public void setStartTrim(float startTrim) {
-            mStartTrim = startTrim;
-            invalidateSelf();
-        }
-
-        @SuppressWarnings("unused")
-        public float getStartTrim() {
-            return mStartTrim;
-        }
-
-        public float getStartingStartTrim() {
-            return mStartingStartTrim;
-        }
-
-        public float getStartingEndTrim() {
-            return mStartingEndTrim;
-        }
-
-        public int getStartingColor() {
-            return mColors[mColorIndex];
-        }
-
-        @SuppressWarnings("unused")
-        public void setEndTrim(float endTrim) {
-            mEndTrim = endTrim;
-            invalidateSelf();
-        }
-
-        @SuppressWarnings("unused")
-        public float getEndTrim() {
-            return mEndTrim;
-        }
-
-        @SuppressWarnings("unused")
-        public void setRotation(float rotation) {
-            mRotation = rotation;
-            invalidateSelf();
-        }
-
-        @SuppressWarnings("unused")
-        public float getRotation() {
-            return mRotation;
-        }
-
-        public void setInsets(int width, int height) {
-            final float minEdge = (float) Math.min(width, height);
-            float insets;
-            if (mRingCenterRadius <= 0 || minEdge < 0) {
-                insets = (float) Math.ceil(mStrokeWidth / 2.0f);
-            } else {
-                insets = (float) (minEdge / 2.0f - mRingCenterRadius);
-            }
-            mStrokeInset = insets;
-        }
-
-        @SuppressWarnings("unused")
-        public float getInsets() {
-            return mStrokeInset;
-        }
-
-        /**
-         * @param centerRadius Inner radius in px of the circle the progress
-         *            spinner arc traces.
-         */
-        public void setCenterRadius(double centerRadius) {
-            mRingCenterRadius = centerRadius;
-        }
-
-        public double getCenterRadius() {
-            return mRingCenterRadius;
-        }
-
-        /**
-         * @param show Set to true to show the arrow head on the progress spinner.
-         */
-        public void setShowArrow(boolean show) {
-            if (mShowArrow != show) {
-                mShowArrow = show;
-                invalidateSelf();
-            }
-        }
-
-        /**
-         * @param scale Set the scale of the arrowhead for the spinner.
-         */
-        public void setArrowScale(float scale) {
-            if (scale != mArrowScale) {
-                mArrowScale = scale;
-                invalidateSelf();
-            }
-        }
-
-        /**
-         * @return The amount the progress spinner is currently rotated, between [0..1].
-         */
-        public float getStartingRotation() {
-            return mStartingRotation;
-        }
-
-        /**
-         * If the start / end trim are offset to begin with, store them so that
-         * animation starts from that offset.
-         */
-        public void storeOriginals() {
-            mStartingStartTrim = mStartTrim;
-            mStartingEndTrim = mEndTrim;
-            mStartingRotation = mRotation;
-        }
-
-        /**
-         * Reset the progress spinner to default rotation, start and end angles.
-         */
-        public void resetOriginals() {
-            mStartingStartTrim = 0;
-            mStartingEndTrim = 0;
-            mStartingRotation = 0;
-            setStartTrim(0);
-            setEndTrim(0);
-            setRotation(0);
-        }
-
-        private void invalidateSelf() {
-            mCallback.invalidateDrawable(null);
-        }
-    }
-}
diff --git a/v4/java/android/support/v4/widget/NestedScrollView.java b/v4/java/android/support/v4/widget/NestedScrollView.java
deleted file mode 100644
index 6f5dbbc..0000000
--- a/v4/java/android/support/v4/widget/NestedScrollView.java
+++ /dev/null
@@ -1,1950 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.v4.widget;
-
-import android.content.Context;
-import android.content.res.TypedArray;
-import android.graphics.Canvas;
-import android.graphics.Rect;
-import android.os.Bundle;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.support.v4.view.AccessibilityDelegateCompat;
-import android.support.v4.view.InputDeviceCompat;
-import android.support.v4.view.MotionEventCompat;
-import android.support.v4.view.NestedScrollingChild;
-import android.support.v4.view.NestedScrollingChildHelper;
-import android.support.v4.view.NestedScrollingParent;
-import android.support.v4.view.NestedScrollingParentHelper;
-import android.support.v4.view.ScrollingView;
-import android.support.v4.view.VelocityTrackerCompat;
-import android.support.v4.view.ViewCompat;
-import android.support.v4.view.accessibility.AccessibilityEventCompat;
-import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat;
-import android.support.v4.view.accessibility.AccessibilityRecordCompat;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.util.TypedValue;
-import android.view.FocusFinder;
-import android.view.KeyEvent;
-import android.view.MotionEvent;
-import android.view.VelocityTracker;
-import android.view.View;
-import android.view.ViewConfiguration;
-import android.view.ViewGroup;
-import android.view.ViewParent;
-import android.view.accessibility.AccessibilityEvent;
-import android.view.animation.AnimationUtils;
-import android.widget.FrameLayout;
-import android.widget.ScrollView;
-
-import java.util.List;
-
-/**
- * NestedScrollView is just like {@link android.widget.ScrollView}, but it supports acting
- * as both a nested scrolling parent and child on both new and old versions of Android.
- * Nested scrolling is enabled by default.
- */
-public class NestedScrollView extends FrameLayout implements NestedScrollingParent,
-        NestedScrollingChild, ScrollingView {
-    static final int ANIMATED_SCROLL_GAP = 250;
-
-    static final float MAX_SCROLL_FACTOR = 0.5f;
-
-    private static final String TAG = "NestedScrollView";
-
-    /**
-     * Interface definition for a callback to be invoked when the scroll
-     * X or Y positions of a view change.
-     *
-     * <p>This version of the interface works on all versions of Android, back to API v4.</p>
-     *
-     * @see #setOnScrollChangeListener(OnScrollChangeListener)
-     */
-    public interface OnScrollChangeListener {
-        /**
-         * Called when the scroll position of a view changes.
-         *
-         * @param v The view whose scroll position has changed.
-         * @param scrollX Current horizontal scroll origin.
-         * @param scrollY Current vertical scroll origin.
-         * @param oldScrollX Previous horizontal scroll origin.
-         * @param oldScrollY Previous vertical scroll origin.
-         */
-        void onScrollChange(NestedScrollView v, int scrollX, int scrollY,
-                int oldScrollX, int oldScrollY);
-    }
-
-    private long mLastScroll;
-
-    private final Rect mTempRect = new Rect();
-    private ScrollerCompat mScroller;
-    private EdgeEffectCompat mEdgeGlowTop;
-    private EdgeEffectCompat mEdgeGlowBottom;
-
-    /**
-     * Position of the last motion event.
-     */
-    private int mLastMotionY;
-
-    /**
-     * True when the layout has changed but the traversal has not come through yet.
-     * Ideally the view hierarchy would keep track of this for us.
-     */
-    private boolean mIsLayoutDirty = true;
-    private boolean mIsLaidOut = false;
-
-    /**
-     * The child to give focus to in the event that a child has requested focus while the
-     * layout is dirty. This prevents the scroll from being wrong if the child has not been
-     * laid out before requesting focus.
-     */
-    private View mChildToScrollTo = null;
-
-    /**
-     * True if the user is currently dragging this ScrollView around. This is
-     * not the same as 'is being flinged', which can be checked by
-     * mScroller.isFinished() (flinging begins when the user lifts his finger).
-     */
-    private boolean mIsBeingDragged = false;
-
-    /**
-     * Determines speed during touch scrolling
-     */
-    private VelocityTracker mVelocityTracker;
-
-    /**
-     * When set to true, the scroll view measure its child to make it fill the currently
-     * visible area.
-     */
-    private boolean mFillViewport;
-
-    /**
-     * Whether arrow scrolling is animated.
-     */
-    private boolean mSmoothScrollingEnabled = true;
-
-    private int mTouchSlop;
-    private int mMinimumVelocity;
-    private int mMaximumVelocity;
-
-    /**
-     * ID of the active pointer. This is used to retain consistency during
-     * drags/flings if multiple pointers are used.
-     */
-    private int mActivePointerId = INVALID_POINTER;
-
-    /**
-     * Used during scrolling to retrieve the new offset within the window.
-     */
-    private final int[] mScrollOffset = new int[2];
-    private final int[] mScrollConsumed = new int[2];
-    private int mNestedYOffset;
-
-    /**
-     * Sentinel value for no current active pointer.
-     * Used by {@link #mActivePointerId}.
-     */
-    private static final int INVALID_POINTER = -1;
-
-    private SavedState mSavedState;
-
-    private static final AccessibilityDelegate ACCESSIBILITY_DELEGATE = new AccessibilityDelegate();
-
-    private static final int[] SCROLLVIEW_STYLEABLE = new int[] {
-            android.R.attr.fillViewport
-    };
-
-    private final NestedScrollingParentHelper mParentHelper;
-    private final NestedScrollingChildHelper mChildHelper;
-
-    private float mVerticalScrollFactor;
-
-    private OnScrollChangeListener mOnScrollChangeListener;
-
-    public NestedScrollView(Context context) {
-        this(context, null);
-    }
-
-    public NestedScrollView(Context context, AttributeSet attrs) {
-        this(context, attrs, 0);
-    }
-
-    public NestedScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
-        super(context, attrs, defStyleAttr);
-        initScrollView();
-
-        final TypedArray a = context.obtainStyledAttributes(
-                attrs, SCROLLVIEW_STYLEABLE, defStyleAttr, 0);
-
-        setFillViewport(a.getBoolean(0, false));
-
-        a.recycle();
-
-        mParentHelper = new NestedScrollingParentHelper(this);
-        mChildHelper = new NestedScrollingChildHelper(this);
-
-        // ...because why else would you be using this widget?
-        setNestedScrollingEnabled(true);
-
-        ViewCompat.setAccessibilityDelegate(this, ACCESSIBILITY_DELEGATE);
-    }
-
-    // NestedScrollingChild
-
-    @Override
-    public void setNestedScrollingEnabled(boolean enabled) {
-        mChildHelper.setNestedScrollingEnabled(enabled);
-    }
-
-    @Override
-    public boolean isNestedScrollingEnabled() {
-        return mChildHelper.isNestedScrollingEnabled();
-    }
-
-    @Override
-    public boolean startNestedScroll(int axes) {
-        return mChildHelper.startNestedScroll(axes);
-    }
-
-    @Override
-    public void stopNestedScroll() {
-        mChildHelper.stopNestedScroll();
-    }
-
-    @Override
-    public boolean hasNestedScrollingParent() {
-        return mChildHelper.hasNestedScrollingParent();
-    }
-
-    @Override
-    public boolean dispatchNestedScroll(int dxConsumed, int dyConsumed, int dxUnconsumed,
-            int dyUnconsumed, int[] offsetInWindow) {
-        return mChildHelper.dispatchNestedScroll(dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed,
-                offsetInWindow);
-    }
-
-    @Override
-    public boolean dispatchNestedPreScroll(int dx, int dy, int[] consumed, int[] offsetInWindow) {
-        return mChildHelper.dispatchNestedPreScroll(dx, dy, consumed, offsetInWindow);
-    }
-
-    @Override
-    public boolean dispatchNestedFling(float velocityX, float velocityY, boolean consumed) {
-        return mChildHelper.dispatchNestedFling(velocityX, velocityY, consumed);
-    }
-
-    @Override
-    public boolean dispatchNestedPreFling(float velocityX, float velocityY) {
-        return mChildHelper.dispatchNestedPreFling(velocityX, velocityY);
-    }
-
-    // NestedScrollingParent
-
-    @Override
-    public boolean onStartNestedScroll(View child, View target, int nestedScrollAxes) {
-        return (nestedScrollAxes & ViewCompat.SCROLL_AXIS_VERTICAL) != 0;
-    }
-
-    @Override
-    public void onNestedScrollAccepted(View child, View target, int nestedScrollAxes) {
-        mParentHelper.onNestedScrollAccepted(child, target, nestedScrollAxes);
-        startNestedScroll(ViewCompat.SCROLL_AXIS_VERTICAL);
-    }
-
-    @Override
-    public void onStopNestedScroll(View target) {
-        mParentHelper.onStopNestedScroll(target);
-        stopNestedScroll();
-    }
-
-    @Override
-    public void onNestedScroll(View target, int dxConsumed, int dyConsumed, int dxUnconsumed,
-            int dyUnconsumed) {
-        final int oldScrollY = getScrollY();
-        scrollBy(0, dyUnconsumed);
-        final int myConsumed = getScrollY() - oldScrollY;
-        final int myUnconsumed = dyUnconsumed - myConsumed;
-        dispatchNestedScroll(0, myConsumed, 0, myUnconsumed, null);
-    }
-
-    @Override
-    public void onNestedPreScroll(View target, int dx, int dy, int[] consumed) {
-        dispatchNestedPreScroll(dx, dy, consumed, null);
-    }
-
-    @Override
-    public boolean onNestedFling(View target, float velocityX, float velocityY, boolean consumed) {
-        if (!consumed) {
-            flingWithNestedDispatch((int) velocityY);
-            return true;
-        }
-        return false;
-    }
-
-    @Override
-    public boolean onNestedPreFling(View target, float velocityX, float velocityY) {
-        return dispatchNestedPreFling(velocityX, velocityY);
-    }
-
-    @Override
-    public int getNestedScrollAxes() {
-        return mParentHelper.getNestedScrollAxes();
-    }
-
-    // ScrollView import
-
-    public boolean shouldDelayChildPressedState() {
-        return true;
-    }
-
-    @Override
-    protected float getTopFadingEdgeStrength() {
-        if (getChildCount() == 0) {
-            return 0.0f;
-        }
-
-        final int length = getVerticalFadingEdgeLength();
-        final int scrollY = getScrollY();
-        if (scrollY < length) {
-            return scrollY / (float) length;
-        }
-
-        return 1.0f;
-    }
-
-    @Override
-    protected float getBottomFadingEdgeStrength() {
-        if (getChildCount() == 0) {
-            return 0.0f;
-        }
-
-        final int length = getVerticalFadingEdgeLength();
-        final int bottomEdge = getHeight() - getPaddingBottom();
-        final int span = getChildAt(0).getBottom() - getScrollY() - bottomEdge;
-        if (span < length) {
-            return span / (float) length;
-        }
-
-        return 1.0f;
-    }
-
-    /**
-     * @return The maximum amount this scroll view will scroll in response to
-     *   an arrow event.
-     */
-    public int getMaxScrollAmount() {
-        return (int) (MAX_SCROLL_FACTOR * getHeight());
-    }
-
-    private void initScrollView() {
-        mScroller = ScrollerCompat.create(getContext(), null);
-        setFocusable(true);
-        setDescendantFocusability(FOCUS_AFTER_DESCENDANTS);
-        setWillNotDraw(false);
-        final ViewConfiguration configuration = ViewConfiguration.get(getContext());
-        mTouchSlop = configuration.getScaledTouchSlop();
-        mMinimumVelocity = configuration.getScaledMinimumFlingVelocity();
-        mMaximumVelocity = configuration.getScaledMaximumFlingVelocity();
-    }
-
-    @Override
-    public void addView(View child) {
-        if (getChildCount() > 0) {
-            throw new IllegalStateException("ScrollView can host only one direct child");
-        }
-
-        super.addView(child);
-    }
-
-    @Override
-    public void addView(View child, int index) {
-        if (getChildCount() > 0) {
-            throw new IllegalStateException("ScrollView can host only one direct child");
-        }
-
-        super.addView(child, index);
-    }
-
-    @Override
-    public void addView(View child, ViewGroup.LayoutParams params) {
-        if (getChildCount() > 0) {
-            throw new IllegalStateException("ScrollView can host only one direct child");
-        }
-
-        super.addView(child, params);
-    }
-
-    @Override
-    public void addView(View child, int index, ViewGroup.LayoutParams params) {
-        if (getChildCount() > 0) {
-            throw new IllegalStateException("ScrollView can host only one direct child");
-        }
-
-        super.addView(child, index, params);
-    }
-
-    /**
-     * Register a callback to be invoked when the scroll X or Y positions of
-     * this view change.
-     * <p>This version of the method works on all versions of Android, back to API v4.</p>
-     *
-     * @param l The listener to notify when the scroll X or Y position changes.
-     * @see android.view.View#getScrollX()
-     * @see android.view.View#getScrollY()
-     */
-    public void setOnScrollChangeListener(OnScrollChangeListener l) {
-        mOnScrollChangeListener = l;
-    }
-
-    /**
-     * @return Returns true this ScrollView can be scrolled
-     */
-    private boolean canScroll() {
-        View child = getChildAt(0);
-        if (child != null) {
-            int childHeight = child.getHeight();
-            return getHeight() < childHeight + getPaddingTop() + getPaddingBottom();
-        }
-        return false;
-    }
-
-    /**
-     * Indicates whether this ScrollView's content is stretched to fill the viewport.
-     *
-     * @return True if the content fills the viewport, false otherwise.
-     *
-     * @attr name android:fillViewport
-     */
-    public boolean isFillViewport() {
-        return mFillViewport;
-    }
-
-    /**
-     * Indicates this ScrollView whether it should stretch its content height to fill
-     * the viewport or not.
-     *
-     * @param fillViewport True to stretch the content's height to the viewport's
-     *        boundaries, false otherwise.
-     *
-     * @attr name android:fillViewport
-     */
-    public void setFillViewport(boolean fillViewport) {
-        if (fillViewport != mFillViewport) {
-            mFillViewport = fillViewport;
-            requestLayout();
-        }
-    }
-
-    /**
-     * @return Whether arrow scrolling will animate its transition.
-     */
-    public boolean isSmoothScrollingEnabled() {
-        return mSmoothScrollingEnabled;
-    }
-
-    /**
-     * Set whether arrow scrolling will animate its transition.
-     * @param smoothScrollingEnabled whether arrow scrolling will animate its transition
-     */
-    public void setSmoothScrollingEnabled(boolean smoothScrollingEnabled) {
-        mSmoothScrollingEnabled = smoothScrollingEnabled;
-    }
-
-    @Override
-    protected void onScrollChanged(int l, int t, int oldl, int oldt) {
-        super.onScrollChanged(l, t, oldl, oldt);
-
-        if (mOnScrollChangeListener != null) {
-            mOnScrollChangeListener.onScrollChange(this, l, t, oldl, oldt);
-        }
-    }
-
-    @Override
-    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
-        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
-
-        if (!mFillViewport) {
-            return;
-        }
-
-        final int heightMode = MeasureSpec.getMode(heightMeasureSpec);
-        if (heightMode == MeasureSpec.UNSPECIFIED) {
-            return;
-        }
-
-        if (getChildCount() > 0) {
-            final View child = getChildAt(0);
-            int height = getMeasuredHeight();
-            if (child.getMeasuredHeight() < height) {
-                final FrameLayout.LayoutParams lp = (LayoutParams) child.getLayoutParams();
-
-                int childWidthMeasureSpec = getChildMeasureSpec(widthMeasureSpec,
-                        getPaddingLeft() + getPaddingRight(), lp.width);
-                height -= getPaddingTop();
-                height -= getPaddingBottom();
-                int childHeightMeasureSpec =
-                        MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);
-
-                child.measure(childWidthMeasureSpec, childHeightMeasureSpec);
-            }
-        }
-    }
-
-    @Override
-    public boolean dispatchKeyEvent(KeyEvent event) {
-        // Let the focused view and/or our descendants get the key first
-        return super.dispatchKeyEvent(event) || executeKeyEvent(event);
-    }
-
-    /**
-     * You can call this function yourself to have the scroll view perform
-     * scrolling from a key event, just as if the event had been dispatched to
-     * it by the view hierarchy.
-     *
-     * @param event The key event to execute.
-     * @return Return true if the event was handled, else false.
-     */
-    public boolean executeKeyEvent(KeyEvent event) {
-        mTempRect.setEmpty();
-
-        if (!canScroll()) {
-            if (isFocused() && event.getKeyCode() != KeyEvent.KEYCODE_BACK) {
-                View currentFocused = findFocus();
-                if (currentFocused == this) currentFocused = null;
-                View nextFocused = FocusFinder.getInstance().findNextFocus(this,
-                        currentFocused, View.FOCUS_DOWN);
-                return nextFocused != null
-                        && nextFocused != this
-                        && nextFocused.requestFocus(View.FOCUS_DOWN);
-            }
-            return false;
-        }
-
-        boolean handled = false;
-        if (event.getAction() == KeyEvent.ACTION_DOWN) {
-            switch (event.getKeyCode()) {
-                case KeyEvent.KEYCODE_DPAD_UP:
-                    if (!event.isAltPressed()) {
-                        handled = arrowScroll(View.FOCUS_UP);
-                    } else {
-                        handled = fullScroll(View.FOCUS_UP);
-                    }
-                    break;
-                case KeyEvent.KEYCODE_DPAD_DOWN:
-                    if (!event.isAltPressed()) {
-                        handled = arrowScroll(View.FOCUS_DOWN);
-                    } else {
-                        handled = fullScroll(View.FOCUS_DOWN);
-                    }
-                    break;
-                case KeyEvent.KEYCODE_SPACE:
-                    pageScroll(event.isShiftPressed() ? View.FOCUS_UP : View.FOCUS_DOWN);
-                    break;
-            }
-        }
-
-        return handled;
-    }
-
-    private boolean inChild(int x, int y) {
-        if (getChildCount() > 0) {
-            final int scrollY = getScrollY();
-            final View child = getChildAt(0);
-            return !(y < child.getTop() - scrollY
-                    || y >= child.getBottom() - scrollY
-                    || x < child.getLeft()
-                    || x >= child.getRight());
-        }
-        return false;
-    }
-
-    private void initOrResetVelocityTracker() {
-        if (mVelocityTracker == null) {
-            mVelocityTracker = VelocityTracker.obtain();
-        } else {
-            mVelocityTracker.clear();
-        }
-    }
-
-    private void initVelocityTrackerIfNotExists() {
-        if (mVelocityTracker == null) {
-            mVelocityTracker = VelocityTracker.obtain();
-        }
-    }
-
-    private void recycleVelocityTracker() {
-        if (mVelocityTracker != null) {
-            mVelocityTracker.recycle();
-            mVelocityTracker = null;
-        }
-    }
-
-    @Override
-    public void requestDisallowInterceptTouchEvent(boolean disallowIntercept) {
-        if (disallowIntercept) {
-            recycleVelocityTracker();
-        }
-        super.requestDisallowInterceptTouchEvent(disallowIntercept);
-    }
-
-
-    @Override
-    public boolean onInterceptTouchEvent(MotionEvent ev) {
-        /*
-         * This method JUST determines whether we want to intercept the motion.
-         * If we return true, onMotionEvent will be called and we do the actual
-         * scrolling there.
-         */
-
-        /*
-        * Shortcut the most recurring case: the user is in the dragging
-        * state and he is moving his finger.  We want to intercept this
-        * motion.
-        */
-        final int action = ev.getAction();
-        if ((action == MotionEvent.ACTION_MOVE) && (mIsBeingDragged)) {
-            return true;
-        }
-
-        switch (action & MotionEventCompat.ACTION_MASK) {
-            case MotionEvent.ACTION_MOVE: {
-                /*
-                 * mIsBeingDragged == false, otherwise the shortcut would have caught it. Check
-                 * whether the user has moved far enough from his original down touch.
-                 */
-
-                /*
-                * Locally do absolute value. mLastMotionY is set to the y value
-                * of the down event.
-                */
-                final int activePointerId = mActivePointerId;
-                if (activePointerId == INVALID_POINTER) {
-                    // If we don't have a valid id, the touch down wasn't on content.
-                    break;
-                }
-
-                final int pointerIndex = MotionEventCompat.findPointerIndex(ev, activePointerId);
-                if (pointerIndex == -1) {
-                    Log.e(TAG, "Invalid pointerId=" + activePointerId
-                            + " in onInterceptTouchEvent");
-                    break;
-                }
-
-                final int y = (int) MotionEventCompat.getY(ev, pointerIndex);
-                final int yDiff = Math.abs(y - mLastMotionY);
-                if (yDiff > mTouchSlop
-                        && (getNestedScrollAxes() & ViewCompat.SCROLL_AXIS_VERTICAL) == 0) {
-                    mIsBeingDragged = true;
-                    mLastMotionY = y;
-                    initVelocityTrackerIfNotExists();
-                    mVelocityTracker.addMovement(ev);
-                    mNestedYOffset = 0;
-                    final ViewParent parent = getParent();
-                    if (parent != null) {
-                        parent.requestDisallowInterceptTouchEvent(true);
-                    }
-                }
-                break;
-            }
-
-            case MotionEvent.ACTION_DOWN: {
-                final int y = (int) ev.getY();
-                if (!inChild((int) ev.getX(), (int) y)) {
-                    mIsBeingDragged = false;
-                    recycleVelocityTracker();
-                    break;
-                }
-
-                /*
-                 * Remember location of down touch.
-                 * ACTION_DOWN always refers to pointer index 0.
-                 */
-                mLastMotionY = y;
-                mActivePointerId = MotionEventCompat.getPointerId(ev, 0);
-
-                initOrResetVelocityTracker();
-                mVelocityTracker.addMovement(ev);
-                /*
-                 * If being flinged and user touches the screen, initiate drag;
-                 * otherwise don't. mScroller.isFinished should be false when
-                 * being flinged. We need to call computeScrollOffset() first so that
-                 * isFinished() is correct.
-                */
-                mScroller.computeScrollOffset();
-                mIsBeingDragged = !mScroller.isFinished();
-                startNestedScroll(ViewCompat.SCROLL_AXIS_VERTICAL);
-                break;
-            }
-
-            case MotionEvent.ACTION_CANCEL:
-            case MotionEvent.ACTION_UP:
-                /* Release the drag */
-                mIsBeingDragged = false;
-                mActivePointerId = INVALID_POINTER;
-                recycleVelocityTracker();
-                if (mScroller.springBack(getScrollX(), getScrollY(), 0, 0, 0, getScrollRange())) {
-                    ViewCompat.postInvalidateOnAnimation(this);
-                }
-                stopNestedScroll();
-                break;
-            case MotionEventCompat.ACTION_POINTER_UP:
-                onSecondaryPointerUp(ev);
-                break;
-        }
-
-        /*
-        * The only time we want to intercept motion events is if we are in the
-        * drag mode.
-        */
-        return mIsBeingDragged;
-    }
-
-    @Override
-    public boolean onTouchEvent(MotionEvent ev) {
-        initVelocityTrackerIfNotExists();
-
-        MotionEvent vtev = MotionEvent.obtain(ev);
-
-        final int actionMasked = MotionEventCompat.getActionMasked(ev);
-
-        if (actionMasked == MotionEvent.ACTION_DOWN) {
-            mNestedYOffset = 0;
-        }
-        vtev.offsetLocation(0, mNestedYOffset);
-
-        switch (actionMasked) {
-            case MotionEvent.ACTION_DOWN: {
-                if (getChildCount() == 0) {
-                    return false;
-                }
-                if ((mIsBeingDragged = !mScroller.isFinished())) {
-                    final ViewParent parent = getParent();
-                    if (parent != null) {
-                        parent.requestDisallowInterceptTouchEvent(true);
-                    }
-                }
-
-                /*
-                 * If being flinged and user touches, stop the fling. isFinished
-                 * will be false if being flinged.
-                 */
-                if (!mScroller.isFinished()) {
-                    mScroller.abortAnimation();
-                }
-
-                // Remember where the motion event started
-                mLastMotionY = (int) ev.getY();
-                mActivePointerId = MotionEventCompat.getPointerId(ev, 0);
-                startNestedScroll(ViewCompat.SCROLL_AXIS_VERTICAL);
-                break;
-            }
-            case MotionEvent.ACTION_MOVE:
-                final int activePointerIndex = MotionEventCompat.findPointerIndex(ev,
-                        mActivePointerId);
-                if (activePointerIndex == -1) {
-                    Log.e(TAG, "Invalid pointerId=" + mActivePointerId + " in onTouchEvent");
-                    break;
-                }
-
-                final int y = (int) MotionEventCompat.getY(ev, activePointerIndex);
-                int deltaY = mLastMotionY - y;
-                if (dispatchNestedPreScroll(0, deltaY, mScrollConsumed, mScrollOffset)) {
-                    deltaY -= mScrollConsumed[1];
-                    vtev.offsetLocation(0, mScrollOffset[1]);
-                    mNestedYOffset += mScrollOffset[1];
-                }
-                if (!mIsBeingDragged && Math.abs(deltaY) > mTouchSlop) {
-                    final ViewParent parent = getParent();
-                    if (parent != null) {
-                        parent.requestDisallowInterceptTouchEvent(true);
-                    }
-                    mIsBeingDragged = true;
-                    if (deltaY > 0) {
-                        deltaY -= mTouchSlop;
-                    } else {
-                        deltaY += mTouchSlop;
-                    }
-                }
-                if (mIsBeingDragged) {
-                    // Scroll to follow the motion event
-                    mLastMotionY = y - mScrollOffset[1];
-
-                    final int oldY = getScrollY();
-                    final int range = getScrollRange();
-                    final int overscrollMode = ViewCompat.getOverScrollMode(this);
-                    boolean canOverscroll = overscrollMode == ViewCompat.OVER_SCROLL_ALWAYS ||
-                            (overscrollMode == ViewCompat.OVER_SCROLL_IF_CONTENT_SCROLLS &&
-                                    range > 0);
-
-                    // Calling overScrollByCompat will call onOverScrolled, which
-                    // calls onScrollChanged if applicable.
-                    if (overScrollByCompat(0, deltaY, 0, getScrollY(), 0, range, 0,
-                            0, true) && !hasNestedScrollingParent()) {
-                        // Break our velocity if we hit a scroll barrier.
-                        mVelocityTracker.clear();
-                    }
-
-                    final int scrolledDeltaY = getScrollY() - oldY;
-                    final int unconsumedY = deltaY - scrolledDeltaY;
-                    if (dispatchNestedScroll(0, scrolledDeltaY, 0, unconsumedY, mScrollOffset)) {
-                        mLastMotionY -= mScrollOffset[1];
-                        vtev.offsetLocation(0, mScrollOffset[1]);
-                        mNestedYOffset += mScrollOffset[1];
-                    } else if (canOverscroll) {
-                        ensureGlows();
-                        final int pulledToY = oldY + deltaY;
-                        if (pulledToY < 0) {
-                            mEdgeGlowTop.onPull((float) deltaY / getHeight(),
-                                    MotionEventCompat.getX(ev, activePointerIndex) / getWidth());
-                            if (!mEdgeGlowBottom.isFinished()) {
-                                mEdgeGlowBottom.onRelease();
-                            }
-                        } else if (pulledToY > range) {
-                            mEdgeGlowBottom.onPull((float) deltaY / getHeight(),
-                                    1.f - MotionEventCompat.getX(ev, activePointerIndex)
-                                            / getWidth());
-                            if (!mEdgeGlowTop.isFinished()) {
-                                mEdgeGlowTop.onRelease();
-                            }
-                        }
-                        if (mEdgeGlowTop != null
-                                && (!mEdgeGlowTop.isFinished() || !mEdgeGlowBottom.isFinished())) {
-                            ViewCompat.postInvalidateOnAnimation(this);
-                        }
-                    }
-                }
-                break;
-            case MotionEvent.ACTION_UP:
-                if (mIsBeingDragged) {
-                    final VelocityTracker velocityTracker = mVelocityTracker;
-                    velocityTracker.computeCurrentVelocity(1000, mMaximumVelocity);
-                    int initialVelocity = (int) VelocityTrackerCompat.getYVelocity(velocityTracker,
-                            mActivePointerId);
-
-                    if ((Math.abs(initialVelocity) > mMinimumVelocity)) {
-                        flingWithNestedDispatch(-initialVelocity);
-                    } else if (mScroller.springBack(getScrollX(), getScrollY(), 0, 0, 0,
-                            getScrollRange())) {
-                        ViewCompat.postInvalidateOnAnimation(this);
-                    }
-                }
-                mActivePointerId = INVALID_POINTER;
-                endDrag();
-                break;
-            case MotionEvent.ACTION_CANCEL:
-                if (mIsBeingDragged && getChildCount() > 0) {
-                    if (mScroller.springBack(getScrollX(), getScrollY(), 0, 0, 0,
-                            getScrollRange())) {
-                        ViewCompat.postInvalidateOnAnimation(this);
-                    }
-                }
-                mActivePointerId = INVALID_POINTER;
-                endDrag();
-                break;
-            case MotionEventCompat.ACTION_POINTER_DOWN: {
-                final int index = MotionEventCompat.getActionIndex(ev);
-                mLastMotionY = (int) MotionEventCompat.getY(ev, index);
-                mActivePointerId = MotionEventCompat.getPointerId(ev, index);
-                break;
-            }
-            case MotionEventCompat.ACTION_POINTER_UP:
-                onSecondaryPointerUp(ev);
-                mLastMotionY = (int) MotionEventCompat.getY(ev,
-                        MotionEventCompat.findPointerIndex(ev, mActivePointerId));
-                break;
-        }
-
-        if (mVelocityTracker != null) {
-            mVelocityTracker.addMovement(vtev);
-        }
-        vtev.recycle();
-        return true;
-    }
-
-    private void onSecondaryPointerUp(MotionEvent ev) {
-        final int pointerIndex = (ev.getAction() & MotionEventCompat.ACTION_POINTER_INDEX_MASK) >>
-                MotionEventCompat.ACTION_POINTER_INDEX_SHIFT;
-        final int pointerId = MotionEventCompat.getPointerId(ev, pointerIndex);
-        if (pointerId == mActivePointerId) {
-            // This was our active pointer going up. Choose a new
-            // active pointer and adjust accordingly.
-            // TODO: Make this decision more intelligent.
-            final int newPointerIndex = pointerIndex == 0 ? 1 : 0;
-            mLastMotionY = (int) MotionEventCompat.getY(ev, newPointerIndex);
-            mActivePointerId = MotionEventCompat.getPointerId(ev, newPointerIndex);
-            if (mVelocityTracker != null) {
-                mVelocityTracker.clear();
-            }
-        }
-    }
-
-    public boolean onGenericMotionEvent(MotionEvent event) {
-        if ((MotionEventCompat.getSource(event) & InputDeviceCompat.SOURCE_CLASS_POINTER) != 0) {
-            switch (event.getAction()) {
-                case MotionEventCompat.ACTION_SCROLL: {
-                    if (!mIsBeingDragged) {
-                        final float vscroll = MotionEventCompat.getAxisValue(event,
-                                MotionEventCompat.AXIS_VSCROLL);
-                        if (vscroll != 0) {
-                            final int delta = (int) (vscroll * getVerticalScrollFactorCompat());
-                            final int range = getScrollRange();
-                            int oldScrollY = getScrollY();
-                            int newScrollY = oldScrollY - delta;
-                            if (newScrollY < 0) {
-                                newScrollY = 0;
-                            } else if (newScrollY > range) {
-                                newScrollY = range;
-                            }
-                            if (newScrollY != oldScrollY) {
-                                super.scrollTo(getScrollX(), newScrollY);
-                                return true;
-                            }
-                        }
-                    }
-                }
-            }
-        }
-        return false;
-    }
-
-    private float getVerticalScrollFactorCompat() {
-        if (mVerticalScrollFactor == 0) {
-            TypedValue outValue = new TypedValue();
-            final Context context = getContext();
-            if (!context.getTheme().resolveAttribute(
-                    android.R.attr.listPreferredItemHeight, outValue, true)) {
-                throw new IllegalStateException(
-                        "Expected theme to define listPreferredItemHeight.");
-            }
-            mVerticalScrollFactor = outValue.getDimension(
-                    context.getResources().getDisplayMetrics());
-        }
-        return mVerticalScrollFactor;
-    }
-
-    protected void onOverScrolled(int scrollX, int scrollY,
-            boolean clampedX, boolean clampedY) {
-        super.scrollTo(scrollX, scrollY);
-    }
-
-    boolean overScrollByCompat(int deltaX, int deltaY,
-            int scrollX, int scrollY,
-            int scrollRangeX, int scrollRangeY,
-            int maxOverScrollX, int maxOverScrollY,
-            boolean isTouchEvent) {
-        final int overScrollMode = ViewCompat.getOverScrollMode(this);
-        final boolean canScrollHorizontal =
-                computeHorizontalScrollRange() > computeHorizontalScrollExtent();
-        final boolean canScrollVertical =
-                computeVerticalScrollRange() > computeVerticalScrollExtent();
-        final boolean overScrollHorizontal = overScrollMode == ViewCompat.OVER_SCROLL_ALWAYS ||
-                (overScrollMode == ViewCompat.OVER_SCROLL_IF_CONTENT_SCROLLS && canScrollHorizontal);
-        final boolean overScrollVertical = overScrollMode == ViewCompat.OVER_SCROLL_ALWAYS ||
-                (overScrollMode == ViewCompat.OVER_SCROLL_IF_CONTENT_SCROLLS && canScrollVertical);
-
-        int newScrollX = scrollX + deltaX;
-        if (!overScrollHorizontal) {
-            maxOverScrollX = 0;
-        }
-
-        int newScrollY = scrollY + deltaY;
-        if (!overScrollVertical) {
-            maxOverScrollY = 0;
-        }
-
-        // Clamp values if at the limits and record
-        final int left = -maxOverScrollX;
-        final int right = maxOverScrollX + scrollRangeX;
-        final int top = -maxOverScrollY;
-        final int bottom = maxOverScrollY + scrollRangeY;
-
-        boolean clampedX = false;
-        if (newScrollX > right) {
-            newScrollX = right;
-            clampedX = true;
-        } else if (newScrollX < left) {
-            newScrollX = left;
-            clampedX = true;
-        }
-
-        boolean clampedY = false;
-        if (newScrollY > bottom) {
-            newScrollY = bottom;
-            clampedY = true;
-        } else if (newScrollY < top) {
-            newScrollY = top;
-            clampedY = true;
-        }
-
-        if (clampedY) {
-            mScroller.springBack(newScrollX, newScrollY, 0, 0, 0, getScrollRange());
-        }
-
-        onOverScrolled(newScrollX, newScrollY, clampedX, clampedY);
-
-        return clampedX || clampedY;
-    }
-
-    private int getScrollRange() {
-        int scrollRange = 0;
-        if (getChildCount() > 0) {
-            View child = getChildAt(0);
-            scrollRange = Math.max(0,
-                    child.getHeight() - (getHeight() - getPaddingBottom() - getPaddingTop()));
-        }
-        return scrollRange;
-    }
-
-    /**
-     * <p>
-     * Finds the next focusable component that fits in the specified bounds.
-     * </p>
-     *
-     * @param topFocus look for a candidate is the one at the top of the bounds
-     *                 if topFocus is true, or at the bottom of the bounds if topFocus is
-     *                 false
-     * @param top      the top offset of the bounds in which a focusable must be
-     *                 found
-     * @param bottom   the bottom offset of the bounds in which a focusable must
-     *                 be found
-     * @return the next focusable component in the bounds or null if none can
-     *         be found
-     */
-    private View findFocusableViewInBounds(boolean topFocus, int top, int bottom) {
-
-        List<View> focusables = getFocusables(View.FOCUS_FORWARD);
-        View focusCandidate = null;
-
-        /*
-         * A fully contained focusable is one where its top is below the bound's
-         * top, and its bottom is above the bound's bottom. A partially
-         * contained focusable is one where some part of it is within the
-         * bounds, but it also has some part that is not within bounds.  A fully contained
-         * focusable is preferred to a partially contained focusable.
-         */
-        boolean foundFullyContainedFocusable = false;
-
-        int count = focusables.size();
-        for (int i = 0; i < count; i++) {
-            View view = focusables.get(i);
-            int viewTop = view.getTop();
-            int viewBottom = view.getBottom();
-
-            if (top < viewBottom && viewTop < bottom) {
-                /*
-                 * the focusable is in the target area, it is a candidate for
-                 * focusing
-                 */
-
-                final boolean viewIsFullyContained = (top < viewTop) &&
-                        (viewBottom < bottom);
-
-                if (focusCandidate == null) {
-                    /* No candidate, take this one */
-                    focusCandidate = view;
-                    foundFullyContainedFocusable = viewIsFullyContained;
-                } else {
-                    final boolean viewIsCloserToBoundary =
-                            (topFocus && viewTop < focusCandidate.getTop()) ||
-                                    (!topFocus && viewBottom > focusCandidate
-                                            .getBottom());
-
-                    if (foundFullyContainedFocusable) {
-                        if (viewIsFullyContained && viewIsCloserToBoundary) {
-                            /*
-                             * We're dealing with only fully contained views, so
-                             * it has to be closer to the boundary to beat our
-                             * candidate
-                             */
-                            focusCandidate = view;
-                        }
-                    } else {
-                        if (viewIsFullyContained) {
-                            /* Any fully contained view beats a partially contained view */
-                            focusCandidate = view;
-                            foundFullyContainedFocusable = true;
-                        } else if (viewIsCloserToBoundary) {
-                            /*
-                             * Partially contained view beats another partially
-                             * contained view if it's closer
-                             */
-                            focusCandidate = view;
-                        }
-                    }
-                }
-            }
-        }
-
-        return focusCandidate;
-    }
-
-    /**
-     * <p>Handles scrolling in response to a "page up/down" shortcut press. This
-     * method will scroll the view by one page up or down and give the focus
-     * to the topmost/bottommost component in the new visible area. If no
-     * component is a good candidate for focus, this scrollview reclaims the
-     * focus.</p>
-     *
-     * @param direction the scroll direction: {@link android.view.View#FOCUS_UP}
-     *                  to go one page up or
-     *                  {@link android.view.View#FOCUS_DOWN} to go one page down
-     * @return true if the key event is consumed by this method, false otherwise
-     */
-    public boolean pageScroll(int direction) {
-        boolean down = direction == View.FOCUS_DOWN;
-        int height = getHeight();
-
-        if (down) {
-            mTempRect.top = getScrollY() + height;
-            int count = getChildCount();
-            if (count > 0) {
-                View view = getChildAt(count - 1);
-                if (mTempRect.top + height > view.getBottom()) {
-                    mTempRect.top = view.getBottom() - height;
-                }
-            }
-        } else {
-            mTempRect.top = getScrollY() - height;
-            if (mTempRect.top < 0) {
-                mTempRect.top = 0;
-            }
-        }
-        mTempRect.bottom = mTempRect.top + height;
-
-        return scrollAndFocus(direction, mTempRect.top, mTempRect.bottom);
-    }
-
-    /**
-     * <p>Handles scrolling in response to a "home/end" shortcut press. This
-     * method will scroll the view to the top or bottom and give the focus
-     * to the topmost/bottommost component in the new visible area. If no
-     * component is a good candidate for focus, this scrollview reclaims the
-     * focus.</p>
-     *
-     * @param direction the scroll direction: {@link android.view.View#FOCUS_UP}
-     *                  to go the top of the view or
-     *                  {@link android.view.View#FOCUS_DOWN} to go the bottom
-     * @return true if the key event is consumed by this method, false otherwise
-     */
-    public boolean fullScroll(int direction) {
-        boolean down = direction == View.FOCUS_DOWN;
-        int height = getHeight();
-
-        mTempRect.top = 0;
-        mTempRect.bottom = height;
-
-        if (down) {
-            int count = getChildCount();
-            if (count > 0) {
-                View view = getChildAt(count - 1);
-                mTempRect.bottom = view.getBottom() + getPaddingBottom();
-                mTempRect.top = mTempRect.bottom - height;
-            }
-        }
-
-        return scrollAndFocus(direction, mTempRect.top, mTempRect.bottom);
-    }
-
-    /**
-     * <p>Scrolls the view to make the area defined by <code>top</code> and
-     * <code>bottom</code> visible. This method attempts to give the focus
-     * to a component visible in this area. If no component can be focused in
-     * the new visible area, the focus is reclaimed by this ScrollView.</p>
-     *
-     * @param direction the scroll direction: {@link android.view.View#FOCUS_UP}
-     *                  to go upward, {@link android.view.View#FOCUS_DOWN} to downward
-     * @param top       the top offset of the new area to be made visible
-     * @param bottom    the bottom offset of the new area to be made visible
-     * @return true if the key event is consumed by this method, false otherwise
-     */
-    private boolean scrollAndFocus(int direction, int top, int bottom) {
-        boolean handled = true;
-
-        int height = getHeight();
-        int containerTop = getScrollY();
-        int containerBottom = containerTop + height;
-        boolean up = direction == View.FOCUS_UP;
-
-        View newFocused = findFocusableViewInBounds(up, top, bottom);
-        if (newFocused == null) {
-            newFocused = this;
-        }
-
-        if (top >= containerTop && bottom <= containerBottom) {
-            handled = false;
-        } else {
-            int delta = up ? (top - containerTop) : (bottom - containerBottom);
-            doScrollY(delta);
-        }
-
-        if (newFocused != findFocus()) newFocused.requestFocus(direction);
-
-        return handled;
-    }
-
-    /**
-     * Handle scrolling in response to an up or down arrow click.
-     *
-     * @param direction The direction corresponding to the arrow key that was
-     *                  pressed
-     * @return True if we consumed the event, false otherwise
-     */
-    public boolean arrowScroll(int direction) {
-
-        View currentFocused = findFocus();
-        if (currentFocused == this) currentFocused = null;
-
-        View nextFocused = FocusFinder.getInstance().findNextFocus(this, currentFocused, direction);
-
-        final int maxJump = getMaxScrollAmount();
-
-        if (nextFocused != null && isWithinDeltaOfScreen(nextFocused, maxJump, getHeight())) {
-            nextFocused.getDrawingRect(mTempRect);
-            offsetDescendantRectToMyCoords(nextFocused, mTempRect);
-            int scrollDelta = computeScrollDeltaToGetChildRectOnScreen(mTempRect);
-            doScrollY(scrollDelta);
-            nextFocused.requestFocus(direction);
-        } else {
-            // no new focus
-            int scrollDelta = maxJump;
-
-            if (direction == View.FOCUS_UP && getScrollY() < scrollDelta) {
-                scrollDelta = getScrollY();
-            } else if (direction == View.FOCUS_DOWN) {
-                if (getChildCount() > 0) {
-                    int daBottom = getChildAt(0).getBottom();
-                    int screenBottom = getScrollY() + getHeight() - getPaddingBottom();
-                    if (daBottom - screenBottom < maxJump) {
-                        scrollDelta = daBottom - screenBottom;
-                    }
-                }
-            }
-            if (scrollDelta == 0) {
-                return false;
-            }
-            doScrollY(direction == View.FOCUS_DOWN ? scrollDelta : -scrollDelta);
-        }
-
-        if (currentFocused != null && currentFocused.isFocused()
-                && isOffScreen(currentFocused)) {
-            // previously focused item still has focus and is off screen, give
-            // it up (take it back to ourselves)
-            // (also, need to temporarily force FOCUS_BEFORE_DESCENDANTS so we are
-            // sure to
-            // get it)
-            final int descendantFocusability = getDescendantFocusability();  // save
-            setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS);
-            requestFocus();
-            setDescendantFocusability(descendantFocusability);  // restore
-        }
-        return true;
-    }
-
-    /**
-     * @return whether the descendant of this scroll view is scrolled off
-     *  screen.
-     */
-    private boolean isOffScreen(View descendant) {
-        return !isWithinDeltaOfScreen(descendant, 0, getHeight());
-    }
-
-    /**
-     * @return whether the descendant of this scroll view is within delta
-     *  pixels of being on the screen.
-     */
-    private boolean isWithinDeltaOfScreen(View descendant, int delta, int height) {
-        descendant.getDrawingRect(mTempRect);
-        offsetDescendantRectToMyCoords(descendant, mTempRect);
-
-        return (mTempRect.bottom + delta) >= getScrollY()
-                && (mTempRect.top - delta) <= (getScrollY() + height);
-    }
-
-    /**
-     * Smooth scroll by a Y delta
-     *
-     * @param delta the number of pixels to scroll by on the Y axis
-     */
-    private void doScrollY(int delta) {
-        if (delta != 0) {
-            if (mSmoothScrollingEnabled) {
-                smoothScrollBy(0, delta);
-            } else {
-                scrollBy(0, delta);
-            }
-        }
-    }
-
-    /**
-     * Like {@link View#scrollBy}, but scroll smoothly instead of immediately.
-     *
-     * @param dx the number of pixels to scroll by on the X axis
-     * @param dy the number of pixels to scroll by on the Y axis
-     */
-    public final void smoothScrollBy(int dx, int dy) {
-        if (getChildCount() == 0) {
-            // Nothing to do.
-            return;
-        }
-        long duration = AnimationUtils.currentAnimationTimeMillis() - mLastScroll;
-        if (duration > ANIMATED_SCROLL_GAP) {
-            final int height = getHeight() - getPaddingBottom() - getPaddingTop();
-            final int bottom = getChildAt(0).getHeight();
-            final int maxY = Math.max(0, bottom - height);
-            final int scrollY = getScrollY();
-            dy = Math.max(0, Math.min(scrollY + dy, maxY)) - scrollY;
-
-            mScroller.startScroll(getScrollX(), scrollY, 0, dy);
-            ViewCompat.postInvalidateOnAnimation(this);
-        } else {
-            if (!mScroller.isFinished()) {
-                mScroller.abortAnimation();
-            }
-            scrollBy(dx, dy);
-        }
-        mLastScroll = AnimationUtils.currentAnimationTimeMillis();
-    }
-
-    /**
-     * Like {@link #scrollTo}, but scroll smoothly instead of immediately.
-     *
-     * @param x the position where to scroll on the X axis
-     * @param y the position where to scroll on the Y axis
-     */
-    public final void smoothScrollTo(int x, int y) {
-        smoothScrollBy(x - getScrollX(), y - getScrollY());
-    }
-
-    /**
-     * <p>The scroll range of a scroll view is the overall height of all of its
-     * children.</p>
-     * @hide
-     */
-    @Override
-    public int computeVerticalScrollRange() {
-        final int count = getChildCount();
-        final int contentHeight = getHeight() - getPaddingBottom() - getPaddingTop();
-        if (count == 0) {
-            return contentHeight;
-        }
-
-        int scrollRange = getChildAt(0).getBottom();
-        final int scrollY = getScrollY();
-        final int overscrollBottom = Math.max(0, scrollRange - contentHeight);
-        if (scrollY < 0) {
-            scrollRange -= scrollY;
-        } else if (scrollY > overscrollBottom) {
-            scrollRange += scrollY - overscrollBottom;
-        }
-
-        return scrollRange;
-    }
-
-    /** @hide */
-    @Override
-    public int computeVerticalScrollOffset() {
-        return Math.max(0, super.computeVerticalScrollOffset());
-    }
-
-    /** @hide */
-    @Override
-    public int computeVerticalScrollExtent() {
-        return super.computeVerticalScrollExtent();
-    }
-
-    /** @hide */
-    @Override
-    public int computeHorizontalScrollRange() {
-        return super.computeHorizontalScrollRange();
-    }
-
-    /** @hide */
-    @Override
-    public int computeHorizontalScrollOffset() {
-        return super.computeHorizontalScrollOffset();
-    }
-
-    /** @hide */
-    @Override
-    public int computeHorizontalScrollExtent() {
-        return super.computeHorizontalScrollExtent();
-    }
-
-    @Override
-    protected void measureChild(View child, int parentWidthMeasureSpec, int parentHeightMeasureSpec) {
-        ViewGroup.LayoutParams lp = child.getLayoutParams();
-
-        int childWidthMeasureSpec;
-        int childHeightMeasureSpec;
-
-        childWidthMeasureSpec = getChildMeasureSpec(parentWidthMeasureSpec, getPaddingLeft()
-                + getPaddingRight(), lp.width);
-
-        childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
-
-        child.measure(childWidthMeasureSpec, childHeightMeasureSpec);
-    }
-
-    @Override
-    protected void measureChildWithMargins(View child, int parentWidthMeasureSpec, int widthUsed,
-            int parentHeightMeasureSpec, int heightUsed) {
-        final MarginLayoutParams lp = (MarginLayoutParams) child.getLayoutParams();
-
-        final int childWidthMeasureSpec = getChildMeasureSpec(parentWidthMeasureSpec,
-                getPaddingLeft() + getPaddingRight() + lp.leftMargin + lp.rightMargin
-                        + widthUsed, lp.width);
-        final int childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(
-                lp.topMargin + lp.bottomMargin, MeasureSpec.UNSPECIFIED);
-
-        child.measure(childWidthMeasureSpec, childHeightMeasureSpec);
-    }
-
-    @Override
-    public void computeScroll() {
-        if (mScroller.computeScrollOffset()) {
-            int oldX = getScrollX();
-            int oldY = getScrollY();
-            int x = mScroller.getCurrX();
-            int y = mScroller.getCurrY();
-
-            if (oldX != x || oldY != y) {
-                final int range = getScrollRange();
-                final int overscrollMode = ViewCompat.getOverScrollMode(this);
-                final boolean canOverscroll = overscrollMode == ViewCompat.OVER_SCROLL_ALWAYS ||
-                        (overscrollMode == ViewCompat.OVER_SCROLL_IF_CONTENT_SCROLLS && range > 0);
-
-                overScrollByCompat(x - oldX, y - oldY, oldX, oldY, 0, range,
-                        0, 0, false);
-
-                if (canOverscroll) {
-                    ensureGlows();
-                    if (y <= 0 && oldY > 0) {
-                        mEdgeGlowTop.onAbsorb((int) mScroller.getCurrVelocity());
-                    } else if (y >= range && oldY < range) {
-                        mEdgeGlowBottom.onAbsorb((int) mScroller.getCurrVelocity());
-                    }
-                }
-            }
-        }
-    }
-
-    /**
-     * Scrolls the view to the given child.
-     *
-     * @param child the View to scroll to
-     */
-    private void scrollToChild(View child) {
-        child.getDrawingRect(mTempRect);
-
-        /* Offset from child's local coordinates to ScrollView coordinates */
-        offsetDescendantRectToMyCoords(child, mTempRect);
-
-        int scrollDelta = computeScrollDeltaToGetChildRectOnScreen(mTempRect);
-
-        if (scrollDelta != 0) {
-            scrollBy(0, scrollDelta);
-        }
-    }
-
-    /**
-     * If rect is off screen, scroll just enough to get it (or at least the
-     * first screen size chunk of it) on screen.
-     *
-     * @param rect      The rectangle.
-     * @param immediate True to scroll immediately without animation
-     * @return true if scrolling was performed
-     */
-    private boolean scrollToChildRect(Rect rect, boolean immediate) {
-        final int delta = computeScrollDeltaToGetChildRectOnScreen(rect);
-        final boolean scroll = delta != 0;
-        if (scroll) {
-            if (immediate) {
-                scrollBy(0, delta);
-            } else {
-                smoothScrollBy(0, delta);
-            }
-        }
-        return scroll;
-    }
-
-    /**
-     * Compute the amount to scroll in the Y direction in order to get
-     * a rectangle completely on the screen (or, if taller than the screen,
-     * at least the first screen size chunk of it).
-     *
-     * @param rect The rect.
-     * @return The scroll delta.
-     */
-    protected int computeScrollDeltaToGetChildRectOnScreen(Rect rect) {
-        if (getChildCount() == 0) return 0;
-
-        int height = getHeight();
-        int screenTop = getScrollY();
-        int screenBottom = screenTop + height;
-
-        int fadingEdge = getVerticalFadingEdgeLength();
-
-        // leave room for top fading edge as long as rect isn't at very top
-        if (rect.top > 0) {
-            screenTop += fadingEdge;
-        }
-
-        // leave room for bottom fading edge as long as rect isn't at very bottom
-        if (rect.bottom < getChildAt(0).getHeight()) {
-            screenBottom -= fadingEdge;
-        }
-
-        int scrollYDelta = 0;
-
-        if (rect.bottom > screenBottom && rect.top > screenTop) {
-            // need to move down to get it in view: move down just enough so
-            // that the entire rectangle is in view (or at least the first
-            // screen size chunk).
-
-            if (rect.height() > height) {
-                // just enough to get screen size chunk on
-                scrollYDelta += (rect.top - screenTop);
-            } else {
-                // get entire rect at bottom of screen
-                scrollYDelta += (rect.bottom - screenBottom);
-            }
-
-            // make sure we aren't scrolling beyond the end of our content
-            int bottom = getChildAt(0).getBottom();
-            int distanceToBottom = bottom - screenBottom;
-            scrollYDelta = Math.min(scrollYDelta, distanceToBottom);
-
-        } else if (rect.top < screenTop && rect.bottom < screenBottom) {
-            // need to move up to get it in view: move up just enough so that
-            // entire rectangle is in view (or at least the first screen
-            // size chunk of it).
-
-            if (rect.height() > height) {
-                // screen size chunk
-                scrollYDelta -= (screenBottom - rect.bottom);
-            } else {
-                // entire rect at top
-                scrollYDelta -= (screenTop - rect.top);
-            }
-
-            // make sure we aren't scrolling any further than the top our content
-            scrollYDelta = Math.max(scrollYDelta, -getScrollY());
-        }
-        return scrollYDelta;
-    }
-
-    @Override
-    public void requestChildFocus(View child, View focused) {
-        if (!mIsLayoutDirty) {
-            scrollToChild(focused);
-        } else {
-            // The child may not be laid out yet, we can't compute the scroll yet
-            mChildToScrollTo = focused;
-        }
-        super.requestChildFocus(child, focused);
-    }
-
-
-    /**
-     * When looking for focus in children of a scroll view, need to be a little
-     * more careful not to give focus to something that is scrolled off screen.
-     *
-     * This is more expensive than the default {@link android.view.ViewGroup}
-     * implementation, otherwise this behavior might have been made the default.
-     */
-    @Override
-    protected boolean onRequestFocusInDescendants(int direction,
-            Rect previouslyFocusedRect) {
-
-        // convert from forward / backward notation to up / down / left / right
-        // (ugh).
-        if (direction == View.FOCUS_FORWARD) {
-            direction = View.FOCUS_DOWN;
-        } else if (direction == View.FOCUS_BACKWARD) {
-            direction = View.FOCUS_UP;
-        }
-
-        final View nextFocus = previouslyFocusedRect == null ?
-                FocusFinder.getInstance().findNextFocus(this, null, direction) :
-                FocusFinder.getInstance().findNextFocusFromRect(this,
-                        previouslyFocusedRect, direction);
-
-        if (nextFocus == null) {
-            return false;
-        }
-
-        if (isOffScreen(nextFocus)) {
-            return false;
-        }
-
-        return nextFocus.requestFocus(direction, previouslyFocusedRect);
-    }
-
-    @Override
-    public boolean requestChildRectangleOnScreen(View child, Rect rectangle,
-            boolean immediate) {
-        // offset into coordinate space of this scroll view
-        rectangle.offset(child.getLeft() - child.getScrollX(),
-                child.getTop() - child.getScrollY());
-
-        return scrollToChildRect(rectangle, immediate);
-    }
-
-    @Override
-    public void requestLayout() {
-        mIsLayoutDirty = true;
-        super.requestLayout();
-    }
-
-    @Override
-    protected void onLayout(boolean changed, int l, int t, int r, int b) {
-        super.onLayout(changed, l, t, r, b);
-        mIsLayoutDirty = false;
-        // Give a child focus if it needs it
-        if (mChildToScrollTo != null && isViewDescendantOf(mChildToScrollTo, this)) {
-            scrollToChild(mChildToScrollTo);
-        }
-        mChildToScrollTo = null;
-
-        if (!mIsLaidOut) {
-            if (mSavedState != null) {
-                scrollTo(getScrollX(), mSavedState.scrollPosition);
-                mSavedState = null;
-            } // mScrollY default value is "0"
-
-            final int childHeight = (getChildCount() > 0) ? getChildAt(0).getMeasuredHeight() : 0;
-            final int scrollRange = Math.max(0,
-                    childHeight - (b - t - getPaddingBottom() - getPaddingTop()));
-
-            // Don't forget to clamp
-            if (getScrollY() > scrollRange) {
-                scrollTo(getScrollX(), scrollRange);
-            } else if (getScrollY() < 0) {
-                scrollTo(getScrollX(), 0);
-            }
-        }
-
-        // Calling this with the present values causes it to re-claim them
-        scrollTo(getScrollX(), getScrollY());
-        mIsLaidOut = true;
-    }
-
-    @Override
-    public void onAttachedToWindow() {
-        super.onAttachedToWindow();
-
-        mIsLaidOut = false;
-    }
-
-    @Override
-    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
-        super.onSizeChanged(w, h, oldw, oldh);
-
-        View currentFocused = findFocus();
-        if (null == currentFocused || this == currentFocused)
-            return;
-
-        // If the currently-focused view was visible on the screen when the
-        // screen was at the old height, then scroll the screen to make that
-        // view visible with the new screen height.
-        if (isWithinDeltaOfScreen(currentFocused, 0, oldh)) {
-            currentFocused.getDrawingRect(mTempRect);
-            offsetDescendantRectToMyCoords(currentFocused, mTempRect);
-            int scrollDelta = computeScrollDeltaToGetChildRectOnScreen(mTempRect);
-            doScrollY(scrollDelta);
-        }
-    }
-
-    /**
-     * Return true if child is a descendant of parent, (or equal to the parent).
-     */
-    private static boolean isViewDescendantOf(View child, View parent) {
-        if (child == parent) {
-            return true;
-        }
-
-        final ViewParent theParent = child.getParent();
-        return (theParent instanceof ViewGroup) && isViewDescendantOf((View) theParent, parent);
-    }
-
-    /**
-     * Fling the scroll view
-     *
-     * @param velocityY The initial velocity in the Y direction. Positive
-     *                  numbers mean that the finger/cursor is moving down the screen,
-     *                  which means we want to scroll towards the top.
-     */
-    public void fling(int velocityY) {
-        if (getChildCount() > 0) {
-            int height = getHeight() - getPaddingBottom() - getPaddingTop();
-            int bottom = getChildAt(0).getHeight();
-
-            mScroller.fling(getScrollX(), getScrollY(), 0, velocityY, 0, 0, 0,
-                    Math.max(0, bottom - height), 0, height/2);
-
-            ViewCompat.postInvalidateOnAnimation(this);
-        }
-    }
-
-    private void flingWithNestedDispatch(int velocityY) {
-        final int scrollY = getScrollY();
-        final boolean canFling = (scrollY > 0 || velocityY > 0) &&
-                (scrollY < getScrollRange() || velocityY < 0);
-        if (!dispatchNestedPreFling(0, velocityY)) {
-            dispatchNestedFling(0, velocityY, canFling);
-            if (canFling) {
-                fling(velocityY);
-            }
-        }
-    }
-
-    private void endDrag() {
-        mIsBeingDragged = false;
-
-        recycleVelocityTracker();
-        stopNestedScroll();
-
-        if (mEdgeGlowTop != null) {
-            mEdgeGlowTop.onRelease();
-            mEdgeGlowBottom.onRelease();
-        }
-    }
-
-    /**
-     * {@inheritDoc}
-     *
-     * <p>This version also clamps the scrolling to the bounds of our child.
-     */
-    @Override
-    public void scrollTo(int x, int y) {
-        // we rely on the fact the View.scrollBy calls scrollTo.
-        if (getChildCount() > 0) {
-            View child = getChildAt(0);
-            x = clamp(x, getWidth() - getPaddingRight() - getPaddingLeft(), child.getWidth());
-            y = clamp(y, getHeight() - getPaddingBottom() - getPaddingTop(), child.getHeight());
-            if (x != getScrollX() || y != getScrollY()) {
-                super.scrollTo(x, y);
-            }
-        }
-    }
-
-    private void ensureGlows() {
-        if (ViewCompat.getOverScrollMode(this) != ViewCompat.OVER_SCROLL_NEVER) {
-            if (mEdgeGlowTop == null) {
-                Context context = getContext();
-                mEdgeGlowTop = new EdgeEffectCompat(context);
-                mEdgeGlowBottom = new EdgeEffectCompat(context);
-            }
-        } else {
-            mEdgeGlowTop = null;
-            mEdgeGlowBottom = null;
-        }
-    }
-
-    @Override
-    public void draw(Canvas canvas) {
-        super.draw(canvas);
-        if (mEdgeGlowTop != null) {
-            final int scrollY = getScrollY();
-            if (!mEdgeGlowTop.isFinished()) {
-                final int restoreCount = canvas.save();
-                final int width = getWidth() - getPaddingLeft() - getPaddingRight();
-
-                canvas.translate(getPaddingLeft(), Math.min(0, scrollY));
-                mEdgeGlowTop.setSize(width, getHeight());
-                if (mEdgeGlowTop.draw(canvas)) {
-                    ViewCompat.postInvalidateOnAnimation(this);
-                }
-                canvas.restoreToCount(restoreCount);
-            }
-            if (!mEdgeGlowBottom.isFinished()) {
-                final int restoreCount = canvas.save();
-                final int width = getWidth() - getPaddingLeft() - getPaddingRight();
-                final int height = getHeight();
-
-                canvas.translate(-width + getPaddingLeft(),
-                        Math.max(getScrollRange(), scrollY) + height);
-                canvas.rotate(180, width, 0);
-                mEdgeGlowBottom.setSize(width, height);
-                if (mEdgeGlowBottom.draw(canvas)) {
-                    ViewCompat.postInvalidateOnAnimation(this);
-                }
-                canvas.restoreToCount(restoreCount);
-            }
-        }
-    }
-
-    private static int clamp(int n, int my, int child) {
-        if (my >= child || n < 0) {
-            /* my >= child is this case:
-             *                    |--------------- me ---------------|
-             *     |------ child ------|
-             * or
-             *     |--------------- me ---------------|
-             *            |------ child ------|
-             * or
-             *     |--------------- me ---------------|
-             *                                  |------ child ------|
-             *
-             * n < 0 is this case:
-             *     |------ me ------|
-             *                    |-------- child --------|
-             *     |-- mScrollX --|
-             */
-            return 0;
-        }
-        if ((my+n) > child) {
-            /* this case:
-             *                    |------ me ------|
-             *     |------ child ------|
-             *     |-- mScrollX --|
-             */
-            return child-my;
-        }
-        return n;
-    }
-
-    @Override
-    protected void onRestoreInstanceState(Parcelable state) {
-        if (!(state instanceof SavedState)) {
-            super.onRestoreInstanceState(state);
-            return;
-        }
-
-        SavedState ss = (SavedState) state;
-        super.onRestoreInstanceState(ss.getSuperState());
-        mSavedState = ss;
-        requestLayout();
-    }
-
-    @Override
-    protected Parcelable onSaveInstanceState() {
-        Parcelable superState = super.onSaveInstanceState();
-        SavedState ss = new SavedState(superState);
-        ss.scrollPosition = getScrollY();
-        return ss;
-    }
-
-    static class SavedState extends BaseSavedState {
-        public int scrollPosition;
-
-        SavedState(Parcelable superState) {
-            super(superState);
-        }
-
-        public SavedState(Parcel source) {
-            super(source);
-            scrollPosition = source.readInt();
-        }
-
-        @Override
-        public void writeToParcel(Parcel dest, int flags) {
-            super.writeToParcel(dest, flags);
-            dest.writeInt(scrollPosition);
-        }
-
-        @Override
-        public String toString() {
-            return "HorizontalScrollView.SavedState{"
-                    + Integer.toHexString(System.identityHashCode(this))
-                    + " scrollPosition=" + scrollPosition + "}";
-        }
-
-        public static final Parcelable.Creator<SavedState> CREATOR
-                = new Parcelable.Creator<SavedState>() {
-            public SavedState createFromParcel(Parcel in) {
-                return new SavedState(in);
-            }
-
-            public SavedState[] newArray(int size) {
-                return new SavedState[size];
-            }
-        };
-    }
-
-    static class AccessibilityDelegate extends AccessibilityDelegateCompat {
-        @Override
-        public boolean performAccessibilityAction(View host, int action, Bundle arguments) {
-            if (super.performAccessibilityAction(host, action, arguments)) {
-                return true;
-            }
-            final NestedScrollView nsvHost = (NestedScrollView) host;
-            if (!nsvHost.isEnabled()) {
-                return false;
-            }
-            switch (action) {
-                case AccessibilityNodeInfoCompat.ACTION_SCROLL_FORWARD: {
-                    final int viewportHeight = nsvHost.getHeight() - nsvHost.getPaddingBottom()
-                            - nsvHost.getPaddingTop();
-                    final int targetScrollY = Math.min(nsvHost.getScrollY() + viewportHeight,
-                            nsvHost.getScrollRange());
-                    if (targetScrollY != nsvHost.getScrollY()) {
-                        nsvHost.smoothScrollTo(0, targetScrollY);
-                        return true;
-                    }
-                }
-                return false;
-                case AccessibilityNodeInfoCompat.ACTION_SCROLL_BACKWARD: {
-                    final int viewportHeight = nsvHost.getHeight() - nsvHost.getPaddingBottom()
-                            - nsvHost.getPaddingTop();
-                    final int targetScrollY = Math.max(nsvHost.getScrollY() - viewportHeight, 0);
-                    if (targetScrollY != nsvHost.getScrollY()) {
-                        nsvHost.smoothScrollTo(0, targetScrollY);
-                        return true;
-                    }
-                }
-                return false;
-            }
-            return false;
-        }
-
-        @Override
-        public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfoCompat info) {
-            super.onInitializeAccessibilityNodeInfo(host, info);
-            final NestedScrollView nsvHost = (NestedScrollView) host;
-            info.setClassName(ScrollView.class.getName());
-            if (nsvHost.isEnabled()) {
-                final int scrollRange = nsvHost.getScrollRange();
-                if (scrollRange > 0) {
-                    info.setScrollable(true);
-                    if (nsvHost.getScrollY() > 0) {
-                        info.addAction(AccessibilityNodeInfoCompat.ACTION_SCROLL_BACKWARD);
-                    }
-                    if (nsvHost.getScrollY() < scrollRange) {
-                        info.addAction(AccessibilityNodeInfoCompat.ACTION_SCROLL_FORWARD);
-                    }
-                }
-            }
-        }
-
-        @Override
-        public void onInitializeAccessibilityEvent(View host, AccessibilityEvent event) {
-            super.onInitializeAccessibilityEvent(host, event);
-            final NestedScrollView nsvHost = (NestedScrollView) host;
-            event.setClassName(ScrollView.class.getName());
-            final AccessibilityRecordCompat record = AccessibilityEventCompat.asRecord(event);
-            final boolean scrollable = nsvHost.getScrollRange() > 0;
-            record.setScrollable(scrollable);
-            record.setScrollX(nsvHost.getScrollX());
-            record.setScrollY(nsvHost.getScrollY());
-            record.setMaxScrollX(nsvHost.getScrollX());
-            record.setMaxScrollY(nsvHost.getScrollRange());
-        }
-    }
-}
diff --git a/v4/java/android/support/v4/widget/PopupWindowCompat.java b/v4/java/android/support/v4/widget/PopupWindowCompat.java
deleted file mode 100644
index 68dbb02..0000000
--- a/v4/java/android/support/v4/widget/PopupWindowCompat.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.support.v4.widget;
-
-import android.support.v4.view.GravityCompat;
-import android.support.v4.view.ViewCompat;
-import android.view.Gravity;
-import android.view.View;
-import android.view.WindowManager;
-import android.widget.PopupWindow;
-
-/**
- * Helper for accessing features in PopupWindow introduced after API level 4
- * in a backwards compatible fashion.
- */
-public final class PopupWindowCompat {
-    /**
-     * Interface for the full API.
-     */
-    interface PopupWindowImpl {
-        void showAsDropDown(PopupWindow popup, View anchor, int xoff, int yoff, int gravity);
-        void setOverlapAnchor(PopupWindow popupWindow, boolean overlapAnchor);
-        boolean getOverlapAnchor(PopupWindow popupWindow);
-        void setWindowLayoutType(PopupWindow popupWindow, int layoutType);
-        int getWindowLayoutType(PopupWindow popupWindow);
-    }
-
-    /**
-     * Interface implementation that doesn't use anything above v4 APIs.
-     */
-    static class BasePopupWindowImpl implements PopupWindowImpl {
-        @Override
-        public void showAsDropDown(PopupWindow popup, View anchor, int xoff, int yoff,
-                int gravity) {
-            final int hgrav = GravityCompat.getAbsoluteGravity(gravity,
-                    ViewCompat.getLayoutDirection(anchor)) & Gravity.HORIZONTAL_GRAVITY_MASK;
-            if (hgrav == Gravity.RIGHT) {
-                // Flip the location to align the right sides of the popup and
-                // anchor instead of left.
-                xoff -= (popup.getWidth() - anchor.getWidth());
-            }
-            popup.showAsDropDown(anchor, xoff, yoff);
-        }
-
-        @Override
-        public void setOverlapAnchor(PopupWindow popupWindow, boolean overlapAnchor) {
-            // noop
-        }
-
-        @Override
-        public boolean getOverlapAnchor(PopupWindow popupWindow) {
-            return false;
-        }
-
-        @Override
-        public void setWindowLayoutType(PopupWindow popupWindow, int layoutType) {
-            // no-op
-        }
-
-        @Override
-        public int getWindowLayoutType(PopupWindow popupWindow) {
-            return 0;
-        }
-    }
-
-    /**
-     * Interface implementation that doesn't use anything above v4 APIs.
-     */
-    static class GingerbreadPopupWindowImpl extends BasePopupWindowImpl {
-        @Override
-        public void setWindowLayoutType(PopupWindow popupWindow, int layoutType) {
-            PopupWindowCompatGingerbread.setWindowLayoutType(popupWindow, layoutType);
-        }
-
-        @Override
-        public int getWindowLayoutType(PopupWindow popupWindow) {
-            return PopupWindowCompatGingerbread.getWindowLayoutType(popupWindow);
-        }
-    }
-
-    /**
-     * Interface implementation for devices with at least KitKat APIs.
-     */
-    static class KitKatPopupWindowImpl extends GingerbreadPopupWindowImpl {
-        @Override
-        public void showAsDropDown(PopupWindow popup, View anchor, int xoff, int yoff,
-                int gravity) {
-            PopupWindowCompatKitKat.showAsDropDown(popup, anchor, xoff, yoff, gravity);
-        }
-    }
-
-    static class Api21PopupWindowImpl extends KitKatPopupWindowImpl {
-        @Override
-        public void setOverlapAnchor(PopupWindow popupWindow, boolean overlapAnchor) {
-            PopupWindowCompatApi21.setOverlapAnchor(popupWindow, overlapAnchor);
-        }
-
-        @Override
-        public boolean getOverlapAnchor(PopupWindow popupWindow) {
-            return PopupWindowCompatApi21.getOverlapAnchor(popupWindow);
-        }
-    }
-
-    static class Api23PopupWindowImpl extends Api21PopupWindowImpl {
-        @Override
-        public void setOverlapAnchor(PopupWindow popupWindow, boolean overlapAnchor) {
-            PopupWindowCompatApi23.setOverlapAnchor(popupWindow, overlapAnchor);
-        }
-
-        @Override
-        public boolean getOverlapAnchor(PopupWindow popupWindow) {
-            return PopupWindowCompatApi23.getOverlapAnchor(popupWindow);
-        }
-
-        @Override
-        public void setWindowLayoutType(PopupWindow popupWindow, int layoutType) {
-            PopupWindowCompatApi23.setWindowLayoutType(popupWindow, layoutType);
-        }
-
-        @Override
-        public int getWindowLayoutType(PopupWindow popupWindow) {
-            return PopupWindowCompatApi23.getWindowLayoutType(popupWindow);
-        }
-    }
-
-    /**
-     * Select the correct implementation to use for the current platform.
-     */
-    static final PopupWindowImpl IMPL;
-    static {
-        final int version = android.os.Build.VERSION.SDK_INT;
-        if (version >= 23) {
-            IMPL = new Api23PopupWindowImpl();
-        } else if (version >= 21) {
-            IMPL = new Api21PopupWindowImpl();
-        } else if (version >= 19) {
-            IMPL = new KitKatPopupWindowImpl();
-        } else if (version >= 9) {
-            IMPL = new GingerbreadPopupWindowImpl();
-        } else {
-            IMPL = new BasePopupWindowImpl();
-        }
-    }
-
-    private PopupWindowCompat() {
-        // This class is not publicly instantiable.
-    }
-
-    /**
-     * <p>Display the content view in a popup window anchored to the bottom-left
-     * corner of the anchor view offset by the specified x and y coordinates.
-     * If there is not enough room on screen to show
-     * the popup in its entirety, this method tries to find a parent scroll
-     * view to scroll. If no parent scroll view can be scrolled, the bottom-left
-     * corner of the popup is pinned at the top left corner of the anchor view.</p>
-     * <p>If the view later scrolls to move <code>anchor</code> to a different
-     * location, the popup will be moved correspondingly.</p>
-     *
-     * @param popup the PopupWindow to show
-     * @param anchor the view on which to pin the popup window
-     * @param xoff A horizontal offset from the anchor in pixels
-     * @param yoff A vertical offset from the anchor in pixels
-     * @param gravity Alignment of the popup relative to the anchor
-     */
-    public static void showAsDropDown(PopupWindow popup, View anchor, int xoff, int yoff,
-            int gravity) {
-        IMPL.showAsDropDown(popup, anchor, xoff, yoff, gravity);
-    }
-
-    /**
-     * Sets whether the popup window should overlap its anchor view when
-     * displayed as a drop-down.
-     *
-     * @param overlapAnchor Whether the popup should overlap its anchor.
-     */
-    public static void setOverlapAnchor(PopupWindow popupWindow, boolean overlapAnchor) {
-        IMPL.setOverlapAnchor(popupWindow, overlapAnchor);
-    }
-
-    /**
-     * Returns whether the popup window should overlap its anchor view when
-     * displayed as a drop-down.
-     *
-     * @return Whether the popup should overlap its anchor.
-     */
-    public static boolean getOverlapAnchor(PopupWindow popupWindow) {
-        return IMPL.getOverlapAnchor(popupWindow);
-    }
-
-    /**
-     * Set the layout type for this window. This value will be passed through to
-     * {@link WindowManager.LayoutParams#type} therefore the value should match any value
-     * {@link WindowManager.LayoutParams#type} accepts.
-     *
-     * @param layoutType Layout type for this window.
-     *
-     * @see WindowManager.LayoutParams#type
-     */
-    public static void setWindowLayoutType(PopupWindow popupWindow, int layoutType) {
-        IMPL.setWindowLayoutType(popupWindow, layoutType);
-    }
-
-    /**
-     * Returns the layout type for this window.
-     *
-     * @see #setWindowLayoutType(PopupWindow popupWindow, int)
-     */
-    public static int getWindowLayoutType(PopupWindow popupWindow) {
-        return IMPL.getWindowLayoutType(popupWindow);
-    }
-}
diff --git a/v4/java/android/support/v4/widget/ScrollerCompat.java b/v4/java/android/support/v4/widget/ScrollerCompat.java
deleted file mode 100644
index 693346c..0000000
--- a/v4/java/android/support/v4/widget/ScrollerCompat.java
+++ /dev/null
@@ -1,510 +0,0 @@
-/*
- * Copyright (C) 2012 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 android.support.v4.widget;
-
-import android.content.Context;
-import android.os.Build;
-import android.view.animation.AnimationUtils;
-import android.view.animation.Interpolator;
-import android.widget.Scroller;
-
-/**
- * Provides access to new {@link android.widget.Scroller Scroller} APIs when available.
- *
- * <p>This class provides a platform version-independent mechanism for obeying the
- * current device's preferred scroll physics and fling behavior. It offers a subset of
- * the APIs from Scroller or OverScroller.</p>
- */
-public final class ScrollerCompat {
-    private static final String TAG = "ScrollerCompat";
-
-    Object mScroller;
-    ScrollerCompatImpl mImpl;
-
-    interface ScrollerCompatImpl {
-        Object createScroller(Context context, Interpolator interpolator);
-        boolean isFinished(Object scroller);
-        int getCurrX(Object scroller);
-        int getCurrY(Object scroller);
-        float getCurrVelocity(Object scroller);
-        boolean computeScrollOffset(Object scroller);
-        void startScroll(Object scroller, int startX, int startY, int dx, int dy);
-        void startScroll(Object scroller, int startX, int startY, int dx, int dy, int duration);
-        void fling(Object scroller, int startX, int startY, int velX, int velY,
-                int minX, int maxX, int minY, int maxY);
-        void fling(Object scroller, int startX, int startY, int velX, int velY,
-                int minX, int maxX, int minY, int maxY, int overX, int overY);
-        void abortAnimation(Object scroller);
-        void notifyHorizontalEdgeReached(Object scroller, int startX, int finalX, int overX);
-        void notifyVerticalEdgeReached(Object scroller, int startY, int finalY, int overY);
-        boolean isOverScrolled(Object scroller);
-        int getFinalX(Object scroller);
-        int getFinalY(Object scroller);
-        boolean springBack(Object scroller, int startX, int startY, int minX, int maxX,
-                int minY, int maxY);
-    }
-
-    static final int CHASE_FRAME_TIME = 16; // ms per target frame
-
-    static class ScrollerCompatImplBase implements ScrollerCompatImpl {
-        @Override
-        public Object createScroller(Context context, Interpolator interpolator) {
-            return interpolator != null ?
-                    new Scroller(context, interpolator) : new Scroller(context);
-        }
-
-        @Override
-        public boolean isFinished(Object scroller) {
-            return ((Scroller) scroller).isFinished();
-        }
-
-        @Override
-        public int getCurrX(Object scroller) {
-            return ((Scroller) scroller).getCurrX();
-        }
-
-        @Override
-        public int getCurrY(Object scroller) {
-            return ((Scroller) scroller).getCurrY();
-        }
-
-        @Override
-        public float getCurrVelocity(Object scroller) {
-            return 0;
-        }
-
-        @Override
-        public boolean computeScrollOffset(Object scroller) {
-            final Scroller s = (Scroller) scroller;
-            return s.computeScrollOffset();
-        }
-
-        @Override
-        public void startScroll(Object scroller, int startX, int startY, int dx, int dy) {
-            ((Scroller) scroller).startScroll(startX, startY, dx, dy);
-        }
-
-        @Override
-        public void startScroll(Object scroller, int startX, int startY, int dx, int dy,
-                int duration) {
-            ((Scroller) scroller).startScroll(startX, startY, dx, dy, duration);
-        }
-
-        @Override
-        public void fling(Object scroller, int startX, int startY, int velX, int velY,
-                int minX, int maxX, int minY, int maxY) {
-            ((Scroller) scroller).fling(startX, startY, velX, velY, minX, maxX, minY, maxY);
-        }
-
-        @Override
-        public void fling(Object scroller, int startX, int startY, int velX, int velY,
-                int minX, int maxX, int minY, int maxY, int overX, int overY) {
-            ((Scroller) scroller).fling(startX, startY, velX, velY, minX, maxX, minY, maxY);
-        }
-
-        @Override
-        public void abortAnimation(Object scroller) {
-            ((Scroller) scroller).abortAnimation();
-        }
-
-        @Override
-        public void notifyHorizontalEdgeReached(Object scroller, int startX, int finalX,
-                int overX) {
-            // No-op
-        }
-
-        @Override
-        public void notifyVerticalEdgeReached(Object scroller, int startY, int finalY, int overY) {
-            // No-op
-        }
-
-        @Override
-        public boolean isOverScrolled(Object scroller) {
-            // Always false
-            return false;
-        }
-
-        @Override
-        public int getFinalX(Object scroller) {
-            return ((Scroller) scroller).getFinalX();
-        }
-
-        @Override
-        public int getFinalY(Object scroller) {
-            return ((Scroller) scroller).getFinalY();
-        }
-
-        @Override
-        public boolean springBack(Object scroller, int startX, int startY, int minX, int maxX,
-                int minY, int maxY) {
-            return false;
-        }
-    }
-
-    static class ScrollerCompatImplGingerbread implements ScrollerCompatImpl {
-        @Override
-        public Object createScroller(Context context, Interpolator interpolator) {
-            return ScrollerCompatGingerbread.createScroller(context, interpolator);
-        }
-
-        @Override
-        public boolean isFinished(Object scroller) {
-            return ScrollerCompatGingerbread.isFinished(scroller);
-        }
-
-        @Override
-        public int getCurrX(Object scroller) {
-            return ScrollerCompatGingerbread.getCurrX(scroller);
-        }
-
-        @Override
-        public int getCurrY(Object scroller) {
-            return ScrollerCompatGingerbread.getCurrY(scroller);
-        }
-
-        @Override
-        public float getCurrVelocity(Object scroller) {
-            return 0;
-        }
-
-        @Override
-        public boolean computeScrollOffset(Object scroller) {
-            return ScrollerCompatGingerbread.computeScrollOffset(scroller);
-        }
-
-        @Override
-        public void startScroll(Object scroller, int startX, int startY, int dx, int dy) {
-            ScrollerCompatGingerbread.startScroll(scroller, startX, startY, dx, dy);
-        }
-
-        @Override
-        public void startScroll(Object scroller, int startX, int startY, int dx, int dy,
-                int duration) {
-            ScrollerCompatGingerbread.startScroll(scroller, startX, startY, dx, dy, duration);
-        }
-
-        @Override
-        public void fling(Object scroller, int startX, int startY, int velX, int velY,
-                int minX, int maxX, int minY, int maxY) {
-            ScrollerCompatGingerbread.fling(scroller, startX, startY, velX, velY,
-                    minX, maxX, minY, maxY);
-        }
-
-        @Override
-        public void fling(Object scroller, int startX, int startY, int velX, int velY,
-                int minX, int maxX, int minY, int maxY, int overX, int overY) {
-            ScrollerCompatGingerbread.fling(scroller, startX, startY, velX, velY,
-                    minX, maxX, minY, maxY, overX, overY);
-        }
-
-        @Override
-        public void abortAnimation(Object scroller) {
-            ScrollerCompatGingerbread.abortAnimation(scroller);
-        }
-
-        @Override
-        public void notifyHorizontalEdgeReached(Object scroller, int startX, int finalX,
-                int overX) {
-            ScrollerCompatGingerbread.notifyHorizontalEdgeReached(scroller, startX, finalX, overX);
-        }
-
-        @Override
-        public void notifyVerticalEdgeReached(Object scroller, int startY, int finalY, int overY) {
-            ScrollerCompatGingerbread.notifyVerticalEdgeReached(scroller, startY, finalY, overY);
-        }
-
-        @Override
-        public boolean isOverScrolled(Object scroller) {
-            return ScrollerCompatGingerbread.isOverScrolled(scroller);
-        }
-
-        @Override
-        public int getFinalX(Object scroller) {
-            return ScrollerCompatGingerbread.getFinalX(scroller);
-        }
-
-        @Override
-        public int getFinalY(Object scroller) {
-            return ScrollerCompatGingerbread.getFinalY(scroller);
-        }
-
-        @Override
-        public boolean springBack(Object scroller, int startX, int startY, int minX, int maxX,
-                int minY, int maxY) {
-            return ScrollerCompatGingerbread.springBack(scroller, startX, startY, minX, maxX,
-                    minY, maxY);
-        }
-    }
-
-    static class ScrollerCompatImplIcs extends ScrollerCompatImplGingerbread {
-        @Override
-        public float getCurrVelocity(Object scroller) {
-            return ScrollerCompatIcs.getCurrVelocity(scroller);
-        }
-    }
-
-    public static ScrollerCompat create(Context context) {
-        return create(context, null);
-    }
-
-    public static ScrollerCompat create(Context context, Interpolator interpolator) {
-        return new ScrollerCompat(Build.VERSION.SDK_INT, context, interpolator);
-    }
-
-    /**
-     * Private constructer where API version can be provided.
-     * Useful for unit testing.
-     */
-    private ScrollerCompat(int apiVersion, Context context, Interpolator interpolator) {
-        if (apiVersion >= 14) { // ICS
-            mImpl = new ScrollerCompatImplIcs();
-        } else if (apiVersion>= 9) { // Gingerbread
-            mImpl = new ScrollerCompatImplGingerbread();
-        } else {
-            mImpl = new ScrollerCompatImplBase();
-        }
-        mScroller = mImpl.createScroller(context, interpolator);
-    }
-
-    /**
-     * Returns whether the scroller has finished scrolling.
-     *
-     * @return True if the scroller has finished scrolling, false otherwise.
-     */
-    public boolean isFinished() {
-        return mImpl.isFinished(mScroller);
-    }
-
-    /**
-     * Returns the current X offset in the scroll.
-     *
-     * @return The new X offset as an absolute distance from the origin.
-     */
-    public int getCurrX() {
-        return mImpl.getCurrX(mScroller);
-    }
-
-    /**
-     * Returns the current Y offset in the scroll.
-     *
-     * @return The new Y offset as an absolute distance from the origin.
-     */
-    public int getCurrY() {
-        return mImpl.getCurrY(mScroller);
-    }
-
-    /**
-     * @return The final X position for the scroll in progress, if known.
-     */
-    public int getFinalX() {
-        return mImpl.getFinalX(mScroller);
-    }
-
-    /**
-     * @return The final Y position for the scroll in progress, if known.
-     */
-    public int getFinalY() {
-        return mImpl.getFinalY(mScroller);
-    }
-
-    /**
-     * Returns the current velocity on platform versions that support it.
-     *
-     * <p>The device must support at least API level 14 (Ice Cream Sandwich).
-     * On older platform versions this method will return 0. This method should
-     * only be used as input for nonessential visual effects such as {@link EdgeEffectCompat}.</p>
-     *
-     * @return The original velocity less the deceleration. Result may be
-     * negative.
-     */
-    public float getCurrVelocity() {
-        return mImpl.getCurrVelocity(mScroller);
-    }
-
-    /**
-     * Call this when you want to know the new location.  If it returns true,
-     * the animation is not yet finished.  loc will be altered to provide the
-     * new location.
-     */
-    public boolean computeScrollOffset() {
-        return mImpl.computeScrollOffset(mScroller);
-    }
-
-    /**
-     * Start scrolling by providing a starting point and the distance to travel.
-     * The scroll will use the default value of 250 milliseconds for the
-     * duration.
-     *
-     * @param startX Starting horizontal scroll offset in pixels. Positive
-     *        numbers will scroll the content to the left.
-     * @param startY Starting vertical scroll offset in pixels. Positive numbers
-     *        will scroll the content up.
-     * @param dx Horizontal distance to travel. Positive numbers will scroll the
-     *        content to the left.
-     * @param dy Vertical distance to travel. Positive numbers will scroll the
-     *        content up.
-     */
-    public void startScroll(int startX, int startY, int dx, int dy) {
-        mImpl.startScroll(mScroller, startX, startY, dx, dy);
-    }
-
-    /**
-     * Start scrolling by providing a starting point and the distance to travel.
-     *
-     * @param startX Starting horizontal scroll offset in pixels. Positive
-     *        numbers will scroll the content to the left.
-     * @param startY Starting vertical scroll offset in pixels. Positive numbers
-     *        will scroll the content up.
-     * @param dx Horizontal distance to travel. Positive numbers will scroll the
-     *        content to the left.
-     * @param dy Vertical distance to travel. Positive numbers will scroll the
-     *        content up.
-     * @param duration Duration of the scroll in milliseconds.
-     */
-    public void startScroll(int startX, int startY, int dx, int dy, int duration) {
-        mImpl.startScroll(mScroller, startX, startY, dx, dy, duration);
-    }
-
-    /**
-     * Start scrolling based on a fling gesture. The distance travelled will
-     * depend on the initial velocity of the fling.
-     *
-     * @param startX Starting point of the scroll (X)
-     * @param startY Starting point of the scroll (Y)
-     * @param velocityX Initial velocity of the fling (X) measured in pixels per
-     *        second.
-     * @param velocityY Initial velocity of the fling (Y) measured in pixels per
-     *        second
-     * @param minX Minimum X value. The scroller will not scroll past this
-     *        point.
-     * @param maxX Maximum X value. The scroller will not scroll past this
-     *        point.
-     * @param minY Minimum Y value. The scroller will not scroll past this
-     *        point.
-     * @param maxY Maximum Y value. The scroller will not scroll past this
-     *        point.
-     */
-    public void fling(int startX, int startY, int velocityX, int velocityY,
-            int minX, int maxX, int minY, int maxY) {
-        mImpl.fling(mScroller, startX, startY, velocityX, velocityY, minX, maxX, minY, maxY);
-    }
-
-    /**
-     * Start scrolling based on a fling gesture. The distance travelled will
-     * depend on the initial velocity of the fling.
-     *
-     * @param startX Starting point of the scroll (X)
-     * @param startY Starting point of the scroll (Y)
-     * @param velocityX Initial velocity of the fling (X) measured in pixels per
-     *        second.
-     * @param velocityY Initial velocity of the fling (Y) measured in pixels per
-     *        second
-     * @param minX Minimum X value. The scroller will not scroll past this
-     *        point.
-     * @param maxX Maximum X value. The scroller will not scroll past this
-     *        point.
-     * @param minY Minimum Y value. The scroller will not scroll past this
-     *        point.
-     * @param maxY Maximum Y value. The scroller will not scroll past this
-     *        point.
-     * @param overX Overfling range. If > 0, horizontal overfling in either
-     *            direction will be possible.
-     * @param overY Overfling range. If > 0, vertical overfling in either
-     *            direction will be possible.
-     */
-    public void fling(int startX, int startY, int velocityX, int velocityY,
-            int minX, int maxX, int minY, int maxY, int overX, int overY) {
-        mImpl.fling(mScroller, startX, startY, velocityX, velocityY,
-                minX, maxX, minY, maxY, overX, overY);
-    }
-
-    /**
-     * Call this when you want to 'spring back' into a valid coordinate range.
-     *
-     * @param startX Starting X coordinate
-     * @param startY Starting Y coordinate
-     * @param minX Minimum valid X value
-     * @param maxX Maximum valid X value
-     * @param minY Minimum valid Y value
-     * @param maxY Maximum valid Y value
-     * @return true if a springback was initiated, false if startX and startY were
-     *          already within the valid range.
-     */
-    public boolean springBack(int startX, int startY, int minX, int maxX, int minY, int maxY) {
-        return mImpl.springBack(mScroller, startX, startY, minX, maxX, minY, maxY);
-    }
-
-    /**
-     * Stops the animation. Aborting the animation causes the scroller to move to the final x and y
-     * position.
-     */
-    public void abortAnimation() {
-        mImpl.abortAnimation(mScroller);
-    }
-
-
-    /**
-     * Notify the scroller that we've reached a horizontal boundary.
-     * Normally the information to handle this will already be known
-     * when the animation is started, such as in a call to one of the
-     * fling functions. However there are cases where this cannot be known
-     * in advance. This function will transition the current motion and
-     * animate from startX to finalX as appropriate.
-     *
-     * @param startX Starting/current X position
-     * @param finalX Desired final X position
-     * @param overX Magnitude of overscroll allowed. This should be the maximum
-     *              desired distance from finalX. Absolute value - must be positive.
-     */
-    public void notifyHorizontalEdgeReached(int startX, int finalX, int overX) {
-        mImpl.notifyHorizontalEdgeReached(mScroller, startX, finalX, overX);
-    }
-
-    /**
-     * Notify the scroller that we've reached a vertical boundary.
-     * Normally the information to handle this will already be known
-     * when the animation is started, such as in a call to one of the
-     * fling functions. However there are cases where this cannot be known
-     * in advance. This function will animate a parabolic motion from
-     * startY to finalY.
-     *
-     * @param startY Starting/current Y position
-     * @param finalY Desired final Y position
-     * @param overY Magnitude of overscroll allowed. This should be the maximum
-     *              desired distance from finalY. Absolute value - must be positive.
-     */
-    public void notifyVerticalEdgeReached(int startY, int finalY, int overY) {
-        mImpl.notifyVerticalEdgeReached(mScroller, startY, finalY, overY);
-    }
-
-    /**
-     * Returns whether the current Scroller is currently returning to a valid position.
-     * Valid bounds were provided by the
-     * {@link #fling(int, int, int, int, int, int, int, int, int, int)} method.
-     *
-     * One should check this value before calling
-     * {@link #startScroll(int, int, int, int)} as the interpolation currently in progress
-     * to restore a valid position will then be stopped. The caller has to take into account
-     * the fact that the started scroll will start from an overscrolled position.
-     *
-     * @return true when the current position is overscrolled and in the process of
-     *         interpolating back to a valid value.
-     */
-    public boolean isOverScrolled() {
-        return mImpl.isOverScrolled(mScroller);
-    }
-}
diff --git a/v4/java/android/support/v4/widget/SlidingPaneLayout.java b/v4/java/android/support/v4/widget/SlidingPaneLayout.java
deleted file mode 100644
index 7881691..0000000
--- a/v4/java/android/support/v4/widget/SlidingPaneLayout.java
+++ /dev/null
@@ -1,1662 +0,0 @@
-/*
- * Copyright (C) 2012 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 android.support.v4.widget;
-
-import android.content.Context;
-import android.content.res.TypedArray;
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
-import android.graphics.Paint;
-import android.graphics.PixelFormat;
-import android.graphics.PorterDuff;
-import android.graphics.PorterDuffColorFilter;
-import android.graphics.Rect;
-import android.graphics.drawable.Drawable;
-import android.os.Build;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.support.annotation.ColorInt;
-import android.support.annotation.DrawableRes;
-import android.support.v4.os.ParcelableCompat;
-import android.support.v4.os.ParcelableCompatCreatorCallbacks;
-import android.support.v4.view.AbsSavedState;
-import android.support.v4.view.AccessibilityDelegateCompat;
-import android.support.v4.view.MotionEventCompat;
-import android.support.v4.view.ViewCompat;
-import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.ViewConfiguration;
-import android.view.ViewGroup;
-import android.view.ViewParent;
-import android.view.accessibility.AccessibilityEvent;
-
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-
-/**
- * SlidingPaneLayout provides a horizontal, multi-pane layout for use at the top level
- * of a UI. A left (or first) pane is treated as a content list or browser, subordinate to a
- * primary detail view for displaying content.
- *
- * <p>Child views may overlap if their combined width exceeds the available width
- * in the SlidingPaneLayout. When this occurs the user may slide the topmost view out of the way
- * by dragging it, or by navigating in the direction of the overlapped view using a keyboard.
- * If the content of the dragged child view is itself horizontally scrollable, the user may
- * grab it by the very edge.</p>
- *
- * <p>Thanks to this sliding behavior, SlidingPaneLayout may be suitable for creating layouts
- * that can smoothly adapt across many different screen sizes, expanding out fully on larger
- * screens and collapsing on smaller screens.</p>
- *
- * <p>SlidingPaneLayout is distinct from a navigation drawer as described in the design
- * guide and should not be used in the same scenarios. SlidingPaneLayout should be thought
- * of only as a way to allow a two-pane layout normally used on larger screens to adapt to smaller
- * screens in a natural way. The interaction patterns expressed by SlidingPaneLayout imply
- * a physicality and direct information hierarchy between panes that does not necessarily exist
- * in a scenario where a navigation drawer should be used instead.</p>
- *
- * <p>Appropriate uses of SlidingPaneLayout include pairings of panes such as a contact list and
- * subordinate interactions with those contacts, or an email thread list with the content pane
- * displaying the contents of the selected thread. Inappropriate uses of SlidingPaneLayout include
- * switching between disparate functions of your app, such as jumping from a social stream view
- * to a view of your personal profile - cases such as this should use the navigation drawer
- * pattern instead. ({@link DrawerLayout DrawerLayout} implements this pattern.)</p>
- *
- * <p>Like {@link android.widget.LinearLayout LinearLayout}, SlidingPaneLayout supports
- * the use of the layout parameter <code>layout_weight</code> on child views to determine
- * how to divide leftover space after measurement is complete. It is only relevant for width.
- * When views do not overlap weight behaves as it does in a LinearLayout.</p>
- *
- * <p>When views do overlap, weight on a slideable pane indicates that the pane should be
- * sized to fill all available space in the closed state. Weight on a pane that becomes covered
- * indicates that the pane should be sized to fill all available space except a small minimum strip
- * that the user may use to grab the slideable view and pull it back over into a closed state.</p>
- */
-public class SlidingPaneLayout extends ViewGroup {
-    private static final String TAG = "SlidingPaneLayout";
-
-    /**
-     * Default size of the overhang for a pane in the open state.
-     * At least this much of a sliding pane will remain visible.
-     * This indicates that there is more content available and provides
-     * a "physical" edge to grab to pull it closed.
-     */
-    private static final int DEFAULT_OVERHANG_SIZE = 32; // dp;
-
-    /**
-     * If no fade color is given by default it will fade to 80% gray.
-     */
-    private static final int DEFAULT_FADE_COLOR = 0xcccccccc;
-
-    /**
-     * The fade color used for the sliding panel. 0 = no fading.
-     */
-    private int mSliderFadeColor = DEFAULT_FADE_COLOR;
-
-    /**
-     * Minimum velocity that will be detected as a fling
-     */
-    private static final int MIN_FLING_VELOCITY = 400; // dips per second
-
-    /**
-     * The fade color used for the panel covered by the slider. 0 = no fading.
-     */
-    private int mCoveredFadeColor;
-
-    /**
-     * Drawable used to draw the shadow between panes by default.
-     */
-    private Drawable mShadowDrawableLeft;
-
-    /**
-     * Drawable used to draw the shadow between panes to support RTL (right to left language).
-     */
-    private Drawable mShadowDrawableRight;
-
-    /**
-     * The size of the overhang in pixels.
-     * This is the minimum section of the sliding panel that will
-     * be visible in the open state to allow for a closing drag.
-     */
-    private final int mOverhangSize;
-
-    /**
-     * True if a panel can slide with the current measurements
-     */
-    private boolean mCanSlide;
-
-    /**
-     * The child view that can slide, if any.
-     */
-    private View mSlideableView;
-
-    /**
-     * How far the panel is offset from its closed position.
-     * range [0, 1] where 0 = closed, 1 = open.
-     */
-    private float mSlideOffset;
-
-    /**
-     * How far the non-sliding panel is parallaxed from its usual position when open.
-     * range [0, 1]
-     */
-    private float mParallaxOffset;
-
-    /**
-     * How far in pixels the slideable panel may move.
-     */
-    private int mSlideRange;
-
-    /**
-     * A panel view is locked into internal scrolling or another condition that
-     * is preventing a drag.
-     */
-    private boolean mIsUnableToDrag;
-
-    /**
-     * Distance in pixels to parallax the fixed pane by when fully closed
-     */
-    private int mParallaxBy;
-
-    private float mInitialMotionX;
-    private float mInitialMotionY;
-
-    private PanelSlideListener mPanelSlideListener;
-
-    private final ViewDragHelper mDragHelper;
-
-    /**
-     * Stores whether or not the pane was open the last time it was slideable.
-     * If open/close operations are invoked this state is modified. Used by
-     * instance state save/restore.
-     */
-    private boolean mPreservedOpenState;
-    private boolean mFirstLayout = true;
-
-    private final Rect mTmpRect = new Rect();
-
-    private final ArrayList<DisableLayerRunnable> mPostedRunnables =
-            new ArrayList<DisableLayerRunnable>();
-
-    static final SlidingPanelLayoutImpl IMPL;
-
-    static {
-        final int deviceVersion = Build.VERSION.SDK_INT;
-        if (deviceVersion >= 17) {
-            IMPL = new SlidingPanelLayoutImplJBMR1();
-        } else if (deviceVersion >= 16) {
-            IMPL = new SlidingPanelLayoutImplJB();
-        } else {
-            IMPL = new SlidingPanelLayoutImplBase();
-        }
-    }
-
-    /**
-     * Listener for monitoring events about sliding panes.
-     */
-    public interface PanelSlideListener {
-        /**
-         * Called when a sliding pane's position changes.
-         * @param panel The child view that was moved
-         * @param slideOffset The new offset of this sliding pane within its range, from 0-1
-         */
-        public void onPanelSlide(View panel, float slideOffset);
-        /**
-         * Called when a sliding pane becomes slid completely open. The pane may or may not
-         * be interactive at this point depending on how much of the pane is visible.
-         * @param panel The child view that was slid to an open position, revealing other panes
-         */
-        public void onPanelOpened(View panel);
-
-        /**
-         * Called when a sliding pane becomes slid completely closed. The pane is now guaranteed
-         * to be interactive. It may now obscure other views in the layout.
-         * @param panel The child view that was slid to a closed position
-         */
-        public void onPanelClosed(View panel);
-    }
-
-    /**
-     * No-op stubs for {@link PanelSlideListener}. If you only want to implement a subset
-     * of the listener methods you can extend this instead of implement the full interface.
-     */
-    public static class SimplePanelSlideListener implements PanelSlideListener {
-        @Override
-        public void onPanelSlide(View panel, float slideOffset) {
-        }
-        @Override
-        public void onPanelOpened(View panel) {
-        }
-        @Override
-        public void onPanelClosed(View panel) {
-        }
-    }
-
-    public SlidingPaneLayout(Context context) {
-        this(context, null);
-    }
-
-    public SlidingPaneLayout(Context context, AttributeSet attrs) {
-        this(context, attrs, 0);
-    }
-
-    public SlidingPaneLayout(Context context, AttributeSet attrs, int defStyle) {
-        super(context, attrs, defStyle);
-
-        final float density = context.getResources().getDisplayMetrics().density;
-        mOverhangSize = (int) (DEFAULT_OVERHANG_SIZE * density + 0.5f);
-
-        final ViewConfiguration viewConfig = ViewConfiguration.get(context);
-
-        setWillNotDraw(false);
-
-        ViewCompat.setAccessibilityDelegate(this, new AccessibilityDelegate());
-        ViewCompat.setImportantForAccessibility(this, ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_YES);
-
-        mDragHelper = ViewDragHelper.create(this, 0.5f, new DragHelperCallback());
-        mDragHelper.setMinVelocity(MIN_FLING_VELOCITY * density);
-    }
-
-    /**
-     * Set a distance to parallax the lower pane by when the upper pane is in its
-     * fully closed state. The lower pane will scroll between this position and
-     * its fully open state.
-     *
-     * @param parallaxBy Distance to parallax by in pixels
-     */
-    public void setParallaxDistance(int parallaxBy) {
-        mParallaxBy = parallaxBy;
-        requestLayout();
-    }
-
-    /**
-     * @return The distance the lower pane will parallax by when the upper pane is fully closed.
-     *
-     * @see #setParallaxDistance(int)
-     */
-    public int getParallaxDistance() {
-        return mParallaxBy;
-    }
-
-    /**
-     * Set the color used to fade the sliding pane out when it is slid most of the way offscreen.
-     *
-     * @param color An ARGB-packed color value
-     */
-    public void setSliderFadeColor(@ColorInt int color) {
-        mSliderFadeColor = color;
-    }
-
-    /**
-     * @return The ARGB-packed color value used to fade the sliding pane
-     */
-    @ColorInt
-    public int getSliderFadeColor() {
-        return mSliderFadeColor;
-    }
-
-    /**
-     * Set the color used to fade the pane covered by the sliding pane out when the pane
-     * will become fully covered in the closed state.
-     *
-     * @param color An ARGB-packed color value
-     */
-    public void setCoveredFadeColor(@ColorInt int color) {
-        mCoveredFadeColor = color;
-    }
-
-    /**
-     * @return The ARGB-packed color value used to fade the fixed pane
-     */
-    @ColorInt
-    public int getCoveredFadeColor() {
-        return mCoveredFadeColor;
-    }
-
-    public void setPanelSlideListener(PanelSlideListener listener) {
-        mPanelSlideListener = listener;
-    }
-
-    void dispatchOnPanelSlide(View panel) {
-        if (mPanelSlideListener != null) {
-            mPanelSlideListener.onPanelSlide(panel, mSlideOffset);
-        }
-    }
-
-    void dispatchOnPanelOpened(View panel) {
-        if (mPanelSlideListener != null) {
-            mPanelSlideListener.onPanelOpened(panel);
-        }
-        sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
-    }
-
-    void dispatchOnPanelClosed(View panel) {
-        if (mPanelSlideListener != null) {
-            mPanelSlideListener.onPanelClosed(panel);
-        }
-        sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
-    }
-
-    void updateObscuredViewsVisibility(View panel) {
-        final boolean isLayoutRtl = isLayoutRtlSupport();
-        final int startBound = isLayoutRtl ? (getWidth() - getPaddingRight()) :
-            getPaddingLeft();
-        final int endBound = isLayoutRtl ? getPaddingLeft() :
-            (getWidth() - getPaddingRight());
-        final int topBound = getPaddingTop();
-        final int bottomBound = getHeight() - getPaddingBottom();
-        final int left;
-        final int right;
-        final int top;
-        final int bottom;
-        if (panel != null && viewIsOpaque(panel)) {
-            left = panel.getLeft();
-            right = panel.getRight();
-            top = panel.getTop();
-            bottom = panel.getBottom();
-        } else {
-            left = right = top = bottom = 0;
-        }
-
-        for (int i = 0, childCount = getChildCount(); i < childCount; i++) {
-            final View child = getChildAt(i);
-
-            if (child == panel) {
-                // There are still more children above the panel but they won't be affected.
-                break;
-            } else if (child.getVisibility() == GONE) {
-                continue;
-            }
-
-            final int clampedChildLeft = Math.max((isLayoutRtl ? endBound :
-                startBound), child.getLeft());
-            final int clampedChildTop = Math.max(topBound, child.getTop());
-            final int clampedChildRight = Math.min((isLayoutRtl ? startBound :
-                endBound), child.getRight());
-            final int clampedChildBottom = Math.min(bottomBound, child.getBottom());
-            final int vis;
-            if (clampedChildLeft >= left && clampedChildTop >= top &&
-                    clampedChildRight <= right && clampedChildBottom <= bottom) {
-                vis = INVISIBLE;
-            } else {
-                vis = VISIBLE;
-            }
-            child.setVisibility(vis);
-        }
-    }
-
-    void setAllChildrenVisible() {
-        for (int i = 0, childCount = getChildCount(); i < childCount; i++) {
-            final View child = getChildAt(i);
-            if (child.getVisibility() == INVISIBLE) {
-                child.setVisibility(VISIBLE);
-            }
-        }
-    }
-
-    private static boolean viewIsOpaque(View v) {
-        if (ViewCompat.isOpaque(v)) return true;
-
-        // View#isOpaque didn't take all valid opaque scrollbar modes into account
-        // before API 18 (JB-MR2). On newer devices rely solely on isOpaque above and return false
-        // here. On older devices, check the view's background drawable directly as a fallback.
-        if (Build.VERSION.SDK_INT >= 18) return false;
-
-        final Drawable bg = v.getBackground();
-        if (bg != null) {
-            return bg.getOpacity() == PixelFormat.OPAQUE;
-        }
-        return false;
-    }
-
-    @Override
-    protected void onAttachedToWindow() {
-        super.onAttachedToWindow();
-        mFirstLayout = true;
-    }
-
-    @Override
-    protected void onDetachedFromWindow() {
-        super.onDetachedFromWindow();
-        mFirstLayout = true;
-
-        for (int i = 0, count = mPostedRunnables.size(); i < count; i++) {
-            final DisableLayerRunnable dlr = mPostedRunnables.get(i);
-            dlr.run();
-        }
-        mPostedRunnables.clear();
-    }
-
-    @Override
-    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
-        int widthMode = MeasureSpec.getMode(widthMeasureSpec);
-        int widthSize = MeasureSpec.getSize(widthMeasureSpec);
-        int heightMode = MeasureSpec.getMode(heightMeasureSpec);
-        int heightSize = MeasureSpec.getSize(heightMeasureSpec);
-
-        if (widthMode != MeasureSpec.EXACTLY) {
-            if (isInEditMode()) {
-                // Don't crash the layout editor. Consume all of the space if specified
-                // or pick a magic number from thin air otherwise.
-                // TODO Better communication with tools of this bogus state.
-                // It will crash on a real device.
-                if (widthMode == MeasureSpec.AT_MOST) {
-                    widthMode = MeasureSpec.EXACTLY;
-                } else if (widthMode == MeasureSpec.UNSPECIFIED) {
-                    widthMode = MeasureSpec.EXACTLY;
-                    widthSize = 300;
-                }
-            } else {
-                throw new IllegalStateException("Width must have an exact value or MATCH_PARENT");
-            }
-        } else if (heightMode == MeasureSpec.UNSPECIFIED) {
-            if (isInEditMode()) {
-                // Don't crash the layout editor. Pick a magic number from thin air instead.
-                // TODO Better communication with tools of this bogus state.
-                // It will crash on a real device.
-                if (heightMode == MeasureSpec.UNSPECIFIED) {
-                    heightMode = MeasureSpec.AT_MOST;
-                    heightSize = 300;
-                }
-            } else {
-                throw new IllegalStateException("Height must not be UNSPECIFIED");
-            }
-        }
-
-        int layoutHeight = 0;
-        int maxLayoutHeight = -1;
-        switch (heightMode) {
-            case MeasureSpec.EXACTLY:
-                layoutHeight = maxLayoutHeight = heightSize - getPaddingTop() - getPaddingBottom();
-                break;
-            case MeasureSpec.AT_MOST:
-                maxLayoutHeight = heightSize - getPaddingTop() - getPaddingBottom();
-                break;
-        }
-
-        float weightSum = 0;
-        boolean canSlide = false;
-        final int widthAvailable = widthSize - getPaddingLeft() - getPaddingRight();
-        int widthRemaining = widthAvailable;
-        final int childCount = getChildCount();
-
-        if (childCount > 2) {
-            Log.e(TAG, "onMeasure: More than two child views are not supported.");
-        }
-
-        // We'll find the current one below.
-        mSlideableView = null;
-
-        // First pass. Measure based on child LayoutParams width/height.
-        // Weight will incur a second pass.
-        for (int i = 0; i < childCount; i++) {
-            final View child = getChildAt(i);
-            final LayoutParams lp = (LayoutParams) child.getLayoutParams();
-
-            if (child.getVisibility() == GONE) {
-                lp.dimWhenOffset = false;
-                continue;
-            }
-
-            if (lp.weight > 0) {
-                weightSum += lp.weight;
-
-                // If we have no width, weight is the only contributor to the final size.
-                // Measure this view on the weight pass only.
-                if (lp.width == 0) continue;
-            }
-
-            int childWidthSpec;
-            final int horizontalMargin = lp.leftMargin + lp.rightMargin;
-            if (lp.width == LayoutParams.WRAP_CONTENT) {
-                childWidthSpec = MeasureSpec.makeMeasureSpec(widthAvailable - horizontalMargin,
-                        MeasureSpec.AT_MOST);
-            } else if (lp.width == LayoutParams.FILL_PARENT) {
-                childWidthSpec = MeasureSpec.makeMeasureSpec(widthAvailable - horizontalMargin,
-                        MeasureSpec.EXACTLY);
-            } else {
-                childWidthSpec = MeasureSpec.makeMeasureSpec(lp.width, MeasureSpec.EXACTLY);
-            }
-
-            int childHeightSpec;
-            if (lp.height == LayoutParams.WRAP_CONTENT) {
-                childHeightSpec = MeasureSpec.makeMeasureSpec(maxLayoutHeight, MeasureSpec.AT_MOST);
-            } else if (lp.height == LayoutParams.FILL_PARENT) {
-                childHeightSpec = MeasureSpec.makeMeasureSpec(maxLayoutHeight, MeasureSpec.EXACTLY);
-            } else {
-                childHeightSpec = MeasureSpec.makeMeasureSpec(lp.height, MeasureSpec.EXACTLY);
-            }
-
-            child.measure(childWidthSpec, childHeightSpec);
-            final int childWidth = child.getMeasuredWidth();
-            final int childHeight = child.getMeasuredHeight();
-
-            if (heightMode == MeasureSpec.AT_MOST && childHeight > layoutHeight) {
-                layoutHeight = Math.min(childHeight, maxLayoutHeight);
-            }
-
-            widthRemaining -= childWidth;
-            canSlide |= lp.slideable = widthRemaining < 0;
-            if (lp.slideable) {
-                mSlideableView = child;
-            }
-        }
-
-        // Resolve weight and make sure non-sliding panels are smaller than the full screen.
-        if (canSlide || weightSum > 0) {
-            final int fixedPanelWidthLimit = widthAvailable - mOverhangSize;
-
-            for (int i = 0; i < childCount; i++) {
-                final View child = getChildAt(i);
-
-                if (child.getVisibility() == GONE) {
-                    continue;
-                }
-
-                final LayoutParams lp = (LayoutParams) child.getLayoutParams();
-
-                if (child.getVisibility() == GONE) {
-                    continue;
-                }
-
-                final boolean skippedFirstPass = lp.width == 0 && lp.weight > 0;
-                final int measuredWidth = skippedFirstPass ? 0 : child.getMeasuredWidth();
-                if (canSlide && child != mSlideableView) {
-                    if (lp.width < 0 && (measuredWidth > fixedPanelWidthLimit || lp.weight > 0)) {
-                        // Fixed panels in a sliding configuration should
-                        // be clamped to the fixed panel limit.
-                        final int childHeightSpec;
-                        if (skippedFirstPass) {
-                            // Do initial height measurement if we skipped measuring this view
-                            // the first time around.
-                            if (lp.height == LayoutParams.WRAP_CONTENT) {
-                                childHeightSpec = MeasureSpec.makeMeasureSpec(maxLayoutHeight,
-                                        MeasureSpec.AT_MOST);
-                            } else if (lp.height == LayoutParams.FILL_PARENT) {
-                                childHeightSpec = MeasureSpec.makeMeasureSpec(maxLayoutHeight,
-                                        MeasureSpec.EXACTLY);
-                            } else {
-                                childHeightSpec = MeasureSpec.makeMeasureSpec(lp.height,
-                                        MeasureSpec.EXACTLY);
-                            }
-                        } else {
-                            childHeightSpec = MeasureSpec.makeMeasureSpec(
-                                    child.getMeasuredHeight(), MeasureSpec.EXACTLY);
-                        }
-                        final int childWidthSpec = MeasureSpec.makeMeasureSpec(
-                                fixedPanelWidthLimit, MeasureSpec.EXACTLY);
-                        child.measure(childWidthSpec, childHeightSpec);
-                    }
-                } else if (lp.weight > 0) {
-                    int childHeightSpec;
-                    if (lp.width == 0) {
-                        // This was skipped the first time; figure out a real height spec.
-                        if (lp.height == LayoutParams.WRAP_CONTENT) {
-                            childHeightSpec = MeasureSpec.makeMeasureSpec(maxLayoutHeight,
-                                    MeasureSpec.AT_MOST);
-                        } else if (lp.height == LayoutParams.FILL_PARENT) {
-                            childHeightSpec = MeasureSpec.makeMeasureSpec(maxLayoutHeight,
-                                    MeasureSpec.EXACTLY);
-                        } else {
-                            childHeightSpec = MeasureSpec.makeMeasureSpec(lp.height,
-                                    MeasureSpec.EXACTLY);
-                        }
-                    } else {
-                        childHeightSpec = MeasureSpec.makeMeasureSpec(
-                                child.getMeasuredHeight(), MeasureSpec.EXACTLY);
-                    }
-
-                    if (canSlide) {
-                        // Consume available space
-                        final int horizontalMargin = lp.leftMargin + lp.rightMargin;
-                        final int newWidth = widthAvailable - horizontalMargin;
-                        final int childWidthSpec = MeasureSpec.makeMeasureSpec(
-                                newWidth, MeasureSpec.EXACTLY);
-                        if (measuredWidth != newWidth) {
-                            child.measure(childWidthSpec, childHeightSpec);
-                        }
-                    } else {
-                        // Distribute the extra width proportionally similar to LinearLayout
-                        final int widthToDistribute = Math.max(0, widthRemaining);
-                        final int addedWidth = (int) (lp.weight * widthToDistribute / weightSum);
-                        final int childWidthSpec = MeasureSpec.makeMeasureSpec(
-                                measuredWidth + addedWidth, MeasureSpec.EXACTLY);
-                        child.measure(childWidthSpec, childHeightSpec);
-                    }
-                }
-            }
-        }
-
-        final int measuredWidth = widthSize;
-        final int measuredHeight = layoutHeight + getPaddingTop() + getPaddingBottom();
-
-        setMeasuredDimension(measuredWidth, measuredHeight);
-        mCanSlide = canSlide;
-
-        if (mDragHelper.getViewDragState() != ViewDragHelper.STATE_IDLE && !canSlide) {
-            // Cancel scrolling in progress, it's no longer relevant.
-            mDragHelper.abort();
-        }
-    }
-
-    @Override
-    protected void onLayout(boolean changed, int l, int t, int r, int b) {
-        final boolean isLayoutRtl = isLayoutRtlSupport();
-        if (isLayoutRtl) {
-            mDragHelper.setEdgeTrackingEnabled(ViewDragHelper.EDGE_RIGHT);
-        } else {
-            mDragHelper.setEdgeTrackingEnabled(ViewDragHelper.EDGE_LEFT);
-        }
-        final int width = r - l;
-        final int paddingStart = isLayoutRtl ? getPaddingRight() : getPaddingLeft();
-        final int paddingEnd = isLayoutRtl ? getPaddingLeft() : getPaddingRight();
-        final int paddingTop = getPaddingTop();
-
-        final int childCount = getChildCount();
-        int xStart = paddingStart;
-        int nextXStart = xStart;
-
-        if (mFirstLayout) {
-            mSlideOffset = mCanSlide && mPreservedOpenState ? 1.f : 0.f;
-        }
-
-        for (int i = 0; i < childCount; i++) {
-            final View child = getChildAt(i);
-
-            if (child.getVisibility() == GONE) {
-                continue;
-            }
-
-            final LayoutParams lp = (LayoutParams) child.getLayoutParams();
-
-            final int childWidth = child.getMeasuredWidth();
-            int offset = 0;
-
-            if (lp.slideable) {
-                final int margin = lp.leftMargin + lp.rightMargin;
-                final int range = Math.min(nextXStart,
-                        width - paddingEnd - mOverhangSize) - xStart - margin;
-                mSlideRange = range;
-                final int lpMargin = isLayoutRtl ? lp.rightMargin : lp.leftMargin;
-                lp.dimWhenOffset = xStart + lpMargin + range + childWidth / 2 >
-                        width - paddingEnd;
-                final int pos = (int) (range * mSlideOffset);
-                xStart += pos + lpMargin;
-                mSlideOffset = (float) pos / mSlideRange;
-            } else if (mCanSlide && mParallaxBy != 0) {
-                offset = (int) ((1 - mSlideOffset) * mParallaxBy);
-                xStart = nextXStart;
-            } else {
-                xStart = nextXStart;
-            }
-
-            final int childRight;
-            final int childLeft;
-            if (isLayoutRtl) {
-                childRight = width - xStart + offset;
-                childLeft = childRight - childWidth;
-            } else {
-                childLeft = xStart - offset;
-                childRight = childLeft + childWidth;
-            }
-
-            final int childTop = paddingTop;
-            final int childBottom = childTop + child.getMeasuredHeight();
-            child.layout(childLeft, paddingTop, childRight, childBottom);
-
-            nextXStart += child.getWidth();
-        }
-
-        if (mFirstLayout) {
-            if (mCanSlide) {
-                if (mParallaxBy != 0) {
-                    parallaxOtherViews(mSlideOffset);
-                }
-                if (((LayoutParams) mSlideableView.getLayoutParams()).dimWhenOffset) {
-                    dimChildView(mSlideableView, mSlideOffset, mSliderFadeColor);
-                }
-            } else {
-                // Reset the dim level of all children; it's irrelevant when nothing moves.
-                for (int i = 0; i < childCount; i++) {
-                    dimChildView(getChildAt(i), 0, mSliderFadeColor);
-                }
-            }
-            updateObscuredViewsVisibility(mSlideableView);
-        }
-
-        mFirstLayout = false;
-    }
-
-    @Override
-    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
-        super.onSizeChanged(w, h, oldw, oldh);
-        // Recalculate sliding panes and their details
-        if (w != oldw) {
-            mFirstLayout = true;
-        }
-    }
-
-    @Override
-    public void requestChildFocus(View child, View focused) {
-        super.requestChildFocus(child, focused);
-        if (!isInTouchMode() && !mCanSlide) {
-            mPreservedOpenState = child == mSlideableView;
-        }
-    }
-
-    @Override
-    public boolean onInterceptTouchEvent(MotionEvent ev) {
-        final int action = MotionEventCompat.getActionMasked(ev);
-
-        // Preserve the open state based on the last view that was touched.
-        if (!mCanSlide && action == MotionEvent.ACTION_DOWN && getChildCount() > 1) {
-            // After the first things will be slideable.
-            final View secondChild = getChildAt(1);
-            if (secondChild != null) {
-                mPreservedOpenState = !mDragHelper.isViewUnder(secondChild,
-                        (int) ev.getX(), (int) ev.getY());
-            }
-        }
-
-        if (!mCanSlide || (mIsUnableToDrag && action != MotionEvent.ACTION_DOWN)) {
-            mDragHelper.cancel();
-            return super.onInterceptTouchEvent(ev);
-        }
-
-        if (action == MotionEvent.ACTION_CANCEL || action == MotionEvent.ACTION_UP) {
-            mDragHelper.cancel();
-            return false;
-        }
-
-        boolean interceptTap = false;
-
-        switch (action) {
-            case MotionEvent.ACTION_DOWN: {
-                mIsUnableToDrag = false;
-                final float x = ev.getX();
-                final float y = ev.getY();
-                mInitialMotionX = x;
-                mInitialMotionY = y;
-
-                if (mDragHelper.isViewUnder(mSlideableView, (int) x, (int) y) &&
-                        isDimmed(mSlideableView)) {
-                    interceptTap = true;
-                }
-                break;
-            }
-
-            case MotionEvent.ACTION_MOVE: {
-                final float x = ev.getX();
-                final float y = ev.getY();
-                final float adx = Math.abs(x - mInitialMotionX);
-                final float ady = Math.abs(y - mInitialMotionY);
-                final int slop = mDragHelper.getTouchSlop();
-                if (adx > slop && ady > adx) {
-                    mDragHelper.cancel();
-                    mIsUnableToDrag = true;
-                    return false;
-                }
-            }
-        }
-
-        final boolean interceptForDrag = mDragHelper.shouldInterceptTouchEvent(ev);
-
-        return interceptForDrag || interceptTap;
-    }
-
-    @Override
-    public boolean onTouchEvent(MotionEvent ev) {
-        if (!mCanSlide) {
-            return super.onTouchEvent(ev);
-        }
-
-        mDragHelper.processTouchEvent(ev);
-
-        final int action = ev.getAction();
-        boolean wantTouchEvents = true;
-
-        switch (action & MotionEventCompat.ACTION_MASK) {
-            case MotionEvent.ACTION_DOWN: {
-                final float x = ev.getX();
-                final float y = ev.getY();
-                mInitialMotionX = x;
-                mInitialMotionY = y;
-                break;
-            }
-
-            case MotionEvent.ACTION_UP: {
-                if (isDimmed(mSlideableView)) {
-                    final float x = ev.getX();
-                    final float y = ev.getY();
-                    final float dx = x - mInitialMotionX;
-                    final float dy = y - mInitialMotionY;
-                    final int slop = mDragHelper.getTouchSlop();
-                    if (dx * dx + dy * dy < slop * slop &&
-                            mDragHelper.isViewUnder(mSlideableView, (int) x, (int) y)) {
-                        // Taps close a dimmed open pane.
-                        closePane(mSlideableView, 0);
-                        break;
-                    }
-                }
-                break;
-            }
-        }
-
-        return wantTouchEvents;
-    }
-
-    private boolean closePane(View pane, int initialVelocity) {
-        if (mFirstLayout || smoothSlideTo(0.f, initialVelocity)) {
-            mPreservedOpenState = false;
-            return true;
-        }
-        return false;
-    }
-
-    private boolean openPane(View pane, int initialVelocity) {
-        if (mFirstLayout || smoothSlideTo(1.f, initialVelocity)) {
-            mPreservedOpenState = true;
-            return true;
-        }
-        return false;
-    }
-
-    /**
-     * @deprecated Renamed to {@link #openPane()} - this method is going away soon!
-     */
-    @Deprecated
-    public void smoothSlideOpen() {
-        openPane();
-    }
-
-    /**
-     * Open the sliding pane if it is currently slideable. If first layout
-     * has already completed this will animate.
-     *
-     * @return true if the pane was slideable and is now open/in the process of opening
-     */
-    public boolean openPane() {
-        return openPane(mSlideableView, 0);
-    }
-
-    /**
-     * @deprecated Renamed to {@link #closePane()} - this method is going away soon!
-     */
-    @Deprecated
-    public void smoothSlideClosed() {
-        closePane();
-    }
-
-    /**
-     * Close the sliding pane if it is currently slideable. If first layout
-     * has already completed this will animate.
-     *
-     * @return true if the pane was slideable and is now closed/in the process of closing
-     */
-    public boolean closePane() {
-        return closePane(mSlideableView, 0);
-    }
-
-    /**
-     * Check if the layout is completely open. It can be open either because the slider
-     * itself is open revealing the left pane, or if all content fits without sliding.
-     *
-     * @return true if sliding panels are completely open
-     */
-    public boolean isOpen() {
-        return !mCanSlide || mSlideOffset == 1;
-    }
-
-    /**
-     * @return true if content in this layout can be slid open and closed
-     * @deprecated Renamed to {@link #isSlideable()} - this method is going away soon!
-     */
-    @Deprecated
-    public boolean canSlide() {
-        return mCanSlide;
-    }
-
-    /**
-     * Check if the content in this layout cannot fully fit side by side and therefore
-     * the content pane can be slid back and forth.
-     *
-     * @return true if content in this layout can be slid open and closed
-     */
-    public boolean isSlideable() {
-        return mCanSlide;
-    }
-
-    private void onPanelDragged(int newLeft) {
-        if (mSlideableView == null) {
-            // This can happen if we're aborting motion during layout because everything now fits.
-            mSlideOffset = 0;
-            return;
-        }
-        final boolean isLayoutRtl = isLayoutRtlSupport();
-        final LayoutParams lp = (LayoutParams) mSlideableView.getLayoutParams();
-
-        int childWidth = mSlideableView.getWidth();
-        final int newStart = isLayoutRtl ? getWidth() - newLeft - childWidth : newLeft;
-
-        final int paddingStart = isLayoutRtl ? getPaddingRight() : getPaddingLeft();
-        final int lpMargin = isLayoutRtl ? lp.rightMargin : lp.leftMargin;
-        final int startBound = paddingStart + lpMargin;
-
-        mSlideOffset = (float) (newStart - startBound) / mSlideRange;
-
-        if (mParallaxBy != 0) {
-            parallaxOtherViews(mSlideOffset);
-        }
-
-        if (lp.dimWhenOffset) {
-            dimChildView(mSlideableView, mSlideOffset, mSliderFadeColor);
-        }
-        dispatchOnPanelSlide(mSlideableView);
-    }
-
-    private void dimChildView(View v, float mag, int fadeColor) {
-        final LayoutParams lp = (LayoutParams) v.getLayoutParams();
-
-        if (mag > 0 && fadeColor != 0) {
-            final int baseAlpha = (fadeColor & 0xff000000) >>> 24;
-            int imag = (int) (baseAlpha * mag);
-            int color = imag << 24 | (fadeColor & 0xffffff);
-            if (lp.dimPaint == null) {
-                lp.dimPaint = new Paint();
-            }
-            lp.dimPaint.setColorFilter(new PorterDuffColorFilter(color, PorterDuff.Mode.SRC_OVER));
-            if (ViewCompat.getLayerType(v) != ViewCompat.LAYER_TYPE_HARDWARE) {
-                ViewCompat.setLayerType(v, ViewCompat.LAYER_TYPE_HARDWARE, lp.dimPaint);
-            }
-            invalidateChildRegion(v);
-        } else if (ViewCompat.getLayerType(v) != ViewCompat.LAYER_TYPE_NONE) {
-            if (lp.dimPaint != null) {
-                lp.dimPaint.setColorFilter(null);
-            }
-            final DisableLayerRunnable dlr = new DisableLayerRunnable(v);
-            mPostedRunnables.add(dlr);
-            ViewCompat.postOnAnimation(this, dlr);
-        }
-    }
-
-    @Override
-    protected boolean drawChild(Canvas canvas, View child, long drawingTime) {
-        final LayoutParams lp = (LayoutParams) child.getLayoutParams();
-        boolean result;
-        final int save = canvas.save(Canvas.CLIP_SAVE_FLAG);
-
-        if (mCanSlide && !lp.slideable && mSlideableView != null) {
-            // Clip against the slider; no sense drawing what will immediately be covered.
-            canvas.getClipBounds(mTmpRect);
-            if (isLayoutRtlSupport()) {
-                mTmpRect.left = Math.max(mTmpRect.left, mSlideableView.getRight());
-            } else {
-                mTmpRect.right = Math.min(mTmpRect.right, mSlideableView.getLeft());
-            }
-            canvas.clipRect(mTmpRect);
-        }
-
-        if (Build.VERSION.SDK_INT >= 11) { // HC
-            result = super.drawChild(canvas, child, drawingTime);
-        } else {
-            if (lp.dimWhenOffset && mSlideOffset > 0) {
-                if (!child.isDrawingCacheEnabled()) {
-                    child.setDrawingCacheEnabled(true);
-                }
-                final Bitmap cache = child.getDrawingCache();
-                if (cache != null) {
-                    canvas.drawBitmap(cache, child.getLeft(), child.getTop(), lp.dimPaint);
-                    result = false;
-                } else {
-                    Log.e(TAG, "drawChild: child view " + child + " returned null drawing cache");
-                    result = super.drawChild(canvas, child, drawingTime);
-                }
-            } else {
-                if (child.isDrawingCacheEnabled()) {
-                    child.setDrawingCacheEnabled(false);
-                }
-                result = super.drawChild(canvas, child, drawingTime);
-            }
-        }
-
-        canvas.restoreToCount(save);
-
-        return result;
-    }
-
-    private void invalidateChildRegion(View v) {
-        IMPL.invalidateChildRegion(this, v);
-    }
-
-    /**
-     * Smoothly animate mDraggingPane to the target X position within its range.
-     *
-     * @param slideOffset position to animate to
-     * @param velocity initial velocity in case of fling, or 0.
-     */
-    boolean smoothSlideTo(float slideOffset, int velocity) {
-        if (!mCanSlide) {
-            // Nothing to do.
-            return false;
-        }
-
-        final boolean isLayoutRtl = isLayoutRtlSupport();
-        final LayoutParams lp = (LayoutParams) mSlideableView.getLayoutParams();
-
-        int x;
-        if (isLayoutRtl) {
-            int startBound = getPaddingRight() + lp.rightMargin;
-            int childWidth = mSlideableView.getWidth();
-            x = (int) (getWidth() - (startBound + slideOffset * mSlideRange + childWidth));
-        } else {
-            int startBound = getPaddingLeft() + lp.leftMargin;
-            x = (int) (startBound + slideOffset * mSlideRange);
-        }
-
-        if (mDragHelper.smoothSlideViewTo(mSlideableView, x, mSlideableView.getTop())) {
-            setAllChildrenVisible();
-            ViewCompat.postInvalidateOnAnimation(this);
-            return true;
-        }
-        return false;
-    }
-
-    @Override
-    public void computeScroll() {
-        if (mDragHelper.continueSettling(true)) {
-            if (!mCanSlide) {
-                mDragHelper.abort();
-                return;
-            }
-
-            ViewCompat.postInvalidateOnAnimation(this);
-        }
-    }
-
-    /**
-     * @deprecated Renamed to {@link #setShadowDrawableLeft(Drawable d)} to support LTR (left to
-     * right language) and {@link #setShadowDrawableRight(Drawable d)} to support RTL (right to left
-     * language) during opening/closing.
-     *
-     * @param d drawable to use as a shadow
-     */
-    @Deprecated
-    public void setShadowDrawable(Drawable d) {
-        setShadowDrawableLeft(d);
-    }
-
-    /**
-     * Set a drawable to use as a shadow cast by the right pane onto the left pane
-     * during opening/closing.
-     *
-     * @param d drawable to use as a shadow
-     */
-    public void setShadowDrawableLeft(Drawable d) {
-        mShadowDrawableLeft = d;
-    }
-
-    /**
-     * Set a drawable to use as a shadow cast by the left pane onto the right pane
-     * during opening/closing to support right to left language.
-     *
-     * @param d drawable to use as a shadow
-     */
-    public void setShadowDrawableRight(Drawable d) {
-        mShadowDrawableRight = d;
-    }
-
-    /**
-     * Set a drawable to use as a shadow cast by the right pane onto the left pane
-     * during opening/closing.
-     *
-     * @param resId Resource ID of a drawable to use
-     * @deprecated Renamed to {@link #setShadowResourceLeft(int)} to support LTR (left to
-     * right language) and {@link #setShadowResourceRight(int)} to support RTL (right to left
-     * language) during opening/closing.
-     */
-    @Deprecated
-    public void setShadowResource(@DrawableRes int resId) {
-        setShadowDrawable(getResources().getDrawable(resId));
-    }
-
-    /**
-     * Set a drawable to use as a shadow cast by the right pane onto the left pane
-     * during opening/closing.
-     *
-     * @param resId Resource ID of a drawable to use
-     */
-    public void setShadowResourceLeft(int resId) {
-        setShadowDrawableLeft(getResources().getDrawable(resId));
-    }
-
-    /**
-     * Set a drawable to use as a shadow cast by the left pane onto the right pane
-     * during opening/closing to support right to left language.
-     *
-     * @param resId Resource ID of a drawable to use
-     */
-    public void setShadowResourceRight(int resId) {
-        setShadowDrawableRight(getResources().getDrawable(resId));
-    }
-
-
-    @Override
-    public void draw(Canvas c) {
-        super.draw(c);
-        final boolean isLayoutRtl = isLayoutRtlSupport();
-        Drawable shadowDrawable;
-        if (isLayoutRtl) {
-            shadowDrawable = mShadowDrawableRight;
-        } else {
-            shadowDrawable = mShadowDrawableLeft;
-        }
-
-        final View shadowView = getChildCount() > 1 ? getChildAt(1) : null;
-        if (shadowView == null || shadowDrawable == null) {
-            // No need to draw a shadow if we don't have one.
-            return;
-        }
-
-        final int top = shadowView.getTop();
-        final int bottom = shadowView.getBottom();
-
-        final int shadowWidth = shadowDrawable.getIntrinsicWidth();
-        final int left;
-        final int right;
-        if (isLayoutRtlSupport()) {
-            left = shadowView.getRight();
-            right = left + shadowWidth;
-        } else {
-            right = shadowView.getLeft();
-            left = right - shadowWidth;
-        }
-
-        shadowDrawable.setBounds(left, top, right, bottom);
-        shadowDrawable.draw(c);
-    }
-
-    private void parallaxOtherViews(float slideOffset) {
-        final boolean isLayoutRtl = isLayoutRtlSupport();
-        final LayoutParams slideLp = (LayoutParams) mSlideableView.getLayoutParams();
-        final boolean dimViews = slideLp.dimWhenOffset &&
-                (isLayoutRtl ? slideLp.rightMargin : slideLp.leftMargin) <= 0;
-        final int childCount = getChildCount();
-        for (int i = 0; i < childCount; i++) {
-            final View v = getChildAt(i);
-            if (v == mSlideableView) continue;
-
-            final int oldOffset = (int) ((1 - mParallaxOffset) * mParallaxBy);
-            mParallaxOffset = slideOffset;
-            final int newOffset = (int) ((1 - slideOffset) * mParallaxBy);
-            final int dx = oldOffset - newOffset;
-
-            v.offsetLeftAndRight(isLayoutRtl ? -dx : dx);
-
-            if (dimViews) {
-                dimChildView(v, isLayoutRtl ? mParallaxOffset - 1 :
-                    1 - mParallaxOffset, mCoveredFadeColor);
-            }
-        }
-    }
-
-    /**
-     * Tests scrollability within child views of v given a delta of dx.
-     *
-     * @param v View to test for horizontal scrollability
-     * @param checkV Whether the view v passed should itself be checked for scrollability (true),
-     *               or just its children (false).
-     * @param dx Delta scrolled in pixels
-     * @param x X coordinate of the active touch point
-     * @param y Y coordinate of the active touch point
-     * @return true if child views of v can be scrolled by delta of dx.
-     */
-    protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) {
-        if (v instanceof ViewGroup) {
-            final ViewGroup group = (ViewGroup) v;
-            final int scrollX = v.getScrollX();
-            final int scrollY = v.getScrollY();
-            final int count = group.getChildCount();
-            // Count backwards - let topmost views consume scroll distance first.
-            for (int i = count - 1; i >= 0; i--) {
-                // TODO: Add versioned support here for transformed views.
-                // This will not work for transformed views in Honeycomb+
-                final View child = group.getChildAt(i);
-                if (x + scrollX >= child.getLeft() && x + scrollX < child.getRight() &&
-                        y + scrollY >= child.getTop() && y + scrollY < child.getBottom() &&
-                        canScroll(child, true, dx, x + scrollX - child.getLeft(),
-                                y + scrollY - child.getTop())) {
-                    return true;
-                }
-            }
-        }
-
-        return checkV && ViewCompat.canScrollHorizontally(v, (isLayoutRtlSupport() ? dx : -dx));
-    }
-
-    boolean isDimmed(View child) {
-        if (child == null) {
-            return false;
-        }
-        final LayoutParams lp = (LayoutParams) child.getLayoutParams();
-        return mCanSlide && lp.dimWhenOffset && mSlideOffset > 0;
-    }
-
-    @Override
-    protected ViewGroup.LayoutParams generateDefaultLayoutParams() {
-        return new LayoutParams();
-    }
-
-    @Override
-    protected ViewGroup.LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) {
-        return p instanceof MarginLayoutParams
-                ? new LayoutParams((MarginLayoutParams) p)
-                : new LayoutParams(p);
-    }
-
-    @Override
-    protected boolean checkLayoutParams(ViewGroup.LayoutParams p) {
-        return p instanceof LayoutParams && super.checkLayoutParams(p);
-    }
-
-    @Override
-    public ViewGroup.LayoutParams generateLayoutParams(AttributeSet attrs) {
-        return new LayoutParams(getContext(), attrs);
-    }
-
-    @Override
-    protected Parcelable onSaveInstanceState() {
-        Parcelable superState = super.onSaveInstanceState();
-
-        SavedState ss = new SavedState(superState);
-        ss.isOpen = isSlideable() ? isOpen() : mPreservedOpenState;
-
-        return ss;
-    }
-
-    @Override
-    protected void onRestoreInstanceState(Parcelable state) {
-        if (!(state instanceof SavedState)) {
-            super.onRestoreInstanceState(state);
-            return;
-        }
-
-        SavedState ss = (SavedState) state;
-        super.onRestoreInstanceState(ss.getSuperState());
-
-        if (ss.isOpen) {
-            openPane();
-        } else {
-            closePane();
-        }
-        mPreservedOpenState = ss.isOpen;
-    }
-
-    private class DragHelperCallback extends ViewDragHelper.Callback {
-
-        @Override
-        public boolean tryCaptureView(View child, int pointerId) {
-            if (mIsUnableToDrag) {
-                return false;
-            }
-
-            return ((LayoutParams) child.getLayoutParams()).slideable;
-        }
-
-        @Override
-        public void onViewDragStateChanged(int state) {
-            if (mDragHelper.getViewDragState() == ViewDragHelper.STATE_IDLE) {
-                if (mSlideOffset == 0) {
-                    updateObscuredViewsVisibility(mSlideableView);
-                    dispatchOnPanelClosed(mSlideableView);
-                    mPreservedOpenState = false;
-                } else {
-                    dispatchOnPanelOpened(mSlideableView);
-                    mPreservedOpenState = true;
-                }
-            }
-        }
-
-        @Override
-        public void onViewCaptured(View capturedChild, int activePointerId) {
-            // Make all child views visible in preparation for sliding things around
-            setAllChildrenVisible();
-        }
-
-        @Override
-        public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) {
-            onPanelDragged(left);
-            invalidate();
-        }
-
-        @Override
-        public void onViewReleased(View releasedChild, float xvel, float yvel) {
-            final LayoutParams lp = (LayoutParams) releasedChild.getLayoutParams();
-
-            int left;
-            if (isLayoutRtlSupport()) {
-                int startToRight =  getPaddingRight() + lp.rightMargin;
-                if (xvel < 0 || (xvel == 0 && mSlideOffset > 0.5f)) {
-                    startToRight += mSlideRange;
-                }
-                int childWidth = mSlideableView.getWidth();
-                left = getWidth() - startToRight - childWidth;
-            } else {
-                left = getPaddingLeft() + lp.leftMargin;
-                if (xvel > 0 || (xvel == 0 && mSlideOffset > 0.5f)) {
-                    left += mSlideRange;
-                }
-            }
-            mDragHelper.settleCapturedViewAt(left, releasedChild.getTop());
-            invalidate();
-        }
-
-        @Override
-        public int getViewHorizontalDragRange(View child) {
-            return mSlideRange;
-        }
-
-        @Override
-        public int clampViewPositionHorizontal(View child, int left, int dx) {
-            final LayoutParams lp = (LayoutParams) mSlideableView.getLayoutParams();
-
-            final int newLeft;
-            if (isLayoutRtlSupport()) {
-                int startBound = getWidth() -
-                        (getPaddingRight() + lp.rightMargin + mSlideableView.getWidth());
-                int endBound =  startBound - mSlideRange;
-                newLeft = Math.max(Math.min(left, startBound), endBound);
-            } else {
-                int startBound = getPaddingLeft() + lp.leftMargin;
-                int endBound = startBound + mSlideRange;
-                newLeft = Math.min(Math.max(left, startBound), endBound);
-            }
-            return newLeft;
-        }
-
-        @Override
-        public int clampViewPositionVertical(View child, int top, int dy) {
-            // Make sure we never move views vertically.
-            // This could happen if the child has less height than its parent.
-            return child.getTop();
-        }
-
-        @Override
-        public void onEdgeDragStarted(int edgeFlags, int pointerId) {
-            mDragHelper.captureChildView(mSlideableView, pointerId);
-        }
-    }
-
-    public static class LayoutParams extends ViewGroup.MarginLayoutParams {
-        private static final int[] ATTRS = new int[] {
-            android.R.attr.layout_weight
-        };
-
-        /**
-         * The weighted proportion of how much of the leftover space
-         * this child should consume after measurement.
-         */
-        public float weight = 0;
-
-        /**
-         * True if this pane is the slideable pane in the layout.
-         */
-        boolean slideable;
-
-        /**
-         * True if this view should be drawn dimmed
-         * when it's been offset from its default position.
-         */
-        boolean dimWhenOffset;
-
-        Paint dimPaint;
-
-        public LayoutParams() {
-            super(FILL_PARENT, FILL_PARENT);
-        }
-
-        public LayoutParams(int width, int height) {
-            super(width, height);
-        }
-
-        public LayoutParams(android.view.ViewGroup.LayoutParams source) {
-            super(source);
-        }
-
-        public LayoutParams(MarginLayoutParams source) {
-            super(source);
-        }
-
-        public LayoutParams(LayoutParams source) {
-            super(source);
-            this.weight = source.weight;
-        }
-
-        public LayoutParams(Context c, AttributeSet attrs) {
-            super(c, attrs);
-
-            final TypedArray a = c.obtainStyledAttributes(attrs, ATTRS);
-            this.weight = a.getFloat(0, 0);
-            a.recycle();
-        }
-
-    }
-
-    static class SavedState extends AbsSavedState {
-        boolean isOpen;
-
-        SavedState(Parcelable superState) {
-            super(superState);
-        }
-
-        private SavedState(Parcel in, ClassLoader loader) {
-            super(in, loader);
-            isOpen = in.readInt() != 0;
-        }
-
-        @Override
-        public void writeToParcel(Parcel out, int flags) {
-            super.writeToParcel(out, flags);
-            out.writeInt(isOpen ? 1 : 0);
-        }
-
-        public static final Creator<SavedState> CREATOR = ParcelableCompat.newCreator(
-                new ParcelableCompatCreatorCallbacks<SavedState>() {
-                    @Override
-                    public SavedState createFromParcel(Parcel in, ClassLoader loader) {
-                        return new SavedState(in, loader);
-                    }
-
-                    @Override
-                    public SavedState[] newArray(int size) {
-                        return new SavedState[size];
-                    }
-                });
-    }
-
-    interface SlidingPanelLayoutImpl {
-        void invalidateChildRegion(SlidingPaneLayout parent, View child);
-    }
-
-    static class SlidingPanelLayoutImplBase implements SlidingPanelLayoutImpl {
-        public void invalidateChildRegion(SlidingPaneLayout parent, View child) {
-            ViewCompat.postInvalidateOnAnimation(parent, child.getLeft(), child.getTop(),
-                    child.getRight(), child.getBottom());
-        }
-    }
-
-    static class SlidingPanelLayoutImplJB extends SlidingPanelLayoutImplBase {
-        /*
-         * Private API hacks! Nasty! Bad!
-         *
-         * In Jellybean, some optimizations in the hardware UI renderer
-         * prevent a changed Paint on a View using a hardware layer from having
-         * the intended effect. This twiddles some internal bits on the view to force
-         * it to recreate the display list.
-         */
-        private Method mGetDisplayList;
-        private Field mRecreateDisplayList;
-
-        SlidingPanelLayoutImplJB() {
-            try {
-                mGetDisplayList = View.class.getDeclaredMethod("getDisplayList", (Class[]) null);
-            } catch (NoSuchMethodException e) {
-                Log.e(TAG, "Couldn't fetch getDisplayList method; dimming won't work right.", e);
-            }
-            try {
-                mRecreateDisplayList = View.class.getDeclaredField("mRecreateDisplayList");
-                mRecreateDisplayList.setAccessible(true);
-            } catch (NoSuchFieldException e) {
-                Log.e(TAG, "Couldn't fetch mRecreateDisplayList field; dimming will be slow.", e);
-            }
-        }
-
-        @Override
-        public void invalidateChildRegion(SlidingPaneLayout parent, View child) {
-            if (mGetDisplayList != null && mRecreateDisplayList != null) {
-                try {
-                    mRecreateDisplayList.setBoolean(child, true);
-                    mGetDisplayList.invoke(child, (Object[]) null);
-                } catch (Exception e) {
-                    Log.e(TAG, "Error refreshing display list state", e);
-                }
-            } else {
-                // Slow path. REALLY slow path. Let's hope we don't get here.
-                child.invalidate();
-                return;
-            }
-            super.invalidateChildRegion(parent, child);
-        }
-    }
-
-    static class SlidingPanelLayoutImplJBMR1 extends SlidingPanelLayoutImplBase {
-        @Override
-        public void invalidateChildRegion(SlidingPaneLayout parent, View child) {
-            ViewCompat.setLayerPaint(child, ((LayoutParams) child.getLayoutParams()).dimPaint);
-        }
-    }
-
-    class AccessibilityDelegate extends AccessibilityDelegateCompat {
-        private final Rect mTmpRect = new Rect();
-
-        @Override
-        public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfoCompat info) {
-            final AccessibilityNodeInfoCompat superNode = AccessibilityNodeInfoCompat.obtain(info);
-            super.onInitializeAccessibilityNodeInfo(host, superNode);
-            copyNodeInfoNoChildren(info, superNode);
-            superNode.recycle();
-
-            info.setClassName(SlidingPaneLayout.class.getName());
-            info.setSource(host);
-
-            final ViewParent parent = ViewCompat.getParentForAccessibility(host);
-            if (parent instanceof View) {
-                info.setParent((View) parent);
-            }
-
-            // This is a best-approximation of addChildrenForAccessibility()
-            // that accounts for filtering.
-            final int childCount = getChildCount();
-            for (int i = 0; i < childCount; i++) {
-                final View child = getChildAt(i);
-                if (!filter(child) && (child.getVisibility() == View.VISIBLE)) {
-                    // Force importance to "yes" since we can't read the value.
-                    ViewCompat.setImportantForAccessibility(
-                            child, ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_YES);
-                    info.addChild(child);
-                }
-            }
-        }
-
-        @Override
-        public void onInitializeAccessibilityEvent(View host, AccessibilityEvent event) {
-            super.onInitializeAccessibilityEvent(host, event);
-
-            event.setClassName(SlidingPaneLayout.class.getName());
-        }
-
-        @Override
-        public boolean onRequestSendAccessibilityEvent(ViewGroup host, View child,
-                AccessibilityEvent event) {
-            if (!filter(child)) {
-                return super.onRequestSendAccessibilityEvent(host, child, event);
-            }
-            return false;
-        }
-
-        public boolean filter(View child) {
-            return isDimmed(child);
-        }
-
-        /**
-         * This should really be in AccessibilityNodeInfoCompat, but there unfortunately
-         * seem to be a few elements that are not easily cloneable using the underlying API.
-         * Leave it private here as it's not general-purpose useful.
-         */
-        private void copyNodeInfoNoChildren(AccessibilityNodeInfoCompat dest,
-                AccessibilityNodeInfoCompat src) {
-            final Rect rect = mTmpRect;
-
-            src.getBoundsInParent(rect);
-            dest.setBoundsInParent(rect);
-
-            src.getBoundsInScreen(rect);
-            dest.setBoundsInScreen(rect);
-
-            dest.setVisibleToUser(src.isVisibleToUser());
-            dest.setPackageName(src.getPackageName());
-            dest.setClassName(src.getClassName());
-            dest.setContentDescription(src.getContentDescription());
-
-            dest.setEnabled(src.isEnabled());
-            dest.setClickable(src.isClickable());
-            dest.setFocusable(src.isFocusable());
-            dest.setFocused(src.isFocused());
-            dest.setAccessibilityFocused(src.isAccessibilityFocused());
-            dest.setSelected(src.isSelected());
-            dest.setLongClickable(src.isLongClickable());
-
-            dest.addAction(src.getActions());
-
-            dest.setMovementGranularities(src.getMovementGranularities());
-        }
-    }
-
-    private class DisableLayerRunnable implements Runnable {
-        final View mChildView;
-
-        DisableLayerRunnable(View childView) {
-            mChildView = childView;
-        }
-
-        @Override
-        public void run() {
-            if (mChildView.getParent() == SlidingPaneLayout.this) {
-                ViewCompat.setLayerType(mChildView, ViewCompat.LAYER_TYPE_NONE, null);
-                invalidateChildRegion(mChildView);
-            }
-            mPostedRunnables.remove(this);
-        }
-    }
-
-    private boolean isLayoutRtlSupport() {
-        return ViewCompat.getLayoutDirection(this) == ViewCompat.LAYOUT_DIRECTION_RTL;
-    }
-}
diff --git a/v4/java/android/support/v4/widget/SwipeRefreshLayout.java b/v4/java/android/support/v4/widget/SwipeRefreshLayout.java
deleted file mode 100644
index 2059557..0000000
--- a/v4/java/android/support/v4/widget/SwipeRefreshLayout.java
+++ /dev/null
@@ -1,1164 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.support.v4.widget;
-
-import android.content.Context;
-import android.content.res.Resources;
-import android.content.res.TypedArray;
-import android.support.annotation.ColorInt;
-import android.support.annotation.ColorRes;
-import android.support.annotation.VisibleForTesting;
-import android.support.v4.view.MotionEventCompat;
-import android.support.v4.view.NestedScrollingChild;
-import android.support.v4.view.NestedScrollingChildHelper;
-import android.support.v4.view.NestedScrollingParent;
-import android.support.v4.view.NestedScrollingParentHelper;
-import android.support.v4.view.ViewCompat;
-import android.util.AttributeSet;
-import android.util.DisplayMetrics;
-import android.util.Log;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.ViewConfiguration;
-import android.view.ViewGroup;
-import android.view.animation.Animation;
-import android.view.animation.Animation.AnimationListener;
-import android.view.animation.DecelerateInterpolator;
-import android.view.animation.Transformation;
-import android.widget.AbsListView;
-
-/**
- * The SwipeRefreshLayout should be used whenever the user can refresh the
- * contents of a view via a vertical swipe gesture. The activity that
- * instantiates this view should add an OnRefreshListener to be notified
- * whenever the swipe to refresh gesture is completed. The SwipeRefreshLayout
- * will notify the listener each and every time the gesture is completed again;
- * the listener is responsible for correctly determining when to actually
- * initiate a refresh of its content. If the listener determines there should
- * not be a refresh, it must call setRefreshing(false) to cancel any visual
- * indication of a refresh. If an activity wishes to show just the progress
- * animation, it should call setRefreshing(true). To disable the gesture and
- * progress animation, call setEnabled(false) on the view.
- * <p>
- * This layout should be made the parent of the view that will be refreshed as a
- * result of the gesture and can only support one direct child. This view will
- * also be made the target of the gesture and will be forced to match both the
- * width and the height supplied in this layout. The SwipeRefreshLayout does not
- * provide accessibility events; instead, a menu item must be provided to allow
- * refresh of the content wherever this gesture is used.
- * </p>
- */
-public class SwipeRefreshLayout extends ViewGroup implements NestedScrollingParent,
-        NestedScrollingChild {
-    // Maps to ProgressBar.Large style
-    public static final int LARGE = MaterialProgressDrawable.LARGE;
-    // Maps to ProgressBar default style
-    public static final int DEFAULT = MaterialProgressDrawable.DEFAULT;
-
-    @VisibleForTesting
-    static final int CIRCLE_DIAMETER = 40;
-    @VisibleForTesting
-    static final int CIRCLE_DIAMETER_LARGE = 56;
-
-    private static final String LOG_TAG = SwipeRefreshLayout.class.getSimpleName();
-
-    private static final int MAX_ALPHA = 255;
-    private static final int STARTING_PROGRESS_ALPHA = (int) (.3f * MAX_ALPHA);
-
-    private static final float DECELERATE_INTERPOLATION_FACTOR = 2f;
-    private static final int INVALID_POINTER = -1;
-    private static final float DRAG_RATE = .5f;
-
-    // Max amount of circle that can be filled by progress during swipe gesture,
-    // where 1.0 is a full circle
-    private static final float MAX_PROGRESS_ANGLE = .8f;
-
-    private static final int SCALE_DOWN_DURATION = 150;
-
-    private static final int ALPHA_ANIMATION_DURATION = 300;
-
-    private static final int ANIMATE_TO_TRIGGER_DURATION = 200;
-
-    private static final int ANIMATE_TO_START_DURATION = 200;
-
-    // Default background for the progress spinner
-    private static final int CIRCLE_BG_LIGHT = 0xFFFAFAFA;
-    // Default offset in dips from the top of the view to where the progress spinner should stop
-    private static final int DEFAULT_CIRCLE_TARGET = 64;
-
-    private View mTarget; // the target of the gesture
-    private OnRefreshListener mListener;
-    private boolean mRefreshing = false;
-    private int mTouchSlop;
-    private float mTotalDragDistance = -1;
-
-    // If nested scrolling is enabled, the total amount that needed to be
-    // consumed by this as the nested scrolling parent is used in place of the
-    // overscroll determined by MOVE events in the onTouch handler
-    private float mTotalUnconsumed;
-    private final NestedScrollingParentHelper mNestedScrollingParentHelper;
-    private final NestedScrollingChildHelper mNestedScrollingChildHelper;
-    private final int[] mParentScrollConsumed = new int[2];
-    private final int[] mParentOffsetInWindow = new int[2];
-    private boolean mNestedScrollInProgress;
-
-    private int mMediumAnimationDuration;
-    private int mCurrentTargetOffsetTop;
-    // Whether or not the starting offset has been determined.
-    private boolean mOriginalOffsetCalculated = false;
-
-    private float mInitialMotionY;
-    private float mInitialDownY;
-    private boolean mIsBeingDragged;
-    private int mActivePointerId = INVALID_POINTER;
-    // Whether this item is scaled up rather than clipped
-    private boolean mScale;
-
-    // Target is returning to its start offset because it was cancelled or a
-    // refresh was triggered.
-    private boolean mReturningToStart;
-    private final DecelerateInterpolator mDecelerateInterpolator;
-    private static final int[] LAYOUT_ATTRS = new int[] {
-        android.R.attr.enabled
-    };
-
-    private CircleImageView mCircleView;
-    private int mCircleViewIndex = -1;
-
-    protected int mFrom;
-
-    private float mStartingScale;
-
-    protected int mOriginalOffsetTop;
-
-    private MaterialProgressDrawable mProgress;
-
-    private Animation mScaleAnimation;
-
-    private Animation mScaleDownAnimation;
-
-    private Animation mAlphaStartAnimation;
-
-    private Animation mAlphaMaxAnimation;
-
-    private Animation mScaleDownToStartAnimation;
-
-    private float mSpinnerFinalOffset;
-
-    private boolean mNotify;
-
-    private int mCircleWidth;
-
-    private int mCircleHeight;
-
-    // Whether the client has set a custom starting position;
-    private boolean mUsingCustomStart;
-
-    private Animation.AnimationListener mRefreshListener = new Animation.AnimationListener() {
-        @Override
-        public void onAnimationStart(Animation animation) {
-        }
-
-        @Override
-        public void onAnimationRepeat(Animation animation) {
-        }
-
-        @Override
-        public void onAnimationEnd(Animation animation) {
-            if (mRefreshing) {
-                // Make sure the progress view is fully visible
-                mProgress.setAlpha(MAX_ALPHA);
-                mProgress.start();
-                if (mNotify) {
-                    if (mListener != null) {
-                        mListener.onRefresh();
-                    }
-                }
-                mCurrentTargetOffsetTop = mCircleView.getTop();
-            } else {
-                reset();
-            }
-        }
-    };
-
-    private void reset() {
-        mCircleView.clearAnimation();
-        mProgress.stop();
-        mCircleView.setVisibility(View.GONE);
-        setColorViewAlpha(MAX_ALPHA);
-        // Return the circle to its start position
-        if (mScale) {
-            setAnimationProgress(0 /* animation complete and view is hidden */);
-        } else {
-            setTargetOffsetTopAndBottom(mOriginalOffsetTop - mCurrentTargetOffsetTop,
-                    true /* requires update */);
-        }
-        mCurrentTargetOffsetTop = mCircleView.getTop();
-    }
-
-    @Override
-    protected void onDetachedFromWindow() {
-        super.onDetachedFromWindow();
-        reset();
-    }
-
-    private void setColorViewAlpha(int targetAlpha) {
-        mCircleView.getBackground().setAlpha(targetAlpha);
-        mProgress.setAlpha(targetAlpha);
-    }
-
-    /**
-     * The refresh indicator starting and resting position is always positioned
-     * near the top of the refreshing content. This position is a consistent
-     * location, but can be adjusted in either direction based on whether or not
-     * there is a toolbar or actionbar present.
-     *
-     * @param scale Set to true if there is no view at a higher z-order than
-     *            where the progress spinner is set to appear.
-     * @param start The offset in pixels from the top of this view at which the
-     *            progress spinner should appear.
-     * @param end The offset in pixels from the top of this view at which the
-     *            progress spinner should come to rest after a successful swipe
-     *            gesture.
-     */
-    public void setProgressViewOffset(boolean scale, int start, int end) {
-        mScale = scale;
-        mCircleView.setVisibility(View.GONE);
-        mOriginalOffsetTop = mCurrentTargetOffsetTop = start;
-        mSpinnerFinalOffset = end;
-        mUsingCustomStart = true;
-        mCircleView.invalidate();
-    }
-
-    /**
-     * The refresh indicator resting position is always positioned near the top
-     * of the refreshing content. This position is a consistent location, but
-     * can be adjusted in either direction based on whether or not there is a
-     * toolbar or actionbar present.
-     *
-     * @param scale Set to true if there is no view at a higher z-order than
-     *            where the progress spinner is set to appear.
-     * @param end The offset in pixels from the top of this view at which the
-     *            progress spinner should come to rest after a successful swipe
-     *            gesture.
-     */
-    public void setProgressViewEndTarget(boolean scale, int end) {
-        mSpinnerFinalOffset = end;
-        mScale = scale;
-        mCircleView.invalidate();
-    }
-
-    /**
-     * One of DEFAULT, or LARGE.
-     */
-    public void setSize(int size) {
-        if (size != MaterialProgressDrawable.LARGE && size != MaterialProgressDrawable.DEFAULT) {
-            return;
-        }
-        final DisplayMetrics metrics = getResources().getDisplayMetrics();
-        if (size == MaterialProgressDrawable.LARGE) {
-            mCircleHeight = mCircleWidth = (int) (CIRCLE_DIAMETER_LARGE * metrics.density);
-        } else {
-            mCircleHeight = mCircleWidth = (int) (CIRCLE_DIAMETER * metrics.density);
-        }
-        // force the bounds of the progress circle inside the circle view to
-        // update by setting it to null before updating its size and then
-        // re-setting it
-        mCircleView.setImageDrawable(null);
-        mProgress.updateSizes(size);
-        mCircleView.setImageDrawable(mProgress);
-    }
-
-    /**
-     * Simple constructor to use when creating a SwipeRefreshLayout from code.
-     *
-     * @param context
-     */
-    public SwipeRefreshLayout(Context context) {
-        this(context, null);
-    }
-
-    /**
-     * Constructor that is called when inflating SwipeRefreshLayout from XML.
-     *
-     * @param context
-     * @param attrs
-     */
-    public SwipeRefreshLayout(Context context, AttributeSet attrs) {
-        super(context, attrs);
-
-        mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
-
-        mMediumAnimationDuration = getResources().getInteger(
-                android.R.integer.config_mediumAnimTime);
-
-        setWillNotDraw(false);
-        mDecelerateInterpolator = new DecelerateInterpolator(DECELERATE_INTERPOLATION_FACTOR);
-
-        final TypedArray a = context.obtainStyledAttributes(attrs, LAYOUT_ATTRS);
-        setEnabled(a.getBoolean(0, true));
-        a.recycle();
-
-        final DisplayMetrics metrics = getResources().getDisplayMetrics();
-        mCircleWidth = (int) (CIRCLE_DIAMETER * metrics.density);
-        mCircleHeight = (int) (CIRCLE_DIAMETER * metrics.density);
-
-        createProgressView();
-        ViewCompat.setChildrenDrawingOrderEnabled(this, true);
-        // the absolute offset has to take into account that the circle starts at an offset
-        mSpinnerFinalOffset = DEFAULT_CIRCLE_TARGET * metrics.density;
-        mTotalDragDistance = mSpinnerFinalOffset;
-        mNestedScrollingParentHelper = new NestedScrollingParentHelper(this);
-
-        mNestedScrollingChildHelper = new NestedScrollingChildHelper(this);
-        setNestedScrollingEnabled(true);
-    }
-
-    protected int getChildDrawingOrder(int childCount, int i) {
-        if (mCircleViewIndex < 0) {
-            return i;
-        } else if (i == childCount - 1) {
-            // Draw the selected child last
-            return mCircleViewIndex;
-        } else if (i >= mCircleViewIndex) {
-            // Move the children after the selected child earlier one
-            return i + 1;
-        } else {
-            // Keep the children before the selected child the same
-            return i;
-        }
-    }
-
-    private void createProgressView() {
-        mCircleView = new CircleImageView(getContext(), CIRCLE_BG_LIGHT, CIRCLE_DIAMETER/2);
-        mProgress = new MaterialProgressDrawable(getContext(), this);
-        mProgress.setBackgroundColor(CIRCLE_BG_LIGHT);
-        mCircleView.setImageDrawable(mProgress);
-        mCircleView.setVisibility(View.GONE);
-        addView(mCircleView);
-    }
-
-    /**
-     * Set the listener to be notified when a refresh is triggered via the swipe
-     * gesture.
-     */
-    public void setOnRefreshListener(OnRefreshListener listener) {
-        mListener = listener;
-    }
-
-    /**
-     * Pre API 11, alpha is used to make the progress circle appear instead of scale.
-     */
-    private boolean isAlphaUsedForScale() {
-        return android.os.Build.VERSION.SDK_INT < 11;
-    }
-
-    /**
-     * Notify the widget that refresh state has changed. Do not call this when
-     * refresh is triggered by a swipe gesture.
-     *
-     * @param refreshing Whether or not the view should show refresh progress.
-     */
-    public void setRefreshing(boolean refreshing) {
-        if (refreshing && mRefreshing != refreshing) {
-            // scale and show
-            mRefreshing = refreshing;
-            int endTarget = 0;
-            if (!mUsingCustomStart) {
-                endTarget = (int) (mSpinnerFinalOffset + mOriginalOffsetTop);
-            } else {
-                endTarget = (int) mSpinnerFinalOffset;
-            }
-            setTargetOffsetTopAndBottom(endTarget - mCurrentTargetOffsetTop,
-                    true /* requires update */);
-            mNotify = false;
-            startScaleUpAnimation(mRefreshListener);
-        } else {
-            setRefreshing(refreshing, false /* notify */);
-        }
-    }
-
-    private void startScaleUpAnimation(AnimationListener listener) {
-        mCircleView.setVisibility(View.VISIBLE);
-        if (android.os.Build.VERSION.SDK_INT >= 11) {
-            // Pre API 11, alpha is used in place of scale up to show the
-            // progress circle appearing.
-            // Don't adjust the alpha during appearance otherwise.
-            mProgress.setAlpha(MAX_ALPHA);
-        }
-        mScaleAnimation = new Animation() {
-            @Override
-            public void applyTransformation(float interpolatedTime, Transformation t) {
-                setAnimationProgress(interpolatedTime);
-            }
-        };
-        mScaleAnimation.setDuration(mMediumAnimationDuration);
-        if (listener != null) {
-            mCircleView.setAnimationListener(listener);
-        }
-        mCircleView.clearAnimation();
-        mCircleView.startAnimation(mScaleAnimation);
-    }
-
-    /**
-     * Pre API 11, this does an alpha animation.
-     * @param progress
-     */
-    private void setAnimationProgress(float progress) {
-        if (isAlphaUsedForScale()) {
-            setColorViewAlpha((int) (progress * MAX_ALPHA));
-        } else {
-            ViewCompat.setScaleX(mCircleView, progress);
-            ViewCompat.setScaleY(mCircleView, progress);
-        }
-    }
-
-    private void setRefreshing(boolean refreshing, final boolean notify) {
-        if (mRefreshing != refreshing) {
-            mNotify = notify;
-            ensureTarget();
-            mRefreshing = refreshing;
-            if (mRefreshing) {
-                animateOffsetToCorrectPosition(mCurrentTargetOffsetTop, mRefreshListener);
-            } else {
-                startScaleDownAnimation(mRefreshListener);
-            }
-        }
-    }
-
-    private void startScaleDownAnimation(Animation.AnimationListener listener) {
-        mScaleDownAnimation = new Animation() {
-            @Override
-            public void applyTransformation(float interpolatedTime, Transformation t) {
-                setAnimationProgress(1 - interpolatedTime);
-            }
-        };
-        mScaleDownAnimation.setDuration(SCALE_DOWN_DURATION);
-        mCircleView.setAnimationListener(listener);
-        mCircleView.clearAnimation();
-        mCircleView.startAnimation(mScaleDownAnimation);
-    }
-
-    private void startProgressAlphaStartAnimation() {
-        mAlphaStartAnimation = startAlphaAnimation(mProgress.getAlpha(), STARTING_PROGRESS_ALPHA);
-    }
-
-    private void startProgressAlphaMaxAnimation() {
-        mAlphaMaxAnimation = startAlphaAnimation(mProgress.getAlpha(), MAX_ALPHA);
-    }
-
-    private Animation startAlphaAnimation(final int startingAlpha, final int endingAlpha) {
-        // Pre API 11, alpha is used in place of scale. Don't also use it to
-        // show the trigger point.
-        if (mScale && isAlphaUsedForScale()) {
-            return null;
-        }
-        Animation alpha = new Animation() {
-            @Override
-            public void applyTransformation(float interpolatedTime, Transformation t) {
-                mProgress
-                        .setAlpha((int) (startingAlpha+ ((endingAlpha - startingAlpha)
-                                * interpolatedTime)));
-            }
-        };
-        alpha.setDuration(ALPHA_ANIMATION_DURATION);
-        // Clear out the previous animation listeners.
-        mCircleView.setAnimationListener(null);
-        mCircleView.clearAnimation();
-        mCircleView.startAnimation(alpha);
-        return alpha;
-    }
-
-    /**
-     * @deprecated Use {@link #setProgressBackgroundColorSchemeResource(int)}
-     */
-    @Deprecated
-    public void setProgressBackgroundColor(int colorRes) {
-        setProgressBackgroundColorSchemeResource(colorRes);
-    }
-
-    /**
-     * Set the background color of the progress spinner disc.
-     *
-     * @param colorRes Resource id of the color.
-     */
-    public void setProgressBackgroundColorSchemeResource(@ColorRes int colorRes) {
-        setProgressBackgroundColorSchemeColor(getResources().getColor(colorRes));
-    }
-
-    /**
-     * Set the background color of the progress spinner disc.
-     *
-     * @param color
-     */
-    public void setProgressBackgroundColorSchemeColor(@ColorInt int color) {
-        mCircleView.setBackgroundColor(color);
-        mProgress.setBackgroundColor(color);
-    }
-
-    /**
-     * @deprecated Use {@link #setColorSchemeResources(int...)}
-     */
-    @Deprecated
-    public void setColorScheme(@ColorInt int... colors) {
-        setColorSchemeResources(colors);
-    }
-
-    /**
-     * Set the color resources used in the progress animation from color resources.
-     * The first color will also be the color of the bar that grows in response
-     * to a user swipe gesture.
-     *
-     * @param colorResIds
-     */
-    public void setColorSchemeResources(@ColorRes int... colorResIds) {
-        final Resources res = getResources();
-        int[] colorRes = new int[colorResIds.length];
-        for (int i = 0; i < colorResIds.length; i++) {
-            colorRes[i] = res.getColor(colorResIds[i]);
-        }
-        setColorSchemeColors(colorRes);
-    }
-
-    /**
-     * Set the colors used in the progress animation. The first
-     * color will also be the color of the bar that grows in response to a user
-     * swipe gesture.
-     *
-     * @param colors
-     */
-    public void setColorSchemeColors(@ColorInt int... colors) {
-        ensureTarget();
-        mProgress.setColorSchemeColors(colors);
-    }
-
-    /**
-     * @return Whether the SwipeRefreshWidget is actively showing refresh
-     *         progress.
-     */
-    public boolean isRefreshing() {
-        return mRefreshing;
-    }
-
-    private void ensureTarget() {
-        // Don't bother getting the parent height if the parent hasn't been laid
-        // out yet.
-        if (mTarget == null) {
-            for (int i = 0; i < getChildCount(); i++) {
-                View child = getChildAt(i);
-                if (!child.equals(mCircleView)) {
-                    mTarget = child;
-                    break;
-                }
-            }
-        }
-    }
-
-    /**
-     * Set the distance to trigger a sync in dips
-     *
-     * @param distance
-     */
-    public void setDistanceToTriggerSync(int distance) {
-        mTotalDragDistance = distance;
-    }
-
-    @Override
-    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
-        final int width = getMeasuredWidth();
-        final int height = getMeasuredHeight();
-        if (getChildCount() == 0) {
-            return;
-        }
-        if (mTarget == null) {
-            ensureTarget();
-        }
-        if (mTarget == null) {
-            return;
-        }
-        final View child = mTarget;
-        final int childLeft = getPaddingLeft();
-        final int childTop = getPaddingTop();
-        final int childWidth = width - getPaddingLeft() - getPaddingRight();
-        final int childHeight = height - getPaddingTop() - getPaddingBottom();
-        child.layout(childLeft, childTop, childLeft + childWidth, childTop + childHeight);
-        int circleWidth = mCircleView.getMeasuredWidth();
-        int circleHeight = mCircleView.getMeasuredHeight();
-        mCircleView.layout((width / 2 - circleWidth / 2), mCurrentTargetOffsetTop,
-                (width / 2 + circleWidth / 2), mCurrentTargetOffsetTop + circleHeight);
-    }
-
-    @Override
-    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
-        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
-        if (mTarget == null) {
-            ensureTarget();
-        }
-        if (mTarget == null) {
-            return;
-        }
-        mTarget.measure(MeasureSpec.makeMeasureSpec(
-                getMeasuredWidth() - getPaddingLeft() - getPaddingRight(),
-                MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(
-                getMeasuredHeight() - getPaddingTop() - getPaddingBottom(), MeasureSpec.EXACTLY));
-        mCircleView.measure(MeasureSpec.makeMeasureSpec(mCircleWidth, MeasureSpec.EXACTLY),
-                MeasureSpec.makeMeasureSpec(mCircleHeight, MeasureSpec.EXACTLY));
-        if (!mUsingCustomStart && !mOriginalOffsetCalculated) {
-            mOriginalOffsetCalculated = true;
-            mCurrentTargetOffsetTop = mOriginalOffsetTop = -mCircleView.getMeasuredHeight();
-        }
-        mCircleViewIndex = -1;
-        // Get the index of the circleview.
-        for (int index = 0; index < getChildCount(); index++) {
-            if (getChildAt(index) == mCircleView) {
-                mCircleViewIndex = index;
-                break;
-            }
-        }
-    }
-
-    /**
-     * Get the diameter of the progress circle that is displayed as part of the
-     * swipe to refresh layout. This is not valid until a measure pass has
-     * completed.
-     *
-     * @return Diameter in pixels of the progress circle view.
-     */
-    public int getProgressCircleDiameter() {
-        return mCircleView != null ?mCircleView.getMeasuredHeight() : 0;
-    }
-
-    /**
-     * @return Whether it is possible for the child view of this layout to
-     *         scroll up. Override this if the child view is a custom view.
-     */
-    public boolean canChildScrollUp() {
-        if (android.os.Build.VERSION.SDK_INT < 14) {
-            if (mTarget instanceof AbsListView) {
-                final AbsListView absListView = (AbsListView) mTarget;
-                return absListView.getChildCount() > 0
-                        && (absListView.getFirstVisiblePosition() > 0 || absListView.getChildAt(0)
-                                .getTop() < absListView.getPaddingTop());
-            } else {
-                return ViewCompat.canScrollVertically(mTarget, -1) || mTarget.getScrollY() > 0;
-            }
-        } else {
-            return ViewCompat.canScrollVertically(mTarget, -1);
-        }
-    }
-
-    @Override
-    public boolean onInterceptTouchEvent(MotionEvent ev) {
-        ensureTarget();
-
-        final int action = MotionEventCompat.getActionMasked(ev);
-
-        if (mReturningToStart && action == MotionEvent.ACTION_DOWN) {
-            mReturningToStart = false;
-        }
-
-        if (!isEnabled() || mReturningToStart || canChildScrollUp()
-                || mRefreshing || mNestedScrollInProgress) {
-            // Fail fast if we're not in a state where a swipe is possible
-            return false;
-        }
-
-        switch (action) {
-            case MotionEvent.ACTION_DOWN:
-                setTargetOffsetTopAndBottom(mOriginalOffsetTop - mCircleView.getTop(), true);
-                mActivePointerId = MotionEventCompat.getPointerId(ev, 0);
-                mIsBeingDragged = false;
-                final float initialDownY = getMotionEventY(ev, mActivePointerId);
-                if (initialDownY == -1) {
-                    return false;
-                }
-                mInitialDownY = initialDownY;
-                break;
-
-            case MotionEvent.ACTION_MOVE:
-                if (mActivePointerId == INVALID_POINTER) {
-                    Log.e(LOG_TAG, "Got ACTION_MOVE event but don't have an active pointer id.");
-                    return false;
-                }
-
-                final float y = getMotionEventY(ev, mActivePointerId);
-                if (y == -1) {
-                    return false;
-                }
-                final float yDiff = y - mInitialDownY;
-                if (yDiff > mTouchSlop && !mIsBeingDragged) {
-                    mInitialMotionY = mInitialDownY + mTouchSlop;
-                    mIsBeingDragged = true;
-                    mProgress.setAlpha(STARTING_PROGRESS_ALPHA);
-                }
-                break;
-
-            case MotionEventCompat.ACTION_POINTER_UP:
-                onSecondaryPointerUp(ev);
-                break;
-
-            case MotionEvent.ACTION_UP:
-            case MotionEvent.ACTION_CANCEL:
-                mIsBeingDragged = false;
-                mActivePointerId = INVALID_POINTER;
-                break;
-        }
-
-        return mIsBeingDragged;
-    }
-
-    private float getMotionEventY(MotionEvent ev, int activePointerId) {
-        final int index = MotionEventCompat.findPointerIndex(ev, activePointerId);
-        if (index < 0) {
-            return -1;
-        }
-        return MotionEventCompat.getY(ev, index);
-    }
-
-    @Override
-    public void requestDisallowInterceptTouchEvent(boolean b) {
-        // if this is a List < L or another view that doesn't support nested
-        // scrolling, ignore this request so that the vertical scroll event
-        // isn't stolen
-        if ((android.os.Build.VERSION.SDK_INT < 21 && mTarget instanceof AbsListView)
-                || (mTarget != null && !ViewCompat.isNestedScrollingEnabled(mTarget))) {
-            // Nope.
-        } else {
-            super.requestDisallowInterceptTouchEvent(b);
-        }
-    }
-
-    // NestedScrollingParent
-
-    @Override
-    public boolean onStartNestedScroll(View child, View target, int nestedScrollAxes) {
-        return isEnabled() && !mReturningToStart && !mRefreshing
-                && (nestedScrollAxes & ViewCompat.SCROLL_AXIS_VERTICAL) != 0;
-    }
-
-    @Override
-    public void onNestedScrollAccepted(View child, View target, int axes) {
-        // Reset the counter of how much leftover scroll needs to be consumed.
-        mNestedScrollingParentHelper.onNestedScrollAccepted(child, target, axes);
-        // Dispatch up to the nested parent
-        startNestedScroll(axes & ViewCompat.SCROLL_AXIS_VERTICAL);
-        mTotalUnconsumed = 0;
-        mNestedScrollInProgress = true;
-    }
-
-    @Override
-    public void onNestedPreScroll(View target, int dx, int dy, int[] consumed) {
-        // If we are in the middle of consuming, a scroll, then we want to move the spinner back up
-        // before allowing the list to scroll
-        if (dy > 0 && mTotalUnconsumed > 0) {
-            if (dy > mTotalUnconsumed) {
-                consumed[1] = dy - (int) mTotalUnconsumed;
-                mTotalUnconsumed = 0;
-            } else {
-                mTotalUnconsumed -= dy;
-                consumed[1] = dy;
-            }
-            moveSpinner(mTotalUnconsumed);
-        }
-
-        // If a client layout is using a custom start position for the circle
-        // view, they mean to hide it again before scrolling the child view
-        // If we get back to mTotalUnconsumed == 0 and there is more to go, hide
-        // the circle so it isn't exposed if its blocking content is moved
-        if (mUsingCustomStart && dy > 0 && mTotalUnconsumed == 0
-                && Math.abs(dy - consumed[1]) > 0) {
-            mCircleView.setVisibility(View.GONE);
-        }
-
-        // Now let our nested parent consume the leftovers
-        final int[] parentConsumed = mParentScrollConsumed;
-        if (dispatchNestedPreScroll(dx - consumed[0], dy - consumed[1], parentConsumed, null)) {
-            consumed[0] += parentConsumed[0];
-            consumed[1] += parentConsumed[1];
-        }
-    }
-
-    @Override
-    public int getNestedScrollAxes() {
-        return mNestedScrollingParentHelper.getNestedScrollAxes();
-    }
-
-    @Override
-    public void onStopNestedScroll(View target) {
-        mNestedScrollingParentHelper.onStopNestedScroll(target);
-        mNestedScrollInProgress = false;
-        // Finish the spinner for nested scrolling if we ever consumed any
-        // unconsumed nested scroll
-        if (mTotalUnconsumed > 0) {
-            finishSpinner(mTotalUnconsumed);
-            mTotalUnconsumed = 0;
-        }
-        // Dispatch up our nested parent
-        stopNestedScroll();
-    }
-
-    @Override
-    public void onNestedScroll(final View target, final int dxConsumed, final int dyConsumed,
-            final int dxUnconsumed, final int dyUnconsumed) {
-        // Dispatch up to the nested parent first
-        dispatchNestedScroll(dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed,
-                mParentOffsetInWindow);
-
-        // This is a bit of a hack. Nested scrolling works from the bottom up, and as we are
-        // sometimes between two nested scrolling views, we need a way to be able to know when any
-        // nested scrolling parent has stopped handling events. We do that by using the
-        // 'offset in window 'functionality to see if we have been moved from the event.
-        // This is a decent indication of whether we should take over the event stream or not.
-        final int dy = dyUnconsumed + mParentOffsetInWindow[1];
-        if (dy < 0 && !canChildScrollUp()) {
-            mTotalUnconsumed += Math.abs(dy);
-            moveSpinner(mTotalUnconsumed);
-        }
-    }
-
-    // NestedScrollingChild
-
-    @Override
-    public void setNestedScrollingEnabled(boolean enabled) {
-        mNestedScrollingChildHelper.setNestedScrollingEnabled(enabled);
-    }
-
-    @Override
-    public boolean isNestedScrollingEnabled() {
-        return mNestedScrollingChildHelper.isNestedScrollingEnabled();
-    }
-
-    @Override
-    public boolean startNestedScroll(int axes) {
-        return mNestedScrollingChildHelper.startNestedScroll(axes);
-    }
-
-    @Override
-    public void stopNestedScroll() {
-        mNestedScrollingChildHelper.stopNestedScroll();
-    }
-
-    @Override
-    public boolean hasNestedScrollingParent() {
-        return mNestedScrollingChildHelper.hasNestedScrollingParent();
-    }
-
-    @Override
-    public boolean dispatchNestedScroll(int dxConsumed, int dyConsumed, int dxUnconsumed,
-            int dyUnconsumed, int[] offsetInWindow) {
-        return mNestedScrollingChildHelper.dispatchNestedScroll(dxConsumed, dyConsumed,
-                dxUnconsumed, dyUnconsumed, offsetInWindow);
-    }
-
-    @Override
-    public boolean dispatchNestedPreScroll(int dx, int dy, int[] consumed, int[] offsetInWindow) {
-        return mNestedScrollingChildHelper.dispatchNestedPreScroll(dx, dy, consumed, offsetInWindow);
-    }
-
-    @Override
-    public boolean onNestedPreFling(View target, float velocityX,
-            float velocityY) {
-        return dispatchNestedPreFling(velocityX, velocityY);
-    }
-
-    @Override
-    public boolean onNestedFling(View target, float velocityX, float velocityY,
-            boolean consumed) {
-        return dispatchNestedFling(velocityX, velocityY, consumed);
-    }
-
-    @Override
-    public boolean dispatchNestedFling(float velocityX, float velocityY, boolean consumed) {
-        return mNestedScrollingChildHelper.dispatchNestedFling(velocityX, velocityY, consumed);
-    }
-
-    @Override
-    public boolean dispatchNestedPreFling(float velocityX, float velocityY) {
-        return mNestedScrollingChildHelper.dispatchNestedPreFling(velocityX, velocityY);
-    }
-
-    private boolean isAnimationRunning(Animation animation) {
-        return animation != null && animation.hasStarted() && !animation.hasEnded();
-    }
-
-    private void moveSpinner(float overscrollTop) {
-        mProgress.showArrow(true);
-        float originalDragPercent = overscrollTop / mTotalDragDistance;
-
-        float dragPercent = Math.min(1f, Math.abs(originalDragPercent));
-        float adjustedPercent = (float) Math.max(dragPercent - .4, 0) * 5 / 3;
-        float extraOS = Math.abs(overscrollTop) - mTotalDragDistance;
-        float slingshotDist = mUsingCustomStart ? mSpinnerFinalOffset - mOriginalOffsetTop
-                : mSpinnerFinalOffset;
-        float tensionSlingshotPercent = Math.max(0, Math.min(extraOS, slingshotDist * 2)
-                / slingshotDist);
-        float tensionPercent = (float) ((tensionSlingshotPercent / 4) - Math.pow(
-                (tensionSlingshotPercent / 4), 2)) * 2f;
-        float extraMove = (slingshotDist) * tensionPercent * 2;
-
-        int targetY = mOriginalOffsetTop + (int) ((slingshotDist * dragPercent) + extraMove);
-        // where 1.0f is a full circle
-        if (mCircleView.getVisibility() != View.VISIBLE) {
-            mCircleView.setVisibility(View.VISIBLE);
-        }
-        if (!mScale) {
-            ViewCompat.setScaleX(mCircleView, 1f);
-            ViewCompat.setScaleY(mCircleView, 1f);
-        }
-
-        if (mScale) {
-            setAnimationProgress(Math.min(1f, overscrollTop / mTotalDragDistance));
-        }
-        if (overscrollTop < mTotalDragDistance) {
-            if (mProgress.getAlpha() > STARTING_PROGRESS_ALPHA
-                    && !isAnimationRunning(mAlphaStartAnimation)) {
-                // Animate the alpha
-                startProgressAlphaStartAnimation();
-            }
-        } else {
-            if (mProgress.getAlpha() < MAX_ALPHA && !isAnimationRunning(mAlphaMaxAnimation)) {
-                // Animate the alpha
-                startProgressAlphaMaxAnimation();
-            }
-        }
-        float strokeStart = adjustedPercent * .8f;
-        mProgress.setStartEndTrim(0f, Math.min(MAX_PROGRESS_ANGLE, strokeStart));
-        mProgress.setArrowScale(Math.min(1f, adjustedPercent));
-
-        float rotation = (-0.25f + .4f * adjustedPercent + tensionPercent * 2) * .5f;
-        mProgress.setProgressRotation(rotation);
-        setTargetOffsetTopAndBottom(targetY - mCurrentTargetOffsetTop, true /* requires update */);
-    }
-
-    private void finishSpinner(float overscrollTop) {
-        if (overscrollTop > mTotalDragDistance) {
-            setRefreshing(true, true /* notify */);
-        } else {
-            // cancel refresh
-            mRefreshing = false;
-            mProgress.setStartEndTrim(0f, 0f);
-            Animation.AnimationListener listener = null;
-            if (!mScale) {
-                listener = new Animation.AnimationListener() {
-
-                    @Override
-                    public void onAnimationStart(Animation animation) {
-                    }
-
-                    @Override
-                    public void onAnimationEnd(Animation animation) {
-                        if (!mScale) {
-                            startScaleDownAnimation(null);
-                        }
-                    }
-
-                    @Override
-                    public void onAnimationRepeat(Animation animation) {
-                    }
-
-                };
-            }
-            animateOffsetToStartPosition(mCurrentTargetOffsetTop, listener);
-            mProgress.showArrow(false);
-        }
-    }
-
-    @Override
-    public boolean onTouchEvent(MotionEvent ev) {
-        final int action = MotionEventCompat.getActionMasked(ev);
-        int pointerIndex = -1;
-
-        if (mReturningToStart && action == MotionEvent.ACTION_DOWN) {
-            mReturningToStart = false;
-        }
-
-        if (!isEnabled() || mReturningToStart || canChildScrollUp() || mNestedScrollInProgress) {
-            // Fail fast if we're not in a state where a swipe is possible
-            return false;
-        }
-
-        switch (action) {
-            case MotionEvent.ACTION_DOWN:
-                mActivePointerId = MotionEventCompat.getPointerId(ev, 0);
-                mIsBeingDragged = false;
-                break;
-
-            case MotionEvent.ACTION_MOVE: {
-                pointerIndex = MotionEventCompat.findPointerIndex(ev, mActivePointerId);
-                if (pointerIndex < 0) {
-                    Log.e(LOG_TAG, "Got ACTION_MOVE event but have an invalid active pointer id.");
-                    return false;
-                }
-
-                final float y = MotionEventCompat.getY(ev, pointerIndex);
-                final float overscrollTop = (y - mInitialMotionY) * DRAG_RATE;
-                if (mIsBeingDragged) {
-                    if (overscrollTop > 0) {
-                        moveSpinner(overscrollTop);
-                    } else {
-                        return false;
-                    }
-                }
-                break;
-            }
-            case MotionEventCompat.ACTION_POINTER_DOWN: {
-                pointerIndex = MotionEventCompat.getActionIndex(ev);
-                if (pointerIndex < 0) {
-                    Log.e(LOG_TAG, "Got ACTION_POINTER_DOWN event but have an invalid action index.");
-                    return false;
-                }
-                mActivePointerId = MotionEventCompat.getPointerId(ev, pointerIndex);
-                break;
-            }
-
-            case MotionEventCompat.ACTION_POINTER_UP:
-                onSecondaryPointerUp(ev);
-                break;
-
-            case MotionEvent.ACTION_UP: {
-                pointerIndex = MotionEventCompat.findPointerIndex(ev, mActivePointerId);
-                if (pointerIndex < 0) {
-                    Log.e(LOG_TAG, "Got ACTION_UP event but don't have an active pointer id.");
-                    return false;
-                }
-
-                final float y = MotionEventCompat.getY(ev, pointerIndex);
-                final float overscrollTop = (y - mInitialMotionY) * DRAG_RATE;
-                mIsBeingDragged = false;
-                finishSpinner(overscrollTop);
-                mActivePointerId = INVALID_POINTER;
-                return false;
-            }
-            case MotionEvent.ACTION_CANCEL:
-                return false;
-        }
-
-        return true;
-    }
-
-    private void animateOffsetToCorrectPosition(int from, AnimationListener listener) {
-        mFrom = from;
-        mAnimateToCorrectPosition.reset();
-        mAnimateToCorrectPosition.setDuration(ANIMATE_TO_TRIGGER_DURATION);
-        mAnimateToCorrectPosition.setInterpolator(mDecelerateInterpolator);
-        if (listener != null) {
-            mCircleView.setAnimationListener(listener);
-        }
-        mCircleView.clearAnimation();
-        mCircleView.startAnimation(mAnimateToCorrectPosition);
-    }
-
-    private void animateOffsetToStartPosition(int from, AnimationListener listener) {
-        if (mScale) {
-            // Scale the item back down
-            startScaleDownReturnToStartAnimation(from, listener);
-        } else {
-            mFrom = from;
-            mAnimateToStartPosition.reset();
-            mAnimateToStartPosition.setDuration(ANIMATE_TO_START_DURATION);
-            mAnimateToStartPosition.setInterpolator(mDecelerateInterpolator);
-            if (listener != null) {
-                mCircleView.setAnimationListener(listener);
-            }
-            mCircleView.clearAnimation();
-            mCircleView.startAnimation(mAnimateToStartPosition);
-        }
-    }
-
-    private final Animation mAnimateToCorrectPosition = new Animation() {
-        @Override
-        public void applyTransformation(float interpolatedTime, Transformation t) {
-            int targetTop = 0;
-            int endTarget = 0;
-            if (!mUsingCustomStart) {
-                endTarget = (int) (mSpinnerFinalOffset - Math.abs(mOriginalOffsetTop));
-            } else {
-                endTarget = (int) mSpinnerFinalOffset;
-            }
-            targetTop = (mFrom + (int) ((endTarget - mFrom) * interpolatedTime));
-            int offset = targetTop - mCircleView.getTop();
-            setTargetOffsetTopAndBottom(offset, false /* requires update */);
-            mProgress.setArrowScale(1 - interpolatedTime);
-        }
-    };
-
-    private void moveToStart(float interpolatedTime) {
-        int targetTop = 0;
-        targetTop = (mFrom + (int) ((mOriginalOffsetTop - mFrom) * interpolatedTime));
-        int offset = targetTop - mCircleView.getTop();
-        setTargetOffsetTopAndBottom(offset, false /* requires update */);
-    }
-
-    private final Animation mAnimateToStartPosition = new Animation() {
-        @Override
-        public void applyTransformation(float interpolatedTime, Transformation t) {
-            moveToStart(interpolatedTime);
-        }
-    };
-
-    private void startScaleDownReturnToStartAnimation(int from,
-            Animation.AnimationListener listener) {
-        mFrom = from;
-        if (isAlphaUsedForScale()) {
-            mStartingScale = mProgress.getAlpha();
-        } else {
-            mStartingScale = ViewCompat.getScaleX(mCircleView);
-        }
-        mScaleDownToStartAnimation = new Animation() {
-            @Override
-            public void applyTransformation(float interpolatedTime, Transformation t) {
-                float targetScale = (mStartingScale + (-mStartingScale  * interpolatedTime));
-                setAnimationProgress(targetScale);
-                moveToStart(interpolatedTime);
-            }
-        };
-        mScaleDownToStartAnimation.setDuration(SCALE_DOWN_DURATION);
-        if (listener != null) {
-            mCircleView.setAnimationListener(listener);
-        }
-        mCircleView.clearAnimation();
-        mCircleView.startAnimation(mScaleDownToStartAnimation);
-    }
-
-    private void setTargetOffsetTopAndBottom(int offset, boolean requiresUpdate) {
-        mCircleView.bringToFront();
-        mCircleView.offsetTopAndBottom(offset);
-        mCurrentTargetOffsetTop = mCircleView.getTop();
-        if (requiresUpdate && android.os.Build.VERSION.SDK_INT < 11) {
-            invalidate();
-        }
-    }
-
-    private void onSecondaryPointerUp(MotionEvent ev) {
-        final int pointerIndex = MotionEventCompat.getActionIndex(ev);
-        final int pointerId = MotionEventCompat.getPointerId(ev, pointerIndex);
-        if (pointerId == mActivePointerId) {
-            // This was our active pointer going up. Choose a new
-            // active pointer and adjust accordingly.
-            final int newPointerIndex = pointerIndex == 0 ? 1 : 0;
-            mActivePointerId = MotionEventCompat.getPointerId(ev, newPointerIndex);
-        }
-    }
-
-    /**
-     * Classes that wish to be notified when the swipe gesture correctly
-     * triggers a refresh should implement this interface.
-     */
-    public interface OnRefreshListener {
-        public void onRefresh();
-    }
-}
diff --git a/v4/java/android/support/v4/widget/TextViewCompat.java b/v4/java/android/support/v4/widget/TextViewCompat.java
deleted file mode 100644
index 510dde1..0000000
--- a/v4/java/android/support/v4/widget/TextViewCompat.java
+++ /dev/null
@@ -1,272 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.v4.widget;
-
-import android.graphics.drawable.Drawable;
-import android.os.Build;
-import android.support.annotation.DrawableRes;
-import android.support.annotation.IdRes;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.annotation.StyleRes;
-import android.widget.TextView;
-
-/**
- * Helper for accessing features in {@link TextView} introduced after API level
- * 4 in a backwards compatible fashion.
- */
-public final class TextViewCompat {
-
-    // Hide constructor
-    private TextViewCompat() {}
-
-    interface TextViewCompatImpl {
-        void setCompoundDrawablesRelative(@NonNull TextView textView,
-                @Nullable Drawable start, @Nullable Drawable top, @Nullable Drawable end,
-                @Nullable Drawable bottom);
-        void setCompoundDrawablesRelativeWithIntrinsicBounds(@NonNull TextView textView,
-                @Nullable Drawable start, @Nullable Drawable top, @Nullable Drawable end,
-                @Nullable Drawable bottom);
-        void setCompoundDrawablesRelativeWithIntrinsicBounds(@NonNull TextView textView,
-                @DrawableRes int start, @DrawableRes int top, @DrawableRes int end,
-                @DrawableRes int bottom);
-        int getMaxLines(TextView textView);
-        int getMinLines(TextView textView);
-        void setTextAppearance(@NonNull TextView textView, @StyleRes int resId);
-    }
-
-    static class BaseTextViewCompatImpl implements TextViewCompatImpl {
-        @Override
-        public void setCompoundDrawablesRelative(@NonNull TextView textView,
-                @Nullable Drawable start, @Nullable Drawable top, @Nullable Drawable end,
-                @Nullable Drawable bottom) {
-            textView.setCompoundDrawables(start, top, end, bottom);
-        }
-
-        @Override
-        public void setCompoundDrawablesRelativeWithIntrinsicBounds(@NonNull TextView textView,
-                @Nullable Drawable start, @Nullable Drawable top, @Nullable Drawable end,
-                @Nullable Drawable bottom) {
-            textView.setCompoundDrawablesWithIntrinsicBounds(start, top, end, bottom);
-        }
-
-        @Override
-        public void setCompoundDrawablesRelativeWithIntrinsicBounds(@NonNull TextView textView,
-                @DrawableRes int start, @DrawableRes int top, @DrawableRes int end,
-                @DrawableRes int bottom) {
-            textView.setCompoundDrawablesWithIntrinsicBounds(start, top, end, bottom);
-        }
-
-        @Override
-        public int getMaxLines(TextView textView) {
-            return TextViewCompatDonut.getMaxLines(textView);
-        }
-
-        @Override
-        public int getMinLines(TextView textView) {
-            return TextViewCompatDonut.getMinLines(textView);
-        }
-
-        @Override
-        public void setTextAppearance(TextView textView, @StyleRes int resId) {
-            TextViewCompatDonut.setTextAppearance(textView, resId);
-        }
-    }
-
-    static class JbTextViewCompatImpl extends BaseTextViewCompatImpl {
-        @Override
-        public int getMaxLines(TextView textView) {
-            return TextViewCompatJb.getMaxLines(textView);
-        }
-
-        @Override
-        public int getMinLines(TextView textView) {
-            return TextViewCompatJb.getMinLines(textView);
-        }
-    }
-
-    static class JbMr1TextViewCompatImpl extends JbTextViewCompatImpl {
-        @Override
-        public void setCompoundDrawablesRelative(@NonNull TextView textView,
-                @Nullable Drawable start, @Nullable Drawable top, @Nullable Drawable end,
-                @Nullable Drawable bottom) {
-            TextViewCompatJbMr1.setCompoundDrawablesRelative(textView, start, top, end, bottom);
-        }
-
-        @Override
-        public void setCompoundDrawablesRelativeWithIntrinsicBounds(@NonNull TextView textView,
-                @Nullable Drawable start, @Nullable Drawable top, @Nullable Drawable end,
-                @Nullable Drawable bottom) {
-            TextViewCompatJbMr1.setCompoundDrawablesRelativeWithIntrinsicBounds(textView,
-                    start, top, end, bottom);
-        }
-
-        @Override
-        public void setCompoundDrawablesRelativeWithIntrinsicBounds(@NonNull TextView textView,
-                @DrawableRes int start, @DrawableRes int top, @DrawableRes int end,
-                @DrawableRes int bottom) {
-            TextViewCompatJbMr1.setCompoundDrawablesRelativeWithIntrinsicBounds(textView,
-                    start, top, end, bottom);
-        }
-    }
-
-    static class JbMr2TextViewCompatImpl extends JbMr1TextViewCompatImpl {
-        @Override
-        public void setCompoundDrawablesRelative(@NonNull TextView textView,
-                @Nullable Drawable start, @Nullable Drawable top, @Nullable Drawable end,
-                @Nullable Drawable bottom) {
-            TextViewCompatJbMr2.setCompoundDrawablesRelative(textView, start, top, end, bottom);
-        }
-
-        @Override
-        public void setCompoundDrawablesRelativeWithIntrinsicBounds(@NonNull TextView textView,
-                @Nullable Drawable start, @Nullable Drawable top, @Nullable Drawable end,
-                @Nullable Drawable bottom) {
-            TextViewCompatJbMr2
-                    .setCompoundDrawablesRelativeWithIntrinsicBounds(textView, start, top, end,
-                            bottom);
-        }
-
-        @Override
-        public void setCompoundDrawablesRelativeWithIntrinsicBounds(@NonNull TextView textView,
-                @DrawableRes int start, @DrawableRes int top, @DrawableRes int end,
-                @DrawableRes int bottom) {
-            TextViewCompatJbMr2.setCompoundDrawablesRelativeWithIntrinsicBounds(textView,
-                    start, top, end, bottom);
-        }
-    }
-
-    static class Api23TextViewCompatImpl extends JbMr2TextViewCompatImpl {
-        @Override
-        public void setTextAppearance(@NonNull TextView textView, @StyleRes int resId) {
-            TextViewCompatApi23.setTextAppearance(textView, resId);
-        }
-    }
-
-    static final TextViewCompatImpl IMPL;
-
-    static {
-        final int version = Build.VERSION.SDK_INT;
-        if (version >= 23) {
-            IMPL = new Api23TextViewCompatImpl();
-        } else if (version >= 18) {
-            IMPL = new JbMr2TextViewCompatImpl();
-        } else if (version >= 17) {
-            IMPL = new JbMr1TextViewCompatImpl();
-        } else if (version >= 16) {
-            IMPL = new JbTextViewCompatImpl();
-        } else {
-            IMPL = new BaseTextViewCompatImpl();
-        }
-    }
-
-    /**
-     * Sets the Drawables (if any) to appear to the start of, above, to the end
-     * of, and below the text. Use {@code null} if you do not want a Drawable
-     * there. The Drawables must already have had {@link Drawable#setBounds}
-     * called.
-     * <p/>
-     * Calling this method will overwrite any Drawables previously set using
-     * {@link TextView#setCompoundDrawables} or related methods.
-     *
-     * @param textView The TextView against which to invoke the method.
-     * @attr name android:drawableStart
-     * @attr name android:drawableTop
-     * @attr name android:drawableEnd
-     * @attr name android:drawableBottom
-     */
-    public static void setCompoundDrawablesRelative(@NonNull TextView textView,
-            @Nullable Drawable start, @Nullable Drawable top, @Nullable Drawable end,
-            @Nullable Drawable bottom) {
-        IMPL.setCompoundDrawablesRelative(textView, start, top, end, bottom);
-    }
-
-    /**
-     * Sets the Drawables (if any) to appear to the start of, above, to the end
-     * of, and below the text. Use {@code null} if you do not want a Drawable
-     * there. The Drawables' bounds will be set to their intrinsic bounds.
-     * <p/>
-     * Calling this method will overwrite any Drawables previously set using
-     * {@link TextView#setCompoundDrawables} or related methods.
-     *
-     * @param textView The TextView against which to invoke the method.
-     * @attr name android:drawableStart
-     * @attr name android:drawableTop
-     * @attr name android:drawableEnd
-     * @attr name android:drawableBottom
-     */
-    public static void setCompoundDrawablesRelativeWithIntrinsicBounds(@NonNull TextView textView,
-            @Nullable Drawable start, @Nullable Drawable top, @Nullable Drawable end,
-            @Nullable Drawable bottom) {
-        IMPL.setCompoundDrawablesRelativeWithIntrinsicBounds(textView, start, top, end, bottom);
-    }
-
-    /**
-     * Sets the Drawables (if any) to appear to the start of, above, to the end
-     * of, and below the text. Use 0 if you do not want a Drawable there. The
-     * Drawables' bounds will be set to their intrinsic bounds.
-     * <p/>
-     * Calling this method will overwrite any Drawables previously set using
-     * {@link TextView#setCompoundDrawables} or related methods.
-     *
-     * @param textView The TextView against which to invoke the method.
-     * @param start    Resource identifier of the start Drawable.
-     * @param top      Resource identifier of the top Drawable.
-     * @param end      Resource identifier of the end Drawable.
-     * @param bottom   Resource identifier of the bottom Drawable.
-     * @attr name android:drawableStart
-     * @attr name android:drawableTop
-     * @attr name android:drawableEnd
-     * @attr name android:drawableBottom
-     */
-    public static void setCompoundDrawablesRelativeWithIntrinsicBounds(@NonNull TextView textView,
-            @DrawableRes int start, @DrawableRes int top, @DrawableRes int end,
-            @DrawableRes int bottom) {
-        IMPL.setCompoundDrawablesRelativeWithIntrinsicBounds(textView, start, top, end, bottom);
-    }
-
-    /**
-     * Returns the maximum number of lines displayed in the given TextView, or -1 if the maximum
-     * height was set in pixels instead.
-     */
-    public static int getMaxLines(@NonNull TextView textView) {
-        return IMPL.getMaxLines(textView);
-    }
-
-    /**
-     * Returns the minimum number of lines displayed in the given TextView, or -1 if the minimum
-     * height was set in pixels instead.
-     */
-    public static int getMinLines(@NonNull TextView textView) {
-        return IMPL.getMinLines(textView);
-    }
-
-    /**
-     * Sets the text appearance from the specified style resource.
-     * <p>
-     * Use a framework-defined {@code TextAppearance} style like
-     * {@link android.R.style#TextAppearance_Material_Body1 @android:style/TextAppearance.Material.Body1}
-     * or see {@link android.R.styleable#TextAppearance TextAppearance} for the
-     * set of attributes that can be used in a custom style.
-     *
-     * @param textView The TextView against which to invoke the method.
-     * @param resId    The resource identifier of the style to apply.
-     */
-    public static void setTextAppearance(@NonNull TextView textView, @StyleRes int resId) {
-        IMPL.setTextAppearance(textView, resId);
-    }
-}
diff --git a/v4/java/android/support/v4/widget/TextViewCompatDonut.java b/v4/java/android/support/v4/widget/TextViewCompatDonut.java
deleted file mode 100644
index ba155fe..0000000
--- a/v4/java/android/support/v4/widget/TextViewCompatDonut.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.v4.widget;
-
-import android.util.Log;
-import android.widget.TextView;
-
-import java.lang.reflect.Field;
-
-class TextViewCompatDonut {
-
-    private static final String LOG_TAG = "TextViewCompatDonut";
-    private static final int LINES = 1;
-
-    private static Field sMaximumField;
-    private static boolean sMaximumFieldFetched;
-    private static Field sMaxModeField;
-    private static boolean sMaxModeFieldFetched;
-
-    private static Field sMinimumField;
-    private static boolean sMinimumFieldFetched;
-    private static Field sMinModeField;
-    private static boolean sMinModeFieldFetched;
-
-    static int getMaxLines(TextView textView) {
-        if (!sMaxModeFieldFetched) {
-            sMaxModeField = retrieveField("mMaxMode");
-            sMaxModeFieldFetched = true;
-        }
-        if (sMaxModeField != null && retrieveIntFromField(sMaxModeField, textView) == LINES) {
-            // If the max mode is using lines, we can grab the maximum value
-            if (!sMaximumFieldFetched) {
-                sMaximumField = retrieveField("mMaximum");
-                sMaximumFieldFetched = true;
-            }
-            if (sMaximumField != null) {
-                return retrieveIntFromField(sMaximumField, textView);
-            }
-        }
-        return -1;
-    }
-
-    static int getMinLines(TextView textView) {
-        if (!sMinModeFieldFetched) {
-            sMinModeField = retrieveField("mMinMode");
-            sMinModeFieldFetched = true;
-        }
-        if (sMinModeField != null && retrieveIntFromField(sMinModeField, textView) == LINES) {
-            // If the min mode is using lines, we can grab the maximum value
-            if (!sMinimumFieldFetched) {
-                sMinimumField = retrieveField("mMinimum");
-                sMinimumFieldFetched = true;
-            }
-            if (sMinimumField != null) {
-                return retrieveIntFromField(sMinimumField, textView);
-            }
-        }
-        return -1;
-    }
-
-    private static Field retrieveField(String fieldName) {
-        Field field = null;
-        try {
-            field = TextView.class.getDeclaredField(fieldName);
-            field.setAccessible(true);
-        } catch (NoSuchFieldException e) {
-            Log.e(LOG_TAG, "Could not retrieve " + fieldName + " field.");
-        }
-        return field;
-    }
-
-    private static int retrieveIntFromField(Field field, TextView textView) {
-        try {
-            return field.getInt(textView);
-        } catch (IllegalAccessException e) {
-            Log.d(LOG_TAG, "Could not retrieve value of " + field.getName() + " field.");
-        }
-        return -1;
-    }
-
-    static void setTextAppearance(TextView textView, int resId) {
-        textView.setTextAppearance(textView.getContext(), resId);
-    }
-}
diff --git a/v4/java/android/support/v4/widget/ViewDragHelper.java b/v4/java/android/support/v4/widget/ViewDragHelper.java
deleted file mode 100644
index d500e42..0000000
--- a/v4/java/android/support/v4/widget/ViewDragHelper.java
+++ /dev/null
@@ -1,1504 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-package android.support.v4.widget;
-
-import android.content.Context;
-import android.support.v4.view.MotionEventCompat;
-import android.support.v4.view.VelocityTrackerCompat;
-import android.support.v4.view.ViewCompat;
-import android.util.Log;
-import android.view.MotionEvent;
-import android.view.VelocityTracker;
-import android.view.View;
-import android.view.ViewConfiguration;
-import android.view.ViewGroup;
-import android.view.animation.Interpolator;
-
-import java.util.Arrays;
-
-/**
- * ViewDragHelper is a utility class for writing custom ViewGroups. It offers a number
- * of useful operations and state tracking for allowing a user to drag and reposition
- * views within their parent ViewGroup.
- */
-public class ViewDragHelper {
-    private static final String TAG = "ViewDragHelper";
-
-    /**
-     * A null/invalid pointer ID.
-     */
-    public static final int INVALID_POINTER = -1;
-
-    /**
-     * A view is not currently being dragged or animating as a result of a fling/snap.
-     */
-    public static final int STATE_IDLE = 0;
-
-    /**
-     * A view is currently being dragged. The position is currently changing as a result
-     * of user input or simulated user input.
-     */
-    public static final int STATE_DRAGGING = 1;
-
-    /**
-     * A view is currently settling into place as a result of a fling or
-     * predefined non-interactive motion.
-     */
-    public static final int STATE_SETTLING = 2;
-
-    /**
-     * Edge flag indicating that the left edge should be affected.
-     */
-    public static final int EDGE_LEFT = 1 << 0;
-
-    /**
-     * Edge flag indicating that the right edge should be affected.
-     */
-    public static final int EDGE_RIGHT = 1 << 1;
-
-    /**
-     * Edge flag indicating that the top edge should be affected.
-     */
-    public static final int EDGE_TOP = 1 << 2;
-
-    /**
-     * Edge flag indicating that the bottom edge should be affected.
-     */
-    public static final int EDGE_BOTTOM = 1 << 3;
-
-    /**
-     * Edge flag set indicating all edges should be affected.
-     */
-    public static final int EDGE_ALL = EDGE_LEFT | EDGE_TOP | EDGE_RIGHT | EDGE_BOTTOM;
-
-    /**
-     * Indicates that a check should occur along the horizontal axis
-     */
-    public static final int DIRECTION_HORIZONTAL = 1 << 0;
-
-    /**
-     * Indicates that a check should occur along the vertical axis
-     */
-    public static final int DIRECTION_VERTICAL = 1 << 1;
-
-    /**
-     * Indicates that a check should occur along all axes
-     */
-    public static final int DIRECTION_ALL = DIRECTION_HORIZONTAL | DIRECTION_VERTICAL;
-
-    private static final int EDGE_SIZE = 20; // dp
-
-    private static final int BASE_SETTLE_DURATION = 256; // ms
-    private static final int MAX_SETTLE_DURATION = 600; // ms
-
-    // Current drag state; idle, dragging or settling
-    private int mDragState;
-
-    // Distance to travel before a drag may begin
-    private int mTouchSlop;
-
-    // Last known position/pointer tracking
-    private int mActivePointerId = INVALID_POINTER;
-    private float[] mInitialMotionX;
-    private float[] mInitialMotionY;
-    private float[] mLastMotionX;
-    private float[] mLastMotionY;
-    private int[] mInitialEdgesTouched;
-    private int[] mEdgeDragsInProgress;
-    private int[] mEdgeDragsLocked;
-    private int mPointersDown;
-
-    private VelocityTracker mVelocityTracker;
-    private float mMaxVelocity;
-    private float mMinVelocity;
-
-    private int mEdgeSize;
-    private int mTrackingEdges;
-
-    private ScrollerCompat mScroller;
-
-    private final Callback mCallback;
-
-    private View mCapturedView;
-    private boolean mReleaseInProgress;
-
-    private final ViewGroup mParentView;
-
-    /**
-     * A Callback is used as a communication channel with the ViewDragHelper back to the
-     * parent view using it. <code>on*</code>methods are invoked on siginficant events and several
-     * accessor methods are expected to provide the ViewDragHelper with more information
-     * about the state of the parent view upon request. The callback also makes decisions
-     * governing the range and draggability of child views.
-     */
-    public static abstract class Callback {
-        /**
-         * Called when the drag state changes. See the <code>STATE_*</code> constants
-         * for more information.
-         *
-         * @param state The new drag state
-         *
-         * @see #STATE_IDLE
-         * @see #STATE_DRAGGING
-         * @see #STATE_SETTLING
-         */
-        public void onViewDragStateChanged(int state) {}
-
-        /**
-         * Called when the captured view's position changes as the result of a drag or settle.
-         *
-         * @param changedView View whose position changed
-         * @param left New X coordinate of the left edge of the view
-         * @param top New Y coordinate of the top edge of the view
-         * @param dx Change in X position from the last call
-         * @param dy Change in Y position from the last call
-         */
-        public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) {}
-
-        /**
-         * Called when a child view is captured for dragging or settling. The ID of the pointer
-         * currently dragging the captured view is supplied. If activePointerId is
-         * identified as {@link #INVALID_POINTER} the capture is programmatic instead of
-         * pointer-initiated.
-         *
-         * @param capturedChild Child view that was captured
-         * @param activePointerId Pointer id tracking the child capture
-         */
-        public void onViewCaptured(View capturedChild, int activePointerId) {}
-
-        /**
-         * Called when the child view is no longer being actively dragged.
-         * The fling velocity is also supplied, if relevant. The velocity values may
-         * be clamped to system minimums or maximums.
-         *
-         * <p>Calling code may decide to fling or otherwise release the view to let it
-         * settle into place. It should do so using {@link #settleCapturedViewAt(int, int)}
-         * or {@link #flingCapturedView(int, int, int, int)}. If the Callback invokes
-         * one of these methods, the ViewDragHelper will enter {@link #STATE_SETTLING}
-         * and the view capture will not fully end until it comes to a complete stop.
-         * If neither of these methods is invoked before <code>onViewReleased</code> returns,
-         * the view will stop in place and the ViewDragHelper will return to
-         * {@link #STATE_IDLE}.</p>
-         *
-         * @param releasedChild The captured child view now being released
-         * @param xvel X velocity of the pointer as it left the screen in pixels per second.
-         * @param yvel Y velocity of the pointer as it left the screen in pixels per second.
-         */
-        public void onViewReleased(View releasedChild, float xvel, float yvel) {}
-
-        /**
-         * Called when one of the subscribed edges in the parent view has been touched
-         * by the user while no child view is currently captured.
-         *
-         * @param edgeFlags A combination of edge flags describing the edge(s) currently touched
-         * @param pointerId ID of the pointer touching the described edge(s)
-         * @see #EDGE_LEFT
-         * @see #EDGE_TOP
-         * @see #EDGE_RIGHT
-         * @see #EDGE_BOTTOM
-         */
-        public void onEdgeTouched(int edgeFlags, int pointerId) {}
-
-        /**
-         * Called when the given edge may become locked. This can happen if an edge drag
-         * was preliminarily rejected before beginning, but after {@link #onEdgeTouched(int, int)}
-         * was called. This method should return true to lock this edge or false to leave it
-         * unlocked. The default behavior is to leave edges unlocked.
-         *
-         * @param edgeFlags A combination of edge flags describing the edge(s) locked
-         * @return true to lock the edge, false to leave it unlocked
-         */
-        public boolean onEdgeLock(int edgeFlags) {
-            return false;
-        }
-
-        /**
-         * Called when the user has started a deliberate drag away from one
-         * of the subscribed edges in the parent view while no child view is currently captured.
-         *
-         * @param edgeFlags A combination of edge flags describing the edge(s) dragged
-         * @param pointerId ID of the pointer touching the described edge(s)
-         * @see #EDGE_LEFT
-         * @see #EDGE_TOP
-         * @see #EDGE_RIGHT
-         * @see #EDGE_BOTTOM
-         */
-        public void onEdgeDragStarted(int edgeFlags, int pointerId) {}
-
-        /**
-         * Called to determine the Z-order of child views.
-         *
-         * @param index the ordered position to query for
-         * @return index of the view that should be ordered at position <code>index</code>
-         */
-        public int getOrderedChildIndex(int index) {
-            return index;
-        }
-
-        /**
-         * Return the magnitude of a draggable child view's horizontal range of motion in pixels.
-         * This method should return 0 for views that cannot move horizontally.
-         *
-         * @param child Child view to check
-         * @return range of horizontal motion in pixels
-         */
-        public int getViewHorizontalDragRange(View child) {
-            return 0;
-        }
-
-        /**
-         * Return the magnitude of a draggable child view's vertical range of motion in pixels.
-         * This method should return 0 for views that cannot move vertically.
-         *
-         * @param child Child view to check
-         * @return range of vertical motion in pixels
-         */
-        public int getViewVerticalDragRange(View child) {
-            return 0;
-        }
-
-        /**
-         * Called when the user's input indicates that they want to capture the given child view
-         * with the pointer indicated by pointerId. The callback should return true if the user
-         * is permitted to drag the given view with the indicated pointer.
-         *
-         * <p>ViewDragHelper may call this method multiple times for the same view even if
-         * the view is already captured; this indicates that a new pointer is trying to take
-         * control of the view.</p>
-         *
-         * <p>If this method returns true, a call to {@link #onViewCaptured(android.view.View, int)}
-         * will follow if the capture is successful.</p>
-         *
-         * @param child Child the user is attempting to capture
-         * @param pointerId ID of the pointer attempting the capture
-         * @return true if capture should be allowed, false otherwise
-         */
-        public abstract boolean tryCaptureView(View child, int pointerId);
-
-        /**
-         * Restrict the motion of the dragged child view along the horizontal axis.
-         * The default implementation does not allow horizontal motion; the extending
-         * class must override this method and provide the desired clamping.
-         *
-         *
-         * @param child Child view being dragged
-         * @param left Attempted motion along the X axis
-         * @param dx Proposed change in position for left
-         * @return The new clamped position for left
-         */
-        public int clampViewPositionHorizontal(View child, int left, int dx) {
-            return 0;
-        }
-
-        /**
-         * Restrict the motion of the dragged child view along the vertical axis.
-         * The default implementation does not allow vertical motion; the extending
-         * class must override this method and provide the desired clamping.
-         *
-         *
-         * @param child Child view being dragged
-         * @param top Attempted motion along the Y axis
-         * @param dy Proposed change in position for top
-         * @return The new clamped position for top
-         */
-        public int clampViewPositionVertical(View child, int top, int dy) {
-            return 0;
-        }
-    }
-
-    /**
-     * Interpolator defining the animation curve for mScroller
-     */
-    private static final Interpolator sInterpolator = new Interpolator() {
-        public float getInterpolation(float t) {
-            t -= 1.0f;
-            return t * t * t * t * t + 1.0f;
-        }
-    };
-
-    private final Runnable mSetIdleRunnable = new Runnable() {
-        public void run() {
-            setDragState(STATE_IDLE);
-        }
-    };
-
-    /**
-     * Factory method to create a new ViewDragHelper.
-     *
-     * @param forParent Parent view to monitor
-     * @param cb Callback to provide information and receive events
-     * @return a new ViewDragHelper instance
-     */
-    public static ViewDragHelper create(ViewGroup forParent, Callback cb) {
-        return new ViewDragHelper(forParent.getContext(), forParent, cb);
-    }
-
-    /**
-     * Factory method to create a new ViewDragHelper.
-     *
-     * @param forParent Parent view to monitor
-     * @param sensitivity Multiplier for how sensitive the helper should be about detecting
-     *                    the start of a drag. Larger values are more sensitive. 1.0f is normal.
-     * @param cb Callback to provide information and receive events
-     * @return a new ViewDragHelper instance
-     */
-    public static ViewDragHelper create(ViewGroup forParent, float sensitivity, Callback cb) {
-        final ViewDragHelper helper = create(forParent, cb);
-        helper.mTouchSlop = (int) (helper.mTouchSlop * (1 / sensitivity));
-        return helper;
-    }
-
-    /**
-     * Apps should use ViewDragHelper.create() to get a new instance.
-     * This will allow VDH to use internal compatibility implementations for different
-     * platform versions.
-     *
-     * @param context Context to initialize config-dependent params from
-     * @param forParent Parent view to monitor
-     */
-    private ViewDragHelper(Context context, ViewGroup forParent, Callback cb) {
-        if (forParent == null) {
-            throw new IllegalArgumentException("Parent view may not be null");
-        }
-        if (cb == null) {
-            throw new IllegalArgumentException("Callback may not be null");
-        }
-
-        mParentView = forParent;
-        mCallback = cb;
-
-        final ViewConfiguration vc = ViewConfiguration.get(context);
-        final float density = context.getResources().getDisplayMetrics().density;
-        mEdgeSize = (int) (EDGE_SIZE * density + 0.5f);
-
-        mTouchSlop = vc.getScaledTouchSlop();
-        mMaxVelocity = vc.getScaledMaximumFlingVelocity();
-        mMinVelocity = vc.getScaledMinimumFlingVelocity();
-        mScroller = ScrollerCompat.create(context, sInterpolator);
-    }
-
-    /**
-     * Set the minimum velocity that will be detected as having a magnitude greater than zero
-     * in pixels per second. Callback methods accepting a velocity will be clamped appropriately.
-     *
-     * @param minVel Minimum velocity to detect
-     */
-    public void setMinVelocity(float minVel) {
-        mMinVelocity = minVel;
-    }
-
-    /**
-     * Return the currently configured minimum velocity. Any flings with a magnitude less
-     * than this value in pixels per second. Callback methods accepting a velocity will receive
-     * zero as a velocity value if the real detected velocity was below this threshold.
-     *
-     * @return the minimum velocity that will be detected
-     */
-    public float getMinVelocity() {
-        return mMinVelocity;
-    }
-
-    /**
-     * Retrieve the current drag state of this helper. This will return one of
-     * {@link #STATE_IDLE}, {@link #STATE_DRAGGING} or {@link #STATE_SETTLING}.
-     * @return The current drag state
-     */
-    public int getViewDragState() {
-        return mDragState;
-    }
-
-    /**
-     * Enable edge tracking for the selected edges of the parent view.
-     * The callback's {@link Callback#onEdgeTouched(int, int)} and
-     * {@link Callback#onEdgeDragStarted(int, int)} methods will only be invoked
-     * for edges for which edge tracking has been enabled.
-     *
-     * @param edgeFlags Combination of edge flags describing the edges to watch
-     * @see #EDGE_LEFT
-     * @see #EDGE_TOP
-     * @see #EDGE_RIGHT
-     * @see #EDGE_BOTTOM
-     */
-    public void setEdgeTrackingEnabled(int edgeFlags) {
-        mTrackingEdges = edgeFlags;
-    }
-
-    /**
-     * Return the size of an edge. This is the range in pixels along the edges of this view
-     * that will actively detect edge touches or drags if edge tracking is enabled.
-     *
-     * @return The size of an edge in pixels
-     * @see #setEdgeTrackingEnabled(int)
-     */
-    public int getEdgeSize() {
-        return mEdgeSize;
-    }
-
-    /**
-     * Capture a specific child view for dragging within the parent. The callback will be notified
-     * but {@link Callback#tryCaptureView(android.view.View, int)} will not be asked permission to
-     * capture this view.
-     *
-     * @param childView Child view to capture
-     * @param activePointerId ID of the pointer that is dragging the captured child view
-     */
-    public void captureChildView(View childView, int activePointerId) {
-        if (childView.getParent() != mParentView) {
-            throw new IllegalArgumentException("captureChildView: parameter must be a descendant " +
-                    "of the ViewDragHelper's tracked parent view (" + mParentView + ")");
-        }
-
-        mCapturedView = childView;
-        mActivePointerId = activePointerId;
-        mCallback.onViewCaptured(childView, activePointerId);
-        setDragState(STATE_DRAGGING);
-    }
-
-    /**
-     * @return The currently captured view, or null if no view has been captured.
-     */
-    public View getCapturedView() {
-        return mCapturedView;
-    }
-
-    /**
-     * @return The ID of the pointer currently dragging the captured view,
-     *         or {@link #INVALID_POINTER}.
-     */
-    public int getActivePointerId() {
-        return mActivePointerId;
-    }
-
-    /**
-     * @return The minimum distance in pixels that the user must travel to initiate a drag
-     */
-    public int getTouchSlop() {
-        return mTouchSlop;
-    }
-
-    /**
-     * The result of a call to this method is equivalent to
-     * {@link #processTouchEvent(android.view.MotionEvent)} receiving an ACTION_CANCEL event.
-     */
-    public void cancel() {
-        mActivePointerId = INVALID_POINTER;
-        clearMotionHistory();
-
-        if (mVelocityTracker != null) {
-            mVelocityTracker.recycle();
-            mVelocityTracker = null;
-        }
-    }
-
-    /**
-     * {@link #cancel()}, but also abort all motion in progress and snap to the end of any
-     * animation.
-     */
-    public void abort() {
-        cancel();
-        if (mDragState == STATE_SETTLING) {
-            final int oldX = mScroller.getCurrX();
-            final int oldY = mScroller.getCurrY();
-            mScroller.abortAnimation();
-            final int newX = mScroller.getCurrX();
-            final int newY = mScroller.getCurrY();
-            mCallback.onViewPositionChanged(mCapturedView, newX, newY, newX - oldX, newY - oldY);
-        }
-        setDragState(STATE_IDLE);
-    }
-
-    /**
-     * Animate the view <code>child</code> to the given (left, top) position.
-     * If this method returns true, the caller should invoke {@link #continueSettling(boolean)}
-     * on each subsequent frame to continue the motion until it returns false. If this method
-     * returns false there is no further work to do to complete the movement.
-     *
-     * <p>This operation does not count as a capture event, though {@link #getCapturedView()}
-     * will still report the sliding view while the slide is in progress.</p>
-     *
-     * @param child Child view to capture and animate
-     * @param finalLeft Final left position of child
-     * @param finalTop Final top position of child
-     * @return true if animation should continue through {@link #continueSettling(boolean)} calls
-     */
-    public boolean smoothSlideViewTo(View child, int finalLeft, int finalTop) {
-        mCapturedView = child;
-        mActivePointerId = INVALID_POINTER;
-
-        boolean continueSliding = forceSettleCapturedViewAt(finalLeft, finalTop, 0, 0);
-        if (!continueSliding && mDragState == STATE_IDLE && mCapturedView != null) {
-            // If we're in an IDLE state to begin with and aren't moving anywhere, we
-            // end up having a non-null capturedView with an IDLE dragState
-            mCapturedView = null;
-        }
-
-        return continueSliding;
-    }
-
-    /**
-     * Settle the captured view at the given (left, top) position.
-     * The appropriate velocity from prior motion will be taken into account.
-     * If this method returns true, the caller should invoke {@link #continueSettling(boolean)}
-     * on each subsequent frame to continue the motion until it returns false. If this method
-     * returns false there is no further work to do to complete the movement.
-     *
-     * @param finalLeft Settled left edge position for the captured view
-     * @param finalTop Settled top edge position for the captured view
-     * @return true if animation should continue through {@link #continueSettling(boolean)} calls
-     */
-    public boolean settleCapturedViewAt(int finalLeft, int finalTop) {
-        if (!mReleaseInProgress) {
-            throw new IllegalStateException("Cannot settleCapturedViewAt outside of a call to " +
-                    "Callback#onViewReleased");
-        }
-
-        return forceSettleCapturedViewAt(finalLeft, finalTop,
-                (int) VelocityTrackerCompat.getXVelocity(mVelocityTracker, mActivePointerId),
-                (int) VelocityTrackerCompat.getYVelocity(mVelocityTracker, mActivePointerId));
-    }
-
-    /**
-     * Settle the captured view at the given (left, top) position.
-     *
-     * @param finalLeft Target left position for the captured view
-     * @param finalTop Target top position for the captured view
-     * @param xvel Horizontal velocity
-     * @param yvel Vertical velocity
-     * @return true if animation should continue through {@link #continueSettling(boolean)} calls
-     */
-    private boolean forceSettleCapturedViewAt(int finalLeft, int finalTop, int xvel, int yvel) {
-        final int startLeft = mCapturedView.getLeft();
-        final int startTop = mCapturedView.getTop();
-        final int dx = finalLeft - startLeft;
-        final int dy = finalTop - startTop;
-
-        if (dx == 0 && dy == 0) {
-            // Nothing to do. Send callbacks, be done.
-            mScroller.abortAnimation();
-            setDragState(STATE_IDLE);
-            return false;
-        }
-
-        final int duration = computeSettleDuration(mCapturedView, dx, dy, xvel, yvel);
-        mScroller.startScroll(startLeft, startTop, dx, dy, duration);
-
-        setDragState(STATE_SETTLING);
-        return true;
-    }
-
-    private int computeSettleDuration(View child, int dx, int dy, int xvel, int yvel) {
-        xvel = clampMag(xvel, (int) mMinVelocity, (int) mMaxVelocity);
-        yvel = clampMag(yvel, (int) mMinVelocity, (int) mMaxVelocity);
-        final int absDx = Math.abs(dx);
-        final int absDy = Math.abs(dy);
-        final int absXVel = Math.abs(xvel);
-        final int absYVel = Math.abs(yvel);
-        final int addedVel = absXVel + absYVel;
-        final int addedDistance = absDx + absDy;
-
-        final float xweight = xvel != 0 ? (float) absXVel / addedVel :
-                (float) absDx / addedDistance;
-        final float yweight = yvel != 0 ? (float) absYVel / addedVel :
-                (float) absDy / addedDistance;
-
-        int xduration = computeAxisDuration(dx, xvel, mCallback.getViewHorizontalDragRange(child));
-        int yduration = computeAxisDuration(dy, yvel, mCallback.getViewVerticalDragRange(child));
-
-        return (int) (xduration * xweight + yduration * yweight);
-    }
-
-    private int computeAxisDuration(int delta, int velocity, int motionRange) {
-        if (delta == 0) {
-            return 0;
-        }
-
-        final int width = mParentView.getWidth();
-        final int halfWidth = width / 2;
-        final float distanceRatio = Math.min(1f, (float) Math.abs(delta) / width);
-        final float distance = halfWidth + halfWidth *
-                distanceInfluenceForSnapDuration(distanceRatio);
-
-        int duration;
-        velocity = Math.abs(velocity);
-        if (velocity > 0) {
-            duration = 4 * Math.round(1000 * Math.abs(distance / velocity));
-        } else {
-            final float range = (float) Math.abs(delta) / motionRange;
-            duration = (int) ((range + 1) * BASE_SETTLE_DURATION);
-        }
-        return Math.min(duration, MAX_SETTLE_DURATION);
-    }
-
-    /**
-     * Clamp the magnitude of value for absMin and absMax.
-     * If the value is below the minimum, it will be clamped to zero.
-     * If the value is above the maximum, it will be clamped to the maximum.
-     *
-     * @param value Value to clamp
-     * @param absMin Absolute value of the minimum significant value to return
-     * @param absMax Absolute value of the maximum value to return
-     * @return The clamped value with the same sign as <code>value</code>
-     */
-    private int clampMag(int value, int absMin, int absMax) {
-        final int absValue = Math.abs(value);
-        if (absValue < absMin) return 0;
-        if (absValue > absMax) return value > 0 ? absMax : -absMax;
-        return value;
-    }
-
-    /**
-     * Clamp the magnitude of value for absMin and absMax.
-     * If the value is below the minimum, it will be clamped to zero.
-     * If the value is above the maximum, it will be clamped to the maximum.
-     *
-     * @param value Value to clamp
-     * @param absMin Absolute value of the minimum significant value to return
-     * @param absMax Absolute value of the maximum value to return
-     * @return The clamped value with the same sign as <code>value</code>
-     */
-    private float clampMag(float value, float absMin, float absMax) {
-        final float absValue = Math.abs(value);
-        if (absValue < absMin) return 0;
-        if (absValue > absMax) return value > 0 ? absMax : -absMax;
-        return value;
-    }
-
-    private float distanceInfluenceForSnapDuration(float f) {
-        f -= 0.5f; // center the values about 0.
-        f *= 0.3f * Math.PI / 2.0f;
-        return (float) Math.sin(f);
-    }
-
-    /**
-     * Settle the captured view based on standard free-moving fling behavior.
-     * The caller should invoke {@link #continueSettling(boolean)} on each subsequent frame
-     * to continue the motion until it returns false.
-     *
-     * @param minLeft Minimum X position for the view's left edge
-     * @param minTop Minimum Y position for the view's top edge
-     * @param maxLeft Maximum X position for the view's left edge
-     * @param maxTop Maximum Y position for the view's top edge
-     */
-    public void flingCapturedView(int minLeft, int minTop, int maxLeft, int maxTop) {
-        if (!mReleaseInProgress) {
-            throw new IllegalStateException("Cannot flingCapturedView outside of a call to " +
-                    "Callback#onViewReleased");
-        }
-
-        mScroller.fling(mCapturedView.getLeft(), mCapturedView.getTop(),
-                (int) VelocityTrackerCompat.getXVelocity(mVelocityTracker, mActivePointerId),
-                (int) VelocityTrackerCompat.getYVelocity(mVelocityTracker, mActivePointerId),
-                minLeft, maxLeft, minTop, maxTop);
-
-        setDragState(STATE_SETTLING);
-    }
-
-    /**
-     * Move the captured settling view by the appropriate amount for the current time.
-     * If <code>continueSettling</code> returns true, the caller should call it again
-     * on the next frame to continue.
-     *
-     * @param deferCallbacks true if state callbacks should be deferred via posted message.
-     *                       Set this to true if you are calling this method from
-     *                       {@link android.view.View#computeScroll()} or similar methods
-     *                       invoked as part of layout or drawing.
-     * @return true if settle is still in progress
-     */
-    public boolean continueSettling(boolean deferCallbacks) {
-        if (mDragState == STATE_SETTLING) {
-            boolean keepGoing = mScroller.computeScrollOffset();
-            final int x = mScroller.getCurrX();
-            final int y = mScroller.getCurrY();
-            final int dx = x - mCapturedView.getLeft();
-            final int dy = y - mCapturedView.getTop();
-
-            if (dx != 0) {
-                ViewCompat.offsetLeftAndRight(mCapturedView, dx);
-            }
-            if (dy != 0) {
-                ViewCompat.offsetTopAndBottom(mCapturedView, dy);
-            }
-
-            if (dx != 0 || dy != 0) {
-                mCallback.onViewPositionChanged(mCapturedView, x, y, dx, dy);
-            }
-
-            if (keepGoing && x == mScroller.getFinalX() && y == mScroller.getFinalY()) {
-                // Close enough. The interpolator/scroller might think we're still moving
-                // but the user sure doesn't.
-                mScroller.abortAnimation();
-                keepGoing = false;
-            }
-
-            if (!keepGoing) {
-                if (deferCallbacks) {
-                    mParentView.post(mSetIdleRunnable);
-                } else {
-                    setDragState(STATE_IDLE);
-                }
-            }
-        }
-
-        return mDragState == STATE_SETTLING;
-    }
-
-    /**
-     * Like all callback events this must happen on the UI thread, but release
-     * involves some extra semantics. During a release (mReleaseInProgress)
-     * is the only time it is valid to call {@link #settleCapturedViewAt(int, int)}
-     * or {@link #flingCapturedView(int, int, int, int)}.
-     */
-    private void dispatchViewReleased(float xvel, float yvel) {
-        mReleaseInProgress = true;
-        mCallback.onViewReleased(mCapturedView, xvel, yvel);
-        mReleaseInProgress = false;
-
-        if (mDragState == STATE_DRAGGING) {
-            // onViewReleased didn't call a method that would have changed this. Go idle.
-            setDragState(STATE_IDLE);
-        }
-    }
-
-    private void clearMotionHistory() {
-        if (mInitialMotionX == null) {
-            return;
-        }
-        Arrays.fill(mInitialMotionX, 0);
-        Arrays.fill(mInitialMotionY, 0);
-        Arrays.fill(mLastMotionX, 0);
-        Arrays.fill(mLastMotionY, 0);
-        Arrays.fill(mInitialEdgesTouched, 0);
-        Arrays.fill(mEdgeDragsInProgress, 0);
-        Arrays.fill(mEdgeDragsLocked, 0);
-        mPointersDown = 0;
-    }
-
-    private void clearMotionHistory(int pointerId) {
-        if (mInitialMotionX == null) {
-            return;
-        }
-        mInitialMotionX[pointerId] = 0;
-        mInitialMotionY[pointerId] = 0;
-        mLastMotionX[pointerId] = 0;
-        mLastMotionY[pointerId] = 0;
-        mInitialEdgesTouched[pointerId] = 0;
-        mEdgeDragsInProgress[pointerId] = 0;
-        mEdgeDragsLocked[pointerId] = 0;
-        mPointersDown &= ~(1 << pointerId);
-    }
-
-    private void ensureMotionHistorySizeForId(int pointerId) {
-        if (mInitialMotionX == null || mInitialMotionX.length <= pointerId) {
-            float[] imx = new float[pointerId + 1];
-            float[] imy = new float[pointerId + 1];
-            float[] lmx = new float[pointerId + 1];
-            float[] lmy = new float[pointerId + 1];
-            int[] iit = new int[pointerId + 1];
-            int[] edip = new int[pointerId + 1];
-            int[] edl = new int[pointerId + 1];
-
-            if (mInitialMotionX != null) {
-                System.arraycopy(mInitialMotionX, 0, imx, 0, mInitialMotionX.length);
-                System.arraycopy(mInitialMotionY, 0, imy, 0, mInitialMotionY.length);
-                System.arraycopy(mLastMotionX, 0, lmx, 0, mLastMotionX.length);
-                System.arraycopy(mLastMotionY, 0, lmy, 0, mLastMotionY.length);
-                System.arraycopy(mInitialEdgesTouched, 0, iit, 0, mInitialEdgesTouched.length);
-                System.arraycopy(mEdgeDragsInProgress, 0, edip, 0, mEdgeDragsInProgress.length);
-                System.arraycopy(mEdgeDragsLocked, 0, edl, 0, mEdgeDragsLocked.length);
-            }
-
-            mInitialMotionX = imx;
-            mInitialMotionY = imy;
-            mLastMotionX = lmx;
-            mLastMotionY = lmy;
-            mInitialEdgesTouched = iit;
-            mEdgeDragsInProgress = edip;
-            mEdgeDragsLocked = edl;
-        }
-    }
-
-    private void saveInitialMotion(float x, float y, int pointerId) {
-        ensureMotionHistorySizeForId(pointerId);
-        mInitialMotionX[pointerId] = mLastMotionX[pointerId] = x;
-        mInitialMotionY[pointerId] = mLastMotionY[pointerId] = y;
-        mInitialEdgesTouched[pointerId] = getEdgesTouched((int) x, (int) y);
-        mPointersDown |= 1 << pointerId;
-    }
-
-    private void saveLastMotion(MotionEvent ev) {
-        final int pointerCount = MotionEventCompat.getPointerCount(ev);
-        for (int i = 0; i < pointerCount; i++) {
-            final int pointerId = MotionEventCompat.getPointerId(ev, i);
-            final float x = MotionEventCompat.getX(ev, i);
-            final float y = MotionEventCompat.getY(ev, i);
-            mLastMotionX[pointerId] = x;
-            mLastMotionY[pointerId] = y;
-        }
-    }
-
-    /**
-     * Check if the given pointer ID represents a pointer that is currently down (to the best
-     * of the ViewDragHelper's knowledge).
-     *
-     * <p>The state used to report this information is populated by the methods
-     * {@link #shouldInterceptTouchEvent(android.view.MotionEvent)} or
-     * {@link #processTouchEvent(android.view.MotionEvent)}. If one of these methods has not
-     * been called for all relevant MotionEvents to track, the information reported
-     * by this method may be stale or incorrect.</p>
-     *
-     * @param pointerId pointer ID to check; corresponds to IDs provided by MotionEvent
-     * @return true if the pointer with the given ID is still down
-     */
-    public boolean isPointerDown(int pointerId) {
-        return (mPointersDown & 1 << pointerId) != 0;
-    }
-
-    void setDragState(int state) {
-        mParentView.removeCallbacks(mSetIdleRunnable);
-        if (mDragState != state) {
-            mDragState = state;
-            mCallback.onViewDragStateChanged(state);
-            if (mDragState == STATE_IDLE) {
-                mCapturedView = null;
-            }
-        }
-    }
-
-    /**
-     * Attempt to capture the view with the given pointer ID. The callback will be involved.
-     * This will put us into the "dragging" state. If we've already captured this view with
-     * this pointer this method will immediately return true without consulting the callback.
-     *
-     * @param toCapture View to capture
-     * @param pointerId Pointer to capture with
-     * @return true if capture was successful
-     */
-    boolean tryCaptureViewForDrag(View toCapture, int pointerId) {
-        if (toCapture == mCapturedView && mActivePointerId == pointerId) {
-            // Already done!
-            return true;
-        }
-        if (toCapture != null && mCallback.tryCaptureView(toCapture, pointerId)) {
-            mActivePointerId = pointerId;
-            captureChildView(toCapture, pointerId);
-            return true;
-        }
-        return false;
-    }
-
-    /**
-     * Tests scrollability within child views of v given a delta of dx.
-     *
-     * @param v View to test for horizontal scrollability
-     * @param checkV Whether the view v passed should itself be checked for scrollability (true),
-     *               or just its children (false).
-     * @param dx Delta scrolled in pixels along the X axis
-     * @param dy Delta scrolled in pixels along the Y axis
-     * @param x X coordinate of the active touch point
-     * @param y Y coordinate of the active touch point
-     * @return true if child views of v can be scrolled by delta of dx.
-     */
-    protected boolean canScroll(View v, boolean checkV, int dx, int dy, int x, int y) {
-        if (v instanceof ViewGroup) {
-            final ViewGroup group = (ViewGroup) v;
-            final int scrollX = v.getScrollX();
-            final int scrollY = v.getScrollY();
-            final int count = group.getChildCount();
-            // Count backwards - let topmost views consume scroll distance first.
-            for (int i = count - 1; i >= 0; i--) {
-                // TODO: Add versioned support here for transformed views.
-                // This will not work for transformed views in Honeycomb+
-                final View child = group.getChildAt(i);
-                if (x + scrollX >= child.getLeft() && x + scrollX < child.getRight() &&
-                        y + scrollY >= child.getTop() && y + scrollY < child.getBottom() &&
-                        canScroll(child, true, dx, dy, x + scrollX - child.getLeft(),
-                                y + scrollY - child.getTop())) {
-                    return true;
-                }
-            }
-        }
-
-        return checkV && (ViewCompat.canScrollHorizontally(v, -dx) ||
-                ViewCompat.canScrollVertically(v, -dy));
-    }
-
-    /**
-     * Check if this event as provided to the parent view's onInterceptTouchEvent should
-     * cause the parent to intercept the touch event stream.
-     *
-     * @param ev MotionEvent provided to onInterceptTouchEvent
-     * @return true if the parent view should return true from onInterceptTouchEvent
-     */
-    public boolean shouldInterceptTouchEvent(MotionEvent ev) {
-        final int action = MotionEventCompat.getActionMasked(ev);
-        final int actionIndex = MotionEventCompat.getActionIndex(ev);
-
-        if (action == MotionEvent.ACTION_DOWN) {
-            // Reset things for a new event stream, just in case we didn't get
-            // the whole previous stream.
-            cancel();
-        }
-
-        if (mVelocityTracker == null) {
-            mVelocityTracker = VelocityTracker.obtain();
-        }
-        mVelocityTracker.addMovement(ev);
-
-        switch (action) {
-            case MotionEvent.ACTION_DOWN: {
-                final float x = ev.getX();
-                final float y = ev.getY();
-                final int pointerId = MotionEventCompat.getPointerId(ev, 0);
-                saveInitialMotion(x, y, pointerId);
-
-                final View toCapture = findTopChildUnder((int) x, (int) y);
-
-                // Catch a settling view if possible.
-                if (toCapture == mCapturedView && mDragState == STATE_SETTLING) {
-                    tryCaptureViewForDrag(toCapture, pointerId);
-                }
-
-                final int edgesTouched = mInitialEdgesTouched[pointerId];
-                if ((edgesTouched & mTrackingEdges) != 0) {
-                    mCallback.onEdgeTouched(edgesTouched & mTrackingEdges, pointerId);
-                }
-                break;
-            }
-
-            case MotionEventCompat.ACTION_POINTER_DOWN: {
-                final int pointerId = MotionEventCompat.getPointerId(ev, actionIndex);
-                final float x = MotionEventCompat.getX(ev, actionIndex);
-                final float y = MotionEventCompat.getY(ev, actionIndex);
-
-                saveInitialMotion(x, y, pointerId);
-
-                // A ViewDragHelper can only manipulate one view at a time.
-                if (mDragState == STATE_IDLE) {
-                    final int edgesTouched = mInitialEdgesTouched[pointerId];
-                    if ((edgesTouched & mTrackingEdges) != 0) {
-                        mCallback.onEdgeTouched(edgesTouched & mTrackingEdges, pointerId);
-                    }
-                } else if (mDragState == STATE_SETTLING) {
-                    // Catch a settling view if possible.
-                    final View toCapture = findTopChildUnder((int) x, (int) y);
-                    if (toCapture == mCapturedView) {
-                        tryCaptureViewForDrag(toCapture, pointerId);
-                    }
-                }
-                break;
-            }
-
-            case MotionEvent.ACTION_MOVE: {
-                if (mInitialMotionX == null || mInitialMotionY == null) break;
-
-                // First to cross a touch slop over a draggable view wins. Also report edge drags.
-                final int pointerCount = MotionEventCompat.getPointerCount(ev);
-                for (int i = 0; i < pointerCount; i++) {
-                    final int pointerId = MotionEventCompat.getPointerId(ev, i);
-
-                    // If pointer is invalid then skip the ACTION_MOVE.
-                    if (!isValidPointerForActionMove(pointerId)) continue;
-
-                    final float x = MotionEventCompat.getX(ev, i);
-                    final float y = MotionEventCompat.getY(ev, i);
-                    final float dx = x - mInitialMotionX[pointerId];
-                    final float dy = y - mInitialMotionY[pointerId];
-
-                    final View toCapture = findTopChildUnder((int) x, (int) y);
-                    final boolean pastSlop = toCapture != null && checkTouchSlop(toCapture, dx, dy);
-                    if (pastSlop) {
-                        // check the callback's
-                        // getView[Horizontal|Vertical]DragRange methods to know
-                        // if you can move at all along an axis, then see if it
-                        // would clamp to the same value. If you can't move at
-                        // all in every dimension with a nonzero range, bail.
-                        final int oldLeft = toCapture.getLeft();
-                        final int targetLeft = oldLeft + (int) dx;
-                        final int newLeft = mCallback.clampViewPositionHorizontal(toCapture,
-                                targetLeft, (int) dx);
-                        final int oldTop = toCapture.getTop();
-                        final int targetTop = oldTop + (int) dy;
-                        final int newTop = mCallback.clampViewPositionVertical(toCapture, targetTop,
-                                (int) dy);
-                        final int horizontalDragRange = mCallback.getViewHorizontalDragRange(
-                                toCapture);
-                        final int verticalDragRange = mCallback.getViewVerticalDragRange(toCapture);
-                        if ((horizontalDragRange == 0 || horizontalDragRange > 0
-                                && newLeft == oldLeft) && (verticalDragRange == 0
-                                || verticalDragRange > 0 && newTop == oldTop)) {
-                            break;
-                        }
-                    }
-                    reportNewEdgeDrags(dx, dy, pointerId);
-                    if (mDragState == STATE_DRAGGING) {
-                        // Callback might have started an edge drag
-                        break;
-                    }
-
-                    if (pastSlop && tryCaptureViewForDrag(toCapture, pointerId)) {
-                        break;
-                    }
-                }
-                saveLastMotion(ev);
-                break;
-            }
-
-            case MotionEventCompat.ACTION_POINTER_UP: {
-                final int pointerId = MotionEventCompat.getPointerId(ev, actionIndex);
-                clearMotionHistory(pointerId);
-                break;
-            }
-
-            case MotionEvent.ACTION_UP:
-            case MotionEvent.ACTION_CANCEL: {
-                cancel();
-                break;
-            }
-        }
-
-        return mDragState == STATE_DRAGGING;
-    }
-
-    /**
-     * Process a touch event received by the parent view. This method will dispatch callback events
-     * as needed before returning. The parent view's onTouchEvent implementation should call this.
-     *
-     * @param ev The touch event received by the parent view
-     */
-    public void processTouchEvent(MotionEvent ev) {
-        final int action = MotionEventCompat.getActionMasked(ev);
-        final int actionIndex = MotionEventCompat.getActionIndex(ev);
-
-        if (action == MotionEvent.ACTION_DOWN) {
-            // Reset things for a new event stream, just in case we didn't get
-            // the whole previous stream.
-            cancel();
-        }
-
-        if (mVelocityTracker == null) {
-            mVelocityTracker = VelocityTracker.obtain();
-        }
-        mVelocityTracker.addMovement(ev);
-
-        switch (action) {
-            case MotionEvent.ACTION_DOWN: {
-                final float x = ev.getX();
-                final float y = ev.getY();
-                final int pointerId = MotionEventCompat.getPointerId(ev, 0);
-                final View toCapture = findTopChildUnder((int) x, (int) y);
-
-                saveInitialMotion(x, y, pointerId);
-
-                // Since the parent is already directly processing this touch event,
-                // there is no reason to delay for a slop before dragging.
-                // Start immediately if possible.
-                tryCaptureViewForDrag(toCapture, pointerId);
-
-                final int edgesTouched = mInitialEdgesTouched[pointerId];
-                if ((edgesTouched & mTrackingEdges) != 0) {
-                    mCallback.onEdgeTouched(edgesTouched & mTrackingEdges, pointerId);
-                }
-                break;
-            }
-
-            case MotionEventCompat.ACTION_POINTER_DOWN: {
-                final int pointerId = MotionEventCompat.getPointerId(ev, actionIndex);
-                final float x = MotionEventCompat.getX(ev, actionIndex);
-                final float y = MotionEventCompat.getY(ev, actionIndex);
-
-                saveInitialMotion(x, y, pointerId);
-
-                // A ViewDragHelper can only manipulate one view at a time.
-                if (mDragState == STATE_IDLE) {
-                    // If we're idle we can do anything! Treat it like a normal down event.
-
-                    final View toCapture = findTopChildUnder((int) x, (int) y);
-                    tryCaptureViewForDrag(toCapture, pointerId);
-
-                    final int edgesTouched = mInitialEdgesTouched[pointerId];
-                    if ((edgesTouched & mTrackingEdges) != 0) {
-                        mCallback.onEdgeTouched(edgesTouched & mTrackingEdges, pointerId);
-                    }
-                } else if (isCapturedViewUnder((int) x, (int) y)) {
-                    // We're still tracking a captured view. If the same view is under this
-                    // point, we'll swap to controlling it with this pointer instead.
-                    // (This will still work if we're "catching" a settling view.)
-
-                    tryCaptureViewForDrag(mCapturedView, pointerId);
-                }
-                break;
-            }
-
-            case MotionEvent.ACTION_MOVE: {
-                if (mDragState == STATE_DRAGGING) {
-                    // If pointer is invalid then skip the ACTION_MOVE.
-                    if (!isValidPointerForActionMove(mActivePointerId)) break;
-
-                    final int index = MotionEventCompat.findPointerIndex(ev, mActivePointerId);
-                    final float x = MotionEventCompat.getX(ev, index);
-                    final float y = MotionEventCompat.getY(ev, index);
-                    final int idx = (int) (x - mLastMotionX[mActivePointerId]);
-                    final int idy = (int) (y - mLastMotionY[mActivePointerId]);
-
-                    dragTo(mCapturedView.getLeft() + idx, mCapturedView.getTop() + idy, idx, idy);
-
-                    saveLastMotion(ev);
-                } else {
-                    // Check to see if any pointer is now over a draggable view.
-                    final int pointerCount = MotionEventCompat.getPointerCount(ev);
-                    for (int i = 0; i < pointerCount; i++) {
-                        final int pointerId = MotionEventCompat.getPointerId(ev, i);
-
-                        // If pointer is invalid then skip the ACTION_MOVE.
-                        if (!isValidPointerForActionMove(pointerId)) continue;
-
-                        final float x = MotionEventCompat.getX(ev, i);
-                        final float y = MotionEventCompat.getY(ev, i);
-                        final float dx = x - mInitialMotionX[pointerId];
-                        final float dy = y - mInitialMotionY[pointerId];
-
-                        reportNewEdgeDrags(dx, dy, pointerId);
-                        if (mDragState == STATE_DRAGGING) {
-                            // Callback might have started an edge drag.
-                            break;
-                        }
-
-                        final View toCapture = findTopChildUnder((int) x, (int) y);
-                        if (checkTouchSlop(toCapture, dx, dy) &&
-                                tryCaptureViewForDrag(toCapture, pointerId)) {
-                            break;
-                        }
-                    }
-                    saveLastMotion(ev);
-                }
-                break;
-            }
-
-            case MotionEventCompat.ACTION_POINTER_UP: {
-                final int pointerId = MotionEventCompat.getPointerId(ev, actionIndex);
-                if (mDragState == STATE_DRAGGING && pointerId == mActivePointerId) {
-                    // Try to find another pointer that's still holding on to the captured view.
-                    int newActivePointer = INVALID_POINTER;
-                    final int pointerCount = MotionEventCompat.getPointerCount(ev);
-                    for (int i = 0; i < pointerCount; i++) {
-                        final int id = MotionEventCompat.getPointerId(ev, i);
-                        if (id == mActivePointerId) {
-                            // This one's going away, skip.
-                            continue;
-                        }
-
-                        final float x = MotionEventCompat.getX(ev, i);
-                        final float y = MotionEventCompat.getY(ev, i);
-                        if (findTopChildUnder((int) x, (int) y) == mCapturedView &&
-                                tryCaptureViewForDrag(mCapturedView, id)) {
-                            newActivePointer = mActivePointerId;
-                            break;
-                        }
-                    }
-
-                    if (newActivePointer == INVALID_POINTER) {
-                        // We didn't find another pointer still touching the view, release it.
-                        releaseViewForPointerUp();
-                    }
-                }
-                clearMotionHistory(pointerId);
-                break;
-            }
-
-            case MotionEvent.ACTION_UP: {
-                if (mDragState == STATE_DRAGGING) {
-                    releaseViewForPointerUp();
-                }
-                cancel();
-                break;
-            }
-
-            case MotionEvent.ACTION_CANCEL: {
-                if (mDragState == STATE_DRAGGING) {
-                    dispatchViewReleased(0, 0);
-                }
-                cancel();
-                break;
-            }
-        }
-    }
-
-    private void reportNewEdgeDrags(float dx, float dy, int pointerId) {
-        int dragsStarted = 0;
-        if (checkNewEdgeDrag(dx, dy, pointerId, EDGE_LEFT)) {
-            dragsStarted |= EDGE_LEFT;
-        }
-        if (checkNewEdgeDrag(dy, dx, pointerId, EDGE_TOP)) {
-            dragsStarted |= EDGE_TOP;
-        }
-        if (checkNewEdgeDrag(dx, dy, pointerId, EDGE_RIGHT)) {
-            dragsStarted |= EDGE_RIGHT;
-        }
-        if (checkNewEdgeDrag(dy, dx, pointerId, EDGE_BOTTOM)) {
-            dragsStarted |= EDGE_BOTTOM;
-        }
-
-        if (dragsStarted != 0) {
-            mEdgeDragsInProgress[pointerId] |= dragsStarted;
-            mCallback.onEdgeDragStarted(dragsStarted, pointerId);
-        }
-    }
-
-    private boolean checkNewEdgeDrag(float delta, float odelta, int pointerId, int edge) {
-        final float absDelta = Math.abs(delta);
-        final float absODelta = Math.abs(odelta);
-
-        if ((mInitialEdgesTouched[pointerId] & edge) != edge  || (mTrackingEdges & edge) == 0 ||
-                (mEdgeDragsLocked[pointerId] & edge) == edge ||
-                (mEdgeDragsInProgress[pointerId] & edge) == edge ||
-                (absDelta <= mTouchSlop && absODelta <= mTouchSlop)) {
-            return false;
-        }
-        if (absDelta < absODelta * 0.5f && mCallback.onEdgeLock(edge)) {
-            mEdgeDragsLocked[pointerId] |= edge;
-            return false;
-        }
-        return (mEdgeDragsInProgress[pointerId] & edge) == 0 && absDelta > mTouchSlop;
-    }
-
-    /**
-     * Check if we've crossed a reasonable touch slop for the given child view.
-     * If the child cannot be dragged along the horizontal or vertical axis, motion
-     * along that axis will not count toward the slop check.
-     *
-     * @param child Child to check
-     * @param dx Motion since initial position along X axis
-     * @param dy Motion since initial position along Y axis
-     * @return true if the touch slop has been crossed
-     */
-    private boolean checkTouchSlop(View child, float dx, float dy) {
-        if (child == null) {
-            return false;
-        }
-        final boolean checkHorizontal = mCallback.getViewHorizontalDragRange(child) > 0;
-        final boolean checkVertical = mCallback.getViewVerticalDragRange(child) > 0;
-
-        if (checkHorizontal && checkVertical) {
-            return dx * dx + dy * dy > mTouchSlop * mTouchSlop;
-        } else if (checkHorizontal) {
-            return Math.abs(dx) > mTouchSlop;
-        } else if (checkVertical) {
-            return Math.abs(dy) > mTouchSlop;
-        }
-        return false;
-    }
-
-    /**
-     * Check if any pointer tracked in the current gesture has crossed
-     * the required slop threshold.
-     *
-     * <p>This depends on internal state populated by
-     * {@link #shouldInterceptTouchEvent(android.view.MotionEvent)} or
-     * {@link #processTouchEvent(android.view.MotionEvent)}. You should only rely on
-     * the results of this method after all currently available touch data
-     * has been provided to one of these two methods.</p>
-     *
-     * @param directions Combination of direction flags, see {@link #DIRECTION_HORIZONTAL},
-     *                   {@link #DIRECTION_VERTICAL}, {@link #DIRECTION_ALL}
-     * @return true if the slop threshold has been crossed, false otherwise
-     */
-    public boolean checkTouchSlop(int directions) {
-        final int count = mInitialMotionX.length;
-        for (int i = 0; i < count; i++) {
-            if (checkTouchSlop(directions, i)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Check if the specified pointer tracked in the current gesture has crossed
-     * the required slop threshold.
-     *
-     * <p>This depends on internal state populated by
-     * {@link #shouldInterceptTouchEvent(android.view.MotionEvent)} or
-     * {@link #processTouchEvent(android.view.MotionEvent)}. You should only rely on
-     * the results of this method after all currently available touch data
-     * has been provided to one of these two methods.</p>
-     *
-     * @param directions Combination of direction flags, see {@link #DIRECTION_HORIZONTAL},
-     *                   {@link #DIRECTION_VERTICAL}, {@link #DIRECTION_ALL}
-     * @param pointerId ID of the pointer to slop check as specified by MotionEvent
-     * @return true if the slop threshold has been crossed, false otherwise
-     */
-    public boolean checkTouchSlop(int directions, int pointerId) {
-        if (!isPointerDown(pointerId)) {
-            return false;
-        }
-
-        final boolean checkHorizontal = (directions & DIRECTION_HORIZONTAL) == DIRECTION_HORIZONTAL;
-        final boolean checkVertical = (directions & DIRECTION_VERTICAL) == DIRECTION_VERTICAL;
-
-        final float dx = mLastMotionX[pointerId] - mInitialMotionX[pointerId];
-        final float dy = mLastMotionY[pointerId] - mInitialMotionY[pointerId];
-
-        if (checkHorizontal && checkVertical) {
-            return dx * dx + dy * dy > mTouchSlop * mTouchSlop;
-        } else if (checkHorizontal) {
-            return Math.abs(dx) > mTouchSlop;
-        } else if (checkVertical) {
-            return Math.abs(dy) > mTouchSlop;
-        }
-        return false;
-    }
-
-    /**
-     * Check if any of the edges specified were initially touched in the currently active gesture.
-     * If there is no currently active gesture this method will return false.
-     *
-     * @param edges Edges to check for an initial edge touch. See {@link #EDGE_LEFT},
-     *              {@link #EDGE_TOP}, {@link #EDGE_RIGHT}, {@link #EDGE_BOTTOM} and
-     *              {@link #EDGE_ALL}
-     * @return true if any of the edges specified were initially touched in the current gesture
-     */
-    public boolean isEdgeTouched(int edges) {
-        final int count = mInitialEdgesTouched.length;
-        for (int i = 0; i < count; i++) {
-            if (isEdgeTouched(edges, i)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Check if any of the edges specified were initially touched by the pointer with
-     * the specified ID. If there is no currently active gesture or if there is no pointer with
-     * the given ID currently down this method will return false.
-     *
-     * @param edges Edges to check for an initial edge touch. See {@link #EDGE_LEFT},
-     *              {@link #EDGE_TOP}, {@link #EDGE_RIGHT}, {@link #EDGE_BOTTOM} and
-     *              {@link #EDGE_ALL}
-     * @return true if any of the edges specified were initially touched in the current gesture
-     */
-    public boolean isEdgeTouched(int edges, int pointerId) {
-        return isPointerDown(pointerId) && (mInitialEdgesTouched[pointerId] & edges) != 0;
-    }
-
-    private void releaseViewForPointerUp() {
-        mVelocityTracker.computeCurrentVelocity(1000, mMaxVelocity);
-        final float xvel = clampMag(
-                VelocityTrackerCompat.getXVelocity(mVelocityTracker, mActivePointerId),
-                mMinVelocity, mMaxVelocity);
-        final float yvel = clampMag(
-                VelocityTrackerCompat.getYVelocity(mVelocityTracker, mActivePointerId),
-                mMinVelocity, mMaxVelocity);
-        dispatchViewReleased(xvel, yvel);
-    }
-
-    private void dragTo(int left, int top, int dx, int dy) {
-        int clampedX = left;
-        int clampedY = top;
-        final int oldLeft = mCapturedView.getLeft();
-        final int oldTop = mCapturedView.getTop();
-        if (dx != 0) {
-            clampedX = mCallback.clampViewPositionHorizontal(mCapturedView, left, dx);
-            ViewCompat.offsetLeftAndRight(mCapturedView, clampedX - oldLeft);
-        }
-        if (dy != 0) {
-            clampedY = mCallback.clampViewPositionVertical(mCapturedView, top, dy);
-            ViewCompat.offsetTopAndBottom(mCapturedView, clampedY - oldTop);
-        }
-
-        if (dx != 0 || dy != 0) {
-            final int clampedDx = clampedX - oldLeft;
-            final int clampedDy = clampedY - oldTop;
-            mCallback.onViewPositionChanged(mCapturedView, clampedX, clampedY,
-                    clampedDx, clampedDy);
-        }
-    }
-
-    /**
-     * Determine if the currently captured view is under the given point in the
-     * parent view's coordinate system. If there is no captured view this method
-     * will return false.
-     *
-     * @param x X position to test in the parent's coordinate system
-     * @param y Y position to test in the parent's coordinate system
-     * @return true if the captured view is under the given point, false otherwise
-     */
-    public boolean isCapturedViewUnder(int x, int y) {
-        return isViewUnder(mCapturedView, x, y);
-    }
-
-    /**
-     * Determine if the supplied view is under the given point in the
-     * parent view's coordinate system.
-     *
-     * @param view Child view of the parent to hit test
-     * @param x X position to test in the parent's coordinate system
-     * @param y Y position to test in the parent's coordinate system
-     * @return true if the supplied view is under the given point, false otherwise
-     */
-    public boolean isViewUnder(View view, int x, int y) {
-        if (view == null) {
-            return false;
-        }
-        return x >= view.getLeft() &&
-                x < view.getRight() &&
-                y >= view.getTop() &&
-                y < view.getBottom();
-    }
-
-    /**
-     * Find the topmost child under the given point within the parent view's coordinate system.
-     * The child order is determined using {@link Callback#getOrderedChildIndex(int)}.
-     *
-     * @param x X position to test in the parent's coordinate system
-     * @param y Y position to test in the parent's coordinate system
-     * @return The topmost child view under (x, y) or null if none found.
-     */
-    public View findTopChildUnder(int x, int y) {
-        final int childCount = mParentView.getChildCount();
-        for (int i = childCount - 1; i >= 0; i--) {
-            final View child = mParentView.getChildAt(mCallback.getOrderedChildIndex(i));
-            if (x >= child.getLeft() && x < child.getRight() &&
-                    y >= child.getTop() && y < child.getBottom()) {
-                return child;
-            }
-        }
-        return null;
-    }
-
-    private int getEdgesTouched(int x, int y) {
-        int result = 0;
-
-        if (x < mParentView.getLeft() + mEdgeSize) result |= EDGE_LEFT;
-        if (y < mParentView.getTop() + mEdgeSize) result |= EDGE_TOP;
-        if (x > mParentView.getRight() - mEdgeSize) result |= EDGE_RIGHT;
-        if (y > mParentView.getBottom() - mEdgeSize) result |= EDGE_BOTTOM;
-
-        return result;
-    }
-
-    private boolean isValidPointerForActionMove(int pointerId) {
-        if (!isPointerDown(pointerId)) {
-            Log.e(TAG, "Ignoring pointerId=" + pointerId + " because ACTION_DOWN was not received "
-                    + "for this pointer before ACTION_MOVE. It likely happened because "
-                    + " ViewDragHelper did not receive all the events in the event stream.");
-            return false;
-        }
-        return true;
-    }
-}
\ No newline at end of file
diff --git a/v4/kitkat/android/support/v4/view/accessibility/AccessibilityNodeInfoCompatKitKat.java b/v4/kitkat/android/support/v4/view/accessibility/AccessibilityNodeInfoCompatKitKat.java
deleted file mode 100644
index 0629d24..0000000
--- a/v4/kitkat/android/support/v4/view/accessibility/AccessibilityNodeInfoCompatKitKat.java
+++ /dev/null
@@ -1,181 +0,0 @@
-/*
- * Copyright (C) 2012 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 android.support.v4.view.accessibility;
-
-import android.os.Bundle;
-import android.view.accessibility.AccessibilityNodeInfo;
-
-/**
- * KitKat-specific AccessibilityNodeInfo API implementation.
- */
-class AccessibilityNodeInfoCompatKitKat {
-    private static final String ROLE_DESCRIPTION_KEY =
-            "AccessibilityNodeInfo.roleDescription";
-
-    static int getLiveRegion(Object info) {
-        return ((AccessibilityNodeInfo) info).getLiveRegion();
-    }
-
-    static void setLiveRegion(Object info, int mode) {
-        ((AccessibilityNodeInfo) info).setLiveRegion(mode);
-    }
-
-    static Object getCollectionInfo(Object info) {
-        return ((AccessibilityNodeInfo) info).getCollectionInfo();
-    }
-
-    static Object getCollectionItemInfo(Object info) {
-        return ((AccessibilityNodeInfo) info).getCollectionItemInfo();
-    }
-
-    public static void setCollectionInfo(Object info, Object collectionInfo) {
-        ((AccessibilityNodeInfo) info).setCollectionInfo(
-                (AccessibilityNodeInfo.CollectionInfo)collectionInfo);
-    }
-
-    public static void setCollectionItemInfo(Object info, Object collectionItemInfo) {
-        ((AccessibilityNodeInfo) info).setCollectionItemInfo(
-                (AccessibilityNodeInfo.CollectionItemInfo) collectionItemInfo);
-    }
-
-    static Object getRangeInfo(Object info) {
-        return ((AccessibilityNodeInfo) info).getRangeInfo();
-    }
-
-    public static void setRangeInfo(Object info, Object rangeInfo) {
-        ((AccessibilityNodeInfo) info).setRangeInfo((AccessibilityNodeInfo.RangeInfo) rangeInfo);
-    }
-
-    public static Object obtainCollectionInfo(int rowCount, int columnCount,
-            boolean hierarchical, int selectionMode) {
-        return AccessibilityNodeInfo.CollectionInfo.obtain(rowCount, columnCount, hierarchical);
-    }
-
-    public static Object obtainCollectionItemInfo(int rowIndex, int rowSpan, int columnIndex,
-            int columnSpan, boolean heading) {
-        return AccessibilityNodeInfo.CollectionItemInfo.obtain(rowIndex, rowSpan, columnIndex,
-                columnSpan, heading);
-    }
-
-    public static void setContentInvalid(Object info, boolean contentInvalid) {
-        ((AccessibilityNodeInfo) info).setContentInvalid(contentInvalid);
-    }
-
-    public static boolean isContentInvalid(Object info) {
-        return ((AccessibilityNodeInfo) info).isContentInvalid();
-    }
-
-    public static boolean canOpenPopup(Object info) {
-        return ((AccessibilityNodeInfo) info).canOpenPopup();
-    }
-
-    public static void setCanOpenPopup(Object info, boolean opensPopup) {
-        ((AccessibilityNodeInfo) info).setCanOpenPopup(opensPopup);
-    }
-
-    public static Bundle getExtras(Object info) {
-        return ((AccessibilityNodeInfo) info).getExtras();
-    }
-
-    public static int getInputType(Object info) {
-        return ((AccessibilityNodeInfo) info).getInputType();
-    }
-
-    public static void setInputType(Object info, int inputType) {
-        ((AccessibilityNodeInfo) info).setInputType(inputType);
-    }
-
-    public static boolean isDismissable(Object info) {
-        return ((AccessibilityNodeInfo) info).isDismissable();
-    }
-
-    public static void setDismissable(Object info, boolean dismissable) {
-        ((AccessibilityNodeInfo) info).setDismissable(dismissable);
-    }
-
-    public static boolean isMultiLine(Object info) {
-        return ((AccessibilityNodeInfo) info).isMultiLine();
-    }
-
-    public static void setMultiLine(Object info, boolean multiLine) {
-        ((AccessibilityNodeInfo) info).setMultiLine(multiLine);
-    }
-
-    public static CharSequence getRoleDescription(Object info) {
-        Bundle extras = getExtras(info);
-        return extras.getCharSequence(ROLE_DESCRIPTION_KEY);
-    }
-
-    public static void setRoleDescription(Object info, CharSequence roleDescription) {
-        Bundle extras = getExtras(info);
-        extras.putCharSequence(ROLE_DESCRIPTION_KEY, roleDescription);
-    }
-
-    static class CollectionInfo {
-        static int getColumnCount(Object info) {
-            return ((AccessibilityNodeInfo.CollectionInfo) info).getColumnCount();
-        }
-
-        static int getRowCount(Object info) {
-            return ((AccessibilityNodeInfo.CollectionInfo) info).getRowCount();
-        }
-
-        static boolean isHierarchical(Object info) {
-            return ((AccessibilityNodeInfo.CollectionInfo) info).isHierarchical();
-        }
-    }
-
-    static class CollectionItemInfo {
-        static int getColumnIndex(Object info) {
-            return ((AccessibilityNodeInfo.CollectionItemInfo) info).getColumnIndex();
-        }
-
-        static int getColumnSpan(Object info) {
-            return ((AccessibilityNodeInfo.CollectionItemInfo) info).getColumnSpan();
-        }
-
-        static int getRowIndex(Object info) {
-            return ((AccessibilityNodeInfo.CollectionItemInfo) info).getRowIndex();
-        }
-
-        static int getRowSpan(Object info) {
-            return ((AccessibilityNodeInfo.CollectionItemInfo) info).getRowSpan();
-        }
-
-        static boolean isHeading(Object info) {
-            return ((AccessibilityNodeInfo.CollectionItemInfo) info).isHeading();
-        }
-    }
-
-    static class RangeInfo {
-        static float getCurrent(Object info) {
-            return ((AccessibilityNodeInfo.RangeInfo) info).getCurrent();
-        }
-
-        static float getMax(Object info) {
-            return ((AccessibilityNodeInfo.RangeInfo) info).getMax();
-        }
-
-        static float getMin(Object info) {
-            return ((AccessibilityNodeInfo.RangeInfo) info).getMin();
-        }
-
-        static int getType(Object info) {
-            return ((AccessibilityNodeInfo.RangeInfo) info).getType();
-        }
-    }
-}
diff --git a/v4/tests/AndroidManifest.xml b/v4/tests/AndroidManifest.xml
index 4ad6ffa..4cee865 100644
--- a/v4/tests/AndroidManifest.xml
+++ b/v4/tests/AndroidManifest.xml
@@ -16,9 +16,9 @@
   -->
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
           xmlns:tools="http://schemas.android.com/tools"
-          package="android.support.v4.test">
+          package="android.support.coreutils.test">
     <uses-sdk
-            android:minSdkVersion="4"
+            android:minSdkVersion="9"
             android:targetSdkVersion="23"
             tools:overrideLibrary="android.support.test, android.app, android.support.test.rule,
                       android.support.test.espresso, android.support.test.espresso.idling"/>
@@ -28,33 +28,11 @@
     <uses-permission android:name="android.permission.READ_CONTACTS"/>
     <uses-permission android:name="android.permission.WRITE_CONTACTS"/>
 
-    <application
-            android:supportsRtl="true"
-            android:theme="@style/TestActivityTheme">
+    <application>
         <uses-library android:name="android.test.runner" />
-        <activity android:name="android.support.v4.widget.TextViewTestActivity"/>
-
-        <activity android:name="android.support.v4.widget.SwipeRefreshLayoutActivity"/>
-
-        <activity android:name="android.support.v4.widget.ExploreByTouchHelperTestActivity"/>
-
-        <activity android:name="android.support.v4.view.ViewPagerWithTitleStripActivity"/>
-
-        <activity android:name="android.support.v4.view.ViewPagerWithTabStripActivity"/>
-
-        <activity android:name="android.support.v4.view.VpaActivity"/>
-
-        <activity
-            android:name="android.support.v4.ThemedYellowActivity"
-            android:theme="@style/YellowTheme" />
-        <activity android:name="android.support.v4.app.test.FragmentTestActivity"/>
-
-        <activity android:name="android.support.v4.app.test.EmptyFragmentTestActivity" />
-
-        <activity android:name="android.support.v4.app.test.FragmentResultActivity" />
     </application>
 
     <instrumentation android:name="android.test.InstrumentationTestRunner"
-                     android:targetPackage="android.support.v4.test"
+                     android:targetPackage="android.support.coreutils.test"
                      />
 </manifest>
diff --git a/v4/tests/java/android/support/v4/app/FragmentLifecycleTest.java b/v4/tests/java/android/support/v4/app/FragmentLifecycleTest.java
deleted file mode 100644
index 764a6ec..0000000
--- a/v4/tests/java/android/support/v4/app/FragmentLifecycleTest.java
+++ /dev/null
@@ -1,706 +0,0 @@
-/*
- * Copyright (C) 2016 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 android.support.v4.app;
-
-import android.content.Context;
-import android.content.Intent;
-import android.os.Bundle;
-import android.os.Parcelable;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.test.annotation.UiThreadTest;
-import android.support.test.rule.ActivityTestRule;
-import android.support.test.runner.AndroidJUnit4;
-import android.support.v4.app.test.EmptyFragmentTestActivity;
-import android.support.v4.test.R;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.Window;
-
-import android.widget.TextView;
-import org.junit.Assert;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import java.io.FileDescriptor;
-import java.io.PrintWriter;
-
-import static junit.framework.Assert.assertEquals;
-import static junit.framework.Assert.assertFalse;
-import static junit.framework.Assert.assertNotNull;
-import static junit.framework.Assert.assertNotSame;
-import static junit.framework.Assert.assertNull;
-import static junit.framework.Assert.assertSame;
-import static junit.framework.Assert.assertTrue;
-import static org.junit.Assert.assertNotEquals;
-
-@RunWith(AndroidJUnit4.class)
-@MediumTest
-public class FragmentLifecycleTest {
-
-    @Rule
-    public ActivityTestRule<EmptyFragmentTestActivity> mActivityRule =
-            new ActivityTestRule<EmptyFragmentTestActivity>(EmptyFragmentTestActivity.class);
-
-    @Test
-    public void basicLifecycle() throws Throwable {
-        final FragmentManager fm = mActivityRule.getActivity().getSupportFragmentManager();
-        final StrictFragment strictFragment = new StrictFragment();
-
-        // Add fragment; StrictFragment will throw if it detects any violation
-        // in standard lifecycle method ordering or expected preconditions.
-        fm.beginTransaction().add(strictFragment, "EmptyHeadless").commit();
-        executePendingTransactions(fm);
-
-        assertTrue("fragment is not added", strictFragment.isAdded());
-        assertFalse("fragment is detached", strictFragment.isDetached());
-        assertTrue("fragment is not resumed", strictFragment.isResumed());
-
-        // Test removal as well; StrictFragment will throw here too.
-        fm.beginTransaction().remove(strictFragment).commit();
-        executePendingTransactions(fm);
-
-        assertFalse("fragment is added", strictFragment.isAdded());
-        assertFalse("fragment is resumed", strictFragment.isResumed());
-
-        // This one is perhaps counterintuitive; "detached" means specifically detached
-        // but still managed by a FragmentManager. The .remove call above
-        // should not enter this state.
-        assertFalse("fragment is detached", strictFragment.isDetached());
-    }
-
-    @Test
-    public void detachment() throws Throwable {
-        final FragmentManager fm = mActivityRule.getActivity().getSupportFragmentManager();
-        final StrictFragment f1 = new StrictFragment();
-        final StrictFragment f2 = new StrictFragment();
-
-        fm.beginTransaction().add(f1, "1").add(f2, "2").commit();
-        executePendingTransactions(fm);
-
-        assertTrue("fragment 1 is not added", f1.isAdded());
-        assertTrue("fragment 2 is not added", f2.isAdded());
-
-        // Test detaching fragments using StrictFragment to throw on errors.
-        fm.beginTransaction().detach(f1).detach(f2).commit();
-        executePendingTransactions(fm);
-
-        assertTrue("fragment 1 is not detached", f1.isDetached());
-        assertTrue("fragment 2 is not detached", f2.isDetached());
-        assertFalse("fragment 1 is added", f1.isAdded());
-        assertFalse("fragment 2 is added", f2.isAdded());
-
-        // Only reattach f1; leave v2 detached.
-        fm.beginTransaction().attach(f1).commit();
-        executePendingTransactions(fm);
-
-        assertTrue("fragment 1 is not added", f1.isAdded());
-        assertFalse("fragment 1 is detached", f1.isDetached());
-        assertTrue("fragment 2 is not detached", f2.isDetached());
-
-        // Remove both from the FragmentManager.
-        fm.beginTransaction().remove(f1).remove(f2).commit();
-        executePendingTransactions(fm);
-
-        assertFalse("fragment 1 is added", f1.isAdded());
-        assertFalse("fragment 2 is added", f2.isAdded());
-        assertFalse("fragment 1 is detached", f1.isDetached());
-        assertFalse("fragment 2 is detached", f2.isDetached());
-    }
-
-    @Test
-    public void basicBackStack() throws Throwable {
-        final FragmentManager fm = mActivityRule.getActivity().getSupportFragmentManager();
-        final StrictFragment f1 = new StrictFragment();
-        final StrictFragment f2 = new StrictFragment();
-
-        // Add a fragment normally to set up
-        fm.beginTransaction().add(f1, "1").commit();
-        executePendingTransactions(fm);
-
-        assertTrue("fragment 1 is not added", f1.isAdded());
-
-        // Remove the first one and add a second. We're not using replace() here since
-        // these fragments are headless and as of this test writing, replace() only works
-        // for fragments with views and a container view id.
-        // Add it to the back stack so we can pop it afterwards.
-        fm.beginTransaction().remove(f1).add(f2, "2").addToBackStack("stack1").commit();
-        executePendingTransactions(fm);
-
-        assertFalse("fragment 1 is added", f1.isAdded());
-        assertTrue("fragment 2 is not added", f2.isAdded());
-
-        // Test popping the stack
-        fm.popBackStack();
-        executePendingTransactions(fm);
-
-        assertFalse("fragment 2 is added", f2.isAdded());
-        assertTrue("fragment 1 is not added", f1.isAdded());
-    }
-
-    @Test
-    public void attachBackStack() throws Throwable {
-        final FragmentManager fm = mActivityRule.getActivity().getSupportFragmentManager();
-        final StrictFragment f1 = new StrictFragment();
-        final StrictFragment f2 = new StrictFragment();
-
-        // Add a fragment normally to set up
-        fm.beginTransaction().add(f1, "1").commit();
-        executePendingTransactions(fm);
-
-        assertTrue("fragment 1 is not added", f1.isAdded());
-
-        fm.beginTransaction().detach(f1).add(f2, "2").addToBackStack("stack1").commit();
-        executePendingTransactions(fm);
-
-        assertTrue("fragment 1 is not detached", f1.isDetached());
-        assertFalse("fragment 2 is detached", f2.isDetached());
-        assertFalse("fragment 1 is added", f1.isAdded());
-        assertTrue("fragment 2 is not added", f2.isAdded());
-    }
-
-    @Test
-    public void viewLifecycle() throws Throwable {
-        // Test basic lifecycle when the fragment creates a view
-
-        final FragmentManager fm = mActivityRule.getActivity().getSupportFragmentManager();
-        final StrictViewFragment f1 = new StrictViewFragment();
-
-        fm.beginTransaction().add(android.R.id.content, f1).commit();
-        executePendingTransactions(fm);
-
-        assertTrue("fragment 1 is not added", f1.isAdded());
-        final View view = f1.getView();
-        assertNotNull("fragment 1 returned null from getView", view);
-        assertTrue("fragment 1's view is not attached to a window", view.isAttachedToWindow());
-
-        fm.beginTransaction().remove(f1).commit();
-        executePendingTransactions(fm);
-
-        assertFalse("fragment 1 is added", f1.isAdded());
-        assertNull("fragment 1 returned non-null from getView after removal", f1.getView());
-        assertFalse("fragment 1's previous view is still attached to a window",
-                view.isAttachedToWindow());
-    }
-
-    @Test
-    public void viewReplace() throws Throwable {
-        // Replace one view with another, then reverse it with the back stack
-
-        final FragmentManager fm = mActivityRule.getActivity().getSupportFragmentManager();
-        final StrictViewFragment f1 = new StrictViewFragment();
-        final StrictViewFragment f2 = new StrictViewFragment();
-
-        fm.beginTransaction().add(android.R.id.content, f1).commit();
-        executePendingTransactions(fm);
-
-        assertTrue("fragment 1 is not added", f1.isAdded());
-
-        View origView1 = f1.getView();
-        assertNotNull("fragment 1 returned null view", origView1);
-        assertTrue("fragment 1's view not attached", origView1.isAttachedToWindow());
-
-        fm.beginTransaction().replace(android.R.id.content, f2).addToBackStack("stack1").commit();
-        executePendingTransactions(fm);
-
-        assertFalse("fragment 1 is added", f1.isAdded());
-        assertTrue("fragment 2 is added", f2.isAdded());
-        assertNull("fragment 1 returned non-null view", f1.getView());
-        assertFalse("fragment 1's old view still attached", origView1.isAttachedToWindow());
-        View origView2 = f2.getView();
-        assertNotNull("fragment 2 returned null view", origView2);
-        assertTrue("fragment 2's view not attached", origView2.isAttachedToWindow());
-
-        fm.popBackStack();
-        executePendingTransactions(fm);
-
-        assertTrue("fragment 1 is not added", f1.isAdded());
-        assertFalse("fragment 2 is added", f2.isAdded());
-        assertNull("fragment 2 returned non-null view", f2.getView());
-        assertFalse("fragment 2's view still attached", origView2.isAttachedToWindow());
-        View newView1 = f1.getView();
-        assertNotSame("fragment 1 had same view from last attachment", origView1, newView1);
-        assertTrue("fragment 1's view not attached", newView1.isAttachedToWindow());
-    }
-
-    @Test
-    @UiThreadTest
-    public void restoreRetainedInstanceFragments() throws Throwable {
-        // Create a new FragmentManager in isolation, nest some assorted fragments
-        // and then restore them to a second new FragmentManager.
-
-        final FragmentController fc1 = FragmentController.createController(
-                new HostCallbacks(mActivityRule.getActivity()));
-
-        final FragmentManager fm1 = fc1.getSupportFragmentManager();
-
-        fc1.attachHost(null);
-        fc1.dispatchCreate();
-
-        // Configure fragments.
-
-        // Grandparent fragment will not retain instance
-        final StateSaveFragment grandparentFragment = new StateSaveFragment("Grandparent",
-                "UnsavedGrandparent");
-        assertNotNull("grandparent fragment saved state not initialized",
-                grandparentFragment.getSavedState());
-        assertNotNull("grandparent fragment unsaved state not initialized",
-                grandparentFragment.getUnsavedState());
-        fm1.beginTransaction().add(grandparentFragment, "tag:grandparent").commitNow();
-
-        // Parent fragment will retain instance
-        final StateSaveFragment parentFragment = new StateSaveFragment("Parent", "UnsavedParent");
-        assertNotNull("parent fragment saved state not initialized",
-                parentFragment.getSavedState());
-        assertNotNull("parent fragment unsaved state not initialized",
-                parentFragment.getUnsavedState());
-        parentFragment.setRetainInstance(true);
-        grandparentFragment.getChildFragmentManager().beginTransaction()
-                .add(parentFragment, "tag:parent").commitNow();
-        assertSame("parent fragment is not a child of grandparent",
-                grandparentFragment, parentFragment.getParentFragment());
-
-        // Child fragment will not retain instance
-        final StateSaveFragment childFragment = new StateSaveFragment("Child", "UnsavedChild");
-        assertNotNull("child fragment saved state not initialized",
-                childFragment.getSavedState());
-        assertNotNull("child fragment unsaved state not initialized",
-                childFragment.getUnsavedState());
-        parentFragment.getChildFragmentManager().beginTransaction()
-                .add(childFragment, "tag:child").commitNow();
-        assertSame("child fragment is not a child of grandpanret",
-                parentFragment, childFragment.getParentFragment());
-
-        // Saved for comparison later
-        final FragmentManager parentChildFragmentManager = parentFragment.getChildFragmentManager();
-
-        fc1.dispatchActivityCreated();
-        fc1.noteStateNotSaved();
-        fc1.execPendingActions();
-        fc1.doLoaderStart();
-        fc1.dispatchStart();
-        fc1.reportLoaderStart();
-        fc1.dispatchResume();
-        fc1.execPendingActions();
-
-        // Bring the state back down to destroyed, simulating an activity restart
-        fc1.dispatchPause();
-        final Parcelable savedState = fc1.saveAllState();
-        final FragmentManagerNonConfig nonconf = fc1.retainNestedNonConfig();
-        fc1.dispatchStop();
-        fc1.dispatchReallyStop();
-        fc1.dispatchDestroy();
-
-        // Create the new controller and restore state
-        final FragmentController fc2 = FragmentController.createController(
-                new HostCallbacks(mActivityRule.getActivity()));
-
-        final FragmentManager fm2 = fc2.getSupportFragmentManager();
-
-        fc2.attachHost(null);
-        fc2.restoreAllState(savedState, nonconf);
-        fc2.dispatchCreate();
-
-        // Confirm that the restored fragments are available and in the expected states
-        final StateSaveFragment restoredGrandparent = (StateSaveFragment) fm2.findFragmentByTag(
-                "tag:grandparent");
-        assertNotNull("grandparent fragment not restored", restoredGrandparent);
-
-        assertNotSame("grandparent fragment instance was saved",
-                grandparentFragment, restoredGrandparent);
-        assertEquals("grandparent fragment saved state was not equal",
-                grandparentFragment.getSavedState(), restoredGrandparent.getSavedState());
-        assertNotEquals("grandparent fragment unsaved state was unexpectedly preserved",
-                grandparentFragment.getUnsavedState(), restoredGrandparent.getUnsavedState());
-
-        final StateSaveFragment restoredParent = (StateSaveFragment) restoredGrandparent
-                .getChildFragmentManager().findFragmentByTag("tag:parent");
-        assertNotNull("parent fragment not restored", restoredParent);
-
-        assertSame("parent fragment instance was not saved", parentFragment, restoredParent);
-        assertEquals("parent fragment saved state was not equal",
-                parentFragment.getSavedState(), restoredParent.getSavedState());
-        assertEquals("parent fragment unsaved state was not equal",
-                parentFragment.getUnsavedState(), restoredParent.getUnsavedState());
-        assertNotSame("parent fragment has the same child FragmentManager",
-                parentChildFragmentManager, restoredParent.getChildFragmentManager());
-
-        final StateSaveFragment restoredChild = (StateSaveFragment) restoredParent
-                .getChildFragmentManager().findFragmentByTag("tag:child");
-        assertNotNull("child fragment not restored", restoredChild);
-
-        assertNotSame("child fragment instance state was saved", childFragment, restoredChild);
-        assertEquals("child fragment saved state was not equal",
-                childFragment.getSavedState(), restoredChild.getSavedState());
-        assertNotEquals("child fragment saved state was unexpectedly equal",
-                childFragment.getUnsavedState(), restoredChild.getUnsavedState());
-
-        fc2.dispatchActivityCreated();
-        fc2.noteStateNotSaved();
-        fc2.execPendingActions();
-        fc2.doLoaderStart();
-        fc2.dispatchStart();
-        fc2.reportLoaderStart();
-        fc2.dispatchResume();
-        fc2.execPendingActions();
-
-        // Test that the fragments are in the configuration we expect
-
-        // Bring the state back down to destroyed before we finish the test
-        fc2.dispatchPause();
-        fc2.saveAllState();
-        fc2.dispatchStop();
-        fc2.dispatchReallyStop();
-        fc2.dispatchDestroy();
-
-        assertTrue("grandparent not destroyed", restoredGrandparent.mCalledOnDestroy);
-        assertTrue("parent not destroyed", restoredParent.mCalledOnDestroy);
-        assertTrue("child not destroyed", restoredChild.mCalledOnDestroy);
-    }
-
-    @Test
-    @UiThreadTest
-    public void saveAnimationState() throws Throwable {
-        FragmentController fc = startupFragmentController(null);
-        FragmentManager fm = fc.getSupportFragmentManager();
-
-        fm.beginTransaction()
-                .setCustomAnimations(0, R.anim.fade_out, R.anim.fade_in, R.anim.fade_out)
-                .add(android.R.id.content, SimpleFragment.create(R.layout.fragment_a))
-                .addToBackStack(null)
-                .commit();
-        fm.executePendingTransactions();
-
-        assertAnimationsMatch(fm, 0, R.anim.fade_out, R.anim.fade_in, R.anim.fade_out);
-
-        // Causes save and restore of fragments and back stack
-        fc = restartFragmentController(fc);
-        fm = fc.getSupportFragmentManager();
-
-        assertAnimationsMatch(fm, 0, R.anim.fade_out, R.anim.fade_in, R.anim.fade_out);
-
-        fm.beginTransaction()
-                .setCustomAnimations(R.anim.fade_in, R.anim.fade_out, 0, 0)
-                .replace(android.R.id.content, SimpleFragment.create(R.layout.fragment_b))
-                .addToBackStack(null)
-                .commit();
-        fm.executePendingTransactions();
-
-        assertAnimationsMatch(fm, R.anim.fade_in, R.anim.fade_out, 0, 0);
-
-        // Causes save and restore of fragments and back stack
-        fc = restartFragmentController(fc);
-        fm = fc.getSupportFragmentManager();
-
-        assertAnimationsMatch(fm, R.anim.fade_in, R.anim.fade_out, 0, 0);
-
-        fm.popBackStackImmediate();
-
-        assertAnimationsMatch(fm, 0, R.anim.fade_out, R.anim.fade_in, R.anim.fade_out);
-
-        shutdownFragmentController(fc);
-    }
-
-    /**
-     * This test confirms that as long as a parent fragment has called super.onCreate,
-     * any child fragments added, committed and with transactions executed will be brought
-     * to at least the CREATED state by the time the parent fragment receives onCreateView.
-     * This means the child fragment will have received onAttach/onCreate.
-     */
-    @Test
-    @UiThreadTest
-    public void childFragmentManagerAttach() throws Throwable {
-        FragmentController fc = FragmentController.createController(
-                new HostCallbacks(mActivityRule.getActivity()));
-        fc.attachHost(null);
-        fc.dispatchCreate();
-
-        FragmentManager fm = fc.getSupportFragmentManager();
-
-        ChildFragmentManagerFragment fragment = new ChildFragmentManagerFragment();
-        fm.beginTransaction()
-                .add(android.R.id.content, fragment)
-                .commitNow();
-
-        fc.dispatchActivityCreated();
-
-        fc.dispatchStart();
-        fc.dispatchResume();
-
-        // Confirm that the parent fragment received onAttachFragment
-        assertTrue("parent fragment did not receive onAttachFragment",
-                fragment.mCalledOnAttachFragment);
-
-        fc.dispatchStop();
-        fc.dispatchReallyStop();
-        fc.dispatchDestroy();
-    }
-
-    private void assertAnimationsMatch(FragmentManager fm, int enter, int exit, int popEnter,
-            int popExit) {
-        FragmentManagerImpl fmImpl = (FragmentManagerImpl) fm;
-        BackStackRecord record = fmImpl.mBackStack.get(fmImpl.mBackStack.size() - 1);
-
-        Assert.assertEquals(enter, record.mEnterAnim);
-        Assert.assertEquals(exit, record.mExitAnim);
-        Assert.assertEquals(popEnter, record.mPopEnterAnim);
-        Assert.assertEquals(popExit, record.mPopExitAnim);
-    }
-
-    private FragmentController restartFragmentController(FragmentController fc) {
-        Parcelable savedState = shutdownFragmentController(fc);
-        return startupFragmentController(savedState);
-    }
-
-    private FragmentController startupFragmentController(Parcelable savedState) {
-        final FragmentController fc = FragmentController.createController(
-                new HostCallbacks(mActivityRule.getActivity()));
-        fc.attachHost(null);
-        fc.restoreAllState(savedState, (FragmentManagerNonConfig) null);
-        fc.dispatchCreate();
-        fc.dispatchActivityCreated();
-        fc.noteStateNotSaved();
-        fc.execPendingActions();
-        fc.doLoaderStart();
-        fc.dispatchStart();
-        fc.reportLoaderStart();
-        fc.dispatchResume();
-        fc.execPendingActions();
-        return fc;
-    }
-
-    private Parcelable shutdownFragmentController(FragmentController fc) {
-        fc.dispatchPause();
-        final Parcelable savedState = fc.saveAllState();
-        fc.dispatchStop();
-        fc.dispatchReallyStop();
-        fc.dispatchDestroy();
-        return savedState;
-    }
-
-    private void executePendingTransactions(final FragmentManager fm) throws Throwable {
-        mActivityRule.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                fm.executePendingTransactions();
-            }
-        });
-    }
-
-    public static class StateSaveFragment extends StrictFragment {
-        private static final String STATE_KEY = "state";
-
-        private String mSavedState;
-        private String mUnsavedState;
-
-        public StateSaveFragment() {
-        }
-
-        public StateSaveFragment(String savedState, String unsavedState) {
-            mSavedState = savedState;
-            mUnsavedState = unsavedState;
-        }
-
-        public String getSavedState() {
-            return mSavedState;
-        }
-
-        public String getUnsavedState() {
-            return mUnsavedState;
-        }
-
-        @Override
-        public void onCreate(Bundle savedInstanceState) {
-            super.onCreate(savedInstanceState);
-            if (savedInstanceState != null) {
-                mSavedState = savedInstanceState.getString(STATE_KEY);
-            }
-        }
-
-        @Override
-        public void onSaveInstanceState(Bundle outState) {
-            super.onSaveInstanceState(outState);
-            outState.putString(STATE_KEY, mSavedState);
-        }
-    }
-
-    public static class ChildFragmentManagerFragment extends StrictFragment {
-        private FragmentManager mSavedChildFragmentManager;
-
-        @Override
-        public void onAttach(Context context) {
-            super.onAttach(context);
-            mSavedChildFragmentManager = getChildFragmentManager();
-        }
-
-        @Nullable
-        @Override
-        public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
-                @Nullable Bundle savedInstanceState) {
-            assertSame("child FragmentManagers not the same instance", mSavedChildFragmentManager,
-                    getChildFragmentManager());
-            ChildFragmentManagerChildFragment child = new ChildFragmentManagerChildFragment("foo");
-            mSavedChildFragmentManager.beginTransaction()
-                    .add(child, "tag")
-                    .commitNow();
-            assertEquals("argument strings don't match", "foo", child.getString());
-            return new TextView(container.getContext());
-        }
-    }
-
-    public static class ChildFragmentManagerChildFragment extends StrictFragment {
-        private String mString;
-
-        public ChildFragmentManagerChildFragment() {
-        }
-
-        public ChildFragmentManagerChildFragment(String arg) {
-            final Bundle b = new Bundle();
-            b.putString("string", arg);
-            setArguments(b);
-        }
-
-        @Override
-        public void onAttach(Context context) {
-            super.onAttach(context);
-            mString = getArguments().getString("string", "NO VALUE");
-        }
-
-        public String getString() {
-            return mString;
-        }
-    }
-
-    static class HostCallbacks extends FragmentHostCallback<FragmentActivity> {
-        private final FragmentActivity mActivity;
-
-        public HostCallbacks(FragmentActivity activity) {
-            super(activity);
-            mActivity = activity;
-        }
-
-        @Override
-        public void onDump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) {
-        }
-
-        @Override
-        public boolean onShouldSaveFragmentState(Fragment fragment) {
-            return !mActivity.isFinishing();
-        }
-
-        @Override
-        public LayoutInflater onGetLayoutInflater() {
-            return mActivity.getLayoutInflater().cloneInContext(mActivity);
-        }
-
-        @Override
-        public FragmentActivity onGetHost() {
-            return mActivity;
-        }
-
-        @Override
-        public void onSupportInvalidateOptionsMenu() {
-            mActivity.supportInvalidateOptionsMenu();
-        }
-
-        @Override
-        public void onStartActivityFromFragment(Fragment fragment, Intent intent, int requestCode) {
-            mActivity.startActivityFromFragment(fragment, intent, requestCode);
-        }
-
-        @Override
-        public void onStartActivityFromFragment(
-                Fragment fragment, Intent intent, int requestCode, @Nullable Bundle options) {
-            mActivity.startActivityFromFragment(fragment, intent, requestCode, options);
-        }
-
-        @Override
-        public void onRequestPermissionsFromFragment(@NonNull Fragment fragment,
-                @NonNull String[] permissions, int requestCode) {
-            throw new UnsupportedOperationException();
-        }
-
-        @Override
-        public boolean onShouldShowRequestPermissionRationale(@NonNull String permission) {
-            return ActivityCompat.shouldShowRequestPermissionRationale(
-                    mActivity, permission);
-        }
-
-        @Override
-        public boolean onHasWindowAnimations() {
-            return mActivity.getWindow() != null;
-        }
-
-        @Override
-        public int onGetWindowAnimations() {
-            final Window w = mActivity.getWindow();
-            return (w == null) ? 0 : w.getAttributes().windowAnimations;
-        }
-
-        @Override
-        public void onAttachFragment(Fragment fragment) {
-            mActivity.onAttachFragment(fragment);
-        }
-
-        @Nullable
-        @Override
-        public View onFindViewById(int id) {
-            return mActivity.findViewById(id);
-        }
-
-        @Override
-        public boolean onHasView() {
-            final Window w = mActivity.getWindow();
-            return (w != null && w.peekDecorView() != null);
-        }
-    }
-
-    public static class SimpleFragment extends Fragment {
-        private int mLayoutId;
-        private static final String LAYOUT_ID = "layoutId";
-
-        @Override
-        public void onCreate(Bundle savedInstanceState) {
-            super.onCreate(savedInstanceState);
-            if (savedInstanceState != null) {
-                mLayoutId = savedInstanceState.getInt(LAYOUT_ID, mLayoutId);
-            }
-        }
-
-        @Override
-        public void onSaveInstanceState(Bundle outState) {
-            super.onSaveInstanceState(outState);
-            outState.putInt(LAYOUT_ID, mLayoutId);
-        }
-
-        @Override
-        public View onCreateView(LayoutInflater inflater, ViewGroup container,
-                Bundle savedInstanceState) {
-            return inflater.inflate(mLayoutId, container, false);
-        }
-
-        public static SimpleFragment create(int layoutId) {
-            SimpleFragment fragment = new SimpleFragment();
-            fragment.mLayoutId = layoutId;
-            return fragment;
-        }
-    }
-}
diff --git a/v4/tests/java/android/support/v4/app/FragmentReceiveResultTest.java b/v4/tests/java/android/support/v4/app/FragmentReceiveResultTest.java
deleted file mode 100644
index 2799b16..0000000
--- a/v4/tests/java/android/support/v4/app/FragmentReceiveResultTest.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/*
- * Copyright (C) 2016 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 android.support.v4.app;
-
-import android.app.Activity;
-import android.app.Instrumentation;
-import android.app.PendingIntent;
-import android.content.Intent;
-import android.content.IntentSender;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.runner.AndroidJUnit4;
-import android.support.v4.BaseInstrumentationTestCase;
-import android.support.v4.app.test.FragmentResultActivity;
-import android.support.v4.app.test.FragmentTestActivity;
-import android.support.v4.test.R;
-import android.test.suitebuilder.annotation.SmallTest;
-
-import static junit.framework.TestCase.assertEquals;
-import static junit.framework.TestCase.assertTrue;
-import static junit.framework.TestCase.fail;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-/**
- * Tests for Fragment startActivityForResult and startIntentSenderForResult.
- */
-@RunWith(AndroidJUnit4.class)
-public class FragmentReceiveResultTest extends BaseInstrumentationTestCase<FragmentTestActivity> {
-    private FragmentTestActivity mActivity;
-    private TestFragment mFragment;
-
-    public FragmentReceiveResultTest() {
-        super(FragmentTestActivity.class);
-    }
-
-    @Before
-    public void setUp() {
-        mActivity = mActivityTestRule.getActivity();
-        mFragment = attachTestFragment();
-    }
-
-    @Test
-    @SmallTest
-    public void testStartActivityForResultOk() {
-        startActivityForResult(10, Activity.RESULT_OK, "content 10");
-
-        assertTrue("Fragment should receive result", mFragment.mHasResult);
-        assertEquals(10, mFragment.mRequestCode);
-        assertEquals(Activity.RESULT_OK, mFragment.mResultCode);
-        assertEquals("content 10", mFragment.mResultContent);
-    }
-
-    @Test
-    @SmallTest
-    public void testStartActivityForResultCanceled() {
-        startActivityForResult(20, Activity.RESULT_CANCELED, "content 20");
-
-        assertTrue("Fragment should receive result", mFragment.mHasResult);
-        assertEquals(20, mFragment.mRequestCode);
-        assertEquals(Activity.RESULT_CANCELED, mFragment.mResultCode);
-        assertEquals("content 20", mFragment.mResultContent);
-    }
-
-    @Test
-    @SmallTest
-    public void testStartIntentSenderForResultOk() {
-        startIntentSenderForResult(30, Activity.RESULT_OK, "content 30");
-
-        assertTrue("Fragment should receive result", mFragment.mHasResult);
-        assertEquals(30, mFragment.mRequestCode);
-        assertEquals(Activity.RESULT_OK, mFragment.mResultCode);
-        assertEquals("content 30", mFragment.mResultContent);
-    }
-
-    @Test
-    @SmallTest
-    public void testStartIntentSenderForResultCanceled() {
-        startIntentSenderForResult(40, Activity.RESULT_CANCELED, "content 40");
-
-        assertTrue("Fragment should receive result", mFragment.mHasResult);
-        assertEquals(40, mFragment.mRequestCode);
-        assertEquals(Activity.RESULT_CANCELED, mFragment.mResultCode);
-        assertEquals("content 40", mFragment.mResultContent);
-    }
-
-    private TestFragment attachTestFragment() {
-        final TestFragment fragment = new TestFragment();
-        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
-            @Override
-            public void run() {
-                mActivity.getSupportFragmentManager().beginTransaction()
-                        .add(R.id.content, fragment)
-                        .addToBackStack(null)
-                        .commitAllowingStateLoss();
-                mActivity.getFragmentManager().executePendingTransactions();
-            }
-        });
-        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
-        return fragment;
-    }
-
-    private void startActivityForResult(final int requestCode, final int resultCode,
-            final String content) {
-        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
-            @Override
-            public void run() {
-                Intent intent = new Intent(mActivity, FragmentResultActivity.class);
-                intent.putExtra(FragmentResultActivity.EXTRA_RESULT_CODE, resultCode);
-                intent.putExtra(FragmentResultActivity.EXTRA_RESULT_CONTENT, content);
-
-                mFragment.startActivityForResult(intent, requestCode);
-            }
-        });
-        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
-    }
-
-    private void startIntentSenderForResult(final int requestCode, final int resultCode,
-            final String content) {
-        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
-            @Override
-            public void run() {
-                Intent intent = new Intent(mActivity, FragmentResultActivity.class);
-                intent.putExtra(FragmentResultActivity.EXTRA_RESULT_CODE, resultCode);
-                intent.putExtra(FragmentResultActivity.EXTRA_RESULT_CONTENT, content);
-
-                PendingIntent pendingIntent = PendingIntent.getActivity(mActivity,
-                        requestCode, intent, 0);
-
-                try {
-                    mFragment.startIntentSenderForResult(pendingIntent.getIntentSender(),
-                            requestCode, null, 0, 0, 0, null);
-                } catch (IntentSender.SendIntentException e) {
-                    fail("IntentSender failed");
-                }
-            }
-        });
-        InstrumentationRegistry.getInstrumentation().waitForIdleSync();
-    }
-
-    private static class TestFragment extends Fragment {
-        boolean mHasResult = false;
-        int mRequestCode = -1;
-        int mResultCode = 100;
-        String mResultContent;
-
-        @Override
-        public void onActivityResult(int requestCode, int resultCode, Intent data) {
-            mHasResult = true;
-            mRequestCode = requestCode;
-            mResultCode = resultCode;
-            mResultContent = data.getStringExtra(FragmentResultActivity.EXTRA_RESULT_CONTENT);
-        }
-    }
-}
diff --git a/v4/tests/java/android/support/v4/app/FragmentReplaceTest.java b/v4/tests/java/android/support/v4/app/FragmentReplaceTest.java
deleted file mode 100644
index 6a71e5c..0000000
--- a/v4/tests/java/android/support/v4/app/FragmentReplaceTest.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Copyright (C) 2016 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 android.support.v4.app;
-
-import android.app.Fragment;
-import android.support.test.filters.SdkSuppress;
-import android.support.v4.app.test.FragmentTestActivity;
-import android.support.v4.app.test.FragmentTestActivity.TestFragment;
-import android.support.v4.test.R;
-import android.test.ActivityInstrumentationTestCase2;
-import android.test.UiThreadTest;
-import android.view.KeyEvent;
-
-/**
- * Test to prevent regressions in SupportFragmentManager fragment replace method. See b/24693644
- */
-public class FragmentReplaceTest extends
-        ActivityInstrumentationTestCase2<FragmentTestActivity> {
-    private FragmentTestActivity mActivity;
-
-
-    public FragmentReplaceTest() {
-        super(FragmentTestActivity.class);
-    }
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        mActivity = getActivity();
-    }
-
-    @UiThreadTest
-    public void testReplaceFragment() throws Throwable {
-        mActivity.getSupportFragmentManager().beginTransaction()
-                .add(R.id.content, TestFragment.create(R.layout.fragment_a))
-                .addToBackStack(null)
-                .commit();
-        mActivity.getSupportFragmentManager().executePendingTransactions();
-        assertNotNull(mActivity.findViewById(R.id.textA));
-        assertNull(mActivity.findViewById(R.id.textB));
-        assertNull(mActivity.findViewById(R.id.textC));
-
-
-        mActivity.getSupportFragmentManager().beginTransaction()
-                .add(R.id.content, TestFragment.create(R.layout.fragment_b))
-                .addToBackStack(null)
-                .commit();
-        mActivity.getSupportFragmentManager().executePendingTransactions();
-        assertNotNull(mActivity.findViewById(R.id.textA));
-        assertNotNull(mActivity.findViewById(R.id.textB));
-        assertNull(mActivity.findViewById(R.id.textC));
-
-        mActivity.getSupportFragmentManager().beginTransaction()
-                .replace(R.id.content, TestFragment.create(R.layout.fragment_c))
-                .addToBackStack(null)
-                .commit();
-        mActivity.getSupportFragmentManager().executePendingTransactions();
-        assertNull(mActivity.findViewById(R.id.textA));
-        assertNull(mActivity.findViewById(R.id.textB));
-        assertNotNull(mActivity.findViewById(R.id.textC));
-    }
-
-    @SdkSuppress(minSdkVersion = 11)
-    @UiThreadTest
-    public void testBackPressWithFrameworkFragment() throws Throwable {
-        mActivity.getFragmentManager().beginTransaction()
-                .add(R.id.content, new Fragment())
-                .addToBackStack(null)
-                .commit();
-        mActivity.getFragmentManager().executePendingTransactions();
-        assertEquals(1, mActivity.getFragmentManager().getBackStackEntryCount());
-
-        getInstrumentation().sendKeyDownUpSync(KeyEvent.KEYCODE_BACK);
-
-        assertEquals(0, mActivity.getFragmentManager().getBackStackEntryCount());
-    }
-}
diff --git a/v4/tests/java/android/support/v4/app/FragmentTest.java b/v4/tests/java/android/support/v4/app/FragmentTest.java
deleted file mode 100644
index 50ec5a7..0000000
--- a/v4/tests/java/android/support/v4/app/FragmentTest.java
+++ /dev/null
@@ -1,174 +0,0 @@
-/*
- * Copyright (C) 2016 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 android.support.v4.app;
-
-import android.os.Bundle;
-import android.support.v4.app.test.FragmentTestActivity;
-import android.support.v4.test.R;
-import android.test.ActivityInstrumentationTestCase2;
-import android.test.UiThreadTest;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.test.suitebuilder.annotation.SmallTest;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-
-import java.util.concurrent.atomic.AtomicInteger;
-
-/**
- * Miscellaneous tests for fragments that aren't big enough to belong to their own classes.
- */
-public class FragmentTest extends
-        ActivityInstrumentationTestCase2<FragmentTestActivity> {
-    private FragmentTestActivity mActivity;
-
-    public FragmentTest() {
-        super(FragmentTestActivity.class);
-    }
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        mActivity = getActivity();
-    }
-
-    @SmallTest
-    @UiThreadTest
-    public void testOnCreateOrder() throws Throwable {
-        OrderFragment fragment1 = new OrderFragment();
-        OrderFragment fragment2 = new OrderFragment();
-        mActivity.getSupportFragmentManager()
-                .beginTransaction()
-                .add(R.id.content, fragment1)
-                .add(R.id.content, fragment2)
-                .commitNow();
-        assertEquals(0, fragment1.createOrder);
-        assertEquals(1, fragment2.createOrder);
-    }
-
-    @SmallTest
-    public void testChildFragmentManagerGone() throws Throwable {
-        final FragmentA fragmentA = new FragmentA();
-        final FragmentB fragmentB = new FragmentB();
-        runTestOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                mActivity.getSupportFragmentManager().beginTransaction()
-                        .add(R.id.content, fragmentA)
-                        .commitNow();
-            }
-        });
-        getInstrumentation().waitForIdleSync();
-        runTestOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                mActivity.getSupportFragmentManager().beginTransaction()
-                        .setCustomAnimations(R.anim.long_fade_in, R.anim.long_fade_out,
-                                R.anim.long_fade_in, R.anim.long_fade_out)
-                        .replace(R.id.content, fragmentB)
-                        .addToBackStack(null)
-                        .commit();
-            }
-        });
-        // Wait for the middle of the animation
-        Thread.sleep(150);
-        runTestOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                mActivity.getSupportFragmentManager().beginTransaction()
-                        .setCustomAnimations(R.anim.long_fade_in, R.anim.long_fade_out,
-                                R.anim.long_fade_in, R.anim.long_fade_out)
-                        .replace(R.id.content, fragmentA)
-                        .addToBackStack(null)
-                        .commit();
-            }
-        });
-        // Wait for the middle of the animation
-        Thread.sleep(150);
-        getInstrumentation().waitForIdleSync();
-        runTestOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                mActivity.getSupportFragmentManager().popBackStack();
-            }
-        });
-        // Wait for the middle of the animation
-        Thread.sleep(150);
-        getInstrumentation().waitForIdleSync();
-        runTestOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                mActivity.getSupportFragmentManager().popBackStack();
-            }
-        });
-    }
-
-    @MediumTest
-    @UiThreadTest
-    public void testViewOrder() throws Throwable {
-        FragmentA fragmentA = new FragmentA();
-        FragmentB fragmentB = new FragmentB();
-        FragmentC fragmentC = new FragmentC();
-        mActivity.getSupportFragmentManager()
-                .beginTransaction()
-                .add(R.id.content, fragmentA)
-                .add(R.id.content, fragmentB)
-                .add(R.id.content, fragmentC)
-                .commitNow();
-        ViewGroup content = (ViewGroup) mActivity.findViewById(R.id.content);
-        assertEquals(3, content.getChildCount());
-        assertNotNull(content.getChildAt(0).findViewById(R.id.textA));
-        assertNotNull(content.getChildAt(1).findViewById(R.id.textB));
-        assertNotNull(content.getChildAt(2).findViewById(R.id.textC));
-    }
-
-    public static class OrderFragment extends Fragment {
-        private static AtomicInteger sOrder = new AtomicInteger();
-        public int createOrder = -1;
-
-        public OrderFragment() {}
-
-        @Override
-        public void onCreate(Bundle savedInstanceState) {
-            createOrder = sOrder.getAndIncrement();
-            super.onCreate(savedInstanceState);
-        }
-    }
-
-    public static class FragmentA extends Fragment {
-        @Override
-        public View onCreateView(LayoutInflater inflater, ViewGroup container,
-                Bundle savedInstanceState) {
-            return inflater.inflate(R.layout.fragment_a, container, false);
-        }
-    }
-
-    public static class FragmentB extends Fragment {
-        @Override
-        public View onCreateView(LayoutInflater inflater, ViewGroup container,
-                Bundle savedInstanceState) {
-            return inflater.inflate(R.layout.fragment_b, container, false);
-        }
-    }
-
-    public static class FragmentC extends Fragment {
-        @Override
-        public View onCreateView(LayoutInflater inflater, ViewGroup container,
-                Bundle savedInstanceState) {
-            return inflater.inflate(R.layout.fragment_c, container, false);
-        }
-    }
-}
diff --git a/v4/tests/java/android/support/v4/app/FragmentTransitionTest.java b/v4/tests/java/android/support/v4/app/FragmentTransitionTest.java
deleted file mode 100644
index f49d8e2..0000000
--- a/v4/tests/java/android/support/v4/app/FragmentTransitionTest.java
+++ /dev/null
@@ -1,380 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.v4.app;
-
-import android.os.Build.VERSION;
-import android.os.Build.VERSION_CODES;
-import android.support.v4.app.test.FragmentTestActivity;
-import android.support.v4.app.test.FragmentTestActivity.TestFragment;
-import android.support.v4.test.R;
-import android.support.v4.view.ViewCompat;
-import android.test.ActivityInstrumentationTestCase2;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.view.View;
-
-@MediumTest
-public class FragmentTransitionTest extends
-        ActivityInstrumentationTestCase2<FragmentTestActivity> {
-    private TestFragment mStartFragment;
-    private TestFragment mMidFragment;
-    private TestFragment mEndFragment;
-    private FragmentTestActivity mActivity;
-
-    public FragmentTransitionTest() {
-        super(FragmentTestActivity.class);
-    }
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        mStartFragment = null;
-        mMidFragment = null;
-        mEndFragment = null;
-        mActivity = getActivity();
-    }
-
-    public void testFragmentTransition() throws Throwable {
-        if (VERSION.SDK_INT < VERSION_CODES.LOLLIPOP) {
-            return;
-        }
-        launchStartFragment();
-        runTestOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                final View sharedElement = mActivity.findViewById(R.id.hello);
-                assertEquals("source", ViewCompat.getTransitionName(sharedElement));
-
-                mEndFragment = TestFragment.create(R.layout.fragment_end);
-                mActivity.getSupportFragmentManager().beginTransaction()
-                        .replace(R.id.content, mEndFragment)
-                        .addSharedElement(sharedElement, "destination")
-                        .addToBackStack(null)
-                        .commit();
-                mActivity.getSupportFragmentManager().executePendingTransactions();
-            }
-        });
-        waitForEnd(mEndFragment, TestFragment.ENTER);
-        assertTrue(mEndFragment.wasEndCalled(TestFragment.ENTER));
-        assertTrue(mStartFragment.wasEndCalled(TestFragment.EXIT));
-        assertTrue(mEndFragment.wasEndCalled(TestFragment.SHARED_ELEMENT_ENTER));
-        runTestOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                final View textView = mActivity.findViewById(R.id.hello);
-                assertEquals("destination", ViewCompat.getTransitionName(textView));
-                mActivity.getSupportFragmentManager().popBackStack();
-                mActivity.getSupportFragmentManager().executePendingTransactions();
-            }
-        });
-        waitForEnd(mStartFragment, TestFragment.REENTER);
-        assertTrue(mStartFragment.wasEndCalled(TestFragment.REENTER));
-        assertTrue(mEndFragment.wasEndCalled(TestFragment.RETURN));
-    }
-
-    public void testFirstOutLastInTransition() throws Throwable {
-        if (VERSION.SDK_INT < VERSION_CODES.LOLLIPOP) {
-            return;
-        }
-        launchStartFragment();
-        runTestOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                mMidFragment = TestFragment.create(R.layout.fragment_middle);
-                mEndFragment = TestFragment.create(R.layout.fragment_end);
-                mActivity.getSupportFragmentManager().beginTransaction()
-                        .replace(R.id.content, mMidFragment)
-                        .replace(R.id.content, mEndFragment)
-                        .addToBackStack(null)
-                        .commit();
-                mActivity.getSupportFragmentManager().executePendingTransactions();
-            }
-        });
-        waitForEnd(mEndFragment, TestFragment.ENTER);
-        assertTrue(mEndFragment.wasEndCalled(TestFragment.ENTER));
-        assertFalse(mEndFragment.wasEndCalled(TestFragment.EXIT));
-        assertFalse(mEndFragment.wasEndCalled(TestFragment.RETURN));
-        assertFalse(mEndFragment.wasEndCalled(TestFragment.REENTER));
-
-        assertTrue(mStartFragment.wasEndCalled(TestFragment.EXIT));
-        assertFalse(mStartFragment.wasEndCalled(TestFragment.ENTER));
-        assertFalse(mStartFragment.wasEndCalled(TestFragment.RETURN));
-        assertFalse(mStartFragment.wasEndCalled(TestFragment.REENTER));
-
-        assertFalse(mMidFragment.wasStartCalled(TestFragment.ENTER));
-        assertFalse(mMidFragment.wasStartCalled(TestFragment.EXIT));
-        assertFalse(mMidFragment.wasStartCalled(TestFragment.REENTER));
-        assertFalse(mMidFragment.wasStartCalled(TestFragment.RETURN));
-
-        mStartFragment.clearNotifications();
-        mEndFragment.clearNotifications();
-
-        runTestOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                mActivity.getSupportFragmentManager().popBackStack();
-                mActivity.getSupportFragmentManager().executePendingTransactions();
-            }
-        });
-        waitForEnd(mEndFragment, TestFragment.RETURN);
-        assertTrue(mEndFragment.wasEndCalled(TestFragment.RETURN));
-        assertFalse(mMidFragment.wasStartCalled(TestFragment.ENTER));
-        assertFalse(mMidFragment.wasStartCalled(TestFragment.EXIT));
-        assertFalse(mMidFragment.wasStartCalled(TestFragment.REENTER));
-        assertFalse(mMidFragment.wasStartCalled(TestFragment.RETURN));
-
-        assertTrue(mStartFragment.wasStartCalled(TestFragment.REENTER));
-        assertFalse(mStartFragment.wasStartCalled(TestFragment.ENTER));
-        assertFalse(mStartFragment.wasStartCalled(TestFragment.EXIT));
-        assertFalse(mStartFragment.wasStartCalled(TestFragment.RETURN));
-    }
-
-    public void testPopTwo() throws Throwable {
-        if (VERSION.SDK_INT < VERSION_CODES.LOLLIPOP) {
-            return;
-        }
-        launchStartFragment();
-        runTestOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                mMidFragment = TestFragment.create(R.layout.fragment_middle);
-                mActivity.getSupportFragmentManager().beginTransaction()
-                        .replace(R.id.content, mMidFragment)
-                        .addToBackStack(null)
-                        .commit();
-                mActivity.getSupportFragmentManager().executePendingTransactions();
-            }
-        });
-        waitForEnd(mMidFragment, TestFragment.ENTER);
-        runTestOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                mEndFragment = TestFragment.create(R.layout.fragment_end);
-                mActivity.getSupportFragmentManager().beginTransaction()
-                        .replace(R.id.content, mEndFragment)
-                        .addToBackStack(null)
-                        .commit();
-                mActivity.getSupportFragmentManager().executePendingTransactions();
-            }
-        });
-        waitForEnd(mEndFragment, TestFragment.ENTER);
-        assertTrue(mEndFragment.wasEndCalled(TestFragment.ENTER));
-        assertFalse(mEndFragment.wasEndCalled(TestFragment.EXIT));
-        assertFalse(mEndFragment.wasEndCalled(TestFragment.RETURN));
-        assertFalse(mEndFragment.wasEndCalled(TestFragment.REENTER));
-
-        assertTrue(mStartFragment.wasEndCalled(TestFragment.EXIT));
-        assertFalse(mStartFragment.wasEndCalled(TestFragment.ENTER));
-        assertFalse(mStartFragment.wasEndCalled(TestFragment.RETURN));
-        assertFalse(mStartFragment.wasEndCalled(TestFragment.REENTER));
-
-        assertTrue(mMidFragment.wasStartCalled(TestFragment.ENTER));
-        assertTrue(mMidFragment.wasStartCalled(TestFragment.EXIT));
-        assertFalse(mMidFragment.wasStartCalled(TestFragment.REENTER));
-        assertFalse(mMidFragment.wasStartCalled(TestFragment.RETURN));
-
-        mStartFragment.clearNotifications();
-        mMidFragment.clearNotifications();
-        mEndFragment.clearNotifications();
-
-        runTestOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                FragmentManager fm = mActivity.getSupportFragmentManager();
-                int id = fm.getBackStackEntryAt(0).getId();
-                fm.popBackStack(id, FragmentManager.POP_BACK_STACK_INCLUSIVE);
-                fm.executePendingTransactions();
-            }
-        });
-        waitForEnd(mEndFragment, TestFragment.RETURN);
-        assertTrue(mEndFragment.wasEndCalled(TestFragment.RETURN));
-
-        assertFalse(mMidFragment.wasStartCalled(TestFragment.ENTER));
-        assertFalse(mMidFragment.wasStartCalled(TestFragment.EXIT));
-        assertFalse(mMidFragment.wasStartCalled(TestFragment.REENTER));
-        assertFalse(mMidFragment.wasStartCalled(TestFragment.RETURN));
-
-        assertTrue(mStartFragment.wasStartCalled(TestFragment.REENTER));
-        assertFalse(mStartFragment.wasStartCalled(TestFragment.ENTER));
-        assertFalse(mStartFragment.wasStartCalled(TestFragment.EXIT));
-        assertFalse(mStartFragment.wasStartCalled(TestFragment.RETURN));
-    }
-
-    public void testNullTransition() throws Throwable {
-        if (VERSION.SDK_INT < VERSION_CODES.LOLLIPOP) {
-            return;
-        }
-        getInstrumentation().waitForIdleSync();
-        runTestOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                mStartFragment = TestFragment.create(R.layout.fragment_start);
-                mStartFragment.clearTransitions();
-                mActivity.getSupportFragmentManager().beginTransaction()
-                        .replace(R.id.content, mStartFragment)
-                        .commit();
-                mActivity.getSupportFragmentManager().executePendingTransactions();
-            }
-        });
-        waitForStart(mStartFragment, TestFragment.ENTER);
-        // No transitions
-        assertFalse(mStartFragment.wasStartCalled(TestFragment.ENTER));
-
-        runTestOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                mMidFragment = TestFragment.create(R.layout.fragment_middle);
-                mEndFragment = TestFragment.create(R.layout.fragment_end);
-                mEndFragment.clearTransitions();
-                mActivity.getSupportFragmentManager().beginTransaction()
-                        .replace(R.id.content, mMidFragment)
-                        .replace(R.id.content, mEndFragment)
-                        .addToBackStack(null)
-                        .commit();
-                mActivity.getSupportFragmentManager().executePendingTransactions();
-            }
-        });
-        waitForStart(mEndFragment, TestFragment.ENTER);
-        assertFalse(mEndFragment.wasEndCalled(TestFragment.ENTER));
-        assertFalse(mEndFragment.wasEndCalled(TestFragment.EXIT));
-        assertFalse(mEndFragment.wasEndCalled(TestFragment.RETURN));
-        assertFalse(mEndFragment.wasEndCalled(TestFragment.REENTER));
-
-        assertFalse(mStartFragment.wasEndCalled(TestFragment.EXIT));
-        assertFalse(mStartFragment.wasEndCalled(TestFragment.ENTER));
-        assertFalse(mStartFragment.wasEndCalled(TestFragment.RETURN));
-        assertFalse(mStartFragment.wasEndCalled(TestFragment.REENTER));
-
-        assertFalse(mMidFragment.wasStartCalled(TestFragment.ENTER));
-        assertFalse(mMidFragment.wasStartCalled(TestFragment.EXIT));
-        assertFalse(mMidFragment.wasStartCalled(TestFragment.REENTER));
-        assertFalse(mMidFragment.wasStartCalled(TestFragment.RETURN));
-
-        runTestOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                mActivity.getSupportFragmentManager().popBackStack();
-                mActivity.getSupportFragmentManager().executePendingTransactions();
-            }
-        });
-        waitForStart(mEndFragment, TestFragment.RETURN);
-        assertFalse(mEndFragment.wasEndCalled(TestFragment.RETURN));
-        assertFalse(mMidFragment.wasStartCalled(TestFragment.ENTER));
-        assertFalse(mMidFragment.wasStartCalled(TestFragment.EXIT));
-        assertFalse(mMidFragment.wasStartCalled(TestFragment.REENTER));
-        assertFalse(mMidFragment.wasStartCalled(TestFragment.RETURN));
-
-        assertFalse(mStartFragment.wasStartCalled(TestFragment.REENTER));
-        assertFalse(mStartFragment.wasStartCalled(TestFragment.ENTER));
-        assertFalse(mStartFragment.wasStartCalled(TestFragment.EXIT));
-        assertFalse(mStartFragment.wasStartCalled(TestFragment.RETURN));
-    }
-
-    public void testRemoveAdded() throws Throwable {
-        if (VERSION.SDK_INT < VERSION_CODES.LOLLIPOP) {
-            return;
-        }
-        launchStartFragment();
-        runTestOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                mEndFragment = TestFragment.create(R.layout.fragment_end);
-                mActivity.getSupportFragmentManager().beginTransaction()
-                        .replace(R.id.content, mEndFragment)
-                        .replace(R.id.content, mStartFragment)
-                        .replace(R.id.content, mEndFragment)
-                        .addToBackStack(null)
-                        .commit();
-                mActivity.getSupportFragmentManager().executePendingTransactions();
-            }
-        });
-        assertTrue(waitForEnd(mEndFragment, TestFragment.ENTER));
-        runTestOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                mActivity.getSupportFragmentManager().popBackStack();
-                mActivity.getSupportFragmentManager().executePendingTransactions();
-            }
-        });
-        assertTrue(waitForEnd(mStartFragment, TestFragment.REENTER));
-    }
-
-    public void testAddRemoved() throws Throwable {
-        if (VERSION.SDK_INT < VERSION_CODES.LOLLIPOP) {
-            return;
-        }
-        launchStartFragment();
-        runTestOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                mEndFragment = TestFragment.create(R.layout.fragment_end);
-                mActivity.getSupportFragmentManager().beginTransaction()
-                        .replace(R.id.content, mEndFragment)
-                        .replace(R.id.content, mStartFragment)
-                        .addToBackStack(null)
-                        .commit();
-                mActivity.getSupportFragmentManager().executePendingTransactions();
-            }
-        });
-        waitForStart(mStartFragment, TestFragment.ENTER);
-        assertFalse(mStartFragment.wasStartCalled(TestFragment.ENTER));
-        assertFalse(mStartFragment.wasStartCalled(TestFragment.EXIT));
-        assertFalse(mEndFragment.wasStartCalled(TestFragment.ENTER));
-        assertFalse(mEndFragment.wasStartCalled(TestFragment.EXIT));
-        runTestOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                mActivity.getSupportFragmentManager().popBackStack();
-                mActivity.getSupportFragmentManager().executePendingTransactions();
-            }
-        });
-        waitForStart(mStartFragment, TestFragment.REENTER);
-        assertFalse(mStartFragment.wasStartCalled(TestFragment.REENTER));
-        assertFalse(mStartFragment.wasStartCalled(TestFragment.RETURN));
-        assertFalse(mEndFragment.wasStartCalled(TestFragment.REENTER));
-        assertFalse(mEndFragment.wasStartCalled(TestFragment.RETURN));
-    }
-
-    private void launchStartFragment() throws Throwable {
-        getInstrumentation().waitForIdleSync();
-        runTestOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                mStartFragment = TestFragment.create(R.layout.fragment_start);
-                mActivity.getSupportFragmentManager().beginTransaction()
-                        .replace(R.id.content, mStartFragment)
-                        .commit();
-                mActivity.getSupportFragmentManager().executePendingTransactions();
-            }
-        });
-        assertTrue(waitForEnd(mStartFragment, TestFragment.ENTER));
-        mStartFragment.clearNotifications();
-    }
-
-    private boolean waitForStart(TestFragment fragment, int key) throws InterruptedException {
-        boolean started = fragment.waitForStart(key);
-        getInstrumentation().waitForIdleSync();
-        return started;
-    }
-
-    private boolean waitForEnd(TestFragment fragment, int key) throws InterruptedException {
-        if (!waitForStart(fragment, key)) {
-            return false;
-        }
-        final boolean ended = fragment.waitForEnd(key);
-        getInstrumentation().waitForIdleSync();
-        return ended;
-    }
-}
diff --git a/v4/tests/java/android/support/v4/app/StrictViewFragment.java b/v4/tests/java/android/support/v4/app/StrictViewFragment.java
deleted file mode 100644
index 01251d2..0000000
--- a/v4/tests/java/android/support/v4/app/StrictViewFragment.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright (C) 2016 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 android.support.v4.app;
-
-import android.support.v4.test.R;
-import android.os.Bundle;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-
-public class StrictViewFragment extends StrictFragment {
-    boolean mOnCreateViewCalled, mOnViewCreatedCalled, mOnDestroyViewCalled;
-
-    @Override
-    public View onCreateView(LayoutInflater inflater, ViewGroup container,
-            Bundle savedInstanceState) {
-        checkGetActivity();
-        checkState("onCreateView", CREATED);
-        final View result = inflater.inflate(R.layout.strict_view_fragment, container, false);
-        mOnCreateViewCalled = true;
-        return result;
-    }
-
-    @Override
-    public void onViewCreated(View view, Bundle savedInstanceState) {
-        if (view == null) {
-            throw new IllegalArgumentException("onViewCreated view argument should not be null");
-        }
-        checkGetActivity();
-        checkState("onViewCreated", CREATED);
-        mOnViewCreatedCalled = true;
-    }
-
-    @Override
-    public void onDestroyView() {
-        super.onDestroyView();
-        if (getView() == null) {
-            throw new IllegalStateException("getView returned null in onDestroyView");
-        }
-        checkGetActivity();
-        checkState("onDestroyView", CREATED);
-        mOnDestroyViewCalled = true;
-    }
-}
diff --git a/v4/tests/java/android/support/v4/app/test/FragmentTestActivity.java b/v4/tests/java/android/support/v4/app/test/FragmentTestActivity.java
deleted file mode 100644
index 06cf753..0000000
--- a/v4/tests/java/android/support/v4/app/test/FragmentTestActivity.java
+++ /dev/null
@@ -1,261 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.v4.app.test;
-
-import android.app.Activity;
-import android.content.Context;
-import android.content.Intent;
-import android.os.Build.VERSION;
-import android.os.Build.VERSION_CODES;
-import android.os.Bundle;
-import android.support.v4.app.Fragment;
-import android.support.v4.app.FragmentActivity;
-import android.support.v4.test.R;
-import android.transition.Transition;
-import android.transition.Transition.TransitionListener;
-import android.transition.TransitionInflater;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-
-/**
- * A simple activity used for Fragment Transitions and lifecycle event ordering
- */
-public class FragmentTestActivity extends FragmentActivity {
-    @Override
-    public void onCreate(Bundle icicle) {
-        super.onCreate(icicle);
-        setContentView(R.layout.activity_content);
-    }
-
-    public static class TestFragment extends Fragment {
-        public static final int ENTER = 0;
-        public static final int RETURN = 1;
-        public static final int EXIT = 2;
-        public static final int REENTER = 3;
-        public static final int SHARED_ELEMENT_ENTER = 4;
-        public static final int SHARED_ELEMENT_RETURN = 5;
-        private static final int TRANSITION_COUNT = 6;
-
-        private static final String LAYOUT_ID = "layoutId";
-        private static final String TRANSITION_KEY = "transition_";
-        private int mLayoutId = R.layout.fragment_start;
-        private final int[] mTransitionIds = new int[] {
-                R.transition.fade,
-                R.transition.fade,
-                R.transition.fade,
-                R.transition.fade,
-                R.transition.change_bounds,
-                R.transition.change_bounds,
-        };
-        private final Object[] mListeners = new Object[TRANSITION_COUNT];
-
-        public TestFragment() {
-            if (VERSION.SDK_INT >= VERSION_CODES.KITKAT) {
-                for (int i = 0; i < TRANSITION_COUNT; i++) {
-                    mListeners[i] = new TransitionCalledListener();
-                }
-            }
-        }
-
-        public static TestFragment create(int layoutId) {
-            TestFragment testFragment = new TestFragment();
-            testFragment.mLayoutId = layoutId;
-            return testFragment;
-        }
-
-        public void clearTransitions() {
-            for (int i = 0; i < TRANSITION_COUNT; i++) {
-                mTransitionIds[i] = 0;
-            }
-        }
-
-        public void clearNotifications() {
-            for (int i = 0; i < TRANSITION_COUNT; i++) {
-                ((TransitionCalledListener)mListeners[i]).startLatch = new CountDownLatch(1);
-                ((TransitionCalledListener)mListeners[i]).endLatch = new CountDownLatch(1);
-            }
-        }
-
-        @Override
-        public void onCreate(Bundle savedInstanceState) {
-            super.onCreate(savedInstanceState);
-            if (savedInstanceState != null) {
-                mLayoutId = savedInstanceState.getInt(LAYOUT_ID, mLayoutId);
-                for (int i = 0; i < TRANSITION_COUNT; i++) {
-                    String key = TRANSITION_KEY + i;
-                    mTransitionIds[i] = savedInstanceState.getInt(key, mTransitionIds[i]);
-                }
-            }
-        }
-
-        @Override
-        public void onSaveInstanceState(Bundle outState) {
-            super.onSaveInstanceState(outState);
-            outState.putInt(LAYOUT_ID, mLayoutId);
-            for (int i = 0; i < TRANSITION_COUNT; i++) {
-                String key = TRANSITION_KEY + i;
-                outState.putInt(key, mTransitionIds[i]);
-            }
-        }
-
-        @Override
-        public View onCreateView(LayoutInflater inflater, ViewGroup container,
-                Bundle savedInstanceState) {
-            return inflater.inflate(mLayoutId, container, false);
-        }
-
-        @SuppressWarnings("deprecation")
-        @Override
-        public void onAttach(Activity activity) {
-            super.onAttach(activity);
-            if (VERSION.SDK_INT > VERSION_CODES.KITKAT) {
-                setEnterTransition(loadTransition(ENTER));
-                setReenterTransition(loadTransition(REENTER));
-                setExitTransition(loadTransition(EXIT));
-                setReturnTransition(loadTransition(RETURN));
-                setSharedElementEnterTransition(loadTransition(SHARED_ELEMENT_ENTER));
-                setSharedElementReturnTransition(loadTransition(SHARED_ELEMENT_RETURN));
-            }
-        }
-
-        public boolean wasStartCalled(int transitionKey) {
-            return ((TransitionCalledListener)mListeners[transitionKey]).startLatch.getCount() == 0;
-        }
-
-        public boolean wasEndCalled(int transitionKey) {
-            return ((TransitionCalledListener)mListeners[transitionKey]).endLatch.getCount() == 0;
-        }
-
-        public boolean waitForStart(int transitionKey)
-                throws InterruptedException {
-            TransitionCalledListener l = ((TransitionCalledListener)mListeners[transitionKey]);
-            return l.startLatch.await(500,TimeUnit.MILLISECONDS);
-        }
-
-        public boolean waitForEnd(int transitionKey)
-                throws InterruptedException {
-            TransitionCalledListener l = ((TransitionCalledListener)mListeners[transitionKey]);
-            return l.endLatch.await(500,TimeUnit.MILLISECONDS);
-        }
-
-        private Transition loadTransition(int key) {
-            final int id = mTransitionIds[key];
-            if (id == 0) {
-                return null;
-            }
-            Transition transition = TransitionInflater.from(getActivity()).inflateTransition(id);
-            transition.addListener(((TransitionCalledListener)mListeners[key]));
-            return transition;
-        }
-
-        private class TransitionCalledListener implements TransitionListener {
-            public CountDownLatch startLatch = new CountDownLatch(1);
-            public CountDownLatch endLatch = new CountDownLatch(1);
-
-            public TransitionCalledListener() {
-            }
-
-            @Override
-            public void onTransitionStart(Transition transition) {
-                startLatch.countDown();
-            }
-
-            @Override
-            public void onTransitionEnd(Transition transition) {
-                endLatch.countDown();
-            }
-
-            @Override
-            public void onTransitionCancel(Transition transition) {
-            }
-
-            @Override
-            public void onTransitionPause(Transition transition) {
-            }
-
-            @Override
-            public void onTransitionResume(Transition transition) {
-            }
-        }
-    }
-
-    public static class ParentFragment extends Fragment {
-        static final String CHILD_FRAGMENT_TAG = "childFragment";
-        public boolean wasAttachedInTime;
-
-        private boolean mRetainChild;
-
-        @Override
-        public void onCreate(Bundle savedInstanceState) {
-            super.onCreate(savedInstanceState);
-
-            ChildFragment f = getChildFragment();
-            if (f == null) {
-                f = new ChildFragment();
-                if (mRetainChild) {
-                    f.setRetainInstance(true);
-                }
-                getChildFragmentManager().beginTransaction().add(f, CHILD_FRAGMENT_TAG).commitNow();
-            }
-            wasAttachedInTime = f.attached;
-        }
-
-        public ChildFragment getChildFragment() {
-            return (ChildFragment) getChildFragmentManager().findFragmentByTag(CHILD_FRAGMENT_TAG);
-        }
-
-        public void setRetainChildInstance(boolean retainChild) {
-            mRetainChild = retainChild;
-        }
-    }
-
-    public static class ChildFragment extends Fragment {
-        private OnAttachListener mOnAttachListener;
-
-        public boolean attached;
-        public boolean onActivityResultCalled;
-        public int onActivityResultRequestCode;
-        public int onActivityResultResultCode;
-
-        @Override
-        public void onAttach(Context activity) {
-            super.onAttach(activity);
-            attached = true;
-            if (mOnAttachListener != null) {
-                mOnAttachListener.onAttach(activity, this);
-            }
-        }
-
-        public void setOnAttachListener(OnAttachListener listener) {
-            mOnAttachListener = listener;
-        }
-
-        public interface OnAttachListener {
-            void onAttach(Context activity, ChildFragment fragment);
-        }
-
-        @Override
-        public void onActivityResult(int requestCode, int resultCode, Intent data) {
-            onActivityResultCalled = true;
-            onActivityResultRequestCode = requestCode;
-            onActivityResultResultCode = resultCode;
-        }
-    }
-}
diff --git a/v4/tests/java/android/support/v4/content/ContextCompatTest.java b/v4/tests/java/android/support/v4/content/ContextCompatTest.java
deleted file mode 100644
index 56e89a5..0000000
--- a/v4/tests/java/android/support/v4/content/ContextCompatTest.java
+++ /dev/null
@@ -1,181 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.v4.content;
-
-import org.junit.Before;
-import org.junit.Test;
-
-import android.content.Context;
-import android.content.pm.PackageManager;
-import android.content.res.ColorStateList;
-import android.graphics.drawable.Drawable;
-import android.os.Build;
-import android.support.v4.BaseInstrumentationTestCase;
-import android.support.v4.ThemedYellowActivity;
-import android.support.v4.test.R;
-import android.support.v4.testutils.TestUtils;
-import android.test.suitebuilder.annotation.SmallTest;
-import android.util.DisplayMetrics;
-
-import static org.junit.Assert.assertEquals;
-
-@SmallTest
-public class ContextCompatTest extends BaseInstrumentationTestCase<ThemedYellowActivity> {
-    private Context mContext;
-
-    public ContextCompatTest() {
-        super(ThemedYellowActivity.class);
-    }
-
-    @Before
-    public void setup() {
-        mContext = mActivityTestRule.getActivity();
-    }
-
-    @Test
-    public void testGetColor() throws Throwable {
-        assertEquals("Unthemed color load", 0xFFFF8090,
-                ContextCompat.getColor(mContext, R.color.text_color));
-
-        if (Build.VERSION.SDK_INT >= 23) {
-            // The following test is only expected to pass on v23+ devices. The result of
-            // calling theme-aware getColor() in pre-v23 is undefined.
-            assertEquals("Themed yellow color load",
-                    ContextCompat.getColor(mContext, R.color.simple_themed_selector),
-                    0xFFF0B000);
-        }
-    }
-
-    @Test
-    public void testGetColorStateList() throws Throwable {
-        ColorStateList unthemedColorStateList =
-                ContextCompat.getColorStateList(mContext, R.color.complex_unthemed_selector);
-        assertEquals("Unthemed color state list load: default", 0xFF70A0C0,
-                unthemedColorStateList.getDefaultColor());
-        assertEquals("Unthemed color state list load: focused", 0xFF70B0F0,
-                unthemedColorStateList.getColorForState(
-                        new int[]{android.R.attr.state_focused}, 0));
-        assertEquals("Unthemed color state list load: pressed", 0xFF6080B0,
-                unthemedColorStateList.getColorForState(
-                        new int[]{android.R.attr.state_pressed}, 0));
-
-        if (Build.VERSION.SDK_INT >= 23) {
-            // The following tests are only expected to pass on v23+ devices. The result of
-            // calling theme-aware getColorStateList() in pre-v23 is undefined.
-            ColorStateList themedYellowColorStateList =
-                    ContextCompat.getColorStateList(mContext, R.color.complex_themed_selector);
-            assertEquals("Themed yellow color state list load: default", 0xFFF0B000,
-                    themedYellowColorStateList.getDefaultColor());
-            assertEquals("Themed yellow color state list load: focused", 0xFFF0A020,
-                    themedYellowColorStateList.getColorForState(
-                            new int[]{android.R.attr.state_focused}, 0));
-            assertEquals("Themed yellow color state list load: pressed", 0xFFE0A040,
-                    themedYellowColorStateList.getColorForState(
-                            new int[]{android.R.attr.state_pressed}, 0));
-        }
-    }
-
-    @Test
-    public void testGetDrawable() throws Throwable {
-        Drawable unthemedDrawable =
-                ContextCompat.getDrawable(mContext, R.drawable.test_drawable_red);
-        TestUtils.assertAllPixelsOfColor("Unthemed drawable load",
-                unthemedDrawable, mContext.getResources().getColor(R.color.test_red));
-
-        if (Build.VERSION.SDK_INT >= 23) {
-            // The following test is only expected to pass on v23+ devices. The result of
-            // calling theme-aware getDrawable() in pre-v23 is undefined.
-            Drawable themedYellowDrawable =
-                    ContextCompat.getDrawable(mContext, R.drawable.themed_drawable);
-            TestUtils.assertAllPixelsOfColor("Themed yellow drawable load",
-                    themedYellowDrawable, 0xFFF0B000);
-        }
-    }
-
-    @Test
-    public void testDrawableConfigurationWorkaround() throws Throwable {
-        final int expectedWidth = scaleFromDensity(7, DisplayMetrics.DENSITY_LOW,
-                mContext.getResources().getDisplayMetrics().densityDpi);
-
-        // Ensure we retrieve the correct drawable configuration. Specifically,
-        // this tests a workaround for a bug in drawable configuration that
-        // exists on API < 16 for references to drawables.
-        Drawable referencedDrawable = ContextCompat.getDrawable(mContext,
-                R.drawable.aliased_drawable);
-        assertEquals("Drawable configuration does not match DisplayMetrics",
-                expectedWidth, referencedDrawable.getIntrinsicWidth());
-    }
-
-    private static int scaleFromDensity(int size, int sdensity, int tdensity) {
-        if (sdensity == tdensity) {
-            return size;
-        }
-
-        // Scale by tdensity / sdensity, rounding up.
-        return ((size * tdensity) + (sdensity >> 1)) / sdensity;
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testCheckSelfPermissionNull() {
-        ContextCompat.checkSelfPermission(mContext, null);
-    }
-
-    @Test
-    public void testCheckSelfPermission() {
-        assertEquals("Vibrate permission granted", PackageManager.PERMISSION_GRANTED,
-                ContextCompat.checkSelfPermission(mContext,
-                        android.Manifest.permission.VIBRATE));
-        assertEquals("Wake lock permission granted", PackageManager.PERMISSION_GRANTED,
-                ContextCompat.checkSelfPermission(mContext,
-                        android.Manifest.permission.WAKE_LOCK));
-
-        if (Build.VERSION.SDK_INT >= 23) {
-            // As documented in http://developer.android.com/training/permissions/requesting.html
-            // starting in Android M (v23) dangerous permissions are not granted automactically
-            // to apps targeting SDK 23 even if those are defined in the manifest.
-            // This is why the following permissions are expected to be denied.
-            assertEquals("Read contacts permission granted", PackageManager.PERMISSION_DENIED,
-                    ContextCompat.checkSelfPermission(mContext,
-                            android.Manifest.permission.READ_CONTACTS));
-            assertEquals("Write contacts permission granted", PackageManager.PERMISSION_DENIED,
-                    ContextCompat.checkSelfPermission(mContext,
-                            android.Manifest.permission.WRITE_CONTACTS));
-        } else {
-            // And on older devices declared dangerous permissions are expected to be granted.
-            assertEquals("Read contacts permission denied", PackageManager.PERMISSION_GRANTED,
-                    ContextCompat.checkSelfPermission(mContext,
-                            android.Manifest.permission.READ_CONTACTS));
-            assertEquals("Write contacts permission denied", PackageManager.PERMISSION_GRANTED,
-                    ContextCompat.checkSelfPermission(mContext,
-                            android.Manifest.permission.WRITE_CONTACTS));
-        }
-
-        // The following permissions (normal and dangerous) are expected to be denied as they are
-        // not declared in our manifest.
-        assertEquals("Access network state permission denied", PackageManager.PERMISSION_DENIED,
-                ContextCompat.checkSelfPermission(mContext,
-                        android.Manifest.permission.ACCESS_NETWORK_STATE));
-        assertEquals("Bluetooth permission denied", PackageManager.PERMISSION_DENIED,
-                ContextCompat.checkSelfPermission(mContext,
-                        android.Manifest.permission.BLUETOOTH));
-        assertEquals("Call phone permission denied", PackageManager.PERMISSION_DENIED,
-                ContextCompat.checkSelfPermission(mContext,
-                        android.Manifest.permission.CALL_PHONE));
-        assertEquals("Delete packages permission denied", PackageManager.PERMISSION_DENIED,
-                ContextCompat.checkSelfPermission(mContext,
-                        android.Manifest.permission.DELETE_PACKAGES));
-    }
-}
\ No newline at end of file
diff --git a/v4/tests/java/android/support/v4/content/res/ResourcesCompatTest.java b/v4/tests/java/android/support/v4/content/res/ResourcesCompatTest.java
deleted file mode 100644
index 19d5609..0000000
--- a/v4/tests/java/android/support/v4/content/res/ResourcesCompatTest.java
+++ /dev/null
@@ -1,280 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.v4.content.res;
-
-import android.content.res.ColorStateList;
-import android.content.res.Resources;
-import android.graphics.drawable.Drawable;
-import android.os.Build;
-import android.support.test.InstrumentationRegistry;
-import android.support.v4.test.R;
-import android.support.v4.testutils.TestUtils;
-import android.test.suitebuilder.annotation.SmallTest;
-import android.util.DisplayMetrics;
-import org.junit.Before;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-
-@SmallTest
-public class ResourcesCompatTest {
-    private Resources mResources;
-
-    @Before
-    public void setup() {
-        mResources = InstrumentationRegistry.getContext().getResources();
-    }
-
-    @Test
-    public void testGetColor() throws Throwable {
-        assertEquals("Unthemed color load",
-                ResourcesCompat.getColor(mResources, R.color.text_color, null),
-                0xFFFF8090);
-
-        if (Build.VERSION.SDK_INT >= 23) {
-            // The following tests are only expected to pass on v23+ devices. The result of
-            // calling theme-aware getColor() in pre-v23 is undefined.
-            final Resources.Theme yellowTheme = mResources.newTheme();
-            yellowTheme.applyStyle(R.style.YellowTheme, true);
-            assertEquals("Themed yellow color load", 0xFFF0B000,
-                    ResourcesCompat.getColor(mResources, R.color.simple_themed_selector,
-                            yellowTheme));
-
-            final Resources.Theme lilacTheme = mResources.newTheme();
-            lilacTheme.applyStyle(R.style.LilacTheme, true);
-            assertEquals("Themed lilac color load", 0xFFF080F0,
-                    ResourcesCompat.getColor(mResources, R.color.simple_themed_selector,
-                            lilacTheme));
-        }
-    }
-
-    @Test
-    public void testGetColorStateList() throws Throwable {
-        final ColorStateList unthemedColorStateList =
-                ResourcesCompat.getColorStateList(mResources, R.color.complex_unthemed_selector,
-                        null);
-        assertEquals("Unthemed color state list load: default", 0xFF70A0C0,
-                unthemedColorStateList.getDefaultColor());
-        assertEquals("Unthemed color state list load: focused", 0xFF70B0F0,
-                unthemedColorStateList.getColorForState(
-                        new int[]{android.R.attr.state_focused}, 0));
-        assertEquals("Unthemed color state list load: pressed", 0xFF6080B0,
-                unthemedColorStateList.getColorForState(
-                        new int[]{android.R.attr.state_pressed}, 0));
-
-        if (Build.VERSION.SDK_INT >= 23) {
-            // The following tests are only expected to pass on v23+ devices. The result of
-            // calling theme-aware getColorStateList() in pre-v23 is undefined.
-            final Resources.Theme yellowTheme = mResources.newTheme();
-            yellowTheme.applyStyle(R.style.YellowTheme, true);
-            final ColorStateList themedYellowColorStateList =
-                    ResourcesCompat.getColorStateList(mResources, R.color.complex_themed_selector,
-                            yellowTheme);
-            assertEquals("Themed yellow color state list load: default", 0xFFF0B000,
-                    themedYellowColorStateList.getDefaultColor());
-            assertEquals("Themed yellow color state list load: focused", 0xFFF0A020,
-                    themedYellowColorStateList.getColorForState(
-                            new int[]{android.R.attr.state_focused}, 0));
-            assertEquals("Themed yellow color state list load: pressed", 0xFFE0A040,
-                    themedYellowColorStateList.getColorForState(
-                            new int[]{android.R.attr.state_pressed}, 0));
-
-            final Resources.Theme lilacTheme = mResources.newTheme();
-            lilacTheme.applyStyle(R.style.LilacTheme, true);
-            final ColorStateList themedLilacColorStateList =
-                    ResourcesCompat.getColorStateList(mResources, R.color.complex_themed_selector,
-                            lilacTheme);
-            assertEquals("Themed lilac color state list load: default", 0xFFF080F0,
-                    themedLilacColorStateList.getDefaultColor());
-            assertEquals("Themed lilac color state list load: focused", 0xFFF070D0,
-                    themedLilacColorStateList.getColorForState(
-                            new int[]{android.R.attr.state_focused}, 0));
-            assertEquals("Themed lilac color state list load: pressed", 0xFFE070A0,
-                    themedLilacColorStateList.getColorForState(
-                            new int[]{android.R.attr.state_pressed}, 0));
-        }
-    }
-
-    @Test
-    public void testGetDrawable() throws Throwable {
-        final Drawable unthemedDrawable =
-                ResourcesCompat.getDrawable(mResources, R.drawable.test_drawable_red, null);
-        TestUtils.assertAllPixelsOfColor("Unthemed drawable load",
-                unthemedDrawable, mResources.getColor(R.color.test_red));
-
-        if (Build.VERSION.SDK_INT >= 23) {
-            // The following tests are only expected to pass on v23+ devices. The result of
-            // calling theme-aware getDrawable() in pre-v23 is undefined.
-            final Resources.Theme yellowTheme = mResources.newTheme();
-            yellowTheme.applyStyle(R.style.YellowTheme, true);
-            final Drawable themedYellowDrawable =
-                    ResourcesCompat.getDrawable(mResources, R.drawable.themed_drawable,
-                            yellowTheme);
-            TestUtils.assertAllPixelsOfColor("Themed yellow drawable load",
-                    themedYellowDrawable, 0xFFF0B000);
-
-            final Resources.Theme lilacTheme = mResources.newTheme();
-            lilacTheme.applyStyle(R.style.LilacTheme, true);
-            final Drawable themedLilacDrawable =
-                    ResourcesCompat.getDrawable(mResources, R.drawable.themed_drawable, lilacTheme);
-            TestUtils.assertAllPixelsOfColor("Themed lilac drawable load",
-                    themedLilacDrawable, 0xFFF080F0);
-        }
-    }
-
-    @Test
-    public void testGetDrawableForDensityUnthemed() throws Throwable {
-        // Density-aware drawable loading for now only works on raw bitmap drawables.
-
-        // Different variants of density_aware_drawable are set up in the following way:
-        //    mdpi - 12x12 px which is 12x12 dip
-        //    hdpi - 21x21 px which is 14x14 dip
-        //   xhdpi - 32x32 px which is 16x16 dip
-        //  xxhdpi - 54x54 px which is 18x18 dip
-        // The tests below (on v15+ devices) are checking that an unthemed density-aware
-        // loading of raw bitmap drawables returns a drawable with matching intrinsic
-        // dimensions.
-
-        final Drawable unthemedDrawableForMediumDensity =
-                ResourcesCompat.getDrawableForDensity(mResources, R.drawable.density_aware_drawable,
-                        DisplayMetrics.DENSITY_MEDIUM, null);
-        // For pre-v15 devices we should get a drawable that corresponds to the density of the
-        // current device. For v15+ devices we should get a drawable that corresponds to the
-        // density requested in the API call.
-        final int expectedSizeForMediumDensity = (Build.VERSION.SDK_INT < 15) ?
-                mResources.getDimensionPixelSize(R.dimen.density_aware_size) : 12;
-        assertEquals("Unthemed density-aware drawable load: medium width",
-                expectedSizeForMediumDensity, unthemedDrawableForMediumDensity.getIntrinsicWidth());
-        assertEquals("Unthemed density-aware drawable load: medium height",
-                expectedSizeForMediumDensity,
-                unthemedDrawableForMediumDensity.getIntrinsicHeight());
-
-        final Drawable unthemedDrawableForHighDensity =
-                ResourcesCompat.getDrawableForDensity(mResources, R.drawable.density_aware_drawable,
-                        DisplayMetrics.DENSITY_HIGH, null);
-        // For pre-v15 devices we should get a drawable that corresponds to the density of the
-        // current device. For v15+ devices we should get a drawable that corresponds to the
-        // density requested in the API call.
-        final int expectedSizeForHighDensity = (Build.VERSION.SDK_INT < 15) ?
-                mResources.getDimensionPixelSize(R.dimen.density_aware_size) : 21;
-        assertEquals("Unthemed density-aware drawable load: high width",
-                expectedSizeForHighDensity, unthemedDrawableForHighDensity.getIntrinsicWidth());
-        assertEquals("Unthemed density-aware drawable load: high height",
-                expectedSizeForHighDensity, unthemedDrawableForHighDensity.getIntrinsicHeight());
-
-        final Drawable unthemedDrawableForXHighDensity =
-                ResourcesCompat.getDrawableForDensity(mResources, R.drawable.density_aware_drawable,
-                        DisplayMetrics.DENSITY_XHIGH, null);
-        // For pre-v15 devices we should get a drawable that corresponds to the density of the
-        // current device. For v15+ devices we should get a drawable that corresponds to the
-        // density requested in the API call.
-        final int expectedSizeForXHighDensity = (Build.VERSION.SDK_INT < 15) ?
-                mResources.getDimensionPixelSize(R.dimen.density_aware_size) : 32;
-        assertEquals("Unthemed density-aware drawable load: xhigh width",
-                expectedSizeForXHighDensity, unthemedDrawableForXHighDensity.getIntrinsicWidth());
-        assertEquals("Unthemed density-aware drawable load: xhigh height",
-                expectedSizeForXHighDensity, unthemedDrawableForXHighDensity.getIntrinsicHeight());
-
-        final Drawable unthemedDrawableForXXHighDensity =
-                ResourcesCompat.getDrawableForDensity(mResources, R.drawable.density_aware_drawable,
-                        DisplayMetrics.DENSITY_XXHIGH, null);
-        // For pre-v15 devices we should get a drawable that corresponds to the density of the
-        // current device. For v15+ devices we should get a drawable that corresponds to the
-        // density requested in the API call.
-        final int expectedSizeForXXHighDensity = (Build.VERSION.SDK_INT < 15) ?
-                mResources.getDimensionPixelSize(R.dimen.density_aware_size) : 54;
-        assertEquals("Unthemed density-aware drawable load: xxhigh width",
-                expectedSizeForXXHighDensity, unthemedDrawableForXXHighDensity.getIntrinsicWidth());
-        assertEquals("Unthemed density-aware drawable load: xxhigh height",
-                expectedSizeForXXHighDensity,
-                unthemedDrawableForXXHighDensity.getIntrinsicHeight());
-    }
-
-    @Test
-    public void testGetDrawableForDensityThemed() throws Throwable {
-        if (Build.VERSION.SDK_INT < 21) {
-            // The following tests are only expected to pass on v21+ devices. The result of
-            // calling theme-aware getDrawableForDensity() in pre-v21 is undefined.
-            return;
-        }
-
-        // Density- and theme-aware drawable loading for now only works partially. This test
-        // checks only for theming of a tinted bitmap XML drawable, but not correct scaling.
-
-        // Set up the two test themes, yellow and lilac.
-        final Resources.Theme yellowTheme = mResources.newTheme();
-        yellowTheme.applyStyle(R.style.YellowTheme, true);
-
-        final Resources.Theme lilacTheme = mResources.newTheme();
-        lilacTheme.applyStyle(R.style.LilacTheme, true);
-
-        Drawable themedYellowDrawableForMediumDensity =
-                ResourcesCompat.getDrawableForDensity(mResources, R.drawable.themed_bitmap,
-                        DisplayMetrics.DENSITY_MEDIUM, yellowTheme);
-        // We should get a drawable that corresponds to the theme requested in the API call.
-        TestUtils.assertAllPixelsOfColor("Themed yellow density-aware drawable load : medium color",
-                themedYellowDrawableForMediumDensity, 0xFFF0B000);
-
-        Drawable themedLilacDrawableForMediumDensity =
-                ResourcesCompat.getDrawableForDensity(mResources, R.drawable.themed_bitmap,
-                        DisplayMetrics.DENSITY_MEDIUM, lilacTheme);
-        // We should get a drawable that corresponds to the theme requested in the API call.
-        TestUtils.assertAllPixelsOfColor("Themed lilac density-aware drawable load : medium color",
-                themedLilacDrawableForMediumDensity, 0xFFF080F0);
-
-        Drawable themedYellowDrawableForHighDensity =
-                ResourcesCompat.getDrawableForDensity(mResources, R.drawable.themed_bitmap,
-                        DisplayMetrics.DENSITY_HIGH, yellowTheme);
-        // We should get a drawable that corresponds to the theme requested in the API call.
-        TestUtils.assertAllPixelsOfColor("Themed yellow density-aware drawable load : high color",
-                themedYellowDrawableForHighDensity, 0xFFF0B000);
-
-        Drawable themedLilacDrawableForHighDensity =
-                ResourcesCompat.getDrawableForDensity(mResources, R.drawable.themed_bitmap,
-                        DisplayMetrics.DENSITY_HIGH, lilacTheme);
-        // We should get a drawable that corresponds to the theme requested in the API call.
-        TestUtils.assertAllPixelsOfColor("Themed lilac density-aware drawable load : high color",
-                themedLilacDrawableForHighDensity, 0xFFF080F0);
-
-        Drawable themedYellowDrawableForXHighDensity =
-                ResourcesCompat.getDrawableForDensity(mResources, R.drawable.themed_bitmap,
-                        DisplayMetrics.DENSITY_XHIGH, yellowTheme);
-        // We should get a drawable that corresponds to the theme requested in the API call.
-        TestUtils.assertAllPixelsOfColor("Themed yellow density-aware drawable load : xhigh color",
-                themedYellowDrawableForXHighDensity, 0xFFF0B000);
-
-        Drawable themedLilacDrawableForXHighDensity =
-                ResourcesCompat.getDrawableForDensity(mResources, R.drawable.themed_bitmap,
-                        DisplayMetrics.DENSITY_XHIGH, lilacTheme);
-        // We should get a drawable that corresponds to the theme requested in the API call.
-        TestUtils.assertAllPixelsOfColor("Themed lilac density-aware drawable load : xhigh color",
-                themedLilacDrawableForXHighDensity, 0xFFF080F0);
-
-        Drawable themedYellowDrawableForXXHighDensity =
-                ResourcesCompat.getDrawableForDensity(mResources, R.drawable.themed_bitmap,
-                        DisplayMetrics.DENSITY_XXHIGH, yellowTheme);
-        // We should get a drawable that corresponds to the theme requested in the API call.
-        TestUtils.assertAllPixelsOfColor("Themed yellow density-aware drawable load : xxhigh color",
-                themedYellowDrawableForXXHighDensity, 0xFFF0B000);
-
-        Drawable themedLilacDrawableForXXHighDensity =
-                ResourcesCompat.getDrawableForDensity(mResources, R.drawable.themed_bitmap,
-                        DisplayMetrics.DENSITY_XXHIGH, lilacTheme);
-        // We should get a drawable that corresponds to the theme requested in the API call.
-        TestUtils.assertAllPixelsOfColor("Themed lilac density-aware drawable load : xxhigh color",
-                themedLilacDrawableForXXHighDensity, 0xFFF080F0);
-    }
-}
diff --git a/v4/tests/java/android/support/v4/graphics/ColorUtilsTest.java b/v4/tests/java/android/support/v4/graphics/ColorUtilsTest.java
index 998980b..985f874 100644
--- a/v4/tests/java/android/support/v4/graphics/ColorUtilsTest.java
+++ b/v4/tests/java/android/support/v4/graphics/ColorUtilsTest.java
@@ -82,6 +82,7 @@
                 .setWhiteMinAlpha30(0.39f).setWhiteMinAlpha45(0.54f));
     }
 
+    @Test
     public void testColorToHSL() {
         for (TestEntry entry : sEntryList) {
             verifyColorToHSL(entry.rgb, entry.hsl);
diff --git a/v4/tests/java/android/support/v4/graphics/DrawableCompatTest.java b/v4/tests/java/android/support/v4/graphics/DrawableCompatTest.java
deleted file mode 100644
index 6716a7c..0000000
--- a/v4/tests/java/android/support/v4/graphics/DrawableCompatTest.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * Copyright (C) 2016 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 android.support.v4.graphics;
-
-import android.content.res.ColorStateList;
-import android.graphics.Color;
-import android.graphics.PorterDuff;
-import android.graphics.Rect;
-import android.graphics.drawable.Drawable;
-import android.graphics.drawable.GradientDrawable;
-import android.support.test.runner.AndroidJUnit4;
-import android.os.Build;
-import android.support.v4.graphics.drawable.DrawableCompat;
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNotSame;
-import static org.junit.Assert.assertSame;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-
-@RunWith(AndroidJUnit4.class)
-@SmallTest
-public class DrawableCompatTest {
-    @Test
-    public void testDrawableWrap() {
-        final Drawable original = new GradientDrawable();
-        final Drawable wrappedDrawable = DrawableCompat.wrap(original);
-
-        if (Build.VERSION.SDK_INT < 23) {
-            assertNotSame(original, wrappedDrawable);
-        } else {
-            assertSame(original, wrappedDrawable);
-        }
-    }
-
-    @Test
-    public void testDrawableUnwrap() {
-        final Drawable original = new GradientDrawable();
-        final Drawable wrappedDrawable = DrawableCompat.wrap(original);
-        assertSame(original, DrawableCompat.unwrap(wrappedDrawable));
-    }
-
-    @Test
-    public void testDrawableChangeBoundsCopy() {
-        final Rect bounds = new Rect(0, 0, 10, 10);
-
-        final Drawable drawable = new GradientDrawable();
-
-        final Drawable wrapper = DrawableCompat.wrap(drawable);
-        wrapper.setBounds(bounds);
-
-        // Assert that the bounds were given to the original drawable
-        assertEquals(bounds, drawable.getBounds());
-    }
-
-    @Test
-    public void testDrawableWrapOnlyWrapsOnce() {
-        final Drawable wrappedDrawable = DrawableCompat.wrap(new GradientDrawable());
-        assertSame(wrappedDrawable, DrawableCompat.wrap(wrappedDrawable));
-    }
-
-    @Test
-    public void testWrapMutatedDrawableHasConstantState() {
-        // First create a Drawable, and mutated it so that it has a constant state
-        Drawable drawable = new GradientDrawable();
-        drawable = drawable.mutate();
-        assertNotNull(drawable.getConstantState());
-
-        // Now wrap and assert that the wrapper also returns a constant state
-        final Drawable wrapper = DrawableCompat.wrap(drawable);
-        assertNotNull(wrapper.getConstantState());
-    }
-
-    @Test
-    public void testWrappedDrawableHasCallbackSet() {
-        // First create a Drawable
-        final Drawable drawable = new GradientDrawable();
-
-        // Now wrap it and set a mock as the wrapper's callback
-        final Drawable wrapper = DrawableCompat.wrap(drawable);
-        final Drawable.Callback mockCallback = mock(Drawable.Callback.class);
-        wrapper.setCallback(mockCallback);
-
-        // Now make the wrapped drawable invalidate itself
-        drawable.invalidateSelf();
-
-        // ...and verify that the wrapper calls to be invalidated
-        verify(mockCallback, times(1)).invalidateDrawable(wrapper);
-    }
-
-    @Test
-    public void testDoesNotWrapTintAwareDrawable() {
-        final TestTintAwareDrawable tintAwareDrawable = new TestTintAwareDrawable();
-        final Drawable wrapped = DrawableCompat.wrap(tintAwareDrawable);
-        // Assert that the tint aware drawable was not wrapped
-        assertSame(tintAwareDrawable, wrapped);
-    }
-
-    @Test
-    public void testTintAwareDrawableGetsTintCallsDirectly() {
-        final TestTintAwareDrawable d = mock(TestTintAwareDrawable.class);
-
-        final ColorStateList tint = ColorStateList.valueOf(Color.BLACK);
-        final PorterDuff.Mode tintMode = PorterDuff.Mode.DST;
-
-        // Now set the tint list and mode using DrawableCompat
-        DrawableCompat.setTintList(d, tint);
-        DrawableCompat.setTintMode(d, tintMode);
-
-        // Verify that the calls were directly on to the TintAwareDrawable
-        verify(d).setTintList(tint);
-        verify(d).setTintMode(tintMode);
-    }
-
-}
\ No newline at end of file
diff --git a/v4/tests/java/android/support/v4/testutils/TestUtils.java b/v4/tests/java/android/support/v4/testutils/TestUtils.java
deleted file mode 100644
index 9b1acee..0000000
--- a/v4/tests/java/android/support/v4/testutils/TestUtils.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.v4.testutils;
-
-import java.lang.IllegalArgumentException;
-import java.lang.RuntimeException;
-
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
-import android.graphics.Color;
-import android.graphics.Rect;
-import android.graphics.drawable.Drawable;
-import android.support.annotation.ColorInt;
-import android.support.annotation.NonNull;
-import android.util.DisplayMetrics;
-import android.util.TypedValue;
-
-import junit.framework.Assert;
-
-public class TestUtils {
-    /**
-     * Converts the specified value from dips to pixels for use as view size.
-     */
-    public static int convertSizeDipsToPixels(DisplayMetrics displayMetrics, int dipValue) {
-        // Round to the nearest int value. This follows the logic in
-        // TypedValue.complexToDimensionPixelSize
-        final int res = (int) (dipValue * displayMetrics.density + 0.5f);
-        if (res != 0) {
-            return res;
-        }
-        if (dipValue == 0) {
-            return 0;
-        }
-        if (dipValue > 0) {
-            return 1;
-        }
-        return -1;
-    }
-
-    /**
-     * Converts the specified value from dips to pixels for use as view offset.
-     */
-    public static int convertOffsetDipsToPixels(DisplayMetrics displayMetrics, int dipValue) {
-        // Round to the nearest int value.
-        return (int) (dipValue * displayMetrics.density);
-    }
-
-
-    /**
-     * Checks whether all the pixels in the specified drawable are of the same specified color.
-     * If the passed <code>Drawable</code> does not have positive intrinsic dimensions set, this
-     * method will throw an <code>IllegalArgumentException</code>. If there is a color mismatch,
-     * this method will call <code>Assert.fail</code> with detailed description of the mismatch.
-     */
-    public static void assertAllPixelsOfColor(String failMessagePrefix, @NonNull Drawable drawable,
-            @ColorInt int color) {
-        int drawableWidth = drawable.getIntrinsicWidth();
-        int drawableHeight = drawable.getIntrinsicHeight();
-
-        if ((drawableWidth <= 0) || (drawableHeight <= 0)) {
-            throw new IllegalArgumentException("Drawable must be configured to have non-zero size");
-        }
-
-        assertAllPixelsOfColor(failMessagePrefix, drawable, drawableWidth, drawableHeight, color,
-                false);
-    }
-
-    /**
-     * Checks whether all the pixels in the specified drawable are of the same specified color.
-     *
-     * In case there is a color mismatch, the behavior of this method depends on the
-     * <code>throwExceptionIfFails</code> parameter. If it is <code>true</code>, this method will
-     * throw an <code>Exception</code> describing the mismatch. Otherwise this method will call
-     * <code>Assert.fail</code> with detailed description of the mismatch.
-     */
-    public static void assertAllPixelsOfColor(String failMessagePrefix, @NonNull Drawable drawable,
-            int drawableWidth, int drawableHeight, @ColorInt int color,
-            boolean throwExceptionIfFails) {
-        // Create a bitmap
-        Bitmap bitmap = Bitmap.createBitmap(drawableWidth, drawableHeight, Bitmap.Config.ARGB_8888);
-        // Create a canvas that wraps the bitmap
-        Canvas canvas = new Canvas(bitmap);
-        // Configure the drawable to have bounds that match its intrinsic size
-        drawable.setBounds(0, 0, drawableWidth, drawableHeight);
-        // And ask the drawable to draw itself to the canvas / bitmap
-        drawable.draw(canvas);
-
-        try {
-            int[] rowPixels = new int[drawableWidth];
-            for (int row = 0; row < drawableHeight; row++) {
-                bitmap.getPixels(rowPixels, 0, drawableWidth, 0, row, drawableWidth, 1);
-                for (int column = 0; column < drawableWidth; column++) {
-                    if (rowPixels[column] != color) {
-                        String mismatchDescription = failMessagePrefix
-                                + ": expected all drawable colors to be ["
-                                + Color.red(color) + "," + Color.green(color) + ","
-                                + Color.blue(color)
-                                + "] but at position (" + row + "," + column + ") found ["
-                                + Color.red(rowPixels[column]) + ","
-                                + Color.green(rowPixels[column]) + ","
-                                + Color.blue(rowPixels[column]) + "]";
-                        if (throwExceptionIfFails) {
-                            throw new RuntimeException(mismatchDescription);
-                        } else {
-                            Assert.fail(mismatchDescription);
-                        }
-                    }
-                }
-            }
-        } finally {
-            bitmap.recycle();
-        }
-    }
-
-    /**
-     * Checks whether the specified rectangle matches the specified left / top / right /
-     * bottom bounds.
-     */
-    public static void assertRectangleBounds(String failMessagePrefix, @NonNull Rect rectangle,
-            int left, int top, int right, int bottom) {
-        Assert.assertEquals(failMessagePrefix + " left", rectangle.left, left);
-        Assert.assertEquals(failMessagePrefix + " top", rectangle.top, top);
-        Assert.assertEquals(failMessagePrefix + " right", rectangle.right, right);
-        Assert.assertEquals(failMessagePrefix + " bottom", rectangle.bottom, bottom);
-    }
-}
\ No newline at end of file
diff --git a/v4/tests/java/android/support/v4/view/BaseViewPagerTest.java b/v4/tests/java/android/support/v4/view/BaseViewPagerTest.java
deleted file mode 100644
index 6fc7234..0000000
--- a/v4/tests/java/android/support/v4/view/BaseViewPagerTest.java
+++ /dev/null
@@ -1,979 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.v4.view;
-
-import android.app.Activity;
-import android.graphics.Color;
-import android.support.test.espresso.ViewAction;
-import android.support.v4.BaseInstrumentationTestCase;
-import android.support.v4.test.R;
-import android.support.v4.testutils.TestUtilsMatchers;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.test.suitebuilder.annotation.SmallTest;
-import android.text.TextUtils;
-import android.util.Pair;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.TextView;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.mockito.ArgumentCaptor;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import static android.support.test.espresso.Espresso.onView;
-import static android.support.test.espresso.action.ViewActions.swipeLeft;
-import static android.support.test.espresso.action.ViewActions.swipeRight;
-import static android.support.test.espresso.assertion.PositionAssertions.*;
-import static android.support.test.espresso.assertion.ViewAssertions.doesNotExist;
-import static android.support.test.espresso.assertion.ViewAssertions.matches;
-import static android.support.test.espresso.matcher.ViewMatchers.*;
-import static android.support.v4.testutils.TestUtilsAssertions.hasDisplayedChildren;
-import static android.support.v4.testutils.TestUtilsMatchers.*;
-import static android.support.v4.view.ViewPagerActions.*;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.Matchers.allOf;
-import static org.hamcrest.core.IsNot.not;
-import static org.junit.Assert.assertEquals;
-import static org.mockito.Mockito.*;
-
-/**
- * Base class for testing <code>ViewPager</code>. Most of the testing logic should be in this
- * class as it is independent on the specific pager title implementation (interactive or non
- * interactive).
- *
- * Testing logic that does depend on the specific pager title implementation is pushed into the
- * extending classes in <code>assertStripInteraction()</code> method.
- */
-public abstract class BaseViewPagerTest<T extends Activity> extends BaseInstrumentationTestCase<T> {
-    protected ViewPager mViewPager;
-
-    protected static class BasePagerAdapter<Q> extends PagerAdapter {
-        protected ArrayList<Pair<String, Q>> mEntries = new ArrayList<>();
-
-        public void add(String title, Q content) {
-            mEntries.add(new Pair(title, content));
-        }
-
-        @Override
-        public int getCount() {
-            return mEntries.size();
-        }
-
-        protected void configureInstantiatedItem(View view, int position) {
-            switch (position) {
-                case 0:
-                    view.setId(R.id.page_0);
-                    break;
-                case 1:
-                    view.setId(R.id.page_1);
-                    break;
-                case 2:
-                    view.setId(R.id.page_2);
-                    break;
-                case 3:
-                    view.setId(R.id.page_3);
-                    break;
-                case 4:
-                    view.setId(R.id.page_4);
-                    break;
-                case 5:
-                    view.setId(R.id.page_5);
-                    break;
-                case 6:
-                    view.setId(R.id.page_6);
-                    break;
-                case 7:
-                    view.setId(R.id.page_7);
-                    break;
-                case 8:
-                    view.setId(R.id.page_8);
-                    break;
-                case 9:
-                    view.setId(R.id.page_9);
-                    break;
-            }
-        }
-
-        @Override
-        public void destroyItem(ViewGroup container, int position, Object object) {
-            // The adapter is also responsible for removing the view.
-            container.removeView(((ViewHolder) object).view);
-        }
-
-        @Override
-        public int getItemPosition(Object object) {
-            return ((ViewHolder) object).position;
-        }
-
-        @Override
-        public boolean isViewFromObject(View view, Object object) {
-            return ((ViewHolder) object).view == view;
-        }
-
-        @Override
-        public CharSequence getPageTitle(int position) {
-            return mEntries.get(position).first;
-        }
-
-        protected static class ViewHolder {
-            final View view;
-            final int position;
-
-            public ViewHolder(View view, int position) {
-                this.view = view;
-                this.position = position;
-            }
-        }
-    }
-
-    protected static class ColorPagerAdapter extends BasePagerAdapter<Integer> {
-        @Override
-        public Object instantiateItem(ViewGroup container, int position) {
-            final View view = new View(container.getContext());
-            view.setBackgroundColor(mEntries.get(position).second);
-            configureInstantiatedItem(view, position);
-
-            // Unlike ListView adapters, the ViewPager adapter is responsible
-            // for adding the view to the container.
-            container.addView(view);
-
-            return new ViewHolder(view, position);
-        }
-    }
-
-    protected static class TextPagerAdapter extends BasePagerAdapter<String> {
-        @Override
-        public Object instantiateItem(ViewGroup container, int position) {
-            final TextView view = new TextView(container.getContext());
-            view.setText(mEntries.get(position).second);
-            configureInstantiatedItem(view, position);
-
-            // Unlike ListView adapters, the ViewPager adapter is responsible
-            // for adding the view to the container.
-            container.addView(view);
-
-            return new ViewHolder(view, position);
-        }
-    }
-
-    public BaseViewPagerTest(Class<T> activityClass) {
-        super(activityClass);
-    }
-
-    @Before
-    public void setUp() throws Exception {
-        final T activity = mActivityTestRule.getActivity();
-        mViewPager = (ViewPager) activity.findViewById(R.id.pager);
-
-        ColorPagerAdapter adapter = new ColorPagerAdapter();
-        adapter.add("Red", Color.RED);
-        adapter.add("Green", Color.GREEN);
-        adapter.add("Blue", Color.BLUE);
-        onView(withId(R.id.pager)).perform(setAdapter(adapter), scrollToPage(0, false));
-    }
-
-    @After
-    public void tearDown() throws Exception {
-        onView(withId(R.id.pager)).perform(setAdapter(null));
-    }
-
-    private void verifyPageSelections(boolean smoothScroll) {
-        assertEquals("Initial state", 0, mViewPager.getCurrentItem());
-
-        ViewPager.OnPageChangeListener mockPageChangeListener =
-                mock(ViewPager.OnPageChangeListener.class);
-        mViewPager.addOnPageChangeListener(mockPageChangeListener);
-
-        onView(withId(R.id.pager)).perform(scrollRight(smoothScroll));
-        assertEquals("Scroll right", 1, mViewPager.getCurrentItem());
-        verify(mockPageChangeListener, times(1)).onPageSelected(1);
-
-        onView(withId(R.id.pager)).perform(scrollRight(smoothScroll));
-        assertEquals("Scroll right", 2, mViewPager.getCurrentItem());
-        verify(mockPageChangeListener, times(1)).onPageSelected(2);
-
-        // Try "scrolling" beyond the last page and test that we're still on the last page.
-        onView(withId(R.id.pager)).perform(scrollRight(smoothScroll));
-        assertEquals("Scroll right beyond last page", 2, mViewPager.getCurrentItem());
-        // We're still on this page, so we shouldn't have been called again with index 2
-        verify(mockPageChangeListener, times(1)).onPageSelected(2);
-
-        onView(withId(R.id.pager)).perform(scrollLeft(smoothScroll));
-        assertEquals("Scroll left", 1, mViewPager.getCurrentItem());
-        // Verify that this is the second time we're called on index 1
-        verify(mockPageChangeListener, times(2)).onPageSelected(1);
-
-        onView(withId(R.id.pager)).perform(scrollLeft(smoothScroll));
-        assertEquals("Scroll left", 0, mViewPager.getCurrentItem());
-        // Verify that this is the first time we're called on index 0
-        verify(mockPageChangeListener, times(1)).onPageSelected(0);
-
-        // Try "scrolling" beyond the first page and test that we're still on the first page.
-        onView(withId(R.id.pager)).perform(scrollLeft(smoothScroll));
-        assertEquals("Scroll left beyond first page", 0, mViewPager.getCurrentItem());
-        // We're still on this page, so we shouldn't have been called again with index 0
-        verify(mockPageChangeListener, times(1)).onPageSelected(0);
-
-        // Unregister our listener
-        mViewPager.removeOnPageChangeListener(mockPageChangeListener);
-
-        // Go from index 0 to index 2
-        onView(withId(R.id.pager)).perform(scrollToPage(2, smoothScroll));
-        assertEquals("Scroll to last page", 2, mViewPager.getCurrentItem());
-        // Our listener is not registered anymore, so we shouldn't have been called with index 2
-        verify(mockPageChangeListener, times(1)).onPageSelected(2);
-
-        // And back to 0
-        onView(withId(R.id.pager)).perform(scrollToPage(0, smoothScroll));
-        assertEquals("Scroll to first page", 0, mViewPager.getCurrentItem());
-        // Our listener is not registered anymore, so we shouldn't have been called with index 0
-        verify(mockPageChangeListener, times(1)).onPageSelected(0);
-
-        // Verify the overall sequence of calls to onPageSelected of our listener
-        ArgumentCaptor<Integer> pageSelectedCaptor = ArgumentCaptor.forClass(int.class);
-        verify(mockPageChangeListener, times(4)).onPageSelected(pageSelectedCaptor.capture());
-        assertThat(pageSelectedCaptor.getAllValues(), TestUtilsMatchers.matches(1, 2, 1, 0));
-    }
-
-    @Test
-    @SmallTest
-    public void testPageSelectionsImmediate() {
-        verifyPageSelections(false);
-    }
-
-    @Test
-    @SmallTest
-    public void testPageSelectionsSmooth() {
-        verifyPageSelections(true);
-    }
-
-    @Test
-    @SmallTest
-    public void testPageSwipes() {
-        assertEquals("Initial state", 0, mViewPager.getCurrentItem());
-
-        ViewPager.OnPageChangeListener mockPageChangeListener =
-                mock(ViewPager.OnPageChangeListener.class);
-        mViewPager.addOnPageChangeListener(mockPageChangeListener);
-
-        onView(withId(R.id.pager)).perform(wrap(swipeLeft()));
-        assertEquals("Swipe left", 1, mViewPager.getCurrentItem());
-        verify(mockPageChangeListener, times(1)).onPageSelected(1);
-
-        onView(withId(R.id.pager)).perform(wrap(swipeLeft()));
-        assertEquals("Swipe left", 2, mViewPager.getCurrentItem());
-        verify(mockPageChangeListener, times(1)).onPageSelected(2);
-
-        // Try swiping beyond the last page and test that we're still on the last page.
-        onView(withId(R.id.pager)).perform(wrap(swipeLeft()));
-        assertEquals("Swipe left beyond last page", 2, mViewPager.getCurrentItem());
-        // We're still on this page, so we shouldn't have been called again with index 2
-        verify(mockPageChangeListener, times(1)).onPageSelected(2);
-
-        onView(withId(R.id.pager)).perform(wrap(swipeRight()));
-        assertEquals("Swipe right", 1, mViewPager.getCurrentItem());
-        // Verify that this is the second time we're called on index 1
-        verify(mockPageChangeListener, times(2)).onPageSelected(1);
-
-        onView(withId(R.id.pager)).perform(wrap(swipeRight()));
-        assertEquals("Swipe right", 0, mViewPager.getCurrentItem());
-        // Verify that this is the first time we're called on index 0
-        verify(mockPageChangeListener, times(1)).onPageSelected(0);
-
-        // Try swiping beyond the first page and test that we're still on the first page.
-        onView(withId(R.id.pager)).perform(wrap(swipeRight()));
-        assertEquals("Swipe right beyond first page", 0, mViewPager.getCurrentItem());
-        // We're still on this page, so we shouldn't have been called again with index 0
-        verify(mockPageChangeListener, times(1)).onPageSelected(0);
-
-        mViewPager.removeOnPageChangeListener(mockPageChangeListener);
-
-        // Verify the overall sequence of calls to onPageSelected of our listener
-        ArgumentCaptor<Integer> pageSelectedCaptor = ArgumentCaptor.forClass(int.class);
-        verify(mockPageChangeListener, times(4)).onPageSelected(pageSelectedCaptor.capture());
-        assertThat(pageSelectedCaptor.getAllValues(), TestUtilsMatchers.matches(1, 2, 1, 0));
-    }
-
-    @Test
-    @SmallTest
-    public void testPageSwipesComposite() {
-        assertEquals("Initial state", 0, mViewPager.getCurrentItem());
-
-        onView(withId(R.id.pager)).perform(wrap(swipeLeft()), wrap(swipeLeft()));
-        assertEquals("Swipe twice left", 2, mViewPager.getCurrentItem());
-
-        onView(withId(R.id.pager)).perform(wrap(swipeLeft()), wrap(swipeRight()));
-        assertEquals("Swipe left beyond last page and then right", 1, mViewPager.getCurrentItem());
-
-        onView(withId(R.id.pager)).perform(wrap(swipeRight()), wrap(swipeRight()));
-        assertEquals("Swipe right and then right beyond first page", 0,
-                mViewPager.getCurrentItem());
-
-        onView(withId(R.id.pager)).perform(wrap(swipeRight()), wrap(swipeLeft()));
-        assertEquals("Swipe right beyond first page and then left", 1, mViewPager.getCurrentItem());
-    }
-
-    private void verifyPageContent(boolean smoothScroll) {
-        assertEquals("Initial state", 0, mViewPager.getCurrentItem());
-
-        // Verify the displayed content to match the initial adapter - with 3 pages and each
-        // one rendered as a View.
-
-        // Page #0 should be displayed, page #1 should not be displayed and page #2 should not exist
-        // yet as it's outside of the offscreen window limit.
-        onView(withId(R.id.page_0)).check(matches(allOf(
-                isOfClass(View.class),
-                isDisplayed(),
-                backgroundColor(Color.RED))));
-        onView(withId(R.id.page_1)).check(matches(not(isDisplayed())));
-        onView(withId(R.id.page_2)).check(doesNotExist());
-
-        // Scroll one page to select page #1
-        onView(withId(R.id.pager)).perform(scrollRight(smoothScroll));
-        assertEquals("Scroll right", 1, mViewPager.getCurrentItem());
-        // Pages #0 / #2 should not be displayed, page #1 should be displayed.
-        onView(withId(R.id.page_0)).check(matches(not(isDisplayed())));
-        onView(withId(R.id.page_1)).check(matches(allOf(
-                isOfClass(View.class),
-                isDisplayed(),
-                backgroundColor(Color.GREEN))));
-        onView(withId(R.id.page_2)).check(matches(not(isDisplayed())));
-
-        // Scroll one more page to select page #2
-        onView(withId(R.id.pager)).perform(scrollRight(smoothScroll));
-        assertEquals("Scroll right again", 2, mViewPager.getCurrentItem());
-        // Page #0 should not exist as it's bumped to the outside of the offscreen window limit,
-        // page #1 should not be displayed, page #2 should be displayed.
-        onView(withId(R.id.page_0)).check(doesNotExist());
-        onView(withId(R.id.page_1)).check(matches(not(isDisplayed())));
-        onView(withId(R.id.page_2)).check(matches(allOf(
-                isOfClass(View.class),
-                isDisplayed(),
-                backgroundColor(Color.BLUE))));
-    }
-
-    @Test
-    @SmallTest
-    public void testPageContentImmediate() {
-        verifyPageContent(false);
-    }
-
-    @Test
-    @SmallTest
-    public void testPageContentSmooth() {
-        verifyPageContent(true);
-    }
-
-    private void verifyAdapterChange(boolean smoothScroll) {
-        // Verify that we have the expected initial adapter
-        PagerAdapter initialAdapter = mViewPager.getAdapter();
-        assertEquals("Initial adapter class", ColorPagerAdapter.class, initialAdapter.getClass());
-        assertEquals("Initial adapter page count", 3, initialAdapter.getCount());
-
-        // Create a new adapter
-        TextPagerAdapter newAdapter = new TextPagerAdapter();
-        newAdapter.add("Title 0", "Body 0");
-        newAdapter.add("Title 1", "Body 1");
-        newAdapter.add("Title 2", "Body 2");
-        newAdapter.add("Title 3", "Body 3");
-        onView(withId(R.id.pager)).perform(setAdapter(newAdapter), scrollToPage(0, smoothScroll));
-
-        // Verify the displayed content to match the newly set adapter - with 4 pages and each
-        // one rendered as a TextView.
-
-        // Page #0 should be displayed, page #1 should not be displayed and pages #2 / #3 should not
-        // exist yet as they're outside of the offscreen window limit.
-        onView(withId(R.id.page_0)).check(matches(allOf(
-                isOfClass(TextView.class),
-                isDisplayed(),
-                withText("Body 0"))));
-        onView(withId(R.id.page_1)).check(matches(not(isDisplayed())));
-        onView(withId(R.id.page_2)).check(doesNotExist());
-        onView(withId(R.id.page_3)).check(doesNotExist());
-
-        // Scroll one page to select page #1
-        onView(withId(R.id.pager)).perform(scrollRight(smoothScroll));
-        assertEquals("Scroll right", 1, mViewPager.getCurrentItem());
-        // Pages #0 / #2 should not be displayed, page #1 should be displayed, page #3 is still
-        // outside the offscreen limit.
-        onView(withId(R.id.page_0)).check(matches(not(isDisplayed())));
-        onView(withId(R.id.page_1)).check(matches(allOf(
-                isOfClass(TextView.class),
-                isDisplayed(),
-                withText("Body 1"))));
-        onView(withId(R.id.page_2)).check(matches(not(isDisplayed())));
-        onView(withId(R.id.page_3)).check(doesNotExist());
-
-        // Scroll one more page to select page #2
-        onView(withId(R.id.pager)).perform(scrollRight(smoothScroll));
-        assertEquals("Scroll right again", 2, mViewPager.getCurrentItem());
-        // Page #0 should not exist as it's bumped to the outside of the offscreen window limit,
-        // pages #1 / #3 should not be displayed, page #2 should be displayed.
-        onView(withId(R.id.page_0)).check(doesNotExist());
-        onView(withId(R.id.page_1)).check(matches(not(isDisplayed())));
-        onView(withId(R.id.page_2)).check(matches(allOf(
-                isOfClass(TextView.class),
-                isDisplayed(),
-                withText("Body 2"))));
-        onView(withId(R.id.page_3)).check(matches(not(isDisplayed())));
-
-        // Scroll one more page to select page #2
-        onView(withId(R.id.pager)).perform(scrollRight(smoothScroll));
-        assertEquals("Scroll right one more time", 3, mViewPager.getCurrentItem());
-        // Pages #0 / #1 should not exist as they're bumped to the outside of the offscreen window
-        // limit, page #2 should not be displayed, page #3 should be displayed.
-        onView(withId(R.id.page_0)).check(doesNotExist());
-        onView(withId(R.id.page_1)).check(doesNotExist());
-        onView(withId(R.id.page_2)).check(matches(not(isDisplayed())));
-        onView(withId(R.id.page_3)).check(matches(allOf(
-                isOfClass(TextView.class),
-                isDisplayed(),
-                withText("Body 3"))));
-    }
-
-    @Test
-    @SmallTest
-    public void testAdapterChangeImmediate() {
-        verifyAdapterChange(false);
-    }
-
-    @Test
-    @SmallTest
-    public void testAdapterChangeSmooth() {
-        verifyAdapterChange(true);
-    }
-
-    private void verifyTitleStripLayout(String expectedStartTitle, String expectedSelectedTitle,
-            String expectedEndTitle, int selectedPageId) {
-        // Check that the title strip spans the whole width of the pager and is aligned to
-        // its top
-        onView(withId(R.id.titles)).check(isLeftAlignedWith(withId(R.id.pager)));
-        onView(withId(R.id.titles)).check(isRightAlignedWith(withId(R.id.pager)));
-        onView(withId(R.id.titles)).check(isTopAlignedWith(withId(R.id.pager)));
-
-        // Check that the currently selected page spans the whole width of the pager and is below
-        // the title strip
-        onView(withId(selectedPageId)).check(isLeftAlignedWith(withId(R.id.pager)));
-        onView(withId(selectedPageId)).check(isRightAlignedWith(withId(R.id.pager)));
-        onView(withId(selectedPageId)).check(isBelow(withId(R.id.titles)));
-        onView(withId(selectedPageId)).check(isBottomAlignedWith(withId(R.id.pager)));
-
-        boolean hasStartTitle = !TextUtils.isEmpty(expectedStartTitle);
-        boolean hasEndTitle = !TextUtils.isEmpty(expectedEndTitle);
-
-        // Check that the title strip shows the expected number of children (tab titles)
-        int nonNullTitles = (hasStartTitle ? 1 : 0) + 1 + (hasEndTitle ? 1 : 0);
-        onView(withId(R.id.titles)).check(hasDisplayedChildren(nonNullTitles));
-
-        if (hasStartTitle) {
-            // Check that the title for the start page is displayed at the start edge of its parent
-            // (title strip)
-            onView(withId(R.id.titles)).check(matches(hasDescendant(
-                    allOf(withText(expectedStartTitle), isDisplayed(), startAlignedToParent()))));
-        }
-        // Check that the title for the selected page is displayed centered in its parent
-        // (title strip)
-        onView(withId(R.id.titles)).check(matches(hasDescendant(
-                allOf(withText(expectedSelectedTitle), isDisplayed(), centerAlignedInParent()))));
-        if (hasEndTitle) {
-            // Check that the title for the end page is displayed at the end edge of its parent
-            // (title strip)
-            onView(withId(R.id.titles)).check(matches(hasDescendant(
-                    allOf(withText(expectedEndTitle), isDisplayed(), endAlignedToParent()))));
-        }
-    }
-
-    private void verifyPagerStrip(boolean smoothScroll) {
-        // Set an adapter with 5 pages
-        final ColorPagerAdapter adapter = new ColorPagerAdapter();
-        adapter.add("Red", Color.RED);
-        adapter.add("Green", Color.GREEN);
-        adapter.add("Blue", Color.BLUE);
-        adapter.add("Yellow", Color.YELLOW);
-        adapter.add("Magenta", Color.MAGENTA);
-        onView(withId(R.id.pager)).perform(setAdapter(adapter),
-                scrollToPage(0, smoothScroll));
-
-        // Check that the pager has a title strip
-        onView(withId(R.id.pager)).check(matches(hasDescendant(withId(R.id.titles))));
-        // Check that the title strip is displayed and is of the expected class
-        onView(withId(R.id.titles)).check(matches(allOf(
-                isDisplayed(), isOfClass(getStripClass()))));
-
-        // The following block tests the overall layout of tab strip and main pager content
-        // (vertical stacking), the content of the tab strip (showing texts for the selected
-        // tab and the ones on its left / right) as well as the alignment of the content in the
-        // tab strip (selected in center, others on left and right).
-
-        // Check the content and alignment of title strip for selected page #0
-        verifyTitleStripLayout(null, "Red", "Green", R.id.page_0);
-
-        // Scroll one page to select page #1 and check layout / content of title strip
-        onView(withId(R.id.pager)).perform(scrollRight(smoothScroll));
-        verifyTitleStripLayout("Red", "Green", "Blue", R.id.page_1);
-
-        // Scroll one page to select page #2 and check layout / content of title strip
-        onView(withId(R.id.pager)).perform(scrollRight(smoothScroll));
-        verifyTitleStripLayout("Green", "Blue", "Yellow", R.id.page_2);
-
-        // Scroll one page to select page #3 and check layout / content of title strip
-        onView(withId(R.id.pager)).perform(scrollRight(smoothScroll));
-        verifyTitleStripLayout("Blue", "Yellow", "Magenta", R.id.page_3);
-
-        // Scroll one page to select page #4 and check layout / content of title strip
-        onView(withId(R.id.pager)).perform(scrollRight(smoothScroll));
-        verifyTitleStripLayout("Yellow", "Magenta", null, R.id.page_4);
-
-        // Scroll back to page #0
-        onView(withId(R.id.pager)).perform(scrollToPage(0, smoothScroll));
-
-        assertStripInteraction(smoothScroll);
-    }
-
-    @Test
-    @SmallTest
-    public void testPagerStripImmediate() {
-        verifyPagerStrip(false);
-    }
-
-    @Test
-    @SmallTest
-    public void testPagerStripSmooth() {
-        verifyPagerStrip(true);
-    }
-
-    /**
-     * Returns the class of the pager strip.
-     */
-    protected abstract Class getStripClass();
-
-    /**
-     * Checks assertions that are specific to the pager strip implementation (interactive or
-     * non interactive).
-     */
-    protected abstract void assertStripInteraction(boolean smoothScroll);
-
-    /**
-     * Helper method that performs the specified action on the <code>ViewPager</code> and then
-     * checks the sequence of calls to the page change listener based on the specified expected
-     * scroll state changes.
-     *
-     * If that expected list is empty, this method verifies that there were no calls to
-     * onPageScrollStateChanged when the action was performed. Otherwise it verifies that the actual
-     * sequence of calls to onPageScrollStateChanged matches the expected (specified) one.
-     */
-    private void verifyScrollStateChange(ViewAction viewAction, int... expectedScrollStateChanges) {
-        ViewPager.OnPageChangeListener mockPageChangeListener =
-                mock(ViewPager.OnPageChangeListener.class);
-        mViewPager.addOnPageChangeListener(mockPageChangeListener);
-
-        // Perform our action
-        onView(withId(R.id.pager)).perform(viewAction);
-
-        int expectedScrollStateChangeCount = (expectedScrollStateChanges != null) ?
-                expectedScrollStateChanges.length : 0;
-
-        if (expectedScrollStateChangeCount == 0) {
-            verify(mockPageChangeListener, never()).onPageScrollStateChanged(anyInt());
-        } else {
-            ArgumentCaptor<Integer> pageScrollStateCaptor = ArgumentCaptor.forClass(int.class);
-            verify(mockPageChangeListener, times(expectedScrollStateChangeCount)).
-                    onPageScrollStateChanged(pageScrollStateCaptor.capture());
-            assertThat(pageScrollStateCaptor.getAllValues(),
-                    TestUtilsMatchers.matches(expectedScrollStateChanges));
-        }
-
-        // Remove our mock listener to get back to clean state for the next test
-        mViewPager.removeOnPageChangeListener(mockPageChangeListener);
-    }
-
-    @Test
-    @SmallTest
-    public void testPageScrollStateChangedImmediate() {
-        // Note that all the actions tested in this method are immediate (no scrolling) and
-        // as such we test that we do not get any calls to onPageScrollStateChanged in any of them
-
-        // Select one page to the right
-        verifyScrollStateChange(scrollRight(false));
-        // Select one more page to the right
-        verifyScrollStateChange(scrollRight(false));
-        // Select one page to the left
-        verifyScrollStateChange(scrollLeft(false));
-        // Select one more page to the left
-        verifyScrollStateChange(scrollLeft(false));
-        // Select last page
-        verifyScrollStateChange(scrollToLast(false));
-        // Select first page
-        verifyScrollStateChange(scrollToFirst(false));
-    }
-
-    @Test
-    @MediumTest
-    public void testPageScrollStateChangedSmooth() {
-        // Note that all the actions tested in this method use smooth scrolling and as such we test
-        // that we get the matching calls to onPageScrollStateChanged
-        final int[] expectedScrollStateChanges = new int[] {
-                ViewPager.SCROLL_STATE_SETTLING, ViewPager.SCROLL_STATE_IDLE
-        };
-
-        // Select one page to the right
-        verifyScrollStateChange(scrollRight(true), expectedScrollStateChanges);
-        // Select one more page to the right
-        verifyScrollStateChange(scrollRight(true), expectedScrollStateChanges);
-        // Select one page to the left
-        verifyScrollStateChange(scrollLeft(true), expectedScrollStateChanges);
-        // Select one more page to the left
-        verifyScrollStateChange(scrollLeft(true), expectedScrollStateChanges);
-        // Select last page
-        verifyScrollStateChange(scrollToLast(true), expectedScrollStateChanges);
-        // Select first page
-        verifyScrollStateChange(scrollToFirst(true), expectedScrollStateChanges);
-    }
-
-    @Test
-    @MediumTest
-    public void testPageScrollStateChangedSwipe() {
-        // Note that all the actions tested in this method use swiping and as such we test
-        // that we get the matching calls to onPageScrollStateChanged
-        final int[] expectedScrollStateChanges = new int[] { ViewPager.SCROLL_STATE_DRAGGING,
-                ViewPager.SCROLL_STATE_SETTLING, ViewPager.SCROLL_STATE_IDLE };
-
-        // Swipe one page to the left
-        verifyScrollStateChange(wrap(swipeLeft()), expectedScrollStateChanges);
-        assertEquals("Swipe left", 1, mViewPager.getCurrentItem());
-
-        // Swipe one more page to the left
-        verifyScrollStateChange(wrap(swipeLeft()), expectedScrollStateChanges);
-        assertEquals("Swipe left", 2, mViewPager.getCurrentItem());
-
-        // Swipe one page to the right
-        verifyScrollStateChange(wrap(swipeRight()), expectedScrollStateChanges);
-        assertEquals("Swipe right", 1, mViewPager.getCurrentItem());
-
-        // Swipe one more page to the right
-        verifyScrollStateChange(wrap(swipeRight()), expectedScrollStateChanges);
-        assertEquals("Swipe right", 0, mViewPager.getCurrentItem());
-    }
-
-    /**
-     * Helper method to verify the internal consistency of values passed to
-     * {@link ViewPager.OnPageChangeListener#onPageScrolled} callback when we go from a page with
-     * lower index to a page with higher index.
-     *
-     * @param startPageIndex Index of the starting page.
-     * @param endPageIndex Index of the ending page.
-     * @param pageWidth Page width in pixels.
-     * @param positions List of "position" values passed to all
-     *      {@link ViewPager.OnPageChangeListener#onPageScrolled} calls.
-     * @param positionOffsets List of "positionOffset" values passed to all
-     *      {@link ViewPager.OnPageChangeListener#onPageScrolled} calls.
-     * @param positionOffsetPixels List of "positionOffsetPixel" values passed to all
-     *      {@link ViewPager.OnPageChangeListener#onPageScrolled} calls.
-     */
-    private void verifyScrollCallbacksToHigherPage(int startPageIndex, int endPageIndex,
-            int pageWidth, List<Integer> positions, List<Float> positionOffsets,
-            List<Integer> positionOffsetPixels) {
-        int callbackCount = positions.size();
-
-        // The last entry in all three lists must match the index of the end page
-        Assert.assertEquals("Position at last index",
-                endPageIndex, (int) positions.get(callbackCount - 1));
-        Assert.assertEquals("Position offset at last index",
-                0.0f, positionOffsets.get(callbackCount - 1), 0.0f);
-        Assert.assertEquals("Position offset pixel at last index",
-                0, (int) positionOffsetPixels.get(callbackCount - 1));
-
-        // If this was our only callback, return. This can happen on immediate page change
-        // or on very slow devices.
-        if (callbackCount == 1) {
-            return;
-        }
-
-        // If we have additional callbacks, verify that the values provided to our callback reflect
-        // a valid sequence of events going from startPageIndex to endPageIndex.
-        for (int i = 0; i < callbackCount - 1; i++) {
-            // Page position must be between start page and end page
-            int pagePositionCurr = positions.get(i);
-            if ((pagePositionCurr < startPageIndex) || (pagePositionCurr > endPageIndex)) {
-                Assert.fail("Position at #" + i + " is " + pagePositionCurr +
-                        ", but should be between " + startPageIndex + " and " + endPageIndex);
-            }
-
-            // Page position sequence cannot be decreasing
-            int pagePositionNext = positions.get(i + 1);
-            if (pagePositionCurr > pagePositionNext) {
-                Assert.fail("Position at #" + i + " is " + pagePositionCurr +
-                        " and then decreases to " + pagePositionNext + " at #" + (i + 1));
-            }
-
-            // Position offset must be in [0..1) range (inclusive / exclusive)
-            float positionOffsetCurr = positionOffsets.get(i);
-            if ((positionOffsetCurr < 0.0f) || (positionOffsetCurr >= 1.0f)) {
-                Assert.fail("Position offset at #" + i + " is " + positionOffsetCurr +
-                        ", but should be in [0..1) range");
-            }
-
-            // Position pixel offset must be in [0..pageWidth) range (inclusive / exclusive)
-            int positionOffsetPixelCurr = positionOffsetPixels.get(i);
-            if ((positionOffsetPixelCurr < 0.0f) || (positionOffsetPixelCurr >= pageWidth)) {
-                Assert.fail("Position pixel offset at #" + i + " is " + positionOffsetCurr +
-                        ", but should be in [0.." + pageWidth + ") range");
-            }
-
-            // Position pixel offset must match the position offset and page width within
-            // a one-pixel tolerance range
-            Assert.assertEquals("Position pixel offset at #" + i + " is " +
-                    positionOffsetPixelCurr + ", but doesn't match position offset which is" +
-                    positionOffsetCurr + " and page width which is " + pageWidth,
-                    positionOffsetPixelCurr, positionOffsetCurr * pageWidth, 1.0f);
-
-            // If we stay on the same page between this index and the next one, both position
-            // offset and position pixel offset must increase
-            if (pagePositionNext == pagePositionCurr) {
-                float positionOffsetNext = positionOffsets.get(i + 1);
-                // Note that since position offset sequence is float, we are checking for strict
-                // increasing
-                if (positionOffsetNext <= positionOffsetCurr) {
-                    Assert.fail("Position offset at #" + i + " is " + positionOffsetCurr +
-                            " and at #" + (i + 1) + " is " + positionOffsetNext +
-                            ". Since both are for page " + pagePositionCurr +
-                            ", they cannot decrease");
-                }
-
-                int positionOffsetPixelNext = positionOffsetPixels.get(i + 1);
-                // Note that since position offset pixel sequence is the mapping of position offset
-                // into screen pixels, we can get two (or more) callbacks with strictly increasing
-                // position offsets that are converted into the same pixel value. This is why here
-                // we are checking for non-strict increasing
-                if (positionOffsetPixelNext < positionOffsetPixelCurr) {
-                    Assert.fail("Position offset pixel at #" + i + " is " +
-                            positionOffsetPixelCurr + " and at #" + (i + 1) + " is " +
-                            positionOffsetPixelNext + ". Since both are for page " +
-                            pagePositionCurr + ", they cannot decrease");
-                }
-            }
-        }
-    }
-
-    /**
-     * Helper method to verify the internal consistency of values passed to
-     * {@link ViewPager.OnPageChangeListener#onPageScrolled} callback when we go from a page with
-     * higher index to a page with lower index.
-     *
-     * @param startPageIndex Index of the starting page.
-     * @param endPageIndex Index of the ending page.
-     * @param pageWidth Page width in pixels.
-     * @param positions List of "position" values passed to all
-     *      {@link ViewPager.OnPageChangeListener#onPageScrolled} calls.
-     * @param positionOffsets List of "positionOffset" values passed to all
-     *      {@link ViewPager.OnPageChangeListener#onPageScrolled} calls.
-     * @param positionOffsetPixels List of "positionOffsetPixel" values passed to all
-     *      {@link ViewPager.OnPageChangeListener#onPageScrolled} calls.
-     */
-    private void verifyScrollCallbacksToLowerPage(int startPageIndex, int endPageIndex,
-            int pageWidth, List<Integer> positions, List<Float> positionOffsets,
-            List<Integer> positionOffsetPixels) {
-        int callbackCount = positions.size();
-
-        // The last entry in all three lists must match the index of the end page
-        Assert.assertEquals("Position at last index",
-                endPageIndex, (int) positions.get(callbackCount - 1));
-        Assert.assertEquals("Position offset at last index",
-                0.0f, positionOffsets.get(callbackCount - 1), 0.0f);
-        Assert.assertEquals("Position offset pixel at last index",
-                0, (int) positionOffsetPixels.get(callbackCount - 1));
-
-        // If this was our only callback, return. This can happen on immediate page change
-        // or on very slow devices.
-        if (callbackCount == 1) {
-            return;
-        }
-
-        // If we have additional callbacks, verify that the values provided to our callback reflect
-        // a valid sequence of events going from startPageIndex to endPageIndex.
-        for (int i = 0; i < callbackCount - 1; i++) {
-            // Page position must be between start page and end page
-            int pagePositionCurr = positions.get(i);
-            if ((pagePositionCurr > startPageIndex) || (pagePositionCurr < endPageIndex)) {
-                Assert.fail("Position at #" + i + " is " + pagePositionCurr +
-                        ", but should be between " + endPageIndex + " and " + startPageIndex);
-            }
-
-            // Page position sequence cannot be increasing
-            int pagePositionNext = positions.get(i + 1);
-            if (pagePositionCurr < pagePositionNext) {
-                Assert.fail("Position at #" + i + " is " + pagePositionCurr +
-                        " and then increases to " + pagePositionNext + " at #" + (i + 1));
-            }
-
-            // Position offset must be in [0..1) range (inclusive / exclusive)
-            float positionOffsetCurr = positionOffsets.get(i);
-            if ((positionOffsetCurr < 0.0f) || (positionOffsetCurr >= 1.0f)) {
-                Assert.fail("Position offset at #" + i + " is " + positionOffsetCurr +
-                        ", but should be in [0..1) range");
-            }
-
-            // Position pixel offset must be in [0..pageWidth) range (inclusive / exclusive)
-            int positionOffsetPixelCurr = positionOffsetPixels.get(i);
-            if ((positionOffsetPixelCurr < 0.0f) || (positionOffsetPixelCurr >= pageWidth)) {
-                Assert.fail("Position pixel offset at #" + i + " is " + positionOffsetCurr +
-                        ", but should be in [0.." + pageWidth + ") range");
-            }
-
-            // Position pixel offset must match the position offset and page width within
-            // a one-pixel tolerance range
-            Assert.assertEquals("Position pixel offset at #" + i + " is " +
-                            positionOffsetPixelCurr + ", but doesn't match position offset which is" +
-                            positionOffsetCurr + " and page width which is " + pageWidth,
-                    positionOffsetPixelCurr, positionOffsetCurr * pageWidth, 1.0f);
-
-            // If we stay on the same page between this index and the next one, both position
-            // offset and position pixel offset must decrease
-            if (pagePositionNext == pagePositionCurr) {
-                float positionOffsetNext = positionOffsets.get(i + 1);
-                // Note that since position offset sequence is float, we are checking for strict
-                // decreasing
-                if (positionOffsetNext >= positionOffsetCurr) {
-                    Assert.fail("Position offset at #" + i + " is " + positionOffsetCurr +
-                            " and at #" + (i + 1) + " is " + positionOffsetNext +
-                            ". Since both are for page " + pagePositionCurr +
-                            ", they cannot increase");
-                }
-
-                int positionOffsetPixelNext = positionOffsetPixels.get(i + 1);
-                // Note that since position offset pixel sequence is the mapping of position offset
-                // into screen pixels, we can get two (or more) callbacks with strictly decreasing
-                // position offsets that are converted into the same pixel value. This is why here
-                // we are checking for non-strict decreasing
-                if (positionOffsetPixelNext > positionOffsetPixelCurr) {
-                    Assert.fail("Position offset pixel at #" + i + " is " +
-                            positionOffsetPixelCurr + " and at #" + (i + 1) + " is " +
-                            positionOffsetPixelNext + ". Since both are for page " +
-                            pagePositionCurr + ", they cannot increase");
-                }
-            }
-        }
-    }
-
-    private void verifyScrollCallbacksToHigherPage(ViewAction viewAction,
-            int expectedEndPageIndex) {
-        final int startPageIndex = mViewPager.getCurrentItem();
-
-        ViewPager.OnPageChangeListener mockPageChangeListener =
-                mock(ViewPager.OnPageChangeListener.class);
-        mViewPager.addOnPageChangeListener(mockPageChangeListener);
-
-        // Perform our action
-        onView(withId(R.id.pager)).perform(viewAction);
-
-        final int endPageIndex = mViewPager.getCurrentItem();
-        Assert.assertEquals("Current item after action", expectedEndPageIndex, endPageIndex);
-
-        ArgumentCaptor<Integer> positionCaptor = ArgumentCaptor.forClass(int.class);
-        ArgumentCaptor<Float> positionOffsetCaptor = ArgumentCaptor.forClass(float.class);
-        ArgumentCaptor<Integer> positionOffsetPixelsCaptor = ArgumentCaptor.forClass(int.class);
-        verify(mockPageChangeListener, atLeastOnce()).onPageScrolled(positionCaptor.capture(),
-                positionOffsetCaptor.capture(), positionOffsetPixelsCaptor.capture());
-
-        verifyScrollCallbacksToHigherPage(startPageIndex, endPageIndex, mViewPager.getWidth(),
-                positionCaptor.getAllValues(), positionOffsetCaptor.getAllValues(),
-                positionOffsetPixelsCaptor.getAllValues());
-
-        // Remove our mock listener to get back to clean state for the next test
-        mViewPager.removeOnPageChangeListener(mockPageChangeListener);
-    }
-
-    private void verifyScrollCallbacksToLowerPage(ViewAction viewAction,
-            int expectedEndPageIndex) {
-        final int startPageIndex = mViewPager.getCurrentItem();
-
-        ViewPager.OnPageChangeListener mockPageChangeListener =
-                mock(ViewPager.OnPageChangeListener.class);
-        mViewPager.addOnPageChangeListener(mockPageChangeListener);
-
-        // Perform our action
-        onView(withId(R.id.pager)).perform(viewAction);
-
-        final int endPageIndex = mViewPager.getCurrentItem();
-        Assert.assertEquals("Current item after action", expectedEndPageIndex, endPageIndex);
-
-        ArgumentCaptor<Integer> positionCaptor = ArgumentCaptor.forClass(int.class);
-        ArgumentCaptor<Float> positionOffsetCaptor = ArgumentCaptor.forClass(float.class);
-        ArgumentCaptor<Integer> positionOffsetPixelsCaptor = ArgumentCaptor.forClass(int.class);
-        verify(mockPageChangeListener, atLeastOnce()).onPageScrolled(positionCaptor.capture(),
-                positionOffsetCaptor.capture(), positionOffsetPixelsCaptor.capture());
-
-        verifyScrollCallbacksToLowerPage(startPageIndex, endPageIndex, mViewPager.getWidth(),
-                positionCaptor.getAllValues(), positionOffsetCaptor.getAllValues(),
-                positionOffsetPixelsCaptor.getAllValues());
-
-        // Remove our mock listener to get back to clean state for the next test
-        mViewPager.removeOnPageChangeListener(mockPageChangeListener);
-    }
-
-    @Test
-    @SmallTest
-    public void testPageScrollPositionChangesImmediate() {
-        // Scroll one page to the right
-        verifyScrollCallbacksToHigherPage(scrollRight(false), 1);
-        // Scroll one more page to the right
-        verifyScrollCallbacksToHigherPage(scrollRight(false), 2);
-        // Scroll one page to the left
-        verifyScrollCallbacksToLowerPage(scrollLeft(false), 1);
-        // Scroll one more page to the left
-        verifyScrollCallbacksToLowerPage(scrollLeft(false), 0);
-
-        // Scroll to the last page
-        verifyScrollCallbacksToHigherPage(scrollToLast(false), 2);
-        // Scroll to the first page
-        verifyScrollCallbacksToLowerPage(scrollToFirst(false), 0);
-    }
-
-    @Test
-    @MediumTest
-    public void testPageScrollPositionChangesSmooth() {
-        // Scroll one page to the right
-        verifyScrollCallbacksToHigherPage(scrollRight(true), 1);
-        // Scroll one more page to the right
-        verifyScrollCallbacksToHigherPage(scrollRight(true), 2);
-        // Scroll one page to the left
-        verifyScrollCallbacksToLowerPage(scrollLeft(true), 1);
-        // Scroll one more page to the left
-        verifyScrollCallbacksToLowerPage(scrollLeft(true), 0);
-
-        // Scroll to the last page
-        verifyScrollCallbacksToHigherPage(scrollToLast(true), 2);
-        // Scroll to the first page
-        verifyScrollCallbacksToLowerPage(scrollToFirst(true), 0);
-    }
-
-    @Test
-    @MediumTest
-    public void testPageScrollPositionChangesSwipe() {
-        // Swipe one page to the left
-        verifyScrollCallbacksToHigherPage(wrap(swipeLeft()), 1);
-        // Swipe one more page to the left
-        verifyScrollCallbacksToHigherPage(wrap(swipeLeft()), 2);
-        // Swipe one page to the right
-        verifyScrollCallbacksToLowerPage(wrap(swipeRight()), 1);
-        // Swipe one more page to the right
-        verifyScrollCallbacksToLowerPage(wrap(swipeRight()), 0);
-    }
-}
diff --git a/v4/tests/java/android/support/v4/view/ViewPagerWithTabStripActivity.java b/v4/tests/java/android/support/v4/view/ViewPagerWithTabStripActivity.java
deleted file mode 100644
index 2cb3048..0000000
--- a/v4/tests/java/android/support/v4/view/ViewPagerWithTabStripActivity.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.v4.view;
-
-import android.app.Activity;
-import android.os.Bundle;
-import android.support.v4.test.R;
-import android.view.WindowManager;
-
-public class ViewPagerWithTabStripActivity extends Activity {
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
-        setContentView(R.layout.view_pager_with_tab_strip);
-    }
-}
diff --git a/v4/tests/java/android/support/v4/view/ViewPagerWithTabStripTest.java b/v4/tests/java/android/support/v4/view/ViewPagerWithTabStripTest.java
deleted file mode 100644
index 91d1e06..0000000
--- a/v4/tests/java/android/support/v4/view/ViewPagerWithTabStripTest.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.v4.view;
-
-import android.support.v4.test.R;
-
-import static android.support.test.espresso.Espresso.onView;
-import static android.support.test.espresso.action.ViewActions.click;
-import static android.support.test.espresso.matcher.ViewMatchers.isDescendantOfA;
-import static android.support.test.espresso.matcher.ViewMatchers.withId;
-import static android.support.test.espresso.matcher.ViewMatchers.withText;
-import static android.support.v4.view.ViewPagerActions.clickBetweenTwoTitles;
-import static android.support.v4.view.ViewPagerActions.scrollRight;
-import static android.support.v4.view.ViewPagerActions.scrollToPage;
-import static org.hamcrest.Matchers.allOf;
-import static org.junit.Assert.assertEquals;
-
-/**
- * Provides assertions that depend on the interactive nature of <code>PagerTabStrip</code>.
- */
-public class ViewPagerWithTabStripTest extends BaseViewPagerTest<ViewPagerWithTabStripActivity> {
-    public ViewPagerWithTabStripTest() {
-        super(ViewPagerWithTabStripActivity.class);
-    }
-
-    @Override
-    protected Class getStripClass() {
-        return PagerTabStrip.class;
-    }
-
-    @Override
-    protected void assertStripInteraction(boolean smoothScroll) {
-        // The following block tests that ViewPager page selection changes on clicking titles of
-        // various tabs as PagerTabStrip is interactive
-
-        // Click the tab title for page #0 and verify that we're still on page #0
-        onView(allOf(isDescendantOfA(withId(R.id.titles)), withText("Red"))).perform(click());
-        assertEquals("Click tab #0 on tab #0", 0, mViewPager.getCurrentItem());
-
-        // Click the tab title for page #1 and verify that we're on page #1
-        onView(allOf(isDescendantOfA(withId(R.id.titles)), withText("Green"))).perform(click());
-        assertEquals("Click tab #1 on tab #0", 1, mViewPager.getCurrentItem());
-
-        // Click the tab title for page #0 and verify that we're on page #0
-        onView(allOf(isDescendantOfA(withId(R.id.titles)), withText("Red"))).perform(click());
-        assertEquals("Click tab #0 on tab #1", 0, mViewPager.getCurrentItem());
-
-        // Go back to page #1
-        onView(withId(R.id.pager)).perform(scrollRight(smoothScroll));
-
-        // Click the tab title for page #1 and verify that we're still on page #1
-        onView(allOf(isDescendantOfA(withId(R.id.titles)), withText("Green"))).perform(click());
-        assertEquals("Click tab #1 on tab #1", 1, mViewPager.getCurrentItem());
-
-        // Click the tab title for page #2 and verify that we're on page #2
-        onView(allOf(isDescendantOfA(withId(R.id.titles)), withText("Blue"))).perform(click());
-        assertEquals("Click tab #2 on tab #1", 2, mViewPager.getCurrentItem());
-
-        // The following block tests that ViewPager page selection changes on clicking in
-        // between titles of tabs as that functionality is exposed by PagerTabStrip
-
-        // Scroll back to page #0
-        onView(withId(R.id.pager)).perform(scrollToPage(0, smoothScroll));
-
-        // Click between titles of page #0 and page #1 and verify that we're on page #1
-        onView(withId(R.id.titles)).perform(clickBetweenTwoTitles("Red", "Green"));
-        assertEquals("Click in between tabs #0 and #1 on tab #0", 1, mViewPager.getCurrentItem());
-
-        // Click between titles of page #0 and page #1 and verify that we're on page #0
-        onView(withId(R.id.titles)).perform(clickBetweenTwoTitles("Red", "Green"));
-        assertEquals("Click in between tabs #0 and #1 on tab #1", 0, mViewPager.getCurrentItem());
-
-        // Go back to page #1
-        onView(withId(R.id.pager)).perform(scrollRight(smoothScroll));
-
-        // Click between titles of page #1 and page #2 and verify that we're on page #2
-        onView(withId(R.id.titles)).perform(clickBetweenTwoTitles("Green", "Blue"));
-        assertEquals("Click in between tabs #1 and #2 on tab #1", 2, mViewPager.getCurrentItem());
-    }
-}
diff --git a/v4/tests/java/android/support/v4/view/ViewPagerWithTitleStripActivity.java b/v4/tests/java/android/support/v4/view/ViewPagerWithTitleStripActivity.java
deleted file mode 100644
index 49d6e76..0000000
--- a/v4/tests/java/android/support/v4/view/ViewPagerWithTitleStripActivity.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.v4.view;
-
-import android.app.Activity;
-import android.os.Bundle;
-import android.support.v4.test.R;
-import android.view.WindowManager;
-
-public class ViewPagerWithTitleStripActivity extends Activity {
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
-        setContentView(R.layout.view_pager_with_title_strip);
-    }
-}
diff --git a/v4/tests/java/android/support/v4/view/ViewPagerWithTitleStripTest.java b/v4/tests/java/android/support/v4/view/ViewPagerWithTitleStripTest.java
deleted file mode 100644
index ec7c35c..0000000
--- a/v4/tests/java/android/support/v4/view/ViewPagerWithTitleStripTest.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.v4.view;
-
-import android.support.v4.test.R;
-
-import static android.support.test.espresso.Espresso.onView;
-import static android.support.test.espresso.action.ViewActions.click;
-import static android.support.test.espresso.matcher.ViewMatchers.isDescendantOfA;
-import static android.support.test.espresso.matcher.ViewMatchers.withId;
-import static android.support.test.espresso.matcher.ViewMatchers.withText;
-import static android.support.v4.view.ViewPagerActions.clickBetweenTwoTitles;
-import static android.support.v4.view.ViewPagerActions.scrollRight;
-import static android.support.v4.view.ViewPagerActions.scrollToPage;
-import static org.hamcrest.Matchers.allOf;
-import static org.junit.Assert.assertEquals;
-
-/**
- * Provides assertions that depend on the non-interactive nature of <code>PagerTabStrip</code>.
- */
-public class ViewPagerWithTitleStripTest
-        extends BaseViewPagerTest<ViewPagerWithTitleStripActivity> {
-    public ViewPagerWithTitleStripTest() {
-        super(ViewPagerWithTitleStripActivity.class);
-    }
-
-    @Override
-    protected Class getStripClass() {
-        return PagerTitleStrip.class;
-    }
-
-    @Override
-    protected void assertStripInteraction(boolean smoothScroll) {
-        // The following block tests that nothing happens on clicking titles of various tabs
-        // as PagerTitleStrip is not interactive
-
-        // Click the tab title for page #0 and verify that we're still on page #0
-        onView(allOf(isDescendantOfA(withId(R.id.titles)), withText("Red"))).perform(click());
-        assertEquals("Click tab #0 on tab #0", 0, mViewPager.getCurrentItem());
-
-        // Click the tab title for page #1 and verify that we're still on page #0
-        onView(allOf(isDescendantOfA(withId(R.id.titles)), withText("Green"))).perform(click());
-        assertEquals("Click tab #1 on tab #0", 0, mViewPager.getCurrentItem());
-
-        onView(withId(R.id.pager)).perform(scrollRight(smoothScroll));
-
-        // Click the tab title for page #0 and verify that we're still on page #1
-        onView(allOf(isDescendantOfA(withId(R.id.titles)), withText("Red"))).perform(click());
-        assertEquals("Click tab #0 on tab #1", 1, mViewPager.getCurrentItem());
-
-        // Click the tab title for page #1 and verify that we're still on page #1
-        onView(allOf(isDescendantOfA(withId(R.id.titles)), withText("Green"))).perform(click());
-        assertEquals("Click tab #1 on tab #1", 1, mViewPager.getCurrentItem());
-
-        // Click the tab title for page #2 and verify that we're still on page #1
-        onView(allOf(isDescendantOfA(withId(R.id.titles)), withText("Blue"))).perform(click());
-        assertEquals("Click tab #2 on tab #1", 1, mViewPager.getCurrentItem());
-
-
-        // The following block tests that nothing happens on clicking in between titles of various
-        // tabs as PagerTitleStrip is not interactive
-
-        // Scroll back to page #0
-        onView(withId(R.id.pager)).perform(scrollToPage(0, smoothScroll));
-
-        // Click between titles of page #0 and page #1 and verify that we're still on page #0
-        onView(withId(R.id.titles)).perform(clickBetweenTwoTitles("Red", "Green"));
-        assertEquals("Click in between tabs #0 and #1 on tab #0", 0, mViewPager.getCurrentItem());
-
-        // Go to page #1
-        onView(withId(R.id.pager)).perform(scrollRight(smoothScroll));
-
-        // Click between titles of page #1 and page #2 and verify that we're still on page #1
-        onView(withId(R.id.titles)).perform(clickBetweenTwoTitles("Green", "Blue"));
-        assertEquals("Click in between tabs #1 and #2 on tab #1", 1, mViewPager.getCurrentItem());
-
-        // Click between titles of page #0 and page #1 and verify that we're still on page #1
-        onView(withId(R.id.titles)).perform(clickBetweenTwoTitles("Red", "Green"));
-        assertEquals("Click in between tabs #0 and #1 on tab #1", 1, mViewPager.getCurrentItem());
-    }
-}
diff --git a/v4/tests/java/android/support/v4/view/ViewPropertyAnimatorCompatTest.java b/v4/tests/java/android/support/v4/view/ViewPropertyAnimatorCompatTest.java
deleted file mode 100644
index 84be6ec..0000000
--- a/v4/tests/java/android/support/v4/view/ViewPropertyAnimatorCompatTest.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Copyright (C) 2016 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 android.support.v4.view;
-
-import android.app.Activity;
-import android.support.test.InstrumentationRegistry;
-import android.support.v4.BaseInstrumentationTestCase;
-import android.support.v4.test.R;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.view.View;
-
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-
-import org.junit.Before;
-import org.junit.Test;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-@MediumTest
-public class ViewPropertyAnimatorCompatTest extends BaseInstrumentationTestCase<VpaActivity> {
-
-    private static final int WAIT_TIMEOUT_MS = 200;
-
-    private View mView;
-    private int mNumListenerCalls = 0;
-
-    public ViewPropertyAnimatorCompatTest() {
-        super(VpaActivity.class);
-    }
-
-    @Before
-    public void setUp() {
-        final Activity activity = mActivityTestRule.getActivity();
-        mView = activity.findViewById(R.id.view);
-    }
-
-    @Test
-    public void testWithEndAction() throws Throwable {
-        final CountDownLatch latch1 = new CountDownLatch(1);
-        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
-            @Override
-            public void run() {
-                ViewCompat.animate(mView).alpha(0).setDuration(100).withEndAction(new Runnable() {
-                    @Override
-                    public void run() {
-                        latch1.countDown();
-                    }
-                });
-            }
-        });
-        assertTrue(latch1.await(300, TimeUnit.MILLISECONDS));
-
-        // This test ensures that the endAction listener will be called exactly once
-        mNumListenerCalls = 0;
-        final CountDownLatch latch2 = new CountDownLatch(1);
-        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
-            @Override
-            public void run() {
-                ViewCompat.animate(mView).alpha(0).setDuration(50).withEndAction(new Runnable() {
-                    @Override
-                    public void run() {
-                        ++mNumListenerCalls;
-                        ViewCompat.animate(mView).alpha(1);
-                        latch2.countDown();
-                    }
-                });
-            }
-        });
-        assertTrue(latch2.await(200, TimeUnit.MILLISECONDS));
-        waitAndCheckCallCount(1);
-    }
-
-    @Test
-    public void testWithStartAction() throws Throwable {
-        final CountDownLatch latch1 = new CountDownLatch(1);
-        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
-            @Override
-            public void run() {
-                ViewCompat.animate(mView).alpha(0).setDuration(100).withStartAction(new Runnable() {
-                    @Override
-                    public void run() {
-                        latch1.countDown();
-                    }
-                });
-            }
-        });
-        assertTrue(latch1.await(100, TimeUnit.MILLISECONDS));
-
-        // This test ensures that the startAction listener will be called exactly once
-        mNumListenerCalls = 0;
-        final CountDownLatch latch2 = new CountDownLatch(1);
-        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
-            @Override
-            public void run() {
-                ViewCompat.animate(mView).alpha(0).setDuration(50).withStartAction(new Runnable() {
-                    @Override
-                    public void run() {
-                        ++mNumListenerCalls;
-                        ViewCompat.animate(mView).alpha(1);
-                        latch2.countDown();
-                    }
-                });
-            }
-        });
-        assertTrue(latch2.await(200, TimeUnit.MILLISECONDS));
-        waitAndCheckCallCount(1);
-    }
-
-    void waitAndCheckCallCount(final int count) throws InterruptedException {
-        int timeLeft = WAIT_TIMEOUT_MS;
-        while (mNumListenerCalls != count) {
-            Thread.sleep(20);
-            timeLeft -= 20;
-            assertTrue(timeLeft > 0);
-        }
-    }
-}
diff --git a/v4/tests/java/android/support/v4/view/VpaActivity.java b/v4/tests/java/android/support/v4/view/VpaActivity.java
deleted file mode 100644
index 64d698a..0000000
--- a/v4/tests/java/android/support/v4/view/VpaActivity.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2016 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 android.support.v4.view;
-
-import android.support.v4.BaseTestActivity;
-import android.support.v4.test.R;
-
-public class VpaActivity extends BaseTestActivity {
-    @Override
-    protected int getContentViewLayoutResId() {
-        return R.layout.vpa_activity;
-    }
-}
diff --git a/v4/tests/java/android/support/v4/widget/DonutScrollerCompatTest.java b/v4/tests/java/android/support/v4/widget/DonutScrollerCompatTest.java
deleted file mode 100644
index db4a497..0000000
--- a/v4/tests/java/android/support/v4/widget/DonutScrollerCompatTest.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (C) 2014 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 android.support.v4.widget;
-
-public class DonutScrollerCompatTest extends ScrollerCompatTestBase {
-    public DonutScrollerCompatTest() {
-        super(4);
-    }
-}
diff --git a/v4/tests/java/android/support/v4/widget/ExploreByTouchHelperTest.java b/v4/tests/java/android/support/v4/widget/ExploreByTouchHelperTest.java
deleted file mode 100644
index 1319f2c..0000000
--- a/v4/tests/java/android/support/v4/widget/ExploreByTouchHelperTest.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * Copyright (C) 2016 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 android.support.v4.widget;
-
-import org.junit.Before;
-import org.junit.Test;
-
-import android.graphics.Rect;
-import android.os.Build;
-import android.os.Bundle;
-import android.support.test.annotation.UiThreadTest;
-import android.support.v4.BaseInstrumentationTestCase;
-import android.support.v4.test.R;
-import android.support.v4.view.ViewCompat;
-import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat;
-import android.test.suitebuilder.annotation.SmallTest;
-import android.view.View;
-
-import java.util.List;
-
-import static junit.framework.Assert.assertFalse;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assume.assumeTrue;
-
-@SmallTest
-public class ExploreByTouchHelperTest extends BaseInstrumentationTestCase<ExploreByTouchHelperTestActivity> {
-    private View mHost;
-
-    public ExploreByTouchHelperTest() {
-        super(ExploreByTouchHelperTestActivity.class);
-    }
-
-    @Before
-    public void setUp() {
-        // Accessibility delegates are only supported on API 14+.
-        assumeTrue(Build.VERSION.SDK_INT >= 14);
-        mHost = mActivityTestRule.getActivity().findViewById(R.id.host_view);
-    }
-
-    @Test
-    @UiThreadTest
-    public void testBoundsInScreen() {
-        final ExploreByTouchHelper helper = new ParentBoundsHelper(mHost);
-        ViewCompat.setAccessibilityDelegate(mHost, helper);
-
-        final AccessibilityNodeInfoCompat node =
-                helper.getAccessibilityNodeProvider(mHost).createAccessibilityNodeInfo(1);
-        assertNotNull(node);
-
-        final Rect hostBounds = new Rect();
-        mHost.getLocalVisibleRect(hostBounds);
-        assertFalse("Host has not been laid out", hostBounds.isEmpty());
-
-        final Rect nodeBoundsInParent = new Rect();
-        node.getBoundsInParent(nodeBoundsInParent);
-        assertEquals("Wrong bounds in parent", hostBounds, nodeBoundsInParent);
-
-        final Rect hostBoundsOnScreen = getBoundsOnScreen(mHost);
-        final Rect nodeBoundsInScreen = new Rect();
-        node.getBoundsInScreen(nodeBoundsInScreen);
-        assertEquals("Wrong bounds in screen", hostBoundsOnScreen, nodeBoundsInScreen);
-
-        final int scrollX = 100;
-        final int scrollY = 50;
-        mHost.scrollTo(scrollX, scrollY);
-
-        // Generate a node for the new position.
-        final AccessibilityNodeInfoCompat scrolledNode =
-                helper.getAccessibilityNodeProvider(mHost).createAccessibilityNodeInfo(1);
-        assertNotNull(scrolledNode);
-
-        mHost.getLocalVisibleRect(hostBounds);
-        hostBounds.intersect(nodeBoundsInParent);
-        final Rect scrolledNodeBoundsInParent = new Rect();
-        scrolledNode.getBoundsInParent(scrolledNodeBoundsInParent);
-        assertEquals("Wrong bounds in parent after scrolling",
-                hostBounds, scrolledNodeBoundsInParent);
-
-        final Rect expectedBoundsInScreen = new Rect(hostBoundsOnScreen);
-        expectedBoundsInScreen.offset(-scrollX, -scrollY);
-        expectedBoundsInScreen.intersect(hostBoundsOnScreen);
-        scrolledNode.getBoundsInScreen(nodeBoundsInScreen);
-        assertEquals("Wrong bounds in screen after scrolling",
-                expectedBoundsInScreen, nodeBoundsInScreen);
-
-        ViewCompat.setAccessibilityDelegate(mHost, null);
-    }
-
-    private static Rect getBoundsOnScreen(View v) {
-        final int[] tempLocation = new int[2];
-        final Rect hostBoundsOnScreen = new Rect(0, 0, v.getWidth(), v.getHeight());
-        v.getLocationOnScreen(tempLocation);
-        hostBoundsOnScreen.offset(tempLocation[0], tempLocation[1]);
-        return hostBoundsOnScreen;
-    }
-
-    /**
-     * An extension of ExploreByTouchHelper that contains a single virtual view
-     * whose bounds match the host view.
-     */
-    private static class ParentBoundsHelper extends ExploreByTouchHelper {
-        private final View mHost;
-
-        public ParentBoundsHelper(View host) {
-            super(host);
-
-            mHost = host;
-        }
-
-        @Override
-        protected int getVirtualViewAt(float x, float y) {
-            return 1;
-        }
-
-        @Override
-        protected void getVisibleVirtualViews(List<Integer> virtualViewIds) {
-            virtualViewIds.add(1);
-        }
-
-        @Override
-        protected void onPopulateNodeForVirtualView(int virtualViewId, AccessibilityNodeInfoCompat node) {
-            if (virtualViewId == 1) {
-                node.setContentDescription("test");
-
-                final Rect hostBounds = new Rect(0, 0, mHost.getWidth(), mHost.getHeight());
-                node.setBoundsInParent(hostBounds);
-            }
-        }
-
-        @Override
-        protected boolean onPerformActionForVirtualView(int virtualViewId, int action, Bundle arguments) {
-            return false;
-        }
-    }
-}
diff --git a/v4/tests/java/android/support/v4/widget/ExploreByTouchHelperTestActivity.java b/v4/tests/java/android/support/v4/widget/ExploreByTouchHelperTestActivity.java
deleted file mode 100644
index 6d21879..0000000
--- a/v4/tests/java/android/support/v4/widget/ExploreByTouchHelperTestActivity.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2016 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 android.support.v4.widget;
-
-import android.support.v4.BaseTestActivity;
-import android.support.v4.test.R;
-
-public class ExploreByTouchHelperTestActivity extends BaseTestActivity {
-    @Override
-    protected int getContentViewLayoutResId() {
-        return R.layout.explore_by_touch_helper_activity;
-    }
-}
diff --git a/v4/tests/java/android/support/v4/widget/SwipeRefreshLayoutActivity.java b/v4/tests/java/android/support/v4/widget/SwipeRefreshLayoutActivity.java
deleted file mode 100644
index 6f30aa2..0000000
--- a/v4/tests/java/android/support/v4/widget/SwipeRefreshLayoutActivity.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2016 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 android.support.v4.widget;
-
-import android.support.v4.BaseTestActivity;
-import android.support.v4.test.R;
-
-public class SwipeRefreshLayoutActivity extends BaseTestActivity {
-    @Override
-    protected int getContentViewLayoutResId() {
-        return R.layout.swipe_refresh_layout_activity;
-    }
-}
diff --git a/v4/tests/java/android/support/v4/widget/SwipeRefreshLayoutTest.java b/v4/tests/java/android/support/v4/widget/SwipeRefreshLayoutTest.java
deleted file mode 100644
index fca1577..0000000
--- a/v4/tests/java/android/support/v4/widget/SwipeRefreshLayoutTest.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Copyright (C) 2016 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 android.support.v4.widget;
-
-import static android.support.test.espresso.Espresso.onView;
-import static android.support.test.espresso.matcher.ViewMatchers.withId;
-import static android.support.v4.widget.SwipeRefreshLayoutActions.setRefreshing;
-import static android.support.v4.widget.SwipeRefreshLayoutActions.setSize;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-import android.support.v4.BaseInstrumentationTestCase;
-import android.support.v4.test.R;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.test.suitebuilder.annotation.SmallTest;
-
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * Tests SwipeRefreshLayout widget.
- */
-public class SwipeRefreshLayoutTest
-        extends BaseInstrumentationTestCase<SwipeRefreshLayoutActivity> {
-
-    private SwipeRefreshLayout mSwipeRefresh;
-
-    public SwipeRefreshLayoutTest() {
-        super(SwipeRefreshLayoutActivity.class);
-    }
-
-    @Before
-    public void setUp() {
-        mSwipeRefresh = (SwipeRefreshLayout) mActivityTestRule.getActivity().findViewById(
-                R.id.swipe_refresh);
-    }
-
-    @Test
-    @MediumTest
-    public void testStartAndStopRefreshing() throws Throwable {
-        assertFalse(mSwipeRefresh.isRefreshing());
-        for (int i = 0; i < 5; i++) {
-            onView(withId(R.id.swipe_refresh)).perform(setRefreshing());
-            assertTrue(mSwipeRefresh.isRefreshing());
-
-            // onView(..).perform(..) does not work when views are animated.
-            // Therefore this is using a posted task to turn off refreshing.
-            mSwipeRefresh.getHandler().post(new Runnable() {
-                @Override
-                public void run() {
-                    mSwipeRefresh.setRefreshing(false);
-                }
-            });
-            long waitTime = 1000;
-            while (mSwipeRefresh.isRefreshing()) {
-                Thread.sleep(20);
-                waitTime -= 20;
-                assertTrue("Timed out while waiting for SwipeRefreshLayout to stop refreshing",
-                        waitTime > 0);
-            }
-        }
-    }
-
-    @Test
-    @SmallTest
-    public void testSetSize() throws Throwable {
-        float density = mSwipeRefresh.getResources().getDisplayMetrics().density;
-        assertEquals((int) (SwipeRefreshLayout.CIRCLE_DIAMETER * density),
-                mSwipeRefresh.getProgressCircleDiameter());
-        onView(withId(R.id.swipe_refresh)).perform(setSize(SwipeRefreshLayout.LARGE));
-        assertEquals((int) (SwipeRefreshLayout.CIRCLE_DIAMETER_LARGE * density),
-                mSwipeRefresh.getProgressCircleDiameter());
-        onView(withId(R.id.swipe_refresh)).perform(setSize(SwipeRefreshLayout.DEFAULT));
-        assertEquals((int) (SwipeRefreshLayout.CIRCLE_DIAMETER * density),
-                mSwipeRefresh.getProgressCircleDiameter());
-        onView(withId(R.id.swipe_refresh)).perform(setSize(SwipeRefreshLayout.DEFAULT));
-    }
-}
diff --git a/v4/tests/java/android/support/v4/widget/TextViewCompatTest.java b/v4/tests/java/android/support/v4/widget/TextViewCompatTest.java
deleted file mode 100644
index 3ef236f..0000000
--- a/v4/tests/java/android/support/v4/widget/TextViewCompatTest.java
+++ /dev/null
@@ -1,390 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.v4.widget;
-
-import android.content.res.Resources;
-import android.graphics.drawable.ColorDrawable;
-import android.graphics.drawable.Drawable;
-import android.support.annotation.ColorInt;
-import android.support.v4.BaseInstrumentationTestCase;
-import android.support.v4.test.R;
-import android.support.v4.testutils.TestUtils;
-import android.support.v4.view.ViewCompat;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.test.suitebuilder.annotation.SmallTest;
-import android.widget.TextView;
-import org.junit.Before;
-import org.junit.Test;
-
-import static android.support.test.espresso.Espresso.onView;
-import static android.support.test.espresso.matcher.ViewMatchers.withId;
-import static android.support.v4.testutils.LayoutDirectionActions.setLayoutDirection;
-import static android.support.v4.testutils.TextViewActions.*;
-import static org.junit.Assert.*;
-
-public class TextViewCompatTest extends BaseInstrumentationTestCase<TextViewTestActivity> {
-    private static final String TAG = "TextViewCompatTest";
-
-    private TextView mTextView;
-
-    private class TestDrawable extends ColorDrawable {
-        private int mWidth;
-        private int mHeight;
-
-        public TestDrawable(@ColorInt int color, int width, int height) {
-            super(color);
-            mWidth = width;
-            mHeight = height;
-        }
-
-        @Override
-        public int getIntrinsicWidth() {
-            return mWidth;
-        }
-
-        @Override
-        public int getIntrinsicHeight() {
-            return mHeight;
-        }
-    }
-
-    public TextViewCompatTest() {
-        super(TextViewTestActivity.class);
-    }
-
-    @Before
-    public void setUp() {
-        mTextView = (TextView) mActivityTestRule.getActivity().findViewById(R.id.text_view);
-    }
-
-    @Test
-    @SmallTest
-    public void testMaxLines() throws Throwable {
-        final int maxLinesCount = 4;
-        onView(withId(R.id.text_view)).perform(setMaxLines(maxLinesCount));
-
-        assertEquals("Empty view: Max lines must match", TextViewCompat.getMaxLines(mTextView),
-                maxLinesCount);
-
-        onView(withId(R.id.text_view)).perform(setText(R.string.test_text_short));
-        assertEquals("Short text: Max lines must match", TextViewCompat.getMaxLines(mTextView),
-                maxLinesCount);
-
-        onView(withId(R.id.text_view)).perform(setText(R.string.test_text_medium));
-        assertEquals("Medium text: Max lines must match", TextViewCompat.getMaxLines(mTextView),
-                maxLinesCount);
-
-        onView(withId(R.id.text_view)).perform(setText(R.string.test_text_long));
-        assertEquals("Long text: Max lines must match", TextViewCompat.getMaxLines(mTextView),
-                maxLinesCount);
-    }
-
-    @Test
-    @SmallTest
-    public void testMinLines() throws Throwable {
-        final int minLinesCount = 3;
-        onView(withId(R.id.text_view)).perform(setMinLines(minLinesCount));
-
-        assertEquals("Empty view: Min lines must match", TextViewCompat.getMinLines(mTextView),
-                minLinesCount);
-
-        onView(withId(R.id.text_view)).perform(setText(R.string.test_text_short));
-        assertEquals("Short text: Min lines must match", TextViewCompat.getMinLines(mTextView),
-                minLinesCount);
-
-        onView(withId(R.id.text_view)).perform(setText(R.string.test_text_medium));
-        assertEquals("Medium text: Min lines must match", TextViewCompat.getMinLines(mTextView),
-                minLinesCount);
-
-        onView(withId(R.id.text_view)).perform(setText(R.string.test_text_long));
-        assertEquals("Long text: Min lines must match", TextViewCompat.getMinLines(mTextView),
-                minLinesCount);
-    }
-
-    @Test
-    @SmallTest
-    public void testStyle() throws Throwable {
-        onView(withId(R.id.text_view)).perform(setTextAppearance(R.style.TextMediumStyle));
-
-        final Resources res = mActivityTestRule.getActivity().getResources();
-        assertTrue("Styled text view: style",
-                mTextView.getTypeface().isItalic() || (mTextView.getPaint().getTextSkewX() < 0));
-        assertEquals("Styled text view: color", mTextView.getTextColors().getDefaultColor(),
-                res.getColor(R.color.text_color));
-        assertEquals("Styled text view: size", mTextView.getTextSize(),
-                (float) res.getDimensionPixelSize(R.dimen.text_medium_size), 1.0f);
-    }
-
-    @Test
-    @SmallTest
-    public void testCompoundDrawablesRelative() throws Throwable {
-        final Drawable drawableStart = new ColorDrawable(0xFFFF0000);
-        drawableStart.setBounds(0, 0, 20, 20);
-        final Drawable drawableTop = new ColorDrawable(0xFF00FF00);
-        drawableTop.setBounds(0, 0, 30, 25);
-        final Drawable drawableEnd = new ColorDrawable(0xFF0000FF);
-        drawableEnd.setBounds(0, 0, 25, 20);
-
-        onView(withId(R.id.text_view)).perform(setText(R.string.test_text_medium));
-        onView(withId(R.id.text_view)).perform(setCompoundDrawablesRelative(drawableStart,
-                drawableTop, drawableEnd, null));
-
-        final Drawable[] drawablesAbsolute = mTextView.getCompoundDrawables();
-
-        assertEquals("Compound drawable: left", drawablesAbsolute[0], drawableStart);
-        assertEquals("Compound drawable: left width",
-                drawablesAbsolute[0].getBounds().width(), 20);
-        assertEquals("Compound drawable: left height",
-                drawablesAbsolute[0].getBounds().height(), 20);
-
-        assertEquals("Compound drawable: top", drawablesAbsolute[1], drawableTop);
-        assertEquals("Compound drawable: top width",
-                drawablesAbsolute[1].getBounds().width(), 30);
-        assertEquals("Compound drawable: top height",
-                drawablesAbsolute[1].getBounds().height(), 25);
-
-        assertEquals("Compound drawable: right", drawablesAbsolute[2], drawableEnd);
-        assertEquals("Compound drawable: right width",
-                drawablesAbsolute[2].getBounds().width(), 25);
-        assertEquals("Compound drawable: right height",
-                drawablesAbsolute[2].getBounds().height(), 20);
-
-        assertNull("Compound drawable: bottom", drawablesAbsolute[3]);
-    }
-
-    @Test
-    @SmallTest
-    public void testCompoundDrawablesRelativeRtl() throws Throwable {
-        onView(withId(R.id.text_view)).perform(setLayoutDirection(ViewCompat.LAYOUT_DIRECTION_RTL));
-
-        final Drawable drawableStart = new ColorDrawable(0xFFFF0000);
-        drawableStart.setBounds(0, 0, 20, 20);
-        final Drawable drawableTop = new ColorDrawable(0xFF00FF00);
-        drawableTop.setBounds(0, 0, 30, 25);
-        final Drawable drawableEnd = new ColorDrawable(0xFF0000FF);
-        drawableEnd.setBounds(0, 0, 25, 20);
-
-        onView(withId(R.id.text_view)).perform(setText(R.string.test_text_medium));
-        onView(withId(R.id.text_view)).perform(setCompoundDrawablesRelative(drawableStart,
-                drawableTop, drawableEnd, null));
-
-        // Check to see whether our text view is under RTL mode
-        if (ViewCompat.getLayoutDirection(mTextView) != ViewCompat.LAYOUT_DIRECTION_RTL) {
-            // This will happen on v17- devices
-            return;
-        }
-
-        final Drawable[] drawablesAbsolute = mTextView.getCompoundDrawables();
-
-        // End drawable should be returned as left
-        assertEquals("Compound drawable: left", drawablesAbsolute[0], drawableEnd);
-        assertEquals("Compound drawable: left width",
-                drawablesAbsolute[0].getBounds().width(), 25);
-        assertEquals("Compound drawable: left height",
-                drawablesAbsolute[0].getBounds().height(), 20);
-
-        assertEquals("Compound drawable: top", drawablesAbsolute[1], drawableTop);
-        assertEquals("Compound drawable: left width",
-                drawablesAbsolute[1].getBounds().width(), 30);
-        assertEquals("Compound drawable: left height",
-                drawablesAbsolute[1].getBounds().height(), 25);
-
-        // Start drawable should be returned as right
-        assertEquals("Compound drawable: right", drawablesAbsolute[2], drawableStart);
-        assertEquals("Compound drawable: left width",
-                drawablesAbsolute[2].getBounds().width(), 20);
-        assertEquals("Compound drawable: left height",
-                drawablesAbsolute[2].getBounds().height(), 20);
-
-        assertNull("Compound drawable: bottom", drawablesAbsolute[3]);
-    }
-
-    @Test
-    @SmallTest
-    public void testCompoundDrawablesRelativeWithIntrinsicBounds() throws Throwable {
-        final Drawable drawableStart = new TestDrawable(0xFFFF0000, 30, 20);
-        final Drawable drawableEnd = new TestDrawable(0xFF0000FF, 25, 45);
-        final Drawable drawableBottom = new TestDrawable(0xFF00FF00, 15, 35);
-
-        onView(withId(R.id.text_view)).perform(setText(R.string.test_text_long));
-        onView(withId(R.id.text_view)).perform(setCompoundDrawablesRelativeWithIntrinsicBounds(
-                drawableStart, null, drawableEnd, drawableBottom));
-
-        final Drawable[] drawablesAbsolute = mTextView.getCompoundDrawables();
-
-        assertEquals("Compound drawable: left", drawablesAbsolute[0], drawableStart);
-        assertEquals("Compound drawable: left width",
-                drawablesAbsolute[0].getBounds().width(), 30);
-        assertEquals("Compound drawable: left height",
-                drawablesAbsolute[0].getBounds().height(), 20);
-
-        assertNull("Compound drawable: top", drawablesAbsolute[1]);
-
-        assertEquals("Compound drawable: right", drawablesAbsolute[2], drawableEnd);
-        assertEquals("Compound drawable: right width",
-                drawablesAbsolute[2].getBounds().width(), 25);
-        assertEquals("Compound drawable: right height",
-                drawablesAbsolute[2].getBounds().height(), 45);
-
-        assertEquals("Compound drawable: bottom", drawablesAbsolute[3], drawableBottom);
-        assertEquals("Compound drawable: bottom width",
-                drawablesAbsolute[3].getBounds().width(), 15);
-        assertEquals("Compound drawable: bottom height",
-                drawablesAbsolute[3].getBounds().height(), 35);
-    }
-
-    @Test
-    @SmallTest
-    public void testCompoundDrawablesRelativeWithIntrinsicBoundsRtl() throws Throwable {
-        onView(withId(R.id.text_view)).perform(setLayoutDirection(ViewCompat.LAYOUT_DIRECTION_RTL));
-
-        final Drawable drawableStart = new TestDrawable(0xFFFF0000, 30, 20);
-        final Drawable drawableEnd = new TestDrawable(0xFF0000FF, 25, 45);
-        final Drawable drawableBottom = new TestDrawable(0xFF00FF00, 15, 35);
-
-        onView(withId(R.id.text_view)).perform(setText(R.string.test_text_long));
-        onView(withId(R.id.text_view)).perform(setCompoundDrawablesRelativeWithIntrinsicBounds(
-                drawableStart, null, drawableEnd, drawableBottom));
-
-        // Check to see whether our text view is under RTL mode
-        if (ViewCompat.getLayoutDirection(mTextView) != ViewCompat.LAYOUT_DIRECTION_RTL) {
-            // This will happen on v17- devices
-            return;
-        }
-
-        final Drawable[] drawablesAbsolute = mTextView.getCompoundDrawables();
-
-        // End drawable should be returned as left
-        assertEquals("Compound drawable: left", drawablesAbsolute[0], drawableEnd);
-        assertEquals("Compound drawable: left width",
-                drawablesAbsolute[0].getBounds().width(), 25);
-        assertEquals("Compound drawable: left height",
-                drawablesAbsolute[0].getBounds().height(), 45);
-
-        assertNull("Compound drawable: top", drawablesAbsolute[1]);
-
-        // Start drawable should be returned as right
-        assertEquals("Compound drawable: right", drawablesAbsolute[2], drawableStart);
-        assertEquals("Compound drawable: right width",
-                drawablesAbsolute[2].getBounds().width(), 30);
-        assertEquals("Compound drawable: right height",
-                drawablesAbsolute[2].getBounds().height(), 20);
-
-        assertEquals("Compound drawable: bottom", drawablesAbsolute[3], drawableBottom);
-        assertEquals("Compound drawable: bottom width",
-                drawablesAbsolute[3].getBounds().width(), 15);
-        assertEquals("Compound drawable: bottom height",
-                drawablesAbsolute[3].getBounds().height(), 35);
-    }
-
-    @Test
-    @MediumTest
-    public void testCompoundDrawablesRelativeWithIntrinsicBoundsById() throws Throwable {
-        onView(withId(R.id.text_view)).perform(setText(R.string.test_text_long));
-        onView(withId(R.id.text_view)).perform(setCompoundDrawablesRelativeWithIntrinsicBounds(
-                R.drawable.test_drawable_red, 0,
-                R.drawable.test_drawable_green, R.drawable.test_drawable_blue));
-
-        final Drawable[] drawablesAbsolute = mTextView.getCompoundDrawables();
-        final Resources res = mActivityTestRule.getActivity().getResources();
-
-        // The entire left drawable should be the specific red color
-        TestUtils.assertAllPixelsOfColor("Compound drawable: left color",
-                drawablesAbsolute[0], res.getColor(R.color.test_red));
-        assertEquals("Compound drawable: left width",
-                drawablesAbsolute[0].getBounds().width(),
-                res.getDimensionPixelSize(R.dimen.drawable_small_size));
-        assertEquals("Compound drawable: left height",
-                drawablesAbsolute[0].getBounds().height(),
-                res.getDimensionPixelSize(R.dimen.drawable_medium_size));
-
-        assertNull("Compound drawable: top", drawablesAbsolute[1]);
-
-        // The entire right drawable should be the specific green color
-        TestUtils.assertAllPixelsOfColor("Compound drawable: right color",
-                drawablesAbsolute[2], res.getColor(R.color.test_green));
-        assertEquals("Compound drawable: right width",
-                drawablesAbsolute[2].getBounds().width(),
-                res.getDimensionPixelSize(R.dimen.drawable_medium_size));
-        assertEquals("Compound drawable: right height",
-                drawablesAbsolute[2].getBounds().height(),
-                res.getDimensionPixelSize(R.dimen.drawable_large_size));
-
-        // The entire bottom drawable should be the specific blue color
-        TestUtils.assertAllPixelsOfColor("Compound drawable: bottom color",
-                drawablesAbsolute[3], res.getColor(R.color.test_blue));
-        assertEquals("Compound drawable: bottom width",
-                drawablesAbsolute[3].getBounds().width(),
-                res.getDimensionPixelSize(R.dimen.drawable_large_size));
-        assertEquals("Compound drawable: bottom height",
-                drawablesAbsolute[3].getBounds().height(),
-                res.getDimensionPixelSize(R.dimen.drawable_small_size));
-    }
-
-    @Test
-    @MediumTest
-    public void testCompoundDrawablesRelativeWithIntrinsicBoundsByIdRtl() throws Throwable {
-        onView(withId(R.id.text_view)).perform(setLayoutDirection(ViewCompat.LAYOUT_DIRECTION_RTL));
-
-        onView(withId(R.id.text_view)).perform(setText(R.string.test_text_long));
-        onView(withId(R.id.text_view)).perform(setCompoundDrawablesRelativeWithIntrinsicBounds(
-                R.drawable.test_drawable_red, 0,
-                R.drawable.test_drawable_green, R.drawable.test_drawable_blue));
-
-        // Check to see whether our text view is under RTL mode
-        if (ViewCompat.getLayoutDirection(mTextView) != ViewCompat.LAYOUT_DIRECTION_RTL) {
-            // This will happen on v17- devices
-            return;
-        }
-
-        final Drawable[] drawablesAbsolute = mTextView.getCompoundDrawables();
-        final Resources res = mActivityTestRule.getActivity().getResources();
-
-        // The entire left / end drawable should be the specific green color
-        TestUtils.assertAllPixelsOfColor("Compound drawable: left color",
-                drawablesAbsolute[0], res.getColor(R.color.test_green));
-        assertEquals("Compound drawable: left width",
-                drawablesAbsolute[0].getBounds().width(),
-                res.getDimensionPixelSize(R.dimen.drawable_medium_size));
-        assertEquals("Compound drawable: left height",
-                drawablesAbsolute[0].getBounds().height(),
-                res.getDimensionPixelSize(R.dimen.drawable_large_size));
-
-        assertNull("Compound drawable: top", drawablesAbsolute[1]);
-
-        // The entire right drawable should be the specific red color
-        TestUtils.assertAllPixelsOfColor("Compound drawable: right color",
-                drawablesAbsolute[2], res.getColor(R.color.test_red));
-        assertEquals("Compound drawable: right width",
-                drawablesAbsolute[2].getBounds().width(),
-                res.getDimensionPixelSize(R.dimen.drawable_small_size));
-        assertEquals("Compound drawable: right height",
-                drawablesAbsolute[2].getBounds().height(),
-                res.getDimensionPixelSize(R.dimen.drawable_medium_size));
-
-        // The entire bottom drawable should be the specific blue color
-        TestUtils.assertAllPixelsOfColor("Compound drawable: bottom color",
-                drawablesAbsolute[3], res.getColor(R.color.test_blue));
-        assertEquals("Compound drawable: bottom width",
-                drawablesAbsolute[3].getBounds().width(),
-                res.getDimensionPixelSize(R.dimen.drawable_large_size));
-        assertEquals("Compound drawable: bottom height",
-                drawablesAbsolute[3].getBounds().height(),
-                res.getDimensionPixelSize(R.dimen.drawable_small_size));
-    }
-}
diff --git a/v4/tests/java/android/support/v4/widget/TextViewTestActivity.java b/v4/tests/java/android/support/v4/widget/TextViewTestActivity.java
deleted file mode 100644
index dcaab70..0000000
--- a/v4/tests/java/android/support/v4/widget/TextViewTestActivity.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2015 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 android.support.v4.widget;
-
-import android.support.v4.BaseTestActivity;
-import android.support.v4.test.R;
-
-public class TextViewTestActivity extends BaseTestActivity {
-    @Override
-    protected int getContentViewLayoutResId() {
-        return R.layout.text_view_activity;
-    }
-}
diff --git a/v4/tests/res/values/strings.xml b/v4/tests/res/values/strings.xml
deleted file mode 100644
index b804faf..0000000
--- a/v4/tests/res/values/strings.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2015 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">
-    <!-- Short text for testing. -->
-    <string name="test_text_short">Lorem ipsum</string>
-    <!-- Medium text for testing. -->
-    <string name="test_text_medium">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam dui neque, suscipit quis rhoncus vitae, rhoncus hendrerit neque.</string>
-    <!-- Long text for testing. -->
-    <string name="test_text_long">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam dui neque, suscipit quis rhoncus vitae, rhoncus hendrerit neque. Proin ac mauris cursus nulla aliquam viverra. Vivamus pharetra luctus magna, lacinia imperdiet leo mollis eget. Fusce a diam ipsum. Etiam sit amet nisl et velit aliquam dignissim eget nec nisi. Duis bibendum euismod tortor non pulvinar. Nunc quis neque ultricies nulla luctus aliquet. Sed consectetur, orci ac vehicula consectetur, metus sem pellentesque turpis, sed venenatis nisi lorem vitae ante.</string>
-    <string name="hello">Hello World</string>
-</resources>
\ No newline at end of file
diff --git a/v7/appcompat/Android.mk b/v7/appcompat/Android.mk
index 6d11fcb..21e9e8b 100644
--- a/v7/appcompat/Android.mk
+++ b/v7/appcompat/Android.mk
@@ -36,12 +36,3 @@
 LOCAL_JAR_EXCLUDE_FILES := none
 LOCAL_JAVA_LANGUAGE_VERSION := 1.7
 include $(BUILD_STATIC_JAVA_LIBRARY)
-
-# API Check
-# ---------------------------------------------
-support_module := $(LOCAL_MODULE)
-support_module_api_dir := $(LOCAL_PATH)/api
-support_module_src_files := $(LOCAL_SRC_FILES)
-support_module_java_libraries := $(LOCAL_JAVA_LIBRARIES) android-support-v7-appcompat
-support_module_java_packages := android.support.v7.*
-include $(SUPPORT_API_CHECK)
diff --git a/v7/appcompat/AndroidManifest.xml b/v7/appcompat/AndroidManifest.xml
index 0e0aba8..99b77ee 100644
--- a/v7/appcompat/AndroidManifest.xml
+++ b/v7/appcompat/AndroidManifest.xml
@@ -16,7 +16,7 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
           xmlns:tools="http://schemas.android.com/tools"
           package="android.support.v7.appcompat">
-    <uses-sdk android:minSdkVersion="7"
+    <uses-sdk android:minSdkVersion="9"
               tools:overrideLibrary="android.support.graphics.drawable.animated"/>
     <application/>
 </manifest>
diff --git a/v7/appcompat/api/22.0.0.txt b/v7/appcompat/api/22.0.0.txt
deleted file mode 100644
index 1de074f..0000000
--- a/v7/appcompat/api/22.0.0.txt
+++ /dev/null
@@ -1,529 +0,0 @@
-package android.support.v7.app {
-
-  public abstract class ActionBar {
-    ctor public ActionBar();
-    method public abstract void addOnMenuVisibilityListener(android.support.v7.app.ActionBar.OnMenuVisibilityListener);
-    method public abstract deprecated void addTab(android.support.v7.app.ActionBar.Tab);
-    method public abstract deprecated void addTab(android.support.v7.app.ActionBar.Tab, boolean);
-    method public abstract deprecated void addTab(android.support.v7.app.ActionBar.Tab, int);
-    method public abstract deprecated void addTab(android.support.v7.app.ActionBar.Tab, int, boolean);
-    method public abstract android.view.View getCustomView();
-    method public abstract int getDisplayOptions();
-    method public float getElevation();
-    method public abstract int getHeight();
-    method public int getHideOffset();
-    method public abstract deprecated int getNavigationItemCount();
-    method public abstract deprecated int getNavigationMode();
-    method public abstract deprecated int getSelectedNavigationIndex();
-    method public abstract deprecated android.support.v7.app.ActionBar.Tab getSelectedTab();
-    method public abstract java.lang.CharSequence getSubtitle();
-    method public abstract deprecated android.support.v7.app.ActionBar.Tab getTabAt(int);
-    method public abstract deprecated int getTabCount();
-    method public android.content.Context getThemedContext();
-    method public abstract java.lang.CharSequence getTitle();
-    method public abstract void hide();
-    method public boolean isHideOnContentScrollEnabled();
-    method public abstract boolean isShowing();
-    method public abstract deprecated android.support.v7.app.ActionBar.Tab newTab();
-    method public abstract deprecated void removeAllTabs();
-    method public abstract void removeOnMenuVisibilityListener(android.support.v7.app.ActionBar.OnMenuVisibilityListener);
-    method public abstract deprecated void removeTab(android.support.v7.app.ActionBar.Tab);
-    method public abstract deprecated void removeTabAt(int);
-    method public abstract deprecated void selectTab(android.support.v7.app.ActionBar.Tab);
-    method public abstract void setBackgroundDrawable(android.graphics.drawable.Drawable);
-    method public abstract void setCustomView(android.view.View);
-    method public abstract void setCustomView(android.view.View, android.support.v7.app.ActionBar.LayoutParams);
-    method public abstract void setCustomView(int);
-    method public abstract void setDisplayHomeAsUpEnabled(boolean);
-    method public abstract void setDisplayOptions(int);
-    method public abstract void setDisplayOptions(int, int);
-    method public abstract void setDisplayShowCustomEnabled(boolean);
-    method public abstract void setDisplayShowHomeEnabled(boolean);
-    method public abstract void setDisplayShowTitleEnabled(boolean);
-    method public abstract void setDisplayUseLogoEnabled(boolean);
-    method public void setElevation(float);
-    method public void setHideOffset(int);
-    method public void setHideOnContentScrollEnabled(boolean);
-    method public void setHomeActionContentDescription(java.lang.CharSequence);
-    method public void setHomeActionContentDescription(int);
-    method public void setHomeAsUpIndicator(android.graphics.drawable.Drawable);
-    method public void setHomeAsUpIndicator(int);
-    method public void setHomeButtonEnabled(boolean);
-    method public abstract void setIcon(int);
-    method public abstract void setIcon(android.graphics.drawable.Drawable);
-    method public abstract deprecated void setListNavigationCallbacks(android.widget.SpinnerAdapter, android.support.v7.app.ActionBar.OnNavigationListener);
-    method public abstract void setLogo(int);
-    method public abstract void setLogo(android.graphics.drawable.Drawable);
-    method public abstract deprecated void setNavigationMode(int);
-    method public abstract deprecated void setSelectedNavigationItem(int);
-    method public void setSplitBackgroundDrawable(android.graphics.drawable.Drawable);
-    method public void setStackedBackgroundDrawable(android.graphics.drawable.Drawable);
-    method public abstract void setSubtitle(java.lang.CharSequence);
-    method public abstract void setSubtitle(int);
-    method public abstract void setTitle(java.lang.CharSequence);
-    method public abstract void setTitle(int);
-    method public abstract void show();
-    field public static final int DISPLAY_HOME_AS_UP = 4; // 0x4
-    field public static final int DISPLAY_SHOW_CUSTOM = 16; // 0x10
-    field public static final int DISPLAY_SHOW_HOME = 2; // 0x2
-    field public static final int DISPLAY_SHOW_TITLE = 8; // 0x8
-    field public static final int DISPLAY_USE_LOGO = 1; // 0x1
-    field public static final deprecated int NAVIGATION_MODE_LIST = 1; // 0x1
-    field public static final deprecated int NAVIGATION_MODE_STANDARD = 0; // 0x0
-    field public static final deprecated int NAVIGATION_MODE_TABS = 2; // 0x2
-  }
-
-  public static class ActionBar.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
-    ctor public ActionBar.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public ActionBar.LayoutParams(int, int);
-    ctor public ActionBar.LayoutParams(int, int, int);
-    ctor public ActionBar.LayoutParams(int);
-    ctor public ActionBar.LayoutParams(android.support.v7.app.ActionBar.LayoutParams);
-    ctor public ActionBar.LayoutParams(android.view.ViewGroup.LayoutParams);
-    field public int gravity;
-  }
-
-  public static abstract interface ActionBar.OnMenuVisibilityListener {
-    method public abstract void onMenuVisibilityChanged(boolean);
-  }
-
-  public static abstract deprecated interface ActionBar.OnNavigationListener {
-    method public abstract boolean onNavigationItemSelected(int, long);
-  }
-
-  public static abstract deprecated class ActionBar.Tab {
-    ctor public ActionBar.Tab();
-    method public abstract java.lang.CharSequence getContentDescription();
-    method public abstract android.view.View getCustomView();
-    method public abstract android.graphics.drawable.Drawable getIcon();
-    method public abstract int getPosition();
-    method public abstract java.lang.Object getTag();
-    method public abstract java.lang.CharSequence getText();
-    method public abstract void select();
-    method public abstract android.support.v7.app.ActionBar.Tab setContentDescription(int);
-    method public abstract android.support.v7.app.ActionBar.Tab setContentDescription(java.lang.CharSequence);
-    method public abstract android.support.v7.app.ActionBar.Tab setCustomView(android.view.View);
-    method public abstract android.support.v7.app.ActionBar.Tab setCustomView(int);
-    method public abstract android.support.v7.app.ActionBar.Tab setIcon(android.graphics.drawable.Drawable);
-    method public abstract android.support.v7.app.ActionBar.Tab setIcon(int);
-    method public abstract android.support.v7.app.ActionBar.Tab setTabListener(android.support.v7.app.ActionBar.TabListener);
-    method public abstract android.support.v7.app.ActionBar.Tab setTag(java.lang.Object);
-    method public abstract android.support.v7.app.ActionBar.Tab setText(java.lang.CharSequence);
-    method public abstract android.support.v7.app.ActionBar.Tab setText(int);
-    field public static final int INVALID_POSITION = -1; // 0xffffffff
-  }
-
-  public static abstract deprecated interface ActionBar.TabListener {
-    method public abstract void onTabReselected(android.support.v7.app.ActionBar.Tab, android.support.v4.app.FragmentTransaction);
-    method public abstract void onTabSelected(android.support.v7.app.ActionBar.Tab, android.support.v4.app.FragmentTransaction);
-    method public abstract void onTabUnselected(android.support.v7.app.ActionBar.Tab, android.support.v4.app.FragmentTransaction);
-  }
-
-  public class ActionBarActivity extends android.support.v4.app.FragmentActivity {
-    ctor public ActionBarActivity();
-    method public final android.support.v4.app.ActionBarDrawerToggle.Delegate getDrawerToggleDelegate();
-    method public android.support.v7.app.ActionBar getSupportActionBar();
-    method public android.content.Intent getSupportParentActivityIntent();
-    method public android.support.v7.app.ActionBarDrawerToggle.Delegate getV7DrawerToggleDelegate();
-    method public final void onContentChanged();
-    method public void onCreateSupportNavigateUpTaskStack(android.support.v4.app.TaskStackBuilder);
-    method public final boolean onMenuItemSelected(int, android.view.MenuItem);
-    method public void onPrepareSupportNavigateUpTaskStack(android.support.v4.app.TaskStackBuilder);
-    method public void onSupportActionModeFinished(android.support.v7.view.ActionMode);
-    method public void onSupportActionModeStarted(android.support.v7.view.ActionMode);
-    method public void onSupportContentChanged();
-    method public boolean onSupportNavigateUp();
-    method public void setSupportActionBar(android.support.v7.widget.Toolbar);
-    method public void setSupportProgress(int);
-    method public void setSupportProgressBarIndeterminate(boolean);
-    method public void setSupportProgressBarIndeterminateVisibility(boolean);
-    method public void setSupportProgressBarVisibility(boolean);
-    method public android.support.v7.view.ActionMode startSupportActionMode(android.support.v7.view.ActionMode.Callback);
-    method public void supportNavigateUpTo(android.content.Intent);
-    method public boolean supportRequestWindowFeature(int);
-    method public boolean supportShouldUpRecreateTask(android.content.Intent);
-  }
-
-  public class ActionBarDrawerToggle implements android.support.v4.widget.DrawerLayout.DrawerListener {
-    ctor public ActionBarDrawerToggle(android.app.Activity, android.support.v4.widget.DrawerLayout, int, int);
-    ctor public ActionBarDrawerToggle(android.app.Activity, android.support.v4.widget.DrawerLayout, android.support.v7.widget.Toolbar, int, int);
-    method public android.view.View.OnClickListener getToolbarNavigationClickListener();
-    method public boolean isDrawerIndicatorEnabled();
-    method public void onConfigurationChanged(android.content.res.Configuration);
-    method public void onDrawerClosed(android.view.View);
-    method public void onDrawerOpened(android.view.View);
-    method public void onDrawerSlide(android.view.View, float);
-    method public void onDrawerStateChanged(int);
-    method public boolean onOptionsItemSelected(android.view.MenuItem);
-    method public void setDrawerIndicatorEnabled(boolean);
-    method public void setHomeAsUpIndicator(android.graphics.drawable.Drawable);
-    method public void setHomeAsUpIndicator(int);
-    method public void setToolbarNavigationClickListener(android.view.View.OnClickListener);
-    method public void syncState();
-  }
-
-  public static abstract interface ActionBarDrawerToggle.Delegate {
-    method public abstract android.content.Context getActionBarThemedContext();
-    method public abstract android.graphics.drawable.Drawable getThemeUpIndicator();
-    method public abstract boolean isNavigationVisible();
-    method public abstract void setActionBarDescription(int);
-    method public abstract void setActionBarUpIndicator(android.graphics.drawable.Drawable, int);
-  }
-
-  public static abstract interface ActionBarDrawerToggle.DelegateProvider {
-    method public abstract android.support.v7.app.ActionBarDrawerToggle.Delegate getDrawerToggleDelegate();
-  }
-
-}
-
-package android.support.v7.view {
-
-  public abstract class ActionMode {
-    ctor public ActionMode();
-    method public abstract void finish();
-    method public abstract android.view.View getCustomView();
-    method public abstract android.view.Menu getMenu();
-    method public abstract android.view.MenuInflater getMenuInflater();
-    method public abstract java.lang.CharSequence getSubtitle();
-    method public java.lang.Object getTag();
-    method public abstract java.lang.CharSequence getTitle();
-    method public boolean getTitleOptionalHint();
-    method public abstract void invalidate();
-    method public boolean isTitleOptional();
-    method public abstract void setCustomView(android.view.View);
-    method public abstract void setSubtitle(java.lang.CharSequence);
-    method public abstract void setSubtitle(int);
-    method public void setTag(java.lang.Object);
-    method public abstract void setTitle(java.lang.CharSequence);
-    method public abstract void setTitle(int);
-    method public void setTitleOptionalHint(boolean);
-  }
-
-  public static abstract interface ActionMode.Callback {
-    method public abstract boolean onActionItemClicked(android.support.v7.view.ActionMode, android.view.MenuItem);
-    method public abstract boolean onCreateActionMode(android.support.v7.view.ActionMode, android.view.Menu);
-    method public abstract void onDestroyActionMode(android.support.v7.view.ActionMode);
-    method public abstract boolean onPrepareActionMode(android.support.v7.view.ActionMode, android.view.Menu);
-  }
-
-  public abstract interface CollapsibleActionView {
-    method public abstract void onActionViewCollapsed();
-    method public abstract void onActionViewExpanded();
-  }
-
-}
-
-package android.support.v7.widget {
-
-  public class ActionMenuView extends android.support.v7.widget.LinearLayoutCompat {
-    ctor public ActionMenuView(android.content.Context);
-    ctor public ActionMenuView(android.content.Context, android.util.AttributeSet);
-    method public void dismissPopupMenus();
-    method public android.view.Menu getMenu();
-    method public int getPopupTheme();
-    method public boolean hideOverflowMenu();
-    method public boolean isOverflowMenuShowing();
-    method public void onConfigurationChanged(android.content.res.Configuration);
-    method public void onDetachedFromWindow();
-    method public void setOnMenuItemClickListener(android.support.v7.widget.ActionMenuView.OnMenuItemClickListener);
-    method public void setPopupTheme(int);
-    method public boolean showOverflowMenu();
-  }
-
-  public static class ActionMenuView.LayoutParams extends android.support.v7.widget.LinearLayoutCompat.LayoutParams {
-    ctor public ActionMenuView.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public ActionMenuView.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public ActionMenuView.LayoutParams(android.support.v7.widget.ActionMenuView.LayoutParams);
-    ctor public ActionMenuView.LayoutParams(int, int);
-    field public int cellsUsed;
-    field public boolean expandable;
-    field public int extraPixels;
-    field public boolean isOverflowButton;
-    field public boolean preventEdgeOffset;
-  }
-
-  public static abstract interface ActionMenuView.OnMenuItemClickListener {
-    method public abstract boolean onMenuItemClick(android.view.MenuItem);
-  }
-
-  public class LinearLayoutCompat extends android.view.ViewGroup {
-    ctor public LinearLayoutCompat(android.content.Context);
-    ctor public LinearLayoutCompat(android.content.Context, android.util.AttributeSet);
-    ctor public LinearLayoutCompat(android.content.Context, android.util.AttributeSet, int);
-    method public int getBaselineAlignedChildIndex();
-    method public android.graphics.drawable.Drawable getDividerDrawable();
-    method public int getDividerPadding();
-    method public int getOrientation();
-    method public int getShowDividers();
-    method public float getWeightSum();
-    method public boolean isBaselineAligned();
-    method public boolean isMeasureWithLargestChildEnabled();
-    method protected void onLayout(boolean, int, int, int, int);
-    method public void setBaselineAligned(boolean);
-    method public void setBaselineAlignedChildIndex(int);
-    method public void setDividerDrawable(android.graphics.drawable.Drawable);
-    method public void setDividerPadding(int);
-    method public void setGravity(int);
-    method public void setHorizontalGravity(int);
-    method public void setMeasureWithLargestChildEnabled(boolean);
-    method public void setOrientation(int);
-    method public void setShowDividers(int);
-    method public void setVerticalGravity(int);
-    method public void setWeightSum(float);
-    field public static final int HORIZONTAL = 0; // 0x0
-    field public static final int SHOW_DIVIDER_BEGINNING = 1; // 0x1
-    field public static final int SHOW_DIVIDER_END = 4; // 0x4
-    field public static final int SHOW_DIVIDER_MIDDLE = 2; // 0x2
-    field public static final int SHOW_DIVIDER_NONE = 0; // 0x0
-    field public static final int VERTICAL = 1; // 0x1
-  }
-
-  public static class LinearLayoutCompat.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
-    ctor public LinearLayoutCompat.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public LinearLayoutCompat.LayoutParams(int, int);
-    ctor public LinearLayoutCompat.LayoutParams(int, int, float);
-    ctor public LinearLayoutCompat.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public LinearLayoutCompat.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public LinearLayoutCompat.LayoutParams(android.support.v7.widget.LinearLayoutCompat.LayoutParams);
-    field public int gravity;
-    field public float weight;
-  }
-
-  public class ListPopupWindow {
-    ctor public ListPopupWindow(android.content.Context);
-    ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet);
-    ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet, int);
-    ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet, int, int);
-    method public void clearListSelection();
-    method public android.view.View.OnTouchListener createDragToOpenListener(android.view.View);
-    method public void dismiss();
-    method public android.view.View getAnchorView();
-    method public int getAnimationStyle();
-    method public android.graphics.drawable.Drawable getBackground();
-    method public int getHeight();
-    method public int getHorizontalOffset();
-    method public int getInputMethodMode();
-    method public android.widget.ListView getListView();
-    method public int getPromptPosition();
-    method public java.lang.Object getSelectedItem();
-    method public long getSelectedItemId();
-    method public int getSelectedItemPosition();
-    method public android.view.View getSelectedView();
-    method public int getSoftInputMode();
-    method public int getVerticalOffset();
-    method public int getWidth();
-    method public boolean isInputMethodNotNeeded();
-    method public boolean isModal();
-    method public boolean isShowing();
-    method public boolean onKeyDown(int, android.view.KeyEvent);
-    method public boolean onKeyPreIme(int, android.view.KeyEvent);
-    method public boolean onKeyUp(int, android.view.KeyEvent);
-    method public boolean performItemClick(int);
-    method public void postShow();
-    method public void setAdapter(android.widget.ListAdapter);
-    method public void setAnchorView(android.view.View);
-    method public void setAnimationStyle(int);
-    method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
-    method public void setContentWidth(int);
-    method public void setDropDownGravity(int);
-    method public void setHeight(int);
-    method public void setHorizontalOffset(int);
-    method public void setInputMethodMode(int);
-    method public void setListSelector(android.graphics.drawable.Drawable);
-    method public void setModal(boolean);
-    method public void setOnDismissListener(android.widget.PopupWindow.OnDismissListener);
-    method public void setOnItemClickListener(android.widget.AdapterView.OnItemClickListener);
-    method public void setOnItemSelectedListener(android.widget.AdapterView.OnItemSelectedListener);
-    method public void setPromptPosition(int);
-    method public void setPromptView(android.view.View);
-    method public void setSelection(int);
-    method public void setSoftInputMode(int);
-    method public void setVerticalOffset(int);
-    method public void setWidth(int);
-    method public void show();
-    field public static final int INPUT_METHOD_FROM_FOCUSABLE = 0; // 0x0
-    field public static final int INPUT_METHOD_NEEDED = 1; // 0x1
-    field public static final int INPUT_METHOD_NOT_NEEDED = 2; // 0x2
-    field public static final int MATCH_PARENT = -1; // 0xffffffff
-    field public static final int POSITION_PROMPT_ABOVE = 0; // 0x0
-    field public static final int POSITION_PROMPT_BELOW = 1; // 0x1
-    field public static final int WRAP_CONTENT = -2; // 0xfffffffe
-  }
-
-  public class PopupMenu {
-    ctor public PopupMenu(android.content.Context, android.view.View);
-    ctor public PopupMenu(android.content.Context, android.view.View, int);
-    ctor public PopupMenu(android.content.Context, android.view.View, int, int, int);
-    method public void dismiss();
-    method public android.view.View.OnTouchListener getDragToOpenListener();
-    method public android.view.Menu getMenu();
-    method public android.view.MenuInflater getMenuInflater();
-    method public void inflate(int);
-    method public void setOnDismissListener(android.support.v7.widget.PopupMenu.OnDismissListener);
-    method public void setOnMenuItemClickListener(android.support.v7.widget.PopupMenu.OnMenuItemClickListener);
-    method public void show();
-  }
-
-  public static abstract interface PopupMenu.OnDismissListener {
-    method public abstract void onDismiss(android.support.v7.widget.PopupMenu);
-  }
-
-  public static abstract interface PopupMenu.OnMenuItemClickListener {
-    method public abstract boolean onMenuItemClick(android.view.MenuItem);
-  }
-
-  public class SearchView extends android.support.v7.widget.LinearLayoutCompat implements android.support.v7.view.CollapsibleActionView {
-    ctor public SearchView(android.content.Context);
-    ctor public SearchView(android.content.Context, android.util.AttributeSet);
-    ctor public SearchView(android.content.Context, android.util.AttributeSet, int);
-    method public int getImeOptions();
-    method public int getInputType();
-    method public int getMaxWidth();
-    method public java.lang.CharSequence getQuery();
-    method public java.lang.CharSequence getQueryHint();
-    method public android.support.v4.widget.CursorAdapter getSuggestionsAdapter();
-    method public boolean isIconfiedByDefault();
-    method public boolean isIconified();
-    method public boolean isQueryRefinementEnabled();
-    method public boolean isSubmitButtonEnabled();
-    method public void onActionViewCollapsed();
-    method public void onActionViewExpanded();
-    method public void setIconified(boolean);
-    method public void setIconifiedByDefault(boolean);
-    method public void setImeOptions(int);
-    method public void setInputType(int);
-    method public void setMaxWidth(int);
-    method public void setOnCloseListener(android.support.v7.widget.SearchView.OnCloseListener);
-    method public void setOnQueryTextFocusChangeListener(android.view.View.OnFocusChangeListener);
-    method public void setOnQueryTextListener(android.support.v7.widget.SearchView.OnQueryTextListener);
-    method public void setOnSearchClickListener(android.view.View.OnClickListener);
-    method public void setOnSuggestionListener(android.support.v7.widget.SearchView.OnSuggestionListener);
-    method public void setQuery(java.lang.CharSequence, boolean);
-    method public void setQueryHint(java.lang.CharSequence);
-    method public void setQueryRefinementEnabled(boolean);
-    method public void setSearchableInfo(android.app.SearchableInfo);
-    method public void setSubmitButtonEnabled(boolean);
-    method public void setSuggestionsAdapter(android.support.v4.widget.CursorAdapter);
-  }
-
-  public static abstract interface SearchView.OnCloseListener {
-    method public abstract boolean onClose();
-  }
-
-  public static abstract interface SearchView.OnQueryTextListener {
-    method public abstract boolean onQueryTextChange(java.lang.String);
-    method public abstract boolean onQueryTextSubmit(java.lang.String);
-  }
-
-  public static abstract interface SearchView.OnSuggestionListener {
-    method public abstract boolean onSuggestionClick(int);
-    method public abstract boolean onSuggestionSelect(int);
-  }
-
-  public class ShareActionProvider extends android.support.v4.view.ActionProvider {
-    ctor public ShareActionProvider(android.content.Context);
-    method public android.view.View onCreateActionView();
-    method public void setOnShareTargetSelectedListener(android.support.v7.widget.ShareActionProvider.OnShareTargetSelectedListener);
-    method public void setShareHistoryFileName(java.lang.String);
-    method public void setShareIntent(android.content.Intent);
-    field public static final java.lang.String DEFAULT_SHARE_HISTORY_FILE_NAME = "share_history.xml";
-  }
-
-  public static abstract interface ShareActionProvider.OnShareTargetSelectedListener {
-    method public abstract boolean onShareTargetSelected(android.support.v7.widget.ShareActionProvider, android.content.Intent);
-  }
-
-  public class SwitchCompat extends android.widget.CompoundButton {
-    ctor public SwitchCompat(android.content.Context);
-    ctor public SwitchCompat(android.content.Context, android.util.AttributeSet);
-    ctor public SwitchCompat(android.content.Context, android.util.AttributeSet, int);
-    method public boolean getShowText();
-    method public boolean getSplitTrack();
-    method public int getSwitchMinWidth();
-    method public int getSwitchPadding();
-    method public java.lang.CharSequence getTextOff();
-    method public java.lang.CharSequence getTextOn();
-    method public android.graphics.drawable.Drawable getThumbDrawable();
-    method public int getThumbTextPadding();
-    method public android.graphics.drawable.Drawable getTrackDrawable();
-    method public void onMeasure(int, int);
-    method public void setShowText(boolean);
-    method public void setSplitTrack(boolean);
-    method public void setSwitchMinWidth(int);
-    method public void setSwitchPadding(int);
-    method public void setSwitchTextAppearance(android.content.Context, int);
-    method public void setSwitchTypeface(android.graphics.Typeface, int);
-    method public void setSwitchTypeface(android.graphics.Typeface);
-    method public void setTextOff(java.lang.CharSequence);
-    method public void setTextOn(java.lang.CharSequence);
-    method public void setThumbDrawable(android.graphics.drawable.Drawable);
-    method public void setThumbResource(int);
-    method public void setThumbTextPadding(int);
-    method public void setTrackDrawable(android.graphics.drawable.Drawable);
-    method public void setTrackResource(int);
-  }
-
-  public class Toolbar extends android.view.ViewGroup {
-    ctor public Toolbar(android.content.Context);
-    ctor public Toolbar(android.content.Context, android.util.AttributeSet);
-    ctor public Toolbar(android.content.Context, android.util.AttributeSet, int);
-    method public void collapseActionView();
-    method public void dismissPopupMenus();
-    method public int getContentInsetEnd();
-    method public int getContentInsetLeft();
-    method public int getContentInsetRight();
-    method public int getContentInsetStart();
-    method public android.graphics.drawable.Drawable getLogo();
-    method public java.lang.CharSequence getLogoDescription();
-    method public android.view.Menu getMenu();
-    method public java.lang.CharSequence getNavigationContentDescription();
-    method public android.graphics.drawable.Drawable getNavigationIcon();
-    method public int getPopupTheme();
-    method public java.lang.CharSequence getSubtitle();
-    method public java.lang.CharSequence getTitle();
-    method public boolean hasExpandedActionView();
-    method public boolean hideOverflowMenu();
-    method public void inflateMenu(int);
-    method public boolean isOverflowMenuShowing();
-    method protected void onLayout(boolean, int, int, int, int);
-    method public void setContentInsetsAbsolute(int, int);
-    method public void setContentInsetsRelative(int, int);
-    method public void setLogo(int);
-    method public void setLogo(android.graphics.drawable.Drawable);
-    method public void setLogoDescription(int);
-    method public void setLogoDescription(java.lang.CharSequence);
-    method public void setNavigationContentDescription(int);
-    method public void setNavigationContentDescription(java.lang.CharSequence);
-    method public void setNavigationIcon(int);
-    method public void setNavigationIcon(android.graphics.drawable.Drawable);
-    method public void setNavigationOnClickListener(android.view.View.OnClickListener);
-    method public void setOnMenuItemClickListener(android.support.v7.widget.Toolbar.OnMenuItemClickListener);
-    method public void setPopupTheme(int);
-    method public void setSubtitle(int);
-    method public void setSubtitle(java.lang.CharSequence);
-    method public void setSubtitleTextAppearance(android.content.Context, int);
-    method public void setSubtitleTextColor(int);
-    method public void setTitle(int);
-    method public void setTitle(java.lang.CharSequence);
-    method public void setTitleTextAppearance(android.content.Context, int);
-    method public void setTitleTextColor(int);
-    method public boolean showOverflowMenu();
-  }
-
-  public static class Toolbar.LayoutParams extends android.support.v7.app.ActionBar.LayoutParams {
-    ctor public Toolbar.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public Toolbar.LayoutParams(int, int);
-    ctor public Toolbar.LayoutParams(int, int, int);
-    ctor public Toolbar.LayoutParams(int);
-    ctor public Toolbar.LayoutParams(android.support.v7.widget.Toolbar.LayoutParams);
-    ctor public Toolbar.LayoutParams(android.support.v7.app.ActionBar.LayoutParams);
-    ctor public Toolbar.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public Toolbar.LayoutParams(android.view.ViewGroup.LayoutParams);
-  }
-
-  public static abstract interface Toolbar.OnMenuItemClickListener {
-    method public abstract boolean onMenuItemClick(android.view.MenuItem);
-  }
-
-}
-
diff --git a/v7/appcompat/api/22.1.0.txt b/v7/appcompat/api/22.1.0.txt
deleted file mode 100644
index 995eaf9..0000000
--- a/v7/appcompat/api/22.1.0.txt
+++ /dev/null
@@ -1,691 +0,0 @@
-package android.support.v7.app {
-
-  public abstract class ActionBar {
-    ctor public ActionBar();
-    method public abstract void addOnMenuVisibilityListener(android.support.v7.app.ActionBar.OnMenuVisibilityListener);
-    method public abstract deprecated void addTab(android.support.v7.app.ActionBar.Tab);
-    method public abstract deprecated void addTab(android.support.v7.app.ActionBar.Tab, boolean);
-    method public abstract deprecated void addTab(android.support.v7.app.ActionBar.Tab, int);
-    method public abstract deprecated void addTab(android.support.v7.app.ActionBar.Tab, int, boolean);
-    method public abstract android.view.View getCustomView();
-    method public abstract int getDisplayOptions();
-    method public float getElevation();
-    method public abstract int getHeight();
-    method public int getHideOffset();
-    method public abstract deprecated int getNavigationItemCount();
-    method public abstract deprecated int getNavigationMode();
-    method public abstract deprecated int getSelectedNavigationIndex();
-    method public abstract deprecated android.support.v7.app.ActionBar.Tab getSelectedTab();
-    method public abstract java.lang.CharSequence getSubtitle();
-    method public abstract deprecated android.support.v7.app.ActionBar.Tab getTabAt(int);
-    method public abstract deprecated int getTabCount();
-    method public android.content.Context getThemedContext();
-    method public abstract java.lang.CharSequence getTitle();
-    method public abstract void hide();
-    method public boolean isHideOnContentScrollEnabled();
-    method public abstract boolean isShowing();
-    method public abstract deprecated android.support.v7.app.ActionBar.Tab newTab();
-    method public abstract deprecated void removeAllTabs();
-    method public abstract void removeOnMenuVisibilityListener(android.support.v7.app.ActionBar.OnMenuVisibilityListener);
-    method public abstract deprecated void removeTab(android.support.v7.app.ActionBar.Tab);
-    method public abstract deprecated void removeTabAt(int);
-    method public abstract deprecated void selectTab(android.support.v7.app.ActionBar.Tab);
-    method public abstract void setBackgroundDrawable(android.graphics.drawable.Drawable);
-    method public abstract void setCustomView(android.view.View);
-    method public abstract void setCustomView(android.view.View, android.support.v7.app.ActionBar.LayoutParams);
-    method public abstract void setCustomView(int);
-    method public abstract void setDisplayHomeAsUpEnabled(boolean);
-    method public abstract void setDisplayOptions(int);
-    method public abstract void setDisplayOptions(int, int);
-    method public abstract void setDisplayShowCustomEnabled(boolean);
-    method public abstract void setDisplayShowHomeEnabled(boolean);
-    method public abstract void setDisplayShowTitleEnabled(boolean);
-    method public abstract void setDisplayUseLogoEnabled(boolean);
-    method public void setElevation(float);
-    method public void setHideOffset(int);
-    method public void setHideOnContentScrollEnabled(boolean);
-    method public void setHomeActionContentDescription(java.lang.CharSequence);
-    method public void setHomeActionContentDescription(int);
-    method public void setHomeAsUpIndicator(android.graphics.drawable.Drawable);
-    method public void setHomeAsUpIndicator(int);
-    method public void setHomeButtonEnabled(boolean);
-    method public abstract void setIcon(int);
-    method public abstract void setIcon(android.graphics.drawable.Drawable);
-    method public abstract deprecated void setListNavigationCallbacks(android.widget.SpinnerAdapter, android.support.v7.app.ActionBar.OnNavigationListener);
-    method public abstract void setLogo(int);
-    method public abstract void setLogo(android.graphics.drawable.Drawable);
-    method public abstract deprecated void setNavigationMode(int);
-    method public abstract deprecated void setSelectedNavigationItem(int);
-    method public void setSplitBackgroundDrawable(android.graphics.drawable.Drawable);
-    method public void setStackedBackgroundDrawable(android.graphics.drawable.Drawable);
-    method public abstract void setSubtitle(java.lang.CharSequence);
-    method public abstract void setSubtitle(int);
-    method public abstract void setTitle(java.lang.CharSequence);
-    method public abstract void setTitle(int);
-    method public abstract void show();
-    field public static final int DISPLAY_HOME_AS_UP = 4; // 0x4
-    field public static final int DISPLAY_SHOW_CUSTOM = 16; // 0x10
-    field public static final int DISPLAY_SHOW_HOME = 2; // 0x2
-    field public static final int DISPLAY_SHOW_TITLE = 8; // 0x8
-    field public static final int DISPLAY_USE_LOGO = 1; // 0x1
-    field public static final deprecated int NAVIGATION_MODE_LIST = 1; // 0x1
-    field public static final deprecated int NAVIGATION_MODE_STANDARD = 0; // 0x0
-    field public static final deprecated int NAVIGATION_MODE_TABS = 2; // 0x2
-  }
-
-  public static class ActionBar.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
-    ctor public ActionBar.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public ActionBar.LayoutParams(int, int);
-    ctor public ActionBar.LayoutParams(int, int, int);
-    ctor public ActionBar.LayoutParams(int);
-    ctor public ActionBar.LayoutParams(android.support.v7.app.ActionBar.LayoutParams);
-    ctor public ActionBar.LayoutParams(android.view.ViewGroup.LayoutParams);
-    field public int gravity;
-  }
-
-  public static abstract interface ActionBar.OnMenuVisibilityListener {
-    method public abstract void onMenuVisibilityChanged(boolean);
-  }
-
-  public static abstract deprecated interface ActionBar.OnNavigationListener {
-    method public abstract boolean onNavigationItemSelected(int, long);
-  }
-
-  public static abstract deprecated class ActionBar.Tab {
-    ctor public ActionBar.Tab();
-    method public abstract java.lang.CharSequence getContentDescription();
-    method public abstract android.view.View getCustomView();
-    method public abstract android.graphics.drawable.Drawable getIcon();
-    method public abstract int getPosition();
-    method public abstract java.lang.Object getTag();
-    method public abstract java.lang.CharSequence getText();
-    method public abstract void select();
-    method public abstract android.support.v7.app.ActionBar.Tab setContentDescription(int);
-    method public abstract android.support.v7.app.ActionBar.Tab setContentDescription(java.lang.CharSequence);
-    method public abstract android.support.v7.app.ActionBar.Tab setCustomView(android.view.View);
-    method public abstract android.support.v7.app.ActionBar.Tab setCustomView(int);
-    method public abstract android.support.v7.app.ActionBar.Tab setIcon(android.graphics.drawable.Drawable);
-    method public abstract android.support.v7.app.ActionBar.Tab setIcon(int);
-    method public abstract android.support.v7.app.ActionBar.Tab setTabListener(android.support.v7.app.ActionBar.TabListener);
-    method public abstract android.support.v7.app.ActionBar.Tab setTag(java.lang.Object);
-    method public abstract android.support.v7.app.ActionBar.Tab setText(java.lang.CharSequence);
-    method public abstract android.support.v7.app.ActionBar.Tab setText(int);
-    field public static final int INVALID_POSITION = -1; // 0xffffffff
-  }
-
-  public static abstract deprecated interface ActionBar.TabListener {
-    method public abstract void onTabReselected(android.support.v7.app.ActionBar.Tab, android.support.v4.app.FragmentTransaction);
-    method public abstract void onTabSelected(android.support.v7.app.ActionBar.Tab, android.support.v4.app.FragmentTransaction);
-    method public abstract void onTabUnselected(android.support.v7.app.ActionBar.Tab, android.support.v4.app.FragmentTransaction);
-  }
-
-  public deprecated class ActionBarActivity extends android.support.v7.app.AppCompatActivity {
-    ctor public ActionBarActivity();
-  }
-
-  public class ActionBarDrawerToggle implements android.support.v4.widget.DrawerLayout.DrawerListener {
-    ctor public ActionBarDrawerToggle(android.app.Activity, android.support.v4.widget.DrawerLayout, int, int);
-    ctor public ActionBarDrawerToggle(android.app.Activity, android.support.v4.widget.DrawerLayout, android.support.v7.widget.Toolbar, int, int);
-    method public android.view.View.OnClickListener getToolbarNavigationClickListener();
-    method public boolean isDrawerIndicatorEnabled();
-    method public void onConfigurationChanged(android.content.res.Configuration);
-    method public void onDrawerClosed(android.view.View);
-    method public void onDrawerOpened(android.view.View);
-    method public void onDrawerSlide(android.view.View, float);
-    method public void onDrawerStateChanged(int);
-    method public boolean onOptionsItemSelected(android.view.MenuItem);
-    method public void setDrawerIndicatorEnabled(boolean);
-    method public void setHomeAsUpIndicator(android.graphics.drawable.Drawable);
-    method public void setHomeAsUpIndicator(int);
-    method public void setToolbarNavigationClickListener(android.view.View.OnClickListener);
-    method public void syncState();
-  }
-
-  public static abstract interface ActionBarDrawerToggle.Delegate {
-    method public abstract android.content.Context getActionBarThemedContext();
-    method public abstract android.graphics.drawable.Drawable getThemeUpIndicator();
-    method public abstract boolean isNavigationVisible();
-    method public abstract void setActionBarDescription(int);
-    method public abstract void setActionBarUpIndicator(android.graphics.drawable.Drawable, int);
-  }
-
-  public static abstract interface ActionBarDrawerToggle.DelegateProvider {
-    method public abstract android.support.v7.app.ActionBarDrawerToggle.Delegate getDrawerToggleDelegate();
-  }
-
-  public class AlertDialog extends android.support.v7.app.AppCompatDialog implements android.content.DialogInterface {
-    ctor protected AlertDialog(android.content.Context);
-    ctor protected AlertDialog(android.content.Context, int);
-    ctor protected AlertDialog(android.content.Context, boolean, android.content.DialogInterface.OnCancelListener);
-    method public android.widget.Button getButton(int);
-    method public android.widget.ListView getListView();
-    method public void setButton(int, java.lang.CharSequence, android.os.Message);
-    method public void setButton(int, java.lang.CharSequence, android.content.DialogInterface.OnClickListener);
-    method public void setCustomTitle(android.view.View);
-    method public void setIcon(int);
-    method public void setIcon(android.graphics.drawable.Drawable);
-    method public void setIconAttribute(int);
-    method public void setMessage(java.lang.CharSequence);
-    method public void setView(android.view.View);
-    method public void setView(android.view.View, int, int, int, int);
-  }
-
-  public static class AlertDialog.Builder {
-    ctor public AlertDialog.Builder(android.content.Context);
-    ctor public AlertDialog.Builder(android.content.Context, int);
-    method public android.support.v7.app.AlertDialog create();
-    method public android.content.Context getContext();
-    method public android.support.v7.app.AlertDialog.Builder setAdapter(android.widget.ListAdapter, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setCancelable(boolean);
-    method public android.support.v7.app.AlertDialog.Builder setCursor(android.database.Cursor, android.content.DialogInterface.OnClickListener, java.lang.String);
-    method public android.support.v7.app.AlertDialog.Builder setCustomTitle(android.view.View);
-    method public android.support.v7.app.AlertDialog.Builder setIcon(int);
-    method public android.support.v7.app.AlertDialog.Builder setIcon(android.graphics.drawable.Drawable);
-    method public android.support.v7.app.AlertDialog.Builder setIconAttribute(int);
-    method public android.support.v7.app.AlertDialog.Builder setInverseBackgroundForced(boolean);
-    method public android.support.v7.app.AlertDialog.Builder setItems(int, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setItems(java.lang.CharSequence[], android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setMessage(int);
-    method public android.support.v7.app.AlertDialog.Builder setMessage(java.lang.CharSequence);
-    method public android.support.v7.app.AlertDialog.Builder setMultiChoiceItems(int, boolean[], android.content.DialogInterface.OnMultiChoiceClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setMultiChoiceItems(java.lang.CharSequence[], boolean[], android.content.DialogInterface.OnMultiChoiceClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setMultiChoiceItems(android.database.Cursor, java.lang.String, java.lang.String, android.content.DialogInterface.OnMultiChoiceClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setNegativeButton(int, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setNegativeButton(java.lang.CharSequence, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setNeutralButton(int, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setNeutralButton(java.lang.CharSequence, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setOnCancelListener(android.content.DialogInterface.OnCancelListener);
-    method public android.support.v7.app.AlertDialog.Builder setOnDismissListener(android.content.DialogInterface.OnDismissListener);
-    method public android.support.v7.app.AlertDialog.Builder setOnItemSelectedListener(android.widget.AdapterView.OnItemSelectedListener);
-    method public android.support.v7.app.AlertDialog.Builder setOnKeyListener(android.content.DialogInterface.OnKeyListener);
-    method public android.support.v7.app.AlertDialog.Builder setPositiveButton(int, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setPositiveButton(java.lang.CharSequence, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setSingleChoiceItems(int, int, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setSingleChoiceItems(android.database.Cursor, int, java.lang.String, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setSingleChoiceItems(java.lang.CharSequence[], int, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setSingleChoiceItems(android.widget.ListAdapter, int, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setTitle(int);
-    method public android.support.v7.app.AlertDialog.Builder setTitle(java.lang.CharSequence);
-    method public android.support.v7.app.AlertDialog.Builder setView(int);
-    method public android.support.v7.app.AlertDialog.Builder setView(android.view.View);
-    method public android.support.v7.app.AlertDialog show();
-  }
-
-  public class AppCompatActivity extends android.support.v4.app.FragmentActivity implements android.support.v7.app.ActionBarDrawerToggle.DelegateProvider android.support.v7.app.AppCompatCallback {
-    ctor public AppCompatActivity();
-    method public android.support.v7.app.AppCompatDelegate getDelegate();
-    method public android.support.v7.app.ActionBarDrawerToggle.Delegate getDrawerToggleDelegate();
-    method public android.support.v7.app.ActionBar getSupportActionBar();
-    method public android.content.Intent getSupportParentActivityIntent();
-    method public void onCreateSupportNavigateUpTaskStack(android.support.v4.app.TaskStackBuilder);
-    method public final boolean onMenuItemSelected(int, android.view.MenuItem);
-    method public void onPrepareSupportNavigateUpTaskStack(android.support.v4.app.TaskStackBuilder);
-    method public void onSupportActionModeFinished(android.support.v7.view.ActionMode);
-    method public void onSupportActionModeStarted(android.support.v7.view.ActionMode);
-    method public deprecated void onSupportContentChanged();
-    method public boolean onSupportNavigateUp();
-    method public void setSupportActionBar(android.support.v7.widget.Toolbar);
-    method public deprecated void setSupportProgress(int);
-    method public deprecated void setSupportProgressBarIndeterminate(boolean);
-    method public deprecated void setSupportProgressBarIndeterminateVisibility(boolean);
-    method public deprecated void setSupportProgressBarVisibility(boolean);
-    method public android.support.v7.view.ActionMode startSupportActionMode(android.support.v7.view.ActionMode.Callback);
-    method public void supportNavigateUpTo(android.content.Intent);
-    method public boolean supportRequestWindowFeature(int);
-    method public boolean supportShouldUpRecreateTask(android.content.Intent);
-  }
-
-  public abstract interface AppCompatCallback {
-    method public abstract void onSupportActionModeFinished(android.support.v7.view.ActionMode);
-    method public abstract void onSupportActionModeStarted(android.support.v7.view.ActionMode);
-  }
-
-  public abstract class AppCompatDelegate {
-    method public abstract void addContentView(android.view.View, android.view.ViewGroup.LayoutParams);
-    method public static android.support.v7.app.AppCompatDelegate create(android.app.Activity, android.support.v7.app.AppCompatCallback);
-    method public static android.support.v7.app.AppCompatDelegate create(android.app.Dialog, android.support.v7.app.AppCompatCallback);
-    method public abstract android.view.View createView(android.view.View, java.lang.String, android.content.Context, android.util.AttributeSet);
-    method public abstract android.support.v7.app.ActionBarDrawerToggle.Delegate getDrawerToggleDelegate();
-    method public abstract android.view.MenuInflater getMenuInflater();
-    method public abstract android.support.v7.app.ActionBar getSupportActionBar();
-    method public abstract void installViewFactory();
-    method public abstract void invalidateOptionsMenu();
-    method public abstract void onConfigurationChanged(android.content.res.Configuration);
-    method public abstract void onCreate(android.os.Bundle);
-    method public abstract void onDestroy();
-    method public abstract void onPostCreate(android.os.Bundle);
-    method public abstract void onPostResume();
-    method public abstract void onStop();
-    method public abstract boolean requestWindowFeature(int);
-    method public abstract void setContentView(android.view.View);
-    method public abstract void setContentView(int);
-    method public abstract void setContentView(android.view.View, android.view.ViewGroup.LayoutParams);
-    method public abstract void setSupportActionBar(android.support.v7.widget.Toolbar);
-    method public abstract void setTitle(java.lang.CharSequence);
-    method public abstract android.support.v7.view.ActionMode startSupportActionMode(android.support.v7.view.ActionMode.Callback);
-  }
-
-  public class AppCompatDialog extends android.app.Dialog implements android.support.v7.app.AppCompatCallback {
-    ctor public AppCompatDialog(android.content.Context);
-    ctor public AppCompatDialog(android.content.Context, int);
-    ctor protected AppCompatDialog(android.content.Context, boolean, android.content.DialogInterface.OnCancelListener);
-    method public android.support.v7.app.AppCompatDelegate getDelegate();
-    method public android.support.v7.app.ActionBar getSupportActionBar();
-    method public void onSupportActionModeFinished(android.support.v7.view.ActionMode);
-    method public void onSupportActionModeStarted(android.support.v7.view.ActionMode);
-    method public boolean supportRequestWindowFeature(int);
-  }
-
-}
-
-package android.support.v7.view {
-
-  public abstract class ActionMode {
-    ctor public ActionMode();
-    method public abstract void finish();
-    method public abstract android.view.View getCustomView();
-    method public abstract android.view.Menu getMenu();
-    method public abstract android.view.MenuInflater getMenuInflater();
-    method public abstract java.lang.CharSequence getSubtitle();
-    method public java.lang.Object getTag();
-    method public abstract java.lang.CharSequence getTitle();
-    method public boolean getTitleOptionalHint();
-    method public abstract void invalidate();
-    method public boolean isTitleOptional();
-    method public abstract void setCustomView(android.view.View);
-    method public abstract void setSubtitle(java.lang.CharSequence);
-    method public abstract void setSubtitle(int);
-    method public void setTag(java.lang.Object);
-    method public abstract void setTitle(java.lang.CharSequence);
-    method public abstract void setTitle(int);
-    method public void setTitleOptionalHint(boolean);
-  }
-
-  public static abstract interface ActionMode.Callback {
-    method public abstract boolean onActionItemClicked(android.support.v7.view.ActionMode, android.view.MenuItem);
-    method public abstract boolean onCreateActionMode(android.support.v7.view.ActionMode, android.view.Menu);
-    method public abstract void onDestroyActionMode(android.support.v7.view.ActionMode);
-    method public abstract boolean onPrepareActionMode(android.support.v7.view.ActionMode, android.view.Menu);
-  }
-
-  public abstract interface CollapsibleActionView {
-    method public abstract void onActionViewCollapsed();
-    method public abstract void onActionViewExpanded();
-  }
-
-}
-
-package android.support.v7.widget {
-
-  public class ActionMenuView extends android.support.v7.widget.LinearLayoutCompat {
-    ctor public ActionMenuView(android.content.Context);
-    ctor public ActionMenuView(android.content.Context, android.util.AttributeSet);
-    method public void dismissPopupMenus();
-    method public android.view.Menu getMenu();
-    method public int getPopupTheme();
-    method public boolean hideOverflowMenu();
-    method public boolean isOverflowMenuShowing();
-    method public void onConfigurationChanged(android.content.res.Configuration);
-    method public void onDetachedFromWindow();
-    method public void setOnMenuItemClickListener(android.support.v7.widget.ActionMenuView.OnMenuItemClickListener);
-    method public void setPopupTheme(int);
-    method public boolean showOverflowMenu();
-  }
-
-  public static class ActionMenuView.LayoutParams extends android.support.v7.widget.LinearLayoutCompat.LayoutParams {
-    ctor public ActionMenuView.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public ActionMenuView.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public ActionMenuView.LayoutParams(android.support.v7.widget.ActionMenuView.LayoutParams);
-    ctor public ActionMenuView.LayoutParams(int, int);
-    field public int cellsUsed;
-    field public boolean expandable;
-    field public int extraPixels;
-    field public boolean isOverflowButton;
-    field public boolean preventEdgeOffset;
-  }
-
-  public static abstract interface ActionMenuView.OnMenuItemClickListener {
-    method public abstract boolean onMenuItemClick(android.view.MenuItem);
-  }
-
-  public class AppCompatAutoCompleteTextView extends android.widget.AutoCompleteTextView {
-    ctor public AppCompatAutoCompleteTextView(android.content.Context);
-    ctor public AppCompatAutoCompleteTextView(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatAutoCompleteTextView(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class AppCompatButton extends android.widget.Button {
-    ctor public AppCompatButton(android.content.Context);
-    ctor public AppCompatButton(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatButton(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class AppCompatCheckBox extends android.widget.CheckBox {
-    ctor public AppCompatCheckBox(android.content.Context);
-    ctor public AppCompatCheckBox(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatCheckBox(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class AppCompatCheckedTextView extends android.widget.CheckedTextView {
-    ctor public AppCompatCheckedTextView(android.content.Context);
-    ctor public AppCompatCheckedTextView(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatCheckedTextView(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class AppCompatEditText extends android.widget.EditText {
-    ctor public AppCompatEditText(android.content.Context);
-    ctor public AppCompatEditText(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatEditText(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class AppCompatMultiAutoCompleteTextView extends android.widget.MultiAutoCompleteTextView {
-    ctor public AppCompatMultiAutoCompleteTextView(android.content.Context);
-    ctor public AppCompatMultiAutoCompleteTextView(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatMultiAutoCompleteTextView(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class AppCompatRadioButton extends android.widget.RadioButton {
-    ctor public AppCompatRadioButton(android.content.Context);
-    ctor public AppCompatRadioButton(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatRadioButton(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class AppCompatRatingBar extends android.widget.RatingBar {
-    ctor public AppCompatRatingBar(android.content.Context);
-    ctor public AppCompatRatingBar(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatRatingBar(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class AppCompatSpinner extends android.widget.Spinner {
-    ctor public AppCompatSpinner(android.content.Context);
-    ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class AppCompatTextView extends android.widget.TextView {
-    ctor public AppCompatTextView(android.content.Context);
-    ctor public AppCompatTextView(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatTextView(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class LinearLayoutCompat extends android.view.ViewGroup {
-    ctor public LinearLayoutCompat(android.content.Context);
-    ctor public LinearLayoutCompat(android.content.Context, android.util.AttributeSet);
-    ctor public LinearLayoutCompat(android.content.Context, android.util.AttributeSet, int);
-    method public int getBaselineAlignedChildIndex();
-    method public android.graphics.drawable.Drawable getDividerDrawable();
-    method public int getDividerPadding();
-    method public int getOrientation();
-    method public int getShowDividers();
-    method public float getWeightSum();
-    method public boolean isBaselineAligned();
-    method public boolean isMeasureWithLargestChildEnabled();
-    method protected void onLayout(boolean, int, int, int, int);
-    method public void setBaselineAligned(boolean);
-    method public void setBaselineAlignedChildIndex(int);
-    method public void setDividerDrawable(android.graphics.drawable.Drawable);
-    method public void setDividerPadding(int);
-    method public void setGravity(int);
-    method public void setHorizontalGravity(int);
-    method public void setMeasureWithLargestChildEnabled(boolean);
-    method public void setOrientation(int);
-    method public void setShowDividers(int);
-    method public void setVerticalGravity(int);
-    method public void setWeightSum(float);
-    field public static final int HORIZONTAL = 0; // 0x0
-    field public static final int SHOW_DIVIDER_BEGINNING = 1; // 0x1
-    field public static final int SHOW_DIVIDER_END = 4; // 0x4
-    field public static final int SHOW_DIVIDER_MIDDLE = 2; // 0x2
-    field public static final int SHOW_DIVIDER_NONE = 0; // 0x0
-    field public static final int VERTICAL = 1; // 0x1
-  }
-
-  public static class LinearLayoutCompat.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
-    ctor public LinearLayoutCompat.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public LinearLayoutCompat.LayoutParams(int, int);
-    ctor public LinearLayoutCompat.LayoutParams(int, int, float);
-    ctor public LinearLayoutCompat.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public LinearLayoutCompat.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public LinearLayoutCompat.LayoutParams(android.support.v7.widget.LinearLayoutCompat.LayoutParams);
-    field public int gravity;
-    field public float weight;
-  }
-
-  public class ListPopupWindow {
-    ctor public ListPopupWindow(android.content.Context);
-    ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet);
-    ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet, int);
-    ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet, int, int);
-    method public void clearListSelection();
-    method public android.view.View.OnTouchListener createDragToOpenListener(android.view.View);
-    method public void dismiss();
-    method public android.view.View getAnchorView();
-    method public int getAnimationStyle();
-    method public android.graphics.drawable.Drawable getBackground();
-    method public int getHeight();
-    method public int getHorizontalOffset();
-    method public int getInputMethodMode();
-    method public android.widget.ListView getListView();
-    method public int getPromptPosition();
-    method public java.lang.Object getSelectedItem();
-    method public long getSelectedItemId();
-    method public int getSelectedItemPosition();
-    method public android.view.View getSelectedView();
-    method public int getSoftInputMode();
-    method public int getVerticalOffset();
-    method public int getWidth();
-    method public boolean isInputMethodNotNeeded();
-    method public boolean isModal();
-    method public boolean isShowing();
-    method public boolean onKeyDown(int, android.view.KeyEvent);
-    method public boolean onKeyPreIme(int, android.view.KeyEvent);
-    method public boolean onKeyUp(int, android.view.KeyEvent);
-    method public boolean performItemClick(int);
-    method public void postShow();
-    method public void setAdapter(android.widget.ListAdapter);
-    method public void setAnchorView(android.view.View);
-    method public void setAnimationStyle(int);
-    method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
-    method public void setContentWidth(int);
-    method public void setDropDownGravity(int);
-    method public void setHeight(int);
-    method public void setHorizontalOffset(int);
-    method public void setInputMethodMode(int);
-    method public void setListSelector(android.graphics.drawable.Drawable);
-    method public void setModal(boolean);
-    method public void setOnDismissListener(android.widget.PopupWindow.OnDismissListener);
-    method public void setOnItemClickListener(android.widget.AdapterView.OnItemClickListener);
-    method public void setOnItemSelectedListener(android.widget.AdapterView.OnItemSelectedListener);
-    method public void setPromptPosition(int);
-    method public void setPromptView(android.view.View);
-    method public void setSelection(int);
-    method public void setSoftInputMode(int);
-    method public void setVerticalOffset(int);
-    method public void setWidth(int);
-    method public void show();
-    field public static final int INPUT_METHOD_FROM_FOCUSABLE = 0; // 0x0
-    field public static final int INPUT_METHOD_NEEDED = 1; // 0x1
-    field public static final int INPUT_METHOD_NOT_NEEDED = 2; // 0x2
-    field public static final int MATCH_PARENT = -1; // 0xffffffff
-    field public static final int POSITION_PROMPT_ABOVE = 0; // 0x0
-    field public static final int POSITION_PROMPT_BELOW = 1; // 0x1
-    field public static final int WRAP_CONTENT = -2; // 0xfffffffe
-  }
-
-  public class PopupMenu {
-    ctor public PopupMenu(android.content.Context, android.view.View);
-    ctor public PopupMenu(android.content.Context, android.view.View, int);
-    ctor public PopupMenu(android.content.Context, android.view.View, int, int, int);
-    method public void dismiss();
-    method public android.view.View.OnTouchListener getDragToOpenListener();
-    method public android.view.Menu getMenu();
-    method public android.view.MenuInflater getMenuInflater();
-    method public void inflate(int);
-    method public void setOnDismissListener(android.support.v7.widget.PopupMenu.OnDismissListener);
-    method public void setOnMenuItemClickListener(android.support.v7.widget.PopupMenu.OnMenuItemClickListener);
-    method public void show();
-  }
-
-  public static abstract interface PopupMenu.OnDismissListener {
-    method public abstract void onDismiss(android.support.v7.widget.PopupMenu);
-  }
-
-  public static abstract interface PopupMenu.OnMenuItemClickListener {
-    method public abstract boolean onMenuItemClick(android.view.MenuItem);
-  }
-
-  public class SearchView extends android.support.v7.widget.LinearLayoutCompat implements android.support.v7.view.CollapsibleActionView {
-    ctor public SearchView(android.content.Context);
-    ctor public SearchView(android.content.Context, android.util.AttributeSet);
-    ctor public SearchView(android.content.Context, android.util.AttributeSet, int);
-    method public int getImeOptions();
-    method public int getInputType();
-    method public int getMaxWidth();
-    method public java.lang.CharSequence getQuery();
-    method public java.lang.CharSequence getQueryHint();
-    method public android.support.v4.widget.CursorAdapter getSuggestionsAdapter();
-    method public boolean isIconfiedByDefault();
-    method public boolean isIconified();
-    method public boolean isQueryRefinementEnabled();
-    method public boolean isSubmitButtonEnabled();
-    method public void onActionViewCollapsed();
-    method public void onActionViewExpanded();
-    method public void setIconified(boolean);
-    method public void setIconifiedByDefault(boolean);
-    method public void setImeOptions(int);
-    method public void setInputType(int);
-    method public void setMaxWidth(int);
-    method public void setOnCloseListener(android.support.v7.widget.SearchView.OnCloseListener);
-    method public void setOnQueryTextFocusChangeListener(android.view.View.OnFocusChangeListener);
-    method public void setOnQueryTextListener(android.support.v7.widget.SearchView.OnQueryTextListener);
-    method public void setOnSearchClickListener(android.view.View.OnClickListener);
-    method public void setOnSuggestionListener(android.support.v7.widget.SearchView.OnSuggestionListener);
-    method public void setQuery(java.lang.CharSequence, boolean);
-    method public void setQueryHint(java.lang.CharSequence);
-    method public void setQueryRefinementEnabled(boolean);
-    method public void setSearchableInfo(android.app.SearchableInfo);
-    method public void setSubmitButtonEnabled(boolean);
-    method public void setSuggestionsAdapter(android.support.v4.widget.CursorAdapter);
-  }
-
-  public static abstract interface SearchView.OnCloseListener {
-    method public abstract boolean onClose();
-  }
-
-  public static abstract interface SearchView.OnQueryTextListener {
-    method public abstract boolean onQueryTextChange(java.lang.String);
-    method public abstract boolean onQueryTextSubmit(java.lang.String);
-  }
-
-  public static abstract interface SearchView.OnSuggestionListener {
-    method public abstract boolean onSuggestionClick(int);
-    method public abstract boolean onSuggestionSelect(int);
-  }
-
-  public class ShareActionProvider extends android.support.v4.view.ActionProvider {
-    ctor public ShareActionProvider(android.content.Context);
-    method public android.view.View onCreateActionView();
-    method public void setOnShareTargetSelectedListener(android.support.v7.widget.ShareActionProvider.OnShareTargetSelectedListener);
-    method public void setShareHistoryFileName(java.lang.String);
-    method public void setShareIntent(android.content.Intent);
-    field public static final java.lang.String DEFAULT_SHARE_HISTORY_FILE_NAME = "share_history.xml";
-  }
-
-  public static abstract interface ShareActionProvider.OnShareTargetSelectedListener {
-    method public abstract boolean onShareTargetSelected(android.support.v7.widget.ShareActionProvider, android.content.Intent);
-  }
-
-  public class SwitchCompat extends android.widget.CompoundButton {
-    ctor public SwitchCompat(android.content.Context);
-    ctor public SwitchCompat(android.content.Context, android.util.AttributeSet);
-    ctor public SwitchCompat(android.content.Context, android.util.AttributeSet, int);
-    method public boolean getShowText();
-    method public boolean getSplitTrack();
-    method public int getSwitchMinWidth();
-    method public int getSwitchPadding();
-    method public java.lang.CharSequence getTextOff();
-    method public java.lang.CharSequence getTextOn();
-    method public android.graphics.drawable.Drawable getThumbDrawable();
-    method public int getThumbTextPadding();
-    method public android.graphics.drawable.Drawable getTrackDrawable();
-    method public void onMeasure(int, int);
-    method public void setShowText(boolean);
-    method public void setSplitTrack(boolean);
-    method public void setSwitchMinWidth(int);
-    method public void setSwitchPadding(int);
-    method public void setSwitchTextAppearance(android.content.Context, int);
-    method public void setSwitchTypeface(android.graphics.Typeface, int);
-    method public void setSwitchTypeface(android.graphics.Typeface);
-    method public void setTextOff(java.lang.CharSequence);
-    method public void setTextOn(java.lang.CharSequence);
-    method public void setThumbDrawable(android.graphics.drawable.Drawable);
-    method public void setThumbResource(int);
-    method public void setThumbTextPadding(int);
-    method public void setTrackDrawable(android.graphics.drawable.Drawable);
-    method public void setTrackResource(int);
-  }
-
-  public class Toolbar extends android.view.ViewGroup {
-    ctor public Toolbar(android.content.Context);
-    ctor public Toolbar(android.content.Context, android.util.AttributeSet);
-    ctor public Toolbar(android.content.Context, android.util.AttributeSet, int);
-    method public void collapseActionView();
-    method public void dismissPopupMenus();
-    method public int getContentInsetEnd();
-    method public int getContentInsetLeft();
-    method public int getContentInsetRight();
-    method public int getContentInsetStart();
-    method public android.graphics.drawable.Drawable getLogo();
-    method public java.lang.CharSequence getLogoDescription();
-    method public android.view.Menu getMenu();
-    method public java.lang.CharSequence getNavigationContentDescription();
-    method public android.graphics.drawable.Drawable getNavigationIcon();
-    method public int getPopupTheme();
-    method public java.lang.CharSequence getSubtitle();
-    method public java.lang.CharSequence getTitle();
-    method public boolean hasExpandedActionView();
-    method public boolean hideOverflowMenu();
-    method public void inflateMenu(int);
-    method public boolean isOverflowMenuShowing();
-    method protected void onLayout(boolean, int, int, int, int);
-    method public void setContentInsetsAbsolute(int, int);
-    method public void setContentInsetsRelative(int, int);
-    method public void setLogo(int);
-    method public void setLogo(android.graphics.drawable.Drawable);
-    method public void setLogoDescription(int);
-    method public void setLogoDescription(java.lang.CharSequence);
-    method public void setNavigationContentDescription(int);
-    method public void setNavigationContentDescription(java.lang.CharSequence);
-    method public void setNavigationIcon(int);
-    method public void setNavigationIcon(android.graphics.drawable.Drawable);
-    method public void setNavigationOnClickListener(android.view.View.OnClickListener);
-    method public void setOnMenuItemClickListener(android.support.v7.widget.Toolbar.OnMenuItemClickListener);
-    method public void setPopupTheme(int);
-    method public void setSubtitle(int);
-    method public void setSubtitle(java.lang.CharSequence);
-    method public void setSubtitleTextAppearance(android.content.Context, int);
-    method public void setSubtitleTextColor(int);
-    method public void setTitle(int);
-    method public void setTitle(java.lang.CharSequence);
-    method public void setTitleTextAppearance(android.content.Context, int);
-    method public void setTitleTextColor(int);
-    method public boolean showOverflowMenu();
-  }
-
-  public static class Toolbar.LayoutParams extends android.support.v7.app.ActionBar.LayoutParams {
-    ctor public Toolbar.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public Toolbar.LayoutParams(int, int);
-    ctor public Toolbar.LayoutParams(int, int, int);
-    ctor public Toolbar.LayoutParams(int);
-    ctor public Toolbar.LayoutParams(android.support.v7.widget.Toolbar.LayoutParams);
-    ctor public Toolbar.LayoutParams(android.support.v7.app.ActionBar.LayoutParams);
-    ctor public Toolbar.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public Toolbar.LayoutParams(android.view.ViewGroup.LayoutParams);
-  }
-
-  public static abstract interface Toolbar.OnMenuItemClickListener {
-    method public abstract boolean onMenuItemClick(android.view.MenuItem);
-  }
-
-}
-
diff --git a/v7/appcompat/api/22.2.0.txt b/v7/appcompat/api/22.2.0.txt
deleted file mode 100644
index fae4450..0000000
--- a/v7/appcompat/api/22.2.0.txt
+++ /dev/null
@@ -1,1876 +0,0 @@
-package android.support.v7.app {
-
-  public abstract class ActionBar {
-    ctor public ActionBar();
-    method public abstract void addOnMenuVisibilityListener(android.support.v7.app.ActionBar.OnMenuVisibilityListener);
-    method public abstract deprecated void addTab(android.support.v7.app.ActionBar.Tab);
-    method public abstract deprecated void addTab(android.support.v7.app.ActionBar.Tab, boolean);
-    method public abstract deprecated void addTab(android.support.v7.app.ActionBar.Tab, int);
-    method public abstract deprecated void addTab(android.support.v7.app.ActionBar.Tab, int, boolean);
-    method public abstract android.view.View getCustomView();
-    method public abstract int getDisplayOptions();
-    method public float getElevation();
-    method public abstract int getHeight();
-    method public int getHideOffset();
-    method public abstract deprecated int getNavigationItemCount();
-    method public abstract deprecated int getNavigationMode();
-    method public abstract deprecated int getSelectedNavigationIndex();
-    method public abstract deprecated android.support.v7.app.ActionBar.Tab getSelectedTab();
-    method public abstract java.lang.CharSequence getSubtitle();
-    method public abstract deprecated android.support.v7.app.ActionBar.Tab getTabAt(int);
-    method public abstract deprecated int getTabCount();
-    method public android.content.Context getThemedContext();
-    method public abstract java.lang.CharSequence getTitle();
-    method public abstract void hide();
-    method public boolean isHideOnContentScrollEnabled();
-    method public abstract boolean isShowing();
-    method public abstract deprecated android.support.v7.app.ActionBar.Tab newTab();
-    method public abstract deprecated void removeAllTabs();
-    method public abstract void removeOnMenuVisibilityListener(android.support.v7.app.ActionBar.OnMenuVisibilityListener);
-    method public abstract deprecated void removeTab(android.support.v7.app.ActionBar.Tab);
-    method public abstract deprecated void removeTabAt(int);
-    method public abstract deprecated void selectTab(android.support.v7.app.ActionBar.Tab);
-    method public abstract void setBackgroundDrawable(android.graphics.drawable.Drawable);
-    method public abstract void setCustomView(android.view.View);
-    method public abstract void setCustomView(android.view.View, android.support.v7.app.ActionBar.LayoutParams);
-    method public abstract void setCustomView(int);
-    method public abstract void setDisplayHomeAsUpEnabled(boolean);
-    method public abstract void setDisplayOptions(int);
-    method public abstract void setDisplayOptions(int, int);
-    method public abstract void setDisplayShowCustomEnabled(boolean);
-    method public abstract void setDisplayShowHomeEnabled(boolean);
-    method public abstract void setDisplayShowTitleEnabled(boolean);
-    method public abstract void setDisplayUseLogoEnabled(boolean);
-    method public void setElevation(float);
-    method public void setHideOffset(int);
-    method public void setHideOnContentScrollEnabled(boolean);
-    method public void setHomeActionContentDescription(java.lang.CharSequence);
-    method public void setHomeActionContentDescription(int);
-    method public void setHomeAsUpIndicator(android.graphics.drawable.Drawable);
-    method public void setHomeAsUpIndicator(int);
-    method public void setHomeButtonEnabled(boolean);
-    method public abstract void setIcon(int);
-    method public abstract void setIcon(android.graphics.drawable.Drawable);
-    method public abstract deprecated void setListNavigationCallbacks(android.widget.SpinnerAdapter, android.support.v7.app.ActionBar.OnNavigationListener);
-    method public abstract void setLogo(int);
-    method public abstract void setLogo(android.graphics.drawable.Drawable);
-    method public abstract deprecated void setNavigationMode(int);
-    method public abstract deprecated void setSelectedNavigationItem(int);
-    method public void setSplitBackgroundDrawable(android.graphics.drawable.Drawable);
-    method public void setStackedBackgroundDrawable(android.graphics.drawable.Drawable);
-    method public abstract void setSubtitle(java.lang.CharSequence);
-    method public abstract void setSubtitle(int);
-    method public abstract void setTitle(java.lang.CharSequence);
-    method public abstract void setTitle(int);
-    method public abstract void show();
-    field public static final int DISPLAY_HOME_AS_UP = 4; // 0x4
-    field public static final int DISPLAY_SHOW_CUSTOM = 16; // 0x10
-    field public static final int DISPLAY_SHOW_HOME = 2; // 0x2
-    field public static final int DISPLAY_SHOW_TITLE = 8; // 0x8
-    field public static final int DISPLAY_USE_LOGO = 1; // 0x1
-    field public static final deprecated int NAVIGATION_MODE_LIST = 1; // 0x1
-    field public static final deprecated int NAVIGATION_MODE_STANDARD = 0; // 0x0
-    field public static final deprecated int NAVIGATION_MODE_TABS = 2; // 0x2
-  }
-
-  public static class ActionBar.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
-    ctor public ActionBar.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public ActionBar.LayoutParams(int, int);
-    ctor public ActionBar.LayoutParams(int, int, int);
-    ctor public ActionBar.LayoutParams(int);
-    ctor public ActionBar.LayoutParams(android.support.v7.app.ActionBar.LayoutParams);
-    ctor public ActionBar.LayoutParams(android.view.ViewGroup.LayoutParams);
-    field public int gravity;
-  }
-
-  public static abstract interface ActionBar.OnMenuVisibilityListener {
-    method public abstract void onMenuVisibilityChanged(boolean);
-  }
-
-  public static abstract deprecated interface ActionBar.OnNavigationListener {
-    method public abstract boolean onNavigationItemSelected(int, long);
-  }
-
-  public static abstract deprecated class ActionBar.Tab {
-    ctor public ActionBar.Tab();
-    method public abstract java.lang.CharSequence getContentDescription();
-    method public abstract android.view.View getCustomView();
-    method public abstract android.graphics.drawable.Drawable getIcon();
-    method public abstract int getPosition();
-    method public abstract java.lang.Object getTag();
-    method public abstract java.lang.CharSequence getText();
-    method public abstract void select();
-    method public abstract android.support.v7.app.ActionBar.Tab setContentDescription(int);
-    method public abstract android.support.v7.app.ActionBar.Tab setContentDescription(java.lang.CharSequence);
-    method public abstract android.support.v7.app.ActionBar.Tab setCustomView(android.view.View);
-    method public abstract android.support.v7.app.ActionBar.Tab setCustomView(int);
-    method public abstract android.support.v7.app.ActionBar.Tab setIcon(android.graphics.drawable.Drawable);
-    method public abstract android.support.v7.app.ActionBar.Tab setIcon(int);
-    method public abstract android.support.v7.app.ActionBar.Tab setTabListener(android.support.v7.app.ActionBar.TabListener);
-    method public abstract android.support.v7.app.ActionBar.Tab setTag(java.lang.Object);
-    method public abstract android.support.v7.app.ActionBar.Tab setText(java.lang.CharSequence);
-    method public abstract android.support.v7.app.ActionBar.Tab setText(int);
-    field public static final int INVALID_POSITION = -1; // 0xffffffff
-  }
-
-  public static abstract deprecated interface ActionBar.TabListener {
-    method public abstract void onTabReselected(android.support.v7.app.ActionBar.Tab, android.support.v4.app.FragmentTransaction);
-    method public abstract void onTabSelected(android.support.v7.app.ActionBar.Tab, android.support.v4.app.FragmentTransaction);
-    method public abstract void onTabUnselected(android.support.v7.app.ActionBar.Tab, android.support.v4.app.FragmentTransaction);
-  }
-
-  public deprecated class ActionBarActivity extends android.support.v7.app.AppCompatActivity {
-    ctor public ActionBarActivity();
-  }
-
-  public class ActionBarDrawerToggle implements android.support.v4.widget.DrawerLayout.DrawerListener {
-    ctor public ActionBarDrawerToggle(android.app.Activity, android.support.v4.widget.DrawerLayout, int, int);
-    ctor public ActionBarDrawerToggle(android.app.Activity, android.support.v4.widget.DrawerLayout, android.support.v7.widget.Toolbar, int, int);
-    method public android.view.View.OnClickListener getToolbarNavigationClickListener();
-    method public boolean isDrawerIndicatorEnabled();
-    method public void onConfigurationChanged(android.content.res.Configuration);
-    method public void onDrawerClosed(android.view.View);
-    method public void onDrawerOpened(android.view.View);
-    method public void onDrawerSlide(android.view.View, float);
-    method public void onDrawerStateChanged(int);
-    method public boolean onOptionsItemSelected(android.view.MenuItem);
-    method public void setDrawerIndicatorEnabled(boolean);
-    method public void setHomeAsUpIndicator(android.graphics.drawable.Drawable);
-    method public void setHomeAsUpIndicator(int);
-    method public void setToolbarNavigationClickListener(android.view.View.OnClickListener);
-    method public void syncState();
-  }
-
-  public static abstract interface ActionBarDrawerToggle.Delegate {
-    method public abstract android.content.Context getActionBarThemedContext();
-    method public abstract android.graphics.drawable.Drawable getThemeUpIndicator();
-    method public abstract boolean isNavigationVisible();
-    method public abstract void setActionBarDescription(int);
-    method public abstract void setActionBarUpIndicator(android.graphics.drawable.Drawable, int);
-  }
-
-  public static abstract interface ActionBarDrawerToggle.DelegateProvider {
-    method public abstract android.support.v7.app.ActionBarDrawerToggle.Delegate getDrawerToggleDelegate();
-  }
-
-  public class AlertDialog extends android.support.v7.app.AppCompatDialog implements android.content.DialogInterface {
-    ctor protected AlertDialog(android.content.Context);
-    ctor protected AlertDialog(android.content.Context, int);
-    ctor protected AlertDialog(android.content.Context, boolean, android.content.DialogInterface.OnCancelListener);
-    method public android.widget.Button getButton(int);
-    method public android.widget.ListView getListView();
-    method public void setButton(int, java.lang.CharSequence, android.os.Message);
-    method public void setButton(int, java.lang.CharSequence, android.content.DialogInterface.OnClickListener);
-    method public void setCustomTitle(android.view.View);
-    method public void setIcon(int);
-    method public void setIcon(android.graphics.drawable.Drawable);
-    method public void setIconAttribute(int);
-    method public void setMessage(java.lang.CharSequence);
-    method public void setView(android.view.View);
-    method public void setView(android.view.View, int, int, int, int);
-  }
-
-  public static class AlertDialog.Builder {
-    ctor public AlertDialog.Builder(android.content.Context);
-    ctor public AlertDialog.Builder(android.content.Context, int);
-    method public android.support.v7.app.AlertDialog create();
-    method public android.content.Context getContext();
-    method public android.support.v7.app.AlertDialog.Builder setAdapter(android.widget.ListAdapter, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setCancelable(boolean);
-    method public android.support.v7.app.AlertDialog.Builder setCursor(android.database.Cursor, android.content.DialogInterface.OnClickListener, java.lang.String);
-    method public android.support.v7.app.AlertDialog.Builder setCustomTitle(android.view.View);
-    method public android.support.v7.app.AlertDialog.Builder setIcon(int);
-    method public android.support.v7.app.AlertDialog.Builder setIcon(android.graphics.drawable.Drawable);
-    method public android.support.v7.app.AlertDialog.Builder setIconAttribute(int);
-    method public android.support.v7.app.AlertDialog.Builder setInverseBackgroundForced(boolean);
-    method public android.support.v7.app.AlertDialog.Builder setItems(int, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setItems(java.lang.CharSequence[], android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setMessage(int);
-    method public android.support.v7.app.AlertDialog.Builder setMessage(java.lang.CharSequence);
-    method public android.support.v7.app.AlertDialog.Builder setMultiChoiceItems(int, boolean[], android.content.DialogInterface.OnMultiChoiceClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setMultiChoiceItems(java.lang.CharSequence[], boolean[], android.content.DialogInterface.OnMultiChoiceClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setMultiChoiceItems(android.database.Cursor, java.lang.String, java.lang.String, android.content.DialogInterface.OnMultiChoiceClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setNegativeButton(int, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setNegativeButton(java.lang.CharSequence, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setNeutralButton(int, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setNeutralButton(java.lang.CharSequence, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setOnCancelListener(android.content.DialogInterface.OnCancelListener);
-    method public android.support.v7.app.AlertDialog.Builder setOnDismissListener(android.content.DialogInterface.OnDismissListener);
-    method public android.support.v7.app.AlertDialog.Builder setOnItemSelectedListener(android.widget.AdapterView.OnItemSelectedListener);
-    method public android.support.v7.app.AlertDialog.Builder setOnKeyListener(android.content.DialogInterface.OnKeyListener);
-    method public android.support.v7.app.AlertDialog.Builder setPositiveButton(int, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setPositiveButton(java.lang.CharSequence, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setSingleChoiceItems(int, int, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setSingleChoiceItems(android.database.Cursor, int, java.lang.String, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setSingleChoiceItems(java.lang.CharSequence[], int, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setSingleChoiceItems(android.widget.ListAdapter, int, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setTitle(int);
-    method public android.support.v7.app.AlertDialog.Builder setTitle(java.lang.CharSequence);
-    method public android.support.v7.app.AlertDialog.Builder setView(int);
-    method public android.support.v7.app.AlertDialog.Builder setView(android.view.View);
-    method public android.support.v7.app.AlertDialog show();
-  }
-
-  public class AppCompatActivity extends android.support.v4.app.FragmentActivity implements android.support.v7.app.ActionBarDrawerToggle.DelegateProvider android.support.v7.app.AppCompatCallback {
-    ctor public AppCompatActivity();
-    method public android.support.v7.app.AppCompatDelegate getDelegate();
-    method public android.support.v7.app.ActionBarDrawerToggle.Delegate getDrawerToggleDelegate();
-    method public android.support.v7.app.ActionBar getSupportActionBar();
-    method public android.content.Intent getSupportParentActivityIntent();
-    method public void onCreateSupportNavigateUpTaskStack(android.support.v4.app.TaskStackBuilder);
-    method public final boolean onMenuItemSelected(int, android.view.MenuItem);
-    method public void onPrepareSupportNavigateUpTaskStack(android.support.v4.app.TaskStackBuilder);
-    method public void onSupportActionModeFinished(android.support.v7.view.ActionMode);
-    method public void onSupportActionModeStarted(android.support.v7.view.ActionMode);
-    method public deprecated void onSupportContentChanged();
-    method public boolean onSupportNavigateUp();
-    method public android.support.v7.view.ActionMode onWindowStartingSupportActionMode(android.support.v7.view.ActionMode.Callback);
-    method public void setSupportActionBar(android.support.v7.widget.Toolbar);
-    method public deprecated void setSupportProgress(int);
-    method public deprecated void setSupportProgressBarIndeterminate(boolean);
-    method public deprecated void setSupportProgressBarIndeterminateVisibility(boolean);
-    method public deprecated void setSupportProgressBarVisibility(boolean);
-    method public android.support.v7.view.ActionMode startSupportActionMode(android.support.v7.view.ActionMode.Callback);
-    method public void supportNavigateUpTo(android.content.Intent);
-    method public boolean supportRequestWindowFeature(int);
-    method public boolean supportShouldUpRecreateTask(android.content.Intent);
-  }
-
-  public abstract interface AppCompatCallback {
-    method public abstract void onSupportActionModeFinished(android.support.v7.view.ActionMode);
-    method public abstract void onSupportActionModeStarted(android.support.v7.view.ActionMode);
-    method public abstract android.support.v7.view.ActionMode onWindowStartingSupportActionMode(android.support.v7.view.ActionMode.Callback);
-  }
-
-  public abstract class AppCompatDelegate {
-    method public abstract void addContentView(android.view.View, android.view.ViewGroup.LayoutParams);
-    method public static android.support.v7.app.AppCompatDelegate create(android.app.Activity, android.support.v7.app.AppCompatCallback);
-    method public static android.support.v7.app.AppCompatDelegate create(android.app.Dialog, android.support.v7.app.AppCompatCallback);
-    method public abstract android.view.View createView(android.view.View, java.lang.String, android.content.Context, android.util.AttributeSet);
-    method public abstract android.support.v7.app.ActionBarDrawerToggle.Delegate getDrawerToggleDelegate();
-    method public abstract android.view.MenuInflater getMenuInflater();
-    method public abstract android.support.v7.app.ActionBar getSupportActionBar();
-    method public abstract void installViewFactory();
-    method public abstract void invalidateOptionsMenu();
-    method public abstract boolean isHandleNativeActionModesEnabled();
-    method public abstract void onConfigurationChanged(android.content.res.Configuration);
-    method public abstract void onCreate(android.os.Bundle);
-    method public abstract void onDestroy();
-    method public abstract void onPostCreate(android.os.Bundle);
-    method public abstract void onPostResume();
-    method public abstract void onStop();
-    method public abstract boolean requestWindowFeature(int);
-    method public abstract void setContentView(android.view.View);
-    method public abstract void setContentView(int);
-    method public abstract void setContentView(android.view.View, android.view.ViewGroup.LayoutParams);
-    method public abstract void setHandleNativeActionModesEnabled(boolean);
-    method public abstract void setSupportActionBar(android.support.v7.widget.Toolbar);
-    method public abstract void setTitle(java.lang.CharSequence);
-    method public abstract android.support.v7.view.ActionMode startSupportActionMode(android.support.v7.view.ActionMode.Callback);
-  }
-
-  public class AppCompatDialog extends android.app.Dialog implements android.support.v7.app.AppCompatCallback {
-    ctor public AppCompatDialog(android.content.Context);
-    ctor public AppCompatDialog(android.content.Context, int);
-    ctor protected AppCompatDialog(android.content.Context, boolean, android.content.DialogInterface.OnCancelListener);
-    method public android.support.v7.app.AppCompatDelegate getDelegate();
-    method public android.support.v7.app.ActionBar getSupportActionBar();
-    method public void onSupportActionModeFinished(android.support.v7.view.ActionMode);
-    method public void onSupportActionModeStarted(android.support.v7.view.ActionMode);
-    method public android.support.v7.view.ActionMode onWindowStartingSupportActionMode(android.support.v7.view.ActionMode.Callback);
-    method public boolean supportRequestWindowFeature(int);
-  }
-
-}
-
-package android.support.v7.appcompat {
-
-  public final class R {
-    ctor public R();
-  }
-
-  public static final class R.anim {
-    ctor public R.anim();
-    field public static int abc_fade_in;
-    field public static int abc_fade_out;
-    field public static int abc_grow_fade_in_from_bottom;
-    field public static int abc_popup_enter;
-    field public static int abc_popup_exit;
-    field public static int abc_shrink_fade_out_from_bottom;
-    field public static int abc_slide_in_bottom;
-    field public static int abc_slide_in_top;
-    field public static int abc_slide_out_bottom;
-    field public static int abc_slide_out_top;
-  }
-
-  public static final class R.attr {
-    ctor public R.attr();
-    field public static int actionBarDivider;
-    field public static int actionBarItemBackground;
-    field public static int actionBarPopupTheme;
-    field public static int actionBarSize;
-    field public static int actionBarSplitStyle;
-    field public static int actionBarStyle;
-    field public static int actionBarTabBarStyle;
-    field public static int actionBarTabStyle;
-    field public static int actionBarTabTextStyle;
-    field public static int actionBarTheme;
-    field public static int actionBarWidgetTheme;
-    field public static int actionButtonStyle;
-    field public static int actionDropDownStyle;
-    field public static int actionLayout;
-    field public static int actionMenuTextAppearance;
-    field public static int actionMenuTextColor;
-    field public static int actionModeBackground;
-    field public static int actionModeCloseButtonStyle;
-    field public static int actionModeCloseDrawable;
-    field public static int actionModeCopyDrawable;
-    field public static int actionModeCutDrawable;
-    field public static int actionModeFindDrawable;
-    field public static int actionModePasteDrawable;
-    field public static int actionModePopupWindowStyle;
-    field public static int actionModeSelectAllDrawable;
-    field public static int actionModeShareDrawable;
-    field public static int actionModeSplitBackground;
-    field public static int actionModeStyle;
-    field public static int actionModeWebSearchDrawable;
-    field public static int actionOverflowButtonStyle;
-    field public static int actionOverflowMenuStyle;
-    field public static int actionProviderClass;
-    field public static int actionViewClass;
-    field public static int activityChooserViewStyle;
-    field public static int alertDialogButtonGroupStyle;
-    field public static int alertDialogCenterButtons;
-    field public static int alertDialogStyle;
-    field public static int alertDialogTheme;
-    field public static int autoCompleteTextViewStyle;
-    field public static int background;
-    field public static int backgroundSplit;
-    field public static int backgroundStacked;
-    field public static int backgroundTint;
-    field public static int backgroundTintMode;
-    field public static int barSize;
-    field public static int buttonBarButtonStyle;
-    field public static int buttonBarNegativeButtonStyle;
-    field public static int buttonBarNeutralButtonStyle;
-    field public static int buttonBarPositiveButtonStyle;
-    field public static int buttonBarStyle;
-    field public static int buttonPanelSideLayout;
-    field public static int buttonStyle;
-    field public static int buttonStyleSmall;
-    field public static int checkboxStyle;
-    field public static int checkedTextViewStyle;
-    field public static int closeIcon;
-    field public static int closeItemLayout;
-    field public static int collapseContentDescription;
-    field public static int collapseIcon;
-    field public static int color;
-    field public static int colorAccent;
-    field public static int colorButtonNormal;
-    field public static int colorControlActivated;
-    field public static int colorControlHighlight;
-    field public static int colorControlNormal;
-    field public static int colorPrimary;
-    field public static int colorPrimaryDark;
-    field public static int colorSwitchThumbNormal;
-    field public static int commitIcon;
-    field public static int contentInsetEnd;
-    field public static int contentInsetLeft;
-    field public static int contentInsetRight;
-    field public static int contentInsetStart;
-    field public static int customNavigationLayout;
-    field public static int defaultQueryHint;
-    field public static int dialogPreferredPadding;
-    field public static int dialogTheme;
-    field public static int disableChildrenWhenDisabled;
-    field public static int displayOptions;
-    field public static int divider;
-    field public static int dividerHorizontal;
-    field public static int dividerPadding;
-    field public static int dividerVertical;
-    field public static int drawableSize;
-    field public static int drawerArrowStyle;
-    field public static int dropDownListViewStyle;
-    field public static int dropdownListPreferredItemHeight;
-    field public static int editTextBackground;
-    field public static int editTextColor;
-    field public static int editTextStyle;
-    field public static int elevation;
-    field public static int expandActivityOverflowButtonDrawable;
-    field public static int gapBetweenBars;
-    field public static int goIcon;
-    field public static int height;
-    field public static int hideOnContentScroll;
-    field public static int homeAsUpIndicator;
-    field public static int homeLayout;
-    field public static int icon;
-    field public static int iconifiedByDefault;
-    field public static int indeterminateProgressStyle;
-    field public static int initialActivityCount;
-    field public static int isLightTheme;
-    field public static int itemPadding;
-    field public static int layout;
-    field public static int listChoiceBackgroundIndicator;
-    field public static int listDividerAlertDialog;
-    field public static int listItemLayout;
-    field public static int listLayout;
-    field public static int listPopupWindowStyle;
-    field public static int listPreferredItemHeight;
-    field public static int listPreferredItemHeightLarge;
-    field public static int listPreferredItemHeightSmall;
-    field public static int listPreferredItemPaddingLeft;
-    field public static int listPreferredItemPaddingRight;
-    field public static int logo;
-    field public static int maxButtonHeight;
-    field public static int measureWithLargestChild;
-    field public static int middleBarArrowSize;
-    field public static int multiChoiceItemLayout;
-    field public static int navigationContentDescription;
-    field public static int navigationIcon;
-    field public static int navigationMode;
-    field public static int overlapAnchor;
-    field public static int paddingEnd;
-    field public static int paddingStart;
-    field public static int panelBackground;
-    field public static int panelMenuListTheme;
-    field public static int panelMenuListWidth;
-    field public static int popupMenuStyle;
-    field public static int popupPromptView;
-    field public static int popupTheme;
-    field public static int popupWindowStyle;
-    field public static int preserveIconSpacing;
-    field public static int progressBarPadding;
-    field public static int progressBarStyle;
-    field public static int prompt;
-    field public static int queryBackground;
-    field public static int queryHint;
-    field public static int radioButtonStyle;
-    field public static int ratingBarStyle;
-    field public static int searchHintIcon;
-    field public static int searchIcon;
-    field public static int searchViewStyle;
-    field public static int selectableItemBackground;
-    field public static int selectableItemBackgroundBorderless;
-    field public static int showAsAction;
-    field public static int showDividers;
-    field public static int showText;
-    field public static int singleChoiceItemLayout;
-    field public static int spinBars;
-    field public static int spinnerDropDownItemStyle;
-    field public static int spinnerMode;
-    field public static int spinnerStyle;
-    field public static int splitTrack;
-    field public static int state_above_anchor;
-    field public static int submitBackground;
-    field public static int subtitle;
-    field public static int subtitleTextAppearance;
-    field public static int subtitleTextStyle;
-    field public static int suggestionRowLayout;
-    field public static int switchMinWidth;
-    field public static int switchPadding;
-    field public static int switchStyle;
-    field public static int switchTextAppearance;
-    field public static int textAllCaps;
-    field public static int textAppearanceLargePopupMenu;
-    field public static int textAppearanceListItem;
-    field public static int textAppearanceListItemSmall;
-    field public static int textAppearanceSearchResultSubtitle;
-    field public static int textAppearanceSearchResultTitle;
-    field public static int textAppearanceSmallPopupMenu;
-    field public static int textColorAlertDialogListItem;
-    field public static int textColorSearchUrl;
-    field public static int theme;
-    field public static int thickness;
-    field public static int thumbTextPadding;
-    field public static int title;
-    field public static int titleMarginBottom;
-    field public static int titleMarginEnd;
-    field public static int titleMarginStart;
-    field public static int titleMarginTop;
-    field public static int titleMargins;
-    field public static int titleTextAppearance;
-    field public static int titleTextStyle;
-    field public static int toolbarNavigationButtonStyle;
-    field public static int toolbarStyle;
-    field public static int topBottomBarArrowSize;
-    field public static int track;
-    field public static int voiceIcon;
-    field public static int windowActionBar;
-    field public static int windowActionBarOverlay;
-    field public static int windowActionModeOverlay;
-    field public static int windowFixedHeightMajor;
-    field public static int windowFixedHeightMinor;
-    field public static int windowFixedWidthMajor;
-    field public static int windowFixedWidthMinor;
-    field public static int windowMinWidthMajor;
-    field public static int windowMinWidthMinor;
-    field public static int windowNoTitle;
-  }
-
-  public static final class R.bool {
-    ctor public R.bool();
-    field public static int abc_action_bar_embed_tabs;
-    field public static int abc_action_bar_embed_tabs_pre_jb;
-    field public static int abc_action_bar_expanded_action_views_exclusive;
-    field public static int abc_config_actionMenuItemAllCaps;
-    field public static int abc_config_allowActionMenuItemTextWithIcon;
-    field public static int abc_config_closeDialogWhenTouchOutside;
-    field public static int abc_config_showMenuShortcutsWhenKeyboardPresent;
-  }
-
-  public static final class R.color {
-    ctor public R.color();
-    field public static int abc_background_cache_hint_selector_material_dark;
-    field public static int abc_background_cache_hint_selector_material_light;
-    field public static int abc_input_method_navigation_guard;
-    field public static int abc_primary_text_disable_only_material_dark;
-    field public static int abc_primary_text_disable_only_material_light;
-    field public static int abc_primary_text_material_dark;
-    field public static int abc_primary_text_material_light;
-    field public static int abc_search_url_text;
-    field public static int abc_search_url_text_normal;
-    field public static int abc_search_url_text_pressed;
-    field public static int abc_search_url_text_selected;
-    field public static int abc_secondary_text_material_dark;
-    field public static int abc_secondary_text_material_light;
-    field public static int accent_material_dark;
-    field public static int accent_material_light;
-    field public static int background_floating_material_dark;
-    field public static int background_floating_material_light;
-    field public static int background_material_dark;
-    field public static int background_material_light;
-    field public static int bright_foreground_disabled_material_dark;
-    field public static int bright_foreground_disabled_material_light;
-    field public static int bright_foreground_inverse_material_dark;
-    field public static int bright_foreground_inverse_material_light;
-    field public static int bright_foreground_material_dark;
-    field public static int bright_foreground_material_light;
-    field public static int button_material_dark;
-    field public static int button_material_light;
-    field public static int dim_foreground_disabled_material_dark;
-    field public static int dim_foreground_disabled_material_light;
-    field public static int dim_foreground_material_dark;
-    field public static int dim_foreground_material_light;
-    field public static int highlighted_text_material_dark;
-    field public static int highlighted_text_material_light;
-    field public static int hint_foreground_material_dark;
-    field public static int hint_foreground_material_light;
-    field public static int link_text_material_dark;
-    field public static int link_text_material_light;
-    field public static int material_blue_grey_800;
-    field public static int material_blue_grey_900;
-    field public static int material_blue_grey_950;
-    field public static int material_deep_teal_200;
-    field public static int material_deep_teal_500;
-    field public static int primary_dark_material_dark;
-    field public static int primary_dark_material_light;
-    field public static int primary_material_dark;
-    field public static int primary_material_light;
-    field public static int primary_text_default_material_dark;
-    field public static int primary_text_default_material_light;
-    field public static int primary_text_disabled_material_dark;
-    field public static int primary_text_disabled_material_light;
-    field public static int ripple_material_dark;
-    field public static int ripple_material_light;
-    field public static int secondary_text_default_material_dark;
-    field public static int secondary_text_default_material_light;
-    field public static int secondary_text_disabled_material_dark;
-    field public static int secondary_text_disabled_material_light;
-    field public static int switch_thumb_disabled_material_dark;
-    field public static int switch_thumb_disabled_material_light;
-    field public static int switch_thumb_material_dark;
-    field public static int switch_thumb_material_light;
-    field public static int switch_thumb_normal_material_dark;
-    field public static int switch_thumb_normal_material_light;
-  }
-
-  public static final class R.dimen {
-    ctor public R.dimen();
-    field public static int abc_action_bar_content_inset_material;
-    field public static int abc_action_bar_default_height_material;
-    field public static int abc_action_bar_default_padding_material;
-    field public static int abc_action_bar_icon_vertical_padding_material;
-    field public static int abc_action_bar_navigation_padding_start_material;
-    field public static int abc_action_bar_overflow_padding_end_material;
-    field public static int abc_action_bar_overflow_padding_start_material;
-    field public static int abc_action_bar_progress_bar_size;
-    field public static int abc_action_bar_stacked_max_height;
-    field public static int abc_action_bar_stacked_tab_max_width;
-    field public static int abc_action_bar_subtitle_bottom_margin_material;
-    field public static int abc_action_bar_subtitle_top_margin_material;
-    field public static int abc_action_button_min_height_material;
-    field public static int abc_action_button_min_width_material;
-    field public static int abc_action_button_min_width_overflow_material;
-    field public static int abc_alert_dialog_button_bar_height;
-    field public static int abc_button_inset_horizontal_material;
-    field public static int abc_button_inset_vertical_material;
-    field public static int abc_button_padding_horizontal_material;
-    field public static int abc_button_padding_vertical_material;
-    field public static int abc_config_prefDialogWidth;
-    field public static int abc_control_corner_material;
-    field public static int abc_control_inset_material;
-    field public static int abc_control_padding_material;
-    field public static int abc_dialog_list_padding_vertical_material;
-    field public static int abc_dialog_min_width_major;
-    field public static int abc_dialog_min_width_minor;
-    field public static int abc_dialog_padding_material;
-    field public static int abc_dialog_padding_top_material;
-    field public static int abc_disabled_alpha_material_dark;
-    field public static int abc_disabled_alpha_material_light;
-    field public static int abc_dropdownitem_icon_width;
-    field public static int abc_dropdownitem_text_padding_left;
-    field public static int abc_dropdownitem_text_padding_right;
-    field public static int abc_edit_text_inset_bottom_material;
-    field public static int abc_edit_text_inset_horizontal_material;
-    field public static int abc_edit_text_inset_top_material;
-    field public static int abc_floating_window_z;
-    field public static int abc_list_item_padding_horizontal_material;
-    field public static int abc_panel_menu_list_width;
-    field public static int abc_search_view_preferred_width;
-    field public static int abc_search_view_text_min_width;
-    field public static int abc_switch_padding;
-    field public static int abc_text_size_body_1_material;
-    field public static int abc_text_size_body_2_material;
-    field public static int abc_text_size_button_material;
-    field public static int abc_text_size_caption_material;
-    field public static int abc_text_size_display_1_material;
-    field public static int abc_text_size_display_2_material;
-    field public static int abc_text_size_display_3_material;
-    field public static int abc_text_size_display_4_material;
-    field public static int abc_text_size_headline_material;
-    field public static int abc_text_size_large_material;
-    field public static int abc_text_size_medium_material;
-    field public static int abc_text_size_menu_material;
-    field public static int abc_text_size_small_material;
-    field public static int abc_text_size_subhead_material;
-    field public static int abc_text_size_subtitle_material_toolbar;
-    field public static int abc_text_size_title_material;
-    field public static int abc_text_size_title_material_toolbar;
-    field public static int dialog_fixed_height_major;
-    field public static int dialog_fixed_height_minor;
-    field public static int dialog_fixed_width_major;
-    field public static int dialog_fixed_width_minor;
-    field public static int disabled_alpha_material_dark;
-    field public static int disabled_alpha_material_light;
-  }
-
-  public static final class R.drawable {
-    ctor public R.drawable();
-    field public static int abc_ab_share_pack_mtrl_alpha;
-    field public static int abc_btn_borderless_material;
-    field public static int abc_btn_check_material;
-    field public static int abc_btn_check_to_on_mtrl_000;
-    field public static int abc_btn_check_to_on_mtrl_015;
-    field public static int abc_btn_default_mtrl_shape;
-    field public static int abc_btn_radio_material;
-    field public static int abc_btn_radio_to_on_mtrl_000;
-    field public static int abc_btn_radio_to_on_mtrl_015;
-    field public static int abc_btn_rating_star_off_mtrl_alpha;
-    field public static int abc_btn_rating_star_on_mtrl_alpha;
-    field public static int abc_btn_switch_to_on_mtrl_00001;
-    field public static int abc_btn_switch_to_on_mtrl_00012;
-    field public static int abc_cab_background_internal_bg;
-    field public static int abc_cab_background_top_material;
-    field public static int abc_cab_background_top_mtrl_alpha;
-    field public static int abc_dialog_material_background_dark;
-    field public static int abc_dialog_material_background_light;
-    field public static int abc_edit_text_material;
-    field public static int abc_ic_ab_back_mtrl_am_alpha;
-    field public static int abc_ic_clear_mtrl_alpha;
-    field public static int abc_ic_commit_search_api_mtrl_alpha;
-    field public static int abc_ic_go_search_api_mtrl_alpha;
-    field public static int abc_ic_menu_copy_mtrl_am_alpha;
-    field public static int abc_ic_menu_cut_mtrl_alpha;
-    field public static int abc_ic_menu_moreoverflow_mtrl_alpha;
-    field public static int abc_ic_menu_paste_mtrl_am_alpha;
-    field public static int abc_ic_menu_selectall_mtrl_alpha;
-    field public static int abc_ic_menu_share_mtrl_alpha;
-    field public static int abc_ic_search_api_mtrl_alpha;
-    field public static int abc_ic_voice_search_api_mtrl_alpha;
-    field public static int abc_item_background_holo_dark;
-    field public static int abc_item_background_holo_light;
-    field public static int abc_list_divider_mtrl_alpha;
-    field public static int abc_list_focused_holo;
-    field public static int abc_list_longpressed_holo;
-    field public static int abc_list_pressed_holo_dark;
-    field public static int abc_list_pressed_holo_light;
-    field public static int abc_list_selector_background_transition_holo_dark;
-    field public static int abc_list_selector_background_transition_holo_light;
-    field public static int abc_list_selector_disabled_holo_dark;
-    field public static int abc_list_selector_disabled_holo_light;
-    field public static int abc_list_selector_holo_dark;
-    field public static int abc_list_selector_holo_light;
-    field public static int abc_menu_hardkey_panel_mtrl_mult;
-    field public static int abc_popup_background_mtrl_mult;
-    field public static int abc_ratingbar_full_material;
-    field public static int abc_spinner_mtrl_am_alpha;
-    field public static int abc_spinner_textfield_background_material;
-    field public static int abc_switch_thumb_material;
-    field public static int abc_switch_track_mtrl_alpha;
-    field public static int abc_tab_indicator_material;
-    field public static int abc_tab_indicator_mtrl_alpha;
-    field public static int abc_text_cursor_mtrl_alpha;
-    field public static int abc_textfield_activated_mtrl_alpha;
-    field public static int abc_textfield_default_mtrl_alpha;
-    field public static int abc_textfield_search_activated_mtrl_alpha;
-    field public static int abc_textfield_search_default_mtrl_alpha;
-    field public static int abc_textfield_search_material;
-  }
-
-  public static final class R.id {
-    ctor public R.id();
-    field public static int action_bar;
-    field public static int action_bar_activity_content;
-    field public static int action_bar_container;
-    field public static int action_bar_root;
-    field public static int action_bar_spinner;
-    field public static int action_bar_subtitle;
-    field public static int action_bar_title;
-    field public static int action_context_bar;
-    field public static int action_menu_divider;
-    field public static int action_menu_presenter;
-    field public static int action_mode_bar;
-    field public static int action_mode_bar_stub;
-    field public static int action_mode_close_button;
-    field public static int activity_chooser_view_content;
-    field public static int alertTitle;
-    field public static int always;
-    field public static int beginning;
-    field public static int buttonPanel;
-    field public static int checkbox;
-    field public static int collapseActionView;
-    field public static int contentPanel;
-    field public static int custom;
-    field public static int customPanel;
-    field public static int decor_content_parent;
-    field public static int default_activity_button;
-    field public static int dialog;
-    field public static int disableHome;
-    field public static int dropdown;
-    field public static int edit_query;
-    field public static int end;
-    field public static int expand_activities_button;
-    field public static int expanded_menu;
-    field public static int home;
-    field public static int homeAsUp;
-    field public static int icon;
-    field public static int ifRoom;
-    field public static int image;
-    field public static int listMode;
-    field public static int list_item;
-    field public static int middle;
-    field public static int multiply;
-    field public static int never;
-    field public static int none;
-    field public static int normal;
-    field public static int parentPanel;
-    field public static int progress_circular;
-    field public static int progress_horizontal;
-    field public static int radio;
-    field public static int screen;
-    field public static int scrollView;
-    field public static int search_badge;
-    field public static int search_bar;
-    field public static int search_button;
-    field public static int search_close_btn;
-    field public static int search_edit_frame;
-    field public static int search_go_btn;
-    field public static int search_mag_icon;
-    field public static int search_plate;
-    field public static int search_src_text;
-    field public static int search_voice_btn;
-    field public static int select_dialog_listview;
-    field public static int shortcut;
-    field public static int showCustom;
-    field public static int showHome;
-    field public static int showTitle;
-    field public static int split_action_bar;
-    field public static int src_atop;
-    field public static int src_in;
-    field public static int src_over;
-    field public static int submit_area;
-    field public static int tabMode;
-    field public static int textSpacerNoButtons;
-    field public static int title;
-    field public static int title_template;
-    field public static int topPanel;
-    field public static int up;
-    field public static int useLogo;
-    field public static int withText;
-    field public static int wrap_content;
-  }
-
-  public static final class R.integer {
-    ctor public R.integer();
-    field public static int abc_config_activityDefaultDur;
-    field public static int abc_config_activityShortDur;
-    field public static int abc_max_action_buttons;
-  }
-
-  public static final class R.layout {
-    ctor public R.layout();
-    field public static int abc_action_bar_title_item;
-    field public static int abc_action_bar_up_container;
-    field public static int abc_action_bar_view_list_nav_layout;
-    field public static int abc_action_menu_item_layout;
-    field public static int abc_action_menu_layout;
-    field public static int abc_action_mode_bar;
-    field public static int abc_action_mode_close_item_material;
-    field public static int abc_activity_chooser_view;
-    field public static int abc_activity_chooser_view_list_item;
-    field public static int abc_alert_dialog_material;
-    field public static int abc_dialog_title_material;
-    field public static int abc_expanded_menu_layout;
-    field public static int abc_list_menu_item_checkbox;
-    field public static int abc_list_menu_item_icon;
-    field public static int abc_list_menu_item_layout;
-    field public static int abc_list_menu_item_radio;
-    field public static int abc_popup_menu_item_layout;
-    field public static int abc_screen_content_include;
-    field public static int abc_screen_simple;
-    field public static int abc_screen_simple_overlay_action_mode;
-    field public static int abc_screen_toolbar;
-    field public static int abc_search_dropdown_item_icons_2line;
-    field public static int abc_search_view;
-    field public static int abc_select_dialog_material;
-    field public static int abc_simple_dropdown_hint;
-    field public static int select_dialog_item_material;
-    field public static int select_dialog_multichoice_material;
-    field public static int select_dialog_singlechoice_material;
-    field public static int support_simple_spinner_dropdown_item;
-  }
-
-  public static final class R.string {
-    ctor public R.string();
-    field public static int abc_action_bar_home_description;
-    field public static int abc_action_bar_home_description_format;
-    field public static int abc_action_bar_home_subtitle_description_format;
-    field public static int abc_action_bar_up_description;
-    field public static int abc_action_menu_overflow_description;
-    field public static int abc_action_mode_done;
-    field public static int abc_activity_chooser_view_see_all;
-    field public static int abc_activitychooserview_choose_application;
-    field public static int abc_search_hint;
-    field public static int abc_searchview_description_clear;
-    field public static int abc_searchview_description_query;
-    field public static int abc_searchview_description_search;
-    field public static int abc_searchview_description_submit;
-    field public static int abc_searchview_description_voice;
-    field public static int abc_shareactionprovider_share_with;
-    field public static int abc_shareactionprovider_share_with_application;
-    field public static int abc_toolbar_collapse_description;
-  }
-
-  public static final class R.style {
-    ctor public R.style();
-    field public static int AlertDialog_AppCompat;
-    field public static int AlertDialog_AppCompat_Light;
-    field public static int Animation_AppCompat_Dialog;
-    field public static int Animation_AppCompat_DropDownUp;
-    field public static int Base_AlertDialog_AppCompat;
-    field public static int Base_AlertDialog_AppCompat_Light;
-    field public static int Base_Animation_AppCompat_Dialog;
-    field public static int Base_Animation_AppCompat_DropDownUp;
-    field public static int Base_DialogWindowTitleBackground_AppCompat;
-    field public static int Base_DialogWindowTitle_AppCompat;
-    field public static int Base_TextAppearance_AppCompat;
-    field public static int Base_TextAppearance_AppCompat_Body1;
-    field public static int Base_TextAppearance_AppCompat_Body2;
-    field public static int Base_TextAppearance_AppCompat_Button;
-    field public static int Base_TextAppearance_AppCompat_Caption;
-    field public static int Base_TextAppearance_AppCompat_Display1;
-    field public static int Base_TextAppearance_AppCompat_Display2;
-    field public static int Base_TextAppearance_AppCompat_Display3;
-    field public static int Base_TextAppearance_AppCompat_Display4;
-    field public static int Base_TextAppearance_AppCompat_Headline;
-    field public static int Base_TextAppearance_AppCompat_Inverse;
-    field public static int Base_TextAppearance_AppCompat_Large;
-    field public static int Base_TextAppearance_AppCompat_Large_Inverse;
-    field public static int Base_TextAppearance_AppCompat_Light_Widget_PopupMenu_Large;
-    field public static int Base_TextAppearance_AppCompat_Light_Widget_PopupMenu_Small;
-    field public static int Base_TextAppearance_AppCompat_Medium;
-    field public static int Base_TextAppearance_AppCompat_Medium_Inverse;
-    field public static int Base_TextAppearance_AppCompat_Menu;
-    field public static int Base_TextAppearance_AppCompat_SearchResult;
-    field public static int Base_TextAppearance_AppCompat_SearchResult_Subtitle;
-    field public static int Base_TextAppearance_AppCompat_SearchResult_Title;
-    field public static int Base_TextAppearance_AppCompat_Small;
-    field public static int Base_TextAppearance_AppCompat_Small_Inverse;
-    field public static int Base_TextAppearance_AppCompat_Subhead;
-    field public static int Base_TextAppearance_AppCompat_Subhead_Inverse;
-    field public static int Base_TextAppearance_AppCompat_Title;
-    field public static int Base_TextAppearance_AppCompat_Title_Inverse;
-    field public static int Base_TextAppearance_AppCompat_Widget_ActionBar_Menu;
-    field public static int Base_TextAppearance_AppCompat_Widget_ActionBar_Subtitle;
-    field public static int Base_TextAppearance_AppCompat_Widget_ActionBar_Subtitle_Inverse;
-    field public static int Base_TextAppearance_AppCompat_Widget_ActionBar_Title;
-    field public static int Base_TextAppearance_AppCompat_Widget_ActionBar_Title_Inverse;
-    field public static int Base_TextAppearance_AppCompat_Widget_ActionMode_Subtitle;
-    field public static int Base_TextAppearance_AppCompat_Widget_ActionMode_Title;
-    field public static int Base_TextAppearance_AppCompat_Widget_DropDownItem;
-    field public static int Base_TextAppearance_AppCompat_Widget_PopupMenu_Large;
-    field public static int Base_TextAppearance_AppCompat_Widget_PopupMenu_Small;
-    field public static int Base_TextAppearance_AppCompat_Widget_Switch;
-    field public static int Base_TextAppearance_AppCompat_Widget_TextView_SpinnerItem;
-    field public static int Base_TextAppearance_Widget_AppCompat_ExpandedMenu_Item;
-    field public static int Base_TextAppearance_Widget_AppCompat_Toolbar_Subtitle;
-    field public static int Base_TextAppearance_Widget_AppCompat_Toolbar_Title;
-    field public static int Base_ThemeOverlay_AppCompat;
-    field public static int Base_ThemeOverlay_AppCompat_ActionBar;
-    field public static int Base_ThemeOverlay_AppCompat_Dark;
-    field public static int Base_ThemeOverlay_AppCompat_Dark_ActionBar;
-    field public static int Base_ThemeOverlay_AppCompat_Light;
-    field public static int Base_Theme_AppCompat;
-    field public static int Base_Theme_AppCompat_CompactMenu;
-    field public static int Base_Theme_AppCompat_Dialog;
-    field public static int Base_Theme_AppCompat_DialogWhenLarge;
-    field public static int Base_Theme_AppCompat_Dialog_Alert;
-    field public static int Base_Theme_AppCompat_Dialog_FixedSize;
-    field public static int Base_Theme_AppCompat_Dialog_MinWidth;
-    field public static int Base_Theme_AppCompat_Light;
-    field public static int Base_Theme_AppCompat_Light_DarkActionBar;
-    field public static int Base_Theme_AppCompat_Light_Dialog;
-    field public static int Base_Theme_AppCompat_Light_DialogWhenLarge;
-    field public static int Base_Theme_AppCompat_Light_Dialog_Alert;
-    field public static int Base_Theme_AppCompat_Light_Dialog_FixedSize;
-    field public static int Base_Theme_AppCompat_Light_Dialog_MinWidth;
-    field public static int Base_V11_Theme_AppCompat_Dialog;
-    field public static int Base_V11_Theme_AppCompat_Light_Dialog;
-    field public static int Base_V21_Theme_AppCompat;
-    field public static int Base_V21_Theme_AppCompat_Dialog;
-    field public static int Base_V21_Theme_AppCompat_Light;
-    field public static int Base_V21_Theme_AppCompat_Light_Dialog;
-    field public static int Base_V7_Theme_AppCompat;
-    field public static int Base_V7_Theme_AppCompat_Dialog;
-    field public static int Base_V7_Theme_AppCompat_Light;
-    field public static int Base_V7_Theme_AppCompat_Light_Dialog;
-    field public static int Base_Widget_AppCompat_ActionBar;
-    field public static int Base_Widget_AppCompat_ActionBar_Solid;
-    field public static int Base_Widget_AppCompat_ActionBar_TabBar;
-    field public static int Base_Widget_AppCompat_ActionBar_TabText;
-    field public static int Base_Widget_AppCompat_ActionBar_TabView;
-    field public static int Base_Widget_AppCompat_ActionButton;
-    field public static int Base_Widget_AppCompat_ActionButton_CloseMode;
-    field public static int Base_Widget_AppCompat_ActionButton_Overflow;
-    field public static int Base_Widget_AppCompat_ActionMode;
-    field public static int Base_Widget_AppCompat_ActivityChooserView;
-    field public static int Base_Widget_AppCompat_AutoCompleteTextView;
-    field public static int Base_Widget_AppCompat_Button;
-    field public static int Base_Widget_AppCompat_ButtonBar;
-    field public static int Base_Widget_AppCompat_ButtonBar_AlertDialog;
-    field public static int Base_Widget_AppCompat_Button_Borderless;
-    field public static int Base_Widget_AppCompat_Button_Borderless_Colored;
-    field public static int Base_Widget_AppCompat_Button_ButtonBar_AlertDialog;
-    field public static int Base_Widget_AppCompat_Button_Small;
-    field public static int Base_Widget_AppCompat_CompoundButton_CheckBox;
-    field public static int Base_Widget_AppCompat_CompoundButton_RadioButton;
-    field public static int Base_Widget_AppCompat_CompoundButton_Switch;
-    field public static int Base_Widget_AppCompat_DrawerArrowToggle;
-    field public static int Base_Widget_AppCompat_DrawerArrowToggle_Common;
-    field public static int Base_Widget_AppCompat_DropDownItem_Spinner;
-    field public static int Base_Widget_AppCompat_EditText;
-    field public static int Base_Widget_AppCompat_Light_ActionBar;
-    field public static int Base_Widget_AppCompat_Light_ActionBar_Solid;
-    field public static int Base_Widget_AppCompat_Light_ActionBar_TabBar;
-    field public static int Base_Widget_AppCompat_Light_ActionBar_TabText;
-    field public static int Base_Widget_AppCompat_Light_ActionBar_TabText_Inverse;
-    field public static int Base_Widget_AppCompat_Light_ActionBar_TabView;
-    field public static int Base_Widget_AppCompat_Light_PopupMenu;
-    field public static int Base_Widget_AppCompat_Light_PopupMenu_Overflow;
-    field public static int Base_Widget_AppCompat_ListPopupWindow;
-    field public static int Base_Widget_AppCompat_ListView;
-    field public static int Base_Widget_AppCompat_ListView_DropDown;
-    field public static int Base_Widget_AppCompat_ListView_Menu;
-    field public static int Base_Widget_AppCompat_PopupMenu;
-    field public static int Base_Widget_AppCompat_PopupMenu_Overflow;
-    field public static int Base_Widget_AppCompat_PopupWindow;
-    field public static int Base_Widget_AppCompat_ProgressBar;
-    field public static int Base_Widget_AppCompat_ProgressBar_Horizontal;
-    field public static int Base_Widget_AppCompat_RatingBar;
-    field public static int Base_Widget_AppCompat_SearchView;
-    field public static int Base_Widget_AppCompat_SearchView_ActionBar;
-    field public static int Base_Widget_AppCompat_Spinner;
-    field public static int Base_Widget_AppCompat_Spinner_DropDown_ActionBar;
-    field public static int Base_Widget_AppCompat_Spinner_Underlined;
-    field public static int Base_Widget_AppCompat_TextView_SpinnerItem;
-    field public static int Base_Widget_AppCompat_Toolbar;
-    field public static int Base_Widget_AppCompat_Toolbar_Button_Navigation;
-    field public static int Platform_AppCompat;
-    field public static int Platform_AppCompat_Light;
-    field public static int Platform_ThemeOverlay_AppCompat_Dark;
-    field public static int Platform_ThemeOverlay_AppCompat_Light;
-    field public static int Platform_V11_AppCompat;
-    field public static int Platform_V11_AppCompat_Light;
-    field public static int Platform_V12_AppCompat;
-    field public static int Platform_V12_AppCompat_Light;
-    field public static int Platform_V14_AppCompat;
-    field public static int Platform_V14_AppCompat_Light;
-    field public static int RtlOverlay_DialogWindowTitle_AppCompat;
-    field public static int RtlOverlay_Widget_AppCompat_ActionBar_TitleItem;
-    field public static int RtlOverlay_Widget_AppCompat_ActionButton_Overflow;
-    field public static int RtlOverlay_Widget_AppCompat_DialogTitle_Icon;
-    field public static int RtlOverlay_Widget_AppCompat_PopupMenuItem;
-    field public static int RtlOverlay_Widget_AppCompat_PopupMenuItem_InternalGroup;
-    field public static int RtlOverlay_Widget_AppCompat_PopupMenuItem_Text;
-    field public static int RtlOverlay_Widget_AppCompat_SearchView_MagIcon;
-    field public static int RtlOverlay_Widget_AppCompat_Search_DropDown;
-    field public static int RtlOverlay_Widget_AppCompat_Search_DropDown_Icon1;
-    field public static int RtlOverlay_Widget_AppCompat_Search_DropDown_Icon2;
-    field public static int RtlOverlay_Widget_AppCompat_Search_DropDown_Query;
-    field public static int RtlOverlay_Widget_AppCompat_Search_DropDown_Text;
-    field public static int RtlOverlay_Widget_AppCompat_Toolbar_Button_Navigation;
-    field public static int TextAppearance_AppCompat;
-    field public static int TextAppearance_AppCompat_Body1;
-    field public static int TextAppearance_AppCompat_Body2;
-    field public static int TextAppearance_AppCompat_Button;
-    field public static int TextAppearance_AppCompat_Caption;
-    field public static int TextAppearance_AppCompat_Display1;
-    field public static int TextAppearance_AppCompat_Display2;
-    field public static int TextAppearance_AppCompat_Display3;
-    field public static int TextAppearance_AppCompat_Display4;
-    field public static int TextAppearance_AppCompat_Headline;
-    field public static int TextAppearance_AppCompat_Inverse;
-    field public static int TextAppearance_AppCompat_Large;
-    field public static int TextAppearance_AppCompat_Large_Inverse;
-    field public static int TextAppearance_AppCompat_Light_SearchResult_Subtitle;
-    field public static int TextAppearance_AppCompat_Light_SearchResult_Title;
-    field public static int TextAppearance_AppCompat_Light_Widget_PopupMenu_Large;
-    field public static int TextAppearance_AppCompat_Light_Widget_PopupMenu_Small;
-    field public static int TextAppearance_AppCompat_Medium;
-    field public static int TextAppearance_AppCompat_Medium_Inverse;
-    field public static int TextAppearance_AppCompat_Menu;
-    field public static int TextAppearance_AppCompat_SearchResult_Subtitle;
-    field public static int TextAppearance_AppCompat_SearchResult_Title;
-    field public static int TextAppearance_AppCompat_Small;
-    field public static int TextAppearance_AppCompat_Small_Inverse;
-    field public static int TextAppearance_AppCompat_Subhead;
-    field public static int TextAppearance_AppCompat_Subhead_Inverse;
-    field public static int TextAppearance_AppCompat_Title;
-    field public static int TextAppearance_AppCompat_Title_Inverse;
-    field public static int TextAppearance_AppCompat_Widget_ActionBar_Menu;
-    field public static int TextAppearance_AppCompat_Widget_ActionBar_Subtitle;
-    field public static int TextAppearance_AppCompat_Widget_ActionBar_Subtitle_Inverse;
-    field public static int TextAppearance_AppCompat_Widget_ActionBar_Title;
-    field public static int TextAppearance_AppCompat_Widget_ActionBar_Title_Inverse;
-    field public static int TextAppearance_AppCompat_Widget_ActionMode_Subtitle;
-    field public static int TextAppearance_AppCompat_Widget_ActionMode_Subtitle_Inverse;
-    field public static int TextAppearance_AppCompat_Widget_ActionMode_Title;
-    field public static int TextAppearance_AppCompat_Widget_ActionMode_Title_Inverse;
-    field public static int TextAppearance_AppCompat_Widget_DropDownItem;
-    field public static int TextAppearance_AppCompat_Widget_PopupMenu_Large;
-    field public static int TextAppearance_AppCompat_Widget_PopupMenu_Small;
-    field public static int TextAppearance_AppCompat_Widget_Switch;
-    field public static int TextAppearance_AppCompat_Widget_TextView_SpinnerItem;
-    field public static int TextAppearance_Widget_AppCompat_ExpandedMenu_Item;
-    field public static int TextAppearance_Widget_AppCompat_Toolbar_Subtitle;
-    field public static int TextAppearance_Widget_AppCompat_Toolbar_Title;
-    field public static int ThemeOverlay_AppCompat;
-    field public static int ThemeOverlay_AppCompat_ActionBar;
-    field public static int ThemeOverlay_AppCompat_Dark;
-    field public static int ThemeOverlay_AppCompat_Dark_ActionBar;
-    field public static int ThemeOverlay_AppCompat_Light;
-    field public static int Theme_AppCompat;
-    field public static int Theme_AppCompat_CompactMenu;
-    field public static int Theme_AppCompat_Dialog;
-    field public static int Theme_AppCompat_DialogWhenLarge;
-    field public static int Theme_AppCompat_Dialog_Alert;
-    field public static int Theme_AppCompat_Dialog_MinWidth;
-    field public static int Theme_AppCompat_Light;
-    field public static int Theme_AppCompat_Light_DarkActionBar;
-    field public static int Theme_AppCompat_Light_Dialog;
-    field public static int Theme_AppCompat_Light_DialogWhenLarge;
-    field public static int Theme_AppCompat_Light_Dialog_Alert;
-    field public static int Theme_AppCompat_Light_Dialog_MinWidth;
-    field public static int Theme_AppCompat_Light_NoActionBar;
-    field public static int Theme_AppCompat_NoActionBar;
-    field public static int Widget_AppCompat_ActionBar;
-    field public static int Widget_AppCompat_ActionBar_Solid;
-    field public static int Widget_AppCompat_ActionBar_TabBar;
-    field public static int Widget_AppCompat_ActionBar_TabText;
-    field public static int Widget_AppCompat_ActionBar_TabView;
-    field public static int Widget_AppCompat_ActionButton;
-    field public static int Widget_AppCompat_ActionButton_CloseMode;
-    field public static int Widget_AppCompat_ActionButton_Overflow;
-    field public static int Widget_AppCompat_ActionMode;
-    field public static int Widget_AppCompat_ActivityChooserView;
-    field public static int Widget_AppCompat_AutoCompleteTextView;
-    field public static int Widget_AppCompat_Button;
-    field public static int Widget_AppCompat_ButtonBar;
-    field public static int Widget_AppCompat_ButtonBar_AlertDialog;
-    field public static int Widget_AppCompat_Button_Borderless;
-    field public static int Widget_AppCompat_Button_Borderless_Colored;
-    field public static int Widget_AppCompat_Button_ButtonBar_AlertDialog;
-    field public static int Widget_AppCompat_Button_Small;
-    field public static int Widget_AppCompat_CompoundButton_CheckBox;
-    field public static int Widget_AppCompat_CompoundButton_RadioButton;
-    field public static int Widget_AppCompat_CompoundButton_Switch;
-    field public static int Widget_AppCompat_DrawerArrowToggle;
-    field public static int Widget_AppCompat_DropDownItem_Spinner;
-    field public static int Widget_AppCompat_EditText;
-    field public static int Widget_AppCompat_Light_ActionBar;
-    field public static int Widget_AppCompat_Light_ActionBar_Solid;
-    field public static int Widget_AppCompat_Light_ActionBar_Solid_Inverse;
-    field public static int Widget_AppCompat_Light_ActionBar_TabBar;
-    field public static int Widget_AppCompat_Light_ActionBar_TabBar_Inverse;
-    field public static int Widget_AppCompat_Light_ActionBar_TabText;
-    field public static int Widget_AppCompat_Light_ActionBar_TabText_Inverse;
-    field public static int Widget_AppCompat_Light_ActionBar_TabView;
-    field public static int Widget_AppCompat_Light_ActionBar_TabView_Inverse;
-    field public static int Widget_AppCompat_Light_ActionButton;
-    field public static int Widget_AppCompat_Light_ActionButton_CloseMode;
-    field public static int Widget_AppCompat_Light_ActionButton_Overflow;
-    field public static int Widget_AppCompat_Light_ActionMode_Inverse;
-    field public static int Widget_AppCompat_Light_ActivityChooserView;
-    field public static int Widget_AppCompat_Light_AutoCompleteTextView;
-    field public static int Widget_AppCompat_Light_DropDownItem_Spinner;
-    field public static int Widget_AppCompat_Light_ListPopupWindow;
-    field public static int Widget_AppCompat_Light_ListView_DropDown;
-    field public static int Widget_AppCompat_Light_PopupMenu;
-    field public static int Widget_AppCompat_Light_PopupMenu_Overflow;
-    field public static int Widget_AppCompat_Light_SearchView;
-    field public static int Widget_AppCompat_Light_Spinner_DropDown_ActionBar;
-    field public static int Widget_AppCompat_ListPopupWindow;
-    field public static int Widget_AppCompat_ListView;
-    field public static int Widget_AppCompat_ListView_DropDown;
-    field public static int Widget_AppCompat_ListView_Menu;
-    field public static int Widget_AppCompat_PopupMenu;
-    field public static int Widget_AppCompat_PopupMenu_Overflow;
-    field public static int Widget_AppCompat_PopupWindow;
-    field public static int Widget_AppCompat_ProgressBar;
-    field public static int Widget_AppCompat_ProgressBar_Horizontal;
-    field public static int Widget_AppCompat_RatingBar;
-    field public static int Widget_AppCompat_SearchView;
-    field public static int Widget_AppCompat_SearchView_ActionBar;
-    field public static int Widget_AppCompat_Spinner;
-    field public static int Widget_AppCompat_Spinner_DropDown;
-    field public static int Widget_AppCompat_Spinner_DropDown_ActionBar;
-    field public static int Widget_AppCompat_Spinner_Underlined;
-    field public static int Widget_AppCompat_TextView_SpinnerItem;
-    field public static int Widget_AppCompat_Toolbar;
-    field public static int Widget_AppCompat_Toolbar_Button_Navigation;
-  }
-
-  public static final class R.styleable {
-    ctor public R.styleable();
-    field public static final int[] ActionBar;
-    field public static final int[] ActionBarLayout;
-    field public static int ActionBarLayout_android_layout_gravity;
-    field public static int ActionBar_background;
-    field public static int ActionBar_backgroundSplit;
-    field public static int ActionBar_backgroundStacked;
-    field public static int ActionBar_contentInsetEnd;
-    field public static int ActionBar_contentInsetLeft;
-    field public static int ActionBar_contentInsetRight;
-    field public static int ActionBar_contentInsetStart;
-    field public static int ActionBar_customNavigationLayout;
-    field public static int ActionBar_displayOptions;
-    field public static int ActionBar_divider;
-    field public static int ActionBar_elevation;
-    field public static int ActionBar_height;
-    field public static int ActionBar_hideOnContentScroll;
-    field public static int ActionBar_homeAsUpIndicator;
-    field public static int ActionBar_homeLayout;
-    field public static int ActionBar_icon;
-    field public static int ActionBar_indeterminateProgressStyle;
-    field public static int ActionBar_itemPadding;
-    field public static int ActionBar_logo;
-    field public static int ActionBar_navigationMode;
-    field public static int ActionBar_popupTheme;
-    field public static int ActionBar_progressBarPadding;
-    field public static int ActionBar_progressBarStyle;
-    field public static int ActionBar_subtitle;
-    field public static int ActionBar_subtitleTextStyle;
-    field public static int ActionBar_title;
-    field public static int ActionBar_titleTextStyle;
-    field public static final int[] ActionMenuItemView;
-    field public static int ActionMenuItemView_android_minWidth;
-    field public static final int[] ActionMenuView;
-    field public static final int[] ActionMode;
-    field public static int ActionMode_background;
-    field public static int ActionMode_backgroundSplit;
-    field public static int ActionMode_closeItemLayout;
-    field public static int ActionMode_height;
-    field public static int ActionMode_subtitleTextStyle;
-    field public static int ActionMode_titleTextStyle;
-    field public static final int[] ActivityChooserView;
-    field public static int ActivityChooserView_expandActivityOverflowButtonDrawable;
-    field public static int ActivityChooserView_initialActivityCount;
-    field public static final int[] AlertDialog;
-    field public static int AlertDialog_android_layout;
-    field public static int AlertDialog_buttonPanelSideLayout;
-    field public static int AlertDialog_listItemLayout;
-    field public static int AlertDialog_listLayout;
-    field public static int AlertDialog_multiChoiceItemLayout;
-    field public static int AlertDialog_singleChoiceItemLayout;
-    field public static final int[] AppCompatTextView;
-    field public static int AppCompatTextView_android_textAppearance;
-    field public static int AppCompatTextView_textAllCaps;
-    field public static final int[] DrawerArrowToggle;
-    field public static int DrawerArrowToggle_barSize;
-    field public static int DrawerArrowToggle_color;
-    field public static int DrawerArrowToggle_drawableSize;
-    field public static int DrawerArrowToggle_gapBetweenBars;
-    field public static int DrawerArrowToggle_middleBarArrowSize;
-    field public static int DrawerArrowToggle_spinBars;
-    field public static int DrawerArrowToggle_thickness;
-    field public static int DrawerArrowToggle_topBottomBarArrowSize;
-    field public static final int[] LinearLayoutCompat;
-    field public static final int[] LinearLayoutCompat_Layout;
-    field public static int LinearLayoutCompat_Layout_android_layout_gravity;
-    field public static int LinearLayoutCompat_Layout_android_layout_height;
-    field public static int LinearLayoutCompat_Layout_android_layout_weight;
-    field public static int LinearLayoutCompat_Layout_android_layout_width;
-    field public static int LinearLayoutCompat_android_baselineAligned;
-    field public static int LinearLayoutCompat_android_baselineAlignedChildIndex;
-    field public static int LinearLayoutCompat_android_gravity;
-    field public static int LinearLayoutCompat_android_orientation;
-    field public static int LinearLayoutCompat_android_weightSum;
-    field public static int LinearLayoutCompat_divider;
-    field public static int LinearLayoutCompat_dividerPadding;
-    field public static int LinearLayoutCompat_measureWithLargestChild;
-    field public static int LinearLayoutCompat_showDividers;
-    field public static final int[] ListPopupWindow;
-    field public static int ListPopupWindow_android_dropDownHorizontalOffset;
-    field public static int ListPopupWindow_android_dropDownVerticalOffset;
-    field public static final int[] MenuGroup;
-    field public static int MenuGroup_android_checkableBehavior;
-    field public static int MenuGroup_android_enabled;
-    field public static int MenuGroup_android_id;
-    field public static int MenuGroup_android_menuCategory;
-    field public static int MenuGroup_android_orderInCategory;
-    field public static int MenuGroup_android_visible;
-    field public static final int[] MenuItem;
-    field public static int MenuItem_actionLayout;
-    field public static int MenuItem_actionProviderClass;
-    field public static int MenuItem_actionViewClass;
-    field public static int MenuItem_android_alphabeticShortcut;
-    field public static int MenuItem_android_checkable;
-    field public static int MenuItem_android_checked;
-    field public static int MenuItem_android_enabled;
-    field public static int MenuItem_android_icon;
-    field public static int MenuItem_android_id;
-    field public static int MenuItem_android_menuCategory;
-    field public static int MenuItem_android_numericShortcut;
-    field public static int MenuItem_android_onClick;
-    field public static int MenuItem_android_orderInCategory;
-    field public static int MenuItem_android_title;
-    field public static int MenuItem_android_titleCondensed;
-    field public static int MenuItem_android_visible;
-    field public static int MenuItem_showAsAction;
-    field public static final int[] MenuView;
-    field public static int MenuView_android_headerBackground;
-    field public static int MenuView_android_horizontalDivider;
-    field public static int MenuView_android_itemBackground;
-    field public static int MenuView_android_itemIconDisabledAlpha;
-    field public static int MenuView_android_itemTextAppearance;
-    field public static int MenuView_android_verticalDivider;
-    field public static int MenuView_android_windowAnimationStyle;
-    field public static int MenuView_preserveIconSpacing;
-    field public static final int[] PopupWindow;
-    field public static final int[] PopupWindowBackgroundState;
-    field public static int PopupWindowBackgroundState_state_above_anchor;
-    field public static int PopupWindow_android_popupBackground;
-    field public static int PopupWindow_overlapAnchor;
-    field public static final int[] SearchView;
-    field public static int SearchView_android_focusable;
-    field public static int SearchView_android_imeOptions;
-    field public static int SearchView_android_inputType;
-    field public static int SearchView_android_maxWidth;
-    field public static int SearchView_closeIcon;
-    field public static int SearchView_commitIcon;
-    field public static int SearchView_defaultQueryHint;
-    field public static int SearchView_goIcon;
-    field public static int SearchView_iconifiedByDefault;
-    field public static int SearchView_layout;
-    field public static int SearchView_queryBackground;
-    field public static int SearchView_queryHint;
-    field public static int SearchView_searchHintIcon;
-    field public static int SearchView_searchIcon;
-    field public static int SearchView_submitBackground;
-    field public static int SearchView_suggestionRowLayout;
-    field public static int SearchView_voiceIcon;
-    field public static final int[] Spinner;
-    field public static int Spinner_android_background;
-    field public static int Spinner_android_dropDownHorizontalOffset;
-    field public static int Spinner_android_dropDownSelector;
-    field public static int Spinner_android_dropDownVerticalOffset;
-    field public static int Spinner_android_dropDownWidth;
-    field public static int Spinner_android_gravity;
-    field public static int Spinner_android_popupBackground;
-    field public static int Spinner_disableChildrenWhenDisabled;
-    field public static int Spinner_popupPromptView;
-    field public static int Spinner_prompt;
-    field public static int Spinner_spinnerMode;
-    field public static final int[] SwitchCompat;
-    field public static int SwitchCompat_android_textOff;
-    field public static int SwitchCompat_android_textOn;
-    field public static int SwitchCompat_android_thumb;
-    field public static int SwitchCompat_showText;
-    field public static int SwitchCompat_splitTrack;
-    field public static int SwitchCompat_switchMinWidth;
-    field public static int SwitchCompat_switchPadding;
-    field public static int SwitchCompat_switchTextAppearance;
-    field public static int SwitchCompat_thumbTextPadding;
-    field public static int SwitchCompat_track;
-    field public static final int[] TextAppearance;
-    field public static int TextAppearance_android_textColor;
-    field public static int TextAppearance_android_textSize;
-    field public static int TextAppearance_android_textStyle;
-    field public static int TextAppearance_android_typeface;
-    field public static int TextAppearance_textAllCaps;
-    field public static final int[] Theme;
-    field public static int Theme_actionBarDivider;
-    field public static int Theme_actionBarItemBackground;
-    field public static int Theme_actionBarPopupTheme;
-    field public static int Theme_actionBarSize;
-    field public static int Theme_actionBarSplitStyle;
-    field public static int Theme_actionBarStyle;
-    field public static int Theme_actionBarTabBarStyle;
-    field public static int Theme_actionBarTabStyle;
-    field public static int Theme_actionBarTabTextStyle;
-    field public static int Theme_actionBarTheme;
-    field public static int Theme_actionBarWidgetTheme;
-    field public static int Theme_actionButtonStyle;
-    field public static int Theme_actionDropDownStyle;
-    field public static int Theme_actionMenuTextAppearance;
-    field public static int Theme_actionMenuTextColor;
-    field public static int Theme_actionModeBackground;
-    field public static int Theme_actionModeCloseButtonStyle;
-    field public static int Theme_actionModeCloseDrawable;
-    field public static int Theme_actionModeCopyDrawable;
-    field public static int Theme_actionModeCutDrawable;
-    field public static int Theme_actionModeFindDrawable;
-    field public static int Theme_actionModePasteDrawable;
-    field public static int Theme_actionModePopupWindowStyle;
-    field public static int Theme_actionModeSelectAllDrawable;
-    field public static int Theme_actionModeShareDrawable;
-    field public static int Theme_actionModeSplitBackground;
-    field public static int Theme_actionModeStyle;
-    field public static int Theme_actionModeWebSearchDrawable;
-    field public static int Theme_actionOverflowButtonStyle;
-    field public static int Theme_actionOverflowMenuStyle;
-    field public static int Theme_activityChooserViewStyle;
-    field public static int Theme_alertDialogButtonGroupStyle;
-    field public static int Theme_alertDialogCenterButtons;
-    field public static int Theme_alertDialogStyle;
-    field public static int Theme_alertDialogTheme;
-    field public static int Theme_android_windowAnimationStyle;
-    field public static int Theme_android_windowIsFloating;
-    field public static int Theme_autoCompleteTextViewStyle;
-    field public static int Theme_buttonBarButtonStyle;
-    field public static int Theme_buttonBarNegativeButtonStyle;
-    field public static int Theme_buttonBarNeutralButtonStyle;
-    field public static int Theme_buttonBarPositiveButtonStyle;
-    field public static int Theme_buttonBarStyle;
-    field public static int Theme_buttonStyle;
-    field public static int Theme_buttonStyleSmall;
-    field public static int Theme_checkboxStyle;
-    field public static int Theme_checkedTextViewStyle;
-    field public static int Theme_colorAccent;
-    field public static int Theme_colorButtonNormal;
-    field public static int Theme_colorControlActivated;
-    field public static int Theme_colorControlHighlight;
-    field public static int Theme_colorControlNormal;
-    field public static int Theme_colorPrimary;
-    field public static int Theme_colorPrimaryDark;
-    field public static int Theme_colorSwitchThumbNormal;
-    field public static int Theme_dialogPreferredPadding;
-    field public static int Theme_dialogTheme;
-    field public static int Theme_dividerHorizontal;
-    field public static int Theme_dividerVertical;
-    field public static int Theme_dropDownListViewStyle;
-    field public static int Theme_dropdownListPreferredItemHeight;
-    field public static int Theme_editTextBackground;
-    field public static int Theme_editTextColor;
-    field public static int Theme_editTextStyle;
-    field public static int Theme_homeAsUpIndicator;
-    field public static int Theme_listChoiceBackgroundIndicator;
-    field public static int Theme_listDividerAlertDialog;
-    field public static int Theme_listPopupWindowStyle;
-    field public static int Theme_listPreferredItemHeight;
-    field public static int Theme_listPreferredItemHeightLarge;
-    field public static int Theme_listPreferredItemHeightSmall;
-    field public static int Theme_listPreferredItemPaddingLeft;
-    field public static int Theme_listPreferredItemPaddingRight;
-    field public static int Theme_panelBackground;
-    field public static int Theme_panelMenuListTheme;
-    field public static int Theme_panelMenuListWidth;
-    field public static int Theme_popupMenuStyle;
-    field public static int Theme_popupWindowStyle;
-    field public static int Theme_radioButtonStyle;
-    field public static int Theme_ratingBarStyle;
-    field public static int Theme_searchViewStyle;
-    field public static int Theme_selectableItemBackground;
-    field public static int Theme_selectableItemBackgroundBorderless;
-    field public static int Theme_spinnerDropDownItemStyle;
-    field public static int Theme_spinnerStyle;
-    field public static int Theme_switchStyle;
-    field public static int Theme_textAppearanceLargePopupMenu;
-    field public static int Theme_textAppearanceListItem;
-    field public static int Theme_textAppearanceListItemSmall;
-    field public static int Theme_textAppearanceSearchResultSubtitle;
-    field public static int Theme_textAppearanceSearchResultTitle;
-    field public static int Theme_textAppearanceSmallPopupMenu;
-    field public static int Theme_textColorAlertDialogListItem;
-    field public static int Theme_textColorSearchUrl;
-    field public static int Theme_toolbarNavigationButtonStyle;
-    field public static int Theme_toolbarStyle;
-    field public static int Theme_windowActionBar;
-    field public static int Theme_windowActionBarOverlay;
-    field public static int Theme_windowActionModeOverlay;
-    field public static int Theme_windowFixedHeightMajor;
-    field public static int Theme_windowFixedHeightMinor;
-    field public static int Theme_windowFixedWidthMajor;
-    field public static int Theme_windowFixedWidthMinor;
-    field public static int Theme_windowMinWidthMajor;
-    field public static int Theme_windowMinWidthMinor;
-    field public static int Theme_windowNoTitle;
-    field public static final int[] Toolbar;
-    field public static int Toolbar_android_gravity;
-    field public static int Toolbar_android_minHeight;
-    field public static int Toolbar_collapseContentDescription;
-    field public static int Toolbar_collapseIcon;
-    field public static int Toolbar_contentInsetEnd;
-    field public static int Toolbar_contentInsetLeft;
-    field public static int Toolbar_contentInsetRight;
-    field public static int Toolbar_contentInsetStart;
-    field public static int Toolbar_maxButtonHeight;
-    field public static int Toolbar_navigationContentDescription;
-    field public static int Toolbar_navigationIcon;
-    field public static int Toolbar_popupTheme;
-    field public static int Toolbar_subtitle;
-    field public static int Toolbar_subtitleTextAppearance;
-    field public static int Toolbar_title;
-    field public static int Toolbar_titleMarginBottom;
-    field public static int Toolbar_titleMarginEnd;
-    field public static int Toolbar_titleMarginStart;
-    field public static int Toolbar_titleMarginTop;
-    field public static int Toolbar_titleMargins;
-    field public static int Toolbar_titleTextAppearance;
-    field public static final int[] View;
-    field public static final int[] ViewStubCompat;
-    field public static int ViewStubCompat_android_id;
-    field public static int ViewStubCompat_android_inflatedId;
-    field public static int ViewStubCompat_android_layout;
-    field public static int View_android_focusable;
-    field public static int View_android_theme;
-    field public static int View_backgroundTint;
-    field public static int View_backgroundTintMode;
-    field public static int View_paddingEnd;
-    field public static int View_paddingStart;
-    field public static int View_theme;
-  }
-
-}
-
-package android.support.v7.view {
-
-  public abstract class ActionMode {
-    ctor public ActionMode();
-    method public abstract void finish();
-    method public abstract android.view.View getCustomView();
-    method public abstract android.view.Menu getMenu();
-    method public abstract android.view.MenuInflater getMenuInflater();
-    method public abstract java.lang.CharSequence getSubtitle();
-    method public java.lang.Object getTag();
-    method public abstract java.lang.CharSequence getTitle();
-    method public boolean getTitleOptionalHint();
-    method public abstract void invalidate();
-    method public boolean isTitleOptional();
-    method public abstract void setCustomView(android.view.View);
-    method public abstract void setSubtitle(java.lang.CharSequence);
-    method public abstract void setSubtitle(int);
-    method public void setTag(java.lang.Object);
-    method public abstract void setTitle(java.lang.CharSequence);
-    method public abstract void setTitle(int);
-    method public void setTitleOptionalHint(boolean);
-  }
-
-  public static abstract interface ActionMode.Callback {
-    method public abstract boolean onActionItemClicked(android.support.v7.view.ActionMode, android.view.MenuItem);
-    method public abstract boolean onCreateActionMode(android.support.v7.view.ActionMode, android.view.Menu);
-    method public abstract void onDestroyActionMode(android.support.v7.view.ActionMode);
-    method public abstract boolean onPrepareActionMode(android.support.v7.view.ActionMode, android.view.Menu);
-  }
-
-  public abstract interface CollapsibleActionView {
-    method public abstract void onActionViewCollapsed();
-    method public abstract void onActionViewExpanded();
-  }
-
-}
-
-package android.support.v7.widget {
-
-  public class ActionMenuView extends android.support.v7.widget.LinearLayoutCompat {
-    ctor public ActionMenuView(android.content.Context);
-    ctor public ActionMenuView(android.content.Context, android.util.AttributeSet);
-    method public void dismissPopupMenus();
-    method public android.view.Menu getMenu();
-    method public int getPopupTheme();
-    method public boolean hideOverflowMenu();
-    method public boolean isOverflowMenuShowing();
-    method public void onConfigurationChanged(android.content.res.Configuration);
-    method public void onDetachedFromWindow();
-    method public void setOnMenuItemClickListener(android.support.v7.widget.ActionMenuView.OnMenuItemClickListener);
-    method public void setPopupTheme(int);
-    method public boolean showOverflowMenu();
-  }
-
-  public static class ActionMenuView.LayoutParams extends android.support.v7.widget.LinearLayoutCompat.LayoutParams {
-    ctor public ActionMenuView.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public ActionMenuView.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public ActionMenuView.LayoutParams(android.support.v7.widget.ActionMenuView.LayoutParams);
-    ctor public ActionMenuView.LayoutParams(int, int);
-    field public int cellsUsed;
-    field public boolean expandable;
-    field public int extraPixels;
-    field public boolean isOverflowButton;
-    field public boolean preventEdgeOffset;
-  }
-
-  public static abstract interface ActionMenuView.OnMenuItemClickListener {
-    method public abstract boolean onMenuItemClick(android.view.MenuItem);
-  }
-
-  public class AppCompatAutoCompleteTextView extends android.widget.AutoCompleteTextView {
-    ctor public AppCompatAutoCompleteTextView(android.content.Context);
-    ctor public AppCompatAutoCompleteTextView(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatAutoCompleteTextView(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class AppCompatButton extends android.widget.Button {
-    ctor public AppCompatButton(android.content.Context);
-    ctor public AppCompatButton(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatButton(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class AppCompatCheckBox extends android.widget.CheckBox {
-    ctor public AppCompatCheckBox(android.content.Context);
-    ctor public AppCompatCheckBox(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatCheckBox(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class AppCompatCheckedTextView extends android.widget.CheckedTextView {
-    ctor public AppCompatCheckedTextView(android.content.Context);
-    ctor public AppCompatCheckedTextView(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatCheckedTextView(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class AppCompatEditText extends android.widget.EditText {
-    ctor public AppCompatEditText(android.content.Context);
-    ctor public AppCompatEditText(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatEditText(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class AppCompatMultiAutoCompleteTextView extends android.widget.MultiAutoCompleteTextView {
-    ctor public AppCompatMultiAutoCompleteTextView(android.content.Context);
-    ctor public AppCompatMultiAutoCompleteTextView(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatMultiAutoCompleteTextView(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class AppCompatRadioButton extends android.widget.RadioButton {
-    ctor public AppCompatRadioButton(android.content.Context);
-    ctor public AppCompatRadioButton(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatRadioButton(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class AppCompatRatingBar extends android.widget.RatingBar {
-    ctor public AppCompatRatingBar(android.content.Context);
-    ctor public AppCompatRatingBar(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatRatingBar(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class AppCompatSpinner extends android.widget.Spinner {
-    ctor public AppCompatSpinner(android.content.Context);
-    ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class AppCompatTextView extends android.widget.TextView {
-    ctor public AppCompatTextView(android.content.Context);
-    ctor public AppCompatTextView(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatTextView(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class LinearLayoutCompat extends android.view.ViewGroup {
-    ctor public LinearLayoutCompat(android.content.Context);
-    ctor public LinearLayoutCompat(android.content.Context, android.util.AttributeSet);
-    ctor public LinearLayoutCompat(android.content.Context, android.util.AttributeSet, int);
-    method public int getBaselineAlignedChildIndex();
-    method public android.graphics.drawable.Drawable getDividerDrawable();
-    method public int getDividerPadding();
-    method public int getOrientation();
-    method public int getShowDividers();
-    method public float getWeightSum();
-    method public boolean isBaselineAligned();
-    method public boolean isMeasureWithLargestChildEnabled();
-    method protected void onLayout(boolean, int, int, int, int);
-    method public void setBaselineAligned(boolean);
-    method public void setBaselineAlignedChildIndex(int);
-    method public void setDividerDrawable(android.graphics.drawable.Drawable);
-    method public void setDividerPadding(int);
-    method public void setGravity(int);
-    method public void setHorizontalGravity(int);
-    method public void setMeasureWithLargestChildEnabled(boolean);
-    method public void setOrientation(int);
-    method public void setShowDividers(int);
-    method public void setVerticalGravity(int);
-    method public void setWeightSum(float);
-    field public static final int HORIZONTAL = 0; // 0x0
-    field public static final int SHOW_DIVIDER_BEGINNING = 1; // 0x1
-    field public static final int SHOW_DIVIDER_END = 4; // 0x4
-    field public static final int SHOW_DIVIDER_MIDDLE = 2; // 0x2
-    field public static final int SHOW_DIVIDER_NONE = 0; // 0x0
-    field public static final int VERTICAL = 1; // 0x1
-  }
-
-  public static class LinearLayoutCompat.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
-    ctor public LinearLayoutCompat.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public LinearLayoutCompat.LayoutParams(int, int);
-    ctor public LinearLayoutCompat.LayoutParams(int, int, float);
-    ctor public LinearLayoutCompat.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public LinearLayoutCompat.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public LinearLayoutCompat.LayoutParams(android.support.v7.widget.LinearLayoutCompat.LayoutParams);
-    field public int gravity;
-    field public float weight;
-  }
-
-  public class ListPopupWindow {
-    ctor public ListPopupWindow(android.content.Context);
-    ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet);
-    ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet, int);
-    ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet, int, int);
-    method public void clearListSelection();
-    method public android.view.View.OnTouchListener createDragToOpenListener(android.view.View);
-    method public void dismiss();
-    method public android.view.View getAnchorView();
-    method public int getAnimationStyle();
-    method public android.graphics.drawable.Drawable getBackground();
-    method public int getHeight();
-    method public int getHorizontalOffset();
-    method public int getInputMethodMode();
-    method public android.widget.ListView getListView();
-    method public int getPromptPosition();
-    method public java.lang.Object getSelectedItem();
-    method public long getSelectedItemId();
-    method public int getSelectedItemPosition();
-    method public android.view.View getSelectedView();
-    method public int getSoftInputMode();
-    method public int getVerticalOffset();
-    method public int getWidth();
-    method public boolean isInputMethodNotNeeded();
-    method public boolean isModal();
-    method public boolean isShowing();
-    method public boolean onKeyDown(int, android.view.KeyEvent);
-    method public boolean onKeyPreIme(int, android.view.KeyEvent);
-    method public boolean onKeyUp(int, android.view.KeyEvent);
-    method public boolean performItemClick(int);
-    method public void postShow();
-    method public void setAdapter(android.widget.ListAdapter);
-    method public void setAnchorView(android.view.View);
-    method public void setAnimationStyle(int);
-    method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
-    method public void setContentWidth(int);
-    method public void setDropDownGravity(int);
-    method public void setHeight(int);
-    method public void setHorizontalOffset(int);
-    method public void setInputMethodMode(int);
-    method public void setListSelector(android.graphics.drawable.Drawable);
-    method public void setModal(boolean);
-    method public void setOnDismissListener(android.widget.PopupWindow.OnDismissListener);
-    method public void setOnItemClickListener(android.widget.AdapterView.OnItemClickListener);
-    method public void setOnItemSelectedListener(android.widget.AdapterView.OnItemSelectedListener);
-    method public void setPromptPosition(int);
-    method public void setPromptView(android.view.View);
-    method public void setSelection(int);
-    method public void setSoftInputMode(int);
-    method public void setVerticalOffset(int);
-    method public void setWidth(int);
-    method public void show();
-    field public static final int INPUT_METHOD_FROM_FOCUSABLE = 0; // 0x0
-    field public static final int INPUT_METHOD_NEEDED = 1; // 0x1
-    field public static final int INPUT_METHOD_NOT_NEEDED = 2; // 0x2
-    field public static final int MATCH_PARENT = -1; // 0xffffffff
-    field public static final int POSITION_PROMPT_ABOVE = 0; // 0x0
-    field public static final int POSITION_PROMPT_BELOW = 1; // 0x1
-    field public static final int WRAP_CONTENT = -2; // 0xfffffffe
-  }
-
-  public class PopupMenu {
-    ctor public PopupMenu(android.content.Context, android.view.View);
-    ctor public PopupMenu(android.content.Context, android.view.View, int);
-    ctor public PopupMenu(android.content.Context, android.view.View, int, int, int);
-    method public void dismiss();
-    method public android.view.View.OnTouchListener getDragToOpenListener();
-    method public android.view.Menu getMenu();
-    method public android.view.MenuInflater getMenuInflater();
-    method public void inflate(int);
-    method public void setOnDismissListener(android.support.v7.widget.PopupMenu.OnDismissListener);
-    method public void setOnMenuItemClickListener(android.support.v7.widget.PopupMenu.OnMenuItemClickListener);
-    method public void show();
-  }
-
-  public static abstract interface PopupMenu.OnDismissListener {
-    method public abstract void onDismiss(android.support.v7.widget.PopupMenu);
-  }
-
-  public static abstract interface PopupMenu.OnMenuItemClickListener {
-    method public abstract boolean onMenuItemClick(android.view.MenuItem);
-  }
-
-  public class SearchView extends android.support.v7.widget.LinearLayoutCompat implements android.support.v7.view.CollapsibleActionView {
-    ctor public SearchView(android.content.Context);
-    ctor public SearchView(android.content.Context, android.util.AttributeSet);
-    ctor public SearchView(android.content.Context, android.util.AttributeSet, int);
-    method public int getImeOptions();
-    method public int getInputType();
-    method public int getMaxWidth();
-    method public java.lang.CharSequence getQuery();
-    method public java.lang.CharSequence getQueryHint();
-    method public android.support.v4.widget.CursorAdapter getSuggestionsAdapter();
-    method public boolean isIconfiedByDefault();
-    method public boolean isIconified();
-    method public boolean isQueryRefinementEnabled();
-    method public boolean isSubmitButtonEnabled();
-    method public void onActionViewCollapsed();
-    method public void onActionViewExpanded();
-    method public void setIconified(boolean);
-    method public void setIconifiedByDefault(boolean);
-    method public void setImeOptions(int);
-    method public void setInputType(int);
-    method public void setMaxWidth(int);
-    method public void setOnCloseListener(android.support.v7.widget.SearchView.OnCloseListener);
-    method public void setOnQueryTextFocusChangeListener(android.view.View.OnFocusChangeListener);
-    method public void setOnQueryTextListener(android.support.v7.widget.SearchView.OnQueryTextListener);
-    method public void setOnSearchClickListener(android.view.View.OnClickListener);
-    method public void setOnSuggestionListener(android.support.v7.widget.SearchView.OnSuggestionListener);
-    method public void setQuery(java.lang.CharSequence, boolean);
-    method public void setQueryHint(java.lang.CharSequence);
-    method public void setQueryRefinementEnabled(boolean);
-    method public void setSearchableInfo(android.app.SearchableInfo);
-    method public void setSubmitButtonEnabled(boolean);
-    method public void setSuggestionsAdapter(android.support.v4.widget.CursorAdapter);
-  }
-
-  public static abstract interface SearchView.OnCloseListener {
-    method public abstract boolean onClose();
-  }
-
-  public static abstract interface SearchView.OnQueryTextListener {
-    method public abstract boolean onQueryTextChange(java.lang.String);
-    method public abstract boolean onQueryTextSubmit(java.lang.String);
-  }
-
-  public static abstract interface SearchView.OnSuggestionListener {
-    method public abstract boolean onSuggestionClick(int);
-    method public abstract boolean onSuggestionSelect(int);
-  }
-
-  public class ShareActionProvider extends android.support.v4.view.ActionProvider {
-    ctor public ShareActionProvider(android.content.Context);
-    method public android.view.View onCreateActionView();
-    method public void setOnShareTargetSelectedListener(android.support.v7.widget.ShareActionProvider.OnShareTargetSelectedListener);
-    method public void setShareHistoryFileName(java.lang.String);
-    method public void setShareIntent(android.content.Intent);
-    field public static final java.lang.String DEFAULT_SHARE_HISTORY_FILE_NAME = "share_history.xml";
-  }
-
-  public static abstract interface ShareActionProvider.OnShareTargetSelectedListener {
-    method public abstract boolean onShareTargetSelected(android.support.v7.widget.ShareActionProvider, android.content.Intent);
-  }
-
-  public class SwitchCompat extends android.widget.CompoundButton {
-    ctor public SwitchCompat(android.content.Context);
-    ctor public SwitchCompat(android.content.Context, android.util.AttributeSet);
-    ctor public SwitchCompat(android.content.Context, android.util.AttributeSet, int);
-    method public boolean getShowText();
-    method public boolean getSplitTrack();
-    method public int getSwitchMinWidth();
-    method public int getSwitchPadding();
-    method public java.lang.CharSequence getTextOff();
-    method public java.lang.CharSequence getTextOn();
-    method public android.graphics.drawable.Drawable getThumbDrawable();
-    method public int getThumbTextPadding();
-    method public android.graphics.drawable.Drawable getTrackDrawable();
-    method public void onMeasure(int, int);
-    method public void setShowText(boolean);
-    method public void setSplitTrack(boolean);
-    method public void setSwitchMinWidth(int);
-    method public void setSwitchPadding(int);
-    method public void setSwitchTextAppearance(android.content.Context, int);
-    method public void setSwitchTypeface(android.graphics.Typeface, int);
-    method public void setSwitchTypeface(android.graphics.Typeface);
-    method public void setTextOff(java.lang.CharSequence);
-    method public void setTextOn(java.lang.CharSequence);
-    method public void setThumbDrawable(android.graphics.drawable.Drawable);
-    method public void setThumbResource(int);
-    method public void setThumbTextPadding(int);
-    method public void setTrackDrawable(android.graphics.drawable.Drawable);
-    method public void setTrackResource(int);
-  }
-
-  public class Toolbar extends android.view.ViewGroup {
-    ctor public Toolbar(android.content.Context);
-    ctor public Toolbar(android.content.Context, android.util.AttributeSet);
-    ctor public Toolbar(android.content.Context, android.util.AttributeSet, int);
-    method public void collapseActionView();
-    method public void dismissPopupMenus();
-    method public int getContentInsetEnd();
-    method public int getContentInsetLeft();
-    method public int getContentInsetRight();
-    method public int getContentInsetStart();
-    method public android.graphics.drawable.Drawable getLogo();
-    method public java.lang.CharSequence getLogoDescription();
-    method public android.view.Menu getMenu();
-    method public java.lang.CharSequence getNavigationContentDescription();
-    method public android.graphics.drawable.Drawable getNavigationIcon();
-    method public int getPopupTheme();
-    method public java.lang.CharSequence getSubtitle();
-    method public java.lang.CharSequence getTitle();
-    method public boolean hasExpandedActionView();
-    method public boolean hideOverflowMenu();
-    method public void inflateMenu(int);
-    method public boolean isOverflowMenuShowing();
-    method protected void onLayout(boolean, int, int, int, int);
-    method public void setContentInsetsAbsolute(int, int);
-    method public void setContentInsetsRelative(int, int);
-    method public void setLogo(int);
-    method public void setLogo(android.graphics.drawable.Drawable);
-    method public void setLogoDescription(int);
-    method public void setLogoDescription(java.lang.CharSequence);
-    method public void setNavigationContentDescription(int);
-    method public void setNavigationContentDescription(java.lang.CharSequence);
-    method public void setNavigationIcon(int);
-    method public void setNavigationIcon(android.graphics.drawable.Drawable);
-    method public void setNavigationOnClickListener(android.view.View.OnClickListener);
-    method public void setOnMenuItemClickListener(android.support.v7.widget.Toolbar.OnMenuItemClickListener);
-    method public void setPopupTheme(int);
-    method public void setSubtitle(int);
-    method public void setSubtitle(java.lang.CharSequence);
-    method public void setSubtitleTextAppearance(android.content.Context, int);
-    method public void setSubtitleTextColor(int);
-    method public void setTitle(int);
-    method public void setTitle(java.lang.CharSequence);
-    method public void setTitleTextAppearance(android.content.Context, int);
-    method public void setTitleTextColor(int);
-    method public boolean showOverflowMenu();
-  }
-
-  public static class Toolbar.LayoutParams extends android.support.v7.app.ActionBar.LayoutParams {
-    ctor public Toolbar.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public Toolbar.LayoutParams(int, int);
-    ctor public Toolbar.LayoutParams(int, int, int);
-    ctor public Toolbar.LayoutParams(int);
-    ctor public Toolbar.LayoutParams(android.support.v7.widget.Toolbar.LayoutParams);
-    ctor public Toolbar.LayoutParams(android.support.v7.app.ActionBar.LayoutParams);
-    ctor public Toolbar.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public Toolbar.LayoutParams(android.view.ViewGroup.LayoutParams);
-  }
-
-  public static abstract interface Toolbar.OnMenuItemClickListener {
-    method public abstract boolean onMenuItemClick(android.view.MenuItem);
-  }
-
-}
-
diff --git a/v7/appcompat/api/22.2.1.txt b/v7/appcompat/api/22.2.1.txt
deleted file mode 100644
index 1f3e4e7..0000000
--- a/v7/appcompat/api/22.2.1.txt
+++ /dev/null
@@ -1,1936 +0,0 @@
-package android.support.v7.app {
-
-  public abstract class ActionBar {
-    ctor public ActionBar();
-    method public abstract void addOnMenuVisibilityListener(android.support.v7.app.ActionBar.OnMenuVisibilityListener);
-    method public abstract deprecated void addTab(android.support.v7.app.ActionBar.Tab);
-    method public abstract deprecated void addTab(android.support.v7.app.ActionBar.Tab, boolean);
-    method public abstract deprecated void addTab(android.support.v7.app.ActionBar.Tab, int);
-    method public abstract deprecated void addTab(android.support.v7.app.ActionBar.Tab, int, boolean);
-    method public abstract android.view.View getCustomView();
-    method public abstract int getDisplayOptions();
-    method public float getElevation();
-    method public abstract int getHeight();
-    method public int getHideOffset();
-    method public abstract deprecated int getNavigationItemCount();
-    method public abstract deprecated int getNavigationMode();
-    method public abstract deprecated int getSelectedNavigationIndex();
-    method public abstract deprecated android.support.v7.app.ActionBar.Tab getSelectedTab();
-    method public abstract java.lang.CharSequence getSubtitle();
-    method public abstract deprecated android.support.v7.app.ActionBar.Tab getTabAt(int);
-    method public abstract deprecated int getTabCount();
-    method public android.content.Context getThemedContext();
-    method public abstract java.lang.CharSequence getTitle();
-    method public abstract void hide();
-    method public boolean isHideOnContentScrollEnabled();
-    method public abstract boolean isShowing();
-    method public abstract deprecated android.support.v7.app.ActionBar.Tab newTab();
-    method public abstract deprecated void removeAllTabs();
-    method public abstract void removeOnMenuVisibilityListener(android.support.v7.app.ActionBar.OnMenuVisibilityListener);
-    method public abstract deprecated void removeTab(android.support.v7.app.ActionBar.Tab);
-    method public abstract deprecated void removeTabAt(int);
-    method public abstract deprecated void selectTab(android.support.v7.app.ActionBar.Tab);
-    method public abstract void setBackgroundDrawable(android.graphics.drawable.Drawable);
-    method public abstract void setCustomView(android.view.View);
-    method public abstract void setCustomView(android.view.View, android.support.v7.app.ActionBar.LayoutParams);
-    method public abstract void setCustomView(int);
-    method public abstract void setDisplayHomeAsUpEnabled(boolean);
-    method public abstract void setDisplayOptions(int);
-    method public abstract void setDisplayOptions(int, int);
-    method public abstract void setDisplayShowCustomEnabled(boolean);
-    method public abstract void setDisplayShowHomeEnabled(boolean);
-    method public abstract void setDisplayShowTitleEnabled(boolean);
-    method public abstract void setDisplayUseLogoEnabled(boolean);
-    method public void setElevation(float);
-    method public void setHideOffset(int);
-    method public void setHideOnContentScrollEnabled(boolean);
-    method public void setHomeActionContentDescription(java.lang.CharSequence);
-    method public void setHomeActionContentDescription(int);
-    method public void setHomeAsUpIndicator(android.graphics.drawable.Drawable);
-    method public void setHomeAsUpIndicator(int);
-    method public void setHomeButtonEnabled(boolean);
-    method public abstract void setIcon(int);
-    method public abstract void setIcon(android.graphics.drawable.Drawable);
-    method public abstract deprecated void setListNavigationCallbacks(android.widget.SpinnerAdapter, android.support.v7.app.ActionBar.OnNavigationListener);
-    method public abstract void setLogo(int);
-    method public abstract void setLogo(android.graphics.drawable.Drawable);
-    method public abstract deprecated void setNavigationMode(int);
-    method public abstract deprecated void setSelectedNavigationItem(int);
-    method public void setSplitBackgroundDrawable(android.graphics.drawable.Drawable);
-    method public void setStackedBackgroundDrawable(android.graphics.drawable.Drawable);
-    method public abstract void setSubtitle(java.lang.CharSequence);
-    method public abstract void setSubtitle(int);
-    method public abstract void setTitle(java.lang.CharSequence);
-    method public abstract void setTitle(int);
-    method public abstract void show();
-    field public static final int DISPLAY_HOME_AS_UP = 4; // 0x4
-    field public static final int DISPLAY_SHOW_CUSTOM = 16; // 0x10
-    field public static final int DISPLAY_SHOW_HOME = 2; // 0x2
-    field public static final int DISPLAY_SHOW_TITLE = 8; // 0x8
-    field public static final int DISPLAY_USE_LOGO = 1; // 0x1
-    field public static final deprecated int NAVIGATION_MODE_LIST = 1; // 0x1
-    field public static final deprecated int NAVIGATION_MODE_STANDARD = 0; // 0x0
-    field public static final deprecated int NAVIGATION_MODE_TABS = 2; // 0x2
-  }
-
-  public static class ActionBar.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
-    ctor public ActionBar.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public ActionBar.LayoutParams(int, int);
-    ctor public ActionBar.LayoutParams(int, int, int);
-    ctor public ActionBar.LayoutParams(int);
-    ctor public ActionBar.LayoutParams(android.support.v7.app.ActionBar.LayoutParams);
-    ctor public ActionBar.LayoutParams(android.view.ViewGroup.LayoutParams);
-    field public int gravity;
-  }
-
-  public static abstract interface ActionBar.OnMenuVisibilityListener {
-    method public abstract void onMenuVisibilityChanged(boolean);
-  }
-
-  public static abstract deprecated interface ActionBar.OnNavigationListener {
-    method public abstract boolean onNavigationItemSelected(int, long);
-  }
-
-  public static abstract deprecated class ActionBar.Tab {
-    ctor public ActionBar.Tab();
-    method public abstract java.lang.CharSequence getContentDescription();
-    method public abstract android.view.View getCustomView();
-    method public abstract android.graphics.drawable.Drawable getIcon();
-    method public abstract int getPosition();
-    method public abstract java.lang.Object getTag();
-    method public abstract java.lang.CharSequence getText();
-    method public abstract void select();
-    method public abstract android.support.v7.app.ActionBar.Tab setContentDescription(int);
-    method public abstract android.support.v7.app.ActionBar.Tab setContentDescription(java.lang.CharSequence);
-    method public abstract android.support.v7.app.ActionBar.Tab setCustomView(android.view.View);
-    method public abstract android.support.v7.app.ActionBar.Tab setCustomView(int);
-    method public abstract android.support.v7.app.ActionBar.Tab setIcon(android.graphics.drawable.Drawable);
-    method public abstract android.support.v7.app.ActionBar.Tab setIcon(int);
-    method public abstract android.support.v7.app.ActionBar.Tab setTabListener(android.support.v7.app.ActionBar.TabListener);
-    method public abstract android.support.v7.app.ActionBar.Tab setTag(java.lang.Object);
-    method public abstract android.support.v7.app.ActionBar.Tab setText(java.lang.CharSequence);
-    method public abstract android.support.v7.app.ActionBar.Tab setText(int);
-    field public static final int INVALID_POSITION = -1; // 0xffffffff
-  }
-
-  public static abstract deprecated interface ActionBar.TabListener {
-    method public abstract void onTabReselected(android.support.v7.app.ActionBar.Tab, android.support.v4.app.FragmentTransaction);
-    method public abstract void onTabSelected(android.support.v7.app.ActionBar.Tab, android.support.v4.app.FragmentTransaction);
-    method public abstract void onTabUnselected(android.support.v7.app.ActionBar.Tab, android.support.v4.app.FragmentTransaction);
-  }
-
-  public deprecated class ActionBarActivity extends android.support.v7.app.AppCompatActivity {
-    ctor public ActionBarActivity();
-  }
-
-  public class ActionBarDrawerToggle implements android.support.v4.widget.DrawerLayout.DrawerListener {
-    ctor public ActionBarDrawerToggle(android.app.Activity, android.support.v4.widget.DrawerLayout, int, int);
-    ctor public ActionBarDrawerToggle(android.app.Activity, android.support.v4.widget.DrawerLayout, android.support.v7.widget.Toolbar, int, int);
-    method public android.view.View.OnClickListener getToolbarNavigationClickListener();
-    method public boolean isDrawerIndicatorEnabled();
-    method public void onConfigurationChanged(android.content.res.Configuration);
-    method public void onDrawerClosed(android.view.View);
-    method public void onDrawerOpened(android.view.View);
-    method public void onDrawerSlide(android.view.View, float);
-    method public void onDrawerStateChanged(int);
-    method public boolean onOptionsItemSelected(android.view.MenuItem);
-    method public void setDrawerIndicatorEnabled(boolean);
-    method public void setHomeAsUpIndicator(android.graphics.drawable.Drawable);
-    method public void setHomeAsUpIndicator(int);
-    method public void setToolbarNavigationClickListener(android.view.View.OnClickListener);
-    method public void syncState();
-  }
-
-  public static abstract interface ActionBarDrawerToggle.Delegate {
-    method public abstract android.content.Context getActionBarThemedContext();
-    method public abstract android.graphics.drawable.Drawable getThemeUpIndicator();
-    method public abstract boolean isNavigationVisible();
-    method public abstract void setActionBarDescription(int);
-    method public abstract void setActionBarUpIndicator(android.graphics.drawable.Drawable, int);
-  }
-
-  public static abstract interface ActionBarDrawerToggle.DelegateProvider {
-    method public abstract android.support.v7.app.ActionBarDrawerToggle.Delegate getDrawerToggleDelegate();
-  }
-
-  public class AlertDialog extends android.support.v7.app.AppCompatDialog implements android.content.DialogInterface {
-    ctor protected AlertDialog(android.content.Context);
-    ctor protected AlertDialog(android.content.Context, int);
-    ctor protected AlertDialog(android.content.Context, boolean, android.content.DialogInterface.OnCancelListener);
-    method public android.widget.Button getButton(int);
-    method public android.widget.ListView getListView();
-    method public void setButton(int, java.lang.CharSequence, android.os.Message);
-    method public void setButton(int, java.lang.CharSequence, android.content.DialogInterface.OnClickListener);
-    method public void setCustomTitle(android.view.View);
-    method public void setIcon(int);
-    method public void setIcon(android.graphics.drawable.Drawable);
-    method public void setIconAttribute(int);
-    method public void setMessage(java.lang.CharSequence);
-    method public void setView(android.view.View);
-    method public void setView(android.view.View, int, int, int, int);
-  }
-
-  public static class AlertDialog.Builder {
-    ctor public AlertDialog.Builder(android.content.Context);
-    ctor public AlertDialog.Builder(android.content.Context, int);
-    method public android.support.v7.app.AlertDialog create();
-    method public android.content.Context getContext();
-    method public android.support.v7.app.AlertDialog.Builder setAdapter(android.widget.ListAdapter, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setCancelable(boolean);
-    method public android.support.v7.app.AlertDialog.Builder setCursor(android.database.Cursor, android.content.DialogInterface.OnClickListener, java.lang.String);
-    method public android.support.v7.app.AlertDialog.Builder setCustomTitle(android.view.View);
-    method public android.support.v7.app.AlertDialog.Builder setIcon(int);
-    method public android.support.v7.app.AlertDialog.Builder setIcon(android.graphics.drawable.Drawable);
-    method public android.support.v7.app.AlertDialog.Builder setIconAttribute(int);
-    method public android.support.v7.app.AlertDialog.Builder setInverseBackgroundForced(boolean);
-    method public android.support.v7.app.AlertDialog.Builder setItems(int, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setItems(java.lang.CharSequence[], android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setMessage(int);
-    method public android.support.v7.app.AlertDialog.Builder setMessage(java.lang.CharSequence);
-    method public android.support.v7.app.AlertDialog.Builder setMultiChoiceItems(int, boolean[], android.content.DialogInterface.OnMultiChoiceClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setMultiChoiceItems(java.lang.CharSequence[], boolean[], android.content.DialogInterface.OnMultiChoiceClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setMultiChoiceItems(android.database.Cursor, java.lang.String, java.lang.String, android.content.DialogInterface.OnMultiChoiceClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setNegativeButton(int, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setNegativeButton(java.lang.CharSequence, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setNeutralButton(int, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setNeutralButton(java.lang.CharSequence, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setOnCancelListener(android.content.DialogInterface.OnCancelListener);
-    method public android.support.v7.app.AlertDialog.Builder setOnDismissListener(android.content.DialogInterface.OnDismissListener);
-    method public android.support.v7.app.AlertDialog.Builder setOnItemSelectedListener(android.widget.AdapterView.OnItemSelectedListener);
-    method public android.support.v7.app.AlertDialog.Builder setOnKeyListener(android.content.DialogInterface.OnKeyListener);
-    method public android.support.v7.app.AlertDialog.Builder setPositiveButton(int, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setPositiveButton(java.lang.CharSequence, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setSingleChoiceItems(int, int, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setSingleChoiceItems(android.database.Cursor, int, java.lang.String, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setSingleChoiceItems(java.lang.CharSequence[], int, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setSingleChoiceItems(android.widget.ListAdapter, int, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setTitle(int);
-    method public android.support.v7.app.AlertDialog.Builder setTitle(java.lang.CharSequence);
-    method public android.support.v7.app.AlertDialog.Builder setView(int);
-    method public android.support.v7.app.AlertDialog.Builder setView(android.view.View);
-    method public android.support.v7.app.AlertDialog show();
-  }
-
-  public class AppCompatActivity extends android.support.v4.app.FragmentActivity implements android.support.v7.app.ActionBarDrawerToggle.DelegateProvider android.support.v7.app.AppCompatCallback {
-    ctor public AppCompatActivity();
-    method public android.support.v7.app.AppCompatDelegate getDelegate();
-    method public android.support.v7.app.ActionBarDrawerToggle.Delegate getDrawerToggleDelegate();
-    method public android.support.v7.app.ActionBar getSupportActionBar();
-    method public android.content.Intent getSupportParentActivityIntent();
-    method public void onCreateSupportNavigateUpTaskStack(android.support.v4.app.TaskStackBuilder);
-    method public final boolean onMenuItemSelected(int, android.view.MenuItem);
-    method public void onPrepareSupportNavigateUpTaskStack(android.support.v4.app.TaskStackBuilder);
-    method public void onSupportActionModeFinished(android.support.v7.view.ActionMode);
-    method public void onSupportActionModeStarted(android.support.v7.view.ActionMode);
-    method public deprecated void onSupportContentChanged();
-    method public boolean onSupportNavigateUp();
-    method public android.support.v7.view.ActionMode onWindowStartingSupportActionMode(android.support.v7.view.ActionMode.Callback);
-    method public void setSupportActionBar(android.support.v7.widget.Toolbar);
-    method public deprecated void setSupportProgress(int);
-    method public deprecated void setSupportProgressBarIndeterminate(boolean);
-    method public deprecated void setSupportProgressBarIndeterminateVisibility(boolean);
-    method public deprecated void setSupportProgressBarVisibility(boolean);
-    method public android.support.v7.view.ActionMode startSupportActionMode(android.support.v7.view.ActionMode.Callback);
-    method public void supportNavigateUpTo(android.content.Intent);
-    method public boolean supportRequestWindowFeature(int);
-    method public boolean supportShouldUpRecreateTask(android.content.Intent);
-  }
-
-  public abstract interface AppCompatCallback {
-    method public abstract void onSupportActionModeFinished(android.support.v7.view.ActionMode);
-    method public abstract void onSupportActionModeStarted(android.support.v7.view.ActionMode);
-    method public abstract android.support.v7.view.ActionMode onWindowStartingSupportActionMode(android.support.v7.view.ActionMode.Callback);
-  }
-
-  public abstract class AppCompatDelegate {
-    method public abstract void addContentView(android.view.View, android.view.ViewGroup.LayoutParams);
-    method public static android.support.v7.app.AppCompatDelegate create(android.app.Activity, android.support.v7.app.AppCompatCallback);
-    method public static android.support.v7.app.AppCompatDelegate create(android.app.Dialog, android.support.v7.app.AppCompatCallback);
-    method public abstract android.view.View createView(android.view.View, java.lang.String, android.content.Context, android.util.AttributeSet);
-    method public abstract android.support.v7.app.ActionBarDrawerToggle.Delegate getDrawerToggleDelegate();
-    method public abstract android.view.MenuInflater getMenuInflater();
-    method public abstract android.support.v7.app.ActionBar getSupportActionBar();
-    method public abstract void installViewFactory();
-    method public abstract void invalidateOptionsMenu();
-    method public abstract boolean isHandleNativeActionModesEnabled();
-    method public abstract void onConfigurationChanged(android.content.res.Configuration);
-    method public abstract void onCreate(android.os.Bundle);
-    method public abstract void onDestroy();
-    method public abstract void onPostCreate(android.os.Bundle);
-    method public abstract void onPostResume();
-    method public abstract void onStop();
-    method public abstract boolean requestWindowFeature(int);
-    method public abstract void setContentView(android.view.View);
-    method public abstract void setContentView(int);
-    method public abstract void setContentView(android.view.View, android.view.ViewGroup.LayoutParams);
-    method public abstract void setHandleNativeActionModesEnabled(boolean);
-    method public abstract void setSupportActionBar(android.support.v7.widget.Toolbar);
-    method public abstract void setTitle(java.lang.CharSequence);
-    method public abstract android.support.v7.view.ActionMode startSupportActionMode(android.support.v7.view.ActionMode.Callback);
-  }
-
-  public class AppCompatDialog extends android.app.Dialog implements android.support.v7.app.AppCompatCallback {
-    ctor public AppCompatDialog(android.content.Context);
-    ctor public AppCompatDialog(android.content.Context, int);
-    ctor protected AppCompatDialog(android.content.Context, boolean, android.content.DialogInterface.OnCancelListener);
-    method public android.support.v7.app.AppCompatDelegate getDelegate();
-    method public android.support.v7.app.ActionBar getSupportActionBar();
-    method public void onSupportActionModeFinished(android.support.v7.view.ActionMode);
-    method public void onSupportActionModeStarted(android.support.v7.view.ActionMode);
-    method public android.support.v7.view.ActionMode onWindowStartingSupportActionMode(android.support.v7.view.ActionMode.Callback);
-    method public boolean supportRequestWindowFeature(int);
-  }
-
-  public class NotificationCompat extends android.support.v4.app.NotificationCompat {
-    ctor public NotificationCompat();
-  }
-
-  public static class NotificationCompat.Builder extends android.support.v4.app.NotificationCompat.Builder {
-    ctor public NotificationCompat.Builder(android.content.Context);
-  }
-
-  public static class NotificationCompat.MediaStyle extends android.support.v4.app.NotificationCompat.Style {
-    ctor public NotificationCompat.MediaStyle();
-    ctor public NotificationCompat.MediaStyle(android.support.v4.app.NotificationCompat.Builder);
-    method public android.support.v7.app.NotificationCompat.MediaStyle setCancelButtonIntent(android.app.PendingIntent);
-    method public android.support.v7.app.NotificationCompat.MediaStyle setMediaSession(android.support.v4.media.session.MediaSessionCompat.Token);
-    method public android.support.v7.app.NotificationCompat.MediaStyle setShowActionsInCompactView(int...);
-    method public android.support.v7.app.NotificationCompat.MediaStyle setShowCancelButton(boolean);
-  }
-
-}
-
-package android.support.v7.appcompat {
-
-  public final class R {
-    ctor public R();
-  }
-
-  public static final class R.anim {
-    ctor public R.anim();
-    field public static int abc_fade_in;
-    field public static int abc_fade_out;
-    field public static int abc_grow_fade_in_from_bottom;
-    field public static int abc_popup_enter;
-    field public static int abc_popup_exit;
-    field public static int abc_shrink_fade_out_from_bottom;
-    field public static int abc_slide_in_bottom;
-    field public static int abc_slide_in_top;
-    field public static int abc_slide_out_bottom;
-    field public static int abc_slide_out_top;
-  }
-
-  public static final class R.attr {
-    ctor public R.attr();
-    field public static int actionBarDivider;
-    field public static int actionBarItemBackground;
-    field public static int actionBarPopupTheme;
-    field public static int actionBarSize;
-    field public static int actionBarSplitStyle;
-    field public static int actionBarStyle;
-    field public static int actionBarTabBarStyle;
-    field public static int actionBarTabStyle;
-    field public static int actionBarTabTextStyle;
-    field public static int actionBarTheme;
-    field public static int actionBarWidgetTheme;
-    field public static int actionButtonStyle;
-    field public static int actionDropDownStyle;
-    field public static int actionLayout;
-    field public static int actionMenuTextAppearance;
-    field public static int actionMenuTextColor;
-    field public static int actionModeBackground;
-    field public static int actionModeCloseButtonStyle;
-    field public static int actionModeCloseDrawable;
-    field public static int actionModeCopyDrawable;
-    field public static int actionModeCutDrawable;
-    field public static int actionModeFindDrawable;
-    field public static int actionModePasteDrawable;
-    field public static int actionModePopupWindowStyle;
-    field public static int actionModeSelectAllDrawable;
-    field public static int actionModeShareDrawable;
-    field public static int actionModeSplitBackground;
-    field public static int actionModeStyle;
-    field public static int actionModeWebSearchDrawable;
-    field public static int actionOverflowButtonStyle;
-    field public static int actionOverflowMenuStyle;
-    field public static int actionProviderClass;
-    field public static int actionViewClass;
-    field public static int activityChooserViewStyle;
-    field public static int alertDialogButtonGroupStyle;
-    field public static int alertDialogCenterButtons;
-    field public static int alertDialogStyle;
-    field public static int alertDialogTheme;
-    field public static int autoCompleteTextViewStyle;
-    field public static int background;
-    field public static int backgroundSplit;
-    field public static int backgroundStacked;
-    field public static int backgroundTint;
-    field public static int backgroundTintMode;
-    field public static int barSize;
-    field public static int borderlessButtonStyle;
-    field public static int buttonBarButtonStyle;
-    field public static int buttonBarNegativeButtonStyle;
-    field public static int buttonBarNeutralButtonStyle;
-    field public static int buttonBarPositiveButtonStyle;
-    field public static int buttonBarStyle;
-    field public static int buttonPanelSideLayout;
-    field public static int buttonStyle;
-    field public static int buttonStyleSmall;
-    field public static int checkboxStyle;
-    field public static int checkedTextViewStyle;
-    field public static int closeIcon;
-    field public static int closeItemLayout;
-    field public static int collapseContentDescription;
-    field public static int collapseIcon;
-    field public static int color;
-    field public static int colorAccent;
-    field public static int colorButtonNormal;
-    field public static int colorControlActivated;
-    field public static int colorControlHighlight;
-    field public static int colorControlNormal;
-    field public static int colorPrimary;
-    field public static int colorPrimaryDark;
-    field public static int colorSwitchThumbNormal;
-    field public static int commitIcon;
-    field public static int contentInsetEnd;
-    field public static int contentInsetLeft;
-    field public static int contentInsetRight;
-    field public static int contentInsetStart;
-    field public static int customNavigationLayout;
-    field public static int defaultQueryHint;
-    field public static int dialogPreferredPadding;
-    field public static int dialogTheme;
-    field public static int disableChildrenWhenDisabled;
-    field public static int displayOptions;
-    field public static int divider;
-    field public static int dividerHorizontal;
-    field public static int dividerPadding;
-    field public static int dividerVertical;
-    field public static int drawableSize;
-    field public static int drawerArrowStyle;
-    field public static int dropDownListViewStyle;
-    field public static int dropdownListPreferredItemHeight;
-    field public static int editTextBackground;
-    field public static int editTextColor;
-    field public static int editTextStyle;
-    field public static int elevation;
-    field public static int expandActivityOverflowButtonDrawable;
-    field public static int gapBetweenBars;
-    field public static int goIcon;
-    field public static int height;
-    field public static int hideOnContentScroll;
-    field public static int homeAsUpIndicator;
-    field public static int homeLayout;
-    field public static int icon;
-    field public static int iconifiedByDefault;
-    field public static int indeterminateProgressStyle;
-    field public static int initialActivityCount;
-    field public static int isLightTheme;
-    field public static int itemPadding;
-    field public static int layout;
-    field public static int listChoiceBackgroundIndicator;
-    field public static int listDividerAlertDialog;
-    field public static int listItemLayout;
-    field public static int listLayout;
-    field public static int listPopupWindowStyle;
-    field public static int listPreferredItemHeight;
-    field public static int listPreferredItemHeightLarge;
-    field public static int listPreferredItemHeightSmall;
-    field public static int listPreferredItemPaddingLeft;
-    field public static int listPreferredItemPaddingRight;
-    field public static int logo;
-    field public static int maxButtonHeight;
-    field public static int measureWithLargestChild;
-    field public static int middleBarArrowSize;
-    field public static int multiChoiceItemLayout;
-    field public static int navigationContentDescription;
-    field public static int navigationIcon;
-    field public static int navigationMode;
-    field public static int overlapAnchor;
-    field public static int paddingEnd;
-    field public static int paddingStart;
-    field public static int panelBackground;
-    field public static int panelMenuListTheme;
-    field public static int panelMenuListWidth;
-    field public static int popupMenuStyle;
-    field public static int popupPromptView;
-    field public static int popupTheme;
-    field public static int popupWindowStyle;
-    field public static int preserveIconSpacing;
-    field public static int progressBarPadding;
-    field public static int progressBarStyle;
-    field public static int prompt;
-    field public static int queryBackground;
-    field public static int queryHint;
-    field public static int radioButtonStyle;
-    field public static int ratingBarStyle;
-    field public static int searchHintIcon;
-    field public static int searchIcon;
-    field public static int searchViewStyle;
-    field public static int selectableItemBackground;
-    field public static int selectableItemBackgroundBorderless;
-    field public static int showAsAction;
-    field public static int showDividers;
-    field public static int showText;
-    field public static int singleChoiceItemLayout;
-    field public static int spinBars;
-    field public static int spinnerDropDownItemStyle;
-    field public static int spinnerMode;
-    field public static int spinnerStyle;
-    field public static int splitTrack;
-    field public static int state_above_anchor;
-    field public static int submitBackground;
-    field public static int subtitle;
-    field public static int subtitleTextAppearance;
-    field public static int subtitleTextStyle;
-    field public static int suggestionRowLayout;
-    field public static int switchMinWidth;
-    field public static int switchPadding;
-    field public static int switchStyle;
-    field public static int switchTextAppearance;
-    field public static int textAllCaps;
-    field public static int textAppearanceLargePopupMenu;
-    field public static int textAppearanceListItem;
-    field public static int textAppearanceListItemSmall;
-    field public static int textAppearanceSearchResultSubtitle;
-    field public static int textAppearanceSearchResultTitle;
-    field public static int textAppearanceSmallPopupMenu;
-    field public static int textColorAlertDialogListItem;
-    field public static int textColorSearchUrl;
-    field public static int theme;
-    field public static int thickness;
-    field public static int thumbTextPadding;
-    field public static int title;
-    field public static int titleMarginBottom;
-    field public static int titleMarginEnd;
-    field public static int titleMarginStart;
-    field public static int titleMarginTop;
-    field public static int titleMargins;
-    field public static int titleTextAppearance;
-    field public static int titleTextStyle;
-    field public static int toolbarNavigationButtonStyle;
-    field public static int toolbarStyle;
-    field public static int topBottomBarArrowSize;
-    field public static int track;
-    field public static int voiceIcon;
-    field public static int windowActionBar;
-    field public static int windowActionBarOverlay;
-    field public static int windowActionModeOverlay;
-    field public static int windowFixedHeightMajor;
-    field public static int windowFixedHeightMinor;
-    field public static int windowFixedWidthMajor;
-    field public static int windowFixedWidthMinor;
-    field public static int windowMinWidthMajor;
-    field public static int windowMinWidthMinor;
-    field public static int windowNoTitle;
-  }
-
-  public static final class R.bool {
-    ctor public R.bool();
-    field public static int abc_action_bar_embed_tabs;
-    field public static int abc_action_bar_embed_tabs_pre_jb;
-    field public static int abc_action_bar_expanded_action_views_exclusive;
-    field public static int abc_config_actionMenuItemAllCaps;
-    field public static int abc_config_allowActionMenuItemTextWithIcon;
-    field public static int abc_config_closeDialogWhenTouchOutside;
-    field public static int abc_config_showMenuShortcutsWhenKeyboardPresent;
-  }
-
-  public static final class R.color {
-    ctor public R.color();
-    field public static int abc_background_cache_hint_selector_material_dark;
-    field public static int abc_background_cache_hint_selector_material_light;
-    field public static int abc_input_method_navigation_guard;
-    field public static int abc_primary_text_disable_only_material_dark;
-    field public static int abc_primary_text_disable_only_material_light;
-    field public static int abc_primary_text_material_dark;
-    field public static int abc_primary_text_material_light;
-    field public static int abc_search_url_text;
-    field public static int abc_search_url_text_normal;
-    field public static int abc_search_url_text_pressed;
-    field public static int abc_search_url_text_selected;
-    field public static int abc_secondary_text_material_dark;
-    field public static int abc_secondary_text_material_light;
-    field public static int accent_material_dark;
-    field public static int accent_material_light;
-    field public static int background_floating_material_dark;
-    field public static int background_floating_material_light;
-    field public static int background_material_dark;
-    field public static int background_material_light;
-    field public static int bright_foreground_disabled_material_dark;
-    field public static int bright_foreground_disabled_material_light;
-    field public static int bright_foreground_inverse_material_dark;
-    field public static int bright_foreground_inverse_material_light;
-    field public static int bright_foreground_material_dark;
-    field public static int bright_foreground_material_light;
-    field public static int button_material_dark;
-    field public static int button_material_light;
-    field public static int dim_foreground_disabled_material_dark;
-    field public static int dim_foreground_disabled_material_light;
-    field public static int dim_foreground_material_dark;
-    field public static int dim_foreground_material_light;
-    field public static int highlighted_text_material_dark;
-    field public static int highlighted_text_material_light;
-    field public static int hint_foreground_material_dark;
-    field public static int hint_foreground_material_light;
-    field public static int link_text_material_dark;
-    field public static int link_text_material_light;
-    field public static int material_blue_grey_800;
-    field public static int material_blue_grey_900;
-    field public static int material_blue_grey_950;
-    field public static int material_deep_teal_200;
-    field public static int material_deep_teal_500;
-    field public static int primary_dark_material_dark;
-    field public static int primary_dark_material_light;
-    field public static int primary_material_dark;
-    field public static int primary_material_light;
-    field public static int primary_text_default_material_dark;
-    field public static int primary_text_default_material_light;
-    field public static int primary_text_disabled_material_dark;
-    field public static int primary_text_disabled_material_light;
-    field public static int ripple_material_dark;
-    field public static int ripple_material_light;
-    field public static int secondary_text_default_material_dark;
-    field public static int secondary_text_default_material_light;
-    field public static int secondary_text_disabled_material_dark;
-    field public static int secondary_text_disabled_material_light;
-    field public static int switch_thumb_disabled_material_dark;
-    field public static int switch_thumb_disabled_material_light;
-    field public static int switch_thumb_material_dark;
-    field public static int switch_thumb_material_light;
-    field public static int switch_thumb_normal_material_dark;
-    field public static int switch_thumb_normal_material_light;
-  }
-
-  public static final class R.dimen {
-    ctor public R.dimen();
-    field public static int abc_action_bar_content_inset_material;
-    field public static int abc_action_bar_default_height_material;
-    field public static int abc_action_bar_default_padding_material;
-    field public static int abc_action_bar_icon_vertical_padding_material;
-    field public static int abc_action_bar_navigation_padding_start_material;
-    field public static int abc_action_bar_overflow_padding_end_material;
-    field public static int abc_action_bar_overflow_padding_start_material;
-    field public static int abc_action_bar_progress_bar_size;
-    field public static int abc_action_bar_stacked_max_height;
-    field public static int abc_action_bar_stacked_tab_max_width;
-    field public static int abc_action_bar_subtitle_bottom_margin_material;
-    field public static int abc_action_bar_subtitle_top_margin_material;
-    field public static int abc_action_button_min_height_material;
-    field public static int abc_action_button_min_width_material;
-    field public static int abc_action_button_min_width_overflow_material;
-    field public static int abc_alert_dialog_button_bar_height;
-    field public static int abc_button_inset_horizontal_material;
-    field public static int abc_button_inset_vertical_material;
-    field public static int abc_button_padding_horizontal_material;
-    field public static int abc_button_padding_vertical_material;
-    field public static int abc_config_prefDialogWidth;
-    field public static int abc_control_corner_material;
-    field public static int abc_control_inset_material;
-    field public static int abc_control_padding_material;
-    field public static int abc_dialog_list_padding_vertical_material;
-    field public static int abc_dialog_min_width_major;
-    field public static int abc_dialog_min_width_minor;
-    field public static int abc_dialog_padding_material;
-    field public static int abc_dialog_padding_top_material;
-    field public static int abc_disabled_alpha_material_dark;
-    field public static int abc_disabled_alpha_material_light;
-    field public static int abc_dropdownitem_icon_width;
-    field public static int abc_dropdownitem_text_padding_left;
-    field public static int abc_dropdownitem_text_padding_right;
-    field public static int abc_edit_text_inset_bottom_material;
-    field public static int abc_edit_text_inset_horizontal_material;
-    field public static int abc_edit_text_inset_top_material;
-    field public static int abc_floating_window_z;
-    field public static int abc_list_item_padding_horizontal_material;
-    field public static int abc_panel_menu_list_width;
-    field public static int abc_search_view_preferred_width;
-    field public static int abc_search_view_text_min_width;
-    field public static int abc_switch_padding;
-    field public static int abc_text_size_body_1_material;
-    field public static int abc_text_size_body_2_material;
-    field public static int abc_text_size_button_material;
-    field public static int abc_text_size_caption_material;
-    field public static int abc_text_size_display_1_material;
-    field public static int abc_text_size_display_2_material;
-    field public static int abc_text_size_display_3_material;
-    field public static int abc_text_size_display_4_material;
-    field public static int abc_text_size_headline_material;
-    field public static int abc_text_size_large_material;
-    field public static int abc_text_size_medium_material;
-    field public static int abc_text_size_menu_material;
-    field public static int abc_text_size_small_material;
-    field public static int abc_text_size_subhead_material;
-    field public static int abc_text_size_subtitle_material_toolbar;
-    field public static int abc_text_size_title_material;
-    field public static int abc_text_size_title_material_toolbar;
-    field public static int dialog_fixed_height_major;
-    field public static int dialog_fixed_height_minor;
-    field public static int dialog_fixed_width_major;
-    field public static int dialog_fixed_width_minor;
-    field public static int disabled_alpha_material_dark;
-    field public static int disabled_alpha_material_light;
-    field public static int notification_large_icon_height;
-    field public static int notification_large_icon_width;
-    field public static int notification_subtext_size;
-  }
-
-  public static final class R.drawable {
-    ctor public R.drawable();
-    field public static int abc_ab_share_pack_mtrl_alpha;
-    field public static int abc_btn_borderless_material;
-    field public static int abc_btn_check_material;
-    field public static int abc_btn_check_to_on_mtrl_000;
-    field public static int abc_btn_check_to_on_mtrl_015;
-    field public static int abc_btn_default_mtrl_shape;
-    field public static int abc_btn_radio_material;
-    field public static int abc_btn_radio_to_on_mtrl_000;
-    field public static int abc_btn_radio_to_on_mtrl_015;
-    field public static int abc_btn_rating_star_off_mtrl_alpha;
-    field public static int abc_btn_rating_star_on_mtrl_alpha;
-    field public static int abc_btn_switch_to_on_mtrl_00001;
-    field public static int abc_btn_switch_to_on_mtrl_00012;
-    field public static int abc_cab_background_internal_bg;
-    field public static int abc_cab_background_top_material;
-    field public static int abc_cab_background_top_mtrl_alpha;
-    field public static int abc_dialog_material_background_dark;
-    field public static int abc_dialog_material_background_light;
-    field public static int abc_edit_text_material;
-    field public static int abc_ic_ab_back_mtrl_am_alpha;
-    field public static int abc_ic_clear_mtrl_alpha;
-    field public static int abc_ic_commit_search_api_mtrl_alpha;
-    field public static int abc_ic_go_search_api_mtrl_alpha;
-    field public static int abc_ic_menu_copy_mtrl_am_alpha;
-    field public static int abc_ic_menu_cut_mtrl_alpha;
-    field public static int abc_ic_menu_moreoverflow_mtrl_alpha;
-    field public static int abc_ic_menu_paste_mtrl_am_alpha;
-    field public static int abc_ic_menu_selectall_mtrl_alpha;
-    field public static int abc_ic_menu_share_mtrl_alpha;
-    field public static int abc_ic_search_api_mtrl_alpha;
-    field public static int abc_ic_voice_search_api_mtrl_alpha;
-    field public static int abc_item_background_holo_dark;
-    field public static int abc_item_background_holo_light;
-    field public static int abc_list_divider_mtrl_alpha;
-    field public static int abc_list_focused_holo;
-    field public static int abc_list_longpressed_holo;
-    field public static int abc_list_pressed_holo_dark;
-    field public static int abc_list_pressed_holo_light;
-    field public static int abc_list_selector_background_transition_holo_dark;
-    field public static int abc_list_selector_background_transition_holo_light;
-    field public static int abc_list_selector_disabled_holo_dark;
-    field public static int abc_list_selector_disabled_holo_light;
-    field public static int abc_list_selector_holo_dark;
-    field public static int abc_list_selector_holo_light;
-    field public static int abc_menu_hardkey_panel_mtrl_mult;
-    field public static int abc_popup_background_mtrl_mult;
-    field public static int abc_ratingbar_full_material;
-    field public static int abc_spinner_mtrl_am_alpha;
-    field public static int abc_spinner_textfield_background_material;
-    field public static int abc_switch_thumb_material;
-    field public static int abc_switch_track_mtrl_alpha;
-    field public static int abc_tab_indicator_material;
-    field public static int abc_tab_indicator_mtrl_alpha;
-    field public static int abc_text_cursor_mtrl_alpha;
-    field public static int abc_textfield_activated_mtrl_alpha;
-    field public static int abc_textfield_default_mtrl_alpha;
-    field public static int abc_textfield_search_activated_mtrl_alpha;
-    field public static int abc_textfield_search_default_mtrl_alpha;
-    field public static int abc_textfield_search_material;
-    field public static int notification_template_icon_bg;
-  }
-
-  public static final class R.id {
-    ctor public R.id();
-    field public static int action0;
-    field public static int action_bar;
-    field public static int action_bar_activity_content;
-    field public static int action_bar_container;
-    field public static int action_bar_root;
-    field public static int action_bar_spinner;
-    field public static int action_bar_subtitle;
-    field public static int action_bar_title;
-    field public static int action_context_bar;
-    field public static int action_divider;
-    field public static int action_menu_divider;
-    field public static int action_menu_presenter;
-    field public static int action_mode_bar;
-    field public static int action_mode_bar_stub;
-    field public static int action_mode_close_button;
-    field public static int activity_chooser_view_content;
-    field public static int alertTitle;
-    field public static int always;
-    field public static int beginning;
-    field public static int buttonPanel;
-    field public static int cancel_action;
-    field public static int checkbox;
-    field public static int chronometer;
-    field public static int collapseActionView;
-    field public static int contentPanel;
-    field public static int custom;
-    field public static int customPanel;
-    field public static int decor_content_parent;
-    field public static int default_activity_button;
-    field public static int dialog;
-    field public static int disableHome;
-    field public static int dropdown;
-    field public static int edit_query;
-    field public static int end;
-    field public static int end_padder;
-    field public static int expand_activities_button;
-    field public static int expanded_menu;
-    field public static int home;
-    field public static int homeAsUp;
-    field public static int icon;
-    field public static int ifRoom;
-    field public static int image;
-    field public static int info;
-    field public static int line1;
-    field public static int line3;
-    field public static int listMode;
-    field public static int list_item;
-    field public static int media_actions;
-    field public static int middle;
-    field public static int multiply;
-    field public static int never;
-    field public static int none;
-    field public static int normal;
-    field public static int parentPanel;
-    field public static int progress_circular;
-    field public static int progress_horizontal;
-    field public static int radio;
-    field public static int screen;
-    field public static int scrollView;
-    field public static int search_badge;
-    field public static int search_bar;
-    field public static int search_button;
-    field public static int search_close_btn;
-    field public static int search_edit_frame;
-    field public static int search_go_btn;
-    field public static int search_mag_icon;
-    field public static int search_plate;
-    field public static int search_src_text;
-    field public static int search_voice_btn;
-    field public static int select_dialog_listview;
-    field public static int shortcut;
-    field public static int showCustom;
-    field public static int showHome;
-    field public static int showTitle;
-    field public static int split_action_bar;
-    field public static int src_atop;
-    field public static int src_in;
-    field public static int src_over;
-    field public static int status_bar_latest_event_content;
-    field public static int submit_area;
-    field public static int tabMode;
-    field public static int text;
-    field public static int text2;
-    field public static int textSpacerNoButtons;
-    field public static int time;
-    field public static int title;
-    field public static int title_template;
-    field public static int topPanel;
-    field public static int up;
-    field public static int useLogo;
-    field public static int withText;
-    field public static int wrap_content;
-  }
-
-  public static final class R.integer {
-    ctor public R.integer();
-    field public static int abc_config_activityDefaultDur;
-    field public static int abc_config_activityShortDur;
-    field public static int abc_max_action_buttons;
-    field public static int cancel_button_image_alpha;
-    field public static int status_bar_notification_info_maxnum;
-  }
-
-  public static final class R.layout {
-    ctor public R.layout();
-    field public static int abc_action_bar_title_item;
-    field public static int abc_action_bar_up_container;
-    field public static int abc_action_bar_view_list_nav_layout;
-    field public static int abc_action_menu_item_layout;
-    field public static int abc_action_menu_layout;
-    field public static int abc_action_mode_bar;
-    field public static int abc_action_mode_close_item_material;
-    field public static int abc_activity_chooser_view;
-    field public static int abc_activity_chooser_view_list_item;
-    field public static int abc_alert_dialog_material;
-    field public static int abc_dialog_title_material;
-    field public static int abc_expanded_menu_layout;
-    field public static int abc_list_menu_item_checkbox;
-    field public static int abc_list_menu_item_icon;
-    field public static int abc_list_menu_item_layout;
-    field public static int abc_list_menu_item_radio;
-    field public static int abc_popup_menu_item_layout;
-    field public static int abc_screen_content_include;
-    field public static int abc_screen_simple;
-    field public static int abc_screen_simple_overlay_action_mode;
-    field public static int abc_screen_toolbar;
-    field public static int abc_search_dropdown_item_icons_2line;
-    field public static int abc_search_view;
-    field public static int abc_select_dialog_material;
-    field public static int abc_simple_dropdown_hint;
-    field public static int notification_media_action;
-    field public static int notification_media_cancel_action;
-    field public static int notification_template_big_media;
-    field public static int notification_template_big_media_narrow;
-    field public static int notification_template_lines;
-    field public static int notification_template_media;
-    field public static int notification_template_part_chronometer;
-    field public static int notification_template_part_time;
-    field public static int select_dialog_item_material;
-    field public static int select_dialog_multichoice_material;
-    field public static int select_dialog_singlechoice_material;
-    field public static int support_simple_spinner_dropdown_item;
-  }
-
-  public static final class R.string {
-    ctor public R.string();
-    field public static int abc_action_bar_home_description;
-    field public static int abc_action_bar_home_description_format;
-    field public static int abc_action_bar_home_subtitle_description_format;
-    field public static int abc_action_bar_up_description;
-    field public static int abc_action_menu_overflow_description;
-    field public static int abc_action_mode_done;
-    field public static int abc_activity_chooser_view_see_all;
-    field public static int abc_activitychooserview_choose_application;
-    field public static int abc_search_hint;
-    field public static int abc_searchview_description_clear;
-    field public static int abc_searchview_description_query;
-    field public static int abc_searchview_description_search;
-    field public static int abc_searchview_description_submit;
-    field public static int abc_searchview_description_voice;
-    field public static int abc_shareactionprovider_share_with;
-    field public static int abc_shareactionprovider_share_with_application;
-    field public static int abc_toolbar_collapse_description;
-    field public static int status_bar_notification_info_overflow;
-  }
-
-  public static final class R.style {
-    ctor public R.style();
-    field public static int AlertDialog_AppCompat;
-    field public static int AlertDialog_AppCompat_Light;
-    field public static int Animation_AppCompat_Dialog;
-    field public static int Animation_AppCompat_DropDownUp;
-    field public static int Base_AlertDialog_AppCompat;
-    field public static int Base_AlertDialog_AppCompat_Light;
-    field public static int Base_Animation_AppCompat_Dialog;
-    field public static int Base_Animation_AppCompat_DropDownUp;
-    field public static int Base_DialogWindowTitleBackground_AppCompat;
-    field public static int Base_DialogWindowTitle_AppCompat;
-    field public static int Base_TextAppearance_AppCompat;
-    field public static int Base_TextAppearance_AppCompat_Body1;
-    field public static int Base_TextAppearance_AppCompat_Body2;
-    field public static int Base_TextAppearance_AppCompat_Button;
-    field public static int Base_TextAppearance_AppCompat_Caption;
-    field public static int Base_TextAppearance_AppCompat_Display1;
-    field public static int Base_TextAppearance_AppCompat_Display2;
-    field public static int Base_TextAppearance_AppCompat_Display3;
-    field public static int Base_TextAppearance_AppCompat_Display4;
-    field public static int Base_TextAppearance_AppCompat_Headline;
-    field public static int Base_TextAppearance_AppCompat_Inverse;
-    field public static int Base_TextAppearance_AppCompat_Large;
-    field public static int Base_TextAppearance_AppCompat_Large_Inverse;
-    field public static int Base_TextAppearance_AppCompat_Light_Widget_PopupMenu_Large;
-    field public static int Base_TextAppearance_AppCompat_Light_Widget_PopupMenu_Small;
-    field public static int Base_TextAppearance_AppCompat_Medium;
-    field public static int Base_TextAppearance_AppCompat_Medium_Inverse;
-    field public static int Base_TextAppearance_AppCompat_Menu;
-    field public static int Base_TextAppearance_AppCompat_SearchResult;
-    field public static int Base_TextAppearance_AppCompat_SearchResult_Subtitle;
-    field public static int Base_TextAppearance_AppCompat_SearchResult_Title;
-    field public static int Base_TextAppearance_AppCompat_Small;
-    field public static int Base_TextAppearance_AppCompat_Small_Inverse;
-    field public static int Base_TextAppearance_AppCompat_Subhead;
-    field public static int Base_TextAppearance_AppCompat_Subhead_Inverse;
-    field public static int Base_TextAppearance_AppCompat_Title;
-    field public static int Base_TextAppearance_AppCompat_Title_Inverse;
-    field public static int Base_TextAppearance_AppCompat_Widget_ActionBar_Menu;
-    field public static int Base_TextAppearance_AppCompat_Widget_ActionBar_Subtitle;
-    field public static int Base_TextAppearance_AppCompat_Widget_ActionBar_Subtitle_Inverse;
-    field public static int Base_TextAppearance_AppCompat_Widget_ActionBar_Title;
-    field public static int Base_TextAppearance_AppCompat_Widget_ActionBar_Title_Inverse;
-    field public static int Base_TextAppearance_AppCompat_Widget_ActionMode_Subtitle;
-    field public static int Base_TextAppearance_AppCompat_Widget_ActionMode_Title;
-    field public static int Base_TextAppearance_AppCompat_Widget_DropDownItem;
-    field public static int Base_TextAppearance_AppCompat_Widget_PopupMenu_Large;
-    field public static int Base_TextAppearance_AppCompat_Widget_PopupMenu_Small;
-    field public static int Base_TextAppearance_AppCompat_Widget_Switch;
-    field public static int Base_TextAppearance_AppCompat_Widget_TextView_SpinnerItem;
-    field public static int Base_TextAppearance_Widget_AppCompat_ExpandedMenu_Item;
-    field public static int Base_TextAppearance_Widget_AppCompat_Toolbar_Subtitle;
-    field public static int Base_TextAppearance_Widget_AppCompat_Toolbar_Title;
-    field public static int Base_ThemeOverlay_AppCompat;
-    field public static int Base_ThemeOverlay_AppCompat_ActionBar;
-    field public static int Base_ThemeOverlay_AppCompat_Dark;
-    field public static int Base_ThemeOverlay_AppCompat_Dark_ActionBar;
-    field public static int Base_ThemeOverlay_AppCompat_Light;
-    field public static int Base_Theme_AppCompat;
-    field public static int Base_Theme_AppCompat_CompactMenu;
-    field public static int Base_Theme_AppCompat_Dialog;
-    field public static int Base_Theme_AppCompat_DialogWhenLarge;
-    field public static int Base_Theme_AppCompat_Dialog_Alert;
-    field public static int Base_Theme_AppCompat_Dialog_FixedSize;
-    field public static int Base_Theme_AppCompat_Dialog_MinWidth;
-    field public static int Base_Theme_AppCompat_Light;
-    field public static int Base_Theme_AppCompat_Light_DarkActionBar;
-    field public static int Base_Theme_AppCompat_Light_Dialog;
-    field public static int Base_Theme_AppCompat_Light_DialogWhenLarge;
-    field public static int Base_Theme_AppCompat_Light_Dialog_Alert;
-    field public static int Base_Theme_AppCompat_Light_Dialog_FixedSize;
-    field public static int Base_Theme_AppCompat_Light_Dialog_MinWidth;
-    field public static int Base_V11_Theme_AppCompat_Dialog;
-    field public static int Base_V11_Theme_AppCompat_Light_Dialog;
-    field public static int Base_V12_Widget_AppCompat_AutoCompleteTextView;
-    field public static int Base_V12_Widget_AppCompat_EditText;
-    field public static int Base_V21_Theme_AppCompat;
-    field public static int Base_V21_Theme_AppCompat_Dialog;
-    field public static int Base_V21_Theme_AppCompat_Light;
-    field public static int Base_V21_Theme_AppCompat_Light_Dialog;
-    field public static int Base_V7_Theme_AppCompat;
-    field public static int Base_V7_Theme_AppCompat_Dialog;
-    field public static int Base_V7_Theme_AppCompat_Light;
-    field public static int Base_V7_Theme_AppCompat_Light_Dialog;
-    field public static int Base_V7_Widget_AppCompat_AutoCompleteTextView;
-    field public static int Base_V7_Widget_AppCompat_EditText;
-    field public static int Base_Widget_AppCompat_ActionBar;
-    field public static int Base_Widget_AppCompat_ActionBar_Solid;
-    field public static int Base_Widget_AppCompat_ActionBar_TabBar;
-    field public static int Base_Widget_AppCompat_ActionBar_TabText;
-    field public static int Base_Widget_AppCompat_ActionBar_TabView;
-    field public static int Base_Widget_AppCompat_ActionButton;
-    field public static int Base_Widget_AppCompat_ActionButton_CloseMode;
-    field public static int Base_Widget_AppCompat_ActionButton_Overflow;
-    field public static int Base_Widget_AppCompat_ActionMode;
-    field public static int Base_Widget_AppCompat_ActivityChooserView;
-    field public static int Base_Widget_AppCompat_AutoCompleteTextView;
-    field public static int Base_Widget_AppCompat_Button;
-    field public static int Base_Widget_AppCompat_ButtonBar;
-    field public static int Base_Widget_AppCompat_ButtonBar_AlertDialog;
-    field public static int Base_Widget_AppCompat_Button_Borderless;
-    field public static int Base_Widget_AppCompat_Button_Borderless_Colored;
-    field public static int Base_Widget_AppCompat_Button_ButtonBar_AlertDialog;
-    field public static int Base_Widget_AppCompat_Button_Small;
-    field public static int Base_Widget_AppCompat_CompoundButton_CheckBox;
-    field public static int Base_Widget_AppCompat_CompoundButton_RadioButton;
-    field public static int Base_Widget_AppCompat_CompoundButton_Switch;
-    field public static int Base_Widget_AppCompat_DrawerArrowToggle;
-    field public static int Base_Widget_AppCompat_DrawerArrowToggle_Common;
-    field public static int Base_Widget_AppCompat_DropDownItem_Spinner;
-    field public static int Base_Widget_AppCompat_EditText;
-    field public static int Base_Widget_AppCompat_Light_ActionBar;
-    field public static int Base_Widget_AppCompat_Light_ActionBar_Solid;
-    field public static int Base_Widget_AppCompat_Light_ActionBar_TabBar;
-    field public static int Base_Widget_AppCompat_Light_ActionBar_TabText;
-    field public static int Base_Widget_AppCompat_Light_ActionBar_TabText_Inverse;
-    field public static int Base_Widget_AppCompat_Light_ActionBar_TabView;
-    field public static int Base_Widget_AppCompat_Light_PopupMenu;
-    field public static int Base_Widget_AppCompat_Light_PopupMenu_Overflow;
-    field public static int Base_Widget_AppCompat_ListPopupWindow;
-    field public static int Base_Widget_AppCompat_ListView;
-    field public static int Base_Widget_AppCompat_ListView_DropDown;
-    field public static int Base_Widget_AppCompat_ListView_Menu;
-    field public static int Base_Widget_AppCompat_PopupMenu;
-    field public static int Base_Widget_AppCompat_PopupMenu_Overflow;
-    field public static int Base_Widget_AppCompat_PopupWindow;
-    field public static int Base_Widget_AppCompat_ProgressBar;
-    field public static int Base_Widget_AppCompat_ProgressBar_Horizontal;
-    field public static int Base_Widget_AppCompat_RatingBar;
-    field public static int Base_Widget_AppCompat_SearchView;
-    field public static int Base_Widget_AppCompat_SearchView_ActionBar;
-    field public static int Base_Widget_AppCompat_Spinner;
-    field public static int Base_Widget_AppCompat_Spinner_DropDown_ActionBar;
-    field public static int Base_Widget_AppCompat_Spinner_Underlined;
-    field public static int Base_Widget_AppCompat_TextView_SpinnerItem;
-    field public static int Base_Widget_AppCompat_Toolbar;
-    field public static int Base_Widget_AppCompat_Toolbar_Button_Navigation;
-    field public static int Platform_AppCompat;
-    field public static int Platform_AppCompat_Light;
-    field public static int Platform_ThemeOverlay_AppCompat_Dark;
-    field public static int Platform_ThemeOverlay_AppCompat_Light;
-    field public static int Platform_V11_AppCompat;
-    field public static int Platform_V11_AppCompat_Light;
-    field public static int Platform_V14_AppCompat;
-    field public static int Platform_V14_AppCompat_Light;
-    field public static int RtlOverlay_DialogWindowTitle_AppCompat;
-    field public static int RtlOverlay_Widget_AppCompat_ActionBar_TitleItem;
-    field public static int RtlOverlay_Widget_AppCompat_ActionButton_Overflow;
-    field public static int RtlOverlay_Widget_AppCompat_DialogTitle_Icon;
-    field public static int RtlOverlay_Widget_AppCompat_PopupMenuItem;
-    field public static int RtlOverlay_Widget_AppCompat_PopupMenuItem_InternalGroup;
-    field public static int RtlOverlay_Widget_AppCompat_PopupMenuItem_Text;
-    field public static int RtlOverlay_Widget_AppCompat_SearchView_MagIcon;
-    field public static int RtlOverlay_Widget_AppCompat_Search_DropDown;
-    field public static int RtlOverlay_Widget_AppCompat_Search_DropDown_Icon1;
-    field public static int RtlOverlay_Widget_AppCompat_Search_DropDown_Icon2;
-    field public static int RtlOverlay_Widget_AppCompat_Search_DropDown_Query;
-    field public static int RtlOverlay_Widget_AppCompat_Search_DropDown_Text;
-    field public static int RtlOverlay_Widget_AppCompat_Toolbar_Button_Navigation;
-    field public static int TextAppearance_AppCompat;
-    field public static int TextAppearance_AppCompat_Body1;
-    field public static int TextAppearance_AppCompat_Body2;
-    field public static int TextAppearance_AppCompat_Button;
-    field public static int TextAppearance_AppCompat_Caption;
-    field public static int TextAppearance_AppCompat_Display1;
-    field public static int TextAppearance_AppCompat_Display2;
-    field public static int TextAppearance_AppCompat_Display3;
-    field public static int TextAppearance_AppCompat_Display4;
-    field public static int TextAppearance_AppCompat_Headline;
-    field public static int TextAppearance_AppCompat_Inverse;
-    field public static int TextAppearance_AppCompat_Large;
-    field public static int TextAppearance_AppCompat_Large_Inverse;
-    field public static int TextAppearance_AppCompat_Light_SearchResult_Subtitle;
-    field public static int TextAppearance_AppCompat_Light_SearchResult_Title;
-    field public static int TextAppearance_AppCompat_Light_Widget_PopupMenu_Large;
-    field public static int TextAppearance_AppCompat_Light_Widget_PopupMenu_Small;
-    field public static int TextAppearance_AppCompat_Medium;
-    field public static int TextAppearance_AppCompat_Medium_Inverse;
-    field public static int TextAppearance_AppCompat_Menu;
-    field public static int TextAppearance_AppCompat_SearchResult_Subtitle;
-    field public static int TextAppearance_AppCompat_SearchResult_Title;
-    field public static int TextAppearance_AppCompat_Small;
-    field public static int TextAppearance_AppCompat_Small_Inverse;
-    field public static int TextAppearance_AppCompat_Subhead;
-    field public static int TextAppearance_AppCompat_Subhead_Inverse;
-    field public static int TextAppearance_AppCompat_Title;
-    field public static int TextAppearance_AppCompat_Title_Inverse;
-    field public static int TextAppearance_AppCompat_Widget_ActionBar_Menu;
-    field public static int TextAppearance_AppCompat_Widget_ActionBar_Subtitle;
-    field public static int TextAppearance_AppCompat_Widget_ActionBar_Subtitle_Inverse;
-    field public static int TextAppearance_AppCompat_Widget_ActionBar_Title;
-    field public static int TextAppearance_AppCompat_Widget_ActionBar_Title_Inverse;
-    field public static int TextAppearance_AppCompat_Widget_ActionMode_Subtitle;
-    field public static int TextAppearance_AppCompat_Widget_ActionMode_Subtitle_Inverse;
-    field public static int TextAppearance_AppCompat_Widget_ActionMode_Title;
-    field public static int TextAppearance_AppCompat_Widget_ActionMode_Title_Inverse;
-    field public static int TextAppearance_AppCompat_Widget_DropDownItem;
-    field public static int TextAppearance_AppCompat_Widget_PopupMenu_Large;
-    field public static int TextAppearance_AppCompat_Widget_PopupMenu_Small;
-    field public static int TextAppearance_AppCompat_Widget_Switch;
-    field public static int TextAppearance_AppCompat_Widget_TextView_SpinnerItem;
-    field public static int TextAppearance_StatusBar_EventContent;
-    field public static int TextAppearance_StatusBar_EventContent_Info;
-    field public static int TextAppearance_StatusBar_EventContent_Line2;
-    field public static int TextAppearance_StatusBar_EventContent_Time;
-    field public static int TextAppearance_StatusBar_EventContent_Title;
-    field public static int TextAppearance_Widget_AppCompat_ExpandedMenu_Item;
-    field public static int TextAppearance_Widget_AppCompat_Toolbar_Subtitle;
-    field public static int TextAppearance_Widget_AppCompat_Toolbar_Title;
-    field public static int ThemeOverlay_AppCompat;
-    field public static int ThemeOverlay_AppCompat_ActionBar;
-    field public static int ThemeOverlay_AppCompat_Dark;
-    field public static int ThemeOverlay_AppCompat_Dark_ActionBar;
-    field public static int ThemeOverlay_AppCompat_Light;
-    field public static int Theme_AppCompat;
-    field public static int Theme_AppCompat_CompactMenu;
-    field public static int Theme_AppCompat_Dialog;
-    field public static int Theme_AppCompat_DialogWhenLarge;
-    field public static int Theme_AppCompat_Dialog_Alert;
-    field public static int Theme_AppCompat_Dialog_MinWidth;
-    field public static int Theme_AppCompat_Light;
-    field public static int Theme_AppCompat_Light_DarkActionBar;
-    field public static int Theme_AppCompat_Light_Dialog;
-    field public static int Theme_AppCompat_Light_DialogWhenLarge;
-    field public static int Theme_AppCompat_Light_Dialog_Alert;
-    field public static int Theme_AppCompat_Light_Dialog_MinWidth;
-    field public static int Theme_AppCompat_Light_NoActionBar;
-    field public static int Theme_AppCompat_NoActionBar;
-    field public static int Widget_AppCompat_ActionBar;
-    field public static int Widget_AppCompat_ActionBar_Solid;
-    field public static int Widget_AppCompat_ActionBar_TabBar;
-    field public static int Widget_AppCompat_ActionBar_TabText;
-    field public static int Widget_AppCompat_ActionBar_TabView;
-    field public static int Widget_AppCompat_ActionButton;
-    field public static int Widget_AppCompat_ActionButton_CloseMode;
-    field public static int Widget_AppCompat_ActionButton_Overflow;
-    field public static int Widget_AppCompat_ActionMode;
-    field public static int Widget_AppCompat_ActivityChooserView;
-    field public static int Widget_AppCompat_AutoCompleteTextView;
-    field public static int Widget_AppCompat_Button;
-    field public static int Widget_AppCompat_ButtonBar;
-    field public static int Widget_AppCompat_ButtonBar_AlertDialog;
-    field public static int Widget_AppCompat_Button_Borderless;
-    field public static int Widget_AppCompat_Button_Borderless_Colored;
-    field public static int Widget_AppCompat_Button_ButtonBar_AlertDialog;
-    field public static int Widget_AppCompat_Button_Small;
-    field public static int Widget_AppCompat_CompoundButton_CheckBox;
-    field public static int Widget_AppCompat_CompoundButton_RadioButton;
-    field public static int Widget_AppCompat_CompoundButton_Switch;
-    field public static int Widget_AppCompat_DrawerArrowToggle;
-    field public static int Widget_AppCompat_DropDownItem_Spinner;
-    field public static int Widget_AppCompat_EditText;
-    field public static int Widget_AppCompat_Light_ActionBar;
-    field public static int Widget_AppCompat_Light_ActionBar_Solid;
-    field public static int Widget_AppCompat_Light_ActionBar_Solid_Inverse;
-    field public static int Widget_AppCompat_Light_ActionBar_TabBar;
-    field public static int Widget_AppCompat_Light_ActionBar_TabBar_Inverse;
-    field public static int Widget_AppCompat_Light_ActionBar_TabText;
-    field public static int Widget_AppCompat_Light_ActionBar_TabText_Inverse;
-    field public static int Widget_AppCompat_Light_ActionBar_TabView;
-    field public static int Widget_AppCompat_Light_ActionBar_TabView_Inverse;
-    field public static int Widget_AppCompat_Light_ActionButton;
-    field public static int Widget_AppCompat_Light_ActionButton_CloseMode;
-    field public static int Widget_AppCompat_Light_ActionButton_Overflow;
-    field public static int Widget_AppCompat_Light_ActionMode_Inverse;
-    field public static int Widget_AppCompat_Light_ActivityChooserView;
-    field public static int Widget_AppCompat_Light_AutoCompleteTextView;
-    field public static int Widget_AppCompat_Light_DropDownItem_Spinner;
-    field public static int Widget_AppCompat_Light_ListPopupWindow;
-    field public static int Widget_AppCompat_Light_ListView_DropDown;
-    field public static int Widget_AppCompat_Light_PopupMenu;
-    field public static int Widget_AppCompat_Light_PopupMenu_Overflow;
-    field public static int Widget_AppCompat_Light_SearchView;
-    field public static int Widget_AppCompat_Light_Spinner_DropDown_ActionBar;
-    field public static int Widget_AppCompat_ListPopupWindow;
-    field public static int Widget_AppCompat_ListView;
-    field public static int Widget_AppCompat_ListView_DropDown;
-    field public static int Widget_AppCompat_ListView_Menu;
-    field public static int Widget_AppCompat_PopupMenu;
-    field public static int Widget_AppCompat_PopupMenu_Overflow;
-    field public static int Widget_AppCompat_PopupWindow;
-    field public static int Widget_AppCompat_ProgressBar;
-    field public static int Widget_AppCompat_ProgressBar_Horizontal;
-    field public static int Widget_AppCompat_RatingBar;
-    field public static int Widget_AppCompat_SearchView;
-    field public static int Widget_AppCompat_SearchView_ActionBar;
-    field public static int Widget_AppCompat_Spinner;
-    field public static int Widget_AppCompat_Spinner_DropDown;
-    field public static int Widget_AppCompat_Spinner_DropDown_ActionBar;
-    field public static int Widget_AppCompat_Spinner_Underlined;
-    field public static int Widget_AppCompat_TextView_SpinnerItem;
-    field public static int Widget_AppCompat_Toolbar;
-    field public static int Widget_AppCompat_Toolbar_Button_Navigation;
-  }
-
-  public static final class R.styleable {
-    ctor public R.styleable();
-    field public static final int[] ActionBar;
-    field public static final int[] ActionBarLayout;
-    field public static int ActionBarLayout_android_layout_gravity;
-    field public static int ActionBar_background;
-    field public static int ActionBar_backgroundSplit;
-    field public static int ActionBar_backgroundStacked;
-    field public static int ActionBar_contentInsetEnd;
-    field public static int ActionBar_contentInsetLeft;
-    field public static int ActionBar_contentInsetRight;
-    field public static int ActionBar_contentInsetStart;
-    field public static int ActionBar_customNavigationLayout;
-    field public static int ActionBar_displayOptions;
-    field public static int ActionBar_divider;
-    field public static int ActionBar_elevation;
-    field public static int ActionBar_height;
-    field public static int ActionBar_hideOnContentScroll;
-    field public static int ActionBar_homeAsUpIndicator;
-    field public static int ActionBar_homeLayout;
-    field public static int ActionBar_icon;
-    field public static int ActionBar_indeterminateProgressStyle;
-    field public static int ActionBar_itemPadding;
-    field public static int ActionBar_logo;
-    field public static int ActionBar_navigationMode;
-    field public static int ActionBar_popupTheme;
-    field public static int ActionBar_progressBarPadding;
-    field public static int ActionBar_progressBarStyle;
-    field public static int ActionBar_subtitle;
-    field public static int ActionBar_subtitleTextStyle;
-    field public static int ActionBar_title;
-    field public static int ActionBar_titleTextStyle;
-    field public static final int[] ActionMenuItemView;
-    field public static int ActionMenuItemView_android_minWidth;
-    field public static final int[] ActionMenuView;
-    field public static final int[] ActionMode;
-    field public static int ActionMode_background;
-    field public static int ActionMode_backgroundSplit;
-    field public static int ActionMode_closeItemLayout;
-    field public static int ActionMode_height;
-    field public static int ActionMode_subtitleTextStyle;
-    field public static int ActionMode_titleTextStyle;
-    field public static final int[] ActivityChooserView;
-    field public static int ActivityChooserView_expandActivityOverflowButtonDrawable;
-    field public static int ActivityChooserView_initialActivityCount;
-    field public static final int[] AlertDialog;
-    field public static int AlertDialog_android_layout;
-    field public static int AlertDialog_buttonPanelSideLayout;
-    field public static int AlertDialog_listItemLayout;
-    field public static int AlertDialog_listLayout;
-    field public static int AlertDialog_multiChoiceItemLayout;
-    field public static int AlertDialog_singleChoiceItemLayout;
-    field public static final int[] AppCompatTextView;
-    field public static int AppCompatTextView_android_textAppearance;
-    field public static int AppCompatTextView_textAllCaps;
-    field public static final int[] DrawerArrowToggle;
-    field public static int DrawerArrowToggle_barSize;
-    field public static int DrawerArrowToggle_color;
-    field public static int DrawerArrowToggle_drawableSize;
-    field public static int DrawerArrowToggle_gapBetweenBars;
-    field public static int DrawerArrowToggle_middleBarArrowSize;
-    field public static int DrawerArrowToggle_spinBars;
-    field public static int DrawerArrowToggle_thickness;
-    field public static int DrawerArrowToggle_topBottomBarArrowSize;
-    field public static final int[] LinearLayoutCompat;
-    field public static final int[] LinearLayoutCompat_Layout;
-    field public static int LinearLayoutCompat_Layout_android_layout_gravity;
-    field public static int LinearLayoutCompat_Layout_android_layout_height;
-    field public static int LinearLayoutCompat_Layout_android_layout_weight;
-    field public static int LinearLayoutCompat_Layout_android_layout_width;
-    field public static int LinearLayoutCompat_android_baselineAligned;
-    field public static int LinearLayoutCompat_android_baselineAlignedChildIndex;
-    field public static int LinearLayoutCompat_android_gravity;
-    field public static int LinearLayoutCompat_android_orientation;
-    field public static int LinearLayoutCompat_android_weightSum;
-    field public static int LinearLayoutCompat_divider;
-    field public static int LinearLayoutCompat_dividerPadding;
-    field public static int LinearLayoutCompat_measureWithLargestChild;
-    field public static int LinearLayoutCompat_showDividers;
-    field public static final int[] ListPopupWindow;
-    field public static int ListPopupWindow_android_dropDownHorizontalOffset;
-    field public static int ListPopupWindow_android_dropDownVerticalOffset;
-    field public static final int[] MenuGroup;
-    field public static int MenuGroup_android_checkableBehavior;
-    field public static int MenuGroup_android_enabled;
-    field public static int MenuGroup_android_id;
-    field public static int MenuGroup_android_menuCategory;
-    field public static int MenuGroup_android_orderInCategory;
-    field public static int MenuGroup_android_visible;
-    field public static final int[] MenuItem;
-    field public static int MenuItem_actionLayout;
-    field public static int MenuItem_actionProviderClass;
-    field public static int MenuItem_actionViewClass;
-    field public static int MenuItem_android_alphabeticShortcut;
-    field public static int MenuItem_android_checkable;
-    field public static int MenuItem_android_checked;
-    field public static int MenuItem_android_enabled;
-    field public static int MenuItem_android_icon;
-    field public static int MenuItem_android_id;
-    field public static int MenuItem_android_menuCategory;
-    field public static int MenuItem_android_numericShortcut;
-    field public static int MenuItem_android_onClick;
-    field public static int MenuItem_android_orderInCategory;
-    field public static int MenuItem_android_title;
-    field public static int MenuItem_android_titleCondensed;
-    field public static int MenuItem_android_visible;
-    field public static int MenuItem_showAsAction;
-    field public static final int[] MenuView;
-    field public static int MenuView_android_headerBackground;
-    field public static int MenuView_android_horizontalDivider;
-    field public static int MenuView_android_itemBackground;
-    field public static int MenuView_android_itemIconDisabledAlpha;
-    field public static int MenuView_android_itemTextAppearance;
-    field public static int MenuView_android_verticalDivider;
-    field public static int MenuView_android_windowAnimationStyle;
-    field public static int MenuView_preserveIconSpacing;
-    field public static final int[] PopupWindow;
-    field public static final int[] PopupWindowBackgroundState;
-    field public static int PopupWindowBackgroundState_state_above_anchor;
-    field public static int PopupWindow_android_popupBackground;
-    field public static int PopupWindow_overlapAnchor;
-    field public static final int[] SearchView;
-    field public static int SearchView_android_focusable;
-    field public static int SearchView_android_imeOptions;
-    field public static int SearchView_android_inputType;
-    field public static int SearchView_android_maxWidth;
-    field public static int SearchView_closeIcon;
-    field public static int SearchView_commitIcon;
-    field public static int SearchView_defaultQueryHint;
-    field public static int SearchView_goIcon;
-    field public static int SearchView_iconifiedByDefault;
-    field public static int SearchView_layout;
-    field public static int SearchView_queryBackground;
-    field public static int SearchView_queryHint;
-    field public static int SearchView_searchHintIcon;
-    field public static int SearchView_searchIcon;
-    field public static int SearchView_submitBackground;
-    field public static int SearchView_suggestionRowLayout;
-    field public static int SearchView_voiceIcon;
-    field public static final int[] Spinner;
-    field public static int Spinner_android_background;
-    field public static int Spinner_android_dropDownHorizontalOffset;
-    field public static int Spinner_android_dropDownSelector;
-    field public static int Spinner_android_dropDownVerticalOffset;
-    field public static int Spinner_android_dropDownWidth;
-    field public static int Spinner_android_gravity;
-    field public static int Spinner_android_popupBackground;
-    field public static int Spinner_disableChildrenWhenDisabled;
-    field public static int Spinner_popupPromptView;
-    field public static int Spinner_prompt;
-    field public static int Spinner_spinnerMode;
-    field public static final int[] SwitchCompat;
-    field public static int SwitchCompat_android_textOff;
-    field public static int SwitchCompat_android_textOn;
-    field public static int SwitchCompat_android_thumb;
-    field public static int SwitchCompat_showText;
-    field public static int SwitchCompat_splitTrack;
-    field public static int SwitchCompat_switchMinWidth;
-    field public static int SwitchCompat_switchPadding;
-    field public static int SwitchCompat_switchTextAppearance;
-    field public static int SwitchCompat_thumbTextPadding;
-    field public static int SwitchCompat_track;
-    field public static final int[] TextAppearance;
-    field public static int TextAppearance_android_textColor;
-    field public static int TextAppearance_android_textSize;
-    field public static int TextAppearance_android_textStyle;
-    field public static int TextAppearance_android_typeface;
-    field public static int TextAppearance_textAllCaps;
-    field public static final int[] Theme;
-    field public static int Theme_actionBarDivider;
-    field public static int Theme_actionBarItemBackground;
-    field public static int Theme_actionBarPopupTheme;
-    field public static int Theme_actionBarSize;
-    field public static int Theme_actionBarSplitStyle;
-    field public static int Theme_actionBarStyle;
-    field public static int Theme_actionBarTabBarStyle;
-    field public static int Theme_actionBarTabStyle;
-    field public static int Theme_actionBarTabTextStyle;
-    field public static int Theme_actionBarTheme;
-    field public static int Theme_actionBarWidgetTheme;
-    field public static int Theme_actionButtonStyle;
-    field public static int Theme_actionDropDownStyle;
-    field public static int Theme_actionMenuTextAppearance;
-    field public static int Theme_actionMenuTextColor;
-    field public static int Theme_actionModeBackground;
-    field public static int Theme_actionModeCloseButtonStyle;
-    field public static int Theme_actionModeCloseDrawable;
-    field public static int Theme_actionModeCopyDrawable;
-    field public static int Theme_actionModeCutDrawable;
-    field public static int Theme_actionModeFindDrawable;
-    field public static int Theme_actionModePasteDrawable;
-    field public static int Theme_actionModePopupWindowStyle;
-    field public static int Theme_actionModeSelectAllDrawable;
-    field public static int Theme_actionModeShareDrawable;
-    field public static int Theme_actionModeSplitBackground;
-    field public static int Theme_actionModeStyle;
-    field public static int Theme_actionModeWebSearchDrawable;
-    field public static int Theme_actionOverflowButtonStyle;
-    field public static int Theme_actionOverflowMenuStyle;
-    field public static int Theme_activityChooserViewStyle;
-    field public static int Theme_alertDialogButtonGroupStyle;
-    field public static int Theme_alertDialogCenterButtons;
-    field public static int Theme_alertDialogStyle;
-    field public static int Theme_alertDialogTheme;
-    field public static int Theme_android_windowAnimationStyle;
-    field public static int Theme_android_windowIsFloating;
-    field public static int Theme_autoCompleteTextViewStyle;
-    field public static int Theme_borderlessButtonStyle;
-    field public static int Theme_buttonBarButtonStyle;
-    field public static int Theme_buttonBarNegativeButtonStyle;
-    field public static int Theme_buttonBarNeutralButtonStyle;
-    field public static int Theme_buttonBarPositiveButtonStyle;
-    field public static int Theme_buttonBarStyle;
-    field public static int Theme_buttonStyle;
-    field public static int Theme_buttonStyleSmall;
-    field public static int Theme_checkboxStyle;
-    field public static int Theme_checkedTextViewStyle;
-    field public static int Theme_colorAccent;
-    field public static int Theme_colorButtonNormal;
-    field public static int Theme_colorControlActivated;
-    field public static int Theme_colorControlHighlight;
-    field public static int Theme_colorControlNormal;
-    field public static int Theme_colorPrimary;
-    field public static int Theme_colorPrimaryDark;
-    field public static int Theme_colorSwitchThumbNormal;
-    field public static int Theme_dialogPreferredPadding;
-    field public static int Theme_dialogTheme;
-    field public static int Theme_dividerHorizontal;
-    field public static int Theme_dividerVertical;
-    field public static int Theme_dropDownListViewStyle;
-    field public static int Theme_dropdownListPreferredItemHeight;
-    field public static int Theme_editTextBackground;
-    field public static int Theme_editTextColor;
-    field public static int Theme_editTextStyle;
-    field public static int Theme_homeAsUpIndicator;
-    field public static int Theme_listChoiceBackgroundIndicator;
-    field public static int Theme_listDividerAlertDialog;
-    field public static int Theme_listPopupWindowStyle;
-    field public static int Theme_listPreferredItemHeight;
-    field public static int Theme_listPreferredItemHeightLarge;
-    field public static int Theme_listPreferredItemHeightSmall;
-    field public static int Theme_listPreferredItemPaddingLeft;
-    field public static int Theme_listPreferredItemPaddingRight;
-    field public static int Theme_panelBackground;
-    field public static int Theme_panelMenuListTheme;
-    field public static int Theme_panelMenuListWidth;
-    field public static int Theme_popupMenuStyle;
-    field public static int Theme_popupWindowStyle;
-    field public static int Theme_radioButtonStyle;
-    field public static int Theme_ratingBarStyle;
-    field public static int Theme_searchViewStyle;
-    field public static int Theme_selectableItemBackground;
-    field public static int Theme_selectableItemBackgroundBorderless;
-    field public static int Theme_spinnerDropDownItemStyle;
-    field public static int Theme_spinnerStyle;
-    field public static int Theme_switchStyle;
-    field public static int Theme_textAppearanceLargePopupMenu;
-    field public static int Theme_textAppearanceListItem;
-    field public static int Theme_textAppearanceListItemSmall;
-    field public static int Theme_textAppearanceSearchResultSubtitle;
-    field public static int Theme_textAppearanceSearchResultTitle;
-    field public static int Theme_textAppearanceSmallPopupMenu;
-    field public static int Theme_textColorAlertDialogListItem;
-    field public static int Theme_textColorSearchUrl;
-    field public static int Theme_toolbarNavigationButtonStyle;
-    field public static int Theme_toolbarStyle;
-    field public static int Theme_windowActionBar;
-    field public static int Theme_windowActionBarOverlay;
-    field public static int Theme_windowActionModeOverlay;
-    field public static int Theme_windowFixedHeightMajor;
-    field public static int Theme_windowFixedHeightMinor;
-    field public static int Theme_windowFixedWidthMajor;
-    field public static int Theme_windowFixedWidthMinor;
-    field public static int Theme_windowMinWidthMajor;
-    field public static int Theme_windowMinWidthMinor;
-    field public static int Theme_windowNoTitle;
-    field public static final int[] Toolbar;
-    field public static int Toolbar_android_gravity;
-    field public static int Toolbar_android_minHeight;
-    field public static int Toolbar_collapseContentDescription;
-    field public static int Toolbar_collapseIcon;
-    field public static int Toolbar_contentInsetEnd;
-    field public static int Toolbar_contentInsetLeft;
-    field public static int Toolbar_contentInsetRight;
-    field public static int Toolbar_contentInsetStart;
-    field public static int Toolbar_maxButtonHeight;
-    field public static int Toolbar_navigationContentDescription;
-    field public static int Toolbar_navigationIcon;
-    field public static int Toolbar_popupTheme;
-    field public static int Toolbar_subtitle;
-    field public static int Toolbar_subtitleTextAppearance;
-    field public static int Toolbar_title;
-    field public static int Toolbar_titleMarginBottom;
-    field public static int Toolbar_titleMarginEnd;
-    field public static int Toolbar_titleMarginStart;
-    field public static int Toolbar_titleMarginTop;
-    field public static int Toolbar_titleMargins;
-    field public static int Toolbar_titleTextAppearance;
-    field public static final int[] View;
-    field public static final int[] ViewStubCompat;
-    field public static int ViewStubCompat_android_id;
-    field public static int ViewStubCompat_android_inflatedId;
-    field public static int ViewStubCompat_android_layout;
-    field public static int View_android_focusable;
-    field public static int View_android_theme;
-    field public static int View_backgroundTint;
-    field public static int View_backgroundTintMode;
-    field public static int View_paddingEnd;
-    field public static int View_paddingStart;
-    field public static int View_theme;
-  }
-
-}
-
-package android.support.v7.view {
-
-  public abstract class ActionMode {
-    ctor public ActionMode();
-    method public abstract void finish();
-    method public abstract android.view.View getCustomView();
-    method public abstract android.view.Menu getMenu();
-    method public abstract android.view.MenuInflater getMenuInflater();
-    method public abstract java.lang.CharSequence getSubtitle();
-    method public java.lang.Object getTag();
-    method public abstract java.lang.CharSequence getTitle();
-    method public boolean getTitleOptionalHint();
-    method public abstract void invalidate();
-    method public boolean isTitleOptional();
-    method public abstract void setCustomView(android.view.View);
-    method public abstract void setSubtitle(java.lang.CharSequence);
-    method public abstract void setSubtitle(int);
-    method public void setTag(java.lang.Object);
-    method public abstract void setTitle(java.lang.CharSequence);
-    method public abstract void setTitle(int);
-    method public void setTitleOptionalHint(boolean);
-  }
-
-  public static abstract interface ActionMode.Callback {
-    method public abstract boolean onActionItemClicked(android.support.v7.view.ActionMode, android.view.MenuItem);
-    method public abstract boolean onCreateActionMode(android.support.v7.view.ActionMode, android.view.Menu);
-    method public abstract void onDestroyActionMode(android.support.v7.view.ActionMode);
-    method public abstract boolean onPrepareActionMode(android.support.v7.view.ActionMode, android.view.Menu);
-  }
-
-  public abstract interface CollapsibleActionView {
-    method public abstract void onActionViewCollapsed();
-    method public abstract void onActionViewExpanded();
-  }
-
-}
-
-package android.support.v7.widget {
-
-  public class ActionMenuView extends android.support.v7.widget.LinearLayoutCompat {
-    ctor public ActionMenuView(android.content.Context);
-    ctor public ActionMenuView(android.content.Context, android.util.AttributeSet);
-    method public void dismissPopupMenus();
-    method public android.view.Menu getMenu();
-    method public int getPopupTheme();
-    method public boolean hideOverflowMenu();
-    method public boolean isOverflowMenuShowing();
-    method public void onConfigurationChanged(android.content.res.Configuration);
-    method public void onDetachedFromWindow();
-    method public void setOnMenuItemClickListener(android.support.v7.widget.ActionMenuView.OnMenuItemClickListener);
-    method public void setPopupTheme(int);
-    method public boolean showOverflowMenu();
-  }
-
-  public static class ActionMenuView.LayoutParams extends android.support.v7.widget.LinearLayoutCompat.LayoutParams {
-    ctor public ActionMenuView.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public ActionMenuView.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public ActionMenuView.LayoutParams(android.support.v7.widget.ActionMenuView.LayoutParams);
-    ctor public ActionMenuView.LayoutParams(int, int);
-    field public int cellsUsed;
-    field public boolean expandable;
-    field public int extraPixels;
-    field public boolean isOverflowButton;
-    field public boolean preventEdgeOffset;
-  }
-
-  public static abstract interface ActionMenuView.OnMenuItemClickListener {
-    method public abstract boolean onMenuItemClick(android.view.MenuItem);
-  }
-
-  public class AppCompatAutoCompleteTextView extends android.widget.AutoCompleteTextView {
-    ctor public AppCompatAutoCompleteTextView(android.content.Context);
-    ctor public AppCompatAutoCompleteTextView(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatAutoCompleteTextView(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class AppCompatButton extends android.widget.Button {
-    ctor public AppCompatButton(android.content.Context);
-    ctor public AppCompatButton(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatButton(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class AppCompatCheckBox extends android.widget.CheckBox {
-    ctor public AppCompatCheckBox(android.content.Context);
-    ctor public AppCompatCheckBox(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatCheckBox(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class AppCompatCheckedTextView extends android.widget.CheckedTextView {
-    ctor public AppCompatCheckedTextView(android.content.Context);
-    ctor public AppCompatCheckedTextView(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatCheckedTextView(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class AppCompatEditText extends android.widget.EditText {
-    ctor public AppCompatEditText(android.content.Context);
-    ctor public AppCompatEditText(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatEditText(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class AppCompatMultiAutoCompleteTextView extends android.widget.MultiAutoCompleteTextView {
-    ctor public AppCompatMultiAutoCompleteTextView(android.content.Context);
-    ctor public AppCompatMultiAutoCompleteTextView(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatMultiAutoCompleteTextView(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class AppCompatRadioButton extends android.widget.RadioButton {
-    ctor public AppCompatRadioButton(android.content.Context);
-    ctor public AppCompatRadioButton(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatRadioButton(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class AppCompatRatingBar extends android.widget.RatingBar {
-    ctor public AppCompatRatingBar(android.content.Context);
-    ctor public AppCompatRatingBar(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatRatingBar(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class AppCompatSpinner extends android.widget.Spinner {
-    ctor public AppCompatSpinner(android.content.Context);
-    ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class AppCompatTextView extends android.widget.TextView {
-    ctor public AppCompatTextView(android.content.Context);
-    ctor public AppCompatTextView(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatTextView(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class LinearLayoutCompat extends android.view.ViewGroup {
-    ctor public LinearLayoutCompat(android.content.Context);
-    ctor public LinearLayoutCompat(android.content.Context, android.util.AttributeSet);
-    ctor public LinearLayoutCompat(android.content.Context, android.util.AttributeSet, int);
-    method public int getBaselineAlignedChildIndex();
-    method public android.graphics.drawable.Drawable getDividerDrawable();
-    method public int getDividerPadding();
-    method public int getOrientation();
-    method public int getShowDividers();
-    method public float getWeightSum();
-    method public boolean isBaselineAligned();
-    method public boolean isMeasureWithLargestChildEnabled();
-    method protected void onLayout(boolean, int, int, int, int);
-    method public void setBaselineAligned(boolean);
-    method public void setBaselineAlignedChildIndex(int);
-    method public void setDividerDrawable(android.graphics.drawable.Drawable);
-    method public void setDividerPadding(int);
-    method public void setGravity(int);
-    method public void setHorizontalGravity(int);
-    method public void setMeasureWithLargestChildEnabled(boolean);
-    method public void setOrientation(int);
-    method public void setShowDividers(int);
-    method public void setVerticalGravity(int);
-    method public void setWeightSum(float);
-    field public static final int HORIZONTAL = 0; // 0x0
-    field public static final int SHOW_DIVIDER_BEGINNING = 1; // 0x1
-    field public static final int SHOW_DIVIDER_END = 4; // 0x4
-    field public static final int SHOW_DIVIDER_MIDDLE = 2; // 0x2
-    field public static final int SHOW_DIVIDER_NONE = 0; // 0x0
-    field public static final int VERTICAL = 1; // 0x1
-  }
-
-  public static class LinearLayoutCompat.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
-    ctor public LinearLayoutCompat.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public LinearLayoutCompat.LayoutParams(int, int);
-    ctor public LinearLayoutCompat.LayoutParams(int, int, float);
-    ctor public LinearLayoutCompat.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public LinearLayoutCompat.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public LinearLayoutCompat.LayoutParams(android.support.v7.widget.LinearLayoutCompat.LayoutParams);
-    field public int gravity;
-    field public float weight;
-  }
-
-  public class ListPopupWindow {
-    ctor public ListPopupWindow(android.content.Context);
-    ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet);
-    ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet, int);
-    ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet, int, int);
-    method public void clearListSelection();
-    method public android.view.View.OnTouchListener createDragToOpenListener(android.view.View);
-    method public void dismiss();
-    method public android.view.View getAnchorView();
-    method public int getAnimationStyle();
-    method public android.graphics.drawable.Drawable getBackground();
-    method public int getHeight();
-    method public int getHorizontalOffset();
-    method public int getInputMethodMode();
-    method public android.widget.ListView getListView();
-    method public int getPromptPosition();
-    method public java.lang.Object getSelectedItem();
-    method public long getSelectedItemId();
-    method public int getSelectedItemPosition();
-    method public android.view.View getSelectedView();
-    method public int getSoftInputMode();
-    method public int getVerticalOffset();
-    method public int getWidth();
-    method public boolean isInputMethodNotNeeded();
-    method public boolean isModal();
-    method public boolean isShowing();
-    method public boolean onKeyDown(int, android.view.KeyEvent);
-    method public boolean onKeyPreIme(int, android.view.KeyEvent);
-    method public boolean onKeyUp(int, android.view.KeyEvent);
-    method public boolean performItemClick(int);
-    method public void postShow();
-    method public void setAdapter(android.widget.ListAdapter);
-    method public void setAnchorView(android.view.View);
-    method public void setAnimationStyle(int);
-    method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
-    method public void setContentWidth(int);
-    method public void setDropDownGravity(int);
-    method public void setHeight(int);
-    method public void setHorizontalOffset(int);
-    method public void setInputMethodMode(int);
-    method public void setListSelector(android.graphics.drawable.Drawable);
-    method public void setModal(boolean);
-    method public void setOnDismissListener(android.widget.PopupWindow.OnDismissListener);
-    method public void setOnItemClickListener(android.widget.AdapterView.OnItemClickListener);
-    method public void setOnItemSelectedListener(android.widget.AdapterView.OnItemSelectedListener);
-    method public void setPromptPosition(int);
-    method public void setPromptView(android.view.View);
-    method public void setSelection(int);
-    method public void setSoftInputMode(int);
-    method public void setVerticalOffset(int);
-    method public void setWidth(int);
-    method public void show();
-    field public static final int INPUT_METHOD_FROM_FOCUSABLE = 0; // 0x0
-    field public static final int INPUT_METHOD_NEEDED = 1; // 0x1
-    field public static final int INPUT_METHOD_NOT_NEEDED = 2; // 0x2
-    field public static final int MATCH_PARENT = -1; // 0xffffffff
-    field public static final int POSITION_PROMPT_ABOVE = 0; // 0x0
-    field public static final int POSITION_PROMPT_BELOW = 1; // 0x1
-    field public static final int WRAP_CONTENT = -2; // 0xfffffffe
-  }
-
-  public class PopupMenu {
-    ctor public PopupMenu(android.content.Context, android.view.View);
-    ctor public PopupMenu(android.content.Context, android.view.View, int);
-    ctor public PopupMenu(android.content.Context, android.view.View, int, int, int);
-    method public void dismiss();
-    method public android.view.View.OnTouchListener getDragToOpenListener();
-    method public android.view.Menu getMenu();
-    method public android.view.MenuInflater getMenuInflater();
-    method public void inflate(int);
-    method public void setOnDismissListener(android.support.v7.widget.PopupMenu.OnDismissListener);
-    method public void setOnMenuItemClickListener(android.support.v7.widget.PopupMenu.OnMenuItemClickListener);
-    method public void show();
-  }
-
-  public static abstract interface PopupMenu.OnDismissListener {
-    method public abstract void onDismiss(android.support.v7.widget.PopupMenu);
-  }
-
-  public static abstract interface PopupMenu.OnMenuItemClickListener {
-    method public abstract boolean onMenuItemClick(android.view.MenuItem);
-  }
-
-  public class SearchView extends android.support.v7.widget.LinearLayoutCompat implements android.support.v7.view.CollapsibleActionView {
-    ctor public SearchView(android.content.Context);
-    ctor public SearchView(android.content.Context, android.util.AttributeSet);
-    ctor public SearchView(android.content.Context, android.util.AttributeSet, int);
-    method public int getImeOptions();
-    method public int getInputType();
-    method public int getMaxWidth();
-    method public java.lang.CharSequence getQuery();
-    method public java.lang.CharSequence getQueryHint();
-    method public android.support.v4.widget.CursorAdapter getSuggestionsAdapter();
-    method public boolean isIconfiedByDefault();
-    method public boolean isIconified();
-    method public boolean isQueryRefinementEnabled();
-    method public boolean isSubmitButtonEnabled();
-    method public void onActionViewCollapsed();
-    method public void onActionViewExpanded();
-    method public void setIconified(boolean);
-    method public void setIconifiedByDefault(boolean);
-    method public void setImeOptions(int);
-    method public void setInputType(int);
-    method public void setMaxWidth(int);
-    method public void setOnCloseListener(android.support.v7.widget.SearchView.OnCloseListener);
-    method public void setOnQueryTextFocusChangeListener(android.view.View.OnFocusChangeListener);
-    method public void setOnQueryTextListener(android.support.v7.widget.SearchView.OnQueryTextListener);
-    method public void setOnSearchClickListener(android.view.View.OnClickListener);
-    method public void setOnSuggestionListener(android.support.v7.widget.SearchView.OnSuggestionListener);
-    method public void setQuery(java.lang.CharSequence, boolean);
-    method public void setQueryHint(java.lang.CharSequence);
-    method public void setQueryRefinementEnabled(boolean);
-    method public void setSearchableInfo(android.app.SearchableInfo);
-    method public void setSubmitButtonEnabled(boolean);
-    method public void setSuggestionsAdapter(android.support.v4.widget.CursorAdapter);
-  }
-
-  public static abstract interface SearchView.OnCloseListener {
-    method public abstract boolean onClose();
-  }
-
-  public static abstract interface SearchView.OnQueryTextListener {
-    method public abstract boolean onQueryTextChange(java.lang.String);
-    method public abstract boolean onQueryTextSubmit(java.lang.String);
-  }
-
-  public static abstract interface SearchView.OnSuggestionListener {
-    method public abstract boolean onSuggestionClick(int);
-    method public abstract boolean onSuggestionSelect(int);
-  }
-
-  public class ShareActionProvider extends android.support.v4.view.ActionProvider {
-    ctor public ShareActionProvider(android.content.Context);
-    method public android.view.View onCreateActionView();
-    method public void setOnShareTargetSelectedListener(android.support.v7.widget.ShareActionProvider.OnShareTargetSelectedListener);
-    method public void setShareHistoryFileName(java.lang.String);
-    method public void setShareIntent(android.content.Intent);
-    field public static final java.lang.String DEFAULT_SHARE_HISTORY_FILE_NAME = "share_history.xml";
-  }
-
-  public static abstract interface ShareActionProvider.OnShareTargetSelectedListener {
-    method public abstract boolean onShareTargetSelected(android.support.v7.widget.ShareActionProvider, android.content.Intent);
-  }
-
-  public class SwitchCompat extends android.widget.CompoundButton {
-    ctor public SwitchCompat(android.content.Context);
-    ctor public SwitchCompat(android.content.Context, android.util.AttributeSet);
-    ctor public SwitchCompat(android.content.Context, android.util.AttributeSet, int);
-    method public boolean getShowText();
-    method public boolean getSplitTrack();
-    method public int getSwitchMinWidth();
-    method public int getSwitchPadding();
-    method public java.lang.CharSequence getTextOff();
-    method public java.lang.CharSequence getTextOn();
-    method public android.graphics.drawable.Drawable getThumbDrawable();
-    method public int getThumbTextPadding();
-    method public android.graphics.drawable.Drawable getTrackDrawable();
-    method public void onMeasure(int, int);
-    method public void setShowText(boolean);
-    method public void setSplitTrack(boolean);
-    method public void setSwitchMinWidth(int);
-    method public void setSwitchPadding(int);
-    method public void setSwitchTextAppearance(android.content.Context, int);
-    method public void setSwitchTypeface(android.graphics.Typeface, int);
-    method public void setSwitchTypeface(android.graphics.Typeface);
-    method public void setTextOff(java.lang.CharSequence);
-    method public void setTextOn(java.lang.CharSequence);
-    method public void setThumbDrawable(android.graphics.drawable.Drawable);
-    method public void setThumbResource(int);
-    method public void setThumbTextPadding(int);
-    method public void setTrackDrawable(android.graphics.drawable.Drawable);
-    method public void setTrackResource(int);
-  }
-
-  public class Toolbar extends android.view.ViewGroup {
-    ctor public Toolbar(android.content.Context);
-    ctor public Toolbar(android.content.Context, android.util.AttributeSet);
-    ctor public Toolbar(android.content.Context, android.util.AttributeSet, int);
-    method public void collapseActionView();
-    method public void dismissPopupMenus();
-    method public int getContentInsetEnd();
-    method public int getContentInsetLeft();
-    method public int getContentInsetRight();
-    method public int getContentInsetStart();
-    method public android.graphics.drawable.Drawable getLogo();
-    method public java.lang.CharSequence getLogoDescription();
-    method public android.view.Menu getMenu();
-    method public java.lang.CharSequence getNavigationContentDescription();
-    method public android.graphics.drawable.Drawable getNavigationIcon();
-    method public int getPopupTheme();
-    method public java.lang.CharSequence getSubtitle();
-    method public java.lang.CharSequence getTitle();
-    method public boolean hasExpandedActionView();
-    method public boolean hideOverflowMenu();
-    method public void inflateMenu(int);
-    method public boolean isOverflowMenuShowing();
-    method protected void onLayout(boolean, int, int, int, int);
-    method public void setContentInsetsAbsolute(int, int);
-    method public void setContentInsetsRelative(int, int);
-    method public void setLogo(int);
-    method public void setLogo(android.graphics.drawable.Drawable);
-    method public void setLogoDescription(int);
-    method public void setLogoDescription(java.lang.CharSequence);
-    method public void setNavigationContentDescription(int);
-    method public void setNavigationContentDescription(java.lang.CharSequence);
-    method public void setNavigationIcon(int);
-    method public void setNavigationIcon(android.graphics.drawable.Drawable);
-    method public void setNavigationOnClickListener(android.view.View.OnClickListener);
-    method public void setOnMenuItemClickListener(android.support.v7.widget.Toolbar.OnMenuItemClickListener);
-    method public void setPopupTheme(int);
-    method public void setSubtitle(int);
-    method public void setSubtitle(java.lang.CharSequence);
-    method public void setSubtitleTextAppearance(android.content.Context, int);
-    method public void setSubtitleTextColor(int);
-    method public void setTitle(int);
-    method public void setTitle(java.lang.CharSequence);
-    method public void setTitleTextAppearance(android.content.Context, int);
-    method public void setTitleTextColor(int);
-    method public boolean showOverflowMenu();
-  }
-
-  public static class Toolbar.LayoutParams extends android.support.v7.app.ActionBar.LayoutParams {
-    ctor public Toolbar.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public Toolbar.LayoutParams(int, int);
-    ctor public Toolbar.LayoutParams(int, int, int);
-    ctor public Toolbar.LayoutParams(int);
-    ctor public Toolbar.LayoutParams(android.support.v7.widget.Toolbar.LayoutParams);
-    ctor public Toolbar.LayoutParams(android.support.v7.app.ActionBar.LayoutParams);
-    ctor public Toolbar.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public Toolbar.LayoutParams(android.view.ViewGroup.LayoutParams);
-  }
-
-  public static abstract interface Toolbar.OnMenuItemClickListener {
-    method public abstract boolean onMenuItemClick(android.view.MenuItem);
-  }
-
-  public static class Toolbar.SavedState extends android.view.View.BaseSavedState {
-    ctor public Toolbar.SavedState(android.os.Parcel);
-    ctor public Toolbar.SavedState(android.os.Parcelable);
-    field public static final android.os.Parcelable.Creator<android.support.v7.widget.Toolbar.SavedState> CREATOR;
-  }
-
-}
-
diff --git a/v7/appcompat/api/23.0.0.txt b/v7/appcompat/api/23.0.0.txt
deleted file mode 100644
index 336e3a7..0000000
--- a/v7/appcompat/api/23.0.0.txt
+++ /dev/null
@@ -1,2028 +0,0 @@
-package android.support.v7.app {
-
-  public abstract class ActionBar {
-    ctor public ActionBar();
-    method public abstract void addOnMenuVisibilityListener(android.support.v7.app.ActionBar.OnMenuVisibilityListener);
-    method public abstract deprecated void addTab(android.support.v7.app.ActionBar.Tab);
-    method public abstract deprecated void addTab(android.support.v7.app.ActionBar.Tab, boolean);
-    method public abstract deprecated void addTab(android.support.v7.app.ActionBar.Tab, int);
-    method public abstract deprecated void addTab(android.support.v7.app.ActionBar.Tab, int, boolean);
-    method public abstract android.view.View getCustomView();
-    method public abstract int getDisplayOptions();
-    method public float getElevation();
-    method public abstract int getHeight();
-    method public int getHideOffset();
-    method public abstract deprecated int getNavigationItemCount();
-    method public abstract deprecated int getNavigationMode();
-    method public abstract deprecated int getSelectedNavigationIndex();
-    method public abstract deprecated android.support.v7.app.ActionBar.Tab getSelectedTab();
-    method public abstract java.lang.CharSequence getSubtitle();
-    method public abstract deprecated android.support.v7.app.ActionBar.Tab getTabAt(int);
-    method public abstract deprecated int getTabCount();
-    method public android.content.Context getThemedContext();
-    method public abstract java.lang.CharSequence getTitle();
-    method public abstract void hide();
-    method public boolean isHideOnContentScrollEnabled();
-    method public abstract boolean isShowing();
-    method public abstract deprecated android.support.v7.app.ActionBar.Tab newTab();
-    method public abstract deprecated void removeAllTabs();
-    method public abstract void removeOnMenuVisibilityListener(android.support.v7.app.ActionBar.OnMenuVisibilityListener);
-    method public abstract deprecated void removeTab(android.support.v7.app.ActionBar.Tab);
-    method public abstract deprecated void removeTabAt(int);
-    method public abstract deprecated void selectTab(android.support.v7.app.ActionBar.Tab);
-    method public abstract void setBackgroundDrawable(android.graphics.drawable.Drawable);
-    method public abstract void setCustomView(android.view.View);
-    method public abstract void setCustomView(android.view.View, android.support.v7.app.ActionBar.LayoutParams);
-    method public abstract void setCustomView(int);
-    method public abstract void setDisplayHomeAsUpEnabled(boolean);
-    method public abstract void setDisplayOptions(int);
-    method public abstract void setDisplayOptions(int, int);
-    method public abstract void setDisplayShowCustomEnabled(boolean);
-    method public abstract void setDisplayShowHomeEnabled(boolean);
-    method public abstract void setDisplayShowTitleEnabled(boolean);
-    method public abstract void setDisplayUseLogoEnabled(boolean);
-    method public void setElevation(float);
-    method public void setHideOffset(int);
-    method public void setHideOnContentScrollEnabled(boolean);
-    method public void setHomeActionContentDescription(java.lang.CharSequence);
-    method public void setHomeActionContentDescription(int);
-    method public void setHomeAsUpIndicator(android.graphics.drawable.Drawable);
-    method public void setHomeAsUpIndicator(int);
-    method public void setHomeButtonEnabled(boolean);
-    method public abstract void setIcon(int);
-    method public abstract void setIcon(android.graphics.drawable.Drawable);
-    method public abstract deprecated void setListNavigationCallbacks(android.widget.SpinnerAdapter, android.support.v7.app.ActionBar.OnNavigationListener);
-    method public abstract void setLogo(int);
-    method public abstract void setLogo(android.graphics.drawable.Drawable);
-    method public abstract deprecated void setNavigationMode(int);
-    method public abstract deprecated void setSelectedNavigationItem(int);
-    method public void setSplitBackgroundDrawable(android.graphics.drawable.Drawable);
-    method public void setStackedBackgroundDrawable(android.graphics.drawable.Drawable);
-    method public abstract void setSubtitle(java.lang.CharSequence);
-    method public abstract void setSubtitle(int);
-    method public abstract void setTitle(java.lang.CharSequence);
-    method public abstract void setTitle(int);
-    method public abstract void show();
-    field public static final int DISPLAY_HOME_AS_UP = 4; // 0x4
-    field public static final int DISPLAY_SHOW_CUSTOM = 16; // 0x10
-    field public static final int DISPLAY_SHOW_HOME = 2; // 0x2
-    field public static final int DISPLAY_SHOW_TITLE = 8; // 0x8
-    field public static final int DISPLAY_USE_LOGO = 1; // 0x1
-    field public static final deprecated int NAVIGATION_MODE_LIST = 1; // 0x1
-    field public static final deprecated int NAVIGATION_MODE_STANDARD = 0; // 0x0
-    field public static final deprecated int NAVIGATION_MODE_TABS = 2; // 0x2
-  }
-
-  public static class ActionBar.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
-    ctor public ActionBar.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public ActionBar.LayoutParams(int, int);
-    ctor public ActionBar.LayoutParams(int, int, int);
-    ctor public ActionBar.LayoutParams(int);
-    ctor public ActionBar.LayoutParams(android.support.v7.app.ActionBar.LayoutParams);
-    ctor public ActionBar.LayoutParams(android.view.ViewGroup.LayoutParams);
-    field public int gravity;
-  }
-
-  public static abstract interface ActionBar.OnMenuVisibilityListener {
-    method public abstract void onMenuVisibilityChanged(boolean);
-  }
-
-  public static abstract deprecated interface ActionBar.OnNavigationListener {
-    method public abstract boolean onNavigationItemSelected(int, long);
-  }
-
-  public static abstract deprecated class ActionBar.Tab {
-    ctor public ActionBar.Tab();
-    method public abstract java.lang.CharSequence getContentDescription();
-    method public abstract android.view.View getCustomView();
-    method public abstract android.graphics.drawable.Drawable getIcon();
-    method public abstract int getPosition();
-    method public abstract java.lang.Object getTag();
-    method public abstract java.lang.CharSequence getText();
-    method public abstract void select();
-    method public abstract android.support.v7.app.ActionBar.Tab setContentDescription(int);
-    method public abstract android.support.v7.app.ActionBar.Tab setContentDescription(java.lang.CharSequence);
-    method public abstract android.support.v7.app.ActionBar.Tab setCustomView(android.view.View);
-    method public abstract android.support.v7.app.ActionBar.Tab setCustomView(int);
-    method public abstract android.support.v7.app.ActionBar.Tab setIcon(android.graphics.drawable.Drawable);
-    method public abstract android.support.v7.app.ActionBar.Tab setIcon(int);
-    method public abstract android.support.v7.app.ActionBar.Tab setTabListener(android.support.v7.app.ActionBar.TabListener);
-    method public abstract android.support.v7.app.ActionBar.Tab setTag(java.lang.Object);
-    method public abstract android.support.v7.app.ActionBar.Tab setText(java.lang.CharSequence);
-    method public abstract android.support.v7.app.ActionBar.Tab setText(int);
-    field public static final int INVALID_POSITION = -1; // 0xffffffff
-  }
-
-  public static abstract deprecated interface ActionBar.TabListener {
-    method public abstract void onTabReselected(android.support.v7.app.ActionBar.Tab, android.support.v4.app.FragmentTransaction);
-    method public abstract void onTabSelected(android.support.v7.app.ActionBar.Tab, android.support.v4.app.FragmentTransaction);
-    method public abstract void onTabUnselected(android.support.v7.app.ActionBar.Tab, android.support.v4.app.FragmentTransaction);
-  }
-
-  public deprecated class ActionBarActivity extends android.support.v7.app.AppCompatActivity {
-    ctor public ActionBarActivity();
-  }
-
-  public class ActionBarDrawerToggle implements android.support.v4.widget.DrawerLayout.DrawerListener {
-    ctor public ActionBarDrawerToggle(android.app.Activity, android.support.v4.widget.DrawerLayout, int, int);
-    ctor public ActionBarDrawerToggle(android.app.Activity, android.support.v4.widget.DrawerLayout, android.support.v7.widget.Toolbar, int, int);
-    method public android.view.View.OnClickListener getToolbarNavigationClickListener();
-    method public boolean isDrawerIndicatorEnabled();
-    method public void onConfigurationChanged(android.content.res.Configuration);
-    method public void onDrawerClosed(android.view.View);
-    method public void onDrawerOpened(android.view.View);
-    method public void onDrawerSlide(android.view.View, float);
-    method public void onDrawerStateChanged(int);
-    method public boolean onOptionsItemSelected(android.view.MenuItem);
-    method public void setDrawerIndicatorEnabled(boolean);
-    method public void setHomeAsUpIndicator(android.graphics.drawable.Drawable);
-    method public void setHomeAsUpIndicator(int);
-    method public void setToolbarNavigationClickListener(android.view.View.OnClickListener);
-    method public void syncState();
-  }
-
-  public static abstract interface ActionBarDrawerToggle.Delegate {
-    method public abstract android.content.Context getActionBarThemedContext();
-    method public abstract android.graphics.drawable.Drawable getThemeUpIndicator();
-    method public abstract boolean isNavigationVisible();
-    method public abstract void setActionBarDescription(int);
-    method public abstract void setActionBarUpIndicator(android.graphics.drawable.Drawable, int);
-  }
-
-  public static abstract interface ActionBarDrawerToggle.DelegateProvider {
-    method public abstract android.support.v7.app.ActionBarDrawerToggle.Delegate getDrawerToggleDelegate();
-  }
-
-  public class AlertDialog extends android.support.v7.app.AppCompatDialog implements android.content.DialogInterface {
-    ctor protected AlertDialog(android.content.Context);
-    ctor protected AlertDialog(android.content.Context, int);
-    ctor protected AlertDialog(android.content.Context, boolean, android.content.DialogInterface.OnCancelListener);
-    method public android.widget.Button getButton(int);
-    method public android.widget.ListView getListView();
-    method public void setButton(int, java.lang.CharSequence, android.os.Message);
-    method public void setButton(int, java.lang.CharSequence, android.content.DialogInterface.OnClickListener);
-    method public void setCustomTitle(android.view.View);
-    method public void setIcon(int);
-    method public void setIcon(android.graphics.drawable.Drawable);
-    method public void setIconAttribute(int);
-    method public void setMessage(java.lang.CharSequence);
-    method public void setView(android.view.View);
-    method public void setView(android.view.View, int, int, int, int);
-  }
-
-  public static class AlertDialog.Builder {
-    ctor public AlertDialog.Builder(android.content.Context);
-    ctor public AlertDialog.Builder(android.content.Context, int);
-    method public android.support.v7.app.AlertDialog create();
-    method public android.content.Context getContext();
-    method public android.support.v7.app.AlertDialog.Builder setAdapter(android.widget.ListAdapter, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setCancelable(boolean);
-    method public android.support.v7.app.AlertDialog.Builder setCursor(android.database.Cursor, android.content.DialogInterface.OnClickListener, java.lang.String);
-    method public android.support.v7.app.AlertDialog.Builder setCustomTitle(android.view.View);
-    method public android.support.v7.app.AlertDialog.Builder setIcon(int);
-    method public android.support.v7.app.AlertDialog.Builder setIcon(android.graphics.drawable.Drawable);
-    method public android.support.v7.app.AlertDialog.Builder setIconAttribute(int);
-    method public android.support.v7.app.AlertDialog.Builder setInverseBackgroundForced(boolean);
-    method public android.support.v7.app.AlertDialog.Builder setItems(int, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setItems(java.lang.CharSequence[], android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setMessage(int);
-    method public android.support.v7.app.AlertDialog.Builder setMessage(java.lang.CharSequence);
-    method public android.support.v7.app.AlertDialog.Builder setMultiChoiceItems(int, boolean[], android.content.DialogInterface.OnMultiChoiceClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setMultiChoiceItems(java.lang.CharSequence[], boolean[], android.content.DialogInterface.OnMultiChoiceClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setMultiChoiceItems(android.database.Cursor, java.lang.String, java.lang.String, android.content.DialogInterface.OnMultiChoiceClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setNegativeButton(int, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setNegativeButton(java.lang.CharSequence, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setNeutralButton(int, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setNeutralButton(java.lang.CharSequence, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setOnCancelListener(android.content.DialogInterface.OnCancelListener);
-    method public android.support.v7.app.AlertDialog.Builder setOnDismissListener(android.content.DialogInterface.OnDismissListener);
-    method public android.support.v7.app.AlertDialog.Builder setOnItemSelectedListener(android.widget.AdapterView.OnItemSelectedListener);
-    method public android.support.v7.app.AlertDialog.Builder setOnKeyListener(android.content.DialogInterface.OnKeyListener);
-    method public android.support.v7.app.AlertDialog.Builder setPositiveButton(int, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setPositiveButton(java.lang.CharSequence, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setSingleChoiceItems(int, int, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setSingleChoiceItems(android.database.Cursor, int, java.lang.String, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setSingleChoiceItems(java.lang.CharSequence[], int, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setSingleChoiceItems(android.widget.ListAdapter, int, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setTitle(int);
-    method public android.support.v7.app.AlertDialog.Builder setTitle(java.lang.CharSequence);
-    method public android.support.v7.app.AlertDialog.Builder setView(int);
-    method public android.support.v7.app.AlertDialog.Builder setView(android.view.View);
-    method public android.support.v7.app.AlertDialog show();
-  }
-
-  public class AppCompatActivity extends android.support.v4.app.FragmentActivity implements android.support.v7.app.ActionBarDrawerToggle.DelegateProvider android.support.v7.app.AppCompatCallback {
-    ctor public AppCompatActivity();
-    method public android.support.v7.app.AppCompatDelegate getDelegate();
-    method public android.support.v7.app.ActionBarDrawerToggle.Delegate getDrawerToggleDelegate();
-    method public android.support.v7.app.ActionBar getSupportActionBar();
-    method public android.content.Intent getSupportParentActivityIntent();
-    method public void onCreateSupportNavigateUpTaskStack(android.support.v4.app.TaskStackBuilder);
-    method public final boolean onMenuItemSelected(int, android.view.MenuItem);
-    method public void onPrepareSupportNavigateUpTaskStack(android.support.v4.app.TaskStackBuilder);
-    method public void onSupportActionModeFinished(android.support.v7.view.ActionMode);
-    method public void onSupportActionModeStarted(android.support.v7.view.ActionMode);
-    method public deprecated void onSupportContentChanged();
-    method public boolean onSupportNavigateUp();
-    method public android.support.v7.view.ActionMode onWindowStartingSupportActionMode(android.support.v7.view.ActionMode.Callback);
-    method public void setSupportActionBar(android.support.v7.widget.Toolbar);
-    method public deprecated void setSupportProgress(int);
-    method public deprecated void setSupportProgressBarIndeterminate(boolean);
-    method public deprecated void setSupportProgressBarIndeterminateVisibility(boolean);
-    method public deprecated void setSupportProgressBarVisibility(boolean);
-    method public android.support.v7.view.ActionMode startSupportActionMode(android.support.v7.view.ActionMode.Callback);
-    method public void supportNavigateUpTo(android.content.Intent);
-    method public boolean supportRequestWindowFeature(int);
-    method public boolean supportShouldUpRecreateTask(android.content.Intent);
-  }
-
-  public abstract interface AppCompatCallback {
-    method public abstract void onSupportActionModeFinished(android.support.v7.view.ActionMode);
-    method public abstract void onSupportActionModeStarted(android.support.v7.view.ActionMode);
-    method public abstract android.support.v7.view.ActionMode onWindowStartingSupportActionMode(android.support.v7.view.ActionMode.Callback);
-  }
-
-  public abstract class AppCompatDelegate {
-    method public abstract void addContentView(android.view.View, android.view.ViewGroup.LayoutParams);
-    method public static android.support.v7.app.AppCompatDelegate create(android.app.Activity, android.support.v7.app.AppCompatCallback);
-    method public static android.support.v7.app.AppCompatDelegate create(android.app.Dialog, android.support.v7.app.AppCompatCallback);
-    method public abstract android.view.View createView(android.view.View, java.lang.String, android.content.Context, android.util.AttributeSet);
-    method public abstract android.support.v7.app.ActionBarDrawerToggle.Delegate getDrawerToggleDelegate();
-    method public abstract android.view.MenuInflater getMenuInflater();
-    method public abstract android.support.v7.app.ActionBar getSupportActionBar();
-    method public abstract boolean hasWindowFeature(int);
-    method public abstract void installViewFactory();
-    method public abstract void invalidateOptionsMenu();
-    method public abstract boolean isHandleNativeActionModesEnabled();
-    method public abstract void onConfigurationChanged(android.content.res.Configuration);
-    method public abstract void onCreate(android.os.Bundle);
-    method public abstract void onDestroy();
-    method public abstract void onPostCreate(android.os.Bundle);
-    method public abstract void onPostResume();
-    method public abstract void onStop();
-    method public abstract boolean requestWindowFeature(int);
-    method public abstract void setContentView(android.view.View);
-    method public abstract void setContentView(int);
-    method public abstract void setContentView(android.view.View, android.view.ViewGroup.LayoutParams);
-    method public abstract void setHandleNativeActionModesEnabled(boolean);
-    method public abstract void setSupportActionBar(android.support.v7.widget.Toolbar);
-    method public abstract void setTitle(java.lang.CharSequence);
-    method public abstract android.support.v7.view.ActionMode startSupportActionMode(android.support.v7.view.ActionMode.Callback);
-    field public static final int FEATURE_ACTION_MODE_OVERLAY = 10; // 0xa
-    field public static final int FEATURE_SUPPORT_ACTION_BAR = 108; // 0x6c
-    field public static final int FEATURE_SUPPORT_ACTION_BAR_OVERLAY = 109; // 0x6d
-  }
-
-  public class AppCompatDialog extends android.app.Dialog implements android.support.v7.app.AppCompatCallback {
-    ctor public AppCompatDialog(android.content.Context);
-    ctor public AppCompatDialog(android.content.Context, int);
-    ctor protected AppCompatDialog(android.content.Context, boolean, android.content.DialogInterface.OnCancelListener);
-    method public android.support.v7.app.AppCompatDelegate getDelegate();
-    method public android.support.v7.app.ActionBar getSupportActionBar();
-    method public void onSupportActionModeFinished(android.support.v7.view.ActionMode);
-    method public void onSupportActionModeStarted(android.support.v7.view.ActionMode);
-    method public android.support.v7.view.ActionMode onWindowStartingSupportActionMode(android.support.v7.view.ActionMode.Callback);
-    method public boolean supportRequestWindowFeature(int);
-  }
-
-  public class AppCompatDialogFragment extends android.support.v4.app.DialogFragment {
-    ctor public AppCompatDialogFragment();
-  }
-
-  public class NotificationCompat extends android.support.v4.app.NotificationCompat {
-    ctor public NotificationCompat();
-  }
-
-  public static class NotificationCompat.Builder extends android.support.v4.app.NotificationCompat.Builder {
-    ctor public NotificationCompat.Builder(android.content.Context);
-  }
-
-  public static class NotificationCompat.MediaStyle extends android.support.v4.app.NotificationCompat.Style {
-    ctor public NotificationCompat.MediaStyle();
-    ctor public NotificationCompat.MediaStyle(android.support.v4.app.NotificationCompat.Builder);
-    method public android.support.v7.app.NotificationCompat.MediaStyle setCancelButtonIntent(android.app.PendingIntent);
-    method public android.support.v7.app.NotificationCompat.MediaStyle setMediaSession(android.support.v4.media.session.MediaSessionCompat.Token);
-    method public android.support.v7.app.NotificationCompat.MediaStyle setShowActionsInCompactView(int...);
-    method public android.support.v7.app.NotificationCompat.MediaStyle setShowCancelButton(boolean);
-  }
-
-}
-
-package android.support.v7.appcompat {
-
-  public final class R {
-    ctor public R();
-  }
-
-  public static final class R.anim {
-    ctor public R.anim();
-    field public static int abc_fade_in;
-    field public static int abc_fade_out;
-    field public static int abc_grow_fade_in_from_bottom;
-    field public static int abc_popup_enter;
-    field public static int abc_popup_exit;
-    field public static int abc_shrink_fade_out_from_bottom;
-    field public static int abc_slide_in_bottom;
-    field public static int abc_slide_in_top;
-    field public static int abc_slide_out_bottom;
-    field public static int abc_slide_out_top;
-  }
-
-  public static final class R.attr {
-    ctor public R.attr();
-    field public static int actionBarDivider;
-    field public static int actionBarItemBackground;
-    field public static int actionBarPopupTheme;
-    field public static int actionBarSize;
-    field public static int actionBarSplitStyle;
-    field public static int actionBarStyle;
-    field public static int actionBarTabBarStyle;
-    field public static int actionBarTabStyle;
-    field public static int actionBarTabTextStyle;
-    field public static int actionBarTheme;
-    field public static int actionBarWidgetTheme;
-    field public static int actionButtonStyle;
-    field public static int actionDropDownStyle;
-    field public static int actionLayout;
-    field public static int actionMenuTextAppearance;
-    field public static int actionMenuTextColor;
-    field public static int actionModeBackground;
-    field public static int actionModeCloseButtonStyle;
-    field public static int actionModeCloseDrawable;
-    field public static int actionModeCopyDrawable;
-    field public static int actionModeCutDrawable;
-    field public static int actionModeFindDrawable;
-    field public static int actionModePasteDrawable;
-    field public static int actionModePopupWindowStyle;
-    field public static int actionModeSelectAllDrawable;
-    field public static int actionModeShareDrawable;
-    field public static int actionModeSplitBackground;
-    field public static int actionModeStyle;
-    field public static int actionModeWebSearchDrawable;
-    field public static int actionOverflowButtonStyle;
-    field public static int actionOverflowMenuStyle;
-    field public static int actionProviderClass;
-    field public static int actionViewClass;
-    field public static int activityChooserViewStyle;
-    field public static int alertDialogButtonGroupStyle;
-    field public static int alertDialogCenterButtons;
-    field public static int alertDialogStyle;
-    field public static int alertDialogTheme;
-    field public static int arrowHeadLength;
-    field public static int arrowShaftLength;
-    field public static int autoCompleteTextViewStyle;
-    field public static int background;
-    field public static int backgroundSplit;
-    field public static int backgroundStacked;
-    field public static int backgroundTint;
-    field public static int backgroundTintMode;
-    field public static int barLength;
-    field public static int borderlessButtonStyle;
-    field public static int buttonBarButtonStyle;
-    field public static int buttonBarNegativeButtonStyle;
-    field public static int buttonBarNeutralButtonStyle;
-    field public static int buttonBarPositiveButtonStyle;
-    field public static int buttonBarStyle;
-    field public static int buttonPanelSideLayout;
-    field public static int buttonStyle;
-    field public static int buttonStyleSmall;
-    field public static int buttonTint;
-    field public static int buttonTintMode;
-    field public static int checkboxStyle;
-    field public static int checkedTextViewStyle;
-    field public static int closeIcon;
-    field public static int closeItemLayout;
-    field public static int collapseContentDescription;
-    field public static int collapseIcon;
-    field public static int color;
-    field public static int colorAccent;
-    field public static int colorButtonNormal;
-    field public static int colorControlActivated;
-    field public static int colorControlHighlight;
-    field public static int colorControlNormal;
-    field public static int colorPrimary;
-    field public static int colorPrimaryDark;
-    field public static int colorSwitchThumbNormal;
-    field public static int commitIcon;
-    field public static int contentInsetEnd;
-    field public static int contentInsetLeft;
-    field public static int contentInsetRight;
-    field public static int contentInsetStart;
-    field public static int controlBackground;
-    field public static int customNavigationLayout;
-    field public static int defaultQueryHint;
-    field public static int dialogPreferredPadding;
-    field public static int dialogTheme;
-    field public static int displayOptions;
-    field public static int divider;
-    field public static int dividerHorizontal;
-    field public static int dividerPadding;
-    field public static int dividerVertical;
-    field public static int drawableSize;
-    field public static int drawerArrowStyle;
-    field public static int dropDownListViewStyle;
-    field public static int dropdownListPreferredItemHeight;
-    field public static int editTextBackground;
-    field public static int editTextColor;
-    field public static int editTextStyle;
-    field public static int elevation;
-    field public static int expandActivityOverflowButtonDrawable;
-    field public static int gapBetweenBars;
-    field public static int goIcon;
-    field public static int height;
-    field public static int hideOnContentScroll;
-    field public static int homeAsUpIndicator;
-    field public static int homeLayout;
-    field public static int icon;
-    field public static int iconifiedByDefault;
-    field public static int indeterminateProgressStyle;
-    field public static int initialActivityCount;
-    field public static int isLightTheme;
-    field public static int itemPadding;
-    field public static int layout;
-    field public static int listChoiceBackgroundIndicator;
-    field public static int listDividerAlertDialog;
-    field public static int listItemLayout;
-    field public static int listLayout;
-    field public static int listPopupWindowStyle;
-    field public static int listPreferredItemHeight;
-    field public static int listPreferredItemHeightLarge;
-    field public static int listPreferredItemHeightSmall;
-    field public static int listPreferredItemPaddingLeft;
-    field public static int listPreferredItemPaddingRight;
-    field public static int logo;
-    field public static int logoDescription;
-    field public static int maxButtonHeight;
-    field public static int measureWithLargestChild;
-    field public static int multiChoiceItemLayout;
-    field public static int navigationContentDescription;
-    field public static int navigationIcon;
-    field public static int navigationMode;
-    field public static int overlapAnchor;
-    field public static int paddingEnd;
-    field public static int paddingStart;
-    field public static int panelBackground;
-    field public static int panelMenuListTheme;
-    field public static int panelMenuListWidth;
-    field public static int popupMenuStyle;
-    field public static int popupTheme;
-    field public static int popupWindowStyle;
-    field public static int preserveIconSpacing;
-    field public static int progressBarPadding;
-    field public static int progressBarStyle;
-    field public static int queryBackground;
-    field public static int queryHint;
-    field public static int radioButtonStyle;
-    field public static int ratingBarStyle;
-    field public static int searchHintIcon;
-    field public static int searchIcon;
-    field public static int searchViewStyle;
-    field public static int selectableItemBackground;
-    field public static int selectableItemBackgroundBorderless;
-    field public static int showAsAction;
-    field public static int showDividers;
-    field public static int showText;
-    field public static int singleChoiceItemLayout;
-    field public static int spinBars;
-    field public static int spinnerDropDownItemStyle;
-    field public static int spinnerStyle;
-    field public static int splitTrack;
-    field public static int state_above_anchor;
-    field public static int submitBackground;
-    field public static int subtitle;
-    field public static int subtitleTextAppearance;
-    field public static int subtitleTextColor;
-    field public static int subtitleTextStyle;
-    field public static int suggestionRowLayout;
-    field public static int switchMinWidth;
-    field public static int switchPadding;
-    field public static int switchStyle;
-    field public static int switchTextAppearance;
-    field public static int textAllCaps;
-    field public static int textAppearanceLargePopupMenu;
-    field public static int textAppearanceListItem;
-    field public static int textAppearanceListItemSmall;
-    field public static int textAppearanceSearchResultSubtitle;
-    field public static int textAppearanceSearchResultTitle;
-    field public static int textAppearanceSmallPopupMenu;
-    field public static int textColorAlertDialogListItem;
-    field public static int textColorSearchUrl;
-    field public static int theme;
-    field public static int thickness;
-    field public static int thumbTextPadding;
-    field public static int title;
-    field public static int titleMarginBottom;
-    field public static int titleMarginEnd;
-    field public static int titleMarginStart;
-    field public static int titleMarginTop;
-    field public static int titleMargins;
-    field public static int titleTextAppearance;
-    field public static int titleTextColor;
-    field public static int titleTextStyle;
-    field public static int toolbarNavigationButtonStyle;
-    field public static int toolbarStyle;
-    field public static int track;
-    field public static int voiceIcon;
-    field public static int windowActionBar;
-    field public static int windowActionBarOverlay;
-    field public static int windowActionModeOverlay;
-    field public static int windowFixedHeightMajor;
-    field public static int windowFixedHeightMinor;
-    field public static int windowFixedWidthMajor;
-    field public static int windowFixedWidthMinor;
-    field public static int windowMinWidthMajor;
-    field public static int windowMinWidthMinor;
-    field public static int windowNoTitle;
-  }
-
-  public static final class R.bool {
-    ctor public R.bool();
-    field public static int abc_action_bar_embed_tabs;
-    field public static int abc_action_bar_embed_tabs_pre_jb;
-    field public static int abc_action_bar_expanded_action_views_exclusive;
-    field public static int abc_config_actionMenuItemAllCaps;
-    field public static int abc_config_allowActionMenuItemTextWithIcon;
-    field public static int abc_config_closeDialogWhenTouchOutside;
-    field public static int abc_config_showMenuShortcutsWhenKeyboardPresent;
-  }
-
-  public static final class R.color {
-    ctor public R.color();
-    field public static int abc_background_cache_hint_selector_material_dark;
-    field public static int abc_background_cache_hint_selector_material_light;
-    field public static int abc_color_highlight_material;
-    field public static int abc_input_method_navigation_guard;
-    field public static int abc_primary_text_disable_only_material_dark;
-    field public static int abc_primary_text_disable_only_material_light;
-    field public static int abc_primary_text_material_dark;
-    field public static int abc_primary_text_material_light;
-    field public static int abc_search_url_text;
-    field public static int abc_search_url_text_normal;
-    field public static int abc_search_url_text_pressed;
-    field public static int abc_search_url_text_selected;
-    field public static int abc_secondary_text_material_dark;
-    field public static int abc_secondary_text_material_light;
-    field public static int accent_material_dark;
-    field public static int accent_material_light;
-    field public static int background_floating_material_dark;
-    field public static int background_floating_material_light;
-    field public static int background_material_dark;
-    field public static int background_material_light;
-    field public static int bright_foreground_disabled_material_dark;
-    field public static int bright_foreground_disabled_material_light;
-    field public static int bright_foreground_inverse_material_dark;
-    field public static int bright_foreground_inverse_material_light;
-    field public static int bright_foreground_material_dark;
-    field public static int bright_foreground_material_light;
-    field public static int button_material_dark;
-    field public static int button_material_light;
-    field public static int dim_foreground_disabled_material_dark;
-    field public static int dim_foreground_disabled_material_light;
-    field public static int dim_foreground_material_dark;
-    field public static int dim_foreground_material_light;
-    field public static int foreground_material_dark;
-    field public static int foreground_material_light;
-    field public static int highlighted_text_material_dark;
-    field public static int highlighted_text_material_light;
-    field public static int hint_foreground_material_dark;
-    field public static int hint_foreground_material_light;
-    field public static int material_blue_grey_800;
-    field public static int material_blue_grey_900;
-    field public static int material_blue_grey_950;
-    field public static int material_deep_teal_200;
-    field public static int material_deep_teal_500;
-    field public static int material_grey_100;
-    field public static int material_grey_300;
-    field public static int material_grey_50;
-    field public static int material_grey_600;
-    field public static int material_grey_800;
-    field public static int material_grey_850;
-    field public static int material_grey_900;
-    field public static int primary_dark_material_dark;
-    field public static int primary_dark_material_light;
-    field public static int primary_material_dark;
-    field public static int primary_material_light;
-    field public static int primary_text_default_material_dark;
-    field public static int primary_text_default_material_light;
-    field public static int primary_text_disabled_material_dark;
-    field public static int primary_text_disabled_material_light;
-    field public static int ripple_material_dark;
-    field public static int ripple_material_light;
-    field public static int secondary_text_default_material_dark;
-    field public static int secondary_text_default_material_light;
-    field public static int secondary_text_disabled_material_dark;
-    field public static int secondary_text_disabled_material_light;
-    field public static int switch_thumb_disabled_material_dark;
-    field public static int switch_thumb_disabled_material_light;
-    field public static int switch_thumb_material_dark;
-    field public static int switch_thumb_material_light;
-    field public static int switch_thumb_normal_material_dark;
-    field public static int switch_thumb_normal_material_light;
-  }
-
-  public static final class R.dimen {
-    ctor public R.dimen();
-    field public static int abc_action_bar_content_inset_material;
-    field public static int abc_action_bar_default_height_material;
-    field public static int abc_action_bar_default_padding_end_material;
-    field public static int abc_action_bar_default_padding_start_material;
-    field public static int abc_action_bar_icon_vertical_padding_material;
-    field public static int abc_action_bar_overflow_padding_end_material;
-    field public static int abc_action_bar_overflow_padding_start_material;
-    field public static int abc_action_bar_progress_bar_size;
-    field public static int abc_action_bar_stacked_max_height;
-    field public static int abc_action_bar_stacked_tab_max_width;
-    field public static int abc_action_bar_subtitle_bottom_margin_material;
-    field public static int abc_action_bar_subtitle_top_margin_material;
-    field public static int abc_action_button_min_height_material;
-    field public static int abc_action_button_min_width_material;
-    field public static int abc_action_button_min_width_overflow_material;
-    field public static int abc_alert_dialog_button_bar_height;
-    field public static int abc_button_inset_horizontal_material;
-    field public static int abc_button_inset_vertical_material;
-    field public static int abc_button_padding_horizontal_material;
-    field public static int abc_button_padding_vertical_material;
-    field public static int abc_config_prefDialogWidth;
-    field public static int abc_control_corner_material;
-    field public static int abc_control_inset_material;
-    field public static int abc_control_padding_material;
-    field public static int abc_dialog_list_padding_vertical_material;
-    field public static int abc_dialog_min_width_major;
-    field public static int abc_dialog_min_width_minor;
-    field public static int abc_dialog_padding_material;
-    field public static int abc_dialog_padding_top_material;
-    field public static int abc_disabled_alpha_material_dark;
-    field public static int abc_disabled_alpha_material_light;
-    field public static int abc_dropdownitem_icon_width;
-    field public static int abc_dropdownitem_text_padding_left;
-    field public static int abc_dropdownitem_text_padding_right;
-    field public static int abc_edit_text_inset_bottom_material;
-    field public static int abc_edit_text_inset_horizontal_material;
-    field public static int abc_edit_text_inset_top_material;
-    field public static int abc_floating_window_z;
-    field public static int abc_list_item_padding_horizontal_material;
-    field public static int abc_panel_menu_list_width;
-    field public static int abc_search_view_preferred_width;
-    field public static int abc_search_view_text_min_width;
-    field public static int abc_switch_padding;
-    field public static int abc_text_size_body_1_material;
-    field public static int abc_text_size_body_2_material;
-    field public static int abc_text_size_button_material;
-    field public static int abc_text_size_caption_material;
-    field public static int abc_text_size_display_1_material;
-    field public static int abc_text_size_display_2_material;
-    field public static int abc_text_size_display_3_material;
-    field public static int abc_text_size_display_4_material;
-    field public static int abc_text_size_headline_material;
-    field public static int abc_text_size_large_material;
-    field public static int abc_text_size_medium_material;
-    field public static int abc_text_size_menu_material;
-    field public static int abc_text_size_small_material;
-    field public static int abc_text_size_subhead_material;
-    field public static int abc_text_size_subtitle_material_toolbar;
-    field public static int abc_text_size_title_material;
-    field public static int abc_text_size_title_material_toolbar;
-    field public static int dialog_fixed_height_major;
-    field public static int dialog_fixed_height_minor;
-    field public static int dialog_fixed_width_major;
-    field public static int dialog_fixed_width_minor;
-    field public static int disabled_alpha_material_dark;
-    field public static int disabled_alpha_material_light;
-    field public static int highlight_alpha_material_colored;
-    field public static int highlight_alpha_material_dark;
-    field public static int highlight_alpha_material_light;
-    field public static int notification_large_icon_height;
-    field public static int notification_large_icon_width;
-    field public static int notification_subtext_size;
-  }
-
-  public static final class R.drawable {
-    ctor public R.drawable();
-    field public static int abc_ab_share_pack_mtrl_alpha;
-    field public static int abc_action_bar_item_background_material;
-    field public static int abc_btn_borderless_material;
-    field public static int abc_btn_check_material;
-    field public static int abc_btn_check_to_on_mtrl_000;
-    field public static int abc_btn_check_to_on_mtrl_015;
-    field public static int abc_btn_colored_material;
-    field public static int abc_btn_default_mtrl_shape;
-    field public static int abc_btn_radio_material;
-    field public static int abc_btn_radio_to_on_mtrl_000;
-    field public static int abc_btn_radio_to_on_mtrl_015;
-    field public static int abc_btn_rating_star_off_mtrl_alpha;
-    field public static int abc_btn_rating_star_on_mtrl_alpha;
-    field public static int abc_btn_switch_to_on_mtrl_00001;
-    field public static int abc_btn_switch_to_on_mtrl_00012;
-    field public static int abc_cab_background_internal_bg;
-    field public static int abc_cab_background_top_material;
-    field public static int abc_cab_background_top_mtrl_alpha;
-    field public static int abc_control_background_material;
-    field public static int abc_dialog_material_background_dark;
-    field public static int abc_dialog_material_background_light;
-    field public static int abc_edit_text_material;
-    field public static int abc_ic_ab_back_mtrl_am_alpha;
-    field public static int abc_ic_clear_mtrl_alpha;
-    field public static int abc_ic_commit_search_api_mtrl_alpha;
-    field public static int abc_ic_go_search_api_mtrl_alpha;
-    field public static int abc_ic_menu_copy_mtrl_am_alpha;
-    field public static int abc_ic_menu_cut_mtrl_alpha;
-    field public static int abc_ic_menu_moreoverflow_mtrl_alpha;
-    field public static int abc_ic_menu_paste_mtrl_am_alpha;
-    field public static int abc_ic_menu_selectall_mtrl_alpha;
-    field public static int abc_ic_menu_share_mtrl_alpha;
-    field public static int abc_ic_search_api_mtrl_alpha;
-    field public static int abc_ic_voice_search_api_mtrl_alpha;
-    field public static int abc_item_background_holo_dark;
-    field public static int abc_item_background_holo_light;
-    field public static int abc_list_divider_mtrl_alpha;
-    field public static int abc_list_focused_holo;
-    field public static int abc_list_longpressed_holo;
-    field public static int abc_list_pressed_holo_dark;
-    field public static int abc_list_pressed_holo_light;
-    field public static int abc_list_selector_background_transition_holo_dark;
-    field public static int abc_list_selector_background_transition_holo_light;
-    field public static int abc_list_selector_disabled_holo_dark;
-    field public static int abc_list_selector_disabled_holo_light;
-    field public static int abc_list_selector_holo_dark;
-    field public static int abc_list_selector_holo_light;
-    field public static int abc_menu_hardkey_panel_mtrl_mult;
-    field public static int abc_popup_background_mtrl_mult;
-    field public static int abc_ratingbar_full_material;
-    field public static int abc_spinner_mtrl_am_alpha;
-    field public static int abc_spinner_textfield_background_material;
-    field public static int abc_switch_thumb_material;
-    field public static int abc_switch_track_mtrl_alpha;
-    field public static int abc_tab_indicator_material;
-    field public static int abc_tab_indicator_mtrl_alpha;
-    field public static int abc_text_cursor_material;
-    field public static int abc_textfield_activated_mtrl_alpha;
-    field public static int abc_textfield_default_mtrl_alpha;
-    field public static int abc_textfield_search_activated_mtrl_alpha;
-    field public static int abc_textfield_search_default_mtrl_alpha;
-    field public static int abc_textfield_search_material;
-    field public static int notification_template_icon_bg;
-  }
-
-  public static final class R.id {
-    ctor public R.id();
-    field public static int action0;
-    field public static int action_bar;
-    field public static int action_bar_activity_content;
-    field public static int action_bar_container;
-    field public static int action_bar_root;
-    field public static int action_bar_spinner;
-    field public static int action_bar_subtitle;
-    field public static int action_bar_title;
-    field public static int action_context_bar;
-    field public static int action_divider;
-    field public static int action_menu_divider;
-    field public static int action_menu_presenter;
-    field public static int action_mode_bar;
-    field public static int action_mode_bar_stub;
-    field public static int action_mode_close_button;
-    field public static int activity_chooser_view_content;
-    field public static int alertTitle;
-    field public static int always;
-    field public static int beginning;
-    field public static int buttonPanel;
-    field public static int cancel_action;
-    field public static int checkbox;
-    field public static int chronometer;
-    field public static int collapseActionView;
-    field public static int contentPanel;
-    field public static int custom;
-    field public static int customPanel;
-    field public static int decor_content_parent;
-    field public static int default_activity_button;
-    field public static int disableHome;
-    field public static int edit_query;
-    field public static int end;
-    field public static int end_padder;
-    field public static int expand_activities_button;
-    field public static int expanded_menu;
-    field public static int home;
-    field public static int homeAsUp;
-    field public static int icon;
-    field public static int ifRoom;
-    field public static int image;
-    field public static int info;
-    field public static int line1;
-    field public static int line3;
-    field public static int listMode;
-    field public static int list_item;
-    field public static int media_actions;
-    field public static int middle;
-    field public static int multiply;
-    field public static int never;
-    field public static int none;
-    field public static int normal;
-    field public static int parentPanel;
-    field public static int progress_circular;
-    field public static int progress_horizontal;
-    field public static int radio;
-    field public static int screen;
-    field public static int scrollView;
-    field public static int search_badge;
-    field public static int search_bar;
-    field public static int search_button;
-    field public static int search_close_btn;
-    field public static int search_edit_frame;
-    field public static int search_go_btn;
-    field public static int search_mag_icon;
-    field public static int search_plate;
-    field public static int search_src_text;
-    field public static int search_voice_btn;
-    field public static int select_dialog_listview;
-    field public static int shortcut;
-    field public static int showCustom;
-    field public static int showHome;
-    field public static int showTitle;
-    field public static int split_action_bar;
-    field public static int src_atop;
-    field public static int src_in;
-    field public static int src_over;
-    field public static int status_bar_latest_event_content;
-    field public static int submit_area;
-    field public static int tabMode;
-    field public static int text;
-    field public static int text2;
-    field public static int textSpacerNoButtons;
-    field public static int time;
-    field public static int title;
-    field public static int title_template;
-    field public static int topPanel;
-    field public static int up;
-    field public static int useLogo;
-    field public static int withText;
-    field public static int wrap_content;
-  }
-
-  public static final class R.integer {
-    ctor public R.integer();
-    field public static int abc_config_activityDefaultDur;
-    field public static int abc_config_activityShortDur;
-    field public static int abc_max_action_buttons;
-    field public static int cancel_button_image_alpha;
-    field public static int status_bar_notification_info_maxnum;
-  }
-
-  public static final class R.layout {
-    ctor public R.layout();
-    field public static int abc_action_bar_title_item;
-    field public static int abc_action_bar_up_container;
-    field public static int abc_action_bar_view_list_nav_layout;
-    field public static int abc_action_menu_item_layout;
-    field public static int abc_action_menu_layout;
-    field public static int abc_action_mode_bar;
-    field public static int abc_action_mode_close_item_material;
-    field public static int abc_activity_chooser_view;
-    field public static int abc_activity_chooser_view_list_item;
-    field public static int abc_alert_dialog_material;
-    field public static int abc_dialog_title_material;
-    field public static int abc_expanded_menu_layout;
-    field public static int abc_list_menu_item_checkbox;
-    field public static int abc_list_menu_item_icon;
-    field public static int abc_list_menu_item_layout;
-    field public static int abc_list_menu_item_radio;
-    field public static int abc_popup_menu_item_layout;
-    field public static int abc_screen_content_include;
-    field public static int abc_screen_simple;
-    field public static int abc_screen_simple_overlay_action_mode;
-    field public static int abc_screen_toolbar;
-    field public static int abc_search_dropdown_item_icons_2line;
-    field public static int abc_search_view;
-    field public static int abc_select_dialog_material;
-    field public static int notification_media_action;
-    field public static int notification_media_cancel_action;
-    field public static int notification_template_big_media;
-    field public static int notification_template_big_media_narrow;
-    field public static int notification_template_lines;
-    field public static int notification_template_media;
-    field public static int notification_template_part_chronometer;
-    field public static int notification_template_part_time;
-    field public static int select_dialog_item_material;
-    field public static int select_dialog_multichoice_material;
-    field public static int select_dialog_singlechoice_material;
-    field public static int support_simple_spinner_dropdown_item;
-  }
-
-  public static final class R.string {
-    ctor public R.string();
-    field public static int abc_action_bar_home_description;
-    field public static int abc_action_bar_home_description_format;
-    field public static int abc_action_bar_home_subtitle_description_format;
-    field public static int abc_action_bar_up_description;
-    field public static int abc_action_menu_overflow_description;
-    field public static int abc_action_mode_done;
-    field public static int abc_activity_chooser_view_see_all;
-    field public static int abc_activitychooserview_choose_application;
-    field public static int abc_search_hint;
-    field public static int abc_searchview_description_clear;
-    field public static int abc_searchview_description_query;
-    field public static int abc_searchview_description_search;
-    field public static int abc_searchview_description_submit;
-    field public static int abc_searchview_description_voice;
-    field public static int abc_shareactionprovider_share_with;
-    field public static int abc_shareactionprovider_share_with_application;
-    field public static int abc_toolbar_collapse_description;
-    field public static int status_bar_notification_info_overflow;
-  }
-
-  public static final class R.style {
-    ctor public R.style();
-    field public static int AlertDialog_AppCompat;
-    field public static int AlertDialog_AppCompat_Light;
-    field public static int Animation_AppCompat_Dialog;
-    field public static int Animation_AppCompat_DropDownUp;
-    field public static int Base_AlertDialog_AppCompat;
-    field public static int Base_AlertDialog_AppCompat_Light;
-    field public static int Base_Animation_AppCompat_Dialog;
-    field public static int Base_Animation_AppCompat_DropDownUp;
-    field public static int Base_DialogWindowTitleBackground_AppCompat;
-    field public static int Base_DialogWindowTitle_AppCompat;
-    field public static int Base_TextAppearance_AppCompat;
-    field public static int Base_TextAppearance_AppCompat_Body1;
-    field public static int Base_TextAppearance_AppCompat_Body2;
-    field public static int Base_TextAppearance_AppCompat_Button;
-    field public static int Base_TextAppearance_AppCompat_Caption;
-    field public static int Base_TextAppearance_AppCompat_Display1;
-    field public static int Base_TextAppearance_AppCompat_Display2;
-    field public static int Base_TextAppearance_AppCompat_Display3;
-    field public static int Base_TextAppearance_AppCompat_Display4;
-    field public static int Base_TextAppearance_AppCompat_Headline;
-    field public static int Base_TextAppearance_AppCompat_Inverse;
-    field public static int Base_TextAppearance_AppCompat_Large;
-    field public static int Base_TextAppearance_AppCompat_Large_Inverse;
-    field public static int Base_TextAppearance_AppCompat_Light_Widget_PopupMenu_Large;
-    field public static int Base_TextAppearance_AppCompat_Light_Widget_PopupMenu_Small;
-    field public static int Base_TextAppearance_AppCompat_Medium;
-    field public static int Base_TextAppearance_AppCompat_Medium_Inverse;
-    field public static int Base_TextAppearance_AppCompat_Menu;
-    field public static int Base_TextAppearance_AppCompat_SearchResult;
-    field public static int Base_TextAppearance_AppCompat_SearchResult_Subtitle;
-    field public static int Base_TextAppearance_AppCompat_SearchResult_Title;
-    field public static int Base_TextAppearance_AppCompat_Small;
-    field public static int Base_TextAppearance_AppCompat_Small_Inverse;
-    field public static int Base_TextAppearance_AppCompat_Subhead;
-    field public static int Base_TextAppearance_AppCompat_Subhead_Inverse;
-    field public static int Base_TextAppearance_AppCompat_Title;
-    field public static int Base_TextAppearance_AppCompat_Title_Inverse;
-    field public static int Base_TextAppearance_AppCompat_Widget_ActionBar_Menu;
-    field public static int Base_TextAppearance_AppCompat_Widget_ActionBar_Subtitle;
-    field public static int Base_TextAppearance_AppCompat_Widget_ActionBar_Subtitle_Inverse;
-    field public static int Base_TextAppearance_AppCompat_Widget_ActionBar_Title;
-    field public static int Base_TextAppearance_AppCompat_Widget_ActionBar_Title_Inverse;
-    field public static int Base_TextAppearance_AppCompat_Widget_ActionMode_Subtitle;
-    field public static int Base_TextAppearance_AppCompat_Widget_ActionMode_Title;
-    field public static int Base_TextAppearance_AppCompat_Widget_Button;
-    field public static int Base_TextAppearance_AppCompat_Widget_Button_Inverse;
-    field public static int Base_TextAppearance_AppCompat_Widget_DropDownItem;
-    field public static int Base_TextAppearance_AppCompat_Widget_PopupMenu_Large;
-    field public static int Base_TextAppearance_AppCompat_Widget_PopupMenu_Small;
-    field public static int Base_TextAppearance_AppCompat_Widget_Switch;
-    field public static int Base_TextAppearance_AppCompat_Widget_TextView_SpinnerItem;
-    field public static int Base_TextAppearance_Widget_AppCompat_ExpandedMenu_Item;
-    field public static int Base_TextAppearance_Widget_AppCompat_Toolbar_Subtitle;
-    field public static int Base_TextAppearance_Widget_AppCompat_Toolbar_Title;
-    field public static int Base_ThemeOverlay_AppCompat;
-    field public static int Base_ThemeOverlay_AppCompat_ActionBar;
-    field public static int Base_ThemeOverlay_AppCompat_Dark;
-    field public static int Base_ThemeOverlay_AppCompat_Dark_ActionBar;
-    field public static int Base_ThemeOverlay_AppCompat_Light;
-    field public static int Base_Theme_AppCompat;
-    field public static int Base_Theme_AppCompat_CompactMenu;
-    field public static int Base_Theme_AppCompat_Dialog;
-    field public static int Base_Theme_AppCompat_DialogWhenLarge;
-    field public static int Base_Theme_AppCompat_Dialog_Alert;
-    field public static int Base_Theme_AppCompat_Dialog_FixedSize;
-    field public static int Base_Theme_AppCompat_Dialog_MinWidth;
-    field public static int Base_Theme_AppCompat_Light;
-    field public static int Base_Theme_AppCompat_Light_DarkActionBar;
-    field public static int Base_Theme_AppCompat_Light_Dialog;
-    field public static int Base_Theme_AppCompat_Light_DialogWhenLarge;
-    field public static int Base_Theme_AppCompat_Light_Dialog_Alert;
-    field public static int Base_Theme_AppCompat_Light_Dialog_FixedSize;
-    field public static int Base_Theme_AppCompat_Light_Dialog_MinWidth;
-    field public static int Base_V11_Theme_AppCompat_Dialog;
-    field public static int Base_V11_Theme_AppCompat_Light_Dialog;
-    field public static int Base_V12_Widget_AppCompat_AutoCompleteTextView;
-    field public static int Base_V12_Widget_AppCompat_EditText;
-    field public static int Base_V21_Theme_AppCompat;
-    field public static int Base_V21_Theme_AppCompat_Dialog;
-    field public static int Base_V21_Theme_AppCompat_Light;
-    field public static int Base_V21_Theme_AppCompat_Light_Dialog;
-    field public static int Base_V22_Theme_AppCompat;
-    field public static int Base_V22_Theme_AppCompat_Light;
-    field public static int Base_V23_Theme_AppCompat;
-    field public static int Base_V23_Theme_AppCompat_Light;
-    field public static int Base_V7_Theme_AppCompat;
-    field public static int Base_V7_Theme_AppCompat_Dialog;
-    field public static int Base_V7_Theme_AppCompat_Light;
-    field public static int Base_V7_Theme_AppCompat_Light_Dialog;
-    field public static int Base_V7_Widget_AppCompat_AutoCompleteTextView;
-    field public static int Base_V7_Widget_AppCompat_EditText;
-    field public static int Base_Widget_AppCompat_ActionBar;
-    field public static int Base_Widget_AppCompat_ActionBar_Solid;
-    field public static int Base_Widget_AppCompat_ActionBar_TabBar;
-    field public static int Base_Widget_AppCompat_ActionBar_TabText;
-    field public static int Base_Widget_AppCompat_ActionBar_TabView;
-    field public static int Base_Widget_AppCompat_ActionButton;
-    field public static int Base_Widget_AppCompat_ActionButton_CloseMode;
-    field public static int Base_Widget_AppCompat_ActionButton_Overflow;
-    field public static int Base_Widget_AppCompat_ActionMode;
-    field public static int Base_Widget_AppCompat_ActivityChooserView;
-    field public static int Base_Widget_AppCompat_AutoCompleteTextView;
-    field public static int Base_Widget_AppCompat_Button;
-    field public static int Base_Widget_AppCompat_ButtonBar;
-    field public static int Base_Widget_AppCompat_ButtonBar_AlertDialog;
-    field public static int Base_Widget_AppCompat_Button_Borderless;
-    field public static int Base_Widget_AppCompat_Button_Borderless_Colored;
-    field public static int Base_Widget_AppCompat_Button_ButtonBar_AlertDialog;
-    field public static int Base_Widget_AppCompat_Button_Colored;
-    field public static int Base_Widget_AppCompat_Button_Small;
-    field public static int Base_Widget_AppCompat_CompoundButton_CheckBox;
-    field public static int Base_Widget_AppCompat_CompoundButton_RadioButton;
-    field public static int Base_Widget_AppCompat_CompoundButton_Switch;
-    field public static int Base_Widget_AppCompat_DrawerArrowToggle;
-    field public static int Base_Widget_AppCompat_DrawerArrowToggle_Common;
-    field public static int Base_Widget_AppCompat_DropDownItem_Spinner;
-    field public static int Base_Widget_AppCompat_EditText;
-    field public static int Base_Widget_AppCompat_Light_ActionBar;
-    field public static int Base_Widget_AppCompat_Light_ActionBar_Solid;
-    field public static int Base_Widget_AppCompat_Light_ActionBar_TabBar;
-    field public static int Base_Widget_AppCompat_Light_ActionBar_TabText;
-    field public static int Base_Widget_AppCompat_Light_ActionBar_TabText_Inverse;
-    field public static int Base_Widget_AppCompat_Light_ActionBar_TabView;
-    field public static int Base_Widget_AppCompat_Light_PopupMenu;
-    field public static int Base_Widget_AppCompat_Light_PopupMenu_Overflow;
-    field public static int Base_Widget_AppCompat_ListPopupWindow;
-    field public static int Base_Widget_AppCompat_ListView;
-    field public static int Base_Widget_AppCompat_ListView_DropDown;
-    field public static int Base_Widget_AppCompat_ListView_Menu;
-    field public static int Base_Widget_AppCompat_PopupMenu;
-    field public static int Base_Widget_AppCompat_PopupMenu_Overflow;
-    field public static int Base_Widget_AppCompat_PopupWindow;
-    field public static int Base_Widget_AppCompat_ProgressBar;
-    field public static int Base_Widget_AppCompat_ProgressBar_Horizontal;
-    field public static int Base_Widget_AppCompat_RatingBar;
-    field public static int Base_Widget_AppCompat_SearchView;
-    field public static int Base_Widget_AppCompat_SearchView_ActionBar;
-    field public static int Base_Widget_AppCompat_Spinner;
-    field public static int Base_Widget_AppCompat_Spinner_Underlined;
-    field public static int Base_Widget_AppCompat_TextView_SpinnerItem;
-    field public static int Base_Widget_AppCompat_Toolbar;
-    field public static int Base_Widget_AppCompat_Toolbar_Button_Navigation;
-    field public static int Platform_AppCompat;
-    field public static int Platform_AppCompat_Light;
-    field public static int Platform_ThemeOverlay_AppCompat;
-    field public static int Platform_ThemeOverlay_AppCompat_Dark;
-    field public static int Platform_ThemeOverlay_AppCompat_Light;
-    field public static int Platform_V11_AppCompat;
-    field public static int Platform_V11_AppCompat_Light;
-    field public static int Platform_V14_AppCompat;
-    field public static int Platform_V14_AppCompat_Light;
-    field public static int Platform_Widget_AppCompat_Spinner;
-    field public static int RtlOverlay_DialogWindowTitle_AppCompat;
-    field public static int RtlOverlay_Widget_AppCompat_ActionBar_TitleItem;
-    field public static int RtlOverlay_Widget_AppCompat_ActionButton_Overflow;
-    field public static int RtlOverlay_Widget_AppCompat_DialogTitle_Icon;
-    field public static int RtlOverlay_Widget_AppCompat_PopupMenuItem;
-    field public static int RtlOverlay_Widget_AppCompat_PopupMenuItem_InternalGroup;
-    field public static int RtlOverlay_Widget_AppCompat_PopupMenuItem_Text;
-    field public static int RtlOverlay_Widget_AppCompat_SearchView_MagIcon;
-    field public static int RtlOverlay_Widget_AppCompat_Search_DropDown;
-    field public static int RtlOverlay_Widget_AppCompat_Search_DropDown_Icon1;
-    field public static int RtlOverlay_Widget_AppCompat_Search_DropDown_Icon2;
-    field public static int RtlOverlay_Widget_AppCompat_Search_DropDown_Query;
-    field public static int RtlOverlay_Widget_AppCompat_Search_DropDown_Text;
-    field public static int TextAppearance_AppCompat;
-    field public static int TextAppearance_AppCompat_Body1;
-    field public static int TextAppearance_AppCompat_Body2;
-    field public static int TextAppearance_AppCompat_Button;
-    field public static int TextAppearance_AppCompat_Caption;
-    field public static int TextAppearance_AppCompat_Display1;
-    field public static int TextAppearance_AppCompat_Display2;
-    field public static int TextAppearance_AppCompat_Display3;
-    field public static int TextAppearance_AppCompat_Display4;
-    field public static int TextAppearance_AppCompat_Headline;
-    field public static int TextAppearance_AppCompat_Inverse;
-    field public static int TextAppearance_AppCompat_Large;
-    field public static int TextAppearance_AppCompat_Large_Inverse;
-    field public static int TextAppearance_AppCompat_Light_SearchResult_Subtitle;
-    field public static int TextAppearance_AppCompat_Light_SearchResult_Title;
-    field public static int TextAppearance_AppCompat_Light_Widget_PopupMenu_Large;
-    field public static int TextAppearance_AppCompat_Light_Widget_PopupMenu_Small;
-    field public static int TextAppearance_AppCompat_Medium;
-    field public static int TextAppearance_AppCompat_Medium_Inverse;
-    field public static int TextAppearance_AppCompat_Menu;
-    field public static int TextAppearance_AppCompat_SearchResult_Subtitle;
-    field public static int TextAppearance_AppCompat_SearchResult_Title;
-    field public static int TextAppearance_AppCompat_Small;
-    field public static int TextAppearance_AppCompat_Small_Inverse;
-    field public static int TextAppearance_AppCompat_Subhead;
-    field public static int TextAppearance_AppCompat_Subhead_Inverse;
-    field public static int TextAppearance_AppCompat_Title;
-    field public static int TextAppearance_AppCompat_Title_Inverse;
-    field public static int TextAppearance_AppCompat_Widget_ActionBar_Menu;
-    field public static int TextAppearance_AppCompat_Widget_ActionBar_Subtitle;
-    field public static int TextAppearance_AppCompat_Widget_ActionBar_Subtitle_Inverse;
-    field public static int TextAppearance_AppCompat_Widget_ActionBar_Title;
-    field public static int TextAppearance_AppCompat_Widget_ActionBar_Title_Inverse;
-    field public static int TextAppearance_AppCompat_Widget_ActionMode_Subtitle;
-    field public static int TextAppearance_AppCompat_Widget_ActionMode_Subtitle_Inverse;
-    field public static int TextAppearance_AppCompat_Widget_ActionMode_Title;
-    field public static int TextAppearance_AppCompat_Widget_ActionMode_Title_Inverse;
-    field public static int TextAppearance_AppCompat_Widget_Button;
-    field public static int TextAppearance_AppCompat_Widget_Button_Inverse;
-    field public static int TextAppearance_AppCompat_Widget_DropDownItem;
-    field public static int TextAppearance_AppCompat_Widget_PopupMenu_Large;
-    field public static int TextAppearance_AppCompat_Widget_PopupMenu_Small;
-    field public static int TextAppearance_AppCompat_Widget_Switch;
-    field public static int TextAppearance_AppCompat_Widget_TextView_SpinnerItem;
-    field public static int TextAppearance_StatusBar_EventContent;
-    field public static int TextAppearance_StatusBar_EventContent_Info;
-    field public static int TextAppearance_StatusBar_EventContent_Line2;
-    field public static int TextAppearance_StatusBar_EventContent_Time;
-    field public static int TextAppearance_StatusBar_EventContent_Title;
-    field public static int TextAppearance_Widget_AppCompat_ExpandedMenu_Item;
-    field public static int TextAppearance_Widget_AppCompat_Toolbar_Subtitle;
-    field public static int TextAppearance_Widget_AppCompat_Toolbar_Title;
-    field public static int ThemeOverlay_AppCompat;
-    field public static int ThemeOverlay_AppCompat_ActionBar;
-    field public static int ThemeOverlay_AppCompat_Dark;
-    field public static int ThemeOverlay_AppCompat_Dark_ActionBar;
-    field public static int ThemeOverlay_AppCompat_Light;
-    field public static int Theme_AppCompat;
-    field public static int Theme_AppCompat_CompactMenu;
-    field public static int Theme_AppCompat_Dialog;
-    field public static int Theme_AppCompat_DialogWhenLarge;
-    field public static int Theme_AppCompat_Dialog_Alert;
-    field public static int Theme_AppCompat_Dialog_MinWidth;
-    field public static int Theme_AppCompat_Light;
-    field public static int Theme_AppCompat_Light_DarkActionBar;
-    field public static int Theme_AppCompat_Light_Dialog;
-    field public static int Theme_AppCompat_Light_DialogWhenLarge;
-    field public static int Theme_AppCompat_Light_Dialog_Alert;
-    field public static int Theme_AppCompat_Light_Dialog_MinWidth;
-    field public static int Theme_AppCompat_Light_NoActionBar;
-    field public static int Theme_AppCompat_NoActionBar;
-    field public static int Widget_AppCompat_ActionBar;
-    field public static int Widget_AppCompat_ActionBar_Solid;
-    field public static int Widget_AppCompat_ActionBar_TabBar;
-    field public static int Widget_AppCompat_ActionBar_TabText;
-    field public static int Widget_AppCompat_ActionBar_TabView;
-    field public static int Widget_AppCompat_ActionButton;
-    field public static int Widget_AppCompat_ActionButton_CloseMode;
-    field public static int Widget_AppCompat_ActionButton_Overflow;
-    field public static int Widget_AppCompat_ActionMode;
-    field public static int Widget_AppCompat_ActivityChooserView;
-    field public static int Widget_AppCompat_AutoCompleteTextView;
-    field public static int Widget_AppCompat_Button;
-    field public static int Widget_AppCompat_ButtonBar;
-    field public static int Widget_AppCompat_ButtonBar_AlertDialog;
-    field public static int Widget_AppCompat_Button_Borderless;
-    field public static int Widget_AppCompat_Button_Borderless_Colored;
-    field public static int Widget_AppCompat_Button_ButtonBar_AlertDialog;
-    field public static int Widget_AppCompat_Button_Colored;
-    field public static int Widget_AppCompat_Button_Small;
-    field public static int Widget_AppCompat_CompoundButton_CheckBox;
-    field public static int Widget_AppCompat_CompoundButton_RadioButton;
-    field public static int Widget_AppCompat_CompoundButton_Switch;
-    field public static int Widget_AppCompat_DrawerArrowToggle;
-    field public static int Widget_AppCompat_DropDownItem_Spinner;
-    field public static int Widget_AppCompat_EditText;
-    field public static int Widget_AppCompat_Light_ActionBar;
-    field public static int Widget_AppCompat_Light_ActionBar_Solid;
-    field public static int Widget_AppCompat_Light_ActionBar_Solid_Inverse;
-    field public static int Widget_AppCompat_Light_ActionBar_TabBar;
-    field public static int Widget_AppCompat_Light_ActionBar_TabBar_Inverse;
-    field public static int Widget_AppCompat_Light_ActionBar_TabText;
-    field public static int Widget_AppCompat_Light_ActionBar_TabText_Inverse;
-    field public static int Widget_AppCompat_Light_ActionBar_TabView;
-    field public static int Widget_AppCompat_Light_ActionBar_TabView_Inverse;
-    field public static int Widget_AppCompat_Light_ActionButton;
-    field public static int Widget_AppCompat_Light_ActionButton_CloseMode;
-    field public static int Widget_AppCompat_Light_ActionButton_Overflow;
-    field public static int Widget_AppCompat_Light_ActionMode_Inverse;
-    field public static int Widget_AppCompat_Light_ActivityChooserView;
-    field public static int Widget_AppCompat_Light_AutoCompleteTextView;
-    field public static int Widget_AppCompat_Light_DropDownItem_Spinner;
-    field public static int Widget_AppCompat_Light_ListPopupWindow;
-    field public static int Widget_AppCompat_Light_ListView_DropDown;
-    field public static int Widget_AppCompat_Light_PopupMenu;
-    field public static int Widget_AppCompat_Light_PopupMenu_Overflow;
-    field public static int Widget_AppCompat_Light_SearchView;
-    field public static int Widget_AppCompat_Light_Spinner_DropDown_ActionBar;
-    field public static int Widget_AppCompat_ListPopupWindow;
-    field public static int Widget_AppCompat_ListView;
-    field public static int Widget_AppCompat_ListView_DropDown;
-    field public static int Widget_AppCompat_ListView_Menu;
-    field public static int Widget_AppCompat_PopupMenu;
-    field public static int Widget_AppCompat_PopupMenu_Overflow;
-    field public static int Widget_AppCompat_PopupWindow;
-    field public static int Widget_AppCompat_ProgressBar;
-    field public static int Widget_AppCompat_ProgressBar_Horizontal;
-    field public static int Widget_AppCompat_RatingBar;
-    field public static int Widget_AppCompat_SearchView;
-    field public static int Widget_AppCompat_SearchView_ActionBar;
-    field public static int Widget_AppCompat_Spinner;
-    field public static int Widget_AppCompat_Spinner_DropDown;
-    field public static int Widget_AppCompat_Spinner_DropDown_ActionBar;
-    field public static int Widget_AppCompat_Spinner_Underlined;
-    field public static int Widget_AppCompat_TextView_SpinnerItem;
-    field public static int Widget_AppCompat_Toolbar;
-    field public static int Widget_AppCompat_Toolbar_Button_Navigation;
-  }
-
-  public static final class R.styleable {
-    ctor public R.styleable();
-    field public static final int[] ActionBar;
-    field public static final int[] ActionBarLayout;
-    field public static int ActionBarLayout_android_layout_gravity;
-    field public static int ActionBar_background;
-    field public static int ActionBar_backgroundSplit;
-    field public static int ActionBar_backgroundStacked;
-    field public static int ActionBar_contentInsetEnd;
-    field public static int ActionBar_contentInsetLeft;
-    field public static int ActionBar_contentInsetRight;
-    field public static int ActionBar_contentInsetStart;
-    field public static int ActionBar_customNavigationLayout;
-    field public static int ActionBar_displayOptions;
-    field public static int ActionBar_divider;
-    field public static int ActionBar_elevation;
-    field public static int ActionBar_height;
-    field public static int ActionBar_hideOnContentScroll;
-    field public static int ActionBar_homeAsUpIndicator;
-    field public static int ActionBar_homeLayout;
-    field public static int ActionBar_icon;
-    field public static int ActionBar_indeterminateProgressStyle;
-    field public static int ActionBar_itemPadding;
-    field public static int ActionBar_logo;
-    field public static int ActionBar_navigationMode;
-    field public static int ActionBar_popupTheme;
-    field public static int ActionBar_progressBarPadding;
-    field public static int ActionBar_progressBarStyle;
-    field public static int ActionBar_subtitle;
-    field public static int ActionBar_subtitleTextStyle;
-    field public static int ActionBar_title;
-    field public static int ActionBar_titleTextStyle;
-    field public static final int[] ActionMenuItemView;
-    field public static int ActionMenuItemView_android_minWidth;
-    field public static final int[] ActionMenuView;
-    field public static final int[] ActionMode;
-    field public static int ActionMode_background;
-    field public static int ActionMode_backgroundSplit;
-    field public static int ActionMode_closeItemLayout;
-    field public static int ActionMode_height;
-    field public static int ActionMode_subtitleTextStyle;
-    field public static int ActionMode_titleTextStyle;
-    field public static final int[] ActivityChooserView;
-    field public static int ActivityChooserView_expandActivityOverflowButtonDrawable;
-    field public static int ActivityChooserView_initialActivityCount;
-    field public static final int[] AlertDialog;
-    field public static int AlertDialog_android_layout;
-    field public static int AlertDialog_buttonPanelSideLayout;
-    field public static int AlertDialog_listItemLayout;
-    field public static int AlertDialog_listLayout;
-    field public static int AlertDialog_multiChoiceItemLayout;
-    field public static int AlertDialog_singleChoiceItemLayout;
-    field public static final int[] AppCompatTextView;
-    field public static int AppCompatTextView_android_textAppearance;
-    field public static int AppCompatTextView_textAllCaps;
-    field public static final int[] CompoundButton;
-    field public static int CompoundButton_android_button;
-    field public static int CompoundButton_buttonTint;
-    field public static int CompoundButton_buttonTintMode;
-    field public static final int[] DrawerArrowToggle;
-    field public static int DrawerArrowToggle_arrowHeadLength;
-    field public static int DrawerArrowToggle_arrowShaftLength;
-    field public static int DrawerArrowToggle_barLength;
-    field public static int DrawerArrowToggle_color;
-    field public static int DrawerArrowToggle_drawableSize;
-    field public static int DrawerArrowToggle_gapBetweenBars;
-    field public static int DrawerArrowToggle_spinBars;
-    field public static int DrawerArrowToggle_thickness;
-    field public static final int[] LinearLayoutCompat;
-    field public static final int[] LinearLayoutCompat_Layout;
-    field public static int LinearLayoutCompat_Layout_android_layout_gravity;
-    field public static int LinearLayoutCompat_Layout_android_layout_height;
-    field public static int LinearLayoutCompat_Layout_android_layout_weight;
-    field public static int LinearLayoutCompat_Layout_android_layout_width;
-    field public static int LinearLayoutCompat_android_baselineAligned;
-    field public static int LinearLayoutCompat_android_baselineAlignedChildIndex;
-    field public static int LinearLayoutCompat_android_gravity;
-    field public static int LinearLayoutCompat_android_orientation;
-    field public static int LinearLayoutCompat_android_weightSum;
-    field public static int LinearLayoutCompat_divider;
-    field public static int LinearLayoutCompat_dividerPadding;
-    field public static int LinearLayoutCompat_measureWithLargestChild;
-    field public static int LinearLayoutCompat_showDividers;
-    field public static final int[] ListPopupWindow;
-    field public static int ListPopupWindow_android_dropDownHorizontalOffset;
-    field public static int ListPopupWindow_android_dropDownVerticalOffset;
-    field public static final int[] MenuGroup;
-    field public static int MenuGroup_android_checkableBehavior;
-    field public static int MenuGroup_android_enabled;
-    field public static int MenuGroup_android_id;
-    field public static int MenuGroup_android_menuCategory;
-    field public static int MenuGroup_android_orderInCategory;
-    field public static int MenuGroup_android_visible;
-    field public static final int[] MenuItem;
-    field public static int MenuItem_actionLayout;
-    field public static int MenuItem_actionProviderClass;
-    field public static int MenuItem_actionViewClass;
-    field public static int MenuItem_android_alphabeticShortcut;
-    field public static int MenuItem_android_checkable;
-    field public static int MenuItem_android_checked;
-    field public static int MenuItem_android_enabled;
-    field public static int MenuItem_android_icon;
-    field public static int MenuItem_android_id;
-    field public static int MenuItem_android_menuCategory;
-    field public static int MenuItem_android_numericShortcut;
-    field public static int MenuItem_android_onClick;
-    field public static int MenuItem_android_orderInCategory;
-    field public static int MenuItem_android_title;
-    field public static int MenuItem_android_titleCondensed;
-    field public static int MenuItem_android_visible;
-    field public static int MenuItem_showAsAction;
-    field public static final int[] MenuView;
-    field public static int MenuView_android_headerBackground;
-    field public static int MenuView_android_horizontalDivider;
-    field public static int MenuView_android_itemBackground;
-    field public static int MenuView_android_itemIconDisabledAlpha;
-    field public static int MenuView_android_itemTextAppearance;
-    field public static int MenuView_android_verticalDivider;
-    field public static int MenuView_android_windowAnimationStyle;
-    field public static int MenuView_preserveIconSpacing;
-    field public static final int[] PopupWindow;
-    field public static final int[] PopupWindowBackgroundState;
-    field public static int PopupWindowBackgroundState_state_above_anchor;
-    field public static int PopupWindow_android_popupBackground;
-    field public static int PopupWindow_overlapAnchor;
-    field public static final int[] SearchView;
-    field public static int SearchView_android_focusable;
-    field public static int SearchView_android_imeOptions;
-    field public static int SearchView_android_inputType;
-    field public static int SearchView_android_maxWidth;
-    field public static int SearchView_closeIcon;
-    field public static int SearchView_commitIcon;
-    field public static int SearchView_defaultQueryHint;
-    field public static int SearchView_goIcon;
-    field public static int SearchView_iconifiedByDefault;
-    field public static int SearchView_layout;
-    field public static int SearchView_queryBackground;
-    field public static int SearchView_queryHint;
-    field public static int SearchView_searchHintIcon;
-    field public static int SearchView_searchIcon;
-    field public static int SearchView_submitBackground;
-    field public static int SearchView_suggestionRowLayout;
-    field public static int SearchView_voiceIcon;
-    field public static final int[] Spinner;
-    field public static int Spinner_android_dropDownWidth;
-    field public static int Spinner_android_popupBackground;
-    field public static int Spinner_android_prompt;
-    field public static int Spinner_popupTheme;
-    field public static final int[] SwitchCompat;
-    field public static int SwitchCompat_android_textOff;
-    field public static int SwitchCompat_android_textOn;
-    field public static int SwitchCompat_android_thumb;
-    field public static int SwitchCompat_showText;
-    field public static int SwitchCompat_splitTrack;
-    field public static int SwitchCompat_switchMinWidth;
-    field public static int SwitchCompat_switchPadding;
-    field public static int SwitchCompat_switchTextAppearance;
-    field public static int SwitchCompat_thumbTextPadding;
-    field public static int SwitchCompat_track;
-    field public static final int[] TextAppearance;
-    field public static int TextAppearance_android_textColor;
-    field public static int TextAppearance_android_textSize;
-    field public static int TextAppearance_android_textStyle;
-    field public static int TextAppearance_android_typeface;
-    field public static int TextAppearance_textAllCaps;
-    field public static final int[] Theme;
-    field public static int Theme_actionBarDivider;
-    field public static int Theme_actionBarItemBackground;
-    field public static int Theme_actionBarPopupTheme;
-    field public static int Theme_actionBarSize;
-    field public static int Theme_actionBarSplitStyle;
-    field public static int Theme_actionBarStyle;
-    field public static int Theme_actionBarTabBarStyle;
-    field public static int Theme_actionBarTabStyle;
-    field public static int Theme_actionBarTabTextStyle;
-    field public static int Theme_actionBarTheme;
-    field public static int Theme_actionBarWidgetTheme;
-    field public static int Theme_actionButtonStyle;
-    field public static int Theme_actionDropDownStyle;
-    field public static int Theme_actionMenuTextAppearance;
-    field public static int Theme_actionMenuTextColor;
-    field public static int Theme_actionModeBackground;
-    field public static int Theme_actionModeCloseButtonStyle;
-    field public static int Theme_actionModeCloseDrawable;
-    field public static int Theme_actionModeCopyDrawable;
-    field public static int Theme_actionModeCutDrawable;
-    field public static int Theme_actionModeFindDrawable;
-    field public static int Theme_actionModePasteDrawable;
-    field public static int Theme_actionModePopupWindowStyle;
-    field public static int Theme_actionModeSelectAllDrawable;
-    field public static int Theme_actionModeShareDrawable;
-    field public static int Theme_actionModeSplitBackground;
-    field public static int Theme_actionModeStyle;
-    field public static int Theme_actionModeWebSearchDrawable;
-    field public static int Theme_actionOverflowButtonStyle;
-    field public static int Theme_actionOverflowMenuStyle;
-    field public static int Theme_activityChooserViewStyle;
-    field public static int Theme_alertDialogButtonGroupStyle;
-    field public static int Theme_alertDialogCenterButtons;
-    field public static int Theme_alertDialogStyle;
-    field public static int Theme_alertDialogTheme;
-    field public static int Theme_android_windowAnimationStyle;
-    field public static int Theme_android_windowIsFloating;
-    field public static int Theme_autoCompleteTextViewStyle;
-    field public static int Theme_borderlessButtonStyle;
-    field public static int Theme_buttonBarButtonStyle;
-    field public static int Theme_buttonBarNegativeButtonStyle;
-    field public static int Theme_buttonBarNeutralButtonStyle;
-    field public static int Theme_buttonBarPositiveButtonStyle;
-    field public static int Theme_buttonBarStyle;
-    field public static int Theme_buttonStyle;
-    field public static int Theme_buttonStyleSmall;
-    field public static int Theme_checkboxStyle;
-    field public static int Theme_checkedTextViewStyle;
-    field public static int Theme_colorAccent;
-    field public static int Theme_colorButtonNormal;
-    field public static int Theme_colorControlActivated;
-    field public static int Theme_colorControlHighlight;
-    field public static int Theme_colorControlNormal;
-    field public static int Theme_colorPrimary;
-    field public static int Theme_colorPrimaryDark;
-    field public static int Theme_colorSwitchThumbNormal;
-    field public static int Theme_controlBackground;
-    field public static int Theme_dialogPreferredPadding;
-    field public static int Theme_dialogTheme;
-    field public static int Theme_dividerHorizontal;
-    field public static int Theme_dividerVertical;
-    field public static int Theme_dropDownListViewStyle;
-    field public static int Theme_dropdownListPreferredItemHeight;
-    field public static int Theme_editTextBackground;
-    field public static int Theme_editTextColor;
-    field public static int Theme_editTextStyle;
-    field public static int Theme_homeAsUpIndicator;
-    field public static int Theme_listChoiceBackgroundIndicator;
-    field public static int Theme_listDividerAlertDialog;
-    field public static int Theme_listPopupWindowStyle;
-    field public static int Theme_listPreferredItemHeight;
-    field public static int Theme_listPreferredItemHeightLarge;
-    field public static int Theme_listPreferredItemHeightSmall;
-    field public static int Theme_listPreferredItemPaddingLeft;
-    field public static int Theme_listPreferredItemPaddingRight;
-    field public static int Theme_panelBackground;
-    field public static int Theme_panelMenuListTheme;
-    field public static int Theme_panelMenuListWidth;
-    field public static int Theme_popupMenuStyle;
-    field public static int Theme_popupWindowStyle;
-    field public static int Theme_radioButtonStyle;
-    field public static int Theme_ratingBarStyle;
-    field public static int Theme_searchViewStyle;
-    field public static int Theme_selectableItemBackground;
-    field public static int Theme_selectableItemBackgroundBorderless;
-    field public static int Theme_spinnerDropDownItemStyle;
-    field public static int Theme_spinnerStyle;
-    field public static int Theme_switchStyle;
-    field public static int Theme_textAppearanceLargePopupMenu;
-    field public static int Theme_textAppearanceListItem;
-    field public static int Theme_textAppearanceListItemSmall;
-    field public static int Theme_textAppearanceSearchResultSubtitle;
-    field public static int Theme_textAppearanceSearchResultTitle;
-    field public static int Theme_textAppearanceSmallPopupMenu;
-    field public static int Theme_textColorAlertDialogListItem;
-    field public static int Theme_textColorSearchUrl;
-    field public static int Theme_toolbarNavigationButtonStyle;
-    field public static int Theme_toolbarStyle;
-    field public static int Theme_windowActionBar;
-    field public static int Theme_windowActionBarOverlay;
-    field public static int Theme_windowActionModeOverlay;
-    field public static int Theme_windowFixedHeightMajor;
-    field public static int Theme_windowFixedHeightMinor;
-    field public static int Theme_windowFixedWidthMajor;
-    field public static int Theme_windowFixedWidthMinor;
-    field public static int Theme_windowMinWidthMajor;
-    field public static int Theme_windowMinWidthMinor;
-    field public static int Theme_windowNoTitle;
-    field public static final int[] Toolbar;
-    field public static int Toolbar_android_gravity;
-    field public static int Toolbar_android_minHeight;
-    field public static int Toolbar_collapseContentDescription;
-    field public static int Toolbar_collapseIcon;
-    field public static int Toolbar_contentInsetEnd;
-    field public static int Toolbar_contentInsetLeft;
-    field public static int Toolbar_contentInsetRight;
-    field public static int Toolbar_contentInsetStart;
-    field public static int Toolbar_logo;
-    field public static int Toolbar_logoDescription;
-    field public static int Toolbar_maxButtonHeight;
-    field public static int Toolbar_navigationContentDescription;
-    field public static int Toolbar_navigationIcon;
-    field public static int Toolbar_popupTheme;
-    field public static int Toolbar_subtitle;
-    field public static int Toolbar_subtitleTextAppearance;
-    field public static int Toolbar_subtitleTextColor;
-    field public static int Toolbar_title;
-    field public static int Toolbar_titleMarginBottom;
-    field public static int Toolbar_titleMarginEnd;
-    field public static int Toolbar_titleMarginStart;
-    field public static int Toolbar_titleMarginTop;
-    field public static int Toolbar_titleMargins;
-    field public static int Toolbar_titleTextAppearance;
-    field public static int Toolbar_titleTextColor;
-    field public static final int[] View;
-    field public static final int[] ViewBackgroundHelper;
-    field public static int ViewBackgroundHelper_android_background;
-    field public static int ViewBackgroundHelper_backgroundTint;
-    field public static int ViewBackgroundHelper_backgroundTintMode;
-    field public static final int[] ViewStubCompat;
-    field public static int ViewStubCompat_android_id;
-    field public static int ViewStubCompat_android_inflatedId;
-    field public static int ViewStubCompat_android_layout;
-    field public static int View_android_focusable;
-    field public static int View_android_theme;
-    field public static int View_paddingEnd;
-    field public static int View_paddingStart;
-    field public static int View_theme;
-  }
-
-}
-
-package android.support.v7.graphics.drawable {
-
-  public class DrawerArrowDrawable extends android.graphics.drawable.Drawable {
-    ctor public DrawerArrowDrawable(android.content.Context);
-    method public void draw(android.graphics.Canvas);
-    method public float getArrowHeadLength();
-    method public float getArrowShaftLength();
-    method public float getBarLength();
-    method public float getBarThickness();
-    method public int getColor();
-    method public int getDirection();
-    method public float getGapSize();
-    method public int getOpacity();
-    method public float getProgress();
-    method public boolean isSpinEnabled();
-    method public void setAlpha(int);
-    method public void setArrowHeadLength(float);
-    method public void setArrowShaftLength(float);
-    method public void setBarLength(float);
-    method public void setBarThickness(float);
-    method public void setColor(int);
-    method public void setColorFilter(android.graphics.ColorFilter);
-    method public void setDirection(int);
-    method public void setGapSize(float);
-    method public void setProgress(float);
-    method public void setSpinEnabled(boolean);
-    method public void setVerticalMirror(boolean);
-    field public static final int ARROW_DIRECTION_END = 3; // 0x3
-    field public static final int ARROW_DIRECTION_LEFT = 0; // 0x0
-    field public static final int ARROW_DIRECTION_RIGHT = 1; // 0x1
-    field public static final int ARROW_DIRECTION_START = 2; // 0x2
-  }
-
-}
-
-package android.support.v7.view {
-
-  public abstract class ActionMode {
-    ctor public ActionMode();
-    method public abstract void finish();
-    method public abstract android.view.View getCustomView();
-    method public abstract android.view.Menu getMenu();
-    method public abstract android.view.MenuInflater getMenuInflater();
-    method public abstract java.lang.CharSequence getSubtitle();
-    method public java.lang.Object getTag();
-    method public abstract java.lang.CharSequence getTitle();
-    method public boolean getTitleOptionalHint();
-    method public abstract void invalidate();
-    method public boolean isTitleOptional();
-    method public abstract void setCustomView(android.view.View);
-    method public abstract void setSubtitle(java.lang.CharSequence);
-    method public abstract void setSubtitle(int);
-    method public void setTag(java.lang.Object);
-    method public abstract void setTitle(java.lang.CharSequence);
-    method public abstract void setTitle(int);
-    method public void setTitleOptionalHint(boolean);
-  }
-
-  public static abstract interface ActionMode.Callback {
-    method public abstract boolean onActionItemClicked(android.support.v7.view.ActionMode, android.view.MenuItem);
-    method public abstract boolean onCreateActionMode(android.support.v7.view.ActionMode, android.view.Menu);
-    method public abstract void onDestroyActionMode(android.support.v7.view.ActionMode);
-    method public abstract boolean onPrepareActionMode(android.support.v7.view.ActionMode, android.view.Menu);
-  }
-
-  public abstract interface CollapsibleActionView {
-    method public abstract void onActionViewCollapsed();
-    method public abstract void onActionViewExpanded();
-  }
-
-}
-
-package android.support.v7.widget {
-
-  public class ActionMenuView extends android.support.v7.widget.LinearLayoutCompat {
-    ctor public ActionMenuView(android.content.Context);
-    ctor public ActionMenuView(android.content.Context, android.util.AttributeSet);
-    method public void dismissPopupMenus();
-    method public android.view.Menu getMenu();
-    method public android.graphics.drawable.Drawable getOverflowIcon();
-    method public int getPopupTheme();
-    method public boolean hideOverflowMenu();
-    method public boolean isOverflowMenuShowing();
-    method public void onConfigurationChanged(android.content.res.Configuration);
-    method public void onDetachedFromWindow();
-    method public void setOnMenuItemClickListener(android.support.v7.widget.ActionMenuView.OnMenuItemClickListener);
-    method public void setOverflowIcon(android.graphics.drawable.Drawable);
-    method public void setPopupTheme(int);
-    method public boolean showOverflowMenu();
-  }
-
-  public static class ActionMenuView.LayoutParams extends android.support.v7.widget.LinearLayoutCompat.LayoutParams {
-    ctor public ActionMenuView.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public ActionMenuView.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public ActionMenuView.LayoutParams(android.support.v7.widget.ActionMenuView.LayoutParams);
-    ctor public ActionMenuView.LayoutParams(int, int);
-    field public int cellsUsed;
-    field public boolean expandable;
-    field public int extraPixels;
-    field public boolean isOverflowButton;
-    field public boolean preventEdgeOffset;
-  }
-
-  public static abstract interface ActionMenuView.OnMenuItemClickListener {
-    method public abstract boolean onMenuItemClick(android.view.MenuItem);
-  }
-
-  public class AppCompatAutoCompleteTextView extends android.widget.AutoCompleteTextView {
-    ctor public AppCompatAutoCompleteTextView(android.content.Context);
-    ctor public AppCompatAutoCompleteTextView(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatAutoCompleteTextView(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class AppCompatButton extends android.widget.Button {
-    ctor public AppCompatButton(android.content.Context);
-    ctor public AppCompatButton(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatButton(android.content.Context, android.util.AttributeSet, int);
-    method public void setSupportAllCaps(boolean);
-  }
-
-  public class AppCompatCheckBox extends android.widget.CheckBox {
-    ctor public AppCompatCheckBox(android.content.Context);
-    ctor public AppCompatCheckBox(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatCheckBox(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class AppCompatCheckedTextView extends android.widget.CheckedTextView {
-    ctor public AppCompatCheckedTextView(android.content.Context);
-    ctor public AppCompatCheckedTextView(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatCheckedTextView(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class AppCompatEditText extends android.widget.EditText {
-    ctor public AppCompatEditText(android.content.Context);
-    ctor public AppCompatEditText(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatEditText(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class AppCompatMultiAutoCompleteTextView extends android.widget.MultiAutoCompleteTextView {
-    ctor public AppCompatMultiAutoCompleteTextView(android.content.Context);
-    ctor public AppCompatMultiAutoCompleteTextView(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatMultiAutoCompleteTextView(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class AppCompatRadioButton extends android.widget.RadioButton {
-    ctor public AppCompatRadioButton(android.content.Context);
-    ctor public AppCompatRadioButton(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatRadioButton(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class AppCompatRatingBar extends android.widget.RatingBar {
-    ctor public AppCompatRatingBar(android.content.Context);
-    ctor public AppCompatRatingBar(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatRatingBar(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class AppCompatSpinner extends android.widget.Spinner {
-    ctor public AppCompatSpinner(android.content.Context);
-    ctor public AppCompatSpinner(android.content.Context, int);
-    ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet, int);
-    ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet, int, int);
-    ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet, int, int, android.content.res.Resources.Theme);
-  }
-
-  public class AppCompatTextView extends android.widget.TextView {
-    ctor public AppCompatTextView(android.content.Context);
-    ctor public AppCompatTextView(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatTextView(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class LinearLayoutCompat extends android.view.ViewGroup {
-    ctor public LinearLayoutCompat(android.content.Context);
-    ctor public LinearLayoutCompat(android.content.Context, android.util.AttributeSet);
-    ctor public LinearLayoutCompat(android.content.Context, android.util.AttributeSet, int);
-    method public int getBaselineAlignedChildIndex();
-    method public android.graphics.drawable.Drawable getDividerDrawable();
-    method public int getDividerPadding();
-    method public int getOrientation();
-    method public int getShowDividers();
-    method public float getWeightSum();
-    method public boolean isBaselineAligned();
-    method public boolean isMeasureWithLargestChildEnabled();
-    method protected void onLayout(boolean, int, int, int, int);
-    method public void setBaselineAligned(boolean);
-    method public void setBaselineAlignedChildIndex(int);
-    method public void setDividerDrawable(android.graphics.drawable.Drawable);
-    method public void setDividerPadding(int);
-    method public void setGravity(int);
-    method public void setHorizontalGravity(int);
-    method public void setMeasureWithLargestChildEnabled(boolean);
-    method public void setOrientation(int);
-    method public void setShowDividers(int);
-    method public void setVerticalGravity(int);
-    method public void setWeightSum(float);
-    field public static final int HORIZONTAL = 0; // 0x0
-    field public static final int SHOW_DIVIDER_BEGINNING = 1; // 0x1
-    field public static final int SHOW_DIVIDER_END = 4; // 0x4
-    field public static final int SHOW_DIVIDER_MIDDLE = 2; // 0x2
-    field public static final int SHOW_DIVIDER_NONE = 0; // 0x0
-    field public static final int VERTICAL = 1; // 0x1
-  }
-
-  public static class LinearLayoutCompat.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
-    ctor public LinearLayoutCompat.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public LinearLayoutCompat.LayoutParams(int, int);
-    ctor public LinearLayoutCompat.LayoutParams(int, int, float);
-    ctor public LinearLayoutCompat.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public LinearLayoutCompat.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public LinearLayoutCompat.LayoutParams(android.support.v7.widget.LinearLayoutCompat.LayoutParams);
-    field public int gravity;
-    field public float weight;
-  }
-
-  public class ListPopupWindow {
-    ctor public ListPopupWindow(android.content.Context);
-    ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet);
-    ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet, int);
-    ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet, int, int);
-    method public void clearListSelection();
-    method public android.view.View.OnTouchListener createDragToOpenListener(android.view.View);
-    method public void dismiss();
-    method public android.view.View getAnchorView();
-    method public int getAnimationStyle();
-    method public android.graphics.drawable.Drawable getBackground();
-    method public int getHeight();
-    method public int getHorizontalOffset();
-    method public int getInputMethodMode();
-    method public android.widget.ListView getListView();
-    method public int getPromptPosition();
-    method public java.lang.Object getSelectedItem();
-    method public long getSelectedItemId();
-    method public int getSelectedItemPosition();
-    method public android.view.View getSelectedView();
-    method public int getSoftInputMode();
-    method public int getVerticalOffset();
-    method public int getWidth();
-    method public boolean isInputMethodNotNeeded();
-    method public boolean isModal();
-    method public boolean isShowing();
-    method public boolean onKeyDown(int, android.view.KeyEvent);
-    method public boolean onKeyPreIme(int, android.view.KeyEvent);
-    method public boolean onKeyUp(int, android.view.KeyEvent);
-    method public boolean performItemClick(int);
-    method public void postShow();
-    method public void setAdapter(android.widget.ListAdapter);
-    method public void setAnchorView(android.view.View);
-    method public void setAnimationStyle(int);
-    method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
-    method public void setContentWidth(int);
-    method public void setDropDownGravity(int);
-    method public void setHeight(int);
-    method public void setHorizontalOffset(int);
-    method public void setInputMethodMode(int);
-    method public void setListSelector(android.graphics.drawable.Drawable);
-    method public void setModal(boolean);
-    method public void setOnDismissListener(android.widget.PopupWindow.OnDismissListener);
-    method public void setOnItemClickListener(android.widget.AdapterView.OnItemClickListener);
-    method public void setOnItemSelectedListener(android.widget.AdapterView.OnItemSelectedListener);
-    method public void setPromptPosition(int);
-    method public void setPromptView(android.view.View);
-    method public void setSelection(int);
-    method public void setSoftInputMode(int);
-    method public void setVerticalOffset(int);
-    method public void setWidth(int);
-    method public void show();
-    field public static final int INPUT_METHOD_FROM_FOCUSABLE = 0; // 0x0
-    field public static final int INPUT_METHOD_NEEDED = 1; // 0x1
-    field public static final int INPUT_METHOD_NOT_NEEDED = 2; // 0x2
-    field public static final int MATCH_PARENT = -1; // 0xffffffff
-    field public static final int POSITION_PROMPT_ABOVE = 0; // 0x0
-    field public static final int POSITION_PROMPT_BELOW = 1; // 0x1
-    field public static final int WRAP_CONTENT = -2; // 0xfffffffe
-  }
-
-  public class PopupMenu {
-    ctor public PopupMenu(android.content.Context, android.view.View);
-    ctor public PopupMenu(android.content.Context, android.view.View, int);
-    ctor public PopupMenu(android.content.Context, android.view.View, int, int, int);
-    method public void dismiss();
-    method public android.view.View.OnTouchListener getDragToOpenListener();
-    method public int getGravity();
-    method public android.view.Menu getMenu();
-    method public android.view.MenuInflater getMenuInflater();
-    method public void inflate(int);
-    method public void setGravity(int);
-    method public void setOnDismissListener(android.support.v7.widget.PopupMenu.OnDismissListener);
-    method public void setOnMenuItemClickListener(android.support.v7.widget.PopupMenu.OnMenuItemClickListener);
-    method public void show();
-  }
-
-  public static abstract interface PopupMenu.OnDismissListener {
-    method public abstract void onDismiss(android.support.v7.widget.PopupMenu);
-  }
-
-  public static abstract interface PopupMenu.OnMenuItemClickListener {
-    method public abstract boolean onMenuItemClick(android.view.MenuItem);
-  }
-
-  public class SearchView extends android.support.v7.widget.LinearLayoutCompat implements android.support.v7.view.CollapsibleActionView {
-    ctor public SearchView(android.content.Context);
-    ctor public SearchView(android.content.Context, android.util.AttributeSet);
-    ctor public SearchView(android.content.Context, android.util.AttributeSet, int);
-    method public int getImeOptions();
-    method public int getInputType();
-    method public int getMaxWidth();
-    method public java.lang.CharSequence getQuery();
-    method public java.lang.CharSequence getQueryHint();
-    method public android.support.v4.widget.CursorAdapter getSuggestionsAdapter();
-    method public boolean isIconfiedByDefault();
-    method public boolean isIconified();
-    method public boolean isQueryRefinementEnabled();
-    method public boolean isSubmitButtonEnabled();
-    method public void onActionViewCollapsed();
-    method public void onActionViewExpanded();
-    method public void setIconified(boolean);
-    method public void setIconifiedByDefault(boolean);
-    method public void setImeOptions(int);
-    method public void setInputType(int);
-    method public void setMaxWidth(int);
-    method public void setOnCloseListener(android.support.v7.widget.SearchView.OnCloseListener);
-    method public void setOnQueryTextFocusChangeListener(android.view.View.OnFocusChangeListener);
-    method public void setOnQueryTextListener(android.support.v7.widget.SearchView.OnQueryTextListener);
-    method public void setOnSearchClickListener(android.view.View.OnClickListener);
-    method public void setOnSuggestionListener(android.support.v7.widget.SearchView.OnSuggestionListener);
-    method public void setQuery(java.lang.CharSequence, boolean);
-    method public void setQueryHint(java.lang.CharSequence);
-    method public void setQueryRefinementEnabled(boolean);
-    method public void setSearchableInfo(android.app.SearchableInfo);
-    method public void setSubmitButtonEnabled(boolean);
-    method public void setSuggestionsAdapter(android.support.v4.widget.CursorAdapter);
-  }
-
-  public static abstract interface SearchView.OnCloseListener {
-    method public abstract boolean onClose();
-  }
-
-  public static abstract interface SearchView.OnQueryTextListener {
-    method public abstract boolean onQueryTextChange(java.lang.String);
-    method public abstract boolean onQueryTextSubmit(java.lang.String);
-  }
-
-  public static abstract interface SearchView.OnSuggestionListener {
-    method public abstract boolean onSuggestionClick(int);
-    method public abstract boolean onSuggestionSelect(int);
-  }
-
-  public class ShareActionProvider extends android.support.v4.view.ActionProvider {
-    ctor public ShareActionProvider(android.content.Context);
-    method public android.view.View onCreateActionView();
-    method public void setOnShareTargetSelectedListener(android.support.v7.widget.ShareActionProvider.OnShareTargetSelectedListener);
-    method public void setShareHistoryFileName(java.lang.String);
-    method public void setShareIntent(android.content.Intent);
-    field public static final java.lang.String DEFAULT_SHARE_HISTORY_FILE_NAME = "share_history.xml";
-  }
-
-  public static abstract interface ShareActionProvider.OnShareTargetSelectedListener {
-    method public abstract boolean onShareTargetSelected(android.support.v7.widget.ShareActionProvider, android.content.Intent);
-  }
-
-  public class SwitchCompat extends android.widget.CompoundButton {
-    ctor public SwitchCompat(android.content.Context);
-    ctor public SwitchCompat(android.content.Context, android.util.AttributeSet);
-    ctor public SwitchCompat(android.content.Context, android.util.AttributeSet, int);
-    method public boolean getShowText();
-    method public boolean getSplitTrack();
-    method public int getSwitchMinWidth();
-    method public int getSwitchPadding();
-    method public java.lang.CharSequence getTextOff();
-    method public java.lang.CharSequence getTextOn();
-    method public android.graphics.drawable.Drawable getThumbDrawable();
-    method public int getThumbTextPadding();
-    method public android.graphics.drawable.Drawable getTrackDrawable();
-    method public void onMeasure(int, int);
-    method public void setShowText(boolean);
-    method public void setSplitTrack(boolean);
-    method public void setSwitchMinWidth(int);
-    method public void setSwitchPadding(int);
-    method public void setSwitchTextAppearance(android.content.Context, int);
-    method public void setSwitchTypeface(android.graphics.Typeface, int);
-    method public void setSwitchTypeface(android.graphics.Typeface);
-    method public void setTextOff(java.lang.CharSequence);
-    method public void setTextOn(java.lang.CharSequence);
-    method public void setThumbDrawable(android.graphics.drawable.Drawable);
-    method public void setThumbResource(int);
-    method public void setThumbTextPadding(int);
-    method public void setTrackDrawable(android.graphics.drawable.Drawable);
-    method public void setTrackResource(int);
-  }
-
-  public abstract interface ThemedSpinnerAdapter implements android.widget.SpinnerAdapter {
-    method public abstract android.content.res.Resources.Theme getDropDownViewTheme();
-    method public abstract void setDropDownViewTheme(android.content.res.Resources.Theme);
-  }
-
-  public static final class ThemedSpinnerAdapter.Helper {
-    ctor public ThemedSpinnerAdapter.Helper(android.content.Context);
-    method public android.view.LayoutInflater getDropDownViewInflater();
-    method public android.content.res.Resources.Theme getDropDownViewTheme();
-    method public void setDropDownViewTheme(android.content.res.Resources.Theme);
-  }
-
-  public class Toolbar extends android.view.ViewGroup {
-    ctor public Toolbar(android.content.Context);
-    ctor public Toolbar(android.content.Context, android.util.AttributeSet);
-    ctor public Toolbar(android.content.Context, android.util.AttributeSet, int);
-    method public void collapseActionView();
-    method public void dismissPopupMenus();
-    method public int getContentInsetEnd();
-    method public int getContentInsetLeft();
-    method public int getContentInsetRight();
-    method public int getContentInsetStart();
-    method public android.graphics.drawable.Drawable getLogo();
-    method public java.lang.CharSequence getLogoDescription();
-    method public android.view.Menu getMenu();
-    method public java.lang.CharSequence getNavigationContentDescription();
-    method public android.graphics.drawable.Drawable getNavigationIcon();
-    method public android.graphics.drawable.Drawable getOverflowIcon();
-    method public int getPopupTheme();
-    method public java.lang.CharSequence getSubtitle();
-    method public java.lang.CharSequence getTitle();
-    method public boolean hasExpandedActionView();
-    method public boolean hideOverflowMenu();
-    method public void inflateMenu(int);
-    method public boolean isOverflowMenuShowing();
-    method protected void onLayout(boolean, int, int, int, int);
-    method public void setContentInsetsAbsolute(int, int);
-    method public void setContentInsetsRelative(int, int);
-    method public void setLogo(int);
-    method public void setLogo(android.graphics.drawable.Drawable);
-    method public void setLogoDescription(int);
-    method public void setLogoDescription(java.lang.CharSequence);
-    method public void setNavigationContentDescription(int);
-    method public void setNavigationContentDescription(java.lang.CharSequence);
-    method public void setNavigationIcon(int);
-    method public void setNavigationIcon(android.graphics.drawable.Drawable);
-    method public void setNavigationOnClickListener(android.view.View.OnClickListener);
-    method public void setOnMenuItemClickListener(android.support.v7.widget.Toolbar.OnMenuItemClickListener);
-    method public void setOverflowIcon(android.graphics.drawable.Drawable);
-    method public void setPopupTheme(int);
-    method public void setSubtitle(int);
-    method public void setSubtitle(java.lang.CharSequence);
-    method public void setSubtitleTextAppearance(android.content.Context, int);
-    method public void setSubtitleTextColor(int);
-    method public void setTitle(int);
-    method public void setTitle(java.lang.CharSequence);
-    method public void setTitleTextAppearance(android.content.Context, int);
-    method public void setTitleTextColor(int);
-    method public boolean showOverflowMenu();
-  }
-
-  public static class Toolbar.LayoutParams extends android.support.v7.app.ActionBar.LayoutParams {
-    ctor public Toolbar.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public Toolbar.LayoutParams(int, int);
-    ctor public Toolbar.LayoutParams(int, int, int);
-    ctor public Toolbar.LayoutParams(int);
-    ctor public Toolbar.LayoutParams(android.support.v7.widget.Toolbar.LayoutParams);
-    ctor public Toolbar.LayoutParams(android.support.v7.app.ActionBar.LayoutParams);
-    ctor public Toolbar.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public Toolbar.LayoutParams(android.view.ViewGroup.LayoutParams);
-  }
-
-  public static abstract interface Toolbar.OnMenuItemClickListener {
-    method public abstract boolean onMenuItemClick(android.view.MenuItem);
-  }
-
-  public static class Toolbar.SavedState extends android.view.View.BaseSavedState {
-    ctor public Toolbar.SavedState(android.os.Parcel);
-    ctor public Toolbar.SavedState(android.os.Parcelable);
-    field public static final android.os.Parcelable.Creator<android.support.v7.widget.Toolbar.SavedState> CREATOR;
-  }
-
-}
-
diff --git a/v7/appcompat/api/23.1.0.txt b/v7/appcompat/api/23.1.0.txt
deleted file mode 100644
index 2df0ec0..0000000
--- a/v7/appcompat/api/23.1.0.txt
+++ /dev/null
@@ -1,2081 +0,0 @@
-package android.support.v7.app {
-
-  public abstract class ActionBar {
-    ctor public ActionBar();
-    method public abstract void addOnMenuVisibilityListener(android.support.v7.app.ActionBar.OnMenuVisibilityListener);
-    method public abstract deprecated void addTab(android.support.v7.app.ActionBar.Tab);
-    method public abstract deprecated void addTab(android.support.v7.app.ActionBar.Tab, boolean);
-    method public abstract deprecated void addTab(android.support.v7.app.ActionBar.Tab, int);
-    method public abstract deprecated void addTab(android.support.v7.app.ActionBar.Tab, int, boolean);
-    method public abstract android.view.View getCustomView();
-    method public abstract int getDisplayOptions();
-    method public float getElevation();
-    method public abstract int getHeight();
-    method public int getHideOffset();
-    method public abstract deprecated int getNavigationItemCount();
-    method public abstract deprecated int getNavigationMode();
-    method public abstract deprecated int getSelectedNavigationIndex();
-    method public abstract deprecated android.support.v7.app.ActionBar.Tab getSelectedTab();
-    method public abstract java.lang.CharSequence getSubtitle();
-    method public abstract deprecated android.support.v7.app.ActionBar.Tab getTabAt(int);
-    method public abstract deprecated int getTabCount();
-    method public android.content.Context getThemedContext();
-    method public abstract java.lang.CharSequence getTitle();
-    method public abstract void hide();
-    method public boolean isHideOnContentScrollEnabled();
-    method public abstract boolean isShowing();
-    method public abstract deprecated android.support.v7.app.ActionBar.Tab newTab();
-    method public abstract deprecated void removeAllTabs();
-    method public abstract void removeOnMenuVisibilityListener(android.support.v7.app.ActionBar.OnMenuVisibilityListener);
-    method public abstract deprecated void removeTab(android.support.v7.app.ActionBar.Tab);
-    method public abstract deprecated void removeTabAt(int);
-    method public abstract deprecated void selectTab(android.support.v7.app.ActionBar.Tab);
-    method public abstract void setBackgroundDrawable(android.graphics.drawable.Drawable);
-    method public abstract void setCustomView(android.view.View);
-    method public abstract void setCustomView(android.view.View, android.support.v7.app.ActionBar.LayoutParams);
-    method public abstract void setCustomView(int);
-    method public abstract void setDisplayHomeAsUpEnabled(boolean);
-    method public abstract void setDisplayOptions(int);
-    method public abstract void setDisplayOptions(int, int);
-    method public abstract void setDisplayShowCustomEnabled(boolean);
-    method public abstract void setDisplayShowHomeEnabled(boolean);
-    method public abstract void setDisplayShowTitleEnabled(boolean);
-    method public abstract void setDisplayUseLogoEnabled(boolean);
-    method public void setElevation(float);
-    method public void setHideOffset(int);
-    method public void setHideOnContentScrollEnabled(boolean);
-    method public void setHomeActionContentDescription(java.lang.CharSequence);
-    method public void setHomeActionContentDescription(int);
-    method public void setHomeAsUpIndicator(android.graphics.drawable.Drawable);
-    method public void setHomeAsUpIndicator(int);
-    method public void setHomeButtonEnabled(boolean);
-    method public abstract void setIcon(int);
-    method public abstract void setIcon(android.graphics.drawable.Drawable);
-    method public abstract deprecated void setListNavigationCallbacks(android.widget.SpinnerAdapter, android.support.v7.app.ActionBar.OnNavigationListener);
-    method public abstract void setLogo(int);
-    method public abstract void setLogo(android.graphics.drawable.Drawable);
-    method public abstract deprecated void setNavigationMode(int);
-    method public abstract deprecated void setSelectedNavigationItem(int);
-    method public void setSplitBackgroundDrawable(android.graphics.drawable.Drawable);
-    method public void setStackedBackgroundDrawable(android.graphics.drawable.Drawable);
-    method public abstract void setSubtitle(java.lang.CharSequence);
-    method public abstract void setSubtitle(int);
-    method public abstract void setTitle(java.lang.CharSequence);
-    method public abstract void setTitle(int);
-    method public abstract void show();
-    field public static final int DISPLAY_HOME_AS_UP = 4; // 0x4
-    field public static final int DISPLAY_SHOW_CUSTOM = 16; // 0x10
-    field public static final int DISPLAY_SHOW_HOME = 2; // 0x2
-    field public static final int DISPLAY_SHOW_TITLE = 8; // 0x8
-    field public static final int DISPLAY_USE_LOGO = 1; // 0x1
-    field public static final deprecated int NAVIGATION_MODE_LIST = 1; // 0x1
-    field public static final deprecated int NAVIGATION_MODE_STANDARD = 0; // 0x0
-    field public static final deprecated int NAVIGATION_MODE_TABS = 2; // 0x2
-  }
-
-  public static class ActionBar.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
-    ctor public ActionBar.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public ActionBar.LayoutParams(int, int);
-    ctor public ActionBar.LayoutParams(int, int, int);
-    ctor public ActionBar.LayoutParams(int);
-    ctor public ActionBar.LayoutParams(android.support.v7.app.ActionBar.LayoutParams);
-    ctor public ActionBar.LayoutParams(android.view.ViewGroup.LayoutParams);
-    field public int gravity;
-  }
-
-  public static abstract interface ActionBar.OnMenuVisibilityListener {
-    method public abstract void onMenuVisibilityChanged(boolean);
-  }
-
-  public static abstract deprecated interface ActionBar.OnNavigationListener {
-    method public abstract boolean onNavigationItemSelected(int, long);
-  }
-
-  public static abstract deprecated class ActionBar.Tab {
-    ctor public ActionBar.Tab();
-    method public abstract java.lang.CharSequence getContentDescription();
-    method public abstract android.view.View getCustomView();
-    method public abstract android.graphics.drawable.Drawable getIcon();
-    method public abstract int getPosition();
-    method public abstract java.lang.Object getTag();
-    method public abstract java.lang.CharSequence getText();
-    method public abstract void select();
-    method public abstract android.support.v7.app.ActionBar.Tab setContentDescription(int);
-    method public abstract android.support.v7.app.ActionBar.Tab setContentDescription(java.lang.CharSequence);
-    method public abstract android.support.v7.app.ActionBar.Tab setCustomView(android.view.View);
-    method public abstract android.support.v7.app.ActionBar.Tab setCustomView(int);
-    method public abstract android.support.v7.app.ActionBar.Tab setIcon(android.graphics.drawable.Drawable);
-    method public abstract android.support.v7.app.ActionBar.Tab setIcon(int);
-    method public abstract android.support.v7.app.ActionBar.Tab setTabListener(android.support.v7.app.ActionBar.TabListener);
-    method public abstract android.support.v7.app.ActionBar.Tab setTag(java.lang.Object);
-    method public abstract android.support.v7.app.ActionBar.Tab setText(java.lang.CharSequence);
-    method public abstract android.support.v7.app.ActionBar.Tab setText(int);
-    field public static final int INVALID_POSITION = -1; // 0xffffffff
-  }
-
-  public static abstract deprecated interface ActionBar.TabListener {
-    method public abstract void onTabReselected(android.support.v7.app.ActionBar.Tab, android.support.v4.app.FragmentTransaction);
-    method public abstract void onTabSelected(android.support.v7.app.ActionBar.Tab, android.support.v4.app.FragmentTransaction);
-    method public abstract void onTabUnselected(android.support.v7.app.ActionBar.Tab, android.support.v4.app.FragmentTransaction);
-  }
-
-  public deprecated class ActionBarActivity extends android.support.v7.app.AppCompatActivity {
-    ctor public ActionBarActivity();
-  }
-
-  public class ActionBarDrawerToggle implements android.support.v4.widget.DrawerLayout.DrawerListener {
-    ctor public ActionBarDrawerToggle(android.app.Activity, android.support.v4.widget.DrawerLayout, int, int);
-    ctor public ActionBarDrawerToggle(android.app.Activity, android.support.v4.widget.DrawerLayout, android.support.v7.widget.Toolbar, int, int);
-    method public android.view.View.OnClickListener getToolbarNavigationClickListener();
-    method public boolean isDrawerIndicatorEnabled();
-    method public void onConfigurationChanged(android.content.res.Configuration);
-    method public void onDrawerClosed(android.view.View);
-    method public void onDrawerOpened(android.view.View);
-    method public void onDrawerSlide(android.view.View, float);
-    method public void onDrawerStateChanged(int);
-    method public boolean onOptionsItemSelected(android.view.MenuItem);
-    method public void setDrawerIndicatorEnabled(boolean);
-    method public void setHomeAsUpIndicator(android.graphics.drawable.Drawable);
-    method public void setHomeAsUpIndicator(int);
-    method public void setToolbarNavigationClickListener(android.view.View.OnClickListener);
-    method public void syncState();
-  }
-
-  public static abstract interface ActionBarDrawerToggle.Delegate {
-    method public abstract android.content.Context getActionBarThemedContext();
-    method public abstract android.graphics.drawable.Drawable getThemeUpIndicator();
-    method public abstract boolean isNavigationVisible();
-    method public abstract void setActionBarDescription(int);
-    method public abstract void setActionBarUpIndicator(android.graphics.drawable.Drawable, int);
-  }
-
-  public static abstract interface ActionBarDrawerToggle.DelegateProvider {
-    method public abstract android.support.v7.app.ActionBarDrawerToggle.Delegate getDrawerToggleDelegate();
-  }
-
-  public class AlertDialog extends android.support.v7.app.AppCompatDialog implements android.content.DialogInterface {
-    ctor protected AlertDialog(android.content.Context);
-    ctor protected AlertDialog(android.content.Context, int);
-    ctor protected AlertDialog(android.content.Context, boolean, android.content.DialogInterface.OnCancelListener);
-    method public android.widget.Button getButton(int);
-    method public android.widget.ListView getListView();
-    method public void setButton(int, java.lang.CharSequence, android.os.Message);
-    method public void setButton(int, java.lang.CharSequence, android.content.DialogInterface.OnClickListener);
-    method public void setCustomTitle(android.view.View);
-    method public void setIcon(int);
-    method public void setIcon(android.graphics.drawable.Drawable);
-    method public void setIconAttribute(int);
-    method public void setMessage(java.lang.CharSequence);
-    method public void setView(android.view.View);
-    method public void setView(android.view.View, int, int, int, int);
-  }
-
-  public static class AlertDialog.Builder {
-    ctor public AlertDialog.Builder(android.content.Context);
-    ctor public AlertDialog.Builder(android.content.Context, int);
-    method public android.support.v7.app.AlertDialog create();
-    method public android.content.Context getContext();
-    method public android.support.v7.app.AlertDialog.Builder setAdapter(android.widget.ListAdapter, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setCancelable(boolean);
-    method public android.support.v7.app.AlertDialog.Builder setCursor(android.database.Cursor, android.content.DialogInterface.OnClickListener, java.lang.String);
-    method public android.support.v7.app.AlertDialog.Builder setCustomTitle(android.view.View);
-    method public android.support.v7.app.AlertDialog.Builder setIcon(int);
-    method public android.support.v7.app.AlertDialog.Builder setIcon(android.graphics.drawable.Drawable);
-    method public android.support.v7.app.AlertDialog.Builder setIconAttribute(int);
-    method public android.support.v7.app.AlertDialog.Builder setInverseBackgroundForced(boolean);
-    method public android.support.v7.app.AlertDialog.Builder setItems(int, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setItems(java.lang.CharSequence[], android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setMessage(int);
-    method public android.support.v7.app.AlertDialog.Builder setMessage(java.lang.CharSequence);
-    method public android.support.v7.app.AlertDialog.Builder setMultiChoiceItems(int, boolean[], android.content.DialogInterface.OnMultiChoiceClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setMultiChoiceItems(java.lang.CharSequence[], boolean[], android.content.DialogInterface.OnMultiChoiceClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setMultiChoiceItems(android.database.Cursor, java.lang.String, java.lang.String, android.content.DialogInterface.OnMultiChoiceClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setNegativeButton(int, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setNegativeButton(java.lang.CharSequence, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setNeutralButton(int, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setNeutralButton(java.lang.CharSequence, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setOnCancelListener(android.content.DialogInterface.OnCancelListener);
-    method public android.support.v7.app.AlertDialog.Builder setOnDismissListener(android.content.DialogInterface.OnDismissListener);
-    method public android.support.v7.app.AlertDialog.Builder setOnItemSelectedListener(android.widget.AdapterView.OnItemSelectedListener);
-    method public android.support.v7.app.AlertDialog.Builder setOnKeyListener(android.content.DialogInterface.OnKeyListener);
-    method public android.support.v7.app.AlertDialog.Builder setPositiveButton(int, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setPositiveButton(java.lang.CharSequence, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setSingleChoiceItems(int, int, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setSingleChoiceItems(android.database.Cursor, int, java.lang.String, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setSingleChoiceItems(java.lang.CharSequence[], int, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setSingleChoiceItems(android.widget.ListAdapter, int, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setTitle(int);
-    method public android.support.v7.app.AlertDialog.Builder setTitle(java.lang.CharSequence);
-    method public android.support.v7.app.AlertDialog.Builder setView(int);
-    method public android.support.v7.app.AlertDialog.Builder setView(android.view.View);
-    method public android.support.v7.app.AlertDialog show();
-  }
-
-  public class AppCompatActivity extends android.support.v4.app.FragmentActivity implements android.support.v7.app.ActionBarDrawerToggle.DelegateProvider android.support.v7.app.AppCompatCallback {
-    ctor public AppCompatActivity();
-    method public android.support.v7.app.AppCompatDelegate getDelegate();
-    method public android.support.v7.app.ActionBarDrawerToggle.Delegate getDrawerToggleDelegate();
-    method public android.support.v7.app.ActionBar getSupportActionBar();
-    method public android.content.Intent getSupportParentActivityIntent();
-    method public void onCreateSupportNavigateUpTaskStack(android.support.v4.app.TaskStackBuilder);
-    method public final boolean onMenuItemSelected(int, android.view.MenuItem);
-    method public void onPrepareSupportNavigateUpTaskStack(android.support.v4.app.TaskStackBuilder);
-    method public void onSupportActionModeFinished(android.support.v7.view.ActionMode);
-    method public void onSupportActionModeStarted(android.support.v7.view.ActionMode);
-    method public deprecated void onSupportContentChanged();
-    method public boolean onSupportNavigateUp();
-    method public android.support.v7.view.ActionMode onWindowStartingSupportActionMode(android.support.v7.view.ActionMode.Callback);
-    method public void setSupportActionBar(android.support.v7.widget.Toolbar);
-    method public deprecated void setSupportProgress(int);
-    method public deprecated void setSupportProgressBarIndeterminate(boolean);
-    method public deprecated void setSupportProgressBarIndeterminateVisibility(boolean);
-    method public deprecated void setSupportProgressBarVisibility(boolean);
-    method public android.support.v7.view.ActionMode startSupportActionMode(android.support.v7.view.ActionMode.Callback);
-    method public void supportNavigateUpTo(android.content.Intent);
-    method public boolean supportRequestWindowFeature(int);
-    method public boolean supportShouldUpRecreateTask(android.content.Intent);
-  }
-
-  public abstract interface AppCompatCallback {
-    method public abstract void onSupportActionModeFinished(android.support.v7.view.ActionMode);
-    method public abstract void onSupportActionModeStarted(android.support.v7.view.ActionMode);
-    method public abstract android.support.v7.view.ActionMode onWindowStartingSupportActionMode(android.support.v7.view.ActionMode.Callback);
-  }
-
-  public abstract class AppCompatDelegate {
-    method public abstract void addContentView(android.view.View, android.view.ViewGroup.LayoutParams);
-    method public static android.support.v7.app.AppCompatDelegate create(android.app.Activity, android.support.v7.app.AppCompatCallback);
-    method public static android.support.v7.app.AppCompatDelegate create(android.app.Dialog, android.support.v7.app.AppCompatCallback);
-    method public abstract android.view.View createView(android.view.View, java.lang.String, android.content.Context, android.util.AttributeSet);
-    method public abstract android.support.v7.app.ActionBarDrawerToggle.Delegate getDrawerToggleDelegate();
-    method public abstract android.view.MenuInflater getMenuInflater();
-    method public abstract android.support.v7.app.ActionBar getSupportActionBar();
-    method public abstract boolean hasWindowFeature(int);
-    method public abstract void installViewFactory();
-    method public abstract void invalidateOptionsMenu();
-    method public abstract boolean isHandleNativeActionModesEnabled();
-    method public abstract void onConfigurationChanged(android.content.res.Configuration);
-    method public abstract void onCreate(android.os.Bundle);
-    method public abstract void onDestroy();
-    method public abstract void onPostCreate(android.os.Bundle);
-    method public abstract void onPostResume();
-    method public abstract void onStop();
-    method public abstract boolean requestWindowFeature(int);
-    method public abstract void setContentView(android.view.View);
-    method public abstract void setContentView(int);
-    method public abstract void setContentView(android.view.View, android.view.ViewGroup.LayoutParams);
-    method public abstract void setHandleNativeActionModesEnabled(boolean);
-    method public abstract void setSupportActionBar(android.support.v7.widget.Toolbar);
-    method public abstract void setTitle(java.lang.CharSequence);
-    method public abstract android.support.v7.view.ActionMode startSupportActionMode(android.support.v7.view.ActionMode.Callback);
-    field public static final int FEATURE_ACTION_MODE_OVERLAY = 10; // 0xa
-    field public static final int FEATURE_SUPPORT_ACTION_BAR = 108; // 0x6c
-    field public static final int FEATURE_SUPPORT_ACTION_BAR_OVERLAY = 109; // 0x6d
-  }
-
-  public class AppCompatDialog extends android.app.Dialog implements android.support.v7.app.AppCompatCallback {
-    ctor public AppCompatDialog(android.content.Context);
-    ctor public AppCompatDialog(android.content.Context, int);
-    ctor protected AppCompatDialog(android.content.Context, boolean, android.content.DialogInterface.OnCancelListener);
-    method public android.support.v7.app.AppCompatDelegate getDelegate();
-    method public android.support.v7.app.ActionBar getSupportActionBar();
-    method public void onSupportActionModeFinished(android.support.v7.view.ActionMode);
-    method public void onSupportActionModeStarted(android.support.v7.view.ActionMode);
-    method public android.support.v7.view.ActionMode onWindowStartingSupportActionMode(android.support.v7.view.ActionMode.Callback);
-    method public boolean supportRequestWindowFeature(int);
-  }
-
-  public class AppCompatDialogFragment extends android.support.v4.app.DialogFragment {
-    ctor public AppCompatDialogFragment();
-  }
-
-  public class NotificationCompat extends android.support.v4.app.NotificationCompat {
-    ctor public NotificationCompat();
-  }
-
-  public static class NotificationCompat.Builder extends android.support.v4.app.NotificationCompat.Builder {
-    ctor public NotificationCompat.Builder(android.content.Context);
-  }
-
-  public static class NotificationCompat.MediaStyle extends android.support.v4.app.NotificationCompat.Style {
-    ctor public NotificationCompat.MediaStyle();
-    ctor public NotificationCompat.MediaStyle(android.support.v4.app.NotificationCompat.Builder);
-    method public android.support.v7.app.NotificationCompat.MediaStyle setCancelButtonIntent(android.app.PendingIntent);
-    method public android.support.v7.app.NotificationCompat.MediaStyle setMediaSession(android.support.v4.media.session.MediaSessionCompat.Token);
-    method public android.support.v7.app.NotificationCompat.MediaStyle setShowActionsInCompactView(int...);
-    method public android.support.v7.app.NotificationCompat.MediaStyle setShowCancelButton(boolean);
-  }
-
-}
-
-package android.support.v7.appcompat {
-
-  public final class R {
-    ctor public R();
-  }
-
-  public static final class R.anim {
-    ctor public R.anim();
-    field public static int abc_fade_in;
-    field public static int abc_fade_out;
-    field public static int abc_grow_fade_in_from_bottom;
-    field public static int abc_popup_enter;
-    field public static int abc_popup_exit;
-    field public static int abc_shrink_fade_out_from_bottom;
-    field public static int abc_slide_in_bottom;
-    field public static int abc_slide_in_top;
-    field public static int abc_slide_out_bottom;
-    field public static int abc_slide_out_top;
-  }
-
-  public static final class R.attr {
-    ctor public R.attr();
-    field public static int actionBarDivider;
-    field public static int actionBarItemBackground;
-    field public static int actionBarPopupTheme;
-    field public static int actionBarSize;
-    field public static int actionBarSplitStyle;
-    field public static int actionBarStyle;
-    field public static int actionBarTabBarStyle;
-    field public static int actionBarTabStyle;
-    field public static int actionBarTabTextStyle;
-    field public static int actionBarTheme;
-    field public static int actionBarWidgetTheme;
-    field public static int actionButtonStyle;
-    field public static int actionDropDownStyle;
-    field public static int actionLayout;
-    field public static int actionMenuTextAppearance;
-    field public static int actionMenuTextColor;
-    field public static int actionModeBackground;
-    field public static int actionModeCloseButtonStyle;
-    field public static int actionModeCloseDrawable;
-    field public static int actionModeCopyDrawable;
-    field public static int actionModeCutDrawable;
-    field public static int actionModeFindDrawable;
-    field public static int actionModePasteDrawable;
-    field public static int actionModePopupWindowStyle;
-    field public static int actionModeSelectAllDrawable;
-    field public static int actionModeShareDrawable;
-    field public static int actionModeSplitBackground;
-    field public static int actionModeStyle;
-    field public static int actionModeWebSearchDrawable;
-    field public static int actionOverflowButtonStyle;
-    field public static int actionOverflowMenuStyle;
-    field public static int actionProviderClass;
-    field public static int actionViewClass;
-    field public static int activityChooserViewStyle;
-    field public static int alertDialogButtonGroupStyle;
-    field public static int alertDialogCenterButtons;
-    field public static int alertDialogStyle;
-    field public static int alertDialogTheme;
-    field public static int allowStacking;
-    field public static int arrowHeadLength;
-    field public static int arrowShaftLength;
-    field public static int autoCompleteTextViewStyle;
-    field public static int background;
-    field public static int backgroundSplit;
-    field public static int backgroundStacked;
-    field public static int backgroundTint;
-    field public static int backgroundTintMode;
-    field public static int barLength;
-    field public static int borderlessButtonStyle;
-    field public static int buttonBarButtonStyle;
-    field public static int buttonBarNegativeButtonStyle;
-    field public static int buttonBarNeutralButtonStyle;
-    field public static int buttonBarPositiveButtonStyle;
-    field public static int buttonBarStyle;
-    field public static int buttonPanelSideLayout;
-    field public static int buttonStyle;
-    field public static int buttonStyleSmall;
-    field public static int buttonTint;
-    field public static int buttonTintMode;
-    field public static int checkboxStyle;
-    field public static int checkedTextViewStyle;
-    field public static int closeIcon;
-    field public static int closeItemLayout;
-    field public static int collapseContentDescription;
-    field public static int collapseIcon;
-    field public static int color;
-    field public static int colorAccent;
-    field public static int colorButtonNormal;
-    field public static int colorControlActivated;
-    field public static int colorControlHighlight;
-    field public static int colorControlNormal;
-    field public static int colorPrimary;
-    field public static int colorPrimaryDark;
-    field public static int colorSwitchThumbNormal;
-    field public static int commitIcon;
-    field public static int contentInsetEnd;
-    field public static int contentInsetLeft;
-    field public static int contentInsetRight;
-    field public static int contentInsetStart;
-    field public static int controlBackground;
-    field public static int customNavigationLayout;
-    field public static int defaultQueryHint;
-    field public static int dialogPreferredPadding;
-    field public static int dialogTheme;
-    field public static int displayOptions;
-    field public static int divider;
-    field public static int dividerHorizontal;
-    field public static int dividerPadding;
-    field public static int dividerVertical;
-    field public static int drawableSize;
-    field public static int drawerArrowStyle;
-    field public static int dropDownListViewStyle;
-    field public static int dropdownListPreferredItemHeight;
-    field public static int editTextBackground;
-    field public static int editTextColor;
-    field public static int editTextStyle;
-    field public static int elevation;
-    field public static int expandActivityOverflowButtonDrawable;
-    field public static int gapBetweenBars;
-    field public static int goIcon;
-    field public static int height;
-    field public static int hideOnContentScroll;
-    field public static int homeAsUpIndicator;
-    field public static int homeLayout;
-    field public static int icon;
-    field public static int iconifiedByDefault;
-    field public static int imageButtonStyle;
-    field public static int indeterminateProgressStyle;
-    field public static int initialActivityCount;
-    field public static int isLightTheme;
-    field public static int itemPadding;
-    field public static int layout;
-    field public static int listChoiceBackgroundIndicator;
-    field public static int listDividerAlertDialog;
-    field public static int listItemLayout;
-    field public static int listLayout;
-    field public static int listPopupWindowStyle;
-    field public static int listPreferredItemHeight;
-    field public static int listPreferredItemHeightLarge;
-    field public static int listPreferredItemHeightSmall;
-    field public static int listPreferredItemPaddingLeft;
-    field public static int listPreferredItemPaddingRight;
-    field public static int logo;
-    field public static int logoDescription;
-    field public static int maxButtonHeight;
-    field public static int measureWithLargestChild;
-    field public static int multiChoiceItemLayout;
-    field public static int navigationContentDescription;
-    field public static int navigationIcon;
-    field public static int navigationMode;
-    field public static int overlapAnchor;
-    field public static int paddingEnd;
-    field public static int paddingStart;
-    field public static int panelBackground;
-    field public static int panelMenuListTheme;
-    field public static int panelMenuListWidth;
-    field public static int popupMenuStyle;
-    field public static int popupTheme;
-    field public static int popupWindowStyle;
-    field public static int preserveIconSpacing;
-    field public static int progressBarPadding;
-    field public static int progressBarStyle;
-    field public static int queryBackground;
-    field public static int queryHint;
-    field public static int radioButtonStyle;
-    field public static int ratingBarStyle;
-    field public static int searchHintIcon;
-    field public static int searchIcon;
-    field public static int searchViewStyle;
-    field public static int seekBarStyle;
-    field public static int selectableItemBackground;
-    field public static int selectableItemBackgroundBorderless;
-    field public static int showAsAction;
-    field public static int showDividers;
-    field public static int showText;
-    field public static int singleChoiceItemLayout;
-    field public static int spinBars;
-    field public static int spinnerDropDownItemStyle;
-    field public static int spinnerStyle;
-    field public static int splitTrack;
-    field public static int state_above_anchor;
-    field public static int submitBackground;
-    field public static int subtitle;
-    field public static int subtitleTextAppearance;
-    field public static int subtitleTextColor;
-    field public static int subtitleTextStyle;
-    field public static int suggestionRowLayout;
-    field public static int switchMinWidth;
-    field public static int switchPadding;
-    field public static int switchStyle;
-    field public static int switchTextAppearance;
-    field public static int textAllCaps;
-    field public static int textAppearanceLargePopupMenu;
-    field public static int textAppearanceListItem;
-    field public static int textAppearanceListItemSmall;
-    field public static int textAppearanceSearchResultSubtitle;
-    field public static int textAppearanceSearchResultTitle;
-    field public static int textAppearanceSmallPopupMenu;
-    field public static int textColorAlertDialogListItem;
-    field public static int textColorSearchUrl;
-    field public static int theme;
-    field public static int thickness;
-    field public static int thumbTextPadding;
-    field public static int title;
-    field public static int titleMarginBottom;
-    field public static int titleMarginEnd;
-    field public static int titleMarginStart;
-    field public static int titleMarginTop;
-    field public static int titleMargins;
-    field public static int titleTextAppearance;
-    field public static int titleTextColor;
-    field public static int titleTextStyle;
-    field public static int toolbarNavigationButtonStyle;
-    field public static int toolbarStyle;
-    field public static int track;
-    field public static int voiceIcon;
-    field public static int windowActionBar;
-    field public static int windowActionBarOverlay;
-    field public static int windowActionModeOverlay;
-    field public static int windowFixedHeightMajor;
-    field public static int windowFixedHeightMinor;
-    field public static int windowFixedWidthMajor;
-    field public static int windowFixedWidthMinor;
-    field public static int windowMinWidthMajor;
-    field public static int windowMinWidthMinor;
-    field public static int windowNoTitle;
-  }
-
-  public static final class R.bool {
-    ctor public R.bool();
-    field public static int abc_action_bar_embed_tabs;
-    field public static int abc_action_bar_embed_tabs_pre_jb;
-    field public static int abc_action_bar_expanded_action_views_exclusive;
-    field public static int abc_allow_stacked_button_bar;
-    field public static int abc_config_actionMenuItemAllCaps;
-    field public static int abc_config_allowActionMenuItemTextWithIcon;
-    field public static int abc_config_closeDialogWhenTouchOutside;
-    field public static int abc_config_showMenuShortcutsWhenKeyboardPresent;
-  }
-
-  public static final class R.color {
-    ctor public R.color();
-    field public static int abc_background_cache_hint_selector_material_dark;
-    field public static int abc_background_cache_hint_selector_material_light;
-    field public static int abc_color_highlight_material;
-    field public static int abc_input_method_navigation_guard;
-    field public static int abc_primary_text_disable_only_material_dark;
-    field public static int abc_primary_text_disable_only_material_light;
-    field public static int abc_primary_text_material_dark;
-    field public static int abc_primary_text_material_light;
-    field public static int abc_search_url_text;
-    field public static int abc_search_url_text_normal;
-    field public static int abc_search_url_text_pressed;
-    field public static int abc_search_url_text_selected;
-    field public static int abc_secondary_text_material_dark;
-    field public static int abc_secondary_text_material_light;
-    field public static int accent_material_dark;
-    field public static int accent_material_light;
-    field public static int background_floating_material_dark;
-    field public static int background_floating_material_light;
-    field public static int background_material_dark;
-    field public static int background_material_light;
-    field public static int bright_foreground_disabled_material_dark;
-    field public static int bright_foreground_disabled_material_light;
-    field public static int bright_foreground_inverse_material_dark;
-    field public static int bright_foreground_inverse_material_light;
-    field public static int bright_foreground_material_dark;
-    field public static int bright_foreground_material_light;
-    field public static int button_material_dark;
-    field public static int button_material_light;
-    field public static int dim_foreground_disabled_material_dark;
-    field public static int dim_foreground_disabled_material_light;
-    field public static int dim_foreground_material_dark;
-    field public static int dim_foreground_material_light;
-    field public static int foreground_material_dark;
-    field public static int foreground_material_light;
-    field public static int highlighted_text_material_dark;
-    field public static int highlighted_text_material_light;
-    field public static int hint_foreground_material_dark;
-    field public static int hint_foreground_material_light;
-    field public static int material_blue_grey_800;
-    field public static int material_blue_grey_900;
-    field public static int material_blue_grey_950;
-    field public static int material_deep_teal_200;
-    field public static int material_deep_teal_500;
-    field public static int material_grey_100;
-    field public static int material_grey_300;
-    field public static int material_grey_50;
-    field public static int material_grey_600;
-    field public static int material_grey_800;
-    field public static int material_grey_850;
-    field public static int material_grey_900;
-    field public static int primary_dark_material_dark;
-    field public static int primary_dark_material_light;
-    field public static int primary_material_dark;
-    field public static int primary_material_light;
-    field public static int primary_text_default_material_dark;
-    field public static int primary_text_default_material_light;
-    field public static int primary_text_disabled_material_dark;
-    field public static int primary_text_disabled_material_light;
-    field public static int ripple_material_dark;
-    field public static int ripple_material_light;
-    field public static int secondary_text_default_material_dark;
-    field public static int secondary_text_default_material_light;
-    field public static int secondary_text_disabled_material_dark;
-    field public static int secondary_text_disabled_material_light;
-    field public static int switch_thumb_disabled_material_dark;
-    field public static int switch_thumb_disabled_material_light;
-    field public static int switch_thumb_material_dark;
-    field public static int switch_thumb_material_light;
-    field public static int switch_thumb_normal_material_dark;
-    field public static int switch_thumb_normal_material_light;
-  }
-
-  public static final class R.dimen {
-    ctor public R.dimen();
-    field public static int abc_action_bar_content_inset_material;
-    field public static int abc_action_bar_default_height_material;
-    field public static int abc_action_bar_default_padding_end_material;
-    field public static int abc_action_bar_default_padding_start_material;
-    field public static int abc_action_bar_icon_vertical_padding_material;
-    field public static int abc_action_bar_overflow_padding_end_material;
-    field public static int abc_action_bar_overflow_padding_start_material;
-    field public static int abc_action_bar_progress_bar_size;
-    field public static int abc_action_bar_stacked_max_height;
-    field public static int abc_action_bar_stacked_tab_max_width;
-    field public static int abc_action_bar_subtitle_bottom_margin_material;
-    field public static int abc_action_bar_subtitle_top_margin_material;
-    field public static int abc_action_button_min_height_material;
-    field public static int abc_action_button_min_width_material;
-    field public static int abc_action_button_min_width_overflow_material;
-    field public static int abc_alert_dialog_button_bar_height;
-    field public static int abc_button_inset_horizontal_material;
-    field public static int abc_button_inset_vertical_material;
-    field public static int abc_button_padding_horizontal_material;
-    field public static int abc_button_padding_vertical_material;
-    field public static int abc_config_prefDialogWidth;
-    field public static int abc_control_corner_material;
-    field public static int abc_control_inset_material;
-    field public static int abc_control_padding_material;
-    field public static int abc_dialog_fixed_height_major;
-    field public static int abc_dialog_fixed_height_minor;
-    field public static int abc_dialog_fixed_width_major;
-    field public static int abc_dialog_fixed_width_minor;
-    field public static int abc_dialog_list_padding_vertical_material;
-    field public static int abc_dialog_min_width_major;
-    field public static int abc_dialog_min_width_minor;
-    field public static int abc_dialog_padding_material;
-    field public static int abc_dialog_padding_top_material;
-    field public static int abc_disabled_alpha_material_dark;
-    field public static int abc_disabled_alpha_material_light;
-    field public static int abc_dropdownitem_icon_width;
-    field public static int abc_dropdownitem_text_padding_left;
-    field public static int abc_dropdownitem_text_padding_right;
-    field public static int abc_edit_text_inset_bottom_material;
-    field public static int abc_edit_text_inset_horizontal_material;
-    field public static int abc_edit_text_inset_top_material;
-    field public static int abc_floating_window_z;
-    field public static int abc_list_item_padding_horizontal_material;
-    field public static int abc_panel_menu_list_width;
-    field public static int abc_search_view_preferred_width;
-    field public static int abc_search_view_text_min_width;
-    field public static int abc_seekbar_track_background_height_material;
-    field public static int abc_seekbar_track_progress_height_material;
-    field public static int abc_select_dialog_padding_start_material;
-    field public static int abc_switch_padding;
-    field public static int abc_text_size_body_1_material;
-    field public static int abc_text_size_body_2_material;
-    field public static int abc_text_size_button_material;
-    field public static int abc_text_size_caption_material;
-    field public static int abc_text_size_display_1_material;
-    field public static int abc_text_size_display_2_material;
-    field public static int abc_text_size_display_3_material;
-    field public static int abc_text_size_display_4_material;
-    field public static int abc_text_size_headline_material;
-    field public static int abc_text_size_large_material;
-    field public static int abc_text_size_medium_material;
-    field public static int abc_text_size_menu_material;
-    field public static int abc_text_size_small_material;
-    field public static int abc_text_size_subhead_material;
-    field public static int abc_text_size_subtitle_material_toolbar;
-    field public static int abc_text_size_title_material;
-    field public static int abc_text_size_title_material_toolbar;
-    field public static int disabled_alpha_material_dark;
-    field public static int disabled_alpha_material_light;
-    field public static int highlight_alpha_material_colored;
-    field public static int highlight_alpha_material_dark;
-    field public static int highlight_alpha_material_light;
-    field public static int notification_large_icon_height;
-    field public static int notification_large_icon_width;
-    field public static int notification_subtext_size;
-  }
-
-  public static final class R.drawable {
-    ctor public R.drawable();
-    field public static int abc_ab_share_pack_mtrl_alpha;
-    field public static int abc_action_bar_item_background_material;
-    field public static int abc_btn_borderless_material;
-    field public static int abc_btn_check_material;
-    field public static int abc_btn_check_to_on_mtrl_000;
-    field public static int abc_btn_check_to_on_mtrl_015;
-    field public static int abc_btn_colored_material;
-    field public static int abc_btn_default_material;
-    field public static int abc_btn_default_mtrl_shape;
-    field public static int abc_btn_radio_material;
-    field public static int abc_btn_radio_to_on_mtrl_000;
-    field public static int abc_btn_radio_to_on_mtrl_015;
-    field public static int abc_btn_rating_star_off_mtrl_alpha;
-    field public static int abc_btn_rating_star_on_mtrl_alpha;
-    field public static int abc_btn_switch_to_on_mtrl_00001;
-    field public static int abc_btn_switch_to_on_mtrl_00012;
-    field public static int abc_cab_background_internal_bg;
-    field public static int abc_cab_background_top_material;
-    field public static int abc_cab_background_top_mtrl_alpha;
-    field public static int abc_control_background_material;
-    field public static int abc_dialog_material_background_dark;
-    field public static int abc_dialog_material_background_light;
-    field public static int abc_edit_text_material;
-    field public static int abc_ic_ab_back_mtrl_am_alpha;
-    field public static int abc_ic_clear_mtrl_alpha;
-    field public static int abc_ic_commit_search_api_mtrl_alpha;
-    field public static int abc_ic_go_search_api_mtrl_alpha;
-    field public static int abc_ic_menu_copy_mtrl_am_alpha;
-    field public static int abc_ic_menu_cut_mtrl_alpha;
-    field public static int abc_ic_menu_moreoverflow_mtrl_alpha;
-    field public static int abc_ic_menu_paste_mtrl_am_alpha;
-    field public static int abc_ic_menu_selectall_mtrl_alpha;
-    field public static int abc_ic_menu_share_mtrl_alpha;
-    field public static int abc_ic_search_api_mtrl_alpha;
-    field public static int abc_ic_voice_search_api_mtrl_alpha;
-    field public static int abc_item_background_holo_dark;
-    field public static int abc_item_background_holo_light;
-    field public static int abc_list_divider_mtrl_alpha;
-    field public static int abc_list_focused_holo;
-    field public static int abc_list_longpressed_holo;
-    field public static int abc_list_pressed_holo_dark;
-    field public static int abc_list_pressed_holo_light;
-    field public static int abc_list_selector_background_transition_holo_dark;
-    field public static int abc_list_selector_background_transition_holo_light;
-    field public static int abc_list_selector_disabled_holo_dark;
-    field public static int abc_list_selector_disabled_holo_light;
-    field public static int abc_list_selector_holo_dark;
-    field public static int abc_list_selector_holo_light;
-    field public static int abc_menu_hardkey_panel_mtrl_mult;
-    field public static int abc_popup_background_mtrl_mult;
-    field public static int abc_ratingbar_full_material;
-    field public static int abc_scrubber_control_off_mtrl_alpha;
-    field public static int abc_scrubber_control_to_pressed_mtrl_000;
-    field public static int abc_scrubber_control_to_pressed_mtrl_005;
-    field public static int abc_scrubber_primary_mtrl_alpha;
-    field public static int abc_scrubber_track_mtrl_alpha;
-    field public static int abc_seekbar_thumb_material;
-    field public static int abc_seekbar_track_material;
-    field public static int abc_spinner_mtrl_am_alpha;
-    field public static int abc_spinner_textfield_background_material;
-    field public static int abc_switch_thumb_material;
-    field public static int abc_switch_track_mtrl_alpha;
-    field public static int abc_tab_indicator_material;
-    field public static int abc_tab_indicator_mtrl_alpha;
-    field public static int abc_text_cursor_material;
-    field public static int abc_textfield_activated_mtrl_alpha;
-    field public static int abc_textfield_default_mtrl_alpha;
-    field public static int abc_textfield_search_activated_mtrl_alpha;
-    field public static int abc_textfield_search_default_mtrl_alpha;
-    field public static int abc_textfield_search_material;
-    field public static int notification_template_icon_bg;
-  }
-
-  public static final class R.id {
-    ctor public R.id();
-    field public static int action0;
-    field public static int action_bar;
-    field public static int action_bar_activity_content;
-    field public static int action_bar_container;
-    field public static int action_bar_root;
-    field public static int action_bar_spinner;
-    field public static int action_bar_subtitle;
-    field public static int action_bar_title;
-    field public static int action_context_bar;
-    field public static int action_divider;
-    field public static int action_menu_divider;
-    field public static int action_menu_presenter;
-    field public static int action_mode_bar;
-    field public static int action_mode_bar_stub;
-    field public static int action_mode_close_button;
-    field public static int activity_chooser_view_content;
-    field public static int alertTitle;
-    field public static int always;
-    field public static int beginning;
-    field public static int buttonPanel;
-    field public static int cancel_action;
-    field public static int checkbox;
-    field public static int chronometer;
-    field public static int collapseActionView;
-    field public static int contentPanel;
-    field public static int custom;
-    field public static int customPanel;
-    field public static int decor_content_parent;
-    field public static int default_activity_button;
-    field public static int disableHome;
-    field public static int edit_query;
-    field public static int end;
-    field public static int end_padder;
-    field public static int expand_activities_button;
-    field public static int expanded_menu;
-    field public static int home;
-    field public static int homeAsUp;
-    field public static int icon;
-    field public static int ifRoom;
-    field public static int image;
-    field public static int info;
-    field public static int line1;
-    field public static int line3;
-    field public static int listMode;
-    field public static int list_item;
-    field public static int media_actions;
-    field public static int middle;
-    field public static int multiply;
-    field public static int never;
-    field public static int none;
-    field public static int normal;
-    field public static int parentPanel;
-    field public static int progress_circular;
-    field public static int progress_horizontal;
-    field public static int radio;
-    field public static int screen;
-    field public static int scrollIndicatorDown;
-    field public static int scrollIndicatorUp;
-    field public static int scrollView;
-    field public static int search_badge;
-    field public static int search_bar;
-    field public static int search_button;
-    field public static int search_close_btn;
-    field public static int search_edit_frame;
-    field public static int search_go_btn;
-    field public static int search_mag_icon;
-    field public static int search_plate;
-    field public static int search_src_text;
-    field public static int search_voice_btn;
-    field public static int select_dialog_listview;
-    field public static int shortcut;
-    field public static int showCustom;
-    field public static int showHome;
-    field public static int showTitle;
-    field public static int spacer;
-    field public static int split_action_bar;
-    field public static int src_atop;
-    field public static int src_in;
-    field public static int src_over;
-    field public static int status_bar_latest_event_content;
-    field public static int submit_area;
-    field public static int tabMode;
-    field public static int text;
-    field public static int text2;
-    field public static int textSpacerNoButtons;
-    field public static int time;
-    field public static int title;
-    field public static int title_template;
-    field public static int topPanel;
-    field public static int up;
-    field public static int useLogo;
-    field public static int withText;
-    field public static int wrap_content;
-  }
-
-  public static final class R.integer {
-    ctor public R.integer();
-    field public static int abc_config_activityDefaultDur;
-    field public static int abc_config_activityShortDur;
-    field public static int abc_max_action_buttons;
-    field public static int cancel_button_image_alpha;
-    field public static int status_bar_notification_info_maxnum;
-  }
-
-  public static final class R.layout {
-    ctor public R.layout();
-    field public static int abc_action_bar_title_item;
-    field public static int abc_action_bar_up_container;
-    field public static int abc_action_bar_view_list_nav_layout;
-    field public static int abc_action_menu_item_layout;
-    field public static int abc_action_menu_layout;
-    field public static int abc_action_mode_bar;
-    field public static int abc_action_mode_close_item_material;
-    field public static int abc_activity_chooser_view;
-    field public static int abc_activity_chooser_view_list_item;
-    field public static int abc_alert_dialog_button_bar_material;
-    field public static int abc_alert_dialog_material;
-    field public static int abc_dialog_title_material;
-    field public static int abc_expanded_menu_layout;
-    field public static int abc_list_menu_item_checkbox;
-    field public static int abc_list_menu_item_icon;
-    field public static int abc_list_menu_item_layout;
-    field public static int abc_list_menu_item_radio;
-    field public static int abc_popup_menu_item_layout;
-    field public static int abc_screen_content_include;
-    field public static int abc_screen_simple;
-    field public static int abc_screen_simple_overlay_action_mode;
-    field public static int abc_screen_toolbar;
-    field public static int abc_search_dropdown_item_icons_2line;
-    field public static int abc_search_view;
-    field public static int abc_select_dialog_material;
-    field public static int notification_media_action;
-    field public static int notification_media_cancel_action;
-    field public static int notification_template_big_media;
-    field public static int notification_template_big_media_narrow;
-    field public static int notification_template_lines;
-    field public static int notification_template_media;
-    field public static int notification_template_part_chronometer;
-    field public static int notification_template_part_time;
-    field public static int select_dialog_item_material;
-    field public static int select_dialog_multichoice_material;
-    field public static int select_dialog_singlechoice_material;
-    field public static int support_simple_spinner_dropdown_item;
-  }
-
-  public static final class R.string {
-    ctor public R.string();
-    field public static int abc_action_bar_home_description;
-    field public static int abc_action_bar_home_description_format;
-    field public static int abc_action_bar_home_subtitle_description_format;
-    field public static int abc_action_bar_up_description;
-    field public static int abc_action_menu_overflow_description;
-    field public static int abc_action_mode_done;
-    field public static int abc_activity_chooser_view_see_all;
-    field public static int abc_activitychooserview_choose_application;
-    field public static int abc_capital_off;
-    field public static int abc_capital_on;
-    field public static int abc_search_hint;
-    field public static int abc_searchview_description_clear;
-    field public static int abc_searchview_description_query;
-    field public static int abc_searchview_description_search;
-    field public static int abc_searchview_description_submit;
-    field public static int abc_searchview_description_voice;
-    field public static int abc_shareactionprovider_share_with;
-    field public static int abc_shareactionprovider_share_with_application;
-    field public static int abc_toolbar_collapse_description;
-    field public static int status_bar_notification_info_overflow;
-  }
-
-  public static final class R.style {
-    ctor public R.style();
-    field public static int AlertDialog_AppCompat;
-    field public static int AlertDialog_AppCompat_Light;
-    field public static int Animation_AppCompat_Dialog;
-    field public static int Animation_AppCompat_DropDownUp;
-    field public static int Base_AlertDialog_AppCompat;
-    field public static int Base_AlertDialog_AppCompat_Light;
-    field public static int Base_Animation_AppCompat_Dialog;
-    field public static int Base_Animation_AppCompat_DropDownUp;
-    field public static int Base_DialogWindowTitleBackground_AppCompat;
-    field public static int Base_DialogWindowTitle_AppCompat;
-    field public static int Base_TextAppearance_AppCompat;
-    field public static int Base_TextAppearance_AppCompat_Body1;
-    field public static int Base_TextAppearance_AppCompat_Body2;
-    field public static int Base_TextAppearance_AppCompat_Button;
-    field public static int Base_TextAppearance_AppCompat_Caption;
-    field public static int Base_TextAppearance_AppCompat_Display1;
-    field public static int Base_TextAppearance_AppCompat_Display2;
-    field public static int Base_TextAppearance_AppCompat_Display3;
-    field public static int Base_TextAppearance_AppCompat_Display4;
-    field public static int Base_TextAppearance_AppCompat_Headline;
-    field public static int Base_TextAppearance_AppCompat_Inverse;
-    field public static int Base_TextAppearance_AppCompat_Large;
-    field public static int Base_TextAppearance_AppCompat_Large_Inverse;
-    field public static int Base_TextAppearance_AppCompat_Light_Widget_PopupMenu_Large;
-    field public static int Base_TextAppearance_AppCompat_Light_Widget_PopupMenu_Small;
-    field public static int Base_TextAppearance_AppCompat_Medium;
-    field public static int Base_TextAppearance_AppCompat_Medium_Inverse;
-    field public static int Base_TextAppearance_AppCompat_Menu;
-    field public static int Base_TextAppearance_AppCompat_SearchResult;
-    field public static int Base_TextAppearance_AppCompat_SearchResult_Subtitle;
-    field public static int Base_TextAppearance_AppCompat_SearchResult_Title;
-    field public static int Base_TextAppearance_AppCompat_Small;
-    field public static int Base_TextAppearance_AppCompat_Small_Inverse;
-    field public static int Base_TextAppearance_AppCompat_Subhead;
-    field public static int Base_TextAppearance_AppCompat_Subhead_Inverse;
-    field public static int Base_TextAppearance_AppCompat_Title;
-    field public static int Base_TextAppearance_AppCompat_Title_Inverse;
-    field public static int Base_TextAppearance_AppCompat_Widget_ActionBar_Menu;
-    field public static int Base_TextAppearance_AppCompat_Widget_ActionBar_Subtitle;
-    field public static int Base_TextAppearance_AppCompat_Widget_ActionBar_Subtitle_Inverse;
-    field public static int Base_TextAppearance_AppCompat_Widget_ActionBar_Title;
-    field public static int Base_TextAppearance_AppCompat_Widget_ActionBar_Title_Inverse;
-    field public static int Base_TextAppearance_AppCompat_Widget_ActionMode_Subtitle;
-    field public static int Base_TextAppearance_AppCompat_Widget_ActionMode_Title;
-    field public static int Base_TextAppearance_AppCompat_Widget_Button;
-    field public static int Base_TextAppearance_AppCompat_Widget_Button_Inverse;
-    field public static int Base_TextAppearance_AppCompat_Widget_DropDownItem;
-    field public static int Base_TextAppearance_AppCompat_Widget_PopupMenu_Large;
-    field public static int Base_TextAppearance_AppCompat_Widget_PopupMenu_Small;
-    field public static int Base_TextAppearance_AppCompat_Widget_Switch;
-    field public static int Base_TextAppearance_AppCompat_Widget_TextView_SpinnerItem;
-    field public static int Base_TextAppearance_Widget_AppCompat_ExpandedMenu_Item;
-    field public static int Base_TextAppearance_Widget_AppCompat_Toolbar_Subtitle;
-    field public static int Base_TextAppearance_Widget_AppCompat_Toolbar_Title;
-    field public static int Base_ThemeOverlay_AppCompat;
-    field public static int Base_ThemeOverlay_AppCompat_ActionBar;
-    field public static int Base_ThemeOverlay_AppCompat_Dark;
-    field public static int Base_ThemeOverlay_AppCompat_Dark_ActionBar;
-    field public static int Base_ThemeOverlay_AppCompat_Light;
-    field public static int Base_Theme_AppCompat;
-    field public static int Base_Theme_AppCompat_CompactMenu;
-    field public static int Base_Theme_AppCompat_Dialog;
-    field public static int Base_Theme_AppCompat_DialogWhenLarge;
-    field public static int Base_Theme_AppCompat_Dialog_Alert;
-    field public static int Base_Theme_AppCompat_Dialog_FixedSize;
-    field public static int Base_Theme_AppCompat_Dialog_MinWidth;
-    field public static int Base_Theme_AppCompat_Light;
-    field public static int Base_Theme_AppCompat_Light_DarkActionBar;
-    field public static int Base_Theme_AppCompat_Light_Dialog;
-    field public static int Base_Theme_AppCompat_Light_DialogWhenLarge;
-    field public static int Base_Theme_AppCompat_Light_Dialog_Alert;
-    field public static int Base_Theme_AppCompat_Light_Dialog_FixedSize;
-    field public static int Base_Theme_AppCompat_Light_Dialog_MinWidth;
-    field public static int Base_V11_Theme_AppCompat_Dialog;
-    field public static int Base_V11_Theme_AppCompat_Light_Dialog;
-    field public static int Base_V12_Widget_AppCompat_AutoCompleteTextView;
-    field public static int Base_V12_Widget_AppCompat_EditText;
-    field public static int Base_V21_Theme_AppCompat;
-    field public static int Base_V21_Theme_AppCompat_Dialog;
-    field public static int Base_V21_Theme_AppCompat_Light;
-    field public static int Base_V21_Theme_AppCompat_Light_Dialog;
-    field public static int Base_V22_Theme_AppCompat;
-    field public static int Base_V22_Theme_AppCompat_Light;
-    field public static int Base_V23_Theme_AppCompat;
-    field public static int Base_V23_Theme_AppCompat_Light;
-    field public static int Base_V7_Theme_AppCompat;
-    field public static int Base_V7_Theme_AppCompat_Dialog;
-    field public static int Base_V7_Theme_AppCompat_Light;
-    field public static int Base_V7_Theme_AppCompat_Light_Dialog;
-    field public static int Base_V7_Widget_AppCompat_AutoCompleteTextView;
-    field public static int Base_V7_Widget_AppCompat_EditText;
-    field public static int Base_Widget_AppCompat_ActionBar;
-    field public static int Base_Widget_AppCompat_ActionBar_Solid;
-    field public static int Base_Widget_AppCompat_ActionBar_TabBar;
-    field public static int Base_Widget_AppCompat_ActionBar_TabText;
-    field public static int Base_Widget_AppCompat_ActionBar_TabView;
-    field public static int Base_Widget_AppCompat_ActionButton;
-    field public static int Base_Widget_AppCompat_ActionButton_CloseMode;
-    field public static int Base_Widget_AppCompat_ActionButton_Overflow;
-    field public static int Base_Widget_AppCompat_ActionMode;
-    field public static int Base_Widget_AppCompat_ActivityChooserView;
-    field public static int Base_Widget_AppCompat_AutoCompleteTextView;
-    field public static int Base_Widget_AppCompat_Button;
-    field public static int Base_Widget_AppCompat_ButtonBar;
-    field public static int Base_Widget_AppCompat_ButtonBar_AlertDialog;
-    field public static int Base_Widget_AppCompat_Button_Borderless;
-    field public static int Base_Widget_AppCompat_Button_Borderless_Colored;
-    field public static int Base_Widget_AppCompat_Button_ButtonBar_AlertDialog;
-    field public static int Base_Widget_AppCompat_Button_Colored;
-    field public static int Base_Widget_AppCompat_Button_Small;
-    field public static int Base_Widget_AppCompat_CompoundButton_CheckBox;
-    field public static int Base_Widget_AppCompat_CompoundButton_RadioButton;
-    field public static int Base_Widget_AppCompat_CompoundButton_Switch;
-    field public static int Base_Widget_AppCompat_DrawerArrowToggle;
-    field public static int Base_Widget_AppCompat_DrawerArrowToggle_Common;
-    field public static int Base_Widget_AppCompat_DropDownItem_Spinner;
-    field public static int Base_Widget_AppCompat_EditText;
-    field public static int Base_Widget_AppCompat_ImageButton;
-    field public static int Base_Widget_AppCompat_Light_ActionBar;
-    field public static int Base_Widget_AppCompat_Light_ActionBar_Solid;
-    field public static int Base_Widget_AppCompat_Light_ActionBar_TabBar;
-    field public static int Base_Widget_AppCompat_Light_ActionBar_TabText;
-    field public static int Base_Widget_AppCompat_Light_ActionBar_TabText_Inverse;
-    field public static int Base_Widget_AppCompat_Light_ActionBar_TabView;
-    field public static int Base_Widget_AppCompat_Light_PopupMenu;
-    field public static int Base_Widget_AppCompat_Light_PopupMenu_Overflow;
-    field public static int Base_Widget_AppCompat_ListPopupWindow;
-    field public static int Base_Widget_AppCompat_ListView;
-    field public static int Base_Widget_AppCompat_ListView_DropDown;
-    field public static int Base_Widget_AppCompat_ListView_Menu;
-    field public static int Base_Widget_AppCompat_PopupMenu;
-    field public static int Base_Widget_AppCompat_PopupMenu_Overflow;
-    field public static int Base_Widget_AppCompat_PopupWindow;
-    field public static int Base_Widget_AppCompat_ProgressBar;
-    field public static int Base_Widget_AppCompat_ProgressBar_Horizontal;
-    field public static int Base_Widget_AppCompat_RatingBar;
-    field public static int Base_Widget_AppCompat_SearchView;
-    field public static int Base_Widget_AppCompat_SearchView_ActionBar;
-    field public static int Base_Widget_AppCompat_SeekBar;
-    field public static int Base_Widget_AppCompat_Spinner;
-    field public static int Base_Widget_AppCompat_Spinner_Underlined;
-    field public static int Base_Widget_AppCompat_TextView_SpinnerItem;
-    field public static int Base_Widget_AppCompat_Toolbar;
-    field public static int Base_Widget_AppCompat_Toolbar_Button_Navigation;
-    field public static int Platform_AppCompat;
-    field public static int Platform_AppCompat_Light;
-    field public static int Platform_ThemeOverlay_AppCompat;
-    field public static int Platform_ThemeOverlay_AppCompat_Dark;
-    field public static int Platform_ThemeOverlay_AppCompat_Light;
-    field public static int Platform_V11_AppCompat;
-    field public static int Platform_V11_AppCompat_Light;
-    field public static int Platform_V14_AppCompat;
-    field public static int Platform_V14_AppCompat_Light;
-    field public static int Platform_Widget_AppCompat_Spinner;
-    field public static int RtlOverlay_DialogWindowTitle_AppCompat;
-    field public static int RtlOverlay_Widget_AppCompat_ActionBar_TitleItem;
-    field public static int RtlOverlay_Widget_AppCompat_DialogTitle_Icon;
-    field public static int RtlOverlay_Widget_AppCompat_PopupMenuItem;
-    field public static int RtlOverlay_Widget_AppCompat_PopupMenuItem_InternalGroup;
-    field public static int RtlOverlay_Widget_AppCompat_PopupMenuItem_Text;
-    field public static int RtlOverlay_Widget_AppCompat_SearchView_MagIcon;
-    field public static int RtlOverlay_Widget_AppCompat_Search_DropDown;
-    field public static int RtlOverlay_Widget_AppCompat_Search_DropDown_Icon1;
-    field public static int RtlOverlay_Widget_AppCompat_Search_DropDown_Icon2;
-    field public static int RtlOverlay_Widget_AppCompat_Search_DropDown_Query;
-    field public static int RtlOverlay_Widget_AppCompat_Search_DropDown_Text;
-    field public static int RtlUnderlay_Widget_AppCompat_ActionButton;
-    field public static int RtlUnderlay_Widget_AppCompat_ActionButton_Overflow;
-    field public static int TextAppearance_AppCompat;
-    field public static int TextAppearance_AppCompat_Body1;
-    field public static int TextAppearance_AppCompat_Body2;
-    field public static int TextAppearance_AppCompat_Button;
-    field public static int TextAppearance_AppCompat_Caption;
-    field public static int TextAppearance_AppCompat_Display1;
-    field public static int TextAppearance_AppCompat_Display2;
-    field public static int TextAppearance_AppCompat_Display3;
-    field public static int TextAppearance_AppCompat_Display4;
-    field public static int TextAppearance_AppCompat_Headline;
-    field public static int TextAppearance_AppCompat_Inverse;
-    field public static int TextAppearance_AppCompat_Large;
-    field public static int TextAppearance_AppCompat_Large_Inverse;
-    field public static int TextAppearance_AppCompat_Light_SearchResult_Subtitle;
-    field public static int TextAppearance_AppCompat_Light_SearchResult_Title;
-    field public static int TextAppearance_AppCompat_Light_Widget_PopupMenu_Large;
-    field public static int TextAppearance_AppCompat_Light_Widget_PopupMenu_Small;
-    field public static int TextAppearance_AppCompat_Medium;
-    field public static int TextAppearance_AppCompat_Medium_Inverse;
-    field public static int TextAppearance_AppCompat_Menu;
-    field public static int TextAppearance_AppCompat_SearchResult_Subtitle;
-    field public static int TextAppearance_AppCompat_SearchResult_Title;
-    field public static int TextAppearance_AppCompat_Small;
-    field public static int TextAppearance_AppCompat_Small_Inverse;
-    field public static int TextAppearance_AppCompat_Subhead;
-    field public static int TextAppearance_AppCompat_Subhead_Inverse;
-    field public static int TextAppearance_AppCompat_Title;
-    field public static int TextAppearance_AppCompat_Title_Inverse;
-    field public static int TextAppearance_AppCompat_Widget_ActionBar_Menu;
-    field public static int TextAppearance_AppCompat_Widget_ActionBar_Subtitle;
-    field public static int TextAppearance_AppCompat_Widget_ActionBar_Subtitle_Inverse;
-    field public static int TextAppearance_AppCompat_Widget_ActionBar_Title;
-    field public static int TextAppearance_AppCompat_Widget_ActionBar_Title_Inverse;
-    field public static int TextAppearance_AppCompat_Widget_ActionMode_Subtitle;
-    field public static int TextAppearance_AppCompat_Widget_ActionMode_Subtitle_Inverse;
-    field public static int TextAppearance_AppCompat_Widget_ActionMode_Title;
-    field public static int TextAppearance_AppCompat_Widget_ActionMode_Title_Inverse;
-    field public static int TextAppearance_AppCompat_Widget_Button;
-    field public static int TextAppearance_AppCompat_Widget_Button_Inverse;
-    field public static int TextAppearance_AppCompat_Widget_DropDownItem;
-    field public static int TextAppearance_AppCompat_Widget_PopupMenu_Large;
-    field public static int TextAppearance_AppCompat_Widget_PopupMenu_Small;
-    field public static int TextAppearance_AppCompat_Widget_Switch;
-    field public static int TextAppearance_AppCompat_Widget_TextView_SpinnerItem;
-    field public static int TextAppearance_StatusBar_EventContent;
-    field public static int TextAppearance_StatusBar_EventContent_Info;
-    field public static int TextAppearance_StatusBar_EventContent_Line2;
-    field public static int TextAppearance_StatusBar_EventContent_Time;
-    field public static int TextAppearance_StatusBar_EventContent_Title;
-    field public static int TextAppearance_Widget_AppCompat_ExpandedMenu_Item;
-    field public static int TextAppearance_Widget_AppCompat_Toolbar_Subtitle;
-    field public static int TextAppearance_Widget_AppCompat_Toolbar_Title;
-    field public static int ThemeOverlay_AppCompat;
-    field public static int ThemeOverlay_AppCompat_ActionBar;
-    field public static int ThemeOverlay_AppCompat_Dark;
-    field public static int ThemeOverlay_AppCompat_Dark_ActionBar;
-    field public static int ThemeOverlay_AppCompat_Light;
-    field public static int Theme_AppCompat;
-    field public static int Theme_AppCompat_CompactMenu;
-    field public static int Theme_AppCompat_Dialog;
-    field public static int Theme_AppCompat_DialogWhenLarge;
-    field public static int Theme_AppCompat_Dialog_Alert;
-    field public static int Theme_AppCompat_Dialog_MinWidth;
-    field public static int Theme_AppCompat_Light;
-    field public static int Theme_AppCompat_Light_DarkActionBar;
-    field public static int Theme_AppCompat_Light_Dialog;
-    field public static int Theme_AppCompat_Light_DialogWhenLarge;
-    field public static int Theme_AppCompat_Light_Dialog_Alert;
-    field public static int Theme_AppCompat_Light_Dialog_MinWidth;
-    field public static int Theme_AppCompat_Light_NoActionBar;
-    field public static int Theme_AppCompat_NoActionBar;
-    field public static int Widget_AppCompat_ActionBar;
-    field public static int Widget_AppCompat_ActionBar_Solid;
-    field public static int Widget_AppCompat_ActionBar_TabBar;
-    field public static int Widget_AppCompat_ActionBar_TabText;
-    field public static int Widget_AppCompat_ActionBar_TabView;
-    field public static int Widget_AppCompat_ActionButton;
-    field public static int Widget_AppCompat_ActionButton_CloseMode;
-    field public static int Widget_AppCompat_ActionButton_Overflow;
-    field public static int Widget_AppCompat_ActionMode;
-    field public static int Widget_AppCompat_ActivityChooserView;
-    field public static int Widget_AppCompat_AutoCompleteTextView;
-    field public static int Widget_AppCompat_Button;
-    field public static int Widget_AppCompat_ButtonBar;
-    field public static int Widget_AppCompat_ButtonBar_AlertDialog;
-    field public static int Widget_AppCompat_Button_Borderless;
-    field public static int Widget_AppCompat_Button_Borderless_Colored;
-    field public static int Widget_AppCompat_Button_ButtonBar_AlertDialog;
-    field public static int Widget_AppCompat_Button_Colored;
-    field public static int Widget_AppCompat_Button_Small;
-    field public static int Widget_AppCompat_CompoundButton_CheckBox;
-    field public static int Widget_AppCompat_CompoundButton_RadioButton;
-    field public static int Widget_AppCompat_CompoundButton_Switch;
-    field public static int Widget_AppCompat_DrawerArrowToggle;
-    field public static int Widget_AppCompat_DropDownItem_Spinner;
-    field public static int Widget_AppCompat_EditText;
-    field public static int Widget_AppCompat_ImageButton;
-    field public static int Widget_AppCompat_Light_ActionBar;
-    field public static int Widget_AppCompat_Light_ActionBar_Solid;
-    field public static int Widget_AppCompat_Light_ActionBar_Solid_Inverse;
-    field public static int Widget_AppCompat_Light_ActionBar_TabBar;
-    field public static int Widget_AppCompat_Light_ActionBar_TabBar_Inverse;
-    field public static int Widget_AppCompat_Light_ActionBar_TabText;
-    field public static int Widget_AppCompat_Light_ActionBar_TabText_Inverse;
-    field public static int Widget_AppCompat_Light_ActionBar_TabView;
-    field public static int Widget_AppCompat_Light_ActionBar_TabView_Inverse;
-    field public static int Widget_AppCompat_Light_ActionButton;
-    field public static int Widget_AppCompat_Light_ActionButton_CloseMode;
-    field public static int Widget_AppCompat_Light_ActionButton_Overflow;
-    field public static int Widget_AppCompat_Light_ActionMode_Inverse;
-    field public static int Widget_AppCompat_Light_ActivityChooserView;
-    field public static int Widget_AppCompat_Light_AutoCompleteTextView;
-    field public static int Widget_AppCompat_Light_DropDownItem_Spinner;
-    field public static int Widget_AppCompat_Light_ListPopupWindow;
-    field public static int Widget_AppCompat_Light_ListView_DropDown;
-    field public static int Widget_AppCompat_Light_PopupMenu;
-    field public static int Widget_AppCompat_Light_PopupMenu_Overflow;
-    field public static int Widget_AppCompat_Light_SearchView;
-    field public static int Widget_AppCompat_Light_Spinner_DropDown_ActionBar;
-    field public static int Widget_AppCompat_ListPopupWindow;
-    field public static int Widget_AppCompat_ListView;
-    field public static int Widget_AppCompat_ListView_DropDown;
-    field public static int Widget_AppCompat_ListView_Menu;
-    field public static int Widget_AppCompat_PopupMenu;
-    field public static int Widget_AppCompat_PopupMenu_Overflow;
-    field public static int Widget_AppCompat_PopupWindow;
-    field public static int Widget_AppCompat_ProgressBar;
-    field public static int Widget_AppCompat_ProgressBar_Horizontal;
-    field public static int Widget_AppCompat_RatingBar;
-    field public static int Widget_AppCompat_SearchView;
-    field public static int Widget_AppCompat_SearchView_ActionBar;
-    field public static int Widget_AppCompat_SeekBar;
-    field public static int Widget_AppCompat_Spinner;
-    field public static int Widget_AppCompat_Spinner_DropDown;
-    field public static int Widget_AppCompat_Spinner_DropDown_ActionBar;
-    field public static int Widget_AppCompat_Spinner_Underlined;
-    field public static int Widget_AppCompat_TextView_SpinnerItem;
-    field public static int Widget_AppCompat_Toolbar;
-    field public static int Widget_AppCompat_Toolbar_Button_Navigation;
-  }
-
-  public static final class R.styleable {
-    ctor public R.styleable();
-    field public static final int[] ActionBar;
-    field public static final int[] ActionBarLayout;
-    field public static int ActionBarLayout_android_layout_gravity;
-    field public static int ActionBar_background;
-    field public static int ActionBar_backgroundSplit;
-    field public static int ActionBar_backgroundStacked;
-    field public static int ActionBar_contentInsetEnd;
-    field public static int ActionBar_contentInsetLeft;
-    field public static int ActionBar_contentInsetRight;
-    field public static int ActionBar_contentInsetStart;
-    field public static int ActionBar_customNavigationLayout;
-    field public static int ActionBar_displayOptions;
-    field public static int ActionBar_divider;
-    field public static int ActionBar_elevation;
-    field public static int ActionBar_height;
-    field public static int ActionBar_hideOnContentScroll;
-    field public static int ActionBar_homeAsUpIndicator;
-    field public static int ActionBar_homeLayout;
-    field public static int ActionBar_icon;
-    field public static int ActionBar_indeterminateProgressStyle;
-    field public static int ActionBar_itemPadding;
-    field public static int ActionBar_logo;
-    field public static int ActionBar_navigationMode;
-    field public static int ActionBar_popupTheme;
-    field public static int ActionBar_progressBarPadding;
-    field public static int ActionBar_progressBarStyle;
-    field public static int ActionBar_subtitle;
-    field public static int ActionBar_subtitleTextStyle;
-    field public static int ActionBar_title;
-    field public static int ActionBar_titleTextStyle;
-    field public static final int[] ActionMenuItemView;
-    field public static int ActionMenuItemView_android_minWidth;
-    field public static final int[] ActionMenuView;
-    field public static final int[] ActionMode;
-    field public static int ActionMode_background;
-    field public static int ActionMode_backgroundSplit;
-    field public static int ActionMode_closeItemLayout;
-    field public static int ActionMode_height;
-    field public static int ActionMode_subtitleTextStyle;
-    field public static int ActionMode_titleTextStyle;
-    field public static final int[] ActivityChooserView;
-    field public static int ActivityChooserView_expandActivityOverflowButtonDrawable;
-    field public static int ActivityChooserView_initialActivityCount;
-    field public static final int[] AlertDialog;
-    field public static int AlertDialog_android_layout;
-    field public static int AlertDialog_buttonPanelSideLayout;
-    field public static int AlertDialog_listItemLayout;
-    field public static int AlertDialog_listLayout;
-    field public static int AlertDialog_multiChoiceItemLayout;
-    field public static int AlertDialog_singleChoiceItemLayout;
-    field public static final int[] AppCompatTextView;
-    field public static int AppCompatTextView_android_textAppearance;
-    field public static int AppCompatTextView_textAllCaps;
-    field public static int ButtonBarLayout_allowStacking;
-    field public static final int[] CompoundButton;
-    field public static int CompoundButton_android_button;
-    field public static int CompoundButton_buttonTint;
-    field public static int CompoundButton_buttonTintMode;
-    field public static final int[] DrawerArrowToggle;
-    field public static int DrawerArrowToggle_arrowHeadLength;
-    field public static int DrawerArrowToggle_arrowShaftLength;
-    field public static int DrawerArrowToggle_barLength;
-    field public static int DrawerArrowToggle_color;
-    field public static int DrawerArrowToggle_drawableSize;
-    field public static int DrawerArrowToggle_gapBetweenBars;
-    field public static int DrawerArrowToggle_spinBars;
-    field public static int DrawerArrowToggle_thickness;
-    field public static final int[] LinearLayoutCompat;
-    field public static final int[] LinearLayoutCompat_Layout;
-    field public static int LinearLayoutCompat_Layout_android_layout_gravity;
-    field public static int LinearLayoutCompat_Layout_android_layout_height;
-    field public static int LinearLayoutCompat_Layout_android_layout_weight;
-    field public static int LinearLayoutCompat_Layout_android_layout_width;
-    field public static int LinearLayoutCompat_android_baselineAligned;
-    field public static int LinearLayoutCompat_android_baselineAlignedChildIndex;
-    field public static int LinearLayoutCompat_android_gravity;
-    field public static int LinearLayoutCompat_android_orientation;
-    field public static int LinearLayoutCompat_android_weightSum;
-    field public static int LinearLayoutCompat_divider;
-    field public static int LinearLayoutCompat_dividerPadding;
-    field public static int LinearLayoutCompat_measureWithLargestChild;
-    field public static int LinearLayoutCompat_showDividers;
-    field public static final int[] ListPopupWindow;
-    field public static int ListPopupWindow_android_dropDownHorizontalOffset;
-    field public static int ListPopupWindow_android_dropDownVerticalOffset;
-    field public static final int[] MenuGroup;
-    field public static int MenuGroup_android_checkableBehavior;
-    field public static int MenuGroup_android_enabled;
-    field public static int MenuGroup_android_id;
-    field public static int MenuGroup_android_menuCategory;
-    field public static int MenuGroup_android_orderInCategory;
-    field public static int MenuGroup_android_visible;
-    field public static final int[] MenuItem;
-    field public static int MenuItem_actionLayout;
-    field public static int MenuItem_actionProviderClass;
-    field public static int MenuItem_actionViewClass;
-    field public static int MenuItem_android_alphabeticShortcut;
-    field public static int MenuItem_android_checkable;
-    field public static int MenuItem_android_checked;
-    field public static int MenuItem_android_enabled;
-    field public static int MenuItem_android_icon;
-    field public static int MenuItem_android_id;
-    field public static int MenuItem_android_menuCategory;
-    field public static int MenuItem_android_numericShortcut;
-    field public static int MenuItem_android_onClick;
-    field public static int MenuItem_android_orderInCategory;
-    field public static int MenuItem_android_title;
-    field public static int MenuItem_android_titleCondensed;
-    field public static int MenuItem_android_visible;
-    field public static int MenuItem_showAsAction;
-    field public static final int[] MenuView;
-    field public static int MenuView_android_headerBackground;
-    field public static int MenuView_android_horizontalDivider;
-    field public static int MenuView_android_itemBackground;
-    field public static int MenuView_android_itemIconDisabledAlpha;
-    field public static int MenuView_android_itemTextAppearance;
-    field public static int MenuView_android_verticalDivider;
-    field public static int MenuView_android_windowAnimationStyle;
-    field public static int MenuView_preserveIconSpacing;
-    field public static final int[] PopupWindow;
-    field public static final int[] PopupWindowBackgroundState;
-    field public static int PopupWindowBackgroundState_state_above_anchor;
-    field public static int PopupWindow_android_popupBackground;
-    field public static int PopupWindow_overlapAnchor;
-    field public static final int[] SearchView;
-    field public static int SearchView_android_focusable;
-    field public static int SearchView_android_imeOptions;
-    field public static int SearchView_android_inputType;
-    field public static int SearchView_android_maxWidth;
-    field public static int SearchView_closeIcon;
-    field public static int SearchView_commitIcon;
-    field public static int SearchView_defaultQueryHint;
-    field public static int SearchView_goIcon;
-    field public static int SearchView_iconifiedByDefault;
-    field public static int SearchView_layout;
-    field public static int SearchView_queryBackground;
-    field public static int SearchView_queryHint;
-    field public static int SearchView_searchHintIcon;
-    field public static int SearchView_searchIcon;
-    field public static int SearchView_submitBackground;
-    field public static int SearchView_suggestionRowLayout;
-    field public static int SearchView_voiceIcon;
-    field public static final int[] Spinner;
-    field public static int Spinner_android_dropDownWidth;
-    field public static int Spinner_android_popupBackground;
-    field public static int Spinner_android_prompt;
-    field public static int Spinner_popupTheme;
-    field public static final int[] SwitchCompat;
-    field public static int SwitchCompat_android_textOff;
-    field public static int SwitchCompat_android_textOn;
-    field public static int SwitchCompat_android_thumb;
-    field public static int SwitchCompat_showText;
-    field public static int SwitchCompat_splitTrack;
-    field public static int SwitchCompat_switchMinWidth;
-    field public static int SwitchCompat_switchPadding;
-    field public static int SwitchCompat_switchTextAppearance;
-    field public static int SwitchCompat_thumbTextPadding;
-    field public static int SwitchCompat_track;
-    field public static final int[] TextAppearance;
-    field public static int TextAppearance_android_shadowColor;
-    field public static int TextAppearance_android_shadowDx;
-    field public static int TextAppearance_android_shadowDy;
-    field public static int TextAppearance_android_shadowRadius;
-    field public static int TextAppearance_android_textColor;
-    field public static int TextAppearance_android_textSize;
-    field public static int TextAppearance_android_textStyle;
-    field public static int TextAppearance_android_typeface;
-    field public static int TextAppearance_textAllCaps;
-    field public static final int[] Theme;
-    field public static int Theme_actionBarDivider;
-    field public static int Theme_actionBarItemBackground;
-    field public static int Theme_actionBarPopupTheme;
-    field public static int Theme_actionBarSize;
-    field public static int Theme_actionBarSplitStyle;
-    field public static int Theme_actionBarStyle;
-    field public static int Theme_actionBarTabBarStyle;
-    field public static int Theme_actionBarTabStyle;
-    field public static int Theme_actionBarTabTextStyle;
-    field public static int Theme_actionBarTheme;
-    field public static int Theme_actionBarWidgetTheme;
-    field public static int Theme_actionButtonStyle;
-    field public static int Theme_actionDropDownStyle;
-    field public static int Theme_actionMenuTextAppearance;
-    field public static int Theme_actionMenuTextColor;
-    field public static int Theme_actionModeBackground;
-    field public static int Theme_actionModeCloseButtonStyle;
-    field public static int Theme_actionModeCloseDrawable;
-    field public static int Theme_actionModeCopyDrawable;
-    field public static int Theme_actionModeCutDrawable;
-    field public static int Theme_actionModeFindDrawable;
-    field public static int Theme_actionModePasteDrawable;
-    field public static int Theme_actionModePopupWindowStyle;
-    field public static int Theme_actionModeSelectAllDrawable;
-    field public static int Theme_actionModeShareDrawable;
-    field public static int Theme_actionModeSplitBackground;
-    field public static int Theme_actionModeStyle;
-    field public static int Theme_actionModeWebSearchDrawable;
-    field public static int Theme_actionOverflowButtonStyle;
-    field public static int Theme_actionOverflowMenuStyle;
-    field public static int Theme_activityChooserViewStyle;
-    field public static int Theme_alertDialogButtonGroupStyle;
-    field public static int Theme_alertDialogCenterButtons;
-    field public static int Theme_alertDialogStyle;
-    field public static int Theme_alertDialogTheme;
-    field public static int Theme_android_windowAnimationStyle;
-    field public static int Theme_android_windowIsFloating;
-    field public static int Theme_autoCompleteTextViewStyle;
-    field public static int Theme_borderlessButtonStyle;
-    field public static int Theme_buttonBarButtonStyle;
-    field public static int Theme_buttonBarNegativeButtonStyle;
-    field public static int Theme_buttonBarNeutralButtonStyle;
-    field public static int Theme_buttonBarPositiveButtonStyle;
-    field public static int Theme_buttonBarStyle;
-    field public static int Theme_buttonStyle;
-    field public static int Theme_buttonStyleSmall;
-    field public static int Theme_checkboxStyle;
-    field public static int Theme_checkedTextViewStyle;
-    field public static int Theme_colorAccent;
-    field public static int Theme_colorButtonNormal;
-    field public static int Theme_colorControlActivated;
-    field public static int Theme_colorControlHighlight;
-    field public static int Theme_colorControlNormal;
-    field public static int Theme_colorPrimary;
-    field public static int Theme_colorPrimaryDark;
-    field public static int Theme_colorSwitchThumbNormal;
-    field public static int Theme_controlBackground;
-    field public static int Theme_dialogPreferredPadding;
-    field public static int Theme_dialogTheme;
-    field public static int Theme_dividerHorizontal;
-    field public static int Theme_dividerVertical;
-    field public static int Theme_dropDownListViewStyle;
-    field public static int Theme_dropdownListPreferredItemHeight;
-    field public static int Theme_editTextBackground;
-    field public static int Theme_editTextColor;
-    field public static int Theme_editTextStyle;
-    field public static int Theme_homeAsUpIndicator;
-    field public static int Theme_imageButtonStyle;
-    field public static int Theme_listChoiceBackgroundIndicator;
-    field public static int Theme_listDividerAlertDialog;
-    field public static int Theme_listPopupWindowStyle;
-    field public static int Theme_listPreferredItemHeight;
-    field public static int Theme_listPreferredItemHeightLarge;
-    field public static int Theme_listPreferredItemHeightSmall;
-    field public static int Theme_listPreferredItemPaddingLeft;
-    field public static int Theme_listPreferredItemPaddingRight;
-    field public static int Theme_panelBackground;
-    field public static int Theme_panelMenuListTheme;
-    field public static int Theme_panelMenuListWidth;
-    field public static int Theme_popupMenuStyle;
-    field public static int Theme_popupWindowStyle;
-    field public static int Theme_radioButtonStyle;
-    field public static int Theme_ratingBarStyle;
-    field public static int Theme_searchViewStyle;
-    field public static int Theme_seekBarStyle;
-    field public static int Theme_selectableItemBackground;
-    field public static int Theme_selectableItemBackgroundBorderless;
-    field public static int Theme_spinnerDropDownItemStyle;
-    field public static int Theme_spinnerStyle;
-    field public static int Theme_switchStyle;
-    field public static int Theme_textAppearanceLargePopupMenu;
-    field public static int Theme_textAppearanceListItem;
-    field public static int Theme_textAppearanceListItemSmall;
-    field public static int Theme_textAppearanceSearchResultSubtitle;
-    field public static int Theme_textAppearanceSearchResultTitle;
-    field public static int Theme_textAppearanceSmallPopupMenu;
-    field public static int Theme_textColorAlertDialogListItem;
-    field public static int Theme_textColorSearchUrl;
-    field public static int Theme_toolbarNavigationButtonStyle;
-    field public static int Theme_toolbarStyle;
-    field public static int Theme_windowActionBar;
-    field public static int Theme_windowActionBarOverlay;
-    field public static int Theme_windowActionModeOverlay;
-    field public static int Theme_windowFixedHeightMajor;
-    field public static int Theme_windowFixedHeightMinor;
-    field public static int Theme_windowFixedWidthMajor;
-    field public static int Theme_windowFixedWidthMinor;
-    field public static int Theme_windowMinWidthMajor;
-    field public static int Theme_windowMinWidthMinor;
-    field public static int Theme_windowNoTitle;
-    field public static final int[] Toolbar;
-    field public static int Toolbar_android_gravity;
-    field public static int Toolbar_android_minHeight;
-    field public static int Toolbar_collapseContentDescription;
-    field public static int Toolbar_collapseIcon;
-    field public static int Toolbar_contentInsetEnd;
-    field public static int Toolbar_contentInsetLeft;
-    field public static int Toolbar_contentInsetRight;
-    field public static int Toolbar_contentInsetStart;
-    field public static int Toolbar_logo;
-    field public static int Toolbar_logoDescription;
-    field public static int Toolbar_maxButtonHeight;
-    field public static int Toolbar_navigationContentDescription;
-    field public static int Toolbar_navigationIcon;
-    field public static int Toolbar_popupTheme;
-    field public static int Toolbar_subtitle;
-    field public static int Toolbar_subtitleTextAppearance;
-    field public static int Toolbar_subtitleTextColor;
-    field public static int Toolbar_title;
-    field public static int Toolbar_titleMarginBottom;
-    field public static int Toolbar_titleMarginEnd;
-    field public static int Toolbar_titleMarginStart;
-    field public static int Toolbar_titleMarginTop;
-    field public static int Toolbar_titleMargins;
-    field public static int Toolbar_titleTextAppearance;
-    field public static int Toolbar_titleTextColor;
-    field public static final int[] View;
-    field public static final int[] ViewBackgroundHelper;
-    field public static int ViewBackgroundHelper_android_background;
-    field public static int ViewBackgroundHelper_backgroundTint;
-    field public static int ViewBackgroundHelper_backgroundTintMode;
-    field public static final int[] ViewStubCompat;
-    field public static int ViewStubCompat_android_id;
-    field public static int ViewStubCompat_android_inflatedId;
-    field public static int ViewStubCompat_android_layout;
-    field public static int View_android_focusable;
-    field public static int View_android_theme;
-    field public static int View_paddingEnd;
-    field public static int View_paddingStart;
-    field public static int View_theme;
-  }
-
-}
-
-package android.support.v7.graphics.drawable {
-
-  public class DrawerArrowDrawable extends android.graphics.drawable.Drawable {
-    ctor public DrawerArrowDrawable(android.content.Context);
-    method public void draw(android.graphics.Canvas);
-    method public float getArrowHeadLength();
-    method public float getArrowShaftLength();
-    method public float getBarLength();
-    method public float getBarThickness();
-    method public int getColor();
-    method public int getDirection();
-    method public float getGapSize();
-    method public int getOpacity();
-    method public final android.graphics.Paint getPaint();
-    method public float getProgress();
-    method public boolean isSpinEnabled();
-    method public void setAlpha(int);
-    method public void setArrowHeadLength(float);
-    method public void setArrowShaftLength(float);
-    method public void setBarLength(float);
-    method public void setBarThickness(float);
-    method public void setColor(int);
-    method public void setColorFilter(android.graphics.ColorFilter);
-    method public void setDirection(int);
-    method public void setGapSize(float);
-    method public void setProgress(float);
-    method public void setSpinEnabled(boolean);
-    method public void setVerticalMirror(boolean);
-    field public static final int ARROW_DIRECTION_END = 3; // 0x3
-    field public static final int ARROW_DIRECTION_LEFT = 0; // 0x0
-    field public static final int ARROW_DIRECTION_RIGHT = 1; // 0x1
-    field public static final int ARROW_DIRECTION_START = 2; // 0x2
-  }
-
-}
-
-package android.support.v7.view {
-
-  public abstract class ActionMode {
-    ctor public ActionMode();
-    method public abstract void finish();
-    method public abstract android.view.View getCustomView();
-    method public abstract android.view.Menu getMenu();
-    method public abstract android.view.MenuInflater getMenuInflater();
-    method public abstract java.lang.CharSequence getSubtitle();
-    method public java.lang.Object getTag();
-    method public abstract java.lang.CharSequence getTitle();
-    method public boolean getTitleOptionalHint();
-    method public abstract void invalidate();
-    method public boolean isTitleOptional();
-    method public abstract void setCustomView(android.view.View);
-    method public abstract void setSubtitle(java.lang.CharSequence);
-    method public abstract void setSubtitle(int);
-    method public void setTag(java.lang.Object);
-    method public abstract void setTitle(java.lang.CharSequence);
-    method public abstract void setTitle(int);
-    method public void setTitleOptionalHint(boolean);
-  }
-
-  public static abstract interface ActionMode.Callback {
-    method public abstract boolean onActionItemClicked(android.support.v7.view.ActionMode, android.view.MenuItem);
-    method public abstract boolean onCreateActionMode(android.support.v7.view.ActionMode, android.view.Menu);
-    method public abstract void onDestroyActionMode(android.support.v7.view.ActionMode);
-    method public abstract boolean onPrepareActionMode(android.support.v7.view.ActionMode, android.view.Menu);
-  }
-
-  public abstract interface CollapsibleActionView {
-    method public abstract void onActionViewCollapsed();
-    method public abstract void onActionViewExpanded();
-  }
-
-}
-
-package android.support.v7.widget {
-
-  public class ActionMenuView extends android.support.v7.widget.LinearLayoutCompat {
-    ctor public ActionMenuView(android.content.Context);
-    ctor public ActionMenuView(android.content.Context, android.util.AttributeSet);
-    method public void dismissPopupMenus();
-    method public android.view.Menu getMenu();
-    method public android.graphics.drawable.Drawable getOverflowIcon();
-    method public int getPopupTheme();
-    method public boolean hideOverflowMenu();
-    method public boolean isOverflowMenuShowing();
-    method public void onConfigurationChanged(android.content.res.Configuration);
-    method public void onDetachedFromWindow();
-    method public void setOnMenuItemClickListener(android.support.v7.widget.ActionMenuView.OnMenuItemClickListener);
-    method public void setOverflowIcon(android.graphics.drawable.Drawable);
-    method public void setPopupTheme(int);
-    method public boolean showOverflowMenu();
-  }
-
-  public static class ActionMenuView.LayoutParams extends android.support.v7.widget.LinearLayoutCompat.LayoutParams {
-    ctor public ActionMenuView.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public ActionMenuView.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public ActionMenuView.LayoutParams(android.support.v7.widget.ActionMenuView.LayoutParams);
-    ctor public ActionMenuView.LayoutParams(int, int);
-    field public int cellsUsed;
-    field public boolean expandable;
-    field public int extraPixels;
-    field public boolean isOverflowButton;
-    field public boolean preventEdgeOffset;
-  }
-
-  public static abstract interface ActionMenuView.OnMenuItemClickListener {
-    method public abstract boolean onMenuItemClick(android.view.MenuItem);
-  }
-
-  public class AppCompatAutoCompleteTextView extends android.widget.AutoCompleteTextView {
-    ctor public AppCompatAutoCompleteTextView(android.content.Context);
-    ctor public AppCompatAutoCompleteTextView(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatAutoCompleteTextView(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class AppCompatButton extends android.widget.Button {
-    ctor public AppCompatButton(android.content.Context);
-    ctor public AppCompatButton(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatButton(android.content.Context, android.util.AttributeSet, int);
-    method public void setSupportAllCaps(boolean);
-  }
-
-  public class AppCompatCheckBox extends android.widget.CheckBox {
-    ctor public AppCompatCheckBox(android.content.Context);
-    ctor public AppCompatCheckBox(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatCheckBox(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class AppCompatCheckedTextView extends android.widget.CheckedTextView {
-    ctor public AppCompatCheckedTextView(android.content.Context);
-    ctor public AppCompatCheckedTextView(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatCheckedTextView(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class AppCompatEditText extends android.widget.EditText {
-    ctor public AppCompatEditText(android.content.Context);
-    ctor public AppCompatEditText(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatEditText(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class AppCompatImageButton extends android.widget.ImageButton {
-    ctor public AppCompatImageButton(android.content.Context);
-    ctor public AppCompatImageButton(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatImageButton(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class AppCompatImageView extends android.widget.ImageView {
-    ctor public AppCompatImageView(android.content.Context);
-    ctor public AppCompatImageView(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatImageView(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class AppCompatMultiAutoCompleteTextView extends android.widget.MultiAutoCompleteTextView {
-    ctor public AppCompatMultiAutoCompleteTextView(android.content.Context);
-    ctor public AppCompatMultiAutoCompleteTextView(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatMultiAutoCompleteTextView(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class AppCompatRadioButton extends android.widget.RadioButton {
-    ctor public AppCompatRadioButton(android.content.Context);
-    ctor public AppCompatRadioButton(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatRadioButton(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class AppCompatRatingBar extends android.widget.RatingBar {
-    ctor public AppCompatRatingBar(android.content.Context);
-    ctor public AppCompatRatingBar(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatRatingBar(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class AppCompatSeekBar extends android.widget.SeekBar {
-    ctor public AppCompatSeekBar(android.content.Context);
-    ctor public AppCompatSeekBar(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatSeekBar(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class AppCompatSpinner extends android.widget.Spinner {
-    ctor public AppCompatSpinner(android.content.Context);
-    ctor public AppCompatSpinner(android.content.Context, int);
-    ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet, int);
-    ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet, int, int);
-    ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet, int, int, android.content.res.Resources.Theme);
-  }
-
-  public class AppCompatTextView extends android.widget.TextView {
-    ctor public AppCompatTextView(android.content.Context);
-    ctor public AppCompatTextView(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatTextView(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class LinearLayoutCompat extends android.view.ViewGroup {
-    ctor public LinearLayoutCompat(android.content.Context);
-    ctor public LinearLayoutCompat(android.content.Context, android.util.AttributeSet);
-    ctor public LinearLayoutCompat(android.content.Context, android.util.AttributeSet, int);
-    method public int getBaselineAlignedChildIndex();
-    method public android.graphics.drawable.Drawable getDividerDrawable();
-    method public int getDividerPadding();
-    method public int getOrientation();
-    method public int getShowDividers();
-    method public float getWeightSum();
-    method public boolean isBaselineAligned();
-    method public boolean isMeasureWithLargestChildEnabled();
-    method protected void onLayout(boolean, int, int, int, int);
-    method public void setBaselineAligned(boolean);
-    method public void setBaselineAlignedChildIndex(int);
-    method public void setDividerDrawable(android.graphics.drawable.Drawable);
-    method public void setDividerPadding(int);
-    method public void setGravity(int);
-    method public void setHorizontalGravity(int);
-    method public void setMeasureWithLargestChildEnabled(boolean);
-    method public void setOrientation(int);
-    method public void setShowDividers(int);
-    method public void setVerticalGravity(int);
-    method public void setWeightSum(float);
-    field public static final int HORIZONTAL = 0; // 0x0
-    field public static final int SHOW_DIVIDER_BEGINNING = 1; // 0x1
-    field public static final int SHOW_DIVIDER_END = 4; // 0x4
-    field public static final int SHOW_DIVIDER_MIDDLE = 2; // 0x2
-    field public static final int SHOW_DIVIDER_NONE = 0; // 0x0
-    field public static final int VERTICAL = 1; // 0x1
-  }
-
-  public static class LinearLayoutCompat.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
-    ctor public LinearLayoutCompat.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public LinearLayoutCompat.LayoutParams(int, int);
-    ctor public LinearLayoutCompat.LayoutParams(int, int, float);
-    ctor public LinearLayoutCompat.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public LinearLayoutCompat.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public LinearLayoutCompat.LayoutParams(android.support.v7.widget.LinearLayoutCompat.LayoutParams);
-    field public int gravity;
-    field public float weight;
-  }
-
-  public class ListPopupWindow {
-    ctor public ListPopupWindow(android.content.Context);
-    ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet);
-    ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet, int);
-    ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet, int, int);
-    method public void clearListSelection();
-    method public android.view.View.OnTouchListener createDragToOpenListener(android.view.View);
-    method public void dismiss();
-    method public android.view.View getAnchorView();
-    method public int getAnimationStyle();
-    method public android.graphics.drawable.Drawable getBackground();
-    method public int getHeight();
-    method public int getHorizontalOffset();
-    method public int getInputMethodMode();
-    method public android.widget.ListView getListView();
-    method public int getPromptPosition();
-    method public java.lang.Object getSelectedItem();
-    method public long getSelectedItemId();
-    method public int getSelectedItemPosition();
-    method public android.view.View getSelectedView();
-    method public int getSoftInputMode();
-    method public int getVerticalOffset();
-    method public int getWidth();
-    method public boolean isInputMethodNotNeeded();
-    method public boolean isModal();
-    method public boolean isShowing();
-    method public boolean onKeyDown(int, android.view.KeyEvent);
-    method public boolean onKeyPreIme(int, android.view.KeyEvent);
-    method public boolean onKeyUp(int, android.view.KeyEvent);
-    method public boolean performItemClick(int);
-    method public void postShow();
-    method public void setAdapter(android.widget.ListAdapter);
-    method public void setAnchorView(android.view.View);
-    method public void setAnimationStyle(int);
-    method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
-    method public void setContentWidth(int);
-    method public void setDropDownGravity(int);
-    method public void setHeight(int);
-    method public void setHorizontalOffset(int);
-    method public void setInputMethodMode(int);
-    method public void setListSelector(android.graphics.drawable.Drawable);
-    method public void setModal(boolean);
-    method public void setOnDismissListener(android.widget.PopupWindow.OnDismissListener);
-    method public void setOnItemClickListener(android.widget.AdapterView.OnItemClickListener);
-    method public void setOnItemSelectedListener(android.widget.AdapterView.OnItemSelectedListener);
-    method public void setPromptPosition(int);
-    method public void setPromptView(android.view.View);
-    method public void setSelection(int);
-    method public void setSoftInputMode(int);
-    method public void setVerticalOffset(int);
-    method public void setWidth(int);
-    method public void setWindowLayoutType(int);
-    method public void show();
-    field public static final int INPUT_METHOD_FROM_FOCUSABLE = 0; // 0x0
-    field public static final int INPUT_METHOD_NEEDED = 1; // 0x1
-    field public static final int INPUT_METHOD_NOT_NEEDED = 2; // 0x2
-    field public static final int MATCH_PARENT = -1; // 0xffffffff
-    field public static final int POSITION_PROMPT_ABOVE = 0; // 0x0
-    field public static final int POSITION_PROMPT_BELOW = 1; // 0x1
-    field public static final int WRAP_CONTENT = -2; // 0xfffffffe
-  }
-
-  public class PopupMenu {
-    ctor public PopupMenu(android.content.Context, android.view.View);
-    ctor public PopupMenu(android.content.Context, android.view.View, int);
-    ctor public PopupMenu(android.content.Context, android.view.View, int, int, int);
-    method public void dismiss();
-    method public android.view.View.OnTouchListener getDragToOpenListener();
-    method public int getGravity();
-    method public android.view.Menu getMenu();
-    method public android.view.MenuInflater getMenuInflater();
-    method public void inflate(int);
-    method public void setGravity(int);
-    method public void setOnDismissListener(android.support.v7.widget.PopupMenu.OnDismissListener);
-    method public void setOnMenuItemClickListener(android.support.v7.widget.PopupMenu.OnMenuItemClickListener);
-    method public void show();
-  }
-
-  public static abstract interface PopupMenu.OnDismissListener {
-    method public abstract void onDismiss(android.support.v7.widget.PopupMenu);
-  }
-
-  public static abstract interface PopupMenu.OnMenuItemClickListener {
-    method public abstract boolean onMenuItemClick(android.view.MenuItem);
-  }
-
-  public class SearchView extends android.support.v7.widget.LinearLayoutCompat implements android.support.v7.view.CollapsibleActionView {
-    ctor public SearchView(android.content.Context);
-    ctor public SearchView(android.content.Context, android.util.AttributeSet);
-    ctor public SearchView(android.content.Context, android.util.AttributeSet, int);
-    method public int getImeOptions();
-    method public int getInputType();
-    method public int getMaxWidth();
-    method public java.lang.CharSequence getQuery();
-    method public java.lang.CharSequence getQueryHint();
-    method public android.support.v4.widget.CursorAdapter getSuggestionsAdapter();
-    method public boolean isIconfiedByDefault();
-    method public boolean isIconified();
-    method public boolean isQueryRefinementEnabled();
-    method public boolean isSubmitButtonEnabled();
-    method public void onActionViewCollapsed();
-    method public void onActionViewExpanded();
-    method public void setIconified(boolean);
-    method public void setIconifiedByDefault(boolean);
-    method public void setImeOptions(int);
-    method public void setInputType(int);
-    method public void setMaxWidth(int);
-    method public void setOnCloseListener(android.support.v7.widget.SearchView.OnCloseListener);
-    method public void setOnQueryTextFocusChangeListener(android.view.View.OnFocusChangeListener);
-    method public void setOnQueryTextListener(android.support.v7.widget.SearchView.OnQueryTextListener);
-    method public void setOnSearchClickListener(android.view.View.OnClickListener);
-    method public void setOnSuggestionListener(android.support.v7.widget.SearchView.OnSuggestionListener);
-    method public void setQuery(java.lang.CharSequence, boolean);
-    method public void setQueryHint(java.lang.CharSequence);
-    method public void setQueryRefinementEnabled(boolean);
-    method public void setSearchableInfo(android.app.SearchableInfo);
-    method public void setSubmitButtonEnabled(boolean);
-    method public void setSuggestionsAdapter(android.support.v4.widget.CursorAdapter);
-  }
-
-  public static abstract interface SearchView.OnCloseListener {
-    method public abstract boolean onClose();
-  }
-
-  public static abstract interface SearchView.OnQueryTextListener {
-    method public abstract boolean onQueryTextChange(java.lang.String);
-    method public abstract boolean onQueryTextSubmit(java.lang.String);
-  }
-
-  public static abstract interface SearchView.OnSuggestionListener {
-    method public abstract boolean onSuggestionClick(int);
-    method public abstract boolean onSuggestionSelect(int);
-  }
-
-  public class ShareActionProvider extends android.support.v4.view.ActionProvider {
-    ctor public ShareActionProvider(android.content.Context);
-    method public android.view.View onCreateActionView();
-    method public void setOnShareTargetSelectedListener(android.support.v7.widget.ShareActionProvider.OnShareTargetSelectedListener);
-    method public void setShareHistoryFileName(java.lang.String);
-    method public void setShareIntent(android.content.Intent);
-    field public static final java.lang.String DEFAULT_SHARE_HISTORY_FILE_NAME = "share_history.xml";
-  }
-
-  public static abstract interface ShareActionProvider.OnShareTargetSelectedListener {
-    method public abstract boolean onShareTargetSelected(android.support.v7.widget.ShareActionProvider, android.content.Intent);
-  }
-
-  public class SwitchCompat extends android.widget.CompoundButton {
-    ctor public SwitchCompat(android.content.Context);
-    ctor public SwitchCompat(android.content.Context, android.util.AttributeSet);
-    ctor public SwitchCompat(android.content.Context, android.util.AttributeSet, int);
-    method public boolean getShowText();
-    method public boolean getSplitTrack();
-    method public int getSwitchMinWidth();
-    method public int getSwitchPadding();
-    method public java.lang.CharSequence getTextOff();
-    method public java.lang.CharSequence getTextOn();
-    method public android.graphics.drawable.Drawable getThumbDrawable();
-    method public int getThumbTextPadding();
-    method public android.graphics.drawable.Drawable getTrackDrawable();
-    method public void onMeasure(int, int);
-    method public void setShowText(boolean);
-    method public void setSplitTrack(boolean);
-    method public void setSwitchMinWidth(int);
-    method public void setSwitchPadding(int);
-    method public void setSwitchTextAppearance(android.content.Context, int);
-    method public void setSwitchTypeface(android.graphics.Typeface, int);
-    method public void setSwitchTypeface(android.graphics.Typeface);
-    method public void setTextOff(java.lang.CharSequence);
-    method public void setTextOn(java.lang.CharSequence);
-    method public void setThumbDrawable(android.graphics.drawable.Drawable);
-    method public void setThumbResource(int);
-    method public void setThumbTextPadding(int);
-    method public void setTrackDrawable(android.graphics.drawable.Drawable);
-    method public void setTrackResource(int);
-  }
-
-  public abstract interface ThemedSpinnerAdapter implements android.widget.SpinnerAdapter {
-    method public abstract android.content.res.Resources.Theme getDropDownViewTheme();
-    method public abstract void setDropDownViewTheme(android.content.res.Resources.Theme);
-  }
-
-  public static final class ThemedSpinnerAdapter.Helper {
-    ctor public ThemedSpinnerAdapter.Helper(android.content.Context);
-    method public android.view.LayoutInflater getDropDownViewInflater();
-    method public android.content.res.Resources.Theme getDropDownViewTheme();
-    method public void setDropDownViewTheme(android.content.res.Resources.Theme);
-  }
-
-  public class Toolbar extends android.view.ViewGroup {
-    ctor public Toolbar(android.content.Context);
-    ctor public Toolbar(android.content.Context, android.util.AttributeSet);
-    ctor public Toolbar(android.content.Context, android.util.AttributeSet, int);
-    method public void collapseActionView();
-    method public void dismissPopupMenus();
-    method public int getContentInsetEnd();
-    method public int getContentInsetLeft();
-    method public int getContentInsetRight();
-    method public int getContentInsetStart();
-    method public android.graphics.drawable.Drawable getLogo();
-    method public java.lang.CharSequence getLogoDescription();
-    method public android.view.Menu getMenu();
-    method public java.lang.CharSequence getNavigationContentDescription();
-    method public android.graphics.drawable.Drawable getNavigationIcon();
-    method public android.graphics.drawable.Drawable getOverflowIcon();
-    method public int getPopupTheme();
-    method public java.lang.CharSequence getSubtitle();
-    method public java.lang.CharSequence getTitle();
-    method public boolean hasExpandedActionView();
-    method public boolean hideOverflowMenu();
-    method public void inflateMenu(int);
-    method public boolean isOverflowMenuShowing();
-    method protected void onLayout(boolean, int, int, int, int);
-    method public void setContentInsetsAbsolute(int, int);
-    method public void setContentInsetsRelative(int, int);
-    method public void setLogo(int);
-    method public void setLogo(android.graphics.drawable.Drawable);
-    method public void setLogoDescription(int);
-    method public void setLogoDescription(java.lang.CharSequence);
-    method public void setNavigationContentDescription(int);
-    method public void setNavigationContentDescription(java.lang.CharSequence);
-    method public void setNavigationIcon(int);
-    method public void setNavigationIcon(android.graphics.drawable.Drawable);
-    method public void setNavigationOnClickListener(android.view.View.OnClickListener);
-    method public void setOnMenuItemClickListener(android.support.v7.widget.Toolbar.OnMenuItemClickListener);
-    method public void setOverflowIcon(android.graphics.drawable.Drawable);
-    method public void setPopupTheme(int);
-    method public void setSubtitle(int);
-    method public void setSubtitle(java.lang.CharSequence);
-    method public void setSubtitleTextAppearance(android.content.Context, int);
-    method public void setSubtitleTextColor(int);
-    method public void setTitle(int);
-    method public void setTitle(java.lang.CharSequence);
-    method public void setTitleTextAppearance(android.content.Context, int);
-    method public void setTitleTextColor(int);
-    method public boolean showOverflowMenu();
-  }
-
-  public static class Toolbar.LayoutParams extends android.support.v7.app.ActionBar.LayoutParams {
-    ctor public Toolbar.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public Toolbar.LayoutParams(int, int);
-    ctor public Toolbar.LayoutParams(int, int, int);
-    ctor public Toolbar.LayoutParams(int);
-    ctor public Toolbar.LayoutParams(android.support.v7.widget.Toolbar.LayoutParams);
-    ctor public Toolbar.LayoutParams(android.support.v7.app.ActionBar.LayoutParams);
-    ctor public Toolbar.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public Toolbar.LayoutParams(android.view.ViewGroup.LayoutParams);
-  }
-
-  public static abstract interface Toolbar.OnMenuItemClickListener {
-    method public abstract boolean onMenuItemClick(android.view.MenuItem);
-  }
-
-  public static class Toolbar.SavedState extends android.view.View.BaseSavedState {
-    ctor public Toolbar.SavedState(android.os.Parcel);
-    ctor public Toolbar.SavedState(android.os.Parcelable);
-    field public static final android.os.Parcelable.Creator<android.support.v7.widget.Toolbar.SavedState> CREATOR;
-  }
-
-}
-
diff --git a/v7/appcompat/api/23.1.1.txt b/v7/appcompat/api/23.1.1.txt
deleted file mode 100644
index 2d53759..0000000
--- a/v7/appcompat/api/23.1.1.txt
+++ /dev/null
@@ -1,2080 +0,0 @@
-package android.support.v7.app {
-
-  public abstract class ActionBar {
-    ctor public ActionBar();
-    method public abstract void addOnMenuVisibilityListener(android.support.v7.app.ActionBar.OnMenuVisibilityListener);
-    method public abstract deprecated void addTab(android.support.v7.app.ActionBar.Tab);
-    method public abstract deprecated void addTab(android.support.v7.app.ActionBar.Tab, boolean);
-    method public abstract deprecated void addTab(android.support.v7.app.ActionBar.Tab, int);
-    method public abstract deprecated void addTab(android.support.v7.app.ActionBar.Tab, int, boolean);
-    method public abstract android.view.View getCustomView();
-    method public abstract int getDisplayOptions();
-    method public float getElevation();
-    method public abstract int getHeight();
-    method public int getHideOffset();
-    method public abstract deprecated int getNavigationItemCount();
-    method public abstract deprecated int getNavigationMode();
-    method public abstract deprecated int getSelectedNavigationIndex();
-    method public abstract deprecated android.support.v7.app.ActionBar.Tab getSelectedTab();
-    method public abstract java.lang.CharSequence getSubtitle();
-    method public abstract deprecated android.support.v7.app.ActionBar.Tab getTabAt(int);
-    method public abstract deprecated int getTabCount();
-    method public android.content.Context getThemedContext();
-    method public abstract java.lang.CharSequence getTitle();
-    method public abstract void hide();
-    method public boolean isHideOnContentScrollEnabled();
-    method public abstract boolean isShowing();
-    method public abstract deprecated android.support.v7.app.ActionBar.Tab newTab();
-    method public abstract deprecated void removeAllTabs();
-    method public abstract void removeOnMenuVisibilityListener(android.support.v7.app.ActionBar.OnMenuVisibilityListener);
-    method public abstract deprecated void removeTab(android.support.v7.app.ActionBar.Tab);
-    method public abstract deprecated void removeTabAt(int);
-    method public abstract deprecated void selectTab(android.support.v7.app.ActionBar.Tab);
-    method public abstract void setBackgroundDrawable(android.graphics.drawable.Drawable);
-    method public abstract void setCustomView(android.view.View);
-    method public abstract void setCustomView(android.view.View, android.support.v7.app.ActionBar.LayoutParams);
-    method public abstract void setCustomView(int);
-    method public abstract void setDisplayHomeAsUpEnabled(boolean);
-    method public abstract void setDisplayOptions(int);
-    method public abstract void setDisplayOptions(int, int);
-    method public abstract void setDisplayShowCustomEnabled(boolean);
-    method public abstract void setDisplayShowHomeEnabled(boolean);
-    method public abstract void setDisplayShowTitleEnabled(boolean);
-    method public abstract void setDisplayUseLogoEnabled(boolean);
-    method public void setElevation(float);
-    method public void setHideOffset(int);
-    method public void setHideOnContentScrollEnabled(boolean);
-    method public void setHomeActionContentDescription(java.lang.CharSequence);
-    method public void setHomeActionContentDescription(int);
-    method public void setHomeAsUpIndicator(android.graphics.drawable.Drawable);
-    method public void setHomeAsUpIndicator(int);
-    method public void setHomeButtonEnabled(boolean);
-    method public abstract void setIcon(int);
-    method public abstract void setIcon(android.graphics.drawable.Drawable);
-    method public abstract deprecated void setListNavigationCallbacks(android.widget.SpinnerAdapter, android.support.v7.app.ActionBar.OnNavigationListener);
-    method public abstract void setLogo(int);
-    method public abstract void setLogo(android.graphics.drawable.Drawable);
-    method public abstract deprecated void setNavigationMode(int);
-    method public abstract deprecated void setSelectedNavigationItem(int);
-    method public void setSplitBackgroundDrawable(android.graphics.drawable.Drawable);
-    method public void setStackedBackgroundDrawable(android.graphics.drawable.Drawable);
-    method public abstract void setSubtitle(java.lang.CharSequence);
-    method public abstract void setSubtitle(int);
-    method public abstract void setTitle(java.lang.CharSequence);
-    method public abstract void setTitle(int);
-    method public abstract void show();
-    field public static final int DISPLAY_HOME_AS_UP = 4; // 0x4
-    field public static final int DISPLAY_SHOW_CUSTOM = 16; // 0x10
-    field public static final int DISPLAY_SHOW_HOME = 2; // 0x2
-    field public static final int DISPLAY_SHOW_TITLE = 8; // 0x8
-    field public static final int DISPLAY_USE_LOGO = 1; // 0x1
-    field public static final deprecated int NAVIGATION_MODE_LIST = 1; // 0x1
-    field public static final deprecated int NAVIGATION_MODE_STANDARD = 0; // 0x0
-    field public static final deprecated int NAVIGATION_MODE_TABS = 2; // 0x2
-  }
-
-  public static class ActionBar.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
-    ctor public ActionBar.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public ActionBar.LayoutParams(int, int);
-    ctor public ActionBar.LayoutParams(int, int, int);
-    ctor public ActionBar.LayoutParams(int);
-    ctor public ActionBar.LayoutParams(android.support.v7.app.ActionBar.LayoutParams);
-    ctor public ActionBar.LayoutParams(android.view.ViewGroup.LayoutParams);
-    field public int gravity;
-  }
-
-  public static abstract interface ActionBar.OnMenuVisibilityListener {
-    method public abstract void onMenuVisibilityChanged(boolean);
-  }
-
-  public static abstract deprecated interface ActionBar.OnNavigationListener {
-    method public abstract boolean onNavigationItemSelected(int, long);
-  }
-
-  public static abstract deprecated class ActionBar.Tab {
-    ctor public ActionBar.Tab();
-    method public abstract java.lang.CharSequence getContentDescription();
-    method public abstract android.view.View getCustomView();
-    method public abstract android.graphics.drawable.Drawable getIcon();
-    method public abstract int getPosition();
-    method public abstract java.lang.Object getTag();
-    method public abstract java.lang.CharSequence getText();
-    method public abstract void select();
-    method public abstract android.support.v7.app.ActionBar.Tab setContentDescription(int);
-    method public abstract android.support.v7.app.ActionBar.Tab setContentDescription(java.lang.CharSequence);
-    method public abstract android.support.v7.app.ActionBar.Tab setCustomView(android.view.View);
-    method public abstract android.support.v7.app.ActionBar.Tab setCustomView(int);
-    method public abstract android.support.v7.app.ActionBar.Tab setIcon(android.graphics.drawable.Drawable);
-    method public abstract android.support.v7.app.ActionBar.Tab setIcon(int);
-    method public abstract android.support.v7.app.ActionBar.Tab setTabListener(android.support.v7.app.ActionBar.TabListener);
-    method public abstract android.support.v7.app.ActionBar.Tab setTag(java.lang.Object);
-    method public abstract android.support.v7.app.ActionBar.Tab setText(java.lang.CharSequence);
-    method public abstract android.support.v7.app.ActionBar.Tab setText(int);
-    field public static final int INVALID_POSITION = -1; // 0xffffffff
-  }
-
-  public static abstract deprecated interface ActionBar.TabListener {
-    method public abstract void onTabReselected(android.support.v7.app.ActionBar.Tab, android.support.v4.app.FragmentTransaction);
-    method public abstract void onTabSelected(android.support.v7.app.ActionBar.Tab, android.support.v4.app.FragmentTransaction);
-    method public abstract void onTabUnselected(android.support.v7.app.ActionBar.Tab, android.support.v4.app.FragmentTransaction);
-  }
-
-  public deprecated class ActionBarActivity extends android.support.v7.app.AppCompatActivity {
-    ctor public ActionBarActivity();
-  }
-
-  public class ActionBarDrawerToggle implements android.support.v4.widget.DrawerLayout.DrawerListener {
-    ctor public ActionBarDrawerToggle(android.app.Activity, android.support.v4.widget.DrawerLayout, int, int);
-    ctor public ActionBarDrawerToggle(android.app.Activity, android.support.v4.widget.DrawerLayout, android.support.v7.widget.Toolbar, int, int);
-    method public android.view.View.OnClickListener getToolbarNavigationClickListener();
-    method public boolean isDrawerIndicatorEnabled();
-    method public void onConfigurationChanged(android.content.res.Configuration);
-    method public void onDrawerClosed(android.view.View);
-    method public void onDrawerOpened(android.view.View);
-    method public void onDrawerSlide(android.view.View, float);
-    method public void onDrawerStateChanged(int);
-    method public boolean onOptionsItemSelected(android.view.MenuItem);
-    method public void setDrawerIndicatorEnabled(boolean);
-    method public void setHomeAsUpIndicator(android.graphics.drawable.Drawable);
-    method public void setHomeAsUpIndicator(int);
-    method public void setToolbarNavigationClickListener(android.view.View.OnClickListener);
-    method public void syncState();
-  }
-
-  public static abstract interface ActionBarDrawerToggle.Delegate {
-    method public abstract android.content.Context getActionBarThemedContext();
-    method public abstract android.graphics.drawable.Drawable getThemeUpIndicator();
-    method public abstract boolean isNavigationVisible();
-    method public abstract void setActionBarDescription(int);
-    method public abstract void setActionBarUpIndicator(android.graphics.drawable.Drawable, int);
-  }
-
-  public static abstract interface ActionBarDrawerToggle.DelegateProvider {
-    method public abstract android.support.v7.app.ActionBarDrawerToggle.Delegate getDrawerToggleDelegate();
-  }
-
-  public class AlertDialog extends android.support.v7.app.AppCompatDialog implements android.content.DialogInterface {
-    ctor protected AlertDialog(android.content.Context);
-    ctor protected AlertDialog(android.content.Context, int);
-    ctor protected AlertDialog(android.content.Context, boolean, android.content.DialogInterface.OnCancelListener);
-    method public android.widget.Button getButton(int);
-    method public android.widget.ListView getListView();
-    method public void setButton(int, java.lang.CharSequence, android.os.Message);
-    method public void setButton(int, java.lang.CharSequence, android.content.DialogInterface.OnClickListener);
-    method public void setCustomTitle(android.view.View);
-    method public void setIcon(int);
-    method public void setIcon(android.graphics.drawable.Drawable);
-    method public void setIconAttribute(int);
-    method public void setMessage(java.lang.CharSequence);
-    method public void setView(android.view.View);
-    method public void setView(android.view.View, int, int, int, int);
-  }
-
-  public static class AlertDialog.Builder {
-    ctor public AlertDialog.Builder(android.content.Context);
-    ctor public AlertDialog.Builder(android.content.Context, int);
-    method public android.support.v7.app.AlertDialog create();
-    method public android.content.Context getContext();
-    method public android.support.v7.app.AlertDialog.Builder setAdapter(android.widget.ListAdapter, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setCancelable(boolean);
-    method public android.support.v7.app.AlertDialog.Builder setCursor(android.database.Cursor, android.content.DialogInterface.OnClickListener, java.lang.String);
-    method public android.support.v7.app.AlertDialog.Builder setCustomTitle(android.view.View);
-    method public android.support.v7.app.AlertDialog.Builder setIcon(int);
-    method public android.support.v7.app.AlertDialog.Builder setIcon(android.graphics.drawable.Drawable);
-    method public android.support.v7.app.AlertDialog.Builder setIconAttribute(int);
-    method public android.support.v7.app.AlertDialog.Builder setInverseBackgroundForced(boolean);
-    method public android.support.v7.app.AlertDialog.Builder setItems(int, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setItems(java.lang.CharSequence[], android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setMessage(int);
-    method public android.support.v7.app.AlertDialog.Builder setMessage(java.lang.CharSequence);
-    method public android.support.v7.app.AlertDialog.Builder setMultiChoiceItems(int, boolean[], android.content.DialogInterface.OnMultiChoiceClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setMultiChoiceItems(java.lang.CharSequence[], boolean[], android.content.DialogInterface.OnMultiChoiceClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setMultiChoiceItems(android.database.Cursor, java.lang.String, java.lang.String, android.content.DialogInterface.OnMultiChoiceClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setNegativeButton(int, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setNegativeButton(java.lang.CharSequence, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setNeutralButton(int, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setNeutralButton(java.lang.CharSequence, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setOnCancelListener(android.content.DialogInterface.OnCancelListener);
-    method public android.support.v7.app.AlertDialog.Builder setOnDismissListener(android.content.DialogInterface.OnDismissListener);
-    method public android.support.v7.app.AlertDialog.Builder setOnItemSelectedListener(android.widget.AdapterView.OnItemSelectedListener);
-    method public android.support.v7.app.AlertDialog.Builder setOnKeyListener(android.content.DialogInterface.OnKeyListener);
-    method public android.support.v7.app.AlertDialog.Builder setPositiveButton(int, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setPositiveButton(java.lang.CharSequence, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setSingleChoiceItems(int, int, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setSingleChoiceItems(android.database.Cursor, int, java.lang.String, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setSingleChoiceItems(java.lang.CharSequence[], int, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setSingleChoiceItems(android.widget.ListAdapter, int, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setTitle(int);
-    method public android.support.v7.app.AlertDialog.Builder setTitle(java.lang.CharSequence);
-    method public android.support.v7.app.AlertDialog.Builder setView(int);
-    method public android.support.v7.app.AlertDialog.Builder setView(android.view.View);
-    method public android.support.v7.app.AlertDialog show();
-  }
-
-  public class AppCompatActivity extends android.support.v4.app.FragmentActivity implements android.support.v7.app.ActionBarDrawerToggle.DelegateProvider android.support.v7.app.AppCompatCallback {
-    ctor public AppCompatActivity();
-    method public android.support.v7.app.AppCompatDelegate getDelegate();
-    method public android.support.v7.app.ActionBarDrawerToggle.Delegate getDrawerToggleDelegate();
-    method public android.support.v7.app.ActionBar getSupportActionBar();
-    method public android.content.Intent getSupportParentActivityIntent();
-    method public void onCreateSupportNavigateUpTaskStack(android.support.v4.app.TaskStackBuilder);
-    method public final boolean onMenuItemSelected(int, android.view.MenuItem);
-    method public void onPrepareSupportNavigateUpTaskStack(android.support.v4.app.TaskStackBuilder);
-    method public void onSupportActionModeFinished(android.support.v7.view.ActionMode);
-    method public void onSupportActionModeStarted(android.support.v7.view.ActionMode);
-    method public deprecated void onSupportContentChanged();
-    method public boolean onSupportNavigateUp();
-    method public android.support.v7.view.ActionMode onWindowStartingSupportActionMode(android.support.v7.view.ActionMode.Callback);
-    method public void setSupportActionBar(android.support.v7.widget.Toolbar);
-    method public deprecated void setSupportProgress(int);
-    method public deprecated void setSupportProgressBarIndeterminate(boolean);
-    method public deprecated void setSupportProgressBarIndeterminateVisibility(boolean);
-    method public deprecated void setSupportProgressBarVisibility(boolean);
-    method public android.support.v7.view.ActionMode startSupportActionMode(android.support.v7.view.ActionMode.Callback);
-    method public void supportNavigateUpTo(android.content.Intent);
-    method public boolean supportRequestWindowFeature(int);
-    method public boolean supportShouldUpRecreateTask(android.content.Intent);
-  }
-
-  public abstract interface AppCompatCallback {
-    method public abstract void onSupportActionModeFinished(android.support.v7.view.ActionMode);
-    method public abstract void onSupportActionModeStarted(android.support.v7.view.ActionMode);
-    method public abstract android.support.v7.view.ActionMode onWindowStartingSupportActionMode(android.support.v7.view.ActionMode.Callback);
-  }
-
-  public abstract class AppCompatDelegate {
-    method public abstract void addContentView(android.view.View, android.view.ViewGroup.LayoutParams);
-    method public static android.support.v7.app.AppCompatDelegate create(android.app.Activity, android.support.v7.app.AppCompatCallback);
-    method public static android.support.v7.app.AppCompatDelegate create(android.app.Dialog, android.support.v7.app.AppCompatCallback);
-    method public abstract android.view.View createView(android.view.View, java.lang.String, android.content.Context, android.util.AttributeSet);
-    method public abstract android.support.v7.app.ActionBarDrawerToggle.Delegate getDrawerToggleDelegate();
-    method public abstract android.view.MenuInflater getMenuInflater();
-    method public abstract android.support.v7.app.ActionBar getSupportActionBar();
-    method public abstract boolean hasWindowFeature(int);
-    method public abstract void installViewFactory();
-    method public abstract void invalidateOptionsMenu();
-    method public abstract boolean isHandleNativeActionModesEnabled();
-    method public abstract void onConfigurationChanged(android.content.res.Configuration);
-    method public abstract void onCreate(android.os.Bundle);
-    method public abstract void onDestroy();
-    method public abstract void onPostCreate(android.os.Bundle);
-    method public abstract void onPostResume();
-    method public abstract void onStop();
-    method public abstract boolean requestWindowFeature(int);
-    method public abstract void setContentView(android.view.View);
-    method public abstract void setContentView(int);
-    method public abstract void setContentView(android.view.View, android.view.ViewGroup.LayoutParams);
-    method public abstract void setHandleNativeActionModesEnabled(boolean);
-    method public abstract void setSupportActionBar(android.support.v7.widget.Toolbar);
-    method public abstract void setTitle(java.lang.CharSequence);
-    method public abstract android.support.v7.view.ActionMode startSupportActionMode(android.support.v7.view.ActionMode.Callback);
-    field public static final int FEATURE_ACTION_MODE_OVERLAY = 10; // 0xa
-    field public static final int FEATURE_SUPPORT_ACTION_BAR = 108; // 0x6c
-    field public static final int FEATURE_SUPPORT_ACTION_BAR_OVERLAY = 109; // 0x6d
-  }
-
-  public class AppCompatDialog extends android.app.Dialog implements android.support.v7.app.AppCompatCallback {
-    ctor public AppCompatDialog(android.content.Context);
-    ctor public AppCompatDialog(android.content.Context, int);
-    ctor protected AppCompatDialog(android.content.Context, boolean, android.content.DialogInterface.OnCancelListener);
-    method public android.support.v7.app.AppCompatDelegate getDelegate();
-    method public android.support.v7.app.ActionBar getSupportActionBar();
-    method public void onSupportActionModeFinished(android.support.v7.view.ActionMode);
-    method public void onSupportActionModeStarted(android.support.v7.view.ActionMode);
-    method public android.support.v7.view.ActionMode onWindowStartingSupportActionMode(android.support.v7.view.ActionMode.Callback);
-    method public boolean supportRequestWindowFeature(int);
-  }
-
-  public class AppCompatDialogFragment extends android.support.v4.app.DialogFragment {
-    ctor public AppCompatDialogFragment();
-  }
-
-  public class NotificationCompat extends android.support.v4.app.NotificationCompat {
-    ctor public NotificationCompat();
-  }
-
-  public static class NotificationCompat.Builder extends android.support.v4.app.NotificationCompat.Builder {
-    ctor public NotificationCompat.Builder(android.content.Context);
-  }
-
-  public static class NotificationCompat.MediaStyle extends android.support.v4.app.NotificationCompat.Style {
-    ctor public NotificationCompat.MediaStyle();
-    ctor public NotificationCompat.MediaStyle(android.support.v4.app.NotificationCompat.Builder);
-    method public android.support.v7.app.NotificationCompat.MediaStyle setCancelButtonIntent(android.app.PendingIntent);
-    method public android.support.v7.app.NotificationCompat.MediaStyle setMediaSession(android.support.v4.media.session.MediaSessionCompat.Token);
-    method public android.support.v7.app.NotificationCompat.MediaStyle setShowActionsInCompactView(int...);
-    method public android.support.v7.app.NotificationCompat.MediaStyle setShowCancelButton(boolean);
-  }
-
-}
-
-package android.support.v7.appcompat {
-
-  public final class R {
-    ctor public R();
-  }
-
-  public static final class R.anim {
-    ctor public R.anim();
-    field public static int abc_fade_in;
-    field public static int abc_fade_out;
-    field public static int abc_grow_fade_in_from_bottom;
-    field public static int abc_popup_enter;
-    field public static int abc_popup_exit;
-    field public static int abc_shrink_fade_out_from_bottom;
-    field public static int abc_slide_in_bottom;
-    field public static int abc_slide_in_top;
-    field public static int abc_slide_out_bottom;
-    field public static int abc_slide_out_top;
-  }
-
-  public static final class R.attr {
-    ctor public R.attr();
-    field public static int actionBarDivider;
-    field public static int actionBarItemBackground;
-    field public static int actionBarPopupTheme;
-    field public static int actionBarSize;
-    field public static int actionBarSplitStyle;
-    field public static int actionBarStyle;
-    field public static int actionBarTabBarStyle;
-    field public static int actionBarTabStyle;
-    field public static int actionBarTabTextStyle;
-    field public static int actionBarTheme;
-    field public static int actionBarWidgetTheme;
-    field public static int actionButtonStyle;
-    field public static int actionDropDownStyle;
-    field public static int actionLayout;
-    field public static int actionMenuTextAppearance;
-    field public static int actionMenuTextColor;
-    field public static int actionModeBackground;
-    field public static int actionModeCloseButtonStyle;
-    field public static int actionModeCloseDrawable;
-    field public static int actionModeCopyDrawable;
-    field public static int actionModeCutDrawable;
-    field public static int actionModeFindDrawable;
-    field public static int actionModePasteDrawable;
-    field public static int actionModePopupWindowStyle;
-    field public static int actionModeSelectAllDrawable;
-    field public static int actionModeShareDrawable;
-    field public static int actionModeSplitBackground;
-    field public static int actionModeStyle;
-    field public static int actionModeWebSearchDrawable;
-    field public static int actionOverflowButtonStyle;
-    field public static int actionOverflowMenuStyle;
-    field public static int actionProviderClass;
-    field public static int actionViewClass;
-    field public static int activityChooserViewStyle;
-    field public static int alertDialogButtonGroupStyle;
-    field public static int alertDialogCenterButtons;
-    field public static int alertDialogStyle;
-    field public static int alertDialogTheme;
-    field public static int allowStacking;
-    field public static int arrowHeadLength;
-    field public static int arrowShaftLength;
-    field public static int autoCompleteTextViewStyle;
-    field public static int background;
-    field public static int backgroundSplit;
-    field public static int backgroundStacked;
-    field public static int backgroundTint;
-    field public static int backgroundTintMode;
-    field public static int barLength;
-    field public static int borderlessButtonStyle;
-    field public static int buttonBarButtonStyle;
-    field public static int buttonBarNegativeButtonStyle;
-    field public static int buttonBarNeutralButtonStyle;
-    field public static int buttonBarPositiveButtonStyle;
-    field public static int buttonBarStyle;
-    field public static int buttonPanelSideLayout;
-    field public static int buttonStyle;
-    field public static int buttonStyleSmall;
-    field public static int buttonTint;
-    field public static int buttonTintMode;
-    field public static int checkboxStyle;
-    field public static int checkedTextViewStyle;
-    field public static int closeIcon;
-    field public static int closeItemLayout;
-    field public static int collapseContentDescription;
-    field public static int collapseIcon;
-    field public static int color;
-    field public static int colorAccent;
-    field public static int colorButtonNormal;
-    field public static int colorControlActivated;
-    field public static int colorControlHighlight;
-    field public static int colorControlNormal;
-    field public static int colorPrimary;
-    field public static int colorPrimaryDark;
-    field public static int colorSwitchThumbNormal;
-    field public static int commitIcon;
-    field public static int contentInsetEnd;
-    field public static int contentInsetLeft;
-    field public static int contentInsetRight;
-    field public static int contentInsetStart;
-    field public static int controlBackground;
-    field public static int customNavigationLayout;
-    field public static int defaultQueryHint;
-    field public static int dialogPreferredPadding;
-    field public static int dialogTheme;
-    field public static int displayOptions;
-    field public static int divider;
-    field public static int dividerHorizontal;
-    field public static int dividerPadding;
-    field public static int dividerVertical;
-    field public static int drawableSize;
-    field public static int drawerArrowStyle;
-    field public static int dropDownListViewStyle;
-    field public static int dropdownListPreferredItemHeight;
-    field public static int editTextBackground;
-    field public static int editTextColor;
-    field public static int editTextStyle;
-    field public static int elevation;
-    field public static int expandActivityOverflowButtonDrawable;
-    field public static int gapBetweenBars;
-    field public static int goIcon;
-    field public static int height;
-    field public static int hideOnContentScroll;
-    field public static int homeAsUpIndicator;
-    field public static int homeLayout;
-    field public static int icon;
-    field public static int iconifiedByDefault;
-    field public static int imageButtonStyle;
-    field public static int indeterminateProgressStyle;
-    field public static int initialActivityCount;
-    field public static int isLightTheme;
-    field public static int itemPadding;
-    field public static int layout;
-    field public static int listChoiceBackgroundIndicator;
-    field public static int listDividerAlertDialog;
-    field public static int listItemLayout;
-    field public static int listLayout;
-    field public static int listPopupWindowStyle;
-    field public static int listPreferredItemHeight;
-    field public static int listPreferredItemHeightLarge;
-    field public static int listPreferredItemHeightSmall;
-    field public static int listPreferredItemPaddingLeft;
-    field public static int listPreferredItemPaddingRight;
-    field public static int logo;
-    field public static int logoDescription;
-    field public static int maxButtonHeight;
-    field public static int measureWithLargestChild;
-    field public static int multiChoiceItemLayout;
-    field public static int navigationContentDescription;
-    field public static int navigationIcon;
-    field public static int navigationMode;
-    field public static int overlapAnchor;
-    field public static int paddingEnd;
-    field public static int paddingStart;
-    field public static int panelBackground;
-    field public static int panelMenuListTheme;
-    field public static int panelMenuListWidth;
-    field public static int popupMenuStyle;
-    field public static int popupTheme;
-    field public static int popupWindowStyle;
-    field public static int preserveIconSpacing;
-    field public static int progressBarPadding;
-    field public static int progressBarStyle;
-    field public static int queryBackground;
-    field public static int queryHint;
-    field public static int radioButtonStyle;
-    field public static int ratingBarStyle;
-    field public static int searchHintIcon;
-    field public static int searchIcon;
-    field public static int searchViewStyle;
-    field public static int seekBarStyle;
-    field public static int selectableItemBackground;
-    field public static int selectableItemBackgroundBorderless;
-    field public static int showAsAction;
-    field public static int showDividers;
-    field public static int showText;
-    field public static int singleChoiceItemLayout;
-    field public static int spinBars;
-    field public static int spinnerDropDownItemStyle;
-    field public static int spinnerStyle;
-    field public static int splitTrack;
-    field public static int state_above_anchor;
-    field public static int submitBackground;
-    field public static int subtitle;
-    field public static int subtitleTextAppearance;
-    field public static int subtitleTextColor;
-    field public static int subtitleTextStyle;
-    field public static int suggestionRowLayout;
-    field public static int switchMinWidth;
-    field public static int switchPadding;
-    field public static int switchStyle;
-    field public static int switchTextAppearance;
-    field public static int textAllCaps;
-    field public static int textAppearanceLargePopupMenu;
-    field public static int textAppearanceListItem;
-    field public static int textAppearanceListItemSmall;
-    field public static int textAppearanceSearchResultSubtitle;
-    field public static int textAppearanceSearchResultTitle;
-    field public static int textAppearanceSmallPopupMenu;
-    field public static int textColorAlertDialogListItem;
-    field public static int textColorSearchUrl;
-    field public static int theme;
-    field public static int thickness;
-    field public static int thumbTextPadding;
-    field public static int title;
-    field public static int titleMarginBottom;
-    field public static int titleMarginEnd;
-    field public static int titleMarginStart;
-    field public static int titleMarginTop;
-    field public static int titleMargins;
-    field public static int titleTextAppearance;
-    field public static int titleTextColor;
-    field public static int titleTextStyle;
-    field public static int toolbarNavigationButtonStyle;
-    field public static int toolbarStyle;
-    field public static int track;
-    field public static int voiceIcon;
-    field public static int windowActionBar;
-    field public static int windowActionBarOverlay;
-    field public static int windowActionModeOverlay;
-    field public static int windowFixedHeightMajor;
-    field public static int windowFixedHeightMinor;
-    field public static int windowFixedWidthMajor;
-    field public static int windowFixedWidthMinor;
-    field public static int windowMinWidthMajor;
-    field public static int windowMinWidthMinor;
-    field public static int windowNoTitle;
-  }
-
-  public static final class R.bool {
-    ctor public R.bool();
-    field public static int abc_action_bar_embed_tabs;
-    field public static int abc_action_bar_embed_tabs_pre_jb;
-    field public static int abc_action_bar_expanded_action_views_exclusive;
-    field public static int abc_allow_stacked_button_bar;
-    field public static int abc_config_actionMenuItemAllCaps;
-    field public static int abc_config_allowActionMenuItemTextWithIcon;
-    field public static int abc_config_closeDialogWhenTouchOutside;
-    field public static int abc_config_showMenuShortcutsWhenKeyboardPresent;
-  }
-
-  public static final class R.color {
-    ctor public R.color();
-    field public static int abc_background_cache_hint_selector_material_dark;
-    field public static int abc_background_cache_hint_selector_material_light;
-    field public static int abc_color_highlight_material;
-    field public static int abc_input_method_navigation_guard;
-    field public static int abc_primary_text_disable_only_material_dark;
-    field public static int abc_primary_text_disable_only_material_light;
-    field public static int abc_primary_text_material_dark;
-    field public static int abc_primary_text_material_light;
-    field public static int abc_search_url_text;
-    field public static int abc_search_url_text_normal;
-    field public static int abc_search_url_text_pressed;
-    field public static int abc_search_url_text_selected;
-    field public static int abc_secondary_text_material_dark;
-    field public static int abc_secondary_text_material_light;
-    field public static int accent_material_dark;
-    field public static int accent_material_light;
-    field public static int background_floating_material_dark;
-    field public static int background_floating_material_light;
-    field public static int background_material_dark;
-    field public static int background_material_light;
-    field public static int bright_foreground_disabled_material_dark;
-    field public static int bright_foreground_disabled_material_light;
-    field public static int bright_foreground_inverse_material_dark;
-    field public static int bright_foreground_inverse_material_light;
-    field public static int bright_foreground_material_dark;
-    field public static int bright_foreground_material_light;
-    field public static int button_material_dark;
-    field public static int button_material_light;
-    field public static int dim_foreground_disabled_material_dark;
-    field public static int dim_foreground_disabled_material_light;
-    field public static int dim_foreground_material_dark;
-    field public static int dim_foreground_material_light;
-    field public static int foreground_material_dark;
-    field public static int foreground_material_light;
-    field public static int highlighted_text_material_dark;
-    field public static int highlighted_text_material_light;
-    field public static int hint_foreground_material_dark;
-    field public static int hint_foreground_material_light;
-    field public static int material_blue_grey_800;
-    field public static int material_blue_grey_900;
-    field public static int material_blue_grey_950;
-    field public static int material_deep_teal_200;
-    field public static int material_deep_teal_500;
-    field public static int material_grey_100;
-    field public static int material_grey_300;
-    field public static int material_grey_50;
-    field public static int material_grey_600;
-    field public static int material_grey_800;
-    field public static int material_grey_850;
-    field public static int material_grey_900;
-    field public static int primary_dark_material_dark;
-    field public static int primary_dark_material_light;
-    field public static int primary_material_dark;
-    field public static int primary_material_light;
-    field public static int primary_text_default_material_dark;
-    field public static int primary_text_default_material_light;
-    field public static int primary_text_disabled_material_dark;
-    field public static int primary_text_disabled_material_light;
-    field public static int ripple_material_dark;
-    field public static int ripple_material_light;
-    field public static int secondary_text_default_material_dark;
-    field public static int secondary_text_default_material_light;
-    field public static int secondary_text_disabled_material_dark;
-    field public static int secondary_text_disabled_material_light;
-    field public static int switch_thumb_disabled_material_dark;
-    field public static int switch_thumb_disabled_material_light;
-    field public static int switch_thumb_material_dark;
-    field public static int switch_thumb_material_light;
-    field public static int switch_thumb_normal_material_dark;
-    field public static int switch_thumb_normal_material_light;
-  }
-
-  public static final class R.dimen {
-    ctor public R.dimen();
-    field public static int abc_action_bar_content_inset_material;
-    field public static int abc_action_bar_default_height_material;
-    field public static int abc_action_bar_default_padding_end_material;
-    field public static int abc_action_bar_default_padding_start_material;
-    field public static int abc_action_bar_icon_vertical_padding_material;
-    field public static int abc_action_bar_overflow_padding_end_material;
-    field public static int abc_action_bar_overflow_padding_start_material;
-    field public static int abc_action_bar_progress_bar_size;
-    field public static int abc_action_bar_stacked_max_height;
-    field public static int abc_action_bar_stacked_tab_max_width;
-    field public static int abc_action_bar_subtitle_bottom_margin_material;
-    field public static int abc_action_bar_subtitle_top_margin_material;
-    field public static int abc_action_button_min_height_material;
-    field public static int abc_action_button_min_width_material;
-    field public static int abc_action_button_min_width_overflow_material;
-    field public static int abc_alert_dialog_button_bar_height;
-    field public static int abc_button_inset_horizontal_material;
-    field public static int abc_button_inset_vertical_material;
-    field public static int abc_button_padding_horizontal_material;
-    field public static int abc_button_padding_vertical_material;
-    field public static int abc_config_prefDialogWidth;
-    field public static int abc_control_corner_material;
-    field public static int abc_control_inset_material;
-    field public static int abc_control_padding_material;
-    field public static int abc_dialog_fixed_height_major;
-    field public static int abc_dialog_fixed_height_minor;
-    field public static int abc_dialog_fixed_width_major;
-    field public static int abc_dialog_fixed_width_minor;
-    field public static int abc_dialog_list_padding_vertical_material;
-    field public static int abc_dialog_min_width_major;
-    field public static int abc_dialog_min_width_minor;
-    field public static int abc_dialog_padding_material;
-    field public static int abc_dialog_padding_top_material;
-    field public static int abc_disabled_alpha_material_dark;
-    field public static int abc_disabled_alpha_material_light;
-    field public static int abc_dropdownitem_icon_width;
-    field public static int abc_dropdownitem_text_padding_left;
-    field public static int abc_dropdownitem_text_padding_right;
-    field public static int abc_edit_text_inset_bottom_material;
-    field public static int abc_edit_text_inset_horizontal_material;
-    field public static int abc_edit_text_inset_top_material;
-    field public static int abc_floating_window_z;
-    field public static int abc_list_item_padding_horizontal_material;
-    field public static int abc_panel_menu_list_width;
-    field public static int abc_search_view_preferred_width;
-    field public static int abc_search_view_text_min_width;
-    field public static int abc_seekbar_track_background_height_material;
-    field public static int abc_seekbar_track_progress_height_material;
-    field public static int abc_select_dialog_padding_start_material;
-    field public static int abc_switch_padding;
-    field public static int abc_text_size_body_1_material;
-    field public static int abc_text_size_body_2_material;
-    field public static int abc_text_size_button_material;
-    field public static int abc_text_size_caption_material;
-    field public static int abc_text_size_display_1_material;
-    field public static int abc_text_size_display_2_material;
-    field public static int abc_text_size_display_3_material;
-    field public static int abc_text_size_display_4_material;
-    field public static int abc_text_size_headline_material;
-    field public static int abc_text_size_large_material;
-    field public static int abc_text_size_medium_material;
-    field public static int abc_text_size_menu_material;
-    field public static int abc_text_size_small_material;
-    field public static int abc_text_size_subhead_material;
-    field public static int abc_text_size_subtitle_material_toolbar;
-    field public static int abc_text_size_title_material;
-    field public static int abc_text_size_title_material_toolbar;
-    field public static int disabled_alpha_material_dark;
-    field public static int disabled_alpha_material_light;
-    field public static int highlight_alpha_material_colored;
-    field public static int highlight_alpha_material_dark;
-    field public static int highlight_alpha_material_light;
-    field public static int notification_large_icon_height;
-    field public static int notification_large_icon_width;
-    field public static int notification_subtext_size;
-  }
-
-  public static final class R.drawable {
-    ctor public R.drawable();
-    field public static int abc_ab_share_pack_mtrl_alpha;
-    field public static int abc_action_bar_item_background_material;
-    field public static int abc_btn_borderless_material;
-    field public static int abc_btn_check_material;
-    field public static int abc_btn_check_to_on_mtrl_000;
-    field public static int abc_btn_check_to_on_mtrl_015;
-    field public static int abc_btn_colored_material;
-    field public static int abc_btn_default_mtrl_shape;
-    field public static int abc_btn_radio_material;
-    field public static int abc_btn_radio_to_on_mtrl_000;
-    field public static int abc_btn_radio_to_on_mtrl_015;
-    field public static int abc_btn_rating_star_off_mtrl_alpha;
-    field public static int abc_btn_rating_star_on_mtrl_alpha;
-    field public static int abc_btn_switch_to_on_mtrl_00001;
-    field public static int abc_btn_switch_to_on_mtrl_00012;
-    field public static int abc_cab_background_internal_bg;
-    field public static int abc_cab_background_top_material;
-    field public static int abc_cab_background_top_mtrl_alpha;
-    field public static int abc_control_background_material;
-    field public static int abc_dialog_material_background_dark;
-    field public static int abc_dialog_material_background_light;
-    field public static int abc_edit_text_material;
-    field public static int abc_ic_ab_back_mtrl_am_alpha;
-    field public static int abc_ic_clear_mtrl_alpha;
-    field public static int abc_ic_commit_search_api_mtrl_alpha;
-    field public static int abc_ic_go_search_api_mtrl_alpha;
-    field public static int abc_ic_menu_copy_mtrl_am_alpha;
-    field public static int abc_ic_menu_cut_mtrl_alpha;
-    field public static int abc_ic_menu_moreoverflow_mtrl_alpha;
-    field public static int abc_ic_menu_paste_mtrl_am_alpha;
-    field public static int abc_ic_menu_selectall_mtrl_alpha;
-    field public static int abc_ic_menu_share_mtrl_alpha;
-    field public static int abc_ic_search_api_mtrl_alpha;
-    field public static int abc_ic_voice_search_api_mtrl_alpha;
-    field public static int abc_item_background_holo_dark;
-    field public static int abc_item_background_holo_light;
-    field public static int abc_list_divider_mtrl_alpha;
-    field public static int abc_list_focused_holo;
-    field public static int abc_list_longpressed_holo;
-    field public static int abc_list_pressed_holo_dark;
-    field public static int abc_list_pressed_holo_light;
-    field public static int abc_list_selector_background_transition_holo_dark;
-    field public static int abc_list_selector_background_transition_holo_light;
-    field public static int abc_list_selector_disabled_holo_dark;
-    field public static int abc_list_selector_disabled_holo_light;
-    field public static int abc_list_selector_holo_dark;
-    field public static int abc_list_selector_holo_light;
-    field public static int abc_menu_hardkey_panel_mtrl_mult;
-    field public static int abc_popup_background_mtrl_mult;
-    field public static int abc_ratingbar_full_material;
-    field public static int abc_scrubber_control_off_mtrl_alpha;
-    field public static int abc_scrubber_control_to_pressed_mtrl_000;
-    field public static int abc_scrubber_control_to_pressed_mtrl_005;
-    field public static int abc_scrubber_primary_mtrl_alpha;
-    field public static int abc_scrubber_track_mtrl_alpha;
-    field public static int abc_seekbar_thumb_material;
-    field public static int abc_seekbar_track_material;
-    field public static int abc_spinner_mtrl_am_alpha;
-    field public static int abc_spinner_textfield_background_material;
-    field public static int abc_switch_thumb_material;
-    field public static int abc_switch_track_mtrl_alpha;
-    field public static int abc_tab_indicator_material;
-    field public static int abc_tab_indicator_mtrl_alpha;
-    field public static int abc_text_cursor_material;
-    field public static int abc_textfield_activated_mtrl_alpha;
-    field public static int abc_textfield_default_mtrl_alpha;
-    field public static int abc_textfield_search_activated_mtrl_alpha;
-    field public static int abc_textfield_search_default_mtrl_alpha;
-    field public static int abc_textfield_search_material;
-    field public static int notification_template_icon_bg;
-  }
-
-  public static final class R.id {
-    ctor public R.id();
-    field public static int action0;
-    field public static int action_bar;
-    field public static int action_bar_activity_content;
-    field public static int action_bar_container;
-    field public static int action_bar_root;
-    field public static int action_bar_spinner;
-    field public static int action_bar_subtitle;
-    field public static int action_bar_title;
-    field public static int action_context_bar;
-    field public static int action_divider;
-    field public static int action_menu_divider;
-    field public static int action_menu_presenter;
-    field public static int action_mode_bar;
-    field public static int action_mode_bar_stub;
-    field public static int action_mode_close_button;
-    field public static int activity_chooser_view_content;
-    field public static int alertTitle;
-    field public static int always;
-    field public static int beginning;
-    field public static int buttonPanel;
-    field public static int cancel_action;
-    field public static int checkbox;
-    field public static int chronometer;
-    field public static int collapseActionView;
-    field public static int contentPanel;
-    field public static int custom;
-    field public static int customPanel;
-    field public static int decor_content_parent;
-    field public static int default_activity_button;
-    field public static int disableHome;
-    field public static int edit_query;
-    field public static int end;
-    field public static int end_padder;
-    field public static int expand_activities_button;
-    field public static int expanded_menu;
-    field public static int home;
-    field public static int homeAsUp;
-    field public static int icon;
-    field public static int ifRoom;
-    field public static int image;
-    field public static int info;
-    field public static int line1;
-    field public static int line3;
-    field public static int listMode;
-    field public static int list_item;
-    field public static int media_actions;
-    field public static int middle;
-    field public static int multiply;
-    field public static int never;
-    field public static int none;
-    field public static int normal;
-    field public static int parentPanel;
-    field public static int progress_circular;
-    field public static int progress_horizontal;
-    field public static int radio;
-    field public static int screen;
-    field public static int scrollIndicatorDown;
-    field public static int scrollIndicatorUp;
-    field public static int scrollView;
-    field public static int search_badge;
-    field public static int search_bar;
-    field public static int search_button;
-    field public static int search_close_btn;
-    field public static int search_edit_frame;
-    field public static int search_go_btn;
-    field public static int search_mag_icon;
-    field public static int search_plate;
-    field public static int search_src_text;
-    field public static int search_voice_btn;
-    field public static int select_dialog_listview;
-    field public static int shortcut;
-    field public static int showCustom;
-    field public static int showHome;
-    field public static int showTitle;
-    field public static int spacer;
-    field public static int split_action_bar;
-    field public static int src_atop;
-    field public static int src_in;
-    field public static int src_over;
-    field public static int status_bar_latest_event_content;
-    field public static int submit_area;
-    field public static int tabMode;
-    field public static int text;
-    field public static int text2;
-    field public static int textSpacerNoButtons;
-    field public static int time;
-    field public static int title;
-    field public static int title_template;
-    field public static int topPanel;
-    field public static int up;
-    field public static int useLogo;
-    field public static int withText;
-    field public static int wrap_content;
-  }
-
-  public static final class R.integer {
-    ctor public R.integer();
-    field public static int abc_config_activityDefaultDur;
-    field public static int abc_config_activityShortDur;
-    field public static int abc_max_action_buttons;
-    field public static int cancel_button_image_alpha;
-    field public static int status_bar_notification_info_maxnum;
-  }
-
-  public static final class R.layout {
-    ctor public R.layout();
-    field public static int abc_action_bar_title_item;
-    field public static int abc_action_bar_up_container;
-    field public static int abc_action_bar_view_list_nav_layout;
-    field public static int abc_action_menu_item_layout;
-    field public static int abc_action_menu_layout;
-    field public static int abc_action_mode_bar;
-    field public static int abc_action_mode_close_item_material;
-    field public static int abc_activity_chooser_view;
-    field public static int abc_activity_chooser_view_list_item;
-    field public static int abc_alert_dialog_button_bar_material;
-    field public static int abc_alert_dialog_material;
-    field public static int abc_dialog_title_material;
-    field public static int abc_expanded_menu_layout;
-    field public static int abc_list_menu_item_checkbox;
-    field public static int abc_list_menu_item_icon;
-    field public static int abc_list_menu_item_layout;
-    field public static int abc_list_menu_item_radio;
-    field public static int abc_popup_menu_item_layout;
-    field public static int abc_screen_content_include;
-    field public static int abc_screen_simple;
-    field public static int abc_screen_simple_overlay_action_mode;
-    field public static int abc_screen_toolbar;
-    field public static int abc_search_dropdown_item_icons_2line;
-    field public static int abc_search_view;
-    field public static int abc_select_dialog_material;
-    field public static int notification_media_action;
-    field public static int notification_media_cancel_action;
-    field public static int notification_template_big_media;
-    field public static int notification_template_big_media_narrow;
-    field public static int notification_template_lines;
-    field public static int notification_template_media;
-    field public static int notification_template_part_chronometer;
-    field public static int notification_template_part_time;
-    field public static int select_dialog_item_material;
-    field public static int select_dialog_multichoice_material;
-    field public static int select_dialog_singlechoice_material;
-    field public static int support_simple_spinner_dropdown_item;
-  }
-
-  public static final class R.string {
-    ctor public R.string();
-    field public static int abc_action_bar_home_description;
-    field public static int abc_action_bar_home_description_format;
-    field public static int abc_action_bar_home_subtitle_description_format;
-    field public static int abc_action_bar_up_description;
-    field public static int abc_action_menu_overflow_description;
-    field public static int abc_action_mode_done;
-    field public static int abc_activity_chooser_view_see_all;
-    field public static int abc_activitychooserview_choose_application;
-    field public static int abc_capital_off;
-    field public static int abc_capital_on;
-    field public static int abc_search_hint;
-    field public static int abc_searchview_description_clear;
-    field public static int abc_searchview_description_query;
-    field public static int abc_searchview_description_search;
-    field public static int abc_searchview_description_submit;
-    field public static int abc_searchview_description_voice;
-    field public static int abc_shareactionprovider_share_with;
-    field public static int abc_shareactionprovider_share_with_application;
-    field public static int abc_toolbar_collapse_description;
-    field public static int status_bar_notification_info_overflow;
-  }
-
-  public static final class R.style {
-    ctor public R.style();
-    field public static int AlertDialog_AppCompat;
-    field public static int AlertDialog_AppCompat_Light;
-    field public static int Animation_AppCompat_Dialog;
-    field public static int Animation_AppCompat_DropDownUp;
-    field public static int Base_AlertDialog_AppCompat;
-    field public static int Base_AlertDialog_AppCompat_Light;
-    field public static int Base_Animation_AppCompat_Dialog;
-    field public static int Base_Animation_AppCompat_DropDownUp;
-    field public static int Base_DialogWindowTitleBackground_AppCompat;
-    field public static int Base_DialogWindowTitle_AppCompat;
-    field public static int Base_TextAppearance_AppCompat;
-    field public static int Base_TextAppearance_AppCompat_Body1;
-    field public static int Base_TextAppearance_AppCompat_Body2;
-    field public static int Base_TextAppearance_AppCompat_Button;
-    field public static int Base_TextAppearance_AppCompat_Caption;
-    field public static int Base_TextAppearance_AppCompat_Display1;
-    field public static int Base_TextAppearance_AppCompat_Display2;
-    field public static int Base_TextAppearance_AppCompat_Display3;
-    field public static int Base_TextAppearance_AppCompat_Display4;
-    field public static int Base_TextAppearance_AppCompat_Headline;
-    field public static int Base_TextAppearance_AppCompat_Inverse;
-    field public static int Base_TextAppearance_AppCompat_Large;
-    field public static int Base_TextAppearance_AppCompat_Large_Inverse;
-    field public static int Base_TextAppearance_AppCompat_Light_Widget_PopupMenu_Large;
-    field public static int Base_TextAppearance_AppCompat_Light_Widget_PopupMenu_Small;
-    field public static int Base_TextAppearance_AppCompat_Medium;
-    field public static int Base_TextAppearance_AppCompat_Medium_Inverse;
-    field public static int Base_TextAppearance_AppCompat_Menu;
-    field public static int Base_TextAppearance_AppCompat_SearchResult;
-    field public static int Base_TextAppearance_AppCompat_SearchResult_Subtitle;
-    field public static int Base_TextAppearance_AppCompat_SearchResult_Title;
-    field public static int Base_TextAppearance_AppCompat_Small;
-    field public static int Base_TextAppearance_AppCompat_Small_Inverse;
-    field public static int Base_TextAppearance_AppCompat_Subhead;
-    field public static int Base_TextAppearance_AppCompat_Subhead_Inverse;
-    field public static int Base_TextAppearance_AppCompat_Title;
-    field public static int Base_TextAppearance_AppCompat_Title_Inverse;
-    field public static int Base_TextAppearance_AppCompat_Widget_ActionBar_Menu;
-    field public static int Base_TextAppearance_AppCompat_Widget_ActionBar_Subtitle;
-    field public static int Base_TextAppearance_AppCompat_Widget_ActionBar_Subtitle_Inverse;
-    field public static int Base_TextAppearance_AppCompat_Widget_ActionBar_Title;
-    field public static int Base_TextAppearance_AppCompat_Widget_ActionBar_Title_Inverse;
-    field public static int Base_TextAppearance_AppCompat_Widget_ActionMode_Subtitle;
-    field public static int Base_TextAppearance_AppCompat_Widget_ActionMode_Title;
-    field public static int Base_TextAppearance_AppCompat_Widget_Button;
-    field public static int Base_TextAppearance_AppCompat_Widget_Button_Inverse;
-    field public static int Base_TextAppearance_AppCompat_Widget_DropDownItem;
-    field public static int Base_TextAppearance_AppCompat_Widget_PopupMenu_Large;
-    field public static int Base_TextAppearance_AppCompat_Widget_PopupMenu_Small;
-    field public static int Base_TextAppearance_AppCompat_Widget_Switch;
-    field public static int Base_TextAppearance_AppCompat_Widget_TextView_SpinnerItem;
-    field public static int Base_TextAppearance_Widget_AppCompat_ExpandedMenu_Item;
-    field public static int Base_TextAppearance_Widget_AppCompat_Toolbar_Subtitle;
-    field public static int Base_TextAppearance_Widget_AppCompat_Toolbar_Title;
-    field public static int Base_ThemeOverlay_AppCompat;
-    field public static int Base_ThemeOverlay_AppCompat_ActionBar;
-    field public static int Base_ThemeOverlay_AppCompat_Dark;
-    field public static int Base_ThemeOverlay_AppCompat_Dark_ActionBar;
-    field public static int Base_ThemeOverlay_AppCompat_Light;
-    field public static int Base_Theme_AppCompat;
-    field public static int Base_Theme_AppCompat_CompactMenu;
-    field public static int Base_Theme_AppCompat_Dialog;
-    field public static int Base_Theme_AppCompat_DialogWhenLarge;
-    field public static int Base_Theme_AppCompat_Dialog_Alert;
-    field public static int Base_Theme_AppCompat_Dialog_FixedSize;
-    field public static int Base_Theme_AppCompat_Dialog_MinWidth;
-    field public static int Base_Theme_AppCompat_Light;
-    field public static int Base_Theme_AppCompat_Light_DarkActionBar;
-    field public static int Base_Theme_AppCompat_Light_Dialog;
-    field public static int Base_Theme_AppCompat_Light_DialogWhenLarge;
-    field public static int Base_Theme_AppCompat_Light_Dialog_Alert;
-    field public static int Base_Theme_AppCompat_Light_Dialog_FixedSize;
-    field public static int Base_Theme_AppCompat_Light_Dialog_MinWidth;
-    field public static int Base_V11_Theme_AppCompat_Dialog;
-    field public static int Base_V11_Theme_AppCompat_Light_Dialog;
-    field public static int Base_V12_Widget_AppCompat_AutoCompleteTextView;
-    field public static int Base_V12_Widget_AppCompat_EditText;
-    field public static int Base_V21_Theme_AppCompat;
-    field public static int Base_V21_Theme_AppCompat_Dialog;
-    field public static int Base_V21_Theme_AppCompat_Light;
-    field public static int Base_V21_Theme_AppCompat_Light_Dialog;
-    field public static int Base_V22_Theme_AppCompat;
-    field public static int Base_V22_Theme_AppCompat_Light;
-    field public static int Base_V23_Theme_AppCompat;
-    field public static int Base_V23_Theme_AppCompat_Light;
-    field public static int Base_V7_Theme_AppCompat;
-    field public static int Base_V7_Theme_AppCompat_Dialog;
-    field public static int Base_V7_Theme_AppCompat_Light;
-    field public static int Base_V7_Theme_AppCompat_Light_Dialog;
-    field public static int Base_V7_Widget_AppCompat_AutoCompleteTextView;
-    field public static int Base_V7_Widget_AppCompat_EditText;
-    field public static int Base_Widget_AppCompat_ActionBar;
-    field public static int Base_Widget_AppCompat_ActionBar_Solid;
-    field public static int Base_Widget_AppCompat_ActionBar_TabBar;
-    field public static int Base_Widget_AppCompat_ActionBar_TabText;
-    field public static int Base_Widget_AppCompat_ActionBar_TabView;
-    field public static int Base_Widget_AppCompat_ActionButton;
-    field public static int Base_Widget_AppCompat_ActionButton_CloseMode;
-    field public static int Base_Widget_AppCompat_ActionButton_Overflow;
-    field public static int Base_Widget_AppCompat_ActionMode;
-    field public static int Base_Widget_AppCompat_ActivityChooserView;
-    field public static int Base_Widget_AppCompat_AutoCompleteTextView;
-    field public static int Base_Widget_AppCompat_Button;
-    field public static int Base_Widget_AppCompat_ButtonBar;
-    field public static int Base_Widget_AppCompat_ButtonBar_AlertDialog;
-    field public static int Base_Widget_AppCompat_Button_Borderless;
-    field public static int Base_Widget_AppCompat_Button_Borderless_Colored;
-    field public static int Base_Widget_AppCompat_Button_ButtonBar_AlertDialog;
-    field public static int Base_Widget_AppCompat_Button_Colored;
-    field public static int Base_Widget_AppCompat_Button_Small;
-    field public static int Base_Widget_AppCompat_CompoundButton_CheckBox;
-    field public static int Base_Widget_AppCompat_CompoundButton_RadioButton;
-    field public static int Base_Widget_AppCompat_CompoundButton_Switch;
-    field public static int Base_Widget_AppCompat_DrawerArrowToggle;
-    field public static int Base_Widget_AppCompat_DrawerArrowToggle_Common;
-    field public static int Base_Widget_AppCompat_DropDownItem_Spinner;
-    field public static int Base_Widget_AppCompat_EditText;
-    field public static int Base_Widget_AppCompat_ImageButton;
-    field public static int Base_Widget_AppCompat_Light_ActionBar;
-    field public static int Base_Widget_AppCompat_Light_ActionBar_Solid;
-    field public static int Base_Widget_AppCompat_Light_ActionBar_TabBar;
-    field public static int Base_Widget_AppCompat_Light_ActionBar_TabText;
-    field public static int Base_Widget_AppCompat_Light_ActionBar_TabText_Inverse;
-    field public static int Base_Widget_AppCompat_Light_ActionBar_TabView;
-    field public static int Base_Widget_AppCompat_Light_PopupMenu;
-    field public static int Base_Widget_AppCompat_Light_PopupMenu_Overflow;
-    field public static int Base_Widget_AppCompat_ListPopupWindow;
-    field public static int Base_Widget_AppCompat_ListView;
-    field public static int Base_Widget_AppCompat_ListView_DropDown;
-    field public static int Base_Widget_AppCompat_ListView_Menu;
-    field public static int Base_Widget_AppCompat_PopupMenu;
-    field public static int Base_Widget_AppCompat_PopupMenu_Overflow;
-    field public static int Base_Widget_AppCompat_PopupWindow;
-    field public static int Base_Widget_AppCompat_ProgressBar;
-    field public static int Base_Widget_AppCompat_ProgressBar_Horizontal;
-    field public static int Base_Widget_AppCompat_RatingBar;
-    field public static int Base_Widget_AppCompat_SearchView;
-    field public static int Base_Widget_AppCompat_SearchView_ActionBar;
-    field public static int Base_Widget_AppCompat_SeekBar;
-    field public static int Base_Widget_AppCompat_Spinner;
-    field public static int Base_Widget_AppCompat_Spinner_Underlined;
-    field public static int Base_Widget_AppCompat_TextView_SpinnerItem;
-    field public static int Base_Widget_AppCompat_Toolbar;
-    field public static int Base_Widget_AppCompat_Toolbar_Button_Navigation;
-    field public static int Platform_AppCompat;
-    field public static int Platform_AppCompat_Light;
-    field public static int Platform_ThemeOverlay_AppCompat;
-    field public static int Platform_ThemeOverlay_AppCompat_Dark;
-    field public static int Platform_ThemeOverlay_AppCompat_Light;
-    field public static int Platform_V11_AppCompat;
-    field public static int Platform_V11_AppCompat_Light;
-    field public static int Platform_V14_AppCompat;
-    field public static int Platform_V14_AppCompat_Light;
-    field public static int Platform_Widget_AppCompat_Spinner;
-    field public static int RtlOverlay_DialogWindowTitle_AppCompat;
-    field public static int RtlOverlay_Widget_AppCompat_ActionBar_TitleItem;
-    field public static int RtlOverlay_Widget_AppCompat_DialogTitle_Icon;
-    field public static int RtlOverlay_Widget_AppCompat_PopupMenuItem;
-    field public static int RtlOverlay_Widget_AppCompat_PopupMenuItem_InternalGroup;
-    field public static int RtlOverlay_Widget_AppCompat_PopupMenuItem_Text;
-    field public static int RtlOverlay_Widget_AppCompat_SearchView_MagIcon;
-    field public static int RtlOverlay_Widget_AppCompat_Search_DropDown;
-    field public static int RtlOverlay_Widget_AppCompat_Search_DropDown_Icon1;
-    field public static int RtlOverlay_Widget_AppCompat_Search_DropDown_Icon2;
-    field public static int RtlOverlay_Widget_AppCompat_Search_DropDown_Query;
-    field public static int RtlOverlay_Widget_AppCompat_Search_DropDown_Text;
-    field public static int RtlUnderlay_Widget_AppCompat_ActionButton;
-    field public static int RtlUnderlay_Widget_AppCompat_ActionButton_Overflow;
-    field public static int TextAppearance_AppCompat;
-    field public static int TextAppearance_AppCompat_Body1;
-    field public static int TextAppearance_AppCompat_Body2;
-    field public static int TextAppearance_AppCompat_Button;
-    field public static int TextAppearance_AppCompat_Caption;
-    field public static int TextAppearance_AppCompat_Display1;
-    field public static int TextAppearance_AppCompat_Display2;
-    field public static int TextAppearance_AppCompat_Display3;
-    field public static int TextAppearance_AppCompat_Display4;
-    field public static int TextAppearance_AppCompat_Headline;
-    field public static int TextAppearance_AppCompat_Inverse;
-    field public static int TextAppearance_AppCompat_Large;
-    field public static int TextAppearance_AppCompat_Large_Inverse;
-    field public static int TextAppearance_AppCompat_Light_SearchResult_Subtitle;
-    field public static int TextAppearance_AppCompat_Light_SearchResult_Title;
-    field public static int TextAppearance_AppCompat_Light_Widget_PopupMenu_Large;
-    field public static int TextAppearance_AppCompat_Light_Widget_PopupMenu_Small;
-    field public static int TextAppearance_AppCompat_Medium;
-    field public static int TextAppearance_AppCompat_Medium_Inverse;
-    field public static int TextAppearance_AppCompat_Menu;
-    field public static int TextAppearance_AppCompat_SearchResult_Subtitle;
-    field public static int TextAppearance_AppCompat_SearchResult_Title;
-    field public static int TextAppearance_AppCompat_Small;
-    field public static int TextAppearance_AppCompat_Small_Inverse;
-    field public static int TextAppearance_AppCompat_Subhead;
-    field public static int TextAppearance_AppCompat_Subhead_Inverse;
-    field public static int TextAppearance_AppCompat_Title;
-    field public static int TextAppearance_AppCompat_Title_Inverse;
-    field public static int TextAppearance_AppCompat_Widget_ActionBar_Menu;
-    field public static int TextAppearance_AppCompat_Widget_ActionBar_Subtitle;
-    field public static int TextAppearance_AppCompat_Widget_ActionBar_Subtitle_Inverse;
-    field public static int TextAppearance_AppCompat_Widget_ActionBar_Title;
-    field public static int TextAppearance_AppCompat_Widget_ActionBar_Title_Inverse;
-    field public static int TextAppearance_AppCompat_Widget_ActionMode_Subtitle;
-    field public static int TextAppearance_AppCompat_Widget_ActionMode_Subtitle_Inverse;
-    field public static int TextAppearance_AppCompat_Widget_ActionMode_Title;
-    field public static int TextAppearance_AppCompat_Widget_ActionMode_Title_Inverse;
-    field public static int TextAppearance_AppCompat_Widget_Button;
-    field public static int TextAppearance_AppCompat_Widget_Button_Inverse;
-    field public static int TextAppearance_AppCompat_Widget_DropDownItem;
-    field public static int TextAppearance_AppCompat_Widget_PopupMenu_Large;
-    field public static int TextAppearance_AppCompat_Widget_PopupMenu_Small;
-    field public static int TextAppearance_AppCompat_Widget_Switch;
-    field public static int TextAppearance_AppCompat_Widget_TextView_SpinnerItem;
-    field public static int TextAppearance_StatusBar_EventContent;
-    field public static int TextAppearance_StatusBar_EventContent_Info;
-    field public static int TextAppearance_StatusBar_EventContent_Line2;
-    field public static int TextAppearance_StatusBar_EventContent_Time;
-    field public static int TextAppearance_StatusBar_EventContent_Title;
-    field public static int TextAppearance_Widget_AppCompat_ExpandedMenu_Item;
-    field public static int TextAppearance_Widget_AppCompat_Toolbar_Subtitle;
-    field public static int TextAppearance_Widget_AppCompat_Toolbar_Title;
-    field public static int ThemeOverlay_AppCompat;
-    field public static int ThemeOverlay_AppCompat_ActionBar;
-    field public static int ThemeOverlay_AppCompat_Dark;
-    field public static int ThemeOverlay_AppCompat_Dark_ActionBar;
-    field public static int ThemeOverlay_AppCompat_Light;
-    field public static int Theme_AppCompat;
-    field public static int Theme_AppCompat_CompactMenu;
-    field public static int Theme_AppCompat_Dialog;
-    field public static int Theme_AppCompat_DialogWhenLarge;
-    field public static int Theme_AppCompat_Dialog_Alert;
-    field public static int Theme_AppCompat_Dialog_MinWidth;
-    field public static int Theme_AppCompat_Light;
-    field public static int Theme_AppCompat_Light_DarkActionBar;
-    field public static int Theme_AppCompat_Light_Dialog;
-    field public static int Theme_AppCompat_Light_DialogWhenLarge;
-    field public static int Theme_AppCompat_Light_Dialog_Alert;
-    field public static int Theme_AppCompat_Light_Dialog_MinWidth;
-    field public static int Theme_AppCompat_Light_NoActionBar;
-    field public static int Theme_AppCompat_NoActionBar;
-    field public static int Widget_AppCompat_ActionBar;
-    field public static int Widget_AppCompat_ActionBar_Solid;
-    field public static int Widget_AppCompat_ActionBar_TabBar;
-    field public static int Widget_AppCompat_ActionBar_TabText;
-    field public static int Widget_AppCompat_ActionBar_TabView;
-    field public static int Widget_AppCompat_ActionButton;
-    field public static int Widget_AppCompat_ActionButton_CloseMode;
-    field public static int Widget_AppCompat_ActionButton_Overflow;
-    field public static int Widget_AppCompat_ActionMode;
-    field public static int Widget_AppCompat_ActivityChooserView;
-    field public static int Widget_AppCompat_AutoCompleteTextView;
-    field public static int Widget_AppCompat_Button;
-    field public static int Widget_AppCompat_ButtonBar;
-    field public static int Widget_AppCompat_ButtonBar_AlertDialog;
-    field public static int Widget_AppCompat_Button_Borderless;
-    field public static int Widget_AppCompat_Button_Borderless_Colored;
-    field public static int Widget_AppCompat_Button_ButtonBar_AlertDialog;
-    field public static int Widget_AppCompat_Button_Colored;
-    field public static int Widget_AppCompat_Button_Small;
-    field public static int Widget_AppCompat_CompoundButton_CheckBox;
-    field public static int Widget_AppCompat_CompoundButton_RadioButton;
-    field public static int Widget_AppCompat_CompoundButton_Switch;
-    field public static int Widget_AppCompat_DrawerArrowToggle;
-    field public static int Widget_AppCompat_DropDownItem_Spinner;
-    field public static int Widget_AppCompat_EditText;
-    field public static int Widget_AppCompat_ImageButton;
-    field public static int Widget_AppCompat_Light_ActionBar;
-    field public static int Widget_AppCompat_Light_ActionBar_Solid;
-    field public static int Widget_AppCompat_Light_ActionBar_Solid_Inverse;
-    field public static int Widget_AppCompat_Light_ActionBar_TabBar;
-    field public static int Widget_AppCompat_Light_ActionBar_TabBar_Inverse;
-    field public static int Widget_AppCompat_Light_ActionBar_TabText;
-    field public static int Widget_AppCompat_Light_ActionBar_TabText_Inverse;
-    field public static int Widget_AppCompat_Light_ActionBar_TabView;
-    field public static int Widget_AppCompat_Light_ActionBar_TabView_Inverse;
-    field public static int Widget_AppCompat_Light_ActionButton;
-    field public static int Widget_AppCompat_Light_ActionButton_CloseMode;
-    field public static int Widget_AppCompat_Light_ActionButton_Overflow;
-    field public static int Widget_AppCompat_Light_ActionMode_Inverse;
-    field public static int Widget_AppCompat_Light_ActivityChooserView;
-    field public static int Widget_AppCompat_Light_AutoCompleteTextView;
-    field public static int Widget_AppCompat_Light_DropDownItem_Spinner;
-    field public static int Widget_AppCompat_Light_ListPopupWindow;
-    field public static int Widget_AppCompat_Light_ListView_DropDown;
-    field public static int Widget_AppCompat_Light_PopupMenu;
-    field public static int Widget_AppCompat_Light_PopupMenu_Overflow;
-    field public static int Widget_AppCompat_Light_SearchView;
-    field public static int Widget_AppCompat_Light_Spinner_DropDown_ActionBar;
-    field public static int Widget_AppCompat_ListPopupWindow;
-    field public static int Widget_AppCompat_ListView;
-    field public static int Widget_AppCompat_ListView_DropDown;
-    field public static int Widget_AppCompat_ListView_Menu;
-    field public static int Widget_AppCompat_PopupMenu;
-    field public static int Widget_AppCompat_PopupMenu_Overflow;
-    field public static int Widget_AppCompat_PopupWindow;
-    field public static int Widget_AppCompat_ProgressBar;
-    field public static int Widget_AppCompat_ProgressBar_Horizontal;
-    field public static int Widget_AppCompat_RatingBar;
-    field public static int Widget_AppCompat_SearchView;
-    field public static int Widget_AppCompat_SearchView_ActionBar;
-    field public static int Widget_AppCompat_SeekBar;
-    field public static int Widget_AppCompat_Spinner;
-    field public static int Widget_AppCompat_Spinner_DropDown;
-    field public static int Widget_AppCompat_Spinner_DropDown_ActionBar;
-    field public static int Widget_AppCompat_Spinner_Underlined;
-    field public static int Widget_AppCompat_TextView_SpinnerItem;
-    field public static int Widget_AppCompat_Toolbar;
-    field public static int Widget_AppCompat_Toolbar_Button_Navigation;
-  }
-
-  public static final class R.styleable {
-    ctor public R.styleable();
-    field public static final int[] ActionBar;
-    field public static final int[] ActionBarLayout;
-    field public static int ActionBarLayout_android_layout_gravity;
-    field public static int ActionBar_background;
-    field public static int ActionBar_backgroundSplit;
-    field public static int ActionBar_backgroundStacked;
-    field public static int ActionBar_contentInsetEnd;
-    field public static int ActionBar_contentInsetLeft;
-    field public static int ActionBar_contentInsetRight;
-    field public static int ActionBar_contentInsetStart;
-    field public static int ActionBar_customNavigationLayout;
-    field public static int ActionBar_displayOptions;
-    field public static int ActionBar_divider;
-    field public static int ActionBar_elevation;
-    field public static int ActionBar_height;
-    field public static int ActionBar_hideOnContentScroll;
-    field public static int ActionBar_homeAsUpIndicator;
-    field public static int ActionBar_homeLayout;
-    field public static int ActionBar_icon;
-    field public static int ActionBar_indeterminateProgressStyle;
-    field public static int ActionBar_itemPadding;
-    field public static int ActionBar_logo;
-    field public static int ActionBar_navigationMode;
-    field public static int ActionBar_popupTheme;
-    field public static int ActionBar_progressBarPadding;
-    field public static int ActionBar_progressBarStyle;
-    field public static int ActionBar_subtitle;
-    field public static int ActionBar_subtitleTextStyle;
-    field public static int ActionBar_title;
-    field public static int ActionBar_titleTextStyle;
-    field public static final int[] ActionMenuItemView;
-    field public static int ActionMenuItemView_android_minWidth;
-    field public static final int[] ActionMenuView;
-    field public static final int[] ActionMode;
-    field public static int ActionMode_background;
-    field public static int ActionMode_backgroundSplit;
-    field public static int ActionMode_closeItemLayout;
-    field public static int ActionMode_height;
-    field public static int ActionMode_subtitleTextStyle;
-    field public static int ActionMode_titleTextStyle;
-    field public static final int[] ActivityChooserView;
-    field public static int ActivityChooserView_expandActivityOverflowButtonDrawable;
-    field public static int ActivityChooserView_initialActivityCount;
-    field public static final int[] AlertDialog;
-    field public static int AlertDialog_android_layout;
-    field public static int AlertDialog_buttonPanelSideLayout;
-    field public static int AlertDialog_listItemLayout;
-    field public static int AlertDialog_listLayout;
-    field public static int AlertDialog_multiChoiceItemLayout;
-    field public static int AlertDialog_singleChoiceItemLayout;
-    field public static final int[] AppCompatTextView;
-    field public static int AppCompatTextView_android_textAppearance;
-    field public static int AppCompatTextView_textAllCaps;
-    field public static int ButtonBarLayout_allowStacking;
-    field public static final int[] CompoundButton;
-    field public static int CompoundButton_android_button;
-    field public static int CompoundButton_buttonTint;
-    field public static int CompoundButton_buttonTintMode;
-    field public static final int[] DrawerArrowToggle;
-    field public static int DrawerArrowToggle_arrowHeadLength;
-    field public static int DrawerArrowToggle_arrowShaftLength;
-    field public static int DrawerArrowToggle_barLength;
-    field public static int DrawerArrowToggle_color;
-    field public static int DrawerArrowToggle_drawableSize;
-    field public static int DrawerArrowToggle_gapBetweenBars;
-    field public static int DrawerArrowToggle_spinBars;
-    field public static int DrawerArrowToggle_thickness;
-    field public static final int[] LinearLayoutCompat;
-    field public static final int[] LinearLayoutCompat_Layout;
-    field public static int LinearLayoutCompat_Layout_android_layout_gravity;
-    field public static int LinearLayoutCompat_Layout_android_layout_height;
-    field public static int LinearLayoutCompat_Layout_android_layout_weight;
-    field public static int LinearLayoutCompat_Layout_android_layout_width;
-    field public static int LinearLayoutCompat_android_baselineAligned;
-    field public static int LinearLayoutCompat_android_baselineAlignedChildIndex;
-    field public static int LinearLayoutCompat_android_gravity;
-    field public static int LinearLayoutCompat_android_orientation;
-    field public static int LinearLayoutCompat_android_weightSum;
-    field public static int LinearLayoutCompat_divider;
-    field public static int LinearLayoutCompat_dividerPadding;
-    field public static int LinearLayoutCompat_measureWithLargestChild;
-    field public static int LinearLayoutCompat_showDividers;
-    field public static final int[] ListPopupWindow;
-    field public static int ListPopupWindow_android_dropDownHorizontalOffset;
-    field public static int ListPopupWindow_android_dropDownVerticalOffset;
-    field public static final int[] MenuGroup;
-    field public static int MenuGroup_android_checkableBehavior;
-    field public static int MenuGroup_android_enabled;
-    field public static int MenuGroup_android_id;
-    field public static int MenuGroup_android_menuCategory;
-    field public static int MenuGroup_android_orderInCategory;
-    field public static int MenuGroup_android_visible;
-    field public static final int[] MenuItem;
-    field public static int MenuItem_actionLayout;
-    field public static int MenuItem_actionProviderClass;
-    field public static int MenuItem_actionViewClass;
-    field public static int MenuItem_android_alphabeticShortcut;
-    field public static int MenuItem_android_checkable;
-    field public static int MenuItem_android_checked;
-    field public static int MenuItem_android_enabled;
-    field public static int MenuItem_android_icon;
-    field public static int MenuItem_android_id;
-    field public static int MenuItem_android_menuCategory;
-    field public static int MenuItem_android_numericShortcut;
-    field public static int MenuItem_android_onClick;
-    field public static int MenuItem_android_orderInCategory;
-    field public static int MenuItem_android_title;
-    field public static int MenuItem_android_titleCondensed;
-    field public static int MenuItem_android_visible;
-    field public static int MenuItem_showAsAction;
-    field public static final int[] MenuView;
-    field public static int MenuView_android_headerBackground;
-    field public static int MenuView_android_horizontalDivider;
-    field public static int MenuView_android_itemBackground;
-    field public static int MenuView_android_itemIconDisabledAlpha;
-    field public static int MenuView_android_itemTextAppearance;
-    field public static int MenuView_android_verticalDivider;
-    field public static int MenuView_android_windowAnimationStyle;
-    field public static int MenuView_preserveIconSpacing;
-    field public static final int[] PopupWindow;
-    field public static final int[] PopupWindowBackgroundState;
-    field public static int PopupWindowBackgroundState_state_above_anchor;
-    field public static int PopupWindow_android_popupBackground;
-    field public static int PopupWindow_overlapAnchor;
-    field public static final int[] SearchView;
-    field public static int SearchView_android_focusable;
-    field public static int SearchView_android_imeOptions;
-    field public static int SearchView_android_inputType;
-    field public static int SearchView_android_maxWidth;
-    field public static int SearchView_closeIcon;
-    field public static int SearchView_commitIcon;
-    field public static int SearchView_defaultQueryHint;
-    field public static int SearchView_goIcon;
-    field public static int SearchView_iconifiedByDefault;
-    field public static int SearchView_layout;
-    field public static int SearchView_queryBackground;
-    field public static int SearchView_queryHint;
-    field public static int SearchView_searchHintIcon;
-    field public static int SearchView_searchIcon;
-    field public static int SearchView_submitBackground;
-    field public static int SearchView_suggestionRowLayout;
-    field public static int SearchView_voiceIcon;
-    field public static final int[] Spinner;
-    field public static int Spinner_android_dropDownWidth;
-    field public static int Spinner_android_popupBackground;
-    field public static int Spinner_android_prompt;
-    field public static int Spinner_popupTheme;
-    field public static final int[] SwitchCompat;
-    field public static int SwitchCompat_android_textOff;
-    field public static int SwitchCompat_android_textOn;
-    field public static int SwitchCompat_android_thumb;
-    field public static int SwitchCompat_showText;
-    field public static int SwitchCompat_splitTrack;
-    field public static int SwitchCompat_switchMinWidth;
-    field public static int SwitchCompat_switchPadding;
-    field public static int SwitchCompat_switchTextAppearance;
-    field public static int SwitchCompat_thumbTextPadding;
-    field public static int SwitchCompat_track;
-    field public static final int[] TextAppearance;
-    field public static int TextAppearance_android_shadowColor;
-    field public static int TextAppearance_android_shadowDx;
-    field public static int TextAppearance_android_shadowDy;
-    field public static int TextAppearance_android_shadowRadius;
-    field public static int TextAppearance_android_textColor;
-    field public static int TextAppearance_android_textSize;
-    field public static int TextAppearance_android_textStyle;
-    field public static int TextAppearance_android_typeface;
-    field public static int TextAppearance_textAllCaps;
-    field public static final int[] Theme;
-    field public static int Theme_actionBarDivider;
-    field public static int Theme_actionBarItemBackground;
-    field public static int Theme_actionBarPopupTheme;
-    field public static int Theme_actionBarSize;
-    field public static int Theme_actionBarSplitStyle;
-    field public static int Theme_actionBarStyle;
-    field public static int Theme_actionBarTabBarStyle;
-    field public static int Theme_actionBarTabStyle;
-    field public static int Theme_actionBarTabTextStyle;
-    field public static int Theme_actionBarTheme;
-    field public static int Theme_actionBarWidgetTheme;
-    field public static int Theme_actionButtonStyle;
-    field public static int Theme_actionDropDownStyle;
-    field public static int Theme_actionMenuTextAppearance;
-    field public static int Theme_actionMenuTextColor;
-    field public static int Theme_actionModeBackground;
-    field public static int Theme_actionModeCloseButtonStyle;
-    field public static int Theme_actionModeCloseDrawable;
-    field public static int Theme_actionModeCopyDrawable;
-    field public static int Theme_actionModeCutDrawable;
-    field public static int Theme_actionModeFindDrawable;
-    field public static int Theme_actionModePasteDrawable;
-    field public static int Theme_actionModePopupWindowStyle;
-    field public static int Theme_actionModeSelectAllDrawable;
-    field public static int Theme_actionModeShareDrawable;
-    field public static int Theme_actionModeSplitBackground;
-    field public static int Theme_actionModeStyle;
-    field public static int Theme_actionModeWebSearchDrawable;
-    field public static int Theme_actionOverflowButtonStyle;
-    field public static int Theme_actionOverflowMenuStyle;
-    field public static int Theme_activityChooserViewStyle;
-    field public static int Theme_alertDialogButtonGroupStyle;
-    field public static int Theme_alertDialogCenterButtons;
-    field public static int Theme_alertDialogStyle;
-    field public static int Theme_alertDialogTheme;
-    field public static int Theme_android_windowAnimationStyle;
-    field public static int Theme_android_windowIsFloating;
-    field public static int Theme_autoCompleteTextViewStyle;
-    field public static int Theme_borderlessButtonStyle;
-    field public static int Theme_buttonBarButtonStyle;
-    field public static int Theme_buttonBarNegativeButtonStyle;
-    field public static int Theme_buttonBarNeutralButtonStyle;
-    field public static int Theme_buttonBarPositiveButtonStyle;
-    field public static int Theme_buttonBarStyle;
-    field public static int Theme_buttonStyle;
-    field public static int Theme_buttonStyleSmall;
-    field public static int Theme_checkboxStyle;
-    field public static int Theme_checkedTextViewStyle;
-    field public static int Theme_colorAccent;
-    field public static int Theme_colorButtonNormal;
-    field public static int Theme_colorControlActivated;
-    field public static int Theme_colorControlHighlight;
-    field public static int Theme_colorControlNormal;
-    field public static int Theme_colorPrimary;
-    field public static int Theme_colorPrimaryDark;
-    field public static int Theme_colorSwitchThumbNormal;
-    field public static int Theme_controlBackground;
-    field public static int Theme_dialogPreferredPadding;
-    field public static int Theme_dialogTheme;
-    field public static int Theme_dividerHorizontal;
-    field public static int Theme_dividerVertical;
-    field public static int Theme_dropDownListViewStyle;
-    field public static int Theme_dropdownListPreferredItemHeight;
-    field public static int Theme_editTextBackground;
-    field public static int Theme_editTextColor;
-    field public static int Theme_editTextStyle;
-    field public static int Theme_homeAsUpIndicator;
-    field public static int Theme_imageButtonStyle;
-    field public static int Theme_listChoiceBackgroundIndicator;
-    field public static int Theme_listDividerAlertDialog;
-    field public static int Theme_listPopupWindowStyle;
-    field public static int Theme_listPreferredItemHeight;
-    field public static int Theme_listPreferredItemHeightLarge;
-    field public static int Theme_listPreferredItemHeightSmall;
-    field public static int Theme_listPreferredItemPaddingLeft;
-    field public static int Theme_listPreferredItemPaddingRight;
-    field public static int Theme_panelBackground;
-    field public static int Theme_panelMenuListTheme;
-    field public static int Theme_panelMenuListWidth;
-    field public static int Theme_popupMenuStyle;
-    field public static int Theme_popupWindowStyle;
-    field public static int Theme_radioButtonStyle;
-    field public static int Theme_ratingBarStyle;
-    field public static int Theme_searchViewStyle;
-    field public static int Theme_seekBarStyle;
-    field public static int Theme_selectableItemBackground;
-    field public static int Theme_selectableItemBackgroundBorderless;
-    field public static int Theme_spinnerDropDownItemStyle;
-    field public static int Theme_spinnerStyle;
-    field public static int Theme_switchStyle;
-    field public static int Theme_textAppearanceLargePopupMenu;
-    field public static int Theme_textAppearanceListItem;
-    field public static int Theme_textAppearanceListItemSmall;
-    field public static int Theme_textAppearanceSearchResultSubtitle;
-    field public static int Theme_textAppearanceSearchResultTitle;
-    field public static int Theme_textAppearanceSmallPopupMenu;
-    field public static int Theme_textColorAlertDialogListItem;
-    field public static int Theme_textColorSearchUrl;
-    field public static int Theme_toolbarNavigationButtonStyle;
-    field public static int Theme_toolbarStyle;
-    field public static int Theme_windowActionBar;
-    field public static int Theme_windowActionBarOverlay;
-    field public static int Theme_windowActionModeOverlay;
-    field public static int Theme_windowFixedHeightMajor;
-    field public static int Theme_windowFixedHeightMinor;
-    field public static int Theme_windowFixedWidthMajor;
-    field public static int Theme_windowFixedWidthMinor;
-    field public static int Theme_windowMinWidthMajor;
-    field public static int Theme_windowMinWidthMinor;
-    field public static int Theme_windowNoTitle;
-    field public static final int[] Toolbar;
-    field public static int Toolbar_android_gravity;
-    field public static int Toolbar_android_minHeight;
-    field public static int Toolbar_collapseContentDescription;
-    field public static int Toolbar_collapseIcon;
-    field public static int Toolbar_contentInsetEnd;
-    field public static int Toolbar_contentInsetLeft;
-    field public static int Toolbar_contentInsetRight;
-    field public static int Toolbar_contentInsetStart;
-    field public static int Toolbar_logo;
-    field public static int Toolbar_logoDescription;
-    field public static int Toolbar_maxButtonHeight;
-    field public static int Toolbar_navigationContentDescription;
-    field public static int Toolbar_navigationIcon;
-    field public static int Toolbar_popupTheme;
-    field public static int Toolbar_subtitle;
-    field public static int Toolbar_subtitleTextAppearance;
-    field public static int Toolbar_subtitleTextColor;
-    field public static int Toolbar_title;
-    field public static int Toolbar_titleMarginBottom;
-    field public static int Toolbar_titleMarginEnd;
-    field public static int Toolbar_titleMarginStart;
-    field public static int Toolbar_titleMarginTop;
-    field public static int Toolbar_titleMargins;
-    field public static int Toolbar_titleTextAppearance;
-    field public static int Toolbar_titleTextColor;
-    field public static final int[] View;
-    field public static final int[] ViewBackgroundHelper;
-    field public static int ViewBackgroundHelper_android_background;
-    field public static int ViewBackgroundHelper_backgroundTint;
-    field public static int ViewBackgroundHelper_backgroundTintMode;
-    field public static final int[] ViewStubCompat;
-    field public static int ViewStubCompat_android_id;
-    field public static int ViewStubCompat_android_inflatedId;
-    field public static int ViewStubCompat_android_layout;
-    field public static int View_android_focusable;
-    field public static int View_android_theme;
-    field public static int View_paddingEnd;
-    field public static int View_paddingStart;
-    field public static int View_theme;
-  }
-
-}
-
-package android.support.v7.graphics.drawable {
-
-  public class DrawerArrowDrawable extends android.graphics.drawable.Drawable {
-    ctor public DrawerArrowDrawable(android.content.Context);
-    method public void draw(android.graphics.Canvas);
-    method public float getArrowHeadLength();
-    method public float getArrowShaftLength();
-    method public float getBarLength();
-    method public float getBarThickness();
-    method public int getColor();
-    method public int getDirection();
-    method public float getGapSize();
-    method public int getOpacity();
-    method public final android.graphics.Paint getPaint();
-    method public float getProgress();
-    method public boolean isSpinEnabled();
-    method public void setAlpha(int);
-    method public void setArrowHeadLength(float);
-    method public void setArrowShaftLength(float);
-    method public void setBarLength(float);
-    method public void setBarThickness(float);
-    method public void setColor(int);
-    method public void setColorFilter(android.graphics.ColorFilter);
-    method public void setDirection(int);
-    method public void setGapSize(float);
-    method public void setProgress(float);
-    method public void setSpinEnabled(boolean);
-    method public void setVerticalMirror(boolean);
-    field public static final int ARROW_DIRECTION_END = 3; // 0x3
-    field public static final int ARROW_DIRECTION_LEFT = 0; // 0x0
-    field public static final int ARROW_DIRECTION_RIGHT = 1; // 0x1
-    field public static final int ARROW_DIRECTION_START = 2; // 0x2
-  }
-
-}
-
-package android.support.v7.view {
-
-  public abstract class ActionMode {
-    ctor public ActionMode();
-    method public abstract void finish();
-    method public abstract android.view.View getCustomView();
-    method public abstract android.view.Menu getMenu();
-    method public abstract android.view.MenuInflater getMenuInflater();
-    method public abstract java.lang.CharSequence getSubtitle();
-    method public java.lang.Object getTag();
-    method public abstract java.lang.CharSequence getTitle();
-    method public boolean getTitleOptionalHint();
-    method public abstract void invalidate();
-    method public boolean isTitleOptional();
-    method public abstract void setCustomView(android.view.View);
-    method public abstract void setSubtitle(java.lang.CharSequence);
-    method public abstract void setSubtitle(int);
-    method public void setTag(java.lang.Object);
-    method public abstract void setTitle(java.lang.CharSequence);
-    method public abstract void setTitle(int);
-    method public void setTitleOptionalHint(boolean);
-  }
-
-  public static abstract interface ActionMode.Callback {
-    method public abstract boolean onActionItemClicked(android.support.v7.view.ActionMode, android.view.MenuItem);
-    method public abstract boolean onCreateActionMode(android.support.v7.view.ActionMode, android.view.Menu);
-    method public abstract void onDestroyActionMode(android.support.v7.view.ActionMode);
-    method public abstract boolean onPrepareActionMode(android.support.v7.view.ActionMode, android.view.Menu);
-  }
-
-  public abstract interface CollapsibleActionView {
-    method public abstract void onActionViewCollapsed();
-    method public abstract void onActionViewExpanded();
-  }
-
-}
-
-package android.support.v7.widget {
-
-  public class ActionMenuView extends android.support.v7.widget.LinearLayoutCompat {
-    ctor public ActionMenuView(android.content.Context);
-    ctor public ActionMenuView(android.content.Context, android.util.AttributeSet);
-    method public void dismissPopupMenus();
-    method public android.view.Menu getMenu();
-    method public android.graphics.drawable.Drawable getOverflowIcon();
-    method public int getPopupTheme();
-    method public boolean hideOverflowMenu();
-    method public boolean isOverflowMenuShowing();
-    method public void onConfigurationChanged(android.content.res.Configuration);
-    method public void onDetachedFromWindow();
-    method public void setOnMenuItemClickListener(android.support.v7.widget.ActionMenuView.OnMenuItemClickListener);
-    method public void setOverflowIcon(android.graphics.drawable.Drawable);
-    method public void setPopupTheme(int);
-    method public boolean showOverflowMenu();
-  }
-
-  public static class ActionMenuView.LayoutParams extends android.support.v7.widget.LinearLayoutCompat.LayoutParams {
-    ctor public ActionMenuView.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public ActionMenuView.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public ActionMenuView.LayoutParams(android.support.v7.widget.ActionMenuView.LayoutParams);
-    ctor public ActionMenuView.LayoutParams(int, int);
-    field public int cellsUsed;
-    field public boolean expandable;
-    field public int extraPixels;
-    field public boolean isOverflowButton;
-    field public boolean preventEdgeOffset;
-  }
-
-  public static abstract interface ActionMenuView.OnMenuItemClickListener {
-    method public abstract boolean onMenuItemClick(android.view.MenuItem);
-  }
-
-  public class AppCompatAutoCompleteTextView extends android.widget.AutoCompleteTextView {
-    ctor public AppCompatAutoCompleteTextView(android.content.Context);
-    ctor public AppCompatAutoCompleteTextView(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatAutoCompleteTextView(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class AppCompatButton extends android.widget.Button {
-    ctor public AppCompatButton(android.content.Context);
-    ctor public AppCompatButton(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatButton(android.content.Context, android.util.AttributeSet, int);
-    method public void setSupportAllCaps(boolean);
-  }
-
-  public class AppCompatCheckBox extends android.widget.CheckBox {
-    ctor public AppCompatCheckBox(android.content.Context);
-    ctor public AppCompatCheckBox(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatCheckBox(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class AppCompatCheckedTextView extends android.widget.CheckedTextView {
-    ctor public AppCompatCheckedTextView(android.content.Context);
-    ctor public AppCompatCheckedTextView(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatCheckedTextView(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class AppCompatEditText extends android.widget.EditText {
-    ctor public AppCompatEditText(android.content.Context);
-    ctor public AppCompatEditText(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatEditText(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class AppCompatImageButton extends android.widget.ImageButton {
-    ctor public AppCompatImageButton(android.content.Context);
-    ctor public AppCompatImageButton(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatImageButton(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class AppCompatImageView extends android.widget.ImageView {
-    ctor public AppCompatImageView(android.content.Context);
-    ctor public AppCompatImageView(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatImageView(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class AppCompatMultiAutoCompleteTextView extends android.widget.MultiAutoCompleteTextView {
-    ctor public AppCompatMultiAutoCompleteTextView(android.content.Context);
-    ctor public AppCompatMultiAutoCompleteTextView(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatMultiAutoCompleteTextView(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class AppCompatRadioButton extends android.widget.RadioButton {
-    ctor public AppCompatRadioButton(android.content.Context);
-    ctor public AppCompatRadioButton(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatRadioButton(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class AppCompatRatingBar extends android.widget.RatingBar {
-    ctor public AppCompatRatingBar(android.content.Context);
-    ctor public AppCompatRatingBar(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatRatingBar(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class AppCompatSeekBar extends android.widget.SeekBar {
-    ctor public AppCompatSeekBar(android.content.Context);
-    ctor public AppCompatSeekBar(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatSeekBar(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class AppCompatSpinner extends android.widget.Spinner {
-    ctor public AppCompatSpinner(android.content.Context);
-    ctor public AppCompatSpinner(android.content.Context, int);
-    ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet, int);
-    ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet, int, int);
-    ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet, int, int, android.content.res.Resources.Theme);
-  }
-
-  public class AppCompatTextView extends android.widget.TextView {
-    ctor public AppCompatTextView(android.content.Context);
-    ctor public AppCompatTextView(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatTextView(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class LinearLayoutCompat extends android.view.ViewGroup {
-    ctor public LinearLayoutCompat(android.content.Context);
-    ctor public LinearLayoutCompat(android.content.Context, android.util.AttributeSet);
-    ctor public LinearLayoutCompat(android.content.Context, android.util.AttributeSet, int);
-    method public int getBaselineAlignedChildIndex();
-    method public android.graphics.drawable.Drawable getDividerDrawable();
-    method public int getDividerPadding();
-    method public int getOrientation();
-    method public int getShowDividers();
-    method public float getWeightSum();
-    method public boolean isBaselineAligned();
-    method public boolean isMeasureWithLargestChildEnabled();
-    method protected void onLayout(boolean, int, int, int, int);
-    method public void setBaselineAligned(boolean);
-    method public void setBaselineAlignedChildIndex(int);
-    method public void setDividerDrawable(android.graphics.drawable.Drawable);
-    method public void setDividerPadding(int);
-    method public void setGravity(int);
-    method public void setHorizontalGravity(int);
-    method public void setMeasureWithLargestChildEnabled(boolean);
-    method public void setOrientation(int);
-    method public void setShowDividers(int);
-    method public void setVerticalGravity(int);
-    method public void setWeightSum(float);
-    field public static final int HORIZONTAL = 0; // 0x0
-    field public static final int SHOW_DIVIDER_BEGINNING = 1; // 0x1
-    field public static final int SHOW_DIVIDER_END = 4; // 0x4
-    field public static final int SHOW_DIVIDER_MIDDLE = 2; // 0x2
-    field public static final int SHOW_DIVIDER_NONE = 0; // 0x0
-    field public static final int VERTICAL = 1; // 0x1
-  }
-
-  public static class LinearLayoutCompat.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
-    ctor public LinearLayoutCompat.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public LinearLayoutCompat.LayoutParams(int, int);
-    ctor public LinearLayoutCompat.LayoutParams(int, int, float);
-    ctor public LinearLayoutCompat.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public LinearLayoutCompat.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public LinearLayoutCompat.LayoutParams(android.support.v7.widget.LinearLayoutCompat.LayoutParams);
-    field public int gravity;
-    field public float weight;
-  }
-
-  public class ListPopupWindow {
-    ctor public ListPopupWindow(android.content.Context);
-    ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet);
-    ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet, int);
-    ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet, int, int);
-    method public void clearListSelection();
-    method public android.view.View.OnTouchListener createDragToOpenListener(android.view.View);
-    method public void dismiss();
-    method public android.view.View getAnchorView();
-    method public int getAnimationStyle();
-    method public android.graphics.drawable.Drawable getBackground();
-    method public int getHeight();
-    method public int getHorizontalOffset();
-    method public int getInputMethodMode();
-    method public android.widget.ListView getListView();
-    method public int getPromptPosition();
-    method public java.lang.Object getSelectedItem();
-    method public long getSelectedItemId();
-    method public int getSelectedItemPosition();
-    method public android.view.View getSelectedView();
-    method public int getSoftInputMode();
-    method public int getVerticalOffset();
-    method public int getWidth();
-    method public boolean isInputMethodNotNeeded();
-    method public boolean isModal();
-    method public boolean isShowing();
-    method public boolean onKeyDown(int, android.view.KeyEvent);
-    method public boolean onKeyPreIme(int, android.view.KeyEvent);
-    method public boolean onKeyUp(int, android.view.KeyEvent);
-    method public boolean performItemClick(int);
-    method public void postShow();
-    method public void setAdapter(android.widget.ListAdapter);
-    method public void setAnchorView(android.view.View);
-    method public void setAnimationStyle(int);
-    method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
-    method public void setContentWidth(int);
-    method public void setDropDownGravity(int);
-    method public void setHeight(int);
-    method public void setHorizontalOffset(int);
-    method public void setInputMethodMode(int);
-    method public void setListSelector(android.graphics.drawable.Drawable);
-    method public void setModal(boolean);
-    method public void setOnDismissListener(android.widget.PopupWindow.OnDismissListener);
-    method public void setOnItemClickListener(android.widget.AdapterView.OnItemClickListener);
-    method public void setOnItemSelectedListener(android.widget.AdapterView.OnItemSelectedListener);
-    method public void setPromptPosition(int);
-    method public void setPromptView(android.view.View);
-    method public void setSelection(int);
-    method public void setSoftInputMode(int);
-    method public void setVerticalOffset(int);
-    method public void setWidth(int);
-    method public void setWindowLayoutType(int);
-    method public void show();
-    field public static final int INPUT_METHOD_FROM_FOCUSABLE = 0; // 0x0
-    field public static final int INPUT_METHOD_NEEDED = 1; // 0x1
-    field public static final int INPUT_METHOD_NOT_NEEDED = 2; // 0x2
-    field public static final int MATCH_PARENT = -1; // 0xffffffff
-    field public static final int POSITION_PROMPT_ABOVE = 0; // 0x0
-    field public static final int POSITION_PROMPT_BELOW = 1; // 0x1
-    field public static final int WRAP_CONTENT = -2; // 0xfffffffe
-  }
-
-  public class PopupMenu {
-    ctor public PopupMenu(android.content.Context, android.view.View);
-    ctor public PopupMenu(android.content.Context, android.view.View, int);
-    ctor public PopupMenu(android.content.Context, android.view.View, int, int, int);
-    method public void dismiss();
-    method public android.view.View.OnTouchListener getDragToOpenListener();
-    method public int getGravity();
-    method public android.view.Menu getMenu();
-    method public android.view.MenuInflater getMenuInflater();
-    method public void inflate(int);
-    method public void setGravity(int);
-    method public void setOnDismissListener(android.support.v7.widget.PopupMenu.OnDismissListener);
-    method public void setOnMenuItemClickListener(android.support.v7.widget.PopupMenu.OnMenuItemClickListener);
-    method public void show();
-  }
-
-  public static abstract interface PopupMenu.OnDismissListener {
-    method public abstract void onDismiss(android.support.v7.widget.PopupMenu);
-  }
-
-  public static abstract interface PopupMenu.OnMenuItemClickListener {
-    method public abstract boolean onMenuItemClick(android.view.MenuItem);
-  }
-
-  public class SearchView extends android.support.v7.widget.LinearLayoutCompat implements android.support.v7.view.CollapsibleActionView {
-    ctor public SearchView(android.content.Context);
-    ctor public SearchView(android.content.Context, android.util.AttributeSet);
-    ctor public SearchView(android.content.Context, android.util.AttributeSet, int);
-    method public int getImeOptions();
-    method public int getInputType();
-    method public int getMaxWidth();
-    method public java.lang.CharSequence getQuery();
-    method public java.lang.CharSequence getQueryHint();
-    method public android.support.v4.widget.CursorAdapter getSuggestionsAdapter();
-    method public boolean isIconfiedByDefault();
-    method public boolean isIconified();
-    method public boolean isQueryRefinementEnabled();
-    method public boolean isSubmitButtonEnabled();
-    method public void onActionViewCollapsed();
-    method public void onActionViewExpanded();
-    method public void setIconified(boolean);
-    method public void setIconifiedByDefault(boolean);
-    method public void setImeOptions(int);
-    method public void setInputType(int);
-    method public void setMaxWidth(int);
-    method public void setOnCloseListener(android.support.v7.widget.SearchView.OnCloseListener);
-    method public void setOnQueryTextFocusChangeListener(android.view.View.OnFocusChangeListener);
-    method public void setOnQueryTextListener(android.support.v7.widget.SearchView.OnQueryTextListener);
-    method public void setOnSearchClickListener(android.view.View.OnClickListener);
-    method public void setOnSuggestionListener(android.support.v7.widget.SearchView.OnSuggestionListener);
-    method public void setQuery(java.lang.CharSequence, boolean);
-    method public void setQueryHint(java.lang.CharSequence);
-    method public void setQueryRefinementEnabled(boolean);
-    method public void setSearchableInfo(android.app.SearchableInfo);
-    method public void setSubmitButtonEnabled(boolean);
-    method public void setSuggestionsAdapter(android.support.v4.widget.CursorAdapter);
-  }
-
-  public static abstract interface SearchView.OnCloseListener {
-    method public abstract boolean onClose();
-  }
-
-  public static abstract interface SearchView.OnQueryTextListener {
-    method public abstract boolean onQueryTextChange(java.lang.String);
-    method public abstract boolean onQueryTextSubmit(java.lang.String);
-  }
-
-  public static abstract interface SearchView.OnSuggestionListener {
-    method public abstract boolean onSuggestionClick(int);
-    method public abstract boolean onSuggestionSelect(int);
-  }
-
-  public class ShareActionProvider extends android.support.v4.view.ActionProvider {
-    ctor public ShareActionProvider(android.content.Context);
-    method public android.view.View onCreateActionView();
-    method public void setOnShareTargetSelectedListener(android.support.v7.widget.ShareActionProvider.OnShareTargetSelectedListener);
-    method public void setShareHistoryFileName(java.lang.String);
-    method public void setShareIntent(android.content.Intent);
-    field public static final java.lang.String DEFAULT_SHARE_HISTORY_FILE_NAME = "share_history.xml";
-  }
-
-  public static abstract interface ShareActionProvider.OnShareTargetSelectedListener {
-    method public abstract boolean onShareTargetSelected(android.support.v7.widget.ShareActionProvider, android.content.Intent);
-  }
-
-  public class SwitchCompat extends android.widget.CompoundButton {
-    ctor public SwitchCompat(android.content.Context);
-    ctor public SwitchCompat(android.content.Context, android.util.AttributeSet);
-    ctor public SwitchCompat(android.content.Context, android.util.AttributeSet, int);
-    method public boolean getShowText();
-    method public boolean getSplitTrack();
-    method public int getSwitchMinWidth();
-    method public int getSwitchPadding();
-    method public java.lang.CharSequence getTextOff();
-    method public java.lang.CharSequence getTextOn();
-    method public android.graphics.drawable.Drawable getThumbDrawable();
-    method public int getThumbTextPadding();
-    method public android.graphics.drawable.Drawable getTrackDrawable();
-    method public void onMeasure(int, int);
-    method public void setShowText(boolean);
-    method public void setSplitTrack(boolean);
-    method public void setSwitchMinWidth(int);
-    method public void setSwitchPadding(int);
-    method public void setSwitchTextAppearance(android.content.Context, int);
-    method public void setSwitchTypeface(android.graphics.Typeface, int);
-    method public void setSwitchTypeface(android.graphics.Typeface);
-    method public void setTextOff(java.lang.CharSequence);
-    method public void setTextOn(java.lang.CharSequence);
-    method public void setThumbDrawable(android.graphics.drawable.Drawable);
-    method public void setThumbResource(int);
-    method public void setThumbTextPadding(int);
-    method public void setTrackDrawable(android.graphics.drawable.Drawable);
-    method public void setTrackResource(int);
-  }
-
-  public abstract interface ThemedSpinnerAdapter implements android.widget.SpinnerAdapter {
-    method public abstract android.content.res.Resources.Theme getDropDownViewTheme();
-    method public abstract void setDropDownViewTheme(android.content.res.Resources.Theme);
-  }
-
-  public static final class ThemedSpinnerAdapter.Helper {
-    ctor public ThemedSpinnerAdapter.Helper(android.content.Context);
-    method public android.view.LayoutInflater getDropDownViewInflater();
-    method public android.content.res.Resources.Theme getDropDownViewTheme();
-    method public void setDropDownViewTheme(android.content.res.Resources.Theme);
-  }
-
-  public class Toolbar extends android.view.ViewGroup {
-    ctor public Toolbar(android.content.Context);
-    ctor public Toolbar(android.content.Context, android.util.AttributeSet);
-    ctor public Toolbar(android.content.Context, android.util.AttributeSet, int);
-    method public void collapseActionView();
-    method public void dismissPopupMenus();
-    method public int getContentInsetEnd();
-    method public int getContentInsetLeft();
-    method public int getContentInsetRight();
-    method public int getContentInsetStart();
-    method public android.graphics.drawable.Drawable getLogo();
-    method public java.lang.CharSequence getLogoDescription();
-    method public android.view.Menu getMenu();
-    method public java.lang.CharSequence getNavigationContentDescription();
-    method public android.graphics.drawable.Drawable getNavigationIcon();
-    method public android.graphics.drawable.Drawable getOverflowIcon();
-    method public int getPopupTheme();
-    method public java.lang.CharSequence getSubtitle();
-    method public java.lang.CharSequence getTitle();
-    method public boolean hasExpandedActionView();
-    method public boolean hideOverflowMenu();
-    method public void inflateMenu(int);
-    method public boolean isOverflowMenuShowing();
-    method protected void onLayout(boolean, int, int, int, int);
-    method public void setContentInsetsAbsolute(int, int);
-    method public void setContentInsetsRelative(int, int);
-    method public void setLogo(int);
-    method public void setLogo(android.graphics.drawable.Drawable);
-    method public void setLogoDescription(int);
-    method public void setLogoDescription(java.lang.CharSequence);
-    method public void setNavigationContentDescription(int);
-    method public void setNavigationContentDescription(java.lang.CharSequence);
-    method public void setNavigationIcon(int);
-    method public void setNavigationIcon(android.graphics.drawable.Drawable);
-    method public void setNavigationOnClickListener(android.view.View.OnClickListener);
-    method public void setOnMenuItemClickListener(android.support.v7.widget.Toolbar.OnMenuItemClickListener);
-    method public void setOverflowIcon(android.graphics.drawable.Drawable);
-    method public void setPopupTheme(int);
-    method public void setSubtitle(int);
-    method public void setSubtitle(java.lang.CharSequence);
-    method public void setSubtitleTextAppearance(android.content.Context, int);
-    method public void setSubtitleTextColor(int);
-    method public void setTitle(int);
-    method public void setTitle(java.lang.CharSequence);
-    method public void setTitleTextAppearance(android.content.Context, int);
-    method public void setTitleTextColor(int);
-    method public boolean showOverflowMenu();
-  }
-
-  public static class Toolbar.LayoutParams extends android.support.v7.app.ActionBar.LayoutParams {
-    ctor public Toolbar.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public Toolbar.LayoutParams(int, int);
-    ctor public Toolbar.LayoutParams(int, int, int);
-    ctor public Toolbar.LayoutParams(int);
-    ctor public Toolbar.LayoutParams(android.support.v7.widget.Toolbar.LayoutParams);
-    ctor public Toolbar.LayoutParams(android.support.v7.app.ActionBar.LayoutParams);
-    ctor public Toolbar.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public Toolbar.LayoutParams(android.view.ViewGroup.LayoutParams);
-  }
-
-  public static abstract interface Toolbar.OnMenuItemClickListener {
-    method public abstract boolean onMenuItemClick(android.view.MenuItem);
-  }
-
-  public static class Toolbar.SavedState extends android.view.View.BaseSavedState {
-    ctor public Toolbar.SavedState(android.os.Parcel);
-    ctor public Toolbar.SavedState(android.os.Parcelable);
-    field public static final android.os.Parcelable.Creator<android.support.v7.widget.Toolbar.SavedState> CREATOR;
-  }
-
-}
-
diff --git a/v7/appcompat/api/current.txt b/v7/appcompat/api/current.txt
deleted file mode 100644
index dc931b3..0000000
--- a/v7/appcompat/api/current.txt
+++ /dev/null
@@ -1,2231 +0,0 @@
-package android.support.v7.app {
-
-  public abstract class ActionBar {
-    ctor public ActionBar();
-    method public abstract void addOnMenuVisibilityListener(android.support.v7.app.ActionBar.OnMenuVisibilityListener);
-    method public abstract deprecated void addTab(android.support.v7.app.ActionBar.Tab);
-    method public abstract deprecated void addTab(android.support.v7.app.ActionBar.Tab, boolean);
-    method public abstract deprecated void addTab(android.support.v7.app.ActionBar.Tab, int);
-    method public abstract deprecated void addTab(android.support.v7.app.ActionBar.Tab, int, boolean);
-    method public abstract android.view.View getCustomView();
-    method public abstract int getDisplayOptions();
-    method public float getElevation();
-    method public abstract int getHeight();
-    method public int getHideOffset();
-    method public abstract deprecated int getNavigationItemCount();
-    method public abstract deprecated int getNavigationMode();
-    method public abstract deprecated int getSelectedNavigationIndex();
-    method public abstract deprecated android.support.v7.app.ActionBar.Tab getSelectedTab();
-    method public abstract java.lang.CharSequence getSubtitle();
-    method public abstract deprecated android.support.v7.app.ActionBar.Tab getTabAt(int);
-    method public abstract deprecated int getTabCount();
-    method public android.content.Context getThemedContext();
-    method public abstract java.lang.CharSequence getTitle();
-    method public abstract void hide();
-    method public boolean isHideOnContentScrollEnabled();
-    method public abstract boolean isShowing();
-    method public abstract deprecated android.support.v7.app.ActionBar.Tab newTab();
-    method public abstract deprecated void removeAllTabs();
-    method public abstract void removeOnMenuVisibilityListener(android.support.v7.app.ActionBar.OnMenuVisibilityListener);
-    method public abstract deprecated void removeTab(android.support.v7.app.ActionBar.Tab);
-    method public abstract deprecated void removeTabAt(int);
-    method public abstract deprecated void selectTab(android.support.v7.app.ActionBar.Tab);
-    method public abstract void setBackgroundDrawable(android.graphics.drawable.Drawable);
-    method public abstract void setCustomView(android.view.View);
-    method public abstract void setCustomView(android.view.View, android.support.v7.app.ActionBar.LayoutParams);
-    method public abstract void setCustomView(int);
-    method public abstract void setDisplayHomeAsUpEnabled(boolean);
-    method public abstract void setDisplayOptions(int);
-    method public abstract void setDisplayOptions(int, int);
-    method public abstract void setDisplayShowCustomEnabled(boolean);
-    method public abstract void setDisplayShowHomeEnabled(boolean);
-    method public abstract void setDisplayShowTitleEnabled(boolean);
-    method public abstract void setDisplayUseLogoEnabled(boolean);
-    method public void setElevation(float);
-    method public void setHideOffset(int);
-    method public void setHideOnContentScrollEnabled(boolean);
-    method public void setHomeActionContentDescription(java.lang.CharSequence);
-    method public void setHomeActionContentDescription(int);
-    method public void setHomeAsUpIndicator(android.graphics.drawable.Drawable);
-    method public void setHomeAsUpIndicator(int);
-    method public void setHomeButtonEnabled(boolean);
-    method public abstract void setIcon(int);
-    method public abstract void setIcon(android.graphics.drawable.Drawable);
-    method public abstract deprecated void setListNavigationCallbacks(android.widget.SpinnerAdapter, android.support.v7.app.ActionBar.OnNavigationListener);
-    method public abstract void setLogo(int);
-    method public abstract void setLogo(android.graphics.drawable.Drawable);
-    method public abstract deprecated void setNavigationMode(int);
-    method public abstract deprecated void setSelectedNavigationItem(int);
-    method public void setSplitBackgroundDrawable(android.graphics.drawable.Drawable);
-    method public void setStackedBackgroundDrawable(android.graphics.drawable.Drawable);
-    method public abstract void setSubtitle(java.lang.CharSequence);
-    method public abstract void setSubtitle(int);
-    method public abstract void setTitle(java.lang.CharSequence);
-    method public abstract void setTitle(int);
-    method public abstract void show();
-    field public static final int DISPLAY_HOME_AS_UP = 4; // 0x4
-    field public static final int DISPLAY_SHOW_CUSTOM = 16; // 0x10
-    field public static final int DISPLAY_SHOW_HOME = 2; // 0x2
-    field public static final int DISPLAY_SHOW_TITLE = 8; // 0x8
-    field public static final int DISPLAY_USE_LOGO = 1; // 0x1
-    field public static final deprecated int NAVIGATION_MODE_LIST = 1; // 0x1
-    field public static final deprecated int NAVIGATION_MODE_STANDARD = 0; // 0x0
-    field public static final deprecated int NAVIGATION_MODE_TABS = 2; // 0x2
-  }
-
-  public static class ActionBar.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
-    ctor public ActionBar.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public ActionBar.LayoutParams(int, int);
-    ctor public ActionBar.LayoutParams(int, int, int);
-    ctor public ActionBar.LayoutParams(int);
-    ctor public ActionBar.LayoutParams(android.support.v7.app.ActionBar.LayoutParams);
-    ctor public ActionBar.LayoutParams(android.view.ViewGroup.LayoutParams);
-    field public int gravity;
-  }
-
-  public static abstract interface ActionBar.OnMenuVisibilityListener {
-    method public abstract void onMenuVisibilityChanged(boolean);
-  }
-
-  public static abstract deprecated interface ActionBar.OnNavigationListener {
-    method public abstract boolean onNavigationItemSelected(int, long);
-  }
-
-  public static abstract deprecated class ActionBar.Tab {
-    ctor public ActionBar.Tab();
-    method public abstract java.lang.CharSequence getContentDescription();
-    method public abstract android.view.View getCustomView();
-    method public abstract android.graphics.drawable.Drawable getIcon();
-    method public abstract int getPosition();
-    method public abstract java.lang.Object getTag();
-    method public abstract java.lang.CharSequence getText();
-    method public abstract void select();
-    method public abstract android.support.v7.app.ActionBar.Tab setContentDescription(int);
-    method public abstract android.support.v7.app.ActionBar.Tab setContentDescription(java.lang.CharSequence);
-    method public abstract android.support.v7.app.ActionBar.Tab setCustomView(android.view.View);
-    method public abstract android.support.v7.app.ActionBar.Tab setCustomView(int);
-    method public abstract android.support.v7.app.ActionBar.Tab setIcon(android.graphics.drawable.Drawable);
-    method public abstract android.support.v7.app.ActionBar.Tab setIcon(int);
-    method public abstract android.support.v7.app.ActionBar.Tab setTabListener(android.support.v7.app.ActionBar.TabListener);
-    method public abstract android.support.v7.app.ActionBar.Tab setTag(java.lang.Object);
-    method public abstract android.support.v7.app.ActionBar.Tab setText(java.lang.CharSequence);
-    method public abstract android.support.v7.app.ActionBar.Tab setText(int);
-    field public static final int INVALID_POSITION = -1; // 0xffffffff
-  }
-
-  public static abstract deprecated interface ActionBar.TabListener {
-    method public abstract void onTabReselected(android.support.v7.app.ActionBar.Tab, android.support.v4.app.FragmentTransaction);
-    method public abstract void onTabSelected(android.support.v7.app.ActionBar.Tab, android.support.v4.app.FragmentTransaction);
-    method public abstract void onTabUnselected(android.support.v7.app.ActionBar.Tab, android.support.v4.app.FragmentTransaction);
-  }
-
-  public deprecated class ActionBarActivity extends android.support.v7.app.AppCompatActivity {
-    ctor public ActionBarActivity();
-  }
-
-  public class ActionBarDrawerToggle implements android.support.v4.widget.DrawerLayout.DrawerListener {
-    ctor public ActionBarDrawerToggle(android.app.Activity, android.support.v4.widget.DrawerLayout, int, int);
-    ctor public ActionBarDrawerToggle(android.app.Activity, android.support.v4.widget.DrawerLayout, android.support.v7.widget.Toolbar, int, int);
-    method public android.view.View.OnClickListener getToolbarNavigationClickListener();
-    method public boolean isDrawerIndicatorEnabled();
-    method public void onConfigurationChanged(android.content.res.Configuration);
-    method public void onDrawerClosed(android.view.View);
-    method public void onDrawerOpened(android.view.View);
-    method public void onDrawerSlide(android.view.View, float);
-    method public void onDrawerStateChanged(int);
-    method public boolean onOptionsItemSelected(android.view.MenuItem);
-    method public void setDrawerIndicatorEnabled(boolean);
-    method public void setHomeAsUpIndicator(android.graphics.drawable.Drawable);
-    method public void setHomeAsUpIndicator(int);
-    method public void setToolbarNavigationClickListener(android.view.View.OnClickListener);
-    method public void syncState();
-  }
-
-  public static abstract interface ActionBarDrawerToggle.Delegate {
-    method public abstract android.content.Context getActionBarThemedContext();
-    method public abstract android.graphics.drawable.Drawable getThemeUpIndicator();
-    method public abstract boolean isNavigationVisible();
-    method public abstract void setActionBarDescription(int);
-    method public abstract void setActionBarUpIndicator(android.graphics.drawable.Drawable, int);
-  }
-
-  public static abstract interface ActionBarDrawerToggle.DelegateProvider {
-    method public abstract android.support.v7.app.ActionBarDrawerToggle.Delegate getDrawerToggleDelegate();
-  }
-
-  public class AlertDialog extends android.support.v7.app.AppCompatDialog implements android.content.DialogInterface {
-    ctor protected AlertDialog(android.content.Context);
-    ctor protected AlertDialog(android.content.Context, int);
-    ctor protected AlertDialog(android.content.Context, boolean, android.content.DialogInterface.OnCancelListener);
-    method public android.widget.Button getButton(int);
-    method public android.widget.ListView getListView();
-    method public void setButton(int, java.lang.CharSequence, android.os.Message);
-    method public void setButton(int, java.lang.CharSequence, android.content.DialogInterface.OnClickListener);
-    method public void setCustomTitle(android.view.View);
-    method public void setIcon(int);
-    method public void setIcon(android.graphics.drawable.Drawable);
-    method public void setIconAttribute(int);
-    method public void setMessage(java.lang.CharSequence);
-    method public void setView(android.view.View);
-    method public void setView(android.view.View, int, int, int, int);
-  }
-
-  public static class AlertDialog.Builder {
-    ctor public AlertDialog.Builder(android.content.Context);
-    ctor public AlertDialog.Builder(android.content.Context, int);
-    method public android.support.v7.app.AlertDialog create();
-    method public android.content.Context getContext();
-    method public android.support.v7.app.AlertDialog.Builder setAdapter(android.widget.ListAdapter, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setCancelable(boolean);
-    method public android.support.v7.app.AlertDialog.Builder setCursor(android.database.Cursor, android.content.DialogInterface.OnClickListener, java.lang.String);
-    method public android.support.v7.app.AlertDialog.Builder setCustomTitle(android.view.View);
-    method public android.support.v7.app.AlertDialog.Builder setIcon(int);
-    method public android.support.v7.app.AlertDialog.Builder setIcon(android.graphics.drawable.Drawable);
-    method public android.support.v7.app.AlertDialog.Builder setIconAttribute(int);
-    method public deprecated android.support.v7.app.AlertDialog.Builder setInverseBackgroundForced(boolean);
-    method public android.support.v7.app.AlertDialog.Builder setItems(int, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setItems(java.lang.CharSequence[], android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setMessage(int);
-    method public android.support.v7.app.AlertDialog.Builder setMessage(java.lang.CharSequence);
-    method public android.support.v7.app.AlertDialog.Builder setMultiChoiceItems(int, boolean[], android.content.DialogInterface.OnMultiChoiceClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setMultiChoiceItems(java.lang.CharSequence[], boolean[], android.content.DialogInterface.OnMultiChoiceClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setMultiChoiceItems(android.database.Cursor, java.lang.String, java.lang.String, android.content.DialogInterface.OnMultiChoiceClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setNegativeButton(int, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setNegativeButton(java.lang.CharSequence, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setNeutralButton(int, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setNeutralButton(java.lang.CharSequence, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setOnCancelListener(android.content.DialogInterface.OnCancelListener);
-    method public android.support.v7.app.AlertDialog.Builder setOnDismissListener(android.content.DialogInterface.OnDismissListener);
-    method public android.support.v7.app.AlertDialog.Builder setOnItemSelectedListener(android.widget.AdapterView.OnItemSelectedListener);
-    method public android.support.v7.app.AlertDialog.Builder setOnKeyListener(android.content.DialogInterface.OnKeyListener);
-    method public android.support.v7.app.AlertDialog.Builder setPositiveButton(int, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setPositiveButton(java.lang.CharSequence, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setSingleChoiceItems(int, int, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setSingleChoiceItems(android.database.Cursor, int, java.lang.String, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setSingleChoiceItems(java.lang.CharSequence[], int, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setSingleChoiceItems(android.widget.ListAdapter, int, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setTitle(int);
-    method public android.support.v7.app.AlertDialog.Builder setTitle(java.lang.CharSequence);
-    method public android.support.v7.app.AlertDialog.Builder setView(int);
-    method public android.support.v7.app.AlertDialog.Builder setView(android.view.View);
-    method public android.support.v7.app.AlertDialog show();
-  }
-
-  public class AppCompatActivity extends android.support.v4.app.FragmentActivity implements android.support.v7.app.ActionBarDrawerToggle.DelegateProvider android.support.v7.app.AppCompatCallback {
-    ctor public AppCompatActivity();
-    method public android.support.v7.app.AppCompatDelegate getDelegate();
-    method public android.support.v7.app.ActionBarDrawerToggle.Delegate getDrawerToggleDelegate();
-    method public android.support.v7.app.ActionBar getSupportActionBar();
-    method public android.content.Intent getSupportParentActivityIntent();
-    method public void onCreateSupportNavigateUpTaskStack(android.support.v4.app.TaskStackBuilder);
-    method public final boolean onMenuItemSelected(int, android.view.MenuItem);
-    method public void onPrepareSupportNavigateUpTaskStack(android.support.v4.app.TaskStackBuilder);
-    method public void onSupportActionModeFinished(android.support.v7.view.ActionMode);
-    method public void onSupportActionModeStarted(android.support.v7.view.ActionMode);
-    method public deprecated void onSupportContentChanged();
-    method public boolean onSupportNavigateUp();
-    method public android.support.v7.view.ActionMode onWindowStartingSupportActionMode(android.support.v7.view.ActionMode.Callback);
-    method public void setSupportActionBar(android.support.v7.widget.Toolbar);
-    method public deprecated void setSupportProgress(int);
-    method public deprecated void setSupportProgressBarIndeterminate(boolean);
-    method public deprecated void setSupportProgressBarIndeterminateVisibility(boolean);
-    method public deprecated void setSupportProgressBarVisibility(boolean);
-    method public android.support.v7.view.ActionMode startSupportActionMode(android.support.v7.view.ActionMode.Callback);
-    method public void supportNavigateUpTo(android.content.Intent);
-    method public boolean supportRequestWindowFeature(int);
-    method public boolean supportShouldUpRecreateTask(android.content.Intent);
-  }
-
-  public abstract interface AppCompatCallback {
-    method public abstract void onSupportActionModeFinished(android.support.v7.view.ActionMode);
-    method public abstract void onSupportActionModeStarted(android.support.v7.view.ActionMode);
-    method public abstract android.support.v7.view.ActionMode onWindowStartingSupportActionMode(android.support.v7.view.ActionMode.Callback);
-  }
-
-  public abstract class AppCompatDelegate {
-    method public abstract void addContentView(android.view.View, android.view.ViewGroup.LayoutParams);
-    method public abstract boolean applyDayNight();
-    method public static android.support.v7.app.AppCompatDelegate create(android.app.Activity, android.support.v7.app.AppCompatCallback);
-    method public static android.support.v7.app.AppCompatDelegate create(android.app.Dialog, android.support.v7.app.AppCompatCallback);
-    method public abstract android.view.View createView(android.view.View, java.lang.String, android.content.Context, android.util.AttributeSet);
-    method public abstract android.view.View findViewById(int);
-    method public static int getDefaultNightMode();
-    method public abstract android.support.v7.app.ActionBarDrawerToggle.Delegate getDrawerToggleDelegate();
-    method public abstract android.view.MenuInflater getMenuInflater();
-    method public abstract android.support.v7.app.ActionBar getSupportActionBar();
-    method public abstract boolean hasWindowFeature(int);
-    method public abstract void installViewFactory();
-    method public abstract void invalidateOptionsMenu();
-    method public static boolean isCompatVectorFromResourcesEnabled();
-    method public abstract boolean isHandleNativeActionModesEnabled();
-    method public abstract void onConfigurationChanged(android.content.res.Configuration);
-    method public abstract void onCreate(android.os.Bundle);
-    method public abstract void onDestroy();
-    method public abstract void onPostCreate(android.os.Bundle);
-    method public abstract void onPostResume();
-    method public abstract void onSaveInstanceState(android.os.Bundle);
-    method public abstract void onStop();
-    method public abstract boolean requestWindowFeature(int);
-    method public static void setCompatVectorFromResourcesEnabled(boolean);
-    method public abstract void setContentView(android.view.View);
-    method public abstract void setContentView(int);
-    method public abstract void setContentView(android.view.View, android.view.ViewGroup.LayoutParams);
-    method public static void setDefaultNightMode(int);
-    method public abstract void setHandleNativeActionModesEnabled(boolean);
-    method public abstract void setLocalNightMode(int);
-    method public abstract void setSupportActionBar(android.support.v7.widget.Toolbar);
-    method public abstract void setTitle(java.lang.CharSequence);
-    method public abstract android.support.v7.view.ActionMode startSupportActionMode(android.support.v7.view.ActionMode.Callback);
-    field public static final int FEATURE_ACTION_MODE_OVERLAY = 10; // 0xa
-    field public static final int FEATURE_SUPPORT_ACTION_BAR = 108; // 0x6c
-    field public static final int FEATURE_SUPPORT_ACTION_BAR_OVERLAY = 109; // 0x6d
-    field public static final int MODE_NIGHT_AUTO = 0; // 0x0
-    field public static final int MODE_NIGHT_FOLLOW_SYSTEM = -1; // 0xffffffff
-    field public static final int MODE_NIGHT_NO = 1; // 0x1
-    field public static final int MODE_NIGHT_YES = 2; // 0x2
-  }
-
-  public class AppCompatDialog extends android.app.Dialog implements android.support.v7.app.AppCompatCallback {
-    ctor public AppCompatDialog(android.content.Context);
-    ctor public AppCompatDialog(android.content.Context, int);
-    ctor protected AppCompatDialog(android.content.Context, boolean, android.content.DialogInterface.OnCancelListener);
-    method public android.support.v7.app.AppCompatDelegate getDelegate();
-    method public android.support.v7.app.ActionBar getSupportActionBar();
-    method public void onSupportActionModeFinished(android.support.v7.view.ActionMode);
-    method public void onSupportActionModeStarted(android.support.v7.view.ActionMode);
-    method public android.support.v7.view.ActionMode onWindowStartingSupportActionMode(android.support.v7.view.ActionMode.Callback);
-    method public boolean supportRequestWindowFeature(int);
-  }
-
-  public class AppCompatDialogFragment extends android.support.v4.app.DialogFragment {
-    ctor public AppCompatDialogFragment();
-  }
-
-  public class NotificationCompat extends android.support.v4.app.NotificationCompat {
-    ctor public NotificationCompat();
-  }
-
-  public static class NotificationCompat.Builder extends android.support.v4.app.NotificationCompat.Builder {
-    ctor public NotificationCompat.Builder(android.content.Context);
-  }
-
-  public static class NotificationCompat.MediaStyle extends android.support.v4.app.NotificationCompat.Style {
-    ctor public NotificationCompat.MediaStyle();
-    ctor public NotificationCompat.MediaStyle(android.support.v4.app.NotificationCompat.Builder);
-    method public android.support.v7.app.NotificationCompat.MediaStyle setCancelButtonIntent(android.app.PendingIntent);
-    method public android.support.v7.app.NotificationCompat.MediaStyle setMediaSession(android.support.v4.media.session.MediaSessionCompat.Token);
-    method public android.support.v7.app.NotificationCompat.MediaStyle setShowActionsInCompactView(int...);
-    method public android.support.v7.app.NotificationCompat.MediaStyle setShowCancelButton(boolean);
-  }
-
-}
-
-package android.support.v7.appcompat {
-
-  public final class R {
-    ctor public R();
-  }
-
-  public static final class R.anim {
-    ctor public R.anim();
-    field public static int abc_fade_in;
-    field public static int abc_fade_out;
-    field public static int abc_grow_fade_in_from_bottom;
-    field public static int abc_popup_enter;
-    field public static int abc_popup_exit;
-    field public static int abc_shrink_fade_out_from_bottom;
-    field public static int abc_slide_in_bottom;
-    field public static int abc_slide_in_top;
-    field public static int abc_slide_out_bottom;
-    field public static int abc_slide_out_top;
-  }
-
-  public static final class R.attr {
-    ctor public R.attr();
-    field public static int actionBarDivider;
-    field public static int actionBarItemBackground;
-    field public static int actionBarPopupTheme;
-    field public static int actionBarSize;
-    field public static int actionBarSplitStyle;
-    field public static int actionBarStyle;
-    field public static int actionBarTabBarStyle;
-    field public static int actionBarTabStyle;
-    field public static int actionBarTabTextStyle;
-    field public static int actionBarTheme;
-    field public static int actionBarWidgetTheme;
-    field public static int actionButtonStyle;
-    field public static int actionDropDownStyle;
-    field public static int actionLayout;
-    field public static int actionMenuTextAppearance;
-    field public static int actionMenuTextColor;
-    field public static int actionModeBackground;
-    field public static int actionModeCloseButtonStyle;
-    field public static int actionModeCloseDrawable;
-    field public static int actionModeCopyDrawable;
-    field public static int actionModeCutDrawable;
-    field public static int actionModeFindDrawable;
-    field public static int actionModePasteDrawable;
-    field public static int actionModePopupWindowStyle;
-    field public static int actionModeSelectAllDrawable;
-    field public static int actionModeShareDrawable;
-    field public static int actionModeSplitBackground;
-    field public static int actionModeStyle;
-    field public static int actionModeWebSearchDrawable;
-    field public static int actionOverflowButtonStyle;
-    field public static int actionOverflowMenuStyle;
-    field public static int actionProviderClass;
-    field public static int actionViewClass;
-    field public static int activityChooserViewStyle;
-    field public static int alertDialogButtonGroupStyle;
-    field public static int alertDialogCenterButtons;
-    field public static int alertDialogStyle;
-    field public static int alertDialogTheme;
-    field public static int allowStacking;
-    field public static int alpha;
-    field public static int arrowHeadLength;
-    field public static int arrowShaftLength;
-    field public static int autoCompleteTextViewStyle;
-    field public static int background;
-    field public static int backgroundSplit;
-    field public static int backgroundStacked;
-    field public static int backgroundTint;
-    field public static int backgroundTintMode;
-    field public static int barLength;
-    field public static int borderlessButtonStyle;
-    field public static int buttonBarButtonStyle;
-    field public static int buttonBarNegativeButtonStyle;
-    field public static int buttonBarNeutralButtonStyle;
-    field public static int buttonBarPositiveButtonStyle;
-    field public static int buttonBarStyle;
-    field public static int buttonGravity;
-    field public static int buttonPanelSideLayout;
-    field public static int buttonStyle;
-    field public static int buttonStyleSmall;
-    field public static int buttonTint;
-    field public static int buttonTintMode;
-    field public static int checkboxStyle;
-    field public static int checkedTextViewStyle;
-    field public static int closeIcon;
-    field public static int closeItemLayout;
-    field public static int collapseContentDescription;
-    field public static int collapseIcon;
-    field public static int color;
-    field public static int colorAccent;
-    field public static int colorBackgroundFloating;
-    field public static int colorButtonNormal;
-    field public static int colorControlActivated;
-    field public static int colorControlHighlight;
-    field public static int colorControlNormal;
-    field public static int colorPrimary;
-    field public static int colorPrimaryDark;
-    field public static int colorSwitchThumbNormal;
-    field public static int commitIcon;
-    field public static int contentInsetEnd;
-    field public static int contentInsetEndWithActions;
-    field public static int contentInsetLeft;
-    field public static int contentInsetRight;
-    field public static int contentInsetStart;
-    field public static int contentInsetStartWithNavigation;
-    field public static int controlBackground;
-    field public static int customNavigationLayout;
-    field public static int defaultQueryHint;
-    field public static int dialogPreferredPadding;
-    field public static int dialogTheme;
-    field public static int displayOptions;
-    field public static int divider;
-    field public static int dividerHorizontal;
-    field public static int dividerPadding;
-    field public static int dividerVertical;
-    field public static int drawableSize;
-    field public static int drawerArrowStyle;
-    field public static int dropDownListViewStyle;
-    field public static int dropdownListPreferredItemHeight;
-    field public static int editTextBackground;
-    field public static int editTextColor;
-    field public static int editTextStyle;
-    field public static int elevation;
-    field public static int expandActivityOverflowButtonDrawable;
-    field public static int gapBetweenBars;
-    field public static int goIcon;
-    field public static int height;
-    field public static int hideOnContentScroll;
-    field public static int homeAsUpIndicator;
-    field public static int homeLayout;
-    field public static int icon;
-    field public static int iconifiedByDefault;
-    field public static int imageButtonStyle;
-    field public static int indeterminateProgressStyle;
-    field public static int initialActivityCount;
-    field public static int isLightTheme;
-    field public static int itemPadding;
-    field public static int layout;
-    field public static int listChoiceBackgroundIndicator;
-    field public static int listDividerAlertDialog;
-    field public static int listItemLayout;
-    field public static int listLayout;
-    field public static int listMenuViewStyle;
-    field public static int listPopupWindowStyle;
-    field public static int listPreferredItemHeight;
-    field public static int listPreferredItemHeightLarge;
-    field public static int listPreferredItemHeightSmall;
-    field public static int listPreferredItemPaddingLeft;
-    field public static int listPreferredItemPaddingRight;
-    field public static int logo;
-    field public static int logoDescription;
-    field public static int maxButtonHeight;
-    field public static int measureWithLargestChild;
-    field public static int multiChoiceItemLayout;
-    field public static int navigationContentDescription;
-    field public static int navigationIcon;
-    field public static int navigationMode;
-    field public static int overlapAnchor;
-    field public static int paddingEnd;
-    field public static int paddingStart;
-    field public static int panelBackground;
-    field public static int panelMenuListTheme;
-    field public static int panelMenuListWidth;
-    field public static int popupMenuStyle;
-    field public static int popupTheme;
-    field public static int popupWindowStyle;
-    field public static int preserveIconSpacing;
-    field public static int progressBarPadding;
-    field public static int progressBarStyle;
-    field public static int queryBackground;
-    field public static int queryHint;
-    field public static int radioButtonStyle;
-    field public static int ratingBarStyle;
-    field public static int ratingBarStyleIndicator;
-    field public static int ratingBarStyleSmall;
-    field public static int searchHintIcon;
-    field public static int searchIcon;
-    field public static int searchViewStyle;
-    field public static int seekBarStyle;
-    field public static int selectableItemBackground;
-    field public static int selectableItemBackgroundBorderless;
-    field public static int showAsAction;
-    field public static int showDividers;
-    field public static int showText;
-    field public static int singleChoiceItemLayout;
-    field public static int spinBars;
-    field public static int spinnerDropDownItemStyle;
-    field public static int spinnerStyle;
-    field public static int splitTrack;
-    field public static int srcCompat;
-    field public static int state_above_anchor;
-    field public static int subMenuArrow;
-    field public static int submitBackground;
-    field public static int subtitle;
-    field public static int subtitleTextAppearance;
-    field public static int subtitleTextColor;
-    field public static int subtitleTextStyle;
-    field public static int suggestionRowLayout;
-    field public static int switchMinWidth;
-    field public static int switchPadding;
-    field public static int switchStyle;
-    field public static int switchTextAppearance;
-    field public static int textAllCaps;
-    field public static int textAppearanceLargePopupMenu;
-    field public static int textAppearanceListItem;
-    field public static int textAppearanceListItemSmall;
-    field public static int textAppearancePopupMenuHeader;
-    field public static int textAppearanceSearchResultSubtitle;
-    field public static int textAppearanceSearchResultTitle;
-    field public static int textAppearanceSmallPopupMenu;
-    field public static int textColorAlertDialogListItem;
-    field public static int textColorSearchUrl;
-    field public static int theme;
-    field public static int thickness;
-    field public static int thumbTextPadding;
-    field public static int thumbTint;
-    field public static int thumbTintMode;
-    field public static int tickMark;
-    field public static int tickMarkTint;
-    field public static int tickMarkTintMode;
-    field public static int title;
-    field public static int titleMargin;
-    field public static int titleMarginBottom;
-    field public static int titleMarginEnd;
-    field public static int titleMarginStart;
-    field public static int titleMarginTop;
-    field public static deprecated int titleMargins;
-    field public static int titleTextAppearance;
-    field public static int titleTextColor;
-    field public static int titleTextStyle;
-    field public static int toolbarNavigationButtonStyle;
-    field public static int toolbarStyle;
-    field public static int track;
-    field public static int trackTint;
-    field public static int trackTintMode;
-    field public static int voiceIcon;
-    field public static int windowActionBar;
-    field public static int windowActionBarOverlay;
-    field public static int windowActionModeOverlay;
-    field public static int windowFixedHeightMajor;
-    field public static int windowFixedHeightMinor;
-    field public static int windowFixedWidthMajor;
-    field public static int windowFixedWidthMinor;
-    field public static int windowMinWidthMajor;
-    field public static int windowMinWidthMinor;
-    field public static int windowNoTitle;
-  }
-
-  public static final class R.bool {
-    ctor public R.bool();
-    field public static int abc_action_bar_embed_tabs;
-    field public static int abc_allow_stacked_button_bar;
-    field public static int abc_config_actionMenuItemAllCaps;
-    field public static int abc_config_closeDialogWhenTouchOutside;
-    field public static int abc_config_showMenuShortcutsWhenKeyboardPresent;
-  }
-
-  public static final class R.color {
-    ctor public R.color();
-    field public static int abc_background_cache_hint_selector_material_dark;
-    field public static int abc_background_cache_hint_selector_material_light;
-    field public static int abc_btn_colored_borderless_text_material;
-    field public static int abc_color_highlight_material;
-    field public static int abc_input_method_navigation_guard;
-    field public static int abc_primary_text_disable_only_material_dark;
-    field public static int abc_primary_text_disable_only_material_light;
-    field public static int abc_primary_text_material_dark;
-    field public static int abc_primary_text_material_light;
-    field public static int abc_search_url_text;
-    field public static int abc_search_url_text_normal;
-    field public static int abc_search_url_text_pressed;
-    field public static int abc_search_url_text_selected;
-    field public static int abc_secondary_text_material_dark;
-    field public static int abc_secondary_text_material_light;
-    field public static int abc_tint_btn_checkable;
-    field public static int abc_tint_default;
-    field public static int abc_tint_edittext;
-    field public static int abc_tint_seek_thumb;
-    field public static int abc_tint_spinner;
-    field public static int abc_tint_switch_thumb;
-    field public static int abc_tint_switch_track;
-    field public static int accent_material_dark;
-    field public static int accent_material_light;
-    field public static int background_floating_material_dark;
-    field public static int background_floating_material_light;
-    field public static int background_material_dark;
-    field public static int background_material_light;
-    field public static int bright_foreground_disabled_material_dark;
-    field public static int bright_foreground_disabled_material_light;
-    field public static int bright_foreground_inverse_material_dark;
-    field public static int bright_foreground_inverse_material_light;
-    field public static int bright_foreground_material_dark;
-    field public static int bright_foreground_material_light;
-    field public static int button_material_dark;
-    field public static int button_material_light;
-    field public static int dim_foreground_disabled_material_dark;
-    field public static int dim_foreground_disabled_material_light;
-    field public static int dim_foreground_material_dark;
-    field public static int dim_foreground_material_light;
-    field public static int foreground_material_dark;
-    field public static int foreground_material_light;
-    field public static int highlighted_text_material_dark;
-    field public static int highlighted_text_material_light;
-    field public static int hint_foreground_material_dark;
-    field public static int hint_foreground_material_light;
-    field public static int material_blue_grey_800;
-    field public static int material_blue_grey_900;
-    field public static int material_blue_grey_950;
-    field public static int material_deep_teal_200;
-    field public static int material_deep_teal_500;
-    field public static int material_grey_100;
-    field public static int material_grey_300;
-    field public static int material_grey_50;
-    field public static int material_grey_600;
-    field public static int material_grey_800;
-    field public static int material_grey_850;
-    field public static int material_grey_900;
-    field public static int primary_dark_material_dark;
-    field public static int primary_dark_material_light;
-    field public static int primary_material_dark;
-    field public static int primary_material_light;
-    field public static int primary_text_default_material_dark;
-    field public static int primary_text_default_material_light;
-    field public static int primary_text_disabled_material_dark;
-    field public static int primary_text_disabled_material_light;
-    field public static int ripple_material_dark;
-    field public static int ripple_material_light;
-    field public static int secondary_text_default_material_dark;
-    field public static int secondary_text_default_material_light;
-    field public static int secondary_text_disabled_material_dark;
-    field public static int secondary_text_disabled_material_light;
-    field public static int switch_thumb_disabled_material_dark;
-    field public static int switch_thumb_disabled_material_light;
-    field public static int switch_thumb_material_dark;
-    field public static int switch_thumb_material_light;
-    field public static int switch_thumb_normal_material_dark;
-    field public static int switch_thumb_normal_material_light;
-  }
-
-  public static final class R.dimen {
-    ctor public R.dimen();
-    field public static int abc_action_bar_content_inset_material;
-    field public static int abc_action_bar_content_inset_with_nav;
-    field public static int abc_action_bar_default_height_material;
-    field public static int abc_action_bar_default_padding_end_material;
-    field public static int abc_action_bar_default_padding_start_material;
-    field public static int abc_action_bar_icon_vertical_padding_material;
-    field public static int abc_action_bar_overflow_padding_end_material;
-    field public static int abc_action_bar_overflow_padding_start_material;
-    field public static int abc_action_bar_progress_bar_size;
-    field public static int abc_action_bar_stacked_max_height;
-    field public static int abc_action_bar_stacked_tab_max_width;
-    field public static int abc_action_bar_subtitle_bottom_margin_material;
-    field public static int abc_action_bar_subtitle_top_margin_material;
-    field public static int abc_action_button_min_height_material;
-    field public static int abc_action_button_min_width_material;
-    field public static int abc_action_button_min_width_overflow_material;
-    field public static int abc_alert_dialog_button_bar_height;
-    field public static int abc_button_inset_horizontal_material;
-    field public static int abc_button_inset_vertical_material;
-    field public static int abc_button_padding_horizontal_material;
-    field public static int abc_button_padding_vertical_material;
-    field public static int abc_cascading_menus_min_smallest_width;
-    field public static int abc_config_prefDialogWidth;
-    field public static int abc_control_corner_material;
-    field public static int abc_control_inset_material;
-    field public static int abc_control_padding_material;
-    field public static int abc_dialog_fixed_height_major;
-    field public static int abc_dialog_fixed_height_minor;
-    field public static int abc_dialog_fixed_width_major;
-    field public static int abc_dialog_fixed_width_minor;
-    field public static int abc_dialog_list_padding_vertical_material;
-    field public static int abc_dialog_min_width_major;
-    field public static int abc_dialog_min_width_minor;
-    field public static int abc_dialog_padding_material;
-    field public static int abc_dialog_padding_top_material;
-    field public static int abc_disabled_alpha_material_dark;
-    field public static int abc_disabled_alpha_material_light;
-    field public static int abc_dropdownitem_icon_width;
-    field public static int abc_dropdownitem_text_padding_left;
-    field public static int abc_dropdownitem_text_padding_right;
-    field public static int abc_edit_text_inset_bottom_material;
-    field public static int abc_edit_text_inset_horizontal_material;
-    field public static int abc_edit_text_inset_top_material;
-    field public static int abc_floating_window_z;
-    field public static int abc_list_item_padding_horizontal_material;
-    field public static int abc_panel_menu_list_width;
-    field public static int abc_progress_bar_height_material;
-    field public static int abc_search_view_preferred_height;
-    field public static int abc_search_view_preferred_width;
-    field public static int abc_seekbar_track_background_height_material;
-    field public static int abc_seekbar_track_progress_height_material;
-    field public static int abc_select_dialog_padding_start_material;
-    field public static int abc_switch_padding;
-    field public static int abc_text_size_body_1_material;
-    field public static int abc_text_size_body_2_material;
-    field public static int abc_text_size_button_material;
-    field public static int abc_text_size_caption_material;
-    field public static int abc_text_size_display_1_material;
-    field public static int abc_text_size_display_2_material;
-    field public static int abc_text_size_display_3_material;
-    field public static int abc_text_size_display_4_material;
-    field public static int abc_text_size_headline_material;
-    field public static int abc_text_size_large_material;
-    field public static int abc_text_size_medium_material;
-    field public static int abc_text_size_menu_header_material;
-    field public static int abc_text_size_menu_material;
-    field public static int abc_text_size_small_material;
-    field public static int abc_text_size_subhead_material;
-    field public static int abc_text_size_subtitle_material_toolbar;
-    field public static int abc_text_size_title_material;
-    field public static int abc_text_size_title_material_toolbar;
-    field public static int disabled_alpha_material_dark;
-    field public static int disabled_alpha_material_light;
-    field public static int highlight_alpha_material_colored;
-    field public static int highlight_alpha_material_dark;
-    field public static int highlight_alpha_material_light;
-    field public static int notification_large_icon_height;
-    field public static int notification_large_icon_width;
-    field public static int notification_subtext_size;
-  }
-
-  public static final class R.drawable {
-    ctor public R.drawable();
-    field public static int abc_ab_share_pack_mtrl_alpha;
-    field public static int abc_action_bar_item_background_material;
-    field public static int abc_btn_borderless_material;
-    field public static int abc_btn_check_material;
-    field public static int abc_btn_check_to_on_mtrl_000;
-    field public static int abc_btn_check_to_on_mtrl_015;
-    field public static int abc_btn_colored_material;
-    field public static int abc_btn_default_mtrl_shape;
-    field public static int abc_btn_radio_material;
-    field public static int abc_btn_radio_to_on_mtrl_000;
-    field public static int abc_btn_radio_to_on_mtrl_015;
-    field public static int abc_btn_switch_to_on_mtrl_00001;
-    field public static int abc_btn_switch_to_on_mtrl_00012;
-    field public static int abc_cab_background_internal_bg;
-    field public static int abc_cab_background_top_material;
-    field public static int abc_cab_background_top_mtrl_alpha;
-    field public static int abc_control_background_material;
-    field public static int abc_dialog_material_background;
-    field public static int abc_edit_text_material;
-    field public static int abc_ic_ab_back_material;
-    field public static int abc_ic_arrow_drop_right_black_24dp;
-    field public static int abc_ic_clear_material;
-    field public static int abc_ic_commit_search_api_mtrl_alpha;
-    field public static int abc_ic_go_search_api_material;
-    field public static int abc_ic_menu_copy_mtrl_am_alpha;
-    field public static int abc_ic_menu_cut_mtrl_alpha;
-    field public static int abc_ic_menu_overflow_material;
-    field public static int abc_ic_menu_paste_mtrl_am_alpha;
-    field public static int abc_ic_menu_selectall_mtrl_alpha;
-    field public static int abc_ic_menu_share_mtrl_alpha;
-    field public static int abc_ic_search_api_material;
-    field public static int abc_ic_star_black_16dp;
-    field public static int abc_ic_star_black_36dp;
-    field public static int abc_ic_star_black_48dp;
-    field public static int abc_ic_star_half_black_16dp;
-    field public static int abc_ic_star_half_black_36dp;
-    field public static int abc_ic_star_half_black_48dp;
-    field public static int abc_ic_voice_search_api_material;
-    field public static int abc_item_background_holo_dark;
-    field public static int abc_item_background_holo_light;
-    field public static int abc_list_divider_mtrl_alpha;
-    field public static int abc_list_focused_holo;
-    field public static int abc_list_longpressed_holo;
-    field public static int abc_list_pressed_holo_dark;
-    field public static int abc_list_pressed_holo_light;
-    field public static int abc_list_selector_background_transition_holo_dark;
-    field public static int abc_list_selector_background_transition_holo_light;
-    field public static int abc_list_selector_disabled_holo_dark;
-    field public static int abc_list_selector_disabled_holo_light;
-    field public static int abc_list_selector_holo_dark;
-    field public static int abc_list_selector_holo_light;
-    field public static int abc_menu_hardkey_panel_mtrl_mult;
-    field public static int abc_popup_background_mtrl_mult;
-    field public static int abc_ratingbar_indicator_material;
-    field public static int abc_ratingbar_material;
-    field public static int abc_ratingbar_small_material;
-    field public static int abc_scrubber_control_off_mtrl_alpha;
-    field public static int abc_scrubber_control_to_pressed_mtrl_000;
-    field public static int abc_scrubber_control_to_pressed_mtrl_005;
-    field public static int abc_scrubber_primary_mtrl_alpha;
-    field public static int abc_scrubber_track_mtrl_alpha;
-    field public static int abc_seekbar_thumb_material;
-    field public static int abc_seekbar_tick_mark_material;
-    field public static int abc_seekbar_track_material;
-    field public static int abc_spinner_mtrl_am_alpha;
-    field public static int abc_spinner_textfield_background_material;
-    field public static int abc_switch_thumb_material;
-    field public static int abc_switch_track_mtrl_alpha;
-    field public static int abc_tab_indicator_material;
-    field public static int abc_tab_indicator_mtrl_alpha;
-    field public static int abc_text_cursor_material;
-    field public static int abc_textfield_activated_mtrl_alpha;
-    field public static int abc_textfield_default_mtrl_alpha;
-    field public static int abc_textfield_search_activated_mtrl_alpha;
-    field public static int abc_textfield_search_default_mtrl_alpha;
-    field public static int abc_textfield_search_material;
-    field public static int notification_template_icon_bg;
-  }
-
-  public static final class R.id {
-    ctor public R.id();
-    field public static int action0;
-    field public static int action_bar;
-    field public static int action_bar_activity_content;
-    field public static int action_bar_container;
-    field public static int action_bar_root;
-    field public static int action_bar_spinner;
-    field public static int action_bar_subtitle;
-    field public static int action_bar_title;
-    field public static int action_context_bar;
-    field public static int action_divider;
-    field public static int action_menu_divider;
-    field public static int action_menu_presenter;
-    field public static int action_mode_bar;
-    field public static int action_mode_bar_stub;
-    field public static int action_mode_close_button;
-    field public static int activity_chooser_view_content;
-    field public static int add;
-    field public static int alertTitle;
-    field public static int always;
-    field public static int beginning;
-    field public static int bottom;
-    field public static int buttonPanel;
-    field public static int cancel_action;
-    field public static int checkbox;
-    field public static int chronometer;
-    field public static int collapseActionView;
-    field public static int contentPanel;
-    field public static int custom;
-    field public static int customPanel;
-    field public static int decor_content_parent;
-    field public static int default_activity_button;
-    field public static int disableHome;
-    field public static int edit_query;
-    field public static int end;
-    field public static int end_padder;
-    field public static int expand_activities_button;
-    field public static int expanded_menu;
-    field public static int home;
-    field public static int homeAsUp;
-    field public static int icon;
-    field public static int ifRoom;
-    field public static int image;
-    field public static int info;
-    field public static int line1;
-    field public static int line3;
-    field public static int listMode;
-    field public static int list_item;
-    field public static int media_actions;
-    field public static int middle;
-    field public static int multiply;
-    field public static int never;
-    field public static int none;
-    field public static int normal;
-    field public static int parentPanel;
-    field public static int progress_circular;
-    field public static int progress_horizontal;
-    field public static int radio;
-    field public static int screen;
-    field public static int scrollIndicatorDown;
-    field public static int scrollIndicatorUp;
-    field public static int scrollView;
-    field public static int search_badge;
-    field public static int search_bar;
-    field public static int search_button;
-    field public static int search_close_btn;
-    field public static int search_edit_frame;
-    field public static int search_go_btn;
-    field public static int search_mag_icon;
-    field public static int search_plate;
-    field public static int search_src_text;
-    field public static int search_voice_btn;
-    field public static int select_dialog_listview;
-    field public static int shortcut;
-    field public static int showCustom;
-    field public static int showHome;
-    field public static int showTitle;
-    field public static int spacer;
-    field public static int split_action_bar;
-    field public static int src_atop;
-    field public static int src_in;
-    field public static int src_over;
-    field public static int status_bar_latest_event_content;
-    field public static int submenuarrow;
-    field public static int submit_area;
-    field public static int tabMode;
-    field public static int text;
-    field public static int text2;
-    field public static int textSpacerNoButtons;
-    field public static int time;
-    field public static int title;
-    field public static int title_template;
-    field public static int top;
-    field public static int topPanel;
-    field public static int up;
-    field public static int useLogo;
-    field public static int withText;
-    field public static int wrap_content;
-  }
-
-  public static final class R.integer {
-    ctor public R.integer();
-    field public static int abc_config_activityDefaultDur;
-    field public static int abc_config_activityShortDur;
-    field public static int cancel_button_image_alpha;
-    field public static int status_bar_notification_info_maxnum;
-  }
-
-  public static final class R.layout {
-    ctor public R.layout();
-    field public static int abc_action_bar_title_item;
-    field public static int abc_action_bar_up_container;
-    field public static int abc_action_bar_view_list_nav_layout;
-    field public static int abc_action_menu_item_layout;
-    field public static int abc_action_menu_layout;
-    field public static int abc_action_mode_bar;
-    field public static int abc_action_mode_close_item_material;
-    field public static int abc_activity_chooser_view;
-    field public static int abc_activity_chooser_view_list_item;
-    field public static int abc_alert_dialog_button_bar_material;
-    field public static int abc_alert_dialog_material;
-    field public static int abc_dialog_title_material;
-    field public static int abc_expanded_menu_layout;
-    field public static int abc_list_menu_item_checkbox;
-    field public static int abc_list_menu_item_icon;
-    field public static int abc_list_menu_item_layout;
-    field public static int abc_list_menu_item_radio;
-    field public static int abc_popup_menu_header_item_layout;
-    field public static int abc_popup_menu_item_layout;
-    field public static int abc_screen_content_include;
-    field public static int abc_screen_simple;
-    field public static int abc_screen_simple_overlay_action_mode;
-    field public static int abc_screen_toolbar;
-    field public static int abc_search_dropdown_item_icons_2line;
-    field public static int abc_search_view;
-    field public static int abc_select_dialog_material;
-    field public static int notification_media_action;
-    field public static int notification_media_cancel_action;
-    field public static int notification_template_big_media;
-    field public static int notification_template_big_media_narrow;
-    field public static int notification_template_lines;
-    field public static int notification_template_media;
-    field public static int notification_template_part_chronometer;
-    field public static int notification_template_part_time;
-    field public static int select_dialog_item_material;
-    field public static int select_dialog_multichoice_material;
-    field public static int select_dialog_singlechoice_material;
-    field public static int support_simple_spinner_dropdown_item;
-  }
-
-  public static final class R.string {
-    ctor public R.string();
-    field public static int abc_action_bar_home_description;
-    field public static int abc_action_bar_home_description_format;
-    field public static int abc_action_bar_home_subtitle_description_format;
-    field public static int abc_action_bar_up_description;
-    field public static int abc_action_menu_overflow_description;
-    field public static int abc_action_mode_done;
-    field public static int abc_activity_chooser_view_see_all;
-    field public static int abc_activitychooserview_choose_application;
-    field public static int abc_capital_off;
-    field public static int abc_capital_on;
-    field public static int abc_font_family_body_1_material;
-    field public static int abc_font_family_body_2_material;
-    field public static int abc_font_family_button_material;
-    field public static int abc_font_family_caption_material;
-    field public static int abc_font_family_display_1_material;
-    field public static int abc_font_family_display_2_material;
-    field public static int abc_font_family_display_3_material;
-    field public static int abc_font_family_display_4_material;
-    field public static int abc_font_family_headline_material;
-    field public static int abc_font_family_menu_material;
-    field public static int abc_font_family_subhead_material;
-    field public static int abc_font_family_title_material;
-    field public static int abc_search_hint;
-    field public static int abc_searchview_description_clear;
-    field public static int abc_searchview_description_query;
-    field public static int abc_searchview_description_search;
-    field public static int abc_searchview_description_submit;
-    field public static int abc_searchview_description_voice;
-    field public static int abc_shareactionprovider_share_with;
-    field public static int abc_shareactionprovider_share_with_application;
-    field public static int abc_toolbar_collapse_description;
-    field public static int status_bar_notification_info_overflow;
-  }
-
-  public static final class R.style {
-    ctor public R.style();
-    field public static int AlertDialog_AppCompat;
-    field public static int AlertDialog_AppCompat_Light;
-    field public static int Animation_AppCompat_Dialog;
-    field public static int Animation_AppCompat_DropDownUp;
-    field public static int Base_AlertDialog_AppCompat;
-    field public static int Base_AlertDialog_AppCompat_Light;
-    field public static int Base_Animation_AppCompat_Dialog;
-    field public static int Base_Animation_AppCompat_DropDownUp;
-    field public static int Base_DialogWindowTitleBackground_AppCompat;
-    field public static int Base_DialogWindowTitle_AppCompat;
-    field public static int Base_TextAppearance_AppCompat;
-    field public static int Base_TextAppearance_AppCompat_Body1;
-    field public static int Base_TextAppearance_AppCompat_Body2;
-    field public static int Base_TextAppearance_AppCompat_Button;
-    field public static int Base_TextAppearance_AppCompat_Caption;
-    field public static int Base_TextAppearance_AppCompat_Display1;
-    field public static int Base_TextAppearance_AppCompat_Display2;
-    field public static int Base_TextAppearance_AppCompat_Display3;
-    field public static int Base_TextAppearance_AppCompat_Display4;
-    field public static int Base_TextAppearance_AppCompat_Headline;
-    field public static int Base_TextAppearance_AppCompat_Inverse;
-    field public static int Base_TextAppearance_AppCompat_Large;
-    field public static int Base_TextAppearance_AppCompat_Large_Inverse;
-    field public static int Base_TextAppearance_AppCompat_Light_Widget_PopupMenu_Large;
-    field public static int Base_TextAppearance_AppCompat_Light_Widget_PopupMenu_Small;
-    field public static int Base_TextAppearance_AppCompat_Medium;
-    field public static int Base_TextAppearance_AppCompat_Medium_Inverse;
-    field public static int Base_TextAppearance_AppCompat_Menu;
-    field public static int Base_TextAppearance_AppCompat_SearchResult;
-    field public static int Base_TextAppearance_AppCompat_SearchResult_Subtitle;
-    field public static int Base_TextAppearance_AppCompat_SearchResult_Title;
-    field public static int Base_TextAppearance_AppCompat_Small;
-    field public static int Base_TextAppearance_AppCompat_Small_Inverse;
-    field public static int Base_TextAppearance_AppCompat_Subhead;
-    field public static int Base_TextAppearance_AppCompat_Subhead_Inverse;
-    field public static int Base_TextAppearance_AppCompat_Title;
-    field public static int Base_TextAppearance_AppCompat_Title_Inverse;
-    field public static int Base_TextAppearance_AppCompat_Widget_ActionBar_Menu;
-    field public static int Base_TextAppearance_AppCompat_Widget_ActionBar_Subtitle;
-    field public static int Base_TextAppearance_AppCompat_Widget_ActionBar_Subtitle_Inverse;
-    field public static int Base_TextAppearance_AppCompat_Widget_ActionBar_Title;
-    field public static int Base_TextAppearance_AppCompat_Widget_ActionBar_Title_Inverse;
-    field public static int Base_TextAppearance_AppCompat_Widget_ActionMode_Subtitle;
-    field public static int Base_TextAppearance_AppCompat_Widget_ActionMode_Title;
-    field public static int Base_TextAppearance_AppCompat_Widget_Button;
-    field public static int Base_TextAppearance_AppCompat_Widget_Button_Inverse;
-    field public static int Base_TextAppearance_AppCompat_Widget_DropDownItem;
-    field public static int Base_TextAppearance_AppCompat_Widget_PopupMenu_Header;
-    field public static int Base_TextAppearance_AppCompat_Widget_PopupMenu_Large;
-    field public static int Base_TextAppearance_AppCompat_Widget_PopupMenu_Small;
-    field public static int Base_TextAppearance_AppCompat_Widget_Switch;
-    field public static int Base_TextAppearance_AppCompat_Widget_TextView_SpinnerItem;
-    field public static int Base_TextAppearance_Widget_AppCompat_ExpandedMenu_Item;
-    field public static int Base_TextAppearance_Widget_AppCompat_Toolbar_Subtitle;
-    field public static int Base_TextAppearance_Widget_AppCompat_Toolbar_Title;
-    field public static int Base_ThemeOverlay_AppCompat;
-    field public static int Base_ThemeOverlay_AppCompat_ActionBar;
-    field public static int Base_ThemeOverlay_AppCompat_Dark;
-    field public static int Base_ThemeOverlay_AppCompat_Dark_ActionBar;
-    field public static int Base_ThemeOverlay_AppCompat_Dialog;
-    field public static int Base_ThemeOverlay_AppCompat_Dialog_Alert;
-    field public static int Base_ThemeOverlay_AppCompat_Light;
-    field public static int Base_Theme_AppCompat;
-    field public static int Base_Theme_AppCompat_CompactMenu;
-    field public static int Base_Theme_AppCompat_Dialog;
-    field public static int Base_Theme_AppCompat_DialogWhenLarge;
-    field public static int Base_Theme_AppCompat_Dialog_Alert;
-    field public static int Base_Theme_AppCompat_Dialog_FixedSize;
-    field public static int Base_Theme_AppCompat_Dialog_MinWidth;
-    field public static int Base_Theme_AppCompat_Light;
-    field public static int Base_Theme_AppCompat_Light_DarkActionBar;
-    field public static int Base_Theme_AppCompat_Light_Dialog;
-    field public static int Base_Theme_AppCompat_Light_DialogWhenLarge;
-    field public static int Base_Theme_AppCompat_Light_Dialog_Alert;
-    field public static int Base_Theme_AppCompat_Light_Dialog_FixedSize;
-    field public static int Base_Theme_AppCompat_Light_Dialog_MinWidth;
-    field public static int Base_V11_ThemeOverlay_AppCompat_Dialog;
-    field public static int Base_V11_Theme_AppCompat_Dialog;
-    field public static int Base_V11_Theme_AppCompat_Light_Dialog;
-    field public static int Base_V12_Widget_AppCompat_AutoCompleteTextView;
-    field public static int Base_V12_Widget_AppCompat_EditText;
-    field public static int Base_V21_ThemeOverlay_AppCompat_Dialog;
-    field public static int Base_V21_Theme_AppCompat;
-    field public static int Base_V21_Theme_AppCompat_Dialog;
-    field public static int Base_V21_Theme_AppCompat_Light;
-    field public static int Base_V21_Theme_AppCompat_Light_Dialog;
-    field public static int Base_V22_Theme_AppCompat;
-    field public static int Base_V22_Theme_AppCompat_Light;
-    field public static int Base_V23_Theme_AppCompat;
-    field public static int Base_V23_Theme_AppCompat_Light;
-    field public static int Base_V7_ThemeOverlay_AppCompat_Dialog;
-    field public static int Base_V7_Theme_AppCompat;
-    field public static int Base_V7_Theme_AppCompat_Dialog;
-    field public static int Base_V7_Theme_AppCompat_Light;
-    field public static int Base_V7_Theme_AppCompat_Light_Dialog;
-    field public static int Base_V7_Widget_AppCompat_AutoCompleteTextView;
-    field public static int Base_V7_Widget_AppCompat_EditText;
-    field public static int Base_Widget_AppCompat_ActionBar;
-    field public static int Base_Widget_AppCompat_ActionBar_Solid;
-    field public static int Base_Widget_AppCompat_ActionBar_TabBar;
-    field public static int Base_Widget_AppCompat_ActionBar_TabText;
-    field public static int Base_Widget_AppCompat_ActionBar_TabView;
-    field public static int Base_Widget_AppCompat_ActionButton;
-    field public static int Base_Widget_AppCompat_ActionButton_CloseMode;
-    field public static int Base_Widget_AppCompat_ActionButton_Overflow;
-    field public static int Base_Widget_AppCompat_ActionMode;
-    field public static int Base_Widget_AppCompat_ActivityChooserView;
-    field public static int Base_Widget_AppCompat_AutoCompleteTextView;
-    field public static int Base_Widget_AppCompat_Button;
-    field public static int Base_Widget_AppCompat_ButtonBar;
-    field public static int Base_Widget_AppCompat_ButtonBar_AlertDialog;
-    field public static int Base_Widget_AppCompat_Button_Borderless;
-    field public static int Base_Widget_AppCompat_Button_Borderless_Colored;
-    field public static int Base_Widget_AppCompat_Button_ButtonBar_AlertDialog;
-    field public static int Base_Widget_AppCompat_Button_Colored;
-    field public static int Base_Widget_AppCompat_Button_Small;
-    field public static int Base_Widget_AppCompat_CompoundButton_CheckBox;
-    field public static int Base_Widget_AppCompat_CompoundButton_RadioButton;
-    field public static int Base_Widget_AppCompat_CompoundButton_Switch;
-    field public static int Base_Widget_AppCompat_DrawerArrowToggle;
-    field public static int Base_Widget_AppCompat_DrawerArrowToggle_Common;
-    field public static int Base_Widget_AppCompat_DropDownItem_Spinner;
-    field public static int Base_Widget_AppCompat_EditText;
-    field public static int Base_Widget_AppCompat_ImageButton;
-    field public static int Base_Widget_AppCompat_Light_ActionBar;
-    field public static int Base_Widget_AppCompat_Light_ActionBar_Solid;
-    field public static int Base_Widget_AppCompat_Light_ActionBar_TabBar;
-    field public static int Base_Widget_AppCompat_Light_ActionBar_TabText;
-    field public static int Base_Widget_AppCompat_Light_ActionBar_TabText_Inverse;
-    field public static int Base_Widget_AppCompat_Light_ActionBar_TabView;
-    field public static int Base_Widget_AppCompat_Light_PopupMenu;
-    field public static int Base_Widget_AppCompat_Light_PopupMenu_Overflow;
-    field public static int Base_Widget_AppCompat_ListMenuView;
-    field public static int Base_Widget_AppCompat_ListPopupWindow;
-    field public static int Base_Widget_AppCompat_ListView;
-    field public static int Base_Widget_AppCompat_ListView_DropDown;
-    field public static int Base_Widget_AppCompat_ListView_Menu;
-    field public static int Base_Widget_AppCompat_PopupMenu;
-    field public static int Base_Widget_AppCompat_PopupMenu_Overflow;
-    field public static int Base_Widget_AppCompat_PopupWindow;
-    field public static int Base_Widget_AppCompat_ProgressBar;
-    field public static int Base_Widget_AppCompat_ProgressBar_Horizontal;
-    field public static int Base_Widget_AppCompat_RatingBar;
-    field public static int Base_Widget_AppCompat_RatingBar_Indicator;
-    field public static int Base_Widget_AppCompat_RatingBar_Small;
-    field public static int Base_Widget_AppCompat_SearchView;
-    field public static int Base_Widget_AppCompat_SearchView_ActionBar;
-    field public static int Base_Widget_AppCompat_SeekBar;
-    field public static int Base_Widget_AppCompat_SeekBar_Discrete;
-    field public static int Base_Widget_AppCompat_Spinner;
-    field public static int Base_Widget_AppCompat_Spinner_Underlined;
-    field public static int Base_Widget_AppCompat_TextView_SpinnerItem;
-    field public static int Base_Widget_AppCompat_Toolbar;
-    field public static int Base_Widget_AppCompat_Toolbar_Button_Navigation;
-    field public static int Platform_AppCompat;
-    field public static int Platform_AppCompat_Light;
-    field public static int Platform_ThemeOverlay_AppCompat;
-    field public static int Platform_ThemeOverlay_AppCompat_Dark;
-    field public static int Platform_ThemeOverlay_AppCompat_Light;
-    field public static int Platform_V11_AppCompat;
-    field public static int Platform_V11_AppCompat_Light;
-    field public static int Platform_V14_AppCompat;
-    field public static int Platform_V14_AppCompat_Light;
-    field public static int Platform_Widget_AppCompat_Spinner;
-    field public static int RtlOverlay_DialogWindowTitle_AppCompat;
-    field public static int RtlOverlay_Widget_AppCompat_ActionBar_TitleItem;
-    field public static int RtlOverlay_Widget_AppCompat_DialogTitle_Icon;
-    field public static int RtlOverlay_Widget_AppCompat_PopupMenuItem;
-    field public static int RtlOverlay_Widget_AppCompat_PopupMenuItem_InternalGroup;
-    field public static int RtlOverlay_Widget_AppCompat_PopupMenuItem_Text;
-    field public static int RtlOverlay_Widget_AppCompat_SearchView_MagIcon;
-    field public static int RtlOverlay_Widget_AppCompat_Search_DropDown;
-    field public static int RtlOverlay_Widget_AppCompat_Search_DropDown_Icon1;
-    field public static int RtlOverlay_Widget_AppCompat_Search_DropDown_Icon2;
-    field public static int RtlOverlay_Widget_AppCompat_Search_DropDown_Query;
-    field public static int RtlOverlay_Widget_AppCompat_Search_DropDown_Text;
-    field public static int RtlUnderlay_Widget_AppCompat_ActionButton;
-    field public static int RtlUnderlay_Widget_AppCompat_ActionButton_Overflow;
-    field public static int TextAppearance_AppCompat;
-    field public static int TextAppearance_AppCompat_Body1;
-    field public static int TextAppearance_AppCompat_Body2;
-    field public static int TextAppearance_AppCompat_Button;
-    field public static int TextAppearance_AppCompat_Caption;
-    field public static int TextAppearance_AppCompat_Display1;
-    field public static int TextAppearance_AppCompat_Display2;
-    field public static int TextAppearance_AppCompat_Display3;
-    field public static int TextAppearance_AppCompat_Display4;
-    field public static int TextAppearance_AppCompat_Headline;
-    field public static int TextAppearance_AppCompat_Inverse;
-    field public static int TextAppearance_AppCompat_Large;
-    field public static int TextAppearance_AppCompat_Large_Inverse;
-    field public static int TextAppearance_AppCompat_Light_SearchResult_Subtitle;
-    field public static int TextAppearance_AppCompat_Light_SearchResult_Title;
-    field public static int TextAppearance_AppCompat_Light_Widget_PopupMenu_Large;
-    field public static int TextAppearance_AppCompat_Light_Widget_PopupMenu_Small;
-    field public static int TextAppearance_AppCompat_Medium;
-    field public static int TextAppearance_AppCompat_Medium_Inverse;
-    field public static int TextAppearance_AppCompat_Menu;
-    field public static int TextAppearance_AppCompat_SearchResult_Subtitle;
-    field public static int TextAppearance_AppCompat_SearchResult_Title;
-    field public static int TextAppearance_AppCompat_Small;
-    field public static int TextAppearance_AppCompat_Small_Inverse;
-    field public static int TextAppearance_AppCompat_Subhead;
-    field public static int TextAppearance_AppCompat_Subhead_Inverse;
-    field public static int TextAppearance_AppCompat_Title;
-    field public static int TextAppearance_AppCompat_Title_Inverse;
-    field public static int TextAppearance_AppCompat_Widget_ActionBar_Menu;
-    field public static int TextAppearance_AppCompat_Widget_ActionBar_Subtitle;
-    field public static int TextAppearance_AppCompat_Widget_ActionBar_Subtitle_Inverse;
-    field public static int TextAppearance_AppCompat_Widget_ActionBar_Title;
-    field public static int TextAppearance_AppCompat_Widget_ActionBar_Title_Inverse;
-    field public static int TextAppearance_AppCompat_Widget_ActionMode_Subtitle;
-    field public static int TextAppearance_AppCompat_Widget_ActionMode_Subtitle_Inverse;
-    field public static int TextAppearance_AppCompat_Widget_ActionMode_Title;
-    field public static int TextAppearance_AppCompat_Widget_ActionMode_Title_Inverse;
-    field public static int TextAppearance_AppCompat_Widget_Button;
-    field public static int TextAppearance_AppCompat_Widget_Button_Inverse;
-    field public static int TextAppearance_AppCompat_Widget_DropDownItem;
-    field public static int TextAppearance_AppCompat_Widget_PopupMenu_Header;
-    field public static int TextAppearance_AppCompat_Widget_PopupMenu_Large;
-    field public static int TextAppearance_AppCompat_Widget_PopupMenu_Small;
-    field public static int TextAppearance_AppCompat_Widget_Switch;
-    field public static int TextAppearance_AppCompat_Widget_TextView_SpinnerItem;
-    field public static int TextAppearance_StatusBar_EventContent;
-    field public static int TextAppearance_StatusBar_EventContent_Info;
-    field public static int TextAppearance_StatusBar_EventContent_Line2;
-    field public static int TextAppearance_StatusBar_EventContent_Time;
-    field public static int TextAppearance_StatusBar_EventContent_Title;
-    field public static int TextAppearance_Widget_AppCompat_ExpandedMenu_Item;
-    field public static int TextAppearance_Widget_AppCompat_Toolbar_Subtitle;
-    field public static int TextAppearance_Widget_AppCompat_Toolbar_Title;
-    field public static int ThemeOverlay_AppCompat;
-    field public static int ThemeOverlay_AppCompat_ActionBar;
-    field public static int ThemeOverlay_AppCompat_Dark;
-    field public static int ThemeOverlay_AppCompat_Dark_ActionBar;
-    field public static int ThemeOverlay_AppCompat_Dialog;
-    field public static int ThemeOverlay_AppCompat_Dialog_Alert;
-    field public static int ThemeOverlay_AppCompat_Light;
-    field public static int Theme_AppCompat;
-    field public static int Theme_AppCompat_CompactMenu;
-    field public static int Theme_AppCompat_DayNight;
-    field public static int Theme_AppCompat_DayNight_DarkActionBar;
-    field public static int Theme_AppCompat_DayNight_Dialog;
-    field public static int Theme_AppCompat_DayNight_DialogWhenLarge;
-    field public static int Theme_AppCompat_DayNight_Dialog_Alert;
-    field public static int Theme_AppCompat_DayNight_Dialog_MinWidth;
-    field public static int Theme_AppCompat_DayNight_NoActionBar;
-    field public static int Theme_AppCompat_Dialog;
-    field public static int Theme_AppCompat_DialogWhenLarge;
-    field public static int Theme_AppCompat_Dialog_Alert;
-    field public static int Theme_AppCompat_Dialog_MinWidth;
-    field public static int Theme_AppCompat_Light;
-    field public static int Theme_AppCompat_Light_DarkActionBar;
-    field public static int Theme_AppCompat_Light_Dialog;
-    field public static int Theme_AppCompat_Light_DialogWhenLarge;
-    field public static int Theme_AppCompat_Light_Dialog_Alert;
-    field public static int Theme_AppCompat_Light_Dialog_MinWidth;
-    field public static int Theme_AppCompat_Light_NoActionBar;
-    field public static int Theme_AppCompat_NoActionBar;
-    field public static int Widget_AppCompat_ActionBar;
-    field public static int Widget_AppCompat_ActionBar_Solid;
-    field public static int Widget_AppCompat_ActionBar_TabBar;
-    field public static int Widget_AppCompat_ActionBar_TabText;
-    field public static int Widget_AppCompat_ActionBar_TabView;
-    field public static int Widget_AppCompat_ActionButton;
-    field public static int Widget_AppCompat_ActionButton_CloseMode;
-    field public static int Widget_AppCompat_ActionButton_Overflow;
-    field public static int Widget_AppCompat_ActionMode;
-    field public static int Widget_AppCompat_ActivityChooserView;
-    field public static int Widget_AppCompat_AutoCompleteTextView;
-    field public static int Widget_AppCompat_Button;
-    field public static int Widget_AppCompat_ButtonBar;
-    field public static int Widget_AppCompat_ButtonBar_AlertDialog;
-    field public static int Widget_AppCompat_Button_Borderless;
-    field public static int Widget_AppCompat_Button_Borderless_Colored;
-    field public static int Widget_AppCompat_Button_ButtonBar_AlertDialog;
-    field public static int Widget_AppCompat_Button_Colored;
-    field public static int Widget_AppCompat_Button_Small;
-    field public static int Widget_AppCompat_CompoundButton_CheckBox;
-    field public static int Widget_AppCompat_CompoundButton_RadioButton;
-    field public static int Widget_AppCompat_CompoundButton_Switch;
-    field public static int Widget_AppCompat_DrawerArrowToggle;
-    field public static int Widget_AppCompat_DropDownItem_Spinner;
-    field public static int Widget_AppCompat_EditText;
-    field public static int Widget_AppCompat_ImageButton;
-    field public static int Widget_AppCompat_Light_ActionBar;
-    field public static int Widget_AppCompat_Light_ActionBar_Solid;
-    field public static int Widget_AppCompat_Light_ActionBar_Solid_Inverse;
-    field public static int Widget_AppCompat_Light_ActionBar_TabBar;
-    field public static int Widget_AppCompat_Light_ActionBar_TabBar_Inverse;
-    field public static int Widget_AppCompat_Light_ActionBar_TabText;
-    field public static int Widget_AppCompat_Light_ActionBar_TabText_Inverse;
-    field public static int Widget_AppCompat_Light_ActionBar_TabView;
-    field public static int Widget_AppCompat_Light_ActionBar_TabView_Inverse;
-    field public static int Widget_AppCompat_Light_ActionButton;
-    field public static int Widget_AppCompat_Light_ActionButton_CloseMode;
-    field public static int Widget_AppCompat_Light_ActionButton_Overflow;
-    field public static int Widget_AppCompat_Light_ActionMode_Inverse;
-    field public static int Widget_AppCompat_Light_ActivityChooserView;
-    field public static int Widget_AppCompat_Light_AutoCompleteTextView;
-    field public static int Widget_AppCompat_Light_DropDownItem_Spinner;
-    field public static int Widget_AppCompat_Light_ListPopupWindow;
-    field public static int Widget_AppCompat_Light_ListView_DropDown;
-    field public static int Widget_AppCompat_Light_PopupMenu;
-    field public static int Widget_AppCompat_Light_PopupMenu_Overflow;
-    field public static int Widget_AppCompat_Light_SearchView;
-    field public static int Widget_AppCompat_Light_Spinner_DropDown_ActionBar;
-    field public static int Widget_AppCompat_ListMenuView;
-    field public static int Widget_AppCompat_ListPopupWindow;
-    field public static int Widget_AppCompat_ListView;
-    field public static int Widget_AppCompat_ListView_DropDown;
-    field public static int Widget_AppCompat_ListView_Menu;
-    field public static int Widget_AppCompat_PopupMenu;
-    field public static int Widget_AppCompat_PopupMenu_Overflow;
-    field public static int Widget_AppCompat_PopupWindow;
-    field public static int Widget_AppCompat_ProgressBar;
-    field public static int Widget_AppCompat_ProgressBar_Horizontal;
-    field public static int Widget_AppCompat_RatingBar;
-    field public static int Widget_AppCompat_RatingBar_Indicator;
-    field public static int Widget_AppCompat_RatingBar_Small;
-    field public static int Widget_AppCompat_SearchView;
-    field public static int Widget_AppCompat_SearchView_ActionBar;
-    field public static int Widget_AppCompat_SeekBar;
-    field public static int Widget_AppCompat_SeekBar_Discrete;
-    field public static int Widget_AppCompat_Spinner;
-    field public static int Widget_AppCompat_Spinner_DropDown;
-    field public static int Widget_AppCompat_Spinner_DropDown_ActionBar;
-    field public static int Widget_AppCompat_Spinner_Underlined;
-    field public static int Widget_AppCompat_TextView_SpinnerItem;
-    field public static int Widget_AppCompat_Toolbar;
-    field public static int Widget_AppCompat_Toolbar_Button_Navigation;
-  }
-
-  public static final class R.styleable {
-    ctor public R.styleable();
-    field public static final int[] ActionBar;
-    field public static final int[] ActionBarLayout;
-    field public static int ActionBarLayout_android_layout_gravity;
-    field public static int ActionBar_background;
-    field public static int ActionBar_backgroundSplit;
-    field public static int ActionBar_backgroundStacked;
-    field public static int ActionBar_contentInsetEnd;
-    field public static int ActionBar_contentInsetEndWithActions;
-    field public static int ActionBar_contentInsetLeft;
-    field public static int ActionBar_contentInsetRight;
-    field public static int ActionBar_contentInsetStart;
-    field public static int ActionBar_contentInsetStartWithNavigation;
-    field public static int ActionBar_customNavigationLayout;
-    field public static int ActionBar_displayOptions;
-    field public static int ActionBar_divider;
-    field public static int ActionBar_elevation;
-    field public static int ActionBar_height;
-    field public static int ActionBar_hideOnContentScroll;
-    field public static int ActionBar_homeAsUpIndicator;
-    field public static int ActionBar_homeLayout;
-    field public static int ActionBar_icon;
-    field public static int ActionBar_indeterminateProgressStyle;
-    field public static int ActionBar_itemPadding;
-    field public static int ActionBar_logo;
-    field public static int ActionBar_navigationMode;
-    field public static int ActionBar_popupTheme;
-    field public static int ActionBar_progressBarPadding;
-    field public static int ActionBar_progressBarStyle;
-    field public static int ActionBar_subtitle;
-    field public static int ActionBar_subtitleTextStyle;
-    field public static int ActionBar_title;
-    field public static int ActionBar_titleTextStyle;
-    field public static final int[] ActionMenuItemView;
-    field public static int ActionMenuItemView_android_minWidth;
-    field public static final int[] ActionMenuView;
-    field public static final int[] ActionMode;
-    field public static int ActionMode_background;
-    field public static int ActionMode_backgroundSplit;
-    field public static int ActionMode_closeItemLayout;
-    field public static int ActionMode_height;
-    field public static int ActionMode_subtitleTextStyle;
-    field public static int ActionMode_titleTextStyle;
-    field public static final int[] ActivityChooserView;
-    field public static int ActivityChooserView_expandActivityOverflowButtonDrawable;
-    field public static int ActivityChooserView_initialActivityCount;
-    field public static final int[] AlertDialog;
-    field public static int AlertDialog_android_layout;
-    field public static int AlertDialog_buttonPanelSideLayout;
-    field public static int AlertDialog_listItemLayout;
-    field public static int AlertDialog_listLayout;
-    field public static int AlertDialog_multiChoiceItemLayout;
-    field public static int AlertDialog_singleChoiceItemLayout;
-    field public static final int[] AppCompatImageView;
-    field public static int AppCompatImageView_android_src;
-    field public static int AppCompatImageView_srcCompat;
-    field public static final int[] AppCompatSeekBar;
-    field public static int AppCompatSeekBar_android_thumb;
-    field public static int AppCompatSeekBar_tickMark;
-    field public static int AppCompatSeekBar_tickMarkTint;
-    field public static int AppCompatSeekBar_tickMarkTintMode;
-    field public static final int[] AppCompatTextView;
-    field public static int AppCompatTextView_android_textAppearance;
-    field public static int AppCompatTextView_textAllCaps;
-    field public static final int[] AppCompatTheme;
-    field public static int AppCompatTheme_actionBarDivider;
-    field public static int AppCompatTheme_actionBarItemBackground;
-    field public static int AppCompatTheme_actionBarPopupTheme;
-    field public static int AppCompatTheme_actionBarSize;
-    field public static int AppCompatTheme_actionBarSplitStyle;
-    field public static int AppCompatTheme_actionBarStyle;
-    field public static int AppCompatTheme_actionBarTabBarStyle;
-    field public static int AppCompatTheme_actionBarTabStyle;
-    field public static int AppCompatTheme_actionBarTabTextStyle;
-    field public static int AppCompatTheme_actionBarTheme;
-    field public static int AppCompatTheme_actionBarWidgetTheme;
-    field public static int AppCompatTheme_actionButtonStyle;
-    field public static int AppCompatTheme_actionDropDownStyle;
-    field public static int AppCompatTheme_actionMenuTextAppearance;
-    field public static int AppCompatTheme_actionMenuTextColor;
-    field public static int AppCompatTheme_actionModeBackground;
-    field public static int AppCompatTheme_actionModeCloseButtonStyle;
-    field public static int AppCompatTheme_actionModeCloseDrawable;
-    field public static int AppCompatTheme_actionModeCopyDrawable;
-    field public static int AppCompatTheme_actionModeCutDrawable;
-    field public static int AppCompatTheme_actionModeFindDrawable;
-    field public static int AppCompatTheme_actionModePasteDrawable;
-    field public static int AppCompatTheme_actionModePopupWindowStyle;
-    field public static int AppCompatTheme_actionModeSelectAllDrawable;
-    field public static int AppCompatTheme_actionModeShareDrawable;
-    field public static int AppCompatTheme_actionModeSplitBackground;
-    field public static int AppCompatTheme_actionModeStyle;
-    field public static int AppCompatTheme_actionModeWebSearchDrawable;
-    field public static int AppCompatTheme_actionOverflowButtonStyle;
-    field public static int AppCompatTheme_actionOverflowMenuStyle;
-    field public static int AppCompatTheme_activityChooserViewStyle;
-    field public static int AppCompatTheme_alertDialogButtonGroupStyle;
-    field public static int AppCompatTheme_alertDialogCenterButtons;
-    field public static int AppCompatTheme_alertDialogStyle;
-    field public static int AppCompatTheme_alertDialogTheme;
-    field public static int AppCompatTheme_android_windowAnimationStyle;
-    field public static int AppCompatTheme_android_windowIsFloating;
-    field public static int AppCompatTheme_autoCompleteTextViewStyle;
-    field public static int AppCompatTheme_borderlessButtonStyle;
-    field public static int AppCompatTheme_buttonBarButtonStyle;
-    field public static int AppCompatTheme_buttonBarNegativeButtonStyle;
-    field public static int AppCompatTheme_buttonBarNeutralButtonStyle;
-    field public static int AppCompatTheme_buttonBarPositiveButtonStyle;
-    field public static int AppCompatTheme_buttonBarStyle;
-    field public static int AppCompatTheme_buttonStyle;
-    field public static int AppCompatTheme_buttonStyleSmall;
-    field public static int AppCompatTheme_checkboxStyle;
-    field public static int AppCompatTheme_checkedTextViewStyle;
-    field public static int AppCompatTheme_colorAccent;
-    field public static int AppCompatTheme_colorBackgroundFloating;
-    field public static int AppCompatTheme_colorButtonNormal;
-    field public static int AppCompatTheme_colorControlActivated;
-    field public static int AppCompatTheme_colorControlHighlight;
-    field public static int AppCompatTheme_colorControlNormal;
-    field public static int AppCompatTheme_colorPrimary;
-    field public static int AppCompatTheme_colorPrimaryDark;
-    field public static int AppCompatTheme_colorSwitchThumbNormal;
-    field public static int AppCompatTheme_controlBackground;
-    field public static int AppCompatTheme_dialogPreferredPadding;
-    field public static int AppCompatTheme_dialogTheme;
-    field public static int AppCompatTheme_dividerHorizontal;
-    field public static int AppCompatTheme_dividerVertical;
-    field public static int AppCompatTheme_dropDownListViewStyle;
-    field public static int AppCompatTheme_dropdownListPreferredItemHeight;
-    field public static int AppCompatTheme_editTextBackground;
-    field public static int AppCompatTheme_editTextColor;
-    field public static int AppCompatTheme_editTextStyle;
-    field public static int AppCompatTheme_homeAsUpIndicator;
-    field public static int AppCompatTheme_imageButtonStyle;
-    field public static int AppCompatTheme_listChoiceBackgroundIndicator;
-    field public static int AppCompatTheme_listDividerAlertDialog;
-    field public static int AppCompatTheme_listMenuViewStyle;
-    field public static int AppCompatTheme_listPopupWindowStyle;
-    field public static int AppCompatTheme_listPreferredItemHeight;
-    field public static int AppCompatTheme_listPreferredItemHeightLarge;
-    field public static int AppCompatTheme_listPreferredItemHeightSmall;
-    field public static int AppCompatTheme_listPreferredItemPaddingLeft;
-    field public static int AppCompatTheme_listPreferredItemPaddingRight;
-    field public static int AppCompatTheme_panelBackground;
-    field public static int AppCompatTheme_panelMenuListTheme;
-    field public static int AppCompatTheme_panelMenuListWidth;
-    field public static int AppCompatTheme_popupMenuStyle;
-    field public static int AppCompatTheme_popupWindowStyle;
-    field public static int AppCompatTheme_radioButtonStyle;
-    field public static int AppCompatTheme_ratingBarStyle;
-    field public static int AppCompatTheme_ratingBarStyleIndicator;
-    field public static int AppCompatTheme_ratingBarStyleSmall;
-    field public static int AppCompatTheme_searchViewStyle;
-    field public static int AppCompatTheme_seekBarStyle;
-    field public static int AppCompatTheme_selectableItemBackground;
-    field public static int AppCompatTheme_selectableItemBackgroundBorderless;
-    field public static int AppCompatTheme_spinnerDropDownItemStyle;
-    field public static int AppCompatTheme_spinnerStyle;
-    field public static int AppCompatTheme_switchStyle;
-    field public static int AppCompatTheme_textAppearanceLargePopupMenu;
-    field public static int AppCompatTheme_textAppearanceListItem;
-    field public static int AppCompatTheme_textAppearanceListItemSmall;
-    field public static int AppCompatTheme_textAppearancePopupMenuHeader;
-    field public static int AppCompatTheme_textAppearanceSearchResultSubtitle;
-    field public static int AppCompatTheme_textAppearanceSearchResultTitle;
-    field public static int AppCompatTheme_textAppearanceSmallPopupMenu;
-    field public static int AppCompatTheme_textColorAlertDialogListItem;
-    field public static int AppCompatTheme_textColorSearchUrl;
-    field public static int AppCompatTheme_toolbarNavigationButtonStyle;
-    field public static int AppCompatTheme_toolbarStyle;
-    field public static int AppCompatTheme_windowActionBar;
-    field public static int AppCompatTheme_windowActionBarOverlay;
-    field public static int AppCompatTheme_windowActionModeOverlay;
-    field public static int AppCompatTheme_windowFixedHeightMajor;
-    field public static int AppCompatTheme_windowFixedHeightMinor;
-    field public static int AppCompatTheme_windowFixedWidthMajor;
-    field public static int AppCompatTheme_windowFixedWidthMinor;
-    field public static int AppCompatTheme_windowMinWidthMajor;
-    field public static int AppCompatTheme_windowMinWidthMinor;
-    field public static int AppCompatTheme_windowNoTitle;
-    field public static int ButtonBarLayout_allowStacking;
-    field public static final int[] ColorStateListItem;
-    field public static int ColorStateListItem_alpha;
-    field public static int ColorStateListItem_android_alpha;
-    field public static int ColorStateListItem_android_color;
-    field public static final int[] CompoundButton;
-    field public static int CompoundButton_android_button;
-    field public static int CompoundButton_buttonTint;
-    field public static int CompoundButton_buttonTintMode;
-    field public static final int[] DrawerArrowToggle;
-    field public static int DrawerArrowToggle_arrowHeadLength;
-    field public static int DrawerArrowToggle_arrowShaftLength;
-    field public static int DrawerArrowToggle_barLength;
-    field public static int DrawerArrowToggle_color;
-    field public static int DrawerArrowToggle_drawableSize;
-    field public static int DrawerArrowToggle_gapBetweenBars;
-    field public static int DrawerArrowToggle_spinBars;
-    field public static int DrawerArrowToggle_thickness;
-    field public static final int[] LinearLayoutCompat;
-    field public static final int[] LinearLayoutCompat_Layout;
-    field public static int LinearLayoutCompat_Layout_android_layout_gravity;
-    field public static int LinearLayoutCompat_Layout_android_layout_height;
-    field public static int LinearLayoutCompat_Layout_android_layout_weight;
-    field public static int LinearLayoutCompat_Layout_android_layout_width;
-    field public static int LinearLayoutCompat_android_baselineAligned;
-    field public static int LinearLayoutCompat_android_baselineAlignedChildIndex;
-    field public static int LinearLayoutCompat_android_gravity;
-    field public static int LinearLayoutCompat_android_orientation;
-    field public static int LinearLayoutCompat_android_weightSum;
-    field public static int LinearLayoutCompat_divider;
-    field public static int LinearLayoutCompat_dividerPadding;
-    field public static int LinearLayoutCompat_measureWithLargestChild;
-    field public static int LinearLayoutCompat_showDividers;
-    field public static final int[] ListPopupWindow;
-    field public static int ListPopupWindow_android_dropDownHorizontalOffset;
-    field public static int ListPopupWindow_android_dropDownVerticalOffset;
-    field public static final int[] MenuGroup;
-    field public static int MenuGroup_android_checkableBehavior;
-    field public static int MenuGroup_android_enabled;
-    field public static int MenuGroup_android_id;
-    field public static int MenuGroup_android_menuCategory;
-    field public static int MenuGroup_android_orderInCategory;
-    field public static int MenuGroup_android_visible;
-    field public static final int[] MenuItem;
-    field public static int MenuItem_actionLayout;
-    field public static int MenuItem_actionProviderClass;
-    field public static int MenuItem_actionViewClass;
-    field public static int MenuItem_android_alphabeticShortcut;
-    field public static int MenuItem_android_checkable;
-    field public static int MenuItem_android_checked;
-    field public static int MenuItem_android_enabled;
-    field public static int MenuItem_android_icon;
-    field public static int MenuItem_android_id;
-    field public static int MenuItem_android_menuCategory;
-    field public static int MenuItem_android_numericShortcut;
-    field public static int MenuItem_android_onClick;
-    field public static int MenuItem_android_orderInCategory;
-    field public static int MenuItem_android_title;
-    field public static int MenuItem_android_titleCondensed;
-    field public static int MenuItem_android_visible;
-    field public static int MenuItem_showAsAction;
-    field public static final int[] MenuView;
-    field public static int MenuView_android_headerBackground;
-    field public static int MenuView_android_horizontalDivider;
-    field public static int MenuView_android_itemBackground;
-    field public static int MenuView_android_itemIconDisabledAlpha;
-    field public static int MenuView_android_itemTextAppearance;
-    field public static int MenuView_android_verticalDivider;
-    field public static int MenuView_android_windowAnimationStyle;
-    field public static int MenuView_preserveIconSpacing;
-    field public static int MenuView_subMenuArrow;
-    field public static final int[] PopupWindow;
-    field public static final int[] PopupWindowBackgroundState;
-    field public static int PopupWindowBackgroundState_state_above_anchor;
-    field public static int PopupWindow_android_popupAnimationStyle;
-    field public static int PopupWindow_android_popupBackground;
-    field public static int PopupWindow_overlapAnchor;
-    field public static final int[] SearchView;
-    field public static int SearchView_android_focusable;
-    field public static int SearchView_android_imeOptions;
-    field public static int SearchView_android_inputType;
-    field public static int SearchView_android_maxWidth;
-    field public static int SearchView_closeIcon;
-    field public static int SearchView_commitIcon;
-    field public static int SearchView_defaultQueryHint;
-    field public static int SearchView_goIcon;
-    field public static int SearchView_iconifiedByDefault;
-    field public static int SearchView_layout;
-    field public static int SearchView_queryBackground;
-    field public static int SearchView_queryHint;
-    field public static int SearchView_searchHintIcon;
-    field public static int SearchView_searchIcon;
-    field public static int SearchView_submitBackground;
-    field public static int SearchView_suggestionRowLayout;
-    field public static int SearchView_voiceIcon;
-    field public static final int[] Spinner;
-    field public static int Spinner_android_dropDownWidth;
-    field public static int Spinner_android_entries;
-    field public static int Spinner_android_popupBackground;
-    field public static int Spinner_android_prompt;
-    field public static int Spinner_popupTheme;
-    field public static final int[] SwitchCompat;
-    field public static int SwitchCompat_android_textOff;
-    field public static int SwitchCompat_android_textOn;
-    field public static int SwitchCompat_android_thumb;
-    field public static int SwitchCompat_showText;
-    field public static int SwitchCompat_splitTrack;
-    field public static int SwitchCompat_switchMinWidth;
-    field public static int SwitchCompat_switchPadding;
-    field public static int SwitchCompat_switchTextAppearance;
-    field public static int SwitchCompat_thumbTextPadding;
-    field public static int SwitchCompat_thumbTint;
-    field public static int SwitchCompat_thumbTintMode;
-    field public static int SwitchCompat_track;
-    field public static int SwitchCompat_trackTint;
-    field public static int SwitchCompat_trackTintMode;
-    field public static final int[] TextAppearance;
-    field public static int TextAppearance_android_shadowColor;
-    field public static int TextAppearance_android_shadowDx;
-    field public static int TextAppearance_android_shadowDy;
-    field public static int TextAppearance_android_shadowRadius;
-    field public static int TextAppearance_android_textColor;
-    field public static int TextAppearance_android_textSize;
-    field public static int TextAppearance_android_textStyle;
-    field public static int TextAppearance_android_typeface;
-    field public static int TextAppearance_textAllCaps;
-    field public static final deprecated int[] Toolbar;
-    field public static int Toolbar_android_gravity;
-    field public static int Toolbar_android_minHeight;
-    field public static int Toolbar_buttonGravity;
-    field public static int Toolbar_collapseContentDescription;
-    field public static int Toolbar_collapseIcon;
-    field public static int Toolbar_contentInsetEnd;
-    field public static int Toolbar_contentInsetEndWithActions;
-    field public static int Toolbar_contentInsetLeft;
-    field public static int Toolbar_contentInsetRight;
-    field public static int Toolbar_contentInsetStart;
-    field public static int Toolbar_contentInsetStartWithNavigation;
-    field public static int Toolbar_logo;
-    field public static int Toolbar_logoDescription;
-    field public static int Toolbar_maxButtonHeight;
-    field public static int Toolbar_navigationContentDescription;
-    field public static int Toolbar_navigationIcon;
-    field public static int Toolbar_popupTheme;
-    field public static int Toolbar_subtitle;
-    field public static int Toolbar_subtitleTextAppearance;
-    field public static int Toolbar_subtitleTextColor;
-    field public static int Toolbar_title;
-    field public static int Toolbar_titleMargin;
-    field public static int Toolbar_titleMarginBottom;
-    field public static int Toolbar_titleMarginEnd;
-    field public static int Toolbar_titleMarginStart;
-    field public static int Toolbar_titleMarginTop;
-    field public static deprecated int Toolbar_titleMargins;
-    field public static int Toolbar_titleTextAppearance;
-    field public static int Toolbar_titleTextColor;
-    field public static final int[] View;
-    field public static final int[] ViewBackgroundHelper;
-    field public static int ViewBackgroundHelper_android_background;
-    field public static int ViewBackgroundHelper_backgroundTint;
-    field public static int ViewBackgroundHelper_backgroundTintMode;
-    field public static final int[] ViewStubCompat;
-    field public static int ViewStubCompat_android_id;
-    field public static int ViewStubCompat_android_inflatedId;
-    field public static int ViewStubCompat_android_layout;
-    field public static int View_android_focusable;
-    field public static int View_android_theme;
-    field public static int View_paddingEnd;
-    field public static int View_paddingStart;
-    field public static int View_theme;
-  }
-
-}
-
-package android.support.v7.content.res {
-
-  public final class AppCompatResources {
-    method public static android.content.res.ColorStateList getColorStateList(android.content.Context, int);
-  }
-
-}
-
-package android.support.v7.graphics.drawable {
-
-  public class DrawerArrowDrawable extends android.graphics.drawable.Drawable {
-    ctor public DrawerArrowDrawable(android.content.Context);
-    method public void draw(android.graphics.Canvas);
-    method public float getArrowHeadLength();
-    method public float getArrowShaftLength();
-    method public float getBarLength();
-    method public float getBarThickness();
-    method public int getColor();
-    method public int getDirection();
-    method public float getGapSize();
-    method public int getOpacity();
-    method public final android.graphics.Paint getPaint();
-    method public float getProgress();
-    method public boolean isSpinEnabled();
-    method public void setAlpha(int);
-    method public void setArrowHeadLength(float);
-    method public void setArrowShaftLength(float);
-    method public void setBarLength(float);
-    method public void setBarThickness(float);
-    method public void setColor(int);
-    method public void setColorFilter(android.graphics.ColorFilter);
-    method public void setDirection(int);
-    method public void setGapSize(float);
-    method public void setProgress(float);
-    method public void setSpinEnabled(boolean);
-    method public void setVerticalMirror(boolean);
-    field public static final int ARROW_DIRECTION_END = 3; // 0x3
-    field public static final int ARROW_DIRECTION_LEFT = 0; // 0x0
-    field public static final int ARROW_DIRECTION_RIGHT = 1; // 0x1
-    field public static final int ARROW_DIRECTION_START = 2; // 0x2
-  }
-
-}
-
-package android.support.v7.view {
-
-  public abstract class ActionMode {
-    ctor public ActionMode();
-    method public abstract void finish();
-    method public abstract android.view.View getCustomView();
-    method public abstract android.view.Menu getMenu();
-    method public abstract android.view.MenuInflater getMenuInflater();
-    method public abstract java.lang.CharSequence getSubtitle();
-    method public java.lang.Object getTag();
-    method public abstract java.lang.CharSequence getTitle();
-    method public boolean getTitleOptionalHint();
-    method public abstract void invalidate();
-    method public boolean isTitleOptional();
-    method public abstract void setCustomView(android.view.View);
-    method public abstract void setSubtitle(java.lang.CharSequence);
-    method public abstract void setSubtitle(int);
-    method public void setTag(java.lang.Object);
-    method public abstract void setTitle(java.lang.CharSequence);
-    method public abstract void setTitle(int);
-    method public void setTitleOptionalHint(boolean);
-  }
-
-  public static abstract interface ActionMode.Callback {
-    method public abstract boolean onActionItemClicked(android.support.v7.view.ActionMode, android.view.MenuItem);
-    method public abstract boolean onCreateActionMode(android.support.v7.view.ActionMode, android.view.Menu);
-    method public abstract void onDestroyActionMode(android.support.v7.view.ActionMode);
-    method public abstract boolean onPrepareActionMode(android.support.v7.view.ActionMode, android.view.Menu);
-  }
-
-  public abstract interface CollapsibleActionView {
-    method public abstract void onActionViewCollapsed();
-    method public abstract void onActionViewExpanded();
-  }
-
-}
-
-package android.support.v7.widget {
-
-  public class ActionMenuView extends android.support.v7.widget.LinearLayoutCompat {
-    ctor public ActionMenuView(android.content.Context);
-    ctor public ActionMenuView(android.content.Context, android.util.AttributeSet);
-    method public void dismissPopupMenus();
-    method public android.view.Menu getMenu();
-    method public android.graphics.drawable.Drawable getOverflowIcon();
-    method public int getPopupTheme();
-    method public boolean hideOverflowMenu();
-    method public boolean isOverflowMenuShowing();
-    method public void onConfigurationChanged(android.content.res.Configuration);
-    method public void onDetachedFromWindow();
-    method public void setOnMenuItemClickListener(android.support.v7.widget.ActionMenuView.OnMenuItemClickListener);
-    method public void setOverflowIcon(android.graphics.drawable.Drawable);
-    method public void setPopupTheme(int);
-    method public boolean showOverflowMenu();
-  }
-
-  public static class ActionMenuView.LayoutParams extends android.support.v7.widget.LinearLayoutCompat.LayoutParams {
-    ctor public ActionMenuView.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public ActionMenuView.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public ActionMenuView.LayoutParams(android.support.v7.widget.ActionMenuView.LayoutParams);
-    ctor public ActionMenuView.LayoutParams(int, int);
-    field public int cellsUsed;
-    field public boolean expandable;
-    field public int extraPixels;
-    field public boolean isOverflowButton;
-    field public boolean preventEdgeOffset;
-  }
-
-  public static abstract interface ActionMenuView.OnMenuItemClickListener {
-    method public abstract boolean onMenuItemClick(android.view.MenuItem);
-  }
-
-  public class AppCompatAutoCompleteTextView extends android.widget.AutoCompleteTextView {
-    ctor public AppCompatAutoCompleteTextView(android.content.Context);
-    ctor public AppCompatAutoCompleteTextView(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatAutoCompleteTextView(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class AppCompatButton extends android.widget.Button {
-    ctor public AppCompatButton(android.content.Context);
-    ctor public AppCompatButton(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatButton(android.content.Context, android.util.AttributeSet, int);
-    method public void setSupportAllCaps(boolean);
-  }
-
-  public class AppCompatCheckBox extends android.widget.CheckBox {
-    ctor public AppCompatCheckBox(android.content.Context);
-    ctor public AppCompatCheckBox(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatCheckBox(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class AppCompatCheckedTextView extends android.widget.CheckedTextView {
-    ctor public AppCompatCheckedTextView(android.content.Context);
-    ctor public AppCompatCheckedTextView(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatCheckedTextView(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class AppCompatEditText extends android.widget.EditText {
-    ctor public AppCompatEditText(android.content.Context);
-    ctor public AppCompatEditText(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatEditText(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class AppCompatImageButton extends android.widget.ImageButton {
-    ctor public AppCompatImageButton(android.content.Context);
-    ctor public AppCompatImageButton(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatImageButton(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class AppCompatImageView extends android.widget.ImageView {
-    ctor public AppCompatImageView(android.content.Context);
-    ctor public AppCompatImageView(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatImageView(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class AppCompatMultiAutoCompleteTextView extends android.widget.MultiAutoCompleteTextView {
-    ctor public AppCompatMultiAutoCompleteTextView(android.content.Context);
-    ctor public AppCompatMultiAutoCompleteTextView(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatMultiAutoCompleteTextView(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class AppCompatRadioButton extends android.widget.RadioButton {
-    ctor public AppCompatRadioButton(android.content.Context);
-    ctor public AppCompatRadioButton(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatRadioButton(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class AppCompatRatingBar extends android.widget.RatingBar {
-    ctor public AppCompatRatingBar(android.content.Context);
-    ctor public AppCompatRatingBar(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatRatingBar(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class AppCompatSeekBar extends android.widget.SeekBar {
-    ctor public AppCompatSeekBar(android.content.Context);
-    ctor public AppCompatSeekBar(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatSeekBar(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class AppCompatSpinner extends android.widget.Spinner {
-    ctor public AppCompatSpinner(android.content.Context);
-    ctor public AppCompatSpinner(android.content.Context, int);
-    ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet, int);
-    ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet, int, int);
-    ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet, int, int, android.content.res.Resources.Theme);
-  }
-
-  public class AppCompatTextView extends android.widget.TextView {
-    ctor public AppCompatTextView(android.content.Context);
-    ctor public AppCompatTextView(android.content.Context, android.util.AttributeSet);
-    ctor public AppCompatTextView(android.content.Context, android.util.AttributeSet, int);
-  }
-
-  public class LinearLayoutCompat extends android.view.ViewGroup {
-    ctor public LinearLayoutCompat(android.content.Context);
-    ctor public LinearLayoutCompat(android.content.Context, android.util.AttributeSet);
-    ctor public LinearLayoutCompat(android.content.Context, android.util.AttributeSet, int);
-    method public int getBaselineAlignedChildIndex();
-    method public android.graphics.drawable.Drawable getDividerDrawable();
-    method public int getDividerPadding();
-    method public int getOrientation();
-    method public int getShowDividers();
-    method public float getWeightSum();
-    method public boolean isBaselineAligned();
-    method public boolean isMeasureWithLargestChildEnabled();
-    method protected void onLayout(boolean, int, int, int, int);
-    method public void setBaselineAligned(boolean);
-    method public void setBaselineAlignedChildIndex(int);
-    method public void setDividerDrawable(android.graphics.drawable.Drawable);
-    method public void setDividerPadding(int);
-    method public void setGravity(int);
-    method public void setHorizontalGravity(int);
-    method public void setMeasureWithLargestChildEnabled(boolean);
-    method public void setOrientation(int);
-    method public void setShowDividers(int);
-    method public void setVerticalGravity(int);
-    method public void setWeightSum(float);
-    field public static final int HORIZONTAL = 0; // 0x0
-    field public static final int SHOW_DIVIDER_BEGINNING = 1; // 0x1
-    field public static final int SHOW_DIVIDER_END = 4; // 0x4
-    field public static final int SHOW_DIVIDER_MIDDLE = 2; // 0x2
-    field public static final int SHOW_DIVIDER_NONE = 0; // 0x0
-    field public static final int VERTICAL = 1; // 0x1
-  }
-
-  public static class LinearLayoutCompat.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
-    ctor public LinearLayoutCompat.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public LinearLayoutCompat.LayoutParams(int, int);
-    ctor public LinearLayoutCompat.LayoutParams(int, int, float);
-    ctor public LinearLayoutCompat.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public LinearLayoutCompat.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public LinearLayoutCompat.LayoutParams(android.support.v7.widget.LinearLayoutCompat.LayoutParams);
-    field public int gravity;
-    field public float weight;
-  }
-
-  public class ListPopupWindow {
-    ctor public ListPopupWindow(android.content.Context);
-    ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet);
-    ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet, int);
-    ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet, int, int);
-    method public void clearListSelection();
-    method public android.view.View.OnTouchListener createDragToOpenListener(android.view.View);
-    method public void dismiss();
-    method public android.view.View getAnchorView();
-    method public int getAnimationStyle();
-    method public android.graphics.drawable.Drawable getBackground();
-    method public int getHeight();
-    method public int getHorizontalOffset();
-    method public int getInputMethodMode();
-    method public android.widget.ListView getListView();
-    method public int getPromptPosition();
-    method public java.lang.Object getSelectedItem();
-    method public long getSelectedItemId();
-    method public int getSelectedItemPosition();
-    method public android.view.View getSelectedView();
-    method public int getSoftInputMode();
-    method public int getVerticalOffset();
-    method public int getWidth();
-    method public boolean isInputMethodNotNeeded();
-    method public boolean isModal();
-    method public boolean isShowing();
-    method public boolean onKeyDown(int, android.view.KeyEvent);
-    method public boolean onKeyPreIme(int, android.view.KeyEvent);
-    method public boolean onKeyUp(int, android.view.KeyEvent);
-    method public boolean performItemClick(int);
-    method public void postShow();
-    method public void setAdapter(android.widget.ListAdapter);
-    method public void setAnchorView(android.view.View);
-    method public void setAnimationStyle(int);
-    method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
-    method public void setContentWidth(int);
-    method public void setDropDownGravity(int);
-    method public void setHeight(int);
-    method public void setHorizontalOffset(int);
-    method public void setInputMethodMode(int);
-    method public void setListSelector(android.graphics.drawable.Drawable);
-    method public void setModal(boolean);
-    method public void setOnDismissListener(android.widget.PopupWindow.OnDismissListener);
-    method public void setOnItemClickListener(android.widget.AdapterView.OnItemClickListener);
-    method public void setOnItemSelectedListener(android.widget.AdapterView.OnItemSelectedListener);
-    method public void setPromptPosition(int);
-    method public void setPromptView(android.view.View);
-    method public void setSelection(int);
-    method public void setSoftInputMode(int);
-    method public void setVerticalOffset(int);
-    method public void setWidth(int);
-    method public void setWindowLayoutType(int);
-    method public void show();
-    field public static final int INPUT_METHOD_FROM_FOCUSABLE = 0; // 0x0
-    field public static final int INPUT_METHOD_NEEDED = 1; // 0x1
-    field public static final int INPUT_METHOD_NOT_NEEDED = 2; // 0x2
-    field public static final int MATCH_PARENT = -1; // 0xffffffff
-    field public static final int POSITION_PROMPT_ABOVE = 0; // 0x0
-    field public static final int POSITION_PROMPT_BELOW = 1; // 0x1
-    field public static final int WRAP_CONTENT = -2; // 0xfffffffe
-  }
-
-  public class PopupMenu {
-    ctor public PopupMenu(android.content.Context, android.view.View);
-    ctor public PopupMenu(android.content.Context, android.view.View, int);
-    ctor public PopupMenu(android.content.Context, android.view.View, int, int, int);
-    method public void dismiss();
-    method public android.view.View.OnTouchListener getDragToOpenListener();
-    method public int getGravity();
-    method public android.view.Menu getMenu();
-    method public android.view.MenuInflater getMenuInflater();
-    method public void inflate(int);
-    method public void setGravity(int);
-    method public void setOnDismissListener(android.support.v7.widget.PopupMenu.OnDismissListener);
-    method public void setOnMenuItemClickListener(android.support.v7.widget.PopupMenu.OnMenuItemClickListener);
-    method public void show();
-  }
-
-  public static abstract interface PopupMenu.OnDismissListener {
-    method public abstract void onDismiss(android.support.v7.widget.PopupMenu);
-  }
-
-  public static abstract interface PopupMenu.OnMenuItemClickListener {
-    method public abstract boolean onMenuItemClick(android.view.MenuItem);
-  }
-
-  public class SearchView extends android.support.v7.widget.LinearLayoutCompat implements android.support.v7.view.CollapsibleActionView {
-    ctor public SearchView(android.content.Context);
-    ctor public SearchView(android.content.Context, android.util.AttributeSet);
-    ctor public SearchView(android.content.Context, android.util.AttributeSet, int);
-    method public int getImeOptions();
-    method public int getInputType();
-    method public int getMaxWidth();
-    method public java.lang.CharSequence getQuery();
-    method public java.lang.CharSequence getQueryHint();
-    method public android.support.v4.widget.CursorAdapter getSuggestionsAdapter();
-    method public boolean isIconfiedByDefault();
-    method public boolean isIconified();
-    method public boolean isQueryRefinementEnabled();
-    method public boolean isSubmitButtonEnabled();
-    method public void onActionViewCollapsed();
-    method public void onActionViewExpanded();
-    method public void setIconified(boolean);
-    method public void setIconifiedByDefault(boolean);
-    method public void setImeOptions(int);
-    method public void setInputType(int);
-    method public void setMaxWidth(int);
-    method public void setOnCloseListener(android.support.v7.widget.SearchView.OnCloseListener);
-    method public void setOnQueryTextFocusChangeListener(android.view.View.OnFocusChangeListener);
-    method public void setOnQueryTextListener(android.support.v7.widget.SearchView.OnQueryTextListener);
-    method public void setOnSearchClickListener(android.view.View.OnClickListener);
-    method public void setOnSuggestionListener(android.support.v7.widget.SearchView.OnSuggestionListener);
-    method public void setQuery(java.lang.CharSequence, boolean);
-    method public void setQueryHint(java.lang.CharSequence);
-    method public void setQueryRefinementEnabled(boolean);
-    method public void setSearchableInfo(android.app.SearchableInfo);
-    method public void setSubmitButtonEnabled(boolean);
-    method public void setSuggestionsAdapter(android.support.v4.widget.CursorAdapter);
-  }
-
-  public static abstract interface SearchView.OnCloseListener {
-    method public abstract boolean onClose();
-  }
-
-  public static abstract interface SearchView.OnQueryTextListener {
-    method public abstract boolean onQueryTextChange(java.lang.String);
-    method public abstract boolean onQueryTextSubmit(java.lang.String);
-  }
-
-  public static abstract interface SearchView.OnSuggestionListener {
-    method public abstract boolean onSuggestionClick(int);
-    method public abstract boolean onSuggestionSelect(int);
-  }
-
-  public class ShareActionProvider extends android.support.v4.view.ActionProvider {
-    ctor public ShareActionProvider(android.content.Context);
-    method public android.view.View onCreateActionView();
-    method public void setOnShareTargetSelectedListener(android.support.v7.widget.ShareActionProvider.OnShareTargetSelectedListener);
-    method public void setShareHistoryFileName(java.lang.String);
-    method public void setShareIntent(android.content.Intent);
-    field public static final java.lang.String DEFAULT_SHARE_HISTORY_FILE_NAME = "share_history.xml";
-  }
-
-  public static abstract interface ShareActionProvider.OnShareTargetSelectedListener {
-    method public abstract boolean onShareTargetSelected(android.support.v7.widget.ShareActionProvider, android.content.Intent);
-  }
-
-  public class SwitchCompat extends android.widget.CompoundButton {
-    ctor public SwitchCompat(android.content.Context);
-    ctor public SwitchCompat(android.content.Context, android.util.AttributeSet);
-    ctor public SwitchCompat(android.content.Context, android.util.AttributeSet, int);
-    method public boolean getShowText();
-    method public boolean getSplitTrack();
-    method public int getSwitchMinWidth();
-    method public int getSwitchPadding();
-    method public java.lang.CharSequence getTextOff();
-    method public java.lang.CharSequence getTextOn();
-    method public android.graphics.drawable.Drawable getThumbDrawable();
-    method public int getThumbTextPadding();
-    method public android.content.res.ColorStateList getThumbTintList();
-    method public android.graphics.PorterDuff.Mode getThumbTintMode();
-    method public android.graphics.drawable.Drawable getTrackDrawable();
-    method public android.content.res.ColorStateList getTrackTintList();
-    method public android.graphics.PorterDuff.Mode getTrackTintMode();
-    method public void onMeasure(int, int);
-    method public void setShowText(boolean);
-    method public void setSplitTrack(boolean);
-    method public void setSwitchMinWidth(int);
-    method public void setSwitchPadding(int);
-    method public void setSwitchTextAppearance(android.content.Context, int);
-    method public void setSwitchTypeface(android.graphics.Typeface, int);
-    method public void setSwitchTypeface(android.graphics.Typeface);
-    method public void setTextOff(java.lang.CharSequence);
-    method public void setTextOn(java.lang.CharSequence);
-    method public void setThumbDrawable(android.graphics.drawable.Drawable);
-    method public void setThumbResource(int);
-    method public void setThumbTextPadding(int);
-    method public void setThumbTintList(android.content.res.ColorStateList);
-    method public void setThumbTintMode(android.graphics.PorterDuff.Mode);
-    method public void setTrackDrawable(android.graphics.drawable.Drawable);
-    method public void setTrackResource(int);
-    method public void setTrackTintList(android.content.res.ColorStateList);
-    method public void setTrackTintMode(android.graphics.PorterDuff.Mode);
-  }
-
-  public abstract interface ThemedSpinnerAdapter implements android.widget.SpinnerAdapter {
-    method public abstract android.content.res.Resources.Theme getDropDownViewTheme();
-    method public abstract void setDropDownViewTheme(android.content.res.Resources.Theme);
-  }
-
-  public static final class ThemedSpinnerAdapter.Helper {
-    ctor public ThemedSpinnerAdapter.Helper(android.content.Context);
-    method public android.view.LayoutInflater getDropDownViewInflater();
-    method public android.content.res.Resources.Theme getDropDownViewTheme();
-    method public void setDropDownViewTheme(android.content.res.Resources.Theme);
-  }
-
-  public class Toolbar extends android.view.ViewGroup {
-    ctor public Toolbar(android.content.Context);
-    ctor public Toolbar(android.content.Context, android.util.AttributeSet);
-    ctor public Toolbar(android.content.Context, android.util.AttributeSet, int);
-    method public void collapseActionView();
-    method public void dismissPopupMenus();
-    method public int getContentInsetEnd();
-    method public int getContentInsetEndWithActions();
-    method public int getContentInsetLeft();
-    method public int getContentInsetRight();
-    method public int getContentInsetStart();
-    method public int getContentInsetStartWithNavigation();
-    method public int getCurrentContentInsetEnd();
-    method public int getCurrentContentInsetLeft();
-    method public int getCurrentContentInsetRight();
-    method public int getCurrentContentInsetStart();
-    method public android.graphics.drawable.Drawable getLogo();
-    method public java.lang.CharSequence getLogoDescription();
-    method public android.view.Menu getMenu();
-    method public java.lang.CharSequence getNavigationContentDescription();
-    method public android.graphics.drawable.Drawable getNavigationIcon();
-    method public android.graphics.drawable.Drawable getOverflowIcon();
-    method public int getPopupTheme();
-    method public java.lang.CharSequence getSubtitle();
-    method public java.lang.CharSequence getTitle();
-    method public int getTitleMarginBottom();
-    method public int getTitleMarginEnd();
-    method public int getTitleMarginStart();
-    method public int getTitleMarginTop();
-    method public boolean hasExpandedActionView();
-    method public boolean hideOverflowMenu();
-    method public void inflateMenu(int);
-    method public boolean isOverflowMenuShowing();
-    method protected void onLayout(boolean, int, int, int, int);
-    method public void setContentInsetEndWithActions(int);
-    method public void setContentInsetStartWithNavigation(int);
-    method public void setContentInsetsAbsolute(int, int);
-    method public void setContentInsetsRelative(int, int);
-    method public void setLogo(int);
-    method public void setLogo(android.graphics.drawable.Drawable);
-    method public void setLogoDescription(int);
-    method public void setLogoDescription(java.lang.CharSequence);
-    method public void setNavigationContentDescription(int);
-    method public void setNavigationContentDescription(java.lang.CharSequence);
-    method public void setNavigationIcon(int);
-    method public void setNavigationIcon(android.graphics.drawable.Drawable);
-    method public void setNavigationOnClickListener(android.view.View.OnClickListener);
-    method public void setOnMenuItemClickListener(android.support.v7.widget.Toolbar.OnMenuItemClickListener);
-    method public void setOverflowIcon(android.graphics.drawable.Drawable);
-    method public void setPopupTheme(int);
-    method public void setSubtitle(int);
-    method public void setSubtitle(java.lang.CharSequence);
-    method public void setSubtitleTextAppearance(android.content.Context, int);
-    method public void setSubtitleTextColor(int);
-    method public void setTitle(int);
-    method public void setTitle(java.lang.CharSequence);
-    method public void setTitleMargin(int, int, int, int);
-    method public void setTitleMarginBottom(int);
-    method public void setTitleMarginEnd(int);
-    method public void setTitleMarginStart(int);
-    method public void setTitleMarginTop(int);
-    method public void setTitleTextAppearance(android.content.Context, int);
-    method public void setTitleTextColor(int);
-    method public boolean showOverflowMenu();
-  }
-
-  public static class Toolbar.LayoutParams extends android.support.v7.app.ActionBar.LayoutParams {
-    ctor public Toolbar.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public Toolbar.LayoutParams(int, int);
-    ctor public Toolbar.LayoutParams(int, int, int);
-    ctor public Toolbar.LayoutParams(int);
-    ctor public Toolbar.LayoutParams(android.support.v7.widget.Toolbar.LayoutParams);
-    ctor public Toolbar.LayoutParams(android.support.v7.app.ActionBar.LayoutParams);
-    ctor public Toolbar.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public Toolbar.LayoutParams(android.view.ViewGroup.LayoutParams);
-  }
-
-  public static abstract interface Toolbar.OnMenuItemClickListener {
-    method public abstract boolean onMenuItemClick(android.view.MenuItem);
-  }
-
-  public static class Toolbar.SavedState extends android.support.v4.view.AbsSavedState {
-    ctor public Toolbar.SavedState(android.os.Parcel);
-    ctor public Toolbar.SavedState(android.os.Parcel, java.lang.ClassLoader);
-    ctor public Toolbar.SavedState(android.os.Parcelable);
-    field public static final android.os.Parcelable.Creator<android.support.v7.widget.Toolbar.SavedState> CREATOR;
-  }
-
-}
-
diff --git a/v7/appcompat/api/removed.txt b/v7/appcompat/api/removed.txt
deleted file mode 100644
index e69de29..0000000
--- a/v7/appcompat/api/removed.txt
+++ /dev/null
diff --git a/v7/appcompat/build.gradle b/v7/appcompat/build.gradle
index faa8439..9edd016 100644
--- a/v7/appcompat/build.gradle
+++ b/v7/appcompat/build.gradle
@@ -23,7 +23,7 @@
     compileSdkVersion project.ext.currentSdk
 
     defaultConfig {
-        minSdkVersion 7
+        minSdkVersion 9
         testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
         // This disables the builds tools automatic vector -> PNG generation
         generatedDensities = []
diff --git a/v7/appcompat/res/drawable-hdpi/abc_text_select_handle_left_mtrl_alpha.png b/v7/appcompat/res/drawable-hdpi/abc_text_select_handle_left_mtrl_alpha.png
new file mode 100644
index 0000000..3ab6586
--- /dev/null
+++ b/v7/appcompat/res/drawable-hdpi/abc_text_select_handle_left_mtrl_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-hdpi/abc_text_select_handle_middle_mtrl_alpha.png b/v7/appcompat/res/drawable-hdpi/abc_text_select_handle_middle_mtrl_alpha.png
new file mode 100644
index 0000000..ba309c3
--- /dev/null
+++ b/v7/appcompat/res/drawable-hdpi/abc_text_select_handle_middle_mtrl_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-hdpi/abc_text_select_handle_right_mtrl_alpha.png b/v7/appcompat/res/drawable-hdpi/abc_text_select_handle_right_mtrl_alpha.png
new file mode 100644
index 0000000..f9ab27a
--- /dev/null
+++ b/v7/appcompat/res/drawable-hdpi/abc_text_select_handle_right_mtrl_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-mdpi/abc_text_select_handle_left_mtrl_alpha.png b/v7/appcompat/res/drawable-mdpi/abc_text_select_handle_left_mtrl_alpha.png
new file mode 100644
index 0000000..af067a7
--- /dev/null
+++ b/v7/appcompat/res/drawable-mdpi/abc_text_select_handle_left_mtrl_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-mdpi/abc_text_select_handle_middle_mtrl_alpha.png b/v7/appcompat/res/drawable-mdpi/abc_text_select_handle_middle_mtrl_alpha.png
new file mode 100644
index 0000000..da64e70
--- /dev/null
+++ b/v7/appcompat/res/drawable-mdpi/abc_text_select_handle_middle_mtrl_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-mdpi/abc_text_select_handle_right_mtrl_alpha.png b/v7/appcompat/res/drawable-mdpi/abc_text_select_handle_right_mtrl_alpha.png
new file mode 100644
index 0000000..0df9651
--- /dev/null
+++ b/v7/appcompat/res/drawable-mdpi/abc_text_select_handle_right_mtrl_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xhdpi/abc_text_select_handle_left_mtrl_alpha.png b/v7/appcompat/res/drawable-xhdpi/abc_text_select_handle_left_mtrl_alpha.png
new file mode 100644
index 0000000..dc8bae0
--- /dev/null
+++ b/v7/appcompat/res/drawable-xhdpi/abc_text_select_handle_left_mtrl_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xhdpi/abc_text_select_handle_middle_mtrl_alpha.png b/v7/appcompat/res/drawable-xhdpi/abc_text_select_handle_middle_mtrl_alpha.png
new file mode 100644
index 0000000..1286d11
--- /dev/null
+++ b/v7/appcompat/res/drawable-xhdpi/abc_text_select_handle_middle_mtrl_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xhdpi/abc_text_select_handle_right_mtrl_alpha.png b/v7/appcompat/res/drawable-xhdpi/abc_text_select_handle_right_mtrl_alpha.png
new file mode 100644
index 0000000..e50225a
--- /dev/null
+++ b/v7/appcompat/res/drawable-xhdpi/abc_text_select_handle_right_mtrl_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xxhdpi/abc_text_select_handle_left_mtrl_alpha.png b/v7/appcompat/res/drawable-xxhdpi/abc_text_select_handle_left_mtrl_alpha.png
new file mode 100644
index 0000000..2cf61b8
--- /dev/null
+++ b/v7/appcompat/res/drawable-xxhdpi/abc_text_select_handle_left_mtrl_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xxhdpi/abc_text_select_handle_middle_mtrl_alpha.png b/v7/appcompat/res/drawable-xxhdpi/abc_text_select_handle_middle_mtrl_alpha.png
new file mode 100644
index 0000000..7202f6d
--- /dev/null
+++ b/v7/appcompat/res/drawable-xxhdpi/abc_text_select_handle_middle_mtrl_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xxhdpi/abc_text_select_handle_right_mtrl_alpha.png b/v7/appcompat/res/drawable-xxhdpi/abc_text_select_handle_right_mtrl_alpha.png
new file mode 100644
index 0000000..0999989
--- /dev/null
+++ b/v7/appcompat/res/drawable-xxhdpi/abc_text_select_handle_right_mtrl_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xxxhdpi/abc_text_select_handle_left_mtrl_alpha.png b/v7/appcompat/res/drawable-xxxhdpi/abc_text_select_handle_left_mtrl_alpha.png
new file mode 100644
index 0000000..c87ee03
--- /dev/null
+++ b/v7/appcompat/res/drawable-xxxhdpi/abc_text_select_handle_left_mtrl_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/drawable-xxxhdpi/abc_text_select_handle_right_mtrl_alpha.png b/v7/appcompat/res/drawable-xxxhdpi/abc_text_select_handle_right_mtrl_alpha.png
new file mode 100644
index 0000000..7bda3c8
--- /dev/null
+++ b/v7/appcompat/res/drawable-xxxhdpi/abc_text_select_handle_right_mtrl_alpha.png
Binary files differ
diff --git a/v7/appcompat/res/values-az-rAZ/strings.xml b/v7/appcompat/res/values-az-rAZ/strings.xml
index 37d2399..d5e4b81 100644
--- a/v7/appcompat/res/values-az-rAZ/strings.xml
+++ b/v7/appcompat/res/values-az-rAZ/strings.xml
@@ -17,9 +17,9 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_action_mode_done" msgid="4076576682505996667">"Hazırdır"</string>
-    <string name="abc_action_bar_home_description" msgid="4600421777120114993">"Evə get"</string>
+    <string name="abc_action_bar_home_description" msgid="4600421777120114993">"Evə naviqasiya et"</string>
     <string name="abc_action_bar_up_description" msgid="1594238315039666878">"Yuxarı get"</string>
-    <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"Daha çox seçim"</string>
+    <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"Digər variantlar"</string>
     <string name="abc_toolbar_collapse_description" msgid="1603543279005712093">"Dağıt"</string>
     <string name="abc_action_bar_home_description_format" msgid="1397052879051804371">"%1$s, %2$s"</string>
     <string name="abc_action_bar_home_subtitle_description_format" msgid="6623331958280229229">"%1$s, %2$s, %3$s"</string>
diff --git a/v7/appcompat/res/values-be-rBY/strings.xml b/v7/appcompat/res/values-be-rBY/strings.xml
new file mode 100644
index 0000000..d083465
--- /dev/null
+++ b/v7/appcompat/res/values-be-rBY/strings.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2012 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:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="abc_action_mode_done" msgid="4076576682505996667">"Гатова"</string>
+    <string name="abc_action_bar_home_description" msgid="4600421777120114993">"Перайсці на галоўную старонку"</string>
+    <string name="abc_action_bar_up_description" msgid="1594238315039666878">"Перайсці ўверх"</string>
+    <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"Дадатковыя параметры"</string>
+    <string name="abc_toolbar_collapse_description" msgid="1603543279005712093">"Згарнуць"</string>
+    <string name="abc_action_bar_home_description_format" msgid="1397052879051804371">"%1$s, %2$s"</string>
+    <string name="abc_action_bar_home_subtitle_description_format" msgid="6623331958280229229">"%1$s, %2$s, %3$s"</string>
+    <string name="abc_searchview_description_search" msgid="8264924765203268293">"Пошук"</string>
+    <string name="abc_search_hint" msgid="7723749260725869598">"Пошук..."</string>
+    <string name="abc_searchview_description_query" msgid="2550479030709304392">"Запыт на пошук"</string>
+    <string name="abc_searchview_description_clear" msgid="3691816814315814921">"Выдалiць запыт"</string>
+    <string name="abc_searchview_description_submit" msgid="8928215447528550784">"Адправіць запыт"</string>
+    <string name="abc_searchview_description_voice" msgid="893419373245838918">"Галасавы пошук"</string>
+    <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Выбраць праграму"</string>
+    <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Прагледзець усё"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Абагуліць з %s"</string>
+    <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Абагуліць з"</string>
+    <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"больш за 999"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"УКЛ."</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"ВЫКЛ."</string>
+</resources>
diff --git a/v7/appcompat/res/values-bn-rBD/strings.xml b/v7/appcompat/res/values-bn-rBD/strings.xml
index 6be164f..ef5fa1b 100644
--- a/v7/appcompat/res/values-bn-rBD/strings.xml
+++ b/v7/appcompat/res/values-bn-rBD/strings.xml
@@ -29,10 +29,10 @@
     <string name="abc_searchview_description_clear" msgid="3691816814315814921">"ক্যোয়ারী সাফ করুন"</string>
     <string name="abc_searchview_description_submit" msgid="8928215447528550784">"ক্যোয়ারী জমা দিন"</string>
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"ভয়েস অনুসন্ধান"</string>
-    <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"একটি অ্যাপ্লিকেশান চয়ন করুন"</string>
+    <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"একটি অ্যাপ্লিকেশান বেছে নিন"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"সবগুলো দেখুন"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s এর সাথে ভাগ করুন"</string>
-    <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"এর সাথে ভাগ করুন"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s এর সাথে শেয়ার করুন"</string>
+    <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"এর সাথে শেয়ার করুন"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"৯৯৯+"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"চালু"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"বন্ধ"</string>
diff --git a/v7/appcompat/res/values-bs-rBA/strings.xml b/v7/appcompat/res/values-bs-rBA/strings.xml
new file mode 100644
index 0000000..0daaa5d
--- /dev/null
+++ b/v7/appcompat/res/values-bs-rBA/strings.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2012 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:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="abc_action_mode_done" msgid="4076576682505996667">"Završeno"</string>
+    <string name="abc_action_bar_home_description" msgid="4600421777120114993">"Vrati se na početnu stranicu"</string>
+    <string name="abc_action_bar_up_description" msgid="1594238315039666878">"Navigiraj prema gore"</string>
+    <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"Više opcija"</string>
+    <string name="abc_toolbar_collapse_description" msgid="1603543279005712093">"Skupi"</string>
+    <string name="abc_action_bar_home_description_format" msgid="1397052879051804371">"%1$s, %2$s"</string>
+    <string name="abc_action_bar_home_subtitle_description_format" msgid="6623331958280229229">"%1$s, %2$s, %3$s"</string>
+    <string name="abc_searchview_description_search" msgid="8264924765203268293">"Traži"</string>
+    <string name="abc_search_hint" msgid="7723749260725869598">"Pretraži..."</string>
+    <string name="abc_searchview_description_query" msgid="2550479030709304392">"Pretraži upit"</string>
+    <string name="abc_searchview_description_clear" msgid="3691816814315814921">"Obriši upit"</string>
+    <string name="abc_searchview_description_submit" msgid="8928215447528550784">"Pošalji upit"</string>
+    <string name="abc_searchview_description_voice" msgid="893419373245838918">"Pretraživanje glasom"</string>
+    <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Odaberite aplikaciju"</string>
+    <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Vidi sve"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Podijeli sa %s"</string>
+    <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Podijeli sa"</string>
+    <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"&gt;999"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"UKLJUČI"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"ISKLJUČI"</string>
+</resources>
diff --git a/v7/appcompat/res/values-es-rUS/strings.xml b/v7/appcompat/res/values-es-rUS/strings.xml
index f1e3dbb..f5efd38 100644
--- a/v7/appcompat/res/values-es-rUS/strings.xml
+++ b/v7/appcompat/res/values-es-rUS/strings.xml
@@ -34,6 +34,6 @@
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Compartir con %s"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Compartir con"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
-    <string name="abc_capital_on" msgid="3405795526292276155">"ACTIVAR"</string>
-    <string name="abc_capital_off" msgid="121134116657445385">"DESACTIVAR"</string>
+    <string name="abc_capital_on" msgid="3405795526292276155">"ACTIVADO"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"DESACTIVADO"</string>
 </resources>
diff --git a/v7/appcompat/res/values-gu-rIN/strings.xml b/v7/appcompat/res/values-gu-rIN/strings.xml
index 6fea9bb..cbf7b5d 100644
--- a/v7/appcompat/res/values-gu-rIN/strings.xml
+++ b/v7/appcompat/res/values-gu-rIN/strings.xml
@@ -29,7 +29,7 @@
     <string name="abc_searchview_description_clear" msgid="3691816814315814921">"ક્વેરી સાફ કરો"</string>
     <string name="abc_searchview_description_submit" msgid="8928215447528550784">"ક્વેરી સબમિટ કરો"</string>
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"વૉઇસ શોધ"</string>
-    <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"એક એપ્લિકેશન પસંદ કરો"</string>
+    <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"એક ઍપ્લિકેશન પસંદ કરો"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"બધું જુઓ"</string>
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s સાથે શેર કરો"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"આની સાથે શેર કરો"</string>
diff --git a/v7/appcompat/res/values-hy-rAM/strings.xml b/v7/appcompat/res/values-hy-rAM/strings.xml
index 708275a..e906c97 100644
--- a/v7/appcompat/res/values-hy-rAM/strings.xml
+++ b/v7/appcompat/res/values-hy-rAM/strings.xml
@@ -31,8 +31,8 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"Ձայնային որոնում"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Ընտրել ծրագիր"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Տեսնել բոլորը"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Տարածել ըստ %s"</string>
-    <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Տարածել"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Կիսվել %s-ի միջոցով"</string>
+    <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Կիսվել"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"ՄԻԱՑՎԱԾ"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"ԱՆՋԱՏՎԱԾ"</string>
diff --git a/v7/appcompat/res/values-lt/strings.xml b/v7/appcompat/res/values-lt/strings.xml
index 992910c..226565e 100644
--- a/v7/appcompat/res/values-lt/strings.xml
+++ b/v7/appcompat/res/values-lt/strings.xml
@@ -35,5 +35,5 @@
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Bendrinti naudojant"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"ĮJUNGTI"</string>
-    <string name="abc_capital_off" msgid="121134116657445385">"IŠJUNGTI"</string>
+    <string name="abc_capital_off" msgid="121134116657445385">"IŠJUNGTA"</string>
 </resources>
diff --git a/v7/appcompat/res/values-ml-rIN/strings.xml b/v7/appcompat/res/values-ml-rIN/strings.xml
index 292fcc0..2918ab5 100644
--- a/v7/appcompat/res/values-ml-rIN/strings.xml
+++ b/v7/appcompat/res/values-ml-rIN/strings.xml
@@ -19,7 +19,7 @@
     <string name="abc_action_mode_done" msgid="4076576682505996667">"പൂർത്തിയാക്കി"</string>
     <string name="abc_action_bar_home_description" msgid="4600421777120114993">"ഹോമിലേക്ക് നാവിഗേറ്റുചെയ്യുക"</string>
     <string name="abc_action_bar_up_description" msgid="1594238315039666878">"മുകളിലേക്ക് നാവിഗേറ്റുചെയ്യുക"</string>
-    <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"കൂടുതല്‍ ഓപ്‌ഷനുകള്‍"</string>
+    <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"കൂടുതൽ‍ ഓപ്‌ഷനുകള്‍"</string>
     <string name="abc_toolbar_collapse_description" msgid="1603543279005712093">"ചുരുക്കുക"</string>
     <string name="abc_action_bar_home_description_format" msgid="1397052879051804371">"%1$s, %2$s"</string>
     <string name="abc_action_bar_home_subtitle_description_format" msgid="6623331958280229229">"%1$s, %2$s, %3$s"</string>
@@ -28,7 +28,7 @@
     <string name="abc_searchview_description_query" msgid="2550479030709304392">"തിരയൽ അന്വേഷണം"</string>
     <string name="abc_searchview_description_clear" msgid="3691816814315814921">"അന്വേഷണം മായ്‌ക്കുക"</string>
     <string name="abc_searchview_description_submit" msgid="8928215447528550784">"അന്വേഷണം സമർപ്പിക്കുക"</string>
-    <string name="abc_searchview_description_voice" msgid="893419373245838918">"ശബ്ദ തിരയൽ"</string>
+    <string name="abc_searchview_description_voice" msgid="893419373245838918">"ശബ്ദതിരയൽ"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"ഒരു അപ്ലിക്കേഷൻ തിരഞ്ഞെടുക്കുക"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"എല്ലാം കാണുക"</string>
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s എന്നതുമായി പങ്കിടുക"</string>
diff --git a/v7/appcompat/res/values-my-rMM/strings.xml b/v7/appcompat/res/values-my-rMM/strings.xml
index f8690aa..28df59f 100644
--- a/v7/appcompat/res/values-my-rMM/strings.xml
+++ b/v7/appcompat/res/values-my-rMM/strings.xml
@@ -26,10 +26,10 @@
     <string name="abc_searchview_description_search" msgid="8264924765203268293">"ရှာဖွေရန်"</string>
     <string name="abc_search_hint" msgid="7723749260725869598">"ရှာဖွေပါ..."</string>
     <string name="abc_searchview_description_query" msgid="2550479030709304392">"ရှာစရာ အချက်အလက်နေရာ"</string>
-    <string name="abc_searchview_description_clear" msgid="3691816814315814921">"ရှာစရာ အချက်အလက်များ ရှင်းလင်းရန်"</string>
+    <string name="abc_searchview_description_clear" msgid="3691816814315814921">"ရှာစရာ အချက်အလက်များ ဖယ်ရှားရန်"</string>
     <string name="abc_searchview_description_submit" msgid="8928215447528550784">"ရှာဖွေစရာ အချက်အလက်ကို အတည်ပြုရန်"</string>
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"အသံဖြင့် ရှာဖွေခြင်း"</string>
-    <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"အပလီကေးရှင်း တစ်ခုခုကို ရွေးချယ်ပါ"</string>
+    <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"အက်ပ် တစ်ခုခုကို ရွေးချယ်ပါ"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"အားလုံးကို ကြည့်ရန်"</string>
     <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s ကို မျှဝေပါရန်"</string>
     <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"မျှဝေဖို့ ရွေးပါ"</string>
diff --git a/v7/appcompat/res/values-pa-rIN/strings.xml b/v7/appcompat/res/values-pa-rIN/strings.xml
index 45b703a..c5937d2 100644
--- a/v7/appcompat/res/values-pa-rIN/strings.xml
+++ b/v7/appcompat/res/values-pa-rIN/strings.xml
@@ -31,8 +31,8 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"ਵੌਇਸ ਖੋਜ"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"ਇੱਕ ਐਪ ਚੁਣੋ"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"ਸਭ ਦੇਖੋ"</string>
-    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s ਨਾਲ ਸ਼ੇਅਰ ਕਰੋ"</string>
-    <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"ਇਸ ਨਾਲ ਸ਼ੇਅਰ ਕਰੋ"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s ਨਾਲ ਸਾਂਝਾ ਕਰੋ"</string>
+    <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"ਇਸ ਨਾਲ ਸਾਂਝਾ ਕਰੋ"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"ਤੇ"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"ਬੰਦ"</string>
diff --git a/v7/appcompat/res/values-uz-rUZ/strings.xml b/v7/appcompat/res/values-uz-rUZ/strings.xml
index 4a713a9..11eeca1 100644
--- a/v7/appcompat/res/values-uz-rUZ/strings.xml
+++ b/v7/appcompat/res/values-uz-rUZ/strings.xml
@@ -19,7 +19,7 @@
     <string name="abc_action_mode_done" msgid="4076576682505996667">"Tayyor"</string>
     <string name="abc_action_bar_home_description" msgid="4600421777120114993">"Boshiga o‘tish"</string>
     <string name="abc_action_bar_up_description" msgid="1594238315039666878">"Yuqoriga o‘tish"</string>
-    <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"Qo‘shimcha sozlamalar"</string>
+    <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"Boshqa parametrlar"</string>
     <string name="abc_toolbar_collapse_description" msgid="1603543279005712093">"Yig‘ish"</string>
     <string name="abc_action_bar_home_description_format" msgid="1397052879051804371">"%1$s, %2$s"</string>
     <string name="abc_action_bar_home_subtitle_description_format" msgid="6623331958280229229">"%1$s, %2$s, %3$s"</string>
@@ -31,10 +31,8 @@
     <string name="abc_searchview_description_voice" msgid="893419373245838918">"Ovozli qidiruv"</string>
     <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Dastur tanlang"</string>
     <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Barchasini ko‘rish"</string>
-    <!-- String.format failed for translation -->
-    <!-- no translation found for abc_shareactionprovider_share_with_application (7165123711973476752) -->
-    <skip />
-    <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Bo‘lishish:"</string>
+    <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%sga ruxsat berish"</string>
+    <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Ruxsat berish"</string>
     <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
     <string name="abc_capital_on" msgid="3405795526292276155">"YONIQ"</string>
     <string name="abc_capital_off" msgid="121134116657445385">"O‘CHIQ"</string>
diff --git a/v7/appcompat/res/values-v11/themes_base.xml b/v7/appcompat/res/values-v11/themes_base.xml
index 2098ec7..f787454 100644
--- a/v7/appcompat/res/values-v11/themes_base.xml
+++ b/v7/appcompat/res/values-v11/themes_base.xml
@@ -74,6 +74,10 @@
         <item name="android:actionModeCutDrawable">?actionModeCutDrawable</item>
         <item name="android:actionModeCopyDrawable">?actionModeCopyDrawable</item>
         <item name="android:actionModePasteDrawable">?actionModePasteDrawable</item>
+
+        <item name="android:textSelectHandle">@drawable/abc_text_select_handle_middle_mtrl_alpha</item>
+        <item name="android:textSelectHandleLeft">@drawable/abc_text_select_handle_left_mtrl_alpha</item>
+        <item name="android:textSelectHandleRight">@drawable/abc_text_select_handle_right_mtrl_alpha</item>
     </style>
 
     <style name="Platform.V11.AppCompat.Light" parent="android:Theme.Holo.Light">
@@ -125,6 +129,10 @@
         <item name="android:actionModeCutDrawable">?actionModeCutDrawable</item>
         <item name="android:actionModeCopyDrawable">?actionModeCopyDrawable</item>
         <item name="android:actionModePasteDrawable">?actionModePasteDrawable</item>
+
+        <item name="android:textSelectHandle">@drawable/abc_text_select_handle_middle_mtrl_alpha</item>
+        <item name="android:textSelectHandleLeft">@drawable/abc_text_select_handle_left_mtrl_alpha</item>
+        <item name="android:textSelectHandleRight">@drawable/abc_text_select_handle_right_mtrl_alpha</item>
     </style>
 
     <style name="Base.V11.Theme.AppCompat.Dialog" parent="Base.V7.Theme.AppCompat.Dialog">
diff --git a/v7/appcompat/res/values/attrs.xml b/v7/appcompat/res/values/attrs.xml
index 1980bb7..eeb5f7d 100644
--- a/v7/appcompat/res/values/attrs.xml
+++ b/v7/appcompat/res/values/attrs.xml
@@ -1057,7 +1057,8 @@
 
     <declare-styleable name="AppCompatImageView">
         <attr name="android:src"/>
-        <!-- TODO -->
+        <!-- Sets a drawable as the content of this ImageView. Allows the use of vector drawable
+             when running on older versions of the platform. -->
         <attr name="srcCompat" format="reference" />
     </declare-styleable>
 
diff --git a/v7/appcompat/res/values/themes_base.xml b/v7/appcompat/res/values/themes_base.xml
index ab45f55..70917b5 100644
--- a/v7/appcompat/res/values/themes_base.xml
+++ b/v7/appcompat/res/values/themes_base.xml
@@ -59,6 +59,10 @@
 
         <item name="android:listChoiceIndicatorSingle">@drawable/abc_btn_radio_material</item>
         <item name="android:listChoiceIndicatorMultiple">@drawable/abc_btn_check_material</item>
+
+        <item name="android:textSelectHandle">@drawable/abc_text_select_handle_middle_mtrl_alpha</item>
+        <item name="android:textSelectHandleLeft">@drawable/abc_text_select_handle_left_mtrl_alpha</item>
+        <item name="android:textSelectHandleRight">@drawable/abc_text_select_handle_right_mtrl_alpha</item>
     </style>
 
     <style name="Platform.AppCompat.Light" parent="android:Theme.Light">
@@ -99,6 +103,10 @@
 
         <item name="android:listChoiceIndicatorSingle">@drawable/abc_btn_radio_material</item>
         <item name="android:listChoiceIndicatorMultiple">@drawable/abc_btn_check_material</item>
+
+        <item name="android:textSelectHandle">@drawable/abc_text_select_handle_middle_mtrl_alpha</item>
+        <item name="android:textSelectHandleLeft">@drawable/abc_text_select_handle_left_mtrl_alpha</item>
+        <item name="android:textSelectHandleRight">@drawable/abc_text_select_handle_right_mtrl_alpha</item>
     </style>
 
     <!-- Themes in the "Base.Theme" family vary based on the current platform
diff --git a/v7/appcompat/src/android/support/v7/app/ActionBar.java b/v7/appcompat/src/android/support/v7/app/ActionBar.java
index f545f47..e1afe24 100644
--- a/v7/appcompat/src/android/support/v7/app/ActionBar.java
+++ b/v7/appcompat/src/android/support/v7/app/ActionBar.java
@@ -667,7 +667,7 @@
     public abstract void addTab(Tab tab, int position);
 
     /**
-     * Add a tab for use in tabbed navigation mode. The tab will be insterted at
+     * Add a tab for use in tabbed navigation mode. The tab will be inserted at
      * <code>position</code>.
      *
      * @param tab The tab to add
@@ -833,7 +833,7 @@
 
     /**
      * Enable or disable the "home" button in the corner of the action bar. (Note that this
-     * is the application home/up affordance on the action bar, not the systemwide home
+     * is the application home/up affordance on the action bar, not the system wide home
      * button.)
      *
      * <p>This defaults to true for packages targeting &lt; API 14. For packages targeting
diff --git a/v7/appcompat/src/android/support/v7/app/ActionBarDrawerToggle.java b/v7/appcompat/src/android/support/v7/app/ActionBarDrawerToggle.java
index f10cd18..ec3cc9e 100644
--- a/v7/appcompat/src/android/support/v7/app/ActionBarDrawerToggle.java
+++ b/v7/appcompat/src/android/support/v7/app/ActionBarDrawerToggle.java
@@ -474,6 +474,7 @@
             mActivity = activity;
         }
 
+        @Override
         public void setPosition(float position) {
             if (position == 1f) {
                 setVerticalMirror(true);
@@ -483,6 +484,7 @@
             setProgress(position);
         }
 
+        @Override
         public float getPosition() {
             return getProgress();
         }
diff --git a/v7/appcompat/src/android/support/v7/app/AppCompatActivity.java b/v7/appcompat/src/android/support/v7/app/AppCompatActivity.java
index 843d497..3ff0271 100644
--- a/v7/appcompat/src/android/support/v7/app/AppCompatActivity.java
+++ b/v7/appcompat/src/android/support/v7/app/AppCompatActivity.java
@@ -179,6 +179,7 @@
         getDelegate().onPostResume();
     }
 
+    @Override
     public View findViewById(@IdRes int id) {
         return getDelegate().findViewById(id);
     }
@@ -245,6 +246,7 @@
      *
      * @param mode The new action mode.
      */
+    @Override
     @CallSuper
     public void onSupportActionModeStarted(@NonNull ActionMode mode) {
     }
@@ -255,6 +257,7 @@
      *
      * @param mode The action mode that just finished.
      */
+    @Override
     @CallSuper
     public void onSupportActionModeFinished(@NonNull ActionMode mode) {
     }
@@ -418,6 +421,7 @@
      * @return a new Intent targeting the defined parent activity of sourceActivity
      */
     @Nullable
+    @Override
     public Intent getSupportParentActivityIntent() {
         return NavUtils.getParentActivityIntent(this);
     }
diff --git a/v7/appcompat/src/android/support/v7/app/AppCompatDelegate.java b/v7/appcompat/src/android/support/v7/app/AppCompatDelegate.java
index 785f1df..6894f58 100644
--- a/v7/appcompat/src/android/support/v7/app/AppCompatDelegate.java
+++ b/v7/appcompat/src/android/support/v7/app/AppCompatDelegate.java
@@ -47,8 +47,8 @@
  * This class represents a delegate which you can use to extend AppCompat's support to any
  * {@link android.app.Activity}.
  * <p>
- * When using an {@link AppCompatDelegate}, you should any methods exposed in it rather than the
- * {@link android.app.Activity} method of the same name. This applies to:
+ * When using an {@link AppCompatDelegate}, you should extend any methods exposed in it rather than
+ * the {@link android.app.Activity} method of the same name. This applies to:
  * <ul>
  *     <li>{@link #addContentView(android.view.View, android.view.ViewGroup.LayoutParams)}</li>
  *     <li>{@link #setContentView(int)}</li>
@@ -194,7 +194,7 @@
         } else if (sdk >= 11) {
             return new AppCompatDelegateImplV11(context, window, callback);
         } else {
-            return new AppCompatDelegateImplV7(context, window, callback);
+            return new AppCompatDelegateImplV9(context, window, callback);
         }
     }
 
@@ -427,7 +427,7 @@
 
     /**
      * Override the night mode used for this delegate's host component. This method only takes
-     * effect for those situtations where {@link #applyDayNight()} works.
+     * effect for those situations where {@link #applyDayNight()} works.
      *
      * <p>Depending on when this is called, this may not take effect until the next time that
      * the host component is created. You may use {@link Activity#recreate()} to force a
@@ -438,10 +438,10 @@
     public abstract void setLocalNightMode(@NightMode int mode);
 
     /**
-     * Sets the default night mode. This is used across all activities/dialogs but can be overriden
+     * Sets the default night mode. This is used across all activities/dialogs but can be overridden
      * locally via {@link #setLocalNightMode(int)}.
      *
-     * <p>This method only takes effect for those situtations where {@link #applyDayNight()} works.
+     * <p>This method only takes effect for those situations where {@link #applyDayNight()} works.
      * Defaults to {@link #MODE_NIGHT_NO}.</p>
      *
      * @see #setLocalNightMode(int)
@@ -499,7 +499,7 @@
      *
      * <p>Even with this disabled, you can still use vector resources through
      * {@link android.support.v7.widget.AppCompatImageView#setImageResource(int)} and it's
-     * {@code app:srcCompat} attribute. They can also be used in anything which AppComapt inflates
+     * {@code app:srcCompat} attribute. They can also be used in anything which AppCompat inflates
      * for you, such as menu resources.</p>
      *
      * <p>Please note: this only takes effect in Activities created after this call.</p>
diff --git a/v7/appcompat/src/android/support/v7/app/AppCompatDelegateImplV11.java b/v7/appcompat/src/android/support/v7/app/AppCompatDelegateImplV11.java
index 8f32e85..9d882c8 100644
--- a/v7/appcompat/src/android/support/v7/app/AppCompatDelegateImplV11.java
+++ b/v7/appcompat/src/android/support/v7/app/AppCompatDelegateImplV11.java
@@ -18,16 +18,16 @@
 
 import android.content.Context;
 import android.util.AttributeSet;
-import android.view.LayoutInflater;
 import android.view.View;
 import android.view.Window;
 
-class AppCompatDelegateImplV11 extends AppCompatDelegateImplV7 {
+class AppCompatDelegateImplV11 extends AppCompatDelegateImplV9 {
 
     AppCompatDelegateImplV11(Context context, Window window, AppCompatCallback callback) {
         super(context, window, callback);
     }
 
+    @Override
     View callActivityOnCreateView(View parent, String name, Context context, AttributeSet attrs) {
         // On Honeycomb+, Activity's private inflater factory will handle calling it's
         // onCreateView(...)
diff --git a/v7/appcompat/src/android/support/v7/app/AppCompatDelegateImplV7.java b/v7/appcompat/src/android/support/v7/app/AppCompatDelegateImplV7.java
deleted file mode 100644
index fbf0144..0000000
--- a/v7/appcompat/src/android/support/v7/app/AppCompatDelegateImplV7.java
+++ /dev/null
@@ -1,2115 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.support.v7.app;
-
-import android.app.Activity;
-import android.app.Dialog;
-import android.content.Context;
-import android.content.res.Configuration;
-import android.content.res.Resources;
-import android.content.res.TypedArray;
-import android.graphics.PixelFormat;
-import android.graphics.Rect;
-import android.media.AudioManager;
-import android.os.Build;
-import android.os.Bundle;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.support.annotation.IdRes;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.v4.app.NavUtils;
-import android.support.v4.os.ParcelableCompat;
-import android.support.v4.os.ParcelableCompatCreatorCallbacks;
-import android.support.v4.view.LayoutInflaterCompat;
-import android.support.v4.view.LayoutInflaterFactory;
-import android.support.v4.view.OnApplyWindowInsetsListener;
-import android.support.v4.view.ViewCompat;
-import android.support.v4.view.ViewConfigurationCompat;
-import android.support.v4.view.ViewPropertyAnimatorCompat;
-import android.support.v4.view.ViewPropertyAnimatorListenerAdapter;
-import android.support.v4.view.WindowCompat;
-import android.support.v4.view.WindowInsetsCompat;
-import android.support.v4.widget.PopupWindowCompat;
-import android.support.v7.appcompat.R;
-import android.support.v7.view.ActionMode;
-import android.support.v7.view.ContextThemeWrapper;
-import android.support.v7.view.StandaloneActionMode;
-import android.support.v7.view.menu.ListMenuPresenter;
-import android.support.v7.view.menu.MenuBuilder;
-import android.support.v7.view.menu.MenuPresenter;
-import android.support.v7.view.menu.MenuView;
-import android.support.v7.widget.ActionBarContextView;
-import android.support.v7.widget.AppCompatDrawableManager;
-import android.support.v7.widget.ContentFrameLayout;
-import android.support.v7.widget.DecorContentParent;
-import android.support.v7.widget.FitWindowsViewGroup;
-import android.support.v7.widget.Toolbar;
-import android.support.v7.widget.VectorEnabledTintResources;
-import android.support.v7.widget.ViewStubCompat;
-import android.support.v7.widget.ViewUtils;
-import android.text.TextUtils;
-import android.util.AndroidRuntimeException;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.util.TypedValue;
-import android.view.Gravity;
-import android.view.KeyCharacterMap;
-import android.view.KeyEvent;
-import android.view.LayoutInflater;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.ViewConfiguration;
-import android.view.ViewGroup;
-import android.view.ViewParent;
-import android.view.Window;
-import android.view.WindowManager;
-import android.view.accessibility.AccessibilityEvent;
-import android.widget.FrameLayout;
-import android.widget.PopupWindow;
-import android.widget.TextView;
-
-import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
-import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
-import static android.view.Window.FEATURE_OPTIONS_PANEL;
-
-class AppCompatDelegateImplV7 extends AppCompatDelegateImplBase
-        implements MenuBuilder.Callback, LayoutInflaterFactory {
-
-    private DecorContentParent mDecorContentParent;
-    private ActionMenuPresenterCallback mActionMenuPresenterCallback;
-    private PanelMenuPresenterCallback mPanelMenuPresenterCallback;
-
-    ActionMode mActionMode;
-    ActionBarContextView mActionModeView;
-    PopupWindow mActionModePopup;
-    Runnable mShowActionModePopup;
-    ViewPropertyAnimatorCompat mFadeAnim = null;
-
-    // true if we have installed a window sub-decor layout.
-    private boolean mSubDecorInstalled;
-    private ViewGroup mSubDecor;
-
-    private TextView mTitleView;
-    private View mStatusGuard;
-
-    // Used to keep track of Progress Bar Window features
-    private boolean mFeatureProgress, mFeatureIndeterminateProgress;
-
-    // Used for emulating PanelFeatureState
-    private boolean mClosingActionMenu;
-    private PanelFeatureState[] mPanels;
-    private PanelFeatureState mPreparedPanel;
-
-    private boolean mLongPressBackDown;
-
-    private boolean mInvalidatePanelMenuPosted;
-    private int mInvalidatePanelMenuFeatures;
-    private final Runnable mInvalidatePanelMenuRunnable = new Runnable() {
-        @Override
-        public void run() {
-            if ((mInvalidatePanelMenuFeatures & 1 << FEATURE_OPTIONS_PANEL) != 0) {
-                doInvalidatePanelMenu(FEATURE_OPTIONS_PANEL);
-            }
-            if ((mInvalidatePanelMenuFeatures & 1 << FEATURE_SUPPORT_ACTION_BAR) != 0) {
-                doInvalidatePanelMenu(FEATURE_SUPPORT_ACTION_BAR);
-            }
-            mInvalidatePanelMenuPosted = false;
-            mInvalidatePanelMenuFeatures = 0;
-        }
-    };
-
-    private boolean mEnableDefaultActionBarUp;
-
-    private Rect mTempRect1;
-    private Rect mTempRect2;
-
-    private AppCompatViewInflater mAppCompatViewInflater;
-
-    AppCompatDelegateImplV7(Context context, Window window, AppCompatCallback callback) {
-        super(context, window, callback);
-    }
-
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        if (mOriginalWindowCallback instanceof Activity) {
-            if (NavUtils.getParentActivityName((Activity) mOriginalWindowCallback) != null) {
-                // Peek at the Action Bar and update it if it already exists
-                ActionBar ab = peekSupportActionBar();
-                if (ab == null) {
-                    mEnableDefaultActionBarUp = true;
-                } else {
-                    ab.setDefaultDisplayHomeAsUpEnabled(true);
-                }
-            }
-        }
-    }
-
-    @Override
-    public void onPostCreate(Bundle savedInstanceState) {
-        // Make sure that the sub decor is installed
-        ensureSubDecor();
-    }
-
-    @Override
-    public void initWindowDecorActionBar() {
-        ensureSubDecor();
-
-        if (!mHasActionBar || mActionBar != null) {
-            return;
-        }
-
-        if (mOriginalWindowCallback instanceof Activity) {
-            mActionBar = new WindowDecorActionBar((Activity) mOriginalWindowCallback,
-                    mOverlayActionBar);
-        } else if (mOriginalWindowCallback instanceof Dialog) {
-            mActionBar = new WindowDecorActionBar((Dialog) mOriginalWindowCallback);
-        }
-        if (mActionBar != null) {
-            mActionBar.setDefaultDisplayHomeAsUpEnabled(mEnableDefaultActionBarUp);
-        }
-    }
-
-    @Override
-    public void setSupportActionBar(Toolbar toolbar) {
-        if (!(mOriginalWindowCallback instanceof Activity)) {
-            // Only Activities support custom Action Bars
-            return;
-        }
-
-        final ActionBar ab = getSupportActionBar();
-        if (ab instanceof WindowDecorActionBar) {
-            throw new IllegalStateException("This Activity already has an action bar supplied " +
-                    "by the window decor. Do not request Window.FEATURE_SUPPORT_ACTION_BAR and set " +
-                    "windowActionBar to false in your theme to use a Toolbar instead.");
-        }
-
-        // If we reach here then we're setting a new action bar
-        // First clear out the MenuInflater to make sure that it is valid for the new Action Bar
-        mMenuInflater = null;
-
-        // If we have an action bar currently, destroy it
-        if (ab != null) {
-            ab.onDestroy();
-        }
-
-        if (toolbar != null) {
-            final ToolbarActionBar tbab = new ToolbarActionBar(toolbar,
-                    ((Activity) mContext).getTitle(), mAppCompatWindowCallback);
-            mActionBar = tbab;
-            mWindow.setCallback(tbab.getWrappedWindowCallback());
-        } else {
-            mActionBar = null;
-            // Re-set the original window callback since we may have already set a Toolbar wrapper
-            mWindow.setCallback(mAppCompatWindowCallback);
-        }
-
-        invalidateOptionsMenu();
-    }
-
-    @Nullable
-    @Override
-    public View findViewById(@IdRes int id) {
-        ensureSubDecor();
-        return mWindow.findViewById(id);
-    }
-
-    @Override
-    public void onConfigurationChanged(Configuration newConfig) {
-        // If this is called before sub-decor is installed, ActionBar will not
-        // be properly initialized.
-        if (mHasActionBar && mSubDecorInstalled) {
-            // Note: The action bar will need to access
-            // view changes from superclass.
-            ActionBar ab = getSupportActionBar();
-            if (ab != null) {
-                ab.onConfigurationChanged(newConfig);
-            }
-        }
-
-        // Re-apply Day/Night to the new configuration
-        applyDayNight();
-    }
-
-    @Override
-    public void onStop() {
-        ActionBar ab = getSupportActionBar();
-        if (ab != null) {
-            ab.setShowHideAnimationEnabled(false);
-        }
-    }
-
-    @Override
-    public void onPostResume() {
-        ActionBar ab = getSupportActionBar();
-        if (ab != null) {
-            ab.setShowHideAnimationEnabled(true);
-        }
-    }
-
-    @Override
-    public void setContentView(View v) {
-        ensureSubDecor();
-        ViewGroup contentParent = (ViewGroup) mSubDecor.findViewById(android.R.id.content);
-        contentParent.removeAllViews();
-        contentParent.addView(v);
-        mOriginalWindowCallback.onContentChanged();
-    }
-
-    @Override
-    public void setContentView(int resId) {
-        ensureSubDecor();
-        ViewGroup contentParent = (ViewGroup) mSubDecor.findViewById(android.R.id.content);
-        contentParent.removeAllViews();
-        LayoutInflater.from(mContext).inflate(resId, contentParent);
-        mOriginalWindowCallback.onContentChanged();
-    }
-
-    @Override
-    public void setContentView(View v, ViewGroup.LayoutParams lp) {
-        ensureSubDecor();
-        ViewGroup contentParent = (ViewGroup) mSubDecor.findViewById(android.R.id.content);
-        contentParent.removeAllViews();
-        contentParent.addView(v, lp);
-        mOriginalWindowCallback.onContentChanged();
-    }
-
-    @Override
-    public void addContentView(View v, ViewGroup.LayoutParams lp) {
-        ensureSubDecor();
-        ViewGroup contentParent = (ViewGroup) mSubDecor.findViewById(android.R.id.content);
-        contentParent.addView(v, lp);
-        mOriginalWindowCallback.onContentChanged();
-    }
-
-    @Override
-    public void onDestroy() {
-        super.onDestroy();
-
-        if (mActionBar != null) {
-            mActionBar.onDestroy();
-        }
-    }
-
-    private void ensureSubDecor() {
-        if (!mSubDecorInstalled) {
-            mSubDecor = createSubDecor();
-
-            // If a title was set before we installed the decor, propogate it now
-            CharSequence title = getTitle();
-            if (!TextUtils.isEmpty(title)) {
-                onTitleChanged(title);
-            }
-
-            applyFixedSizeWindow();
-
-            onSubDecorInstalled(mSubDecor);
-
-            mSubDecorInstalled = true;
-
-            // Invalidate if the panel menu hasn't been created before this.
-            // Panel menu invalidation is deferred avoiding application onCreateOptionsMenu
-            // being called in the middle of onCreate or similar.
-            // A pending invalidation will typically be resolved before the posted message
-            // would run normally in order to satisfy instance state restoration.
-            PanelFeatureState st = getPanelState(FEATURE_OPTIONS_PANEL, false);
-            if (!isDestroyed() && (st == null || st.menu == null)) {
-                invalidatePanelMenu(FEATURE_SUPPORT_ACTION_BAR);
-            }
-        }
-    }
-
-    private ViewGroup createSubDecor() {
-        TypedArray a = mContext.obtainStyledAttributes(R.styleable.AppCompatTheme);
-
-        if (!a.hasValue(R.styleable.AppCompatTheme_windowActionBar)) {
-            a.recycle();
-            throw new IllegalStateException(
-                    "You need to use a Theme.AppCompat theme (or descendant) with this activity.");
-        }
-
-        if (a.getBoolean(R.styleable.AppCompatTheme_windowNoTitle, false)) {
-            requestWindowFeature(Window.FEATURE_NO_TITLE);
-        } else if (a.getBoolean(R.styleable.AppCompatTheme_windowActionBar, false)) {
-            // Don't allow an action bar if there is no title.
-            requestWindowFeature(FEATURE_SUPPORT_ACTION_BAR);
-        }
-        if (a.getBoolean(R.styleable.AppCompatTheme_windowActionBarOverlay, false)) {
-            requestWindowFeature(FEATURE_SUPPORT_ACTION_BAR_OVERLAY);
-        }
-        if (a.getBoolean(R.styleable.AppCompatTheme_windowActionModeOverlay, false)) {
-            requestWindowFeature(FEATURE_ACTION_MODE_OVERLAY);
-        }
-        mIsFloating = a.getBoolean(R.styleable.AppCompatTheme_android_windowIsFloating, false);
-        a.recycle();
-
-        // Now let's make sure that the Window has installed its decor by retrieving it
-        mWindow.getDecorView();
-
-        final LayoutInflater inflater = LayoutInflater.from(mContext);
-        ViewGroup subDecor = null;
-
-
-        if (!mWindowNoTitle) {
-            if (mIsFloating) {
-                // If we're floating, inflate the dialog title decor
-                subDecor = (ViewGroup) inflater.inflate(
-                        R.layout.abc_dialog_title_material, null);
-
-                // Floating windows can never have an action bar, reset the flags
-                mHasActionBar = mOverlayActionBar = false;
-            } else if (mHasActionBar) {
-                /**
-                 * This needs some explanation. As we can not use the android:theme attribute
-                 * pre-L, we emulate it by manually creating a LayoutInflater using a
-                 * ContextThemeWrapper pointing to actionBarTheme.
-                 */
-                TypedValue outValue = new TypedValue();
-                mContext.getTheme().resolveAttribute(R.attr.actionBarTheme, outValue, true);
-
-                Context themedContext;
-                if (outValue.resourceId != 0) {
-                    themedContext = new ContextThemeWrapper(mContext, outValue.resourceId);
-                } else {
-                    themedContext = mContext;
-                }
-
-                // Now inflate the view using the themed context and set it as the content view
-                subDecor = (ViewGroup) LayoutInflater.from(themedContext)
-                        .inflate(R.layout.abc_screen_toolbar, null);
-
-                mDecorContentParent = (DecorContentParent) subDecor
-                        .findViewById(R.id.decor_content_parent);
-                mDecorContentParent.setWindowCallback(getWindowCallback());
-
-                /**
-                 * Propagate features to DecorContentParent
-                 */
-                if (mOverlayActionBar) {
-                    mDecorContentParent.initFeature(FEATURE_SUPPORT_ACTION_BAR_OVERLAY);
-                }
-                if (mFeatureProgress) {
-                    mDecorContentParent.initFeature(Window.FEATURE_PROGRESS);
-                }
-                if (mFeatureIndeterminateProgress) {
-                    mDecorContentParent.initFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
-                }
-            }
-        } else {
-            if (mOverlayActionMode) {
-                subDecor = (ViewGroup) inflater.inflate(
-                        R.layout.abc_screen_simple_overlay_action_mode, null);
-            } else {
-                subDecor = (ViewGroup) inflater.inflate(R.layout.abc_screen_simple, null);
-            }
-
-            if (Build.VERSION.SDK_INT >= 21) {
-                // If we're running on L or above, we can rely on ViewCompat's
-                // setOnApplyWindowInsetsListener
-                ViewCompat.setOnApplyWindowInsetsListener(subDecor,
-                        new OnApplyWindowInsetsListener() {
-                            @Override
-                            public WindowInsetsCompat onApplyWindowInsets(View v,
-                                    WindowInsetsCompat insets) {
-                                final int top = insets.getSystemWindowInsetTop();
-                                final int newTop = updateStatusGuard(top);
-
-                                if (top != newTop) {
-                                    insets = insets.replaceSystemWindowInsets(
-                                            insets.getSystemWindowInsetLeft(),
-                                            newTop,
-                                            insets.getSystemWindowInsetRight(),
-                                            insets.getSystemWindowInsetBottom());
-                                }
-
-                                // Now apply the insets on our view
-                                return ViewCompat.onApplyWindowInsets(v, insets);
-                            }
-                        });
-            } else {
-                // Else, we need to use our own FitWindowsViewGroup handling
-                ((FitWindowsViewGroup) subDecor).setOnFitSystemWindowsListener(
-                        new FitWindowsViewGroup.OnFitSystemWindowsListener() {
-                            @Override
-                            public void onFitSystemWindows(Rect insets) {
-                                insets.top = updateStatusGuard(insets.top);
-                            }
-                        });
-            }
-        }
-
-        if (subDecor == null) {
-            throw new IllegalArgumentException(
-                    "AppCompat does not support the current theme features: { "
-                            + "windowActionBar: " + mHasActionBar
-                            + ", windowActionBarOverlay: "+ mOverlayActionBar
-                            + ", android:windowIsFloating: " + mIsFloating
-                            + ", windowActionModeOverlay: " + mOverlayActionMode
-                            + ", windowNoTitle: " + mWindowNoTitle
-                            + " }");
-        }
-
-        if (mDecorContentParent == null) {
-            mTitleView = (TextView) subDecor.findViewById(R.id.title);
-        }
-
-        // Make the decor optionally fit system windows, like the window's decor
-        ViewUtils.makeOptionalFitsSystemWindows(subDecor);
-
-        final ContentFrameLayout contentView = (ContentFrameLayout) subDecor.findViewById(
-                R.id.action_bar_activity_content);
-
-        final ViewGroup windowContentView = (ViewGroup) mWindow.findViewById(android.R.id.content);
-        if (windowContentView != null) {
-            // There might be Views already added to the Window's content view so we need to
-            // migrate them to our content view
-            while (windowContentView.getChildCount() > 0) {
-                final View child = windowContentView.getChildAt(0);
-                windowContentView.removeViewAt(0);
-                contentView.addView(child);
-            }
-
-            // Change our content FrameLayout to use the android.R.id.content id.
-            // Useful for fragments.
-            windowContentView.setId(View.NO_ID);
-            contentView.setId(android.R.id.content);
-
-            // The decorContent may have a foreground drawable set (windowContentOverlay).
-            // Remove this as we handle it ourselves
-            if (windowContentView instanceof FrameLayout) {
-                ((FrameLayout) windowContentView).setForeground(null);
-            }
-        }
-
-        // Now set the Window's content view with the decor
-        mWindow.setContentView(subDecor);
-
-        contentView.setAttachListener(new ContentFrameLayout.OnAttachListener() {
-            @Override
-            public void onAttachedFromWindow() {}
-
-            @Override
-            public void onDetachedFromWindow() {
-                dismissPopups();
-            }
-        });
-
-        return subDecor;
-    }
-
-    void onSubDecorInstalled(ViewGroup subDecor) {}
-
-    private void applyFixedSizeWindow() {
-        ContentFrameLayout cfl = (ContentFrameLayout) mSubDecor.findViewById(android.R.id.content);
-
-        // This is a bit weird. In the framework, the window sizing attributes control
-        // the decor view's size, meaning that any padding is inset for the min/max widths below.
-        // We don't control measurement at that level, so we need to workaround it by making sure
-        // that the decor view's padding is taken into account.
-        final View windowDecor = mWindow.getDecorView();
-        cfl.setDecorPadding(windowDecor.getPaddingLeft(),
-                windowDecor.getPaddingTop(), windowDecor.getPaddingRight(),
-                windowDecor.getPaddingBottom());
-
-        TypedArray a = mContext.obtainStyledAttributes(R.styleable.AppCompatTheme);
-        a.getValue(R.styleable.AppCompatTheme_windowMinWidthMajor, cfl.getMinWidthMajor());
-        a.getValue(R.styleable.AppCompatTheme_windowMinWidthMinor, cfl.getMinWidthMinor());
-
-        if (a.hasValue(R.styleable.AppCompatTheme_windowFixedWidthMajor)) {
-            a.getValue(R.styleable.AppCompatTheme_windowFixedWidthMajor,
-                    cfl.getFixedWidthMajor());
-        }
-        if (a.hasValue(R.styleable.AppCompatTheme_windowFixedWidthMinor)) {
-            a.getValue(R.styleable.AppCompatTheme_windowFixedWidthMinor,
-                    cfl.getFixedWidthMinor());
-        }
-        if (a.hasValue(R.styleable.AppCompatTheme_windowFixedHeightMajor)) {
-            a.getValue(R.styleable.AppCompatTheme_windowFixedHeightMajor,
-                    cfl.getFixedHeightMajor());
-        }
-        if (a.hasValue(R.styleable.AppCompatTheme_windowFixedHeightMinor)) {
-            a.getValue(R.styleable.AppCompatTheme_windowFixedHeightMinor,
-                    cfl.getFixedHeightMinor());
-        }
-        a.recycle();
-
-        cfl.requestLayout();
-    }
-
-    @Override
-    public boolean requestWindowFeature(int featureId) {
-        featureId = sanitizeWindowFeatureId(featureId);
-
-        if (mWindowNoTitle && featureId == FEATURE_SUPPORT_ACTION_BAR) {
-            return false; // Ignore. No title dominates.
-        }
-        if (mHasActionBar && featureId == Window.FEATURE_NO_TITLE) {
-            // Remove the action bar feature if we have no title. No title dominates.
-            mHasActionBar = false;
-        }
-
-        switch (featureId) {
-            case FEATURE_SUPPORT_ACTION_BAR:
-                throwFeatureRequestIfSubDecorInstalled();
-                mHasActionBar = true;
-                return true;
-            case FEATURE_SUPPORT_ACTION_BAR_OVERLAY:
-                throwFeatureRequestIfSubDecorInstalled();
-                mOverlayActionBar = true;
-                return true;
-            case FEATURE_ACTION_MODE_OVERLAY:
-                throwFeatureRequestIfSubDecorInstalled();
-                mOverlayActionMode = true;
-                return true;
-            case Window.FEATURE_PROGRESS:
-                throwFeatureRequestIfSubDecorInstalled();
-                mFeatureProgress = true;
-                return true;
-            case Window.FEATURE_INDETERMINATE_PROGRESS:
-                throwFeatureRequestIfSubDecorInstalled();
-                mFeatureIndeterminateProgress = true;
-                return true;
-            case Window.FEATURE_NO_TITLE:
-                throwFeatureRequestIfSubDecorInstalled();
-                mWindowNoTitle = true;
-                return true;
-        }
-
-        return mWindow.requestFeature(featureId);
-    }
-
-    @Override
-    public boolean hasWindowFeature(int featureId) {
-        featureId = sanitizeWindowFeatureId(featureId);
-        switch (featureId) {
-            case FEATURE_SUPPORT_ACTION_BAR:
-                return mHasActionBar;
-            case FEATURE_SUPPORT_ACTION_BAR_OVERLAY:
-                return mOverlayActionBar;
-            case FEATURE_ACTION_MODE_OVERLAY:
-                return mOverlayActionMode;
-            case Window.FEATURE_PROGRESS:
-                return mFeatureProgress;
-            case Window.FEATURE_INDETERMINATE_PROGRESS:
-                return mFeatureIndeterminateProgress;
-            case Window.FEATURE_NO_TITLE:
-                return mWindowNoTitle;
-        }
-        return mWindow.hasFeature(featureId);
-    }
-
-    @Override
-    void onTitleChanged(CharSequence title) {
-        if (mDecorContentParent != null) {
-            mDecorContentParent.setWindowTitle(title);
-        } else if (peekSupportActionBar() != null) {
-            peekSupportActionBar().setWindowTitle(title);
-        } else if (mTitleView != null) {
-            mTitleView.setText(title);
-        }
-    }
-
-    @Override
-    void onPanelClosed(final int featureId, Menu menu) {
-        if (featureId == FEATURE_SUPPORT_ACTION_BAR) {
-            ActionBar ab = getSupportActionBar();
-            if (ab != null) {
-                ab.dispatchMenuVisibilityChanged(false);
-            }
-        } else if (featureId == FEATURE_OPTIONS_PANEL) {
-            // Make sure that the options panel is closed. This is mainly used when we're using a
-            // ToolbarActionBar
-            PanelFeatureState st = getPanelState(featureId, true);
-            if (st.isOpen) {
-                closePanel(st, false);
-            }
-        }
-    }
-
-    @Override
-    boolean onMenuOpened(final int featureId, Menu menu) {
-        if (featureId == FEATURE_SUPPORT_ACTION_BAR) {
-            ActionBar ab = getSupportActionBar();
-            if (ab != null) {
-                ab.dispatchMenuVisibilityChanged(true);
-            }
-            return true;
-        }
-        return false;
-    }
-
-    @Override
-    public boolean onMenuItemSelected(MenuBuilder menu, MenuItem item) {
-        final Window.Callback cb = getWindowCallback();
-        if (cb != null && !isDestroyed()) {
-            final PanelFeatureState panel = findMenuPanel(menu.getRootMenu());
-            if (panel != null) {
-                return cb.onMenuItemSelected(panel.featureId, item);
-            }
-        }
-        return false;
-    }
-
-    @Override
-    public void onMenuModeChange(MenuBuilder menu) {
-        reopenMenu(menu, true);
-    }
-
-    @Override
-    public ActionMode startSupportActionMode(@NonNull final ActionMode.Callback callback) {
-        if (callback == null) {
-            throw new IllegalArgumentException("ActionMode callback can not be null.");
-        }
-
-        if (mActionMode != null) {
-            mActionMode.finish();
-        }
-
-        final ActionMode.Callback wrappedCallback = new ActionModeCallbackWrapperV7(callback);
-
-        ActionBar ab = getSupportActionBar();
-        if (ab != null) {
-            mActionMode = ab.startActionMode(wrappedCallback);
-            if (mActionMode != null && mAppCompatCallback != null) {
-                mAppCompatCallback.onSupportActionModeStarted(mActionMode);
-            }
-        }
-
-        if (mActionMode == null) {
-            // If the action bar didn't provide an action mode, start the emulated window one
-            mActionMode = startSupportActionModeFromWindow(wrappedCallback);
-        }
-
-        return mActionMode;
-    }
-
-    @Override
-    public void invalidateOptionsMenu() {
-        final ActionBar ab = getSupportActionBar();
-        if (ab != null && ab.invalidateOptionsMenu()) return;
-
-        invalidatePanelMenu(FEATURE_OPTIONS_PANEL);
-    }
-
-    @Override
-    ActionMode startSupportActionModeFromWindow(@NonNull ActionMode.Callback callback) {
-        endOnGoingFadeAnimation();
-        if (mActionMode != null) {
-            mActionMode.finish();
-        }
-
-        if (!(callback instanceof ActionModeCallbackWrapperV7)) {
-            // If the callback hasn't been wrapped yet, wrap it
-            callback = new ActionModeCallbackWrapperV7(callback);
-        }
-
-        ActionMode mode = null;
-        if (mAppCompatCallback != null && !isDestroyed()) {
-            try {
-                mode = mAppCompatCallback.onWindowStartingSupportActionMode(callback);
-            } catch (AbstractMethodError ame) {
-                // Older apps might not implement this callback method.
-            }
-        }
-
-        if (mode != null) {
-            mActionMode = mode;
-        } else {
-            if (mActionModeView == null) {
-                if (mIsFloating) {
-                    // Use the action bar theme.
-                    final TypedValue outValue = new TypedValue();
-                    final Resources.Theme baseTheme = mContext.getTheme();
-                    baseTheme.resolveAttribute(R.attr.actionBarTheme, outValue, true);
-
-                    final Context actionBarContext;
-                    if (outValue.resourceId != 0) {
-                        final Resources.Theme actionBarTheme = mContext.getResources().newTheme();
-                        actionBarTheme.setTo(baseTheme);
-                        actionBarTheme.applyStyle(outValue.resourceId, true);
-
-                        actionBarContext = new ContextThemeWrapper(mContext, 0);
-                        actionBarContext.getTheme().setTo(actionBarTheme);
-                    } else {
-                        actionBarContext = mContext;
-                    }
-
-                    mActionModeView = new ActionBarContextView(actionBarContext);
-                    mActionModePopup = new PopupWindow(actionBarContext, null,
-                            R.attr.actionModePopupWindowStyle);
-                    PopupWindowCompat.setWindowLayoutType(mActionModePopup,
-                            WindowManager.LayoutParams.TYPE_APPLICATION);
-                    mActionModePopup.setContentView(mActionModeView);
-                    mActionModePopup.setWidth(ViewGroup.LayoutParams.MATCH_PARENT);
-
-                    actionBarContext.getTheme().resolveAttribute(
-                            R.attr.actionBarSize, outValue, true);
-                    final int height = TypedValue.complexToDimensionPixelSize(outValue.data,
-                            actionBarContext.getResources().getDisplayMetrics());
-                    mActionModeView.setContentHeight(height);
-                    mActionModePopup.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
-                    mShowActionModePopup = new Runnable() {
-                        public void run() {
-                            mActionModePopup.showAtLocation(
-                                    mActionModeView,
-                                    Gravity.TOP | Gravity.FILL_HORIZONTAL, 0, 0);
-                            endOnGoingFadeAnimation();
-
-                            if (shouldAnimateActionModeView()) {
-                                ViewCompat.setAlpha(mActionModeView, 0f);
-                                mFadeAnim = ViewCompat.animate(mActionModeView).alpha(1f);
-                                mFadeAnim.setListener(new ViewPropertyAnimatorListenerAdapter() {
-                                    @Override
-                                    public void onAnimationStart(View view) {
-                                        mActionModeView.setVisibility(View.VISIBLE);
-                                    }
-
-                                    @Override
-                                    public void onAnimationEnd(View view) {
-                                        ViewCompat.setAlpha(mActionModeView, 1f);
-                                        mFadeAnim.setListener(null);
-                                        mFadeAnim = null;
-                                    }
-                                });
-                            } else {
-                                ViewCompat.setAlpha(mActionModeView, 1f);
-                                mActionModeView.setVisibility(View.VISIBLE);
-                            }
-                        }
-                    };
-                } else {
-                    ViewStubCompat stub = (ViewStubCompat) mSubDecor
-                            .findViewById(R.id.action_mode_bar_stub);
-                    if (stub != null) {
-                        // Set the layout inflater so that it is inflated with the action bar's context
-                        stub.setLayoutInflater(LayoutInflater.from(getActionBarThemedContext()));
-                        mActionModeView = (ActionBarContextView) stub.inflate();
-                    }
-                }
-            }
-
-            if (mActionModeView != null) {
-                endOnGoingFadeAnimation();
-                mActionModeView.killMode();
-                mode = new StandaloneActionMode(mActionModeView.getContext(), mActionModeView,
-                        callback, mActionModePopup == null);
-                if (callback.onCreateActionMode(mode, mode.getMenu())) {
-                    mode.invalidate();
-                    mActionModeView.initForMode(mode);
-                    mActionMode = mode;
-
-                    if (shouldAnimateActionModeView()) {
-                        ViewCompat.setAlpha(mActionModeView, 0f);
-                        mFadeAnim = ViewCompat.animate(mActionModeView).alpha(1f);
-                        mFadeAnim.setListener(new ViewPropertyAnimatorListenerAdapter() {
-                            @Override
-                            public void onAnimationStart(View view) {
-                                mActionModeView.setVisibility(View.VISIBLE);
-                                mActionModeView.sendAccessibilityEvent(
-                                        AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
-                                if (mActionModeView.getParent() != null) {
-                                    ViewCompat.requestApplyInsets((View) mActionModeView.getParent());
-                                }
-                            }
-
-                            @Override
-                            public void onAnimationEnd(View view) {
-                                ViewCompat.setAlpha(mActionModeView, 1f);
-                                mFadeAnim.setListener(null);
-                                mFadeAnim = null;
-                            }
-                        });
-                    } else {
-                        ViewCompat.setAlpha(mActionModeView, 1f);
-                        mActionModeView.setVisibility(View.VISIBLE);
-                        mActionModeView.sendAccessibilityEvent(
-                                AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
-                        if (mActionModeView.getParent() != null) {
-                            ViewCompat.requestApplyInsets((View) mActionModeView.getParent());
-                        }
-                    }
-
-                    if (mActionModePopup != null) {
-                        mWindow.getDecorView().post(mShowActionModePopup);
-                    }
-                } else {
-                    mActionMode = null;
-                }
-            }
-        }
-        if (mActionMode != null && mAppCompatCallback != null) {
-            mAppCompatCallback.onSupportActionModeStarted(mActionMode);
-        }
-        return mActionMode;
-    }
-
-    final boolean shouldAnimateActionModeView() {
-        // We only to animate the action mode in if the sub decor has already been laid out.
-        // If it hasn't been laid out, it hasn't been drawn to screen yet.
-        return mSubDecorInstalled && mSubDecor != null && ViewCompat.isLaidOut(mSubDecor);
-    }
-
-    private void endOnGoingFadeAnimation() {
-        if (mFadeAnim != null) {
-            mFadeAnim.cancel();
-        }
-    }
-
-    boolean onBackPressed() {
-        // Back cancels action modes first.
-        if (mActionMode != null) {
-            mActionMode.finish();
-            return true;
-        }
-
-        // Next collapse any expanded action views.
-        ActionBar ab = getSupportActionBar();
-        if (ab != null && ab.collapseActionView()) {
-            return true;
-        }
-
-        // Let the call through...
-        return false;
-    }
-
-    @Override
-    boolean onKeyShortcut(int keyCode, KeyEvent ev) {
-        // Let the Action Bar have a chance at handling the shortcut
-        ActionBar ab = getSupportActionBar();
-        if (ab != null && ab.onKeyShortcut(keyCode, ev)) {
-            return true;
-        }
-
-        // If the panel is already prepared, then perform the shortcut using it.
-        boolean handled;
-        if (mPreparedPanel != null) {
-            handled = performPanelShortcut(mPreparedPanel, ev.getKeyCode(), ev,
-                    Menu.FLAG_PERFORM_NO_CLOSE);
-            if (handled) {
-                if (mPreparedPanel != null) {
-                    mPreparedPanel.isHandled = true;
-                }
-                return true;
-            }
-        }
-
-        // If the panel is not prepared, then we may be trying to handle a shortcut key
-        // combination such as Control+C.  Temporarily prepare the panel then mark it
-        // unprepared again when finished to ensure that the panel will again be prepared
-        // the next time it is shown for real.
-        if (mPreparedPanel == null) {
-            PanelFeatureState st = getPanelState(FEATURE_OPTIONS_PANEL, true);
-            preparePanel(st, ev);
-            handled = performPanelShortcut(st, ev.getKeyCode(), ev, Menu.FLAG_PERFORM_NO_CLOSE);
-            st.isPrepared = false;
-            if (handled) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    @Override
-    boolean dispatchKeyEvent(KeyEvent event) {
-        if (event.getKeyCode() == KeyEvent.KEYCODE_MENU) {
-            // If this is a MENU event, let the Activity have a go.
-            if (mOriginalWindowCallback.dispatchKeyEvent(event)) {
-                return true;
-            }
-        }
-
-        final int keyCode = event.getKeyCode();
-        final int action = event.getAction();
-        final boolean isDown = action == KeyEvent.ACTION_DOWN;
-
-        return isDown ? onKeyDown(keyCode, event) : onKeyUp(keyCode, event);
-    }
-
-    boolean onKeyUp(int keyCode, KeyEvent event) {
-        switch (keyCode) {
-            case KeyEvent.KEYCODE_MENU:
-                onKeyUpPanel(Window.FEATURE_OPTIONS_PANEL, event);
-                return true;
-            case KeyEvent.KEYCODE_BACK:
-                final boolean wasLongPressBackDown = mLongPressBackDown;
-                mLongPressBackDown = false;
-
-                PanelFeatureState st = getPanelState(Window.FEATURE_OPTIONS_PANEL, false);
-                if (st != null && st.isOpen) {
-                    if (!wasLongPressBackDown) {
-                        // Certain devices allow opening the options menu via a long press of the
-                        // back button. We should only close the open options menu if it wasn't
-                        // opened via a long press gesture.
-                        closePanel(st, true);
-                    }
-                    return true;
-                }
-                if (onBackPressed()) {
-                    return true;
-                }
-                break;
-        }
-        return false;
-    }
-
-    boolean onKeyDown(int keyCode, KeyEvent event) {
-        switch (keyCode) {
-            case KeyEvent.KEYCODE_MENU:
-                onKeyDownPanel(Window.FEATURE_OPTIONS_PANEL, event);
-                // We need to return true here and not let it bubble up to the Window.
-                // For empty menus, PhoneWindow's KEYCODE_BACK handling will steals all events,
-                // not allowing the Activity to call onBackPressed().
-                return true;
-            case KeyEvent.KEYCODE_BACK:
-                // Certain devices allow opening the options menu via a long press of the back
-                // button. We keep a record of whether the last event is from a long press.
-                mLongPressBackDown = (event.getFlags() & KeyEvent.FLAG_LONG_PRESS) != 0;
-                break;
-        }
-
-        // On API v7-10 we need to manually call onKeyShortcut() as this is not called
-        // from the Activity
-        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
-            // We do not return true here otherwise dispatchKeyEvent will not reach the Activity
-            // (which results in the back button not working)
-            onKeyShortcut(keyCode, event);
-        }
-        return false;
-    }
-
-    @Override
-    public View createView(View parent, final String name, @NonNull Context context,
-            @NonNull AttributeSet attrs) {
-        final boolean isPre21 = Build.VERSION.SDK_INT < 21;
-
-        if (mAppCompatViewInflater == null) {
-            mAppCompatViewInflater = new AppCompatViewInflater();
-        }
-
-        // We only want the View to inherit its context if we're running pre-v21
-        final boolean inheritContext = isPre21 && shouldInheritContext((ViewParent) parent);
-
-        return mAppCompatViewInflater.createView(parent, name, context, attrs, inheritContext,
-                isPre21, /* Only read android:theme pre-L (L+ handles this anyway) */
-                true, /* Read read app:theme as a fallback at all times for legacy reasons */
-                VectorEnabledTintResources.shouldBeUsed() /* Only tint wrap the context if enabled */
-        );
-    }
-
-    private boolean shouldInheritContext(ViewParent parent) {
-        if (parent == null) {
-            // The initial parent is null so just return false
-            return false;
-        }
-        final View windowDecor = mWindow.getDecorView();
-        while (true) {
-            if (parent == null) {
-                // Bingo. We've hit a view which has a null parent before being terminated from
-                // the loop. This is (most probably) because it's the root view in an inflation
-                // call, therefore we should inherit. This works as the inflated layout is only
-                // added to the hierarchy at the end of the inflate() call.
-                return true;
-            } else if (parent == windowDecor || !(parent instanceof View)
-                    || ViewCompat.isAttachedToWindow((View) parent)) {
-                // We have either hit the window's decor view, a parent which isn't a View
-                // (i.e. ViewRootImpl), or an attached view, so we know that the original parent
-                // is currently added to the view hierarchy. This means that it has not be
-                // inflated in the current inflate() call and we should not inherit the context.
-                return false;
-            }
-            parent = parent.getParent();
-        }
-    }
-
-    @Override
-    public void installViewFactory() {
-        LayoutInflater layoutInflater = LayoutInflater.from(mContext);
-        if (layoutInflater.getFactory() == null) {
-            LayoutInflaterCompat.setFactory(layoutInflater, this);
-        } else {
-            if (!(LayoutInflaterCompat.getFactory(layoutInflater)
-                    instanceof AppCompatDelegateImplV7)) {
-                Log.i(TAG, "The Activity's LayoutInflater already has a Factory installed"
-                        + " so we can not install AppCompat's");
-            }
-        }
-    }
-
-    /**
-     * From {@link android.support.v4.view.LayoutInflaterFactory}
-     */
-    @Override
-    public final View onCreateView(View parent, String name,
-            Context context, AttributeSet attrs) {
-        // First let the Activity's Factory try and inflate the view
-        final View view = callActivityOnCreateView(parent, name, context, attrs);
-        if (view != null) {
-            return view;
-        }
-
-        // If the Factory didn't handle it, let our createView() method try
-        return createView(parent, name, context, attrs);
-    }
-
-    View callActivityOnCreateView(View parent, String name, Context context, AttributeSet attrs) {
-        // Let the Activity's LayoutInflater.Factory try and handle it
-        if (mOriginalWindowCallback instanceof LayoutInflater.Factory) {
-            final View result = ((LayoutInflater.Factory) mOriginalWindowCallback)
-                    .onCreateView(name, context, attrs);
-            if (result != null) {
-                return result;
-            }
-        }
-        return null;
-    }
-
-    private void openPanel(final PanelFeatureState st, KeyEvent event) {
-        // Already open, return
-        if (st.isOpen || isDestroyed()) {
-            return;
-        }
-
-        // Don't open an options panel for honeycomb apps on xlarge devices.
-        // (The app should be using an action bar for menu items.)
-        if (st.featureId == FEATURE_OPTIONS_PANEL) {
-            Context context = mContext;
-            Configuration config = context.getResources().getConfiguration();
-            boolean isXLarge = (config.screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) ==
-                    Configuration.SCREENLAYOUT_SIZE_XLARGE;
-            boolean isHoneycombApp = context.getApplicationInfo().targetSdkVersion >=
-                    android.os.Build.VERSION_CODES.HONEYCOMB;
-
-            if (isXLarge && isHoneycombApp) {
-                return;
-            }
-        }
-
-        Window.Callback cb = getWindowCallback();
-        if ((cb != null) && (!cb.onMenuOpened(st.featureId, st.menu))) {
-            // Callback doesn't want the menu to open, reset any state
-            closePanel(st, true);
-            return;
-        }
-
-        final WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
-        if (wm == null) {
-            return;
-        }
-
-        // Prepare panel (should have been done before, but just in case)
-        if (!preparePanel(st, event)) {
-            return;
-        }
-
-        int width = WRAP_CONTENT;
-        if (st.decorView == null || st.refreshDecorView) {
-            if (st.decorView == null) {
-                // Initialize the panel decor, this will populate st.decorView
-                if (!initializePanelDecor(st) || (st.decorView == null))
-                    return;
-            } else if (st.refreshDecorView && (st.decorView.getChildCount() > 0)) {
-                // Decor needs refreshing, so remove its views
-                st.decorView.removeAllViews();
-            }
-
-            // This will populate st.shownPanelView
-            if (!initializePanelContent(st) || !st.hasPanelItems()) {
-                return;
-            }
-
-            ViewGroup.LayoutParams lp = st.shownPanelView.getLayoutParams();
-            if (lp == null) {
-                lp = new ViewGroup.LayoutParams(WRAP_CONTENT, WRAP_CONTENT);
-            }
-
-            int backgroundResId = st.background;
-            st.decorView.setBackgroundResource(backgroundResId);
-
-            ViewParent shownPanelParent = st.shownPanelView.getParent();
-            if (shownPanelParent != null && shownPanelParent instanceof ViewGroup) {
-                ((ViewGroup) shownPanelParent).removeView(st.shownPanelView);
-            }
-            st.decorView.addView(st.shownPanelView, lp);
-
-            /*
-             * Give focus to the view, if it or one of its children does not
-             * already have it.
-             */
-            if (!st.shownPanelView.hasFocus()) {
-                st.shownPanelView.requestFocus();
-            }
-        } else if (st.createdPanelView != null) {
-            // If we already had a panel view, carry width=MATCH_PARENT through
-            // as we did above when it was created.
-            ViewGroup.LayoutParams lp = st.createdPanelView.getLayoutParams();
-            if (lp != null && lp.width == ViewGroup.LayoutParams.MATCH_PARENT) {
-                width = MATCH_PARENT;
-            }
-        }
-
-        st.isHandled = false;
-
-        WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
-                width, WRAP_CONTENT,
-                st.x, st.y, WindowManager.LayoutParams.TYPE_APPLICATION_SUB_PANEL,
-                WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM
-                        | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH,
-                PixelFormat.TRANSLUCENT);
-
-        lp.gravity = st.gravity;
-        lp.windowAnimations = st.windowAnimations;
-
-        wm.addView(st.decorView, lp);
-        st.isOpen = true;
-    }
-
-    private boolean initializePanelDecor(PanelFeatureState st) {
-        st.setStyle(getActionBarThemedContext());
-        st.decorView = new ListMenuDecorView(st.listPresenterContext);
-        st.gravity = Gravity.CENTER | Gravity.BOTTOM;
-        return true;
-    }
-
-    private void reopenMenu(MenuBuilder menu, boolean toggleMenuMode) {
-        if (mDecorContentParent != null && mDecorContentParent.canShowOverflowMenu() &&
-                (!ViewConfigurationCompat.hasPermanentMenuKey(ViewConfiguration.get(mContext)) ||
-                        mDecorContentParent.isOverflowMenuShowPending())) {
-
-            final Window.Callback cb = getWindowCallback();
-
-            if (!mDecorContentParent.isOverflowMenuShowing() || !toggleMenuMode) {
-                if (cb != null && !isDestroyed()) {
-                    // If we have a menu invalidation pending, do it now.
-                    if (mInvalidatePanelMenuPosted &&
-                            (mInvalidatePanelMenuFeatures & (1 << FEATURE_OPTIONS_PANEL)) != 0) {
-                        mWindow.getDecorView().removeCallbacks(mInvalidatePanelMenuRunnable);
-                        mInvalidatePanelMenuRunnable.run();
-                    }
-
-                    final PanelFeatureState st = getPanelState(FEATURE_OPTIONS_PANEL, true);
-
-                    // If we don't have a menu or we're waiting for a full content refresh,
-                    // forget it. This is a lingering event that no longer matters.
-                    if (st.menu != null && !st.refreshMenuContent &&
-                            cb.onPreparePanel(FEATURE_OPTIONS_PANEL, st.createdPanelView, st.menu)) {
-                        cb.onMenuOpened(FEATURE_SUPPORT_ACTION_BAR, st.menu);
-                        mDecorContentParent.showOverflowMenu();
-                    }
-                }
-            } else {
-                mDecorContentParent.hideOverflowMenu();
-                if (!isDestroyed()) {
-                    final PanelFeatureState st = getPanelState(FEATURE_OPTIONS_PANEL, true);
-                    cb.onPanelClosed(FEATURE_SUPPORT_ACTION_BAR, st.menu);
-                }
-            }
-            return;
-        }
-
-        PanelFeatureState st = getPanelState(FEATURE_OPTIONS_PANEL, true);
-
-        st.refreshDecorView = true;
-        closePanel(st, false);
-
-        openPanel(st, null);
-    }
-
-    private boolean initializePanelMenu(final PanelFeatureState st) {
-        Context context = mContext;
-
-        // If we have an action bar, initialize the menu with the right theme.
-        if ((st.featureId == FEATURE_OPTIONS_PANEL || st.featureId == FEATURE_SUPPORT_ACTION_BAR) &&
-                mDecorContentParent != null) {
-            final TypedValue outValue = new TypedValue();
-            final Resources.Theme baseTheme = context.getTheme();
-            baseTheme.resolveAttribute(R.attr.actionBarTheme, outValue, true);
-
-            Resources.Theme widgetTheme = null;
-            if (outValue.resourceId != 0) {
-                widgetTheme = context.getResources().newTheme();
-                widgetTheme.setTo(baseTheme);
-                widgetTheme.applyStyle(outValue.resourceId, true);
-                widgetTheme.resolveAttribute(
-                        R.attr.actionBarWidgetTheme, outValue, true);
-            } else {
-                baseTheme.resolveAttribute(
-                        R.attr.actionBarWidgetTheme, outValue, true);
-            }
-
-            if (outValue.resourceId != 0) {
-                if (widgetTheme == null) {
-                    widgetTheme = context.getResources().newTheme();
-                    widgetTheme.setTo(baseTheme);
-                }
-                widgetTheme.applyStyle(outValue.resourceId, true);
-            }
-
-            if (widgetTheme != null) {
-                context = new ContextThemeWrapper(context, 0);
-                context.getTheme().setTo(widgetTheme);
-            }
-        }
-
-        final MenuBuilder menu = new MenuBuilder(context);
-        menu.setCallback(this);
-        st.setMenu(menu);
-
-        return true;
-    }
-
-    private boolean initializePanelContent(PanelFeatureState st) {
-        if (st.createdPanelView != null) {
-            st.shownPanelView = st.createdPanelView;
-            return true;
-        }
-
-        if (st.menu == null) {
-            return false;
-        }
-
-        if (mPanelMenuPresenterCallback == null) {
-            mPanelMenuPresenterCallback = new PanelMenuPresenterCallback();
-        }
-
-        MenuView menuView = st.getListMenuView(mPanelMenuPresenterCallback);
-
-        st.shownPanelView = (View) menuView;
-
-        return st.shownPanelView != null;
-    }
-
-    private boolean preparePanel(PanelFeatureState st, KeyEvent event) {
-        if (isDestroyed()) {
-            return false;
-        }
-
-        // Already prepared (isPrepared will be reset to false later)
-        if (st.isPrepared) {
-            return true;
-        }
-
-        if ((mPreparedPanel != null) && (mPreparedPanel != st)) {
-            // Another Panel is prepared and possibly open, so close it
-            closePanel(mPreparedPanel, false);
-        }
-
-        final Window.Callback cb = getWindowCallback();
-
-        if (cb != null) {
-            st.createdPanelView = cb.onCreatePanelView(st.featureId);
-        }
-
-        final boolean isActionBarMenu =
-                (st.featureId == FEATURE_OPTIONS_PANEL || st.featureId == FEATURE_SUPPORT_ACTION_BAR);
-
-        if (isActionBarMenu && mDecorContentParent != null) {
-            // Enforce ordering guarantees around events so that the action bar never
-            // dispatches menu-related events before the panel is prepared.
-            mDecorContentParent.setMenuPrepared();
-        }
-
-        if (st.createdPanelView == null &&
-                (!isActionBarMenu || !(peekSupportActionBar() instanceof ToolbarActionBar))) {
-            // Since ToolbarActionBar handles the list options menu itself, we only want to
-            // init this menu panel if we're not using a TAB.
-            if (st.menu == null || st.refreshMenuContent) {
-                if (st.menu == null) {
-                    if (!initializePanelMenu(st) || (st.menu == null)) {
-                        return false;
-                    }
-                }
-
-                if (isActionBarMenu && mDecorContentParent != null) {
-                    if (mActionMenuPresenterCallback == null) {
-                        mActionMenuPresenterCallback = new ActionMenuPresenterCallback();
-                    }
-                    mDecorContentParent.setMenu(st.menu, mActionMenuPresenterCallback);
-                }
-
-                // Creating the panel menu will involve a lot of manipulation;
-                // don't dispatch change events to presenters until we're done.
-                st.menu.stopDispatchingItemsChanged();
-                if (!cb.onCreatePanelMenu(st.featureId, st.menu)) {
-                    // Ditch the menu created above
-                    st.setMenu(null);
-
-                    if (isActionBarMenu && mDecorContentParent != null) {
-                        // Don't show it in the action bar either
-                        mDecorContentParent.setMenu(null, mActionMenuPresenterCallback);
-                    }
-
-                    return false;
-                }
-
-                st.refreshMenuContent = false;
-            }
-
-            // Preparing the panel menu can involve a lot of manipulation;
-            // don't dispatch change events to presenters until we're done.
-            st.menu.stopDispatchingItemsChanged();
-
-            // Restore action view state before we prepare. This gives apps
-            // an opportunity to override frozen/restored state in onPrepare.
-            if (st.frozenActionViewState != null) {
-                st.menu.restoreActionViewStates(st.frozenActionViewState);
-                st.frozenActionViewState = null;
-            }
-
-            // Callback and return if the callback does not want to show the menu
-            if (!cb.onPreparePanel(FEATURE_OPTIONS_PANEL, st.createdPanelView, st.menu)) {
-                if (isActionBarMenu && mDecorContentParent != null) {
-                    // The app didn't want to show the menu for now but it still exists.
-                    // Clear it out of the action bar.
-                    mDecorContentParent.setMenu(null, mActionMenuPresenterCallback);
-                }
-                st.menu.startDispatchingItemsChanged();
-                return false;
-            }
-
-            // Set the proper keymap
-            KeyCharacterMap kmap = KeyCharacterMap.load(
-                    event != null ? event.getDeviceId() : KeyCharacterMap.VIRTUAL_KEYBOARD);
-            st.qwertyMode = kmap.getKeyboardType() != KeyCharacterMap.NUMERIC;
-            st.menu.setQwertyMode(st.qwertyMode);
-            st.menu.startDispatchingItemsChanged();
-        }
-
-        // Set other state
-        st.isPrepared = true;
-        st.isHandled = false;
-        mPreparedPanel = st;
-
-        return true;
-    }
-
-    private void checkCloseActionMenu(MenuBuilder menu) {
-        if (mClosingActionMenu) {
-            return;
-        }
-
-        mClosingActionMenu = true;
-        mDecorContentParent.dismissPopups();
-        Window.Callback cb = getWindowCallback();
-        if (cb != null && !isDestroyed()) {
-            cb.onPanelClosed(FEATURE_SUPPORT_ACTION_BAR, menu);
-        }
-        mClosingActionMenu = false;
-    }
-
-    private void closePanel(int featureId) {
-        closePanel(getPanelState(featureId, true), true);
-    }
-
-    private void closePanel(PanelFeatureState st, boolean doCallback) {
-        if (doCallback && st.featureId == FEATURE_OPTIONS_PANEL &&
-                mDecorContentParent != null && mDecorContentParent.isOverflowMenuShowing()) {
-            checkCloseActionMenu(st.menu);
-            return;
-        }
-
-        final WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
-        if (wm != null && st.isOpen && st.decorView != null) {
-            wm.removeView(st.decorView);
-
-            if (doCallback) {
-                callOnPanelClosed(st.featureId, st, null);
-            }
-        }
-
-        st.isPrepared = false;
-        st.isHandled = false;
-        st.isOpen = false;
-
-        // This view is no longer shown, so null it out
-        st.shownPanelView = null;
-
-        // Next time the menu opens, it should not be in expanded mode, so
-        // force a refresh of the decor
-        st.refreshDecorView = true;
-
-        if (mPreparedPanel == st) {
-            mPreparedPanel = null;
-        }
-    }
-
-    private boolean onKeyDownPanel(int featureId, KeyEvent event) {
-        if (event.getRepeatCount() == 0) {
-            PanelFeatureState st = getPanelState(featureId, true);
-            if (!st.isOpen) {
-                return preparePanel(st, event);
-            }
-        }
-
-        return false;
-    }
-
-    private boolean onKeyUpPanel(int featureId, KeyEvent event) {
-        if (mActionMode != null) {
-            return false;
-        }
-
-        boolean handled = false;
-        final PanelFeatureState st = getPanelState(featureId, true);
-        if (featureId == FEATURE_OPTIONS_PANEL && mDecorContentParent != null &&
-                mDecorContentParent.canShowOverflowMenu() &&
-                !ViewConfigurationCompat.hasPermanentMenuKey(ViewConfiguration.get(mContext))) {
-            if (!mDecorContentParent.isOverflowMenuShowing()) {
-                if (!isDestroyed() && preparePanel(st, event)) {
-                    handled = mDecorContentParent.showOverflowMenu();
-                }
-            } else {
-                handled = mDecorContentParent.hideOverflowMenu();
-            }
-        } else {
-            if (st.isOpen || st.isHandled) {
-                // Play the sound effect if the user closed an open menu (and not if
-                // they just released a menu shortcut)
-                handled = st.isOpen;
-                // Close menu
-                closePanel(st, true);
-            } else if (st.isPrepared) {
-                boolean show = true;
-                if (st.refreshMenuContent) {
-                    // Something may have invalidated the menu since we prepared it.
-                    // Re-prepare it to refresh.
-                    st.isPrepared = false;
-                    show = preparePanel(st, event);
-                }
-
-                if (show) {
-                    // Show menu
-                    openPanel(st, event);
-                    handled = true;
-                }
-            }
-        }
-
-        if (handled) {
-            AudioManager audioManager = (AudioManager) mContext.getSystemService(
-                    Context.AUDIO_SERVICE);
-            if (audioManager != null) {
-                audioManager.playSoundEffect(AudioManager.FX_KEY_CLICK);
-            } else {
-                Log.w(TAG, "Couldn't get audio manager");
-            }
-        }
-        return handled;
-    }
-
-    private void callOnPanelClosed(int featureId, PanelFeatureState panel, Menu menu) {
-        // Try to get a menu
-        if (menu == null) {
-            // Need a panel to grab the menu, so try to get that
-            if (panel == null) {
-                if ((featureId >= 0) && (featureId < mPanels.length)) {
-                    panel = mPanels[featureId];
-                }
-            }
-
-            if (panel != null) {
-                // menu still may be null, which is okay--we tried our best
-                menu = panel.menu;
-            }
-        }
-
-        // If the panel is not open, do not callback
-        if ((panel != null) && (!panel.isOpen))
-            return;
-
-        if (!isDestroyed()) {
-            // We need to be careful which callback we dispatch the call to. We can not dispatch
-            // this to the Window's callback since that will call back into this method and cause a
-            // crash. Instead we need to dispatch down to the original Activity/Dialog/etc.
-            mOriginalWindowCallback.onPanelClosed(featureId, menu);
-        }
-    }
-
-    private PanelFeatureState findMenuPanel(Menu menu) {
-        final PanelFeatureState[] panels = mPanels;
-        final int N = panels != null ? panels.length : 0;
-        for (int i = 0; i < N; i++) {
-            final PanelFeatureState panel = panels[i];
-            if (panel != null && panel.menu == menu) {
-                return panel;
-            }
-        }
-        return null;
-    }
-
-    protected PanelFeatureState getPanelState(int featureId, boolean required) {
-        PanelFeatureState[] ar;
-        if ((ar = mPanels) == null || ar.length <= featureId) {
-            PanelFeatureState[] nar = new PanelFeatureState[featureId + 1];
-            if (ar != null) {
-                System.arraycopy(ar, 0, nar, 0, ar.length);
-            }
-            mPanels = ar = nar;
-        }
-
-        PanelFeatureState st = ar[featureId];
-        if (st == null) {
-            ar[featureId] = st = new PanelFeatureState(featureId);
-        }
-        return st;
-    }
-
-    private boolean performPanelShortcut(PanelFeatureState st, int keyCode, KeyEvent event,
-            int flags) {
-        if (event.isSystem()) {
-            return false;
-        }
-
-        boolean handled = false;
-
-        // Only try to perform menu shortcuts if preparePanel returned true (possible false
-        // return value from application not wanting to show the menu).
-        if ((st.isPrepared || preparePanel(st, event)) && st.menu != null) {
-            // The menu is prepared now, perform the shortcut on it
-            handled = st.menu.performShortcut(keyCode, event, flags);
-        }
-
-        if (handled) {
-            // Only close down the menu if we don't have an action bar keeping it open.
-            if ((flags & Menu.FLAG_PERFORM_NO_CLOSE) == 0 && mDecorContentParent == null) {
-                closePanel(st, true);
-            }
-        }
-
-        return handled;
-    }
-
-    private void invalidatePanelMenu(int featureId) {
-        mInvalidatePanelMenuFeatures |= 1 << featureId;
-
-        if (!mInvalidatePanelMenuPosted) {
-            ViewCompat.postOnAnimation(mWindow.getDecorView(), mInvalidatePanelMenuRunnable);
-            mInvalidatePanelMenuPosted = true;
-        }
-    }
-
-    private void doInvalidatePanelMenu(int featureId) {
-        PanelFeatureState st = getPanelState(featureId, true);
-        Bundle savedActionViewStates = null;
-        if (st.menu != null) {
-            savedActionViewStates = new Bundle();
-            st.menu.saveActionViewStates(savedActionViewStates);
-            if (savedActionViewStates.size() > 0) {
-                st.frozenActionViewState = savedActionViewStates;
-            }
-            // This will be started again when the panel is prepared.
-            st.menu.stopDispatchingItemsChanged();
-            st.menu.clear();
-        }
-        st.refreshMenuContent = true;
-        st.refreshDecorView = true;
-
-        // Prepare the options panel if we have an action bar
-        if ((featureId == FEATURE_SUPPORT_ACTION_BAR || featureId == FEATURE_OPTIONS_PANEL)
-                && mDecorContentParent != null) {
-            st = getPanelState(Window.FEATURE_OPTIONS_PANEL, false);
-            if (st != null) {
-                st.isPrepared = false;
-                preparePanel(st, null);
-            }
-        }
-    }
-
-    /**
-     * Updates the status bar guard
-     *
-     * @param insetTop the current top system window inset
-     * @return the new top system window inset
-     */
-    private int updateStatusGuard(int insetTop) {
-        boolean showStatusGuard = false;
-        // Show the status guard when the non-overlay contextual action bar is showing
-        if (mActionModeView != null) {
-            if (mActionModeView.getLayoutParams() instanceof ViewGroup.MarginLayoutParams) {
-                ViewGroup.MarginLayoutParams mlp = (ViewGroup.MarginLayoutParams)
-                        mActionModeView.getLayoutParams();
-                boolean mlpChanged = false;
-
-                if (mActionModeView.isShown()) {
-                    if (mTempRect1 == null) {
-                        mTempRect1 = new Rect();
-                        mTempRect2 = new Rect();
-                    }
-                    final Rect insets = mTempRect1;
-                    final Rect localInsets = mTempRect2;
-                    insets.set(0, insetTop, 0, 0);
-
-                    ViewUtils.computeFitSystemWindows(mSubDecor, insets, localInsets);
-                    final int newMargin = localInsets.top == 0 ? insetTop : 0;
-                    if (mlp.topMargin != newMargin) {
-                        mlpChanged = true;
-                        mlp.topMargin = insetTop;
-
-                        if (mStatusGuard == null) {
-                            mStatusGuard = new View(mContext);
-                            mStatusGuard.setBackgroundColor(mContext.getResources()
-                                    .getColor(R.color.abc_input_method_navigation_guard));
-                            mSubDecor.addView(mStatusGuard, -1,
-                                    new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
-                                            insetTop));
-                        } else {
-                            ViewGroup.LayoutParams lp = mStatusGuard.getLayoutParams();
-                            if (lp.height != insetTop) {
-                                lp.height = insetTop;
-                                mStatusGuard.setLayoutParams(lp);
-                            }
-                        }
-                    }
-
-                    // The action mode's theme may differ from the app, so
-                    // always show the status guard above it.
-                    showStatusGuard = mStatusGuard != null;
-
-                    // We only need to consume the insets if the action
-                    // mode is overlaid on the app content (e.g. it's
-                    // sitting in a FrameLayout, see
-                    // screen_simple_overlay_action_mode.xml).
-                    if (!mOverlayActionMode && showStatusGuard) {
-                        insetTop = 0;
-                    }
-                } else {
-                    // reset top margin
-                    if (mlp.topMargin != 0) {
-                        mlpChanged = true;
-                        mlp.topMargin = 0;
-                    }
-                }
-                if (mlpChanged) {
-                    mActionModeView.setLayoutParams(mlp);
-                }
-            }
-        }
-        if (mStatusGuard != null) {
-            mStatusGuard.setVisibility(showStatusGuard ? View.VISIBLE : View.GONE);
-        }
-
-        return insetTop;
-    }
-
-    private void throwFeatureRequestIfSubDecorInstalled() {
-        if (mSubDecorInstalled) {
-            throw new AndroidRuntimeException(
-                    "Window feature must be requested before adding content");
-        }
-    }
-
-    private int sanitizeWindowFeatureId(int featureId) {
-        if (featureId == WindowCompat.FEATURE_ACTION_BAR) {
-            Log.i(TAG, "You should now use the AppCompatDelegate.FEATURE_SUPPORT_ACTION_BAR"
-                    + " id when requesting this feature.");
-            return FEATURE_SUPPORT_ACTION_BAR;
-        } else if (featureId == WindowCompat.FEATURE_ACTION_BAR_OVERLAY) {
-            Log.i(TAG, "You should now use the AppCompatDelegate.FEATURE_SUPPORT_ACTION_BAR_OVERLAY"
-                    + " id when requesting this feature.");
-            return FEATURE_SUPPORT_ACTION_BAR_OVERLAY;
-        }
-        // Else we'll just return the original id
-        return featureId;
-    }
-
-    ViewGroup getSubDecor() {
-        return mSubDecor;
-    }
-
-    private void dismissPopups() {
-        if (mDecorContentParent != null) {
-            mDecorContentParent.dismissPopups();
-        }
-
-        if (mActionModePopup != null) {
-            mWindow.getDecorView().removeCallbacks(mShowActionModePopup);
-            if (mActionModePopup.isShowing()) {
-                try {
-                    mActionModePopup.dismiss();
-                } catch (IllegalArgumentException e) {
-                    // Pre-v18, there are times when the Window will remove the popup before us.
-                    // In these cases we need to swallow the resulting exception.
-                }
-            }
-            mActionModePopup = null;
-        }
-        endOnGoingFadeAnimation();
-
-        PanelFeatureState st = getPanelState(FEATURE_OPTIONS_PANEL, false);
-        if (st != null && st.menu != null) {
-            st.menu.close();
-        }
-    }
-
-    /**
-     * Clears out internal reference when the action mode is destroyed.
-     */
-    class ActionModeCallbackWrapperV7 implements ActionMode.Callback {
-        private ActionMode.Callback mWrapped;
-
-        public ActionModeCallbackWrapperV7(ActionMode.Callback wrapped) {
-            mWrapped = wrapped;
-        }
-
-        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
-            return mWrapped.onCreateActionMode(mode, menu);
-        }
-
-        public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
-            return mWrapped.onPrepareActionMode(mode, menu);
-        }
-
-        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
-            return mWrapped.onActionItemClicked(mode, item);
-        }
-
-        public void onDestroyActionMode(ActionMode mode) {
-            mWrapped.onDestroyActionMode(mode);
-            if (mActionModePopup != null) {
-                mWindow.getDecorView().removeCallbacks(mShowActionModePopup);
-            }
-
-            if (mActionModeView != null) {
-                endOnGoingFadeAnimation();
-                mFadeAnim = ViewCompat.animate(mActionModeView).alpha(0f);
-                mFadeAnim.setListener(new ViewPropertyAnimatorListenerAdapter() {
-                    @Override
-                    public void onAnimationEnd(View view) {
-                        mActionModeView.setVisibility(View.GONE);
-                        if (mActionModePopup != null) {
-                            mActionModePopup.dismiss();
-                        } else if (mActionModeView.getParent() instanceof View) {
-                            ViewCompat.requestApplyInsets((View) mActionModeView.getParent());
-                        }
-                        mActionModeView.removeAllViews();
-                        mFadeAnim.setListener(null);
-                        mFadeAnim = null;
-                    }
-                });
-            }
-            if (mAppCompatCallback != null) {
-                mAppCompatCallback.onSupportActionModeFinished(mActionMode);
-            }
-            mActionMode = null;
-        }
-    }
-
-    private final class PanelMenuPresenterCallback implements MenuPresenter.Callback {
-        @Override
-        public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) {
-            final Menu parentMenu = menu.getRootMenu();
-            final boolean isSubMenu = parentMenu != menu;
-            final PanelFeatureState panel = findMenuPanel(isSubMenu ? parentMenu : menu);
-            if (panel != null) {
-                if (isSubMenu) {
-                    callOnPanelClosed(panel.featureId, panel, parentMenu);
-                    closePanel(panel, true);
-                } else {
-                    // Close the panel and only do the callback if the menu is being
-                    // closed completely, not if opening a sub menu
-                    closePanel(panel, allMenusAreClosing);
-                }
-            }
-        }
-
-        @Override
-        public boolean onOpenSubMenu(MenuBuilder subMenu) {
-            if (subMenu == null && mHasActionBar) {
-                Window.Callback cb = getWindowCallback();
-                if (cb != null && !isDestroyed()) {
-                    cb.onMenuOpened(FEATURE_SUPPORT_ACTION_BAR, subMenu);
-                }
-            }
-            return true;
-        }
-    }
-
-    private final class ActionMenuPresenterCallback implements MenuPresenter.Callback {
-        @Override
-        public boolean onOpenSubMenu(MenuBuilder subMenu) {
-            Window.Callback cb = getWindowCallback();
-            if (cb != null) {
-                cb.onMenuOpened(FEATURE_SUPPORT_ACTION_BAR, subMenu);
-            }
-            return true;
-        }
-
-        @Override
-        public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) {
-            checkCloseActionMenu(menu);
-        }
-    }
-
-    protected static final class PanelFeatureState {
-
-        /** Feature ID for this panel. */
-        int featureId;
-
-        int background;
-
-        int gravity;
-
-        int x;
-
-        int y;
-
-        int windowAnimations;
-
-        /** Dynamic state of the panel. */
-        ViewGroup decorView;
-
-        /** The panel that we are actually showing. */
-        View shownPanelView;
-
-        /** The panel that was returned by onCreatePanelView(). */
-        View createdPanelView;
-
-        /** Use {@link #setMenu} to set this. */
-        MenuBuilder menu;
-
-        ListMenuPresenter listMenuPresenter;
-
-        Context listPresenterContext;
-
-        /**
-         * Whether the panel has been prepared (see
-         * {@link #preparePanel}).
-         */
-        boolean isPrepared;
-
-        /**
-         * Whether an item's action has been performed. This happens in obvious
-         * scenarios (user clicks on menu item), but can also happen with
-         * chording menu+(shortcut key).
-         */
-        boolean isHandled;
-
-        boolean isOpen;
-
-        public boolean qwertyMode;
-
-        boolean refreshDecorView;
-
-        boolean refreshMenuContent;
-
-        boolean wasLastOpen;
-
-        /**
-         * Contains the state of the menu when told to freeze.
-         */
-        Bundle frozenMenuState;
-
-        /**
-         * Contains the state of associated action views when told to freeze.
-         * These are saved across invalidations.
-         */
-        Bundle frozenActionViewState;
-
-        PanelFeatureState(int featureId) {
-            this.featureId = featureId;
-
-            refreshDecorView = false;
-        }
-
-        public boolean hasPanelItems() {
-            if (shownPanelView == null) return false;
-            if (createdPanelView != null) return true;
-
-            return listMenuPresenter.getAdapter().getCount() > 0;
-        }
-
-        /**
-         * Unregister and free attached MenuPresenters. They will be recreated as needed.
-         */
-        public void clearMenuPresenters() {
-            if (menu != null) {
-                menu.removeMenuPresenter(listMenuPresenter);
-            }
-            listMenuPresenter = null;
-        }
-
-        void setStyle(Context context) {
-            final TypedValue outValue = new TypedValue();
-            final Resources.Theme widgetTheme = context.getResources().newTheme();
-            widgetTheme.setTo(context.getTheme());
-
-            // First apply the actionBarPopupTheme
-            widgetTheme.resolveAttribute(R.attr.actionBarPopupTheme, outValue, true);
-            if (outValue.resourceId != 0) {
-                widgetTheme.applyStyle(outValue.resourceId, true);
-            }
-
-            // Now apply the panelMenuListTheme
-            widgetTheme.resolveAttribute(R.attr.panelMenuListTheme, outValue, true);
-            if (outValue.resourceId != 0) {
-                widgetTheme.applyStyle(outValue.resourceId, true);
-            } else {
-                widgetTheme.applyStyle(R.style.Theme_AppCompat_CompactMenu, true);
-            }
-
-            context = new ContextThemeWrapper(context, 0);
-            context.getTheme().setTo(widgetTheme);
-
-            listPresenterContext = context;
-
-            TypedArray a = context.obtainStyledAttributes(R.styleable.AppCompatTheme);
-            background = a.getResourceId(
-                    R.styleable.AppCompatTheme_panelBackground, 0);
-            windowAnimations = a.getResourceId(
-                    R.styleable.AppCompatTheme_android_windowAnimationStyle, 0);
-            a.recycle();
-        }
-
-        void setMenu(MenuBuilder menu) {
-            if (menu == this.menu) return;
-
-            if (this.menu != null) {
-                this.menu.removeMenuPresenter(listMenuPresenter);
-            }
-            this.menu = menu;
-            if (menu != null) {
-                if (listMenuPresenter != null) menu.addMenuPresenter(listMenuPresenter);
-            }
-        }
-
-        MenuView getListMenuView(MenuPresenter.Callback cb) {
-            if (menu == null) return null;
-
-            if (listMenuPresenter == null) {
-                listMenuPresenter = new ListMenuPresenter(listPresenterContext,
-                        R.layout.abc_list_menu_item_layout);
-                listMenuPresenter.setCallback(cb);
-                menu.addMenuPresenter(listMenuPresenter);
-            }
-
-            MenuView result = listMenuPresenter.getMenuView(decorView);
-
-            return result;
-        }
-
-        Parcelable onSaveInstanceState() {
-            SavedState savedState = new SavedState();
-            savedState.featureId = featureId;
-            savedState.isOpen = isOpen;
-
-            if (menu != null) {
-                savedState.menuState = new Bundle();
-                menu.savePresenterStates(savedState.menuState);
-            }
-
-            return savedState;
-        }
-
-        void onRestoreInstanceState(Parcelable state) {
-            SavedState savedState = (SavedState) state;
-            featureId = savedState.featureId;
-            wasLastOpen = savedState.isOpen;
-            frozenMenuState = savedState.menuState;
-
-            shownPanelView = null;
-            decorView = null;
-        }
-
-        void applyFrozenState() {
-            if (menu != null && frozenMenuState != null) {
-                menu.restorePresenterStates(frozenMenuState);
-                frozenMenuState = null;
-            }
-        }
-
-        private static class SavedState implements Parcelable {
-            int featureId;
-            boolean isOpen;
-            Bundle menuState;
-
-            public int describeContents() {
-                return 0;
-            }
-
-            public void writeToParcel(Parcel dest, int flags) {
-                dest.writeInt(featureId);
-                dest.writeInt(isOpen ? 1 : 0);
-
-                if (isOpen) {
-                    dest.writeBundle(menuState);
-                }
-            }
-
-            private static SavedState readFromParcel(Parcel source, ClassLoader loader) {
-                SavedState savedState = new SavedState();
-                savedState.featureId = source.readInt();
-                savedState.isOpen = source.readInt() == 1;
-
-                if (savedState.isOpen) {
-                    savedState.menuState = source.readBundle(loader);
-                }
-
-                return savedState;
-            }
-
-            public static final Parcelable.Creator<SavedState> CREATOR
-                    = ParcelableCompat.newCreator(
-                    new ParcelableCompatCreatorCallbacks<SavedState>() {
-                        @Override
-                        public SavedState createFromParcel(Parcel in, ClassLoader loader) {
-                            return readFromParcel(in, loader);
-                        }
-
-                        @Override
-                        public SavedState[] newArray(int size) {
-                            return new SavedState[size];
-                        }
-                    });
-        }
-    }
-
-    private class ListMenuDecorView extends ContentFrameLayout {
-        public ListMenuDecorView(Context context) {
-            super(context);
-        }
-
-        @Override
-        public boolean dispatchKeyEvent(KeyEvent event) {
-            return AppCompatDelegateImplV7.this.dispatchKeyEvent(event)
-                    || super.dispatchKeyEvent(event);
-        }
-
-        @Override
-        public boolean onInterceptTouchEvent(MotionEvent event) {
-            int action = event.getAction();
-            if (action == MotionEvent.ACTION_DOWN) {
-                int x = (int) event.getX();
-                int y = (int) event.getY();
-                if (isOutOfBounds(x, y)) {
-                    closePanel(Window.FEATURE_OPTIONS_PANEL);
-                    return true;
-                }
-            }
-            return super.onInterceptTouchEvent(event);
-        }
-
-        @Override
-        public void setBackgroundResource(int resid) {
-            setBackgroundDrawable(AppCompatDrawableManager.get().getDrawable(getContext(), resid));
-        }
-
-        private boolean isOutOfBounds(int x, int y) {
-            return x < -5 || y < -5 || x > (getWidth() + 5) || y > (getHeight() + 5);
-        }
-    }
-}
diff --git a/v7/appcompat/src/android/support/v7/app/AppCompatDelegateImplV9.java b/v7/appcompat/src/android/support/v7/app/AppCompatDelegateImplV9.java
new file mode 100644
index 0000000..c250e01
--- /dev/null
+++ b/v7/appcompat/src/android/support/v7/app/AppCompatDelegateImplV9.java
@@ -0,0 +1,2122 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.support.v7.app;
+
+import android.app.Activity;
+import android.app.Dialog;
+import android.content.Context;
+import android.content.res.Configuration;
+import android.content.res.Resources;
+import android.content.res.TypedArray;
+import android.graphics.PixelFormat;
+import android.graphics.Rect;
+import android.media.AudioManager;
+import android.os.Build;
+import android.os.Bundle;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.support.annotation.IdRes;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.v4.app.NavUtils;
+import android.support.v4.os.ParcelableCompat;
+import android.support.v4.os.ParcelableCompatCreatorCallbacks;
+import android.support.v4.view.LayoutInflaterCompat;
+import android.support.v4.view.LayoutInflaterFactory;
+import android.support.v4.view.OnApplyWindowInsetsListener;
+import android.support.v4.view.ViewCompat;
+import android.support.v4.view.ViewConfigurationCompat;
+import android.support.v4.view.ViewPropertyAnimatorCompat;
+import android.support.v4.view.ViewPropertyAnimatorListenerAdapter;
+import android.support.v4.view.WindowCompat;
+import android.support.v4.view.WindowInsetsCompat;
+import android.support.v4.widget.PopupWindowCompat;
+import android.support.v7.appcompat.R;
+import android.support.v7.view.ActionMode;
+import android.support.v7.view.ContextThemeWrapper;
+import android.support.v7.view.StandaloneActionMode;
+import android.support.v7.view.menu.ListMenuPresenter;
+import android.support.v7.view.menu.MenuBuilder;
+import android.support.v7.view.menu.MenuPresenter;
+import android.support.v7.view.menu.MenuView;
+import android.support.v7.widget.ActionBarContextView;
+import android.support.v7.widget.AppCompatDrawableManager;
+import android.support.v7.widget.ContentFrameLayout;
+import android.support.v7.widget.DecorContentParent;
+import android.support.v7.widget.FitWindowsViewGroup;
+import android.support.v7.widget.Toolbar;
+import android.support.v7.widget.VectorEnabledTintResources;
+import android.support.v7.widget.ViewStubCompat;
+import android.support.v7.widget.ViewUtils;
+import android.text.TextUtils;
+import android.util.AndroidRuntimeException;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.util.TypedValue;
+import android.view.Gravity;
+import android.view.KeyCharacterMap;
+import android.view.KeyEvent;
+import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewConfiguration;
+import android.view.ViewGroup;
+import android.view.ViewParent;
+import android.view.Window;
+import android.view.WindowManager;
+import android.view.accessibility.AccessibilityEvent;
+import android.widget.FrameLayout;
+import android.widget.PopupWindow;
+import android.widget.TextView;
+
+import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
+import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
+import static android.view.Window.FEATURE_OPTIONS_PANEL;
+
+class AppCompatDelegateImplV9 extends AppCompatDelegateImplBase
+        implements MenuBuilder.Callback, LayoutInflaterFactory {
+
+    private DecorContentParent mDecorContentParent;
+    private ActionMenuPresenterCallback mActionMenuPresenterCallback;
+    private PanelMenuPresenterCallback mPanelMenuPresenterCallback;
+
+    ActionMode mActionMode;
+    ActionBarContextView mActionModeView;
+    PopupWindow mActionModePopup;
+    Runnable mShowActionModePopup;
+    ViewPropertyAnimatorCompat mFadeAnim = null;
+
+    // true if we have installed a window sub-decor layout.
+    private boolean mSubDecorInstalled;
+    private ViewGroup mSubDecor;
+
+    private TextView mTitleView;
+    private View mStatusGuard;
+
+    // Used to keep track of Progress Bar Window features
+    private boolean mFeatureProgress, mFeatureIndeterminateProgress;
+
+    // Used for emulating PanelFeatureState
+    private boolean mClosingActionMenu;
+    private PanelFeatureState[] mPanels;
+    private PanelFeatureState mPreparedPanel;
+
+    private boolean mLongPressBackDown;
+
+    private boolean mInvalidatePanelMenuPosted;
+    private int mInvalidatePanelMenuFeatures;
+    private final Runnable mInvalidatePanelMenuRunnable = new Runnable() {
+        @Override
+        public void run() {
+            if ((mInvalidatePanelMenuFeatures & 1 << FEATURE_OPTIONS_PANEL) != 0) {
+                doInvalidatePanelMenu(FEATURE_OPTIONS_PANEL);
+            }
+            if ((mInvalidatePanelMenuFeatures & 1 << FEATURE_SUPPORT_ACTION_BAR) != 0) {
+                doInvalidatePanelMenu(FEATURE_SUPPORT_ACTION_BAR);
+            }
+            mInvalidatePanelMenuPosted = false;
+            mInvalidatePanelMenuFeatures = 0;
+        }
+    };
+
+    private boolean mEnableDefaultActionBarUp;
+
+    private Rect mTempRect1;
+    private Rect mTempRect2;
+
+    private AppCompatViewInflater mAppCompatViewInflater;
+
+    AppCompatDelegateImplV9(Context context, Window window, AppCompatCallback callback) {
+        super(context, window, callback);
+    }
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        if (mOriginalWindowCallback instanceof Activity) {
+            if (NavUtils.getParentActivityName((Activity) mOriginalWindowCallback) != null) {
+                // Peek at the Action Bar and update it if it already exists
+                ActionBar ab = peekSupportActionBar();
+                if (ab == null) {
+                    mEnableDefaultActionBarUp = true;
+                } else {
+                    ab.setDefaultDisplayHomeAsUpEnabled(true);
+                }
+            }
+        }
+    }
+
+    @Override
+    public void onPostCreate(Bundle savedInstanceState) {
+        // Make sure that the sub decor is installed
+        ensureSubDecor();
+    }
+
+    @Override
+    public void initWindowDecorActionBar() {
+        ensureSubDecor();
+
+        if (!mHasActionBar || mActionBar != null) {
+            return;
+        }
+
+        if (mOriginalWindowCallback instanceof Activity) {
+            mActionBar = new WindowDecorActionBar((Activity) mOriginalWindowCallback,
+                    mOverlayActionBar);
+        } else if (mOriginalWindowCallback instanceof Dialog) {
+            mActionBar = new WindowDecorActionBar((Dialog) mOriginalWindowCallback);
+        }
+        if (mActionBar != null) {
+            mActionBar.setDefaultDisplayHomeAsUpEnabled(mEnableDefaultActionBarUp);
+        }
+    }
+
+    @Override
+    public void setSupportActionBar(Toolbar toolbar) {
+        if (!(mOriginalWindowCallback instanceof Activity)) {
+            // Only Activities support custom Action Bars
+            return;
+        }
+
+        final ActionBar ab = getSupportActionBar();
+        if (ab instanceof WindowDecorActionBar) {
+            throw new IllegalStateException("This Activity already has an action bar supplied " +
+                    "by the window decor. Do not request Window.FEATURE_SUPPORT_ACTION_BAR and set " +
+                    "windowActionBar to false in your theme to use a Toolbar instead.");
+        }
+
+        // If we reach here then we're setting a new action bar
+        // First clear out the MenuInflater to make sure that it is valid for the new Action Bar
+        mMenuInflater = null;
+
+        // If we have an action bar currently, destroy it
+        if (ab != null) {
+            ab.onDestroy();
+        }
+
+        if (toolbar != null) {
+            final ToolbarActionBar tbab = new ToolbarActionBar(toolbar,
+                    ((Activity) mContext).getTitle(), mAppCompatWindowCallback);
+            mActionBar = tbab;
+            mWindow.setCallback(tbab.getWrappedWindowCallback());
+        } else {
+            mActionBar = null;
+            // Re-set the original window callback since we may have already set a Toolbar wrapper
+            mWindow.setCallback(mAppCompatWindowCallback);
+        }
+
+        invalidateOptionsMenu();
+    }
+
+    @Nullable
+    @Override
+    public View findViewById(@IdRes int id) {
+        ensureSubDecor();
+        return mWindow.findViewById(id);
+    }
+
+    @Override
+    public void onConfigurationChanged(Configuration newConfig) {
+        // If this is called before sub-decor is installed, ActionBar will not
+        // be properly initialized.
+        if (mHasActionBar && mSubDecorInstalled) {
+            // Note: The action bar will need to access
+            // view changes from superclass.
+            ActionBar ab = getSupportActionBar();
+            if (ab != null) {
+                ab.onConfigurationChanged(newConfig);
+            }
+        }
+
+        // Re-apply Day/Night to the new configuration
+        applyDayNight();
+    }
+
+    @Override
+    public void onStop() {
+        ActionBar ab = getSupportActionBar();
+        if (ab != null) {
+            ab.setShowHideAnimationEnabled(false);
+        }
+    }
+
+    @Override
+    public void onPostResume() {
+        ActionBar ab = getSupportActionBar();
+        if (ab != null) {
+            ab.setShowHideAnimationEnabled(true);
+        }
+    }
+
+    @Override
+    public void setContentView(View v) {
+        ensureSubDecor();
+        ViewGroup contentParent = (ViewGroup) mSubDecor.findViewById(android.R.id.content);
+        contentParent.removeAllViews();
+        contentParent.addView(v);
+        mOriginalWindowCallback.onContentChanged();
+    }
+
+    @Override
+    public void setContentView(int resId) {
+        ensureSubDecor();
+        ViewGroup contentParent = (ViewGroup) mSubDecor.findViewById(android.R.id.content);
+        contentParent.removeAllViews();
+        LayoutInflater.from(mContext).inflate(resId, contentParent);
+        mOriginalWindowCallback.onContentChanged();
+    }
+
+    @Override
+    public void setContentView(View v, ViewGroup.LayoutParams lp) {
+        ensureSubDecor();
+        ViewGroup contentParent = (ViewGroup) mSubDecor.findViewById(android.R.id.content);
+        contentParent.removeAllViews();
+        contentParent.addView(v, lp);
+        mOriginalWindowCallback.onContentChanged();
+    }
+
+    @Override
+    public void addContentView(View v, ViewGroup.LayoutParams lp) {
+        ensureSubDecor();
+        ViewGroup contentParent = (ViewGroup) mSubDecor.findViewById(android.R.id.content);
+        contentParent.addView(v, lp);
+        mOriginalWindowCallback.onContentChanged();
+    }
+
+    @Override
+    public void onDestroy() {
+        super.onDestroy();
+
+        if (mActionBar != null) {
+            mActionBar.onDestroy();
+        }
+    }
+
+    private void ensureSubDecor() {
+        if (!mSubDecorInstalled) {
+            mSubDecor = createSubDecor();
+
+            // If a title was set before we installed the decor, propagate it now
+            CharSequence title = getTitle();
+            if (!TextUtils.isEmpty(title)) {
+                onTitleChanged(title);
+            }
+
+            applyFixedSizeWindow();
+
+            onSubDecorInstalled(mSubDecor);
+
+            mSubDecorInstalled = true;
+
+            // Invalidate if the panel menu hasn't been created before this.
+            // Panel menu invalidation is deferred avoiding application onCreateOptionsMenu
+            // being called in the middle of onCreate or similar.
+            // A pending invalidation will typically be resolved before the posted message
+            // would run normally in order to satisfy instance state restoration.
+            PanelFeatureState st = getPanelState(FEATURE_OPTIONS_PANEL, false);
+            if (!isDestroyed() && (st == null || st.menu == null)) {
+                invalidatePanelMenu(FEATURE_SUPPORT_ACTION_BAR);
+            }
+        }
+    }
+
+    private ViewGroup createSubDecor() {
+        TypedArray a = mContext.obtainStyledAttributes(R.styleable.AppCompatTheme);
+
+        if (!a.hasValue(R.styleable.AppCompatTheme_windowActionBar)) {
+            a.recycle();
+            throw new IllegalStateException(
+                    "You need to use a Theme.AppCompat theme (or descendant) with this activity.");
+        }
+
+        if (a.getBoolean(R.styleable.AppCompatTheme_windowNoTitle, false)) {
+            requestWindowFeature(Window.FEATURE_NO_TITLE);
+        } else if (a.getBoolean(R.styleable.AppCompatTheme_windowActionBar, false)) {
+            // Don't allow an action bar if there is no title.
+            requestWindowFeature(FEATURE_SUPPORT_ACTION_BAR);
+        }
+        if (a.getBoolean(R.styleable.AppCompatTheme_windowActionBarOverlay, false)) {
+            requestWindowFeature(FEATURE_SUPPORT_ACTION_BAR_OVERLAY);
+        }
+        if (a.getBoolean(R.styleable.AppCompatTheme_windowActionModeOverlay, false)) {
+            requestWindowFeature(FEATURE_ACTION_MODE_OVERLAY);
+        }
+        mIsFloating = a.getBoolean(R.styleable.AppCompatTheme_android_windowIsFloating, false);
+        a.recycle();
+
+        // Now let's make sure that the Window has installed its decor by retrieving it
+        mWindow.getDecorView();
+
+        final LayoutInflater inflater = LayoutInflater.from(mContext);
+        ViewGroup subDecor = null;
+
+
+        if (!mWindowNoTitle) {
+            if (mIsFloating) {
+                // If we're floating, inflate the dialog title decor
+                subDecor = (ViewGroup) inflater.inflate(
+                        R.layout.abc_dialog_title_material, null);
+
+                // Floating windows can never have an action bar, reset the flags
+                mHasActionBar = mOverlayActionBar = false;
+            } else if (mHasActionBar) {
+                /**
+                 * This needs some explanation. As we can not use the android:theme attribute
+                 * pre-L, we emulate it by manually creating a LayoutInflater using a
+                 * ContextThemeWrapper pointing to actionBarTheme.
+                 */
+                TypedValue outValue = new TypedValue();
+                mContext.getTheme().resolveAttribute(R.attr.actionBarTheme, outValue, true);
+
+                Context themedContext;
+                if (outValue.resourceId != 0) {
+                    themedContext = new ContextThemeWrapper(mContext, outValue.resourceId);
+                } else {
+                    themedContext = mContext;
+                }
+
+                // Now inflate the view using the themed context and set it as the content view
+                subDecor = (ViewGroup) LayoutInflater.from(themedContext)
+                        .inflate(R.layout.abc_screen_toolbar, null);
+
+                mDecorContentParent = (DecorContentParent) subDecor
+                        .findViewById(R.id.decor_content_parent);
+                mDecorContentParent.setWindowCallback(getWindowCallback());
+
+                /**
+                 * Propagate features to DecorContentParent
+                 */
+                if (mOverlayActionBar) {
+                    mDecorContentParent.initFeature(FEATURE_SUPPORT_ACTION_BAR_OVERLAY);
+                }
+                if (mFeatureProgress) {
+                    mDecorContentParent.initFeature(Window.FEATURE_PROGRESS);
+                }
+                if (mFeatureIndeterminateProgress) {
+                    mDecorContentParent.initFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
+                }
+            }
+        } else {
+            if (mOverlayActionMode) {
+                subDecor = (ViewGroup) inflater.inflate(
+                        R.layout.abc_screen_simple_overlay_action_mode, null);
+            } else {
+                subDecor = (ViewGroup) inflater.inflate(R.layout.abc_screen_simple, null);
+            }
+
+            if (Build.VERSION.SDK_INT >= 21) {
+                // If we're running on L or above, we can rely on ViewCompat's
+                // setOnApplyWindowInsetsListener
+                ViewCompat.setOnApplyWindowInsetsListener(subDecor,
+                        new OnApplyWindowInsetsListener() {
+                            @Override
+                            public WindowInsetsCompat onApplyWindowInsets(View v,
+                                    WindowInsetsCompat insets) {
+                                final int top = insets.getSystemWindowInsetTop();
+                                final int newTop = updateStatusGuard(top);
+
+                                if (top != newTop) {
+                                    insets = insets.replaceSystemWindowInsets(
+                                            insets.getSystemWindowInsetLeft(),
+                                            newTop,
+                                            insets.getSystemWindowInsetRight(),
+                                            insets.getSystemWindowInsetBottom());
+                                }
+
+                                // Now apply the insets on our view
+                                return ViewCompat.onApplyWindowInsets(v, insets);
+                            }
+                        });
+            } else {
+                // Else, we need to use our own FitWindowsViewGroup handling
+                ((FitWindowsViewGroup) subDecor).setOnFitSystemWindowsListener(
+                        new FitWindowsViewGroup.OnFitSystemWindowsListener() {
+                            @Override
+                            public void onFitSystemWindows(Rect insets) {
+                                insets.top = updateStatusGuard(insets.top);
+                            }
+                        });
+            }
+        }
+
+        if (subDecor == null) {
+            throw new IllegalArgumentException(
+                    "AppCompat does not support the current theme features: { "
+                            + "windowActionBar: " + mHasActionBar
+                            + ", windowActionBarOverlay: "+ mOverlayActionBar
+                            + ", android:windowIsFloating: " + mIsFloating
+                            + ", windowActionModeOverlay: " + mOverlayActionMode
+                            + ", windowNoTitle: " + mWindowNoTitle
+                            + " }");
+        }
+
+        if (mDecorContentParent == null) {
+            mTitleView = (TextView) subDecor.findViewById(R.id.title);
+        }
+
+        // Make the decor optionally fit system windows, like the window's decor
+        ViewUtils.makeOptionalFitsSystemWindows(subDecor);
+
+        final ContentFrameLayout contentView = (ContentFrameLayout) subDecor.findViewById(
+                R.id.action_bar_activity_content);
+
+        final ViewGroup windowContentView = (ViewGroup) mWindow.findViewById(android.R.id.content);
+        if (windowContentView != null) {
+            // There might be Views already added to the Window's content view so we need to
+            // migrate them to our content view
+            while (windowContentView.getChildCount() > 0) {
+                final View child = windowContentView.getChildAt(0);
+                windowContentView.removeViewAt(0);
+                contentView.addView(child);
+            }
+
+            // Change our content FrameLayout to use the android.R.id.content id.
+            // Useful for fragments.
+            windowContentView.setId(View.NO_ID);
+            contentView.setId(android.R.id.content);
+
+            // The decorContent may have a foreground drawable set (windowContentOverlay).
+            // Remove this as we handle it ourselves
+            if (windowContentView instanceof FrameLayout) {
+                ((FrameLayout) windowContentView).setForeground(null);
+            }
+        }
+
+        // Now set the Window's content view with the decor
+        mWindow.setContentView(subDecor);
+
+        contentView.setAttachListener(new ContentFrameLayout.OnAttachListener() {
+            @Override
+            public void onAttachedFromWindow() {}
+
+            @Override
+            public void onDetachedFromWindow() {
+                dismissPopups();
+            }
+        });
+
+        return subDecor;
+    }
+
+    void onSubDecorInstalled(ViewGroup subDecor) {}
+
+    private void applyFixedSizeWindow() {
+        ContentFrameLayout cfl = (ContentFrameLayout) mSubDecor.findViewById(android.R.id.content);
+
+        // This is a bit weird. In the framework, the window sizing attributes control
+        // the decor view's size, meaning that any padding is inset for the min/max widths below.
+        // We don't control measurement at that level, so we need to workaround it by making sure
+        // that the decor view's padding is taken into account.
+        final View windowDecor = mWindow.getDecorView();
+        cfl.setDecorPadding(windowDecor.getPaddingLeft(),
+                windowDecor.getPaddingTop(), windowDecor.getPaddingRight(),
+                windowDecor.getPaddingBottom());
+
+        TypedArray a = mContext.obtainStyledAttributes(R.styleable.AppCompatTheme);
+        a.getValue(R.styleable.AppCompatTheme_windowMinWidthMajor, cfl.getMinWidthMajor());
+        a.getValue(R.styleable.AppCompatTheme_windowMinWidthMinor, cfl.getMinWidthMinor());
+
+        if (a.hasValue(R.styleable.AppCompatTheme_windowFixedWidthMajor)) {
+            a.getValue(R.styleable.AppCompatTheme_windowFixedWidthMajor,
+                    cfl.getFixedWidthMajor());
+        }
+        if (a.hasValue(R.styleable.AppCompatTheme_windowFixedWidthMinor)) {
+            a.getValue(R.styleable.AppCompatTheme_windowFixedWidthMinor,
+                    cfl.getFixedWidthMinor());
+        }
+        if (a.hasValue(R.styleable.AppCompatTheme_windowFixedHeightMajor)) {
+            a.getValue(R.styleable.AppCompatTheme_windowFixedHeightMajor,
+                    cfl.getFixedHeightMajor());
+        }
+        if (a.hasValue(R.styleable.AppCompatTheme_windowFixedHeightMinor)) {
+            a.getValue(R.styleable.AppCompatTheme_windowFixedHeightMinor,
+                    cfl.getFixedHeightMinor());
+        }
+        a.recycle();
+
+        cfl.requestLayout();
+    }
+
+    @Override
+    public boolean requestWindowFeature(int featureId) {
+        featureId = sanitizeWindowFeatureId(featureId);
+
+        if (mWindowNoTitle && featureId == FEATURE_SUPPORT_ACTION_BAR) {
+            return false; // Ignore. No title dominates.
+        }
+        if (mHasActionBar && featureId == Window.FEATURE_NO_TITLE) {
+            // Remove the action bar feature if we have no title. No title dominates.
+            mHasActionBar = false;
+        }
+
+        switch (featureId) {
+            case FEATURE_SUPPORT_ACTION_BAR:
+                throwFeatureRequestIfSubDecorInstalled();
+                mHasActionBar = true;
+                return true;
+            case FEATURE_SUPPORT_ACTION_BAR_OVERLAY:
+                throwFeatureRequestIfSubDecorInstalled();
+                mOverlayActionBar = true;
+                return true;
+            case FEATURE_ACTION_MODE_OVERLAY:
+                throwFeatureRequestIfSubDecorInstalled();
+                mOverlayActionMode = true;
+                return true;
+            case Window.FEATURE_PROGRESS:
+                throwFeatureRequestIfSubDecorInstalled();
+                mFeatureProgress = true;
+                return true;
+            case Window.FEATURE_INDETERMINATE_PROGRESS:
+                throwFeatureRequestIfSubDecorInstalled();
+                mFeatureIndeterminateProgress = true;
+                return true;
+            case Window.FEATURE_NO_TITLE:
+                throwFeatureRequestIfSubDecorInstalled();
+                mWindowNoTitle = true;
+                return true;
+        }
+
+        return mWindow.requestFeature(featureId);
+    }
+
+    @Override
+    public boolean hasWindowFeature(int featureId) {
+        featureId = sanitizeWindowFeatureId(featureId);
+        switch (featureId) {
+            case FEATURE_SUPPORT_ACTION_BAR:
+                return mHasActionBar;
+            case FEATURE_SUPPORT_ACTION_BAR_OVERLAY:
+                return mOverlayActionBar;
+            case FEATURE_ACTION_MODE_OVERLAY:
+                return mOverlayActionMode;
+            case Window.FEATURE_PROGRESS:
+                return mFeatureProgress;
+            case Window.FEATURE_INDETERMINATE_PROGRESS:
+                return mFeatureIndeterminateProgress;
+            case Window.FEATURE_NO_TITLE:
+                return mWindowNoTitle;
+        }
+        return mWindow.hasFeature(featureId);
+    }
+
+    @Override
+    void onTitleChanged(CharSequence title) {
+        if (mDecorContentParent != null) {
+            mDecorContentParent.setWindowTitle(title);
+        } else if (peekSupportActionBar() != null) {
+            peekSupportActionBar().setWindowTitle(title);
+        } else if (mTitleView != null) {
+            mTitleView.setText(title);
+        }
+    }
+
+    @Override
+    void onPanelClosed(final int featureId, Menu menu) {
+        if (featureId == FEATURE_SUPPORT_ACTION_BAR) {
+            ActionBar ab = getSupportActionBar();
+            if (ab != null) {
+                ab.dispatchMenuVisibilityChanged(false);
+            }
+        } else if (featureId == FEATURE_OPTIONS_PANEL) {
+            // Make sure that the options panel is closed. This is mainly used when we're using a
+            // ToolbarActionBar
+            PanelFeatureState st = getPanelState(featureId, true);
+            if (st.isOpen) {
+                closePanel(st, false);
+            }
+        }
+    }
+
+    @Override
+    boolean onMenuOpened(final int featureId, Menu menu) {
+        if (featureId == FEATURE_SUPPORT_ACTION_BAR) {
+            ActionBar ab = getSupportActionBar();
+            if (ab != null) {
+                ab.dispatchMenuVisibilityChanged(true);
+            }
+            return true;
+        }
+        return false;
+    }
+
+    @Override
+    public boolean onMenuItemSelected(MenuBuilder menu, MenuItem item) {
+        final Window.Callback cb = getWindowCallback();
+        if (cb != null && !isDestroyed()) {
+            final PanelFeatureState panel = findMenuPanel(menu.getRootMenu());
+            if (panel != null) {
+                return cb.onMenuItemSelected(panel.featureId, item);
+            }
+        }
+        return false;
+    }
+
+    @Override
+    public void onMenuModeChange(MenuBuilder menu) {
+        reopenMenu(menu, true);
+    }
+
+    @Override
+    public ActionMode startSupportActionMode(@NonNull final ActionMode.Callback callback) {
+        if (callback == null) {
+            throw new IllegalArgumentException("ActionMode callback can not be null.");
+        }
+
+        if (mActionMode != null) {
+            mActionMode.finish();
+        }
+
+        final ActionMode.Callback wrappedCallback = new ActionModeCallbackWrapperV9(callback);
+
+        ActionBar ab = getSupportActionBar();
+        if (ab != null) {
+            mActionMode = ab.startActionMode(wrappedCallback);
+            if (mActionMode != null && mAppCompatCallback != null) {
+                mAppCompatCallback.onSupportActionModeStarted(mActionMode);
+            }
+        }
+
+        if (mActionMode == null) {
+            // If the action bar didn't provide an action mode, start the emulated window one
+            mActionMode = startSupportActionModeFromWindow(wrappedCallback);
+        }
+
+        return mActionMode;
+    }
+
+    @Override
+    public void invalidateOptionsMenu() {
+        final ActionBar ab = getSupportActionBar();
+        if (ab != null && ab.invalidateOptionsMenu()) return;
+
+        invalidatePanelMenu(FEATURE_OPTIONS_PANEL);
+    }
+
+    @Override
+    ActionMode startSupportActionModeFromWindow(@NonNull ActionMode.Callback callback) {
+        endOnGoingFadeAnimation();
+        if (mActionMode != null) {
+            mActionMode.finish();
+        }
+
+        if (!(callback instanceof ActionModeCallbackWrapperV9)) {
+            // If the callback hasn't been wrapped yet, wrap it
+            callback = new ActionModeCallbackWrapperV9(callback);
+        }
+
+        ActionMode mode = null;
+        if (mAppCompatCallback != null && !isDestroyed()) {
+            try {
+                mode = mAppCompatCallback.onWindowStartingSupportActionMode(callback);
+            } catch (AbstractMethodError ame) {
+                // Older apps might not implement this callback method.
+            }
+        }
+
+        if (mode != null) {
+            mActionMode = mode;
+        } else {
+            if (mActionModeView == null) {
+                if (mIsFloating) {
+                    // Use the action bar theme.
+                    final TypedValue outValue = new TypedValue();
+                    final Resources.Theme baseTheme = mContext.getTheme();
+                    baseTheme.resolveAttribute(R.attr.actionBarTheme, outValue, true);
+
+                    final Context actionBarContext;
+                    if (outValue.resourceId != 0) {
+                        final Resources.Theme actionBarTheme = mContext.getResources().newTheme();
+                        actionBarTheme.setTo(baseTheme);
+                        actionBarTheme.applyStyle(outValue.resourceId, true);
+
+                        actionBarContext = new ContextThemeWrapper(mContext, 0);
+                        actionBarContext.getTheme().setTo(actionBarTheme);
+                    } else {
+                        actionBarContext = mContext;
+                    }
+
+                    mActionModeView = new ActionBarContextView(actionBarContext);
+                    mActionModePopup = new PopupWindow(actionBarContext, null,
+                            R.attr.actionModePopupWindowStyle);
+                    PopupWindowCompat.setWindowLayoutType(mActionModePopup,
+                            WindowManager.LayoutParams.TYPE_APPLICATION);
+                    mActionModePopup.setContentView(mActionModeView);
+                    mActionModePopup.setWidth(ViewGroup.LayoutParams.MATCH_PARENT);
+
+                    actionBarContext.getTheme().resolveAttribute(
+                            R.attr.actionBarSize, outValue, true);
+                    final int height = TypedValue.complexToDimensionPixelSize(outValue.data,
+                            actionBarContext.getResources().getDisplayMetrics());
+                    mActionModeView.setContentHeight(height);
+                    mActionModePopup.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
+                    mShowActionModePopup = new Runnable() {
+                        @Override
+                        public void run() {
+                            mActionModePopup.showAtLocation(
+                                    mActionModeView,
+                                    Gravity.TOP | Gravity.FILL_HORIZONTAL, 0, 0);
+                            endOnGoingFadeAnimation();
+
+                            if (shouldAnimateActionModeView()) {
+                                ViewCompat.setAlpha(mActionModeView, 0f);
+                                mFadeAnim = ViewCompat.animate(mActionModeView).alpha(1f);
+                                mFadeAnim.setListener(new ViewPropertyAnimatorListenerAdapter() {
+                                    @Override
+                                    public void onAnimationStart(View view) {
+                                        mActionModeView.setVisibility(View.VISIBLE);
+                                    }
+
+                                    @Override
+                                    public void onAnimationEnd(View view) {
+                                        ViewCompat.setAlpha(mActionModeView, 1f);
+                                        mFadeAnim.setListener(null);
+                                        mFadeAnim = null;
+                                    }
+                                });
+                            } else {
+                                ViewCompat.setAlpha(mActionModeView, 1f);
+                                mActionModeView.setVisibility(View.VISIBLE);
+                            }
+                        }
+                    };
+                } else {
+                    ViewStubCompat stub = (ViewStubCompat) mSubDecor
+                            .findViewById(R.id.action_mode_bar_stub);
+                    if (stub != null) {
+                        // Set the layout inflater so that it is inflated with the action bar's context
+                        stub.setLayoutInflater(LayoutInflater.from(getActionBarThemedContext()));
+                        mActionModeView = (ActionBarContextView) stub.inflate();
+                    }
+                }
+            }
+
+            if (mActionModeView != null) {
+                endOnGoingFadeAnimation();
+                mActionModeView.killMode();
+                mode = new StandaloneActionMode(mActionModeView.getContext(), mActionModeView,
+                        callback, mActionModePopup == null);
+                if (callback.onCreateActionMode(mode, mode.getMenu())) {
+                    mode.invalidate();
+                    mActionModeView.initForMode(mode);
+                    mActionMode = mode;
+
+                    if (shouldAnimateActionModeView()) {
+                        ViewCompat.setAlpha(mActionModeView, 0f);
+                        mFadeAnim = ViewCompat.animate(mActionModeView).alpha(1f);
+                        mFadeAnim.setListener(new ViewPropertyAnimatorListenerAdapter() {
+                            @Override
+                            public void onAnimationStart(View view) {
+                                mActionModeView.setVisibility(View.VISIBLE);
+                                mActionModeView.sendAccessibilityEvent(
+                                        AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
+                                if (mActionModeView.getParent() != null) {
+                                    ViewCompat.requestApplyInsets((View) mActionModeView.getParent());
+                                }
+                            }
+
+                            @Override
+                            public void onAnimationEnd(View view) {
+                                ViewCompat.setAlpha(mActionModeView, 1f);
+                                mFadeAnim.setListener(null);
+                                mFadeAnim = null;
+                            }
+                        });
+                    } else {
+                        ViewCompat.setAlpha(mActionModeView, 1f);
+                        mActionModeView.setVisibility(View.VISIBLE);
+                        mActionModeView.sendAccessibilityEvent(
+                                AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
+                        if (mActionModeView.getParent() != null) {
+                            ViewCompat.requestApplyInsets((View) mActionModeView.getParent());
+                        }
+                    }
+
+                    if (mActionModePopup != null) {
+                        mWindow.getDecorView().post(mShowActionModePopup);
+                    }
+                } else {
+                    mActionMode = null;
+                }
+            }
+        }
+        if (mActionMode != null && mAppCompatCallback != null) {
+            mAppCompatCallback.onSupportActionModeStarted(mActionMode);
+        }
+        return mActionMode;
+    }
+
+    final boolean shouldAnimateActionModeView() {
+        // We only to animate the action mode in if the sub decor has already been laid out.
+        // If it hasn't been laid out, it hasn't been drawn to screen yet.
+        return mSubDecorInstalled && mSubDecor != null && ViewCompat.isLaidOut(mSubDecor);
+    }
+
+    private void endOnGoingFadeAnimation() {
+        if (mFadeAnim != null) {
+            mFadeAnim.cancel();
+        }
+    }
+
+    boolean onBackPressed() {
+        // Back cancels action modes first.
+        if (mActionMode != null) {
+            mActionMode.finish();
+            return true;
+        }
+
+        // Next collapse any expanded action views.
+        ActionBar ab = getSupportActionBar();
+        if (ab != null && ab.collapseActionView()) {
+            return true;
+        }
+
+        // Let the call through...
+        return false;
+    }
+
+    @Override
+    boolean onKeyShortcut(int keyCode, KeyEvent ev) {
+        // Let the Action Bar have a chance at handling the shortcut
+        ActionBar ab = getSupportActionBar();
+        if (ab != null && ab.onKeyShortcut(keyCode, ev)) {
+            return true;
+        }
+
+        // If the panel is already prepared, then perform the shortcut using it.
+        boolean handled;
+        if (mPreparedPanel != null) {
+            handled = performPanelShortcut(mPreparedPanel, ev.getKeyCode(), ev,
+                    Menu.FLAG_PERFORM_NO_CLOSE);
+            if (handled) {
+                if (mPreparedPanel != null) {
+                    mPreparedPanel.isHandled = true;
+                }
+                return true;
+            }
+        }
+
+        // If the panel is not prepared, then we may be trying to handle a shortcut key
+        // combination such as Control+C.  Temporarily prepare the panel then mark it
+        // unprepared again when finished to ensure that the panel will again be prepared
+        // the next time it is shown for real.
+        if (mPreparedPanel == null) {
+            PanelFeatureState st = getPanelState(FEATURE_OPTIONS_PANEL, true);
+            preparePanel(st, ev);
+            handled = performPanelShortcut(st, ev.getKeyCode(), ev, Menu.FLAG_PERFORM_NO_CLOSE);
+            st.isPrepared = false;
+            if (handled) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    @Override
+    boolean dispatchKeyEvent(KeyEvent event) {
+        if (event.getKeyCode() == KeyEvent.KEYCODE_MENU) {
+            // If this is a MENU event, let the Activity have a go.
+            if (mOriginalWindowCallback.dispatchKeyEvent(event)) {
+                return true;
+            }
+        }
+
+        final int keyCode = event.getKeyCode();
+        final int action = event.getAction();
+        final boolean isDown = action == KeyEvent.ACTION_DOWN;
+
+        return isDown ? onKeyDown(keyCode, event) : onKeyUp(keyCode, event);
+    }
+
+    boolean onKeyUp(int keyCode, KeyEvent event) {
+        switch (keyCode) {
+            case KeyEvent.KEYCODE_MENU:
+                onKeyUpPanel(Window.FEATURE_OPTIONS_PANEL, event);
+                return true;
+            case KeyEvent.KEYCODE_BACK:
+                final boolean wasLongPressBackDown = mLongPressBackDown;
+                mLongPressBackDown = false;
+
+                PanelFeatureState st = getPanelState(Window.FEATURE_OPTIONS_PANEL, false);
+                if (st != null && st.isOpen) {
+                    if (!wasLongPressBackDown) {
+                        // Certain devices allow opening the options menu via a long press of the
+                        // back button. We should only close the open options menu if it wasn't
+                        // opened via a long press gesture.
+                        closePanel(st, true);
+                    }
+                    return true;
+                }
+                if (onBackPressed()) {
+                    return true;
+                }
+                break;
+        }
+        return false;
+    }
+
+    boolean onKeyDown(int keyCode, KeyEvent event) {
+        switch (keyCode) {
+            case KeyEvent.KEYCODE_MENU:
+                onKeyDownPanel(Window.FEATURE_OPTIONS_PANEL, event);
+                // We need to return true here and not let it bubble up to the Window.
+                // For empty menus, PhoneWindow's KEYCODE_BACK handling will steals all events,
+                // not allowing the Activity to call onBackPressed().
+                return true;
+            case KeyEvent.KEYCODE_BACK:
+                // Certain devices allow opening the options menu via a long press of the back
+                // button. We keep a record of whether the last event is from a long press.
+                mLongPressBackDown = (event.getFlags() & KeyEvent.FLAG_LONG_PRESS) != 0;
+                break;
+        }
+
+        // On API v7-10 we need to manually call onKeyShortcut() as this is not called
+        // from the Activity
+        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
+            // We do not return true here otherwise dispatchKeyEvent will not reach the Activity
+            // (which results in the back button not working)
+            onKeyShortcut(keyCode, event);
+        }
+        return false;
+    }
+
+    @Override
+    public View createView(View parent, final String name, @NonNull Context context,
+            @NonNull AttributeSet attrs) {
+        final boolean isPre21 = Build.VERSION.SDK_INT < 21;
+
+        if (mAppCompatViewInflater == null) {
+            mAppCompatViewInflater = new AppCompatViewInflater();
+        }
+
+        // We only want the View to inherit its context if we're running pre-v21
+        final boolean inheritContext = isPre21 && shouldInheritContext((ViewParent) parent);
+
+        return mAppCompatViewInflater.createView(parent, name, context, attrs, inheritContext,
+                isPre21, /* Only read android:theme pre-L (L+ handles this anyway) */
+                true, /* Read read app:theme as a fallback at all times for legacy reasons */
+                VectorEnabledTintResources.shouldBeUsed() /* Only tint wrap the context if enabled */
+        );
+    }
+
+    private boolean shouldInheritContext(ViewParent parent) {
+        if (parent == null) {
+            // The initial parent is null so just return false
+            return false;
+        }
+        final View windowDecor = mWindow.getDecorView();
+        while (true) {
+            if (parent == null) {
+                // Bingo. We've hit a view which has a null parent before being terminated from
+                // the loop. This is (most probably) because it's the root view in an inflation
+                // call, therefore we should inherit. This works as the inflated layout is only
+                // added to the hierarchy at the end of the inflate() call.
+                return true;
+            } else if (parent == windowDecor || !(parent instanceof View)
+                    || ViewCompat.isAttachedToWindow((View) parent)) {
+                // We have either hit the window's decor view, a parent which isn't a View
+                // (i.e. ViewRootImpl), or an attached view, so we know that the original parent
+                // is currently added to the view hierarchy. This means that it has not be
+                // inflated in the current inflate() call and we should not inherit the context.
+                return false;
+            }
+            parent = parent.getParent();
+        }
+    }
+
+    @Override
+    public void installViewFactory() {
+        LayoutInflater layoutInflater = LayoutInflater.from(mContext);
+        if (layoutInflater.getFactory() == null) {
+            LayoutInflaterCompat.setFactory(layoutInflater, this);
+        } else {
+            if (!(LayoutInflaterCompat.getFactory(layoutInflater)
+                    instanceof AppCompatDelegateImplV9)) {
+                Log.i(TAG, "The Activity's LayoutInflater already has a Factory installed"
+                        + " so we can not install AppCompat's");
+            }
+        }
+    }
+
+    /**
+     * From {@link android.support.v4.view.LayoutInflaterFactory}
+     */
+    @Override
+    public final View onCreateView(View parent, String name,
+            Context context, AttributeSet attrs) {
+        // First let the Activity's Factory try and inflate the view
+        final View view = callActivityOnCreateView(parent, name, context, attrs);
+        if (view != null) {
+            return view;
+        }
+
+        // If the Factory didn't handle it, let our createView() method try
+        return createView(parent, name, context, attrs);
+    }
+
+    View callActivityOnCreateView(View parent, String name, Context context, AttributeSet attrs) {
+        // Let the Activity's LayoutInflater.Factory try and handle it
+        if (mOriginalWindowCallback instanceof LayoutInflater.Factory) {
+            final View result = ((LayoutInflater.Factory) mOriginalWindowCallback)
+                    .onCreateView(name, context, attrs);
+            if (result != null) {
+                return result;
+            }
+        }
+        return null;
+    }
+
+    private void openPanel(final PanelFeatureState st, KeyEvent event) {
+        // Already open, return
+        if (st.isOpen || isDestroyed()) {
+            return;
+        }
+
+        // Don't open an options panel for honeycomb apps on xlarge devices.
+        // (The app should be using an action bar for menu items.)
+        if (st.featureId == FEATURE_OPTIONS_PANEL) {
+            Context context = mContext;
+            Configuration config = context.getResources().getConfiguration();
+            boolean isXLarge = (config.screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) ==
+                    Configuration.SCREENLAYOUT_SIZE_XLARGE;
+            boolean isHoneycombApp = context.getApplicationInfo().targetSdkVersion >=
+                    android.os.Build.VERSION_CODES.HONEYCOMB;
+
+            if (isXLarge && isHoneycombApp) {
+                return;
+            }
+        }
+
+        Window.Callback cb = getWindowCallback();
+        if ((cb != null) && (!cb.onMenuOpened(st.featureId, st.menu))) {
+            // Callback doesn't want the menu to open, reset any state
+            closePanel(st, true);
+            return;
+        }
+
+        final WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
+        if (wm == null) {
+            return;
+        }
+
+        // Prepare panel (should have been done before, but just in case)
+        if (!preparePanel(st, event)) {
+            return;
+        }
+
+        int width = WRAP_CONTENT;
+        if (st.decorView == null || st.refreshDecorView) {
+            if (st.decorView == null) {
+                // Initialize the panel decor, this will populate st.decorView
+                if (!initializePanelDecor(st) || (st.decorView == null))
+                    return;
+            } else if (st.refreshDecorView && (st.decorView.getChildCount() > 0)) {
+                // Decor needs refreshing, so remove its views
+                st.decorView.removeAllViews();
+            }
+
+            // This will populate st.shownPanelView
+            if (!initializePanelContent(st) || !st.hasPanelItems()) {
+                return;
+            }
+
+            ViewGroup.LayoutParams lp = st.shownPanelView.getLayoutParams();
+            if (lp == null) {
+                lp = new ViewGroup.LayoutParams(WRAP_CONTENT, WRAP_CONTENT);
+            }
+
+            int backgroundResId = st.background;
+            st.decorView.setBackgroundResource(backgroundResId);
+
+            ViewParent shownPanelParent = st.shownPanelView.getParent();
+            if (shownPanelParent != null && shownPanelParent instanceof ViewGroup) {
+                ((ViewGroup) shownPanelParent).removeView(st.shownPanelView);
+            }
+            st.decorView.addView(st.shownPanelView, lp);
+
+            /*
+             * Give focus to the view, if it or one of its children does not
+             * already have it.
+             */
+            if (!st.shownPanelView.hasFocus()) {
+                st.shownPanelView.requestFocus();
+            }
+        } else if (st.createdPanelView != null) {
+            // If we already had a panel view, carry width=MATCH_PARENT through
+            // as we did above when it was created.
+            ViewGroup.LayoutParams lp = st.createdPanelView.getLayoutParams();
+            if (lp != null && lp.width == ViewGroup.LayoutParams.MATCH_PARENT) {
+                width = MATCH_PARENT;
+            }
+        }
+
+        st.isHandled = false;
+
+        WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
+                width, WRAP_CONTENT,
+                st.x, st.y, WindowManager.LayoutParams.TYPE_APPLICATION_SUB_PANEL,
+                WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM
+                        | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH,
+                PixelFormat.TRANSLUCENT);
+
+        lp.gravity = st.gravity;
+        lp.windowAnimations = st.windowAnimations;
+
+        wm.addView(st.decorView, lp);
+        st.isOpen = true;
+    }
+
+    private boolean initializePanelDecor(PanelFeatureState st) {
+        st.setStyle(getActionBarThemedContext());
+        st.decorView = new ListMenuDecorView(st.listPresenterContext);
+        st.gravity = Gravity.CENTER | Gravity.BOTTOM;
+        return true;
+    }
+
+    private void reopenMenu(MenuBuilder menu, boolean toggleMenuMode) {
+        if (mDecorContentParent != null && mDecorContentParent.canShowOverflowMenu() &&
+                (!ViewConfigurationCompat.hasPermanentMenuKey(ViewConfiguration.get(mContext)) ||
+                        mDecorContentParent.isOverflowMenuShowPending())) {
+
+            final Window.Callback cb = getWindowCallback();
+
+            if (!mDecorContentParent.isOverflowMenuShowing() || !toggleMenuMode) {
+                if (cb != null && !isDestroyed()) {
+                    // If we have a menu invalidation pending, do it now.
+                    if (mInvalidatePanelMenuPosted &&
+                            (mInvalidatePanelMenuFeatures & (1 << FEATURE_OPTIONS_PANEL)) != 0) {
+                        mWindow.getDecorView().removeCallbacks(mInvalidatePanelMenuRunnable);
+                        mInvalidatePanelMenuRunnable.run();
+                    }
+
+                    final PanelFeatureState st = getPanelState(FEATURE_OPTIONS_PANEL, true);
+
+                    // If we don't have a menu or we're waiting for a full content refresh,
+                    // forget it. This is a lingering event that no longer matters.
+                    if (st.menu != null && !st.refreshMenuContent &&
+                            cb.onPreparePanel(FEATURE_OPTIONS_PANEL, st.createdPanelView, st.menu)) {
+                        cb.onMenuOpened(FEATURE_SUPPORT_ACTION_BAR, st.menu);
+                        mDecorContentParent.showOverflowMenu();
+                    }
+                }
+            } else {
+                mDecorContentParent.hideOverflowMenu();
+                if (!isDestroyed()) {
+                    final PanelFeatureState st = getPanelState(FEATURE_OPTIONS_PANEL, true);
+                    cb.onPanelClosed(FEATURE_SUPPORT_ACTION_BAR, st.menu);
+                }
+            }
+            return;
+        }
+
+        PanelFeatureState st = getPanelState(FEATURE_OPTIONS_PANEL, true);
+
+        st.refreshDecorView = true;
+        closePanel(st, false);
+
+        openPanel(st, null);
+    }
+
+    private boolean initializePanelMenu(final PanelFeatureState st) {
+        Context context = mContext;
+
+        // If we have an action bar, initialize the menu with the right theme.
+        if ((st.featureId == FEATURE_OPTIONS_PANEL || st.featureId == FEATURE_SUPPORT_ACTION_BAR) &&
+                mDecorContentParent != null) {
+            final TypedValue outValue = new TypedValue();
+            final Resources.Theme baseTheme = context.getTheme();
+            baseTheme.resolveAttribute(R.attr.actionBarTheme, outValue, true);
+
+            Resources.Theme widgetTheme = null;
+            if (outValue.resourceId != 0) {
+                widgetTheme = context.getResources().newTheme();
+                widgetTheme.setTo(baseTheme);
+                widgetTheme.applyStyle(outValue.resourceId, true);
+                widgetTheme.resolveAttribute(
+                        R.attr.actionBarWidgetTheme, outValue, true);
+            } else {
+                baseTheme.resolveAttribute(
+                        R.attr.actionBarWidgetTheme, outValue, true);
+            }
+
+            if (outValue.resourceId != 0) {
+                if (widgetTheme == null) {
+                    widgetTheme = context.getResources().newTheme();
+                    widgetTheme.setTo(baseTheme);
+                }
+                widgetTheme.applyStyle(outValue.resourceId, true);
+            }
+
+            if (widgetTheme != null) {
+                context = new ContextThemeWrapper(context, 0);
+                context.getTheme().setTo(widgetTheme);
+            }
+        }
+
+        final MenuBuilder menu = new MenuBuilder(context);
+        menu.setCallback(this);
+        st.setMenu(menu);
+
+        return true;
+    }
+
+    private boolean initializePanelContent(PanelFeatureState st) {
+        if (st.createdPanelView != null) {
+            st.shownPanelView = st.createdPanelView;
+            return true;
+        }
+
+        if (st.menu == null) {
+            return false;
+        }
+
+        if (mPanelMenuPresenterCallback == null) {
+            mPanelMenuPresenterCallback = new PanelMenuPresenterCallback();
+        }
+
+        MenuView menuView = st.getListMenuView(mPanelMenuPresenterCallback);
+
+        st.shownPanelView = (View) menuView;
+
+        return st.shownPanelView != null;
+    }
+
+    private boolean preparePanel(PanelFeatureState st, KeyEvent event) {
+        if (isDestroyed()) {
+            return false;
+        }
+
+        // Already prepared (isPrepared will be reset to false later)
+        if (st.isPrepared) {
+            return true;
+        }
+
+        if ((mPreparedPanel != null) && (mPreparedPanel != st)) {
+            // Another Panel is prepared and possibly open, so close it
+            closePanel(mPreparedPanel, false);
+        }
+
+        final Window.Callback cb = getWindowCallback();
+
+        if (cb != null) {
+            st.createdPanelView = cb.onCreatePanelView(st.featureId);
+        }
+
+        final boolean isActionBarMenu =
+                (st.featureId == FEATURE_OPTIONS_PANEL || st.featureId == FEATURE_SUPPORT_ACTION_BAR);
+
+        if (isActionBarMenu && mDecorContentParent != null) {
+            // Enforce ordering guarantees around events so that the action bar never
+            // dispatches menu-related events before the panel is prepared.
+            mDecorContentParent.setMenuPrepared();
+        }
+
+        if (st.createdPanelView == null &&
+                (!isActionBarMenu || !(peekSupportActionBar() instanceof ToolbarActionBar))) {
+            // Since ToolbarActionBar handles the list options menu itself, we only want to
+            // init this menu panel if we're not using a TAB.
+            if (st.menu == null || st.refreshMenuContent) {
+                if (st.menu == null) {
+                    if (!initializePanelMenu(st) || (st.menu == null)) {
+                        return false;
+                    }
+                }
+
+                if (isActionBarMenu && mDecorContentParent != null) {
+                    if (mActionMenuPresenterCallback == null) {
+                        mActionMenuPresenterCallback = new ActionMenuPresenterCallback();
+                    }
+                    mDecorContentParent.setMenu(st.menu, mActionMenuPresenterCallback);
+                }
+
+                // Creating the panel menu will involve a lot of manipulation;
+                // don't dispatch change events to presenters until we're done.
+                st.menu.stopDispatchingItemsChanged();
+                if (!cb.onCreatePanelMenu(st.featureId, st.menu)) {
+                    // Ditch the menu created above
+                    st.setMenu(null);
+
+                    if (isActionBarMenu && mDecorContentParent != null) {
+                        // Don't show it in the action bar either
+                        mDecorContentParent.setMenu(null, mActionMenuPresenterCallback);
+                    }
+
+                    return false;
+                }
+
+                st.refreshMenuContent = false;
+            }
+
+            // Preparing the panel menu can involve a lot of manipulation;
+            // don't dispatch change events to presenters until we're done.
+            st.menu.stopDispatchingItemsChanged();
+
+            // Restore action view state before we prepare. This gives apps
+            // an opportunity to override frozen/restored state in onPrepare.
+            if (st.frozenActionViewState != null) {
+                st.menu.restoreActionViewStates(st.frozenActionViewState);
+                st.frozenActionViewState = null;
+            }
+
+            // Callback and return if the callback does not want to show the menu
+            if (!cb.onPreparePanel(FEATURE_OPTIONS_PANEL, st.createdPanelView, st.menu)) {
+                if (isActionBarMenu && mDecorContentParent != null) {
+                    // The app didn't want to show the menu for now but it still exists.
+                    // Clear it out of the action bar.
+                    mDecorContentParent.setMenu(null, mActionMenuPresenterCallback);
+                }
+                st.menu.startDispatchingItemsChanged();
+                return false;
+            }
+
+            // Set the proper keymap
+            KeyCharacterMap kmap = KeyCharacterMap.load(
+                    event != null ? event.getDeviceId() : KeyCharacterMap.VIRTUAL_KEYBOARD);
+            st.qwertyMode = kmap.getKeyboardType() != KeyCharacterMap.NUMERIC;
+            st.menu.setQwertyMode(st.qwertyMode);
+            st.menu.startDispatchingItemsChanged();
+        }
+
+        // Set other state
+        st.isPrepared = true;
+        st.isHandled = false;
+        mPreparedPanel = st;
+
+        return true;
+    }
+
+    private void checkCloseActionMenu(MenuBuilder menu) {
+        if (mClosingActionMenu) {
+            return;
+        }
+
+        mClosingActionMenu = true;
+        mDecorContentParent.dismissPopups();
+        Window.Callback cb = getWindowCallback();
+        if (cb != null && !isDestroyed()) {
+            cb.onPanelClosed(FEATURE_SUPPORT_ACTION_BAR, menu);
+        }
+        mClosingActionMenu = false;
+    }
+
+    private void closePanel(int featureId) {
+        closePanel(getPanelState(featureId, true), true);
+    }
+
+    private void closePanel(PanelFeatureState st, boolean doCallback) {
+        if (doCallback && st.featureId == FEATURE_OPTIONS_PANEL &&
+                mDecorContentParent != null && mDecorContentParent.isOverflowMenuShowing()) {
+            checkCloseActionMenu(st.menu);
+            return;
+        }
+
+        final WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
+        if (wm != null && st.isOpen && st.decorView != null) {
+            wm.removeView(st.decorView);
+
+            if (doCallback) {
+                callOnPanelClosed(st.featureId, st, null);
+            }
+        }
+
+        st.isPrepared = false;
+        st.isHandled = false;
+        st.isOpen = false;
+
+        // This view is no longer shown, so null it out
+        st.shownPanelView = null;
+
+        // Next time the menu opens, it should not be in expanded mode, so
+        // force a refresh of the decor
+        st.refreshDecorView = true;
+
+        if (mPreparedPanel == st) {
+            mPreparedPanel = null;
+        }
+    }
+
+    private boolean onKeyDownPanel(int featureId, KeyEvent event) {
+        if (event.getRepeatCount() == 0) {
+            PanelFeatureState st = getPanelState(featureId, true);
+            if (!st.isOpen) {
+                return preparePanel(st, event);
+            }
+        }
+
+        return false;
+    }
+
+    private boolean onKeyUpPanel(int featureId, KeyEvent event) {
+        if (mActionMode != null) {
+            return false;
+        }
+
+        boolean handled = false;
+        final PanelFeatureState st = getPanelState(featureId, true);
+        if (featureId == FEATURE_OPTIONS_PANEL && mDecorContentParent != null &&
+                mDecorContentParent.canShowOverflowMenu() &&
+                !ViewConfigurationCompat.hasPermanentMenuKey(ViewConfiguration.get(mContext))) {
+            if (!mDecorContentParent.isOverflowMenuShowing()) {
+                if (!isDestroyed() && preparePanel(st, event)) {
+                    handled = mDecorContentParent.showOverflowMenu();
+                }
+            } else {
+                handled = mDecorContentParent.hideOverflowMenu();
+            }
+        } else {
+            if (st.isOpen || st.isHandled) {
+                // Play the sound effect if the user closed an open menu (and not if
+                // they just released a menu shortcut)
+                handled = st.isOpen;
+                // Close menu
+                closePanel(st, true);
+            } else if (st.isPrepared) {
+                boolean show = true;
+                if (st.refreshMenuContent) {
+                    // Something may have invalidated the menu since we prepared it.
+                    // Re-prepare it to refresh.
+                    st.isPrepared = false;
+                    show = preparePanel(st, event);
+                }
+
+                if (show) {
+                    // Show menu
+                    openPanel(st, event);
+                    handled = true;
+                }
+            }
+        }
+
+        if (handled) {
+            AudioManager audioManager = (AudioManager) mContext.getSystemService(
+                    Context.AUDIO_SERVICE);
+            if (audioManager != null) {
+                audioManager.playSoundEffect(AudioManager.FX_KEY_CLICK);
+            } else {
+                Log.w(TAG, "Couldn't get audio manager");
+            }
+        }
+        return handled;
+    }
+
+    private void callOnPanelClosed(int featureId, PanelFeatureState panel, Menu menu) {
+        // Try to get a menu
+        if (menu == null) {
+            // Need a panel to grab the menu, so try to get that
+            if (panel == null) {
+                if ((featureId >= 0) && (featureId < mPanels.length)) {
+                    panel = mPanels[featureId];
+                }
+            }
+
+            if (panel != null) {
+                // menu still may be null, which is okay--we tried our best
+                menu = panel.menu;
+            }
+        }
+
+        // If the panel is not open, do not callback
+        if ((panel != null) && (!panel.isOpen))
+            return;
+
+        if (!isDestroyed()) {
+            // We need to be careful which callback we dispatch the call to. We can not dispatch
+            // this to the Window's callback since that will call back into this method and cause a
+            // crash. Instead we need to dispatch down to the original Activity/Dialog/etc.
+            mOriginalWindowCallback.onPanelClosed(featureId, menu);
+        }
+    }
+
+    private PanelFeatureState findMenuPanel(Menu menu) {
+        final PanelFeatureState[] panels = mPanels;
+        final int N = panels != null ? panels.length : 0;
+        for (int i = 0; i < N; i++) {
+            final PanelFeatureState panel = panels[i];
+            if (panel != null && panel.menu == menu) {
+                return panel;
+            }
+        }
+        return null;
+    }
+
+    protected PanelFeatureState getPanelState(int featureId, boolean required) {
+        PanelFeatureState[] ar;
+        if ((ar = mPanels) == null || ar.length <= featureId) {
+            PanelFeatureState[] nar = new PanelFeatureState[featureId + 1];
+            if (ar != null) {
+                System.arraycopy(ar, 0, nar, 0, ar.length);
+            }
+            mPanels = ar = nar;
+        }
+
+        PanelFeatureState st = ar[featureId];
+        if (st == null) {
+            ar[featureId] = st = new PanelFeatureState(featureId);
+        }
+        return st;
+    }
+
+    private boolean performPanelShortcut(PanelFeatureState st, int keyCode, KeyEvent event,
+            int flags) {
+        if (event.isSystem()) {
+            return false;
+        }
+
+        boolean handled = false;
+
+        // Only try to perform menu shortcuts if preparePanel returned true (possible false
+        // return value from application not wanting to show the menu).
+        if ((st.isPrepared || preparePanel(st, event)) && st.menu != null) {
+            // The menu is prepared now, perform the shortcut on it
+            handled = st.menu.performShortcut(keyCode, event, flags);
+        }
+
+        if (handled) {
+            // Only close down the menu if we don't have an action bar keeping it open.
+            if ((flags & Menu.FLAG_PERFORM_NO_CLOSE) == 0 && mDecorContentParent == null) {
+                closePanel(st, true);
+            }
+        }
+
+        return handled;
+    }
+
+    private void invalidatePanelMenu(int featureId) {
+        mInvalidatePanelMenuFeatures |= 1 << featureId;
+
+        if (!mInvalidatePanelMenuPosted) {
+            ViewCompat.postOnAnimation(mWindow.getDecorView(), mInvalidatePanelMenuRunnable);
+            mInvalidatePanelMenuPosted = true;
+        }
+    }
+
+    private void doInvalidatePanelMenu(int featureId) {
+        PanelFeatureState st = getPanelState(featureId, true);
+        Bundle savedActionViewStates = null;
+        if (st.menu != null) {
+            savedActionViewStates = new Bundle();
+            st.menu.saveActionViewStates(savedActionViewStates);
+            if (savedActionViewStates.size() > 0) {
+                st.frozenActionViewState = savedActionViewStates;
+            }
+            // This will be started again when the panel is prepared.
+            st.menu.stopDispatchingItemsChanged();
+            st.menu.clear();
+        }
+        st.refreshMenuContent = true;
+        st.refreshDecorView = true;
+
+        // Prepare the options panel if we have an action bar
+        if ((featureId == FEATURE_SUPPORT_ACTION_BAR || featureId == FEATURE_OPTIONS_PANEL)
+                && mDecorContentParent != null) {
+            st = getPanelState(Window.FEATURE_OPTIONS_PANEL, false);
+            if (st != null) {
+                st.isPrepared = false;
+                preparePanel(st, null);
+            }
+        }
+    }
+
+    /**
+     * Updates the status bar guard
+     *
+     * @param insetTop the current top system window inset
+     * @return the new top system window inset
+     */
+    private int updateStatusGuard(int insetTop) {
+        boolean showStatusGuard = false;
+        // Show the status guard when the non-overlay contextual action bar is showing
+        if (mActionModeView != null) {
+            if (mActionModeView.getLayoutParams() instanceof ViewGroup.MarginLayoutParams) {
+                ViewGroup.MarginLayoutParams mlp = (ViewGroup.MarginLayoutParams)
+                        mActionModeView.getLayoutParams();
+                boolean mlpChanged = false;
+
+                if (mActionModeView.isShown()) {
+                    if (mTempRect1 == null) {
+                        mTempRect1 = new Rect();
+                        mTempRect2 = new Rect();
+                    }
+                    final Rect insets = mTempRect1;
+                    final Rect localInsets = mTempRect2;
+                    insets.set(0, insetTop, 0, 0);
+
+                    ViewUtils.computeFitSystemWindows(mSubDecor, insets, localInsets);
+                    final int newMargin = localInsets.top == 0 ? insetTop : 0;
+                    if (mlp.topMargin != newMargin) {
+                        mlpChanged = true;
+                        mlp.topMargin = insetTop;
+
+                        if (mStatusGuard == null) {
+                            mStatusGuard = new View(mContext);
+                            mStatusGuard.setBackgroundColor(mContext.getResources()
+                                    .getColor(R.color.abc_input_method_navigation_guard));
+                            mSubDecor.addView(mStatusGuard, -1,
+                                    new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
+                                            insetTop));
+                        } else {
+                            ViewGroup.LayoutParams lp = mStatusGuard.getLayoutParams();
+                            if (lp.height != insetTop) {
+                                lp.height = insetTop;
+                                mStatusGuard.setLayoutParams(lp);
+                            }
+                        }
+                    }
+
+                    // The action mode's theme may differ from the app, so
+                    // always show the status guard above it.
+                    showStatusGuard = mStatusGuard != null;
+
+                    // We only need to consume the insets if the action
+                    // mode is overlaid on the app content (e.g. it's
+                    // sitting in a FrameLayout, see
+                    // screen_simple_overlay_action_mode.xml).
+                    if (!mOverlayActionMode && showStatusGuard) {
+                        insetTop = 0;
+                    }
+                } else {
+                    // reset top margin
+                    if (mlp.topMargin != 0) {
+                        mlpChanged = true;
+                        mlp.topMargin = 0;
+                    }
+                }
+                if (mlpChanged) {
+                    mActionModeView.setLayoutParams(mlp);
+                }
+            }
+        }
+        if (mStatusGuard != null) {
+            mStatusGuard.setVisibility(showStatusGuard ? View.VISIBLE : View.GONE);
+        }
+
+        return insetTop;
+    }
+
+    private void throwFeatureRequestIfSubDecorInstalled() {
+        if (mSubDecorInstalled) {
+            throw new AndroidRuntimeException(
+                    "Window feature must be requested before adding content");
+        }
+    }
+
+    private int sanitizeWindowFeatureId(int featureId) {
+        if (featureId == WindowCompat.FEATURE_ACTION_BAR) {
+            Log.i(TAG, "You should now use the AppCompatDelegate.FEATURE_SUPPORT_ACTION_BAR"
+                    + " id when requesting this feature.");
+            return FEATURE_SUPPORT_ACTION_BAR;
+        } else if (featureId == WindowCompat.FEATURE_ACTION_BAR_OVERLAY) {
+            Log.i(TAG, "You should now use the AppCompatDelegate.FEATURE_SUPPORT_ACTION_BAR_OVERLAY"
+                    + " id when requesting this feature.");
+            return FEATURE_SUPPORT_ACTION_BAR_OVERLAY;
+        }
+        // Else we'll just return the original id
+        return featureId;
+    }
+
+    ViewGroup getSubDecor() {
+        return mSubDecor;
+    }
+
+    private void dismissPopups() {
+        if (mDecorContentParent != null) {
+            mDecorContentParent.dismissPopups();
+        }
+
+        if (mActionModePopup != null) {
+            mWindow.getDecorView().removeCallbacks(mShowActionModePopup);
+            if (mActionModePopup.isShowing()) {
+                try {
+                    mActionModePopup.dismiss();
+                } catch (IllegalArgumentException e) {
+                    // Pre-v18, there are times when the Window will remove the popup before us.
+                    // In these cases we need to swallow the resulting exception.
+                }
+            }
+            mActionModePopup = null;
+        }
+        endOnGoingFadeAnimation();
+
+        PanelFeatureState st = getPanelState(FEATURE_OPTIONS_PANEL, false);
+        if (st != null && st.menu != null) {
+            st.menu.close();
+        }
+    }
+
+    /**
+     * Clears out internal reference when the action mode is destroyed.
+     */
+    class ActionModeCallbackWrapperV9 implements ActionMode.Callback {
+        private ActionMode.Callback mWrapped;
+
+        public ActionModeCallbackWrapperV9(ActionMode.Callback wrapped) {
+            mWrapped = wrapped;
+        }
+
+        @Override
+        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
+            return mWrapped.onCreateActionMode(mode, menu);
+        }
+
+        @Override
+        public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
+            return mWrapped.onPrepareActionMode(mode, menu);
+        }
+
+        @Override
+        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
+            return mWrapped.onActionItemClicked(mode, item);
+        }
+
+        @Override
+        public void onDestroyActionMode(ActionMode mode) {
+            mWrapped.onDestroyActionMode(mode);
+            if (mActionModePopup != null) {
+                mWindow.getDecorView().removeCallbacks(mShowActionModePopup);
+            }
+
+            if (mActionModeView != null) {
+                endOnGoingFadeAnimation();
+                mFadeAnim = ViewCompat.animate(mActionModeView).alpha(0f);
+                mFadeAnim.setListener(new ViewPropertyAnimatorListenerAdapter() {
+                    @Override
+                    public void onAnimationEnd(View view) {
+                        mActionModeView.setVisibility(View.GONE);
+                        if (mActionModePopup != null) {
+                            mActionModePopup.dismiss();
+                        } else if (mActionModeView.getParent() instanceof View) {
+                            ViewCompat.requestApplyInsets((View) mActionModeView.getParent());
+                        }
+                        mActionModeView.removeAllViews();
+                        mFadeAnim.setListener(null);
+                        mFadeAnim = null;
+                    }
+                });
+            }
+            if (mAppCompatCallback != null) {
+                mAppCompatCallback.onSupportActionModeFinished(mActionMode);
+            }
+            mActionMode = null;
+        }
+    }
+
+    private final class PanelMenuPresenterCallback implements MenuPresenter.Callback {
+        @Override
+        public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) {
+            final Menu parentMenu = menu.getRootMenu();
+            final boolean isSubMenu = parentMenu != menu;
+            final PanelFeatureState panel = findMenuPanel(isSubMenu ? parentMenu : menu);
+            if (panel != null) {
+                if (isSubMenu) {
+                    callOnPanelClosed(panel.featureId, panel, parentMenu);
+                    closePanel(panel, true);
+                } else {
+                    // Close the panel and only do the callback if the menu is being
+                    // closed completely, not if opening a sub menu
+                    closePanel(panel, allMenusAreClosing);
+                }
+            }
+        }
+
+        @Override
+        public boolean onOpenSubMenu(MenuBuilder subMenu) {
+            if (subMenu == null && mHasActionBar) {
+                Window.Callback cb = getWindowCallback();
+                if (cb != null && !isDestroyed()) {
+                    cb.onMenuOpened(FEATURE_SUPPORT_ACTION_BAR, subMenu);
+                }
+            }
+            return true;
+        }
+    }
+
+    private final class ActionMenuPresenterCallback implements MenuPresenter.Callback {
+        @Override
+        public boolean onOpenSubMenu(MenuBuilder subMenu) {
+            Window.Callback cb = getWindowCallback();
+            if (cb != null) {
+                cb.onMenuOpened(FEATURE_SUPPORT_ACTION_BAR, subMenu);
+            }
+            return true;
+        }
+
+        @Override
+        public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) {
+            checkCloseActionMenu(menu);
+        }
+    }
+
+    protected static final class PanelFeatureState {
+
+        /** Feature ID for this panel. */
+        int featureId;
+
+        int background;
+
+        int gravity;
+
+        int x;
+
+        int y;
+
+        int windowAnimations;
+
+        /** Dynamic state of the panel. */
+        ViewGroup decorView;
+
+        /** The panel that we are actually showing. */
+        View shownPanelView;
+
+        /** The panel that was returned by onCreatePanelView(). */
+        View createdPanelView;
+
+        /** Use {@link #setMenu} to set this. */
+        MenuBuilder menu;
+
+        ListMenuPresenter listMenuPresenter;
+
+        Context listPresenterContext;
+
+        /**
+         * Whether the panel has been prepared (see
+         * {@link #preparePanel}).
+         */
+        boolean isPrepared;
+
+        /**
+         * Whether an item's action has been performed. This happens in obvious
+         * scenarios (user clicks on menu item), but can also happen with
+         * chording menu+(shortcut key).
+         */
+        boolean isHandled;
+
+        boolean isOpen;
+
+        public boolean qwertyMode;
+
+        boolean refreshDecorView;
+
+        boolean refreshMenuContent;
+
+        boolean wasLastOpen;
+
+        /**
+         * Contains the state of the menu when told to freeze.
+         */
+        Bundle frozenMenuState;
+
+        /**
+         * Contains the state of associated action views when told to freeze.
+         * These are saved across invalidations.
+         */
+        Bundle frozenActionViewState;
+
+        PanelFeatureState(int featureId) {
+            this.featureId = featureId;
+
+            refreshDecorView = false;
+        }
+
+        public boolean hasPanelItems() {
+            if (shownPanelView == null) return false;
+            if (createdPanelView != null) return true;
+
+            return listMenuPresenter.getAdapter().getCount() > 0;
+        }
+
+        /**
+         * Unregister and free attached MenuPresenters. They will be recreated as needed.
+         */
+        public void clearMenuPresenters() {
+            if (menu != null) {
+                menu.removeMenuPresenter(listMenuPresenter);
+            }
+            listMenuPresenter = null;
+        }
+
+        void setStyle(Context context) {
+            final TypedValue outValue = new TypedValue();
+            final Resources.Theme widgetTheme = context.getResources().newTheme();
+            widgetTheme.setTo(context.getTheme());
+
+            // First apply the actionBarPopupTheme
+            widgetTheme.resolveAttribute(R.attr.actionBarPopupTheme, outValue, true);
+            if (outValue.resourceId != 0) {
+                widgetTheme.applyStyle(outValue.resourceId, true);
+            }
+
+            // Now apply the panelMenuListTheme
+            widgetTheme.resolveAttribute(R.attr.panelMenuListTheme, outValue, true);
+            if (outValue.resourceId != 0) {
+                widgetTheme.applyStyle(outValue.resourceId, true);
+            } else {
+                widgetTheme.applyStyle(R.style.Theme_AppCompat_CompactMenu, true);
+            }
+
+            context = new ContextThemeWrapper(context, 0);
+            context.getTheme().setTo(widgetTheme);
+
+            listPresenterContext = context;
+
+            TypedArray a = context.obtainStyledAttributes(R.styleable.AppCompatTheme);
+            background = a.getResourceId(
+                    R.styleable.AppCompatTheme_panelBackground, 0);
+            windowAnimations = a.getResourceId(
+                    R.styleable.AppCompatTheme_android_windowAnimationStyle, 0);
+            a.recycle();
+        }
+
+        void setMenu(MenuBuilder menu) {
+            if (menu == this.menu) return;
+
+            if (this.menu != null) {
+                this.menu.removeMenuPresenter(listMenuPresenter);
+            }
+            this.menu = menu;
+            if (menu != null) {
+                if (listMenuPresenter != null) menu.addMenuPresenter(listMenuPresenter);
+            }
+        }
+
+        MenuView getListMenuView(MenuPresenter.Callback cb) {
+            if (menu == null) return null;
+
+            if (listMenuPresenter == null) {
+                listMenuPresenter = new ListMenuPresenter(listPresenterContext,
+                        R.layout.abc_list_menu_item_layout);
+                listMenuPresenter.setCallback(cb);
+                menu.addMenuPresenter(listMenuPresenter);
+            }
+
+            MenuView result = listMenuPresenter.getMenuView(decorView);
+
+            return result;
+        }
+
+        Parcelable onSaveInstanceState() {
+            SavedState savedState = new SavedState();
+            savedState.featureId = featureId;
+            savedState.isOpen = isOpen;
+
+            if (menu != null) {
+                savedState.menuState = new Bundle();
+                menu.savePresenterStates(savedState.menuState);
+            }
+
+            return savedState;
+        }
+
+        void onRestoreInstanceState(Parcelable state) {
+            SavedState savedState = (SavedState) state;
+            featureId = savedState.featureId;
+            wasLastOpen = savedState.isOpen;
+            frozenMenuState = savedState.menuState;
+
+            shownPanelView = null;
+            decorView = null;
+        }
+
+        void applyFrozenState() {
+            if (menu != null && frozenMenuState != null) {
+                menu.restorePresenterStates(frozenMenuState);
+                frozenMenuState = null;
+            }
+        }
+
+        private static class SavedState implements Parcelable {
+            int featureId;
+            boolean isOpen;
+            Bundle menuState;
+
+            @Override
+            public int describeContents() {
+                return 0;
+            }
+
+            @Override
+            public void writeToParcel(Parcel dest, int flags) {
+                dest.writeInt(featureId);
+                dest.writeInt(isOpen ? 1 : 0);
+
+                if (isOpen) {
+                    dest.writeBundle(menuState);
+                }
+            }
+
+            private static SavedState readFromParcel(Parcel source, ClassLoader loader) {
+                SavedState savedState = new SavedState();
+                savedState.featureId = source.readInt();
+                savedState.isOpen = source.readInt() == 1;
+
+                if (savedState.isOpen) {
+                    savedState.menuState = source.readBundle(loader);
+                }
+
+                return savedState;
+            }
+
+            public static final Parcelable.Creator<SavedState> CREATOR
+                    = ParcelableCompat.newCreator(
+                    new ParcelableCompatCreatorCallbacks<SavedState>() {
+                        @Override
+                        public SavedState createFromParcel(Parcel in, ClassLoader loader) {
+                            return readFromParcel(in, loader);
+                        }
+
+                        @Override
+                        public SavedState[] newArray(int size) {
+                            return new SavedState[size];
+                        }
+                    });
+        }
+    }
+
+    private class ListMenuDecorView extends ContentFrameLayout {
+        public ListMenuDecorView(Context context) {
+            super(context);
+        }
+
+        @Override
+        public boolean dispatchKeyEvent(KeyEvent event) {
+            return AppCompatDelegateImplV9.this.dispatchKeyEvent(event)
+                    || super.dispatchKeyEvent(event);
+        }
+
+        @Override
+        public boolean onInterceptTouchEvent(MotionEvent event) {
+            int action = event.getAction();
+            if (action == MotionEvent.ACTION_DOWN) {
+                int x = (int) event.getX();
+                int y = (int) event.getY();
+                if (isOutOfBounds(x, y)) {
+                    closePanel(Window.FEATURE_OPTIONS_PANEL);
+                    return true;
+                }
+            }
+            return super.onInterceptTouchEvent(event);
+        }
+
+        @Override
+        public void setBackgroundResource(int resid) {
+            setBackgroundDrawable(AppCompatDrawableManager.get().getDrawable(getContext(), resid));
+        }
+
+        private boolean isOutOfBounds(int x, int y) {
+            return x < -5 || y < -5 || x > (getWidth() + 5) || y > (getHeight() + 5);
+        }
+    }
+}
diff --git a/v7/appcompat/src/android/support/v7/app/TwilightCalculator.java b/v7/appcompat/src/android/support/v7/app/TwilightCalculator.java
index 6015e12..f048e55 100644
--- a/v7/appcompat/src/android/support/v7/app/TwilightCalculator.java
+++ b/v7/appcompat/src/android/support/v7/app/TwilightCalculator.java
@@ -79,10 +79,10 @@
      * calculates the civil twilight bases on time and geo-coordinates.
      *
      * @param time time in milliseconds.
-     * @param latiude latitude in degrees.
+     * @param latitude latitude in degrees.
      * @param longitude latitude in degrees.
      */
-    public void calculateTwilight(long time, double latiude, double longitude) {
+    public void calculateTwilight(long time, double latitude, double longitude) {
         final float daysSince2000 = (float) (time - UTC_2000) / DateUtils.DAY_IN_MILLIS;
 
         // mean anomaly
@@ -104,7 +104,7 @@
         // declination of sun
         double solarDec = Math.asin(Math.sin(solarLng) * Math.sin(OBLIQUITY));
 
-        final double latRad = latiude * DEGREES_TO_RADIANS;
+        final double latRad = latitude * DEGREES_TO_RADIANS;
 
         double cosHourAngle = (Math.sin(ALTIDUTE_CORRECTION_CIVIL_TWILIGHT) - Math.sin(latRad)
                 * Math.sin(solarDec)) / (Math.cos(latRad) * Math.cos(solarDec));
diff --git a/v7/appcompat/src/android/support/v7/graphics/drawable/DrawerArrowDrawable.java b/v7/appcompat/src/android/support/v7/graphics/drawable/DrawerArrowDrawable.java
index 2c658b1..19428dd 100644
--- a/v7/appcompat/src/android/support/v7/graphics/drawable/DrawerArrowDrawable.java
+++ b/v7/appcompat/src/android/support/v7/graphics/drawable/DrawerArrowDrawable.java
@@ -91,7 +91,7 @@
 
     private final Paint mPaint = new Paint();
 
-    // The angle in degress that the arrow head is inclined at.
+    // The angle in degrees that the arrow head is inclined at.
     private static final float ARROW_HEAD_ANGLE = (float) Math.toRadians(45);
     // The length of top and bottom bars when they merge into an arrow
     private float mArrowHeadLength;
diff --git a/v7/appcompat/src/android/support/v7/view/menu/ActionMenuItemView.java b/v7/appcompat/src/android/support/v7/view/menu/ActionMenuItemView.java
index 34c7ff4..47d794e 100644
--- a/v7/appcompat/src/android/support/v7/view/menu/ActionMenuItemView.java
+++ b/v7/appcompat/src/android/support/v7/view/menu/ActionMenuItemView.java
@@ -93,9 +93,7 @@
     }
 
     public void onConfigurationChanged(Configuration newConfig) {
-        if (Build.VERSION.SDK_INT >= 8) {
-            super.onConfigurationChanged(newConfig);
-        }
+        super.onConfigurationChanged(newConfig);
 
         mAllowTextWithIcon = shouldAllowTextWithIcon();
         updateTextButtonVisibility();
diff --git a/v7/appcompat/src/android/support/v7/view/menu/MenuAdapter.java b/v7/appcompat/src/android/support/v7/view/menu/MenuAdapter.java
index 08ec36d..5f00cf2 100644
--- a/v7/appcompat/src/android/support/v7/view/menu/MenuAdapter.java
+++ b/v7/appcompat/src/android/support/v7/view/menu/MenuAdapter.java
@@ -52,6 +52,7 @@
         mForceShowIcon = forceShow;
     }
 
+    @Override
     public int getCount() {
         ArrayList<MenuItemImpl> items = mOverflowOnly ?
                 mAdapterMenu.getNonActionItems() : mAdapterMenu.getVisibleItems();
@@ -65,6 +66,7 @@
         return mAdapterMenu;
     }
 
+    @Override
     public MenuItemImpl getItem(int position) {
         ArrayList<MenuItemImpl> items = mOverflowOnly ?
                 mAdapterMenu.getNonActionItems() : mAdapterMenu.getVisibleItems();
@@ -74,12 +76,14 @@
         return items.get(position);
     }
 
+    @Override
     public long getItemId(int position) {
         // Since a menu item's ID is optional, we'll use the position as an
         // ID for the item in the AdapterView
         return position;
     }
 
+    @Override
     public View getView(int position, View convertView, ViewGroup parent) {
         if (convertView == null) {
             convertView = mInflater.inflate(ITEM_LAYOUT, parent, false);
diff --git a/v7/appcompat/src/android/support/v7/view/menu/MenuPresenter.java b/v7/appcompat/src/android/support/v7/view/menu/MenuPresenter.java
index cf414fc..5ad52b9 100644
--- a/v7/appcompat/src/android/support/v7/view/menu/MenuPresenter.java
+++ b/v7/appcompat/src/android/support/v7/view/menu/MenuPresenter.java
@@ -114,7 +114,7 @@
     public boolean flagActionItems();
 
     /**
-     * Called when a menu item with a collapsable action view should expand its action view.
+     * Called when a menu item with a collapsible action view should expand its action view.
      *
      * @param menu Menu containing the item to be expanded
      * @param item Item to be expanded
@@ -123,7 +123,7 @@
     public boolean expandItemActionView(MenuBuilder menu, MenuItemImpl item);
 
     /**
-     * Called when a menu item with a collapsable action view should collapse its action view.
+     * Called when a menu item with a collapsible action view should collapse its action view.
      *
      * @param menu Menu containing the item to be collapsed
      * @param item Item to be collapsed
diff --git a/v7/appcompat/src/android/support/v7/widget/AbsActionBarView.java b/v7/appcompat/src/android/support/v7/widget/AbsActionBarView.java
index 2121b74..1faf568 100644
--- a/v7/appcompat/src/android/support/v7/widget/AbsActionBarView.java
+++ b/v7/appcompat/src/android/support/v7/widget/AbsActionBarView.java
@@ -71,9 +71,7 @@
 
     @Override
     protected void onConfigurationChanged(Configuration newConfig) {
-        if (Build.VERSION.SDK_INT >= 8) {
-            super.onConfigurationChanged(newConfig);
-        }
+        super.onConfigurationChanged(newConfig);
 
         // Action bar can change size on configuration changes.
         // Reread the desired height from the theme-specified style.
diff --git a/v7/appcompat/src/android/support/v7/widget/ActionBarOverlayLayout.java b/v7/appcompat/src/android/support/v7/widget/ActionBarOverlayLayout.java
index 9623383..d2ded94 100644
--- a/v7/appcompat/src/android/support/v7/widget/ActionBarOverlayLayout.java
+++ b/v7/appcompat/src/android/support/v7/widget/ActionBarOverlayLayout.java
@@ -212,9 +212,7 @@
     }
 
     protected void onConfigurationChanged(Configuration newConfig) {
-        if (Build.VERSION.SDK_INT >= 8) {
-            super.onConfigurationChanged(newConfig);
-        }
+        super.onConfigurationChanged(newConfig);
         init(getContext());
         ViewCompat.requestApplyInsets(this);
     }
diff --git a/v7/appcompat/src/android/support/v7/widget/ActionMenuView.java b/v7/appcompat/src/android/support/v7/widget/ActionMenuView.java
index 9919fec..bf5ab6a 100644
--- a/v7/appcompat/src/android/support/v7/widget/ActionMenuView.java
+++ b/v7/appcompat/src/android/support/v7/widget/ActionMenuView.java
@@ -121,9 +121,7 @@
 
     @Override
     public void onConfigurationChanged(Configuration newConfig) {
-        if (Build.VERSION.SDK_INT >= 8) {
-            super.onConfigurationChanged(newConfig);
-        }
+        super.onConfigurationChanged(newConfig);
 
         if (mPresenter != null) {
             mPresenter.updateMenuView(false);
diff --git a/v7/appcompat/src/android/support/v7/widget/ActivityChooserModel.java b/v7/appcompat/src/android/support/v7/widget/ActivityChooserModel.java
index af405eb..c4867f0 100644
--- a/v7/appcompat/src/android/support/v7/widget/ActivityChooserModel.java
+++ b/v7/appcompat/src/android/support/v7/widget/ActivityChooserModel.java
@@ -483,7 +483,7 @@
 
             HistoricalRecord historicalRecord = new HistoricalRecord(chosenName,
                     System.currentTimeMillis(), DEFAULT_HISTORICAL_RECORD_WEIGHT);
-            addHisoricalRecord(historicalRecord);
+            addHistoricalRecord(historicalRecord);
 
             return choiceIntent;
         }
@@ -550,7 +550,7 @@
                     newDefaultActivity.resolveInfo.activityInfo.name);
             HistoricalRecord historicalRecord = new HistoricalRecord(defaultName,
                     System.currentTimeMillis(), weight);
-            addHisoricalRecord(historicalRecord);
+            addHistoricalRecord(historicalRecord);
         }
     }
 
@@ -724,7 +724,7 @@
      * @param historicalRecord The record to add.
      * @return True if the record was added.
      */
-    private boolean addHisoricalRecord(HistoricalRecord historicalRecord) {
+    private boolean addHistoricalRecord(HistoricalRecord historicalRecord) {
         final boolean added = mHistoricalRecords.add(historicalRecord);
         if (added) {
             mHistoricalRecordsChanged = true;
@@ -1036,14 +1036,14 @@
         @SuppressWarnings("unchecked")
         public Void doInBackground(Object... args) {
             List<HistoricalRecord> historicalRecords = (List<HistoricalRecord>) args[0];
-            String hostoryFileName = (String) args[1];
+            String historyFileName = (String) args[1];
 
             FileOutputStream fos = null;
 
             try {
-                fos = mContext.openFileOutput(hostoryFileName, Context.MODE_PRIVATE);
+                fos = mContext.openFileOutput(historyFileName, Context.MODE_PRIVATE);
             } catch (FileNotFoundException fnfe) {
-                Log.e(LOG_TAG, "Error writing historical recrod file: " + hostoryFileName, fnfe);
+                Log.e(LOG_TAG, "Error writing historical record file: " + historyFileName, fnfe);
                 return null;
             }
 
@@ -1075,11 +1075,11 @@
                     Log.i(LOG_TAG, "Wrote " + recordCount + " historical records.");
                 }
             } catch (IllegalArgumentException iae) {
-                Log.e(LOG_TAG, "Error writing historical recrod file: " + mHistoryFileName, iae);
+                Log.e(LOG_TAG, "Error writing historical record file: " + mHistoryFileName, iae);
             } catch (IllegalStateException ise) {
-                Log.e(LOG_TAG, "Error writing historical recrod file: " + mHistoryFileName, ise);
+                Log.e(LOG_TAG, "Error writing historical record file: " + mHistoryFileName, ise);
             } catch (IOException ioe) {
-                Log.e(LOG_TAG, "Error writing historical recrod file: " + mHistoryFileName, ioe);
+                Log.e(LOG_TAG, "Error writing historical record file: " + mHistoryFileName, ioe);
             } finally {
                 mCanReadHistoricalData = true;
                 if (fos != null) {
diff --git a/v7/appcompat/src/android/support/v7/widget/ActivityChooserView.java b/v7/appcompat/src/android/support/v7/widget/ActivityChooserView.java
index 8d5c45d..16c240a 100644
--- a/v7/appcompat/src/android/support/v7/widget/ActivityChooserView.java
+++ b/v7/appcompat/src/android/support/v7/widget/ActivityChooserView.java
@@ -122,7 +122,7 @@
     /**
      * Observer for the model data.
      */
-    private final DataSetObserver mModelDataSetOberver = new DataSetObserver() {
+    private final DataSetObserver mModelDataSetObserver = new DataSetObserver() {
 
         @Override
         public void onChanged() {
@@ -278,6 +278,7 @@
     /**
      * {@inheritDoc}
      */
+    @Override
     public void setActivityChooserModel(ActivityChooserModel dataModel) {
         mAdapter.setDataModel(dataModel);
         if (isShowingPopup()) {
@@ -412,7 +413,7 @@
         super.onAttachedToWindow();
         ActivityChooserModel dataModel = mAdapter.getDataModel();
         if (dataModel != null) {
-            dataModel.registerObserver(mModelDataSetOberver);
+            dataModel.registerObserver(mModelDataSetObserver);
         }
         mIsAttachedToWindow = true;
     }
@@ -422,7 +423,7 @@
         super.onDetachedFromWindow();
         ActivityChooserModel dataModel = mAdapter.getDataModel();
         if (dataModel != null) {
-            dataModel.unregisterObserver(mModelDataSetOberver);
+            dataModel.unregisterObserver(mModelDataSetObserver);
         }
         ViewTreeObserver viewTreeObserver = getViewTreeObserver();
         if (viewTreeObserver.isAlive()) {
@@ -554,6 +555,7 @@
             View.OnClickListener, View.OnLongClickListener, PopupWindow.OnDismissListener {
 
         // AdapterView#OnItemClickListener
+        @Override
         public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
             ActivityChooserViewAdapter adapter = (ActivityChooserViewAdapter) parent.getAdapter();
             final int itemViewType = adapter.getItemViewType(position);
@@ -585,6 +587,7 @@
         }
 
         // View.OnClickListener
+        @Override
         public void onClick(View view) {
             if (view == mDefaultActivityButton) {
                 dismissPopup();
@@ -618,6 +621,7 @@
         }
 
         // PopUpWindow.OnDismissListener#onDismiss
+        @Override
         public void onDismiss() {
             notifyOnDismissListener();
             if (mProvider != null) {
@@ -660,11 +664,11 @@
         public void setDataModel(ActivityChooserModel dataModel) {
             ActivityChooserModel oldDataModel = mAdapter.getDataModel();
             if (oldDataModel != null && isShown()) {
-                oldDataModel.unregisterObserver(mModelDataSetOberver);
+                oldDataModel.unregisterObserver(mModelDataSetObserver);
             }
             mDataModel = dataModel;
             if (dataModel != null && isShown()) {
-                dataModel.registerObserver(mModelDataSetOberver);
+                dataModel.registerObserver(mModelDataSetObserver);
             }
             notifyDataSetChanged();
         }
@@ -683,6 +687,7 @@
             return ITEM_VIEW_TYPE_COUNT;
         }
 
+        @Override
         public int getCount() {
             int count = 0;
             int activityCount = mDataModel.getActivityCount();
@@ -696,6 +701,7 @@
             return count;
         }
 
+        @Override
         public Object getItem(int position) {
             final int itemViewType = getItemViewType(position);
             switch (itemViewType) {
@@ -711,10 +717,12 @@
             }
         }
 
+        @Override
         public long getItemId(int position) {
             return position;
         }
 
+        @Override
         public View getView(int position, View convertView, ViewGroup parent) {
             final int itemViewType = getItemViewType(position);
             switch (itemViewType) {
diff --git a/v7/appcompat/src/android/support/v7/widget/AppCompatAutoCompleteTextView.java b/v7/appcompat/src/android/support/v7/widget/AppCompatAutoCompleteTextView.java
index 4df02a0..38877ba 100644
--- a/v7/appcompat/src/android/support/v7/widget/AppCompatAutoCompleteTextView.java
+++ b/v7/appcompat/src/android/support/v7/widget/AppCompatAutoCompleteTextView.java
@@ -32,7 +32,7 @@
  * platform, including:
  * <ul>
  *     <li>Supports {@link R.attr#textAllCaps} style attribute which works back to
- *     {@link android.os.Build.VERSION_CODES#ECLAIR_MR1 Eclair MR1}.</li>
+ *     {@link android.os.Build.VERSION_CODES#GINGERBREAD Gingerbread}.</li>
  *     <li>Allows dynamic tint of it background via the background tint methods in
  *     {@link android.support.v4.view.ViewCompat}.</li>
  *     <li>Allows setting of the background tint using {@link R.attr#backgroundTint} and
diff --git a/v7/appcompat/src/android/support/v7/widget/AppCompatBackgroundHelper.java b/v7/appcompat/src/android/support/v7/widget/AppCompatBackgroundHelper.java
index 9d11416..2a25332 100644
--- a/v7/appcompat/src/android/support/v7/widget/AppCompatBackgroundHelper.java
+++ b/v7/appcompat/src/android/support/v7/widget/AppCompatBackgroundHelper.java
@@ -31,9 +31,11 @@
     private final View mView;
     private final AppCompatDrawableManager mDrawableManager;
 
-    private TintInfo mInternalBackgroundTint;
-    private TintInfo mBackgroundTint;
-    private TintInfo mTmpInfo;
+    private int mBackgroundResId = -1;
+
+    private BackgroundTintInfo mInternalBackgroundTint;
+    private BackgroundTintInfo mBackgroundTint;
+    private BackgroundTintInfo mTmpInfo;
 
     AppCompatBackgroundHelper(View view, AppCompatDrawableManager drawableManager) {
         mView = view;
@@ -45,8 +47,10 @@
                 R.styleable.ViewBackgroundHelper, defStyleAttr, 0);
         try {
             if (a.hasValue(R.styleable.ViewBackgroundHelper_android_background)) {
-                ColorStateList tint = mDrawableManager.getTintList(mView.getContext(),
-                        a.getResourceId(R.styleable.ViewBackgroundHelper_android_background, -1));
+                mBackgroundResId = a.getResourceId(
+                        R.styleable.ViewBackgroundHelper_android_background, -1);
+                ColorStateList tint = mDrawableManager
+                        .getTintList(mView.getContext(), mBackgroundResId);
                 if (tint != null) {
                     setInternalBackgroundTint(tint);
                 }
@@ -67,25 +71,67 @@
     }
 
     void onSetBackgroundResource(int resId) {
+        mBackgroundResId = resId;
         // Update the default background tint
         setInternalBackgroundTint(mDrawableManager != null
                 ? mDrawableManager.getTintList(mView.getContext(), resId)
                 : null);
+
+        if (updateBackgroundTint()) {
+            applySupportBackgroundTint();
+        }
     }
 
     void onSetBackgroundDrawable(Drawable background) {
+        mBackgroundResId = -1;
         // We don't know that this drawable is, so we need to clear the default background tint
         setInternalBackgroundTint(null);
+
+        if (updateBackgroundTint()) {
+            applySupportBackgroundTint();
+        }
     }
 
     void setSupportBackgroundTintList(ColorStateList tint) {
         if (mBackgroundTint == null) {
-            mBackgroundTint = new TintInfo();
+            mBackgroundTint = new BackgroundTintInfo();
         }
-        mBackgroundTint.mTintList = tint;
+
+        // Store the original tint and null out the applicable tint. updateBackgroundTint() will
+        // set mTintList to the tint to actually use
+        mBackgroundTint.mOriginalTintList = tint;
+        mBackgroundTint.mTintList = null;
         mBackgroundTint.mHasTintList = true;
 
-        applySupportBackgroundTint();
+        if (updateBackgroundTint()) {
+            applySupportBackgroundTint();
+        }
+    }
+
+    /**
+     * Updates the background tint state
+     * @return true if the state was changed and requires an apply
+     */
+    private boolean updateBackgroundTint() {
+        if (mBackgroundTint != null && mBackgroundTint.mHasTintList) {
+            if (mBackgroundResId >= 0) {
+                // If we have a background resource id, lets see if we need to modify the tint
+                // list to add any touch highlights in (for example, Button needs this)
+                final ColorStateList updated = mDrawableManager.getTintList(
+                        mView.getContext(), mBackgroundResId, mBackgroundTint.mOriginalTintList);
+                if (updated != null) {
+                    mBackgroundTint.mTintList = updated;
+                    return true;
+                }
+            }
+            // If we reach here then we should just be using the original tint list. Check if we
+            // need to set and apply
+            if (mBackgroundTint.mTintList != mBackgroundTint.mOriginalTintList) {
+                mBackgroundTint.mTintList = mBackgroundTint.mOriginalTintList;
+                return true;
+            }
+        }
+        return false;
     }
 
     ColorStateList getSupportBackgroundTintList() {
@@ -94,7 +140,7 @@
 
     void setSupportBackgroundTintMode(PorterDuff.Mode tintMode) {
         if (mBackgroundTint == null) {
-            mBackgroundTint = new TintInfo();
+            mBackgroundTint = new BackgroundTintInfo();
         }
         mBackgroundTint.mTintMode = tintMode;
         mBackgroundTint.mHasTintMode = true;
@@ -130,7 +176,7 @@
     void setInternalBackgroundTint(ColorStateList tint) {
         if (tint != null) {
             if (mInternalBackgroundTint == null) {
-                mInternalBackgroundTint = new TintInfo();
+                mInternalBackgroundTint = new BackgroundTintInfo();
             }
             mInternalBackgroundTint.mTintList = tint;
             mInternalBackgroundTint.mHasTintList = true;
@@ -147,7 +193,7 @@
      */
     private boolean applyFrameworkTintUsingColorFilter(@NonNull Drawable background) {
         if (mTmpInfo == null) {
-            mTmpInfo = new TintInfo();
+            mTmpInfo = new BackgroundTintInfo();
         }
         final TintInfo info = mTmpInfo;
         info.clear();
@@ -170,4 +216,16 @@
 
         return false;
     }
+
+    private static class BackgroundTintInfo extends TintInfo {
+        // The original tint list given to the call. We need this distinction because create a
+        // modified for actual tinting purposes
+        public ColorStateList mOriginalTintList;
+
+        @Override
+        void clear() {
+            super.clear();
+            mOriginalTintList = null;
+        }
+    }
 }
diff --git a/v7/appcompat/src/android/support/v7/widget/AppCompatButton.java b/v7/appcompat/src/android/support/v7/widget/AppCompatButton.java
index 1b06b82..a8c7fbd 100644
--- a/v7/appcompat/src/android/support/v7/widget/AppCompatButton.java
+++ b/v7/appcompat/src/android/support/v7/widget/AppCompatButton.java
@@ -34,7 +34,7 @@
  * including:
  * <ul>
  *     <li>Supports {@link R.attr#textAllCaps} style attribute which works back to
- *     {@link android.os.Build.VERSION_CODES#ECLAIR_MR1 Eclair MR1}.</li>
+ *     {@link android.os.Build.VERSION_CODES#GINGERBREAD Gingerbread}.</li>
  *     <li>Allows dynamic tint of it background via the background tint methods in
  *     {@link android.support.v4.view.ViewCompat}.</li>
  *     <li>Allows setting of the background tint using {@link R.attr#backgroundTint} and
diff --git a/v7/appcompat/src/android/support/v7/widget/AppCompatDrawableManager.java b/v7/appcompat/src/android/support/v7/widget/AppCompatDrawableManager.java
index 8251dd8..cc29fda 100644
--- a/v7/appcompat/src/android/support/v7/widget/AppCompatDrawableManager.java
+++ b/v7/appcompat/src/android/support/v7/widget/AppCompatDrawableManager.java
@@ -53,6 +53,7 @@
 import java.lang.ref.WeakReference;
 import java.util.WeakHashMap;
 
+import static android.support.v4.graphics.ColorUtils.compositeColors;
 import static android.support.v7.content.res.AppCompatResources.getColorStateList;
 import static android.support.v7.widget.ThemeUtils.getDisabledThemeAttrColor;
 import static android.support.v7.widget.ThemeUtils.getThemeAttrColor;
@@ -133,7 +134,10 @@
             R.drawable.abc_textfield_activated_mtrl_alpha,
             R.drawable.abc_textfield_search_activated_mtrl_alpha,
             R.drawable.abc_cab_background_top_mtrl_alpha,
-            R.drawable.abc_text_cursor_material
+            R.drawable.abc_text_cursor_material,
+            R.drawable.abc_text_select_handle_left_mtrl_alpha,
+            R.drawable.abc_text_select_handle_middle_mtrl_alpha,
+            R.drawable.abc_text_select_handle_right_mtrl_alpha
     };
 
     /**
@@ -504,8 +508,17 @@
     }
 
     public final ColorStateList getTintList(@NonNull Context context, @DrawableRes int resId) {
+        return getTintList(context, resId, null);
+    }
+
+    public final ColorStateList getTintList(@NonNull Context context, @DrawableRes int resId,
+            @Nullable ColorStateList customTint) {
+        // We only want to use the cache for the standard tints, not ones created using custom
+        // tints
+        final boolean useCache = customTint == null;
+
         // Try the cache first (if it exists)
-        ColorStateList tint = getTintListFromCache(context, resId);
+        ColorStateList tint = useCache ? getTintListFromCache(context, resId) : null;
 
         if (tint == null) {
             // ...if the cache did not contain a color state list, try and create one
@@ -516,11 +529,11 @@
             } else if (resId == R.drawable.abc_switch_thumb_material) {
                 tint = getColorStateList(context, R.color.abc_tint_switch_thumb);
             } else if (resId == R.drawable.abc_btn_default_mtrl_shape) {
-                tint = createDefaultButtonColorStateList(context);
+                tint = createDefaultButtonColorStateList(context, customTint);
             } else if (resId == R.drawable.abc_btn_borderless_material) {
-                tint = createBorderlessButtonColorStateList(context);
+                tint = createBorderlessButtonColorStateList(context, customTint);
             } else if (resId == R.drawable.abc_btn_colored_material) {
-                tint = createColoredButtonColorStateList(context);
+                tint = createColoredButtonColorStateList(context, customTint);
             } else if (resId == R.drawable.abc_spinner_mtrl_am_alpha
                     || resId == R.drawable.abc_spinner_textfield_background_material) {
                 tint = getColorStateList(context, R.color.abc_tint_spinner);
@@ -534,7 +547,7 @@
                 tint = getColorStateList(context, R.color.abc_tint_seek_thumb);
             }
 
-            if (tint != null) {
+            if (useCache && tint != null) {
                 addTintListToCache(context, resId, tint);
             }
         }
@@ -562,42 +575,51 @@
         themeTints.append(resId, tintList);
     }
 
-    private ColorStateList createDefaultButtonColorStateList(Context context) {
+    private ColorStateList createDefaultButtonColorStateList(@NonNull Context context,
+            @Nullable ColorStateList customTint) {
         return createButtonColorStateList(context,
-                getThemeAttrColor(context, R.attr.colorButtonNormal));
+                getThemeAttrColor(context, R.attr.colorButtonNormal), customTint);
     }
 
-    private ColorStateList createBorderlessButtonColorStateList(Context context) {
-        return createButtonColorStateList(context, Color.TRANSPARENT);
+    private ColorStateList createBorderlessButtonColorStateList(@NonNull Context context,
+            @Nullable ColorStateList customTint) {
+        // We ignore the custom tint for borderless buttons
+        return createButtonColorStateList(context, Color.TRANSPARENT, null);
     }
 
-    private ColorStateList createColoredButtonColorStateList(Context context) {
-        return createButtonColorStateList(context, getThemeAttrColor(context, R.attr.colorAccent));
+    private ColorStateList createColoredButtonColorStateList(@NonNull Context context,
+            @Nullable ColorStateList customTint) {
+        return createButtonColorStateList(context,
+                getThemeAttrColor(context, R.attr.colorAccent), customTint);
     }
 
-    private ColorStateList createButtonColorStateList(Context context, @ColorInt int baseColor) {
+    private ColorStateList createButtonColorStateList(@NonNull final Context context,
+            @ColorInt final int baseColor, final @Nullable ColorStateList tint) {
         final int[][] states = new int[4][];
         final int[] colors = new int[4];
         int i = 0;
 
         final int colorControlHighlight = getThemeAttrColor(context, R.attr.colorControlHighlight);
+        final int disabledColor = getDisabledThemeAttrColor(context, R.attr.colorButtonNormal);
 
         // Disabled state
         states[i] = ThemeUtils.DISABLED_STATE_SET;
-        colors[i] = getDisabledThemeAttrColor(context, R.attr.colorButtonNormal);
+        colors[i] = tint == null ? disabledColor : tint.getColorForState(states[i], 0);
         i++;
 
         states[i] = ThemeUtils.PRESSED_STATE_SET;
-        colors[i] = ColorUtils.compositeColors(colorControlHighlight, baseColor);
+        colors[i] = compositeColors(colorControlHighlight,
+                tint == null ? baseColor : tint.getColorForState(states[i], 0));
         i++;
 
         states[i] = ThemeUtils.FOCUSED_STATE_SET;
-        colors[i] = ColorUtils.compositeColors(colorControlHighlight, baseColor);
+        colors[i] = compositeColors(colorControlHighlight,
+                tint == null ? baseColor : tint.getColorForState(states[i], 0));
         i++;
 
         // Default enabled state
         states[i] = ThemeUtils.EMPTY_STATE_SET;
-        colors[i] = baseColor;
+        colors[i] = tint == null ? baseColor : tint.getColorForState(states[i], 0);
         i++;
 
         return new ColorStateList(states, colors);
diff --git a/v7/appcompat/src/android/support/v7/widget/AppCompatEditText.java b/v7/appcompat/src/android/support/v7/widget/AppCompatEditText.java
index d690545..f8f7863 100644
--- a/v7/appcompat/src/android/support/v7/widget/AppCompatEditText.java
+++ b/v7/appcompat/src/android/support/v7/widget/AppCompatEditText.java
@@ -32,7 +32,7 @@
  * including:
  * <ul>
  *     <li>Supports {@link R.attr#textAllCaps} style attribute which works back to
- *     {@link android.os.Build.VERSION_CODES#ECLAIR_MR1 Eclair MR1}.</li>
+ *     {@link android.os.Build.VERSION_CODES#GINGERBREAD Gingerbread}.</li>
  *     <li>Allows dynamic tint of it background via the background tint methods in
  *     {@link android.support.v4.view.ViewCompat}.</li>
  *     <li>Allows setting of the background tint using {@link R.attr#backgroundTint} and
diff --git a/v7/appcompat/src/android/support/v7/widget/AppCompatImageView.java b/v7/appcompat/src/android/support/v7/widget/AppCompatImageView.java
index b8b1b2f..bdfc7ca 100644
--- a/v7/appcompat/src/android/support/v7/widget/AppCompatImageView.java
+++ b/v7/appcompat/src/android/support/v7/widget/AppCompatImageView.java
@@ -65,6 +65,15 @@
         mImageHelper.loadFromAttributes(attrs, defStyleAttr);
     }
 
+    /**
+     * Sets a drawable as the content of this ImageView.
+     *
+     * <p>Allows the use of vector drawables when running on older versions of the platform.</p>
+     *
+     * @param resId the resource identifier of the drawable
+     * @see ImageView#setImageResource(int)
+     * @attr ref R.styleable#AppCompatImageView_srcCompat
+     */
     @Override
     public void setImageResource(@DrawableRes int resId) {
         // Intercept this call and instead retrieve the Drawable via the image helper
diff --git a/v7/appcompat/src/android/support/v7/widget/AppCompatMultiAutoCompleteTextView.java b/v7/appcompat/src/android/support/v7/widget/AppCompatMultiAutoCompleteTextView.java
index 34cece6..9bd300d 100644
--- a/v7/appcompat/src/android/support/v7/widget/AppCompatMultiAutoCompleteTextView.java
+++ b/v7/appcompat/src/android/support/v7/widget/AppCompatMultiAutoCompleteTextView.java
@@ -32,7 +32,7 @@
  * platform, including:
  * <ul>
  *     <li>Supports {@link R.attr#textAllCaps} style attribute which works back to
- *     {@link android.os.Build.VERSION_CODES#ECLAIR_MR1 Eclair MR1}.</li>
+ *     {@link android.os.Build.VERSION_CODES#GINGERBREAD Gingerbread}.</li>
  *     <li>Allows dynamic tint of it background via the background tint methods in
  *     {@link android.support.v4.view.ViewCompat}.</li>
  *     <li>Allows setting of the background tint using {@link R.attr#backgroundTint} and
diff --git a/v7/appcompat/src/android/support/v7/widget/AppCompatPopupWindow.java b/v7/appcompat/src/android/support/v7/widget/AppCompatPopupWindow.java
index 88b4620..13bb3ed 100644
--- a/v7/appcompat/src/android/support/v7/widget/AppCompatPopupWindow.java
+++ b/v7/appcompat/src/android/support/v7/widget/AppCompatPopupWindow.java
@@ -67,12 +67,10 @@
         if (defStyleRes != 0 && sdk < 11) {
             // If we have a defStyleRes, but we're on < API 11, we need to manually set attributes
             // from the style
-            if (sdk >= 9) {
-                // android:popupAnimationStyle was added in API 9
-                if (a.hasValue(R.styleable.PopupWindow_android_popupAnimationStyle)) {
-                    setAnimationStyle(a.getResourceId(
-                            R.styleable.PopupWindow_android_popupAnimationStyle, -1));
-                }
+            // android:popupAnimationStyle was added in API 9
+            if (a.hasValue(R.styleable.PopupWindow_android_popupAnimationStyle)) {
+                setAnimationStyle(a.getResourceId(
+                        R.styleable.PopupWindow_android_popupAnimationStyle, -1));
             }
         }
 
diff --git a/v7/appcompat/src/android/support/v7/widget/AppCompatSeekBarHelper.java b/v7/appcompat/src/android/support/v7/widget/AppCompatSeekBarHelper.java
index e26faee..87ce375 100644
--- a/v7/appcompat/src/android/support/v7/widget/AppCompatSeekBarHelper.java
+++ b/v7/appcompat/src/android/support/v7/widget/AppCompatSeekBarHelper.java
@@ -42,6 +42,7 @@
         mView = view;
     }
 
+    @Override
     void loadFromAttributes(AttributeSet attrs, int defStyleAttr) {
         super.loadFromAttributes(attrs, defStyleAttr);
 
diff --git a/v7/appcompat/src/android/support/v7/widget/AppCompatTextHelperV17.java b/v7/appcompat/src/android/support/v7/widget/AppCompatTextHelperV17.java
index 18047e7..45939d3 100644
--- a/v7/appcompat/src/android/support/v7/widget/AppCompatTextHelperV17.java
+++ b/v7/appcompat/src/android/support/v7/widget/AppCompatTextHelperV17.java
@@ -34,6 +34,7 @@
         super(view);
     }
 
+    @Override
     void loadFromAttributes(AttributeSet attrs, int defStyleAttr) {
         super.loadFromAttributes(attrs, defStyleAttr);
 
diff --git a/v7/appcompat/src/android/support/v7/widget/AppCompatTextView.java b/v7/appcompat/src/android/support/v7/widget/AppCompatTextView.java
index fdb4960..797626b 100644
--- a/v7/appcompat/src/android/support/v7/widget/AppCompatTextView.java
+++ b/v7/appcompat/src/android/support/v7/widget/AppCompatTextView.java
@@ -32,7 +32,7 @@
  * including:
  * <ul>
  *     <li>Supports {@link R.attr#textAllCaps} style attribute which works back to
- *     {@link android.os.Build.VERSION_CODES#ECLAIR_MR1 Eclair MR1}.</li>
+ *     {@link android.os.Build.VERSION_CODES#GINGERBREAD Gingerbread}.</li>
  *     <li>Allows dynamic tint of it background via the background tint methods in
  *     {@link android.support.v4.view.ViewCompat}.</li>
  *     <li>Allows setting of the background tint using {@link R.attr#backgroundTint} and
diff --git a/v7/appcompat/src/android/support/v7/widget/DrawableUtils.java b/v7/appcompat/src/android/support/v7/widget/DrawableUtils.java
index 283d43b..9bdcad3 100644
--- a/v7/appcompat/src/android/support/v7/widget/DrawableUtils.java
+++ b/v7/appcompat/src/android/support/v7/widget/DrawableUtils.java
@@ -121,10 +121,7 @@
      * there is a known issue in the given drawable's implementation.
      */
     public static boolean canSafelyMutateDrawable(@NonNull Drawable drawable) {
-        if (Build.VERSION.SDK_INT < 8 && drawable instanceof StateListDrawable) {
-            // StateListDrawable has a bug in mutate() on API 7
-            return false;
-        } else if (Build.VERSION.SDK_INT < 15 && drawable instanceof InsetDrawable) {
+        if (Build.VERSION.SDK_INT < 15 && drawable instanceof InsetDrawable) {
             return false;
         }  else if (Build.VERSION.SDK_INT < 15 && drawable instanceof GradientDrawable) {
             // GradientDrawable has a bug pre-ICS which results in mutate() resulting
diff --git a/v7/appcompat/src/android/support/v7/widget/FitWindowsLinearLayout.java b/v7/appcompat/src/android/support/v7/widget/FitWindowsLinearLayout.java
index e2f7a73..fd8737f 100644
--- a/v7/appcompat/src/android/support/v7/widget/FitWindowsLinearLayout.java
+++ b/v7/appcompat/src/android/support/v7/widget/FitWindowsLinearLayout.java
@@ -36,6 +36,7 @@
         super(context, attrs);
     }
 
+    @Override
     public void setOnFitSystemWindowsListener(OnFitSystemWindowsListener listener) {
         mListener = listener;
     }
diff --git a/v7/appcompat/src/android/support/v7/widget/LinearLayoutCompat.java b/v7/appcompat/src/android/support/v7/widget/LinearLayoutCompat.java
index a6dce15..523336b 100644
--- a/v7/appcompat/src/android/support/v7/widget/LinearLayoutCompat.java
+++ b/v7/appcompat/src/android/support/v7/widget/LinearLayoutCompat.java
@@ -487,7 +487,7 @@
     }
 
     /**
-     * <p>Returns the view at the specified index. This method can be overriden
+     * <p>Returns the view at the specified index. This method can be overridden
      * to take into account virtual children. Refer to
      * {@link android.widget.TableLayout} and {@link android.widget.TableRow}
      * for an example.</p>
@@ -1354,7 +1354,7 @@
 
     /**
      * <p>Measure the child according to the parent's measure specs. This
-     * method should be overriden by subclasses to force the sizing of
+     * method should be overridden by subclasses to force the sizing of
      * children. This method is called by {@link #measureVertical(int, int)} and
      * {@link #measureHorizontal(int, int)}.</p>
      *
diff --git a/v7/appcompat/src/android/support/v7/widget/ListPopupWindow.java b/v7/appcompat/src/android/support/v7/widget/ListPopupWindow.java
index 3a6a4e6..de11489 100644
--- a/v7/appcompat/src/android/support/v7/widget/ListPopupWindow.java
+++ b/v7/appcompat/src/android/support/v7/widget/ListPopupWindow.java
@@ -1126,6 +1126,7 @@
              * waiting for the normal UI pipeline to do it's job which is slower than this method.
              */
             mShowDropDownRunnable = new Runnable() {
+                @Override
                 public void run() {
                     // View layout should be all done before displaying the drop down.
                     View view = getAnchorView();
@@ -1144,6 +1145,7 @@
             mDropDownList.setFocusable(true);
             mDropDownList.setFocusableInTouchMode(true);
             mDropDownList.setOnItemSelectedListener(new OnItemSelectedListener() {
+                @Override
                 public void onItemSelected(AdapterView<?> parent, View view,
                         int position, long id) {
 
@@ -1156,6 +1158,7 @@
                     }
                 }
 
+                @Override
                 public void onNothingSelected(AdapterView<?> parent) {
                 }
             });
@@ -1169,7 +1172,7 @@
 
             View hintView = mPromptView;
             if (hintView != null) {
-                // if a hint has been specified, we accomodate more space for it and
+                // if a hint has been specified, we accommodate more space for it and
                 // add a text view in the drop down menu, at the bottom of the list
                 LinearLayout hintContainer = new LinearLayout(context);
                 hintContainer.setOrientation(LinearLayout.VERTICAL);
@@ -1303,12 +1306,14 @@
     }
 
     private class ListSelectorHider implements Runnable {
+        @Override
         public void run() {
             clearListSelection();
         }
     }
 
     private class ResizePopupRunnable implements Runnable {
+        @Override
         public void run() {
             if (mDropDownList != null && ViewCompat.isAttachedToWindow(mDropDownList)
                     && mDropDownList.getCount() > mDropDownList.getChildCount()
@@ -1320,6 +1325,7 @@
     }
 
     private class PopupTouchInterceptor implements OnTouchListener {
+        @Override
         public boolean onTouch(View v, MotionEvent event) {
             final int action = event.getAction();
             final int x = (int) event.getX();
@@ -1337,11 +1343,13 @@
     }
 
     private class PopupScrollListener implements ListView.OnScrollListener {
+        @Override
         public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount,
                 int totalItemCount) {
 
         }
 
+        @Override
         public void onScrollStateChanged(AbsListView view, int scrollState) {
             if (scrollState == SCROLL_STATE_TOUCH_SCROLL &&
                     !isInputMethodNotNeeded() && mPopup.getContentView() != null) {
diff --git a/v7/appcompat/src/android/support/v7/widget/ListViewCompat.java b/v7/appcompat/src/android/support/v7/widget/ListViewCompat.java
index 573a1f3..87056d1 100644
--- a/v7/appcompat/src/android/support/v7/widget/ListViewCompat.java
+++ b/v7/appcompat/src/android/support/v7/widget/ListViewCompat.java
@@ -319,7 +319,7 @@
             }
             child.measure(widthMeasureSpec, heightMeasureSpec);
 
-            // Since this view was measured directly aginst the parent measure
+            // Since this view was measured directly against the parent measure
             // spec, we must measure it again before reuse.
             child.forceLayout();
 
diff --git a/v7/appcompat/src/android/support/v7/widget/ScrollingTabContainerView.java b/v7/appcompat/src/android/support/v7/widget/ScrollingTabContainerView.java
index 06118bf..b05917a 100644
--- a/v7/appcompat/src/android/support/v7/widget/ScrollingTabContainerView.java
+++ b/v7/appcompat/src/android/support/v7/widget/ScrollingTabContainerView.java
@@ -216,10 +216,9 @@
         return spinner;
     }
 
+    @Override
     protected void onConfigurationChanged(Configuration newConfig) {
-        if (Build.VERSION.SDK_INT >= 8) {
-            super.onConfigurationChanged(newConfig);
-        }
+        super.onConfigurationChanged(newConfig);
 
         ActionBarPolicy abp = ActionBarPolicy.get(getContext());
         // Action bar can change size on configuration changes.
@@ -259,6 +258,7 @@
             removeCallbacks(mTabSelector);
         }
         mTabSelector = new Runnable() {
+            @Override
             public void run() {
                 final int scrollPos = tabView.getLeft() - (getWidth() - tabView.getWidth()) / 2;
                 smoothScrollTo(scrollPos, 0);
@@ -517,6 +517,7 @@
             }
         }
 
+        @Override
         public boolean onLongClick(View v) {
             final int[] screenPos = new int[2];
             getLocationOnScreen(screenPos);
@@ -569,6 +570,7 @@
     }
 
     private class TabClickListener implements OnClickListener {
+        @Override
         public void onClick(View view) {
             TabView tabView = (TabView) view;
             tabView.getTab().select();
diff --git a/v7/appcompat/src/android/support/v7/widget/SearchView.java b/v7/appcompat/src/android/support/v7/widget/SearchView.java
index 7ae8827..b605e75 100644
--- a/v7/appcompat/src/android/support/v7/widget/SearchView.java
+++ b/v7/appcompat/src/android/support/v7/widget/SearchView.java
@@ -115,8 +115,6 @@
     private static final boolean DBG = false;
     private static final String LOG_TAG = "SearchView";
 
-    private static final boolean IS_AT_LEAST_FROYO = Build.VERSION.SDK_INT >= 8;
-
     /**
      * Private constant for removing the microphone in the keyboard.
      */
@@ -186,6 +184,7 @@
      * initial UI setup. The show operation is asynchronous to account for this.
      */
     private Runnable mShowImeRunnable = new Runnable() {
+        @Override
         public void run() {
             InputMethodManager imm = (InputMethodManager)
                     getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
@@ -197,12 +196,14 @@
     };
 
     private final Runnable mUpdateDrawableStateRunnable = new Runnable() {
+        @Override
         public void run() {
             updateFocusedState();
         }
     };
 
     private Runnable mReleaseCursorRunnable = new Runnable() {
+        @Override
         public void run() {
             if (mSuggestionsAdapter != null && mSuggestionsAdapter instanceof SuggestionsAdapter) {
                 mSuggestionsAdapter.changeCursor(null);
@@ -345,7 +346,7 @@
 
         // Inform any listener of focus changes
         mSearchSrcTextView.setOnFocusChangeListener(new OnFocusChangeListener() {
-
+            @Override
             public void onFocusChange(View v, boolean hasFocus) {
                 if (mOnQueryTextFocusChangeListener != null) {
                     mOnQueryTextFocusChangeListener.onFocusChange(SearchView.this, hasFocus);
@@ -440,13 +441,11 @@
     public void setSearchableInfo(SearchableInfo searchable) {
         mSearchable = searchable;
         if (mSearchable != null) {
-            if (IS_AT_LEAST_FROYO) {
-                updateSearchAutoComplete();
-            }
+            updateSearchAutoComplete();
             updateQueryHint();
         }
         // Cache the voice search capability
-        mVoiceButtonEnabled = IS_AT_LEAST_FROYO && hasVoiceSearch();
+        mVoiceButtonEnabled = hasVoiceSearch();
 
         if (mVoiceButtonEnabled) {
             // Disable the microphone on the keyboard, as a mic is displayed near the text box
@@ -656,7 +655,7 @@
         final CharSequence hint;
         if (mQueryHint != null) {
             hint = mQueryHint;
-        } else if (IS_AT_LEAST_FROYO && mSearchable != null && mSearchable.getHintId() != 0) {
+        } else if (mSearchable != null && mSearchable.getHintId() != 0) {
             hint = getContext().getText(mSearchable.getHintId());
         } else {
             hint = mDefaultQueryHint;
@@ -925,7 +924,6 @@
         updateSubmitArea();
     }
 
-    @TargetApi(Build.VERSION_CODES.FROYO)
     private boolean hasVoiceSearch() {
         if (mSearchable != null && mSearchable.getVoiceSearchEnabled()) {
             Intent testIntent = null;
@@ -1026,7 +1024,7 @@
     }
 
     private final OnClickListener mOnClickListener = new OnClickListener() {
-
+        @Override
         public void onClick(View v) {
             if (v == mSearchButton) {
                 onSearchClicked();
@@ -1048,6 +1046,7 @@
      * focus.
      */
     View.OnKeyListener mTextKeyListener = new View.OnKeyListener() {
+        @Override
         public boolean onKey(View v, int keyCode, KeyEvent event) {
             // guard against possible race conditions
             if (mSearchable == null) {
@@ -1157,7 +1156,6 @@
     /**
      * Updates the auto-complete text view.
      */
-    @TargetApi(Build.VERSION_CODES.FROYO)
     private void updateSearchAutoComplete() {
         mSearchSrcTextView.setThreshold(mSearchable.getSuggestThreshold());
         mSearchSrcTextView.setImeOptions(mSearchable.getImeOptions());
@@ -1215,6 +1213,7 @@
         /**
          * Called when the input method default action key is pressed.
          */
+        @Override
         public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
             onSubmitQuery();
             return true;
@@ -1282,7 +1281,6 @@
         }
     }
 
-    @TargetApi(Build.VERSION_CODES.FROYO)
     private void onVoiceClicked() {
         // guard against possible race conditions
         if (mSearchable == null) {
@@ -1457,6 +1455,7 @@
         /**
          * Implements OnItemClickListener
          */
+        @Override
         public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
             if (DBG) Log.d(LOG_TAG, "onItemClick() position " + position);
             onItemClicked(position, KeyEvent.KEYCODE_UNKNOWN, null);
@@ -1468,6 +1467,7 @@
         /**
          * Implements OnItemSelectedListener
          */
+        @Override
         public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
             if (DBG) Log.d(LOG_TAG, "onItemSelected() position " + position);
             SearchView.this.onItemSelected(position);
@@ -1476,6 +1476,7 @@
         /**
          * Implements OnItemSelectedListener
          */
+        @Override
         public void onNothingSelected(AdapterView<?> parent) {
             if (DBG)
                 Log.d(LOG_TAG, "onNothingSelected()");
@@ -1601,16 +1602,13 @@
             intent.putExtra(SearchManager.ACTION_KEY, actionKey);
             intent.putExtra(SearchManager.ACTION_MSG, actionMsg);
         }
-        if (IS_AT_LEAST_FROYO) {
-            intent.setComponent(mSearchable.getSearchActivity());
-        }
+        intent.setComponent(mSearchable.getSearchActivity());
         return intent;
     }
 
     /**
      * Create and return an Intent that can launch the voice search activity for web search.
      */
-    @TargetApi(Build.VERSION_CODES.FROYO)
     private Intent createVoiceWebSearchIntent(Intent baseIntent, SearchableInfo searchable) {
         Intent voiceIntent = new Intent(baseIntent);
         ComponentName searchActivity = searchable.getSearchActivity();
@@ -1626,7 +1624,6 @@
      * @param baseIntent The voice app search intent to start from
      * @return A completely-configured intent ready to send to the voice search activity
      */
-    @TargetApi(Build.VERSION_CODES.FROYO)
     private Intent createVoiceAppSearchIntent(Intent baseIntent, SearchableInfo searchable) {
         ComponentName searchActivity = searchable.getSearchActivity();
 
@@ -1658,21 +1655,20 @@
         String language = null;
         int maxResults = 1;
 
-        if (Build.VERSION.SDK_INT >= 8) {
-            Resources resources = getResources();
-            if (searchable.getVoiceLanguageModeId() != 0) {
-                languageModel = resources.getString(searchable.getVoiceLanguageModeId());
-            }
-            if (searchable.getVoicePromptTextId() != 0) {
-                prompt = resources.getString(searchable.getVoicePromptTextId());
-            }
-            if (searchable.getVoiceLanguageId() != 0) {
-                language = resources.getString(searchable.getVoiceLanguageId());
-            }
-            if (searchable.getVoiceMaxResults() != 0) {
-                maxResults = searchable.getVoiceMaxResults();
-            }
+        Resources resources = getResources();
+        if (searchable.getVoiceLanguageModeId() != 0) {
+            languageModel = resources.getString(searchable.getVoiceLanguageModeId());
         }
+        if (searchable.getVoicePromptTextId() != 0) {
+            prompt = resources.getString(searchable.getVoicePromptTextId());
+        }
+        if (searchable.getVoiceLanguageId() != 0) {
+            language = resources.getString(searchable.getVoiceLanguageId());
+        }
+        if (searchable.getVoiceMaxResults() != 0) {
+            maxResults = searchable.getVoiceMaxResults();
+        }
+
         voiceIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, languageModel);
         voiceIntent.putExtra(RecognizerIntent.EXTRA_PROMPT, prompt);
         voiceIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, language);
@@ -1705,7 +1701,7 @@
             // use specific action if supplied, or default action if supplied, or fixed default
             String action = getColumnString(c, SearchManager.SUGGEST_COLUMN_INTENT_ACTION);
 
-            if (action == null && Build.VERSION.SDK_INT >= 8) {
+            if (action == null) {
                 action = mSearchable.getSuggestIntentAction();
             }
             if (action == null) {
@@ -1714,7 +1710,7 @@
 
             // use specific data if supplied, or default data if supplied
             String data = getColumnString(c, SearchManager.SUGGEST_COLUMN_INTENT_DATA);
-            if (IS_AT_LEAST_FROYO && data == null) {
+            if (data == null) {
                 data = mSearchable.getSuggestIntentData();
             }
             // then, if an ID was provided, append it.
@@ -1757,14 +1753,16 @@
      * Callback to watch the text field for empty/non-empty
      */
     private TextWatcher mTextWatcher = new TextWatcher() {
-
+        @Override
         public void beforeTextChanged(CharSequence s, int start, int before, int after) { }
 
+        @Override
         public void onTextChanged(CharSequence s, int start,
                 int before, int after) {
             SearchView.this.onTextChanged(s);
         }
 
+        @Override
         public void afterTextChanged(Editable s) {
         }
     };
diff --git a/v7/appcompat/src/android/support/v7/widget/SuggestionsAdapter.java b/v7/appcompat/src/android/support/v7/widget/SuggestionsAdapter.java
index 6251e0e..0f4351d 100644
--- a/v7/appcompat/src/android/support/v7/widget/SuggestionsAdapter.java
+++ b/v7/appcompat/src/android/support/v7/widget/SuggestionsAdapter.java
@@ -324,6 +324,7 @@
         }
     }
 
+    @Override
     public void onClick(View v) {
         Object tag = v.getTag();
         if (tag instanceof CharSequence) {
@@ -616,7 +617,7 @@
      * Gets the activity or application icon for an activity.
      *
      * @param component Name of an activity.
-     * @return A drawable, or {@code null} if neither the acitivy or the application
+     * @return A drawable, or {@code null} if neither the activity or the application
      *         have an icon set.
      */
     private Drawable getActivityIcon(ComponentName component) {
diff --git a/v7/appcompat/src/android/support/v7/widget/SwitchCompat.java b/v7/appcompat/src/android/support/v7/widget/SwitchCompat.java
index 74f4194..3a24216 100644
--- a/v7/appcompat/src/android/support/v7/widget/SwitchCompat.java
+++ b/v7/appcompat/src/android/support/v7/widget/SwitchCompat.java
@@ -16,7 +16,6 @@
 
 package android.support.v7.widget;
 
-import android.annotation.TargetApi;
 import android.content.Context;
 import android.content.res.ColorStateList;
 import android.content.res.Resources;
@@ -847,7 +846,6 @@
         }
     }
 
-    @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
     @Override
     public void onPopulateAccessibilityEvent(AccessibilityEvent event) {
         super.onPopulateAccessibilityEvent(event);
@@ -1392,7 +1390,6 @@
         }
     }
 
-    @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
     @Override
     public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
         super.onInitializeAccessibilityEvent(event);
diff --git a/v7/appcompat/src/android/support/v7/app/VectorEnabledTintResources.java b/v7/appcompat/src/android/support/v7/widget/VectorEnabledTintResources.java
similarity index 100%
rename from v7/appcompat/src/android/support/v7/app/VectorEnabledTintResources.java
rename to v7/appcompat/src/android/support/v7/widget/VectorEnabledTintResources.java
diff --git a/v7/appcompat/tests/AndroidManifest.xml b/v7/appcompat/tests/AndroidManifest.xml
index 539030d..ee479cf 100644
--- a/v7/appcompat/tests/AndroidManifest.xml
+++ b/v7/appcompat/tests/AndroidManifest.xml
@@ -19,7 +19,7 @@
           package="android.support.v7.appcompat.test">
 
     <uses-sdk
-            android:minSdkVersion="7"
+            android:minSdkVersion="9"
             android:targetSdkVersion="23"
             tools:overrideLibrary="android.support.test, android.app, android.support.test.rule,
                       android.support.test.espresso, android.support.test.espresso.idling"/>
diff --git a/v7/appcompat/tests/res/values/styles.xml b/v7/appcompat/tests/res/values/styles.xml
index 0232a2b..1b416a4 100644
--- a/v7/appcompat/tests/res/values/styles.xml
+++ b/v7/appcompat/tests/res/values/styles.xml
@@ -43,11 +43,11 @@
     </style>
 
     <style name="MagentaSpinnerPopupTheme">
-        <item name="android:background">@color/test_magenta</item>
+        <item name="android:colorBackground">@color/test_magenta</item>
     </style>
 
     <style name="OceanSpinnerPopupTheme">
-        <item name="android:background">@color/ocean_default</item>
+        <item name="android:colorBackground">@color/ocean_default</item>
     </style>
 
     <style name="PopupEmptyStyle" />
diff --git a/v7/appcompat/tests/src/android/support/v7/testutils/TestUtils.java b/v7/appcompat/tests/src/android/support/v7/testutils/TestUtils.java
index d258e1f..686bfb5 100644
--- a/v7/appcompat/tests/src/android/support/v7/testutils/TestUtils.java
+++ b/v7/appcompat/tests/src/android/support/v7/testutils/TestUtils.java
@@ -14,14 +14,8 @@
  * limitations under the License.
  */
 
-
 package android.support.v7.testutils;
 
-import android.support.v4.util.Pair;
-import android.view.View;
-import android.view.ViewParent;
-import junit.framework.Assert;
-
 import android.graphics.Bitmap;
 import android.graphics.Canvas;
 import android.graphics.Color;
@@ -29,6 +23,10 @@
 import android.os.SystemClock;
 import android.support.annotation.ColorInt;
 import android.support.annotation.NonNull;
+import android.support.v4.util.Pair;
+import android.view.View;
+import android.view.ViewParent;
+import junit.framework.Assert;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -113,17 +111,17 @@
     public static void assertAllPixelsOfColor(String failMessagePrefix, @NonNull Drawable drawable,
             int drawableWidth, int drawableHeight, boolean callSetBounds, @ColorInt int color,
             int allowedComponentVariance, boolean throwExceptionIfFails) {
-            // Create a bitmap
-            Bitmap bitmap = Bitmap.createBitmap(drawableWidth, drawableHeight,
-                    Bitmap.Config.ARGB_8888);
-            // Create a canvas that wraps the bitmap
-            Canvas canvas = new Canvas(bitmap);
-            if (callSetBounds) {
-                // Configure the drawable to have bounds that match the passed size
-                drawable.setBounds(0, 0, drawableWidth, drawableHeight);
-            }
-            // And ask the drawable to draw itself to the canvas / bitmap
-            drawable.draw(canvas);
+        // Create a bitmap
+        Bitmap bitmap = Bitmap.createBitmap(drawableWidth, drawableHeight,
+                Bitmap.Config.ARGB_8888);
+        // Create a canvas that wraps the bitmap
+        Canvas canvas = new Canvas(bitmap);
+        if (callSetBounds) {
+            // Configure the drawable to have bounds that match the passed size
+            drawable.setBounds(0, 0, drawableWidth, drawableHeight);
+        }
+        // And ask the drawable to draw itself to the canvas / bitmap
+        drawable.draw(canvas);
 
         try {
             assertAllPixelsOfColor(failMessagePrefix, bitmap, drawableWidth, drawableHeight, color,
@@ -148,35 +146,15 @@
         for (int row = 0; row < bitmapHeight; row++) {
             bitmap.getPixels(rowPixels, 0, bitmapWidth, 0, row, bitmapWidth, 1);
             for (int column = 0; column < bitmapWidth; column++) {
-                int sourceAlpha = Color.alpha(rowPixels[column]);
-                int sourceRed = Color.red(rowPixels[column]);
-                int sourceGreen = Color.green(rowPixels[column]);
-                int sourceBlue = Color.blue(rowPixels[column]);
-
-                int expectedAlpha = Color.alpha(color);
-                int expectedRed = Color.red(color);
-                int expectedGreen = Color.green(color);
-                int expectedBlue = Color.blue(color);
-
-                int varianceAlpha = Math.abs(sourceAlpha - expectedAlpha);
-                int varianceRed = Math.abs(sourceRed - expectedRed);
-                int varianceGreen = Math.abs(sourceGreen - expectedGreen);
-                int varianceBlue = Math.abs(sourceBlue - expectedBlue);
-
-                boolean isColorMatch = (varianceAlpha <= allowedComponentVariance)
-                        && (varianceRed <= allowedComponentVariance)
-                        && (varianceGreen <= allowedComponentVariance)
-                        && (varianceBlue <= allowedComponentVariance);
-
-                if (!isColorMatch) {
+                @ColorInt int colorAtCurrPixel = rowPixels[column];
+                if (!areColorsTheSameWithTolerance(color, colorAtCurrPixel,
+                        allowedComponentVariance)) {
                     String mismatchDescription = failMessagePrefix
-                            + ": expected all drawable colors to be ["
-                            + expectedAlpha + "," + expectedRed + ","
-                            + expectedGreen + "," + expectedBlue
-                            + "] but at position (" + row + "," + column + ") out of ("
-                            + bitmapWidth + "," + bitmapHeight + ") found ["
-                            + sourceAlpha + "," + sourceRed + ","
-                            + sourceGreen + "," + sourceBlue + "]";
+                            + ": expected all drawable colors to be "
+                            + formatColorToHex(color)
+                            + " but at position (" + row + "," + column + ") out of ("
+                            + bitmapWidth + "," + bitmapHeight + ") found "
+                            + formatColorToHex(colorAtCurrPixel);
                     if (throwExceptionIfFails) {
                         throw new RuntimeException(mismatchDescription);
                     } else {
@@ -187,6 +165,73 @@
         }
     }
 
+    /**
+     * Checks whether the center pixel in the specified bitmap is of the same specified color.
+     *
+     * In case there is a color mismatch, the behavior of this method depends on the
+     * <code>throwExceptionIfFails</code> parameter. If it is <code>true</code>, this method will
+     * throw an <code>Exception</code> describing the mismatch. Otherwise this method will call
+     * <code>Assert.fail</code> with detailed description of the mismatch.
+     */
+    public static void assertCenterPixelOfColor(String failMessagePrefix, @NonNull Bitmap bitmap,
+            @ColorInt int color,
+            int allowedComponentVariance, boolean throwExceptionIfFails) {
+        final int centerX = bitmap.getWidth() / 2;
+        final int centerY = bitmap.getHeight() / 2;
+        final @ColorInt int colorAtCenterPixel = bitmap.getPixel(centerX, centerY);
+        if (!areColorsTheSameWithTolerance(color, colorAtCenterPixel,
+                allowedComponentVariance)) {
+            String mismatchDescription = failMessagePrefix
+                    + ": expected all drawable colors to be "
+                    + formatColorToHex(color)
+                    + " but at position (" + centerX + "," + centerY + ") out of ("
+                    + bitmap.getWidth() + "," + bitmap.getHeight() + ") found"
+                    + formatColorToHex(colorAtCenterPixel);
+            if (throwExceptionIfFails) {
+                throw new RuntimeException(mismatchDescription);
+            } else {
+                Assert.fail(mismatchDescription);
+            }
+        }
+    }
+
+    /**
+     * Formats the passed integer-packed color into the #AARRGGBB format.
+     */
+    private static String formatColorToHex(@ColorInt int color) {
+        return String.format("#%08X", (0xFFFFFFFF & color));
+    }
+
+    /**
+     * Compares two integer-packed colors to be equal, each component within the specified
+     * allowed variance. Returns <code>true</code> if the two colors are sufficiently equal
+     * and <code>false</code> otherwise.
+     */
+    private static boolean areColorsTheSameWithTolerance(@ColorInt int expectedColor,
+            @ColorInt int actualColor, int allowedComponentVariance) {
+        int sourceAlpha = Color.alpha(actualColor);
+        int sourceRed = Color.red(actualColor);
+        int sourceGreen = Color.green(actualColor);
+        int sourceBlue = Color.blue(actualColor);
+
+        int expectedAlpha = Color.alpha(expectedColor);
+        int expectedRed = Color.red(expectedColor);
+        int expectedGreen = Color.green(expectedColor);
+        int expectedBlue = Color.blue(expectedColor);
+
+        int varianceAlpha = Math.abs(sourceAlpha - expectedAlpha);
+        int varianceRed = Math.abs(sourceRed - expectedRed);
+        int varianceGreen = Math.abs(sourceGreen - expectedGreen);
+        int varianceBlue = Math.abs(sourceBlue - expectedBlue);
+
+        boolean isColorMatch = (varianceAlpha <= allowedComponentVariance)
+                && (varianceRed <= allowedComponentVariance)
+                && (varianceGreen <= allowedComponentVariance)
+                && (varianceBlue <= allowedComponentVariance);
+
+        return isColorMatch;
+    }
+
     public static void waitForActivityDestroyed(BaseTestActivity activity) {
         while (!activity.isDestroyed()) {
             SystemClock.sleep(30);
diff --git a/v7/appcompat/tests/src/android/support/v7/testutils/TestUtilsMatchers.java b/v7/appcompat/tests/src/android/support/v7/testutils/TestUtilsMatchers.java
index 2c20aa8..ac10d3b 100644
--- a/v7/appcompat/tests/src/android/support/v7/testutils/TestUtilsMatchers.java
+++ b/v7/appcompat/tests/src/android/support/v7/testutils/TestUtilsMatchers.java
@@ -117,7 +117,8 @@
      * Returns a matcher that matches <code>View</code>s whose combined background starting
      * from the view and up its ancestor chain matches the specified color.
      */
-    public static Matcher isCombinedBackground(@ColorInt final int color) {
+    public static Matcher isCombinedBackground(@ColorInt final int color,
+            final boolean onlyTestCenterPixel) {
         return new BoundedMatcher<View, View>(View.class) {
             private String failedComparisonDescription;
 
@@ -133,9 +134,14 @@
                 // Create a bitmap with combined backgrounds of the view and its ancestors.
                 Bitmap combinedBackgroundBitmap = TestUtils.getCombinedBackgroundBitmap(view);
                 try {
-                    TestUtils.assertAllPixelsOfColor("", combinedBackgroundBitmap,
-                            combinedBackgroundBitmap.getWidth(),
-                            combinedBackgroundBitmap.getHeight(), color, 0, true);
+                    if (onlyTestCenterPixel) {
+                        TestUtils.assertCenterPixelOfColor("", combinedBackgroundBitmap,
+                                color, 0, true);
+                    } else {
+                        TestUtils.assertAllPixelsOfColor("", combinedBackgroundBitmap,
+                                combinedBackgroundBitmap.getWidth(),
+                                combinedBackgroundBitmap.getHeight(), color, 0, true);
+                    }
                     // If we are here, the color comparison has passed.
                     failedComparisonDescription = null;
                     return true;
diff --git a/v7/appcompat/tests/src/android/support/v7/widget/AppCompatButtonTest.java b/v7/appcompat/tests/src/android/support/v7/widget/AppCompatButtonTest.java
index 46925ce..340737e 100644
--- a/v7/appcompat/tests/src/android/support/v7/widget/AppCompatButtonTest.java
+++ b/v7/appcompat/tests/src/android/support/v7/widget/AppCompatButtonTest.java
@@ -60,15 +60,15 @@
         assertEquals("Button starts in all caps off", text2,
                 button2.getLayout().getText());
 
-        // Toggle all-caps mode on the two buttons. Note that as with the core Button,
-        // setting a style with textAllCaps=false on a AppCompatButton with all-caps on
-        // will have no effect.
-        onView(withId(R.id.button_caps1)).perform(setTextAppearance(R.style.TextStyleAllCapsOff));
-        onView(withId(R.id.button_caps2)).perform(setTextAppearance(R.style.TextStyleAllCapsOn));
-
-        assertEquals("Button is still in all caps on", text1.toUpperCase(),
+        // Toggle all-caps mode on the two buttons
+        onView(withId(R.id.button_caps1)).perform(
+                setTextAppearance(R.style.TextStyleAllCapsOff));
+        assertEquals("Button is now in all caps off", text1,
                 button1.getLayout().getText());
-        assertEquals("Button is in all caps on", text2.toUpperCase(),
+
+        onView(withId(R.id.button_caps2)).perform(
+                setTextAppearance(R.style.TextStyleAllCapsOn));
+        assertEquals("Button is now in all caps on", text2.toUpperCase(),
                 button2.getLayout().getText());
     }
 
diff --git a/v7/appcompat/tests/src/android/support/v7/widget/AppCompatSpinnerTest.java b/v7/appcompat/tests/src/android/support/v7/widget/AppCompatSpinnerTest.java
index 1d9ea9f..52dd727 100644
--- a/v7/appcompat/tests/src/android/support/v7/widget/AppCompatSpinnerTest.java
+++ b/v7/appcompat/tests/src/android/support/v7/widget/AppCompatSpinnerTest.java
@@ -77,8 +77,11 @@
         // matching background.
         String itemText = (String) spinner.getAdapter().getItem(2);
         Matcher popupContentMatcher = hasChild(withText(itemText));
+        // Note that we are only testing the center pixel of the combined popup background. This
+        // is to "eliminate" otherwise hacky code that would need to skip over rounded corners and
+        // drop shadow of the combined visual appearance of a popup.
         onView(popupContentMatcher).inRoot(isPlatformPopup()).check(
-                matches(isCombinedBackground(expectedPopupColor)));
+                matches(isCombinedBackground(expectedPopupColor, true)));
 
         // Click an entry in the popup to dismiss it
         onView(withText(itemText)).perform(click());
diff --git a/v7/appcompat/tests/src/android/support/v7/widget/AppCompatTextViewTest.java b/v7/appcompat/tests/src/android/support/v7/widget/AppCompatTextViewTest.java
index 0b19ac7..8da53d6 100644
--- a/v7/appcompat/tests/src/android/support/v7/widget/AppCompatTextViewTest.java
+++ b/v7/appcompat/tests/src/android/support/v7/widget/AppCompatTextViewTest.java
@@ -65,12 +65,12 @@
         // Toggle all-caps mode on the two text views
         onView(withId(R.id.text_view_caps1)).perform(
                 setTextAppearance(R.style.TextStyleAllCapsOff));
-        assertEquals("Text view is still in all caps on", text1,
+        assertEquals("Text view is now in all caps off", text1,
                 textView1.getLayout().getText());
 
         onView(withId(R.id.text_view_caps2)).perform(
                 setTextAppearance(R.style.TextStyleAllCapsOn));
-        assertEquals("Text view is in all caps on", text2.toUpperCase(),
+        assertEquals("Text view is now in all caps on", text2.toUpperCase(),
                 textView2.getLayout().getText());
     }
 
diff --git a/v7/cardview/Android.mk b/v7/cardview/Android.mk
index cc51239..7861dc1 100644
--- a/v7/cardview/Android.mk
+++ b/v7/cardview/Android.mk
@@ -28,46 +28,38 @@
 LOCAL_JAVA_LANGUAGE_VERSION := 1.7
 include $(BUILD_STATIC_JAVA_LIBRARY)
 
-support_module_src_files := $(LOCAL_SRC_FILES)
-
 # A helper sub-library to resolve cyclic dependencies between CardView and platform dependent
 # implementations
 include $(CLEAR_VARS)
 LOCAL_MODULE := android-support-v7-cardview-base
-LOCAL_SDK_VERSION := 7
+LOCAL_SDK_VERSION := 9
 LOCAL_SRC_FILES := $(call all-java-files-under, base)
 LOCAL_JAVA_LIBRARIES := android-support-annotations
 LOCAL_JAVA_LANGUAGE_VERSION := 1.7
 include $(BUILD_STATIC_JAVA_LIBRARY)
 
-support_module_src_files += $(LOCAL_SRC_FILES)
-
-# A helper sub-library that makes direct use of Eclair MR1 APIs
+# A helper sub-library that makes direct use of Gingerbread APIs
 include $(CLEAR_VARS)
-LOCAL_MODULE := android-support-v7-cardview-eclair-mr1
-LOCAL_SDK_VERSION := 7
-LOCAL_SRC_FILES := $(call all-java-files-under, eclair-mr1)
+LOCAL_MODULE := android-support-v7-cardview-gingerbread
+LOCAL_SDK_VERSION := 9
+LOCAL_SRC_FILES := $(call all-java-files-under, gingerbread)
 LOCAL_STATIC_JAVA_LIBRARIES := android-support-v7-cardview-base
 LOCAL_JAVA_LIBRARIES := android-support-v7-cardview-res \
     android-support-annotations
 LOCAL_JAVA_LANGUAGE_VERSION := 1.7
 include $(BUILD_STATIC_JAVA_LIBRARY)
 
-support_module_src_files += $(LOCAL_SRC_FILES)
-
 # A helper sub-library that makes direct use of JB MR1 APIs
 include $(CLEAR_VARS)
 LOCAL_MODULE := android-support-v7-cardview-jellybean-mr1
 LOCAL_SDK_VERSION := 17
 LOCAL_SRC_FILES := $(call all-java-files-under, jellybean-mr1)
-LOCAL_STATIC_JAVA_LIBRARIES := android-support-v7-cardview-eclair-mr1
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-v7-cardview-gingerbread
 LOCAL_JAVA_LIBRARIES := android-support-v7-cardview-res \
     android-support-annotations
 LOCAL_JAVA_LANGUAGE_VERSION := 1.7
 include $(BUILD_STATIC_JAVA_LIBRARY)
 
-support_module_src_files += $(LOCAL_SRC_FILES)
-
 # A helper sub-library that makes direct use of L APIs
 include $(CLEAR_VARS)
 LOCAL_MODULE := android-support-v7-cardview-api21
@@ -79,8 +71,6 @@
 LOCAL_JAVA_LANGUAGE_VERSION := 1.7
 include $(BUILD_STATIC_JAVA_LIBRARY)
 
-support_module_src_files += $(LOCAL_SRC_FILES)
-
 # Here is the final static library that apps can link against.
 # Applications that use this library must specify
 #
@@ -90,7 +80,7 @@
 include $(CLEAR_VARS)
 LOCAL_USE_AAPT2 := true
 LOCAL_MODULE := android-support-v7-cardview
-LOCAL_SDK_VERSION := 7
+LOCAL_SDK_VERSION := 9
 LOCAL_SDK_RES_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
 LOCAL_SRC_FILES := $(call all-java-files-under,src)
 LOCAL_STATIC_JAVA_LIBRARIES := android-support-v7-cardview-api21
@@ -100,13 +90,3 @@
 LOCAL_JAVA_LANGUAGE_VERSION := 1.7
 LOCAL_AAPT_FLAGS := --add-javadoc-annotation doconly
 include $(BUILD_STATIC_JAVA_LIBRARY)
-
-support_module_src_files += $(LOCAL_SRC_FILES)
-
-# API Check
-# ---------------------------------------------
-support_module := $(LOCAL_MODULE)
-support_module_api_dir := $(LOCAL_PATH)/api
-support_module_java_libraries := $(LOCAL_JAVA_LIBRARIES)
-support_module_java_packages := android.support.v7.widget
-include $(SUPPORT_API_CHECK)
diff --git a/v7/cardview/AndroidManifest.xml b/v7/cardview/AndroidManifest.xml
index 3ef02dc..c35e369 100644
--- a/v7/cardview/AndroidManifest.xml
+++ b/v7/cardview/AndroidManifest.xml
@@ -15,6 +15,6 @@
 -->
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
           package="android.support.v7.cardview">
-    <uses-sdk android:minSdkVersion="7"/>
+    <uses-sdk android:minSdkVersion="9"/>
     <application />
 </manifest>
diff --git a/v7/cardview/api/22.0.0.txt b/v7/cardview/api/22.0.0.txt
deleted file mode 100644
index bb62ed7..0000000
--- a/v7/cardview/api/22.0.0.txt
+++ /dev/null
@@ -1,26 +0,0 @@
-package android.support.v7.widget {
-
-  public class CardView extends android.widget.FrameLayout {
-    ctor public CardView(android.content.Context);
-    ctor public CardView(android.content.Context, android.util.AttributeSet);
-    ctor public CardView(android.content.Context, android.util.AttributeSet, int);
-    method public float getCardElevation();
-    method public int getContentPaddingBottom();
-    method public int getContentPaddingLeft();
-    method public int getContentPaddingRight();
-    method public int getContentPaddingTop();
-    method public float getMaxCardElevation();
-    method public boolean getPreventCornerOverlap();
-    method public float getRadius();
-    method public boolean getUseCompatPadding();
-    method public void setCardBackgroundColor(int);
-    method public void setCardElevation(float);
-    method public void setContentPadding(int, int, int, int);
-    method public void setMaxCardElevation(float);
-    method public void setPreventCornerOverlap(boolean);
-    method public void setRadius(float);
-    method public void setUseCompatPadding(boolean);
-  }
-
-}
-
diff --git a/v7/cardview/api/22.1.0.txt b/v7/cardview/api/22.1.0.txt
deleted file mode 100644
index bb62ed7..0000000
--- a/v7/cardview/api/22.1.0.txt
+++ /dev/null
@@ -1,26 +0,0 @@
-package android.support.v7.widget {
-
-  public class CardView extends android.widget.FrameLayout {
-    ctor public CardView(android.content.Context);
-    ctor public CardView(android.content.Context, android.util.AttributeSet);
-    ctor public CardView(android.content.Context, android.util.AttributeSet, int);
-    method public float getCardElevation();
-    method public int getContentPaddingBottom();
-    method public int getContentPaddingLeft();
-    method public int getContentPaddingRight();
-    method public int getContentPaddingTop();
-    method public float getMaxCardElevation();
-    method public boolean getPreventCornerOverlap();
-    method public float getRadius();
-    method public boolean getUseCompatPadding();
-    method public void setCardBackgroundColor(int);
-    method public void setCardElevation(float);
-    method public void setContentPadding(int, int, int, int);
-    method public void setMaxCardElevation(float);
-    method public void setPreventCornerOverlap(boolean);
-    method public void setRadius(float);
-    method public void setUseCompatPadding(boolean);
-  }
-
-}
-
diff --git a/v7/cardview/api/22.2.0.txt b/v7/cardview/api/22.2.0.txt
deleted file mode 100644
index bb62ed7..0000000
--- a/v7/cardview/api/22.2.0.txt
+++ /dev/null
@@ -1,26 +0,0 @@
-package android.support.v7.widget {
-
-  public class CardView extends android.widget.FrameLayout {
-    ctor public CardView(android.content.Context);
-    ctor public CardView(android.content.Context, android.util.AttributeSet);
-    ctor public CardView(android.content.Context, android.util.AttributeSet, int);
-    method public float getCardElevation();
-    method public int getContentPaddingBottom();
-    method public int getContentPaddingLeft();
-    method public int getContentPaddingRight();
-    method public int getContentPaddingTop();
-    method public float getMaxCardElevation();
-    method public boolean getPreventCornerOverlap();
-    method public float getRadius();
-    method public boolean getUseCompatPadding();
-    method public void setCardBackgroundColor(int);
-    method public void setCardElevation(float);
-    method public void setContentPadding(int, int, int, int);
-    method public void setMaxCardElevation(float);
-    method public void setPreventCornerOverlap(boolean);
-    method public void setRadius(float);
-    method public void setUseCompatPadding(boolean);
-  }
-
-}
-
diff --git a/v7/cardview/api/22.2.1.txt b/v7/cardview/api/22.2.1.txt
deleted file mode 100644
index bb62ed7..0000000
--- a/v7/cardview/api/22.2.1.txt
+++ /dev/null
@@ -1,26 +0,0 @@
-package android.support.v7.widget {
-
-  public class CardView extends android.widget.FrameLayout {
-    ctor public CardView(android.content.Context);
-    ctor public CardView(android.content.Context, android.util.AttributeSet);
-    ctor public CardView(android.content.Context, android.util.AttributeSet, int);
-    method public float getCardElevation();
-    method public int getContentPaddingBottom();
-    method public int getContentPaddingLeft();
-    method public int getContentPaddingRight();
-    method public int getContentPaddingTop();
-    method public float getMaxCardElevation();
-    method public boolean getPreventCornerOverlap();
-    method public float getRadius();
-    method public boolean getUseCompatPadding();
-    method public void setCardBackgroundColor(int);
-    method public void setCardElevation(float);
-    method public void setContentPadding(int, int, int, int);
-    method public void setMaxCardElevation(float);
-    method public void setPreventCornerOverlap(boolean);
-    method public void setRadius(float);
-    method public void setUseCompatPadding(boolean);
-  }
-
-}
-
diff --git a/v7/cardview/api/23.0.0.txt b/v7/cardview/api/23.0.0.txt
deleted file mode 100644
index bb62ed7..0000000
--- a/v7/cardview/api/23.0.0.txt
+++ /dev/null
@@ -1,26 +0,0 @@
-package android.support.v7.widget {
-
-  public class CardView extends android.widget.FrameLayout {
-    ctor public CardView(android.content.Context);
-    ctor public CardView(android.content.Context, android.util.AttributeSet);
-    ctor public CardView(android.content.Context, android.util.AttributeSet, int);
-    method public float getCardElevation();
-    method public int getContentPaddingBottom();
-    method public int getContentPaddingLeft();
-    method public int getContentPaddingRight();
-    method public int getContentPaddingTop();
-    method public float getMaxCardElevation();
-    method public boolean getPreventCornerOverlap();
-    method public float getRadius();
-    method public boolean getUseCompatPadding();
-    method public void setCardBackgroundColor(int);
-    method public void setCardElevation(float);
-    method public void setContentPadding(int, int, int, int);
-    method public void setMaxCardElevation(float);
-    method public void setPreventCornerOverlap(boolean);
-    method public void setRadius(float);
-    method public void setUseCompatPadding(boolean);
-  }
-
-}
-
diff --git a/v7/cardview/api/23.1.0.txt b/v7/cardview/api/23.1.0.txt
deleted file mode 100644
index bb62ed7..0000000
--- a/v7/cardview/api/23.1.0.txt
+++ /dev/null
@@ -1,26 +0,0 @@
-package android.support.v7.widget {
-
-  public class CardView extends android.widget.FrameLayout {
-    ctor public CardView(android.content.Context);
-    ctor public CardView(android.content.Context, android.util.AttributeSet);
-    ctor public CardView(android.content.Context, android.util.AttributeSet, int);
-    method public float getCardElevation();
-    method public int getContentPaddingBottom();
-    method public int getContentPaddingLeft();
-    method public int getContentPaddingRight();
-    method public int getContentPaddingTop();
-    method public float getMaxCardElevation();
-    method public boolean getPreventCornerOverlap();
-    method public float getRadius();
-    method public boolean getUseCompatPadding();
-    method public void setCardBackgroundColor(int);
-    method public void setCardElevation(float);
-    method public void setContentPadding(int, int, int, int);
-    method public void setMaxCardElevation(float);
-    method public void setPreventCornerOverlap(boolean);
-    method public void setRadius(float);
-    method public void setUseCompatPadding(boolean);
-  }
-
-}
-
diff --git a/v7/cardview/api/23.1.1.txt b/v7/cardview/api/23.1.1.txt
deleted file mode 100644
index bb62ed7..0000000
--- a/v7/cardview/api/23.1.1.txt
+++ /dev/null
@@ -1,26 +0,0 @@
-package android.support.v7.widget {
-
-  public class CardView extends android.widget.FrameLayout {
-    ctor public CardView(android.content.Context);
-    ctor public CardView(android.content.Context, android.util.AttributeSet);
-    ctor public CardView(android.content.Context, android.util.AttributeSet, int);
-    method public float getCardElevation();
-    method public int getContentPaddingBottom();
-    method public int getContentPaddingLeft();
-    method public int getContentPaddingRight();
-    method public int getContentPaddingTop();
-    method public float getMaxCardElevation();
-    method public boolean getPreventCornerOverlap();
-    method public float getRadius();
-    method public boolean getUseCompatPadding();
-    method public void setCardBackgroundColor(int);
-    method public void setCardElevation(float);
-    method public void setContentPadding(int, int, int, int);
-    method public void setMaxCardElevation(float);
-    method public void setPreventCornerOverlap(boolean);
-    method public void setRadius(float);
-    method public void setUseCompatPadding(boolean);
-  }
-
-}
-
diff --git a/v7/cardview/api/current.txt b/v7/cardview/api/current.txt
deleted file mode 100644
index 6732501..0000000
--- a/v7/cardview/api/current.txt
+++ /dev/null
@@ -1,28 +0,0 @@
-package android.support.v7.widget {
-
-  public class CardView extends android.widget.FrameLayout {
-    ctor public CardView(android.content.Context);
-    ctor public CardView(android.content.Context, android.util.AttributeSet);
-    ctor public CardView(android.content.Context, android.util.AttributeSet, int);
-    method public android.content.res.ColorStateList getCardBackgroundColor();
-    method public float getCardElevation();
-    method public int getContentPaddingBottom();
-    method public int getContentPaddingLeft();
-    method public int getContentPaddingRight();
-    method public int getContentPaddingTop();
-    method public float getMaxCardElevation();
-    method public boolean getPreventCornerOverlap();
-    method public float getRadius();
-    method public boolean getUseCompatPadding();
-    method public void setCardBackgroundColor(int);
-    method public void setCardBackgroundColor(android.content.res.ColorStateList);
-    method public void setCardElevation(float);
-    method public void setContentPadding(int, int, int, int);
-    method public void setMaxCardElevation(float);
-    method public void setPreventCornerOverlap(boolean);
-    method public void setRadius(float);
-    method public void setUseCompatPadding(boolean);
-  }
-
-}
-
diff --git a/v7/cardview/api/removed.txt b/v7/cardview/api/removed.txt
deleted file mode 100644
index e69de29..0000000
--- a/v7/cardview/api/removed.txt
+++ /dev/null
diff --git a/v7/cardview/build.gradle b/v7/cardview/build.gradle
index 65ca583..e9e0ab5 100644
--- a/v7/cardview/build.gradle
+++ b/v7/cardview/build.gradle
@@ -11,7 +11,7 @@
     compileSdkVersion project.ext.currentSdk
 
     defaultConfig {
-        minSdkVersion 7
+        minSdkVersion 9
         // TODO: get target from branch
         //targetSdkVersion 19
     }
@@ -23,8 +23,8 @@
 
     sourceSets {
         main.manifest.srcFile 'AndroidManifest.xml'
-        main.java.srcDirs = ['base', 'eclair-mr1', 'jellybean-mr1', 'api21', 'src']
-        main.aidl.srcDirs = ['base', 'eclair-mr1', 'jellybean-mr1', 'api21', 'src']
+        main.java.srcDirs = ['base', 'gingerbread', 'jellybean-mr1', 'api21', 'src']
+        main.aidl.srcDirs = ['base', 'gingerbread', 'jellybean-mr1', 'api21', 'src']
         main.res.srcDirs = ['res']
 
         androidTest.setRoot('tests')
diff --git a/v7/cardview/eclair-mr1/android/support/v7/widget/CardViewEclairMr1.java b/v7/cardview/eclair-mr1/android/support/v7/widget/CardViewEclairMr1.java
deleted file mode 100644
index e32a0a0..0000000
--- a/v7/cardview/eclair-mr1/android/support/v7/widget/CardViewEclairMr1.java
+++ /dev/null
@@ -1,171 +0,0 @@
-/*
- * Copyright (C) 2014 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 android.support.v7.widget;
-
-import android.content.Context;
-import android.content.res.ColorStateList;
-import android.graphics.Canvas;
-import android.graphics.Paint;
-import android.graphics.Rect;
-import android.graphics.RectF;
-import android.support.annotation.ColorInt;
-import android.support.annotation.Nullable;
-
-class CardViewEclairMr1 implements CardViewImpl {
-
-    final RectF sCornerRect = new RectF();
-
-    @Override
-    public void initStatic() {
-        // Draws a round rect using 7 draw operations. This is faster than using
-        // canvas.drawRoundRect before JBMR1 because API 11-16 used alpha mask textures to draw
-        // shapes.
-        RoundRectDrawableWithShadow.sRoundRectHelper =
-                new RoundRectDrawableWithShadow.RoundRectHelper() {
-            @Override
-            public void drawRoundRect(Canvas canvas, RectF bounds, float cornerRadius,
-                    Paint paint) {
-                final float twoRadius = cornerRadius * 2;
-                final float innerWidth = bounds.width() - twoRadius - 1;
-                final float innerHeight = bounds.height() - twoRadius - 1;
-                if (cornerRadius >= 1f) {
-                    // increment corner radius to account for half pixels.
-                    float roundedCornerRadius = cornerRadius + .5f;
-                    sCornerRect.set(-roundedCornerRadius, -roundedCornerRadius, roundedCornerRadius,
-                            roundedCornerRadius);
-                    int saved = canvas.save();
-                    canvas.translate(bounds.left + roundedCornerRadius,
-                            bounds.top + roundedCornerRadius);
-                    canvas.drawArc(sCornerRect, 180, 90, true, paint);
-                    canvas.translate(innerWidth, 0);
-                    canvas.rotate(90);
-                    canvas.drawArc(sCornerRect, 180, 90, true, paint);
-                    canvas.translate(innerHeight, 0);
-                    canvas.rotate(90);
-                    canvas.drawArc(sCornerRect, 180, 90, true, paint);
-                    canvas.translate(innerWidth, 0);
-                    canvas.rotate(90);
-                    canvas.drawArc(sCornerRect, 180, 90, true, paint);
-                    canvas.restoreToCount(saved);
-                    //draw top and bottom pieces
-                    canvas.drawRect(bounds.left + roundedCornerRadius - 1f, bounds.top,
-                            bounds.right - roundedCornerRadius + 1f,
-                            bounds.top + roundedCornerRadius, paint);
-
-                    canvas.drawRect(bounds.left + roundedCornerRadius - 1f,
-                            bounds.bottom - roundedCornerRadius,
-                            bounds.right - roundedCornerRadius + 1f, bounds.bottom, paint);
-                }
-                // center
-                canvas.drawRect(bounds.left, bounds.top + cornerRadius,
-                        bounds.right, bounds.bottom - cornerRadius , paint);
-            }
-        };
-    }
-
-    @Override
-    public void initialize(CardViewDelegate cardView, Context context,
-            ColorStateList backgroundColor, float radius, float elevation, float maxElevation) {
-        RoundRectDrawableWithShadow background = createBackground(context, backgroundColor, radius,
-                elevation, maxElevation);
-        background.setAddPaddingForCorners(cardView.getPreventCornerOverlap());
-        cardView.setCardBackground(background);
-        updatePadding(cardView);
-    }
-
-    private RoundRectDrawableWithShadow createBackground(Context context,
-                    ColorStateList backgroundColor, float radius, float elevation,
-                    float maxElevation) {
-        return new RoundRectDrawableWithShadow(context.getResources(), backgroundColor, radius,
-                elevation, maxElevation);
-    }
-
-    @Override
-    public void updatePadding(CardViewDelegate cardView) {
-        Rect shadowPadding = new Rect();
-        getShadowBackground(cardView).getMaxShadowAndCornerPadding(shadowPadding);
-        cardView.setMinWidthHeightInternal((int) Math.ceil(getMinWidth(cardView)),
-                (int) Math.ceil(getMinHeight(cardView)));
-        cardView.setShadowPadding(shadowPadding.left, shadowPadding.top,
-                shadowPadding.right, shadowPadding.bottom);
-    }
-
-    @Override
-    public void onCompatPaddingChanged(CardViewDelegate cardView) {
-        // NO OP
-    }
-
-    @Override
-    public void onPreventCornerOverlapChanged(CardViewDelegate cardView) {
-        getShadowBackground(cardView).setAddPaddingForCorners(cardView.getPreventCornerOverlap());
-        updatePadding(cardView);
-    }
-
-    @Override
-    public void setBackgroundColor(CardViewDelegate cardView, @Nullable ColorStateList color) {
-        getShadowBackground(cardView).setColor(color);
-    }
-
-    public ColorStateList getBackgroundColor(CardViewDelegate cardView) {
-        return getShadowBackground(cardView).getColor();
-    }
-
-    @Override
-    public void setRadius(CardViewDelegate cardView, float radius) {
-        getShadowBackground(cardView).setCornerRadius(radius);
-        updatePadding(cardView);
-    }
-
-    @Override
-    public float getRadius(CardViewDelegate cardView) {
-        return getShadowBackground(cardView).getCornerRadius();
-    }
-
-    @Override
-    public void setElevation(CardViewDelegate cardView, float elevation) {
-        getShadowBackground(cardView).setShadowSize(elevation);
-    }
-
-    @Override
-    public float getElevation(CardViewDelegate cardView) {
-        return getShadowBackground(cardView).getShadowSize();
-    }
-
-    @Override
-    public void setMaxElevation(CardViewDelegate cardView, float maxElevation) {
-        getShadowBackground(cardView).setMaxShadowSize(maxElevation);
-        updatePadding(cardView);
-    }
-
-    @Override
-    public float getMaxElevation(CardViewDelegate cardView) {
-        return getShadowBackground(cardView).getMaxShadowSize();
-    }
-
-    @Override
-    public float getMinWidth(CardViewDelegate cardView) {
-        return getShadowBackground(cardView).getMinWidth();
-    }
-
-    @Override
-    public float getMinHeight(CardViewDelegate cardView) {
-        return getShadowBackground(cardView).getMinHeight();
-    }
-
-    private RoundRectDrawableWithShadow getShadowBackground(CardViewDelegate cardView) {
-        return ((RoundRectDrawableWithShadow) cardView.getCardBackground());
-    }
-}
diff --git a/v7/cardview/gingerbread/android/support/v7/widget/CardViewGingerbread.java b/v7/cardview/gingerbread/android/support/v7/widget/CardViewGingerbread.java
new file mode 100644
index 0000000..857cffa
--- /dev/null
+++ b/v7/cardview/gingerbread/android/support/v7/widget/CardViewGingerbread.java
@@ -0,0 +1,172 @@
+/*
+ * Copyright (C) 2014 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 android.support.v7.widget;
+
+import android.content.Context;
+import android.content.res.ColorStateList;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.Rect;
+import android.graphics.RectF;
+import android.support.annotation.ColorInt;
+import android.support.annotation.Nullable;
+
+class CardViewGingerbread implements CardViewImpl {
+
+    final RectF sCornerRect = new RectF();
+
+    @Override
+    public void initStatic() {
+        // Draws a round rect using 7 draw operations. This is faster than using
+        // canvas.drawRoundRect before JBMR1 because API 11-16 used alpha mask textures to draw
+        // shapes.
+        RoundRectDrawableWithShadow.sRoundRectHelper =
+                new RoundRectDrawableWithShadow.RoundRectHelper() {
+            @Override
+            public void drawRoundRect(Canvas canvas, RectF bounds, float cornerRadius,
+                    Paint paint) {
+                final float twoRadius = cornerRadius * 2;
+                final float innerWidth = bounds.width() - twoRadius - 1;
+                final float innerHeight = bounds.height() - twoRadius - 1;
+                if (cornerRadius >= 1f) {
+                    // increment corner radius to account for half pixels.
+                    float roundedCornerRadius = cornerRadius + .5f;
+                    sCornerRect.set(-roundedCornerRadius, -roundedCornerRadius, roundedCornerRadius,
+                            roundedCornerRadius);
+                    int saved = canvas.save();
+                    canvas.translate(bounds.left + roundedCornerRadius,
+                            bounds.top + roundedCornerRadius);
+                    canvas.drawArc(sCornerRect, 180, 90, true, paint);
+                    canvas.translate(innerWidth, 0);
+                    canvas.rotate(90);
+                    canvas.drawArc(sCornerRect, 180, 90, true, paint);
+                    canvas.translate(innerHeight, 0);
+                    canvas.rotate(90);
+                    canvas.drawArc(sCornerRect, 180, 90, true, paint);
+                    canvas.translate(innerWidth, 0);
+                    canvas.rotate(90);
+                    canvas.drawArc(sCornerRect, 180, 90, true, paint);
+                    canvas.restoreToCount(saved);
+                    //draw top and bottom pieces
+                    canvas.drawRect(bounds.left + roundedCornerRadius - 1f, bounds.top,
+                            bounds.right - roundedCornerRadius + 1f,
+                            bounds.top + roundedCornerRadius, paint);
+
+                    canvas.drawRect(bounds.left + roundedCornerRadius - 1f,
+                            bounds.bottom - roundedCornerRadius,
+                            bounds.right - roundedCornerRadius + 1f, bounds.bottom, paint);
+                }
+                // center
+                canvas.drawRect(bounds.left, bounds.top + cornerRadius,
+                        bounds.right, bounds.bottom - cornerRadius , paint);
+            }
+        };
+    }
+
+    @Override
+    public void initialize(CardViewDelegate cardView, Context context,
+            ColorStateList backgroundColor, float radius, float elevation, float maxElevation) {
+        RoundRectDrawableWithShadow background = createBackground(context, backgroundColor, radius,
+                elevation, maxElevation);
+        background.setAddPaddingForCorners(cardView.getPreventCornerOverlap());
+        cardView.setCardBackground(background);
+        updatePadding(cardView);
+    }
+
+    private RoundRectDrawableWithShadow createBackground(Context context,
+                    ColorStateList backgroundColor, float radius, float elevation,
+                    float maxElevation) {
+        return new RoundRectDrawableWithShadow(context.getResources(), backgroundColor, radius,
+                elevation, maxElevation);
+    }
+
+    @Override
+    public void updatePadding(CardViewDelegate cardView) {
+        Rect shadowPadding = new Rect();
+        getShadowBackground(cardView).getMaxShadowAndCornerPadding(shadowPadding);
+        cardView.setMinWidthHeightInternal((int) Math.ceil(getMinWidth(cardView)),
+                (int) Math.ceil(getMinHeight(cardView)));
+        cardView.setShadowPadding(shadowPadding.left, shadowPadding.top,
+                shadowPadding.right, shadowPadding.bottom);
+    }
+
+    @Override
+    public void onCompatPaddingChanged(CardViewDelegate cardView) {
+        // NO OP
+    }
+
+    @Override
+    public void onPreventCornerOverlapChanged(CardViewDelegate cardView) {
+        getShadowBackground(cardView).setAddPaddingForCorners(cardView.getPreventCornerOverlap());
+        updatePadding(cardView);
+    }
+
+    @Override
+    public void setBackgroundColor(CardViewDelegate cardView, @Nullable ColorStateList color) {
+        getShadowBackground(cardView).setColor(color);
+    }
+
+    @Override
+    public ColorStateList getBackgroundColor(CardViewDelegate cardView) {
+        return getShadowBackground(cardView).getColor();
+    }
+
+    @Override
+    public void setRadius(CardViewDelegate cardView, float radius) {
+        getShadowBackground(cardView).setCornerRadius(radius);
+        updatePadding(cardView);
+    }
+
+    @Override
+    public float getRadius(CardViewDelegate cardView) {
+        return getShadowBackground(cardView).getCornerRadius();
+    }
+
+    @Override
+    public void setElevation(CardViewDelegate cardView, float elevation) {
+        getShadowBackground(cardView).setShadowSize(elevation);
+    }
+
+    @Override
+    public float getElevation(CardViewDelegate cardView) {
+        return getShadowBackground(cardView).getShadowSize();
+    }
+
+    @Override
+    public void setMaxElevation(CardViewDelegate cardView, float maxElevation) {
+        getShadowBackground(cardView).setMaxShadowSize(maxElevation);
+        updatePadding(cardView);
+    }
+
+    @Override
+    public float getMaxElevation(CardViewDelegate cardView) {
+        return getShadowBackground(cardView).getMaxShadowSize();
+    }
+
+    @Override
+    public float getMinWidth(CardViewDelegate cardView) {
+        return getShadowBackground(cardView).getMinWidth();
+    }
+
+    @Override
+    public float getMinHeight(CardViewDelegate cardView) {
+        return getShadowBackground(cardView).getMinHeight();
+    }
+
+    private RoundRectDrawableWithShadow getShadowBackground(CardViewDelegate cardView) {
+        return ((RoundRectDrawableWithShadow) cardView.getCardBackground());
+    }
+}
diff --git a/v7/cardview/eclair-mr1/android/support/v7/widget/RoundRectDrawableWithShadow.java b/v7/cardview/gingerbread/android/support/v7/widget/RoundRectDrawableWithShadow.java
similarity index 100%
rename from v7/cardview/eclair-mr1/android/support/v7/widget/RoundRectDrawableWithShadow.java
rename to v7/cardview/gingerbread/android/support/v7/widget/RoundRectDrawableWithShadow.java
diff --git a/v7/cardview/jellybean-mr1/android/support/v7/widget/CardViewJellybeanMr1.java b/v7/cardview/jellybean-mr1/android/support/v7/widget/CardViewJellybeanMr1.java
index bb38a3c..4c32227 100644
--- a/v7/cardview/jellybean-mr1/android/support/v7/widget/CardViewJellybeanMr1.java
+++ b/v7/cardview/jellybean-mr1/android/support/v7/widget/CardViewJellybeanMr1.java
@@ -19,7 +19,7 @@
 import android.graphics.Paint;
 import android.graphics.RectF;
 
-class CardViewJellybeanMr1 extends CardViewEclairMr1 {
+class CardViewJellybeanMr1 extends CardViewGingerbread {
 
     @Override
     public void initStatic() {
diff --git a/v7/cardview/src/android/support/v7/widget/CardView.java b/v7/cardview/src/android/support/v7/widget/CardView.java
index ecd0a10..3da3243 100644
--- a/v7/cardview/src/android/support/v7/widget/CardView.java
+++ b/v7/cardview/src/android/support/v7/widget/CardView.java
@@ -84,7 +84,7 @@
         } else if (Build.VERSION.SDK_INT >= 17) {
             IMPL = new CardViewJellybeanMr1();
         } else {
-            IMPL = new CardViewEclairMr1();
+            IMPL = new CardViewGingerbread();
         }
         IMPL.initStatic();
     }
diff --git a/v7/gridlayout/Android.mk b/v7/gridlayout/Android.mk
index f9bd0a1..7938918 100644
--- a/v7/gridlayout/Android.mk
+++ b/v7/gridlayout/Android.mk
@@ -19,7 +19,8 @@
 #
 #   LOCAL_STATIC_ANDROID_LIBRARIES := \
 #       android-support-v7-gridlayout \
-#       android-support-v4
+#       android-support-compat \
+#       android-support-core-ui
 #
 # in their makefiles to include the resources and their dependencies in their package.
 include $(CLEAR_VARS)
@@ -27,19 +28,10 @@
 LOCAL_MODULE := android-support-v7-gridlayout
 LOCAL_SRC_FILES := $(call all-java-files-under, src)
 LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
-LOCAL_SDK_VERSION := 7
-LOCAL_SHARED_ANDROID_LIBRARIES := android-support-v4
+LOCAL_SDK_VERSION := 9
+LOCAL_SHARED_ANDROID_LIBRARIES += android-support-compat android-support-core-ui
 LOCAL_JAR_EXCLUDE_FILES := none
 LOCAL_JAVA_LANGUAGE_VERSION := 1.7
 LOCAL_AAPT_FLAGS := --add-javadoc-annotation doconly
 include $(BUILD_STATIC_JAVA_LIBRARY)
 
-
-# API Check
-# ---------------------------------------------
-support_module := $(LOCAL_MODULE)
-support_module_api_dir := $(LOCAL_PATH)/api
-support_module_src_files := $(LOCAL_SRC_FILES)
-support_module_java_libraries := $(LOCAL_JAVA_LIBRARIES) android-support-v7-gridlayout
-support_module_java_packages := android.support.v7.widget
-include $(SUPPORT_API_CHECK)
diff --git a/v7/gridlayout/AndroidManifest.xml b/v7/gridlayout/AndroidManifest.xml
index 97f7be8..d2cc627 100644
--- a/v7/gridlayout/AndroidManifest.xml
+++ b/v7/gridlayout/AndroidManifest.xml
@@ -15,6 +15,6 @@
 -->
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
           package="android.support.v7.gridlayout">
-    <uses-sdk android:minSdkVersion="7"/>
+    <uses-sdk android:minSdkVersion="9"/>
     <application />
 </manifest>
diff --git a/v7/gridlayout/api/22.0.0.txt b/v7/gridlayout/api/22.0.0.txt
deleted file mode 100644
index 48c475d..0000000
--- a/v7/gridlayout/api/22.0.0.txt
+++ /dev/null
@@ -1,73 +0,0 @@
-package android.support.v7.widget {
-
-  public class GridLayout extends android.view.ViewGroup {
-    ctor public GridLayout(android.content.Context, android.util.AttributeSet, int);
-    ctor public GridLayout(android.content.Context, android.util.AttributeSet);
-    ctor public GridLayout(android.content.Context);
-    method public int getAlignmentMode();
-    method public int getColumnCount();
-    method public int getOrientation();
-    method public android.util.Printer getPrinter();
-    method public int getRowCount();
-    method public boolean getUseDefaultMargins();
-    method public boolean isColumnOrderPreserved();
-    method public boolean isRowOrderPreserved();
-    method protected void onLayout(boolean, int, int, int, int);
-    method public void setAlignmentMode(int);
-    method public void setColumnCount(int);
-    method public void setColumnOrderPreserved(boolean);
-    method public void setOrientation(int);
-    method public void setPrinter(android.util.Printer);
-    method public void setRowCount(int);
-    method public void setRowOrderPreserved(boolean);
-    method public void setUseDefaultMargins(boolean);
-    method public static android.support.v7.widget.GridLayout.Spec spec(int, int, android.support.v7.widget.GridLayout.Alignment, float);
-    method public static android.support.v7.widget.GridLayout.Spec spec(int, android.support.v7.widget.GridLayout.Alignment, float);
-    method public static android.support.v7.widget.GridLayout.Spec spec(int, int, float);
-    method public static android.support.v7.widget.GridLayout.Spec spec(int, float);
-    method public static android.support.v7.widget.GridLayout.Spec spec(int, int, android.support.v7.widget.GridLayout.Alignment);
-    method public static android.support.v7.widget.GridLayout.Spec spec(int, android.support.v7.widget.GridLayout.Alignment);
-    method public static android.support.v7.widget.GridLayout.Spec spec(int, int);
-    method public static android.support.v7.widget.GridLayout.Spec spec(int);
-    field public static final int ALIGN_BOUNDS = 0; // 0x0
-    field public static final int ALIGN_MARGINS = 1; // 0x1
-    field public static final android.support.v7.widget.GridLayout.Alignment BASELINE;
-    field public static final android.support.v7.widget.GridLayout.Alignment BOTTOM;
-    field public static final android.support.v7.widget.GridLayout.Alignment CENTER;
-    field public static final android.support.v7.widget.GridLayout.Alignment END;
-    field public static final android.support.v7.widget.GridLayout.Alignment FILL;
-    field public static final int HORIZONTAL = 0; // 0x0
-    field public static final android.support.v7.widget.GridLayout.Alignment LEFT;
-    field public static final android.support.v7.widget.GridLayout.Alignment RIGHT;
-    field public static final android.support.v7.widget.GridLayout.Alignment START;
-    field public static final android.support.v7.widget.GridLayout.Alignment TOP;
-    field public static final int UNDEFINED = -2147483648; // 0x80000000
-    field public static final int VERTICAL = 1; // 0x1
-  }
-
-  public static abstract class GridLayout.Alignment {
-  }
-
-  public static class GridLayout.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
-    ctor public GridLayout.LayoutParams(android.support.v7.widget.GridLayout.Spec, android.support.v7.widget.GridLayout.Spec);
-    ctor public GridLayout.LayoutParams();
-    ctor public GridLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public GridLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public GridLayout.LayoutParams(android.support.v7.widget.GridLayout.LayoutParams);
-    ctor public GridLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
-    method public void setGravity(int);
-    field public android.support.v7.widget.GridLayout.Spec columnSpec;
-    field public android.support.v7.widget.GridLayout.Spec rowSpec;
-  }
-
-  public static class GridLayout.Spec {
-  }
-
-  public final class Space extends android.view.View {
-    ctor public Space(android.content.Context, android.util.AttributeSet, int);
-    ctor public Space(android.content.Context, android.util.AttributeSet);
-    ctor public Space(android.content.Context);
-  }
-
-}
-
diff --git a/v7/gridlayout/api/22.1.0.txt b/v7/gridlayout/api/22.1.0.txt
deleted file mode 100644
index baa25e2..0000000
--- a/v7/gridlayout/api/22.1.0.txt
+++ /dev/null
@@ -1,74 +0,0 @@
-package android.support.v7.widget {
-
-  public class GridLayout extends android.view.ViewGroup {
-    ctor public GridLayout(android.content.Context, android.util.AttributeSet, int);
-    ctor public GridLayout(android.content.Context, android.util.AttributeSet);
-    ctor public GridLayout(android.content.Context);
-    method public int getAlignmentMode();
-    method public int getColumnCount();
-    method public int getOrientation();
-    method public android.util.Printer getPrinter();
-    method public int getRowCount();
-    method public boolean getUseDefaultMargins();
-    method public boolean isColumnOrderPreserved();
-    method public boolean isRowOrderPreserved();
-    method protected void onLayout(boolean, int, int, int, int);
-    method public void setAlignmentMode(int);
-    method public void setColumnCount(int);
-    method public void setColumnOrderPreserved(boolean);
-    method public void setOrientation(int);
-    method public void setPrinter(android.util.Printer);
-    method public void setRowCount(int);
-    method public void setRowOrderPreserved(boolean);
-    method public void setUseDefaultMargins(boolean);
-    method public static android.support.v7.widget.GridLayout.Spec spec(int, int, android.support.v7.widget.GridLayout.Alignment, float);
-    method public static android.support.v7.widget.GridLayout.Spec spec(int, android.support.v7.widget.GridLayout.Alignment, float);
-    method public static android.support.v7.widget.GridLayout.Spec spec(int, int, float);
-    method public static android.support.v7.widget.GridLayout.Spec spec(int, float);
-    method public static android.support.v7.widget.GridLayout.Spec spec(int, int, android.support.v7.widget.GridLayout.Alignment);
-    method public static android.support.v7.widget.GridLayout.Spec spec(int, android.support.v7.widget.GridLayout.Alignment);
-    method public static android.support.v7.widget.GridLayout.Spec spec(int, int);
-    method public static android.support.v7.widget.GridLayout.Spec spec(int);
-    field public static final int ALIGN_BOUNDS = 0; // 0x0
-    field public static final int ALIGN_MARGINS = 1; // 0x1
-    field public static final android.support.v7.widget.GridLayout.Alignment BASELINE;
-    field public static final android.support.v7.widget.GridLayout.Alignment BOTTOM;
-    field public static final android.support.v7.widget.GridLayout.Alignment CENTER;
-    field public static final android.support.v7.widget.GridLayout.Alignment END;
-    field public static final android.support.v7.widget.GridLayout.Alignment FILL;
-    field public static final int HORIZONTAL = 0; // 0x0
-    field public static final android.support.v7.widget.GridLayout.Alignment LEFT;
-    field public static final android.support.v7.widget.GridLayout.Alignment RIGHT;
-    field public static final android.support.v7.widget.GridLayout.Alignment START;
-    field public static final android.support.v7.widget.GridLayout.Alignment TOP;
-    field public static final int UNDEFINED = -2147483648; // 0x80000000
-    field public static final int VERTICAL = 1; // 0x1
-  }
-
-  public static abstract class GridLayout.Alignment {
-  }
-
-  public static class GridLayout.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
-    ctor public GridLayout.LayoutParams(android.support.v7.widget.GridLayout.Spec, android.support.v7.widget.GridLayout.Spec);
-    ctor public GridLayout.LayoutParams();
-    ctor public GridLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public GridLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public GridLayout.LayoutParams(android.support.v7.widget.GridLayout.LayoutParams);
-    ctor public GridLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
-    method public void setGravity(int);
-    field public android.support.v7.widget.GridLayout.Spec columnSpec;
-    field public android.support.v7.widget.GridLayout.Spec rowSpec;
-  }
-
-  public static class GridLayout.Spec {
-    method public android.support.v7.widget.GridLayout.Alignment getAbsoluteAlignment(boolean);
-  }
-
-  public final deprecated class Space extends android.support.v4.widget.Space {
-    ctor public Space(android.content.Context);
-    ctor public Space(android.content.Context, android.util.AttributeSet);
-    ctor public Space(android.content.Context, android.util.AttributeSet, int);
-  }
-
-}
-
diff --git a/v7/gridlayout/api/22.2.0.txt b/v7/gridlayout/api/22.2.0.txt
deleted file mode 100644
index baa25e2..0000000
--- a/v7/gridlayout/api/22.2.0.txt
+++ /dev/null
@@ -1,74 +0,0 @@
-package android.support.v7.widget {
-
-  public class GridLayout extends android.view.ViewGroup {
-    ctor public GridLayout(android.content.Context, android.util.AttributeSet, int);
-    ctor public GridLayout(android.content.Context, android.util.AttributeSet);
-    ctor public GridLayout(android.content.Context);
-    method public int getAlignmentMode();
-    method public int getColumnCount();
-    method public int getOrientation();
-    method public android.util.Printer getPrinter();
-    method public int getRowCount();
-    method public boolean getUseDefaultMargins();
-    method public boolean isColumnOrderPreserved();
-    method public boolean isRowOrderPreserved();
-    method protected void onLayout(boolean, int, int, int, int);
-    method public void setAlignmentMode(int);
-    method public void setColumnCount(int);
-    method public void setColumnOrderPreserved(boolean);
-    method public void setOrientation(int);
-    method public void setPrinter(android.util.Printer);
-    method public void setRowCount(int);
-    method public void setRowOrderPreserved(boolean);
-    method public void setUseDefaultMargins(boolean);
-    method public static android.support.v7.widget.GridLayout.Spec spec(int, int, android.support.v7.widget.GridLayout.Alignment, float);
-    method public static android.support.v7.widget.GridLayout.Spec spec(int, android.support.v7.widget.GridLayout.Alignment, float);
-    method public static android.support.v7.widget.GridLayout.Spec spec(int, int, float);
-    method public static android.support.v7.widget.GridLayout.Spec spec(int, float);
-    method public static android.support.v7.widget.GridLayout.Spec spec(int, int, android.support.v7.widget.GridLayout.Alignment);
-    method public static android.support.v7.widget.GridLayout.Spec spec(int, android.support.v7.widget.GridLayout.Alignment);
-    method public static android.support.v7.widget.GridLayout.Spec spec(int, int);
-    method public static android.support.v7.widget.GridLayout.Spec spec(int);
-    field public static final int ALIGN_BOUNDS = 0; // 0x0
-    field public static final int ALIGN_MARGINS = 1; // 0x1
-    field public static final android.support.v7.widget.GridLayout.Alignment BASELINE;
-    field public static final android.support.v7.widget.GridLayout.Alignment BOTTOM;
-    field public static final android.support.v7.widget.GridLayout.Alignment CENTER;
-    field public static final android.support.v7.widget.GridLayout.Alignment END;
-    field public static final android.support.v7.widget.GridLayout.Alignment FILL;
-    field public static final int HORIZONTAL = 0; // 0x0
-    field public static final android.support.v7.widget.GridLayout.Alignment LEFT;
-    field public static final android.support.v7.widget.GridLayout.Alignment RIGHT;
-    field public static final android.support.v7.widget.GridLayout.Alignment START;
-    field public static final android.support.v7.widget.GridLayout.Alignment TOP;
-    field public static final int UNDEFINED = -2147483648; // 0x80000000
-    field public static final int VERTICAL = 1; // 0x1
-  }
-
-  public static abstract class GridLayout.Alignment {
-  }
-
-  public static class GridLayout.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
-    ctor public GridLayout.LayoutParams(android.support.v7.widget.GridLayout.Spec, android.support.v7.widget.GridLayout.Spec);
-    ctor public GridLayout.LayoutParams();
-    ctor public GridLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public GridLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public GridLayout.LayoutParams(android.support.v7.widget.GridLayout.LayoutParams);
-    ctor public GridLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
-    method public void setGravity(int);
-    field public android.support.v7.widget.GridLayout.Spec columnSpec;
-    field public android.support.v7.widget.GridLayout.Spec rowSpec;
-  }
-
-  public static class GridLayout.Spec {
-    method public android.support.v7.widget.GridLayout.Alignment getAbsoluteAlignment(boolean);
-  }
-
-  public final deprecated class Space extends android.support.v4.widget.Space {
-    ctor public Space(android.content.Context);
-    ctor public Space(android.content.Context, android.util.AttributeSet);
-    ctor public Space(android.content.Context, android.util.AttributeSet, int);
-  }
-
-}
-
diff --git a/v7/gridlayout/api/22.2.1.txt b/v7/gridlayout/api/22.2.1.txt
deleted file mode 100644
index baa25e2..0000000
--- a/v7/gridlayout/api/22.2.1.txt
+++ /dev/null
@@ -1,74 +0,0 @@
-package android.support.v7.widget {
-
-  public class GridLayout extends android.view.ViewGroup {
-    ctor public GridLayout(android.content.Context, android.util.AttributeSet, int);
-    ctor public GridLayout(android.content.Context, android.util.AttributeSet);
-    ctor public GridLayout(android.content.Context);
-    method public int getAlignmentMode();
-    method public int getColumnCount();
-    method public int getOrientation();
-    method public android.util.Printer getPrinter();
-    method public int getRowCount();
-    method public boolean getUseDefaultMargins();
-    method public boolean isColumnOrderPreserved();
-    method public boolean isRowOrderPreserved();
-    method protected void onLayout(boolean, int, int, int, int);
-    method public void setAlignmentMode(int);
-    method public void setColumnCount(int);
-    method public void setColumnOrderPreserved(boolean);
-    method public void setOrientation(int);
-    method public void setPrinter(android.util.Printer);
-    method public void setRowCount(int);
-    method public void setRowOrderPreserved(boolean);
-    method public void setUseDefaultMargins(boolean);
-    method public static android.support.v7.widget.GridLayout.Spec spec(int, int, android.support.v7.widget.GridLayout.Alignment, float);
-    method public static android.support.v7.widget.GridLayout.Spec spec(int, android.support.v7.widget.GridLayout.Alignment, float);
-    method public static android.support.v7.widget.GridLayout.Spec spec(int, int, float);
-    method public static android.support.v7.widget.GridLayout.Spec spec(int, float);
-    method public static android.support.v7.widget.GridLayout.Spec spec(int, int, android.support.v7.widget.GridLayout.Alignment);
-    method public static android.support.v7.widget.GridLayout.Spec spec(int, android.support.v7.widget.GridLayout.Alignment);
-    method public static android.support.v7.widget.GridLayout.Spec spec(int, int);
-    method public static android.support.v7.widget.GridLayout.Spec spec(int);
-    field public static final int ALIGN_BOUNDS = 0; // 0x0
-    field public static final int ALIGN_MARGINS = 1; // 0x1
-    field public static final android.support.v7.widget.GridLayout.Alignment BASELINE;
-    field public static final android.support.v7.widget.GridLayout.Alignment BOTTOM;
-    field public static final android.support.v7.widget.GridLayout.Alignment CENTER;
-    field public static final android.support.v7.widget.GridLayout.Alignment END;
-    field public static final android.support.v7.widget.GridLayout.Alignment FILL;
-    field public static final int HORIZONTAL = 0; // 0x0
-    field public static final android.support.v7.widget.GridLayout.Alignment LEFT;
-    field public static final android.support.v7.widget.GridLayout.Alignment RIGHT;
-    field public static final android.support.v7.widget.GridLayout.Alignment START;
-    field public static final android.support.v7.widget.GridLayout.Alignment TOP;
-    field public static final int UNDEFINED = -2147483648; // 0x80000000
-    field public static final int VERTICAL = 1; // 0x1
-  }
-
-  public static abstract class GridLayout.Alignment {
-  }
-
-  public static class GridLayout.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
-    ctor public GridLayout.LayoutParams(android.support.v7.widget.GridLayout.Spec, android.support.v7.widget.GridLayout.Spec);
-    ctor public GridLayout.LayoutParams();
-    ctor public GridLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public GridLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public GridLayout.LayoutParams(android.support.v7.widget.GridLayout.LayoutParams);
-    ctor public GridLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
-    method public void setGravity(int);
-    field public android.support.v7.widget.GridLayout.Spec columnSpec;
-    field public android.support.v7.widget.GridLayout.Spec rowSpec;
-  }
-
-  public static class GridLayout.Spec {
-    method public android.support.v7.widget.GridLayout.Alignment getAbsoluteAlignment(boolean);
-  }
-
-  public final deprecated class Space extends android.support.v4.widget.Space {
-    ctor public Space(android.content.Context);
-    ctor public Space(android.content.Context, android.util.AttributeSet);
-    ctor public Space(android.content.Context, android.util.AttributeSet, int);
-  }
-
-}
-
diff --git a/v7/gridlayout/api/23.0.0.txt b/v7/gridlayout/api/23.0.0.txt
deleted file mode 100644
index baa25e2..0000000
--- a/v7/gridlayout/api/23.0.0.txt
+++ /dev/null
@@ -1,74 +0,0 @@
-package android.support.v7.widget {
-
-  public class GridLayout extends android.view.ViewGroup {
-    ctor public GridLayout(android.content.Context, android.util.AttributeSet, int);
-    ctor public GridLayout(android.content.Context, android.util.AttributeSet);
-    ctor public GridLayout(android.content.Context);
-    method public int getAlignmentMode();
-    method public int getColumnCount();
-    method public int getOrientation();
-    method public android.util.Printer getPrinter();
-    method public int getRowCount();
-    method public boolean getUseDefaultMargins();
-    method public boolean isColumnOrderPreserved();
-    method public boolean isRowOrderPreserved();
-    method protected void onLayout(boolean, int, int, int, int);
-    method public void setAlignmentMode(int);
-    method public void setColumnCount(int);
-    method public void setColumnOrderPreserved(boolean);
-    method public void setOrientation(int);
-    method public void setPrinter(android.util.Printer);
-    method public void setRowCount(int);
-    method public void setRowOrderPreserved(boolean);
-    method public void setUseDefaultMargins(boolean);
-    method public static android.support.v7.widget.GridLayout.Spec spec(int, int, android.support.v7.widget.GridLayout.Alignment, float);
-    method public static android.support.v7.widget.GridLayout.Spec spec(int, android.support.v7.widget.GridLayout.Alignment, float);
-    method public static android.support.v7.widget.GridLayout.Spec spec(int, int, float);
-    method public static android.support.v7.widget.GridLayout.Spec spec(int, float);
-    method public static android.support.v7.widget.GridLayout.Spec spec(int, int, android.support.v7.widget.GridLayout.Alignment);
-    method public static android.support.v7.widget.GridLayout.Spec spec(int, android.support.v7.widget.GridLayout.Alignment);
-    method public static android.support.v7.widget.GridLayout.Spec spec(int, int);
-    method public static android.support.v7.widget.GridLayout.Spec spec(int);
-    field public static final int ALIGN_BOUNDS = 0; // 0x0
-    field public static final int ALIGN_MARGINS = 1; // 0x1
-    field public static final android.support.v7.widget.GridLayout.Alignment BASELINE;
-    field public static final android.support.v7.widget.GridLayout.Alignment BOTTOM;
-    field public static final android.support.v7.widget.GridLayout.Alignment CENTER;
-    field public static final android.support.v7.widget.GridLayout.Alignment END;
-    field public static final android.support.v7.widget.GridLayout.Alignment FILL;
-    field public static final int HORIZONTAL = 0; // 0x0
-    field public static final android.support.v7.widget.GridLayout.Alignment LEFT;
-    field public static final android.support.v7.widget.GridLayout.Alignment RIGHT;
-    field public static final android.support.v7.widget.GridLayout.Alignment START;
-    field public static final android.support.v7.widget.GridLayout.Alignment TOP;
-    field public static final int UNDEFINED = -2147483648; // 0x80000000
-    field public static final int VERTICAL = 1; // 0x1
-  }
-
-  public static abstract class GridLayout.Alignment {
-  }
-
-  public static class GridLayout.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
-    ctor public GridLayout.LayoutParams(android.support.v7.widget.GridLayout.Spec, android.support.v7.widget.GridLayout.Spec);
-    ctor public GridLayout.LayoutParams();
-    ctor public GridLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public GridLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public GridLayout.LayoutParams(android.support.v7.widget.GridLayout.LayoutParams);
-    ctor public GridLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
-    method public void setGravity(int);
-    field public android.support.v7.widget.GridLayout.Spec columnSpec;
-    field public android.support.v7.widget.GridLayout.Spec rowSpec;
-  }
-
-  public static class GridLayout.Spec {
-    method public android.support.v7.widget.GridLayout.Alignment getAbsoluteAlignment(boolean);
-  }
-
-  public final deprecated class Space extends android.support.v4.widget.Space {
-    ctor public Space(android.content.Context);
-    ctor public Space(android.content.Context, android.util.AttributeSet);
-    ctor public Space(android.content.Context, android.util.AttributeSet, int);
-  }
-
-}
-
diff --git a/v7/gridlayout/api/23.1.0.txt b/v7/gridlayout/api/23.1.0.txt
deleted file mode 100644
index baa25e2..0000000
--- a/v7/gridlayout/api/23.1.0.txt
+++ /dev/null
@@ -1,74 +0,0 @@
-package android.support.v7.widget {
-
-  public class GridLayout extends android.view.ViewGroup {
-    ctor public GridLayout(android.content.Context, android.util.AttributeSet, int);
-    ctor public GridLayout(android.content.Context, android.util.AttributeSet);
-    ctor public GridLayout(android.content.Context);
-    method public int getAlignmentMode();
-    method public int getColumnCount();
-    method public int getOrientation();
-    method public android.util.Printer getPrinter();
-    method public int getRowCount();
-    method public boolean getUseDefaultMargins();
-    method public boolean isColumnOrderPreserved();
-    method public boolean isRowOrderPreserved();
-    method protected void onLayout(boolean, int, int, int, int);
-    method public void setAlignmentMode(int);
-    method public void setColumnCount(int);
-    method public void setColumnOrderPreserved(boolean);
-    method public void setOrientation(int);
-    method public void setPrinter(android.util.Printer);
-    method public void setRowCount(int);
-    method public void setRowOrderPreserved(boolean);
-    method public void setUseDefaultMargins(boolean);
-    method public static android.support.v7.widget.GridLayout.Spec spec(int, int, android.support.v7.widget.GridLayout.Alignment, float);
-    method public static android.support.v7.widget.GridLayout.Spec spec(int, android.support.v7.widget.GridLayout.Alignment, float);
-    method public static android.support.v7.widget.GridLayout.Spec spec(int, int, float);
-    method public static android.support.v7.widget.GridLayout.Spec spec(int, float);
-    method public static android.support.v7.widget.GridLayout.Spec spec(int, int, android.support.v7.widget.GridLayout.Alignment);
-    method public static android.support.v7.widget.GridLayout.Spec spec(int, android.support.v7.widget.GridLayout.Alignment);
-    method public static android.support.v7.widget.GridLayout.Spec spec(int, int);
-    method public static android.support.v7.widget.GridLayout.Spec spec(int);
-    field public static final int ALIGN_BOUNDS = 0; // 0x0
-    field public static final int ALIGN_MARGINS = 1; // 0x1
-    field public static final android.support.v7.widget.GridLayout.Alignment BASELINE;
-    field public static final android.support.v7.widget.GridLayout.Alignment BOTTOM;
-    field public static final android.support.v7.widget.GridLayout.Alignment CENTER;
-    field public static final android.support.v7.widget.GridLayout.Alignment END;
-    field public static final android.support.v7.widget.GridLayout.Alignment FILL;
-    field public static final int HORIZONTAL = 0; // 0x0
-    field public static final android.support.v7.widget.GridLayout.Alignment LEFT;
-    field public static final android.support.v7.widget.GridLayout.Alignment RIGHT;
-    field public static final android.support.v7.widget.GridLayout.Alignment START;
-    field public static final android.support.v7.widget.GridLayout.Alignment TOP;
-    field public static final int UNDEFINED = -2147483648; // 0x80000000
-    field public static final int VERTICAL = 1; // 0x1
-  }
-
-  public static abstract class GridLayout.Alignment {
-  }
-
-  public static class GridLayout.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
-    ctor public GridLayout.LayoutParams(android.support.v7.widget.GridLayout.Spec, android.support.v7.widget.GridLayout.Spec);
-    ctor public GridLayout.LayoutParams();
-    ctor public GridLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public GridLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public GridLayout.LayoutParams(android.support.v7.widget.GridLayout.LayoutParams);
-    ctor public GridLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
-    method public void setGravity(int);
-    field public android.support.v7.widget.GridLayout.Spec columnSpec;
-    field public android.support.v7.widget.GridLayout.Spec rowSpec;
-  }
-
-  public static class GridLayout.Spec {
-    method public android.support.v7.widget.GridLayout.Alignment getAbsoluteAlignment(boolean);
-  }
-
-  public final deprecated class Space extends android.support.v4.widget.Space {
-    ctor public Space(android.content.Context);
-    ctor public Space(android.content.Context, android.util.AttributeSet);
-    ctor public Space(android.content.Context, android.util.AttributeSet, int);
-  }
-
-}
-
diff --git a/v7/gridlayout/api/23.1.1.txt b/v7/gridlayout/api/23.1.1.txt
deleted file mode 100644
index baa25e2..0000000
--- a/v7/gridlayout/api/23.1.1.txt
+++ /dev/null
@@ -1,74 +0,0 @@
-package android.support.v7.widget {
-
-  public class GridLayout extends android.view.ViewGroup {
-    ctor public GridLayout(android.content.Context, android.util.AttributeSet, int);
-    ctor public GridLayout(android.content.Context, android.util.AttributeSet);
-    ctor public GridLayout(android.content.Context);
-    method public int getAlignmentMode();
-    method public int getColumnCount();
-    method public int getOrientation();
-    method public android.util.Printer getPrinter();
-    method public int getRowCount();
-    method public boolean getUseDefaultMargins();
-    method public boolean isColumnOrderPreserved();
-    method public boolean isRowOrderPreserved();
-    method protected void onLayout(boolean, int, int, int, int);
-    method public void setAlignmentMode(int);
-    method public void setColumnCount(int);
-    method public void setColumnOrderPreserved(boolean);
-    method public void setOrientation(int);
-    method public void setPrinter(android.util.Printer);
-    method public void setRowCount(int);
-    method public void setRowOrderPreserved(boolean);
-    method public void setUseDefaultMargins(boolean);
-    method public static android.support.v7.widget.GridLayout.Spec spec(int, int, android.support.v7.widget.GridLayout.Alignment, float);
-    method public static android.support.v7.widget.GridLayout.Spec spec(int, android.support.v7.widget.GridLayout.Alignment, float);
-    method public static android.support.v7.widget.GridLayout.Spec spec(int, int, float);
-    method public static android.support.v7.widget.GridLayout.Spec spec(int, float);
-    method public static android.support.v7.widget.GridLayout.Spec spec(int, int, android.support.v7.widget.GridLayout.Alignment);
-    method public static android.support.v7.widget.GridLayout.Spec spec(int, android.support.v7.widget.GridLayout.Alignment);
-    method public static android.support.v7.widget.GridLayout.Spec spec(int, int);
-    method public static android.support.v7.widget.GridLayout.Spec spec(int);
-    field public static final int ALIGN_BOUNDS = 0; // 0x0
-    field public static final int ALIGN_MARGINS = 1; // 0x1
-    field public static final android.support.v7.widget.GridLayout.Alignment BASELINE;
-    field public static final android.support.v7.widget.GridLayout.Alignment BOTTOM;
-    field public static final android.support.v7.widget.GridLayout.Alignment CENTER;
-    field public static final android.support.v7.widget.GridLayout.Alignment END;
-    field public static final android.support.v7.widget.GridLayout.Alignment FILL;
-    field public static final int HORIZONTAL = 0; // 0x0
-    field public static final android.support.v7.widget.GridLayout.Alignment LEFT;
-    field public static final android.support.v7.widget.GridLayout.Alignment RIGHT;
-    field public static final android.support.v7.widget.GridLayout.Alignment START;
-    field public static final android.support.v7.widget.GridLayout.Alignment TOP;
-    field public static final int UNDEFINED = -2147483648; // 0x80000000
-    field public static final int VERTICAL = 1; // 0x1
-  }
-
-  public static abstract class GridLayout.Alignment {
-  }
-
-  public static class GridLayout.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
-    ctor public GridLayout.LayoutParams(android.support.v7.widget.GridLayout.Spec, android.support.v7.widget.GridLayout.Spec);
-    ctor public GridLayout.LayoutParams();
-    ctor public GridLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public GridLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public GridLayout.LayoutParams(android.support.v7.widget.GridLayout.LayoutParams);
-    ctor public GridLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
-    method public void setGravity(int);
-    field public android.support.v7.widget.GridLayout.Spec columnSpec;
-    field public android.support.v7.widget.GridLayout.Spec rowSpec;
-  }
-
-  public static class GridLayout.Spec {
-    method public android.support.v7.widget.GridLayout.Alignment getAbsoluteAlignment(boolean);
-  }
-
-  public final deprecated class Space extends android.support.v4.widget.Space {
-    ctor public Space(android.content.Context);
-    ctor public Space(android.content.Context, android.util.AttributeSet);
-    ctor public Space(android.content.Context, android.util.AttributeSet, int);
-  }
-
-}
-
diff --git a/v7/gridlayout/api/current.txt b/v7/gridlayout/api/current.txt
deleted file mode 100644
index baa25e2..0000000
--- a/v7/gridlayout/api/current.txt
+++ /dev/null
@@ -1,74 +0,0 @@
-package android.support.v7.widget {
-
-  public class GridLayout extends android.view.ViewGroup {
-    ctor public GridLayout(android.content.Context, android.util.AttributeSet, int);
-    ctor public GridLayout(android.content.Context, android.util.AttributeSet);
-    ctor public GridLayout(android.content.Context);
-    method public int getAlignmentMode();
-    method public int getColumnCount();
-    method public int getOrientation();
-    method public android.util.Printer getPrinter();
-    method public int getRowCount();
-    method public boolean getUseDefaultMargins();
-    method public boolean isColumnOrderPreserved();
-    method public boolean isRowOrderPreserved();
-    method protected void onLayout(boolean, int, int, int, int);
-    method public void setAlignmentMode(int);
-    method public void setColumnCount(int);
-    method public void setColumnOrderPreserved(boolean);
-    method public void setOrientation(int);
-    method public void setPrinter(android.util.Printer);
-    method public void setRowCount(int);
-    method public void setRowOrderPreserved(boolean);
-    method public void setUseDefaultMargins(boolean);
-    method public static android.support.v7.widget.GridLayout.Spec spec(int, int, android.support.v7.widget.GridLayout.Alignment, float);
-    method public static android.support.v7.widget.GridLayout.Spec spec(int, android.support.v7.widget.GridLayout.Alignment, float);
-    method public static android.support.v7.widget.GridLayout.Spec spec(int, int, float);
-    method public static android.support.v7.widget.GridLayout.Spec spec(int, float);
-    method public static android.support.v7.widget.GridLayout.Spec spec(int, int, android.support.v7.widget.GridLayout.Alignment);
-    method public static android.support.v7.widget.GridLayout.Spec spec(int, android.support.v7.widget.GridLayout.Alignment);
-    method public static android.support.v7.widget.GridLayout.Spec spec(int, int);
-    method public static android.support.v7.widget.GridLayout.Spec spec(int);
-    field public static final int ALIGN_BOUNDS = 0; // 0x0
-    field public static final int ALIGN_MARGINS = 1; // 0x1
-    field public static final android.support.v7.widget.GridLayout.Alignment BASELINE;
-    field public static final android.support.v7.widget.GridLayout.Alignment BOTTOM;
-    field public static final android.support.v7.widget.GridLayout.Alignment CENTER;
-    field public static final android.support.v7.widget.GridLayout.Alignment END;
-    field public static final android.support.v7.widget.GridLayout.Alignment FILL;
-    field public static final int HORIZONTAL = 0; // 0x0
-    field public static final android.support.v7.widget.GridLayout.Alignment LEFT;
-    field public static final android.support.v7.widget.GridLayout.Alignment RIGHT;
-    field public static final android.support.v7.widget.GridLayout.Alignment START;
-    field public static final android.support.v7.widget.GridLayout.Alignment TOP;
-    field public static final int UNDEFINED = -2147483648; // 0x80000000
-    field public static final int VERTICAL = 1; // 0x1
-  }
-
-  public static abstract class GridLayout.Alignment {
-  }
-
-  public static class GridLayout.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
-    ctor public GridLayout.LayoutParams(android.support.v7.widget.GridLayout.Spec, android.support.v7.widget.GridLayout.Spec);
-    ctor public GridLayout.LayoutParams();
-    ctor public GridLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public GridLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public GridLayout.LayoutParams(android.support.v7.widget.GridLayout.LayoutParams);
-    ctor public GridLayout.LayoutParams(android.content.Context, android.util.AttributeSet);
-    method public void setGravity(int);
-    field public android.support.v7.widget.GridLayout.Spec columnSpec;
-    field public android.support.v7.widget.GridLayout.Spec rowSpec;
-  }
-
-  public static class GridLayout.Spec {
-    method public android.support.v7.widget.GridLayout.Alignment getAbsoluteAlignment(boolean);
-  }
-
-  public final deprecated class Space extends android.support.v4.widget.Space {
-    ctor public Space(android.content.Context);
-    ctor public Space(android.content.Context, android.util.AttributeSet);
-    ctor public Space(android.content.Context, android.util.AttributeSet, int);
-  }
-
-}
-
diff --git a/v7/gridlayout/api/removed.txt b/v7/gridlayout/api/removed.txt
deleted file mode 100644
index e69de29..0000000
--- a/v7/gridlayout/api/removed.txt
+++ /dev/null
diff --git a/v7/gridlayout/build.gradle b/v7/gridlayout/build.gradle
index 7cae6c3..5410363 100644
--- a/v7/gridlayout/build.gradle
+++ b/v7/gridlayout/build.gradle
@@ -3,7 +3,8 @@
 archivesBaseName = 'gridlayout-v7'
 
 dependencies {
-    compile project(':support-v4')
+    compile project(':support-compat')
+    compile project(':support-core-ui')
 
     androidTestCompile ('com.android.support.test:runner:0.4.1') {
         exclude module: 'support-annotations'
diff --git a/v7/gridlayout/tests/AndroidManifest.xml b/v7/gridlayout/tests/AndroidManifest.xml
index fc502a5..4c4b0ab 100644
--- a/v7/gridlayout/tests/AndroidManifest.xml
+++ b/v7/gridlayout/tests/AndroidManifest.xml
@@ -18,7 +18,7 @@
           xmlns:tools="http://schemas.android.com/tools"
           package="android.support.v7.gridlayout.test">
     <uses-sdk
-            android:minSdkVersion="7"
+            android:minSdkVersion="9"
             android:targetSdkVersion="23"
             tools:overrideLibrary="android.support.test, android.app, android.support.test.rule,
                   android.support.test.espresso, android.support.test.espresso.idling" />
diff --git a/v7/mediarouter/Android.mk b/v7/mediarouter/Android.mk
index c0c4085..0c00f76 100644
--- a/v7/mediarouter/Android.mk
+++ b/v7/mediarouter/Android.mk
@@ -28,8 +28,6 @@
 LOCAL_JAVA_LANGUAGE_VERSION := 1.7
 include $(BUILD_STATIC_JAVA_LIBRARY)
 
-support_module_src_files := $(LOCAL_SRC_FILES)
-
 # A helper sub-library that makes direct use of JellyBean APIs.
 include $(CLEAR_VARS)
 LOCAL_MODULE := android-support-v7-mediarouter-jellybean
@@ -38,8 +36,6 @@
 LOCAL_JAVA_LANGUAGE_VERSION := 1.7
 include $(BUILD_STATIC_JAVA_LIBRARY)
 
-support_module_src_files += $(LOCAL_SRC_FILES)
-
 # A helper sub-library that makes direct use of JellyBean MR1 APIs.
 include $(CLEAR_VARS)
 LOCAL_MODULE := android-support-v7-mediarouter-jellybean-mr1
@@ -49,8 +45,6 @@
 LOCAL_JAVA_LANGUAGE_VERSION := 1.7
 include $(BUILD_STATIC_JAVA_LIBRARY)
 
-support_module_src_files += $(LOCAL_SRC_FILES)
-
 # A helper sub-library that makes direct use of JellyBean MR2 APIs.
 include $(CLEAR_VARS)
 LOCAL_MODULE := android-support-v7-mediarouter-jellybean-mr2
@@ -60,8 +54,6 @@
 LOCAL_JAVA_LANGUAGE_VERSION := 1.7
 include $(BUILD_STATIC_JAVA_LIBRARY)
 
-support_module_src_files += $(LOCAL_SRC_FILES)
-
 # A helper sub-library that makes direct use of V24 APIs.
 include $(CLEAR_VARS)
 LOCAL_MODULE := android-support-v7-mediarouter-api24
@@ -71,8 +63,6 @@
 LOCAL_JAVA_LANGUAGE_VERSION := 1.7
 include $(BUILD_STATIC_JAVA_LIBRARY)
 
-support_module_src_files += $(LOCAL_SRC_FILES)
-
 # Here is the final static library that apps can link against.
 # Applications that use this library must specify
 #
@@ -86,7 +76,7 @@
 include $(CLEAR_VARS)
 LOCAL_USE_AAPT2 := true
 LOCAL_MODULE := android-support-v7-mediarouter
-LOCAL_SDK_VERSION := 7
+LOCAL_SDK_VERSION := 9
 LOCAL_SDK_RES_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
 LOCAL_SRC_FILES := $(call all-java-files-under,src)
 LOCAL_STATIC_JAVA_LIBRARIES := android-support-v7-mediarouter-api24
@@ -99,26 +89,3 @@
 LOCAL_JAVA_LANGUAGE_VERSION := 1.7
 LOCAL_AAPT_FLAGS := --add-javadoc-annotation doconly
 include $(BUILD_STATIC_JAVA_LIBRARY)
-
-support_module_src_files += $(LOCAL_SRC_FILES)
-
-# API Check
-# ---------------------------------------------
-support_module := $(LOCAL_MODULE)
-support_module_api_dir := $(LOCAL_PATH)/api
-# We're asking doclava to generate stubs for android.support.v7.app in addition
-# to mediarouter, so we'll have to point doclava at the sources for
-# android.support.v7.app. Note that this API definition will overlap with that
-# of the android.support.v7.app package.
-support_module_src_files := $(LOCAL_SRC_FILES) \
-  ../appcompat/src/android/support/v7/app/AppCompatDelegate.java \
-  ../appcompat/src/android/support/v7/app/AppCompatCallback.java \
-  ../appcompat/src/android/support/v7/app/AppCompatDialog.java \
-  ../appcompat/src/android/support/v7/app/AlertDialog.java \
-  ../appcompat/src/android/support/v7/app/ActionBar.java \
-  ../appcompat/src/android/support/v7/app/ActionBarDrawerToggle.java \
-
-
-support_module_java_libraries := $(LOCAL_JAVA_LIBRARIES)
-support_module_java_packages := android.support.v7.app android.support.v7.media
-include $(SUPPORT_API_CHECK)
diff --git a/v7/mediarouter/AndroidManifest.xml b/v7/mediarouter/AndroidManifest.xml
index e611947..59d9f99 100644
--- a/v7/mediarouter/AndroidManifest.xml
+++ b/v7/mediarouter/AndroidManifest.xml
@@ -15,6 +15,6 @@
 -->
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
           package="android.support.v7.mediarouter">
-    <uses-sdk android:minSdkVersion="7"/>
+    <uses-sdk android:minSdkVersion="9"/>
     <application />
 </manifest>
diff --git a/v7/mediarouter/api/22.0.0.txt b/v7/mediarouter/api/22.0.0.txt
deleted file mode 100644
index 1c68702..0000000
--- a/v7/mediarouter/api/22.0.0.txt
+++ /dev/null
@@ -1,445 +0,0 @@
-package android.support.v7.app {
-
-  public class MediaRouteActionProvider extends android.support.v4.view.ActionProvider {
-    ctor public MediaRouteActionProvider(android.content.Context);
-    method public android.support.v7.app.MediaRouteDialogFactory getDialogFactory();
-    method public android.support.v7.app.MediaRouteButton getMediaRouteButton();
-    method public android.support.v7.media.MediaRouteSelector getRouteSelector();
-    method public android.view.View onCreateActionView();
-    method public android.support.v7.app.MediaRouteButton onCreateMediaRouteButton();
-    method public void setDialogFactory(android.support.v7.app.MediaRouteDialogFactory);
-    method public void setRouteSelector(android.support.v7.media.MediaRouteSelector);
-  }
-
-  public class MediaRouteButton extends android.view.View {
-    ctor public MediaRouteButton(android.content.Context);
-    ctor public MediaRouteButton(android.content.Context, android.util.AttributeSet);
-    ctor public MediaRouteButton(android.content.Context, android.util.AttributeSet, int);
-    method public android.support.v7.app.MediaRouteDialogFactory getDialogFactory();
-    method public android.support.v7.media.MediaRouteSelector getRouteSelector();
-    method public void onAttachedToWindow();
-    method public void onDetachedFromWindow();
-    method public void setDialogFactory(android.support.v7.app.MediaRouteDialogFactory);
-    method public void setRouteSelector(android.support.v7.media.MediaRouteSelector);
-    method public boolean showDialog();
-  }
-
-  public class MediaRouteChooserDialog extends android.app.Dialog {
-    ctor public MediaRouteChooserDialog(android.content.Context);
-    ctor public MediaRouteChooserDialog(android.content.Context, int);
-    method public android.support.v7.media.MediaRouteSelector getRouteSelector();
-    method public boolean onFilterRoute(android.support.v7.media.MediaRouter.RouteInfo);
-    method public void onFilterRoutes(java.util.List<android.support.v7.media.MediaRouter.RouteInfo>);
-    method public void refreshRoutes();
-    method public void setRouteSelector(android.support.v7.media.MediaRouteSelector);
-  }
-
-  public class MediaRouteChooserDialogFragment extends android.support.v4.app.DialogFragment {
-    ctor public MediaRouteChooserDialogFragment();
-    method public android.support.v7.media.MediaRouteSelector getRouteSelector();
-    method public android.support.v7.app.MediaRouteChooserDialog onCreateChooserDialog(android.content.Context, android.os.Bundle);
-    method public void setRouteSelector(android.support.v7.media.MediaRouteSelector);
-  }
-
-  public class MediaRouteControllerDialog extends android.app.Dialog {
-    ctor public MediaRouteControllerDialog(android.content.Context);
-    ctor public MediaRouteControllerDialog(android.content.Context, int);
-    method public android.view.View getMediaControlView();
-    method public android.support.v4.media.session.MediaSessionCompat.Token getMediaSession();
-    method public android.support.v7.media.MediaRouter.RouteInfo getRoute();
-    method public android.view.View onCreateMediaControlView(android.os.Bundle);
-  }
-
-  public class MediaRouteControllerDialogFragment extends android.support.v4.app.DialogFragment {
-    ctor public MediaRouteControllerDialogFragment();
-    method public android.support.v7.app.MediaRouteControllerDialog onCreateControllerDialog(android.content.Context, android.os.Bundle);
-  }
-
-  public class MediaRouteDialogFactory {
-    ctor public MediaRouteDialogFactory();
-    method public static android.support.v7.app.MediaRouteDialogFactory getDefault();
-    method public android.support.v7.app.MediaRouteChooserDialogFragment onCreateChooserDialogFragment();
-    method public android.support.v7.app.MediaRouteControllerDialogFragment onCreateControllerDialogFragment();
-  }
-
-  public class MediaRouteDiscoveryFragment extends android.support.v4.app.Fragment {
-    ctor public MediaRouteDiscoveryFragment();
-    method public android.support.v7.media.MediaRouter getMediaRouter();
-    method public android.support.v7.media.MediaRouteSelector getRouteSelector();
-    method public android.support.v7.media.MediaRouter.Callback onCreateCallback();
-    method public int onPrepareCallbackFlags();
-    method public void setRouteSelector(android.support.v7.media.MediaRouteSelector);
-  }
-
-}
-
-package android.support.v7.media {
-
-  public final class MediaControlIntent {
-    field public static final java.lang.String ACTION_END_SESSION = "android.media.intent.action.END_SESSION";
-    field public static final java.lang.String ACTION_ENQUEUE = "android.media.intent.action.ENQUEUE";
-    field public static final java.lang.String ACTION_GET_SESSION_STATUS = "android.media.intent.action.GET_SESSION_STATUS";
-    field public static final java.lang.String ACTION_GET_STATUS = "android.media.intent.action.GET_STATUS";
-    field public static final java.lang.String ACTION_PAUSE = "android.media.intent.action.PAUSE";
-    field public static final java.lang.String ACTION_PLAY = "android.media.intent.action.PLAY";
-    field public static final java.lang.String ACTION_REMOVE = "android.media.intent.action.REMOVE";
-    field public static final java.lang.String ACTION_RESUME = "android.media.intent.action.RESUME";
-    field public static final java.lang.String ACTION_SEEK = "android.media.intent.action.SEEK";
-    field public static final java.lang.String ACTION_START_SESSION = "android.media.intent.action.START_SESSION";
-    field public static final java.lang.String ACTION_STOP = "android.media.intent.action.STOP";
-    field public static final java.lang.String CATEGORY_LIVE_AUDIO = "android.media.intent.category.LIVE_AUDIO";
-    field public static final java.lang.String CATEGORY_LIVE_VIDEO = "android.media.intent.category.LIVE_VIDEO";
-    field public static final java.lang.String CATEGORY_REMOTE_PLAYBACK = "android.media.intent.category.REMOTE_PLAYBACK";
-    field public static final int ERROR_INVALID_ITEM_ID = 3; // 0x3
-    field public static final int ERROR_INVALID_SESSION_ID = 2; // 0x2
-    field public static final int ERROR_UNKNOWN = 0; // 0x0
-    field public static final int ERROR_UNSUPPORTED_OPERATION = 1; // 0x1
-    field public static final java.lang.String EXTRA_ERROR_CODE = "android.media.intent.extra.ERROR_CODE";
-    field public static final java.lang.String EXTRA_ITEM_CONTENT_POSITION = "android.media.intent.extra.ITEM_POSITION";
-    field public static final java.lang.String EXTRA_ITEM_HTTP_HEADERS = "android.media.intent.extra.HTTP_HEADERS";
-    field public static final java.lang.String EXTRA_ITEM_ID = "android.media.intent.extra.ITEM_ID";
-    field public static final java.lang.String EXTRA_ITEM_METADATA = "android.media.intent.extra.ITEM_METADATA";
-    field public static final java.lang.String EXTRA_ITEM_STATUS = "android.media.intent.extra.ITEM_STATUS";
-    field public static final java.lang.String EXTRA_ITEM_STATUS_UPDATE_RECEIVER = "android.media.intent.extra.ITEM_STATUS_UPDATE_RECEIVER";
-    field public static final java.lang.String EXTRA_SESSION_ID = "android.media.intent.extra.SESSION_ID";
-    field public static final java.lang.String EXTRA_SESSION_STATUS = "android.media.intent.extra.SESSION_STATUS";
-    field public static final java.lang.String EXTRA_SESSION_STATUS_UPDATE_RECEIVER = "android.media.intent.extra.SESSION_STATUS_UPDATE_RECEIVER";
-  }
-
-  public final class MediaItemMetadata {
-    field public static final java.lang.String KEY_ALBUM_ARTIST = "android.media.metadata.ALBUM_ARTIST";
-    field public static final java.lang.String KEY_ALBUM_TITLE = "android.media.metadata.ALBUM_TITLE";
-    field public static final java.lang.String KEY_ARTIST = "android.media.metadata.ARTIST";
-    field public static final java.lang.String KEY_ARTWORK_URI = "android.media.metadata.ARTWORK_URI";
-    field public static final java.lang.String KEY_AUTHOR = "android.media.metadata.AUTHOR";
-    field public static final java.lang.String KEY_COMPOSER = "android.media.metadata.COMPOSER";
-    field public static final java.lang.String KEY_DISC_NUMBER = "android.media.metadata.DISC_NUMBER";
-    field public static final java.lang.String KEY_DURATION = "android.media.metadata.DURATION";
-    field public static final java.lang.String KEY_TITLE = "android.media.metadata.TITLE";
-    field public static final java.lang.String KEY_TRACK_NUMBER = "android.media.metadata.TRACK_NUMBER";
-    field public static final java.lang.String KEY_YEAR = "android.media.metadata.YEAR";
-  }
-
-  public final class MediaItemStatus {
-    method public android.os.Bundle asBundle();
-    method public static android.support.v7.media.MediaItemStatus fromBundle(android.os.Bundle);
-    method public long getContentDuration();
-    method public long getContentPosition();
-    method public android.os.Bundle getExtras();
-    method public int getPlaybackState();
-    method public long getTimestamp();
-    field public static final java.lang.String EXTRA_HTTP_RESPONSE_HEADERS = "android.media.status.extra.HTTP_RESPONSE_HEADERS";
-    field public static final java.lang.String EXTRA_HTTP_STATUS_CODE = "android.media.status.extra.HTTP_STATUS_CODE";
-    field public static final int PLAYBACK_STATE_BUFFERING = 3; // 0x3
-    field public static final int PLAYBACK_STATE_CANCELED = 5; // 0x5
-    field public static final int PLAYBACK_STATE_ERROR = 7; // 0x7
-    field public static final int PLAYBACK_STATE_FINISHED = 4; // 0x4
-    field public static final int PLAYBACK_STATE_INVALIDATED = 6; // 0x6
-    field public static final int PLAYBACK_STATE_PAUSED = 2; // 0x2
-    field public static final int PLAYBACK_STATE_PENDING = 0; // 0x0
-    field public static final int PLAYBACK_STATE_PLAYING = 1; // 0x1
-  }
-
-  public static final class MediaItemStatus.Builder {
-    ctor public MediaItemStatus.Builder(int);
-    ctor public MediaItemStatus.Builder(android.support.v7.media.MediaItemStatus);
-    method public android.support.v7.media.MediaItemStatus build();
-    method public android.support.v7.media.MediaItemStatus.Builder setContentDuration(long);
-    method public android.support.v7.media.MediaItemStatus.Builder setContentPosition(long);
-    method public android.support.v7.media.MediaItemStatus.Builder setExtras(android.os.Bundle);
-    method public android.support.v7.media.MediaItemStatus.Builder setPlaybackState(int);
-    method public android.support.v7.media.MediaItemStatus.Builder setTimestamp(long);
-  }
-
-  public final class MediaRouteDescriptor {
-    method public android.os.Bundle asBundle();
-    method public boolean canDisconnectAndKeepPlaying();
-    method public static android.support.v7.media.MediaRouteDescriptor fromBundle(android.os.Bundle);
-    method public java.util.List<android.content.IntentFilter> getControlFilters();
-    method public java.lang.String getDescription();
-    method public android.os.Bundle getExtras();
-    method public java.lang.String getId();
-    method public java.lang.String getName();
-    method public int getPlaybackStream();
-    method public int getPlaybackType();
-    method public int getPresentationDisplayId();
-    method public android.content.IntentSender getSettingsActivity();
-    method public int getVolume();
-    method public int getVolumeHandling();
-    method public int getVolumeMax();
-    method public boolean isConnecting();
-    method public boolean isEnabled();
-    method public boolean isValid();
-  }
-
-  public static final class MediaRouteDescriptor.Builder {
-    ctor public MediaRouteDescriptor.Builder(java.lang.String, java.lang.String);
-    ctor public MediaRouteDescriptor.Builder(android.support.v7.media.MediaRouteDescriptor);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder addControlFilter(android.content.IntentFilter);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder addControlFilters(java.util.Collection<android.content.IntentFilter>);
-    method public android.support.v7.media.MediaRouteDescriptor build();
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setCanDisconnect(boolean);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setConnecting(boolean);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setDescription(java.lang.String);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setEnabled(boolean);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setExtras(android.os.Bundle);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setId(java.lang.String);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setName(java.lang.String);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setPlaybackStream(int);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setPlaybackType(int);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setPresentationDisplayId(int);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setSettingsActivity(android.content.IntentSender);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setVolume(int);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setVolumeHandling(int);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setVolumeMax(int);
-  }
-
-  public final class MediaRouteDiscoveryRequest {
-    ctor public MediaRouteDiscoveryRequest(android.support.v7.media.MediaRouteSelector, boolean);
-    method public android.os.Bundle asBundle();
-    method public static android.support.v7.media.MediaRouteDiscoveryRequest fromBundle(android.os.Bundle);
-    method public android.support.v7.media.MediaRouteSelector getSelector();
-    method public boolean isActiveScan();
-    method public boolean isValid();
-  }
-
-  public abstract class MediaRouteProvider {
-    ctor public MediaRouteProvider(android.content.Context);
-    method public final android.content.Context getContext();
-    method public final android.support.v7.media.MediaRouteProviderDescriptor getDescriptor();
-    method public final android.support.v7.media.MediaRouteDiscoveryRequest getDiscoveryRequest();
-    method public final android.os.Handler getHandler();
-    method public final android.support.v7.media.MediaRouteProvider.ProviderMetadata getMetadata();
-    method public android.support.v7.media.MediaRouteProvider.RouteController onCreateRouteController(java.lang.String);
-    method public void onDiscoveryRequestChanged(android.support.v7.media.MediaRouteDiscoveryRequest);
-    method public final void setCallback(android.support.v7.media.MediaRouteProvider.Callback);
-    method public final void setDescriptor(android.support.v7.media.MediaRouteProviderDescriptor);
-    method public final void setDiscoveryRequest(android.support.v7.media.MediaRouteDiscoveryRequest);
-  }
-
-  public static abstract class MediaRouteProvider.Callback {
-    ctor public MediaRouteProvider.Callback();
-    method public void onDescriptorChanged(android.support.v7.media.MediaRouteProvider, android.support.v7.media.MediaRouteProviderDescriptor);
-  }
-
-  public static final class MediaRouteProvider.ProviderMetadata {
-    method public android.content.ComponentName getComponentName();
-    method public java.lang.String getPackageName();
-  }
-
-  public static abstract class MediaRouteProvider.RouteController {
-    ctor public MediaRouteProvider.RouteController();
-    method public boolean onControlRequest(android.content.Intent, android.support.v7.media.MediaRouter.ControlRequestCallback);
-    method public void onRelease();
-    method public void onSelect();
-    method public void onSetVolume(int);
-    method public void onUnselect();
-    method public void onUnselect(int);
-    method public void onUpdateVolume(int);
-  }
-
-  public final class MediaRouteProviderDescriptor {
-    method public android.os.Bundle asBundle();
-    method public static android.support.v7.media.MediaRouteProviderDescriptor fromBundle(android.os.Bundle);
-    method public java.util.List<android.support.v7.media.MediaRouteDescriptor> getRoutes();
-    method public boolean isValid();
-  }
-
-  public static final class MediaRouteProviderDescriptor.Builder {
-    ctor public MediaRouteProviderDescriptor.Builder();
-    ctor public MediaRouteProviderDescriptor.Builder(android.support.v7.media.MediaRouteProviderDescriptor);
-    method public android.support.v7.media.MediaRouteProviderDescriptor.Builder addRoute(android.support.v7.media.MediaRouteDescriptor);
-    method public android.support.v7.media.MediaRouteProviderDescriptor.Builder addRoutes(java.util.Collection<android.support.v7.media.MediaRouteDescriptor>);
-    method public android.support.v7.media.MediaRouteProviderDescriptor build();
-  }
-
-  public abstract class MediaRouteProviderService extends android.app.Service {
-    ctor public MediaRouteProviderService();
-    method public android.support.v7.media.MediaRouteProvider getMediaRouteProvider();
-    method public android.os.IBinder onBind(android.content.Intent);
-    method public abstract android.support.v7.media.MediaRouteProvider onCreateMediaRouteProvider();
-    field public static final java.lang.String SERVICE_INTERFACE = "android.media.MediaRouteProviderService";
-  }
-
-  public final class MediaRouteSelector {
-    method public android.os.Bundle asBundle();
-    method public boolean contains(android.support.v7.media.MediaRouteSelector);
-    method public static android.support.v7.media.MediaRouteSelector fromBundle(android.os.Bundle);
-    method public java.util.List<java.lang.String> getControlCategories();
-    method public boolean hasControlCategory(java.lang.String);
-    method public boolean isEmpty();
-    method public boolean isValid();
-    method public boolean matchesControlFilters(java.util.List<android.content.IntentFilter>);
-    field public static final android.support.v7.media.MediaRouteSelector EMPTY;
-  }
-
-  public static final class MediaRouteSelector.Builder {
-    ctor public MediaRouteSelector.Builder();
-    ctor public MediaRouteSelector.Builder(android.support.v7.media.MediaRouteSelector);
-    method public android.support.v7.media.MediaRouteSelector.Builder addControlCategories(java.util.Collection<java.lang.String>);
-    method public android.support.v7.media.MediaRouteSelector.Builder addControlCategory(java.lang.String);
-    method public android.support.v7.media.MediaRouteSelector.Builder addSelector(android.support.v7.media.MediaRouteSelector);
-    method public android.support.v7.media.MediaRouteSelector build();
-  }
-
-  public final class MediaRouter {
-    method public void addCallback(android.support.v7.media.MediaRouteSelector, android.support.v7.media.MediaRouter.Callback);
-    method public void addCallback(android.support.v7.media.MediaRouteSelector, android.support.v7.media.MediaRouter.Callback, int);
-    method public void addProvider(android.support.v7.media.MediaRouteProvider);
-    method public void addRemoteControlClient(java.lang.Object);
-    method public android.support.v7.media.MediaRouter.RouteInfo getDefaultRoute();
-    method public static android.support.v7.media.MediaRouter getInstance(android.content.Context);
-    method public android.support.v4.media.session.MediaSessionCompat.Token getMediaSessionToken();
-    method public java.util.List<android.support.v7.media.MediaRouter.ProviderInfo> getProviders();
-    method public java.util.List<android.support.v7.media.MediaRouter.RouteInfo> getRoutes();
-    method public android.support.v7.media.MediaRouter.RouteInfo getSelectedRoute();
-    method public boolean isRouteAvailable(android.support.v7.media.MediaRouteSelector, int);
-    method public void removeCallback(android.support.v7.media.MediaRouter.Callback);
-    method public void removeProvider(android.support.v7.media.MediaRouteProvider);
-    method public void removeRemoteControlClient(java.lang.Object);
-    method public void selectRoute(android.support.v7.media.MediaRouter.RouteInfo);
-    method public void setMediaSession(java.lang.Object);
-    method public void setMediaSessionCompat(android.support.v4.media.session.MediaSessionCompat);
-    method public void unselect(int);
-    method public android.support.v7.media.MediaRouter.RouteInfo updateSelectedRoute(android.support.v7.media.MediaRouteSelector);
-    field public static final int AVAILABILITY_FLAG_IGNORE_DEFAULT_ROUTE = 1; // 0x1
-    field public static final int AVAILABILITY_FLAG_REQUIRE_MATCH = 2; // 0x2
-    field public static final int CALLBACK_FLAG_FORCE_DISCOVERY = 8; // 0x8
-    field public static final int CALLBACK_FLAG_PERFORM_ACTIVE_SCAN = 1; // 0x1
-    field public static final int CALLBACK_FLAG_REQUEST_DISCOVERY = 4; // 0x4
-    field public static final int CALLBACK_FLAG_UNFILTERED_EVENTS = 2; // 0x2
-    field public static final int UNSELECT_REASON_DISCONNECTED = 1; // 0x1
-    field public static final int UNSELECT_REASON_ROUTE_CHANGED = 3; // 0x3
-    field public static final int UNSELECT_REASON_STOPPED = 2; // 0x2
-    field public static final int UNSELECT_REASON_UNKNOWN = 0; // 0x0
-  }
-
-  public static abstract class MediaRouter.Callback {
-    ctor public MediaRouter.Callback();
-    method public void onProviderAdded(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.ProviderInfo);
-    method public void onProviderChanged(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.ProviderInfo);
-    method public void onProviderRemoved(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.ProviderInfo);
-    method public void onRouteAdded(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
-    method public void onRouteChanged(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
-    method public void onRoutePresentationDisplayChanged(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
-    method public void onRouteRemoved(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
-    method public void onRouteSelected(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
-    method public void onRouteUnselected(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
-    method public void onRouteVolumeChanged(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
-  }
-
-  public static abstract class MediaRouter.ControlRequestCallback {
-    ctor public MediaRouter.ControlRequestCallback();
-    method public void onError(java.lang.String, android.os.Bundle);
-    method public void onResult(android.os.Bundle);
-  }
-
-  public static final class MediaRouter.ProviderInfo {
-    method public android.content.ComponentName getComponentName();
-    method public java.lang.String getPackageName();
-    method public android.support.v7.media.MediaRouteProvider getProviderInstance();
-    method public java.util.List<android.support.v7.media.MediaRouter.RouteInfo> getRoutes();
-  }
-
-  public static final class MediaRouter.RouteInfo {
-    method public boolean canDisconnect();
-    method public java.util.List<android.content.IntentFilter> getControlFilters();
-    method public java.lang.String getDescription();
-    method public android.os.Bundle getExtras();
-    method public java.lang.String getId();
-    method public java.lang.String getName();
-    method public int getPlaybackStream();
-    method public int getPlaybackType();
-    method public android.view.Display getPresentationDisplay();
-    method public android.support.v7.media.MediaRouter.ProviderInfo getProvider();
-    method public android.content.IntentSender getSettingsIntent();
-    method public int getVolume();
-    method public int getVolumeHandling();
-    method public int getVolumeMax();
-    method public boolean isConnecting();
-    method public boolean isDefault();
-    method public boolean isEnabled();
-    method public boolean isSelected();
-    method public boolean matchesSelector(android.support.v7.media.MediaRouteSelector);
-    method public void requestSetVolume(int);
-    method public void requestUpdateVolume(int);
-    method public void select();
-    method public void sendControlRequest(android.content.Intent, android.support.v7.media.MediaRouter.ControlRequestCallback);
-    method public boolean supportsControlAction(java.lang.String, java.lang.String);
-    method public boolean supportsControlCategory(java.lang.String);
-    method public boolean supportsControlRequest(android.content.Intent);
-    field public static final int PLAYBACK_TYPE_LOCAL = 0; // 0x0
-    field public static final int PLAYBACK_TYPE_REMOTE = 1; // 0x1
-    field public static final int PLAYBACK_VOLUME_FIXED = 0; // 0x0
-    field public static final int PLAYBACK_VOLUME_VARIABLE = 1; // 0x1
-  }
-
-  public final class MediaSessionStatus {
-    method public android.os.Bundle asBundle();
-    method public static android.support.v7.media.MediaSessionStatus fromBundle(android.os.Bundle);
-    method public android.os.Bundle getExtras();
-    method public int getSessionState();
-    method public long getTimestamp();
-    method public boolean isQueuePaused();
-    field public static final int SESSION_STATE_ACTIVE = 0; // 0x0
-    field public static final int SESSION_STATE_ENDED = 1; // 0x1
-    field public static final int SESSION_STATE_INVALIDATED = 2; // 0x2
-  }
-
-  public static final class MediaSessionStatus.Builder {
-    ctor public MediaSessionStatus.Builder(int);
-    ctor public MediaSessionStatus.Builder(android.support.v7.media.MediaSessionStatus);
-    method public android.support.v7.media.MediaSessionStatus build();
-    method public android.support.v7.media.MediaSessionStatus.Builder setExtras(android.os.Bundle);
-    method public android.support.v7.media.MediaSessionStatus.Builder setQueuePaused(boolean);
-    method public android.support.v7.media.MediaSessionStatus.Builder setSessionState(int);
-    method public android.support.v7.media.MediaSessionStatus.Builder setTimestamp(long);
-  }
-
-  public class RemotePlaybackClient {
-    ctor public RemotePlaybackClient(android.content.Context, android.support.v7.media.MediaRouter.RouteInfo);
-    method public void endSession(android.os.Bundle, android.support.v7.media.RemotePlaybackClient.SessionActionCallback);
-    method public void enqueue(android.net.Uri, java.lang.String, android.os.Bundle, long, android.os.Bundle, android.support.v7.media.RemotePlaybackClient.ItemActionCallback);
-    method public java.lang.String getSessionId();
-    method public void getSessionStatus(android.os.Bundle, android.support.v7.media.RemotePlaybackClient.SessionActionCallback);
-    method public void getStatus(java.lang.String, android.os.Bundle, android.support.v7.media.RemotePlaybackClient.ItemActionCallback);
-    method public boolean hasSession();
-    method public boolean isQueuingSupported();
-    method public boolean isRemotePlaybackSupported();
-    method public boolean isSessionManagementSupported();
-    method public void pause(android.os.Bundle, android.support.v7.media.RemotePlaybackClient.SessionActionCallback);
-    method public void play(android.net.Uri, java.lang.String, android.os.Bundle, long, android.os.Bundle, android.support.v7.media.RemotePlaybackClient.ItemActionCallback);
-    method public void release();
-    method public void remove(java.lang.String, android.os.Bundle, android.support.v7.media.RemotePlaybackClient.ItemActionCallback);
-    method public void resume(android.os.Bundle, android.support.v7.media.RemotePlaybackClient.SessionActionCallback);
-    method public void seek(java.lang.String, long, android.os.Bundle, android.support.v7.media.RemotePlaybackClient.ItemActionCallback);
-    method public void setSessionId(java.lang.String);
-    method public void setStatusCallback(android.support.v7.media.RemotePlaybackClient.StatusCallback);
-    method public void startSession(android.os.Bundle, android.support.v7.media.RemotePlaybackClient.SessionActionCallback);
-    method public void stop(android.os.Bundle, android.support.v7.media.RemotePlaybackClient.SessionActionCallback);
-  }
-
-  public static abstract class RemotePlaybackClient.ActionCallback {
-    ctor public RemotePlaybackClient.ActionCallback();
-    method public void onError(java.lang.String, int, android.os.Bundle);
-  }
-
-  public static abstract class RemotePlaybackClient.ItemActionCallback extends android.support.v7.media.RemotePlaybackClient.ActionCallback {
-    ctor public RemotePlaybackClient.ItemActionCallback();
-    method public void onResult(android.os.Bundle, java.lang.String, android.support.v7.media.MediaSessionStatus, java.lang.String, android.support.v7.media.MediaItemStatus);
-  }
-
-  public static abstract class RemotePlaybackClient.SessionActionCallback extends android.support.v7.media.RemotePlaybackClient.ActionCallback {
-    ctor public RemotePlaybackClient.SessionActionCallback();
-    method public void onResult(android.os.Bundle, java.lang.String, android.support.v7.media.MediaSessionStatus);
-  }
-
-  public static abstract class RemotePlaybackClient.StatusCallback {
-    ctor public RemotePlaybackClient.StatusCallback();
-    method public void onItemStatusChanged(android.os.Bundle, java.lang.String, android.support.v7.media.MediaSessionStatus, java.lang.String, android.support.v7.media.MediaItemStatus);
-    method public void onSessionChanged(java.lang.String);
-    method public void onSessionStatusChanged(android.os.Bundle, java.lang.String, android.support.v7.media.MediaSessionStatus);
-  }
-
-}
-
diff --git a/v7/mediarouter/api/22.1.0.txt b/v7/mediarouter/api/22.1.0.txt
deleted file mode 100644
index 1c68702..0000000
--- a/v7/mediarouter/api/22.1.0.txt
+++ /dev/null
@@ -1,445 +0,0 @@
-package android.support.v7.app {
-
-  public class MediaRouteActionProvider extends android.support.v4.view.ActionProvider {
-    ctor public MediaRouteActionProvider(android.content.Context);
-    method public android.support.v7.app.MediaRouteDialogFactory getDialogFactory();
-    method public android.support.v7.app.MediaRouteButton getMediaRouteButton();
-    method public android.support.v7.media.MediaRouteSelector getRouteSelector();
-    method public android.view.View onCreateActionView();
-    method public android.support.v7.app.MediaRouteButton onCreateMediaRouteButton();
-    method public void setDialogFactory(android.support.v7.app.MediaRouteDialogFactory);
-    method public void setRouteSelector(android.support.v7.media.MediaRouteSelector);
-  }
-
-  public class MediaRouteButton extends android.view.View {
-    ctor public MediaRouteButton(android.content.Context);
-    ctor public MediaRouteButton(android.content.Context, android.util.AttributeSet);
-    ctor public MediaRouteButton(android.content.Context, android.util.AttributeSet, int);
-    method public android.support.v7.app.MediaRouteDialogFactory getDialogFactory();
-    method public android.support.v7.media.MediaRouteSelector getRouteSelector();
-    method public void onAttachedToWindow();
-    method public void onDetachedFromWindow();
-    method public void setDialogFactory(android.support.v7.app.MediaRouteDialogFactory);
-    method public void setRouteSelector(android.support.v7.media.MediaRouteSelector);
-    method public boolean showDialog();
-  }
-
-  public class MediaRouteChooserDialog extends android.app.Dialog {
-    ctor public MediaRouteChooserDialog(android.content.Context);
-    ctor public MediaRouteChooserDialog(android.content.Context, int);
-    method public android.support.v7.media.MediaRouteSelector getRouteSelector();
-    method public boolean onFilterRoute(android.support.v7.media.MediaRouter.RouteInfo);
-    method public void onFilterRoutes(java.util.List<android.support.v7.media.MediaRouter.RouteInfo>);
-    method public void refreshRoutes();
-    method public void setRouteSelector(android.support.v7.media.MediaRouteSelector);
-  }
-
-  public class MediaRouteChooserDialogFragment extends android.support.v4.app.DialogFragment {
-    ctor public MediaRouteChooserDialogFragment();
-    method public android.support.v7.media.MediaRouteSelector getRouteSelector();
-    method public android.support.v7.app.MediaRouteChooserDialog onCreateChooserDialog(android.content.Context, android.os.Bundle);
-    method public void setRouteSelector(android.support.v7.media.MediaRouteSelector);
-  }
-
-  public class MediaRouteControllerDialog extends android.app.Dialog {
-    ctor public MediaRouteControllerDialog(android.content.Context);
-    ctor public MediaRouteControllerDialog(android.content.Context, int);
-    method public android.view.View getMediaControlView();
-    method public android.support.v4.media.session.MediaSessionCompat.Token getMediaSession();
-    method public android.support.v7.media.MediaRouter.RouteInfo getRoute();
-    method public android.view.View onCreateMediaControlView(android.os.Bundle);
-  }
-
-  public class MediaRouteControllerDialogFragment extends android.support.v4.app.DialogFragment {
-    ctor public MediaRouteControllerDialogFragment();
-    method public android.support.v7.app.MediaRouteControllerDialog onCreateControllerDialog(android.content.Context, android.os.Bundle);
-  }
-
-  public class MediaRouteDialogFactory {
-    ctor public MediaRouteDialogFactory();
-    method public static android.support.v7.app.MediaRouteDialogFactory getDefault();
-    method public android.support.v7.app.MediaRouteChooserDialogFragment onCreateChooserDialogFragment();
-    method public android.support.v7.app.MediaRouteControllerDialogFragment onCreateControllerDialogFragment();
-  }
-
-  public class MediaRouteDiscoveryFragment extends android.support.v4.app.Fragment {
-    ctor public MediaRouteDiscoveryFragment();
-    method public android.support.v7.media.MediaRouter getMediaRouter();
-    method public android.support.v7.media.MediaRouteSelector getRouteSelector();
-    method public android.support.v7.media.MediaRouter.Callback onCreateCallback();
-    method public int onPrepareCallbackFlags();
-    method public void setRouteSelector(android.support.v7.media.MediaRouteSelector);
-  }
-
-}
-
-package android.support.v7.media {
-
-  public final class MediaControlIntent {
-    field public static final java.lang.String ACTION_END_SESSION = "android.media.intent.action.END_SESSION";
-    field public static final java.lang.String ACTION_ENQUEUE = "android.media.intent.action.ENQUEUE";
-    field public static final java.lang.String ACTION_GET_SESSION_STATUS = "android.media.intent.action.GET_SESSION_STATUS";
-    field public static final java.lang.String ACTION_GET_STATUS = "android.media.intent.action.GET_STATUS";
-    field public static final java.lang.String ACTION_PAUSE = "android.media.intent.action.PAUSE";
-    field public static final java.lang.String ACTION_PLAY = "android.media.intent.action.PLAY";
-    field public static final java.lang.String ACTION_REMOVE = "android.media.intent.action.REMOVE";
-    field public static final java.lang.String ACTION_RESUME = "android.media.intent.action.RESUME";
-    field public static final java.lang.String ACTION_SEEK = "android.media.intent.action.SEEK";
-    field public static final java.lang.String ACTION_START_SESSION = "android.media.intent.action.START_SESSION";
-    field public static final java.lang.String ACTION_STOP = "android.media.intent.action.STOP";
-    field public static final java.lang.String CATEGORY_LIVE_AUDIO = "android.media.intent.category.LIVE_AUDIO";
-    field public static final java.lang.String CATEGORY_LIVE_VIDEO = "android.media.intent.category.LIVE_VIDEO";
-    field public static final java.lang.String CATEGORY_REMOTE_PLAYBACK = "android.media.intent.category.REMOTE_PLAYBACK";
-    field public static final int ERROR_INVALID_ITEM_ID = 3; // 0x3
-    field public static final int ERROR_INVALID_SESSION_ID = 2; // 0x2
-    field public static final int ERROR_UNKNOWN = 0; // 0x0
-    field public static final int ERROR_UNSUPPORTED_OPERATION = 1; // 0x1
-    field public static final java.lang.String EXTRA_ERROR_CODE = "android.media.intent.extra.ERROR_CODE";
-    field public static final java.lang.String EXTRA_ITEM_CONTENT_POSITION = "android.media.intent.extra.ITEM_POSITION";
-    field public static final java.lang.String EXTRA_ITEM_HTTP_HEADERS = "android.media.intent.extra.HTTP_HEADERS";
-    field public static final java.lang.String EXTRA_ITEM_ID = "android.media.intent.extra.ITEM_ID";
-    field public static final java.lang.String EXTRA_ITEM_METADATA = "android.media.intent.extra.ITEM_METADATA";
-    field public static final java.lang.String EXTRA_ITEM_STATUS = "android.media.intent.extra.ITEM_STATUS";
-    field public static final java.lang.String EXTRA_ITEM_STATUS_UPDATE_RECEIVER = "android.media.intent.extra.ITEM_STATUS_UPDATE_RECEIVER";
-    field public static final java.lang.String EXTRA_SESSION_ID = "android.media.intent.extra.SESSION_ID";
-    field public static final java.lang.String EXTRA_SESSION_STATUS = "android.media.intent.extra.SESSION_STATUS";
-    field public static final java.lang.String EXTRA_SESSION_STATUS_UPDATE_RECEIVER = "android.media.intent.extra.SESSION_STATUS_UPDATE_RECEIVER";
-  }
-
-  public final class MediaItemMetadata {
-    field public static final java.lang.String KEY_ALBUM_ARTIST = "android.media.metadata.ALBUM_ARTIST";
-    field public static final java.lang.String KEY_ALBUM_TITLE = "android.media.metadata.ALBUM_TITLE";
-    field public static final java.lang.String KEY_ARTIST = "android.media.metadata.ARTIST";
-    field public static final java.lang.String KEY_ARTWORK_URI = "android.media.metadata.ARTWORK_URI";
-    field public static final java.lang.String KEY_AUTHOR = "android.media.metadata.AUTHOR";
-    field public static final java.lang.String KEY_COMPOSER = "android.media.metadata.COMPOSER";
-    field public static final java.lang.String KEY_DISC_NUMBER = "android.media.metadata.DISC_NUMBER";
-    field public static final java.lang.String KEY_DURATION = "android.media.metadata.DURATION";
-    field public static final java.lang.String KEY_TITLE = "android.media.metadata.TITLE";
-    field public static final java.lang.String KEY_TRACK_NUMBER = "android.media.metadata.TRACK_NUMBER";
-    field public static final java.lang.String KEY_YEAR = "android.media.metadata.YEAR";
-  }
-
-  public final class MediaItemStatus {
-    method public android.os.Bundle asBundle();
-    method public static android.support.v7.media.MediaItemStatus fromBundle(android.os.Bundle);
-    method public long getContentDuration();
-    method public long getContentPosition();
-    method public android.os.Bundle getExtras();
-    method public int getPlaybackState();
-    method public long getTimestamp();
-    field public static final java.lang.String EXTRA_HTTP_RESPONSE_HEADERS = "android.media.status.extra.HTTP_RESPONSE_HEADERS";
-    field public static final java.lang.String EXTRA_HTTP_STATUS_CODE = "android.media.status.extra.HTTP_STATUS_CODE";
-    field public static final int PLAYBACK_STATE_BUFFERING = 3; // 0x3
-    field public static final int PLAYBACK_STATE_CANCELED = 5; // 0x5
-    field public static final int PLAYBACK_STATE_ERROR = 7; // 0x7
-    field public static final int PLAYBACK_STATE_FINISHED = 4; // 0x4
-    field public static final int PLAYBACK_STATE_INVALIDATED = 6; // 0x6
-    field public static final int PLAYBACK_STATE_PAUSED = 2; // 0x2
-    field public static final int PLAYBACK_STATE_PENDING = 0; // 0x0
-    field public static final int PLAYBACK_STATE_PLAYING = 1; // 0x1
-  }
-
-  public static final class MediaItemStatus.Builder {
-    ctor public MediaItemStatus.Builder(int);
-    ctor public MediaItemStatus.Builder(android.support.v7.media.MediaItemStatus);
-    method public android.support.v7.media.MediaItemStatus build();
-    method public android.support.v7.media.MediaItemStatus.Builder setContentDuration(long);
-    method public android.support.v7.media.MediaItemStatus.Builder setContentPosition(long);
-    method public android.support.v7.media.MediaItemStatus.Builder setExtras(android.os.Bundle);
-    method public android.support.v7.media.MediaItemStatus.Builder setPlaybackState(int);
-    method public android.support.v7.media.MediaItemStatus.Builder setTimestamp(long);
-  }
-
-  public final class MediaRouteDescriptor {
-    method public android.os.Bundle asBundle();
-    method public boolean canDisconnectAndKeepPlaying();
-    method public static android.support.v7.media.MediaRouteDescriptor fromBundle(android.os.Bundle);
-    method public java.util.List<android.content.IntentFilter> getControlFilters();
-    method public java.lang.String getDescription();
-    method public android.os.Bundle getExtras();
-    method public java.lang.String getId();
-    method public java.lang.String getName();
-    method public int getPlaybackStream();
-    method public int getPlaybackType();
-    method public int getPresentationDisplayId();
-    method public android.content.IntentSender getSettingsActivity();
-    method public int getVolume();
-    method public int getVolumeHandling();
-    method public int getVolumeMax();
-    method public boolean isConnecting();
-    method public boolean isEnabled();
-    method public boolean isValid();
-  }
-
-  public static final class MediaRouteDescriptor.Builder {
-    ctor public MediaRouteDescriptor.Builder(java.lang.String, java.lang.String);
-    ctor public MediaRouteDescriptor.Builder(android.support.v7.media.MediaRouteDescriptor);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder addControlFilter(android.content.IntentFilter);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder addControlFilters(java.util.Collection<android.content.IntentFilter>);
-    method public android.support.v7.media.MediaRouteDescriptor build();
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setCanDisconnect(boolean);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setConnecting(boolean);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setDescription(java.lang.String);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setEnabled(boolean);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setExtras(android.os.Bundle);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setId(java.lang.String);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setName(java.lang.String);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setPlaybackStream(int);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setPlaybackType(int);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setPresentationDisplayId(int);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setSettingsActivity(android.content.IntentSender);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setVolume(int);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setVolumeHandling(int);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setVolumeMax(int);
-  }
-
-  public final class MediaRouteDiscoveryRequest {
-    ctor public MediaRouteDiscoveryRequest(android.support.v7.media.MediaRouteSelector, boolean);
-    method public android.os.Bundle asBundle();
-    method public static android.support.v7.media.MediaRouteDiscoveryRequest fromBundle(android.os.Bundle);
-    method public android.support.v7.media.MediaRouteSelector getSelector();
-    method public boolean isActiveScan();
-    method public boolean isValid();
-  }
-
-  public abstract class MediaRouteProvider {
-    ctor public MediaRouteProvider(android.content.Context);
-    method public final android.content.Context getContext();
-    method public final android.support.v7.media.MediaRouteProviderDescriptor getDescriptor();
-    method public final android.support.v7.media.MediaRouteDiscoveryRequest getDiscoveryRequest();
-    method public final android.os.Handler getHandler();
-    method public final android.support.v7.media.MediaRouteProvider.ProviderMetadata getMetadata();
-    method public android.support.v7.media.MediaRouteProvider.RouteController onCreateRouteController(java.lang.String);
-    method public void onDiscoveryRequestChanged(android.support.v7.media.MediaRouteDiscoveryRequest);
-    method public final void setCallback(android.support.v7.media.MediaRouteProvider.Callback);
-    method public final void setDescriptor(android.support.v7.media.MediaRouteProviderDescriptor);
-    method public final void setDiscoveryRequest(android.support.v7.media.MediaRouteDiscoveryRequest);
-  }
-
-  public static abstract class MediaRouteProvider.Callback {
-    ctor public MediaRouteProvider.Callback();
-    method public void onDescriptorChanged(android.support.v7.media.MediaRouteProvider, android.support.v7.media.MediaRouteProviderDescriptor);
-  }
-
-  public static final class MediaRouteProvider.ProviderMetadata {
-    method public android.content.ComponentName getComponentName();
-    method public java.lang.String getPackageName();
-  }
-
-  public static abstract class MediaRouteProvider.RouteController {
-    ctor public MediaRouteProvider.RouteController();
-    method public boolean onControlRequest(android.content.Intent, android.support.v7.media.MediaRouter.ControlRequestCallback);
-    method public void onRelease();
-    method public void onSelect();
-    method public void onSetVolume(int);
-    method public void onUnselect();
-    method public void onUnselect(int);
-    method public void onUpdateVolume(int);
-  }
-
-  public final class MediaRouteProviderDescriptor {
-    method public android.os.Bundle asBundle();
-    method public static android.support.v7.media.MediaRouteProviderDescriptor fromBundle(android.os.Bundle);
-    method public java.util.List<android.support.v7.media.MediaRouteDescriptor> getRoutes();
-    method public boolean isValid();
-  }
-
-  public static final class MediaRouteProviderDescriptor.Builder {
-    ctor public MediaRouteProviderDescriptor.Builder();
-    ctor public MediaRouteProviderDescriptor.Builder(android.support.v7.media.MediaRouteProviderDescriptor);
-    method public android.support.v7.media.MediaRouteProviderDescriptor.Builder addRoute(android.support.v7.media.MediaRouteDescriptor);
-    method public android.support.v7.media.MediaRouteProviderDescriptor.Builder addRoutes(java.util.Collection<android.support.v7.media.MediaRouteDescriptor>);
-    method public android.support.v7.media.MediaRouteProviderDescriptor build();
-  }
-
-  public abstract class MediaRouteProviderService extends android.app.Service {
-    ctor public MediaRouteProviderService();
-    method public android.support.v7.media.MediaRouteProvider getMediaRouteProvider();
-    method public android.os.IBinder onBind(android.content.Intent);
-    method public abstract android.support.v7.media.MediaRouteProvider onCreateMediaRouteProvider();
-    field public static final java.lang.String SERVICE_INTERFACE = "android.media.MediaRouteProviderService";
-  }
-
-  public final class MediaRouteSelector {
-    method public android.os.Bundle asBundle();
-    method public boolean contains(android.support.v7.media.MediaRouteSelector);
-    method public static android.support.v7.media.MediaRouteSelector fromBundle(android.os.Bundle);
-    method public java.util.List<java.lang.String> getControlCategories();
-    method public boolean hasControlCategory(java.lang.String);
-    method public boolean isEmpty();
-    method public boolean isValid();
-    method public boolean matchesControlFilters(java.util.List<android.content.IntentFilter>);
-    field public static final android.support.v7.media.MediaRouteSelector EMPTY;
-  }
-
-  public static final class MediaRouteSelector.Builder {
-    ctor public MediaRouteSelector.Builder();
-    ctor public MediaRouteSelector.Builder(android.support.v7.media.MediaRouteSelector);
-    method public android.support.v7.media.MediaRouteSelector.Builder addControlCategories(java.util.Collection<java.lang.String>);
-    method public android.support.v7.media.MediaRouteSelector.Builder addControlCategory(java.lang.String);
-    method public android.support.v7.media.MediaRouteSelector.Builder addSelector(android.support.v7.media.MediaRouteSelector);
-    method public android.support.v7.media.MediaRouteSelector build();
-  }
-
-  public final class MediaRouter {
-    method public void addCallback(android.support.v7.media.MediaRouteSelector, android.support.v7.media.MediaRouter.Callback);
-    method public void addCallback(android.support.v7.media.MediaRouteSelector, android.support.v7.media.MediaRouter.Callback, int);
-    method public void addProvider(android.support.v7.media.MediaRouteProvider);
-    method public void addRemoteControlClient(java.lang.Object);
-    method public android.support.v7.media.MediaRouter.RouteInfo getDefaultRoute();
-    method public static android.support.v7.media.MediaRouter getInstance(android.content.Context);
-    method public android.support.v4.media.session.MediaSessionCompat.Token getMediaSessionToken();
-    method public java.util.List<android.support.v7.media.MediaRouter.ProviderInfo> getProviders();
-    method public java.util.List<android.support.v7.media.MediaRouter.RouteInfo> getRoutes();
-    method public android.support.v7.media.MediaRouter.RouteInfo getSelectedRoute();
-    method public boolean isRouteAvailable(android.support.v7.media.MediaRouteSelector, int);
-    method public void removeCallback(android.support.v7.media.MediaRouter.Callback);
-    method public void removeProvider(android.support.v7.media.MediaRouteProvider);
-    method public void removeRemoteControlClient(java.lang.Object);
-    method public void selectRoute(android.support.v7.media.MediaRouter.RouteInfo);
-    method public void setMediaSession(java.lang.Object);
-    method public void setMediaSessionCompat(android.support.v4.media.session.MediaSessionCompat);
-    method public void unselect(int);
-    method public android.support.v7.media.MediaRouter.RouteInfo updateSelectedRoute(android.support.v7.media.MediaRouteSelector);
-    field public static final int AVAILABILITY_FLAG_IGNORE_DEFAULT_ROUTE = 1; // 0x1
-    field public static final int AVAILABILITY_FLAG_REQUIRE_MATCH = 2; // 0x2
-    field public static final int CALLBACK_FLAG_FORCE_DISCOVERY = 8; // 0x8
-    field public static final int CALLBACK_FLAG_PERFORM_ACTIVE_SCAN = 1; // 0x1
-    field public static final int CALLBACK_FLAG_REQUEST_DISCOVERY = 4; // 0x4
-    field public static final int CALLBACK_FLAG_UNFILTERED_EVENTS = 2; // 0x2
-    field public static final int UNSELECT_REASON_DISCONNECTED = 1; // 0x1
-    field public static final int UNSELECT_REASON_ROUTE_CHANGED = 3; // 0x3
-    field public static final int UNSELECT_REASON_STOPPED = 2; // 0x2
-    field public static final int UNSELECT_REASON_UNKNOWN = 0; // 0x0
-  }
-
-  public static abstract class MediaRouter.Callback {
-    ctor public MediaRouter.Callback();
-    method public void onProviderAdded(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.ProviderInfo);
-    method public void onProviderChanged(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.ProviderInfo);
-    method public void onProviderRemoved(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.ProviderInfo);
-    method public void onRouteAdded(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
-    method public void onRouteChanged(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
-    method public void onRoutePresentationDisplayChanged(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
-    method public void onRouteRemoved(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
-    method public void onRouteSelected(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
-    method public void onRouteUnselected(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
-    method public void onRouteVolumeChanged(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
-  }
-
-  public static abstract class MediaRouter.ControlRequestCallback {
-    ctor public MediaRouter.ControlRequestCallback();
-    method public void onError(java.lang.String, android.os.Bundle);
-    method public void onResult(android.os.Bundle);
-  }
-
-  public static final class MediaRouter.ProviderInfo {
-    method public android.content.ComponentName getComponentName();
-    method public java.lang.String getPackageName();
-    method public android.support.v7.media.MediaRouteProvider getProviderInstance();
-    method public java.util.List<android.support.v7.media.MediaRouter.RouteInfo> getRoutes();
-  }
-
-  public static final class MediaRouter.RouteInfo {
-    method public boolean canDisconnect();
-    method public java.util.List<android.content.IntentFilter> getControlFilters();
-    method public java.lang.String getDescription();
-    method public android.os.Bundle getExtras();
-    method public java.lang.String getId();
-    method public java.lang.String getName();
-    method public int getPlaybackStream();
-    method public int getPlaybackType();
-    method public android.view.Display getPresentationDisplay();
-    method public android.support.v7.media.MediaRouter.ProviderInfo getProvider();
-    method public android.content.IntentSender getSettingsIntent();
-    method public int getVolume();
-    method public int getVolumeHandling();
-    method public int getVolumeMax();
-    method public boolean isConnecting();
-    method public boolean isDefault();
-    method public boolean isEnabled();
-    method public boolean isSelected();
-    method public boolean matchesSelector(android.support.v7.media.MediaRouteSelector);
-    method public void requestSetVolume(int);
-    method public void requestUpdateVolume(int);
-    method public void select();
-    method public void sendControlRequest(android.content.Intent, android.support.v7.media.MediaRouter.ControlRequestCallback);
-    method public boolean supportsControlAction(java.lang.String, java.lang.String);
-    method public boolean supportsControlCategory(java.lang.String);
-    method public boolean supportsControlRequest(android.content.Intent);
-    field public static final int PLAYBACK_TYPE_LOCAL = 0; // 0x0
-    field public static final int PLAYBACK_TYPE_REMOTE = 1; // 0x1
-    field public static final int PLAYBACK_VOLUME_FIXED = 0; // 0x0
-    field public static final int PLAYBACK_VOLUME_VARIABLE = 1; // 0x1
-  }
-
-  public final class MediaSessionStatus {
-    method public android.os.Bundle asBundle();
-    method public static android.support.v7.media.MediaSessionStatus fromBundle(android.os.Bundle);
-    method public android.os.Bundle getExtras();
-    method public int getSessionState();
-    method public long getTimestamp();
-    method public boolean isQueuePaused();
-    field public static final int SESSION_STATE_ACTIVE = 0; // 0x0
-    field public static final int SESSION_STATE_ENDED = 1; // 0x1
-    field public static final int SESSION_STATE_INVALIDATED = 2; // 0x2
-  }
-
-  public static final class MediaSessionStatus.Builder {
-    ctor public MediaSessionStatus.Builder(int);
-    ctor public MediaSessionStatus.Builder(android.support.v7.media.MediaSessionStatus);
-    method public android.support.v7.media.MediaSessionStatus build();
-    method public android.support.v7.media.MediaSessionStatus.Builder setExtras(android.os.Bundle);
-    method public android.support.v7.media.MediaSessionStatus.Builder setQueuePaused(boolean);
-    method public android.support.v7.media.MediaSessionStatus.Builder setSessionState(int);
-    method public android.support.v7.media.MediaSessionStatus.Builder setTimestamp(long);
-  }
-
-  public class RemotePlaybackClient {
-    ctor public RemotePlaybackClient(android.content.Context, android.support.v7.media.MediaRouter.RouteInfo);
-    method public void endSession(android.os.Bundle, android.support.v7.media.RemotePlaybackClient.SessionActionCallback);
-    method public void enqueue(android.net.Uri, java.lang.String, android.os.Bundle, long, android.os.Bundle, android.support.v7.media.RemotePlaybackClient.ItemActionCallback);
-    method public java.lang.String getSessionId();
-    method public void getSessionStatus(android.os.Bundle, android.support.v7.media.RemotePlaybackClient.SessionActionCallback);
-    method public void getStatus(java.lang.String, android.os.Bundle, android.support.v7.media.RemotePlaybackClient.ItemActionCallback);
-    method public boolean hasSession();
-    method public boolean isQueuingSupported();
-    method public boolean isRemotePlaybackSupported();
-    method public boolean isSessionManagementSupported();
-    method public void pause(android.os.Bundle, android.support.v7.media.RemotePlaybackClient.SessionActionCallback);
-    method public void play(android.net.Uri, java.lang.String, android.os.Bundle, long, android.os.Bundle, android.support.v7.media.RemotePlaybackClient.ItemActionCallback);
-    method public void release();
-    method public void remove(java.lang.String, android.os.Bundle, android.support.v7.media.RemotePlaybackClient.ItemActionCallback);
-    method public void resume(android.os.Bundle, android.support.v7.media.RemotePlaybackClient.SessionActionCallback);
-    method public void seek(java.lang.String, long, android.os.Bundle, android.support.v7.media.RemotePlaybackClient.ItemActionCallback);
-    method public void setSessionId(java.lang.String);
-    method public void setStatusCallback(android.support.v7.media.RemotePlaybackClient.StatusCallback);
-    method public void startSession(android.os.Bundle, android.support.v7.media.RemotePlaybackClient.SessionActionCallback);
-    method public void stop(android.os.Bundle, android.support.v7.media.RemotePlaybackClient.SessionActionCallback);
-  }
-
-  public static abstract class RemotePlaybackClient.ActionCallback {
-    ctor public RemotePlaybackClient.ActionCallback();
-    method public void onError(java.lang.String, int, android.os.Bundle);
-  }
-
-  public static abstract class RemotePlaybackClient.ItemActionCallback extends android.support.v7.media.RemotePlaybackClient.ActionCallback {
-    ctor public RemotePlaybackClient.ItemActionCallback();
-    method public void onResult(android.os.Bundle, java.lang.String, android.support.v7.media.MediaSessionStatus, java.lang.String, android.support.v7.media.MediaItemStatus);
-  }
-
-  public static abstract class RemotePlaybackClient.SessionActionCallback extends android.support.v7.media.RemotePlaybackClient.ActionCallback {
-    ctor public RemotePlaybackClient.SessionActionCallback();
-    method public void onResult(android.os.Bundle, java.lang.String, android.support.v7.media.MediaSessionStatus);
-  }
-
-  public static abstract class RemotePlaybackClient.StatusCallback {
-    ctor public RemotePlaybackClient.StatusCallback();
-    method public void onItemStatusChanged(android.os.Bundle, java.lang.String, android.support.v7.media.MediaSessionStatus, java.lang.String, android.support.v7.media.MediaItemStatus);
-    method public void onSessionChanged(java.lang.String);
-    method public void onSessionStatusChanged(android.os.Bundle, java.lang.String, android.support.v7.media.MediaSessionStatus);
-  }
-
-}
-
diff --git a/v7/mediarouter/api/22.2.0.txt b/v7/mediarouter/api/22.2.0.txt
deleted file mode 100644
index a382a89..0000000
--- a/v7/mediarouter/api/22.2.0.txt
+++ /dev/null
@@ -1,447 +0,0 @@
-package android.support.v7.app {
-
-  public class MediaRouteActionProvider extends android.support.v4.view.ActionProvider {
-    ctor public MediaRouteActionProvider(android.content.Context);
-    method public android.support.v7.app.MediaRouteDialogFactory getDialogFactory();
-    method public android.support.v7.app.MediaRouteButton getMediaRouteButton();
-    method public android.support.v7.media.MediaRouteSelector getRouteSelector();
-    method public android.view.View onCreateActionView();
-    method public android.support.v7.app.MediaRouteButton onCreateMediaRouteButton();
-    method public void setDialogFactory(android.support.v7.app.MediaRouteDialogFactory);
-    method public void setRouteSelector(android.support.v7.media.MediaRouteSelector);
-  }
-
-  public class MediaRouteButton extends android.view.View {
-    ctor public MediaRouteButton(android.content.Context);
-    ctor public MediaRouteButton(android.content.Context, android.util.AttributeSet);
-    ctor public MediaRouteButton(android.content.Context, android.util.AttributeSet, int);
-    method public android.support.v7.app.MediaRouteDialogFactory getDialogFactory();
-    method public android.support.v7.media.MediaRouteSelector getRouteSelector();
-    method public void onAttachedToWindow();
-    method public void onDetachedFromWindow();
-    method public void setDialogFactory(android.support.v7.app.MediaRouteDialogFactory);
-    method public void setRouteSelector(android.support.v7.media.MediaRouteSelector);
-    method public boolean showDialog();
-  }
-
-  public class MediaRouteChooserDialog extends android.app.Dialog {
-    ctor public MediaRouteChooserDialog(android.content.Context);
-    ctor public MediaRouteChooserDialog(android.content.Context, int);
-    method public android.support.v7.media.MediaRouteSelector getRouteSelector();
-    method public boolean onFilterRoute(android.support.v7.media.MediaRouter.RouteInfo);
-    method public void onFilterRoutes(java.util.List<android.support.v7.media.MediaRouter.RouteInfo>);
-    method public void refreshRoutes();
-    method public void setRouteSelector(android.support.v7.media.MediaRouteSelector);
-  }
-
-  public class MediaRouteChooserDialogFragment extends android.support.v4.app.DialogFragment {
-    ctor public MediaRouteChooserDialogFragment();
-    method public android.support.v7.media.MediaRouteSelector getRouteSelector();
-    method public android.support.v7.app.MediaRouteChooserDialog onCreateChooserDialog(android.content.Context, android.os.Bundle);
-    method public void setRouteSelector(android.support.v7.media.MediaRouteSelector);
-  }
-
-  public class MediaRouteControllerDialog extends android.app.Dialog {
-    ctor public MediaRouteControllerDialog(android.content.Context);
-    ctor public MediaRouteControllerDialog(android.content.Context, int);
-    method public android.view.View getMediaControlView();
-    method public android.support.v4.media.session.MediaSessionCompat.Token getMediaSession();
-    method public android.support.v7.media.MediaRouter.RouteInfo getRoute();
-    method public boolean isVolumeControlEnabled();
-    method public android.view.View onCreateMediaControlView(android.os.Bundle);
-    method public void setVolumeControlEnabled(boolean);
-  }
-
-  public class MediaRouteControllerDialogFragment extends android.support.v4.app.DialogFragment {
-    ctor public MediaRouteControllerDialogFragment();
-    method public android.support.v7.app.MediaRouteControllerDialog onCreateControllerDialog(android.content.Context, android.os.Bundle);
-  }
-
-  public class MediaRouteDialogFactory {
-    ctor public MediaRouteDialogFactory();
-    method public static android.support.v7.app.MediaRouteDialogFactory getDefault();
-    method public android.support.v7.app.MediaRouteChooserDialogFragment onCreateChooserDialogFragment();
-    method public android.support.v7.app.MediaRouteControllerDialogFragment onCreateControllerDialogFragment();
-  }
-
-  public class MediaRouteDiscoveryFragment extends android.support.v4.app.Fragment {
-    ctor public MediaRouteDiscoveryFragment();
-    method public android.support.v7.media.MediaRouter getMediaRouter();
-    method public android.support.v7.media.MediaRouteSelector getRouteSelector();
-    method public android.support.v7.media.MediaRouter.Callback onCreateCallback();
-    method public int onPrepareCallbackFlags();
-    method public void setRouteSelector(android.support.v7.media.MediaRouteSelector);
-  }
-
-}
-
-package android.support.v7.media {
-
-  public final class MediaControlIntent {
-    field public static final java.lang.String ACTION_END_SESSION = "android.media.intent.action.END_SESSION";
-    field public static final java.lang.String ACTION_ENQUEUE = "android.media.intent.action.ENQUEUE";
-    field public static final java.lang.String ACTION_GET_SESSION_STATUS = "android.media.intent.action.GET_SESSION_STATUS";
-    field public static final java.lang.String ACTION_GET_STATUS = "android.media.intent.action.GET_STATUS";
-    field public static final java.lang.String ACTION_PAUSE = "android.media.intent.action.PAUSE";
-    field public static final java.lang.String ACTION_PLAY = "android.media.intent.action.PLAY";
-    field public static final java.lang.String ACTION_REMOVE = "android.media.intent.action.REMOVE";
-    field public static final java.lang.String ACTION_RESUME = "android.media.intent.action.RESUME";
-    field public static final java.lang.String ACTION_SEEK = "android.media.intent.action.SEEK";
-    field public static final java.lang.String ACTION_START_SESSION = "android.media.intent.action.START_SESSION";
-    field public static final java.lang.String ACTION_STOP = "android.media.intent.action.STOP";
-    field public static final java.lang.String CATEGORY_LIVE_AUDIO = "android.media.intent.category.LIVE_AUDIO";
-    field public static final java.lang.String CATEGORY_LIVE_VIDEO = "android.media.intent.category.LIVE_VIDEO";
-    field public static final java.lang.String CATEGORY_REMOTE_PLAYBACK = "android.media.intent.category.REMOTE_PLAYBACK";
-    field public static final int ERROR_INVALID_ITEM_ID = 3; // 0x3
-    field public static final int ERROR_INVALID_SESSION_ID = 2; // 0x2
-    field public static final int ERROR_UNKNOWN = 0; // 0x0
-    field public static final int ERROR_UNSUPPORTED_OPERATION = 1; // 0x1
-    field public static final java.lang.String EXTRA_ERROR_CODE = "android.media.intent.extra.ERROR_CODE";
-    field public static final java.lang.String EXTRA_ITEM_CONTENT_POSITION = "android.media.intent.extra.ITEM_POSITION";
-    field public static final java.lang.String EXTRA_ITEM_HTTP_HEADERS = "android.media.intent.extra.HTTP_HEADERS";
-    field public static final java.lang.String EXTRA_ITEM_ID = "android.media.intent.extra.ITEM_ID";
-    field public static final java.lang.String EXTRA_ITEM_METADATA = "android.media.intent.extra.ITEM_METADATA";
-    field public static final java.lang.String EXTRA_ITEM_STATUS = "android.media.intent.extra.ITEM_STATUS";
-    field public static final java.lang.String EXTRA_ITEM_STATUS_UPDATE_RECEIVER = "android.media.intent.extra.ITEM_STATUS_UPDATE_RECEIVER";
-    field public static final java.lang.String EXTRA_SESSION_ID = "android.media.intent.extra.SESSION_ID";
-    field public static final java.lang.String EXTRA_SESSION_STATUS = "android.media.intent.extra.SESSION_STATUS";
-    field public static final java.lang.String EXTRA_SESSION_STATUS_UPDATE_RECEIVER = "android.media.intent.extra.SESSION_STATUS_UPDATE_RECEIVER";
-  }
-
-  public final class MediaItemMetadata {
-    field public static final java.lang.String KEY_ALBUM_ARTIST = "android.media.metadata.ALBUM_ARTIST";
-    field public static final java.lang.String KEY_ALBUM_TITLE = "android.media.metadata.ALBUM_TITLE";
-    field public static final java.lang.String KEY_ARTIST = "android.media.metadata.ARTIST";
-    field public static final java.lang.String KEY_ARTWORK_URI = "android.media.metadata.ARTWORK_URI";
-    field public static final java.lang.String KEY_AUTHOR = "android.media.metadata.AUTHOR";
-    field public static final java.lang.String KEY_COMPOSER = "android.media.metadata.COMPOSER";
-    field public static final java.lang.String KEY_DISC_NUMBER = "android.media.metadata.DISC_NUMBER";
-    field public static final java.lang.String KEY_DURATION = "android.media.metadata.DURATION";
-    field public static final java.lang.String KEY_TITLE = "android.media.metadata.TITLE";
-    field public static final java.lang.String KEY_TRACK_NUMBER = "android.media.metadata.TRACK_NUMBER";
-    field public static final java.lang.String KEY_YEAR = "android.media.metadata.YEAR";
-  }
-
-  public final class MediaItemStatus {
-    method public android.os.Bundle asBundle();
-    method public static android.support.v7.media.MediaItemStatus fromBundle(android.os.Bundle);
-    method public long getContentDuration();
-    method public long getContentPosition();
-    method public android.os.Bundle getExtras();
-    method public int getPlaybackState();
-    method public long getTimestamp();
-    field public static final java.lang.String EXTRA_HTTP_RESPONSE_HEADERS = "android.media.status.extra.HTTP_RESPONSE_HEADERS";
-    field public static final java.lang.String EXTRA_HTTP_STATUS_CODE = "android.media.status.extra.HTTP_STATUS_CODE";
-    field public static final int PLAYBACK_STATE_BUFFERING = 3; // 0x3
-    field public static final int PLAYBACK_STATE_CANCELED = 5; // 0x5
-    field public static final int PLAYBACK_STATE_ERROR = 7; // 0x7
-    field public static final int PLAYBACK_STATE_FINISHED = 4; // 0x4
-    field public static final int PLAYBACK_STATE_INVALIDATED = 6; // 0x6
-    field public static final int PLAYBACK_STATE_PAUSED = 2; // 0x2
-    field public static final int PLAYBACK_STATE_PENDING = 0; // 0x0
-    field public static final int PLAYBACK_STATE_PLAYING = 1; // 0x1
-  }
-
-  public static final class MediaItemStatus.Builder {
-    ctor public MediaItemStatus.Builder(int);
-    ctor public MediaItemStatus.Builder(android.support.v7.media.MediaItemStatus);
-    method public android.support.v7.media.MediaItemStatus build();
-    method public android.support.v7.media.MediaItemStatus.Builder setContentDuration(long);
-    method public android.support.v7.media.MediaItemStatus.Builder setContentPosition(long);
-    method public android.support.v7.media.MediaItemStatus.Builder setExtras(android.os.Bundle);
-    method public android.support.v7.media.MediaItemStatus.Builder setPlaybackState(int);
-    method public android.support.v7.media.MediaItemStatus.Builder setTimestamp(long);
-  }
-
-  public final class MediaRouteDescriptor {
-    method public android.os.Bundle asBundle();
-    method public boolean canDisconnectAndKeepPlaying();
-    method public static android.support.v7.media.MediaRouteDescriptor fromBundle(android.os.Bundle);
-    method public java.util.List<android.content.IntentFilter> getControlFilters();
-    method public java.lang.String getDescription();
-    method public android.os.Bundle getExtras();
-    method public java.lang.String getId();
-    method public java.lang.String getName();
-    method public int getPlaybackStream();
-    method public int getPlaybackType();
-    method public int getPresentationDisplayId();
-    method public android.content.IntentSender getSettingsActivity();
-    method public int getVolume();
-    method public int getVolumeHandling();
-    method public int getVolumeMax();
-    method public boolean isConnecting();
-    method public boolean isEnabled();
-    method public boolean isValid();
-  }
-
-  public static final class MediaRouteDescriptor.Builder {
-    ctor public MediaRouteDescriptor.Builder(java.lang.String, java.lang.String);
-    ctor public MediaRouteDescriptor.Builder(android.support.v7.media.MediaRouteDescriptor);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder addControlFilter(android.content.IntentFilter);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder addControlFilters(java.util.Collection<android.content.IntentFilter>);
-    method public android.support.v7.media.MediaRouteDescriptor build();
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setCanDisconnect(boolean);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setConnecting(boolean);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setDescription(java.lang.String);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setEnabled(boolean);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setExtras(android.os.Bundle);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setId(java.lang.String);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setName(java.lang.String);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setPlaybackStream(int);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setPlaybackType(int);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setPresentationDisplayId(int);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setSettingsActivity(android.content.IntentSender);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setVolume(int);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setVolumeHandling(int);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setVolumeMax(int);
-  }
-
-  public final class MediaRouteDiscoveryRequest {
-    ctor public MediaRouteDiscoveryRequest(android.support.v7.media.MediaRouteSelector, boolean);
-    method public android.os.Bundle asBundle();
-    method public static android.support.v7.media.MediaRouteDiscoveryRequest fromBundle(android.os.Bundle);
-    method public android.support.v7.media.MediaRouteSelector getSelector();
-    method public boolean isActiveScan();
-    method public boolean isValid();
-  }
-
-  public abstract class MediaRouteProvider {
-    ctor public MediaRouteProvider(android.content.Context);
-    method public final android.content.Context getContext();
-    method public final android.support.v7.media.MediaRouteProviderDescriptor getDescriptor();
-    method public final android.support.v7.media.MediaRouteDiscoveryRequest getDiscoveryRequest();
-    method public final android.os.Handler getHandler();
-    method public final android.support.v7.media.MediaRouteProvider.ProviderMetadata getMetadata();
-    method public android.support.v7.media.MediaRouteProvider.RouteController onCreateRouteController(java.lang.String);
-    method public void onDiscoveryRequestChanged(android.support.v7.media.MediaRouteDiscoveryRequest);
-    method public final void setCallback(android.support.v7.media.MediaRouteProvider.Callback);
-    method public final void setDescriptor(android.support.v7.media.MediaRouteProviderDescriptor);
-    method public final void setDiscoveryRequest(android.support.v7.media.MediaRouteDiscoveryRequest);
-  }
-
-  public static abstract class MediaRouteProvider.Callback {
-    ctor public MediaRouteProvider.Callback();
-    method public void onDescriptorChanged(android.support.v7.media.MediaRouteProvider, android.support.v7.media.MediaRouteProviderDescriptor);
-  }
-
-  public static final class MediaRouteProvider.ProviderMetadata {
-    method public android.content.ComponentName getComponentName();
-    method public java.lang.String getPackageName();
-  }
-
-  public static abstract class MediaRouteProvider.RouteController {
-    ctor public MediaRouteProvider.RouteController();
-    method public boolean onControlRequest(android.content.Intent, android.support.v7.media.MediaRouter.ControlRequestCallback);
-    method public void onRelease();
-    method public void onSelect();
-    method public void onSetVolume(int);
-    method public void onUnselect();
-    method public void onUnselect(int);
-    method public void onUpdateVolume(int);
-  }
-
-  public final class MediaRouteProviderDescriptor {
-    method public android.os.Bundle asBundle();
-    method public static android.support.v7.media.MediaRouteProviderDescriptor fromBundle(android.os.Bundle);
-    method public java.util.List<android.support.v7.media.MediaRouteDescriptor> getRoutes();
-    method public boolean isValid();
-  }
-
-  public static final class MediaRouteProviderDescriptor.Builder {
-    ctor public MediaRouteProviderDescriptor.Builder();
-    ctor public MediaRouteProviderDescriptor.Builder(android.support.v7.media.MediaRouteProviderDescriptor);
-    method public android.support.v7.media.MediaRouteProviderDescriptor.Builder addRoute(android.support.v7.media.MediaRouteDescriptor);
-    method public android.support.v7.media.MediaRouteProviderDescriptor.Builder addRoutes(java.util.Collection<android.support.v7.media.MediaRouteDescriptor>);
-    method public android.support.v7.media.MediaRouteProviderDescriptor build();
-  }
-
-  public abstract class MediaRouteProviderService extends android.app.Service {
-    ctor public MediaRouteProviderService();
-    method public android.support.v7.media.MediaRouteProvider getMediaRouteProvider();
-    method public android.os.IBinder onBind(android.content.Intent);
-    method public abstract android.support.v7.media.MediaRouteProvider onCreateMediaRouteProvider();
-    field public static final java.lang.String SERVICE_INTERFACE = "android.media.MediaRouteProviderService";
-  }
-
-  public final class MediaRouteSelector {
-    method public android.os.Bundle asBundle();
-    method public boolean contains(android.support.v7.media.MediaRouteSelector);
-    method public static android.support.v7.media.MediaRouteSelector fromBundle(android.os.Bundle);
-    method public java.util.List<java.lang.String> getControlCategories();
-    method public boolean hasControlCategory(java.lang.String);
-    method public boolean isEmpty();
-    method public boolean isValid();
-    method public boolean matchesControlFilters(java.util.List<android.content.IntentFilter>);
-    field public static final android.support.v7.media.MediaRouteSelector EMPTY;
-  }
-
-  public static final class MediaRouteSelector.Builder {
-    ctor public MediaRouteSelector.Builder();
-    ctor public MediaRouteSelector.Builder(android.support.v7.media.MediaRouteSelector);
-    method public android.support.v7.media.MediaRouteSelector.Builder addControlCategories(java.util.Collection<java.lang.String>);
-    method public android.support.v7.media.MediaRouteSelector.Builder addControlCategory(java.lang.String);
-    method public android.support.v7.media.MediaRouteSelector.Builder addSelector(android.support.v7.media.MediaRouteSelector);
-    method public android.support.v7.media.MediaRouteSelector build();
-  }
-
-  public final class MediaRouter {
-    method public void addCallback(android.support.v7.media.MediaRouteSelector, android.support.v7.media.MediaRouter.Callback);
-    method public void addCallback(android.support.v7.media.MediaRouteSelector, android.support.v7.media.MediaRouter.Callback, int);
-    method public void addProvider(android.support.v7.media.MediaRouteProvider);
-    method public void addRemoteControlClient(java.lang.Object);
-    method public android.support.v7.media.MediaRouter.RouteInfo getDefaultRoute();
-    method public static android.support.v7.media.MediaRouter getInstance(android.content.Context);
-    method public android.support.v4.media.session.MediaSessionCompat.Token getMediaSessionToken();
-    method public java.util.List<android.support.v7.media.MediaRouter.ProviderInfo> getProviders();
-    method public java.util.List<android.support.v7.media.MediaRouter.RouteInfo> getRoutes();
-    method public android.support.v7.media.MediaRouter.RouteInfo getSelectedRoute();
-    method public boolean isRouteAvailable(android.support.v7.media.MediaRouteSelector, int);
-    method public void removeCallback(android.support.v7.media.MediaRouter.Callback);
-    method public void removeProvider(android.support.v7.media.MediaRouteProvider);
-    method public void removeRemoteControlClient(java.lang.Object);
-    method public void selectRoute(android.support.v7.media.MediaRouter.RouteInfo);
-    method public void setMediaSession(java.lang.Object);
-    method public void setMediaSessionCompat(android.support.v4.media.session.MediaSessionCompat);
-    method public void unselect(int);
-    method public android.support.v7.media.MediaRouter.RouteInfo updateSelectedRoute(android.support.v7.media.MediaRouteSelector);
-    field public static final int AVAILABILITY_FLAG_IGNORE_DEFAULT_ROUTE = 1; // 0x1
-    field public static final int AVAILABILITY_FLAG_REQUIRE_MATCH = 2; // 0x2
-    field public static final int CALLBACK_FLAG_FORCE_DISCOVERY = 8; // 0x8
-    field public static final int CALLBACK_FLAG_PERFORM_ACTIVE_SCAN = 1; // 0x1
-    field public static final int CALLBACK_FLAG_REQUEST_DISCOVERY = 4; // 0x4
-    field public static final int CALLBACK_FLAG_UNFILTERED_EVENTS = 2; // 0x2
-    field public static final int UNSELECT_REASON_DISCONNECTED = 1; // 0x1
-    field public static final int UNSELECT_REASON_ROUTE_CHANGED = 3; // 0x3
-    field public static final int UNSELECT_REASON_STOPPED = 2; // 0x2
-    field public static final int UNSELECT_REASON_UNKNOWN = 0; // 0x0
-  }
-
-  public static abstract class MediaRouter.Callback {
-    ctor public MediaRouter.Callback();
-    method public void onProviderAdded(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.ProviderInfo);
-    method public void onProviderChanged(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.ProviderInfo);
-    method public void onProviderRemoved(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.ProviderInfo);
-    method public void onRouteAdded(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
-    method public void onRouteChanged(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
-    method public void onRoutePresentationDisplayChanged(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
-    method public void onRouteRemoved(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
-    method public void onRouteSelected(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
-    method public void onRouteUnselected(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
-    method public void onRouteVolumeChanged(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
-  }
-
-  public static abstract class MediaRouter.ControlRequestCallback {
-    ctor public MediaRouter.ControlRequestCallback();
-    method public void onError(java.lang.String, android.os.Bundle);
-    method public void onResult(android.os.Bundle);
-  }
-
-  public static final class MediaRouter.ProviderInfo {
-    method public android.content.ComponentName getComponentName();
-    method public java.lang.String getPackageName();
-    method public android.support.v7.media.MediaRouteProvider getProviderInstance();
-    method public java.util.List<android.support.v7.media.MediaRouter.RouteInfo> getRoutes();
-  }
-
-  public static final class MediaRouter.RouteInfo {
-    method public boolean canDisconnect();
-    method public java.util.List<android.content.IntentFilter> getControlFilters();
-    method public java.lang.String getDescription();
-    method public android.os.Bundle getExtras();
-    method public java.lang.String getId();
-    method public java.lang.String getName();
-    method public int getPlaybackStream();
-    method public int getPlaybackType();
-    method public android.view.Display getPresentationDisplay();
-    method public android.support.v7.media.MediaRouter.ProviderInfo getProvider();
-    method public android.content.IntentSender getSettingsIntent();
-    method public int getVolume();
-    method public int getVolumeHandling();
-    method public int getVolumeMax();
-    method public boolean isConnecting();
-    method public boolean isDefault();
-    method public boolean isEnabled();
-    method public boolean isSelected();
-    method public boolean matchesSelector(android.support.v7.media.MediaRouteSelector);
-    method public void requestSetVolume(int);
-    method public void requestUpdateVolume(int);
-    method public void select();
-    method public void sendControlRequest(android.content.Intent, android.support.v7.media.MediaRouter.ControlRequestCallback);
-    method public boolean supportsControlAction(java.lang.String, java.lang.String);
-    method public boolean supportsControlCategory(java.lang.String);
-    method public boolean supportsControlRequest(android.content.Intent);
-    field public static final int PLAYBACK_TYPE_LOCAL = 0; // 0x0
-    field public static final int PLAYBACK_TYPE_REMOTE = 1; // 0x1
-    field public static final int PLAYBACK_VOLUME_FIXED = 0; // 0x0
-    field public static final int PLAYBACK_VOLUME_VARIABLE = 1; // 0x1
-  }
-
-  public final class MediaSessionStatus {
-    method public android.os.Bundle asBundle();
-    method public static android.support.v7.media.MediaSessionStatus fromBundle(android.os.Bundle);
-    method public android.os.Bundle getExtras();
-    method public int getSessionState();
-    method public long getTimestamp();
-    method public boolean isQueuePaused();
-    field public static final int SESSION_STATE_ACTIVE = 0; // 0x0
-    field public static final int SESSION_STATE_ENDED = 1; // 0x1
-    field public static final int SESSION_STATE_INVALIDATED = 2; // 0x2
-  }
-
-  public static final class MediaSessionStatus.Builder {
-    ctor public MediaSessionStatus.Builder(int);
-    ctor public MediaSessionStatus.Builder(android.support.v7.media.MediaSessionStatus);
-    method public android.support.v7.media.MediaSessionStatus build();
-    method public android.support.v7.media.MediaSessionStatus.Builder setExtras(android.os.Bundle);
-    method public android.support.v7.media.MediaSessionStatus.Builder setQueuePaused(boolean);
-    method public android.support.v7.media.MediaSessionStatus.Builder setSessionState(int);
-    method public android.support.v7.media.MediaSessionStatus.Builder setTimestamp(long);
-  }
-
-  public class RemotePlaybackClient {
-    ctor public RemotePlaybackClient(android.content.Context, android.support.v7.media.MediaRouter.RouteInfo);
-    method public void endSession(android.os.Bundle, android.support.v7.media.RemotePlaybackClient.SessionActionCallback);
-    method public void enqueue(android.net.Uri, java.lang.String, android.os.Bundle, long, android.os.Bundle, android.support.v7.media.RemotePlaybackClient.ItemActionCallback);
-    method public java.lang.String getSessionId();
-    method public void getSessionStatus(android.os.Bundle, android.support.v7.media.RemotePlaybackClient.SessionActionCallback);
-    method public void getStatus(java.lang.String, android.os.Bundle, android.support.v7.media.RemotePlaybackClient.ItemActionCallback);
-    method public boolean hasSession();
-    method public boolean isQueuingSupported();
-    method public boolean isRemotePlaybackSupported();
-    method public boolean isSessionManagementSupported();
-    method public void pause(android.os.Bundle, android.support.v7.media.RemotePlaybackClient.SessionActionCallback);
-    method public void play(android.net.Uri, java.lang.String, android.os.Bundle, long, android.os.Bundle, android.support.v7.media.RemotePlaybackClient.ItemActionCallback);
-    method public void release();
-    method public void remove(java.lang.String, android.os.Bundle, android.support.v7.media.RemotePlaybackClient.ItemActionCallback);
-    method public void resume(android.os.Bundle, android.support.v7.media.RemotePlaybackClient.SessionActionCallback);
-    method public void seek(java.lang.String, long, android.os.Bundle, android.support.v7.media.RemotePlaybackClient.ItemActionCallback);
-    method public void setSessionId(java.lang.String);
-    method public void setStatusCallback(android.support.v7.media.RemotePlaybackClient.StatusCallback);
-    method public void startSession(android.os.Bundle, android.support.v7.media.RemotePlaybackClient.SessionActionCallback);
-    method public void stop(android.os.Bundle, android.support.v7.media.RemotePlaybackClient.SessionActionCallback);
-  }
-
-  public static abstract class RemotePlaybackClient.ActionCallback {
-    ctor public RemotePlaybackClient.ActionCallback();
-    method public void onError(java.lang.String, int, android.os.Bundle);
-  }
-
-  public static abstract class RemotePlaybackClient.ItemActionCallback extends android.support.v7.media.RemotePlaybackClient.ActionCallback {
-    ctor public RemotePlaybackClient.ItemActionCallback();
-    method public void onResult(android.os.Bundle, java.lang.String, android.support.v7.media.MediaSessionStatus, java.lang.String, android.support.v7.media.MediaItemStatus);
-  }
-
-  public static abstract class RemotePlaybackClient.SessionActionCallback extends android.support.v7.media.RemotePlaybackClient.ActionCallback {
-    ctor public RemotePlaybackClient.SessionActionCallback();
-    method public void onResult(android.os.Bundle, java.lang.String, android.support.v7.media.MediaSessionStatus);
-  }
-
-  public static abstract class RemotePlaybackClient.StatusCallback {
-    ctor public RemotePlaybackClient.StatusCallback();
-    method public void onItemStatusChanged(android.os.Bundle, java.lang.String, android.support.v7.media.MediaSessionStatus, java.lang.String, android.support.v7.media.MediaItemStatus);
-    method public void onSessionChanged(java.lang.String);
-    method public void onSessionStatusChanged(android.os.Bundle, java.lang.String, android.support.v7.media.MediaSessionStatus);
-  }
-
-}
-
diff --git a/v7/mediarouter/api/22.2.1.txt b/v7/mediarouter/api/22.2.1.txt
deleted file mode 100644
index a382a89..0000000
--- a/v7/mediarouter/api/22.2.1.txt
+++ /dev/null
@@ -1,447 +0,0 @@
-package android.support.v7.app {
-
-  public class MediaRouteActionProvider extends android.support.v4.view.ActionProvider {
-    ctor public MediaRouteActionProvider(android.content.Context);
-    method public android.support.v7.app.MediaRouteDialogFactory getDialogFactory();
-    method public android.support.v7.app.MediaRouteButton getMediaRouteButton();
-    method public android.support.v7.media.MediaRouteSelector getRouteSelector();
-    method public android.view.View onCreateActionView();
-    method public android.support.v7.app.MediaRouteButton onCreateMediaRouteButton();
-    method public void setDialogFactory(android.support.v7.app.MediaRouteDialogFactory);
-    method public void setRouteSelector(android.support.v7.media.MediaRouteSelector);
-  }
-
-  public class MediaRouteButton extends android.view.View {
-    ctor public MediaRouteButton(android.content.Context);
-    ctor public MediaRouteButton(android.content.Context, android.util.AttributeSet);
-    ctor public MediaRouteButton(android.content.Context, android.util.AttributeSet, int);
-    method public android.support.v7.app.MediaRouteDialogFactory getDialogFactory();
-    method public android.support.v7.media.MediaRouteSelector getRouteSelector();
-    method public void onAttachedToWindow();
-    method public void onDetachedFromWindow();
-    method public void setDialogFactory(android.support.v7.app.MediaRouteDialogFactory);
-    method public void setRouteSelector(android.support.v7.media.MediaRouteSelector);
-    method public boolean showDialog();
-  }
-
-  public class MediaRouteChooserDialog extends android.app.Dialog {
-    ctor public MediaRouteChooserDialog(android.content.Context);
-    ctor public MediaRouteChooserDialog(android.content.Context, int);
-    method public android.support.v7.media.MediaRouteSelector getRouteSelector();
-    method public boolean onFilterRoute(android.support.v7.media.MediaRouter.RouteInfo);
-    method public void onFilterRoutes(java.util.List<android.support.v7.media.MediaRouter.RouteInfo>);
-    method public void refreshRoutes();
-    method public void setRouteSelector(android.support.v7.media.MediaRouteSelector);
-  }
-
-  public class MediaRouteChooserDialogFragment extends android.support.v4.app.DialogFragment {
-    ctor public MediaRouteChooserDialogFragment();
-    method public android.support.v7.media.MediaRouteSelector getRouteSelector();
-    method public android.support.v7.app.MediaRouteChooserDialog onCreateChooserDialog(android.content.Context, android.os.Bundle);
-    method public void setRouteSelector(android.support.v7.media.MediaRouteSelector);
-  }
-
-  public class MediaRouteControllerDialog extends android.app.Dialog {
-    ctor public MediaRouteControllerDialog(android.content.Context);
-    ctor public MediaRouteControllerDialog(android.content.Context, int);
-    method public android.view.View getMediaControlView();
-    method public android.support.v4.media.session.MediaSessionCompat.Token getMediaSession();
-    method public android.support.v7.media.MediaRouter.RouteInfo getRoute();
-    method public boolean isVolumeControlEnabled();
-    method public android.view.View onCreateMediaControlView(android.os.Bundle);
-    method public void setVolumeControlEnabled(boolean);
-  }
-
-  public class MediaRouteControllerDialogFragment extends android.support.v4.app.DialogFragment {
-    ctor public MediaRouteControllerDialogFragment();
-    method public android.support.v7.app.MediaRouteControllerDialog onCreateControllerDialog(android.content.Context, android.os.Bundle);
-  }
-
-  public class MediaRouteDialogFactory {
-    ctor public MediaRouteDialogFactory();
-    method public static android.support.v7.app.MediaRouteDialogFactory getDefault();
-    method public android.support.v7.app.MediaRouteChooserDialogFragment onCreateChooserDialogFragment();
-    method public android.support.v7.app.MediaRouteControllerDialogFragment onCreateControllerDialogFragment();
-  }
-
-  public class MediaRouteDiscoveryFragment extends android.support.v4.app.Fragment {
-    ctor public MediaRouteDiscoveryFragment();
-    method public android.support.v7.media.MediaRouter getMediaRouter();
-    method public android.support.v7.media.MediaRouteSelector getRouteSelector();
-    method public android.support.v7.media.MediaRouter.Callback onCreateCallback();
-    method public int onPrepareCallbackFlags();
-    method public void setRouteSelector(android.support.v7.media.MediaRouteSelector);
-  }
-
-}
-
-package android.support.v7.media {
-
-  public final class MediaControlIntent {
-    field public static final java.lang.String ACTION_END_SESSION = "android.media.intent.action.END_SESSION";
-    field public static final java.lang.String ACTION_ENQUEUE = "android.media.intent.action.ENQUEUE";
-    field public static final java.lang.String ACTION_GET_SESSION_STATUS = "android.media.intent.action.GET_SESSION_STATUS";
-    field public static final java.lang.String ACTION_GET_STATUS = "android.media.intent.action.GET_STATUS";
-    field public static final java.lang.String ACTION_PAUSE = "android.media.intent.action.PAUSE";
-    field public static final java.lang.String ACTION_PLAY = "android.media.intent.action.PLAY";
-    field public static final java.lang.String ACTION_REMOVE = "android.media.intent.action.REMOVE";
-    field public static final java.lang.String ACTION_RESUME = "android.media.intent.action.RESUME";
-    field public static final java.lang.String ACTION_SEEK = "android.media.intent.action.SEEK";
-    field public static final java.lang.String ACTION_START_SESSION = "android.media.intent.action.START_SESSION";
-    field public static final java.lang.String ACTION_STOP = "android.media.intent.action.STOP";
-    field public static final java.lang.String CATEGORY_LIVE_AUDIO = "android.media.intent.category.LIVE_AUDIO";
-    field public static final java.lang.String CATEGORY_LIVE_VIDEO = "android.media.intent.category.LIVE_VIDEO";
-    field public static final java.lang.String CATEGORY_REMOTE_PLAYBACK = "android.media.intent.category.REMOTE_PLAYBACK";
-    field public static final int ERROR_INVALID_ITEM_ID = 3; // 0x3
-    field public static final int ERROR_INVALID_SESSION_ID = 2; // 0x2
-    field public static final int ERROR_UNKNOWN = 0; // 0x0
-    field public static final int ERROR_UNSUPPORTED_OPERATION = 1; // 0x1
-    field public static final java.lang.String EXTRA_ERROR_CODE = "android.media.intent.extra.ERROR_CODE";
-    field public static final java.lang.String EXTRA_ITEM_CONTENT_POSITION = "android.media.intent.extra.ITEM_POSITION";
-    field public static final java.lang.String EXTRA_ITEM_HTTP_HEADERS = "android.media.intent.extra.HTTP_HEADERS";
-    field public static final java.lang.String EXTRA_ITEM_ID = "android.media.intent.extra.ITEM_ID";
-    field public static final java.lang.String EXTRA_ITEM_METADATA = "android.media.intent.extra.ITEM_METADATA";
-    field public static final java.lang.String EXTRA_ITEM_STATUS = "android.media.intent.extra.ITEM_STATUS";
-    field public static final java.lang.String EXTRA_ITEM_STATUS_UPDATE_RECEIVER = "android.media.intent.extra.ITEM_STATUS_UPDATE_RECEIVER";
-    field public static final java.lang.String EXTRA_SESSION_ID = "android.media.intent.extra.SESSION_ID";
-    field public static final java.lang.String EXTRA_SESSION_STATUS = "android.media.intent.extra.SESSION_STATUS";
-    field public static final java.lang.String EXTRA_SESSION_STATUS_UPDATE_RECEIVER = "android.media.intent.extra.SESSION_STATUS_UPDATE_RECEIVER";
-  }
-
-  public final class MediaItemMetadata {
-    field public static final java.lang.String KEY_ALBUM_ARTIST = "android.media.metadata.ALBUM_ARTIST";
-    field public static final java.lang.String KEY_ALBUM_TITLE = "android.media.metadata.ALBUM_TITLE";
-    field public static final java.lang.String KEY_ARTIST = "android.media.metadata.ARTIST";
-    field public static final java.lang.String KEY_ARTWORK_URI = "android.media.metadata.ARTWORK_URI";
-    field public static final java.lang.String KEY_AUTHOR = "android.media.metadata.AUTHOR";
-    field public static final java.lang.String KEY_COMPOSER = "android.media.metadata.COMPOSER";
-    field public static final java.lang.String KEY_DISC_NUMBER = "android.media.metadata.DISC_NUMBER";
-    field public static final java.lang.String KEY_DURATION = "android.media.metadata.DURATION";
-    field public static final java.lang.String KEY_TITLE = "android.media.metadata.TITLE";
-    field public static final java.lang.String KEY_TRACK_NUMBER = "android.media.metadata.TRACK_NUMBER";
-    field public static final java.lang.String KEY_YEAR = "android.media.metadata.YEAR";
-  }
-
-  public final class MediaItemStatus {
-    method public android.os.Bundle asBundle();
-    method public static android.support.v7.media.MediaItemStatus fromBundle(android.os.Bundle);
-    method public long getContentDuration();
-    method public long getContentPosition();
-    method public android.os.Bundle getExtras();
-    method public int getPlaybackState();
-    method public long getTimestamp();
-    field public static final java.lang.String EXTRA_HTTP_RESPONSE_HEADERS = "android.media.status.extra.HTTP_RESPONSE_HEADERS";
-    field public static final java.lang.String EXTRA_HTTP_STATUS_CODE = "android.media.status.extra.HTTP_STATUS_CODE";
-    field public static final int PLAYBACK_STATE_BUFFERING = 3; // 0x3
-    field public static final int PLAYBACK_STATE_CANCELED = 5; // 0x5
-    field public static final int PLAYBACK_STATE_ERROR = 7; // 0x7
-    field public static final int PLAYBACK_STATE_FINISHED = 4; // 0x4
-    field public static final int PLAYBACK_STATE_INVALIDATED = 6; // 0x6
-    field public static final int PLAYBACK_STATE_PAUSED = 2; // 0x2
-    field public static final int PLAYBACK_STATE_PENDING = 0; // 0x0
-    field public static final int PLAYBACK_STATE_PLAYING = 1; // 0x1
-  }
-
-  public static final class MediaItemStatus.Builder {
-    ctor public MediaItemStatus.Builder(int);
-    ctor public MediaItemStatus.Builder(android.support.v7.media.MediaItemStatus);
-    method public android.support.v7.media.MediaItemStatus build();
-    method public android.support.v7.media.MediaItemStatus.Builder setContentDuration(long);
-    method public android.support.v7.media.MediaItemStatus.Builder setContentPosition(long);
-    method public android.support.v7.media.MediaItemStatus.Builder setExtras(android.os.Bundle);
-    method public android.support.v7.media.MediaItemStatus.Builder setPlaybackState(int);
-    method public android.support.v7.media.MediaItemStatus.Builder setTimestamp(long);
-  }
-
-  public final class MediaRouteDescriptor {
-    method public android.os.Bundle asBundle();
-    method public boolean canDisconnectAndKeepPlaying();
-    method public static android.support.v7.media.MediaRouteDescriptor fromBundle(android.os.Bundle);
-    method public java.util.List<android.content.IntentFilter> getControlFilters();
-    method public java.lang.String getDescription();
-    method public android.os.Bundle getExtras();
-    method public java.lang.String getId();
-    method public java.lang.String getName();
-    method public int getPlaybackStream();
-    method public int getPlaybackType();
-    method public int getPresentationDisplayId();
-    method public android.content.IntentSender getSettingsActivity();
-    method public int getVolume();
-    method public int getVolumeHandling();
-    method public int getVolumeMax();
-    method public boolean isConnecting();
-    method public boolean isEnabled();
-    method public boolean isValid();
-  }
-
-  public static final class MediaRouteDescriptor.Builder {
-    ctor public MediaRouteDescriptor.Builder(java.lang.String, java.lang.String);
-    ctor public MediaRouteDescriptor.Builder(android.support.v7.media.MediaRouteDescriptor);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder addControlFilter(android.content.IntentFilter);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder addControlFilters(java.util.Collection<android.content.IntentFilter>);
-    method public android.support.v7.media.MediaRouteDescriptor build();
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setCanDisconnect(boolean);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setConnecting(boolean);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setDescription(java.lang.String);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setEnabled(boolean);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setExtras(android.os.Bundle);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setId(java.lang.String);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setName(java.lang.String);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setPlaybackStream(int);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setPlaybackType(int);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setPresentationDisplayId(int);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setSettingsActivity(android.content.IntentSender);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setVolume(int);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setVolumeHandling(int);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setVolumeMax(int);
-  }
-
-  public final class MediaRouteDiscoveryRequest {
-    ctor public MediaRouteDiscoveryRequest(android.support.v7.media.MediaRouteSelector, boolean);
-    method public android.os.Bundle asBundle();
-    method public static android.support.v7.media.MediaRouteDiscoveryRequest fromBundle(android.os.Bundle);
-    method public android.support.v7.media.MediaRouteSelector getSelector();
-    method public boolean isActiveScan();
-    method public boolean isValid();
-  }
-
-  public abstract class MediaRouteProvider {
-    ctor public MediaRouteProvider(android.content.Context);
-    method public final android.content.Context getContext();
-    method public final android.support.v7.media.MediaRouteProviderDescriptor getDescriptor();
-    method public final android.support.v7.media.MediaRouteDiscoveryRequest getDiscoveryRequest();
-    method public final android.os.Handler getHandler();
-    method public final android.support.v7.media.MediaRouteProvider.ProviderMetadata getMetadata();
-    method public android.support.v7.media.MediaRouteProvider.RouteController onCreateRouteController(java.lang.String);
-    method public void onDiscoveryRequestChanged(android.support.v7.media.MediaRouteDiscoveryRequest);
-    method public final void setCallback(android.support.v7.media.MediaRouteProvider.Callback);
-    method public final void setDescriptor(android.support.v7.media.MediaRouteProviderDescriptor);
-    method public final void setDiscoveryRequest(android.support.v7.media.MediaRouteDiscoveryRequest);
-  }
-
-  public static abstract class MediaRouteProvider.Callback {
-    ctor public MediaRouteProvider.Callback();
-    method public void onDescriptorChanged(android.support.v7.media.MediaRouteProvider, android.support.v7.media.MediaRouteProviderDescriptor);
-  }
-
-  public static final class MediaRouteProvider.ProviderMetadata {
-    method public android.content.ComponentName getComponentName();
-    method public java.lang.String getPackageName();
-  }
-
-  public static abstract class MediaRouteProvider.RouteController {
-    ctor public MediaRouteProvider.RouteController();
-    method public boolean onControlRequest(android.content.Intent, android.support.v7.media.MediaRouter.ControlRequestCallback);
-    method public void onRelease();
-    method public void onSelect();
-    method public void onSetVolume(int);
-    method public void onUnselect();
-    method public void onUnselect(int);
-    method public void onUpdateVolume(int);
-  }
-
-  public final class MediaRouteProviderDescriptor {
-    method public android.os.Bundle asBundle();
-    method public static android.support.v7.media.MediaRouteProviderDescriptor fromBundle(android.os.Bundle);
-    method public java.util.List<android.support.v7.media.MediaRouteDescriptor> getRoutes();
-    method public boolean isValid();
-  }
-
-  public static final class MediaRouteProviderDescriptor.Builder {
-    ctor public MediaRouteProviderDescriptor.Builder();
-    ctor public MediaRouteProviderDescriptor.Builder(android.support.v7.media.MediaRouteProviderDescriptor);
-    method public android.support.v7.media.MediaRouteProviderDescriptor.Builder addRoute(android.support.v7.media.MediaRouteDescriptor);
-    method public android.support.v7.media.MediaRouteProviderDescriptor.Builder addRoutes(java.util.Collection<android.support.v7.media.MediaRouteDescriptor>);
-    method public android.support.v7.media.MediaRouteProviderDescriptor build();
-  }
-
-  public abstract class MediaRouteProviderService extends android.app.Service {
-    ctor public MediaRouteProviderService();
-    method public android.support.v7.media.MediaRouteProvider getMediaRouteProvider();
-    method public android.os.IBinder onBind(android.content.Intent);
-    method public abstract android.support.v7.media.MediaRouteProvider onCreateMediaRouteProvider();
-    field public static final java.lang.String SERVICE_INTERFACE = "android.media.MediaRouteProviderService";
-  }
-
-  public final class MediaRouteSelector {
-    method public android.os.Bundle asBundle();
-    method public boolean contains(android.support.v7.media.MediaRouteSelector);
-    method public static android.support.v7.media.MediaRouteSelector fromBundle(android.os.Bundle);
-    method public java.util.List<java.lang.String> getControlCategories();
-    method public boolean hasControlCategory(java.lang.String);
-    method public boolean isEmpty();
-    method public boolean isValid();
-    method public boolean matchesControlFilters(java.util.List<android.content.IntentFilter>);
-    field public static final android.support.v7.media.MediaRouteSelector EMPTY;
-  }
-
-  public static final class MediaRouteSelector.Builder {
-    ctor public MediaRouteSelector.Builder();
-    ctor public MediaRouteSelector.Builder(android.support.v7.media.MediaRouteSelector);
-    method public android.support.v7.media.MediaRouteSelector.Builder addControlCategories(java.util.Collection<java.lang.String>);
-    method public android.support.v7.media.MediaRouteSelector.Builder addControlCategory(java.lang.String);
-    method public android.support.v7.media.MediaRouteSelector.Builder addSelector(android.support.v7.media.MediaRouteSelector);
-    method public android.support.v7.media.MediaRouteSelector build();
-  }
-
-  public final class MediaRouter {
-    method public void addCallback(android.support.v7.media.MediaRouteSelector, android.support.v7.media.MediaRouter.Callback);
-    method public void addCallback(android.support.v7.media.MediaRouteSelector, android.support.v7.media.MediaRouter.Callback, int);
-    method public void addProvider(android.support.v7.media.MediaRouteProvider);
-    method public void addRemoteControlClient(java.lang.Object);
-    method public android.support.v7.media.MediaRouter.RouteInfo getDefaultRoute();
-    method public static android.support.v7.media.MediaRouter getInstance(android.content.Context);
-    method public android.support.v4.media.session.MediaSessionCompat.Token getMediaSessionToken();
-    method public java.util.List<android.support.v7.media.MediaRouter.ProviderInfo> getProviders();
-    method public java.util.List<android.support.v7.media.MediaRouter.RouteInfo> getRoutes();
-    method public android.support.v7.media.MediaRouter.RouteInfo getSelectedRoute();
-    method public boolean isRouteAvailable(android.support.v7.media.MediaRouteSelector, int);
-    method public void removeCallback(android.support.v7.media.MediaRouter.Callback);
-    method public void removeProvider(android.support.v7.media.MediaRouteProvider);
-    method public void removeRemoteControlClient(java.lang.Object);
-    method public void selectRoute(android.support.v7.media.MediaRouter.RouteInfo);
-    method public void setMediaSession(java.lang.Object);
-    method public void setMediaSessionCompat(android.support.v4.media.session.MediaSessionCompat);
-    method public void unselect(int);
-    method public android.support.v7.media.MediaRouter.RouteInfo updateSelectedRoute(android.support.v7.media.MediaRouteSelector);
-    field public static final int AVAILABILITY_FLAG_IGNORE_DEFAULT_ROUTE = 1; // 0x1
-    field public static final int AVAILABILITY_FLAG_REQUIRE_MATCH = 2; // 0x2
-    field public static final int CALLBACK_FLAG_FORCE_DISCOVERY = 8; // 0x8
-    field public static final int CALLBACK_FLAG_PERFORM_ACTIVE_SCAN = 1; // 0x1
-    field public static final int CALLBACK_FLAG_REQUEST_DISCOVERY = 4; // 0x4
-    field public static final int CALLBACK_FLAG_UNFILTERED_EVENTS = 2; // 0x2
-    field public static final int UNSELECT_REASON_DISCONNECTED = 1; // 0x1
-    field public static final int UNSELECT_REASON_ROUTE_CHANGED = 3; // 0x3
-    field public static final int UNSELECT_REASON_STOPPED = 2; // 0x2
-    field public static final int UNSELECT_REASON_UNKNOWN = 0; // 0x0
-  }
-
-  public static abstract class MediaRouter.Callback {
-    ctor public MediaRouter.Callback();
-    method public void onProviderAdded(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.ProviderInfo);
-    method public void onProviderChanged(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.ProviderInfo);
-    method public void onProviderRemoved(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.ProviderInfo);
-    method public void onRouteAdded(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
-    method public void onRouteChanged(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
-    method public void onRoutePresentationDisplayChanged(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
-    method public void onRouteRemoved(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
-    method public void onRouteSelected(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
-    method public void onRouteUnselected(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
-    method public void onRouteVolumeChanged(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
-  }
-
-  public static abstract class MediaRouter.ControlRequestCallback {
-    ctor public MediaRouter.ControlRequestCallback();
-    method public void onError(java.lang.String, android.os.Bundle);
-    method public void onResult(android.os.Bundle);
-  }
-
-  public static final class MediaRouter.ProviderInfo {
-    method public android.content.ComponentName getComponentName();
-    method public java.lang.String getPackageName();
-    method public android.support.v7.media.MediaRouteProvider getProviderInstance();
-    method public java.util.List<android.support.v7.media.MediaRouter.RouteInfo> getRoutes();
-  }
-
-  public static final class MediaRouter.RouteInfo {
-    method public boolean canDisconnect();
-    method public java.util.List<android.content.IntentFilter> getControlFilters();
-    method public java.lang.String getDescription();
-    method public android.os.Bundle getExtras();
-    method public java.lang.String getId();
-    method public java.lang.String getName();
-    method public int getPlaybackStream();
-    method public int getPlaybackType();
-    method public android.view.Display getPresentationDisplay();
-    method public android.support.v7.media.MediaRouter.ProviderInfo getProvider();
-    method public android.content.IntentSender getSettingsIntent();
-    method public int getVolume();
-    method public int getVolumeHandling();
-    method public int getVolumeMax();
-    method public boolean isConnecting();
-    method public boolean isDefault();
-    method public boolean isEnabled();
-    method public boolean isSelected();
-    method public boolean matchesSelector(android.support.v7.media.MediaRouteSelector);
-    method public void requestSetVolume(int);
-    method public void requestUpdateVolume(int);
-    method public void select();
-    method public void sendControlRequest(android.content.Intent, android.support.v7.media.MediaRouter.ControlRequestCallback);
-    method public boolean supportsControlAction(java.lang.String, java.lang.String);
-    method public boolean supportsControlCategory(java.lang.String);
-    method public boolean supportsControlRequest(android.content.Intent);
-    field public static final int PLAYBACK_TYPE_LOCAL = 0; // 0x0
-    field public static final int PLAYBACK_TYPE_REMOTE = 1; // 0x1
-    field public static final int PLAYBACK_VOLUME_FIXED = 0; // 0x0
-    field public static final int PLAYBACK_VOLUME_VARIABLE = 1; // 0x1
-  }
-
-  public final class MediaSessionStatus {
-    method public android.os.Bundle asBundle();
-    method public static android.support.v7.media.MediaSessionStatus fromBundle(android.os.Bundle);
-    method public android.os.Bundle getExtras();
-    method public int getSessionState();
-    method public long getTimestamp();
-    method public boolean isQueuePaused();
-    field public static final int SESSION_STATE_ACTIVE = 0; // 0x0
-    field public static final int SESSION_STATE_ENDED = 1; // 0x1
-    field public static final int SESSION_STATE_INVALIDATED = 2; // 0x2
-  }
-
-  public static final class MediaSessionStatus.Builder {
-    ctor public MediaSessionStatus.Builder(int);
-    ctor public MediaSessionStatus.Builder(android.support.v7.media.MediaSessionStatus);
-    method public android.support.v7.media.MediaSessionStatus build();
-    method public android.support.v7.media.MediaSessionStatus.Builder setExtras(android.os.Bundle);
-    method public android.support.v7.media.MediaSessionStatus.Builder setQueuePaused(boolean);
-    method public android.support.v7.media.MediaSessionStatus.Builder setSessionState(int);
-    method public android.support.v7.media.MediaSessionStatus.Builder setTimestamp(long);
-  }
-
-  public class RemotePlaybackClient {
-    ctor public RemotePlaybackClient(android.content.Context, android.support.v7.media.MediaRouter.RouteInfo);
-    method public void endSession(android.os.Bundle, android.support.v7.media.RemotePlaybackClient.SessionActionCallback);
-    method public void enqueue(android.net.Uri, java.lang.String, android.os.Bundle, long, android.os.Bundle, android.support.v7.media.RemotePlaybackClient.ItemActionCallback);
-    method public java.lang.String getSessionId();
-    method public void getSessionStatus(android.os.Bundle, android.support.v7.media.RemotePlaybackClient.SessionActionCallback);
-    method public void getStatus(java.lang.String, android.os.Bundle, android.support.v7.media.RemotePlaybackClient.ItemActionCallback);
-    method public boolean hasSession();
-    method public boolean isQueuingSupported();
-    method public boolean isRemotePlaybackSupported();
-    method public boolean isSessionManagementSupported();
-    method public void pause(android.os.Bundle, android.support.v7.media.RemotePlaybackClient.SessionActionCallback);
-    method public void play(android.net.Uri, java.lang.String, android.os.Bundle, long, android.os.Bundle, android.support.v7.media.RemotePlaybackClient.ItemActionCallback);
-    method public void release();
-    method public void remove(java.lang.String, android.os.Bundle, android.support.v7.media.RemotePlaybackClient.ItemActionCallback);
-    method public void resume(android.os.Bundle, android.support.v7.media.RemotePlaybackClient.SessionActionCallback);
-    method public void seek(java.lang.String, long, android.os.Bundle, android.support.v7.media.RemotePlaybackClient.ItemActionCallback);
-    method public void setSessionId(java.lang.String);
-    method public void setStatusCallback(android.support.v7.media.RemotePlaybackClient.StatusCallback);
-    method public void startSession(android.os.Bundle, android.support.v7.media.RemotePlaybackClient.SessionActionCallback);
-    method public void stop(android.os.Bundle, android.support.v7.media.RemotePlaybackClient.SessionActionCallback);
-  }
-
-  public static abstract class RemotePlaybackClient.ActionCallback {
-    ctor public RemotePlaybackClient.ActionCallback();
-    method public void onError(java.lang.String, int, android.os.Bundle);
-  }
-
-  public static abstract class RemotePlaybackClient.ItemActionCallback extends android.support.v7.media.RemotePlaybackClient.ActionCallback {
-    ctor public RemotePlaybackClient.ItemActionCallback();
-    method public void onResult(android.os.Bundle, java.lang.String, android.support.v7.media.MediaSessionStatus, java.lang.String, android.support.v7.media.MediaItemStatus);
-  }
-
-  public static abstract class RemotePlaybackClient.SessionActionCallback extends android.support.v7.media.RemotePlaybackClient.ActionCallback {
-    ctor public RemotePlaybackClient.SessionActionCallback();
-    method public void onResult(android.os.Bundle, java.lang.String, android.support.v7.media.MediaSessionStatus);
-  }
-
-  public static abstract class RemotePlaybackClient.StatusCallback {
-    ctor public RemotePlaybackClient.StatusCallback();
-    method public void onItemStatusChanged(android.os.Bundle, java.lang.String, android.support.v7.media.MediaSessionStatus, java.lang.String, android.support.v7.media.MediaItemStatus);
-    method public void onSessionChanged(java.lang.String);
-    method public void onSessionStatusChanged(android.os.Bundle, java.lang.String, android.support.v7.media.MediaSessionStatus);
-  }
-
-}
-
diff --git a/v7/mediarouter/api/23.0.0.txt b/v7/mediarouter/api/23.0.0.txt
deleted file mode 100644
index 95fc9d2..0000000
--- a/v7/mediarouter/api/23.0.0.txt
+++ /dev/null
@@ -1,671 +0,0 @@
-package android.support.v7.app {
-
-  public abstract class ActionBar {
-    ctor public ActionBar();
-    method public abstract void addOnMenuVisibilityListener(android.support.v7.app.ActionBar.OnMenuVisibilityListener);
-    method public abstract void addTab(android.support.v7.app.ActionBar.Tab);
-    method public abstract void addTab(android.support.v7.app.ActionBar.Tab, boolean);
-    method public abstract void addTab(android.support.v7.app.ActionBar.Tab, int);
-    method public abstract void addTab(android.support.v7.app.ActionBar.Tab, int, boolean);
-    method public boolean collapseActionView();
-    method public void dispatchMenuVisibilityChanged(boolean);
-    method public abstract android.view.View getCustomView();
-    method public abstract int getDisplayOptions();
-    method public float getElevation();
-    method public abstract int getHeight();
-    method public int getHideOffset();
-    method public abstract int getNavigationItemCount();
-    method public abstract int getNavigationMode();
-    method public abstract int getSelectedNavigationIndex();
-    method public abstract android.support.v7.app.ActionBar.Tab getSelectedTab();
-    method public abstract java.lang.CharSequence getSubtitle();
-    method public abstract android.support.v7.app.ActionBar.Tab getTabAt(int);
-    method public abstract int getTabCount();
-    method public android.content.Context getThemedContext();
-    method public abstract java.lang.CharSequence getTitle();
-    method public abstract void hide();
-    method public boolean invalidateOptionsMenu();
-    method public boolean isHideOnContentScrollEnabled();
-    method public abstract boolean isShowing();
-    method public boolean isTitleTruncated();
-    method public abstract android.support.v7.app.ActionBar.Tab newTab();
-    method public void onConfigurationChanged(android.content.res.Configuration);
-    method public boolean onKeyShortcut(int, android.view.KeyEvent);
-    method public boolean onMenuKeyEvent(android.view.KeyEvent);
-    method public boolean openOptionsMenu();
-    method public abstract void removeAllTabs();
-    method public abstract void removeOnMenuVisibilityListener(android.support.v7.app.ActionBar.OnMenuVisibilityListener);
-    method public abstract void removeTab(android.support.v7.app.ActionBar.Tab);
-    method public abstract void removeTabAt(int);
-    method public abstract void selectTab(android.support.v7.app.ActionBar.Tab);
-    method public abstract void setBackgroundDrawable(android.graphics.drawable.Drawable);
-    method public abstract void setCustomView(android.view.View);
-    method public abstract void setCustomView(android.view.View, android.support.v7.app.ActionBar.LayoutParams);
-    method public abstract void setCustomView(int);
-    method public void setDefaultDisplayHomeAsUpEnabled(boolean);
-    method public abstract void setDisplayHomeAsUpEnabled(boolean);
-    method public abstract void setDisplayOptions(int);
-    method public abstract void setDisplayOptions(int, int);
-    method public abstract void setDisplayShowCustomEnabled(boolean);
-    method public abstract void setDisplayShowHomeEnabled(boolean);
-    method public abstract void setDisplayShowTitleEnabled(boolean);
-    method public abstract void setDisplayUseLogoEnabled(boolean);
-    method public void setElevation(float);
-    method public void setHideOffset(int);
-    method public void setHideOnContentScrollEnabled(boolean);
-    method public void setHomeActionContentDescription(java.lang.CharSequence);
-    method public void setHomeActionContentDescription(int);
-    method public void setHomeAsUpIndicator(android.graphics.drawable.Drawable);
-    method public void setHomeAsUpIndicator(int);
-    method public void setHomeButtonEnabled(boolean);
-    method public abstract void setIcon(int);
-    method public abstract void setIcon(android.graphics.drawable.Drawable);
-    method public abstract void setListNavigationCallbacks(android.widget.SpinnerAdapter, android.support.v7.app.ActionBar.OnNavigationListener);
-    method public abstract void setLogo(int);
-    method public abstract void setLogo(android.graphics.drawable.Drawable);
-    method public abstract void setNavigationMode(int);
-    method public abstract void setSelectedNavigationItem(int);
-    method public void setShowHideAnimationEnabled(boolean);
-    method public void setSplitBackgroundDrawable(android.graphics.drawable.Drawable);
-    method public void setStackedBackgroundDrawable(android.graphics.drawable.Drawable);
-    method public abstract void setSubtitle(java.lang.CharSequence);
-    method public abstract void setSubtitle(int);
-    method public abstract void setTitle(java.lang.CharSequence);
-    method public abstract void setTitle(int);
-    method public void setWindowTitle(java.lang.CharSequence);
-    method public abstract void show();
-    method public android.support.v7.view.ActionMode startActionMode(android.support.v7.view.ActionMode.Callback);
-    field public static final int DISPLAY_HOME_AS_UP = 4; // 0x4
-    field public static final int DISPLAY_SHOW_CUSTOM = 16; // 0x10
-    field public static final int DISPLAY_SHOW_HOME = 2; // 0x2
-    field public static final int DISPLAY_SHOW_TITLE = 8; // 0x8
-    field public static final int DISPLAY_USE_LOGO = 1; // 0x1
-    field public static final int NAVIGATION_MODE_LIST = 1; // 0x1
-    field public static final int NAVIGATION_MODE_STANDARD = 0; // 0x0
-    field public static final int NAVIGATION_MODE_TABS = 2; // 0x2
-  }
-
-  public static class ActionBar.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
-    ctor public ActionBar.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public ActionBar.LayoutParams(int, int);
-    ctor public ActionBar.LayoutParams(int, int, int);
-    ctor public ActionBar.LayoutParams(int);
-    ctor public ActionBar.LayoutParams(android.support.v7.app.ActionBar.LayoutParams);
-    ctor public ActionBar.LayoutParams(android.view.ViewGroup.LayoutParams);
-    field public int gravity;
-  }
-
-  public static abstract interface ActionBar.OnMenuVisibilityListener {
-    method public abstract void onMenuVisibilityChanged(boolean);
-  }
-
-  public static abstract interface ActionBar.OnNavigationListener {
-    method public abstract boolean onNavigationItemSelected(int, long);
-  }
-
-  public static abstract class ActionBar.Tab {
-    ctor public ActionBar.Tab();
-    method public abstract java.lang.CharSequence getContentDescription();
-    method public abstract android.view.View getCustomView();
-    method public abstract android.graphics.drawable.Drawable getIcon();
-    method public abstract int getPosition();
-    method public abstract java.lang.Object getTag();
-    method public abstract java.lang.CharSequence getText();
-    method public abstract void select();
-    method public abstract android.support.v7.app.ActionBar.Tab setContentDescription(int);
-    method public abstract android.support.v7.app.ActionBar.Tab setContentDescription(java.lang.CharSequence);
-    method public abstract android.support.v7.app.ActionBar.Tab setCustomView(android.view.View);
-    method public abstract android.support.v7.app.ActionBar.Tab setCustomView(int);
-    method public abstract android.support.v7.app.ActionBar.Tab setIcon(android.graphics.drawable.Drawable);
-    method public abstract android.support.v7.app.ActionBar.Tab setIcon(int);
-    method public abstract android.support.v7.app.ActionBar.Tab setTabListener(android.support.v7.app.ActionBar.TabListener);
-    method public abstract android.support.v7.app.ActionBar.Tab setTag(java.lang.Object);
-    method public abstract android.support.v7.app.ActionBar.Tab setText(java.lang.CharSequence);
-    method public abstract android.support.v7.app.ActionBar.Tab setText(int);
-    field public static final int INVALID_POSITION = -1; // 0xffffffff
-  }
-
-  public static abstract interface ActionBar.TabListener {
-    method public abstract void onTabReselected(android.support.v7.app.ActionBar.Tab, android.support.v4.app.FragmentTransaction);
-    method public abstract void onTabSelected(android.support.v7.app.ActionBar.Tab, android.support.v4.app.FragmentTransaction);
-    method public abstract void onTabUnselected(android.support.v7.app.ActionBar.Tab, android.support.v4.app.FragmentTransaction);
-  }
-
-  public class ActionBarDrawerToggle implements android.support.v4.widget.DrawerLayout.DrawerListener {
-    ctor public ActionBarDrawerToggle(android.app.Activity, android.support.v4.widget.DrawerLayout, int, int);
-    ctor public ActionBarDrawerToggle(android.app.Activity, android.support.v4.widget.DrawerLayout, android.support.v7.widget.Toolbar, int, int);
-    method public android.view.View.OnClickListener getToolbarNavigationClickListener();
-    method public boolean isDrawerIndicatorEnabled();
-    method public void onConfigurationChanged(android.content.res.Configuration);
-    method public void onDrawerClosed(android.view.View);
-    method public void onDrawerOpened(android.view.View);
-    method public void onDrawerSlide(android.view.View, float);
-    method public void onDrawerStateChanged(int);
-    method public boolean onOptionsItemSelected(android.view.MenuItem);
-    method public void setDrawerIndicatorEnabled(boolean);
-    method public void setHomeAsUpIndicator(android.graphics.drawable.Drawable);
-    method public void setHomeAsUpIndicator(int);
-    method public void setToolbarNavigationClickListener(android.view.View.OnClickListener);
-    method public void syncState();
-  }
-
-  public static abstract interface ActionBarDrawerToggle.Delegate {
-    method public abstract android.content.Context getActionBarThemedContext();
-    method public abstract android.graphics.drawable.Drawable getThemeUpIndicator();
-    method public abstract boolean isNavigationVisible();
-    method public abstract void setActionBarDescription(int);
-    method public abstract void setActionBarUpIndicator(android.graphics.drawable.Drawable, int);
-  }
-
-  public class AlertDialog extends android.support.v7.app.AppCompatDialog implements android.content.DialogInterface {
-    ctor protected AlertDialog(android.content.Context);
-    ctor protected AlertDialog(android.content.Context, int);
-    ctor protected AlertDialog(android.content.Context, boolean, android.content.DialogInterface.OnCancelListener);
-    method public android.widget.Button getButton(int);
-    method public android.widget.ListView getListView();
-    method public void setButton(int, java.lang.CharSequence, android.os.Message);
-    method public void setButton(int, java.lang.CharSequence, android.content.DialogInterface.OnClickListener);
-    method public void setCustomTitle(android.view.View);
-    method public void setIcon(int);
-    method public void setIcon(android.graphics.drawable.Drawable);
-    method public void setIconAttribute(int);
-    method public void setMessage(java.lang.CharSequence);
-    method public void setView(android.view.View);
-    method public void setView(android.view.View, int, int, int, int);
-  }
-
-  public abstract interface AppCompatCallback {
-    method public abstract void onSupportActionModeFinished(android.support.v7.view.ActionMode);
-    method public abstract void onSupportActionModeStarted(android.support.v7.view.ActionMode);
-    method public abstract android.support.v7.view.ActionMode onWindowStartingSupportActionMode(android.support.v7.view.ActionMode.Callback);
-  }
-
-  public abstract class AppCompatDelegate {
-    method public abstract void addContentView(android.view.View, android.view.ViewGroup.LayoutParams);
-    method public static android.support.v7.app.AppCompatDelegate create(android.app.Activity, android.support.v7.app.AppCompatCallback);
-    method public static android.support.v7.app.AppCompatDelegate create(android.app.Dialog, android.support.v7.app.AppCompatCallback);
-    method public abstract android.view.View createView(android.view.View, java.lang.String, android.content.Context, android.util.AttributeSet);
-    method public abstract android.support.v7.app.ActionBarDrawerToggle.Delegate getDrawerToggleDelegate();
-    method public abstract android.view.MenuInflater getMenuInflater();
-    method public abstract android.support.v7.app.ActionBar getSupportActionBar();
-    method public abstract boolean hasWindowFeature(int);
-    method public abstract void installViewFactory();
-    method public abstract void invalidateOptionsMenu();
-    method public abstract boolean isHandleNativeActionModesEnabled();
-    method public abstract void onConfigurationChanged(android.content.res.Configuration);
-    method public abstract void onCreate(android.os.Bundle);
-    method public abstract void onDestroy();
-    method public abstract void onPostCreate(android.os.Bundle);
-    method public abstract void onPostResume();
-    method public abstract void onStop();
-    method public abstract boolean requestWindowFeature(int);
-    method public abstract void setContentView(android.view.View);
-    method public abstract void setContentView(int);
-    method public abstract void setContentView(android.view.View, android.view.ViewGroup.LayoutParams);
-    method public abstract void setHandleNativeActionModesEnabled(boolean);
-    method public abstract void setSupportActionBar(android.support.v7.widget.Toolbar);
-    method public abstract void setTitle(java.lang.CharSequence);
-    method public abstract android.support.v7.view.ActionMode startSupportActionMode(android.support.v7.view.ActionMode.Callback);
-    field public static final int FEATURE_ACTION_MODE_OVERLAY = 10; // 0xa
-    field public static final int FEATURE_SUPPORT_ACTION_BAR = 108; // 0x6c
-    field public static final int FEATURE_SUPPORT_ACTION_BAR_OVERLAY = 109; // 0x6d
-  }
-
-  public class AppCompatDialog extends android.app.Dialog implements android.support.v7.app.AppCompatCallback {
-    ctor public AppCompatDialog(android.content.Context);
-    ctor public AppCompatDialog(android.content.Context, int);
-    ctor protected AppCompatDialog(android.content.Context, boolean, android.content.DialogInterface.OnCancelListener);
-    method public android.support.v7.app.AppCompatDelegate getDelegate();
-    method public android.support.v7.app.ActionBar getSupportActionBar();
-    method public void onSupportActionModeFinished(android.support.v7.view.ActionMode);
-    method public void onSupportActionModeStarted(android.support.v7.view.ActionMode);
-    method public android.support.v7.view.ActionMode onWindowStartingSupportActionMode(android.support.v7.view.ActionMode.Callback);
-    method public boolean supportRequestWindowFeature(int);
-  }
-
-  public class MediaRouteActionProvider extends android.support.v4.view.ActionProvider {
-    ctor public MediaRouteActionProvider(android.content.Context);
-    method public android.support.v7.app.MediaRouteDialogFactory getDialogFactory();
-    method public android.support.v7.app.MediaRouteButton getMediaRouteButton();
-    method public android.support.v7.media.MediaRouteSelector getRouteSelector();
-    method public android.view.View onCreateActionView();
-    method public android.support.v7.app.MediaRouteButton onCreateMediaRouteButton();
-    method public void setDialogFactory(android.support.v7.app.MediaRouteDialogFactory);
-    method public void setRouteSelector(android.support.v7.media.MediaRouteSelector);
-  }
-
-  public class MediaRouteButton extends android.view.View {
-    ctor public MediaRouteButton(android.content.Context);
-    ctor public MediaRouteButton(android.content.Context, android.util.AttributeSet);
-    ctor public MediaRouteButton(android.content.Context, android.util.AttributeSet, int);
-    method public android.support.v7.app.MediaRouteDialogFactory getDialogFactory();
-    method public android.support.v7.media.MediaRouteSelector getRouteSelector();
-    method public void onAttachedToWindow();
-    method public void onDetachedFromWindow();
-    method public void setDialogFactory(android.support.v7.app.MediaRouteDialogFactory);
-    method public void setRemoteIndicatorDrawable(android.graphics.drawable.Drawable);
-    method public void setRouteSelector(android.support.v7.media.MediaRouteSelector);
-    method public boolean showDialog();
-  }
-
-  public class MediaRouteChooserDialog extends android.app.Dialog {
-    ctor public MediaRouteChooserDialog(android.content.Context);
-    ctor public MediaRouteChooserDialog(android.content.Context, int);
-    method public android.support.v7.media.MediaRouteSelector getRouteSelector();
-    method public boolean onFilterRoute(android.support.v7.media.MediaRouter.RouteInfo);
-    method public void onFilterRoutes(java.util.List<android.support.v7.media.MediaRouter.RouteInfo>);
-    method public void refreshRoutes();
-    method public void setRouteSelector(android.support.v7.media.MediaRouteSelector);
-  }
-
-  public class MediaRouteChooserDialogFragment extends android.support.v4.app.DialogFragment {
-    ctor public MediaRouteChooserDialogFragment();
-    method public android.support.v7.media.MediaRouteSelector getRouteSelector();
-    method public android.support.v7.app.MediaRouteChooserDialog onCreateChooserDialog(android.content.Context, android.os.Bundle);
-    method public void setRouteSelector(android.support.v7.media.MediaRouteSelector);
-  }
-
-  public class MediaRouteControllerDialog extends android.support.v7.app.AlertDialog {
-    ctor public MediaRouteControllerDialog(android.content.Context);
-    ctor public MediaRouteControllerDialog(android.content.Context, int);
-    method public android.view.View getMediaControlView();
-    method public android.support.v4.media.session.MediaSessionCompat.Token getMediaSession();
-    method public android.support.v7.media.MediaRouter.RouteInfo getRoute();
-    method public boolean isVolumeControlEnabled();
-    method public android.view.View onCreateMediaControlView(android.os.Bundle);
-    method public void setVolumeControlEnabled(boolean);
-  }
-
-  public class MediaRouteControllerDialogFragment extends android.support.v4.app.DialogFragment {
-    ctor public MediaRouteControllerDialogFragment();
-    method public android.support.v7.app.MediaRouteControllerDialog onCreateControllerDialog(android.content.Context, android.os.Bundle);
-  }
-
-  public class MediaRouteDialogFactory {
-    ctor public MediaRouteDialogFactory();
-    method public static android.support.v7.app.MediaRouteDialogFactory getDefault();
-    method public android.support.v7.app.MediaRouteChooserDialogFragment onCreateChooserDialogFragment();
-    method public android.support.v7.app.MediaRouteControllerDialogFragment onCreateControllerDialogFragment();
-  }
-
-  public class MediaRouteDiscoveryFragment extends android.support.v4.app.Fragment {
-    ctor public MediaRouteDiscoveryFragment();
-    method public android.support.v7.media.MediaRouter getMediaRouter();
-    method public android.support.v7.media.MediaRouteSelector getRouteSelector();
-    method public android.support.v7.media.MediaRouter.Callback onCreateCallback();
-    method public int onPrepareCallbackFlags();
-    method public void setRouteSelector(android.support.v7.media.MediaRouteSelector);
-  }
-
-}
-
-package android.support.v7.media {
-
-  public final class MediaControlIntent {
-    field public static final java.lang.String ACTION_END_SESSION = "android.media.intent.action.END_SESSION";
-    field public static final java.lang.String ACTION_ENQUEUE = "android.media.intent.action.ENQUEUE";
-    field public static final java.lang.String ACTION_GET_SESSION_STATUS = "android.media.intent.action.GET_SESSION_STATUS";
-    field public static final java.lang.String ACTION_GET_STATUS = "android.media.intent.action.GET_STATUS";
-    field public static final java.lang.String ACTION_PAUSE = "android.media.intent.action.PAUSE";
-    field public static final java.lang.String ACTION_PLAY = "android.media.intent.action.PLAY";
-    field public static final java.lang.String ACTION_REMOVE = "android.media.intent.action.REMOVE";
-    field public static final java.lang.String ACTION_RESUME = "android.media.intent.action.RESUME";
-    field public static final java.lang.String ACTION_SEEK = "android.media.intent.action.SEEK";
-    field public static final java.lang.String ACTION_START_SESSION = "android.media.intent.action.START_SESSION";
-    field public static final java.lang.String ACTION_STOP = "android.media.intent.action.STOP";
-    field public static final java.lang.String CATEGORY_LIVE_AUDIO = "android.media.intent.category.LIVE_AUDIO";
-    field public static final java.lang.String CATEGORY_LIVE_VIDEO = "android.media.intent.category.LIVE_VIDEO";
-    field public static final java.lang.String CATEGORY_REMOTE_PLAYBACK = "android.media.intent.category.REMOTE_PLAYBACK";
-    field public static final int ERROR_INVALID_ITEM_ID = 3; // 0x3
-    field public static final int ERROR_INVALID_SESSION_ID = 2; // 0x2
-    field public static final int ERROR_UNKNOWN = 0; // 0x0
-    field public static final int ERROR_UNSUPPORTED_OPERATION = 1; // 0x1
-    field public static final java.lang.String EXTRA_ERROR_CODE = "android.media.intent.extra.ERROR_CODE";
-    field public static final java.lang.String EXTRA_ITEM_CONTENT_POSITION = "android.media.intent.extra.ITEM_POSITION";
-    field public static final java.lang.String EXTRA_ITEM_HTTP_HEADERS = "android.media.intent.extra.HTTP_HEADERS";
-    field public static final java.lang.String EXTRA_ITEM_ID = "android.media.intent.extra.ITEM_ID";
-    field public static final java.lang.String EXTRA_ITEM_METADATA = "android.media.intent.extra.ITEM_METADATA";
-    field public static final java.lang.String EXTRA_ITEM_STATUS = "android.media.intent.extra.ITEM_STATUS";
-    field public static final java.lang.String EXTRA_ITEM_STATUS_UPDATE_RECEIVER = "android.media.intent.extra.ITEM_STATUS_UPDATE_RECEIVER";
-    field public static final java.lang.String EXTRA_SESSION_ID = "android.media.intent.extra.SESSION_ID";
-    field public static final java.lang.String EXTRA_SESSION_STATUS = "android.media.intent.extra.SESSION_STATUS";
-    field public static final java.lang.String EXTRA_SESSION_STATUS_UPDATE_RECEIVER = "android.media.intent.extra.SESSION_STATUS_UPDATE_RECEIVER";
-  }
-
-  public final class MediaItemMetadata {
-    field public static final java.lang.String KEY_ALBUM_ARTIST = "android.media.metadata.ALBUM_ARTIST";
-    field public static final java.lang.String KEY_ALBUM_TITLE = "android.media.metadata.ALBUM_TITLE";
-    field public static final java.lang.String KEY_ARTIST = "android.media.metadata.ARTIST";
-    field public static final java.lang.String KEY_ARTWORK_URI = "android.media.metadata.ARTWORK_URI";
-    field public static final java.lang.String KEY_AUTHOR = "android.media.metadata.AUTHOR";
-    field public static final java.lang.String KEY_COMPOSER = "android.media.metadata.COMPOSER";
-    field public static final java.lang.String KEY_DISC_NUMBER = "android.media.metadata.DISC_NUMBER";
-    field public static final java.lang.String KEY_DURATION = "android.media.metadata.DURATION";
-    field public static final java.lang.String KEY_TITLE = "android.media.metadata.TITLE";
-    field public static final java.lang.String KEY_TRACK_NUMBER = "android.media.metadata.TRACK_NUMBER";
-    field public static final java.lang.String KEY_YEAR = "android.media.metadata.YEAR";
-  }
-
-  public final class MediaItemStatus {
-    method public android.os.Bundle asBundle();
-    method public static android.support.v7.media.MediaItemStatus fromBundle(android.os.Bundle);
-    method public long getContentDuration();
-    method public long getContentPosition();
-    method public android.os.Bundle getExtras();
-    method public int getPlaybackState();
-    method public long getTimestamp();
-    field public static final java.lang.String EXTRA_HTTP_RESPONSE_HEADERS = "android.media.status.extra.HTTP_RESPONSE_HEADERS";
-    field public static final java.lang.String EXTRA_HTTP_STATUS_CODE = "android.media.status.extra.HTTP_STATUS_CODE";
-    field public static final int PLAYBACK_STATE_BUFFERING = 3; // 0x3
-    field public static final int PLAYBACK_STATE_CANCELED = 5; // 0x5
-    field public static final int PLAYBACK_STATE_ERROR = 7; // 0x7
-    field public static final int PLAYBACK_STATE_FINISHED = 4; // 0x4
-    field public static final int PLAYBACK_STATE_INVALIDATED = 6; // 0x6
-    field public static final int PLAYBACK_STATE_PAUSED = 2; // 0x2
-    field public static final int PLAYBACK_STATE_PENDING = 0; // 0x0
-    field public static final int PLAYBACK_STATE_PLAYING = 1; // 0x1
-  }
-
-  public static final class MediaItemStatus.Builder {
-    ctor public MediaItemStatus.Builder(int);
-    ctor public MediaItemStatus.Builder(android.support.v7.media.MediaItemStatus);
-    method public android.support.v7.media.MediaItemStatus build();
-    method public android.support.v7.media.MediaItemStatus.Builder setContentDuration(long);
-    method public android.support.v7.media.MediaItemStatus.Builder setContentPosition(long);
-    method public android.support.v7.media.MediaItemStatus.Builder setExtras(android.os.Bundle);
-    method public android.support.v7.media.MediaItemStatus.Builder setPlaybackState(int);
-    method public android.support.v7.media.MediaItemStatus.Builder setTimestamp(long);
-  }
-
-  public final class MediaRouteDescriptor {
-    method public android.os.Bundle asBundle();
-    method public boolean canDisconnectAndKeepPlaying();
-    method public static android.support.v7.media.MediaRouteDescriptor fromBundle(android.os.Bundle);
-    method public java.util.List<android.content.IntentFilter> getControlFilters();
-    method public java.lang.String getDescription();
-    method public android.os.Bundle getExtras();
-    method public java.lang.String getId();
-    method public java.lang.String getName();
-    method public int getPlaybackStream();
-    method public int getPlaybackType();
-    method public int getPresentationDisplayId();
-    method public android.content.IntentSender getSettingsActivity();
-    method public int getVolume();
-    method public int getVolumeHandling();
-    method public int getVolumeMax();
-    method public boolean isConnecting();
-    method public boolean isEnabled();
-    method public boolean isValid();
-  }
-
-  public static final class MediaRouteDescriptor.Builder {
-    ctor public MediaRouteDescriptor.Builder(java.lang.String, java.lang.String);
-    ctor public MediaRouteDescriptor.Builder(android.support.v7.media.MediaRouteDescriptor);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder addControlFilter(android.content.IntentFilter);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder addControlFilters(java.util.Collection<android.content.IntentFilter>);
-    method public android.support.v7.media.MediaRouteDescriptor build();
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setCanDisconnect(boolean);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setConnecting(boolean);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setDescription(java.lang.String);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setEnabled(boolean);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setExtras(android.os.Bundle);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setId(java.lang.String);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setName(java.lang.String);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setPlaybackStream(int);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setPlaybackType(int);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setPresentationDisplayId(int);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setSettingsActivity(android.content.IntentSender);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setVolume(int);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setVolumeHandling(int);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setVolumeMax(int);
-  }
-
-  public final class MediaRouteDiscoveryRequest {
-    ctor public MediaRouteDiscoveryRequest(android.support.v7.media.MediaRouteSelector, boolean);
-    method public android.os.Bundle asBundle();
-    method public static android.support.v7.media.MediaRouteDiscoveryRequest fromBundle(android.os.Bundle);
-    method public android.support.v7.media.MediaRouteSelector getSelector();
-    method public boolean isActiveScan();
-    method public boolean isValid();
-  }
-
-  public abstract class MediaRouteProvider {
-    ctor public MediaRouteProvider(android.content.Context);
-    method public final android.content.Context getContext();
-    method public final android.support.v7.media.MediaRouteProviderDescriptor getDescriptor();
-    method public final android.support.v7.media.MediaRouteDiscoveryRequest getDiscoveryRequest();
-    method public final android.os.Handler getHandler();
-    method public final android.support.v7.media.MediaRouteProvider.ProviderMetadata getMetadata();
-    method public android.support.v7.media.MediaRouteProvider.RouteController onCreateRouteController(java.lang.String);
-    method public void onDiscoveryRequestChanged(android.support.v7.media.MediaRouteDiscoveryRequest);
-    method public final void setCallback(android.support.v7.media.MediaRouteProvider.Callback);
-    method public final void setDescriptor(android.support.v7.media.MediaRouteProviderDescriptor);
-    method public final void setDiscoveryRequest(android.support.v7.media.MediaRouteDiscoveryRequest);
-  }
-
-  public static abstract class MediaRouteProvider.Callback {
-    ctor public MediaRouteProvider.Callback();
-    method public void onDescriptorChanged(android.support.v7.media.MediaRouteProvider, android.support.v7.media.MediaRouteProviderDescriptor);
-  }
-
-  public static final class MediaRouteProvider.ProviderMetadata {
-    method public android.content.ComponentName getComponentName();
-    method public java.lang.String getPackageName();
-  }
-
-  public static abstract class MediaRouteProvider.RouteController {
-    ctor public MediaRouteProvider.RouteController();
-    method public boolean onControlRequest(android.content.Intent, android.support.v7.media.MediaRouter.ControlRequestCallback);
-    method public void onRelease();
-    method public void onSelect();
-    method public void onSetVolume(int);
-    method public void onUnselect();
-    method public void onUnselect(int);
-    method public void onUpdateVolume(int);
-  }
-
-  public final class MediaRouteProviderDescriptor {
-    method public android.os.Bundle asBundle();
-    method public static android.support.v7.media.MediaRouteProviderDescriptor fromBundle(android.os.Bundle);
-    method public java.util.List<android.support.v7.media.MediaRouteDescriptor> getRoutes();
-    method public boolean isValid();
-  }
-
-  public static final class MediaRouteProviderDescriptor.Builder {
-    ctor public MediaRouteProviderDescriptor.Builder();
-    ctor public MediaRouteProviderDescriptor.Builder(android.support.v7.media.MediaRouteProviderDescriptor);
-    method public android.support.v7.media.MediaRouteProviderDescriptor.Builder addRoute(android.support.v7.media.MediaRouteDescriptor);
-    method public android.support.v7.media.MediaRouteProviderDescriptor.Builder addRoutes(java.util.Collection<android.support.v7.media.MediaRouteDescriptor>);
-    method public android.support.v7.media.MediaRouteProviderDescriptor build();
-  }
-
-  public abstract class MediaRouteProviderService extends android.app.Service {
-    ctor public MediaRouteProviderService();
-    method public android.support.v7.media.MediaRouteProvider getMediaRouteProvider();
-    method public android.os.IBinder onBind(android.content.Intent);
-    method public abstract android.support.v7.media.MediaRouteProvider onCreateMediaRouteProvider();
-    field public static final java.lang.String SERVICE_INTERFACE = "android.media.MediaRouteProviderService";
-  }
-
-  public final class MediaRouteSelector {
-    method public android.os.Bundle asBundle();
-    method public boolean contains(android.support.v7.media.MediaRouteSelector);
-    method public static android.support.v7.media.MediaRouteSelector fromBundle(android.os.Bundle);
-    method public java.util.List<java.lang.String> getControlCategories();
-    method public boolean hasControlCategory(java.lang.String);
-    method public boolean isEmpty();
-    method public boolean isValid();
-    method public boolean matchesControlFilters(java.util.List<android.content.IntentFilter>);
-    field public static final android.support.v7.media.MediaRouteSelector EMPTY;
-  }
-
-  public static final class MediaRouteSelector.Builder {
-    ctor public MediaRouteSelector.Builder();
-    ctor public MediaRouteSelector.Builder(android.support.v7.media.MediaRouteSelector);
-    method public android.support.v7.media.MediaRouteSelector.Builder addControlCategories(java.util.Collection<java.lang.String>);
-    method public android.support.v7.media.MediaRouteSelector.Builder addControlCategory(java.lang.String);
-    method public android.support.v7.media.MediaRouteSelector.Builder addSelector(android.support.v7.media.MediaRouteSelector);
-    method public android.support.v7.media.MediaRouteSelector build();
-  }
-
-  public final class MediaRouter {
-    method public void addCallback(android.support.v7.media.MediaRouteSelector, android.support.v7.media.MediaRouter.Callback);
-    method public void addCallback(android.support.v7.media.MediaRouteSelector, android.support.v7.media.MediaRouter.Callback, int);
-    method public void addProvider(android.support.v7.media.MediaRouteProvider);
-    method public void addRemoteControlClient(java.lang.Object);
-    method public android.support.v7.media.MediaRouter.RouteInfo getDefaultRoute();
-    method public static android.support.v7.media.MediaRouter getInstance(android.content.Context);
-    method public android.support.v4.media.session.MediaSessionCompat.Token getMediaSessionToken();
-    method public java.util.List<android.support.v7.media.MediaRouter.ProviderInfo> getProviders();
-    method public java.util.List<android.support.v7.media.MediaRouter.RouteInfo> getRoutes();
-    method public android.support.v7.media.MediaRouter.RouteInfo getSelectedRoute();
-    method public boolean isRouteAvailable(android.support.v7.media.MediaRouteSelector, int);
-    method public void removeCallback(android.support.v7.media.MediaRouter.Callback);
-    method public void removeProvider(android.support.v7.media.MediaRouteProvider);
-    method public void removeRemoteControlClient(java.lang.Object);
-    method public void selectRoute(android.support.v7.media.MediaRouter.RouteInfo);
-    method public void setMediaSession(java.lang.Object);
-    method public void setMediaSessionCompat(android.support.v4.media.session.MediaSessionCompat);
-    method public void unselect(int);
-    method public android.support.v7.media.MediaRouter.RouteInfo updateSelectedRoute(android.support.v7.media.MediaRouteSelector);
-    field public static final int AVAILABILITY_FLAG_IGNORE_DEFAULT_ROUTE = 1; // 0x1
-    field public static final int AVAILABILITY_FLAG_REQUIRE_MATCH = 2; // 0x2
-    field public static final int CALLBACK_FLAG_FORCE_DISCOVERY = 8; // 0x8
-    field public static final int CALLBACK_FLAG_PERFORM_ACTIVE_SCAN = 1; // 0x1
-    field public static final int CALLBACK_FLAG_REQUEST_DISCOVERY = 4; // 0x4
-    field public static final int CALLBACK_FLAG_UNFILTERED_EVENTS = 2; // 0x2
-    field public static final int UNSELECT_REASON_DISCONNECTED = 1; // 0x1
-    field public static final int UNSELECT_REASON_ROUTE_CHANGED = 3; // 0x3
-    field public static final int UNSELECT_REASON_STOPPED = 2; // 0x2
-    field public static final int UNSELECT_REASON_UNKNOWN = 0; // 0x0
-  }
-
-  public static abstract class MediaRouter.Callback {
-    ctor public MediaRouter.Callback();
-    method public void onProviderAdded(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.ProviderInfo);
-    method public void onProviderChanged(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.ProviderInfo);
-    method public void onProviderRemoved(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.ProviderInfo);
-    method public void onRouteAdded(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
-    method public void onRouteChanged(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
-    method public void onRoutePresentationDisplayChanged(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
-    method public void onRouteRemoved(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
-    method public void onRouteSelected(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
-    method public void onRouteUnselected(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
-    method public void onRouteVolumeChanged(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
-  }
-
-  public static abstract class MediaRouter.ControlRequestCallback {
-    ctor public MediaRouter.ControlRequestCallback();
-    method public void onError(java.lang.String, android.os.Bundle);
-    method public void onResult(android.os.Bundle);
-  }
-
-  public static final class MediaRouter.ProviderInfo {
-    method public android.content.ComponentName getComponentName();
-    method public java.lang.String getPackageName();
-    method public android.support.v7.media.MediaRouteProvider getProviderInstance();
-    method public java.util.List<android.support.v7.media.MediaRouter.RouteInfo> getRoutes();
-  }
-
-  public static final class MediaRouter.RouteInfo {
-    method public boolean canDisconnect();
-    method public java.util.List<android.content.IntentFilter> getControlFilters();
-    method public java.lang.String getDescription();
-    method public android.os.Bundle getExtras();
-    method public java.lang.String getId();
-    method public java.lang.String getName();
-    method public int getPlaybackStream();
-    method public int getPlaybackType();
-    method public android.view.Display getPresentationDisplay();
-    method public android.support.v7.media.MediaRouter.ProviderInfo getProvider();
-    method public android.content.IntentSender getSettingsIntent();
-    method public int getVolume();
-    method public int getVolumeHandling();
-    method public int getVolumeMax();
-    method public boolean isConnecting();
-    method public boolean isDefault();
-    method public boolean isEnabled();
-    method public boolean isSelected();
-    method public boolean matchesSelector(android.support.v7.media.MediaRouteSelector);
-    method public void requestSetVolume(int);
-    method public void requestUpdateVolume(int);
-    method public void select();
-    method public void sendControlRequest(android.content.Intent, android.support.v7.media.MediaRouter.ControlRequestCallback);
-    method public boolean supportsControlAction(java.lang.String, java.lang.String);
-    method public boolean supportsControlCategory(java.lang.String);
-    method public boolean supportsControlRequest(android.content.Intent);
-    field public static final int PLAYBACK_TYPE_LOCAL = 0; // 0x0
-    field public static final int PLAYBACK_TYPE_REMOTE = 1; // 0x1
-    field public static final int PLAYBACK_VOLUME_FIXED = 0; // 0x0
-    field public static final int PLAYBACK_VOLUME_VARIABLE = 1; // 0x1
-  }
-
-  public final class MediaSessionStatus {
-    method public android.os.Bundle asBundle();
-    method public static android.support.v7.media.MediaSessionStatus fromBundle(android.os.Bundle);
-    method public android.os.Bundle getExtras();
-    method public int getSessionState();
-    method public long getTimestamp();
-    method public boolean isQueuePaused();
-    field public static final int SESSION_STATE_ACTIVE = 0; // 0x0
-    field public static final int SESSION_STATE_ENDED = 1; // 0x1
-    field public static final int SESSION_STATE_INVALIDATED = 2; // 0x2
-  }
-
-  public static final class MediaSessionStatus.Builder {
-    ctor public MediaSessionStatus.Builder(int);
-    ctor public MediaSessionStatus.Builder(android.support.v7.media.MediaSessionStatus);
-    method public android.support.v7.media.MediaSessionStatus build();
-    method public android.support.v7.media.MediaSessionStatus.Builder setExtras(android.os.Bundle);
-    method public android.support.v7.media.MediaSessionStatus.Builder setQueuePaused(boolean);
-    method public android.support.v7.media.MediaSessionStatus.Builder setSessionState(int);
-    method public android.support.v7.media.MediaSessionStatus.Builder setTimestamp(long);
-  }
-
-  public class RemotePlaybackClient {
-    ctor public RemotePlaybackClient(android.content.Context, android.support.v7.media.MediaRouter.RouteInfo);
-    method public void endSession(android.os.Bundle, android.support.v7.media.RemotePlaybackClient.SessionActionCallback);
-    method public void enqueue(android.net.Uri, java.lang.String, android.os.Bundle, long, android.os.Bundle, android.support.v7.media.RemotePlaybackClient.ItemActionCallback);
-    method public java.lang.String getSessionId();
-    method public void getSessionStatus(android.os.Bundle, android.support.v7.media.RemotePlaybackClient.SessionActionCallback);
-    method public void getStatus(java.lang.String, android.os.Bundle, android.support.v7.media.RemotePlaybackClient.ItemActionCallback);
-    method public boolean hasSession();
-    method public boolean isQueuingSupported();
-    method public boolean isRemotePlaybackSupported();
-    method public boolean isSessionManagementSupported();
-    method public void pause(android.os.Bundle, android.support.v7.media.RemotePlaybackClient.SessionActionCallback);
-    method public void play(android.net.Uri, java.lang.String, android.os.Bundle, long, android.os.Bundle, android.support.v7.media.RemotePlaybackClient.ItemActionCallback);
-    method public void release();
-    method public void remove(java.lang.String, android.os.Bundle, android.support.v7.media.RemotePlaybackClient.ItemActionCallback);
-    method public void resume(android.os.Bundle, android.support.v7.media.RemotePlaybackClient.SessionActionCallback);
-    method public void seek(java.lang.String, long, android.os.Bundle, android.support.v7.media.RemotePlaybackClient.ItemActionCallback);
-    method public void setSessionId(java.lang.String);
-    method public void setStatusCallback(android.support.v7.media.RemotePlaybackClient.StatusCallback);
-    method public void startSession(android.os.Bundle, android.support.v7.media.RemotePlaybackClient.SessionActionCallback);
-    method public void stop(android.os.Bundle, android.support.v7.media.RemotePlaybackClient.SessionActionCallback);
-  }
-
-  public static abstract class RemotePlaybackClient.ActionCallback {
-    ctor public RemotePlaybackClient.ActionCallback();
-    method public void onError(java.lang.String, int, android.os.Bundle);
-  }
-
-  public static abstract class RemotePlaybackClient.ItemActionCallback extends android.support.v7.media.RemotePlaybackClient.ActionCallback {
-    ctor public RemotePlaybackClient.ItemActionCallback();
-    method public void onResult(android.os.Bundle, java.lang.String, android.support.v7.media.MediaSessionStatus, java.lang.String, android.support.v7.media.MediaItemStatus);
-  }
-
-  public static abstract class RemotePlaybackClient.SessionActionCallback extends android.support.v7.media.RemotePlaybackClient.ActionCallback {
-    ctor public RemotePlaybackClient.SessionActionCallback();
-    method public void onResult(android.os.Bundle, java.lang.String, android.support.v7.media.MediaSessionStatus);
-  }
-
-  public static abstract class RemotePlaybackClient.StatusCallback {
-    ctor public RemotePlaybackClient.StatusCallback();
-    method public void onItemStatusChanged(android.os.Bundle, java.lang.String, android.support.v7.media.MediaSessionStatus, java.lang.String, android.support.v7.media.MediaItemStatus);
-    method public void onSessionChanged(java.lang.String);
-    method public void onSessionStatusChanged(android.os.Bundle, java.lang.String, android.support.v7.media.MediaSessionStatus);
-  }
-
-}
-
diff --git a/v7/mediarouter/api/23.1.0.txt b/v7/mediarouter/api/23.1.0.txt
deleted file mode 100644
index 69fc20e..0000000
--- a/v7/mediarouter/api/23.1.0.txt
+++ /dev/null
@@ -1,694 +0,0 @@
-package android.support.v7.app {
-
-  public abstract class ActionBar {
-    ctor public ActionBar();
-    method public abstract void addOnMenuVisibilityListener(android.support.v7.app.ActionBar.OnMenuVisibilityListener);
-    method public abstract void addTab(android.support.v7.app.ActionBar.Tab);
-    method public abstract void addTab(android.support.v7.app.ActionBar.Tab, boolean);
-    method public abstract void addTab(android.support.v7.app.ActionBar.Tab, int);
-    method public abstract void addTab(android.support.v7.app.ActionBar.Tab, int, boolean);
-    method public boolean collapseActionView();
-    method public void dispatchMenuVisibilityChanged(boolean);
-    method public abstract android.view.View getCustomView();
-    method public abstract int getDisplayOptions();
-    method public float getElevation();
-    method public abstract int getHeight();
-    method public int getHideOffset();
-    method public abstract int getNavigationItemCount();
-    method public abstract int getNavigationMode();
-    method public abstract int getSelectedNavigationIndex();
-    method public abstract android.support.v7.app.ActionBar.Tab getSelectedTab();
-    method public abstract java.lang.CharSequence getSubtitle();
-    method public abstract android.support.v7.app.ActionBar.Tab getTabAt(int);
-    method public abstract int getTabCount();
-    method public android.content.Context getThemedContext();
-    method public abstract java.lang.CharSequence getTitle();
-    method public abstract void hide();
-    method public boolean invalidateOptionsMenu();
-    method public boolean isHideOnContentScrollEnabled();
-    method public abstract boolean isShowing();
-    method public boolean isTitleTruncated();
-    method public abstract android.support.v7.app.ActionBar.Tab newTab();
-    method public void onConfigurationChanged(android.content.res.Configuration);
-    method public boolean onKeyShortcut(int, android.view.KeyEvent);
-    method public boolean onMenuKeyEvent(android.view.KeyEvent);
-    method public boolean openOptionsMenu();
-    method public abstract void removeAllTabs();
-    method public abstract void removeOnMenuVisibilityListener(android.support.v7.app.ActionBar.OnMenuVisibilityListener);
-    method public abstract void removeTab(android.support.v7.app.ActionBar.Tab);
-    method public abstract void removeTabAt(int);
-    method public abstract void selectTab(android.support.v7.app.ActionBar.Tab);
-    method public abstract void setBackgroundDrawable(android.graphics.drawable.Drawable);
-    method public abstract void setCustomView(android.view.View);
-    method public abstract void setCustomView(android.view.View, android.support.v7.app.ActionBar.LayoutParams);
-    method public abstract void setCustomView(int);
-    method public void setDefaultDisplayHomeAsUpEnabled(boolean);
-    method public abstract void setDisplayHomeAsUpEnabled(boolean);
-    method public abstract void setDisplayOptions(int);
-    method public abstract void setDisplayOptions(int, int);
-    method public abstract void setDisplayShowCustomEnabled(boolean);
-    method public abstract void setDisplayShowHomeEnabled(boolean);
-    method public abstract void setDisplayShowTitleEnabled(boolean);
-    method public abstract void setDisplayUseLogoEnabled(boolean);
-    method public void setElevation(float);
-    method public void setHideOffset(int);
-    method public void setHideOnContentScrollEnabled(boolean);
-    method public void setHomeActionContentDescription(java.lang.CharSequence);
-    method public void setHomeActionContentDescription(int);
-    method public void setHomeAsUpIndicator(android.graphics.drawable.Drawable);
-    method public void setHomeAsUpIndicator(int);
-    method public void setHomeButtonEnabled(boolean);
-    method public abstract void setIcon(int);
-    method public abstract void setIcon(android.graphics.drawable.Drawable);
-    method public abstract void setListNavigationCallbacks(android.widget.SpinnerAdapter, android.support.v7.app.ActionBar.OnNavigationListener);
-    method public abstract void setLogo(int);
-    method public abstract void setLogo(android.graphics.drawable.Drawable);
-    method public abstract void setNavigationMode(int);
-    method public abstract void setSelectedNavigationItem(int);
-    method public void setShowHideAnimationEnabled(boolean);
-    method public void setSplitBackgroundDrawable(android.graphics.drawable.Drawable);
-    method public void setStackedBackgroundDrawable(android.graphics.drawable.Drawable);
-    method public abstract void setSubtitle(java.lang.CharSequence);
-    method public abstract void setSubtitle(int);
-    method public abstract void setTitle(java.lang.CharSequence);
-    method public abstract void setTitle(int);
-    method public void setWindowTitle(java.lang.CharSequence);
-    method public abstract void show();
-    method public android.support.v7.view.ActionMode startActionMode(android.support.v7.view.ActionMode.Callback);
-    field public static final int DISPLAY_HOME_AS_UP = 4; // 0x4
-    field public static final int DISPLAY_SHOW_CUSTOM = 16; // 0x10
-    field public static final int DISPLAY_SHOW_HOME = 2; // 0x2
-    field public static final int DISPLAY_SHOW_TITLE = 8; // 0x8
-    field public static final int DISPLAY_USE_LOGO = 1; // 0x1
-    field public static final int NAVIGATION_MODE_LIST = 1; // 0x1
-    field public static final int NAVIGATION_MODE_STANDARD = 0; // 0x0
-    field public static final int NAVIGATION_MODE_TABS = 2; // 0x2
-  }
-
-  public static class ActionBar.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
-    ctor public ActionBar.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public ActionBar.LayoutParams(int, int);
-    ctor public ActionBar.LayoutParams(int, int, int);
-    ctor public ActionBar.LayoutParams(int);
-    ctor public ActionBar.LayoutParams(android.support.v7.app.ActionBar.LayoutParams);
-    ctor public ActionBar.LayoutParams(android.view.ViewGroup.LayoutParams);
-    field public int gravity;
-  }
-
-  public static abstract interface ActionBar.OnMenuVisibilityListener {
-    method public abstract void onMenuVisibilityChanged(boolean);
-  }
-
-  public static abstract interface ActionBar.OnNavigationListener {
-    method public abstract boolean onNavigationItemSelected(int, long);
-  }
-
-  public static abstract class ActionBar.Tab {
-    ctor public ActionBar.Tab();
-    method public abstract java.lang.CharSequence getContentDescription();
-    method public abstract android.view.View getCustomView();
-    method public abstract android.graphics.drawable.Drawable getIcon();
-    method public abstract int getPosition();
-    method public abstract java.lang.Object getTag();
-    method public abstract java.lang.CharSequence getText();
-    method public abstract void select();
-    method public abstract android.support.v7.app.ActionBar.Tab setContentDescription(int);
-    method public abstract android.support.v7.app.ActionBar.Tab setContentDescription(java.lang.CharSequence);
-    method public abstract android.support.v7.app.ActionBar.Tab setCustomView(android.view.View);
-    method public abstract android.support.v7.app.ActionBar.Tab setCustomView(int);
-    method public abstract android.support.v7.app.ActionBar.Tab setIcon(android.graphics.drawable.Drawable);
-    method public abstract android.support.v7.app.ActionBar.Tab setIcon(int);
-    method public abstract android.support.v7.app.ActionBar.Tab setTabListener(android.support.v7.app.ActionBar.TabListener);
-    method public abstract android.support.v7.app.ActionBar.Tab setTag(java.lang.Object);
-    method public abstract android.support.v7.app.ActionBar.Tab setText(java.lang.CharSequence);
-    method public abstract android.support.v7.app.ActionBar.Tab setText(int);
-    field public static final int INVALID_POSITION = -1; // 0xffffffff
-  }
-
-  public static abstract interface ActionBar.TabListener {
-    method public abstract void onTabReselected(android.support.v7.app.ActionBar.Tab, android.support.v4.app.FragmentTransaction);
-    method public abstract void onTabSelected(android.support.v7.app.ActionBar.Tab, android.support.v4.app.FragmentTransaction);
-    method public abstract void onTabUnselected(android.support.v7.app.ActionBar.Tab, android.support.v4.app.FragmentTransaction);
-  }
-
-  public class ActionBarDrawerToggle implements android.support.v4.widget.DrawerLayout.DrawerListener {
-    ctor public ActionBarDrawerToggle(android.app.Activity, android.support.v4.widget.DrawerLayout, int, int);
-    ctor public ActionBarDrawerToggle(android.app.Activity, android.support.v4.widget.DrawerLayout, android.support.v7.widget.Toolbar, int, int);
-    method public android.view.View.OnClickListener getToolbarNavigationClickListener();
-    method public boolean isDrawerIndicatorEnabled();
-    method public void onConfigurationChanged(android.content.res.Configuration);
-    method public void onDrawerClosed(android.view.View);
-    method public void onDrawerOpened(android.view.View);
-    method public void onDrawerSlide(android.view.View, float);
-    method public void onDrawerStateChanged(int);
-    method public boolean onOptionsItemSelected(android.view.MenuItem);
-    method public void setDrawerIndicatorEnabled(boolean);
-    method public void setHomeAsUpIndicator(android.graphics.drawable.Drawable);
-    method public void setHomeAsUpIndicator(int);
-    method public void setToolbarNavigationClickListener(android.view.View.OnClickListener);
-    method public void syncState();
-  }
-
-  public static abstract interface ActionBarDrawerToggle.Delegate {
-    method public abstract android.content.Context getActionBarThemedContext();
-    method public abstract android.graphics.drawable.Drawable getThemeUpIndicator();
-    method public abstract boolean isNavigationVisible();
-    method public abstract void setActionBarDescription(int);
-    method public abstract void setActionBarUpIndicator(android.graphics.drawable.Drawable, int);
-  }
-
-  public class AlertDialog extends android.support.v7.app.AppCompatDialog implements android.content.DialogInterface {
-    ctor protected AlertDialog(android.content.Context);
-    ctor protected AlertDialog(android.content.Context, int);
-    ctor protected AlertDialog(android.content.Context, boolean, android.content.DialogInterface.OnCancelListener);
-    method public android.widget.Button getButton(int);
-    method public android.widget.ListView getListView();
-    method public void setButton(int, java.lang.CharSequence, android.os.Message);
-    method public void setButton(int, java.lang.CharSequence, android.content.DialogInterface.OnClickListener);
-    method public void setCustomTitle(android.view.View);
-    method public void setIcon(int);
-    method public void setIcon(android.graphics.drawable.Drawable);
-    method public void setIconAttribute(int);
-    method public void setMessage(java.lang.CharSequence);
-    method public void setView(android.view.View);
-    method public void setView(android.view.View, int, int, int, int);
-  }
-
-  public abstract interface AppCompatCallback {
-    method public abstract void onSupportActionModeFinished(android.support.v7.view.ActionMode);
-    method public abstract void onSupportActionModeStarted(android.support.v7.view.ActionMode);
-    method public abstract android.support.v7.view.ActionMode onWindowStartingSupportActionMode(android.support.v7.view.ActionMode.Callback);
-  }
-
-  public abstract class AppCompatDelegate {
-    method public abstract void addContentView(android.view.View, android.view.ViewGroup.LayoutParams);
-    method public static android.support.v7.app.AppCompatDelegate create(android.app.Activity, android.support.v7.app.AppCompatCallback);
-    method public static android.support.v7.app.AppCompatDelegate create(android.app.Dialog, android.support.v7.app.AppCompatCallback);
-    method public abstract android.view.View createView(android.view.View, java.lang.String, android.content.Context, android.util.AttributeSet);
-    method public abstract android.support.v7.app.ActionBarDrawerToggle.Delegate getDrawerToggleDelegate();
-    method public abstract android.view.MenuInflater getMenuInflater();
-    method public abstract android.support.v7.app.ActionBar getSupportActionBar();
-    method public abstract boolean hasWindowFeature(int);
-    method public abstract void installViewFactory();
-    method public abstract void invalidateOptionsMenu();
-    method public abstract boolean isHandleNativeActionModesEnabled();
-    method public abstract void onConfigurationChanged(android.content.res.Configuration);
-    method public abstract void onCreate(android.os.Bundle);
-    method public abstract void onDestroy();
-    method public abstract void onPostCreate(android.os.Bundle);
-    method public abstract void onPostResume();
-    method public abstract void onStop();
-    method public abstract boolean requestWindowFeature(int);
-    method public abstract void setContentView(android.view.View);
-    method public abstract void setContentView(int);
-    method public abstract void setContentView(android.view.View, android.view.ViewGroup.LayoutParams);
-    method public abstract void setHandleNativeActionModesEnabled(boolean);
-    method public abstract void setSupportActionBar(android.support.v7.widget.Toolbar);
-    method public abstract void setTitle(java.lang.CharSequence);
-    method public abstract android.support.v7.view.ActionMode startSupportActionMode(android.support.v7.view.ActionMode.Callback);
-    field public static final int FEATURE_ACTION_MODE_OVERLAY = 10; // 0xa
-    field public static final int FEATURE_SUPPORT_ACTION_BAR = 108; // 0x6c
-    field public static final int FEATURE_SUPPORT_ACTION_BAR_OVERLAY = 109; // 0x6d
-  }
-
-  public class AppCompatDialog extends android.app.Dialog implements android.support.v7.app.AppCompatCallback {
-    ctor public AppCompatDialog(android.content.Context);
-    ctor public AppCompatDialog(android.content.Context, int);
-    ctor protected AppCompatDialog(android.content.Context, boolean, android.content.DialogInterface.OnCancelListener);
-    method public android.support.v7.app.AppCompatDelegate getDelegate();
-    method public android.support.v7.app.ActionBar getSupportActionBar();
-    method public void onSupportActionModeFinished(android.support.v7.view.ActionMode);
-    method public void onSupportActionModeStarted(android.support.v7.view.ActionMode);
-    method public android.support.v7.view.ActionMode onWindowStartingSupportActionMode(android.support.v7.view.ActionMode.Callback);
-    method public boolean supportRequestWindowFeature(int);
-  }
-
-  public class MediaRouteActionProvider extends android.support.v4.view.ActionProvider {
-    ctor public MediaRouteActionProvider(android.content.Context);
-    method public android.support.v7.app.MediaRouteDialogFactory getDialogFactory();
-    method public android.support.v7.app.MediaRouteButton getMediaRouteButton();
-    method public android.support.v7.media.MediaRouteSelector getRouteSelector();
-    method public android.view.View onCreateActionView();
-    method public android.support.v7.app.MediaRouteButton onCreateMediaRouteButton();
-    method public void setDialogFactory(android.support.v7.app.MediaRouteDialogFactory);
-    method public void setRouteSelector(android.support.v7.media.MediaRouteSelector);
-  }
-
-  public class MediaRouteButton extends android.view.View {
-    ctor public MediaRouteButton(android.content.Context);
-    ctor public MediaRouteButton(android.content.Context, android.util.AttributeSet);
-    ctor public MediaRouteButton(android.content.Context, android.util.AttributeSet, int);
-    method public android.support.v7.app.MediaRouteDialogFactory getDialogFactory();
-    method public android.support.v7.media.MediaRouteSelector getRouteSelector();
-    method public void onAttachedToWindow();
-    method public void onDetachedFromWindow();
-    method public void setDialogFactory(android.support.v7.app.MediaRouteDialogFactory);
-    method public void setRemoteIndicatorDrawable(android.graphics.drawable.Drawable);
-    method public void setRouteSelector(android.support.v7.media.MediaRouteSelector);
-    method public boolean showDialog();
-  }
-
-  public class MediaRouteChooserDialog extends android.app.Dialog {
-    ctor public MediaRouteChooserDialog(android.content.Context);
-    ctor public MediaRouteChooserDialog(android.content.Context, int);
-    method public android.support.v7.media.MediaRouteSelector getRouteSelector();
-    method public boolean onFilterRoute(android.support.v7.media.MediaRouter.RouteInfo);
-    method public void onFilterRoutes(java.util.List<android.support.v7.media.MediaRouter.RouteInfo>);
-    method public void refreshRoutes();
-    method public void setRouteSelector(android.support.v7.media.MediaRouteSelector);
-  }
-
-  public class MediaRouteChooserDialogFragment extends android.support.v4.app.DialogFragment {
-    ctor public MediaRouteChooserDialogFragment();
-    method public android.support.v7.media.MediaRouteSelector getRouteSelector();
-    method public android.support.v7.app.MediaRouteChooserDialog onCreateChooserDialog(android.content.Context, android.os.Bundle);
-    method public void setRouteSelector(android.support.v7.media.MediaRouteSelector);
-  }
-
-  public class MediaRouteControllerDialog extends android.support.v7.app.AlertDialog {
-    ctor public MediaRouteControllerDialog(android.content.Context);
-    ctor public MediaRouteControllerDialog(android.content.Context, int);
-    method public android.view.View getMediaControlView();
-    method public android.support.v4.media.session.MediaSessionCompat.Token getMediaSession();
-    method public android.support.v7.media.MediaRouter.RouteInfo getRoute();
-    method public boolean isVolumeControlEnabled();
-    method public android.view.View onCreateMediaControlView(android.os.Bundle);
-    method public void setVolumeControlEnabled(boolean);
-  }
-
-  public class MediaRouteControllerDialogFragment extends android.support.v4.app.DialogFragment {
-    ctor public MediaRouteControllerDialogFragment();
-    method public android.support.v7.app.MediaRouteControllerDialog onCreateControllerDialog(android.content.Context, android.os.Bundle);
-  }
-
-  public class MediaRouteDialogFactory {
-    ctor public MediaRouteDialogFactory();
-    method public static android.support.v7.app.MediaRouteDialogFactory getDefault();
-    method public android.support.v7.app.MediaRouteChooserDialogFragment onCreateChooserDialogFragment();
-    method public android.support.v7.app.MediaRouteControllerDialogFragment onCreateControllerDialogFragment();
-  }
-
-  public class MediaRouteDiscoveryFragment extends android.support.v4.app.Fragment {
-    ctor public MediaRouteDiscoveryFragment();
-    method public android.support.v7.media.MediaRouter getMediaRouter();
-    method public android.support.v7.media.MediaRouteSelector getRouteSelector();
-    method public android.support.v7.media.MediaRouter.Callback onCreateCallback();
-    method public int onPrepareCallbackFlags();
-    method public void setRouteSelector(android.support.v7.media.MediaRouteSelector);
-  }
-
-}
-
-package android.support.v7.media {
-
-  public final class MediaControlIntent {
-    field public static final java.lang.String ACTION_END_SESSION = "android.media.intent.action.END_SESSION";
-    field public static final java.lang.String ACTION_ENQUEUE = "android.media.intent.action.ENQUEUE";
-    field public static final java.lang.String ACTION_GET_SESSION_STATUS = "android.media.intent.action.GET_SESSION_STATUS";
-    field public static final java.lang.String ACTION_GET_STATUS = "android.media.intent.action.GET_STATUS";
-    field public static final java.lang.String ACTION_PAUSE = "android.media.intent.action.PAUSE";
-    field public static final java.lang.String ACTION_PLAY = "android.media.intent.action.PLAY";
-    field public static final java.lang.String ACTION_REMOVE = "android.media.intent.action.REMOVE";
-    field public static final java.lang.String ACTION_RESUME = "android.media.intent.action.RESUME";
-    field public static final java.lang.String ACTION_SEEK = "android.media.intent.action.SEEK";
-    field public static final java.lang.String ACTION_START_SESSION = "android.media.intent.action.START_SESSION";
-    field public static final java.lang.String ACTION_STOP = "android.media.intent.action.STOP";
-    field public static final java.lang.String CATEGORY_LIVE_AUDIO = "android.media.intent.category.LIVE_AUDIO";
-    field public static final java.lang.String CATEGORY_LIVE_VIDEO = "android.media.intent.category.LIVE_VIDEO";
-    field public static final java.lang.String CATEGORY_REMOTE_PLAYBACK = "android.media.intent.category.REMOTE_PLAYBACK";
-    field public static final int ERROR_INVALID_ITEM_ID = 3; // 0x3
-    field public static final int ERROR_INVALID_SESSION_ID = 2; // 0x2
-    field public static final int ERROR_UNKNOWN = 0; // 0x0
-    field public static final int ERROR_UNSUPPORTED_OPERATION = 1; // 0x1
-    field public static final java.lang.String EXTRA_ERROR_CODE = "android.media.intent.extra.ERROR_CODE";
-    field public static final java.lang.String EXTRA_ITEM_CONTENT_POSITION = "android.media.intent.extra.ITEM_POSITION";
-    field public static final java.lang.String EXTRA_ITEM_HTTP_HEADERS = "android.media.intent.extra.HTTP_HEADERS";
-    field public static final java.lang.String EXTRA_ITEM_ID = "android.media.intent.extra.ITEM_ID";
-    field public static final java.lang.String EXTRA_ITEM_METADATA = "android.media.intent.extra.ITEM_METADATA";
-    field public static final java.lang.String EXTRA_ITEM_STATUS = "android.media.intent.extra.ITEM_STATUS";
-    field public static final java.lang.String EXTRA_ITEM_STATUS_UPDATE_RECEIVER = "android.media.intent.extra.ITEM_STATUS_UPDATE_RECEIVER";
-    field public static final java.lang.String EXTRA_SESSION_ID = "android.media.intent.extra.SESSION_ID";
-    field public static final java.lang.String EXTRA_SESSION_STATUS = "android.media.intent.extra.SESSION_STATUS";
-    field public static final java.lang.String EXTRA_SESSION_STATUS_UPDATE_RECEIVER = "android.media.intent.extra.SESSION_STATUS_UPDATE_RECEIVER";
-  }
-
-  public final class MediaItemMetadata {
-    field public static final java.lang.String KEY_ALBUM_ARTIST = "android.media.metadata.ALBUM_ARTIST";
-    field public static final java.lang.String KEY_ALBUM_TITLE = "android.media.metadata.ALBUM_TITLE";
-    field public static final java.lang.String KEY_ARTIST = "android.media.metadata.ARTIST";
-    field public static final java.lang.String KEY_ARTWORK_URI = "android.media.metadata.ARTWORK_URI";
-    field public static final java.lang.String KEY_AUTHOR = "android.media.metadata.AUTHOR";
-    field public static final java.lang.String KEY_COMPOSER = "android.media.metadata.COMPOSER";
-    field public static final java.lang.String KEY_DISC_NUMBER = "android.media.metadata.DISC_NUMBER";
-    field public static final java.lang.String KEY_DURATION = "android.media.metadata.DURATION";
-    field public static final java.lang.String KEY_TITLE = "android.media.metadata.TITLE";
-    field public static final java.lang.String KEY_TRACK_NUMBER = "android.media.metadata.TRACK_NUMBER";
-    field public static final java.lang.String KEY_YEAR = "android.media.metadata.YEAR";
-  }
-
-  public final class MediaItemStatus {
-    method public android.os.Bundle asBundle();
-    method public static android.support.v7.media.MediaItemStatus fromBundle(android.os.Bundle);
-    method public long getContentDuration();
-    method public long getContentPosition();
-    method public android.os.Bundle getExtras();
-    method public int getPlaybackState();
-    method public long getTimestamp();
-    field public static final java.lang.String EXTRA_HTTP_RESPONSE_HEADERS = "android.media.status.extra.HTTP_RESPONSE_HEADERS";
-    field public static final java.lang.String EXTRA_HTTP_STATUS_CODE = "android.media.status.extra.HTTP_STATUS_CODE";
-    field public static final int PLAYBACK_STATE_BUFFERING = 3; // 0x3
-    field public static final int PLAYBACK_STATE_CANCELED = 5; // 0x5
-    field public static final int PLAYBACK_STATE_ERROR = 7; // 0x7
-    field public static final int PLAYBACK_STATE_FINISHED = 4; // 0x4
-    field public static final int PLAYBACK_STATE_INVALIDATED = 6; // 0x6
-    field public static final int PLAYBACK_STATE_PAUSED = 2; // 0x2
-    field public static final int PLAYBACK_STATE_PENDING = 0; // 0x0
-    field public static final int PLAYBACK_STATE_PLAYING = 1; // 0x1
-  }
-
-  public static final class MediaItemStatus.Builder {
-    ctor public MediaItemStatus.Builder(int);
-    ctor public MediaItemStatus.Builder(android.support.v7.media.MediaItemStatus);
-    method public android.support.v7.media.MediaItemStatus build();
-    method public android.support.v7.media.MediaItemStatus.Builder setContentDuration(long);
-    method public android.support.v7.media.MediaItemStatus.Builder setContentPosition(long);
-    method public android.support.v7.media.MediaItemStatus.Builder setExtras(android.os.Bundle);
-    method public android.support.v7.media.MediaItemStatus.Builder setPlaybackState(int);
-    method public android.support.v7.media.MediaItemStatus.Builder setTimestamp(long);
-  }
-
-  public final class MediaRouteDescriptor {
-    method public android.os.Bundle asBundle();
-    method public boolean canDisconnectAndKeepPlaying();
-    method public static android.support.v7.media.MediaRouteDescriptor fromBundle(android.os.Bundle);
-    method public int getConnectionState();
-    method public java.util.List<android.content.IntentFilter> getControlFilters();
-    method public java.lang.String getDescription();
-    method public int getDeviceType();
-    method public android.os.Bundle getExtras();
-    method public java.util.List<java.lang.String> getGroupMemberIds();
-    method public android.net.Uri getIconUri();
-    method public java.lang.String getId();
-    method public java.lang.String getName();
-    method public int getPlaybackStream();
-    method public int getPlaybackType();
-    method public int getPresentationDisplayId();
-    method public android.content.IntentSender getSettingsActivity();
-    method public int getVolume();
-    method public int getVolumeHandling();
-    method public int getVolumeMax();
-    method public deprecated boolean isConnecting();
-    method public boolean isEnabled();
-    method public boolean isValid();
-  }
-
-  public static final class MediaRouteDescriptor.Builder {
-    ctor public MediaRouteDescriptor.Builder(java.lang.String, java.lang.String);
-    ctor public MediaRouteDescriptor.Builder(android.support.v7.media.MediaRouteDescriptor);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder addControlFilter(android.content.IntentFilter);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder addControlFilters(java.util.Collection<android.content.IntentFilter>);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder addGroupMemberId(java.lang.String);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder addGroupMemberIds(java.util.Collection<java.lang.String>);
-    method public android.support.v7.media.MediaRouteDescriptor build();
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setCanDisconnect(boolean);
-    method public deprecated android.support.v7.media.MediaRouteDescriptor.Builder setConnecting(boolean);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setConnectionState(int);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setDescription(java.lang.String);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setDeviceType(int);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setEnabled(boolean);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setExtras(android.os.Bundle);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setIconUri(android.net.Uri);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setId(java.lang.String);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setName(java.lang.String);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setPlaybackStream(int);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setPlaybackType(int);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setPresentationDisplayId(int);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setSettingsActivity(android.content.IntentSender);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setVolume(int);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setVolumeHandling(int);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setVolumeMax(int);
-  }
-
-  public final class MediaRouteDiscoveryRequest {
-    ctor public MediaRouteDiscoveryRequest(android.support.v7.media.MediaRouteSelector, boolean);
-    method public android.os.Bundle asBundle();
-    method public static android.support.v7.media.MediaRouteDiscoveryRequest fromBundle(android.os.Bundle);
-    method public android.support.v7.media.MediaRouteSelector getSelector();
-    method public boolean isActiveScan();
-    method public boolean isValid();
-  }
-
-  public abstract class MediaRouteProvider {
-    ctor public MediaRouteProvider(android.content.Context);
-    method public final android.content.Context getContext();
-    method public final android.support.v7.media.MediaRouteProviderDescriptor getDescriptor();
-    method public final android.support.v7.media.MediaRouteDiscoveryRequest getDiscoveryRequest();
-    method public final android.os.Handler getHandler();
-    method public final android.support.v7.media.MediaRouteProvider.ProviderMetadata getMetadata();
-    method public android.support.v7.media.MediaRouteProvider.RouteController onCreateRouteController(java.lang.String);
-    method public void onDiscoveryRequestChanged(android.support.v7.media.MediaRouteDiscoveryRequest);
-    method public final void setCallback(android.support.v7.media.MediaRouteProvider.Callback);
-    method public final void setDescriptor(android.support.v7.media.MediaRouteProviderDescriptor);
-    method public final void setDiscoveryRequest(android.support.v7.media.MediaRouteDiscoveryRequest);
-  }
-
-  public static abstract class MediaRouteProvider.Callback {
-    ctor public MediaRouteProvider.Callback();
-    method public void onDescriptorChanged(android.support.v7.media.MediaRouteProvider, android.support.v7.media.MediaRouteProviderDescriptor);
-  }
-
-  public static final class MediaRouteProvider.ProviderMetadata {
-    method public android.content.ComponentName getComponentName();
-    method public java.lang.String getPackageName();
-  }
-
-  public static abstract class MediaRouteProvider.RouteController {
-    ctor public MediaRouteProvider.RouteController();
-    method public boolean onControlRequest(android.content.Intent, android.support.v7.media.MediaRouter.ControlRequestCallback);
-    method public void onRelease();
-    method public void onSelect();
-    method public void onSetVolume(int);
-    method public void onUnselect();
-    method public void onUnselect(int);
-    method public void onUpdateVolume(int);
-  }
-
-  public final class MediaRouteProviderDescriptor {
-    method public android.os.Bundle asBundle();
-    method public static android.support.v7.media.MediaRouteProviderDescriptor fromBundle(android.os.Bundle);
-    method public java.util.List<android.support.v7.media.MediaRouteDescriptor> getRoutes();
-    method public boolean isValid();
-  }
-
-  public static final class MediaRouteProviderDescriptor.Builder {
-    ctor public MediaRouteProviderDescriptor.Builder();
-    ctor public MediaRouteProviderDescriptor.Builder(android.support.v7.media.MediaRouteProviderDescriptor);
-    method public android.support.v7.media.MediaRouteProviderDescriptor.Builder addRoute(android.support.v7.media.MediaRouteDescriptor);
-    method public android.support.v7.media.MediaRouteProviderDescriptor.Builder addRoutes(java.util.Collection<android.support.v7.media.MediaRouteDescriptor>);
-    method public android.support.v7.media.MediaRouteProviderDescriptor build();
-  }
-
-  public abstract class MediaRouteProviderService extends android.app.Service {
-    ctor public MediaRouteProviderService();
-    method public android.support.v7.media.MediaRouteProvider getMediaRouteProvider();
-    method public android.os.IBinder onBind(android.content.Intent);
-    method public abstract android.support.v7.media.MediaRouteProvider onCreateMediaRouteProvider();
-    field public static final java.lang.String SERVICE_INTERFACE = "android.media.MediaRouteProviderService";
-  }
-
-  public final class MediaRouteSelector {
-    method public android.os.Bundle asBundle();
-    method public boolean contains(android.support.v7.media.MediaRouteSelector);
-    method public static android.support.v7.media.MediaRouteSelector fromBundle(android.os.Bundle);
-    method public java.util.List<java.lang.String> getControlCategories();
-    method public boolean hasControlCategory(java.lang.String);
-    method public boolean isEmpty();
-    method public boolean isValid();
-    method public boolean matchesControlFilters(java.util.List<android.content.IntentFilter>);
-    field public static final android.support.v7.media.MediaRouteSelector EMPTY;
-  }
-
-  public static final class MediaRouteSelector.Builder {
-    ctor public MediaRouteSelector.Builder();
-    ctor public MediaRouteSelector.Builder(android.support.v7.media.MediaRouteSelector);
-    method public android.support.v7.media.MediaRouteSelector.Builder addControlCategories(java.util.Collection<java.lang.String>);
-    method public android.support.v7.media.MediaRouteSelector.Builder addControlCategory(java.lang.String);
-    method public android.support.v7.media.MediaRouteSelector.Builder addSelector(android.support.v7.media.MediaRouteSelector);
-    method public android.support.v7.media.MediaRouteSelector build();
-  }
-
-  public final class MediaRouter {
-    method public void addCallback(android.support.v7.media.MediaRouteSelector, android.support.v7.media.MediaRouter.Callback);
-    method public void addCallback(android.support.v7.media.MediaRouteSelector, android.support.v7.media.MediaRouter.Callback, int);
-    method public void addProvider(android.support.v7.media.MediaRouteProvider);
-    method public void addRemoteControlClient(java.lang.Object);
-    method public android.support.v7.media.MediaRouter.RouteInfo getDefaultRoute();
-    method public static android.support.v7.media.MediaRouter getInstance(android.content.Context);
-    method public android.support.v4.media.session.MediaSessionCompat.Token getMediaSessionToken();
-    method public java.util.List<android.support.v7.media.MediaRouter.ProviderInfo> getProviders();
-    method public java.util.List<android.support.v7.media.MediaRouter.RouteInfo> getRoutes();
-    method public android.support.v7.media.MediaRouter.RouteInfo getSelectedRoute();
-    method public boolean isRouteAvailable(android.support.v7.media.MediaRouteSelector, int);
-    method public void removeCallback(android.support.v7.media.MediaRouter.Callback);
-    method public void removeProvider(android.support.v7.media.MediaRouteProvider);
-    method public void removeRemoteControlClient(java.lang.Object);
-    method public void selectRoute(android.support.v7.media.MediaRouter.RouteInfo);
-    method public void setMediaSession(java.lang.Object);
-    method public void setMediaSessionCompat(android.support.v4.media.session.MediaSessionCompat);
-    method public void unselect(int);
-    method public android.support.v7.media.MediaRouter.RouteInfo updateSelectedRoute(android.support.v7.media.MediaRouteSelector);
-    field public static final int AVAILABILITY_FLAG_IGNORE_DEFAULT_ROUTE = 1; // 0x1
-    field public static final int AVAILABILITY_FLAG_REQUIRE_MATCH = 2; // 0x2
-    field public static final int CALLBACK_FLAG_FORCE_DISCOVERY = 8; // 0x8
-    field public static final int CALLBACK_FLAG_PERFORM_ACTIVE_SCAN = 1; // 0x1
-    field public static final int CALLBACK_FLAG_REQUEST_DISCOVERY = 4; // 0x4
-    field public static final int CALLBACK_FLAG_UNFILTERED_EVENTS = 2; // 0x2
-    field public static final int UNSELECT_REASON_DISCONNECTED = 1; // 0x1
-    field public static final int UNSELECT_REASON_ROUTE_CHANGED = 3; // 0x3
-    field public static final int UNSELECT_REASON_STOPPED = 2; // 0x2
-    field public static final int UNSELECT_REASON_UNKNOWN = 0; // 0x0
-  }
-
-  public static abstract class MediaRouter.Callback {
-    ctor public MediaRouter.Callback();
-    method public void onProviderAdded(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.ProviderInfo);
-    method public void onProviderChanged(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.ProviderInfo);
-    method public void onProviderRemoved(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.ProviderInfo);
-    method public void onRouteAdded(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
-    method public void onRouteChanged(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
-    method public void onRoutePresentationDisplayChanged(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
-    method public void onRouteRemoved(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
-    method public void onRouteSelected(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
-    method public void onRouteUnselected(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
-    method public void onRouteVolumeChanged(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
-  }
-
-  public static abstract class MediaRouter.ControlRequestCallback {
-    ctor public MediaRouter.ControlRequestCallback();
-    method public void onError(java.lang.String, android.os.Bundle);
-    method public void onResult(android.os.Bundle);
-  }
-
-  public static final class MediaRouter.ProviderInfo {
-    method public android.content.ComponentName getComponentName();
-    method public java.lang.String getPackageName();
-    method public android.support.v7.media.MediaRouteProvider getProviderInstance();
-    method public java.util.List<android.support.v7.media.MediaRouter.RouteInfo> getRoutes();
-  }
-
-  public static class MediaRouter.RouteGroup extends android.support.v7.media.MediaRouter.RouteInfo {
-    method public android.support.v7.media.MediaRouter.RouteInfo getRouteAt(int);
-    method public int getRouteCount();
-    method public java.util.List<android.support.v7.media.MediaRouter.RouteInfo> getRoutes();
-  }
-
-  public static class MediaRouter.RouteInfo {
-    method public boolean canDisconnect();
-    method public int getConnectionState();
-    method public java.util.List<android.content.IntentFilter> getControlFilters();
-    method public java.lang.String getDescription();
-    method public int getDeviceType();
-    method public android.os.Bundle getExtras();
-    method public android.net.Uri getIconUri();
-    method public java.lang.String getId();
-    method public java.lang.String getName();
-    method public int getPlaybackStream();
-    method public int getPlaybackType();
-    method public android.view.Display getPresentationDisplay();
-    method public android.support.v7.media.MediaRouter.ProviderInfo getProvider();
-    method public android.content.IntentSender getSettingsIntent();
-    method public int getVolume();
-    method public int getVolumeHandling();
-    method public int getVolumeMax();
-    method public boolean isConnecting();
-    method public boolean isDefault();
-    method public boolean isEnabled();
-    method public boolean isSelected();
-    method public boolean matchesSelector(android.support.v7.media.MediaRouteSelector);
-    method public void requestSetVolume(int);
-    method public void requestUpdateVolume(int);
-    method public void select();
-    method public void sendControlRequest(android.content.Intent, android.support.v7.media.MediaRouter.ControlRequestCallback);
-    method public boolean supportsControlAction(java.lang.String, java.lang.String);
-    method public boolean supportsControlCategory(java.lang.String);
-    method public boolean supportsControlRequest(android.content.Intent);
-    field public static final int CONNECTION_STATE_CONNECTED = 2; // 0x2
-    field public static final int CONNECTION_STATE_CONNECTING = 1; // 0x1
-    field public static final int CONNECTION_STATE_DISCONNECTED = 0; // 0x0
-    field public static final int DEVICE_TYPE_SPEAKER = 2; // 0x2
-    field public static final int DEVICE_TYPE_TV = 1; // 0x1
-    field public static final int PLAYBACK_TYPE_LOCAL = 0; // 0x0
-    field public static final int PLAYBACK_TYPE_REMOTE = 1; // 0x1
-    field public static final int PLAYBACK_VOLUME_FIXED = 0; // 0x0
-    field public static final int PLAYBACK_VOLUME_VARIABLE = 1; // 0x1
-  }
-
-  public final class MediaSessionStatus {
-    method public android.os.Bundle asBundle();
-    method public static android.support.v7.media.MediaSessionStatus fromBundle(android.os.Bundle);
-    method public android.os.Bundle getExtras();
-    method public int getSessionState();
-    method public long getTimestamp();
-    method public boolean isQueuePaused();
-    field public static final int SESSION_STATE_ACTIVE = 0; // 0x0
-    field public static final int SESSION_STATE_ENDED = 1; // 0x1
-    field public static final int SESSION_STATE_INVALIDATED = 2; // 0x2
-  }
-
-  public static final class MediaSessionStatus.Builder {
-    ctor public MediaSessionStatus.Builder(int);
-    ctor public MediaSessionStatus.Builder(android.support.v7.media.MediaSessionStatus);
-    method public android.support.v7.media.MediaSessionStatus build();
-    method public android.support.v7.media.MediaSessionStatus.Builder setExtras(android.os.Bundle);
-    method public android.support.v7.media.MediaSessionStatus.Builder setQueuePaused(boolean);
-    method public android.support.v7.media.MediaSessionStatus.Builder setSessionState(int);
-    method public android.support.v7.media.MediaSessionStatus.Builder setTimestamp(long);
-  }
-
-  public class RemotePlaybackClient {
-    ctor public RemotePlaybackClient(android.content.Context, android.support.v7.media.MediaRouter.RouteInfo);
-    method public void endSession(android.os.Bundle, android.support.v7.media.RemotePlaybackClient.SessionActionCallback);
-    method public void enqueue(android.net.Uri, java.lang.String, android.os.Bundle, long, android.os.Bundle, android.support.v7.media.RemotePlaybackClient.ItemActionCallback);
-    method public java.lang.String getSessionId();
-    method public void getSessionStatus(android.os.Bundle, android.support.v7.media.RemotePlaybackClient.SessionActionCallback);
-    method public void getStatus(java.lang.String, android.os.Bundle, android.support.v7.media.RemotePlaybackClient.ItemActionCallback);
-    method public boolean hasSession();
-    method public boolean isQueuingSupported();
-    method public boolean isRemotePlaybackSupported();
-    method public boolean isSessionManagementSupported();
-    method public void pause(android.os.Bundle, android.support.v7.media.RemotePlaybackClient.SessionActionCallback);
-    method public void play(android.net.Uri, java.lang.String, android.os.Bundle, long, android.os.Bundle, android.support.v7.media.RemotePlaybackClient.ItemActionCallback);
-    method public void release();
-    method public void remove(java.lang.String, android.os.Bundle, android.support.v7.media.RemotePlaybackClient.ItemActionCallback);
-    method public void resume(android.os.Bundle, android.support.v7.media.RemotePlaybackClient.SessionActionCallback);
-    method public void seek(java.lang.String, long, android.os.Bundle, android.support.v7.media.RemotePlaybackClient.ItemActionCallback);
-    method public void setSessionId(java.lang.String);
-    method public void setStatusCallback(android.support.v7.media.RemotePlaybackClient.StatusCallback);
-    method public void startSession(android.os.Bundle, android.support.v7.media.RemotePlaybackClient.SessionActionCallback);
-    method public void stop(android.os.Bundle, android.support.v7.media.RemotePlaybackClient.SessionActionCallback);
-  }
-
-  public static abstract class RemotePlaybackClient.ActionCallback {
-    ctor public RemotePlaybackClient.ActionCallback();
-    method public void onError(java.lang.String, int, android.os.Bundle);
-  }
-
-  public static abstract class RemotePlaybackClient.ItemActionCallback extends android.support.v7.media.RemotePlaybackClient.ActionCallback {
-    ctor public RemotePlaybackClient.ItemActionCallback();
-    method public void onResult(android.os.Bundle, java.lang.String, android.support.v7.media.MediaSessionStatus, java.lang.String, android.support.v7.media.MediaItemStatus);
-  }
-
-  public static abstract class RemotePlaybackClient.SessionActionCallback extends android.support.v7.media.RemotePlaybackClient.ActionCallback {
-    ctor public RemotePlaybackClient.SessionActionCallback();
-    method public void onResult(android.os.Bundle, java.lang.String, android.support.v7.media.MediaSessionStatus);
-  }
-
-  public static abstract class RemotePlaybackClient.StatusCallback {
-    ctor public RemotePlaybackClient.StatusCallback();
-    method public void onItemStatusChanged(android.os.Bundle, java.lang.String, android.support.v7.media.MediaSessionStatus, java.lang.String, android.support.v7.media.MediaItemStatus);
-    method public void onSessionChanged(java.lang.String);
-    method public void onSessionStatusChanged(android.os.Bundle, java.lang.String, android.support.v7.media.MediaSessionStatus);
-  }
-
-}
-
diff --git a/v7/mediarouter/api/23.1.1.txt b/v7/mediarouter/api/23.1.1.txt
deleted file mode 100644
index 69fc20e..0000000
--- a/v7/mediarouter/api/23.1.1.txt
+++ /dev/null
@@ -1,694 +0,0 @@
-package android.support.v7.app {
-
-  public abstract class ActionBar {
-    ctor public ActionBar();
-    method public abstract void addOnMenuVisibilityListener(android.support.v7.app.ActionBar.OnMenuVisibilityListener);
-    method public abstract void addTab(android.support.v7.app.ActionBar.Tab);
-    method public abstract void addTab(android.support.v7.app.ActionBar.Tab, boolean);
-    method public abstract void addTab(android.support.v7.app.ActionBar.Tab, int);
-    method public abstract void addTab(android.support.v7.app.ActionBar.Tab, int, boolean);
-    method public boolean collapseActionView();
-    method public void dispatchMenuVisibilityChanged(boolean);
-    method public abstract android.view.View getCustomView();
-    method public abstract int getDisplayOptions();
-    method public float getElevation();
-    method public abstract int getHeight();
-    method public int getHideOffset();
-    method public abstract int getNavigationItemCount();
-    method public abstract int getNavigationMode();
-    method public abstract int getSelectedNavigationIndex();
-    method public abstract android.support.v7.app.ActionBar.Tab getSelectedTab();
-    method public abstract java.lang.CharSequence getSubtitle();
-    method public abstract android.support.v7.app.ActionBar.Tab getTabAt(int);
-    method public abstract int getTabCount();
-    method public android.content.Context getThemedContext();
-    method public abstract java.lang.CharSequence getTitle();
-    method public abstract void hide();
-    method public boolean invalidateOptionsMenu();
-    method public boolean isHideOnContentScrollEnabled();
-    method public abstract boolean isShowing();
-    method public boolean isTitleTruncated();
-    method public abstract android.support.v7.app.ActionBar.Tab newTab();
-    method public void onConfigurationChanged(android.content.res.Configuration);
-    method public boolean onKeyShortcut(int, android.view.KeyEvent);
-    method public boolean onMenuKeyEvent(android.view.KeyEvent);
-    method public boolean openOptionsMenu();
-    method public abstract void removeAllTabs();
-    method public abstract void removeOnMenuVisibilityListener(android.support.v7.app.ActionBar.OnMenuVisibilityListener);
-    method public abstract void removeTab(android.support.v7.app.ActionBar.Tab);
-    method public abstract void removeTabAt(int);
-    method public abstract void selectTab(android.support.v7.app.ActionBar.Tab);
-    method public abstract void setBackgroundDrawable(android.graphics.drawable.Drawable);
-    method public abstract void setCustomView(android.view.View);
-    method public abstract void setCustomView(android.view.View, android.support.v7.app.ActionBar.LayoutParams);
-    method public abstract void setCustomView(int);
-    method public void setDefaultDisplayHomeAsUpEnabled(boolean);
-    method public abstract void setDisplayHomeAsUpEnabled(boolean);
-    method public abstract void setDisplayOptions(int);
-    method public abstract void setDisplayOptions(int, int);
-    method public abstract void setDisplayShowCustomEnabled(boolean);
-    method public abstract void setDisplayShowHomeEnabled(boolean);
-    method public abstract void setDisplayShowTitleEnabled(boolean);
-    method public abstract void setDisplayUseLogoEnabled(boolean);
-    method public void setElevation(float);
-    method public void setHideOffset(int);
-    method public void setHideOnContentScrollEnabled(boolean);
-    method public void setHomeActionContentDescription(java.lang.CharSequence);
-    method public void setHomeActionContentDescription(int);
-    method public void setHomeAsUpIndicator(android.graphics.drawable.Drawable);
-    method public void setHomeAsUpIndicator(int);
-    method public void setHomeButtonEnabled(boolean);
-    method public abstract void setIcon(int);
-    method public abstract void setIcon(android.graphics.drawable.Drawable);
-    method public abstract void setListNavigationCallbacks(android.widget.SpinnerAdapter, android.support.v7.app.ActionBar.OnNavigationListener);
-    method public abstract void setLogo(int);
-    method public abstract void setLogo(android.graphics.drawable.Drawable);
-    method public abstract void setNavigationMode(int);
-    method public abstract void setSelectedNavigationItem(int);
-    method public void setShowHideAnimationEnabled(boolean);
-    method public void setSplitBackgroundDrawable(android.graphics.drawable.Drawable);
-    method public void setStackedBackgroundDrawable(android.graphics.drawable.Drawable);
-    method public abstract void setSubtitle(java.lang.CharSequence);
-    method public abstract void setSubtitle(int);
-    method public abstract void setTitle(java.lang.CharSequence);
-    method public abstract void setTitle(int);
-    method public void setWindowTitle(java.lang.CharSequence);
-    method public abstract void show();
-    method public android.support.v7.view.ActionMode startActionMode(android.support.v7.view.ActionMode.Callback);
-    field public static final int DISPLAY_HOME_AS_UP = 4; // 0x4
-    field public static final int DISPLAY_SHOW_CUSTOM = 16; // 0x10
-    field public static final int DISPLAY_SHOW_HOME = 2; // 0x2
-    field public static final int DISPLAY_SHOW_TITLE = 8; // 0x8
-    field public static final int DISPLAY_USE_LOGO = 1; // 0x1
-    field public static final int NAVIGATION_MODE_LIST = 1; // 0x1
-    field public static final int NAVIGATION_MODE_STANDARD = 0; // 0x0
-    field public static final int NAVIGATION_MODE_TABS = 2; // 0x2
-  }
-
-  public static class ActionBar.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
-    ctor public ActionBar.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public ActionBar.LayoutParams(int, int);
-    ctor public ActionBar.LayoutParams(int, int, int);
-    ctor public ActionBar.LayoutParams(int);
-    ctor public ActionBar.LayoutParams(android.support.v7.app.ActionBar.LayoutParams);
-    ctor public ActionBar.LayoutParams(android.view.ViewGroup.LayoutParams);
-    field public int gravity;
-  }
-
-  public static abstract interface ActionBar.OnMenuVisibilityListener {
-    method public abstract void onMenuVisibilityChanged(boolean);
-  }
-
-  public static abstract interface ActionBar.OnNavigationListener {
-    method public abstract boolean onNavigationItemSelected(int, long);
-  }
-
-  public static abstract class ActionBar.Tab {
-    ctor public ActionBar.Tab();
-    method public abstract java.lang.CharSequence getContentDescription();
-    method public abstract android.view.View getCustomView();
-    method public abstract android.graphics.drawable.Drawable getIcon();
-    method public abstract int getPosition();
-    method public abstract java.lang.Object getTag();
-    method public abstract java.lang.CharSequence getText();
-    method public abstract void select();
-    method public abstract android.support.v7.app.ActionBar.Tab setContentDescription(int);
-    method public abstract android.support.v7.app.ActionBar.Tab setContentDescription(java.lang.CharSequence);
-    method public abstract android.support.v7.app.ActionBar.Tab setCustomView(android.view.View);
-    method public abstract android.support.v7.app.ActionBar.Tab setCustomView(int);
-    method public abstract android.support.v7.app.ActionBar.Tab setIcon(android.graphics.drawable.Drawable);
-    method public abstract android.support.v7.app.ActionBar.Tab setIcon(int);
-    method public abstract android.support.v7.app.ActionBar.Tab setTabListener(android.support.v7.app.ActionBar.TabListener);
-    method public abstract android.support.v7.app.ActionBar.Tab setTag(java.lang.Object);
-    method public abstract android.support.v7.app.ActionBar.Tab setText(java.lang.CharSequence);
-    method public abstract android.support.v7.app.ActionBar.Tab setText(int);
-    field public static final int INVALID_POSITION = -1; // 0xffffffff
-  }
-
-  public static abstract interface ActionBar.TabListener {
-    method public abstract void onTabReselected(android.support.v7.app.ActionBar.Tab, android.support.v4.app.FragmentTransaction);
-    method public abstract void onTabSelected(android.support.v7.app.ActionBar.Tab, android.support.v4.app.FragmentTransaction);
-    method public abstract void onTabUnselected(android.support.v7.app.ActionBar.Tab, android.support.v4.app.FragmentTransaction);
-  }
-
-  public class ActionBarDrawerToggle implements android.support.v4.widget.DrawerLayout.DrawerListener {
-    ctor public ActionBarDrawerToggle(android.app.Activity, android.support.v4.widget.DrawerLayout, int, int);
-    ctor public ActionBarDrawerToggle(android.app.Activity, android.support.v4.widget.DrawerLayout, android.support.v7.widget.Toolbar, int, int);
-    method public android.view.View.OnClickListener getToolbarNavigationClickListener();
-    method public boolean isDrawerIndicatorEnabled();
-    method public void onConfigurationChanged(android.content.res.Configuration);
-    method public void onDrawerClosed(android.view.View);
-    method public void onDrawerOpened(android.view.View);
-    method public void onDrawerSlide(android.view.View, float);
-    method public void onDrawerStateChanged(int);
-    method public boolean onOptionsItemSelected(android.view.MenuItem);
-    method public void setDrawerIndicatorEnabled(boolean);
-    method public void setHomeAsUpIndicator(android.graphics.drawable.Drawable);
-    method public void setHomeAsUpIndicator(int);
-    method public void setToolbarNavigationClickListener(android.view.View.OnClickListener);
-    method public void syncState();
-  }
-
-  public static abstract interface ActionBarDrawerToggle.Delegate {
-    method public abstract android.content.Context getActionBarThemedContext();
-    method public abstract android.graphics.drawable.Drawable getThemeUpIndicator();
-    method public abstract boolean isNavigationVisible();
-    method public abstract void setActionBarDescription(int);
-    method public abstract void setActionBarUpIndicator(android.graphics.drawable.Drawable, int);
-  }
-
-  public class AlertDialog extends android.support.v7.app.AppCompatDialog implements android.content.DialogInterface {
-    ctor protected AlertDialog(android.content.Context);
-    ctor protected AlertDialog(android.content.Context, int);
-    ctor protected AlertDialog(android.content.Context, boolean, android.content.DialogInterface.OnCancelListener);
-    method public android.widget.Button getButton(int);
-    method public android.widget.ListView getListView();
-    method public void setButton(int, java.lang.CharSequence, android.os.Message);
-    method public void setButton(int, java.lang.CharSequence, android.content.DialogInterface.OnClickListener);
-    method public void setCustomTitle(android.view.View);
-    method public void setIcon(int);
-    method public void setIcon(android.graphics.drawable.Drawable);
-    method public void setIconAttribute(int);
-    method public void setMessage(java.lang.CharSequence);
-    method public void setView(android.view.View);
-    method public void setView(android.view.View, int, int, int, int);
-  }
-
-  public abstract interface AppCompatCallback {
-    method public abstract void onSupportActionModeFinished(android.support.v7.view.ActionMode);
-    method public abstract void onSupportActionModeStarted(android.support.v7.view.ActionMode);
-    method public abstract android.support.v7.view.ActionMode onWindowStartingSupportActionMode(android.support.v7.view.ActionMode.Callback);
-  }
-
-  public abstract class AppCompatDelegate {
-    method public abstract void addContentView(android.view.View, android.view.ViewGroup.LayoutParams);
-    method public static android.support.v7.app.AppCompatDelegate create(android.app.Activity, android.support.v7.app.AppCompatCallback);
-    method public static android.support.v7.app.AppCompatDelegate create(android.app.Dialog, android.support.v7.app.AppCompatCallback);
-    method public abstract android.view.View createView(android.view.View, java.lang.String, android.content.Context, android.util.AttributeSet);
-    method public abstract android.support.v7.app.ActionBarDrawerToggle.Delegate getDrawerToggleDelegate();
-    method public abstract android.view.MenuInflater getMenuInflater();
-    method public abstract android.support.v7.app.ActionBar getSupportActionBar();
-    method public abstract boolean hasWindowFeature(int);
-    method public abstract void installViewFactory();
-    method public abstract void invalidateOptionsMenu();
-    method public abstract boolean isHandleNativeActionModesEnabled();
-    method public abstract void onConfigurationChanged(android.content.res.Configuration);
-    method public abstract void onCreate(android.os.Bundle);
-    method public abstract void onDestroy();
-    method public abstract void onPostCreate(android.os.Bundle);
-    method public abstract void onPostResume();
-    method public abstract void onStop();
-    method public abstract boolean requestWindowFeature(int);
-    method public abstract void setContentView(android.view.View);
-    method public abstract void setContentView(int);
-    method public abstract void setContentView(android.view.View, android.view.ViewGroup.LayoutParams);
-    method public abstract void setHandleNativeActionModesEnabled(boolean);
-    method public abstract void setSupportActionBar(android.support.v7.widget.Toolbar);
-    method public abstract void setTitle(java.lang.CharSequence);
-    method public abstract android.support.v7.view.ActionMode startSupportActionMode(android.support.v7.view.ActionMode.Callback);
-    field public static final int FEATURE_ACTION_MODE_OVERLAY = 10; // 0xa
-    field public static final int FEATURE_SUPPORT_ACTION_BAR = 108; // 0x6c
-    field public static final int FEATURE_SUPPORT_ACTION_BAR_OVERLAY = 109; // 0x6d
-  }
-
-  public class AppCompatDialog extends android.app.Dialog implements android.support.v7.app.AppCompatCallback {
-    ctor public AppCompatDialog(android.content.Context);
-    ctor public AppCompatDialog(android.content.Context, int);
-    ctor protected AppCompatDialog(android.content.Context, boolean, android.content.DialogInterface.OnCancelListener);
-    method public android.support.v7.app.AppCompatDelegate getDelegate();
-    method public android.support.v7.app.ActionBar getSupportActionBar();
-    method public void onSupportActionModeFinished(android.support.v7.view.ActionMode);
-    method public void onSupportActionModeStarted(android.support.v7.view.ActionMode);
-    method public android.support.v7.view.ActionMode onWindowStartingSupportActionMode(android.support.v7.view.ActionMode.Callback);
-    method public boolean supportRequestWindowFeature(int);
-  }
-
-  public class MediaRouteActionProvider extends android.support.v4.view.ActionProvider {
-    ctor public MediaRouteActionProvider(android.content.Context);
-    method public android.support.v7.app.MediaRouteDialogFactory getDialogFactory();
-    method public android.support.v7.app.MediaRouteButton getMediaRouteButton();
-    method public android.support.v7.media.MediaRouteSelector getRouteSelector();
-    method public android.view.View onCreateActionView();
-    method public android.support.v7.app.MediaRouteButton onCreateMediaRouteButton();
-    method public void setDialogFactory(android.support.v7.app.MediaRouteDialogFactory);
-    method public void setRouteSelector(android.support.v7.media.MediaRouteSelector);
-  }
-
-  public class MediaRouteButton extends android.view.View {
-    ctor public MediaRouteButton(android.content.Context);
-    ctor public MediaRouteButton(android.content.Context, android.util.AttributeSet);
-    ctor public MediaRouteButton(android.content.Context, android.util.AttributeSet, int);
-    method public android.support.v7.app.MediaRouteDialogFactory getDialogFactory();
-    method public android.support.v7.media.MediaRouteSelector getRouteSelector();
-    method public void onAttachedToWindow();
-    method public void onDetachedFromWindow();
-    method public void setDialogFactory(android.support.v7.app.MediaRouteDialogFactory);
-    method public void setRemoteIndicatorDrawable(android.graphics.drawable.Drawable);
-    method public void setRouteSelector(android.support.v7.media.MediaRouteSelector);
-    method public boolean showDialog();
-  }
-
-  public class MediaRouteChooserDialog extends android.app.Dialog {
-    ctor public MediaRouteChooserDialog(android.content.Context);
-    ctor public MediaRouteChooserDialog(android.content.Context, int);
-    method public android.support.v7.media.MediaRouteSelector getRouteSelector();
-    method public boolean onFilterRoute(android.support.v7.media.MediaRouter.RouteInfo);
-    method public void onFilterRoutes(java.util.List<android.support.v7.media.MediaRouter.RouteInfo>);
-    method public void refreshRoutes();
-    method public void setRouteSelector(android.support.v7.media.MediaRouteSelector);
-  }
-
-  public class MediaRouteChooserDialogFragment extends android.support.v4.app.DialogFragment {
-    ctor public MediaRouteChooserDialogFragment();
-    method public android.support.v7.media.MediaRouteSelector getRouteSelector();
-    method public android.support.v7.app.MediaRouteChooserDialog onCreateChooserDialog(android.content.Context, android.os.Bundle);
-    method public void setRouteSelector(android.support.v7.media.MediaRouteSelector);
-  }
-
-  public class MediaRouteControllerDialog extends android.support.v7.app.AlertDialog {
-    ctor public MediaRouteControllerDialog(android.content.Context);
-    ctor public MediaRouteControllerDialog(android.content.Context, int);
-    method public android.view.View getMediaControlView();
-    method public android.support.v4.media.session.MediaSessionCompat.Token getMediaSession();
-    method public android.support.v7.media.MediaRouter.RouteInfo getRoute();
-    method public boolean isVolumeControlEnabled();
-    method public android.view.View onCreateMediaControlView(android.os.Bundle);
-    method public void setVolumeControlEnabled(boolean);
-  }
-
-  public class MediaRouteControllerDialogFragment extends android.support.v4.app.DialogFragment {
-    ctor public MediaRouteControllerDialogFragment();
-    method public android.support.v7.app.MediaRouteControllerDialog onCreateControllerDialog(android.content.Context, android.os.Bundle);
-  }
-
-  public class MediaRouteDialogFactory {
-    ctor public MediaRouteDialogFactory();
-    method public static android.support.v7.app.MediaRouteDialogFactory getDefault();
-    method public android.support.v7.app.MediaRouteChooserDialogFragment onCreateChooserDialogFragment();
-    method public android.support.v7.app.MediaRouteControllerDialogFragment onCreateControllerDialogFragment();
-  }
-
-  public class MediaRouteDiscoveryFragment extends android.support.v4.app.Fragment {
-    ctor public MediaRouteDiscoveryFragment();
-    method public android.support.v7.media.MediaRouter getMediaRouter();
-    method public android.support.v7.media.MediaRouteSelector getRouteSelector();
-    method public android.support.v7.media.MediaRouter.Callback onCreateCallback();
-    method public int onPrepareCallbackFlags();
-    method public void setRouteSelector(android.support.v7.media.MediaRouteSelector);
-  }
-
-}
-
-package android.support.v7.media {
-
-  public final class MediaControlIntent {
-    field public static final java.lang.String ACTION_END_SESSION = "android.media.intent.action.END_SESSION";
-    field public static final java.lang.String ACTION_ENQUEUE = "android.media.intent.action.ENQUEUE";
-    field public static final java.lang.String ACTION_GET_SESSION_STATUS = "android.media.intent.action.GET_SESSION_STATUS";
-    field public static final java.lang.String ACTION_GET_STATUS = "android.media.intent.action.GET_STATUS";
-    field public static final java.lang.String ACTION_PAUSE = "android.media.intent.action.PAUSE";
-    field public static final java.lang.String ACTION_PLAY = "android.media.intent.action.PLAY";
-    field public static final java.lang.String ACTION_REMOVE = "android.media.intent.action.REMOVE";
-    field public static final java.lang.String ACTION_RESUME = "android.media.intent.action.RESUME";
-    field public static final java.lang.String ACTION_SEEK = "android.media.intent.action.SEEK";
-    field public static final java.lang.String ACTION_START_SESSION = "android.media.intent.action.START_SESSION";
-    field public static final java.lang.String ACTION_STOP = "android.media.intent.action.STOP";
-    field public static final java.lang.String CATEGORY_LIVE_AUDIO = "android.media.intent.category.LIVE_AUDIO";
-    field public static final java.lang.String CATEGORY_LIVE_VIDEO = "android.media.intent.category.LIVE_VIDEO";
-    field public static final java.lang.String CATEGORY_REMOTE_PLAYBACK = "android.media.intent.category.REMOTE_PLAYBACK";
-    field public static final int ERROR_INVALID_ITEM_ID = 3; // 0x3
-    field public static final int ERROR_INVALID_SESSION_ID = 2; // 0x2
-    field public static final int ERROR_UNKNOWN = 0; // 0x0
-    field public static final int ERROR_UNSUPPORTED_OPERATION = 1; // 0x1
-    field public static final java.lang.String EXTRA_ERROR_CODE = "android.media.intent.extra.ERROR_CODE";
-    field public static final java.lang.String EXTRA_ITEM_CONTENT_POSITION = "android.media.intent.extra.ITEM_POSITION";
-    field public static final java.lang.String EXTRA_ITEM_HTTP_HEADERS = "android.media.intent.extra.HTTP_HEADERS";
-    field public static final java.lang.String EXTRA_ITEM_ID = "android.media.intent.extra.ITEM_ID";
-    field public static final java.lang.String EXTRA_ITEM_METADATA = "android.media.intent.extra.ITEM_METADATA";
-    field public static final java.lang.String EXTRA_ITEM_STATUS = "android.media.intent.extra.ITEM_STATUS";
-    field public static final java.lang.String EXTRA_ITEM_STATUS_UPDATE_RECEIVER = "android.media.intent.extra.ITEM_STATUS_UPDATE_RECEIVER";
-    field public static final java.lang.String EXTRA_SESSION_ID = "android.media.intent.extra.SESSION_ID";
-    field public static final java.lang.String EXTRA_SESSION_STATUS = "android.media.intent.extra.SESSION_STATUS";
-    field public static final java.lang.String EXTRA_SESSION_STATUS_UPDATE_RECEIVER = "android.media.intent.extra.SESSION_STATUS_UPDATE_RECEIVER";
-  }
-
-  public final class MediaItemMetadata {
-    field public static final java.lang.String KEY_ALBUM_ARTIST = "android.media.metadata.ALBUM_ARTIST";
-    field public static final java.lang.String KEY_ALBUM_TITLE = "android.media.metadata.ALBUM_TITLE";
-    field public static final java.lang.String KEY_ARTIST = "android.media.metadata.ARTIST";
-    field public static final java.lang.String KEY_ARTWORK_URI = "android.media.metadata.ARTWORK_URI";
-    field public static final java.lang.String KEY_AUTHOR = "android.media.metadata.AUTHOR";
-    field public static final java.lang.String KEY_COMPOSER = "android.media.metadata.COMPOSER";
-    field public static final java.lang.String KEY_DISC_NUMBER = "android.media.metadata.DISC_NUMBER";
-    field public static final java.lang.String KEY_DURATION = "android.media.metadata.DURATION";
-    field public static final java.lang.String KEY_TITLE = "android.media.metadata.TITLE";
-    field public static final java.lang.String KEY_TRACK_NUMBER = "android.media.metadata.TRACK_NUMBER";
-    field public static final java.lang.String KEY_YEAR = "android.media.metadata.YEAR";
-  }
-
-  public final class MediaItemStatus {
-    method public android.os.Bundle asBundle();
-    method public static android.support.v7.media.MediaItemStatus fromBundle(android.os.Bundle);
-    method public long getContentDuration();
-    method public long getContentPosition();
-    method public android.os.Bundle getExtras();
-    method public int getPlaybackState();
-    method public long getTimestamp();
-    field public static final java.lang.String EXTRA_HTTP_RESPONSE_HEADERS = "android.media.status.extra.HTTP_RESPONSE_HEADERS";
-    field public static final java.lang.String EXTRA_HTTP_STATUS_CODE = "android.media.status.extra.HTTP_STATUS_CODE";
-    field public static final int PLAYBACK_STATE_BUFFERING = 3; // 0x3
-    field public static final int PLAYBACK_STATE_CANCELED = 5; // 0x5
-    field public static final int PLAYBACK_STATE_ERROR = 7; // 0x7
-    field public static final int PLAYBACK_STATE_FINISHED = 4; // 0x4
-    field public static final int PLAYBACK_STATE_INVALIDATED = 6; // 0x6
-    field public static final int PLAYBACK_STATE_PAUSED = 2; // 0x2
-    field public static final int PLAYBACK_STATE_PENDING = 0; // 0x0
-    field public static final int PLAYBACK_STATE_PLAYING = 1; // 0x1
-  }
-
-  public static final class MediaItemStatus.Builder {
-    ctor public MediaItemStatus.Builder(int);
-    ctor public MediaItemStatus.Builder(android.support.v7.media.MediaItemStatus);
-    method public android.support.v7.media.MediaItemStatus build();
-    method public android.support.v7.media.MediaItemStatus.Builder setContentDuration(long);
-    method public android.support.v7.media.MediaItemStatus.Builder setContentPosition(long);
-    method public android.support.v7.media.MediaItemStatus.Builder setExtras(android.os.Bundle);
-    method public android.support.v7.media.MediaItemStatus.Builder setPlaybackState(int);
-    method public android.support.v7.media.MediaItemStatus.Builder setTimestamp(long);
-  }
-
-  public final class MediaRouteDescriptor {
-    method public android.os.Bundle asBundle();
-    method public boolean canDisconnectAndKeepPlaying();
-    method public static android.support.v7.media.MediaRouteDescriptor fromBundle(android.os.Bundle);
-    method public int getConnectionState();
-    method public java.util.List<android.content.IntentFilter> getControlFilters();
-    method public java.lang.String getDescription();
-    method public int getDeviceType();
-    method public android.os.Bundle getExtras();
-    method public java.util.List<java.lang.String> getGroupMemberIds();
-    method public android.net.Uri getIconUri();
-    method public java.lang.String getId();
-    method public java.lang.String getName();
-    method public int getPlaybackStream();
-    method public int getPlaybackType();
-    method public int getPresentationDisplayId();
-    method public android.content.IntentSender getSettingsActivity();
-    method public int getVolume();
-    method public int getVolumeHandling();
-    method public int getVolumeMax();
-    method public deprecated boolean isConnecting();
-    method public boolean isEnabled();
-    method public boolean isValid();
-  }
-
-  public static final class MediaRouteDescriptor.Builder {
-    ctor public MediaRouteDescriptor.Builder(java.lang.String, java.lang.String);
-    ctor public MediaRouteDescriptor.Builder(android.support.v7.media.MediaRouteDescriptor);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder addControlFilter(android.content.IntentFilter);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder addControlFilters(java.util.Collection<android.content.IntentFilter>);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder addGroupMemberId(java.lang.String);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder addGroupMemberIds(java.util.Collection<java.lang.String>);
-    method public android.support.v7.media.MediaRouteDescriptor build();
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setCanDisconnect(boolean);
-    method public deprecated android.support.v7.media.MediaRouteDescriptor.Builder setConnecting(boolean);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setConnectionState(int);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setDescription(java.lang.String);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setDeviceType(int);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setEnabled(boolean);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setExtras(android.os.Bundle);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setIconUri(android.net.Uri);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setId(java.lang.String);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setName(java.lang.String);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setPlaybackStream(int);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setPlaybackType(int);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setPresentationDisplayId(int);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setSettingsActivity(android.content.IntentSender);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setVolume(int);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setVolumeHandling(int);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setVolumeMax(int);
-  }
-
-  public final class MediaRouteDiscoveryRequest {
-    ctor public MediaRouteDiscoveryRequest(android.support.v7.media.MediaRouteSelector, boolean);
-    method public android.os.Bundle asBundle();
-    method public static android.support.v7.media.MediaRouteDiscoveryRequest fromBundle(android.os.Bundle);
-    method public android.support.v7.media.MediaRouteSelector getSelector();
-    method public boolean isActiveScan();
-    method public boolean isValid();
-  }
-
-  public abstract class MediaRouteProvider {
-    ctor public MediaRouteProvider(android.content.Context);
-    method public final android.content.Context getContext();
-    method public final android.support.v7.media.MediaRouteProviderDescriptor getDescriptor();
-    method public final android.support.v7.media.MediaRouteDiscoveryRequest getDiscoveryRequest();
-    method public final android.os.Handler getHandler();
-    method public final android.support.v7.media.MediaRouteProvider.ProviderMetadata getMetadata();
-    method public android.support.v7.media.MediaRouteProvider.RouteController onCreateRouteController(java.lang.String);
-    method public void onDiscoveryRequestChanged(android.support.v7.media.MediaRouteDiscoveryRequest);
-    method public final void setCallback(android.support.v7.media.MediaRouteProvider.Callback);
-    method public final void setDescriptor(android.support.v7.media.MediaRouteProviderDescriptor);
-    method public final void setDiscoveryRequest(android.support.v7.media.MediaRouteDiscoveryRequest);
-  }
-
-  public static abstract class MediaRouteProvider.Callback {
-    ctor public MediaRouteProvider.Callback();
-    method public void onDescriptorChanged(android.support.v7.media.MediaRouteProvider, android.support.v7.media.MediaRouteProviderDescriptor);
-  }
-
-  public static final class MediaRouteProvider.ProviderMetadata {
-    method public android.content.ComponentName getComponentName();
-    method public java.lang.String getPackageName();
-  }
-
-  public static abstract class MediaRouteProvider.RouteController {
-    ctor public MediaRouteProvider.RouteController();
-    method public boolean onControlRequest(android.content.Intent, android.support.v7.media.MediaRouter.ControlRequestCallback);
-    method public void onRelease();
-    method public void onSelect();
-    method public void onSetVolume(int);
-    method public void onUnselect();
-    method public void onUnselect(int);
-    method public void onUpdateVolume(int);
-  }
-
-  public final class MediaRouteProviderDescriptor {
-    method public android.os.Bundle asBundle();
-    method public static android.support.v7.media.MediaRouteProviderDescriptor fromBundle(android.os.Bundle);
-    method public java.util.List<android.support.v7.media.MediaRouteDescriptor> getRoutes();
-    method public boolean isValid();
-  }
-
-  public static final class MediaRouteProviderDescriptor.Builder {
-    ctor public MediaRouteProviderDescriptor.Builder();
-    ctor public MediaRouteProviderDescriptor.Builder(android.support.v7.media.MediaRouteProviderDescriptor);
-    method public android.support.v7.media.MediaRouteProviderDescriptor.Builder addRoute(android.support.v7.media.MediaRouteDescriptor);
-    method public android.support.v7.media.MediaRouteProviderDescriptor.Builder addRoutes(java.util.Collection<android.support.v7.media.MediaRouteDescriptor>);
-    method public android.support.v7.media.MediaRouteProviderDescriptor build();
-  }
-
-  public abstract class MediaRouteProviderService extends android.app.Service {
-    ctor public MediaRouteProviderService();
-    method public android.support.v7.media.MediaRouteProvider getMediaRouteProvider();
-    method public android.os.IBinder onBind(android.content.Intent);
-    method public abstract android.support.v7.media.MediaRouteProvider onCreateMediaRouteProvider();
-    field public static final java.lang.String SERVICE_INTERFACE = "android.media.MediaRouteProviderService";
-  }
-
-  public final class MediaRouteSelector {
-    method public android.os.Bundle asBundle();
-    method public boolean contains(android.support.v7.media.MediaRouteSelector);
-    method public static android.support.v7.media.MediaRouteSelector fromBundle(android.os.Bundle);
-    method public java.util.List<java.lang.String> getControlCategories();
-    method public boolean hasControlCategory(java.lang.String);
-    method public boolean isEmpty();
-    method public boolean isValid();
-    method public boolean matchesControlFilters(java.util.List<android.content.IntentFilter>);
-    field public static final android.support.v7.media.MediaRouteSelector EMPTY;
-  }
-
-  public static final class MediaRouteSelector.Builder {
-    ctor public MediaRouteSelector.Builder();
-    ctor public MediaRouteSelector.Builder(android.support.v7.media.MediaRouteSelector);
-    method public android.support.v7.media.MediaRouteSelector.Builder addControlCategories(java.util.Collection<java.lang.String>);
-    method public android.support.v7.media.MediaRouteSelector.Builder addControlCategory(java.lang.String);
-    method public android.support.v7.media.MediaRouteSelector.Builder addSelector(android.support.v7.media.MediaRouteSelector);
-    method public android.support.v7.media.MediaRouteSelector build();
-  }
-
-  public final class MediaRouter {
-    method public void addCallback(android.support.v7.media.MediaRouteSelector, android.support.v7.media.MediaRouter.Callback);
-    method public void addCallback(android.support.v7.media.MediaRouteSelector, android.support.v7.media.MediaRouter.Callback, int);
-    method public void addProvider(android.support.v7.media.MediaRouteProvider);
-    method public void addRemoteControlClient(java.lang.Object);
-    method public android.support.v7.media.MediaRouter.RouteInfo getDefaultRoute();
-    method public static android.support.v7.media.MediaRouter getInstance(android.content.Context);
-    method public android.support.v4.media.session.MediaSessionCompat.Token getMediaSessionToken();
-    method public java.util.List<android.support.v7.media.MediaRouter.ProviderInfo> getProviders();
-    method public java.util.List<android.support.v7.media.MediaRouter.RouteInfo> getRoutes();
-    method public android.support.v7.media.MediaRouter.RouteInfo getSelectedRoute();
-    method public boolean isRouteAvailable(android.support.v7.media.MediaRouteSelector, int);
-    method public void removeCallback(android.support.v7.media.MediaRouter.Callback);
-    method public void removeProvider(android.support.v7.media.MediaRouteProvider);
-    method public void removeRemoteControlClient(java.lang.Object);
-    method public void selectRoute(android.support.v7.media.MediaRouter.RouteInfo);
-    method public void setMediaSession(java.lang.Object);
-    method public void setMediaSessionCompat(android.support.v4.media.session.MediaSessionCompat);
-    method public void unselect(int);
-    method public android.support.v7.media.MediaRouter.RouteInfo updateSelectedRoute(android.support.v7.media.MediaRouteSelector);
-    field public static final int AVAILABILITY_FLAG_IGNORE_DEFAULT_ROUTE = 1; // 0x1
-    field public static final int AVAILABILITY_FLAG_REQUIRE_MATCH = 2; // 0x2
-    field public static final int CALLBACK_FLAG_FORCE_DISCOVERY = 8; // 0x8
-    field public static final int CALLBACK_FLAG_PERFORM_ACTIVE_SCAN = 1; // 0x1
-    field public static final int CALLBACK_FLAG_REQUEST_DISCOVERY = 4; // 0x4
-    field public static final int CALLBACK_FLAG_UNFILTERED_EVENTS = 2; // 0x2
-    field public static final int UNSELECT_REASON_DISCONNECTED = 1; // 0x1
-    field public static final int UNSELECT_REASON_ROUTE_CHANGED = 3; // 0x3
-    field public static final int UNSELECT_REASON_STOPPED = 2; // 0x2
-    field public static final int UNSELECT_REASON_UNKNOWN = 0; // 0x0
-  }
-
-  public static abstract class MediaRouter.Callback {
-    ctor public MediaRouter.Callback();
-    method public void onProviderAdded(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.ProviderInfo);
-    method public void onProviderChanged(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.ProviderInfo);
-    method public void onProviderRemoved(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.ProviderInfo);
-    method public void onRouteAdded(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
-    method public void onRouteChanged(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
-    method public void onRoutePresentationDisplayChanged(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
-    method public void onRouteRemoved(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
-    method public void onRouteSelected(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
-    method public void onRouteUnselected(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
-    method public void onRouteVolumeChanged(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
-  }
-
-  public static abstract class MediaRouter.ControlRequestCallback {
-    ctor public MediaRouter.ControlRequestCallback();
-    method public void onError(java.lang.String, android.os.Bundle);
-    method public void onResult(android.os.Bundle);
-  }
-
-  public static final class MediaRouter.ProviderInfo {
-    method public android.content.ComponentName getComponentName();
-    method public java.lang.String getPackageName();
-    method public android.support.v7.media.MediaRouteProvider getProviderInstance();
-    method public java.util.List<android.support.v7.media.MediaRouter.RouteInfo> getRoutes();
-  }
-
-  public static class MediaRouter.RouteGroup extends android.support.v7.media.MediaRouter.RouteInfo {
-    method public android.support.v7.media.MediaRouter.RouteInfo getRouteAt(int);
-    method public int getRouteCount();
-    method public java.util.List<android.support.v7.media.MediaRouter.RouteInfo> getRoutes();
-  }
-
-  public static class MediaRouter.RouteInfo {
-    method public boolean canDisconnect();
-    method public int getConnectionState();
-    method public java.util.List<android.content.IntentFilter> getControlFilters();
-    method public java.lang.String getDescription();
-    method public int getDeviceType();
-    method public android.os.Bundle getExtras();
-    method public android.net.Uri getIconUri();
-    method public java.lang.String getId();
-    method public java.lang.String getName();
-    method public int getPlaybackStream();
-    method public int getPlaybackType();
-    method public android.view.Display getPresentationDisplay();
-    method public android.support.v7.media.MediaRouter.ProviderInfo getProvider();
-    method public android.content.IntentSender getSettingsIntent();
-    method public int getVolume();
-    method public int getVolumeHandling();
-    method public int getVolumeMax();
-    method public boolean isConnecting();
-    method public boolean isDefault();
-    method public boolean isEnabled();
-    method public boolean isSelected();
-    method public boolean matchesSelector(android.support.v7.media.MediaRouteSelector);
-    method public void requestSetVolume(int);
-    method public void requestUpdateVolume(int);
-    method public void select();
-    method public void sendControlRequest(android.content.Intent, android.support.v7.media.MediaRouter.ControlRequestCallback);
-    method public boolean supportsControlAction(java.lang.String, java.lang.String);
-    method public boolean supportsControlCategory(java.lang.String);
-    method public boolean supportsControlRequest(android.content.Intent);
-    field public static final int CONNECTION_STATE_CONNECTED = 2; // 0x2
-    field public static final int CONNECTION_STATE_CONNECTING = 1; // 0x1
-    field public static final int CONNECTION_STATE_DISCONNECTED = 0; // 0x0
-    field public static final int DEVICE_TYPE_SPEAKER = 2; // 0x2
-    field public static final int DEVICE_TYPE_TV = 1; // 0x1
-    field public static final int PLAYBACK_TYPE_LOCAL = 0; // 0x0
-    field public static final int PLAYBACK_TYPE_REMOTE = 1; // 0x1
-    field public static final int PLAYBACK_VOLUME_FIXED = 0; // 0x0
-    field public static final int PLAYBACK_VOLUME_VARIABLE = 1; // 0x1
-  }
-
-  public final class MediaSessionStatus {
-    method public android.os.Bundle asBundle();
-    method public static android.support.v7.media.MediaSessionStatus fromBundle(android.os.Bundle);
-    method public android.os.Bundle getExtras();
-    method public int getSessionState();
-    method public long getTimestamp();
-    method public boolean isQueuePaused();
-    field public static final int SESSION_STATE_ACTIVE = 0; // 0x0
-    field public static final int SESSION_STATE_ENDED = 1; // 0x1
-    field public static final int SESSION_STATE_INVALIDATED = 2; // 0x2
-  }
-
-  public static final class MediaSessionStatus.Builder {
-    ctor public MediaSessionStatus.Builder(int);
-    ctor public MediaSessionStatus.Builder(android.support.v7.media.MediaSessionStatus);
-    method public android.support.v7.media.MediaSessionStatus build();
-    method public android.support.v7.media.MediaSessionStatus.Builder setExtras(android.os.Bundle);
-    method public android.support.v7.media.MediaSessionStatus.Builder setQueuePaused(boolean);
-    method public android.support.v7.media.MediaSessionStatus.Builder setSessionState(int);
-    method public android.support.v7.media.MediaSessionStatus.Builder setTimestamp(long);
-  }
-
-  public class RemotePlaybackClient {
-    ctor public RemotePlaybackClient(android.content.Context, android.support.v7.media.MediaRouter.RouteInfo);
-    method public void endSession(android.os.Bundle, android.support.v7.media.RemotePlaybackClient.SessionActionCallback);
-    method public void enqueue(android.net.Uri, java.lang.String, android.os.Bundle, long, android.os.Bundle, android.support.v7.media.RemotePlaybackClient.ItemActionCallback);
-    method public java.lang.String getSessionId();
-    method public void getSessionStatus(android.os.Bundle, android.support.v7.media.RemotePlaybackClient.SessionActionCallback);
-    method public void getStatus(java.lang.String, android.os.Bundle, android.support.v7.media.RemotePlaybackClient.ItemActionCallback);
-    method public boolean hasSession();
-    method public boolean isQueuingSupported();
-    method public boolean isRemotePlaybackSupported();
-    method public boolean isSessionManagementSupported();
-    method public void pause(android.os.Bundle, android.support.v7.media.RemotePlaybackClient.SessionActionCallback);
-    method public void play(android.net.Uri, java.lang.String, android.os.Bundle, long, android.os.Bundle, android.support.v7.media.RemotePlaybackClient.ItemActionCallback);
-    method public void release();
-    method public void remove(java.lang.String, android.os.Bundle, android.support.v7.media.RemotePlaybackClient.ItemActionCallback);
-    method public void resume(android.os.Bundle, android.support.v7.media.RemotePlaybackClient.SessionActionCallback);
-    method public void seek(java.lang.String, long, android.os.Bundle, android.support.v7.media.RemotePlaybackClient.ItemActionCallback);
-    method public void setSessionId(java.lang.String);
-    method public void setStatusCallback(android.support.v7.media.RemotePlaybackClient.StatusCallback);
-    method public void startSession(android.os.Bundle, android.support.v7.media.RemotePlaybackClient.SessionActionCallback);
-    method public void stop(android.os.Bundle, android.support.v7.media.RemotePlaybackClient.SessionActionCallback);
-  }
-
-  public static abstract class RemotePlaybackClient.ActionCallback {
-    ctor public RemotePlaybackClient.ActionCallback();
-    method public void onError(java.lang.String, int, android.os.Bundle);
-  }
-
-  public static abstract class RemotePlaybackClient.ItemActionCallback extends android.support.v7.media.RemotePlaybackClient.ActionCallback {
-    ctor public RemotePlaybackClient.ItemActionCallback();
-    method public void onResult(android.os.Bundle, java.lang.String, android.support.v7.media.MediaSessionStatus, java.lang.String, android.support.v7.media.MediaItemStatus);
-  }
-
-  public static abstract class RemotePlaybackClient.SessionActionCallback extends android.support.v7.media.RemotePlaybackClient.ActionCallback {
-    ctor public RemotePlaybackClient.SessionActionCallback();
-    method public void onResult(android.os.Bundle, java.lang.String, android.support.v7.media.MediaSessionStatus);
-  }
-
-  public static abstract class RemotePlaybackClient.StatusCallback {
-    ctor public RemotePlaybackClient.StatusCallback();
-    method public void onItemStatusChanged(android.os.Bundle, java.lang.String, android.support.v7.media.MediaSessionStatus, java.lang.String, android.support.v7.media.MediaItemStatus);
-    method public void onSessionChanged(java.lang.String);
-    method public void onSessionStatusChanged(android.os.Bundle, java.lang.String, android.support.v7.media.MediaSessionStatus);
-  }
-
-}
-
diff --git a/v7/mediarouter/api/current.txt b/v7/mediarouter/api/current.txt
deleted file mode 100644
index f8a6770..0000000
--- a/v7/mediarouter/api/current.txt
+++ /dev/null
@@ -1,741 +0,0 @@
-package android.support.v7.app {
-
-  public abstract class ActionBar {
-    ctor public ActionBar();
-    method public abstract void addOnMenuVisibilityListener(android.support.v7.app.ActionBar.OnMenuVisibilityListener);
-    method public abstract deprecated void addTab(android.support.v7.app.ActionBar.Tab);
-    method public abstract deprecated void addTab(android.support.v7.app.ActionBar.Tab, boolean);
-    method public abstract deprecated void addTab(android.support.v7.app.ActionBar.Tab, int);
-    method public abstract deprecated void addTab(android.support.v7.app.ActionBar.Tab, int, boolean);
-    method public abstract android.view.View getCustomView();
-    method public abstract int getDisplayOptions();
-    method public float getElevation();
-    method public abstract int getHeight();
-    method public int getHideOffset();
-    method public abstract deprecated int getNavigationItemCount();
-    method public abstract deprecated int getNavigationMode();
-    method public abstract deprecated int getSelectedNavigationIndex();
-    method public abstract deprecated android.support.v7.app.ActionBar.Tab getSelectedTab();
-    method public abstract java.lang.CharSequence getSubtitle();
-    method public abstract deprecated android.support.v7.app.ActionBar.Tab getTabAt(int);
-    method public abstract deprecated int getTabCount();
-    method public android.content.Context getThemedContext();
-    method public abstract java.lang.CharSequence getTitle();
-    method public abstract void hide();
-    method public boolean isHideOnContentScrollEnabled();
-    method public abstract boolean isShowing();
-    method public abstract deprecated android.support.v7.app.ActionBar.Tab newTab();
-    method public abstract deprecated void removeAllTabs();
-    method public abstract void removeOnMenuVisibilityListener(android.support.v7.app.ActionBar.OnMenuVisibilityListener);
-    method public abstract deprecated void removeTab(android.support.v7.app.ActionBar.Tab);
-    method public abstract deprecated void removeTabAt(int);
-    method public abstract deprecated void selectTab(android.support.v7.app.ActionBar.Tab);
-    method public abstract void setBackgroundDrawable(android.graphics.drawable.Drawable);
-    method public abstract void setCustomView(android.view.View);
-    method public abstract void setCustomView(android.view.View, android.support.v7.app.ActionBar.LayoutParams);
-    method public abstract void setCustomView(int);
-    method public abstract void setDisplayHomeAsUpEnabled(boolean);
-    method public abstract void setDisplayOptions(int);
-    method public abstract void setDisplayOptions(int, int);
-    method public abstract void setDisplayShowCustomEnabled(boolean);
-    method public abstract void setDisplayShowHomeEnabled(boolean);
-    method public abstract void setDisplayShowTitleEnabled(boolean);
-    method public abstract void setDisplayUseLogoEnabled(boolean);
-    method public void setElevation(float);
-    method public void setHideOffset(int);
-    method public void setHideOnContentScrollEnabled(boolean);
-    method public void setHomeActionContentDescription(java.lang.CharSequence);
-    method public void setHomeActionContentDescription(int);
-    method public void setHomeAsUpIndicator(android.graphics.drawable.Drawable);
-    method public void setHomeAsUpIndicator(int);
-    method public void setHomeButtonEnabled(boolean);
-    method public abstract void setIcon(int);
-    method public abstract void setIcon(android.graphics.drawable.Drawable);
-    method public abstract deprecated void setListNavigationCallbacks(android.widget.SpinnerAdapter, android.support.v7.app.ActionBar.OnNavigationListener);
-    method public abstract void setLogo(int);
-    method public abstract void setLogo(android.graphics.drawable.Drawable);
-    method public abstract deprecated void setNavigationMode(int);
-    method public abstract deprecated void setSelectedNavigationItem(int);
-    method public void setSplitBackgroundDrawable(android.graphics.drawable.Drawable);
-    method public void setStackedBackgroundDrawable(android.graphics.drawable.Drawable);
-    method public abstract void setSubtitle(java.lang.CharSequence);
-    method public abstract void setSubtitle(int);
-    method public abstract void setTitle(java.lang.CharSequence);
-    method public abstract void setTitle(int);
-    method public abstract void show();
-    field public static final int DISPLAY_HOME_AS_UP = 4; // 0x4
-    field public static final int DISPLAY_SHOW_CUSTOM = 16; // 0x10
-    field public static final int DISPLAY_SHOW_HOME = 2; // 0x2
-    field public static final int DISPLAY_SHOW_TITLE = 8; // 0x8
-    field public static final int DISPLAY_USE_LOGO = 1; // 0x1
-    field public static final deprecated int NAVIGATION_MODE_LIST = 1; // 0x1
-    field public static final deprecated int NAVIGATION_MODE_STANDARD = 0; // 0x0
-    field public static final deprecated int NAVIGATION_MODE_TABS = 2; // 0x2
-  }
-
-  public static class ActionBar.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
-    ctor public ActionBar.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public ActionBar.LayoutParams(int, int);
-    ctor public ActionBar.LayoutParams(int, int, int);
-    ctor public ActionBar.LayoutParams(int);
-    ctor public ActionBar.LayoutParams(android.support.v7.app.ActionBar.LayoutParams);
-    ctor public ActionBar.LayoutParams(android.view.ViewGroup.LayoutParams);
-    field public int gravity;
-  }
-
-  public static abstract interface ActionBar.OnMenuVisibilityListener {
-    method public abstract void onMenuVisibilityChanged(boolean);
-  }
-
-  public static abstract deprecated interface ActionBar.OnNavigationListener {
-    method public abstract boolean onNavigationItemSelected(int, long);
-  }
-
-  public static abstract deprecated class ActionBar.Tab {
-    ctor public ActionBar.Tab();
-    method public abstract java.lang.CharSequence getContentDescription();
-    method public abstract android.view.View getCustomView();
-    method public abstract android.graphics.drawable.Drawable getIcon();
-    method public abstract int getPosition();
-    method public abstract java.lang.Object getTag();
-    method public abstract java.lang.CharSequence getText();
-    method public abstract void select();
-    method public abstract android.support.v7.app.ActionBar.Tab setContentDescription(int);
-    method public abstract android.support.v7.app.ActionBar.Tab setContentDescription(java.lang.CharSequence);
-    method public abstract android.support.v7.app.ActionBar.Tab setCustomView(android.view.View);
-    method public abstract android.support.v7.app.ActionBar.Tab setCustomView(int);
-    method public abstract android.support.v7.app.ActionBar.Tab setIcon(android.graphics.drawable.Drawable);
-    method public abstract android.support.v7.app.ActionBar.Tab setIcon(int);
-    method public abstract android.support.v7.app.ActionBar.Tab setTabListener(android.support.v7.app.ActionBar.TabListener);
-    method public abstract android.support.v7.app.ActionBar.Tab setTag(java.lang.Object);
-    method public abstract android.support.v7.app.ActionBar.Tab setText(java.lang.CharSequence);
-    method public abstract android.support.v7.app.ActionBar.Tab setText(int);
-    field public static final int INVALID_POSITION = -1; // 0xffffffff
-  }
-
-  public static abstract deprecated interface ActionBar.TabListener {
-    method public abstract void onTabReselected(android.support.v7.app.ActionBar.Tab, android.support.v4.app.FragmentTransaction);
-    method public abstract void onTabSelected(android.support.v7.app.ActionBar.Tab, android.support.v4.app.FragmentTransaction);
-    method public abstract void onTabUnselected(android.support.v7.app.ActionBar.Tab, android.support.v4.app.FragmentTransaction);
-  }
-
-  public class ActionBarDrawerToggle implements android.support.v4.widget.DrawerLayout.DrawerListener {
-    ctor public ActionBarDrawerToggle(android.app.Activity, android.support.v4.widget.DrawerLayout, int, int);
-    ctor public ActionBarDrawerToggle(android.app.Activity, android.support.v4.widget.DrawerLayout, android.support.v7.widget.Toolbar, int, int);
-    method public android.view.View.OnClickListener getToolbarNavigationClickListener();
-    method public boolean isDrawerIndicatorEnabled();
-    method public void onConfigurationChanged(android.content.res.Configuration);
-    method public void onDrawerClosed(android.view.View);
-    method public void onDrawerOpened(android.view.View);
-    method public void onDrawerSlide(android.view.View, float);
-    method public void onDrawerStateChanged(int);
-    method public boolean onOptionsItemSelected(android.view.MenuItem);
-    method public void setDrawerIndicatorEnabled(boolean);
-    method public void setHomeAsUpIndicator(android.graphics.drawable.Drawable);
-    method public void setHomeAsUpIndicator(int);
-    method public void setToolbarNavigationClickListener(android.view.View.OnClickListener);
-    method public void syncState();
-  }
-
-  public static abstract interface ActionBarDrawerToggle.Delegate {
-    method public abstract android.content.Context getActionBarThemedContext();
-    method public abstract android.graphics.drawable.Drawable getThemeUpIndicator();
-    method public abstract boolean isNavigationVisible();
-    method public abstract void setActionBarDescription(int);
-    method public abstract void setActionBarUpIndicator(android.graphics.drawable.Drawable, int);
-  }
-
-  public static abstract interface ActionBarDrawerToggle.DelegateProvider {
-    method public abstract android.support.v7.app.ActionBarDrawerToggle.Delegate getDrawerToggleDelegate();
-  }
-
-  public class AlertDialog extends android.support.v7.app.AppCompatDialog implements android.content.DialogInterface {
-    ctor protected AlertDialog(android.content.Context);
-    ctor protected AlertDialog(android.content.Context, int);
-    ctor protected AlertDialog(android.content.Context, boolean, android.content.DialogInterface.OnCancelListener);
-    method public android.widget.Button getButton(int);
-    method public android.widget.ListView getListView();
-    method public void setButton(int, java.lang.CharSequence, android.os.Message);
-    method public void setButton(int, java.lang.CharSequence, android.content.DialogInterface.OnClickListener);
-    method public void setCustomTitle(android.view.View);
-    method public void setIcon(int);
-    method public void setIcon(android.graphics.drawable.Drawable);
-    method public void setIconAttribute(int);
-    method public void setMessage(java.lang.CharSequence);
-    method public void setView(android.view.View);
-    method public void setView(android.view.View, int, int, int, int);
-  }
-
-  public static class AlertDialog.Builder {
-    ctor public AlertDialog.Builder(android.content.Context);
-    ctor public AlertDialog.Builder(android.content.Context, int);
-    method public android.support.v7.app.AlertDialog create();
-    method public android.content.Context getContext();
-    method public android.support.v7.app.AlertDialog.Builder setAdapter(android.widget.ListAdapter, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setCancelable(boolean);
-    method public android.support.v7.app.AlertDialog.Builder setCursor(android.database.Cursor, android.content.DialogInterface.OnClickListener, java.lang.String);
-    method public android.support.v7.app.AlertDialog.Builder setCustomTitle(android.view.View);
-    method public android.support.v7.app.AlertDialog.Builder setIcon(int);
-    method public android.support.v7.app.AlertDialog.Builder setIcon(android.graphics.drawable.Drawable);
-    method public android.support.v7.app.AlertDialog.Builder setIconAttribute(int);
-    method public deprecated android.support.v7.app.AlertDialog.Builder setInverseBackgroundForced(boolean);
-    method public android.support.v7.app.AlertDialog.Builder setItems(int, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setItems(java.lang.CharSequence[], android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setMessage(int);
-    method public android.support.v7.app.AlertDialog.Builder setMessage(java.lang.CharSequence);
-    method public android.support.v7.app.AlertDialog.Builder setMultiChoiceItems(int, boolean[], android.content.DialogInterface.OnMultiChoiceClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setMultiChoiceItems(java.lang.CharSequence[], boolean[], android.content.DialogInterface.OnMultiChoiceClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setMultiChoiceItems(android.database.Cursor, java.lang.String, java.lang.String, android.content.DialogInterface.OnMultiChoiceClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setNegativeButton(int, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setNegativeButton(java.lang.CharSequence, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setNeutralButton(int, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setNeutralButton(java.lang.CharSequence, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setOnCancelListener(android.content.DialogInterface.OnCancelListener);
-    method public android.support.v7.app.AlertDialog.Builder setOnDismissListener(android.content.DialogInterface.OnDismissListener);
-    method public android.support.v7.app.AlertDialog.Builder setOnItemSelectedListener(android.widget.AdapterView.OnItemSelectedListener);
-    method public android.support.v7.app.AlertDialog.Builder setOnKeyListener(android.content.DialogInterface.OnKeyListener);
-    method public android.support.v7.app.AlertDialog.Builder setPositiveButton(int, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setPositiveButton(java.lang.CharSequence, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setSingleChoiceItems(int, int, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setSingleChoiceItems(android.database.Cursor, int, java.lang.String, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setSingleChoiceItems(java.lang.CharSequence[], int, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setSingleChoiceItems(android.widget.ListAdapter, int, android.content.DialogInterface.OnClickListener);
-    method public android.support.v7.app.AlertDialog.Builder setTitle(int);
-    method public android.support.v7.app.AlertDialog.Builder setTitle(java.lang.CharSequence);
-    method public android.support.v7.app.AlertDialog.Builder setView(int);
-    method public android.support.v7.app.AlertDialog.Builder setView(android.view.View);
-    method public android.support.v7.app.AlertDialog show();
-  }
-
-  public abstract interface AppCompatCallback {
-    method public abstract void onSupportActionModeFinished(android.support.v7.view.ActionMode);
-    method public abstract void onSupportActionModeStarted(android.support.v7.view.ActionMode);
-    method public abstract android.support.v7.view.ActionMode onWindowStartingSupportActionMode(android.support.v7.view.ActionMode.Callback);
-  }
-
-  public abstract class AppCompatDelegate {
-    method public abstract void addContentView(android.view.View, android.view.ViewGroup.LayoutParams);
-    method public abstract boolean applyDayNight();
-    method public static android.support.v7.app.AppCompatDelegate create(android.app.Activity, android.support.v7.app.AppCompatCallback);
-    method public static android.support.v7.app.AppCompatDelegate create(android.app.Dialog, android.support.v7.app.AppCompatCallback);
-    method public abstract android.view.View createView(android.view.View, java.lang.String, android.content.Context, android.util.AttributeSet);
-    method public abstract android.view.View findViewById(int);
-    method public static int getDefaultNightMode();
-    method public abstract android.support.v7.app.ActionBarDrawerToggle.Delegate getDrawerToggleDelegate();
-    method public abstract android.view.MenuInflater getMenuInflater();
-    method public abstract android.support.v7.app.ActionBar getSupportActionBar();
-    method public abstract boolean hasWindowFeature(int);
-    method public abstract void installViewFactory();
-    method public abstract void invalidateOptionsMenu();
-    method public static boolean isCompatVectorFromResourcesEnabled();
-    method public abstract boolean isHandleNativeActionModesEnabled();
-    method public abstract void onConfigurationChanged(android.content.res.Configuration);
-    method public abstract void onCreate(android.os.Bundle);
-    method public abstract void onDestroy();
-    method public abstract void onPostCreate(android.os.Bundle);
-    method public abstract void onPostResume();
-    method public abstract void onSaveInstanceState(android.os.Bundle);
-    method public abstract void onStop();
-    method public abstract boolean requestWindowFeature(int);
-    method public static void setCompatVectorFromResourcesEnabled(boolean);
-    method public abstract void setContentView(android.view.View);
-    method public abstract void setContentView(int);
-    method public abstract void setContentView(android.view.View, android.view.ViewGroup.LayoutParams);
-    method public static void setDefaultNightMode(int);
-    method public abstract void setHandleNativeActionModesEnabled(boolean);
-    method public abstract void setLocalNightMode(int);
-    method public abstract void setSupportActionBar(android.support.v7.widget.Toolbar);
-    method public abstract void setTitle(java.lang.CharSequence);
-    method public abstract android.support.v7.view.ActionMode startSupportActionMode(android.support.v7.view.ActionMode.Callback);
-    field public static final int FEATURE_ACTION_MODE_OVERLAY = 10; // 0xa
-    field public static final int FEATURE_SUPPORT_ACTION_BAR = 108; // 0x6c
-    field public static final int FEATURE_SUPPORT_ACTION_BAR_OVERLAY = 109; // 0x6d
-    field public static final int MODE_NIGHT_AUTO = 0; // 0x0
-    field public static final int MODE_NIGHT_FOLLOW_SYSTEM = -1; // 0xffffffff
-    field public static final int MODE_NIGHT_NO = 1; // 0x1
-    field public static final int MODE_NIGHT_YES = 2; // 0x2
-  }
-
-  public class AppCompatDialog extends android.app.Dialog implements android.support.v7.app.AppCompatCallback {
-    ctor public AppCompatDialog(android.content.Context);
-    ctor public AppCompatDialog(android.content.Context, int);
-    ctor protected AppCompatDialog(android.content.Context, boolean, android.content.DialogInterface.OnCancelListener);
-    method public android.support.v7.app.AppCompatDelegate getDelegate();
-    method public android.support.v7.app.ActionBar getSupportActionBar();
-    method public void onSupportActionModeFinished(android.support.v7.view.ActionMode);
-    method public void onSupportActionModeStarted(android.support.v7.view.ActionMode);
-    method public android.support.v7.view.ActionMode onWindowStartingSupportActionMode(android.support.v7.view.ActionMode.Callback);
-    method public boolean supportRequestWindowFeature(int);
-  }
-
-  public class MediaRouteActionProvider extends android.support.v4.view.ActionProvider {
-    ctor public MediaRouteActionProvider(android.content.Context);
-    method public android.support.v7.app.MediaRouteDialogFactory getDialogFactory();
-    method public android.support.v7.app.MediaRouteButton getMediaRouteButton();
-    method public android.support.v7.media.MediaRouteSelector getRouteSelector();
-    method public android.view.View onCreateActionView();
-    method public android.support.v7.app.MediaRouteButton onCreateMediaRouteButton();
-    method public void setDialogFactory(android.support.v7.app.MediaRouteDialogFactory);
-    method public void setRouteSelector(android.support.v7.media.MediaRouteSelector);
-  }
-
-  public class MediaRouteButton extends android.view.View {
-    ctor public MediaRouteButton(android.content.Context);
-    ctor public MediaRouteButton(android.content.Context, android.util.AttributeSet);
-    ctor public MediaRouteButton(android.content.Context, android.util.AttributeSet, int);
-    method public android.support.v7.app.MediaRouteDialogFactory getDialogFactory();
-    method public android.support.v7.media.MediaRouteSelector getRouteSelector();
-    method public void onAttachedToWindow();
-    method public void onDetachedFromWindow();
-    method public void setDialogFactory(android.support.v7.app.MediaRouteDialogFactory);
-    method public void setRemoteIndicatorDrawable(android.graphics.drawable.Drawable);
-    method public void setRouteSelector(android.support.v7.media.MediaRouteSelector);
-    method public boolean showDialog();
-  }
-
-  public class MediaRouteChooserDialog extends android.app.Dialog {
-    ctor public MediaRouteChooserDialog(android.content.Context);
-    ctor public MediaRouteChooserDialog(android.content.Context, int);
-    method public android.support.v7.media.MediaRouteSelector getRouteSelector();
-    method public boolean onFilterRoute(android.support.v7.media.MediaRouter.RouteInfo);
-    method public void onFilterRoutes(java.util.List<android.support.v7.media.MediaRouter.RouteInfo>);
-    method public void refreshRoutes();
-    method public void setRouteSelector(android.support.v7.media.MediaRouteSelector);
-  }
-
-  public class MediaRouteChooserDialogFragment extends android.support.v4.app.DialogFragment {
-    ctor public MediaRouteChooserDialogFragment();
-    method public android.support.v7.media.MediaRouteSelector getRouteSelector();
-    method public android.support.v7.app.MediaRouteChooserDialog onCreateChooserDialog(android.content.Context, android.os.Bundle);
-    method public void setRouteSelector(android.support.v7.media.MediaRouteSelector);
-  }
-
-  public class MediaRouteControllerDialog extends android.support.v7.app.AlertDialog {
-    ctor public MediaRouteControllerDialog(android.content.Context);
-    ctor public MediaRouteControllerDialog(android.content.Context, int);
-    method public android.view.View getMediaControlView();
-    method public android.support.v4.media.session.MediaSessionCompat.Token getMediaSession();
-    method public android.support.v7.media.MediaRouter.RouteInfo getRoute();
-    method public boolean isVolumeControlEnabled();
-    method public android.view.View onCreateMediaControlView(android.os.Bundle);
-    method public void setVolumeControlEnabled(boolean);
-  }
-
-  public class MediaRouteControllerDialogFragment extends android.support.v4.app.DialogFragment {
-    ctor public MediaRouteControllerDialogFragment();
-    method public android.support.v7.app.MediaRouteControllerDialog onCreateControllerDialog(android.content.Context, android.os.Bundle);
-  }
-
-  public class MediaRouteDialogFactory {
-    ctor public MediaRouteDialogFactory();
-    method public static android.support.v7.app.MediaRouteDialogFactory getDefault();
-    method public android.support.v7.app.MediaRouteChooserDialogFragment onCreateChooserDialogFragment();
-    method public android.support.v7.app.MediaRouteControllerDialogFragment onCreateControllerDialogFragment();
-  }
-
-  public class MediaRouteDiscoveryFragment extends android.support.v4.app.Fragment {
-    ctor public MediaRouteDiscoveryFragment();
-    method public android.support.v7.media.MediaRouter getMediaRouter();
-    method public android.support.v7.media.MediaRouteSelector getRouteSelector();
-    method public android.support.v7.media.MediaRouter.Callback onCreateCallback();
-    method public int onPrepareCallbackFlags();
-    method public void setRouteSelector(android.support.v7.media.MediaRouteSelector);
-  }
-
-}
-
-package android.support.v7.media {
-
-  public final class MediaControlIntent {
-    field public static final java.lang.String ACTION_END_SESSION = "android.media.intent.action.END_SESSION";
-    field public static final java.lang.String ACTION_ENQUEUE = "android.media.intent.action.ENQUEUE";
-    field public static final java.lang.String ACTION_GET_SESSION_STATUS = "android.media.intent.action.GET_SESSION_STATUS";
-    field public static final java.lang.String ACTION_GET_STATUS = "android.media.intent.action.GET_STATUS";
-    field public static final java.lang.String ACTION_PAUSE = "android.media.intent.action.PAUSE";
-    field public static final java.lang.String ACTION_PLAY = "android.media.intent.action.PLAY";
-    field public static final java.lang.String ACTION_REMOVE = "android.media.intent.action.REMOVE";
-    field public static final java.lang.String ACTION_RESUME = "android.media.intent.action.RESUME";
-    field public static final java.lang.String ACTION_SEEK = "android.media.intent.action.SEEK";
-    field public static final java.lang.String ACTION_SEND_MESSAGE = "android.media.intent.action.SEND_MESSAGE";
-    field public static final java.lang.String ACTION_START_SESSION = "android.media.intent.action.START_SESSION";
-    field public static final java.lang.String ACTION_STOP = "android.media.intent.action.STOP";
-    field public static final java.lang.String CATEGORY_LIVE_AUDIO = "android.media.intent.category.LIVE_AUDIO";
-    field public static final java.lang.String CATEGORY_LIVE_VIDEO = "android.media.intent.category.LIVE_VIDEO";
-    field public static final java.lang.String CATEGORY_REMOTE_PLAYBACK = "android.media.intent.category.REMOTE_PLAYBACK";
-    field public static final int ERROR_INVALID_ITEM_ID = 3; // 0x3
-    field public static final int ERROR_INVALID_SESSION_ID = 2; // 0x2
-    field public static final int ERROR_UNKNOWN = 0; // 0x0
-    field public static final int ERROR_UNSUPPORTED_OPERATION = 1; // 0x1
-    field public static final java.lang.String EXTRA_ERROR_CODE = "android.media.intent.extra.ERROR_CODE";
-    field public static final java.lang.String EXTRA_ITEM_CONTENT_POSITION = "android.media.intent.extra.ITEM_POSITION";
-    field public static final java.lang.String EXTRA_ITEM_HTTP_HEADERS = "android.media.intent.extra.HTTP_HEADERS";
-    field public static final java.lang.String EXTRA_ITEM_ID = "android.media.intent.extra.ITEM_ID";
-    field public static final java.lang.String EXTRA_ITEM_METADATA = "android.media.intent.extra.ITEM_METADATA";
-    field public static final java.lang.String EXTRA_ITEM_STATUS = "android.media.intent.extra.ITEM_STATUS";
-    field public static final java.lang.String EXTRA_ITEM_STATUS_UPDATE_RECEIVER = "android.media.intent.extra.ITEM_STATUS_UPDATE_RECEIVER";
-    field public static final java.lang.String EXTRA_MESSAGE = "android.media.intent.extra.MESSAGE";
-    field public static final java.lang.String EXTRA_MESSAGE_RECEIVER = "android.media.intent.extra.MESSAGE_RECEIVER";
-    field public static final java.lang.String EXTRA_SESSION_ID = "android.media.intent.extra.SESSION_ID";
-    field public static final java.lang.String EXTRA_SESSION_STATUS = "android.media.intent.extra.SESSION_STATUS";
-    field public static final java.lang.String EXTRA_SESSION_STATUS_UPDATE_RECEIVER = "android.media.intent.extra.SESSION_STATUS_UPDATE_RECEIVER";
-  }
-
-  public final class MediaItemMetadata {
-    field public static final java.lang.String KEY_ALBUM_ARTIST = "android.media.metadata.ALBUM_ARTIST";
-    field public static final java.lang.String KEY_ALBUM_TITLE = "android.media.metadata.ALBUM_TITLE";
-    field public static final java.lang.String KEY_ARTIST = "android.media.metadata.ARTIST";
-    field public static final java.lang.String KEY_ARTWORK_URI = "android.media.metadata.ARTWORK_URI";
-    field public static final java.lang.String KEY_AUTHOR = "android.media.metadata.AUTHOR";
-    field public static final java.lang.String KEY_COMPOSER = "android.media.metadata.COMPOSER";
-    field public static final java.lang.String KEY_DISC_NUMBER = "android.media.metadata.DISC_NUMBER";
-    field public static final java.lang.String KEY_DURATION = "android.media.metadata.DURATION";
-    field public static final java.lang.String KEY_TITLE = "android.media.metadata.TITLE";
-    field public static final java.lang.String KEY_TRACK_NUMBER = "android.media.metadata.TRACK_NUMBER";
-    field public static final java.lang.String KEY_YEAR = "android.media.metadata.YEAR";
-  }
-
-  public final class MediaItemStatus {
-    method public android.os.Bundle asBundle();
-    method public static android.support.v7.media.MediaItemStatus fromBundle(android.os.Bundle);
-    method public long getContentDuration();
-    method public long getContentPosition();
-    method public android.os.Bundle getExtras();
-    method public int getPlaybackState();
-    method public long getTimestamp();
-    field public static final java.lang.String EXTRA_HTTP_RESPONSE_HEADERS = "android.media.status.extra.HTTP_RESPONSE_HEADERS";
-    field public static final java.lang.String EXTRA_HTTP_STATUS_CODE = "android.media.status.extra.HTTP_STATUS_CODE";
-    field public static final int PLAYBACK_STATE_BUFFERING = 3; // 0x3
-    field public static final int PLAYBACK_STATE_CANCELED = 5; // 0x5
-    field public static final int PLAYBACK_STATE_ERROR = 7; // 0x7
-    field public static final int PLAYBACK_STATE_FINISHED = 4; // 0x4
-    field public static final int PLAYBACK_STATE_INVALIDATED = 6; // 0x6
-    field public static final int PLAYBACK_STATE_PAUSED = 2; // 0x2
-    field public static final int PLAYBACK_STATE_PENDING = 0; // 0x0
-    field public static final int PLAYBACK_STATE_PLAYING = 1; // 0x1
-  }
-
-  public static final class MediaItemStatus.Builder {
-    ctor public MediaItemStatus.Builder(int);
-    ctor public MediaItemStatus.Builder(android.support.v7.media.MediaItemStatus);
-    method public android.support.v7.media.MediaItemStatus build();
-    method public android.support.v7.media.MediaItemStatus.Builder setContentDuration(long);
-    method public android.support.v7.media.MediaItemStatus.Builder setContentPosition(long);
-    method public android.support.v7.media.MediaItemStatus.Builder setExtras(android.os.Bundle);
-    method public android.support.v7.media.MediaItemStatus.Builder setPlaybackState(int);
-    method public android.support.v7.media.MediaItemStatus.Builder setTimestamp(long);
-  }
-
-  public final class MediaRouteDescriptor {
-    method public android.os.Bundle asBundle();
-    method public boolean canDisconnectAndKeepPlaying();
-    method public static android.support.v7.media.MediaRouteDescriptor fromBundle(android.os.Bundle);
-    method public int getConnectionState();
-    method public java.util.List<android.content.IntentFilter> getControlFilters();
-    method public java.lang.String getDescription();
-    method public int getDeviceType();
-    method public android.os.Bundle getExtras();
-    method public android.net.Uri getIconUri();
-    method public java.lang.String getId();
-    method public java.lang.String getName();
-    method public int getPlaybackStream();
-    method public int getPlaybackType();
-    method public int getPresentationDisplayId();
-    method public android.content.IntentSender getSettingsActivity();
-    method public int getVolume();
-    method public int getVolumeHandling();
-    method public int getVolumeMax();
-    method public deprecated boolean isConnecting();
-    method public boolean isEnabled();
-    method public boolean isValid();
-  }
-
-  public static final class MediaRouteDescriptor.Builder {
-    ctor public MediaRouteDescriptor.Builder(java.lang.String, java.lang.String);
-    ctor public MediaRouteDescriptor.Builder(android.support.v7.media.MediaRouteDescriptor);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder addControlFilter(android.content.IntentFilter);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder addControlFilters(java.util.Collection<android.content.IntentFilter>);
-    method public android.support.v7.media.MediaRouteDescriptor build();
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setCanDisconnect(boolean);
-    method public deprecated android.support.v7.media.MediaRouteDescriptor.Builder setConnecting(boolean);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setConnectionState(int);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setDescription(java.lang.String);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setDeviceType(int);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setEnabled(boolean);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setExtras(android.os.Bundle);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setIconUri(android.net.Uri);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setId(java.lang.String);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setName(java.lang.String);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setPlaybackStream(int);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setPlaybackType(int);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setPresentationDisplayId(int);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setSettingsActivity(android.content.IntentSender);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setVolume(int);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setVolumeHandling(int);
-    method public android.support.v7.media.MediaRouteDescriptor.Builder setVolumeMax(int);
-  }
-
-  public final class MediaRouteDiscoveryRequest {
-    ctor public MediaRouteDiscoveryRequest(android.support.v7.media.MediaRouteSelector, boolean);
-    method public android.os.Bundle asBundle();
-    method public static android.support.v7.media.MediaRouteDiscoveryRequest fromBundle(android.os.Bundle);
-    method public android.support.v7.media.MediaRouteSelector getSelector();
-    method public boolean isActiveScan();
-    method public boolean isValid();
-  }
-
-  public abstract class MediaRouteProvider {
-    ctor public MediaRouteProvider(android.content.Context);
-    method public final android.content.Context getContext();
-    method public final android.support.v7.media.MediaRouteProviderDescriptor getDescriptor();
-    method public final android.support.v7.media.MediaRouteDiscoveryRequest getDiscoveryRequest();
-    method public final android.os.Handler getHandler();
-    method public final android.support.v7.media.MediaRouteProvider.ProviderMetadata getMetadata();
-    method public android.support.v7.media.MediaRouteProvider.RouteController onCreateRouteController(java.lang.String);
-    method public void onDiscoveryRequestChanged(android.support.v7.media.MediaRouteDiscoveryRequest);
-    method public final void setCallback(android.support.v7.media.MediaRouteProvider.Callback);
-    method public final void setDescriptor(android.support.v7.media.MediaRouteProviderDescriptor);
-    method public final void setDiscoveryRequest(android.support.v7.media.MediaRouteDiscoveryRequest);
-  }
-
-  public static abstract class MediaRouteProvider.Callback {
-    ctor public MediaRouteProvider.Callback();
-    method public void onDescriptorChanged(android.support.v7.media.MediaRouteProvider, android.support.v7.media.MediaRouteProviderDescriptor);
-  }
-
-  public static final class MediaRouteProvider.ProviderMetadata {
-    method public android.content.ComponentName getComponentName();
-    method public java.lang.String getPackageName();
-  }
-
-  public static abstract class MediaRouteProvider.RouteController {
-    ctor public MediaRouteProvider.RouteController();
-    method public boolean onControlRequest(android.content.Intent, android.support.v7.media.MediaRouter.ControlRequestCallback);
-    method public void onRelease();
-    method public void onSelect();
-    method public void onSetVolume(int);
-    method public void onUnselect();
-    method public void onUnselect(int);
-    method public void onUpdateVolume(int);
-  }
-
-  public final class MediaRouteProviderDescriptor {
-    method public android.os.Bundle asBundle();
-    method public static android.support.v7.media.MediaRouteProviderDescriptor fromBundle(android.os.Bundle);
-    method public java.util.List<android.support.v7.media.MediaRouteDescriptor> getRoutes();
-    method public boolean isValid();
-  }
-
-  public static final class MediaRouteProviderDescriptor.Builder {
-    ctor public MediaRouteProviderDescriptor.Builder();
-    ctor public MediaRouteProviderDescriptor.Builder(android.support.v7.media.MediaRouteProviderDescriptor);
-    method public android.support.v7.media.MediaRouteProviderDescriptor.Builder addRoute(android.support.v7.media.MediaRouteDescriptor);
-    method public android.support.v7.media.MediaRouteProviderDescriptor.Builder addRoutes(java.util.Collection<android.support.v7.media.MediaRouteDescriptor>);
-    method public android.support.v7.media.MediaRouteProviderDescriptor build();
-  }
-
-  public abstract class MediaRouteProviderService extends android.app.Service {
-    ctor public MediaRouteProviderService();
-    method public android.support.v7.media.MediaRouteProvider getMediaRouteProvider();
-    method public android.os.IBinder onBind(android.content.Intent);
-    method public abstract android.support.v7.media.MediaRouteProvider onCreateMediaRouteProvider();
-    field public static final java.lang.String SERVICE_INTERFACE = "android.media.MediaRouteProviderService";
-  }
-
-  public final class MediaRouteSelector {
-    method public android.os.Bundle asBundle();
-    method public boolean contains(android.support.v7.media.MediaRouteSelector);
-    method public static android.support.v7.media.MediaRouteSelector fromBundle(android.os.Bundle);
-    method public java.util.List<java.lang.String> getControlCategories();
-    method public boolean hasControlCategory(java.lang.String);
-    method public boolean isEmpty();
-    method public boolean isValid();
-    method public boolean matchesControlFilters(java.util.List<android.content.IntentFilter>);
-    field public static final android.support.v7.media.MediaRouteSelector EMPTY;
-  }
-
-  public static final class MediaRouteSelector.Builder {
-    ctor public MediaRouteSelector.Builder();
-    ctor public MediaRouteSelector.Builder(android.support.v7.media.MediaRouteSelector);
-    method public android.support.v7.media.MediaRouteSelector.Builder addControlCategories(java.util.Collection<java.lang.String>);
-    method public android.support.v7.media.MediaRouteSelector.Builder addControlCategory(java.lang.String);
-    method public android.support.v7.media.MediaRouteSelector.Builder addSelector(android.support.v7.media.MediaRouteSelector);
-    method public android.support.v7.media.MediaRouteSelector build();
-  }
-
-  public final class MediaRouter {
-    method public void addCallback(android.support.v7.media.MediaRouteSelector, android.support.v7.media.MediaRouter.Callback);
-    method public void addCallback(android.support.v7.media.MediaRouteSelector, android.support.v7.media.MediaRouter.Callback, int);
-    method public void addProvider(android.support.v7.media.MediaRouteProvider);
-    method public void addRemoteControlClient(java.lang.Object);
-    method public android.support.v7.media.MediaRouter.RouteInfo getDefaultRoute();
-    method public static android.support.v7.media.MediaRouter getInstance(android.content.Context);
-    method public android.support.v4.media.session.MediaSessionCompat.Token getMediaSessionToken();
-    method public java.util.List<android.support.v7.media.MediaRouter.ProviderInfo> getProviders();
-    method public java.util.List<android.support.v7.media.MediaRouter.RouteInfo> getRoutes();
-    method public android.support.v7.media.MediaRouter.RouteInfo getSelectedRoute();
-    method public boolean isRouteAvailable(android.support.v7.media.MediaRouteSelector, int);
-    method public void removeCallback(android.support.v7.media.MediaRouter.Callback);
-    method public void removeProvider(android.support.v7.media.MediaRouteProvider);
-    method public void removeRemoteControlClient(java.lang.Object);
-    method public void selectRoute(android.support.v7.media.MediaRouter.RouteInfo);
-    method public void setMediaSession(java.lang.Object);
-    method public void setMediaSessionCompat(android.support.v4.media.session.MediaSessionCompat);
-    method public void unselect(int);
-    method public android.support.v7.media.MediaRouter.RouteInfo updateSelectedRoute(android.support.v7.media.MediaRouteSelector);
-    field public static final int AVAILABILITY_FLAG_IGNORE_DEFAULT_ROUTE = 1; // 0x1
-    field public static final int AVAILABILITY_FLAG_REQUIRE_MATCH = 2; // 0x2
-    field public static final int CALLBACK_FLAG_FORCE_DISCOVERY = 8; // 0x8
-    field public static final int CALLBACK_FLAG_PERFORM_ACTIVE_SCAN = 1; // 0x1
-    field public static final int CALLBACK_FLAG_REQUEST_DISCOVERY = 4; // 0x4
-    field public static final int CALLBACK_FLAG_UNFILTERED_EVENTS = 2; // 0x2
-    field public static final int UNSELECT_REASON_DISCONNECTED = 1; // 0x1
-    field public static final int UNSELECT_REASON_ROUTE_CHANGED = 3; // 0x3
-    field public static final int UNSELECT_REASON_STOPPED = 2; // 0x2
-    field public static final int UNSELECT_REASON_UNKNOWN = 0; // 0x0
-  }
-
-  public static abstract class MediaRouter.Callback {
-    ctor public MediaRouter.Callback();
-    method public void onProviderAdded(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.ProviderInfo);
-    method public void onProviderChanged(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.ProviderInfo);
-    method public void onProviderRemoved(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.ProviderInfo);
-    method public void onRouteAdded(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
-    method public void onRouteChanged(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
-    method public void onRoutePresentationDisplayChanged(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
-    method public void onRouteRemoved(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
-    method public void onRouteSelected(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
-    method public void onRouteUnselected(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
-    method public void onRouteUnselected(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo, int);
-    method public void onRouteVolumeChanged(android.support.v7.media.MediaRouter, android.support.v7.media.MediaRouter.RouteInfo);
-  }
-
-  public static abstract class MediaRouter.ControlRequestCallback {
-    ctor public MediaRouter.ControlRequestCallback();
-    method public void onError(java.lang.String, android.os.Bundle);
-    method public void onResult(android.os.Bundle);
-  }
-
-  public static final class MediaRouter.ProviderInfo {
-    method public android.content.ComponentName getComponentName();
-    method public java.lang.String getPackageName();
-    method public android.support.v7.media.MediaRouteProvider getProviderInstance();
-    method public java.util.List<android.support.v7.media.MediaRouter.RouteInfo> getRoutes();
-  }
-
-  public static class MediaRouter.RouteInfo {
-    method public boolean canDisconnect();
-    method public int getConnectionState();
-    method public java.util.List<android.content.IntentFilter> getControlFilters();
-    method public java.lang.String getDescription();
-    method public int getDeviceType();
-    method public android.os.Bundle getExtras();
-    method public android.net.Uri getIconUri();
-    method public java.lang.String getId();
-    method public java.lang.String getName();
-    method public int getPlaybackStream();
-    method public int getPlaybackType();
-    method public android.view.Display getPresentationDisplay();
-    method public android.support.v7.media.MediaRouter.ProviderInfo getProvider();
-    method public android.content.IntentSender getSettingsIntent();
-    method public int getVolume();
-    method public int getVolumeHandling();
-    method public int getVolumeMax();
-    method public boolean isConnecting();
-    method public boolean isDefault();
-    method public boolean isEnabled();
-    method public boolean isSelected();
-    method public boolean matchesSelector(android.support.v7.media.MediaRouteSelector);
-    method public void requestSetVolume(int);
-    method public void requestUpdateVolume(int);
-    method public void select();
-    method public void sendControlRequest(android.content.Intent, android.support.v7.media.MediaRouter.ControlRequestCallback);
-    method public boolean supportsControlAction(java.lang.String, java.lang.String);
-    method public boolean supportsControlCategory(java.lang.String);
-    method public boolean supportsControlRequest(android.content.Intent);
-    field public static final int CONNECTION_STATE_CONNECTED = 2; // 0x2
-    field public static final int CONNECTION_STATE_CONNECTING = 1; // 0x1
-    field public static final int CONNECTION_STATE_DISCONNECTED = 0; // 0x0
-    field public static final int DEVICE_TYPE_SPEAKER = 2; // 0x2
-    field public static final int DEVICE_TYPE_TV = 1; // 0x1
-    field public static final int PLAYBACK_TYPE_LOCAL = 0; // 0x0
-    field public static final int PLAYBACK_TYPE_REMOTE = 1; // 0x1
-    field public static final int PLAYBACK_VOLUME_FIXED = 0; // 0x0
-    field public static final int PLAYBACK_VOLUME_VARIABLE = 1; // 0x1
-  }
-
-  public final class MediaSessionStatus {
-    method public android.os.Bundle asBundle();
-    method public static android.support.v7.media.MediaSessionStatus fromBundle(android.os.Bundle);
-    method public android.os.Bundle getExtras();
-    method public int getSessionState();
-    method public long getTimestamp();
-    method public boolean isQueuePaused();
-    field public static final int SESSION_STATE_ACTIVE = 0; // 0x0
-    field public static final int SESSION_STATE_ENDED = 1; // 0x1
-    field public static final int SESSION_STATE_INVALIDATED = 2; // 0x2
-  }
-
-  public static final class MediaSessionStatus.Builder {
-    ctor public MediaSessionStatus.Builder(int);
-    ctor public MediaSessionStatus.Builder(android.support.v7.media.MediaSessionStatus);
-    method public android.support.v7.media.MediaSessionStatus build();
-    method public android.support.v7.media.MediaSessionStatus.Builder setExtras(android.os.Bundle);
-    method public android.support.v7.media.MediaSessionStatus.Builder setQueuePaused(boolean);
-    method public android.support.v7.media.MediaSessionStatus.Builder setSessionState(int);
-    method public android.support.v7.media.MediaSessionStatus.Builder setTimestamp(long);
-  }
-
-  public class RemotePlaybackClient {
-    ctor public RemotePlaybackClient(android.content.Context, android.support.v7.media.MediaRouter.RouteInfo);
-    method public void endSession(android.os.Bundle, android.support.v7.media.RemotePlaybackClient.SessionActionCallback);
-    method public void enqueue(android.net.Uri, java.lang.String, android.os.Bundle, long, android.os.Bundle, android.support.v7.media.RemotePlaybackClient.ItemActionCallback);
-    method public java.lang.String getSessionId();
-    method public void getSessionStatus(android.os.Bundle, android.support.v7.media.RemotePlaybackClient.SessionActionCallback);
-    method public void getStatus(java.lang.String, android.os.Bundle, android.support.v7.media.RemotePlaybackClient.ItemActionCallback);
-    method public boolean hasSession();
-    method public boolean isMessagingSupported();
-    method public boolean isQueuingSupported();
-    method public boolean isRemotePlaybackSupported();
-    method public boolean isSessionManagementSupported();
-    method public void pause(android.os.Bundle, android.support.v7.media.RemotePlaybackClient.SessionActionCallback);
-    method public void play(android.net.Uri, java.lang.String, android.os.Bundle, long, android.os.Bundle, android.support.v7.media.RemotePlaybackClient.ItemActionCallback);
-    method public void release();
-    method public void remove(java.lang.String, android.os.Bundle, android.support.v7.media.RemotePlaybackClient.ItemActionCallback);
-    method public void resume(android.os.Bundle, android.support.v7.media.RemotePlaybackClient.SessionActionCallback);
-    method public void seek(java.lang.String, long, android.os.Bundle, android.support.v7.media.RemotePlaybackClient.ItemActionCallback);
-    method public void sendMessage(android.os.Bundle, android.support.v7.media.RemotePlaybackClient.SessionActionCallback);
-    method public void setOnMessageReceivedListener(android.support.v7.media.RemotePlaybackClient.OnMessageReceivedListener);
-    method public void setSessionId(java.lang.String);
-    method public void setStatusCallback(android.support.v7.media.RemotePlaybackClient.StatusCallback);
-    method public void startSession(android.os.Bundle, android.support.v7.media.RemotePlaybackClient.SessionActionCallback);
-    method public void stop(android.os.Bundle, android.support.v7.media.RemotePlaybackClient.SessionActionCallback);
-  }
-
-  public static abstract class RemotePlaybackClient.ActionCallback {
-    ctor public RemotePlaybackClient.ActionCallback();
-    method public void onError(java.lang.String, int, android.os.Bundle);
-  }
-
-  public static abstract class RemotePlaybackClient.ItemActionCallback extends android.support.v7.media.RemotePlaybackClient.ActionCallback {
-    ctor public RemotePlaybackClient.ItemActionCallback();
-    method public void onResult(android.os.Bundle, java.lang.String, android.support.v7.media.MediaSessionStatus, java.lang.String, android.support.v7.media.MediaItemStatus);
-  }
-
-  public static abstract interface RemotePlaybackClient.OnMessageReceivedListener {
-    method public abstract void onMessageReceived(java.lang.String, android.os.Bundle);
-  }
-
-  public static abstract class RemotePlaybackClient.SessionActionCallback extends android.support.v7.media.RemotePlaybackClient.ActionCallback {
-    ctor public RemotePlaybackClient.SessionActionCallback();
-    method public void onResult(android.os.Bundle, java.lang.String, android.support.v7.media.MediaSessionStatus);
-  }
-
-  public static abstract class RemotePlaybackClient.StatusCallback {
-    ctor public RemotePlaybackClient.StatusCallback();
-    method public void onItemStatusChanged(android.os.Bundle, java.lang.String, android.support.v7.media.MediaSessionStatus, java.lang.String, android.support.v7.media.MediaItemStatus);
-    method public void onSessionChanged(java.lang.String);
-    method public void onSessionStatusChanged(android.os.Bundle, java.lang.String, android.support.v7.media.MediaSessionStatus);
-  }
-
-}
-
diff --git a/v7/mediarouter/api/removed.txt b/v7/mediarouter/api/removed.txt
deleted file mode 100644
index e69de29..0000000
--- a/v7/mediarouter/api/removed.txt
+++ /dev/null
diff --git a/v7/mediarouter/build.gradle b/v7/mediarouter/build.gradle
index 091c639..16761c2 100644
--- a/v7/mediarouter/build.gradle
+++ b/v7/mediarouter/build.gradle
@@ -11,7 +11,11 @@
 sourceCompatibility = JavaVersion.VERSION_1_7
 targetCompatibility = JavaVersion.VERSION_1_7
 setApiModuleDependencies(project, dependencies, gradle.ext.studioCompat.modules.mediaRouter.dependencies)
-
+// keep these dependencies here since API specific implementations don't need to access them.
+dependencies {
+    compile project(":support-appcompat-v7")
+    compile project(":support-palette-v7")
+}
 android {
     compileSdkVersion project.ext.currentSdk
 
diff --git a/v7/mediarouter/res/values-af/strings.xml b/v7/mediarouter/res/values-af/strings.xml
index 024a99c..9811194 100644
--- a/v7/mediarouter/res/values-af/strings.xml
+++ b/v7/mediarouter/res/values-af/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"Laat wag"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"Vou uit"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Vou in"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"Albumkunswerk"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Geen media is gekies nie"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Geen inligting beskikbaar nie"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Saai tans skerm uit"</string>
diff --git a/v7/mediarouter/res/values-am/strings.xml b/v7/mediarouter/res/values-am/strings.xml
index 4456b45..6f7931d 100644
--- a/v7/mediarouter/res/values-am/strings.xml
+++ b/v7/mediarouter/res/values-am/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"ለአፍታ አቁም"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"አስፋ"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"ሰብስብ"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"የአልበም ስነ-ጥበብ"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"ምንም ማህደረመረጃ አልተመረጠም"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"ምንም መረጃ አይገኝም"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"ማያ ገጽን በመውሰድ ላይ"</string>
diff --git a/v7/mediarouter/res/values-ar/strings.xml b/v7/mediarouter/res/values-ar/strings.xml
index 7222590..29cab47 100644
--- a/v7/mediarouter/res/values-ar/strings.xml
+++ b/v7/mediarouter/res/values-ar/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"إيقاف مؤقت"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"توسيع"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"تصغير"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"صورة الألبوم"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"لم يتم اختيار أية وسائط"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"لا تتوفر أية معلومات"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"جارٍ إرسال الشاشة"</string>
diff --git a/v7/mediarouter/res/values-az-rAZ/strings.xml b/v7/mediarouter/res/values-az-rAZ/strings.xml
index aa3a70f..765520e 100644
--- a/v7/mediarouter/res/values-az-rAZ/strings.xml
+++ b/v7/mediarouter/res/values-az-rAZ/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"Durdurun"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"Genişləndirin"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Yığcamlaşdırın"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"Albom incəsənəti"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Heç bir media seçilməyib"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Əlçatan məlumat yoxdur"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Ekran yayımlanır"</string>
diff --git a/v7/mediarouter/res/values-b+sr+Latn/strings.xml b/v7/mediarouter/res/values-b+sr+Latn/strings.xml
index c10c42d..6c32754 100644
--- a/v7/mediarouter/res/values-b+sr+Latn/strings.xml
+++ b/v7/mediarouter/res/values-b+sr+Latn/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"Pauziraj"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"Proširi"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Skupi"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"Omot albuma"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nema izabranih medija"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Nisu dostupne nikakve informacije"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Prebacuje se ekran"</string>
diff --git a/v7/mediarouter/res/values-be-rBY/strings.xml b/v7/mediarouter/res/values-be-rBY/strings.xml
new file mode 100644
index 0000000..de52c06
--- /dev/null
+++ b/v7/mediarouter/res/values-be-rBY/strings.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2013 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="mr_system_route_name" msgid="5441529851481176817">"Сістэма"</string>
+    <string name="mr_user_route_category_name" msgid="7498112907524977311">"Прылады"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"Кнопка трансляцыі"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"Трансляваць на"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"Пошук прылад"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"Адлучыць"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"Спыніць трансляцыю"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"Закрыць"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"Прайграць"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"Прыпыніць"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"Разгарнуць"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Згарнуць"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"Вокладка альбома"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Медыяфайл не выбраны"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Інфармацыя адсутнічае"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Экран трансляцыі"</string>
+</resources>
diff --git a/v7/mediarouter/res/values-bg/strings.xml b/v7/mediarouter/res/values-bg/strings.xml
index de49179..036b31f 100644
--- a/v7/mediarouter/res/values-bg/strings.xml
+++ b/v7/mediarouter/res/values-bg/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"Поставяне на пауза"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"Разгъване"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Свиване"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"Обложка на албума"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Няма избрана мултимедия"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Няма налична информация"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Екранът се предава"</string>
diff --git a/v7/mediarouter/res/values-bn-rBD/strings.xml b/v7/mediarouter/res/values-bn-rBD/strings.xml
index 7eb5301..0e3e491 100644
--- a/v7/mediarouter/res/values-bn-rBD/strings.xml
+++ b/v7/mediarouter/res/values-bn-rBD/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"বিরাম দিন"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"প্রসারিত করুন"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"সঙ্কুচিত করুন"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"অ্যালবাম শৈলি"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"কোনো মিডিয়া নির্বাচন করা হয়নি"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"কোনো তথ্য উপলব্ধ নেই"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"স্ক্রীন কাস্ট করা হচ্ছে"</string>
diff --git a/v7/mediarouter/res/values-bs-rBA/strings.xml b/v7/mediarouter/res/values-bs-rBA/strings.xml
new file mode 100644
index 0000000..a6894f5
--- /dev/null
+++ b/v7/mediarouter/res/values-bs-rBA/strings.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--  Copyright (C) 2013 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="mr_system_route_name" msgid="5441529851481176817">"Sistem"</string>
+    <string name="mr_user_route_category_name" msgid="7498112907524977311">"Uređaji"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"Dugme za prebacivanje"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"Prebacujte na"</string>
+    <string name="mr_chooser_searching" msgid="6349900579507521956">"Traženje uređaja"</string>
+    <string name="mr_controller_disconnect" msgid="1227264889412989580">"Prekini vezu"</string>
+    <string name="mr_controller_stop" msgid="4570331844078181931">"Zaustavi prebacivanje"</string>
+    <string name="mr_controller_close_description" msgid="7333862312480583260">"Zatvori"</string>
+    <string name="mr_controller_play" msgid="683634565969987458">"Reproduciraj"</string>
+    <string name="mr_controller_pause" msgid="5451884435510905406">"Pauziraj"</string>
+    <string name="mr_controller_expand_group" msgid="8062427022744266907">"Proširi"</string>
+    <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Skupi"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"Omot albuma"</string>
+    <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nijedan medij nije odabran"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Nema dostupnih informacija"</string>
+    <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Prebacuje se ekran"</string>
+</resources>
diff --git a/v7/mediarouter/res/values-ca/strings.xml b/v7/mediarouter/res/values-ca/strings.xml
index ab8809a..7fc51f7 100644
--- a/v7/mediarouter/res/values-ca/strings.xml
+++ b/v7/mediarouter/res/values-ca/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"Posa en pausa"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"Desplega"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Replega"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"Imatge de l\'àlbum"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"No s\'ha seleccionat cap fitxer multimèdia"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"No hi ha informació disponible"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Emissió de pantalla"</string>
diff --git a/v7/mediarouter/res/values-cs/strings.xml b/v7/mediarouter/res/values-cs/strings.xml
index 57c1594..f5a286e 100644
--- a/v7/mediarouter/res/values-cs/strings.xml
+++ b/v7/mediarouter/res/values-cs/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"Pozastavit"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"Rozbalit"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Sbalit"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"Obal alba"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nebyla vybrána žádná média"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Nejsou k dispozici žádné informace"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Odesílání obsahu obrazovky"</string>
diff --git a/v7/mediarouter/res/values-da/strings.xml b/v7/mediarouter/res/values-da/strings.xml
index eb6c8fa..9e5f9a5 100644
--- a/v7/mediarouter/res/values-da/strings.xml
+++ b/v7/mediarouter/res/values-da/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"Sæt på pause"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"Udvid"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Skjul"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"Albumgrafik"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Der er ikke valgt nogen medier"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Der er ingen tilgængelige oplysninger"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Skærmen castes"</string>
diff --git a/v7/mediarouter/res/values-de/strings.xml b/v7/mediarouter/res/values-de/strings.xml
index 17a84af..91d764f 100644
--- a/v7/mediarouter/res/values-de/strings.xml
+++ b/v7/mediarouter/res/values-de/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"Pausieren"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"Maximieren"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Minimieren"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"Albumcover"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Keine Medien ausgewählt"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Keine Informationen verfügbar"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Bildschirm wird gestreamt."</string>
diff --git a/v7/mediarouter/res/values-el/strings.xml b/v7/mediarouter/res/values-el/strings.xml
index 9258296..0a1a62f 100644
--- a/v7/mediarouter/res/values-el/strings.xml
+++ b/v7/mediarouter/res/values-el/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"Παύση"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"Ανάπτυξη"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Σύμπτυξη"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"Εξώφυλλο άλμπουμ"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Δεν έχουν επιλεγεί μέσα"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Δεν υπάρχουν διαθέσιμες πληροφορίες"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Μετάδοση οθόνης"</string>
diff --git a/v7/mediarouter/res/values-en-rAU/strings.xml b/v7/mediarouter/res/values-en-rAU/strings.xml
index 5edd79b..d60689e 100644
--- a/v7/mediarouter/res/values-en-rAU/strings.xml
+++ b/v7/mediarouter/res/values-en-rAU/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"Pause"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"Expand"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Collapse"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"Album art"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"No media selected"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"No info available"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Casting screen"</string>
diff --git a/v7/mediarouter/res/values-en-rGB/strings.xml b/v7/mediarouter/res/values-en-rGB/strings.xml
index 5edd79b..d60689e 100644
--- a/v7/mediarouter/res/values-en-rGB/strings.xml
+++ b/v7/mediarouter/res/values-en-rGB/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"Pause"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"Expand"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Collapse"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"Album art"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"No media selected"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"No info available"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Casting screen"</string>
diff --git a/v7/mediarouter/res/values-en-rIN/strings.xml b/v7/mediarouter/res/values-en-rIN/strings.xml
index 5edd79b..d60689e 100644
--- a/v7/mediarouter/res/values-en-rIN/strings.xml
+++ b/v7/mediarouter/res/values-en-rIN/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"Pause"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"Expand"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Collapse"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"Album art"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"No media selected"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"No info available"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Casting screen"</string>
diff --git a/v7/mediarouter/res/values-es-rUS/strings.xml b/v7/mediarouter/res/values-es-rUS/strings.xml
index b0a0a61..2318059 100644
--- a/v7/mediarouter/res/values-es-rUS/strings.xml
+++ b/v7/mediarouter/res/values-es-rUS/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"Pausar"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"Mostrar"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Ocultar"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"Imagen del álbum"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"No se seleccionó ningún contenido multimedia"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Sin información disponible"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Transmitiendo pantalla"</string>
diff --git a/v7/mediarouter/res/values-es/strings.xml b/v7/mediarouter/res/values-es/strings.xml
index 3a1eaeb..9f108fe 100644
--- a/v7/mediarouter/res/values-es/strings.xml
+++ b/v7/mediarouter/res/values-es/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"Pausa"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"Mostrar"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Ocultar"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"Portada del álbum"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"No se ha seleccionado ningún medio"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"No hay información disponible"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Enviando pantalla"</string>
diff --git a/v7/mediarouter/res/values-et-rEE/strings.xml b/v7/mediarouter/res/values-et-rEE/strings.xml
index 9058dcf..3fab845 100644
--- a/v7/mediarouter/res/values-et-rEE/strings.xml
+++ b/v7/mediarouter/res/values-et-rEE/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"Peatamine"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"Laiendamine"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Ahendamine"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"Albumi kujundus"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Meediat pole valitud"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Teave puudub"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Ekraanikuva ülekandmine"</string>
diff --git a/v7/mediarouter/res/values-eu-rES/strings.xml b/v7/mediarouter/res/values-eu-rES/strings.xml
index ad85c5a..bae67ed 100644
--- a/v7/mediarouter/res/values-eu-rES/strings.xml
+++ b/v7/mediarouter/res/values-eu-rES/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"Pausatu"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"Zabaldu"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Tolestu"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"Albumaren azala"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Ez da hautatu multimedia-edukirik"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Ez dago informaziorik"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Pantaila igortzen"</string>
diff --git a/v7/mediarouter/res/values-fa/strings.xml b/v7/mediarouter/res/values-fa/strings.xml
index 2c812ae..eb34931 100644
--- a/v7/mediarouter/res/values-fa/strings.xml
+++ b/v7/mediarouter/res/values-fa/strings.xml
@@ -28,7 +28,8 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"مکث"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"بزرگ کردن"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"کوچک کردن"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"عکس روی جلد آلبوم"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"رسانه انتخاب نشده است"</string>
-    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"اطلاعات دردسترس نیست"</string>
+    <string name="mr_controller_no_info_available" msgid="5585418471741142924">"اطلاعات در دسترس نیست"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"درحال فرستادن صفحه"</string>
 </resources>
diff --git a/v7/mediarouter/res/values-fi/strings.xml b/v7/mediarouter/res/values-fi/strings.xml
index a93d74e..f37317a 100644
--- a/v7/mediarouter/res/values-fi/strings.xml
+++ b/v7/mediarouter/res/values-fi/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"Keskeytä"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"Laajenna"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Tiivistä"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"Albumin kansikuva"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Ei valittua mediaa."</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Tietoja ei ole saatavilla"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Suoratoistetaan näyttöä"</string>
diff --git a/v7/mediarouter/res/values-fr-rCA/strings.xml b/v7/mediarouter/res/values-fr-rCA/strings.xml
index f0c6976..5719479 100644
--- a/v7/mediarouter/res/values-fr-rCA/strings.xml
+++ b/v7/mediarouter/res/values-fr-rCA/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"Interrompre"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"Développer"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Réduire"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"Image de l\'album"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Aucun média sélectionné"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Aucune information disponible"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Diffusion de l\'écran en cours"</string>
diff --git a/v7/mediarouter/res/values-fr/strings.xml b/v7/mediarouter/res/values-fr/strings.xml
index 6e14ccc..6ce8329 100644
--- a/v7/mediarouter/res/values-fr/strings.xml
+++ b/v7/mediarouter/res/values-fr/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"Pause"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"Développer"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Réduire"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"Image de l\'album"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Aucun média sélectionné"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Aucune information disponible"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Diffusion de l\'écran en cours…"</string>
diff --git a/v7/mediarouter/res/values-gl-rES/strings.xml b/v7/mediarouter/res/values-gl-rES/strings.xml
index fb76c68..c922b68 100644
--- a/v7/mediarouter/res/values-gl-rES/strings.xml
+++ b/v7/mediarouter/res/values-gl-rES/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"Pausa"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"Ampliar"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Contraer"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"Portada do álbum"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Non se seleccionaron recursos"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Non hai información dispoñible"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Emisión de pantalla"</string>
diff --git a/v7/mediarouter/res/values-gu-rIN/strings.xml b/v7/mediarouter/res/values-gu-rIN/strings.xml
index 211f836..e3be8fc 100644
--- a/v7/mediarouter/res/values-gu-rIN/strings.xml
+++ b/v7/mediarouter/res/values-gu-rIN/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"થોભાવો"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"વિસ્તૃત કરો"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"સંકુચિત કરો"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"આલ્બમ કલા"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"કોઈ મીડિયા પસંદ કરેલ નથી"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"કોઈ માહિતી ઉપલબ્ધ નથી"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"સ્ક્રીનને કાસ્ટ કરી રહ્યાં છે"</string>
diff --git a/v7/mediarouter/res/values-hi/strings.xml b/v7/mediarouter/res/values-hi/strings.xml
index e2c7a43..9d0650b 100644
--- a/v7/mediarouter/res/values-hi/strings.xml
+++ b/v7/mediarouter/res/values-hi/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"रोकें"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"विस्तृत करें"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"संक्षिप्त करें"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"एल्बम आर्ट"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"कोई मीडिया चयनित नहीं है"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"कोई जानकारी उपलब्‍ध नहीं"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"स्क्रीन कास्ट हो रही है"</string>
diff --git a/v7/mediarouter/res/values-hr/strings.xml b/v7/mediarouter/res/values-hr/strings.xml
index d79258f..371088b 100644
--- a/v7/mediarouter/res/values-hr/strings.xml
+++ b/v7/mediarouter/res/values-hr/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"Pauziranje"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"Proširivanje"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Sažimanje"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"Naslovnica albuma"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nije odabran nijedan medij"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Informacije nisu dostupne"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Emitiranje zaslona"</string>
diff --git a/v7/mediarouter/res/values-hu/strings.xml b/v7/mediarouter/res/values-hu/strings.xml
index 7686fea..a3d6990 100644
--- a/v7/mediarouter/res/values-hu/strings.xml
+++ b/v7/mediarouter/res/values-hu/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"Szüneteltetés"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"Kibontás"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Összecsukás"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"Lemezborító"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nincs média kiválasztva"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Nincs információ"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Képernyőtartalom átküldése"</string>
diff --git a/v7/mediarouter/res/values-hy-rAM/strings.xml b/v7/mediarouter/res/values-hy-rAM/strings.xml
index b05c17c..a8c1cf3 100644
--- a/v7/mediarouter/res/values-hy-rAM/strings.xml
+++ b/v7/mediarouter/res/values-hy-rAM/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"Դադար"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"Ընդարձակել"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Կոծկել"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"Ալբոմի շապիկ"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Մեդիա ֆայլեր չեն ընտրվել"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Տեղեկությունները հասանելի չեն"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Էկրանը հեռարձակվում է"</string>
diff --git a/v7/mediarouter/res/values-in/strings.xml b/v7/mediarouter/res/values-in/strings.xml
index 4d84852..4bc0852 100644
--- a/v7/mediarouter/res/values-in/strings.xml
+++ b/v7/mediarouter/res/values-in/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"Jeda"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"Luaskan"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Ciutkan"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"Sampul album"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Tidak ada media yang dipilih"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Tidak ada info yang tersedia"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Transmisi layar"</string>
diff --git a/v7/mediarouter/res/values-is-rIS/strings.xml b/v7/mediarouter/res/values-is-rIS/strings.xml
index 366f6f6..08e41e6 100644
--- a/v7/mediarouter/res/values-is-rIS/strings.xml
+++ b/v7/mediarouter/res/values-is-rIS/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"Hlé"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"Stækka"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Minnka"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"Plötuumslag"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Enginn miðill valinn"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Engar upplýsingar í boði"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Skjár sendur út"</string>
diff --git a/v7/mediarouter/res/values-it/strings.xml b/v7/mediarouter/res/values-it/strings.xml
index 9febd99..87b570c 100644
--- a/v7/mediarouter/res/values-it/strings.xml
+++ b/v7/mediarouter/res/values-it/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"Pausa"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"Espandi"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Comprimi"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"Copertina"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nessun contenuto multimediale selezionato"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Nessuna informazione disponibile"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Trasmissione dello schermo in corso"</string>
diff --git a/v7/mediarouter/res/values-iw/strings.xml b/v7/mediarouter/res/values-iw/strings.xml
index d1698a5..8b52adf 100644
--- a/v7/mediarouter/res/values-iw/strings.xml
+++ b/v7/mediarouter/res/values-iw/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"השהה"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"הרחב"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"כווץ"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"עטיפת אלבום"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"לא נבחרה מדיה"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"אין מידע זמין"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"העברת מסך מתבצעת"</string>
diff --git a/v7/mediarouter/res/values-ja/strings.xml b/v7/mediarouter/res/values-ja/strings.xml
index ffe9054..b126965 100644
--- a/v7/mediarouter/res/values-ja/strings.xml
+++ b/v7/mediarouter/res/values-ja/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"一時停止"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"展開"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"折りたたむ"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"アルバムアート"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"メディアが選択されていません"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"情報がありません"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"画面をキャストしています"</string>
diff --git a/v7/mediarouter/res/values-ka-rGE/strings.xml b/v7/mediarouter/res/values-ka-rGE/strings.xml
index 2182b64..046e361 100644
--- a/v7/mediarouter/res/values-ka-rGE/strings.xml
+++ b/v7/mediarouter/res/values-ka-rGE/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"პაუზა"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"გაშლა"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"ჩაკეცვა"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"ალბომის გარეკანი"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"მედია არჩეული არ არის"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"ინფორმაცია არ არის ხელმისაწვდომი"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"მიმდინარეობს ეკრანის გადაცემა"</string>
diff --git a/v7/mediarouter/res/values-kk-rKZ/strings.xml b/v7/mediarouter/res/values-kk-rKZ/strings.xml
index 5c72c5f..5cf4e5a 100644
--- a/v7/mediarouter/res/values-kk-rKZ/strings.xml
+++ b/v7/mediarouter/res/values-kk-rKZ/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"Кідірту"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"Жаю"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Жию"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"Альбом шебері"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Ешбір тасушы таңдалмаған"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Қол жетімді ақпарат жоқ"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Экранды трансляциялау"</string>
diff --git a/v7/mediarouter/res/values-km-rKH/strings.xml b/v7/mediarouter/res/values-km-rKH/strings.xml
index cdf94db..fd05668 100644
--- a/v7/mediarouter/res/values-km-rKH/strings.xml
+++ b/v7/mediarouter/res/values-km-rKH/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"ផ្អាក"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"ពង្រីក"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"បង្រួម"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"ស្នាដៃសិល្បៈអាល់ប៊ុម"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"គ្មានការជ្រើសមេឌៀទេ"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"មិនមានព័ត៌មានទេ"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"កំពុងខាសអេក្រង់"</string>
diff --git a/v7/mediarouter/res/values-kn-rIN/strings.xml b/v7/mediarouter/res/values-kn-rIN/strings.xml
index 970dc41..9cae5be 100644
--- a/v7/mediarouter/res/values-kn-rIN/strings.xml
+++ b/v7/mediarouter/res/values-kn-rIN/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"ವಿರಾಮ"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"ವಿಸ್ತರಿಸು"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"ಸಂಕುಚಿಸು"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"ಆಲ್ಬಮ್ ಕಲೆ"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"ಯಾವುದೇ ಮಾಧ್ಯಮ ಆಯ್ಕೆಮಾಡಲಾಗಿಲ್ಲ"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"ಯಾವುದೇ ಮಾಹಿತಿ ಲಭ್ಯವಿಲ್ಲ"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"ಪರದೆಯನ್ನು ಬಿತ್ತರಿಸಲಾಗುತ್ತಿದೆ"</string>
diff --git a/v7/mediarouter/res/values-ko/strings.xml b/v7/mediarouter/res/values-ko/strings.xml
index fc1dbac..7f53382 100644
--- a/v7/mediarouter/res/values-ko/strings.xml
+++ b/v7/mediarouter/res/values-ko/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"일시중지"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"펼치기"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"접기"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"앨범아트"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"선택한 미디어 없음"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"정보가 없습니다."</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"화면 전송 중"</string>
diff --git a/v7/mediarouter/res/values-ky-rKG/strings.xml b/v7/mediarouter/res/values-ky-rKG/strings.xml
index d7409db..99201dc 100644
--- a/v7/mediarouter/res/values-ky-rKG/strings.xml
+++ b/v7/mediarouter/res/values-ky-rKG/strings.xml
@@ -16,7 +16,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="mr_system_route_name" msgid="5441529851481176817">"Систем"</string>
+    <string name="mr_system_route_name" msgid="5441529851481176817">"Тутум"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"Түзмөктөр"</string>
     <string name="mr_button_content_description" msgid="3698378085901466129">"Тышкы экранга чыгаруу баскычы"</string>
     <string name="mr_chooser_title" msgid="414301941546135990">"Төмөнкүгө чыгаруу"</string>
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"Тындыруу"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"Жайып көрсөтүү"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Жыйыштыруу"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"Альбом мукабасы"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Бир да медиа файл тандалган жок"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Эч маалымат жок"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Тышкы экранга чыгарылууда"</string>
diff --git a/v7/mediarouter/res/values-lo-rLA/strings.xml b/v7/mediarouter/res/values-lo-rLA/strings.xml
index a19dd69..2765364 100644
--- a/v7/mediarouter/res/values-lo-rLA/strings.xml
+++ b/v7/mediarouter/res/values-lo-rLA/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"ຢຸດຊົ່ວຄາວ"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"ຂະຫຍາຍ"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"ຫຍໍ້ລົງ"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"ໜ້າປົກອະລະບໍ້າ"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"ບໍ່​ໄດ້​ເລືອກ​ມີ​ເດຍ​ໃດ​ໄວ້"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"ບໍ່​ມີ​ຂໍ້​ມູນ"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"ການສົ່ງພາບໜ້າຈໍ"</string>
diff --git a/v7/mediarouter/res/values-lt/strings.xml b/v7/mediarouter/res/values-lt/strings.xml
index d286e0c..208752f 100644
--- a/v7/mediarouter/res/values-lt/strings.xml
+++ b/v7/mediarouter/res/values-lt/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"Pristabdyti"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"Išskleisti"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Sutraukti"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"Albumo viršelis"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nepasirinkta jokia medija"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Informacija nepasiekiama"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Perduodamas ekranas"</string>
diff --git a/v7/mediarouter/res/values-lv/strings.xml b/v7/mediarouter/res/values-lv/strings.xml
index 8f49d85..832a3ba 100644
--- a/v7/mediarouter/res/values-lv/strings.xml
+++ b/v7/mediarouter/res/values-lv/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"Apturēt"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"Izvērst"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Sakļaut"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"Albuma vāciņš"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nav atlasīti multivides faili"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Nav pieejama informācija"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Notiek ekrāna apraide"</string>
diff --git a/v7/mediarouter/res/values-mk-rMK/strings.xml b/v7/mediarouter/res/values-mk-rMK/strings.xml
index e8ff3e7..726e285 100644
--- a/v7/mediarouter/res/values-mk-rMK/strings.xml
+++ b/v7/mediarouter/res/values-mk-rMK/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"Паузирај"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"Прошири"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Собери"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"Корица на албум"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Не се избрани медиуми"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Нема достапни информации"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Екранот се емитува"</string>
diff --git a/v7/mediarouter/res/values-ml-rIN/strings.xml b/v7/mediarouter/res/values-ml-rIN/strings.xml
index 7dbdf5d..b1d2cbe 100644
--- a/v7/mediarouter/res/values-ml-rIN/strings.xml
+++ b/v7/mediarouter/res/values-ml-rIN/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"തൽക്കാലം നിർത്തൂ"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"വികസിപ്പിക്കുക"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"ചുരുക്കുക"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"ആൽബം ആർട്ട്"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"മീഡിയയൊന്നും തിരഞ്ഞെടുത്തിട്ടില്ല"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"വിവരങ്ങളൊന്നും ലഭ്യമല്ല"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"സ്‌ക്രീൻ കാസ്റ്റുചെയ്യുന്നു"</string>
diff --git a/v7/mediarouter/res/values-mn-rMN/strings.xml b/v7/mediarouter/res/values-mn-rMN/strings.xml
index db6d599..d07d314 100644
--- a/v7/mediarouter/res/values-mn-rMN/strings.xml
+++ b/v7/mediarouter/res/values-mn-rMN/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"Түр зогсоох"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"Дэлгэх"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Хураах"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"Цомгийн зураг"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Ямар ч медиа сонгоогүй"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Мэдээлэл байхгүй байна"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Дэлгэцийг дамжуулж байна"</string>
diff --git a/v7/mediarouter/res/values-mr-rIN/strings.xml b/v7/mediarouter/res/values-mr-rIN/strings.xml
index b3f9264..4e24aff 100644
--- a/v7/mediarouter/res/values-mr-rIN/strings.xml
+++ b/v7/mediarouter/res/values-mr-rIN/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"विराम"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"विस्तृत करा"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"संकुचित करा"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"अल्बम कला"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"मीडिया निवडला नाही"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"कोणतीही माहिती उपलब्ध नाही"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"स्क्रीन कास्‍ट करीत आहे"</string>
diff --git a/v7/mediarouter/res/values-ms-rMY/strings.xml b/v7/mediarouter/res/values-ms-rMY/strings.xml
index 4d7a0c8..2a4cd1c 100644
--- a/v7/mediarouter/res/values-ms-rMY/strings.xml
+++ b/v7/mediarouter/res/values-ms-rMY/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"Jeda"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"Kembangkan"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Runtuhkan"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"Seni album"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Tiada media dipilih"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Maklumat tidak tersedia"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Menghantar skrin"</string>
diff --git a/v7/mediarouter/res/values-my-rMM/strings.xml b/v7/mediarouter/res/values-my-rMM/strings.xml
index 9447089..eca8835 100644
--- a/v7/mediarouter/res/values-my-rMM/strings.xml
+++ b/v7/mediarouter/res/values-my-rMM/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"ခဏရပ်ရန်"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"ဖြန့်ချရန်၃"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"ခေါက်သိမ်းရန်..."</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"အယ်လ်ဘမ်ပုံ"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"မည်သည့်မီဒီမှ မရွေးချယ်ထားပါ"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"အချက်အလက် မရရှိနိုင်ပါ"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"တည်းဖြတ်ရေး မျက်နှာပြင်"</string>
diff --git a/v7/mediarouter/res/values-nb/strings.xml b/v7/mediarouter/res/values-nb/strings.xml
index aea341f..27f9f03 100644
--- a/v7/mediarouter/res/values-nb/strings.xml
+++ b/v7/mediarouter/res/values-nb/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"Sett på pause"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"Utvid"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Skjul"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"Albumgrafikk"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Du har ikke valgt noen medier"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Ingen informasjon er tilgjengelig"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Caster skjermen"</string>
diff --git a/v7/mediarouter/res/values-ne-rNP/strings.xml b/v7/mediarouter/res/values-ne-rNP/strings.xml
index d261553..6abadbf 100644
--- a/v7/mediarouter/res/values-ne-rNP/strings.xml
+++ b/v7/mediarouter/res/values-ne-rNP/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"रोक्नुहोस्"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"विस्तार गर्नुहोस्"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"संक्षिप्त पार्नुहोस्"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"एल्बम आर्ट"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"कुनै मिडिया चयन भएको छैन"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"जानकारी उपलब्ध छैन"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"स्क्रिन cast गर्दै"</string>
diff --git a/v7/mediarouter/res/values-nl/strings.xml b/v7/mediarouter/res/values-nl/strings.xml
index 7843b52..4a9346d 100644
--- a/v7/mediarouter/res/values-nl/strings.xml
+++ b/v7/mediarouter/res/values-nl/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"Onderbreken"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"Uitvouwen"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Samenvouwen"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"Albumhoes"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Geen media geselecteerd"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Geen informatie beschikbaar"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Scherm casten"</string>
diff --git a/v7/mediarouter/res/values-pa-rIN/strings.xml b/v7/mediarouter/res/values-pa-rIN/strings.xml
index 55dfd88..842a8b4 100644
--- a/v7/mediarouter/res/values-pa-rIN/strings.xml
+++ b/v7/mediarouter/res/values-pa-rIN/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"ਰੋਕੋ"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"ਵਿਸਤਾਰ ਕਰੋ"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"ਬੰਦ ਕਰੋ"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"ਐਲਬਮ ਆਰਟ"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"ਕੋਈ ਵੀ ਮੀਡੀਆ ਨਹੀਂ ਚੁਣਿਆ ਗਿਆ"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"ਕੋਈ ਜਾਣਕਾਰੀ ਉਪਲਬਧ ਨਹੀਂ"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"ਸਕ੍ਰੀਨ ਜੋੜ ਰਿਹਾ ਹੈ"</string>
diff --git a/v7/mediarouter/res/values-pl/strings.xml b/v7/mediarouter/res/values-pl/strings.xml
index c6e7f8a..d66be1a 100644
--- a/v7/mediarouter/res/values-pl/strings.xml
+++ b/v7/mediarouter/res/values-pl/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"Wstrzymaj"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"Rozwiń"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Zwiń"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"Okładka albumu"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nie wybrano multimediów"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Brak informacji"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Przesyłam ekran"</string>
diff --git a/v7/mediarouter/res/values-pt-rBR/strings.xml b/v7/mediarouter/res/values-pt-rBR/strings.xml
index 17e64f0..4d7e6cc 100644
--- a/v7/mediarouter/res/values-pt-rBR/strings.xml
+++ b/v7/mediarouter/res/values-pt-rBR/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"Pausar"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"Expandir"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Recolher"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"Arte do álbum"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nenhuma mídia selecionada"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Nenhuma informação disponível"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Transmitindo a tela"</string>
diff --git a/v7/mediarouter/res/values-pt-rPT/strings.xml b/v7/mediarouter/res/values-pt-rPT/strings.xml
index 3c9d4cb..0c68b92 100644
--- a/v7/mediarouter/res/values-pt-rPT/strings.xml
+++ b/v7/mediarouter/res/values-pt-rPT/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"Interromper"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"Expandir"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Reduzir"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"Imagem do álbum"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nenhum suporte multimédia selecionado"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Nenhuma informação disponível"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"A transmitir o ecrã"</string>
diff --git a/v7/mediarouter/res/values-pt/strings.xml b/v7/mediarouter/res/values-pt/strings.xml
index 17e64f0..4d7e6cc 100644
--- a/v7/mediarouter/res/values-pt/strings.xml
+++ b/v7/mediarouter/res/values-pt/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"Pausar"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"Expandir"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Recolher"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"Arte do álbum"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nenhuma mídia selecionada"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Nenhuma informação disponível"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Transmitindo a tela"</string>
diff --git a/v7/mediarouter/res/values-ro/strings.xml b/v7/mediarouter/res/values-ro/strings.xml
index 20c3b71..9fe26a9 100644
--- a/v7/mediarouter/res/values-ro/strings.xml
+++ b/v7/mediarouter/res/values-ro/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"Întrerupeți"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"Extindeți"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Restrângeți"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"Grafica albumului"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Niciun fișier media selectat"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Nu sunt disponibile informații"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Se proiectează ecranul"</string>
diff --git a/v7/mediarouter/res/values-ru/strings.xml b/v7/mediarouter/res/values-ru/strings.xml
index 5a47ec6..4607a8c 100644
--- a/v7/mediarouter/res/values-ru/strings.xml
+++ b/v7/mediarouter/res/values-ru/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"Приостановить"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"Развернуть"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Свернуть"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"Обложка"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Медиафайл не выбран"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Данных нет"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Подключение к удаленному монитору"</string>
diff --git a/v7/mediarouter/res/values-si-rLK/strings.xml b/v7/mediarouter/res/values-si-rLK/strings.xml
index 45f67ff..144a0d5 100644
--- a/v7/mediarouter/res/values-si-rLK/strings.xml
+++ b/v7/mediarouter/res/values-si-rLK/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"විරාම ගන්වන්න"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"දිග හරින්න"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"හකුළන්න"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"ඇල්බම කලාව"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"මාධ්‍යය තෝරා නැත"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"ලබා ගත හැකි තොරතුරු නොමැත"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"විකාශ තිරය"</string>
diff --git a/v7/mediarouter/res/values-sk/strings.xml b/v7/mediarouter/res/values-sk/strings.xml
index df95e00..b546bde 100644
--- a/v7/mediarouter/res/values-sk/strings.xml
+++ b/v7/mediarouter/res/values-sk/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"Pozastaviť"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"Rozbaliť"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Zbaliť"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"Obrázok albumu"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nie sú vybrané žiadne médiá"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Nie sú k dispozícii žiadne informácie"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Prenáša sa obrazovka"</string>
diff --git a/v7/mediarouter/res/values-sl/strings.xml b/v7/mediarouter/res/values-sl/strings.xml
index 6425222..110c548 100644
--- a/v7/mediarouter/res/values-sl/strings.xml
+++ b/v7/mediarouter/res/values-sl/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"Zaustavi"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"Razširi"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Strni"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"Naslovnica albuma"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Ni izbrane predstavnosti"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Podatki niso na voljo"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Predvajanje zaslona"</string>
diff --git a/v7/mediarouter/res/values-sq-rAL/strings.xml b/v7/mediarouter/res/values-sq-rAL/strings.xml
index 6f375cf..8ed93c3 100644
--- a/v7/mediarouter/res/values-sq-rAL/strings.xml
+++ b/v7/mediarouter/res/values-sq-rAL/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"Pauzë"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"Zgjeroje"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Palose"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"Kopertina e albumit"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nuk u zgjodh asnjë media"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Nuk jepet asnjë informacion"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Po transmeton ekranin"</string>
diff --git a/v7/mediarouter/res/values-sr/strings.xml b/v7/mediarouter/res/values-sr/strings.xml
index 26a36a9..5a72bd4 100644
--- a/v7/mediarouter/res/values-sr/strings.xml
+++ b/v7/mediarouter/res/values-sr/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"Паузирај"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"Прошири"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Скупи"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"Омот албума"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Нема изабраних медија"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Нису доступне никакве информације"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Пребацује се екран"</string>
diff --git a/v7/mediarouter/res/values-sv/strings.xml b/v7/mediarouter/res/values-sv/strings.xml
index 3e8c47b..3724902 100644
--- a/v7/mediarouter/res/values-sv/strings.xml
+++ b/v7/mediarouter/res/values-sv/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"Pausa"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"Utöka"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Komprimera"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"Skivomslag"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Inga media har valts"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Det finns ingen information"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Skärmen castas"</string>
diff --git a/v7/mediarouter/res/values-sw/strings.xml b/v7/mediarouter/res/values-sw/strings.xml
index 38fdb45..f12fd5c 100644
--- a/v7/mediarouter/res/values-sw/strings.xml
+++ b/v7/mediarouter/res/values-sw/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"Sitisha"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"Panua"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Kunja"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"Sanaa ya albamu"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Hakuna maudhui yaliyochaguliwa"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Hakuna maelezo yaliyopatikana"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Inatuma skrini"</string>
diff --git a/v7/mediarouter/res/values-ta-rIN/strings.xml b/v7/mediarouter/res/values-ta-rIN/strings.xml
index 6147b75..c314178 100644
--- a/v7/mediarouter/res/values-ta-rIN/strings.xml
+++ b/v7/mediarouter/res/values-ta-rIN/strings.xml
@@ -18,8 +18,8 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="5441529851481176817">"அமைப்பு"</string>
     <string name="mr_user_route_category_name" msgid="7498112907524977311">"சாதனங்கள்"</string>
-    <string name="mr_button_content_description" msgid="3698378085901466129">"அனுப்புதல் பொத்தான்"</string>
-    <string name="mr_chooser_title" msgid="414301941546135990">"இதற்கு அனுப்பு"</string>
+    <string name="mr_button_content_description" msgid="3698378085901466129">"திரையிடு பட்டன்"</string>
+    <string name="mr_chooser_title" msgid="414301941546135990">"இதில் திரையிடு"</string>
     <string name="mr_chooser_searching" msgid="6349900579507521956">"சாதனங்களைத் தேடுகிறது"</string>
     <string name="mr_controller_disconnect" msgid="1227264889412989580">"தொடர்பைத் துண்டி"</string>
     <string name="mr_controller_stop" msgid="4570331844078181931">"அனுப்புவதை நிறுத்து"</string>
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"இடைநிறுத்தும்"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"விரிவாக்கு"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"சுருக்கு"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"ஆல்பம் ஆர்ட்"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"மீடியா எதுவும் தேர்ந்தெடுக்கப்படவில்லை"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"தகவல் எதுவுமில்லை"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"திரையை அனுப்புகிறீர்கள்"</string>
diff --git a/v7/mediarouter/res/values-te-rIN/strings.xml b/v7/mediarouter/res/values-te-rIN/strings.xml
index 73c75f4..59a4f19 100644
--- a/v7/mediarouter/res/values-te-rIN/strings.xml
+++ b/v7/mediarouter/res/values-te-rIN/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"పాజ్ చేస్తుంది"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"విస్తరింపజేస్తుంది"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"కుదిస్తుంది"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"ఆల్బమ్ ఆర్ట్"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"మీడియా ఏదీ ఎంచుకోబడలేదు"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"సమాచారం అందుబాటులో లేదు"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"స్క్రీన్‌ను ప్రసారం చేస్తోంది"</string>
diff --git a/v7/mediarouter/res/values-th/strings.xml b/v7/mediarouter/res/values-th/strings.xml
index fdf0957..1bfd091 100644
--- a/v7/mediarouter/res/values-th/strings.xml
+++ b/v7/mediarouter/res/values-th/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"หยุดชั่วคราว"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"ขยาย"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"ยุบ"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"ปกอัลบั้ม"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"ไม่ได้เลือกสื่อไว้"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"ไม่มีข้อมูล"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"กำลังแคสต์หน้าจอ"</string>
diff --git a/v7/mediarouter/res/values-tl/strings.xml b/v7/mediarouter/res/values-tl/strings.xml
index 7c04b33..82396e1 100644
--- a/v7/mediarouter/res/values-tl/strings.xml
+++ b/v7/mediarouter/res/values-tl/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"I-pause"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"Palawakin"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"I-collapse"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"Album art"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Walang piniling media"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Walang available na impormasyon"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Kina-cast ang screen"</string>
diff --git a/v7/mediarouter/res/values-tr/strings.xml b/v7/mediarouter/res/values-tr/strings.xml
index f8316f4..e639963 100644
--- a/v7/mediarouter/res/values-tr/strings.xml
+++ b/v7/mediarouter/res/values-tr/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"Duraklat"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"Genişlet"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Daralt"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"Albüm kapağı"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Medya seçilmedi"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Bilgi yok"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Ekran yayınlanıyor"</string>
diff --git a/v7/mediarouter/res/values-uk/strings.xml b/v7/mediarouter/res/values-uk/strings.xml
index fd4e0d0..a768e2c 100644
--- a/v7/mediarouter/res/values-uk/strings.xml
+++ b/v7/mediarouter/res/values-uk/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"Призупинити"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"Розгорнути"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Згорнути"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"Обкладинка альбому"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Медіа-файл не вибрано"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Немає даних"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Трансляція екрана"</string>
diff --git a/v7/mediarouter/res/values-ur-rPK/strings.xml b/v7/mediarouter/res/values-ur-rPK/strings.xml
index afd5534..5cb3b36 100644
--- a/v7/mediarouter/res/values-ur-rPK/strings.xml
+++ b/v7/mediarouter/res/values-ur-rPK/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"موقوف کریں"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"پھیلائیں"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"سکیڑیں"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"البم آرٹ"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"کوئی میڈیا منتخب نہیں ہے"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"کوئی معلومات دستیاب نہیں"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"سکرین کاسٹ ہو رہی ہے"</string>
diff --git a/v7/mediarouter/res/values-uz-rUZ/strings.xml b/v7/mediarouter/res/values-uz-rUZ/strings.xml
index c13b06b..9955cdfd 100644
--- a/v7/mediarouter/res/values-uz-rUZ/strings.xml
+++ b/v7/mediarouter/res/values-uz-rUZ/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"To‘xtatib turish"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"Yoyish"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Yig‘ish"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"Albom muqovasi"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Multimedia tanlamagan"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Hech qanday ma’lumot yo‘q"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Ekranni translatsiya qilish"</string>
diff --git a/v7/mediarouter/res/values-vi/strings.xml b/v7/mediarouter/res/values-vi/strings.xml
index 3301cee..0080e3e 100644
--- a/v7/mediarouter/res/values-vi/strings.xml
+++ b/v7/mediarouter/res/values-vi/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"Tạm dừng"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"Mở rộng"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Thu gọn"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"Ảnh bìa album"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Không có phương tiện nào được chọn"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Không có thông tin nào"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Đang truyền màn hình"</string>
diff --git a/v7/mediarouter/res/values-zh-rCN/strings.xml b/v7/mediarouter/res/values-zh-rCN/strings.xml
index cdd66f5..aabe727 100644
--- a/v7/mediarouter/res/values-zh-rCN/strings.xml
+++ b/v7/mediarouter/res/values-zh-rCN/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"暂停"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"展开"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"折叠"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"专辑封面"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"未选择任何媒体"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"没有任何相关信息"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"正在投射屏幕"</string>
diff --git a/v7/mediarouter/res/values-zh-rHK/strings.xml b/v7/mediarouter/res/values-zh-rHK/strings.xml
index 873e5ce..d01c823 100644
--- a/v7/mediarouter/res/values-zh-rHK/strings.xml
+++ b/v7/mediarouter/res/values-zh-rHK/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"暫停"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"展開"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"收合"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"專輯封面"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"尚未選擇媒體"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"沒有詳細資料"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"正在投放螢幕"</string>
diff --git a/v7/mediarouter/res/values-zh-rTW/strings.xml b/v7/mediarouter/res/values-zh-rTW/strings.xml
index 27755e7..68347e5 100644
--- a/v7/mediarouter/res/values-zh-rTW/strings.xml
+++ b/v7/mediarouter/res/values-zh-rTW/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"暫停"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"展開"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"收合"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"專輯封面"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"未選取任何媒體"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"沒有可用的資訊"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"正在投放螢幕"</string>
diff --git a/v7/mediarouter/res/values-zu/strings.xml b/v7/mediarouter/res/values-zu/strings.xml
index f513fd4..e50acc8 100644
--- a/v7/mediarouter/res/values-zu/strings.xml
+++ b/v7/mediarouter/res/values-zu/strings.xml
@@ -28,6 +28,7 @@
     <string name="mr_controller_pause" msgid="5451884435510905406">"Misa isikhashana"</string>
     <string name="mr_controller_expand_group" msgid="8062427022744266907">"Nweba"</string>
     <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Goqa"</string>
+    <string name="mr_controller_album_art" msgid="6422801843540543585">"Ubuciko be-albhamu"</string>
     <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Ayikho imidiya ekhethiwe"</string>
     <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Alukho ulwazi olutholakalayo"</string>
     <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Isikrini sokusakaza"</string>
diff --git a/v7/mediarouter/src/android/support/v7/media/MediaControlIntent.java b/v7/mediarouter/src/android/support/v7/media/MediaControlIntent.java
index c827534..f1de234 100644
--- a/v7/mediarouter/src/android/support/v7/media/MediaControlIntent.java
+++ b/v7/mediarouter/src/android/support/v7/media/MediaControlIntent.java
@@ -202,7 +202,7 @@
  * <p>
  * When an application has a valid session, it is essentially in control of remote playback
  * on the route.  No other application can view or modify the remote playback state
- * of that applicaton's session without knowing its id.
+ * of that application's session without knowing its id.
  * </p><p>
  * However, other applications can perform actions that have the effect of stopping
  * playback and invalidating the current session.  When this occurs, the former application
diff --git a/v7/mediarouter/src/android/support/v7/media/RegisteredMediaRouteProvider.java b/v7/mediarouter/src/android/support/v7/media/RegisteredMediaRouteProvider.java
index e84276d..e4360b3 100644
--- a/v7/mediarouter/src/android/support/v7/media/RegisteredMediaRouteProvider.java
+++ b/v7/mediarouter/src/android/support/v7/media/RegisteredMediaRouteProvider.java
@@ -443,7 +443,7 @@
         public boolean onGenericFailure(int requestId) {
             if (requestId == mPendingRegisterRequestId) {
                 mPendingRegisterRequestId = 0;
-                onConnectionError(this, "Registation failed");
+                onConnectionError(this, "Registration failed");
             }
             ControlRequestCallback callback = mPendingCallbacks.get(requestId);
             if (callback != null) {
diff --git a/v7/palette/Android.mk b/v7/palette/Android.mk
index 814ef24..c689297 100644
--- a/v7/palette/Android.mk
+++ b/v7/palette/Android.mk
@@ -19,27 +19,19 @@
 #
 #   LOCAL_STATIC_ANDROID_LIBRARIES := \
 #       android-support-v7-palette \
-#       android-support-v4
+#       android-support-compat \
+#       android-support-core-utils
 #
 # in their makefiles to include the resources and their dependencies in their package.
 include $(CLEAR_VARS)
 LOCAL_USE_AAPT2 := true
 LOCAL_MODULE := android-support-v7-palette
-LOCAL_SDK_VERSION := 7
+LOCAL_SDK_VERSION := 9
 LOCAL_SRC_FILES := $(call all-java-files-under, src/main)
 LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
 LOCAL_MANIFEST_FILE := src/main/AndroidManifest.xml
-LOCAL_SHARED_ANDROID_LIBRARIES += android-support-v4
+LOCAL_SHARED_ANDROID_LIBRARIES += android-support-compat android-support-core-utils
 LOCAL_JAR_EXCLUDE_FILES := none
 LOCAL_JAVA_LANGUAGE_VERSION := 1.7
 LOCAL_AAPT_FLAGS := --add-javadoc-annotation doconly
 include $(BUILD_STATIC_JAVA_LIBRARY)
-
-# API Check
-# ---------------------------------------------
-support_module := $(LOCAL_MODULE)
-support_module_api_dir := $(LOCAL_PATH)/api
-support_module_src_files := $(LOCAL_SRC_FILES)
-support_module_java_libraries := $(LOCAL_JAVA_LIBRARIES)
-support_module_java_packages := android.support.v7.graphics
-include $(SUPPORT_API_CHECK)
diff --git a/v7/palette/api/22.0.0.txt b/v7/palette/api/22.0.0.txt
deleted file mode 100644
index 1a6e7b6..0000000
--- a/v7/palette/api/22.0.0.txt
+++ /dev/null
@@ -1,38 +0,0 @@
-package android.support.v7.graphics {
-
-  public final class Palette {
-    method public static android.support.v7.graphics.Palette from(java.util.List<android.support.v7.graphics.Palette.Swatch>);
-    method public static android.support.v7.graphics.Palette generate(android.graphics.Bitmap);
-    method public static android.support.v7.graphics.Palette generate(android.graphics.Bitmap, int);
-    method public static android.os.AsyncTask<android.graphics.Bitmap, java.lang.Void, android.support.v7.graphics.Palette> generateAsync(android.graphics.Bitmap, android.support.v7.graphics.Palette.PaletteAsyncListener);
-    method public static android.os.AsyncTask<android.graphics.Bitmap, java.lang.Void, android.support.v7.graphics.Palette> generateAsync(android.graphics.Bitmap, int, android.support.v7.graphics.Palette.PaletteAsyncListener);
-    method public int getDarkMutedColor(int);
-    method public android.support.v7.graphics.Palette.Swatch getDarkMutedSwatch();
-    method public int getDarkVibrantColor(int);
-    method public android.support.v7.graphics.Palette.Swatch getDarkVibrantSwatch();
-    method public int getLightMutedColor(int);
-    method public android.support.v7.graphics.Palette.Swatch getLightMutedSwatch();
-    method public int getLightVibrantColor(int);
-    method public android.support.v7.graphics.Palette.Swatch getLightVibrantSwatch();
-    method public int getMutedColor(int);
-    method public android.support.v7.graphics.Palette.Swatch getMutedSwatch();
-    method public java.util.List<android.support.v7.graphics.Palette.Swatch> getSwatches();
-    method public int getVibrantColor(int);
-    method public android.support.v7.graphics.Palette.Swatch getVibrantSwatch();
-  }
-
-  public static abstract interface Palette.PaletteAsyncListener {
-    method public abstract void onGenerated(android.support.v7.graphics.Palette);
-  }
-
-  public static final class Palette.Swatch {
-    ctor public Palette.Swatch(int, int);
-    method public int getBodyTextColor();
-    method public float[] getHsl();
-    method public int getPopulation();
-    method public int getRgb();
-    method public int getTitleTextColor();
-  }
-
-}
-
diff --git a/v7/palette/api/22.1.0.txt b/v7/palette/api/22.1.0.txt
deleted file mode 100644
index d92c0dd..0000000
--- a/v7/palette/api/22.1.0.txt
+++ /dev/null
@@ -1,48 +0,0 @@
-package android.support.v7.graphics {
-
-  public final class Palette {
-    method public static android.support.v7.graphics.Palette.Builder from(android.graphics.Bitmap);
-    method public static android.support.v7.graphics.Palette from(java.util.List<android.support.v7.graphics.Palette.Swatch>);
-    method public static deprecated android.support.v7.graphics.Palette generate(android.graphics.Bitmap);
-    method public static deprecated android.support.v7.graphics.Palette generate(android.graphics.Bitmap, int);
-    method public static deprecated android.os.AsyncTask<android.graphics.Bitmap, java.lang.Void, android.support.v7.graphics.Palette> generateAsync(android.graphics.Bitmap, android.support.v7.graphics.Palette.PaletteAsyncListener);
-    method public static deprecated android.os.AsyncTask<android.graphics.Bitmap, java.lang.Void, android.support.v7.graphics.Palette> generateAsync(android.graphics.Bitmap, int, android.support.v7.graphics.Palette.PaletteAsyncListener);
-    method public int getDarkMutedColor(int);
-    method public android.support.v7.graphics.Palette.Swatch getDarkMutedSwatch();
-    method public int getDarkVibrantColor(int);
-    method public android.support.v7.graphics.Palette.Swatch getDarkVibrantSwatch();
-    method public int getLightMutedColor(int);
-    method public android.support.v7.graphics.Palette.Swatch getLightMutedSwatch();
-    method public int getLightVibrantColor(int);
-    method public android.support.v7.graphics.Palette.Swatch getLightVibrantSwatch();
-    method public int getMutedColor(int);
-    method public android.support.v7.graphics.Palette.Swatch getMutedSwatch();
-    method public java.util.List<android.support.v7.graphics.Palette.Swatch> getSwatches();
-    method public int getVibrantColor(int);
-    method public android.support.v7.graphics.Palette.Swatch getVibrantSwatch();
-  }
-
-  public static final class Palette.Builder {
-    ctor public Palette.Builder(android.graphics.Bitmap);
-    ctor public Palette.Builder(java.util.List<android.support.v7.graphics.Palette.Swatch>);
-    method public android.support.v7.graphics.Palette generate();
-    method public android.os.AsyncTask<android.graphics.Bitmap, java.lang.Void, android.support.v7.graphics.Palette> generate(android.support.v7.graphics.Palette.PaletteAsyncListener);
-    method public android.support.v7.graphics.Palette.Builder maximumColorCount(int);
-    method public android.support.v7.graphics.Palette.Builder resizeBitmapSize(int);
-  }
-
-  public static abstract interface Palette.PaletteAsyncListener {
-    method public abstract void onGenerated(android.support.v7.graphics.Palette);
-  }
-
-  public static final class Palette.Swatch {
-    ctor public Palette.Swatch(int, int);
-    method public int getBodyTextColor();
-    method public float[] getHsl();
-    method public int getPopulation();
-    method public int getRgb();
-    method public int getTitleTextColor();
-  }
-
-}
-
diff --git a/v7/palette/api/22.2.0.txt b/v7/palette/api/22.2.0.txt
deleted file mode 100644
index d92c0dd..0000000
--- a/v7/palette/api/22.2.0.txt
+++ /dev/null
@@ -1,48 +0,0 @@
-package android.support.v7.graphics {
-
-  public final class Palette {
-    method public static android.support.v7.graphics.Palette.Builder from(android.graphics.Bitmap);
-    method public static android.support.v7.graphics.Palette from(java.util.List<android.support.v7.graphics.Palette.Swatch>);
-    method public static deprecated android.support.v7.graphics.Palette generate(android.graphics.Bitmap);
-    method public static deprecated android.support.v7.graphics.Palette generate(android.graphics.Bitmap, int);
-    method public static deprecated android.os.AsyncTask<android.graphics.Bitmap, java.lang.Void, android.support.v7.graphics.Palette> generateAsync(android.graphics.Bitmap, android.support.v7.graphics.Palette.PaletteAsyncListener);
-    method public static deprecated android.os.AsyncTask<android.graphics.Bitmap, java.lang.Void, android.support.v7.graphics.Palette> generateAsync(android.graphics.Bitmap, int, android.support.v7.graphics.Palette.PaletteAsyncListener);
-    method public int getDarkMutedColor(int);
-    method public android.support.v7.graphics.Palette.Swatch getDarkMutedSwatch();
-    method public int getDarkVibrantColor(int);
-    method public android.support.v7.graphics.Palette.Swatch getDarkVibrantSwatch();
-    method public int getLightMutedColor(int);
-    method public android.support.v7.graphics.Palette.Swatch getLightMutedSwatch();
-    method public int getLightVibrantColor(int);
-    method public android.support.v7.graphics.Palette.Swatch getLightVibrantSwatch();
-    method public int getMutedColor(int);
-    method public android.support.v7.graphics.Palette.Swatch getMutedSwatch();
-    method public java.util.List<android.support.v7.graphics.Palette.Swatch> getSwatches();
-    method public int getVibrantColor(int);
-    method public android.support.v7.graphics.Palette.Swatch getVibrantSwatch();
-  }
-
-  public static final class Palette.Builder {
-    ctor public Palette.Builder(android.graphics.Bitmap);
-    ctor public Palette.Builder(java.util.List<android.support.v7.graphics.Palette.Swatch>);
-    method public android.support.v7.graphics.Palette generate();
-    method public android.os.AsyncTask<android.graphics.Bitmap, java.lang.Void, android.support.v7.graphics.Palette> generate(android.support.v7.graphics.Palette.PaletteAsyncListener);
-    method public android.support.v7.graphics.Palette.Builder maximumColorCount(int);
-    method public android.support.v7.graphics.Palette.Builder resizeBitmapSize(int);
-  }
-
-  public static abstract interface Palette.PaletteAsyncListener {
-    method public abstract void onGenerated(android.support.v7.graphics.Palette);
-  }
-
-  public static final class Palette.Swatch {
-    ctor public Palette.Swatch(int, int);
-    method public int getBodyTextColor();
-    method public float[] getHsl();
-    method public int getPopulation();
-    method public int getRgb();
-    method public int getTitleTextColor();
-  }
-
-}
-
diff --git a/v7/palette/api/22.2.1.txt b/v7/palette/api/22.2.1.txt
deleted file mode 100644
index d92c0dd..0000000
--- a/v7/palette/api/22.2.1.txt
+++ /dev/null
@@ -1,48 +0,0 @@
-package android.support.v7.graphics {
-
-  public final class Palette {
-    method public static android.support.v7.graphics.Palette.Builder from(android.graphics.Bitmap);
-    method public static android.support.v7.graphics.Palette from(java.util.List<android.support.v7.graphics.Palette.Swatch>);
-    method public static deprecated android.support.v7.graphics.Palette generate(android.graphics.Bitmap);
-    method public static deprecated android.support.v7.graphics.Palette generate(android.graphics.Bitmap, int);
-    method public static deprecated android.os.AsyncTask<android.graphics.Bitmap, java.lang.Void, android.support.v7.graphics.Palette> generateAsync(android.graphics.Bitmap, android.support.v7.graphics.Palette.PaletteAsyncListener);
-    method public static deprecated android.os.AsyncTask<android.graphics.Bitmap, java.lang.Void, android.support.v7.graphics.Palette> generateAsync(android.graphics.Bitmap, int, android.support.v7.graphics.Palette.PaletteAsyncListener);
-    method public int getDarkMutedColor(int);
-    method public android.support.v7.graphics.Palette.Swatch getDarkMutedSwatch();
-    method public int getDarkVibrantColor(int);
-    method public android.support.v7.graphics.Palette.Swatch getDarkVibrantSwatch();
-    method public int getLightMutedColor(int);
-    method public android.support.v7.graphics.Palette.Swatch getLightMutedSwatch();
-    method public int getLightVibrantColor(int);
-    method public android.support.v7.graphics.Palette.Swatch getLightVibrantSwatch();
-    method public int getMutedColor(int);
-    method public android.support.v7.graphics.Palette.Swatch getMutedSwatch();
-    method public java.util.List<android.support.v7.graphics.Palette.Swatch> getSwatches();
-    method public int getVibrantColor(int);
-    method public android.support.v7.graphics.Palette.Swatch getVibrantSwatch();
-  }
-
-  public static final class Palette.Builder {
-    ctor public Palette.Builder(android.graphics.Bitmap);
-    ctor public Palette.Builder(java.util.List<android.support.v7.graphics.Palette.Swatch>);
-    method public android.support.v7.graphics.Palette generate();
-    method public android.os.AsyncTask<android.graphics.Bitmap, java.lang.Void, android.support.v7.graphics.Palette> generate(android.support.v7.graphics.Palette.PaletteAsyncListener);
-    method public android.support.v7.graphics.Palette.Builder maximumColorCount(int);
-    method public android.support.v7.graphics.Palette.Builder resizeBitmapSize(int);
-  }
-
-  public static abstract interface Palette.PaletteAsyncListener {
-    method public abstract void onGenerated(android.support.v7.graphics.Palette);
-  }
-
-  public static final class Palette.Swatch {
-    ctor public Palette.Swatch(int, int);
-    method public int getBodyTextColor();
-    method public float[] getHsl();
-    method public int getPopulation();
-    method public int getRgb();
-    method public int getTitleTextColor();
-  }
-
-}
-
diff --git a/v7/palette/api/23.0.0.txt b/v7/palette/api/23.0.0.txt
deleted file mode 100644
index 1b6c745..0000000
--- a/v7/palette/api/23.0.0.txt
+++ /dev/null
@@ -1,54 +0,0 @@
-package android.support.v7.graphics {
-
-  public final class Palette {
-    method public static android.support.v7.graphics.Palette.Builder from(android.graphics.Bitmap);
-    method public static android.support.v7.graphics.Palette from(java.util.List<android.support.v7.graphics.Palette.Swatch>);
-    method public static deprecated android.support.v7.graphics.Palette generate(android.graphics.Bitmap);
-    method public static deprecated android.support.v7.graphics.Palette generate(android.graphics.Bitmap, int);
-    method public static deprecated android.os.AsyncTask<android.graphics.Bitmap, java.lang.Void, android.support.v7.graphics.Palette> generateAsync(android.graphics.Bitmap, android.support.v7.graphics.Palette.PaletteAsyncListener);
-    method public static deprecated android.os.AsyncTask<android.graphics.Bitmap, java.lang.Void, android.support.v7.graphics.Palette> generateAsync(android.graphics.Bitmap, int, android.support.v7.graphics.Palette.PaletteAsyncListener);
-    method public int getDarkMutedColor(int);
-    method public android.support.v7.graphics.Palette.Swatch getDarkMutedSwatch();
-    method public int getDarkVibrantColor(int);
-    method public android.support.v7.graphics.Palette.Swatch getDarkVibrantSwatch();
-    method public int getLightMutedColor(int);
-    method public android.support.v7.graphics.Palette.Swatch getLightMutedSwatch();
-    method public int getLightVibrantColor(int);
-    method public android.support.v7.graphics.Palette.Swatch getLightVibrantSwatch();
-    method public int getMutedColor(int);
-    method public android.support.v7.graphics.Palette.Swatch getMutedSwatch();
-    method public java.util.List<android.support.v7.graphics.Palette.Swatch> getSwatches();
-    method public int getVibrantColor(int);
-    method public android.support.v7.graphics.Palette.Swatch getVibrantSwatch();
-  }
-
-  public static final class Palette.Builder {
-    ctor public Palette.Builder(android.graphics.Bitmap);
-    ctor public Palette.Builder(java.util.List<android.support.v7.graphics.Palette.Swatch>);
-    method public android.support.v7.graphics.Palette.Builder addFilter(android.support.v7.graphics.Palette.Filter);
-    method public android.support.v7.graphics.Palette.Builder clearFilters();
-    method public android.support.v7.graphics.Palette generate();
-    method public android.os.AsyncTask<android.graphics.Bitmap, java.lang.Void, android.support.v7.graphics.Palette> generate(android.support.v7.graphics.Palette.PaletteAsyncListener);
-    method public android.support.v7.graphics.Palette.Builder maximumColorCount(int);
-    method public android.support.v7.graphics.Palette.Builder resizeBitmapSize(int);
-  }
-
-  public static abstract interface Palette.Filter {
-    method public abstract boolean isAllowed(int, float[]);
-  }
-
-  public static abstract interface Palette.PaletteAsyncListener {
-    method public abstract void onGenerated(android.support.v7.graphics.Palette);
-  }
-
-  public static final class Palette.Swatch {
-    ctor public Palette.Swatch(int, int);
-    method public int getBodyTextColor();
-    method public float[] getHsl();
-    method public int getPopulation();
-    method public int getRgb();
-    method public int getTitleTextColor();
-  }
-
-}
-
diff --git a/v7/palette/api/23.1.0.txt b/v7/palette/api/23.1.0.txt
deleted file mode 100644
index fac6a55..0000000
--- a/v7/palette/api/23.1.0.txt
+++ /dev/null
@@ -1,56 +0,0 @@
-package android.support.v7.graphics {
-
-  public final class Palette {
-    method public static android.support.v7.graphics.Palette.Builder from(android.graphics.Bitmap);
-    method public static android.support.v7.graphics.Palette from(java.util.List<android.support.v7.graphics.Palette.Swatch>);
-    method public static deprecated android.support.v7.graphics.Palette generate(android.graphics.Bitmap);
-    method public static deprecated android.support.v7.graphics.Palette generate(android.graphics.Bitmap, int);
-    method public static deprecated android.os.AsyncTask<android.graphics.Bitmap, java.lang.Void, android.support.v7.graphics.Palette> generateAsync(android.graphics.Bitmap, android.support.v7.graphics.Palette.PaletteAsyncListener);
-    method public static deprecated android.os.AsyncTask<android.graphics.Bitmap, java.lang.Void, android.support.v7.graphics.Palette> generateAsync(android.graphics.Bitmap, int, android.support.v7.graphics.Palette.PaletteAsyncListener);
-    method public int getDarkMutedColor(int);
-    method public android.support.v7.graphics.Palette.Swatch getDarkMutedSwatch();
-    method public int getDarkVibrantColor(int);
-    method public android.support.v7.graphics.Palette.Swatch getDarkVibrantSwatch();
-    method public int getLightMutedColor(int);
-    method public android.support.v7.graphics.Palette.Swatch getLightMutedSwatch();
-    method public int getLightVibrantColor(int);
-    method public android.support.v7.graphics.Palette.Swatch getLightVibrantSwatch();
-    method public int getMutedColor(int);
-    method public android.support.v7.graphics.Palette.Swatch getMutedSwatch();
-    method public java.util.List<android.support.v7.graphics.Palette.Swatch> getSwatches();
-    method public int getVibrantColor(int);
-    method public android.support.v7.graphics.Palette.Swatch getVibrantSwatch();
-  }
-
-  public static final class Palette.Builder {
-    ctor public Palette.Builder(android.graphics.Bitmap);
-    ctor public Palette.Builder(java.util.List<android.support.v7.graphics.Palette.Swatch>);
-    method public android.support.v7.graphics.Palette.Builder addFilter(android.support.v7.graphics.Palette.Filter);
-    method public android.support.v7.graphics.Palette.Builder clearFilters();
-    method public android.support.v7.graphics.Palette.Builder clearRegion();
-    method public android.support.v7.graphics.Palette generate();
-    method public android.os.AsyncTask<android.graphics.Bitmap, java.lang.Void, android.support.v7.graphics.Palette> generate(android.support.v7.graphics.Palette.PaletteAsyncListener);
-    method public android.support.v7.graphics.Palette.Builder maximumColorCount(int);
-    method public android.support.v7.graphics.Palette.Builder resizeBitmapSize(int);
-    method public android.support.v7.graphics.Palette.Builder setRegion(int, int, int, int);
-  }
-
-  public static abstract interface Palette.Filter {
-    method public abstract boolean isAllowed(int, float[]);
-  }
-
-  public static abstract interface Palette.PaletteAsyncListener {
-    method public abstract void onGenerated(android.support.v7.graphics.Palette);
-  }
-
-  public static final class Palette.Swatch {
-    ctor public Palette.Swatch(int, int);
-    method public int getBodyTextColor();
-    method public float[] getHsl();
-    method public int getPopulation();
-    method public int getRgb();
-    method public int getTitleTextColor();
-  }
-
-}
-
diff --git a/v7/palette/api/23.1.1.txt b/v7/palette/api/23.1.1.txt
deleted file mode 100644
index fac6a55..0000000
--- a/v7/palette/api/23.1.1.txt
+++ /dev/null
@@ -1,56 +0,0 @@
-package android.support.v7.graphics {
-
-  public final class Palette {
-    method public static android.support.v7.graphics.Palette.Builder from(android.graphics.Bitmap);
-    method public static android.support.v7.graphics.Palette from(java.util.List<android.support.v7.graphics.Palette.Swatch>);
-    method public static deprecated android.support.v7.graphics.Palette generate(android.graphics.Bitmap);
-    method public static deprecated android.support.v7.graphics.Palette generate(android.graphics.Bitmap, int);
-    method public static deprecated android.os.AsyncTask<android.graphics.Bitmap, java.lang.Void, android.support.v7.graphics.Palette> generateAsync(android.graphics.Bitmap, android.support.v7.graphics.Palette.PaletteAsyncListener);
-    method public static deprecated android.os.AsyncTask<android.graphics.Bitmap, java.lang.Void, android.support.v7.graphics.Palette> generateAsync(android.graphics.Bitmap, int, android.support.v7.graphics.Palette.PaletteAsyncListener);
-    method public int getDarkMutedColor(int);
-    method public android.support.v7.graphics.Palette.Swatch getDarkMutedSwatch();
-    method public int getDarkVibrantColor(int);
-    method public android.support.v7.graphics.Palette.Swatch getDarkVibrantSwatch();
-    method public int getLightMutedColor(int);
-    method public android.support.v7.graphics.Palette.Swatch getLightMutedSwatch();
-    method public int getLightVibrantColor(int);
-    method public android.support.v7.graphics.Palette.Swatch getLightVibrantSwatch();
-    method public int getMutedColor(int);
-    method public android.support.v7.graphics.Palette.Swatch getMutedSwatch();
-    method public java.util.List<android.support.v7.graphics.Palette.Swatch> getSwatches();
-    method public int getVibrantColor(int);
-    method public android.support.v7.graphics.Palette.Swatch getVibrantSwatch();
-  }
-
-  public static final class Palette.Builder {
-    ctor public Palette.Builder(android.graphics.Bitmap);
-    ctor public Palette.Builder(java.util.List<android.support.v7.graphics.Palette.Swatch>);
-    method public android.support.v7.graphics.Palette.Builder addFilter(android.support.v7.graphics.Palette.Filter);
-    method public android.support.v7.graphics.Palette.Builder clearFilters();
-    method public android.support.v7.graphics.Palette.Builder clearRegion();
-    method public android.support.v7.graphics.Palette generate();
-    method public android.os.AsyncTask<android.graphics.Bitmap, java.lang.Void, android.support.v7.graphics.Palette> generate(android.support.v7.graphics.Palette.PaletteAsyncListener);
-    method public android.support.v7.graphics.Palette.Builder maximumColorCount(int);
-    method public android.support.v7.graphics.Palette.Builder resizeBitmapSize(int);
-    method public android.support.v7.graphics.Palette.Builder setRegion(int, int, int, int);
-  }
-
-  public static abstract interface Palette.Filter {
-    method public abstract boolean isAllowed(int, float[]);
-  }
-
-  public static abstract interface Palette.PaletteAsyncListener {
-    method public abstract void onGenerated(android.support.v7.graphics.Palette);
-  }
-
-  public static final class Palette.Swatch {
-    ctor public Palette.Swatch(int, int);
-    method public int getBodyTextColor();
-    method public float[] getHsl();
-    method public int getPopulation();
-    method public int getRgb();
-    method public int getTitleTextColor();
-  }
-
-}
-
diff --git a/v7/palette/api/current.txt b/v7/palette/api/current.txt
deleted file mode 100644
index 3b24b77..0000000
--- a/v7/palette/api/current.txt
+++ /dev/null
@@ -1,97 +0,0 @@
-package android.support.v7.graphics {
-
-  public final class Palette {
-    method public static android.support.v7.graphics.Palette.Builder from(android.graphics.Bitmap);
-    method public static android.support.v7.graphics.Palette from(java.util.List<android.support.v7.graphics.Palette.Swatch>);
-    method public static deprecated android.support.v7.graphics.Palette generate(android.graphics.Bitmap);
-    method public static deprecated android.support.v7.graphics.Palette generate(android.graphics.Bitmap, int);
-    method public static deprecated android.os.AsyncTask<android.graphics.Bitmap, java.lang.Void, android.support.v7.graphics.Palette> generateAsync(android.graphics.Bitmap, android.support.v7.graphics.Palette.PaletteAsyncListener);
-    method public static deprecated android.os.AsyncTask<android.graphics.Bitmap, java.lang.Void, android.support.v7.graphics.Palette> generateAsync(android.graphics.Bitmap, int, android.support.v7.graphics.Palette.PaletteAsyncListener);
-    method public int getColorForTarget(android.support.v7.graphics.Target, int);
-    method public int getDarkMutedColor(int);
-    method public android.support.v7.graphics.Palette.Swatch getDarkMutedSwatch();
-    method public int getDarkVibrantColor(int);
-    method public android.support.v7.graphics.Palette.Swatch getDarkVibrantSwatch();
-    method public int getLightMutedColor(int);
-    method public android.support.v7.graphics.Palette.Swatch getLightMutedSwatch();
-    method public int getLightVibrantColor(int);
-    method public android.support.v7.graphics.Palette.Swatch getLightVibrantSwatch();
-    method public int getMutedColor(int);
-    method public android.support.v7.graphics.Palette.Swatch getMutedSwatch();
-    method public android.support.v7.graphics.Palette.Swatch getSwatchForTarget(android.support.v7.graphics.Target);
-    method public java.util.List<android.support.v7.graphics.Palette.Swatch> getSwatches();
-    method public java.util.List<android.support.v7.graphics.Target> getTargets();
-    method public int getVibrantColor(int);
-    method public android.support.v7.graphics.Palette.Swatch getVibrantSwatch();
-  }
-
-  public static final class Palette.Builder {
-    ctor public Palette.Builder(android.graphics.Bitmap);
-    ctor public Palette.Builder(java.util.List<android.support.v7.graphics.Palette.Swatch>);
-    method public android.support.v7.graphics.Palette.Builder addFilter(android.support.v7.graphics.Palette.Filter);
-    method public android.support.v7.graphics.Palette.Builder addTarget(android.support.v7.graphics.Target);
-    method public android.support.v7.graphics.Palette.Builder clearFilters();
-    method public android.support.v7.graphics.Palette.Builder clearRegion();
-    method public android.support.v7.graphics.Palette.Builder clearTargets();
-    method public android.support.v7.graphics.Palette generate();
-    method public android.os.AsyncTask<android.graphics.Bitmap, java.lang.Void, android.support.v7.graphics.Palette> generate(android.support.v7.graphics.Palette.PaletteAsyncListener);
-    method public android.support.v7.graphics.Palette.Builder maximumColorCount(int);
-    method public android.support.v7.graphics.Palette.Builder resizeBitmapArea(int);
-    method public deprecated android.support.v7.graphics.Palette.Builder resizeBitmapSize(int);
-    method public android.support.v7.graphics.Palette.Builder setRegion(int, int, int, int);
-  }
-
-  public static abstract interface Palette.Filter {
-    method public abstract boolean isAllowed(int, float[]);
-  }
-
-  public static abstract interface Palette.PaletteAsyncListener {
-    method public abstract void onGenerated(android.support.v7.graphics.Palette);
-  }
-
-  public static final class Palette.Swatch {
-    ctor public Palette.Swatch(int, int);
-    method public int getBodyTextColor();
-    method public float[] getHsl();
-    method public int getPopulation();
-    method public int getRgb();
-    method public int getTitleTextColor();
-  }
-
-  public final class Target {
-    method public float getLightnessWeight();
-    method public float getMaximumLightness();
-    method public float getMaximumSaturation();
-    method public float getMinimumLightness();
-    method public float getMinimumSaturation();
-    method public float getPopulationWeight();
-    method public float getSaturationWeight();
-    method public float getTargetLightness();
-    method public float getTargetSaturation();
-    method public boolean isExclusive();
-    field public static final android.support.v7.graphics.Target DARK_MUTED;
-    field public static final android.support.v7.graphics.Target DARK_VIBRANT;
-    field public static final android.support.v7.graphics.Target LIGHT_MUTED;
-    field public static final android.support.v7.graphics.Target LIGHT_VIBRANT;
-    field public static final android.support.v7.graphics.Target MUTED;
-    field public static final android.support.v7.graphics.Target VIBRANT;
-  }
-
-  public static final class Target.Builder {
-    ctor public Target.Builder();
-    ctor public Target.Builder(android.support.v7.graphics.Target);
-    method public android.support.v7.graphics.Target build();
-    method public android.support.v7.graphics.Target.Builder setExclusive(boolean);
-    method public android.support.v7.graphics.Target.Builder setLightnessWeight(float);
-    method public android.support.v7.graphics.Target.Builder setMaximumLightness(float);
-    method public android.support.v7.graphics.Target.Builder setMaximumSaturation(float);
-    method public android.support.v7.graphics.Target.Builder setMinimumLightness(float);
-    method public android.support.v7.graphics.Target.Builder setMinimumSaturation(float);
-    method public android.support.v7.graphics.Target.Builder setPopulationWeight(float);
-    method public android.support.v7.graphics.Target.Builder setSaturationWeight(float);
-    method public android.support.v7.graphics.Target.Builder setTargetLightness(float);
-    method public android.support.v7.graphics.Target.Builder setTargetSaturation(float);
-  }
-
-}
-
diff --git a/v7/palette/api/removed.txt b/v7/palette/api/removed.txt
deleted file mode 100644
index e69de29..0000000
--- a/v7/palette/api/removed.txt
+++ /dev/null
diff --git a/v7/palette/build.gradle b/v7/palette/build.gradle
index 65e298d..b87a842 100644
--- a/v7/palette/build.gradle
+++ b/v7/palette/build.gradle
@@ -3,7 +3,8 @@
 archivesBaseName = 'palette-v7'
 
 dependencies {
-    compile project(':support-v4')
+    compile project(':support-compat')
+    compile project(':support-core-utils')
 
     androidTestCompile ('com.android.support.test:runner:0.4.1') {
         exclude module: 'support-annotations'
@@ -12,10 +13,10 @@
 }
 
 android {
-    compileSdkVersion 7
+    compileSdkVersion 9
 
     defaultConfig {
-        minSdkVersion 7
+        minSdkVersion 9
         testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
     }
 
diff --git a/v7/palette/src/androidTest/AndroidManifest.xml b/v7/palette/src/androidTest/AndroidManifest.xml
index f9b8b1e..c4fd08f 100644
--- a/v7/palette/src/androidTest/AndroidManifest.xml
+++ b/v7/palette/src/androidTest/AndroidManifest.xml
@@ -18,7 +18,7 @@
           xmlns:tools="http://schemas.android.com/tools"
           package="android.support.v7.palette.test">
 
-    <uses-sdk android:minSdkVersion="7"
+    <uses-sdk android:minSdkVersion="9"
               tools:overrideLibrary="android.support.test, android.app, android.support.test.rule"/>
 
     <application>
diff --git a/v7/palette/src/main/AndroidManifest.xml b/v7/palette/src/main/AndroidManifest.xml
index 20e14c2..c44818a 100644
--- a/v7/palette/src/main/AndroidManifest.xml
+++ b/v7/palette/src/main/AndroidManifest.xml
@@ -15,7 +15,7 @@
 -->
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
           package="android.support.v7.palette">
-    <uses-sdk android:minSdkVersion="7"/>
+    <uses-sdk android:minSdkVersion="9"/>
     <application>
     </application>
 </manifest>
diff --git a/v7/palette/src/main/java/android/support/v7/graphics/Palette.java b/v7/palette/src/main/java/android/support/v7/graphics/Palette.java
index f729380..dec03b2 100644
--- a/v7/palette/src/main/java/android/support/v7/graphics/Palette.java
+++ b/v7/palette/src/main/java/android/support/v7/graphics/Palette.java
@@ -656,7 +656,7 @@
          * the greater time it will take to generate the palette. The smaller the image is, the
          * more detail is lost in the resulting image and thus less precision for color selection.
          *
-         * @param area the number of pixels that the intemediary scaled down Bitmap should cover,
+         * @param area the number of pixels that the intermediary scaled down Bitmap should cover,
          *             or any value <= 0 to disable resizing.
          */
         @NonNull
diff --git a/v7/preference/Android.mk b/v7/preference/Android.mk
index 43fc74c..6bfd7e8 100644
--- a/v7/preference/Android.mk
+++ b/v7/preference/Android.mk
@@ -43,7 +43,7 @@
 include $(CLEAR_VARS)
 LOCAL_USE_AAPT2 := true
 LOCAL_MODULE := android-support-v7-preference
-LOCAL_SDK_VERSION := 7
+LOCAL_SDK_VERSION := 9
 LOCAL_SDK_RES_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
 LOCAL_SRC_FILES := $(call all-java-files-under,src)
 LOCAL_STATIC_ANDROID_LIBRARIES := \
@@ -57,12 +57,3 @@
 LOCAL_JAVA_LANGUAGE_VERSION := 1.7
 LOCAL_AAPT_FLAGS := --add-javadoc-annotation doconly
 include $(BUILD_STATIC_JAVA_LIBRARY)
-
-# API Check
-# ---------------------------------------------
-support_module := $(LOCAL_MODULE)
-support_module_api_dir := $(LOCAL_PATH)/api
-support_module_src_files := $(LOCAL_SRC_FILES)
-support_module_java_libraries := $(LOCAL_JAVA_LIBRARIES)
-support_module_java_packages := android.support.v7.preference
-include $(SUPPORT_API_CHECK)
diff --git a/v7/preference/AndroidManifest.xml b/v7/preference/AndroidManifest.xml
index e5aa094..da9c80e 100644
--- a/v7/preference/AndroidManifest.xml
+++ b/v7/preference/AndroidManifest.xml
@@ -3,6 +3,6 @@
     package="android.support.v7.preference"
     android:versionCode="1"
     android:versionName="1.0">
-    <uses-sdk android:minSdkVersion="7" />
+    <uses-sdk android:minSdkVersion="9" />
     <application />
 </manifest>
diff --git a/v7/preference/api/23.0.0.txt b/v7/preference/api/23.0.0.txt
deleted file mode 100644
index 6ab53c5..0000000
--- a/v7/preference/api/23.0.0.txt
+++ /dev/null
@@ -1,319 +0,0 @@
-package android.support.v7.preference {
-
-  public class CheckBoxPreference extends android.support.v7.preference.TwoStatePreference {
-    ctor public CheckBoxPreference(android.content.Context, android.util.AttributeSet, int);
-    ctor public CheckBoxPreference(android.content.Context, android.util.AttributeSet, int, int);
-    ctor public CheckBoxPreference(android.content.Context, android.util.AttributeSet);
-    ctor public CheckBoxPreference(android.content.Context);
-  }
-
-  public abstract class DialogPreference extends android.support.v7.preference.Preference {
-    ctor public DialogPreference(android.content.Context, android.util.AttributeSet, int, int);
-    ctor public DialogPreference(android.content.Context, android.util.AttributeSet, int);
-    ctor public DialogPreference(android.content.Context, android.util.AttributeSet);
-    ctor public DialogPreference(android.content.Context);
-    method public android.graphics.drawable.Drawable getDialogIcon();
-    method public int getDialogLayoutResource();
-    method public java.lang.CharSequence getDialogMessage();
-    method public java.lang.CharSequence getDialogTitle();
-    method public java.lang.CharSequence getNegativeButtonText();
-    method public java.lang.CharSequence getPositiveButtonText();
-    method public void setDialogIcon(android.graphics.drawable.Drawable);
-    method public void setDialogIcon(int);
-    method public void setDialogLayoutResource(int);
-    method public void setDialogMessage(java.lang.CharSequence);
-    method public void setDialogMessage(int);
-    method public void setDialogTitle(java.lang.CharSequence);
-    method public void setDialogTitle(int);
-    method public void setNegativeButtonText(java.lang.CharSequence);
-    method public void setNegativeButtonText(int);
-    method public void setPositiveButtonText(java.lang.CharSequence);
-    method public void setPositiveButtonText(int);
-  }
-
-  public static abstract interface DialogPreference.TargetFragment {
-    method public abstract android.support.v7.preference.Preference findPreference(java.lang.CharSequence);
-  }
-
-  public class EditTextPreference extends android.support.v7.preference.DialogPreference {
-    ctor public EditTextPreference(android.content.Context, android.util.AttributeSet, int, int);
-    ctor public EditTextPreference(android.content.Context, android.util.AttributeSet, int);
-    ctor public EditTextPreference(android.content.Context, android.util.AttributeSet);
-    ctor public EditTextPreference(android.content.Context);
-    method public java.lang.String getText();
-    method public void setText(java.lang.String);
-  }
-
-  public class EditTextPreferenceDialogFragmentCompat extends android.support.v7.preference.PreferenceDialogFragmentCompat {
-    ctor public EditTextPreferenceDialogFragmentCompat();
-    method public static android.support.v7.preference.EditTextPreferenceDialogFragmentCompat newInstance(java.lang.String);
-    method protected void onAddEditTextToDialogView(android.view.View, android.widget.EditText);
-    method public void onDialogClosed(boolean);
-  }
-
-  public class ListPreference extends android.support.v7.preference.DialogPreference {
-    ctor public ListPreference(android.content.Context, android.util.AttributeSet, int, int);
-    ctor public ListPreference(android.content.Context, android.util.AttributeSet, int);
-    ctor public ListPreference(android.content.Context, android.util.AttributeSet);
-    ctor public ListPreference(android.content.Context);
-    method public int findIndexOfValue(java.lang.String);
-    method public java.lang.CharSequence[] getEntries();
-    method public java.lang.CharSequence getEntry();
-    method public java.lang.CharSequence[] getEntryValues();
-    method public java.lang.String getValue();
-    method public void setEntries(java.lang.CharSequence[]);
-    method public void setEntries(int);
-    method public void setEntryValues(java.lang.CharSequence[]);
-    method public void setEntryValues(int);
-    method public void setValue(java.lang.String);
-    method public void setValueIndex(int);
-  }
-
-  public class ListPreferenceDialogFragmentCompat extends android.support.v7.preference.PreferenceDialogFragmentCompat {
-    ctor public ListPreferenceDialogFragmentCompat();
-    method public static android.support.v7.preference.ListPreferenceDialogFragmentCompat newInstance(java.lang.String);
-    method public void onDialogClosed(boolean);
-  }
-
-  public class Preference {
-    ctor public Preference(android.content.Context, android.util.AttributeSet, int, int);
-    ctor public Preference(android.content.Context, android.util.AttributeSet, int);
-    ctor public Preference(android.content.Context, android.util.AttributeSet);
-    ctor public Preference(android.content.Context);
-    method public boolean callChangeListener(java.lang.Object);
-    method public int compareTo(android.support.v7.preference.Preference);
-    method protected android.support.v7.preference.Preference findPreferenceInHierarchy(java.lang.String);
-    method public android.content.Context getContext();
-    method public java.lang.String getDependency();
-    method public android.os.Bundle getExtras();
-    method public java.lang.String getFragment();
-    method public android.graphics.drawable.Drawable getIcon();
-    method public android.content.Intent getIntent();
-    method public java.lang.String getKey();
-    method public final int getLayoutResource();
-    method public android.support.v7.preference.Preference.OnPreferenceChangeListener getOnPreferenceChangeListener();
-    method public android.support.v7.preference.Preference.OnPreferenceClickListener getOnPreferenceClickListener();
-    method public int getOrder();
-    method protected boolean getPersistedBoolean(boolean);
-    method protected float getPersistedFloat(float);
-    method protected int getPersistedInt(int);
-    method protected long getPersistedLong(long);
-    method protected java.lang.String getPersistedString(java.lang.String);
-    method public android.support.v7.preference.PreferenceManager getPreferenceManager();
-    method public android.content.SharedPreferences getSharedPreferences();
-    method public boolean getShouldDisableView();
-    method public java.lang.CharSequence getSummary();
-    method public java.lang.CharSequence getTitle();
-    method public final int getWidgetLayoutResource();
-    method public boolean hasKey();
-    method public boolean isEnabled();
-    method public boolean isPersistent();
-    method public boolean isSelectable();
-    method public final boolean isVisible();
-    method protected void notifyChanged();
-    method public void notifyDependencyChange(boolean);
-    method protected void notifyHierarchyChanged();
-    method public void onAttached();
-    method protected void onAttachedToHierarchy(android.support.v7.preference.PreferenceManager);
-    method public void onBindViewHolder(android.support.v7.preference.PreferenceViewHolder);
-    method protected void onClick();
-    method public void onDependencyChanged(android.support.v7.preference.Preference, boolean);
-    method protected java.lang.Object onGetDefaultValue(android.content.res.TypedArray, int);
-    method public void onParentChanged(android.support.v7.preference.Preference, boolean);
-    method protected void onPrepareForRemoval();
-    method protected void onRestoreInstanceState(android.os.Parcelable);
-    method protected android.os.Parcelable onSaveInstanceState();
-    method protected void onSetInitialValue(boolean, java.lang.Object);
-    method public android.os.Bundle peekExtras();
-    method protected boolean persistBoolean(boolean);
-    method protected boolean persistFloat(float);
-    method protected boolean persistInt(int);
-    method protected boolean persistLong(long);
-    method protected boolean persistString(java.lang.String);
-    method public void restoreHierarchyState(android.os.Bundle);
-    method public void saveHierarchyState(android.os.Bundle);
-    method public void setDefaultValue(java.lang.Object);
-    method public void setDependency(java.lang.String);
-    method public void setEnabled(boolean);
-    method public void setFragment(java.lang.String);
-    method public void setIcon(android.graphics.drawable.Drawable);
-    method public void setIcon(int);
-    method public void setIntent(android.content.Intent);
-    method public void setKey(java.lang.String);
-    method public void setLayoutResource(int);
-    method public void setOnPreferenceChangeListener(android.support.v7.preference.Preference.OnPreferenceChangeListener);
-    method public void setOnPreferenceClickListener(android.support.v7.preference.Preference.OnPreferenceClickListener);
-    method public void setOrder(int);
-    method public void setPersistent(boolean);
-    method public void setSelectable(boolean);
-    method public void setShouldDisableView(boolean);
-    method public void setSummary(java.lang.CharSequence);
-    method public void setSummary(int);
-    method public void setTitle(java.lang.CharSequence);
-    method public void setTitle(int);
-    method public final void setVisible(boolean);
-    method public void setWidgetLayoutResource(int);
-    method public boolean shouldDisableDependents();
-    method protected boolean shouldPersist();
-    field public static final int DEFAULT_ORDER = 2147483647; // 0x7fffffff
-  }
-
-  public static class Preference.BaseSavedState extends android.view.AbsSavedState {
-    ctor public Preference.BaseSavedState(android.os.Parcel);
-    ctor public Preference.BaseSavedState(android.os.Parcelable);
-    field public static final android.os.Parcelable.Creator<android.support.v7.preference.Preference.BaseSavedState> CREATOR;
-  }
-
-  public static abstract interface Preference.OnPreferenceChangeListener {
-    method public abstract boolean onPreferenceChange(android.support.v7.preference.Preference, java.lang.Object);
-  }
-
-  public static abstract interface Preference.OnPreferenceClickListener {
-    method public abstract boolean onPreferenceClick(android.support.v7.preference.Preference);
-  }
-
-  public class PreferenceCategory extends android.support.v7.preference.PreferenceGroup {
-    ctor public PreferenceCategory(android.content.Context, android.util.AttributeSet, int, int);
-    ctor public PreferenceCategory(android.content.Context, android.util.AttributeSet, int);
-    ctor public PreferenceCategory(android.content.Context, android.util.AttributeSet);
-    ctor public PreferenceCategory(android.content.Context);
-  }
-
-  public abstract class PreferenceDialogFragmentCompat extends android.support.v4.app.DialogFragment implements android.content.DialogInterface.OnClickListener {
-    ctor public PreferenceDialogFragmentCompat();
-    method public android.support.v7.preference.DialogPreference getPreference();
-    method protected void onBindDialogView(android.view.View);
-    method public void onClick(android.content.DialogInterface, int);
-    method protected android.view.View onCreateDialogView(android.content.Context);
-    method public abstract void onDialogClosed(boolean);
-    method protected void onPrepareDialogBuilder(android.support.v7.app.AlertDialog.Builder);
-    field protected static final java.lang.String ARG_KEY = "key";
-  }
-
-  public abstract class PreferenceFragmentCompat extends android.support.v4.app.Fragment implements android.support.v7.preference.DialogPreference.TargetFragment android.support.v7.preference.PreferenceManager.OnDisplayPreferenceDialogListener android.support.v7.preference.PreferenceManager.OnNavigateToScreenListener android.support.v7.preference.PreferenceManager.OnPreferenceTreeClickListener {
-    ctor public PreferenceFragmentCompat();
-    method public void addPreferencesFromResource(int);
-    method public android.support.v7.preference.Preference findPreference(java.lang.CharSequence);
-    method public final android.support.v7.widget.RecyclerView getListView();
-    method public android.support.v7.preference.PreferenceManager getPreferenceManager();
-    method public android.support.v7.preference.PreferenceScreen getPreferenceScreen();
-    method protected android.support.v7.widget.RecyclerView.Adapter onCreateAdapter(android.support.v7.preference.PreferenceScreen);
-    method public android.support.v7.widget.RecyclerView.LayoutManager onCreateLayoutManager();
-    method public abstract void onCreatePreferences(android.os.Bundle, java.lang.String);
-    method public android.support.v7.widget.RecyclerView onCreateRecyclerView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
-    method public void onDisplayPreferenceDialog(android.support.v7.preference.Preference);
-    method public void onNavigateToScreen(android.support.v7.preference.PreferenceScreen);
-    method public boolean onPreferenceTreeClick(android.support.v7.preference.Preference);
-    method public void setPreferenceScreen(android.support.v7.preference.PreferenceScreen);
-    method public void setPreferencesFromResource(int, java.lang.String);
-    field public static final java.lang.String ARG_PREFERENCE_ROOT = "android.support.v7.preference.PreferenceFragmentCompat.PREFERENCE_ROOT";
-  }
-
-  public static abstract interface PreferenceFragmentCompat.OnPreferenceDisplayDialogCallback {
-    method public abstract boolean onPreferenceDisplayDialog(android.support.v7.preference.PreferenceFragmentCompat, android.support.v7.preference.Preference);
-  }
-
-  public static abstract interface PreferenceFragmentCompat.OnPreferenceStartFragmentCallback {
-    method public abstract boolean onPreferenceStartFragment(android.support.v7.preference.PreferenceFragmentCompat, android.support.v7.preference.Preference);
-  }
-
-  public static abstract interface PreferenceFragmentCompat.OnPreferenceStartScreenCallback {
-    method public abstract boolean onPreferenceStartScreen(android.support.v7.preference.PreferenceFragmentCompat, android.support.v7.preference.PreferenceScreen);
-  }
-
-  public abstract class PreferenceGroup extends android.support.v7.preference.Preference {
-    ctor public PreferenceGroup(android.content.Context, android.util.AttributeSet, int, int);
-    ctor public PreferenceGroup(android.content.Context, android.util.AttributeSet, int);
-    ctor public PreferenceGroup(android.content.Context, android.util.AttributeSet);
-    method public void addItemFromInflater(android.support.v7.preference.Preference);
-    method public boolean addPreference(android.support.v7.preference.Preference);
-    method protected void dispatchRestoreInstanceState(android.os.Bundle);
-    method protected void dispatchSaveInstanceState(android.os.Bundle);
-    method public android.support.v7.preference.Preference findPreference(java.lang.CharSequence);
-    method public android.support.v7.preference.Preference getPreference(int);
-    method public int getPreferenceCount();
-    method protected boolean isOnSameScreenAsChildren();
-    method public boolean isOrderingAsAdded();
-    method protected boolean onPrepareAddPreference(android.support.v7.preference.Preference);
-    method public void removeAll();
-    method public boolean removePreference(android.support.v7.preference.Preference);
-    method public void setOrderingAsAdded(boolean);
-  }
-
-  public class PreferenceManager {
-    method public android.support.v7.preference.PreferenceScreen createPreferenceScreen(android.content.Context);
-    method public android.support.v7.preference.Preference findPreference(java.lang.CharSequence);
-    method public android.content.Context getContext();
-    method public static android.content.SharedPreferences getDefaultSharedPreferences(android.content.Context);
-    method public android.support.v7.preference.PreferenceManager.OnDisplayPreferenceDialogListener getOnDisplayPreferenceDialogListener();
-    method public android.support.v7.preference.PreferenceManager.OnNavigateToScreenListener getOnNavigateToScreenListener();
-    method public android.support.v7.preference.PreferenceManager.OnPreferenceTreeClickListener getOnPreferenceTreeClickListener();
-    method public android.support.v7.preference.PreferenceScreen getPreferenceScreen();
-    method public android.content.SharedPreferences getSharedPreferences();
-    method public int getSharedPreferencesMode();
-    method public java.lang.String getSharedPreferencesName();
-    method public static void setDefaultValues(android.content.Context, int, boolean);
-    method public static void setDefaultValues(android.content.Context, java.lang.String, int, int, boolean);
-    method public void setOnDisplayPreferenceDialogListener(android.support.v7.preference.PreferenceManager.OnDisplayPreferenceDialogListener);
-    method public void setOnNavigateToScreenListener(android.support.v7.preference.PreferenceManager.OnNavigateToScreenListener);
-    method public void setOnPreferenceTreeClickListener(android.support.v7.preference.PreferenceManager.OnPreferenceTreeClickListener);
-    method public boolean setPreferences(android.support.v7.preference.PreferenceScreen);
-    method public void setSharedPreferencesMode(int);
-    method public void setSharedPreferencesName(java.lang.String);
-    method public void showDialog(android.support.v7.preference.Preference);
-    field public static final java.lang.String KEY_HAS_SET_DEFAULT_VALUES = "_has_set_default_values";
-  }
-
-  public static abstract interface PreferenceManager.OnDisplayPreferenceDialogListener {
-    method public abstract void onDisplayPreferenceDialog(android.support.v7.preference.Preference);
-  }
-
-  public static abstract interface PreferenceManager.OnNavigateToScreenListener {
-    method public abstract void onNavigateToScreen(android.support.v7.preference.PreferenceScreen);
-  }
-
-  public static abstract interface PreferenceManager.OnPreferenceTreeClickListener {
-    method public abstract boolean onPreferenceTreeClick(android.support.v7.preference.Preference);
-  }
-
-  public final class PreferenceScreen extends android.support.v7.preference.PreferenceGroup {
-  }
-
-  public class PreferenceViewHolder extends android.support.v7.widget.RecyclerView.ViewHolder {
-    method public android.view.View findViewById(int);
-  }
-
-  public class SwitchPreferenceCompat extends android.support.v7.preference.TwoStatePreference {
-    ctor public SwitchPreferenceCompat(android.content.Context, android.util.AttributeSet, int, int);
-    ctor public SwitchPreferenceCompat(android.content.Context, android.util.AttributeSet, int);
-    ctor public SwitchPreferenceCompat(android.content.Context, android.util.AttributeSet);
-    ctor public SwitchPreferenceCompat(android.content.Context);
-    method public java.lang.CharSequence getSwitchTextOff();
-    method public java.lang.CharSequence getSwitchTextOn();
-    method public void setSwitchTextOff(java.lang.CharSequence);
-    method public void setSwitchTextOff(int);
-    method public void setSwitchTextOn(java.lang.CharSequence);
-    method public void setSwitchTextOn(int);
-  }
-
-  public abstract class TwoStatePreference extends android.support.v7.preference.Preference {
-    ctor public TwoStatePreference(android.content.Context, android.util.AttributeSet, int, int);
-    ctor public TwoStatePreference(android.content.Context, android.util.AttributeSet, int);
-    ctor public TwoStatePreference(android.content.Context, android.util.AttributeSet);
-    ctor public TwoStatePreference(android.content.Context);
-    method public boolean getDisableDependentsState();
-    method public java.lang.CharSequence getSummaryOff();
-    method public java.lang.CharSequence getSummaryOn();
-    method public boolean isChecked();
-    method public void setChecked(boolean);
-    method public void setDisableDependentsState(boolean);
-    method public void setSummaryOff(java.lang.CharSequence);
-    method public void setSummaryOff(int);
-    method public void setSummaryOn(java.lang.CharSequence);
-    method public void setSummaryOn(int);
-    method protected void syncSummaryView(android.support.v7.preference.PreferenceViewHolder);
-    field protected boolean mChecked;
-  }
-
-}
-
diff --git a/v7/preference/api/23.1.0.txt b/v7/preference/api/23.1.0.txt
deleted file mode 100644
index 7d7aeb1..0000000
--- a/v7/preference/api/23.1.0.txt
+++ /dev/null
@@ -1,318 +0,0 @@
-package android.support.v7.preference {
-
-  public class CheckBoxPreference extends android.support.v7.preference.TwoStatePreference {
-    ctor public CheckBoxPreference(android.content.Context, android.util.AttributeSet, int);
-    ctor public CheckBoxPreference(android.content.Context, android.util.AttributeSet, int, int);
-    ctor public CheckBoxPreference(android.content.Context, android.util.AttributeSet);
-    ctor public CheckBoxPreference(android.content.Context);
-  }
-
-  public abstract class DialogPreference extends android.support.v7.preference.Preference {
-    ctor public DialogPreference(android.content.Context, android.util.AttributeSet, int, int);
-    ctor public DialogPreference(android.content.Context, android.util.AttributeSet, int);
-    ctor public DialogPreference(android.content.Context, android.util.AttributeSet);
-    ctor public DialogPreference(android.content.Context);
-    method public android.graphics.drawable.Drawable getDialogIcon();
-    method public int getDialogLayoutResource();
-    method public java.lang.CharSequence getDialogMessage();
-    method public java.lang.CharSequence getDialogTitle();
-    method public java.lang.CharSequence getNegativeButtonText();
-    method public java.lang.CharSequence getPositiveButtonText();
-    method public void setDialogIcon(android.graphics.drawable.Drawable);
-    method public void setDialogIcon(int);
-    method public void setDialogLayoutResource(int);
-    method public void setDialogMessage(java.lang.CharSequence);
-    method public void setDialogMessage(int);
-    method public void setDialogTitle(java.lang.CharSequence);
-    method public void setDialogTitle(int);
-    method public void setNegativeButtonText(java.lang.CharSequence);
-    method public void setNegativeButtonText(int);
-    method public void setPositiveButtonText(java.lang.CharSequence);
-    method public void setPositiveButtonText(int);
-  }
-
-  public static abstract interface DialogPreference.TargetFragment {
-    method public abstract android.support.v7.preference.Preference findPreference(java.lang.CharSequence);
-  }
-
-  public class EditTextPreference extends android.support.v7.preference.DialogPreference {
-    ctor public EditTextPreference(android.content.Context, android.util.AttributeSet, int, int);
-    ctor public EditTextPreference(android.content.Context, android.util.AttributeSet, int);
-    ctor public EditTextPreference(android.content.Context, android.util.AttributeSet);
-    ctor public EditTextPreference(android.content.Context);
-    method public java.lang.String getText();
-    method public void setText(java.lang.String);
-  }
-
-  public class EditTextPreferenceDialogFragmentCompat extends android.support.v7.preference.PreferenceDialogFragmentCompat {
-    ctor public EditTextPreferenceDialogFragmentCompat();
-    method public static android.support.v7.preference.EditTextPreferenceDialogFragmentCompat newInstance(java.lang.String);
-    method public void onDialogClosed(boolean);
-  }
-
-  public class ListPreference extends android.support.v7.preference.DialogPreference {
-    ctor public ListPreference(android.content.Context, android.util.AttributeSet, int, int);
-    ctor public ListPreference(android.content.Context, android.util.AttributeSet, int);
-    ctor public ListPreference(android.content.Context, android.util.AttributeSet);
-    ctor public ListPreference(android.content.Context);
-    method public int findIndexOfValue(java.lang.String);
-    method public java.lang.CharSequence[] getEntries();
-    method public java.lang.CharSequence getEntry();
-    method public java.lang.CharSequence[] getEntryValues();
-    method public java.lang.String getValue();
-    method public void setEntries(java.lang.CharSequence[]);
-    method public void setEntries(int);
-    method public void setEntryValues(java.lang.CharSequence[]);
-    method public void setEntryValues(int);
-    method public void setValue(java.lang.String);
-    method public void setValueIndex(int);
-  }
-
-  public class ListPreferenceDialogFragmentCompat extends android.support.v7.preference.PreferenceDialogFragmentCompat {
-    ctor public ListPreferenceDialogFragmentCompat();
-    method public static android.support.v7.preference.ListPreferenceDialogFragmentCompat newInstance(java.lang.String);
-    method public void onDialogClosed(boolean);
-  }
-
-  public class Preference {
-    ctor public Preference(android.content.Context, android.util.AttributeSet, int, int);
-    ctor public Preference(android.content.Context, android.util.AttributeSet, int);
-    ctor public Preference(android.content.Context, android.util.AttributeSet);
-    ctor public Preference(android.content.Context);
-    method public boolean callChangeListener(java.lang.Object);
-    method public int compareTo(android.support.v7.preference.Preference);
-    method protected android.support.v7.preference.Preference findPreferenceInHierarchy(java.lang.String);
-    method public android.content.Context getContext();
-    method public java.lang.String getDependency();
-    method public android.os.Bundle getExtras();
-    method public java.lang.String getFragment();
-    method public android.graphics.drawable.Drawable getIcon();
-    method public android.content.Intent getIntent();
-    method public java.lang.String getKey();
-    method public final int getLayoutResource();
-    method public android.support.v7.preference.Preference.OnPreferenceChangeListener getOnPreferenceChangeListener();
-    method public android.support.v7.preference.Preference.OnPreferenceClickListener getOnPreferenceClickListener();
-    method public int getOrder();
-    method protected boolean getPersistedBoolean(boolean);
-    method protected float getPersistedFloat(float);
-    method protected int getPersistedInt(int);
-    method protected long getPersistedLong(long);
-    method protected java.lang.String getPersistedString(java.lang.String);
-    method public android.support.v7.preference.PreferenceManager getPreferenceManager();
-    method public android.content.SharedPreferences getSharedPreferences();
-    method public boolean getShouldDisableView();
-    method public java.lang.CharSequence getSummary();
-    method public java.lang.CharSequence getTitle();
-    method public final int getWidgetLayoutResource();
-    method public boolean hasKey();
-    method public boolean isEnabled();
-    method public boolean isPersistent();
-    method public boolean isSelectable();
-    method public final boolean isVisible();
-    method protected void notifyChanged();
-    method public void notifyDependencyChange(boolean);
-    method protected void notifyHierarchyChanged();
-    method public void onAttached();
-    method protected void onAttachedToHierarchy(android.support.v7.preference.PreferenceManager);
-    method public void onBindViewHolder(android.support.v7.preference.PreferenceViewHolder);
-    method protected void onClick();
-    method public void onDependencyChanged(android.support.v7.preference.Preference, boolean);
-    method protected java.lang.Object onGetDefaultValue(android.content.res.TypedArray, int);
-    method public void onParentChanged(android.support.v7.preference.Preference, boolean);
-    method protected void onPrepareForRemoval();
-    method protected void onRestoreInstanceState(android.os.Parcelable);
-    method protected android.os.Parcelable onSaveInstanceState();
-    method protected void onSetInitialValue(boolean, java.lang.Object);
-    method public android.os.Bundle peekExtras();
-    method protected boolean persistBoolean(boolean);
-    method protected boolean persistFloat(float);
-    method protected boolean persistInt(int);
-    method protected boolean persistLong(long);
-    method protected boolean persistString(java.lang.String);
-    method public void restoreHierarchyState(android.os.Bundle);
-    method public void saveHierarchyState(android.os.Bundle);
-    method public void setDefaultValue(java.lang.Object);
-    method public void setDependency(java.lang.String);
-    method public void setEnabled(boolean);
-    method public void setFragment(java.lang.String);
-    method public void setIcon(android.graphics.drawable.Drawable);
-    method public void setIcon(int);
-    method public void setIntent(android.content.Intent);
-    method public void setKey(java.lang.String);
-    method public void setLayoutResource(int);
-    method public void setOnPreferenceChangeListener(android.support.v7.preference.Preference.OnPreferenceChangeListener);
-    method public void setOnPreferenceClickListener(android.support.v7.preference.Preference.OnPreferenceClickListener);
-    method public void setOrder(int);
-    method public void setPersistent(boolean);
-    method public void setSelectable(boolean);
-    method public void setShouldDisableView(boolean);
-    method public void setSummary(java.lang.CharSequence);
-    method public void setSummary(int);
-    method public void setTitle(java.lang.CharSequence);
-    method public void setTitle(int);
-    method public final void setVisible(boolean);
-    method public void setWidgetLayoutResource(int);
-    method public boolean shouldDisableDependents();
-    method protected boolean shouldPersist();
-    field public static final int DEFAULT_ORDER = 2147483647; // 0x7fffffff
-  }
-
-  public static class Preference.BaseSavedState extends android.view.AbsSavedState {
-    ctor public Preference.BaseSavedState(android.os.Parcel);
-    ctor public Preference.BaseSavedState(android.os.Parcelable);
-    field public static final android.os.Parcelable.Creator<android.support.v7.preference.Preference.BaseSavedState> CREATOR;
-  }
-
-  public static abstract interface Preference.OnPreferenceChangeListener {
-    method public abstract boolean onPreferenceChange(android.support.v7.preference.Preference, java.lang.Object);
-  }
-
-  public static abstract interface Preference.OnPreferenceClickListener {
-    method public abstract boolean onPreferenceClick(android.support.v7.preference.Preference);
-  }
-
-  public class PreferenceCategory extends android.support.v7.preference.PreferenceGroup {
-    ctor public PreferenceCategory(android.content.Context, android.util.AttributeSet, int, int);
-    ctor public PreferenceCategory(android.content.Context, android.util.AttributeSet, int);
-    ctor public PreferenceCategory(android.content.Context, android.util.AttributeSet);
-    ctor public PreferenceCategory(android.content.Context);
-  }
-
-  public abstract class PreferenceDialogFragmentCompat extends android.support.v4.app.DialogFragment implements android.content.DialogInterface.OnClickListener {
-    ctor public PreferenceDialogFragmentCompat();
-    method public android.support.v7.preference.DialogPreference getPreference();
-    method protected void onBindDialogView(android.view.View);
-    method public void onClick(android.content.DialogInterface, int);
-    method protected android.view.View onCreateDialogView(android.content.Context);
-    method public abstract void onDialogClosed(boolean);
-    method protected void onPrepareDialogBuilder(android.support.v7.app.AlertDialog.Builder);
-    field protected static final java.lang.String ARG_KEY = "key";
-  }
-
-  public abstract class PreferenceFragmentCompat extends android.support.v4.app.Fragment implements android.support.v7.preference.DialogPreference.TargetFragment android.support.v7.preference.PreferenceManager.OnDisplayPreferenceDialogListener android.support.v7.preference.PreferenceManager.OnNavigateToScreenListener android.support.v7.preference.PreferenceManager.OnPreferenceTreeClickListener {
-    ctor public PreferenceFragmentCompat();
-    method public void addPreferencesFromResource(int);
-    method public android.support.v7.preference.Preference findPreference(java.lang.CharSequence);
-    method public final android.support.v7.widget.RecyclerView getListView();
-    method public android.support.v7.preference.PreferenceManager getPreferenceManager();
-    method public android.support.v7.preference.PreferenceScreen getPreferenceScreen();
-    method protected android.support.v7.widget.RecyclerView.Adapter onCreateAdapter(android.support.v7.preference.PreferenceScreen);
-    method public android.support.v7.widget.RecyclerView.LayoutManager onCreateLayoutManager();
-    method public abstract void onCreatePreferences(android.os.Bundle, java.lang.String);
-    method public android.support.v7.widget.RecyclerView onCreateRecyclerView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
-    method public void onDisplayPreferenceDialog(android.support.v7.preference.Preference);
-    method public void onNavigateToScreen(android.support.v7.preference.PreferenceScreen);
-    method public boolean onPreferenceTreeClick(android.support.v7.preference.Preference);
-    method public void setPreferenceScreen(android.support.v7.preference.PreferenceScreen);
-    method public void setPreferencesFromResource(int, java.lang.String);
-    field public static final java.lang.String ARG_PREFERENCE_ROOT = "android.support.v7.preference.PreferenceFragmentCompat.PREFERENCE_ROOT";
-  }
-
-  public static abstract interface PreferenceFragmentCompat.OnPreferenceDisplayDialogCallback {
-    method public abstract boolean onPreferenceDisplayDialog(android.support.v7.preference.PreferenceFragmentCompat, android.support.v7.preference.Preference);
-  }
-
-  public static abstract interface PreferenceFragmentCompat.OnPreferenceStartFragmentCallback {
-    method public abstract boolean onPreferenceStartFragment(android.support.v7.preference.PreferenceFragmentCompat, android.support.v7.preference.Preference);
-  }
-
-  public static abstract interface PreferenceFragmentCompat.OnPreferenceStartScreenCallback {
-    method public abstract boolean onPreferenceStartScreen(android.support.v7.preference.PreferenceFragmentCompat, android.support.v7.preference.PreferenceScreen);
-  }
-
-  public abstract class PreferenceGroup extends android.support.v7.preference.Preference {
-    ctor public PreferenceGroup(android.content.Context, android.util.AttributeSet, int, int);
-    ctor public PreferenceGroup(android.content.Context, android.util.AttributeSet, int);
-    ctor public PreferenceGroup(android.content.Context, android.util.AttributeSet);
-    method public void addItemFromInflater(android.support.v7.preference.Preference);
-    method public boolean addPreference(android.support.v7.preference.Preference);
-    method protected void dispatchRestoreInstanceState(android.os.Bundle);
-    method protected void dispatchSaveInstanceState(android.os.Bundle);
-    method public android.support.v7.preference.Preference findPreference(java.lang.CharSequence);
-    method public android.support.v7.preference.Preference getPreference(int);
-    method public int getPreferenceCount();
-    method protected boolean isOnSameScreenAsChildren();
-    method public boolean isOrderingAsAdded();
-    method protected boolean onPrepareAddPreference(android.support.v7.preference.Preference);
-    method public void removeAll();
-    method public boolean removePreference(android.support.v7.preference.Preference);
-    method public void setOrderingAsAdded(boolean);
-  }
-
-  public class PreferenceManager {
-    method public android.support.v7.preference.PreferenceScreen createPreferenceScreen(android.content.Context);
-    method public android.support.v7.preference.Preference findPreference(java.lang.CharSequence);
-    method public android.content.Context getContext();
-    method public static android.content.SharedPreferences getDefaultSharedPreferences(android.content.Context);
-    method public android.support.v7.preference.PreferenceManager.OnDisplayPreferenceDialogListener getOnDisplayPreferenceDialogListener();
-    method public android.support.v7.preference.PreferenceManager.OnNavigateToScreenListener getOnNavigateToScreenListener();
-    method public android.support.v7.preference.PreferenceManager.OnPreferenceTreeClickListener getOnPreferenceTreeClickListener();
-    method public android.support.v7.preference.PreferenceScreen getPreferenceScreen();
-    method public android.content.SharedPreferences getSharedPreferences();
-    method public int getSharedPreferencesMode();
-    method public java.lang.String getSharedPreferencesName();
-    method public static void setDefaultValues(android.content.Context, int, boolean);
-    method public static void setDefaultValues(android.content.Context, java.lang.String, int, int, boolean);
-    method public void setOnDisplayPreferenceDialogListener(android.support.v7.preference.PreferenceManager.OnDisplayPreferenceDialogListener);
-    method public void setOnNavigateToScreenListener(android.support.v7.preference.PreferenceManager.OnNavigateToScreenListener);
-    method public void setOnPreferenceTreeClickListener(android.support.v7.preference.PreferenceManager.OnPreferenceTreeClickListener);
-    method public boolean setPreferences(android.support.v7.preference.PreferenceScreen);
-    method public void setSharedPreferencesMode(int);
-    method public void setSharedPreferencesName(java.lang.String);
-    method public void showDialog(android.support.v7.preference.Preference);
-    field public static final java.lang.String KEY_HAS_SET_DEFAULT_VALUES = "_has_set_default_values";
-  }
-
-  public static abstract interface PreferenceManager.OnDisplayPreferenceDialogListener {
-    method public abstract void onDisplayPreferenceDialog(android.support.v7.preference.Preference);
-  }
-
-  public static abstract interface PreferenceManager.OnNavigateToScreenListener {
-    method public abstract void onNavigateToScreen(android.support.v7.preference.PreferenceScreen);
-  }
-
-  public static abstract interface PreferenceManager.OnPreferenceTreeClickListener {
-    method public abstract boolean onPreferenceTreeClick(android.support.v7.preference.Preference);
-  }
-
-  public final class PreferenceScreen extends android.support.v7.preference.PreferenceGroup {
-  }
-
-  public class PreferenceViewHolder extends android.support.v7.widget.RecyclerView.ViewHolder {
-    method public android.view.View findViewById(int);
-  }
-
-  public class SwitchPreferenceCompat extends android.support.v7.preference.TwoStatePreference {
-    ctor public SwitchPreferenceCompat(android.content.Context, android.util.AttributeSet, int, int);
-    ctor public SwitchPreferenceCompat(android.content.Context, android.util.AttributeSet, int);
-    ctor public SwitchPreferenceCompat(android.content.Context, android.util.AttributeSet);
-    ctor public SwitchPreferenceCompat(android.content.Context);
-    method public java.lang.CharSequence getSwitchTextOff();
-    method public java.lang.CharSequence getSwitchTextOn();
-    method public void setSwitchTextOff(java.lang.CharSequence);
-    method public void setSwitchTextOff(int);
-    method public void setSwitchTextOn(java.lang.CharSequence);
-    method public void setSwitchTextOn(int);
-  }
-
-  public abstract class TwoStatePreference extends android.support.v7.preference.Preference {
-    ctor public TwoStatePreference(android.content.Context, android.util.AttributeSet, int, int);
-    ctor public TwoStatePreference(android.content.Context, android.util.AttributeSet, int);
-    ctor public TwoStatePreference(android.content.Context, android.util.AttributeSet);
-    ctor public TwoStatePreference(android.content.Context);
-    method public boolean getDisableDependentsState();
-    method public java.lang.CharSequence getSummaryOff();
-    method public java.lang.CharSequence getSummaryOn();
-    method public boolean isChecked();
-    method public void setChecked(boolean);
-    method public void setDisableDependentsState(boolean);
-    method public void setSummaryOff(java.lang.CharSequence);
-    method public void setSummaryOff(int);
-    method public void setSummaryOn(java.lang.CharSequence);
-    method public void setSummaryOn(int);
-    method protected void syncSummaryView(android.support.v7.preference.PreferenceViewHolder);
-    field protected boolean mChecked;
-  }
-
-}
-
diff --git a/v7/preference/api/23.1.1.txt b/v7/preference/api/23.1.1.txt
deleted file mode 100644
index 7d7aeb1..0000000
--- a/v7/preference/api/23.1.1.txt
+++ /dev/null
@@ -1,318 +0,0 @@
-package android.support.v7.preference {
-
-  public class CheckBoxPreference extends android.support.v7.preference.TwoStatePreference {
-    ctor public CheckBoxPreference(android.content.Context, android.util.AttributeSet, int);
-    ctor public CheckBoxPreference(android.content.Context, android.util.AttributeSet, int, int);
-    ctor public CheckBoxPreference(android.content.Context, android.util.AttributeSet);
-    ctor public CheckBoxPreference(android.content.Context);
-  }
-
-  public abstract class DialogPreference extends android.support.v7.preference.Preference {
-    ctor public DialogPreference(android.content.Context, android.util.AttributeSet, int, int);
-    ctor public DialogPreference(android.content.Context, android.util.AttributeSet, int);
-    ctor public DialogPreference(android.content.Context, android.util.AttributeSet);
-    ctor public DialogPreference(android.content.Context);
-    method public android.graphics.drawable.Drawable getDialogIcon();
-    method public int getDialogLayoutResource();
-    method public java.lang.CharSequence getDialogMessage();
-    method public java.lang.CharSequence getDialogTitle();
-    method public java.lang.CharSequence getNegativeButtonText();
-    method public java.lang.CharSequence getPositiveButtonText();
-    method public void setDialogIcon(android.graphics.drawable.Drawable);
-    method public void setDialogIcon(int);
-    method public void setDialogLayoutResource(int);
-    method public void setDialogMessage(java.lang.CharSequence);
-    method public void setDialogMessage(int);
-    method public void setDialogTitle(java.lang.CharSequence);
-    method public void setDialogTitle(int);
-    method public void setNegativeButtonText(java.lang.CharSequence);
-    method public void setNegativeButtonText(int);
-    method public void setPositiveButtonText(java.lang.CharSequence);
-    method public void setPositiveButtonText(int);
-  }
-
-  public static abstract interface DialogPreference.TargetFragment {
-    method public abstract android.support.v7.preference.Preference findPreference(java.lang.CharSequence);
-  }
-
-  public class EditTextPreference extends android.support.v7.preference.DialogPreference {
-    ctor public EditTextPreference(android.content.Context, android.util.AttributeSet, int, int);
-    ctor public EditTextPreference(android.content.Context, android.util.AttributeSet, int);
-    ctor public EditTextPreference(android.content.Context, android.util.AttributeSet);
-    ctor public EditTextPreference(android.content.Context);
-    method public java.lang.String getText();
-    method public void setText(java.lang.String);
-  }
-
-  public class EditTextPreferenceDialogFragmentCompat extends android.support.v7.preference.PreferenceDialogFragmentCompat {
-    ctor public EditTextPreferenceDialogFragmentCompat();
-    method public static android.support.v7.preference.EditTextPreferenceDialogFragmentCompat newInstance(java.lang.String);
-    method public void onDialogClosed(boolean);
-  }
-
-  public class ListPreference extends android.support.v7.preference.DialogPreference {
-    ctor public ListPreference(android.content.Context, android.util.AttributeSet, int, int);
-    ctor public ListPreference(android.content.Context, android.util.AttributeSet, int);
-    ctor public ListPreference(android.content.Context, android.util.AttributeSet);
-    ctor public ListPreference(android.content.Context);
-    method public int findIndexOfValue(java.lang.String);
-    method public java.lang.CharSequence[] getEntries();
-    method public java.lang.CharSequence getEntry();
-    method public java.lang.CharSequence[] getEntryValues();
-    method public java.lang.String getValue();
-    method public void setEntries(java.lang.CharSequence[]);
-    method public void setEntries(int);
-    method public void setEntryValues(java.lang.CharSequence[]);
-    method public void setEntryValues(int);
-    method public void setValue(java.lang.String);
-    method public void setValueIndex(int);
-  }
-
-  public class ListPreferenceDialogFragmentCompat extends android.support.v7.preference.PreferenceDialogFragmentCompat {
-    ctor public ListPreferenceDialogFragmentCompat();
-    method public static android.support.v7.preference.ListPreferenceDialogFragmentCompat newInstance(java.lang.String);
-    method public void onDialogClosed(boolean);
-  }
-
-  public class Preference {
-    ctor public Preference(android.content.Context, android.util.AttributeSet, int, int);
-    ctor public Preference(android.content.Context, android.util.AttributeSet, int);
-    ctor public Preference(android.content.Context, android.util.AttributeSet);
-    ctor public Preference(android.content.Context);
-    method public boolean callChangeListener(java.lang.Object);
-    method public int compareTo(android.support.v7.preference.Preference);
-    method protected android.support.v7.preference.Preference findPreferenceInHierarchy(java.lang.String);
-    method public android.content.Context getContext();
-    method public java.lang.String getDependency();
-    method public android.os.Bundle getExtras();
-    method public java.lang.String getFragment();
-    method public android.graphics.drawable.Drawable getIcon();
-    method public android.content.Intent getIntent();
-    method public java.lang.String getKey();
-    method public final int getLayoutResource();
-    method public android.support.v7.preference.Preference.OnPreferenceChangeListener getOnPreferenceChangeListener();
-    method public android.support.v7.preference.Preference.OnPreferenceClickListener getOnPreferenceClickListener();
-    method public int getOrder();
-    method protected boolean getPersistedBoolean(boolean);
-    method protected float getPersistedFloat(float);
-    method protected int getPersistedInt(int);
-    method protected long getPersistedLong(long);
-    method protected java.lang.String getPersistedString(java.lang.String);
-    method public android.support.v7.preference.PreferenceManager getPreferenceManager();
-    method public android.content.SharedPreferences getSharedPreferences();
-    method public boolean getShouldDisableView();
-    method public java.lang.CharSequence getSummary();
-    method public java.lang.CharSequence getTitle();
-    method public final int getWidgetLayoutResource();
-    method public boolean hasKey();
-    method public boolean isEnabled();
-    method public boolean isPersistent();
-    method public boolean isSelectable();
-    method public final boolean isVisible();
-    method protected void notifyChanged();
-    method public void notifyDependencyChange(boolean);
-    method protected void notifyHierarchyChanged();
-    method public void onAttached();
-    method protected void onAttachedToHierarchy(android.support.v7.preference.PreferenceManager);
-    method public void onBindViewHolder(android.support.v7.preference.PreferenceViewHolder);
-    method protected void onClick();
-    method public void onDependencyChanged(android.support.v7.preference.Preference, boolean);
-    method protected java.lang.Object onGetDefaultValue(android.content.res.TypedArray, int);
-    method public void onParentChanged(android.support.v7.preference.Preference, boolean);
-    method protected void onPrepareForRemoval();
-    method protected void onRestoreInstanceState(android.os.Parcelable);
-    method protected android.os.Parcelable onSaveInstanceState();
-    method protected void onSetInitialValue(boolean, java.lang.Object);
-    method public android.os.Bundle peekExtras();
-    method protected boolean persistBoolean(boolean);
-    method protected boolean persistFloat(float);
-    method protected boolean persistInt(int);
-    method protected boolean persistLong(long);
-    method protected boolean persistString(java.lang.String);
-    method public void restoreHierarchyState(android.os.Bundle);
-    method public void saveHierarchyState(android.os.Bundle);
-    method public void setDefaultValue(java.lang.Object);
-    method public void setDependency(java.lang.String);
-    method public void setEnabled(boolean);
-    method public void setFragment(java.lang.String);
-    method public void setIcon(android.graphics.drawable.Drawable);
-    method public void setIcon(int);
-    method public void setIntent(android.content.Intent);
-    method public void setKey(java.lang.String);
-    method public void setLayoutResource(int);
-    method public void setOnPreferenceChangeListener(android.support.v7.preference.Preference.OnPreferenceChangeListener);
-    method public void setOnPreferenceClickListener(android.support.v7.preference.Preference.OnPreferenceClickListener);
-    method public void setOrder(int);
-    method public void setPersistent(boolean);
-    method public void setSelectable(boolean);
-    method public void setShouldDisableView(boolean);
-    method public void setSummary(java.lang.CharSequence);
-    method public void setSummary(int);
-    method public void setTitle(java.lang.CharSequence);
-    method public void setTitle(int);
-    method public final void setVisible(boolean);
-    method public void setWidgetLayoutResource(int);
-    method public boolean shouldDisableDependents();
-    method protected boolean shouldPersist();
-    field public static final int DEFAULT_ORDER = 2147483647; // 0x7fffffff
-  }
-
-  public static class Preference.BaseSavedState extends android.view.AbsSavedState {
-    ctor public Preference.BaseSavedState(android.os.Parcel);
-    ctor public Preference.BaseSavedState(android.os.Parcelable);
-    field public static final android.os.Parcelable.Creator<android.support.v7.preference.Preference.BaseSavedState> CREATOR;
-  }
-
-  public static abstract interface Preference.OnPreferenceChangeListener {
-    method public abstract boolean onPreferenceChange(android.support.v7.preference.Preference, java.lang.Object);
-  }
-
-  public static abstract interface Preference.OnPreferenceClickListener {
-    method public abstract boolean onPreferenceClick(android.support.v7.preference.Preference);
-  }
-
-  public class PreferenceCategory extends android.support.v7.preference.PreferenceGroup {
-    ctor public PreferenceCategory(android.content.Context, android.util.AttributeSet, int, int);
-    ctor public PreferenceCategory(android.content.Context, android.util.AttributeSet, int);
-    ctor public PreferenceCategory(android.content.Context, android.util.AttributeSet);
-    ctor public PreferenceCategory(android.content.Context);
-  }
-
-  public abstract class PreferenceDialogFragmentCompat extends android.support.v4.app.DialogFragment implements android.content.DialogInterface.OnClickListener {
-    ctor public PreferenceDialogFragmentCompat();
-    method public android.support.v7.preference.DialogPreference getPreference();
-    method protected void onBindDialogView(android.view.View);
-    method public void onClick(android.content.DialogInterface, int);
-    method protected android.view.View onCreateDialogView(android.content.Context);
-    method public abstract void onDialogClosed(boolean);
-    method protected void onPrepareDialogBuilder(android.support.v7.app.AlertDialog.Builder);
-    field protected static final java.lang.String ARG_KEY = "key";
-  }
-
-  public abstract class PreferenceFragmentCompat extends android.support.v4.app.Fragment implements android.support.v7.preference.DialogPreference.TargetFragment android.support.v7.preference.PreferenceManager.OnDisplayPreferenceDialogListener android.support.v7.preference.PreferenceManager.OnNavigateToScreenListener android.support.v7.preference.PreferenceManager.OnPreferenceTreeClickListener {
-    ctor public PreferenceFragmentCompat();
-    method public void addPreferencesFromResource(int);
-    method public android.support.v7.preference.Preference findPreference(java.lang.CharSequence);
-    method public final android.support.v7.widget.RecyclerView getListView();
-    method public android.support.v7.preference.PreferenceManager getPreferenceManager();
-    method public android.support.v7.preference.PreferenceScreen getPreferenceScreen();
-    method protected android.support.v7.widget.RecyclerView.Adapter onCreateAdapter(android.support.v7.preference.PreferenceScreen);
-    method public android.support.v7.widget.RecyclerView.LayoutManager onCreateLayoutManager();
-    method public abstract void onCreatePreferences(android.os.Bundle, java.lang.String);
-    method public android.support.v7.widget.RecyclerView onCreateRecyclerView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
-    method public void onDisplayPreferenceDialog(android.support.v7.preference.Preference);
-    method public void onNavigateToScreen(android.support.v7.preference.PreferenceScreen);
-    method public boolean onPreferenceTreeClick(android.support.v7.preference.Preference);
-    method public void setPreferenceScreen(android.support.v7.preference.PreferenceScreen);
-    method public void setPreferencesFromResource(int, java.lang.String);
-    field public static final java.lang.String ARG_PREFERENCE_ROOT = "android.support.v7.preference.PreferenceFragmentCompat.PREFERENCE_ROOT";
-  }
-
-  public static abstract interface PreferenceFragmentCompat.OnPreferenceDisplayDialogCallback {
-    method public abstract boolean onPreferenceDisplayDialog(android.support.v7.preference.PreferenceFragmentCompat, android.support.v7.preference.Preference);
-  }
-
-  public static abstract interface PreferenceFragmentCompat.OnPreferenceStartFragmentCallback {
-    method public abstract boolean onPreferenceStartFragment(android.support.v7.preference.PreferenceFragmentCompat, android.support.v7.preference.Preference);
-  }
-
-  public static abstract interface PreferenceFragmentCompat.OnPreferenceStartScreenCallback {
-    method public abstract boolean onPreferenceStartScreen(android.support.v7.preference.PreferenceFragmentCompat, android.support.v7.preference.PreferenceScreen);
-  }
-
-  public abstract class PreferenceGroup extends android.support.v7.preference.Preference {
-    ctor public PreferenceGroup(android.content.Context, android.util.AttributeSet, int, int);
-    ctor public PreferenceGroup(android.content.Context, android.util.AttributeSet, int);
-    ctor public PreferenceGroup(android.content.Context, android.util.AttributeSet);
-    method public void addItemFromInflater(android.support.v7.preference.Preference);
-    method public boolean addPreference(android.support.v7.preference.Preference);
-    method protected void dispatchRestoreInstanceState(android.os.Bundle);
-    method protected void dispatchSaveInstanceState(android.os.Bundle);
-    method public android.support.v7.preference.Preference findPreference(java.lang.CharSequence);
-    method public android.support.v7.preference.Preference getPreference(int);
-    method public int getPreferenceCount();
-    method protected boolean isOnSameScreenAsChildren();
-    method public boolean isOrderingAsAdded();
-    method protected boolean onPrepareAddPreference(android.support.v7.preference.Preference);
-    method public void removeAll();
-    method public boolean removePreference(android.support.v7.preference.Preference);
-    method public void setOrderingAsAdded(boolean);
-  }
-
-  public class PreferenceManager {
-    method public android.support.v7.preference.PreferenceScreen createPreferenceScreen(android.content.Context);
-    method public android.support.v7.preference.Preference findPreference(java.lang.CharSequence);
-    method public android.content.Context getContext();
-    method public static android.content.SharedPreferences getDefaultSharedPreferences(android.content.Context);
-    method public android.support.v7.preference.PreferenceManager.OnDisplayPreferenceDialogListener getOnDisplayPreferenceDialogListener();
-    method public android.support.v7.preference.PreferenceManager.OnNavigateToScreenListener getOnNavigateToScreenListener();
-    method public android.support.v7.preference.PreferenceManager.OnPreferenceTreeClickListener getOnPreferenceTreeClickListener();
-    method public android.support.v7.preference.PreferenceScreen getPreferenceScreen();
-    method public android.content.SharedPreferences getSharedPreferences();
-    method public int getSharedPreferencesMode();
-    method public java.lang.String getSharedPreferencesName();
-    method public static void setDefaultValues(android.content.Context, int, boolean);
-    method public static void setDefaultValues(android.content.Context, java.lang.String, int, int, boolean);
-    method public void setOnDisplayPreferenceDialogListener(android.support.v7.preference.PreferenceManager.OnDisplayPreferenceDialogListener);
-    method public void setOnNavigateToScreenListener(android.support.v7.preference.PreferenceManager.OnNavigateToScreenListener);
-    method public void setOnPreferenceTreeClickListener(android.support.v7.preference.PreferenceManager.OnPreferenceTreeClickListener);
-    method public boolean setPreferences(android.support.v7.preference.PreferenceScreen);
-    method public void setSharedPreferencesMode(int);
-    method public void setSharedPreferencesName(java.lang.String);
-    method public void showDialog(android.support.v7.preference.Preference);
-    field public static final java.lang.String KEY_HAS_SET_DEFAULT_VALUES = "_has_set_default_values";
-  }
-
-  public static abstract interface PreferenceManager.OnDisplayPreferenceDialogListener {
-    method public abstract void onDisplayPreferenceDialog(android.support.v7.preference.Preference);
-  }
-
-  public static abstract interface PreferenceManager.OnNavigateToScreenListener {
-    method public abstract void onNavigateToScreen(android.support.v7.preference.PreferenceScreen);
-  }
-
-  public static abstract interface PreferenceManager.OnPreferenceTreeClickListener {
-    method public abstract boolean onPreferenceTreeClick(android.support.v7.preference.Preference);
-  }
-
-  public final class PreferenceScreen extends android.support.v7.preference.PreferenceGroup {
-  }
-
-  public class PreferenceViewHolder extends android.support.v7.widget.RecyclerView.ViewHolder {
-    method public android.view.View findViewById(int);
-  }
-
-  public class SwitchPreferenceCompat extends android.support.v7.preference.TwoStatePreference {
-    ctor public SwitchPreferenceCompat(android.content.Context, android.util.AttributeSet, int, int);
-    ctor public SwitchPreferenceCompat(android.content.Context, android.util.AttributeSet, int);
-    ctor public SwitchPreferenceCompat(android.content.Context, android.util.AttributeSet);
-    ctor public SwitchPreferenceCompat(android.content.Context);
-    method public java.lang.CharSequence getSwitchTextOff();
-    method public java.lang.CharSequence getSwitchTextOn();
-    method public void setSwitchTextOff(java.lang.CharSequence);
-    method public void setSwitchTextOff(int);
-    method public void setSwitchTextOn(java.lang.CharSequence);
-    method public void setSwitchTextOn(int);
-  }
-
-  public abstract class TwoStatePreference extends android.support.v7.preference.Preference {
-    ctor public TwoStatePreference(android.content.Context, android.util.AttributeSet, int, int);
-    ctor public TwoStatePreference(android.content.Context, android.util.AttributeSet, int);
-    ctor public TwoStatePreference(android.content.Context, android.util.AttributeSet);
-    ctor public TwoStatePreference(android.content.Context);
-    method public boolean getDisableDependentsState();
-    method public java.lang.CharSequence getSummaryOff();
-    method public java.lang.CharSequence getSummaryOn();
-    method public boolean isChecked();
-    method public void setChecked(boolean);
-    method public void setDisableDependentsState(boolean);
-    method public void setSummaryOff(java.lang.CharSequence);
-    method public void setSummaryOff(int);
-    method public void setSummaryOn(java.lang.CharSequence);
-    method public void setSummaryOn(int);
-    method protected void syncSummaryView(android.support.v7.preference.PreferenceViewHolder);
-    field protected boolean mChecked;
-  }
-
-}
-
diff --git a/v7/preference/api/current.txt b/v7/preference/api/current.txt
deleted file mode 100644
index f0e9fc6..0000000
--- a/v7/preference/api/current.txt
+++ /dev/null
@@ -1,348 +0,0 @@
-package android.support.v7.preference {
-
-  public class CheckBoxPreference extends android.support.v7.preference.TwoStatePreference {
-    ctor public CheckBoxPreference(android.content.Context, android.util.AttributeSet, int);
-    ctor public CheckBoxPreference(android.content.Context, android.util.AttributeSet, int, int);
-    ctor public CheckBoxPreference(android.content.Context, android.util.AttributeSet);
-    ctor public CheckBoxPreference(android.content.Context);
-  }
-
-  public abstract class DialogPreference extends android.support.v7.preference.Preference {
-    ctor public DialogPreference(android.content.Context, android.util.AttributeSet, int, int);
-    ctor public DialogPreference(android.content.Context, android.util.AttributeSet, int);
-    ctor public DialogPreference(android.content.Context, android.util.AttributeSet);
-    ctor public DialogPreference(android.content.Context);
-    method public android.graphics.drawable.Drawable getDialogIcon();
-    method public int getDialogLayoutResource();
-    method public java.lang.CharSequence getDialogMessage();
-    method public java.lang.CharSequence getDialogTitle();
-    method public java.lang.CharSequence getNegativeButtonText();
-    method public java.lang.CharSequence getPositiveButtonText();
-    method public void setDialogIcon(android.graphics.drawable.Drawable);
-    method public void setDialogIcon(int);
-    method public void setDialogLayoutResource(int);
-    method public void setDialogMessage(java.lang.CharSequence);
-    method public void setDialogMessage(int);
-    method public void setDialogTitle(java.lang.CharSequence);
-    method public void setDialogTitle(int);
-    method public void setNegativeButtonText(java.lang.CharSequence);
-    method public void setNegativeButtonText(int);
-    method public void setPositiveButtonText(java.lang.CharSequence);
-    method public void setPositiveButtonText(int);
-  }
-
-  public static abstract interface DialogPreference.TargetFragment {
-    method public abstract android.support.v7.preference.Preference findPreference(java.lang.CharSequence);
-  }
-
-  public class DropDownPreference extends android.support.v7.preference.ListPreference {
-    ctor public DropDownPreference(android.content.Context);
-    ctor public DropDownPreference(android.content.Context, android.util.AttributeSet);
-    ctor public DropDownPreference(android.content.Context, android.util.AttributeSet, int);
-    ctor public DropDownPreference(android.content.Context, android.util.AttributeSet, int, int);
-    method protected android.widget.ArrayAdapter createAdapter();
-  }
-
-  public class EditTextPreference extends android.support.v7.preference.DialogPreference {
-    ctor public EditTextPreference(android.content.Context, android.util.AttributeSet, int, int);
-    ctor public EditTextPreference(android.content.Context, android.util.AttributeSet, int);
-    ctor public EditTextPreference(android.content.Context, android.util.AttributeSet);
-    ctor public EditTextPreference(android.content.Context);
-    method public java.lang.String getText();
-    method public void setText(java.lang.String);
-  }
-
-  public class EditTextPreferenceDialogFragmentCompat extends android.support.v7.preference.PreferenceDialogFragmentCompat {
-    ctor public EditTextPreferenceDialogFragmentCompat();
-    method public static android.support.v7.preference.EditTextPreferenceDialogFragmentCompat newInstance(java.lang.String);
-    method public void onDialogClosed(boolean);
-  }
-
-  public class ListPreference extends android.support.v7.preference.DialogPreference {
-    ctor public ListPreference(android.content.Context, android.util.AttributeSet, int, int);
-    ctor public ListPreference(android.content.Context, android.util.AttributeSet, int);
-    ctor public ListPreference(android.content.Context, android.util.AttributeSet);
-    ctor public ListPreference(android.content.Context);
-    method public int findIndexOfValue(java.lang.String);
-    method public java.lang.CharSequence[] getEntries();
-    method public java.lang.CharSequence getEntry();
-    method public java.lang.CharSequence[] getEntryValues();
-    method public java.lang.String getValue();
-    method public void setEntries(java.lang.CharSequence[]);
-    method public void setEntries(int);
-    method public void setEntryValues(java.lang.CharSequence[]);
-    method public void setEntryValues(int);
-    method public void setValue(java.lang.String);
-    method public void setValueIndex(int);
-  }
-
-  public class ListPreferenceDialogFragmentCompat extends android.support.v7.preference.PreferenceDialogFragmentCompat {
-    ctor public ListPreferenceDialogFragmentCompat();
-    method public static android.support.v7.preference.ListPreferenceDialogFragmentCompat newInstance(java.lang.String);
-    method public void onDialogClosed(boolean);
-  }
-
-  public class Preference implements java.lang.Comparable {
-    ctor public Preference(android.content.Context, android.util.AttributeSet, int, int);
-    ctor public Preference(android.content.Context, android.util.AttributeSet, int);
-    ctor public Preference(android.content.Context, android.util.AttributeSet);
-    ctor public Preference(android.content.Context);
-    method public boolean callChangeListener(java.lang.Object);
-    method public int compareTo(android.support.v7.preference.Preference);
-    method protected android.support.v7.preference.Preference findPreferenceInHierarchy(java.lang.String);
-    method public android.content.Context getContext();
-    method public java.lang.String getDependency();
-    method public android.os.Bundle getExtras();
-    method public java.lang.String getFragment();
-    method public android.graphics.drawable.Drawable getIcon();
-    method public android.content.Intent getIntent();
-    method public java.lang.String getKey();
-    method public final int getLayoutResource();
-    method public android.support.v7.preference.Preference.OnPreferenceChangeListener getOnPreferenceChangeListener();
-    method public android.support.v7.preference.Preference.OnPreferenceClickListener getOnPreferenceClickListener();
-    method public int getOrder();
-    method protected boolean getPersistedBoolean(boolean);
-    method protected float getPersistedFloat(float);
-    method protected int getPersistedInt(int);
-    method protected long getPersistedLong(long);
-    method protected java.lang.String getPersistedString(java.lang.String);
-    method public android.support.v7.preference.PreferenceManager getPreferenceManager();
-    method public android.content.SharedPreferences getSharedPreferences();
-    method public boolean getShouldDisableView();
-    method public java.lang.CharSequence getSummary();
-    method public java.lang.CharSequence getTitle();
-    method public final int getWidgetLayoutResource();
-    method public boolean hasKey();
-    method public boolean isEnabled();
-    method public boolean isPersistent();
-    method public boolean isSelectable();
-    method public final boolean isVisible();
-    method protected void notifyChanged();
-    method public void notifyDependencyChange(boolean);
-    method protected void notifyHierarchyChanged();
-    method public void onAttached();
-    method protected void onAttachedToHierarchy(android.support.v7.preference.PreferenceManager);
-    method public void onBindViewHolder(android.support.v7.preference.PreferenceViewHolder);
-    method protected void onClick();
-    method public void onDependencyChanged(android.support.v7.preference.Preference, boolean);
-    method public void onDetached();
-    method protected java.lang.Object onGetDefaultValue(android.content.res.TypedArray, int);
-    method public void onInitializeAccessibilityNodeInfo(android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
-    method public void onParentChanged(android.support.v7.preference.Preference, boolean);
-    method protected void onPrepareForRemoval();
-    method protected void onRestoreInstanceState(android.os.Parcelable);
-    method protected android.os.Parcelable onSaveInstanceState();
-    method protected void onSetInitialValue(boolean, java.lang.Object);
-    method public android.os.Bundle peekExtras();
-    method protected boolean persistBoolean(boolean);
-    method protected boolean persistFloat(float);
-    method protected boolean persistInt(int);
-    method protected boolean persistLong(long);
-    method protected boolean persistString(java.lang.String);
-    method public void restoreHierarchyState(android.os.Bundle);
-    method public void saveHierarchyState(android.os.Bundle);
-    method public void setDefaultValue(java.lang.Object);
-    method public void setDependency(java.lang.String);
-    method public void setEnabled(boolean);
-    method public void setFragment(java.lang.String);
-    method public void setIcon(android.graphics.drawable.Drawable);
-    method public void setIcon(int);
-    method public void setIntent(android.content.Intent);
-    method public void setKey(java.lang.String);
-    method public void setLayoutResource(int);
-    method public void setOnPreferenceChangeListener(android.support.v7.preference.Preference.OnPreferenceChangeListener);
-    method public void setOnPreferenceClickListener(android.support.v7.preference.Preference.OnPreferenceClickListener);
-    method public void setOrder(int);
-    method public void setPersistent(boolean);
-    method public void setSelectable(boolean);
-    method public void setShouldDisableView(boolean);
-    method public void setSummary(java.lang.CharSequence);
-    method public void setSummary(int);
-    method public void setTitle(java.lang.CharSequence);
-    method public void setTitle(int);
-    method public void setViewId(int);
-    method public final void setVisible(boolean);
-    method public void setWidgetLayoutResource(int);
-    method public boolean shouldDisableDependents();
-    method protected boolean shouldPersist();
-    field public static final int DEFAULT_ORDER = 2147483647; // 0x7fffffff
-  }
-
-  public static class Preference.BaseSavedState extends android.view.AbsSavedState {
-    ctor public Preference.BaseSavedState(android.os.Parcel);
-    ctor public Preference.BaseSavedState(android.os.Parcelable);
-    field public static final android.os.Parcelable.Creator<android.support.v7.preference.Preference.BaseSavedState> CREATOR;
-  }
-
-  public static abstract interface Preference.OnPreferenceChangeListener {
-    method public abstract boolean onPreferenceChange(android.support.v7.preference.Preference, java.lang.Object);
-  }
-
-  public static abstract interface Preference.OnPreferenceClickListener {
-    method public abstract boolean onPreferenceClick(android.support.v7.preference.Preference);
-  }
-
-  public class PreferenceCategory extends android.support.v7.preference.PreferenceGroup {
-    ctor public PreferenceCategory(android.content.Context, android.util.AttributeSet, int, int);
-    ctor public PreferenceCategory(android.content.Context, android.util.AttributeSet, int);
-    ctor public PreferenceCategory(android.content.Context, android.util.AttributeSet);
-    ctor public PreferenceCategory(android.content.Context);
-  }
-
-  public abstract class PreferenceDialogFragmentCompat extends android.support.v4.app.DialogFragment implements android.content.DialogInterface.OnClickListener {
-    ctor public PreferenceDialogFragmentCompat();
-    method public android.support.v7.preference.DialogPreference getPreference();
-    method protected void onBindDialogView(android.view.View);
-    method public void onClick(android.content.DialogInterface, int);
-    method protected android.view.View onCreateDialogView(android.content.Context);
-    method public abstract void onDialogClosed(boolean);
-    method protected void onPrepareDialogBuilder(android.support.v7.app.AlertDialog.Builder);
-    field protected static final java.lang.String ARG_KEY = "key";
-  }
-
-  public abstract class PreferenceFragmentCompat extends android.support.v4.app.Fragment implements android.support.v7.preference.DialogPreference.TargetFragment android.support.v7.preference.PreferenceManager.OnDisplayPreferenceDialogListener android.support.v7.preference.PreferenceManager.OnNavigateToScreenListener android.support.v7.preference.PreferenceManager.OnPreferenceTreeClickListener {
-    ctor public PreferenceFragmentCompat();
-    method public void addPreferencesFromResource(int);
-    method public android.support.v7.preference.Preference findPreference(java.lang.CharSequence);
-    method public final android.support.v7.widget.RecyclerView getListView();
-    method public android.support.v7.preference.PreferenceManager getPreferenceManager();
-    method public android.support.v7.preference.PreferenceScreen getPreferenceScreen();
-    method protected android.support.v7.widget.RecyclerView.Adapter onCreateAdapter(android.support.v7.preference.PreferenceScreen);
-    method public android.support.v7.widget.RecyclerView.LayoutManager onCreateLayoutManager();
-    method public abstract void onCreatePreferences(android.os.Bundle, java.lang.String);
-    method public android.support.v7.widget.RecyclerView onCreateRecyclerView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
-    method public void onDisplayPreferenceDialog(android.support.v7.preference.Preference);
-    method public void onNavigateToScreen(android.support.v7.preference.PreferenceScreen);
-    method public boolean onPreferenceTreeClick(android.support.v7.preference.Preference);
-    method public void scrollToPreference(java.lang.String);
-    method public void scrollToPreference(android.support.v7.preference.Preference);
-    method public void setDivider(android.graphics.drawable.Drawable);
-    method public void setDividerHeight(int);
-    method public void setPreferenceScreen(android.support.v7.preference.PreferenceScreen);
-    method public void setPreferencesFromResource(int, java.lang.String);
-    field public static final java.lang.String ARG_PREFERENCE_ROOT = "android.support.v7.preference.PreferenceFragmentCompat.PREFERENCE_ROOT";
-  }
-
-  public static abstract interface PreferenceFragmentCompat.OnPreferenceDisplayDialogCallback {
-    method public abstract boolean onPreferenceDisplayDialog(android.support.v7.preference.PreferenceFragmentCompat, android.support.v7.preference.Preference);
-  }
-
-  public static abstract interface PreferenceFragmentCompat.OnPreferenceStartFragmentCallback {
-    method public abstract boolean onPreferenceStartFragment(android.support.v7.preference.PreferenceFragmentCompat, android.support.v7.preference.Preference);
-  }
-
-  public static abstract interface PreferenceFragmentCompat.OnPreferenceStartScreenCallback {
-    method public abstract boolean onPreferenceStartScreen(android.support.v7.preference.PreferenceFragmentCompat, android.support.v7.preference.PreferenceScreen);
-  }
-
-  public abstract class PreferenceGroup extends android.support.v7.preference.Preference {
-    ctor public PreferenceGroup(android.content.Context, android.util.AttributeSet, int, int);
-    ctor public PreferenceGroup(android.content.Context, android.util.AttributeSet, int);
-    ctor public PreferenceGroup(android.content.Context, android.util.AttributeSet);
-    method public void addItemFromInflater(android.support.v7.preference.Preference);
-    method public boolean addPreference(android.support.v7.preference.Preference);
-    method protected void dispatchRestoreInstanceState(android.os.Bundle);
-    method protected void dispatchSaveInstanceState(android.os.Bundle);
-    method public android.support.v7.preference.Preference findPreference(java.lang.CharSequence);
-    method public android.support.v7.preference.Preference getPreference(int);
-    method public int getPreferenceCount();
-    method protected boolean isOnSameScreenAsChildren();
-    method public boolean isOrderingAsAdded();
-    method protected boolean onPrepareAddPreference(android.support.v7.preference.Preference);
-    method public void removeAll();
-    method public boolean removePreference(android.support.v7.preference.Preference);
-    method public void setOrderingAsAdded(boolean);
-  }
-
-  public static abstract interface PreferenceGroup.PreferencePositionCallback {
-    method public abstract int getPreferenceAdapterPosition(java.lang.String);
-    method public abstract int getPreferenceAdapterPosition(android.support.v7.preference.Preference);
-  }
-
-  public class PreferenceManager {
-    method public android.support.v7.preference.PreferenceScreen createPreferenceScreen(android.content.Context);
-    method public android.support.v7.preference.Preference findPreference(java.lang.CharSequence);
-    method public android.content.Context getContext();
-    method public static android.content.SharedPreferences getDefaultSharedPreferences(android.content.Context);
-    method public android.support.v7.preference.PreferenceManager.OnDisplayPreferenceDialogListener getOnDisplayPreferenceDialogListener();
-    method public android.support.v7.preference.PreferenceManager.OnNavigateToScreenListener getOnNavigateToScreenListener();
-    method public android.support.v7.preference.PreferenceManager.OnPreferenceTreeClickListener getOnPreferenceTreeClickListener();
-    method public android.support.v7.preference.PreferenceScreen getPreferenceScreen();
-    method public android.content.SharedPreferences getSharedPreferences();
-    method public int getSharedPreferencesMode();
-    method public java.lang.String getSharedPreferencesName();
-    method public boolean isStorageDefault();
-    method public boolean isStorageDeviceProtected();
-    method public static void setDefaultValues(android.content.Context, int, boolean);
-    method public static void setDefaultValues(android.content.Context, java.lang.String, int, int, boolean);
-    method public void setOnDisplayPreferenceDialogListener(android.support.v7.preference.PreferenceManager.OnDisplayPreferenceDialogListener);
-    method public void setOnNavigateToScreenListener(android.support.v7.preference.PreferenceManager.OnNavigateToScreenListener);
-    method public void setOnPreferenceTreeClickListener(android.support.v7.preference.PreferenceManager.OnPreferenceTreeClickListener);
-    method public boolean setPreferences(android.support.v7.preference.PreferenceScreen);
-    method public void setSharedPreferencesMode(int);
-    method public void setSharedPreferencesName(java.lang.String);
-    method public void setStorageDefault();
-    method public void setStorageDeviceProtected();
-    method public void showDialog(android.support.v7.preference.Preference);
-    field public static final java.lang.String KEY_HAS_SET_DEFAULT_VALUES = "_has_set_default_values";
-  }
-
-  public static abstract interface PreferenceManager.OnDisplayPreferenceDialogListener {
-    method public abstract void onDisplayPreferenceDialog(android.support.v7.preference.Preference);
-  }
-
-  public static abstract interface PreferenceManager.OnNavigateToScreenListener {
-    method public abstract void onNavigateToScreen(android.support.v7.preference.PreferenceScreen);
-  }
-
-  public static abstract interface PreferenceManager.OnPreferenceTreeClickListener {
-    method public abstract boolean onPreferenceTreeClick(android.support.v7.preference.Preference);
-  }
-
-  public final class PreferenceScreen extends android.support.v7.preference.PreferenceGroup {
-    method public void setShouldUseGeneratedIds(boolean);
-    method public boolean shouldUseGeneratedIds();
-  }
-
-  public class PreferenceViewHolder extends android.support.v7.widget.RecyclerView.ViewHolder {
-    method public android.view.View findViewById(int);
-    method public boolean isDividerAllowedAbove();
-    method public boolean isDividerAllowedBelow();
-    method public void setDividerAllowedAbove(boolean);
-    method public void setDividerAllowedBelow(boolean);
-  }
-
-  public class SwitchPreferenceCompat extends android.support.v7.preference.TwoStatePreference {
-    ctor public SwitchPreferenceCompat(android.content.Context, android.util.AttributeSet, int, int);
-    ctor public SwitchPreferenceCompat(android.content.Context, android.util.AttributeSet, int);
-    ctor public SwitchPreferenceCompat(android.content.Context, android.util.AttributeSet);
-    ctor public SwitchPreferenceCompat(android.content.Context);
-    method public java.lang.CharSequence getSwitchTextOff();
-    method public java.lang.CharSequence getSwitchTextOn();
-    method public void setSwitchTextOff(java.lang.CharSequence);
-    method public void setSwitchTextOff(int);
-    method public void setSwitchTextOn(java.lang.CharSequence);
-    method public void setSwitchTextOn(int);
-  }
-
-  public abstract class TwoStatePreference extends android.support.v7.preference.Preference {
-    ctor public TwoStatePreference(android.content.Context, android.util.AttributeSet, int, int);
-    ctor public TwoStatePreference(android.content.Context, android.util.AttributeSet, int);
-    ctor public TwoStatePreference(android.content.Context, android.util.AttributeSet);
-    ctor public TwoStatePreference(android.content.Context);
-    method public boolean getDisableDependentsState();
-    method public java.lang.CharSequence getSummaryOff();
-    method public java.lang.CharSequence getSummaryOn();
-    method public boolean isChecked();
-    method public void setChecked(boolean);
-    method public void setDisableDependentsState(boolean);
-    method public void setSummaryOff(java.lang.CharSequence);
-    method public void setSummaryOff(int);
-    method public void setSummaryOn(java.lang.CharSequence);
-    method public void setSummaryOn(int);
-    method protected void syncSummaryView(android.support.v7.preference.PreferenceViewHolder);
-    field protected boolean mChecked;
-  }
-
-}
-
diff --git a/v7/preference/api/removed.txt b/v7/preference/api/removed.txt
deleted file mode 100644
index b715257..0000000
--- a/v7/preference/api/removed.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-package android.support.v7.preference {
-
-  public class PreferenceManager {
-    method public deprecated void setStorageDeviceEncrypted();
-  }
-
-}
-
diff --git a/v7/preference/src/android/support/v7/preference/DropDownPreference.java b/v7/preference/src/android/support/v7/preference/DropDownPreference.java
index ee1e723..3d6ac38 100644
--- a/v7/preference/src/android/support/v7/preference/DropDownPreference.java
+++ b/v7/preference/src/android/support/v7/preference/DropDownPreference.java
@@ -71,9 +71,9 @@
 
     /**
      * By default, this class uses a simple {@link android.widget.ArrayAdapter}. But if you need
-     * a more complicated {@link android.widget.ArrayAdapter}, this method can be overriden to
+     * a more complicated {@link android.widget.ArrayAdapter}, this method can be overridden to
      * create a custom one.
-     * <p> Note: This method is called from the constructor. So, overriden methods will get called
+     * <p> Note: This method is called from the constructor. So, overridden methods will get called
      * before any subclass initialization.
      *
      * @return The custom {@link android.widget.ArrayAdapter} that needs to be used with this class.
@@ -91,6 +91,7 @@
         }
     }
 
+    @Override
     public void setValueIndex(int index) {
         setValue(getEntryValues()[index].toString());
     }
diff --git a/v7/preference/src/android/support/v7/preference/EditTextPreference.java b/v7/preference/src/android/support/v7/preference/EditTextPreference.java
index 423a0c9..0ebb229 100644
--- a/v7/preference/src/android/support/v7/preference/EditTextPreference.java
+++ b/v7/preference/src/android/support/v7/preference/EditTextPreference.java
@@ -143,10 +143,12 @@
 
         public static final Parcelable.Creator<SavedState> CREATOR =
                 new Parcelable.Creator<SavedState>() {
+            @Override
             public SavedState createFromParcel(Parcel in) {
                 return new SavedState(in);
             }
 
+            @Override
             public SavedState[] newArray(int size) {
                 return new SavedState[size];
             }
diff --git a/v7/preference/src/android/support/v7/preference/ListPreference.java b/v7/preference/src/android/support/v7/preference/ListPreference.java
index 2b433e5..13dd9e5 100644
--- a/v7/preference/src/android/support/v7/preference/ListPreference.java
+++ b/v7/preference/src/android/support/v7/preference/ListPreference.java
@@ -305,10 +305,12 @@
 
         public static final Parcelable.Creator<SavedState> CREATOR =
                 new Parcelable.Creator<SavedState>() {
+            @Override
             public SavedState createFromParcel(Parcel in) {
                 return new SavedState(in);
             }
 
+            @Override
             public SavedState[] newArray(int size) {
                 return new SavedState[size];
             }
diff --git a/v7/preference/src/android/support/v7/preference/ListPreferenceDialogFragmentCompat.java b/v7/preference/src/android/support/v7/preference/ListPreferenceDialogFragmentCompat.java
index dda461d..cbce40f 100644
--- a/v7/preference/src/android/support/v7/preference/ListPreferenceDialogFragmentCompat.java
+++ b/v7/preference/src/android/support/v7/preference/ListPreferenceDialogFragmentCompat.java
@@ -98,6 +98,7 @@
 
         builder.setSingleChoiceItems(mEntries, mClickedDialogEntryIndex,
                 new DialogInterface.OnClickListener() {
+                    @Override
                     public void onClick(DialogInterface dialog, int which) {
                         mClickedDialogEntryIndex = which;
 
diff --git a/v7/preference/src/android/support/v7/preference/Preference.java b/v7/preference/src/android/support/v7/preference/Preference.java
index c8897fe..2534b44 100644
--- a/v7/preference/src/android/support/v7/preference/Preference.java
+++ b/v7/preference/src/android/support/v7/preference/Preference.java
@@ -1741,10 +1741,12 @@
 
         public static final Parcelable.Creator<BaseSavedState> CREATOR =
                 new Parcelable.Creator<BaseSavedState>() {
+                    @Override
                     public BaseSavedState createFromParcel(Parcel in) {
                         return new BaseSavedState(in);
                     }
 
+                    @Override
                     public BaseSavedState[] newArray(int size) {
                         return new BaseSavedState[size];
                     }
diff --git a/v7/preference/src/android/support/v7/preference/PreferenceFragmentCompat.java b/v7/preference/src/android/support/v7/preference/PreferenceFragmentCompat.java
index cf58fc6..5c093e8 100644
--- a/v7/preference/src/android/support/v7/preference/PreferenceFragmentCompat.java
+++ b/v7/preference/src/android/support/v7/preference/PreferenceFragmentCompat.java
@@ -88,14 +88,14 @@
  * <p>The following sample code shows a simple preference fragment that is
  * populated from a resource.  The resource it loads is:</p>
  *
- * {@sample development/samples/ApiDemos/res/xml/preferences.xml preferences}
+ * {@sample frameworks/support/samples/SupportPreferenceDemos/res/xml/preferences.xml preferences}
  *
  * <p>The fragment implementation itself simply populates the preferences
  * when created.  Note that the preferences framework takes care of loading
  * the current values out of the app preferences and writing them when changed:</p>
  *
- * {@sample development/samples/ApiDemos/src/com/example/android/apis/preference/FragmentPreferences.java
- *      fragment}
+ * {@sample frameworks/support/samples/SupportPreferenceDemos/src/com/example/android/supportpreference/FragmentSupportPreferencesCompat.java
+ *      support_fragment_compat}
  *
  * @see Preference
  * @see PreferenceScreen
@@ -143,6 +143,7 @@
     };
 
     final private Runnable mRequestFocus = new Runnable() {
+        @Override
         public void run() {
             mList.focusableViewAvailable(mList);
         }
@@ -456,6 +457,7 @@
     /**
      * {@inheritDoc}
      */
+    @Override
     public boolean onPreferenceTreeClick(Preference preference) {
         if (preference.getFragment() != null) {
             boolean handled = false;
@@ -502,6 +504,7 @@
      * @return The {@link Preference} with the key, or null.
      * @see android.support.v7.preference.PreferenceGroup#findPreference(CharSequence)
      */
+    @Override
     public Preference findPreference(CharSequence key) {
         if (mPreferenceManager == null) {
             return null;
diff --git a/v7/preference/src/android/support/v7/preference/PreferenceGroupAdapter.java b/v7/preference/src/android/support/v7/preference/PreferenceGroupAdapter.java
index fcdbe65..ff29ed8 100644
--- a/v7/preference/src/android/support/v7/preference/PreferenceGroupAdapter.java
+++ b/v7/preference/src/android/support/v7/preference/PreferenceGroupAdapter.java
@@ -69,6 +69,7 @@
     private Handler mHandler = new Handler();
 
     private Runnable mSyncRunnable = new Runnable() {
+        @Override
         public void run() {
             syncMyPreferences();
         }
@@ -196,6 +197,7 @@
         return mPreferenceList.get(position);
     }
 
+    @Override
     public long getItemId(int position) {
         if (!hasStableIds()) {
             return RecyclerView.NO_ID;
@@ -203,6 +205,7 @@
         return this.getItem(position).getId();
     }
 
+    @Override
     public void onPreferenceChange(Preference preference) {
         final int index = mPreferenceList.indexOf(preference);
         // If we don't find the preference, we don't need to notify anyone
@@ -212,6 +215,7 @@
         }
     }
 
+    @Override
     public void onPreferenceHierarchyChange(Preference preference) {
         mHandler.removeCallbacks(mSyncRunnable);
         mHandler.post(mSyncRunnable);
@@ -237,7 +241,7 @@
 
             notifyItemInserted(previousVisibleIndex + 1);
         } else {
-            // The preference has become invisibile. Find it in the list and remove it.
+            // The preference has become invisible. Find it in the list and remove it.
 
             int removalIndex;
             final int listSize = mPreferenceList.size();
@@ -318,8 +322,8 @@
     public int getPreferenceAdapterPosition(Preference preference) {
         final int size = mPreferenceList.size();
         for (int i = 0; i < size; i++) {
-            final Preference canidate = mPreferenceList.get(i);
-            if (canidate != null && canidate.equals(preference)) {
+            final Preference candidate = mPreferenceList.get(i);
+            if (candidate != null && candidate.equals(preference)) {
                 return i;
             }
         }
diff --git a/v7/preference/src/android/support/v7/preference/PreferenceInflater.java b/v7/preference/src/android/support/v7/preference/PreferenceInflater.java
index 30f92c1..33196de 100644
--- a/v7/preference/src/android/support/v7/preference/PreferenceInflater.java
+++ b/v7/preference/src/android/support/v7/preference/PreferenceInflater.java
@@ -211,7 +211,7 @@
      * @param name The full name of the class to be instantiated.
      * @param attrs The XML attributes supplied for this instance.
      *
-     * @return The newly instantied item, or null.
+     * @return The newly instantiated item, or null.
      */
     private Preference createItem(@NonNull String name, @Nullable String[] prefixes,
             AttributeSet attrs)
diff --git a/v7/preference/src/android/support/v7/preference/TwoStatePreference.java b/v7/preference/src/android/support/v7/preference/TwoStatePreference.java
index 0b0ed4a..53965f1 100644
--- a/v7/preference/src/android/support/v7/preference/TwoStatePreference.java
+++ b/v7/preference/src/android/support/v7/preference/TwoStatePreference.java
@@ -276,10 +276,12 @@
 
         public static final Parcelable.Creator<SavedState> CREATOR =
                 new Parcelable.Creator<SavedState>() {
+            @Override
             public SavedState createFromParcel(Parcel in) {
                 return new SavedState(in);
             }
 
+            @Override
             public SavedState[] newArray(int size) {
                 return new SavedState[size];
             }
diff --git a/v7/recyclerview/Android.mk b/v7/recyclerview/Android.mk
index 021296e..52572fe 100644
--- a/v7/recyclerview/Android.mk
+++ b/v7/recyclerview/Android.mk
@@ -19,30 +19,23 @@
 #
 #   LOCAL_STATIC_ANDROID_LIBRARIES := \
 #       android-support-v7-recycler-view \
-#       android-support-v4 \
+#       android-support-compat \
+#       android-support-core-ui \
 #       android-support-annotations
 #
 # in their makefiles to include the resources and their dependencies in their package.
 include $(CLEAR_VARS)
 LOCAL_USE_AAPT2 := true
 LOCAL_MODULE := android-support-v7-recyclerview
-LOCAL_SDK_VERSION := 7
+LOCAL_SDK_VERSION := 9
 LOCAL_SDK_RES_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
 LOCAL_SRC_FILES := $(call all-java-files-under,src)
 LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
 LOCAL_SHARED_ANDROID_LIBRARIES := \
-    android-support-v4 \
+    android-support-compat \
+    android-support-core-ui \
     android-support-annotations
 LOCAL_JAR_EXCLUDE_FILES := none
 LOCAL_JAVA_LANGUAGE_VERSION := 1.7
 include $(BUILD_STATIC_JAVA_LIBRARY)
 
-# API Check
-# ---------------------------------------------
-support_module := $(LOCAL_MODULE)
-support_module_api_dir := $(LOCAL_PATH)/api
-support_module_src_files := $(LOCAL_SRC_FILES)
-support_module_java_libraries := $(LOCAL_JAVA_LIBRARIES)
-support_module_java_packages := android.support.v7.*
-include $(SUPPORT_API_CHECK)
-
diff --git a/v7/recyclerview/AndroidManifest.xml b/v7/recyclerview/AndroidManifest.xml
index 421395f..d1c1489 100644
--- a/v7/recyclerview/AndroidManifest.xml
+++ b/v7/recyclerview/AndroidManifest.xml
@@ -15,5 +15,5 @@
 -->
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
           package="android.support.v7.recyclerview">
-    <uses-sdk android:minSdkVersion="7"/>
+    <uses-sdk android:minSdkVersion="9"/>
 </manifest>
diff --git a/v7/recyclerview/api/22.0.0.txt b/v7/recyclerview/api/22.0.0.txt
deleted file mode 100644
index 87b174b..0000000
--- a/v7/recyclerview/api/22.0.0.txt
+++ /dev/null
@@ -1,569 +0,0 @@
-package android.support.v7.widget {
-
-  public class DefaultItemAnimator extends android.support.v7.widget.RecyclerView.ItemAnimator {
-    ctor public DefaultItemAnimator();
-    method public boolean animateAdd(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public boolean animateChange(android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ViewHolder, int, int, int, int);
-    method public boolean animateMove(android.support.v7.widget.RecyclerView.ViewHolder, int, int, int, int);
-    method public boolean animateRemove(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void endAnimation(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void endAnimations();
-    method public boolean isRunning();
-    method public void runPendingAnimations();
-  }
-
-  public class GridLayoutManager extends android.support.v7.widget.LinearLayoutManager {
-    ctor public GridLayoutManager(android.content.Context, int);
-    ctor public GridLayoutManager(android.content.Context, int, int, boolean);
-    method public int getSpanCount();
-    method public android.support.v7.widget.GridLayoutManager.SpanSizeLookup getSpanSizeLookup();
-    method public void setSpanCount(int);
-    method public void setSpanSizeLookup(android.support.v7.widget.GridLayoutManager.SpanSizeLookup);
-    field public static final int DEFAULT_SPAN_COUNT = -1; // 0xffffffff
-  }
-
-  public static final class GridLayoutManager.DefaultSpanSizeLookup extends android.support.v7.widget.GridLayoutManager.SpanSizeLookup {
-    ctor public GridLayoutManager.DefaultSpanSizeLookup();
-    method public int getSpanSize(int);
-  }
-
-  public static class GridLayoutManager.LayoutParams extends android.support.v7.widget.RecyclerView.LayoutParams {
-    ctor public GridLayoutManager.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public GridLayoutManager.LayoutParams(int, int);
-    ctor public GridLayoutManager.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public GridLayoutManager.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public GridLayoutManager.LayoutParams(android.support.v7.widget.RecyclerView.LayoutParams);
-    method public int getSpanIndex();
-    method public int getSpanSize();
-    field public static final int INVALID_SPAN_ID = -1; // 0xffffffff
-  }
-
-  public static abstract class GridLayoutManager.SpanSizeLookup {
-    ctor public GridLayoutManager.SpanSizeLookup();
-    method public int getSpanGroupIndex(int, int);
-    method public int getSpanIndex(int, int);
-    method public abstract int getSpanSize(int);
-    method public void invalidateSpanIndexCache();
-    method public boolean isSpanIndexCacheEnabled();
-    method public void setSpanIndexCacheEnabled(boolean);
-  }
-
-  public class LinearLayoutManager extends android.support.v7.widget.RecyclerView.LayoutManager {
-    ctor public LinearLayoutManager(android.content.Context);
-    ctor public LinearLayoutManager(android.content.Context, int, boolean);
-    method public android.graphics.PointF computeScrollVectorForPosition(int);
-    method public int findFirstCompletelyVisibleItemPosition();
-    method public int findFirstVisibleItemPosition();
-    method public int findLastCompletelyVisibleItemPosition();
-    method public int findLastVisibleItemPosition();
-    method public android.support.v7.widget.RecyclerView.LayoutParams generateDefaultLayoutParams();
-    method protected int getExtraLayoutSpace(android.support.v7.widget.RecyclerView.State);
-    method public int getOrientation();
-    method public boolean getRecycleChildrenOnDetach();
-    method public boolean getReverseLayout();
-    method public boolean getStackFromEnd();
-    method protected boolean isLayoutRTL();
-    method public boolean isSmoothScrollbarEnabled();
-    method public void scrollToPositionWithOffset(int, int);
-    method public void setOrientation(int);
-    method public void setRecycleChildrenOnDetach(boolean);
-    method public void setReverseLayout(boolean);
-    method public void setSmoothScrollbarEnabled(boolean);
-    method public void setStackFromEnd(boolean);
-    field public static final int HORIZONTAL = 0; // 0x0
-    field public static final int INVALID_OFFSET = -2147483648; // 0x80000000
-    field public static final int VERTICAL = 1; // 0x1
-  }
-
-  protected static class LinearLayoutManager.LayoutChunkResult {
-    ctor protected LinearLayoutManager.LayoutChunkResult();
-    field public int mConsumed;
-    field public boolean mFinished;
-    field public boolean mFocusable;
-    field public boolean mIgnoreConsumed;
-  }
-
-  public abstract class LinearSmoothScroller extends android.support.v7.widget.RecyclerView.SmoothScroller {
-    ctor public LinearSmoothScroller(android.content.Context);
-    method public int calculateDtToFit(int, int, int, int, int);
-    method public int calculateDxToMakeVisible(android.view.View, int);
-    method public int calculateDyToMakeVisible(android.view.View, int);
-    method protected float calculateSpeedPerPixel(android.util.DisplayMetrics);
-    method protected int calculateTimeForDeceleration(int);
-    method protected int calculateTimeForScrolling(int);
-    method public abstract android.graphics.PointF computeScrollVectorForPosition(int);
-    method protected int getHorizontalSnapPreference();
-    method protected int getVerticalSnapPreference();
-    method protected void onSeekTargetStep(int, int, android.support.v7.widget.RecyclerView.State, android.support.v7.widget.RecyclerView.SmoothScroller.Action);
-    method protected void onStart();
-    method protected void onStop();
-    method protected void onTargetFound(android.view.View, android.support.v7.widget.RecyclerView.State, android.support.v7.widget.RecyclerView.SmoothScroller.Action);
-    method protected void updateActionForInterimTarget(android.support.v7.widget.RecyclerView.SmoothScroller.Action);
-    field public static final int SNAP_TO_ANY = 0; // 0x0
-    field public static final int SNAP_TO_END = 1; // 0x1
-    field public static final int SNAP_TO_START = -1; // 0xffffffff
-    field protected final android.view.animation.DecelerateInterpolator mDecelerateInterpolator;
-    field protected int mInterimTargetDx;
-    field protected int mInterimTargetDy;
-    field protected final android.view.animation.LinearInterpolator mLinearInterpolator;
-    field protected android.graphics.PointF mTargetVector;
-  }
-
-  public abstract class OrientationHelper {
-    method public static android.support.v7.widget.OrientationHelper createHorizontalHelper(android.support.v7.widget.RecyclerView.LayoutManager);
-    method public static android.support.v7.widget.OrientationHelper createOrientationHelper(android.support.v7.widget.RecyclerView.LayoutManager, int);
-    method public static android.support.v7.widget.OrientationHelper createVerticalHelper(android.support.v7.widget.RecyclerView.LayoutManager);
-    method public abstract int getDecoratedEnd(android.view.View);
-    method public abstract int getDecoratedMeasurement(android.view.View);
-    method public abstract int getDecoratedMeasurementInOther(android.view.View);
-    method public abstract int getDecoratedStart(android.view.View);
-    method public abstract int getEnd();
-    method public abstract int getEndAfterPadding();
-    method public abstract int getEndPadding();
-    method public abstract int getStartAfterPadding();
-    method public abstract int getTotalSpace();
-    method public int getTotalSpaceChange();
-    method public abstract void offsetChild(android.view.View, int);
-    method public abstract void offsetChildren(int);
-    method public void onLayoutComplete();
-    field public static final int HORIZONTAL = 0; // 0x0
-    field public static final int VERTICAL = 1; // 0x1
-    field protected final android.support.v7.widget.RecyclerView.LayoutManager mLayoutManager;
-  }
-
-  public class RecyclerView extends android.view.ViewGroup {
-    ctor public RecyclerView(android.content.Context);
-    ctor public RecyclerView(android.content.Context, android.util.AttributeSet);
-    ctor public RecyclerView(android.content.Context, android.util.AttributeSet, int);
-    method public void addItemDecoration(android.support.v7.widget.RecyclerView.ItemDecoration, int);
-    method public void addItemDecoration(android.support.v7.widget.RecyclerView.ItemDecoration);
-    method public void addOnItemTouchListener(android.support.v7.widget.RecyclerView.OnItemTouchListener);
-    method public android.view.View findChildViewUnder(float, float);
-    method public android.support.v7.widget.RecyclerView.ViewHolder findViewHolderForAdapterPosition(int);
-    method public android.support.v7.widget.RecyclerView.ViewHolder findViewHolderForItemId(long);
-    method public android.support.v7.widget.RecyclerView.ViewHolder findViewHolderForLayoutPosition(int);
-    method public deprecated android.support.v7.widget.RecyclerView.ViewHolder findViewHolderForPosition(int);
-    method public boolean fling(int, int);
-    method public android.support.v7.widget.RecyclerView.Adapter getAdapter();
-    method public int getChildAdapterPosition(android.view.View);
-    method public long getChildItemId(android.view.View);
-    method public int getChildLayoutPosition(android.view.View);
-    method public deprecated int getChildPosition(android.view.View);
-    method public android.support.v7.widget.RecyclerView.ViewHolder getChildViewHolder(android.view.View);
-    method public android.support.v7.widget.RecyclerViewAccessibilityDelegate getCompatAccessibilityDelegate();
-    method public android.support.v7.widget.RecyclerView.ItemAnimator getItemAnimator();
-    method public android.support.v7.widget.RecyclerView.LayoutManager getLayoutManager();
-    method public android.support.v7.widget.RecyclerView.RecycledViewPool getRecycledViewPool();
-    method public int getScrollState();
-    method public boolean hasFixedSize();
-    method public void invalidateItemDecorations();
-    method public void offsetChildrenHorizontal(int);
-    method public void offsetChildrenVertical(int);
-    method public void onChildAttachedToWindow(android.view.View);
-    method public void onChildDetachedFromWindow(android.view.View);
-    method public void onDraw(android.graphics.Canvas);
-    method protected void onLayout(boolean, int, int, int, int);
-    method public void removeItemDecoration(android.support.v7.widget.RecyclerView.ItemDecoration);
-    method public void removeOnItemTouchListener(android.support.v7.widget.RecyclerView.OnItemTouchListener);
-    method public void scrollToPosition(int);
-    method public void setAccessibilityDelegateCompat(android.support.v7.widget.RecyclerViewAccessibilityDelegate);
-    method public void setAdapter(android.support.v7.widget.RecyclerView.Adapter);
-    method public void setHasFixedSize(boolean);
-    method public void setItemAnimator(android.support.v7.widget.RecyclerView.ItemAnimator);
-    method public void setItemViewCacheSize(int);
-    method public void setLayoutManager(android.support.v7.widget.RecyclerView.LayoutManager);
-    method public void setOnScrollListener(android.support.v7.widget.RecyclerView.OnScrollListener);
-    method public void setRecycledViewPool(android.support.v7.widget.RecyclerView.RecycledViewPool);
-    method public void setRecyclerListener(android.support.v7.widget.RecyclerView.RecyclerListener);
-    method public void setScrollingTouchSlop(int);
-    method public void setViewCacheExtension(android.support.v7.widget.RecyclerView.ViewCacheExtension);
-    method public void smoothScrollBy(int, int);
-    method public void smoothScrollToPosition(int);
-    method public void stopScroll();
-    method public void swapAdapter(android.support.v7.widget.RecyclerView.Adapter, boolean);
-    field public static final int HORIZONTAL = 0; // 0x0
-    field public static final int INVALID_TYPE = -1; // 0xffffffff
-    field public static final long NO_ID = -1L; // 0xffffffffffffffffL
-    field public static final int NO_POSITION = -1; // 0xffffffff
-    field public static final int SCROLL_STATE_DRAGGING = 1; // 0x1
-    field public static final int SCROLL_STATE_IDLE = 0; // 0x0
-    field public static final int SCROLL_STATE_SETTLING = 2; // 0x2
-    field public static final int TOUCH_SLOP_DEFAULT = 0; // 0x0
-    field public static final int TOUCH_SLOP_PAGING = 1; // 0x1
-    field public static final int VERTICAL = 1; // 0x1
-  }
-
-  public static abstract class RecyclerView.Adapter {
-    ctor public RecyclerView.Adapter();
-    method public final void bindViewHolder(VH, int);
-    method public final VH createViewHolder(android.view.ViewGroup, int);
-    method public abstract int getItemCount();
-    method public long getItemId(int);
-    method public int getItemViewType(int);
-    method public final boolean hasObservers();
-    method public final boolean hasStableIds();
-    method public final void notifyDataSetChanged();
-    method public final void notifyItemChanged(int);
-    method public final void notifyItemInserted(int);
-    method public final void notifyItemMoved(int, int);
-    method public final void notifyItemRangeChanged(int, int);
-    method public final void notifyItemRangeInserted(int, int);
-    method public final void notifyItemRangeRemoved(int, int);
-    method public final void notifyItemRemoved(int);
-    method public void onAttachedToRecyclerView(android.support.v7.widget.RecyclerView);
-    method public abstract void onBindViewHolder(VH, int);
-    method public abstract VH onCreateViewHolder(android.view.ViewGroup, int);
-    method public void onDetachedFromRecyclerView(android.support.v7.widget.RecyclerView);
-    method public boolean onFailedToRecycleView(VH);
-    method public void onViewAttachedToWindow(VH);
-    method public void onViewDetachedFromWindow(VH);
-    method public void onViewRecycled(VH);
-    method public void registerAdapterDataObserver(android.support.v7.widget.RecyclerView.AdapterDataObserver);
-    method public void setHasStableIds(boolean);
-    method public void unregisterAdapterDataObserver(android.support.v7.widget.RecyclerView.AdapterDataObserver);
-  }
-
-  public static abstract class RecyclerView.AdapterDataObserver {
-    ctor public RecyclerView.AdapterDataObserver();
-    method public void onChanged();
-    method public void onItemRangeChanged(int, int);
-    method public void onItemRangeInserted(int, int);
-    method public void onItemRangeMoved(int, int, int);
-    method public void onItemRangeRemoved(int, int);
-  }
-
-  public static abstract class RecyclerView.ItemAnimator {
-    ctor public RecyclerView.ItemAnimator();
-    method public abstract boolean animateAdd(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public abstract boolean animateChange(android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ViewHolder, int, int, int, int);
-    method public abstract boolean animateMove(android.support.v7.widget.RecyclerView.ViewHolder, int, int, int, int);
-    method public abstract boolean animateRemove(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public final void dispatchAddFinished(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public final void dispatchAddStarting(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public final void dispatchAnimationsFinished();
-    method public final void dispatchChangeFinished(android.support.v7.widget.RecyclerView.ViewHolder, boolean);
-    method public final void dispatchChangeStarting(android.support.v7.widget.RecyclerView.ViewHolder, boolean);
-    method public final void dispatchMoveFinished(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public final void dispatchMoveStarting(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public final void dispatchRemoveFinished(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public final void dispatchRemoveStarting(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public abstract void endAnimation(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public abstract void endAnimations();
-    method public long getAddDuration();
-    method public long getChangeDuration();
-    method public long getMoveDuration();
-    method public long getRemoveDuration();
-    method public boolean getSupportsChangeAnimations();
-    method public abstract boolean isRunning();
-    method public final boolean isRunning(android.support.v7.widget.RecyclerView.ItemAnimator.ItemAnimatorFinishedListener);
-    method public void onAddFinished(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void onAddStarting(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void onChangeFinished(android.support.v7.widget.RecyclerView.ViewHolder, boolean);
-    method public void onChangeStarting(android.support.v7.widget.RecyclerView.ViewHolder, boolean);
-    method public void onMoveFinished(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void onMoveStarting(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void onRemoveFinished(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void onRemoveStarting(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public abstract void runPendingAnimations();
-    method public void setAddDuration(long);
-    method public void setChangeDuration(long);
-    method public void setMoveDuration(long);
-    method public void setRemoveDuration(long);
-    method public void setSupportsChangeAnimations(boolean);
-  }
-
-  public static abstract interface RecyclerView.ItemAnimator.ItemAnimatorFinishedListener {
-    method public abstract void onAnimationsFinished();
-  }
-
-  public static abstract class RecyclerView.ItemDecoration {
-    ctor public RecyclerView.ItemDecoration();
-    method public deprecated void getItemOffsets(android.graphics.Rect, int, android.support.v7.widget.RecyclerView);
-    method public void getItemOffsets(android.graphics.Rect, android.view.View, android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.State);
-    method public void onDraw(android.graphics.Canvas, android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.State);
-    method public deprecated void onDraw(android.graphics.Canvas, android.support.v7.widget.RecyclerView);
-    method public void onDrawOver(android.graphics.Canvas, android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.State);
-    method public deprecated void onDrawOver(android.graphics.Canvas, android.support.v7.widget.RecyclerView);
-  }
-
-  public static abstract class RecyclerView.LayoutManager {
-    ctor public RecyclerView.LayoutManager();
-    method public void addDisappearingView(android.view.View);
-    method public void addDisappearingView(android.view.View, int);
-    method public void addView(android.view.View);
-    method public void addView(android.view.View, int);
-    method public void assertInLayoutOrScroll(java.lang.String);
-    method public void assertNotInLayoutOrScroll(java.lang.String);
-    method public void attachView(android.view.View, int, android.support.v7.widget.RecyclerView.LayoutParams);
-    method public void attachView(android.view.View, int);
-    method public void attachView(android.view.View);
-    method public void calculateItemDecorationsForChild(android.view.View, android.graphics.Rect);
-    method public boolean canScrollHorizontally();
-    method public boolean canScrollVertically();
-    method public boolean checkLayoutParams(android.support.v7.widget.RecyclerView.LayoutParams);
-    method public int computeHorizontalScrollExtent(android.support.v7.widget.RecyclerView.State);
-    method public int computeHorizontalScrollOffset(android.support.v7.widget.RecyclerView.State);
-    method public int computeHorizontalScrollRange(android.support.v7.widget.RecyclerView.State);
-    method public int computeVerticalScrollExtent(android.support.v7.widget.RecyclerView.State);
-    method public int computeVerticalScrollOffset(android.support.v7.widget.RecyclerView.State);
-    method public int computeVerticalScrollRange(android.support.v7.widget.RecyclerView.State);
-    method public void detachAndScrapAttachedViews(android.support.v7.widget.RecyclerView.Recycler);
-    method public void detachAndScrapView(android.view.View, android.support.v7.widget.RecyclerView.Recycler);
-    method public void detachAndScrapViewAt(int, android.support.v7.widget.RecyclerView.Recycler);
-    method public void detachView(android.view.View);
-    method public void detachViewAt(int);
-    method public void endAnimation(android.view.View);
-    method public android.view.View findViewByPosition(int);
-    method public abstract android.support.v7.widget.RecyclerView.LayoutParams generateDefaultLayoutParams();
-    method public android.support.v7.widget.RecyclerView.LayoutParams generateLayoutParams(android.view.ViewGroup.LayoutParams);
-    method public android.support.v7.widget.RecyclerView.LayoutParams generateLayoutParams(android.content.Context, android.util.AttributeSet);
-    method public int getBottomDecorationHeight(android.view.View);
-    method public android.view.View getChildAt(int);
-    method public int getChildCount();
-    method public static int getChildMeasureSpec(int, int, int, boolean);
-    method public boolean getClipToPadding();
-    method public int getColumnCountForAccessibility(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
-    method public int getDecoratedBottom(android.view.View);
-    method public int getDecoratedLeft(android.view.View);
-    method public int getDecoratedMeasuredHeight(android.view.View);
-    method public int getDecoratedMeasuredWidth(android.view.View);
-    method public int getDecoratedRight(android.view.View);
-    method public int getDecoratedTop(android.view.View);
-    method public android.view.View getFocusedChild();
-    method public int getHeight();
-    method public int getItemCount();
-    method public int getItemViewType(android.view.View);
-    method public int getLayoutDirection();
-    method public int getLeftDecorationWidth(android.view.View);
-    method public int getMinimumHeight();
-    method public int getMinimumWidth();
-    method public int getPaddingBottom();
-    method public int getPaddingEnd();
-    method public int getPaddingLeft();
-    method public int getPaddingRight();
-    method public int getPaddingStart();
-    method public int getPaddingTop();
-    method public int getPosition(android.view.View);
-    method public int getRightDecorationWidth(android.view.View);
-    method public int getRowCountForAccessibility(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
-    method public int getSelectionModeForAccessibility(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
-    method public int getTopDecorationHeight(android.view.View);
-    method public int getWidth();
-    method public boolean hasFocus();
-    method public void ignoreView(android.view.View);
-    method public boolean isFocused();
-    method public boolean isLayoutHierarchical(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
-    method public boolean isSmoothScrolling();
-    method public void layoutDecorated(android.view.View, int, int, int, int);
-    method public void measureChild(android.view.View, int, int);
-    method public void measureChildWithMargins(android.view.View, int, int);
-    method public void moveView(int, int);
-    method public void offsetChildrenHorizontal(int);
-    method public void offsetChildrenVertical(int);
-    method public void onAdapterChanged(android.support.v7.widget.RecyclerView.Adapter, android.support.v7.widget.RecyclerView.Adapter);
-    method public boolean onAddFocusables(android.support.v7.widget.RecyclerView, java.util.ArrayList<android.view.View>, int, int);
-    method public void onAttachedToWindow(android.support.v7.widget.RecyclerView);
-    method public deprecated void onDetachedFromWindow(android.support.v7.widget.RecyclerView);
-    method public void onDetachedFromWindow(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.Recycler);
-    method public android.view.View onFocusSearchFailed(android.view.View, int, android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
-    method public void onInitializeAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
-    method public void onInitializeAccessibilityEvent(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State, android.view.accessibility.AccessibilityEvent);
-    method public void onInitializeAccessibilityNodeInfo(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State, android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
-    method public void onInitializeAccessibilityNodeInfoForItem(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State, android.view.View, android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
-    method public android.view.View onInterceptFocusSearch(android.view.View, int);
-    method public void onItemsAdded(android.support.v7.widget.RecyclerView, int, int);
-    method public void onItemsChanged(android.support.v7.widget.RecyclerView);
-    method public void onItemsMoved(android.support.v7.widget.RecyclerView, int, int, int);
-    method public void onItemsRemoved(android.support.v7.widget.RecyclerView, int, int);
-    method public void onItemsUpdated(android.support.v7.widget.RecyclerView, int, int);
-    method public void onLayoutChildren(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
-    method public void onMeasure(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State, int, int);
-    method public deprecated boolean onRequestChildFocus(android.support.v7.widget.RecyclerView, android.view.View, android.view.View);
-    method public boolean onRequestChildFocus(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.State, android.view.View, android.view.View);
-    method public void onRestoreInstanceState(android.os.Parcelable);
-    method public android.os.Parcelable onSaveInstanceState();
-    method public void onScrollStateChanged(int);
-    method public boolean performAccessibilityAction(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State, int, android.os.Bundle);
-    method public boolean performAccessibilityActionForItem(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State, android.view.View, int, android.os.Bundle);
-    method public void removeAllViews();
-    method public void removeAndRecycleAllViews(android.support.v7.widget.RecyclerView.Recycler);
-    method public void removeAndRecycleView(android.view.View, android.support.v7.widget.RecyclerView.Recycler);
-    method public void removeAndRecycleViewAt(int, android.support.v7.widget.RecyclerView.Recycler);
-    method public void removeDetachedView(android.view.View);
-    method public void removeView(android.view.View);
-    method public void removeViewAt(int);
-    method public boolean requestChildRectangleOnScreen(android.support.v7.widget.RecyclerView, android.view.View, android.graphics.Rect, boolean);
-    method public void requestLayout();
-    method public void requestSimpleAnimationsInNextLayout();
-    method public int scrollHorizontallyBy(int, android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
-    method public void scrollToPosition(int);
-    method public int scrollVerticallyBy(int, android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
-    method public void setMeasuredDimension(int, int);
-    method public void smoothScrollToPosition(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.State, int);
-    method public void startSmoothScroll(android.support.v7.widget.RecyclerView.SmoothScroller);
-    method public void stopIgnoringView(android.view.View);
-    method public boolean supportsPredictiveItemAnimations();
-  }
-
-  public static class RecyclerView.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
-    ctor public RecyclerView.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public RecyclerView.LayoutParams(int, int);
-    ctor public RecyclerView.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public RecyclerView.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public RecyclerView.LayoutParams(android.support.v7.widget.RecyclerView.LayoutParams);
-    method public int getViewAdapterPosition();
-    method public int getViewLayoutPosition();
-    method public deprecated int getViewPosition();
-    method public boolean isItemChanged();
-    method public boolean isItemRemoved();
-    method public boolean isViewInvalid();
-    method public boolean viewNeedsUpdate();
-  }
-
-  public static abstract interface RecyclerView.OnItemTouchListener {
-    method public abstract boolean onInterceptTouchEvent(android.support.v7.widget.RecyclerView, android.view.MotionEvent);
-    method public abstract void onTouchEvent(android.support.v7.widget.RecyclerView, android.view.MotionEvent);
-  }
-
-  public static abstract class RecyclerView.OnScrollListener {
-    ctor public RecyclerView.OnScrollListener();
-    method public void onScrollStateChanged(android.support.v7.widget.RecyclerView, int);
-    method public void onScrolled(android.support.v7.widget.RecyclerView, int, int);
-  }
-
-  public static class RecyclerView.RecycledViewPool {
-    ctor public RecyclerView.RecycledViewPool();
-    method public void clear();
-    method public android.support.v7.widget.RecyclerView.ViewHolder getRecycledView(int);
-    method public void putRecycledView(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void setMaxRecycledViews(int, int);
-  }
-
-  public final class RecyclerView.Recycler {
-    ctor public RecyclerView.Recycler();
-    method public void bindViewToPosition(android.view.View, int);
-    method public void clear();
-    method public int convertPreLayoutPositionToPostLayout(int);
-    method public java.util.List<android.support.v7.widget.RecyclerView.ViewHolder> getScrapList();
-    method public android.view.View getViewForPosition(int);
-    method public void recycleView(android.view.View);
-    method public void setViewCacheSize(int);
-  }
-
-  public static abstract interface RecyclerView.RecyclerListener {
-    method public abstract void onViewRecycled(android.support.v7.widget.RecyclerView.ViewHolder);
-  }
-
-  public static abstract class RecyclerView.SmoothScroller {
-    ctor public RecyclerView.SmoothScroller();
-    method public android.view.View findViewByPosition(int);
-    method public int getChildCount();
-    method public int getChildPosition(android.view.View);
-    method public android.support.v7.widget.RecyclerView.LayoutManager getLayoutManager();
-    method public int getTargetPosition();
-    method public void instantScrollToPosition(int);
-    method public boolean isPendingInitialRun();
-    method public boolean isRunning();
-    method protected void normalize(android.graphics.PointF);
-    method protected void onChildAttachedToWindow(android.view.View);
-    method protected abstract void onSeekTargetStep(int, int, android.support.v7.widget.RecyclerView.State, android.support.v7.widget.RecyclerView.SmoothScroller.Action);
-    method protected abstract void onStart();
-    method protected abstract void onStop();
-    method protected abstract void onTargetFound(android.view.View, android.support.v7.widget.RecyclerView.State, android.support.v7.widget.RecyclerView.SmoothScroller.Action);
-    method public void setTargetPosition(int);
-    method protected final void stop();
-  }
-
-  public static class RecyclerView.SmoothScroller.Action {
-    ctor public RecyclerView.SmoothScroller.Action(int, int);
-    ctor public RecyclerView.SmoothScroller.Action(int, int, int);
-    ctor public RecyclerView.SmoothScroller.Action(int, int, int, android.view.animation.Interpolator);
-    method public int getDuration();
-    method public int getDx();
-    method public int getDy();
-    method public android.view.animation.Interpolator getInterpolator();
-    method public void setDuration(int);
-    method public void setDx(int);
-    method public void setDy(int);
-    method public void setInterpolator(android.view.animation.Interpolator);
-    method public void update(int, int, int, android.view.animation.Interpolator);
-    field public static final int UNDEFINED_DURATION = -2147483648; // 0x80000000
-  }
-
-  public static class RecyclerView.State {
-    ctor public RecyclerView.State();
-    method public boolean didStructureChange();
-    method public T get(int);
-    method public int getItemCount();
-    method public int getTargetScrollPosition();
-    method public boolean hasTargetScrollPosition();
-    method public boolean isPreLayout();
-    method public void onViewIgnored(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void onViewRecycled(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void put(int, java.lang.Object);
-    method public void remove(int);
-    method public boolean willRunPredictiveAnimations();
-    method public boolean willRunSimpleAnimations();
-  }
-
-  public static abstract class RecyclerView.ViewCacheExtension {
-    ctor public RecyclerView.ViewCacheExtension();
-    method public abstract android.view.View getViewForPositionAndType(android.support.v7.widget.RecyclerView.Recycler, int, int);
-  }
-
-  public static abstract class RecyclerView.ViewHolder {
-    ctor public RecyclerView.ViewHolder(android.view.View);
-    method public final int getAdapterPosition();
-    method public final long getItemId();
-    method public final int getItemViewType();
-    method public final int getLayoutPosition();
-    method public final int getOldPosition();
-    method public final deprecated int getPosition();
-    method public final boolean isRecyclable();
-    method public final void setIsRecyclable(boolean);
-    field public final android.view.View itemView;
-  }
-
-  public class RecyclerViewAccessibilityDelegate extends android.support.v4.view.AccessibilityDelegateCompat {
-    ctor public RecyclerViewAccessibilityDelegate(android.support.v7.widget.RecyclerView);
-  }
-
-  public class StaggeredGridLayoutManager extends android.support.v7.widget.RecyclerView.LayoutManager {
-    ctor public StaggeredGridLayoutManager(int, int);
-    method public int[] findFirstCompletelyVisibleItemPositions(int[]);
-    method public int[] findFirstVisibleItemPositions(int[]);
-    method public int[] findLastCompletelyVisibleItemPositions(int[]);
-    method public int[] findLastVisibleItemPositions(int[]);
-    method public android.support.v7.widget.RecyclerView.LayoutParams generateDefaultLayoutParams();
-    method public int getGapStrategy();
-    method public int getOrientation();
-    method public boolean getReverseLayout();
-    method public int getSpanCount();
-    method public void invalidateSpanAssignments();
-    method public void scrollToPositionWithOffset(int, int);
-    method public void setGapStrategy(int);
-    method public void setOrientation(int);
-    method public void setReverseLayout(boolean);
-    method public void setSpanCount(int);
-    field public static final deprecated int GAP_HANDLING_LAZY = 1; // 0x1
-    field public static final int GAP_HANDLING_MOVE_ITEMS_BETWEEN_SPANS = 2; // 0x2
-    field public static final int GAP_HANDLING_NONE = 0; // 0x0
-    field public static final int HORIZONTAL = 0; // 0x0
-    field public static final java.lang.String TAG = "StaggeredGridLayoutManager";
-    field public static final int VERTICAL = 1; // 0x1
-  }
-
-  public static class StaggeredGridLayoutManager.LayoutParams extends android.support.v7.widget.RecyclerView.LayoutParams {
-    ctor public StaggeredGridLayoutManager.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public StaggeredGridLayoutManager.LayoutParams(int, int);
-    ctor public StaggeredGridLayoutManager.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public StaggeredGridLayoutManager.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public StaggeredGridLayoutManager.LayoutParams(android.support.v7.widget.RecyclerView.LayoutParams);
-    method public final int getSpanIndex();
-    method public boolean isFullSpan();
-    method public void setFullSpan(boolean);
-    field public static final int INVALID_SPAN_ID = -1; // 0xffffffff
-  }
-
-}
-
diff --git a/v7/recyclerview/api/22.1.0.txt b/v7/recyclerview/api/22.1.0.txt
deleted file mode 100644
index 9bdef34..0000000
--- a/v7/recyclerview/api/22.1.0.txt
+++ /dev/null
@@ -1,639 +0,0 @@
-package android.support.v7.util {
-
-  public class SortedList {
-    ctor public SortedList(java.lang.Class<T>, android.support.v7.util.SortedList.Callback<T>);
-    ctor public SortedList(java.lang.Class<T>, android.support.v7.util.SortedList.Callback<T>, int);
-    method public int add(T);
-    method public void beginBatchedUpdates();
-    method public void endBatchedUpdates();
-    method public T get(int) throws java.lang.IndexOutOfBoundsException;
-    method public int indexOf(T);
-    method public void recalculatePositionOfItemAt(int);
-    method public boolean remove(T);
-    method public T removeItemAt(int);
-    method public int size();
-    method public void updateItemAt(int, T);
-    field public static final int INVALID_POSITION = -1; // 0xffffffff
-  }
-
-  public static class SortedList.BatchedCallback extends android.support.v7.util.SortedList.Callback {
-    ctor public SortedList.BatchedCallback(android.support.v7.util.SortedList.Callback<T2>);
-    method public boolean areContentsTheSame(T2, T2);
-    method public boolean areItemsTheSame(T2, T2);
-    method public int compare(T2, T2);
-    method public void dispatchLastEvent();
-    method public void onChanged(int, int);
-    method public void onInserted(int, int);
-    method public void onMoved(int, int);
-    method public void onRemoved(int, int);
-  }
-
-  public static abstract class SortedList.Callback {
-    ctor public SortedList.Callback();
-    method public abstract boolean areContentsTheSame(T2, T2);
-    method public abstract boolean areItemsTheSame(T2, T2);
-    method public abstract int compare(T2, T2);
-    method public abstract void onChanged(int, int);
-    method public abstract void onInserted(int, int);
-    method public abstract void onMoved(int, int);
-    method public abstract void onRemoved(int, int);
-  }
-
-}
-
-package android.support.v7.widget {
-
-  public class DefaultItemAnimator extends android.support.v7.widget.RecyclerView.ItemAnimator {
-    ctor public DefaultItemAnimator();
-    method public boolean animateAdd(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public boolean animateChange(android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ViewHolder, int, int, int, int);
-    method public boolean animateMove(android.support.v7.widget.RecyclerView.ViewHolder, int, int, int, int);
-    method public boolean animateRemove(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void endAnimation(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void endAnimations();
-    method public boolean isRunning();
-    method public void runPendingAnimations();
-  }
-
-  public class GridLayoutManager extends android.support.v7.widget.LinearLayoutManager {
-    ctor public GridLayoutManager(android.content.Context, int);
-    ctor public GridLayoutManager(android.content.Context, int, int, boolean);
-    method public int getSpanCount();
-    method public android.support.v7.widget.GridLayoutManager.SpanSizeLookup getSpanSizeLookup();
-    method public void setSpanCount(int);
-    method public void setSpanSizeLookup(android.support.v7.widget.GridLayoutManager.SpanSizeLookup);
-    field public static final int DEFAULT_SPAN_COUNT = -1; // 0xffffffff
-  }
-
-  public static final class GridLayoutManager.DefaultSpanSizeLookup extends android.support.v7.widget.GridLayoutManager.SpanSizeLookup {
-    ctor public GridLayoutManager.DefaultSpanSizeLookup();
-    method public int getSpanSize(int);
-  }
-
-  public static class GridLayoutManager.LayoutParams extends android.support.v7.widget.RecyclerView.LayoutParams {
-    ctor public GridLayoutManager.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public GridLayoutManager.LayoutParams(int, int);
-    ctor public GridLayoutManager.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public GridLayoutManager.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public GridLayoutManager.LayoutParams(android.support.v7.widget.RecyclerView.LayoutParams);
-    method public int getSpanIndex();
-    method public int getSpanSize();
-    field public static final int INVALID_SPAN_ID = -1; // 0xffffffff
-  }
-
-  public static abstract class GridLayoutManager.SpanSizeLookup {
-    ctor public GridLayoutManager.SpanSizeLookup();
-    method public int getSpanGroupIndex(int, int);
-    method public int getSpanIndex(int, int);
-    method public abstract int getSpanSize(int);
-    method public void invalidateSpanIndexCache();
-    method public boolean isSpanIndexCacheEnabled();
-    method public void setSpanIndexCacheEnabled(boolean);
-  }
-
-  public class LinearLayoutManager extends android.support.v7.widget.RecyclerView.LayoutManager {
-    ctor public LinearLayoutManager(android.content.Context);
-    ctor public LinearLayoutManager(android.content.Context, int, boolean);
-    method public android.graphics.PointF computeScrollVectorForPosition(int);
-    method public int findFirstCompletelyVisibleItemPosition();
-    method public int findFirstVisibleItemPosition();
-    method public int findLastCompletelyVisibleItemPosition();
-    method public int findLastVisibleItemPosition();
-    method public android.support.v7.widget.RecyclerView.LayoutParams generateDefaultLayoutParams();
-    method protected int getExtraLayoutSpace(android.support.v7.widget.RecyclerView.State);
-    method public int getOrientation();
-    method public boolean getRecycleChildrenOnDetach();
-    method public boolean getReverseLayout();
-    method public boolean getStackFromEnd();
-    method protected boolean isLayoutRTL();
-    method public boolean isSmoothScrollbarEnabled();
-    method public void scrollToPositionWithOffset(int, int);
-    method public void setOrientation(int);
-    method public void setRecycleChildrenOnDetach(boolean);
-    method public void setReverseLayout(boolean);
-    method public void setSmoothScrollbarEnabled(boolean);
-    method public void setStackFromEnd(boolean);
-    field public static final int HORIZONTAL = 0; // 0x0
-    field public static final int INVALID_OFFSET = -2147483648; // 0x80000000
-    field public static final int VERTICAL = 1; // 0x1
-  }
-
-  protected static class LinearLayoutManager.LayoutChunkResult {
-    ctor protected LinearLayoutManager.LayoutChunkResult();
-    field public int mConsumed;
-    field public boolean mFinished;
-    field public boolean mFocusable;
-    field public boolean mIgnoreConsumed;
-  }
-
-  public abstract class LinearSmoothScroller extends android.support.v7.widget.RecyclerView.SmoothScroller {
-    ctor public LinearSmoothScroller(android.content.Context);
-    method public int calculateDtToFit(int, int, int, int, int);
-    method public int calculateDxToMakeVisible(android.view.View, int);
-    method public int calculateDyToMakeVisible(android.view.View, int);
-    method protected float calculateSpeedPerPixel(android.util.DisplayMetrics);
-    method protected int calculateTimeForDeceleration(int);
-    method protected int calculateTimeForScrolling(int);
-    method public abstract android.graphics.PointF computeScrollVectorForPosition(int);
-    method protected int getHorizontalSnapPreference();
-    method protected int getVerticalSnapPreference();
-    method protected void onSeekTargetStep(int, int, android.support.v7.widget.RecyclerView.State, android.support.v7.widget.RecyclerView.SmoothScroller.Action);
-    method protected void onStart();
-    method protected void onStop();
-    method protected void onTargetFound(android.view.View, android.support.v7.widget.RecyclerView.State, android.support.v7.widget.RecyclerView.SmoothScroller.Action);
-    method protected void updateActionForInterimTarget(android.support.v7.widget.RecyclerView.SmoothScroller.Action);
-    field public static final int SNAP_TO_ANY = 0; // 0x0
-    field public static final int SNAP_TO_END = 1; // 0x1
-    field public static final int SNAP_TO_START = -1; // 0xffffffff
-    field protected final android.view.animation.DecelerateInterpolator mDecelerateInterpolator;
-    field protected int mInterimTargetDx;
-    field protected int mInterimTargetDy;
-    field protected final android.view.animation.LinearInterpolator mLinearInterpolator;
-    field protected android.graphics.PointF mTargetVector;
-  }
-
-  public abstract class OrientationHelper {
-    method public static android.support.v7.widget.OrientationHelper createHorizontalHelper(android.support.v7.widget.RecyclerView.LayoutManager);
-    method public static android.support.v7.widget.OrientationHelper createOrientationHelper(android.support.v7.widget.RecyclerView.LayoutManager, int);
-    method public static android.support.v7.widget.OrientationHelper createVerticalHelper(android.support.v7.widget.RecyclerView.LayoutManager);
-    method public abstract int getDecoratedEnd(android.view.View);
-    method public abstract int getDecoratedMeasurement(android.view.View);
-    method public abstract int getDecoratedMeasurementInOther(android.view.View);
-    method public abstract int getDecoratedStart(android.view.View);
-    method public abstract int getEnd();
-    method public abstract int getEndAfterPadding();
-    method public abstract int getEndPadding();
-    method public abstract int getStartAfterPadding();
-    method public abstract int getTotalSpace();
-    method public int getTotalSpaceChange();
-    method public abstract void offsetChild(android.view.View, int);
-    method public abstract void offsetChildren(int);
-    method public void onLayoutComplete();
-    field public static final int HORIZONTAL = 0; // 0x0
-    field public static final int VERTICAL = 1; // 0x1
-    field protected final android.support.v7.widget.RecyclerView.LayoutManager mLayoutManager;
-  }
-
-  public class RecyclerView extends android.view.ViewGroup {
-    ctor public RecyclerView(android.content.Context);
-    ctor public RecyclerView(android.content.Context, android.util.AttributeSet);
-    ctor public RecyclerView(android.content.Context, android.util.AttributeSet, int);
-    method public void addItemDecoration(android.support.v7.widget.RecyclerView.ItemDecoration, int);
-    method public void addItemDecoration(android.support.v7.widget.RecyclerView.ItemDecoration);
-    method public void addOnItemTouchListener(android.support.v7.widget.RecyclerView.OnItemTouchListener);
-    method public void addOnScrollListener(android.support.v7.widget.RecyclerView.OnScrollListener);
-    method public void clearOnScrollListeners();
-    method public int computeHorizontalScrollExtent();
-    method public int computeHorizontalScrollOffset();
-    method public int computeHorizontalScrollRange();
-    method public int computeVerticalScrollExtent();
-    method public int computeVerticalScrollOffset();
-    method public int computeVerticalScrollRange();
-    method public android.view.View findChildViewUnder(float, float);
-    method public android.support.v7.widget.RecyclerView.ViewHolder findViewHolderForAdapterPosition(int);
-    method public android.support.v7.widget.RecyclerView.ViewHolder findViewHolderForItemId(long);
-    method public android.support.v7.widget.RecyclerView.ViewHolder findViewHolderForLayoutPosition(int);
-    method public deprecated android.support.v7.widget.RecyclerView.ViewHolder findViewHolderForPosition(int);
-    method public boolean fling(int, int);
-    method public android.support.v7.widget.RecyclerView.Adapter getAdapter();
-    method public int getChildAdapterPosition(android.view.View);
-    method public long getChildItemId(android.view.View);
-    method public int getChildLayoutPosition(android.view.View);
-    method public deprecated int getChildPosition(android.view.View);
-    method public android.support.v7.widget.RecyclerView.ViewHolder getChildViewHolder(android.view.View);
-    method public android.support.v7.widget.RecyclerViewAccessibilityDelegate getCompatAccessibilityDelegate();
-    method public android.support.v7.widget.RecyclerView.ItemAnimator getItemAnimator();
-    method public android.support.v7.widget.RecyclerView.LayoutManager getLayoutManager();
-    method public android.support.v7.widget.RecyclerView.RecycledViewPool getRecycledViewPool();
-    method public int getScrollState();
-    method public boolean hasFixedSize();
-    method public boolean hasPendingAdapterUpdates();
-    method public void invalidateItemDecorations();
-    method public void offsetChildrenHorizontal(int);
-    method public void offsetChildrenVertical(int);
-    method public void onChildAttachedToWindow(android.view.View);
-    method public void onChildDetachedFromWindow(android.view.View);
-    method public void onDraw(android.graphics.Canvas);
-    method protected void onLayout(boolean, int, int, int, int);
-    method public void onScrollStateChanged(int);
-    method public void onScrolled(int, int);
-    method public void removeItemDecoration(android.support.v7.widget.RecyclerView.ItemDecoration);
-    method public void removeOnItemTouchListener(android.support.v7.widget.RecyclerView.OnItemTouchListener);
-    method public void removeOnScrollListener(android.support.v7.widget.RecyclerView.OnScrollListener);
-    method public void scrollToPosition(int);
-    method public void setAccessibilityDelegateCompat(android.support.v7.widget.RecyclerViewAccessibilityDelegate);
-    method public void setAdapter(android.support.v7.widget.RecyclerView.Adapter);
-    method public void setHasFixedSize(boolean);
-    method public void setItemAnimator(android.support.v7.widget.RecyclerView.ItemAnimator);
-    method public void setItemViewCacheSize(int);
-    method public void setLayoutManager(android.support.v7.widget.RecyclerView.LayoutManager);
-    method public deprecated void setOnScrollListener(android.support.v7.widget.RecyclerView.OnScrollListener);
-    method public void setRecycledViewPool(android.support.v7.widget.RecyclerView.RecycledViewPool);
-    method public void setRecyclerListener(android.support.v7.widget.RecyclerView.RecyclerListener);
-    method public void setScrollingTouchSlop(int);
-    method public void setViewCacheExtension(android.support.v7.widget.RecyclerView.ViewCacheExtension);
-    method public void smoothScrollBy(int, int);
-    method public void smoothScrollToPosition(int);
-    method public void stopScroll();
-    method public void swapAdapter(android.support.v7.widget.RecyclerView.Adapter, boolean);
-    field public static final int HORIZONTAL = 0; // 0x0
-    field public static final int INVALID_TYPE = -1; // 0xffffffff
-    field public static final long NO_ID = -1L; // 0xffffffffffffffffL
-    field public static final int NO_POSITION = -1; // 0xffffffff
-    field public static final int SCROLL_STATE_DRAGGING = 1; // 0x1
-    field public static final int SCROLL_STATE_IDLE = 0; // 0x0
-    field public static final int SCROLL_STATE_SETTLING = 2; // 0x2
-    field public static final int TOUCH_SLOP_DEFAULT = 0; // 0x0
-    field public static final int TOUCH_SLOP_PAGING = 1; // 0x1
-    field public static final int VERTICAL = 1; // 0x1
-  }
-
-  public static abstract class RecyclerView.Adapter {
-    ctor public RecyclerView.Adapter();
-    method public final void bindViewHolder(VH, int);
-    method public final VH createViewHolder(android.view.ViewGroup, int);
-    method public abstract int getItemCount();
-    method public long getItemId(int);
-    method public int getItemViewType(int);
-    method public final boolean hasObservers();
-    method public final boolean hasStableIds();
-    method public final void notifyDataSetChanged();
-    method public final void notifyItemChanged(int);
-    method public final void notifyItemInserted(int);
-    method public final void notifyItemMoved(int, int);
-    method public final void notifyItemRangeChanged(int, int);
-    method public final void notifyItemRangeInserted(int, int);
-    method public final void notifyItemRangeRemoved(int, int);
-    method public final void notifyItemRemoved(int);
-    method public void onAttachedToRecyclerView(android.support.v7.widget.RecyclerView);
-    method public abstract void onBindViewHolder(VH, int);
-    method public abstract VH onCreateViewHolder(android.view.ViewGroup, int);
-    method public void onDetachedFromRecyclerView(android.support.v7.widget.RecyclerView);
-    method public boolean onFailedToRecycleView(VH);
-    method public void onViewAttachedToWindow(VH);
-    method public void onViewDetachedFromWindow(VH);
-    method public void onViewRecycled(VH);
-    method public void registerAdapterDataObserver(android.support.v7.widget.RecyclerView.AdapterDataObserver);
-    method public void setHasStableIds(boolean);
-    method public void unregisterAdapterDataObserver(android.support.v7.widget.RecyclerView.AdapterDataObserver);
-  }
-
-  public static abstract class RecyclerView.AdapterDataObserver {
-    ctor public RecyclerView.AdapterDataObserver();
-    method public void onChanged();
-    method public void onItemRangeChanged(int, int);
-    method public void onItemRangeInserted(int, int);
-    method public void onItemRangeMoved(int, int, int);
-    method public void onItemRangeRemoved(int, int);
-  }
-
-  public static abstract class RecyclerView.ItemAnimator {
-    ctor public RecyclerView.ItemAnimator();
-    method public abstract boolean animateAdd(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public abstract boolean animateChange(android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ViewHolder, int, int, int, int);
-    method public abstract boolean animateMove(android.support.v7.widget.RecyclerView.ViewHolder, int, int, int, int);
-    method public abstract boolean animateRemove(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public final void dispatchAddFinished(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public final void dispatchAddStarting(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public final void dispatchAnimationsFinished();
-    method public final void dispatchChangeFinished(android.support.v7.widget.RecyclerView.ViewHolder, boolean);
-    method public final void dispatchChangeStarting(android.support.v7.widget.RecyclerView.ViewHolder, boolean);
-    method public final void dispatchMoveFinished(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public final void dispatchMoveStarting(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public final void dispatchRemoveFinished(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public final void dispatchRemoveStarting(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public abstract void endAnimation(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public abstract void endAnimations();
-    method public long getAddDuration();
-    method public long getChangeDuration();
-    method public long getMoveDuration();
-    method public long getRemoveDuration();
-    method public boolean getSupportsChangeAnimations();
-    method public abstract boolean isRunning();
-    method public final boolean isRunning(android.support.v7.widget.RecyclerView.ItemAnimator.ItemAnimatorFinishedListener);
-    method public void onAddFinished(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void onAddStarting(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void onChangeFinished(android.support.v7.widget.RecyclerView.ViewHolder, boolean);
-    method public void onChangeStarting(android.support.v7.widget.RecyclerView.ViewHolder, boolean);
-    method public void onMoveFinished(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void onMoveStarting(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void onRemoveFinished(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void onRemoveStarting(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public abstract void runPendingAnimations();
-    method public void setAddDuration(long);
-    method public void setChangeDuration(long);
-    method public void setMoveDuration(long);
-    method public void setRemoveDuration(long);
-    method public void setSupportsChangeAnimations(boolean);
-  }
-
-  public static abstract interface RecyclerView.ItemAnimator.ItemAnimatorFinishedListener {
-    method public abstract void onAnimationsFinished();
-  }
-
-  public static abstract class RecyclerView.ItemDecoration {
-    ctor public RecyclerView.ItemDecoration();
-    method public deprecated void getItemOffsets(android.graphics.Rect, int, android.support.v7.widget.RecyclerView);
-    method public void getItemOffsets(android.graphics.Rect, android.view.View, android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.State);
-    method public void onDraw(android.graphics.Canvas, android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.State);
-    method public deprecated void onDraw(android.graphics.Canvas, android.support.v7.widget.RecyclerView);
-    method public void onDrawOver(android.graphics.Canvas, android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.State);
-    method public deprecated void onDrawOver(android.graphics.Canvas, android.support.v7.widget.RecyclerView);
-  }
-
-  public static abstract class RecyclerView.LayoutManager {
-    ctor public RecyclerView.LayoutManager();
-    method public void addDisappearingView(android.view.View);
-    method public void addDisappearingView(android.view.View, int);
-    method public void addView(android.view.View);
-    method public void addView(android.view.View, int);
-    method public void assertInLayoutOrScroll(java.lang.String);
-    method public void assertNotInLayoutOrScroll(java.lang.String);
-    method public void attachView(android.view.View, int, android.support.v7.widget.RecyclerView.LayoutParams);
-    method public void attachView(android.view.View, int);
-    method public void attachView(android.view.View);
-    method public void calculateItemDecorationsForChild(android.view.View, android.graphics.Rect);
-    method public boolean canScrollHorizontally();
-    method public boolean canScrollVertically();
-    method public boolean checkLayoutParams(android.support.v7.widget.RecyclerView.LayoutParams);
-    method public int computeHorizontalScrollExtent(android.support.v7.widget.RecyclerView.State);
-    method public int computeHorizontalScrollOffset(android.support.v7.widget.RecyclerView.State);
-    method public int computeHorizontalScrollRange(android.support.v7.widget.RecyclerView.State);
-    method public int computeVerticalScrollExtent(android.support.v7.widget.RecyclerView.State);
-    method public int computeVerticalScrollOffset(android.support.v7.widget.RecyclerView.State);
-    method public int computeVerticalScrollRange(android.support.v7.widget.RecyclerView.State);
-    method public void detachAndScrapAttachedViews(android.support.v7.widget.RecyclerView.Recycler);
-    method public void detachAndScrapView(android.view.View, android.support.v7.widget.RecyclerView.Recycler);
-    method public void detachAndScrapViewAt(int, android.support.v7.widget.RecyclerView.Recycler);
-    method public void detachView(android.view.View);
-    method public void detachViewAt(int);
-    method public void endAnimation(android.view.View);
-    method public android.view.View findViewByPosition(int);
-    method public abstract android.support.v7.widget.RecyclerView.LayoutParams generateDefaultLayoutParams();
-    method public android.support.v7.widget.RecyclerView.LayoutParams generateLayoutParams(android.view.ViewGroup.LayoutParams);
-    method public android.support.v7.widget.RecyclerView.LayoutParams generateLayoutParams(android.content.Context, android.util.AttributeSet);
-    method public int getBaseline();
-    method public int getBottomDecorationHeight(android.view.View);
-    method public android.view.View getChildAt(int);
-    method public int getChildCount();
-    method public static int getChildMeasureSpec(int, int, int, boolean);
-    method public boolean getClipToPadding();
-    method public int getColumnCountForAccessibility(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
-    method public int getDecoratedBottom(android.view.View);
-    method public int getDecoratedLeft(android.view.View);
-    method public int getDecoratedMeasuredHeight(android.view.View);
-    method public int getDecoratedMeasuredWidth(android.view.View);
-    method public int getDecoratedRight(android.view.View);
-    method public int getDecoratedTop(android.view.View);
-    method public android.view.View getFocusedChild();
-    method public int getHeight();
-    method public int getItemCount();
-    method public int getItemViewType(android.view.View);
-    method public int getLayoutDirection();
-    method public int getLeftDecorationWidth(android.view.View);
-    method public int getMinimumHeight();
-    method public int getMinimumWidth();
-    method public int getPaddingBottom();
-    method public int getPaddingEnd();
-    method public int getPaddingLeft();
-    method public int getPaddingRight();
-    method public int getPaddingStart();
-    method public int getPaddingTop();
-    method public int getPosition(android.view.View);
-    method public int getRightDecorationWidth(android.view.View);
-    method public int getRowCountForAccessibility(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
-    method public int getSelectionModeForAccessibility(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
-    method public int getTopDecorationHeight(android.view.View);
-    method public int getWidth();
-    method public boolean hasFocus();
-    method public void ignoreView(android.view.View);
-    method public boolean isAttachedToWindow();
-    method public boolean isFocused();
-    method public boolean isLayoutHierarchical(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
-    method public boolean isSmoothScrolling();
-    method public void layoutDecorated(android.view.View, int, int, int, int);
-    method public void measureChild(android.view.View, int, int);
-    method public void measureChildWithMargins(android.view.View, int, int);
-    method public void moveView(int, int);
-    method public void offsetChildrenHorizontal(int);
-    method public void offsetChildrenVertical(int);
-    method public void onAdapterChanged(android.support.v7.widget.RecyclerView.Adapter, android.support.v7.widget.RecyclerView.Adapter);
-    method public boolean onAddFocusables(android.support.v7.widget.RecyclerView, java.util.ArrayList<android.view.View>, int, int);
-    method public void onAttachedToWindow(android.support.v7.widget.RecyclerView);
-    method public deprecated void onDetachedFromWindow(android.support.v7.widget.RecyclerView);
-    method public void onDetachedFromWindow(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.Recycler);
-    method public android.view.View onFocusSearchFailed(android.view.View, int, android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
-    method public void onInitializeAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
-    method public void onInitializeAccessibilityEvent(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State, android.view.accessibility.AccessibilityEvent);
-    method public void onInitializeAccessibilityNodeInfo(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State, android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
-    method public void onInitializeAccessibilityNodeInfoForItem(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State, android.view.View, android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
-    method public android.view.View onInterceptFocusSearch(android.view.View, int);
-    method public void onItemsAdded(android.support.v7.widget.RecyclerView, int, int);
-    method public void onItemsChanged(android.support.v7.widget.RecyclerView);
-    method public void onItemsMoved(android.support.v7.widget.RecyclerView, int, int, int);
-    method public void onItemsRemoved(android.support.v7.widget.RecyclerView, int, int);
-    method public void onItemsUpdated(android.support.v7.widget.RecyclerView, int, int);
-    method public void onLayoutChildren(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
-    method public void onMeasure(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State, int, int);
-    method public deprecated boolean onRequestChildFocus(android.support.v7.widget.RecyclerView, android.view.View, android.view.View);
-    method public boolean onRequestChildFocus(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.State, android.view.View, android.view.View);
-    method public void onRestoreInstanceState(android.os.Parcelable);
-    method public android.os.Parcelable onSaveInstanceState();
-    method public void onScrollStateChanged(int);
-    method public boolean performAccessibilityAction(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State, int, android.os.Bundle);
-    method public boolean performAccessibilityActionForItem(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State, android.view.View, int, android.os.Bundle);
-    method public void postOnAnimation(java.lang.Runnable);
-    method public void removeAllViews();
-    method public void removeAndRecycleAllViews(android.support.v7.widget.RecyclerView.Recycler);
-    method public void removeAndRecycleView(android.view.View, android.support.v7.widget.RecyclerView.Recycler);
-    method public void removeAndRecycleViewAt(int, android.support.v7.widget.RecyclerView.Recycler);
-    method public boolean removeCallbacks(java.lang.Runnable);
-    method public void removeDetachedView(android.view.View);
-    method public void removeView(android.view.View);
-    method public void removeViewAt(int);
-    method public boolean requestChildRectangleOnScreen(android.support.v7.widget.RecyclerView, android.view.View, android.graphics.Rect, boolean);
-    method public void requestLayout();
-    method public void requestSimpleAnimationsInNextLayout();
-    method public int scrollHorizontallyBy(int, android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
-    method public void scrollToPosition(int);
-    method public int scrollVerticallyBy(int, android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
-    method public void setMeasuredDimension(int, int);
-    method public void smoothScrollToPosition(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.State, int);
-    method public void startSmoothScroll(android.support.v7.widget.RecyclerView.SmoothScroller);
-    method public void stopIgnoringView(android.view.View);
-    method public boolean supportsPredictiveItemAnimations();
-  }
-
-  public static class RecyclerView.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
-    ctor public RecyclerView.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public RecyclerView.LayoutParams(int, int);
-    ctor public RecyclerView.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public RecyclerView.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public RecyclerView.LayoutParams(android.support.v7.widget.RecyclerView.LayoutParams);
-    method public int getViewAdapterPosition();
-    method public int getViewLayoutPosition();
-    method public deprecated int getViewPosition();
-    method public boolean isItemChanged();
-    method public boolean isItemRemoved();
-    method public boolean isViewInvalid();
-    method public boolean viewNeedsUpdate();
-  }
-
-  public static abstract interface RecyclerView.OnItemTouchListener {
-    method public abstract boolean onInterceptTouchEvent(android.support.v7.widget.RecyclerView, android.view.MotionEvent);
-    method public abstract void onTouchEvent(android.support.v7.widget.RecyclerView, android.view.MotionEvent);
-  }
-
-  public static abstract class RecyclerView.OnScrollListener {
-    ctor public RecyclerView.OnScrollListener();
-    method public void onScrollStateChanged(android.support.v7.widget.RecyclerView, int);
-    method public void onScrolled(android.support.v7.widget.RecyclerView, int, int);
-  }
-
-  public static class RecyclerView.RecycledViewPool {
-    ctor public RecyclerView.RecycledViewPool();
-    method public void clear();
-    method public android.support.v7.widget.RecyclerView.ViewHolder getRecycledView(int);
-    method public void putRecycledView(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void setMaxRecycledViews(int, int);
-  }
-
-  public final class RecyclerView.Recycler {
-    ctor public RecyclerView.Recycler();
-    method public void bindViewToPosition(android.view.View, int);
-    method public void clear();
-    method public int convertPreLayoutPositionToPostLayout(int);
-    method public java.util.List<android.support.v7.widget.RecyclerView.ViewHolder> getScrapList();
-    method public android.view.View getViewForPosition(int);
-    method public void recycleView(android.view.View);
-    method public void setViewCacheSize(int);
-  }
-
-  public static abstract interface RecyclerView.RecyclerListener {
-    method public abstract void onViewRecycled(android.support.v7.widget.RecyclerView.ViewHolder);
-  }
-
-  public static abstract class RecyclerView.SmoothScroller {
-    ctor public RecyclerView.SmoothScroller();
-    method public android.view.View findViewByPosition(int);
-    method public int getChildCount();
-    method public int getChildPosition(android.view.View);
-    method public android.support.v7.widget.RecyclerView.LayoutManager getLayoutManager();
-    method public int getTargetPosition();
-    method public void instantScrollToPosition(int);
-    method public boolean isPendingInitialRun();
-    method public boolean isRunning();
-    method protected void normalize(android.graphics.PointF);
-    method protected void onChildAttachedToWindow(android.view.View);
-    method protected abstract void onSeekTargetStep(int, int, android.support.v7.widget.RecyclerView.State, android.support.v7.widget.RecyclerView.SmoothScroller.Action);
-    method protected abstract void onStart();
-    method protected abstract void onStop();
-    method protected abstract void onTargetFound(android.view.View, android.support.v7.widget.RecyclerView.State, android.support.v7.widget.RecyclerView.SmoothScroller.Action);
-    method public void setTargetPosition(int);
-    method protected final void stop();
-  }
-
-  public static class RecyclerView.SmoothScroller.Action {
-    ctor public RecyclerView.SmoothScroller.Action(int, int);
-    ctor public RecyclerView.SmoothScroller.Action(int, int, int);
-    ctor public RecyclerView.SmoothScroller.Action(int, int, int, android.view.animation.Interpolator);
-    method public int getDuration();
-    method public int getDx();
-    method public int getDy();
-    method public android.view.animation.Interpolator getInterpolator();
-    method public void setDuration(int);
-    method public void setDx(int);
-    method public void setDy(int);
-    method public void setInterpolator(android.view.animation.Interpolator);
-    method public void update(int, int, int, android.view.animation.Interpolator);
-    field public static final int UNDEFINED_DURATION = -2147483648; // 0x80000000
-  }
-
-  public static class RecyclerView.State {
-    ctor public RecyclerView.State();
-    method public boolean didStructureChange();
-    method public T get(int);
-    method public int getItemCount();
-    method public int getTargetScrollPosition();
-    method public boolean hasTargetScrollPosition();
-    method public boolean isPreLayout();
-    method public void onViewIgnored(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void put(int, java.lang.Object);
-    method public void remove(int);
-    method public boolean willRunPredictiveAnimations();
-    method public boolean willRunSimpleAnimations();
-  }
-
-  public static abstract class RecyclerView.ViewCacheExtension {
-    ctor public RecyclerView.ViewCacheExtension();
-    method public abstract android.view.View getViewForPositionAndType(android.support.v7.widget.RecyclerView.Recycler, int, int);
-  }
-
-  public static abstract class RecyclerView.ViewHolder {
-    ctor public RecyclerView.ViewHolder(android.view.View);
-    method public final int getAdapterPosition();
-    method public final long getItemId();
-    method public final int getItemViewType();
-    method public final int getLayoutPosition();
-    method public final int getOldPosition();
-    method public final deprecated int getPosition();
-    method public final boolean isRecyclable();
-    method public final void setIsRecyclable(boolean);
-    field public final android.view.View itemView;
-  }
-
-  public class RecyclerViewAccessibilityDelegate extends android.support.v4.view.AccessibilityDelegateCompat {
-    ctor public RecyclerViewAccessibilityDelegate(android.support.v7.widget.RecyclerView);
-  }
-
-  public class StaggeredGridLayoutManager extends android.support.v7.widget.RecyclerView.LayoutManager {
-    ctor public StaggeredGridLayoutManager(int, int);
-    method public int[] findFirstCompletelyVisibleItemPositions(int[]);
-    method public int[] findFirstVisibleItemPositions(int[]);
-    method public int[] findLastCompletelyVisibleItemPositions(int[]);
-    method public int[] findLastVisibleItemPositions(int[]);
-    method public android.support.v7.widget.RecyclerView.LayoutParams generateDefaultLayoutParams();
-    method public int getGapStrategy();
-    method public int getOrientation();
-    method public boolean getReverseLayout();
-    method public int getSpanCount();
-    method public void invalidateSpanAssignments();
-    method public void scrollToPositionWithOffset(int, int);
-    method public void setGapStrategy(int);
-    method public void setOrientation(int);
-    method public void setReverseLayout(boolean);
-    method public void setSpanCount(int);
-    field public static final deprecated int GAP_HANDLING_LAZY = 1; // 0x1
-    field public static final int GAP_HANDLING_MOVE_ITEMS_BETWEEN_SPANS = 2; // 0x2
-    field public static final int GAP_HANDLING_NONE = 0; // 0x0
-    field public static final int HORIZONTAL = 0; // 0x0
-    field public static final java.lang.String TAG = "StaggeredGridLayoutManager";
-    field public static final int VERTICAL = 1; // 0x1
-  }
-
-  public static class StaggeredGridLayoutManager.LayoutParams extends android.support.v7.widget.RecyclerView.LayoutParams {
-    ctor public StaggeredGridLayoutManager.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public StaggeredGridLayoutManager.LayoutParams(int, int);
-    ctor public StaggeredGridLayoutManager.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public StaggeredGridLayoutManager.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public StaggeredGridLayoutManager.LayoutParams(android.support.v7.widget.RecyclerView.LayoutParams);
-    method public final int getSpanIndex();
-    method public boolean isFullSpan();
-    method public void setFullSpan(boolean);
-    field public static final int INVALID_SPAN_ID = -1; // 0xffffffff
-  }
-
-}
-
-package android.support.v7.widget.util {
-
-  public abstract class SortedListAdapterCallback extends android.support.v7.util.SortedList.Callback {
-    ctor public SortedListAdapterCallback(android.support.v7.widget.RecyclerView.Adapter);
-    method public void onChanged(int, int);
-    method public void onInserted(int, int);
-    method public void onMoved(int, int);
-    method public void onRemoved(int, int);
-  }
-
-}
-
diff --git a/v7/recyclerview/api/22.2.0.txt b/v7/recyclerview/api/22.2.0.txt
deleted file mode 100644
index 045c79d..0000000
--- a/v7/recyclerview/api/22.2.0.txt
+++ /dev/null
@@ -1,787 +0,0 @@
-package android.support.v7.recyclerview {
-
-  public final class R {
-    ctor public R();
-  }
-
-  public static final class R.attr {
-    ctor public R.attr();
-    field public static int layoutManager;
-    field public static int reverseLayout;
-    field public static int spanCount;
-    field public static int stackFromEnd;
-  }
-
-  public static final class R.dimen {
-    ctor public R.dimen();
-    field public static int item_touch_helper_max_drag_scroll_per_frame;
-  }
-
-  public static final class R.id {
-    ctor public R.id();
-    field public static int item_touch_helper_previous_elevation;
-  }
-
-  public static final class R.styleable {
-    ctor public R.styleable();
-    field public static final int[] RecyclerView;
-    field public static int RecyclerView_android_orientation;
-    field public static int RecyclerView_layoutManager;
-    field public static int RecyclerView_reverseLayout;
-    field public static int RecyclerView_spanCount;
-    field public static int RecyclerView_stackFromEnd;
-  }
-
-}
-
-package android.support.v7.util {
-
-  public class SortedList {
-    ctor public SortedList(java.lang.Class<T>, android.support.v7.util.SortedList.Callback<T>);
-    ctor public SortedList(java.lang.Class<T>, android.support.v7.util.SortedList.Callback<T>, int);
-    method public int add(T);
-    method public void beginBatchedUpdates();
-    method public void clear();
-    method public void endBatchedUpdates();
-    method public T get(int) throws java.lang.IndexOutOfBoundsException;
-    method public int indexOf(T);
-    method public void recalculatePositionOfItemAt(int);
-    method public boolean remove(T);
-    method public T removeItemAt(int);
-    method public int size();
-    method public void updateItemAt(int, T);
-    field public static final int INVALID_POSITION = -1; // 0xffffffff
-  }
-
-  public static class SortedList.BatchedCallback extends android.support.v7.util.SortedList.Callback {
-    ctor public SortedList.BatchedCallback(android.support.v7.util.SortedList.Callback<T2>);
-    method public boolean areContentsTheSame(T2, T2);
-    method public boolean areItemsTheSame(T2, T2);
-    method public int compare(T2, T2);
-    method public void dispatchLastEvent();
-    method public void onChanged(int, int);
-    method public void onInserted(int, int);
-    method public void onMoved(int, int);
-    method public void onRemoved(int, int);
-  }
-
-  public static abstract class SortedList.Callback {
-    ctor public SortedList.Callback();
-    method public abstract boolean areContentsTheSame(T2, T2);
-    method public abstract boolean areItemsTheSame(T2, T2);
-    method public abstract int compare(T2, T2);
-    method public abstract void onChanged(int, int);
-    method public abstract void onInserted(int, int);
-    method public abstract void onMoved(int, int);
-    method public abstract void onRemoved(int, int);
-  }
-
-}
-
-package android.support.v7.widget {
-
-  public class DefaultItemAnimator extends android.support.v7.widget.RecyclerView.ItemAnimator {
-    ctor public DefaultItemAnimator();
-    method public boolean animateAdd(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public boolean animateChange(android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ViewHolder, int, int, int, int);
-    method public boolean animateMove(android.support.v7.widget.RecyclerView.ViewHolder, int, int, int, int);
-    method public boolean animateRemove(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void endAnimation(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void endAnimations();
-    method public boolean isRunning();
-    method public void runPendingAnimations();
-  }
-
-  public class GridLayoutManager extends android.support.v7.widget.LinearLayoutManager {
-    ctor public GridLayoutManager(android.content.Context, android.util.AttributeSet, int, int);
-    ctor public GridLayoutManager(android.content.Context, int);
-    ctor public GridLayoutManager(android.content.Context, int, int, boolean);
-    method public int getSpanCount();
-    method public android.support.v7.widget.GridLayoutManager.SpanSizeLookup getSpanSizeLookup();
-    method public void setSpanCount(int);
-    method public void setSpanSizeLookup(android.support.v7.widget.GridLayoutManager.SpanSizeLookup);
-    field public static final int DEFAULT_SPAN_COUNT = -1; // 0xffffffff
-  }
-
-  public static final class GridLayoutManager.DefaultSpanSizeLookup extends android.support.v7.widget.GridLayoutManager.SpanSizeLookup {
-    ctor public GridLayoutManager.DefaultSpanSizeLookup();
-    method public int getSpanSize(int);
-  }
-
-  public static class GridLayoutManager.LayoutParams extends android.support.v7.widget.RecyclerView.LayoutParams {
-    ctor public GridLayoutManager.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public GridLayoutManager.LayoutParams(int, int);
-    ctor public GridLayoutManager.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public GridLayoutManager.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public GridLayoutManager.LayoutParams(android.support.v7.widget.RecyclerView.LayoutParams);
-    method public int getSpanIndex();
-    method public int getSpanSize();
-    field public static final int INVALID_SPAN_ID = -1; // 0xffffffff
-  }
-
-  public static abstract class GridLayoutManager.SpanSizeLookup {
-    ctor public GridLayoutManager.SpanSizeLookup();
-    method public int getSpanGroupIndex(int, int);
-    method public int getSpanIndex(int, int);
-    method public abstract int getSpanSize(int);
-    method public void invalidateSpanIndexCache();
-    method public boolean isSpanIndexCacheEnabled();
-    method public void setSpanIndexCacheEnabled(boolean);
-  }
-
-  public class LinearLayoutManager extends android.support.v7.widget.RecyclerView.LayoutManager implements android.support.v7.widget.helper.ItemTouchHelper.ViewDropHandler {
-    ctor public LinearLayoutManager(android.content.Context);
-    ctor public LinearLayoutManager(android.content.Context, int, boolean);
-    ctor public LinearLayoutManager(android.content.Context, android.util.AttributeSet, int, int);
-    method public android.graphics.PointF computeScrollVectorForPosition(int);
-    method public int findFirstCompletelyVisibleItemPosition();
-    method public int findFirstVisibleItemPosition();
-    method public int findLastCompletelyVisibleItemPosition();
-    method public int findLastVisibleItemPosition();
-    method public android.support.v7.widget.RecyclerView.LayoutParams generateDefaultLayoutParams();
-    method protected int getExtraLayoutSpace(android.support.v7.widget.RecyclerView.State);
-    method public int getOrientation();
-    method public boolean getRecycleChildrenOnDetach();
-    method public boolean getReverseLayout();
-    method public boolean getStackFromEnd();
-    method protected boolean isLayoutRTL();
-    method public boolean isSmoothScrollbarEnabled();
-    method public void prepareForDrop(android.view.View, android.view.View, int, int);
-    method public void scrollToPositionWithOffset(int, int);
-    method public void setOrientation(int);
-    method public void setRecycleChildrenOnDetach(boolean);
-    method public void setReverseLayout(boolean);
-    method public void setSmoothScrollbarEnabled(boolean);
-    method public void setStackFromEnd(boolean);
-    field public static final int HORIZONTAL = 0; // 0x0
-    field public static final int INVALID_OFFSET = -2147483648; // 0x80000000
-    field public static final int VERTICAL = 1; // 0x1
-  }
-
-  protected static class LinearLayoutManager.LayoutChunkResult {
-    ctor protected LinearLayoutManager.LayoutChunkResult();
-    field public int mConsumed;
-    field public boolean mFinished;
-    field public boolean mFocusable;
-    field public boolean mIgnoreConsumed;
-  }
-
-  public abstract class LinearSmoothScroller extends android.support.v7.widget.RecyclerView.SmoothScroller {
-    ctor public LinearSmoothScroller(android.content.Context);
-    method public int calculateDtToFit(int, int, int, int, int);
-    method public int calculateDxToMakeVisible(android.view.View, int);
-    method public int calculateDyToMakeVisible(android.view.View, int);
-    method protected float calculateSpeedPerPixel(android.util.DisplayMetrics);
-    method protected int calculateTimeForDeceleration(int);
-    method protected int calculateTimeForScrolling(int);
-    method public abstract android.graphics.PointF computeScrollVectorForPosition(int);
-    method protected int getHorizontalSnapPreference();
-    method protected int getVerticalSnapPreference();
-    method protected void onSeekTargetStep(int, int, android.support.v7.widget.RecyclerView.State, android.support.v7.widget.RecyclerView.SmoothScroller.Action);
-    method protected void onStart();
-    method protected void onStop();
-    method protected void onTargetFound(android.view.View, android.support.v7.widget.RecyclerView.State, android.support.v7.widget.RecyclerView.SmoothScroller.Action);
-    method protected void updateActionForInterimTarget(android.support.v7.widget.RecyclerView.SmoothScroller.Action);
-    field public static final int SNAP_TO_ANY = 0; // 0x0
-    field public static final int SNAP_TO_END = 1; // 0x1
-    field public static final int SNAP_TO_START = -1; // 0xffffffff
-    field protected final android.view.animation.DecelerateInterpolator mDecelerateInterpolator;
-    field protected int mInterimTargetDx;
-    field protected int mInterimTargetDy;
-    field protected final android.view.animation.LinearInterpolator mLinearInterpolator;
-    field protected android.graphics.PointF mTargetVector;
-  }
-
-  public abstract class OrientationHelper {
-    method public static android.support.v7.widget.OrientationHelper createHorizontalHelper(android.support.v7.widget.RecyclerView.LayoutManager);
-    method public static android.support.v7.widget.OrientationHelper createOrientationHelper(android.support.v7.widget.RecyclerView.LayoutManager, int);
-    method public static android.support.v7.widget.OrientationHelper createVerticalHelper(android.support.v7.widget.RecyclerView.LayoutManager);
-    method public abstract int getDecoratedEnd(android.view.View);
-    method public abstract int getDecoratedMeasurement(android.view.View);
-    method public abstract int getDecoratedMeasurementInOther(android.view.View);
-    method public abstract int getDecoratedStart(android.view.View);
-    method public abstract int getEnd();
-    method public abstract int getEndAfterPadding();
-    method public abstract int getEndPadding();
-    method public abstract int getStartAfterPadding();
-    method public abstract int getTotalSpace();
-    method public int getTotalSpaceChange();
-    method public abstract void offsetChild(android.view.View, int);
-    method public abstract void offsetChildren(int);
-    method public void onLayoutComplete();
-    field public static final int HORIZONTAL = 0; // 0x0
-    field public static final int VERTICAL = 1; // 0x1
-    field protected final android.support.v7.widget.RecyclerView.LayoutManager mLayoutManager;
-  }
-
-  public class RecyclerView extends android.view.ViewGroup {
-    ctor public RecyclerView(android.content.Context);
-    ctor public RecyclerView(android.content.Context, android.util.AttributeSet);
-    ctor public RecyclerView(android.content.Context, android.util.AttributeSet, int);
-    method public void addItemDecoration(android.support.v7.widget.RecyclerView.ItemDecoration, int);
-    method public void addItemDecoration(android.support.v7.widget.RecyclerView.ItemDecoration);
-    method public void addOnChildAttachStateChangeListener(android.support.v7.widget.RecyclerView.OnChildAttachStateChangeListener);
-    method public void addOnItemTouchListener(android.support.v7.widget.RecyclerView.OnItemTouchListener);
-    method public void addOnScrollListener(android.support.v7.widget.RecyclerView.OnScrollListener);
-    method public void clearOnChildAttachStateChangeListeners();
-    method public void clearOnScrollListeners();
-    method public int computeHorizontalScrollExtent();
-    method public int computeHorizontalScrollOffset();
-    method public int computeHorizontalScrollRange();
-    method public int computeVerticalScrollExtent();
-    method public int computeVerticalScrollOffset();
-    method public int computeVerticalScrollRange();
-    method public boolean drawChild(android.graphics.Canvas, android.view.View, long);
-    method public android.view.View findChildViewUnder(float, float);
-    method public android.support.v7.widget.RecyclerView.ViewHolder findViewHolderForAdapterPosition(int);
-    method public android.support.v7.widget.RecyclerView.ViewHolder findViewHolderForItemId(long);
-    method public android.support.v7.widget.RecyclerView.ViewHolder findViewHolderForLayoutPosition(int);
-    method public deprecated android.support.v7.widget.RecyclerView.ViewHolder findViewHolderForPosition(int);
-    method public boolean fling(int, int);
-    method public android.support.v7.widget.RecyclerView.Adapter getAdapter();
-    method public int getChildAdapterPosition(android.view.View);
-    method public long getChildItemId(android.view.View);
-    method public int getChildLayoutPosition(android.view.View);
-    method public deprecated int getChildPosition(android.view.View);
-    method public android.support.v7.widget.RecyclerView.ViewHolder getChildViewHolder(android.view.View);
-    method public android.support.v7.widget.RecyclerViewAccessibilityDelegate getCompatAccessibilityDelegate();
-    method public android.support.v7.widget.RecyclerView.ItemAnimator getItemAnimator();
-    method public android.support.v7.widget.RecyclerView.LayoutManager getLayoutManager();
-    method public int getMaxFlingVelocity();
-    method public int getMinFlingVelocity();
-    method public android.support.v7.widget.RecyclerView.RecycledViewPool getRecycledViewPool();
-    method public int getScrollState();
-    method public boolean hasFixedSize();
-    method public boolean hasPendingAdapterUpdates();
-    method public void invalidateItemDecorations();
-    method public boolean isAnimating();
-    method public void offsetChildrenHorizontal(int);
-    method public void offsetChildrenVertical(int);
-    method public void onChildAttachedToWindow(android.view.View);
-    method public void onChildDetachedFromWindow(android.view.View);
-    method public void onDraw(android.graphics.Canvas);
-    method protected void onLayout(boolean, int, int, int, int);
-    method public void onScrollStateChanged(int);
-    method public void onScrolled(int, int);
-    method public void removeItemDecoration(android.support.v7.widget.RecyclerView.ItemDecoration);
-    method public void removeOnChildAttachStateChangeListener(android.support.v7.widget.RecyclerView.OnChildAttachStateChangeListener);
-    method public void removeOnItemTouchListener(android.support.v7.widget.RecyclerView.OnItemTouchListener);
-    method public void removeOnScrollListener(android.support.v7.widget.RecyclerView.OnScrollListener);
-    method public void scrollToPosition(int);
-    method public void setAccessibilityDelegateCompat(android.support.v7.widget.RecyclerViewAccessibilityDelegate);
-    method public void setAdapter(android.support.v7.widget.RecyclerView.Adapter);
-    method public void setChildDrawingOrderCallback(android.support.v7.widget.RecyclerView.ChildDrawingOrderCallback);
-    method public void setHasFixedSize(boolean);
-    method public void setItemAnimator(android.support.v7.widget.RecyclerView.ItemAnimator);
-    method public void setItemViewCacheSize(int);
-    method public void setLayoutManager(android.support.v7.widget.RecyclerView.LayoutManager);
-    method public deprecated void setOnScrollListener(android.support.v7.widget.RecyclerView.OnScrollListener);
-    method public void setRecycledViewPool(android.support.v7.widget.RecyclerView.RecycledViewPool);
-    method public void setRecyclerListener(android.support.v7.widget.RecyclerView.RecyclerListener);
-    method public void setScrollingTouchSlop(int);
-    method public void setViewCacheExtension(android.support.v7.widget.RecyclerView.ViewCacheExtension);
-    method public void smoothScrollBy(int, int);
-    method public void smoothScrollToPosition(int);
-    method public void stopScroll();
-    method public void swapAdapter(android.support.v7.widget.RecyclerView.Adapter, boolean);
-    field public static final int HORIZONTAL = 0; // 0x0
-    field public static final int INVALID_TYPE = -1; // 0xffffffff
-    field public static final long NO_ID = -1L; // 0xffffffffffffffffL
-    field public static final int NO_POSITION = -1; // 0xffffffff
-    field public static final int SCROLL_STATE_DRAGGING = 1; // 0x1
-    field public static final int SCROLL_STATE_IDLE = 0; // 0x0
-    field public static final int SCROLL_STATE_SETTLING = 2; // 0x2
-    field public static final int TOUCH_SLOP_DEFAULT = 0; // 0x0
-    field public static final int TOUCH_SLOP_PAGING = 1; // 0x1
-    field public static final int VERTICAL = 1; // 0x1
-  }
-
-  public static abstract class RecyclerView.Adapter {
-    ctor public RecyclerView.Adapter();
-    method public final void bindViewHolder(VH, int);
-    method public final VH createViewHolder(android.view.ViewGroup, int);
-    method public abstract int getItemCount();
-    method public long getItemId(int);
-    method public int getItemViewType(int);
-    method public final boolean hasObservers();
-    method public final boolean hasStableIds();
-    method public final void notifyDataSetChanged();
-    method public final void notifyItemChanged(int);
-    method public final void notifyItemInserted(int);
-    method public final void notifyItemMoved(int, int);
-    method public final void notifyItemRangeChanged(int, int);
-    method public final void notifyItemRangeInserted(int, int);
-    method public final void notifyItemRangeRemoved(int, int);
-    method public final void notifyItemRemoved(int);
-    method public void onAttachedToRecyclerView(android.support.v7.widget.RecyclerView);
-    method public abstract void onBindViewHolder(VH, int);
-    method public abstract VH onCreateViewHolder(android.view.ViewGroup, int);
-    method public void onDetachedFromRecyclerView(android.support.v7.widget.RecyclerView);
-    method public boolean onFailedToRecycleView(VH);
-    method public void onViewAttachedToWindow(VH);
-    method public void onViewDetachedFromWindow(VH);
-    method public void onViewRecycled(VH);
-    method public void registerAdapterDataObserver(android.support.v7.widget.RecyclerView.AdapterDataObserver);
-    method public void setHasStableIds(boolean);
-    method public void unregisterAdapterDataObserver(android.support.v7.widget.RecyclerView.AdapterDataObserver);
-  }
-
-  public static abstract class RecyclerView.AdapterDataObserver {
-    ctor public RecyclerView.AdapterDataObserver();
-    method public void onChanged();
-    method public void onItemRangeChanged(int, int);
-    method public void onItemRangeInserted(int, int);
-    method public void onItemRangeMoved(int, int, int);
-    method public void onItemRangeRemoved(int, int);
-  }
-
-  public static abstract interface RecyclerView.ChildDrawingOrderCallback {
-    method public abstract int onGetChildDrawingOrder(int, int);
-  }
-
-  public static abstract class RecyclerView.ItemAnimator {
-    ctor public RecyclerView.ItemAnimator();
-    method public abstract boolean animateAdd(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public abstract boolean animateChange(android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ViewHolder, int, int, int, int);
-    method public abstract boolean animateMove(android.support.v7.widget.RecyclerView.ViewHolder, int, int, int, int);
-    method public abstract boolean animateRemove(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public final void dispatchAddFinished(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public final void dispatchAddStarting(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public final void dispatchAnimationsFinished();
-    method public final void dispatchChangeFinished(android.support.v7.widget.RecyclerView.ViewHolder, boolean);
-    method public final void dispatchChangeStarting(android.support.v7.widget.RecyclerView.ViewHolder, boolean);
-    method public final void dispatchMoveFinished(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public final void dispatchMoveStarting(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public final void dispatchRemoveFinished(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public final void dispatchRemoveStarting(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public abstract void endAnimation(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public abstract void endAnimations();
-    method public long getAddDuration();
-    method public long getChangeDuration();
-    method public long getMoveDuration();
-    method public long getRemoveDuration();
-    method public boolean getSupportsChangeAnimations();
-    method public abstract boolean isRunning();
-    method public final boolean isRunning(android.support.v7.widget.RecyclerView.ItemAnimator.ItemAnimatorFinishedListener);
-    method public void onAddFinished(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void onAddStarting(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void onChangeFinished(android.support.v7.widget.RecyclerView.ViewHolder, boolean);
-    method public void onChangeStarting(android.support.v7.widget.RecyclerView.ViewHolder, boolean);
-    method public void onMoveFinished(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void onMoveStarting(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void onRemoveFinished(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void onRemoveStarting(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public abstract void runPendingAnimations();
-    method public void setAddDuration(long);
-    method public void setChangeDuration(long);
-    method public void setMoveDuration(long);
-    method public void setRemoveDuration(long);
-    method public void setSupportsChangeAnimations(boolean);
-  }
-
-  public static abstract interface RecyclerView.ItemAnimator.ItemAnimatorFinishedListener {
-    method public abstract void onAnimationsFinished();
-  }
-
-  public static abstract class RecyclerView.ItemDecoration {
-    ctor public RecyclerView.ItemDecoration();
-    method public deprecated void getItemOffsets(android.graphics.Rect, int, android.support.v7.widget.RecyclerView);
-    method public void getItemOffsets(android.graphics.Rect, android.view.View, android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.State);
-    method public void onDraw(android.graphics.Canvas, android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.State);
-    method public deprecated void onDraw(android.graphics.Canvas, android.support.v7.widget.RecyclerView);
-    method public void onDrawOver(android.graphics.Canvas, android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.State);
-    method public deprecated void onDrawOver(android.graphics.Canvas, android.support.v7.widget.RecyclerView);
-  }
-
-  public static abstract class RecyclerView.LayoutManager {
-    ctor public RecyclerView.LayoutManager();
-    method public void addDisappearingView(android.view.View);
-    method public void addDisappearingView(android.view.View, int);
-    method public void addView(android.view.View);
-    method public void addView(android.view.View, int);
-    method public void assertInLayoutOrScroll(java.lang.String);
-    method public void assertNotInLayoutOrScroll(java.lang.String);
-    method public void attachView(android.view.View, int, android.support.v7.widget.RecyclerView.LayoutParams);
-    method public void attachView(android.view.View, int);
-    method public void attachView(android.view.View);
-    method public void calculateItemDecorationsForChild(android.view.View, android.graphics.Rect);
-    method public boolean canScrollHorizontally();
-    method public boolean canScrollVertically();
-    method public boolean checkLayoutParams(android.support.v7.widget.RecyclerView.LayoutParams);
-    method public int computeHorizontalScrollExtent(android.support.v7.widget.RecyclerView.State);
-    method public int computeHorizontalScrollOffset(android.support.v7.widget.RecyclerView.State);
-    method public int computeHorizontalScrollRange(android.support.v7.widget.RecyclerView.State);
-    method public int computeVerticalScrollExtent(android.support.v7.widget.RecyclerView.State);
-    method public int computeVerticalScrollOffset(android.support.v7.widget.RecyclerView.State);
-    method public int computeVerticalScrollRange(android.support.v7.widget.RecyclerView.State);
-    method public void detachAndScrapAttachedViews(android.support.v7.widget.RecyclerView.Recycler);
-    method public void detachAndScrapView(android.view.View, android.support.v7.widget.RecyclerView.Recycler);
-    method public void detachAndScrapViewAt(int, android.support.v7.widget.RecyclerView.Recycler);
-    method public void detachView(android.view.View);
-    method public void detachViewAt(int);
-    method public void endAnimation(android.view.View);
-    method public android.view.View findViewByPosition(int);
-    method public abstract android.support.v7.widget.RecyclerView.LayoutParams generateDefaultLayoutParams();
-    method public android.support.v7.widget.RecyclerView.LayoutParams generateLayoutParams(android.view.ViewGroup.LayoutParams);
-    method public android.support.v7.widget.RecyclerView.LayoutParams generateLayoutParams(android.content.Context, android.util.AttributeSet);
-    method public int getBaseline();
-    method public int getBottomDecorationHeight(android.view.View);
-    method public android.view.View getChildAt(int);
-    method public int getChildCount();
-    method public static int getChildMeasureSpec(int, int, int, boolean);
-    method public boolean getClipToPadding();
-    method public int getColumnCountForAccessibility(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
-    method public int getDecoratedBottom(android.view.View);
-    method public int getDecoratedLeft(android.view.View);
-    method public int getDecoratedMeasuredHeight(android.view.View);
-    method public int getDecoratedMeasuredWidth(android.view.View);
-    method public int getDecoratedRight(android.view.View);
-    method public int getDecoratedTop(android.view.View);
-    method public android.view.View getFocusedChild();
-    method public int getHeight();
-    method public int getItemCount();
-    method public int getItemViewType(android.view.View);
-    method public int getLayoutDirection();
-    method public int getLeftDecorationWidth(android.view.View);
-    method public int getMinimumHeight();
-    method public int getMinimumWidth();
-    method public int getPaddingBottom();
-    method public int getPaddingEnd();
-    method public int getPaddingLeft();
-    method public int getPaddingRight();
-    method public int getPaddingStart();
-    method public int getPaddingTop();
-    method public int getPosition(android.view.View);
-    method public static android.support.v7.widget.RecyclerView.LayoutManager.Properties getProperties(android.content.Context, android.util.AttributeSet, int, int);
-    method public int getRightDecorationWidth(android.view.View);
-    method public int getRowCountForAccessibility(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
-    method public int getSelectionModeForAccessibility(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
-    method public int getTopDecorationHeight(android.view.View);
-    method public int getWidth();
-    method public boolean hasFocus();
-    method public void ignoreView(android.view.View);
-    method public boolean isAttachedToWindow();
-    method public boolean isFocused();
-    method public boolean isLayoutHierarchical(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
-    method public boolean isSmoothScrolling();
-    method public void layoutDecorated(android.view.View, int, int, int, int);
-    method public void measureChild(android.view.View, int, int);
-    method public void measureChildWithMargins(android.view.View, int, int);
-    method public void moveView(int, int);
-    method public void offsetChildrenHorizontal(int);
-    method public void offsetChildrenVertical(int);
-    method public void onAdapterChanged(android.support.v7.widget.RecyclerView.Adapter, android.support.v7.widget.RecyclerView.Adapter);
-    method public boolean onAddFocusables(android.support.v7.widget.RecyclerView, java.util.ArrayList<android.view.View>, int, int);
-    method public void onAttachedToWindow(android.support.v7.widget.RecyclerView);
-    method public deprecated void onDetachedFromWindow(android.support.v7.widget.RecyclerView);
-    method public void onDetachedFromWindow(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.Recycler);
-    method public android.view.View onFocusSearchFailed(android.view.View, int, android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
-    method public void onInitializeAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
-    method public void onInitializeAccessibilityEvent(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State, android.view.accessibility.AccessibilityEvent);
-    method public void onInitializeAccessibilityNodeInfo(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State, android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
-    method public void onInitializeAccessibilityNodeInfoForItem(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State, android.view.View, android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
-    method public android.view.View onInterceptFocusSearch(android.view.View, int);
-    method public void onItemsAdded(android.support.v7.widget.RecyclerView, int, int);
-    method public void onItemsChanged(android.support.v7.widget.RecyclerView);
-    method public void onItemsMoved(android.support.v7.widget.RecyclerView, int, int, int);
-    method public void onItemsRemoved(android.support.v7.widget.RecyclerView, int, int);
-    method public void onItemsUpdated(android.support.v7.widget.RecyclerView, int, int);
-    method public void onLayoutChildren(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
-    method public void onMeasure(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State, int, int);
-    method public deprecated boolean onRequestChildFocus(android.support.v7.widget.RecyclerView, android.view.View, android.view.View);
-    method public boolean onRequestChildFocus(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.State, android.view.View, android.view.View);
-    method public void onRestoreInstanceState(android.os.Parcelable);
-    method public android.os.Parcelable onSaveInstanceState();
-    method public void onScrollStateChanged(int);
-    method public boolean performAccessibilityAction(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State, int, android.os.Bundle);
-    method public boolean performAccessibilityActionForItem(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State, android.view.View, int, android.os.Bundle);
-    method public void postOnAnimation(java.lang.Runnable);
-    method public void removeAllViews();
-    method public void removeAndRecycleAllViews(android.support.v7.widget.RecyclerView.Recycler);
-    method public void removeAndRecycleView(android.view.View, android.support.v7.widget.RecyclerView.Recycler);
-    method public void removeAndRecycleViewAt(int, android.support.v7.widget.RecyclerView.Recycler);
-    method public boolean removeCallbacks(java.lang.Runnable);
-    method public void removeDetachedView(android.view.View);
-    method public void removeView(android.view.View);
-    method public void removeViewAt(int);
-    method public boolean requestChildRectangleOnScreen(android.support.v7.widget.RecyclerView, android.view.View, android.graphics.Rect, boolean);
-    method public void requestLayout();
-    method public void requestSimpleAnimationsInNextLayout();
-    method public int scrollHorizontallyBy(int, android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
-    method public void scrollToPosition(int);
-    method public int scrollVerticallyBy(int, android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
-    method public void setMeasuredDimension(int, int);
-    method public void smoothScrollToPosition(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.State, int);
-    method public void startSmoothScroll(android.support.v7.widget.RecyclerView.SmoothScroller);
-    method public void stopIgnoringView(android.view.View);
-    method public boolean supportsPredictiveItemAnimations();
-  }
-
-  public static class RecyclerView.LayoutManager.Properties {
-    ctor public RecyclerView.LayoutManager.Properties();
-    field public int orientation;
-    field public boolean reverseLayout;
-    field public int spanCount;
-    field public boolean stackFromEnd;
-  }
-
-  public static class RecyclerView.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
-    ctor public RecyclerView.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public RecyclerView.LayoutParams(int, int);
-    ctor public RecyclerView.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public RecyclerView.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public RecyclerView.LayoutParams(android.support.v7.widget.RecyclerView.LayoutParams);
-    method public int getViewAdapterPosition();
-    method public int getViewLayoutPosition();
-    method public deprecated int getViewPosition();
-    method public boolean isItemChanged();
-    method public boolean isItemRemoved();
-    method public boolean isViewInvalid();
-    method public boolean viewNeedsUpdate();
-  }
-
-  public static abstract interface RecyclerView.OnChildAttachStateChangeListener {
-    method public abstract void onChildViewAttachedToWindow(android.view.View);
-    method public abstract void onChildViewDetachedFromWindow(android.view.View);
-  }
-
-  public static abstract interface RecyclerView.OnItemTouchListener {
-    method public abstract boolean onInterceptTouchEvent(android.support.v7.widget.RecyclerView, android.view.MotionEvent);
-    method public abstract void onRequestDisallowInterceptTouchEvent(boolean);
-    method public abstract void onTouchEvent(android.support.v7.widget.RecyclerView, android.view.MotionEvent);
-  }
-
-  public static abstract class RecyclerView.OnScrollListener {
-    ctor public RecyclerView.OnScrollListener();
-    method public void onScrollStateChanged(android.support.v7.widget.RecyclerView, int);
-    method public void onScrolled(android.support.v7.widget.RecyclerView, int, int);
-  }
-
-  public static class RecyclerView.RecycledViewPool {
-    ctor public RecyclerView.RecycledViewPool();
-    method public void clear();
-    method public android.support.v7.widget.RecyclerView.ViewHolder getRecycledView(int);
-    method public void putRecycledView(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void setMaxRecycledViews(int, int);
-  }
-
-  public final class RecyclerView.Recycler {
-    ctor public RecyclerView.Recycler();
-    method public void bindViewToPosition(android.view.View, int);
-    method public void clear();
-    method public int convertPreLayoutPositionToPostLayout(int);
-    method public java.util.List<android.support.v7.widget.RecyclerView.ViewHolder> getScrapList();
-    method public android.view.View getViewForPosition(int);
-    method public void recycleView(android.view.View);
-    method public void setViewCacheSize(int);
-  }
-
-  public static abstract interface RecyclerView.RecyclerListener {
-    method public abstract void onViewRecycled(android.support.v7.widget.RecyclerView.ViewHolder);
-  }
-
-  public class RecyclerView.SimpleOnItemTouchListener implements android.support.v7.widget.RecyclerView.OnItemTouchListener {
-    ctor public RecyclerView.SimpleOnItemTouchListener();
-    method public boolean onInterceptTouchEvent(android.support.v7.widget.RecyclerView, android.view.MotionEvent);
-    method public void onRequestDisallowInterceptTouchEvent(boolean);
-    method public void onTouchEvent(android.support.v7.widget.RecyclerView, android.view.MotionEvent);
-  }
-
-  public static abstract class RecyclerView.SmoothScroller {
-    ctor public RecyclerView.SmoothScroller();
-    method public android.view.View findViewByPosition(int);
-    method public int getChildCount();
-    method public int getChildPosition(android.view.View);
-    method public android.support.v7.widget.RecyclerView.LayoutManager getLayoutManager();
-    method public int getTargetPosition();
-    method public void instantScrollToPosition(int);
-    method public boolean isPendingInitialRun();
-    method public boolean isRunning();
-    method protected void normalize(android.graphics.PointF);
-    method protected void onChildAttachedToWindow(android.view.View);
-    method protected abstract void onSeekTargetStep(int, int, android.support.v7.widget.RecyclerView.State, android.support.v7.widget.RecyclerView.SmoothScroller.Action);
-    method protected abstract void onStart();
-    method protected abstract void onStop();
-    method protected abstract void onTargetFound(android.view.View, android.support.v7.widget.RecyclerView.State, android.support.v7.widget.RecyclerView.SmoothScroller.Action);
-    method public void setTargetPosition(int);
-    method protected final void stop();
-  }
-
-  public static class RecyclerView.SmoothScroller.Action {
-    ctor public RecyclerView.SmoothScroller.Action(int, int);
-    ctor public RecyclerView.SmoothScroller.Action(int, int, int);
-    ctor public RecyclerView.SmoothScroller.Action(int, int, int, android.view.animation.Interpolator);
-    method public int getDuration();
-    method public int getDx();
-    method public int getDy();
-    method public android.view.animation.Interpolator getInterpolator();
-    method public void setDuration(int);
-    method public void setDx(int);
-    method public void setDy(int);
-    method public void setInterpolator(android.view.animation.Interpolator);
-    method public void update(int, int, int, android.view.animation.Interpolator);
-    field public static final int UNDEFINED_DURATION = -2147483648; // 0x80000000
-  }
-
-  public static class RecyclerView.State {
-    ctor public RecyclerView.State();
-    method public boolean didStructureChange();
-    method public T get(int);
-    method public int getItemCount();
-    method public int getTargetScrollPosition();
-    method public boolean hasTargetScrollPosition();
-    method public boolean isPreLayout();
-    method public void onViewIgnored(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void put(int, java.lang.Object);
-    method public void remove(int);
-    method public boolean willRunPredictiveAnimations();
-    method public boolean willRunSimpleAnimations();
-  }
-
-  public static abstract class RecyclerView.ViewCacheExtension {
-    ctor public RecyclerView.ViewCacheExtension();
-    method public abstract android.view.View getViewForPositionAndType(android.support.v7.widget.RecyclerView.Recycler, int, int);
-  }
-
-  public static abstract class RecyclerView.ViewHolder {
-    ctor public RecyclerView.ViewHolder(android.view.View);
-    method public final int getAdapterPosition();
-    method public final long getItemId();
-    method public final int getItemViewType();
-    method public final int getLayoutPosition();
-    method public final int getOldPosition();
-    method public final deprecated int getPosition();
-    method public final boolean isRecyclable();
-    method public final void setIsRecyclable(boolean);
-    field public final android.view.View itemView;
-  }
-
-  public class RecyclerViewAccessibilityDelegate extends android.support.v4.view.AccessibilityDelegateCompat {
-    ctor public RecyclerViewAccessibilityDelegate(android.support.v7.widget.RecyclerView);
-  }
-
-  public class StaggeredGridLayoutManager extends android.support.v7.widget.RecyclerView.LayoutManager {
-    ctor public StaggeredGridLayoutManager(android.content.Context, android.util.AttributeSet, int, int);
-    ctor public StaggeredGridLayoutManager(int, int);
-    method public int[] findFirstCompletelyVisibleItemPositions(int[]);
-    method public int[] findFirstVisibleItemPositions(int[]);
-    method public int[] findLastCompletelyVisibleItemPositions(int[]);
-    method public int[] findLastVisibleItemPositions(int[]);
-    method public android.support.v7.widget.RecyclerView.LayoutParams generateDefaultLayoutParams();
-    method public int getGapStrategy();
-    method public int getOrientation();
-    method public boolean getReverseLayout();
-    method public int getSpanCount();
-    method public void invalidateSpanAssignments();
-    method public void scrollToPositionWithOffset(int, int);
-    method public void setGapStrategy(int);
-    method public void setOrientation(int);
-    method public void setReverseLayout(boolean);
-    method public void setSpanCount(int);
-    field public static final deprecated int GAP_HANDLING_LAZY = 1; // 0x1
-    field public static final int GAP_HANDLING_MOVE_ITEMS_BETWEEN_SPANS = 2; // 0x2
-    field public static final int GAP_HANDLING_NONE = 0; // 0x0
-    field public static final int HORIZONTAL = 0; // 0x0
-    field public static final java.lang.String TAG = "StaggeredGridLayoutManager";
-    field public static final int VERTICAL = 1; // 0x1
-  }
-
-  public static class StaggeredGridLayoutManager.LayoutParams extends android.support.v7.widget.RecyclerView.LayoutParams {
-    ctor public StaggeredGridLayoutManager.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public StaggeredGridLayoutManager.LayoutParams(int, int);
-    ctor public StaggeredGridLayoutManager.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public StaggeredGridLayoutManager.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public StaggeredGridLayoutManager.LayoutParams(android.support.v7.widget.RecyclerView.LayoutParams);
-    method public final int getSpanIndex();
-    method public boolean isFullSpan();
-    method public void setFullSpan(boolean);
-    field public static final int INVALID_SPAN_ID = -1; // 0xffffffff
-  }
-
-}
-
-package android.support.v7.widget.helper {
-
-  public class ItemTouchHelper extends android.support.v7.widget.RecyclerView.ItemDecoration implements android.support.v7.widget.RecyclerView.OnChildAttachStateChangeListener {
-    ctor public ItemTouchHelper(android.support.v7.widget.helper.ItemTouchHelper.Callback);
-    method public void attachToRecyclerView(android.support.v7.widget.RecyclerView);
-    method public void onChildViewAttachedToWindow(android.view.View);
-    method public void onChildViewDetachedFromWindow(android.view.View);
-    method public void startDrag(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void startSwipe(android.support.v7.widget.RecyclerView.ViewHolder);
-    field public static final int ACTION_STATE_DRAG = 2; // 0x2
-    field public static final int ACTION_STATE_IDLE = 0; // 0x0
-    field public static final int ACTION_STATE_SWIPE = 1; // 0x1
-    field public static final int ANIMATION_TYPE_DRAG = 8; // 0x8
-    field public static final int ANIMATION_TYPE_SWIPE_CANCEL = 4; // 0x4
-    field public static final int ANIMATION_TYPE_SWIPE_SUCCESS = 2; // 0x2
-    field public static final int DOWN = 2; // 0x2
-    field public static final int END = 32; // 0x20
-    field public static final int LEFT = 4; // 0x4
-    field public static final int RIGHT = 8; // 0x8
-    field public static final int START = 16; // 0x10
-    field public static final int UP = 1; // 0x1
-  }
-
-  public static abstract class ItemTouchHelper.Callback {
-    ctor public ItemTouchHelper.Callback();
-    method public boolean canDropOver(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ViewHolder);
-    method public android.support.v7.widget.RecyclerView.ViewHolder chooseDropTarget(android.support.v7.widget.RecyclerView.ViewHolder, java.util.List<android.support.v7.widget.RecyclerView.ViewHolder>, int, int);
-    method public void clearView(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder);
-    method public int convertToAbsoluteDirection(int, int);
-    method public static int convertToRelativeDirection(int, int);
-    method public long getAnimationDuration(android.support.v7.widget.RecyclerView, int, float, float);
-    method public int getBoundingBoxMargin();
-    method public static android.support.v7.widget.helper.ItemTouchUIUtil getDefaultUIUtil();
-    method public float getMoveThreshold(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public abstract int getMovementFlags(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder);
-    method public float getSwipeThreshold(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public int interpolateOutOfBoundsScroll(android.support.v7.widget.RecyclerView, int, int, int, long);
-    method public boolean isItemViewSwipeEnabled();
-    method public boolean isLongPressDragEnabled();
-    method public static int makeFlag(int, int);
-    method public static int makeMovementFlags(int, int);
-    method public void onChildDraw(android.graphics.Canvas, android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder, float, float, int, boolean);
-    method public void onChildDrawOver(android.graphics.Canvas, android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder, float, float, int, boolean);
-    method public abstract boolean onMove(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void onMoved(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder, int, android.support.v7.widget.RecyclerView.ViewHolder, int, int, int);
-    method public void onSelectedChanged(android.support.v7.widget.RecyclerView.ViewHolder, int);
-    method public abstract void onSwiped(android.support.v7.widget.RecyclerView.ViewHolder, int);
-    field public static final int DEFAULT_DRAG_ANIMATION_DURATION = 200; // 0xc8
-    field public static final int DEFAULT_SWIPE_ANIMATION_DURATION = 250; // 0xfa
-  }
-
-  public static abstract class ItemTouchHelper.SimpleCallback extends android.support.v7.widget.helper.ItemTouchHelper.Callback {
-    ctor public ItemTouchHelper.SimpleCallback(int, int);
-    method public int getDragDirs(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder);
-    method public int getMovementFlags(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder);
-    method public int getSwipeDirs(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void setDefaultDragDirs(int);
-    method public void setDefaultSwipeDirs(int);
-  }
-
-  public static abstract interface ItemTouchHelper.ViewDropHandler {
-    method public abstract void prepareForDrop(android.view.View, android.view.View, int, int);
-  }
-
-  public abstract interface ItemTouchUIUtil {
-    method public abstract void clearView(android.view.View);
-    method public abstract void onDraw(android.graphics.Canvas, android.support.v7.widget.RecyclerView, android.view.View, float, float, int, boolean);
-    method public abstract void onDrawOver(android.graphics.Canvas, android.support.v7.widget.RecyclerView, android.view.View, float, float, int, boolean);
-    method public abstract void onSelected(android.view.View);
-  }
-
-}
-
-package android.support.v7.widget.util {
-
-  public abstract class SortedListAdapterCallback extends android.support.v7.util.SortedList.Callback {
-    ctor public SortedListAdapterCallback(android.support.v7.widget.RecyclerView.Adapter);
-    method public void onChanged(int, int);
-    method public void onInserted(int, int);
-    method public void onMoved(int, int);
-    method public void onRemoved(int, int);
-  }
-
-}
-
diff --git a/v7/recyclerview/api/22.2.1.txt b/v7/recyclerview/api/22.2.1.txt
deleted file mode 100644
index 48272bd..0000000
--- a/v7/recyclerview/api/22.2.1.txt
+++ /dev/null
@@ -1,792 +0,0 @@
-package android.support.v7.recyclerview {
-
-  public final class R {
-    ctor public R();
-  }
-
-  public static final class R.attr {
-    ctor public R.attr();
-    field public static int layoutManager;
-    field public static int reverseLayout;
-    field public static int spanCount;
-    field public static int stackFromEnd;
-  }
-
-  public static final class R.dimen {
-    ctor public R.dimen();
-    field public static int item_touch_helper_max_drag_scroll_per_frame;
-  }
-
-  public static final class R.id {
-    ctor public R.id();
-    field public static int item_touch_helper_previous_elevation;
-  }
-
-  public static final class R.styleable {
-    ctor public R.styleable();
-    field public static final int[] RecyclerView;
-    field public static int RecyclerView_android_orientation;
-    field public static int RecyclerView_layoutManager;
-    field public static int RecyclerView_reverseLayout;
-    field public static int RecyclerView_spanCount;
-    field public static int RecyclerView_stackFromEnd;
-  }
-
-}
-
-package android.support.v7.util {
-
-  public class SortedList {
-    ctor public SortedList(java.lang.Class<T>, android.support.v7.util.SortedList.Callback<T>);
-    ctor public SortedList(java.lang.Class<T>, android.support.v7.util.SortedList.Callback<T>, int);
-    method public int add(T);
-    method public void addAll(T[], boolean);
-    method public void addAll(T...);
-    method public void addAll(java.util.Collection<T>);
-    method public void beginBatchedUpdates();
-    method public void clear();
-    method public void endBatchedUpdates();
-    method public T get(int) throws java.lang.IndexOutOfBoundsException;
-    method public int indexOf(T);
-    method public void recalculatePositionOfItemAt(int);
-    method public boolean remove(T);
-    method public T removeItemAt(int);
-    method public int size();
-    method public void updateItemAt(int, T);
-    field public static final int INVALID_POSITION = -1; // 0xffffffff
-  }
-
-  public static class SortedList.BatchedCallback extends android.support.v7.util.SortedList.Callback {
-    ctor public SortedList.BatchedCallback(android.support.v7.util.SortedList.Callback<T2>);
-    method public boolean areContentsTheSame(T2, T2);
-    method public boolean areItemsTheSame(T2, T2);
-    method public int compare(T2, T2);
-    method public void dispatchLastEvent();
-    method public void onChanged(int, int);
-    method public void onInserted(int, int);
-    method public void onMoved(int, int);
-    method public void onRemoved(int, int);
-  }
-
-  public static abstract class SortedList.Callback implements java.util.Comparator {
-    ctor public SortedList.Callback();
-    method public abstract boolean areContentsTheSame(T2, T2);
-    method public abstract boolean areItemsTheSame(T2, T2);
-    method public abstract int compare(T2, T2);
-    method public abstract void onChanged(int, int);
-    method public abstract void onInserted(int, int);
-    method public abstract void onMoved(int, int);
-    method public abstract void onRemoved(int, int);
-  }
-
-}
-
-package android.support.v7.widget {
-
-  public class DefaultItemAnimator extends android.support.v7.widget.RecyclerView.ItemAnimator {
-    ctor public DefaultItemAnimator();
-    method public boolean animateAdd(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public boolean animateChange(android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ViewHolder, int, int, int, int);
-    method public boolean animateMove(android.support.v7.widget.RecyclerView.ViewHolder, int, int, int, int);
-    method public boolean animateRemove(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void endAnimation(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void endAnimations();
-    method public boolean isRunning();
-    method public void runPendingAnimations();
-  }
-
-  public class GridLayoutManager extends android.support.v7.widget.LinearLayoutManager {
-    ctor public GridLayoutManager(android.content.Context, android.util.AttributeSet, int, int);
-    ctor public GridLayoutManager(android.content.Context, int);
-    ctor public GridLayoutManager(android.content.Context, int, int, boolean);
-    method public int getSpanCount();
-    method public android.support.v7.widget.GridLayoutManager.SpanSizeLookup getSpanSizeLookup();
-    method public void setSpanCount(int);
-    method public void setSpanSizeLookup(android.support.v7.widget.GridLayoutManager.SpanSizeLookup);
-    field public static final int DEFAULT_SPAN_COUNT = -1; // 0xffffffff
-  }
-
-  public static final class GridLayoutManager.DefaultSpanSizeLookup extends android.support.v7.widget.GridLayoutManager.SpanSizeLookup {
-    ctor public GridLayoutManager.DefaultSpanSizeLookup();
-    method public int getSpanSize(int);
-  }
-
-  public static class GridLayoutManager.LayoutParams extends android.support.v7.widget.RecyclerView.LayoutParams {
-    ctor public GridLayoutManager.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public GridLayoutManager.LayoutParams(int, int);
-    ctor public GridLayoutManager.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public GridLayoutManager.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public GridLayoutManager.LayoutParams(android.support.v7.widget.RecyclerView.LayoutParams);
-    method public int getSpanIndex();
-    method public int getSpanSize();
-    field public static final int INVALID_SPAN_ID = -1; // 0xffffffff
-  }
-
-  public static abstract class GridLayoutManager.SpanSizeLookup {
-    ctor public GridLayoutManager.SpanSizeLookup();
-    method public int getSpanGroupIndex(int, int);
-    method public int getSpanIndex(int, int);
-    method public abstract int getSpanSize(int);
-    method public void invalidateSpanIndexCache();
-    method public boolean isSpanIndexCacheEnabled();
-    method public void setSpanIndexCacheEnabled(boolean);
-  }
-
-  public class LinearLayoutManager extends android.support.v7.widget.RecyclerView.LayoutManager implements android.support.v7.widget.helper.ItemTouchHelper.ViewDropHandler {
-    ctor public LinearLayoutManager(android.content.Context);
-    ctor public LinearLayoutManager(android.content.Context, int, boolean);
-    ctor public LinearLayoutManager(android.content.Context, android.util.AttributeSet, int, int);
-    method public android.graphics.PointF computeScrollVectorForPosition(int);
-    method public int findFirstCompletelyVisibleItemPosition();
-    method public int findFirstVisibleItemPosition();
-    method public int findLastCompletelyVisibleItemPosition();
-    method public int findLastVisibleItemPosition();
-    method public android.support.v7.widget.RecyclerView.LayoutParams generateDefaultLayoutParams();
-    method protected int getExtraLayoutSpace(android.support.v7.widget.RecyclerView.State);
-    method public int getOrientation();
-    method public boolean getRecycleChildrenOnDetach();
-    method public boolean getReverseLayout();
-    method public boolean getStackFromEnd();
-    method protected boolean isLayoutRTL();
-    method public boolean isSmoothScrollbarEnabled();
-    method public void prepareForDrop(android.view.View, android.view.View, int, int);
-    method public void scrollToPositionWithOffset(int, int);
-    method public void setOrientation(int);
-    method public void setRecycleChildrenOnDetach(boolean);
-    method public void setReverseLayout(boolean);
-    method public void setSmoothScrollbarEnabled(boolean);
-    method public void setStackFromEnd(boolean);
-    field public static final int HORIZONTAL = 0; // 0x0
-    field public static final int INVALID_OFFSET = -2147483648; // 0x80000000
-    field public static final int VERTICAL = 1; // 0x1
-  }
-
-  protected static class LinearLayoutManager.LayoutChunkResult {
-    ctor protected LinearLayoutManager.LayoutChunkResult();
-    field public int mConsumed;
-    field public boolean mFinished;
-    field public boolean mFocusable;
-    field public boolean mIgnoreConsumed;
-  }
-
-  public abstract class LinearSmoothScroller extends android.support.v7.widget.RecyclerView.SmoothScroller {
-    ctor public LinearSmoothScroller(android.content.Context);
-    method public int calculateDtToFit(int, int, int, int, int);
-    method public int calculateDxToMakeVisible(android.view.View, int);
-    method public int calculateDyToMakeVisible(android.view.View, int);
-    method protected float calculateSpeedPerPixel(android.util.DisplayMetrics);
-    method protected int calculateTimeForDeceleration(int);
-    method protected int calculateTimeForScrolling(int);
-    method public abstract android.graphics.PointF computeScrollVectorForPosition(int);
-    method protected int getHorizontalSnapPreference();
-    method protected int getVerticalSnapPreference();
-    method protected void onSeekTargetStep(int, int, android.support.v7.widget.RecyclerView.State, android.support.v7.widget.RecyclerView.SmoothScroller.Action);
-    method protected void onStart();
-    method protected void onStop();
-    method protected void onTargetFound(android.view.View, android.support.v7.widget.RecyclerView.State, android.support.v7.widget.RecyclerView.SmoothScroller.Action);
-    method protected void updateActionForInterimTarget(android.support.v7.widget.RecyclerView.SmoothScroller.Action);
-    field public static final int SNAP_TO_ANY = 0; // 0x0
-    field public static final int SNAP_TO_END = 1; // 0x1
-    field public static final int SNAP_TO_START = -1; // 0xffffffff
-    field protected final android.view.animation.DecelerateInterpolator mDecelerateInterpolator;
-    field protected int mInterimTargetDx;
-    field protected int mInterimTargetDy;
-    field protected final android.view.animation.LinearInterpolator mLinearInterpolator;
-    field protected android.graphics.PointF mTargetVector;
-  }
-
-  public abstract class OrientationHelper {
-    method public static android.support.v7.widget.OrientationHelper createHorizontalHelper(android.support.v7.widget.RecyclerView.LayoutManager);
-    method public static android.support.v7.widget.OrientationHelper createOrientationHelper(android.support.v7.widget.RecyclerView.LayoutManager, int);
-    method public static android.support.v7.widget.OrientationHelper createVerticalHelper(android.support.v7.widget.RecyclerView.LayoutManager);
-    method public abstract int getDecoratedEnd(android.view.View);
-    method public abstract int getDecoratedMeasurement(android.view.View);
-    method public abstract int getDecoratedMeasurementInOther(android.view.View);
-    method public abstract int getDecoratedStart(android.view.View);
-    method public abstract int getEnd();
-    method public abstract int getEndAfterPadding();
-    method public abstract int getEndPadding();
-    method public abstract int getStartAfterPadding();
-    method public abstract int getTotalSpace();
-    method public int getTotalSpaceChange();
-    method public abstract void offsetChild(android.view.View, int);
-    method public abstract void offsetChildren(int);
-    method public void onLayoutComplete();
-    field public static final int HORIZONTAL = 0; // 0x0
-    field public static final int VERTICAL = 1; // 0x1
-    field protected final android.support.v7.widget.RecyclerView.LayoutManager mLayoutManager;
-  }
-
-  public class RecyclerView extends android.view.ViewGroup {
-    ctor public RecyclerView(android.content.Context);
-    ctor public RecyclerView(android.content.Context, android.util.AttributeSet);
-    ctor public RecyclerView(android.content.Context, android.util.AttributeSet, int);
-    method public void addItemDecoration(android.support.v7.widget.RecyclerView.ItemDecoration, int);
-    method public void addItemDecoration(android.support.v7.widget.RecyclerView.ItemDecoration);
-    method public void addOnChildAttachStateChangeListener(android.support.v7.widget.RecyclerView.OnChildAttachStateChangeListener);
-    method public void addOnItemTouchListener(android.support.v7.widget.RecyclerView.OnItemTouchListener);
-    method public void addOnScrollListener(android.support.v7.widget.RecyclerView.OnScrollListener);
-    method public void clearOnChildAttachStateChangeListeners();
-    method public void clearOnScrollListeners();
-    method public int computeHorizontalScrollExtent();
-    method public int computeHorizontalScrollOffset();
-    method public int computeHorizontalScrollRange();
-    method public int computeVerticalScrollExtent();
-    method public int computeVerticalScrollOffset();
-    method public int computeVerticalScrollRange();
-    method public boolean drawChild(android.graphics.Canvas, android.view.View, long);
-    method public android.view.View findChildViewUnder(float, float);
-    method public android.support.v7.widget.RecyclerView.ViewHolder findViewHolderForAdapterPosition(int);
-    method public android.support.v7.widget.RecyclerView.ViewHolder findViewHolderForItemId(long);
-    method public android.support.v7.widget.RecyclerView.ViewHolder findViewHolderForLayoutPosition(int);
-    method public deprecated android.support.v7.widget.RecyclerView.ViewHolder findViewHolderForPosition(int);
-    method public boolean fling(int, int);
-    method public android.support.v7.widget.RecyclerView.Adapter getAdapter();
-    method public int getChildAdapterPosition(android.view.View);
-    method public long getChildItemId(android.view.View);
-    method public int getChildLayoutPosition(android.view.View);
-    method public deprecated int getChildPosition(android.view.View);
-    method public android.support.v7.widget.RecyclerView.ViewHolder getChildViewHolder(android.view.View);
-    method public android.support.v7.widget.RecyclerViewAccessibilityDelegate getCompatAccessibilityDelegate();
-    method public android.support.v7.widget.RecyclerView.ItemAnimator getItemAnimator();
-    method public android.support.v7.widget.RecyclerView.LayoutManager getLayoutManager();
-    method public int getMaxFlingVelocity();
-    method public int getMinFlingVelocity();
-    method public android.support.v7.widget.RecyclerView.RecycledViewPool getRecycledViewPool();
-    method public int getScrollState();
-    method public boolean hasFixedSize();
-    method public boolean hasPendingAdapterUpdates();
-    method public void invalidateItemDecorations();
-    method public boolean isAnimating();
-    method public boolean isComputingLayout();
-    method public void offsetChildrenHorizontal(int);
-    method public void offsetChildrenVertical(int);
-    method public void onChildAttachedToWindow(android.view.View);
-    method public void onChildDetachedFromWindow(android.view.View);
-    method public void onDraw(android.graphics.Canvas);
-    method protected void onLayout(boolean, int, int, int, int);
-    method public void onScrollStateChanged(int);
-    method public void onScrolled(int, int);
-    method public void removeItemDecoration(android.support.v7.widget.RecyclerView.ItemDecoration);
-    method public void removeOnChildAttachStateChangeListener(android.support.v7.widget.RecyclerView.OnChildAttachStateChangeListener);
-    method public void removeOnItemTouchListener(android.support.v7.widget.RecyclerView.OnItemTouchListener);
-    method public void removeOnScrollListener(android.support.v7.widget.RecyclerView.OnScrollListener);
-    method public void scrollToPosition(int);
-    method public void setAccessibilityDelegateCompat(android.support.v7.widget.RecyclerViewAccessibilityDelegate);
-    method public void setAdapter(android.support.v7.widget.RecyclerView.Adapter);
-    method public void setChildDrawingOrderCallback(android.support.v7.widget.RecyclerView.ChildDrawingOrderCallback);
-    method public void setHasFixedSize(boolean);
-    method public void setItemAnimator(android.support.v7.widget.RecyclerView.ItemAnimator);
-    method public void setItemViewCacheSize(int);
-    method public void setLayoutManager(android.support.v7.widget.RecyclerView.LayoutManager);
-    method public deprecated void setOnScrollListener(android.support.v7.widget.RecyclerView.OnScrollListener);
-    method public void setRecycledViewPool(android.support.v7.widget.RecyclerView.RecycledViewPool);
-    method public void setRecyclerListener(android.support.v7.widget.RecyclerView.RecyclerListener);
-    method public void setScrollingTouchSlop(int);
-    method public void setViewCacheExtension(android.support.v7.widget.RecyclerView.ViewCacheExtension);
-    method public void smoothScrollBy(int, int);
-    method public void smoothScrollToPosition(int);
-    method public void stopScroll();
-    method public void swapAdapter(android.support.v7.widget.RecyclerView.Adapter, boolean);
-    field public static final int HORIZONTAL = 0; // 0x0
-    field public static final int INVALID_TYPE = -1; // 0xffffffff
-    field public static final long NO_ID = -1L; // 0xffffffffffffffffL
-    field public static final int NO_POSITION = -1; // 0xffffffff
-    field public static final int SCROLL_STATE_DRAGGING = 1; // 0x1
-    field public static final int SCROLL_STATE_IDLE = 0; // 0x0
-    field public static final int SCROLL_STATE_SETTLING = 2; // 0x2
-    field public static final int TOUCH_SLOP_DEFAULT = 0; // 0x0
-    field public static final int TOUCH_SLOP_PAGING = 1; // 0x1
-    field public static final int VERTICAL = 1; // 0x1
-  }
-
-  public static abstract class RecyclerView.Adapter {
-    ctor public RecyclerView.Adapter();
-    method public final void bindViewHolder(VH, int);
-    method public final VH createViewHolder(android.view.ViewGroup, int);
-    method public abstract int getItemCount();
-    method public long getItemId(int);
-    method public int getItemViewType(int);
-    method public final boolean hasObservers();
-    method public final boolean hasStableIds();
-    method public final void notifyDataSetChanged();
-    method public final void notifyItemChanged(int);
-    method public final void notifyItemInserted(int);
-    method public final void notifyItemMoved(int, int);
-    method public final void notifyItemRangeChanged(int, int);
-    method public final void notifyItemRangeInserted(int, int);
-    method public final void notifyItemRangeRemoved(int, int);
-    method public final void notifyItemRemoved(int);
-    method public void onAttachedToRecyclerView(android.support.v7.widget.RecyclerView);
-    method public abstract void onBindViewHolder(VH, int);
-    method public abstract VH onCreateViewHolder(android.view.ViewGroup, int);
-    method public void onDetachedFromRecyclerView(android.support.v7.widget.RecyclerView);
-    method public boolean onFailedToRecycleView(VH);
-    method public void onViewAttachedToWindow(VH);
-    method public void onViewDetachedFromWindow(VH);
-    method public void onViewRecycled(VH);
-    method public void registerAdapterDataObserver(android.support.v7.widget.RecyclerView.AdapterDataObserver);
-    method public void setHasStableIds(boolean);
-    method public void unregisterAdapterDataObserver(android.support.v7.widget.RecyclerView.AdapterDataObserver);
-  }
-
-  public static abstract class RecyclerView.AdapterDataObserver {
-    ctor public RecyclerView.AdapterDataObserver();
-    method public void onChanged();
-    method public void onItemRangeChanged(int, int);
-    method public void onItemRangeInserted(int, int);
-    method public void onItemRangeMoved(int, int, int);
-    method public void onItemRangeRemoved(int, int);
-  }
-
-  public static abstract interface RecyclerView.ChildDrawingOrderCallback {
-    method public abstract int onGetChildDrawingOrder(int, int);
-  }
-
-  public static abstract class RecyclerView.ItemAnimator {
-    ctor public RecyclerView.ItemAnimator();
-    method public abstract boolean animateAdd(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public abstract boolean animateChange(android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ViewHolder, int, int, int, int);
-    method public abstract boolean animateMove(android.support.v7.widget.RecyclerView.ViewHolder, int, int, int, int);
-    method public abstract boolean animateRemove(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public final void dispatchAddFinished(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public final void dispatchAddStarting(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public final void dispatchAnimationsFinished();
-    method public final void dispatchChangeFinished(android.support.v7.widget.RecyclerView.ViewHolder, boolean);
-    method public final void dispatchChangeStarting(android.support.v7.widget.RecyclerView.ViewHolder, boolean);
-    method public final void dispatchMoveFinished(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public final void dispatchMoveStarting(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public final void dispatchRemoveFinished(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public final void dispatchRemoveStarting(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public abstract void endAnimation(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public abstract void endAnimations();
-    method public long getAddDuration();
-    method public long getChangeDuration();
-    method public long getMoveDuration();
-    method public long getRemoveDuration();
-    method public boolean getSupportsChangeAnimations();
-    method public abstract boolean isRunning();
-    method public final boolean isRunning(android.support.v7.widget.RecyclerView.ItemAnimator.ItemAnimatorFinishedListener);
-    method public void onAddFinished(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void onAddStarting(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void onChangeFinished(android.support.v7.widget.RecyclerView.ViewHolder, boolean);
-    method public void onChangeStarting(android.support.v7.widget.RecyclerView.ViewHolder, boolean);
-    method public void onMoveFinished(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void onMoveStarting(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void onRemoveFinished(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void onRemoveStarting(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public abstract void runPendingAnimations();
-    method public void setAddDuration(long);
-    method public void setChangeDuration(long);
-    method public void setMoveDuration(long);
-    method public void setRemoveDuration(long);
-    method public void setSupportsChangeAnimations(boolean);
-  }
-
-  public static abstract interface RecyclerView.ItemAnimator.ItemAnimatorFinishedListener {
-    method public abstract void onAnimationsFinished();
-  }
-
-  public static abstract class RecyclerView.ItemDecoration {
-    ctor public RecyclerView.ItemDecoration();
-    method public deprecated void getItemOffsets(android.graphics.Rect, int, android.support.v7.widget.RecyclerView);
-    method public void getItemOffsets(android.graphics.Rect, android.view.View, android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.State);
-    method public void onDraw(android.graphics.Canvas, android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.State);
-    method public deprecated void onDraw(android.graphics.Canvas, android.support.v7.widget.RecyclerView);
-    method public void onDrawOver(android.graphics.Canvas, android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.State);
-    method public deprecated void onDrawOver(android.graphics.Canvas, android.support.v7.widget.RecyclerView);
-  }
-
-  public static abstract class RecyclerView.LayoutManager {
-    ctor public RecyclerView.LayoutManager();
-    method public void addDisappearingView(android.view.View);
-    method public void addDisappearingView(android.view.View, int);
-    method public void addView(android.view.View);
-    method public void addView(android.view.View, int);
-    method public void assertInLayoutOrScroll(java.lang.String);
-    method public void assertNotInLayoutOrScroll(java.lang.String);
-    method public void attachView(android.view.View, int, android.support.v7.widget.RecyclerView.LayoutParams);
-    method public void attachView(android.view.View, int);
-    method public void attachView(android.view.View);
-    method public void calculateItemDecorationsForChild(android.view.View, android.graphics.Rect);
-    method public boolean canScrollHorizontally();
-    method public boolean canScrollVertically();
-    method public boolean checkLayoutParams(android.support.v7.widget.RecyclerView.LayoutParams);
-    method public int computeHorizontalScrollExtent(android.support.v7.widget.RecyclerView.State);
-    method public int computeHorizontalScrollOffset(android.support.v7.widget.RecyclerView.State);
-    method public int computeHorizontalScrollRange(android.support.v7.widget.RecyclerView.State);
-    method public int computeVerticalScrollExtent(android.support.v7.widget.RecyclerView.State);
-    method public int computeVerticalScrollOffset(android.support.v7.widget.RecyclerView.State);
-    method public int computeVerticalScrollRange(android.support.v7.widget.RecyclerView.State);
-    method public void detachAndScrapAttachedViews(android.support.v7.widget.RecyclerView.Recycler);
-    method public void detachAndScrapView(android.view.View, android.support.v7.widget.RecyclerView.Recycler);
-    method public void detachAndScrapViewAt(int, android.support.v7.widget.RecyclerView.Recycler);
-    method public void detachView(android.view.View);
-    method public void detachViewAt(int);
-    method public void endAnimation(android.view.View);
-    method public android.view.View findViewByPosition(int);
-    method public abstract android.support.v7.widget.RecyclerView.LayoutParams generateDefaultLayoutParams();
-    method public android.support.v7.widget.RecyclerView.LayoutParams generateLayoutParams(android.view.ViewGroup.LayoutParams);
-    method public android.support.v7.widget.RecyclerView.LayoutParams generateLayoutParams(android.content.Context, android.util.AttributeSet);
-    method public int getBaseline();
-    method public int getBottomDecorationHeight(android.view.View);
-    method public android.view.View getChildAt(int);
-    method public int getChildCount();
-    method public static int getChildMeasureSpec(int, int, int, boolean);
-    method public boolean getClipToPadding();
-    method public int getColumnCountForAccessibility(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
-    method public int getDecoratedBottom(android.view.View);
-    method public int getDecoratedLeft(android.view.View);
-    method public int getDecoratedMeasuredHeight(android.view.View);
-    method public int getDecoratedMeasuredWidth(android.view.View);
-    method public int getDecoratedRight(android.view.View);
-    method public int getDecoratedTop(android.view.View);
-    method public android.view.View getFocusedChild();
-    method public int getHeight();
-    method public int getItemCount();
-    method public int getItemViewType(android.view.View);
-    method public int getLayoutDirection();
-    method public int getLeftDecorationWidth(android.view.View);
-    method public int getMinimumHeight();
-    method public int getMinimumWidth();
-    method public int getPaddingBottom();
-    method public int getPaddingEnd();
-    method public int getPaddingLeft();
-    method public int getPaddingRight();
-    method public int getPaddingStart();
-    method public int getPaddingTop();
-    method public int getPosition(android.view.View);
-    method public static android.support.v7.widget.RecyclerView.LayoutManager.Properties getProperties(android.content.Context, android.util.AttributeSet, int, int);
-    method public int getRightDecorationWidth(android.view.View);
-    method public int getRowCountForAccessibility(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
-    method public int getSelectionModeForAccessibility(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
-    method public int getTopDecorationHeight(android.view.View);
-    method public int getWidth();
-    method public boolean hasFocus();
-    method public void ignoreView(android.view.View);
-    method public boolean isAttachedToWindow();
-    method public boolean isFocused();
-    method public boolean isLayoutHierarchical(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
-    method public boolean isSmoothScrolling();
-    method public void layoutDecorated(android.view.View, int, int, int, int);
-    method public void measureChild(android.view.View, int, int);
-    method public void measureChildWithMargins(android.view.View, int, int);
-    method public void moveView(int, int);
-    method public void offsetChildrenHorizontal(int);
-    method public void offsetChildrenVertical(int);
-    method public void onAdapterChanged(android.support.v7.widget.RecyclerView.Adapter, android.support.v7.widget.RecyclerView.Adapter);
-    method public boolean onAddFocusables(android.support.v7.widget.RecyclerView, java.util.ArrayList<android.view.View>, int, int);
-    method public void onAttachedToWindow(android.support.v7.widget.RecyclerView);
-    method public deprecated void onDetachedFromWindow(android.support.v7.widget.RecyclerView);
-    method public void onDetachedFromWindow(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.Recycler);
-    method public android.view.View onFocusSearchFailed(android.view.View, int, android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
-    method public void onInitializeAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
-    method public void onInitializeAccessibilityEvent(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State, android.view.accessibility.AccessibilityEvent);
-    method public void onInitializeAccessibilityNodeInfo(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State, android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
-    method public void onInitializeAccessibilityNodeInfoForItem(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State, android.view.View, android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
-    method public android.view.View onInterceptFocusSearch(android.view.View, int);
-    method public void onItemsAdded(android.support.v7.widget.RecyclerView, int, int);
-    method public void onItemsChanged(android.support.v7.widget.RecyclerView);
-    method public void onItemsMoved(android.support.v7.widget.RecyclerView, int, int, int);
-    method public void onItemsRemoved(android.support.v7.widget.RecyclerView, int, int);
-    method public void onItemsUpdated(android.support.v7.widget.RecyclerView, int, int);
-    method public void onLayoutChildren(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
-    method public void onMeasure(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State, int, int);
-    method public deprecated boolean onRequestChildFocus(android.support.v7.widget.RecyclerView, android.view.View, android.view.View);
-    method public boolean onRequestChildFocus(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.State, android.view.View, android.view.View);
-    method public void onRestoreInstanceState(android.os.Parcelable);
-    method public android.os.Parcelable onSaveInstanceState();
-    method public void onScrollStateChanged(int);
-    method public boolean performAccessibilityAction(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State, int, android.os.Bundle);
-    method public boolean performAccessibilityActionForItem(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State, android.view.View, int, android.os.Bundle);
-    method public void postOnAnimation(java.lang.Runnable);
-    method public void removeAllViews();
-    method public void removeAndRecycleAllViews(android.support.v7.widget.RecyclerView.Recycler);
-    method public void removeAndRecycleView(android.view.View, android.support.v7.widget.RecyclerView.Recycler);
-    method public void removeAndRecycleViewAt(int, android.support.v7.widget.RecyclerView.Recycler);
-    method public boolean removeCallbacks(java.lang.Runnable);
-    method public void removeDetachedView(android.view.View);
-    method public void removeView(android.view.View);
-    method public void removeViewAt(int);
-    method public boolean requestChildRectangleOnScreen(android.support.v7.widget.RecyclerView, android.view.View, android.graphics.Rect, boolean);
-    method public void requestLayout();
-    method public void requestSimpleAnimationsInNextLayout();
-    method public int scrollHorizontallyBy(int, android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
-    method public void scrollToPosition(int);
-    method public int scrollVerticallyBy(int, android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
-    method public void setMeasuredDimension(int, int);
-    method public void smoothScrollToPosition(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.State, int);
-    method public void startSmoothScroll(android.support.v7.widget.RecyclerView.SmoothScroller);
-    method public void stopIgnoringView(android.view.View);
-    method public boolean supportsPredictiveItemAnimations();
-  }
-
-  public static class RecyclerView.LayoutManager.Properties {
-    ctor public RecyclerView.LayoutManager.Properties();
-    field public int orientation;
-    field public boolean reverseLayout;
-    field public int spanCount;
-    field public boolean stackFromEnd;
-  }
-
-  public static class RecyclerView.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
-    ctor public RecyclerView.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public RecyclerView.LayoutParams(int, int);
-    ctor public RecyclerView.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public RecyclerView.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public RecyclerView.LayoutParams(android.support.v7.widget.RecyclerView.LayoutParams);
-    method public int getViewAdapterPosition();
-    method public int getViewLayoutPosition();
-    method public deprecated int getViewPosition();
-    method public boolean isItemChanged();
-    method public boolean isItemRemoved();
-    method public boolean isViewInvalid();
-    method public boolean viewNeedsUpdate();
-  }
-
-  public static abstract interface RecyclerView.OnChildAttachStateChangeListener {
-    method public abstract void onChildViewAttachedToWindow(android.view.View);
-    method public abstract void onChildViewDetachedFromWindow(android.view.View);
-  }
-
-  public static abstract interface RecyclerView.OnItemTouchListener {
-    method public abstract boolean onInterceptTouchEvent(android.support.v7.widget.RecyclerView, android.view.MotionEvent);
-    method public abstract void onRequestDisallowInterceptTouchEvent(boolean);
-    method public abstract void onTouchEvent(android.support.v7.widget.RecyclerView, android.view.MotionEvent);
-  }
-
-  public static abstract class RecyclerView.OnScrollListener {
-    ctor public RecyclerView.OnScrollListener();
-    method public void onScrollStateChanged(android.support.v7.widget.RecyclerView, int);
-    method public void onScrolled(android.support.v7.widget.RecyclerView, int, int);
-  }
-
-  public static class RecyclerView.RecycledViewPool {
-    ctor public RecyclerView.RecycledViewPool();
-    method public void clear();
-    method public android.support.v7.widget.RecyclerView.ViewHolder getRecycledView(int);
-    method public void putRecycledView(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void setMaxRecycledViews(int, int);
-  }
-
-  public final class RecyclerView.Recycler {
-    ctor public RecyclerView.Recycler();
-    method public void bindViewToPosition(android.view.View, int);
-    method public void clear();
-    method public int convertPreLayoutPositionToPostLayout(int);
-    method public java.util.List<android.support.v7.widget.RecyclerView.ViewHolder> getScrapList();
-    method public android.view.View getViewForPosition(int);
-    method public void recycleView(android.view.View);
-    method public void setViewCacheSize(int);
-  }
-
-  public static abstract interface RecyclerView.RecyclerListener {
-    method public abstract void onViewRecycled(android.support.v7.widget.RecyclerView.ViewHolder);
-  }
-
-  public static class RecyclerView.SimpleOnItemTouchListener implements android.support.v7.widget.RecyclerView.OnItemTouchListener {
-    ctor public RecyclerView.SimpleOnItemTouchListener();
-    method public boolean onInterceptTouchEvent(android.support.v7.widget.RecyclerView, android.view.MotionEvent);
-    method public void onRequestDisallowInterceptTouchEvent(boolean);
-    method public void onTouchEvent(android.support.v7.widget.RecyclerView, android.view.MotionEvent);
-  }
-
-  public static abstract class RecyclerView.SmoothScroller {
-    ctor public RecyclerView.SmoothScroller();
-    method public android.view.View findViewByPosition(int);
-    method public int getChildCount();
-    method public int getChildPosition(android.view.View);
-    method public android.support.v7.widget.RecyclerView.LayoutManager getLayoutManager();
-    method public int getTargetPosition();
-    method public deprecated void instantScrollToPosition(int);
-    method public boolean isPendingInitialRun();
-    method public boolean isRunning();
-    method protected void normalize(android.graphics.PointF);
-    method protected void onChildAttachedToWindow(android.view.View);
-    method protected abstract void onSeekTargetStep(int, int, android.support.v7.widget.RecyclerView.State, android.support.v7.widget.RecyclerView.SmoothScroller.Action);
-    method protected abstract void onStart();
-    method protected abstract void onStop();
-    method protected abstract void onTargetFound(android.view.View, android.support.v7.widget.RecyclerView.State, android.support.v7.widget.RecyclerView.SmoothScroller.Action);
-    method public void setTargetPosition(int);
-    method protected final void stop();
-  }
-
-  public static class RecyclerView.SmoothScroller.Action {
-    ctor public RecyclerView.SmoothScroller.Action(int, int);
-    ctor public RecyclerView.SmoothScroller.Action(int, int, int);
-    ctor public RecyclerView.SmoothScroller.Action(int, int, int, android.view.animation.Interpolator);
-    method public int getDuration();
-    method public int getDx();
-    method public int getDy();
-    method public android.view.animation.Interpolator getInterpolator();
-    method public void jumpTo(int);
-    method public void setDuration(int);
-    method public void setDx(int);
-    method public void setDy(int);
-    method public void setInterpolator(android.view.animation.Interpolator);
-    method public void update(int, int, int, android.view.animation.Interpolator);
-    field public static final int UNDEFINED_DURATION = -2147483648; // 0x80000000
-  }
-
-  public static class RecyclerView.State {
-    ctor public RecyclerView.State();
-    method public boolean didStructureChange();
-    method public T get(int);
-    method public int getItemCount();
-    method public int getTargetScrollPosition();
-    method public boolean hasTargetScrollPosition();
-    method public boolean isPreLayout();
-    method public void onViewIgnored(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void put(int, java.lang.Object);
-    method public void remove(int);
-    method public boolean willRunPredictiveAnimations();
-    method public boolean willRunSimpleAnimations();
-  }
-
-  public static abstract class RecyclerView.ViewCacheExtension {
-    ctor public RecyclerView.ViewCacheExtension();
-    method public abstract android.view.View getViewForPositionAndType(android.support.v7.widget.RecyclerView.Recycler, int, int);
-  }
-
-  public static abstract class RecyclerView.ViewHolder {
-    ctor public RecyclerView.ViewHolder(android.view.View);
-    method public final int getAdapterPosition();
-    method public final long getItemId();
-    method public final int getItemViewType();
-    method public final int getLayoutPosition();
-    method public final int getOldPosition();
-    method public final deprecated int getPosition();
-    method public final boolean isRecyclable();
-    method public final void setIsRecyclable(boolean);
-    field public final android.view.View itemView;
-  }
-
-  public class RecyclerViewAccessibilityDelegate extends android.support.v4.view.AccessibilityDelegateCompat {
-    ctor public RecyclerViewAccessibilityDelegate(android.support.v7.widget.RecyclerView);
-  }
-
-  public class StaggeredGridLayoutManager extends android.support.v7.widget.RecyclerView.LayoutManager {
-    ctor public StaggeredGridLayoutManager(android.content.Context, android.util.AttributeSet, int, int);
-    ctor public StaggeredGridLayoutManager(int, int);
-    method public int[] findFirstCompletelyVisibleItemPositions(int[]);
-    method public int[] findFirstVisibleItemPositions(int[]);
-    method public int[] findLastCompletelyVisibleItemPositions(int[]);
-    method public int[] findLastVisibleItemPositions(int[]);
-    method public android.support.v7.widget.RecyclerView.LayoutParams generateDefaultLayoutParams();
-    method public int getGapStrategy();
-    method public int getOrientation();
-    method public boolean getReverseLayout();
-    method public int getSpanCount();
-    method public void invalidateSpanAssignments();
-    method public void scrollToPositionWithOffset(int, int);
-    method public void setGapStrategy(int);
-    method public void setOrientation(int);
-    method public void setReverseLayout(boolean);
-    method public void setSpanCount(int);
-    field public static final deprecated int GAP_HANDLING_LAZY = 1; // 0x1
-    field public static final int GAP_HANDLING_MOVE_ITEMS_BETWEEN_SPANS = 2; // 0x2
-    field public static final int GAP_HANDLING_NONE = 0; // 0x0
-    field public static final int HORIZONTAL = 0; // 0x0
-    field public static final java.lang.String TAG = "StaggeredGridLayoutManager";
-    field public static final int VERTICAL = 1; // 0x1
-  }
-
-  public static class StaggeredGridLayoutManager.LayoutParams extends android.support.v7.widget.RecyclerView.LayoutParams {
-    ctor public StaggeredGridLayoutManager.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public StaggeredGridLayoutManager.LayoutParams(int, int);
-    ctor public StaggeredGridLayoutManager.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public StaggeredGridLayoutManager.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public StaggeredGridLayoutManager.LayoutParams(android.support.v7.widget.RecyclerView.LayoutParams);
-    method public final int getSpanIndex();
-    method public boolean isFullSpan();
-    method public void setFullSpan(boolean);
-    field public static final int INVALID_SPAN_ID = -1; // 0xffffffff
-  }
-
-}
-
-package android.support.v7.widget.helper {
-
-  public class ItemTouchHelper extends android.support.v7.widget.RecyclerView.ItemDecoration implements android.support.v7.widget.RecyclerView.OnChildAttachStateChangeListener {
-    ctor public ItemTouchHelper(android.support.v7.widget.helper.ItemTouchHelper.Callback);
-    method public void attachToRecyclerView(android.support.v7.widget.RecyclerView);
-    method public void onChildViewAttachedToWindow(android.view.View);
-    method public void onChildViewDetachedFromWindow(android.view.View);
-    method public void startDrag(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void startSwipe(android.support.v7.widget.RecyclerView.ViewHolder);
-    field public static final int ACTION_STATE_DRAG = 2; // 0x2
-    field public static final int ACTION_STATE_IDLE = 0; // 0x0
-    field public static final int ACTION_STATE_SWIPE = 1; // 0x1
-    field public static final int ANIMATION_TYPE_DRAG = 8; // 0x8
-    field public static final int ANIMATION_TYPE_SWIPE_CANCEL = 4; // 0x4
-    field public static final int ANIMATION_TYPE_SWIPE_SUCCESS = 2; // 0x2
-    field public static final int DOWN = 2; // 0x2
-    field public static final int END = 32; // 0x20
-    field public static final int LEFT = 4; // 0x4
-    field public static final int RIGHT = 8; // 0x8
-    field public static final int START = 16; // 0x10
-    field public static final int UP = 1; // 0x1
-  }
-
-  public static abstract class ItemTouchHelper.Callback {
-    ctor public ItemTouchHelper.Callback();
-    method public boolean canDropOver(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ViewHolder);
-    method public android.support.v7.widget.RecyclerView.ViewHolder chooseDropTarget(android.support.v7.widget.RecyclerView.ViewHolder, java.util.List<android.support.v7.widget.RecyclerView.ViewHolder>, int, int);
-    method public void clearView(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder);
-    method public int convertToAbsoluteDirection(int, int);
-    method public static int convertToRelativeDirection(int, int);
-    method public long getAnimationDuration(android.support.v7.widget.RecyclerView, int, float, float);
-    method public int getBoundingBoxMargin();
-    method public static android.support.v7.widget.helper.ItemTouchUIUtil getDefaultUIUtil();
-    method public float getMoveThreshold(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public abstract int getMovementFlags(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder);
-    method public float getSwipeThreshold(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public int interpolateOutOfBoundsScroll(android.support.v7.widget.RecyclerView, int, int, int, long);
-    method public boolean isItemViewSwipeEnabled();
-    method public boolean isLongPressDragEnabled();
-    method public static int makeFlag(int, int);
-    method public static int makeMovementFlags(int, int);
-    method public void onChildDraw(android.graphics.Canvas, android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder, float, float, int, boolean);
-    method public void onChildDrawOver(android.graphics.Canvas, android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder, float, float, int, boolean);
-    method public abstract boolean onMove(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void onMoved(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder, int, android.support.v7.widget.RecyclerView.ViewHolder, int, int, int);
-    method public void onSelectedChanged(android.support.v7.widget.RecyclerView.ViewHolder, int);
-    method public abstract void onSwiped(android.support.v7.widget.RecyclerView.ViewHolder, int);
-    field public static final int DEFAULT_DRAG_ANIMATION_DURATION = 200; // 0xc8
-    field public static final int DEFAULT_SWIPE_ANIMATION_DURATION = 250; // 0xfa
-  }
-
-  public static abstract class ItemTouchHelper.SimpleCallback extends android.support.v7.widget.helper.ItemTouchHelper.Callback {
-    ctor public ItemTouchHelper.SimpleCallback(int, int);
-    method public int getDragDirs(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder);
-    method public int getMovementFlags(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder);
-    method public int getSwipeDirs(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void setDefaultDragDirs(int);
-    method public void setDefaultSwipeDirs(int);
-  }
-
-  public static abstract interface ItemTouchHelper.ViewDropHandler {
-    method public abstract void prepareForDrop(android.view.View, android.view.View, int, int);
-  }
-
-  public abstract interface ItemTouchUIUtil {
-    method public abstract void clearView(android.view.View);
-    method public abstract void onDraw(android.graphics.Canvas, android.support.v7.widget.RecyclerView, android.view.View, float, float, int, boolean);
-    method public abstract void onDrawOver(android.graphics.Canvas, android.support.v7.widget.RecyclerView, android.view.View, float, float, int, boolean);
-    method public abstract void onSelected(android.view.View);
-  }
-
-}
-
-package android.support.v7.widget.util {
-
-  public abstract class SortedListAdapterCallback extends android.support.v7.util.SortedList.Callback {
-    ctor public SortedListAdapterCallback(android.support.v7.widget.RecyclerView.Adapter);
-    method public void onChanged(int, int);
-    method public void onInserted(int, int);
-    method public void onMoved(int, int);
-    method public void onRemoved(int, int);
-  }
-
-}
-
diff --git a/v7/recyclerview/api/23.0.0.txt b/v7/recyclerview/api/23.0.0.txt
deleted file mode 100644
index e37956e..0000000
--- a/v7/recyclerview/api/23.0.0.txt
+++ /dev/null
@@ -1,826 +0,0 @@
-package android.support.v7.recyclerview {
-
-  public final class R {
-    ctor public R();
-  }
-
-  public static final class R.attr {
-    ctor public R.attr();
-    field public static int layoutManager;
-    field public static int reverseLayout;
-    field public static int spanCount;
-    field public static int stackFromEnd;
-  }
-
-  public static final class R.dimen {
-    ctor public R.dimen();
-    field public static int item_touch_helper_max_drag_scroll_per_frame;
-  }
-
-  public static final class R.id {
-    ctor public R.id();
-    field public static int item_touch_helper_previous_elevation;
-  }
-
-  public static final class R.styleable {
-    ctor public R.styleable();
-    field public static final int[] RecyclerView;
-    field public static int RecyclerView_android_orientation;
-    field public static int RecyclerView_layoutManager;
-    field public static int RecyclerView_reverseLayout;
-    field public static int RecyclerView_spanCount;
-    field public static int RecyclerView_stackFromEnd;
-  }
-
-}
-
-package android.support.v7.util {
-
-  public class AsyncListUtil {
-    ctor public AsyncListUtil(java.lang.Class<T>, int, android.support.v7.util.AsyncListUtil.DataCallback<T>, android.support.v7.util.AsyncListUtil.ViewCallback);
-    method public T getItem(int);
-    method public int getItemCount();
-    method public void onRangeChanged();
-    method public void refresh();
-  }
-
-  public static abstract class AsyncListUtil.DataCallback {
-    ctor public AsyncListUtil.DataCallback();
-    method public abstract void fillData(T[], int, int);
-    method public int getMaxCachedTiles();
-    method public void recycleData(T[], int);
-    method public abstract int refreshData();
-  }
-
-  public static abstract class AsyncListUtil.ViewCallback {
-    ctor public AsyncListUtil.ViewCallback();
-    method public void extendRangeInto(int[], int[], int);
-    method public abstract void getItemRangeInto(int[]);
-    method public abstract void onDataRefresh();
-    method public abstract void onItemLoaded(int);
-    field public static final int HINT_SCROLL_ASC = 2; // 0x2
-    field public static final int HINT_SCROLL_DESC = 1; // 0x1
-    field public static final int HINT_SCROLL_NONE = 0; // 0x0
-  }
-
-  public class SortedList {
-    ctor public SortedList(java.lang.Class<T>, android.support.v7.util.SortedList.Callback<T>);
-    ctor public SortedList(java.lang.Class<T>, android.support.v7.util.SortedList.Callback<T>, int);
-    method public int add(T);
-    method public void addAll(T[], boolean);
-    method public void addAll(T...);
-    method public void addAll(java.util.Collection<T>);
-    method public void beginBatchedUpdates();
-    method public void clear();
-    method public void endBatchedUpdates();
-    method public T get(int) throws java.lang.IndexOutOfBoundsException;
-    method public int indexOf(T);
-    method public void recalculatePositionOfItemAt(int);
-    method public boolean remove(T);
-    method public T removeItemAt(int);
-    method public int size();
-    method public void updateItemAt(int, T);
-    field public static final int INVALID_POSITION = -1; // 0xffffffff
-  }
-
-  public static class SortedList.BatchedCallback extends android.support.v7.util.SortedList.Callback {
-    ctor public SortedList.BatchedCallback(android.support.v7.util.SortedList.Callback<T2>);
-    method public boolean areContentsTheSame(T2, T2);
-    method public boolean areItemsTheSame(T2, T2);
-    method public int compare(T2, T2);
-    method public void dispatchLastEvent();
-    method public void onChanged(int, int);
-    method public void onInserted(int, int);
-    method public void onMoved(int, int);
-    method public void onRemoved(int, int);
-  }
-
-  public static abstract class SortedList.Callback implements java.util.Comparator {
-    ctor public SortedList.Callback();
-    method public abstract boolean areContentsTheSame(T2, T2);
-    method public abstract boolean areItemsTheSame(T2, T2);
-    method public abstract int compare(T2, T2);
-    method public abstract void onChanged(int, int);
-    method public abstract void onInserted(int, int);
-    method public abstract void onMoved(int, int);
-    method public abstract void onRemoved(int, int);
-  }
-
-}
-
-package android.support.v7.widget {
-
-  public class DefaultItemAnimator extends android.support.v7.widget.RecyclerView.ItemAnimator {
-    ctor public DefaultItemAnimator();
-    method public boolean animateAdd(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public boolean animateChange(android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ViewHolder, int, int, int, int);
-    method public boolean animateMove(android.support.v7.widget.RecyclerView.ViewHolder, int, int, int, int);
-    method public boolean animateRemove(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void endAnimation(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void endAnimations();
-    method public boolean isRunning();
-    method public void runPendingAnimations();
-  }
-
-  public class GridLayoutManager extends android.support.v7.widget.LinearLayoutManager {
-    ctor public GridLayoutManager(android.content.Context, android.util.AttributeSet, int, int);
-    ctor public GridLayoutManager(android.content.Context, int);
-    ctor public GridLayoutManager(android.content.Context, int, int, boolean);
-    method public int getSpanCount();
-    method public android.support.v7.widget.GridLayoutManager.SpanSizeLookup getSpanSizeLookup();
-    method public void setSpanCount(int);
-    method public void setSpanSizeLookup(android.support.v7.widget.GridLayoutManager.SpanSizeLookup);
-    field public static final int DEFAULT_SPAN_COUNT = -1; // 0xffffffff
-  }
-
-  public static final class GridLayoutManager.DefaultSpanSizeLookup extends android.support.v7.widget.GridLayoutManager.SpanSizeLookup {
-    ctor public GridLayoutManager.DefaultSpanSizeLookup();
-    method public int getSpanSize(int);
-  }
-
-  public static class GridLayoutManager.LayoutParams extends android.support.v7.widget.RecyclerView.LayoutParams {
-    ctor public GridLayoutManager.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public GridLayoutManager.LayoutParams(int, int);
-    ctor public GridLayoutManager.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public GridLayoutManager.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public GridLayoutManager.LayoutParams(android.support.v7.widget.RecyclerView.LayoutParams);
-    method public int getSpanIndex();
-    method public int getSpanSize();
-    field public static final int INVALID_SPAN_ID = -1; // 0xffffffff
-  }
-
-  public static abstract class GridLayoutManager.SpanSizeLookup {
-    ctor public GridLayoutManager.SpanSizeLookup();
-    method public int getSpanGroupIndex(int, int);
-    method public int getSpanIndex(int, int);
-    method public abstract int getSpanSize(int);
-    method public void invalidateSpanIndexCache();
-    method public boolean isSpanIndexCacheEnabled();
-    method public void setSpanIndexCacheEnabled(boolean);
-  }
-
-  public class LinearLayoutManager extends android.support.v7.widget.RecyclerView.LayoutManager implements android.support.v7.widget.helper.ItemTouchHelper.ViewDropHandler {
-    ctor public LinearLayoutManager(android.content.Context);
-    ctor public LinearLayoutManager(android.content.Context, int, boolean);
-    ctor public LinearLayoutManager(android.content.Context, android.util.AttributeSet, int, int);
-    method public android.graphics.PointF computeScrollVectorForPosition(int);
-    method public int findFirstCompletelyVisibleItemPosition();
-    method public int findFirstVisibleItemPosition();
-    method public int findLastCompletelyVisibleItemPosition();
-    method public int findLastVisibleItemPosition();
-    method public android.support.v7.widget.RecyclerView.LayoutParams generateDefaultLayoutParams();
-    method protected int getExtraLayoutSpace(android.support.v7.widget.RecyclerView.State);
-    method public int getOrientation();
-    method public boolean getRecycleChildrenOnDetach();
-    method public boolean getReverseLayout();
-    method public boolean getStackFromEnd();
-    method protected boolean isLayoutRTL();
-    method public boolean isSmoothScrollbarEnabled();
-    method public void prepareForDrop(android.view.View, android.view.View, int, int);
-    method public void scrollToPositionWithOffset(int, int);
-    method public void setOrientation(int);
-    method public void setRecycleChildrenOnDetach(boolean);
-    method public void setReverseLayout(boolean);
-    method public void setSmoothScrollbarEnabled(boolean);
-    method public void setStackFromEnd(boolean);
-    field public static final int HORIZONTAL = 0; // 0x0
-    field public static final int INVALID_OFFSET = -2147483648; // 0x80000000
-    field public static final int VERTICAL = 1; // 0x1
-  }
-
-  protected static class LinearLayoutManager.LayoutChunkResult {
-    ctor protected LinearLayoutManager.LayoutChunkResult();
-    field public int mConsumed;
-    field public boolean mFinished;
-    field public boolean mFocusable;
-    field public boolean mIgnoreConsumed;
-  }
-
-  public abstract class LinearSmoothScroller extends android.support.v7.widget.RecyclerView.SmoothScroller {
-    ctor public LinearSmoothScroller(android.content.Context);
-    method public int calculateDtToFit(int, int, int, int, int);
-    method public int calculateDxToMakeVisible(android.view.View, int);
-    method public int calculateDyToMakeVisible(android.view.View, int);
-    method protected float calculateSpeedPerPixel(android.util.DisplayMetrics);
-    method protected int calculateTimeForDeceleration(int);
-    method protected int calculateTimeForScrolling(int);
-    method public abstract android.graphics.PointF computeScrollVectorForPosition(int);
-    method protected int getHorizontalSnapPreference();
-    method protected int getVerticalSnapPreference();
-    method protected void onSeekTargetStep(int, int, android.support.v7.widget.RecyclerView.State, android.support.v7.widget.RecyclerView.SmoothScroller.Action);
-    method protected void onStart();
-    method protected void onStop();
-    method protected void onTargetFound(android.view.View, android.support.v7.widget.RecyclerView.State, android.support.v7.widget.RecyclerView.SmoothScroller.Action);
-    method protected void updateActionForInterimTarget(android.support.v7.widget.RecyclerView.SmoothScroller.Action);
-    field public static final int SNAP_TO_ANY = 0; // 0x0
-    field public static final int SNAP_TO_END = 1; // 0x1
-    field public static final int SNAP_TO_START = -1; // 0xffffffff
-    field protected final android.view.animation.DecelerateInterpolator mDecelerateInterpolator;
-    field protected int mInterimTargetDx;
-    field protected int mInterimTargetDy;
-    field protected final android.view.animation.LinearInterpolator mLinearInterpolator;
-    field protected android.graphics.PointF mTargetVector;
-  }
-
-  public abstract class OrientationHelper {
-    method public static android.support.v7.widget.OrientationHelper createHorizontalHelper(android.support.v7.widget.RecyclerView.LayoutManager);
-    method public static android.support.v7.widget.OrientationHelper createOrientationHelper(android.support.v7.widget.RecyclerView.LayoutManager, int);
-    method public static android.support.v7.widget.OrientationHelper createVerticalHelper(android.support.v7.widget.RecyclerView.LayoutManager);
-    method public abstract int getDecoratedEnd(android.view.View);
-    method public abstract int getDecoratedMeasurement(android.view.View);
-    method public abstract int getDecoratedMeasurementInOther(android.view.View);
-    method public abstract int getDecoratedStart(android.view.View);
-    method public abstract int getEnd();
-    method public abstract int getEndAfterPadding();
-    method public abstract int getEndPadding();
-    method public abstract int getStartAfterPadding();
-    method public abstract int getTotalSpace();
-    method public int getTotalSpaceChange();
-    method public abstract void offsetChild(android.view.View, int);
-    method public abstract void offsetChildren(int);
-    method public void onLayoutComplete();
-    field public static final int HORIZONTAL = 0; // 0x0
-    field public static final int VERTICAL = 1; // 0x1
-    field protected final android.support.v7.widget.RecyclerView.LayoutManager mLayoutManager;
-  }
-
-  public class RecyclerView extends android.view.ViewGroup {
-    ctor public RecyclerView(android.content.Context);
-    ctor public RecyclerView(android.content.Context, android.util.AttributeSet);
-    ctor public RecyclerView(android.content.Context, android.util.AttributeSet, int);
-    method public void addItemDecoration(android.support.v7.widget.RecyclerView.ItemDecoration, int);
-    method public void addItemDecoration(android.support.v7.widget.RecyclerView.ItemDecoration);
-    method public void addOnChildAttachStateChangeListener(android.support.v7.widget.RecyclerView.OnChildAttachStateChangeListener);
-    method public void addOnItemTouchListener(android.support.v7.widget.RecyclerView.OnItemTouchListener);
-    method public void addOnScrollListener(android.support.v7.widget.RecyclerView.OnScrollListener);
-    method public void clearOnChildAttachStateChangeListeners();
-    method public void clearOnScrollListeners();
-    method public int computeHorizontalScrollExtent();
-    method public int computeHorizontalScrollOffset();
-    method public int computeHorizontalScrollRange();
-    method public int computeVerticalScrollExtent();
-    method public int computeVerticalScrollOffset();
-    method public int computeVerticalScrollRange();
-    method public boolean drawChild(android.graphics.Canvas, android.view.View, long);
-    method public android.view.View findChildViewUnder(float, float);
-    method public android.support.v7.widget.RecyclerView.ViewHolder findViewHolderForAdapterPosition(int);
-    method public android.support.v7.widget.RecyclerView.ViewHolder findViewHolderForItemId(long);
-    method public android.support.v7.widget.RecyclerView.ViewHolder findViewHolderForLayoutPosition(int);
-    method public deprecated android.support.v7.widget.RecyclerView.ViewHolder findViewHolderForPosition(int);
-    method public boolean fling(int, int);
-    method public android.support.v7.widget.RecyclerView.Adapter getAdapter();
-    method public int getChildAdapterPosition(android.view.View);
-    method public long getChildItemId(android.view.View);
-    method public int getChildLayoutPosition(android.view.View);
-    method public deprecated int getChildPosition(android.view.View);
-    method public android.support.v7.widget.RecyclerView.ViewHolder getChildViewHolder(android.view.View);
-    method public android.support.v7.widget.RecyclerViewAccessibilityDelegate getCompatAccessibilityDelegate();
-    method public android.support.v7.widget.RecyclerView.ItemAnimator getItemAnimator();
-    method public android.support.v7.widget.RecyclerView.LayoutManager getLayoutManager();
-    method public int getMaxFlingVelocity();
-    method public int getMinFlingVelocity();
-    method public android.support.v7.widget.RecyclerView.RecycledViewPool getRecycledViewPool();
-    method public int getScrollState();
-    method public boolean hasFixedSize();
-    method public boolean hasPendingAdapterUpdates();
-    method public void invalidateItemDecorations();
-    method public boolean isAnimating();
-    method public boolean isComputingLayout();
-    method public boolean isLayoutFrozen();
-    method public void offsetChildrenHorizontal(int);
-    method public void offsetChildrenVertical(int);
-    method public void onChildAttachedToWindow(android.view.View);
-    method public void onChildDetachedFromWindow(android.view.View);
-    method public void onDraw(android.graphics.Canvas);
-    method protected void onLayout(boolean, int, int, int, int);
-    method public void onScrollStateChanged(int);
-    method public void onScrolled(int, int);
-    method public void removeItemDecoration(android.support.v7.widget.RecyclerView.ItemDecoration);
-    method public void removeOnChildAttachStateChangeListener(android.support.v7.widget.RecyclerView.OnChildAttachStateChangeListener);
-    method public void removeOnItemTouchListener(android.support.v7.widget.RecyclerView.OnItemTouchListener);
-    method public void removeOnScrollListener(android.support.v7.widget.RecyclerView.OnScrollListener);
-    method public void scrollToPosition(int);
-    method public void setAccessibilityDelegateCompat(android.support.v7.widget.RecyclerViewAccessibilityDelegate);
-    method public void setAdapter(android.support.v7.widget.RecyclerView.Adapter);
-    method public void setChildDrawingOrderCallback(android.support.v7.widget.RecyclerView.ChildDrawingOrderCallback);
-    method public void setHasFixedSize(boolean);
-    method public void setItemAnimator(android.support.v7.widget.RecyclerView.ItemAnimator);
-    method public void setItemViewCacheSize(int);
-    method public void setLayoutFrozen(boolean);
-    method public void setLayoutManager(android.support.v7.widget.RecyclerView.LayoutManager);
-    method public deprecated void setOnScrollListener(android.support.v7.widget.RecyclerView.OnScrollListener);
-    method public void setRecycledViewPool(android.support.v7.widget.RecyclerView.RecycledViewPool);
-    method public void setRecyclerListener(android.support.v7.widget.RecyclerView.RecyclerListener);
-    method public void setScrollingTouchSlop(int);
-    method public void setViewCacheExtension(android.support.v7.widget.RecyclerView.ViewCacheExtension);
-    method public void smoothScrollBy(int, int);
-    method public void smoothScrollToPosition(int);
-    method public void stopScroll();
-    method public void swapAdapter(android.support.v7.widget.RecyclerView.Adapter, boolean);
-    field public static final int HORIZONTAL = 0; // 0x0
-    field public static final int INVALID_TYPE = -1; // 0xffffffff
-    field public static final long NO_ID = -1L; // 0xffffffffffffffffL
-    field public static final int NO_POSITION = -1; // 0xffffffff
-    field public static final int SCROLL_STATE_DRAGGING = 1; // 0x1
-    field public static final int SCROLL_STATE_IDLE = 0; // 0x0
-    field public static final int SCROLL_STATE_SETTLING = 2; // 0x2
-    field public static final int TOUCH_SLOP_DEFAULT = 0; // 0x0
-    field public static final int TOUCH_SLOP_PAGING = 1; // 0x1
-    field public static final int VERTICAL = 1; // 0x1
-  }
-
-  public static abstract class RecyclerView.Adapter {
-    ctor public RecyclerView.Adapter();
-    method public final void bindViewHolder(VH, int);
-    method public final VH createViewHolder(android.view.ViewGroup, int);
-    method public abstract int getItemCount();
-    method public long getItemId(int);
-    method public int getItemViewType(int);
-    method public final boolean hasObservers();
-    method public final boolean hasStableIds();
-    method public final void notifyDataSetChanged();
-    method public final void notifyItemChanged(int);
-    method public final void notifyItemChanged(int, java.lang.Object);
-    method public final void notifyItemInserted(int);
-    method public final void notifyItemMoved(int, int);
-    method public final void notifyItemRangeChanged(int, int);
-    method public final void notifyItemRangeChanged(int, int, java.lang.Object);
-    method public final void notifyItemRangeInserted(int, int);
-    method public final void notifyItemRangeRemoved(int, int);
-    method public final void notifyItemRemoved(int);
-    method public void onAttachedToRecyclerView(android.support.v7.widget.RecyclerView);
-    method public abstract void onBindViewHolder(VH, int);
-    method public void onBindViewHolder(VH, int, java.util.List<java.lang.Object>);
-    method public abstract VH onCreateViewHolder(android.view.ViewGroup, int);
-    method public void onDetachedFromRecyclerView(android.support.v7.widget.RecyclerView);
-    method public boolean onFailedToRecycleView(VH);
-    method public void onViewAttachedToWindow(VH);
-    method public void onViewDetachedFromWindow(VH);
-    method public void onViewRecycled(VH);
-    method public void registerAdapterDataObserver(android.support.v7.widget.RecyclerView.AdapterDataObserver);
-    method public void setHasStableIds(boolean);
-    method public void unregisterAdapterDataObserver(android.support.v7.widget.RecyclerView.AdapterDataObserver);
-  }
-
-  public static abstract class RecyclerView.AdapterDataObserver {
-    ctor public RecyclerView.AdapterDataObserver();
-    method public void onChanged();
-    method public void onItemRangeChanged(int, int);
-    method public void onItemRangeChanged(int, int, java.lang.Object);
-    method public void onItemRangeInserted(int, int);
-    method public void onItemRangeMoved(int, int, int);
-    method public void onItemRangeRemoved(int, int);
-  }
-
-  public static abstract interface RecyclerView.ChildDrawingOrderCallback {
-    method public abstract int onGetChildDrawingOrder(int, int);
-  }
-
-  public static abstract class RecyclerView.ItemAnimator {
-    ctor public RecyclerView.ItemAnimator();
-    method public abstract boolean animateAdd(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public abstract boolean animateChange(android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ViewHolder, int, int, int, int);
-    method public abstract boolean animateMove(android.support.v7.widget.RecyclerView.ViewHolder, int, int, int, int);
-    method public abstract boolean animateRemove(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public final void dispatchAddFinished(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public final void dispatchAddStarting(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public final void dispatchAnimationsFinished();
-    method public final void dispatchChangeFinished(android.support.v7.widget.RecyclerView.ViewHolder, boolean);
-    method public final void dispatchChangeStarting(android.support.v7.widget.RecyclerView.ViewHolder, boolean);
-    method public final void dispatchMoveFinished(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public final void dispatchMoveStarting(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public final void dispatchRemoveFinished(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public final void dispatchRemoveStarting(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public abstract void endAnimation(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public abstract void endAnimations();
-    method public long getAddDuration();
-    method public long getChangeDuration();
-    method public long getMoveDuration();
-    method public long getRemoveDuration();
-    method public boolean getSupportsChangeAnimations();
-    method public abstract boolean isRunning();
-    method public final boolean isRunning(android.support.v7.widget.RecyclerView.ItemAnimator.ItemAnimatorFinishedListener);
-    method public void onAddFinished(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void onAddStarting(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void onChangeFinished(android.support.v7.widget.RecyclerView.ViewHolder, boolean);
-    method public void onChangeStarting(android.support.v7.widget.RecyclerView.ViewHolder, boolean);
-    method public void onMoveFinished(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void onMoveStarting(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void onRemoveFinished(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void onRemoveStarting(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public abstract void runPendingAnimations();
-    method public void setAddDuration(long);
-    method public void setChangeDuration(long);
-    method public void setMoveDuration(long);
-    method public void setRemoveDuration(long);
-    method public void setSupportsChangeAnimations(boolean);
-  }
-
-  public static abstract interface RecyclerView.ItemAnimator.ItemAnimatorFinishedListener {
-    method public abstract void onAnimationsFinished();
-  }
-
-  public static abstract class RecyclerView.ItemDecoration {
-    ctor public RecyclerView.ItemDecoration();
-    method public deprecated void getItemOffsets(android.graphics.Rect, int, android.support.v7.widget.RecyclerView);
-    method public void getItemOffsets(android.graphics.Rect, android.view.View, android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.State);
-    method public void onDraw(android.graphics.Canvas, android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.State);
-    method public deprecated void onDraw(android.graphics.Canvas, android.support.v7.widget.RecyclerView);
-    method public void onDrawOver(android.graphics.Canvas, android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.State);
-    method public deprecated void onDrawOver(android.graphics.Canvas, android.support.v7.widget.RecyclerView);
-  }
-
-  public static abstract class RecyclerView.LayoutManager {
-    ctor public RecyclerView.LayoutManager();
-    method public void addDisappearingView(android.view.View);
-    method public void addDisappearingView(android.view.View, int);
-    method public void addView(android.view.View);
-    method public void addView(android.view.View, int);
-    method public void assertInLayoutOrScroll(java.lang.String);
-    method public void assertNotInLayoutOrScroll(java.lang.String);
-    method public void attachView(android.view.View, int, android.support.v7.widget.RecyclerView.LayoutParams);
-    method public void attachView(android.view.View, int);
-    method public void attachView(android.view.View);
-    method public void calculateItemDecorationsForChild(android.view.View, android.graphics.Rect);
-    method public boolean canScrollHorizontally();
-    method public boolean canScrollVertically();
-    method public boolean checkLayoutParams(android.support.v7.widget.RecyclerView.LayoutParams);
-    method public int computeHorizontalScrollExtent(android.support.v7.widget.RecyclerView.State);
-    method public int computeHorizontalScrollOffset(android.support.v7.widget.RecyclerView.State);
-    method public int computeHorizontalScrollRange(android.support.v7.widget.RecyclerView.State);
-    method public int computeVerticalScrollExtent(android.support.v7.widget.RecyclerView.State);
-    method public int computeVerticalScrollOffset(android.support.v7.widget.RecyclerView.State);
-    method public int computeVerticalScrollRange(android.support.v7.widget.RecyclerView.State);
-    method public void detachAndScrapAttachedViews(android.support.v7.widget.RecyclerView.Recycler);
-    method public void detachAndScrapView(android.view.View, android.support.v7.widget.RecyclerView.Recycler);
-    method public void detachAndScrapViewAt(int, android.support.v7.widget.RecyclerView.Recycler);
-    method public void detachView(android.view.View);
-    method public void detachViewAt(int);
-    method public void endAnimation(android.view.View);
-    method public android.view.View findViewByPosition(int);
-    method public abstract android.support.v7.widget.RecyclerView.LayoutParams generateDefaultLayoutParams();
-    method public android.support.v7.widget.RecyclerView.LayoutParams generateLayoutParams(android.view.ViewGroup.LayoutParams);
-    method public android.support.v7.widget.RecyclerView.LayoutParams generateLayoutParams(android.content.Context, android.util.AttributeSet);
-    method public int getBaseline();
-    method public int getBottomDecorationHeight(android.view.View);
-    method public android.view.View getChildAt(int);
-    method public int getChildCount();
-    method public static int getChildMeasureSpec(int, int, int, boolean);
-    method public boolean getClipToPadding();
-    method public int getColumnCountForAccessibility(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
-    method public int getDecoratedBottom(android.view.View);
-    method public int getDecoratedLeft(android.view.View);
-    method public int getDecoratedMeasuredHeight(android.view.View);
-    method public int getDecoratedMeasuredWidth(android.view.View);
-    method public int getDecoratedRight(android.view.View);
-    method public int getDecoratedTop(android.view.View);
-    method public android.view.View getFocusedChild();
-    method public int getHeight();
-    method public int getItemCount();
-    method public int getItemViewType(android.view.View);
-    method public int getLayoutDirection();
-    method public int getLeftDecorationWidth(android.view.View);
-    method public int getMinimumHeight();
-    method public int getMinimumWidth();
-    method public int getPaddingBottom();
-    method public int getPaddingEnd();
-    method public int getPaddingLeft();
-    method public int getPaddingRight();
-    method public int getPaddingStart();
-    method public int getPaddingTop();
-    method public int getPosition(android.view.View);
-    method public static android.support.v7.widget.RecyclerView.LayoutManager.Properties getProperties(android.content.Context, android.util.AttributeSet, int, int);
-    method public int getRightDecorationWidth(android.view.View);
-    method public int getRowCountForAccessibility(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
-    method public int getSelectionModeForAccessibility(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
-    method public int getTopDecorationHeight(android.view.View);
-    method public int getWidth();
-    method public boolean hasFocus();
-    method public void ignoreView(android.view.View);
-    method public boolean isAttachedToWindow();
-    method public boolean isFocused();
-    method public boolean isLayoutHierarchical(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
-    method public boolean isSmoothScrolling();
-    method public void layoutDecorated(android.view.View, int, int, int, int);
-    method public void measureChild(android.view.View, int, int);
-    method public void measureChildWithMargins(android.view.View, int, int);
-    method public void moveView(int, int);
-    method public void offsetChildrenHorizontal(int);
-    method public void offsetChildrenVertical(int);
-    method public void onAdapterChanged(android.support.v7.widget.RecyclerView.Adapter, android.support.v7.widget.RecyclerView.Adapter);
-    method public boolean onAddFocusables(android.support.v7.widget.RecyclerView, java.util.ArrayList<android.view.View>, int, int);
-    method public void onAttachedToWindow(android.support.v7.widget.RecyclerView);
-    method public deprecated void onDetachedFromWindow(android.support.v7.widget.RecyclerView);
-    method public void onDetachedFromWindow(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.Recycler);
-    method public android.view.View onFocusSearchFailed(android.view.View, int, android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
-    method public void onInitializeAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
-    method public void onInitializeAccessibilityEvent(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State, android.view.accessibility.AccessibilityEvent);
-    method public void onInitializeAccessibilityNodeInfo(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State, android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
-    method public void onInitializeAccessibilityNodeInfoForItem(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State, android.view.View, android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
-    method public android.view.View onInterceptFocusSearch(android.view.View, int);
-    method public void onItemsAdded(android.support.v7.widget.RecyclerView, int, int);
-    method public void onItemsChanged(android.support.v7.widget.RecyclerView);
-    method public void onItemsMoved(android.support.v7.widget.RecyclerView, int, int, int);
-    method public void onItemsRemoved(android.support.v7.widget.RecyclerView, int, int);
-    method public void onItemsUpdated(android.support.v7.widget.RecyclerView, int, int);
-    method public void onItemsUpdated(android.support.v7.widget.RecyclerView, int, int, java.lang.Object);
-    method public void onLayoutChildren(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
-    method public void onMeasure(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State, int, int);
-    method public deprecated boolean onRequestChildFocus(android.support.v7.widget.RecyclerView, android.view.View, android.view.View);
-    method public boolean onRequestChildFocus(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.State, android.view.View, android.view.View);
-    method public void onRestoreInstanceState(android.os.Parcelable);
-    method public android.os.Parcelable onSaveInstanceState();
-    method public void onScrollStateChanged(int);
-    method public boolean performAccessibilityAction(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State, int, android.os.Bundle);
-    method public boolean performAccessibilityActionForItem(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State, android.view.View, int, android.os.Bundle);
-    method public void postOnAnimation(java.lang.Runnable);
-    method public void removeAllViews();
-    method public void removeAndRecycleAllViews(android.support.v7.widget.RecyclerView.Recycler);
-    method public void removeAndRecycleView(android.view.View, android.support.v7.widget.RecyclerView.Recycler);
-    method public void removeAndRecycleViewAt(int, android.support.v7.widget.RecyclerView.Recycler);
-    method public boolean removeCallbacks(java.lang.Runnable);
-    method public void removeDetachedView(android.view.View);
-    method public void removeView(android.view.View);
-    method public void removeViewAt(int);
-    method public boolean requestChildRectangleOnScreen(android.support.v7.widget.RecyclerView, android.view.View, android.graphics.Rect, boolean);
-    method public void requestLayout();
-    method public void requestSimpleAnimationsInNextLayout();
-    method public int scrollHorizontallyBy(int, android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
-    method public void scrollToPosition(int);
-    method public int scrollVerticallyBy(int, android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
-    method public void setMeasuredDimension(int, int);
-    method public void smoothScrollToPosition(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.State, int);
-    method public void startSmoothScroll(android.support.v7.widget.RecyclerView.SmoothScroller);
-    method public void stopIgnoringView(android.view.View);
-    method public boolean supportsPredictiveItemAnimations();
-  }
-
-  public static class RecyclerView.LayoutManager.Properties {
-    ctor public RecyclerView.LayoutManager.Properties();
-    field public int orientation;
-    field public boolean reverseLayout;
-    field public int spanCount;
-    field public boolean stackFromEnd;
-  }
-
-  public static class RecyclerView.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
-    ctor public RecyclerView.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public RecyclerView.LayoutParams(int, int);
-    ctor public RecyclerView.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public RecyclerView.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public RecyclerView.LayoutParams(android.support.v7.widget.RecyclerView.LayoutParams);
-    method public int getViewAdapterPosition();
-    method public int getViewLayoutPosition();
-    method public deprecated int getViewPosition();
-    method public boolean isItemChanged();
-    method public boolean isItemRemoved();
-    method public boolean isViewInvalid();
-    method public boolean viewNeedsUpdate();
-  }
-
-  public static abstract interface RecyclerView.OnChildAttachStateChangeListener {
-    method public abstract void onChildViewAttachedToWindow(android.view.View);
-    method public abstract void onChildViewDetachedFromWindow(android.view.View);
-  }
-
-  public static abstract interface RecyclerView.OnItemTouchListener {
-    method public abstract boolean onInterceptTouchEvent(android.support.v7.widget.RecyclerView, android.view.MotionEvent);
-    method public abstract void onRequestDisallowInterceptTouchEvent(boolean);
-    method public abstract void onTouchEvent(android.support.v7.widget.RecyclerView, android.view.MotionEvent);
-  }
-
-  public static abstract class RecyclerView.OnScrollListener {
-    ctor public RecyclerView.OnScrollListener();
-    method public void onScrollStateChanged(android.support.v7.widget.RecyclerView, int);
-    method public void onScrolled(android.support.v7.widget.RecyclerView, int, int);
-  }
-
-  public static class RecyclerView.RecycledViewPool {
-    ctor public RecyclerView.RecycledViewPool();
-    method public void clear();
-    method public android.support.v7.widget.RecyclerView.ViewHolder getRecycledView(int);
-    method public void putRecycledView(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void setMaxRecycledViews(int, int);
-  }
-
-  public final class RecyclerView.Recycler {
-    ctor public RecyclerView.Recycler();
-    method public void bindViewToPosition(android.view.View, int);
-    method public void clear();
-    method public int convertPreLayoutPositionToPostLayout(int);
-    method public java.util.List<android.support.v7.widget.RecyclerView.ViewHolder> getScrapList();
-    method public android.view.View getViewForPosition(int);
-    method public void recycleView(android.view.View);
-    method public void setViewCacheSize(int);
-  }
-
-  public static abstract interface RecyclerView.RecyclerListener {
-    method public abstract void onViewRecycled(android.support.v7.widget.RecyclerView.ViewHolder);
-  }
-
-  public static class RecyclerView.SimpleOnItemTouchListener implements android.support.v7.widget.RecyclerView.OnItemTouchListener {
-    ctor public RecyclerView.SimpleOnItemTouchListener();
-    method public boolean onInterceptTouchEvent(android.support.v7.widget.RecyclerView, android.view.MotionEvent);
-    method public void onRequestDisallowInterceptTouchEvent(boolean);
-    method public void onTouchEvent(android.support.v7.widget.RecyclerView, android.view.MotionEvent);
-  }
-
-  public static abstract class RecyclerView.SmoothScroller {
-    ctor public RecyclerView.SmoothScroller();
-    method public android.view.View findViewByPosition(int);
-    method public int getChildCount();
-    method public int getChildPosition(android.view.View);
-    method public android.support.v7.widget.RecyclerView.LayoutManager getLayoutManager();
-    method public int getTargetPosition();
-    method public deprecated void instantScrollToPosition(int);
-    method public boolean isPendingInitialRun();
-    method public boolean isRunning();
-    method protected void normalize(android.graphics.PointF);
-    method protected void onChildAttachedToWindow(android.view.View);
-    method protected abstract void onSeekTargetStep(int, int, android.support.v7.widget.RecyclerView.State, android.support.v7.widget.RecyclerView.SmoothScroller.Action);
-    method protected abstract void onStart();
-    method protected abstract void onStop();
-    method protected abstract void onTargetFound(android.view.View, android.support.v7.widget.RecyclerView.State, android.support.v7.widget.RecyclerView.SmoothScroller.Action);
-    method public void setTargetPosition(int);
-    method protected final void stop();
-  }
-
-  public static class RecyclerView.SmoothScroller.Action {
-    ctor public RecyclerView.SmoothScroller.Action(int, int);
-    ctor public RecyclerView.SmoothScroller.Action(int, int, int);
-    ctor public RecyclerView.SmoothScroller.Action(int, int, int, android.view.animation.Interpolator);
-    method public int getDuration();
-    method public int getDx();
-    method public int getDy();
-    method public android.view.animation.Interpolator getInterpolator();
-    method public void jumpTo(int);
-    method public void setDuration(int);
-    method public void setDx(int);
-    method public void setDy(int);
-    method public void setInterpolator(android.view.animation.Interpolator);
-    method public void update(int, int, int, android.view.animation.Interpolator);
-    field public static final int UNDEFINED_DURATION = -2147483648; // 0x80000000
-  }
-
-  public static class RecyclerView.State {
-    ctor public RecyclerView.State();
-    method public boolean didStructureChange();
-    method public T get(int);
-    method public int getItemCount();
-    method public int getTargetScrollPosition();
-    method public boolean hasTargetScrollPosition();
-    method public boolean isPreLayout();
-    method public void onViewIgnored(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void put(int, java.lang.Object);
-    method public void remove(int);
-    method public boolean willRunPredictiveAnimations();
-    method public boolean willRunSimpleAnimations();
-  }
-
-  public static abstract class RecyclerView.ViewCacheExtension {
-    ctor public RecyclerView.ViewCacheExtension();
-    method public abstract android.view.View getViewForPositionAndType(android.support.v7.widget.RecyclerView.Recycler, int, int);
-  }
-
-  public static abstract class RecyclerView.ViewHolder {
-    ctor public RecyclerView.ViewHolder(android.view.View);
-    method public final int getAdapterPosition();
-    method public final long getItemId();
-    method public final int getItemViewType();
-    method public final int getLayoutPosition();
-    method public final int getOldPosition();
-    method public final deprecated int getPosition();
-    method public final boolean isRecyclable();
-    method public final void setIsRecyclable(boolean);
-    field public final android.view.View itemView;
-  }
-
-  public class RecyclerViewAccessibilityDelegate extends android.support.v4.view.AccessibilityDelegateCompat {
-    ctor public RecyclerViewAccessibilityDelegate(android.support.v7.widget.RecyclerView);
-  }
-
-  public class StaggeredGridLayoutManager extends android.support.v7.widget.RecyclerView.LayoutManager {
-    ctor public StaggeredGridLayoutManager(android.content.Context, android.util.AttributeSet, int, int);
-    ctor public StaggeredGridLayoutManager(int, int);
-    method public int[] findFirstCompletelyVisibleItemPositions(int[]);
-    method public int[] findFirstVisibleItemPositions(int[]);
-    method public int[] findLastCompletelyVisibleItemPositions(int[]);
-    method public int[] findLastVisibleItemPositions(int[]);
-    method public android.support.v7.widget.RecyclerView.LayoutParams generateDefaultLayoutParams();
-    method public int getGapStrategy();
-    method public int getOrientation();
-    method public boolean getReverseLayout();
-    method public int getSpanCount();
-    method public void invalidateSpanAssignments();
-    method public void scrollToPositionWithOffset(int, int);
-    method public void setGapStrategy(int);
-    method public void setOrientation(int);
-    method public void setReverseLayout(boolean);
-    method public void setSpanCount(int);
-    field public static final deprecated int GAP_HANDLING_LAZY = 1; // 0x1
-    field public static final int GAP_HANDLING_MOVE_ITEMS_BETWEEN_SPANS = 2; // 0x2
-    field public static final int GAP_HANDLING_NONE = 0; // 0x0
-    field public static final int HORIZONTAL = 0; // 0x0
-    field public static final java.lang.String TAG = "StaggeredGridLayoutManager";
-    field public static final int VERTICAL = 1; // 0x1
-  }
-
-  public static class StaggeredGridLayoutManager.LayoutParams extends android.support.v7.widget.RecyclerView.LayoutParams {
-    ctor public StaggeredGridLayoutManager.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public StaggeredGridLayoutManager.LayoutParams(int, int);
-    ctor public StaggeredGridLayoutManager.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public StaggeredGridLayoutManager.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public StaggeredGridLayoutManager.LayoutParams(android.support.v7.widget.RecyclerView.LayoutParams);
-    method public final int getSpanIndex();
-    method public boolean isFullSpan();
-    method public void setFullSpan(boolean);
-    field public static final int INVALID_SPAN_ID = -1; // 0xffffffff
-  }
-
-}
-
-package android.support.v7.widget.helper {
-
-  public class ItemTouchHelper extends android.support.v7.widget.RecyclerView.ItemDecoration implements android.support.v7.widget.RecyclerView.OnChildAttachStateChangeListener {
-    ctor public ItemTouchHelper(android.support.v7.widget.helper.ItemTouchHelper.Callback);
-    method public void attachToRecyclerView(android.support.v7.widget.RecyclerView);
-    method public void onChildViewAttachedToWindow(android.view.View);
-    method public void onChildViewDetachedFromWindow(android.view.View);
-    method public void startDrag(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void startSwipe(android.support.v7.widget.RecyclerView.ViewHolder);
-    field public static final int ACTION_STATE_DRAG = 2; // 0x2
-    field public static final int ACTION_STATE_IDLE = 0; // 0x0
-    field public static final int ACTION_STATE_SWIPE = 1; // 0x1
-    field public static final int ANIMATION_TYPE_DRAG = 8; // 0x8
-    field public static final int ANIMATION_TYPE_SWIPE_CANCEL = 4; // 0x4
-    field public static final int ANIMATION_TYPE_SWIPE_SUCCESS = 2; // 0x2
-    field public static final int DOWN = 2; // 0x2
-    field public static final int END = 32; // 0x20
-    field public static final int LEFT = 4; // 0x4
-    field public static final int RIGHT = 8; // 0x8
-    field public static final int START = 16; // 0x10
-    field public static final int UP = 1; // 0x1
-  }
-
-  public static abstract class ItemTouchHelper.Callback {
-    ctor public ItemTouchHelper.Callback();
-    method public boolean canDropOver(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ViewHolder);
-    method public android.support.v7.widget.RecyclerView.ViewHolder chooseDropTarget(android.support.v7.widget.RecyclerView.ViewHolder, java.util.List<android.support.v7.widget.RecyclerView.ViewHolder>, int, int);
-    method public void clearView(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder);
-    method public int convertToAbsoluteDirection(int, int);
-    method public static int convertToRelativeDirection(int, int);
-    method public long getAnimationDuration(android.support.v7.widget.RecyclerView, int, float, float);
-    method public int getBoundingBoxMargin();
-    method public static android.support.v7.widget.helper.ItemTouchUIUtil getDefaultUIUtil();
-    method public float getMoveThreshold(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public abstract int getMovementFlags(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder);
-    method public float getSwipeThreshold(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public int interpolateOutOfBoundsScroll(android.support.v7.widget.RecyclerView, int, int, int, long);
-    method public boolean isItemViewSwipeEnabled();
-    method public boolean isLongPressDragEnabled();
-    method public static int makeFlag(int, int);
-    method public static int makeMovementFlags(int, int);
-    method public void onChildDraw(android.graphics.Canvas, android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder, float, float, int, boolean);
-    method public void onChildDrawOver(android.graphics.Canvas, android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder, float, float, int, boolean);
-    method public abstract boolean onMove(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void onMoved(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder, int, android.support.v7.widget.RecyclerView.ViewHolder, int, int, int);
-    method public void onSelectedChanged(android.support.v7.widget.RecyclerView.ViewHolder, int);
-    method public abstract void onSwiped(android.support.v7.widget.RecyclerView.ViewHolder, int);
-    field public static final int DEFAULT_DRAG_ANIMATION_DURATION = 200; // 0xc8
-    field public static final int DEFAULT_SWIPE_ANIMATION_DURATION = 250; // 0xfa
-  }
-
-  public static abstract class ItemTouchHelper.SimpleCallback extends android.support.v7.widget.helper.ItemTouchHelper.Callback {
-    ctor public ItemTouchHelper.SimpleCallback(int, int);
-    method public int getDragDirs(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder);
-    method public int getMovementFlags(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder);
-    method public int getSwipeDirs(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void setDefaultDragDirs(int);
-    method public void setDefaultSwipeDirs(int);
-  }
-
-  public static abstract interface ItemTouchHelper.ViewDropHandler {
-    method public abstract void prepareForDrop(android.view.View, android.view.View, int, int);
-  }
-
-  public abstract interface ItemTouchUIUtil {
-    method public abstract void clearView(android.view.View);
-    method public abstract void onDraw(android.graphics.Canvas, android.support.v7.widget.RecyclerView, android.view.View, float, float, int, boolean);
-    method public abstract void onDrawOver(android.graphics.Canvas, android.support.v7.widget.RecyclerView, android.view.View, float, float, int, boolean);
-    method public abstract void onSelected(android.view.View);
-  }
-
-}
-
-package android.support.v7.widget.util {
-
-  public abstract class SortedListAdapterCallback extends android.support.v7.util.SortedList.Callback {
-    ctor public SortedListAdapterCallback(android.support.v7.widget.RecyclerView.Adapter);
-    method public void onChanged(int, int);
-    method public void onInserted(int, int);
-    method public void onMoved(int, int);
-    method public void onRemoved(int, int);
-  }
-
-}
-
diff --git a/v7/recyclerview/api/23.1.0.txt b/v7/recyclerview/api/23.1.0.txt
deleted file mode 100644
index 1f91036..0000000
--- a/v7/recyclerview/api/23.1.0.txt
+++ /dev/null
@@ -1,864 +0,0 @@
-package android.support.v7.recyclerview {
-
-  public final class R {
-    ctor public R();
-  }
-
-  public static final class R.attr {
-    ctor public R.attr();
-    field public static int layoutManager;
-    field public static int reverseLayout;
-    field public static int spanCount;
-    field public static int stackFromEnd;
-  }
-
-  public static final class R.dimen {
-    ctor public R.dimen();
-    field public static int item_touch_helper_max_drag_scroll_per_frame;
-  }
-
-  public static final class R.id {
-    ctor public R.id();
-    field public static int item_touch_helper_previous_elevation;
-  }
-
-  public static final class R.styleable {
-    ctor public R.styleable();
-    field public static final int[] RecyclerView;
-    field public static int RecyclerView_android_orientation;
-    field public static int RecyclerView_layoutManager;
-    field public static int RecyclerView_reverseLayout;
-    field public static int RecyclerView_spanCount;
-    field public static int RecyclerView_stackFromEnd;
-  }
-
-}
-
-package android.support.v7.util {
-
-  public class AsyncListUtil {
-    ctor public AsyncListUtil(java.lang.Class<T>, int, android.support.v7.util.AsyncListUtil.DataCallback<T>, android.support.v7.util.AsyncListUtil.ViewCallback);
-    method public T getItem(int);
-    method public int getItemCount();
-    method public void onRangeChanged();
-    method public void refresh();
-  }
-
-  public static abstract class AsyncListUtil.DataCallback {
-    ctor public AsyncListUtil.DataCallback();
-    method public abstract void fillData(T[], int, int);
-    method public int getMaxCachedTiles();
-    method public void recycleData(T[], int);
-    method public abstract int refreshData();
-  }
-
-  public static abstract class AsyncListUtil.ViewCallback {
-    ctor public AsyncListUtil.ViewCallback();
-    method public void extendRangeInto(int[], int[], int);
-    method public abstract void getItemRangeInto(int[]);
-    method public abstract void onDataRefresh();
-    method public abstract void onItemLoaded(int);
-    field public static final int HINT_SCROLL_ASC = 2; // 0x2
-    field public static final int HINT_SCROLL_DESC = 1; // 0x1
-    field public static final int HINT_SCROLL_NONE = 0; // 0x0
-  }
-
-  public class SortedList {
-    ctor public SortedList(java.lang.Class<T>, android.support.v7.util.SortedList.Callback<T>);
-    ctor public SortedList(java.lang.Class<T>, android.support.v7.util.SortedList.Callback<T>, int);
-    method public int add(T);
-    method public void addAll(T[], boolean);
-    method public void addAll(T...);
-    method public void addAll(java.util.Collection<T>);
-    method public void beginBatchedUpdates();
-    method public void clear();
-    method public void endBatchedUpdates();
-    method public T get(int) throws java.lang.IndexOutOfBoundsException;
-    method public int indexOf(T);
-    method public void recalculatePositionOfItemAt(int);
-    method public boolean remove(T);
-    method public T removeItemAt(int);
-    method public int size();
-    method public void updateItemAt(int, T);
-    field public static final int INVALID_POSITION = -1; // 0xffffffff
-  }
-
-  public static class SortedList.BatchedCallback extends android.support.v7.util.SortedList.Callback {
-    ctor public SortedList.BatchedCallback(android.support.v7.util.SortedList.Callback<T2>);
-    method public boolean areContentsTheSame(T2, T2);
-    method public boolean areItemsTheSame(T2, T2);
-    method public int compare(T2, T2);
-    method public void dispatchLastEvent();
-    method public void onChanged(int, int);
-    method public void onInserted(int, int);
-    method public void onMoved(int, int);
-    method public void onRemoved(int, int);
-  }
-
-  public static abstract class SortedList.Callback implements java.util.Comparator {
-    ctor public SortedList.Callback();
-    method public abstract boolean areContentsTheSame(T2, T2);
-    method public abstract boolean areItemsTheSame(T2, T2);
-    method public abstract int compare(T2, T2);
-    method public abstract void onChanged(int, int);
-    method public abstract void onInserted(int, int);
-    method public abstract void onMoved(int, int);
-    method public abstract void onRemoved(int, int);
-  }
-
-}
-
-package android.support.v7.widget {
-
-  public class DefaultItemAnimator extends android.support.v7.widget.SimpleItemAnimator {
-    ctor public DefaultItemAnimator();
-    method public boolean animateAdd(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public boolean animateChange(android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ViewHolder, int, int, int, int);
-    method public boolean animateMove(android.support.v7.widget.RecyclerView.ViewHolder, int, int, int, int);
-    method public boolean animateRemove(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void endAnimation(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void endAnimations();
-    method public boolean isRunning();
-    method public void runPendingAnimations();
-  }
-
-  public class GridLayoutManager extends android.support.v7.widget.LinearLayoutManager {
-    ctor public GridLayoutManager(android.content.Context, android.util.AttributeSet, int, int);
-    ctor public GridLayoutManager(android.content.Context, int);
-    ctor public GridLayoutManager(android.content.Context, int, int, boolean);
-    method public int getSpanCount();
-    method public android.support.v7.widget.GridLayoutManager.SpanSizeLookup getSpanSizeLookup();
-    method public void setSpanCount(int);
-    method public void setSpanSizeLookup(android.support.v7.widget.GridLayoutManager.SpanSizeLookup);
-    field public static final int DEFAULT_SPAN_COUNT = -1; // 0xffffffff
-  }
-
-  public static final class GridLayoutManager.DefaultSpanSizeLookup extends android.support.v7.widget.GridLayoutManager.SpanSizeLookup {
-    ctor public GridLayoutManager.DefaultSpanSizeLookup();
-    method public int getSpanSize(int);
-  }
-
-  public static class GridLayoutManager.LayoutParams extends android.support.v7.widget.RecyclerView.LayoutParams {
-    ctor public GridLayoutManager.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public GridLayoutManager.LayoutParams(int, int);
-    ctor public GridLayoutManager.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public GridLayoutManager.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public GridLayoutManager.LayoutParams(android.support.v7.widget.RecyclerView.LayoutParams);
-    method public int getSpanIndex();
-    method public int getSpanSize();
-    field public static final int INVALID_SPAN_ID = -1; // 0xffffffff
-  }
-
-  public static abstract class GridLayoutManager.SpanSizeLookup {
-    ctor public GridLayoutManager.SpanSizeLookup();
-    method public int getSpanGroupIndex(int, int);
-    method public int getSpanIndex(int, int);
-    method public abstract int getSpanSize(int);
-    method public void invalidateSpanIndexCache();
-    method public boolean isSpanIndexCacheEnabled();
-    method public void setSpanIndexCacheEnabled(boolean);
-  }
-
-  public class LinearLayoutManager extends android.support.v7.widget.RecyclerView.LayoutManager implements android.support.v7.widget.helper.ItemTouchHelper.ViewDropHandler {
-    ctor public LinearLayoutManager(android.content.Context);
-    ctor public LinearLayoutManager(android.content.Context, int, boolean);
-    ctor public LinearLayoutManager(android.content.Context, android.util.AttributeSet, int, int);
-    method public android.graphics.PointF computeScrollVectorForPosition(int);
-    method public int findFirstCompletelyVisibleItemPosition();
-    method public int findFirstVisibleItemPosition();
-    method public int findLastCompletelyVisibleItemPosition();
-    method public int findLastVisibleItemPosition();
-    method public android.support.v7.widget.RecyclerView.LayoutParams generateDefaultLayoutParams();
-    method protected int getExtraLayoutSpace(android.support.v7.widget.RecyclerView.State);
-    method public int getOrientation();
-    method public boolean getRecycleChildrenOnDetach();
-    method public boolean getReverseLayout();
-    method public boolean getStackFromEnd();
-    method protected boolean isLayoutRTL();
-    method public boolean isSmoothScrollbarEnabled();
-    method public void prepareForDrop(android.view.View, android.view.View, int, int);
-    method public void scrollToPositionWithOffset(int, int);
-    method public void setOrientation(int);
-    method public void setRecycleChildrenOnDetach(boolean);
-    method public void setReverseLayout(boolean);
-    method public void setSmoothScrollbarEnabled(boolean);
-    method public void setStackFromEnd(boolean);
-    field public static final int HORIZONTAL = 0; // 0x0
-    field public static final int INVALID_OFFSET = -2147483648; // 0x80000000
-    field public static final int VERTICAL = 1; // 0x1
-  }
-
-  protected static class LinearLayoutManager.LayoutChunkResult {
-    ctor protected LinearLayoutManager.LayoutChunkResult();
-    field public int mConsumed;
-    field public boolean mFinished;
-    field public boolean mFocusable;
-    field public boolean mIgnoreConsumed;
-  }
-
-  public abstract class LinearSmoothScroller extends android.support.v7.widget.RecyclerView.SmoothScroller {
-    ctor public LinearSmoothScroller(android.content.Context);
-    method public int calculateDtToFit(int, int, int, int, int);
-    method public int calculateDxToMakeVisible(android.view.View, int);
-    method public int calculateDyToMakeVisible(android.view.View, int);
-    method protected float calculateSpeedPerPixel(android.util.DisplayMetrics);
-    method protected int calculateTimeForDeceleration(int);
-    method protected int calculateTimeForScrolling(int);
-    method public abstract android.graphics.PointF computeScrollVectorForPosition(int);
-    method protected int getHorizontalSnapPreference();
-    method protected int getVerticalSnapPreference();
-    method protected void onSeekTargetStep(int, int, android.support.v7.widget.RecyclerView.State, android.support.v7.widget.RecyclerView.SmoothScroller.Action);
-    method protected void onStart();
-    method protected void onStop();
-    method protected void onTargetFound(android.view.View, android.support.v7.widget.RecyclerView.State, android.support.v7.widget.RecyclerView.SmoothScroller.Action);
-    method protected void updateActionForInterimTarget(android.support.v7.widget.RecyclerView.SmoothScroller.Action);
-    field public static final int SNAP_TO_ANY = 0; // 0x0
-    field public static final int SNAP_TO_END = 1; // 0x1
-    field public static final int SNAP_TO_START = -1; // 0xffffffff
-    field protected final android.view.animation.DecelerateInterpolator mDecelerateInterpolator;
-    field protected int mInterimTargetDx;
-    field protected int mInterimTargetDy;
-    field protected final android.view.animation.LinearInterpolator mLinearInterpolator;
-    field protected android.graphics.PointF mTargetVector;
-  }
-
-  public abstract class OrientationHelper {
-    method public static android.support.v7.widget.OrientationHelper createHorizontalHelper(android.support.v7.widget.RecyclerView.LayoutManager);
-    method public static android.support.v7.widget.OrientationHelper createOrientationHelper(android.support.v7.widget.RecyclerView.LayoutManager, int);
-    method public static android.support.v7.widget.OrientationHelper createVerticalHelper(android.support.v7.widget.RecyclerView.LayoutManager);
-    method public abstract int getDecoratedEnd(android.view.View);
-    method public abstract int getDecoratedMeasurement(android.view.View);
-    method public abstract int getDecoratedMeasurementInOther(android.view.View);
-    method public abstract int getDecoratedStart(android.view.View);
-    method public abstract int getEnd();
-    method public abstract int getEndAfterPadding();
-    method public abstract int getEndPadding();
-    method public abstract int getStartAfterPadding();
-    method public abstract int getTotalSpace();
-    method public int getTotalSpaceChange();
-    method public abstract void offsetChild(android.view.View, int);
-    method public abstract void offsetChildren(int);
-    method public void onLayoutComplete();
-    field public static final int HORIZONTAL = 0; // 0x0
-    field public static final int VERTICAL = 1; // 0x1
-    field protected final android.support.v7.widget.RecyclerView.LayoutManager mLayoutManager;
-  }
-
-  public class RecyclerView extends android.view.ViewGroup {
-    ctor public RecyclerView(android.content.Context);
-    ctor public RecyclerView(android.content.Context, android.util.AttributeSet);
-    ctor public RecyclerView(android.content.Context, android.util.AttributeSet, int);
-    method public void addItemDecoration(android.support.v7.widget.RecyclerView.ItemDecoration, int);
-    method public void addItemDecoration(android.support.v7.widget.RecyclerView.ItemDecoration);
-    method public void addOnChildAttachStateChangeListener(android.support.v7.widget.RecyclerView.OnChildAttachStateChangeListener);
-    method public void addOnItemTouchListener(android.support.v7.widget.RecyclerView.OnItemTouchListener);
-    method public void addOnScrollListener(android.support.v7.widget.RecyclerView.OnScrollListener);
-    method public void clearOnChildAttachStateChangeListeners();
-    method public void clearOnScrollListeners();
-    method public int computeHorizontalScrollExtent();
-    method public int computeHorizontalScrollOffset();
-    method public int computeHorizontalScrollRange();
-    method public int computeVerticalScrollExtent();
-    method public int computeVerticalScrollOffset();
-    method public int computeVerticalScrollRange();
-    method public boolean drawChild(android.graphics.Canvas, android.view.View, long);
-    method public android.view.View findChildViewUnder(float, float);
-    method public android.support.v7.widget.RecyclerView.ViewHolder findViewHolderForAdapterPosition(int);
-    method public android.support.v7.widget.RecyclerView.ViewHolder findViewHolderForItemId(long);
-    method public android.support.v7.widget.RecyclerView.ViewHolder findViewHolderForLayoutPosition(int);
-    method public deprecated android.support.v7.widget.RecyclerView.ViewHolder findViewHolderForPosition(int);
-    method public boolean fling(int, int);
-    method public android.support.v7.widget.RecyclerView.Adapter getAdapter();
-    method public int getChildAdapterPosition(android.view.View);
-    method public long getChildItemId(android.view.View);
-    method public int getChildLayoutPosition(android.view.View);
-    method public deprecated int getChildPosition(android.view.View);
-    method public android.support.v7.widget.RecyclerView.ViewHolder getChildViewHolder(android.view.View);
-    method public android.support.v7.widget.RecyclerViewAccessibilityDelegate getCompatAccessibilityDelegate();
-    method public android.support.v7.widget.RecyclerView.ItemAnimator getItemAnimator();
-    method public android.support.v7.widget.RecyclerView.LayoutManager getLayoutManager();
-    method public int getMaxFlingVelocity();
-    method public int getMinFlingVelocity();
-    method public android.support.v7.widget.RecyclerView.RecycledViewPool getRecycledViewPool();
-    method public int getScrollState();
-    method public boolean hasFixedSize();
-    method public boolean hasPendingAdapterUpdates();
-    method public void invalidateItemDecorations();
-    method public boolean isAnimating();
-    method public boolean isComputingLayout();
-    method public boolean isLayoutFrozen();
-    method public void offsetChildrenHorizontal(int);
-    method public void offsetChildrenVertical(int);
-    method public void onChildAttachedToWindow(android.view.View);
-    method public void onChildDetachedFromWindow(android.view.View);
-    method public void onDraw(android.graphics.Canvas);
-    method protected void onLayout(boolean, int, int, int, int);
-    method public void onScrollStateChanged(int);
-    method public void onScrolled(int, int);
-    method public void removeItemDecoration(android.support.v7.widget.RecyclerView.ItemDecoration);
-    method public void removeOnChildAttachStateChangeListener(android.support.v7.widget.RecyclerView.OnChildAttachStateChangeListener);
-    method public void removeOnItemTouchListener(android.support.v7.widget.RecyclerView.OnItemTouchListener);
-    method public void removeOnScrollListener(android.support.v7.widget.RecyclerView.OnScrollListener);
-    method public void scrollToPosition(int);
-    method public void setAccessibilityDelegateCompat(android.support.v7.widget.RecyclerViewAccessibilityDelegate);
-    method public void setAdapter(android.support.v7.widget.RecyclerView.Adapter);
-    method public void setChildDrawingOrderCallback(android.support.v7.widget.RecyclerView.ChildDrawingOrderCallback);
-    method public void setHasFixedSize(boolean);
-    method public void setItemAnimator(android.support.v7.widget.RecyclerView.ItemAnimator);
-    method public void setItemViewCacheSize(int);
-    method public void setLayoutFrozen(boolean);
-    method public void setLayoutManager(android.support.v7.widget.RecyclerView.LayoutManager);
-    method public deprecated void setOnScrollListener(android.support.v7.widget.RecyclerView.OnScrollListener);
-    method public void setRecycledViewPool(android.support.v7.widget.RecyclerView.RecycledViewPool);
-    method public void setRecyclerListener(android.support.v7.widget.RecyclerView.RecyclerListener);
-    method public void setScrollingTouchSlop(int);
-    method public void setViewCacheExtension(android.support.v7.widget.RecyclerView.ViewCacheExtension);
-    method public void smoothScrollBy(int, int);
-    method public void smoothScrollToPosition(int);
-    method public void stopScroll();
-    method public void swapAdapter(android.support.v7.widget.RecyclerView.Adapter, boolean);
-    field public static final int HORIZONTAL = 0; // 0x0
-    field public static final int INVALID_TYPE = -1; // 0xffffffff
-    field public static final long NO_ID = -1L; // 0xffffffffffffffffL
-    field public static final int NO_POSITION = -1; // 0xffffffff
-    field public static final int SCROLL_STATE_DRAGGING = 1; // 0x1
-    field public static final int SCROLL_STATE_IDLE = 0; // 0x0
-    field public static final int SCROLL_STATE_SETTLING = 2; // 0x2
-    field public static final int TOUCH_SLOP_DEFAULT = 0; // 0x0
-    field public static final int TOUCH_SLOP_PAGING = 1; // 0x1
-    field public static final int VERTICAL = 1; // 0x1
-  }
-
-  public static abstract class RecyclerView.Adapter {
-    ctor public RecyclerView.Adapter();
-    method public final void bindViewHolder(VH, int);
-    method public final VH createViewHolder(android.view.ViewGroup, int);
-    method public abstract int getItemCount();
-    method public long getItemId(int);
-    method public int getItemViewType(int);
-    method public final boolean hasObservers();
-    method public final boolean hasStableIds();
-    method public final void notifyDataSetChanged();
-    method public final void notifyItemChanged(int);
-    method public final void notifyItemChanged(int, java.lang.Object);
-    method public final void notifyItemInserted(int);
-    method public final void notifyItemMoved(int, int);
-    method public final void notifyItemRangeChanged(int, int);
-    method public final void notifyItemRangeChanged(int, int, java.lang.Object);
-    method public final void notifyItemRangeInserted(int, int);
-    method public final void notifyItemRangeRemoved(int, int);
-    method public final void notifyItemRemoved(int);
-    method public void onAttachedToRecyclerView(android.support.v7.widget.RecyclerView);
-    method public abstract void onBindViewHolder(VH, int);
-    method public void onBindViewHolder(VH, int, java.util.List<java.lang.Object>);
-    method public abstract VH onCreateViewHolder(android.view.ViewGroup, int);
-    method public void onDetachedFromRecyclerView(android.support.v7.widget.RecyclerView);
-    method public boolean onFailedToRecycleView(VH);
-    method public void onViewAttachedToWindow(VH);
-    method public void onViewDetachedFromWindow(VH);
-    method public void onViewRecycled(VH);
-    method public void registerAdapterDataObserver(android.support.v7.widget.RecyclerView.AdapterDataObserver);
-    method public void setHasStableIds(boolean);
-    method public void unregisterAdapterDataObserver(android.support.v7.widget.RecyclerView.AdapterDataObserver);
-  }
-
-  public static abstract class RecyclerView.AdapterDataObserver {
-    ctor public RecyclerView.AdapterDataObserver();
-    method public void onChanged();
-    method public void onItemRangeChanged(int, int);
-    method public void onItemRangeChanged(int, int, java.lang.Object);
-    method public void onItemRangeInserted(int, int);
-    method public void onItemRangeMoved(int, int, int);
-    method public void onItemRangeRemoved(int, int);
-  }
-
-  public static abstract interface RecyclerView.ChildDrawingOrderCallback {
-    method public abstract int onGetChildDrawingOrder(int, int);
-  }
-
-  public static abstract class RecyclerView.ItemAnimator {
-    ctor public RecyclerView.ItemAnimator();
-    method public abstract boolean animateAppearance(android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
-    method public abstract boolean animateChange(android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
-    method public abstract boolean animateDisappearance(android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
-    method public abstract boolean animatePersistence(android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
-    method public boolean canReuseUpdatedViewHolder(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public final void dispatchAnimationFinished(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public final void dispatchAnimationStarted(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public final void dispatchAnimationsFinished();
-    method public abstract void endAnimation(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public abstract void endAnimations();
-    method public long getAddDuration();
-    method public long getChangeDuration();
-    method public long getMoveDuration();
-    method public long getRemoveDuration();
-    method public abstract boolean isRunning();
-    method public final boolean isRunning(android.support.v7.widget.RecyclerView.ItemAnimator.ItemAnimatorFinishedListener);
-    method public android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo obtainHolderInfo();
-    method public void onAnimationFinished(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void onAnimationStarted(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo recordPostLayoutInformation(android.support.v7.widget.RecyclerView.State, android.support.v7.widget.RecyclerView.ViewHolder);
-    method public android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo recordPreLayoutInformation(android.support.v7.widget.RecyclerView.State, android.support.v7.widget.RecyclerView.ViewHolder, int, java.util.List<java.lang.Object>);
-    method public abstract void runPendingAnimations();
-    method public void setAddDuration(long);
-    method public void setChangeDuration(long);
-    method public void setMoveDuration(long);
-    method public void setRemoveDuration(long);
-    field public static final int FLAG_APPEARED_IN_PRE_LAYOUT = 4096; // 0x1000
-    field public static final int FLAG_CHANGED = 2; // 0x2
-    field public static final int FLAG_INVALIDATED = 4; // 0x4
-    field public static final int FLAG_MOVED = 2048; // 0x800
-    field public static final int FLAG_REMOVED = 8; // 0x8
-  }
-
-  public static abstract class RecyclerView.ItemAnimator.AdapterChanges implements java.lang.annotation.Annotation {
-  }
-
-  public static abstract interface RecyclerView.ItemAnimator.ItemAnimatorFinishedListener {
-    method public abstract void onAnimationsFinished();
-  }
-
-  public static class RecyclerView.ItemAnimator.ItemHolderInfo {
-    ctor public RecyclerView.ItemAnimator.ItemHolderInfo();
-    method public android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo setFrom(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo setFrom(android.support.v7.widget.RecyclerView.ViewHolder, int);
-    field public int bottom;
-    field public int changeFlags;
-    field public int left;
-    field public int right;
-    field public int top;
-  }
-
-  public static abstract class RecyclerView.ItemDecoration {
-    ctor public RecyclerView.ItemDecoration();
-    method public deprecated void getItemOffsets(android.graphics.Rect, int, android.support.v7.widget.RecyclerView);
-    method public void getItemOffsets(android.graphics.Rect, android.view.View, android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.State);
-    method public void onDraw(android.graphics.Canvas, android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.State);
-    method public deprecated void onDraw(android.graphics.Canvas, android.support.v7.widget.RecyclerView);
-    method public void onDrawOver(android.graphics.Canvas, android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.State);
-    method public deprecated void onDrawOver(android.graphics.Canvas, android.support.v7.widget.RecyclerView);
-  }
-
-  public static abstract class RecyclerView.LayoutManager {
-    ctor public RecyclerView.LayoutManager();
-    method public void addDisappearingView(android.view.View);
-    method public void addDisappearingView(android.view.View, int);
-    method public void addView(android.view.View);
-    method public void addView(android.view.View, int);
-    method public void assertInLayoutOrScroll(java.lang.String);
-    method public void assertNotInLayoutOrScroll(java.lang.String);
-    method public void attachView(android.view.View, int, android.support.v7.widget.RecyclerView.LayoutParams);
-    method public void attachView(android.view.View, int);
-    method public void attachView(android.view.View);
-    method public void calculateItemDecorationsForChild(android.view.View, android.graphics.Rect);
-    method public boolean canScrollHorizontally();
-    method public boolean canScrollVertically();
-    method public boolean checkLayoutParams(android.support.v7.widget.RecyclerView.LayoutParams);
-    method public int computeHorizontalScrollExtent(android.support.v7.widget.RecyclerView.State);
-    method public int computeHorizontalScrollOffset(android.support.v7.widget.RecyclerView.State);
-    method public int computeHorizontalScrollRange(android.support.v7.widget.RecyclerView.State);
-    method public int computeVerticalScrollExtent(android.support.v7.widget.RecyclerView.State);
-    method public int computeVerticalScrollOffset(android.support.v7.widget.RecyclerView.State);
-    method public int computeVerticalScrollRange(android.support.v7.widget.RecyclerView.State);
-    method public void detachAndScrapAttachedViews(android.support.v7.widget.RecyclerView.Recycler);
-    method public void detachAndScrapView(android.view.View, android.support.v7.widget.RecyclerView.Recycler);
-    method public void detachAndScrapViewAt(int, android.support.v7.widget.RecyclerView.Recycler);
-    method public void detachView(android.view.View);
-    method public void detachViewAt(int);
-    method public void endAnimation(android.view.View);
-    method public android.view.View findViewByPosition(int);
-    method public abstract android.support.v7.widget.RecyclerView.LayoutParams generateDefaultLayoutParams();
-    method public android.support.v7.widget.RecyclerView.LayoutParams generateLayoutParams(android.view.ViewGroup.LayoutParams);
-    method public android.support.v7.widget.RecyclerView.LayoutParams generateLayoutParams(android.content.Context, android.util.AttributeSet);
-    method public int getBaseline();
-    method public int getBottomDecorationHeight(android.view.View);
-    method public android.view.View getChildAt(int);
-    method public int getChildCount();
-    method public static int getChildMeasureSpec(int, int, int, boolean);
-    method public boolean getClipToPadding();
-    method public int getColumnCountForAccessibility(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
-    method public int getDecoratedBottom(android.view.View);
-    method public int getDecoratedLeft(android.view.View);
-    method public int getDecoratedMeasuredHeight(android.view.View);
-    method public int getDecoratedMeasuredWidth(android.view.View);
-    method public int getDecoratedRight(android.view.View);
-    method public int getDecoratedTop(android.view.View);
-    method public android.view.View getFocusedChild();
-    method public int getHeight();
-    method public int getItemCount();
-    method public int getItemViewType(android.view.View);
-    method public int getLayoutDirection();
-    method public int getLeftDecorationWidth(android.view.View);
-    method public int getMinimumHeight();
-    method public int getMinimumWidth();
-    method public int getPaddingBottom();
-    method public int getPaddingEnd();
-    method public int getPaddingLeft();
-    method public int getPaddingRight();
-    method public int getPaddingStart();
-    method public int getPaddingTop();
-    method public int getPosition(android.view.View);
-    method public static android.support.v7.widget.RecyclerView.LayoutManager.Properties getProperties(android.content.Context, android.util.AttributeSet, int, int);
-    method public int getRightDecorationWidth(android.view.View);
-    method public int getRowCountForAccessibility(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
-    method public int getSelectionModeForAccessibility(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
-    method public int getTopDecorationHeight(android.view.View);
-    method public int getWidth();
-    method public boolean hasFocus();
-    method public void ignoreView(android.view.View);
-    method public boolean isAttachedToWindow();
-    method public boolean isFocused();
-    method public boolean isLayoutHierarchical(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
-    method public boolean isSmoothScrolling();
-    method public void layoutDecorated(android.view.View, int, int, int, int);
-    method public void measureChild(android.view.View, int, int);
-    method public void measureChildWithMargins(android.view.View, int, int);
-    method public void moveView(int, int);
-    method public void offsetChildrenHorizontal(int);
-    method public void offsetChildrenVertical(int);
-    method public void onAdapterChanged(android.support.v7.widget.RecyclerView.Adapter, android.support.v7.widget.RecyclerView.Adapter);
-    method public boolean onAddFocusables(android.support.v7.widget.RecyclerView, java.util.ArrayList<android.view.View>, int, int);
-    method public void onAttachedToWindow(android.support.v7.widget.RecyclerView);
-    method public deprecated void onDetachedFromWindow(android.support.v7.widget.RecyclerView);
-    method public void onDetachedFromWindow(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.Recycler);
-    method public android.view.View onFocusSearchFailed(android.view.View, int, android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
-    method public void onInitializeAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
-    method public void onInitializeAccessibilityEvent(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State, android.view.accessibility.AccessibilityEvent);
-    method public void onInitializeAccessibilityNodeInfo(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State, android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
-    method public void onInitializeAccessibilityNodeInfoForItem(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State, android.view.View, android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
-    method public android.view.View onInterceptFocusSearch(android.view.View, int);
-    method public void onItemsAdded(android.support.v7.widget.RecyclerView, int, int);
-    method public void onItemsChanged(android.support.v7.widget.RecyclerView);
-    method public void onItemsMoved(android.support.v7.widget.RecyclerView, int, int, int);
-    method public void onItemsRemoved(android.support.v7.widget.RecyclerView, int, int);
-    method public void onItemsUpdated(android.support.v7.widget.RecyclerView, int, int);
-    method public void onItemsUpdated(android.support.v7.widget.RecyclerView, int, int, java.lang.Object);
-    method public void onLayoutChildren(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
-    method public void onMeasure(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State, int, int);
-    method public deprecated boolean onRequestChildFocus(android.support.v7.widget.RecyclerView, android.view.View, android.view.View);
-    method public boolean onRequestChildFocus(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.State, android.view.View, android.view.View);
-    method public void onRestoreInstanceState(android.os.Parcelable);
-    method public android.os.Parcelable onSaveInstanceState();
-    method public void onScrollStateChanged(int);
-    method public boolean performAccessibilityAction(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State, int, android.os.Bundle);
-    method public boolean performAccessibilityActionForItem(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State, android.view.View, int, android.os.Bundle);
-    method public void postOnAnimation(java.lang.Runnable);
-    method public void removeAllViews();
-    method public void removeAndRecycleAllViews(android.support.v7.widget.RecyclerView.Recycler);
-    method public void removeAndRecycleView(android.view.View, android.support.v7.widget.RecyclerView.Recycler);
-    method public void removeAndRecycleViewAt(int, android.support.v7.widget.RecyclerView.Recycler);
-    method public boolean removeCallbacks(java.lang.Runnable);
-    method public void removeDetachedView(android.view.View);
-    method public void removeView(android.view.View);
-    method public void removeViewAt(int);
-    method public boolean requestChildRectangleOnScreen(android.support.v7.widget.RecyclerView, android.view.View, android.graphics.Rect, boolean);
-    method public void requestLayout();
-    method public void requestSimpleAnimationsInNextLayout();
-    method public int scrollHorizontallyBy(int, android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
-    method public void scrollToPosition(int);
-    method public int scrollVerticallyBy(int, android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
-    method public void setMeasuredDimension(int, int);
-    method public void smoothScrollToPosition(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.State, int);
-    method public void startSmoothScroll(android.support.v7.widget.RecyclerView.SmoothScroller);
-    method public void stopIgnoringView(android.view.View);
-    method public boolean supportsPredictiveItemAnimations();
-  }
-
-  public static class RecyclerView.LayoutManager.Properties {
-    ctor public RecyclerView.LayoutManager.Properties();
-    field public int orientation;
-    field public boolean reverseLayout;
-    field public int spanCount;
-    field public boolean stackFromEnd;
-  }
-
-  public static class RecyclerView.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
-    ctor public RecyclerView.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public RecyclerView.LayoutParams(int, int);
-    ctor public RecyclerView.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public RecyclerView.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public RecyclerView.LayoutParams(android.support.v7.widget.RecyclerView.LayoutParams);
-    method public int getViewAdapterPosition();
-    method public int getViewLayoutPosition();
-    method public deprecated int getViewPosition();
-    method public boolean isItemChanged();
-    method public boolean isItemRemoved();
-    method public boolean isViewInvalid();
-    method public boolean viewNeedsUpdate();
-  }
-
-  public static abstract interface RecyclerView.OnChildAttachStateChangeListener {
-    method public abstract void onChildViewAttachedToWindow(android.view.View);
-    method public abstract void onChildViewDetachedFromWindow(android.view.View);
-  }
-
-  public static abstract interface RecyclerView.OnItemTouchListener {
-    method public abstract boolean onInterceptTouchEvent(android.support.v7.widget.RecyclerView, android.view.MotionEvent);
-    method public abstract void onRequestDisallowInterceptTouchEvent(boolean);
-    method public abstract void onTouchEvent(android.support.v7.widget.RecyclerView, android.view.MotionEvent);
-  }
-
-  public static abstract class RecyclerView.OnScrollListener {
-    ctor public RecyclerView.OnScrollListener();
-    method public void onScrollStateChanged(android.support.v7.widget.RecyclerView, int);
-    method public void onScrolled(android.support.v7.widget.RecyclerView, int, int);
-  }
-
-  public static class RecyclerView.RecycledViewPool {
-    ctor public RecyclerView.RecycledViewPool();
-    method public void clear();
-    method public android.support.v7.widget.RecyclerView.ViewHolder getRecycledView(int);
-    method public void putRecycledView(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void setMaxRecycledViews(int, int);
-  }
-
-  public final class RecyclerView.Recycler {
-    ctor public RecyclerView.Recycler();
-    method public void bindViewToPosition(android.view.View, int);
-    method public void clear();
-    method public int convertPreLayoutPositionToPostLayout(int);
-    method public java.util.List<android.support.v7.widget.RecyclerView.ViewHolder> getScrapList();
-    method public android.view.View getViewForPosition(int);
-    method public void recycleView(android.view.View);
-    method public void setViewCacheSize(int);
-  }
-
-  public static abstract interface RecyclerView.RecyclerListener {
-    method public abstract void onViewRecycled(android.support.v7.widget.RecyclerView.ViewHolder);
-  }
-
-  public static class RecyclerView.SimpleOnItemTouchListener implements android.support.v7.widget.RecyclerView.OnItemTouchListener {
-    ctor public RecyclerView.SimpleOnItemTouchListener();
-    method public boolean onInterceptTouchEvent(android.support.v7.widget.RecyclerView, android.view.MotionEvent);
-    method public void onRequestDisallowInterceptTouchEvent(boolean);
-    method public void onTouchEvent(android.support.v7.widget.RecyclerView, android.view.MotionEvent);
-  }
-
-  public static abstract class RecyclerView.SmoothScroller {
-    ctor public RecyclerView.SmoothScroller();
-    method public android.view.View findViewByPosition(int);
-    method public int getChildCount();
-    method public int getChildPosition(android.view.View);
-    method public android.support.v7.widget.RecyclerView.LayoutManager getLayoutManager();
-    method public int getTargetPosition();
-    method public deprecated void instantScrollToPosition(int);
-    method public boolean isPendingInitialRun();
-    method public boolean isRunning();
-    method protected void normalize(android.graphics.PointF);
-    method protected void onChildAttachedToWindow(android.view.View);
-    method protected abstract void onSeekTargetStep(int, int, android.support.v7.widget.RecyclerView.State, android.support.v7.widget.RecyclerView.SmoothScroller.Action);
-    method protected abstract void onStart();
-    method protected abstract void onStop();
-    method protected abstract void onTargetFound(android.view.View, android.support.v7.widget.RecyclerView.State, android.support.v7.widget.RecyclerView.SmoothScroller.Action);
-    method public void setTargetPosition(int);
-    method protected final void stop();
-  }
-
-  public static class RecyclerView.SmoothScroller.Action {
-    ctor public RecyclerView.SmoothScroller.Action(int, int);
-    ctor public RecyclerView.SmoothScroller.Action(int, int, int);
-    ctor public RecyclerView.SmoothScroller.Action(int, int, int, android.view.animation.Interpolator);
-    method public int getDuration();
-    method public int getDx();
-    method public int getDy();
-    method public android.view.animation.Interpolator getInterpolator();
-    method public void jumpTo(int);
-    method public void setDuration(int);
-    method public void setDx(int);
-    method public void setDy(int);
-    method public void setInterpolator(android.view.animation.Interpolator);
-    method public void update(int, int, int, android.view.animation.Interpolator);
-    field public static final int UNDEFINED_DURATION = -2147483648; // 0x80000000
-  }
-
-  public static class RecyclerView.State {
-    ctor public RecyclerView.State();
-    method public boolean didStructureChange();
-    method public T get(int);
-    method public int getItemCount();
-    method public int getTargetScrollPosition();
-    method public boolean hasTargetScrollPosition();
-    method public boolean isPreLayout();
-    method public void put(int, java.lang.Object);
-    method public void remove(int);
-    method public boolean willRunPredictiveAnimations();
-    method public boolean willRunSimpleAnimations();
-  }
-
-  public static abstract class RecyclerView.ViewCacheExtension {
-    ctor public RecyclerView.ViewCacheExtension();
-    method public abstract android.view.View getViewForPositionAndType(android.support.v7.widget.RecyclerView.Recycler, int, int);
-  }
-
-  public static abstract class RecyclerView.ViewHolder {
-    ctor public RecyclerView.ViewHolder(android.view.View);
-    method public final int getAdapterPosition();
-    method public final long getItemId();
-    method public final int getItemViewType();
-    method public final int getLayoutPosition();
-    method public final int getOldPosition();
-    method public final deprecated int getPosition();
-    method public final boolean isRecyclable();
-    method public final void setIsRecyclable(boolean);
-    field public final android.view.View itemView;
-  }
-
-  public class RecyclerViewAccessibilityDelegate extends android.support.v4.view.AccessibilityDelegateCompat {
-    ctor public RecyclerViewAccessibilityDelegate(android.support.v7.widget.RecyclerView);
-  }
-
-  public abstract class SimpleItemAnimator extends android.support.v7.widget.RecyclerView.ItemAnimator {
-    ctor public SimpleItemAnimator();
-    method public abstract boolean animateAdd(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public boolean animateAppearance(android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
-    method public boolean animateChange(android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
-    method public abstract boolean animateChange(android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ViewHolder, int, int, int, int);
-    method public boolean animateDisappearance(android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
-    method public abstract boolean animateMove(android.support.v7.widget.RecyclerView.ViewHolder, int, int, int, int);
-    method public boolean animatePersistence(android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
-    method public abstract boolean animateRemove(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public final void dispatchAddFinished(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public final void dispatchAddStarting(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public final void dispatchChangeFinished(android.support.v7.widget.RecyclerView.ViewHolder, boolean);
-    method public final void dispatchChangeStarting(android.support.v7.widget.RecyclerView.ViewHolder, boolean);
-    method public final void dispatchMoveFinished(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public final void dispatchMoveStarting(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public final void dispatchRemoveFinished(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public final void dispatchRemoveStarting(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public boolean getSupportsChangeAnimations();
-    method public void onAddFinished(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void onAddStarting(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void onChangeFinished(android.support.v7.widget.RecyclerView.ViewHolder, boolean);
-    method public void onChangeStarting(android.support.v7.widget.RecyclerView.ViewHolder, boolean);
-    method public void onMoveFinished(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void onMoveStarting(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void onRemoveFinished(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void onRemoveStarting(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void setSupportsChangeAnimations(boolean);
-  }
-
-  public class StaggeredGridLayoutManager extends android.support.v7.widget.RecyclerView.LayoutManager {
-    ctor public StaggeredGridLayoutManager(android.content.Context, android.util.AttributeSet, int, int);
-    ctor public StaggeredGridLayoutManager(int, int);
-    method public int[] findFirstCompletelyVisibleItemPositions(int[]);
-    method public int[] findFirstVisibleItemPositions(int[]);
-    method public int[] findLastCompletelyVisibleItemPositions(int[]);
-    method public int[] findLastVisibleItemPositions(int[]);
-    method public android.support.v7.widget.RecyclerView.LayoutParams generateDefaultLayoutParams();
-    method public int getGapStrategy();
-    method public int getOrientation();
-    method public boolean getReverseLayout();
-    method public int getSpanCount();
-    method public void invalidateSpanAssignments();
-    method public void scrollToPositionWithOffset(int, int);
-    method public void setGapStrategy(int);
-    method public void setOrientation(int);
-    method public void setReverseLayout(boolean);
-    method public void setSpanCount(int);
-    field public static final deprecated int GAP_HANDLING_LAZY = 1; // 0x1
-    field public static final int GAP_HANDLING_MOVE_ITEMS_BETWEEN_SPANS = 2; // 0x2
-    field public static final int GAP_HANDLING_NONE = 0; // 0x0
-    field public static final int HORIZONTAL = 0; // 0x0
-    field public static final java.lang.String TAG = "StaggeredGridLayoutManager";
-    field public static final int VERTICAL = 1; // 0x1
-  }
-
-  public static class StaggeredGridLayoutManager.LayoutParams extends android.support.v7.widget.RecyclerView.LayoutParams {
-    ctor public StaggeredGridLayoutManager.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public StaggeredGridLayoutManager.LayoutParams(int, int);
-    ctor public StaggeredGridLayoutManager.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public StaggeredGridLayoutManager.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public StaggeredGridLayoutManager.LayoutParams(android.support.v7.widget.RecyclerView.LayoutParams);
-    method public final int getSpanIndex();
-    method public boolean isFullSpan();
-    method public void setFullSpan(boolean);
-    field public static final int INVALID_SPAN_ID = -1; // 0xffffffff
-  }
-
-}
-
-package android.support.v7.widget.helper {
-
-  public class ItemTouchHelper extends android.support.v7.widget.RecyclerView.ItemDecoration implements android.support.v7.widget.RecyclerView.OnChildAttachStateChangeListener {
-    ctor public ItemTouchHelper(android.support.v7.widget.helper.ItemTouchHelper.Callback);
-    method public void attachToRecyclerView(android.support.v7.widget.RecyclerView);
-    method public void onChildViewAttachedToWindow(android.view.View);
-    method public void onChildViewDetachedFromWindow(android.view.View);
-    method public void startDrag(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void startSwipe(android.support.v7.widget.RecyclerView.ViewHolder);
-    field public static final int ACTION_STATE_DRAG = 2; // 0x2
-    field public static final int ACTION_STATE_IDLE = 0; // 0x0
-    field public static final int ACTION_STATE_SWIPE = 1; // 0x1
-    field public static final int ANIMATION_TYPE_DRAG = 8; // 0x8
-    field public static final int ANIMATION_TYPE_SWIPE_CANCEL = 4; // 0x4
-    field public static final int ANIMATION_TYPE_SWIPE_SUCCESS = 2; // 0x2
-    field public static final int DOWN = 2; // 0x2
-    field public static final int END = 32; // 0x20
-    field public static final int LEFT = 4; // 0x4
-    field public static final int RIGHT = 8; // 0x8
-    field public static final int START = 16; // 0x10
-    field public static final int UP = 1; // 0x1
-  }
-
-  public static abstract class ItemTouchHelper.Callback {
-    ctor public ItemTouchHelper.Callback();
-    method public boolean canDropOver(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ViewHolder);
-    method public android.support.v7.widget.RecyclerView.ViewHolder chooseDropTarget(android.support.v7.widget.RecyclerView.ViewHolder, java.util.List<android.support.v7.widget.RecyclerView.ViewHolder>, int, int);
-    method public void clearView(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder);
-    method public int convertToAbsoluteDirection(int, int);
-    method public static int convertToRelativeDirection(int, int);
-    method public long getAnimationDuration(android.support.v7.widget.RecyclerView, int, float, float);
-    method public int getBoundingBoxMargin();
-    method public static android.support.v7.widget.helper.ItemTouchUIUtil getDefaultUIUtil();
-    method public float getMoveThreshold(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public abstract int getMovementFlags(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder);
-    method public float getSwipeThreshold(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public int interpolateOutOfBoundsScroll(android.support.v7.widget.RecyclerView, int, int, int, long);
-    method public boolean isItemViewSwipeEnabled();
-    method public boolean isLongPressDragEnabled();
-    method public static int makeFlag(int, int);
-    method public static int makeMovementFlags(int, int);
-    method public void onChildDraw(android.graphics.Canvas, android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder, float, float, int, boolean);
-    method public void onChildDrawOver(android.graphics.Canvas, android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder, float, float, int, boolean);
-    method public abstract boolean onMove(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void onMoved(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder, int, android.support.v7.widget.RecyclerView.ViewHolder, int, int, int);
-    method public void onSelectedChanged(android.support.v7.widget.RecyclerView.ViewHolder, int);
-    method public abstract void onSwiped(android.support.v7.widget.RecyclerView.ViewHolder, int);
-    field public static final int DEFAULT_DRAG_ANIMATION_DURATION = 200; // 0xc8
-    field public static final int DEFAULT_SWIPE_ANIMATION_DURATION = 250; // 0xfa
-  }
-
-  public static abstract class ItemTouchHelper.SimpleCallback extends android.support.v7.widget.helper.ItemTouchHelper.Callback {
-    ctor public ItemTouchHelper.SimpleCallback(int, int);
-    method public int getDragDirs(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder);
-    method public int getMovementFlags(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder);
-    method public int getSwipeDirs(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void setDefaultDragDirs(int);
-    method public void setDefaultSwipeDirs(int);
-  }
-
-  public static abstract interface ItemTouchHelper.ViewDropHandler {
-    method public abstract void prepareForDrop(android.view.View, android.view.View, int, int);
-  }
-
-  public abstract interface ItemTouchUIUtil {
-    method public abstract void clearView(android.view.View);
-    method public abstract void onDraw(android.graphics.Canvas, android.support.v7.widget.RecyclerView, android.view.View, float, float, int, boolean);
-    method public abstract void onDrawOver(android.graphics.Canvas, android.support.v7.widget.RecyclerView, android.view.View, float, float, int, boolean);
-    method public abstract void onSelected(android.view.View);
-  }
-
-}
-
-package android.support.v7.widget.util {
-
-  public abstract class SortedListAdapterCallback extends android.support.v7.util.SortedList.Callback {
-    ctor public SortedListAdapterCallback(android.support.v7.widget.RecyclerView.Adapter);
-    method public void onChanged(int, int);
-    method public void onInserted(int, int);
-    method public void onMoved(int, int);
-    method public void onRemoved(int, int);
-  }
-
-}
-
diff --git a/v7/recyclerview/api/23.1.1.txt b/v7/recyclerview/api/23.1.1.txt
deleted file mode 100644
index 1f91036..0000000
--- a/v7/recyclerview/api/23.1.1.txt
+++ /dev/null
@@ -1,864 +0,0 @@
-package android.support.v7.recyclerview {
-
-  public final class R {
-    ctor public R();
-  }
-
-  public static final class R.attr {
-    ctor public R.attr();
-    field public static int layoutManager;
-    field public static int reverseLayout;
-    field public static int spanCount;
-    field public static int stackFromEnd;
-  }
-
-  public static final class R.dimen {
-    ctor public R.dimen();
-    field public static int item_touch_helper_max_drag_scroll_per_frame;
-  }
-
-  public static final class R.id {
-    ctor public R.id();
-    field public static int item_touch_helper_previous_elevation;
-  }
-
-  public static final class R.styleable {
-    ctor public R.styleable();
-    field public static final int[] RecyclerView;
-    field public static int RecyclerView_android_orientation;
-    field public static int RecyclerView_layoutManager;
-    field public static int RecyclerView_reverseLayout;
-    field public static int RecyclerView_spanCount;
-    field public static int RecyclerView_stackFromEnd;
-  }
-
-}
-
-package android.support.v7.util {
-
-  public class AsyncListUtil {
-    ctor public AsyncListUtil(java.lang.Class<T>, int, android.support.v7.util.AsyncListUtil.DataCallback<T>, android.support.v7.util.AsyncListUtil.ViewCallback);
-    method public T getItem(int);
-    method public int getItemCount();
-    method public void onRangeChanged();
-    method public void refresh();
-  }
-
-  public static abstract class AsyncListUtil.DataCallback {
-    ctor public AsyncListUtil.DataCallback();
-    method public abstract void fillData(T[], int, int);
-    method public int getMaxCachedTiles();
-    method public void recycleData(T[], int);
-    method public abstract int refreshData();
-  }
-
-  public static abstract class AsyncListUtil.ViewCallback {
-    ctor public AsyncListUtil.ViewCallback();
-    method public void extendRangeInto(int[], int[], int);
-    method public abstract void getItemRangeInto(int[]);
-    method public abstract void onDataRefresh();
-    method public abstract void onItemLoaded(int);
-    field public static final int HINT_SCROLL_ASC = 2; // 0x2
-    field public static final int HINT_SCROLL_DESC = 1; // 0x1
-    field public static final int HINT_SCROLL_NONE = 0; // 0x0
-  }
-
-  public class SortedList {
-    ctor public SortedList(java.lang.Class<T>, android.support.v7.util.SortedList.Callback<T>);
-    ctor public SortedList(java.lang.Class<T>, android.support.v7.util.SortedList.Callback<T>, int);
-    method public int add(T);
-    method public void addAll(T[], boolean);
-    method public void addAll(T...);
-    method public void addAll(java.util.Collection<T>);
-    method public void beginBatchedUpdates();
-    method public void clear();
-    method public void endBatchedUpdates();
-    method public T get(int) throws java.lang.IndexOutOfBoundsException;
-    method public int indexOf(T);
-    method public void recalculatePositionOfItemAt(int);
-    method public boolean remove(T);
-    method public T removeItemAt(int);
-    method public int size();
-    method public void updateItemAt(int, T);
-    field public static final int INVALID_POSITION = -1; // 0xffffffff
-  }
-
-  public static class SortedList.BatchedCallback extends android.support.v7.util.SortedList.Callback {
-    ctor public SortedList.BatchedCallback(android.support.v7.util.SortedList.Callback<T2>);
-    method public boolean areContentsTheSame(T2, T2);
-    method public boolean areItemsTheSame(T2, T2);
-    method public int compare(T2, T2);
-    method public void dispatchLastEvent();
-    method public void onChanged(int, int);
-    method public void onInserted(int, int);
-    method public void onMoved(int, int);
-    method public void onRemoved(int, int);
-  }
-
-  public static abstract class SortedList.Callback implements java.util.Comparator {
-    ctor public SortedList.Callback();
-    method public abstract boolean areContentsTheSame(T2, T2);
-    method public abstract boolean areItemsTheSame(T2, T2);
-    method public abstract int compare(T2, T2);
-    method public abstract void onChanged(int, int);
-    method public abstract void onInserted(int, int);
-    method public abstract void onMoved(int, int);
-    method public abstract void onRemoved(int, int);
-  }
-
-}
-
-package android.support.v7.widget {
-
-  public class DefaultItemAnimator extends android.support.v7.widget.SimpleItemAnimator {
-    ctor public DefaultItemAnimator();
-    method public boolean animateAdd(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public boolean animateChange(android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ViewHolder, int, int, int, int);
-    method public boolean animateMove(android.support.v7.widget.RecyclerView.ViewHolder, int, int, int, int);
-    method public boolean animateRemove(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void endAnimation(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void endAnimations();
-    method public boolean isRunning();
-    method public void runPendingAnimations();
-  }
-
-  public class GridLayoutManager extends android.support.v7.widget.LinearLayoutManager {
-    ctor public GridLayoutManager(android.content.Context, android.util.AttributeSet, int, int);
-    ctor public GridLayoutManager(android.content.Context, int);
-    ctor public GridLayoutManager(android.content.Context, int, int, boolean);
-    method public int getSpanCount();
-    method public android.support.v7.widget.GridLayoutManager.SpanSizeLookup getSpanSizeLookup();
-    method public void setSpanCount(int);
-    method public void setSpanSizeLookup(android.support.v7.widget.GridLayoutManager.SpanSizeLookup);
-    field public static final int DEFAULT_SPAN_COUNT = -1; // 0xffffffff
-  }
-
-  public static final class GridLayoutManager.DefaultSpanSizeLookup extends android.support.v7.widget.GridLayoutManager.SpanSizeLookup {
-    ctor public GridLayoutManager.DefaultSpanSizeLookup();
-    method public int getSpanSize(int);
-  }
-
-  public static class GridLayoutManager.LayoutParams extends android.support.v7.widget.RecyclerView.LayoutParams {
-    ctor public GridLayoutManager.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public GridLayoutManager.LayoutParams(int, int);
-    ctor public GridLayoutManager.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public GridLayoutManager.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public GridLayoutManager.LayoutParams(android.support.v7.widget.RecyclerView.LayoutParams);
-    method public int getSpanIndex();
-    method public int getSpanSize();
-    field public static final int INVALID_SPAN_ID = -1; // 0xffffffff
-  }
-
-  public static abstract class GridLayoutManager.SpanSizeLookup {
-    ctor public GridLayoutManager.SpanSizeLookup();
-    method public int getSpanGroupIndex(int, int);
-    method public int getSpanIndex(int, int);
-    method public abstract int getSpanSize(int);
-    method public void invalidateSpanIndexCache();
-    method public boolean isSpanIndexCacheEnabled();
-    method public void setSpanIndexCacheEnabled(boolean);
-  }
-
-  public class LinearLayoutManager extends android.support.v7.widget.RecyclerView.LayoutManager implements android.support.v7.widget.helper.ItemTouchHelper.ViewDropHandler {
-    ctor public LinearLayoutManager(android.content.Context);
-    ctor public LinearLayoutManager(android.content.Context, int, boolean);
-    ctor public LinearLayoutManager(android.content.Context, android.util.AttributeSet, int, int);
-    method public android.graphics.PointF computeScrollVectorForPosition(int);
-    method public int findFirstCompletelyVisibleItemPosition();
-    method public int findFirstVisibleItemPosition();
-    method public int findLastCompletelyVisibleItemPosition();
-    method public int findLastVisibleItemPosition();
-    method public android.support.v7.widget.RecyclerView.LayoutParams generateDefaultLayoutParams();
-    method protected int getExtraLayoutSpace(android.support.v7.widget.RecyclerView.State);
-    method public int getOrientation();
-    method public boolean getRecycleChildrenOnDetach();
-    method public boolean getReverseLayout();
-    method public boolean getStackFromEnd();
-    method protected boolean isLayoutRTL();
-    method public boolean isSmoothScrollbarEnabled();
-    method public void prepareForDrop(android.view.View, android.view.View, int, int);
-    method public void scrollToPositionWithOffset(int, int);
-    method public void setOrientation(int);
-    method public void setRecycleChildrenOnDetach(boolean);
-    method public void setReverseLayout(boolean);
-    method public void setSmoothScrollbarEnabled(boolean);
-    method public void setStackFromEnd(boolean);
-    field public static final int HORIZONTAL = 0; // 0x0
-    field public static final int INVALID_OFFSET = -2147483648; // 0x80000000
-    field public static final int VERTICAL = 1; // 0x1
-  }
-
-  protected static class LinearLayoutManager.LayoutChunkResult {
-    ctor protected LinearLayoutManager.LayoutChunkResult();
-    field public int mConsumed;
-    field public boolean mFinished;
-    field public boolean mFocusable;
-    field public boolean mIgnoreConsumed;
-  }
-
-  public abstract class LinearSmoothScroller extends android.support.v7.widget.RecyclerView.SmoothScroller {
-    ctor public LinearSmoothScroller(android.content.Context);
-    method public int calculateDtToFit(int, int, int, int, int);
-    method public int calculateDxToMakeVisible(android.view.View, int);
-    method public int calculateDyToMakeVisible(android.view.View, int);
-    method protected float calculateSpeedPerPixel(android.util.DisplayMetrics);
-    method protected int calculateTimeForDeceleration(int);
-    method protected int calculateTimeForScrolling(int);
-    method public abstract android.graphics.PointF computeScrollVectorForPosition(int);
-    method protected int getHorizontalSnapPreference();
-    method protected int getVerticalSnapPreference();
-    method protected void onSeekTargetStep(int, int, android.support.v7.widget.RecyclerView.State, android.support.v7.widget.RecyclerView.SmoothScroller.Action);
-    method protected void onStart();
-    method protected void onStop();
-    method protected void onTargetFound(android.view.View, android.support.v7.widget.RecyclerView.State, android.support.v7.widget.RecyclerView.SmoothScroller.Action);
-    method protected void updateActionForInterimTarget(android.support.v7.widget.RecyclerView.SmoothScroller.Action);
-    field public static final int SNAP_TO_ANY = 0; // 0x0
-    field public static final int SNAP_TO_END = 1; // 0x1
-    field public static final int SNAP_TO_START = -1; // 0xffffffff
-    field protected final android.view.animation.DecelerateInterpolator mDecelerateInterpolator;
-    field protected int mInterimTargetDx;
-    field protected int mInterimTargetDy;
-    field protected final android.view.animation.LinearInterpolator mLinearInterpolator;
-    field protected android.graphics.PointF mTargetVector;
-  }
-
-  public abstract class OrientationHelper {
-    method public static android.support.v7.widget.OrientationHelper createHorizontalHelper(android.support.v7.widget.RecyclerView.LayoutManager);
-    method public static android.support.v7.widget.OrientationHelper createOrientationHelper(android.support.v7.widget.RecyclerView.LayoutManager, int);
-    method public static android.support.v7.widget.OrientationHelper createVerticalHelper(android.support.v7.widget.RecyclerView.LayoutManager);
-    method public abstract int getDecoratedEnd(android.view.View);
-    method public abstract int getDecoratedMeasurement(android.view.View);
-    method public abstract int getDecoratedMeasurementInOther(android.view.View);
-    method public abstract int getDecoratedStart(android.view.View);
-    method public abstract int getEnd();
-    method public abstract int getEndAfterPadding();
-    method public abstract int getEndPadding();
-    method public abstract int getStartAfterPadding();
-    method public abstract int getTotalSpace();
-    method public int getTotalSpaceChange();
-    method public abstract void offsetChild(android.view.View, int);
-    method public abstract void offsetChildren(int);
-    method public void onLayoutComplete();
-    field public static final int HORIZONTAL = 0; // 0x0
-    field public static final int VERTICAL = 1; // 0x1
-    field protected final android.support.v7.widget.RecyclerView.LayoutManager mLayoutManager;
-  }
-
-  public class RecyclerView extends android.view.ViewGroup {
-    ctor public RecyclerView(android.content.Context);
-    ctor public RecyclerView(android.content.Context, android.util.AttributeSet);
-    ctor public RecyclerView(android.content.Context, android.util.AttributeSet, int);
-    method public void addItemDecoration(android.support.v7.widget.RecyclerView.ItemDecoration, int);
-    method public void addItemDecoration(android.support.v7.widget.RecyclerView.ItemDecoration);
-    method public void addOnChildAttachStateChangeListener(android.support.v7.widget.RecyclerView.OnChildAttachStateChangeListener);
-    method public void addOnItemTouchListener(android.support.v7.widget.RecyclerView.OnItemTouchListener);
-    method public void addOnScrollListener(android.support.v7.widget.RecyclerView.OnScrollListener);
-    method public void clearOnChildAttachStateChangeListeners();
-    method public void clearOnScrollListeners();
-    method public int computeHorizontalScrollExtent();
-    method public int computeHorizontalScrollOffset();
-    method public int computeHorizontalScrollRange();
-    method public int computeVerticalScrollExtent();
-    method public int computeVerticalScrollOffset();
-    method public int computeVerticalScrollRange();
-    method public boolean drawChild(android.graphics.Canvas, android.view.View, long);
-    method public android.view.View findChildViewUnder(float, float);
-    method public android.support.v7.widget.RecyclerView.ViewHolder findViewHolderForAdapterPosition(int);
-    method public android.support.v7.widget.RecyclerView.ViewHolder findViewHolderForItemId(long);
-    method public android.support.v7.widget.RecyclerView.ViewHolder findViewHolderForLayoutPosition(int);
-    method public deprecated android.support.v7.widget.RecyclerView.ViewHolder findViewHolderForPosition(int);
-    method public boolean fling(int, int);
-    method public android.support.v7.widget.RecyclerView.Adapter getAdapter();
-    method public int getChildAdapterPosition(android.view.View);
-    method public long getChildItemId(android.view.View);
-    method public int getChildLayoutPosition(android.view.View);
-    method public deprecated int getChildPosition(android.view.View);
-    method public android.support.v7.widget.RecyclerView.ViewHolder getChildViewHolder(android.view.View);
-    method public android.support.v7.widget.RecyclerViewAccessibilityDelegate getCompatAccessibilityDelegate();
-    method public android.support.v7.widget.RecyclerView.ItemAnimator getItemAnimator();
-    method public android.support.v7.widget.RecyclerView.LayoutManager getLayoutManager();
-    method public int getMaxFlingVelocity();
-    method public int getMinFlingVelocity();
-    method public android.support.v7.widget.RecyclerView.RecycledViewPool getRecycledViewPool();
-    method public int getScrollState();
-    method public boolean hasFixedSize();
-    method public boolean hasPendingAdapterUpdates();
-    method public void invalidateItemDecorations();
-    method public boolean isAnimating();
-    method public boolean isComputingLayout();
-    method public boolean isLayoutFrozen();
-    method public void offsetChildrenHorizontal(int);
-    method public void offsetChildrenVertical(int);
-    method public void onChildAttachedToWindow(android.view.View);
-    method public void onChildDetachedFromWindow(android.view.View);
-    method public void onDraw(android.graphics.Canvas);
-    method protected void onLayout(boolean, int, int, int, int);
-    method public void onScrollStateChanged(int);
-    method public void onScrolled(int, int);
-    method public void removeItemDecoration(android.support.v7.widget.RecyclerView.ItemDecoration);
-    method public void removeOnChildAttachStateChangeListener(android.support.v7.widget.RecyclerView.OnChildAttachStateChangeListener);
-    method public void removeOnItemTouchListener(android.support.v7.widget.RecyclerView.OnItemTouchListener);
-    method public void removeOnScrollListener(android.support.v7.widget.RecyclerView.OnScrollListener);
-    method public void scrollToPosition(int);
-    method public void setAccessibilityDelegateCompat(android.support.v7.widget.RecyclerViewAccessibilityDelegate);
-    method public void setAdapter(android.support.v7.widget.RecyclerView.Adapter);
-    method public void setChildDrawingOrderCallback(android.support.v7.widget.RecyclerView.ChildDrawingOrderCallback);
-    method public void setHasFixedSize(boolean);
-    method public void setItemAnimator(android.support.v7.widget.RecyclerView.ItemAnimator);
-    method public void setItemViewCacheSize(int);
-    method public void setLayoutFrozen(boolean);
-    method public void setLayoutManager(android.support.v7.widget.RecyclerView.LayoutManager);
-    method public deprecated void setOnScrollListener(android.support.v7.widget.RecyclerView.OnScrollListener);
-    method public void setRecycledViewPool(android.support.v7.widget.RecyclerView.RecycledViewPool);
-    method public void setRecyclerListener(android.support.v7.widget.RecyclerView.RecyclerListener);
-    method public void setScrollingTouchSlop(int);
-    method public void setViewCacheExtension(android.support.v7.widget.RecyclerView.ViewCacheExtension);
-    method public void smoothScrollBy(int, int);
-    method public void smoothScrollToPosition(int);
-    method public void stopScroll();
-    method public void swapAdapter(android.support.v7.widget.RecyclerView.Adapter, boolean);
-    field public static final int HORIZONTAL = 0; // 0x0
-    field public static final int INVALID_TYPE = -1; // 0xffffffff
-    field public static final long NO_ID = -1L; // 0xffffffffffffffffL
-    field public static final int NO_POSITION = -1; // 0xffffffff
-    field public static final int SCROLL_STATE_DRAGGING = 1; // 0x1
-    field public static final int SCROLL_STATE_IDLE = 0; // 0x0
-    field public static final int SCROLL_STATE_SETTLING = 2; // 0x2
-    field public static final int TOUCH_SLOP_DEFAULT = 0; // 0x0
-    field public static final int TOUCH_SLOP_PAGING = 1; // 0x1
-    field public static final int VERTICAL = 1; // 0x1
-  }
-
-  public static abstract class RecyclerView.Adapter {
-    ctor public RecyclerView.Adapter();
-    method public final void bindViewHolder(VH, int);
-    method public final VH createViewHolder(android.view.ViewGroup, int);
-    method public abstract int getItemCount();
-    method public long getItemId(int);
-    method public int getItemViewType(int);
-    method public final boolean hasObservers();
-    method public final boolean hasStableIds();
-    method public final void notifyDataSetChanged();
-    method public final void notifyItemChanged(int);
-    method public final void notifyItemChanged(int, java.lang.Object);
-    method public final void notifyItemInserted(int);
-    method public final void notifyItemMoved(int, int);
-    method public final void notifyItemRangeChanged(int, int);
-    method public final void notifyItemRangeChanged(int, int, java.lang.Object);
-    method public final void notifyItemRangeInserted(int, int);
-    method public final void notifyItemRangeRemoved(int, int);
-    method public final void notifyItemRemoved(int);
-    method public void onAttachedToRecyclerView(android.support.v7.widget.RecyclerView);
-    method public abstract void onBindViewHolder(VH, int);
-    method public void onBindViewHolder(VH, int, java.util.List<java.lang.Object>);
-    method public abstract VH onCreateViewHolder(android.view.ViewGroup, int);
-    method public void onDetachedFromRecyclerView(android.support.v7.widget.RecyclerView);
-    method public boolean onFailedToRecycleView(VH);
-    method public void onViewAttachedToWindow(VH);
-    method public void onViewDetachedFromWindow(VH);
-    method public void onViewRecycled(VH);
-    method public void registerAdapterDataObserver(android.support.v7.widget.RecyclerView.AdapterDataObserver);
-    method public void setHasStableIds(boolean);
-    method public void unregisterAdapterDataObserver(android.support.v7.widget.RecyclerView.AdapterDataObserver);
-  }
-
-  public static abstract class RecyclerView.AdapterDataObserver {
-    ctor public RecyclerView.AdapterDataObserver();
-    method public void onChanged();
-    method public void onItemRangeChanged(int, int);
-    method public void onItemRangeChanged(int, int, java.lang.Object);
-    method public void onItemRangeInserted(int, int);
-    method public void onItemRangeMoved(int, int, int);
-    method public void onItemRangeRemoved(int, int);
-  }
-
-  public static abstract interface RecyclerView.ChildDrawingOrderCallback {
-    method public abstract int onGetChildDrawingOrder(int, int);
-  }
-
-  public static abstract class RecyclerView.ItemAnimator {
-    ctor public RecyclerView.ItemAnimator();
-    method public abstract boolean animateAppearance(android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
-    method public abstract boolean animateChange(android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
-    method public abstract boolean animateDisappearance(android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
-    method public abstract boolean animatePersistence(android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
-    method public boolean canReuseUpdatedViewHolder(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public final void dispatchAnimationFinished(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public final void dispatchAnimationStarted(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public final void dispatchAnimationsFinished();
-    method public abstract void endAnimation(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public abstract void endAnimations();
-    method public long getAddDuration();
-    method public long getChangeDuration();
-    method public long getMoveDuration();
-    method public long getRemoveDuration();
-    method public abstract boolean isRunning();
-    method public final boolean isRunning(android.support.v7.widget.RecyclerView.ItemAnimator.ItemAnimatorFinishedListener);
-    method public android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo obtainHolderInfo();
-    method public void onAnimationFinished(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void onAnimationStarted(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo recordPostLayoutInformation(android.support.v7.widget.RecyclerView.State, android.support.v7.widget.RecyclerView.ViewHolder);
-    method public android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo recordPreLayoutInformation(android.support.v7.widget.RecyclerView.State, android.support.v7.widget.RecyclerView.ViewHolder, int, java.util.List<java.lang.Object>);
-    method public abstract void runPendingAnimations();
-    method public void setAddDuration(long);
-    method public void setChangeDuration(long);
-    method public void setMoveDuration(long);
-    method public void setRemoveDuration(long);
-    field public static final int FLAG_APPEARED_IN_PRE_LAYOUT = 4096; // 0x1000
-    field public static final int FLAG_CHANGED = 2; // 0x2
-    field public static final int FLAG_INVALIDATED = 4; // 0x4
-    field public static final int FLAG_MOVED = 2048; // 0x800
-    field public static final int FLAG_REMOVED = 8; // 0x8
-  }
-
-  public static abstract class RecyclerView.ItemAnimator.AdapterChanges implements java.lang.annotation.Annotation {
-  }
-
-  public static abstract interface RecyclerView.ItemAnimator.ItemAnimatorFinishedListener {
-    method public abstract void onAnimationsFinished();
-  }
-
-  public static class RecyclerView.ItemAnimator.ItemHolderInfo {
-    ctor public RecyclerView.ItemAnimator.ItemHolderInfo();
-    method public android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo setFrom(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo setFrom(android.support.v7.widget.RecyclerView.ViewHolder, int);
-    field public int bottom;
-    field public int changeFlags;
-    field public int left;
-    field public int right;
-    field public int top;
-  }
-
-  public static abstract class RecyclerView.ItemDecoration {
-    ctor public RecyclerView.ItemDecoration();
-    method public deprecated void getItemOffsets(android.graphics.Rect, int, android.support.v7.widget.RecyclerView);
-    method public void getItemOffsets(android.graphics.Rect, android.view.View, android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.State);
-    method public void onDraw(android.graphics.Canvas, android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.State);
-    method public deprecated void onDraw(android.graphics.Canvas, android.support.v7.widget.RecyclerView);
-    method public void onDrawOver(android.graphics.Canvas, android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.State);
-    method public deprecated void onDrawOver(android.graphics.Canvas, android.support.v7.widget.RecyclerView);
-  }
-
-  public static abstract class RecyclerView.LayoutManager {
-    ctor public RecyclerView.LayoutManager();
-    method public void addDisappearingView(android.view.View);
-    method public void addDisappearingView(android.view.View, int);
-    method public void addView(android.view.View);
-    method public void addView(android.view.View, int);
-    method public void assertInLayoutOrScroll(java.lang.String);
-    method public void assertNotInLayoutOrScroll(java.lang.String);
-    method public void attachView(android.view.View, int, android.support.v7.widget.RecyclerView.LayoutParams);
-    method public void attachView(android.view.View, int);
-    method public void attachView(android.view.View);
-    method public void calculateItemDecorationsForChild(android.view.View, android.graphics.Rect);
-    method public boolean canScrollHorizontally();
-    method public boolean canScrollVertically();
-    method public boolean checkLayoutParams(android.support.v7.widget.RecyclerView.LayoutParams);
-    method public int computeHorizontalScrollExtent(android.support.v7.widget.RecyclerView.State);
-    method public int computeHorizontalScrollOffset(android.support.v7.widget.RecyclerView.State);
-    method public int computeHorizontalScrollRange(android.support.v7.widget.RecyclerView.State);
-    method public int computeVerticalScrollExtent(android.support.v7.widget.RecyclerView.State);
-    method public int computeVerticalScrollOffset(android.support.v7.widget.RecyclerView.State);
-    method public int computeVerticalScrollRange(android.support.v7.widget.RecyclerView.State);
-    method public void detachAndScrapAttachedViews(android.support.v7.widget.RecyclerView.Recycler);
-    method public void detachAndScrapView(android.view.View, android.support.v7.widget.RecyclerView.Recycler);
-    method public void detachAndScrapViewAt(int, android.support.v7.widget.RecyclerView.Recycler);
-    method public void detachView(android.view.View);
-    method public void detachViewAt(int);
-    method public void endAnimation(android.view.View);
-    method public android.view.View findViewByPosition(int);
-    method public abstract android.support.v7.widget.RecyclerView.LayoutParams generateDefaultLayoutParams();
-    method public android.support.v7.widget.RecyclerView.LayoutParams generateLayoutParams(android.view.ViewGroup.LayoutParams);
-    method public android.support.v7.widget.RecyclerView.LayoutParams generateLayoutParams(android.content.Context, android.util.AttributeSet);
-    method public int getBaseline();
-    method public int getBottomDecorationHeight(android.view.View);
-    method public android.view.View getChildAt(int);
-    method public int getChildCount();
-    method public static int getChildMeasureSpec(int, int, int, boolean);
-    method public boolean getClipToPadding();
-    method public int getColumnCountForAccessibility(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
-    method public int getDecoratedBottom(android.view.View);
-    method public int getDecoratedLeft(android.view.View);
-    method public int getDecoratedMeasuredHeight(android.view.View);
-    method public int getDecoratedMeasuredWidth(android.view.View);
-    method public int getDecoratedRight(android.view.View);
-    method public int getDecoratedTop(android.view.View);
-    method public android.view.View getFocusedChild();
-    method public int getHeight();
-    method public int getItemCount();
-    method public int getItemViewType(android.view.View);
-    method public int getLayoutDirection();
-    method public int getLeftDecorationWidth(android.view.View);
-    method public int getMinimumHeight();
-    method public int getMinimumWidth();
-    method public int getPaddingBottom();
-    method public int getPaddingEnd();
-    method public int getPaddingLeft();
-    method public int getPaddingRight();
-    method public int getPaddingStart();
-    method public int getPaddingTop();
-    method public int getPosition(android.view.View);
-    method public static android.support.v7.widget.RecyclerView.LayoutManager.Properties getProperties(android.content.Context, android.util.AttributeSet, int, int);
-    method public int getRightDecorationWidth(android.view.View);
-    method public int getRowCountForAccessibility(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
-    method public int getSelectionModeForAccessibility(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
-    method public int getTopDecorationHeight(android.view.View);
-    method public int getWidth();
-    method public boolean hasFocus();
-    method public void ignoreView(android.view.View);
-    method public boolean isAttachedToWindow();
-    method public boolean isFocused();
-    method public boolean isLayoutHierarchical(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
-    method public boolean isSmoothScrolling();
-    method public void layoutDecorated(android.view.View, int, int, int, int);
-    method public void measureChild(android.view.View, int, int);
-    method public void measureChildWithMargins(android.view.View, int, int);
-    method public void moveView(int, int);
-    method public void offsetChildrenHorizontal(int);
-    method public void offsetChildrenVertical(int);
-    method public void onAdapterChanged(android.support.v7.widget.RecyclerView.Adapter, android.support.v7.widget.RecyclerView.Adapter);
-    method public boolean onAddFocusables(android.support.v7.widget.RecyclerView, java.util.ArrayList<android.view.View>, int, int);
-    method public void onAttachedToWindow(android.support.v7.widget.RecyclerView);
-    method public deprecated void onDetachedFromWindow(android.support.v7.widget.RecyclerView);
-    method public void onDetachedFromWindow(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.Recycler);
-    method public android.view.View onFocusSearchFailed(android.view.View, int, android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
-    method public void onInitializeAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
-    method public void onInitializeAccessibilityEvent(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State, android.view.accessibility.AccessibilityEvent);
-    method public void onInitializeAccessibilityNodeInfo(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State, android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
-    method public void onInitializeAccessibilityNodeInfoForItem(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State, android.view.View, android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
-    method public android.view.View onInterceptFocusSearch(android.view.View, int);
-    method public void onItemsAdded(android.support.v7.widget.RecyclerView, int, int);
-    method public void onItemsChanged(android.support.v7.widget.RecyclerView);
-    method public void onItemsMoved(android.support.v7.widget.RecyclerView, int, int, int);
-    method public void onItemsRemoved(android.support.v7.widget.RecyclerView, int, int);
-    method public void onItemsUpdated(android.support.v7.widget.RecyclerView, int, int);
-    method public void onItemsUpdated(android.support.v7.widget.RecyclerView, int, int, java.lang.Object);
-    method public void onLayoutChildren(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
-    method public void onMeasure(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State, int, int);
-    method public deprecated boolean onRequestChildFocus(android.support.v7.widget.RecyclerView, android.view.View, android.view.View);
-    method public boolean onRequestChildFocus(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.State, android.view.View, android.view.View);
-    method public void onRestoreInstanceState(android.os.Parcelable);
-    method public android.os.Parcelable onSaveInstanceState();
-    method public void onScrollStateChanged(int);
-    method public boolean performAccessibilityAction(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State, int, android.os.Bundle);
-    method public boolean performAccessibilityActionForItem(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State, android.view.View, int, android.os.Bundle);
-    method public void postOnAnimation(java.lang.Runnable);
-    method public void removeAllViews();
-    method public void removeAndRecycleAllViews(android.support.v7.widget.RecyclerView.Recycler);
-    method public void removeAndRecycleView(android.view.View, android.support.v7.widget.RecyclerView.Recycler);
-    method public void removeAndRecycleViewAt(int, android.support.v7.widget.RecyclerView.Recycler);
-    method public boolean removeCallbacks(java.lang.Runnable);
-    method public void removeDetachedView(android.view.View);
-    method public void removeView(android.view.View);
-    method public void removeViewAt(int);
-    method public boolean requestChildRectangleOnScreen(android.support.v7.widget.RecyclerView, android.view.View, android.graphics.Rect, boolean);
-    method public void requestLayout();
-    method public void requestSimpleAnimationsInNextLayout();
-    method public int scrollHorizontallyBy(int, android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
-    method public void scrollToPosition(int);
-    method public int scrollVerticallyBy(int, android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
-    method public void setMeasuredDimension(int, int);
-    method public void smoothScrollToPosition(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.State, int);
-    method public void startSmoothScroll(android.support.v7.widget.RecyclerView.SmoothScroller);
-    method public void stopIgnoringView(android.view.View);
-    method public boolean supportsPredictiveItemAnimations();
-  }
-
-  public static class RecyclerView.LayoutManager.Properties {
-    ctor public RecyclerView.LayoutManager.Properties();
-    field public int orientation;
-    field public boolean reverseLayout;
-    field public int spanCount;
-    field public boolean stackFromEnd;
-  }
-
-  public static class RecyclerView.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
-    ctor public RecyclerView.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public RecyclerView.LayoutParams(int, int);
-    ctor public RecyclerView.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public RecyclerView.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public RecyclerView.LayoutParams(android.support.v7.widget.RecyclerView.LayoutParams);
-    method public int getViewAdapterPosition();
-    method public int getViewLayoutPosition();
-    method public deprecated int getViewPosition();
-    method public boolean isItemChanged();
-    method public boolean isItemRemoved();
-    method public boolean isViewInvalid();
-    method public boolean viewNeedsUpdate();
-  }
-
-  public static abstract interface RecyclerView.OnChildAttachStateChangeListener {
-    method public abstract void onChildViewAttachedToWindow(android.view.View);
-    method public abstract void onChildViewDetachedFromWindow(android.view.View);
-  }
-
-  public static abstract interface RecyclerView.OnItemTouchListener {
-    method public abstract boolean onInterceptTouchEvent(android.support.v7.widget.RecyclerView, android.view.MotionEvent);
-    method public abstract void onRequestDisallowInterceptTouchEvent(boolean);
-    method public abstract void onTouchEvent(android.support.v7.widget.RecyclerView, android.view.MotionEvent);
-  }
-
-  public static abstract class RecyclerView.OnScrollListener {
-    ctor public RecyclerView.OnScrollListener();
-    method public void onScrollStateChanged(android.support.v7.widget.RecyclerView, int);
-    method public void onScrolled(android.support.v7.widget.RecyclerView, int, int);
-  }
-
-  public static class RecyclerView.RecycledViewPool {
-    ctor public RecyclerView.RecycledViewPool();
-    method public void clear();
-    method public android.support.v7.widget.RecyclerView.ViewHolder getRecycledView(int);
-    method public void putRecycledView(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void setMaxRecycledViews(int, int);
-  }
-
-  public final class RecyclerView.Recycler {
-    ctor public RecyclerView.Recycler();
-    method public void bindViewToPosition(android.view.View, int);
-    method public void clear();
-    method public int convertPreLayoutPositionToPostLayout(int);
-    method public java.util.List<android.support.v7.widget.RecyclerView.ViewHolder> getScrapList();
-    method public android.view.View getViewForPosition(int);
-    method public void recycleView(android.view.View);
-    method public void setViewCacheSize(int);
-  }
-
-  public static abstract interface RecyclerView.RecyclerListener {
-    method public abstract void onViewRecycled(android.support.v7.widget.RecyclerView.ViewHolder);
-  }
-
-  public static class RecyclerView.SimpleOnItemTouchListener implements android.support.v7.widget.RecyclerView.OnItemTouchListener {
-    ctor public RecyclerView.SimpleOnItemTouchListener();
-    method public boolean onInterceptTouchEvent(android.support.v7.widget.RecyclerView, android.view.MotionEvent);
-    method public void onRequestDisallowInterceptTouchEvent(boolean);
-    method public void onTouchEvent(android.support.v7.widget.RecyclerView, android.view.MotionEvent);
-  }
-
-  public static abstract class RecyclerView.SmoothScroller {
-    ctor public RecyclerView.SmoothScroller();
-    method public android.view.View findViewByPosition(int);
-    method public int getChildCount();
-    method public int getChildPosition(android.view.View);
-    method public android.support.v7.widget.RecyclerView.LayoutManager getLayoutManager();
-    method public int getTargetPosition();
-    method public deprecated void instantScrollToPosition(int);
-    method public boolean isPendingInitialRun();
-    method public boolean isRunning();
-    method protected void normalize(android.graphics.PointF);
-    method protected void onChildAttachedToWindow(android.view.View);
-    method protected abstract void onSeekTargetStep(int, int, android.support.v7.widget.RecyclerView.State, android.support.v7.widget.RecyclerView.SmoothScroller.Action);
-    method protected abstract void onStart();
-    method protected abstract void onStop();
-    method protected abstract void onTargetFound(android.view.View, android.support.v7.widget.RecyclerView.State, android.support.v7.widget.RecyclerView.SmoothScroller.Action);
-    method public void setTargetPosition(int);
-    method protected final void stop();
-  }
-
-  public static class RecyclerView.SmoothScroller.Action {
-    ctor public RecyclerView.SmoothScroller.Action(int, int);
-    ctor public RecyclerView.SmoothScroller.Action(int, int, int);
-    ctor public RecyclerView.SmoothScroller.Action(int, int, int, android.view.animation.Interpolator);
-    method public int getDuration();
-    method public int getDx();
-    method public int getDy();
-    method public android.view.animation.Interpolator getInterpolator();
-    method public void jumpTo(int);
-    method public void setDuration(int);
-    method public void setDx(int);
-    method public void setDy(int);
-    method public void setInterpolator(android.view.animation.Interpolator);
-    method public void update(int, int, int, android.view.animation.Interpolator);
-    field public static final int UNDEFINED_DURATION = -2147483648; // 0x80000000
-  }
-
-  public static class RecyclerView.State {
-    ctor public RecyclerView.State();
-    method public boolean didStructureChange();
-    method public T get(int);
-    method public int getItemCount();
-    method public int getTargetScrollPosition();
-    method public boolean hasTargetScrollPosition();
-    method public boolean isPreLayout();
-    method public void put(int, java.lang.Object);
-    method public void remove(int);
-    method public boolean willRunPredictiveAnimations();
-    method public boolean willRunSimpleAnimations();
-  }
-
-  public static abstract class RecyclerView.ViewCacheExtension {
-    ctor public RecyclerView.ViewCacheExtension();
-    method public abstract android.view.View getViewForPositionAndType(android.support.v7.widget.RecyclerView.Recycler, int, int);
-  }
-
-  public static abstract class RecyclerView.ViewHolder {
-    ctor public RecyclerView.ViewHolder(android.view.View);
-    method public final int getAdapterPosition();
-    method public final long getItemId();
-    method public final int getItemViewType();
-    method public final int getLayoutPosition();
-    method public final int getOldPosition();
-    method public final deprecated int getPosition();
-    method public final boolean isRecyclable();
-    method public final void setIsRecyclable(boolean);
-    field public final android.view.View itemView;
-  }
-
-  public class RecyclerViewAccessibilityDelegate extends android.support.v4.view.AccessibilityDelegateCompat {
-    ctor public RecyclerViewAccessibilityDelegate(android.support.v7.widget.RecyclerView);
-  }
-
-  public abstract class SimpleItemAnimator extends android.support.v7.widget.RecyclerView.ItemAnimator {
-    ctor public SimpleItemAnimator();
-    method public abstract boolean animateAdd(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public boolean animateAppearance(android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
-    method public boolean animateChange(android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
-    method public abstract boolean animateChange(android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ViewHolder, int, int, int, int);
-    method public boolean animateDisappearance(android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
-    method public abstract boolean animateMove(android.support.v7.widget.RecyclerView.ViewHolder, int, int, int, int);
-    method public boolean animatePersistence(android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
-    method public abstract boolean animateRemove(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public final void dispatchAddFinished(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public final void dispatchAddStarting(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public final void dispatchChangeFinished(android.support.v7.widget.RecyclerView.ViewHolder, boolean);
-    method public final void dispatchChangeStarting(android.support.v7.widget.RecyclerView.ViewHolder, boolean);
-    method public final void dispatchMoveFinished(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public final void dispatchMoveStarting(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public final void dispatchRemoveFinished(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public final void dispatchRemoveStarting(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public boolean getSupportsChangeAnimations();
-    method public void onAddFinished(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void onAddStarting(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void onChangeFinished(android.support.v7.widget.RecyclerView.ViewHolder, boolean);
-    method public void onChangeStarting(android.support.v7.widget.RecyclerView.ViewHolder, boolean);
-    method public void onMoveFinished(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void onMoveStarting(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void onRemoveFinished(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void onRemoveStarting(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void setSupportsChangeAnimations(boolean);
-  }
-
-  public class StaggeredGridLayoutManager extends android.support.v7.widget.RecyclerView.LayoutManager {
-    ctor public StaggeredGridLayoutManager(android.content.Context, android.util.AttributeSet, int, int);
-    ctor public StaggeredGridLayoutManager(int, int);
-    method public int[] findFirstCompletelyVisibleItemPositions(int[]);
-    method public int[] findFirstVisibleItemPositions(int[]);
-    method public int[] findLastCompletelyVisibleItemPositions(int[]);
-    method public int[] findLastVisibleItemPositions(int[]);
-    method public android.support.v7.widget.RecyclerView.LayoutParams generateDefaultLayoutParams();
-    method public int getGapStrategy();
-    method public int getOrientation();
-    method public boolean getReverseLayout();
-    method public int getSpanCount();
-    method public void invalidateSpanAssignments();
-    method public void scrollToPositionWithOffset(int, int);
-    method public void setGapStrategy(int);
-    method public void setOrientation(int);
-    method public void setReverseLayout(boolean);
-    method public void setSpanCount(int);
-    field public static final deprecated int GAP_HANDLING_LAZY = 1; // 0x1
-    field public static final int GAP_HANDLING_MOVE_ITEMS_BETWEEN_SPANS = 2; // 0x2
-    field public static final int GAP_HANDLING_NONE = 0; // 0x0
-    field public static final int HORIZONTAL = 0; // 0x0
-    field public static final java.lang.String TAG = "StaggeredGridLayoutManager";
-    field public static final int VERTICAL = 1; // 0x1
-  }
-
-  public static class StaggeredGridLayoutManager.LayoutParams extends android.support.v7.widget.RecyclerView.LayoutParams {
-    ctor public StaggeredGridLayoutManager.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public StaggeredGridLayoutManager.LayoutParams(int, int);
-    ctor public StaggeredGridLayoutManager.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public StaggeredGridLayoutManager.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public StaggeredGridLayoutManager.LayoutParams(android.support.v7.widget.RecyclerView.LayoutParams);
-    method public final int getSpanIndex();
-    method public boolean isFullSpan();
-    method public void setFullSpan(boolean);
-    field public static final int INVALID_SPAN_ID = -1; // 0xffffffff
-  }
-
-}
-
-package android.support.v7.widget.helper {
-
-  public class ItemTouchHelper extends android.support.v7.widget.RecyclerView.ItemDecoration implements android.support.v7.widget.RecyclerView.OnChildAttachStateChangeListener {
-    ctor public ItemTouchHelper(android.support.v7.widget.helper.ItemTouchHelper.Callback);
-    method public void attachToRecyclerView(android.support.v7.widget.RecyclerView);
-    method public void onChildViewAttachedToWindow(android.view.View);
-    method public void onChildViewDetachedFromWindow(android.view.View);
-    method public void startDrag(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void startSwipe(android.support.v7.widget.RecyclerView.ViewHolder);
-    field public static final int ACTION_STATE_DRAG = 2; // 0x2
-    field public static final int ACTION_STATE_IDLE = 0; // 0x0
-    field public static final int ACTION_STATE_SWIPE = 1; // 0x1
-    field public static final int ANIMATION_TYPE_DRAG = 8; // 0x8
-    field public static final int ANIMATION_TYPE_SWIPE_CANCEL = 4; // 0x4
-    field public static final int ANIMATION_TYPE_SWIPE_SUCCESS = 2; // 0x2
-    field public static final int DOWN = 2; // 0x2
-    field public static final int END = 32; // 0x20
-    field public static final int LEFT = 4; // 0x4
-    field public static final int RIGHT = 8; // 0x8
-    field public static final int START = 16; // 0x10
-    field public static final int UP = 1; // 0x1
-  }
-
-  public static abstract class ItemTouchHelper.Callback {
-    ctor public ItemTouchHelper.Callback();
-    method public boolean canDropOver(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ViewHolder);
-    method public android.support.v7.widget.RecyclerView.ViewHolder chooseDropTarget(android.support.v7.widget.RecyclerView.ViewHolder, java.util.List<android.support.v7.widget.RecyclerView.ViewHolder>, int, int);
-    method public void clearView(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder);
-    method public int convertToAbsoluteDirection(int, int);
-    method public static int convertToRelativeDirection(int, int);
-    method public long getAnimationDuration(android.support.v7.widget.RecyclerView, int, float, float);
-    method public int getBoundingBoxMargin();
-    method public static android.support.v7.widget.helper.ItemTouchUIUtil getDefaultUIUtil();
-    method public float getMoveThreshold(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public abstract int getMovementFlags(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder);
-    method public float getSwipeThreshold(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public int interpolateOutOfBoundsScroll(android.support.v7.widget.RecyclerView, int, int, int, long);
-    method public boolean isItemViewSwipeEnabled();
-    method public boolean isLongPressDragEnabled();
-    method public static int makeFlag(int, int);
-    method public static int makeMovementFlags(int, int);
-    method public void onChildDraw(android.graphics.Canvas, android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder, float, float, int, boolean);
-    method public void onChildDrawOver(android.graphics.Canvas, android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder, float, float, int, boolean);
-    method public abstract boolean onMove(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void onMoved(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder, int, android.support.v7.widget.RecyclerView.ViewHolder, int, int, int);
-    method public void onSelectedChanged(android.support.v7.widget.RecyclerView.ViewHolder, int);
-    method public abstract void onSwiped(android.support.v7.widget.RecyclerView.ViewHolder, int);
-    field public static final int DEFAULT_DRAG_ANIMATION_DURATION = 200; // 0xc8
-    field public static final int DEFAULT_SWIPE_ANIMATION_DURATION = 250; // 0xfa
-  }
-
-  public static abstract class ItemTouchHelper.SimpleCallback extends android.support.v7.widget.helper.ItemTouchHelper.Callback {
-    ctor public ItemTouchHelper.SimpleCallback(int, int);
-    method public int getDragDirs(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder);
-    method public int getMovementFlags(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder);
-    method public int getSwipeDirs(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void setDefaultDragDirs(int);
-    method public void setDefaultSwipeDirs(int);
-  }
-
-  public static abstract interface ItemTouchHelper.ViewDropHandler {
-    method public abstract void prepareForDrop(android.view.View, android.view.View, int, int);
-  }
-
-  public abstract interface ItemTouchUIUtil {
-    method public abstract void clearView(android.view.View);
-    method public abstract void onDraw(android.graphics.Canvas, android.support.v7.widget.RecyclerView, android.view.View, float, float, int, boolean);
-    method public abstract void onDrawOver(android.graphics.Canvas, android.support.v7.widget.RecyclerView, android.view.View, float, float, int, boolean);
-    method public abstract void onSelected(android.view.View);
-  }
-
-}
-
-package android.support.v7.widget.util {
-
-  public abstract class SortedListAdapterCallback extends android.support.v7.util.SortedList.Callback {
-    ctor public SortedListAdapterCallback(android.support.v7.widget.RecyclerView.Adapter);
-    method public void onChanged(int, int);
-    method public void onInserted(int, int);
-    method public void onMoved(int, int);
-    method public void onRemoved(int, int);
-  }
-
-}
-
diff --git a/v7/recyclerview/api/current.txt b/v7/recyclerview/api/current.txt
deleted file mode 100644
index 5314475..0000000
--- a/v7/recyclerview/api/current.txt
+++ /dev/null
@@ -1,894 +0,0 @@
-package android.support.v7.recyclerview {
-
-  public final class R {
-    ctor public R();
-  }
-
-  public static final class R.attr {
-    ctor public R.attr();
-    field public static int layoutManager;
-    field public static int reverseLayout;
-    field public static int spanCount;
-    field public static int stackFromEnd;
-  }
-
-  public static final class R.dimen {
-    ctor public R.dimen();
-    field public static int item_touch_helper_max_drag_scroll_per_frame;
-    field public static int item_touch_helper_swipe_escape_max_velocity;
-    field public static int item_touch_helper_swipe_escape_velocity;
-  }
-
-  public static final class R.id {
-    ctor public R.id();
-    field public static int item_touch_helper_previous_elevation;
-  }
-
-  public static final class R.styleable {
-    ctor public R.styleable();
-    field public static final int[] RecyclerView;
-    field public static int RecyclerView_android_descendantFocusability;
-    field public static int RecyclerView_android_orientation;
-    field public static int RecyclerView_layoutManager;
-    field public static int RecyclerView_reverseLayout;
-    field public static int RecyclerView_spanCount;
-    field public static int RecyclerView_stackFromEnd;
-  }
-
-}
-
-package android.support.v7.util {
-
-  public class AsyncListUtil {
-    ctor public AsyncListUtil(java.lang.Class<T>, int, android.support.v7.util.AsyncListUtil.DataCallback<T>, android.support.v7.util.AsyncListUtil.ViewCallback);
-    method public T getItem(int);
-    method public int getItemCount();
-    method public void onRangeChanged();
-    method public void refresh();
-  }
-
-  public static abstract class AsyncListUtil.DataCallback {
-    ctor public AsyncListUtil.DataCallback();
-    method public abstract void fillData(T[], int, int);
-    method public int getMaxCachedTiles();
-    method public void recycleData(T[], int);
-    method public abstract int refreshData();
-  }
-
-  public static abstract class AsyncListUtil.ViewCallback {
-    ctor public AsyncListUtil.ViewCallback();
-    method public void extendRangeInto(int[], int[], int);
-    method public abstract void getItemRangeInto(int[]);
-    method public abstract void onDataRefresh();
-    method public abstract void onItemLoaded(int);
-    field public static final int HINT_SCROLL_ASC = 2; // 0x2
-    field public static final int HINT_SCROLL_DESC = 1; // 0x1
-    field public static final int HINT_SCROLL_NONE = 0; // 0x0
-  }
-
-  public class SortedList {
-    ctor public SortedList(java.lang.Class<T>, android.support.v7.util.SortedList.Callback<T>);
-    ctor public SortedList(java.lang.Class<T>, android.support.v7.util.SortedList.Callback<T>, int);
-    method public int add(T);
-    method public void addAll(T[], boolean);
-    method public void addAll(T...);
-    method public void addAll(java.util.Collection<T>);
-    method public void beginBatchedUpdates();
-    method public void clear();
-    method public void endBatchedUpdates();
-    method public T get(int) throws java.lang.IndexOutOfBoundsException;
-    method public int indexOf(T);
-    method public void recalculatePositionOfItemAt(int);
-    method public boolean remove(T);
-    method public T removeItemAt(int);
-    method public int size();
-    method public void updateItemAt(int, T);
-    field public static final int INVALID_POSITION = -1; // 0xffffffff
-  }
-
-  public static class SortedList.BatchedCallback extends android.support.v7.util.SortedList.Callback {
-    ctor public SortedList.BatchedCallback(android.support.v7.util.SortedList.Callback<T2>);
-    method public boolean areContentsTheSame(T2, T2);
-    method public boolean areItemsTheSame(T2, T2);
-    method public int compare(T2, T2);
-    method public void dispatchLastEvent();
-    method public void onChanged(int, int);
-    method public void onInserted(int, int);
-    method public void onMoved(int, int);
-    method public void onRemoved(int, int);
-  }
-
-  public static abstract class SortedList.Callback implements java.util.Comparator {
-    ctor public SortedList.Callback();
-    method public abstract boolean areContentsTheSame(T2, T2);
-    method public abstract boolean areItemsTheSame(T2, T2);
-    method public abstract int compare(T2, T2);
-    method public abstract void onChanged(int, int);
-    method public abstract void onInserted(int, int);
-    method public abstract void onMoved(int, int);
-    method public abstract void onRemoved(int, int);
-  }
-
-}
-
-package android.support.v7.widget {
-
-  public class DefaultItemAnimator extends android.support.v7.widget.SimpleItemAnimator {
-    ctor public DefaultItemAnimator();
-    method public boolean animateAdd(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public boolean animateChange(android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ViewHolder, int, int, int, int);
-    method public boolean animateMove(android.support.v7.widget.RecyclerView.ViewHolder, int, int, int, int);
-    method public boolean animateRemove(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void endAnimation(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void endAnimations();
-    method public boolean isRunning();
-    method public void runPendingAnimations();
-  }
-
-  public class GridLayoutManager extends android.support.v7.widget.LinearLayoutManager {
-    ctor public GridLayoutManager(android.content.Context, android.util.AttributeSet, int, int);
-    ctor public GridLayoutManager(android.content.Context, int);
-    ctor public GridLayoutManager(android.content.Context, int, int, boolean);
-    method public int getSpanCount();
-    method public android.support.v7.widget.GridLayoutManager.SpanSizeLookup getSpanSizeLookup();
-    method public void setSpanCount(int);
-    method public void setSpanSizeLookup(android.support.v7.widget.GridLayoutManager.SpanSizeLookup);
-    field public static final int DEFAULT_SPAN_COUNT = -1; // 0xffffffff
-  }
-
-  public static final class GridLayoutManager.DefaultSpanSizeLookup extends android.support.v7.widget.GridLayoutManager.SpanSizeLookup {
-    ctor public GridLayoutManager.DefaultSpanSizeLookup();
-    method public int getSpanSize(int);
-  }
-
-  public static class GridLayoutManager.LayoutParams extends android.support.v7.widget.RecyclerView.LayoutParams {
-    ctor public GridLayoutManager.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public GridLayoutManager.LayoutParams(int, int);
-    ctor public GridLayoutManager.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public GridLayoutManager.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public GridLayoutManager.LayoutParams(android.support.v7.widget.RecyclerView.LayoutParams);
-    method public int getSpanIndex();
-    method public int getSpanSize();
-    field public static final int INVALID_SPAN_ID = -1; // 0xffffffff
-  }
-
-  public static abstract class GridLayoutManager.SpanSizeLookup {
-    ctor public GridLayoutManager.SpanSizeLookup();
-    method public int getSpanGroupIndex(int, int);
-    method public int getSpanIndex(int, int);
-    method public abstract int getSpanSize(int);
-    method public void invalidateSpanIndexCache();
-    method public boolean isSpanIndexCacheEnabled();
-    method public void setSpanIndexCacheEnabled(boolean);
-  }
-
-  public class LinearLayoutManager extends android.support.v7.widget.RecyclerView.LayoutManager implements android.support.v7.widget.helper.ItemTouchHelper.ViewDropHandler {
-    ctor public LinearLayoutManager(android.content.Context);
-    ctor public LinearLayoutManager(android.content.Context, int, boolean);
-    ctor public LinearLayoutManager(android.content.Context, android.util.AttributeSet, int, int);
-    method public android.graphics.PointF computeScrollVectorForPosition(int);
-    method public int findFirstCompletelyVisibleItemPosition();
-    method public int findFirstVisibleItemPosition();
-    method public int findLastCompletelyVisibleItemPosition();
-    method public int findLastVisibleItemPosition();
-    method public android.support.v7.widget.RecyclerView.LayoutParams generateDefaultLayoutParams();
-    method protected int getExtraLayoutSpace(android.support.v7.widget.RecyclerView.State);
-    method public int getOrientation();
-    method public boolean getRecycleChildrenOnDetach();
-    method public boolean getReverseLayout();
-    method public boolean getStackFromEnd();
-    method protected boolean isLayoutRTL();
-    method public boolean isSmoothScrollbarEnabled();
-    method public void prepareForDrop(android.view.View, android.view.View, int, int);
-    method public void scrollToPositionWithOffset(int, int);
-    method public void setOrientation(int);
-    method public void setRecycleChildrenOnDetach(boolean);
-    method public void setReverseLayout(boolean);
-    method public void setSmoothScrollbarEnabled(boolean);
-    method public void setStackFromEnd(boolean);
-    field public static final int HORIZONTAL = 0; // 0x0
-    field public static final int INVALID_OFFSET = -2147483648; // 0x80000000
-    field public static final int VERTICAL = 1; // 0x1
-  }
-
-  protected static class LinearLayoutManager.LayoutChunkResult {
-    ctor protected LinearLayoutManager.LayoutChunkResult();
-    field public int mConsumed;
-    field public boolean mFinished;
-    field public boolean mFocusable;
-    field public boolean mIgnoreConsumed;
-  }
-
-  public abstract class LinearSmoothScroller extends android.support.v7.widget.RecyclerView.SmoothScroller {
-    ctor public LinearSmoothScroller(android.content.Context);
-    method public int calculateDtToFit(int, int, int, int, int);
-    method public int calculateDxToMakeVisible(android.view.View, int);
-    method public int calculateDyToMakeVisible(android.view.View, int);
-    method protected float calculateSpeedPerPixel(android.util.DisplayMetrics);
-    method protected int calculateTimeForDeceleration(int);
-    method protected int calculateTimeForScrolling(int);
-    method public abstract android.graphics.PointF computeScrollVectorForPosition(int);
-    method protected int getHorizontalSnapPreference();
-    method protected int getVerticalSnapPreference();
-    method protected void onSeekTargetStep(int, int, android.support.v7.widget.RecyclerView.State, android.support.v7.widget.RecyclerView.SmoothScroller.Action);
-    method protected void onStart();
-    method protected void onStop();
-    method protected void onTargetFound(android.view.View, android.support.v7.widget.RecyclerView.State, android.support.v7.widget.RecyclerView.SmoothScroller.Action);
-    method protected void updateActionForInterimTarget(android.support.v7.widget.RecyclerView.SmoothScroller.Action);
-    field public static final int SNAP_TO_ANY = 0; // 0x0
-    field public static final int SNAP_TO_END = 1; // 0x1
-    field public static final int SNAP_TO_START = -1; // 0xffffffff
-    field protected final android.view.animation.DecelerateInterpolator mDecelerateInterpolator;
-    field protected int mInterimTargetDx;
-    field protected int mInterimTargetDy;
-    field protected final android.view.animation.LinearInterpolator mLinearInterpolator;
-    field protected android.graphics.PointF mTargetVector;
-  }
-
-  public abstract class OrientationHelper {
-    method public static android.support.v7.widget.OrientationHelper createHorizontalHelper(android.support.v7.widget.RecyclerView.LayoutManager);
-    method public static android.support.v7.widget.OrientationHelper createOrientationHelper(android.support.v7.widget.RecyclerView.LayoutManager, int);
-    method public static android.support.v7.widget.OrientationHelper createVerticalHelper(android.support.v7.widget.RecyclerView.LayoutManager);
-    method public abstract int getDecoratedEnd(android.view.View);
-    method public abstract int getDecoratedMeasurement(android.view.View);
-    method public abstract int getDecoratedMeasurementInOther(android.view.View);
-    method public abstract int getDecoratedStart(android.view.View);
-    method public abstract int getEnd();
-    method public abstract int getEndAfterPadding();
-    method public abstract int getEndPadding();
-    method public abstract int getMode();
-    method public abstract int getModeInOther();
-    method public abstract int getStartAfterPadding();
-    method public abstract int getTotalSpace();
-    method public int getTotalSpaceChange();
-    method public abstract int getTransformedEndWithDecoration(android.view.View);
-    method public abstract int getTransformedStartWithDecoration(android.view.View);
-    method public abstract void offsetChild(android.view.View, int);
-    method public abstract void offsetChildren(int);
-    method public void onLayoutComplete();
-    field public static final int HORIZONTAL = 0; // 0x0
-    field public static final int VERTICAL = 1; // 0x1
-    field protected final android.support.v7.widget.RecyclerView.LayoutManager mLayoutManager;
-  }
-
-  public class RecyclerView extends android.view.ViewGroup {
-    ctor public RecyclerView(android.content.Context);
-    ctor public RecyclerView(android.content.Context, android.util.AttributeSet);
-    ctor public RecyclerView(android.content.Context, android.util.AttributeSet, int);
-    method public void addItemDecoration(android.support.v7.widget.RecyclerView.ItemDecoration, int);
-    method public void addItemDecoration(android.support.v7.widget.RecyclerView.ItemDecoration);
-    method public void addOnChildAttachStateChangeListener(android.support.v7.widget.RecyclerView.OnChildAttachStateChangeListener);
-    method public void addOnItemTouchListener(android.support.v7.widget.RecyclerView.OnItemTouchListener);
-    method public void addOnScrollListener(android.support.v7.widget.RecyclerView.OnScrollListener);
-    method public void clearOnChildAttachStateChangeListeners();
-    method public void clearOnScrollListeners();
-    method public int computeHorizontalScrollExtent();
-    method public int computeHorizontalScrollOffset();
-    method public int computeHorizontalScrollRange();
-    method public int computeVerticalScrollExtent();
-    method public int computeVerticalScrollOffset();
-    method public int computeVerticalScrollRange();
-    method public boolean drawChild(android.graphics.Canvas, android.view.View, long);
-    method public android.view.View findChildViewUnder(float, float);
-    method public android.view.View findContainingItemView(android.view.View);
-    method public android.support.v7.widget.RecyclerView.ViewHolder findContainingViewHolder(android.view.View);
-    method public android.support.v7.widget.RecyclerView.ViewHolder findViewHolderForAdapterPosition(int);
-    method public android.support.v7.widget.RecyclerView.ViewHolder findViewHolderForItemId(long);
-    method public android.support.v7.widget.RecyclerView.ViewHolder findViewHolderForLayoutPosition(int);
-    method public deprecated android.support.v7.widget.RecyclerView.ViewHolder findViewHolderForPosition(int);
-    method public boolean fling(int, int);
-    method public android.support.v7.widget.RecyclerView.Adapter getAdapter();
-    method public int getChildAdapterPosition(android.view.View);
-    method public long getChildItemId(android.view.View);
-    method public int getChildLayoutPosition(android.view.View);
-    method public deprecated int getChildPosition(android.view.View);
-    method public android.support.v7.widget.RecyclerView.ViewHolder getChildViewHolder(android.view.View);
-    method public android.support.v7.widget.RecyclerViewAccessibilityDelegate getCompatAccessibilityDelegate();
-    method public android.support.v7.widget.RecyclerView.ItemAnimator getItemAnimator();
-    method public android.support.v7.widget.RecyclerView.LayoutManager getLayoutManager();
-    method public int getMaxFlingVelocity();
-    method public int getMinFlingVelocity();
-    method public boolean getPreserveFocusAfterLayout();
-    method public android.support.v7.widget.RecyclerView.RecycledViewPool getRecycledViewPool();
-    method public int getScrollState();
-    method public boolean hasFixedSize();
-    method public boolean hasPendingAdapterUpdates();
-    method public void invalidateItemDecorations();
-    method public boolean isAnimating();
-    method public boolean isComputingLayout();
-    method public boolean isLayoutFrozen();
-    method public void offsetChildrenHorizontal(int);
-    method public void offsetChildrenVertical(int);
-    method public void onChildAttachedToWindow(android.view.View);
-    method public void onChildDetachedFromWindow(android.view.View);
-    method public void onDraw(android.graphics.Canvas);
-    method protected void onLayout(boolean, int, int, int, int);
-    method public void onScrollStateChanged(int);
-    method public void onScrolled(int, int);
-    method public void removeItemDecoration(android.support.v7.widget.RecyclerView.ItemDecoration);
-    method public void removeOnChildAttachStateChangeListener(android.support.v7.widget.RecyclerView.OnChildAttachStateChangeListener);
-    method public void removeOnItemTouchListener(android.support.v7.widget.RecyclerView.OnItemTouchListener);
-    method public void removeOnScrollListener(android.support.v7.widget.RecyclerView.OnScrollListener);
-    method public void scrollToPosition(int);
-    method public void setAccessibilityDelegateCompat(android.support.v7.widget.RecyclerViewAccessibilityDelegate);
-    method public void setAdapter(android.support.v7.widget.RecyclerView.Adapter);
-    method public void setChildDrawingOrderCallback(android.support.v7.widget.RecyclerView.ChildDrawingOrderCallback);
-    method public void setHasFixedSize(boolean);
-    method public void setItemAnimator(android.support.v7.widget.RecyclerView.ItemAnimator);
-    method public void setItemViewCacheSize(int);
-    method public void setLayoutFrozen(boolean);
-    method public void setLayoutManager(android.support.v7.widget.RecyclerView.LayoutManager);
-    method public deprecated void setOnScrollListener(android.support.v7.widget.RecyclerView.OnScrollListener);
-    method public void setPreserveFocusAfterLayout(boolean);
-    method public void setRecycledViewPool(android.support.v7.widget.RecyclerView.RecycledViewPool);
-    method public void setRecyclerListener(android.support.v7.widget.RecyclerView.RecyclerListener);
-    method public void setScrollingTouchSlop(int);
-    method public void setViewCacheExtension(android.support.v7.widget.RecyclerView.ViewCacheExtension);
-    method public void smoothScrollBy(int, int);
-    method public void smoothScrollToPosition(int);
-    method public void stopScroll();
-    method public void swapAdapter(android.support.v7.widget.RecyclerView.Adapter, boolean);
-    field public static final int HORIZONTAL = 0; // 0x0
-    field public static final int INVALID_TYPE = -1; // 0xffffffff
-    field public static final long NO_ID = -1L; // 0xffffffffffffffffL
-    field public static final int NO_POSITION = -1; // 0xffffffff
-    field public static final int SCROLL_STATE_DRAGGING = 1; // 0x1
-    field public static final int SCROLL_STATE_IDLE = 0; // 0x0
-    field public static final int SCROLL_STATE_SETTLING = 2; // 0x2
-    field public static final int TOUCH_SLOP_DEFAULT = 0; // 0x0
-    field public static final int TOUCH_SLOP_PAGING = 1; // 0x1
-    field public static final int VERTICAL = 1; // 0x1
-  }
-
-  public static abstract class RecyclerView.Adapter {
-    ctor public RecyclerView.Adapter();
-    method public final void bindViewHolder(VH, int);
-    method public final VH createViewHolder(android.view.ViewGroup, int);
-    method public abstract int getItemCount();
-    method public long getItemId(int);
-    method public int getItemViewType(int);
-    method public final boolean hasObservers();
-    method public final boolean hasStableIds();
-    method public final void notifyDataSetChanged();
-    method public final void notifyItemChanged(int);
-    method public final void notifyItemChanged(int, java.lang.Object);
-    method public final void notifyItemInserted(int);
-    method public final void notifyItemMoved(int, int);
-    method public final void notifyItemRangeChanged(int, int);
-    method public final void notifyItemRangeChanged(int, int, java.lang.Object);
-    method public final void notifyItemRangeInserted(int, int);
-    method public final void notifyItemRangeRemoved(int, int);
-    method public final void notifyItemRemoved(int);
-    method public void onAttachedToRecyclerView(android.support.v7.widget.RecyclerView);
-    method public abstract void onBindViewHolder(VH, int);
-    method public void onBindViewHolder(VH, int, java.util.List<java.lang.Object>);
-    method public abstract VH onCreateViewHolder(android.view.ViewGroup, int);
-    method public void onDetachedFromRecyclerView(android.support.v7.widget.RecyclerView);
-    method public boolean onFailedToRecycleView(VH);
-    method public void onViewAttachedToWindow(VH);
-    method public void onViewDetachedFromWindow(VH);
-    method public void onViewRecycled(VH);
-    method public void registerAdapterDataObserver(android.support.v7.widget.RecyclerView.AdapterDataObserver);
-    method public void setHasStableIds(boolean);
-    method public void unregisterAdapterDataObserver(android.support.v7.widget.RecyclerView.AdapterDataObserver);
-  }
-
-  public static abstract class RecyclerView.AdapterDataObserver {
-    ctor public RecyclerView.AdapterDataObserver();
-    method public void onChanged();
-    method public void onItemRangeChanged(int, int);
-    method public void onItemRangeChanged(int, int, java.lang.Object);
-    method public void onItemRangeInserted(int, int);
-    method public void onItemRangeMoved(int, int, int);
-    method public void onItemRangeRemoved(int, int);
-  }
-
-  public static abstract interface RecyclerView.ChildDrawingOrderCallback {
-    method public abstract int onGetChildDrawingOrder(int, int);
-  }
-
-  public static abstract class RecyclerView.ItemAnimator {
-    ctor public RecyclerView.ItemAnimator();
-    method public abstract boolean animateAppearance(android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
-    method public abstract boolean animateChange(android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
-    method public abstract boolean animateDisappearance(android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
-    method public abstract boolean animatePersistence(android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
-    method public boolean canReuseUpdatedViewHolder(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public boolean canReuseUpdatedViewHolder(android.support.v7.widget.RecyclerView.ViewHolder, java.util.List<java.lang.Object>);
-    method public final void dispatchAnimationFinished(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public final void dispatchAnimationStarted(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public final void dispatchAnimationsFinished();
-    method public abstract void endAnimation(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public abstract void endAnimations();
-    method public long getAddDuration();
-    method public long getChangeDuration();
-    method public long getMoveDuration();
-    method public long getRemoveDuration();
-    method public abstract boolean isRunning();
-    method public final boolean isRunning(android.support.v7.widget.RecyclerView.ItemAnimator.ItemAnimatorFinishedListener);
-    method public android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo obtainHolderInfo();
-    method public void onAnimationFinished(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void onAnimationStarted(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo recordPostLayoutInformation(android.support.v7.widget.RecyclerView.State, android.support.v7.widget.RecyclerView.ViewHolder);
-    method public android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo recordPreLayoutInformation(android.support.v7.widget.RecyclerView.State, android.support.v7.widget.RecyclerView.ViewHolder, int, java.util.List<java.lang.Object>);
-    method public abstract void runPendingAnimations();
-    method public void setAddDuration(long);
-    method public void setChangeDuration(long);
-    method public void setMoveDuration(long);
-    method public void setRemoveDuration(long);
-    field public static final int FLAG_APPEARED_IN_PRE_LAYOUT = 4096; // 0x1000
-    field public static final int FLAG_CHANGED = 2; // 0x2
-    field public static final int FLAG_INVALIDATED = 4; // 0x4
-    field public static final int FLAG_MOVED = 2048; // 0x800
-    field public static final int FLAG_REMOVED = 8; // 0x8
-  }
-
-  public static abstract class RecyclerView.ItemAnimator.AdapterChanges implements java.lang.annotation.Annotation {
-  }
-
-  public static abstract interface RecyclerView.ItemAnimator.ItemAnimatorFinishedListener {
-    method public abstract void onAnimationsFinished();
-  }
-
-  public static class RecyclerView.ItemAnimator.ItemHolderInfo {
-    ctor public RecyclerView.ItemAnimator.ItemHolderInfo();
-    method public android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo setFrom(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo setFrom(android.support.v7.widget.RecyclerView.ViewHolder, int);
-    field public int bottom;
-    field public int changeFlags;
-    field public int left;
-    field public int right;
-    field public int top;
-  }
-
-  public static abstract class RecyclerView.ItemDecoration {
-    ctor public RecyclerView.ItemDecoration();
-    method public deprecated void getItemOffsets(android.graphics.Rect, int, android.support.v7.widget.RecyclerView);
-    method public void getItemOffsets(android.graphics.Rect, android.view.View, android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.State);
-    method public void onDraw(android.graphics.Canvas, android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.State);
-    method public deprecated void onDraw(android.graphics.Canvas, android.support.v7.widget.RecyclerView);
-    method public void onDrawOver(android.graphics.Canvas, android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.State);
-    method public deprecated void onDrawOver(android.graphics.Canvas, android.support.v7.widget.RecyclerView);
-  }
-
-  public static abstract class RecyclerView.LayoutManager {
-    ctor public RecyclerView.LayoutManager();
-    method public void addDisappearingView(android.view.View);
-    method public void addDisappearingView(android.view.View, int);
-    method public void addView(android.view.View);
-    method public void addView(android.view.View, int);
-    method public void assertInLayoutOrScroll(java.lang.String);
-    method public void assertNotInLayoutOrScroll(java.lang.String);
-    method public void attachView(android.view.View, int, android.support.v7.widget.RecyclerView.LayoutParams);
-    method public void attachView(android.view.View, int);
-    method public void attachView(android.view.View);
-    method public void calculateItemDecorationsForChild(android.view.View, android.graphics.Rect);
-    method public boolean canScrollHorizontally();
-    method public boolean canScrollVertically();
-    method public boolean checkLayoutParams(android.support.v7.widget.RecyclerView.LayoutParams);
-    method public static int chooseSize(int, int, int);
-    method public int computeHorizontalScrollExtent(android.support.v7.widget.RecyclerView.State);
-    method public int computeHorizontalScrollOffset(android.support.v7.widget.RecyclerView.State);
-    method public int computeHorizontalScrollRange(android.support.v7.widget.RecyclerView.State);
-    method public int computeVerticalScrollExtent(android.support.v7.widget.RecyclerView.State);
-    method public int computeVerticalScrollOffset(android.support.v7.widget.RecyclerView.State);
-    method public int computeVerticalScrollRange(android.support.v7.widget.RecyclerView.State);
-    method public void detachAndScrapAttachedViews(android.support.v7.widget.RecyclerView.Recycler);
-    method public void detachAndScrapView(android.view.View, android.support.v7.widget.RecyclerView.Recycler);
-    method public void detachAndScrapViewAt(int, android.support.v7.widget.RecyclerView.Recycler);
-    method public void detachView(android.view.View);
-    method public void detachViewAt(int);
-    method public void endAnimation(android.view.View);
-    method public android.view.View findContainingItemView(android.view.View);
-    method public android.view.View findViewByPosition(int);
-    method public abstract android.support.v7.widget.RecyclerView.LayoutParams generateDefaultLayoutParams();
-    method public android.support.v7.widget.RecyclerView.LayoutParams generateLayoutParams(android.view.ViewGroup.LayoutParams);
-    method public android.support.v7.widget.RecyclerView.LayoutParams generateLayoutParams(android.content.Context, android.util.AttributeSet);
-    method public int getBaseline();
-    method public int getBottomDecorationHeight(android.view.View);
-    method public android.view.View getChildAt(int);
-    method public int getChildCount();
-    method public static deprecated int getChildMeasureSpec(int, int, int, boolean);
-    method public static int getChildMeasureSpec(int, int, int, int, boolean);
-    method public boolean getClipToPadding();
-    method public int getColumnCountForAccessibility(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
-    method public int getDecoratedBottom(android.view.View);
-    method public void getDecoratedBoundsWithMargins(android.view.View, android.graphics.Rect);
-    method public int getDecoratedLeft(android.view.View);
-    method public int getDecoratedMeasuredHeight(android.view.View);
-    method public int getDecoratedMeasuredWidth(android.view.View);
-    method public int getDecoratedRight(android.view.View);
-    method public int getDecoratedTop(android.view.View);
-    method public android.view.View getFocusedChild();
-    method public int getHeight();
-    method public int getHeightMode();
-    method public int getItemCount();
-    method public int getItemViewType(android.view.View);
-    method public int getLayoutDirection();
-    method public int getLeftDecorationWidth(android.view.View);
-    method public int getMinimumHeight();
-    method public int getMinimumWidth();
-    method public int getPaddingBottom();
-    method public int getPaddingEnd();
-    method public int getPaddingLeft();
-    method public int getPaddingRight();
-    method public int getPaddingStart();
-    method public int getPaddingTop();
-    method public int getPosition(android.view.View);
-    method public static android.support.v7.widget.RecyclerView.LayoutManager.Properties getProperties(android.content.Context, android.util.AttributeSet, int, int);
-    method public int getRightDecorationWidth(android.view.View);
-    method public int getRowCountForAccessibility(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
-    method public int getSelectionModeForAccessibility(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
-    method public int getTopDecorationHeight(android.view.View);
-    method public void getTransformedBoundingBox(android.view.View, boolean, android.graphics.Rect);
-    method public int getWidth();
-    method public int getWidthMode();
-    method public boolean hasFocus();
-    method public void ignoreView(android.view.View);
-    method public boolean isAttachedToWindow();
-    method public boolean isAutoMeasureEnabled();
-    method public boolean isFocused();
-    method public boolean isLayoutHierarchical(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
-    method public boolean isMeasurementCacheEnabled();
-    method public boolean isSmoothScrolling();
-    method public void layoutDecorated(android.view.View, int, int, int, int);
-    method public void layoutDecoratedWithMargins(android.view.View, int, int, int, int);
-    method public void measureChild(android.view.View, int, int);
-    method public void measureChildWithMargins(android.view.View, int, int);
-    method public void moveView(int, int);
-    method public void offsetChildrenHorizontal(int);
-    method public void offsetChildrenVertical(int);
-    method public void onAdapterChanged(android.support.v7.widget.RecyclerView.Adapter, android.support.v7.widget.RecyclerView.Adapter);
-    method public boolean onAddFocusables(android.support.v7.widget.RecyclerView, java.util.ArrayList<android.view.View>, int, int);
-    method public void onAttachedToWindow(android.support.v7.widget.RecyclerView);
-    method public deprecated void onDetachedFromWindow(android.support.v7.widget.RecyclerView);
-    method public void onDetachedFromWindow(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.Recycler);
-    method public android.view.View onFocusSearchFailed(android.view.View, int, android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
-    method public void onInitializeAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
-    method public void onInitializeAccessibilityEvent(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State, android.view.accessibility.AccessibilityEvent);
-    method public void onInitializeAccessibilityNodeInfo(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State, android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
-    method public void onInitializeAccessibilityNodeInfoForItem(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State, android.view.View, android.support.v4.view.accessibility.AccessibilityNodeInfoCompat);
-    method public android.view.View onInterceptFocusSearch(android.view.View, int);
-    method public void onItemsAdded(android.support.v7.widget.RecyclerView, int, int);
-    method public void onItemsChanged(android.support.v7.widget.RecyclerView);
-    method public void onItemsMoved(android.support.v7.widget.RecyclerView, int, int, int);
-    method public void onItemsRemoved(android.support.v7.widget.RecyclerView, int, int);
-    method public void onItemsUpdated(android.support.v7.widget.RecyclerView, int, int);
-    method public void onItemsUpdated(android.support.v7.widget.RecyclerView, int, int, java.lang.Object);
-    method public void onLayoutChildren(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
-    method public void onLayoutCompleted(android.support.v7.widget.RecyclerView.State);
-    method public void onMeasure(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State, int, int);
-    method public deprecated boolean onRequestChildFocus(android.support.v7.widget.RecyclerView, android.view.View, android.view.View);
-    method public boolean onRequestChildFocus(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.State, android.view.View, android.view.View);
-    method public void onRestoreInstanceState(android.os.Parcelable);
-    method public android.os.Parcelable onSaveInstanceState();
-    method public void onScrollStateChanged(int);
-    method public boolean performAccessibilityAction(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State, int, android.os.Bundle);
-    method public boolean performAccessibilityActionForItem(android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State, android.view.View, int, android.os.Bundle);
-    method public void postOnAnimation(java.lang.Runnable);
-    method public void removeAllViews();
-    method public void removeAndRecycleAllViews(android.support.v7.widget.RecyclerView.Recycler);
-    method public void removeAndRecycleView(android.view.View, android.support.v7.widget.RecyclerView.Recycler);
-    method public void removeAndRecycleViewAt(int, android.support.v7.widget.RecyclerView.Recycler);
-    method public boolean removeCallbacks(java.lang.Runnable);
-    method public void removeDetachedView(android.view.View);
-    method public void removeView(android.view.View);
-    method public void removeViewAt(int);
-    method public boolean requestChildRectangleOnScreen(android.support.v7.widget.RecyclerView, android.view.View, android.graphics.Rect, boolean);
-    method public void requestLayout();
-    method public void requestSimpleAnimationsInNextLayout();
-    method public int scrollHorizontallyBy(int, android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
-    method public void scrollToPosition(int);
-    method public int scrollVerticallyBy(int, android.support.v7.widget.RecyclerView.Recycler, android.support.v7.widget.RecyclerView.State);
-    method public void setAutoMeasureEnabled(boolean);
-    method public void setMeasuredDimension(android.graphics.Rect, int, int);
-    method public void setMeasuredDimension(int, int);
-    method public void setMeasurementCacheEnabled(boolean);
-    method public void smoothScrollToPosition(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.State, int);
-    method public void startSmoothScroll(android.support.v7.widget.RecyclerView.SmoothScroller);
-    method public void stopIgnoringView(android.view.View);
-    method public boolean supportsPredictiveItemAnimations();
-  }
-
-  public static class RecyclerView.LayoutManager.Properties {
-    ctor public RecyclerView.LayoutManager.Properties();
-    field public int orientation;
-    field public boolean reverseLayout;
-    field public int spanCount;
-    field public boolean stackFromEnd;
-  }
-
-  public static class RecyclerView.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
-    ctor public RecyclerView.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public RecyclerView.LayoutParams(int, int);
-    ctor public RecyclerView.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public RecyclerView.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public RecyclerView.LayoutParams(android.support.v7.widget.RecyclerView.LayoutParams);
-    method public int getViewAdapterPosition();
-    method public int getViewLayoutPosition();
-    method public deprecated int getViewPosition();
-    method public boolean isItemChanged();
-    method public boolean isItemRemoved();
-    method public boolean isViewInvalid();
-    method public boolean viewNeedsUpdate();
-  }
-
-  public static abstract interface RecyclerView.OnChildAttachStateChangeListener {
-    method public abstract void onChildViewAttachedToWindow(android.view.View);
-    method public abstract void onChildViewDetachedFromWindow(android.view.View);
-  }
-
-  public static abstract interface RecyclerView.OnItemTouchListener {
-    method public abstract boolean onInterceptTouchEvent(android.support.v7.widget.RecyclerView, android.view.MotionEvent);
-    method public abstract void onRequestDisallowInterceptTouchEvent(boolean);
-    method public abstract void onTouchEvent(android.support.v7.widget.RecyclerView, android.view.MotionEvent);
-  }
-
-  public static abstract class RecyclerView.OnScrollListener {
-    ctor public RecyclerView.OnScrollListener();
-    method public void onScrollStateChanged(android.support.v7.widget.RecyclerView, int);
-    method public void onScrolled(android.support.v7.widget.RecyclerView, int, int);
-  }
-
-  public static class RecyclerView.RecycledViewPool {
-    ctor public RecyclerView.RecycledViewPool();
-    method public void clear();
-    method public android.support.v7.widget.RecyclerView.ViewHolder getRecycledView(int);
-    method public void putRecycledView(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void setMaxRecycledViews(int, int);
-  }
-
-  public final class RecyclerView.Recycler {
-    ctor public RecyclerView.Recycler();
-    method public void bindViewToPosition(android.view.View, int);
-    method public void clear();
-    method public int convertPreLayoutPositionToPostLayout(int);
-    method public java.util.List<android.support.v7.widget.RecyclerView.ViewHolder> getScrapList();
-    method public android.view.View getViewForPosition(int);
-    method public void recycleView(android.view.View);
-    method public void setViewCacheSize(int);
-  }
-
-  public static abstract interface RecyclerView.RecyclerListener {
-    method public abstract void onViewRecycled(android.support.v7.widget.RecyclerView.ViewHolder);
-  }
-
-  public static class RecyclerView.SimpleOnItemTouchListener implements android.support.v7.widget.RecyclerView.OnItemTouchListener {
-    ctor public RecyclerView.SimpleOnItemTouchListener();
-    method public boolean onInterceptTouchEvent(android.support.v7.widget.RecyclerView, android.view.MotionEvent);
-    method public void onRequestDisallowInterceptTouchEvent(boolean);
-    method public void onTouchEvent(android.support.v7.widget.RecyclerView, android.view.MotionEvent);
-  }
-
-  public static abstract class RecyclerView.SmoothScroller {
-    ctor public RecyclerView.SmoothScroller();
-    method public android.view.View findViewByPosition(int);
-    method public int getChildCount();
-    method public int getChildPosition(android.view.View);
-    method public android.support.v7.widget.RecyclerView.LayoutManager getLayoutManager();
-    method public int getTargetPosition();
-    method public deprecated void instantScrollToPosition(int);
-    method public boolean isPendingInitialRun();
-    method public boolean isRunning();
-    method protected void normalize(android.graphics.PointF);
-    method protected void onChildAttachedToWindow(android.view.View);
-    method protected abstract void onSeekTargetStep(int, int, android.support.v7.widget.RecyclerView.State, android.support.v7.widget.RecyclerView.SmoothScroller.Action);
-    method protected abstract void onStart();
-    method protected abstract void onStop();
-    method protected abstract void onTargetFound(android.view.View, android.support.v7.widget.RecyclerView.State, android.support.v7.widget.RecyclerView.SmoothScroller.Action);
-    method public void setTargetPosition(int);
-    method protected final void stop();
-  }
-
-  public static class RecyclerView.SmoothScroller.Action {
-    ctor public RecyclerView.SmoothScroller.Action(int, int);
-    ctor public RecyclerView.SmoothScroller.Action(int, int, int);
-    ctor public RecyclerView.SmoothScroller.Action(int, int, int, android.view.animation.Interpolator);
-    method public int getDuration();
-    method public int getDx();
-    method public int getDy();
-    method public android.view.animation.Interpolator getInterpolator();
-    method public void jumpTo(int);
-    method public void setDuration(int);
-    method public void setDx(int);
-    method public void setDy(int);
-    method public void setInterpolator(android.view.animation.Interpolator);
-    method public void update(int, int, int, android.view.animation.Interpolator);
-    field public static final int UNDEFINED_DURATION = -2147483648; // 0x80000000
-  }
-
-  public static class RecyclerView.State {
-    ctor public RecyclerView.State();
-    method public boolean didStructureChange();
-    method public T get(int);
-    method public int getItemCount();
-    method public int getTargetScrollPosition();
-    method public boolean hasTargetScrollPosition();
-    method public boolean isMeasuring();
-    method public boolean isPreLayout();
-    method public void put(int, java.lang.Object);
-    method public void remove(int);
-    method public boolean willRunPredictiveAnimations();
-    method public boolean willRunSimpleAnimations();
-  }
-
-  public static abstract class RecyclerView.ViewCacheExtension {
-    ctor public RecyclerView.ViewCacheExtension();
-    method public abstract android.view.View getViewForPositionAndType(android.support.v7.widget.RecyclerView.Recycler, int, int);
-  }
-
-  public static abstract class RecyclerView.ViewHolder {
-    ctor public RecyclerView.ViewHolder(android.view.View);
-    method public final int getAdapterPosition();
-    method public final long getItemId();
-    method public final int getItemViewType();
-    method public final int getLayoutPosition();
-    method public final int getOldPosition();
-    method public final deprecated int getPosition();
-    method public final boolean isRecyclable();
-    method public final void setIsRecyclable(boolean);
-    field public final android.view.View itemView;
-  }
-
-  public class RecyclerViewAccessibilityDelegate extends android.support.v4.view.AccessibilityDelegateCompat {
-    ctor public RecyclerViewAccessibilityDelegate(android.support.v7.widget.RecyclerView);
-    method public android.support.v4.view.AccessibilityDelegateCompat getItemDelegate();
-  }
-
-  public abstract class SimpleItemAnimator extends android.support.v7.widget.RecyclerView.ItemAnimator {
-    ctor public SimpleItemAnimator();
-    method public abstract boolean animateAdd(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public boolean animateAppearance(android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
-    method public boolean animateChange(android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
-    method public abstract boolean animateChange(android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ViewHolder, int, int, int, int);
-    method public boolean animateDisappearance(android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
-    method public abstract boolean animateMove(android.support.v7.widget.RecyclerView.ViewHolder, int, int, int, int);
-    method public boolean animatePersistence(android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo, android.support.v7.widget.RecyclerView.ItemAnimator.ItemHolderInfo);
-    method public abstract boolean animateRemove(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public final void dispatchAddFinished(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public final void dispatchAddStarting(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public final void dispatchChangeFinished(android.support.v7.widget.RecyclerView.ViewHolder, boolean);
-    method public final void dispatchChangeStarting(android.support.v7.widget.RecyclerView.ViewHolder, boolean);
-    method public final void dispatchMoveFinished(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public final void dispatchMoveStarting(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public final void dispatchRemoveFinished(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public final void dispatchRemoveStarting(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public boolean getSupportsChangeAnimations();
-    method public void onAddFinished(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void onAddStarting(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void onChangeFinished(android.support.v7.widget.RecyclerView.ViewHolder, boolean);
-    method public void onChangeStarting(android.support.v7.widget.RecyclerView.ViewHolder, boolean);
-    method public void onMoveFinished(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void onMoveStarting(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void onRemoveFinished(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void onRemoveStarting(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void setSupportsChangeAnimations(boolean);
-  }
-
-  public class StaggeredGridLayoutManager extends android.support.v7.widget.RecyclerView.LayoutManager {
-    ctor public StaggeredGridLayoutManager(android.content.Context, android.util.AttributeSet, int, int);
-    ctor public StaggeredGridLayoutManager(int, int);
-    method public int[] findFirstCompletelyVisibleItemPositions(int[]);
-    method public int[] findFirstVisibleItemPositions(int[]);
-    method public int[] findLastCompletelyVisibleItemPositions(int[]);
-    method public int[] findLastVisibleItemPositions(int[]);
-    method public android.support.v7.widget.RecyclerView.LayoutParams generateDefaultLayoutParams();
-    method public int getGapStrategy();
-    method public int getOrientation();
-    method public boolean getReverseLayout();
-    method public int getSpanCount();
-    method public void invalidateSpanAssignments();
-    method public void scrollToPositionWithOffset(int, int);
-    method public void setGapStrategy(int);
-    method public void setOrientation(int);
-    method public void setReverseLayout(boolean);
-    method public void setSpanCount(int);
-    field public static final deprecated int GAP_HANDLING_LAZY = 1; // 0x1
-    field public static final int GAP_HANDLING_MOVE_ITEMS_BETWEEN_SPANS = 2; // 0x2
-    field public static final int GAP_HANDLING_NONE = 0; // 0x0
-    field public static final int HORIZONTAL = 0; // 0x0
-    field public static final java.lang.String TAG = "StaggeredGridLayoutManager";
-    field public static final int VERTICAL = 1; // 0x1
-  }
-
-  public static class StaggeredGridLayoutManager.LayoutParams extends android.support.v7.widget.RecyclerView.LayoutParams {
-    ctor public StaggeredGridLayoutManager.LayoutParams(android.content.Context, android.util.AttributeSet);
-    ctor public StaggeredGridLayoutManager.LayoutParams(int, int);
-    ctor public StaggeredGridLayoutManager.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
-    ctor public StaggeredGridLayoutManager.LayoutParams(android.view.ViewGroup.LayoutParams);
-    ctor public StaggeredGridLayoutManager.LayoutParams(android.support.v7.widget.RecyclerView.LayoutParams);
-    method public final int getSpanIndex();
-    method public boolean isFullSpan();
-    method public void setFullSpan(boolean);
-    field public static final int INVALID_SPAN_ID = -1; // 0xffffffff
-  }
-
-}
-
-package android.support.v7.widget.helper {
-
-  public class ItemTouchHelper extends android.support.v7.widget.RecyclerView.ItemDecoration implements android.support.v7.widget.RecyclerView.OnChildAttachStateChangeListener {
-    ctor public ItemTouchHelper(android.support.v7.widget.helper.ItemTouchHelper.Callback);
-    method public void attachToRecyclerView(android.support.v7.widget.RecyclerView);
-    method public void onChildViewAttachedToWindow(android.view.View);
-    method public void onChildViewDetachedFromWindow(android.view.View);
-    method public void startDrag(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void startSwipe(android.support.v7.widget.RecyclerView.ViewHolder);
-    field public static final int ACTION_STATE_DRAG = 2; // 0x2
-    field public static final int ACTION_STATE_IDLE = 0; // 0x0
-    field public static final int ACTION_STATE_SWIPE = 1; // 0x1
-    field public static final int ANIMATION_TYPE_DRAG = 8; // 0x8
-    field public static final int ANIMATION_TYPE_SWIPE_CANCEL = 4; // 0x4
-    field public static final int ANIMATION_TYPE_SWIPE_SUCCESS = 2; // 0x2
-    field public static final int DOWN = 2; // 0x2
-    field public static final int END = 32; // 0x20
-    field public static final int LEFT = 4; // 0x4
-    field public static final int RIGHT = 8; // 0x8
-    field public static final int START = 16; // 0x10
-    field public static final int UP = 1; // 0x1
-  }
-
-  public static abstract class ItemTouchHelper.Callback {
-    ctor public ItemTouchHelper.Callback();
-    method public boolean canDropOver(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ViewHolder);
-    method public android.support.v7.widget.RecyclerView.ViewHolder chooseDropTarget(android.support.v7.widget.RecyclerView.ViewHolder, java.util.List<android.support.v7.widget.RecyclerView.ViewHolder>, int, int);
-    method public void clearView(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder);
-    method public int convertToAbsoluteDirection(int, int);
-    method public static int convertToRelativeDirection(int, int);
-    method public long getAnimationDuration(android.support.v7.widget.RecyclerView, int, float, float);
-    method public int getBoundingBoxMargin();
-    method public static android.support.v7.widget.helper.ItemTouchUIUtil getDefaultUIUtil();
-    method public float getMoveThreshold(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public abstract int getMovementFlags(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder);
-    method public float getSwipeEscapeVelocity(float);
-    method public float getSwipeThreshold(android.support.v7.widget.RecyclerView.ViewHolder);
-    method public float getSwipeVelocityThreshold(float);
-    method public int interpolateOutOfBoundsScroll(android.support.v7.widget.RecyclerView, int, int, int, long);
-    method public boolean isItemViewSwipeEnabled();
-    method public boolean isLongPressDragEnabled();
-    method public static int makeFlag(int, int);
-    method public static int makeMovementFlags(int, int);
-    method public void onChildDraw(android.graphics.Canvas, android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder, float, float, int, boolean);
-    method public void onChildDrawOver(android.graphics.Canvas, android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder, float, float, int, boolean);
-    method public abstract boolean onMove(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder, android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void onMoved(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder, int, android.support.v7.widget.RecyclerView.ViewHolder, int, int, int);
-    method public void onSelectedChanged(android.support.v7.widget.RecyclerView.ViewHolder, int);
-    method public abstract void onSwiped(android.support.v7.widget.RecyclerView.ViewHolder, int);
-    field public static final int DEFAULT_DRAG_ANIMATION_DURATION = 200; // 0xc8
-    field public static final int DEFAULT_SWIPE_ANIMATION_DURATION = 250; // 0xfa
-  }
-
-  public static abstract class ItemTouchHelper.SimpleCallback extends android.support.v7.widget.helper.ItemTouchHelper.Callback {
-    ctor public ItemTouchHelper.SimpleCallback(int, int);
-    method public int getDragDirs(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder);
-    method public int getMovementFlags(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder);
-    method public int getSwipeDirs(android.support.v7.widget.RecyclerView, android.support.v7.widget.RecyclerView.ViewHolder);
-    method public void setDefaultDragDirs(int);
-    method public void setDefaultSwipeDirs(int);
-  }
-
-  public static abstract interface ItemTouchHelper.ViewDropHandler {
-    method public abstract void prepareForDrop(android.view.View, android.view.View, int, int);
-  }
-
-  public abstract interface ItemTouchUIUtil {
-    method public abstract void clearView(android.view.View);
-    method public abstract void onDraw(android.graphics.Canvas, android.support.v7.widget.RecyclerView, android.view.View, float, float, int, boolean);
-    method public abstract void onDrawOver(android.graphics.Canvas, android.support.v7.widget.RecyclerView, android.view.View, float, float, int, boolean);
-    method public abstract void onSelected(android.view.View);
-  }
-
-}
-
-package android.support.v7.widget.util {
-
-  public abstract class SortedListAdapterCallback extends android.support.v7.util.SortedList.Callback {
-    ctor public SortedListAdapterCallback(android.support.v7.widget.RecyclerView.Adapter);
-    method public void onChanged(int, int);
-    method public void onInserted(int, int);
-    method public void onMoved(int, int);
-    method public void onRemoved(int, int);
-  }
-
-}
-
diff --git a/v7/recyclerview/api/removed.txt b/v7/recyclerview/api/removed.txt
deleted file mode 100644
index e69de29..0000000
--- a/v7/recyclerview/api/removed.txt
+++ /dev/null
diff --git a/v7/recyclerview/build.gradle b/v7/recyclerview/build.gradle
index 386694d..7a6391e 100644
--- a/v7/recyclerview/build.gradle
+++ b/v7/recyclerview/build.gradle
@@ -3,8 +3,9 @@
 archivesBaseName = 'recyclerview-v7'
 
 dependencies {
-    compile project(':support-v4')
     compile project(':support-annotations')
+    compile project(':support-compat')
+    compile project(':support-core-ui')
     androidTestCompile ('com.android.support.test:runner:0.4.1') {
         exclude module: 'support-annotations'
     }
@@ -21,7 +22,7 @@
     compileSdkVersion 23
 
     defaultConfig {
-        minSdkVersion 7
+        minSdkVersion 9
         testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
     }
 
diff --git a/v7/recyclerview/src/android/support/v7/util/MessageThreadUtil.java b/v7/recyclerview/src/android/support/v7/util/MessageThreadUtil.java
index 49efcf9..8aa9eda 100644
--- a/v7/recyclerview/src/android/support/v7/util/MessageThreadUtil.java
+++ b/v7/recyclerview/src/android/support/v7/util/MessageThreadUtil.java
@@ -26,6 +26,7 @@
 
 class MessageThreadUtil<T> implements ThreadUtil<T> {
 
+    @Override
     public MainThreadCallback<T> getMainThreadProxy(final MainThreadCallback<T> callback) {
         return new MainThreadCallback<T>() {
             final private MessageQueue mQueue = new MessageQueue();
@@ -81,6 +82,7 @@
         };
     }
 
+    @Override
     public BackgroundCallback<T> getBackgroundProxy(final BackgroundCallback<T> callback) {
         return new BackgroundCallback<T>() {
             final private MessageQueue mQueue = new MessageQueue();
diff --git a/v7/recyclerview/src/android/support/v7/util/SortedList.java b/v7/recyclerview/src/android/support/v7/util/SortedList.java
index c03af33..5ecb66f 100644
--- a/v7/recyclerview/src/android/support/v7/util/SortedList.java
+++ b/v7/recyclerview/src/android/support/v7/util/SortedList.java
@@ -694,6 +694,7 @@
          * first argument is less than, equal to, or greater than the
          * second.
          */
+        @Override
         abstract public int compare(T2 o1, T2 o2);
 
         /**
diff --git a/v7/recyclerview/src/android/support/v7/widget/DefaultItemAnimator.java b/v7/recyclerview/src/android/support/v7/widget/DefaultItemAnimator.java
index 472b2e5..d64621a 100644
--- a/v7/recyclerview/src/android/support/v7/widget/DefaultItemAnimator.java
+++ b/v7/recyclerview/src/android/support/v7/widget/DefaultItemAnimator.java
@@ -162,6 +162,7 @@
             mAdditionsList.add(additions);
             mPendingAdditions.clear();
             Runnable adder = new Runnable() {
+                @Override
                 public void run() {
                     for (ViewHolder holder : additions) {
                         animateAddImpl(holder);
diff --git a/v7/recyclerview/src/android/support/v7/widget/GridLayoutManager.java b/v7/recyclerview/src/android/support/v7/widget/GridLayoutManager.java
index 6a56418..f584834 100644
--- a/v7/recyclerview/src/android/support/v7/widget/GridLayoutManager.java
+++ b/v7/recyclerview/src/android/support/v7/widget/GridLayoutManager.java
@@ -10,7 +10,7 @@
  * 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 languag`e governing permissions and
+ * See the License for the specific language governing permissions and
  * limitations under the License.
  */
 package android.support.v7.widget;
diff --git a/v7/recyclerview/src/android/support/v7/widget/LayoutState.java b/v7/recyclerview/src/android/support/v7/widget/LayoutState.java
index bf730ad..23d8ee8 100644
--- a/v7/recyclerview/src/android/support/v7/widget/LayoutState.java
+++ b/v7/recyclerview/src/android/support/v7/widget/LayoutState.java
@@ -10,7 +10,7 @@
  * 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 languag`e governing permissions and
+ * See the License for the specific language governing permissions and
  * limitations under the License.
  */
 
diff --git a/v7/recyclerview/src/android/support/v7/widget/LinearLayoutManager.java b/v7/recyclerview/src/android/support/v7/widget/LinearLayoutManager.java
index a36cf50..ddc9bad 100644
--- a/v7/recyclerview/src/android/support/v7/widget/LinearLayoutManager.java
+++ b/v7/recyclerview/src/android/support/v7/widget/LinearLayoutManager.java
@@ -10,7 +10,7 @@
  * 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 languag`e governing permissions and
+ * See the License for the specific language governing permissions and
  * limitations under the License.
  */
 
@@ -199,7 +199,7 @@
      * RecyclerView.
      * <p>
      * If you are using a {@link RecyclerView.RecycledViewPool}, it might be a good idea to set
-     * this flag to <code>true</code> so that views will be avilable to other RecyclerViews
+     * this flag to <code>true</code> so that views will be available to other RecyclerViews
      * immediately.
      * <p>
      * Note that, setting this flag will result in a performance drop if RecyclerView
@@ -304,7 +304,7 @@
     }
 
     /**
-     * Returns the current orientaion of the layout.
+     * Returns the current orientation of the layout.
      *
      * @return Current orientation,  either {@link #HORIZONTAL} or {@link #VERTICAL}
      * @see #setOrientation(int)
@@ -926,7 +926,7 @@
         mLayoutState.mCurrentPosition = itemPosition;
         mLayoutState.mLayoutDirection = LayoutState.LAYOUT_END;
         mLayoutState.mOffset = offset;
-        mLayoutState.mScrollingOffset = LayoutState.SCOLLING_OFFSET_NaN;
+        mLayoutState.mScrollingOffset = LayoutState.SCROLLING_OFFSET_NaN;
     }
 
     private void updateLayoutStateToFillStart(AnchorInfo anchorInfo) {
@@ -940,7 +940,7 @@
                 LayoutState.ITEM_DIRECTION_HEAD;
         mLayoutState.mLayoutDirection = LayoutState.LAYOUT_START;
         mLayoutState.mOffset = offset;
-        mLayoutState.mScrollingOffset = LayoutState.SCOLLING_OFFSET_NaN;
+        mLayoutState.mScrollingOffset = LayoutState.SCROLLING_OFFSET_NaN;
 
     }
 
@@ -1357,13 +1357,13 @@
      * @param layoutState     Configuration on how we should fill out the available space.
      * @param state           Context passed by the RecyclerView to control scroll steps.
      * @param stopOnFocusable If true, filling stops in the first focusable new child
-     * @return Number of pixels that it added. Useful for scoll functions.
+     * @return Number of pixels that it added. Useful for scroll functions.
      */
     int fill(RecyclerView.Recycler recycler, LayoutState layoutState,
             RecyclerView.State state, boolean stopOnFocusable) {
         // max offset we should set is mFastScroll + available
         final int start = layoutState.mAvailable;
-        if (layoutState.mScrollingOffset != LayoutState.SCOLLING_OFFSET_NaN) {
+        if (layoutState.mScrollingOffset != LayoutState.SCROLLING_OFFSET_NaN) {
             // TODO ugly bug fix. should not happen
             if (layoutState.mAvailable < 0) {
                 layoutState.mScrollingOffset += layoutState.mAvailable;
@@ -1392,7 +1392,7 @@
                 remainingSpace -= layoutChunkResult.mConsumed;
             }
 
-            if (layoutState.mScrollingOffset != LayoutState.SCOLLING_OFFSET_NaN) {
+            if (layoutState.mScrollingOffset != LayoutState.SCROLLING_OFFSET_NaN) {
                 layoutState.mScrollingOffset += layoutChunkResult.mConsumed;
                 if (layoutState.mAvailable < 0) {
                     layoutState.mScrollingOffset += layoutState.mAvailable;
@@ -1801,7 +1801,7 @@
         ensureLayoutState();
         final int maxScroll = (int) (MAX_SCROLL_FACTOR * mOrientationHelper.getTotalSpace());
         updateLayoutState(layoutDir, maxScroll, false, state);
-        mLayoutState.mScrollingOffset = LayoutState.SCOLLING_OFFSET_NaN;
+        mLayoutState.mScrollingOffset = LayoutState.SCROLLING_OFFSET_NaN;
         mLayoutState.mRecycle = false;
         fill(recycler, mLayoutState, state, true);
         final View nextFocus;
@@ -1937,7 +1937,7 @@
 
         final static int ITEM_DIRECTION_TAIL = 1;
 
-        final static int SCOLLING_OFFSET_NaN = Integer.MIN_VALUE;
+        final static int SCROLLING_OFFSET_NaN = Integer.MIN_VALUE;
 
         /**
          * We may not want to recycle children in some cases (e.g. layout)
diff --git a/v7/recyclerview/src/android/support/v7/widget/LinearSmoothScroller.java b/v7/recyclerview/src/android/support/v7/widget/LinearSmoothScroller.java
index 0996ca4..cddcf11 100644
--- a/v7/recyclerview/src/android/support/v7/widget/LinearSmoothScroller.java
+++ b/v7/recyclerview/src/android/support/v7/widget/LinearSmoothScroller.java
@@ -26,7 +26,7 @@
 
 /**
  * {@link RecyclerView.SmoothScroller} implementation which uses
- * {@link android.view.animation.LinearInterpolator} until the target position becames a child of
+ * {@link android.view.animation.LinearInterpolator} until the target position becomes a child of
  * the RecyclerView and then uses
  * {@link android.view.animation.DecelerateInterpolator} to slowly approach to target position.
  */
diff --git a/v7/recyclerview/src/android/support/v7/widget/RecyclerView.java b/v7/recyclerview/src/android/support/v7/widget/RecyclerView.java
index c837965..c590af0 100644
--- a/v7/recyclerview/src/android/support/v7/widget/RecyclerView.java
+++ b/v7/recyclerview/src/android/support/v7/widget/RecyclerView.java
@@ -46,7 +46,6 @@
 import android.support.v4.view.ScrollingView;
 import android.support.v4.view.VelocityTrackerCompat;
 import android.support.v4.view.ViewCompat;
-import android.support.v4.view.ViewConfigurationCompat;
 import android.support.v4.view.accessibility.AccessibilityEventCompat;
 import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat;
 import android.support.v4.view.accessibility.AccessibilityRecordCompat;
@@ -288,6 +287,7 @@
      * 3) We're attached
      */
     private final Runnable mUpdateChildViewsRunnable = new Runnable() {
+        @Override
         public void run() {
             if (!mFirstLayoutComplete || isLayoutRequested()) {
                 // a layout request will happen, we should not do layout here.
@@ -427,6 +427,7 @@
     };
 
     private static final Interpolator sQuinticInterpolator = new Interpolator() {
+        @Override
         public float getInterpolation(float t) {
             t -= 1.0f;
             return t * t * t * t * t + 1.0f;
@@ -863,7 +864,7 @@
                 break;
 
             case TOUCH_SLOP_PAGING:
-                mTouchSlop = ViewConfigurationCompat.getScaledPagingTouchSlop(vc);
+                mTouchSlop = vc.getScaledPagingTouchSlop();
                 break;
         }
     }
@@ -1049,7 +1050,7 @@
             return;
         }
         stopScroll();
-        // TODO We should do this switch a dispachLayout pass and animate children. There is a good
+        // TODO We should do this switch a dispatchLayout pass and animate children. There is a good
         // chance that LayoutManagers will re-use views.
         if (mLayout != null) {
             if (mIsAttached) {
@@ -1749,7 +1750,7 @@
         }
         if (!performLayoutChildren) {
             // Reset the layout request eaten counter.
-            // This is necessary since eatRequest calls can be nested in which case the outher
+            // This is necessary since eatRequest calls can be nested in which case the other
             // call will override the inner one.
             // for instance:
             // eat layout for process adapter updates
@@ -2205,7 +2206,7 @@
     }
 
     /**
-     * Logic taken from FocusSarch#isCandidate
+     * Logic taken from FocusSearch#isCandidate
      */
     private boolean isPreferredNextFocusAbsolute(View focused, View next, int direction) {
         mTempRect.set(0, 0, focused.getWidth(), focused.getHeight());
@@ -2462,7 +2463,7 @@
                 if (mIgnoreMotionEventTillDown) {
                     mIgnoreMotionEventTillDown = false;
                 }
-                mScrollPointerId = MotionEventCompat.getPointerId(e, 0);
+                mScrollPointerId = e.getPointerId(0);
                 mInitialTouchX = mLastTouchX = (int) (e.getX() + 0.5f);
                 mInitialTouchY = mLastTouchY = (int) (e.getY() + 0.5f);
 
@@ -2485,21 +2486,21 @@
                 break;
 
             case MotionEventCompat.ACTION_POINTER_DOWN:
-                mScrollPointerId = MotionEventCompat.getPointerId(e, actionIndex);
-                mInitialTouchX = mLastTouchX = (int) (MotionEventCompat.getX(e, actionIndex) + 0.5f);
-                mInitialTouchY = mLastTouchY = (int) (MotionEventCompat.getY(e, actionIndex) + 0.5f);
+                mScrollPointerId = e.getPointerId(actionIndex);
+                mInitialTouchX = mLastTouchX = (int) (e.getX(actionIndex) + 0.5f);
+                mInitialTouchY = mLastTouchY = (int) (e.getY(actionIndex) + 0.5f);
                 break;
 
             case MotionEvent.ACTION_MOVE: {
-                final int index = MotionEventCompat.findPointerIndex(e, mScrollPointerId);
+                final int index = e.findPointerIndex(mScrollPointerId);
                 if (index < 0) {
                     Log.e(TAG, "Error processing scroll; pointer index for id " +
                             mScrollPointerId + " not found. Did any MotionEvents get skipped?");
                     return false;
                 }
 
-                final int x = (int) (MotionEventCompat.getX(e, index) + 0.5f);
-                final int y = (int) (MotionEventCompat.getY(e, index) + 0.5f);
+                final int x = (int) (e.getX(index) + 0.5f);
+                final int y = (int) (e.getY(index) + 0.5f);
                 if (mScrollState != SCROLL_STATE_DRAGGING) {
                     final int dx = x - mInitialTouchX;
                     final int dy = y - mInitialTouchY;
@@ -2577,7 +2578,7 @@
 
         switch (action) {
             case MotionEvent.ACTION_DOWN: {
-                mScrollPointerId = MotionEventCompat.getPointerId(e, 0);
+                mScrollPointerId = e.getPointerId(0);
                 mInitialTouchX = mLastTouchX = (int) (e.getX() + 0.5f);
                 mInitialTouchY = mLastTouchY = (int) (e.getY() + 0.5f);
 
@@ -2592,21 +2593,21 @@
             } break;
 
             case MotionEventCompat.ACTION_POINTER_DOWN: {
-                mScrollPointerId = MotionEventCompat.getPointerId(e, actionIndex);
-                mInitialTouchX = mLastTouchX = (int) (MotionEventCompat.getX(e, actionIndex) + 0.5f);
-                mInitialTouchY = mLastTouchY = (int) (MotionEventCompat.getY(e, actionIndex) + 0.5f);
+                mScrollPointerId = e.getPointerId(actionIndex);
+                mInitialTouchX = mLastTouchX = (int) (e.getX(actionIndex) + 0.5f);
+                mInitialTouchY = mLastTouchY = (int) (e.getY(actionIndex) + 0.5f);
             } break;
 
             case MotionEvent.ACTION_MOVE: {
-                final int index = MotionEventCompat.findPointerIndex(e, mScrollPointerId);
+                final int index = e.findPointerIndex(mScrollPointerId);
                 if (index < 0) {
                     Log.e(TAG, "Error processing scroll; pointer index for id " +
                             mScrollPointerId + " not found. Did any MotionEvents get skipped?");
                     return false;
                 }
 
-                final int x = (int) (MotionEventCompat.getX(e, index) + 0.5f);
-                final int y = (int) (MotionEventCompat.getY(e, index) + 0.5f);
+                final int x = (int) (e.getX(index) + 0.5f);
+                final int y = (int) (e.getY(index) + 0.5f);
                 int dx = mLastTouchX - x;
                 int dy = mLastTouchY - y;
 
@@ -2701,12 +2702,12 @@
 
     private void onPointerUp(MotionEvent e) {
         final int actionIndex = MotionEventCompat.getActionIndex(e);
-        if (MotionEventCompat.getPointerId(e, actionIndex) == mScrollPointerId) {
+        if (e.getPointerId(actionIndex) == mScrollPointerId) {
             // Pick a new pointer to pick up the slack.
             final int newIndex = actionIndex == 0 ? 1 : 0;
-            mScrollPointerId = MotionEventCompat.getPointerId(e, newIndex);
-            mInitialTouchX = mLastTouchX = (int) (MotionEventCompat.getX(e, newIndex) + 0.5f);
-            mInitialTouchY = mLastTouchY = (int) (MotionEventCompat.getY(e, newIndex) + 0.5f);
+            mScrollPointerId = e.getPointerId(newIndex);
+            mInitialTouchX = mLastTouchX = (int) (e.getX(newIndex) + 0.5f);
+            mInitialTouchY = mLastTouchY = (int) (e.getY(newIndex) + 0.5f);
         }
     }
 
@@ -2718,7 +2719,7 @@
         if (mLayoutFrozen) {
             return false;
         }
-        if ((MotionEventCompat.getSource(event) & InputDeviceCompat.SOURCE_CLASS_POINTER) != 0) {
+        if ((event.getSource() & InputDeviceCompat.SOURCE_CLASS_POINTER) != 0) {
             if (event.getAction() == MotionEventCompat.ACTION_SCROLL) {
                 final float vScroll, hScroll;
                 if (mLayout.canScrollVertically()) {
@@ -3546,7 +3547,7 @@
         for (int i = 0; i < count; i++) {
             mItemDecorations.get(i).onDrawOver(c, this, mState);
         }
-        // TODO If padding is not 0 and chilChildrenToPadding is false, to draw glows properly, we
+        // TODO If padding is not 0 and clipChildrenToPadding is false, to draw glows properly, we
         // need find children closest to edges. Not sure if it is worth the effort.
         boolean needsInvalidate = false;
         if (mLeftGlow != null && !mLeftGlow.isFinished()) {
@@ -4792,7 +4793,7 @@
             // if it is not removed, verify the type and id.
             if (holder.isRemoved()) {
                 if (DEBUG && !mState.isPreLayout()) {
-                    throw new IllegalStateException("should not receive a removed view unelss it"
+                    throw new IllegalStateException("should not receive a removed view unless it"
                             + " is pre layout");
                 }
                 return mState.isPreLayout();
@@ -5648,7 +5649,7 @@
 
     /**
      * ViewCacheExtension is a helper class to provide an additional layer of view caching that can
-     * ben controlled by the developer.
+     * be controlled by the developer.
      * <p>
      * When {@link Recycler#getViewForPosition(int)} is called, Recycler checks attached scrap and
      * first level cache to find a matching View. If it cannot find a suitable View, Recycler will
@@ -5727,7 +5728,7 @@
          * have the updated adapter position.
          *
          * Override {@link #onBindViewHolder(ViewHolder, int, List)} instead if Adapter can
-         * handle effcient partial bind.
+         * handle efficient partial bind.
          *
          * @param holder The ViewHolder which should be updated to represent the contents of the
          *        item at the given position in the data set.
@@ -5848,7 +5849,7 @@
         }
 
         /**
-         * Returns the total number of items in the data set hold by the adapter.
+         * Returns the total number of items in the data set held by the adapter.
          *
          * @return The total number of items in this adapter.
          */
@@ -6911,7 +6912,7 @@
         /**
          * <p>Starts a smooth scroll using the provided SmoothScroller.</p>
          * <p>Calling this method will cancel any previous smooth scroll request.</p>
-         * @param smoothScroller Unstance which defines how smooth scroll should be animated
+         * @param smoothScroller Instance which defines how smooth scroll should be animated
          */
         public void startSmoothScroll(SmoothScroller smoothScroller) {
             if (mSmoothScroller != null && smoothScroller != mSmoothScroller
@@ -9506,7 +9507,7 @@
         /**
          * Returns The itemId represented by this ViewHolder.
          *
-         * @return The the item's id if adapter has stable ids, {@link RecyclerView#NO_ID}
+         * @return The item's id if adapter has stable ids, {@link RecyclerView#NO_ID}
          * otherwise
          */
         public final long getItemId() {
@@ -9728,7 +9729,7 @@
         }
 
         /**
-         * @return True if ViewHolder is not refenrenced by RecyclerView animations but has
+         * @return True if ViewHolder is not referenced by RecyclerView animations but has
          * transient state which will prevent it from being recycled.
          */
         private boolean doesTransientStatePreventRecycling() {
@@ -10132,10 +10133,10 @@
          * @param scrollVector The vector that points to the target scroll position
          */
         protected void normalize(PointF scrollVector) {
-            final double magnitute = Math.sqrt(scrollVector.x * scrollVector.x + scrollVector.y *
-                    scrollVector.y);
-            scrollVector.x /= magnitute;
-            scrollVector.y /= magnitute;
+            final double magnitude = Math.sqrt(scrollVector.x * scrollVector.x + scrollVector.y
+                    * scrollVector.y);
+            scrollVector.x /= magnitude;
+            scrollVector.y /= magnitude;
         }
 
         /**
@@ -10156,7 +10157,7 @@
          * provided {@link Action} to define the next scroll.</p>
          *
          * @param dx        Last scroll amount horizontally
-         * @param dy        Last scroll amount verticaully
+         * @param dy        Last scroll amount vertically
          * @param state     Transient state of RecyclerView
          * @param action    If you want to trigger a new smooth scroll and cancel the previous one,
          *                  update this object.
@@ -11215,7 +11216,7 @@
          * be a matching {@link #dispatchAnimationFinished(ViewHolder)} call by the subclass.
          * <p>
          * For {@link #animateChange(ViewHolder, ViewHolder, ItemHolderInfo, ItemHolderInfo)
-         * animateChange()}, sublcass should call this method for both the <code>oldHolder</code>
+         * animateChange()}, subclass should call this method for both the <code>oldHolder</code>
          * and <code>newHolder</code>  (if they are not the same instance).
          *
          * @param viewHolder The ViewHolder whose animation is finished.
@@ -11230,7 +11231,7 @@
 
         /**
          * Called after {@link #dispatchAnimationFinished(ViewHolder)} is called by the
-         * ItemAniamtor.
+         * ItemAnimator.
          *
          * @param viewHolder The ViewHolder whose animation is finished. There might still be other
          *                   animations running on this ViewHolder.
@@ -11252,7 +11253,7 @@
          * {@link #dispatchAnimationStarted(ViewHolder)} call by the subclass.
          * <p>
          * For {@link #animateChange(ViewHolder, ViewHolder, ItemHolderInfo, ItemHolderInfo)
-         * animateChange()}, sublcass should call this method for both the <code>oldHolder</code>
+         * animateChange()}, subclass should call this method for both the <code>oldHolder</code>
          * and <code>newHolder</code> (if they are not the same instance).
          * <p>
          * If your ItemAnimator decides not to animate a ViewHolder, it should call
@@ -11279,7 +11280,7 @@
 
         /**
          * Like {@link #isRunning()}, this method returns whether there are any item
-         * animations currently running. Addtionally, the listener passed in will be called
+         * animations currently running. Additionally, the listener passed in will be called
          * when there are no item animations running, either immediately (before the method
          * returns) if no animations are currently running, or when the currently running
          * animations are {@link #dispatchAnimationsFinished() finished}.
@@ -11413,7 +11414,7 @@
          * structure. You can extend this class if you would like to keep more information about
          * the Views.
          * <p>
-         * If you want to provide your own implementation butstill use `super` methods to record
+         * If you want to provide your own implementation but still use `super` methods to record
          * basic information, you can override {@link #obtainHolderInfo()} to provide your own
          * instances.
          */
diff --git a/v7/recyclerview/src/android/support/v7/widget/helper/ItemTouchHelper.java b/v7/recyclerview/src/android/support/v7/widget/helper/ItemTouchHelper.java
index b64c753..5bbc458 100644
--- a/v7/recyclerview/src/android/support/v7/widget/helper/ItemTouchHelper.java
+++ b/v7/recyclerview/src/android/support/v7/widget/helper/ItemTouchHelper.java
@@ -309,7 +309,7 @@
             }
             final int action = MotionEventCompat.getActionMasked(event);
             if (action == MotionEvent.ACTION_DOWN) {
-                mActivePointerId = MotionEventCompat.getPointerId(event, 0);
+                mActivePointerId = event.getPointerId(0);
                 mInitialTouchX = event.getX();
                 mInitialTouchY = event.getY();
                 obtainVelocityTracker();
@@ -332,7 +332,7 @@
             } else if (mActivePointerId != ACTIVE_POINTER_ID_NONE) {
                 // in a non scroll orientation, if distance change is above threshold, we
                 // can select the item
-                final int index = MotionEventCompat.findPointerIndex(event, mActivePointerId);
+                final int index = event.findPointerIndex(mActivePointerId);
                 if (DEBUG) {
                     Log.d(TAG, "pointer index " + index);
                 }
@@ -360,8 +360,7 @@
                 return;
             }
             final int action = MotionEventCompat.getActionMasked(event);
-            final int activePointerIndex = MotionEventCompat
-                    .findPointerIndex(event, mActivePointerId);
+            final int activePointerIndex = event.findPointerIndex(mActivePointerId);
             if (activePointerIndex >= 0) {
                 checkSelectForSwipe(action, event, activePointerIndex);
             }
@@ -392,12 +391,12 @@
                     break;
                 case MotionEvent.ACTION_POINTER_UP: {
                     final int pointerIndex = MotionEventCompat.getActionIndex(event);
-                    final int pointerId = MotionEventCompat.getPointerId(event, pointerIndex);
+                    final int pointerId = event.getPointerId(pointerIndex);
                     if (pointerId == mActivePointerId) {
                         // This was our active pointer going up. Choose a new
                         // active pointer and adjust accordingly.
                         final int newPointerIndex = pointerIndex == 0 ? 1 : 0;
-                        mActivePointerId = MotionEventCompat.getPointerId(event, newPointerIndex);
+                        mActivePointerId = event.getPointerId(newPointerIndex);
                         updateDxDy(event, mSelectedFlags, pointerIndex);
                     }
                     break;
@@ -922,9 +921,9 @@
         if (mActivePointerId == ACTIVE_POINTER_ID_NONE) {
             return null;
         }
-        final int pointerIndex = MotionEventCompat.findPointerIndex(motionEvent, mActivePointerId);
-        final float dx = MotionEventCompat.getX(motionEvent, pointerIndex) - mInitialTouchX;
-        final float dy = MotionEventCompat.getY(motionEvent, pointerIndex) - mInitialTouchY;
+        final int pointerIndex = motionEvent.findPointerIndex(mActivePointerId);
+        final float dx = motionEvent.getX(pointerIndex) - mInitialTouchX;
+        final float dy = motionEvent.getY(pointerIndex) - mInitialTouchY;
         final float absDx = Math.abs(dx);
         final float absDy = Math.abs(dy);
 
@@ -969,8 +968,8 @@
 
         // mDx and mDy are only set in allowed directions. We use custom x/y here instead of
         // updateDxDy to avoid swiping if user moves more in the other direction
-        final float x = MotionEventCompat.getX(motionEvent, pointerIndex);
-        final float y = MotionEventCompat.getY(motionEvent, pointerIndex);
+        final float x = motionEvent.getX(pointerIndex);
+        final float y = motionEvent.getY(pointerIndex);
 
         // Calculate the distance moved
         final float dx = x - mInitialTouchX;
@@ -999,7 +998,7 @@
             }
         }
         mDx = mDy = 0f;
-        mActivePointerId = MotionEventCompat.getPointerId(motionEvent, 0);
+        mActivePointerId = motionEvent.getPointerId(0);
         select(vh, ACTION_STATE_SWIPE);
         return true;
     }
@@ -1135,8 +1134,8 @@
     }
 
     private void updateDxDy(MotionEvent ev, int directionFlags, int pointerIndex) {
-        final float x = MotionEventCompat.getX(ev, pointerIndex);
-        final float y = MotionEventCompat.getY(ev, pointerIndex);
+        final float x = ev.getX(pointerIndex);
+        final float y = ev.getY(pointerIndex);
 
         // Calculate the distance moved
         mDx = x - mInitialTouchX;
@@ -1370,12 +1369,14 @@
                 ((LEFT | RIGHT) << (2 * DIRECTION_FLAG_COUNT));
 
         private static final Interpolator sDragScrollInterpolator = new Interpolator() {
+            @Override
             public float getInterpolation(float t) {
                 return t * t * t * t * t;
             }
         };
 
         private static final Interpolator sDragViewScrollCapInterpolator = new Interpolator() {
+            @Override
             public float getInterpolation(float t) {
                 t -= 1.0f;
                 return t * t * t * t * t + 1.0f;
@@ -2163,7 +2164,7 @@
      *         public abstract boolean onMove(RecyclerView recyclerView,
      *             ViewHolder viewHolder, ViewHolder target) {
      *             final int fromPos = viewHolder.getAdapterPosition();
-     *             final int toPos = viewHolder.getAdapterPosition();
+     *             final int toPos = target.getAdapterPosition();
      *             // move item in `fromPos` to `toPos` in adapter.
      *             return true;// true if moved, false otherwise
      *         }
@@ -2226,7 +2227,7 @@
          * {@link #setDefaultSwipeDirs(int)}.
          *
          * @param recyclerView The RecyclerView to which the ItemTouchHelper is attached to.
-         * @param viewHolder   The RecyclerView for which the swipe drection is queried.
+         * @param viewHolder   The RecyclerView for which the swipe direction is queried.
          * @return A binary OR of direction flags.
          */
         public int getSwipeDirs(RecyclerView recyclerView, ViewHolder viewHolder) {
@@ -2239,7 +2240,7 @@
          * {@link #setDefaultDragDirs(int)}.
          *
          * @param recyclerView The RecyclerView to which the ItemTouchHelper is attached to.
-         * @param viewHolder   The RecyclerView for which the swipe drection is queried.
+         * @param viewHolder   The RecyclerView for which the swipe direction is queried.
          * @return A binary OR of direction flags.
          */
         public int getDragDirs(RecyclerView recyclerView, ViewHolder viewHolder) {
@@ -2269,15 +2270,14 @@
                     if (!mCallback.hasDragFlag(mRecyclerView, vh)) {
                         return;
                     }
-                    int pointerId = MotionEventCompat.getPointerId(e, 0);
+                    int pointerId = e.getPointerId(0);
                     // Long press is deferred.
                     // Check w/ active pointer id to avoid selecting after motion
                     // event is canceled.
                     if (pointerId == mActivePointerId) {
-                        final int index = MotionEventCompat
-                                .findPointerIndex(e, mActivePointerId);
-                        final float x = MotionEventCompat.getX(e, index);
-                        final float y = MotionEventCompat.getY(e, index);
+                        final int index = e.findPointerIndex(mActivePointerId);
+                        final float x = e.getX(index);
+                        final float y = e.getY(index);
                         mInitialTouchX = x;
                         mInitialTouchY = y;
                         mDx = mDy = 0f;
diff --git a/v7/recyclerview/tests/AndroidManifest.xml b/v7/recyclerview/tests/AndroidManifest.xml
index 0661526..1c8684d 100644
--- a/v7/recyclerview/tests/AndroidManifest.xml
+++ b/v7/recyclerview/tests/AndroidManifest.xml
@@ -17,7 +17,7 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
           xmlns:tools="http://schemas.android.com/tools"
           package="android.support.v7.recyclerview.test">
-    <uses-sdk android:minSdkVersion="7"
+    <uses-sdk android:minSdkVersion="9"
               android:targetSdkVersion="23"
               tools:overrideLibrary="android.support.test,
                       android.app, android.support.test.rule, android.support.test.espresso,
diff --git a/v8/renderscript/Android.mk b/v8/renderscript/Android.mk
index 84f151a..8815a0a 100644
--- a/v8/renderscript/Android.mk
+++ b/v8/renderscript/Android.mk
@@ -31,15 +31,6 @@
 LOCAL_JAVA_LANGUAGE_VERSION := 1.7
 include $(BUILD_STATIC_JAVA_LIBRARY)
 
-# API Check
-# ---------------------------------------------
-support_module := $(LOCAL_MODULE)
-support_module_api_dir := $(LOCAL_PATH)/api
-support_module_src_files := $(LOCAL_SRC_FILES)
-support_module_java_libraries := $(LOCAL_JAVA_LIBRARIES)
-support_module_java_packages := android.support.v8.renderscript
-include $(SUPPORT_API_CHECK)
-
 # TODO: Build the tests as an APK here
 
 include $(call all-makefiles-under, $(LOCAL_PATH))
diff --git a/v8/renderscript/api/23.0.0.txt b/v8/renderscript/api/23.0.0.txt
deleted file mode 100644
index 929bd5f..0000000
--- a/v8/renderscript/api/23.0.0.txt
+++ /dev/null
@@ -1,1011 +0,0 @@
-package android.support.v8.renderscript {
-
-  public class Allocation extends android.support.v8.renderscript.BaseObj {
-    method public void copy1DRangeFrom(int, int, java.lang.Object);
-    method public void copy1DRangeFrom(int, int, int[]);
-    method public void copy1DRangeFrom(int, int, short[]);
-    method public void copy1DRangeFrom(int, int, byte[]);
-    method public void copy1DRangeFrom(int, int, float[]);
-    method public void copy1DRangeFrom(int, int, android.support.v8.renderscript.Allocation, int);
-    method public void copy1DRangeFromUnchecked(int, int, java.lang.Object);
-    method public void copy1DRangeFromUnchecked(int, int, int[]);
-    method public void copy1DRangeFromUnchecked(int, int, short[]);
-    method public void copy1DRangeFromUnchecked(int, int, byte[]);
-    method public void copy1DRangeFromUnchecked(int, int, float[]);
-    method public void copy1DRangeTo(int, int, java.lang.Object);
-    method public void copy1DRangeTo(int, int, int[]);
-    method public void copy1DRangeTo(int, int, short[]);
-    method public void copy1DRangeTo(int, int, byte[]);
-    method public void copy1DRangeTo(int, int, float[]);
-    method public void copy1DRangeToUnchecked(int, int, java.lang.Object);
-    method public void copy1DRangeToUnchecked(int, int, int[]);
-    method public void copy1DRangeToUnchecked(int, int, short[]);
-    method public void copy1DRangeToUnchecked(int, int, byte[]);
-    method public void copy1DRangeToUnchecked(int, int, float[]);
-    method public void copy2DRangeFrom(int, int, int, int, java.lang.Object);
-    method public void copy2DRangeFrom(int, int, int, int, byte[]);
-    method public void copy2DRangeFrom(int, int, int, int, short[]);
-    method public void copy2DRangeFrom(int, int, int, int, int[]);
-    method public void copy2DRangeFrom(int, int, int, int, float[]);
-    method public void copy2DRangeFrom(int, int, int, int, android.support.v8.renderscript.Allocation, int, int);
-    method public void copy2DRangeFrom(int, int, android.graphics.Bitmap);
-    method public void copy2DRangeTo(int, int, int, int, java.lang.Object);
-    method public void copy2DRangeTo(int, int, int, int, byte[]);
-    method public void copy2DRangeTo(int, int, int, int, short[]);
-    method public void copy2DRangeTo(int, int, int, int, int[]);
-    method public void copy2DRangeTo(int, int, int, int, float[]);
-    method public void copy3DRangeFrom(int, int, int, int, int, int, java.lang.Object);
-    method public void copy3DRangeFrom(int, int, int, int, int, int, android.support.v8.renderscript.Allocation, int, int, int);
-    method public void copyFrom(android.support.v8.renderscript.BaseObj[]);
-    method public void copyFrom(java.lang.Object);
-    method public void copyFrom(int[]);
-    method public void copyFrom(short[]);
-    method public void copyFrom(byte[]);
-    method public void copyFrom(float[]);
-    method public void copyFrom(android.graphics.Bitmap);
-    method public void copyFrom(android.support.v8.renderscript.Allocation);
-    method public void copyFromUnchecked(java.lang.Object);
-    method public void copyFromUnchecked(int[]);
-    method public void copyFromUnchecked(short[]);
-    method public void copyFromUnchecked(byte[]);
-    method public void copyFromUnchecked(float[]);
-    method public void copyTo(android.graphics.Bitmap);
-    method public void copyTo(java.lang.Object);
-    method public void copyTo(byte[]);
-    method public void copyTo(short[]);
-    method public void copyTo(int[]);
-    method public void copyTo(float[]);
-    method public static android.support.v8.renderscript.Allocation createCubemapFromBitmap(android.support.v8.renderscript.RenderScript, android.graphics.Bitmap, android.support.v8.renderscript.Allocation.MipmapControl, int);
-    method public static android.support.v8.renderscript.Allocation createCubemapFromBitmap(android.support.v8.renderscript.RenderScript, android.graphics.Bitmap);
-    method public static android.support.v8.renderscript.Allocation createCubemapFromCubeFaces(android.support.v8.renderscript.RenderScript, android.graphics.Bitmap, android.graphics.Bitmap, android.graphics.Bitmap, android.graphics.Bitmap, android.graphics.Bitmap, android.graphics.Bitmap, android.support.v8.renderscript.Allocation.MipmapControl, int);
-    method public static android.support.v8.renderscript.Allocation createCubemapFromCubeFaces(android.support.v8.renderscript.RenderScript, android.graphics.Bitmap, android.graphics.Bitmap, android.graphics.Bitmap, android.graphics.Bitmap, android.graphics.Bitmap, android.graphics.Bitmap);
-    method public static android.support.v8.renderscript.Allocation createFromBitmap(android.support.v8.renderscript.RenderScript, android.graphics.Bitmap, android.support.v8.renderscript.Allocation.MipmapControl, int);
-    method public static android.support.v8.renderscript.Allocation createFromBitmap(android.support.v8.renderscript.RenderScript, android.graphics.Bitmap);
-    method public static android.support.v8.renderscript.Allocation createFromBitmapResource(android.support.v8.renderscript.RenderScript, android.content.res.Resources, int, android.support.v8.renderscript.Allocation.MipmapControl, int);
-    method public static android.support.v8.renderscript.Allocation createFromBitmapResource(android.support.v8.renderscript.RenderScript, android.content.res.Resources, int);
-    method public static android.support.v8.renderscript.Allocation createFromString(android.support.v8.renderscript.RenderScript, java.lang.String, int);
-    method public static android.support.v8.renderscript.Allocation createSized(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element, int, int);
-    method public static android.support.v8.renderscript.Allocation createSized(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element, int);
-    method public static android.support.v8.renderscript.Allocation createTyped(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Type, android.support.v8.renderscript.Allocation.MipmapControl, int);
-    method public static android.support.v8.renderscript.Allocation createTyped(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Type, int);
-    method public static android.support.v8.renderscript.Allocation createTyped(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Type);
-    method public void generateMipmaps();
-    method public int getBytesSize();
-    method public android.support.v8.renderscript.Element getElement();
-    method public long getIncAllocID();
-    method public android.support.v8.renderscript.Type getType();
-    method public int getUsage();
-    method public void ioReceive();
-    method public void ioSend();
-    method public void ioSendOutput();
-    method public void setAutoPadding(boolean);
-    method public void setFromFieldPacker(int, android.support.v8.renderscript.FieldPacker);
-    method public void setFromFieldPacker(int, int, android.support.v8.renderscript.FieldPacker);
-    method public void setIncAllocID(long);
-    method public void setSurface(android.view.Surface);
-    method public void syncAll(int);
-    field public static final int USAGE_GRAPHICS_TEXTURE = 2; // 0x2
-    field public static final int USAGE_IO_INPUT = 32; // 0x20
-    field public static final int USAGE_IO_OUTPUT = 64; // 0x40
-    field public static final int USAGE_SCRIPT = 1; // 0x1
-    field public static final int USAGE_SHARED = 128; // 0x80
-  }
-
-  public static final class Allocation.MipmapControl extends java.lang.Enum {
-    method public static android.support.v8.renderscript.Allocation.MipmapControl valueOf(java.lang.String);
-    method public static final android.support.v8.renderscript.Allocation.MipmapControl[] values();
-    enum_constant public static final android.support.v8.renderscript.Allocation.MipmapControl MIPMAP_FULL;
-    enum_constant public static final android.support.v8.renderscript.Allocation.MipmapControl MIPMAP_NONE;
-    enum_constant public static final android.support.v8.renderscript.Allocation.MipmapControl MIPMAP_ON_SYNC_TO_TEXTURE;
-  }
-
-  public class BaseObj {
-    method public void destroy();
-  }
-
-  public class Byte2 {
-    ctor public Byte2();
-    ctor public Byte2(byte, byte);
-    field public byte x;
-    field public byte y;
-  }
-
-  public class Byte3 {
-    ctor public Byte3();
-    ctor public Byte3(byte, byte, byte);
-    field public byte x;
-    field public byte y;
-    field public byte z;
-  }
-
-  public class Byte4 {
-    ctor public Byte4();
-    ctor public Byte4(byte, byte, byte, byte);
-    field public byte w;
-    field public byte x;
-    field public byte y;
-    field public byte z;
-  }
-
-  public class Double2 {
-    ctor public Double2();
-    ctor public Double2(double, double);
-    field public double x;
-    field public double y;
-  }
-
-  public class Double3 {
-    ctor public Double3();
-    ctor public Double3(double, double, double);
-    field public double x;
-    field public double y;
-    field public double z;
-  }
-
-  public class Double4 {
-    ctor public Double4();
-    ctor public Double4(double, double, double, double);
-    field public double w;
-    field public double x;
-    field public double y;
-    field public double z;
-  }
-
-  public class Element extends android.support.v8.renderscript.BaseObj {
-    method public static android.support.v8.renderscript.Element ALLOCATION(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element A_8(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element BOOLEAN(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element ELEMENT(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element F32(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element F32_2(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element F32_3(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element F32_4(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element F64(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element F64_2(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element F64_3(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element F64_4(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element I16(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element I16_2(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element I16_3(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element I16_4(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element I32(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element I32_2(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element I32_3(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element I32_4(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element I64(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element I64_2(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element I64_3(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element I64_4(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element I8(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element I8_2(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element I8_3(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element I8_4(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element MATRIX_2X2(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element MATRIX_3X3(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element MATRIX_4X4(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element RGBA_4444(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element RGBA_5551(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element RGBA_8888(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element RGB_565(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element RGB_888(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element SAMPLER(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element SCRIPT(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element TYPE(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element U16(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element U16_2(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element U16_3(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element U16_4(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element U32(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element U32_2(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element U32_3(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element U32_4(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element U64(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element U64_2(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element U64_3(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element U64_4(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element U8(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element U8_2(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element U8_3(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element U8_4(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element createPixel(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element.DataType, android.support.v8.renderscript.Element.DataKind);
-    method public static android.support.v8.renderscript.Element createVector(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element.DataType, int);
-    method public int getBytesSize();
-    method public android.support.v8.renderscript.Element.DataKind getDataKind();
-    method public android.support.v8.renderscript.Element.DataType getDataType();
-    method public long getDummyElement(android.support.v8.renderscript.RenderScript);
-    method public android.support.v8.renderscript.Element getSubElement(int);
-    method public int getSubElementArraySize(int);
-    method public int getSubElementCount();
-    method public java.lang.String getSubElementName(int);
-    method public int getSubElementOffsetBytes(int);
-    method public int getVectorSize();
-    method public boolean isCompatible(android.support.v8.renderscript.Element);
-    method public boolean isComplex();
-  }
-
-  public static class Element.Builder {
-    ctor public Element.Builder(android.support.v8.renderscript.RenderScript);
-    method public android.support.v8.renderscript.Element.Builder add(android.support.v8.renderscript.Element, java.lang.String, int);
-    method public android.support.v8.renderscript.Element.Builder add(android.support.v8.renderscript.Element, java.lang.String);
-    method public android.support.v8.renderscript.Element create();
-  }
-
-  public static final class Element.DataKind extends java.lang.Enum {
-    method public static android.support.v8.renderscript.Element.DataKind valueOf(java.lang.String);
-    method public static final android.support.v8.renderscript.Element.DataKind[] values();
-    enum_constant public static final android.support.v8.renderscript.Element.DataKind PIXEL_A;
-    enum_constant public static final android.support.v8.renderscript.Element.DataKind PIXEL_DEPTH;
-    enum_constant public static final android.support.v8.renderscript.Element.DataKind PIXEL_L;
-    enum_constant public static final android.support.v8.renderscript.Element.DataKind PIXEL_LA;
-    enum_constant public static final android.support.v8.renderscript.Element.DataKind PIXEL_RGB;
-    enum_constant public static final android.support.v8.renderscript.Element.DataKind PIXEL_RGBA;
-    enum_constant public static final android.support.v8.renderscript.Element.DataKind PIXEL_YUV;
-    enum_constant public static final android.support.v8.renderscript.Element.DataKind USER;
-  }
-
-  public static final class Element.DataType extends java.lang.Enum {
-    method public static android.support.v8.renderscript.Element.DataType valueOf(java.lang.String);
-    method public static final android.support.v8.renderscript.Element.DataType[] values();
-    enum_constant public static final android.support.v8.renderscript.Element.DataType BOOLEAN;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType FLOAT_32;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType FLOAT_64;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType MATRIX_2X2;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType MATRIX_3X3;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType MATRIX_4X4;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType NONE;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType RS_ALLOCATION;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType RS_ELEMENT;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType RS_SAMPLER;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType RS_SCRIPT;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType RS_TYPE;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType SIGNED_16;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType SIGNED_32;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType SIGNED_64;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType SIGNED_8;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType UNSIGNED_16;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType UNSIGNED_32;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType UNSIGNED_4_4_4_4;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType UNSIGNED_5_5_5_1;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType UNSIGNED_5_6_5;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType UNSIGNED_64;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType UNSIGNED_8;
-  }
-
-  public class FieldPacker {
-    ctor public FieldPacker(int);
-    ctor public FieldPacker(byte[]);
-    method public void addBoolean(boolean);
-    method public void addF32(float);
-    method public void addF32(android.support.v8.renderscript.Float2);
-    method public void addF32(android.support.v8.renderscript.Float3);
-    method public void addF32(android.support.v8.renderscript.Float4);
-    method public void addF64(double);
-    method public void addF64(android.support.v8.renderscript.Double2);
-    method public void addF64(android.support.v8.renderscript.Double3);
-    method public void addF64(android.support.v8.renderscript.Double4);
-    method public void addI16(short);
-    method public void addI16(android.support.v8.renderscript.Short2);
-    method public void addI16(android.support.v8.renderscript.Short3);
-    method public void addI16(android.support.v8.renderscript.Short4);
-    method public void addI32(int);
-    method public void addI32(android.support.v8.renderscript.Int2);
-    method public void addI32(android.support.v8.renderscript.Int3);
-    method public void addI32(android.support.v8.renderscript.Int4);
-    method public void addI64(long);
-    method public void addI64(android.support.v8.renderscript.Long2);
-    method public void addI64(android.support.v8.renderscript.Long3);
-    method public void addI64(android.support.v8.renderscript.Long4);
-    method public void addI8(byte);
-    method public void addI8(android.support.v8.renderscript.Byte2);
-    method public void addI8(android.support.v8.renderscript.Byte3);
-    method public void addI8(android.support.v8.renderscript.Byte4);
-    method public void addMatrix(android.support.v8.renderscript.Matrix4f);
-    method public void addMatrix(android.support.v8.renderscript.Matrix3f);
-    method public void addMatrix(android.support.v8.renderscript.Matrix2f);
-    method public void addObj(android.support.v8.renderscript.BaseObj);
-    method public void addU16(int);
-    method public void addU16(android.support.v8.renderscript.Int2);
-    method public void addU16(android.support.v8.renderscript.Int3);
-    method public void addU16(android.support.v8.renderscript.Int4);
-    method public void addU32(long);
-    method public void addU32(android.support.v8.renderscript.Long2);
-    method public void addU32(android.support.v8.renderscript.Long3);
-    method public void addU32(android.support.v8.renderscript.Long4);
-    method public void addU64(long);
-    method public void addU64(android.support.v8.renderscript.Long2);
-    method public void addU64(android.support.v8.renderscript.Long3);
-    method public void addU64(android.support.v8.renderscript.Long4);
-    method public void addU8(short);
-    method public void addU8(android.support.v8.renderscript.Short2);
-    method public void addU8(android.support.v8.renderscript.Short3);
-    method public void addU8(android.support.v8.renderscript.Short4);
-    method public void align(int);
-    method public final byte[] getData();
-    method public void reset();
-    method public void reset(int);
-    method public void skip(int);
-    method public boolean subBoolean();
-    method public android.support.v8.renderscript.Byte2 subByte2();
-    method public android.support.v8.renderscript.Byte3 subByte3();
-    method public android.support.v8.renderscript.Byte4 subByte4();
-    method public android.support.v8.renderscript.Double2 subDouble2();
-    method public android.support.v8.renderscript.Double3 subDouble3();
-    method public android.support.v8.renderscript.Double4 subDouble4();
-    method public float subF32();
-    method public double subF64();
-    method public android.support.v8.renderscript.Float2 subFloat2();
-    method public android.support.v8.renderscript.Float3 subFloat3();
-    method public android.support.v8.renderscript.Float4 subFloat4();
-    method public short subI16();
-    method public int subI32();
-    method public long subI64();
-    method public byte subI8();
-    method public android.support.v8.renderscript.Int2 subInt2();
-    method public android.support.v8.renderscript.Int3 subInt3();
-    method public android.support.v8.renderscript.Int4 subInt4();
-    method public android.support.v8.renderscript.Long2 subLong2();
-    method public android.support.v8.renderscript.Long3 subLong3();
-    method public android.support.v8.renderscript.Long4 subLong4();
-    method public android.support.v8.renderscript.Matrix2f subMatrix2f();
-    method public android.support.v8.renderscript.Matrix3f subMatrix3f();
-    method public android.support.v8.renderscript.Matrix4f subMatrix4f();
-    method public android.support.v8.renderscript.Short2 subShort2();
-    method public android.support.v8.renderscript.Short3 subShort3();
-    method public android.support.v8.renderscript.Short4 subShort4();
-    method public void subalign(int);
-  }
-
-  public class Float2 {
-    ctor public Float2();
-    ctor public Float2(float, float);
-    field public float x;
-    field public float y;
-  }
-
-  public class Float3 {
-    ctor public Float3();
-    ctor public Float3(float, float, float);
-    field public float x;
-    field public float y;
-    field public float z;
-  }
-
-  public class Float4 {
-    ctor public Float4();
-    ctor public Float4(float, float, float, float);
-    field public float w;
-    field public float x;
-    field public float y;
-    field public float z;
-  }
-
-  public class Int2 {
-    ctor public Int2();
-    ctor public Int2(int, int);
-    field public int x;
-    field public int y;
-  }
-
-  public class Int3 {
-    ctor public Int3();
-    ctor public Int3(int, int, int);
-    field public int x;
-    field public int y;
-    field public int z;
-  }
-
-  public class Int4 {
-    ctor public Int4();
-    ctor public Int4(int, int, int, int);
-    field public int w;
-    field public int x;
-    field public int y;
-    field public int z;
-  }
-
-  public class Long2 {
-    ctor public Long2();
-    ctor public Long2(long, long);
-    field public long x;
-    field public long y;
-  }
-
-  public class Long3 {
-    ctor public Long3();
-    ctor public Long3(long, long, long);
-    field public long x;
-    field public long y;
-    field public long z;
-  }
-
-  public class Long4 {
-    ctor public Long4();
-    ctor public Long4(long, long, long, long);
-    field public long w;
-    field public long x;
-    field public long y;
-    field public long z;
-  }
-
-  public class Matrix2f {
-    ctor public Matrix2f();
-    ctor public Matrix2f(float[]);
-    method public float get(int, int);
-    method public float[] getArray();
-    method public void load(android.support.v8.renderscript.Matrix2f);
-    method public void loadIdentity();
-    method public void loadMultiply(android.support.v8.renderscript.Matrix2f, android.support.v8.renderscript.Matrix2f);
-    method public void loadRotate(float);
-    method public void loadScale(float, float);
-    method public void multiply(android.support.v8.renderscript.Matrix2f);
-    method public void rotate(float);
-    method public void scale(float, float);
-    method public void set(int, int, float);
-    method public void transpose();
-  }
-
-  public class Matrix3f {
-    ctor public Matrix3f();
-    ctor public Matrix3f(float[]);
-    method public float get(int, int);
-    method public float[] getArray();
-    method public void load(android.support.v8.renderscript.Matrix3f);
-    method public void loadIdentity();
-    method public void loadMultiply(android.support.v8.renderscript.Matrix3f, android.support.v8.renderscript.Matrix3f);
-    method public void loadRotate(float, float, float, float);
-    method public void loadRotate(float);
-    method public void loadScale(float, float);
-    method public void loadScale(float, float, float);
-    method public void loadTranslate(float, float);
-    method public void multiply(android.support.v8.renderscript.Matrix3f);
-    method public void rotate(float, float, float, float);
-    method public void rotate(float);
-    method public void scale(float, float);
-    method public void scale(float, float, float);
-    method public void set(int, int, float);
-    method public void translate(float, float);
-    method public void transpose();
-  }
-
-  public class Matrix4f {
-    ctor public Matrix4f();
-    ctor public Matrix4f(float[]);
-    method public float get(int, int);
-    method public float[] getArray();
-    method public boolean inverse();
-    method public boolean inverseTranspose();
-    method public void load(android.support.v8.renderscript.Matrix4f);
-    method public void loadFrustum(float, float, float, float, float, float);
-    method public void loadIdentity();
-    method public void loadMultiply(android.support.v8.renderscript.Matrix4f, android.support.v8.renderscript.Matrix4f);
-    method public void loadOrtho(float, float, float, float, float, float);
-    method public void loadOrthoWindow(int, int);
-    method public void loadPerspective(float, float, float, float);
-    method public void loadProjectionNormalized(int, int);
-    method public void loadRotate(float, float, float, float);
-    method public void loadScale(float, float, float);
-    method public void loadTranslate(float, float, float);
-    method public void multiply(android.support.v8.renderscript.Matrix4f);
-    method public void rotate(float, float, float, float);
-    method public void scale(float, float, float);
-    method public void set(int, int, float);
-    method public void translate(float, float, float);
-    method public void transpose();
-  }
-
-  public class RSDriverException extends android.support.v8.renderscript.RSRuntimeException {
-    ctor public RSDriverException(java.lang.String);
-  }
-
-  public class RSIllegalArgumentException extends android.support.v8.renderscript.RSRuntimeException {
-    ctor public RSIllegalArgumentException(java.lang.String);
-  }
-
-  public class RSInvalidStateException extends android.support.v8.renderscript.RSRuntimeException {
-    ctor public RSInvalidStateException(java.lang.String);
-  }
-
-  public class RSRuntimeException extends java.lang.RuntimeException {
-    ctor public RSRuntimeException(java.lang.String);
-  }
-
-  public class RenderScript {
-    method public void contextDump();
-    method public static android.support.v8.renderscript.RenderScript create(android.content.Context);
-    method public static android.support.v8.renderscript.RenderScript create(android.content.Context, android.support.v8.renderscript.RenderScript.ContextType);
-    method public static android.support.v8.renderscript.RenderScript create(android.content.Context, android.support.v8.renderscript.RenderScript.ContextType, int);
-    method public static android.support.v8.renderscript.RenderScript create(android.content.Context, int, android.support.v8.renderscript.RenderScript.ContextType, int);
-    method public static android.support.v8.renderscript.RenderScript createMultiContext(android.content.Context, android.support.v8.renderscript.RenderScript.ContextType, int, int);
-    method public void destroy();
-    method public void finish();
-    method public static void forceCompat();
-    method public final android.content.Context getApplicationContext();
-    method public android.support.v8.renderscript.RenderScript.RSErrorHandler getErrorHandler();
-    method public android.support.v8.renderscript.RenderScript.RSMessageHandler getMessageHandler();
-    method public static void releaseAllContexts();
-    method public void sendMessage(int, int[]);
-    method public static void setBlackList(java.lang.String);
-    method public void setErrorHandler(android.support.v8.renderscript.RenderScript.RSErrorHandler);
-    method public void setMessageHandler(android.support.v8.renderscript.RenderScript.RSMessageHandler);
-    method public void setPriority(android.support.v8.renderscript.RenderScript.Priority);
-    field public static final int CREATE_FLAG_NONE = 0; // 0x0
-  }
-
-  public static final class RenderScript.ContextType extends java.lang.Enum {
-    method public static android.support.v8.renderscript.RenderScript.ContextType valueOf(java.lang.String);
-    method public static final android.support.v8.renderscript.RenderScript.ContextType[] values();
-    enum_constant public static final android.support.v8.renderscript.RenderScript.ContextType DEBUG;
-    enum_constant public static final android.support.v8.renderscript.RenderScript.ContextType NORMAL;
-    enum_constant public static final android.support.v8.renderscript.RenderScript.ContextType PROFILE;
-  }
-
-  public static final class RenderScript.Priority extends java.lang.Enum {
-    method public static android.support.v8.renderscript.RenderScript.Priority valueOf(java.lang.String);
-    method public static final android.support.v8.renderscript.RenderScript.Priority[] values();
-    enum_constant public static final android.support.v8.renderscript.RenderScript.Priority LOW;
-    enum_constant public static final android.support.v8.renderscript.RenderScript.Priority NORMAL;
-  }
-
-  public static class RenderScript.RSErrorHandler implements java.lang.Runnable {
-    ctor public RenderScript.RSErrorHandler();
-    method public void run();
-    field protected java.lang.String mErrorMessage;
-    field protected int mErrorNum;
-  }
-
-  public static class RenderScript.RSMessageHandler implements java.lang.Runnable {
-    ctor public RenderScript.RSMessageHandler();
-    method public void run();
-    field protected int[] mData;
-    field protected int mID;
-    field protected int mLength;
-  }
-
-  public class Sampler extends android.support.v8.renderscript.BaseObj {
-    method public static android.support.v8.renderscript.Sampler CLAMP_LINEAR(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Sampler CLAMP_LINEAR_MIP_LINEAR(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Sampler CLAMP_NEAREST(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Sampler MIRRORED_REPEAT_LINEAR(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Sampler MIRRORED_REPEAT_NEAREST(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Sampler WRAP_LINEAR(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Sampler WRAP_LINEAR_MIP_LINEAR(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Sampler WRAP_NEAREST(android.support.v8.renderscript.RenderScript);
-    method public float getAnisotropy();
-    method public android.support.v8.renderscript.Sampler.Value getMagnification();
-    method public android.support.v8.renderscript.Sampler.Value getMinification();
-    method public android.support.v8.renderscript.Sampler.Value getWrapS();
-    method public android.support.v8.renderscript.Sampler.Value getWrapT();
-  }
-
-  public static class Sampler.Builder {
-    ctor public Sampler.Builder(android.support.v8.renderscript.RenderScript);
-    method public android.support.v8.renderscript.Sampler create();
-    method public void setAnisotropy(float);
-    method public void setMagnification(android.support.v8.renderscript.Sampler.Value);
-    method public void setMinification(android.support.v8.renderscript.Sampler.Value);
-    method public void setWrapS(android.support.v8.renderscript.Sampler.Value);
-    method public void setWrapT(android.support.v8.renderscript.Sampler.Value);
-  }
-
-  public static final class Sampler.Value extends java.lang.Enum {
-    method public static android.support.v8.renderscript.Sampler.Value valueOf(java.lang.String);
-    method public static final android.support.v8.renderscript.Sampler.Value[] values();
-    enum_constant public static final android.support.v8.renderscript.Sampler.Value CLAMP;
-    enum_constant public static final android.support.v8.renderscript.Sampler.Value LINEAR;
-    enum_constant public static final android.support.v8.renderscript.Sampler.Value LINEAR_MIP_LINEAR;
-    enum_constant public static final android.support.v8.renderscript.Sampler.Value LINEAR_MIP_NEAREST;
-    enum_constant public static final android.support.v8.renderscript.Sampler.Value MIRRORED_REPEAT;
-    enum_constant public static final android.support.v8.renderscript.Sampler.Value NEAREST;
-    enum_constant public static final android.support.v8.renderscript.Sampler.Value WRAP;
-  }
-
-  public class Script extends android.support.v8.renderscript.BaseObj {
-    method public void bindAllocation(android.support.v8.renderscript.Allocation, int);
-    method protected android.support.v8.renderscript.Script.FieldID createFieldID(int, android.support.v8.renderscript.Element);
-    method protected android.support.v8.renderscript.Script.InvokeID createInvokeID(int);
-    method protected android.support.v8.renderscript.Script.KernelID createKernelID(int, int, android.support.v8.renderscript.Element, android.support.v8.renderscript.Element);
-    method protected void forEach(int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.FieldPacker);
-    method protected void forEach(int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.FieldPacker, android.support.v8.renderscript.Script.LaunchOptions);
-    method protected void invoke(int);
-    method protected void invoke(int, android.support.v8.renderscript.FieldPacker);
-    method protected boolean isIncSupp();
-    method protected void setIncSupp(boolean);
-    method public void setTimeZone(java.lang.String);
-    method public void setVar(int, float);
-    method public void setVar(int, double);
-    method public void setVar(int, int);
-    method public void setVar(int, long);
-    method public void setVar(int, boolean);
-    method public void setVar(int, android.support.v8.renderscript.BaseObj);
-    method public void setVar(int, android.support.v8.renderscript.FieldPacker);
-    method public void setVar(int, android.support.v8.renderscript.FieldPacker, android.support.v8.renderscript.Element, int[]);
-  }
-
-  public static class Script.Builder {
-  }
-
-  public static class Script.FieldBase {
-    ctor protected Script.FieldBase();
-    method public android.support.v8.renderscript.Allocation getAllocation();
-    method public android.support.v8.renderscript.Element getElement();
-    method public android.support.v8.renderscript.Type getType();
-    method protected void init(android.support.v8.renderscript.RenderScript, int);
-    method protected void init(android.support.v8.renderscript.RenderScript, int, int);
-    method public void updateAllocation();
-    field protected android.support.v8.renderscript.Allocation mAllocation;
-    field protected android.support.v8.renderscript.Element mElement;
-  }
-
-  public static final class Script.FieldID extends android.support.v8.renderscript.BaseObj {
-  }
-
-  public static final class Script.InvokeID extends android.support.v8.renderscript.BaseObj {
-  }
-
-  public static final class Script.KernelID extends android.support.v8.renderscript.BaseObj {
-  }
-
-  public static final class Script.LaunchOptions {
-    ctor public Script.LaunchOptions();
-    method public int getXEnd();
-    method public int getXStart();
-    method public int getYEnd();
-    method public int getYStart();
-    method public int getZEnd();
-    method public int getZStart();
-    method public android.support.v8.renderscript.Script.LaunchOptions setX(int, int);
-    method public android.support.v8.renderscript.Script.LaunchOptions setY(int, int);
-    method public android.support.v8.renderscript.Script.LaunchOptions setZ(int, int);
-  }
-
-  public class ScriptC extends android.support.v8.renderscript.Script {
-    ctor protected ScriptC(long, android.support.v8.renderscript.RenderScript);
-    ctor protected ScriptC(android.support.v8.renderscript.RenderScript, android.content.res.Resources, int);
-    ctor protected ScriptC(android.support.v8.renderscript.RenderScript, java.lang.String, byte[], byte[]);
-  }
-
-  public final class ScriptGroup extends android.support.v8.renderscript.BaseObj {
-    method public java.lang.Object[] execute(java.lang.Object...);
-    method public deprecated void execute();
-    method public deprecated void setInput(android.support.v8.renderscript.Script.KernelID, android.support.v8.renderscript.Allocation);
-    method public deprecated void setOutput(android.support.v8.renderscript.Script.KernelID, android.support.v8.renderscript.Allocation);
-  }
-
-  public static final class ScriptGroup.Binding {
-    ctor public ScriptGroup.Binding(android.support.v8.renderscript.Script.FieldID, java.lang.Object);
-    method public android.support.v8.renderscript.Script.FieldID getField();
-    method public java.lang.Object getValue();
-  }
-
-  public static final deprecated class ScriptGroup.Builder {
-    ctor public ScriptGroup.Builder(android.support.v8.renderscript.RenderScript);
-    method public android.support.v8.renderscript.ScriptGroup.Builder addConnection(android.support.v8.renderscript.Type, android.support.v8.renderscript.Script.KernelID, android.support.v8.renderscript.Script.FieldID);
-    method public android.support.v8.renderscript.ScriptGroup.Builder addConnection(android.support.v8.renderscript.Type, android.support.v8.renderscript.Script.KernelID, android.support.v8.renderscript.Script.KernelID);
-    method public android.support.v8.renderscript.ScriptGroup.Builder addKernel(android.support.v8.renderscript.Script.KernelID);
-    method public android.support.v8.renderscript.ScriptGroup create();
-  }
-
-  public static final class ScriptGroup.Builder2 {
-    ctor public ScriptGroup.Builder2(android.support.v8.renderscript.RenderScript);
-    method public android.support.v8.renderscript.ScriptGroup.Input addInput();
-    method public android.support.v8.renderscript.ScriptGroup.Closure addInvoke(android.support.v8.renderscript.Script.InvokeID, java.lang.Object...);
-    method public android.support.v8.renderscript.ScriptGroup.Closure addKernel(android.support.v8.renderscript.Script.KernelID, android.support.v8.renderscript.Type, java.lang.Object...);
-    method public android.support.v8.renderscript.ScriptGroup create(java.lang.String, android.support.v8.renderscript.ScriptGroup.Future...);
-  }
-
-  public static final class ScriptGroup.Closure extends android.support.v8.renderscript.BaseObj {
-    method public android.support.v8.renderscript.ScriptGroup.Future getGlobal(android.support.v8.renderscript.Script.FieldID);
-    method public android.support.v8.renderscript.ScriptGroup.Future getReturn();
-  }
-
-  public static final class ScriptGroup.Future {
-  }
-
-  public static final class ScriptGroup.Input {
-  }
-
-  public abstract class ScriptIntrinsic extends android.support.v8.renderscript.Script {
-  }
-
-  public class ScriptIntrinsic3DLUT extends android.support.v8.renderscript.ScriptIntrinsic {
-    ctor protected ScriptIntrinsic3DLUT(long, android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element);
-    method public static android.support.v8.renderscript.ScriptIntrinsic3DLUT create(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element);
-    method public void forEach(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public android.support.v8.renderscript.Script.KernelID getKernelID();
-    method public void setLUT(android.support.v8.renderscript.Allocation);
-  }
-
-  public final class ScriptIntrinsicBLAS extends android.support.v8.renderscript.ScriptIntrinsic {
-    method public void BNNM(android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, int);
-    method public void CGBMV(int, int, int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, int);
-    method public void CGEMM(int, int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation);
-    method public void CGEMV(int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, int);
-    method public void CGERC(android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void CGERU(android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void CHBMV(int, int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, int);
-    method public void CHEMM(int, int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation);
-    method public void CHEMV(int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, int);
-    method public void CHER(int, float, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void CHER2(int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void CHER2K(int, int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, float, android.support.v8.renderscript.Allocation);
-    method public void CHERK(int, int, float, android.support.v8.renderscript.Allocation, float, android.support.v8.renderscript.Allocation);
-    method public void CHPMV(int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, int);
-    method public void CHPR(int, float, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void CHPR2(int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void CSYMM(int, int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation);
-    method public void CSYR2K(int, int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation);
-    method public void CSYRK(int, int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation);
-    method public void CTBMV(int, int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void CTBSV(int, int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void CTPMV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void CTPSV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void CTRMM(int, int, int, int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void CTRMV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void CTRSM(int, int, int, int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void CTRSV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void DGBMV(int, int, int, double, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, double, android.support.v8.renderscript.Allocation, int);
-    method public void DGEMM(int, int, double, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, double, android.support.v8.renderscript.Allocation);
-    method public void DGEMV(int, double, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, double, android.support.v8.renderscript.Allocation, int);
-    method public void DGER(double, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void DSBMV(int, int, double, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, double, android.support.v8.renderscript.Allocation, int);
-    method public void DSPMV(int, double, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, double, android.support.v8.renderscript.Allocation, int);
-    method public void DSPR(int, double, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void DSPR2(int, double, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void DSYMM(int, int, double, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, double, android.support.v8.renderscript.Allocation);
-    method public void DSYMV(int, double, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, double, android.support.v8.renderscript.Allocation, int);
-    method public void DSYR(int, double, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void DSYR2(int, double, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void DSYR2K(int, int, double, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, double, android.support.v8.renderscript.Allocation);
-    method public void DSYRK(int, int, double, android.support.v8.renderscript.Allocation, double, android.support.v8.renderscript.Allocation);
-    method public void DTBMV(int, int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void DTBSV(int, int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void DTPMV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void DTPSV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void DTRMM(int, int, int, int, double, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void DTRMV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void DTRSM(int, int, int, int, double, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void DTRSV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void SGBMV(int, int, int, float, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, float, android.support.v8.renderscript.Allocation, int);
-    method public void SGEMM(int, int, float, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, float, android.support.v8.renderscript.Allocation);
-    method public void SGEMV(int, float, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, float, android.support.v8.renderscript.Allocation, int);
-    method public void SGER(float, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void SSBMV(int, int, float, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, float, android.support.v8.renderscript.Allocation, int);
-    method public void SSPMV(int, float, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, float, android.support.v8.renderscript.Allocation, int);
-    method public void SSPR(int, float, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void SSPR2(int, float, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void SSYMM(int, int, float, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, float, android.support.v8.renderscript.Allocation);
-    method public void SSYMV(int, float, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, float, android.support.v8.renderscript.Allocation, int);
-    method public void SSYR(int, float, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void SSYR2(int, float, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void SSYR2K(int, int, float, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, float, android.support.v8.renderscript.Allocation);
-    method public void SSYRK(int, int, float, android.support.v8.renderscript.Allocation, float, android.support.v8.renderscript.Allocation);
-    method public void STBMV(int, int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void STBSV(int, int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void STPMV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void STPSV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void STRMM(int, int, int, int, float, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void STRMV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void STRSM(int, int, int, int, float, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void STRSV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void ZGBMV(int, int, int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, int);
-    method public void ZGEMM(int, int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation);
-    method public void ZGEMV(int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, int);
-    method public void ZGERC(android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void ZGERU(android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void ZHBMV(int, int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, int);
-    method public void ZHEMM(int, int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation);
-    method public void ZHEMV(int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, int);
-    method public void ZHER(int, double, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void ZHER2(int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void ZHER2K(int, int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, double, android.support.v8.renderscript.Allocation);
-    method public void ZHERK(int, int, double, android.support.v8.renderscript.Allocation, double, android.support.v8.renderscript.Allocation);
-    method public void ZHPMV(int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, int);
-    method public void ZHPR(int, double, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void ZHPR2(int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void ZSYMM(int, int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation);
-    method public void ZSYR2K(int, int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation);
-    method public void ZSYRK(int, int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation);
-    method public void ZTBMV(int, int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void ZTBSV(int, int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void ZTPMV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void ZTPSV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void ZTRMM(int, int, int, int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void ZTRMV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void ZTRSM(int, int, int, int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void ZTRSV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public static android.support.v8.renderscript.ScriptIntrinsicBLAS create(android.support.v8.renderscript.RenderScript);
-    field public static final int CONJ_TRANSPOSE = 113; // 0x71
-    field public static final int LEFT = 141; // 0x8d
-    field public static final int LOWER = 122; // 0x7a
-    field public static final int NON_UNIT = 131; // 0x83
-    field public static final int NO_TRANSPOSE = 111; // 0x6f
-    field public static final int RIGHT = 142; // 0x8e
-    field public static final int TRANSPOSE = 112; // 0x70
-    field public static final int UNIT = 132; // 0x84
-    field public static final int UPPER = 121; // 0x79
-  }
-
-  public class ScriptIntrinsicBlend extends android.support.v8.renderscript.ScriptIntrinsic {
-    method public static android.support.v8.renderscript.ScriptIntrinsicBlend create(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element);
-    method public void forEachAdd(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void forEachClear(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void forEachDst(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void forEachDstAtop(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void forEachDstIn(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void forEachDstOut(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void forEachDstOver(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void forEachMultiply(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void forEachSrc(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void forEachSrcAtop(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void forEachSrcIn(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void forEachSrcOut(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void forEachSrcOver(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void forEachSubtract(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void forEachXor(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public android.support.v8.renderscript.Script.KernelID getKernelIDAdd();
-    method public android.support.v8.renderscript.Script.KernelID getKernelIDClear();
-    method public android.support.v8.renderscript.Script.KernelID getKernelIDDst();
-    method public android.support.v8.renderscript.Script.KernelID getKernelIDDstAtop();
-    method public android.support.v8.renderscript.Script.KernelID getKernelIDDstIn();
-    method public android.support.v8.renderscript.Script.KernelID getKernelIDDstOut();
-    method public android.support.v8.renderscript.Script.KernelID getKernelIDDstOver();
-    method public android.support.v8.renderscript.Script.KernelID getKernelIDMultiply();
-    method public android.support.v8.renderscript.Script.KernelID getKernelIDSrc();
-    method public android.support.v8.renderscript.Script.KernelID getKernelIDSrcAtop();
-    method public android.support.v8.renderscript.Script.KernelID getKernelIDSrcIn();
-    method public android.support.v8.renderscript.Script.KernelID getKernelIDSrcOut();
-    method public android.support.v8.renderscript.Script.KernelID getKernelIDSrcOver();
-    method public android.support.v8.renderscript.Script.KernelID getKernelIDSubtract();
-    method public android.support.v8.renderscript.Script.KernelID getKernelIDXor();
-  }
-
-  public class ScriptIntrinsicBlur extends android.support.v8.renderscript.ScriptIntrinsic {
-    ctor protected ScriptIntrinsicBlur(long, android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.ScriptIntrinsicBlur create(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element);
-    method public void forEach(android.support.v8.renderscript.Allocation);
-    method public android.support.v8.renderscript.Script.FieldID getFieldID_Input();
-    method public android.support.v8.renderscript.Script.KernelID getKernelID();
-    method public void setInput(android.support.v8.renderscript.Allocation);
-    method public void setRadius(float);
-  }
-
-  public class ScriptIntrinsicColorMatrix extends android.support.v8.renderscript.ScriptIntrinsic {
-    ctor protected ScriptIntrinsicColorMatrix(long, android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.ScriptIntrinsicColorMatrix create(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element);
-    method public void forEach(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void forEach(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Script.LaunchOptions);
-    method public android.support.v8.renderscript.Script.KernelID getKernelID();
-    method public void setAdd(android.support.v8.renderscript.Float4);
-    method public void setAdd(float, float, float, float);
-    method public void setColorMatrix(android.support.v8.renderscript.Matrix4f);
-    method public void setColorMatrix(android.support.v8.renderscript.Matrix3f);
-    method public void setGreyscale();
-    method public void setRGBtoYUV();
-    method public void setYUVtoRGB();
-  }
-
-  public class ScriptIntrinsicConvolve3x3 extends android.support.v8.renderscript.ScriptIntrinsic {
-    method public static android.support.v8.renderscript.ScriptIntrinsicConvolve3x3 create(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element);
-    method public void forEach(android.support.v8.renderscript.Allocation);
-    method public void forEach(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Script.LaunchOptions);
-    method public android.support.v8.renderscript.Script.FieldID getFieldID_Input();
-    method public android.support.v8.renderscript.Script.KernelID getKernelID();
-    method public void setCoefficients(float[]);
-    method public void setInput(android.support.v8.renderscript.Allocation);
-  }
-
-  public class ScriptIntrinsicConvolve5x5 extends android.support.v8.renderscript.ScriptIntrinsic {
-    method public static android.support.v8.renderscript.ScriptIntrinsicConvolve5x5 create(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element);
-    method public void forEach(android.support.v8.renderscript.Allocation);
-    method public void forEach(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Script.LaunchOptions);
-    method public android.support.v8.renderscript.Script.FieldID getFieldID_Input();
-    method public android.support.v8.renderscript.Script.KernelID getKernelID();
-    method public void setCoefficients(float[]);
-    method public void setInput(android.support.v8.renderscript.Allocation);
-  }
-
-  public class ScriptIntrinsicHistogram extends android.support.v8.renderscript.ScriptIntrinsic {
-    ctor protected ScriptIntrinsicHistogram(long, android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.ScriptIntrinsicHistogram create(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element);
-    method public void forEach(android.support.v8.renderscript.Allocation);
-    method public void forEach(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Script.LaunchOptions);
-    method public void forEach_Dot(android.support.v8.renderscript.Allocation);
-    method public void forEach_Dot(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Script.LaunchOptions);
-    method public android.support.v8.renderscript.Script.FieldID getFieldID_Input();
-    method public android.support.v8.renderscript.Script.KernelID getKernelID_Separate();
-    method public void setDotCoefficients(float, float, float, float);
-    method public void setOutput(android.support.v8.renderscript.Allocation);
-  }
-
-  public class ScriptIntrinsicLUT extends android.support.v8.renderscript.ScriptIntrinsic {
-    ctor protected ScriptIntrinsicLUT(long, android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.ScriptIntrinsicLUT create(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element);
-    method public void forEach(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public android.support.v8.renderscript.Script.KernelID getKernelID();
-    method public void setAlpha(int, int);
-    method public void setBlue(int, int);
-    method public void setGreen(int, int);
-    method public void setRed(int, int);
-  }
-
-  public class ScriptIntrinsicResize extends android.support.v8.renderscript.ScriptIntrinsic {
-    ctor protected ScriptIntrinsicResize(long, android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.ScriptIntrinsicResize create(android.support.v8.renderscript.RenderScript);
-    method public void forEach_bicubic(android.support.v8.renderscript.Allocation);
-    method public void forEach_bicubic(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Script.LaunchOptions);
-    method public android.support.v8.renderscript.Script.FieldID getFieldID_Input();
-    method public android.support.v8.renderscript.Script.KernelID getKernelID_bicubic();
-    method public void setInput(android.support.v8.renderscript.Allocation);
-  }
-
-  public class ScriptIntrinsicYuvToRGB extends android.support.v8.renderscript.ScriptIntrinsic {
-    method public static android.support.v8.renderscript.ScriptIntrinsicYuvToRGB create(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element);
-    method public void forEach(android.support.v8.renderscript.Allocation);
-    method public android.support.v8.renderscript.Script.FieldID getFieldID_Input();
-    method public android.support.v8.renderscript.Script.KernelID getKernelID();
-    method public void setInput(android.support.v8.renderscript.Allocation);
-  }
-
-  public class Short2 {
-    ctor public Short2();
-    ctor public Short2(short, short);
-    field public short x;
-    field public short y;
-  }
-
-  public class Short3 {
-    ctor public Short3();
-    ctor public Short3(short, short, short);
-    field public short x;
-    field public short y;
-    field public short z;
-  }
-
-  public class Short4 {
-    ctor public Short4();
-    ctor public Short4(short, short, short, short);
-    field public short w;
-    field public short x;
-    field public short y;
-    field public short z;
-  }
-
-  public class Type extends android.support.v8.renderscript.BaseObj {
-    method public static android.support.v8.renderscript.Type createX(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element, int);
-    method public static android.support.v8.renderscript.Type createXY(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element, int, int);
-    method public static android.support.v8.renderscript.Type createXYZ(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element, int, int, int);
-    method public int getCount();
-    method public long getDummyType(android.support.v8.renderscript.RenderScript, long);
-    method public android.support.v8.renderscript.Element getElement();
-    method public int getX();
-    method public int getY();
-    method public int getYuv();
-    method public int getZ();
-    method public boolean hasFaces();
-    method public boolean hasMipmaps();
-  }
-
-  public static class Type.Builder {
-    ctor public Type.Builder(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element);
-    method public android.support.v8.renderscript.Type create();
-    method public android.support.v8.renderscript.Type.Builder setFaces(boolean);
-    method public android.support.v8.renderscript.Type.Builder setMipmaps(boolean);
-    method public android.support.v8.renderscript.Type.Builder setX(int);
-    method public android.support.v8.renderscript.Type.Builder setY(int);
-    method public android.support.v8.renderscript.Type.Builder setYuvFormat(int);
-    method public android.support.v8.renderscript.Type.Builder setZ(int);
-  }
-
-  public static final class Type.CubemapFace extends java.lang.Enum {
-    method public static android.support.v8.renderscript.Type.CubemapFace valueOf(java.lang.String);
-    method public static final android.support.v8.renderscript.Type.CubemapFace[] values();
-    enum_constant public static final android.support.v8.renderscript.Type.CubemapFace NEGATIVE_X;
-    enum_constant public static final android.support.v8.renderscript.Type.CubemapFace NEGATIVE_Y;
-    enum_constant public static final android.support.v8.renderscript.Type.CubemapFace NEGATIVE_Z;
-    enum_constant public static final android.support.v8.renderscript.Type.CubemapFace POSITIVE_X;
-    enum_constant public static final android.support.v8.renderscript.Type.CubemapFace POSITIVE_Y;
-    enum_constant public static final android.support.v8.renderscript.Type.CubemapFace POSITIVE_Z;
-  }
-
-}
-
diff --git a/v8/renderscript/api/23.1.0.txt b/v8/renderscript/api/23.1.0.txt
deleted file mode 100644
index 929bd5f..0000000
--- a/v8/renderscript/api/23.1.0.txt
+++ /dev/null
@@ -1,1011 +0,0 @@
-package android.support.v8.renderscript {
-
-  public class Allocation extends android.support.v8.renderscript.BaseObj {
-    method public void copy1DRangeFrom(int, int, java.lang.Object);
-    method public void copy1DRangeFrom(int, int, int[]);
-    method public void copy1DRangeFrom(int, int, short[]);
-    method public void copy1DRangeFrom(int, int, byte[]);
-    method public void copy1DRangeFrom(int, int, float[]);
-    method public void copy1DRangeFrom(int, int, android.support.v8.renderscript.Allocation, int);
-    method public void copy1DRangeFromUnchecked(int, int, java.lang.Object);
-    method public void copy1DRangeFromUnchecked(int, int, int[]);
-    method public void copy1DRangeFromUnchecked(int, int, short[]);
-    method public void copy1DRangeFromUnchecked(int, int, byte[]);
-    method public void copy1DRangeFromUnchecked(int, int, float[]);
-    method public void copy1DRangeTo(int, int, java.lang.Object);
-    method public void copy1DRangeTo(int, int, int[]);
-    method public void copy1DRangeTo(int, int, short[]);
-    method public void copy1DRangeTo(int, int, byte[]);
-    method public void copy1DRangeTo(int, int, float[]);
-    method public void copy1DRangeToUnchecked(int, int, java.lang.Object);
-    method public void copy1DRangeToUnchecked(int, int, int[]);
-    method public void copy1DRangeToUnchecked(int, int, short[]);
-    method public void copy1DRangeToUnchecked(int, int, byte[]);
-    method public void copy1DRangeToUnchecked(int, int, float[]);
-    method public void copy2DRangeFrom(int, int, int, int, java.lang.Object);
-    method public void copy2DRangeFrom(int, int, int, int, byte[]);
-    method public void copy2DRangeFrom(int, int, int, int, short[]);
-    method public void copy2DRangeFrom(int, int, int, int, int[]);
-    method public void copy2DRangeFrom(int, int, int, int, float[]);
-    method public void copy2DRangeFrom(int, int, int, int, android.support.v8.renderscript.Allocation, int, int);
-    method public void copy2DRangeFrom(int, int, android.graphics.Bitmap);
-    method public void copy2DRangeTo(int, int, int, int, java.lang.Object);
-    method public void copy2DRangeTo(int, int, int, int, byte[]);
-    method public void copy2DRangeTo(int, int, int, int, short[]);
-    method public void copy2DRangeTo(int, int, int, int, int[]);
-    method public void copy2DRangeTo(int, int, int, int, float[]);
-    method public void copy3DRangeFrom(int, int, int, int, int, int, java.lang.Object);
-    method public void copy3DRangeFrom(int, int, int, int, int, int, android.support.v8.renderscript.Allocation, int, int, int);
-    method public void copyFrom(android.support.v8.renderscript.BaseObj[]);
-    method public void copyFrom(java.lang.Object);
-    method public void copyFrom(int[]);
-    method public void copyFrom(short[]);
-    method public void copyFrom(byte[]);
-    method public void copyFrom(float[]);
-    method public void copyFrom(android.graphics.Bitmap);
-    method public void copyFrom(android.support.v8.renderscript.Allocation);
-    method public void copyFromUnchecked(java.lang.Object);
-    method public void copyFromUnchecked(int[]);
-    method public void copyFromUnchecked(short[]);
-    method public void copyFromUnchecked(byte[]);
-    method public void copyFromUnchecked(float[]);
-    method public void copyTo(android.graphics.Bitmap);
-    method public void copyTo(java.lang.Object);
-    method public void copyTo(byte[]);
-    method public void copyTo(short[]);
-    method public void copyTo(int[]);
-    method public void copyTo(float[]);
-    method public static android.support.v8.renderscript.Allocation createCubemapFromBitmap(android.support.v8.renderscript.RenderScript, android.graphics.Bitmap, android.support.v8.renderscript.Allocation.MipmapControl, int);
-    method public static android.support.v8.renderscript.Allocation createCubemapFromBitmap(android.support.v8.renderscript.RenderScript, android.graphics.Bitmap);
-    method public static android.support.v8.renderscript.Allocation createCubemapFromCubeFaces(android.support.v8.renderscript.RenderScript, android.graphics.Bitmap, android.graphics.Bitmap, android.graphics.Bitmap, android.graphics.Bitmap, android.graphics.Bitmap, android.graphics.Bitmap, android.support.v8.renderscript.Allocation.MipmapControl, int);
-    method public static android.support.v8.renderscript.Allocation createCubemapFromCubeFaces(android.support.v8.renderscript.RenderScript, android.graphics.Bitmap, android.graphics.Bitmap, android.graphics.Bitmap, android.graphics.Bitmap, android.graphics.Bitmap, android.graphics.Bitmap);
-    method public static android.support.v8.renderscript.Allocation createFromBitmap(android.support.v8.renderscript.RenderScript, android.graphics.Bitmap, android.support.v8.renderscript.Allocation.MipmapControl, int);
-    method public static android.support.v8.renderscript.Allocation createFromBitmap(android.support.v8.renderscript.RenderScript, android.graphics.Bitmap);
-    method public static android.support.v8.renderscript.Allocation createFromBitmapResource(android.support.v8.renderscript.RenderScript, android.content.res.Resources, int, android.support.v8.renderscript.Allocation.MipmapControl, int);
-    method public static android.support.v8.renderscript.Allocation createFromBitmapResource(android.support.v8.renderscript.RenderScript, android.content.res.Resources, int);
-    method public static android.support.v8.renderscript.Allocation createFromString(android.support.v8.renderscript.RenderScript, java.lang.String, int);
-    method public static android.support.v8.renderscript.Allocation createSized(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element, int, int);
-    method public static android.support.v8.renderscript.Allocation createSized(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element, int);
-    method public static android.support.v8.renderscript.Allocation createTyped(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Type, android.support.v8.renderscript.Allocation.MipmapControl, int);
-    method public static android.support.v8.renderscript.Allocation createTyped(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Type, int);
-    method public static android.support.v8.renderscript.Allocation createTyped(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Type);
-    method public void generateMipmaps();
-    method public int getBytesSize();
-    method public android.support.v8.renderscript.Element getElement();
-    method public long getIncAllocID();
-    method public android.support.v8.renderscript.Type getType();
-    method public int getUsage();
-    method public void ioReceive();
-    method public void ioSend();
-    method public void ioSendOutput();
-    method public void setAutoPadding(boolean);
-    method public void setFromFieldPacker(int, android.support.v8.renderscript.FieldPacker);
-    method public void setFromFieldPacker(int, int, android.support.v8.renderscript.FieldPacker);
-    method public void setIncAllocID(long);
-    method public void setSurface(android.view.Surface);
-    method public void syncAll(int);
-    field public static final int USAGE_GRAPHICS_TEXTURE = 2; // 0x2
-    field public static final int USAGE_IO_INPUT = 32; // 0x20
-    field public static final int USAGE_IO_OUTPUT = 64; // 0x40
-    field public static final int USAGE_SCRIPT = 1; // 0x1
-    field public static final int USAGE_SHARED = 128; // 0x80
-  }
-
-  public static final class Allocation.MipmapControl extends java.lang.Enum {
-    method public static android.support.v8.renderscript.Allocation.MipmapControl valueOf(java.lang.String);
-    method public static final android.support.v8.renderscript.Allocation.MipmapControl[] values();
-    enum_constant public static final android.support.v8.renderscript.Allocation.MipmapControl MIPMAP_FULL;
-    enum_constant public static final android.support.v8.renderscript.Allocation.MipmapControl MIPMAP_NONE;
-    enum_constant public static final android.support.v8.renderscript.Allocation.MipmapControl MIPMAP_ON_SYNC_TO_TEXTURE;
-  }
-
-  public class BaseObj {
-    method public void destroy();
-  }
-
-  public class Byte2 {
-    ctor public Byte2();
-    ctor public Byte2(byte, byte);
-    field public byte x;
-    field public byte y;
-  }
-
-  public class Byte3 {
-    ctor public Byte3();
-    ctor public Byte3(byte, byte, byte);
-    field public byte x;
-    field public byte y;
-    field public byte z;
-  }
-
-  public class Byte4 {
-    ctor public Byte4();
-    ctor public Byte4(byte, byte, byte, byte);
-    field public byte w;
-    field public byte x;
-    field public byte y;
-    field public byte z;
-  }
-
-  public class Double2 {
-    ctor public Double2();
-    ctor public Double2(double, double);
-    field public double x;
-    field public double y;
-  }
-
-  public class Double3 {
-    ctor public Double3();
-    ctor public Double3(double, double, double);
-    field public double x;
-    field public double y;
-    field public double z;
-  }
-
-  public class Double4 {
-    ctor public Double4();
-    ctor public Double4(double, double, double, double);
-    field public double w;
-    field public double x;
-    field public double y;
-    field public double z;
-  }
-
-  public class Element extends android.support.v8.renderscript.BaseObj {
-    method public static android.support.v8.renderscript.Element ALLOCATION(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element A_8(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element BOOLEAN(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element ELEMENT(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element F32(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element F32_2(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element F32_3(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element F32_4(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element F64(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element F64_2(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element F64_3(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element F64_4(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element I16(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element I16_2(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element I16_3(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element I16_4(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element I32(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element I32_2(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element I32_3(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element I32_4(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element I64(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element I64_2(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element I64_3(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element I64_4(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element I8(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element I8_2(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element I8_3(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element I8_4(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element MATRIX_2X2(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element MATRIX_3X3(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element MATRIX_4X4(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element RGBA_4444(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element RGBA_5551(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element RGBA_8888(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element RGB_565(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element RGB_888(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element SAMPLER(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element SCRIPT(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element TYPE(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element U16(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element U16_2(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element U16_3(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element U16_4(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element U32(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element U32_2(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element U32_3(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element U32_4(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element U64(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element U64_2(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element U64_3(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element U64_4(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element U8(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element U8_2(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element U8_3(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element U8_4(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element createPixel(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element.DataType, android.support.v8.renderscript.Element.DataKind);
-    method public static android.support.v8.renderscript.Element createVector(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element.DataType, int);
-    method public int getBytesSize();
-    method public android.support.v8.renderscript.Element.DataKind getDataKind();
-    method public android.support.v8.renderscript.Element.DataType getDataType();
-    method public long getDummyElement(android.support.v8.renderscript.RenderScript);
-    method public android.support.v8.renderscript.Element getSubElement(int);
-    method public int getSubElementArraySize(int);
-    method public int getSubElementCount();
-    method public java.lang.String getSubElementName(int);
-    method public int getSubElementOffsetBytes(int);
-    method public int getVectorSize();
-    method public boolean isCompatible(android.support.v8.renderscript.Element);
-    method public boolean isComplex();
-  }
-
-  public static class Element.Builder {
-    ctor public Element.Builder(android.support.v8.renderscript.RenderScript);
-    method public android.support.v8.renderscript.Element.Builder add(android.support.v8.renderscript.Element, java.lang.String, int);
-    method public android.support.v8.renderscript.Element.Builder add(android.support.v8.renderscript.Element, java.lang.String);
-    method public android.support.v8.renderscript.Element create();
-  }
-
-  public static final class Element.DataKind extends java.lang.Enum {
-    method public static android.support.v8.renderscript.Element.DataKind valueOf(java.lang.String);
-    method public static final android.support.v8.renderscript.Element.DataKind[] values();
-    enum_constant public static final android.support.v8.renderscript.Element.DataKind PIXEL_A;
-    enum_constant public static final android.support.v8.renderscript.Element.DataKind PIXEL_DEPTH;
-    enum_constant public static final android.support.v8.renderscript.Element.DataKind PIXEL_L;
-    enum_constant public static final android.support.v8.renderscript.Element.DataKind PIXEL_LA;
-    enum_constant public static final android.support.v8.renderscript.Element.DataKind PIXEL_RGB;
-    enum_constant public static final android.support.v8.renderscript.Element.DataKind PIXEL_RGBA;
-    enum_constant public static final android.support.v8.renderscript.Element.DataKind PIXEL_YUV;
-    enum_constant public static final android.support.v8.renderscript.Element.DataKind USER;
-  }
-
-  public static final class Element.DataType extends java.lang.Enum {
-    method public static android.support.v8.renderscript.Element.DataType valueOf(java.lang.String);
-    method public static final android.support.v8.renderscript.Element.DataType[] values();
-    enum_constant public static final android.support.v8.renderscript.Element.DataType BOOLEAN;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType FLOAT_32;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType FLOAT_64;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType MATRIX_2X2;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType MATRIX_3X3;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType MATRIX_4X4;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType NONE;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType RS_ALLOCATION;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType RS_ELEMENT;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType RS_SAMPLER;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType RS_SCRIPT;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType RS_TYPE;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType SIGNED_16;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType SIGNED_32;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType SIGNED_64;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType SIGNED_8;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType UNSIGNED_16;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType UNSIGNED_32;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType UNSIGNED_4_4_4_4;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType UNSIGNED_5_5_5_1;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType UNSIGNED_5_6_5;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType UNSIGNED_64;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType UNSIGNED_8;
-  }
-
-  public class FieldPacker {
-    ctor public FieldPacker(int);
-    ctor public FieldPacker(byte[]);
-    method public void addBoolean(boolean);
-    method public void addF32(float);
-    method public void addF32(android.support.v8.renderscript.Float2);
-    method public void addF32(android.support.v8.renderscript.Float3);
-    method public void addF32(android.support.v8.renderscript.Float4);
-    method public void addF64(double);
-    method public void addF64(android.support.v8.renderscript.Double2);
-    method public void addF64(android.support.v8.renderscript.Double3);
-    method public void addF64(android.support.v8.renderscript.Double4);
-    method public void addI16(short);
-    method public void addI16(android.support.v8.renderscript.Short2);
-    method public void addI16(android.support.v8.renderscript.Short3);
-    method public void addI16(android.support.v8.renderscript.Short4);
-    method public void addI32(int);
-    method public void addI32(android.support.v8.renderscript.Int2);
-    method public void addI32(android.support.v8.renderscript.Int3);
-    method public void addI32(android.support.v8.renderscript.Int4);
-    method public void addI64(long);
-    method public void addI64(android.support.v8.renderscript.Long2);
-    method public void addI64(android.support.v8.renderscript.Long3);
-    method public void addI64(android.support.v8.renderscript.Long4);
-    method public void addI8(byte);
-    method public void addI8(android.support.v8.renderscript.Byte2);
-    method public void addI8(android.support.v8.renderscript.Byte3);
-    method public void addI8(android.support.v8.renderscript.Byte4);
-    method public void addMatrix(android.support.v8.renderscript.Matrix4f);
-    method public void addMatrix(android.support.v8.renderscript.Matrix3f);
-    method public void addMatrix(android.support.v8.renderscript.Matrix2f);
-    method public void addObj(android.support.v8.renderscript.BaseObj);
-    method public void addU16(int);
-    method public void addU16(android.support.v8.renderscript.Int2);
-    method public void addU16(android.support.v8.renderscript.Int3);
-    method public void addU16(android.support.v8.renderscript.Int4);
-    method public void addU32(long);
-    method public void addU32(android.support.v8.renderscript.Long2);
-    method public void addU32(android.support.v8.renderscript.Long3);
-    method public void addU32(android.support.v8.renderscript.Long4);
-    method public void addU64(long);
-    method public void addU64(android.support.v8.renderscript.Long2);
-    method public void addU64(android.support.v8.renderscript.Long3);
-    method public void addU64(android.support.v8.renderscript.Long4);
-    method public void addU8(short);
-    method public void addU8(android.support.v8.renderscript.Short2);
-    method public void addU8(android.support.v8.renderscript.Short3);
-    method public void addU8(android.support.v8.renderscript.Short4);
-    method public void align(int);
-    method public final byte[] getData();
-    method public void reset();
-    method public void reset(int);
-    method public void skip(int);
-    method public boolean subBoolean();
-    method public android.support.v8.renderscript.Byte2 subByte2();
-    method public android.support.v8.renderscript.Byte3 subByte3();
-    method public android.support.v8.renderscript.Byte4 subByte4();
-    method public android.support.v8.renderscript.Double2 subDouble2();
-    method public android.support.v8.renderscript.Double3 subDouble3();
-    method public android.support.v8.renderscript.Double4 subDouble4();
-    method public float subF32();
-    method public double subF64();
-    method public android.support.v8.renderscript.Float2 subFloat2();
-    method public android.support.v8.renderscript.Float3 subFloat3();
-    method public android.support.v8.renderscript.Float4 subFloat4();
-    method public short subI16();
-    method public int subI32();
-    method public long subI64();
-    method public byte subI8();
-    method public android.support.v8.renderscript.Int2 subInt2();
-    method public android.support.v8.renderscript.Int3 subInt3();
-    method public android.support.v8.renderscript.Int4 subInt4();
-    method public android.support.v8.renderscript.Long2 subLong2();
-    method public android.support.v8.renderscript.Long3 subLong3();
-    method public android.support.v8.renderscript.Long4 subLong4();
-    method public android.support.v8.renderscript.Matrix2f subMatrix2f();
-    method public android.support.v8.renderscript.Matrix3f subMatrix3f();
-    method public android.support.v8.renderscript.Matrix4f subMatrix4f();
-    method public android.support.v8.renderscript.Short2 subShort2();
-    method public android.support.v8.renderscript.Short3 subShort3();
-    method public android.support.v8.renderscript.Short4 subShort4();
-    method public void subalign(int);
-  }
-
-  public class Float2 {
-    ctor public Float2();
-    ctor public Float2(float, float);
-    field public float x;
-    field public float y;
-  }
-
-  public class Float3 {
-    ctor public Float3();
-    ctor public Float3(float, float, float);
-    field public float x;
-    field public float y;
-    field public float z;
-  }
-
-  public class Float4 {
-    ctor public Float4();
-    ctor public Float4(float, float, float, float);
-    field public float w;
-    field public float x;
-    field public float y;
-    field public float z;
-  }
-
-  public class Int2 {
-    ctor public Int2();
-    ctor public Int2(int, int);
-    field public int x;
-    field public int y;
-  }
-
-  public class Int3 {
-    ctor public Int3();
-    ctor public Int3(int, int, int);
-    field public int x;
-    field public int y;
-    field public int z;
-  }
-
-  public class Int4 {
-    ctor public Int4();
-    ctor public Int4(int, int, int, int);
-    field public int w;
-    field public int x;
-    field public int y;
-    field public int z;
-  }
-
-  public class Long2 {
-    ctor public Long2();
-    ctor public Long2(long, long);
-    field public long x;
-    field public long y;
-  }
-
-  public class Long3 {
-    ctor public Long3();
-    ctor public Long3(long, long, long);
-    field public long x;
-    field public long y;
-    field public long z;
-  }
-
-  public class Long4 {
-    ctor public Long4();
-    ctor public Long4(long, long, long, long);
-    field public long w;
-    field public long x;
-    field public long y;
-    field public long z;
-  }
-
-  public class Matrix2f {
-    ctor public Matrix2f();
-    ctor public Matrix2f(float[]);
-    method public float get(int, int);
-    method public float[] getArray();
-    method public void load(android.support.v8.renderscript.Matrix2f);
-    method public void loadIdentity();
-    method public void loadMultiply(android.support.v8.renderscript.Matrix2f, android.support.v8.renderscript.Matrix2f);
-    method public void loadRotate(float);
-    method public void loadScale(float, float);
-    method public void multiply(android.support.v8.renderscript.Matrix2f);
-    method public void rotate(float);
-    method public void scale(float, float);
-    method public void set(int, int, float);
-    method public void transpose();
-  }
-
-  public class Matrix3f {
-    ctor public Matrix3f();
-    ctor public Matrix3f(float[]);
-    method public float get(int, int);
-    method public float[] getArray();
-    method public void load(android.support.v8.renderscript.Matrix3f);
-    method public void loadIdentity();
-    method public void loadMultiply(android.support.v8.renderscript.Matrix3f, android.support.v8.renderscript.Matrix3f);
-    method public void loadRotate(float, float, float, float);
-    method public void loadRotate(float);
-    method public void loadScale(float, float);
-    method public void loadScale(float, float, float);
-    method public void loadTranslate(float, float);
-    method public void multiply(android.support.v8.renderscript.Matrix3f);
-    method public void rotate(float, float, float, float);
-    method public void rotate(float);
-    method public void scale(float, float);
-    method public void scale(float, float, float);
-    method public void set(int, int, float);
-    method public void translate(float, float);
-    method public void transpose();
-  }
-
-  public class Matrix4f {
-    ctor public Matrix4f();
-    ctor public Matrix4f(float[]);
-    method public float get(int, int);
-    method public float[] getArray();
-    method public boolean inverse();
-    method public boolean inverseTranspose();
-    method public void load(android.support.v8.renderscript.Matrix4f);
-    method public void loadFrustum(float, float, float, float, float, float);
-    method public void loadIdentity();
-    method public void loadMultiply(android.support.v8.renderscript.Matrix4f, android.support.v8.renderscript.Matrix4f);
-    method public void loadOrtho(float, float, float, float, float, float);
-    method public void loadOrthoWindow(int, int);
-    method public void loadPerspective(float, float, float, float);
-    method public void loadProjectionNormalized(int, int);
-    method public void loadRotate(float, float, float, float);
-    method public void loadScale(float, float, float);
-    method public void loadTranslate(float, float, float);
-    method public void multiply(android.support.v8.renderscript.Matrix4f);
-    method public void rotate(float, float, float, float);
-    method public void scale(float, float, float);
-    method public void set(int, int, float);
-    method public void translate(float, float, float);
-    method public void transpose();
-  }
-
-  public class RSDriverException extends android.support.v8.renderscript.RSRuntimeException {
-    ctor public RSDriverException(java.lang.String);
-  }
-
-  public class RSIllegalArgumentException extends android.support.v8.renderscript.RSRuntimeException {
-    ctor public RSIllegalArgumentException(java.lang.String);
-  }
-
-  public class RSInvalidStateException extends android.support.v8.renderscript.RSRuntimeException {
-    ctor public RSInvalidStateException(java.lang.String);
-  }
-
-  public class RSRuntimeException extends java.lang.RuntimeException {
-    ctor public RSRuntimeException(java.lang.String);
-  }
-
-  public class RenderScript {
-    method public void contextDump();
-    method public static android.support.v8.renderscript.RenderScript create(android.content.Context);
-    method public static android.support.v8.renderscript.RenderScript create(android.content.Context, android.support.v8.renderscript.RenderScript.ContextType);
-    method public static android.support.v8.renderscript.RenderScript create(android.content.Context, android.support.v8.renderscript.RenderScript.ContextType, int);
-    method public static android.support.v8.renderscript.RenderScript create(android.content.Context, int, android.support.v8.renderscript.RenderScript.ContextType, int);
-    method public static android.support.v8.renderscript.RenderScript createMultiContext(android.content.Context, android.support.v8.renderscript.RenderScript.ContextType, int, int);
-    method public void destroy();
-    method public void finish();
-    method public static void forceCompat();
-    method public final android.content.Context getApplicationContext();
-    method public android.support.v8.renderscript.RenderScript.RSErrorHandler getErrorHandler();
-    method public android.support.v8.renderscript.RenderScript.RSMessageHandler getMessageHandler();
-    method public static void releaseAllContexts();
-    method public void sendMessage(int, int[]);
-    method public static void setBlackList(java.lang.String);
-    method public void setErrorHandler(android.support.v8.renderscript.RenderScript.RSErrorHandler);
-    method public void setMessageHandler(android.support.v8.renderscript.RenderScript.RSMessageHandler);
-    method public void setPriority(android.support.v8.renderscript.RenderScript.Priority);
-    field public static final int CREATE_FLAG_NONE = 0; // 0x0
-  }
-
-  public static final class RenderScript.ContextType extends java.lang.Enum {
-    method public static android.support.v8.renderscript.RenderScript.ContextType valueOf(java.lang.String);
-    method public static final android.support.v8.renderscript.RenderScript.ContextType[] values();
-    enum_constant public static final android.support.v8.renderscript.RenderScript.ContextType DEBUG;
-    enum_constant public static final android.support.v8.renderscript.RenderScript.ContextType NORMAL;
-    enum_constant public static final android.support.v8.renderscript.RenderScript.ContextType PROFILE;
-  }
-
-  public static final class RenderScript.Priority extends java.lang.Enum {
-    method public static android.support.v8.renderscript.RenderScript.Priority valueOf(java.lang.String);
-    method public static final android.support.v8.renderscript.RenderScript.Priority[] values();
-    enum_constant public static final android.support.v8.renderscript.RenderScript.Priority LOW;
-    enum_constant public static final android.support.v8.renderscript.RenderScript.Priority NORMAL;
-  }
-
-  public static class RenderScript.RSErrorHandler implements java.lang.Runnable {
-    ctor public RenderScript.RSErrorHandler();
-    method public void run();
-    field protected java.lang.String mErrorMessage;
-    field protected int mErrorNum;
-  }
-
-  public static class RenderScript.RSMessageHandler implements java.lang.Runnable {
-    ctor public RenderScript.RSMessageHandler();
-    method public void run();
-    field protected int[] mData;
-    field protected int mID;
-    field protected int mLength;
-  }
-
-  public class Sampler extends android.support.v8.renderscript.BaseObj {
-    method public static android.support.v8.renderscript.Sampler CLAMP_LINEAR(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Sampler CLAMP_LINEAR_MIP_LINEAR(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Sampler CLAMP_NEAREST(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Sampler MIRRORED_REPEAT_LINEAR(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Sampler MIRRORED_REPEAT_NEAREST(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Sampler WRAP_LINEAR(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Sampler WRAP_LINEAR_MIP_LINEAR(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Sampler WRAP_NEAREST(android.support.v8.renderscript.RenderScript);
-    method public float getAnisotropy();
-    method public android.support.v8.renderscript.Sampler.Value getMagnification();
-    method public android.support.v8.renderscript.Sampler.Value getMinification();
-    method public android.support.v8.renderscript.Sampler.Value getWrapS();
-    method public android.support.v8.renderscript.Sampler.Value getWrapT();
-  }
-
-  public static class Sampler.Builder {
-    ctor public Sampler.Builder(android.support.v8.renderscript.RenderScript);
-    method public android.support.v8.renderscript.Sampler create();
-    method public void setAnisotropy(float);
-    method public void setMagnification(android.support.v8.renderscript.Sampler.Value);
-    method public void setMinification(android.support.v8.renderscript.Sampler.Value);
-    method public void setWrapS(android.support.v8.renderscript.Sampler.Value);
-    method public void setWrapT(android.support.v8.renderscript.Sampler.Value);
-  }
-
-  public static final class Sampler.Value extends java.lang.Enum {
-    method public static android.support.v8.renderscript.Sampler.Value valueOf(java.lang.String);
-    method public static final android.support.v8.renderscript.Sampler.Value[] values();
-    enum_constant public static final android.support.v8.renderscript.Sampler.Value CLAMP;
-    enum_constant public static final android.support.v8.renderscript.Sampler.Value LINEAR;
-    enum_constant public static final android.support.v8.renderscript.Sampler.Value LINEAR_MIP_LINEAR;
-    enum_constant public static final android.support.v8.renderscript.Sampler.Value LINEAR_MIP_NEAREST;
-    enum_constant public static final android.support.v8.renderscript.Sampler.Value MIRRORED_REPEAT;
-    enum_constant public static final android.support.v8.renderscript.Sampler.Value NEAREST;
-    enum_constant public static final android.support.v8.renderscript.Sampler.Value WRAP;
-  }
-
-  public class Script extends android.support.v8.renderscript.BaseObj {
-    method public void bindAllocation(android.support.v8.renderscript.Allocation, int);
-    method protected android.support.v8.renderscript.Script.FieldID createFieldID(int, android.support.v8.renderscript.Element);
-    method protected android.support.v8.renderscript.Script.InvokeID createInvokeID(int);
-    method protected android.support.v8.renderscript.Script.KernelID createKernelID(int, int, android.support.v8.renderscript.Element, android.support.v8.renderscript.Element);
-    method protected void forEach(int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.FieldPacker);
-    method protected void forEach(int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.FieldPacker, android.support.v8.renderscript.Script.LaunchOptions);
-    method protected void invoke(int);
-    method protected void invoke(int, android.support.v8.renderscript.FieldPacker);
-    method protected boolean isIncSupp();
-    method protected void setIncSupp(boolean);
-    method public void setTimeZone(java.lang.String);
-    method public void setVar(int, float);
-    method public void setVar(int, double);
-    method public void setVar(int, int);
-    method public void setVar(int, long);
-    method public void setVar(int, boolean);
-    method public void setVar(int, android.support.v8.renderscript.BaseObj);
-    method public void setVar(int, android.support.v8.renderscript.FieldPacker);
-    method public void setVar(int, android.support.v8.renderscript.FieldPacker, android.support.v8.renderscript.Element, int[]);
-  }
-
-  public static class Script.Builder {
-  }
-
-  public static class Script.FieldBase {
-    ctor protected Script.FieldBase();
-    method public android.support.v8.renderscript.Allocation getAllocation();
-    method public android.support.v8.renderscript.Element getElement();
-    method public android.support.v8.renderscript.Type getType();
-    method protected void init(android.support.v8.renderscript.RenderScript, int);
-    method protected void init(android.support.v8.renderscript.RenderScript, int, int);
-    method public void updateAllocation();
-    field protected android.support.v8.renderscript.Allocation mAllocation;
-    field protected android.support.v8.renderscript.Element mElement;
-  }
-
-  public static final class Script.FieldID extends android.support.v8.renderscript.BaseObj {
-  }
-
-  public static final class Script.InvokeID extends android.support.v8.renderscript.BaseObj {
-  }
-
-  public static final class Script.KernelID extends android.support.v8.renderscript.BaseObj {
-  }
-
-  public static final class Script.LaunchOptions {
-    ctor public Script.LaunchOptions();
-    method public int getXEnd();
-    method public int getXStart();
-    method public int getYEnd();
-    method public int getYStart();
-    method public int getZEnd();
-    method public int getZStart();
-    method public android.support.v8.renderscript.Script.LaunchOptions setX(int, int);
-    method public android.support.v8.renderscript.Script.LaunchOptions setY(int, int);
-    method public android.support.v8.renderscript.Script.LaunchOptions setZ(int, int);
-  }
-
-  public class ScriptC extends android.support.v8.renderscript.Script {
-    ctor protected ScriptC(long, android.support.v8.renderscript.RenderScript);
-    ctor protected ScriptC(android.support.v8.renderscript.RenderScript, android.content.res.Resources, int);
-    ctor protected ScriptC(android.support.v8.renderscript.RenderScript, java.lang.String, byte[], byte[]);
-  }
-
-  public final class ScriptGroup extends android.support.v8.renderscript.BaseObj {
-    method public java.lang.Object[] execute(java.lang.Object...);
-    method public deprecated void execute();
-    method public deprecated void setInput(android.support.v8.renderscript.Script.KernelID, android.support.v8.renderscript.Allocation);
-    method public deprecated void setOutput(android.support.v8.renderscript.Script.KernelID, android.support.v8.renderscript.Allocation);
-  }
-
-  public static final class ScriptGroup.Binding {
-    ctor public ScriptGroup.Binding(android.support.v8.renderscript.Script.FieldID, java.lang.Object);
-    method public android.support.v8.renderscript.Script.FieldID getField();
-    method public java.lang.Object getValue();
-  }
-
-  public static final deprecated class ScriptGroup.Builder {
-    ctor public ScriptGroup.Builder(android.support.v8.renderscript.RenderScript);
-    method public android.support.v8.renderscript.ScriptGroup.Builder addConnection(android.support.v8.renderscript.Type, android.support.v8.renderscript.Script.KernelID, android.support.v8.renderscript.Script.FieldID);
-    method public android.support.v8.renderscript.ScriptGroup.Builder addConnection(android.support.v8.renderscript.Type, android.support.v8.renderscript.Script.KernelID, android.support.v8.renderscript.Script.KernelID);
-    method public android.support.v8.renderscript.ScriptGroup.Builder addKernel(android.support.v8.renderscript.Script.KernelID);
-    method public android.support.v8.renderscript.ScriptGroup create();
-  }
-
-  public static final class ScriptGroup.Builder2 {
-    ctor public ScriptGroup.Builder2(android.support.v8.renderscript.RenderScript);
-    method public android.support.v8.renderscript.ScriptGroup.Input addInput();
-    method public android.support.v8.renderscript.ScriptGroup.Closure addInvoke(android.support.v8.renderscript.Script.InvokeID, java.lang.Object...);
-    method public android.support.v8.renderscript.ScriptGroup.Closure addKernel(android.support.v8.renderscript.Script.KernelID, android.support.v8.renderscript.Type, java.lang.Object...);
-    method public android.support.v8.renderscript.ScriptGroup create(java.lang.String, android.support.v8.renderscript.ScriptGroup.Future...);
-  }
-
-  public static final class ScriptGroup.Closure extends android.support.v8.renderscript.BaseObj {
-    method public android.support.v8.renderscript.ScriptGroup.Future getGlobal(android.support.v8.renderscript.Script.FieldID);
-    method public android.support.v8.renderscript.ScriptGroup.Future getReturn();
-  }
-
-  public static final class ScriptGroup.Future {
-  }
-
-  public static final class ScriptGroup.Input {
-  }
-
-  public abstract class ScriptIntrinsic extends android.support.v8.renderscript.Script {
-  }
-
-  public class ScriptIntrinsic3DLUT extends android.support.v8.renderscript.ScriptIntrinsic {
-    ctor protected ScriptIntrinsic3DLUT(long, android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element);
-    method public static android.support.v8.renderscript.ScriptIntrinsic3DLUT create(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element);
-    method public void forEach(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public android.support.v8.renderscript.Script.KernelID getKernelID();
-    method public void setLUT(android.support.v8.renderscript.Allocation);
-  }
-
-  public final class ScriptIntrinsicBLAS extends android.support.v8.renderscript.ScriptIntrinsic {
-    method public void BNNM(android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, int);
-    method public void CGBMV(int, int, int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, int);
-    method public void CGEMM(int, int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation);
-    method public void CGEMV(int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, int);
-    method public void CGERC(android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void CGERU(android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void CHBMV(int, int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, int);
-    method public void CHEMM(int, int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation);
-    method public void CHEMV(int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, int);
-    method public void CHER(int, float, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void CHER2(int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void CHER2K(int, int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, float, android.support.v8.renderscript.Allocation);
-    method public void CHERK(int, int, float, android.support.v8.renderscript.Allocation, float, android.support.v8.renderscript.Allocation);
-    method public void CHPMV(int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, int);
-    method public void CHPR(int, float, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void CHPR2(int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void CSYMM(int, int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation);
-    method public void CSYR2K(int, int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation);
-    method public void CSYRK(int, int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation);
-    method public void CTBMV(int, int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void CTBSV(int, int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void CTPMV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void CTPSV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void CTRMM(int, int, int, int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void CTRMV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void CTRSM(int, int, int, int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void CTRSV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void DGBMV(int, int, int, double, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, double, android.support.v8.renderscript.Allocation, int);
-    method public void DGEMM(int, int, double, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, double, android.support.v8.renderscript.Allocation);
-    method public void DGEMV(int, double, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, double, android.support.v8.renderscript.Allocation, int);
-    method public void DGER(double, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void DSBMV(int, int, double, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, double, android.support.v8.renderscript.Allocation, int);
-    method public void DSPMV(int, double, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, double, android.support.v8.renderscript.Allocation, int);
-    method public void DSPR(int, double, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void DSPR2(int, double, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void DSYMM(int, int, double, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, double, android.support.v8.renderscript.Allocation);
-    method public void DSYMV(int, double, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, double, android.support.v8.renderscript.Allocation, int);
-    method public void DSYR(int, double, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void DSYR2(int, double, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void DSYR2K(int, int, double, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, double, android.support.v8.renderscript.Allocation);
-    method public void DSYRK(int, int, double, android.support.v8.renderscript.Allocation, double, android.support.v8.renderscript.Allocation);
-    method public void DTBMV(int, int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void DTBSV(int, int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void DTPMV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void DTPSV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void DTRMM(int, int, int, int, double, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void DTRMV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void DTRSM(int, int, int, int, double, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void DTRSV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void SGBMV(int, int, int, float, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, float, android.support.v8.renderscript.Allocation, int);
-    method public void SGEMM(int, int, float, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, float, android.support.v8.renderscript.Allocation);
-    method public void SGEMV(int, float, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, float, android.support.v8.renderscript.Allocation, int);
-    method public void SGER(float, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void SSBMV(int, int, float, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, float, android.support.v8.renderscript.Allocation, int);
-    method public void SSPMV(int, float, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, float, android.support.v8.renderscript.Allocation, int);
-    method public void SSPR(int, float, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void SSPR2(int, float, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void SSYMM(int, int, float, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, float, android.support.v8.renderscript.Allocation);
-    method public void SSYMV(int, float, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, float, android.support.v8.renderscript.Allocation, int);
-    method public void SSYR(int, float, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void SSYR2(int, float, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void SSYR2K(int, int, float, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, float, android.support.v8.renderscript.Allocation);
-    method public void SSYRK(int, int, float, android.support.v8.renderscript.Allocation, float, android.support.v8.renderscript.Allocation);
-    method public void STBMV(int, int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void STBSV(int, int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void STPMV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void STPSV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void STRMM(int, int, int, int, float, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void STRMV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void STRSM(int, int, int, int, float, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void STRSV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void ZGBMV(int, int, int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, int);
-    method public void ZGEMM(int, int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation);
-    method public void ZGEMV(int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, int);
-    method public void ZGERC(android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void ZGERU(android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void ZHBMV(int, int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, int);
-    method public void ZHEMM(int, int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation);
-    method public void ZHEMV(int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, int);
-    method public void ZHER(int, double, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void ZHER2(int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void ZHER2K(int, int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, double, android.support.v8.renderscript.Allocation);
-    method public void ZHERK(int, int, double, android.support.v8.renderscript.Allocation, double, android.support.v8.renderscript.Allocation);
-    method public void ZHPMV(int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, int);
-    method public void ZHPR(int, double, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void ZHPR2(int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void ZSYMM(int, int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation);
-    method public void ZSYR2K(int, int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation);
-    method public void ZSYRK(int, int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation);
-    method public void ZTBMV(int, int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void ZTBSV(int, int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void ZTPMV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void ZTPSV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void ZTRMM(int, int, int, int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void ZTRMV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void ZTRSM(int, int, int, int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void ZTRSV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public static android.support.v8.renderscript.ScriptIntrinsicBLAS create(android.support.v8.renderscript.RenderScript);
-    field public static final int CONJ_TRANSPOSE = 113; // 0x71
-    field public static final int LEFT = 141; // 0x8d
-    field public static final int LOWER = 122; // 0x7a
-    field public static final int NON_UNIT = 131; // 0x83
-    field public static final int NO_TRANSPOSE = 111; // 0x6f
-    field public static final int RIGHT = 142; // 0x8e
-    field public static final int TRANSPOSE = 112; // 0x70
-    field public static final int UNIT = 132; // 0x84
-    field public static final int UPPER = 121; // 0x79
-  }
-
-  public class ScriptIntrinsicBlend extends android.support.v8.renderscript.ScriptIntrinsic {
-    method public static android.support.v8.renderscript.ScriptIntrinsicBlend create(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element);
-    method public void forEachAdd(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void forEachClear(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void forEachDst(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void forEachDstAtop(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void forEachDstIn(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void forEachDstOut(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void forEachDstOver(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void forEachMultiply(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void forEachSrc(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void forEachSrcAtop(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void forEachSrcIn(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void forEachSrcOut(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void forEachSrcOver(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void forEachSubtract(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void forEachXor(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public android.support.v8.renderscript.Script.KernelID getKernelIDAdd();
-    method public android.support.v8.renderscript.Script.KernelID getKernelIDClear();
-    method public android.support.v8.renderscript.Script.KernelID getKernelIDDst();
-    method public android.support.v8.renderscript.Script.KernelID getKernelIDDstAtop();
-    method public android.support.v8.renderscript.Script.KernelID getKernelIDDstIn();
-    method public android.support.v8.renderscript.Script.KernelID getKernelIDDstOut();
-    method public android.support.v8.renderscript.Script.KernelID getKernelIDDstOver();
-    method public android.support.v8.renderscript.Script.KernelID getKernelIDMultiply();
-    method public android.support.v8.renderscript.Script.KernelID getKernelIDSrc();
-    method public android.support.v8.renderscript.Script.KernelID getKernelIDSrcAtop();
-    method public android.support.v8.renderscript.Script.KernelID getKernelIDSrcIn();
-    method public android.support.v8.renderscript.Script.KernelID getKernelIDSrcOut();
-    method public android.support.v8.renderscript.Script.KernelID getKernelIDSrcOver();
-    method public android.support.v8.renderscript.Script.KernelID getKernelIDSubtract();
-    method public android.support.v8.renderscript.Script.KernelID getKernelIDXor();
-  }
-
-  public class ScriptIntrinsicBlur extends android.support.v8.renderscript.ScriptIntrinsic {
-    ctor protected ScriptIntrinsicBlur(long, android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.ScriptIntrinsicBlur create(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element);
-    method public void forEach(android.support.v8.renderscript.Allocation);
-    method public android.support.v8.renderscript.Script.FieldID getFieldID_Input();
-    method public android.support.v8.renderscript.Script.KernelID getKernelID();
-    method public void setInput(android.support.v8.renderscript.Allocation);
-    method public void setRadius(float);
-  }
-
-  public class ScriptIntrinsicColorMatrix extends android.support.v8.renderscript.ScriptIntrinsic {
-    ctor protected ScriptIntrinsicColorMatrix(long, android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.ScriptIntrinsicColorMatrix create(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element);
-    method public void forEach(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void forEach(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Script.LaunchOptions);
-    method public android.support.v8.renderscript.Script.KernelID getKernelID();
-    method public void setAdd(android.support.v8.renderscript.Float4);
-    method public void setAdd(float, float, float, float);
-    method public void setColorMatrix(android.support.v8.renderscript.Matrix4f);
-    method public void setColorMatrix(android.support.v8.renderscript.Matrix3f);
-    method public void setGreyscale();
-    method public void setRGBtoYUV();
-    method public void setYUVtoRGB();
-  }
-
-  public class ScriptIntrinsicConvolve3x3 extends android.support.v8.renderscript.ScriptIntrinsic {
-    method public static android.support.v8.renderscript.ScriptIntrinsicConvolve3x3 create(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element);
-    method public void forEach(android.support.v8.renderscript.Allocation);
-    method public void forEach(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Script.LaunchOptions);
-    method public android.support.v8.renderscript.Script.FieldID getFieldID_Input();
-    method public android.support.v8.renderscript.Script.KernelID getKernelID();
-    method public void setCoefficients(float[]);
-    method public void setInput(android.support.v8.renderscript.Allocation);
-  }
-
-  public class ScriptIntrinsicConvolve5x5 extends android.support.v8.renderscript.ScriptIntrinsic {
-    method public static android.support.v8.renderscript.ScriptIntrinsicConvolve5x5 create(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element);
-    method public void forEach(android.support.v8.renderscript.Allocation);
-    method public void forEach(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Script.LaunchOptions);
-    method public android.support.v8.renderscript.Script.FieldID getFieldID_Input();
-    method public android.support.v8.renderscript.Script.KernelID getKernelID();
-    method public void setCoefficients(float[]);
-    method public void setInput(android.support.v8.renderscript.Allocation);
-  }
-
-  public class ScriptIntrinsicHistogram extends android.support.v8.renderscript.ScriptIntrinsic {
-    ctor protected ScriptIntrinsicHistogram(long, android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.ScriptIntrinsicHistogram create(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element);
-    method public void forEach(android.support.v8.renderscript.Allocation);
-    method public void forEach(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Script.LaunchOptions);
-    method public void forEach_Dot(android.support.v8.renderscript.Allocation);
-    method public void forEach_Dot(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Script.LaunchOptions);
-    method public android.support.v8.renderscript.Script.FieldID getFieldID_Input();
-    method public android.support.v8.renderscript.Script.KernelID getKernelID_Separate();
-    method public void setDotCoefficients(float, float, float, float);
-    method public void setOutput(android.support.v8.renderscript.Allocation);
-  }
-
-  public class ScriptIntrinsicLUT extends android.support.v8.renderscript.ScriptIntrinsic {
-    ctor protected ScriptIntrinsicLUT(long, android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.ScriptIntrinsicLUT create(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element);
-    method public void forEach(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public android.support.v8.renderscript.Script.KernelID getKernelID();
-    method public void setAlpha(int, int);
-    method public void setBlue(int, int);
-    method public void setGreen(int, int);
-    method public void setRed(int, int);
-  }
-
-  public class ScriptIntrinsicResize extends android.support.v8.renderscript.ScriptIntrinsic {
-    ctor protected ScriptIntrinsicResize(long, android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.ScriptIntrinsicResize create(android.support.v8.renderscript.RenderScript);
-    method public void forEach_bicubic(android.support.v8.renderscript.Allocation);
-    method public void forEach_bicubic(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Script.LaunchOptions);
-    method public android.support.v8.renderscript.Script.FieldID getFieldID_Input();
-    method public android.support.v8.renderscript.Script.KernelID getKernelID_bicubic();
-    method public void setInput(android.support.v8.renderscript.Allocation);
-  }
-
-  public class ScriptIntrinsicYuvToRGB extends android.support.v8.renderscript.ScriptIntrinsic {
-    method public static android.support.v8.renderscript.ScriptIntrinsicYuvToRGB create(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element);
-    method public void forEach(android.support.v8.renderscript.Allocation);
-    method public android.support.v8.renderscript.Script.FieldID getFieldID_Input();
-    method public android.support.v8.renderscript.Script.KernelID getKernelID();
-    method public void setInput(android.support.v8.renderscript.Allocation);
-  }
-
-  public class Short2 {
-    ctor public Short2();
-    ctor public Short2(short, short);
-    field public short x;
-    field public short y;
-  }
-
-  public class Short3 {
-    ctor public Short3();
-    ctor public Short3(short, short, short);
-    field public short x;
-    field public short y;
-    field public short z;
-  }
-
-  public class Short4 {
-    ctor public Short4();
-    ctor public Short4(short, short, short, short);
-    field public short w;
-    field public short x;
-    field public short y;
-    field public short z;
-  }
-
-  public class Type extends android.support.v8.renderscript.BaseObj {
-    method public static android.support.v8.renderscript.Type createX(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element, int);
-    method public static android.support.v8.renderscript.Type createXY(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element, int, int);
-    method public static android.support.v8.renderscript.Type createXYZ(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element, int, int, int);
-    method public int getCount();
-    method public long getDummyType(android.support.v8.renderscript.RenderScript, long);
-    method public android.support.v8.renderscript.Element getElement();
-    method public int getX();
-    method public int getY();
-    method public int getYuv();
-    method public int getZ();
-    method public boolean hasFaces();
-    method public boolean hasMipmaps();
-  }
-
-  public static class Type.Builder {
-    ctor public Type.Builder(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element);
-    method public android.support.v8.renderscript.Type create();
-    method public android.support.v8.renderscript.Type.Builder setFaces(boolean);
-    method public android.support.v8.renderscript.Type.Builder setMipmaps(boolean);
-    method public android.support.v8.renderscript.Type.Builder setX(int);
-    method public android.support.v8.renderscript.Type.Builder setY(int);
-    method public android.support.v8.renderscript.Type.Builder setYuvFormat(int);
-    method public android.support.v8.renderscript.Type.Builder setZ(int);
-  }
-
-  public static final class Type.CubemapFace extends java.lang.Enum {
-    method public static android.support.v8.renderscript.Type.CubemapFace valueOf(java.lang.String);
-    method public static final android.support.v8.renderscript.Type.CubemapFace[] values();
-    enum_constant public static final android.support.v8.renderscript.Type.CubemapFace NEGATIVE_X;
-    enum_constant public static final android.support.v8.renderscript.Type.CubemapFace NEGATIVE_Y;
-    enum_constant public static final android.support.v8.renderscript.Type.CubemapFace NEGATIVE_Z;
-    enum_constant public static final android.support.v8.renderscript.Type.CubemapFace POSITIVE_X;
-    enum_constant public static final android.support.v8.renderscript.Type.CubemapFace POSITIVE_Y;
-    enum_constant public static final android.support.v8.renderscript.Type.CubemapFace POSITIVE_Z;
-  }
-
-}
-
diff --git a/v8/renderscript/api/23.1.1.txt b/v8/renderscript/api/23.1.1.txt
deleted file mode 100644
index 929bd5f..0000000
--- a/v8/renderscript/api/23.1.1.txt
+++ /dev/null
@@ -1,1011 +0,0 @@
-package android.support.v8.renderscript {
-
-  public class Allocation extends android.support.v8.renderscript.BaseObj {
-    method public void copy1DRangeFrom(int, int, java.lang.Object);
-    method public void copy1DRangeFrom(int, int, int[]);
-    method public void copy1DRangeFrom(int, int, short[]);
-    method public void copy1DRangeFrom(int, int, byte[]);
-    method public void copy1DRangeFrom(int, int, float[]);
-    method public void copy1DRangeFrom(int, int, android.support.v8.renderscript.Allocation, int);
-    method public void copy1DRangeFromUnchecked(int, int, java.lang.Object);
-    method public void copy1DRangeFromUnchecked(int, int, int[]);
-    method public void copy1DRangeFromUnchecked(int, int, short[]);
-    method public void copy1DRangeFromUnchecked(int, int, byte[]);
-    method public void copy1DRangeFromUnchecked(int, int, float[]);
-    method public void copy1DRangeTo(int, int, java.lang.Object);
-    method public void copy1DRangeTo(int, int, int[]);
-    method public void copy1DRangeTo(int, int, short[]);
-    method public void copy1DRangeTo(int, int, byte[]);
-    method public void copy1DRangeTo(int, int, float[]);
-    method public void copy1DRangeToUnchecked(int, int, java.lang.Object);
-    method public void copy1DRangeToUnchecked(int, int, int[]);
-    method public void copy1DRangeToUnchecked(int, int, short[]);
-    method public void copy1DRangeToUnchecked(int, int, byte[]);
-    method public void copy1DRangeToUnchecked(int, int, float[]);
-    method public void copy2DRangeFrom(int, int, int, int, java.lang.Object);
-    method public void copy2DRangeFrom(int, int, int, int, byte[]);
-    method public void copy2DRangeFrom(int, int, int, int, short[]);
-    method public void copy2DRangeFrom(int, int, int, int, int[]);
-    method public void copy2DRangeFrom(int, int, int, int, float[]);
-    method public void copy2DRangeFrom(int, int, int, int, android.support.v8.renderscript.Allocation, int, int);
-    method public void copy2DRangeFrom(int, int, android.graphics.Bitmap);
-    method public void copy2DRangeTo(int, int, int, int, java.lang.Object);
-    method public void copy2DRangeTo(int, int, int, int, byte[]);
-    method public void copy2DRangeTo(int, int, int, int, short[]);
-    method public void copy2DRangeTo(int, int, int, int, int[]);
-    method public void copy2DRangeTo(int, int, int, int, float[]);
-    method public void copy3DRangeFrom(int, int, int, int, int, int, java.lang.Object);
-    method public void copy3DRangeFrom(int, int, int, int, int, int, android.support.v8.renderscript.Allocation, int, int, int);
-    method public void copyFrom(android.support.v8.renderscript.BaseObj[]);
-    method public void copyFrom(java.lang.Object);
-    method public void copyFrom(int[]);
-    method public void copyFrom(short[]);
-    method public void copyFrom(byte[]);
-    method public void copyFrom(float[]);
-    method public void copyFrom(android.graphics.Bitmap);
-    method public void copyFrom(android.support.v8.renderscript.Allocation);
-    method public void copyFromUnchecked(java.lang.Object);
-    method public void copyFromUnchecked(int[]);
-    method public void copyFromUnchecked(short[]);
-    method public void copyFromUnchecked(byte[]);
-    method public void copyFromUnchecked(float[]);
-    method public void copyTo(android.graphics.Bitmap);
-    method public void copyTo(java.lang.Object);
-    method public void copyTo(byte[]);
-    method public void copyTo(short[]);
-    method public void copyTo(int[]);
-    method public void copyTo(float[]);
-    method public static android.support.v8.renderscript.Allocation createCubemapFromBitmap(android.support.v8.renderscript.RenderScript, android.graphics.Bitmap, android.support.v8.renderscript.Allocation.MipmapControl, int);
-    method public static android.support.v8.renderscript.Allocation createCubemapFromBitmap(android.support.v8.renderscript.RenderScript, android.graphics.Bitmap);
-    method public static android.support.v8.renderscript.Allocation createCubemapFromCubeFaces(android.support.v8.renderscript.RenderScript, android.graphics.Bitmap, android.graphics.Bitmap, android.graphics.Bitmap, android.graphics.Bitmap, android.graphics.Bitmap, android.graphics.Bitmap, android.support.v8.renderscript.Allocation.MipmapControl, int);
-    method public static android.support.v8.renderscript.Allocation createCubemapFromCubeFaces(android.support.v8.renderscript.RenderScript, android.graphics.Bitmap, android.graphics.Bitmap, android.graphics.Bitmap, android.graphics.Bitmap, android.graphics.Bitmap, android.graphics.Bitmap);
-    method public static android.support.v8.renderscript.Allocation createFromBitmap(android.support.v8.renderscript.RenderScript, android.graphics.Bitmap, android.support.v8.renderscript.Allocation.MipmapControl, int);
-    method public static android.support.v8.renderscript.Allocation createFromBitmap(android.support.v8.renderscript.RenderScript, android.graphics.Bitmap);
-    method public static android.support.v8.renderscript.Allocation createFromBitmapResource(android.support.v8.renderscript.RenderScript, android.content.res.Resources, int, android.support.v8.renderscript.Allocation.MipmapControl, int);
-    method public static android.support.v8.renderscript.Allocation createFromBitmapResource(android.support.v8.renderscript.RenderScript, android.content.res.Resources, int);
-    method public static android.support.v8.renderscript.Allocation createFromString(android.support.v8.renderscript.RenderScript, java.lang.String, int);
-    method public static android.support.v8.renderscript.Allocation createSized(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element, int, int);
-    method public static android.support.v8.renderscript.Allocation createSized(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element, int);
-    method public static android.support.v8.renderscript.Allocation createTyped(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Type, android.support.v8.renderscript.Allocation.MipmapControl, int);
-    method public static android.support.v8.renderscript.Allocation createTyped(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Type, int);
-    method public static android.support.v8.renderscript.Allocation createTyped(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Type);
-    method public void generateMipmaps();
-    method public int getBytesSize();
-    method public android.support.v8.renderscript.Element getElement();
-    method public long getIncAllocID();
-    method public android.support.v8.renderscript.Type getType();
-    method public int getUsage();
-    method public void ioReceive();
-    method public void ioSend();
-    method public void ioSendOutput();
-    method public void setAutoPadding(boolean);
-    method public void setFromFieldPacker(int, android.support.v8.renderscript.FieldPacker);
-    method public void setFromFieldPacker(int, int, android.support.v8.renderscript.FieldPacker);
-    method public void setIncAllocID(long);
-    method public void setSurface(android.view.Surface);
-    method public void syncAll(int);
-    field public static final int USAGE_GRAPHICS_TEXTURE = 2; // 0x2
-    field public static final int USAGE_IO_INPUT = 32; // 0x20
-    field public static final int USAGE_IO_OUTPUT = 64; // 0x40
-    field public static final int USAGE_SCRIPT = 1; // 0x1
-    field public static final int USAGE_SHARED = 128; // 0x80
-  }
-
-  public static final class Allocation.MipmapControl extends java.lang.Enum {
-    method public static android.support.v8.renderscript.Allocation.MipmapControl valueOf(java.lang.String);
-    method public static final android.support.v8.renderscript.Allocation.MipmapControl[] values();
-    enum_constant public static final android.support.v8.renderscript.Allocation.MipmapControl MIPMAP_FULL;
-    enum_constant public static final android.support.v8.renderscript.Allocation.MipmapControl MIPMAP_NONE;
-    enum_constant public static final android.support.v8.renderscript.Allocation.MipmapControl MIPMAP_ON_SYNC_TO_TEXTURE;
-  }
-
-  public class BaseObj {
-    method public void destroy();
-  }
-
-  public class Byte2 {
-    ctor public Byte2();
-    ctor public Byte2(byte, byte);
-    field public byte x;
-    field public byte y;
-  }
-
-  public class Byte3 {
-    ctor public Byte3();
-    ctor public Byte3(byte, byte, byte);
-    field public byte x;
-    field public byte y;
-    field public byte z;
-  }
-
-  public class Byte4 {
-    ctor public Byte4();
-    ctor public Byte4(byte, byte, byte, byte);
-    field public byte w;
-    field public byte x;
-    field public byte y;
-    field public byte z;
-  }
-
-  public class Double2 {
-    ctor public Double2();
-    ctor public Double2(double, double);
-    field public double x;
-    field public double y;
-  }
-
-  public class Double3 {
-    ctor public Double3();
-    ctor public Double3(double, double, double);
-    field public double x;
-    field public double y;
-    field public double z;
-  }
-
-  public class Double4 {
-    ctor public Double4();
-    ctor public Double4(double, double, double, double);
-    field public double w;
-    field public double x;
-    field public double y;
-    field public double z;
-  }
-
-  public class Element extends android.support.v8.renderscript.BaseObj {
-    method public static android.support.v8.renderscript.Element ALLOCATION(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element A_8(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element BOOLEAN(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element ELEMENT(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element F32(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element F32_2(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element F32_3(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element F32_4(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element F64(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element F64_2(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element F64_3(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element F64_4(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element I16(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element I16_2(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element I16_3(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element I16_4(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element I32(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element I32_2(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element I32_3(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element I32_4(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element I64(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element I64_2(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element I64_3(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element I64_4(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element I8(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element I8_2(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element I8_3(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element I8_4(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element MATRIX_2X2(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element MATRIX_3X3(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element MATRIX_4X4(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element RGBA_4444(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element RGBA_5551(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element RGBA_8888(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element RGB_565(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element RGB_888(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element SAMPLER(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element SCRIPT(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element TYPE(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element U16(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element U16_2(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element U16_3(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element U16_4(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element U32(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element U32_2(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element U32_3(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element U32_4(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element U64(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element U64_2(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element U64_3(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element U64_4(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element U8(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element U8_2(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element U8_3(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element U8_4(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element createPixel(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element.DataType, android.support.v8.renderscript.Element.DataKind);
-    method public static android.support.v8.renderscript.Element createVector(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element.DataType, int);
-    method public int getBytesSize();
-    method public android.support.v8.renderscript.Element.DataKind getDataKind();
-    method public android.support.v8.renderscript.Element.DataType getDataType();
-    method public long getDummyElement(android.support.v8.renderscript.RenderScript);
-    method public android.support.v8.renderscript.Element getSubElement(int);
-    method public int getSubElementArraySize(int);
-    method public int getSubElementCount();
-    method public java.lang.String getSubElementName(int);
-    method public int getSubElementOffsetBytes(int);
-    method public int getVectorSize();
-    method public boolean isCompatible(android.support.v8.renderscript.Element);
-    method public boolean isComplex();
-  }
-
-  public static class Element.Builder {
-    ctor public Element.Builder(android.support.v8.renderscript.RenderScript);
-    method public android.support.v8.renderscript.Element.Builder add(android.support.v8.renderscript.Element, java.lang.String, int);
-    method public android.support.v8.renderscript.Element.Builder add(android.support.v8.renderscript.Element, java.lang.String);
-    method public android.support.v8.renderscript.Element create();
-  }
-
-  public static final class Element.DataKind extends java.lang.Enum {
-    method public static android.support.v8.renderscript.Element.DataKind valueOf(java.lang.String);
-    method public static final android.support.v8.renderscript.Element.DataKind[] values();
-    enum_constant public static final android.support.v8.renderscript.Element.DataKind PIXEL_A;
-    enum_constant public static final android.support.v8.renderscript.Element.DataKind PIXEL_DEPTH;
-    enum_constant public static final android.support.v8.renderscript.Element.DataKind PIXEL_L;
-    enum_constant public static final android.support.v8.renderscript.Element.DataKind PIXEL_LA;
-    enum_constant public static final android.support.v8.renderscript.Element.DataKind PIXEL_RGB;
-    enum_constant public static final android.support.v8.renderscript.Element.DataKind PIXEL_RGBA;
-    enum_constant public static final android.support.v8.renderscript.Element.DataKind PIXEL_YUV;
-    enum_constant public static final android.support.v8.renderscript.Element.DataKind USER;
-  }
-
-  public static final class Element.DataType extends java.lang.Enum {
-    method public static android.support.v8.renderscript.Element.DataType valueOf(java.lang.String);
-    method public static final android.support.v8.renderscript.Element.DataType[] values();
-    enum_constant public static final android.support.v8.renderscript.Element.DataType BOOLEAN;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType FLOAT_32;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType FLOAT_64;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType MATRIX_2X2;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType MATRIX_3X3;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType MATRIX_4X4;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType NONE;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType RS_ALLOCATION;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType RS_ELEMENT;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType RS_SAMPLER;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType RS_SCRIPT;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType RS_TYPE;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType SIGNED_16;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType SIGNED_32;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType SIGNED_64;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType SIGNED_8;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType UNSIGNED_16;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType UNSIGNED_32;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType UNSIGNED_4_4_4_4;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType UNSIGNED_5_5_5_1;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType UNSIGNED_5_6_5;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType UNSIGNED_64;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType UNSIGNED_8;
-  }
-
-  public class FieldPacker {
-    ctor public FieldPacker(int);
-    ctor public FieldPacker(byte[]);
-    method public void addBoolean(boolean);
-    method public void addF32(float);
-    method public void addF32(android.support.v8.renderscript.Float2);
-    method public void addF32(android.support.v8.renderscript.Float3);
-    method public void addF32(android.support.v8.renderscript.Float4);
-    method public void addF64(double);
-    method public void addF64(android.support.v8.renderscript.Double2);
-    method public void addF64(android.support.v8.renderscript.Double3);
-    method public void addF64(android.support.v8.renderscript.Double4);
-    method public void addI16(short);
-    method public void addI16(android.support.v8.renderscript.Short2);
-    method public void addI16(android.support.v8.renderscript.Short3);
-    method public void addI16(android.support.v8.renderscript.Short4);
-    method public void addI32(int);
-    method public void addI32(android.support.v8.renderscript.Int2);
-    method public void addI32(android.support.v8.renderscript.Int3);
-    method public void addI32(android.support.v8.renderscript.Int4);
-    method public void addI64(long);
-    method public void addI64(android.support.v8.renderscript.Long2);
-    method public void addI64(android.support.v8.renderscript.Long3);
-    method public void addI64(android.support.v8.renderscript.Long4);
-    method public void addI8(byte);
-    method public void addI8(android.support.v8.renderscript.Byte2);
-    method public void addI8(android.support.v8.renderscript.Byte3);
-    method public void addI8(android.support.v8.renderscript.Byte4);
-    method public void addMatrix(android.support.v8.renderscript.Matrix4f);
-    method public void addMatrix(android.support.v8.renderscript.Matrix3f);
-    method public void addMatrix(android.support.v8.renderscript.Matrix2f);
-    method public void addObj(android.support.v8.renderscript.BaseObj);
-    method public void addU16(int);
-    method public void addU16(android.support.v8.renderscript.Int2);
-    method public void addU16(android.support.v8.renderscript.Int3);
-    method public void addU16(android.support.v8.renderscript.Int4);
-    method public void addU32(long);
-    method public void addU32(android.support.v8.renderscript.Long2);
-    method public void addU32(android.support.v8.renderscript.Long3);
-    method public void addU32(android.support.v8.renderscript.Long4);
-    method public void addU64(long);
-    method public void addU64(android.support.v8.renderscript.Long2);
-    method public void addU64(android.support.v8.renderscript.Long3);
-    method public void addU64(android.support.v8.renderscript.Long4);
-    method public void addU8(short);
-    method public void addU8(android.support.v8.renderscript.Short2);
-    method public void addU8(android.support.v8.renderscript.Short3);
-    method public void addU8(android.support.v8.renderscript.Short4);
-    method public void align(int);
-    method public final byte[] getData();
-    method public void reset();
-    method public void reset(int);
-    method public void skip(int);
-    method public boolean subBoolean();
-    method public android.support.v8.renderscript.Byte2 subByte2();
-    method public android.support.v8.renderscript.Byte3 subByte3();
-    method public android.support.v8.renderscript.Byte4 subByte4();
-    method public android.support.v8.renderscript.Double2 subDouble2();
-    method public android.support.v8.renderscript.Double3 subDouble3();
-    method public android.support.v8.renderscript.Double4 subDouble4();
-    method public float subF32();
-    method public double subF64();
-    method public android.support.v8.renderscript.Float2 subFloat2();
-    method public android.support.v8.renderscript.Float3 subFloat3();
-    method public android.support.v8.renderscript.Float4 subFloat4();
-    method public short subI16();
-    method public int subI32();
-    method public long subI64();
-    method public byte subI8();
-    method public android.support.v8.renderscript.Int2 subInt2();
-    method public android.support.v8.renderscript.Int3 subInt3();
-    method public android.support.v8.renderscript.Int4 subInt4();
-    method public android.support.v8.renderscript.Long2 subLong2();
-    method public android.support.v8.renderscript.Long3 subLong3();
-    method public android.support.v8.renderscript.Long4 subLong4();
-    method public android.support.v8.renderscript.Matrix2f subMatrix2f();
-    method public android.support.v8.renderscript.Matrix3f subMatrix3f();
-    method public android.support.v8.renderscript.Matrix4f subMatrix4f();
-    method public android.support.v8.renderscript.Short2 subShort2();
-    method public android.support.v8.renderscript.Short3 subShort3();
-    method public android.support.v8.renderscript.Short4 subShort4();
-    method public void subalign(int);
-  }
-
-  public class Float2 {
-    ctor public Float2();
-    ctor public Float2(float, float);
-    field public float x;
-    field public float y;
-  }
-
-  public class Float3 {
-    ctor public Float3();
-    ctor public Float3(float, float, float);
-    field public float x;
-    field public float y;
-    field public float z;
-  }
-
-  public class Float4 {
-    ctor public Float4();
-    ctor public Float4(float, float, float, float);
-    field public float w;
-    field public float x;
-    field public float y;
-    field public float z;
-  }
-
-  public class Int2 {
-    ctor public Int2();
-    ctor public Int2(int, int);
-    field public int x;
-    field public int y;
-  }
-
-  public class Int3 {
-    ctor public Int3();
-    ctor public Int3(int, int, int);
-    field public int x;
-    field public int y;
-    field public int z;
-  }
-
-  public class Int4 {
-    ctor public Int4();
-    ctor public Int4(int, int, int, int);
-    field public int w;
-    field public int x;
-    field public int y;
-    field public int z;
-  }
-
-  public class Long2 {
-    ctor public Long2();
-    ctor public Long2(long, long);
-    field public long x;
-    field public long y;
-  }
-
-  public class Long3 {
-    ctor public Long3();
-    ctor public Long3(long, long, long);
-    field public long x;
-    field public long y;
-    field public long z;
-  }
-
-  public class Long4 {
-    ctor public Long4();
-    ctor public Long4(long, long, long, long);
-    field public long w;
-    field public long x;
-    field public long y;
-    field public long z;
-  }
-
-  public class Matrix2f {
-    ctor public Matrix2f();
-    ctor public Matrix2f(float[]);
-    method public float get(int, int);
-    method public float[] getArray();
-    method public void load(android.support.v8.renderscript.Matrix2f);
-    method public void loadIdentity();
-    method public void loadMultiply(android.support.v8.renderscript.Matrix2f, android.support.v8.renderscript.Matrix2f);
-    method public void loadRotate(float);
-    method public void loadScale(float, float);
-    method public void multiply(android.support.v8.renderscript.Matrix2f);
-    method public void rotate(float);
-    method public void scale(float, float);
-    method public void set(int, int, float);
-    method public void transpose();
-  }
-
-  public class Matrix3f {
-    ctor public Matrix3f();
-    ctor public Matrix3f(float[]);
-    method public float get(int, int);
-    method public float[] getArray();
-    method public void load(android.support.v8.renderscript.Matrix3f);
-    method public void loadIdentity();
-    method public void loadMultiply(android.support.v8.renderscript.Matrix3f, android.support.v8.renderscript.Matrix3f);
-    method public void loadRotate(float, float, float, float);
-    method public void loadRotate(float);
-    method public void loadScale(float, float);
-    method public void loadScale(float, float, float);
-    method public void loadTranslate(float, float);
-    method public void multiply(android.support.v8.renderscript.Matrix3f);
-    method public void rotate(float, float, float, float);
-    method public void rotate(float);
-    method public void scale(float, float);
-    method public void scale(float, float, float);
-    method public void set(int, int, float);
-    method public void translate(float, float);
-    method public void transpose();
-  }
-
-  public class Matrix4f {
-    ctor public Matrix4f();
-    ctor public Matrix4f(float[]);
-    method public float get(int, int);
-    method public float[] getArray();
-    method public boolean inverse();
-    method public boolean inverseTranspose();
-    method public void load(android.support.v8.renderscript.Matrix4f);
-    method public void loadFrustum(float, float, float, float, float, float);
-    method public void loadIdentity();
-    method public void loadMultiply(android.support.v8.renderscript.Matrix4f, android.support.v8.renderscript.Matrix4f);
-    method public void loadOrtho(float, float, float, float, float, float);
-    method public void loadOrthoWindow(int, int);
-    method public void loadPerspective(float, float, float, float);
-    method public void loadProjectionNormalized(int, int);
-    method public void loadRotate(float, float, float, float);
-    method public void loadScale(float, float, float);
-    method public void loadTranslate(float, float, float);
-    method public void multiply(android.support.v8.renderscript.Matrix4f);
-    method public void rotate(float, float, float, float);
-    method public void scale(float, float, float);
-    method public void set(int, int, float);
-    method public void translate(float, float, float);
-    method public void transpose();
-  }
-
-  public class RSDriverException extends android.support.v8.renderscript.RSRuntimeException {
-    ctor public RSDriverException(java.lang.String);
-  }
-
-  public class RSIllegalArgumentException extends android.support.v8.renderscript.RSRuntimeException {
-    ctor public RSIllegalArgumentException(java.lang.String);
-  }
-
-  public class RSInvalidStateException extends android.support.v8.renderscript.RSRuntimeException {
-    ctor public RSInvalidStateException(java.lang.String);
-  }
-
-  public class RSRuntimeException extends java.lang.RuntimeException {
-    ctor public RSRuntimeException(java.lang.String);
-  }
-
-  public class RenderScript {
-    method public void contextDump();
-    method public static android.support.v8.renderscript.RenderScript create(android.content.Context);
-    method public static android.support.v8.renderscript.RenderScript create(android.content.Context, android.support.v8.renderscript.RenderScript.ContextType);
-    method public static android.support.v8.renderscript.RenderScript create(android.content.Context, android.support.v8.renderscript.RenderScript.ContextType, int);
-    method public static android.support.v8.renderscript.RenderScript create(android.content.Context, int, android.support.v8.renderscript.RenderScript.ContextType, int);
-    method public static android.support.v8.renderscript.RenderScript createMultiContext(android.content.Context, android.support.v8.renderscript.RenderScript.ContextType, int, int);
-    method public void destroy();
-    method public void finish();
-    method public static void forceCompat();
-    method public final android.content.Context getApplicationContext();
-    method public android.support.v8.renderscript.RenderScript.RSErrorHandler getErrorHandler();
-    method public android.support.v8.renderscript.RenderScript.RSMessageHandler getMessageHandler();
-    method public static void releaseAllContexts();
-    method public void sendMessage(int, int[]);
-    method public static void setBlackList(java.lang.String);
-    method public void setErrorHandler(android.support.v8.renderscript.RenderScript.RSErrorHandler);
-    method public void setMessageHandler(android.support.v8.renderscript.RenderScript.RSMessageHandler);
-    method public void setPriority(android.support.v8.renderscript.RenderScript.Priority);
-    field public static final int CREATE_FLAG_NONE = 0; // 0x0
-  }
-
-  public static final class RenderScript.ContextType extends java.lang.Enum {
-    method public static android.support.v8.renderscript.RenderScript.ContextType valueOf(java.lang.String);
-    method public static final android.support.v8.renderscript.RenderScript.ContextType[] values();
-    enum_constant public static final android.support.v8.renderscript.RenderScript.ContextType DEBUG;
-    enum_constant public static final android.support.v8.renderscript.RenderScript.ContextType NORMAL;
-    enum_constant public static final android.support.v8.renderscript.RenderScript.ContextType PROFILE;
-  }
-
-  public static final class RenderScript.Priority extends java.lang.Enum {
-    method public static android.support.v8.renderscript.RenderScript.Priority valueOf(java.lang.String);
-    method public static final android.support.v8.renderscript.RenderScript.Priority[] values();
-    enum_constant public static final android.support.v8.renderscript.RenderScript.Priority LOW;
-    enum_constant public static final android.support.v8.renderscript.RenderScript.Priority NORMAL;
-  }
-
-  public static class RenderScript.RSErrorHandler implements java.lang.Runnable {
-    ctor public RenderScript.RSErrorHandler();
-    method public void run();
-    field protected java.lang.String mErrorMessage;
-    field protected int mErrorNum;
-  }
-
-  public static class RenderScript.RSMessageHandler implements java.lang.Runnable {
-    ctor public RenderScript.RSMessageHandler();
-    method public void run();
-    field protected int[] mData;
-    field protected int mID;
-    field protected int mLength;
-  }
-
-  public class Sampler extends android.support.v8.renderscript.BaseObj {
-    method public static android.support.v8.renderscript.Sampler CLAMP_LINEAR(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Sampler CLAMP_LINEAR_MIP_LINEAR(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Sampler CLAMP_NEAREST(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Sampler MIRRORED_REPEAT_LINEAR(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Sampler MIRRORED_REPEAT_NEAREST(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Sampler WRAP_LINEAR(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Sampler WRAP_LINEAR_MIP_LINEAR(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Sampler WRAP_NEAREST(android.support.v8.renderscript.RenderScript);
-    method public float getAnisotropy();
-    method public android.support.v8.renderscript.Sampler.Value getMagnification();
-    method public android.support.v8.renderscript.Sampler.Value getMinification();
-    method public android.support.v8.renderscript.Sampler.Value getWrapS();
-    method public android.support.v8.renderscript.Sampler.Value getWrapT();
-  }
-
-  public static class Sampler.Builder {
-    ctor public Sampler.Builder(android.support.v8.renderscript.RenderScript);
-    method public android.support.v8.renderscript.Sampler create();
-    method public void setAnisotropy(float);
-    method public void setMagnification(android.support.v8.renderscript.Sampler.Value);
-    method public void setMinification(android.support.v8.renderscript.Sampler.Value);
-    method public void setWrapS(android.support.v8.renderscript.Sampler.Value);
-    method public void setWrapT(android.support.v8.renderscript.Sampler.Value);
-  }
-
-  public static final class Sampler.Value extends java.lang.Enum {
-    method public static android.support.v8.renderscript.Sampler.Value valueOf(java.lang.String);
-    method public static final android.support.v8.renderscript.Sampler.Value[] values();
-    enum_constant public static final android.support.v8.renderscript.Sampler.Value CLAMP;
-    enum_constant public static final android.support.v8.renderscript.Sampler.Value LINEAR;
-    enum_constant public static final android.support.v8.renderscript.Sampler.Value LINEAR_MIP_LINEAR;
-    enum_constant public static final android.support.v8.renderscript.Sampler.Value LINEAR_MIP_NEAREST;
-    enum_constant public static final android.support.v8.renderscript.Sampler.Value MIRRORED_REPEAT;
-    enum_constant public static final android.support.v8.renderscript.Sampler.Value NEAREST;
-    enum_constant public static final android.support.v8.renderscript.Sampler.Value WRAP;
-  }
-
-  public class Script extends android.support.v8.renderscript.BaseObj {
-    method public void bindAllocation(android.support.v8.renderscript.Allocation, int);
-    method protected android.support.v8.renderscript.Script.FieldID createFieldID(int, android.support.v8.renderscript.Element);
-    method protected android.support.v8.renderscript.Script.InvokeID createInvokeID(int);
-    method protected android.support.v8.renderscript.Script.KernelID createKernelID(int, int, android.support.v8.renderscript.Element, android.support.v8.renderscript.Element);
-    method protected void forEach(int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.FieldPacker);
-    method protected void forEach(int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.FieldPacker, android.support.v8.renderscript.Script.LaunchOptions);
-    method protected void invoke(int);
-    method protected void invoke(int, android.support.v8.renderscript.FieldPacker);
-    method protected boolean isIncSupp();
-    method protected void setIncSupp(boolean);
-    method public void setTimeZone(java.lang.String);
-    method public void setVar(int, float);
-    method public void setVar(int, double);
-    method public void setVar(int, int);
-    method public void setVar(int, long);
-    method public void setVar(int, boolean);
-    method public void setVar(int, android.support.v8.renderscript.BaseObj);
-    method public void setVar(int, android.support.v8.renderscript.FieldPacker);
-    method public void setVar(int, android.support.v8.renderscript.FieldPacker, android.support.v8.renderscript.Element, int[]);
-  }
-
-  public static class Script.Builder {
-  }
-
-  public static class Script.FieldBase {
-    ctor protected Script.FieldBase();
-    method public android.support.v8.renderscript.Allocation getAllocation();
-    method public android.support.v8.renderscript.Element getElement();
-    method public android.support.v8.renderscript.Type getType();
-    method protected void init(android.support.v8.renderscript.RenderScript, int);
-    method protected void init(android.support.v8.renderscript.RenderScript, int, int);
-    method public void updateAllocation();
-    field protected android.support.v8.renderscript.Allocation mAllocation;
-    field protected android.support.v8.renderscript.Element mElement;
-  }
-
-  public static final class Script.FieldID extends android.support.v8.renderscript.BaseObj {
-  }
-
-  public static final class Script.InvokeID extends android.support.v8.renderscript.BaseObj {
-  }
-
-  public static final class Script.KernelID extends android.support.v8.renderscript.BaseObj {
-  }
-
-  public static final class Script.LaunchOptions {
-    ctor public Script.LaunchOptions();
-    method public int getXEnd();
-    method public int getXStart();
-    method public int getYEnd();
-    method public int getYStart();
-    method public int getZEnd();
-    method public int getZStart();
-    method public android.support.v8.renderscript.Script.LaunchOptions setX(int, int);
-    method public android.support.v8.renderscript.Script.LaunchOptions setY(int, int);
-    method public android.support.v8.renderscript.Script.LaunchOptions setZ(int, int);
-  }
-
-  public class ScriptC extends android.support.v8.renderscript.Script {
-    ctor protected ScriptC(long, android.support.v8.renderscript.RenderScript);
-    ctor protected ScriptC(android.support.v8.renderscript.RenderScript, android.content.res.Resources, int);
-    ctor protected ScriptC(android.support.v8.renderscript.RenderScript, java.lang.String, byte[], byte[]);
-  }
-
-  public final class ScriptGroup extends android.support.v8.renderscript.BaseObj {
-    method public java.lang.Object[] execute(java.lang.Object...);
-    method public deprecated void execute();
-    method public deprecated void setInput(android.support.v8.renderscript.Script.KernelID, android.support.v8.renderscript.Allocation);
-    method public deprecated void setOutput(android.support.v8.renderscript.Script.KernelID, android.support.v8.renderscript.Allocation);
-  }
-
-  public static final class ScriptGroup.Binding {
-    ctor public ScriptGroup.Binding(android.support.v8.renderscript.Script.FieldID, java.lang.Object);
-    method public android.support.v8.renderscript.Script.FieldID getField();
-    method public java.lang.Object getValue();
-  }
-
-  public static final deprecated class ScriptGroup.Builder {
-    ctor public ScriptGroup.Builder(android.support.v8.renderscript.RenderScript);
-    method public android.support.v8.renderscript.ScriptGroup.Builder addConnection(android.support.v8.renderscript.Type, android.support.v8.renderscript.Script.KernelID, android.support.v8.renderscript.Script.FieldID);
-    method public android.support.v8.renderscript.ScriptGroup.Builder addConnection(android.support.v8.renderscript.Type, android.support.v8.renderscript.Script.KernelID, android.support.v8.renderscript.Script.KernelID);
-    method public android.support.v8.renderscript.ScriptGroup.Builder addKernel(android.support.v8.renderscript.Script.KernelID);
-    method public android.support.v8.renderscript.ScriptGroup create();
-  }
-
-  public static final class ScriptGroup.Builder2 {
-    ctor public ScriptGroup.Builder2(android.support.v8.renderscript.RenderScript);
-    method public android.support.v8.renderscript.ScriptGroup.Input addInput();
-    method public android.support.v8.renderscript.ScriptGroup.Closure addInvoke(android.support.v8.renderscript.Script.InvokeID, java.lang.Object...);
-    method public android.support.v8.renderscript.ScriptGroup.Closure addKernel(android.support.v8.renderscript.Script.KernelID, android.support.v8.renderscript.Type, java.lang.Object...);
-    method public android.support.v8.renderscript.ScriptGroup create(java.lang.String, android.support.v8.renderscript.ScriptGroup.Future...);
-  }
-
-  public static final class ScriptGroup.Closure extends android.support.v8.renderscript.BaseObj {
-    method public android.support.v8.renderscript.ScriptGroup.Future getGlobal(android.support.v8.renderscript.Script.FieldID);
-    method public android.support.v8.renderscript.ScriptGroup.Future getReturn();
-  }
-
-  public static final class ScriptGroup.Future {
-  }
-
-  public static final class ScriptGroup.Input {
-  }
-
-  public abstract class ScriptIntrinsic extends android.support.v8.renderscript.Script {
-  }
-
-  public class ScriptIntrinsic3DLUT extends android.support.v8.renderscript.ScriptIntrinsic {
-    ctor protected ScriptIntrinsic3DLUT(long, android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element);
-    method public static android.support.v8.renderscript.ScriptIntrinsic3DLUT create(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element);
-    method public void forEach(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public android.support.v8.renderscript.Script.KernelID getKernelID();
-    method public void setLUT(android.support.v8.renderscript.Allocation);
-  }
-
-  public final class ScriptIntrinsicBLAS extends android.support.v8.renderscript.ScriptIntrinsic {
-    method public void BNNM(android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, int);
-    method public void CGBMV(int, int, int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, int);
-    method public void CGEMM(int, int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation);
-    method public void CGEMV(int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, int);
-    method public void CGERC(android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void CGERU(android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void CHBMV(int, int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, int);
-    method public void CHEMM(int, int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation);
-    method public void CHEMV(int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, int);
-    method public void CHER(int, float, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void CHER2(int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void CHER2K(int, int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, float, android.support.v8.renderscript.Allocation);
-    method public void CHERK(int, int, float, android.support.v8.renderscript.Allocation, float, android.support.v8.renderscript.Allocation);
-    method public void CHPMV(int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, int);
-    method public void CHPR(int, float, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void CHPR2(int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void CSYMM(int, int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation);
-    method public void CSYR2K(int, int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation);
-    method public void CSYRK(int, int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation);
-    method public void CTBMV(int, int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void CTBSV(int, int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void CTPMV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void CTPSV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void CTRMM(int, int, int, int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void CTRMV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void CTRSM(int, int, int, int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void CTRSV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void DGBMV(int, int, int, double, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, double, android.support.v8.renderscript.Allocation, int);
-    method public void DGEMM(int, int, double, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, double, android.support.v8.renderscript.Allocation);
-    method public void DGEMV(int, double, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, double, android.support.v8.renderscript.Allocation, int);
-    method public void DGER(double, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void DSBMV(int, int, double, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, double, android.support.v8.renderscript.Allocation, int);
-    method public void DSPMV(int, double, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, double, android.support.v8.renderscript.Allocation, int);
-    method public void DSPR(int, double, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void DSPR2(int, double, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void DSYMM(int, int, double, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, double, android.support.v8.renderscript.Allocation);
-    method public void DSYMV(int, double, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, double, android.support.v8.renderscript.Allocation, int);
-    method public void DSYR(int, double, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void DSYR2(int, double, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void DSYR2K(int, int, double, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, double, android.support.v8.renderscript.Allocation);
-    method public void DSYRK(int, int, double, android.support.v8.renderscript.Allocation, double, android.support.v8.renderscript.Allocation);
-    method public void DTBMV(int, int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void DTBSV(int, int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void DTPMV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void DTPSV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void DTRMM(int, int, int, int, double, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void DTRMV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void DTRSM(int, int, int, int, double, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void DTRSV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void SGBMV(int, int, int, float, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, float, android.support.v8.renderscript.Allocation, int);
-    method public void SGEMM(int, int, float, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, float, android.support.v8.renderscript.Allocation);
-    method public void SGEMV(int, float, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, float, android.support.v8.renderscript.Allocation, int);
-    method public void SGER(float, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void SSBMV(int, int, float, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, float, android.support.v8.renderscript.Allocation, int);
-    method public void SSPMV(int, float, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, float, android.support.v8.renderscript.Allocation, int);
-    method public void SSPR(int, float, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void SSPR2(int, float, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void SSYMM(int, int, float, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, float, android.support.v8.renderscript.Allocation);
-    method public void SSYMV(int, float, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, float, android.support.v8.renderscript.Allocation, int);
-    method public void SSYR(int, float, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void SSYR2(int, float, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void SSYR2K(int, int, float, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, float, android.support.v8.renderscript.Allocation);
-    method public void SSYRK(int, int, float, android.support.v8.renderscript.Allocation, float, android.support.v8.renderscript.Allocation);
-    method public void STBMV(int, int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void STBSV(int, int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void STPMV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void STPSV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void STRMM(int, int, int, int, float, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void STRMV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void STRSM(int, int, int, int, float, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void STRSV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void ZGBMV(int, int, int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, int);
-    method public void ZGEMM(int, int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation);
-    method public void ZGEMV(int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, int);
-    method public void ZGERC(android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void ZGERU(android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void ZHBMV(int, int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, int);
-    method public void ZHEMM(int, int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation);
-    method public void ZHEMV(int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, int);
-    method public void ZHER(int, double, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void ZHER2(int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void ZHER2K(int, int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, double, android.support.v8.renderscript.Allocation);
-    method public void ZHERK(int, int, double, android.support.v8.renderscript.Allocation, double, android.support.v8.renderscript.Allocation);
-    method public void ZHPMV(int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, int);
-    method public void ZHPR(int, double, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void ZHPR2(int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void ZSYMM(int, int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation);
-    method public void ZSYR2K(int, int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation);
-    method public void ZSYRK(int, int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation);
-    method public void ZTBMV(int, int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void ZTBSV(int, int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void ZTPMV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void ZTPSV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void ZTRMM(int, int, int, int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void ZTRMV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void ZTRSM(int, int, int, int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void ZTRSV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public static android.support.v8.renderscript.ScriptIntrinsicBLAS create(android.support.v8.renderscript.RenderScript);
-    field public static final int CONJ_TRANSPOSE = 113; // 0x71
-    field public static final int LEFT = 141; // 0x8d
-    field public static final int LOWER = 122; // 0x7a
-    field public static final int NON_UNIT = 131; // 0x83
-    field public static final int NO_TRANSPOSE = 111; // 0x6f
-    field public static final int RIGHT = 142; // 0x8e
-    field public static final int TRANSPOSE = 112; // 0x70
-    field public static final int UNIT = 132; // 0x84
-    field public static final int UPPER = 121; // 0x79
-  }
-
-  public class ScriptIntrinsicBlend extends android.support.v8.renderscript.ScriptIntrinsic {
-    method public static android.support.v8.renderscript.ScriptIntrinsicBlend create(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element);
-    method public void forEachAdd(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void forEachClear(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void forEachDst(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void forEachDstAtop(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void forEachDstIn(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void forEachDstOut(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void forEachDstOver(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void forEachMultiply(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void forEachSrc(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void forEachSrcAtop(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void forEachSrcIn(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void forEachSrcOut(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void forEachSrcOver(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void forEachSubtract(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void forEachXor(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public android.support.v8.renderscript.Script.KernelID getKernelIDAdd();
-    method public android.support.v8.renderscript.Script.KernelID getKernelIDClear();
-    method public android.support.v8.renderscript.Script.KernelID getKernelIDDst();
-    method public android.support.v8.renderscript.Script.KernelID getKernelIDDstAtop();
-    method public android.support.v8.renderscript.Script.KernelID getKernelIDDstIn();
-    method public android.support.v8.renderscript.Script.KernelID getKernelIDDstOut();
-    method public android.support.v8.renderscript.Script.KernelID getKernelIDDstOver();
-    method public android.support.v8.renderscript.Script.KernelID getKernelIDMultiply();
-    method public android.support.v8.renderscript.Script.KernelID getKernelIDSrc();
-    method public android.support.v8.renderscript.Script.KernelID getKernelIDSrcAtop();
-    method public android.support.v8.renderscript.Script.KernelID getKernelIDSrcIn();
-    method public android.support.v8.renderscript.Script.KernelID getKernelIDSrcOut();
-    method public android.support.v8.renderscript.Script.KernelID getKernelIDSrcOver();
-    method public android.support.v8.renderscript.Script.KernelID getKernelIDSubtract();
-    method public android.support.v8.renderscript.Script.KernelID getKernelIDXor();
-  }
-
-  public class ScriptIntrinsicBlur extends android.support.v8.renderscript.ScriptIntrinsic {
-    ctor protected ScriptIntrinsicBlur(long, android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.ScriptIntrinsicBlur create(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element);
-    method public void forEach(android.support.v8.renderscript.Allocation);
-    method public android.support.v8.renderscript.Script.FieldID getFieldID_Input();
-    method public android.support.v8.renderscript.Script.KernelID getKernelID();
-    method public void setInput(android.support.v8.renderscript.Allocation);
-    method public void setRadius(float);
-  }
-
-  public class ScriptIntrinsicColorMatrix extends android.support.v8.renderscript.ScriptIntrinsic {
-    ctor protected ScriptIntrinsicColorMatrix(long, android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.ScriptIntrinsicColorMatrix create(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element);
-    method public void forEach(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void forEach(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Script.LaunchOptions);
-    method public android.support.v8.renderscript.Script.KernelID getKernelID();
-    method public void setAdd(android.support.v8.renderscript.Float4);
-    method public void setAdd(float, float, float, float);
-    method public void setColorMatrix(android.support.v8.renderscript.Matrix4f);
-    method public void setColorMatrix(android.support.v8.renderscript.Matrix3f);
-    method public void setGreyscale();
-    method public void setRGBtoYUV();
-    method public void setYUVtoRGB();
-  }
-
-  public class ScriptIntrinsicConvolve3x3 extends android.support.v8.renderscript.ScriptIntrinsic {
-    method public static android.support.v8.renderscript.ScriptIntrinsicConvolve3x3 create(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element);
-    method public void forEach(android.support.v8.renderscript.Allocation);
-    method public void forEach(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Script.LaunchOptions);
-    method public android.support.v8.renderscript.Script.FieldID getFieldID_Input();
-    method public android.support.v8.renderscript.Script.KernelID getKernelID();
-    method public void setCoefficients(float[]);
-    method public void setInput(android.support.v8.renderscript.Allocation);
-  }
-
-  public class ScriptIntrinsicConvolve5x5 extends android.support.v8.renderscript.ScriptIntrinsic {
-    method public static android.support.v8.renderscript.ScriptIntrinsicConvolve5x5 create(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element);
-    method public void forEach(android.support.v8.renderscript.Allocation);
-    method public void forEach(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Script.LaunchOptions);
-    method public android.support.v8.renderscript.Script.FieldID getFieldID_Input();
-    method public android.support.v8.renderscript.Script.KernelID getKernelID();
-    method public void setCoefficients(float[]);
-    method public void setInput(android.support.v8.renderscript.Allocation);
-  }
-
-  public class ScriptIntrinsicHistogram extends android.support.v8.renderscript.ScriptIntrinsic {
-    ctor protected ScriptIntrinsicHistogram(long, android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.ScriptIntrinsicHistogram create(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element);
-    method public void forEach(android.support.v8.renderscript.Allocation);
-    method public void forEach(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Script.LaunchOptions);
-    method public void forEach_Dot(android.support.v8.renderscript.Allocation);
-    method public void forEach_Dot(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Script.LaunchOptions);
-    method public android.support.v8.renderscript.Script.FieldID getFieldID_Input();
-    method public android.support.v8.renderscript.Script.KernelID getKernelID_Separate();
-    method public void setDotCoefficients(float, float, float, float);
-    method public void setOutput(android.support.v8.renderscript.Allocation);
-  }
-
-  public class ScriptIntrinsicLUT extends android.support.v8.renderscript.ScriptIntrinsic {
-    ctor protected ScriptIntrinsicLUT(long, android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.ScriptIntrinsicLUT create(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element);
-    method public void forEach(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public android.support.v8.renderscript.Script.KernelID getKernelID();
-    method public void setAlpha(int, int);
-    method public void setBlue(int, int);
-    method public void setGreen(int, int);
-    method public void setRed(int, int);
-  }
-
-  public class ScriptIntrinsicResize extends android.support.v8.renderscript.ScriptIntrinsic {
-    ctor protected ScriptIntrinsicResize(long, android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.ScriptIntrinsicResize create(android.support.v8.renderscript.RenderScript);
-    method public void forEach_bicubic(android.support.v8.renderscript.Allocation);
-    method public void forEach_bicubic(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Script.LaunchOptions);
-    method public android.support.v8.renderscript.Script.FieldID getFieldID_Input();
-    method public android.support.v8.renderscript.Script.KernelID getKernelID_bicubic();
-    method public void setInput(android.support.v8.renderscript.Allocation);
-  }
-
-  public class ScriptIntrinsicYuvToRGB extends android.support.v8.renderscript.ScriptIntrinsic {
-    method public static android.support.v8.renderscript.ScriptIntrinsicYuvToRGB create(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element);
-    method public void forEach(android.support.v8.renderscript.Allocation);
-    method public android.support.v8.renderscript.Script.FieldID getFieldID_Input();
-    method public android.support.v8.renderscript.Script.KernelID getKernelID();
-    method public void setInput(android.support.v8.renderscript.Allocation);
-  }
-
-  public class Short2 {
-    ctor public Short2();
-    ctor public Short2(short, short);
-    field public short x;
-    field public short y;
-  }
-
-  public class Short3 {
-    ctor public Short3();
-    ctor public Short3(short, short, short);
-    field public short x;
-    field public short y;
-    field public short z;
-  }
-
-  public class Short4 {
-    ctor public Short4();
-    ctor public Short4(short, short, short, short);
-    field public short w;
-    field public short x;
-    field public short y;
-    field public short z;
-  }
-
-  public class Type extends android.support.v8.renderscript.BaseObj {
-    method public static android.support.v8.renderscript.Type createX(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element, int);
-    method public static android.support.v8.renderscript.Type createXY(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element, int, int);
-    method public static android.support.v8.renderscript.Type createXYZ(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element, int, int, int);
-    method public int getCount();
-    method public long getDummyType(android.support.v8.renderscript.RenderScript, long);
-    method public android.support.v8.renderscript.Element getElement();
-    method public int getX();
-    method public int getY();
-    method public int getYuv();
-    method public int getZ();
-    method public boolean hasFaces();
-    method public boolean hasMipmaps();
-  }
-
-  public static class Type.Builder {
-    ctor public Type.Builder(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element);
-    method public android.support.v8.renderscript.Type create();
-    method public android.support.v8.renderscript.Type.Builder setFaces(boolean);
-    method public android.support.v8.renderscript.Type.Builder setMipmaps(boolean);
-    method public android.support.v8.renderscript.Type.Builder setX(int);
-    method public android.support.v8.renderscript.Type.Builder setY(int);
-    method public android.support.v8.renderscript.Type.Builder setYuvFormat(int);
-    method public android.support.v8.renderscript.Type.Builder setZ(int);
-  }
-
-  public static final class Type.CubemapFace extends java.lang.Enum {
-    method public static android.support.v8.renderscript.Type.CubemapFace valueOf(java.lang.String);
-    method public static final android.support.v8.renderscript.Type.CubemapFace[] values();
-    enum_constant public static final android.support.v8.renderscript.Type.CubemapFace NEGATIVE_X;
-    enum_constant public static final android.support.v8.renderscript.Type.CubemapFace NEGATIVE_Y;
-    enum_constant public static final android.support.v8.renderscript.Type.CubemapFace NEGATIVE_Z;
-    enum_constant public static final android.support.v8.renderscript.Type.CubemapFace POSITIVE_X;
-    enum_constant public static final android.support.v8.renderscript.Type.CubemapFace POSITIVE_Y;
-    enum_constant public static final android.support.v8.renderscript.Type.CubemapFace POSITIVE_Z;
-  }
-
-}
-
diff --git a/v8/renderscript/api/current.txt b/v8/renderscript/api/current.txt
deleted file mode 100644
index 3d135b1..0000000
--- a/v8/renderscript/api/current.txt
+++ /dev/null
@@ -1,1013 +0,0 @@
-package android.support.v8.renderscript {
-
-  public class Allocation extends android.support.v8.renderscript.BaseObj {
-    method public void copy1DRangeFrom(int, int, java.lang.Object);
-    method public void copy1DRangeFrom(int, int, int[]);
-    method public void copy1DRangeFrom(int, int, short[]);
-    method public void copy1DRangeFrom(int, int, byte[]);
-    method public void copy1DRangeFrom(int, int, float[]);
-    method public void copy1DRangeFrom(int, int, android.support.v8.renderscript.Allocation, int);
-    method public void copy1DRangeFromUnchecked(int, int, java.lang.Object);
-    method public void copy1DRangeFromUnchecked(int, int, int[]);
-    method public void copy1DRangeFromUnchecked(int, int, short[]);
-    method public void copy1DRangeFromUnchecked(int, int, byte[]);
-    method public void copy1DRangeFromUnchecked(int, int, float[]);
-    method public void copy1DRangeTo(int, int, java.lang.Object);
-    method public void copy1DRangeTo(int, int, int[]);
-    method public void copy1DRangeTo(int, int, short[]);
-    method public void copy1DRangeTo(int, int, byte[]);
-    method public void copy1DRangeTo(int, int, float[]);
-    method public void copy1DRangeToUnchecked(int, int, java.lang.Object);
-    method public void copy1DRangeToUnchecked(int, int, int[]);
-    method public void copy1DRangeToUnchecked(int, int, short[]);
-    method public void copy1DRangeToUnchecked(int, int, byte[]);
-    method public void copy1DRangeToUnchecked(int, int, float[]);
-    method public void copy2DRangeFrom(int, int, int, int, java.lang.Object);
-    method public void copy2DRangeFrom(int, int, int, int, byte[]);
-    method public void copy2DRangeFrom(int, int, int, int, short[]);
-    method public void copy2DRangeFrom(int, int, int, int, int[]);
-    method public void copy2DRangeFrom(int, int, int, int, float[]);
-    method public void copy2DRangeFrom(int, int, int, int, android.support.v8.renderscript.Allocation, int, int);
-    method public void copy2DRangeFrom(int, int, android.graphics.Bitmap);
-    method public void copy2DRangeTo(int, int, int, int, java.lang.Object);
-    method public void copy2DRangeTo(int, int, int, int, byte[]);
-    method public void copy2DRangeTo(int, int, int, int, short[]);
-    method public void copy2DRangeTo(int, int, int, int, int[]);
-    method public void copy2DRangeTo(int, int, int, int, float[]);
-    method public void copy3DRangeFrom(int, int, int, int, int, int, java.lang.Object);
-    method public void copy3DRangeFrom(int, int, int, int, int, int, android.support.v8.renderscript.Allocation, int, int, int);
-    method public void copyFrom(android.support.v8.renderscript.BaseObj[]);
-    method public void copyFrom(java.lang.Object);
-    method public void copyFrom(int[]);
-    method public void copyFrom(short[]);
-    method public void copyFrom(byte[]);
-    method public void copyFrom(float[]);
-    method public void copyFrom(android.graphics.Bitmap);
-    method public void copyFrom(android.support.v8.renderscript.Allocation);
-    method public void copyFromUnchecked(java.lang.Object);
-    method public void copyFromUnchecked(int[]);
-    method public void copyFromUnchecked(short[]);
-    method public void copyFromUnchecked(byte[]);
-    method public void copyFromUnchecked(float[]);
-    method public void copyTo(android.graphics.Bitmap);
-    method public void copyTo(java.lang.Object);
-    method public void copyTo(byte[]);
-    method public void copyTo(short[]);
-    method public void copyTo(int[]);
-    method public void copyTo(float[]);
-    method public static android.support.v8.renderscript.Allocation createCubemapFromBitmap(android.support.v8.renderscript.RenderScript, android.graphics.Bitmap, android.support.v8.renderscript.Allocation.MipmapControl, int);
-    method public static android.support.v8.renderscript.Allocation createCubemapFromBitmap(android.support.v8.renderscript.RenderScript, android.graphics.Bitmap);
-    method public static android.support.v8.renderscript.Allocation createCubemapFromCubeFaces(android.support.v8.renderscript.RenderScript, android.graphics.Bitmap, android.graphics.Bitmap, android.graphics.Bitmap, android.graphics.Bitmap, android.graphics.Bitmap, android.graphics.Bitmap, android.support.v8.renderscript.Allocation.MipmapControl, int);
-    method public static android.support.v8.renderscript.Allocation createCubemapFromCubeFaces(android.support.v8.renderscript.RenderScript, android.graphics.Bitmap, android.graphics.Bitmap, android.graphics.Bitmap, android.graphics.Bitmap, android.graphics.Bitmap, android.graphics.Bitmap);
-    method public static android.support.v8.renderscript.Allocation createFromBitmap(android.support.v8.renderscript.RenderScript, android.graphics.Bitmap, android.support.v8.renderscript.Allocation.MipmapControl, int);
-    method public static android.support.v8.renderscript.Allocation createFromBitmap(android.support.v8.renderscript.RenderScript, android.graphics.Bitmap);
-    method public static android.support.v8.renderscript.Allocation createFromBitmapResource(android.support.v8.renderscript.RenderScript, android.content.res.Resources, int, android.support.v8.renderscript.Allocation.MipmapControl, int);
-    method public static android.support.v8.renderscript.Allocation createFromBitmapResource(android.support.v8.renderscript.RenderScript, android.content.res.Resources, int);
-    method public static android.support.v8.renderscript.Allocation createFromString(android.support.v8.renderscript.RenderScript, java.lang.String, int);
-    method public static android.support.v8.renderscript.Allocation createSized(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element, int, int);
-    method public static android.support.v8.renderscript.Allocation createSized(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element, int);
-    method public static android.support.v8.renderscript.Allocation createTyped(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Type, android.support.v8.renderscript.Allocation.MipmapControl, int);
-    method public static android.support.v8.renderscript.Allocation createTyped(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Type, int);
-    method public static android.support.v8.renderscript.Allocation createTyped(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Type);
-    method public void generateMipmaps();
-    method public java.nio.ByteBuffer getByteBuffer();
-    method public int getBytesSize();
-    method public android.support.v8.renderscript.Element getElement();
-    method public long getIncAllocID();
-    method public long getStride();
-    method public android.support.v8.renderscript.Type getType();
-    method public int getUsage();
-    method public void ioReceive();
-    method public void ioSend();
-    method public void ioSendOutput();
-    method public void setAutoPadding(boolean);
-    method public void setFromFieldPacker(int, android.support.v8.renderscript.FieldPacker);
-    method public void setFromFieldPacker(int, int, android.support.v8.renderscript.FieldPacker);
-    method public void setIncAllocID(long);
-    method public void setSurface(android.view.Surface);
-    method public void syncAll(int);
-    field public static final int USAGE_GRAPHICS_TEXTURE = 2; // 0x2
-    field public static final int USAGE_IO_INPUT = 32; // 0x20
-    field public static final int USAGE_IO_OUTPUT = 64; // 0x40
-    field public static final int USAGE_SCRIPT = 1; // 0x1
-    field public static final int USAGE_SHARED = 128; // 0x80
-  }
-
-  public static final class Allocation.MipmapControl extends java.lang.Enum {
-    method public static android.support.v8.renderscript.Allocation.MipmapControl valueOf(java.lang.String);
-    method public static final android.support.v8.renderscript.Allocation.MipmapControl[] values();
-    enum_constant public static final android.support.v8.renderscript.Allocation.MipmapControl MIPMAP_FULL;
-    enum_constant public static final android.support.v8.renderscript.Allocation.MipmapControl MIPMAP_NONE;
-    enum_constant public static final android.support.v8.renderscript.Allocation.MipmapControl MIPMAP_ON_SYNC_TO_TEXTURE;
-  }
-
-  public class BaseObj {
-    method public void destroy();
-  }
-
-  public class Byte2 {
-    ctor public Byte2();
-    ctor public Byte2(byte, byte);
-    field public byte x;
-    field public byte y;
-  }
-
-  public class Byte3 {
-    ctor public Byte3();
-    ctor public Byte3(byte, byte, byte);
-    field public byte x;
-    field public byte y;
-    field public byte z;
-  }
-
-  public class Byte4 {
-    ctor public Byte4();
-    ctor public Byte4(byte, byte, byte, byte);
-    field public byte w;
-    field public byte x;
-    field public byte y;
-    field public byte z;
-  }
-
-  public class Double2 {
-    ctor public Double2();
-    ctor public Double2(double, double);
-    field public double x;
-    field public double y;
-  }
-
-  public class Double3 {
-    ctor public Double3();
-    ctor public Double3(double, double, double);
-    field public double x;
-    field public double y;
-    field public double z;
-  }
-
-  public class Double4 {
-    ctor public Double4();
-    ctor public Double4(double, double, double, double);
-    field public double w;
-    field public double x;
-    field public double y;
-    field public double z;
-  }
-
-  public class Element extends android.support.v8.renderscript.BaseObj {
-    method public static android.support.v8.renderscript.Element ALLOCATION(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element A_8(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element BOOLEAN(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element ELEMENT(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element F32(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element F32_2(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element F32_3(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element F32_4(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element F64(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element F64_2(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element F64_3(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element F64_4(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element I16(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element I16_2(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element I16_3(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element I16_4(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element I32(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element I32_2(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element I32_3(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element I32_4(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element I64(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element I64_2(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element I64_3(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element I64_4(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element I8(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element I8_2(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element I8_3(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element I8_4(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element MATRIX_2X2(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element MATRIX_3X3(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element MATRIX_4X4(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element RGBA_4444(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element RGBA_5551(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element RGBA_8888(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element RGB_565(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element RGB_888(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element SAMPLER(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element SCRIPT(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element TYPE(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element U16(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element U16_2(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element U16_3(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element U16_4(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element U32(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element U32_2(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element U32_3(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element U32_4(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element U64(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element U64_2(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element U64_3(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element U64_4(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element U8(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element U8_2(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element U8_3(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element U8_4(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Element createPixel(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element.DataType, android.support.v8.renderscript.Element.DataKind);
-    method public static android.support.v8.renderscript.Element createVector(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element.DataType, int);
-    method public int getBytesSize();
-    method public android.support.v8.renderscript.Element.DataKind getDataKind();
-    method public android.support.v8.renderscript.Element.DataType getDataType();
-    method public long getDummyElement(android.support.v8.renderscript.RenderScript);
-    method public android.support.v8.renderscript.Element getSubElement(int);
-    method public int getSubElementArraySize(int);
-    method public int getSubElementCount();
-    method public java.lang.String getSubElementName(int);
-    method public int getSubElementOffsetBytes(int);
-    method public int getVectorSize();
-    method public boolean isCompatible(android.support.v8.renderscript.Element);
-    method public boolean isComplex();
-  }
-
-  public static class Element.Builder {
-    ctor public Element.Builder(android.support.v8.renderscript.RenderScript);
-    method public android.support.v8.renderscript.Element.Builder add(android.support.v8.renderscript.Element, java.lang.String, int);
-    method public android.support.v8.renderscript.Element.Builder add(android.support.v8.renderscript.Element, java.lang.String);
-    method public android.support.v8.renderscript.Element create();
-  }
-
-  public static final class Element.DataKind extends java.lang.Enum {
-    method public static android.support.v8.renderscript.Element.DataKind valueOf(java.lang.String);
-    method public static final android.support.v8.renderscript.Element.DataKind[] values();
-    enum_constant public static final android.support.v8.renderscript.Element.DataKind PIXEL_A;
-    enum_constant public static final android.support.v8.renderscript.Element.DataKind PIXEL_DEPTH;
-    enum_constant public static final android.support.v8.renderscript.Element.DataKind PIXEL_L;
-    enum_constant public static final android.support.v8.renderscript.Element.DataKind PIXEL_LA;
-    enum_constant public static final android.support.v8.renderscript.Element.DataKind PIXEL_RGB;
-    enum_constant public static final android.support.v8.renderscript.Element.DataKind PIXEL_RGBA;
-    enum_constant public static final android.support.v8.renderscript.Element.DataKind PIXEL_YUV;
-    enum_constant public static final android.support.v8.renderscript.Element.DataKind USER;
-  }
-
-  public static final class Element.DataType extends java.lang.Enum {
-    method public static android.support.v8.renderscript.Element.DataType valueOf(java.lang.String);
-    method public static final android.support.v8.renderscript.Element.DataType[] values();
-    enum_constant public static final android.support.v8.renderscript.Element.DataType BOOLEAN;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType FLOAT_32;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType FLOAT_64;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType MATRIX_2X2;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType MATRIX_3X3;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType MATRIX_4X4;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType NONE;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType RS_ALLOCATION;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType RS_ELEMENT;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType RS_SAMPLER;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType RS_SCRIPT;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType RS_TYPE;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType SIGNED_16;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType SIGNED_32;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType SIGNED_64;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType SIGNED_8;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType UNSIGNED_16;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType UNSIGNED_32;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType UNSIGNED_4_4_4_4;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType UNSIGNED_5_5_5_1;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType UNSIGNED_5_6_5;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType UNSIGNED_64;
-    enum_constant public static final android.support.v8.renderscript.Element.DataType UNSIGNED_8;
-  }
-
-  public class FieldPacker {
-    ctor public FieldPacker(int);
-    ctor public FieldPacker(byte[]);
-    method public void addBoolean(boolean);
-    method public void addF32(float);
-    method public void addF32(android.support.v8.renderscript.Float2);
-    method public void addF32(android.support.v8.renderscript.Float3);
-    method public void addF32(android.support.v8.renderscript.Float4);
-    method public void addF64(double);
-    method public void addF64(android.support.v8.renderscript.Double2);
-    method public void addF64(android.support.v8.renderscript.Double3);
-    method public void addF64(android.support.v8.renderscript.Double4);
-    method public void addI16(short);
-    method public void addI16(android.support.v8.renderscript.Short2);
-    method public void addI16(android.support.v8.renderscript.Short3);
-    method public void addI16(android.support.v8.renderscript.Short4);
-    method public void addI32(int);
-    method public void addI32(android.support.v8.renderscript.Int2);
-    method public void addI32(android.support.v8.renderscript.Int3);
-    method public void addI32(android.support.v8.renderscript.Int4);
-    method public void addI64(long);
-    method public void addI64(android.support.v8.renderscript.Long2);
-    method public void addI64(android.support.v8.renderscript.Long3);
-    method public void addI64(android.support.v8.renderscript.Long4);
-    method public void addI8(byte);
-    method public void addI8(android.support.v8.renderscript.Byte2);
-    method public void addI8(android.support.v8.renderscript.Byte3);
-    method public void addI8(android.support.v8.renderscript.Byte4);
-    method public void addMatrix(android.support.v8.renderscript.Matrix4f);
-    method public void addMatrix(android.support.v8.renderscript.Matrix3f);
-    method public void addMatrix(android.support.v8.renderscript.Matrix2f);
-    method public void addObj(android.support.v8.renderscript.BaseObj);
-    method public void addU16(int);
-    method public void addU16(android.support.v8.renderscript.Int2);
-    method public void addU16(android.support.v8.renderscript.Int3);
-    method public void addU16(android.support.v8.renderscript.Int4);
-    method public void addU32(long);
-    method public void addU32(android.support.v8.renderscript.Long2);
-    method public void addU32(android.support.v8.renderscript.Long3);
-    method public void addU32(android.support.v8.renderscript.Long4);
-    method public void addU64(long);
-    method public void addU64(android.support.v8.renderscript.Long2);
-    method public void addU64(android.support.v8.renderscript.Long3);
-    method public void addU64(android.support.v8.renderscript.Long4);
-    method public void addU8(short);
-    method public void addU8(android.support.v8.renderscript.Short2);
-    method public void addU8(android.support.v8.renderscript.Short3);
-    method public void addU8(android.support.v8.renderscript.Short4);
-    method public void align(int);
-    method public final byte[] getData();
-    method public void reset();
-    method public void reset(int);
-    method public void skip(int);
-    method public boolean subBoolean();
-    method public android.support.v8.renderscript.Byte2 subByte2();
-    method public android.support.v8.renderscript.Byte3 subByte3();
-    method public android.support.v8.renderscript.Byte4 subByte4();
-    method public android.support.v8.renderscript.Double2 subDouble2();
-    method public android.support.v8.renderscript.Double3 subDouble3();
-    method public android.support.v8.renderscript.Double4 subDouble4();
-    method public float subF32();
-    method public double subF64();
-    method public android.support.v8.renderscript.Float2 subFloat2();
-    method public android.support.v8.renderscript.Float3 subFloat3();
-    method public android.support.v8.renderscript.Float4 subFloat4();
-    method public short subI16();
-    method public int subI32();
-    method public long subI64();
-    method public byte subI8();
-    method public android.support.v8.renderscript.Int2 subInt2();
-    method public android.support.v8.renderscript.Int3 subInt3();
-    method public android.support.v8.renderscript.Int4 subInt4();
-    method public android.support.v8.renderscript.Long2 subLong2();
-    method public android.support.v8.renderscript.Long3 subLong3();
-    method public android.support.v8.renderscript.Long4 subLong4();
-    method public android.support.v8.renderscript.Matrix2f subMatrix2f();
-    method public android.support.v8.renderscript.Matrix3f subMatrix3f();
-    method public android.support.v8.renderscript.Matrix4f subMatrix4f();
-    method public android.support.v8.renderscript.Short2 subShort2();
-    method public android.support.v8.renderscript.Short3 subShort3();
-    method public android.support.v8.renderscript.Short4 subShort4();
-    method public void subalign(int);
-  }
-
-  public class Float2 {
-    ctor public Float2();
-    ctor public Float2(float, float);
-    field public float x;
-    field public float y;
-  }
-
-  public class Float3 {
-    ctor public Float3();
-    ctor public Float3(float, float, float);
-    field public float x;
-    field public float y;
-    field public float z;
-  }
-
-  public class Float4 {
-    ctor public Float4();
-    ctor public Float4(float, float, float, float);
-    field public float w;
-    field public float x;
-    field public float y;
-    field public float z;
-  }
-
-  public class Int2 {
-    ctor public Int2();
-    ctor public Int2(int, int);
-    field public int x;
-    field public int y;
-  }
-
-  public class Int3 {
-    ctor public Int3();
-    ctor public Int3(int, int, int);
-    field public int x;
-    field public int y;
-    field public int z;
-  }
-
-  public class Int4 {
-    ctor public Int4();
-    ctor public Int4(int, int, int, int);
-    field public int w;
-    field public int x;
-    field public int y;
-    field public int z;
-  }
-
-  public class Long2 {
-    ctor public Long2();
-    ctor public Long2(long, long);
-    field public long x;
-    field public long y;
-  }
-
-  public class Long3 {
-    ctor public Long3();
-    ctor public Long3(long, long, long);
-    field public long x;
-    field public long y;
-    field public long z;
-  }
-
-  public class Long4 {
-    ctor public Long4();
-    ctor public Long4(long, long, long, long);
-    field public long w;
-    field public long x;
-    field public long y;
-    field public long z;
-  }
-
-  public class Matrix2f {
-    ctor public Matrix2f();
-    ctor public Matrix2f(float[]);
-    method public float get(int, int);
-    method public float[] getArray();
-    method public void load(android.support.v8.renderscript.Matrix2f);
-    method public void loadIdentity();
-    method public void loadMultiply(android.support.v8.renderscript.Matrix2f, android.support.v8.renderscript.Matrix2f);
-    method public void loadRotate(float);
-    method public void loadScale(float, float);
-    method public void multiply(android.support.v8.renderscript.Matrix2f);
-    method public void rotate(float);
-    method public void scale(float, float);
-    method public void set(int, int, float);
-    method public void transpose();
-  }
-
-  public class Matrix3f {
-    ctor public Matrix3f();
-    ctor public Matrix3f(float[]);
-    method public float get(int, int);
-    method public float[] getArray();
-    method public void load(android.support.v8.renderscript.Matrix3f);
-    method public void loadIdentity();
-    method public void loadMultiply(android.support.v8.renderscript.Matrix3f, android.support.v8.renderscript.Matrix3f);
-    method public void loadRotate(float, float, float, float);
-    method public void loadRotate(float);
-    method public void loadScale(float, float);
-    method public void loadScale(float, float, float);
-    method public void loadTranslate(float, float);
-    method public void multiply(android.support.v8.renderscript.Matrix3f);
-    method public void rotate(float, float, float, float);
-    method public void rotate(float);
-    method public void scale(float, float);
-    method public void scale(float, float, float);
-    method public void set(int, int, float);
-    method public void translate(float, float);
-    method public void transpose();
-  }
-
-  public class Matrix4f {
-    ctor public Matrix4f();
-    ctor public Matrix4f(float[]);
-    method public float get(int, int);
-    method public float[] getArray();
-    method public boolean inverse();
-    method public boolean inverseTranspose();
-    method public void load(android.support.v8.renderscript.Matrix4f);
-    method public void loadFrustum(float, float, float, float, float, float);
-    method public void loadIdentity();
-    method public void loadMultiply(android.support.v8.renderscript.Matrix4f, android.support.v8.renderscript.Matrix4f);
-    method public void loadOrtho(float, float, float, float, float, float);
-    method public void loadOrthoWindow(int, int);
-    method public void loadPerspective(float, float, float, float);
-    method public void loadProjectionNormalized(int, int);
-    method public void loadRotate(float, float, float, float);
-    method public void loadScale(float, float, float);
-    method public void loadTranslate(float, float, float);
-    method public void multiply(android.support.v8.renderscript.Matrix4f);
-    method public void rotate(float, float, float, float);
-    method public void scale(float, float, float);
-    method public void set(int, int, float);
-    method public void translate(float, float, float);
-    method public void transpose();
-  }
-
-  public class RSDriverException extends android.support.v8.renderscript.RSRuntimeException {
-    ctor public RSDriverException(java.lang.String);
-  }
-
-  public class RSIllegalArgumentException extends android.support.v8.renderscript.RSRuntimeException {
-    ctor public RSIllegalArgumentException(java.lang.String);
-  }
-
-  public class RSInvalidStateException extends android.support.v8.renderscript.RSRuntimeException {
-    ctor public RSInvalidStateException(java.lang.String);
-  }
-
-  public class RSRuntimeException extends java.lang.RuntimeException {
-    ctor public RSRuntimeException(java.lang.String);
-  }
-
-  public class RenderScript {
-    method public void contextDump();
-    method public static android.support.v8.renderscript.RenderScript create(android.content.Context);
-    method public static android.support.v8.renderscript.RenderScript create(android.content.Context, android.support.v8.renderscript.RenderScript.ContextType);
-    method public static android.support.v8.renderscript.RenderScript create(android.content.Context, android.support.v8.renderscript.RenderScript.ContextType, int);
-    method public static android.support.v8.renderscript.RenderScript create(android.content.Context, int, android.support.v8.renderscript.RenderScript.ContextType, int);
-    method public static android.support.v8.renderscript.RenderScript createMultiContext(android.content.Context, android.support.v8.renderscript.RenderScript.ContextType, int, int);
-    method public void destroy();
-    method public void finish();
-    method public static void forceCompat();
-    method public final android.content.Context getApplicationContext();
-    method public android.support.v8.renderscript.RenderScript.RSErrorHandler getErrorHandler();
-    method public android.support.v8.renderscript.RenderScript.RSMessageHandler getMessageHandler();
-    method public static void releaseAllContexts();
-    method public void sendMessage(int, int[]);
-    method public static void setBlackList(java.lang.String);
-    method public void setErrorHandler(android.support.v8.renderscript.RenderScript.RSErrorHandler);
-    method public void setMessageHandler(android.support.v8.renderscript.RenderScript.RSMessageHandler);
-    method public void setPriority(android.support.v8.renderscript.RenderScript.Priority);
-    field public static final int CREATE_FLAG_NONE = 0; // 0x0
-  }
-
-  public static final class RenderScript.ContextType extends java.lang.Enum {
-    method public static android.support.v8.renderscript.RenderScript.ContextType valueOf(java.lang.String);
-    method public static final android.support.v8.renderscript.RenderScript.ContextType[] values();
-    enum_constant public static final android.support.v8.renderscript.RenderScript.ContextType DEBUG;
-    enum_constant public static final android.support.v8.renderscript.RenderScript.ContextType NORMAL;
-    enum_constant public static final android.support.v8.renderscript.RenderScript.ContextType PROFILE;
-  }
-
-  public static final class RenderScript.Priority extends java.lang.Enum {
-    method public static android.support.v8.renderscript.RenderScript.Priority valueOf(java.lang.String);
-    method public static final android.support.v8.renderscript.RenderScript.Priority[] values();
-    enum_constant public static final android.support.v8.renderscript.RenderScript.Priority LOW;
-    enum_constant public static final android.support.v8.renderscript.RenderScript.Priority NORMAL;
-  }
-
-  public static class RenderScript.RSErrorHandler implements java.lang.Runnable {
-    ctor public RenderScript.RSErrorHandler();
-    method public void run();
-    field protected java.lang.String mErrorMessage;
-    field protected int mErrorNum;
-  }
-
-  public static class RenderScript.RSMessageHandler implements java.lang.Runnable {
-    ctor public RenderScript.RSMessageHandler();
-    method public void run();
-    field protected int[] mData;
-    field protected int mID;
-    field protected int mLength;
-  }
-
-  public class Sampler extends android.support.v8.renderscript.BaseObj {
-    method public static android.support.v8.renderscript.Sampler CLAMP_LINEAR(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Sampler CLAMP_LINEAR_MIP_LINEAR(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Sampler CLAMP_NEAREST(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Sampler MIRRORED_REPEAT_LINEAR(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Sampler MIRRORED_REPEAT_NEAREST(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Sampler WRAP_LINEAR(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Sampler WRAP_LINEAR_MIP_LINEAR(android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.Sampler WRAP_NEAREST(android.support.v8.renderscript.RenderScript);
-    method public float getAnisotropy();
-    method public android.support.v8.renderscript.Sampler.Value getMagnification();
-    method public android.support.v8.renderscript.Sampler.Value getMinification();
-    method public android.support.v8.renderscript.Sampler.Value getWrapS();
-    method public android.support.v8.renderscript.Sampler.Value getWrapT();
-  }
-
-  public static class Sampler.Builder {
-    ctor public Sampler.Builder(android.support.v8.renderscript.RenderScript);
-    method public android.support.v8.renderscript.Sampler create();
-    method public void setAnisotropy(float);
-    method public void setMagnification(android.support.v8.renderscript.Sampler.Value);
-    method public void setMinification(android.support.v8.renderscript.Sampler.Value);
-    method public void setWrapS(android.support.v8.renderscript.Sampler.Value);
-    method public void setWrapT(android.support.v8.renderscript.Sampler.Value);
-  }
-
-  public static final class Sampler.Value extends java.lang.Enum {
-    method public static android.support.v8.renderscript.Sampler.Value valueOf(java.lang.String);
-    method public static final android.support.v8.renderscript.Sampler.Value[] values();
-    enum_constant public static final android.support.v8.renderscript.Sampler.Value CLAMP;
-    enum_constant public static final android.support.v8.renderscript.Sampler.Value LINEAR;
-    enum_constant public static final android.support.v8.renderscript.Sampler.Value LINEAR_MIP_LINEAR;
-    enum_constant public static final android.support.v8.renderscript.Sampler.Value LINEAR_MIP_NEAREST;
-    enum_constant public static final android.support.v8.renderscript.Sampler.Value MIRRORED_REPEAT;
-    enum_constant public static final android.support.v8.renderscript.Sampler.Value NEAREST;
-    enum_constant public static final android.support.v8.renderscript.Sampler.Value WRAP;
-  }
-
-  public class Script extends android.support.v8.renderscript.BaseObj {
-    method public void bindAllocation(android.support.v8.renderscript.Allocation, int);
-    method protected android.support.v8.renderscript.Script.FieldID createFieldID(int, android.support.v8.renderscript.Element);
-    method protected android.support.v8.renderscript.Script.InvokeID createInvokeID(int);
-    method protected android.support.v8.renderscript.Script.KernelID createKernelID(int, int, android.support.v8.renderscript.Element, android.support.v8.renderscript.Element);
-    method protected void forEach(int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.FieldPacker);
-    method protected void forEach(int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.FieldPacker, android.support.v8.renderscript.Script.LaunchOptions);
-    method protected void invoke(int);
-    method protected void invoke(int, android.support.v8.renderscript.FieldPacker);
-    method protected boolean isIncSupp();
-    method protected void setIncSupp(boolean);
-    method public void setTimeZone(java.lang.String);
-    method public void setVar(int, float);
-    method public void setVar(int, double);
-    method public void setVar(int, int);
-    method public void setVar(int, long);
-    method public void setVar(int, boolean);
-    method public void setVar(int, android.support.v8.renderscript.BaseObj);
-    method public void setVar(int, android.support.v8.renderscript.FieldPacker);
-    method public void setVar(int, android.support.v8.renderscript.FieldPacker, android.support.v8.renderscript.Element, int[]);
-  }
-
-  public static class Script.Builder {
-  }
-
-  public static class Script.FieldBase {
-    ctor protected Script.FieldBase();
-    method public android.support.v8.renderscript.Allocation getAllocation();
-    method public android.support.v8.renderscript.Element getElement();
-    method public android.support.v8.renderscript.Type getType();
-    method protected void init(android.support.v8.renderscript.RenderScript, int);
-    method protected void init(android.support.v8.renderscript.RenderScript, int, int);
-    method public void updateAllocation();
-    field protected android.support.v8.renderscript.Allocation mAllocation;
-    field protected android.support.v8.renderscript.Element mElement;
-  }
-
-  public static final class Script.FieldID extends android.support.v8.renderscript.BaseObj {
-  }
-
-  public static final class Script.InvokeID extends android.support.v8.renderscript.BaseObj {
-  }
-
-  public static final class Script.KernelID extends android.support.v8.renderscript.BaseObj {
-  }
-
-  public static final class Script.LaunchOptions {
-    ctor public Script.LaunchOptions();
-    method public int getXEnd();
-    method public int getXStart();
-    method public int getYEnd();
-    method public int getYStart();
-    method public int getZEnd();
-    method public int getZStart();
-    method public android.support.v8.renderscript.Script.LaunchOptions setX(int, int);
-    method public android.support.v8.renderscript.Script.LaunchOptions setY(int, int);
-    method public android.support.v8.renderscript.Script.LaunchOptions setZ(int, int);
-  }
-
-  public class ScriptC extends android.support.v8.renderscript.Script {
-    ctor protected ScriptC(long, android.support.v8.renderscript.RenderScript);
-    ctor protected ScriptC(android.support.v8.renderscript.RenderScript, android.content.res.Resources, int);
-    ctor protected ScriptC(android.support.v8.renderscript.RenderScript, java.lang.String, byte[], byte[]);
-  }
-
-  public final class ScriptGroup extends android.support.v8.renderscript.BaseObj {
-    method public java.lang.Object[] execute(java.lang.Object...);
-    method public deprecated void execute();
-    method public deprecated void setInput(android.support.v8.renderscript.Script.KernelID, android.support.v8.renderscript.Allocation);
-    method public deprecated void setOutput(android.support.v8.renderscript.Script.KernelID, android.support.v8.renderscript.Allocation);
-  }
-
-  public static final class ScriptGroup.Binding {
-    ctor public ScriptGroup.Binding(android.support.v8.renderscript.Script.FieldID, java.lang.Object);
-    method public android.support.v8.renderscript.Script.FieldID getField();
-    method public java.lang.Object getValue();
-  }
-
-  public static final deprecated class ScriptGroup.Builder {
-    ctor public ScriptGroup.Builder(android.support.v8.renderscript.RenderScript);
-    method public android.support.v8.renderscript.ScriptGroup.Builder addConnection(android.support.v8.renderscript.Type, android.support.v8.renderscript.Script.KernelID, android.support.v8.renderscript.Script.FieldID);
-    method public android.support.v8.renderscript.ScriptGroup.Builder addConnection(android.support.v8.renderscript.Type, android.support.v8.renderscript.Script.KernelID, android.support.v8.renderscript.Script.KernelID);
-    method public android.support.v8.renderscript.ScriptGroup.Builder addKernel(android.support.v8.renderscript.Script.KernelID);
-    method public android.support.v8.renderscript.ScriptGroup create();
-  }
-
-  public static final class ScriptGroup.Builder2 {
-    ctor public ScriptGroup.Builder2(android.support.v8.renderscript.RenderScript);
-    method public android.support.v8.renderscript.ScriptGroup.Input addInput();
-    method public android.support.v8.renderscript.ScriptGroup.Closure addInvoke(android.support.v8.renderscript.Script.InvokeID, java.lang.Object...);
-    method public android.support.v8.renderscript.ScriptGroup.Closure addKernel(android.support.v8.renderscript.Script.KernelID, android.support.v8.renderscript.Type, java.lang.Object...);
-    method public android.support.v8.renderscript.ScriptGroup create(java.lang.String, android.support.v8.renderscript.ScriptGroup.Future...);
-  }
-
-  public static final class ScriptGroup.Closure extends android.support.v8.renderscript.BaseObj {
-    method public android.support.v8.renderscript.ScriptGroup.Future getGlobal(android.support.v8.renderscript.Script.FieldID);
-    method public android.support.v8.renderscript.ScriptGroup.Future getReturn();
-  }
-
-  public static final class ScriptGroup.Future {
-  }
-
-  public static final class ScriptGroup.Input {
-  }
-
-  public abstract class ScriptIntrinsic extends android.support.v8.renderscript.Script {
-  }
-
-  public class ScriptIntrinsic3DLUT extends android.support.v8.renderscript.ScriptIntrinsic {
-    ctor protected ScriptIntrinsic3DLUT(long, android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element);
-    method public static android.support.v8.renderscript.ScriptIntrinsic3DLUT create(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element);
-    method public void forEach(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public android.support.v8.renderscript.Script.KernelID getKernelID();
-    method public void setLUT(android.support.v8.renderscript.Allocation);
-  }
-
-  public final class ScriptIntrinsicBLAS extends android.support.v8.renderscript.ScriptIntrinsic {
-    method public void BNNM(android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, int);
-    method public void CGBMV(int, int, int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, int);
-    method public void CGEMM(int, int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation);
-    method public void CGEMV(int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, int);
-    method public void CGERC(android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void CGERU(android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void CHBMV(int, int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, int);
-    method public void CHEMM(int, int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation);
-    method public void CHEMV(int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, int);
-    method public void CHER(int, float, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void CHER2(int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void CHER2K(int, int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, float, android.support.v8.renderscript.Allocation);
-    method public void CHERK(int, int, float, android.support.v8.renderscript.Allocation, float, android.support.v8.renderscript.Allocation);
-    method public void CHPMV(int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, int);
-    method public void CHPR(int, float, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void CHPR2(int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void CSYMM(int, int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation);
-    method public void CSYR2K(int, int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation);
-    method public void CSYRK(int, int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation);
-    method public void CTBMV(int, int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void CTBSV(int, int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void CTPMV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void CTPSV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void CTRMM(int, int, int, int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void CTRMV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void CTRSM(int, int, int, int, android.support.v8.renderscript.Float2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void CTRSV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void DGBMV(int, int, int, double, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, double, android.support.v8.renderscript.Allocation, int);
-    method public void DGEMM(int, int, double, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, double, android.support.v8.renderscript.Allocation);
-    method public void DGEMV(int, double, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, double, android.support.v8.renderscript.Allocation, int);
-    method public void DGER(double, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void DSBMV(int, int, double, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, double, android.support.v8.renderscript.Allocation, int);
-    method public void DSPMV(int, double, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, double, android.support.v8.renderscript.Allocation, int);
-    method public void DSPR(int, double, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void DSPR2(int, double, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void DSYMM(int, int, double, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, double, android.support.v8.renderscript.Allocation);
-    method public void DSYMV(int, double, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, double, android.support.v8.renderscript.Allocation, int);
-    method public void DSYR(int, double, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void DSYR2(int, double, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void DSYR2K(int, int, double, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, double, android.support.v8.renderscript.Allocation);
-    method public void DSYRK(int, int, double, android.support.v8.renderscript.Allocation, double, android.support.v8.renderscript.Allocation);
-    method public void DTBMV(int, int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void DTBSV(int, int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void DTPMV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void DTPSV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void DTRMM(int, int, int, int, double, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void DTRMV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void DTRSM(int, int, int, int, double, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void DTRSV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void SGBMV(int, int, int, float, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, float, android.support.v8.renderscript.Allocation, int);
-    method public void SGEMM(int, int, float, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, float, android.support.v8.renderscript.Allocation);
-    method public void SGEMV(int, float, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, float, android.support.v8.renderscript.Allocation, int);
-    method public void SGER(float, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void SSBMV(int, int, float, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, float, android.support.v8.renderscript.Allocation, int);
-    method public void SSPMV(int, float, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, float, android.support.v8.renderscript.Allocation, int);
-    method public void SSPR(int, float, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void SSPR2(int, float, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void SSYMM(int, int, float, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, float, android.support.v8.renderscript.Allocation);
-    method public void SSYMV(int, float, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, float, android.support.v8.renderscript.Allocation, int);
-    method public void SSYR(int, float, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void SSYR2(int, float, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void SSYR2K(int, int, float, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, float, android.support.v8.renderscript.Allocation);
-    method public void SSYRK(int, int, float, android.support.v8.renderscript.Allocation, float, android.support.v8.renderscript.Allocation);
-    method public void STBMV(int, int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void STBSV(int, int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void STPMV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void STPSV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void STRMM(int, int, int, int, float, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void STRMV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void STRSM(int, int, int, int, float, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void STRSV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void ZGBMV(int, int, int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, int);
-    method public void ZGEMM(int, int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation);
-    method public void ZGEMV(int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, int);
-    method public void ZGERC(android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void ZGERU(android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void ZHBMV(int, int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, int);
-    method public void ZHEMM(int, int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation);
-    method public void ZHEMV(int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, int);
-    method public void ZHER(int, double, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void ZHER2(int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void ZHER2K(int, int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, double, android.support.v8.renderscript.Allocation);
-    method public void ZHERK(int, int, double, android.support.v8.renderscript.Allocation, double, android.support.v8.renderscript.Allocation);
-    method public void ZHPMV(int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, int);
-    method public void ZHPR(int, double, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void ZHPR2(int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation, int, android.support.v8.renderscript.Allocation);
-    method public void ZSYMM(int, int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation);
-    method public void ZSYR2K(int, int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation);
-    method public void ZSYRK(int, int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation);
-    method public void ZTBMV(int, int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void ZTBSV(int, int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void ZTPMV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void ZTPSV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void ZTRMM(int, int, int, int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void ZTRMV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public void ZTRSM(int, int, int, int, android.support.v8.renderscript.Double2, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void ZTRSV(int, int, int, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, int);
-    method public static android.support.v8.renderscript.ScriptIntrinsicBLAS create(android.support.v8.renderscript.RenderScript);
-    field public static final int CONJ_TRANSPOSE = 113; // 0x71
-    field public static final int LEFT = 141; // 0x8d
-    field public static final int LOWER = 122; // 0x7a
-    field public static final int NON_UNIT = 131; // 0x83
-    field public static final int NO_TRANSPOSE = 111; // 0x6f
-    field public static final int RIGHT = 142; // 0x8e
-    field public static final int TRANSPOSE = 112; // 0x70
-    field public static final int UNIT = 132; // 0x84
-    field public static final int UPPER = 121; // 0x79
-  }
-
-  public class ScriptIntrinsicBlend extends android.support.v8.renderscript.ScriptIntrinsic {
-    method public static android.support.v8.renderscript.ScriptIntrinsicBlend create(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element);
-    method public void forEachAdd(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void forEachClear(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void forEachDst(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void forEachDstAtop(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void forEachDstIn(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void forEachDstOut(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void forEachDstOver(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void forEachMultiply(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void forEachSrc(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void forEachSrcAtop(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void forEachSrcIn(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void forEachSrcOut(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void forEachSrcOver(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void forEachSubtract(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void forEachXor(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public android.support.v8.renderscript.Script.KernelID getKernelIDAdd();
-    method public android.support.v8.renderscript.Script.KernelID getKernelIDClear();
-    method public android.support.v8.renderscript.Script.KernelID getKernelIDDst();
-    method public android.support.v8.renderscript.Script.KernelID getKernelIDDstAtop();
-    method public android.support.v8.renderscript.Script.KernelID getKernelIDDstIn();
-    method public android.support.v8.renderscript.Script.KernelID getKernelIDDstOut();
-    method public android.support.v8.renderscript.Script.KernelID getKernelIDDstOver();
-    method public android.support.v8.renderscript.Script.KernelID getKernelIDMultiply();
-    method public android.support.v8.renderscript.Script.KernelID getKernelIDSrc();
-    method public android.support.v8.renderscript.Script.KernelID getKernelIDSrcAtop();
-    method public android.support.v8.renderscript.Script.KernelID getKernelIDSrcIn();
-    method public android.support.v8.renderscript.Script.KernelID getKernelIDSrcOut();
-    method public android.support.v8.renderscript.Script.KernelID getKernelIDSrcOver();
-    method public android.support.v8.renderscript.Script.KernelID getKernelIDSubtract();
-    method public android.support.v8.renderscript.Script.KernelID getKernelIDXor();
-  }
-
-  public class ScriptIntrinsicBlur extends android.support.v8.renderscript.ScriptIntrinsic {
-    ctor protected ScriptIntrinsicBlur(long, android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.ScriptIntrinsicBlur create(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element);
-    method public void forEach(android.support.v8.renderscript.Allocation);
-    method public android.support.v8.renderscript.Script.FieldID getFieldID_Input();
-    method public android.support.v8.renderscript.Script.KernelID getKernelID();
-    method public void setInput(android.support.v8.renderscript.Allocation);
-    method public void setRadius(float);
-  }
-
-  public class ScriptIntrinsicColorMatrix extends android.support.v8.renderscript.ScriptIntrinsic {
-    ctor protected ScriptIntrinsicColorMatrix(long, android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.ScriptIntrinsicColorMatrix create(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element);
-    method public void forEach(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public void forEach(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Script.LaunchOptions);
-    method public android.support.v8.renderscript.Script.KernelID getKernelID();
-    method public void setAdd(android.support.v8.renderscript.Float4);
-    method public void setAdd(float, float, float, float);
-    method public void setColorMatrix(android.support.v8.renderscript.Matrix4f);
-    method public void setColorMatrix(android.support.v8.renderscript.Matrix3f);
-    method public void setGreyscale();
-    method public void setRGBtoYUV();
-    method public void setYUVtoRGB();
-  }
-
-  public class ScriptIntrinsicConvolve3x3 extends android.support.v8.renderscript.ScriptIntrinsic {
-    method public static android.support.v8.renderscript.ScriptIntrinsicConvolve3x3 create(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element);
-    method public void forEach(android.support.v8.renderscript.Allocation);
-    method public void forEach(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Script.LaunchOptions);
-    method public android.support.v8.renderscript.Script.FieldID getFieldID_Input();
-    method public android.support.v8.renderscript.Script.KernelID getKernelID();
-    method public void setCoefficients(float[]);
-    method public void setInput(android.support.v8.renderscript.Allocation);
-  }
-
-  public class ScriptIntrinsicConvolve5x5 extends android.support.v8.renderscript.ScriptIntrinsic {
-    method public static android.support.v8.renderscript.ScriptIntrinsicConvolve5x5 create(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element);
-    method public void forEach(android.support.v8.renderscript.Allocation);
-    method public void forEach(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Script.LaunchOptions);
-    method public android.support.v8.renderscript.Script.FieldID getFieldID_Input();
-    method public android.support.v8.renderscript.Script.KernelID getKernelID();
-    method public void setCoefficients(float[]);
-    method public void setInput(android.support.v8.renderscript.Allocation);
-  }
-
-  public class ScriptIntrinsicHistogram extends android.support.v8.renderscript.ScriptIntrinsic {
-    ctor protected ScriptIntrinsicHistogram(long, android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.ScriptIntrinsicHistogram create(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element);
-    method public void forEach(android.support.v8.renderscript.Allocation);
-    method public void forEach(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Script.LaunchOptions);
-    method public void forEach_Dot(android.support.v8.renderscript.Allocation);
-    method public void forEach_Dot(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Script.LaunchOptions);
-    method public android.support.v8.renderscript.Script.FieldID getFieldID_Input();
-    method public android.support.v8.renderscript.Script.KernelID getKernelID_Separate();
-    method public void setDotCoefficients(float, float, float, float);
-    method public void setOutput(android.support.v8.renderscript.Allocation);
-  }
-
-  public class ScriptIntrinsicLUT extends android.support.v8.renderscript.ScriptIntrinsic {
-    ctor protected ScriptIntrinsicLUT(long, android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.ScriptIntrinsicLUT create(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element);
-    method public void forEach(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Allocation);
-    method public android.support.v8.renderscript.Script.KernelID getKernelID();
-    method public void setAlpha(int, int);
-    method public void setBlue(int, int);
-    method public void setGreen(int, int);
-    method public void setRed(int, int);
-  }
-
-  public class ScriptIntrinsicResize extends android.support.v8.renderscript.ScriptIntrinsic {
-    ctor protected ScriptIntrinsicResize(long, android.support.v8.renderscript.RenderScript);
-    method public static android.support.v8.renderscript.ScriptIntrinsicResize create(android.support.v8.renderscript.RenderScript);
-    method public void forEach_bicubic(android.support.v8.renderscript.Allocation);
-    method public void forEach_bicubic(android.support.v8.renderscript.Allocation, android.support.v8.renderscript.Script.LaunchOptions);
-    method public android.support.v8.renderscript.Script.FieldID getFieldID_Input();
-    method public android.support.v8.renderscript.Script.KernelID getKernelID_bicubic();
-    method public void setInput(android.support.v8.renderscript.Allocation);
-  }
-
-  public class ScriptIntrinsicYuvToRGB extends android.support.v8.renderscript.ScriptIntrinsic {
-    method public static android.support.v8.renderscript.ScriptIntrinsicYuvToRGB create(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element);
-    method public void forEach(android.support.v8.renderscript.Allocation);
-    method public android.support.v8.renderscript.Script.FieldID getFieldID_Input();
-    method public android.support.v8.renderscript.Script.KernelID getKernelID();
-    method public void setInput(android.support.v8.renderscript.Allocation);
-  }
-
-  public class Short2 {
-    ctor public Short2();
-    ctor public Short2(short, short);
-    field public short x;
-    field public short y;
-  }
-
-  public class Short3 {
-    ctor public Short3();
-    ctor public Short3(short, short, short);
-    field public short x;
-    field public short y;
-    field public short z;
-  }
-
-  public class Short4 {
-    ctor public Short4();
-    ctor public Short4(short, short, short, short);
-    field public short w;
-    field public short x;
-    field public short y;
-    field public short z;
-  }
-
-  public class Type extends android.support.v8.renderscript.BaseObj {
-    method public static android.support.v8.renderscript.Type createX(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element, int);
-    method public static android.support.v8.renderscript.Type createXY(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element, int, int);
-    method public static android.support.v8.renderscript.Type createXYZ(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element, int, int, int);
-    method public int getCount();
-    method public long getDummyType(android.support.v8.renderscript.RenderScript, long);
-    method public android.support.v8.renderscript.Element getElement();
-    method public int getX();
-    method public int getY();
-    method public int getYuv();
-    method public int getZ();
-    method public boolean hasFaces();
-    method public boolean hasMipmaps();
-  }
-
-  public static class Type.Builder {
-    ctor public Type.Builder(android.support.v8.renderscript.RenderScript, android.support.v8.renderscript.Element);
-    method public android.support.v8.renderscript.Type create();
-    method public android.support.v8.renderscript.Type.Builder setFaces(boolean);
-    method public android.support.v8.renderscript.Type.Builder setMipmaps(boolean);
-    method public android.support.v8.renderscript.Type.Builder setX(int);
-    method public android.support.v8.renderscript.Type.Builder setY(int);
-    method public android.support.v8.renderscript.Type.Builder setYuvFormat(int);
-    method public android.support.v8.renderscript.Type.Builder setZ(int);
-  }
-
-  public static final class Type.CubemapFace extends java.lang.Enum {
-    method public static android.support.v8.renderscript.Type.CubemapFace valueOf(java.lang.String);
-    method public static final android.support.v8.renderscript.Type.CubemapFace[] values();
-    enum_constant public static final android.support.v8.renderscript.Type.CubemapFace NEGATIVE_X;
-    enum_constant public static final android.support.v8.renderscript.Type.CubemapFace NEGATIVE_Y;
-    enum_constant public static final android.support.v8.renderscript.Type.CubemapFace NEGATIVE_Z;
-    enum_constant public static final android.support.v8.renderscript.Type.CubemapFace POSITIVE_X;
-    enum_constant public static final android.support.v8.renderscript.Type.CubemapFace POSITIVE_Y;
-    enum_constant public static final android.support.v8.renderscript.Type.CubemapFace POSITIVE_Z;
-  }
-
-}
-
diff --git a/v8/renderscript/api/removed.txt b/v8/renderscript/api/removed.txt
deleted file mode 100644
index e69de29..0000000
--- a/v8/renderscript/api/removed.txt
+++ /dev/null
diff --git a/v8/renderscript/java/src/android/support/v8/renderscript/RenderScript.java b/v8/renderscript/java/src/android/support/v8/renderscript/RenderScript.java
index 88accae..afd0924 100644
--- a/v8/renderscript/java/src/android/support/v8/renderscript/RenderScript.java
+++ b/v8/renderscript/java/src/android/support/v8/renderscript/RenderScript.java
@@ -1343,9 +1343,7 @@
         if (ctx != null) {
             mApplicationContext = ctx.getApplicationContext();
             // Only set mNativeLibDir for API 9+.
-            if (android.os.Build.VERSION.SDK_INT > android.os.Build.VERSION_CODES.FROYO) {
-                mNativeLibDir = mApplicationContext.getApplicationInfo().nativeLibraryDir;
-            }
+            mNativeLibDir = mApplicationContext.getApplicationInfo().nativeLibraryDir;
         }
         mIncCon = 0;
         mIncLoaded = false;